angband-3.5.1/0000755000175000017500000000000012456456611012434 5ustar chriscchriscangband-3.5.1/install-sh0000755000175000017500000001273612456456606014455 0ustar chriscchrisc#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 angband-3.5.1/version0000644000175000017500000000000612456456607014045 0ustar chriscchrisc3.5.1 angband-3.5.1/config.sub0000755000175000017500000010517612456456606014435 0ustar chriscchrisc#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: angband-3.5.1/mk/0000755000175000017500000000000012456456606013047 5ustar chriscchriscangband-3.5.1/mk/buildsys.mk.in0000644000175000017500000004365112456456606015654 0ustar chriscchrisc# # Copyright (c) 2007, 2008, 2009, 2010, 2011 # Jonathan Schleifer # # https://webkeks.org/hg/buildsys/ # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice is present in all copies. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # include ${MKPATH}extra.mk PACKAGE = @PACKAGE@ AS = @AS@ CC = @CC@ CXX = @CXX@ CPP = @CPP@ DC = @DC@ ERLC = @ERLC@ OBJC = @OBJC@ OBJCXX = @OBJCXX@ AR = @AR@ LD = ${CC} RANLIB = @RANLIB@ PYTHON = @PYTHON@ ASFLAGS = @ASFLAGS@ CFLAGS = @CFLAGS@ CXXFLAGS = @CXXFLAGS@ CPPFLAGS = @CPPFLAGS@ DFLAGS = @DFLAGS@ ERLCFLAGS = @ERLCFLAGS@ OBJCFLAGS = @OBJCFLAGS@ OBJCXXFLAGS = @OBJCXXFLAGS@ LDFLAGS = @LDFLAGS@ LDFLAGS_RPATH = @LDFLAGS_RPATH@ LIBS = @LIBS@ PYTHON_FLAGS = @PYTHON_FLAGS@ PROG_IMPLIB_NEEDED = @PROG_IMPLIB_NEEDED@ PROG_IMPLIB_LDFLAGS = @PROG_IMPLIB_LDFLAGS@ PROG_SUFFIX = @EXEEXT@ LIB_CFLAGS = @LIB_CFLAGS@ LIB_LDFLAGS = @LIB_LDFLAGS@ LIB_PREFIX = @LIB_PREFIX@ LIB_SUFFIX = @LIB_SUFFIX@ PLUGIN_CFLAGS = @PLUGIN_CFLAGS@ PLUGIN_LDFLAGS = @PLUGIN_LDFLAGS@ PLUGIN_SUFFIX = @PLUGIN_SUFFIX@ INSTALL_LIB = @INSTALL_LIB@ UNINSTALL_LIB = @UNINSTALL_LIB@ CLEAN_LIB = @CLEAN_LIB@ LN_S = @LN_S@ MKDIR_P = mkdir -p INSTALL = @INSTALL@ SHELL = @SHELL@ MSGFMT = @MSGFMT@ JAVAC = @JAVAC@ JAVACFLAGS = @JAVACFLAGS@ JAR = @JAR@ WINDRES = @WINDRES@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ plugindir ?= ${libdir}/${PACKAGE} datarootdir = @datarootdir@ datadir = @datadir@ includedir = @includedir@ includesubdir ?= ${PACKAGE} localedir = @localedir@ localename ?= ${PACKAGE} mandir = @mandir@ mansubdir ?= man1 OBJS1 = ${SRCS:.c=.o} OBJS2 = ${OBJS1:.cc=.o} OBJS3 = ${OBJS2:.cxx=.o} OBJS4 = ${OBJS3:.d=.o} OBJS5 = ${OBJS4:.erl=.beam} OBJS6 = ${OBJS5:.java=.class} OBJS7 = ${OBJS6:.m=.o} OBJS8 = ${OBJS7:.mm=.o} OBJS9 = ${OBJS8:.py=.pyc} OBJS10 = ${OBJS9:.rc=.o} OBJS11 = ${OBJS10:.S=.o} OBJS += ${OBJS11:.xpm=.o} LIB_OBJS = ${OBJS:.o=.lib.o} PLUGIN_OBJS = ${OBJS:.o=.plugin.o} MO_FILES = ${LOCALES:.po=.mo} .SILENT: .SUFFIXES: .SUFFIXES: .beam .c .c.dep .cc .cc.dep .class .cxx .cxx.dep .d .erl .lib.o .java .mo .m .m.dep .mm .mm.dep .o .plugin.o .po .py .pyc .rc .S .S.dep .xpm .PHONY: all subdirs pre-depend depend install install-extra uninstall uninstall-extra clean distclean locales all: ${MAKE} ${MFLAGS} subdirs ${MAKE} ${MFLAGS} depend ${MAKE} ${STATIC_LIB} ${STATIC_LIB_NOINST} ${STATIC_PIC_LIB} ${STATIC_PIC_LIB_NOINST} ${SHARED_LIB} ${SHARED_LIB_NOINST} ${PLUGIN} ${PLUGIN_NOINST} ${PROG} ${PROG_NOINST} ${JARFILE} locales subdirs: for i in ${SUBDIRS}; do \ ${DIR_ENTER}; \ ${MAKE} ${MFLAGS} || exit $$?; \ ${DIR_LEAVE}; \ done depend: pre-depend ${SRCS} regen=0; \ deps=""; \ test -f .deps || regen=1; \ for i in ${SRCS}; do \ case $$i in \ *.c | *.cc | *.cxx | *.m | *.mm | *.S) \ test $$i -nt .deps && regen=1; \ deps="$$deps $$i.dep"; \ ;; \ esac; \ done; \ if test x"$$regen" = x"1" -a x"$$deps" != x""; then \ ${DEPEND_STATUS}; \ if ${MAKE} ${MFLAGS} $$deps && cat $$deps >.deps; then \ rm -f $$deps; \ ${DEPEND_OK}; \ else \ :> .deps; \ touch -t 0001010000 .deps; \ ${DEPEND_FAILED}; \ fi; \ fi .c.c.dep .cc.cc.dep .cxx.cxx.dep .m.m.dep .mm.mm.dep .S.S.dep: ${CPP} ${CPPFLAGS} -M $< | \ sed 's/^\([^\.]*\)\.o:/\1.o \1.lib.o \1.plugin.o:/' >$@ || \ { rm -f $@; false; } pre-depend: ${PROG} ${PROG_NOINST}: ${EXT_DEPS} ${OBJS} ${LINK_STATUS} if ${LD} -o $@ ${OBJS} ${LDFLAGS} ${LIBS}; then \ ${LINK_OK}; \ else \ ${LINK_FAILED}; \ fi ${JARFILE}: ${EXT_DEPS} ${JAR_MANIFEST} ${OBJS} ${LINK_STATUS} if test x"${JAR_MANIFEST}" != x""; then \ if ${JAR} cfm ${JARFILE} ${JAR_MANIFEST} ${OBJS}; then \ ${LINK_OK}; \ else \ ${LINK_FAILED}; \ fi \ else \ if ${JAR} cf ${JARFILE} ${OBJS}; then \ ${LINK_OK}; \ else \ ${LINK_FAILED}; \ fi \ fi ${SHARED_LIB} ${SHARED_LIB_NOINST}: ${EXT_DEPS} ${LIB_OBJS} ${LINK_STATUS}; \ if ${LD} -o $@ ${LIB_OBJS} ${LIB_LDFLAGS} ${LDFLAGS} ${LIBS}; then \ ${LINK_OK}; \ else \ ${LINK_FAILED}; \ fi \ ${PLUGIN} ${PLUGIN_NOINST}: ${EXT_DEPS} ${PLUGIN_OBJS} ${LINK_STATUS} if ${LD} -o $@ ${PLUGIN_OBJS} ${PLUGIN_LDFLAGS} ${LDFLAGS} ${LIBS}; then \ ${LINK_OK}; \ else \ ${LINK_FAILED}; \ fi ${STATIC_LIB} ${STATIC_LIB_NOINST}: ${EXT_DEPS} ${OBJS} ${LINK_STATUS} rm -f $@ objs=""; \ ars=""; \ for i in ${OBJS}; do \ case $$i in \ *.a) \ ars="$$ars $$i" \ ;; \ *.o) \ objs="$$objs $$i" \ ;; \ esac \ done; \ for i in $$ars; do \ dir=".$$(echo $$i | sed 's/\//_/g').objs"; \ rm -fr $$dir; \ mkdir -p $$dir; \ cd $$dir; \ ${AR} x ../$$i; \ for j in *.o; do \ objs="$$objs $$dir/$$j"; \ done; \ cd ..; \ done; \ if ${AR} cr $@ $$objs && ${RANLIB} $@; then \ ${LINK_OK}; \ else \ ${LINK_FAILED}; \ rm -f $@; \ fi; \ for i in $$ars; do \ dir=".$$(echo $$i | sed 's/\//_/g').objs"; \ rm -fr $$dir; \ done ${STATIC_PIC_LIB} ${STATIC_PIC_LIB_NOINST}: ${EXT_DEPS} ${LIB_OBJS} ${LINK_STATUS} rm -f $@ if ${AR} cr $@ ${LIB_OBJS} && ${RANLIB} $@; then \ ${LINK_OK}; \ else \ ${LINK_FAILED}; \ rm -f $@; \ fi locales: ${MO_FILES} .c.o: ${COMPILE_STATUS} if ${CC} ${CFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .c.lib.o: ${COMPILE_LIB_STATUS} if ${CC} ${LIB_CFLAGS} ${CFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_LIB_OK}; \ else \ ${COMPILE_LIB_FAILED}; \ fi .c.plugin.o: ${COMPILE_PLUGIN_STATUS} if ${CC} ${PLUGIN_CFLAGS} ${CFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_PLUGIN_OK}; \ else \ ${COMPILE_PLUGIN_FAILED}; \ fi .cc.o .cxx.o: ${COMPILE_STATUS} if ${CXX} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .cc.lib.o .cxx.lib.o: ${COMPILE_LIB_STATUS} if ${CXX} ${LIB_CFLAGS} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_LIB_OK}; \ else \ ${COMPILE_LIB_FAILED}; \ fi .cc.plugin.o .cxx.plugin.o: ${COMPILE_PLUGIN_STATUS} if ${CXX} ${PLUGIN_CFLAGS} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_PLUGIN_OK}; \ else \ ${COMPILE_PLUGIN_FAILED}; \ fi .d.o: ${COMPILE_STATUS} if test x"$(basename ${DC})" = x"dmd"; then \ if ${DC} ${DFLAGS} -c -of$@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi \ else \ if ${DC} ${DFLAGS} -c -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi \ fi .erl.beam: ${COMPILE_STATUS} if ${ERLC} ${ERLCFLAGS} -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .java.class: ${COMPILE_STATUS} if ${JAVAC} ${JAVACFLAGS} $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .m.o: ${COMPILE_STATUS} if ${OBJC} ${OBJCFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .m.lib.o: ${COMPILE_LIB_STATUS} if ${OBJC} ${LIB_CFLAGS} ${OBJCFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_LIB_OK}; \ else \ ${COMPILE_LIB_FAILED}; \ fi .m.plugin.o: ${COMPILE_PLUGIN_STATUS} if ${OBJC} ${PLUGIN_CFLAGS} ${OBJCFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_PLUGIN_OK}; \ else \ ${COMPILE_PLUGIN_FAILED}; \ fi .mm.o: ${COMPILE_STATUS} if ${OBJCXX} ${OBJCXXFLAGS} ${OBJCFLAGS} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .mm.lib.o: ${COMPILE_LIB_STATUS} if ${OBJCXX} ${LIB_CFLAGS} ${OBJCXXFLAGS} ${OBJCFLAGS} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_LIB_OK}; \ else \ ${COMPILE_LIB_FAILED}; \ fi .mm.plugin.o: ${COMPILE_PLUGIN_STATUS} if ${OBJCXX} ${PLUGIN_CFLAGS} ${OBJCXXFLAGS} ${OBJCFLAGS} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_PLUGIN_OK}; \ else \ ${COMPILE_PLUGIN_FAILED}; \ fi .po.mo: ${COMPILE_STATUS} if ${MSGFMT} -c -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .py.pyc: ${COMPILE_STATUS} if ${PYTHON} ${PYTHON_FLAGS} -c "import py_compile; py_compile.compile('$<')"; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .rc.o .rc.lib.o .rc.plugin.o: ${COMPILE_STATUS} if ${WINDRES} ${CPPFLAGS} -J rc -O coff -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .S.o: ${COMPILE_STATUS} if ${AS} ${ASFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .S.lib.o: ${COMPILE_LIB_STATUS} if ${AS} ${LIB_CFLAGS} ${ASFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_LIB_OK}; \ else \ ${COMPILE_LIB_FAILED}; \ fi .S.plugin.o: ${COMPILE_PLUGIN_STATUS} if ${AS} ${PLUGIN_CFLAGS} ${ASFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_PLUGIN_OK}; \ else \ ${COMPILE_PLUGIN_FAILED}; \ fi .xpm.o: ${COMPILE_STATUS} if ${CC} ${CFLAGS} ${CPPFLAGS} -x c -c -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .xpm.lib.o: ${COMPILE_LIB_STATUS} if ${CC} ${LIB_CFLAGS} ${CFLAGS} ${CPPFLAGS} -x c -c -o $@ $<; then \ ${COMPILE_LIB_OK}; \ else \ ${COMPILE_LIB_FAILED}; \ fi .xpm.plugin.o: ${COMPILE_PLUGIN_STATUS} if ${CC} ${PLUGIN_CFLAGS} ${CFLAGS} ${CPPFLAGS} -x c -c -o $@ $<; then \ ${COMPILE_PLUGIN_OK}; \ else \ ${COMPILE_PLUGIN_FAILED}; \ fi install: ${SHARED_LIB} ${STATIC_LIB} ${STATIC_PIC_LIB} ${PLUGIN} ${PROG} install-extra for i in ${SUBDIRS}; do \ ${DIR_ENTER}; \ ${MAKE} ${MFLAGS} install || exit $$?; \ ${DIR_LEAVE}; \ done for i in ${SHARED_LIB}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} ${DESTDIR}${libdir} ${INSTALL_LIB}; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done for i in ${STATIC_LIB} ${STATIC_PIC_LIB}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} ${DESTDIR}${libdir} && ${INSTALL} -m 644 $$i ${DESTDIR}${libdir}/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done for i in ${PLUGIN}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} ${DESTDIR}${plugindir} && ${INSTALL} -m 755 $$i ${DESTDIR}${plugindir}/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done for i in ${DATA}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} $$(dirname ${DESTDIR}${libdatadir}/${PACKAGE}/$$i) && ${INSTALL} -m 644 $$i ${DESTDIR}${libdatadir}/${PACKAGE}/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done for i in ${CONFIG}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} $$(dirname ${DESTDIR}${configdir}/${PACKAGE}/$$i) && ${INSTALL} -m 644 $$i ${DESTDIR}${configdir}/${PACKAGE}/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done for i in ${DOC}; do \ ${INSTALL_STATUS}; \ if [ -f $$i ]; then \ if ${MKDIR_P} $$(dirname ${DESTDIR}${docdatadir}/$$i) && ${INSTALL} -m 644 $$i ${DESTDIR}${docdatadir}/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ else \ ${INSTALL_SKIP}; \ fi \ done for i in ${PROG}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} ${DESTDIR}${bindir} && ${INSTALL} -m 755 $$i ${DESTDIR}${bindir}/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done for i in ${INCLUDES}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} ${DESTDIR}${includedir}/${includesubdir} && ${INSTALL} -m 644 $$i ${DESTDIR}${includedir}/${includesubdir}/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done for i in ${MO_FILES}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} ${DESTDIR}${localedir}/$${i%.mo}/LC_MESSAGES && ${INSTALL} -m 644 $$i ${DESTDIR}${localedir}/$${i%.mo}/LC_MESSAGES/${localename}.mo; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done for i in ${MAN}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} ${DESTDIR}${mandir}/${mansubdir} && ${INSTALL} -m 644 $$i ${DESTDIR}${mandir}/${mansubdir}/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done install-extra: uninstall: uninstall-extra for i in ${SUBDIRS}; do \ ${DIR_ENTER}; \ ${MAKE} ${MFLAGS} uninstall || exit $$?; \ ${DIR_LEAVE}; \ done for i in ${SHARED_LIB}; do \ if test -f ${DESTDIR}${libdir}/$$i; then \ if : ${UNINSTALL_LIB}; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi; \ done for i in ${STATIC_LIB} ${STATIC_PIC_LIB}; do \ if test -f ${DESTDIR}${libdir}/$$i; then \ if rm -f ${DESTDIR}${libdir}/$$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done for i in ${PLUGIN}; do \ if test -f ${DESTDIR}${plugindir}/$$i; then \ if rm -f ${DESTDIR}${plugindir}/$$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done -rmdir ${DESTDIR}${plugindir} >/dev/null 2>&1 for i in ${DATA}; do \ if test -f ${DESTDIR}${datadir}/${PACKAGE}/$$i; then \ if rm -f ${DESTDIR}${datadir}/${PACKAGE}/$$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi; \ rmdir "$$(dirname ${DESTDIR}${datadir}/${PACKAGE}/$$i)" >/dev/null 2>&1 || true; \ done -rmdir ${DESTDIR}${datadir}/${PACKAGE} >/dev/null 2>&1 for i in ${PROG}; do \ if test -f ${DESTDIR}${bindir}/$$i; then \ if rm -f ${DESTDIR}${bindir}/$$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done for i in ${INCLUDES}; do \ if test -f ${DESTDIR}${includedir}/${includesubdir}/$$i; then \ if rm -f ${DESTDIR}${includedir}/${includesubdir}/$$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done -rmdir ${DESTDIR}${includedir}/${includesubdir} >/dev/null 2>&1 for i in ${MO_FILES}; do \ if test -f ${DESTDIR}${localedir}/$${i%.mo}/LC_MESSAGES/${localename}.mo; then \ if rm -f ${DESTDIR}${localedir}/$${i%.mo}/LC_MESSAGES/${localename}.mo; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done for i in ${MAN}; do \ if test -f ${DESTDIR}${mandir}/${mansubdir}/$$i; then \ if rm -f ${DESTDIR}${mandir}/${mansubdir}/$$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done uninstall-extra: clean: for i in ${SUBDIRS}; do \ ${DIR_ENTER}; \ ${MAKE} ${MFLAGS} clean || exit $$?; \ ${DIR_LEAVE}; \ done for i in ${DEPS} ${OBJS} ${LIB_OBJS} ${PLUGIN_OBJS} ${PROG} ${PROG_NOINST} ${SHARED_LIB} ${SHARED_LIB_NOINST} ${STATIC_LIB} ${STATIC_LIB_NOINST} ${STATIC_PIC_LIB} ${STATIC_PIC_LIB_NOINST} ${PLUGIN} ${PLUGIN_NOINST} ${CLEAN_LIB} ${MO_FILES} ${CLEAN}; do \ if test -f $$i -o -d $$i; then \ if rm -fr $$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done distclean: clean for i in ${SUBDIRS}; do \ ${DIR_ENTER}; \ ${MAKE} ${MFLAGS} distclean || exit $$?; \ ${DIR_LEAVE}; \ done for i in ${DISTCLEAN} .deps *~; do \ if test -f $$i -o -d $$i; then \ if rm -fr $$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done DIR_ENTER = printf "@TERM_EL@@TERM_SETAF6@Entering directory @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF6@.@TERM_SGR0@\n"; cd $$i || exit $$? DIR_LEAVE = printf "@TERM_EL@@TERM_SETAF6@Leaving directory @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF6@.@TERM_SGR0@\n"; cd .. || exit $$? DEPEND_STATUS = printf "@TERM_EL@@TERM_SETAF3@Generating dependencies...@TERM_SGR0@\r" DEPEND_OK = printf "@TERM_EL@@TERM_SETAF2@Successfully generated dependencies.@TERM_SGR0@\n" DEPEND_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to generate dependencies!@TERM_SGR0@\n"; exit $$err COMPILE_STATUS = printf "@TERM_EL@@TERM_SETAF3@Compiling @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF3@...@TERM_SGR0@\r" COMPILE_OK = printf "@TERM_EL@@TERM_SETAF2@Successfully compiled @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF2@.@TERM_SGR0@\n" COMPILE_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to compile @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF1@!@TERM_SGR0@\n"; exit $$err COMPILE_LIB_STATUS = printf "@TERM_EL@@TERM_SETAF3@Compiling @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF3@ (lib)...@TERM_SGR0@\r" COMPILE_LIB_OK = printf "@TERM_EL@@TERM_SETAF2@Successfully compiled @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF2@ (lib).@TERM_SGR0@\n" COMPILE_LIB_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to compile @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF1@ (lib)!@TERM_SGR0@\n"; exit $$err COMPILE_PLUGIN_STATUS = printf "@TERM_EL@@TERM_SETAF3@Compiling @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF3@ (plugin)...@TERM_SGR0@\r" COMPILE_PLUGIN_OK = printf "@TERM_EL@@TERM_SETAF2@Successfully compiled @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF2@ (plugin).@TERM_SGR0@\n" COMPILE_PLUGIN_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to compile @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF1@ (plugin)!@TERM_SGR0@\n"; exit $$err LINK_STATUS = printf "@TERM_EL@@TERM_SETAF3@Linking @TERM_BOLD@$@@TERM_SGR0@@TERM_SETAF3@...@TERM_SGR0@\r" LINK_OK = printf "@TERM_EL@@TERM_SETAF2@Successfully linked @TERM_BOLD@$@@TERM_SGR0@@TERM_SETAF2@.@TERM_SGR0@\n" LINK_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to link @TERM_BOLD@$@@TERM_SGR0@@TERM_SETAF1@!@TERM_SGR0@\n"; exit $$err INSTALL_STATUS = printf "@TERM_EL@@TERM_SETAF3@Installing @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF3@...@TERM_SGR0@\r" INSTALL_OK = printf "@TERM_EL@@TERM_SETAF2@Successfully installed @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF2@.@TERM_SGR0@\n" INSTALL_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to install @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF1@!@TERM_SGR0@\n"; exit $$err INSTALL_SKIP = printf "Skipping $$i\n" DELETE_OK = printf "@TERM_EL@@TERM_SETAF4@Deleted @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF4@.@TERM_SGR0@\n" DELETE_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to delete @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF1@!@TERM_SGR0@\n"; exit $$err include .deps angband-3.5.1/mk/sinclude.mk.in0000644000175000017500000000061412456456606015614 0ustar chriscchrisc# This entire file is one ugly hack. Fortunately, it's a very small # file. BSD make and GNU make have different and incompatible # syntaxes for specifying that a file should be included with no # attention to whether it exists. Fortunately, they both support # erroring include. So we include this file, and autoconf sets the # correct form of sinclude directive. @MAKE_SINCLUDE@ "$(FILE)" angband-3.5.1/mk/extra.mk.in0000644000175000017500000000300212456456606015123 0ustar chriscchriscLIB_CPPFLAGS = @LIB_CPPFLAGS@ SETEGID = @SETEGID@ LIBDIR = ${libdir} libdatadir = @libdatadir@ vardatadir = @vardatadir@ docdatadir = @docdatadir@ configdir = @configdir@ pdfdir ?= @pdfdir@ ECHO_N ?= @ECHO_N@ bindir ?= @bindir@ dvidir ?= @dvidir@ datadir ?= @datadir@ CPPFLAGS ?= @CPPFLAGS@ SHELL ?= @SHELL@ program_transform_name ?= @program_transform_name@ DEFS ?= @DEFS@ infodir ?= @infodir@ libexecdir ?= @libexecdir@ localedir ?= @localedir@ LTLIBOBJS ?= @LTLIBOBJS@ LDFLAGS ?= @LDFLAGS@ includedir ?= @includedir@ libdir ?= @libdir@ localstatedir ?= @localstatedir@ docdir ?= @docdir@ INSTALL_SCRIPT ?= @INSTALL_SCRIPT@ MV ?= @MV@ GLIB_LIBS ?= @GLIB_LIBS@ sharedstatedir ?= @sharedstatedir@ GTK_CFLAGS ?= @GTK_CFLAGS@ OBJEXT ?= @OBJEXT@ PKG_CONFIG ?= @PKG_CONFIG@ sysconfdir ?= @sysconfdir@ htmldir ?= @htmldir@ PACKAGE_STRING ?= @PACKAGE_STRING@ sbindir ?= @sbindir@ CP ?= @CP@ SET_MAKE ?= @SET_MAKE@ ECHO_C ?= @ECHO_C@ psdir ?= @psdir@ oldincludedir ?= @oldincludedir@ GTK_LIBS ?= @GTK_LIBS@ mandir ?= @mandir@ PACKAGE_NAME ?= @PACKAGE_NAME@ ECHO_T ?= @ECHO_T@ LIBOBJS ?= @LIBOBJS@ ac_ct_CC ?= @ac_ct_CC@ PACKAGE_VERSION ?= @PACKAGE_VERSION@ LN_S ?= @LN_S@ GREP ?= @GREP@ INSTALL_DATA ?= @INSTALL_DATA@ datarootdir ?= @datarootdir@ RM ?= @RM@ INSTALL_PROGRAM ?= @INSTALL_PROGRAM@ exec_prefix ?= @exec_prefix@ EGREP ?= @EGREP@ prefix ?= @prefix@ RC ?= @RC@ VERSION ?= @VERSION@ MAINFILES = @MAINFILES@ USE_STATS = @USE_STATS@ DISTCLEAN = doc/manual/manual.pdf RST2HTML ?= @RST2HTML@ RST2LATEX ?= @RST2LATEX@ PDFLATEX ?= @PDFLATEX@ angband-3.5.1/scripts/0000755000175000017500000000000012456456606014127 5ustar chriscchriscangband-3.5.1/scripts/pkg_src0000755000175000017500000000150512456456606015506 0ustar chriscchrisc#!/bin/sh if [ $# -ne 0 ]; then echo "Simple packaging file for the source." echo "" echo "Use in the root directory of the game, like so:" echo " scripts/pkg_src" echo "The script will output a tarball angband-[git describe].tar.gz" exit 1 fi TAG=angband-`git describe` OUT=$TAG.tar.gz # Error checking if [ -e $OUT ]; then cat < $TAG/version && cd $TAG && ./autogen.sh && rm -rf autogen.sh autom4te.cache && cd .. && tar --exclude .gitignore --exclude *.dll -czvf $OUT $TAG && rm -rf $TAG angband-3.5.1/scripts/warning-blame.sh0000755000175000017500000000446612456456606017223 0ustar chriscchrisc#!/bin/sh # Copyright 2007 Vincent Sanders # All rights reserved. # Taken from the NetSurf SVN repository: # http://source.netsurf-browser.org/trunk/netsurf/utils/warning-blame.sh # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the Author nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # where to store the processed list of warnings WARNING_LIST=/tmp/warning-list if [ $# != 1 ]; then echo "Syntax: $0 " exit 1 fi if [ -f $1 ]; then cp $1 ${WARNING_LIST} else echo "Need a valid warning file" exit 1 fi for blamefile in $(cat ${WARNING_LIST} | cut -f 1 -d ':' | sort | uniq ); do if [ -f ${blamefile} ]; then svn blame ${blamefile} >/tmp/blame cat ${WARNING_LIST} | grep "^${blamefile}" >/tmp/blame-warnings while read warning; do echo ${warning} lineno=$(echo ${warning} | cut -f 2 -d ':' ; ) cat /tmp/blame | head -n ${lineno} | tail -n 1 done < /tmp/blame-warnings rm /tmp/blame-warnings else echo "Unable to find ${blamefile}" fi done angband-3.5.1/scripts/version.sh0000755000175000017500000000164212456456606016156 0ustar chriscchrisc#!/bin/sh # # This scripts adds local version information from git. # # Copied from Linux 2.6.32 scripts/setlocalversion and modified # slightly to work better for OpenOCD, then taken and ripped to # pieces for angband # usage() { echo "Usage: $0 [srctree]" >&2 exit 1 } cd "${1:-.}" || usage # Check for git and a git repo. if head=$(git rev-parse --verify --short HEAD 2>/dev/null); then # If we are past a tagged commit (like "v3.2.0-64-g72357d5"), # we pretty print it. if atag="$(git describe 2>/dev/null)"; then printf "$atag" # If we don't have a tag at all we print -g{commitish}. else printf '%s%s' -g $head fi # Check for uncommitted changes if git diff-index --name-only HEAD \ | read dummy; then printf '%s' -dirty fi # All done with git exit fi # There's no recognized repository; we must be a snapshot, and should have a # version file generated by the snapshot process cat ../version angband-3.5.1/scripts/pkg_deb0000755000175000017500000000160012456456606015445 0ustar chriscchrisc#!/bin/sh if [ $# -ne 0 ]; then echo "Simple packaging file for the source." echo "" echo "Use in the root directory of the game, like so:" echo " scripts/pkg_src" echo "The script will output a tarball angband_[git describe].orig.tar.gz" exit 1 fi TAG1=angband-`git describe` TAG2=angband_`git describe` OUT=$TAG2.orig.tar.gz # Error checking if [ -e $OUT ]; then cat < $TAG1/version && cd $TAG1 && ./autogen.sh && rm -rf autogen.sh autom4te.cache && cd .. && tar --exclude .gitignore --exclude *.dll --exclude *.wav -czvf $OUT $TAG1 && rm -rf $TAG1 angband-3.5.1/scripts/pkg_win0000755000175000017500000000331712456456606015517 0ustar chriscchrisc#!/bin/bash if [ $# -ne 1 ] && [ $# -ne 2 ]; then echo "Simple packaging file for the Windows port. Only really useful when" echo "cross-compiling, or using Cygwin. Originally by Robert Ruehlmann." echo "" echo "Use in the root directory of the game, like so:" echo " scripts/pkg_win []" echo "" exit 1 fi DIR=$1 if [ $# -eq 1 ]; then OUT=$1.zip else OUT=$2 fi function cp_unix2dos { # Just in case they're already DOS_format, we strip them to UNIX first. :) awk '{ sub("\r$", ""); sub("$", "\r"); print }' $1 > $2 } mkdir -p $DIR cd $DIR mkdir lib mkdir lib/apex mkdir lib/bone mkdir lib/data mkdir lib/edit mkdir lib/file mkdir lib/help mkdir lib/info mkdir lib/pref mkdir lib/save mkdir lib/script mkdir lib/user mkdir lib/xtra mkdir lib/xtra/font mkdir lib/xtra/graf mkdir lib/xtra/sound touch lib/apex/delete.me lib/bone/delete.me lib/data/delete.me \ lib/info/delete.me lib/user/delete.me lib/save/delete.me cp ../*.exe . cp ../*.dll . # Copy the readmes and suchlike, converting to DOS line endings on the way cp_unix2dos ../changes.txt ./Changes.txt cp_unix2dos ../thanks.txt ./Thanks.txt cp_unix2dos ../copying.txt ./Copying.txt cp_unix2dos ../faq.txt ./FAQ.txt cp ../doc/manual.pdf ./Manual.pdf cp ../doc/manual.html ./Manual.html cp ../lib/edit/*.txt lib/edit cp ../lib/file/*.txt lib/file cp ../lib/help/*.txt lib/help cp ../lib/help/*.hlp lib/help cp ../lib/pref/*.prf lib/pref cp ../lib/xtra/font/*.fon lib/xtra/font cp ../lib/xtra/graf/*.png lib/xtra/graf cp ../lib/xtra/graf/graphics.txt lib/xtra/graf cp ../lib/xtra/sound/sound.cfg lib/xtra/sound cp ../lib/xtra/sound/*.mp3 lib/xtra/sound cd .. zip -9 -r $OUT $DIR rm -rf $DIR angband-3.5.1/aclocal.m40000644000175000017500000000132212456456607014277 0ustar chriscchrisc# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_include([m4/buildsys.m4]) m4_include([acinclude.m4]) angband-3.5.1/compiling.txt0000644000175000017500000001060612456456606015165 0ustar chriscchriscCompiling Instructions ====================== The methods for compiling Angband vary by platform and by build system. If you get Angband working on a different platform or build system please let us know so we can add to this file. BUILDING ON Mac OS X ==================== Native builds ------------- To build the new Cocoa front-end: cd src make -f Makefile.osx To build the legacy Carbon front-end (which is deprecated): cd src make -f Makefile.crb BUILDING ON LINUX / *NIX ======================== Native builds ------------- Linux builds using autotools. There are several different front ends that you can optionally build (GCU, SDL, X11, and GTK) using arguments to configure such as --enable-sdl, --disable-gtk, etc. Each front end has different dependencies (e.g. ncurses, SDL libraries, etc). To build Angband to be run in-place: ./autogen.sh ./configure --with-no-install [other options as needed] make To build Angband to be installed in some other location: ./autogen.sh ./configure --prefix /path/to [other options as needed ] make make install On some BSDs, you may need to copy install-sh into lib/ and various subdirectories of lib/ in order to install correctly. Cross-building for Windows with Mingw ------------------------------------- Many developers (as well as the auto-builder) build Angband for Windows using Mingw on Linux. This requires that the necessary Mingw packages are all installed. This type of build now also uses autotools, so you must configure it to cross-compile, e.g. ./autogen.sh ./configure --enable-win --disable-curses --build=i686-pc-linux-gnu --host=i586-mingw32msvc Mingw installs commands like 'i586-mingw32msvc-gcc'. The value of --host should be that same command with the '-gcc' removed. Instead of i586 you may see i686, amd64, etc. The value of --build should be the host you're building on. (See http://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/ autoconf-2.68/html_node/Specifying-Target-Triplets.html#Specifying%20Names for gory details of how these triplets are arrived at) TODO: you will probably need to manually disable curses, or the host curses installation will be found, and will not be able to link properly. More checking of permissible combinations to configure is necessary BUILDING ON WINDOWS =================== Using MinGW ----------- This build now also uses autotools, so should be very similar to the Linux build: ./autogen.sh ./configure --enable-win make The install target almost certainly won't work Following build, to get the program to run, you need to copy the executable from the src directory into the top-level dir, and copy 2 DLLs (libpng12.dll and zlib1.dll) from src/win/dll to the top-level dir Using Cygwin (with MinGW) ------------------------- Use this option if you want to build a native Windows executable that can run with or without Cygwin. Use the Cygwin setup.exe to install the mingw-gcc-core package and any dependencies suggested by the installer. Run these commands: ./autogen.sh ./configure --enable-win --with-no-install --host=i686-pc-mingw32 make As with the "Using MinGW" process, you need to copy the executable and DLLs to the top-level dir. If you want to build the Unix version of Angband that uses X11 or Curses and run it under Cygwin, then follow the native build instructions (./autogen.sh; ./configure; make; make install). Using eclipse (Indigo) on Windows (with MinGW) ---------------------------------------------- For eclipse with EGit, select File | Import..., Git | Projects from Git, Next > Clone your/the upstream repo, or Add your existing cloned repo, Next > Select "Use the New Projects Wizard", Finish In the New Project Wizard, select C/C++ | Makefile Project with Existing Code, Next > Give the project a name (Angband), navigate to the repo you cloned in "Existing Code Location", Select "C", but not "C++" Choose "MinGW GCC" Toolchain, Finish Once the project is set up, r-click | Properties go to C/C++ Build | Toolchain Editor, select "Gnu Make Builder" instead of "CDT Internal Builder" go to C/C++ Build, uncheck "Generate Makefiles automatically" You still need to run ./autogen.sh and ./configure manually, outside eclipse (see above) Using Visual Studio ------------------- Blue Baron has detailed instructions for setting this up at: src/win/angband_visual_studio_step_by_step.txt Using Dev-C++ ------------- TODO angband-3.5.1/acinclude.m40000644000175000017500000003521612456456606014640 0ustar chriscchrisc# generated automatically by aclocal 1.10 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. AC_DEFUN([_MY_PROG_MAKE_VAR], [AC_ARG_VAR([MAKE], [Name of a make program to use])dnl my_make=${MAKE-make} ]) AC_DEFUN([MY_PROG_MAKE_SYSVINC], [ AC_REQUIRE([_MY_PROG_MAKE_VAR])dnl AC_CACHE_CHECK([if $my_make supports SysV-style inclusion], [my_cv_make_inclusion_sysv], [my_cv_make_inclusion_sysv=no cat >conftest.inc <conftest.mk <conftest.mk </dev/null ; then my_cv_make_sinc@&t@lude_syntax=gnu fi rm conftest.mk fi if test x$my_cv_make_sinc@&t@lude_syntax = xnone ; then cat >conftest.mk </dev/null ; then my_cv_make_sinc@&t@lude_syntax=bsd fi rm conftest.mk fi]) AC_SUBST([MAKE_SINCLUDE]) if test x$my_cv_make_sinc@&t@lude_syntax = xgnu ; then MAKE_SINCLUDE=-inc@&t@lude else if test x$my_cv_make_sinc@&t@lude_syntax = xbsd ; then MAKE_SINCLUDE=[.sinc@&t@lude] else AC_MSG_ERROR([$my_make does not support a supported silent inc@&t@lude syntax]) fi fi]) AC_DEFUN([MY_EXPAND_DIR], [$1=$2 $1=`( test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" eval echo \""[$]$1"\" )`] ) dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not) dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page dnl also defines GSTUFF_PKG_ERRORS on error AC_DEFUN([PKG_CHECK_MODULES], [ succeeded=no if test -z "$PKG_CONFIG"; then AC_PATH_PROG(PKG_CONFIG, pkg-config, no) fi if test "$PKG_CONFIG" = "no" ; then echo "*** The pkg-config script could not be found. Make sure it is" echo "*** in your path, or set the PKG_CONFIG environment variable" echo "*** to the full path to pkg-config." echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." else PKG_CONFIG_MIN_VERSION=0.9.0 if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then AC_MSG_CHECKING(for $2) if $PKG_CONFIG --exists "$2" ; then AC_MSG_RESULT(yes) succeeded=yes AC_MSG_CHECKING($1_CFLAGS) $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` AC_MSG_RESULT($$1_CFLAGS) AC_MSG_CHECKING($1_LIBS) $1_LIBS=`$PKG_CONFIG --libs "$2"` AC_MSG_RESULT($$1_LIBS) else AC_MSG_RESULT(no) $1_CFLAGS="" $1_LIBS="" ## If we have a custom action on failure, don't print errors, but ## do set a variable so people can do so. $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` ifelse([$4], ,echo $$1_PKG_ERRORS,) fi AC_SUBST($1_CFLAGS) AC_SUBST($1_LIBS) else echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." echo "*** See http://www.freedesktop.org/software/pkgconfig" fi fi if test $succeeded = yes; then ifelse([$3], , :, [$3]) else ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) fi ]) # Configure paths for SDL # Sam Lantinga 9/21/99 # stolen from Manish Singh # stolen back from Frank Belew # stolen from Manish Singh # Shamelessly stolen from Owen Taylor dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS dnl AC_DEFUN([AM_PATH_SDL], [dnl dnl Get the cflags and libraries from the sdl-config script dnl AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], sdl_prefix="$withval", sdl_prefix="") AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], sdl_exec_prefix="$withval", sdl_exec_prefix="") AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], , enable_sdltest=yes) if test x$sdl_exec_prefix != x ; then sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_args="$sdl_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi AC_PATH_PROG(SDL_CONFIG, sdl-config, no) min_sdl_version=ifelse([$1], ,0.11.0,$1) AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" dnl dnl Now check if the installed SDL is sufficiently new. (Also sanity dnl checks the results of sdl-config to some extent dnl rm -f conf.sdltest AC_TRY_RUN([ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } ],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" AC_TRY_LINK([ #include #include "SDL.h" ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(SDL_CFLAGS) AC_SUBST(SDL_LIBS) rm -f conf.sdltest ]) # Configure paths for ncursesw # stolen from Sam Lantinga 9/21/99 from directly above (SDL) # stolen from Manish Singh # stolen back from Frank Belew # stolen from Manish Singh # Shamelessly stolen from Owen Taylor dnl AM_PATH_NCURSESW([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for ncursesw, and define NCURSES_CFLAGS and NCURSES_LIBS dnl AC_DEFUN([AM_PATH_NCURSESW], [dnl dnl Get the cflags and libraries from the ncursesw5-config script dnl AC_ARG_WITH(ncurses-prefix,[ --with-ncurses-prefix=PFX Prefix where ncurses is installed (optional)], ncurses_prefix="$withval", ncurses_prefix="") AC_ARG_WITH(ncurses-exec-prefix,[ --with-ncurses-exec-prefix=PFX Exec prefix where ncurses is installed (optional)], ncurses_exec_prefix="$withval", ncurses_exec_prefix="") AC_ARG_ENABLE(ncursestest, [ --disable-ncursestest Do not try to compile and run a test ncurses program], , enable_ncursestest=yes) if test x$ncurses_exec_prefix != x ; then ncurses_args="$ncurses_args --exec-prefix=$ncurses_exec_prefix" if test x${NCURSES_CONFIG+set} != xset ; then NCURSES_CONFIG=$ncurses_exec_prefix/bin/ncursesw5-config fi fi if test x$ncurses_prefix != x ; then ncurses_args="$ncurses_args --prefix=$ncurses_prefix" if test x${NCURSES_CONFIG+set} != xset ; then NCURSES_CONFIG=$ncurses_prefix/bin/ncursesw5-config fi fi AC_PATH_PROG(NCURSES_CONFIG, ncursesw5-config, no) AC_MSG_CHECKING(for ncurses - wide char support) no_ncurses="" if test "$NCURSES_CONFIG" = "no" ; then no_ncurses=yes else NCURSES_CFLAGS=`$NCURSES_CONFIG $ncurses_args --cflags` NCURSES_LIBS=`$NCURSES_CONFIG $ncurses_args --libs` ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $NCURSES_CFLAGS" LIBS="$LIBS $NCURSES_LIBS" dnl dnl Now check if the installed ncurses is installed OK. (Also sanity dnl checks the results of ncursesw5-config to some extent) dnl rm -f conf.ncursestest AC_TRY_RUN([ #include #include "ncurses.h" int main (int argc, char *argv[]) { { FILE *fp = fopen("conf.ncursestest", "a"); if ( fp ) fclose(fp); } return 0; } ],, no_ncurses=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi if test "x$no_ncurses" = x ; then AC_MSG_RESULT(yes) ifelse([$1], , :, [$1]) else AC_MSG_RESULT(no) if test "$NCURSES_CONFIG" = "no" ; then echo "*** The ncursesw5-config script installed by ncursesw could not be found" echo "*** If ncursesw was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the NCURSES_CONFIG environment variable to the" echo "*** full path to ncursesw5-config." else if test -f conf.ncursestest ; then : else echo "*** Could not run ncurses test program, checking why..." CFLAGS="$CFLAGS $NCURSES_CFLAGS" LIBS="$LIBS $NCURSES_LIBS" AC_TRY_LINK([ #include #include "ncurses.h" ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding ncursesw. If it is not finding" echo "*** ncursesw, you'll need to set your LD_LIBRARY_PATH environment variable," echo "*** or edit /etc/ld.so.conf to point to the installed location. Also, make" echo "*** sure you have run ldconfig if that is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means ncursesw was incorrectly" echo "*** installed or that you have moved ncursesw since it was installed. In the" echo "*** latter case, you may want to edit the ncursesw5-config script:" echo "*** $NCURSES_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi NCURSES_CFLAGS="" NCURSES_LIBS="" ifelse([$2], , :, [$2]) fi AC_SUBST(NCURSES_CFLAGS) AC_SUBST(NCURSES_LIBS) rm -f conf.ncursestest ]) angband-3.5.1/thanks.txt0000644000175000017500000001311012456456607014466 0ustar chriscchrisc======= Credits ======= If your name should be included in this file and it's not, please email us so we can fix it. :) This version ============ * Erik Osheim (d_m) * Robert Au (myshkin) * Chris Carr (magnate) * Andi Sidwell (takkaria) * Aaron Bader (fizzix) * Brett Reid (blubaron) * Peter Denison (noz) * Elly Jones * Bardur Arantsson * Ben Semmler * Brett Reid * Gabe Cunningham * Han Boetes * Janeene Beeforth * Nick McConnell * "Seebs" * PowerWyrm Previous maintainers ==================== Angband 3.0.8 - 3.5.0: Andi Sidwell Angband 2.9.0 - 3.0.6: Robert Ruehlmann Angband 2.7.0 - 2.8.5: Ben Harrison Angband 2.0 - 2.4 - 2.6.1: Alex Cutler, Andy Astrand, Sean Marsh, Geoff Hill, Charles Teague, Charles Swiger Based on Moria, Copyright |copyright| 1985 Robert Alan Koeneke and Umoria, Copyright |copyright| 1989 James E. Wilson Contributors ============ Many thanks go to the following people who have contributed patches, bugfixes, and other stuff for Angband: Peter Berger, Andrew Hill, Werner Baer, Tom Morton, "Cyric the Mad", Chris Kern, Jurriaan Kalkman, Alexander Wilkins, Mauro Scarpa, "facade", Dennis van Es, Kenneth A. Strom, Wei-Hwa Huang, Nikodemus, Timo Pietila, Shayne Steele, Dr. Andrew White, Greg Flint, Christopher Jeris, Ian Parkhouse, "Warhammer", Scott Holder, Brent Ross, Kazuo Ito, Willem Siemelink, "Luthien", David J. Grabiner, Ilya Bely, "chungkuo", Kieron Dunbar, George W. Harris, Joseph Oberlander, Paul Moore, Andreas Tophinke, Leon Marrick, Peter J. Rowe, Wim Benthem, Jaroslav Sladek, Keith Perkins, Hugo Kornelis, Pete Mack, Marco K, Frank Palazzolo, Christer Nyfalt, Andrew Doull, Kenneth Boyd, Iain McFall, Christophe Cavalaria, Brendon Oliver, "Zaxx", "theninja", "Twilight Forest", "jbu", "AnonymousHero", Stefan O'Rear, "SilverD", Ed Graham, Tobias Franke, "rhinocesaurus", "Bron", "Mangojuice", Chris Robertson, Joe Buck, "tigen", "Big Al", Paul Blay, J. D. White, Rowan Beentje, "pelpel", Shanoah Alkire, Alexander Philips, "mikon", "Antoine", "Irashtar", "roustk", Diego Gonzalez, Takeshi Mogami, Julian Lighton, Aram Harrow, William Tanksley, Chris Ang, Dean Anderson, Daniel Nash, David Blackston, Heino Vander Sanden, Mark Kvale, Sheldon Simms, Topi Ylinen, "Gileba", Jeff Greene, Joshua Middendorf, Tom Demuyt, Alexander Ulyanov, Alexander Malmberg, Chris R. Martin, Chris Herborth, Craig Oliver, "DarkGod", David Boeren, David DeLaney, David Kahane, Dennis Payne, Desvignes Sebastien, Ekkehard Kraemer, Eugene Hung, HansJoachim Baader, Heiko Herold, John Rauser, Jonathan Sari, Joseph William Dixon, Joseph Hall, John M. Kewley, Ken Wigle, Keith H. Randall, Kevin Bracey, Mike Marcelais, Maarten Hazewinkel, Peter Ammon, Peter Seebach, Randy Hutson, Scott Egashira, Skirmantas Kligys, Steve Linberg, Silas Dunsmore, Tom Harris, Ron Anderson, Ross E. Becker, Denis Eropkin, Torbjorn Lindgren, Lars Haugseth, Jon Taylor, Roland Jay Roberts, "Sergey", "cb", Michael Pope, "hmj", Colin Spry, Ed Cogburn, "Yendor", Thomas Dedorson, "Ewert", Rooslan S. Khayrov, Thapper, "Max Stats", "SSK", "ChodTheWacko", "Zaxx", Jonas Lith, Jens Schou, "Lebannen", Daniel Santos, Edd Barrett (vext01), mtadd, Peter Denison (noz), Kiyoshi Aman (Aerdan), David Barr (david3x3x3), Chris Weisiger (Derakon), Buzzkill, Scott Michael, LastQuestion, danial.santos, LuthienCeleste, shadowsun Raymond "Shockbolt" Gaustadnes The Shockbolt tiles. Greg Wooledge Basic autoconf support, the original random artifact generator, and various ideas for rebalancing the game including the new list of magic spells Tim Baker Made the "easy patch" and organized the patches for the Angband 2.8.5 beta Eytan Zweig Many bug reports and patches Jonathan Ellis Updated edit and help files; added tons of new monsters, artifacts, vaults, objects, as well as a new player race, and rebalanced many things John I'anson-Holton Many bugfixes and patches Steven Fuerst Improved X11, XAW, and GTK code "Bablos" Updated Amiga code Matthias Kurzke Ego-item patch and various code changes for the JLE patch Keldon Jones Improved Monster AI Adam Bolt 16x16 tiles Arcum Dagsson Configurable artifact activations "Prfnoff" Customizable player races, player history, shop owners, ... Mark Howson Improvements to the Amiga code Musus Umbra Improvements to the Acorn RISC OS code Hallvard B. Furuseth Many improvements to the autoconf support, code-cleanups, and tons of bugfixes Kusunose Toru Various bugfixes Eddie Grove Bugfixes, patches and radical ideas too numerous to count (but in particular for ID-by-use). Nomad 8x16 tiles, loads of new room templates The UPX team (Markus Oberhumer and Laszlo Molnar) The UPX packer for executables http://upx.tsx.org/ is used to reduce the size of the Windows and DOS binaries. qwerty LaTeX-based help file generation Federico Poloni (fph) Manual and documentation updates, formatting in reStructuredText Peter Ammon (ridiculous_fish) Rewritten OSX main-cocoa interface William Moore (MarbleDice) Bitflag code and numerous other improvements and fixes during 3.1.x Antony Sidwell (ajps) Default point-based stat allocations, and numerous UI improvements, original core-UI split code "PowerWyrm" Numerous bug fixes and code improvements .. |copyright| unicode:: 0xA9 angband-3.5.1/faq.txt0000644000175000017500000001362712456456606013761 0ustar chriscchriscThe Angband FAQ The best way to get answers to your questions is to post them on the forum [http://angband.oook.cz/forum]. 1. Issues and problems a. How do I report a bug? b. I hate the store interface! c. Dark monsters are hard to see. d. I want old-school '#'s as wall tiles, not solid blocks! e. I use Vista and my display is messed up. f. I play in the console on Linux, and the colours are screwed up. g. I'm playing in a terminal and the Escape key isn't working as it should - I have to press it twice, or just wait a while. h. Is there a way to disable that thing that pops up when you hit the enter key? 2. Development a. What are the current plans for the game? b. How do I suggesting an idea/feature? c. How do I get a copy of the source code? d. How do I compile the game? e. How do I contribute to the game? ----------------------------------------------------------------- 1a. How do I report a bug? First of all, go to http://trac.rephial.org/wiki and use one or more of the links there to see if your bug has been reported already. If you can't find it there, you're best off posting on the forum or the newsgroup: if it's been reported already, you will get replies sounding more annoyed as the number of times it's been previously reported goes up, but so life goes. Bug reports should *always* include your current operating system (e.g. Windows XP), what version the problem appeared in, and the best steps you can figure out to reproduce the bug. Savefiles that show the problem might be requested, because they help tracking bugs down. 1b. I hate the store interface! Sorry, but it's staying that way for now. Expect a better one. 1c. Dark monsters are hard to see. Fix (reduce) the alpha on your screen, or use the "Interact with colors" screen under the options ('=') menu. (On older versions, use the '&' command.) Navigate to the '8' using 'n' and increase the color intensity with r(ed)g(reen)b(lue). 1d. I want old-school '#'s as wall tiles, not solid blocks! 1e. I use Vista and my display is messed up. Please see http://angband.oook.cz/forum/showthread.php?t=88 and http://angband.oook.cz/forum/showthread.php?t=26 1f. I play in a terminal on *nix, and the colours are screwed up. It's very likely that your console is not set to display 256 colours. Try setting the TERM environment variable to "xterm-256color" in your shell before starting angband (in bash this is "export TERM=xterm-256color"). 1g. I'm playing in a terminal and the Escape key isn't working as it should - I have to press it twice, or just wait a while. This is a feature of terminals to allow you to enter keypresses that can't be sent directly. Use the backtick '`' key instead - it's equivalent in every way to Escape. (This doesn't apply in Sangband, or NPPAngband.) 1h. Is there a way to disable that thing that pops up when you hit the enter key? Go into the options menu, choose "Edit keymaps", then "Create a keymap". Press Enter at the "Keypress" prompt and a single space as the "Action". In short: `=m8 ` And then you'll probably want to choose to "Append keymaps to a file" so that it persists for next time you load the game. This just replaces the default action of Enter with a "do nothing but don't tell me about help" action. If you want to keep the menu available, say on the 'Tab' key, you can also remap the Tab keypress to the '\n' action. ----------------------------------------------------------------- 2a. What are the current plans for the game? Ever-changing and subject to U-turning with public dissent. See http://trac.rephial.org/roadmap 2b. How do I suggest an idea/feature? Post it on the newsgroup or the forums. If people think it's a good idea, it will generally get some discussion; if they don't, it won't. The developers keep an eye on r.g.r.a and the forums, and ideas deemed OK will get filed for future implementation. Sometimes a suggestion may not be right for the game, though. Some suggestions would change aspects of Angband that are essential to its nature; Angband has a long history, and so has developed a certain character over the years. Some suggestions might make a good game, perhaps even a better game than Angband, but would make a game that is not Angband. To some extent, variants exist to address this, but even so they tend to adhere to the core Angband principles. 2c. How do I get a copy of the source code? The latest release's source is linked to from the page http://rephial.org/. To get the bleeding-edge development code, clone the git repository at git://github.com/angband/angband.git 2d. How do I compile the game? Please see http://rephial.org/wiki/Compiling for an up-to-date guide to this. 2e. How do I contribute to the game? First, join the mailing list [http://angband.oook.cz/mailman/listinfo/angband-dev] and/or drop by #angband-dev on freenode IRC. If you already have a patch you want to be included, please send it to the mailing list in the form of a unified diff against either the git master branch (e.g. using git diff) or the latest public release. Please be careful to follow the Angband coding guidelines [http://trac.rephial.org/wiki/CodingGuidelines]. All contributions to individual files are accepted under the licences used in the file header. Make sure you're OK with this before sending in patches. If the patch is a bugfix, then you can reasonably expect it to be integrated into the development tree. If it's more involved, and the feature is not one that the next version is planned to have, the patch may go through several reviews before being incorporated. It may also just be unsuitable for Angband - in which case, please don't take rejection badly; you may just be better off writing a variant. Non-code activites are different. Documentation can be written on the wiki, or if you're a graphics designer (and they're always welcome) then please talk on the mailing list about your work. angband-3.5.1/tests/0000755000175000017500000000000012456456607013603 5ustar chriscchriscangband-3.5.1/tests/birth/0000755000175000017500000000000012456456607014713 5ustar chriscchriscangband-3.5.1/tests/birth/new-game-0/0000755000175000017500000000000012456456607016550 5ustar chriscchriscangband-3.5.1/tests/birth/new-game-0/output0000644000175000017500000000007412456456607020034 0ustar chriscchriscplayer-sex: Female player-race: Human player-class: Warrior angband-3.5.1/tests/birth/new-game-0/input0000644000175000017500000000020112456456607017623 0ustar chriscchrisckey space key a key a key a key a key enter key enter key enter # Character birthed. player-sex? player-race? player-class? quit angband-3.5.1/tests/birth/F-Hu-Wa/0000755000175000017500000000000012456456607016017 5ustar chriscchriscangband-3.5.1/tests/birth/F-Hu-Wa/output0000644000175000017500000000007412456456607017303 0ustar chriscchriscplayer-sex: Female player-race: Human player-class: Warrior angband-3.5.1/tests/birth/F-Hu-Wa/input0000644000175000017500000000011612456456607017077 0ustar chriscchriscplayer-birth Female Human Warrior player-sex? player-race? player-class? quit angband-3.5.1/tests/birth/new-game-1/0000755000175000017500000000000012456456607016551 5ustar chriscchriscangband-3.5.1/tests/birth/new-game-1/output0000644000175000017500000000007312456456607020034 0ustar chriscchriscplayer-sex: Male player-race: Dunadan player-class: Priest angband-3.5.1/tests/birth/new-game-1/input0000644000175000017500000000022312456456607017630 0ustar chriscchrisckey space key b key b key i key i key c key c key a key enter key enter key enter # Character birthed. player-sex? player-race? player-class? quit angband-3.5.1/tests/birth/M-Dw-Pa/0000755000175000017500000000000012456456607016015 5ustar chriscchriscangband-3.5.1/tests/birth/M-Dw-Pa/output0000644000175000017500000000007212456456607017277 0ustar chriscchriscplayer-sex: Male player-race: Dwarf player-class: Paladin angband-3.5.1/tests/birth/M-Dw-Pa/input0000644000175000017500000000011412456456607017073 0ustar chriscchriscplayer-birth Male Dwarf Paladin player-sex? player-race? player-class? quit angband-3.5.1/tests/run-test0000755000175000017500000000110712456456607015311 0ustar chriscchrisc#!/bin/sh # Test runner # Assumption is that this is run in the top-level directory usage() { echo "Usage: $0 " } run() { rm -rf ~/.angband/Test test="$1" printf "Running: $test... " src/angband -mtest -snone < "$test/input" > "$test/run.out" if [ -x "$test/matcher" ]; then "$test/matcher" "$test" else diff "$test/run.out" "$test/output" >/dev/null 2>/dev/null fi result=$? if [ $result -eq 0 ]; then printf "\033[01;32mPassed\033[00m\n" else printf "\033[01;31mFailed\033[00m\n" fi return $result } if [ $# -lt 1 ]; then usage exit 1 fi run "$@" angband-3.5.1/tests/README0000644000175000017500000000106112456456607014461 0ustar chriscchriscelly/angband end-to-end tests This directory contains the end-to-end tests. The important script here is run-test, which runs angband with -mtest, feeds it some input, and compares the output against the expected output. Layout of a test: /tests/$suite/$test: /input: Input to supply to the test frontend. /output: Expected output from the test. /matcher: Optional; an arbitrary program to match input against output; will be run instead of diff(1). /run.out: Optional; output from last run of this test. For examples, look in /tests/trivial. angband-3.5.1/tests/trivial/0000755000175000017500000000000012456456607015255 5ustar chriscchriscangband-3.5.1/tests/trivial/matcher/0000755000175000017500000000000012456456607016700 5ustar chriscchriscangband-3.5.1/tests/trivial/matcher/matcher0000755000175000017500000000002212456456607020243 0ustar chriscchrisc#!/bin/sh exit 0 angband-3.5.1/tests/trivial/matcher/input0000644000175000017500000000000512456456607017755 0ustar chriscchriscquit angband-3.5.1/configure0000755000175000017500000066650112456456611014361 0ustar chriscchrisc#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Angband 3.5.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and bugs@rephial.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Angband' PACKAGE_TARNAME='angband' PACKAGE_VERSION='3.5.1' PACKAGE_STRING='Angband 3.5.1' PACKAGE_BUGREPORT='bugs@rephial.org' PACKAGE_URL='' ac_unique_file="src" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS MAINFILES USE_STATS SDL_LIBS SDL_CFLAGS SDL_CONFIG X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF NCURSES_LIBS NCURSES_CFLAGS NCURSES_CONFIG SETEGID NOINSTALL docdatadir vardatadir libdatadir configdir MAKE_SINCLUDE MAKE EGREP GREP CPP CP MV RM PDFLATEX RST2LATEX RST2HTML RC MKDIR_P INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM LN_S SET_MAKE OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC PACKAGE TERM_SETAF6 TERM_SETAF4 TERM_SETAF3 TERM_SETAF2 TERM_SETAF1 TERM_BOLD TERM_SGR0 TERM_EL TPUT target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_setgid with_private_dirs with_no_install enable_curses enable_x11 enable_sdl enable_win enable_test enable_stats enable_sdl_mixer with_ncurses_prefix with_ncurses_exec_prefix enable_ncursestest with_x with_sdl_prefix with_sdl_exec_prefix enable_sdltest ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS RST2HTML RST2LATEX CPP MAKE XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures Angband 3.5.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/angband] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of Angband 3.5.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-curses Enables Curses frontend (default: enabled) --enable-x11 Enables X11 frontend (default: enabled) --enable-sdl Enables SDL frontend (default: disabled) --enable-win Enables Windows frontend (default: disabled) --enable-test Enables test frontend (default: disabled) --enable-stats Enables stats frontend (default: disabled) --enable-sdl-mixer Enables SDL mixer sound support (default: disabled unless SDL enabled) --disable-ncursestest Do not try to compile and run a test ncurses program --disable-sdltest Do not try to compile and run a test SDL program Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-setgid=NAME install angband as group NAME --with-private-dirs use private scorefiles/savefiles --with-no-install don't install, just run in-place --with-ncurses-prefix=PFX Prefix where ncurses is installed (optional) --with-ncurses-exec-prefix=PFX Exec prefix where ncurses is installed (optional) --with-x use the X Window System --with-sdl-prefix=PFX Prefix where SDL is installed (optional) --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory RST2HTML command for converting reStructuredText to HTML RST2LATEX command for converting reStructuredText to LaTeX CPP C preprocessor MAKE Name of a make program to use XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Angband configure 3.5.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------- ## ## Report this to bugs@rephial.org ## ## ------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Angband $as_me 3.5.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- # Extract the first word of "tput", so it can be a program name with args. set dummy tput; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_TPUT+:} false; then : $as_echo_n "(cached) " >&6 else case $TPUT in [\\/]* | ?:[\\/]*) ac_cv_path_TPUT="$TPUT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_TPUT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi TPUT=$ac_cv_path_TPUT if test -n "$TPUT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TPUT" >&5 $as_echo "$TPUT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$TPUT" != x""; then : if x=$($TPUT el 2>/dev/null); then TERM_EL="$x" else TERM_EL="$($TPUT ce 2>/dev/null)" fi if x=$($TPUT sgr0 2>/dev/null); then TERM_SGR0="$x" else TERM_SGR0="$($TPUT me 2>/dev/null)" fi if x=$($TPUT bold 2>/dev/null); then TERM_BOLD="$x" else TERM_BOLD="$($TPUT md 2>/dev/null)" fi if x=$($TPUT setaf 1 2>/dev/null); then TERM_SETAF1="$x" TERM_SETAF2="$($TPUT setaf 2 2>/dev/null)" TERM_SETAF3="$($TPUT setaf 3 2>/dev/null)" TERM_SETAF4="$($TPUT setaf 4 2>/dev/null)" TERM_SETAF6="$($TPUT setaf 6 2>/dev/null)" else TERM_SETAF1="$($TPUT AF 1 2>/dev/null)" TERM_SETAF2="$($TPUT AF 2 2>/dev/null)" TERM_SETAF3="$($TPUT AF 3 2>/dev/null)" TERM_SETAF4="$($TPUT AF 4 2>/dev/null)" TERM_SETAF6="$($TPUT AF 6 2>/dev/null)" fi else TERM_EL='\033\133K' TERM_SGR0='\033\133m' TERM_BOLD='\033\1331m' TERM_SETAF1='\033\13331m' TERM_SETAF2='\033\13332m' TERM_SETAF3='\033\13333m' TERM_SETAF4='\033\13334m' TERM_SETAF6='\033\13336m' fi ${as_echo:="echo"} ${as_me:="configure"}": touching .deps files" for i in $(find . -name Makefile); do DEPSFILE="$(dirname $i)/.deps" test -f "$DEPSFILE" && rm "$DEPSFILE" touch -t 0001010000 "$DEPSFILE" done PACKAGE=angband ac_config_headers="$ac_config_headers src/autoconf.h" cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Check whether --with-setgid was given. if test "${with_setgid+set}" = set; then : withval=$with_setgid; wsetgid=yes fi # Check whether --with-private_dirs was given. if test "${with_private_dirs+set}" = set; then : withval=$with_private_dirs; fi # Check whether --with-no_install was given. if test "${with_no_install+set}" = set; then : withval=$with_no_install; fi if test "x$with_setgid" = "xyes"; then as_fn_error $? "Please specify a group to install as." "$LINENO" 5 fi if test "x$wsetgid" = "x" && test "x$with_no_install" = "x"; then with_private_dirs="yes" fi if test "x$wsetgid$with_private_dirs$with_no_install" != "xyes"; then echo "Please run ./configure with only one of: --with-setgid= This configures the game to store savefiles and scorefiles in a central location on the system, writeable only by the group \"groupname\". If you want a traditional installation of Angband, where all users share a scorefile, then use this option, and set the groupname to your \"games\" group. This option requires the game to have the \"setgid\" bit set on its permissions, and thus this option requires root when installing. --with-private-dirs This configures the game to store savefiles and scorefiles for each user in that user's home directory. The game requires no special privileges if you do this, and should be used for most installations of the game. This is the default, if you specify none of these three options. --with-no-install This leaves the game to run from the directory into which it was extracted and compiled, touching nothing else on the system - make install is not run. " as_fn_error $? "Please specify an installation method." "$LINENO" 5 fi if test "x$with_no_install" = "x"; then echo "Note: You have chosen to compile for installation, with data files in standard locations. For development, you may wish to consider using --with-no-install which will leave the game to run from the directory into which it was extracted and compiled. " fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="no" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi for ac_prog in rst2html.py rst2html do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RST2HTML+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RST2HTML"; then ac_cv_prog_RST2HTML="$RST2HTML" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RST2HTML="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RST2HTML=$ac_cv_prog_RST2HTML if test -n "$RST2HTML"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RST2HTML" >&5 $as_echo "$RST2HTML" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$RST2HTML" && break done test -n "$RST2HTML" || RST2HTML="NOTFOUND" for ac_prog in rst2latex.py rst2latex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RST2LATEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RST2LATEX"; then ac_cv_prog_RST2LATEX="$RST2LATEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RST2LATEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RST2LATEX=$ac_cv_prog_RST2LATEX if test -n "$RST2LATEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RST2LATEX" >&5 $as_echo "$RST2LATEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$RST2LATEX" && break done test -n "$RST2LATEX" || RST2LATEX="NOTFOUND" for ac_prog in pdflatex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PDFLATEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PDFLATEX"; then ac_cv_prog_PDFLATEX="$PDFLATEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PDFLATEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PDFLATEX=$ac_cv_prog_PDFLATEX if test -n "$PDFLATEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PDFLATEX" >&5 $as_echo "$PDFLATEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PDFLATEX" && break done test -n "$PDFLATEX" || PDFLATEX="NOTFOUND" # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RM+:} false; then : $as_echo_n "(cached) " >&6 else case $RM in [\\/]* | ?:[\\/]*) ac_cv_path_RM="$RM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi RM=$ac_cv_path_RM if test -n "$RM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 $as_echo "$RM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "mv", so it can be a program name with args. set dummy mv; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MV+:} false; then : $as_echo_n "(cached) " >&6 else case $MV in [\\/]* | ?:[\\/]*) ac_cv_path_MV="$MV" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MV="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MV=$ac_cv_path_MV if test -n "$MV"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MV" >&5 $as_echo "$MV" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "cp", so it can be a program name with args. set dummy cp; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CP+:} false; then : $as_echo_n "(cached) " >&6 else case $CP in [\\/]* | ?:[\\/]*) ac_cv_path_CP="$CP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CP=$ac_cv_path_CP if test -n "$CP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CP" >&5 $as_echo "$CP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in fcntl.h stdint.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in mkdir setresgid setegid stat do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done CFLAGS="$CFLAGS -DHAVE_CONFIG_H" CPPFLAGS="$CPPFLAGS -I." if test "$GCC" = "yes"; then CFLAGS="$CFLAGS -W -Wall -Wextra -Wno-unused-parameter -pedantic" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if gcc supports -Wno-missing-field-initializers" >&5 $as_echo_n "checking if gcc supports -Wno-missing-field-initializers... " >&6; } _gcc_cflags_save=$CFLAGS CFLAGS="-Wno-missing-field-initializers" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ _ACEOF if ac_fn_c_try_compile "$LINENO"; then : _gcc_wopt=yes else _gcc_wopt=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_gcc_wopt" >&5 $as_echo "$_gcc_wopt" >&6; } CFLAGS=$_gcc_cflags_save; if test x"$_gcc_wopt" = xyes ; then CFLAGS="$CFLAGS -Wno-missing-field-initializers" fi fi my_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $my_make supports SysV-style inclusion" >&5 $as_echo_n "checking if $my_make supports SysV-style inclusion... " >&6; } if ${my_cv_make_inclusion_sysv+:} false; then : $as_echo_n "(cached) " >&6 else my_cv_make_inclusion_sysv=no cat >conftest.inc <conftest.mk <&5 $as_echo "$my_cv_make_inclusion_sysv" >&6; } if test x$my_cv_make_inclusion_sysv = xno ; then as_fn_error $? "A 'make' supporting SysV file inclusion is required." "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $my_make silent include syntax" >&5 $as_echo_n "checking for $my_make silent include syntax... " >&6; } if { as_var=my_cv_make_sinclude_syntax; eval \${$as_var+:} false; }; then : $as_echo_n "(cached) " >&6 else my_cv_make_sinclude_syntax=none if test x$my_cv_make_sinclude_syntax = xnone ; then cat >conftest.mk </dev/null ; then my_cv_make_sinclude_syntax=gnu fi rm conftest.mk fi if test x$my_cv_make_sinclude_syntax = xnone ; then cat >conftest.mk </dev/null ; then my_cv_make_sinclude_syntax=bsd fi rm conftest.mk fi fi eval ac_res=\$my_cv_make_sinclude_syntax { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if test x$my_cv_make_sinclude_syntax = xgnu ; then MAKE_SINCLUDE=-include else if test x$my_cv_make_sinclude_syntax = xbsd ; then MAKE_SINCLUDE=.sinclude else as_fn_error $? "$my_make does not support a supported silent include syntax" "$LINENO" 5 fi fi if test "$prefix" = "NONE"; then prefix="${ac_default_prefix}" fi if test "$exec_prefix" = "NONE"; then exec_prefix="${prefix}" fi if test "x$with_private_dirs" != "x"; then $as_echo "#define USE_PRIVATE_PATHS 1" >>confdefs.h fi # Only change bindir if it's the configure-supplied default, which handily doesn't expand exec_prefix if test "x$bindir" = "x\${exec_prefix}/bin"; then bindir=${exec_prefix}/games fi if test "x$with_no_install" != "x"; then configpath="${PWD}/lib/" else configpath="${sysconfdir}/${PACKAGE}/" fi case "/$configpath" in */) configdir="$configpath" configdir=`( test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" eval echo \""$configdir"\" )` ;; *) configdir="$configpath/" configdir=`( test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" eval echo \""$configdir"\" )` ;; esac if test "x$with_no_install" != "x"; then libpath="${PWD}/lib/" bindir=".." else libpath="${datarootdir}/${PACKAGE}/" fi case "/$libpath" in */) libdatadir="$libpath" libdatadir=`( test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" eval echo \""$libdatadir"\" )` ;; *) libdatadir="$libpath/" libdatadir=`( test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" eval echo \""$libdatadir"\" )` ;; esac if test "x$with_no_install" != "x"; then docdir="${PWD}/doc/" else # Only change docdir if it's the configure-supplied default, which handily doesn't expand prefix if test "x$docdir" = "x\${datarootdir}/doc/\${PACKAGE_TARNAME}"; then docdir=${datarootdir}/doc/${PACKAGE} fi fi case "/$docdir" in */) docdatadir="$docdir" docdatadir=`( test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" eval echo \""$docdatadir"\" )` ;; *) docdatadir="$docdir/" docdatadir=`( test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" eval echo \""$docdatadir"\" )` ;; esac if test "x$with_no_install" != "x"; then varpath="${PWD}/lib/" else varpath="${localstatedir}/games/${PACKAGE}/" fi case "/$varpath" in */) vardatadir="$varpath" vardatadir=`( test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" eval echo \""$vardatadir"\" )` ;; *) vardatadir="$varpath/" vardatadir=`( test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" eval echo \""$vardatadir"\" )` ;; esac cat >>confdefs.h <<_ACEOF #define DEFAULT_CONFIG_PATH "${configdir}" _ACEOF cat >>confdefs.h <<_ACEOF #define DEFAULT_LIB_PATH "${libdatadir}" _ACEOF cat >>confdefs.h <<_ACEOF #define DEFAULT_DATA_PATH "${vardatadir}" _ACEOF NOINSTALL="$with_noinstall"; SETEGID="$with_setgid"; # Check whether --enable-curses was given. if test "${enable_curses+set}" = set; then : enableval=$enable_curses; enable_curses=$enableval else enable_curses=yes fi # Check whether --enable-x11 was given. if test "${enable_x11+set}" = set; then : enableval=$enable_x11; enable_x11=$enableval else enable_x11=yes fi # Check whether --enable-sdl was given. if test "${enable_sdl+set}" = set; then : enableval=$enable_sdl; enable_sdl=$enableval else enable_sdl=no fi # Check whether --enable-win was given. if test "${enable_win+set}" = set; then : enableval=$enable_win; enable_win=$enableval else enable_win=no fi # Check whether --enable-test was given. if test "${enable_test+set}" = set; then : enableval=$enable_test; enable_test=$enableval else enable_test=no fi # Check whether --enable-stats was given. if test "${enable_stats+set}" = set; then : enableval=$enable_stats; enable_stats=$enableval else enable_stats=no fi # Check whether --enable-sdl_mixer was given. if test "${enable_sdl_mixer+set}" = set; then : enableval=$enable_sdl_mixer; enable_sdl_mixer=$enable_sdl_mixer else enable_sdl_mixer=$enable_sdl fi MAINFILES="\$(BASEMAINFILES)" if test "$enable_curses" = "yes"; then # Check whether --with-ncurses-prefix was given. if test "${with_ncurses_prefix+set}" = set; then : withval=$with_ncurses_prefix; ncurses_prefix="$withval" else ncurses_prefix="" fi # Check whether --with-ncurses-exec-prefix was given. if test "${with_ncurses_exec_prefix+set}" = set; then : withval=$with_ncurses_exec_prefix; ncurses_exec_prefix="$withval" else ncurses_exec_prefix="" fi # Check whether --enable-ncursestest was given. if test "${enable_ncursestest+set}" = set; then : enableval=$enable_ncursestest; else enable_ncursestest=yes fi if test x$ncurses_exec_prefix != x ; then ncurses_args="$ncurses_args --exec-prefix=$ncurses_exec_prefix" if test x${NCURSES_CONFIG+set} != xset ; then NCURSES_CONFIG=$ncurses_exec_prefix/bin/ncursesw5-config fi fi if test x$ncurses_prefix != x ; then ncurses_args="$ncurses_args --prefix=$ncurses_prefix" if test x${NCURSES_CONFIG+set} != xset ; then NCURSES_CONFIG=$ncurses_prefix/bin/ncursesw5-config fi fi # Extract the first word of "ncursesw5-config", so it can be a program name with args. set dummy ncursesw5-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_NCURSES_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $NCURSES_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_NCURSES_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_NCURSES_CONFIG" && ac_cv_path_NCURSES_CONFIG="no" ;; esac fi NCURSES_CONFIG=$ac_cv_path_NCURSES_CONFIG if test -n "$NCURSES_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NCURSES_CONFIG" >&5 $as_echo "$NCURSES_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ncurses - wide char support" >&5 $as_echo_n "checking for ncurses - wide char support... " >&6; } no_ncurses="" if test "$NCURSES_CONFIG" = "no" ; then no_ncurses=yes else NCURSES_CFLAGS=`$NCURSES_CONFIG $ncurses_args --cflags` NCURSES_LIBS=`$NCURSES_CONFIG $ncurses_args --libs` ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $NCURSES_CFLAGS" LIBS="$LIBS $NCURSES_LIBS" rm -f conf.ncursestest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include "ncurses.h" int main (int argc, char *argv[]) { { FILE *fp = fopen("conf.ncursestest", "a"); if ( fp ) fclose(fp); } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_ncurses=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi if test "x$no_ncurses" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } with_curses=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$NCURSES_CONFIG" = "no" ; then echo "*** The ncursesw5-config script installed by ncursesw could not be found" echo "*** If ncursesw was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the NCURSES_CONFIG environment variable to the" echo "*** full path to ncursesw5-config." else if test -f conf.ncursestest ; then : else echo "*** Could not run ncurses test program, checking why..." CFLAGS="$CFLAGS $NCURSES_CFLAGS" LIBS="$LIBS $NCURSES_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include "ncurses.h" int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding ncursesw. If it is not finding" echo "*** ncursesw, you'll need to set your LD_LIBRARY_PATH environment variable," echo "*** or edit /etc/ld.so.conf to point to the installed location. Also, make" echo "*** sure you have run ldconfig if that is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means ncursesw was incorrectly" echo "*** installed or that you have moved ncursesw since it was installed. In the" echo "*** latter case, you may want to edit the ncursesw5-config script:" echo "*** $NCURSES_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi NCURSES_CFLAGS="" NCURSES_LIBS="" with_curses=no fi rm -f conf.ncursestest if test "$with_curses" = "yes"; then $as_echo "#define USE_NCURSES 1" >>confdefs.h $as_echo "#define USE_GCU 1" >>confdefs.h CFLAGS="${CFLAGS} ${NCURSES_CFLAGS}" LIBS="${LIBS} ${NCURSES_LIBS}" MAINFILES="${MAINFILES} \$(GCUMAINFILES)" fi fi for ac_func in mvwaddnwstr use_default_colors can_change_color do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "$enable_x11" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi if test "x$have_x" != "xyes"; then with_x11=no else $as_echo "#define USE_X11 1" >>confdefs.h CFLAGS="$CFLAGS $X_CFLAGS" LIBS="${LIBS} ${X_PRE_LIBS} ${X_LIBS} -lX11 ${X_EXTRA_LIBS}" MAINFILES="${MAINFILES} \$(X11MAINFILES)" with_x11=yes fi fi if test "$enable_sdl" = "yes"; then # Check whether --with-sdl-prefix was given. if test "${with_sdl_prefix+set}" = set; then : withval=$with_sdl_prefix; sdl_prefix="$withval" else sdl_prefix="" fi # Check whether --with-sdl-exec-prefix was given. if test "${with_sdl_exec_prefix+set}" = set; then : withval=$with_sdl_exec_prefix; sdl_exec_prefix="$withval" else sdl_exec_prefix="" fi # Check whether --enable-sdltest was given. if test "${enable_sdltest+set}" = set; then : enableval=$enable_sdltest; else enable_sdltest=yes fi if test x$sdl_exec_prefix != x ; then sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_args="$sdl_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi # Extract the first word of "sdl-config", so it can be a program name with args. set dummy sdl-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_SDL_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $SDL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SDL_CONFIG="$SDL_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SDL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no" ;; esac fi SDL_CONFIG=$ac_cv_path_SDL_CONFIG if test -n "$SDL_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SDL_CONFIG" >&5 $as_echo "$SDL_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_sdl_version=1.2.10 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SDL - version >= $min_sdl_version" >&5 $as_echo_n "checking for SDL - version >= $min_sdl_version... " >&6; } no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" rm -f conf.sdltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_sdl=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include "SDL.h" int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" : fi rm -f conf.sdltest if test "$SDL_CONFIG" = "no"; then with_sdl=no else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IMG_LoadPNG_RW in -lSDL_image" >&5 $as_echo_n "checking for IMG_LoadPNG_RW in -lSDL_image... " >&6; } if ${ac_cv_lib_SDL_image_IMG_LoadPNG_RW+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lSDL_image $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IMG_LoadPNG_RW (); int main () { return IMG_LoadPNG_RW (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_SDL_image_IMG_LoadPNG_RW=yes else ac_cv_lib_SDL_image_IMG_LoadPNG_RW=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_SDL_image_IMG_LoadPNG_RW" >&5 $as_echo "$ac_cv_lib_SDL_image_IMG_LoadPNG_RW" >&6; } if test "x$ac_cv_lib_SDL_image_IMG_LoadPNG_RW" = xyes; then : with_sdl=yes else with_sdl=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TTF_Init in -lSDL_ttf" >&5 $as_echo_n "checking for TTF_Init in -lSDL_ttf... " >&6; } if ${ac_cv_lib_SDL_ttf_TTF_Init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lSDL_ttf $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char TTF_Init (); int main () { return TTF_Init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_SDL_ttf_TTF_Init=yes else ac_cv_lib_SDL_ttf_TTF_Init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_SDL_ttf_TTF_Init" >&5 $as_echo "$ac_cv_lib_SDL_ttf_TTF_Init" >&6; } if test "x$ac_cv_lib_SDL_ttf_TTF_Init" = xyes; then : with_sdlx=yes else with_sdl=no fi if test "$with_sdl" = "yes"; then $as_echo "#define USE_SDL 1" >>confdefs.h CFLAGS="${CFLAGS} ${SDL_CFLAGS}" LIBS="${LIBS} ${SDL_LIBS} -lSDL_image -lSDL_ttf" MAINFILES="${MAINFILES} \$(SDLMAINFILES)" fi fi fi if test "$enable_win" = "yes"; then $as_echo "#define USE_WIN 1" >>confdefs.h CFLAGS="${CFLAGS} -DWINDOWS -static -Iwin/include" LDFLAGS="${LDFLAGS} -Lwin/lib" LIBS="${LIBS} -mwindows -lwinmm -lzlib -llibpng -lmsimg32" MAINFILES="\$(WINMAINFILES)" fi if test "$enable_sdl_mixer" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mix_OpenAudio in -lSDL_mixer" >&5 $as_echo_n "checking for Mix_OpenAudio in -lSDL_mixer... " >&6; } if ${ac_cv_lib_SDL_mixer_Mix_OpenAudio+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lSDL_mixer $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char Mix_OpenAudio (); int main () { return Mix_OpenAudio (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_SDL_mixer_Mix_OpenAudio=yes else ac_cv_lib_SDL_mixer_Mix_OpenAudio=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_SDL_mixer_Mix_OpenAudio" >&5 $as_echo "$ac_cv_lib_SDL_mixer_Mix_OpenAudio" >&6; } if test "x$ac_cv_lib_SDL_mixer_Mix_OpenAudio" = xyes; then : found_sdl_mixer=yes else found_sdl_mixer=no fi if test "$found_sdl_mixer" = "yes"; then $as_echo "#define SOUND_SDL 1" >>confdefs.h if test "$with_sdl" = "yes"; then LIBS="${LIBS} -lSDL_mixer" else SDL_CFLAGS=`sdl-config --cflags` CFLAGS="${CFLAGS} ${SDL_CFLAGS}" SDL_LIBS=`sdl-config --libs` LIBS="${LIBS} ${SDL_LIBS} -lSDL_mixer" fi MAINFILES="${MAINFILES} \$(SNDSDLFILES)" fi fi LIBS="${LIBS} -lm" if test "$enable_test" = "yes"; then $as_echo "#define USE_TEST 1" >>confdefs.h MAINFILES="${MAINFILES} \$(TESTMAINFILES)" fi LDFLAGS_SAVE="$LDFLAGS" if test "$enable_stats" = "yes"; then # SQLite3 detection SQLITE3_OK=yes ac_fn_c_check_header_mongrel "$LINENO" "sqlite3.h" "ac_cv_header_sqlite3_h" "$ac_includes_default" if test "x$ac_cv_header_sqlite3_h" = xyes; then : else SQLITE3_OK=missing for sqlite3_path in $SEARCH_DIR_HEADERS; do if test "x$ac_cv_header_sqlite3_h" != xyes; then unset ac_cv_header_sqlite3_h as_ac_Header=`$as_echo "ac_cv_header_$sqlite3_path/sqlite3.h" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$sqlite3_path/sqlite3.h" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : SQLITE3_CFLAGS="-I$sqlite3_path" SQLITE3_OK=yes fi fi done fi if test "x$SQLITE3_OK" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3_open in -lsqlite3" >&5 $as_echo_n "checking for sqlite3_open in -lsqlite3... " >&6; } if ${ac_cv_lib_sqlite3_sqlite3_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsqlite3 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sqlite3_open (); int main () { return sqlite3_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_sqlite3_sqlite3_open=yes else ac_cv_lib_sqlite3_sqlite3_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_open" >&5 $as_echo "$ac_cv_lib_sqlite3_sqlite3_open" >&6; } if test "x$ac_cv_lib_sqlite3_sqlite3_open" = xyes; then : SQLITE3_LIBS="-lsqlite3" else SQLITE3_OK=missing for sqlite3_path in $SEARCH_DIR_LIBS; do if test "x$ac_cv_lib_sqlite3_sqlite3_open" != xyes; then unset ac_cv_lib_sqlite3_sqlite3_open LDFLAGS="${LDFLAGS_SAVE} -L$sqlite3_path" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3_open in -lsqlite3" >&5 $as_echo_n "checking for sqlite3_open in -lsqlite3... " >&6; } if ${ac_cv_lib_sqlite3_sqlite3_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsqlite3 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sqlite3_open (); int main () { return sqlite3_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_sqlite3_sqlite3_open=yes else ac_cv_lib_sqlite3_sqlite3_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_open" >&5 $as_echo "$ac_cv_lib_sqlite3_sqlite3_open" >&6; } if test "x$ac_cv_lib_sqlite3_sqlite3_open" = xyes; then : SQLITE3_LDFLAGS="-L$sqlite3_path" SQLITE3_LIBS="-lsqlite3" SQLITE3_OK=yes fi fi done fi fi if test "x$SQLITE3_OK" = xyes; then $as_echo "#define USE_STATS 1" >>confdefs.h CFLAGS="${CFLAGS} ${SQLITE3_CFLAGS}" LDFLAGS="${LDFLAGS_SAVE} ${SQLITE3_LDFLAGS}" LIBS="${LIBS} ${SQLITE3_LIBS}" MAINFILES="${MAINFILES} \$(STATSMAINFILES)" USE_STATS=1 else as_fn_error $? "Could not find sqlite3 library; disabling stats" "$LINENO" 5 enable_stats=no $as_echo "#define USE_STATS 0" >>confdefs.h LDFLAGS="$LDFLAGS_SAVE" USE_STATS=0 fi fi MAINFILES=${MAINFILES} ac_config_files="$ac_config_files mk/buildsys.mk mk/extra.mk mk/sinclude.mk" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Angband $as_me 3.5.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Angband config.status 3.5.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/autoconf.h") CONFIG_HEADERS="$CONFIG_HEADERS src/autoconf.h" ;; "mk/buildsys.mk") CONFIG_FILES="$CONFIG_FILES mk/buildsys.mk" ;; "mk/extra.mk") CONFIG_FILES="$CONFIG_FILES mk/extra.mk" ;; "mk/sinclude.mk") CONFIG_FILES="$CONFIG_FILES mk/sinclude.mk" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if test "x$with_private_dirs" = "xyes"; then displayedvardatadir="(not used)" else displayedvardatadir="$vardatadir" fi if test "x$with_no_install" = "xyes"; then displayedprefix="(not used)" else displayedprefix="$prefix" fi echo echo "Configuration:" echo echo " Install path: ${displayedprefix}" echo " binary path: ${bindir}" echo " config path: ${configdir}" echo " lib path: ${libdatadir}" echo " doc path: ${docdatadir}" echo " var path: ${displayedvardatadir}" if test "x$wsetgid" = "xyes"; then echo " (as group ${SETEGID})" elif test "x$with_private_dirs" = "xyes"; then echo " (with private save and score files in ~/.angband/Angband/)" fi echo echo "-- Frontends --" have_frontend=no if test "$enable_curses" = "yes"; then if test "$with_curses" = "no"; then echo "- Curses No; missing libraries" else echo "- Curses Yes" have_frontend=yes fi else echo "- Curses Disabled" fi if test "$enable_x11" = "yes"; then if test "$with_x11" = "no"; then echo "- X11 No; missing libraries" else echo "- X11 Yes" have_frontend=yes fi else echo "- X11 Disabled" fi if test "$enable_sdl" = "yes"; then if test "$with_sdl" = "no"; then echo "- SDL No; missing libraries" else echo "- SDL Yes" have_frontend=yes fi else echo "- SDL Disabled" fi if test "$enable_win" = "yes"; then if test "$with_sdl" = "no"; then echo "- Windows No; missing libraries" else echo "- Windows Yes" have_frontend=yes fi else echo "- Windows Disabled" fi if test "$enable_test" = "yes"; then echo "- Test Yes" have_frontend=yes else echo "- Test No" fi if test "$enable_stats" = "yes"; then echo "- Stats Yes" have_frontend=yes else echo "- Stats No" fi echo if test "$enable_sdl_mixer" = "yes"; then if test "$found_sdl_mixer" = "no"; then echo "- SDL sound No; missing libraries" else echo "- SDL sound Yes" fi else echo "- SDL sound Disabled" fi if test "$have_frontend" = "no"; then as_fn_error $? "No frontend defined (missing libraries?)" "$LINENO" 5 rm mk/buildsys.mk fi angband-3.5.1/config.guess0000755000175000017500000012743212456456606014771 0ustar chriscchrisc#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: angband-3.5.1/m4/0000755000175000017500000000000012456456606012760 5ustar chriscchriscangband-3.5.1/m4/buildsys.m40000644000175000017500000001514112456456606015062 0ustar chriscchriscdnl dnl Copyright (c) 2007 - 2009, Jonathan Schleifer dnl dnl https://webkeks.org/hg/buildsys/ dnl dnl Permission to use, copy, modify, and/or distribute this software for any dnl purpose with or without fee is hereby granted, provided that the above dnl copyright notice and this permission notice is present in all copies. dnl dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" dnl AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE dnl IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE dnl ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE dnl LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR dnl CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF dnl SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN dnl CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) dnl ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE dnl POSSIBILITY OF SUCH DAMAGE. dnl AC_DEFUN([BUILDSYS_INIT], [ AC_PATH_PROG(TPUT, tput) AS_IF([test x"$TPUT" != x""], [ if x=$($TPUT el 2>/dev/null); then AC_SUBST(TERM_EL, "$x") else AC_SUBST(TERM_EL, "$($TPUT ce 2>/dev/null)") fi if x=$($TPUT sgr0 2>/dev/null); then AC_SUBST(TERM_SGR0, "$x") else AC_SUBST(TERM_SGR0, "$($TPUT me 2>/dev/null)") fi if x=$($TPUT bold 2>/dev/null); then AC_SUBST(TERM_BOLD, "$x") else AC_SUBST(TERM_BOLD, "$($TPUT md 2>/dev/null)") fi if x=$($TPUT setaf 1 2>/dev/null); then AC_SUBST(TERM_SETAF1, "$x") AC_SUBST(TERM_SETAF2, "$($TPUT setaf 2 2>/dev/null)") AC_SUBST(TERM_SETAF3, "$($TPUT setaf 3 2>/dev/null)") AC_SUBST(TERM_SETAF4, "$($TPUT setaf 4 2>/dev/null)") AC_SUBST(TERM_SETAF6, "$($TPUT setaf 6 2>/dev/null)") else AC_SUBST(TERM_SETAF1, "$($TPUT AF 1 2>/dev/null)") AC_SUBST(TERM_SETAF2, "$($TPUT AF 2 2>/dev/null)") AC_SUBST(TERM_SETAF3, "$($TPUT AF 3 2>/dev/null)") AC_SUBST(TERM_SETAF4, "$($TPUT AF 4 2>/dev/null)") AC_SUBST(TERM_SETAF6, "$($TPUT AF 6 2>/dev/null)") fi ], [ AC_SUBST(TERM_EL, '\033\133K') AC_SUBST(TERM_SGR0, '\033\133m') AC_SUBST(TERM_BOLD, '\033\1331m') AC_SUBST(TERM_SETAF1, '\033\13331m') AC_SUBST(TERM_SETAF2, '\033\13332m') AC_SUBST(TERM_SETAF3, '\033\13333m') AC_SUBST(TERM_SETAF4, '\033\13334m') AC_SUBST(TERM_SETAF6, '\033\13336m') ]) ]) AC_DEFUN([BUILDSYS_PROG_IMPLIB], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_MSG_CHECKING(whether we need an implib) case "$host_os" in cygwin* | mingw*) AC_MSG_RESULT(yes) PROG_IMPLIB_NEEDED='yes' PROG_IMPLIB_LDFLAGS='-Wl,-export-all-symbols,--out-implib,lib${PROG}.a' ;; *) AC_MSG_RESULT(no) PROG_IMPLIB_NEEDED='no' PROG_IMPLIB_LDFLAGS='' ;; esac AC_SUBST(PROG_IMPLIB_NEEDED) AC_SUBST(PROG_IMPLIB_LDFLAGS) ]) AC_DEFUN([BUILDSYS_SHARED_LIB], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_MSG_CHECKING(for shared library system) case "$host_os" in darwin*) AC_MSG_RESULT(Darwin) LIB_CFLAGS='-fPIC -DPIC' LIB_LDFLAGS='-dynamiclib -current_version ${LIB_MAJOR}.${LIB_MINOR} -compatibility_version ${LIB_MAJOR}' LIB_PREFIX='lib' LIB_SUFFIX='.dylib' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' PLUGIN_CFLAGS='-fPIC -DPIC' PLUGIN_LDFLAGS='-bundle -undefined dynamic_lookup' PLUGIN_SUFFIX='.impl' INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i' UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib' CLEAN_LIB='' ;; solaris*) AC_MSG_RESULT(Solaris) LIB_CFLAGS='-fPIC -DPIC' LIB_LDFLAGS='-shared -Wl,-soname=${SHARED_LIB}.${LIB_MAJOR}.${LIB_MINOR}' LIB_PREFIX='lib' LIB_SUFFIX='.so' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' PLUGIN_CFLAGS='-fPIC -DPIC' PLUGIN_LDFLAGS='-shared' PLUGIN_SUFFIX='.so' INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR} && rm -f ${DESTDIR}${libdir}/$$i && ${LN_S} $$i.${LIB_MAJOR}.${LIB_MINOR} ${DESTDIR}${libdir}/$$i' UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}' CLEAN_LIB='' ;; openbsd* | mirbsd*) AC_MSG_RESULT(OpenBSD) LIB_CFLAGS='-fPIC -DPIC' LIB_LDFLAGS='-shared' LIB_PREFIX='lib' LIB_SUFFIX='.so.${LIB_MAJOR}.${LIB_MINOR}' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' PLUGIN_CFLAGS='-fPIC -DPIC' PLUGIN_LDFLAGS='-shared' PLUGIN_SUFFIX='.so' INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i' UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i' CLEAN_LIB='' ;; cygwin* | mingw*) AC_MSG_RESULT(Win32) LIB_CFLAGS='' LIB_LDFLAGS='-shared -Wl,--out-implib,${SHARED_LIB}.a' LIB_PREFIX='lib' LIB_SUFFIX='.dll' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' PLUGIN_CFLAGS='' PLUGIN_LDFLAGS='-shared' PLUGIN_SUFFIX='.dll' INSTALL_LIB='&& ${MKDIR_P} ${DESTDIR}${bindir} && ${INSTALL} -m 755 $$i ${DESTDIR}${bindir}/$$i && ${INSTALL} -m 755 $$i.a ${DESTDIR}${libdir}/$$i.a' UNINSTALL_LIB='&& rm -f ${DESTDIR}${bindir}/$$i ${DESTDIR}${libdir}/$$i.a' CLEAN_LIB='${SHARED_LIB}.a' ;; *) AC_MSG_RESULT(GNU) LIB_CFLAGS='-fPIC -DPIC' LIB_LDFLAGS='-shared -Wl,-soname=${SHARED_LIB}.${LIB_MAJOR}' LIB_PREFIX='lib' LIB_SUFFIX='.so' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' PLUGIN_CFLAGS='-fPIC -DPIC' PLUGIN_LDFLAGS='-shared' PLUGIN_SUFFIX='.so' INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}.0 && ${LN_S} -f $$i.${LIB_MAJOR}.${LIB_MINOR}.0 ${DESTDIR}${libdir}/$$i.${LIB_MAJOR} && ${LN_S} -f $$i.${LIB_MAJOR}.${LIB_MINOR}.0 ${DESTDIR}${libdir}/$$i' UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR} ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}.0' CLEAN_LIB='' ;; esac AC_SUBST(LIB_CFLAGS) AC_SUBST(LIB_LDFLAGS) AC_SUBST(LIB_PREFIX) AC_SUBST(LIB_SUFFIX) AC_SUBST(LDFLAGS_RPATH) AC_SUBST(PLUGIN_CFLAGS) AC_SUBST(PLUGIN_LDFLAGS) AC_SUBST(PLUGIN_SUFFIX) AC_SUBST(INSTALL_LIB) AC_SUBST(UNINSTALL_LIB) AC_SUBST(CLEAN_LIB) ]) AC_DEFUN([BUILDSYS_TOUCH_DEPS], [ ${as_echo:="echo"} ${as_me:="configure"}": touching .deps files" for i in $(find . -name Makefile); do DEPSFILE="$(dirname $i)/.deps" test -f "$DEPSFILE" && rm "$DEPSFILE" touch -t 0001010000 "$DEPSFILE" done ]) angband-3.5.1/changes.txt0000644000175000017500000005257212456456606014624 0ustar chriscchriscAngband 3.5.1 ============= Welcome to the changelog for Angband 3.5. This file tracks the changes made since 3.4.0. References are to tickets at trac.rephial.org, or (if no ticket exists) to git commit IDs. Please note that we don't guarantee that living characters will move gracefully between versions - it might work or it might not! Ideally, you should finish off your character in 3.4.1 before moving over. Changes in 3.5.1 ---------------- * Allow stores to be given items for recharging in no_selling (thanks PowerWrym) * Fix crash bug with non-ASCII characters in monster + object lists (#1811) * Fix a bug introduced with monster lights that makes monsters stupider * Display level feelings in the status bar (thanks LuthienCeleste) * Fix player history log turncount bug (#1815) * Fix bugs where mimics could sometimes be hasted without being woken up (#1821) * Fix the curses port ascii walls option & wall lighting bug (#1813) * Fix bug where pressing 'e' with no equipment would bring up inventory (#1824) * Update help files and improve some in-game explanatory text. * Remove occasional double object feelings * Fix bug where down stairs could occur on quest levels without killing the boss (#1802) * Fix some memory leaks (thanks noz) * Fix bug where identifying items in the quiver would say they were on the ground (#1820) * Fix bug where randarts could get the remove curse activation * Fix bug where artifacts sometimes weren't located * Fix bug where sometimes identifying objects would produce strange effects when selecting later objects * Fix bug where hitting monsters with missile weapons at maximum range would damage them twice (thanks shadowsun) * Fix Windows 8 compilation & Windows DLL issue * Fix build problems with HTML and PDF manual generation (#1810, #1831) * Fix some unit tests Bugs fixed ---------- * Force radius 3 for randart lights. (#1752) * Fix up monster recall colouring and hit chance. (#1772) * Allow drop/drop all from the inventory context menu to work correctly in the home. (#1727) * Inscriptions now take use the roguelike keyset if that's what you're using. (#437) * Fix object visuals dumping bug reported at http://angband.oook.cz/forum/showthread. php?t=5864 * Picking things up wasn't using energy. Also fix autopickup not always working. (#1759) * Omit unnecessary UI updates during birth process. Helps with refresh issues. (#1669) * Correct comments for X: in p_race.txt. (#1708) * Reformatted Greater Maia description. (#1691) * Clean up msg_repository[]. (#1690) * Re-enable autosave. (#1699) * Fix article handling when a detected item that's really a mimic, but is displaying as a red star because the player hasn't had LOS with it yet, is found to be a mimic. (#1676) * Fix up article handling in messages reported in forum posts. (#1500) * Fix monster capitalisation typos. (#1711) Patch by mart0258. * Stop crashes when changing to ASCII in SDL. * Fix UTF8 in HTML screendumps. * Fix cursor in bigtile mode. * Fixed a crash bug where do_cmd_inven() and do_cmd_equip() permitted tracking nonexistent items. * Fix keymap pref-parsing bug (patch by AnonymousHero). (#1683) * Fix typos in hints.txt and object.txt. * Fix up various bugs with the item list: stop it combining items the player doesn't know are the same (#1687), stop leaking information on unknown items. * Stop giving the player a menu for pickup if there is only 1 item they can see but other items that are squelched. * Assign 'O' as roguelike keyset equivalent of 'K' (unhide squelched items). (#1679) * Make sure that both Enter and 't' can toggle options in all option submenus. (#1501) * Allow the -u switch to specify filenames outside of ANGBAND_LIB_SAVE on non-setgid systems. (#1220) * Fix the birth menu starting race and class on the last entry instead of the first. * Save HP warning and delay factor settings to options pref file. * Allow pStun to be generated on non-body armour randarts. * Fix up the logic of teleport level so it's always correct. * Show quiver slots in inventory again (#1761) * Fix monster tile mappings in the Adam Bolt tileset by nicking them all from PWMAngband (many thanks!). (#905) * Stairs never appear in walls after killing Morgoth (fixes #874). * Allow >255 character wide/high screens. (#427) * The game will first look for a user pref file matching the character name (as it currently does). If that fails, it will try to find one matching the savefile name. Should address parts of #671 and #758. (Thanks Ben Semmler) * A load of grammar fixes (thanks Ben Semmbler). Fixes #1738, #1732, #1731. * Clean up duplicate and conflicting monster flags (thanks Ben Semmler). Fixes #1601, #1692. * Change description for deep descent from two levels down to five levels down. * Fix cavern redraw bug, update a lot of code to use cave->(width|height) instead of DUNGEON_(HGT|WID) (fixes #1751). * Fix original tiles trap detect image (it was a hydra before) * Make the game handle neuter gender better. (#1763) * Move universal use in the roguelike keyset to 'X' to avoid conflict with running north east. (#1758) * Univeral use command defaults now to inventory instead of equipment. (#1736) * Make the subwindow inventory display responsive to its term size - hiding the weights and abbreviating item descriptions * in small windows. (#1735) * Fix old bug there if a monster is targeted using 'free targeting' mode, use_old_target would never clear after it was dead. * (#332) * Ensure monster death messages to go last, so you don't get "it dies. it moans in pain." type messages. (#1554) * Clear overhead subwindow on level change when necessary. (#1495) * Allow monsters to be placed on locations that have objects. * Various grammar fixes (full stops, singular/plural agreement) * Fix description for Rend Soul. * In character dumps, don't include origin information for non-wearables and don't include obvious and basic flags. * Fix typo that limited boulder damage. * Light description and character dump fixes. (#401, #403, #1681, #1325, #1681) * Get rid of extra linebreaks in character dumps. (#1325) * Stop mimics revealing themselves when running. (#1667) * Adjust 'when drunk' to 'when quaffed' for pedants. (#1635) * Add back in sounds on monster deaths from spells. (#1630) * Stop the inventory menu overwriting item descriptions. (#1725) * Only show fail rates on items when requested if those items have fail rates. (#1734) * Display a blank for a message count of zero. (#1787) * Allow chests underfoot to be disarmed. (#1779) * Fix gcu window sizing bug when there are any number of rows or columns besides 1 or 3. * Prevent polymorphing into force-depth monsters. * Attempt a fix of #142, hopefully making Windows fonts not disappear after an upgrade / folder move. * Force drop knowledge on first kill and use race flags to determine drop text. (#1780) * Gray out and disable some context menu items. (#1776) * Check user directory for pref files. (#671) * Offset cursor for sval squelch menu. (#1785) * Feel objects when blind or without light. (#1665) * Fix sounds, make message pref files use textual message types instead of numbers. (#1748), #1799. * Fix various monster death messages and sounds. * Prevent traps from being created on glyphs. (#1790) * Partially address #671: Strip roman numeral suffixes when looking for pref files to load. * Reorder inventory before displaying identification messages. (#1037) * Create full stacks when combining pack. (#1733) * Fix out-of-bounds crash in cave_monster_at(). (#1801) * Fix chaos damage message. (#1806) * Update map to show items felt during blindness. * Fix pickup behaviour in the dark. (#1665) * Save "unignore" status in savefiles. (#1293) * Fix some monster plurals. (#1424) * Fix mimic damage monsters when they're still mimicking. (#1754) * Fix pval display on artifact jewelry. (#1789) * Light up quartz and magma only when the player can see them. * Pushing or trampling mimics now reveals them. (#1755) * Allow shift-arrow-keys to run in curses again. (#1756) Gameplay changes ---------------- * Monster groups completely overhauled. Now different monsters tend to appear with different companions, and some uniques appear together too. This results in e.g. groups of novice adventurers of different kinds appearing together. * Rebalance object generation. Flatten out chances of getting good and great items - means more good and great items early on, proportionally fewer later. * Rewrite ego allocation and rarities so that egos are more level-appropriate. * Turn off selling to stores by default. Tweak the store interface so that it no longer talks about selling for 0 gold, instead you give items to the store in return for identification or recharging. * Monsters spawn a lot less frequently after level is created (chance per turn has gone from 1/160 to 1/500). * Reduce the size of monster escorts and groups. * Make uniques more likely to drop out-of-depth items, and reduce the number of chances DROP_GREAT drops get at being great to compensate. * Elvenkind now has level-dependent speed bonuses. * Give thematic spell-book drops to monsters. * Make town spellbooks available earlier in the dungeon (at dlev1 instead of dlev5). * Change monster elemental attacks so that they do some part of their damage using elemental damage and some of it using physical damage. This means that the damage a monster attack gets calculated twice - once for if it was pure damage, one if it was elemental damage. Whichever of the two is higher is the amount of damage dealt. This meant that immunity won't reduce damage ridiculously low. * Make Purifications and Healing a bit more of a find for Paladins by making CSW and CMW slightly better than the earlier versions instead of worse. (#888) * Give the player a bonus to damage absorption for physical elemental attacks (085574b82d649) * Some monster attacks no longer do physical damage (e.g. touch, spit, etc.) - they only do elemental damage. (3fc86a0f84db) * Remove birth_ai_smart (broken). Replace with birth_force_descend, which is like 'ironman lite' - you can only take down stairs. You can still recall but down stairs from the town take you to your deepest level + 1. * Make the damage monsters deal with each attack and their AC visible to the player after one attack/one hit. * Remove Charisma and tone down gold drops to compensate. * Remove Iron Spikes, jammed doors, and player door bashing. * Replace rings of rFire & rCold with one ring, rFire&Cold * Move =Flames/Ice/Lightning/Acid higher in the dungeon * Radically improve Slow Digestion (you nearly never need to eat with it). * Tweak mushrooms: - fast recovery heals some HP, clear mind heals 10SP. - substantially increase duration of telepathy from ,SecondSight and rConf from ,ClearMind. - Terror now gives you +10 speed - 2x change of finding ,Vigor, will be found later - mushrooms appear generally later in the dungeon and are spread out more * Stop scrolls of Curse Armour/Weapon being generated, since they are gamebreaking when there are no sources of Remove Curse. * All classes now start with a dagger (except priests) and less food/fewer torches. * Split out start_kit option from no_selling. * More option removals: maximise, birth_ai_smell, birth_ai_packs and easy_open are now permanently on. birth_ai_cheat is permanently off. Most disturb options have been removed, leaving only the one that people seem to actually change. * Add solid and hybrid wall options, a la Sil. This removes platform-specific solid wall setups. * Tone down the drop frequencies of spellbooks * The Phial is radius 3 again. * Instead of the general store having only 'always stocked' items, most shops now have some 'always stocked' items. These items are in an infinite stack, so you can buy as many as you like and there will always be another 40 in the store. * There are more food types for sale at the General Store, and it sometimes stocks some mushrooms now as well. * The Temple sells healing potions again now, and the alchemist will sometimes stock other potions it couldn't previously. * Polymorph monster is more likely to work and has a wider range of possible monsters to switch between. * Boots of Speed and Boots of Elvenkind are now at least +2 and +4, respectively. * Make the priest/paladin spell recharging rise with level as the description says. It'll be as good at the scroll at clev30. * Remove Gorged status if you eat too much food. * Teleport object power now triggers 2x as often. * No rings are now native message_flush()). Coding changes -------------- * Stop the code indexing into the monster race array all the time, instead preferring to pass around monster_race *. This has allowed significant simplifications throughout the code. * Merge all store-related info in external files into a rewritten store.txt. * Support building with clang. * Add debug command to really hurt monsters ('H') * Fix loads of warnings and errors that clang and splint threw up. * Remove p_ptr->command_arg. * Change alloc_prob and rarities to an int instead of a byte. (#1677) * Refactor and simplify get_obj_num_by_kind(). Patch by daniel.santos. (#1707) * Refactor a load of duplicated code in mon-power.c. Patch mostly by daniel.santos. (#1706) * Remove Carbon-specific support for using '~' in paths on OS X to mean 'home directory' because Carbon is deprecated and it's unnecessary. * Get close to removing z-type.c * Factor out a lot of externs.h * As ever, more little bits of cleanup and removal of old unused code. * Allow item creation to be narrowed to one tval only. * Replace a lot of passing around indexes into r_info, k_info etc with passing pointer to the appropriate entry instead. Closes out #1499. * Clean up options saving code * Change the format of flavors.txt so each flavour is on its own line - it's a lot more readable now. (#576) * Refactor savefile loading framework into multiple shorter functions. It's a lot cleaner now. * Remove op_ptr->base_name and process_player_name(). Replace with savefile_set_name() to set savefile filename and player_safe_name() which returns a filesystem-safe player name. * Make the -d commandline arg useful (only applicable to non-Windows/OS X installs) * Split SET_UID define out into SETGID for multiuser installs and UNIX. UNIX includes OS X. This means that on individual-user setups, the savefile no longer has your UID prepended. Angband will rename your savefiles to the new style when you first run it. * Terrain feature flags now have the same bitflag system as the rest of th game, and are used by cave_is* predicates where appropriate. * Convert most cave->feat access (and uses of FEAT_*) to function calls instead (e.g. cave->feat == FEAT_FLOOR -> cave_isfloor(), add cave_isshop(), & more) * Remove cave_bold* functions/macros because they were named ridiculously, replace with better named functions. * Rewrite FOV code to remove a massive Ben-era hack (vinfo_hack, and also uses of view_g/view_n/fast_cave_info). FOV is now more restrictive than before. * The various CAVE_ constants (for cave->info[][]) have been named more sensibly, and in some places stopped being used * Replace file_seek() with file_skip() as it was unused and skipping is more useful. * The buildsystem can now build and install the HTML & PDF documentation. The OS X dist target and scripts/pkg_win will also package the manual if it exists. 'make dist' in the angband directory will now try to make the manual before packaging up the game and supercedes scripts/pkg_src. * Try to move things out of defines.h into more appropriate places, and likewise with util.c * Update lore system to use textblocks. * Fix macros with potential side effects. (#1668) * Make monster_desc() and its callers cleaner. * Add spaces to colour names for text_out_e. * Remove nether breath giving nether resistance for monsters; follow up close of #1791. * Make do_cmd_wiz_query() actually display results. Documentation changes --------------------- * Add the player's guide (basic strategy and tactics) from the old wiki. It's by no means complete but it is something at least. * Update the help files with info about protections and resistances * Update inscription documentation. * Fix option documentation (#1750) angband-3.5.1/lib/0000755000175000017500000000000012456456606013206 5ustar chriscchriscangband-3.5.1/lib/apex/0000755000175000017500000000000012456456606014143 5ustar chriscchriscangband-3.5.1/lib/apex/Makefile0000644000175000017500000000060212456456606015601 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk PACKAGE = apex install-extra: if [ "x$(SETEGID)" != "x" ]; then \ if [ "x$(DRY)" = "x" ]; then \ ${MKDIR_P} ${DESTDIR}${vardatadir}${PACKAGE}; \ touch ${DESTDIR}${vardatadir}${PACKAGE}/scores.raw; \ chown -R root:${SETEGID} ${DESTDIR}${vardatadir}${PACKAGE}; \ chmod -R g+w ${DESTDIR}${vardatadir}${PACKAGE}; \ fi; \ fi angband-3.5.1/lib/xtra/0000755000175000017500000000000012456456606014164 5ustar chriscchriscangband-3.5.1/lib/xtra/icon/0000755000175000017500000000000012456456606015114 5ustar chriscchriscangband-3.5.1/lib/xtra/icon/angband-x11.desktop0000644000175000017500000000036212456456606020511 0ustar chriscchrisc[Desktop Entry] Name=Angband (X11) Type=Application Comment=A roguelike dungeon exploration game based on the books of J.R.R.Tolkien Exec=angband -mx11 TryExec=angband Icon=/usr/share/angband/xtra/icon/att-32.png Categories=Game;RolePlaying; angband-3.5.1/lib/xtra/icon/att-256.png0000644000175000017500000004340512456456606016732 0ustar chriscchrisc‰PNG  IHDR\r¨fsBIT|dˆ pHYsììu85tEXtSoftwarewww.inkscape.org›î< IDATxœí]wxU×ÿÝTH£½é Mš‘¢ ¨`CQñC°¢ˆ¯ E}m/ŠbCnT:""„€tB$ôœï»‰³³³mæÎÎfw~ÏsØÉì½çžsîÙ;wÎ=‡L˜0áŸ0š&LÓ˜0áÇ0€ ~ Ó˜0áÇ0€ ~ Ó˜0áÇ0€ ~ Ó˜0áÇð+ÀkÄ{š1ÖÒh^L˜ð0‰dŒµ°@¸åÒÓˆ¨È8®L˜0þ´è„'?L°š1VÁ ~L˜0þä®+\`c¬©§™1aÂàO`9€ …ë±àN Ÿ‡ù1acc0ƶ0ÆÍ‘ð@D¹¾±óçŠÖ2Æ&{%c,˜1ö€ÏÜ €¥Ære,üÆXð? ðclc,ÄS ™ð cÑ6˜ ûSEØñø• ¢ýö:¹í!›cÕ=À’ ÀòÚw7€ Þéav¼ ~å,p´ (AWûc½õfÆ„¾`ŒÝ`;€úvnYà9n¼þè–È‘^èСÂÂÂä÷Åø1ö:c,ÐSÌ™ÆØË~aç–ãD´Ùƒ,yüÎÑu?I¯]½z[¶lA:uä·xü‘ –‡X4¡Œ±òŒ±ïÌÀÜê׿þ€: ¬RRR={öàöÛoWº¿ø#Á pgB5,¯õ¶åäÖB‹õçÈ»á—À²ì;.½¶páBT«V ¿þú+Þ|óMÉ¿ `cì=ÆX°§x5á:c£ü ­ôz`` ³Y¬!¢‹žâÍkAD~I¦  §ÌÌL*Á¶mÛ¨nݺ$½GB»42z &•ê²<€Ï•tU±bEzçw”t8Äh¾½ür`Ábðe àÆXºôߘ.]º`ß¾}:t¨Òw;8È{ÎÜ 4Œ±à¯ø•ÿ-66»víÂÙ³gå:`­Øó~í þåXɯBÆ )??ŸäøðÃ)$$ÄÞj`€[Œ‹?€GÜTÒ˽÷ÞK™™™”››K•+W–ÿýM£y÷2œCÏYÇgŸ}FJØ»w/5nÜØž(ð¡FÉ@øë\]”/_ž¾øâ‹R½-]ºT~O1ÌÇ·ei4F€R©S§åææ’²²²è©§ž¢€€{Žà€îFÉ— @o'•äߢE :tè•Îúöí+¿ïw£ÇàMÍ„Áè#7¤?üaÛ¶mgÏ åÑ¢Ñcó%ÙÿŸ=™?òÈ#tóæM+=:tˆcò{Ç=o"X–DO͈ÁBø]j$111tãÆ r„¼¼<š1c›Ž@ý ߸³‘qdd$}ûí·Š:1b„üþ åŒ7$ÂyÙhf BW¹a½ûî»ä :D;wväJAsÀm½Ä€Gm*ʵC‡tüøqE½ìÝ»Wé×–Ñcò6€,‰€Þ3š!±Nj,•*U¢´´4rEEEôá‡R… œ9‚›~Ah Àèq{#­wUIŽaaaôÞ{ïQaa¡]ÜqÇòï]PÑè±y<"N*¨fÌA´“ÚøñãÉdddÐ+¯¼BQQQÎA ]ð€HãZŒa `"€^ð4€{ôp €‚–¿…÷ 㜰'³>}úPJJŠC=lÛ¶Mé»3ŒŸ7Àã¦åÂú @ˆÑÌ Œï¥r`ŒÑæÍ›É]¤§§Ó‹/¾H‘‘‘®:‚óîSÁo€Û¼àO—Àƒ›\íWþ|¼À-¢¶åîtâWªT‰.\è’ü{õê%ÿ~:€(O§,ÀK* =@¸Ñ zXµdJåТE Åà WpåÊš1cµjÕJéyT‰¶ÀAPøNø`³ÁÑ TNvW)ÀWàËñf‚e` €÷¤8âãî»ï¦‹/º$ó7*µñ‚HÞ}‰àSÂß ’ÑLzX “årxçwH+.]ºDK—.¥Gy„4hàhÒ¸WÂOø>@‘ÎÞ]ð €ö*eÛüxõŸòœõסCúõ×_]–qAAµlÙRÞÎejøõøs¡#EPÃhF=(@û¤2§Ó§O“H=z”lOæ9ï­vÂFDDP£F¨K—.4lØ05jõìÙ“âââ¨råÊ®®JìÑ>“à€†VºÚvëÖ­iåÊ•nËôý÷ßWjïYgüù3ÀS.(%@C£™õ P:ƒÇG”Ê`ðàÁ¤V­ZE 6T=ƒ‚‚¨sçÎ4mÚ4Z¶líØ±ƒNž<é4Žˆ(??ŸÎž=KIII´nÝ:š={6 <˜*V¬è9¾Ðc29–·üÀä¸ÒV‹-è§Ÿ~¢ââb·åxöìYŠˆˆ·y^²Áé­÷H…V¡Bª^½º’‚Îha4ÃŒÍñÒ¹sç’8qâÅÆÆº4áBBB¨[·nôÒK/QBBegg 秨¨ˆöíÛGóæÍ£#FPµjÕ\u)ž ?€SŽî öíÛÓôéÓiÆ TTT¤šç‘#G*õу¼À–¼™ —Ü?~œêׯ¯$ÐӪʹ‡SüùÑjòíÞ½›D!''‡fÍšEaaa'V@@ 8~þùg›pWOáÈ‘#4cÆ ªS§Ž+ŽàììWT­Z•&MšDË—/§ŒŒ !¼­_¿^‰‡Åäväí-äÂËÍÍ¥³gÏRóæÍ•»~N `d 4 k×®‘VüôÓOöœl)ÕªU‹^yåáûZPTTDk×®¥aÆ9 ƒ¶¢ÀÀ@š4i’°I_‚ÜÜ\¥SšWT%/°!o'¨*WV‰Á]¹r…Ú·o¯¤Ðï {ÞóUåf5þ#FZ8p@é=µÕD2d­\¹Òa¤›7àâÅ‹ôÎ;ïPÓ¦MNþèèhZµj•.þJ•*Ѿ}ûJe”MÇW4ú¶mÛÒ©S§ìÊב’’b7gB§NèÌ™3.·õË/¿(9Õ“0úª³iâ†mó*ÐÞá‹‚‚¥€Žä¶QIjÔVášëÖ­³«ˆŒŒ jÖ¬™’2'= Gº­—¿|ùòŠG€iöìÙvåéOøê«¯”&1Ò?ü`÷{;wîT õ%ÏØDY%©Qï– ö­·Þ²¯E":~ü¸Ò&Ï ±FÊ#‚ÂÀï*þªIÊÒß°oß>Åó¡¡¡´uëVÅû+Uª¤$ßoÈ l¡,“Ô ¿ wÔ¨QN¹~ýz¥ç±Ý‚Œ˜G„T?¦«8ùãããéĉNåèÈÈÈ AƒÙȬJ•*ô÷ß—ÞwôèQ{g~ñ;Ó“¤Æü„TÀ±±±.)rÒ¤IJÊñ›ä‹ÊŸ:³’AóæÍéúõë.ÉÐ_Q\\L&L°±ŸFÑåË—i×®]T³fM%ûú f‚U1ö[ú ‹TÈ.4»yó¦RŽüB]ŒœG<)7Ðèèh:yò¤SÙ™ *,,TJàIõë×·wÖ`ü,S•ž$5äȾìرÃ%%îÝ»WIY)ðñL,àùø¬Òr…„„¨Ê#èÏÈÊÊ¢6mÚ8ÜK±Ð^È tï+TZ˜ˆ²Á“2–bÛ¶mpmÛ¶ÅÌ™3å—øÐ¥Ê c üžÐ²Ÿ}öºwïn SeX³f êÖ­ëè¶?ô'¢ëbË? õBâqè²/**²wd˜Ñ^Nß„²ë´iÓ\–— [:tÈ^m¿LUï ’µUD`xx¸[qOž<©ô< @ŒÑ*4…z‚wÞy§¦Œ6&86lØ ô8¹ æ ?]¨ôÀ‚Ò7nÜÀÎ;]^M4hÐóæÍ“_ŽÅè`Œø@z­J•*X´häâ4á.úôéƒW^yE~¹ x’T‚ae±DtÀéµ­|‚SŒ?Ç—_Ì»K ƒ^ˆQZJ/Ìš5 •*U2ˆßôiÓШQ#ùåYŒ± ¥ûM¨‡ÒO–ÕŒw×À矎˜˜ùåcan7æ}x\ú¡U«V˜0a‚Q¼ø$BCCñá‡6ûÇuøÊˆ×À©صk²³³Ýj´J•*xï½÷ä—ë‚…(³`ŒÅ°Úâî¹çhG¾‹AƒáÖ[o•_~Ê^|JàðŒ®€‚‚lÙ²Åí†ÇŽ‹ž={Ê/?k™DeV?õÑÑѸçž{ŒâÅçñÔS6óý6ÆXK¥{M¨ƒ þžu¯ôÚ† T5þñÇ#88Xz)¼ødY…ÕæÆÃ?ŒÐÐP£xñyŒ9Õ«W—_6=®@ØÛ¶Ö¼Í›7ÇäÉ“å—{2ÆÆªjÐ@0Æê‚?Æ”âÌi=‚ûî»O~¹—¼ø*\rÀ•+WTuðꫯ¢víÚòËï1Æ*¨jÐ8ô~¨R¥ ââÊòÓLÙ@ïÞ½å—:øÈf²WÀžØžaúí·ßTu޹sçÊ/Ç€×´/K°r]ºtcÌ(^üÝ»w—o²†°Ù4¡Š€ˆrÁ“]”bÅŠª;1bú÷ï/¿<‘1ÖVu£žGS野;Ň_!22­Zµ’_nªt¯ ÷á(tm¹ôÃÚµk‘››«º£>úH¾a࿬ìüŒV‘~¨U«–Q|ø!«Á‡/™ ’ÙÙÙHHHPÝQãÆ1}útùåNTݨg-ýpýºy(ÍÈÉÉAAAürU#xñI8:(¾Pz(cܸqNs8BNNŽR.¸P²»¸)ã›âââhÞ¼yBŠ…š°ÆßÿMÏ<óŒ½\€ß’Ø„/3£Ÿ"|åÊ•©  Àe%*aÕªUJ ý?£áTPÀG |—žšœ0a‚Ï”÷2 ………ôóÏ?Sß¾} ªH¨/yMø93úúráÿöÛo.+Ôºwï.Wè%xyš'µ K®D·Þz+}ýõ×”››«YNþ‚óçÏÓ믿Nµk×v%+™ X¤];½G–*`âĉ.ªÕ>6oÞ¬¤Ø—Œ†´ð· ÆYJÑÑÑ4eÊÚ¸q£é ––FK—.¥»ï¾Û^î?)X ` Î ž¾ x@Ò}¦ø€§Á#E;¨2’À„YeŒ±-ÄÄÄàüùóšß8ëׯ—^º !ehjX0cÀS›•SÛFXXzôè~ýúáöÛoG||¼8Ëòóó±mÛ6$$$ !!ýõœÙž ëÜMD7tbÑ Œ±òè¾® ¾ ¬èbEà+Û³ÎgŽ^NDI™Õ<^,dY©xƒ»Ø»w¯ÒsÞ›F{Dɸ|"»ªY³&=ðÀ´dÉ»%Ø|‡¢9sæÐÀ),,L„ì~Lúé¼<ø¯øw²ôÐ=xÞÍ·´ÕknÙEÁX彟2eŠvë ¢‘#GÊ…s@uÃ…„øQ'°"ÆÝrË-4uêTúñÇéÀ”““#D¾žÄÕ«Wiûöí´`Á7nœ½|þ"è| ðФ÷Zgàôc¯Cr–¿~ýúHMMuú=g8zô(Z¶l‰¢¢"éåùDô´æÆU‚1 `› tO! õêÕCll,bccѬY³Òÿ׬YÓ(¶PXXˆÔÔT;v ÉÉÉHNN.ýZZš'Yù€ˆ¦hi€1VÀëàÏñjÛ CTTÒÒÒävì.JœÁ—DT¬¥!wસÀ>éµ]»v ‡?~</^,½” )Öܸ›`ŒUÖ¢|À!mÔÓÒPdd$š6mŠfÍš¡Q£F¨P¡"##RX˜íÙ™ââbdgg#++ËŠä×®\¹‚¿ÿþÇŽCJJŠRPŽQ˜NDïºû%KZ±'Ì/íæ‘‘‘èÑ£êÔ©ƒZµjÙPÅŠ|K ¨¨—.]¹sçl(99‰‰‰pe®Ø`¹žŒS ÜX*¥@²|yì±Ç´­-HMM¥ùÒh¡§—B8±K¼« é§)xf›•ðÐ’300*T¨@µkצ˜˜ wöž]$ýààçøpY`Û¸©ãÞàŽØa»‘‘‘4fÌZ¾|¹°Ç±3gÎÐ|@]ºtqEöÅÁÃîïU)“*TVëþÉ'Ÿ”  ¬2  :€TÁ†¿@´“~ƒÁO¾~û¬‡&¥^T <ŒüiÍÆ îüDô—   ú­ '{:zLz{pÃ\ÆÓoãÓåùÒÕªtØW_}%D çÏŸWªÿƒ^ƒ–+ ²Òè)Š¡ˆÐüÙô ?ÿjåyÁ/¡kvX àÃĹj¨àoXÞÄËqQvú)¾wuÃÞ÷›4iB?üðƒa¯gΜ¡—^z‰Ê•+çhŒGÜîL®jÈ]ãüMÊXÏž=… bÚ´iòAÃï®iðüD¢¨_#w$ täµ1€Áž¯µð³E';-FrÆ29 Uðžà øJh?€­àû!?˜ ž ¹'y0üW\«Ü¿Wh»¦eŠß §·Þz‹òòò´š®¤¤¤ÐwÞélœ³!8Ê]…–2Ä£'N@zz:EEEɼFä`Æc7¾_Í¢'¿nŽ- üѦ ø¦æmç1@W­À÷=ªÉ·…—ëäÿ„¤Í&pðH7zôh:{ö¬Ë¶éI¬[·Žš6mêhœ‹‘A |c«”¡—^zIØàgΜ©4஢+Ës‚&þu#ôàÑ_<Ú®@£rÁC¶ÛÁÎFcË–-é?þpl„^€¼¼Ø?E T6†!íg¨¤ Z‰æÏ üm‰V}$È”_ ¡¹sç ³SOáìÙ³4dÈ{cÝ  "i•»Û_àï²­˜Y»v­°A¿ÿþûJƒí¯u þcÀ –j5¶TEñeÀ{ôbE”àÐæ¼EEE4qâD{ã; &yÒWT’”‘#FpNNÕªUK>Ð=Z)á›X/À°¨%‚'“¬ô€3Qi¦èèhJLLthoe¯¾úª£¢&¤V檾ÄYJ™¦´´4aƒýôÓO•:\í %|ÿŸÃÚ  ŠV^L²«£0ðh8MzªW¯;vÌ‘™•9|üñÇ 4ÞËn!:€J½¾™3gްP£F”~uK#êTðÜRγ ú@¤ZLrYW5À_iªÒS||¼×îòkÅ?ü 9KN¨DnÊÚ¥³J`Œ--ˆÇÁƒUµ¥„o¾ùF©*Ì8"úÊݶcåÀ¹µÄ?îeÕUHñ,E3ºhžC?<â0|‰}ÀV"º`“.€1Ö<'¥[èÚµ+V­ZåÓåÚ7n܈aÆ!++Kþ§Ÿ‰h„[¹ë1è_/Ý2/´k×.až®¨¨ˆâããå^î$T„E‚GÔiùå/p›ZYéIà“ºxDÞ&¸¾ÊI§<Ι¸<ðÈRu¶À·îèiÀ€ÂÂÓ½{öì¡Ê•++Éá1rGÆîÜLÖÊaNI;Ÿ0a‚ÐA._¾\i€Ýä³.\Èåç„f¨•“^~¨h1€tc#ðÓŠ£àB”øc»í¿£rŒ.ë®~ýú~—yÅŠJ²¸  éíˆ+èUiçQQQtãÆ ¡ƒìر£|€©p# <„–ɱ öDxzª…PîëŒvèî ïÚP?ÑSÃxÿã¬ý   Ú±c‡vc+ƒP8HGà¯Ë‘@=ðÜg¥/^¼Xè”8ÖEþ:ª4ØJPC‹ŒDxlûÇÐÿPP¡=ùxVE{סá4øá¨‹ŽúøÏþ#ÄÖÊ"rrr¨eË–Jrù/éíˆ+(AÚñm·Ý&|:tPòp®,W·92è~­ò ßhð›Â$:R€GxQózn™A2yAÞö¤I“„Ú—/ ##ƒêÖ­+×A€º¤³h-WК5k„.??_©tÔZ;ühyö?S09‘cK¸YÈCôªÊïi®óžÕÇê1¨Fe2uº'ðË/¿(éáCÒÓW”Õ¡áÇ Üœ9s”×ZÆGGÆ®ùÌJù…ƒÔU*IÄ‘g-d÷•¢r™(owöìÙÂmËWP\\¬@wvòSŠ4à'¥ÓåË—….;;[)úi©Œï4l<\{|¿âcAî€OÁwÍÛ€‡G‚gÈéþOuŒ½›”™k,²9)m·R¥J”••%Ô®| ß|ó’>f’ΠdQ[ï½÷žðÁ͘1C>°B,<Ô…¶Ì2ß,èAà)³µN¶}Ƹ2á,Na<ħ@—“椮–1Yµ;cÆ ¡öä‹(,,¤† Êõ‘ ‚ôrÄf»Ý°aCáïhÓÒÒ”êÌ}féÿ] ›(R.Êëu“ì€*û®~0H/0^€|¬’z†‡‡Ó•+WD™’OÃΑú)¤³è%ïtùòåÂ÷ôÓOË– )wNƒÁ) dõ¸Æ ö4MP êv÷Q14fp‡¼ÝgžyF˜ ù:rss©Fr½œ…,¬†måµ{ôè!|p§OŸVª)ïÖÉ1-'2º ²j7è:€1y© ~ÔY¤Ø+€/«CG!!!>{Æ_/Ìž=[I7’Î`¼¼Ó½{÷ Ü< ˜–ù§EËÁ|ºAýéÄ«P™ùÅ O“;€Yù©#oóÑGb7þ„¬¬,ªT©’\7Ig Ù{Ûûï¿_øà>,ª¾Ý È®ê¢lC5éeè¨_åÀ3‹r]4òó ¼Íƒ ±óÏ>+×M.$)Å D”à¿Òkßÿ=.\›€¦yóæ¸óÎ;E4õ=]ÆX%ÆØ+Œ±ÅŒ±n"/c,Àð·%î"À`"JÉS ˆ(|U®Ø¥±Û¥jÕª…øx-Éœüýû÷—_ _…rOmT…l™+²€H vìØ!âתƒ…çž°~Gž ,™¼¢Ç;õГŒ¿0ðÒ`Zå¹T# À%i›ãÆd1þ‡œœ¥ºƒïR‰¼Iƒ²dï·£££uI×tÛm·i1ÖcàïÅß„ò¦œÕó’Y´ƒúø„ÿé¥#>EÔIÔt„¼d™U›_ýµ(sñKôéÓG®£$²È[ø#€s¥®\¹‚%K–ïäùçŸ×òõ­àç^eÑ›1ÖNKŒ±òàKÿ _?^ÚSøKã÷ ¼î‚ôµ¹Ð׿’W`Ñ¢Ehݺ5Z·n.]ºàܹsF³¤ˆÛo¿]~©5c,€~+âÞÜ*YHóæÍuñp­[·VûkåÊn¼MåY7e0O%o ŸžúQàu˜^ ‚©À+—¶/ÊL„bóæÍ6é¹Û¶m+<%žìÙ³GIW£ˆHw0PÞñúõä0íä IDATë…péÒ¥Z—­ðó Ý»w—_/ÐPåø»@ýœÏôÔ~j”ákûì@ÔäɓŊ ¤¦¦*Õ°$t÷ÝwSqq±Ñ,Z¡¨¨ˆªT©"çõ ò€`Eš 0@ø • ‰¸E7¦ÄÄDJOO§ððpùß?R9þßTòs  O¼¡EŽ4ö›¼ÍÕ«W‹3ÈÌÌT:mgE¯¾úªÑlÚàî»ï–ó™Jz;âJµªúÊ£#GŽà'Ÿ|¢ÊhcôØcY0S5¾ ;Ç)Œ»‹†‰t»Þz±Ãs°žÓ 1{2dy‚ƒƒ½êä_QQ <ØjÜåÊ•£#FØØÔ÷ßo4»V°“2¬ž'ŒªÀji›}ûöUaú`Ñ¢E6c~á…Jÿ~íÚ5›¼•µjÕòš¤¥J:é)£ª _Ú¹è\îyyyöJ%YÑØ±céâÅ‹NÛKJJRúþS.ŽWm ò›*¨‘±PQ%ßEP1@¢´Ý1cƸcºaÛ¶mj5æ¡C‡Úlö?~Ü&ö¾C‡^S®LáÝž4®¯¥×¬Y“òóó5ª¸¸˜~øáªY³¦C#íÞ½;mÞ¼Ù­¶ûöí+oç$€@'ãl¢r€ÅZd¬•Àk ªá{‡ þOIÛõ†ã¿§OŸ¦jÕªY·eË–v÷&6lØ`óø8zôhs­ …ãÁ¯yÒ¸ÚÊ gÉ’%š´bÅ jÕª•CãìÔ©%$$¨jÿ×_Ujs´“qNÕà³{ŠÀóªáûAý[¥þ~ë­·TéM²³³mì«jÕª”ššêð{ü±ŒfÍšå¦@a®ü×ÓfuÆ»]»vª²fÍj×®C£lÛ¶­WH·Ür‹¼m‡›tàÑ…j&Q²£v=A^SÉ{{}GÈÛ]°`fý©Eqq1Ýu×]Vü„„„Ж-[\úþĉ­¾Ë£Ÿ~úIg®C!$ø'OØ]r%»³,OHH Î;;4ÆøøxZ¶l™°`Œ%K–(õÓÇÎøªA}¢×EÈX A]!ÕKH@yÛFƼð 6cuÇ!PïÞ½­¾FIII:rí£G–éOOXx]úR&œ¥¿~ý:ÍŸ?Ÿš7oîÐccciéҥ£° ”Š-üjg|©œüà=dîWv—o!û:ÉÛNLL©J—¡äôÕìG¤§§Û¨Õ©S‡.\¸ ×Î1iÒ$ù¸ŽadOK™ “'OÚ0»ÿ~zì±Ç(""¡6jÔˆ/^,¼‘|ðRßVõ,cûEƒ¸My»C®©à{” ¾‡ÈÛ>uê”H5º„üü|›ã³ Pm_GŽ¡¨¨(«özè!Á\»†×_]®»t#Œ,Rnhãǧk×®Q^^-Y²„ºvíêÔðêÖ­K_|ñè.8;©•¾Q›MK7¨¾§u!ã½± ž TÔÿýòö333Å*ÒäääXñ¤ù]þ»ï¾kÕæ¨Q£qëæÍ›'×_‘QÆöž\ÙJï)m¨aÆôñÇS^^žG„V‚_|QÎK€z’1…BýÁŸBh,¢¡•¼­‚ï­û¿SÞþ?ÿü#V‰. ??ßæ”߈#T?Zž‚Ú>©¼0ð|no€Gùt¬4..ŽæÍ›Gׯ_×uð'Nœ ©S§ÚÍä¢@y6‚GÇ= þšªxÑ «òJ–ñ?¯Á\¥z›«’ç‘:ðrZÚÇ”)SDš€*œ8qÂæYÇŽ)''Gñþí۷ۺ뮻¼"KÂy™™ZþË·nTæ ¦‘#GÒ¦M›tô¹sç¨_¿~®9 àCðºt.ý•ÈBk­?#2U‚ºB%ÐáÔ"€=Ò~î»ï>AV  ›6m²Ù;v¬Í}ÿüóU¯^Ýê¾V­ZQvv¶\ÛBá-ÛSZ”U @²;“~àÀ´páBJOO÷È€sssF‚g²y@cµ²°ÈCíFZ µÒÒ¿JžÕÖSüS'~ÖJûéׯŸv#¥ŒSo¾ùféßoܸAmÚ´±ú{µjÕ fRµk×”ôxeusf(!!!4xð`Z´heddx|ÐÙÙÙŽøÛ^>T­ dò Ñ Á‡üŽÔÀ«Ó <-’ösË-·h¶‘'œaŒÑŠ+¨¸¸Ø&-XHHmݺÕh–KqìØ1%=öÔ¢¬–ò¨uëÖôÌ3ÏÐ/¿ü¢ûs½+hРÒÀ?'ñÆÛY£˜,š'¼V_ù¨åµ—N|½.í'44Ô«ÒlØœ¨‹ˆˆ |ÐFFF¾ÁPÂÂ… •ôØP«Â6IŒ‹‹óŠÍ)æÏŸ¯4palô¯,*AýI@‚ÊÌÃ*y]¡Ï|¸¹?â_}åýé‘F^ ®^½JMš4q(£gŸ}Öh6m p†ˆ Ua6ËÞ_~ùÅó£s€7n(åDχ¡·¥´r“®ˆÍ“hà‘ìÒ‘·…S{ãd:vìU¨PAQ>wÜq‡G¢UÝAqq±MV#_’V@\iû¥ wíÚÕÓãsŠ3f()ëoÀojœ\ωæIÆ_}¨;ñ'¥Ÿuâ-²„1€÷í”`ýúõhÅkóæÍ½â±WŽ}ûö)éq r÷ɹùQXXH+V¬ ÷Þ{þþûoUm¤¥¥Qùòååø]i¨Jç&x,ŒÂê÷}ì" ‹(S£´7Ò­·ÞêÔ8 J÷Üs¼­kPëÕ( -%ÁJè €Fù¨àcÁ¿„RTÔÀ[}?¸Ú_:uTéÛŸS 2@"q¥ZUÿ qùÜsbb¢MEGtÿý÷«ÆîÝ»•Ú{H” $²Ø,`’«²ÿÑàû zLþZ7À-†Šòc‡V¥s‡B9³¯èQ2ÙÀ³øÄ€?rÌp΃_NÀwñÿþ*ôyðJPÇ >Mš•+WΰlºesçÎU’壤£h™——˜ âá”3gÎt”ÿï,ø¯J°¬m«çÙˆˆÕç *¤¯È `˜N“-@–“Ý0š>}º*}û#òóó©víÚJŽÚjµ&Ôè‰þ2i§111¥™}Ο?O:t°§àðTaŠïÁ4„, Ú£_ýµRÿBv¶e<iô¤q áÆ©N#)**ÊCeeJy L#¹Ê/h%(xøì³ÏèÌ™3Žb¨÷ˆs¡íï¤ß«^½ºª´avŠ}ü¡ƒ,"7zâ8 ›à‰Nâ bcÎzã7ÜÖ·¿¡¨¨ˆbccå²»…¸á€¸á[…t6lØÐÞ©¼ð„".í&h'oãóÏ?W%$;Å>œ:!²èè¥“ë €[%|~à<9¥ªU«zM¹moÅ?þ¨$»·HÉ>•.j%¸¶ ~@Gmo¶Ó´iSU‡/ìûÐ+ÑÅ‹FOÐLÆc8‰È3€nX ¿>oÞ<·õíOhÛ¶­\Ž9°„þÊI/Àr ØT T¶m“~ûçŸV%(…b ƒò€úÜ{¢i€vøŒ‡÷l0_­”þ­nݺ”ŸŸ¯J美õë×+ÉòS²g›öþ •À_áÙSlmÿ%m³sçΪ„uñâE›:pàç„ÆHø~âÃrÝ¡Õprþ|OÀH³À_#†HxzM~ß /¼ J羌¬¬,¥}¶B8ˆ*ÕÓÃöôÙQ5´=Fnî”—b„ JFø’ŽrémÙxÔиqü|ß⤓ÿk%ûO1oUH& €6lØ J羊qãÆ)Éô;r¤kGÔJàåžJŒ= @5Aí?Ç–tÈ!ª„–œœLJ^³·Žriu¥¸Ý¥+ànÜ>½¾'ðx$ð·@]œð3Yþ½5jPZZš*½û”Jšƒïü×'£ýë½£uhתÌ8cLu¼øðáÕ„w %À¡?d›š‚(¼«ê;ߌÍcø_7ù`ÖÈÛ4h*ûNœ8A‘‘‘J2MÎäêìo%(l©=6ºcÇ{FzÞ™4–¶–‚© ” „õììøjà¯xÂΣ&þfBEú3U-:±jsîܹªôî ÈÏÏ·\çRå&Ã'²‚¬WHHˆêZîÝ»w·g°ÉÐacg<1à›p/ƒžùÊhòÀ­x<Q°‡xl¾)wØ…É~Àz³ÁkCjª½`é¿\&¡¡¡”””¤Jïe §ýJl6œüÀT…ìÐÔ©SU rÕªUŽ ù€º1@sð3ôU 8FÞ",N« €6º^3Bó㇃~mr/ÆÆÆzMO!!!A©âUܨÚl¸i%È EEE©JÌX\\쬊Ðywk’®:°C®£¡C‡ê^QÚ[°ÿ~ªZµª’>CîÈÒ›½‘ pHèÝwßU%ÔíÛ·+¥O’RtÈ&l’*½×‡B†ã^½zQff¦S]—elݺ•*V¬¨dŸkáf ‹áŠA¾— ¢fÍš”——§J¸G¥.]º8r…ž2zÌ&Ü£¤£víÚÑåË—êº,bõêÕö~¤.@ÅkvÕ(‚ pHháÂ…ª…\TTDsæÌqVQx ì„ÔšäQÝÏTÒOÓ¦MéôéÓΕ]†ðõ×_ÛT)¶P:Tœ«!ò@Ü6J…Ò¼ysÍeÊžzê)g»ÜéF=v'ð !›ÌCµk×ö™\‚sçε÷ƒt@sR+;µ_ô6ª±ÎÊ•+5 ýÆÔ´iSgN€À#æ<òªÐ$»ú¿ Ç®«T©B;wîtAÛÞ‹—_~ÙžÝ%¨GZä¦åËÞFà'ÝJtÇwh=ÑÒ¥K]q%„ï¨e´ü•À¡ß”ë&<<œ¾üòK¯+\ë W®\¡ûï¿ßž½íP•´ÊLkÞD“ ©AƒU@”žž®tVÀ凸ªJém’fè CI7:u¢ÄÄD—ôn$ é£>RÊWQB›D’y‰hÄ[ÀSRAuìØQ›&,èÔ©“; „Šü ½Ñrñì+̓„—V°S1F=ô×Öüã?¨eË–Žìj¤aw—à[¨'ýP¿~}!Ö¬YSÍ׌°›1¶16Š1)„!/c¬5cì ÆX2€íFóS": +xî ùß°páB4mÚsçÎEaa¡çTÀ™3g0jÔ(ôìÙ´wÛçî!¢'Ay—ü6²Ñ«a#À(©#""4玳“hAú<¢ñyðWšB’§¸)¿0ðòb/‚¯TÒUŒ#Þh;p0¾9;CõêÕiâĉôûï¿«J8«„ŒŒ úòË/iàÀÎ&} } ¶Þ2aÁøcU\ÿåüúë¯èׯŸªövìØþýû#++K‡nãé!¢Lƒù1¡¦ðcÑàoî­n,Gn£Ý4šâd4þ"Ê/à°càGn·Á:p©úÇí¸ þî:¼ÚÎ$ð7'%ˆ2'¿ïÂtƒˆ²cW!‹ZÐÜ4³P‘ø÷€Oˆ“ÿ瀧\pðoK;eŒµ€µþß„ÁtÞyÄÜu"úÇòÿðƒ*žÂNÙçvŒ±`"ré,«‰²_Ú™.Ë;€Ã†pÁ!wå!9^m·`:ï€Óo{þ‡å€ÔÙeÓø L`<¼ÎX ß0³ ù L`<¼ÕÈ÷:0Æ´Ö 0áe0€`Œ…‚‡üJadò@Ì ?>3Xcã̯ޓl¡¿KþODé _kÛ|…^± ¢‹Œ±Ó°>­Ø|ƒÀ« VFMÁs*>DD[<DZ 50€0Æ~0Òò±*Ò‡3ÆÒñ¯c(qMd·%¢ë:²ê.vÀÚLdŒõÄ¿ÝQi­?c¯Ñ,ù3¡f>`ŒÕpZPs§¼ƒW çµë–šõÁ'µô×¼€ š¾JDU43hB7˜@#c#ü¤SóYø÷1¢äß5D¤º`¡eÙÞÖ½1Ü+xá‘ül /ù ¤Z´hþýû#99ÉÉÉHMMEQ‘ê¬á‘à¿Âí$׃gv–°ã_díiBhh(š4i‚ØØXÄÆÆâ“O>AF†U¶°°=\dÂK`:íè(ý0dȼõÖ¿‰òóó‘’’RêJèØ±c¸zõªMc.`cì'"Z­â»ÏCåä¯Y³fé$—Rýúõðïˤ¤¤$¬_¿^úÕŽàµLx!L –êCVªC«BBB‡¸¸8›ï_¹rÅÆ1$''#%%ÅY-ù©àù÷ÝÅsŽþ†¦M›*NôˆGû}ÿ¢C‡rÐÁÞ½&Œ‡é´!¼.\):vìhçV[DGG#::]»vµº^XXˆÔÔÔR‡ðÖ[o!=Ýê-b’J~ÿгäC«V­0a„ÒI^»vmpŸ¦ ãoà $OÖ¼7á2ÌM@ `ŒÝà«’Ï111¸pá‚Ð>rssQ¡BäççK/'¢åî¶Å› žåŸ¬»víÀ忸tébbbä—[‘«åÙLxf$ 6X-oåËHLL”O~ت²9«Àœ¤¤$ܸ!¶OõêÕQ§Nùeó1ÀKa:m°2lw–ÿ®bóæÍòKÇ4Þ^äÔØ±Cò¯ r0€—Ât*a)8ÚZzMÀ–-6Ñ´6ÁUXêöYí(´¯ rïMOlZªí”whàUÓÕTúu-!«,ÚaûöíòËZgìH&¤‡@KÆX(å ïÌKŒCepÝ[(ÛLgîeÒX^¿µ0ÈBíÈ·¯³c‡?`³ˆö dÃÊÊ5j„Ê•+ løë¯¿-¿,Â<[òaçÎ(((@p°¸"DíÛ·c ÿ[²Z²ãhY}õ×A<¸3nÛÔjŒ±-àuÖQ²ˆþ} DTf|’? à,¸§w—þ0@AyùŸ´íÑ£G“hÌ™3dž2¬þëXÚîöíÛ…óÞ¬Y39ïOiä;ÀKd¨ÔÿAý´ÊЗ¨Ìì0ÆšøÀçj©l¦€§lp™1öcl8cLMµ^Ýß(lª~þ/ñcÉGœô£ òp[@Œ±hÆØCŒ±•®€Ÿ¹  ¢J¶âüÊ[Ä»\+£(€16üúm›­à~ˤ1Æ~±›ÍKl~ KŽ!ú aëV›·}¢Ø­ÚÑc@í›ÆXÆØdÆØŸà5 Ù~‹FŒp„1v§À6Ë$¼>ˆ1ö*€×”þÖ AÜqÇ4hš7oŽÀÀ@ //GÅÁƒqèÐ!ìÚµ ÇwµK°<Ôv5€$’ ‰1Ö ’IˆÌÌL„……©¡2Ž=ŠæÍmÒ ´ ¢#J÷»ÆØß”|®X±"ÒÓÓ­búµb×®]èÜÙ*(¨HD™2^‚t0ØBM]iŸ1†6mÚ ]»vˆG||<š4i‚ÀÀ@£  ‰‰‰X³f Ö¯_´4Å7§Åî&¢ŸÕŒÑ'`ô3ˆ“ç¾ ð,W§NZ³f ¹ƒÃ‡Óo¼AíÛ·w÷¹ñ<€/ náëé=-[¶t‹Wðé§ŸÊùHƒÅak%µåãÜ·oŸPþsss)88X>†^–þ£-ºýÀ5WuD}úô¡>úˆÎœ9ã2/EEEôÉ'ŸPTT”R»7tR#G_ ðËÐ @¾TYŒ1zâ‰'(33Ó±ÆàŸþ¡yóæQïÞ½)((Èg `=ø»ôÒë?ü°&~”0vìXyßËI¬|S¥íÏŸ?_øÚµk'C€íŠ\•yXX 6Œ/^LW¯^ÕÄÏ™3ghРAJý\Ѐ¼Àî=M†3 /¯jIDATÈßäI“+êý÷ßw¦c·‘žžN‹-¢aÆQdd¤šeúôÓO…óU·n]y?SH¬Œ¿’¶Ï=÷Ãã?®JžÕ«W§ñãÇÓòåËéæÍ›Âùºï¾û”úM„ VY"ÃPd x]® ‰':U¬VäååÑo¿ýF“'O¦Æ»l°{÷îÊÇ©S§”úiObeüˆ´ý5jÑ‚ \’cŒÚµkG3fÌ ÄÄD*..΋¹¹¹ÔµkW%^†“Ø¿'ÉplâÑ\×¥ŠéÛ·/:׬`$''Óœ9s¨wïÞJϳ€bcc)??_h¿_ýµ¼Ÿ,hŒ[øQf«~Ž?.t'Nœ ªU«*Ê-22’†N ,  .íפ¥¥Q:uä|ð·U€á Ø0¼)UJ@@>|Ø•ê‹ëׯÓ?þHãǧêÕ«Sdd$½ûî»Â'?Ñ„ lžIY_’ö³páBác¹zõ*=ùä“HMš4¡É“'Óo¿ýFyyyÂûrvV(÷ÌO‘á X1Ã3ÐfIrß}÷¹¢K¢¸¸˜®_¿®[û Qt/“>òþIÚÏøñãuÓµk×tk[- ”õ’ÌO‘· ‚$×|PP^{í5㸱Æ¢¢¢œß¨iii8vì˜ü²^6t*A… Z²‹ëƒ   ̘1C~9ž1f€á«ð6`™5`À4jÔÈ(^ Â$̇ C4JÝI?¤¤¤àüy”"ðŒ35kÖ”_ö›A¯q–ˆ°ÒkC† 1ˆã àvQ®NÝí`™§ç*À¨dg¦0·AR…†1†ÁƒÈŽ1P˜€ºÍHâ‰:­ø›€¡C‡Ê/ubŒU3‚OÛÀ 釶mÛ*-Í|YYYØ·oŸü²Þ3Òª}=Nz;z÷î-O{àvƒØñ(¼ÉX®8p Q|†íÛ·Ë«ئs·V3þСCòÊ>>ÐÐPÜzë­òËÍŒàÅÓð&Ð@úAá$œÏCaù}€ô¯¼@iª."¶mzûïC“&òBÍð‹Ýg¯p–ê´u¥×6lh7ÆAaù­û9ñ<}‰Nøðy(¼mò ô  &dùÜüÍäåå!11Q~ÙS;r‹ðV4nÜX~É\xV•$Ê•+‡ªU«Å‹!ؽ{7òòl’æzj&ZýäïÝ»7oÞôP×Þ…@4c¬¼¼xÞâ¬v¾4”Ó.³PXv'¢‹ê¾äŒ>   ;wîôP×Þ;5}Þ½ÅdI?(ýú4<ùþ_"Ê rÄO#33S~)Ÿˆlj²ù¼ÒPʇﳰSÄÓ;qVýù›¸~Ýæe‹Mú"¼ÖÈÊaû4öï߯ô äéhÕߎ;PPà?EuìÍtD&xRlÜ¸Ñ V<…_ÛóDtÒÓlH?ܼyIIIöîõ9(ØÛ?Fðáix… "O¶YŠÕ«WÄç¡GwA¼â°Õ9d‰(..V²·uFðâix…°`…ôÃï¿ÿn/—»ÏAÇ îÂ/ãpùòeùåJ÷ú¼É¬PúЙ““ƒ¡C‡"7W¯“°Þääd%ãó °uëÖ’ÌA>‹S§Ná_þ›ˆl²²ø"¼¦:0]gŒ-0ºäÚŽ;0xð`¼ð ˆ‹‹ZyÇ[ ¿”^ÍØX­ù322°k×.4kæ{çbJN^N:Ui¥¹ÐžŒ€W•³œÁNPÏh^ Ä*"2,!cìÈ"3ý ¿èOD~ñ Ä›@D—ÁëÃùÅ+;0úÁÛèþÄßFøËä¼Ì0²×‚~‚ « æa)€Bƒy0' ""¿J†àuˆ(@³ÀkÙûƒGÞ^ýÇÐÍ'"Z  ›IÄM{LOD' æÇãðª={`Œ¨/Ú´Ô,g󽌱(ð*M¾Š\—¨,LQ&€ &ôW>˜0aÂ30€ ~ Ó˜0áÇ0€ ~ Ó˜0áÇ0€ ~ Ó˜0áÇ0€ ~ Ó˜0áÇ0€ ~Œÿ·nmœô–ÿIEND®B`‚angband-3.5.1/lib/xtra/icon/att-16.png0000644000175000017500000000115412456456606016637 0ustar chriscchrisc‰PNG  IHDRóÿasBIT|dˆ pHYsooñ¢ÜCtEXtSoftwarewww.inkscape.org›î<éIDAT8}Ó=HÔqðÏY(YàKGÆ‘4u\BÒ`öF¤‹CM¡CàÐàP£'mÑ ÜØ VCMYç$XVZAMWhW¡þZþw¾ô…<ßïó…çå'„ „ ¶¶v:î,æÿ{ñx|/v„TˆÏç¿&‰ÝÝÝ÷b±X¥-ÐÖÖv©©©é9Va{‘!„ŽŽŽl&“¹•L&Ó---Oš››ëöLOOçæçç§Z[[¯f2™3CCC·s¹ÜßbaÙkoo¿;88¸2;;»" …0::ú'›Í†žžž§¨.ê7ôööŽ…-033³’N§»Jõ¥ýÅb±]sss‡Ö&&&V …X\\4<<¼–Íf—ªªª•Õ„J Fp—kjj~¥R©sñx<±°°ðfjjjƒHâX¡|8…oÅõà8^àú0‚J¼Ãõ 3ÀcôGñ |Áiô#àfÄe0^f­ó'RQü ŽFù}Œ­7؉ö¡1ŠDÜY|G u(àÊf-,ãB$\Ætá3>á"žá¶mf0ŽITG…ð'ñq ;Kï Ô Kx‰ó¨YÇÕoö±Êâ!Ö°‚Yü@}›”RÉAÕ£¿ñ>„°¸Aá€ï‹*®Ù–IEND®B`‚angband-3.5.1/lib/xtra/icon/angband-sdl.desktop0000644000175000017500000000036212456456606020662 0ustar chriscchrisc[Desktop Entry] Name=Angband (SDL) Type=Application Comment=A roguelike dungeon exploration game based on the books of J.R.R.Tolkien Exec=angband -msdl TryExec=angband Icon=/usr/share/angband/xtra/icon/att-32.png Categories=Game;RolePlaying; angband-3.5.1/lib/xtra/icon/Makefile0000644000175000017500000000026412456456606016556 0ustar chriscchriscMKPATH=../../../mk/ include $(MKPATH)buildsys.mk DATA = att-16.png att-32.png att-128.png att-256.png att-512.png \ angband-x11.desktop angband-sdl.desktop PACKAGE = xtra/icon angband-3.5.1/lib/xtra/icon/att-128.png0000644000175000017500000002004112456456606016717 0ustar chriscchrisc‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<žIDATxœíyxUåñÇ?/!„@Á„P‘}Q bUdÇ¢V,?-‚(R±¸TQ+m…V”½`©–VDÙT@AVÙ„P b€$,’Iîüþxω'7÷ž{î’{ƒò}žyÉ9óÎÌ;çœw™™W‰ðËE•H p‘Åø…ã‚üÂPJÅ)¥šF¢í (‹H½¦{•RS”R1’ሜœ4þ}X£”j!9"¥T¢Rê^¥Tl$刔üÓòsG`‹Rê†Év(¥º[ƒ")KD@D¶_[~UøD)õT$ä '”R#À¥Æ¯vFPœˆÎf¤¤¤0pà@€(`¼Rj¾R*>‚rU”RñJ©ÿ¯U_#""(ˆHD¨ ²~ýzùÇ?þ!ÑÑѰ h)Ù*@×4à@bbb¤J•*¦ž##.[„ 3!C†ˆˆÈÚµk¥~ýú¦qNC¨H)Ho3t‘† ʤI“LýÎu#._„ÓÅ|*öîÝ+""GŽ‘nݺ™F`Ð-Ò† @·(`¼©Ç¯ýkÉÎΖ¡C‡šzÍ´Œ†œ$FX€e€Üzë­b¢¤¤D¦L™"_|±Õ)‘6˜C:MÙG-ÅÅÅ’——' ¦>="-§éÀeà* U«V‰Ç—aÆITT”i´B`P'Ò†ó¢K}ôÔÎH­ZµdÁ‚¥ú<óÌ3¦û€*‘–×t€àûHºÐ+ƒÒ¦M)))wlß¾Ýý³Pl6^±©Ûˆm›€Àe@lä¯<䢔’ûî»O²²²Ju8pà€T¯^Ý”ÿŽHw¼ÕBem#$D¢i¼™3g–sóæÍ“«¯¾Úêæ`êU †…_££G ÝÜï³ÒIààYàz ºC¹ëƒïL^;v” 6”“ý®»î2Ûú"Òîî-†øè!AþHRR’äååyu‘£GÊܹså–[n±vâàWÀT£CËutTT”$%%ÉUW]% 4°N;Ýé ðШê&g¬!ë׿«K/½TfÏž-.—«œ¼ëÖ­3ùº€Ž‘îtwøøøxSÈ W‰26l˜­X±`ÁëÀª”¤wïÞò—¿üE6nÜ(ÙÙÙå>/.—KŽ;&[·n•7ß|Sî¼óN¹ôÒKÝy1>5 ‡8`ýû•W^)Ï=÷œœ:uÊ£|.—K:uêd^ÿN$;Û‹Ý™ ÈØ±c¥ÿþÖ'àšÓÏ|ª¦Nê³ó?øàIMM-팘˜8p ¬ZµJŠ‹‹}Þï ;vìQ£FÉ%—\bu„"óç† ÊŒ3äðáÃ>y½óÎ;Öl#ìxÑ|ꊋ‹å¶Ûn3>Jfæ§ jÕªòé§Ÿz4êÎ;妛n*íœK.¹DÆ/999>;Äœ;wNþ÷¿ÿ•€V¯^]þö·¿9r°ƒJbb¢yïËf[:!Ð[²Ò§O)((öíÛ[¿«5# Ô¿¹è¢‹$==½ŒQß~ûm©V­šR­Z5ùÃþàõõJ,Z´Hš7o^êݺu“£Gz½>//Ï:`ýˆ“JÐáîp- ÉÉÉ¥ÂgeeIrr²)üG„yΊžV­¤iÓ¦rìØ1)..–‘#G–v@¯^½dÿþýº.t(**’I“&•Ž—’““eýúõå®+))‘>}ú˜²zÒ³2@Áô@0Ëœ¢VfäååIëÖ­Mm•JбNÉ4v Ï?ÿÜ£’}ûö-]ËǬxÔiŸ9sÆîˆ ÒÓÓÍ]KW$ÆK’ÕàÿÂØ»ö„C‡I­ZµL'x¬B…‚hsðÆoøÓÅ AƒJ§ÎR :× Y~ W]u•W§Nj*˜OgwžOO¿ Ë[@€R :ØY~F`ÆÁƒ=*èr¹ä†n0ü¸Â„‚¿òøãûו]»v5ís¯T‚öE¥aá"rX°dÉ.`°hƒï®çéÂÚµkÓ¬Y3êÖ­KÍš5Ë‘Ëå"//¯=z”ŒŒ NŸ>íM†Là4Æ@Õ. ¿ˆ|äAßàOÀï1E£££¹ñÆéׯ©©©4l؆ Gqq1YYY|ÿý÷dff²bÅ .\ȱcǬl?C/Ðù—mìå•ô~víÚe]õ;¬íùßbóÚ7(hïáÕÙÚ0ä?€åèWd‰~¾¨½Mþ!z]âÿ€f–¶ïDGQÛñ8…e,`Èû;t¸Ò¾}{™5k–?~ÜÙwÈ@QQ‘,_¾\ $J)³½bàï@mÇö÷Ò)7R§NGߨûï¿ß`©Ÿ_Øë 3>ñK)¨ŽžÑ 0:n$:æ<ð:)õmôVóŸÑqˆ#ŒÎé‡ÎævÐNSt¡;Ù¿.6dZhþ>11QfΜ’À–M›6IçέmÄa¢Ý ä sçÎõ)Àþýû­ûàŽò £¤;èüÉD Á)uÑ©^v:| ¬ÆÄ>ñÄòã?:ë]‡p¹\òöÛo[·îspd§Øó€Ü|óÍŽxôÑG͆WûjÔà?LJъáNxEšŒ7Æq_Î-ï¼óŽ#{ŠŒŒ III1ÛÌn±•ÝF©F@‰RJ8à³á¬¬,‰5¶Í|ºû0Ö)_<*¡SÊÎzÓ)>>^–/_FVV–´jÕÊlû6‰>¾”úçŸÞQÃO=õ”Ùèf¼,ZqXré¼ÐÝvrùCè•[OÉÇèÑòZ`:¯ïR/÷ÝlüÝn·iëOú\|ñÅòå—_úÙÁáäɓҥKS†\ ¾G™½)c(t' 5ò˜µëŽÜÜ\kÌ€GCa)šà…þk'“SB”~€%£Ç  “K,÷Æ'¼\ÿ¾M›Õ1âLRJÉ’%KîÈ`››k­¸²<¾ŒX ½&àøõõÜsÏ™ ~í_k’\l'“/šÿÅm)ÙíÄ(–a¼1¼]÷öï¶^é-í•+WZk=]N^÷_”»@ϯ巿ý­£sss­ùe À&TR*z=àœŸïîÕ òvm’za§Ö­[ËÙ³gï½a̘1Öñ@KñÓZN€ÈÍÍuÔàˆ#Ì?³ð¹Î‡ñ§ù’ÅFÆXŒ¶ÐëÕË<9ˆY‚wOk‹ŠŠŠ¤C‡?±N ¼‰':j033Óº.ÐÙàñO£Ÿ!ÀZEÀåø^Œt‘ˆéè —÷°±ÛÐx²(ŒÍ¬¡C‡×k!ƲeËLJ°®hŠ3#? öñ‚î°¬.j¢ç¤!}ú:ØÏ(ÎoÝp+7$ïûé7ø§/èBûöí ¸³* –Ðõ™â§ÔAo€xMÙvÇ®]»Ì5jðœQ]PŸ]†íc¾Ç®>xD£“_tþ)|,£CêäÎ;ï ¼—*ÿùÏL]Î Ä©ˆVn2 ½{÷vÜà­·Þj6˜ccØENep“Çn:y‡Q¹èíg'Ÿ¯Ó?ƒOóÚÍ›7Ð=ââbiܸ±©Ï“⧤.¥”ãÁ͆ œèƒÇC ÓÙ+3Feê³DüqÑJ.ä‘GqÜ [y7w:„.iþÿïC†«1>G¨Ðé“ïÆóàkú7B;ø;|ø°Lž<Ùc ‚@a æÑþêFÐÁšÇŽsÔàòåËíŒzô&‰¥*è6í×Ä>v`”?úXøvñÑù;|ܯÐË­e CƒÂÂÂÒâRñññ²}ûöð=}ú´ÄÄÄüôöÿµ W^yÅq£mÚ´ñjÜvíÚɶmÛdòäÉæï¾ÇË` ½§ï×:ÌYDŒ´s_Ó¿Ö€T©RÅñƒá ÷Üs€.›HJJŠdgg‡„÷õ×_oêõB Æzúõë˹sç58cÆŒrF­^½ºüùÏ.-¶TXXh­ÊuŸ‡vð¾>/±Šˆ^½³[:îæãþÛiÒ¤I€]R¯¾új™N7s»té’•Å'Ÿ|ÒÔë@ŒU ];OæÌ™ã³±ììl¹ì²ËÊô†nð87n\é+·ÝD¼ì´ñÓX"à²òè´8o¼Lÿ]Ê&X|ðÁR¥J•2¯}ëçÀ,­ Æoêöq {¶mÛzmäøñã2f̘Ҋ^€\wÝu²bÅ Û{jÔ¨áñ‰6?=^h\ zXxw²áý?÷¿e+ž‚íÛ·K||¼(¥dáÂ…eþf-Ü5a„ Ú™={¶©ÛÖ@ VcÃýžÀwß}'£G¶n K§N|&š˜xüñÇÍû>³´çëÝ)=,üíf¶Ó?ãþ·y衇üë ²³³K#y¼¯6oÞ,±±±%K—. ¸­%K–˜ºec´é€ôèÑC>,K—.•Þ½{[·¥]»vòÑGù%ÜÁƒ­éU¶ôá—ª‡ÁÿeÞ Ü??þñ~w†‰_|QéׯŸíu3gÎ_o__øòË/MÝŠÌËÁDàÿ–-[FRRRé/•RÜtÓM >œ¾}û:fVRRÂW_}ÅîÝ»IIIaß¾}£Ñ,»SF D$;0@)¥Ð Kž°CD9`SPPP¨¤¥¥°víZöïßOãÆË]SRRÂܹsË\,rò´Ä¡7=þ‰%¸#!!AFŒá×hAAÌž=[  µk×ö8¸3Úœëáo&íñW7}n²áýšCdРA<¥>|¸€ÞtóTýÔÜf÷öw§˜?¾©ß^§Fj GïrÆj¤V­ZÉ´iÓ$??ß±»ví’áÇ{êôcèê9èdŒköí6}²è`£Û|ÞÝò H÷îÝî½Vß½{÷ÒO5gÀœJ×­[W¾ûî» Úyë­·LýÖùRìzŒ"’VJII‘ßÿþ÷²víZ¿v¹\r÷Ýw»y/zŠ×/ 9èý{»1@ O÷ù"t¿·¢qbð :(Xœ8q¢4ñt̘1"¢3±cbb$::Úk/ð /˜:.ô¥Ø,ÐûÛ]»v•×^{MvîÜpÃEEEÖcS [pòlÊaCWùâág4ºˆ³7žŽw) ‹[‡"ÓgÏž=rÑE èâæÙ´iÓ‚æ-"2xð`SÇ)¾ëºDk¨–8~øa³q—Ó'×|ÅÚÐ#Nø¸ñ´ù ~ì+ ƒK­[·†ÄNŸ|ò‰µà”Œ1"$|EÄš8ò€å¾dܸqŽ˜çææÚ÷îÝk*:*¤d|ì:ë8~„”¡ãöŠ}ðüC^U™æ}ýë_ÙÉ Þxã IHH>}úu†ûöí³êØÈ‰‚w>”¡°°Ð+ããÇË3Ï<#5jÔèèhY·n×ko¿ývS€-¾Ú7d¨‚±ÛfCsð©¼éƒIwÀ/ Ö^z_=è–ðaÊ”)¦¬"‚ãGaÄÝyª×›——'ãÆ+7¢·‹Ú´i“õÚË}É`Èñ‚ƒNóz:xt³ÃÎôlÇcº;: yÆžˆ•âââl”HcÀ€¦¬“ʼnˆVøQ@RSSËd}òÉ'Ò°aC«¾FŸ÷[¢”²0ZE¥”£7l¼•N±Ž+Þ@§†G¡Gù¿CŸKèñ$1Th¼1nCψîC§”ÛC÷Ö[o…¼ãB·UÖ~â‡ÄšJ¿÷Þ{RTT$Æ ³&؇®YcVyûï¿ß«0K—.5ï-.r(Çüè<_)a&ÙE+D—_~yȾ١„%_#cÊíÈDÿYÐÕº,Áž.㉈s»¶èHŸC‡yÈr¦ÎLoíºñ­‚®ÀªÎZ‡.Ra[˜ÊOr³º áDnn®u§µt€ëÔq{ZN=m®ÿ'Ÿ|Ò«PsæÌ1yãp®#ôC:j!Ʊ±è8Ã@EÜi%FL›6m"z¬;žþySÆL, \Ž@´¡&ðÓkóz×ö¤fÍšròäIBI£FLÁ¶á°zô½!ÀNÊG—„qOŒÛ2·t¸ØãóÊ)a0رc‡u®L¥w }Î`;×*t²¥¼úê«^…›8q¢Õ/ø!K5à%Tæà§Wó,¼äÉ<[{üèøC† n|^Oé*§………rå•WZ²jed‡„Œ§B’’’¼›ÊÏÏ—:uêX;©ŸmÔC—³ææ»Ð1„¢g&ŽŽnCïvÞ…ÎÎsëð3è<ÄYèå_ahèeæM gN¾ÎB®H<òÈ#ÖOv¹ùŠv€ht”o¹£Õ¬;v¬ÕÈç€ÁA´YÓxS]VÕx‹Å£Šñ£X:Sè ÷Þ{¯Óþ ),X`µ«ÇȦ uцx´´4¯ƒ¢üü|ë‘4&MÇá1î••€A¦>ƒöxSEáÝwßµfhÏó*c(öØ€~"OòþûïÛ ýòË/»;Á qEËXÁú?oêÓ»wo9}ú´­ B &X×h>ÇæøßpáU@~õ«_Ù ^RRb-d`Ò t=ÝjžxŸ„^I-äšk®±=s8ËèÑ£­¶{ß×[4\èºò¨/¼òÊ+ÞFÜYÀSvÞ\ò]¨½RzÚµkËĉCúIX¹r¥´lÙÒýê3W"\ì Î"YÝŽ^õD'Щê7ã0b'yë¿f N^ ß°ÌT®¸â ÇáòÞðí·ßZwW½áø€Ïp9Àu ãÙ|­Ž™9qé:~p(:x%ˆ @¾ªèÑ—ÐÓ7÷bÓ¹«†!°E,ºRx¡É?%%EF%6lpÔé™™™òúë¯Ë5×\cýÖ zuÓÑîªIåÊÅW”RUÑ 65/^L¯^½<^7uêT†ls.ôRñwíGWçN@×õ½Ø º–ë wíðˆˆL V8J©àoè’t¥g7%''Ó¼ys’““INN&11‘ü‘~ø¬¬,<ÈÎ;që·oЖû-HE=õ< 4ŒŒŒ2½sçNéÕ«—?O~$hqd‹^cx ]LÚŸ2÷ûЕÎý.Ñö7€Rª:^ 566–îÝ»S»vm6nÜHzzºyÙYôS<‚.óZ™ÐO<™Ã ”RõÑㄆhǨ>+èú­–eÐW"²%$†ë `8ÚeèZ½îÞ|]Ö5ÍrmúTórQ7¤ùá´W8(loF*V/ôÒj-ô7z‰ˆüèåúê訞ÇÐe`Ãt€ËÑ¥ð]¡ÂvJ©4ô‰}ѧlù¸Š ô Ú|`¥èC±~–8¯À ¥T] 'Ð]#8ýšV~²:†›\‡ž¢ýZDV…PÔJóÖL(¥’Ñûò%è)Ýe訡XtÌ€• ÃeGDä¬Áç#tËc"2)¼ZDÁ¤‡W˜‡4ï‘“è§mðÙ€v€Îè)ë/î‡GŸ0À¿óòÊc½ñï5Aò9¯ðsr€o‚ä³ ½Šx¹Rê’ y7ø98€yL{PoÉã''ê”DçÎk0Ö®0þì'~ú üb Ò•RW ²­^7)=ª¯^IÜ‚æ6 ‹>ߢ”Ú.ÝÌø·!𼈼‚v* *ý4P)5âã²3èè_«ƒl±[À1¬¾ݹ&]‰Þ!ô†bt@ÊÇ Trœ° ¸úå—_&11‘ŒŒŒRÚ·oçÎóvë3"òªž”R߈H¼§¿×¯_ŸfÍš‘––F³fÍhÖ¬C† !;;tÝ¢õžî;Q©@)‹ŽÍ:tèÉÉÉeþîr¹8pà@§X½z5;vìØ&"­½ð Lާÿþ¥œ––Fjj*ññåý¢OŸ>,^¼ôq¶?ŸÏ@¤w£|ì^ º0µSŒ9Òܹ{Ó†oKÐikN³x-…•þi»„’*û, @ÇŽß°fÍšÒm.Û œÈËËcëÖ­ÎéСŒL?TØ,À˜¢µÆÞD×ÈF‡gí‘ÓØøåùùù|ýõ׿½:€ˆˆRê  ïêÕ«i×®oA~r€4¥T-9åë¥T ôìáƒй+D$ßg£á@E¼VÐ;k»ñXQ,AGýx­Å‹‘¨éô¤2Ëé$ß:ñ)@~ó›ß8â-"Ö²÷CŸ:Ú]<ú{ý еƒ7–BþPJ½€.&Q%&&†®]»’””Dnn.999üðÃ>|Ø4TOà-¥ÔVô4îCt¸“(¥€T¥íÛ·wÔöêÕ«Íí^ÿe®±|2|¢C‡3 ¦÷Ö€žMäääP³fÍ`År„ŒŒ ž~úi3¬m·ˆìKÃV„b5 wWæè”ÐÍAêðme/®9oWE'XöGŸ®q <ýÄr‚{€.‚îQìit\Ä-¡@Ó UJÕ"¼I'§˜ÿ—ƒQÆ&të¼¾‘/"Åal¯*uTðT<*{PèT0.8À/àŽ ð Çÿ·ÈB’²¬tIEND®B`‚angband-3.5.1/lib/xtra/icon/att-32.png0000644000175000017500000000235512456456606016641 0ustar chriscchrisc‰PNG  IHDR szzôsBIT|dˆ pHYsÝÝpS¢tEXtSoftwarewww.inkscape.org›î<jIDATX…Å–_L[uÇ??Z: ü,¶ÐöK$s”¶PjÄ(/.$>nìÁ°ÄMˆ·ddqú°d#“M|q1.…¬‰¦]xÀ¨a œ(ŽX• j)=>Üîîî––©ñ$¿ôwÏ÷üùÞßïœÓ«D„ÿS œ”J©²ÊÊÊI¥TÓ¿™L)åQJÝ™“€ˆ,WTTdÂáð˜Ïç{^)åh·Åä;kkk¯ú|¾#ödŽËív·uww_\®¯¯¿„²Ùn¶å÷ûû#‘H¼¡¡a¨» ßÌÙ0Œ/ãñ¸LOOKSSÓµššš£@•%x)ÐÜ ¸’׃Á‹ËbFì›Íx½ÞG:´$"’N§exx8µcÇŽ¸Ïç;ߨØx5þÔ××÷[OOÏÏ­­­sápxjûöíÏ÷†qnÏž=óSSS""ÒÙÙÂ[" "øýþwΞ=›\[[“ÞÞ^éêê’ññqq’t:-CCCÉ]»v¥Ž;ö·~ttt- ½ëxEyÜ¡§®®îr$YÅbމäĉrøða™™™‘`0ø-Pz[D„P(ôÞÈÈH:ïìZN:• ƒ×7+à|N :^Ûjò innþ(Ì?g—••í;pà@ÍíöWWW•Ëåz8«AŽ·W^¯÷d HuttH,“d2™ó­‰„ I{{{& ÆËËË[³åP²ÉRê%à)ý˜ª¬¬«®®®+))ñÃ0<™L†ÙÙÙÔüü|fuuumeee}aa¡$‘HÜ¡}‹Hÿ–N8ˆ^“ÀNîüÀnÌaä lø+Ú? 8žB¶ä­Àºv>xlÊ€N Ø¸Zà Э ßè8Ó€7_—µS¨wÀ®YNH€Ï€~½Ÿ²Ø¶XlžÌI¸×âÐo/JàŒÆ€ýÀ˜ÖmœÚ€ÍoNë_·@Ÿ6žŠmØýÜcÑW¿ZˆwØüÞÖú ùøXŸ±éw[Þð ¿/4¶l³a¯jìŠÝï¦A¤”*"úq†›åi̘+ÀkÜ*.ýû‰ˆüiÚõï¸ÝÉ> À£÷ßYˆ)àqýø¹ˆ¬Ûˆ»0;༠+ì+€søÑ²ÿò/¶é½Û³õN0 µø½ÅÓá.0ïë´EW,iý§6û n´dÒ†µq£nöç5ˆ€KÚa6K! p¨¾·èÓ˜mùð"Òú·²N\oX¶Yô~`Ö‚m¬ p¸è€mLÒŠ­hÑAE_G‹kÞĬEÌôe¼¯¯*\fKœkŸ±¼Á°×†»²4§eQ®Ä¹x€,$V€ÓX¦_?Дor‘M¾”REÀ3Às€×M_ëâ‹cvA pð PÜ/"“Ží’óˆÌâ{ÝR¹V8òOÀáDê1ûz¯^uÀ*Ôë+ÌI÷‘ˆ,æò'ð_É_¾ñ(Å«óÜIEND®B`‚angband-3.5.1/lib/xtra/icon/att.svg0000644000175000017500000000766712456456606016445 0ustar chriscchrisc angband-3.5.1/lib/xtra/icon/att-512.png0000644000175000017500000012242212456456606016722 0ustar chriscchrisc‰PNG  IHDRôxÔúsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDATxœìg˜UҀߚ†!ç dP$,(AX’"’EQ1¯k@WÑE]ó§ ¸ "‹qUA¢ˆ‹%(f@É df˜™ú~ô 3·ûÞÛéΜ÷y ¦ºOõéÓ}ªO¨UÅ`0 CÁ"%h ƒÁ`0øq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆq ƒÁ`(€À`0 †ˆqò9"RTD$h; ƒÁ.ŒO‘ê"ò°X/"ψÈAÛe0 †p ª´ —‘jÀO@Úq¿ÊîSÕ'ü·Ê`0 aÂŒäOîâÄάûý¸ˆ¼)"E}¶É`0 !ÂŒä3D¤ Ö°ºêR —ªþæ½UƒÁ`f ÿ‘ƒ}çÐX*"­=¶Ç`0 !Ä8ù UÝ5à„*À<¹Ú;‹ ƒÁFŒ?y7Ý4à5yVDR½2È`0 á¬ȇD†õÅqè, Ÿªþî²Iƒ!`D¤>p?PØ ü <¡ªYf ãäSDäg v‡®.TÕ\6É`0„ˆÜ<>îW€þªšã¿U† 1Sù—·ã<î`±ˆœï¦1ƒÁD¤°ˆ¼ŒâÄÎà2àI­2„ãä_ÞJàØRÀ¹Ç-c ƒ¿ˆH`6pƒªÙ T@1@>EU¿¾MàG r²­Ð`0„ù °8Ëzn#†€qò7\8ÇåÀÿDädÎe0ƒÁà"R ˜üˆ5ý·#…†$Ä8ù7î4`¬ˆŒ¼p CÀˆH `pq‡¥ª?ºl’!I0@þç¬ün2kJ ±Ëç5 1 "í°ûç)Ù-dHrŒÏQÕMÀ<;½AƒQ²dÉXNÝøBDÇišÁ`H| TŠóŠ5m`(  `ðšÂºuëX¼x1õêÕ‹å¼éÀh™("¥â¶Î`08FD ‰Èàe H§Z ª¿ºd–! 1@Áà`K4…9sæðÅ_йsçXÏ 𥈴ŒË:ƒÁà)Ìnqátfø¿€c€€ªf£íôFŽIÙ²e™>}:·ß~{¬ÅÔˆÈßD$ÖUȃÁi|trátYÄ–5Ô1É€ "Rø…(Q¿Š/Ά (S¦ ãÇçÆodÿþý±7 ¸ZU·Çk¯Á`ø¹xˆi¡Nf¨jw—ÎeHRÌ@!²ð½h:ûöíãÕW_=òï«®ºŠ¥K—Ò¸qÌ‹ýϾ‘1j0Ž™ïø÷:0ÃÿÌ@"Éoa4ÚµkóÓO?‘’ò§oxàÀn¿ývÆŒk‘ÙXI1éF †Ø‘êXq<Úº|êƒ@%UÝãòy I†(@¨ê"`Y4µk×òá‡óéééŒ=š‰'RºtéXŠLæD¦ ƒD¤'ð1tþéééœwÞyNT§šÎ߯(ˆŒ°U‘»Ê%—\—_~É™gžk™"Ò-Ö †‚„ˆ‘çÉ@9§ÇU«Vùóç³mÛ6'êføß  2ˆú–˜;w.ß}÷]®¿«]»6Ÿ}öwÞy'1.ö¯|$"ϘôÂɈH=`pk,ǵiÓ†¥K—rèÐ!–,Yb§¾øÐNÉP00@CU3ÛÉü‘#Gæù»Â… óôÓO3uêT*T¨Kñü øFDΉå@ƒ!?#"—Ëf±wíµ×òÉ'ŸP¹rå1uþuêÔaÁ‚G:€—^zÉ®óxËtþ†£1#”H±ùÑtŠ-Êš5k8餓óÓO?åòË/gãÆñ˜ôp“ªÆu°ÁLDùŒÀʧá˜K.¹„—_~™R¥þL½‘™™IõêÕÙºu«Ýág¨êW1kÈ·˜€Šª~|MçàÁƒ<ú裎ÏyÖYg±bÅ §[‘ާÖhÀ`JØ_‘R"2+‘ãÎÿè­¸Gwþo¿ý¶“Îÿ¦ó7(ÀˆHol¢)R„Õ«WS£F ÇçUUž}öY†êdX27>«êªx6ˆˆ4ÇÚ…S7–ã6lÈĉóŒÈÙ²eK–.]jwš¾ªõY7<Ì@Áf6£™™™ ><¦“ŠwÞy' .Œ'Œ0ÀYXq†ŠHž  †d@DRDäN¬(œ1uþ×^{-K–,Éó9Z´h‘“Î=Ö›Áp Æ(À¨5üó€Þ¸qãX³fMÌçoѢ˗/çŸÿü'EŠÄœ¶¼(ð°$òåd0$"Ò«ãpü”,Y’·Þz‹W^y…bÅŠå©ÃÖ¿l§e 2ûB 6"²hM窫®â?ÿùOÜeüðà 4ˆ… £¦"È‹là5¬œ¿Äm„Áà"R¸J” œ¹Ñ¼ysÞ~ûmêÕ«UoÆ Ô©SÇnšíÖÖ¿±Ø`(¤ÓD¤”­¦!?c; ðæ›o²råʸ hРóçÏgäÈ‘”(Q"ÖÃSAÀj-"Î$ >#"m°âø?HŒÿm·ÝÆÂ… m;€Ç{ÌéÖ?ÓùrE¾ÎWÕ Ûcùˆš¾·_¿~L˜0!á²~ýõWn¼ñF>úè£xO‘ ¼ LàFà'y!ÙÐ` 9ø¸‰;ÿvíÚ±bÅ Ç?ÀðáÃtþŸšÎß`Ç>¬Qv]U#O€ÙGµ…\¥wïÞê&Û¶mÓ+®¸"j™äðJ$P‘‚#ÀÔ<ÚÃéÞ½»zÁž={ôæ›oÖ”””DGŽ–Ÿÿb ÍžtýI~j3âi)))zë­·êž={4~üñGMMMuRV§ ëÉHø¬/¾¼Ñ›@‘ 4âkƒhæäE6iÒ$õŠE‹éYgå¦pXr°òÜ œt]I.JÿöÆÓþ6l¨ .ÔDèׯŸ“²æ]WF’CpàÉ~ ” ÚP#¾6Š÷í^2Õ«W×½{÷ª—Ì;WÛ·oï…#pØX  ]çn Öɲ@% 8fÏ:-‰µ§GÙ|‚Ó¾p ùÌ)Àêøï%ŽÐÎ;ëÏ?ÿwûÎ .¸ÀIÙ“ƒ®C#É%÷ÅØÀs€;ƒ6܈/ãV'mâå—_Ö ˜6mš¶lÙÒ«/+‘+ë°²ÀÝ„µËbŸG6û-›€ÿ`Tt£žü¬)®zXS ÏàˆKÙ²eõµ×^s£iÃ_|áô½Ü4è:5’\"‘—Ò ÄÎ(àV5Y¦ò-"’ |µ3 OÊ•+ÇÊ•+ãê—0K–,aÖ¬Y,[¶ŒeË–%Kàx–W¨êªX‘b@G [D샻'7Š•Zz0X¨á[OQëžœ‹5Ó (ãÆ¹ûöíË /¼@åÊ•Ý8Ý1téÒ…Ù³gÛ©ýWU/q½pC¾§?ñ{½ÿÅÊ&¸'cÄZb} Gm Ô°°uëV>}º>òÈ#Ú¡C7â ì.Tûº*‡5¬? +(QÐ_èAÊ^àC`0î"ÂJÆÓ x…‡ös“ èäÉ“=kËï½÷ž;²AÕ±‘ä€ |ŒÏk´'j;ýßÿþ§adÓ¦M:jÔ(=çœsœQÉM2žzbÝú!èxÃ(™Àà2 øñuè…gc¥ÞéÅ5Õ¯__ß|óM×ùåÆž={´ZµjNìyÝ:5’ÿ ½ „qò±` “n¶k5ÒÌÌL 3Û¶mÓ'žxB+UªO;?tÁš;>ë«òt°É${±bç÷Àƒø @W¬øžØÊ)§èøñãcŽßwÞy§›õÜ®G#C+à ç]à2UÍrá\†!"W`m ŒÊã?Î=÷ÜãƒE‰±ÿ~FÍSO=ŦM›b94 뫲’7–åˆP¹rejÕªE­Zµ¨T©%J” dÉ’'ü]¨P!öíÛÇÞ½{Ù³g{÷î=òóîÝ»Y¿~=ëÖ­ã—_~aÿþý~_Êavb9/¨êÊDN$"ç­Ü0ìxêÖ­Ë<@ÿþýIMMõ¢ˆcøúë¯iÞ¼9YY¶¯Ó—Uu°çò%‚TdKç3N@>FDæb-¢Ê“bÅŠñý÷ßS³fMŸ¬JŒƒòì³ÏòÐCqèС Í |ùò´hÑ‚¦M›R»ví#~­Zµ(Z´¨ëåmݺ•uëÖ‘Ÿ~ú‰åË—óÍ7ß8I9ëеnb0]UÕé"Òk$¦µ†ÕªU‹x€«®ºŠB…Ž±ä ªJ»víX¸p¡êï@}UÝæƒY†|ˆ` ïþîâ9O‘úX‹DÓ;çœs˜={6)))þæK—.åòË/gõêÕ¾–[ªT)š5kFË–-iÑ¢-[¶¤víÚ¾Ú™™™|óÍ7GvW,[¶Ì§à'¬]I¯©êîhŠ"rV\×½¢5jðüƒ«¯¾šÂ… »}ú¨¼úê« 4È‰ê ª:Úk{ ù›læ™  eË–e®Ì¬ ȧ<⤠<ôÐCšlìÝ»Wû÷ïïéxzzºvëÖMŸ{î9ýî»ï|¢”(úùçŸë£>ªíÛ·wš—>ÙƒåÔ×Û`E¬®•W¨P!mÚ´©^{íµúî»ï&·?^¶mÛ¦åË—wbóbòY &#þ‹õ‡MŒ»îºK—-[«0H ú¸Ü`¬µkìîJJŠÎ;W“…ýû÷ëã?kw$ 4Ð;î¸CgΜ©úR]e×®]:iÒ$½á†´V­Z^8ÙXëê«Õþ:` Jè¼µk×Ök¯½VG¥ŸþyhîË5×\ãÄþ,à ÁûÀHr‹õ,‹Öàúõ맪02è 4âA£îNî•*UtóæÍf:¤£GÖ“N:ɵNKD´]»v:jÔ(ýå—_‚¾D_Y¹r¥>÷Üs^älÈ"Áø uëÖÕ{î¹G—.]t5åÊüùóÆûNCð0’übý“¢5¸¶mÛêaâpî ú"xÐp`‚“ûß©S'O÷JÇKNN޾óÎ;zê©§ºÖIÕ¯__‡®k×® úòBÁÏ?ÿ¬=ö˜6nÜØmgÀ±¤¥¥éM7ݤ_~ùeÐÕ•C‡9­§ß€R‚w€‘äëx>Z£«Q£†MŒN@Ð?è 5ârÃÒ8˜ ôá‡Ö01{ölmÑ¢…+L¥J•ô¶ÛnÓ%K–}Y¡æ›o¾Ñ¡C‡jíÚµ}éø‹-ª·Þz«þöÛoA_º#žzê)§×v‰†àù7’?ÄúÃÊwg£+T¨Ð _q1:™@ç /ÖˆËÇŠ§ný.55U?ùä šõë×k¯^½\é`Î9çøàƒN¯í! Á³n$‰õTµk€ï¼óŽæÅG}ËpÞ˜̈È &µÎÉý>|¸úÁÞ½{õoû["É´nݺ:vìX=xð /6T.\¨½{÷vº>W)V¬˜þë_ÿ }^Š9sæ8ÍT¹HÓ<ëFò—XX£Îå>óÌ3W^y%–‡tôÅq±!Y£H™v÷>55UçÍ›§^òÑGiÍš5ãî@*W®¬/¾øbè;üÌòå˵GqßC°â/„5CåæÍ›µråÊN¯¥‹†à7’ÿäÏlVt|¸îÝ»×uÛ ñ±xñbíÒ¥KÜ÷4%%E‡*g.;;[;uêäô&hžm#ùSþüfDkˆ­ZµR' 80–ôoAW€“5’ä(Dk5\«]»v­žyæ™quiiizÇwèöíÛ]³Çà.ÿûßÿô¬³ÎŠÛhÙ²¥®^½:èËPUÕ‡zÈ©Ýk2‚gÛHþ”?€Ç£5ÆbÅŠ9ZÀuèÐ!íÖ­›Óžœt%q±AA9àW'÷¿^½zºiÓ&M”÷ß_Ë”)WÇpÙe—%Õ¢±‚ÎÌ™3µ~ýúqÝë%JèØ±cµîܹNçý3V‚gÚHþ•?€~vò‡~P'ìÙ³G›5kæôÁÜÔº"Œ¸Ø¨  pÈÉýoÔ¨QÜ_ÞzË-·ÄÕÔ®][§OŸW¹†`ÉÈÈÐÇ{L‹+×½¿øâ‹uçξ۽eË­R¥ŠS;Íè¨ÏåÏà4»FùöÛo«S6mÚKr¥@Ñ +È‹ îqúBnÞ¼¹îÚµKcaÍš5qm+T¨Þu×]ºoß¾˜Ê3„_~ù%îÀNÕ«W÷u`vv¶ž{î¹N훢!x†äùóHöGk˜÷Þ{¯ÆÂ?þËÐ츠+È‹ ËZð¾ÓrÛ¶mwÊ .ÔråÊÅüÒoÙ²eècÂbgÚ´iZ§N¸œÁ—_~Ù‡îÔ®_1Û¤ø$Çþ>Ö8»u릱òÑG9óRঠ+Ĉ‹ Ò€ÙN_Èçž{®ížû)S¦hzzzL/úôôt}î¹çB™”ÈàÐ|P .³#p÷ÝwkNNŽg¶Í›7Ïi<ŠC@ Á³k¤`ȱÿ€ÑÑhÕªU5{ì1§c&Ð.èJ1âbƒâXqµž={æ_̘11ö9í´Óô믿Îõ|†üDzeËâZ$اOÝ¿¿ëö¬^½:–ýþwkžY#GŽý ±k¤ñ†CíÓ§Ó‡`pRÐcÄÅFfe\æôeܯ_¿¾ÖcØ:uDú÷ï¯{öìQCÁbïÞ½:hР˜ÛK«V­tóæÍ®ÙñË/¿h5œ–ÿ ‚çÕHÁ‘cÿa­ÞŽÚPgΜ©ñ°gÏmÔ¨‘Ó‡a>tåq±¡Aà»Xœ€ƒjVV–<8¦yzzºos»†ðòÞ{ïżV¤V­ZúÝwß%\ö¦M›ô”SNqZî ‚†à95R°äØ@ 'Zc}òÉ'5^V¯^Ë¢À¡AWŽ—œ„MÄÉ£¥uëÖÚ½{÷˜^àfÈßp46lpšm.]:¡pÕ;vìÐÆ;-/ h¯!x><9ñ?`U´{ùå—k"İ(0htq¹ÁA-`},/d§rñÅ›!à dggëÃ?S‚¡âÅ‹ëüùóc.k×®]±fŸ¼_Cð\)˜’‰¬ÈåÿŽðÕW_Eûµ-Ý»wgøðáNT oˆHzBB…ª®Î¶ºyÞ;‰'R¢D 7OkȤ¤¤ðàƒ2aŠ-êè˜}ûöqþùçóÅ_8.gÿþýôèу¥K—:=d:ð˜ã ·9Þ#î'ŠÇšššªÐDÈÉÉÑÞ½{;õGí%q_€¦ÀïÛ@ž""¶™* †Ã,X°@+V¬è¸}•)SF—/_n{ÞŒŒŒX“-ŠkžE#Wrˆú‰ŸÍ·ß~MÅaܸqÔ©SljúÍ"Ò%¡ ¡CUWݽñž£H‘"L˜0¿ýíoîfÈ×´iӆŋS¿~}Gúüñ]ºt‰úÎËÊÊâÒK/eÖ¬YNÍXœ§ªûœ`0xAÌSø4@É’%yýõ×IMMµSà5)—p¡†P¡ª‹ÀîX-]º43gÎäÒK/uß0C¾¦N:,Z´ˆ³Ï>Û‘þöíÛ9÷ÜsY¹rå ¿ËÉÉáꫯæƒ>pZüw@WUÝåôƒÁ+NpTu°#ÚA+VØúŽhÓ¦ C‡u¢zV"C>CU?ÅÚ~ºÅé1•+Wæ³Ï>sü7ާlٲ̚5‹~ýú9Òß²e :ubýúõGþOU¹á†xóÍ7ûÐYU·Çl°ÁเÍ4€#‡6l-Z´p¢ÚWD¸V°!Ld`E ´¥téÒ̘1ƒÆ{l’!¿S¸paÞxã .¾øbGú¿ýö}ûö%33“½{÷rÑEñòË/;-n=p®ªnŠ×^ƒÁmDUOüO‘g€<'VK•*Åüˆ¸bÄÊ•+iÖ¬û÷ï·SÝ 4Uk%¹! "E€E@3;Ý¢E‹2sæL:tèà½a†CVV_|±ãaüþýû³bÅ ¾ùæ§ElÁÚë¿:^ /ˆk`÷îݬ]»Ö5#êׯÏSO=åDµ0^Dò²Û|<…ƒÎ?55•‰'šÎßà:… âwÞ¡GŽôßxãX:ÿX_þ¦ó7„ޏpw`È!tïÞ݉j{ànW 7‚ˆ\Üê@W^y…ž={ú`•¡ R¸paÞ}÷]ºvíêæiwc-øKlÛ”Áày9?`ÍËæ‰[ fìØ±T¨PÁ‰ê?Eä × 0ø†ˆÔ^s¢ûä“OrõÕW{k¡À“––Æ|@§NÜ8Ý~ ‡ª:Ž d0øM®€ªfßG;ð³Ï>sݘ*Uª0fÌ'ª‡£: ëe"R˜”µÓ4hÿûß½7Ê`ÀZg2iÒ$Çqòà ÐKUç»d–Áà ÑæÒ¿Œvà‚ 8pà€ËæÀE]ÄÀ¨6žp݃܇µõ/*5bĈ>˜c0üIÉ’%yÿý÷ã +½8GUg»l–Áà:Ñ€yÑÌÈÈ`Á‚îZáù矧víÚNTo‘Ξað„ÈÐÿ½vzéééLœ8‘ôt“ Âà? 6äÕW_õ°/–ªºÈ“ ׉æ|lwðœ9s\4åObŒ8ÎD L*žl{õ#FШQ#Ì1rç’K.áŽ;îpª¾h§ªëm5 †§ ª±æÉÇÛúqÓ¶m[î¹ç'ª'ÿö̃kˆHÀ6ôZ¿~ý4h ÑyòÉ'n=­´ô؃ÁUr tä—"#›óú}JJ Û·o§lYÛµ\qqèÐ!Z·nÍòå˨_¥ª¯{bˆ!aÄŠõ96/ɺuë²|ùrJ•*åaƒ [¶l¡Y³flܸÑNõ[àŒÈ"jƒ!ôØÔ‰ú‰Ÿ““Ã'Ÿ|â¢9Çr8T§ÃyàD¤¦gÆ¥?¾F˜lXP IDATe:C¨¨\¹2/½ô’ÕÆÀ-›c0¸†0ÈŽ¦àÕ:€Ã4hЀ'Ÿ|Ò‰j)î+7ø‹ˆþe§wþùçÓ¥‹Éül={öt¨ì!©âµ=ƒDuTõ`Y4/×榛nr¡«£ˆ\æµ=†˜¹ 89šB¡B…xæ™g|2Ç`ˆ#F––f§V ¸ßs †„qS?j¿jÕªcRdzˆðÚk¯Q¾|y'êψˆC "’ Üh§7dÈDƒ¯ žR¯^=î¼óN'ªW‹Hi¯í1%aü¨Zµ*£Gv¤ üÓcs ÎéT‹¦P®\9† æ“9CüÜÿýT¯^ÝN­à(š™Á$N€X¡-óÄ OŸ> 0À‰êÍ"ÒÄk{ ޏÁNaذa”+gB9ÂO±bÅxöÙg¨Þl²–ÂNÔm€G”DæyfȨZµª“-2®°sçNêׯÏöíÛíT`åà¶¿@ƒ'ˆHmà'¢8š•+Wfýúõ.\Ø?à †iÙ²%K—Úæù顪Óü°Ç`ˆ§jÔOüM›6ñý÷Qs¹F¹råxâ G)ÚW{kÁ†ë°ic4¿!é¸åG»ýlS] AâŠÞo<šÒ¦m.€'DÄ›(E†¨ˆHaà®»î:Ÿ,2ÜãÒK/¥bÅŠvjEä4?ì1âÁ©° ø#š‚_ëÀê8Få$W@Eà1L2œÈ…@åh ;w¦N:>™c0¸GZZšçU€!>˜c0Ä…#@U³±É8oÞ<²³£Æ r•¦M›rÓM79Q,"-¼¶Çp=í®¿þz?ì0<á†npòr±¶ ñË*Õ¨Ÿø»wïfÉ’% šÇ§JÛ [)ÀKfE®ïœí—U«V¥gO[Á`-Õ«Wç /´S«"" ü°Ç`ˆ×ðw T©R<ýôÓNT[ƒ=6ÇADj5¢éôïߟB… ùd‘Áà C†8á?Ûc3 †¸pì¨ê@Ô½~~.<ÌW\ÁÙgŸíDõ1±]µcpÛü©:幫Ô`H:tè@ñâÅíÔ:úa‹Á+±‹GýÄ_´hHÀœøxñÅl%+ 8Ú?hH˜¨@jjªÓ]C¨)\¸0íÚµ³S;;’Û`®:ÌŸ??sâ£aÆÜ~ûíNT¯‘¶^ÛcˆîœqÆ”,YÒ/[ OéØÑö¿"ÐÈS †˜pÕ€`¦À '[­ZÔó`mËIPcð©DÍêÓ¡ƒí Á48pÀLBHL€ªnVFÓ™2eJBÅKñâÅù¿ÿû?'ªMGa¼ qñW;ãòÍ›7§T)Û¤¶óƒßij5.ê(ÀÊ•+} |<}ûö¥k×®NT‘ª^ÛS@©í—"Bûöíý²Å`ðœÔÔT'mº–¦ 1ð‘Âûï¿ÇiÝaäÈ‘¤¥¥Ù©•žñÁœ‚H…h¿¬^½ºÉügÈw4ib›|´’v ±0ØM!Hà”SNáî»ïv¢z™ˆ˜y9÷‰êTªdÞƒ†ü‡ƒv5,¶Á1;ªšDMqùå—_²nݺxmJ˜¡C‡R»vÔ‘èüIZcp¨@… Qm0$%•+Ûöïé"RÂ[ §Ä×ö?ÈQ€ôôtFŒáDµp§Çæ4¢öð2¨ I‡Ã‘-3üeñ:Ӄтtzôèá4Öüý‘­kwˆÚÃÿý÷,_¾Ü/[ ÏÙ¹s'Ó§Ow¢jÞ3†P— ª{YÑt-ZÄæÍ›ã2Ê-žþyÒÓÓíÔJÃ|0§ u`Ù²e4oÞœN:1cÆ ¿l2\gݺuÜvÛmÔ¨Qƒgžq´¦Ø¬0„ŠD2äEýÄÏÉÉaòäÉ œ>qjÕªÅý÷ßïDu°ˆœêµ=„¢N”æÎK÷îÝiÒ¤ ãÇçСC^Ûe0¸Â²e˸ì²Ë¨W¯#FŒ`ß¾}N-æ¥]C¬ˆªÆw H9` gJ·.]º0sæÌ8Ms‡ÌÌLþò—¿°jÕ*;Õ÷Tµ¯6ågDäÀðX;ù䓹ýöÛ 0€Ž;’’’È •Á?ýôÿùÏ?~<¿þúk"§ºPUƒ “j0äA¢ÀÀ¨h:ãÇçÊ+¯Œ» ·h×® ,°SûLUM˜º‘^À¤DÏS½zu®¼òJ À©§šƒ?ìÙ³‡wÞy‡qãÆñÙgŸ¹qÊ™ªÚÍ n’¨Pø +ÉN®ôêÕ‹I“î fÑ¢ENSÐöRÕ`/$9"Ò˜‡‹sž­[·æê«¯æÒK/ |DÉÿÈÉÉá“O>aܸq¼ÿþûì߿߭SïZ©jÔ*C$äˆÈ Ïž5==mÛ¶Q¼xñ„Êqƒ>}ú8Ùžø#ÐXU³}0)ß!"·OE¼8ZZ^x!  k×®¤¦šÄކøqqˆÿx~ž^VÕ¨‘S :"R(d{T5'`“ n8wOGÓy÷ÝwéÓ§OBå¸ÁªU«hÔ¨YYYvª×«ê?lÊ/ˆHi`,ÐÛ¯2+T¨ÀyçGÏž=éÚµ+%J˜@k†è¨*Ë—/gÊ”)L™2…¯¾úÊí"VOÿUUÛM~%2:Ü "õ±b ”:JJGþ. íÅ+°Ø‹ìV?`}¨­5j‰á†PXMçòË/çÍ7ßL¨·2d/½ô’Ú&àUu¼¿§ #"Íw€:AÙ––FÇŽéÙ³'\pÕªU ÊCÈÈÈÈ`îܹL™2…?üß~ûÍËâ¾z¨ª«Ã aEDNZðggZDJûP|° Ë8ì|¥ª?øPv¾ a@D¾NÏë÷¥J•bÛ¶m)âɨpLlÙ²…zõê±wï^;ÕU5æíl ¹+³bð7÷(š5kvÄhÖ¬YÐæ|fÛ¶mL›6)S¦0kÖ¬Xöê»Áf ›ª®ð³P?‘tà, KDkQ®lÄ T7 ˜£ªÛ¶'´¸å<ü3šÎG}D÷îÝ.Ë ~øazè!;µ=@=UÝê½Eɇˆ^® Ú;ªU«F=8묳hß¾='Ÿ|rÐ&\æÀ,^¼˜ùóç3kÖ,-ZDNN SÉ›6ªº6H#EDhÊŸ~;À6ßzˆPàKþt¨jf°&…·€FÀ·Ñt ÄË/¿œpYn°oß>êÖ­Ë–-[ìT_TÕ›ý°)™‘bÀó‚¶%êÔ©CûöíˆÙb˜|üþûï,X°€ùóç3þ|–.]Æh’«¶Éø*"­k È_!Œ÷〠ò: pÉ‘•@žoÒŠ+²iӦЬÚþ÷¿ÿÍ7Þh§vh¤ª«}0))‘²ÀT¢ìüH6*W®|ÄèСMš41ˆBÆÆtöóçÏç›o¾Á­w—Ç,:&Ãz¢È³Ý¸øKÀæøÁf,GàUºŽ-¿â¦ð/àÞh:óæÍ㬳Îr¥¼DÉÊÊ¢qãÆ¬\i»=÷]U½Ø›ÂNdÁÏL qжxIéÒ¥iÕªM›6="õë×§páÂA›V øí·ßX±b_ý5+V¬`É’%¬Y“ÔïçÀaýÚ‘X~_æòÈg(ð ð20© …kvÓh |MçÖ[oåùçŸw¥<7˜4i½{;ÚµVàCG’%ÍjmK)R„† Ò¤I“#NA“&M¨X1jöcC222øî»ïŽtô‡;ý;vmšŒ®Ö [DöÞ_3ö';€ÿÏ©êú ñ7~ªç¥S½zu·ƒm$LÛ¶mY¸p¡Ú|Uíà‡=a$²Ío:`z»ã¨Zµ*Mš4¡Q£FÔ®]›Zµjù; Á¯‚&;;› 6°nÝ:Ö®]˺uëXµj+V¬`ÕªUNbrä'žPÕ¨£¤^ÉÕq0ko¾ï*TˆÒ¥KSºtiJ•*EéÒ¥)Y²$`×®]ìÚµ‹Ý»w³k×.<„‰`m1 <¦ª¶‹Å’×y¸5šÎâÅ‹iÕª•ke&ÊÂ… iÛ¶­Õ™ÌCDÎ>À ØaˆŠ+R«V­cœ‚Ã׬Y“ôôô MLUeãÆÇtðGÿ½~ýú‚ÖÉÛq»ªú> *"…k€žÉ(Q¢ 4 aÆ4lØFQ·n]Ê”)C©R¥(VÌy„ðÌÌÌ#ÎÀ¯¿þÊ÷ߌlÝêù&­ýÀHàIUÝéua~ã¶pV ø<2d/¾ø¢keºAïÞ½ä+øøKAŠ<%"}7 Ùÿ<ø¸+/EO¬ åµ( )))T¨PòåËS®\9Ê—/UÊ•+G‰%HKK£H‘"XnîqèÐ!2339xð ;wîdÇŽìØ±ã˜Ÿs“íÛ·sàÀWmÉç(p™ªNô£0IÁZØ7 u¥¥¥Ñ®];Î=÷\š6mJÆ ©Q£†ëí3/vìØÁ÷ßÏ·ß~˧Ÿ~Êœ9s¼šBÚ < üŸªîö¢€ pÛHÅŠ¢—çPqùòåÙ¸qc(‚fåÊ•4nÜØÉ—Ê`U Ç^F‘ë±2=†}9|VèÕ©ê‘ñÂH[lt:g’ŽŒ# .L‘"EŽ8‡ÿ>þçììl233ÉÈȈúwH¦¦Ýâ'¬Xü-°Â͆L »ªÎõ²ˆÿO¬}®Ñ¨Q#ºtéB—.]èСCL_ô^“““ÃòåË™5k³gÏfáÂ…dfººíð$0âè÷MÒ¢ª® V§¡ÑdÒ¤I6n¸á†¨6Gd#PL]®³° ð€ƒºƒÌÀ Öä䚊gs°öm¿‘Ä%+üî‹À¥@Õ£îy¬ÕAÛ˜›ìÂQôâù­‰µ`×[‹-ª—\r‰¾öÚkºaÃç/Õ°wï^:uªÞ|óÍZ¾|y7ïßj ½†à}ˆxÑøZÛUÞE]”Ø]õ€M›6iñâÅÜøhnœWÜ‚—£¬ú&x…#mõ`ðG®Ëˆ½dK±†c{åÜë‹­!°ýxY ”tñÙ¬~»Ý°¯iÓ¦:räHݹs§ý 4 ÈÈÈзß~[;uê¤"âÆýËFÅ5ïîxÄ«NdU´Š+R¤ˆnß¾=ÁÛé>Æ srÓw57ÏmúEuÐ/Ƽ$+ï@ ®=8‚µúwVV² ¯¹ K6Ö»ä¿X£RÝ€RqÞßjÀ²\Óñ2Á¥ö[˜›¨=¥J•Ò믿^—,YåM™ü¬Y³Fï»ï>=餓ܸ‡?c{ ü«xÕ‘üîÒ^|ñÅDï¡ëìÙ³G+W®ìä†?­!¸yn Ö<ùÁ¼ó’-@gŸë$8+@Êp` ÖV× ë"?Ênà3¬¡üë±Fg\ý²‡°úZ—ë¸&n&Agõ´ÓNÓ±cÇê¾}ûN|1æc²²²tòäÉÚ¹sçDïað.Žèø!^½8kaó%ÙªU«Ä5ÊÉÍÞTÖÜ@7+}çμó’O“‚®§£ê« VF´[W°:® vmÞŠ5ÕòðÖÊô^X«Óŧ{'ÀÃ!¨‡£åpz×RëÙˆ»ìš5kêk¯½¦YYYZÐùôÓOµmÛ¶‰ÞËuøü¡’ˆxù Ù6Ìü1ñ»æ2‡ÒSO=ÕÉ~FCp¬DkCðÌMr€Ç€Ô ëÉa]¦atÿ&`M'lA}ú!{±ƒMÅÚ?}'Ðh” úu¯.ÁÚãt}–ÕÄðõ\F Y«T©¢#GŽÔŒŒ 5Ë´iÓôŒ3ÎHô~>M¼·\Ýx4"r-Ö×QžÜÿý<òÈ#ž”Ÿï¿ÿ>}úô±S;ÔÖ$Ž ú)РX_í;±îIn² kjd&QúìH„ËÉ@XòC¿£ª—FSˆD\}¸/žÊ–-Ë=÷ÜÃ-·Üªí{aCUy÷Ýwyàœä‹É‹@?UÝå¢i®â¥P ë«'Ïpg5kÖdíÚµ¾ˆ…–-[²téR;µÿSÕ¿ùaÛDöÉOÎÚ–\XˆõàäûXÜÑ‘’üé TÀŠÆX$"iGýœ×¿ c-¤ËŒHÆQ?çõïƒÀvþìÜ×|üJDªb=-ƒ¶%ÂMª:*·_ˆH àu¬i“˜(R¤wÝuwÝu¥K—NÔÆCvv6ãÇç¾ûîcóæÍñœb%ÐSUW¹lš;x9¼€5üu¨ä“O>‰k˜Æk¦Nêd˜g?PEC0”«`-X zØ37y (tý)8‚#âã´}ÅrÀšåbc-àëxÎÙ²eKýöÛoÕ?;vìÐ+®¸"Þ{ú;ÐECÐÖ¯¬îv•3pà@wî´lÙÒÉÍý? ÁŒEç^ÿXžràõc¤à PX‚ç@±"–:ʶöÄÇ --Müq³ÀÏE>øà­R¥J<÷4 +Dàmýhñú¡JÅfñSÉ’%uÿþý.Ýw™6mš“›T£X‹‡Â¶Zý  fÐuc¤` P–8¿²=·#6]‹55Óñ­[·Ö~øA î³cÇíß¿¼÷u,PDCÐÞUÕÛ8ïj;MgÏž=NñÂyçÇ™gži§–šâÓ)"Òx k+TX˜œ¥ª¿mˆ¡`£ª¿cíàX´-À¥"ò_¬…ÔŽsX-Z”§žzŠ pÚi§yg]¦\¹r¼þúëLž<™ªU«Æzø@`vd=Gàx¶ðH"§_FÓéÚµ+3fÌðÔŽxùè£8ÿ|Ûur:ªºÉ“âBDÊaÅL?)h[Žâ-`€ªš|±†Ð "µ°b;„ew€#4hÀ¤I“¨_¿~Ц~ÿýw®¹æ>øàƒX•jŸf9ÆóLoªúVÇ“'sæÌaÓ¦pöGŠþQ€— WçÿÖ6?ÓùB…ª®:cí†H ºwïÎâÅ‹Mçï3eË–åý÷ßçþûïõÐöÀ4 t/¦_©^ÇGûevv6o¾ù¦O¦ÄÎC=äDm°ˆ„©ƒ=B$&Cï í8ŠÇTuˆªæmˆÁªúVî½AÛbÇwÞÉÔ©S)U*Œ™ó?"Â#<„ HOÏs×{nœL Ò ð| Žìµ]µ(0Wš4iŠ+<·%^Z·nÍçŸn§6RUoõçˆH=¬)˜PÌ9w©êÓAa08AD.ÆJ):Š)ÂèÑ£¹ú꫃6ÅaéÒ¥ôêÕ‹ß~û-–Ãæ=Tõ€Gfå‰/#‘¹ñ£é|ýõסvŽ\¦Q)¼I8:ÿà:Óù’ Uý/ð\ÐvO¥J•øä“OLç2Z´hÁ’%KœLÍ9À)ê‘YyâרLŒo«ݺu£U«VvjE¡>˜ã”a@L-Ñ#2±"ûE m0„”»€Aq˜ÓO?%K–ЦM› M1äBÕªUùôÓO¹üòËc9ì\`²ßN€/S‘yŽÍXáLs¥J•*lذÔÔ˜€ˆÔÀŠeôáhU½!`ò‘¨tg%u°:ü4‡§Ø€ˆë¬¶±<²ÇÝ'"Røv×4mÚ”?þ˜òåË{]”Ácrrr8p`,£Ü€æªºÕ+›‚pN¢¾€š7oÎÒ¥K}²(>޼¤ªCü°@Dæü*/¾Z©êÁ€íHJDäT Ð+G}EŠùø˜,ô: “ˆ üQ÷ƒªþLJr‘Ûÿ󲌿üå/Ì;— *Ø+’‚œœ Ào¼áôù@'U=ä‰AAd ÂÊþ5kÒÒ¥KOÈÂ&fÍšå$óSP]ý©Ó Øãµìêûq½ùI€†Àƒ“‰n VGVãkKÇZâǵüÃÇ{– ,ñêZjÕª¥[·nUCþ#++K{öìK{xQ=jÇ~/<Ì8;…ÿûß>˜?;wv²·pŸ×¶ˆHaà)¯ËqÀªº2h#’©!"ÿ‘ï¿`J%àv`ˆ¼!"M]>¢lýu™|*µ2ƃ]Å‹gòäÉT¬èÅà!hRSSyã7hРÓC†ˆÈ5žã•gM€RX1¶óôzŠ/®»vírÕór›Fjª·õy‡;¼–W½¼Æü"ÀXÑ…àžå%“qiDkšÁ›7™Òôù~>åöµ¼óÎ;jÈÿ¬ZµJË”)ã´]ÎT—Ûo #ªºx;šÎ¾}ûB ¬Q€¶mÛÚ©îöÊ)<àÕùòpKÀ6„é*"³åÀå@¡€MŠFOà;¹MDâ~GˆH¬}Í~0CÕê‘}f°Î­“Ýwß}\|ñÅnÎbN9å&L˜@JŠ£G, ïz¤@·= §‚µÀ)ª×Ó¤IW=./˜={¶ïíPI½©Ç‘Ê÷Rö ½¸¶d¬8ýߣDä  Aœ×v^à}îéÆ5ôèÑC³³³ÕP°xòÉ'ci'ÿR7Û®›'‹¹pëk(ê/Z´Èíúv¶mÛ:¹q©ûõwÁ%_íöuåÁZÅoÛ¾“DvçÅQs|²/ (ðý^šÈ5œvÚi¡Ÿò4xÇe—]K[o®.µÛ Æ6HrŒq”aذaNÔ†DBôºÉÓ;”rrrhР«V­²S½^UÇ$R–ˆ\(aÐVƒn<#"e1@ß m €¿«ê3¹ýBDê?ùdÇ&àä°´EYŽÃ©ŸjÕªñÝwß™¡Ã1\xá…L™2ʼnêà¯jŤˆ‹ §PÕ/±.$O¾ÿþ{æÏŸï“Eñ‘’’ÂÝw;ÚíwWä >."ëþïñ.…åÄ„â…"Ò+r_Aìüž‘KòøŸ_ÿAmÿË‹ NÇŒc:à üûßÿvšõ±%ð·DÊ Üˆ/^y啜|òÉvjõH¬Óн-(žUÕo,?PD¤°ˆ<µÂ=È”ÏA#À¿Eä¤\~ç§à[ô?‡8z¶¯ºê*ºw÷+D‚!™¨Zµ*Ï>ëx†÷A‰¿?pk;A"ÇÚj”çö‡´´4ݾ}{";-|á™gžq²•c¹ÆWO%íêÉcY ‹Çöü X m–Xÿa”éÇÕQSË>”º]uí9±»J•*ºsçÎ_ÃQtíÚÕésð¼ÆÙfC1 ªû€¨é‘222bÉ¥ƒv²’ó ±Í'œ ƒ°¶dÅUÝ`ù!"ƒ±Öª8Ú«S€è&"ƒŽú·Ÿ_ÿ Uu—ååI$bâp'º£F¢lÙ²[dHvÆŒCÉ’ŽÒh\I3¡p"ØŽñ“ÐÚ9_(Q¢7ß|³UGÛY7pk\F¹ÃU5,«­}#²½oVûÌï+üãe¸ˆ¤‹ˆP0Wÿƒñ±‘Ò¥—^ÊE]äƒ9†d§F<ùä“NTÓ€‡â)#ð]G íyr IDAT#"‹€ÖÑtæÎKÇŽ~ʼníÛ·S³fMöï·ýXn­ªŸ;9§ˆôÞMظøØ œ¦ª›*?D¤2VbœVAÛ’Ü ÏÏÕº§«ê ËË•HP–•@íhzÅ‹gÍš5T®\Ùà IªÒºuk¾øâ ;Õl ±ªþËùÃ4Fž& B… 4È^1¶Q€„V{&Ȱóÿ V|Óù;ã¬Øÿ~±1 „ÁØtþwÜq‡éü 1!"<öØcNTSq8uÌùC6lòÜQ¤HÖ¯_O¥JA.„·gýúõÔ­[—C‡ESS ‘ªþMIDÎxÀ¯À)ªšPù¾#"çcmçò+½!v^UUG^¶—ˆH1` P%š^¹råøùçŸ)]º´?†ò:ubîܹvj ´TÕeNϪU=D û—™™Ék¯½æ“EñS½zu.¿ür;5Áúr²ãŽÄ-Š›á¬ó¿˜Brtþ‡€œ ˆ°lÿ»›Îàž{î1¿!nŽðh,ç Õ€ˆ4¾¦S§N~úé'¬5Gáå‡~ Q£FØÔñ! ®ª®Ïí—"Rø™`’þ¬ÁšûÏ  l_‘BX©•]Ë×à2›±¶ .ȲÃm&²ø®0p2Ðk1Z ¬\îæ‡€ ªº;H#D¤4ÖÖØ¨Kú«V­Êš5kHOO÷Ç0C¾¤W¯^Lž<Ù‰êÙªú©£“Æ»ÐKÁZHuïãÌ™3ãÚ[é7½zõr²ó9Í».žtp¼Wre^vå'ÁZÝ?;ÀzÎMö#°:ñªq^W)àZà!¸7e^Ðm&R¿·;±wÔ¨Q¹¾ †XøöÛo5%%ÅÉó1C¶a§Š~ Ö–š¨Ù»woªØ}/^ìôe_^O¬‡Àï½dR·)¿ ÖÈÊÔtj‡e3p?PÎåëì |‚ësCîA»¬•ÿQm­S§Žfffæòf0bçÊ+¯tò|ä`*Û¶ãP­8ŠwѦL™ÂÆ}2'~ZµjÅÙgŸm§V¸%—ÿH”‘3LH2‘DŒ!شʇY\ÔRÕGU5jûU œ ’=˜SöÿŸ Øæð}øá‡)\Ø•ÔíƒÓö$Xï[Bé¨êAà?Ñt²²²5j”O%ÆÐ¡C¨Ý""Åÿ#Yì6ÏŒŠÎ×À*Û7DäQ,'+H½ª:&Òö=AU³Uõ% V½ddƒ†#Å;…F9Yl08¦víÚN·˜_#"¶ëBéDp0##Ã[¢K—.4kfA¶Ö~âÜÔǫ̃è<¨jsæWDä&à¾MÈÄÚÝÑFU'©ªo«ùÕÚ&Ô kJ Ùüë?²0÷;½Ûn»””0¿b ÉÈí·ßîd|yàb;¥Ð¶NU] Ì‹¦³mÛ6Þzë- J{ïuóço‘¨bý<4'KUÕÑRÓdEDúb-° Š•XQ Ÿ ÊÑRkÁYÀê ÊO€À¬áÕ¨)½K—.m¾þ žpê©§Ò©S''ª¶£T¡u"¼`§0bDïqçôéÓ‡SN9ÅN­Ð_DÒpð…áT®/ˆÈYX‰§‚jûcæªúe@åAUÇjgm‹Ca¥a )‚•”+*  xñâvjC\ bÛ·´‘Ó£)„Ýø+]ž|õÕWÌŸïgøñøHIIá®»îr¢z7Ð`²þ­Ò|œð'Þw2Vò ¿ÙôSÕkÕÊ~ "#m—bÅ;Ÿ©êž€mèØÆó½ñÆ}0ÅPPéÙ³'ÕªUs¢ÕSµY…þ¢ÞóÏ?ïƒ5‰3`ÀN:é$;µÓ.òŸíº‹dEDj3€ ±-ÂJ\31€²mQÕYÀAÛá€0Dÿ³ýôêØ±#§vš¶ (©©© <Ø^.‘ú?$³¾ŠÈG@÷h:/¼ðBX÷ÛŸÀÙgŸÍ§Ÿ~DÑí€ÂX‹–>ެ<ö«\µ*Dd0þÇ2Ø€âw‡ÏåzN$êÝ/AÛôTÕƒ*\Dêa“1±L™2lݺÕIT6ÃQ¼ñÆL:õ„ÿ¯[·.>úh%7={öäÃm•›UõϨyªšt‚µ G£Iýúõ5''G“éÓ§G½dð/¬$0‰œgŒßêa­ ñ³þ킾vëõ÷ÚåÑr(pô·³³ÿþjˆ¹sçj¡B…ò¬ÓáÇmbÒñÊ+¯8y¦^×£Úw2NÌÂÊ©ž'+W®dÖ¬Y>™“ݺuãôÓ£fmô‚Tà^ŸºJDª¸`O\D¢ý½ŽÍ"-xPU?ó¹L¿ zà|0%Û(’;vôÃŽ|Ú5kèÛ·/YYyGÈ~ðÁ™4i’V%?Ûa«£ÿ‘”€ªþ?{gocµ>ðïs&óTˆyLI!PR(tot]7]І«R·høu‡î­nuSÝÒœŠT7!qEŠˆ2K…Ž GH”y:ÇpÎóûãÝ ³ßwïýN{Ÿõý|žbíµžµÞµÞõ¼kxÅ{àd¹œ° HàÀ—òЇ{¿#Îñ¹Ì XpùaØÿ·í[mÛ†ê,l¨Ù³g=zô`ÇŽèaGT•~ýúñå—AÛ ÉC½zõ¨RÅöTÃHp4 I €£±b¬É´iÓøöÛÀ·§Ñ«W/êׯ´ñrSÄùޝˆHKà¯>[ Ž¡©NÐoß ïÿ—ÎŒ–¦B… 4mÚÔ'’›‚‚úöíËÊ•+¥ß¿?=zôàÇôX³ÔÁ¡1úó*@Òjyi“&iܧ§§3thžk‹¦R¥JŒ7ŽöíÛÛ%­8 Ní2cbô“Uu©ÏeE×ïrT5ê6Ÿ´ÂÆýo›6mÌõ?‡Ü}÷ÝL™2%¦ßlذßþö·:tÈ#­R‹X €À%"XÞÞ¢b+W®œîÞ½Û3ž“——§ÕªU òÐÕÏÒ±cGݸq£ªªþïÿsò›@¦ú÷ìÏ  ]~*ùUÇ h`‚úßm§ç_þò5Øóúë¯'Ô t’‚3f8iÏ5ÒÇ“v@UsˆÜe/н{÷2rdÔ…‚ÐP¢D î¸ãŽ@uÈÌÌä_ÿú3fÌ fMëf`·nÝ8ýt[Ï¿5¾^ëw 󱬣ܣª;(7(‚t¦‘ûÿçž{®]’bϼyó¸ñÆÊãµ×^ã‰'žpI£Ô¥uëÖ¤¥ÙNëmä貕d]»%ÀÅØX<µk×Ö#GޏkjyÄîÝ»µbÅŠ|u5lØP.\X¨^¯½öš“<–ñ-ᥭhŸy~Ô-LœD?rÒ!¨ÿ;]·mÛ¦†¢Ù°aƒžrÊ)¶Ï¼zõê¶iÒÓÓuêÔ©AW)ô4oÞÜÉk¢šä+ª:ø:Zšï¾ûŽqãÆù¤Qb”/_ž?ýéO¾–™••Ž÷Þ˲eËŠôgþ‡?ü5jØeu:VØT¯ù›eœÈ­ªÖ¬PŒØP¹³Uõ@@e "Õ±_Iƒ œa)¶8p€ž={²uëÖ¨é4hÀ×_ÍUW]5]~~>}úô!;;ÛM5S‡ç,wï‚/DˆÅÓªU+7,OÙºu«–*UÊ—¯­‹/¾X¿ùæGzýûßÿv’ç§êí³nåG»œ zY§0 p0€ö‚zŸg§gß¾}ÕP8Ú«W/Ûg]¡B…Ÿß?û÷ï×–-[Úþ¦AƒºcÇŽ€k^^zé%'cì>ÕXˆ0ë€V‘,^¼8(w»1SµjU ð6 ]õêÕyë­·˜1cMš4qô›n¸ *Ø%»Ðã Aó0ï¢x,€2ÃBç½þÁ6œ´ÓqSyàlW]ÓÓÓyûí·nÇÒ¥KóþûïsÊ)Q^X³f ½{÷ŽêH¨8ã°_Zý[Cð•á†`ÝjõtïÞÝe[Ë;rrr4==Ýõ¯«ôôt2dHÜ7#† 検 êÍ3>Çíöp ‹½¨K²V<?Û{MÐuŽÔû~;]ßxã 5üš±cǪˆØ>ëáÇúûÏ?ÿ\K”(aûûÁƒû\³ä`ãÆNÆÙǪšR@eà@´J‹ˆfgg»ÜÜÞ°bÅ Gƒ(i×®~ñÅ éõý÷ßkVV–]Yù@cuÿ¿ïód¤ÀïÜ®G2 °Îçö~:è:Gê=ÒN×¹sçªáx–,Y¢¥K—¶}Îv×úF娿<ÿüó>Õ,yÈÏÏwòŽ^«šB€Zƒöy»sà 7¸ÛÚqýõ×»öR=ùä“õ•W^q-8Òu×]ç¤Ü—ÕÝg{¶Ï‘kt7ë‘l‚uÐÏ6ït#õži§ë÷߯†_øá‡´fÍš¶ÏøüóÏ׃Úæ7tèPÛ¼233õ“O>ñ¾rIFÆ íÚîø@sS€FØ8*Y²¤þøã.7·»lٲʼng+"¢týªÒÊ•+¬NäÕÔ½g;Ñç‰H?¹¥2 PÚçö>” ºÞ‘ºçDÓµD‰ImÔòòò´mÛ¶¶Ï¸víÚºuëVGyæççëå—_n›çÉ'Ÿ¬k×®õ¸†ÉÅ¥—^êd¼ÕN•C€¨—>ªc ¼¼<ž}öÙhIeÓ¦MtïÞ=a×—íÚµãóÏ?çå—_výªRÓ¦M¹âŠ+ì’¹$HD=ÝÈ+ò°âMgªú\Þ,UÍõ¹Ì_!"XޭФN:Æð1 4ˆùóçGMS¦LÞÿ}ªVuÖ­ÒÒÒxë­·hÖ¬YÔtÛ·o§GìÝÔ­ÕðQ·®íV€:)eDxÜ.Á³Ï>Knnàï™ãÈÉÉáÆo¤^½z,Z´(î|š6mÊ{ï½ÇçŸîi”²aÆ9Iv³KA‚®q!XùH­xÅ™èDZÝ' ÞÿÀšü£Æpø‚-<öØc¼ñÆQÓˆo¼ñ-Z´ˆ)ïòåË3yòdÛ˜+Vзo_ bÊ?U©S§Ž“du_jóB°ÂµF]þxá…Ü[oI€ììl½öÚk5###¡åÓš5kêÈ‘#}õxØ®];'ºÝ¥‰?ϵ‰´MœÒ?Q½“]€>·yý ë©÷EvºÞtÓM¿őɓ'kZZší³ýç?ÿ™P93gÎtôŽ:t¨K5Knþûßÿ:o>ؼ ·]å5jèÞ—_~©W_}µ£ÁM*Uª¤=ö˜æææú^‡ &8Ñq  ÂCä0pr¼:§ŠàÀÁ–‹òmÐõ=¦Þ¿·Ó÷‘Gùõ€(f,_¾\Ë•+gûlûôéãJyÏ?ÿ¼£¾4jÔ(WÊKfæÏŸï¤­^ |°y!@:®/Mœ8ÑÕFwÂÂ… µgÏž _ñ+Uª”ÞsÏ=ºsçNßëp”üü|mÔ¨‘}ûküÏò9'¡£2#^}SI€ÿó±Íÿt}©·­áóÊ+¯üj<'¶mÛ¦õêÕ³}®­ZµÒ¸VîàÁƒmË,Q¢„Λ7ϵ2“‘5kÖ8scl^ p«]\xá…n¶yTæÌ™£—]vYÂ/ÊŒŒ 4hPh® 9t;¹‚8é™À6'¡£28V]SQ€×|lóË‚®ï1õb§ïÛo¿]Èh(:tH;vìhûL«W¯îú{êðáÃÚ©S'Û²«U«ös8óâÈ?üàd̽ø`óJ€2À»FX°`›íþ+>úè#íСƒ+/É«®º*tŽŒòòòEû®ÐØŸ¡m¤GäÔXuMEVúÔÞû’A×÷˜zßg§ó¤I“  Ńo¼Ñö™–,Y²ÈÈ¢‰²cÇmР­-[¶Ôýû÷{¢CØÙ³g“q7=o ªûìÒ >Ü‹²™S§Nu/åïÿ»/ú„’%KڵͲÀ›×‚ƒ}Ì!C†$ÔÐß}÷:T+V¬èÊ ±sçÎ:{öì„tò›;î¸ÃÕÉ8 ¯ŽÉßê˜Ê‚ƒep¥^Ðõ=¡î/Ûéüõ×_6 R–Õ«Wk¥J•lŸeÏž=}½]5|øp[DDß}÷]ßt 'Ÿ|²]Û¬|°y-@s»R¶lÙ¸NÓþùçzõÕW'|‡ÿ¨tïÞÝó3 ^±aÃ'íP€Ã A@/' cåJ'ú¥ºàŸëåì ëZHÝß²Ó{ݺu… ƒ”$??_›4ibû,Ï8ã Ý»w¯ïú 0ÀV·Ò¥KëêÕ«}×-HN;í4»vÙœ²gŽ¢ªË£¥Ù·o/¼`{\€#GŽðÎ;ïжm[Î;ï<ÆŽ›P\ê´´4z÷îͲe˘4imÚ´‰;¯ ©U«}úô±K&À]³ bÿàË€Ê çúTNX¼ÿ‹9p ‡";;;jš*Uª0iÒ$Ê–-ë“V¿ð /pþùçGMsàÀÖ¬Yã“FáÀA-“ò@[÷ÀÏ<óLTÿû;wîä±Ç£^½zôéÓ‡ $¤PFFýúõcÅŠŒ;6f™adèСN’õ‘êÒ :ñ°[Us(7TˆHm šOÅ}àS9±PÚ6AiÛ$ņ¬¬,ÆïÔý¬'åO˜0ÚµkR~XqÐGK @U?ÆæËnóæÍ <˜ùóççOúÛo¿eðàÁÔªU‹»ï¾›7&¤KVVƒ bÕªUŒ=š&Mü:hí=gžy&]ºt±Kf$H¬(+Ñ#€xÃ×”F®ô©œýÀ§>• ¶Q~L  _(Q¢„ëÇb¥L™2¶·Šú¨¾ßæ—ýp¸/Y¹reíØ±£¶hÑ"a}G¥T©Rzë­·¦¼sŠ™3g:i]@y-úYÕu£ÍãqEéTœøÜ§öžt]‹¨ÿ$;ÝÃRÜMrssmŸe½zõ\;‚½òÊ+muœ:uj úE³fÍìÚdO±Xˆð_à{' ·mÛÆ¬Y³øòË/¾âæä“OæÞ{ï%''‡§Ÿ~šš5£FMz.¸àš6mj—¬pC”?Ý=bbw@円Èò¿wa$'ŒËÿ`­LDO°ß6IÊ™™IõêÑwíÖ­[G¯^½8|ø°OZýÂ_þò&Nœ5Mzz:5jÔðI£pà îò2•PÕÃ"òà1?ÊkÖ¬C† ¡_¿~”*UÊ"}e÷îÝ,^¼˜U«V±zõj¾ýö[V¯^MNNŽÓC‘·‹ÈÓªZØÁ‹æ.«ë”=•&®ÆÁ¸K„ñ à8ÒÓÓ™8q":t /¯hM³fÍâÖ[ou| Ú Þ~ûmzè!ÛtO>ù$gœq†…'@àËm~ Ö—çûì3^{í5ÆŽëÅÒ¾SþUÄße¸¶:”„ü¨ãSY3µðßaÁlD¡lÙ²Lš4‰Ö­[óÓO?™nÕªUüîw¿ãƒ> ==Ý•²|ðAÞyç¨iÒÒÒxë­·8ýô .Ãþ™Ü‡±öô/Á û»+Õ¯__zè!ýþûï]?¤á7›6mÒ‡~X5jÄ»e1 úëgš N·œ¨Oq,GY~µóA×צ-þ`W‡Ç¼ÈqV\˜3gŽfeeÙ>ïDƒ­eüøñŽü²<ú裮”—Ì,^¼ØÉ8|9ðÁ«À¥X»~òâU²dIíÛ·¯Îœ93éOó·ñÅA×Ùa»lˆVÒ¥K«ávíÚ¥Mš4±}þÍ›7×={ö8Î÷ü£mž¥K—Ö¥K—zX»ä£k×®NÆb½ ÙåvÍM©^½ºÞyçºråJüå/q»­ °&=tJ¨¿ýâˆÏ“ÒQùÄÏz-Àù‘gíWûî2ƒ®ÃÜ«B IDAT·Ã¶™mWóÅy<«W¯ÖJ•*ÙöƒîÝ»k~~¾m~=ö˜m^"¢ï¾û®µK.cG€Ì Wð¢/5jèm·Ý¦sæÌIú}…qß}÷¹Ù^_·U5Ø—ï~'¥ce]õö¹3€¯|nß÷‚®w íóº]}æÍ›§†ãùøã5##ö/ 6,j>ÿûßÿ4--Í6Ÿ¿ÿýï>Õ,y(((pâ"y½ªÔàêä勦F:dÈ;wnJNúGÙ¹s§íµ xh©!xñªÕ?Vû<1+‚®¿Om|Gm;(èzÇÐ>·«Ï[o½¥†_3bÄGýaôèÑ…þ~ùòåZ®\9Ûß÷îÝ;¥ßïñ²yóf'íÿ‰ªÔ-€ngX³fMzõêEïÞ½i×®"~4 Ž]»vÅûÓ#X{ú¯cÅd›S–@ƒ€Ê>“p{©K9xÀçb˜âs™‰c›ÀÜ(”Áƒ³|ùrÛ¨€ƒ ¢aÆÇ9VÛ¾};=zô°uNvöÙgóú믋÷|¬8ì—ëÀ €óÜȤV­Z?OúmÛ¶-v!`ð 0ZU·¸¯‘kl °ì³HqxËß‚ŸÌWÕèÎÛÃ…í[ôÛo¿õC¤ä™gžaÕªU|òÉ'E¦9xð W^y%‹-¢V­Z>|˜^½z±nݺ¨yW«V÷ߟҥK»­vJà°_æ@pÀJ¬m€˜(S¦ çw;v¤S§N´iÓ¦ØMúÇR·n]Ê”)ãÔíãa ž:»‹4AÞ?+À²=GD.Árûë7ã(3¢ÏBÀÂ… ýÐ#)ÉÈÈ`ܸq´iÓ†µk×™îèÿ¹sçrÇw0kÖ¬¨ù–(Q‚‰'R³fM—5NöËu¹Îå7"r&Ö³¨;áwìØ‘Ö­[ËÈNÑ2dO?ý´Óä5Uõ{/õq¹ëh,UÕs*ÛSD¤4ð–Ÿ ¿©«ªë(7nDdPd4açÎT¨PÁG­’‹•+WÒ®];öì‰g«I“&dggÛæ÷ÆopÍ5׸¥^JrÎ9ç°téR»dgªê×A²™ŠÍAsÂÓžõë×;:u‘«4¬ì+’cP‡ó€Œ ÛÀ£vP›~tÝãl¯)vu›>}º¢3eÊG'úíäî»ïº*¡gÿþýN惽@šª’FpeÊ”±MûÜsÏÅ>¸¸²qãF6o¶uµ±^U·ýŸ W^~Š–`ñâÅQJ,®´‘ ü?8FU—ãÀ‹‡¤÷X~܈ţ8Øbó ¿ňœ„uúÿL§¿™={¶w ¥ gu£GŽêÃeÈ! 8ÐG­’‡ýð¸=«@üœˆˆüפ]ºtaêÔ©>iÛ·oç?ÿù/¿ü2ùùù”+WŽæÍ›óæ›oúºw•ŸŸO£Fl=i7©jP÷ì#"Ob' Š#@cUµmа "%°®û…áËÿ(׫ê«A+aGdÅçÄ膺J•*lÙ²ÅR‹‘'Ÿ|’÷ßÿW_¯^=^~ùeÒÓÓÐ*yéÝ»7ãÆ³Kv‡ª>õóÿi8îÛžŒƒp_}õ•'w'ãeóæÍzçwj™2e Õ÷‚ .н{÷úªÓ³Ï>ëäNmކà¹Û ÐÑA]¼–—‚n‡Ú«ÂØ #‚nm× Øo?ýôS5‚"//OË–-뤯ž£ÇôûP˜¬ªºi—.,g¾ûî;L½zõ>|x‘®xçÎKÿþý}ÕmÀ€T©RÅ.Yéâ‡> 2ذýE¤eÀ:Ø9´ö9ÆMÓ+‚V "r#Vp¬Šñæ1qâD÷2bdÆŒìÛ·Ï.Ù&U]rì_„ˆð6Î_Þ~ûm6n î@ñºuë0` 4à¹çž#//Ïö7&Là›o¾ñA;‹R¥JqË-·8Iz׺$ŠZ‡D'¬F&ðßÈÁ°P""ç`ìm´.EP[Dš­Ä‰ˆÈÉ"ò_àŒ‹òÞ{ï¹£”Á…m¥–ìÄ¿ –Ÿðw£¥9räO>ù¤? ÃŽ;¸ãŽ;hÚ´)¯¿þºOK?£ª¾¯\ <ØÉ)Û"ÒÊ}䥠ÀºF÷lÐJ†ˆ\޵ìJкØpgÐ ‹ˆ\å¡Ð•³999|ù¥mxƒÁuT•I“}'ýÚJP÷Ùìh‰ÍFÙ²euçÎÞl¤œ@nn®>úè£Z±bÅ„ö@³²²ôûï¿÷Eç£ÜvÛmNt«!xîv,I¤ý]”›‚n‹cÚ$ë–‘´‹)Ú„ ÝʯzQG»ÄóæÍsÒ?w™zÂxÍ €ª~|-;}ûxþùç½Öƒ7ÞxƒÆs÷Ýw³k×®„ò;tèO=õ”}BùóŸÿLF†íªæoE¤¾ú$HX¾¾Ÿ‘?­„ˆ´–ÉrTZ€"R2ÂEÒEd ð 0À‹2Ì6€!ž?ù@ ¢E´±±fªU«¦yyyžXS}ô‘¶lÙÒõ¯ƒòåËë®]»<ѹ(úöíëD·g5Ï=š`¹±Ýîö3‰S¿ ¨*cùÍ(A;Ä+Ó€’>·[w`…õ[·nýÀ4\¤I“&NúæÕZÈØÕ €ª~„õuS$[¶laôh[/1ñÍ7ßеkW:wîÌ_|ájÞ{öìáÅý½zïÐ1б½6$ªš‹ƒ[">‘¼+"wK4O&.qìs= ôÇúšNV.&Šˆ§2"mv™ˆÌÆ:HÚÌËòŽòÎ;ïøQŒÁÀ¢E‹ÈÎζKv(܉NaVAÐü‹¦Q£FšŸŸŸ°õTPP Ã‡×’%K&jýe—¦zõêzðàÁ„uŽ…K/½Ô‰îhž{4Á:ä¶/Ágä¶L*y\ïæÀÜÔÕmÙüÖƒöªŠÍqmõª[·®+ï%ƒÁ ýû÷wÒ/§jQ㥨R°ö5sì*öÞ{ï%Ôx999Ú¡C‡Dý‡@ûˆÞËìÒ¿òÊ+ é+ü±“:lJkž}4ÁÄu¢lþD!l¨gi,#xÖ–CÐuôR¦=¬Ú«Ö¾þ8à`Ðuš2eJüÖ`pÈöíÛµT©RNúd‘‡—©©ÜjW±víÚÅÝx#GŽÔråÊ%2ÐOй¯Ýïš4i¢qëçœsŽ“úܪ<çXËÓ]ÜÞÚ<–ÕXËóåã¬[&–Ü7 ßJ‡²ë>þVbbm}œ \I÷ÖU¾ u?N.¿ürׯ®ÁP?þ¸“þ˜TÖ$4Jc}™F­àœ9sbj´-[¶h=àë€>Dâ(œ s°Þ.‰'Ƥs¢¼óÎ;NꕤŸX§° V˜ÞÀ_òQ$xè‡P¦DõHê—cM|a9ä)¶b­°•!ÐËVÒÒÒ4''Ç‹¡l0¨ªµuÝ A'ýqŒF{ŸFûÇ ø‡]»wïî¸ÑƯ•+WŽw`oà Lu©¸Í.¯óÎ;ϱÎnpäÈ­W¯ž“:þ>ZÝ @™ÈÄø‹Þ¡ÁZXеj´ëDz^t3â‘ÜsÏ=Þ hC±gÚ´iNûâyšÄ@l¬~Ñ•+WFm¬]»vi¿~ýâ̹À£@E‡:—ÁÁ×Üܹsc}æ á0HÐR'u Z€kƒ~Á1MªT©âÙUeƒÁá*ö—j÷.µK´ÏÙUôºë®+²¡fΜ©µjÕŠw jÅ¡³íÊE=b|ä‰qàÀ­R¥Š“:w޵¾A0+è—¼#Ñd̘1žgCñå»ï¾Óôôt'}ðFM >V "+š••¥›7oþUC=÷ÜsNêDÙ tM@gWV.ÜæpR÷â­·Ÿ4źßø‹>$k{+YÜ '…´nÝÚ³±l(¾ :ÔIÿÛ ”Õd7ÔzÙµ«ð°aÃ~n ‚‚§T˜¼ œä‚ζ+ ˆ¿ÄÁ¶mÛ´L™2NÚ e¢õ÷CçµÀd“DV}€§C OJ‰ß~ ©ÍæÍ›^ý¡NÞ¡N-Xׂ¢V¸B… º{÷nÍÍÍÕ«¯¾:žÁºø‹:×Çæ‹*ÄA‚Þr«¼,Áë‚~É'±ì:Óž•ppóƈsiÞ¼¹q dp›o¾Ùiß;]SÅPëå4Ó®Ò÷Üsžþùñ Ô€êèüŽ]ÙC‡M ;ÄÎúõë5##î=ŽuÜn/8›$¹2Ù\TH{ÞÝRJÞxã OƲ¡x±víZÍÌÌtÒçf«Ó÷§Ó„A ÐŃÁ¹¸ÁCmW.B$èi/ÚÄ Á&#ÇÉ> Cm™Ž–FœK½zõôСCîdC±âšk®qÚçz¨Ãwgè‚…ªN¾v1˹@ U}ÉÅ"âcëƒÂö7<òˆ›CØPL˜?¾Ó>9]c}gÆúƒ ¸#Îû6n=Ôùvú…8HÐx/ÚÄ+Ê3B0A„EòûâlËRÀâÔ!L’ ã˜D,ïŸ[ì~[©R%ݹs§[Ã×PL¸è¢‹œöÍVëõA Ö ~GŒƒv5—>=Ò9™ƒ`•üÙ; V@ž '‹ e' 8´Š´e ,ÇXA×% ò)аˆvºÅI7Üpƒ #×P\xë­·œöÍqÏøŽçGA ðP ƒ685:±Ó5ÄA‚¾£ˆ¨va¬Ó쯇`ÒJfõ]jËÖ8ØçNaÙü‰B"€ÓFYXy‰ˆÎ˜1#Ñ¡k(üøãNƒ×šhc;inœÀÓÀAé¶by9Ûì±>Nxkå¢H>ÿüs>ûì3ŸÔôôtî¼óN'IOÃ2º’µN³À |$`uüd7p#ÐQU׺‘¡ª.ÎÃ2‹ÍUõ9Uk¦/ U=üÍ.3UeàÀìß¿ßM )È-·Ü¶mÛœ$­ªÙqÕ^$ºU´‹-]ÿ´Ñ9ÌA‚ ˆñ„iXh¬qPÇd—ñxàÐê˜v¬†Ò8èzú!K€KblŸ4¬›¶ùßvÛmñ WC1a„ NûipšÆ;¦ãýaМe°.ZÇBt®Šuˆ¨Èâ Aе\Ç‹¶ñZ°Î޼‚‰Å ù¸Ò§v, ¼‚:{%k€>DYî·iŸÎNÊIKKó=$¸!9رc‡V«VÍi}Pωü8h*óë+vÙ@» u‹¢s2 R`‘ëOÉ(ÀÕÀÆL4nÈOÀ½@9ŸÛ0 xԊƸ dºÐ>¯8)³Q£Fš››ëxœŠ×^{­Ó>»’ÏfþBNT€r@;àR 'P2hlôuÞ8¤A‚ŽÊB Œíã‡%¡Ä~›$,²¸+ègœÌ A{$"‹€kqñ+PØä¤üc£˜ S¦LqÚoó¶šh_M4#q½ lÇ4Hб2 ¾–‚,ÇA<Á„¾ÇºMR*è¶;¦ ¸žäŠ"xxÓh”v¹Ü‰.ééé:gΜ(#ÓP\øé§Ÿ´FNûðêB?µ:«ÁGD¤Ö—G‘”/_ž 6P¡BŸ´‚?üáNýMe p­&y'‘êX“Ø ^ÀêœÈ!,Çc€Éªêäö‹ïˆHeà~ ?Öpù+BçHUÝâua"2Ë}yTªU«ÆâÅ‹©Q£†×*BÊ‘#Gèܹ3³fÍr’|-p¦ªH¸`7¬#q}!؆7~ôÑGÕO–-[Ï×Ôã^´O‚õ5{ðÁ® `-­ßœt»Ä؆e€AÀÒÛïXY†u´qmqðƒ=[·nmÎcn¹å–XÞ Õ¥>jVBDº`}ÙIõêÕY¿~=YYY>i—]vÓ§Oõgw©êp/ô ©€µŒ{QDê{\äFà3¬(•STu½ÇåyŽˆ´Å2:µ|*v0Ë€¯ª«}*·PDä7À'iûõëÇèÑ£=ÖÈ6^}õU®¿þz§É_PÕ›Ý*Û""_gFKóÊ+¯ÄÒ9fÆŒ\rÉ%±þL±¶Æx R(‘ZX†@G )Pë*ªÄ˜UÖWáF¬¯ä¹ÀgªºÁ-]ȈÔÚ"ºaPåßbMøóyªºÊ…|]EDþ üÎIÚ'žx‚;î¸Ãc aaþüùtìØ‘ƒíìmNWÕ½n•o €‘k°–›‹¤I“&¬\¹‘Xç™øiÕªK–,‰õgùÀ`U}Ñ•B‰ˆ”jG¤V ‰H¿[±N…o6«jqòLX("R«Íj5ù³–‘”‘£ÿ½+žÆwY¯ª?ú®xˆHà+,GJQIOOgÚ´iñá†$cóæÍ´jÕŠ~øÁIò| ‹ª~ì¦ÆÉÀ:ÐqZ´t'N¤gÏžþ(Œ;–ßýÎÑKaü ø?5Ë`ø9øÈ´K{ÒI'±hÑ"êÕ ÛyTƒ[äòËTu†‡*™€09ÍüºMþýoO¶Š¤T©R|øá‡<õÔSœrÊ)ñfS ˜-"Ý\TÍ`HZTõà*,/¶Ìš5‹îÝ»“››ë­bϸï¾ûb]Åæõäf 4ˆH¬H{EeYYYäääpê©§ú§X„ðè£òàƒRPPOùÀ߀GT5ß]í †äCD/9MÉ%—0yòdJ–,r¡ÐBî¿ÿ~zè¡X~ò¦ª^ã•>ÇbVB‚ª®ÁÆcØ¡C‡xê©§|ÒèxJ—.Í<À¤I“(_¾|‘6^`0„U-PÕþÀý€ã½¾;vЯ_?zôèaV<"//¡C‡rþùçǺßð?àBUÝæj1c €¢ªû°1vìtõègÊ–-ËE]äe— Dd’1 Å U}ø-SXÀÉ“'Ó¬Y3FŠiÁ`üyó8묳xüñÇãñˆú(ÐSU÷x Z\ ¤D†Ô‹–¦E‹>icOºtÇ2æ‹ÈD$ËB † QÕ‰ÀyXók×.ú÷ïÏå—_Î÷ßïrÅ„ÜÜ\îºë..¸àV­ZëÏó€kTõžÈöNh0@x±Q/¸à?ôpÄ™gžégqçc€ "ò@ÄX2¤"rŽˆ˜°w' ª_­¹±þöƒ>àôÓOgĈûIF¦NÊYgÅðáÃãùêß tPÕ7=P-aŒ^*Ù%8ÿüóýÐõjâÐïà¯Àw"ò¶ˆ´ B CbˆHyLDÖayD´NaDUÂržõj¬¿Ý½{7·Þz+7fÔ¨Qäç›x\vÌ™3‡ /¼nݺñí·ßÆ“Å" µªFuï$Æ/™Ñþ1---Ðx'røðá ‹ÏúŸ‹È ¹WDj©¡hÄ¢ˆ ‘ï€ÀP n$Éí"bÞM… ª‡Tõzà ¦{gëׯ§ÿþ4oÞœqãÆîK$Œ,Y²„.]ºÐ¾}{æÎyÁå(oíU5'µ‹À ²ð’íðÃï ÇÒ xÈ‘9"r£ˆ˜¨)#"i"rˆüËÇÅçÀŸÓ IÞèá§~Ɇª>…u.`E<¿ÏÎΦwïÞ´jÕ*V·µ)Ë7ß|C¯^½hݺ5~øa¼Ùìú©ê5ªú°Æ/Q Ug?Ê36mÚ´ '"ÀÀ À"ò¾ˆô‘2ëUlˆLúEd° ˜ÜÔpðó?{ª\  v6ðq¬,]º”®]»rá…2uêÔP½SübáÂ…\{íµ4oÞœñãÇ'²*28]U“ƃ RD¤706Zšììl7nì“FÑ8p #GŽ Z 'Äšˆ¦SUõ›€õI)"ÑÛ¿ª&]kU]ìŠb)Žˆœ ¼$t·V­Z\wÝu 0€ÚµSwmçÎŒ3†W^y…¯¾ú*Ñì¶·ªê]PÍWŒRD¤96AÆŽKïÞ½}Ò¨hòóóiذ!999A«°ŒiÀ Uݰ>ICäfK¬ ÿ¼ÈŸ5],âmUíëb~)ˆdÿ܇Í";ÒÒÒèܹ3¤Gde¥ÆÛÙ³góòË/3~üxòò\Y¡9 ™t ¤Dó> È‘7lØ0}ôQÿ”*‚^x›o¾9h5Üà0°X‘/€¯U57P­B‚ˆœÂ/ýyÀ9@I‹<ÔSÕ¨q1 Ç#"-°VZº‘_•*UøýïO×®]iß¾½W^?=¡  €/¾ø‚iÓ¦1jÔ(V¯^íVÖ?bMüãÜÊ0ŒbDäK¢,éÕ©S‡uëÖ!">ju<»wï¦aÆüôSRÀNȾåƒ`°,Y-~§ˆH:Vß;v¯õGÞ𸪠 Ü¤FD2€›°Vª¹•o‰%¸à‚ ¸ôÒK¹ôÒKiÑ¢E ïŸÂØ´iÓ§Ogúôé̘1ƒmÛ\õº›<<t 70@ˆ‘W±¹=wîÜÀüäææÒµkWfÏžHù³™Œ`­&Ñ€‘*@Ž„yÚ IDAT¬‰½N!ÿíå×½SvµÌÖL|Dœ*Ý Nv;ÿªU«Ò¹sg.¹äZ´hA“&M(Uª”ÛÅI~~>ëÖ­cùòåÌž=›éÓ§óÍ7žë9 ŒÄšøSÆ­¢1BŒˆôÞ–æÚk¯ Äß÷ÁƒéÑ£Ó§O÷½ì³+Ò×÷Xƒ¶Gþ<ö¿·Û"±<%rý±EOðÉr#âvUýOÐJ$3"RËwÀŸò^•“––FݺuiÖ¬ÙÏrúé§S¿~}Ê—/OZZ|Ïöïßφ X¹råq²jÕ*<èr-Ž#Ëë誚”‡œ¢a €9°¨\Tš´´4–,YÂYgå›^»ví¢oß¾L:Õ·2Sƒœ`óç.¬k %N’1ü] œoµñ– ¡ª÷u 1 ‡·¾næ‹eË–¥B… ?Kùòå©P¡åÊ•#77—Ý»w³{÷nöìÙsÜà¹P±øýMUcù—, äˆÈ3XKxErÑE1sæL_ô™7o¿ÿýïùâ’ ‰Ò;Ù\…‰ÈÎ{€þ@Å`µ ‡IÀ?UõË •ñã(ü¼n—à“O>á™gžñT‰‚‚yäÚ·oo&CÇ@.¢ª[UõàT ðiÀ*Í·X+#µTµWq˜üÁ¬$"2è-Mzz:S¦Lá²Ë.s½ü)S¦pÏ=÷°|ùr×ó6b ªÎZ‰TED?bÚJurqÀ+ªZ, c$"rÖió¨*T¨Àÿþ÷?×Â/\¸aÆ×Sþ†ðñ®ª^´©Nä awàzà2lÜ’'!K°"*¾©ª»ƒV&HŒ$ˆÈ Àvé²²²xá…0 ¾ˆªyyyL˜0W^y…O>ù$®< Ȩêú ).Dn\ \‘úÁjÛ€éÀGªºÀ%Aa €$ADª«px`§OŸ>üãÿ aƶi<ÈÂ… yçwxóÍ7ÙµkW¼j&A¤ƒ OEö®  "õøÅ¸ë¶IØ8„mrzD–&“?1@!"¿ÆcEº³%##ƒßüæ7´k׎–-[rê©§²gÏvíÚÅ®]»X¶lsæÌaáÂ…nøÅž‰u¢ø7XÞÇ c0Å^ ¦ªî Z‘âNÄ[d+à, )V(îf8‹öè;•À7‘?—Ÿ«ê~uHZŒdˆÈýÀ?ƒÖãò¿«j@$äîmÀP RpªR”»TuxÐJ '²mД_Œ‚†XïòÇH¢Ä9Áz¯ì9Avcù„8:Ù£ª[¼©EñÀIˆˆ¼ ô Z`#ÐWUçö"RëúÖ¤ŽSCðlê«ê‘ 1Ĉ”àƒ  –s¬=ÀnU=¤nÅc$!‘3¸" r§€Gœ,ÅŠÈÉÀÝÀ`|ö>fHYú¨ê;A+a0$3ÆHRD$ x¸ËÇbó±®Ïü]U7Çúc©†«üF¢/ÿ v,TÕsƒVÂ`HfŒäˆÈ±|À{Åa`ÖÄŸ°_l9 ë àµ„#âœ!9¹°¨í'ƒÁ`1Ri <ts9ëX_ücTõG—óFD*ƒ€›ZnçoHY²±\d¿®ª[ÖÅ`HZŒBˆH;àA¬û¹ñò=0xMUº¢˜ ÏcWbݸÐ2 IÇ.à¿X“þ‚ •1Rc¤ "ÒèœuG÷´"’櫹À`NÐ1¯Eä,¬P¥}1ÛÅ|,G.¯﫪§ß †â†1Š‘àõ±¼ô½O»Øwôî~Ø0ÛÅš•À(à Uý!he †TņPÙ¸ øÐëΰ!õXLÞSÕ%A+c0Œ`H"þºbݱœ‡’“`Ö¤?QU׬ÁPì0€!)‘ÒÀåXÆ@7 T°‡•m"0Ù‹›%ƒÁ9Æ0$="RëÐãï€K0ÞÃÄ&¬@Q“€i&H‹ÁŒ`H)D$ 8˸+ZYz J/6³YÀ,³´o0„cRšH@¢Žüb4 T¡Ôc/Ö×ý,Ì„o0$Æ0+D¤Ð Ëh 4$P¥’›9ªÚ>h% CìÀP¬‘rXÎ’Zb9Nºs `+° ¨´ˆ’.(oBó ɇ1 †"’ì£øx Tà '"+°&ýeªº@D`ŃˆF+swß`H>2‚VÀ`õ±ŸüïVµO:@e/•‹“íÀz~™ä•õÜëÎwPF[ÀC’a ƒáš;H3EUWößµS 'Hù"þ®<ÖÅrŽ£'ü÷‰— ìv:øs›ªî‹¡þ…‘ˆ§b”4mg,Ç`0øŒ1 †_8Ýæßßõªzø&")ªªˆ,ÀrÇ\íüÒÇ`0¸GZÐ  !Ân`•ªöE“pa· P_Dªø¢‰Á`p c ¿`gºô_ ˜ç M[ϵ0 ®b ƒŸ=6²I¶Ü]BȬ3Ñ0€ÁdÀ`°hŒý™˜bi¨ê.¬›Ñ0€ÁdÀ`°°;ÅÔˆ`· Ð&âGÁ`0$ Æ0,ìöÿsu~(Rì–Å™e0B‚1  ;àU-ðE“pâä  ¹h0$Æ0,ì €â¼üÖ ˆ½6iÌ9ƒ!‰0€¡ØñàW×&Y±6"«‹l’À`H"Œ`0@SìÇBqõp,vÛE¤’/𠆄1€Áà,@±^ˆ`wP€sýPÄ`0$Ž1 {`ªnðE“pã$2 9h0$ Æ0Œ `G¨ê6`M2sÀ`HŒ`0Øß_7Ëÿ¿`· p®ˆˆ/𠆄0€¡X#"€Z6ÉÌ À/ج€u¨Ò`0„cŠ;Æpl89`¶ †$À†â޹_lÒ˜ƒ€C` CqÇÎØ¦ª[}Ñ$ PÕ#Àb›dfÀ`HŒ`(îØm˜ýÿ_c· ÐLDÊû¢‰Á`ˆcŠ;&@ìØi@?1 ñc C±EDªUm’à×8‰ h¶ †“´ɈH=`4V€žU…Èz—Bóš€q ª[Dä; v”dq"Rh4>Fš`õ…ÿFÎ! †1€!TˆÈ@àI lä¯N.:!ÙAYds‚q ª»b(ÎÉ@s pæ§ "iÀi?É•šQòüÐUDú©ê·1kl0ŽÃ†P "U—’—Àš¼5‹È¾j°®/G»€ÍªºÓ>Å‘ù@Ÿ(ÿ~²ˆœõŽ9q’o”Œ³Ü6À"2TUŸ‹3ƒÁ€1 ! â:ö ¬¯ýD©‘ OøûÃ"²Žã‚ólò2ËÿEãÄ!ÐÊ. <+"UTõÊ0RcÂ@Ü™ü£‘É/_ NùÆ#]’©Ìñ_ñMÅ Æ0âDT5h Ź´… @…l)¨êæ óÉPøÞüIªVû€ .5ŠfÀZ­@P/"]û‘½À·üÚ8øVUí\劈Tã—ÓõÇNòu€ôà4‹™²X+æ ¦ÁÆ0„dtS8'"Ç¢"²‰_ ‚—Tõ+¿•;´ç—‰>•¼ôµÁC\˜-C ˆH&°ëd¡T¬X‘}ûöqäHR^ÿÎZªj^…‹H`je'J… 8pà‡Ž–ìyUý“_: ©„1 ""ç`\fìØ±\y啬[·ŽU«V‘ͪU«~–mÛ¶ù¤mÜ WÕ»ü.TD*bÝd¨áwÙNIOO§N:4iÒ„Æÿ,Mš4á”SN¡S§NÌœ93Z‹U5¬[HC¨1€!PDäf ê}êÔ©Sä¿ïرãWFAvv6k×®µûzô‹ ½ª~æg¡"ò:ðG?Ë,ŠJ•*ýj‚oܸ1 4 ++«ÈßÝ{ï½<òÈ#Ѳ>”WÕƒnël0¤:Æ0Šˆ¼ (êß«T©Â?þWÞGŽ!''ç8£àèÇ›g¬Zøu@PDº“ü(ë(Ô­[÷¸ þ¨T­jr¡p&L˜ÀUW]e—ì\U]WC1Ɔ@‘¯‰â‘¯[·nL™2ÅõrwíÚõ«UƒU«V±fÍôìcòªú7¯2?JÄÕî÷@5/ò?餓 ]²¯_¿>™™™®–µqãFN;í4»d·¨ê³®l0Ì-C`D¿4‹–¦uko¶w+V¬HÛ¶miÛöx—õùùù¬_¿¾ÐUƒ-[¶$ZìîD3p‚ªD®)ÆmdffR¯^½_-Ù7nܘʕ+»¨mtjÕªEµjÕìÚ¾ ` ƒ!FŒ`’s° Ií•PéééÔ¯_ŸúõëÓ­[·ãþmÏž=…B\½z5yyŽùÏñDé¢Ëjh—¨råÊ….Ùׯ_ŸŒŒp¼Z·nÍäÉ“£&ñKƒ!•Ç7Wl_Ü~Ñ(_¾<­[·þ•NôéÓ‡wß}7ÚÏ÷aÅ;ð‹Oë¢%˜¾øÂÏc ñã` ãI b CPDÝEÄéÒoà8XXP,[Å’eÀ1xšˆ„ÿÀˆÁ"Œ`ЍoôFQ¾|øƒÖíÚµ‹åË—Û% bù¬8;£%H!Ì6€ÁÆ0EÔ%[K¾¡à³Ï>£  À.Y ³¬Zn>çFK“,ÀÙgŸMzzº]²äè4CH0€ÁwDä4 êrm íÿ¾:¨3ü¶mÛøæ›oüÒ%nÊ”)C³fQF‚Y0b† H™€¾ ¿RU_\­…’,«úDrtƒ!$ $ˆHºˆœ""5E¤®ˆ4‘¦"r†ˆ´‘6"Ò\DJ­« D]ªÍÈÈଳÎòK—¸ÉÍÍeñâÅvÉ‚ž]—Q#&‹à`[¨²ˆD½Zš DÞçˆH+9KDN‘Æ"R_Dj‹H ©´ž†äǸi\ˆåÁ¬p&Pt`ô_È‘5À—ù øRU7z¥«DýR;ãŒ3(Y²¤_ºÄÍüùó9|ø°]²@gWU=,"ó‹‹Jã`#Äp0ÇcU\AD²€¦Xc¿Å1:ºÍ "?‹#²˜eÜ!bÁ>""'¿ú¿ëÒt qD®>&ïXÆÀB`*0WUmg'¿Á T$)´üÁ¯€µ P¤°aÃ6lØà$ìn 5 m/µÆú¤RLˆÈ)@¬gÑh$?¹ Ð5"¹"ò0 øXUmO§Š7f À"K÷ÿ~FàßòJ@`(0Ø."DdˆÔô ¼xiD½ß—BÀjUM8†° ¤„?€ÌÌLZ´ha—,47D$MDÚŠÈ?Dd1Öø¸8ƒÄ&ÿÂ(ô>6ˆÈ½"RÚå2 )„1<$²Ÿÿ*ÖRýïp¶Äïå€ß/Eä+yDD:ˆH+?)qðÈ‘#Ì›7Ï.YXfÕù@ÔÕ d0ÀÑ9€³E$°÷šˆœ,"‘1ÀÀ<à/X«^â£*5€‡5‘Û;”†â‡1<@D²DäAà[`áhç3€»YÀ"2RDºŠˆÛ_!vDÝK•*Åé§Ÿî—.q³téRöïßo—,³ªªÀ: X$)t ,Ö¾ºoˆHU¹IDf`Múc€?'û©GTÇúøZD:­Œ!\„abJ)D¤>ð9ðXKra¤V¬ø€­"òšˆt‹Jòš¨Ÿp-[¶$##üGSB¨(¢ê’ͶmÛüÒ%n®y¾ p¤¿xko?¬ïÔ¦À‡"òïŒ~CH kgMJDäj¬/­¨‡ÜBF%¬C‰S°ŒQ"r…Æ@äÅu7Y<:06GBò†…¨ «*sçFu 7nìÄE´'{HQ&ýdY^à.`ŽˆÔZCðÀ"wøGï`sÀ-äTÄ: 4k›`´ˆ\é¢ï3Ñ$Ãþ¿ÃÉ2ËÿÇ0Ðh ’á€Ã Q®u"©#"w$ñ¤_çËDä² 1Kø×ZCNäpÍ(¬=¿˜ÉÊÊ¢eË–œ{î¹´iÓ†SN9…ŒŒ 233ÉÌÌüù¿ÓÒÒX·n_}õÕϲzõj/ã¹WúE䀈L&SðlgûyŸ ÀÊ•+Ù¾}»]²0-ÿ£ª;Ed9ÖYBI¦s3gÎŒ–äL)¡ªãÉ_DšW¿ÎŽ'X©X±"Í›7çŒ3ÎàÌ3ÏäŒ3ΠR¥J>|˜#GŽpøðáã$;;› °`ÁÖ­‹k¡©"0IDz«ê$—«cHTÕHœ‚õ0ëËʱˆˆ^pÁúâ‹/êŽ;4^8 ‹-Ò‘#GêM7ݤuêÔ‰I8å ÖÙ@•ÛëÕhyW¬XQ ân¿xþùç´Ó‚>z¬ÏFÓ9==]÷îÝëmã¹Àøñã´­mÎVz=†233õ¢‹.Ò‡zH§L™¢6lH¨=¾üòK½óÎ;µZµjñŽç±´•‘Ô‘ÀHVÁÚO{#ÖשS']ºt©zÅÊ•+õñÇ׋/¾X333½6Ž`Ý*¸ ¨é Í¾Ž–ß%—\âY»¸Iß¾}íÚe ‚~z¬}ìžéôéÓ½m<ذaƒ“¾9XíÇïùÀp,ÏžŽ•êÕ«ëu×]§ãÆÓÝ»w{Ò.‡ÒgžyF«V­Ð-Z{IM \dàÞXYÆ uêÔ©ê'{öìÑ &èÀµF^Àà Pâ„ö* äGËãÞ{ïõµ}â¥fÍšvm1ICÐGOàT»çxÿý÷{ÚvnqÊ)§Ø=ƒQúëúWÇÚÒµŸïÙxHKKÓvíÚé?ÿùO]²d‰¯+[{öìÑûï¿_322bÑy/ÐðÄ63’Ú¸É(X>ü8\ýúõ ÅÒêüùóõÎ;ïÔÚµk{m (VšiÀXûÎì~3a„ ›È–œœ'uª!è§… °6šî:tð°õÜ£{÷îvÏ`%PËMîج>¹!ééézÑEé³Ï>«[¶l º‰tþüù±n .åÃÝHjKà $›•MNT™2etÔ¨QF,X C‡õëÜ€yvi6nÜt³Ø2zôh'um«!è«… –+Ú"u/Y²¤Zd,¿¶_ü±¦ÙÙÙúðÃk«V­<Áþãÿºº¶lݺÕI]þ®!è«Ñ+*]‘uèÖ­›wè"^¯X•-[V{÷î­o¿ý¶îÙ³'èê&LAA^sÍ5NëÿG A_5âñ» h’E°¥ÄDß}÷>õÔSÚ¾}{MKKsýe;mÚ´ «h‹Ãûçkúk4ÆF«C… 4?ÿÿÛ»ßØ¬ª;àß3kK«Ã>•-³üIh¢ÑaÜt`T6’Æ fLCÐ̹4BLf 3n Ù†÷ÂÉ3߸™‰d!5% m--« Gñ០Ô"ýÿ´¶¿½xÊÂcÛsò<ç<÷œï'¹¯ü™üîåöÞï=ç>÷Œî@æÉÊ•+ó~^ýõ²fÍyã7dhhÈ÷.æ]¿ÔÔÔØ‹”Hœ¯Ü x-ðÝ@R6­¦?š¥K—&âÂy¥Îœ9#Û¶m“ÚÚZ)--ÍË…·»»Û÷n=ýôÓ¦ýP!Ep¾ê6ëLÿ,ÜÌ“_|1/ç^UU•ÔÕÕÉ[o½%£££¾w«à>üðC)//·96¿"8_¹ðZà»$l–™þXJKKåäÉ“›¾¾>yóÍ7eݺu²`Á‚˾ø^wÝu²uëVß»aeáÂ…¦ýi‘"8_M€;Lÿ./½ôRÁŽc¾œ;wNV­ZuÙç\YY™,Y²D6oÞìü7úÅbÆ 6Çê8Šø…Vny¸øn ²¿Õþ±ÔÕÕ e¿Ò¶}ûvYµj•Ìš5K{ÌyäùôÓO}·l¥··W®ºê*ÓóÏRç«iCv°/tû²bÅŠ‚Ë|«¯¯—ùóçkÿmn»í6yæ™gd÷îÝ288è»eï.\¸ ©TÊ&üJŠàœåV kïŠ}°Üæ‰" ¿awm||\ÚÛÛeÓ¦M²dÉ)++²`ÁihhðÝÞeÙ½{·ÍÅr™Á9k³!»üó´û’”Ÿe^4<<,6løÿ9VUU%«W¯–;v$&dº¶qãF›sú€R)‚s–[þ7%Ù‹MA)¥¼ì2¶Ózê©§ðòË/»i*ÁÑÖÖ†{î¹¥¥¥¾Û¹,Ï?ÿ<^xá]‰˜%"=ŽZº"J©ßؤ«éììÄüùóu”étCCC¸õÖ[}·RôúûûQ]]îînSéZÙê¢'rë¾(rKa¸ù—••á¹çžsÔN²UTTà¾ûîKÜÍÞyçSÉ¿“róŸ`Ü!‹}.:sçÎåÍßÒµ×^‹gŸ}Ö¦ô×…î…ü`Ð{ØTðä“OböìÙ.z!O2™ Z[[Meo»è%Úý<ó´’èò¬]»7Þx£©lŽRê{.ú!·¦11üÿ]ÍŒ3øô¶¶6d2SY¢î–"2`¿®† |X¿~½Mé²B÷Bî1LïNd—OÖš5kPUUå¨òåí·­î“x·ÔöœN§qúôiW½'uuu¨¬¬4•=ä¢r‹`zÆÄûðÃÆ €Å“ð1ù¯‹^ò̘l8 ¾òòr<øàƒ¦²…J)í%Àô´`æÌ™¸ÿþûµB¾Œ¡¹¹ÙT–Ô»ä»Æt qX¶Ìø¼cœ¥äa˜‚Rê;´/½ÔÖÖâꫯvÔùÒÑÑÞÞ^SY"ï’"Òà ®Ærúƒ®¶¶%%%¦2N†`jƤûÐCü[ˆåp’ï’ÚÞ:„óçÏ»ê…<©¬¬Ä½÷Þk*û‘RªÂE?äÀÔ´w÷’’›93 €E8#"G]ôR Ú455¹ê…<²˜˜ì·Q( _¡”ºÀºšÅ‹#•J9êˆ|²‰þ¿D#²_1œßˆƒEø@P&»@™®€Ãÿq8räΞ=k*Kòð?D¤ÀGº¾‡y󿡦¦ÆTö½ “Í5X&eJ8Ë'ßµûÐÞÞŽÁÁAW½G×¶9.ú 7&Óžà˜7ož«^È#‹pÀZ)4íŽŽŽŽbÿ~íG)wÝu—©ä¥Ô·\ôB…Ç0™v ººÚUä™ÅÐw³ˆŒ»è¥ÀŒI‡Óq°¼¾GI)&ӎ̙ðtuuáĉ¦² îŠ"r ÀI] _ŒƒåõÁ@0L¦M· qˆhþÿ"í¾´´´àË/¿tÕ y’J¥lÖà@ .1ñ‘‹›t5 q°ÃÈ.© í à½÷ÞsÕ ydqãE0 ¹Œ` q°˜óÞ?±¤n(Œ;Ì÷âÀ€\Æ¡-€ðõôôàðáæ²†ÿ!"ÿpNWÃ÷â`qã@ riG”Rü@!¢ý8X˜Ð¨ývÇ…Î"ܤ”šá¢*,€\3uÿ1•J¡¼¼ÜU/ä‰Å“îãÁ ¤ã·¡„»ùæ›M% À7´BÆKû¹³‘‘¦|i:sÝ'–Ò ¿@¶)ã§!ÀK{QççPÃgù¶{ˆÃÿð>€>]ß__Ÿö²‹Gñb€\Ú0>>Ž¡¡!W½–¿wò1XDŒS á³—A‚ÀË8¬ÛßâÈ/]d9Ä­}Y.á´wø®®.?~ÜU/äEàE0 ¹Œ'öÀÀ€‹>È‹'Ü&–Ð •ñp l ñ`ÈÅ1ËUï‚þ¿D+€Œ®€ l ñ`¯SIDATÈÅ1Ëuû‰ˆñÇ acˆ@.ã‰ÝÝòèoÜ,çÿc¸ûi÷ñÈ‘#8{ö¬«^ȱžžS @ rCö'.ÓjmmuÔ ¹fñd{jbéÜÐñ=€ˆ8pÀTò¹‹>¨ð.!"ƒ>ÒÕ47‡ø8455™ÊBŸÿ¿¨ À¸®€ LétÚft§ÃE/Tx “iïð---ü"`€:„óçϛʢ¸ë‰H/ y€056Zý•OA`˜LûØ×ׇ×_ÝU/äçÿ'ÑîkGGz{{]õBŽìرÃT2À8G@ÉÀ0™qxÛ¶m.ú ‡,žhωˆvz(0ÚD466Æé°À=z{öì1•íÏD)9¾BDŽèÔÕìÝ»—¿ÀX€¿þ7ãþr ,[¶l±Yîù.z!7¦¦}Ä<þøã\ ét§OŸ6•Eu·‘30a® ކ†lß¾ÝT6àoÚ!G¦ö _CëììÄO À¸>,g€‹È¾¡Âa°$"í~ÀúµYJ¼Øâ» Ÿ$û–ð d—ʦð#{Î/~é,p —ADÒøB&þ`Ÿ€ÙàNm¾{¡‚Föwþ5"²^Dø…³ðg€W@)µÀÏ|À\)¿QôX-";}7Rl”Reþ à—¾{¡+6à¨ðŠˆpŠ32 y¤”ªð]å¾{¡¯í”ˆˆ™Rê3|÷A_‹øÀIõÝ ùÅ@DD!¾@DD!""¢1Eˆ€ˆˆ(B DDDb ""ŠQ„ˆˆˆ"Ä@DD!""¢1Eˆ€ˆˆ(B DDDb ""ŠQ„ˆˆˆ"Ä@DD!""¢1Eˆ€ˆˆ(B DDDb ""ŠÐÿÒn°‰‘.U1IEND®B`‚angband-3.5.1/lib/xtra/font/0000755000175000017500000000000012456456606015132 5ustar chriscchriscangband-3.5.1/lib/xtra/font/8x12xb.fon0000644000175000017500000001106012456456606016670 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ@@t~~ÿ€P ,€ 0€FONTDIR8X12XBFONTRES 100,96,96:8x12xb 9ŒLeon Marrick, 2005. Freeware. Share and enjoy! `` ¼ 0ÿ †8x12xbŒLeon Marrick, 2005. Freeware. Share and enjoy! `` ¼ 0ÿ †zz†’žª¶ÂÎÚæòþ ".:FR^jv‚Žš¦²¾ÊÖâîú*6BNZfr~Š–¢®ºÆÒÞêö&2>JVbnz†’žª¶ÂÎÚæòþ ".:FR^jv‚Žš¦²¾ÊÖâîú   * 6 B N Z f r ~ Š – ¢ ® º Æ Ò Þ ê ö    & 2 > J V b n z † ’ ž ª ¶  Î Ú æ ò þ   " . : F R ^ j v ‚ Ž š ¦ ² ¾ Ê Ö â î ú    * 6 B N Z f r ~ Š – ¢ ® º Æ Ò Þ ê ö    & 2 > J V b n z † ’ ž ª ¶  Î Ú æ ò þ  ".:FR^jv‚Žš¦²¾ÊÖâîú*6BNZfr~Š–¢®ºÆÒÞêö&2>JVbnzÿÿÿÿÿÿÿÿÿÿÿÿî¿÷}ï»þß÷}ßûUú¥ëUîUú¥U@‚D ‚  € € @8|||8<~~~~<6{Õ«~«V,<~Õ«Õ«Õÿ«Õ«Õf<0000 0`0 ~~0  0ff>```lvbbvlF<þ 0`þ 0 0 02LUªUªUªUªUªUª2x00x220ü0x¶`$Z<xØØþØØØÞff><>ff><>ff>(<>ff>$<>ff>(<>ff>þØØîF<``xddx``$ffff>F<8x12xbangband-3.5.1/lib/xtra/font/12x18x.fon0000644000175000017500000002510012456456606016607 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE b † ª Î ò  : ^ ‚ ¦ Ê î  6 Z ~ ¢ Æ ê  2 V z ž  æ  . R v š ¾ â  * N r – º Þ  & J n ’ ¶ Ú þ " F j Ž ² Ö ú  B f Š ® Ò ö  > b † ª Î ò  : ^ ‚ ¦ Ê î  6 Z ~ ¢ Æ ê  2 V z ž Â æ  . R v š ¾ â  * N r – º Þ  & J n ’ ¶ Ú þ " F j Ž ² Ö ú  B f Š ® Ò ö  > b † ª Î ò  : ^ ‚ ¦ Ê î  6 Z ~ ¢ Æ ê  2 V z ž  æ . R v š ¾ â ! *! N! r! –! º! Þ! " &" J" n" ’" ¶" Ú" þ" "# F# j# Ž# ²# Ö# ú# $ B$ f$ Š$ ®$ Ò$ ö$ % >% b% †% ª% Î% ò% & :& ^& ‚& ¦& Ê& î& ' 6' Z' ~' ¢' Æ' ê' ( 2( V(z(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððððððððððððððððð·þwÞû¿í¿öÝÿoý·ÿÛ°ððÐðpÐðàð°ð`ð°ðPðµkµk]ëUîUú¥UëUîUúPð pPàPàPð pPàPàPðHˆ!@@ €"H$€@ € @@ ‚A@‚A@@€@ €@@€ € €€€€????€ÀÀàààÀÀ€:ujÕÿÀ` p°Pð?UÿU* À`ð`À€5jUªÕªÕªÕÿªÕªÕªÕÿÀ `°P°P°Pð°P°P°Pð0@@€€€€€€€€€€€€€ÿÀ ð @€€€€€€€Ö@ °i?    7:`À€€€€€€€ÀÀ€$X À€)6)€@À@€€U$)=kU:@@@@€Àà` $@ ÀÀ @$€@€``€@€€€€€€€€àà€€àà€€€5ddt?d5€À€ÀÀÀ€8ll9 3cA `À€À``À11;>wcas?€€€ `À€ÀÀ`    5{5€À€??ÀÀ??ÀÀ 00ÀÀ€€1`````````1€ÀÀÀÀÀÀÀÀÀ€?À1` 0€ÀÀÀÀ€Àa?ÀÀ€€ÀÀÀÀ€ 1a€€€€€€€€À€€€€````qa?À€ÀÀÀÀ€0```q````1€À€ÀÀÀÀ€ 00ÀÀÀ€1```11```1€ÀÀÀ€€ÀÀÀ€1````1a?€ÀÀÀÀÀÀÀÀÀ€ 0 €€??€€0  0€?q`€ÀÀÀÀ€0-[[[[[[/0€@@@@@@€À1````````€ÀÀÀÀÀÀÀÀÀa```aa```a€ÀÀÀ€€ÀÀÀ€0`````````0€ÀÀ€a`````````a€ÀÀÀÀÀÀÀÀÀ€`````~`````ÀÀ`````~``````À0`````c```1€ÀÀÀÀÀ€````````````ÀÀÀÀÀÀÀÀÀÀÀÀÀ€€aa3À€€€€€€€€€€`acflxxxlfca`À€€À````````````À``pyoff````````àà````````````pxlfca````ÀÀÀÀÀÀÀÀÀÀÀÀÀ11```````11€€ÀÀÀÀÀÀÀ€€a```a``````€ÀÀÀ€11``````f31€€ÀÀÀÀÀÀÀ€€À@a```alfca``€ÀÀÀ€€ÀÀ1``p?`1€À€ÀÀÀÀ€à```````````1ÀÀÀÀÀÀÀÀÀÀÀ€````111ÀÀÀÀ€€€``````ffoyp```````````àà````1111``ÀÀ€€€€ÀÀ``00``ÀÀ€€ 80`ÀÀ€€À00 €€ÀÀ1`€Àÿÿðð??``a>€ÀÀÀÀÀÀÀ`````oq````qo€ÀÀÀÀ€0````0€ÀÀ€1````1ÀÀÀÀÀÀÀÀÀÀÀÀÀ1```0€ÀÀÀ€ ? €@€>a```a>a?ÀÀÀÀÀÀÀÀÀÀ€`````oq``````€ÀÀÀÀÀÀÀ€3€€€€€€€€€€€€00000036<<630À€€À€yfff```Àà``````oq``````€ÀÀÀÀÀÀÀ1````1€ÀÀÀÀ€oq````qo```€ÀÀÀÀ€1````1ÀÀÀÀÀÀÀÀÀÀÀo8000000€À?``>`?€À€ÀÀ€ ? €@€``````q?ÀÀÀÀÀÀÀ ``11ÀÀ€€```foy0`````ààÀ`11`À€€À`````q>`?ÀÀÀÀÀÀÀÀÀÀ€ 0À€À€€€€<gÀÀ€UªUªUªUªUªUªUªUªUªP P P P P P P P P 0000000€@@€  ?l8€@€À 66 ÀÀ00??ÀÀ€€ÀÀ00/ 0€À€@@ÀÀÀ€ <ÿðÀ  @@€@  €@ $J5®__®5J$ €@€ @@ €@€U)ežn‰""D@€`€€`€@ €@@ I&99_//_99&I @À€À @@ À€À@  0008`àÀ1```````€ÀÀÀÀÀÀÀÀ1```````€ÀÀÀÀÀÀÀÀ 1```````€ÀÀÀÀÀÀÀÀ 1```````€ÀÀÀÀÀÀÀÀ1```````€ÀÀÀÀÀÀÀÀ 1```````€ÀÀÀÀÀÀÀÀ3ccccccccccààà0`````````0€ÀÀ€````~`````ÀÀ````~`````ÀÀ ````~`````ÀÀ````~`````ÀÀ€€€€ €€€€€a````üü```a€ÀÀÀÀÀÀÀÀÀ€ ``pxlfca````ÀÀÀÀÀÀÀÀÀÀÀÀ11``````11€€ÀÀÀÀÀÀ€€11``````11€€ÀÀÀÀÀÀ€€ 11``````11€€ÀÀÀÀÀÀ€€ 11``````11€€ÀÀÀÀÀÀ€€11``````11€€ÀÀÀÀÀÀ€€11abddhp11_@€€ÀÀÀÀÀÀ€€``````````1ÀÀÀÀÀÀÀÀÀÀ€``````````1ÀÀÀÀÀÀÀÀÀÀ€ ``````````1ÀÀÀÀÀÀÀÀÀÀ€``````````1ÀÀÀÀÀÀÀÀÀÀ€`00`ÀÀ€€000?100001?000€ÀÀÀÀÀÀ€?a``acfca``ag€ÀÀÀ€€ÀÀÀ€??``a>€ÀÀÀÀÀÀÀ??``a>€ÀÀÀÀÀÀÀ ??``a>€ÀÀÀÀÀÀÀ ??``a>€ÀÀÀÀÀÀÀ ??``a>€ÀÀÀÀÀÀÀ ??``a>€ÀÀÀÀÀÀÀ>gfff;À``àÀ0````0€ÀÀ€1```0€ÀÀÀ€1```0€ÀÀÀ€ 1```0€ÀÀÀ€1```0€ÀÀÀ€€€ € €  ?q````q?€ÀÀÀÀÀÀ€ oq``````€ÀÀÀÀÀÀÀ1````1€ÀÀÀÀ€1````1€ÀÀÀÀ€ 1````1€ÀÀÀÀ€ 1````1€ÀÀÀÀ€1````1€ÀÀÀÀ€1bddh1?@@€€ÀÀÀÀ€``````q?ÀÀÀÀÀÀÀ ``````q?ÀÀÀÀÀÀÀ  ``````q?ÀÀÀÀÀÀÀ ``````q?ÀÀÀÀÀÀÀ `````q>`?ÀÀÀÀÀÀÀÀÀÀ€0000?000?0000€ÀÀÀ€`````q>`?ÀÀÀÀÀÀÀÀÀÀ€12x18xU‹ìÿvÿvštangband-3.5.1/lib/xtra/font/9x15xb.fon0000644000175000017500000002206012456456606016676 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ!@@t~~ÿ€P ,€)0€FONTDIR9X15XBFONTRES 100,100,100:9X15XB 11"Public domain font. Share and enjoy. dd ’ 0 ÿ ‰"9X15XB"Public domain font. Share and enjoy. dd ’ 0 ÿ ‰"z z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î * H f „ ¢ À Þ ü  8 V t ’ ° Î ì ( F d ‚   ¾ Ü ú  6 T r ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô  0 N l Š ¨ Æ ä   > \ z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î  * H f „ ¢ À Þ ü  8 V t ’ ° Î ì  ( F d ‚   ¾ Ü ú  6 T r  ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô ! 0! N! l! Š! ¨! Æ! ä! " " >" \"z"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€Ûþ·ý¿ößÛþ·ý¿÷€€€€€€€€€€€€—þU¯T»Uë–ýU®UºU€€€€€€€€€€$H@"€$H@€€€@€@€€@@€<<>>>???????8lVëÕªÿ€€€>ªÕj4€>UjÕªÕªÕÿªÕªÕªÕ€€€€€€€€€€€€€>AA€€€€€€€€€€€ÿ€€€€€€€€€€€€*A€€€€€€€Õ€€€€€€€€c>   .6<( <(>6kw*TPEIwºW|€"A€€A"€€  €€ üü ÿÿ€€ÿÿ €€ 8`8€€€€pp€€€ss€€ 0`€€€€€?|_p€€ 66666654<5€€€€1{{6 77c€€€w>k  €0€   00`€3aaaaaa3€€€€€€ < ??aa0`€€€€a?€€€€€€3c€``qa?€€€€€€0``qaaa?€€€€ 00€€€?aaa?aaaa?€€€€€€€?aaac?>€€€€€€€    0 00 €€0  0?aa €€€?aaoy{o``?€€€€€€ 3aaaaaa€€€€€€€111?1111€€€€€€€?a``````a?€€11111111€€€€€€€€000>0000€€000>00000€?a```gaaa?€€€€€aaaaaaaaa€€€€€€€€€€? ?c>€acflxxlfca€€`````````€aasmmaaa€€€€€€€€€€aaqymgcaaa€€€€€€€€€€?aaaaaaaa?€€€€€€€€aaa`````€€€?aaaaaamg?€€€€€€€€€aaalfcaa€€€€€?a``?a?€€€€€ €aaaaaaaaa?€€€€€€€€€aaa333 €€€aaaammmm3€€€€€€€€€aa3 3aa€€€€aa3 €€ 0``€€€`00 €>> 3a€ÿ€<??ac?€€€€€€```qaaaq€€€€€?a```a?€€?caaac?€€€€€€€€€€?aa``?€€€~€€?ccc>`?aa?€€€```qaaaaa€€€€€€  ?ccc>```ag|p|ga€€ ?mmmmma€€€€€€qaaaaa€€€€€€?aaaaa?€€€€€qaaaq```€€€€€?caaac?€€€€€€€€€€o910000€€?a`?a?€€€€cccccc?€aa33 €€aammm3€€€€€€a3 3a€€cccccg?c> 0€€  €€ x  x9mg€€UªUªUªUªUªUªUªU€€€€€€€ 31x00x13 |   .6<( <(>6kw*TPEIwºW|€"A€€A"€€>> 88pðððx<<>><8ppp00/߀€€€€€€€€€Ààñûߎ€`pxldlxp```pxlfrxlfb`8X˜˜#w] #w] €€€€€€€€€€€0000€€ 00>0000€€ 00>0000€€6600>0000€€ ? ? ? ? ? ?? ?111}1111€€€€€€€€ aqymgcaaa€€€€€€€€€ ?aaaaaaa?€€€€€€€ ?aaaaaaa?€€€€€€€ ?aaaaaaa?€€€€€€€ ?aaaaaaa?€€€€€€€?aaaaaaa?€€€€€€€?ceeeiiiq?@€€€€€€€€€ aaaaaaaa?€€€€€€€€ aaaaaaaa?€€€€€€€€ aaaaaaaa?€€€€€€€€aaaaaaaa?€€€€€€€€ aa? €€``|~cccc~|``>ccflhlfa/.0 ??ac?€€€€€€ ??ac?€€€€€€ ??ac?€€€€€€ ??ac?€€€€€€66??ac?€€€€€€??ac?€€€€€€??ff?€€€€?a```a?€€0 ?aa``?€€€ ?aa``?€€€ ?aa``?€€€?aa``?€€€0  ?  ? ?66 ?  ?aaaaa?€€€€€€ qaaaaa€€€€€€0 ?aaaaa?€€€€€ ?aaaaa?€€€€€ ?aaaaa?€€€€€ ?qaaaa?€€€€€66?aaaaa?€€€€€?aceiq?@€€€€€€0 cccccc?€ cccccc?€cccccc?€66cccccc?€ cccccg?c>``x|fff|x``66cccccg?c>9X15XBangband-3.5.1/lib/xtra/font/9x15x.fon0000644000175000017500000006516012456456606016544 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<•ƒ@@Œ••€P D€,)0€U)0€~)0€FONTDIR9X15XFONTRES 100,96,96:9X15x 11Ž"Public domain terminal emulator font. Share and enjoy. `` L 0 ÿ ‰"9X15x"Public domain terminal emulator font. Share and enjoy. `` L 0 ÿ ‰"9X15xXŽ"Public domain terminal emulator font. Share and enjoy. dd L 0 ÿ ‰"9X15X¾LHMŽ"Public domain terminal emulator font. Share and enjoy. `` L 0 ÿ ‰"z z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î * H f „ ¢ À Þ ü  8 V t ’ ° Î ì ( F d ‚   ¾ Ü ú  6 T r ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô  0 N l Š ¨ Æ ä   > \ z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î  * H f „ ¢ À Þ ü  8 V t ’ ° Î ì  ( F d ‚   ¾ Ü ú  6 T r  ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô ! 0! N! l! Š! ¨! Æ! ä! " " >" \"z"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€Ûþ·ý¿ößÛþ·ý¿÷€€€€€€€€€€€€—þU¯T»Uë–ýU®UºU€€€€€€€€€€$H@"€$H@€€€@€@€€@@€  ?????UjÕªÕªÕÿªÕªÕªÕ€€€€€€€€€€€€€>AA€€€€€€€€€€€ÿ€€€€€€€€€€€€*A€€€€€€€Õ€€€€€€€€c>   .6( ( 6*6*TPEAuªW<€"A€€A"€€ ??$$€€)) !€€€"""""!#€€ ? €?€ ?€ € €€€€€€    ?€€€€? €€€€€€ !?€? /0 €€€€€€ /0 €€€€?€€€  €€€€€€€ !€€€€€€€ ??€€ €€€ '()& €€€€€€  ? €€€€€€€??€€€€€€€ €€??€€€€€€€€??€€?€ # €€€€€ ? €€€€€€€€€€!€ !"$8($"! €€ ?€ 1**$$ €€€€€€€€€€ 0($"! €€€€€€€€€€ €€€€€€€€? ? €€€ $"€€€€€€€€€? ?$"! €€€€€  €€€€€?€ €€€€€€€€€  €€€ $$$$*€€€€€€€€€    €€€€  €€? ?€€€ €  €€  !€€€€€€ /0 0/€€€€€ €€! !€€€€€€€€€€ ? €€€>€€!!!  €€€ /0 €€€€€€ !!! #,0,# €€ ;$$$$$ €€€€€€/0 €€€€€€ €€€€€/0 0/ €€€€€! !€€€€€€€€€€'€€  €€€?€!!!!!!€  €€ $$$*€€€€€€    €€!!!!!#!??€€ €€88$#€€UªUªUªUªUªUªUªU€€€€€€€1 x x 1|> 0, " ,ÿ0€ ? 0 @€@ 0 ? €*U¾¾¾¾U*€€€€„H(,28V™$BB€€€€Uk¾¾kU€€€€€€€€T|8c>   .6( ( 6*6*TPEAuªW<€"A€€A"€€>> 00ppppx<<~><<80000/߀€€€€€€€€Àðûß„€ 0($$(0 0($2($"  (HH#U #U <$fZÛÛZf$<AA> ? €€€€€€€ ? €€€€€€€  ? €€€€€€€  ? €€€€€€€  ? €€€€€€€ ? €€€€€€€?hȈÿˆˆˆˆ€€€  €€??€€??€€ ??€€ ??€€  ?<?€€€€€€€€ 0($"! €€€€€€€€€€ €€€€€€€ €€€€€€€  €€€€€€€  €€€€€€€  €€€€€€€!""$$((0 €€€€€€€€€ €€€€€€€€ €€€€€€€€ €€€€€€€€ €€€€€€€€  €€ >!!!!> !!"$($"! !€€€€€€ !€€€€€€  !€€€€€€  !€€€€€€  !€€€€€€  !€€€€€€Œ˜˜˜o€€€  €€ ? €€€ ? €€€  ? €€€  ? €€€      !!!!! /0 €€€€€€ €€€€€ €€€€€  €€€€€  €€€€€  €€€€€!"$(0 €€€€€€!!!!!!€!!!!!!€!!!!!!€!!!!!!€!!!!!#! <"""< !!!!!#!9X15x"Public domain terminal emulator font. Share and enjoy. `` L 0 ÿ ‰"z z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î * H f „ ¢ À Þ ü  8 V t ’ ° Î ì ( F d ‚   ¾ Ü ú  6 T r ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô  0 N l Š ¨ Æ ä   > \ z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î  * H f „ ¢ À Þ ü  8 V t ’ ° Î ì  ( F d ‚   ¾ Ü ú  6 T r  ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô ! 0! N! l! Š! ¨! Æ! ä! " " >" \"z"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€Ûþ·ý¿ößÛþ·ý¿÷€€€€€€€€€€€€—þU¯T»Uë–ýU®UºU€€€€€€€€€€$H@"€$H@€€€@€@€€@@€  ?????UjÕªÕªÕÿªÕªÕªÕ€€€€€€€€€€€€€>AA€€€€€€€€€€€ÿ€€€€€€€€€€€€*A€€€€€€€Õ€€€€€€€€c>   .6( ( 6*6*TPEAuªW<€"A€€A"€€ ??$$€€)) !€€€"""""!#€€ ? €?€ ?€ € €€€€€€    ?€€€€? €€€€€€ !?€? /0 €€€€€€ /0 €€€€?€€€  €€€€€€€ !€€€€€€€ ??€€ €€€ '()& €€€€€€  ? €€€€€€€??€€€€€€€ €€??€€€€€€€€??€€?€ # €€€€€ ? €€€€€€€€€€!€ !"$8($"! €€ ?€ 1**$$ €€€€€€€€€€ 0($"! €€€€€€€€€€ €€€€€€€€? ? €€€ $"€€€€€€€€€? ?$"! €€€€€  €€€€€?€ €€€€€€€€€  €€€ $$$$*€€€€€€€€€    €€€€  €€? ?€€€ €  €€  !€€€€€€ /0 0/€€€€€ €€! !€€€€€€€€€€ ? €€€>€€!!!  €€€ /0 €€€€€€ !!! #,0,# €€ ;$$$$$ €€€€€€/0 €€€€€€ €€€€€/0 0/ €€€€€! !€€€€€€€€€€'€€  €€€?€!!!!!!€  €€ $$$*€€€€€€    €€!!!!!#!??€€ €€88$#€€UªUªUªUªUªUªUªU€€€€€€€1 x x 1|> 0, " ,ÿ0€ ? 0 @€@ 0 ? €*U¾¾¾¾U*€€€€„H(,28V™$BB€€€€Uk¾¾kU€€€€€€€€T|8c>   .6( ( 6*6*TPEAuªW<€"A€€A"€€>> 00ppppx<<~><<80000/߀€€€€€€€€Àðûß„€ 0($$(0 0($2($"  (HH#U #U <$fZÛÛZf$<AA> ? €€€€€€€ ? €€€€€€€  ? €€€€€€€  ? €€€€€€€  ? €€€€€€€ ? €€€€€€€?hȈÿˆˆˆˆ€€€  €€??€€??€€ ??€€ ??€€  ?<?€€€€€€€€ 0($"! €€€€€€€€€€ €€€€€€€ €€€€€€€  €€€€€€€  €€€€€€€  €€€€€€€!""$$((0 €€€€€€€€€ €€€€€€€€ €€€€€€€€ €€€€€€€€ €€€€€€€€  €€ >!!!!> !!"$($"! !€€€€€€ !€€€€€€  !€€€€€€  !€€€€€€  !€€€€€€  !€€€€€€Œ˜˜˜o€€€  €€ ? €€€ ? €€€  ? €€€  ? €€€      !!!!! /0 €€€€€€ €€€€€ €€€€€  €€€€€  €€€€€  €€€€€!"$(0 €€€€€€!!!!!!€!!!!!!€!!!!!!€!!!!!!€!!!!!#! <"""< !!!!!#!9X15xXŽ"Public domain terminal emulator font. Share and enjoy. dd L 0 ÿ ‰"z z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î * H f „ ¢ À Þ ü  8 V t ’ ° Î ì ( F d ‚   ¾ Ü ú  6 T r ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô  0 N l Š ¨ Æ ä   > \ z ˜ ¶ Ô ò  . L j ˆ ¦ Ä â   < Z x – ´ Ò ð  , J h † ¤  à þ  : X v ” ² Ð î  * H f „ ¢ À Þ ü  8 V t ’ ° Î ì  ( F d ‚   ¾ Ü ú  6 T r  ® Ì ê  & D b € ž ¼ Ú ø  4 R p Ž ¬ Ê è  $ B ` ~ œ º Ø ö  2 P n Œ ª È æ  " @ ^ | š ¸ Ö ô ! 0! N! l! Š! ¨! Æ! ä! " " >" \"z"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€Ûþ·ý¿ößÛþ·ý¿÷€€€€€€€€€€€€—þU¯T»Uë–ýU®UºU€€€€€€€€€€$H@"€$H@€€€@€@€€@@€  ?????UjÕªÕªÕÿªÕªÕªÕ€€€€€€€€€€€€€>AA€€€€€€€€€€€ÿ€€€€€€€€€€€€*A€€€€€€€Õ€€€€€€€€c>   .6( ( 6*6*TPEAuªW<€"A€€A"€€€üÿ€ÿ€ ?€€€  ?€€? €?? €€€>)€€ ??$$€€)) !€€€"""""!#€€ ? €?€ ?€ € €€€€€€    ?€€€€? €€€€€€ !?€? /0 €€€€€€ /0 €€€€?€€€  €€€€€€€ !€€€€€€€ ??€€ €€€ '()& €€€€€€  ? €€€€€€€??€€€€€€€ €€??€€€€€€€€??€€?€ # €€€€€ ? €€€€€€€€€€!€ !"$8($"! €€ ?€ 1**$$ €€€€€€€€€€ 0($"! €€€€€€€€€€ €€€€€€€€? ? €€€ $"€€€€€€€€€? ?$"! €€€€€  €€€€€?€ €€€€€€€€€  €€€ $$$$*€€€€€€€€€    €€€€  €€? ?€€€ €  €€  !€€€€€€ /0 0/€€€€€ €€! !€€€€€€€€€€ ? €€€>€€!!!  €€€ /0 €€€€€€ !!! #,0,# €€ ;$$$$$ €€€€€€/0 €€€€€€ €€€€€/0 0/ €€€€€! !€€€€€€€€€€'€€  €€€?€!!!!!!€  €€ $$$*€€€€€€    €€!!!!!#!??€€ €€88$#€€UªUªUªUªUªUªUªU€€€€€€€1 x x 1|> 0, " ,ÿ0€ ? 0 @€@ 0 ? €*U¾¾¾¾U*€€€€„H(,28V™$BB€€€€Uk¾¾kU€€€€€€€€T|8c>   .6( ( 6*6*TPEAuªW<€"A€€A"€€>> 00ppppx<<~><<80000/߀€€€€€€€€Àðûß„€ 0($$(0 0($2($"  (HH#U #U <$fZÛÛZf$<AA> ? €€€€€€€ ? €€€€€€€  ? €€€€€€€  ? €€€€€€€  ? €€€€€€€ ? €€€€€€€?hȈÿˆˆˆˆ€€€  €€??€€??€€ ??€€ ??€€  ?<?€€€€€€€€ 0($"! €€€€€€€€€€ €€€€€€€ €€€€€€€  €€€€€€€  €€€€€€€  €€€€€€€!""$$((0 €€€€€€€€€ €€€€€€€€ €€€€€€€€ €€€€€€€€ €€€€€€€€  €€ >!!!!> !!"$($"! !€€€€€€ !€€€€€€  !€€€€€€  !€€€€€€  !€€€€€€  !€€€€€€Œ˜˜˜o€€€  €€ ? €€€ ? €€€  ? €€€  ? €€€      !!!!! /0 €€€€€€ €€€€€ €€€€€  €€€€€  €€€€€  €€€€€!"$(0 €€€€€€!!!!!!€!!!!!!€!!!!!!€!!!!!!€!!!!!#! <"""< !!!!!#!9X15Xangband-3.5.1/lib/xtra/font/12x24x.fon0000644000175000017500000003310012456456606016603 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ!@@t~~ÿ€P ,€J0€FONTDIR12X24XFONTRES 100,100,100:12X24X 17˜4Copyright (c) 1987, 1988 Sony Corp. dd” 0 ÿ ’412X24X˜4Copyright (c) 1987, 1988 Sony Corp. dd” 0 ÿ ’4z z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú : j š Ê ú *! Z! Š! º! ê! " J" z" ª" Ú" # :# j# š# Ê# ú# *$ Z$ Š$ º$ ê$ % J% z% ª% Ú% & :& j& š& Ê& ú& *' Z' Š' º' ê' ( J( z( ª( Ú( ) :) j) š) Ê) ú) ** Z* Š* º* ê* + J+ z+ ª+ Ú+ , :, j, š, Ê, ú, *- Z- Š- º- ê- . J. z. ª. Ú. / :/ j/ š/ Ê/ ú/ *0 Z0 Š0 º0 ê0 1 J1 z1 ª1 Ú1 2 :2 j2 š2 Ê2 ú2 *3 Z3 Š3 º3 ê3 4 J4z4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿððððððððððððððððððððððððÝÿÿ}ïÿþß÷¿ÿýïÿÿwÿÿ»ÿïþð°ððÐððàpðð°ððpðàðpððàðð•*T™v«Mö)öÕi¾%‘jI²ÔkµM©þ`À°pÀ @°`€`pP @ Ð```"„@ €ˆD€@ €@€€€@ €@ €@€€@€@ €@@??????€ÀÀÀÀÀÀ€??€ÀàààÀ€zuêÕÿ`ð°P°P°Pð?Uêÿj5 àP ð°pàÀ€ujÕªÕªÕªÕªÿÿªÕªÕªÕªÕÿÀàP°P°P°P°P°ðð°P°P°P°Pð @€€€€€€€€€€€€€€€€€€ÿ€@@ ð@€€€€€€€€€€é€ ptt y~??°°ðàÀ€€€€€€€€€€€€€À àÀ"Tˆ  @@€6iViVi6€À` ` `À€)OOIvöi€@@@@@@@@@€`Ðð`€$$•@ €@À@€ @•$$€€ @€ @`@ €@ €€??€€À€Àà5DŽõ•®¤®•õŽD5€@ à     à @€ <<<<||~~?€€Ààà??ààÀÀÀÀ€€€9Ïpðððððð€ÀøþÿÿÇ€ðàÀ€@€  €@€@1 dNNÎßÎNNd 1€€À@@```@@À€€ $DD@@€**@À@@@@À@@@@@@@@ss11!B€€€€ÿÿ""""""€€€€€€ààÀÀdÄÄÄÄä|ÄÄdÀ``Àà`````ÀxÌÌÌÌÌy&&FF†ƒ @@€€À`````À!aaacf4,DÆÃÁÁÀa?€€€` `À€À`  @€€€€@@ 0  0 @ Ìí? ?íÌ ÀÀÀÀàà ÿÿàà 0 `@À€€ `@À€€1 `@ÀÀÀÀÀÀÀÀ@` 1€€À@````````@À€€~?À1`@€ @@ÿÿ€À````ÀÀ€ `àà>c?ø€€ÀÀÀ€€Àà````À€ !!AAÿ€€€€€€€€€€€€€€à€€€€à@@@@@_q`@|àÀ€À``````ÀÀ€ 0``ÀÀÏðÀÀÀÀÀÀ``1€À``````ÀÀ€ÿÿÀ€€ àà @€€1 ````09#@ÀÀÀÀ@`€€ÀÀÀÀ€ÀÀ````@À1``ÀÀÀÀÀ@a8€ÀÀ``````à```ÀÀ€ 0``0  `À€€À` ÿÿÿÿàààà@`0  0`@€À``À€0``p0À````àÀ€ `@À—³³³³³³·À@` €À@` `À À  ? @@@@à€€€€ÀÀÀÀ````ðþa``````a~a``````aþ€ÀÀÀÀÀ€€À````À€00```````````00 à` Àüca`````````````acü€ÀÀ`````````ÀÀ€ÿ`````aaccaa`````ÿÀÀ@ @ÀÀÿ`````aaccaa`````ðÀÀ@ 1``ÀÀÀÀÀÀÃÀÀÀÀ``1@ÀÀ@àÀÀÀÀÀÀÀ@ñ````````````````ñàÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀà? ?aáÁÁcà€€€€€€€€€€€€€€€€ñ```abbdh||ffccaa`ñà@€€€€Ààð`````````````````ÿ @ÀÀà``ppqYY[NNNDD@@@@àp`ààà`````````````ðà`pppXXLLFFCCCAA@@àà@@@@@@@@@@@@@ÀÀÀÀ@`@ÀÀÀÀÀÀÀÀÀÀÀÀÀ@`À@`````````````@Àþa```````a~```````ð€À`````À€a@ÀÀÀÀÀÀÀÀÀÀÀÌÒbc€€ÀÀÀÀÀÀÀÀÀÀÀÀÀ€€ àÀþa``````a~baaaaaaað€€ÀÀÀÀ€€€€€€  ÀaÀÀÀÀàp>€Àáž@ÀÀ@€Àà````À€ÿÌŒŒŒ ÀÀ@@@ð````````````````0à@@@@@@@@@@@@@@@@€ð````0000 à@@@@€€€€àÀÀÀÀÀÆÆÆÆÆÏËkkqq11` @@@À€€ð``00  !!@@áà@@€€€€ÀÀàð``000à@@€€€€@@ 00``ÿàÀÀ€€ @ÀÀ À€€À€À@` 0 €€À@` `xx`;`À€À`ÿÿàà<€sAaÁÁÁÁc<€€€€€€€€  À`à````nq`````````qN€ÀÀ`````ÀÀ€1``ÀÀÀÀÀ``1€ÀÀ@€1``ÀÀÀÀÀ``1ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀà1``ÀÿÀÀÀ``0€Àà`à À ÿ ?À``À1```10'@ÀÀ``à€ÀÀÀ€Àà``À`à````oq``````````ñ€ÀÀÀÀÀÀÀÀÀÀà< ?ÃÆ|`à````a`abdhxlfca`ñà€€Àà < ?möffffffffffïÀ```````````pfù``````````ñ€ÀÀÀÀÀÀÀÀÀÀà1`@ÀÀÀÀÀ@`1€À@`````@À€nñ```````qn````ð€À`````À€1`ÀÀÀÀÀ`1@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀà1ó6800000000üÀà`aÀÀà|€ÀàŸ@ÀÀ@€Àà``Àÿ € @€`á`````````3ÀÀÀÀÀÀÀÀÀÀÀÀàð``000à@@€€€àÀÀÆÆÆÎËËQq` ` `ÀÀ€ð`0!@áà@€€Ààð``00 ÈÈpà@@€€€`A 00`ÿàÀ€€ @@À@€€€€€€€€€€€€€€€€€@@ 0000000000000 @8|ǃ `À€UªUªUªUªUªUªUªUªUªUªUªUªP P P P P P P P P P P P 888ÿ8888ÿ888<Àà ÀÀ àÀ L ?ll8€@``À€àà 66 ÀÀ@@@`p9?? `àÀ€ÀÀ8`@`_O@ ?@`?À` €À@ àà```@@€&&7 €€€ÿ ð€?0 @ `ÀÀ€àÀ€€@`0€€€€ÀÀ`  )–oo–) €@€`€€`€@€iq‰c†a`@@@`  ÀàÀ@` f /oo/ f`€€€€À`€€`@€€€€`Dd5@À€tt y~??°°ðàÀ€€€€€€€€€€€€€À àÀ"Tˆ  @@€6iViVi6€À` ` `À€)OOIvöi€@@@@@@@@@€`Ðð`€$$•@ €@À@€ @•$$€€ @€ @`@ €@ €€??€€À€Àà <<<<||~~?€€Ààà??ààÀÀÀÀ€€€9Ïpðððððð€ÀøþÿÿÇ€ðàÀ€@€  €@€@ $DD@@€**@À@@@@À@@@@@@@@1 dNNÎßÎNNd 1€€À@@```@@À€€8p``p9@À€  ? @@@@à€€€€ÀÀÀÀ````ð  ? @@@@à€€€€ÀÀÀÀ````ð   ? @@@@à€€€€ÀÀÀÀ````ð   ? @@@@à€€€€ÀÀÀÀ````ð   ? @@@@à€€€€ÀÀÀÀ````ð   ? @@@@à€€€€ÀÀÀÀ````ð 3##?#cCCCCCãððð00```````````00 à` Àÿ````aaccaa````ÿÀÀ@ @ÀÀÿ````aaccaa````ÿÀÀ@ @ÀÀ ÿ````aaccaa````ÿÀÀ@ @ÀÀÿ````aaccaa````ÿÀÀ@ @ÀÀ? ?? ? ? ?? ?üca```````üü````acü€ÀÀ`````````ÀÀ€ àppXXLLFFCCCAA@@àà@@@@@@@@@@@ÀÀÀÀ@`@ÀÀÀÀÀÀÀÀÀÀÀ@`À@```````````@À`@ÀÀÀÀÀÀÀÀÀÀÀ@`À@```````````@À `@ÀÀÀÀÀÀÀÀÀÀÀ@`À@```````````@À `@ÀÀÀÀÀÀÀÀÀÀÀ@`À@```````````@À `@ÀÀÀÀÀÀÀÀÀÀÀ@`À@```````````@À`@ÁÁÂÂÄÄÈÈÐÐà``Ÿ ÀÀ```````````@Àð``````````````0à@@@@@@@@@@@@@@€ð``````````````0à@@@@@@@@@@@@@@€ ð``````````````0à@@@@@@@@@@@@@@€ ð``````````````0à@@@@@@@@@@@@@@€ð``000à@@€€€€0000?10000001?000000€ÀÀÀÀÀÀÀÀ€þa``````afa``````aæ€ÀÀÀÀÀ€€À````À€sAaÁÁÁÁc<€€€€€€€€  ÀsAaÁÁÁÁc<€€€€€€€€  À"sAaÁÁÁÁc<€€€€€€€€  À,sAaÁÁÁÁc<€€€€€€€€  ÀsAaÁÁÁÁc<€€€€€€€€  ÀsAaÁÁÁÁc<€€€€€€€€  ÀxÍ>gƆ†Æo;Àà 0ð0à1``ÀÀÀÀÀ``1€ÀÀ@€1``ÀÿÀÀÀ``0€Àà`à À1``ÀÿÀÀÀ``0€Àà`à À 1``ÀÿÀÀÀ``0€Àà`à À1``ÀÿÀÀÀ``0€Àà`à À< ?< ?"< ?< ?1`@ÀÀÀÀÀ@`1€À@`````@À€ fù``````````ñ€ÀÀÀÀÀÀÀÀÀÀà1`@ÀÀÀÀÀ@`1€À@`````@À€1`@ÀÀÀÀÀ@`1€À@`````@À€ 1`@ÀÀÀÀÀ@`1€À@`````@À€ 1`@ÀÀÀÀÀ@`1€À@`````@À€1`@ÀÀÀÀÀ@`1€À@`````@À€1`AÂÂÄÄÈHp1N€ ÀÀ@`````@À€`á`````````3ÀÀÀÀÀÀÀÀÀÀÀÀà`á`````````3ÀÀÀÀÀÀÀÀÀÀÀÀà `á`````````3ÀÀÀÀÀÀÀÀÀÀÀÀà`á`````````3ÀÀÀÀÀÀÀÀÀÀÀÀàð``00 ÈÈpà@@€€€€@`@€ ð``00 ÈÈpà@@€€€12X24XW€âangband-3.5.1/lib/xtra/font/8x16x.fon0000644000175000017500000001306012456456606016534 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ@@t~~ÿ€P ,€I0€FONTDIR8X16XXFONTRES 100,96,96:8X16x 12Public domain font, edited by LMarrick. Share and enjoy. `` ,0ÿ Š8X16xPublic domain font, edited by LMarrick. Share and enjoy. `` ,0ÿ ŠzzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú  * : J Z j z Š š ª º Ê Ú ê ú   * : J Z j z Š š ª º Ê Ú ê ú   * : J Z j z Š š ª º Ê Ú ê ú   * : J Z j z Š š ª º Ê Ú ê ú   * : J Z j z Š š ª º Ê Ú ê ú  *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzŠšªºÊÚêú *:JZjzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿ·ý¿ößÛÿ·ý¿öß–ýU¯U»Uë–ýU¯U»Uë€$H@ €$H@ €@€@@@<<<<~~~~~<8\nÖªþ|ªT(BF:@@@\bBBBb\pþžBF:<>BF:<>BF:(<>BF:$<>BF:<>BF:~‰˜˜˜nBBBBB<(\bBBBBBKXerŒ™¦³ÀÍÚçô(5BO\ivƒª·ÄÑÞëø,9FS`mzþþþþþþþþþþþþþî¾ö|îºþÞö|ÞúúTú¤~êTîTú¤~ÔT@‚D ‚  € ˆ @008|||8xüüüüx6zÖª~xüªT(8|ÖªÖªÖþªÖªÖª8D‚‚‚‚‚‚‚‚‚‚þ(D‚‚‚‚‚‚ÖÆ|((\l8 (P8TlT8DT8TüºD‚‚Dðþþ`€`ü€``€üüHHHˆü ü@€8D@à@@D¸(((((|(|((JVbnz†’žª¶ÂÎÚæòþ ".:FR^jv‚Žš¦²¾ÊÖâîú   * 6 B N Z f r ~ Š – ¢ ® º Æ Ò Þ ê ö    & 2 > J V b n z † ’ ž ª ¶  Î Ú æ ò þ   " . : F R ^ j v ‚ Ž š ¦ ² ¾ Ê Ö â î ú    * 6 B N Z f r ~ Š – ¢ ® º Æ Ò Þ ê ö    & 2 > J V b n z † ’ ž ª ¶  Î Ú æ ò þ  ".:FR^jv‚Žš¦²¾ÊÖâîú*6BNZfr~Š–¢®ºÆÒÞêö&2>JVbnzÿÿÿÿÿÿÿÿÿÿÿÿî¿÷}ï»þß÷}ßûUú¥ëUîUú¥U@‚D ‚  € ˆ @8|||8<~~~~<6{Õ«~«V,<~Õ«Õ«Õÿ«Õ«ÕBF:@@@\bBBb\pþž"@@@@@"~@@x@@~~@@x@@~$~@@x@@~$~@@x@@~ 8888(88(88xDBBòBBDx(BbRJFBB$BBB$$BBB$$$BBB$($BBB$$$BBB$$FJZRb$XBBBBBB<BBBBBB<$BBBBBB<$BBBBBB<‚D(@@xDDDx@@@8DDXPHDX<>BF:<>BF:<>BF:(<>BF:$<>BF:(<>BF:þ ˜˜nJVbnz†’žª¶ÂÎÚæòþ ".:FR^jv‚Žš¦²¾ÊÖâîú   * 6 B N Z f r ~ Š – ¢ ® º Æ Ò Þ ê ö    & 2 > J V b n z † ’ ž ª ¶  Î Ú æ ò þ   " . : F R ^ j v ‚ Ž š ¦ ² ¾ Ê Ö â î ú    * 6 B N Z f r ~ Š – ¢ ® º Æ Ò Þ ê ö    & 2 > J V b n z † ’ ž ª ¶  Î Ú æ ò þ  ".:FR^jv‚Žš¦²¾ÊÖâîú*6BNZfr~Š–¢®ºÆÒÞêö&2>JVbnzüüüüüüüüüüüü¼ìü¼øì¼ô|üì¸Tì\ô¬XìT¼ô\è@@@€D @ € @ 000xx00xxx00xÔ¬üpø¨P 0X¬Ô¬ÔüÔ¬Ô¬ü0H„„„„„„„„„ü0„„„„„ÌxXx000x0(P pبp HP8xè ˆˆˆˆPøøˆˆˆˆpøøˆˆˆP øøˆˆ¨¨PøøˆP PˆøøˆˆˆP @øøøp@ø PˆP øø€@ øøà àøø Pˆ PPPPøPPøP p¨ p(¨p øÈ @˜˜@  @¨h``À €@ @€ ¨p p¨ ø ``Àø`` @€pˆ˜¨Èˆp ` ppˆ @øpˆ0ˆp0Pøø€ðˆp0@€ðˆˆpø pˆˆpˆˆppˆˆx`````````À @ øø@  @pˆ pˆ¸¨¸€ppˆˆøˆˆˆðˆˆðˆˆðpˆ€€€ˆpðHHHHHðø€€ð€€øø€€ð€€€pˆ€€˜ˆpˆˆˆøˆˆˆp pˆpˆ À ˆ€€€€€€øˆØ¨ˆˆˆˆˆˆÈ¨˜ˆˆpˆˆˆˆˆpðˆˆð€€€pˆˆˆ¨hðˆˆð ˆpˆ€pˆpø ˆˆˆˆˆˆpˆˆˆˆPP ˆˆˆˆ¨ØˆˆˆP PˆˆˆˆP øø@€ø8 8€@ à à Pˆø00pxˆx€€ðˆˆˆðpˆ€€xxˆˆˆxpˆð€p0H@à@@@pˆˆˆxp€€ðˆˆˆˆ ˆp€€ˆàˆ Ш¨¨¨°Èˆˆˆpˆˆˆpðˆˆˆð€€pˆˆˆx°È€€€x€pð ø ˆˆˆˆpˆˆˆP ˆˆ¨¨PˆP PˆˆˆˆP @€øp@ø  €@@@ @@@€h°T¨T¨T¨T¨T¨T¨ 0h@@ð@ð@@h0(( p `¸@ p¨p ˆP p p 8@€pˆpà 0°h` `ü 0`0`@@€€@@`0`0P¨¨P¨¨P¨¨PˆPPä8`¸   ˆppP¨Pppˆ ¨øp xXx000x0(P pبp HP8xè ˆˆˆˆP p pø @@``` `@``p0xx000 ``@@`  \ü¸€ÀìøÐ€@`P`@@@@@`PH`PH@ ((0`   X¨X¨pøˆ¨¨¨¨ˆøp @ˆp@ pˆˆøˆˆ pˆˆøˆˆ0Hpˆˆøˆˆ(PpˆˆøˆˆPpˆˆøˆˆP pˆˆøˆˆx  ¸à ¸pˆ€€€ˆp p ø€ð€€ø@ ø€ð€€ø Pø€ð€€øPø€ð€€ø@ p p p p Pp pPp pðˆˆèˆˆðPˆÈ¨˜ˆˆ@ pˆˆˆˆp pˆˆˆˆp Ppˆˆˆˆp(PpˆˆˆˆpPpˆˆˆˆpp˜¨¨¨Èp€@ ˆˆˆˆˆp ˆˆˆˆˆppˆˆˆˆˆpPˆˆˆˆˆp ˆP €€€ðˆˆˆð€€€` ˆˆˆ°@ pxˆx pxˆx Ppxˆx(PpxˆxPpxˆxP pxˆxh|lpˆ€€x p@ pˆð€p pˆð€p Ppˆð€pPpˆð€p@  P P (xˆˆˆp@ pˆˆˆp pˆˆˆp Ppˆˆˆp(PpˆˆˆpPpˆˆˆpp˜¨Èp€@ ˆˆˆˆp ˆˆˆˆp PˆˆˆˆpPˆˆˆˆp ˆˆˆP @€@@pHp@@@6X12XšI¶ÿangband-3.5.1/lib/xtra/font/6x13x.fon0000644000175000017500000001146012456456606016531 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<}ƒ@@t}}þ€P ,€0€FONTDIR6X13XFONTRES 100,100,100:6x13x 9ŒPublic domain font. Share and enjoy. dd o ÿ ‡6x13xŒPublic domain font. Share and enjoy. dd o ÿ ‡zz‡”¡®»ÈÕâïü #0=JWdq~‹˜¥²¿ÌÙæó '4AN[hu‚œ©¶ÃÐÝê÷+8ER_ly†“ ­ºÇÔáîû"/<IVcp}Š—¤±¾ËØåòÿ  & 3 @ M Z g t  Ž › ¨ µ  Ï Ü é ö    * 7 D Q ^ k x … ’ Ÿ ¬ ¹ Æ Ó à í ú   ! . ; H U b o | ‰ – £ ° ½ Ê × ä ñ þ   % 2 ? L Y f s €  š § ´ Á Î Û è õ    ) 6 C P ] j w „ ‘ ž « ¸ Å Ò ß ì ù  -:GTan{ˆ•¢¯¼ÉÖãðý $1>KXerŒ™¦³ÀÍÚçô(5BO\ivƒª·ÄÑÞëø,9FS`mzüüüüüüüüüüüüüø¼ìü¼øì¼ô|üì¸ìTìXô¬XìT¼ô\è@@@€D @ € @ 000xx00xxx00xT¬øðpø¨P 0xܬԬÔüÔ¬Ô¬ü0H„„„„„„„„„„ü0H„„„„„ÌxXx000x0(P pبp HP8xè ˆˆˆˆP < à üü  @ ø€@  @€øøPPPø ø€0H@ð ð¨à PPPPPøPøPP p  p((p H¨P @P¨@  @ ˜h0 @ @@@ @  @ ¨øpø¨ ø 0 @ø p  @@€€ PˆˆˆˆˆP `  øpˆˆ @€øø pˆp0PPøø€€°Èˆppˆ€€ðˆˆˆpø @@@pˆˆˆpˆˆˆppˆˆˆxˆp p p p 0 @ @€@ øø€@  @€pˆˆ pˆˆ˜¨¨°€x PˆˆˆøˆˆˆðHHHpHHHðpˆ€€€€€ˆpðHHHHHHHðø€€€ð€€€øø€€€ð€€€€pˆ€€€˜ˆˆpˆˆˆˆøˆˆˆˆp p8`ˆˆ À ˆˆ€€€€€€€€øˆˆØ¨¨ˆˆˆˆˆÈȨ¨˜˜ˆˆpˆˆˆˆˆˆˆpðˆˆˆð€€€€pˆˆˆˆˆˆ¨pðˆˆˆð ˆˆpˆ€€pˆpø ˆˆˆˆˆˆˆˆpˆˆˆˆPPP ˆˆˆˆ¨¨¨ØˆˆˆPP PPˆˆˆˆPP ø @@€øp@@@@@@@p€€@@ pp Pˆø0pxˆˆx€€€ðˆˆˆˆðpˆ€€ˆpxˆˆˆˆxpˆø€ˆp0H@@ð@@@@pˆˆˆxˆp€€€°Èˆˆˆˆ ` p0`€€€ À ˆ` pШ¨¨¨ˆ°Èˆˆˆˆpˆˆˆˆpðˆˆˆð€€€xˆˆˆx°È€€€€pˆ`ˆp@@ð@@@H0ˆˆˆˆ˜hˆˆˆPP ˆˆ¨¨¨PˆP Pˆˆˆˆ˜hˆpø @€ø À  À  ÀH¨¨T¨T¨T¨T¨T¨T¨ 0h@@ð@ð@@h0(( p `¸@ p¨p ˆP p p 8@€ðˆxà 0°h` `ü 0`0`@@€€@@`0`0P¨¨P¨¨P¨¨PˆPPä8`¸   ˆppP¨Pppˆ ¨øp xXx000x0(P pبp HP8xè ˆˆˆˆP p pø @@@``` `@``p0xxx000 ``@@`  \ü¸€ÀìøÐ€@`PHP`@@@@@`PH`PH@ ((0`   X¨X¨pøˆ¨¨¨¨ˆøp @€ˆˆp@ Pˆˆøˆˆˆ Pˆˆøˆˆˆ P Pˆˆøˆˆˆ(P PˆˆøˆˆˆP PˆˆøˆˆˆP Pˆˆøˆˆˆx   ø  ¸pˆ€€€€ˆp p ø€€ð€€€ø@ ø€€ð€€€ø Pø€€ð€€€øPø€€ð€€€ø@ p p p p Pp pPp pðHHHhHHHðPˆÈȨ¨˜˜ˆˆ@ pˆˆˆˆˆˆp pˆˆˆˆˆˆp Ppˆˆˆˆˆˆp(PpˆˆˆˆˆˆpPpˆˆˆˆˆˆpp˜¨¨¨¨Èp€@ ˆˆˆˆˆˆˆp ˆˆˆˆˆˆˆppˆˆˆˆˆˆˆpPˆˆˆˆˆˆˆp ˆˆPp €€€ðˆˆˆð€€€` ˆˆˆ°@ pxˆˆx @pxˆˆx Pˆpxˆˆx(PpxˆˆxPpxˆˆxˆP pxˆˆxø(x  xpˆ€€ˆp p@ pˆø€ˆp @pˆø€ˆp Pˆpˆø€ˆpPpˆø€ˆp€@ ` p @` p Pˆ` pP` p @ xˆˆˆˆp@ pˆˆˆˆp @pˆˆˆˆp Pˆpˆˆˆˆp(PpˆˆˆˆpPpˆˆˆˆpp˜¨¨Èp€ @ˆˆˆˆ˜h@ ˆˆˆˆ˜h Pˆˆˆˆˆ˜hPˆˆˆˆ˜h @ˆˆˆ˜hˆp@@@pHp@@@6x13xangband-3.5.1/lib/xtra/font/6x13xb.fon0000644000175000017500000001146012456456606016673 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ @@t~~ÿ€P ,€0€FONTDIR6X13XBFONTRES 100,100,100:6X13XB 9Public domain font. Share and enjoy. dd À 0ÿ ‡6X13XBPublic domain font. Share and enjoy. dd À 0ÿ ‡zz‡”¡®»ÈÕâïü #0=JWdq~‹˜¥²¿ÌÙæó '4AN[hu‚œ©¶ÃÐÝê÷+8ER_ly†“ ­ºÇÔáîû"/<IVcp}Š—¤±¾ËØåòÿ  & 3 @ M Z g t  Ž › ¨ µ  Ï Ü é ö    * 7 D Q ^ k x … ’ Ÿ ¬ ¹ Æ Ó à í ú   ! . ; H U b o | ‰ – £ ° ½ Ê × ä ñ þ   % 2 ? L Y f s €  š § ´ Á Î Û è õ    ) 6 C P ] j w „ ‘ ž « ¸ Å Ò ß ì ù  -:GTan{ˆ•¢¯¼ÉÖãðý $1>KXerŒ™¦³ÀÍÚçô(5BO\ivƒª·ÄÑÞëø,9FS`mzüüüüüüüüüüüüüø¼ìü¼øì¼ô|üì¸ìTìXô¬XìT¼ô\è@@@€D @ € @000xx00xxx00xxxx00xxÔ¬øøpøø¨P 0xܬԬÔüÔ¬Ô¬ü0H„„„„„„„„„„ü0H„„„„„ÌxXx000x0(xP pøØ¨p hXP0xøè ˆˆˆˆP000000<<00000000000ðð00000000000üüüü000000000000000000 0`0 üÀ`00`ÀüüxxxØ ü0üÀ8l`ø`ðxÀ000000000xxxxxüxüxx0xðxf<0000 0`0 ~~0  0F>``|fff|>```>>fff>ff><``lvfff8<  L8``flxlf8<ÆîþÖÆlvfffff>\2000>p<|00x000fffn6ÆÆl8ÆÖþîÆÌx0xÌfff><~ 0~ 0 0 02LUªUªUªUª8dø`ød820ü0x¶@$Z<XØþØØÞ|ÀÀÀ|~`x`~~`x`~~`x`~$~`x`~<<<<<<$<<øÌFöFÌø(æöÞÎÆ<``|f|``$ff><8X8xbangband-3.5.1/lib/xtra/font/5x8x.fon0000644000175000017500000000706012456456606016455 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<|ƒ@@t||ý€P ,€É0€FONTDIR5X8XFONTRES 100,96,96:5x8x 6† BitmapMania and Leon Marrick. Freeware. Share and enjoy! ``ÿ ‚ 5x8x† BitmapMania and Leon Marrick. Freeware. Share and enjoy! ``ÿ ‚ zz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú    " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z øøøøøøøø¸ðØxèø¸è¨Ð°X¨Ð°X@ €@€@@ ` pp `ðð`pØxèp¨P p¨Ø¨Ø¨ØøpˆˆˆˆˆˆøPˆˆˆØØp0p0p P PpP `Pð¸P@ PPPPøPøPP p p(p @P P@ @° P @ @@@@  `ð` ø @ð  @@`` ` ` @€ð` `   ð ð€àà`à`ð @@````p` @ @ pp@  @``@0H˜¨¨@0pðàààp€€€€pààp€à€€ðp€à€€€p€°pðp p0àà€€€€€ðððа``àà€€`аpààp€@ àø ` À€ðð``p`ð @€ð`@@@@`@@ 00 Pø pp€€ààp€€ppp`°Àp0@à@@@pp`€€à ` p ` @€€à` p𨨨à``àà€€pp°À€€pÀ0à@p@@0p``¨¨¨x``p`ð @ð @  @  @P ¨P¨P¨P¨P 0Hà@àH0 P@à@°P¨p¨PPPø ø 0@`P0` `0 @ð  `0 @@ 0`  P¨p¨P  @P ` P¨p¨P @`€`@ pð @pð`pðP pðPpð`pðX  ø ¸p€€€p @@ p€à€ð @p€à€ð`p€à€ðPp€à€ð@ p p p p`p pPp pàÐàP Ð°@ `` @`````P ````(PPpP @ ` @```` @p`€€à°à€€`à @ pp @pp PppP ppPpp`ppÐ8àØp€p @@ `°Àp @`°Àp P`°ÀpP`°Àp @ P P  @ p`P à@ `` @`` P``P `````°Ð`€@ p @p Ppp @p`€À À€€p`5x8x€€?€ý€Áangband-3.5.1/lib/xtra/font/8x13x.fon0000644000175000017500000001146012456456606016533 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ@@t~~ÿ€P ,€0€FONTDIR8X13XXFONTRES 100,96,96:8X13XX 10Public domain font. Share and enjoy. `` V 0ÿ ‡8X13XXPublic domain font. Share and enjoy. `` V 0ÿ ‡zz‡”¡®»ÈÕâïü #0=JWdq~‹˜¥²¿ÌÙæó '4AN[hu‚œ©¶ÃÐÝê÷+8ER_ly†“ ­ºÇÔáîû"/<IVcp}Š—¤±¾ËØåòÿ  & 3 @ M Z g t  Ž › ¨ µ  Ï Ü é ö    * 7 D Q ^ k x … ’ Ÿ ¬ ¹ Æ Ó à í ú   ! . ; H U b o | ‰ – £ ° ½ Ê × ä ñ þ   % 2 ? L Y f s €  š § ´ Á Î Û è õ    ) 6 C P ] j w „ ‘ ž « ¸ Å Ò ß ì ù  -:GTan{ˆ•¢¯¼ÉÖãðý $1>KXerŒ™¦³ÀÍÚçô(5BO\ivƒª·ÄÑÞëø,9FS`mzÿÿÿÿÿÿÿÿÿÿÿÿÿî¿÷}ï»þß÷}ßûûUú¥ëUîUú¥UU@‚D ‚  € ˆ @8|||8<~~~~<6{Õ«~«V,<~Õ«Õ«Õÿ«Õ«Õ«BF:@@@\bBBb\pþž"@@@@@@"~@@x@@~~@@x@@~$~@@x@@~$~@@x@@~ 8888(88(88xDBBòBBDx(BBbRJFBB$BBB$$BBB$$$BBB$($BBB$$$BBB$$FJZRb$XBBBBBBB<BBBBBBB<$BBBBBBB<$BBBBBBB<‚D(@@xDDDx@@@@8DDXPHDDX<>BF:<>BF:<>BF:(<>BF:$<>BF:(<>BF:þ ˜˜n€€€€€€€`````nsaaaasn€€€€1````1€€3aaaa3€€€€€€€€€€€€€3a``1€€€~€€>cccc>`?aaa?€€€€€`````nsaaaaaa€€€€€€ < €aa3€€€€€€€€€€€€`````cflx|ngc€< €[mmmmmm€€€€€€€nsaaaaaa€€€€€€3aaaa3€€€€nsaaaasn````€€€€3aaaa3€€€€€€€€€€€€o9000000€?a`?a?€€€€~€aaaaaa3€€€€€€€€aa33 €€aaammm3€€€€€€€a3 3a€€aaaaaa3a3€€€€€€€€€€ 0`€€ x €€ x  x€9mg€€UªUªUªUªUªUªUªUªUªUª@€@€@€@€@€@€@€@€@€@€ 1```þ```þ```1€€€€~|Vs€€À€mm€€@aa33 ? ? €€€ 1```~a!?Aa?€€€€€€€ ,.:8ÿÀ 80 `À€À@` 08 €I*”k]¾¾]k”*I€€€€¡j2 k¹?i’%%%I€€€€@€R!?-s¿^^¿s-?!R€€@€€@€€Ik>s?  /5€(P €3mRms- €€€€ " *J)3;m;Õk5€€€€I*€A€AÁA€A€*I€€€€€ ? ? ? €€ 888888x||~?€€???<<<<88€€3ß@ÀÀÀÀÀÀ€ðüþÿÏÀ€ 0,"!",0  (HH#U #U "k]]ÝÿÝ]]k"€€€ 0```aq?€€€ 33aaaaaaa€€€€€€€€ 33aaaaaaa€€€€€€€€  33aaaaaaa€€€€€€€€  33aaaaaaa€€€€€€€€ 33aaaaaaa€€€€€€€€ 33aaaaaaa€€€€€€€€?fÆÆÆÆÆÿÆÆÆÆÆÆÇÀÀÀ3a```````a3€€````~````€€````~````€€ ````~````€€````~````€€ €€ €€  €€ €€~caaaaùùaaac~€€€€€€€€ aqyymmggccaa€€€€€€€€€€€€3aaaaaaaa3€€€€€€€€3aaaaaaaa3€€€€€€€€ 3aaaaaaaa3€€€€€€€€ 3aaaaaaaa3€€€€€€€€3aaaaaaaa3€€€€€€€€3cceeiiqq3^€€€€€€€€€aaaaaaaaaa3€€€€€€€€€€aaaaaaaaaa3€€€€€€€€€€ aaaaaaaaaa3€€€€€€€€€€aaaaaaaaaa3€€€€€€€€€€aa33 €€000gcacgnlfcaacn€€?a?aaa>€€€€€€€?a?aaa>€€€€€€€ ?a?aaa>€€€€€€€ ?a?aaa>€€€€€€€?a?aaa>€€€€€€€ ?a?aaa>€€€€€€€L ?lll?€€€€€1````1€€3a``1€€€3a``1€€€ 3a``1€€€3a``1€€€< €< €< €< €((3aaaa3€€€€ nsaaaaaa€€€€€€3aaaa3€€€€3aaaa3€€€€ 3aaaa3€€€€ 3aaaa3€€€€3aaaa3€€€€3ceiq3^€€€€€aaaaaa3€€€€€€€€aaaaaa3€€€€€€€€ aaaaaa3€€€€€€€€aaaaaa3€€€€€€€€aaaaaa3a3€€€€€€€€€€0000>?111?>0000€€€aaaaaa3a3€€€€€€€€€€10X20xangband-3.5.1/lib/xtra/font/10x14xb.fon0000644000175000017500000002106012456456606016744 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<ƒ @@t€P ,€ 0€FONTDIR10X14XBFONTRES 100,96,96:10X14XB 11 Leon Marrick, 2005. Freeware. Share and enjoy! `` ¼ 0 ÿ ˆ 10X14XB Leon Marrick, 2005. Freeware. Share and enjoy! `` ¼ 0 ÿ ˆ z z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î & B ^ z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î  & B ^ z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î  & B ^ z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î & B ^ z ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÝ÷ö¿íÿ{ßþwßýïÀ@ÀÀ€ÀÀ@ÀÀÀ@À€UºmßUúU»U¾ißUú@€@À@€@€@€@À@À"€ @„ ˆ €@€€@€@ ˆ@€ @€@ >>>>>zÕª€À@ÀÀ?UÿU+ €À€kUªÕªÕÿªÕªÕªÿ€€À@À@ÀÀ@À@ÀÀa@€€€€€€€€€€ÿ€€@@@@@@@@@@À !@€€€€€Þ€@@@@@ÀR?  -?€ (P5+5+ DI*2]jÕú€€€"€AÀA€"€€€  3333333333€€€€>khx> k>1k[6 65c€€€€€€€€€€  00 0  0?aa €€€aZ¶¶¶·^a€€€€€ 3aaaaaa€€€€€€€aaaaaaa€€€€€€€1``````1€€~caaaaaac~€€€€€€```~````€€```~`````€1```gaa3€€€€aaaaaaaaa€€€€€€€€€€ c>€acflxxlfca€€`````````€aasmmaaaa€€€€€€€€€€aaqymgcaaa€€€€€€€€€€3aaaaaa3€€€€€€aaa`````€€€3aaaaam7€€€€€€€aaalfcaa€€€€€?a``?a?€€€€€ €aaaaaaaaa?€€€€€€€€€aaa333 €€€aaaammsaa€€€€€€€€€€aa3 3aa€€€€aa3 €€ 0``€€€`00 €>> 3a€ÿÀ ??ac=€€€€€€```oqaaaqo€€€€€?a```a?€€=caaac=€€€€€€€€€€?aa``?€€€~=ccc>`?a?€€```oqaaaaa€€€€€€  ?#```ag|p|ga€€ ?smaaa€€€€€€oqaaaaa€€€€€€?aaaaa?€€€€€oqaaaqo``€€€€€=caaac=€€€€€€€€€o910000€€?a`?a?€€€~cccccc=€aa33 €€aaam3€€€€€€a3 3a€€aaaaac=?€€€€€€€€ 0€€0 8  88L€UªUªUªUªUªUªUª@€@€@€@€@€@€@€ 0|00|0~<[0kk@a3 ? ? €€ 00~Gp>A>€€€€€ ,€  0 @@ 0  A*kœ>œk*A€€ J$TÌ<d*I€€"”U*Ý>Ý*U”"€€€€ 0`cc> 3aaaaa€€€€€€ 3aaaaa€€€€€€  3aaaaa€€€€€€  3aaaaa€€€€€€ 3aaaaa€€€€€€ 3aaaaa€€€€€€6ffffffg€€€1`````` €€```~```€€```~```€€ ```~```€€```~```€€     ~caaaýaac~€€€€€€ aaqymgcaa€€€€€€€€€3aaaaa3€€€€€3aaaaa3€€€€€ 3aaaaa3€€€€€ 3aaaaa3€€€€€3aaaaa3€€€€€3ceeiiq3^€€€€€€€aaaaaaaa?€€€€€€€€aaaaaaaa?€€€€€€€€ aaaaaaaa?€€€€€€€€aaaaaaaa?€€€€€€€€aa3 €€```~cccc~```>ccflfcccn??ac=€€€€€€??ac=€€€€€€ ??ac=€€€€€€ ??ac=€€€€€€??ac=€€€€€€  ??ac=€€€€€€ =oll7€€€?a```a? €€?aa``?€€€?aa``?€€€?aa``?€€€?aa``?€€€ ? ? ? ?  ?aaaaa?€€€€€ oqaaaaa€€€€€€?aaaaa?€€€€€?aaaaa?€€€€€ ?aaaaa?€€€€€ ?aaaaa?€€€€€?aaaaa?€€€€€?cemiq?@€€€€€€cccccc=€cccccc=€cccccc=€"cccccc=€aaaaac=?€€€€€€€€```|bbb|``!aaaaac=?€€€€€€€€10X14XBangband-3.5.1/lib/xtra/font/10x14x.fon0000644000175000017500000002106012456456606016602 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ@@t~~ÿ€P ,€ 0€FONTDIR10X14XFONTRES 100,96,96:10X14X 11Ž Leon Marrick, 2005. Freeware. Share and enjoy! `` , 0 ÿ ˆ 10X14XŽ Leon Marrick, 2005. Freeware. Share and enjoy! `` , 0 ÿ ˆ z z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î & B ^ z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î  & B ^ z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î  & B ^ z – ² Î ê  " > Z v ’ ® Ê æ   : V r Ž ª Æ â þ  6 R n Š ¦ Â Þ ú  2 N j † ¢ ¾ Ú ö  . J f ‚ ž º Ö ò  * F b ~ š ¶ Ò î & B ^ z ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÝ÷ö¿íÿ{ßþwßýïÀ@ÀÀ€ÀÀ@ÀÀÀ@À€UºmßUúU»U¾ißUú@€@À@€@€@€@À@À"€ @„ ˆ €@€€@€@ ˆ@€ @€@ >>>>>zÕª€À@ÀÀ?UÿU+ €À€kUªÕªÕÿªÕªÕªÿ€€À@À@ÀÀ@À@ÀÀa@€€€€€€€€€€ÿ€€@@@@@@@@@@À !@€€€€€Þ€@@@@@ÀR?  -?€ (P5+5+ DI*2]jÕú€€€"€AÀA€"€€€€€>IH> I>!RR$%%B""$"!#€€66 €>AAAAAAAA>(>>AA @A> "B@@^aA>!@@^aAAA> >AAA>AAAA>>AAAC=B<   >AAaZ¦¤¤¥^a€€€€€"AAAAAA~AAA~AAAA~!@@@@@@!|BAAAAAAB|@@@x@@@@@@@x@@@@@!@@@GAA"AAAAAAAAA>>B<ABDHpPHDBA@@@@@@@@@AAcUIIAAAAAAaQIECAAA"AAAAAA"~AAA~@@@@@"AAAAAI&~AAA~HDBAA>A@@8A>AAAAAAAAA>AAA"""AAAAIIUcAAAA""AAAA" @@@ "AÿÀ >?AC=@@@^aAAAa^>A@@@A>=CAAAC=>AA@@>|=BBB<@>A>@@@^aAAAAA>B<@@@AFX`XFA>vIIIAAA^aAAAAA>AAAAA>^aAAAa^@@=CAAAC=N1 >A@>A>|BBBBBB=AA""AAAIII6A""A!!!!!# 0000L€UªUªUªUªUªUªUª@€@€@€@€@€@€@€ | | ~>00~Gp>A>€€€€€ ,€  0 @@ 0  A*kœ>œk*A€€ J$TÌ<d*I€€ˆUk>]¾]>kUˆ€€€!!"AAAAAA"AAAAAA"AAAAAA "AAAAAA"AAAAAA"AAAAAA$DDDDDDG€€€!@@@@@@!@@@|@@@@@@|@@@ @@@|@@@@@@|@@@>>>>>>>>>! | !>€€€€€€ AAaQIECAA"AAAAA""AAAAA" "AAAAA" "AAAAA""AAAAA""CEIIQa"\AAAAAAAA>AAAAAAAA> AAAAAAAA>AAAAAAAA>AA" >!!!!> !!&($"!!.>?AC=>?AC=>?AC= >?AC=>?AC=>?AC=A@@@A>>AA@@>>AA@@>>AA@@>>AA@@>>>>>>AAAAA> ^aAAAAA>AAAAA>>AAAAA> >AAAAA> >AAAAA>>AAAAA>>CEIQa>@BBBBBB=BBBBBB=BBBBBB=$BBBBBB=!!!!!# <""< !!!!!#10X14Xangband-3.5.1/lib/xtra/font/6x10x.fon0000644000175000017500000001006012456456606016521 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<}ƒ@@t}}þ€P ,€é0€FONTDIR6X10XFONTRES 100,96,96:6x10x 8‰W. Sheldon Simms III & Leon Marrick, 2005. Freeware. ``, 0ÿ „6x10x‰W. Sheldon Simms III & Leon Marrick, 2005. Freeware. ``, 0ÿ „zz„Ž˜¢¬¶ÀÊÔÞèòü$.8BLV`jt~ˆ’œ¦°ºÄÎØâìö (2<FPZdnx‚Œ– ª´¾ÈÒÜæðú",6@JT^hr|†š¤®¸ÂÌÖàêôþ&0:DNXblv€Š”ž¨²¼ÆÐÚäîø    * 4 > H R \ f p z „ Ž ˜ ¢ ¬ ¶ À Ê Ô Þ è ò ü    $ . 8 B L V ` j t ~ ˆ ’ œ ¦ ° º Ä Î Ø â ì ö     ( 2 < F P Z d n x ‚ Œ –   ª ´ ¾ È Ò Ü æ ð ú    " , 6 @ J T ^ h r | †  š ¤ ® ¸  Ì Ö à ê ô þ    & 0 : D N X b l v € Š ” ž ¨ ² ¼ Æ Ð Ú ä î ø   *4>HR\fpzüüüüüüüüüü¼ì¼øì¼ô|ìøTìT¬XôT¼Tì@@@€ @ @ 00xx00xxx00xT¬üpø¨P 0hÔ¬Ôü¬Ô¬ü0H„„„„„„„ü0„„„„ÌxX00x0(Ppبp @Pxè ˆˆˆP PPPøPPøP x p(ð `¨Ð X¨0@  @¨h @ @@@ @  @P ø P ø @ø  @@€€pˆˆˆˆˆp `  øpˆ0@€øpˆ0ˆp0Pøø€ðˆppˆ€ðˆˆpø pˆˆpˆˆppˆˆxˆp @ @€@ øø@  @pˆ 8Dœ¬œ@8 Pˆˆøˆˆðˆˆðˆˆðpˆ€€€ˆpðˆˆˆˆˆðø€€ð€€øø€€ð€€€pˆ€€˜ˆpˆˆˆøˆˆˆp pˆˆpˆ À ˆ€€€€€€øˆØ¨¨ˆˆˆˆˆÈ¨˜ˆˆpˆˆˆˆˆpðˆˆð€€€pˆˆˆ¨hðˆˆð ˆpˆ€pˆpø ˆˆˆˆˆˆpˆˆˆˆˆP ˆˆˆ¨¨ØˆˆˆP PˆˆˆˆP ø @€øp@@@@@@@p€€@@ pp Pˆü pxˆx€€ðˆˆˆðx€€€xxˆˆˆxpˆø€p0@@ð@@@pˆˆˆxp€€ðˆˆˆˆ ` p0`€€ˆàˆ` pШ¨¨¨°Èˆˆˆpˆˆˆpðˆˆˆð€€xˆˆˆx°È€€€x€pð x ˆˆˆ˜hˆˆˆP ˆ¨¨¨PˆP Pˆˆˆˆˆxpø @ø  @  @h°T¨T¨T¨T¨T¨ 0h@ð@ð@h0( p `¸@ p¨p ˆP ø ø x€pˆpð 0°h` `ü 0`0`@€€@`0`0P¨P¨¨P¨PˆPà8`¸ ˆpP¨Ppˆ @€ˆp@ pˆˆøˆˆ pˆˆøˆˆ0Hpˆˆøˆˆ(PpˆˆøˆˆPpˆˆøˆˆP pˆˆøˆˆx  ø  ¸pˆ€€€ˆp `@ ø€ð€€ø ø€ð€€ø Pø€ð€€øPø€ð€€ø@ p p p p Pp pPp pðˆˆèˆˆðPˆÈ¨¨˜ˆ@ pˆˆˆˆp pˆˆˆˆp Ppˆˆˆˆp(PpˆˆˆˆpPpˆˆˆˆpp˜¨¨¨Èp€@ ˆˆˆˆˆp ˆˆˆˆˆppˆˆˆˆˆpPˆˆˆˆˆp ˆP €€ðˆˆˆð€€` ˆˆ°@ pxˆx pxˆx Ppxˆx(PpxˆxPpxˆxP pxˆxø|lx€€€x @ pˆø€p pˆø€p Ppˆø€pPpˆø€p@ ` p ` p @` pP` p(xˆˆˆp(P°Èˆˆˆ@ pˆˆˆp pˆˆˆp Ppˆˆˆp(PpˆˆˆpPpˆˆˆpp˜¨Èp€@ ˆˆˆ˜h ˆˆˆ˜h Pˆˆˆ˜hPˆˆˆ˜h HHH80@@pHp@@HHHH806x10xangband-3.5.1/lib/xtra/font/8x8x.fon0000644000175000017500000000706012456456606016460 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<|ƒ@@t||ý€P ,€É0€FONTDIR8X8XFONTRES 100,96,96:8x8x 6† Leon Marrick, 2005. Freeware. Share and enjoy! ``,0ÿ ‚ 8x8x† Leon Marrick, 2005. Freeware. Share and enjoy! ``,0ÿ ‚ zz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú "*2:BJRZbjrz‚Š’š¢ª²ºÂÊÒÚâêòú    " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ‚ Š ’ š ¢ ª ² º  Ê Ò Ú â ê ò ú     " * 2 : B J R Z b j r z ÿÿÿÿÿÿÿÿÛÿ·ý¿öß–ýU¯U»Uë€$H@ €@@<<8|||8 vªþ|ªT(~Õ«Õÿ«Õÿ~ÿZÛl(8(P 8lTl*"\zf(@@$$$((þ(þ((|Ð||D¤H$JD0Hh0JL60    l8Ö8l|0 ~00 @@B< ~~  8D8Dšªœ@<$BB~BB|BB|BB|F:@@\bBB|<@@@<:FBB><@@\bBBB0< $@@DX`XD08ì’’’’\bBBBBB>\" >@<|< BBBF:DD((‚’’ªDD((DBBF:<| |   2LUªUªUªUª"x x" 88V (T8T(D(|| $8X400ÿ  80@@08 (Tº|ºT( ¢ljŒ’l|º|l’ @D8F:<>F:<>F:(<>F:$<>F:<>F:~ ˜n<@@@<eangband-3.5.1/lib/xtra/font/16x24x.fon0000644000175000017500000003310012456456606016607 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ@@t~~ÿ€P ,€J0€FONTDIR16X24XFONTRES 100,96,96:16x24x 18˜4Microsoft & Leon Marrick, 2005. Freeware. Share and enjoy! ``ô0ÿ ’416x24x˜4Microsoft & Leon Marrick, 2005. Freeware. Share and enjoy! ``ô0ÿ ’4zzªÚ :jšÊú*ZŠºêJzªÚ :jšÊú* Z Š º ê  J z ª Ú  : j š Ê ú * Z Š º ê  J z ª Ú  :jšÊú*ZŠºêJzªÚ :jšÊú*ZŠºêJzªÚ :jšÊú*ZŠºêJzªÚ :jšÊú*ZŠºêJzªÚ :jšÊú*ZŠºêJzªÚ :jšÊú*ZŠºêJzªÚ : j š Ê ú *!Z!Š!º!ê!"J"z"ª"Ú" #:#j#š#Ê#ú#*$Z$Š$º$ê$%J%z%ª%Ú% &:&j&š&Ê&ú&*'Z'Š'º'ê'(J(z(ª(Ú( ):)j)š)Ê)ú)**Z*Š*º*ê*+J+z+ª+Ú+ ,:,j,š,Ê,ú,*-Z-Š-º-ê-.J.z.ª.Ú. /:/j/š/Ê/ú/*0Z0Š0º0ê01J1z1ª1Ú1 2:2j2š2Ê2ú2*3Z3Š3º3ê34J4z4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÿ·þ»ÿê÷ÿÝÿkÿÚÿÝÿ·þ»ï}ûî¿þ×ýoý·ÿzß{ßÿîûî¿þ×ýoÿýU¯U»Uë–ýU¯U»Uë–ýU¯U»Uë–ýU¯U»Uë–ýU¯U»Uë–ýU¯U»Uë–"HD€"”%"HD‚@(H…  @(@A€ H@A€ @ˆ ˆ @@@€€@€€€€€ÀàààààÀÀððøøøøøððÀ5jUjUœþV«U«Uþ?UÿU* üVÿV¬X°`À€:ujÕªÕªÕªÕÿÿÕªÕªÕªÕªÕªÿð¬VªW«U«U«UÿÿU«U«U«U«U«ÿ0@@€€€€€€€€€€€€€€€€€€€ÿð ÿ @€€€€€€€€€€€€€ÚP[   XðÐààÀààÀààÀààÀààÐðà&2Ld˜È0:UjUjUjU.à¸T¬T¬T¬Tè°€€€€€€€ +!F]:o*U/  €P@H(¨¤døT®VªÖl  @ `` @  @ @ €ÀÀÀÀÀ€€€€€€ÀÀ€`````?? ?? 80üü0``üü`ÀÀÀÀàp0€àp000pàÀÃ?sÃÇ~8püŒþþŒüpàððà€À€€€àð8øøðàÀ€àð8øøðà€À`àð8øøðà``àð8øøðà€€€€€€€€€€ÀÀ€€€€€€€€€ÀÀ€À`€€€€€€€€ÀÀ``€€€€€€€€ÀÀ`ÀÀ`ðð88ðà0ðààð8€€àð88ðàÀ€àð88ðà€À`àð88ðà `àÀàð88ðà``àð88ðàèð8X˜8ðà€€8øØÀ€8øØ€À`8øØ``8øØÀ€8øØ8ðààððà``8øØ8ðà16x24x!cÆangband-3.5.1/lib/xtra/font/7x13xb.fon0000644000175000017500000001146012456456606016674 0ustar chriscchriscMZñÿÿ¸@€º´ Í!¸LÍ!This program requires Microsoft Windows. $NE<~ƒ @@t~~ÿ€P ,€0€FONTDIR7X13XBFONTRES 100,100,100:7X13XB 9Public domain font. Share and enjoy. dd ° 0ÿ ‡7X13XBPublic domain font. Share and enjoy. dd ° 0ÿ ‡zz‡”¡®»ÈÕâïü #0=JWdq~‹˜¥²¿ÌÙæó '4AN[hu‚œ©¶ÃÐÝê÷+8ER_ly†“ ­ºÇÔáîû"/<IVcp}Š—¤±¾ËØåòÿ  & 3 @ M Z g t  Ž › ¨ µ  Ï Ü é ö    * 7 D Q ^ k x … ’ Ÿ ¬ ¹ Æ Ó à í ú   ! . ; H U b o | ‰ – £ ° ½ Ê × ä ñ þ   % 2 ? L Y f s €  š § ´ Á Î Û è õ    ) 6 C P ] j w „ ‘ ž « ¸ Å Ò ß ì ù  -:GTan{ˆ•¢¯¼ÉÖãðý $1>KXerŒ™¦³ÀÍÚçô(5BO\ivƒª·ÄÑÞëø,9FS`mzþþþþþþþþþþþþþî¾ö|îºþÞö|ÞúúTú¤~êTîTú¤~ÔT@‚D ‚  € ˆ @000xx08||||8xüüüüüx>00000000000ðð00000000000þþþþ000000000000000000 `À` üüÀ` `ÀüüülllìÌ üü0üüÀ€8l``ð``l¸0000000000lll((||(||((0x´°x4´x0ä¬è0`\ÔœpØØØpÔÜØt880`00```00`0000`H0üü0H00üü00880`üü0x0 0``ÀÀ0HÌÌÌÌÌH00p°00000üxÌÌ 8`ÀÀüxÌ 8 Ìx  GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 8 2 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 7 8 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 6 7 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 5 6 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 4 5 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 3 4 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 2 3 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 1 2 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 7 7 8 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 6 6 7 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 5 5 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 4 4 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 3 3 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 2 2 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 1 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Main Window True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Windows False tab True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Messages True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Inventory 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Equipment 2 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Monster List 3 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Status 4 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Debug 5 6 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 1 2 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 2 3 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 3 4 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 4 5 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Monospace 12 1 2 5 6 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Extra Windows 1 False tab True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK This space reserved for future options. 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK General 2 False tab True 9 3 True Columns 1 2 True Rows 2 3 True Term True Main 1 2 True Term 1 2 3 True Term 2 3 4 True Term 3 4 5 True Term 4 5 6 True Term 5 6 7 True Term 6 7 8 True Term 7 8 9 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 1 2 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 2 3 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 3 4 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 4 5 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 5 6 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 6 7 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 7 8 True True 24 0 999999 1 10 0 0.029999999999999999 2 3 8 9 True True 80 0 999999 1 10 0 1 2 1 2 True True 80 0 999999 1 10 0 1 2 2 3 True True 80 0 999999 1 10 0 1 2 3 4 True True 80 0 999999 1 10 0 1 2 4 5 True True 80 0 999999 1 10 0 1 2 5 6 True True 80 0 999999 1 10 0 1 2 6 7 True True 80 0 999999 1 10 0 1 2 7 8 True True 80 0 999999 1 10 0 1 2 8 9 3 True Term Size 3 False tab GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Debug True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Status True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Monster List True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Equipment True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Inventory True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Message True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 Pick a Font: GTK_WIN_POS_CENTER_ON_PARENT GDK_WINDOW_TYPE_HINT_DIALOG True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 Sans 12 True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-cancel True 0 True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-apply True 0 True True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-ok True 0 True GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK Term-xxx False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK Angband False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _File True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-new True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-open True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-save True True True Save As... True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-quit True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _View True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 1 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 2 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 3 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 4 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 5 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 6 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Term Window 7 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Graphics True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK None True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Old True True graphics_0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Adam Bolt True True graphics_0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK David Garvais True True graphics_0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Nomad True True graphics_0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Big Tiles True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Options... True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Debug True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Extra True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Messages True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Inventory True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Equipment True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Monster List True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Status True False True GTK_ICON_SIZE_SMALL_TOOLBAR False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 1 angband-3.5.1/lib/xtra/Makefile0000644000175000017500000000016312456456606015624 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk DATA = angband.glade SUBDIRS = font graf icon sound PACKAGE = xtra angband-3.5.1/lib/xtra/sound/0000755000175000017500000000000012456456606015314 5ustar chriscchriscangband-3.5.1/lib/xtra/sound/sound.cfg0000644000175000017500000002657412456456606017143 0ustar chriscchrisc# sound.cfg # # Configuration file for the Angband sound events # # The format is: # = # # Example: # hit = hit.mp3 hit1.mp3 # # # This is the Dubtrain Angband Sound config list, v.3.1.0 - February 24th, 2009 # # Licensed under a Creative Commons non-commercial agreement # # Inspired by the original Craig's Angband Sound Patch. # # But with all new sounds. # # contact angband@dubtrain.com # # download zipped archive at www.dubtrain.com/angband # # [Sound] # # Ambient sounds # # Town during the day. ambient_day = amb_thunder_rain.mp3 # Town during the night. ambient_nite = amb_guitar_chord.mp3 amb_thunder_roll.mp3 # Dungeon levels 1-20 (50'-1000') ambient_dng1 = amb_door_iron.mp3 amb_bell_metal1.mp3 # Dungeon levels 21-40 (1050'-2000') ambient_dng2 = amb_bell_tibet1.mp3 amb_bell_metal2.mp3 amb_gong_strike.mp3 # Dungeon levels 41-60 (2050'-3000') ambient_dng3 = amb_bell_tibet2.mp3 amb_dungeon_echo.mp3 amb_pulse_low.mp3 # Dungeon levels 61-80 (3050'-4000') ambient_dng4 = amb_bell_tibet3.mp3 amb_dungeon_echowet.mp3 amb_gong_undertone.mp3 # Dungeon levels 81 and beyond (4050'-) ambient_dng5 = amb_door_doom.mp3 amb_gong_chinese.mp3 amb_gong_low.mp3 # # Store sounds # # The shopkeep bought a worthless item. store1 = sto_man_hey.mp3 # The shopkeep paid too much for an item. store2 = id_bad_dang.mp3 # The shopkeep got away with a good bargain. store3 = sto_man_haha.mp3 # The shopkeep got away with a great bargain. store4 = sto_man_whoohaha.mp3 # You make a normal transaction (buying or selling). store5 = sto_coins_countertop.mp3 sto_bell_register1.mp3 sto_bell_register2.mp3 # You enter a store. store_enter = sto_bell_desk.mp3 sto_bell_ding.mp3 sto_bell_dingaling.mp3 sto_bell_jingles.mp3 sto_bell_ringing.mp3 sto_bell_shop.mp3 # You enter your home. store_home = plm_door_entrance.mp3 # You leave a store. store_leave = plm_door_bolt.mp3 # # Player sounds - combat # # You succeed in a melee attack against a monster. hit = plc_hit_hay.mp3 plc_hit_body.mp3 # It was a good hit! hit_good = plc_hit_anvil.mp3 # It was a great hit! hit_great = plc_hit_groan.mp3 # It was a superb hit! hit_superb = plc_hit_grunt.mp3 # It was a *GREAT* hit! hit_hi_great = plc_hit_grunt2.mp3 # It was a *SUPERB* hit! hit_hi_superb = plc_hit_anvil2.mp3 # You miss a melee attack against a monster. miss = plc_miss_arrow2.mp3 # You fire a missile. shoot = plc_miss_swish.mp3 plc_miss_arrow.mp3 # You hit something with a missile. shoot_hit = plc_hit_arrow.mp3 # You receive a hitpoint warning. hitpoint_warn = plc_bell_warn.mp3 # You die. death = plc_die_laugh.mp3 # # Player sounds - status changes # # You become blind. blind = pls_tone_conk.mp3 # You become confused. confused = pls_man_ugh.mp3 # You become poisoned. poisoned = pls_tone_guiro.mp3 # You become afraid. afraid = pls_man_yell.mp3 # You become paralyzed. paralyzed = pls_man_gulp_new.mp3 # You feel drugged (chaos effects). drugged = pls_breathe_in.mp3 # You become slower. slow = pls_man_sigh.mp3 # You become stunned. stun = pls_bell_mute.mp3 # You suffer a cut. cut = pls_man_argoh.mp3 # A stat is drained drain_stat = pls_tone_headstock.mp3 # You recover from a condition (blind, confused, etc.) recover = pls_bell_chime_new.mp3 # You become faster. speed = pls_bell_sustain.mp3 # You attain a mystic shield. shield = pls_bell_bowl.mp3 # You become blessed. blessed = sum_angel_song.mp3 # You feel heroic. hero = pls_tone_goblet.mp3 # You are bold. bold = pls_bell_hibell_soft.mp3 # You become berserk. berserk = pls_man_scream2.mp3 # You feel protected from evil. prot_evil = pls_bell_glass.mp3 # You feel invulnerable. (does any item/spell do this anymore?) invuln = pls_tone_blurk.mp3 # You can see invisible things. see_invis = pls_tone_clave6.mp3 # You can see the infrared spectrum infrared = pls_tone_clavelo8.mp3 # You become resistant to acid. res_acid = pls_man_sniff.mp3 # You become resistant to electricity. res_elec = pls_tone_elec.mp3 # You become resistant to fire. res_fire = pls_tone_scrape.mp3 # You become resistant to cold. res_cold = pls_tone_stick.mp3 # You become resistant to poison. res_pois = pls_man_spit.mp3 # You become hungry. hungry = pls_man_sob.mp3 # # Player sounds - misc. # # You pick up money worth less than 200 au. money1 = plm_coins_light.mp3 plm_coins_shake.mp3 # You pick up money worth between 200 and 600 au. money2 = plm_chain_light.mp3 plm_coins_pour.mp3 # You pick up money worth 600 au or more. money3 = plm_coins_dump.mp3 # You (or a monster) drop something on the ground. drop = plm_drop_boot.mp3 # You gain (or regain) a level. level = plm_levelup.mp3 # You successfully study a spell or prayer. study = plm_book_pageturn.mp3 # You teleport or phase door. teleport = plm_chimes_jangle.mp3 # You quaff a potion. quaff = plm_bottle_clinks.mp3 plm_cork_pop.mp3 plm_cork_squeak.mp3 # You zap a rod. zap_rod = plm_zap_rod.mp3 # You take a step. (unimplemented) walk = # You teleport someone else away. tpother = plm_chimes_jangle.mp3 # You bump into a wall or door. hitwall = plm_wood_thud.mp3 # You eat something. eat = plm_eat_bite.mp3 # You successfully dig through something. dig = plm_metal_clank.mp3 # You open a door. opendoor = plm_door_bolt.mp3 plm_door_creak.mp3 plm_door_dungeon.mp3 plm_door_entrance.mp3 plm_door_open.mp3 plm_door_opening.mp3 plm_door_rusty.mp3 plm_door_squeaky.mp3 # You shut a door. shutdoor = plm_bang_dumpster.mp3 plm_cabinet_shut.mp3 plm_close_hatch.mp3 plm_door_creakshut.mp3 plm_door_latch.mp3 plm_door_shut.mp3 plm_door_slam.mp3 # You teleport from a level (including via recall). tplevel = sum_bell_crystal.mp3 # Default "bell" sound for system messages. bell = plm_jar_ding.mp3 # You try to open something that's not a door. nothing_to_open = plm_click_switch2.mp3 plm_door_knob.mp3 # You fail to pick a lock. lockpick_fail = plm_click_dry.mp3 plm_click_switch.mp3 plm_click_wood.mp3 plm_door_echolock.mp3 plm_door_wooden.mp3 # You pick a lock. lockpick = plm_break_wood.mp3 plm_cabinet_open.mp3 plm_chest_unlatch.mp3 plm_lock_case.mp3 plm_lock_distant.mp3 plm_open_case.mp3 # You disarm a trap. disarm = plm_bang_ceramic.mp3 plm_chest_latch.mp3 plm_click_switch3.mp3 # You go up stairs. stairs_up = plm_floor_creak2.mp3 # You go down stairs. stairs_down = plm_floor_creak.mp3 # You activate an artifact. act_artifact = plm_aim_wand.mp3 # You use a staff. use_staff = plm_use_staff.mp3 # An object is destroyed. destroy = plm_bang_metal.mp3 plm_break_canister.mp3 plm_break_glass.mp3 plm_break_glass2.mp3 plm_break_plates.mp3 plm_break_shatter.mp3 plm_break_smash.mp3 plm_glass_breaking.mp3 plm_glass_break.mp3 plm_glass_smashing.mp3 # You wield or take off something. wield = plm_metal_sharpen.mp3 # You wield a cursed item. cursed = pls_man_oooh.mp3 # You notice something (generic notice) notice = id_bad_hmm.mp3 # You notice something about your equipment or inventory. pseudo_id = id_good_hmm.mp3 # You successfully cast a spell. cast_spell = plm_spell1.mp3 plm_spell2.mp3 plm_spell3.mp3 # You successfully pray a prayer. pray_prayer = sum_angel_song.mp3 # # Monster Sounds - combat # # A monster flees in terror. flee = mco_creature_yelp.mp3 # A monster is killed. kill = mco_howl_croak.mp3 mco_howl_deep.mp3 mco_howl_distressed.mp3 mco_howl_high.mp3 mco_howl_long.mp3 # A unique is killed. kill_unique = sum_ghost_wail.mp3 # Morgoth, Lord of Darkness is killed. kill_king = amb_guitar_chord.mp3 # Attack - hit mon_hit = mco_hit_whip.mp3 # Attack - touch mon_touch = mco_click_vibra.mp3 # Attack - punch mon_punch = mco_squish_snap.mp3 # Attack - kick mon_kick = mco_rubber_thud.mp3 # Attack - claw mon_claw = mco_ceramic_trill.mp3 mco_scurry_dry.mp3 # Attack - bite mon_bite = mco_snarl_short.mp3 mco_bite_soft.mp3 mco_bite_munch.mp3 mco_bite_long.mp3 mco_bite_short.mp3 mco_bite_gnash.mp3 mco_bite_chomp.mp3 mco_bite_regular.mp3 mco_bite_small.mp3 mco_bite_dainty.mp3 mco_bite_hard.mp3 mco_bite_chew.mp3 # Attack - sting mon_sting = mco_castanet_trill.mp3 mco_tube_hit.mp3 # Attack - butt mon_butt = mco_cuica_rubbing.mp3 mco_thud_crash.mp3 # Attack - crush mon_crush = mco_dino_low.mp3 mco_squish_hit.mp3 # Attack - engulf mon_engulf = mco_dino_talk.mp3 mco_dino_yawn.mp3 # Attack - crawl mon_crawl = mco_card_shuffle.mp3 mco_shake_roll.mp3 # Attack - drool mon_drool = mco_creature_choking.mp3 mco_liquid_squirt.mp3 # Attack - spit mon_spit = mco_attack_spray.mp3 # Attack - gaze mon_gaze = mco_thoing_backwards.mp3 # Attack - wail mon_wail = mco_dino_low.mp3 # Attack - release spores mon_spore = mco_dub_wobble.mp3 mco_spray_long.mp3 # Attack - beg for money mon_beg = mco_man_mumble.mp3 # Attack - insult mon_insult = mco_strange_thwoink.mp3 # Attack - moan mon_moan = mco_strange_music.mp3 # Attack - shriek mon_shriek = mco_mouse_squeaks.mp3 # Spell - create traps mon_create_trap = mco_thoing_deep.mp3 # Spell - cause fear mon_cast_fear = mco_creature_groan.mp3 mco_dino_slur.mp3 # Multiply (breed explosively) multiply = mco_frog_trill.mp3 # # Summons # # Summon one or more monsters. summon_monster = sum_chime_jangle.mp3 # Summon angels. summon_ainu = sum_angel_song.mp3 # Summon undead. summon_undead = sum_ghost_oooo.mp3 # Summon animals. summon_animal = sum_lion_growl.mp3 # Summon spiders. summon_spider = sum_piano_scrape.mp3 # Summon hounds. summon_hound = sum_lion_growl.mp3 # Summon hydras. summon_hydra = sum_piano_scrape.mp3 # Summon demons. summon_demon = sum_ghost_wail.mp3 sum_laugh_evil2.mp3 # Summon dragon. summon_dragon = sum_piano_scrape.mp3 # Summon greater undead. summon_gr_undead = sum_ghost_moan.mp3 # Summon greater dragons. summon_gr_dragon = sum_gong_temple.mp3 # Summon greater demons. summon_gr_demon = sum_ghost_moan.mp3 # Summon Ringwraiths. summon_ringwraith = sum_bell_hand.mp3 # Summon uniques. summon_unique = sum_bell_tone.mp3 # # Breath weapons # # Breathe frost. breathe_frost = mco_attack_breath.mp3 # Breathe electricity. breathe_elec = mco_attack_breath.mp3 # Breathe acid. breathe_acid = mco_attack_breath.mp3 # Breathe gas. breathe_gas = mco_attack_breath.mp3 # Breathe fire. breathe_fire = mco_attack_breath.mp3 # Breathe confusion. breathe_confusion = mco_attack_breath.mp3 # Breathe disenchantment. breathe_disenchant = mco_attack_breath.mp3 # Breathe chaos. breathe_chaos = mco_attack_breath.mp3 # Breathe shards. breathe_shards = mco_attack_breath.mp3 # Breathe sound. breathe_sound = mco_attack_breath.mp3 # Breathe light. breathe_light = mco_attack_breath.mp3 # Breathe darkness. breathe_dark = mco_attack_breath.mp3 # Breathe nether. breathe_nether = mco_attack_breath.mp3 # Breathe nexus. breathe_nexus = mco_attack_breath.mp3 # Breathe time. breathe_time = mco_attack_breath.mp3 # Breathe inertia. breathe_inertia = mco_attack_breath.mp3 # Breathe gravity. breathe_gravity = mco_attack_breath.mp3 # Breathe plasma. breathe_plasma = mco_attack_breath.mp3 # Breathe force. breathe_force = mco_attack_breath.mp3 # Breathe the elements (power dragon scale mail). breathe_elements = mco_attack_breath.mp3 # # Identifying Items # # Identify a bad item (including bad ego items and artifacts). identify_bad = id_bad_aww.mp3 id_bad_dang.mp3 id_bad_hmm.mp3 id_bad_hmph.mp3 id_bad_ohh.mp3 # Identify a good ego item. identify_ego = id_ego_whoa.mp3 id_ego_woohoo.mp3 id_ego_yeah.mp3 id_ego_yeah2.mp3 id_ego_yes.mp3 # Identify a good artifact. identify_art = id_good_hey.mp3 id_good_hey2.mp3 id_good_hmm.mp3 id_good_huh.mp3 id_good_ooh.mp3 id_good_ooo.mp3 id_good_wow.mp3 angband-3.5.1/lib/xtra/sound/Makefile0000644000175000017500000001075212456456606016761 0ustar chriscchriscMKPATH=../../../mk/ include $(MKPATH)buildsys.mk DATA = sound.cfg \ amb_bell_metal1.mp3 mco_scurry_dry.mp3 plm_drop_boot.mp3 \ amb_bell_metal2.mp3 mco_shake_roll.mp3 plm_eat_bite.mp3 \ amb_bell_tibet1.mp3 mco_snarl_short.mp3 plm_floor_creak.mp3 \ amb_bell_tibet2.mp3 mco_spray_long.mp3 plm_floor_creak2.mp3 \ amb_bell_tibet3.mp3 mco_squish_hit.mp3 plm_glass_break.mp3 \ amb_door_doom.mp3 mco_squish_snap.mp3 plm_glass_breaking.mp3 \ amb_door_iron.mp3 mco_strange_music.mp3 plm_glass_smashing.mp3 \ amb_dungeon_echo.mp3 mco_strange_thwoink.mp3 plm_jar_ding.mp3 \ amb_dungeon_echowet.mp3 mco_thoing_backwards.mp3 plm_levelup.mp3 \ amb_gong_chinese.mp3 mco_thoing_deep.mp3 plm_lock_case.mp3 \ amb_gong_low.mp3 mco_thud_crash.mp3 plm_lock_distant.mp3 \ amb_gong_strike.mp3 mco_tube_hit.mp3 plm_metal_clank.mp3 \ amb_gong_undertone.mp3 plc_bell_warn.mp3 plm_metal_sharpen.mp3 \ amb_guitar_chord.mp3 plc_die_laugh.mp3 plm_open_case.mp3 \ amb_pulse_low.mp3 plc_hit_anvil.mp3 plm_spell1.mp3 \ amb_thunder_rain.mp3 plc_hit_anvil2.mp3 plm_spell2.mp3 \ amb_thunder_roll.mp3 plc_hit_arrow.mp3 plm_spell3.mp3 \ id_bad_aww.mp3 plc_hit_body.mp3 plm_use_staff.mp3 \ id_bad_dang.mp3 plc_hit_groan.mp3 plm_wood_thud.mp3 \ id_bad_hmm.mp3 plc_hit_grunt.mp3 plm_zap_rod.mp3 \ id_bad_hmph.mp3 plc_hit_grunt2.mp3 pls_bell_bowl.mp3 \ id_bad_ohh.mp3 plc_hit_hay.mp3 pls_bell_chime_new.mp3 \ id_ego_whoa.mp3 plc_miss_arrow.mp3 pls_bell_glass.mp3 \ id_ego_woohoo.mp3 plc_miss_arrow2.mp3 pls_bell_hibell_soft.mp3 \ id_ego_yeah.mp3 plc_miss_swish.mp3 pls_bell_mute.mp3 \ id_ego_yeah2.mp3 plm_aim_wand.mp3 pls_bell_sustain.mp3 \ id_ego_yes.mp3 plm_bang_ceramic.mp3 pls_breathe_in.mp3 \ id_good_hey.mp3 plm_bang_dumpster.mp3 pls_man_argoh.mp3 \ id_good_hey2.mp3 plm_bang_metal.mp3 pls_man_gulp_new.mp3 \ id_good_hmm.mp3 plm_book_pageturn.mp3 pls_man_oooh.mp3 \ id_good_huh.mp3 plm_bottle_clinks.mp3 pls_man_scream2.mp3 \ id_good_ooh.mp3 plm_break_canister.mp3 pls_man_sigh.mp3 \ id_good_ooo.mp3 plm_break_glass.mp3 pls_man_sniff.mp3 \ id_good_wow.mp3 plm_break_glass2.mp3 pls_man_sob.mp3 \ mco_attack_breath.mp3 plm_break_plates.mp3 pls_man_spit.mp3 \ mco_attack_spray.mp3 plm_break_shatter.mp3 pls_man_ugh.mp3 \ mco_bite_chew.mp3 plm_break_smash.mp3 pls_man_yell.mp3 \ mco_bite_chomp.mp3 plm_break_wood.mp3 pls_tone_blurk.mp3 \ mco_bite_dainty.mp3 plm_cabinet_open.mp3 pls_tone_clave6.mp3 \ mco_bite_gnash.mp3 plm_cabinet_shut.mp3 pls_tone_clavelo8.mp3 \ mco_bite_hard.mp3 plm_chain_light.mp3 pls_tone_conk.mp3 \ mco_bite_long.mp3 plm_chest_latch.mp3 pls_tone_elec.mp3 \ mco_bite_munch.mp3 plm_chest_unlatch.mp3 pls_tone_goblet.mp3 \ mco_bite_regular.mp3 plm_chimes_jangle.mp3 pls_tone_guiro.mp3 \ mco_bite_short.mp3 plm_click_dry.mp3 pls_tone_headstock.mp3 \ mco_bite_small.mp3 plm_click_switch.mp3 pls_tone_scrape.mp3 \ mco_bite_soft.mp3 plm_click_switch2.mp3 pls_tone_stick.mp3 \ mco_card_shuffle.mp3 plm_click_switch3.mp3 sto_bell_desk.mp3 \ mco_castanet_trill.mp3 plm_click_wood.mp3 sto_bell_ding.mp3 \ mco_ceramic_trill.mp3 plm_close_hatch.mp3 sto_bell_dingaling.mp3 \ mco_click_vibra.mp3 plm_coins_dump.mp3 sto_bell_jingles.mp3 \ mco_creature_choking.mp3 plm_coins_light.mp3 sto_bell_register1.mp3 \ mco_creature_groan.mp3 plm_coins_pour.mp3 sto_bell_register2.mp3 \ mco_creature_yelp.mp3 plm_coins_shake.mp3 sto_bell_ringing.mp3 \ mco_cuica_rubbing.mp3 plm_cork_pop.mp3 sto_bell_shop.mp3 \ mco_dino_low.mp3 plm_cork_squeak.mp3 sto_coins_countertop.mp3 \ mco_dino_slur.mp3 plm_door_bolt.mp3 sto_man_haha.mp3 \ mco_dino_talk.mp3 plm_door_creak.mp3 sto_man_hey.mp3 \ mco_dino_yawn.mp3 plm_door_creakshut.mp3 sto_man_whoohaha.mp3 \ mco_dub_wobble.mp3 plm_door_dungeon.mp3 sum_angel_song.mp3 \ mco_frog_trill.mp3 plm_door_echolock.mp3 sum_bell_crystal.mp3 \ mco_hit_whip.mp3 plm_door_entrance.mp3 sum_bell_hand.mp3 \ mco_howl_croak.mp3 plm_door_knob.mp3 sum_bell_tone.mp3 \ mco_howl_deep.mp3 plm_door_latch.mp3 sum_chime_jangle.mp3 \ mco_howl_distressed.mp3 plm_door_open.mp3 sum_ghost_moan.mp3 \ mco_howl_high.mp3 plm_door_opening.mp3 sum_ghost_oooo.mp3 \ mco_howl_long.mp3 plm_door_rusty.mp3 sum_ghost_wail.mp3 \ mco_liquid_squirt.mp3 plm_door_shut.mp3 sum_gong_temple.mp3 \ mco_man_mumble.mp3 plm_door_slam.mp3 sum_laugh_evil2.mp3 \ mco_mouse_squeaks.mp3 plm_door_squeaky.mp3 sum_lion_growl.mp3 \ mco_rubber_thud.mp3 plm_door_wooden.mp3 sum_piano_scrape.mp3 PACKAGE = xtra/sound angband-3.5.1/lib/xtra/graf/0000755000175000017500000000000012456456606015103 5ustar chriscchriscangband-3.5.1/lib/xtra/graf/graphics.txt0000644000175000017500000000265412456456606017453 0ustar chriscchrisc# File: graphics.txt # This file is used to initialize a list of graphics modes # === Understanding dungeons.txt === # N: serial number : pref file name # I: tile width : tile height : tileset file name # M: menu name # X: alphblending : start row : end row of double high tiles # 'N' indicates the beginning of an entry. The serial number must # increase for each new item. The pref file name is the name used # on load to load the right pref file set for this tile set. # 'I' is for image information - tile width and height are the dimensions, # in pixels, of an individual tile in the set. filename is the name of the # image file to load. # 'M' is for menu name - the name the graphics mode is listed under when # selecting it from a graphical menu. # 'X' is for extra information - alpha is a flag if the tileset needs to use # alpha blending. double high tiles are ones that have twice the tile height # as a typical tile. start row is the first row that uses double high tiles. # End row is the last row that uses double high tiles. start row and end row # must be greater than 0, if double high tiles are used, and refer to the # bottom half of the double row. N:1:Original Tiles I:8:8:8x8.png P:old X:0:0:0 N:2:Adam Bolt's tiles I:16:16:16x16.png P:new X:0:0:0 N:3:David Gervais' tiles I:32:32:32x32.png P:david X:0:0:0 N:4:Nomad's tiles I:16:16:8x16.png P:nomad X:0:0:0 N:5:Shockbolt's tiles I:64:64:64x64.png P:shock X:1:29:31 angband-3.5.1/lib/xtra/graf/mr_att.png0000644000175000017500000000434212456456606017102 0ustar chriscchrisc‰PNG  IHDR›ŽÔTg—PLTE333DDDwwwˆˆˆ»»»ÿÿÿO\ tRNS@æØfbKGDˆH pHYs  šœtIME×$Ä.sóCIDAThÞ­ZÉnã85$ þ„¹…W#P¬«1†­«ÎXw/Ê5ÐÒõûÃEФävˆbK*kyõªèÅb¼ªÅO®Uû£âjXÿ¨vs¶[óÄ-fÜ™A?O\»É»ÌÔnAÅMz#øž)®l'_‘9;P¾ø&¼[Ã<±•Âë´U|«d~tÂÐ1ÇÑ­¾’Î{É·)Ò67€.l\ènO´^ãš3ÀS@ÚÀéðY{×4ô¡ö0ÜkSƒÿUEë7^CÍ'ü»dÿÀ¾ÒïbW¦£vXû¾¤âšY4¤äzf³ ošé…/€82y·z0«ÝðlOMó âÒ—ðß-•ÇTë¸èœ ÜÐÏ=•Ö”¡¨+hFùœ‹cîØ6r}r ßùk‚I¸‚³Çz ó- ®‹\WªÛþß9˜ƒ+¸yð#ƒŽéÀ¬ŽÝ{Ëÿ) œïÍkÉ%“éÊ¢{¥Û:ù®&0œ¹yÀ|©&)½^zb…áösÖÛnM–°müÎÁâ,ú’s\3æ,˜Ó<÷‰»AGbÈÉÄÕã2¿r4‚ã…Ž=v§`-òl¼ÎqX/YlKÚ&°â°^°çF»Ídü{ÖWT»KÏÑn؆Ä]¢U.á$½ç%uEÊmîî¶hÃâÊ>JI^=QvaqEÔÂèΞ`¾ˆr¡NDç¸øV “‘Ò8…“VÙ´7€ÅT¤¸µ©´åìD’©³‚=á¥+KãHÁ'/šOÍwBE×½-l/¾fÉ yS_y¼ˆC¥6ŵÛË=ßö¥únPœW­Ýص(Tä»7-¡v%øgw ý¦o±È ÌB¹úÌÞöTeDªGwz0¸uø—…‚BHðϵwÚI-#e¦’\-g/R^•ñ€õåÒ_èŸUÐí ÛÔ+ˆ6w€ÞñëN¢ £Œ’ÆË¢ÊIS¸u —£²Å0[G•“×_Gdp±R¸ÊÑLØ3­÷ûýAôlÐzêoå"9CÊÝnp¸ŸÙ…N¾oð¸o×Üx+Üód:Ø…o¹Û“§œ·®/¸ñJk¯™¦ÆU­^“8¤“éÚá¾WÄIŠx)M7Ò!í¾PaMÜIµ<* žQ¤58Ñí¼Ø²vø¨è”{…Š“•Ñº¡”Câ˜/.TÚVÑ©LšÎ²ÊaÍD~Ÿ8ȵj¼¥M>´_Œ¸‹¤ÁG8âj´ÿM-ÇfOŒ¸+w5›Ç‘¥ÀÑtýÕÊ·ÔnF›åfC¾0âØ¸DvÃ7ÎÛqºî`WÔWdlÓ+‹0=÷ [\¡Ýì 2Çí¦(ŒšçØâŒ›qS˜DHÑú›qÉÅÌÍÁ]µp“ìl%ÙUëØ•’‘à@©ª¶S‹ãÞo3î6ÕŒ+Å0ŠïÒÆ¤o' o[î.dÐN)Úáúpò4W"Qjþ*M­LaÍP‘M&Á£Ý‡àYš»”d 15Tz:„vgÅ)ÕÄŒ»–Q|ÅèÿŸ>æ9f0Plê†ÖÒAKIØÉ¨¹ð—í«³¢­™ç¤ñ¾1 Æí øh¶ñħd%1ôb|hèn™ @y,ÀXk´PñŸá¦Ë¨×hfÀ‚ ”j·5êé Ó«ütÑšk“_*T“í¦Eýã©Ú3¬åéqÕ%GÈ{ ¾âuã4o–TKãéKŸy®ý%û fâW»B|9qú‘ÅÛw’už:ì©=MTšæq¦2ܧñï§lÍ[ÇÕ{q”k£C‹xÏÒ¶Ö .ðvYEÕ0À^ïVzÄÓäa1)Τ8²hšjE‚çVh³ÖÊâ³°»\–ÐOj&<‚[ÂVx‘ð9[Åxü"àð@Ìm<? °¾íÍ«¯±“Íç‚6|Ë9/z󠯇 Kx–]Îß‹û#çì•i<¾þ:Ñl ‹S­—e2Èò,-'íû½à$ʨåBM37¨_æaǞӈثÕ@n-z_˜õ èO¨GW3;õé7¿áx+gü–§6¿O@ú ]0Ÿ‚üÐåEÔþü@èYƒ„µ´cXªFƒÝ ¾ RÉ­Ó7èøLõÄ5:îš,ek8‘iª'>Î=̳'¸Ÿz<$üš0žo‚«Ô3ð¼N„ŠïÄXÈs^{›ð…ïÄX=»¬4?*Îsb¬F#’•Þ%®ˆ˜;õüêà~í ÀyN§ï×îqíLá&Ý}?7ðŽúMé*Ú½³JØLÄÝ)šÇ㹟î$“Éûêï÷ûï«ÿàà ñx§ÓÉÜÜ]]]477FÔoÕŸæææH$466ªþ$‰Šßª?Kÿ_üÅ_$ª1›››q¹\¬®®¨cÕŸåûO<Áϵµò«_ûÏü»=ð•|‘žžb±ŸX‹ð\ƒ“••zzz˜šš`uu—ËŰÑÀWÎ矘M<_[OOO«««|`n€¿ëÚI4ÝÔà3Ÿù ÃFÿê{Å—<Í<×ि¿Ÿp8Ìñ[3¼¼c±XŒþþ~&&&M÷C?€ËåâÂ…  Õ½ì\+?ƒ@Cùžëï£<Ï_ÿõ_¿/ú¿öµ¯188¨æO"‘ sôèQÆÇÇill¤««‹ññq:;;+Θœœ¤··WÍŸd2I*•bdd„k×®QWWGWW×®]Ãï÷Wœ000P1gãñ8‰D‚¡¡!nÞ¼‰Ó餹¹¹â³œ0>>^A¿c>ÀÐà —ÆÇIutÒÕÕÅò©“˜÷îÛD0Ü’®‘†z.¬ÝÞD0¤®®NÍŸ®®.EÿÍ›7Õÿ>êrrr5Ncc#ÝÝÝ\ºtiË󆆆Ժ¸yó&ÝÝÝ›ÖÌgýg@Ý“êõ¯oï´þ?®ÖÑÔÔ===¸ÝnVVVÔíîîfee¥â³Ìã'Np?íGÍ?eÉ}Üîóv¿ ýuuu×r·ïúÏ?,úßkûq¹ÿïµ™¬V뿾Ÿ?¨­­½/r¹Ü}õohh¸¯þ^¯¿ßÏÄÄ„Ãa, ÍÍÍ„B!5YÃá0­­­Äãq2™ ™L†ÖÖV‰^¯—ÉÉIœN'áp›ÍFcc#‘HD)áp¯×K"‘ ›Í’Ífñz½´··ãóùƒ¤R)ŒF#.—‹`0¨v*•ªø,ß}>SÉ$¿b6ñåH”ÁÁA~®­•`±ÈKËQf]M‚ö\ €ßïÇívóËù,K! žX+á?l4°j³qêv’H»O1Îa£k±U|>n·›cósXG&Û俣]ü‡Ù[ 1l4°V[Ëë·“,¶µ+á9l4py)ÌŽ;hiiáç˜qºî‹þ“ë)2™ þø*ã% ¿ßËåÂh4²X,‘°Ú”b%÷Ôáp௲ëàAB<ñ•|ñ]Óÿ¶£–ÉÉI2™ŒRð áp¸Bø766ÒÚÚÊøø8^¯—¹¹9FGG©­­ezzšt:M2™¤®®MÓX^^®žuuux½^®]»†Çãaii‰|¡¡!B¡¥R©B@Åb±-…ÿÍ›7±Ùl„ÃaöîÝKKK‹šÏÙl–ÚŽ$&‘ˆ¶ŒÉcÄÛºåS'± ˜4y¸yáŽÎNE¿Åb!›Í2==Åb!³sçNÞœ °sçNE³ßï§m-A(›ÃãñFÉår|èCRóyrr’¾¾>œN' « §Ó‰ßïW¿s-ÁÙ™Yµî†††ðù|\½z§ÓI(ÂápT<ë`0H(R ˆŒç÷ûI¥RØl6æææÔú¯øw[ÿn·¿ßÏøø¸Ën·ãv» …B¸\.B¡Á`ŸÏG(Rý}>—/_Æétb³ÙÞõ+“ÉË娫«Ãb±¼ëW.—£¡¡Îβ’çõzïùeµZI$d2u¿„.¹o6›M×Ó -¡¨ «šVýï²N„þêÖØØH6›ÝòXõo™Læ¾äÇZ~Ý/ý5÷Õû@“ÉØØØH  ósƒ MµÚrkP–ÈV–„ÿjËA¬%ذF…§Ó©Žé‘}“ãÑhTYÃŽ·ÞÄõàž½v¦¦&uþç>Ê¿úÞ_qU–í—#QõÿÙbIÿƒ•.—K}ÿd_/qc’) §§‡ýo½ Àóµõœ˜ ¿¿Ÿ…Óoàv»q»Ý\\YÁív«þŸØÃ8É)àÈ‘#  üQ¾ÈÈÍç8}¹øžèwÌLW<([Vz¤¤§§‡ .ÐÝÝ­úŒ—4޼ñ'j|÷Oÿ ½¸„×ëÝ–þ}çÎð•|‘x<Îàà 'NœÀétªy"ÏWÞÕ9ãããtuu©¹500À… p8ê"‘HE§Ó©Î™œœÄãñH$ˆF£ÊB–±õóSß䙟‚èÏ× {0h×™›¯£³³sc}¸aHœexŸ™gÇ*éoll$“L&éííerrRÑÙÛÛ ”‘‚¶†ú22p¹ÞÜÜÌ«¯¾Jgggù¹è“W_}•ÆÆ2ªÃZ¢Œ ÜÖúµ¡_w‚èѧӉËåª@  ¼æº»»‰Çãë¿««ëžÖ¿  zOÖ¤ rÜívW ú688X1gõ(†¾É5WÐ#è’´íx‡<Ï@  ¬WQõk^bè›ÐTmy ¯“ûTzVÿ.ÿ!Â_Ï?廜³S=v5ú÷­~»—¦G+Þmë^Œ»Çö#ëî¾¾Bk››Ãf³ÑÚÚJ86&„Íf#‘H¨÷ÎÎN¥ †Šþ^¯—p8ŒÁ`P“O4a0{zzp88R©‡£BÐ[ýú…‹Åp»Ýö’N§éxõej†G˜ššbuuMÓx(´ÀU‹»ÝÎôô4W-VFLFN®§…BØl6̾²5Twk–º]»ƒJ¥R<¸Åu‹UwÝbeO>Çu‹•L&C©TÂèóa·Û­1QßÛÇüü<7nÜÀ`0ðÀô³®&7nÜ ¦£“vƒ³s–J‹´ Ôýâós—ؽú=ÚêáòXcé2öÚ]<0=…Ýú6»í NÜLVпX,јÍbÈÄʪ…–ÅWip2¿PP÷¨îÖ,^ƒ¯ÁÀÄJŒl£“Æl–°ÆVŸú—‡XnmeòíSx‚qõÙ¹þömV—_¦©y€®«ãÿ‚왋œ ä˜u51Íp±¤‘J¥ˆÇãd³Y9þ¼zþò¬+ž¿Á`PhÌŸt:ÍÀÀW®\AÓ4Ìf³‚:‡Ãhš¦ÇS1 ¬Üˆ{Âf³©¹ÚÝÝM*•RóW~èÍeIXm´ëŒ8:ùÁØ8MQ ww -¸{ûèJœ- ¤ØßZOÜê'‘Hдáôä$>Ÿ>4Þ^Žb6›Õ^[[c``€Ù h‹ ï+aH4Ph,Óö¨ËIÞÕD}}=½¹,Ô›`hQÈÉàà ÝÝݸoñˆo†ÏüÑï2û›dïô÷ûýjý¸\.¥R ‡Ã¡Ð¿ßO(ªX?z«T>¯×û®×ÿÀÀ€‚öív;v»£ÑˆÝngjj ‡Ã¡¾L&£»¬ï¹¹92™ŒB3\.—¢Wž©¦•‘­X,¦øC8V@©T¢¯¯Oñ =¢ØÓÓƒÑhÄçó‹ÅrH$X[[£¡¡¯×‹Ïç+?ë;ˆ†¾¿Á`PãÛív2™ ±XL!6›MY×ú¹µÕgÀ‚´D£Q,‹Bd}[~–g–Éd°X,cëŸÝVïzä?«ùoi™L†d2I.—+?û÷ÓÕÕÅÜÜG­PäR©.—‹\.G*•Âd2):khh`ïÞ½ÌÏÏ¿+ø?FùÈG>ÂÓO?Í©S§8vì˜ZïïµýÄ+å #÷ûý NÕ3ÑÖÖV5‘Âá0‘H„¾¾>éf³Yås—I¦g.²x»ºº”»!“ÉFñù|ÆM(€ÀÖ@­Ç L~Ýb%‹ÑÓÓC*•bjjŠgY³—c«««œ\Oñ¿ÿÂÏóêÄ„£§§‡ÙõuÕ?‹Ç™¹ãC—c×-V>Ù׋Ñ磩©‰X,ÆÐÐq»]ÑF¹yó&‹míô÷÷³¾¾Î78;àóGåL G»±ÉuÃÜäƒ9 ÁEzY¡%¤1“œf¦i®ô,Žƒ5„£ô¿xù2Ù,3©úv'É/¹),i´î)P;—&aµ‘°Ú”’°žn(CºŒŒŒÐÔ¼—Õ×nµîf ßÁO=½ƒÉçÎãÛ?OKHãÚòUâÝGXüëÿŽã` Ét?+++\,i|þè£|å»ßerr’h4JKK Ùl–xŸ§®®Žt:M*•bçÎrÜ… µµµôôô°°°@]]z^‹…¹¹9"‘õõõjî \-è€Àéz·–ßïçíè)n_ºÅµ¥x{hZ.#µÖÑ"8]=œ8qƒÇÀŽ!'…Å$\¤èëëãõ«×0›ÍhÅyg'kkkr7alñÐÑÑÁµk×0¶xp÷ؘ¿º†z‚éòü7x½LLL`Ю³c¨…P˜pDcÄncÿcn ¦v.]ºÄîºYç/þü;ä—š_*»0nÞ¼‰ßïßrýØl6zzzƒìÛ·£Ñ@(R.‰‰ Z[[ÞÓúÅbø|>Òé4«««øý~4MSB¾»»›P(Äàà šV·7DOO—/_&™Lâóùp8JQÁ/®‹••uÍÍÍ\¾|(óÏxbcßñ:–ð‚¡•|d„ï¿pYÑÿÊ+¯`³Ù(•JŠÑHœG<gnn§Ó©˜¥ -G£e‹9ŸÏ“N§©««c}}])âÓÎår¤Óiâñ8š¶<´´´TX82'e/..񯯬±d‰©TŠÀ|šúl–eÈf³¸» —5Ú½&æ¯(Ô/Ðê5’»VÄS‚qÍÆù@­¢¿T*‘ËåÈåmJpšÍf~a¸ŽW¯…±Z­ŠÙµ®™YlôóörT]´pDc}}žÑáAKtÙm\^¸Ê[c üü>Î_çöÅÝL§v2¾&‘H‹Åhmm% ±{÷nŒF#W¯^Utˆb  ¸zõ*ÝÝÝ Éd”5-þé»­@¹dm‹ß¿··MÓW ˆ(ú¸€ññqzzzèííUŒ¨@¡Œ´‰`–¸Y§7oÞTÏ1—Ë‘ÏçÙµk—B ¥¿ zž"ÈÆÂÂkkk,//³ÿ~…`Hÿt:Ûí& ªg%ÈF P^Â%®IÿÒÏK}ìl5ñï‹"¡‰u/kIŽÃFððY{z$@¯´U»`ÅÅ&ãè²D"¡Œ6ÇÃÈÈ{öìaÏž=œ>}Z{& ¥ÀB÷àƒ*E£££ÇáC‡Tÿ“'O’N§yðÁY^^ÆãñÐÐÐÀìì,™L†ááa…®x½^ººº¢¿¿Ÿýû÷ó /°²²ÂÞ½{•s?í'^"•JUhý@¯×[.óû„S*•”" –{±XT“Z¯ÙÊ¢Ë_+ “´±±‘}ûö‹Å*¬~¡C¯D£QŒF£bd(øéBŽïÍ•¿õkqN$×q»ÝÄb1þY‘“‘þþ~^¼|YùæŸ}ù2™ ˜›åb¡¨, ù.n‡'–ÃìÉçèhoçõÉ)Ün7©TŠSÓÓ”J%~Ålâ¥å(ÓÓÓtwwóȵ+¼~;‰Ýn'‹ñôíÙ ¼r}‚––J¥ß>s†T*UAÿ™&FË,–nðè!ÞFa¡H»¡ÿŽòÍß¡³ÓG2åRô7/-2—.3w¸,üšå_¬eú|–ÂR -ì~ØÃÉÓeãzº™™2™ ¿^_«èïŒÙh>ó§Nxô•žOŒbêúÖþÝwèþ¥§ø‹?ÿеvE[['OžT|WW—bXÉdÇ£ Ï……õ]Ü===ܸqCA»"4„a;êêêˆÇ㬯¯«ïâøð‡?ÌÙ³g•KAž‰IpªÌk½Ÿu``€¿9AÑïmÝË¾Ø ¦ížU¼ÆZš†ÉcdþÊ<ÅåZL¯¢¿««‹7nàr¹H&“ìܹ“>4B‘>KŒúœk»¥¥%2öU¢+9Àe±Xxê©§”5‹¡…BÉÃà‘Và ½®n./\etxË W GJ~æ}ûö©ÀY½Õ/.3±¬eý455)ÞårUF½ÕÂA˜ˆÀ’688H&“Ùdõ‹°òûýØív厓8±_{í5R©…Bb±H©T" ‹ÅˆÅbêóìì,©TŠÙÙY"‘ˆbü¢è£ÑÃá°zþ‹‹‹$ ™L†@ @8V|7•J‘Ïç1 ‹Ee„Èøòyff†T*ÅÌÌ ápXñ<¹G“““ ò–—Рç‹BƒÏçSðºÅb!‰ iZY™¼óZ[[S/ýñx<® ö††õ¿ƒA¨k‰DÈf³ÊÒ÷¬¬WƒÁPáÎR(ëåË—Q÷PŠ€&ê×ÌQ¹öp8ŒÏçcnnŽP(„ÙlfïÞ½ÊÕ$rBƒÒÓÓÃàà v»óçÏóØc1;;«Æ_¸O ¾¾^MXa”}}}J+A_*•ƒäôEbQ‰–*Œ¾««KõA/M,Dy€Â„D[—èd"è¾ÔF­u°ØÖŽßï§©©‰¿œœâ‹|œ`±H*•âbIcÄdä¥3n·[ù¬Ün7_h¨c>"ÒîSŒñÔí$ŸìëeÕf«ð÷_ö¶Uô·Ùl<µ~›ŸÄîn|>^¯—oßšãs#ìÕÖ²¾¾Î5«l†·|~ZZZ”…ÕÔÔħ åg/ô}>~¹ÂӇ˓ºÆoâL Ë®Cm¼Y¼@g×Nº@Só^ìv;_h¨ãlpl£SÅ1,Kü¹U ÁîÑF¦Ïg±h%0_àÆt¢¿7—å ß¯èwö÷óÙ3<}Ćå‘`À ½Éù¹sj|_Ç0v»Or|g.Àâ⢂ä³Ù,ápX1„ÑÑQ€B l6}}}ÊڇÄB!òù<‡L&Stôàƒ²°° P³ÙLOOétš®®.\.±XLAÒ°!Ù»w¯Šóë˜[æ²Ð?2äÀÀ2¡p‘vO9ØË~ ˆ;l#¬i—k± ˜qtÖPAzf³Yù8Þ^Žâ³”]EÖö ‘å’F._{g.Ëš¹Í-0z6›¥¯¯ÄêivX£°X¶p%hŠ<€¹Í¨Üºœ$¬V%hõëG¬}‡ÃQaù»Ýî ¼¬ŸT*µiý  ·üE!—5*Ê‚øÄå¿ÅÚ·Ûí–SS“²¨%%PÓ4Î;G>Ÿgee…Tø¸õïB›(\ÒDX__gÏž=ê¹WÃßbõvvv2=½8+ó* qôèQåbÐ_kss3MMM„B!º»»9{ö¬šO"HWVV*dÞ—®ðËd2 áÒGü¯¯¯+¡. ¢´êïù|^¹S”Ñæv»+à}=ß•g˜Íf hš¦úf³YFGG²#±KÙl–X,F±XäòåË?~·ÛM}}}Epn"‘ÀãñTdgHØ@?„ÿïÚµ‹¥¥%:::TüÐÀÀ;wîäÂ… 444àt:‰Åb¬®®rþüy~ög–îîn, ³³³êþßOû‰W¬V«š˜V¸@§r¬T*177§|¬’ê§Oíƒ 4@ïÓ¡?77§,¶úúúMA~°í+J€KG˜÷ŒÓÅçF†y`zŠ¿œœbtt”©d’óçÏ388ˆÛíæ/'§S9ʱXŒ©©)L#£|o.À/tøé|û:§n'ééé!¤Q‘Ó|êv’™™¥ Kl€ih˜YWOíÚI×Õq¾}kŽ#GŽÒàÔ©S ÑÒÒ·oÍ166Æ¡C‡èìì$™LråÊœÇ~Z) LOñƒðxô°…N¦Ï„èê0ÓÕaæÔé Áej:öa¶! *ú/æééé¡îÖ,‹Å}»“ÌÍ7Ò²°†Ù¿ÎîÑFZ–™¹¢¦ÍƒÁÔ®xýînÛÚýßù.¿ù¿þ:ççÎ1ùÍ»1‚Á‡É_bò›Ìíøw|ŒùùùrjݱŸæË_þ2‡µµ5Òé4û÷ïWиÌ+úúd >=uꇣ‚‰Çãqòù<‡C1Êžž5-ý‰³³³j.‰ïX¬ÚÆÆF¥tˆ+G\N2^|ñE<Z1€×ëäá!+±<íž,G†ëh7˜„âxLì4—çdD[ÆÛºx<®¬ÿ:Ç*6»‡®Ž$óÁ >kŽá}¼#¡ð*>››P6ÇÒÒË%M]ãÚÚZ9Ðγ‚ÍÞÁþ½.Î_ á5xüŸ7òô?úcN|ókô­qa!ïX·S *øO/¨Dy–µ"BÛívÓÓÓÃØØF£QÅ è3î¶þm6›R.ª×¿(úÔ>@¡™L†¦¦&úûûCÓ4¦¦¦”_~llŒ|>@{{û¦ Íj÷Žði¢Jn×_~›ŸŸ¯àÒÇŽŠÿˆ+BÞ•™³¸¸¨ŽÉu¯¯¯£iZ¤¯?GÞ“É$ù|^eˆU¯ê"DðW—þz`}½ŒzŠëA®[h+¼xee—Ë…Ífczzš|ä#q---Š€(ëF£‘L&ƒÃá ¥¥E¹RDñ—tJ½ï^,.‰p¸ì[[[CÓ4>ö±a4éîîVÙ+ííí<ÿüóX,^~ùe{ì14MS˜mmmÊmp?í'^¦×þ«µp¨Ì –Å/Á4‡Jÿj-¨`þ°+²>ú_¯}B_ÿ>88È‹—/3b2²ØÖΕ+WH¥R*"=•J UÁ ÿúê«ß§’I^ŸœbO>G¤Ý§ ¿žž¦¦¦”°aØhàõÉ©Šïmpy)Ì®ø*‰ÝݼõÖ[¬¯¯344Ä©S§X__' ñéOš«1¦S)æçç9|ø0ÃF+«¢ßþˆÌ™×È/¸°zœ™Ó—ñ†4BZ û#{2µó×&+è???O0¤1›¥uOÌ›WÉ/¹Ynm&X¥%TVÞ"­påZT J—ËÅÐЯ\Ÿ` ›ÁþˆÉÿöòÁöG†˜|î<»1òÊœÁq°†!S;Ïš% ñä“O2l4ð­Ó§(•J*r]‰dnH°Ÿ>Ê¥øV˜šš"ŸÏ322ÂÜÜš¦ÑÓÓ£jd*Z{÷îUs¸««Kg )+Áï÷W½Á(ñ;óVj­¡°T¢ÝkâȰQýïr«ÂâaM#w­ˆÑ»WA¹&“© ßROÅe ŸÕÊð¾´Ò•Åe7Wã*n%N+ß5@&ÛÀ ÑÀ#¾ mýô­q°3G)ðÇ~ã?ñÍ““øÚ½¼õZŒ@ PÁüÍ…B455mZ?™L†±±1µnDø777«{ôNë_<©_ÿÕu;ô©~‚ ¤ÓiÆÆÆú ÂßårqíÚ54M#ŸÏSSS£|ÑÕë_r\Ïôs¹œ²â …‚B$çææ6õ—ãÕÖµŒ_[[Ëââ¢r5,..V¼äxu½ÓY.Ô%B\×W¿D9€XüëëëäóùŠWõ1ùe¹£bT¡T*U¸Ä!ŠJ4UךÉd8~üxÅ<´5•J)W(‹‹‹X,R©/¾ø"Ç'NW+ê‘=S2ôq_—.]Âï÷388¨æ[vww³°°ÀØØËËË TÄe2^}õÕ÷³àþ€¾¾>PÓÚÚª"ª3™ {÷î­ˆœÕkþò]‡¤vɤI$ôööVDžê-ù.1z«L†žžžŠÈß­Þ§¦¦8xð /-—Û‚þ£££üã½Ϧù§Ï0•L*HòܹsL%“\¸p}ûöqêvR¥ ‰ðïééáƒ-Í<Yâ…ù 7×ײU133ÃÍõuÖ××ùèG?JøÄãÆ üqnݺŞ={ø×áÕ¾q}ïƒÑÙÙ‰Á`àûßÿ>Áb‘×^{ƒr±¤áiÎrv.C÷!3§Þ˜g÷¡V::ÊVåô™ù,1ÛŽ ú¯^½Šß_†þ››rL§vѺ§Àé:ÜM „´7µ ³ IDAT&KËd./‘_r+wD;ƒA>̳…úÚ8çæÔøÝ‡ÌxÂtuÔ°ãÐ0¯ÿ·sdÝ455qöìY‚Å"ù|^-rþÅ Ò3 ÁÁA‰„Ê@RÇC:FÓ´ è¿P((†Ç ‘H¨L€ŽŽÒé4‡V•@ÿ6› ‹Å¢¬žT*¥É7€Äº˜×´{M E¹xÕL¡p›@(G ”ã ÏNg{ì’™|ïaÅô­V+W®\ÁãñËåðY­ -rá6âë„"yÚ½f¼#íž,–”WwÓÓÓ PWWÇáÇI¥RØ­3ìjãýÖÿÁé“_gQÓÈ/˜Öðó Á8Óo6Ò20Àìì,ÇŽÃb±¨ë)•JJÑÙ·oW¯^eß¾}ëGoùËw}ŠŸ¬ý;p×õ?22B0T©vX*)ŒúÈy½å/ßE ‹`×®]*­XÖš>¸´:']ø§HŸÏ§bQÄú”ç%q)ú&0¼(bÁJPsõøâ¯–¦G•¾º”/t.=Š!h˜þ]9lrèê8 }“û'©´R Mx°duÄb1Ž?Î0›ÍêžH´ÏçãĉÁŠ¢tH‘$¯×Ëþýû•ò¥w›444¨yg±X0,,,( rr’O}êS<öØcØî¸c»»»Åçóa±XxõÕWßG~. ô‘à ÑâD[Õ3¨ ŠD" â‘þ2YDSÖ+Ò_µ¤né»X4òp«ÝÕ5Ľ+¾ÊwæªXÇ?âÙk×ùÞ|P1§ƒrîÜ9žxâ )l4yb9LëÒ"§Shliæ+1.Šêš÷íÛÇÌÌ ###Äb1z{{yàð.q¼ö ?X‰a±Xðz½  üõâ/-Gq»ÝÔÖÖÒÜÜÌõë×9pàÑhÙ·Ûí|b-Ž'—Š!å¯ÿèÎaÞ,…¸y¶+¼YŒÐÝ÷Ñ ú…ùw®%(,i$¬6VVË  ¹©<·Òo¹0åJ)‚¿ã!åË” 1«ÕÊñ[3jü_úäAÞxcžîÆzø£üÝ{ƒ]‡:Øu¨ƒtv³gÏòä“O*]b=¼^¯²ÜeHÄ¿ø`oܸ×ë%¨ z9ïr¹Ø³g¡Pˆõõõ24'â_Rÿæææp¹\*Ũ¶¶VßÚÚÊÀÀ€ R&žH$T ëì쬊œÏd2ܾx›ñ8¾½5x 08EJ„"6Ú½õ`pÐÙ^®©X¬a<\¬È%—T.¿¿Ý/P(g)ŽØh÷”×A(bãf<ŽÇãaúNi*•"›Írôp9~ÀTú&ù<ç.e1´õ3}Ù Å;A]‹.ÞŽž¢kÇ0gÏžÅjµ*‡¾°ýN*ª¬½‚ _?ÕúRÀú¨ñ»­‰7Зv8Øív…îè@:&&&*¬xŸÏW!tõ‚CL,M¯@Ù p·þ’¦)Mªë­ßQæ%›@ƒ ï_]aOëCYá¿U™\9OïÐA/h(ldA _’q ÌÿƒÁ`ÅÿŠ®WÆ :¡H~``@!©ÎRÏÁívS,7Ñ"®ù¹ßú >@!rïô± X,T܈dcišÆã?N2™äÏþìÏ”òèóùXXXxß?œB@² Eó—´©j!‘œPä" SÉÐ z}I`qd³Y5ñôV=lL´êzÕƒƒƒedUùþ_üàã¤ù÷Ï=G&“att”sçÎñÔúmò{ùüÑGù÷Ï=Goo/™L†›7ob&ÜÚF*•â“}½d›šøÞù ‰˜™™aÐh ¦½_èðó½óðûýtwwóòË/ã}ð!n5¹)•J<µk'Ù&7/\ºD0äÈ‘#œ={–ö¼„eôaFkL|õ¯¾¯˜µžþ•U ÿËO}³¿Ä7OžçòÕÜû~†oŸ»Í‚õ4 –ÿù€—?úæiz{{bR¿»›¼«IùòZ\nL×1=›¢~w71#ƒ& ;Öð·¹r­,<Èùóçqûi"þ’©òûÕø'OgÙuä)þä+)ü—qìÃÏð{SÉ$/¾ø"O<ñ©TŠééi|>¿ØáçbI#X,âv»9{ö,©TŠ}ûöUôipáÂeåK±Ÿ)äyÛjcõŽå#•ÖŽ9B:fâNYàÏ=÷‡V…ü~??Ûìæ\¾ÀÚbçÏŸß–þ±Ë?àÈ‘"QkýÑöqµ%zp/ßÿë·T±؈“Èd2Ì/èÛd=Ý ü·Ù,æ¶²oÛßndz¶,~ægÊ%€õô¿qò;92B2媠_ÆïëÝÅ«7¥òìþUWæ‰ø½^¯ f ÏýÇã<øàƒ ¦\^^¦T*)¸Óår©`Àx<®ê;HÜI*•Rn+@=7i2·%÷ÊÊ«£³³ÉÐ>8H* ˜m`2žÀÙ˜cþjP¤„ÉcdŸi€èÔ$×–Êô—J%|>kkk„²>Þ••–K;wîäíå(¡lYÀí5×p=QþÚ®®.Z[[Ëû)44òðp¹е·kd2JÆ—Â2ŽÞIúr‘ÉøFZ›ÅbQ. Qª×~¯)Ì£¨^ÿzÅD,ÄíÖu±ŸÏ§Š¹Ýn4MSB_2EôJ€¤@ê«ám×ô± Ò„JõÅwâÇÕüV t™gú¢<â×–Wµõ›€{mf³y[à^û ý¥RI¹ ¤‰R­¯J©Ãl6+åáÈ‘#ÊòñÅ•;D\üwöìY‚Á r¯íß¿Ÿëׯ«x‚ê}"”ç>]Òét U-ææfžþyr¹…Bööv…ƒA’É$sss˜Íf®\¹ÂÐÐÐû1?Œ @±øEË—H_±`cñ B õd3½Ÿ ÊÚ¡ zá/AuÑ ½ ÌB_ú*ë{Kín»ÝÎÓ·Ì8]*MozzšÁÁAžÚµ“©ä:çÏŸÇçóq±¤áp8p¿ðWÔ ¨ê`Çæç·n¤ùÅb1ü~?Ö:X2˜˜˜ÀétrÝbÅáp`¼~º]»I¥Rôöörlæ&‡Jó»qッƒ| ¡ž`±È¹sçðûý\³–Ó¦´ÿ÷?Ótì§Y^^Þ–þ#u»8ØYC!Xâ¿_¹¢èo yI}Ûˆù…;`K‹äï”+¯7Wöµsé² s–7˜©KSXÒÊie‹%·¤ÈÔÎÁÎÖ¦Öy}rJÑ_{³^‰Z …BÌÍÍ)¿ÕjU ÌñçŠE&¹ÇÇŽczzšH$Boo/kkkªp޾°(¤Éd’t:­â:´Éu% «ÞjKDæ¶Ì¹‘‘VVV*² ®-m¤¯†#M=½$­6lÖÛD´eŒÞ½Šþ .¨b@¢ÈˆÅk±X”P^[[cii k»OEaË.„ñx¹¤ñ[o½Åõ·WU b}Z-À™s·°uv)!xüøqfff6e6H¤¿0~½ð×oŒ$íª×¿ÍfSHÀÝÖ¿~ÝêS %Ò_P½ð—}*$5ñ7Þ¨àEzÔAÿ®§O¯èóù-ƒð$J^I}þ)‚<S(0 ЇéÓ–«›(aR¾ºúår¹¶ü ¨P¶ê{·—ž~›Í†Édª§®®ŽÚÚZ<&“iuuuJñ‘ª~sssJÁ^[[cllŒ={ö(¾"èšðÑ»Àô›‰;e}}B¡ +W®e”B”‹ÅÂôô4SSSªÀÏüü<ËËËLOOÓÒR^ «««œ={€+W®°kWy‡RQFßkû‰W$PÜ#M…¤t‰… 7]|¥î”…¯ß EAå‹Ö#°ÁXÄŠ©ÎÍ4 2ãt©¢;qcR¹Î455a³ÙTßññqò{q»Ýø|>.\¸ÀLC#±XŒcósœN¥´y-VV*7¶è …Bdª I(b±­h4ʱ™›|o¾\ÊôÀì)„ÔßßO4åÊ•+Ô ÐÒÒR.ôÊ+[ÒßùðÜ/ï1 §ÿõÉ)ò{±Øv+ú³wÀ¢@õ»»™_(`öùU-‡T*Å\:C¶Ñ‰ÁÔ®JoEÿÀñã\×àìﯠÿâÂ5Ã#4{ÊE.9Ö’óßÙÙIkk«J-“f²Ù¬:WæO¡PP‚2 b6›ñûýx½^Òé4^¯—………Š’·âÏ–¼`}–Š}<‰  °aIÆŠ9,bmG£³›Äš¥‚~‹Å¢Ê;NL&“8{öìQô§Ói &åT …”e+²~¿ŸÙÙYúúú /iY’Ÿ®©_?’ 4ªŠÛvë*÷UЯ™—z@|Ûbá ÙR§ßh4¢iÚF$*7žÑ |iút:iz*©qÒ$¯Zh꛾”n©TRü\Æ×ïž·Õ.{BËv;¾Óo? þ/Ï­T*áñx¿åI>744¨—> Oß$^Fî[:fvvV•N––N§U%@ýuèã9Ó!•åYÈõ;NE” G}p¤Åbaff†ÅÅEÔ)ÅÜD9»ŸfèîîÞ¬¾‹öÿ÷ýß§ÿ}úï§½Oÿ/ýÛ¢éÛßýEÓ^ò5CÔ÷¸=¡a.\ÂT¼JÑ´SñjŹ[Ñgo<¨ú×Þú.+·ý¤g·_²C¥€®ïøÓ#ÞŽ7ÆÀVg+z;¦¾W¿$?Xλi¿d©a¢toÞ>½Ð—÷?¬µÞSÿjá(íoûºùƒhlÛ~ÕÊI¿ÑÀ‘aÛ;žåg7ÒP_Aïvýå¼j÷@µ°²+µeÿ'»RweÜùš!lÙ¯¹rQ3.©ãÕPº^øT÷_Jÿ‚êS-¨€Mð¹Àå"43¦G˜5RÇIJî/½¹å³ÚŠ~=Íz4àïƒþۗ˱חÞ,Ñk€ÁÒuLO¿¾=;–S–÷ï}¬TË üÞØØ¨,ñêõ#Á¶~¿_•é–5'…¸ü~?›Ü¢|éø*'âm¶ñå—]u.rêb†ïÏ98u1×_vñÅ_+—S>oÛv­ül¦¦¦¦}?ð£â»ß<È÷éßš~ &“Ïú3}ÓÓ/W*r¥R) »]…®júew2Iß‘\`ù^Ì$A@úhéH$¢òæ×××U½Åb©ˆ®ÖÓ/»z9Nêêêp»Ý˜L&jkkñù|444ÐÑÑ¡Îæ"ôûý~•W[[»é%OƒA¥ ýR«!•J©-@«_===´´´‹ÅTt¼l©n¿d©áj±Tñý/sú¢U2\_±MÞÿqƒIS*¤ò‡µV~}=ËpðÊŠ¡â™éçÀ²ÞÑEXÛ(xò·}Ý<½´Ìo47ñÚj%ãú£ZÙjË/—ˆjåï¿ÿÏ]üÉ_mé~£Ï¦WIc<\¬¸ÿkf ŸÚoÁ¨áÖí$kf ø:þÍï/e!µßfUýOO'*èŸL˜y²+Åd¬¾ÿÎ?±óµÿ^Pã‹RðòĆ’Éd0j‘ ¿y~¹@ÉØÎší),Åy…(bÉÿ€œåC(bÔ"*ØKcMqŒhýW©Í~—UÇ¿ÀRœÇTZÄT¼ŠÅb¡hÚ‹ÍW×mµZénH)ë94Ï„í7p•晲>MÜÔAç~Ó+Ж®L³é–L£_Ø–~SiQ).°aõß ýEÓÞ-ûoG‹¶¨¬ÿ«‹½wnï1“;|â6ÀäÏÕôÃRÎ4ó¥ã«œº˜a.SO8æW?\Ë…“7büþSr¦ÌƒdíTÏe‰‹…`mmM®êèèØTJYúu.òë-ãÏeêyæH !'s™zþæ·³ü›ÿ+Fg{ †Xœñpé¾ùÿý¶÷€SúõÕ¬ôi&Õ®~Øô‹pŒF£”J%¢ÑòÞí’†&Ç$LO¿hÕúÔEÉ¿•â’#MO¿¾ÏVý¥ è顉DTÚv㯬¬¨Šl°qÿX^^V¹÷rÝríÑhTýnµZ7¥aé·-Õ?·êïkkk[*Œ¥¯c.¹îòPED$‹DÿEÀ_-–øÃZ+/å‹üñÿ6XÄQ u\ÿ…ÿ’¥†ISêÿšÁÄpðÙëå{ñÊŠa“ Ÿ??ÓÖJXƒ+á°úü¿ùÛùB¤œjøÚjœ¿íëæ+H€žþür‰Ï¦ž.—él12=–#ªÁW?ÛÀÁ‡¬œº˜©œ:,–²òðWWšøêÿS$™Lr@«e~¢¬|õ³ |éÙ:žýãώ嶤2aæ÷>Vâå‰;[›ocO¥ ÓÌï|8Mg{ ¿õ­JÐ4“É(áiË~ürA ¾­HÒr¨â]¯ÔÇÔ½ÏXY Ï­Èší)"ŽO€±kñšÑƒ©xUYÒ¹\ŽŽŽfe q±,!ëµ²¥\¯AÜÔA" ;ó§);¨Ñ‚<üPˆù°Ÿ¶Ò‰Ä&ú¥íc‰e ö D žMJÌvôo×;úÅ!ô‹°/ûZ eEÀm€Pô?P?©6`Ëf³<޺ʟœ±ðÙã&NÎØùùågö×"|õ³ œº˜¡Ï™WJžTFÔÓ")µV«•x8FÆ×+ïÕ~±H$¢>ß }Õî=M÷Ò¿úÞÍø[Ár©Tªâ¾ë¿Ë9“““›hÙêü­ú›ú;N"‘È&%Pe…õµØ/\¸°¥ `IAäb±¿qµRAüÓtŽ?¬µV“ûõ°¹Ü?™LnÙ?™Lò¿•æk­›îqcc#£&#ºÊóâäjœo°•óÅRdþ²yþ¶¯{í%Ï}­¬}j¿…G9øÖò*æý¹¯­m5L&™(iô ¬åèìc_0—‚;ý{VøÊ±»º¦~ë[FeÑ=zÈÁ­IYuÕÂ_šüŒõ—É× ‘´Rïu¹Óê]€Œõ—±e¿NÆúËd¬¿¬úê|gö u¹ÓØö ³êøeAëþU…T©}ëïøÎ‡+|ý;óåÿ7À ó8¼ÿuMm¢_Ú£ë%M½÷LÿvýåÜw¢RC¡cÛ¸ï?GÑTÞ>Yj3Ì5$+8~L{€S3êùCÙU î=Ÿ«««ãÚµkªØÎàà ªûðÄO¨¾k×®Uð¾ïÏ9hlläD¼S3œˆ·qüC³üÍogÓàäéóÛY~ç“åç G†mA?ªöè7,q+É]7‡øû¤¿«#ɵ둻žSM¿0'¿ÅšÕÃêµµµ Ø B×ÃçÕÖ°¾Æv5ýñx\Y¾úþÕ°¾ä2K¹^ø:U[6J”ê«pÉÞß@Åa÷Ú_Ž ýzz¯ã›L&…tÈŽhñx¼â~U—!õx<êZÅ¥QzÜ­¿þ7}%3(çKAX¤Îz©TbaaR©¤Æ—ò£úùóY›™Âw—ÁÀ ¡WØp@p ÊE G)>¼ÏJ.ªñ+ µýõslÍlÁe0p6±`@Ùšú—6RZ*ñX“‹ùh#o\Êñ—±ÕŠÜñ°a³…ÉxY)¨žÿýF¿û?5ðÌS œ<âCÿz…鱯,mm)éi³X,ªÿ§ÿO;¯þ»<ÿ“¸ê¿•à¯^›Ov¥xæHAÿÏþK†X|[fמ¦¾ß@:VfìIKYÐZŠóDŸÀˆA)5Zsá%c;ö}‘‹‚Ñ1ªú×÷XN~Œ¸õŒˆ[ÁV ’3u\í .wšú~¹(zúI­î§çgý´·”¿>ì§F 2e}š†Ì-—]MÁÓÌšá:Œéâ̇ýt?âæõÁ úºCB|YÛPîF·t¬MõŸ¢7º¨úßþ^ä–4VØ€ÿ÷ßQhŰ】7ÆVô'ggùx_‰.[’““1þý3 ±8P§F’<óTþÛœˆ·1—©ççw”÷g˜L˜U!‹Å¢¬~©! µ]o]åäd±’"lR}0—Ëñ̾ž9RÀ+ó.[’.[Š¿ññÝŸØÇëÏx橾ü’“/_%*ϯçÏÕþÈ·U"‘>Ÿ¯×‹ÓéT["V·í¨ÔïèèP7v«sßÉ=88ÈÀÀÅbqË›µM⋞[7ÏçÙ³g϶7z+šêêê”ÐËçóìܹsÓ&w£?˜™½M>Ÿçãÿ8õõõ[Vmª¦¿Z¨ª°„3½Ï­BßJàKÓoرýR äÆ_[[Ãï÷+$uÄåÜjët«2Ÿâ¨.#z¯ý处é{_®Wo±ß­$©¾Ü¨(0RÜã^úW+1RŽTýd ½»D_W]?¾¸1ôóçg-5üA&ÏKù"ŸÛoã¡„±BØK+jšŠÐCèO´™ù·Áì¦þ“¦šŠB'&³™5³EmÇ å¹ótwŸ¿²Ìß..Ñià|±ÄÇë¼YÒ*6Béu:7)ýF´ð‰Ÿ«ås_[cm.Gg{ Óc9&J_ýlƒrè›Ð5ÒP_Ñ?þFqSÿù e7—Â…2‚ñxëª àš[V¾ÚïÏ9”k ºe3ë¤cmJ0ZŠóXŠó$-‡°ËÁb9S‡R2懱çÉE¡¾ß€¶tIõOÇÚÈ™:°ƒÄ­e >SÓAsú9ܽAun«ý{Äûhµæþ~.½Y~¾5Z‚±ƒ‚±Wi^ ÿÀ˜FÜÔÁÎüiŒ¡y`#¿Þúný¦Ò¢‚î[ Z e%@2î&e[úµ¥Ký]Ë‹ýïFÿ e˜ßmØø­c%ýƲB[Ò:ý¹ÙçIØüÿ¢Æ±ß8ÀëßšWãù%§R,¬‚å¢`c_gñ K={¹Ò¶‚ ¥™ÍæŠà±d2©¥¤mA›Íf:¤vMŠD"„Ãaµç¹´­,è:´°Ä-‡¯vfoq3^Ü$ü«éw“ÕÂJ)H²¶Úõ$Vs„èJîž ¯×‹iYÃLs{¤ÝI?vë áˆFbͲm)M=ô¯ßÿZ¿¿¶Ð¸ý" ·ÚK[|+úãñxÅø.—KÓm5¾Þ&ô×ÖÖÞ³빚þ{¢Õ. ©~¯ã‹õ/ô¿`»íLïµé]ïEØÊp+\àŸÚ-¼”/òY›™@±¤‚·k‚&%“IB«Æmû‹²S<éçí8€7K‡vj™Œ'˜Œ'6¹ä{&“!ª¡» xôŠ®’Æ+KEÆÃÅM™ ¹\Ž5³…ÓÓ ¥ Hÿc_0Sœ3nê¯G˜L˜™L˜Éf³<Ù•¢Ï™çȰMoˆÅ ÓÌx¸´I (zELÅ«j¤6û]ÖlOUøÿ% dlWBTè·™ãªMqŒÆ=Í.# 9S‡ú,ŠƒÃ4QG×gn©@ÀŒ©í?e}šùÓ¸Jó¸Je«_Rè œF‰D6ÑoÔ"hFO…õ¿Çh dÚPp 5nKÿvýE (Û+è×g1@Ù÷?©m ò‚,€jú3™ ãá"ï+ÈÖó;Nsêb†1íöÞVVÿïþMŠ_ýp-/\Î)ÄMæñòò2===¤ÓiFGG9qâ6›`0Èêê*]]],,,¨l!ýüŸL˜¹r*øÿkßäws’1íF}qžýãY¾økM|ù%'Ï)ðè® rƲ©Ó¢U([ÕjÞªþ´¾U Åjk±ºVru«† õõšåælµ •´íèŠRGaãóvMO—žÖ\Þ†%ç{~s>ðVôëiMZm8n[Ëõš×¶A¨®¥­išòI×ÕÕUÔÓ_ívôÆe\.w·4:¹ï§‹6,ã z#šòVitpoJ€Þú×Ó¿ÕŽ]Ûõ¯¦¸g%@¬¹†÷¢T#ðîýNeïEñ«½ÿ¥|‘õƒÇ׌J[ PìwëëvRå×ߺ½áK×Ïÿ°‡vþvq‰7KôSNº3 JøðŽ.®è\aÕë7ªÁ¯~¸–?ú/·io6ò¹¯­1.ò©ýÆÃÅ-]Õ1 Òß›©©èz:A(›«Ph«×ïdÂÌg›ÊAcEßú–‘0Íu.*EAßz'5N,]½`.\ÂTZTð¹-ûuЦ½it…l“ýšÑC!¢dlWˆ€ô¿=õm¦ uÝP 6›úÌ-nÛw2e}šhÍ!ú3 [ñŒÊ:`dqQûb{aIüÿØ{óø8ëëÞÿ=û¢‘fF’¥‘µYFò"ÉÂX’1¶1`  4 [€„¶„ÀMnÓÛ¼š4i›Ü.Ihš’4)ɤ¤M!„Þö–&“…bL¼±-c„#ËÚ­uF³ïËóûãÑ÷«g¤‘lih/çõš×ÌóÌsæ|Ÿe¾ç|Ïò9Š^m1=§ ãöóÙIYŠ(”ÿjã/Ä[6þÚÚZ’É$5¿ô#@äƒÀÇ/°þEµ†Høš¨·Føñ¨¼äï+áKûÝy¡XíÂF·à)îîîC¢ V Øba¼ˆçGxvwX©[kä_Rûƒxt^~çý%y9Ηžuñ³¿J26žæKûÝü–Çÿ¶(|§ àmFKAX´‰Ko†µ@K.—‹šš@–áù+µ,î³ŠŠ )Kô¬ŸW:qüJï¿ðblذaUùZ\pA‡ã‚×FK…ª(Þ(¿öx—Ë•7΋á_éü{*ÃÌF>~*Æ'£I.5ø€Ù¸*xÎþ=•‘U‚ÿ¶ÚøNeÙÁ„‚Á _óÎsÿ% ƒA®ý×ùšwžOn·rÿ% ¼g]=?YŽ=¯¥¼¯„¯7¼LÎÅb¦âD"<|t¾àj)}ù¶œoÑž—Èö.DYC«\²=ÒîŽ=DñfÜŸxí¤TžK1õñà1¹_ð 2d{°9wH@*AN§3Õïw›dsâkÔ]ºøÖìK´oÓËx»¶q™¶to鸴ûÅy^Ìø­[:.jüÁ`I÷5r±'ª ¿`@!oüâÜa1›kŠ/íW=s?µçõ9¨¯¯—à<â¿Sè?$º>²¯8?ñ{Kç0í³"PAÍôÿÛÿo±äõð‹1®ÜiÛÀÃó*€‹¡·ûøW«`€·vübU¼HÛ})iǯ«Ùl–‰~ çbǿԋq1Ý̉„T¢Âr¯®®&‘HH0mw°¥ã¿@ë(ä€Õ½Kùµã×&^,!A=Ù›õª V¸ðÅk)-õ€¥R)^Ðx°È"WþÏût<›ÎÒ“Í-Sž…<`§r ^³–"§“×ffx¼×Ç þ€ôhiéøß»ÍÂwO©^4‘°- á þH$Âs½JÞx/&„w}³ÂÿéSót–&ýòDjt¤’ÜÒAfv’´±ezH¼k•çR©Á¶MEÜ[Àö‚oiåHkéÛ·é™XÀÑ$¾(z"¦½Úøµ F€¬å«Æ_RRBcIl–Aû6=©i%Ïí¯¿è„'žŸÛ7æøñ¨™™Æ’Å8N¾ò~…±ÉÌB½}N~÷ÞúÝ3Ù< áÙôz½Äãñ¼œ5mÌ?—ËQ__ÏÜœ 0U[[‹Õj• ~£‰btóª¸r}B†®\ŸÉ¥»;¬üä•”|~~“ôŽðÎøåç¥ ¾Â_Jo—ñ¯4v¡$W2b´!-rŸ¶u§èm¯(Šü\hüK{–kó0Ī¥ŒaTWWËwÑrYô3߉°ŒvüKI é]ˆ ]aW¿0 .¶Š'™L®¨ð—ÒÒñkQþ.†––jQþ •É.¥¥ã·ÅâtϬœ3±”–ºÐµÊO(OñnM~O§Wf— “œPÇm¾AfÍ ,~mŽ–vüÉd’Æ’X^2àÔ”‚Qɇ¬Ýœ;E|ôe&Ý×›yõ ßœþÅ[>þÚÚZfggY£Lå%NM©å€KÇoœaؾ“ÜÌ«2†îr¹8>Ík¡ ªÇG£Œ%‹ä {&‹Ëå’€Ãá¹gâœB¡f³9o¿ønnnN†‘***Øãšâ[/™e¨èÇ£v’É$¶XœC*Y–(Â'&]Üÿž8ûû WÖýgÒ;!€wè¿=­ä._^¼H{£L°<|±“Ö3±t¼ÚngK;Ÿýºè7ÕÇáäko¼šBP$Éã£çàt:ß8‹XKT=MC"зE"2¾oåñ_hÜccc¬õ¿ #Å*_ìˆfAN§“µþ$ßozüÂõ WÿæÜ)™(X4²Oò,íòW KÛSC»O„5WzNV{~Ä| ¾ÏR×¾‰—Ø÷¥ýî›Mýg’®±±qÙ:!khe}MXƉ†&Šßp?è²âEësµ~ÐÚ~ÜuuuƒA¥×PV<„/¼ž²â¡…ßX€!»ØÏo¤Ó餽½]&h,ÿ”——388ÈØØ˜ìý_¿­­Mþ†€±,//—¿£U,KÝßâøwøÿßå/ÔþÐJ“dgI1¿<‡nÁh*‹ÇðÙìÒ(ÒbU\ ¿ 7Âß3<ŒÏf_Uþ† ä ±QE)ÿ3Ñ|éÀ´µµÉk+þ‹ÝÝÝÔ××Ëù¨®®@þ·ÛÚÚäqbÕ*”öÒÿ}SSgÏžett”ë®»€ýû÷ÓÞÞŽÛíÆï÷ãv»9{ö,‡àîWí|÷®œè˜ e±{˜UƨЩãq´ÌDê ½Äk§±{äý{÷ÿÒóÓú©®53ÔÇ-%¤x)Ñ•à¹<Îùñ7ÿ¤“XÑ<öh©œ¿ßw0%åoí(¢ç鵌æz©×«Í¯2Õg¥ü²ó˜*>CUx@€lË,ëÚíŒtÅX×n§g_G­ê)‹Œ§q†ªÉ¶ÌÊmG­‰uívúÿ ›#8jMDÆÓ8jMLR\§zéÂc)ìÑR ›#r ¸ÎŒ£ÖDöŲ ʯ׷à«((üñ7——õf m­þüUH†„[G$„è•9|áôÊvKˆhºQоbEÃá@¯ÌM7b·„ð…kòb?Ú \Xl¦P¾öôʦ¢²§ˆ¦›)+"ÈÏñ”E_…ÙÖ€^™"™LJ° ñÇíïï'Ýó¯¿zšªéI††p„CÄÆÆM466JPž™™\.WAþS§_atx˜ó##TDÂo˜ÿÍÊ¿Xþúúzjjjèïï' Ênsv»«¯¾šx<ÎÕW_ßïçôéÓÇ>‘HàñxäCôÿÿ›üoÖ¸Ýn.µZðONb­¨àRëBçÀ…ðIG±ƒQƒ‘’PŒÝNgI1s9%gÂáp`˜š$³  C&3©˜L¦eü lDÁ?9‰gÃ6¢ÐŸSˆ444Ðj2âsº°zç¤üuçãšk®¡¼¼\"/ær9b±ìÝ»—ÆÆFæç癟ŸÇåra·«F„×ë•¡%±’Ö‚ÍÌÌÐÖÖ&]Íâ¿.Â=Á Z¹k×.Ün7z½žX,†^¯'‘HÐßßÏu×]GSSóóóø|>JKK±ÙlØl6ü~?±X Ÿã$ñŠ(ÃO¹ëßÖqìÉ¥=³>*tu8ZæØ~£ŽŸ a¯0’ åpׯQ+(½,HP‰‹æØsm ]/G©o²29¤DWŽçò8»o¶pè©æÉ`–ÚmVC'öÍ3øK|R¾e4Ãé“QƃÓ8CÕ/§mo’®—£˜®êp0™ÆéÝÀŒù©PŽX4'•°Ùi`]»×Z±hŽúSªâݰ·˜X4Gd‚úY êj><–’«vŸÊ_¾Õ°Ì3 Ž$Vó#]1&?6ÁÔÑ(©`¶ üT0˺v;¥­VRÁß,Šß[A†ÒÒÒÏ‹}CMºû}ñT þ…xª„xªDî×f‚jWõbõ¯íZWQ¡þN©3E4݈Õ5ïIÉlkÀfö£è«0dOÉwa%yß Ö´Ýngô¹g%0—Íå)Ñ5FsÙ³ú™iÊ6ldllŒÊÊÊ<~-ÏdfñgLªK)266ÆÆËù9x»^G|!ã=n2M$‰/$~Ù3é ʣ㯯¯gllŒ––ur/p½^Ÿä«ßÖΙ3g¨¬¬$ âñxþKño»¦ŒŽíµ•ÆÆF¼^ïÛjüýýý5Lt•8ÿo«ëÿfH¼©qû°ÒÄ8ÖŠ ¬V+‹ïè(‰l–(dœ.6¢02=CgY)‹Z©á]¨¾P…’PŸMM”¼Ôjadz†ŒNÇ\NE]Ôî8ÞT ËZµÂÃpöu&‹\_å!h±Ð;>N<g]2½®Žë«< ôôp‰ÝFÚéÄb±pýõ×388(•½Ýn—+òÉÉIr¹£££rõ/zÁéIg &š ƒ@ômüV«UÖ ‹kÓM7I%`³Ù(++CQ&&&Ðëõ ÊÕÿä¤ZSïõz™ŸŸçìI/•­)†zâTí²s‰7Œ¡ÅŒµ‚áÅçB¬oµñúdŠÑÉwýÛ:¦G™žLé]Ãü°BýÇ¢¬Ûë`s(‰é2 %N‡ž °aG]/G9{&ÁžkKHëaz2ÍôË6\º&#Ót½åúß/§¨Û‡Òh³ÖÌôdš®—£Tךy}2źµfv~u-ç÷G˜žLc<ßD¶& ´¯'A|6CY«UUÈ/E¥òž@z ½èëâ„ÇR×™™9#1—ÁÝlÅQk"ÏÉߎŒ§±,ð§Bj’g¶ßAQó¢7Áד 2žÎ“?9˜¤¶ÕÆ5Ÿª`ðD ƒUo8Em« ÃɆ·Mô¯J†ÒÒÒÏ ×¿?d¡¬x‚hZµˆµÈNZ?d‘a- û=‹•~("“TLj°6´¢¢›Ù/WýZåït:eûSqŒ0}áÀiŸ~…Ù% Z%*(@…ÛMý¶v²Ù,555yükŒ*kÍ(…`6ÇV«™ÉLV –µµ·/çƒêê_“%.”¿ŒAfÒ«Ê_iüÅ»®d2Å1j0rÅWÍf™™™aãÆËŒˆBD¯×‡~fšõÛ`ãÆŒŽŽ¾mù×﹊¡¡<þŽ«7c+ZÏO<Õj¥¿¿ÿm3þüà˜E@$ TËX,&€7¾­®ÿ›¡ÈÌ ¶PKì6ú“)¬Þ9.±Û˜ˆ'ˆúýRK·|:-·GÂR~?åÙ —y*éO¦(‹ÇÈØí„Lf¢~?:³™’P˜ÑHÈd&¦ŒV…”ßnv†j½žÓñ$VïÙTŠó‰$>Ÿ“ÉÄd2…'àT<Á|&Ãd2źd‚‰x‚‰‰ Ö®]+ïOi©מŸŸ§´´Tb.…ŸH$ ¾¾žD"ÁñãÇe;Z1g‰û/æ/—Ë%¾ž±±1Y®êõz)++“òËÊÊH$”––J…‹Åèïï§±±‘X,Æèè¨t÷§æŠèSæióê9gQØtNÁÐb&Ò»†’Š™Þ ÎždkGƒ¿p1«ŒaJÛ¤»?rÞÄ™dˆ­!§g’´yõ˜.³0ý²µÍ ±3"ú[;Š8ýC#!Å˧‡ñà4õúf_/¦×$&>c‘¾±tÞDØ—T'·ÛÍ]wÝÅñãÇ%³Å„¾ÊÀ™\† èh¶˜8‘(|ƒ ñ¯F>›²ø¢Ûj5þBãïêíå›ßü&òÁÐYR,ùxàéšøÎ_¿Ÿ£'T$«?ûÄ}Dþ&ßLÚxò÷qû}ß–nNq]WâßÕ©&0‰í‹áomh c‹IòïÞÕÉ—¿þ•ÎÌ9¼*¿–êëë±jî 'žx‚+¦ÎóR×r~íuÞþ®>ÙÙÆ]ñ}5„cSc5ùñ²r™ Öe·ƒ‹ìý ð‹ø»6;Y„½D@oo/ííí+Ê×’ö™ÕžÿÅÜ?qï—ÒÒû÷f©¨¢‚8p"F‰Dð9œ…å÷J$B 8¸àÎW"lñ˜Ü.Äog19Jìcá(‘H^bàŠòCaÕè^8®ÇçÅP¿ŽX,F™F¾ÙmllŒÆÆFvïÞ ¨‰€@€ÆÆF¦ 8Nº»»eˆR›\WWÇŽ;8vì˜ô ÔÕÕÉPª¶Ís$ÁétÊÕÿèè(MMMìÙ³Pç5¯×KSS“Lþóz½8NVd¢_¼všŠñ:zFF؆UÇžÏr¸rŒÙXß:Gõó)NŽ–(ôÖ!"ýbEó”DËyyxŽ«lœÉe(z6EÈ%t 6ìžsð\¼¬ò‰D¿©â3Ô‡[è9'ÿø†óÇ¡ºeQþÖ›&áé5 Y™äG”µª¥ºÚPÀWÛÎêw#]1éž¿l"2É>p7«ü"1ÆŸUŸIw³•Èxk™2(o"ì÷ï³ûƹ馛xòÉ'—ñå/?ÄîÛØ½cuuÕÔÕUËí#GOðÈS/®Êãž vu¶q×ï¡®NíXG6Ë‘hsGÓ3<¼*?¨Ð\6Gçµ×rðÈѼ{Øqõf:¶¿'º_c×®]ÌÏÏçñÛ3i¢ŠÂïüñ§0ûŸœ¡å·ï¡çÐA2&3‘¹¹Uåg4ý´-‘Å>ÿääŠüZ7°Õj•4S©T^§Æë¯¿þ¢ÎßXgdf>“wþ³Àªã/+Îé›âࣿäÐ9ôÄAŽ8ÌKçβ{Ƕe÷ÿ­pav–ç%íš…¿®´”9£ºogY)ƒþåÙ ñ²òeÐÔ‡#`W•Gò‹ã‹\®¼mC·X,l)²·ÉpA…ÛÍ\NagY)n7}3³”Åc´640—S[[‹$@»ÝNqq1ÕÕÕ;vŒùyuÂ?}ú4 466211‘‡#! cŪßjµâñxèéé‘×uttTvT ƒyÏ…ÙlæÚk¯Åívc³Ùp»ÝÔÔÔpôèQ)ÿ•W^aýúõ455qþüy H¯ƒ SH5Œô.#¸Ôš¡s§ó\Žu:ÅÝ^÷Tc®ˆé]#=’á³Î^ÄdʌŜà—‰õ#ë-FB§’ ™­¸tL¿l“AÅ)Õ °{<œñ&¤|ýx–š”žâî 3›ZÈ•ÌK€©1Áºv;·|­šÓO°Wñõ$ØîÕi1ÑÚ—ã¹CAðõ$°W Œ¤銡”$e€¹Ä€¿/AYŒfìc¢:dhÀß—À¶ÆˆÞ¤#2ž&µf^ºø#)pè™íŠ³áµ¬”z8Nx(Åšm6éˆêúö z&Ã#äÖD™îOPµ-M‰ÓÀÖŽ"^ž%i çy éÊâÅXfº?Aý%NçÇS$r1ôkRè'OÝà IDATËÏ`!Àh®GMóã)5A)ÿDÿ³iÊl•òX}ÖÐ*•­/¬–Zñ ‰õõõ”OÐÒÒ"W;KaW"Ñ®×år‘5l“I~ÚæN§§Ó)KÅ>Cö”L,+Ê[95[Lr¥d¬3æMœÆ:£\UÃbb–ào¶˜Ø0£ãäk1rSY*Uå+,õ¥´”¿Ü —²µ+}-‰’¤BüKÇ/¶Åø£ŠBÎ;Ç|àNÊ.ÝÊã?.K”Ün7£££y¼Z*þ„ Ó¥fŽ=±ÎÈþýû9~ü¸ü~)ÿºÛÿŽu·ÿ­~˜ßþü3òµ{WçEñïÞÕ)¿;rôÏÍ×1wä0toûùµÞAK·!¿†YËï³Ù)ÒéøþƒOÕ»>Á_ýÇ#|ÿÁ¿§H§Ã‹^ÔøAM6{âÝÅLüyU^ýþjüâ9ž)‘ô¥…¶Ûí}þftËÎÿBãßÕÙÆ©ñß DäK{/ ñ¿ŠÅb2A¯³¤˜X,–—´góyq8L•8¹ÊS‰ÏfÇápÐYRœ‡ <„±X ›O]‘Ÿ…åç¥Ç‹mñßÏC$‘I‰B~NÉ“?Uâ”ü@^àþýû5ÆþÔSOQWW'“ý„çD”í ™Ú$@Q– yñÅ%nƒðˆ±jyDéÀÏþsü~?û÷ï§¾¾^& ʹ¦¼\Ža%ê,ŽÐ±ÅÎñçÂôŒ$8U‡+Õœ¦¡ž8°è9X‰`|<ÅËÃqæR 8UÃcà˜ºžƒ‹•|ƒú('žƒ‘®ß½k„ÿÛ:@]e÷4ëií[h¼à ðõ$¤w`¤+&÷§‚Y"ãiJÖ«Öîf+±:#ö± ›ôFé ð÷%¤w 2žÆß—Àì409˜ä…¯Írͧ*XÛh¡jWW¨Ê¿c‹™c1Œ}žüy¥|A“ኪÕyD$NžOqúd”ß¾ÅMuíÊÈ®!E}Ö=É`VþÎùñÕµf,NêüþnüÝr[$^ní(’ò×·æ{ôeÅ‹+míþJ`¾p\™‹Ï…ÀV"ÇB°˜$E¿–D¬ÖºûòÇ¢ZÆõõõrâŠ{“ÞÈ@¥: µ®³²aF''Õf‹‰úúz¶oß.ùoÇ;ú*ftô%ÓÌ ]HæÑÒR~!¿rMjEE,¨ü¥ãòÆpÏŠ-W]Må™^n¼ñF¶oߎÓéÌ;­òýòסá'>œkÔ—u¿Ì†”-\“ZþBtçwÊÏo„ÿË_„¡Ò½ôïû¡ \ˆ?qùN>tÓMü{߇ÛíæöOþ1¿ÿù[©[·+Ïnô¥üÖ˜:9}ö[ÿÀƒw£Ûu)ŸýÖ?°]P¾P0O¼»˜?xµ“š¿™Ê3VãuâYùÚg¥¥¥E¾V“1ÏïjüâþÄåà#.ÿ³iq…°{Wç2þ7KÂØJ·,®.—KVl^hë*”r$¡?§È ¸¶›õ:™+ª’×ÍÚÌÿ¡0‡›ÏK0äJ·‹XmTøN§“XmÍÓ2ù±Ú:YC-\þBI{½^º»»q¹\2$ÐØØ(CZì€;v‹¡ñ 8†€@Âåïõzq¹\øý~¹@!¦¦& 8+BmÖM“›Êròµ¯{ªIí¶b÷P\gÎÃX‰Š‹Œ§Ø¤72í*%Qo€9+F‡žŒ-¶ªâ¨ žY&¿*¼ ³Ó‡ ‹uõëÚí¼ð5µßדÀד gDU°e­V©xx&Fk_‹Ó@x,E*”Ã\¢–l™KôøûøûGӜɩ+¡øÒ‡ãØÇ2zæ5J¼ç%Õè™:eêh”3¹ '_‹Q¹Ãž'䯽R¾–Ö¯#XržÀY5qý§?ôKå-”ðja€]9±¢yâ³jÛàd0+ù †6¸Û°8 ’OT\œ>ek‡ê©XЫqÿùº©å€5²¾bbB>Ü‹”&Ü¥"ï`}^⟠1A‰Lw§Ó™ç10dOIÀ mœTÄñ7éU/@Ç;•w|{ÿÇç¨T¤¢ñw±zÚ¤7.ì*¤åò3côU†Uù É_:~g½)oüu[/ãñÇ絃¿$q¹Š›ýÀ066–wGŽžr>ºØˆ"ýjŠWÚ.—JåøñãŒ-ã¿]ˆWgënÿ;¾üõG¨z×'øñWÿŽŽ-&“¾ÿØÈQº^}–ç¨ÑÛ®®.Ž<ö ö1ÕxùçGıc*¨Ô–ñ'ìERù½ª@>úõße(qø‚òa±ï^ídØðo¸þr–KÝ\ðÞ/åß»w/mmm´··S^^ÎwÞÉ3Ï<ÃwÞI{{;íííÒ¨]íú/}~ž 3º ^?íýÈÍ-ÂÚ9zbÿ›%ïB€þœBÕB¿ððU…‚j¼}z†ªzÞÊŠ]¬ÔÅv,ãD(,s8Ķö;Áï³Ù±ù¼D"¼Ùüddûø˜4‚Á öñ1ºÎeòEl¾*¤æO<öØc¸Ýnyoº»»©««“óÏÓO?ÍîÝ»ñùÔgRÛPÊétòóŸÿ<‘Ndý }ìØ1i$yF€Ûíæ‘G¡¬¬LòwuuÉa€}ûö±gÏЂ¢3¹ }É4¹©,¿×"Û¿`8{.¨ü³9rSY:‹#Ø£¥*þA´ô‚Ê_È×WèØbÏ“_Þ”§üAUr ®èµïec9Z×Y9˜KÉD@¡p#[LÌ¥H³d"êó å %e†¿Ã§pyƒó‘Œ,û3:T#!Qoà|$C&’#Ì’ féŠ1÷b,Oþ&½q™üuíö<ùKɪÆÕdaGØ@ô|šêZ3çÇSùž]uÉ·Ì­zíìÑRlFÊÆrd"9É?ô‚ÂùñžËã«ò×ë[°8 ì¤ñp~<Åø/7óÓúÉTçç›éaqµ/ê÷µîAbŸ/\Ãúšpž‡àb=ÚNw8ÆÆÆ0dÕä¾¥qáèîîÎs¹i íêk Ra“Þ('ÏŽ-v*ûñ<Ï<ó gÏž•nÕ¦¦¦eaµžÉeäJ̦×aÓë–ËR~!ßg³K˵‰ o%~1þàh:oüÜxã€:¹=óÌ3|æ3ŸÉ[ŠÉàö{?Ggq„á÷”1üž2Š>ö‡r(d‹kªå?rôÛU*çÎ;ïä‰'ž`k à‚ü»wu2òý?ák¿˜X¦ü/†_œ¿}ìe:ô:ÆFŽÒ±Å.¯Ï…øaÅíU¯ÇŸ}ö‡”/< v»ßÔ<óë1üóðMÈCœ+Ä yê©§øô§?Íðz½ìÞ½›}ûöI>-ÚÛ…Î_ûüvl±ó‰Wðÿuþ¿sè%ùúà“G Þÿ·‚l>/³³³œXH¼‹ÅbdGG8 ãÍæ¤011A¹AÍç]¦Ôµ¤MäÔÚPœPôâ÷¤üH$‚ïÕÓä&UæúT"O~vt„ªP¡°,Ü¿¿\• ô>P•±ßïçÈ‘#”••©2Vß@@ÎQ‡’Öû#’…Ñ ‹áÍ`0(K…Q^^ž—$zâÄ |>‡¢´Tý_ºÝî<´G-E"é-8ùZŒíÌ1;;{ѨsZþ3¹ Å‘Ua¬ ñŸÉeòä¯D§Èx:‰¯¬Õ 7ÚéiÖˤ;QΧ¥²VÕ+!0DÖ¿»ÙŠéJ§j“þD© –ÜÍÖ<ù€”oþ`1‘ßsPµ«ˆÉÁä2ùí*Í÷J,Ðdxg¨šçC ®-±r‹Á‚3TM°ä<ÎPõCŠ{´”™R¸&j¢¶/KrЄ¥1aÒyÁDÀ7ÎP5ÇŠ³ì¸Å`¡Í½“nÿ‹Ôë[–y$ ^™¥¾¾žùH-€¬÷/P „†:£££9PÔû‹æ Úÿ¥¤íg/E7%½2EÖ°T|„ÊÊJLE;q—Ę¥ºáæ¼RAu¼* ¢¨É<ö×û(‹êx½(džºb=k+M¤æ²Ì2˜â1Fº_Å_­gSÂ@²j-çΓüÂjMÍe)V=[­f‚Ùœ,ç$PØ´üeQÑDR]Éê–{¬±(:læ‚òµã¯­5ÕÖËØ»w/ÕÕj‚Ý+¯¼‚Ùl&‹a=ÞCΖâÿô4mu\óñßÇܹPW€¿~Gñ"o2™\ÆÿgŸ¸ääºg²LLL°Ç5ÅŸ}⾋âñsë_ÿ˜ŠŠ úffyú¡OÊóŸ¼ ¿öþ™ÚÄ^=ÇälZ*Å׋r«òé ô:Èÿú­$ºv‚ÍåOa £Oü;q“‰dEvEþ±Ñ×H¥Õ?u:¦¤üJâÁc””_I&©*“ˆ;Qxx˜D"Áw¾ón¾ùfÚÚÚØ¶mgΜappÈp‘èv¡ó÷r6Í6‘±¡“|o |ÁûW™JÐý­æ_~˜_|çŸðýüqôkŠ!›]výßt3“I&NÆb1Š««)**¢¥ÔÍ ?@‘Ë…µ¢BÖíÇŒF¬t;dâ ¹¨hYäË<•’_$ýiŶÞ墥ÔMÜ^D*•³a%%%\b·q(Çd2ájl’M”bF#ž (N&©¶Xظs±XŒ`0Hkk+ÇŽÃb±ÐØØ(“톇‡±Z­(ŠBMM *,lMM ÙlV&ãmذt:ôèt:FGGóÅsPYYÉ–-[H$ÌÏϳeËŽ=ŠÙl¦©© ½^O.—chhH&ÖÔÔpîÜ9ª««yå•WÔçrÁ³±#S½‰n3;|ˆ#Ïü”¾c/á•+Æm‘ÜŠüÁÀ¸œäL&!ÿ&“I*ÿX,¶"ÿä䤬êxõÕW9qâ<òGåĉ„B!¦§§ñù|òÙ¹Ðù‹çà»Ç‚üè—A6% «žj6LMk {nßÍ{6ñ'Ÿý=ö¼wd³¯¿PF¿*i«"3*ÈOÆéâÌœWB÷JŸp›Ï‹Þå"ãtÑJ2èHe™QA~Ün7#áˆj„-À‹rJ›Ï+·7ëudœ. j–ýÜÜQ(mÚ@Äberr“ÉDmm­ŒÍ¦&©Ú¸‘ëꙚ™AW¾†òòriD‰Ir~~žššY±d·Û¥¢¶ÛíLNN2<ÉìëÚíÄ¢ •\IóÂ*=Íñá[G`$Eòx9gG­Y*ycOŠ´S£Ö„N§zm3ñÅ\N‡£ÖDÉz ©SEd :?Rƹ_„óä7½ß‰9 ¾á¹¤"¡‡3F¿óp-¾×“؉X¼yýBŠkº³4ɉ°] ÊœR$¿[ºÖ’¨gá¦#/žKË.‡¢•8,àh¡}³†V†&³ýAùc¨‘pÀ…E¯¨ñ¾ØJpÀ¢¾_ÀkiiÌ_!{J†îºë.Ξ=‹Õbb`¡Ù„ˆåwl±sòµ˜ÌF¨TØTe„‘´L„$¿¾Ê@n*˦*#¹©ìŠIq@Aþ¾±4W­3ª—u‘ƒ skÙ$pßXzUþBãy8.ÏãCû<ð@ÿàà Ì9ª†1ãø³* Ì7ª~Bn*+ÏM_e¼ ®®.ÿø³ÃœìãÁ/ª^}•Ûnø‹‹æoÑG$ÿí÷~NòÉeØTe\•_{þúÜ+Äê.gó5Ž?†J.(ÿÊœzõë¬yçMNM°ÓëW—e.¾8¢ò€ü¬¯2‹¬~þ" P7?-&ÀÅž¿öù•)zýêçÿFïÿ›¥Î’b¦Jœ¸€Ù…üš§Ìè‡ÅAGNa6ã*½Ž)’ò¦g¤2ŸÕ,"¿€Ž .2fc1¹Ýïp°9ĤIf< óûz‡5c´«­Ãår10kg=pØ Xâdó’ÆI½½½´´´È=`ppP"O ׿֕ê\&ÐÿÚÚÚd8S4îMÚÄiQßHTK€ÎÎNY÷/îoSS“Ü'¼ B‘œ‰a_ÀP8‹qUeŽ“¯Å½ _‹…Z$ïÌÌ™ ;ì‹qXo¢rM r`qáspFÝîBÛI<ëgfóäê:«”"ìÀn‡~ÅA7D"‹z¢z±îÿXqƳ‹p¿]1œ¡jf{Æ$:ßwïa]»lË,ÎÞj ­‹MƒgÈÁB³Ÿò­6¼§Õ¦Fþ>¯D¬Øngöx Ãæ8öþRFºb´H ­Âx–yeH@+m£E& †›ÏQß×B€Åð·V·Ùívy½O„¿¿i›UœÑk®û…»TŠ{!xû¨©qñð‹yòµóS^@[ïO• Wæp:è•9â©Rñ±UûAkû(«à>5²‘PŠ¢0™L©¨~fs°Î¬®@…'!23C¼¨ˆe¥xU~m,JÄbett”t:͹p„µá‘¹9B@Ü^ÄÚpˆ‰x«wŽ:õ{‹•††‰ØØØ(CkÃÃø\.Y)Ë嘜œ”È€ÌU+ÿºº:ÊÊʤÛßårÉcA…>wî%%%òºoÛ¶M¢655QUU%Ýþ¥¥¥rŸ‹E­/--•@;¢iÏÚµkåŠ{vv–D"Á®]jÞ€@îf $¿˜CGGG%(Tkk«ìd:99)CYY6›Mºý©®®Æï÷388(Ã5¢XÜ?¡Ü…âY£‹HW¿øN('-içdm×ÅuEº­WS@RñX­Vµ×‹_SS#÷R@sÁiÌNs ýŠ¥"J`*¡W5<°Åi]ûD~@à¬ÚýoKXÏp¤ýµ,PTx`£C/»ŠüP ‹X4G¦7µL¾Ëå´7‡òäSdŒ:²IeE(à¥×¹ò_zýÒÚk«½æK¿Ó’ŽŠûâ]`XHf07Bj†ÊÃ¡ë «–ž4¸O1E*S¦+Oùwõ)\Õøic»TæYCk^©¢0$„!àr¹ –8:޼—Ø'\e‡›sGÞ~ñÈ6z~)•¾xw”^ÃFÏ/åqZå!r¹\Ô××罿QÒžÏ;ôŸK›uÓoŠ_ ±-ý\hûúïE[oÞ¨üEó¦7eX¾CïÐÅS-¤†äj}bÚ¯©Auõn(W•uÖKÇ­*vAY/è:§*ø\l;Tc"=®nëKhX«ƒ\ˆ†µ:Õ ("mlÇ{ˆîî“Rñ·7ë¤GTo,*¡ÜÅ»!ÛÃúš0ëk›y_¸¦`C#¡Ðµ+±¬¡uÙJ_f!;wàp8Ð) ‰ «úúúz©ôÅ~±™¬a›Tþ‘ùV4ÈÞ½{ioo—À2ŸùÌg.ÊF‹@œ¨‹wß}÷yÕÕÕqÛm·qÛm·±wï^n»í6|ðÁ‹æÿ„ò߬›^f¬fÅ®}ï,Žp"ì(¸ýv¢¦K¬Ê{›Ê_nvKÅåñx”/ÜZ¡üìŽê·½2ëèèP:::”¥ûn½õÖ_iì[n¹åWâóxþñËøŸÃáà¾û wôâ£Ãîf’½)vÞûç<òÈ#ÒÀ©««ãÛßþöªü÷íZ¯Ê-Æ#G‡$(‘ ýèGôõõÉlå³gÏÒ¡×¼¤‘gžy†OúÓ|iß>>dÐSýÞ÷ñ¾÷½/ÿþûï— ,ä¤.$¶þººº¸óÎ;yèg?ã6ƒžµ¿õ.þê¯þ*ÿ¡‡¢¯¯O¶qŸŸ§Á?Oð’FŽ?Î=÷Ü“'ÿãÿøªçû«ÒfÝ4[&¶›Í\n¶ðr*É?ÅT¥¿Õhâÿ¦=ù„bï,ŽðQ{—›-𠼨"’ÿtfåÊA7Dϱ]süÂÂÿì†è9~VtÉ›<Ãåäñx”Mú[&þºß/C ±XŒ‡_´ó¹éófðx<ÊÝP8W² IDATwßMWW— Í\{íµŠö3¼ù°M!¹¢nÿäÉ“rÿÉ“'uÚmPñÝj¿7÷ÒKy<j‰x?Ù pó?¼ñMíõúuÑ®¿ù’rͧ÷ðEËîÿÔð‘ÇãQÖ\qû0ô#rÿšm6ÅSÿnnÿ×9ÿ¾ŠÇÿâûoz\Gé,Žpü¹,‡õ&JJJ”P(ôk=ßßvØ”¥(²ÂØŸžž~C²¿p[³²{W'‰ÃÊí÷~Žƒ3zyN?>‘¿el¨ 1ìW›aLLû©ñ¸1e†H›žVãô k¾Arž)¡¦º RgU¥¿àž .(wUùcÛ¡ºûkœÀªÒ¹oxbœöæ tõ 7;í ÊÈsûyáá%HX> cüBé Èb­Â×–1ª’ªòÌZaA±ÇƒÇ°9wS¿C=Òª¨^‘H„–ËîÁ¹ë߈Pî×ÐÕ§°‘üý†ì)i8N<¶1I×þÈ‘#²ÜTŒò#GŽ088(¹Þû'Ïc=ÆÇ>ö1>ó™Ïª!Z kqèµåiîUù¯¹òöïßÏ­·ÞÊã?¨IE¢‰‰Pà b”:tHUæšRÄGy„|O~r䧯¯@Uú û‚—4â<7È7ÞÈÓO?ÍÍ6P½P=±”T¥¿q[ ö¡s´··sìØ1nhjb­¦q‹–„üÿ<ÁÄ4!ûöí9rdUùo å:“æt&Í?Å¢ô+>hJñqG1;ý+'•j•ÿ?Å¢üS, 'Ôýq›ø¸£˜ûó\ý %ÿ³%û¶›Í|á× üœÑóã_çñx€?®ãÁc#|î©Å‰Kx´F‚–¦§§u]]]y ¬··—k¯½Viooçž{îá±Ç£··W9pàÍÍÍ'uðR¥îξ»ÇÀ ÿq^÷â/WùÙÇ~Ê_÷ûu©ƒ—*ýûcr ¨xñÅq8Üzë­ÊSO=¥ûÛ¿ý[åßø---<ÿüóº{ï½Wyæ™ghkk#°Ô0UiÔÔÔPWWGgg'O>ù¤°ëËMì}v¯ràÀöîÝKìÝe´ ºùèG?ª[Ê*ú_gg'ŸþÉ‹žôÅ5Z˜;Þ°P{Ë-Êøxažæû•±“'xá«+2»}«b¾ã.\ŸþÓ·\aŽ>ÿ¨îT¥o¬v.ò/ð¥5+}--Uþ]} Å›uÔ¿®`Ù¤“F@ï+I×¾ðˆD-i=Ú\©è ­Rùk Å÷K·Åg‘¨]á‹Ú`á°µïbî_Ìóˆc…ÂîíUÜ––z{{ñ–ìÀ–ía]Û"} ã ¼kòY—路·—»ï¾›§žzJz/DýqEE³³³Ä<{—ñÛ§Èï;;;éíí•Id"™¯­­îînFô­ËøoŸþÉëÞEww7÷ÝwO>ù¤äûÑ~Ä—öí£E§“D³FÙ - a¼/Äý÷ßÏC?û 0§ß¥MÂC Œ‘øÐCñ¥}ûØS^.!S É‚‡~xë“7ë¦éWÓÞ½{éêê’òm[¶à) ?¢èèéÍq™+]K½þôÓOSVV&•®óÜ ÍïU]þÍ«¬Ào3èY»cGn:€}è¿õ. ß(((Ák”ÿŸA4ù5‡¹Ü\Ê}ùO€2ÓËŒÈ|§RŠx¬ÓFö¬Y®ü?â."@(|†¸ÑT ¦__à/7»ãfŸ{jV§ ìTW+JÇ»\±üåf·r:“–Øôô´îÑGTEX__/ À{¯~õ«”——KCàî»ïæ+_ùʲ1x<eì‰Jžÿ–—GRqþñ^ Wî*æ†ûËé{D=fïŸüþ æ­®ýß‹ÿôô´Îår)©ÆF~ôÅ/ª†äž=;vŒoÞÌÙ›oáÑLVùÉ·óÔSOTz'ü~îºí6j>i!þ¸Û§#ÜÿâwùùW¾C}}=×]wÛ~oýÉäñk•õR¥ºõæÊ{tüdƒÂé}¯¯8éûÛ߯n·K¯ÂÒPÀì쬲oß>žx≋2„›ÿ{øZÏ€Ýn_Ñë[¯æzìeqÌGäö¿†"üð>½ Ç£t×y8ÙÐÄO|™òxõ„ÚÐêØ¦Ò°ºôC÷ðê÷ãÑGÍãY:–»¿x»òJW†ÛÿuŽÇÛ¦‰LÂÜäK<÷ÒBxeÐDpÒ¼Äk?œ.¨üÿè¾÷pí§®àþü#õïÿ%ý åÍûø€rÝgþ]÷…[+”“¯Å–)ñééiéA†Àó_SÃI»:Ûxøè<ÓgW7µÊ_üÖûšÿœÜT–éH>¯~Ø»žšê&†ýÛöo£Á} P= %ûÁPN…N5 æ§ÈøTPžaï»Pæ3%`pª†Á¤¢î¿ä ЗP«ž)Q•ÿT¾‡@(ü®>…îî“y†€ÈôoÕ«Û£u„ûùD¢`}}½TÜ".®Å- _k…ù9âxáæ×6HZZ>(VoõõõœÞ‡£ô)?2ÿk®ÿ ©èmí»–¡ ƒMD|á"æ?ĽáÖ-¬ùð`ìSÈMeIÛy衇–5q8¸\.lÎd í8šu8šuoÖI~A÷Ýw_^]ºïr¹š(^Q~Ç;ic;ßþö·%z™ ¾¾>NæúúúøÄž+ñù|ÌÏÏ«¦ Ê·¯¯ó?þ‘TÌZd¬ÄÉàà ܨ6÷z½x½^Ö.(ÿÁÁA&Ÿ{Vz–Êv—Ò××ÇﵨFÆ‘ÿV6ðÓe\nVëË…'@|.DKC™Ñ‘=›ÅÐd߉ãV£¢çø‚©V*ú—SÉ·êô ’ÇãQþ=çäk1<ÿ?{_U™þÿÞÆaxð˜è¤¨ èÊ`£ S›«K!T¶®Mk}+Û2r{qÒ›mYû;ÓZn»Õ²‹æ®»è–Ú¦ è0¦(¤HÚ(& *ƒ8 <¿?Æçpf˜·sJížÏuq3ó9ÏsžsæÜ¯Ï}3 y(ª Úä“‚°û#ž]sȆ&E‘ì%yñë 2ן^¯' ÃÓÕ¿ÙlÆúõëò4¨7`ñâÅ(**"­­­NɆTøÀÃÓ#‘õôRlÿß6<«?ûÞ8…žÝïcëÂèÿ'YO/påååÈ*z¥¥¥˜ƒeË–è/¶ôlü(¼ôÒKXóåNÜäÀØ3°hÑ"<ö“Ÿàã}ûpùC%ÊÊÊðÅ#‡qÓLGëï‚‚<øàƒ> ]ÉÝ0n“²hHpÿùdü#‘`øÅx0 C²ÈóIÉÿËÏc?×ÜÜ,S(øçéïØc”|ö9ŒF#ÑëõÄh4’M›6!''Ÿ|ò ôz=áŽ8B/¿BF_M^t¸ùwbŒ6£çÏ' Ã_XÊ4cÜZù7<²;èììý¡J‰,[/:;;±Cˆ¶¶³Ðž8æö8·=þ8~õ×rl{ë-tvvbÑ¢EèÖhž‘áöóÜk;-Œ|e¶#Ô㯠c±¨–a“¢#~ܵ^œ¢;ÐÜÜ,s§Äp…•©w&=‡þ%+€IÏš‰¢Þ°mÕ=äÊ®× éYC®ìzŽ8ÿ¾Ï.²Uþ\ÑÜÜ,Ó?5Û_߃â{þÅ÷ü« 蟚á3àÊ®×Iˆ®?µ/#=•¿Y9°ù— ß$èmëß›Oÿ¾jͳ¯_ÅØ˜ã¬û¿Gž†¦“5Ž ê _ÍößìÂ[éèNnØ€›ÈÝóO·r…=}* 4@ãúܸ?ýÍÍžz¸.~ã§<úWA BŸæÐÀé›0fÌôNðG‹qkÐ ‡u_­g3ÿ—-[†y󟄦h‘¹´•kJpñkÇù'þêGÝ~ú JKK±sçNvn‘‘‘ÈË˃qý^ôÈÓú¯¦!|’ !ÿ(†U=…‹o† ÐÔÔĺ³²²°xñbÌ›ÿ,bXŠ‹5UìøáZÇ—oÞ¾¬¯›‰½»Œ(--ÅŽ;ÐÞÞîÈ…HNƬ¨HœTE8å!п-‹Óû¬¢Ôéè4‡I2ØFñÈç¾O¯Crr2[…-5@Û¸ñNyôïÆÆF§÷©t-êP·¿Ñv °.2{»»ð«Káøô<\³ý¹üõ鱨]gƒÑvi€à)ð›žSlòßo®&ê®ä$ÝRˆ P·%Ü<¢S厢1O?€…ïÕ㣇’øÛ“¬ãÉuÉ0 INNÆ'Ÿ|‚åË—³× âÇ{ 4€&ªÕj,~°û kN÷âÓå1˜•š<5æ¾Ù ¼ñöN<Õ…÷.„ S×òMçY·ûm?ŽÙ11ØÙÖ†gsrP8°£d5žÍÉAii)2ï* r²D©0­««ƒÍfƒZ¯wÌù'?AØ"ÇyñÈaö¾/**ÿw·¿ˆvìúÙªP"""&“ ã²Fbt}l£Çx¼w‹ŠŠ À½÷Þ‹‚‚äääàÔðýøöܤbòüWYø¢t'¾yû-Øl6tÄ/Ãè _¡gÏ4G?‚Œ…rœ¬1Á5W€aò ý22ô?ƦÝе9vc=,ÃÒqc‘zÒ¡üÒûÄ]2½9‰‰ìkƒØõ<Ä7eþ|ÂýŸÞ‡!šиÿg¿Û¥R‰À™çpþð0ê9à5þ¯R©ÈÆgç‚ á*S-Vüù—¬'ÒgüÙcNºÃsÝïTW™j‘‘žŠÜ«9ž„9éYCVæð ÄwV¾Ù„82üG§ìŠ€½UåħŠëèëÀ]s—Æü'G»ÍMÑââ×Á3â* Av³Ûb@ܘ?Í àZðôsÔÒ0@À¾Ï& r^€›f=ŠÓ'6!""±·?ïäîwý{ûó¸l®Â鎱£Ææ° @]]æÎ ‹Å‚ãMáMéO†À*·fD³Â“ Bš˜˜Èö]è‘§!*q?ËZ¾ÃÛظ}gg§Sï†Ù³g£½½_Õõ±ãSáÿÝ+d7ãî»jÈ755Áf³!==Ý© ê˜+v]hw+üéÜ8å.pùŠS'ñuq+üé܇ljjÂÌ™3Šãß ¶¸þ®™ÀþÜú¿+\ q…?µü×EF³a×m€î®ðw÷?ƒ‘À0 æ\êžà0¼w!éáЦ(ð+ÝPí“e'( õ’Pe ¨¨ˆŽø>Í¡ÛX©pçw²kE¦¤$Ù–£HðÔ,|ˆW û@ôÿÆ*«ƒñä£Axú×·ûÝyó€þ÷¿ò nlD·Fƒgsr••À‘“"7<ˆ%«³cb™™‰ÒÒÒnhº”¶¨_Öñ^sö‹·—÷!.DƒÖá.DQçwh%% ÈnƉ¶qˆ“G¢µ«èudÿŸ"p„®|…Ñò«.ÿsã ~#[NÉúC0: ñZÖšo À™of@Ù½“ËÎ|3#Çïú(Áá>ç¤ÀÉ@ãå? þT! u¸Û]“½Utuù»óDFF²•8Uýóµè·âââ°jÕ*$%%¡´´_T0§[3¢±lÙ2”––²Ö °dÉDEEaÆ ’ ‡ðÏËËc“÷¸y6› ùùù˜;w.öíÛ‡¿þ­aÿî»ÙñéC˜«PÜvÛmŽs#É2´2ÔôlÛ¶èîŠÙ³gpÄTÓ£¢0¦ÃŠ“ªìܹ“ås 2µ¶¶²cÀœ9Mg[fÇÄ`ì…ó8­[·² ÁµRî :‡Oz}ãiH€þo鉈®I€T8r…ê©îïQ¸*®q~îÿîr+ ÆO¹á ÀÑOþž`Gó5§{qóˆ><ò£¼ó•ÕÉ@ãÿ@¿rH“É„%K–`ñâÅ2ÿ]“Àl6–Ž ÄÌÞùÊŠä`<†Ý‡l¸ågŽÒÛúg³Ç0 dÙ²eÐétÈÏÏG·FƒÙ11¨®®†N§sÚnºcÇÖà*Š‹‹€å`“ZËËË‘ŸŸÅý`ûÓQTTT  ÃFŸ6Ȱgä(˜L&§d;îyúrs?K¿ß4oÈÝýîM0¹[_êð´k€z¨ëßf³¡:&Y¶^¿Æ ˆ1SÒÓ‘“˜ˆüü|™Á` ®kO±è¥»‰æÉ3xgœCÁÿñ£³p"r7ƶÏĦ’yM\t7›Íë¹Y¡Ïþ_¶ ðbd'(IßÇ–A¼Æúˆ¥þ”uùs­ÿþ¥O€;êÅðfýœz­ˆS¤9:õ„¤9¬BXE1¾sô9GËU8eçl• «‚ÿ«Èã:`?M·‚õåN_KK’¡ê£ÄÉC@A-|êîgOÁƒW€û>WipMús\wÐ/·Ä/u÷`KS·¿;oÀÿêOhZ²d ¦OŸÎ*\÷'·N@}}½S=ÕzÓÓÓ‘––Æ*yyy€uëÖ9Õ ¸pá›EÏUn»í6h4VÈÓñ—,YâT'àèÑ£ì@ªpqçòåH¾Z m€ ?{ãÍU ¹ …Z¯GúÕ> Tøé°â·Ÿ}> +wwüÙWɨð{á<~ý×r¶r#Å`*4óŸ‚ |À±‡ßÝV@o»¸aÊwÝ èm€«ðŸ<À0Ø»²”ÄtQ‰ðaí˜ gÏeó±NŸÝÊöᇂ֠HKs(óô=ì®ÀñÐþ`¶cõ>{¦…à‰YÑHzðî :‡5§{Ù{‡n¤< ß=]ZZŠÌÌLÇv=› w._ŽàÆFTTTpö>pÇŽ1éQQ¨¨¨`•iÓ…  õ¨‚°bÅ £Vs¿ËzÆÉ‚àtSÁïKˆFRXX(sW€*'^Ýÿn0zþ|µòéÿß¼ý;7o|î¼ý±|Ýñi8eJz:¶½õhˆÀG vÆ ÖµÏ0 ‰øq26üé‰[œ©ð÷ä¾ržó”apt;àVðæþ§ÇØÄÞCéW;™z²þ@†¤b2ú´gFÈ0ZÖ¿ pâÓœ¬ÿæ3¢­ÓÐjo#!Ü‘-¤ŸO·^ûËGÊœ¬V èI·%B}ôjv¿ Nñ}¬Ðw§P¸†\Û‹¿ˆ£Í· ðÐ"B®pÝï8¢–SSnšõ諞 ºpxøqX,çì8êÚú8LŸ>¬EN·¿Ž$)×:àìFOKKÝwl6›YW"·4ŸfagggcóæÍÈÎÎFee%.\¸À6/Ú°a;ç¦&GED®ŸŸÀYxS ÞîêM m\éoºUÒ¸ã/Y²ÄÁ?þ [K€rŵêàÎÚwU÷9ðPT×€mîªzRüÍø, ;AIùQ+X¹¯›.:ÚÎŽˆíÆÄ¹Û<WáE•7"77%%%¬€óTˆaòÑã TÖtbíîV€~0;õ8lY0ЏÎÑõÁ͵H‹‹‹‘™™é±æ€7þܹsÙp÷˜î¬q_V8­Gàî=zžµµµN[‹ŠŠU˜4ß;†!ÍѰV>ý?c¡ž Q·¿?ÛüFÛ¿Á™W…¼“ GÂÝú7ZöuF8<æÜ¨…e‚l€O¼:evëŸÌ9óßÝž~ßvM tý\< ˜³I€€CÀ»ÆÇéëÜPk2 õ¸îÿ§ÿÓ¤@N‚ŸnÜ»ëw ñ3 ÈÍÍÅôéÓûöícÿ^»v-êêꜬh®@ÁU$Ìf3û÷ÆÑÚÚêdep=˜˜ˆ¬¬,dgg*++‘™™ xã7P[[ëT’˜zèü°ž„Û‡Gã½}¸¡½ÝIiᘘÈ&õmèíC‚L†ÚÚZÍ™è9Ññóóó‘m€ èíC²L“É4`çpí’=eû»ÂÝ9¹ôžJšч#µþþ¤?š'àIð±•í†!éªpÌZtEÏŸu®ÔÒö5×eïÎÕïîuoÇãÆ×=­‡»ãò  ©˜ ~…[JçàËõï õãF‘oÓgØöç:êòßöÖ[ìë±3fà' ¬ÇÒïóqsl_±w¼?=q Ö¬û‡OA:Øà^;›Í†Y}O¢7k^dòÄB-øhë4´Ú̬Ûäq¬ÅÏD±Õ©2@ãû\%€  ÅNõÁm¡ Iw¤³ªÐD@šÍÎU¸Û]•€ÀÞøòs'%Á“‚@y® ÜšÿÜm‚žÀõйq ÿp-þÀÞýN‚:ÏÁæpA-yn6<µ~]]ètnîŽÑÚÚÊÆÖ© uu¡Ó$@W%`̘18yò$h‰ÔmÛ¶!..n@?®€ aO þ*žÝ]:®@–5!ðz)|ðŸÖ ›xì›+×í)áû n>€7ï€÷¹?szlZCß[ýZãZ®ltÄ]äÔ¨4ÄCÿ>ÿ‘@K»“ €@‡ Ýef…?Ýç/9p¿ÿ@¾CÁ˜3:þtŸø$Ço® §Ý[v?÷³À„ýµì¹¡``|ŸÂÕÒ§p ȇÿ²ðT÷?°w?öý› `®'l—@®;ÞUˆýÛSG?îü¼ñ=[ ;×q=5"âò¸pw Oów7oÏ!99‹åjiç~ï Ý `@ÜŸ IÚK¸v`½×Ñz– A‚ $Hà’V&A‚ $ ¿¨ þ§{Èþ£ON‚ $ü° ÕjɈ#uèsÛ`A¯×«ÕЦ¦&6dI+´rU]kТXmmmn Où­ ôo-t—|+)$Hð=Á–£í¡ Ÿä(*3]4`{¥¿Ø¶êReªÅo6ÔïŸõTð@ÂÄFâHŸ‰-²k¦èõzÂ-¼D€¢¢"466²Û¨kç ‚¿‘Ì IDAT­­ lGUÀ±Œ¾çK =*¬V+L&¦Ø»ªÇZºn%üÞß$HðC@vbÙÜpLæíooxaRyïBˆÛlowõ |ae^Y[u6› MÏO„ªhŸß|£ÑHrrrÇr´Z-ñGræø+0µZ-±^8Œ‰Žþõ@¿@ÿž Ç‘>»ÏÝ%ƒX,X­V¿Æ×jµ„¶Aohh€B¡@qq1JJJت¤tÓµP^}õUÇN“‰M\¦5_¢¢¢XeÀ›"@-þ€‘l£!nuVz´)àðH € ¾7p–BéØ 9äÄÑMƒòl£ÂŒ>ð= A:·ìÄ„»B\_§ÿ»ž í¦83EádñÓ×_üú¯=ì”Ã0 y8#Úo/- 8Š­Zµ sçÎõKèéõzºw7°Ö»?µ¨މ‰Á§Þb*ø°Çò¦FRVVµZ N‡²²2ŸŠ€F£!tq||ü€âitK²N§c{‰ìرÃã1é¹pQ[[ëñóEEEÄl6;•3?v¬¿[bLL [„-!!çÏŸW9ãÛR(l? .¸Õb¹ëáu_æÜ¹s¡»ÚŸo‚òÛÛÛaµZyo·¬ñÅð?˜ˆÝ‡lNKøò3Ò”¨2wòvá Æøôüý­v­øbÖPÖ¯7þŽÁž¿Øõ{ý´_ÆãQ*üBÊûüÅ‚a•ù(JŽ}‚•Aa¼,&*,c3gA§Óá䛿ÅA{/¯s;!‡Üš N‡W_w”ñ=qt“Ì—r ÕjIDDZU*<ö“Ÿ 33Ï=‡SŽŽŠ5552W¥ÀuÞS䎘kÑÏ L½=è>Ð…ªÃáì9øRd\¾ëŸçáŒh¬­:?=q‹ÏR²@¿ðw­ªW\\ìS˜RáϵÜiüÙ—"@Ýÿ #fÝ|bbbðõ§ï8}&ûéß²øëOßp,ƒÁ@***ئGØz*<Î]£Ñn¡·Ù³g³Â~ÇŽˆˆˆ@AAJJJØc¦¥¥¹Í 0 èÚ\ë¶pwUŠŠŠ}neæZïTÐétÈÉÉÁòåË‘€_ÿú×¼í§íˆ%w*6wî\¶D5§j†n›Ó‡Wmm- e:Ž=1ÀåoܸQ¦V«áÚÚþÙÊ]¢ÆÃ(ª ïPàů/Ȧʃ؂þò?˜ˆG¦CõÌQYFšc'ä\×ñéE/,,”Zzý…^¿/ªÎ ^ÿfâ výÜYVþð_üú‚lj`o>÷ü×½÷ ûž¿õã^mêÞ×ÿAûeÔFÇaıS²u‘Ãx¿X0 CÆ?ö8†}» Ùëd[ûà­:wnÙ‰ dŠ<±™³pCõnÊÆ<ñ$¦Èý:‡±rˆ^¯'´kfaa¡ì×OÍŸø‹>=Z­–tV• e/¿Œ··lARR’ì7 ¢kôhö3€³ðÏNL ®ÂÅÚT™C ö¸,#M‰Ç•¡ì9øRdš››eï]ÁÊÜ88Z ÁCQ]øÍ†zYÓcpÿ›ÿöùy†aH[[›S‚þ““ã—K»§Â?vÖŒ¹1±³x?`d [dعs'ÚÚÚýôo1iþ#ÂókObXãz k\ϾηИÕj…Õje‹©¥¥¥!55Õí}HÝî´ª¨N§CII Ìf3RSS‘––Æ6…¢Ÿ5›ÍnŸ ::QQQ8vì***pìØ1DEE±Þ×5ܱcÛkbΜ9˜3gL&û£Óé°jÕ*TWWcݺuNù*•Š|Ù€37ÄãHŸLûy¸vèT(¬‡€æ ¸Uèb~øá‡hmm%.µ—ýAmm-²²²`4‰ÅbámUTT`½ÖŽŽÕ_QQß“+h>Uÿ½ !¨V6aÖïF‘Moám=°³'Èä•^!SÞŸ¾.É÷.„ä VæÆ‘÷.„ðŸj|*•б@- –/_.øúY,Llš3^´þììÅßEƒôî! ×õñ¶`ØÙ‹ÒÓÐ^ZB„x, îlÂǶ©ä™_Ê{þ‹Óú3̽}䋪ó¼×ï½ !ЦaÛª{ÈÚªó¼¯ÿ:yÖECÛ}Óȃ헮» tÇvì~½ŶL2§!À«ààºø¿î#8hïÅ Õ»ñXÏ%œ]´Šøòp•ëG7ÉŽ7…ãÜÅq¸’¥Çº«HYYŽ7…³ßAOÊxMMŒZúÏ=‡IÿsÙf‘•}4àsîæ¿¹á˜ì Ý¿.~¸ sþÒu©2wâ­Î+N_ÊLss³líîlY0мw!/LŠâ­ÀÑFT¯}pÌï*r111¬Õo4Ikk+inn–¥¦¦¢°°Ð+×jµb̸rÓLœ‰˜À!üw}ù1fGÂÙ]ñªHÓ6Åæ×žÄן¾ƒIóÁæ×ž„6EšC6Ô²aXãú|Ú=277—µ¤Õj55D±sçN¸ºæ)há0ÚÇ„ z®RáZ Æé¹¨®®FYY†Î* xðÁqìØ1lÚ´i'++ Ôà ^FƒÈÈHDFF"::šµúGUVnˆp÷¸¸8L’5ãâ¥HŰÓ}æ¨À>¬ÉÉÉlwÍ7zPW˜¿‰®Œò…ôK"ôá%–?vBQ&ÉÜöîö—€·ð§ð§˜/> 숽þìCvêcÀ·­ÁP_­VKìñ!o ç½®BIÈøb¯¿Øó¡÷U&ÈXkú ½ô5_ç2vB ì= µZãMáÇ›ÂÙ’à¾<\?µúCNb]ÿÞÎÅU¨O‘âqeèáïïõ ž ÷.„°ýáQ¬ÌK"öú3x³{8.~Óè7×`0˜˜¶þ~qq1 eÔ³åIÖëõää·U¸x)’mxTPP€Í¯=‰ä`¤\å»khÃÝ0bÁ½€³»þ˜4ÿ6/ÀÛqôz=¡±oÚ1pô@ú¸ë5¤Õ<¹ÕDiÁjµ¢°°%%%ˆŒŒtª*ê ±š€˜——‡cÇŽaîܹ8vì6lØ€ÔÔÔëÇ ÐVÒ+V¬@||„×þ¨ÆÆFÖˆ‰‰qkÁ«T*‰-2\¹)™ü@B’ƒÑU×CÉ@W]÷.Ã0¤½½#¯îûoùË'NÉf€ð÷4>à(®ÑhPRR‚¢¢"žK™3 C¸=S<}Î¨Ðæ‚z¨ _·n‡G<55:ï¿ÿ¾gÇŽ3f "##Ùš?W[[‹˜˜Ð$AºEðã?П÷àšø—Þ‰/mËÙ`´ÀѤmÉ|Gêi²„ $ø‹¾€+à]…½·÷\ç 8gù‹õÂÐZúËpSXî<å_;Ø´óÉO«0-õ<ÂzóV\ç°hÑ"´µµ¡¢¢Âm‡C×,sº¥/vÖœÝõ–;—K›´·ˆMöÓ¿ÅgËY勇{Œ%K–`ãÆ¬ ÏÊÊrúpVN¹\î¸(,,„Ñhd­êpU”è±Aw4À²e˰nÝ: >çμÇåeeepV.¨€†òóó$?&$$`Íš5l¢õPÅ`æÌ™Ðh4à&x’ A‚„ï!ø þï3Äž ßP^øx ‰LMÁM†bÓ×aoïòŽrm[ 8º‰ÒðOjj*Ôíÿ@Í!bg-€k>‘«ú…0U"h 6ÅQ¨ÇùSìn|šAoµZêž÷5>wTïØ±´V€;Û¶ÙµµúôéÓqþüyÆ\wãÓn¬€Ã#1wî\Žvðîr‰rssÉîÝ»Y!ÿî»ï~œ%G_À-ˆŒŒd“ `æÌ™ˆŒŒÄûï¿/Õ A‚„ÿ4„×Ë“E[ÿþÀðÀZ€#™®®®Î«÷ÀTgeeaXãzX"êV‹pngÎýˆˆÖ½îI ãlj‰‰CbÞx€ÃmoµZ=ŽÏ0 ™9s&vïvÔ^à¶CÿúÓw MQ`ínç\úù¥K—J $H î„(-¯ëKpºò¹¿¹ðæ…2¾ëš››¼ ¾¸®|wàËçî×÷u wÞ!®Ruóˆ>ý}èç©@R$H A‚h¸ R¡<¾Xìøƒ!»v¼;ý_è¹0 CžÙ‡šC6§$ƒ±CO‚ $H A‚ $H A‚„AÀʼ$²2/麕°• A‚„ÿ&xЇ¯Ð^Ò´ì#ß2ª®ã×Ôžä]‹Ë:ÿ¡æ‹ÅPÏÞ¤ùþù5ÿJŠF£‘Œ;¿p<: ………¼±yJ2 œ˜„¹eý¯¼þ$Hà Lƒñv×SšÊËËIdc9Ú5ùŠø3¶˜ù5'@¾ó_Qð2ÉHÏÄËntý·­º‡T™j г‹Vå/3–‘ùƒ\?I AÂaÛª{D¹` áÓEÍEEEde^)**t ±óÿ>ðIÏšìüçMšO¨€/´Z-1Äh4oä¼aó”dRQp÷rýŒF#Ù¶êÒÚÚJZ[[°a­VKøtBtŹûÆ’ÍSF ÙùççD“„ñ¡ÂÇOÂÇk†lþ*•Jð÷pÔ×ó ÿûò?$ˆù‚Çn€ƒ¼úùYìlÉ«*—o±X`±Xó5 6[Ðh4‚Žq<: #ïx‚/mPøƒ¬ïKÅÈ;ž4÷ìÄReªEñ=ÿ'¨•«Á` tþBb×/-U‹´T­ .·k—§^Þ°yJ21^îÆÚ¯@ˆ öþÄ­ŸÑhD•©k¾…­v=Á0 )//'åå夾¾ž÷ù3 ChC ¾í)6OA‚¦cf²B”€±Ar’˜@ž‹‰tý#ääà!2Góæ2 C<ž d2.¶&ƒ¯À0 ÉNP’„ñ¡‚­ßÐÐÀûf†èõz’––‚®ßØ 9döÂéøeh ¯vètü•¹qdû+ãÈž/’ŸvØó”a¤uúTò|ÒDAë÷è¥ r°ë rã]ñ'å¿DݱšLÊIÐ÷gÛª{ÈgçÇ #=×J ð¨èt:¶âªU«xx0øãÛVauîyTWWó>†Ñh$Ì‹Ïcsék‚àF£‘Tµ¼ª–·ñ»5\üªOÐÜ`©! 5‡zPs¨¯{”7Ÿö´.))q*é/®Zß())tþ+ ^&½uf¬ü8 + ^æÍ×étHIø@ðúé¦ü ë"‡a]ä0ÜúøRÞüð…—Ùû7|áeÞ|£ÑH.O˜ˆË& Z¿ÂÂBd¤§Â¡týÄbÑ¢EX»v-Ö®]‹úúzðõÂÅÇÇ£©© &“‰íÉî/†!›§Œ ò rôìÆ>ûÀ2¾06HN’B‚Ð÷]àÿåçñš¿b„œŒR:jר¹Ä{üæK7!|´ £o @x\o‚ ÒÃ;qøÛ+°Ÿ´£¦ö$o R©ˆ=̆[ ¼¼œ×ø‹-‚âÔI|½éS§–¸þ€a2vBI á·¦üß•^ß$<<³™Z%3B€-ì/æ)ÃÈ/£Â±·«+Cyã]ÈÞ×Ûñ^U7bÓä¼8†aȤü—Ȥ¾ýøjO/&õíç­ýé‰[°æ}3¾Þô)^ýü,ïùû · €Á` 999ؽ{7>ùälÚ´‰×CÌ`0­[·B­V#-- Ë—/çÍßÖÿп»ó_ˆÈöûƒ|±ìWx/,]¶bÕªU¼ÂÕÕÕ8hvËký* î&äÈŸÑÖvmmgQYYÉË @ÇZy(†ŒvzÍ_TWWÃTU @Øýsæ_oîK´ñ>±`†˜Íf¤¥¥A­VcíÚµ˜>}:/~SS”J%QWWÇ[ˆ,ØÂ+")$õ]=¸!®t£çßÛx/W8º¨ Æ¥Ã]¼¸ Ãð¸:\Fù9{5µ'yñía6È/+ R\†=Ì}™Yoü¯7} mJb3gAqê$/ÎÙÚïú`ßYó…=¼ºc2 CjÙðæ­x¥ð$l{®ðê»z°´ù<ªO7aoW/.Ã0äügpÖlÇz¦u2¾å”OV‚¯êúð݇û°{÷n\¶VóÍûfhS‚ M ‚âÔIX"t¼ÎÁ_¸Uh+Ã;w¢£ù¹Àt:£#”Õ ³ÙÌöXæÃ€îŽ/^ðÔlýY“_\ƒÁ@.——¡“¹íM§ð‰õÞyäaŒé°úý5dÿù*œ>yÍÝxúÿô¼ÀÝ šÎ:>þ·/ûðîv¡[£ñ—ŽŒôTé=ÅvÄúiÔrÔòÿ&.,,t*‡ùî»ïòr£FÒÞÞŽÆÆFh4”––ò:ÿ´T-öŸéc~ñâoýè¿þ»ªçðZ‰ÉonEÁÝäFÓn,=r /¶µãŶv¯üøã– ¿•N‡»{`,íľÝ]8°›ßÄh4’næý}0UU⓯ðZ?N‡ŒtÇõª2ÕâÎä?ó0`2™X¡¯V«y'áÚl6¶ºÍfsÛÄÄš››e ……Ša˜™¢à]±Œa²+ “ÇŽEZj*ê»z𱕟¯¸±Ý°‡ÙЂ>^\mEøh2Ç÷÷ò®Ç.LÄîŸ:'zì2>» š››e*Y û¿íÜptttðÿËæX"tHHH€mô^;¹èõ“32ȆËUœû²%Úžx úg˸ýÁåá1XÃDãcë%ìíáç óM“cøä@^\.BS´ìk|ŽA×?#=Ú” Á;é|a@se†aHuu5¢££±oß>ìÛ·×)ßjµ²¡ÿû,SþèÎ.ØÚ±ûCLÒ|ókkkfïš½¼›ì½¸wï.¼3ª¿Ç?}ò$‚#qúäIœµ⎱é~Ï?¸±Àh:K+CÓY‚à«}žýáW™j‘Ø"CÂÄ3½hApJ67øÇ¯®®fëHÓ^×þZ` ÃÆÆFX­V¶7µÙlöÛ`†˜kk‡í™7Yîÿ½KçßÞjÃ^³CÜkîBD”üÞ#õx±Í¡p6Ù{q´»zE(:™Ð{¤Þïñ§. ÂÝ=¼…?å›;ÆÌûû`Þ¿3Tüøg¬µ¨©= mêhSÇ€Ÿý,6› ï¿ÿ>’’’ðè£ò~xq[¢VTTð>´Té¾înL?ʇٛ™HKMÅ»•UÀðÞç>¬SR¸XŒæoøŸ?‰ÃÅÖd0ÃöâÔ§üù#b»1}ê8¬­:χ À¹¼B¡@GÿñÓÓÓA[Ì QÀÂ"t¸/(÷ðWžl6žº-™Z%¾ÅÏ{Aa êƒ,:—{ðRýa»ˆÌv\Ùkåͣ皢Å×åÏóÛf³á©Ûã‘‘hÃýoþûš–ìuÛU)..³gÏf-±êêj·} ]1Xü¥£qzÆ|–ïï1(???œÆ÷ÔÆÑ?DÓƒì©÷ žGè2~ú-Î]tááÇýæ§uZ02ÚÔ1NVàÚªó~ùùùìüËÊÊÜvÂòvþÜö4W½|Î?èòM€ÔØ@s­Ã èïø·ëo@DÔLA럮 GaX0'&!=Ä¡1šºÌè=Rìƒu~Obãp÷ÍÂïߎøe0è¾ÌêöxX"t¼ùƒ:‡ôôt¨ÕjÞ–—€—åÏ…J¥" …0ëßf³áff@H^•JE~œ%wê9Ïwür+Âãêx[þ”?«¯#y×?qí®'Dù¢ë›9K°å)úú¹4±á;öGcGãÝoŽãŸ—EµaúŒûWÌúû‹„âââ V«a2™üê¤t-ø€ÃrŸ‡»§ÉÞ‹ƒò`¿Á~—N÷@~Y!hüŽÐeˆ•¡ãÔk¼ùTøSôé…YÁk|:iñá‹9®ðïk%8l'è Û+èúGFF¢©©‰×ø·Ú.â…˜H<#wÌ{sÃ1¿›ip…dj ÚkaØ¥N^ãÆýK|_¶ðâÄ6Tê†,@ö»0Àù.óž”KÿªõÓìe¨¯ß`¿Ðë7Ô¸Þë? CB;:]o¾»žÊBžB»P¹ãòåÓ‡08sçËwwŒ¡˜?W‰ùoZ¿Á_‚ ÁWOãï;¨1óÿo^ƒ¡^¿¡^û¡_‚ $H A‚ $H A‚ $H A‚ $H A‚ $Hð ƒÁ ª³œV«ÅaR”(¾†2\„ש9Âà ²D¿J¥"b’MÅ^ÿy“æéý#výRæ‹›¿X~vbÒÎ<6’ A‚ ƒÁ@t:[›/´Z-Y¾|¹`þ “¢ÈÌ…`þ•JE¶¿2N¿¢ànQü¢¢"ÁVü`ðWæ%}o¼F£‘ˆq!ëõzQüŽÕDñŸOš(Š?5GÜøwÝý’(þʼ$Q|±A±×Þ¤ù¢ø¤ë¦!½ÿn~1_ÿžU_ˆâ Q|op«R) TWW öPM[¨­P(Dy F©Ã9ÿVŽ”/Æ  P(0ìR'FÍÌJ/€B¡€ÙlìP(èk%(?V0¿û@LU¯ßÚ¯`Û= ó÷†lÅ+ l9vL¿æPÏ÷  ÕjINNŽ`ë™ZÿBù/LŠ"UæNÁüyÊ0rÐÞ+ÚúÃ~\0Ÿ1Bùb‡V«uê.Ê4ö/”¿27Žìxý¬¨õ›)êþ½;sº(þŒ¢æ¯¶ _Áøñ̼’à¿Ý À0 1D¯× ¾…r)¿cµð¬{†aˆV«ü`FTÖ¿ØP Ã0de^’(¾€^1üy“„çÂ0 CH×M¢øbï?£Ñ(ø;<|1¹xþÀcP…z–-[&èÀß/€P –@ ÿûà÷£^1ç_YÓ‰·_ Ì_ûÕÁ¹ÔŠÿåã3DññįókõˆÊE‹¹s碱±QpKßøøx¨ÕÂs1ŠêB•¹S0?­ÓŠ‘Ö#‚ù—†)1-:C0?,B‡ááÇóÓÃ;±Ù"Üò“8®uµ°¸=ü¨Gùä4ÁüfbÇëgóÓUáXþãÛócgÌÀG-ŸáЧŸ ºÿcgÌÀŽó ‚ùgD ¡ ¨#FƒÖëõ¢ø[ŒÌ$'Ù‰ ¢-1üðñQüì¥(¾/À`\¿y“æ‹âoeÜÎÿæóEñïYõ…(þʼ$Qñ[¡`†´¶¶©õ¿eÁ(Qüç“&JÖ¿¾Xë_ìù—¼4E_Ìžy†aÈš/wŠºÿÅò¯µõø¨ÐÜÜ,rfb£ IDAT“yØÜÜ,šùHùììÌ?Ñc—‰Ù7ÙÜÜ,ºï—òiOy¡|ÓE¥(¾`2çú™/ìÅ_ø–p+f0æô+Eñÿýæ½¢øk«Î æ‹A||ÄXÏbcïb<ÔúJÏߨ 9Cæù ÏßP_±ž?±ã§Ìç¹Ë*ÏŸ þË1îc‰/ñ%þÐð%H A‚ $H A‚ $H ƒ•yIdÛª{D¹ç)ÃóïU Õ»C,¶¿2NT•>1»²”¢ø$¸Ãê—øuOIÝ%\0 CVæÆ‘- F‰*æ"áÚ£¦ö$ªLµªÌS†‘€‘ª6@õå.([ˆàv½ ãCI~N´à{ìÍZ!´àÌÚªóP«ÕºeÎtQ Åɽ¸[¾|!a|(Y™GÆ‡ŠŠ_‘¢¢"Á påå墸bÆÿ¡#o¾cëëø Ø{’ô¬ñ¸×MxaRÔjù|A÷àg'(É “¢®Û¼·,E^˜E^˜EVæÆý`Ö‹ †aHï"ð›­²vö"ñ +~¨ç"z½žèõzb0Hyy¹ß罯ý—-¬ »‚p¤Ï.X€Ÿ SàëîÁJ@ËÙ`tÕuC¨ðeK¶þ¬IÐ=ÚÜÜ,+//Guuµ % ¹¹YöeKÔÖê!U†!÷OQ¡æ ä¢0 C’““a6›|…0åïÛ·FÑ¢EX¶l–-[Æ›¹¹¹ÄÝßþâÜ}c‰»¿¯ªö´£¸¸™™ £ÑHò¬½ÞÓpÆÊÜ8Â0 aƧ¦®ÕjIQQѻŸ"ª øË½ÿ•Wˆ^¯'ô·¿¼&E±[?èz †ò¡×ëE•õåjù»¾&Ä @á–£ÈÊܸërOÐ-HB0øôaN¯£¿…=è¸ôž»ŠÍ:Þ² UP(€ò…*”?54˜ PþÊÜ8RòÒhÁó  ×JLÑ—¡Ðë—0>”¨T*26HÎë:Ð5Ôjµ„6ß¡Ö8>- EÿöWq¦|½^OrssY>_!®ÕjInn.)**"åå夵µ•¿cõÒ±zéþr !ÝzâÍúvƒÁ@~Ýc'F£‘Œž?Ÿüó¾Wx_ƒüœh¶ }}½°{*?'š¬ÌåZú…? ·›J«Õ²ûùÜ<¾`0µÆüå¸ ^«’ÝÿÊ+„ûÐBÁáK>w,±J@QQ;!½¨@ã³~ž”…w ¸kIzÖðº†*•ŠÐ9Tð™/…¯¹ùzßõûÁl|æ!¬Â!°úÃ0dž2L”À0Œ(%@L(€ž¿ÐPå µâÅòÅ€ÞgB…?Uèµäû¬¡ßUZ½“ïóŸ«t0 Ã[xçææ’òòrVy  „¿óèX=ž5NüŽÕˆ¿ž­VKn-fØg5üí§@¯cQQÉω ¡>îƒwenÙþÊ8Þ_.×ÏûzÑ Ç‹%€j£Ü×ü ´ ý›¯v3Ã0äþWøirÜ1…–D»žô Ì׊¥®ÕÏÇ àî>ÙþÊ8¿„?ýp¿„\ë‚ïØ|¬Bªd¹[#Ö΂Ì×û$ƒ¥UXèu*€K ã Ðëõ‚Kèz»®5¸^±žwÏ]>|º×s|ª°äææªÐßþo Ãs÷uXÿ=kUüåÓ¹ Ò’0š rã]üÒÑçŒV«%*•ŠWèÑé Ü/1Wðç! ô êÆåº·½KÝÕô51õ°¹7×-ë%Fç+äaÆ0 ùCw•¯6Ì[¨€{ž4¬âïõsåÓõãÃw]?ÖÒÂå¯ûáΓOU4:þöWƱ÷_à*ìùº2¹ç½ófC ÈNPŠÂ*•J`°Æ§`~^’`×ëPy\½–bóCâs*„¹?|ùܵôg.®|×ã9—Á¸–ì{en/áO9bÙ±á€- RÃW£*ì¨FMçAÝÙ¾ÆÏNPŠnFB>Ö¿ë1¶,%èAHÏÑU¡ÂST¥R¾  \¡Ë÷p¿Ht|ú½güm CJ ]C¾s®²=É“ô¼…î  |1–¤P/å'Œ”@ù4÷D(ßßçŒ'¾˜õ— b…çPó ô ŸMòs¢y[}|9Þ@ãÖz½žíîô|ÒDÇÎNL \ŽÐq…¸þ]Á7 ÐÓøj“bÎ_,ßÝñ„>LÅZb®Ú4à¿ðw=ŸÚäb„?ôÚÅî•JEÄÔ“HùbêÐd(¡J€˜¤@Ê£P¾¤H¸®X™GŒF#k½óu‹±½Î+/‰œ»o¬×8rvby.&‚XKŠšÃØ»TD5>XÔ9 VF/}ÎS†‘„ñ¡^ÏK¥R£Ñ(*ÛŸÆ0kÇ€V«¥HQß$NÀÙµ¶yJ2i[xà¡ Ã'¶iÈG¶Y>ù4‘I£ÑˆV¢hølû+ãDy¤øb0Bb“ÇÉɽªaCŠ›¸2/é™(á¿4VÙÚÚÊ»M¢ [8{nÙ‰ dó”äÜ}c=>Ć!ÏÅD¿Žõ W&ŠrÁ|„ßEÆl”5 llœx«¶æjñ ‹*qƒq µZ-™5ÓFþ½»G”;”&Óˆ±¦ZF“ÍS’E…2n-v(¾Ž‘2¾¨^à\Ðëz½¶ºŽ=ÔIƒ¡ˆ_lR ˜Jb×_‚Þ¸Ö±‹ç“&úì þ±^W¾Ø$'¿kÐÖo2Éõ˨2X~ëòԬ˂= T±+ü®×Ú0Œ£ì]w¿4hß…¡Œ ²Ê‡@!DùB-q1»(ŸV¸Ê£PW¾ÐÔ›$y$Hø`È“8¾GR{€‹âZR«}¨ç1àz Ü%ãòá M¦»+`0ŠmY0J@ùB•Ê“ ÁäC=ÿD477ˆzßlß¾]ÔZü×ò‡8gOhnn–9°Nìëµ æ÷±¢6Áüêsmе„æ›.@§`þ;_Y¡µ+óÕÖjTWó¦³|Åɽˆµ€ÿ$H A‚„:Æ ËË‘ A‚ ×\·ÿõèA A‚gp‹ŸIà^»æÍ÷¼ßþZ‚;®9p{!ûÛy°1TãcýÛÛÛ¡Õj ýû¿%~én½†ê{$ah@k°FR__OŒFãuopf0ˆN§ƒN§»^C:Aì3D츮¿¯÷<ÄÀuž×rÞn€Õ// z½žDDÍä=8íG¼yÊvÏ>_a8]›ŠyÊ0²yÊ2]›Ê‡ ØWS Å9{—Šì«áßâ”a"OÌ!H*œ8ôû÷ÿλŒ+]ëÕ//`‹×¸»‘}ƒaœ›Xð᎖’ÏMÎ%÷¬ú‚løôˆŒÏ1ÇúׯÓžŸa_M-Ôj5¬V+ÿ¼t;gÛBþEPèù½KE¿xƒ û&å¿Dþ÷—¼y>="[ýò¶óê—°k(á?´~FQQikkðÆõø¬b9þúü-ß¶ Ã×#--íšÏƒ&êt:lݺ[·nTŒŠ&ßòI\ä>#¸Ïm!ÏpwÇôt,×ßbçÁ®Ï>Ï ×yŠ™·¯q<˜hÆurr2Ôj5àý÷ß÷ûÆ0 yoÁÍ÷E¢ç`7‚¦CõÌQ^ü´N+¦†㦰È¢eÈ>Øâ7?oþDò÷m ‹“ÃÞÙ‡:–LŸƒgžû‹_Ç`†´©t°Ë§!0%²¯Þ†½aïùŒ Ä‘>;[døgçe^óÿ|ûwìÿ …¿zl6¯ùÏœ9‘‘‘ˆ‰‰F£A{ëÿ¢èùƒ^ù Ã¥R‰‡˜†íÿ›‚ ˆýøeúãØ»ÿm¨î•û5~Þü‰¤jO;èõÕ…"h¦é3þõèNXN)QSSãsÚ/Cõ«;ô—:Ü„¸}x­ØM6<ðñøâõVÜúTÞßêwbÃ0$*óQ¤M @ÐÓE­ªÂÚ[næ%À³”D›¢Àty‚§†@ÿìqÞ ÀöW§±_\ý¯÷ûä3 CÒÃ;¡MéOTûÍÆÖÿ:ÅÃh4’ÂÂBQçMw+dj•ìkž®¡^¯'·Ýv.\¸€O7¼…‰r„$#%À‘_©Ubí¾v<<=ÿjχÙlö˜Ë0 INNvR4 ü=*¬·nÝÊr ±±7nôûþ·Ùlˆ‹‹±ïù3Õ// Ï<÷™Á` ‹ÈÌÌDee% eô}oÇÈ›?‘XN)µZ ‹ÅÀÿ„âÕ// ©«`?jÇÌdöÙ»Q;%Ãïg(wT¡çËUŒ¹2!è²öbøäPœø[‡ÏóÞðéY`ÁvÒ[¦ïÿlR1Aý }_È9xzßé ׋ßÙÙ‰ääd¿ža’1#IGZ°ÿÔÀ‡w2ø}rº_‹OÇ,X†WºSCƒñr›•×Ík³A~ùêƒ0ö :¾éæÅï ·]‡/j~Ô¯àÅÛ ûIGÆôäC±ùX'¿ñ¯ÄBz–}½£ÃûãÊç^¿øøxŸBו? #P×ÝX.ÇËgýSà†!¿zl6RV¡r‡#ãú7nÄ•x]ÿY}=¨ïê˜ä#æ£?óšÿ¸[e8~ø2 wq Ö¿ð¯û·jO;Â"®ÓŒŸOG 9ÀK{(ª‹½ÿ§ÿ8œ· f…yêÔÔžôëþ¡Š'4Œ 8öÍЯŒ×W!X™—D2ÒSqÛrÿ®z½ž¨ÕjÄÄÄ ¤¤„÷ÚcÅŠ¼wc0 CžÙ‡?ìÀÄ€þ R!ÉÁxxz¤[%Àh4’×V?Îþ?%E®ºn'EŒ*•5¸¤Yìöœ¨ð§ç­Ñh““ƒÒÒR,^¼=ö˜Çç0u÷SÁsæÌÁŠ+‹-B[[›OCÎõù‘ššŠ9sæ íÁ_ÂŽa¹+— š¼ùÉø„;ÑÖÖN‡ÌÌLö3•••ø×–ß›@b†ÄÇÇ£½½5@ ÐØØ³ÙŒg ÷ú]d†|0;ö£vÈ'8®áty0/C4oþDòÍ–ã%d ѽ—»ü’C Ãs—Z™‚K§{ W`øäPtžêrtO%#GgO‚«˜’áüšù×Ö~‹ÄFL cª<õG X{·!µZÎÎNÌ;—½þâóíßá‰E"`d ¦Þš×+ÝØ„]A¸)ŒÿÖ°‡Ù€Ø+°wöñæÊG^®æçLÉàÍOl‘á\˜çÂ8ÒÇë} WbÇJLäÍŸ={6Z[[a³Ù••Å‹{»þ`Ôd$ 98ß<õ./7ÜË«·Â~ÔŽ·» ÞîvОyî/2>‰€SCƒ‘„·’& ïØ^ó€ñ#‘öóh,«ˆ‹ûU¼¸Ÿoÿ·=þ8.[«qËár˜÷÷ñþ6› ì=xòÙ‘xtn4jñßú_¶ ¦ö$´©cüú<vô O]¸}gzQsȆµ»½¦û°.ìÖÖV'·¯Ñh仦¡¯*S-ëQô Ãþ€ÃsIß±m6þt° MQ°?]uÝxóƒV·­¡«««Adñ€‰rVøÓë~¨ÏŽÊ‡2œ©UÂl6{œ7Ø´i–-[†õë×ãí·ßvËãºû­V+ûC×/^Œööv¯çÎ0 ‰1 …ŽùZ­Vdff"ì¨ã;xyÂD|j)GDÍ„F£ÅbAuu5*++ëׯGff&îøÉ“^ç@ÿ¦–¿ÕjEõÕý“jµÚëw‘>§¨ð·µ³Â¿ç Ã ôÇO…?5Bö…GãÀ•n<A|ñ3fD²Â†OŹÃW ä÷ø½o9¬þ¤bȳ¢,Ã0dÿ?ÿötnðy§§WcއÅbaÝ/þ ¹¹Y¦P(ðæWíø²ÅqèáŸðûKLù»‚ P84è;OùoµP¾ü²ãgC¡’Åðž? d2TM¥}åþ‹çoVF°¯]¼É›Ÿ1#’õ¨Gû¿w™ò+**Ø×>üðC¿¸ôË÷ùöïÐc†–ÄìB Æÿém¯»»ñž¸Ì¾|³#ôà‚òeq# OœÂÞ«_B>ãOצÂü‡óøpŠWüŒ½~ûûê{WáëòçyÝ€Cx¿ùA+v²ÁtQ鋿„í¯N#-½p¤ÏŽšÚ“ õ|Uã£÷µ>Ó:­¨ïêÁáo¯x´†i¡“É„êêj,_¾úûYø=ÿì%YúàO‘‘žŠµUçy…^T*™;w.*** ÑhPTTDÆÑUÓŸŽ–Z­–ÔÕÕÁf³Áf³9m4½Æ´†!OÝÊz[Hr°Ç10{ölÖc’ŒšC6–“ w %¸Ë`†p_okkЯ@LŒûçXµKq‹Å‚ºº:ÀÌ™3±hÑ"TVV²áw ß}•6±3f@©tÌ×jµâoû›×ñ¸ølÇ9@YY œdÿ_[~ë‘8h{{;¬V+Ôj5RSSÙãxZŠª=íȘ £ív_½~ûìÝl(ÚWþØ 9%Äi{/’B‚pàJ7¦_<Ïz|y>ßþ.îAÍaxž;|…õ~ÃÝÇè)3äöý€À” ôªòJ£ã@RHF$¶Èp¤ÏŽöL•¹å 0  L&PWW'¨ËšÓ½P(xï‚0ë aV àÓ!EYb:ªÁ Û …BÁ+þÏEGG‡LèøU{ÚÙùóùÐñøžss³Œ ÀêÎ×ÐÐÐ…B—û;ä‚»þBðûóí0+# P(}°Ž÷ø/¯Þ Å¥htvvâ·wòÿBåïÐÔÔ„ •¿ãÅc†Ðs6]Tâ½ !¼®ÿöW§‘Êš+¨¬¹…B–³Á8Òg‡6u ð*ˆl6ÌÊ$…aò¡ðT…«ôZ,'Ë»  F£eeel|™z Ü%–­ÌK"Gúì¨2Õ¢ÊT‹‡3¢ý:oê9Y²d t:’““QXX(£óx÷ÝwY…ÀÓ1ôz=ijj‚ÍæxðsÃfz½ž¬X±ñññ(++ó9ûI»“ ?åj\ßÖ¬Yƒ„„˜.*q¤ÏŽ®:‡¥I`=ô·7PK«pÿwEyy9ª««1gÎDD8@¥RÉzÑØØFã3°£Æ•6a))?ãÉ d†˜L&иYYÔj5ÊÊÊPYYÉæøzž}¾ý;DFF"""iii°X,P«ÕÐh4½'®|˜Ìz¨àKx«T*€ú®Œ’ê»z°÷rdq#±/ÜûýL¿K=¶>) WÀÞÙ‡s‡¯ ËÚË*^çÐó{ØÏÈGÊ`—OCï¡*$L ð鉦ß!:g®€bª<yó':y1(ô$:::dB„åS"„Ïýù¡òéß×{|×cáŠQž¾ëϽÿøCÌøôóô»Ã‡Ï0 Y¸æ;Vȧ‡wB¡Pàâ¥HÔÔžÄëŸ7ṵ̀Ùl¯Á!žº-”†ô5oJý›Zj ÃeË–¡¡¡jµ%%%0„zjkw×Pëcb€¯Þ„µUçñǃÝ`†l[uOïÅ’%Kx«†!sçÎÅ’%KPVVæQPáãNø}¯©i  ” jõO¾1ÔÉà+ŒóꫯbéÒ¥¬ÂÀmàpÇ»ƒÙlf]Þ®JÖ•î …Bᤤ¦ö{¼èΊeË–¹=½þ–íÛÑQcBæÒ'é°Ä7lØÀzÂŽñhÒïÉdb…LL Ôj5+üsrrÜŽ8 °¦¦&X,ìØ±ƒ 466B­V{u¡Ó9|Ù€}ÝÝl(`º<ûìÝžhNÜãÁ¡ìkõ]=H qXÎÓ/žÀoW‚½³råUOøäP6 à£Ó`?7Žõ;ÐçÓÐÜÜ,{î™9Ș‰¤ V  ÷ã»CùØðéWr[Êô?©ê#Ä(ß åÜÅ(m€sì?=¼“}ý©Ûã½ò©¦_zªì ÂÅK‘Ø|¬Sæ- zŒF#ŠŠŠH||<ûZyy9fÏž ÀáÞ-,,”¹ é¼þy¾l `y?› ›Í†*S-2Ò½‡bÞ}÷]£¬¬ÌIÈ”——£­­ ‹Åë6:O^C®WÆf³ Š\|Ùù9örBX€÷$@*8^}õU,Y²Ø€CW¾þXþ&“É)îm±XÐÞÞÎ*¾<®J×R§^€ÊÊJäææzõY¶oGåš7‘^ú:«ðU‡Ãz–/_î‘Ç5xiþ…â ¦ýTã$üeq#±÷r¾:iñ™Àh³Ù¤`CØÀ¹ÃW¼ŽM×@ÕT t»|šSÀÞx{'ªö´cW@˜  pá=3H‚ × \ ´©c°2/‰øëþ€]A¬%ZsȆ›GôùTJèƒËjµ"++‹n=U¨•YVVÆÆ—ÝÁÕsTS{OÝŒôT¬Y÷Ÿç½bÅ 'áO_§ ˆÙlvà†½Ü+µ, ¡¡ÁmQ*:ÖýSTˆPáð·WØ„@OÂß•»cÇ̺ù>üé`B’ƒ„2µJ¯–ïÉ`®¼éV(=>^ÝzÄ.ý0„! ᦀnè?{w4bÛÍgIIIœÍ8÷wÕO, 8-ÀìÙ³µƒŽCð´i8ýx¤Á³n¥ lÛ†[!ˆÓy¼vß?²W޳H²·üņ0„ÿØ À8 7›ùóÛ ¼ø¡Û1Ï0X³pÀC aC¶ªì[}zÍÈÈà²1ÿŸܵ½Â Ãw3aCÂ~’,†à Ãÿám\r{°µÜDhÒ<€Išá8XÔŽ Ÿ K¢4„ óÀm/{ôš„·BúRÌQšÇ@hB£!ÜzМÔ^ ==‡âì„&š*##YYY|—BRPPà–âOÙÙÙ„& ±Šd¹ùÓƒxùåÃøÛš»u ¼]?â\¥t'¥!?ÃÔO-§ºm›¨>©ÇÕ34ÝúN‰ÙlF’¿7†ÏS‘“ÿt ‹òp à çMh«¿Vzw+È­233‰\£AœäFÕò6ǧ¾ŠåÚ Šª_“üÙ 0î2@±ôþÃÛ0^ê Ks?ª¯³GüÐm5§®èœt;Ê>9‹êëݨ>W?@}”Ì›ÄúÈü³(6(ÐAyOй1 biîwš›¦-//‡\.Gxx8T*ÊËËÑÐЀŋÃd2ÙeBJ¥’¨Õj„µ›pØxÑ* ÙlÆL&‰ ø×9šššì 4†Ðúléé}¾£úƒ`7{{ô´ÿÎ,÷=©Ÿ2_Š#GŽ ¥¥ååå ANN --8j‡N§#mmmHJJÂ3Ïú(,X¿¯Ïpš>´Z-1 HNMÅnj߾ý6Z[[‘˜˜ˆ¥ÿžyÝ»€Æ‘÷áÒÁ hii±ê»äR ÎUÆÖ>BÒÃp_L ‚§MC\\âââPø—¿°‚ ólʨmUºô!qË*ª°éÅ…D§Ó‘¶öQÈËË#ccîG^^ÙôâBRVQåªlzq!ií”Õgí¯rÉŒé÷ ONCû¦q䣅£Hû¦qäÉÔ¯±àñ.}1iŸOž R‘Ž÷«p`by>v¼K‚aBé·—}ŒIóTäîõ I{Oޝ,ÅVå;«;jÜ|«g|é%AãOZï*°ÛÎM/.$ §\G”ØLrÕçºÑר‡Xúûnþ¶áWéâwÔÃQ•ìr¦òÂ…ó=hÜ*”Ü J¥’¸S7ÀŽ]˜V‹é¿JFdd$¾¬± N"Áò¥Spèõ×¹Ÿó¦Ú]?ô„lŽ˜Â…ò­¨jÄKŽ´…AÞxïüqqqN…£Ã¥\àŽŠªFøoѶ0\ö“cׇö£ØYµ£™ý]QÕˆÓGbf¨+¦Dq« p¥`šÁ1û™¡¬°óÔ=á(ïPàíõ é†!—ýä˜0†¥žü³(Ž>ùgQX½ì¿p¬Üù»¯R©——‡¸¸8¨Õj¨Õjddd ==õõõ0™L.L566"IéÏч‡‡#åaòóó$¥¿Óú¹\µZªª*¤§§#??&“ ‡²K›‘‘ÁÕ‡¬¬¬ô111X¶l™Ã9T©T8³oâââÐÐЀgžy{öì±ê¿£ú)}ZZ ×þ¸¸8AíXáêÈ‘#0GLÁ`@ZZJJJ`0zu¿ÁDo/ôü×ýؾ};ÊËËQ^^Ž‚‚TUU¡¦¦Û·oç„€æû B¨æ„_ÿ²e˰lÙ2äææ"-- ¡¡¡ˆ‰‰A~~¾Ub$†aMž‰’’”——cõêÕX°`KzŠQwÄ¿?}g<ûO$%%á¿íEtt4Þ,+Cξ°ùӃƎ /üê K^sEŽ9‚}ûöá³Çªñ?o½Ñ—[¡ß¹ƒï¼‘F>“sU§‘6~ Nø‹ûbb°gÏìÙ³ÚßüÕ×£üj¤_bµþ¬€cÇÛ€ac þwJ¥R ;ÿg$Ÿ]FUU"##¹LT œî0šež ÃW^Ÿ€“A±Vm˜rßv´ïac;b„¿îï’Œ'±g.¢ïë>«ìD²7›ÅK–¢Ãž'„e'<01Ž–fHBÂ0Eæ…iâ‘ÜqÏÇŽw*À˜Íf,üý·±÷eÎ÷àjeäÇ»qûoƒ°ô·9ÃdM¢ÆÍ'¾ñ«¾û§Lǃ/½äR‹À j+Pæ¯ý×é‘iJfè ²Š‹íª^[¸ËŒóg†bû•á¸ðª k<ÙPÛG u(•J%ó&]fv±H”Ì›ð¿Ò†0­±ÒÓ”þøã‚ò#h" o<ò'<8évÈOàŒ¥/ ƒ¼ñVL‰Â“´%JæMf†ZPÞ¡À K/4 è¸yã „÷ಟòÆNOá_÷ôâüù@fõyªÆ¯í´z¶G?aŒ/,ÍýxêžpTT5"±Ó$ˆ¾ú\7ŽJeœðCé·ìø—Ë`@555P©TÜIyÍš50 X¶lªªªžÞk°®®å퀈ˆ„µ›°lÙ2,X°½Õ§!›oW Gzz:êêê`2™°zõj$$$`ÇŽ¨¯gÕ²MMMHOOçîÉù ÌŠÒÇÄÄ  ¯¯¯GJJŠÝ|f³éééhjj‚ÉdâèvìØaÕ{§OŠôôt.lòêÕ«QPP€={ö &&ËàÑ@KK ä'PSSƒÁ€Å‹CÞx—Žþ555NmA:„ˆˆ˜L&TUU!??åååœpùùùTà”¹ó“AÑ+ „„„‡³!l7oÞ,ùnjÊ[­VK-Z„C‡¡­­ 555())A~~>®^½Š‡~kÖ¬Á;#üü|$$$ ##ƒ›Ç¸¸8,Z´qqq8räÂÃÃ9úúúzäääàÈ‘#8pà€]z˜2c%z¼ƒ©°Sf¬Äç¯-†úkqµÔ‚ùóç#ôüyt~Ñs‰ýØž={ ¹Ô‚ýïPO›Iñë:Žù?¾³rc—“ƒ£Ñ( ioǘ„xŒIˆÇ”ŽÛñQ}=ÆNKÁÿå1dï™™«¦bïÞ½7"À*½·Õ]ð}´¬î`.=B„iµZb2™¸™&ñHNNFYY3îPxrU>ÿSú}‘Ôû‡)“WáÄ[1eò*|5n›ÓŠÏ©Èoï ÙÄa8VÙ‰ÙïGïñVȦ±ŒoóËNé•J%™aéÅ$ßa8Ù݃;#"1Eæ…)>2HcÆ#è}Ç!M©pàÝ@çù^(FË0&QŽà9&LcÕÙk‡W9ì;<¹* õ¿AØXö'q2+£Å““‚BI.x`ø6B¢°1SºPöÛ1XXõÔá¨+½†á£d5zìÙ Ø ¡j‹À.ö»Ë~r®¶î5Z­–„iµ0WT@®Ñ®¾[Ž%á½gŸu9îÔè핃Mì2£+0ˆ»¿¯>Çž¾»ƒ@Ãã°bˆQ2oBOÏÕçºÑÈ®Wz¿ìÇÆÙ÷»ÜŠ c|žÄ•J%!`¢†a¼×h”·w`Åô‘‚ ñ<¡çÖ——ýä˜aéE¥Båvýjµmmm@BB‚Kæo[¿Z­„µ›˜€÷NžB@@êêê0“aµJêê­ö>¾½£úpv ü(¥§éˆíÑÓ« µZ‚‚+#/GõOÕé0¬¡«Ÿ–mË@mé“’’`0¸ú jjjÀ{eð#ßQ¦MC0 —i!!!€€€,X°111ˆÅóÏ?}û¦· ^¤×ë­BÓÏêt:RUU…¶¶6´´´põ'$$àÉ'ŸD`` àùçŸGII âââ@ u:²²²`KO¯ hXìÊÊJ¨T*+z:& é+ñä½!xúé§¡Òjqw¢7>«ìÃ~}>Þ>zÿø9Ëtï]9«ŸÙ‹D¯' NGøy ú½&À7^ƒ¹··£qä}øüµÅnÄvàÃ0dýúõ€§6mƘ„x܃øõ àgírW+}wÀ/Cïåx°• ÙlÆÈž`À†ù‡„„ ¥¥ÅÁ´ßÀ‚ÆÕˆH.þ4Í ÝÐЀ+WØtŠ NÐ^Üô1|ýžÆ$'ƒbQ÷?À[ñ̓«0¥™ ½öe’kØ|Я6Áwê÷)%÷£¬b›Ãö3 C¦O Àø£ìéR «O%W.Aš6 –ú3Òñru7'øBõ½|%?Þju[/;#ƒÙlÆöÝ=­HœœŒÊ/XªÊtìzÃàïNé•J%9XøzªÙÍj’· 'ûzáÝ׋gV‡¡ðÏ­(«üùÿpœÎã¥Þ(W(àw½ M>xö3Z9bÀÔ&€^ ¸ðòÁ¸?Ô•^ƒzêpÀ¥ö~,ýãmd×¾sÛ(2~¾kËL´Zì)&°†÷ËÍE@N!233‰½‹MBR5¾xå [_àåV<–Ša“|ð@N+W7Ã0ÄÖªžarÙlFõ9–qâ{úË~r6K?¹}õ9û¹ážps¶}^gá`Û1ÀhfDè)=Àöß×| Ò(?$¡eŸ˜œÿñAOñjµkÖ¬ÁÊ•+¹5ä T¤ôr¹uf3¾²œBKK 8£0ª!àC¥RqW üúëëë¡×ë¹ú›šš°`Á˜L&Âg¢ôn·®®Ž£W©T0 \{Ìf3T*•Õ‰˜O¿gÏ$$$ ©© ÁÓ¦a¾Zz‰‘mÿ¶&6Ë¢J¥ÂƉ­¿ýåååÈÊÊBFFÒÒÒÍ%jR©THOOGEE…UýtmÑ÷øÈ‘#Üo¾q ð™0|ð¹±Ñ~B+~Ýz½žk;pCqæPPP`6˜_ÿÅ‹qàÀ444 ±±f³™K´”““Ã%º¢ö hiiAZZbbbƒ´´4äææ¢¨¨ˆµ*/  ~n?þøÑhÈår˜ aòÎFèùýØû̼¿};·~˜ö(Œ¾lýþÒ¾ñÇ?<¼ 8ׄFÍËøüµÅ\] Ã{c±wï^´(•œ=ÀG>Z\ûbbp¹Ø½{7Ìf3råZe–´º¸G{ÎÙ±qjii\.wzÍ0 9XøU:ËÈÈHìÝ»—» ¹Æí1~ìâI^ÈT_ ×4±Uo`ÊäUøE-ðA¬cõ?Už™Ë% RâäÜ5€,E‡Þã­릠*|€Í5uT8HK3ÊüGÂR'®÷:=…ÓIòQyáru7L`›zûoƒ ?ÞÍ·¹‚o¼ÿúß)¸kå @GÉ1îogào’”ùOòfU÷…n¤þçcøœ±ô!±Ó„®À œìîqiæôäáèþ{]f¡'f$>Jo…u¥×PWz ÁJ/œ¬¸†¥¼ÍnG ‚n|íííºÑØ{îð¦¸ú.k¥|¹¹—›‹6 3Fi!×h™™I¥RXù_nùŽk=Í÷œ¼Ž¤¤$N`ï*®Ý³½}[z >ýÙÞ>—FœA^¬-ÁÒûÕðÞW„Îè“ü;1Gáç’Þö*èðE)Ê;Üu’б©««³bþ®Nÿ¶ãJé:;;­b¹6^``4%éééVZ´þ7rõÓòmï°F£$22’cô”þYíYîDOïå`ùòåvë_¼x1g?3¦ú FÔe£§üUl+‘:­w­@ŸÑëõX¹r%Çüéç&“É.=f³‘‘‘HKKã¬ÿÝÍ¿ÐÙÙ‰¦¦&ìØ±UUUhlltêýÀ_;ƒ>üŒ¨ËÆ‚¹/ãÈ‘#vïÜùP«ÕVÚÆÎÎN”””`Íš5Ø·o9-LQQöîÝkÕ“É„¶¶6޾  ùùù(++CFFŠŠŠPWW‡¨Õj«õh4%Ë—/Ǿ·´€Ï>ÙŒ¦¦&lÿžùÓù£×¶†||ŒH]‰è¬—õ2²¢/sÆ™´.Ûçé|Ñœ T8WuæÙVW+¥¥¥V'FÉÁÂï0æûOÚ»ƒ¹‡èÀ:cžtËËË9õPPÐ;êÚàˆþ`áw8ÙOÐkš ™ê Lò’`õuV*ûÞV—¡ŽoÃÖ‚?}zÞã¼1=QÞ’M BoÉNg¤Ëå¸G{6té…&HBØ»Ô×{q¢·ß¥!ž\.Çõ—úje>{¥b×wŽÓIÒ‰½*_…îÓ{Ÿ¿q«~*LŃ÷¼ï¡ï«^”õõ¢ðÏ­ðM¼Ëi”A†÷àZõuŒ—z£.” ±Ó„Úë½°4÷\Y¶›Íf455A­VÃl6x~nŒ‚l+‘B/Ç+‡XÁi˜Ê >*/Nø¶º u¥×ì ö„³Ù ¿Ë­ˆ’y;éÝëw•Wse†Í‚W5 iz*ä 'Ø£§/8#˽<o~i‚¼ñ„Ýq³¥§¿ù¹ígXz13ÔÂ¥‚À.3T^RÎ`¼ÔU‚…šA¬ú\7*ªqø¢Ò0/·Œ:»,]f¬˜>Rp6 ¹\ŽÁÌß(ÓMRúcõêÕVeóÕÿ»~óóó­ÒÍò™6Ÿ`µôJ€¢  Àjý©Õjüf'{j_°``4%555X»v­-­Ÿ¶šUãñ›Rl+‘‚¨ñëâÃh4Jêêê¬Ú”””4 ýF£QÒÔÔäГ‚¿ö¾=rÿ¾ï,}òÆvŸwF¯P°Wž‘‘‘ˆŒŒ?Àl6cçÎ0 xòš?Ž~q'òü---ÈÈȰkˆÎÄÔº¬Ÿþ½µ‡p€îÒnôoEÄ¢‹iùLikár@“–fL‘yáDo?Þ¾Ò&رó|/FÆú¯Vv¹Ì&acãª|öþß?e:º§OG‡ã[МÔ/nú“¼e¨8m†÷2<³: éÇ«[¸b¨L5ã¥Þ\.ìI¾l®y~»…øýS!€_>ÅúNÉŠ ^9Ô wsW'ÃT^XŠÊ‹NV\Ðg¾&ÀV ®lT°Û2p/iù±b$MgsšSû—ý˜yã h"`Ž˜i˜—K!À–>É¿É?‹Âá‹RÌ µ:…¬öàÚ(),ß±ãýÄÃ!Vs&„žþ>|QŠÀ.34 œU¿+v±„X¶»"¸^>ZZZ••Å€ ß®£®®?æÄ„,[¶Œ3Ør¤¢6|ú´´4ddd  w¤Å1zG iiiDzeË8¦áȘ´©© ………VõûÅÇ###{öìáž+,,”ðí(¨†‹þ¿bÅ Îжý®²–^ÜýЄ.\Œ‡w½‹à ÝÖüEFFB¡P@¥R¹Üóvî¿ hiiAff&újkPý7¶ï˜Ö|Á¡Eiié€úSRR””“Édå‘——7€¾µµÕJd2™°wï^Ô××cÍš5X¡¢¦¦Æ.=UÓÓ9ˆÎzk×®Åúêw°âóÃV1ýÿ¶æn‡Å™™™„a2.ªeeex|g "##­˜¶-ŒF£D¯×sûUzz:f®šŠ¿þú-<ûÈ2dï™ÌÌL¿~+^Üô16½Èýo6›ÁOm(åååˆ݉íÛ·ãé§ŸÆ7õbçÎ.-©Ÿ\•†ƒ…ßá©Ç«Q.{«ú¿³Žosé È—By¶ Óðê‹ ¹g2`úݱãl´­=G¥2œ™†_ž=·¯´Áh4J\ÝÿÓú¯7Èpá|Ff½Œ'üœ‘q¸ðéf„=ŽÄÉRT~aAGÉ1ø;&È‚öaË…~@Åi3"]ä(ýÞBƒ{0|‚§8céƒÿð6t¡jD¿Ðf¸…m%R+Æ=L)e¾¨F¾­î‚=Ï:‡üû@¾@pÙOîÖ)¾î=«ï–£üX1ÈÙU zr¤- iͨ>×Ú뽜A úòv}X‡§î Çá‹RÔ^ïuIG;®X=ßר'H @éË;¨>×§î ÇÒûÕ¨¨jDõ¹nAZ¯È1 Þ{â.·®ø)\ ÐÖÖæRýKÁàBBBpª¯ÿ:gÀ›­°ûÿþg”Þ`0 ªªj½3ÈårTUUaùòå0 X¾|¹Ý;gõ¬ÝÕ/’“QUUío~#¸~ÚêA‘ŸŸÏ10¡øš…£‡?À¥£Ç_ŸYŠKGÿŽà ÑR£¦†e\4ö`ûŒüÛo@Zša¾},öJcÒú ˜Ö|a@}MMMœ± À ÖÔÔ ::Üi?33+\ñµ(”Òw6++ MMMX±bbbb¸ù£†uuuõØ®ŸK7`ýúõøçÖR<2Ãõõ-À®}“É„ôÇÇîÝ»ÑÐЀ‚—æÁ¬~û÷ïwJËë Á²30&!+{ñë»ÂŸ•@™×‹›>æTá÷hos˜KØø ˜Þ§Ëår¸b:”–ºÙ½¸écøOy[¡÷Ä ® BâðÛþb3"]p*tDGÛKŽo ] ­ÿzƒ Æ~øêM× Aøm¾ðéfT~aá<¶Ý5Óáݵ£²ÚÛÛYmL‡b@(XGm±­ƒ2ÿñRo¨/²$–æ~¨/JŸFùp¦) §§Û'øa’f8§VzÙœ•ÓÞÞ>`¡S;W§:6Ó• à†àê»å(Þ]†8‰Ä¥Àh4J¨ç_}ë#ã¬û…Ð'ùwr§ñÀ.3b}d‚,UT5Âï{#ŠªFW²eœ±°B€»ô/ä×JªÏuÃ;Â[}¿á¤a^(ûä,¶ìøÊ>9ëV`(zU°›.ÿÔ†!IJtvvâ+ Á‚ °½ø˜à¶Ô'¼³³ƒ ,@Õ÷åØsÿ³Õt­]»‘‘‘(--ESS“ÝS£Ãö'%!-- ;vì`­è%‡€µ?''+V¬@AA222·Ç0©ÖèWw ¸vpª¹™:uª ïÈÈHLZ¿cäæÛÇâÎí; ÿöî¹ê¿íÁ¤õÐÓw¾³³K–,.–ÂÈ‘#a0`0K–,±»ŸÓýž¶;..W®\ANN®\¹ƒÁ€Y³f!<<Ü)? ã|ÏóØ»w/æ­šŠÊo;½ó§tf³Á÷3Í……سg Àžêß=p#êõ]Z? L]åV®\éö¤T*IRRT*•]×?GõòÁ7ê£;Z ÃzR§ÞgôNžöÇd2aùòåvÝÐé¸Q·ÉE‹!//óèX¾|9òòòÒó˹ë‰=8vâuTþå/x|g ^×Åáñ5NãøÓþçææ¢´´”ó  ã¸hÑ"A™†!ôÚ‡€VUUa}õ;xcÖïл\ ?$ó±­ÓSæýSÆ­èû…¡wÕG¥2§B˜3aÑž¾³Ø<ü § BÀ·Õ]ì—|9zúÜÍ6c¬T‚Z á<(ºÜÔ<¢ÅÒ eÔ7‹Þ¶ 1åØú¤»CÏ øy~HÄz NGbbbP__ïVœÁ¨0æ¸Áx…xØ Ô•–ÃÿÜ}nn.€iiÔPÏ\íÑgee!((­­­œÖÃösgóÁoGUôUìžÿ¢àñ§BLAAÁ€}4..N°'¶lÙ£‘̓àHxø?ÇX‡àöTµž !T«ãªèÛê.à’ïæ7ÌI(l7O5QCøáà‰ñc ÷·º~~;agÝ}çí•ãNÙÙÙd÷îÝ2>ú(6oÞ,HøÄ °ŽÆÀÓr†à®b¬‹}v?î:U IDATn820Óh4$::šÐßôG¯×Íý†p‹@™á­Þƒ†q;ßüðä·²/ƒž ðf@ˆÕµ§(,,”dgg»¬';;›8SÅdgg“¼¼<«rèÿ¶ŸÛ•¡ˆ«ïfärj©­Ñh\f»™8”ós§u»úÞCwô¹^¯‡N§#z½ž<¤":ŽÐ´ªhjjBZZâî\Šœœ¼»÷ ŸvHÂ<Ä$×ršíÒ“2´Z-ILLtý  Ü1DuUŽè”BÐÞÌÚø|Ÿƒç‡'8³2¥ŒG¨%*:nCt³gÏvé¾¥×ë Ã0v¥)ú9Ã0vOp|æ`ž yyyÄQ #€½Cÿêo¢ùãç9+ù9 ?Òüñó =Z2¶5ë2Cìö£}Ó8R¹òN¾t»Õ÷Ôr·}Ó8°í›Æ9Êè)ý}àÿÏnŠ#ma(Ü8™¨T*¤j|¡Õj ßj˜/86lþœlØü9ÑétVó Õj‰N§#¤ÿ8ù²·„l9|d-eì©Óí§ ¥ ßÛ tþ©µ/oNÇ}noþår9êÿö¶mÛ†#æëû0ÿ6]ÄÓ—°p~/²>xòÇ!®ø|ä7½BNGjkkIVVÖŠÍ”J%aÆedgãq‡§?íƒXú9 ?âè½wYóGþ¤ι1 R}®®"Y:½ OLLt©†·{AÈÜ…R©$ÎŒ…–|­Øó¤½;|Ò“f9¬‡þ8í÷Ïs>#í9F~žóá§¢7Ÿü<ç3ÒÒÒÂ}GÖ‡ååå‘ÚÚZîG«Õr?T ßÙ ÎNùJ¥’dff:•BWŽð'z½ž˜G>BB¼½ÈÊþdŽÂÌQø‘G‡½^Oì¹Â(Ç#ʱÈN§ã—]nž’ÌxcÉËË#Qó”$x²ý͈a2GáGæÆ(Hvv6‰’y“9 ?îwáK·Ò£u¸0 CþpÇÒÒÒBÚ7#¸cùÃ#ȺÌÒ¾i!=ZBú“—n·Û‡¼¼<òÑÂQ¤äó éÝB6½¸h427FAHïòÑÂQ„ôn!yyyvé5 ‘‡ÞÈœ7iþ8N®ÑhˆV«%…'Êüí•¡ÕjÉ–ÃGȆ͟s›>ýÙrø'8RyÍUÇ¹êÂ0 W7Ã0$33“t}…Ü”c7$ï³a½^Ož {€|8:„ÔÞ>Š›oõ|2nɇó?CîKfÈ}ÉsA*ò\ð8²àñdŒïX¿É~“ɘyãÈæ ɼÿÞ@(óv’ã÷`7à)óà4€“Ð6usDïÉ 8JæMĆЦȚ?’lÞ0Úã5'¦/ƒ¡êØqpw-ðH­VK„hi]µC mƒØTã”ÆCf†`ØX‚°7mOá·ÓY»% Ã?ÕTøÆkpøÍå˜ùXºO³‰"|ã5˜¨™Žû~; ý©§*Žá+ýó.­0SSSQ\\ŒÔÔTÜÿý€?ü{¶¸¸ØÊ¥A©T’$$$p~‹ÔÚ“/-™Íf‡V Ž!¹Ê&ùPJ¥X¬nÝÑ‘ÁX'óÃÚ‹¸ÿ¼u2y¨7é5³QÎüB¼¹0¾ŠÑl,óÎó½¸ô…ý¤&tB;MH¾×§Í\З·×E`ÖÓQ(Ê= í³ß:´@mz. /ïjAJ¼Ã&ÝH]ÿH)‚žÅÚ‰ùøhøØ®?3ÔÓÆ"°ƒu):^}1¯ƒ¥¢ß”@ìèIVô´ÿ+û7øOaK®_¸í x‚æP üú«8Á >ª„$ËÑRÆöíëÝW9z­VKV¬`½¬\¹ËúU8¶J†s•½8÷ép(e €½³Ç`ËWÿè-àüm/^:iÿ=¸P*•$°Ë,úäDËp7$¯§ôü GlÝÔ3EH&AgmÈÍÍäFåˆÞÓöÛÆâp›7Œ&y»|°|éud?^t9|õµöxÚGn¥îÒ‡„„ 22ÒíœürnU„”¡T* ?o`Ø,œýz¿(/£Ñ(±×_:÷üϹ,La³à¯Á‰ûP†ÿƲeË8ÂÇwÖ8eþ¶<óÌ3€$É)Üv?ë‹ù݇ëñíÈYHMMEllì€r襧§sB@ŸŸÞ]ì= ýÜ™HÖõk8ÛÛi˜»“õ?žžÈú?þÀäʥ̟Ò^¾v#Ûa@ŒfFø!Yà jöƒë¦~´ÓãT0›Í˜j&þÆýPªFâŠN¼°Ï~>:n¤³OŒS!%^Ž’Óf¤ÄË1{èߢÜ"¼T“Éd×—W£Ñºº:Ì µÀÒÜÏÁì÷Æ^°9çU”UT¡­}”Ã2”J%áya}Èer)Ʀ̅©EMa=&Ž›ì>)) wÿìðŸ"EZ ›lr’T‚׋{Ñq‚Ï>ù〗˜o5ûxøm8Õ×f%;À/Ôf|z%¡ŽR©$Óe³PÝGðHz=R5¬Û`ؼ÷äLGH²GW^ðâlìôžãÇ ÅæÀXô ç*Ye›Š?»2ê!ÔÄ5_î @ÝLDɼI¬LpF=[õ°…§Öä|áÝ“MÓSu«\Φ·âo[·§õGɼIW`GÌ?kþHR\: ©S{¬.Zp‡™ÛžÅ2Oªí£±,Ä”£Õj‰'ôž®#OënìÏŽÊà fK–,ÁöíÛ9! jÜ|"T Œß™ Ç÷Òt—›‹Ð}ºÅì©uÇŽ€™å bþ|lܸååå¨ì·`lë&ŒmÝ„)>HMMåü4áãc¢ÏÍE?Já{´·A.—;L%ÉÇß;nø‹¾ù¥ e}½8VÙ‰c•™?…ŸD™œ=¹^7õ£Á(«¸†QOi1)Å×MÂCàÒZ©Çüß;Õîðy~@ï;d(9mƶG`öûÙ€¢Ü"üòu3ǸmÕ™ôÿ.qËû¿ŽEÉi3Š^¹ŠŽWØd mí£ ¼0€Žÿ·R„.Ò‰.Ò ™\ ™\ õ´±j4¨)¬GZòÝhkkUŒaBó@lÞp?Þ~íUüûÕlzå:¿Ü·_{Ïgß%±'Áóûÿö•6,÷cÃ'çdE# AAA ’Ihhhpèƒ+—Ëq¬·ç}qÀ çÖqqq1šÿù ¾;8€ùS:€Ý Òä>x½MŽ/îßWKQ5]…÷°iEɨ‡ðÆ·›qáì~ØGðD…Ê0ŒhæOÕ~b7>¾ÿµú††Ñ›.ðñvîÜé4‚¤3èt:’››‹ŒŒ  ·¶öövIVVrss¹TÖbêæÏoºKf†aH²f8Çüÿô†ëpÐöÀ?I ±:ç÷ŸOï²³³ *(Ö`N§Ó‘ÄÄD.]¯'ï’Z?Í5 ¦~FCÚÚÚ¸ÎÊ0›Íؾ}; ËTЍqó‰W5èÕ<ÿŠÞèžjïÝáfåp¹¹»ªÕè©xÉø_N¸Zü†:­6òC‡áÿñ-VìòÂÆ×;q´ä:jkknààÝ%Ç({rLHƒªªsðÞ†ºº:§ÒÝdÊ»{`iî‡&^Ždo› ðx¯SæOë÷î’sBÀ…ÆF$k†ãÂ+…¸­”M"äèôϯÔ%xïT;Š+:ñèŽïðÞ©vŒ—z;«F£Q"Q(ðÞ©v¤ÄËQøçVåþE›~‰_¾n†Ñh”Ð ÌÞF¦R©ðÐÄa ÙùV-~÷p f=5þOmAYE”ÐÖ> »(ùåTTTp ÆO¢€ŸD^³cS梦°g7mBZòÝ øôûÙ'DOÙVŒ¯p½~ø 6¯«³Íز³‹Ç©ÑÚÚŠm'ÊPRRâ”F_g4S5¾ø&ðQ¤¦¦bþÛíèø¦Án{ùkvkˆÅŸ]Ç3=×q¬¢/ÿ¢Ïô\Çý÷hoã†~dK10›Í‚rØ‚aÒÐÀ^_ˆeÀ;w²Ù3ŶÍš5¢O¾F#›b766r¹\”ñ–Á`@^^ ƒ „4¶˜:u*JKKí&˜r‡Þ“ÓFFZÛãÓ¢>üé^QZNG’’’ —Ë‘™™)XîIÿµZ-‰ŽŽFPPjjj%!²…N§#AAlèìÂÂB»!¾…´ãÑGµJ înýK—.ŬY³Dk/è•+Íio,ùáÛ)Ìf3ºL¥è÷š*8ÓØî5Bú*¥r Sš‹ªñå®®¿áö¢£e©T*˜®–@>©Ÿ^‰€P«é‹—†qÌÿ× Lõ" bÕ·åÝ=¨8ÍJ9Ç*;]2~ÿ¼»äèëdíÊ*®¡¬âþøŽä×F i:är9ŽJeP_” U£@ÝWÓ1^ê'qJGOÐ/ Cß×}(9mFÏ—9æïª^“É„*‹…Ëxuø¢áÎàþ¸Øœó*¤RNýÏÏz°Â€íÛÞ ?‰gý~J“æÍvvú½ûgÙPjØP¢S½ü˜/yâIÄ?ð€ÓMœ®ÃÃÆ‹x½é;6–û‹/¡  ûöísùòÊår˜Èg¸X? ÅÝ{y;Š‹‹2€}A§O»‘tkAêÝ>Ø8ÌÓ5¾øòï3°q˜†G¿P^€Jå:¼¬§§o¾ÑN¬Ì-Z†aHUUÖ¬Y#jÓb†,Y²YYYw7MŠììlânüx[dddp6DϦ¦&”——‹ŠÄ7þ|.˜úçÏŸïV?[hµZd•SÞÝ2âââ`0°uëV,Y²Ä*7¼3xÒ­VKöìÙƒùóçÃ6¨ŽPèt:’‘‘èèhQÿ‰‰‰¨¬¬5ÿó§ôî¼O™™™$22iii\&T£Ñ~6H ?ÕTn/jïF\\Ü!À™€–M÷{v4O `'0<²+ùùùÈÈÈÀ]Oì3ËG  eÅ{Åa²÷ˆŽŽDGq°ð;t\ À[ï|‹—†!f¬¯Ó6ðØB¹• ÀÊþ‚ÚÏ×B\7õã“Ó#ñÉi–ñ›‡_t 1›Í˜aé…4Ì Åìú‡p;¿ÿ?{ÁúS“1û½ñøõˆëBš•JÃyš8 …‚Ë#Ÿÿö$dÿî2ª,ŽyÑøæ|f6“ ÅS÷°†*Éݸ7|žULtÀþé—¶?0lüï”b´×4<²¤Ý_T£õÏ_¢ã„E°ó0“ åþ~4uº['ÀG´ÇqÀ ç4βÉÙŽEVVŠ?»Žé_„o8‰ê L×øbÜY63¥á¼ƒÁ©4§o¹\ª‚=*•¹¥z|ã7°fÍÑÌ'##ãM`Ó«z‰,66¢Ê¡9ßÅœ<öô»fÍ.M°˜úÝÍÂÇ5NMNNÅüµZ-ÑëõdÅŠˆŒŒÄ¬Y³ÜbÆ999Ø¿¿¨þ/Z´›HKŒà¤ÓéÈÓO?ØØXQ†›ÔcÀ]í¿~>ówZ­–˜L&L:• í+¤œ³_ï—ø©¦bÆ(-”¾—PXûâââ+•pBÿJ€ööv ŸñÛ[÷f³Ù*!'ð7pßx —HâTÅ1LÔLwK€õë×cëÖ­HÕȸûWwO¶ª³ÙŒ„„1¸G{~ýð8—›`ÖõkXè/ǽ ?üjŸðË·/à^…VŽð'Î[Á¥¯Ó 16Þ ‰¿ò…î/ `¦ª5Ïyär9—û=U£@QîYWtr g0›ÍØ;ÛGu (÷,ŠrÏ⮇F8¥¡÷Kôd_eaµ|CÈÞãסß; †ó N°M rØx¯lÂèa£‘p›ÿ>g@Z@3GSQQ!qvúý—'qª¼ú[`.íÃô$6›Þÿ{û5À¢i«]ŽÃ[¡˜èí…€€„‡‡£ÊBðî“O¸¤€§Ò}ñ¢s#Í{y;rssa0 z-aŽ!õn„o8ƒ‘=¬FéXE7$Þ…jD "GwºTÿgdd`Íš5¢Uçt-ŠUÁæä丽B§ÓON­´ ONÿÔå+77WôæÛÐÐ z †!4ûÚ­¨Ÿ2ÿØØXlÛ¶Íí6dgg[ѻÀ¶ÿû÷ïGCCƒ¨“sCCƒhæŸÀ¥ßµg,.ô bûöínµƒžüiýž0ÿÈÈH<ýôÓnÃÙ¯÷Kj-r¹ÊkÏ¢°öÌ{ò>t™J1N~¯ =ì1~ê%ó ‘t °  Ý§+8!@ø'µU«VaFŠr¶”£¸¸˜“ AñQIªªÎá­w¾Fhp]Ng§Ã÷…Gš/îUø¹¬`™¸—b àÛÓgÑöE/>£“eè<ßëP0›ÍHì4ÁÒÜ£RVm;ëé(¬À™/0Ã0dïlÀkï´àÑß¡ç${ú'=Z‡~Ìš§Úd2¡­}Æ/ ui}Ü€ýY¿¸åÇ‚á¼b€-Ûl6s§ÿó=çQõJY^9Ȫ¯T*•Ó“¯Ñh”Œ*c¿¾#N‚cåUOõæþ߸h!ç"èh Ìf3Nôöãc¹ ˆˆˆl;Q掫)¹¿¿ |O?ý4Ÿ÷ÇÔ©Sí †˜L&<22€3ÒyódFö#n˜cˆ ÷ðFêÝ>ø®< †ó —W عs§¨Íƒ"##TëÎæ @ô©€h¦e OOÿ4•­$&&z¤ÈÈÈÀþýûðú©àC£Ü­ZµÊ-·7ê'ŸœœlEïn;Ö¯_††8 zæ¨~¢Ôþ”ùO:¸´¾b ÕjÉ¢E‹°wï^·gNG¦NÊüÅ€‹ˆˆ@AA¨+8z×Ïi®=‹å+7aýúõ8z¡—›‹\*•J.Mb'«å<ÛÛ7`- üTì,P‡aš‡·‹ÍgîÏæ@â ¸~ýz”––âj3f¤øàhÉulÍ Ã÷—ãów¯âd_/&y˸ß)ñrÌ~o<’Rì»ïÖýa¦3Ð$D ¯¶'ûƒ ‰—¡â4kHöaÍJ¬ÿù_ðB~­„OÇ —Ë!ëšÂiÖet£ât/Ì£#ºòûÜ&îY5æÒ>ίßÙÆÀ0 y+4O^»Ž––«ïhœGYø†!+R,ø@Ñ Ó§>0’“ÉYU¼³”š´Í1ímxö¿ÔXñá5Ä »!¨ÔôX°íþá8Z·ÆÉߺåN&J¥’444`Íš52ƒýØ¡Õj 5ú[ÍŠ&FA7ÿµk׊nC^^ÉËË5Çbë§}¦Fo•••‚™?_hhmmåŒÅ^?-Y²ÄeÖ;{mˆŒŒµ^)ó Btt4ÄŽ=mÇÖ­[±k×.·l'l þÄŽÀÚ]xúPЬ¤G/`÷fG™•J%™aé埀k›…_Þ‘µ|UkAáCû¿ìcìØ±ƒK+誱tO:{÷îEÁ ìi2c]jjj@¿s%P ÏÏÌy\¼4Ìê{jŽ<«þ¾ÿ|‹„aBs¡¨ï”Ðï%#ƒ1÷Tsc²P6ò ć=æÏoý›2SÛ´–3C-ÛÌsTpèûªÞwÈÐ÷U/îzh„Ý B|PË~FCÂLgº4O¦~¿6ãýGFàÕ8`x¹øW{o4´)#PXr£‡F¯ß «|ÚB^L~ĤR Ag';w …0›ÍHOOw((•J¢Û‚×ÒYƒ?†aÈŠé#±íØжØËäEýs'öõ mx$RïöÁ›'ÙÄåíHRúsÏ>6ÉGëâ‹~‚VŸÞ4!ÀÝ`-?&Øz—ˆ˜ìgö²¹ýPõS&"¶~w3ß -”‘ ·±Ì¸1nž0&xëÖ­ BB{õ(¤=T€ËüùÖ÷)))())ñø½¥'|¯þjô{MÀº:JLƒ…]öcÛ!tïpxZ½š½«Êüù´´‘ûžeïR|ísF‰;’=T{~ŒŽ)SÇòÛîNŠDJO9cüÎèÝ­ÏsFtbÁÀ`Ôï̽p°àIg¸Õãï)<Í0:„ÁÃ`d:Â8<•m!$»õ)Z&}Ö]:WÐjµ„¦é½àŸèÝí×\u ‰ŽŽ&sÕ1D¯×“¹ê2Ìß“†mjaOêS¿=ÐÙb!„Qæ?ØŒz0ú+¡Ñh¸l£®ž¥YHm×½»-G,÷nnŒ‚¬[+:}ºR©”}ˆ>7FAæÆ(ȺÌAó1׌ šƒ‚Á:}P8X „.8gÏд¾ Ã8LkÙÙÙ¤¶¶Öjè†#öå¢î}ââoôTâí%¨ ”ÉS†O7—1¾cÉó±ã=òòòˆ; T«ÕÒ”~æÉXfgg{ô‚y:B…ANÇ ƒuʢﴫw‘^ÌQ~.¡}¿™Ì@è»ÈOAnKïN}”ñ»«ªvT¿³çcÆúŠJ¬ÑhHtt´`aÃæÆ(ÜÚ§é¾27FÁ¥ì[÷ÿuÐënF3 eðÍ‚Ó84‘ƒ^¯=±ÔB´¸¸˜+O,†!sc„ºÖ9B^^á¿X¾|¹„µ¹*¿¨¨¹¹¹çNÌMMM˜5kôz='X¸ÓîY³f¡¡¡­­­îÙe BžkjjâÜ‘h¶Á.‹°¦¨«—ÌUljÞ^NEØcˆ&Ťõœ:CTûiÛ©•®PÄÅÅ!(( Ö–"4¤©-”J¥GVâÙÙÙÄÝ(y|æ‘Mî¿ÿ~ÁwŽü5£Õj=Þ`ihTgÞÙÙÙD¥R!22šx9ÆK½¹u·téR—uðÝÒì}'ºñ`×uqq1 ƒËgi ¥ââbˆÿ¼¼<2þ|äåå¡­­Í­ˆŒöêw„––2uêT̘ù Xšû9ã]¡ˆˆˆ@dd$6oÞì0æ…hâåníÓ4v‹¥¹+R,¨©©¹iWcTÛ F@¢˜£ð#s~d†Ü~dÙu™!¤pãdR¸qò&ÈPf/—ËÂE›˶lgß; Z[[QVV†+Vˆ:ùÔÔÔ ªª ¥¥¥\\i±HòïäüêmàyyyÈÈÈ@ff¦U{]-ÌŒŒ ÔÕÕ!((MMMhjjâ‚dddàÑGåêB7q½^ï€j{z¦¾ªÎæB£ÑÛè_ííí?©÷¼h»'ùHqç¶1ÉGЬ_ü—ŠºÝ—u™!d÷îÝnûH×ÔÔpéDãââDE€CEÇæØõ³oß>· †¾×@aùò嘣ð#»wïl)l0 ×ë±}ûvTœ6[ì.¨ðãʽk÷îÝ(//‡^¯GÅi3‚g,äüÓ…€ÂÑjµVF¼Î! ZöîÝ+8¼ëÎ;%tüiÿ…Ž?eþû÷ïGBBZZZÜìRPP€¼¼<Ìš5Ë¡Š ×ëqT*CÙ'g ™™™$ &“ ---X»v-ôz½Õæ/Ä –2Ö‚‚·˜¸Ñh”•ʸh§B„3wA~›mUÌé8Jƺw·[šzû|_¸q2IMb]׋˛àHLá€Î‰Ùl†ÙlFKK rrrˆO=l;×ôo{óïT¨©©^¯ç„10›Í¸|ê$ôz=„œÂíÁöäï*˜ÌîÝ»„ 6X8\ ;wî”Èår.#e EEE(((ÀæÍ›ÝŽªE³´¶¶º•*;;›Ó>@¡P€–³k×.«gù¶ yyyÄ^$8©” —oú\u ùÊBpª¯YYYx¿£Ã~ûÞïè3ò&z{¹e¸.3„P­XL™—ú?Ü1‚üú¢Ä#æäÈ·Ý|ŒF£¤®®^þ-æýi ÷™Zʨg†Z`ižŽÚÜILDãçËårhâåÐëõ(**À¦WvþûÆ9™™I-J `Ëü…ôƒÆ©¨¨<ýôÓ\JY¡aÖ¯›2Ô¬¬,Á) iýF£QÒÔÔ„íÛêÚH IDAT·£¡¡ ¹Íg°4BêîÝ»¹°Ï• Ê>9+ÈÖiöìÙ¨ªªBSSçÿM÷*€Ñ¸Î`iîGÅi6ùXAA[óDµIþ¨©©Ô+ 9 ?¢‰—£â´g,}è¸àvQ2oë#Ã…¾~4õöYÅ÷Åk;ëPqÚŒ66XÙCnœLÖe†ârq|L(\e¾uª9°'ØÂ©`6›¡V«QPP€¢¢"Á™¤øì2#ÖGæQ^ð%K–:ùSnÉjÉ’%Ü&j6›ù˜ÒÍÖ3GáG~?/Ù#ßÎY³fq!]]=›M4 Ù½{·U8Ù––ÔÕÕqB.vîÜ)¡P®ý¤§‹Þêê%wH%(oï€^¯GЄx¼¥³~1pªO8Cš£ tîÄŒcFF’’’DÏÁÜyëªG‘áÄ0Š™¡4«ÆcïÞ½xã7 ×ëÝÚXpѽĤµÍÎÎöHó!—ËQWW‡¥K—bíÚµ‚hÚÚÚÐØØÈýOÃUÓ$Iî`ŽÂPí™X_mµZ \œyg`† ´´\XZ½^åË—»Û|,Y²jµ»wïÆòåËQ[[KhÈ[ š:™ÿŽT*T°4÷ êêê¬Þ/*ÐÌoB²:V*nlF£QRSS#Xà¡Z>­;BuÔét„Õ5GáG’ïõÇ{§Úqø¢”cþü¾¸r%ä3S¿Åî>H5 ¯í¬”w°YU·•H±.3„cüÛJ¤N¯ŸÝ…­PÆÜÄ”Ç׌ØË!"¸\†aeFž#¬Ë !s~¢íèIXh¨! ßhÌ“XÔ¸E -UÅ¥w6Ö´,{åQŸuNg×àÈ_*%s~n÷ƒ_'­—a·<<?Úw¦-<5¦¡’Ø2æ(ü¸±S*•ni1 CÖe†ˆŽ‡á‰Á£­Aš±¤ï¿Ïü¾»{ø\Ê£˜"¶mjaOë㟘6ðp騨®gëa—†Îæ˜aB× «¶RM+=õÚÞ Á…9”ósŽ^«Õº,ƒÿ¿:Îj-9ê#}ÎV€Ðh4$JæMfÈ}I”ÌÛi9tÒS¾íw73& ¿\¾Á¶»ï»=:Û˜*‚ˤ~žvZ,à[+{Ê@Ä29 ? NÜD*p9úÞÙ À0ÌïŠo/Bï¿„ÂvÁð™?u tFO7-O×}¡Ý¥ódÞùu‹µÈµ·ñŠiSÌX_Ñ›'ïebhùLŸ¿~ÜÙOèøýP·=zOö?{ôÔ›À£sUÖ…qd „þ¹ • ½ˆZôó…wÞ?zZæ ®Ê ßSÏzhŒëËÑ:£§{×èèh%óæ‚wÑ÷ÀÙ\Ú2É[Û@¬`{`³ý\ˆêŽ ¢ý¢dÞ¢˜@ÌX_’=(®bONÜKçÁB3ôÄëîØ;Zà!Þ^no¤ Ã1¾c †µKóC1:b5žÔO7±kgnŒÂã(†´wOƒÑ¥Riåþçh½ö6"¡ôQ2ï[ÊüÅxûðéí _žœ$…h\Ñ Ñб+0 à T Ÿ;æé˜h4+æÏwŸ¦§|Guòþ©Ÿ ô{Wû*Ÿùþ§Ô…Û^Y«¨ÕjÒŠ*•J23Ô‚êsÝ8ÛÛ'¨ †aˆÿð6<8Q‰Wu{œ …axInÜ4ªˆ’yïot\ Õ:ÐBú`›ƒnáááÇœŸ£ð#µ×{Ýšß¶á8g˜‘×Üî{ÌX_òàD%^Øç8ã¢P¸c¸FAç\¬mvD1õ'ùwâðE©G†<´¬)¼r¨[pYžöŸ_ÆSé¾Í£Øù³´^BK_¿h hOúÏ0lRwÒðÚÒ{Ò~gP*•$4¸ã¥Þv3Š i›ßåV\ö“;:†4)Ù ûØäjB÷#ºn`zò,lÙñ/®½ŽÆ—îy4[³j<Ö~ŠzQ9Ê!Ãß//Ÿ:‰Xj¯÷"pâ$+› ¾+¶|4ë2CÈ`ìcbÁç_€0fKCb׋Åab”¤¤$RÎQøi˜Ê;‚3 úoÃx©·`Wp‡ Û¶%±Ói˜—èÍÁƒ¾\4%&õ3÷4³Zˆ·Iò†J…JðxÊükþÄÌØù¦ 1+rrrív94§Ðñvº©ÑÓBÖ‘§ýç—3ÃÒ‹ºP‚úoº=*ÇFìiû ô]ftÝ”DNt_ª % B˜ }n†¥Ò0/Pvßï¼ÔŒŠÐ¤…PŠ?.ÀVÆÎ¦føPªiEj£ŸÇ|%í§÷{A\?ñ»êæVü„› ƒD¾«‡¢³Ä)r#^O|^@§Ó!%%ÅiÙj»7ógÏž-~*¾ßµk—K¾N§Ãdý)Äÿê9Lž<t™âq?Z6bóæÍ˜5k–[C 'Ÿ?rùÝí¼è6†~Mw `º 7k ÚtØ–#`Èt6!ŒŒÉbN ‚Ï1 ™`÷‘ïÅwÐV#Ӏྟæ1?2Z…#k’|þ\"c²Ø‘‹w}Fb:ŠR!²ôWvF€«6Pô£÷¶Ù›tgß&ÚU)RRRPVVæiÕ"”ÖOӞ棥¤¤àá‡V´ðñM [0#OΈ<Ž3l€´é‘Š:_òÐüã™p±+áÿã™p‘Ÿ<4À#þ‚¡Hà¶ýŽînêü·,ßx›î¼Ô ÿ›‡èÚù¥ø†hQªiEàƒAØ=¶ÃŽ/§þŒ©”jZqË‚LHR\¿§íüDñ_5¸?€Nñ_tk˜Ç•øÏ˜1‹/ÆâÅ‹‘žž¨¨¨P$¾TÆŒ3óùz/^쟸îÚo2™TŽâ;oÞ<ñüçÍ›‡¨¨(@qqq—úœñ žð£¢¢Äúy8ò¥Äÿá‡FFF ++ qqqlâ_\\ÜÅå/%þ33_Á]&.¼aFëŽ&Qü—-[æ6ÇHO<<íÿwŒÊvÙÿ:Ô£»ô^øã|T8mþ S.Evÿ´é‘ˆ»ìIs'þ¾úÝ5bîû]ð½ø|/¾ƒgjܺÈ5Ù£Fì@¤õ±Œ%ÃuKŒÉb$þi³ÕH›mË¡­Â¼¶GºŒìé2hA`G.Þþ·dcÕD¬*éD©€(^Š£K}].ÀƤAl÷S¥ßöéѸüžŽþ~øa,X° Û£%çb0Øô˜Ífäää -- ³fÍRT?eUÔét²¦. [¶.ù% À„„ ¼³éžøã(Àk/îsŸç' À“óâWÏ×€b¾§õ§4ZDƒ~fôHVÚp´]¸À>ð)|ûÎyì¼ÔŒ©‹Fˆ|Ÿ›lBÈ?ù·,ÁÖ²Fl«´¢ãÇEüŒ©LLѶ–5¢¤¸Qqý¥šVLHBëöVEí§,«÷G¢ø×ýq0 ééØwW4L•­]„ƒ-ÓZDD ==¡¡¡Ø´i***ðòÌü×'>N]Ñ<ÆŒˆ‹‹ÃŠ+@1Ÿr*,^¼+V¬PÌw„+>ŸÁqîܹ¢Xgdd ¤¤€-Üô¯ñÅùi¢S9RüC‡aÞ¼yèßßf„­X±B?44“'OlذAQýiii€¸¸8TWW°‰¿+>=cÞyçqäߺÃfø›G}…Í›7#äàRI>ý{Cÿw×ÿ0ôðißkwÿGÆd±K–Hi´>aè—7›K+Dñÿ{~`ÌׂÍÕþQÒÓÁ¿d¾ƒU¸g^Êvw ©Ò„ã øâ?kQbjÂê½Ñ®§8>”íîÀÁ “[¾(äç“Aâ_ö}Úk"£Uø`Ì“(15áÙÞB¤õî|â$Ø·c8úß’å«ý‘;¯êÖmh÷›€w¯õ]|¢~?þùM‘/6dcÒ V`½!!ɇUøÍiUEjòtîŸ\ÿ+W®ì–ë^Nýôð!W=-$à)))]\oî $ru¾Ñ‘‘]Ü¿…›îäÌø$;POóˆeÈå§4ZàsS:NÖÙ}ç L€?ÆöÁÎKÍÈ/Ì|1çsüéüøÜ&)~Ä£>‹mÑí¯”Oõû ðAÇó•¶ßjµâfà |WÐï’?áìÆH@Ì´*»i Óˆ ƒupƒ§´:èt:QH+**°õµxL|¢ ‰‰‰N³°]¯|A‰ç¾ ë1*+DCàСCxþÎÓxæ³A8{ö,Ž;‹Å s^\Š@4`<å<á“!°k×.§|B]]f̘cÇŽ!%%iii¢!ðÉÆ'‘9p£Óúéúw÷ùÑÓýßYÿ3ìv¼¸·Ðeÿlž³¸>~øìü2À!ÿ[|ü0iˆÑö}EÔ`0°ú‹ã9¸OÅ!ò&[ñÇpñ ö7gœâ$8XarË'ãEä›ï¹ÿ#£Uذ¦±;÷ ÏÂûá{ñ Uu®k ‘ÿ%ËÔû¾†Ì g±±Ýv1 ˆRáåQ¿F«ßïðiÃîUoÚñUü ¼?ˆaΑK=2ê'Ü¡ džføËËËceeeÝ^øx–åëj…ù¤z¬V+ú]²btd$„?¬þ´û‹æ°ugóg½‰?©£>7…AHðî/ŽØuþîð¿˜ó9æ·ú U,òxñû¹ðàfà  ~xõ«:;ñ¿Ô¯?žhs§òžÁ  ~ØxÌ6åEâé,»äÏ•qÄ:ÅwÍš5ˆ—¿ë•OÆñgÍš…cÇŽa²þ.ޏiii¢ø¯Y³O Åfó`X,Éú{{ÿ ÿìigvW|^üË4:Œ³‰1ïàù l 2WCHðÃó•Ñvâ}ɲÃmû•òI¼¥ø«}߯þ߯Áþqc”žÃ©ûêlÏ^üE¾v%–Œ{ðìžðrîKÈX€¶·£ö_!$cúÝ€Ÿ.„Aݾ·k:` çÄîýuìí†I­ŠÓŠæåå±´´4äæævkôÿÇþ:öwËEY)q ŽÞ€«Þ[“:Z‘6=B^{qŸÛÅ7?gþÅw뜊çÏ•‹n ÃãiíHzú°SñwÆŽŽFf„Bþë·©¥Îü/ÎOs*¾?>Ä8p –-[†ªäÛñ¥ÄßYý½±ÿ“øQ«$=RüÇÆÅ˜?®Å¥~ý%Åß¿MÁ’Û"CÀƒ«ÃŠwù便dÙg|ãÇËíÄxØQ›œòµ+ñòÃÐê÷;<]˜ÃÑáÉX€›Îƒ“!SD#àŠ ÜûëØž¦T7·â^]_¼xÖrÍFÿÀõ‘<÷8Щ$Çøõ̧9@g|^ }ýgÍš%{åýÏ‘ÿÐCaÍš5âV8 EsR"x½òyOñgÍš…þýû‹ÆX,Eõ÷–þŸ2àÓ¾WòþçGÂ<ŸúOÀ8âkâPÝÁìÜçîÚßoðT·âß|gíoQéû¨³-„uÖv§ü¸zQüIôÎõWÜ­ý@Û%|èè‘ûv\ ÷ÿµÄµÎPv-ùŽ‚Tmp—ïjüõ̧ÕÐŽ|!Á¦ÊV ~øky‹¤øó¸žÿžæó ÈÛ ß›ù|9RŸ;Ž|Š ·þkÝÿSBÆã@k¥¬þÆ ºt°Ø}ˆ¯‰CUt5|«Ú%ÔÙ9\´#_@ç@Â8ߺÈó‡‡]ÀuÁv|úŒ/Ç“sòüÍ ”ç)—/ãJäJ÷âê€ÑñõçΗâñQQQÌðÆã¶?ÇÏ¤Ž—Šx½E ô´ÿ!À¿FÆd±;Fe³È˜,Åzkt@gÛüz‚ïx]~öè # /z <5D¼ð‹Peàºq‹{á…^ô6DEEu ê—‰ S|ë‚a6›%ùâ{Cºõ;,¢Ûžçÿçò<o‘x ÁÙ#ßä†öâç —‘½ð /¼½^Íh5â²"—eÛ¾™($".+æ…^¯zåñ›GÒuvü¿¬}qY‘Ș( ,, ¿yTà\øÛÂ. .+maÄúé3/¼p„ïµn€^xáÅõÍh5â›ÈVo°Òj »€D!ÕŽØÞg%Šß;z é:dL°s[‹˜€ê GðkS…È ¿Ð¯óXˆõù"¨@¢ߺËï¹ú½ðð^xá…Ý‚^¯Gœ) »f´{Û¡ ³Åq7›Í€¨®³ôЋF@XXâ„H<0ñ#ÔÕÕ‰n~C˜¯¾²Í&öu€oÝT˜lü0Ø$üT¹ý+LðE0|ë‚íêw5-àŃb àzXñÚüó÷$nä… ÞƒWmaPaª]J\õz›àûÖ‹nyÍÕ»âS^)>ÕOàù‰B¢]9R|/n\ôš½R SºPÅ1·6YÄJ˹šçßó_Kxº—Ø`0°úúzÏ×h4hll}®$!”Òú»ËçS¢Ê‰; Å}:.–•·µ’|Õ ÷ró©{!‚ °¸¬HÑÍt]/Ò‰B"¶­þz½nƒ&~dÇ_ôä¼úÊ6ñUŠÿå;[lÞõW˜*ÄÿùÕŽxÞàpú㙢aéú® M>Y¿_Ö Ó¾ ìTð~ôˆ1¡ñó=çêQþú.ù‚ °¶° 8Q[‹›n¶e”ÒŽð4nêH(öl8à¶ ×k>óžÊÎGQä!7¨’'|^¼Ì}q´Ãöù°Ë~ª£€!ô¢K¾(öçúŠ<ñ÷¢ų̈æ;Êi¾IQvµµâÙÂ3²îÿgF…° ]ÓOßþñ YB>?°ÀÎ1ø÷Cš¯íî÷÷#n#ªÀ‡ºfÌ Dky ü’üÑZÞ"‹O¸CÈ|«!$†Û}þÞÖs²SÂöÿ±Üh””Ö!#5 %¥uxo›,~æH ‚‘Úù R— Þàçõõz½¸`Ûêïí> Š6ÿ¾-ì÷¶£±±aaa"ÿËw¶°­ Ñ=Ïç]þ<ø5Rßy2(òâçÉ5C¦hTT?³†ûb€V-«Ð!S4,¨¶ µG‘˜8 GeóIühÕ8ñ]#NâüujL› Õ‘PB„S¯/þþ:5þëE[þõ]ÛñÍ¿,8»ç_p?÷EùÔ)wII vìØ¡8ŸùŠ+°xñb·|~äÏç#§T¤gÏžEII :ä2Ÿ¸c>pà\xÃŒ€ô1%¨œ|àZ­–…¶ @¼¿MA«Z:pÎÿGòF³<¿ªÅ¦ârø¼øÇûû`N|t¡ ñþ>øWS´?è*ªü¨žÄÿSCv^jÞæüVïGÏ4‰|FWžÿ±¥À;çÏá·!Áø>hÛ×êîÔEþ›'ÚXñæ‰v¬ýE0vµµÊâ“øûÆø¢u»íøw6¡h;Ðæ’ût\,€GûZñ€ù:žoÇ?:¨GÀ¬@4­»$Ë›@â»÷höµå@ŸwW4Lµ¨¯o”-Þ{6¨ÅÞ£M=,ó̯°qUM0UZÝòA`ƒ-û«7žÃêç0zX„„ Y|OAâOóÿf³š0µÝ¨›ŽsܰèÉ ˜þÎḣÍûgÓaÑ“ðå;[ ÑØ3uuu â''àËž($¢ºNÚ 5Žà9^ܸ°# F#÷t}‡Á¬S!1qhÕx5}ffÇ:Säù€Íh¨¨8*‹/3 6ñ× A’ŽÙQ2ÔýÇ¢¼¬¯Žë‹ÖIÇœŠ]](þÿñGž¼ãø¯¹-§‚÷;7 Ìh42À6R/))Auuµ(Þ/Ïìp9¯Îó)úŠ+Üòù|à)))ˆŠŠBII Ξ=‹ 6ˆâ?=äkL:Õnžßd2©Hü«ªªÄ‘?´îh²ÿƒK1uêT»:ÛO#÷sþ?¢ª¥[pçüDP- ­³‘=ÏçÅ?ÞßG?ÀÜW¬ÛQüo6 B€¹o—9}2¬V«8òÿ“¹]hÅÿhD>¿÷Ú±~^üÿtþ‚øß27™#5.ÛOüEÓðæ‰vLê°‰¸\>‰?øà¡Z´hCÐ=C°1iŸFüOÇŲΙñh_+f⣇`‹Í{Aâ_™Ó«…61² TýüÈ}ô°Œ Šÿc¹Ñ¸Cè²ý<Þ]ÑØ{´ óîŠeü„ ÌË´%?Ãe×?زBBÈÿà¹DQüÝñ=ã\zãÞv»ÿÉý®Ý9øá=maD?Ý—$ö<ȰlÏ â8Öï[l÷Õïxœ£aâÅ Ñ0 ìb_ ’O Æ—mØa¶ÍOŽˆÀáŽSع( ïî²:uá;ò­á¾¢!‡_WWâ®lÇ×ÅGP^Ö6ܪ#¡ØùD:ž8sÜé@]]Úo² ½1 -–vüï‹õ€Ï×ü„³{.á‡%31÷Ë ¾+i@ ¶|äAÇkQQQcÇŽaÇŽØ´i“˜ü¿>ñAb¢ôüžŸ ‡Ïç?tè:„’’ùÌ¿8? gÏž…NgËjÅUUU˜1cÞ{ï=¬X±Ÿl|æQ_Á/=›7oFæÀ’|¾ý”{@£ö   ¤jƒñ]ýi»ïÏŸøçü ‡-8-›_®/šôÑÐ4@¬›ÿG;=dP´G«ÕŠÐ–0„^ÄÑ€(þ™Ã|D¾cÖ=*'¥Ñ‚=íýѶ¯ß§ÉCDñúOwáÛ5G°ñ ôÒ‘¿ëË X4- f„b[¥U6¿à’Mì·UYá7Þ~ãm"~ÛÛ¿€õŸ'PpIkÇ£õœ3£b¨?°ôAky ~õ|-ÅèQ÷ÇÁhZw ºW§`Låy¼¾§È“ªßç¦0tœj‡©¢@§ø®ûp&^{qŸÓ¬žR|SE­h<(æWZaª´*æC5»¾¼ òKJë`ª´Šü†!=¾8–\ì@ ü¼¨¬µç[­V;#¶øø¡ãdö´÷T¶éÿ~û)Þ?ßDZépÆO›‰¶}­¢ø+á\ÒbwT?´hCÛ6Üöö/ðÂo?ÅoN«ä«¶[ÙÏ'O‰:`ƇºfÌ3ù"mz$Ô#Õ¢ø7®ÜŒøâK˜8Ú¿KŽõûÜ!1\òuÎó¹Ëi¯â_âKeÁë L˜7f³{Û1aÞX6‘­0Uعüõz½¸êŸÿü¶“Dƒ€Ä™ø|ÐZôçø9úq\ 5Ò'¾^ˆÁ1Ÿ10‹Çø#CÀ¢Q¿Ã¢(ò•à»Z ïÈïÕŠ‘¶|Òs¿¬Aû>¸ˆFjÌõœÏüJälùèàÕ¯êÜ.þëi~hËüç6Á|vc³(ÞAAAv«úåðÿü¯fÑs@epÉç󑻿Þ?ßÇã|æ=Å0Tò¶ö.£w2xþ¡=Þ × CÀ˜Êóˆ/¾„?Oˆ­{[$Ëp¬ÿæAÑ!àU5(½ QÔþÞÈç³§Œ€¨¨(¦­ÛQ~å= 9îùcaH×IòÇMðÇûo™D~ý‹Ý±´Àq±ýÏ× tNðÇzÞØèò ÷Ô™†OìV¼¯ßÝV6©|ØœÒ!Š?ÁÙê×ë9Ÿù•ÊÈ_ùï)_j랣1A¢-•"šç;òB[ØMe¸J1-UÿÂ!j·â}5ø©ZÛÈN*ºTa«ÕŠ…CÔxDŒÄã-x0Ô6Úœ8ÚߥàXÿ̓:ÜŠïõÀ¿âtæàEŸ„œ<$þô¿ãŠF#Éÿ¤ê÷(ÙjÂûo™$ùüs‘wýŸøæ`È”P±þ~ÂÄÿO|s?×ywx!½ °7å󮯯—½wv8&Ë ¿3á»Òíï_i>ñë=¸ã?í»n)>ïÈ—Ó¦Þ”„èœï—ZÅÏÇpäS,€} ÷øûJŠOµ¿·ñîhü >¿ÅÏŽ£pZÐG?Àó)€3¾TNrñ;Æ€~ÂDñ¼€?»ŸŒþç?»ž‚áx ~¾üÎÞ~ øQ½Ü>ü1žð{< äÈu äiy^Hƒ7ø•ú|ûØþö;ø•ÿÄwŒàŒOÇ·:ãóÇôæg€W?ËßQÜ<(è…?xÿÊ@*0 óÆJ&ÿ!ð[RÉ[Åã¶“Äù~:†ç¹J Ø ’‚÷™xcÃûã{á…^xáE€èÆÃÝ´ëµâ{³zÑkñùÝC /|nOBFñ***<%ñqhºÇê!(XUQQQ¯i“^\ÏE m„¹A½öt!¶çG̈F8¬åü6ètF¦×žÀ±ãèt:»þ'k:º†œÑj‚Òóç‘”š ÿC‡Pzþ<Œ:;£Õ¢Ïñã’ü;‡E`Ëy3&…èQ«µ÷F[ñ÷š „7X Ó騤=>;zLä_Ñl€KfƱ%3ãz4è†72GjØíŸPÝþñ •«èyW&“IµiÓ&¬[·‰‰‰(((è{ÂêëëU´ë ®®ÎingHÈÎV\§;F–››Ë"""0{öìž,Ú‹†ÑhdE/%3£ÑÈ Ä£W‹ï…|tŠÿËâ?1#3Â6M3¢º ÐkOÀÜ0CÅíÜÄo:0ØhDjHZ¢¢”šŠôñ¾âû3Z-’RSÑÖ®]‹¨¨(Ùóÿ$ü‹EôTUUÉ®_V^ZŠ âœfOƒ¿žKr²Ì‘6rD»C(û·æ±dfËËËë1ï‰ÚˆŸVâp¿‡œWZZŠŽ§gHÄüxjÚy1?ÈÌìØ."HüÒÒRÌÌŽ·½"''G’ß¿¬\¹yyy¢!——gkïÈ»°råJŒyòòòXAAxŒTý<ª««Y?ÝQäåå±êêj;#CŠ73;–°üü|¼»Ë Fƒ   aÅŠ8|ðS|Utæ†!ÈÏÏÇôÛŸ¬÷åïfì¶©ýýÒ!”µw ´´Ë—/GXXØ™úÒkOàÀa8ò/)©DÞ“ZŒŸ€'ÿ°ã'ýyOj¡btN ÐÎóôñ¾Ø±½ êŽHòXôä-øÓ–-HöQÙ©!!"ŸÜþ»ÚmùO&Mèc'þRF@­V³Ù,mLÍûd¤†áïgáÖGoÃøI¿GË÷§¡d46÷…ÿ`‡+Ûq¸²s_øëFH—ÌŒc™#5LH ‡Ž¢—’}æIyÝ™þÈ©aäÆWÚ†ÜÜ\öCèT žþ˜âùgHLLÓ/[¶L)¹¹¹ÌÏimSÀî i¾~¸åþñ³î@«Õ²ÀŸÎÚåp‡šA BB(È+W®”mhµZ6pà@TUU‰| k”C) Gn¿‹/Ƨ˖!6'G±ñÜ׌ɓ'C§ÓañâŨªª’=ú7 Ìb±`Ó¦M¢ç ??_Qpžºº:ô9~UUUxäöÛ'þõ™¢ˆ™#5ìó»¥;vD}}½ŠD×—Ðqª.ê±ÅÇV«whÙ’œ²®Û’™qlðôÇÐOw·>’ìш‘®  €°/> Ù/œ7O:5Æéþˆшŋãëe÷0ú\2UUU8Üï!äççcfv,›~û¢FF‚™žžŽ   lÝnÆÌìX¼¼<>ø)–~Ò…¿fÍÐ}}øà§ÈËËcÓC¾Æ»»¬X³f RSS1=äk”••°yˆÿ»´ÎÄ^/¿x·(òE/%³©S§âÀa ±zõjÑûE\G#àwiAÈÏÏÇsÏ=‡­ÛÍHJð…F£ÁsÏ=‡üü|6¯Ø±cÇðÑ›ðÅç¯u¹†ìÅ—ÿÅ‹#dÀ4ÀëooÆŠ+”à “É¤òd0ä ´¸—wûgd$ØÞ¨°;6##ÁnJ ""BññéUر½MtûÿiËüiË‘KFÀŽímH˜äûcíø÷F[‘!ø‰‚Æ'4ðO÷³3èoÖÅ ˆˆˆÞÈÚ·Ûý8ÿþÕ,Üþñ ÕçwarWdÉŠawÖØY¾ cý&x´’úቡÈ`üÃî+>`0Xjp#:NµƒRš@†`Ëe^bj³ŸTËjGðˆ(Öo´z”bûÑÿòL¥[î’™qlbj"T¬%¦&±~¦Š?“Ó†Ë$&&bÙ²e8p ¢ëWPPÀ†Ÿ+Æßk‚óI¼än]‘B^^ë³ñ}øŽòÃŨyX¾|¹Ç¿ÿÈìôn8¹Sm e3Ð 6wî\—m¢]©©©vbÇG*lhhpÉî¹çðöçŸãÇíÛAœ‡zHöµàSë¾·ÍG‘p“ç ±±Ï=÷œh4(n©2fÏžµk׺-‡Œð4µ/vµ·ÁTQ++½w •Ü!!ÏžqYïË/ÞÍþwý¨««C||¼-Åv|¼â3³cÙWE'eGŸ¤öSV«ëÿãv« ûháMÈ~éfÍšËùmغ݌ââb¬X±ééélÆY||<žšvÞŽ7çÍ“€‰ãõ(¯lCR‚¯È‹‹gQ;Š‹‹q×]w¡±±-¼ K¿^{_Djj*ôÚغ݌‰ãõødý~U^^[³f àñG&ã'Ë0qľcǤ§§ãVãM"gëv3d2þë«Û³&??_ŒƒðÑ›ðî.«8í‘““ƒé!_ã·6ˆ÷oˆÒ®òTÒ½¦×ž@ye&OžŒM›6‰íUò;º䉉ösÿ*vOæ¥ÚŒ€öñÊòRdd$`ËÖÀO–a(..FóС¢W,}¼/Ú}ÒQºµ‹ž¼c|:›º§ƒáÕW¾½7™m¿!11÷FÛ$øÆ'4býE¯5Š^€-Ûšñå¹pK{þý«YvïýÇôÁ``þc¤³™9bLV ¡RaÆ»f¼+à…»s„IüMµ(15AîÄš@–9RÃþØ_çÑè³ô‚>ƒÕv)QyÈ…°ùio;Ì (/³ýèc²b˜Á``c²b˜ÔõøzÙ=ìÿ-LÅÖÒ 0U4&¦Ú¶’!@¯îpyô ³ÙŒŠŠ lذA‘ 77— ?g»¹î¶¢bգн¥¥¥Ðét­?€³gÏâ­ýð× -/^ìIl÷C¬/&u´âæAhhhPÉy“ë_*]}}½ÊÓ(ßÑ]^__¯â½R ããÿžXˆÊõëUÄihhp[/ÐÙÒn Fé ž-<#ëœyç >>^ô(A©2¤Äß`0°§ãbMÏ,™Ç~7v8ÒԾغ·E–ø×Ö1Sd}}½ê»Ó>0Uº÷¼ÐÈn›ÚV«U±ÛØh4²E ÑДsígfDzÇ™Œ¢¢"ñþ˜óæIÑp¸ßC œ‘{0ýö'PøÏiˆ‹‹S¥§§cíÚµøâó×ðÑ›0{öl|q~šx=¾8?M¼[·›ñ§´"êÔ©býÅÅŘ;w.>Zx¦N*úâü4;v [·›„§¦ù|vWFFƒ_þ7üT<þÔÿ݇   |Ut-¼Iä¾þöf‘K#ü¤_üí±[`üÃnÕÖífäää°yæ¼yI ¾¶súü5»{víеÎÏÏÇìÙ³EcgÕªUªúúzUO‹?!bhçŠÿIý1i¢?˜*¯,/¼²¼L#Š?`›Ö€>Ç£¼ÔvÜŽímâ÷¯¾ò­]¯¾ò-~;i›¡ðùÁƒâww‹°BËŽV ýCÛëew è‡Ãœ¬ØViãïmó~¿ i†ñ©d]ÀÕ¶P•—¶mÃ¥mÛì>sƒÁÀ´Z-Ki´ÀTQ+æ#cU,~™F‡ïNû`OS‹ÇóødPÝr…—ÚßËçÍ{6PÕ×׫öl8 ’ZI? ÿÖÒ ÑQ±˜*jñÞÖsnÛžž.æ=0›Í(((Ý~âSý[K+ðæ‡Ÿ)â“XÑßS# ''ؼy³ûƒ%éçËÒn³…=-ÓèÀï,p…;4¬f“„Æ4šråipU®+ãè힌ú ƒÅúø"ÂüªªªdMŽí*Cʈ¨¯¯W½P½_¬ƒîù­{[PÞZçQ2 ƒÁ`×÷ƒ‚‚°¿£ ®¦ [¼x1Ÿ,Úš* ”+ð.íÒÒR\Ú^-ûÚ fn‚÷ÿ¼F£‘½üâݬ¸¸ñññø!t*Š‹‹‘ŸŸÂNÜ7O"??nù›XvUU¶n7cΛ'±víZœ={VlSYYŠ^J×¼»ËŠÅ‹#瞯ÅöÍÌŽe«W¯…–7¤Ö¬YƒœœQàç¼y_|þšŸFÿz@‹Y³f‰†A}}½*û¥C˜;w.‚‚‚°ôë.\:®¾¾^µu»?„N?[³f(úô=É´òŽååçç#)Á·ÇGüŽ çöu6$ò¢À“y©âü?›&$B§ÓÙEˆLï‹Ò­%¢Ðïé`¸ÿåo°§ƒá·“&¡¼m;vloÃŽímHJMµãÿ½Æ6  '/@ËŽV»µtlàX5t:]×)ƒÁÀ~ÒŒ A¢øoÙzsÞ²Êî„ûj0ùô »Ï7‚ ‡ÉîÀåÜò ²9–AüÄójìijéâÊuU7=„i°=˜\‰ˆTJã~£ÕhÚ)/â×Ëîad,{³T4€Hôå^ÿ3f ¢¢B¼9ôz=±jÕ*ÙüËñA,$†ã˜.]_ª<«ÕŠ+V(ZŒ˜9RÃ~ýÒjìÚµ }6¾ç÷—Íôóeó2Caª´ztïŒÀîKÒºu;ƒV«eŽ®¹ ¿pQ¯¸ÝÝá2GjXwŒ‡îL; {0T·ê:]è©Á² 8*ñnj›T9Ré¸ëêê­ Ø²µEœ"9v\#~OS´@“®¶ó,zòlÞf[ XûùY|~ð ú?.~ç°qÿ?;w¿ã‚À/Ï…ã–cGøH×tÀ|ÒgVÚÄ/|öiÙâçñåsbËM ìXàYF°î”ÁiÓ#E!”ó¢kÀ ĈµxÞƒÒuN·DR{ìÛ">AéÛ ¢d$aµZ1pà@Lž>³gÏ× ðÆ)‰·»k\ôR2#ƒÆñ7)z)™‘÷@êz(}þ^O‰»(P—}qÒDÑÀ¿€]¦ »h€‚ °ØœqûŸºc‡¸ èÜHóÿ奥vÑ)P†àg«Ïaå?ü %¦V1€äâ$‚Ò,$|“OŸÀ?EüÞºJG<P&ÞŽŸ)í4$þpæÌ~¿›Ù¶’ˆ*m‡»:ä!¿ iÆž¶V AhÛ× ßQ~0UZ]þZ­Vt»{ÚæîŠ?µÃ“Ñ?‰¯Òúù­Šßöq¹°PNY€ç×®»Þgmò¤º*ÏYûzbÀ¡´¬¼¼=¯»ÿ¾¥Kú=á+©ß /¼ð / [ù'®4zk»®78M”=’ÑßÕlT;zò8/¼P ìäŃȘ,Æ¿ö&Hµ©§ÛÉ{›ØJµçJ´Ñ“<׺RBz-ÅucÍAßgmÙXsPåî¥èÿj¢·uük!S4LnüŠŸnäßÿÈ ªÈ˜,¦nßÛ+ž¼AräÀ†.÷#µ·'êQ ‹Åbg\«{‚¯_§Óu 1Nmì©öÑ´àÏÝèbðBJØ×ÁÐÞ%|^Ì3£G2jƒ³røïøc=AoèðRÓ®ž|4ÚE]UÐjÚž@ðˆ(xÜpÝx¨=ÙÞÕˆŒÉbq>*´«GCJp¯v[xCÄ• 'ú¿N§ƒ^¯Çdý)»EcF£‘yšÛÃ8Š>½R{x¡Bít¼o=½5M¯1(T¶§ßKÁÎpÍ$_[HÛQ—“ÐhÜ…›7Gó®@†ßz/Õú,ÉW-¶×Ñ`k5=<ìB¯1ätpþ˜î¶Ûd2©ÚÔ)=*¨Ý…œ¶ lhÀ}K—vk$<"Š ™b #{ih=´áõŠEµ'DرŒàQÌ]¹Á#¢˜'íuDo3åŽîºk°ðý¦Ý7pǨkר=íêш»ü\sæ€8•]ÿWú‘ðt:2#¬’ÂëÈu÷^nèý’™qŒÚBm2BL&“Êb± 3Â*¶™Ê¢­rrëçE´±±ñš/êåcô¸jK}}½Š¼ÄqgØüè?ÉWGZ/Š¢K;úÞ×ÑyX’¯Z–AjÔ_ÞÖŽ$_5>`M(ok‡»Ñ}y[;>`Mb»Û$Ç ñ?2ÅÝ¡nËqõ¿ndLËÉÉa éÎO ïñÒCà–“ìÂM^mð#€Q³^`´ïÕ§¨¨HU¶»±99/Rø¦Q5"A ?í7@^/›?dІ RÙ^y!V"ʼûe £ì’îÚ­ ¯GC­ýF«ECÆc@§Óa¤Je'ׂ °œœI·¯3$dg3OÒøÆœ }bUˆóQ¡ºƒy4èΨœçÄù¨ãŸ"¶ÏUÛ«;büSDC@Éõ­ÍæÁ˜¬?… !“õ§0Y ›ÍƒÝ^“ɤ"ÁutÉ+1¨N'¶å©iç8_“@"¿ÙÖ¾PKBw¦zÂs@ehµZæ*!((V«V«Z­–¹ó`¸ô¨ô¶ß›7œ¾I`iôM#ö$_5ÊÛ:¹bG„Êx´¯oûõË•jot¼í×öµvñ`8ãò Ns2d R’} Ô Àwz^„ÍÝ9=ˆÆÆû HäÒ£:vc°Ñˆ±ñ>vmR£ÑȾ}g º; ìΈ¬yèPP˜Ì¾G7€,è{tÊKK‘±ð1ò¹663`XŠÚâÕh¨5Èæ5Ôpi¨MˆIÄå®% Q>/äÃRü  ¯ÇO{Û]æÓ º) u¿Ñj± ô½Üó×ét—b‹JÖß°»ÜððpdÌíè“@÷Ç)¡ŠW±;ÌI>*´û&‹#o9|ÇrxæË–ëÉ‹óQ!%Q€ºm·lCDݶ)‰‚ÍpðKÕv‚N§Å?p|›A`±X\.¾F–aFÇW:Æl6;½/èú²þn}$%¦&l6 ý  Ï&ëO¡ÄԄ矱 û9P__¯jll„cL%bN#p^|=1¤¢ó*APP[Fÿ¿z¤ãü:ÜÕèycÍA - ÿ8?ÛýOå¦CÑÈ~ ?ÓŒ·.º·|¨~ªggK0ÓŒùþ²¼„#6¨ÚÕ£ÑTiBêÄ üPìv }G7™ÑhGìÃÃ.€ÞFÙ#òȘ, àæ…ÁÿÐ!4Uš Çš?r`ƒê%ÚH IDATûª”íîÀÍ ëVjœÑjѺg5ÚÔ)²âtLBv6%dg³„ìlöþö·ðð·ß1ú\Iú?ŽÔ¯¢¼´Töè°= ú?ŽX• 'C¦xä І×cXŠÆL R¹Pù“ç å× " 1?wVòý´CDñ7ïn…Ÿv`Ø/§Õ&ÀO{mýuXŠú¶µ%xD”ìÅŒtW1%#o Óåj4Å‘{NN3L‰ ÓP“¬FŸãÇe·AV¹~½ªqw;Îhµ—ýð?r`ƒŠŒôvßdø§L…×UßãÅýŽQÙŒFì4 üµ8‚§ãäxòbüSpÛÊDZ«ºÕ—7®x4Ȩî`ØUÝÛV>.NcÈñ’}³y0JLM?é÷Èl÷?/âŽú­€NïÚÉ%O†Åb³”JÝ tŒN§ÃSÓÎ#ÿãqi{µh„¸ÚË.ûky 6›ã«·wcjÞÿˆë&ëOÉzŽI$£ÿ݉¸V«eÄ·Z­8sæŒ]™JæèùrùQ>)•4µÛCr ‰wðoµâÿ€ó5ä²'¡¤õ"íkÅô·|1!ÞŠGûZ»L'Hyx/B’¯ÓßòŶ*ÛÉ"g v¶¶c[U¦¿å‹q~j;®œµ ÃÃ. ##Cüß]‡ŒÉb?Ôƒ¦R’}°ü˯pWþ³HIöÁÄ_§ádÈYùÿmíS(ÿËj|s9 ’I7ÿ+ßÞŒ¿­}Ê##€\ÿ)É>n½¼ø'¥¦ââ°,¬ùøId,| ¯¾ò-¾zðd,| ±99¸oéR·ÆkþD?¦!L&“êƒ7^ÇßÖ>… Šù µ-kÅžmM–â‡KC뎾i„ßPk@[¼úd?d=Œ1pË‚`Qˆy€TYÁ#¢ØO{ÛEáÏzÄ–ÊØÌli¥µáõ8úÒɤøvkÃëa¾|u© %ë, , âU*§#?Gèët:4ŠÛ¦öÃAÆ0dJ(Æ¥øbÈ”PœÑjÝ®Öæ·ŸÝ6µN|sN9m'C¡¶¶0.ÅWÑV6u@ð8Ñà¬ïQŸ"Ño÷M†ïè¤Åù ãþI¸måãH‹óAŸØN£àŽQÙÌ• GÆd±ÿdÜ? Ÿ/øê¶Ý\?ƒ¿W·íÆç ¾CÆý“dMF×dý)ñ3J…NŸ9b<‡þ2„ÜúH2¦æýò?þÏ?3XœN C ""Brz‰Ä²þ¦æýž»û”˜šìù9ƒÉdRéõzS¼ü÷ÈÿøCq Cx%ȉHêl´Î‹8/Èîó9æäQ²Áñ\v…: ð£}­ØÙŒ‚K™Œ\¹ßù‘=€MŒùi:–/˱ŒuÍØÙ,rù©WN†qÆù©1ÎÿÞº$®!p7@£ï”dœ**½ÎŽçyêö½hWѸéü7€êlcge‘“Å&þ: e»;0ªc7¾¯êP¼™.4… ä<û+]¼HÑè|ˆÓƒ›Â[Ògrø±99Xôä-Xü‹gºÁêáo¿cïÝr³bþ)xÜ€°¹0ïnÅáJ÷îwrÛEühY«8"¤N3¸4$´áõ }²-³ñ©l¹ÓÚðzøi‡`XŠ­óîV˜Ü£ÑÈÎhµØÐ ûúÓ<,¿Z›hK…0uVN\V$N|sÎé¢/¹í€¸¬H4înGaa¡¬rx×{Y…Iöè›ÞÇ]ž:àA"^Í­rfPÄù¨à;:Íû™èð¤ÿS;úĪж·Ìm9¼‘”aÅ­$ã«·mí¦¸”@ïI¸ù5@§AåÒ÷oLÜúH2.m¯]ÿJï*ë©iç8>Îíy}æîABâßTiyrëçËv¼W¢©Ò$»,Í——–¢rýún­‚U² —ÄŸâ_wwÛ•§ä‰½'¢/U`óFaán!!<Ý5þ”€ýÕÖÖöØï/å•pW6?zv'šŽ<Çþîøê® 2>z¢ÿóíl†ÀÖJ—S‰‚ °Ì«8Š'`Kr¼àÿÞqß>}çÌ“@u+¥Ûøøò¨>©r]ñù´Ræs;(Íóài6^%m’…Ìè‘ìé¸X–=’EEEÉÄïÈ•³ ÐS®c9ޝRq \!2&K\zµbôÄþ}©2]ýï £f½pUΛp¥ƒÎxR>ŸÒÁ€œmìn½r:COFV“[ßժ˨/^ÍW¢ÿ;–íª|ZÇA¿û’™qââMw )åÆp·öÇh4²%3ãz, _¶;ŽÁ``QQQŒõÑgžÔß\³D¼ø*ž/õ^iÝ=yÐÓÁ½%еBo t-pµ#^‰ú¤‚ Éåö&A¾šˆŒÉbQQQWUü©Þ«ñÌqW/˜ü«’:<9þJ%rܪ(gWˆÁ`°3n8ôt\}¹õ¹z-p#7ªxáEO†ÖURßÕ‚;O`‹ÂGÿ{OC.œ ºÒu¹Â +þ^xá…^xA¸R¢ìdxá…^xá…^xáEoÁl+Y0z¥ÛÑ“Çyá…\x]à?HFä‘››{ÃÞ7ªÒy×ÔÔôºkàlþ®§ÚÉ )ŸPª'ÊöŽ4µ…Ï£Ñ“í½‘ ‹Þvï_Mðák¯u[¼¸rpiôÆàÊ yó»Í=Ö^ÚÛÚ¯+twë–ãy+ £z¥a0œf…3™L*ÇUÄž´›ƒñØØ1:CH÷Ô®%Çò™1©]Î2rÒwÎŽQЧãbe…Íî-èicåZgBì p—MîjBNÝÞÒÖëN €Q³^`:«V­ê€7¿ÛÌA`®Ú³ðæÉªs¯ÛŒ€¼¼¼nÝ:N XÑ[Ð(`Fw‚¨˜L&Ucc#êêêÐЋÅâ4qÇÕ5V«Õe #‹Å‚šóâñJÛÍ Hy[;:îG’¯ZŒh)G Åžàùr„Ê1 ×=þ¾øPßãüÔN3r6¯Å£šðF€RÏG¡¼{‹àé¸X—íØXsPÅÓ[ÚÝSP’”«;ý•QwÙ䮸 <®ÚR__¯rŒµï5\éÐ÷èüïÏöŠÑ_óæ_³OŸ["+:Xèã“U‚ °åË—{|Ó ‚ÀŠŠŠTáááäů¿’»G–ÚÉó𤾰°0ÀPÿ¡¨««“ŒÜu¥Á?ÈêêêPSSƒèèh·÷cÐÅPT߃ššDDD(j7ïFÿPß>#c K:kG/°4RßÇÅ|'1–‹^©Œò¶v|¨ï‹ÇÆŽÁÎæV<~±Ù©°•·µcœŸ>#cñ¨&óý»´IN¨½ãG'ÈNžu%‘=’s{¡z¿Ûv”·µccR< ž?•!·>ê?×Üð¥÷999²¢á™L&•Üc¥@ilšÜf“sW–'<©2(<®;P]«Õ ­V˺ãÁ¸Ò[{\N,;õ¶¾ïQ'èî°¹ûA`3–ÔÉÎ÷¿úZ·~<ê>¾—‚a4¢Æ¤ñÈ䫯[Mð›ŒÇÆŽ±Ëbélôí˜H‹^ÃO»bÞ¡2þœšÿ»ïEÇÁýØÙÚî6”vÁ¥tÜÿ»ïÅøÑ øPß×®MîÄœ¾ßXsPõŸ¥e]Ri˹~R ¨¢rË¢‘< ý?ú§,AÛXsP•Y^¥ÊŒÉ¿Øì6“©ŠŠŠT:÷F[{lÀ“çõû–.eµµµ²ïåÚÚZÜ·t)ËÉÉQ\g}}½ª±±V«ÃGŠŸ+Qóâ뉋#ÿ¾ç”RM ê–#%%ÅZÓuxr9N €ø_6cÈwbâU0›Í²oàs¯Û\õÅÅÅ{}3ËËËS,ç^ßÌ*** ÓévËE#¹…7OVY,±-Jêì“„T®ûŽ£öR:U¥.i:>77—‘øË‰¯¶¶‰‰‰¯e k[§š"{€ Œ:ÿéƒCPWWƒÁÀès%Á>¨Ý$þÑÑѲî‹Å‚ÔÔT+*Bh^N"çttŠDy[;;ã:óa¸›WßXsPEB @µ“ñçÔÌô…ØhäÿçÔhJEÛ÷»ñVc“!áªþ·›ÐöýnhJ…ÏÈXÌôwëÅàÁ'ÿz¡z¿J®p“Ë7½¡z¿J®?ËÆùu®g ½’)Œ5U¯÷í#®ãp7}àNã¢ñ¶W…êxß"Ï)ÀŒF#[6+ û a6›eóL&“êoO=¥ú]š?”Ž™è€ÎŒrîDœ"çÑüÌ™3ve*™£Ëé{ø1@v<~1î0Œ»Ô-FZZš'4;tg j4Ùºuë\N{;êU«TëÖ­sÀÉWêCAXòä×ðésKØF®æ^F#»+ÿYüuѸí£'0uêT<çiÌXR‡ÿøÌV‰ÈÖ×âñÌgƒàÎEÛGO@§Óá®üg±ðæÉŠ.@^^[¾|¹ê6<Á†Df›:uªÛ: ¼Õ_[[+«NAèL6ByÑõz=ú÷ïC‡‰©QÉ p%f$~999(..eè’û‰ˆˆ ß‹M:ÅÅÅâõ—kHY­VT\ꀅ}‹Å¹øÒ(=,, 4ZŸÔÑŠ3Lh;À°²e*v@3ÀŒšš444¸Mî!«©©ÿOMM•ĈÊÕ½ý6 StT§,™‰xŸt_4®ìL"åLÀH\;÷Ãgd,|Ç&C·°šw´añÎd´}¿ãúøaüètÜ·›÷:ŸkœŸýVÇOó¶ãï÷Ø%årå–'c¥ãà~4®ú­ñó€q÷c¹FY.}úþé¸XöØØ1p7ú¦2Eá.¯Rs{ãû=øgK2£G²ùþ?:Û÷V‚FèÎ<åmí wÿŸçÜÃúôOq=ÄFW qhfy•j#À2£G²ª÷«6&ųÌò*Y÷Amm-Þÿs ,‹Û{Ï„{£­øò\8¾þ÷]ìý?bø¹bü½&ááá¢!à,! ÿùúßwaÚ/>Uœ‡Žýë¡tûýH_+›Ëg#ÈIGË ?`@†Ä{/Þ­] Wéu­V+†OQá‡oä‹¿ã9üðÕ6ñ£òd8F£‘EfçÀh42¥Y)F#KIIAZZ"³spd}!ÛµkÊÊÊd?ÇŒF#[þåWÈ»íV%UÛá½÷ÞÃå2œžƒd:Æ¢¢"1{–R¦ÎpqX sxŠ‹‹a2™T$ÌîÊ ºt+%h^^#ñ³X,ˆÿe3þòL¥ìND™Éäf#`ŸËñWbJê–ÃsV½OLLDEE…ìö›Ífœ9s ­Q0èN¢¾¾Þåˆ7t:Ž;†ÆÆFh44ÿÖÀlk ä<ÌŒF#+--`OróàJnAtH¢Û2Ýø‹ss±å¯AÁ¥ñWîwâñ†QðÇù©Qp©E2³%_Ƈú¾ð¿û^´}¿÷ãóE»©wi¹éXZè÷½X±j•ÛtÜ|ü‚E%îsÞøgK›˜ÝÓ“uOÇÅ2O¹|[<áÀ×Ëîa/}õ£¢¾Ïßw<ŠŠŠTôl”ãÅ›?>Ö®]ëñóž!………ª‚‚öïÿPXX(; 4‰£oÀµ`××׫ø4¶<øÔ¶®ÊáË£‘?ñåð\GÐÅPÅSëÖ­c³fÍêÖúO ªû½÷ÞëvJl£ÑÈ~øa(>rŸ+qßF6jÖ Ý  òëç˜Ñhd´ê¿'Ö4oþµâXÖ¼O‰Û€¤ËPI<¿;kø÷ä ”ëÊ7L«Õ*v}ò|rù+=­VÛ#‰AøöhµZùîã¤xF ÏÎιGÖýì˜@+**Š=+fÔ”“Y“ê9;çv&mŒÈ¡öÈ=o¾>âŸsS2Oç­ÔuîØ@ùüÿÙ9÷ôØâ+š> W¹0,//åääxßÙý+'«Þ}K—*~ö¸+SIfOJ„C.}¹}‡\üQQQâT 'Iuøz»³_àIY=¡=žàJÄÞñ¨Ì«½–Œ ª·'.Ýø£f½pÅ3ZIñ•–Ñ“±ËQò £Îëi{<=£Ñ(®èN9RíqW¿büé¸X;ñw'ÜôÊg²tüsW “â» r³r:r¨œ3icìŒ weÑùóçw5@ÆNw )!$÷xA-B®ÞŠðœœœψGezÒÿ=NþxO¸Wb?¿'åÝ»œBq\‹q5¢*µê®Õ6 ž®WéhœFÍWóü¯F]rë;j—âñFÏuWÆÆ¤x¹Žmp|¥ó‘ëM¸",§ÎÞPÇÕ}Çz¯u4ŠçÅÿZì§÷îá¿Æ¸š.kånq…îne»^Aç|µ €Þ_^•ò¥Þ+©»;ÓhŽu{bDxr¼?ô„ Þ /®k܈âÇãF>OE³»õ¹zïÅÕÅ í†wî…^xá…^xñ³„˽ØüV²k׋+Çm_@gP—XTÙ¶ãÐgü+•Áo}:2M•&9°A•››kÈ"2&‹À‘TÍ*ׯWÀ}K—²òÒRT®_¯JÈÎfI©©8UT$n…yùÅ»Ù.SÌ CpF«ñ¤@[“ »ØWƒ¾ÅýÁî¶ñžæ¡C}Žà|+fdL£srüLê;m¢Ñ¦N§Ã¸_ì,kCTTúéŽâ'Ë0ôÓÅβ61qèÚðÛžø©Žÿ¯³-º_¬øŽM_|³ìí¯®¶ŠÒ÷ŽÇò¿ m%ããJPûé3ÚN gÒÆ°»öˆq ÊÛÚm!€/ï÷:.–=ª±Ý¿o56‰ñh»$»Ïø6Ó÷´ý’/¸¼`ñòÿañϳàQ*D`Ú?By[;üãmüOÖïWEÆd±ã z™íx?Üüü,V½þ_PŸìÜ>H×d@r ‹Ë¾ß=³Nån½+¯³ßÆñú744¨øÑ¿ãwü{g÷ouÇ>ÌÞ‹ÊDª;ö!Îg*žj®ìÙp@5&+†íÙp@–®twK§ÒpúP¢½Üôã{ºŸñJ¿ñ®D»2£G2!Á¦ÊV÷!_MxÚAøýç€í¡÷HëEÉcßöë vûº)ÎÀ7[Ï! A@S¥ S&†b{Ãp4UšS&†â›­¶€ t `{FýL>JÞ|pìØ1¬ŽÀòWúáèÄߣäÍ7pŸà‡¼ÿ÷8б Ë—oE¥j þöÔS*Åú^l‰<ÿª ¯GC­ÁîøcèÞæ÷o6ÑoS§ %Ùe»;Ð÷è†.ñ¤Œb^ð@ݾíêÑâ+o ðFÁ×ËîaïîjÁ¸[\®µÊÚ;pà°÷F[QÖÞ!)j¼»«Å.@ N!¡t¾™ÿž‚«ðý‡Î‰ÿŒH°ùóç‹ç>jÖ lߺ§»:ƒ:………b\ bl lUWWF#F“ÚG.Õ~Š IÁŠÞø~Æù©Å@K;›[1®Àÿî{@Œ«@1v¶¶ƒb<œ„Ïï»ðÇ'áí å: B’1hçZÕÓq±b~‚;Fe3£VAÕQmyq¯*ÐêÛZÖ¯­L4$²æC~]η¡¡A5 9õŽsßœBè”Á8÷Í)ñZð¿ý³„Œq>ÿ)d/]¸yPö1ƒÝoBûüT™#5ì»Ó¶ ²Äʼ»«¾¿Ûƒ”RÔ>(v!p{_Üï/¾ó…µZ¾oÇSÍàÅŸX$ùªñQ{,F³*ð1-äÄÁðBÜFvR…éjÀñá+õ0î®×"3z$;烡Õ®ýMçØA¤£8»+~•¾³fîX¼í×WìŒÿ½ïòn»h‰ŠÂÖ¿ìÂcO ü/«±½a8zd2V¾½ãµ?`{ÃpŒ×þ€Ÿ. lj#DÁàGû_ÿû.$Þý-2>† Û¶"xÂD\ض§ŠŠpF«ERj*ÈK@í¡Q>Qôéµßh5ZNØ}æhðÂ?°¡|èeþáÉ oýö¾<¼©*ïÿs“¦KH›t¡„ ]è Mh¡-(QÇ;@é€ú"`Q^p^FTDÆutAÜpÑ©Š(ŽŠƒ(2":ÔZhIt‡¶,©hKi¡KH—49¿?nÏéÍÚÁ™÷÷Î÷yú4¹¹g¹çžóÝg‰"ÕvÏ&TŠüóóó‰ÉdÂïoŽìiX¹]Œ·^¡ð%3Àhã÷_šXľ·¶å?¨ªªb}úZ·A¨ÉdLZŠš]3â=sæL‡¬e” ›L&( ,_¾[÷½È8M¥R©X¿Â5e ÊËË¡P(ÐÖÖš{ÞW ¸ÕbÆïd,ûbïGï³Lص?›»±&?ÏÐìŠËƒüQÐÕ‹7CS!Žá°ùø Q"2ħD”Î^ƒ[<8{5¸¢œ¸X’¦V£!DލŽv”÷¿wke 1„'Æ·Uá87墩°V†¤Ïó°/áŽøÄXA ¿óuz¿T*…L&ƒZ­F{{»á—Ë刉‰A}}={Bf@¸CBBHdd¤Ë{&ð±X,ˆŒŒt`"##‘úº­ŠFøïÏb‡6 _µàW;ä.ûטn@òTþŒV1céiŒ pN^E×׹ކóµë“ÿ/h¾]j8;¾Ð‚?§CŒ§žâC…ªDš{û§ÿ‰~bLLów¸vµýýÔ>¨”.<(îîѤH†\žJ;BâÏ)8âï|m••ÏLWc'X{ËÍ8s>½11ÐffauÁƒÐ¡7&+VMGVVÒRùm––*‚ÉdBxð‡tË‘ž–‰[f†¢)˜¨Õ¢çÝwàß¼zøŒÔéñìèÀ3”øÊ@x²’QO3â€]“„ŒBHTÓÈd2F¼è<(’¤„‹~Ÿ› 0™Lè3†íÑèø¹Dl«„PêB¢SÞçï&“ ·Ì ‡Ñf‡$ãµ¥6¾dá&!{ZVgñÚ~hm‹––„Ëϱ5tHÁêïW(°žØŽ‚‚&A~ýõ×hooGÏÁ%D£Ñ7Žükõ$«EñòWÍÄß`0p”1¢Ÿ’ZøžÛÚÚ`2™ÐÞÞΈ?;è"f`x7ú‚\sÓÓTÑöö¡´Ç ¿É|ºeJüý&§Âor*ÓÅð_p'Öäç£÷£÷qhÇ;Ø|ü~' Dà+=x[›†-e°Õ¤KÄŒøO Lg¯¤KDX<fÞ MÅ…ô…„ÿ)bÚÚÚPŸš©FYª’äH’SðÜ|;Ôý BxðÚŽ 8ƒÕ/ÍAåðzê%^‰¿h¶Ò¨¨(¨T*¤¥¥A¡P 44”ícáïô½ŽÄ_&“A*•º˜Œ(@‰dd$ûN‰Z©]G“ û­Ôíþ]n˜‚i[ñ»×!yª Ûï5:Œá‰ÐÓ‚ZBs ý,d¸ÿ< ÕqÛÐh4Äd21{âŒv¶1L&“Ï^±žîóur²¶OØM&«-T×Ò~u:ijjâôz=ªªª\ªPù:wJ8% "”{¡I‘\UE4ç$0ÀÐêÁÓûh,öíþ~ФH¼Öƒ·ÖØ¡I‘@’ ò¹üúê“ÜD?1Sï;ƒ8V q¬ûçOqËå¸13 ¿hkƒ¾¸ ÍÌ‚63 PTTmf&.Y mfT*Z;Çà°N§#Í!!(ze3Ö®{w=÷ `ñ,^‚å™[<-“;R§Cʼy¤«¢Tò¤õØ[Ô~ì;ý€árž°Õðí„’¾J¥bÒÀ#MêÐXX…B…B®Š VhIHðïÒÀ&NF¢ˆƒÍÐWu{ IDAT/•i(Ñ~ŽŸK¢ãç•JÅ$ú®#FøgH {Pi†’ ÿ !{Z΄ÍD¸üâÇ›YO6þÁ€¶¡Ï_PP€ææf–Ó^.—ã“™Ëåп]‰M_<ÃÚRm0pVi=JhfΜÉú¡L]?“ÉÄ®577³¹„õgc„õG'.¯Ëõù"##‡ÃdȾk z?zŸýæ79Õá^ùýxS@z€e}6Æ($ˆ8Ü­ç‰ÑÑnþ]N LvhO£Ý•H—ˆ±*x"Ä13À·ªhH5(2ÄPdˆaM†B¡ÀdžáËË7±ûÚÚÚÐ]a@g ¤ÏèÀü8x!ãC »q¤ÃÜ„­V‹ØØX@DD²²²Ë‰aL]ÿŽŽ®¹¹‹…ièœèg³ŒY  Åh`è;ÿ šw’íß5e8\T„ëªqx¯A Ø<AGx|#Ô@ ‰>½FD‰"Jta’É€öëZÕzý;EBù2!môå~À`0pf³II¼Íê» "¶1fÜ‚°ú•³cÍ&G7§‰9_§6*Hàš ÕjÙ8Î>S*•Bl†6ØìPÚW?½µuÜD?1>±Ù4€gÂ-$°îêÁSÉ|¨€½µu\YŸ š ¾¿ƒG ¥V›×zðpf’’ÑêÁS •ò)á—Lôww;Ë+OU½õõõÐff!+‹'üYYŽŸàõ-1qÉR„ŸÁ¡7|µ0Q«lo‚§eby&ÿ¼ÅVöù¡‡oàïë‡{ïæ}HTÚ0žãpšF쩜&²T d©¤‰8Œçøß® “Ál6³¾L&ô—/Ãd2&äæ2“C{{;FêtŒ˜Q"F‘)%útXâ¾cŒ àÂPˆˆˆÀo»Èž€7¶óȦM=…iYY€x¦M=IÆ’ ÅÈÊÒ"+K‹pù9ÄÄÄxµ™û mmmËå˜5kär9þ~ÛSË娹s'`ÿþýì٠Ȣ È¢ p`@[â¬zNKKcU5)£EµÂù_ò¿•N‡°Þá¸äDð~(s@‰¢ÙlF[[_T ž8HD¸­–Cú´ FLÏn°zðÖ;»w0BLï¡YèÂî ÄðûdwÂkÝcaÚ¯¡ÂŠq'l83IŒc1š‰×zð'N «¬W˜Š_(ñ ‰?½FÚß™óÁj4˜qÿjdee¡¨¨ˆ|`€øë‹‹–*››_Æ‘Žqxoç£Û*±iãË誨@ð´L,[aÇŽ‡‡1©k¶?#þBMÀއ‡!²£k×fbØ3:”Pp€ÑN HåïoìÇabš?ÌǬ0³:2)üó( ¨Õj( €}=þûwSQ¦×C.—3ÊPÉÇ&æ¥E*ÙÇû§ab@l~égÐqj°b±?TcÌè.mÇä‡oÁ©W‹à×%eÏð&.2ÀÀ•ï •JaûE»C…P…BË—/£µµ111Î^LL ŠŠŠᢕ¡ª|!‘‹‹cŸÝ™dý凉¹3R±ùPzVŸ„òoÿÙ¢­(C2îx ÑÏ8‰—Á¤ý>±"Û(*Òca%¯pv@¾Ýÿ½ÿüÐëžÌ ×„ëz­ü†ÊHPBÞ3fŒÏs ÷ Í”ÞÆua„¥ gŒ°3-ýÍSG´xŒ»zÐTµd6›QUU5h…#ÊDû¡Îˆƒ-Daa!§í—e2´Áf˜Íf†·>ÊúxBK%n°Öؽփ•J…ÎÃÅè‰Á h1IÄak6?þ¤~äPPÌK ‡‹ÑØÿklÚTŒ+ÃdO£ðêþðã}ŒøS¥J`´”{#p±ý\&C[[ÊËËÑ3f ÚÛÛ¡V«1R§”éÃD­*• #u:hCCQ¦×C¥R¡¼œgšªíâ¾c8f#HsHs8fã¯M à=ÀïÒ8øPâ÷.Ká ¿&ÄÄË0-+ ’Œ4±áòs8uZæzßá½Gå^~n#^þŠ?«TM\__Çþ¾  ½›'|û÷ïGÒœLˆ`gHȨ̀¥¥1 I{{;Ó’( Ô××£¡¡ÁAe-—ËêÜwžÐ·ô;޳ÄlFˆc€ NÆW©W¦&§ ïø1&é|gáŸ3ÈVhñ¶6Í  ¶þ)ɘ˜ q q Ç.šX»6÷.KÁ”)Sp7· ;ÖœÁ —Æ#z^.²ÒßÁôéÓƒ‡»Y?‹4dgúcJ?3 „Q3ccÅŸ>ÍaÏÛdašÄy³aûE;Ä?Ê™)¥½½ $$$`Μ9ˆˆˆÀœ9sÐÚÚÊúwöm¡ª| qqq8þ<û® 63s 0À0477cÆ;ºŽ&auvžü+‚›a-†Øþ. Er/k—,JE`†vñ½H‹°3ù$ÊŒU6‰?#ú~æâ—ê  ¸^@™Ú‰ZíUi„d……цRÍ•þŸ›‹®ŠŠ!Ï¡â“O¸ ¹¹^nÀ@RR’ ×G¿SÓ€(Q¥‹Å´3FØa±X  æ¹Xm0ÏP §‡¢Ä?223FØ™ºË—JZÏÐ*4c˜L¦!-äÊéÿ ßÀƒäíl£€ïï`ø}2l_wÒ§1B|,†0†ÀC±·¶Ž£}m_wJw9ªmð4g!¡/=Ü…íëîaL€»Zò9q±„tÒF`«³1â˜èÐ7e¨¹ ÆNPüÎQp°ù ~×A_\ã1;â£; Kä ¶Ubúôéˆ{âI”õ—ÿ€)ù„8˜ÊôzÀöîzþ Þ3ðLµã(8à4!hì‡ðã}.ë’&âÐFxfÀ|ÌêØ3f ïx8f ÊËËá__ýåËð¯¯GÆT?ôöKTúË—¡íG²ïäF5ÎÎ}ÎPÖÃÛ™?è2ðŒBh ¬Ü.Foñëü¶·¥!ØÞ‚†«Dö´¤‰Eˆ?4ïyOpr÷n ;÷)>øàFÜzë­¨¥âÕ{ïÁ­·ÞŠÄ#Å믿…BóßFbçΠ&€öövïw P(ÅL„^åA‘<±æd2L— HÄa¼¿tRÁ>Þ •z6žÁ·×t±ùSFÀù;Õt—ògämm³éOMNq°ýÓ>Å1ü{¥¿S†àhw%#F5§ä9ü,¾¼|6¾8#FŒ@Щ“¸Ø¶™Æ›Ùû‘ÄqÈÎôÇÔix ëG¦Ëa2TÀb±°0¿¶ºüaÍn(bcu0þ+üá…\‡ç‹ŠŠBhh(3»ÅÇÇ3DDD–-[†ððpäää 66Z­–½*œQ_[[ëð]ßé¢ ð¾PC”økË¿;†Þâ×±H2bû»°‰Ã|г"Û8¼ª¯Ý…‰iþì P¼ÅÙ«AüRÁõsiÏõãï÷¸^Y2©S+ÀŸq_Ê7Óÿ)óæê;´hÃBM‰rs‘2ožOU©ä?!7ezýUk!NîÞæfîqwK§u”ûÁ—zÐ4–ThKÒjµÐëõ.õ ©ÚÏ[b ÊHPU>À3 ¾Úòés$%%±9Èd2¯‹)TãkRx"î,}{R¿ Õ‰Ôdpfm܉¢l¨°z­ÉN½ù‡ß'Céá.Œ;aƒ¡Â O¡žæB¥I‚Ãï“áÇU$ˆ°£¬×aljÔûyA¬?kY/$ýa-ëuÐÀ=\ êÕKÐ]a@æ’)¬ õmf^ßri©"ø×׳¼©‰'Q‹LÔjý(ÁBA±[3O`Ó¦b¼g°¢«‚³º@À<þÓDZ'ó„D¨!?Þ‡Ó„àbû°ÕÈ””Ä{¼ƒ€ï¿‡\.ÇHƒRSù¾Ží8‰Þ˜œÜ½Û!Öº°°…ÿ ™ªöj¨ú_˜ 77—©òWgÁ@’1mê)·LÀáþõì:bdyöíÛwÕLÕªÑPD€—ÊkD©H°ÃÇóóÍ@#è!ÐEÌeÆ%ÿ‹ëŽ×~Ý¿ìçÏÿ!\@_…D©TŠ7F„#=@Âbý…*!#@‰~`ºÝ¥6ÚñÞ§FöG¥ÀÑ `«'.¾S“Q¿Iƒ¢"=²3ýq¨¸vÑd¬{è4ÞØ>aaa¸téJJJ¦³€q*fLå¦ÜÛÀb±`ò÷àøó_9ôßEÌâdˆ±¢­®Aœ ú4¿Ÿ»×—R“%ú”ˆGKK öìك˗/#44uuuhkkcÑ4šÂâââ~sç#‰Ì%AH% gõIЗaLµÝÅùO¨ Œý, żž>Tõðý÷C&¾:Ž8‡ÓZ_ìótlj’ü)&ÊH”lÛæ–ö9ht:¡öLú¶X,n¥ MMMœJ¥b›’:•TUU9ÿ¦¦&®©©‰“Ëå^ŠÞO‰ÿèÑ£‡Dü5 ËlEµT àm\ªF_ÄKÀ¥‡»pf’˜m6o>e}|RjB°ÖØ1æ+Æ|`…¡Â kÝ'â?ÑOŒ3“ĸ¸ÕÌÚ:«ð½ =T† +.n5ãû;$°ÖØ]Ævׯµ¬—ýÙêl°–ñª:a4À o¿ë®0 0EƒéýȇþwGüW¬šÿúzüö7ùþl•(«èÃ"„Åûw.fÄÿÅç¿EA±•©ÿ·fž€zÁ·8—ù[@PJ .øZ¦8g´ÂDL„Wý›ÈÀmèhP²èІ†²€ÆÂBÔ‚2½%GúPr¤½11h,,4‡„p/í:Øøû͘`¢ˆcRMœÌ2ý­ÎÂæC]¨:%w5ØÞÂá¢"þ7ASÓÐÚ>ñãíÃC!B///gσ_\æ#1–Ýû>ßµ/_¾G:ø(ƒÁÀ9{õ¼¦£­­ÿ˜˜444 **Š© )btÎ ‘ŠÐ,7!#pÉÿ"îïÄ!\@U¯Ùá@ü- ºÔÈÔþï¬pS“SÚ ÁVOÁ?Ú]é`Ôÿ[:ËðÒæ·PjìÃWéâ“Üv`Ù ;êëëqéÒ%\¾xñã͈úUº3Îêêêðæ»þxñÓùu;þüW»q$b¬è"fgÀžz FÍŒeÄå¤ëÞÖÖ†––FüéùÛ³g²²²ñ§@ß7ÅÕ„šÀ‘hµZH¥RDFFB«Õ¢¹¹Ùøo>ÔÅÿ>èYɈ¥ý˜Ãþ­Òrø@_†;´¼ã%ÅAB-g¯fÄŸ~vÎÃp½€2¶4Üx¨ê÷ÂÂBŽž ƒÁÀrBâ;A—Ëå誨øÉÄŸŽur÷n¥¤¸íËå‚0 à˜5l°Á(g£T* M×IÓLRÕ‡7"®ÑhˆÐþt-ù’Ö9ÙÎ÷wH0æë Ü¦°Ð©Å#þ5v‚»úÕïTëà­§¹Ð65v‚Ûýý@# „ýŽé~)PG@€·û“6®ÑïÀ@2 ;AF~>Šß9ŠÌ%SÄq¨ê'¶Ô, ”üM&~ ½qðÃY>Ã^Ý©¸ë¹o˜€:üu.À{ÿ[QôÊf¦)[ü*yì#.x| ÏÕIÈ(<#€ù´NöCÛ1+ÆsŒvÂè¿O2i)†ûjµšÙö©& L¯gù¾ÿ=cÆ@Šòòrv œÙüR™Äï¬pv¼13̧ú¥âlh’ây=mê)>K¿sÙ±~¤˜•¥ÅžÏ/âõ×_¿ªHg­^AAÙ¹s'Ól¬ýÕ“ØôÅ3Ì F˜L&—dHÂÌ”ÐSïÌ)&ÿJA!!!.ȵ/È‚ñÓr`êg¸¼=ƒL&CIºoÛuú£Òßñc,_À‘Ê fÃñ*;ƒÏ;HÙT»áHMî’Q‡=ºþ<ðöî噄ÐÐP\¾|™}¦Ò?0ˆfbÍžBéš'pM¨!J¤¾nGZ)¿þéÇ6UŠhñRŒë_s“öo€á[nÇ‘ÿy›ùðKºw÷;“ q¦sØ5%º_5¢W 4<Ù[ºñëCõ⿚¾…×Üæ ¡€t3PoþÁ  õ„’ø`¼Á`àššš¸¤¤$–·¸6U¹œ‰¿;®ŽY*E—{}R5 ÛQÂK~¦¿yÓ"Ü5ÑŸi®†ø;“ âØ!¡Z爆½µuÜÉ08û‰=Äß&NFñ;GqcfŒÇì(9fìCÇA_\Äý¢ñ¨T*üâò70_ú†õ­ÎÛ„kÎ`k¶?:3›ÿC߀ài™xñùoÑy¸˜% *ze3֮噅aWÌ,ÀÚñë³­•6œ&çŒV´>J€ƒý_¡P`Ø9>+ᑎq,éOsH ÙÑÁ˜€+cç"²£ƒ1 À@" €'þÒ\ˆ?Sý;]Û*a2™ÐÚ>–9ôÝô@=–L(FÕ)9ªNÉqøH<ªNÉ1}j 8‡žµ¶EQ‘õõõW@ˆÔ5 Ù´iÚÛÛ1!7 .Äû]ÿÃÖgçÎX¸p! Ý3™LX¾|9k+T)¼ªŸFPç?êèì** ì:=ÔFJ%OvèÁ ..ûãcp¤²‚åý§) ÷£÷á¿àNâhÇ;Ì“Ÿ&’ÎdˆO9ÄþÓTÀœSÏÊœŽî€ŠãPnà™C—mh(îYÜ ÂMDQ‘ž9­Fvt@¥R!ª£¯#þ·Y.ögJ¥÷…Ý8*M ¾{b«µàü¾œÍ34c ½j`„¹þéºÖÖÖ²œ*ß]±4ÀÎiµZ-Ëøßüµg FšXäüà‰Àæ ø@_†ðÎÑ(,,d„\¨±¤ïÄSzàŸ#5ûÿ…TÀ.'TAœ?Þ¥`Èõ‚·bCW“WÿZŒçíóõZA p*‚b½‚LÀ¸ó{û˜šN¨™ L[ZZ³ÿž9ŒÌ%S`é1Ò$ø³¹Û¡>À3¥=Vtõb¢Ÿ˜ŠøÛ‡\N\,YäÏÔú鱋 Ôjc…„Õýr6êëëQ#âÇñ³ 0›§˜ðåå›ÐÒÒ“É„3çƒãFw2óȦM›¸BÕûÝ¥ü; ¡~/¥?PŽ?ÞYÈÖ…Vås^k`À€1`οÓw ¬ð'¬ÿB¦i­€âª!Jö]X(.ü÷¼ƒcÁ‰ØÐÜâ²SÊ *ÔZÛÇâBð(3öº\³¥ ‰ÿÕhDÿÞÁãBþ»äÿÀõO¥€Ýý6S",ŠC«þ…ŸGk'¬Ý•Äu.LÁyÿ Ë{jðÚÕþ„¿¹»¸/0 HSBéÕݹp®ò'Ô P Ï/¬è\N•zsÓÊF›ÙKëëë½–ö–Øù7áx"Ö¾Ýr^Cç>(¥~Omkkká\n–J¨´ s9``@‹EÕ´l/enßR ò¶+.ÄE¸‡/¤/$4µï›¡©¬ …²>Þ MÅ=—9ØŸé;HÈ[OºÅ|‘ŸÀžw P(ð›yãÀ‘S(5öàãOíÕ4>[ÈÄ@`ºW¾oÀÅc]LSß ¡ðûöò >TÂïBiß] µ¦ë/¬ )m(ÅÞ:³ÛRľîßW¬¯¡oë$ûWø.=áçwöøéàu1©d²oß¾»Š€ÿ÷@Õx-Õk2™~Îÿo-ñ#g­}W½n³eAD4R {£ Ÿ›ºÑzú.¥R)fÍšOL'ø©ó¿–ðAJ!'VF4ê(<õq5çî]?IžÚÝü¿v-|Ý¿ÿÀ¹Œ²èµ–Qˆø!Øío×sOSü±·Î|ÝÆ`N€ÎŽv”øÏš5Ëk 'P*•ä‹£È F±~ŸžŸè5“ s{Ò“Nz¿›ø/ÉÃü¯_-¡5sæLDDD`Ë–-,ùÒPû !î<µ…àÉQ¦¹¹™Ð*sW ³eAä±¹Ï}8?ãcròDBèç-ñ#úߨ-ñ»ª,`9±22å—ÑШ£ 9`Z¡­3äççúG³jÀîGgaef222Ø=×sþ×&ÍwKü'Íÿ—ÏÍ\ÍþOçÍP1¸¯Æcɹä±äÜÙú(•J’+#_,å€7<í_w0”ýúSÁÝZû‚»(‰˨N‡²ÊôýÞ2ªÓc«Ÿ ³eA„þº)á‹C+»nkÈ€ªª*ìÚµ‹e*’6”BÕ^‚ªž´€;x{ºGmrLÓÜ€ C¹«=ŠBaa!G‘4šTxæÎNØ=d•º¸özBSSGöòæ“o'6ÞNþ7Ðy K!ÇÅÅA«Õ¢æ“­vúxdÎ,^¼_ý5Ö®]Kl¼Ýké…„„l»Ý<ÚëÚ n×®]¿777“eY™Ø¿¿o/zhgË‚ÈÏÿŒQƒ¾;Ê\ ™žw¼›ú IDATH%¢á"ø%Ž„ ðƈÒq“ÇâÕžn$ DË©ƒ®…•çÏŸG£œwzÊÔòé^é»ñR{g\nþŒ ¨T*ÄÅÅá¡›G;߯îlþ¿yàAì¾a›¿/sÿ)àíýøw”ž&Í'†mÀÿnÐÜÜLÒ³—cË_øÜ†"ê§>®æÞìÒÑÑÁ=é°6'í}p¾&„Ù óÈS¯žFVb=„ÐÚµk}z?Ï=‘JBBBˆ6Ø }§ ÷wBlÆ F‘'B=î_gÈÏÏ'ûöíò% W;<ž8<÷ìóçM ³eA ºðÜ<©!G^^#ªƒ%îãÍ£qZv+W®ÄÊ•+1Þ<ãÍ£™_ý|­@8ïÏÍ]•ü¿úºfc7¾»à’±ÿš빩©‰«úàI¬\¹:ŽÔ%V§OÆêôÉCŽ1V*•¤ïTV§Oà»*cÛ¶mßZÒÕé“ÑsÄ5%äÕÂÊiöÁoúCWx¢%~ä½6È׋Šm÷ÞêpËÌpÇ þÉ£˜šŒuo>£ÑˆíÛ·#\~Y™Z¯}-_¾œÙôD#Å0”7 zè7n܈üü|–ÞùÓO?…$9uäêp‘ðPdjÕ>!Š€©=Ó~ÑŽ}VdjÕøcÍeNx'8°ñv"axöÊóðKxµ§Åúrxb(£F¿¿=k3”7`Å›4Ê'`åÊ•˜®h„6$Øm{€±/))À#£½&^Ò2É3 oÌÍ'[Ñøåfè;exµ§{P¦ç§‚0lׄN…“æÆ“Ÿž´¦Ç¿>ýôSÈ}Ÿ"ÝW5ŸbW¸† #ø³eAdѤqnµ9±22[Dðý~DäœEQu _%˜Krbe„ù ‚Z]+RðÆ<‘JNôñ‘ ß]AlÆŒvØm8\aÁ´)Këî ¢%~ä›ïâUÓYòŸ¡BN¬Œ¬²^ÁQC9BBBÈ? Ää(¼™¤R©ÞØóðÈÈÈÀ!‘kVQ!8óÓ²ón¿›L&ô%‰qZv§eç¯@ç=[DÖ®]KF,¸'í}¸e&âšû° k×®%ÎZòk¬ÅêôÉX·nªªª P(°¹ô8â_âãq}U¥PxZ2†µ¿0! óîó)ž?//k8WŒî’nl.=ŽEoì¹êXÌh‰¡õÓ¹‘ÄÕÛµ„üü|²k×.¦BóU8nú äææ¢È`Å+ÛŒxæ™gP]]íumv¤‰EP13õToåyt«Ä“ÏìGZZj>ÙŠ£†r¼r°Ô+"ȉ•afG}§ ´Ð“§6ƒÛ¶m×7ª±ãÉžïÇg•vt—Ù² 2iŽïjüÝÎB^^ X_Ž{ŸØ…Ç"ä^ÇêãjN£ŽÂÓóIN¬ŒZ®àD7Ÿéíåõ{0[D„êYw}P"iÁáâ¡`o´á›5àè—g]îq†ìiȉ•‘)b?Ü}°™iT*Ôj5†}ô 2µjæÄÔsp é9¸„8÷Gs ¨T*Èår¬ÛÅ'Ñ)))ÁŠ7 (Ö—{ÿwD8úåYÜhéÄÑ/Ï"S«¾îL@PºÅ-žˆžBöq͈žò³Jýôü ¯ù‚ÇBBBÈÎ;QSEpñÈŸq%þ9±22kÖ,¼ð ȉ•‘Ï*“`¨° ZâGjGxîJ0`UÔM8qî ,Ü“¢R0ï>˜þ<¸6m0éß“0GÛÕ%«åRy®•çº!)Ɖ>+¶oÇ$?ïÄ”jÏn¼k1ÞxûJJJ+#¾ª±é½%£q_ò0tÿÓ„#ì¨18±mjjâfŒ°#'VFfŒ°£¤¤kÖ¬Ax—Å«€ÚùGÝH©±ãn?1öíÛ‡}ûö!MÄ¡ªª }IbLï×èMת] ÎfNçµ|SS'•JqH$ÁÒ¥K ýQÖO¯ŠÞ‘Âh4B¯×û¬Íð\t wMô‡Å«1Mò ¶a¾<ǧŸžŸH„í/^ ¹\£ÑˆéŠFŸÚ_¸è´ å Hò‡\.G÷¡‰R©$í›þË'[v´Ä,ýuÞøc¢%~ÄPa¾sðêiLŠÕétWmÃÖh4DÕ^Eý.$%%!??Ÿ,_¾Ü+òS*•ä½Õ7@ú}ZZZ`79kFVV¶oßé÷îM(t=^+=?9ÉÕÖÖ¢½½–¨t\ ÑÛ[gæ>þä$wÔPŽVMwÛ%4nxöæA¾23lÐçN ŸaɨAðË¿„²øAç›hæ mǯî±âè—g‘ Á[~AƒŽÿÔÇÕ53iý¡ïîEéÙ.T÷X¡ïî…;â¯T*IHHɉ•‘L­ÅúrTžë†ìh¤v;BD"<õq5W¬/Ǻû]µ'Åúr:Ü: ¿ú¨œ©iŽv“É„­'ºð„Ÿ>ã¡Ã=ÌDP¬/gk.dÔjþ÷;ã,¨|{%Y½ Y™ZÖÎÝ\*Ïuc6ló_ñ¦Ác›kcÓø¤>!!!$d¼?¹ñ%‰žBVj£‘þ‹6´Vv#zOL}USçÍ »êówG|æÏÅoök!‘WétÐëõHHâþó‹óæ)DʆòØmL›Sy®¿N®‚&EŠÄ &ˆx©Ž2 Bx¶r77iì¯PÝcÅû§>ƒh¤«¢nBºD„¡Hÿr±#ZŸ- bêsO´³dŸm·¢5HŠä±…˜ô2œè³ºhѨù±  €ÌyéTžëÆÅC!77ñ™‡g/ðiþó`¢d4ʬçÑýOþ™eö*//gEDªªª©U{=øÝ‡^$†òôYÐyE€$\ªª*ü&ÿ)œzP‡€©©ƒªƒóóóɸé3Â+ýáG Ï^€Y³f ²À“O>‰åË—C§Ó‘‡"Â0ºðŸCÊD˜+#J¥’Є1±gdd jÃ[‘•‰"ƒ{kë8“É„––”””`ûöí¨ùô¤©Ý¯_æTŽÊQ|„S*•²‚_ý5ŒF£ƒ‡»2¤ å Ø[g檪ª””„]»v1/tCyƒW)rÒ9Ñ_¾Œp³†]+óóGSiKbO©Uãåõ{PUU…qÓgŒ29fÍšå“»·ÎÌí­3sú~éXA né0·’SS·ûÑY¸ÙmXñ¦;ÊzÑb³ãæ.TžëFu%]=xãÐá—1)s ´ýJ¥RVW¯×comG…L­_Ñã¦urY™Zdej±£¿Þ‚\.Gmm-ÊËËQ^Îïªú/*Ö£¨Xç6¿…›Ö}èö djÕ«Æ:Ì_9ÍÍÍXñ¦Á'-ÀPµ}¾y²‰³%5#üF ’‹Â9£­•ÝXûxwvO×qº—kýÆ·´ÜBØ´~ÌçCM ^ø&“‰OãªúK@§Ì›Gjª¤Òl„R© Iž§+)Få¹nlÿ¬öF¦ü2&“ &“ ã¦Ï@£| T÷XÝ~!<[¹›»3þ×H  ò\7Ê{¾Â¢Ó_aÍš5>?û}6öéÿÿjŽ´Ý‰>+Ìf3öÖ™¹ê++ÆVy®{ëÌ\SS§ï”a’ŸÄ­)­¤¤õõõ«ÆÂÞhCÍ'[Y[á}Î8lþ¼ „VUm¿|«¬W0QÂû¿T÷XñÈcqÎa”îÆî×ø0booä™àÖ ©Ûq=Á×­Åè­HŸ®‰ðÙɘ5kökàÆ›G3ÆÁ¼öÚkX²áOž•ßÿ. šÉ Õ iÄÐöíÛÑÒÒm)ršìKèL|­À㢠‘€V«å36ÅÊÈ{÷ÎAüK…Ò·“oRKR†‚ª`_+¾äÒ¾}Ó‘Í¥Çñ\ŸįKŠö‹ Ø×yüê£|F6ÞNŠõå0É3˜D•––†a§ÿL­Ú#â¶Ýk’âüùó8õ t‚\.GUUVf†yT!¼{°m${i¿~iii¸%¬‹6ëví¨]—þNë)q¬ÈÊ„±ìK—õܳ HšXäðlÎqátLšh^ÞrÐa.OÏO$”$&a&H¥RI´Áf·Òtʼy$êŸûQÝcÅï_ÝŠçŸû:¯(`o¹ˆ¨I“Ñ3fŒ×ÜÚOÏO$”€C" ËDYñÝ·×ïá™ !ÁõÂ=LcÉÝI@ô½¿øÏóJ¥¸ÒÜŒ±ˆÕ¥‹ ÁÏAö´LÇç>^í–6ÞN¨OÆs›ù@;ÊzÎÏîGW_öï Ÿœt™¿X5–­·>„óïèèàrbedõÝ‘Øüv³ÏáH!ãýIxr Vj£Q°ý lIÍè*È gKjÆÙ=ž×DH\’üÙõ]Ÿ^òi|NGÜ¿›ÃÃpó#ë<öA³RvUT°¼øÿþüâæ’„$ÎíþÚÿ鞤BC{{;ZËøÎÉcOû7'VF¨9 ]ÂËh¥V;NØ>¯ñž›>ÒOLžáÀˆ8†w=îEê${¢Ïнuf— B~ßd9WX˜_ ÅTÀ:xð [ü_PP@(##œÇã‰HM?B }N¬ŒTžëÆPÃXé¼Ã»,HˆÊsÝh ’"¼Ë‚Ö ©ËóO"~F˨N¼p׳طoúÆu⊱½U6è;:˜.ÇÌðLÌš5 ûöíÃ×­Å mÎíq5iíÚµ‹ìÛ·ðú’Z:lÁæ·;½&2Ê›Fzªz±·ÎÌét:’––†––VíS*•"ÍÜŽkèçî"}¡´Ô¤¾?ëÞ:3'_û7äÄÊÈÞ&×vJ¥’ëËYÊH™L•J½^O:::8~â def^+†ƒ _û7.'VFFÉüpá¢?¤R)b“Z¡RM@HH§Oq§ò!8—HRR.\ˆ5kÖôÂr¯ÒÇMë>äl¼l»H+(…J¥ÂòåË1îÒ×ÀÍ7xEžOÏO$¯_ÂèÑR:¹páBÔ××Ãh4b˜¢±Ÿp³xŠ VF“’’PUU™Œ/Yk2™¥‘ Ksö®ûСÝQC9 Qcþ¼ „ Ê<( Z¢•r+Ó'áµÒ(>Òæ–¡›‹†FDD &&…ýÒPSS·· Ø[WíÐN£Ñ Z-JË¿Ð/±ø°`¢¿£êËE¡ÂÓâõÊ7 °õX1nú ä Æ?sð;Ä7ý€›ÖÕû´ùsbeÄÞÈ«þµþø¼ÿYݽ§wJÖÌ›€íŸÕ"¢_•ºô×q ¦wg Ì›\.ÇÊ•+±qãF)®©MYÍ—Î,ÖcÝ®zkLý¼ÁÓóÙÞz~"qž?Õ0øJ¥’,^¼Ãê·C…›ßn¼Q?„Œ÷'ßÍ{~¿¦?‹.³–o€ð-HH“âœÑ;ñø=˜77ŒtèB™Ý‚ºÓÝCBxën¹+M&$%%±Œ{F£› 9b;B8ñT·ý™ ÞÒ›¡™&…¡Â‚½@_í§’æaB*g {d¶,ˆt¬ØN“µ£ÍÞxS~íuþöFÞïùŒÿÿk¼fÀ—gÆq¸B-W„ï.ˆm·¢ºÁŽ®p):ú+Ü­]»–lÚ´‰õy¢ÏŠû&Ë ö‚7PIú !èŒqØ‹/•ÉdB|ӈǀD+Š•‘ï.ˆ°fÍäåå¹ä³X_}’ƒDKüˆ½ÑÆ›ÎuûœËB˜³5HŠÕwG`ÞÆ‡Èl»Ÿ;µoÓ£lù_·­@ª8 š”“œ ó1¾n-Æ,ÌâXn€snæñΣ¿hR$L†lœÄ¼?Õc†r„Gâ àÞ~ $¥£ŸryIa$2r­˜·ñÂT›*• Z­£ÝÓÓà± SI:·ß[gæžú¸šsFÂ9±2rÒÞ‡Ì}^Û{ƒ›Ö}ȽÖ_g>)) z½žÿ¦¦&î©«¹÷Vß0h………-UºpáBìܹ‹6;¨äD5çÏŸgÚ‡ýû÷Ãh4Âd2ÎÍ,Úü-þ°ëcà§©åögxÁP»>NGÚ/W²’«U[·@ÚPŠùó&ê'àŽø;K/åååhiiAã—›u`ŒŠŠBɶmèkèøé3ð /°""e~þ¸RÙã6-©óø6Ó9¦ú§ãoÚ´ ¿u«×¶B š&j"ÜÁTÏÔŠÚ>…Èç¦urƒí¥RIVf†ad_teß¾}ÈQY0]ÑèÖ™õ©«Ýö©V«™# Z­Æòå˱|ùr#O@ç¿ô×|µ¸×ïÑà¦ur¹ö ª ]9ÍŽ––\‰Y Èyø%Ÿüg <9¥Æ¬ÎÎîéà‚Ò-H[#ÅÙ=Ü7O6qƒ€Wùwè‚h¤q8† }‰ëþçsÉüg7Àl6Ãd2Áh4Âh42æËñx©Ôb± ¹¹ß]áÅ|³â“O8OÄßÞhcx±ºÇ iC)rT¤™y‡Ü½ufãè—gá)$:'VF„ªÞ- pâÜCÊç0Œã2v`ÏI Ve‚‚âOáp…4  ºÇŠä±«ÆBèï0þ‰>+»æiÂ1ÑH1D#Ŭ`ÀŸ«ŽŽΗdV‰ýu*Ïu#õ6ß|€Çl»á]ÜóT»¼;~ ãù©Ô>Þ<š•©¼ ÇlUìw¡€38«ø³4°9‰ù÷^@Ë^53)8ø¸{˜vK§Ó‘üü|RUU½^•J…ÜÜ\fÂÝõé%N¨û©àò2¨ô€¥ÝT«Õ>g!¶¯­­E\\œOí󿆑² Þöï®}Ç¥O}VÉihÕ²’’’!eRfajDZT†ªîe2¦OŸîÓø:ŽH¿o@cˆœ­ÛÚµkILL –/_Î f?¥*zÿäÑ(>Ò†¤¤$(B~À<ö‘OãOW4ÂPÞ€¢D×:Š…ÄyrdÔh4¤ýr%¢Æf2óÇ /¼ÀŠÊ´_®ôI’Óétä÷7G±¾¯î9xýoP¬/ÇÈ_®ö8¾„¦ŒH?1ùíœxMƒµÍÔª‘»a»,Œ8°ñvòòú=ƒ:áP»¡ÂÊ %r_,PØzüŒÇyP3ÐûµR\<ô»24&yóÌ@çïNõïÍŒf©j€ŒF#¤ ¥Ì¦êiþ7>£$aÇø`uüg”9Ü='„øBü©‹ž¿–½ÑH\v“’yæÙWàìðçë !åLH›¾v¸îi½¢%~$1@ÂÖEø‚0$ÝÞÔÿ•纑“ƒSÖ , TãýS¼6ÀWI8ZâGZƒ¤´\a¦_žÅyöFN)G!¾‰¯²é«ZN¬Œ$Ì»ï¾û., fŒ°Ã•îS6Òh‰Y2g*lUÌðܳ È`¸‹Jÿ”à›>z½yyyصk»,H ¸<­e"ôè§DþëÖbLתáw&˜IþÏ p› 0'.–¬¾;3Jů“¿ÃÇoŒÀü{/@ßÑÉTùžö"õ£ëF‹1Y¢ÒjG8ko~ ¸hššš8šÌD&“¡­­ /O\íéܾ­­ ‘‘‘¨­­´=%þ?˜ûÐAZ£² úûè ² ¶¶[ïNBOU¯ÏÁJ¥’,_¾jµO>ù$JJJ‘‘áó3äç瓇n ­V‹Y³f É P§ÓµZ µZ ‹Å‹Å‚éÓ§³LnƒµÏU M­fauPóé'øñ«/ ŽÈ2§*ñ§÷–Uôᨡ4©†76”ãÞkˆ†òhÔQ^‰¯Á`à†%0³Ex—%%%P©ThkkáFc°PÀÙ² BÇßþY-sà»óñ¿#S«Æžï4 †Úc)‘jî³qtþ¾ÀSWs¯¼õÌagÎCJ()öšGà‹j’©UóÌFmg08*aÐè€û—ÝæqìWÞú^yëÄŸ>‹¡¼Á! §yPé^8ÿoîñ…èõzìÚµ ëg‰†sÅØ[gæ>7wqƒ1Qr’‹é¬Ã5_‰?mðRÜŒvÌ¿ç4¸&|õuß­VËÌp‹/†s8 '°(g"!‰s(QlQÎdþÎ@¥z{£1t4)î#¼ù®PMÁ$1‡…j<[¹›;kíã|%þ”qŠŒŒdÄ¿££ƒ£ïÜ—wOÏ%þ”™ñÕ‰Žj‹ššš¸ŽŽnxöŸS‘ŸµöqBâô›8¡êÿÆ»3³õÁƒÙ=Þ"(Qo¯[‹a2™p·Ÿ~g‚YP!x ¤*~!ñß[[Ç555qÛ¶móŠ¿F#j>Ù m°™ù>Õ%K£æ“­x÷ÝwðL€÷Õð\€Ù² ²:}²CXȤÇv¢}Óù˹:}28ÞΉͥǽ޿ëÓK\ÝénÎr¡³\à7º.„WaŽÞ‹ç6¿…“ö>”UX|J‹ØÔÔÄí}þAìÛ·2™ ÄÞçtÞtƒßgaÄtE£Ï1Ô………ܾ}û0‘;É^yy9¿ÜìQ@Óôþ!o>ÉÒHXâz]ßÁ{›Øx»×( ¥RIV¦Obk@çC5¾€%*ÝE=YC”,Í`@íU~Q~8xð S«%pM¸RÙã• ¨î±â¤½¯¼õ¼*pÇaÇá•·þêÞ.é‰ È‰•MŠYš@×I ÿä9#]W¥RIì|õ1©TÊ®erTžëöúì’ÔDdO p ÞB ᨭ è®=eRÜ1+{ëÌ]—b}¹Ë=tžÚ`3ŠõåÐwÊ •J™ªX_îÓÙ¡9êW¬X­V‹_=yó7X3ÜøŒ’|ó$¿ç„Ä~(ÄŸMƒZC”¨!J$ùûD¸(P'* F£Gõ)“ÞƒsãÙo'ŒŒdŒÀ¯bc½¶ûÜÜŵöqŸ›»¸§s#IN¬Œ<µ»™s–þ½eCø,€%ç’ÝåH—ˆ0”tÀBÍNss3Ã?Âú žÚR\£T*™ Âl6Øñ‡À|¼ó!"5”l€óçM ËüS\®û"¼¸ƒææf¦h ’ºÌŸúÙœ–Çxóh¨T*öÛéÉ<yÌV…™á™ˆø!ãÍ£ÑÞÞî1sø£ÄŸšòòò\2¦ jÙöÖ™9™LÆü)D#ÅÐwÊ®K=‡•J% Ö† "?ÆÅ í*ƒMD©Tê©(lOíªƒI´}í‚Î+ Ö>ÛnEí2¨ ™¾Ü÷VßêÕMá¡›G#S«Æ+oýÃí3Põ¸Îݰ~_=Ï…H¸ò\7ºÂ#ØúQ¯T¡-U˜¾’Ž[d°:dþ£íg(Gàþ|©9GÐqX5G åøgáK¨ÎaGÖÒYÈÊÒbþÂÙøÂ>Fwß}—iK„*Ô¤¤$lÙ²3gÎti+ìCl†&EŠt;ôA³0¾vx€çö1[DjGLù`£l ùí—¶w÷þÒÌíÐw÷2ÉG8{ËEhýYŸ4Ò‚þgëÜ¿Wí6‡ b4ž˜ÎËyü§ç'’u÷kqèpSµ;GbX,ì¼u,$©‰.÷ÌagD ºOéûæAîCáüiú`áÞ§Ï¥QG±HoÈ„ª29;žÎ¾R©$ ÷ÆÜ—ï J· «Ôw3šR©$Y½(*ñg{ÿ–™~˜¢†—þbõŠ{€|a”ÉYF<ê>nú ¯’¨N§#+W®D~~¾Ës,^¼Ø%œVøn„ vº)íá¾ñ´†¬Šº o÷§ãŒÌÂ_»m0^>â0®ð¹ÓÌí8$’8Ô¾co!Îó§û’Ÿ¯ü`cß)д´ÎÑEÖ®]Kœ×é™gžÁ“O>éu(•J’9•ÇùÅGÚÖófÝ/ØgêLûrž¿V«…ÉdrˆB2èü©³.ÕÔ Cûf†gâëÖbFô…™ÿ„¥³Ý=§Š©Þ*™Rü ÀÁüG0gÚᮡ‚x‰{‚ÈÏ%ÿðˆá½ˆ»À¹Ýăµ§Dø`Î.lß×Ðçð²¨ý†fÑrÇ9;šÇÚVf†¹ AtžàH<|Ylg”pþô>Õ¯°OwµÜÏõÜÝ!`€çº‹Šô €3ܬû„QB A¥R9ä @cRgççjœ÷ÏŒvhRx¯jw=iïÃ…‹®N.t_ѾºØ[.²Ïîìž–+ü8&À(ñà@üÇrÇ|­Ì M$äL|…@Ñh•°JÌÜâ®çÚ”˜Fü“8 ÆÄR‚â܇§s”Þ¿·K!„ß´~3Ðày[,ŒÞ‹‰)R|õuŸOçPx†;€g[:ÕЬkB ¡„î˜á<Lá¾r^úìË"¦±v[°$@4ðÐ…ìwwë莡÷:ãwí´Áf>¼Cà+ö³vS IDAT?ØÚ»{Îõ3Ï<ƒ’’”——;øpedd ¤¤Ä¥²¬pÎ7ë~)5ž}n ã¡óØž7`G ñ—ó~pÞÇBÇ\êÙ/¬03<“%æ\«ºc„‚…ð:§s$„R©$³fÍÂÅCaxö\øè‡ó———Ç~£Ïæi=† .D|Æ»WßÁáOm?bx/“þ‡ÒÞ¹¯¡Üï®ÝPÛ:÷q5ãz:TC‘ž|¹Ï›$pµí)äÄʈ/ã2™ã=žÌk9ÿÁÚ ¶öÔëŸuw‘Þ¯§>ݵ§Ì…E›¿õÖOcy÷júp×—åüuî¾î•¡ôéé·¡ž«9Ë«¢nrÐ eý<¥ýõÄP&œ¦û}ãr€Oóÿ©gÈ[CiK}¬¨€â,йëËSšyçÀîÊž5?<=ÿÕ®‹7¸æ“ µF¸'µÊàÚ^P(n_ Ûð?µ¾{N\,©±œ=…B¾Ñð;ïÞéÆÝ®'$ä­'i©¼ôöÞ£z"çy-Ú°h3³ /.réÃyýOœ@ÊúlØ[[Ç Çöe|Oàmüë†4uÍ2hÚÚÚа竞à :~. >ÿ³¼¿ŸžžŸHœµ*ŽœG64„ >:rÉPŠñëã»\žýñÄ D˜æÖžs¾w0øWâLçˆ%á\þ]p9=»î<½Ö3fŒK&SúÛõÜË‹6l I‡*B®ÛùõZgpц äOúÃÒt±|-Î#l/l£ÑhˆN§s! Îq”ÎãOôóÅ^I©øÿ ,Ú°,ڰ᪟uц ä•ïú܇jŒÙøgäçcÙ²e÷ÌŸ7PFÁÛ>ȉ‹%ë7}ëðþ„0Ño LÊñ—LZŠ¿æÛ]îóuÒý3;Á½·'˜0tïù6WîBñSOÂÛúét:²1/Å/%A§Ó±:‹6l ±Æ÷td+bï±ûéÞߘÜ)ñ·‹“1;aIK!Öø–ŠÊñÙÆHÈ[OmØ@æüf½ÏÏ’·žÄßÃÍÃ#Æ¿ž·žƒÁÀ9ÿ³§>嚺æ@£Ñ«-ðõsBtü\û×<:r9°ñvâ?áŽèŠ:?ž8LKIM…Ká±ä\òXr®®s¾×¹ àŠC…猶ù9ð'ÕÈËpÓùùJüñÿPalàxŸÏ‹ø÷ŒÃìýôϘ1ì{Ϙ1nµ×òÖ“’mÛðдá__ïâÀêkyòÁÀ#@H¯a»FËzÊåòA‘¯s{ƒÁÀåææNG¢¢¢\0'.–Lô³ œ·žìxhkŸK$ "<²z„÷] üo@>È›O–ŠÊ±TTŽ?äÍ÷y¾”X$ä­'íoo@ÛŸW ýí  Œ@BÞz÷è IO @ŽÊ…Bɤ¥h{o{O|UcÌP‹DX0×:¨$.š¸¹·EºØRsâb %x´ß¾Ñ˜˜æ¾Ñ%óK2i)ÊVýEÆ@T¿ÅÛôÛÚÚàw>}£;1in¼W DBÞz½ãyôv ô.-†Ê$ Ä«=ÝHã1Ïe¤é>>t¸ííí¸2v.mØ@ŒÇì8ZÍç75”7à•ï’9¿YOhÚ†îcЍÏ$¥9ôÿÐÍ£‘–*‚ñ˜Á“EðKNóùYŽVÇãÇÏžq‰ê*#ï $ä­'5»çÎW=ÁJýJúŒ÷ŒNú# Nà_Ùµ–œèšx[_î¡?—|þɼô(Gõ«³Ê;Kˆ§ç'’Ï&ç‘™÷0ÏÏ&ç9Ý'Áòæ“§ç'©2-%ÅU6LKá=ßsâb‰]œŒ§^=¬Äz|ü†³摜¸X"¼×“&€î#zÎè=”ð®¯>Éý’·½å"´Z-V«ðDB(ɉ‹%¥gÎ`’¸÷M²°ùxjŸ·žtéß…áè;W5~HH)Ó‹SC}ßÃæŒEϘ1ì/²£Í!!ìF…ôŒþ›3öªæå œ zÚÿcïÛ㢬òÿßÏŠ#rQÄ1ÔdPfQЊѶp-EŠÖõ:»±ZZnµdév5C¿]´ls©¨Ì¶µ&¬µè&”:23(£@)^†0Q‘›8"—9¿?Ïá™™gnhÛîﵟ×ËÎó<ŸçœçœÏù|>çs>—$ "##qû3¡ ua(äææOÒy{¢ €L&#Š$ VO™ŒÕS&ÛÜóÄôAñØà×××#((o§ BD„c¨Óº¿ßËâ(kÞßö-QXó  OÏ#µV‚÷ªø@j*íÏ»S`®'Sôf÷m;1Yôÿ®€šŽU©iP$I0`b8ü“&bÍ›O¢dk)».ƒ3I²a0Õ£¡¡Š$ ”òæœÖÐЀŸ…0˜êqÀè<¯]ØÏ?‰uëÖá!6÷j­U=½ŒQQ¡þÊ@þl»ãH/::: H’àûò‹X=e2Š_ë#~ª,ø68ÑÉd$«úE<²,«§L†±ÒŠE*8S~ìÇ૊ÑäGŠ$‰5FŒq•ëM¸4f.„ãð±ýu‰k //CúÊHÑhpiÌ\lyë3”ëMHôõAîÒ@L´ 9mb¬´âÙÃ1(×›ðìá›vÒWÎ@È"ï[ìú–½¥Ä¾}!REÞÙîϨծãb³Ö“ðøgîÉ?áb³Ö“±ãçŸÞ#h¨çó¸³y ³cç‘I>fÇÎ#Â\ùöëïóÚ]ÜÚ‰™ìYWïü|×d¯]Ë~Óˆº³¥JÀÓóãÈôiR<öÀPH³m3«ë{E•€Çà2ŸžGöæ“c?Ü›¨“/AÈ"n¼c Êj¢PüNÕg"^?xˆ=k/ü©À¥ág¬‹›@}}ðçIWØŽ?Ñ×ï({®iãä)Èd2Bq_¸™¯iPk%x7S†ÑÞõý¡¸o’Å)§ò#Y)w(\öTÖ|2;vÙøÜÝdþ<[ ý6ú÷Ó¿ü)))¨>é:€ïw-šÄó£¡I>8HT©ð§¦2¡OŸé¹9Í•½6Q×{òî!ÿ8ÊûeÐMÝtTWWc¤ZÒÒR,ܰh4b49 €L&#!i+a¬´bóƒXð¶ÅæÞÏ!· øîñN°ßp¸›áÇf­'—ÆÌÅÛ)ƒ°Lwõõõ6 vv=Æ]Ù_É î÷s°ùÀAdþ©Oüƒgö) þÉ-ðJø ·R©$WFÆŒà3̤C¯Oš;ž¸;×öfçtç]ëIë+Ëûe~;~.Q$IPfèÆ–#I„>Û^-…±ÒŠŸ…è¬<‚ Ë÷á(6ç¼.MÚJyØü™êQQ3~“–"$m%I-{柜*€»ã$‰KðØ“…¸×÷v>÷+¥ºûè1.VÂ!Ñ×Sü|+áŒKcæ®ø.BGGBÒVbÞD™Ñû ßaUå ¼£àßExe =áÎ+q)B¦Bÿ0£ßqÕF+­N• tŒC©pv ŽHfâÓ—¿¨RÓðšo5žžgc¾4 Ü*ÃDÑñ?¯€RÁÚ§ãO•«Ýæ>gµé“>ÁwùpWÍð¿xЊŽÿ«//ƒ*5 é+mË9Óc™-{K‰³ö·ì-µ¡_{:ž‡ŠÑ¸;ú¯Õ®ãz.¼†ðøg U¨Þƒ‚— ö7*Ôj×q×Óƒ ÿ›%c’Oß+ï¼k=‰ÓíûҸ‡z {Ö™pç]ëÉcO¢µÄŠÖ+£_¡7=p5dñêNþ©{†cÆÔ”l¹‚جõäñ‘óÈéûø 7l ´mkú4~î«zzQ8! Š$ æÄD3~ñhê%Èùj,&E$àD¼3ßx æ¼’h/È#Ï7¢ª§„߀W~ÆŸ'ñJúŸ']A¢¯^iø/è1ï $¹¹¹Ä“Ü ö@#rÌf3¶mÛh?uû[°ûÿBñkMøÛ!©Se„òŸ ƒ ¥;ºñTÖ|².ny*k>ÑW[á?¡`_!PsðÙ_iñ¡1þ7:ýŽž›C0išU*LšæÇ½Î¢¹²—=“¾ÒŸ) B°_TIq%3žÿæ<Ìf3|cæʧ+|P]] EÈTÀª· ô¥[þÅ,”Ñ/Vøà#<¢gÉ!i+¡K®…úÃ.à™<E’ËWÍÀŽ?&ãˤX¸aY~µþüæÑÖÖ¡)”¶1ìÍKmÑ‹w²pÇÄ…°eo)¡g©0!3eS¥ÐZÇÛTõ2 5- 'Šž»Òßô¾ýsb0drŸÅ+ÀØñs‰‚ò`ÐÒeÌ=v¼óšä4QƶWKÑR¶Š$ b8Þ |"^E’'ü„3VZqY¿öÚ3ÝÑü“[€ÎÃüN툄K¦ó ðiti߇91ÑäλÖ•* )I>¸¯JóS³0;Q ߘ¹dý¦ïÈû fBtóG”ŽR*b¡H’0ú©àîE²O¶NFŠFƒUo€ÒßMû .-'â6ô²HÅúîjì+|˜° Y¤‚‚5Vc%/x78ˆÕS&;˜/kµë¸cŠ…ðtü)= Î/¶žô|ÔK²H…è«Ö€Ù‰J%ÀQÂÓÔŃV”líËn¦T*I^Vò²¢0Þ/ÁeûÛ^-Å–½¥dĥѠ8B0 œZ­&CoÝÝÐû´]±1¤N_ªIUh¨7 n;?. Õåjµë8úO-î²~^»‹;ÔKð€¾æJ¦Ä ™,ÁÌGnÂÌGnbë/6k= Y¤Âú§•õî¼k=é9bDÏ#|eüíÑ]2AÜ-ˆT«ûò£L“â©{†4娕Êõ®TFý- ºÆ^+­¨_¥Âò7 Xe˜ˆ§îާîŽÇŠÝGq1W{Q'_З—aŠŸ„§ãÑ>˜â'A”é]”lå»(Ó»6‚|ºÔŸü.›­-5øâåCñò¡øó¤+XìCðÏ®¬ âvÜe2yp”JJJ0p÷ן`S3àܹsxp”vÔ]d¡¹{ÏJX1!1e$6k=ÉÆA,Vø ²f?.I øÆÅ3KèÇ»~à„©í k#vùí{ÛY`üXç%Л+{qásh_7ôêêPùÞøÓSmž¿p %[;©þ·âd¢T*Éüyˆz%¯$h6Jœ®š›"Z®dÇ}Õ„ $m¥ ÿ1VZ1òjÙêë6Ò”šiì "I‚” çYèâS¥¦à…ý¤·.Ùà¿WÕ…¶¶6Ñ3dû°oßÕY¬=$Ì›Gôåe,lŠzDOzëïÚåÀ€zÂ/bï4%ÛÞy×z² ê þ$©Lš;žì¦dÎj®v0 7l ZñrE'ëc¡JMc»/wàŸÀAÏ#ôÕ}ßãBtÍŸ7TL0VZQ«]Ç566rôÌS€Vöf5€gÜTùºÜ¦CçaƒËñsà”$.J•½¾ ½>S!—+‘ªàážúãjèõe(7v`ÙñmŽqŸú„)vÆJ+›ÿ“ŠÒŸ«ñ§NtöôC…3ˆÍZOª Á‰xS:'áÐR¶º‚wCoíuZÔÃÓñ_e˜Èbñ+jÆãå|ø•OÏûˆ2½ ]AIDË•ø¼Ê6ïɤ¯œ’­¥6Š¥°ª ³ökµë¸m¯–²çifA!´µµÁd20F3vü\²;qS„†ÞÀõ~úïLˆç8dÎò±ü€óˆ W°iýh·JµšÐãš‹­ØóÂ^̽§˜­?JcµÚuÜçµ»8¡@&“*ük¬ŽÍ™LvV lll䞥Oýó<êW©`¬´¢ûÐ;l³+UÁÚ3VZ‘¢Ñ@‘$Aý*žúçy<ÿ 2úéGüýØ»‘O…ýá]IWmDá„$T\9°V½‹Zí:‡3ü*ß¾¼{ÏB*•¢ÖJðJÃÏh=sS*|°½·ÅUA%™LF°åt/"""peν õ(‹"ÀW¤Â~Øe *âËñ>8Ê•?uâÁQ>x¶¶EÔa]Üò]ÕßWŒ}ügÇãsOi?æè¼ q„¾c2™ŒXïqßKü7ÿwÊÚ÷mÎú= Ž·ÖPá]QQHZÄ+!‰*»^¥×#¬½ÝÆŠ ð4Œ‚G­Ðl” ÉÅ[Ûñ·âdRð¨Õ%ÍT«¡H’`Ï+¯0zòŸ?ε”mõJz6jÛô{rO<,j%I¬Æ–ýhllänØ@Üí¢„çЛs^rÀÿ¡°P4”Œ2³=¯¼‚ÆÆF.6k=±oŸ/xÂÌÇU‘÷#Þ9ƒÔ%ÉÌ4ÛyØ€“?~â’ÕÚÚŠ…“øs¸˜ŒlÄŸ“yó^JE,–¯š–W·à³SfVfWlBéw ¨«ÃÙý-Y¤b Á“Pª¨l{µãª8¯@KÙVÌ|à§‚lþ¼ ľØ0X,ÖY Ê^M’⾪qˆ“pX™pœå²ƒ91Ñäý?Hp_ï´½ó6Þ p9÷:¶N¶™¿·gøàöOsöžÀÔq®V»ŽËÌÌ$µ’$lM*ÀKï%ŠÒŸ³ãáQ‰=ý¸÷矞Ðpû¤P¼ð±;þ˜Œ…oòÎa®Î1¾ñŸ2}%>ýÈqînØ@ZÞã%OÄ+Ð}蜒ðG ‚4Y:³ ÀòU¼ðéGë8¥RIF\m³£uÕ>]gÿdCÃô='âX¾jôåeøô­„úòýI]’ì’†e2ñv?’ÇDa¡gåkå#/°kîjPR$IDןØ:¤ãäwy |eã cÇÏ%=ò$6ôëwy º°¡§ÇGÎ#R%؉ÉèøF6ò-FÝš‹qÕF„,RÙ´·pÃUiÄtÅI¨«tøž91ѤN¾„õ·ã=&¨qiº $‰=]Hè‡í½ûðKà¥OÆá¡¹'°½—¯mpÛ…³¨ºÒ*_ñÔÊ2™ŒÐÊÛ¶mƒT*EFFÌf3 ¶oßîr…ùúNé`L·òe¸sF Á³µ-Ñ‚V«%‡žX‡š q¢òG gNL4ž6pVû=¾ÇY »lÁÙPt½ü7¡`Ç^̾QŽê“&œêÀ\ˆÍZO(ó*·qŽ™@] b*Pd2Yž–ŠúÀ œ/ûG¸xÜ’:ím¬\¯3á£T*ɨ±s1lÈ è[Z¨R¡å==j¬„íì]1бãç’ÕùA_^†=¯¼‚´•h)Û ‹Å‚gwƾÉ^ÙøÜݤÂ`bgbBKU"0åALa‚L&#GŠ@¹OgêNø€ßļ3¥¿ËŠÝGqÞΟpîí°7ô7;v¡óí)ýÑ`Úâd<öØcÜìØyd`,‡}ûöA2• æ—DeAªJŽËÆœªj§V*xÄÆ_”á°þTØ3Øï{È?˜E«zê}xð¦ýnß•%ÄQ$IÐòžÞå7q—N6¡š|ÿ^·z bôënÞ)^­v§Ñhˆýú£}£¡ÀÀ@©V£µÄŠŸÚ>õšÿ<>rIp –=Ù%>­õQfèf¼ÄæÄD³Ú‹7ÉF Ñ×Ç¥ã³}[³}gþȲù%öt¡Êwûk¿&4 ŦM›8ªTWWcñâÅhjjâk¢Ì˜úŒ}Â|y­£S:ííí­;¡L²úž‚³õï æÄD“½gùg;‡#Ðÿ—?-ô½¥““J¥6ÇB†š566röÂßþ1 Âœ¼Œ#§:QñõE—GbàLþ8ƒÝGqíííÜM²ìÚ…ARü½å"þÞrѦ  ý1€X”û>;_´ÅW¥¦¡V’„Z+ÁÂ7+`8Ü)~â¹(B©˜µIlüõatÐd\µw]øÓÏVt:ÓÏVV±\oÂ1ÅB§´Üßö)wÆ–ý0¶ìGKÙV¤h4.w"2™Œ\¬%¨&ÓS?åüzŒÀ;æžÿ µhyOÓ_oÂ÷§‹alÙÏ|2<-n¿þ\  ÆÆFN*•B*•Úð8 ‡AWÇüï¶Í2C7n6—Äf­g =Ú~™Á±$- MôõA­$ ªÔ4æ¿ðŽÀ±Î#%à±Ø.ßéØl6èK©»}ûv˜Íf̘1Ãá{8×ÓË-_¾o‘ æxp”W©ºGþ#–ôÈö6žÅ oÀª‡ ëB46;Ö ¡qþB Ç)SùÐNjú§Ï‹á¼e ÿ‚G­0ÿÄû@z=&“Élè‡*ð¿Øl ¹ŽŽ§ аX,”‚;&ö9uyó×:¯ùVãùì»áŸ „\WíMôÀ”é+Q„aCN ª§9Ïâð R²r¹) ¦L_‰8 ¯ÅO^Š Ü÷].ÀZí:.¥"–-~¡éõòø ¸¿Gœ}¼ë&ÐS§cÀÄp”ïoÅçµ»¸ž#¼@ì9bdÞý®@8þèü‹E!Ø›%…øZ‘z5Lʛԟbí_©õŒ[öãˤH[œìÐO 6k=Y¬ðtZ*3[ö•3+€¾/õ™¹Ë!ËÚìØyì<ŸBÏ#‹èpæÈ9':€¼ýØ ˜~¶âí/+ðö—Lø@÷ øæã Xöüe¼¹'ömxÒ~úÊ.I…ß¿pÃr"^ÁG…LEHÚJ¨RÓ\îÂ}‡Ý¿#â9ØÊ;Nüñ?å.z8w@_hר[s1êÖ\v¸÷xç]±õ'Œæ±‡ÆÆFNX‡Ãw¢ÂÙ£pÇA-—"óAÒq+"xa¡H’0~c=G0®ÚÈÆ®«Ü û,4<öÔÂÅÌ÷BÆJ+SÄÖ½ Oìéàèìçª,pqq1GϦÍf3“ââbŽ*ÂgÄÀþh ò§NÔ\éFåONë؃ÿ¹¬ßŽUÝ—ÜâÙ_»0HЏ}»Õ'MãD °ÐWÿªBBøop²ó ú,kZÙï‚G­H]2È#ÇWEÈTPþð´dÙWþ‹Y†CØc¥Õ†fffº¬GÓG©‘³t nzp5NÄ+ÐyØàÕ\ëå¾Ï566r1ï1Mû¸·$POàÉä àÝ>¼÷­+BqéØÐp­!“%,mÈd‰ÓwPÜ;ïêËñ Õf÷C™‚«ñ—ÉddÅ”Iú´ýÏkwqÆ–ýðŸP‹å‹ÅÍB›ÿÍ9|2œÉñ·š<Åïõ™Š÷TÿÂ"ýHIò$q‰G»—Ù±ó˜^Y©ÁC‹ª`ÙWŽñ ¬Š©ø[ïÄ~Ñ/õ©&_/?v†Oï”ÑúcÚ IDATm¯€±Ò ©R EÈTƈ퓱[ö#9îG´¼§Ç¸j#~ì>Œ»ƒ†•õ1ŠÆž+å(×›ðöcƒ0)¬?µ}ÊýÔö)'Lœy “ŠñÇ™ÇlJà áóÚ]œ³ö¿^þ²Óöé·Ó#´òw+@Þªòõò—ñ¯¼¾¸ð g=GÐòžïXÅCÑæÄD“ ¥ËXôÀ¯߉ü·Çp¼P'_â4ƒêÓ¥þäX`03ý •©Têò<]­VFCìC@###a6›¡Ñhˆ«5(“ÉH`` ¡•7k®tã!¨¹Òí±@ŒÿTîÁ}c]ܧë×b± ½s8óø§ð½ÄY8ܧ‰íh²¡`¯ÒëÑÕ*;ð§ŸÖÞŽ¶¶6‡@ Ô·F(ì Wýé@ÑçÅ šÐhïÞïÅvc/+|›åy*pOÁ†„t¿­’$¦ï¤ Á™)Ð>u&reFâÓ3@Š¿XáƒíÆ^—Œ@&“ºcîøéNšöAÌ«ÔÞñä¡[gÁh2áËm:î+RºãxÆÓòžÞi,:] Ý: ÔAh[Y9!S£W„L…¤÷Ô(Ø}±*Q^5æ°0qÉM#¬H[š´4æg¿èð=4ÂÂÙüQ\Àùüq÷(bT¾ÐëËðÑÊ/q×ÖÛ R¥Á§w?žö9æß{Ö©3“=ý,ÛXòþ2úó”~ìûOñõ_X€‡ÒÐçE?dp++‡m_ÒZXxõ”ÉXøÆ§¬d±püwÜ{'68È* ÇŸæ†`s_X¥MX2˜¾ß¦ØJtyð¿e%‰ÅJ‹•¶g*5VÂh^XaÏYFßa÷£çÂkø<"ö @Ï…×<®^&Æàß‹då`¼´µÛe)ïþ¬?!Œº“Èo°p?ªPèi$ì˜@ h²ŸÆx¿:£‘öÎ4õ/À[ †=œÌ¾á(Æ|k€$Œƒõß'IÉUEK¸Žd2‰nou0ýgs'Ä6mÚÚÚ‰ÖÖVìÛ·Í=-³Ц¦&—%}ǼÂß®þ¬_‡Á«N€Âßt×Ê vVD¤eЩ/€}h&ô…Š}þz$´~ø[8Œ:Êû ÔX ã¹,<Ùƒˆ&o€™½¨³™Ð{XØ£]_¸d€îð…Øž{Š?îËçDÛ§ï ÿW„Leï¡‚‹¾ËÙÚ’·%E•#uþ%†÷Э³°­¬€xMïåi© „â±û¯(+Ó3À¾8­·½bÊ$¼~àÊ÷·²os6þÂúã¿}#|1Aâ ýŇZèM»å(~í$RðOŽyˇュ5ðOá5ðy³Œô¸‘Ì˾ý­Iøã»r›ùÄ•€ëA¿ƒ.ðÎMÇø³îö0ì²ÇðGô´í‡g…cõ”ÉØ|à ƒð•J¥P éÀŽ{ï„ÞÚkS6˜â ü^ü¦Á¡í‡g…Ã`ª·QèP%Áþž}ûôþëåÍ Ï¾µ}ÝwÀ5ýÓüþ§¿Þäp¾ÇwØý€öŸþÏæº3!2bx¤øº¤ÇãuØßõ'Ä ân±¹.¿AÓÏ}Ê„¼÷kú¡¸;n¼ºÆ^l½d»f(¬Üç ¸õR±¨BE70Ös§ná/©%àëP~£Åb¿å$¡Ã]šÚµi±X0sæLÃl6£ººÚæÝ¯¼5@¨ØóMË% æø&¨@¯]$uÙwëW.À6 ý1‡½0´‹ç=Íú¿°}á¹<­úGëŒT«Q¥×Ûìöí«:S¼-é.“ɈlÊe\:rƒ'ĉo ›cº&Oä­/L½ 7w]Q&ìÌÄèêC\áÓt†®´—kmßþ]öm{Jáí¤9ÿV¼þöÃSGW »ñw‡ß´[Žˆì:¯p=ißÝ<^úq7ÎðŸžG¨ßòÖg°¯OaÇê›Ùÿi*O™LF„×… €7‚ØþÄÀSüþ0W4+¼çÍ7ü»ÖÅ¥Jõ½g´¯á¦"EæÃ”gŠ‹§ãK-!Æ–ý^)eöó ¶‘ë“ý{<]Î,…‹þöD»Vù#lßþ·®3Ç<ª Èår˜L&ÑrÁÀõ-jµ'ï²pówرúfSýÒ9°¿~=຾ìð?øÿòóócÈÉÉqºNh©ÈÈH‡"Y¹¹¹$** C‡EVV–Wk-77—$''{„GÏícûiö¶¨¨(—ßp=À]q¡_²nú´oOýÑé÷º»ÿ?¸>@£ \®_Àqg/¼6jì\œ>ù‰è½ëE׿Öq韛›K´Zm¿~müÿvÐjµ×ôý¿¿ïp6þ™™™Dxfí ¿?ÅDÜµï ¬ "ö5ÉÅ@X]+??Ÿ<ÿ}ÈünvîÜ W}0 \dd$ž)Ð\ù¹¹¹dðñÏ0®¹Õþ–.]Š3_mö*Ÿ{€* bÅPÄ›}-ŠÿDð–~/,K®—p_;1“¬èyèõµ‚7ôAŸuÖökòFCŠŠŠPTTäÑ· …ÿ¨±sÙy?ý;jì\LÈÌDPPF+j è8+À•™™Irss‰p#"†w­àTÐjµdðñÏPýÁýz±3|OËjµZ²ñÙ½øís¿Úÿo‡§²æ“à:-‚ë´x*k¾W“M½yß}l)ª?xï>¶Æ#ABA«Õ’Ú]û-µ¹ž››Kº-êL&„ÌÌL²téR|qì˜Ã=Oúq­ô !’áøÆ„+%À^™Ñét˜8Ư]é„´þŠŠŠ\ pÊ Šž G[[{ö½*>Ë`ªÇŠ+<ʧ®ÑhHTTÎ|µg¾ÚŒêž@JJ 4 cB¦(,$¼N¶üü¯g`0Õ#%%Å]Ó״̶=Ð8h óçM J¥’¸ËCñkƒ+úM˜çè¨Ø¾q<ɹ<ÝWç\]{‰ð¹e:ן>;vyòµãH‹«C×ÞDÏo¥RIÔjµƒ¢u=À~]j4¬ÑhÈ#<âvǪÕjÉöíÛ1røÉ~õE«Õ’ãÇþ…Þ_ç^MM Q*•$##UCü‘‘“Éu9`*Ôéߎæo0ôö¯£ù[ ™Ì§·§¿¯W)`ª8Oû¹Òæú•¯¿@õß^Å—_~éýäl­õœ*HUÉ™sO¸~ff&-qw Å/õèÙÿT L[xÍÓÅg§úŸ‰÷üΫ6ÛÚÚ‘‘ÃáŸ4kÞ|ˆŽŽöXÓ¯¨¨€RÁÇÔj5¡‚Í1Å¡M{üõë×#{íZDs¶<"??Ÿ“j¸j_Œþ¼ëy+õt#U%÷8¹F£!¥¥¥>ýnLõ˜ó——`6›‘ítî‚‚‚Pôd8¾ßwå/ÙæjØòÖg°DLAss3¢¢¢ÄÐmÚ6›ÍÐéx|ZM²®®)))0Ènå•â¶M¿·éK¹Þ„ŠŠ ¨Õj’ŸŸOBCC±Û,Å–·>C-‘A§Óý¢V€   üæ–&‡Œ°òßüyÈÇ»~à~)Sç7ó„•ýœÙ?#„„yóSúµ‡üü|rÊtØæÚ…cÉ2‡d¥9—¢}ãx›6:u ]ü{_>àžöGL A蜓(«‰Bñk8}³cçÊøgŸÁÆùV¯¬Jž@FF†Ãµ¢¢"‡k555nßUQQw>ŒO??/zßÝξ¢¢ÉJ9Ä —¹‚¸¸8N.—£¢¢ß?ÿ2222°ÆM6Ú¶¶6&ô¾‚Wé+g }å  ½g®fФ9ZœUÌô”J%yvÜLK²ã„ÜÜ\úh$#}ð—UgDùÆ´Ÿ+¯‹€)BÁž™™IšššP®7áG¥ì<ÔS.†Ÿ™™I,XÀ2š¹Ã_þ®i©*Ü÷v5k_©T’ÜÜ\¢ÑhHç÷/ºýøüü|§&”_¨Ùà'1²M‡ÁÇùŠk´ïkCO»}Onn.Y³f Ê ÝØR`DEE´Z-q·à5 ÉÈÈ@zz:ŠŠŠ@¸8”½{Ÿ~~EEEˆŽŽFtt´GßÑÔÔƒ©æ äçç…BÁÞ>ˆ¾¥ùùùÌÂðÅÝ£ÈóSÍq¸×÷›?úWX@ÃYû·­w ·@~~>9sÇ|°¡a±çèN]8¾¥¥¥°DLÁÎ;¡P(PWW‡¨¨(!ªT*I[[¾ßÇ×_ÿëg#@"##¡”G ;;PWWç´€m–µÒÖ‘Ø|à ùØn¾ð72 œÊ'485 † îG¥ÌÚ‰º«•Í‚‚‚ ”G 33Ïà‰õ@Ñãüæ–&›sÑùó&£GbÓúÄ_t×OçE¸þ~7>³† e}t¥| ï)•J’žžŽS¦Ã8¿¿ý^<^gó9—Úªîª.h4’ŸŸO.,K.¿iA÷þ&<FLd(ä\³Ó﨩©!)))X1_ù×#ûËS˜‘€±Z[[1#ø Ò”þ(y ŸÙ§Lxêìì9“ÉÄ„½L&#J¥’Ðß5556Öâ¢"—%Õj51øôóó06òƒšõ_ýu§}¤ü'vÛwøñx€×4k2™X¸bEEš››]n¼‚‚‚ØÎ^ôE€Ð5MCL… ƒ=ØóW|Û`0p=1Oƒ”Ï5o? ë™^lÈá•ÍÌÌLv/==Ó¤¸ýÒqg¯õl,tr¢¢¢l´Á´´4äçç{$À© Óÿ¶ÛnVÉdff’àà`ddd ¬\oÓ~zz:’““Êî9ƒüü|ræ«Í×\âò9wïð†øÞN„äädäææ’¦¦&¶ƒ£ %99Ët—]¾ƒ:|îðعóPRÂÊ+œâiµZBǼ¤¤­­­hkkƒßÄ4551áçŸÞé7©ÕjÑù«««Caa!'V„ ô””äææ’~ƒi R#êûDzùûòË/]~;ÀÓÏ?ä û‰¦±ö)ýxùùùD§Ó!%%çߔ” :Ôé®#22'†¦#22)))˜1c[ð …QQQ0¨««s _*ì¾næ“ùPm½©© ‘‘‘(m‰ºº:ÔÕÕ¡©©‰ g±ïnkk³9[|¯ªË& +Œ¹ëÿpe%ÆÜõ̬_PPÀÑç ¸íÛ·£©© …‚)ϸ©â©%Š*Ü®¬ƒeˆËçd2Ù´>‘ÌŸ7LQ Ä,õ Xÿvm¿Îý=Mÿ›’’‚Ç>Ò²õg41ó‘›Àfý½~ Âé;N™C¡P@.—#<<cä wI¿Œ%Tø¿ñv%ZÛGacø] …N§CEOý‘÷ˆßQÕ“é”Óö333IYYt:¦øIÐÚÚŠU31ÅO‚àà`dff¢´u$Z¢”]-ÖEs؃ئ!º½UT 0 œÉdb› Ï"PSSƒŒŒ h4b2™˜S3K­ˆðkK(?šššðúë¯;­ˆ'”Cxå--- EÙwyL;r¹¥¥¥(--EII òóó]Zßì-@ßN__^†ô•3¸d)ôåe6ÇöŽL&“ ¯™첿ƒûvÌï…¨¨(ÔÕÕÁ/áVHFú vÞ}hjjBTTn»í6äçç“»ßÀG¿ñØªé ˜ðus’““QQQ¦¦&TTTÀ”‚””ÔÔÔ€¿+N+J9ÃÏÊÊâ¨pªQšL&¼þúëø[E— þ¦M›8úWájµšèt:f>îé3??Ÿ„ƒðâo<Æ¡Â*)›„úÃA™O^^,XàŸ ªÓ9 BEϸœ ±Þ_‡Þ_‡¼¼<&üW¬X•J…””¿ûÁûë ±tÀW«Õ$77—( 6TxÖÔÔxTÞU§Ó¡©© &“ /\˜ãêóxçÇŨ©©A]][!žŸŸORRRð}ùE”ëMèÞ¯gí»ƒ§çÇ‘=y÷üü|’““ÃQSzJJ t:ŠŠŠÐÜÜ FCöäÝÜsrr¸ììlèt:p7;; …F£O<ñS ¢¢¢vöŒ2HºVššš`4Ùÿ…@VL&ÐÚÊ3ò   DFFÂd2¡µµ:;ƒy6zýn6ÞÂ6©rFèB ºÐQ]]³L¹¥RI¢¢¢’’Âü\=_¾¿‰ ¾xhå<õj5L¦S8`¼‚wýÀµïr[ÂlZ?ÚíúÍÉÉáär~½S³ç…½XôòfÖŸÑhÄø`F¿­­­0#''Ç%ýVôtáÍ‚áBÛDFFbÅŠl®CCCñÂ… Hÿh:u ™ˆç7î°Á_;1“P…,88˜Ek4®¸¹¹¹8“Œ;j¹‚‚.** ¯¾ú*àLr0óËýW«Õä–¿@¯×;ì@­MâfyƒÁÀpZ­ ì켨¨yyy(((p{|C7?tíˆÉWé„#ÚÛ0ೡ¢¢?§LÃïÆÇ ¦¦~Iž¥g¦J ó‚wÍš5No Ï@aØ€zöA•š}yªÞ}Z™¥ £ù[Œ;Wô}ƒËËËc¼«S¦Øøq9³œ|ùå—l£~ ·²{›6mât:êêêP{‹Û´§àà°iÓ&Ž2 ³ÙŒºº:deeq………œ;Šääd8Ãà2¬)==·Ývø8èúúz|wïÀg¹Þ„CÓa2™¼2#©ÕjRWW‡TŤ*xŒ»`Áäå塹™7ñí6K™ÙƒÁgؼutt ¨¨õõõhkkcYÙÌf3vî܉ŒŒ dee!>>Þexõ€¦í3©*¹ƒó£rssINNÞ¸ Ï¿X„—¿>ç²=€W<>Þõ÷ÆÛ?âöiQ¸wÙx”ïoµÙù{znI} Âp Ys‡’üü|âÊ"PPPÀeeeqÍÍÍP(xì#-»çjý<½¤§§Ãl6£¡¡‘‘‘ˆ‰‰ANNçŽ~9‘X?û+¬X±‚Í5Uh¨Ø¼¯Ã!—ËQTT„Ò¶|j¢ãK-;:ÎfÍæääp/¼ð***DçbºÔŸFCV¬X±Ÿ]Ðg¾ž.õ÷hìÛÛÛ9‹ÅÂhÒÁO©E]oäÇSYóIªJ…/¥Œÿ|s¡™á{bÎ6çb–KLˆSóúÊ芊€«óL³^¸8Žá ½Åe€V«%r¹3O@D{Ê+{°ãP¨ó¦ØXRÁOå\}}=³ZPš*((àèQ¤³ïñl^’››Kè‹…™¹bbb<Šw|z~¹tãoYMiª™zНÕjIQQJKKÑÑÑ÷bóÛçp&h‚Çñ–†Ð”ŸŸœœ&<èuW1цDGGC¯×S“ Z[[‘››ë6–Z8¹Ô¡+;;ùùù?ePZ­–¬\¹ˆŒŒDqq1—››K¤'xó¸0#àüyH²RŽ7ޮĹsçÆjw‡„„`ذa¸páŽ;†ÒÒR$&ø"Y)Ç£k?´ •L&#õ;£PüÚIüõÄH·ý×h4DÈ”d2›¿ÌÌLâÊš ÑhÈ]_aYi/Þ@Š÷ën†Édò:ÞV­VÊ€¾]9Ý¡¸ft§[ZZŠÈÈHfÒ,,,Ķ?òÚÜY   ÑÑÑ­[·2%D­V“ÁgØîíéùqd·YÊvþ4ñˆXÖ7OÜP“waa!ë¿Ñh´ÙyíÉ»‡ˆ}ývj9àÕøKGø’Q¾¸wÙx0^AÕáttt u*¿›¢ˆ?ñsù>º†u:L&Ž=Ь¬,§µè½C«Õâ…^ðxý©ÕjBÇH˜àFÈ¿ìé÷éÌ0²£ªW.ÜÉŽßh^ˆ††6oÑ7ú“ˆ1©ØuküSü1à¦*F“Âù¡µà-‹hê\ûµ&Ì¿ÿÛÅK‘‘¼¼X=ÁwWãöiQŒÎèî_,i¡ð/**B||<Œö‚Ï\Ëúøy¬®®Fx8¿sw†OûºŽ4`øô»QZZÊœ.én˜~çÆçî&oü ÇŽwrÂ|BÅ#33“ÜvÛmÐét uPÜÄ€*’Ðáhllä„çø[/Dô=ü±GQQ¬MçÑ)ìV ó#“Ɉ0”Ε ú„½]ÿŸ»›y’=~[Ë>‡M‹}éÿ©æÉü)•J"´ˆù¶õ%(Ø+„\ðÛ1‘P PàÉ£…0 ý&OQÌf3ÚÚÚžž~Ývüö ¨T*ÉŠ+˜ùÚÓó*Xû‹_PPÀÍ\óO.88ýÁÏÉÉáÆ5— ¸¸˜khh@QQL&âãùЬââbÎÕÎ-''‡ /þçÎCuu5´Z-¶oßÎúæ?@DDžyæL›6M4¼Æ¨Õj²fÍvOý \™N+ &$&øâã]?pÈÈÈÀ¾}ûPZZ ­V ­V‹ÌÌLäååá£]'ðèÚ]žÇöwþ®7þ´i¿ðØÿºº:¯ü@솨0ÌÌÌt›ÿ ;;›½¯X±‹/ÆO<ääd—ÞÀr¹ÜÆàM·ÁÁÁìßUb ôÜè‹*hnnfÎqî¾Ýd2 ®®%%%Ðétèèè@dd$vî܉÷vŠ—FÂ鎘L§°ù{Àr¶‡ûb_6­Od‚Ÿ>çŒ ¶7N­V ‹Å1+Ž'øøx¯×ÐGñññhhhpIOžãºŽ4`÷±®  €ûov§ë6((ˆ{…Á„…‰|µ9a² ¡€_°`ÒÒÒ˜˜í–v¥R):¥ƒ™¥Ál6³# *_¾hii)Ð)ìÑ÷ÓÍScc#g2™tô;ú³þ…Ô@¬43èoÇDâ)íÇœ¾ËÈh W¼œF@˜ÍfFûMMM×=ä“‚¨žÎW# Âm·Ý†ºº:¯bM|*àãããñÌ3Ï ''dž‰¸ƒŒqôŒU¥Rá™gža–„ŒyÌ€ÚÚÚ Óé°`ÁTTTx,€ÚÚÚPTTdsö—œœÌú ïú-žÅ‹###[·nE^^²²²••Åž]³fÛ±üO™õý¡^ã«ÕjBwít “““=rb£ Óé˜ùààС¼Gòœè—ôŒØl63ëM@@š››™5áÉk8¡"‘‘‘à`Þ-44Tô퇫PBj9¢¦{ª8ÔÕÕ1%À<öp†£b@@cFîŠê¼Ð¿wÙxä®ãÍÛ–³=68îv?ÚOš9³Ù •J©TêÕ¼QP*•¤¾¾žY½YX­B¡€ÅbqIOg†±ë !‰Ï¾ac¹ò9׌' Ï9ý~a¨+UâhW`4D} L&¤R)´ZÞ‚+¹ÛýÛCCCjjj\ò ¡s=Ö¿ô£6øí:á*ˆÞÌ*Ð…‚úÍÿœ…R„Âg§ÌÌÒ¾«5@ç]¡P 44” #+®'8(4 iEE IˆŠŠBDD„GZȯô™€…ŽcžàÊd2BM³_O™L&#ÔyI¡P0MœzR;ë­eNwÿ@ó¦@Ãp\ÅûÊd2rëÐz|ðþ:¬Y³kÖ¬a»Ÿ¦¦&äåå1g(gïøµçO+Úp IDATˆï7Ueƒï.¥onn.›w:÷T §¥¥¹d¤öã*ýÂ÷fþèõî§‚ýâA+.´¢K` <}òt4‹¶¶6§!€¿©–Á`à„IÝÜõ®_ª¸Óµx&ü_úêô!Ü%4551ç$º“-./wùŸ€ð‚RèEKÍÀ€íY›¾ÅbaÚ2M˜C§+:¼èõ|~ºÛ£N§Cdd¤C™³‡B¡@EE[|4‘Àïb#Ûtرúf,Üü+výyÕ ¼~à¾)þ™õM£ÑàëÑßµ4ii*ÌÏn°Á§ïøµç/<<¿ Ö¢eè&l\ߌ?,·¢µ•œÿs(¾\(jÅ3©ÑÅeã=MRèq Í.,‡KçÞ“µݳ¯è&“ÉMDA¯×ƒ*T™£áQÙÙÙä‰'ž°ÿT•œE'PÁðQX…ÀÕS&#U%Çn³ƒÁ¦_s¢ȸæœ9nnü-@«ÕB¯×cùòåàô,‘žõÒq£ ð¶mÛÚt.+º ZƒàþÊ÷{^aP¨¼S%êë¢5Ø´~4yik·Ój|@ÿÖŸð”~óòòžžŽíÛ·#<<uuuNéW&“‘ø’˰X:tÂw¦?¶\3µ|cý€V÷Õ ›ššPVV†´´4–{#88˜­!Jãbþ,4€Pñ¤µîƒ‚‚P]]íQ%L¡à·¿æ*÷z­ÿ›Í'Q~â8¦%$@;xZ¯®)oø7ó×ÖÖ†   &ІöùÐc€Žf3{/$ÖÊ[ kÐÿ¡ï©N„! D§®áϱ¹ß°v$üSü:Çv „ãN-7QQQHKKM DB±ÈÚwê(¤•JÅ"ŠãNÒͽFiC£Ñ8”'¾žëÿ·c"‘ªR¡íƨ~á{3£a€!“%8S\ìðÇ^ø‹ w¡ð§×Ü•o¶—]g?üßKüØsÓ­Ýq÷ï`6›Q]]íòÞ€ÍRl¹û€ÿ|±÷x+À…øÞâÙã÷Ïô·ÿž¾ïמ?Oð=}‡'஺§mRxz~¡I§¶¼õôDŸ[‘:”%§:Ì–½ü;\Ù_‰S“°qó[xòãξ_tlÎ}þ${öÊþJå¾/:—ýýžëµÃ°g~Þ¬k]GýÅ»Vþð™Ç~vÁk޵b~ùå— á€öïóä=€c’ OBJ…ã(FOÿüþ3ß*èíÿÚÃõ Ï޳0òÅÙõë¿HhÁÿàðÿŒõó%'»{~õ5bÞÇ[§¯_®·éòð?¸ ,Çk/à鵦Qzzˆè½_*>ÿßN«ü™¢+¯gWHè¿þuíp­0Þ2Þ²ñ¹»½ž‡ë1îÆÜµ?ÉÀ5ÓÏÚÐ âÎyP Æúùý]rŒõóíwû³‘9ÑdvÀ ¯ßA³†‰}¿§crÓ«WÏÿRè ü©Cá¯Õ§_†' "Òâ´ókÏÇ¿þø¿L&#cüo$4C¢«g…¿iÔEáëœò»ð‚¿iÔE·>× ÿ®ñsªÌ‰ Âr°Þ]Ø7°²síþÀýZ@ÓïÉ»‡óH»á˜U~V¹D‚²wx'FgÅèü »lÁ°ËŽyÆ=í‡ÅbÅbñšáÉd22®«£G¸&úùkl‘ —À7n¤MX \ZK€ö}â¼v¥ÇøC­V“9ÑdOÞ=n«PΉ J¥’̉ É¿ ¥<’‘>;½^oã÷qÓ+ûçÉ;naÅœ¿¼äÑó¿4´··3S²L&#¤½½ûo°Ðþz:Ò¾dxÒ rét·C$ÀÏMLLŒÇí¯˜IÖNÌôZYºÊ]ž–€k»   ßíÓÍKp…>!?YGáØˆ ·k ÷;Âq< \4JÐÝ~7vð•ÇØÿ) ã·ãÆ[±öÑÛ®Ë\:—ZÍÎ[  {ǽwö °%¢kÿ­ Lõ»­¬Ü#Jàô lâø'MÄš7ŸÀÇóÆÄĸ]tþ&ŽñÇÒ;â‘àn½ˆU¤ðôü8bìµ"U%GÙ»‘¬”C™àp#Ýö[Ø€O†¥Ñh¼šs{>·ÄÐÜ/š±Ïž={œò=zÎ?ê>ÙWó·gÀ¸h”à+_,mÆÕu4C%g ÁõÚo“é¾)þ/¿Zú‹­€šN¾—ø±p$o@ØQÊ€ÂÃÃã#â_&XøÆ§›ý4×ÉdD©Tº5Å2%bPR¿¼=~(×›Xÿ)3¾i„ÕfÁ KÑ:kS*•"&&/}ý ö6žýí®¯€£'¬0¤LxßÝ{à ׊‚+ü¡]Ãð…HÌNbwá“«±ïBúñ„v^ü¦JyÂÂÂc#ÏNˆ‡˜ðúbðwëàžü¸Æ¦Z[[ÚÚÚðäÇ5Üîcœ}%A 7¿…ÝÇ:¸ÝÇ:¸e¥ç •JYÛö![O+ôxMÈ0###!´ØÀ[Äv¬¾Ù&Ä‹ŽR¿qTò¶¼õÙ¿Í º7ÉFà¶œîE{{;w-Án$ÜÑÐ\˜Ç ½WÚjsq±KOôáIƒHW[/.TßËR„Äùcð(?ô ² ÛbÅ×ø]ùûœWÄ óõ!ãº:Y(몈™øÊ¿Ù_žÂ¤ˆ|^»Ë}Ek³ío7– !ø'MDgål)0â±ü)˜ž:†ÃÝxPãY&:á\ éÓSÈÊÊÂá7Àb±`‰¡9ݬ}Ôuq±>´[[K®rX4ºˆîöÓ(Õ›ØÎŸ ·]ƒô(€B©Þäàè „Õ0ÝR©dVÀ³çù4ÎÞÈOoÁ&jEêP¼^Þì $bbbXU«ÀÀ@BMòöÌÔÙB‰‰a1™€óÐ ŠOÌ .@ÿèÑ£e´¢ßqÓ+vëðÊìH¿ðJÃÏ{R CR„qý”ñ¹"Da¿¥R)ÂÃÃqôèQÆÌÃÃÃEÇŽ¾W,䇾Kxާý7¹›?wc þ§¬@ ÿù~áëêÄñ®pì;œ}»¾T*E@@‚ƒƒÝxë­+“ñz>þÚ³µ}Lº˜ÒEßg?æaaa,™‹= ùsçX.2(|OáãÈÜPÄÚú”އg…Ã`ª÷j-Ø‹³8rz½? îÚíÏ»ì½g=*€ÓÐÐ`£D7¦@ÚXÂ~‹93J¥RøÄv€*Ý+”R´Ôtn2çÎÃ,5ÏOœÕá $‰=],?ÀŸ?tñ²ýå˜â'AΙ2·!‰Ôq•F°Ðhú—ŽýxÐóv…Ò_Xt=øÕÏÝM:+Àp¸åOE×ãPTíZù`+,“•ünûѵrÿFº^þ=±C~ï¼.þÒË÷ÄÚW*•äÇ–V›?îü9‡¿0ôÞBýN}ú£ËoÒh4äÞEµxá•—Å×hßU*Ìf³MÎ{ùwû¥ã˜– Åíž¾>yÞô#þ”Ùп´”¡‰ ¦žŽ¿i`øÔhEêP¬ž2Ù!~™âÛ Š/fî€}?[eåéùqÄ]Q—ÀÀ@òЭ³/}ýM¿˜„J”3<±xVûäDbcO™%+wà,X¬ßÂñ÷dÜÛ;‡c¶¿ŸwZèÞøÔ©ˆæ88+Lwÿƒ$:¥ƒqÓ+j‰Œåtw%ÄíÕ¢i&5o…¸p,T*•×ñ·®v­ÎÆRˆ†mT:$€«ofBž®+‹Å‚›FX™€éèÀà°0PúX”È wôïì;œ AªàÞ$½gñð¬p¼WÕåõ¸ ߆Iûv³ÚOš½îóÇkÌnƒË~(•JbÃß:‡3Ö"K‡´±Ä)Ï ÃåÑLàw[¬Žˆ+u~ Cb‚/KÎåjM—ú“‹V+N ðg×ÄÖôôQjLòáðÜÇu$“ÉÈ  M¸0HŠa—-¸<,¦Ñõc+kŸ®±ï¡V¢*2W¾þ’±ûè1à­—åz³˜¹Úfee!##kÖ¬aý§ô»uëV—U%…¾ïú›M¬?7àè¹|Œ¨0 $C»†£yÀyû[ß>sæLDEEáÃ?Eèé!Ì @¡½^Æ„þ…ÕáZLL šF]tªh4ÒÖ²SqÀxÅ­ð§`¿ñòOàú$ÿ‚[&$œ4¥ª§J€°/bG/ž¬…‡g…#U%g;}gG9B“úóÂY†A¡I-Iaaaˆå…8ûI ¿à2°Pø?ùq¨©ßÕ· - Ys‡’¯Kz0bxΞw_¿^¬ßúµqÈÊÊbÙ÷%$ ¶š¸T``T7.îf¼«gƒGñ™Ü.îÆíÓ¢P¾¿Õ©ð $ãº:ñsO/:¥ƒ±*b&vvšlÖÅ]1STøünÿÒUŸ›Né` »laGyökÂÕ˜ÒMÒÓóãˆáp7SÜì7‘?¶îª:Ú¯:osb¢‰³~PëÉOÖQ6 @LL """°gχ¾|ÊkáY~wûiøŽBwûi\4òGxdx#á8Êæ¡§‡8lJh͘ÒÒR$&øâ‘B0õ–ýܦõ‰Ä•"`oÅ¥ý*¿„ó¬€pàcbbÐÑÑáñÙ±=Øã{rŽGwÿýŧÐnøñ“EÍÁô=ã_r}-<ÿ£‚X*•B*•Â]8žpJÏ¥R)Î;ÇÆÏÝwÛ¤@ÿ¿<-;VßlóüÆçî&®ýóOšèô111gÂþI™‰ÍŽØü»;G>eÆHÀ”/‹Å‚£GºU~`¤ï¶°}Šï)„……±"(*•êÿ±÷íqM÷ÿïB *—(HD.*: ‹âj´ÝpTEªö²®K7¿ºïz›ÝluÚÖª£·o»¹/[™íº¶¶ØÒÙbµÒNE‹:EAE¬‚¢ÑJˆážç÷Çéópr8'9A»nû}?¯/’“óyîÏóù<Ÿ+)µAY1'†éç].².´¶¶úeÃ"7ÚNñ·¼†û_ü;ÊVâ/G»Ùo¥Æ3&&Æ# µgHJJBss3³s«}N$1 dÅlž ›対Ë*컬òJ@GgÊ„Ðç´‘‘‘^׿Ëå‚Á` [žIhàËW‚pÇ,µŠÈ1^ééé¬l%å”””`Ó¦M¨¿4’93,£†”øï:TÏ,Ó5M¿qvÝÀíÑè·ÿèXÊ ƒ9ŽÙíx”®Ã½›–j7¯ÛQË¥ ;)Ñ/ý³pÿR)Ãáà”¦t¦gîm·ÝÆžùbBλ£q®ÇÓâ®®ŽÿÈÈHöGAìÏO‰¼£Ñ@žøKÉd"û÷ïGuu5ÂÂøØùÿÃç.É{â¨×ìF =´¯íaaaó|3Fí²n€B]˜?èÍàw»ÜÔ¨ŒÏŒ?£î>q½}»\.¯‡ØorJêÒ)îó{>ñV½žÐâ[)ÐòåôùÏïù¤ŸÞê„:1¡ªÀáppuuuˆ‰‰ñXø/¼¼ßk~m©ñßwYåõæèèˆÀ(ÏP#fLå QÄÄ]ì镬?ØuCÑúÓh4 cø4n¶?D€ZÌ ™–l£rB®Ñh’’ÂÆ_H¨å†ÐØMøÎ²?õ%ü‘»½ÑÏ9Ê{=èõzhµZ6ßþ¬Áuï5sËosÃv¬Ï“à¹Ú"L+Õ~zc2Ò´¾Ô‡ƒË˜†§·´z´ûÈñ¡È?”äÎ*;wt^iéºPFDjjjžžŽ¿<þ>Ù¼I² ¦~3Ì‚½mo½PåAü¥Ö¯Ýnç4Ç퟽υCÝ®Á'¥=Üå\!éÚ?ÐTŠW[õÛJöÏÕ #ú”© 8žGvR"9XYÝï¦:ýGþ¹s‹÷¯?ÆœTjår¹pèÐ!–&ù‰dic:Z®œèŸ‚œz4ÞÙßÍ|ØøöYLüã1’84ðõë×Y¤ïŸä¶<=Ág¿ôt³½HŸ¿þ^•«QÌ= ½A(=@¥ðégoø“ˆñÛ‰Ó+>{ØŸSócžÂoŠvpRƒì è¿9…VûJð}½#Y¤ˆý\WW§ÓɈ’7FHnþïLØ(Ä/)¡€µÃ"‹OœNŒP ÝM<ð„õ‹­›Åm¢7ª. ý¼páãô}m"‡ÃÁ½ôꇰU7²g”éQ"º§Ä_¬.ð†+žSÊpR] jý/–Ñò8!z½ž%=úD‰.\P,B|no‡ÇaD=>r¶sâ”¶Ôâ_£éK5Km¢¯ÜñþIFé^p:(*¾Æy³»>òÐCì³V«Eee%>³sV­öªö—ÂÁz£ïŽ^ïð´ŸƃÉΘ6 æ@÷…aí¼½•h4G±ßéõ¸pÁXrIü˜%SêEr3í×ét„ª¬¢"º1-ŒÙ =]ë]>¡§KÒøOÍÍÍp:,Ë&1A§öBF@r.€” ˜ªMƒ}¸ªÓk›ôÛo73ÿþ€×@@|q_‹[|3–çÆíÄÙŸ>—cX‚›?}Nu˜.—÷¨tRúCˆ·O8i€'C ®‡rÇ3 Q²"㺺:fÑ,×¹çJ6·ß•Îß97PÓåÆ(‰U%d¤ðCT.öô‚¨k„uvhãbO¯d_(± cßÅ¿¼@Ž #Õ¹/ñ71FÞ۪118Èë8Ñvû²ûï‹£õ Å”Ô#à?11›*–CÛI³ ÒCÎét"22ÒC¼è ÄRÊÐÈ•’Ð1ö¦êñGO% ‡C’)—k ……Ïlôx¦TŠx¢†HKò ³XÛäpív;×ÜÜŒvÂùÑc=Œ‰ŸiBÐétD˜ÁÒ[¿¼]‚¨A"Ðg@&ÄŒŒôêÚÛñIƒ¤}ˆÝnçʶ•ÈÆ’¸ÙóCXŽF£All,¢"º–6J6³©½'„ v«¥g¬Óéd1ýi„? ºhˆH\=Þ˘ð¦PÄ;cÐÚÚêÕÐf³yˆûÎK'£ „9Jn% 7@J÷LA)!âÏŒr³«¤ðÛ‰“yê ÑhÑÅðés1~?Ã?`J‹Å{¿ÎbíWêëþ–êö¨±\ÈÕýÝÕ£G03Ê͘ ZŸÐ€Ë”ˆ_Ü1‡½#ÄŸiˆ‚)5P2*¢0æ>åu:‹:GoG?œ‰ƒû~K„ï{ñø Ç¥Ÿ»—+ºà+8×ãôP`ø:M;®I|©P¼~:4ƒ=ÒþŠÇ êd üƒ1TÂÈ{GþàÇ<ÆJøŸ¶)=Ô Õð¸/õ²ù×étäüù.„ªT²ë~ýÂdÒðÎí¡·cñxÿjN„®)-+æÄ°õ!¼oóÓ3ø@A{7-!¼öBÛª mw¹\LôIƒ$IͽPD;3ÊÉÎ>‰IðáC˜å†/\ášþI¹ BuþÿŽYjlyz¤×5+ǨkçûO÷Ÿ· µöƒ:ZÏ‚ ÷®þ×"~Jè… X;q"P£ò™C¼4 2g1›a[é\ 2WB„ÄÿjHßÙAŸ ×”x¬  ]½õà5}A×ðô³ðÒ«úE|äæDØþ¹Ú²&\OÖ„ëÉËdL ñ£¼‡Kuõ¹~¸Rc英 Cnn®¤T–fú o íg ‹µƪ¦"¼)”Eþó' Á` âË R 4@,PJ•@¿$*¢ cUj‘}žt™ƒjx³ŽFÁ’ƒîn¨†óbqšT9|!0Ãݺ(‚±*µ$>m?}&9SKtãÀ[M)½»°L_Ì.W_ì|1§MŸ· ï×v)…\[äRqîØ¾ee•¨°UËrÍs,#°|êDl=|„‰õ|18¾Æ_ÒÒÛ¨´Ì€®)¥øâú½­Ú!c ÅLP}hzpª´ÒØår1fC˜‹›2u„ž´~šêWè¶'ÔºŸºQ -þi!¡Å?5bkmmŦܬ.ªÇ¦Ü_—ËåÁŠë÷Ö~©ñŸáîöè?-Û€píÒyñG tŠè„T ¨! °\9\_ëxX» ãGñ†ôlîg:F‹…®ÖÝ¢3c\ ‡†ÒRÉ6 m©½+|&ÜË>×ÿ×.^m9Ô¯n b7b©úÅçm÷ˤ©øq¡¤„嬘ƒàIã19@…û_ü»âöÏž=aaaÈÊÊÂÏþsß„ûw²³ÁsŒ˜bJÃþgwà÷ Ð‹CªÏâþûZâ¹€¢Yÿh>€Šs 6>Àã¶/ÎèË5YÜ_ñ;¾ÆîÝŸ}GCÇ\¸-Uƒïï•-Ï_ð8Ȩ¸\.Ÿ¹·Jo¾Ä\¤’|æJßõ†;|a9ü¤ÊRÊËs¡‡oÛ0¿p…øRàÏ!~3ëGÉK¾ð”¬7!ñZÀS;|¥ÊŠkF£GPêòG}ÿ…hz¨¦´Ø~õߊµóÏNÚ3Ð=$ÅHË͵Üa,ÅÈÈÕ©$¦‡¯÷Äí8v¶‘€‡ÂocÏ”–È3÷rL€Ru§·ó£°°°¡÷…+×~¥ï+)G® B@”8õÕuŒ&™.ðÎøÛV—Ë…G£ðǯáÏ™ŒÐÀO‡tâ_ úæãüügÃúœHb;æò;2âÿ¯@£§ w®6„PuÂ)CŸ>›«Ú IDATqjoÃ9ŒŒãç: U¶&JMÔZp¥/ Ì „n\ù¢ý–Ìe"nEYÿÒ¨%¦T ÄF“¿¥ž !nžŽœýàÿæè›ÊHxúŒ2R¿Ý*àÛ¯F€Ù‰ZâO(1ìZMvNˆ0~×¾ ¤kŸoŠÿ¸•ƃÐtš›ŸYD ¡ÄßÛ [þ¸îHAss3)((0þÍ®?X®'ÂTÀJÁ`0¸@5©¼;…VõÄé€{ÎagGoÃ9]³¦´X”Ù¤­þ×çD2/1<‘<–üéÚuLqofèÁaâ<=ÙòôÈ›§õ9‘Ä_F6;QK~ñó@ùóƼÁjµ’’’<ô£¾ó›™RZ?½ÀŸyÞ]p:JeË–)2˜Ë6ºqiš„3Ú °~8ÖG"¦iâ1Œ)~þ¦`â<=ÙxÌ„#=Ý~]þ‚pü\;Ü—zo*…hÏ©ž~øÙ‰Z¿¡?;QKŽŸëp{þ] }X8âÕä#GÙ³?”ô‰1)„DÇÆ"iZÉNÔz5,¥g'µeXž*Ÿ^[z½¶cÝÈ »„Aúfæã_qˆ÷ß§ßÅÿ¿ &À`0‰óô䊣«ÃùÄ_œïÀÄyúo„ è7˜qjr™O‹ŒUÓ“°¹¬ƒ£ýÒ?j¢x"Ä7·Èê<¥Ú0~T0Li±¨Ø}ªáÊqÅå$ D•VÿO7d¢õ‹*­î–+Hb.} àµç!7Ž5 ÉÙÃÆpÕô$ëåÝŽsaBªeåA’c}»–hGÂy¾_Õv@Ý®ÁðùžKõ¼kªó|7´#qêuž!¡ÁUhà¡}î.VÞ }‚ô¼Ĥ <ÉHOë R Ù‰ZRêè€ZËó÷+&&ÀV݈í.£F㇂üÎ 8ÐétdÅì`¹ËNÔ’Ä€qœýŸR?à_ u¡1¡£w2tUPRÇé“;PVÅ3{¶êFP;j0ݤÅó/á#§ô^ UšNøáØÙ˜ž\ŸužÃÕãpœéRÜHu¡î b㌉eQ¥úCŸ§\b|0«R³}SEpÿ¶í¼&{[­VBÃüæÎJ:kº@çà=/”ÎCôíZÒV¥ÂË”_¿€¦Ïœ\v¢–xËEAA8Â|,ruš7†PËÿÔn˜RñéÄd€ý4ï rñà0ŒÈ¸ èld™é›Ù>ƒÉd"6›3™LD©½€Á` †©í¸âèEWk/¢G!º´ GÒùyŒÐàÈ­·tÏô³xð®$ Žd‡GÒ´xDÇ*¿ îÝ´„Há?úÐð½›–gj ŽŸë€­ºªá8Ÿ?>•«¸ OH¼+ ?1ù4û 7£§õÿñ©\Ī‰Ñ™Á` ¡ƒ¯cP Тêèn€\Bg ïå-7%þ®Ë=\g}ßøo.«c¿_ù¢£D¸w„ô˜d'jÉѯÛJ‰ÿIw"±±Á` ÎÔ@\ Ôvv#®÷cĪQ‘Ä3JÄÞ•‹.˜ÝǪԊĎ´}§ Ѽë\p*;ºpøl;j;»QÙÑåS¢A$u»a­ƒ£Ùø 0ñØ­_˜L:÷ÿˆLºœß݆¯j;Øÿüî6œþìÎïnëGü)تAÕïý4ïý4Ç£ü¶*Li±°U7zHäÆÁ”‹n—=N^mðôž“øØÎaÃå/Y}ß$P¿ô­‡TXŸIæjCHb|09~®?LsÈñ:óGõ"®Çš_cÇš_ûå3Ý¢3£'äë¼_ÿžÔIó}–1}rþ«P…¿íÂsGêq>9ï÷vBDÜ—za;æB™Í‰ý®NY]z FµV…‡cgãTÂß±øãs¸÷ÌlŒNcײַ#Û–Hu™DF¨p±§_cäÈ |$RÄÐ}©îK½ÈNÔ’žÆ¸/õ¢.Š@5<cUjTìiÃÙCAm‰Äj *ê·Z­ìüÈÌÌœt÷ 7·ïüöfðDòX¢iä“@}RzÓôAØüÌ"â+…Þ­lþ(ñï ‘÷›§ÄêÌ-¸ö³ °Ÿ.ÅÒ•Z¬ýßy0$Z0l|û,”„ÖÆK¶aó3‹Èõë×A‰¿c¦z½^Ö。aj;šÎw±¬’p$=]­½øª¶W½Lp«l+ú1éiˆŽÅ }A.P$vÌNÔ’ƒ•Õýð[?:ãóà¢@ñ©p_êÅù”h¿ð)P?üƒ•Õ¨Hòñ²èt:òö÷ïÄÛß¿s@A®Æª˜[?7T'ì B_gþÏ—áÆI7Ÿ{Ÿ» 5]”|U’ˆRñ¿Žãc h4ô8Ý,³bÝçgp±O\U÷ùÉú×/L&;O;¹sÍü-”ÿÓg:¸§Üú…ÉdýÂdIÃ<ƒÁ@zG´z0‹I—9œ˱º{GøN¨“‘žÆúMoP¦´XŸëoçi'g«nÄ'aÅœTvð}ÌñgF‡f0hv3¹¾›ÛøÃÎáppM΄µDkÕ(ùÜÁˆÿQ f$#= u¢ÔÁo\u;Ÿ ~P/…i«RÁu¹‡kúÌɉ‰ÿºµ½ÙOÏHÇôŒtÞÇÿJ0:ëÑV¥ÂÌ(7“xMä³0™<úаnG-×Ýææ„L€1j4¾gÐà‰;Æ*Êx3`0È w7ÆqvÆ|OŒ¶aPÇzgè*Û´ý˜€èÀ)‘›½r¦_€q)Ï<}MD%t#꼪h漡h&Ц\AÓºòøòx;fª‚X, Û1¾ÏK(P‚>qþ¢ãÂ1H€‚ ]¨"=x8v6ÞŒß {y+&ÎC&ÎCŽôY&€ÞúiVÁÈÈH÷àöѲ}øÈÙÎ}äl玟ë@û°pÔvv#é2÷¥^T¶iñ‘³«ØÓ†ôP'lÇ\8ðÚWø3ÉQ)À¹æ.”::påÀ;ìü(,,ä¬V+9¸ï·Ä[B c€&'¿ÿÆç­]x«ò¨¢9ÔétäFS7›¿eË–ËÑ Ôþ`íÿÎòñe(Èw¢Áv ó™„ÝÏÝÀÒ•}sïŒaŒƒV­y‡ûé'A¯×ãŒö²Wc&/ ñÆD—vÁÜ€¡£p£©Mç»ÐÕÚË.vMŸ9¹èÒ.d'jÉ•ïÜ2&€=à©ÁN§#Tœ¿~a2Ù»i ñZxHët:ÒµoÃÿ.‡Oí„øƒ$$$¥ºOM”šPƒ8ºi|énÅ0qþÒºå>Òºå>¿q÷nZB"&…]|«›ŽŸ7œÄø`ÖWjÌGçÀ`0Äø`"e81)¤_i/±ƒ¾1ÉS_.&ìâù÷999$''‡ÌÕ†¸@~üãÕ$0TE"Õ$!!Lœ?†¤.X@hr1H­?Ú__ãGAªÂþK­_¹²…sàí]Ún:V¯tãh¿,‘©Ñg`¨Šèt:ª"Ô;À—G„¸]´ öï=Œ±Ä™OÖçD’yw?­ŸÞöiò ©ƒ×[_ ‰˜BFÍCh $ŸlÞÔoÿÉ%Bê‚l¼CUDÄöIBBI]°@vÝ}F„š(~ÝS ZÕ« aÍø2wÜ2qþ6NºŞވØÄà © ‘êϹ¬¥kQŒ«¤~)|¥çà™ìG¥&‰ñÁ¬î… ¤ !bRˆÇü™L¦~c Æ5o 1™LdÌC<þf>•KFÍC-½‡|wÃxöüÑÒ{Ȩ̀r‰Éd"£æ‘mÓ×t’¾!…,Ú;™¤oH!£æ! Ä@#2Z­V¯m–ZG @FzÖí¨åÎv÷pQ]˜åƪ Þ `ÝŽZnöê·½¦ÞÒ£"º°ð'g>ý]ŽB©cÕ@D¢¯CÒ´xÅqÌ~áPým´VÍĺOÔ•”±wÓÒÔØˆ™‡l0ýïöL)îÁÊj\Ôc>Mè¬ÄÖƒ×p°²Úëºï;s¡Õját:­Uó·ˆdMÓ±˜â[:¿^¦Ñˆ• ³=6IèàëX1;3£Ü ©]à­Eó=í"Öí¨å„bYñüû‚ÆÆF¼÷Þ{\mg7ZzݸÑÔS{S¨QaLP Æqv)>Å :ž%÷ƒpýMèáCSU]J$¿¢"º@ÿ„ ^ƒRƆ‰ñÁdUÆPñ[¿0™Héà×í¨åÖí¨åh8XŽž²_jDTD»Mú‚ï?óîz¡ˆeÄ á´,9á{cÀÅR²v‡¡í q1I€R Ä³¥ç8¶Õ܆êj›o$ð‡S]Á~’ŒS†hl=¤’Ü¿Þôÿv»›ˇ’®'½>‰aöÊ™x €W?ÑgJ!„Ó2)Œ¯èrôL¤¶j­ ›Çî67×Þ܃&KÿXõÏûèÄûÜ‘âS,ŸBw››£u_=îitçM þeP0TáЊcŸt ¢¸¬X2ÃÝînÌŒr{dT"† T“ÐÉnŒž5ÚQJªÀßþ)DkÕ¸|%ˆµwÇû'9¹l€@ßíŸB§e*o@oò­žù¾ØvW÷âƒÿù—ê›Ðõµaîǯñ^MR±(l~fÙ™ÿ®Tõ`üm!¸RÕƒ)k1äA²v?z*•Ìz¸/õâí^GOˆ ƒº1(¡qó<)9û‘€@ƒÁ@ƪÔ0¥jðÆQ‡bßO*¦”ç¥.e.ŽŸë@Û0 Ò0kèòÐ^8NŸÆOÔþ€ê¹¯ë9DÇÆ2ýw¾ÙwJ˽›–Ù«ßæÂZ š18Õˆ°V‚û_ü»"&€†xMu¢³>õ˜å†ÝnçÖí¨å¤2¹Àý/þo9 §ÓÉTT¤ßYðû¾3WwÇû'9¡µlb|0¹‚¶c.œt÷€Zç/\0–l=|W¾h÷š©m óOvK/Oh’¦Å#lQ ’¦Åã¨:ÔzØ›!ŒpýéTj;»™^’¾ãk <ñÏš¦À‹'¤j<\΄™þh™ÂråÆO‰W‚Á` ÓÍ] ž5M%7!F0\n–µ‘~Ô¨˜ŠAJ #Ü[¡*Ó¡Â÷ ¼è3Z«†E¬¨ Ï(‡ÆáJkâS wgOû÷¹ÚRÛÙû'ŽÆ}/]Ä8λÝÎU¶iýòßòôHRò¹7ÎóóäïíŸ ˜Æ ‰ASc#¸€iœ/)À±÷ßg}ì q1ÂÙÂ'ŽþNAìº:WBVLCéÛéX•1”=ënss#k{ƒÁ` £g ÇèYÃ1:5?z*Uqÿiî‡ææf ¢B"Õ6>˜g `EUɃLj T“öaáˆÐG³õŸàwႱ„&ÐÑétäò• ô„¸<.5SÚ¤³À²eË0m|“GçOœ„I|úóS& ¦i&=8Ö‚tM©ŒøSh°óÚ—UkÞátû ˜ò°;óyUÉËZAþ"ùþžJ%G«ºà<Þ‹ÏwcÉÜð—´€‹z8Ïw#ʬQ¼ýYCSª†qïô³RKúâg'jÉIw#Ü­35ѱ±YÓ%V ムÕ%EkÕ^-襀Š^”Ä –‚ÜùCÉÑc.ŒU©1(%Jn0Ôp¬JÍtg” tÖtaçi§ÏëB/‚¶a°Ûí%hJ,éÏ_b|0±ŸíBo„ ƒ£Ñq¤Á±¹l®øA½7B®¶À_OM”šÐ9§Ÿ'¤jÏÁÍŒ%VÔhPXÿÓ`Y—.áæîv¹ù[à×ÀDÉ_3/‘ºEÓwGE¡§±‚y†lTdƪÔ>-ï'ÎCŽŸâ¨$ n4u#iZ<Œ?Äï>á5†„0Âav¢–Ðú Y~›¾¢PRB@÷_ËÎ8$?tÇ_S4t:¡’u»Æ¯L„=!.Ð`L=!. Žæy¹2„®«ªá0¥j˜µü·üúK†ëË#hâü1dÂä ¼öä1Î`0ƒYúÝ[»i¾NGèŸ&"¢zpDøö&Îýî¾ÔëóæI‰À8'fÏŠÃîß]ñøìÏþ’Œ¦ÏœÜÉc‰¯4ÀŸS6[Ø /‘àiI õ¨aß }3 ‰|ò¥Û1d¦§¡4ØŽÃ% gYå,ûM&¹~ý:&ýAŠ—°¾}Ùƒ$³„ÒýFûðùñ}Ðqžç¤Á` 6l@yy9¼ÙO $#R#,»ÝÎÑÏþˆáo?é²gÿÂZùs±<´×¯6LHÕ kš®Ë=œøè ¨ÓLC&;[‘®“Oý(‡ßYÓÂۨ{Jtg”øJ b ‹ÝnçŽs1Ï_›ˆ]Qâ§Ït0}%í§s¦ÕjáÏü%]æ BÒ´>ëØŽ#hjl„35PñüŪ¡ÀÚïpÅžôöOÇÏu¹‡kröHïIÁÍŒ_b|0™bìá1 ¬¿ÂvëA[·ËÍDþÏ¿fèo¥ŽY"Ó¡bÄŸ2FFOc"oŽÖ¼5÷ä`&ÁRkU8R|ŠóFü¾DWÔÛGxó·Ûíܺ÷š9_ K£ÁQ†-ªA3iô‹ø 23Ê u»êv hvA_ Ô·Ò 8Ñír£³µ×«%ùÎÓNnçi'÷‘³£Ÿ>[÷^3' ¤”øü¸)>Å­ê’Cñ þOàgº¸žB"Õˆ2k˜DÉq¦ËkÊü‹û7åïg Á` g»{8»ÝÎEèù°×v»s47+‹>šL’¦Å£é3~¬´Zá•––rŒø£oþ $RíS G‰zLÓ$4ÚöÀ~ºFS*×í…ýt)#þ(à 6›òÀ \}6 êš^ìÌÿ ¥¥¥œ”þŸ Kæ>ÐïŒOIIùFˆ? Á rÿÞ8êÀ„ou@¼(ä` ø4ÈDmg7Û' DOcšË0_Ä”{zhPÿm%m7 $] ÕˆT:x+O÷Å ^]ðÄ:ø:Nº{àt:¡Õjqô˜ ÓÍòX˜ârPJÊʃ<ž·ÝÃÑc.Ÿ}7 ¤.ŠÀ}©·IEÙJÆ` ó—Lj;»áLåoÚc¼6<@s[ûîkîXv¿¯}Û‡…ãBwÏv}7)bßäìñÉ ÒÔÓ+9~çÏwáý’ë^ë§kL,mr]îáNŸéà( Õ*æ§ 6ê3R¨&êX5ƪÔ0ŽB}}=×Ýææêëë¹ã(ô4ö°þÈ•AEýúh ¢‘‘‘.hR@£@.¿ÍÄÀŒ™–ßæV,u‚.>ˆ ½##BGùm¿@÷Mg}ô˜ËowÂÎÖ^„pZ„pZô8ÝÌ­Öñ¤¡¶…·ýìD­¢ø?/&a÷ï§éRåð)ÜLbáH!äj‹¤\.©TNo¹vÀŽí+PVV‰ [5>)½(ÙÆ9–X>u"¶>‚ƒŸ{ÞfoÅøÓãbO›G>yŠK)¸Ùõãné»5Q@Á®àÁð8¨FwõI}ÜŸúX ™Z¿0%°xí aÅœöÞºµœpþW̉aAz¤Ê ¸X=4_úÌ(7 î#•Ï]X ÏÌÒöP†™ÎƒÃ@o½Âùšåfzpásoi¡…ç@TD‹‡¡$•´ðÿÑz­J §›´(³9±õŠ•·bv0žÛÛÁþK¥v¹\˜mÁľÈ#½šJûêþú7úÜ›]’ø£ \b €pÎ¥æ è»@™R5¬Âõ/dÜzþϱŒÀSžÙÌ[Ú?3‚yÏ+¹‹äææ¢¨¨¨_ÿ“’’––æñ›ÃáðËSËþ«ÑuíLÇíÌ–êê>kqÖ@9@,eSšF]nß ¨]šHa¹¼Ð¾n¾ß¾TY¥“æO9ió@Û¡ÔG××!x3ãOCvúÓ¹Û¿?õ+í»·r2~ƒ‰?e0… WIB*pï—!d„žbI¿ý¶EŒ£ô ‘[«Rmðwÿ³÷ßͬ¡´‡ºìÒ[<-[H4½Í›ÔN2 U_}îWŸ¼©r¤Ö€ð}¹ºoÕù!¬_iÝ7[¿œ_¾ØÍO*]0pk$€ôš—ºÞêö^ £‘†*zø¶ñÿÝÁjµ’††IëQ9((( Û·oGCC––ËÂúœHòøÔ!ЭòOI箺ºú¦6ÉÍ–#·†”ZǪ‰¿9((Pw*%ÔR ôDÉÊÊÂþýû‘““ƒ––Å{âfÚ?P VÐaaa^çL?þ? ®ÞGޤåW_xômç„(’}ôò€ÏÂÿıú¶2Rž>‹Ž›¦³Å’¿Ý*@ sµ!ä”!š}ÿ¦rgxÈi„¹Û­V+ÉÊÊBVV–âÂn_Rø7“[þß„°Õj%f³‹/†ÅbQÜï¥K—rF£F£³fÍBxx8^~ùeCC¥@‰èca~ç7›Í0›Íxýõ×=~óÕaxKoå(m‡ÜôæSL!.PM*ïNëç-Ö7 ûTTTD¬Vf2\ IDAT+ÉNÔ’)wÆÁ”ËDŸ¾ÚZPP@š››Y$0€· q¹\0›ÍÈÌÌDKK ²²²dÇQ§Ó±y–kÿ7&“‰PjXXhE„øw;wû/„?ü¨ aõEøAT¾ÃK—.ý—>0nìv;W[[K~Ã_ܳ£¯}ŠÅ‹ûÄ5 Äb±¼¼‹²Ú”þŽ   €L àP^^ŽM›6)j¿PõãOìx»ÝνþúëplCö½ÉÞU Àûw\ð)î¶ÛíœF£N§#û÷ïÇãg¢æTBé‹‘_ ˜Žº ¯6Ë{‚áÊÙ´¶¶2¢_ómн0ë癘õóLöúù›b|j)(( ¦wÏãø¹Š‹‹q·u6¿ø*î¶®CFzš¤ËÍWð’„½ãüÌװݰÙl\ZZª««qýúuÔÕÕA£Ñ //­ÝÛ.~œœÈù<ßJ *pž7„¬ ד†_ÿ'j¶V îq=¶Ï{ œ«÷Æ‘W:yïOŸ;ƒ¿žžˆüü|ìZMøPÀiéhnn&¶cÝx¡"rkÙl6#-- ÇÎÆîàF,þøþçcù†W\W$«j;»å^•„šY!è>Ú…™÷†!ô±0@ý"V9qõÞ8Éz ¡Œwuu5ÒÓÓ‘™™‰?þù ”——£¹¹¹ŸôKN@â¢"2î?f𛛉7.†¼¼<òÃÅcQRR‚ŠŠ 477{Jƒðæ†Ã^AÓÙb´î‹?!d0†A äæÇd2¡tE &ÎÓ“#6ÞcéîÇñ£‚Ùþ=b»wÜÇÞ;ï'¨hƒé­‰&;©¨¨@Ê=ï>™«(>Å_ö'„øwÝu2ÒÓ|.ܽ›–ŽÏ‘Ö/„Ïþò:.í~£¯}Џ@5±Z­„®JŽ‹_H_ƒÑh„±µaõEL¯DŒýÆcß…æ|#ZZZpà«ëpŒÅË/¿ŒmÛ¶As^ú&N‰ùÖÃG°ãý“uu‰˜± zž ª¯¯ÇÎÓNŽæ xüáLɲ(£ÖÐЀ 6 û—Ïãå—_FYY#¬Þà…Ã_!c²—>~OŽ?„µoÅ¡íÅëÈ(O–űZ­Œ@ÐxþÕ±øsf†ßùV;‰¶¯£‚øÎå`³Ù8[u#2Ã.¡cêm8|¶WÁ±}ÀŽÞ8haª\½^´´4¬^½f³+«Ñ 7{¬ã÷'ÏÅE/öÄ?ƒgþ̳ÙlFBBöïßßi—msÙÁJ¬¬†¦ñ0îMr1F%!!f³«W¯ÆÒ¥KùÈr_§~éÕ% éþ¥kÝl6cåÊ•(..ö;¥ö@ °°KKKcU²²²€Ì°K°X,¤iÚTUUÁ×AH×´¿|(˜L&÷Õ5D ;ã¡*‘ÓÁS Ñ¡“ ŠàïEãR8:æBècaÈ>â]jFaRýUÍŒFCCÊËËQö©¯ÿ m/@qq1–†ð¶VIGÅüà^åpiJc¦ª@×ìÒ¥K9á¥F’ñÒCNGhjt9•µÝxFfØ›g¹C5¼õywyºË–áûï4±gGXÆo;>Ãc~€?û²²²““ƒM›6aÿþýlO˜L&’––ªR·%Lׄ††”””`↧þãϽƭ‚Õj%UUU¨¨¨@VVV®\‰{î¹Ç+®P7111›“¨Õ…>ûÉ8N|šÈÇl6ËŠåéM(xÆ Nªþƒ•Õè8𜢎[­V2:s&Ó¿nº³Ùì—7Åb!¹7ÚSú‰G¿}Ýâi´¾ýû÷àÕ[¶lŸ‡À:á&hhh€ÑhÄäÉ“±mÛ6œ(~“ÓÒ$oî)))¨°U3_YFƒÛÏý ¬¯¯gß`ŠI:©Õj%¶êFì<íäjjj°}ûvþ++Cyy9lÕ^%9çéIÉÀÁ*'¦¨±ö-^|ŸôB+?/ÛçððpLž<{7-!Ï~rëvÔr555È¿:ååå8?{;•ƒ•ÕŠÁ§Œ øïyc0~T0¦Æ…À”‹sbdÃáÒ¼îPTTIJ’’DFF¢AÏÓ•+W2& ¡¡á'''#??.— “'OF}}=†ŠÁï<Šu§¹ƒ•ÕèÜÿ#”ÚtmÛªñnázLÏHÇ»…ëqi÷‹(//ÇȽëýùûígn¶Ÿ*,,ä¨$(??k×®•Ìz¨ü¹I RTT„É“'3Ÿìø«Àºµ½õ—––r¾B¡ ›·ðÉr@EÌ{ó÷1ÉÓ“ã†ï¿Ó$Y/eXŒF#ží U„ óOþ·¥j0ÜØ€q)ÞŽC5.tík ÃX_àÒ] ±ã»¿4üú—¸-EÛ±n”}*ÍL à@ϳ٠ã#ßÃ]ÿ(â>s xc`Å·DKîì¦úýCÏu{H%²^æö½yåØýˆ=Û9!ŠYÍSN窣œWP‚?eÊìß¿¹¹¹\aa!÷µøší95À›uŒ غu+*lÕŠ‰aa!WSSƒ––TTT`ÿþý(--å¨:VJŠª×ë1ÜbÁ¬Ÿó—¢´´4Œ¸~Åï¬Äü¤$dff"ô;!!ÔÖÖú¥óÍNÔú]¿„9µ³µD*‹…½›–xfa.ñ„„’@Ö/L&„ZúÓw‹ŠŠˆcóRTTD, IHH ;'Dõk;À¯½›–Îý?b둎ýmýÂdɾû‚ææf.T¥"]û&xÌ3{¥eÒµ¥Ïb±ææfRúì$"~®´N€Ÿ;«ÕJrçeJq©ŠÎß®EÑ„tNõiøJ­þé|[­VÆø¨“æ{e‚vNˆ"kÂõ„Há¾®×ì¤DâØ<†¬ ×{”5wܲf|[oÞòÁ{ЍfíÑét„®g)“ÉD›Çx¬µ]‹¢ÉÕ{ãÈÕ{ã<ž_½7Žtí›à1žt®èIHH`xOŽâ÷ù¿ù™E„5Ó¹øÛHï·^ºîèwª–`QyÆ”ˆÕóî~šX,rÿÆäþÉKûö“û7ndÕÍÍÍ$//Ì»ûirÿÆdÞÝO“yw?ML&™w÷Ó²ã©ÓéÈú…ÉdýÂdRúì$b2™ˆÅb!rªN[øŒŽ5]SÞÞ(H†e+(( öÄ =£{âŸaÏm6›"½]AAIOOǪ÷†â•W^ñ»Qrõ‹Ó¶JáY­V²nG-÷☃Ìz~ÉWÏ)’bPØ»i ÉÊÊÂä‚Ãxüä ,]º{7-ñiˆXPP@¶¼†††dee!??F£/¿ü2¶oߎƒ•ÕØ°aƒ×º©á_þÕ±Hz¡-OÁg£îƒV«ÅtS }貸BéĬwCñÐò¬zr&ÎÏ^Ç`£ÑˆéÓ§£¤¤bËìúúzv[Ê¿:oY?¾öÞ²‚Õ±eËnûöíý˜!«ÕJ¨­Fdd$žÛÛ¿OaÁ¶mÛ†ððp¯}‚+vª_õ‹!;QKf¸»ìºînì<íäžû䂬/-ÌGû’––†ôôt¤§§cgGf¦§ÊDxó/))ÁžøgPRR‚††äää óÉßaÕ“3±'þЃè»ñ8Ô‰î/jô%“¡åílÐ`Ö»¡HÏèÅ‚=1Š]¯Š‹ûD’V«•<÷‡?`Ùk“±aÃ6^Û·oǦM›|Ž_AAYŸI®x;û ìüí/˜MމµX,dòäÉÈÏÏgÆpJKK9;f©a6›qô˜ wdmbá••0‡ñcÀ…5ÃqaÍpdLÖbï‹ |ÖY\\Ìl0Æqv¯ˆ‡2FzꊹââbŸçÇ Ã555¨¬¬ÄÚµkûÝØƒÍÁx¦¥Õ#à üçp88£ÑˆÜÜ\äææ"??ßg»¥€ŠýoKÑà¯q!øôî6Y#F›ÍÆÍz7”Åúص(šôœêÁ°7ÏrÃÞ<ËuíbÒaožå:Ê;Ð]Þ7¿‡ƒ+))a k233ñYÎoÑñã˜ðÔýr€^æ —/_Îö7¯X¾|9î¹çöÝår¡¨¨ˆI'ìv;—››ËEFFr›8é·ýö¸ñé+ûTÏÛ UUU!??---€¶¸ú»ýK© ©««Ã®O2‰Ûª*¼ôÜblXû=YÃÁ}—U¹Z¬V+ÙñÝ_aÙk“q鿟ò` ÷]VaÝ{Í^“:)I ¾¾Ë—/g"­u¿-|aƤ{b°ä«çðà˜ßá±SúTr@¹Øe²òòò°råJ|Ô5o›ßb±òòrØívnå°“LØÐЀ²²2¬v[^Cyy¹ìmˆ28™™™Œ‰GBB^= â~Y,’–Ö'î>}:4‡a±XÈÊ•+‘ŸŸßO¤&ËZ,²xñbv^Úý¢Gߥ ¸ÂÃñmÛ6@ff&òóóqâÌŸ‘››‹ææflÙ²…£ýð©_Ù‰ZbJ‹EeŸ€‰zx³â¦Äßb±êêj[ËQYY‰šš˜Òbal-Ç_Žvaûöí¸v횇Acaa!WRR‚ÂÂBÎét‚ê ?ýôSTTT`Ê”)¸çž{˜^pÝŽZnöê·¹ï¿SíÑž½_…×_TOj4±téREF˜t½QXúZÒÒR®¸¸Ø§:lçoáß{îK½xõà—,´®œ%6%þwÙ‹ªª*¬ÛQˉ×9{«à‰¼n(/^=øy#ÊËË‘Lrç%¾²~²yYøÌF¼«½“éÙß²sV­æHïç²uÓµ¶ÿ~dff"û—Ï£!ìÈþåóìüYºti¿óƒÞÎÊ›:43ëvÔrkÂõ¤fVÎþ`þ(¸¼­ ד¿>¤b"u 6l€F£a"~£Ñ³ÙŒêêjfDçkÌ~n¨È?22/wôžîÅÌ{à[uŠÓétDÎ#€žµ´?€EÃÞ<Ë}U§¸ ™G=æÁn·³=™••…M›6aõêÕØºu«’¦{Uinݺ•“ÓÀr››Ë ÷$e  ½â ýù©…ÿÕ¶ÑнÃ-L™2]_Ÿ[B5€~ÄÜd2‘xIIIxtá›nâCŠ?ºb;ÖnøX6+ Ãá`—‹ÅÂöïþýûQ^^Ž·Þz‹Ñ zŽ)MqíäååyˆH|ù/ÿ«á ñü_R¼„„&‚íÚ7‰À”ºZ­V"Á;6Qìh±XHvR"ª[„bo%Ùô¬V+Y¸`,1 $//HùÓz«Ÿª1€¯ÅM_‹Î½ º¨…*†‚‚R[[K”z?PÖô‰ç•Šþ…¢þHu€WÑ¿„¢;¦ÎøZ4¯„㦢Ãì¤Db±X˜(s×¢4²kQš¬0­Ójµökov¢–X­V¢„  ã.TwQËjq‹ÅÂT8sµ!$;QK„A†Ä——ÇÆLÌI\®·zsçe*”]‹¢‰Ð}N P"OÛ*€õÉæM>%ÂóB Iêý5ázrõÞ8²&\ÏTH;'D‘¢ÈÕ{ãéú‰‡—ª èw©ñ±Z­Äd2±±ôÇ™ªâÕ„|¡ñ×Ëá_½7ŽìZÝOì¼kQ4!½Ÿ“¢dÅØB¯sοßä.$ Œeç/ñ¿ŠŠŠˆÁ` &“‰PѿܻT4OEûÂ?«ÕJî߸‘X­VöŒª¤ì ¨ˆ?!!Ü÷[b2™ØZ—’ö‰óôLý!\þŒƒè'hiiñp/*,,ä¶nݪøþmã}.€@Ÿ½ËYZ_ff&Þ²-OÁ¶Sÿ{bØo¾nNtQ̆Éiiê–ÅïãâžÝ|ǂΘ†Ö¯áàç×a·Û¹ªª*=Öƒ [5”0šÆÃ¬¯@ŸA)-Ö«ñ½AÔÔÔàå]»ØÍ3??߯ >ÔM8ÎTí£Äÿ•NÊM7÷ô²ö+ køœß9Ú—¾ùñ)½°<~Ö'ǽkQ™?F´ÝTº&T¯á™–VnØ›g9st0~>¨;'D‘ò¦<~#‚úùü´ë<¾KÏåÏ¿Âüz^q………œ?†ÍÍÍ0ŽÂ w7>r¶sg»{8zów8œ¯XSÔAPQ{<ë9Õƒî²eøÁü8x#fRQ•º—––rÇzk°ã}>N‡ÝnçŠçÈ«=¥ ¤¤YYY°ÙlœÒH´ôöOÿ‡~G…®„Õ×ãjÛhvûoûï¨z»‡ô //”––r6› CûçUÀþÊó¬Üüs8k<ƒÿ|qu‡_ûW)0€Þ³²²<¥Á` Ë—/÷Ò÷ÛÆ•ï`Ë–-LϽtéRÎ×ÁIëck9.í~ Xºt)—vIqƒÒÒR®¤¤ÆÖr”––r‡ƒkmmÅ¥Ý/ÊŠ]é-å7¹ ÉtS KLŸW:Úð7aoƒÁ@–O Q(--å„II|+vj¿À?;O;¹áw>¦ˆ‹·Ûí\¤Ã††f Lo“Jê¯Ø}/<ýA¿ç¶êFŸM¨-»yiØ0M ì‰ÁÚ7yŸo§Ó Fƒ{bðÐò Фp'%ã©\ö ÞUUUl.*z{ûäoJ‹ÅÁÊj”¬ÄK¯~(i§`J‹…F&;QK¨»Ÿð|°²é¡NöÜ×8|6ê>l,Ã݉W~éÓ ‹Þ\…kœZÖû f³{JV³5´§dµ_øTA¡ªª ™™™Šúý«€}ؾ}»Ç³èÏßÇùVyÅ+oêÀÔŠ<~#æè`|ñÓLúc/ö½yÝCœžv­ÙCÿ/†¹ã‰¶w(wÙt85þs8œÃáàš››Yþ NG„¹(²²²<.#,Âåæ1$ô¿tœ„)ê è—3ï ã­ü{ã]m½³ÛWx¸»ÉE”‚'’Ç’‡‚R=žy }-ƒÁ@<ÎZoÖ÷4¦¿0 f@Åÿmÿp3怺 AØ_›ÍÆ­.ªÇõë×Y ¥ ‹"£Çóñ$œN'ûÃÔvÖG¿ õýÒ9Ò¼ßâLRÂß¼er»|š´¬= ?Çê–ƒ×_IK„7¨Oí¬Y³úá Ë )ÿR­Css3+cùm<ç,L,®?äj Æ öHAKþ&—gÞ`àó‘Wvt±tÀB|wËTÀ¬ltübbb˜Þ]˜6”ÎÝöíÛQYYÉÊöÈû¾0™¬~4u²Û·0C‡íß…ÀIÉïhµZüpB#ð”ÕtL°¨†/½ú!ö]VyH$h]4¥°8«8M¶7‚ž¨%îK½¨Òêûík9ý¿ð†'< Ä ½/0 dº¹Ëã ¸c–SLƒñü+ÝŠ2Â=Íç^øãWƒ |æ¾âöJ|ׄëÉôYZ,þ¸=£s÷çÌ”}êÄ«êö›8.šúþ‚ÛR4L.• žÇμܸ—Õ[0|:þ·£—e¤õÊõ–'œ_j L UPP@–.]Ê ×hãö(NÿºË–!vñe6v/ 6óŒuGy’^h•lK^^©ªªBMM {¶aì]»Ög6ÅŸ Ô¶kXÚ­òÏÜÜ\deeaëÖ­¬\¹²ŠŠŠµÇ1 ä•W^ý.õ>uƒ¤·ùè¸ùŒÞúé3!x¿ÕûñÎÃèÛ9L4 ÆÛ |ùY§Ïßû-(‹à ØžìlõõQN„0U«8eå­À¯‹"¸|%È+~]AÛ0ÙT–R¹À…éT·¼¦(¶Ò<äbüôt>`%èsñ–Jù(î·ð7¹~ïØ¾ee• €æXF`ùÔ‰ØzøˆG~m@žø ÛOotBQ”°”PÌ'NsK¥ ¦€ª@ß…¿I¥ v·\aŸ) „`]KÈ!&&iii0›Íý˜7ÈÏÏGyy9ŠŠŠ$Ó SS"+”¥Ì¤8pFzr6öõ‰SK1â”Ââ5¤„  Œ”xüåöƒÁ` YYYhhhè·æxìo{Jê"°çÓÅé`i_·/ßûK ô'<Þy4:¿|0«_Ç­ IDATœøñþ^Iú§C:q[ª“µˆyæ’W|q›h(Áœ„}o^Ç}gù[}÷áÕ~{™Ö_0¼/âéýgö° @‡»Ý8ÒK@=Ïó@*ï°vóðAO<¾RKáÛ°aÊËËQ]]ºº:$%%±}U^^ÞÏûH8ïoèƒQ:ÿs¡ïüÒh4>SSÓ2¨ÊG¸—-[†ªª*Ùõ'TeP£>¡4 ô;*\*åǽµµ•I ÄÙÅ— ©±ò‡þ~?)8ð)–Θ…œ%{Ùþ};‡/?#øøow¡àÀ§·” ðX€R —ÊS,†oß[yÅóW\Æ@ê•Ë¥îou_p«rÈKAv¢–Hx_eÜlý·ß[^{1 8½½ ÁWNo¡ÁžÜRcæOŽu)ðv˜ËÕë­oãæï:öwÉåWZÞ­ÚŽÍc½!+y_® .— ÇÎö(½ŒP|)¸Õ¹åýYcþ–çϸQ—s«ÕÊúHŸeff‚zF Ë”K,N,•.P®×(Ü걃WdÏ^̵)møÂ÷UÅÿWÏöMÁÍößd2‘±99¸TZª8ÿ­òàCct£Ð1*CÉ:¤ºÃôÿfÇO¸þµÚ>¦Hœ G >Ý?EEE$77—ËNJ$â¼ÞÚßÐЧÓyË}a  `þY d¦¨Z†¦Õöµ~)É6º°nG-'Œ(9Pð¶îÿ]à_¹tÿÈ1Âg#Gö‹d*–|ðÏ8¿%ã}“וÀD+(ñãŸÉáSK^^ž"âO0”ºaý§@ꂺ< vü±ˆî9Aõõn±0ƒ°o¢­b0™L¤säH`ó'©¬x€§E³Åb!Í:º Œk@ëPBüF#†[,~G¢<ÇO)иêrë_h!„õ “Iê‚„ºi‰ñóòòÈý7jÐ4Aàwûån„ß4¤.X 9WtÛ@¥tØívÎh4BníIA¶Ñ…_=2¥ÏN"ë>¸ ¨£üê›ÒuÿM‚ØÍÓd2‘û7nTäöxº4~[}¶U§Ó„Î#â³æ‰ä±ý˜g*Öø}C? ŸÑï#GJJn5 äüñ<á"Ô4†±µ‰Uoôã>ä„Íf㨻ÍÊa'ûá›L&2kÖ,üjNªªª¼º’ìZÛ‚{“\øÓ Þ'gc 3”ûÿ"̆UÕ,ê\mm­l"êoN}Q- uü[ËÑúç˜ýÈ#˜ýÈ#¸ãÆo<-¬Ífã"\);—Í&É%Ë0šNÔ`0ÖÖVÄ~ò1TU3)%°=1mŠüj¯xGr ËõÁßý7_ž ƒ o=‰ .°ýó ŠOòc¶Z‘™™Éôv¶ïÝ´„¬zì!D:øD1%%%hmm…±µš1™a—p1Œ_ tîŽöøŽ >êø'ÿ½7²:ûÆ¿÷$“d†a „²IBÈ2 ̰…ÅЧ¡Á&¤âãÞ ¼jÑVK© T ©+ZéC%RE«-‹‚â±²ƒ4™@€$ CH$†É>ç÷ÇÍuræž{&“Ûçù½ïõùða2sŸå>ç:×v®“&M°ÆFô$¤¯€ÞQ©=eæå±¿/`å[¶üÛµBñê@þö·¿ÁUÁPVRÂq/ð=Õ°ÿpcÚ=ææ€e¬Ì0 Ç Çu7ë?2Éo{Â{ˆøÎˆÃ~‹;Jßßï9ì¯IŸƒÓé”H€øøxì\½A]lß¾¯QBBŠÏƒYZ¾~þ„~D!díÚµliZjдÊb±°·Þz‹§â­‰ÂŸ ¶Ó]Uýhâ\ˆ©×h‹CŒÓ‰:£‘ÿ‹q:1p\ZãâÐqÃÞæ‡£ÑÈ2óòØœ½rM’—þÊ#5úZ‰óD$ÜVå’²¬fŸ"¤Áû“ê ¤E‹±‡¿ÖA­ýMåéjæÚÒ ö•Ø‘ñó5Ü«õ•¢Ã=ª HŒPü.P,~O6ô‚µbK”øèÑ£(,, XMpã7à¦yI²a±ˆ—Åo,ãé-3Y)¦fWÙìZ`Þ¼yÐfd¢Šù¾nnJ2›¨ Q%‡CJIIAzz:*++y?›Í&uÄ^Ƙñaªã’öœ™—Ç&•Ù¸ç<åúînÞ„¯555Èýõ‹°ÙÏàž?¬çëÿ¬ý]°˜ãaíïÂéŒY>¸ŸÐtVcþâo{÷•`zÔyX­V¸ÝnÔÖÖòïÅœûJìÈMIfcBÕ×…˜ììl6xÚ­8ÿÙË8¶åuÌ\¸ ? &¡ ,àm1ÌÌËcå[¶H»žÜøoaþ³GË´…þ'P®Í|ƒpÜüÕa·X,¬±±{m-(~ »å:”•wðh4-¡ýàú ç„QwËãê¼CR‡¤×ëa±XØ™T :÷öV$¡øO w>ûl¯oÚ8Né™gž‘çqæ ¦L™³ÙŒÁ“'wÛÖápHO=õŒF#Û¾};Þ¼%GOt1Êm•U’?œ¥Ä?¢rËßm@l6›´~ýz46ÊÎþúI9¢ÉãBnJ2£sóݤ)pÇÅC.Hø€:£œ«aŒÕŠÿ³p2êŒF„~y Ç…`ì-Ž AÑèW¸FMíšËËñj«ìˆújëyß×VûJì¸óå/¹ö´² ‹7VãðáÃ>‹'Þi¾41üUy›TXˆ9‹cã7À’©…Z-µB d†Í'Ê8ee í²/€b£iSƒ­iMšü^[;^):Œœœ´%%4cîô`|ˆ q.455ÉæË#µhùúÖýõÚ’’Ðôæ³øÊfÇ+»õÉû©ås€­G<?{¯ìÚÍ¿[š–ÊèÂðæÈQ~­+ ’d øêÞ=ð† ”Ëb±°1ãÃp—6jûd·Û1=ê<šËËQÚÒ›ý o¬FXu5’o8w*EL±ö«V­‚;~"Ö¬Yƒ’K—`³Ÿá%u•„ŒÒO EÉeÂÏž•qÿå/ùó'pGé{ȲšA8. §ûJì Š€@—çóÛemX¼±“ V]íUÎ7+#Luý(‘RSSJ.]BMä$Dþü ò¹ z*+Íù‹…—ßžñûVYY‰µÖO™ÜÄï>>¶Eš=:}|LžѼšâb$dgÃ`0 °°­Zµ ÇŽ2X ÀÏ>ë—nØl6ÉåraÙ‡ ØkkAnÌTŸ3bÕZDšÔ?¡?Œ¿ë´ñ;_‡Ã!ÕÖÖ"üìY<?[“æ}z ïÚ0sáB΂Ѥý•þü &“‰åçç³ÝõõX°`±ÿ~Øív$KRPÅ”)S ×ë‘““ƒ¿¼ù5<èÅ?Ô×¹y©Œ*”fæå±™3g"''eôƒÎz7‚Ü ¾øâ è23¡×ëqðàA9ìZc@ùO†øG…I“&aòùs(ëèä|ˆ4}Pg4bì-’5×{ J°X,,&&$Ä`è<‰¿‰ ¾¨¨z½EEE^µGúÒ àãð`Ö@¸ÝnX @Mä$|…²’4­ºƒÀô¨óx)µÕ¯ÄΕ·±·ËÚPré^ØQ‹™ bÃOHË6UH‹7VÃf³IMMM^9‘E¦eÏ ìΗ¿äÄ ’oÀÌÅïIþkh­qqœI6”•¢@s÷jìHÔ†2“ɰ˜epꈽŒÐZYKS2ðž€ò×h4²ÍOätë„õ»‚¹Lö êŒFœ1F"òÞŸóŒTú³¾Yä€.„Xs¨›¶—*++~ö,NgÌBMä$´%%á|q1Ïð•ÍÞ§H¤”xív;Þÿ}Ü=u îzáE”ìÛ‹’K—™—Ç*RÓðæÈQøùɪflbÂ?{=£0}út,*Âog Fn‚וvâñƒßð}±\.N˜†ãtÆ,˜ÍfÔÔÔ`Ù¦ )P)`úüvY\.t™™Ü Xsuýv7Ef^;æa]æÄd£"M”ñ¯5.éééÈÉÉAXu5^/mƾ;¿ÂˆŒŒä×Ë6UHÄükjj¸Ï€Ëå‚ÙlÆùâb\Üów€­¼cBCe‰@V†lë¹gYÍ\HŽq:Qr骫q¾¸ØK€½qØ+ß²Ešñû¾†­qq8™èDf^›-U!!;߬ßÔ½¿˜F¶'UðŒ‹-bÿ9*oÿæG¼?ª¸76DÂìÑyŒ¬$;Ê ËÌÄ[{¿‡ËåB´ó Ú’’0=:¡)?õ;G=ÃÜܰ•_ Um?‡ìñçPg4¢¶¶–±q¸e~!’†;‘4ÜÐ?`ü€É¨­­Ågg`0€‡nxâ i~ô@wΟÝE©i‘ιÿ~ß¼ĤÂB ˜Ífìܹ³[ÚEV·[Î:IôÂèrS’YVÆeh32½„€M[ŽK_Ù옛—ʬ`ÿþýhllDäù}Glx+а^ÕPÍf3šËË1xòdlß¾3.Dá3pãí3°{÷n¼ÿþû8óò‹(ëèĶÊ*‰”¥ð³g½zsy9Ü6¾~û8’% É’„/^kÁÁHÖ\ï¿îô¹Ú¢s“ŸŸ@ÎÊúøBùÊàÆoTDÅ“Ę˜¸\.¬Y³éééxúwPRR§Ó)‘rÐWà%4­ºƒ-ÛT!Qu'ÖØˆ‹ rÑ;i‘‹ÞQEªGîr¹PS\ «ÕаêjŽ€DTÄÿ‰ùßp÷XücÝøÙü?ÃápHàÄK-´J‹ÅÂêŒF¼41œC¹nú n‚ýÑ]wwkÂ"Í?/$±—U{bÚ)..–È‚bPxÃæ×„ü»‚¹üûG Ç{ï°êj\Ü»ãÍfUÆ=xòd|þEí×ëõœ–\º„óÅÅ<ÿÀ¦-Ç¥ 3²&GóAAAA—xO– 9•ýu=v®^ò-[¤ò-[¤ö#åH;^Cí>„lçÊÛ z.—Ë뢢¢0sñ{R–ÕŒe›*¤ÐÚþ¾WHÉî}ív»ár¹Ð\^Žššš.??™ô6zFa½ÇÌÍín·Íå個xyí±Z1Z#q ü‘ù?ñJåv»qñÀ$$$ äÒ%lܸ‘¿ëЦãÜŠf±XØÎ•·±–=/0š—ËåÂÑ£G¹`ûöí())éʘ©Å¢{eB•e‰ðò@§ó€ Ú1N'ìv;Ž=Š,«ÙoFKñú«·žÍ»žÜ(Ñý~sy9¾ÿZð--“Ê·l‘œ'Û$"šJb(Ž¿yóf¯ûöUËã‚ ¤µkײ͛7v>¿‹giûøØiyÙ¯ù³ddfÙQùT¾e‹ÔQù4xòd¸Ýn,*ÂÁƒ1:½û% KÁ¶Ê*É-q2''©ùùذê8ªO_FõéËȽδŸSíclˆƒÁ€Ö¸8466¢æv æ|#_—¬8²YZ’‘ÏÔî±EÐ5Ô«þ-Z”Î~éé騩©Ãál6›d·ÛV] ³Ù¬z§Šú±Ùl™ñ=в’Kùùù ÎÎ\†ûC}-›¶—6m9ÎÓŸŸ9s†Ó¿åÇ¥ ÉqààÁƒT7†ŸûÁ“'ã|q1ŠÞú6îËåâš¿’öЕ2‹eTTÆ\Íiñß« ÆéäŽtn¾øâ <ðÀ0ŒÓâùÕ—°hÑ"öÅ_¨*̤xVVVB¯×#6VÎÕáv»QSSÃñˆèOO“ƒ>¡¦Uw°—}ɘxWLÈ D€¨}wÉ Hàµ1Á¶' ²² ûJìØèëYújKJBòá ³øQ+ ’ðÀ6¸\.͘xêä)¾AÁÌ¥°°ÕÔÔà·³ä|Îë=² h”sß+}ôz=˜š…ÃeŸùd2ÌÌËcc¬Vlxâ ¯˜nµsóRÙƒÇâp§/½º»OÂÂèð—\º„ò-[$£ÑÈRRRЇ‹xx_÷(ñG×Ì<Ÿž›ÆÄ<új8L¦zå>åˆÂåOžŒšâ®Ä+Ô~iZ*ÓŽ–åf[y;,™òžùWl+ÎÓ.޼²î#Îä•™4cbb0Z’+È=týuȺšêxÕz'ÞkëÀ]cÂe5ƒ,lÔ®¿FÃþ™‰øyøú‘ †‡JË ×K_x}VSˆÿ±”gOô¿ 2>ž¶—ãÉŸ÷ÃÚõW ËÌ„hú™¿8_‹ÅÂFÄ~‹Óµ×¡±±QQQû-ï·»J€ÙÙÙLLä4gñbœ/.Æâ›fáåõ‡|®üõA–§Ó)…¦ü”N— z…:„ÍÍÀó×Óþ'dgË‚|I œnææ^¥GG;±í['ÐqÁ«¯%ùŒR×ÕÕñï9î¦$3óÕ4¹’§Ë+ŽûÌ…2j^a ý$ ̓¢ñæô¼þMOÒ¦k¨GƒNÏûÍÎÎfC³³±sõj¯s–ŸŸÏªCsy9\.W„ÔjóóóÙæÍ›ù÷jgoíÚµlÛóœÃívãá0 +ê›$Ê\¨r\1§³e0fGh 1y™—ÇÂÏžEj~>v®^ØØX¤æçÃm³!*ªKI*¹t ÖPréÙ±µ5.ÎÈÑ=Úø¦eÉãïÙçF½óf²p ÄùÊÊJrÒ,2õë23Ué¸6}–H Ê»j·ÛÝ£Òƒ™yy,ÆéDSS“,ý ŒI ” Alo6›ƒŽƒµÒFcœN=z‡C" ³»~v®¼ýaÇEÔÔÔ€ÂÈîÕØUýÔÚ.ÞXÖ¸8X àapÇ7oîQÌ(±Á“'Ã:`vïÞ?ßgÁ^[;~·q“W?Ï­¸•}e³sDkADôÆoÄáÇQ\\,í\y£L€?TL¸ÉdboNAØØpä­¬ïUÙÊ̼‡aÄÌiï‰xëõz ÔÕÕaVö0ÎüMÑ’Ïù[’‘ÏJ;Oû;eÊDEE¡¨¨HZš–ʘ& Yé!Øw´Yé!Ø_^ŽåÇ%Ñ·)QÊ®\ÕØ[ôýGv`× æ,^Œ­+Wò¬šša±ØVY%‘ âíS²$aÿþý<¡’˜1T<“∨¿`!??Ÿíß¿±±±AÓMe6WœnF„pºå$¦èÝëŒFX À¸»Rqð@ª«Qré÷ HHHÀ¸»Rñß«xõé‡_ý£ÿZ^cúLÿ+Ÿ7Œ²¬nܸ¤8¢?Ô¸ö’Àªyȉ#66999=öþqr2†fgÃf³Ie%%ÝVÁSJƒc®.ˆÍf“J.] Ú D\ÜôôtÔ£¤¤„{PÎ\üžLÁÌÅïIuF#¦OŸ:Á´Ý¹ò6öÀ6Ð<™°ŽoÞ ’ò€îKc²:£ééé^Ž){mí +ÊÊ;¸'mvv63›ÍˆŠŠBmm->©ªÂÐìlÌÍKeä'ðC2ÿ»ï¾ïŒý~³y ®æ èIÙÙÙœùKv»=¨8þmU.‰êÐ?˜5ºÌLÄ8H>¼ãвMª¾$”ÃßårÁ:`šââÙÔ—Ðte%%¼öcrXQû1–mª^Y÷wࣻÔ1W¥yr>œuž3¸ó‘©pÇO„Ýnçó!ŸƒÁ“'#5?f³™_¥˜Ífäää`Ra!\.Þ.kÃë¥ÍØVY%Qae‘é“@àOmjj‡ÿX*Mœö_¨3yÞó¬{& ¹é`PÄfà¸:ÜŠ©S3qùdµt¥Ÿ,´€?æ€™ÙøÁ÷ÒéÚëPg4"Âücy GF…C;ž[Éæ®x–›ËJJzÌü3óòXNN¬V+ ø¾;ª>SôÕ®C‡°ôôtX SgggËô3!z½›¶]¶ºÉªÌJ;»úEchllÄÏ>ËÞkë€ä©Îüɇ¦¨¨HZ»v-w*í'I<6ùÍœ9[¯V|kŽ ×Çw™¸‹‹‹%Šr!ˆŒŒD²$áÌ™3üú”æÜÔÔäå”Fsdü×ëõ#í;>>>h‡Tbþ111\ûY!óŠç/¹t ÿ½úv®^ »Ý뀨3ù5Þ×ojî6›M™ÿó«/AÔ€Ö3%%µµµ°€‹{þŽøŸ"ÆéÄ…¿ÿÍ‹þPѧ &Ô „ª}I~õ²1ùù(ß²%¨3óòØwQQ\Z‰q:Ñf >ì,;;›‰’h ÏÌ@Pg4bÎâÅ(+)áÉtŠŠŠ¤`´x@¾÷ݨH-Úýž’’‚ÊÊJ¼Ýyì?àÆÆs(((@QQ€ÀYé²³³ÙŽ{nŒD‚ٌݻwSYþ®¨H2íõe¦_Ù쓊M[ŽK&“‰ÕH€|¯åp8¤t§“…UWcÃ_“a_ÃàÉ“1|öO°jÆtÙ¼Éî{ÿïxdÆô ûš TWóuj‹ÃP«Lb`zÔyØìgP^% 6ûX8€ð"==kåW ›ž5/M Ç»•2‘$ÂK&XñJ†"6šÖ¿‰&c$jjjPT\!}r«™M¸® ¯7Ø6•,˜d1€„Ã`³ŸÃá’pà»x5¬ÐZ]™ bçêÕØ¦` b_uF#„3TTT$Qy5Æ«üþÃ,•, «‹‹CÖ=².r#ÁÌf >üÇRU<šñûýõ<öˆSnØ Às&ÊOÊë&†þuçkPYY \šË¯»‚ŸdÝ]å~¸ÀÅÏ+Ád2±§%Ê‹‹¥Ì¼ò€®ìä´ÈyOÂBiÍéïžàZÆÒ`pWÄUò¨Wþþ·¨¾/…]gæåñÿóóó9ÏÌËóúGÏø[ŠÊ[W-ôÌ6è|ÎùlƒŽ‰åÐû*+®Ïi0J7T L&KOOǤÂB W—™é7%¬Ø>''C³³}$%ò(FÙU«Váâ0 h./GÓ›ÏvÛŽozÔyhN ¦¦‹Š0=ê¼_ïi%Øl6)¡I®†ƒÆÆFhN`ûöí5B|rüóÞ}¼t‰SŽwß¹ò¶€„´ÿéÓ§ûy!ËÊ׺ÿþjÈ'$$ »ùç&˜%S©Wä¼€ÕãÑ”nÇÆlö3>„Ès¾³Û« í¸4l\7×Ë" jL_uvý Ävs<¯(:*Ÿ¡rÁ ==Ó§OçÙÛè_zz:×b‚aB)))HÈΆÕjÅÌ… »{Ü+Æ_¼'÷{oÂϞňØoÑ\^ŽÝ»w£å«ç{Òœ;µ>|ØË„ÆÙápHƒ'OÆøñãý7 Â’FôGõiùœŠøï¨g@ÇÉápHþLÿ"ÌÇÆ†HXqDv¨s8ÒŠ#›y àßÎh4²˜˜ 3•••0 عs'ß¿˜˜ÀÝ[ªžðn›ÍËó¿Š1ÄÇÆ;6½ÿ¼€ù÷ŒºíàÉ“ù•-All¬—Ä$Z>7„R ò¶'K@TTJ.]âI…/É7MH`Q±”Øl6éïhƒ¾Ùvô IDAT ýØÕìµ/³ :¦âUÅ´¯¬^˜L&Ö¿_#¦Í¸—|¥·C³³±á‰'|¼€ÅÊSbÝp¥3†¿šâb{**ÖÛëfê°÷`XÀ² ½WeóªÑ}µœê+ë>R%°dB¢tÃbe· Þàõ] Jv3.Äù«¾€l†KOOyÙþ+á=05 S-ZìµµãÅÏw@Œùœa‚G e"tçË_ª®á/žîUXô‚1ă©÷æ`êT+æÎ{Au×F£‘õfÿÅwÐ5Ô#cD/%,ÞßÑoTiÐ_Û’–6~ÿ)¶÷Ô_ô*LNMÊr®c:ÚpÙãÁ·a]BÍ€O ^‚§ç¦±ÅX¹/ا¸ïÿÇhÇ¥y=c0pט0Îà ïhŽTf™²ª•¦±DÏs‚)L8JŽyon:(—–z#Ìf íyMuÝGýb*¾ùãç^}Ð;ž<èQU·©“Ú¼hÀM7†b‚¥^|­¯‹Z; ‹íÑh½Ö}P³×MŸÑíõÛƒ>ˆÂÂBŸ÷¸û¬sO¦bþä ┣þ*iPxü‹@ÚÜÃñ3À«ú­Á†‘7á¿[:qøÒŸ³O囉ÁS½ rÿ¦ÏþhpAA¾[RÂ#xOžÌýº‹†Z´hS®Ó3Ï<ƒ§žzªÛаY“£À¤4ì߿ߋ~ÌʆÑ'€‡Û¯ ùB“×øâÜ.Oz1Š‚®dn 1Àq‘¯/95’/€Ú—,I¨bŒ3}1y=ßWÅ€Dú5<žó¼$÷Œ!²ó}×—W^„ † nCª&Ô§žûÁmH¹ ùqÚ€ñ®&h††ðPq#Éûô°!Rµ}å† Ã¶¯ÂpùJ”_&jíïò©7O}<6+V•+×ð_ÿÜÐøy $À"aV"°²Œ©š'«¿ž4î¦÷ÃÞ½%^€feÃÇ‚¢‚}·î€ˆÐµì?ne=zñ7Q&ðÔwÝô’ B„û x €w¹Xb´|„Ÿ‹rþbI`b²j@‚(E ˜L&&¶Í²š‘ÿìv¿íÔ„ ¥T€`ó9>å†ÕðI9 ç¿ðjëè“×;Î0”ã&dg{yÅþñXT>ÿ¢£Û’ÈÔ–ÆÔ,ÿß ónGßÀ©öÕ±ÓÓÓ1~üx^?^«ÕÊS ^Œ²S pëäûç«ÿ«ÑíЩü·;Ov T” èP»¥ {Ϋ®£’ˆŠ„²ów_½oß¹s'`æÌ™Ð[,(+)ñÙG%<óÌ38xP¶€VVV"%%f³“&MÂÁƒ}*ÊãÏʆ 3V<÷©ÏÜáÈüÉ›^„‚‚ÔÔÔð=u²—?”ï+:rP¥z‘‘‘¨bÌKÛWV T ô>"]Q›·Z%ÿ Tι¯”7 bÆ!ØZìJ fD 镊˜ô´6x ù;¾Ô­ƒò·ÞÎ#XÓ #˜ýW¶í‚ÅÁž´WëÃ`0¨ÑQ0‘«%­òG| D¿%ƒ4o¥5.˜wêî]º{&XPâBOÎd°8£l£\çžö¡?øcDjÂ!ˆ¿Ú·%ùl]ý~¯ïÜn7ŽŸÉ-Á®_ âïrrrä,¬ÅÅœ QX²$?NaÊñüAO÷ ·ô›üDë5 ¼‚ø»Ç'aÀl6Ãn·«– úΨçnñ‡C}5&ïH-9ËlƒŽÊú¦^ Hí×…êz…º†zÜÙ¯×ãÿo‡Þ¬¿"¢F”~ ÜqHÜ?µý¦žýµà²@kèo.t­á¯=9Q ÁDmÖ6·a—ã×ÊF##Í“´N£ÑÈÆãÏÓºó0ÔÕÕ!&&Æë@Ö^t×ݸ¸wŽœ:å£ÁŠóU^ èêÑ<(úÝÿÞB0Ì¿ ”8•Ï*ÿ^Éá[w¿Óødï„)qZ ;üÿ)ÐAî_ $¨1xú.!Î…š³ÕßúR6¼¯/Ã5€w6>"jF£‘U´¶£´¥­W‡F£‘íÑhQÚÒÖãÜÅtø†E‹~âÕgOçñ¿Äõ æ½ÅÄô™ˆ®¡&“\NR|¶/@¬ã@8DÄ«A§÷Ú1…i jv4GøóäèAÍ_ÄáDm¨ª×³ø¬Úgj/~o4ýº0Üp÷XÜôª taX;Œ{$×.ŠŒ([>‰ÚP&2ÝfbãS8󨫫C„û :kNcP³5§Q5$3†xppÄPüóí·`þ¾w$'ù]7Ú{²(кwùj.Á”éKPj‰F£‘‰ ú‚y'µgDÜús}Þô#¾Ž´ÿj¸»4-•-‰Žd[ãbØŠú&)+‚? ó3¨ÙŠÖv¾v„+e>sè‹ýTÎ9;;›UTTøxä+Û©Mï0ÞÕÔã< }Dï‚¥u"óOˆs!22%%%¨¬¬ÄŽâï'[###yÁµ¾§Ó)Í6èxôÍIt¤mêKˆTKÓR½$ÙCc‡ù”cUİ¡êÔë|Úƒ¨‡C:±3ö¹S>yï7˜Jzþúïk¦×W}‰ 2i¨ëäxÝ_ú*åLZg¢6”úÉ ì2¶ŸÅA×Pižö>G  «2Ý{mÈMIft}S¿-á7ý111|Í–¦¥²‡Æê@DL "þTÿüyrôö·öA~…Z?ïÐõ˜ps"2qÌà &zn[e•DÌ3&4„E¸¯Àh4²êQQ¸wN Þ=³ :öp˜„˜Ð¯õ;Ô.çس¿wœ:‹wªªù~ÝñÆ9XÌñ¸ã 9ïûÃaV×vùgìÙßʵ¸ÍOä EߔŭA§Ç}¸‹9÷ánì‡Ò–6¬®ýN•ÑÞ“«Ñhd3†xpbg:4CC°$:’‡c}é tLjŒF£—¦O©¢ûR{ ö”Ïó'ÜdúsèÜw˜Ø4†4 111^ôgyÅqIT˜È¤¬Á¡æVàµ1`k\ _“%Ñ‘L3X5ÿ‡ñ&£~["^ÏKÉé\€ç¾°ŸâÄâT½e¸‡CR†}ž~zÿ=Qªj±Q+óëv»qê'ƒpÂ4¼×Åkææ¥²çVÜÚ«wq»Ý¨‰‚‚‚ i?1÷FçpÔÔÔ jH$¦yÚQ5$e刌ŒD”ñÃý–¾ …eš§ýªÃpÙyûFL&KÔ†²ižö>¨4´ydV"Ðëõ°Ï‚,«Ù¯ÃHÈ©Ä#ÃC`ÏOõiHó£ï©hž;æþx)–DG²`ÍØâ!IÔ†zÅNvÁ2ö`ˆtÁÎÌõDlìs§`ªEËM¾b?ʹfMŽÂ Ó]P÷ÚBq“9 šÃq{d?ìÑh1Ã4„g ì ‚yŸžFVFFk$ó0¸\.<ÿüó¸í•‘¨bòßÇ<òYa˜÷éi<4V§Úá^¯Ç‘{4>ø3%SÿÔ6à÷Ç.©î^¯G¢6”ír\¬‰kC–Õ ó÷uå8çcÊW#^äDøÁýKa³ŸÁîß¼ˆ±aøK£‹ÿFí(о;f ñðµÔìÆ® Øìg°ë‚†3ðC<8ÔÞ‰WÖ}ÄGí\y›šeåc_a î+8rº6û9݂Җ6L¸9›ŸÈÁòŠã’ÉË?ÿÙíxeÝG䈅?¬nçí+ZÛ±såm^Ì¢/€ÖB©@]Ìž .òF^Ù½%djs§q»{/±˜ ãïÂ~nŒÖH¼Dm(ûàƒpê;†øŸb^ãE¯k´:k¼—%k¢6“ÓÃ:Z Í` ftL¬k¨¹• dMR"òÕÛ{ {+’Pü'†ŠÖv~ö—¦¥²u‘­x¥Ù‚‰Úþîbq*e1 åÖ‡æm4ÙÑ£GñBý÷(,,d³ :¦t¬$ „èvnJ2Óëõ¸¿åz˜Í]ç·7JØW¶à*XŠ@ãØïû^LK º]”QÔ)Š ð|=öh´(<_ºº:žý0ÊxQÆs}*о4èô¨h•Ž©~Ãëß4,ªc#ÂT-z½.Š’Di2™Ø’èH¦k¨Ç¾;^Zþ!æw4û­/›’ÌösciZª—ô¹¡ú²j{QrU¶Ê*‰âí£sOè2Á /²¿¹Ðg£ÑÈh1 !ºC~5fh 5‹%jCÙ’èH¦æµ®tøù¿Rt{mí\{£»@5mg‚ÅŒ°ô/!`—ã>·wàëªQÚÒ†YÙÃðHáxPíí¾_Û^ºÇ&´õˆñ;>ÅüŽftÖœÆ1ÃkÛ«ûŽ´©–¦=Rÿ'G`Yã ˜’©÷k ƒBZ¸Í~†{ÕO¸9ÑgÿDÿÐDæ?þ8v]ÐàÍ{ïBiK4у1Í#ï‡Ø.ÿÙíX¿UÎZ§ŽœnÁ4ŒÃš¡!°˜ã±ºö;9Ý‚õ[+ñôÜ465ËŠ½ûº¼Î[ôýТï‡GN· -\‹=­W7‚e›*$½^Ï1"áÞ92#­ NñÏK ³£¦@]V;[éY@7ŽY,vô‰ã¸P5)))Ý ôjIˆiúJ:bö¶r>;v? xéó“X¿í{ìÑhq²­#ÃBQÑÚŽçþèÀ¡æVܙԟ þÞeÚpÙãþÕ3;1¨ÙÍCOµwHó£§`^„¥ oc~S8–W—D&<ÞÕ„È 9Ý"f‘¨ íö•ŠÓ]Úè»MWðÏ·ßR­ÇA:Ùx}î jvãŸo¿—Ë… ÿÞmº‚ÝuwÀqÙäOû¸â"Ö-èhݸð÷¿áá0 ‰‰ÔìöK‡ÉÑ/ÊxŽmbƒc¼ž™•=Œ6kdÆL~J(**’6nÜȈF?Zï8g“ÉÄ5ËŠ‹Ú9#LtåÝ&YAé ú­¡ûÿêQQØ£ÑÂVÞ§Ó)íÑh9Óëõõb1/}*BYG'Zÿ±á?›†¦Uw°e›*$’ôôz="½#Y2µøãúÃ>e, W×~‡?®? ‡ÃÁ‰*ÍáÎ7¾B]]ß+„1¡!]R¼6”5èôX׆G'^ó;š.„Ò|I„w›®p“‹Ñhd%ÎË>7ÙÀ7s~ãX2µ˜æiÇüŽæn¥6“ÉÄÆ›Í^B@E«œÔ„ˆ¶ÉdbïTU{YQÜn7^zu7í§CNZ°˜eßFì;зÛÝ'^Ä„?T½Íil§Ó)5èôÐëõPÓt‹?_uFb¿íKsBU4ÌVÞ•/€ÌéÔ9Ýâµâ”¶´ùh9­í¨hmçBAƒN=­WVc<6+/ú¶òv¾ôlƒN>·UVI¶òvì+±C¯×ÃjìÏ™²Í~ÿ(zS³¬øGÑÓ^š|‹¾4CC°¯ÄŽ·ËÚ°mL: ¥nEdA€Ö›æ@ï¿fß÷¸ÿÉ0_º&ñdÅšmÐqÆ¡Ä}ÚÿëãðNU5*++¡“ h­–i…Qߌ-¿M¶=²gd`Hò9 ùk Í_…{ :=Þ=دR„÷[ìüŒ5èô(›{ΟÏWú‡Ðü—W—n9q w„GîÐ Uú“;´w„Ç-'Žqú•›’Ìþ|ò[„MGiKÞmº‚;“ú$ƒ'Û:¢ÁÇ._Ú# ð"]øøØ‰„€ïžØŠ9ßÈ5VÙ,­8²Yº^:†ùMá^ý‘eulD†‡†`÷îÝxíµ×8ë³Æ3ÂCµµ›mÐ1“I.äS\\,‘ÀyÝôhSí’ZNÿ‰ÚDÜ~'§B›‘‰ö#å8ÕÞ!5èôÜ’0‚¿3àßš4ú„ÌV€Ü²£Ò®¿®GGÅQ´éº^!%ˆî³/î݃ÜÇ £Ñ¨Z²÷Br÷§èæAѯ-hí²³³YNNŽW š§í_îäß‹HýðË0k4xaG-5»q×ùLÍÊé¢|p“Y®™7&3ÍŠÅC[*0!$Ô¯`ãÆ,!!Û·oÇ[þ‰ýGõXÛ,ï¹ÒÑ›öt†iˆ×u€ô÷¶Ê*é¾QhÐé½èǵ÷Pj¿Ä ¦yÚQWW0ýà¶Ê*É_{ 8'¸…±Ã¸V¸$:’·£¬£ c‡ù´‚…†®é,ÛT!5ŠæH¸G£Å ;jýÞ)Ckµ¡Ìívã›·àO„ùÍÔì†Á`9Û(5ØÜ”dfÉÔb;x«h‚ÝWbÇ}£T¯1Èâðç½û8³¢ö$Ï\üž4Ã4„{´“Ó¸€oVCZSñš³Ú^ôÈI|Ÿ’˼°³ѹ§pät‹j µÚ=ôˇ¾Ð;üº¼ËåRÍâGc*³ Ž ñŠÄ¬r´þb„ÅüŽfl”™é”¡Pt^øúKC½’oÑÕÈ– XXqm©À¨™G‘ý õ#IãG‡ty›“†7&4ÍŠÅ/—Þâã‹#úÊFöØÌÌâAƈh†Êg£¬½VÕ‡gyÅq©ÉxU­ÐIìµµxÝ‘’ã_°Eenº1º†z”•»Ñ¼³TPèm«¬’&…œÀº¨~Xsÿ}~Ïßšûïƒ9,“BN@¼. ½ ýðGhle ~èh-gþôd0 ¾Óƒ;ÎÕãT{‡tª½CZ¿í{¬ßö=N˜†{ùaÀ¾$#Ÿ•v2ž|ŠpOÄš£8¾hÅM:шWÛd'RQx­`jàp8$1INó hLŸ>Û·oçLÿcW³tôèQŸ;N¯5QÒØÎšÓØå¸€Ç>¼dn^*RuÖg_éìèõzì(þNUér8’Z@Ú¿´p-ÆF„a¢.¿ºiï=éŠÅ„PŽ'»”„Ïíò½¿Y£Á„Yxm{¿ PÂ_Ÿø-.î݃aå„Nõ(q^F]]WVCq®»°.²Õ‡öð¢?«k¿Ã fÿ~t=Õ7˜æi™kI‚d)%X©ãöÈ~üEÅ>”@Ò·ˆ@ï6]á& ‹y¢+CÈÊ::±ÚÕ‚êÔë8³!íèBÑÉN9‡1¡!¸áî±Øpßd$Ê¡g¢)#1‡Lä¦xå:fçp8¸ðA}Pžî5û¾‡v´&`$„2ûµ§CẼ˜.’;’“ðNU5rS’™RÃ'·´øóèí ˆÌLŒa¦±ýù((×pÙ¦ þw°ø#‚Óé”NµwHâøƒšÝ˜ps"æ5^…û© ³DĹ’ö_ÑÚŽ‡Ã$î[ zr+ Òp”)içw4C ÃS®›ÛíÆú­•xiù‡ÈÁ Óµüó‘Ó-È!×(8±3ÅR祄ãt†‡t õ(ëèDû1¾|«ÔGˆ%mŠR"¿°S:Ì—Bà9ß °ó£å÷Î^m‡„²Öj->}b¬¼.5z/†o³Ù$Ô@¬Þ¶jyûü‹\a )$Œµ2bÒj¡|;Gað5hy÷m„$ŒP=«×­Ãò²_cb¸ö¶r¯ñE%Æý¡±Ôh x·O ¤$ƒÓõá\°º3©?î͈ΚÓ>ÜápH”æWÜ?²¾˜L&.hªY,Éûp˜$3Œ2 #ÆÈü¯¶ééé(**’Ün¹œ/ ã]MÜ^mí(‡BƒNÏÏËí‘ý¸y[,;L°IQ¦œ˜ øþ11186J=’ ¸¸XR2ÿ´p-¯ 1QŽI¦<:i¢Ï»’š®Åå$½óŒì¸ÉÇÀßu‡ÿÚö*¼ž—†ŠÖvl«ñ¦¡Ê3ñ˱­x©4IÇ¿…=ÞįBÅ}‚Õ£¢°úŠÜÑ Z?²bˆï&:Þ_ ¨"Ý¡;NIül§‰ÚP–®ÅÇ®fž”&Øö³ :&<û ÔNÍ’/P¢'3y³]¦,§Óé.H‘”6llDÞÌ%ÿ@½hÎ'LòµEgÍiF¦|r`d+Êß7ò@”s_ŒL°ûC|^íJæZ€öK[-›Y õ»ü1ì±Y±<üŽ ùXÌñX¿µR5‹ž¸¯´6bJì³býÖJ¤…k¹CR ç, DâØÊ5PV›¤ùÓ\,æxüv¡£fÅÉIªû÷ôÜ4f³Ÿá5;L&¹ Åe›*$5-’Ï+ÙÀ¨žƒ®¡â^ú[s‹ÅÂ*++ñجXÎøSRRÐØØèc= ”‡Âd’ Âì(þާ¡¥;Щ“d¡+µ2FuíÉ´oo+÷òmÏߊú&iIF>S‹ è ý™mбqqøý±Kù*ÜÙ¯¶1 jvãöÈ~øØÕŒÜÄ~øúl 4ÃbqäÔ)Õýñ…Ìßôâ>:CDû"ÜWТïÇ ÅH¢@`4YAAˆYSŠ`5æíoìxo½õ–×UJO ëÌ“@pª½ƒŸ'%‰V·ižv´Lœ‚’’üê¦Y(ùt;þÏ€þ˜dŠ@Ò ÙOŠÚ[,–›Ð¥,Ù=]gmGñw`ƒcøÐåh÷xPsÖàs¥•›’ÌèÂ0%ÝýGõ˜’îFúÍÓÛãÂt¢3LC°ËqÁ«9•jv##1ë"[‘t¢Õ£¢Sr¦ï®Ä ‰ ß_ÚQ@í Ñz"8˜L&&:,²)jFÛ­XyAæºÛíN‹$g m•U’R'mB|&Ð;ˆ‹V—Ëås]¢5­—œÕ/ùFÌ0 Á{m<áH,hÈñžïkæO{_ÑÚåGV$Q(ênýz‹?@³ÜVå’œN§TÑÚΫ?’ö¬²,ír\ 0^â IDAT@LL wÀ£«›ý 2FÈWLJs'9!æ&Øc³bù¼É!ïÞ9)ÈM6ð¼bûÜd˲šñ›Gçû”Öëõ£Å‘Ó-ðœïDÛ®søla^ÏKóFIá‚´ô?}ïs!®E•K"¤¼ÿ÷6›Mr:1*ƒ]WW«Õêeö´Ÿ‡CÚ´å¸$@r&+=2Ð/ó§wRcìâùÔÃŵë-ýù[û 9ùV{‡D´çº¶„$Œ@iKftøúl >v5KÛ*«¤;’“T÷ÏápHÓ†gãöQsøÕÀí£æøaÝ Ÿ111Ü„Ú)¯¾Ô€>Efïv»y~ýîàT{wb#Ü/((èóŸ•=Ì OÆã|ˆúT¶-»CnýO^øgCi*ZÛñß—.ûõƒØÝ8»‡z1º™? 3þÝCýΟöå^[(&†kq¯-4à»»Ýn˜Ï¶aaì0Îü wF$ GJbþd-¸Vð™ØlƒŽU´¶{1þžXDiMlß]N“I®(§ÛŸh¾Ê’˜JMTm‡CZÉJ[ÚpØÉKh>&“Ÿ ļ]&¨¨(ä&¸½LÜþÚ‰Z—J­Þ_{µµò—W¼/A”ÀÕÊÔ*¿÷½Å‹J£*Ç"MN3,¶[ë imëBådE¢FÖ]Q+Ú?qÔ§?m:QÊî“âS®Úd’KÖHØå¸À5Áëãü o4VH¯«$/ºËÁ/2@>;ÎYÄ6ÔŽ,QQQ=r¼éÆP”‘CBG9Îuk…Ád2±·ù(üËäó÷‡Ÿ`Öo÷9ý£NµwH„gç::áŠ÷*Å;Êq®Ûó§†ÿ4Nw–£ÑÈbbbÐYsÚë #XÍŸÞ7==Ý«hÎlƒŽ‘“` rÊ@—ER¼.6,Øëã Éqì·Ófy sóRÙ‹¿Yò÷ ¬®¿ºi^ü|ÿí½ߌ_lÞÂÏ%ÐE‹²³³…6:‡ód@@×Ý¿1ÞIQ±¨9kè¶ ­ùh‰áÂÝÍðD¹ôLLL n íÓ:ªfb4€·CTwÄ£7íÕ*Wù+…ØïŸÔúDÄ”Ž["²ˆßuÇ€é]Dµ™  ^’S j羽7Ý{Ñsb¿Ê9ôe‘Bbå{ˆc÷%þˆmÇ»šPÒÒÆ5eYb±_eU6¥ ±¢µÝËO‚Š½ÚÆTÍʹªá ˆCâ(úƒLÕ´?äBwòs<”¥€EF¥Ä]ñDÜð·â5­›² ¸”í¯±Q6¯VWWKÊß‚eþ&“‰yê/Âæsþ‚À€ž¿k¥?ÊöâÓßpÂ4ÜoeSå½6£œ—¿ñIè6qµ¡,˜‚PÄèsrr¼ÊöŠß«UÔS¾‹òü*¨%¾GÖä(Œ>~I@1øT*X­â"=oµZy&?‚_Ý4 ýðC¯sA´!66Ö‹©‹žýká5Ø­ý]Øpÿ-(ñtú” ~0k ^ØQ‹ižvüré-^Ë®eÜ`Ûç&˜2ŒŽ¯‚OÏMë¶ßúN4CCðåIwЉˆH“7™Ll¶AÇ&Üœˆ 7'Ê1ôA@Óª;Œ–ä¸c[¹–L=ß;ÑR sá¿D柛lø_Åü{C¿þ§0vJæìóÊó`2™Ø“£°On®š<-˜sYXXÈ”Iƒþ•ðÔ¼ì©y+º_Éüë‡_æ÷ý‘‘‘éŠEýðËüïúá—ýêK ú§¶Öjô®7à%|r«™}r«™Ñàÿ•“Ükæ1Û c]²&Ütû+ocDär“ ì¡ë¯Ã“nú·0¯7ü®`.£õ "@ÁErh†† åë#xeÝG8îéè¾aÂlƒŽi†ÅB›Ù»ýë þYÌñªíèûR´j{µ6‰ÚPvÃH=,æxÜ0RÝîV/oï+oó8èïDm(˱ÒÕ@wfRbþ¼aãó³˜ã)š¿ÏÔ,+N jsÊ¡7?Š{礕K¿/@Y¥‘„ŸÙûßd…šmб#š™ØÈ²‚Æß±?Ån·ø†šŽýé(ÌsK2ò Oçǰ%ùAïÉdb1¡!L×PÏ;%jC½þ)ÛÈ´¶Ë/f¶AÇt õ(íhÇþr7¬ý]øäÖáLÜÛ‡® ¸.………lûöí˜Ïè`§îsóRÙs+níÞ>5oûÅ×Fm¿“Ý>KÌü¤¡–3ü“†Z ÿÑ@ ÿ‘‰2Ò%; ž4ÔòÏ} Åçu†5CC°ë‚gÓ‡{­õÓsÓØÔøÓà@n²½¶½ m©àƒ@û×=2Aÿ¯œ˜bÉ„U‚cÌä—p‰ã¿´üC¼´üCÀ¦7FB;. S³¬ÿWš¯·qç?ïÝTŠ3ŸþÛ\„Ƈ",#vÇ=¸¯pοԢrË‹¯@›‘‰*Æ|ö/3/¯Û9h††@;. @W\@á•"q†¯“€×øô µQ2NÒöO»6ûäþúE23¥¶ûJì^y¸w¾˜NÔf?ƒûŸ”’ÅÒ7­ºƒ…O‡O'$Ö•‚ôщ×óÏ•Cæþx)Â'ëö,õ×hX¢6”9݂󟽌õ[+½æÿCÉdb¥Þù6"eaphߤ.ýWÁ-/¾CšŒ6ǘ ™yy¼T°S?t¸Õ‡á/x8Òç;5ÈM6°%ùìïÍò¶­Ü [¹öÖÏŒ@Œ¿Ÿ$yÕ¿¸Â¼›&jC}´úýånn¹Ò AZ¸GN· ´£žóØ_îÆÁcCýç(**’~ùðt=ÑÅ(×®]ËÔ* ‚¯lv¯¿Ÿ_Õm{“ÉÄÊ< þúILš4‰¿hÑ"Õ¶¤Õã?i¨Å­£nÁœÔy˜“: ÄüI8èK! øãØ^[ w&:ôÓE7Ãl1ãlzW-›îÂÉ{\‰, ¾ïH^Û^å#éÍ6è˜Ò™›l`ŸÜjf/-ÿ³ :öú7Møãúøý™Í-9pû3›ñÉ­ænM¯š¡!HÁæÞw_¾UŠŸ.ëµÀŸùä_4~Ö&“\Ç|¶AÇöÚÚñJÑaŒw5u»¹ÉvÜÓÍÐìþÃ6˜Í#ðίîǃÇâ¾Â9Øý‡m€Ö£mø¡…€Ù[úЃØzăøŸzÍ}¶AÇ’¥ÀøKø÷å[¥<5nw°lS…DLn¶AÇìä”·_}vŠ F‰ÚP–1"ÂçeYͼ]Ek;ê;=øçÛoáÈé|ø«G0]Ž#§[®E¢6”eYÍœ±²D>mŠü %pªhmç©{É£v•ðôÜ4>yž{yüËH¹ ḧë·VâåCß𺩚PTaxîåuŸ<Îç:`æâ÷¤,«ý5F5Òµøê³SÈÏùN>ÿn³@ÙEa+7ÙÀÆ»šðæèÁ^× J+Á½9ÀUkÅWCüŽO1Zr ~ǧ0¤IÏá¡Ã­Èþ/#<‰þ#“ØØŸŽbc:Š­šÝàõRûOÁéÔ»'¶"UŠMoŒÄC×_‡MoŒä´9Ð{FÖï깺Âbbb0¯ñ"j— …qD"tz\aŒ º†z/«Ô”L=îÐ ÍP9í3 ô¹´£¯Ó„±¡rºìýån°§dìÏ­¸•²¿¼ù5<ˆµkײ}»þÈV­Z…gžún×n^*_¶£˜›—Ê.$DZ¥i©,êñEÝ:@.˜ñ0þùÙ*—'G`¹°¯UËãøÜz"¬æ&ë<ÀÏßÂû–bëñüüQ»'ü1¤I^ø¿ãSUú%2õCû›ñ›ß#ÿ^ÆŒÃÉòNÌX¢Ç¡ý͸É zî]€§jälsÇ=H ×⸧ѹ§°·" ÅbH ×ÂÞú96”9UÏѧPØWÛbWœ÷~öª0pª½ƒç¤/¹lÀëß4¡´£G°ÀF–ÏùN”\6 ´£÷hEiGW†Í÷ßóæÍCvv6+,,dŸрݻw#??£FºpéâN<òØû˜>}:øT$X»v-»ÇFŸÇk;R‹°ô´íĪ³Ò„Ëßû´Y´hËM60“ÉÄH=üñr]aŒÓm"##Q9 ééé\à"¸R^ã%<ç&=ßàå@Hqª½CÚ£Ñâã§øoGN·ð»å×¶Wùtä9ßɳh‰íÅ&¤ ù3éÓ÷¤½þÍ·8îé@ëÑ6„§û/}J@¦ÜÙKÕ„r3­xhƒužxrôöà¸c²y&¶”ùÎbŽÇ+ë>ò"òûJdVòÈöʺ`1Çûâ©™QP&²æAÑè'I¼ !@Ç™Þ7µä‘ª“-RĬüré-¢ÁšC¥øóï6ãëªÑq¦k•bj–¿\z‹_!¬·@=ݧ…kѢ[åëb¾„?¢™ÜøÃ¿îÚ}ìjöÁ?ÂIÙЖmªH0xtˆÆG ßÅç–mª–mªàýÓû#!Æ«&Øìgðà_>€fh>v5KU'[$²äh††ðH€ª“-RÕÉ©r“C =ꎅÑ!\öxø~žç¹Ï×}]×}Ý×aöìÙ(//ǨèûðÔ3Ÿs:ŽÛ²e Ws"Èi ¡%K–pa'ϳ”ñG϶£óh=‹zwïùF»rŸ|ò °3û7³ýF0… îd1-ÜÙAM›6 Ïà¯^½ …B¥’Oþ&9ˆ×¾ øêø`†BØ[w’›¡0£  ‹ò×O Àò±mÕÓP%ØÓ>“‰O°$=WƇŠ>ÙÆÕ…Xzu‰c´ò…BáQ^OÀeD'ú›úL CzÒÒQyOý§ø“º0>ÀK¢ýâ}ÑQÓépR_ì7×~ÉÔXô4€IVýù÷(ÑêÞ£ì+˜O¦ä}ÆÍ@¶?8ðÚÖoñRí5޾sTnƘB‰=SÆAU°uaÝçº16ÒÏn ˆpgºº¹P‰˜P!€wá@_yù>¢‹0%ï3–ĉBhh(’$HU%¢øcþޱ/m+lû&“ÉÈŽ»1ï?­%V¡ÔÇ_Õ¡©Ç‚³!S€ÉOׯÌêŽñ½QnïÁ៻þS¦éÈzÚ›0ÊŽ{ÐP°z×§ý§Z ŠûŽ"ð -ë]íxâ8sîZòå¿Vs½žzg *ÄâË­ö(…²ÍÄB.³¿]DeÞtï g{p¿ÿT Rl¯jÁÉ_Ú–=‹àô׸N»{8oè—#Ëi˜„DM…÷ Ák›®1áàÝÂTRøv 4KexDsØa_„‚²mhb[Éd„ư¥a6›ág¾Ž!1ŒÁ!^ù’Óˆ~¼ ÅLË«Õj;W9FCÜ…žàOü¦*Ðþw·ïÆŒò#1" j‰ð3_‡ð:„ÚD´´´p¶{'rf4t!MC[‘¥NĽ1ó°âÓgp_ôL¤¦¦âêÕ«(nüEZ=&ÌÀ´iÓðÕñ8¶ç š†¶âì—Ž=>„ÍL•ŠuíÈTùaÃÖVÂø:£_žî}OÁ¥$N ÀS&NI, =·^8¡¡¡H{5xìÏ¿Gf†~ŸtJ„Ì’*=¹ë‹°ß¢p1’%>HõõÅæëH–øÀ™õ¹§L^2\ˆd¸„õÁ•D³Û– ™¨'>ݶ†Wýâ}YNõ_lãÓùÜÏ9ÀoÊü KÚ«&¦å…1óÝ`oÿE"ôžþ³¤ý˜Ø“yÆ”§06ÒÏŠùQâ`+8‹Â÷ä?¼W*òŠ ¯\„§'ø#,Û4<ƒ$cgNìñïžx&GºqÏçz¯ñâ=Ĉ$,«#à—<Ù®â*Ø GÞà­<+šüRÝî2Úîö7Ã|‰¯wNv Há×wÛ³ÕvõÚ2w‡-OB³û™¯C4h°Çøc›†Î…7Œçƒ> +V¬`{¹ŽÒ¾©š!¨øú”Ó„‘÷\EƒtÔFCè]>½Û§¿ï™‡o¿ýÝ#[Ùsáwƒ.:Íå*Á‘:lØÊk „ùœõ‘ÎõqK7L†.¨ý|û5ŒáÆ Ì_&Ù©,½aþ—Dáb¯ÕÍ3ÆIaL´taR˜…1KC¦ä}Æ9cþ@ï©–†-¾tÙ.ñã¨s¯Ég š2øÀ|Tõåª]Q¸'içâúù û\7êÂÆFú±»yªÞqVÝèÓüÉÀ| í°Á˜hébsè ó§Bϯqïï¬ï@/óweüf ÏqŒ;ÓÕ͵Z,eþ¶øw¦«›ûø«:™ÿ­âjL'4tõ½ù ïÿ°œît¬ÎÊŠÂŘfaë6¸ºj3N·Øq tþ©ƒÐÃüf´Ëºtc-ûpÃtÈm»tßqã'AˆG”i·´´8½¾¡àÉþ£¶?¼R`×/áõŽ·øC™ÿ¢—eþ³óQ»ý͈šÀ«ñçdÇ/vç¶=[Í9bþ¯ù ªýsÕ¾3z,“É3l—ög¡²=c]V†·åA^]æææ’õë×C*•âµ×^CTT”W‘:[ZZ¸Iò0üPxWü¥na>J?iXbÀµਸ਼Æä'Ì@‘V«W¯bÚ´iÌ6€B‘VQmNûC<½þ¥jwÌèµ¹ˆIó§W⿆A»@ Å…îºÑÁTמnfZþüùNºÑVÁLÜÁôBÕ~ua„©ýûÅûZGxTˆ܉ã–nĈ$nûA‘íÀ%6^èÁ‡×ú±û.wˆ(|Å_Ê„ŸEŽ“³8zò¡ ”ª= &#—Ë tè=Çß„ÙÐÜ2þ8Ã?OO¯·‚ÂÓÿØH?«SµŠv”§Þ5‚•¬í„Þ¶B€ÐMª°…›à­ÀÝY´ …/:–"s‡Gn€3ç®e¾âÂq×9ü¯4aæÜµNËOð''äCq¬£ ]ÇðÆËµø¦í7ÂGâ•!-…ŸE>8pI„×÷õËy"вWü¥Ø¤ˆüe(ÛµD.³:ÂO˜ß¢—ȶg«¹Ê='¸Ù‹ýQUÎ ÜQF!Ié‹äYÑ„^8Ú†(\lußï ý •ˆ Íçg¾Ž––®¥¥…£×îÉår²`t -3V"w`0 P(`4¹%K–p_ŸÇî×=59sˆoð†Ç:ºp&Èø™¯»,K]û(Sߥ«¦?‰âÆðí·ßbÿ•«o]1€×ð- ºê.lØÚ ]u–?j 謜p©Ø~Ó`%LðgÄÃÔÓ{â pGÄmËÓ»oÑÌLð'þSüÑQÓɈ`Uµ™@O½„'`ÊD$Äcþ½Ërû æ}i¢¥ CÙfƒ:°7)Œ<;À­õ4#áé}R˜ONñsÛwʼ»Ïu3$2qOÆ®l3±ë¡QÑoåþ'\º o(üVøôªþ)î½LÜ•6Ãh4r¯ž‰ u"3D`'D8ä(ñ¢ï©ËŸðꮫ6»ÅêÊðƒÄ"XzÜ _þk5‡‘¿Ç™®nNè Ôc8‹3]Ýœ3š-ŽÂÛßždÌúLW7·ýT«W„kz€?¡û&lpç-•hé£åWð‡—αýË] ñÎðÇ•ž<+šPæð‚@Zº?*÷œàZZZ¸Ê='¸ªòN$)Ý àôB½>„F žà¯L&#Ý=œT*Ecc#Dƒ[½§v®ÔñÊ6i:½Q?róæÍcoÞVë•ÑZ÷±|±û8GûùÔ3Ÿss²c\â=ýSOˆÂöqÚ«o(:tò–èÙêðg.€ «îB±®µ¾Ë{ëNr¶¶âù/Žq®4{O¶qæái<ñ>¦µÒ¶wÂdà5© A10Os5 ^(a»ÐÝÃN:ÔršqÀ¹⨼pó¸sÅ¡L›ªªcDœEÔ%Ž TàŠ ᄅõñ ùP|ZÕ‰­Þ%"OÉûŒ£Vò¢p1þ»k Nȇ¢²» ‡;;1iÑ]YOÓ8=½·tc{U‹ÓML]X”m&tŸã]¨ñJÔ%ÚöN6ÿ®˜ ð]]±:µRoŠ_+.‚£õ`%Þá]»ßÿ¨ÿÚ IDAT&“ £Ú"ØÿÎ`oÝINWÝe¥òw§úW©T, Ù–-[˜GÚËÎÜ@Øñd7 /Ã+sBŠ­Y¡x÷Èih[JK;{ä4h¾p 7¥ª³ò;îŽDº*¥ºj°³•?7•ê…^ ôJÁh42kã'L•Šu]V‘ÿè<ø™¯ãŸkçløÉá¸_–…Ã:=~(¼ˆIa¦9¹tÙ-]Èzz23Õ˜3ïu—ãð„ë—žžŽ®êï®ß”)S' ¡°Ðcü¡àÿÎNήü¤0 ýK#m9JÇIï é)PèEAßQ#D[O’æÄ‘¼ÇÔø¹´ƒ ‰Â4«¿–;OJœ ¹¯`>±M Xg$|8#ËÓÆAké±+/LKœ¡N´K)üäTž` 3 ºK¯KûLÁUêƒM©@ë­õ¸­pT„Ìñü¡ ø¯Û>{»ÿ„øëÓ·ú†éuëðÉ,*àåƒYYÛ¶éï»þ6Ûž­æär9¡¿]õ™Ý]ÕðÏÿÇþÃa|òkû<3í»:° Œ BiµŽb5<8€¿IO⢧4ôÅ_Ä¡C¼ÍÈ·ß~‹_|Ï=÷œÛµË˜ (9Ø j K?ÿ: ÛT!ì½£tΔÉS`XÄâ"¨ÕjhµZÖÝ“V €„'ÌÀ_iÐ\è÷®’y“ õáŒ|ZÕé6ûè sâÈ^ƒ´Ï’±œÅ”ø¸ä2?#¼•òÞ0mwíÛÖðˆì,%«m9Gå½)',O 0»qÐç¶ ÈY\[è.…ç;žDq±– Ž`ªfNKÆ{e•(9ØìvLžm?==1vWÐøã¨ûï öÝîW ìwößHK÷GYé ì~Õ`·—iß— ŸÂʼunŸU»Âw››JΡ§=IlËü>,ðÆ öW“Â,L@ Âölq6** ‰‰‰?~<:ÄRõÚ¶o6›1U3©ªD¼üJ¯DësEÿh{jµ …‚‚Z­hµZ«+a:`šõÏVÐë{=lÓ;bÄޤզ̟‚£}+tC~Û!n~gàɩ᪼£zn%µðdàMYaÛ·’ÜY.uo󨻃_+·ôÿôúßÊømGUâp«S¸§Ò»ñÚ‚­€'¬S¥R‘â7ÿ€Žƒ !iÂÓ?­§ñ›çÙ·+´ònûçê½;aØÓÜóîàvöƒ7Ðe]³z½”@¾{ç²Õé_øþ®¿ Æwï\vYG_п[­ÃÍñ†™¹kÿVè˜7ëHUãTÈ–]¹r%ijj²³E BhÚjÅüm?…¾:‰¿0'Ž8Òh;¢/̉#}•Àa%*•Š477#88˜Sh0 88ØëÁªT*òÿJÞäÿaNv ©ªîFR‚î,û„ëÿƵ§ý¿RU‰IÉ\ƒî™S§NYÝÓûㆠèt:N¥RÛz„ÏlÓoneïѾ;ªû·„1£üˆ³<ÿ›Î¿íü9›GGkçê{WíÜÕÎk£¾ó;gµö¶ßþp ÎæÉv-èwŽ<}6tÄ,\8³ÇỾ\‡•+W’õë×ÿ¦ëêP_ªÓé¸àà`„›ŽCz®ì–™ÿ=×AúÅ 9•´\AçLÒy Ó®­ëVêü­@Ø·ÿ‰~¾òò}Äp> …AÒ=6 é ˜=›Ï\–——‡¼¼<ö··à,™“7óùÌ  ¯ÝÐöÌ'9£q¥ªÚ¹‰¸RU‰‚œÑv x„@÷Œm.ˆÔ»F rF;dÀTHÖh4Dø~„„ÔÕÕ¡ g4Šßü^˜G¼·°ï´ óoŽ‹3Æ8dþÿÛS|«T*’——ÇBͽÌÜ–žQ;úž~C¿£ÏµsWûp+úv}FUþ GcSðÈ¡2;Að®öáÿ«i…éó÷“¾4XóT*©««C]]®‘° eþAAA:b»ï§ÿÓgô½#mÀíÀ•?Ž ¿Ûf•±Ðý[¹r%¹òÇ}6§N/L rF³œä9£½®¸ g4$qáÄ…#ýb…á*-¤iýŸHçL²nÓUÜ(SX½S©T$11ÑíiF($üÖ›…ž)Qonnv¹am“û½ ‚½sôLØö+/ßGëô7GVp.ÿü9ëôØW0ÿWß³gÏ&z½yyyضêiüóŸÿ„^¯w™ØÑÜPJïå…à‰0úœ8òlì",‚$.ÏÆ žä~36Òït´[EqUÇ ¯®“Ëå„Ú"d¨QKä(Ñê  |³f/¨Ý$62™Œ,¾7 ONÀƒÏîDq‰êD¿ù—B…ÜÜ\²øÞ(|õ‰c#ý››Kš››­úøk€#¦n}Ƙ2f”_Ÿ†3¥`{0ð6õ,…„ìl’——‡ù«¶cÞ3ÏXÕ„F™Ìa*XÊx‚‚‚ Õj¡P(r†³´JøsssIû,€±µøòëV×Ëlèw®UÞÝq†¬\¹Òë¾?ŽoYpɼÀ£ï_yù>âÎÕÏS¨««ÃÄi{…ºº:ö\(ÀMž<ÙêôO|@Èh»ú#Â5„ÜÁþn»ú#°¿û20”Ö˜q¸³T@C[ÛæŽY¿~=WZÓw{ØNø÷}‰d_Á|²`ÃOXž6ËÓÆaÁ†Ÿ°¯`>ù÷}‰nˆæW–·µ(Õh4D¡P8,oZÿ'²¡ì€V,O‡~RBÓÅS˜¹ÜB)](‰{0} … …‰‰‰P(.™V±®Ë*¹+OáoHbÍÎ/ìêÛW0ŸÌ͉Ã:= çà;6~)c‘÷ÑóhnŠ÷Ê*=ªÍ#&r+MèÙÕ«Wá36'o¦½Q]íTp´™, = lÁÝZ¾0'Ž|ZÕ Ëe *»»¡NÄw àúä©Ñh˜Ý‚ ?aÆß߀N3þþ~ú¤%Z=2Ô‰NK†:7ˆÞàS§?‡~‚B¡À^ƒ”õMXF¡P ¸„·NþfÍ4h4B=–§CåËóðÐG:¬ûá2ŠK´ÈÌP»\¿ÜÜ\b0 ÓŸÃùy жÀ`0 ++ ŸVu²Y¿h[ìbM´^fY,i˜no®<ÕöÙžÌ)ÉÍÍõŠ%dg“ÕÕˆ‹‹Cl¼u7u:×(“!´¥……î˜õõ¼q%¥m;wî„Z­¶bBŽ`sS)šššØÚ™L&,>ßùÃß­Gòð–i¯©© ››Jí¬Ò…@sŠÜ*h4¢ÑhÈ•Àz|~âK(•J·Â”íúlÙ²…{åÁ0!ŽQ.Àûú§ª¬qóv+—N­Db¢c\W*•Ø¿?£É&“ mWD@È'B@È€ç>[…ç>[…€;˜@ úR8ÜÙÉÂÌÓq/¾7н§ÏfŒ ‡;û.ª«Õêüû¾Dòî‘ÓX÷Ãe˜Ífl(;‚ak÷">>ÿ¬“âÝ#§áJØW0ŸlÜü5ŠšÃq½6”AÄ•Á/Íz¢ þe¶C*Êü‹šÃ1(·ÊŽ tñÓ0÷¿ÊN1&“ O-ÿ³Ëû—‚œÑ0™L¸RU‰ÓEØ3oáV…NÇ™L&üøé'øñÓO`2™\ÖE™9eîôÛb]6n)G||ñ{.üζ݉éýÐÞ5ÅÀl63†@!¼û@<ûÿ‘­5€;Þîc ØPvÊÊðŸ+€ÖI9÷U,Øð“Câ¨Ñhˆ^¯‡ÉdB-‘ãÓªNÄÇóõS! DÓÜðæºÍh4r¶!§ÕmÍ}9³BØ©?gVñ4(=µ¹Ó¢!ïΩ ¥;wîÄÎ;Ýî? ÙÙäòÁƒ8uŽ .yÎê«Q½ÏÎd§sv´'lp' ½Š;wB6ìïøy—J¥Éd#ð™L&ÄÇÇC¯×C¯×£¦†Ç4š››±lø¤ùˆ P(˜AšÑhä(±ONÿξ¡B†R©DMM ¶Fà¾è™=z4†ÞgÚª•þ­Ñhȇ[+púø'¬^wý:¬Ó#77—̈CžDr®·â™AA^i-é×××3o:÷2™ŒÔ××[]ë°:ù·± pœµÐ8NÄžSá€ Žæ‚þ¦Û玠²» ÓüInn.Ñëõ|ìý9èôçXªÜÜ\bièq¨éVÁj¤÷|®ç‚b`2™ •J±× …T*eé ÍÃÓ\&ø˜’÷+¯UvbàX1]dR%ü1ÊŒ)yŸq¶Y¡‚VþƒÛkàÛ“^Áë•§Q+¼/~Ÿäœ1ÿ}óɺ.ãJU%ß…_ÊÁé¢xè#W'_ªÎ“Éd^]!¨T*²¯`>¶OïIÑ3¢Æ~B’D FÃ6Óßÿm ‰ŠW@™?=‰དྷ«`ZÃù& ô5ìÚµ‹+½pgýúõÔrñññ0™L(­6c×®]vkÄê sâˆF£!&“ >±"tÕZà+‚Á`€F£a*ü§§v*}ï5HуÁ€K1ñж >>ƒ A1.]gŠšÃ±`ÃO0™L¨êîhHwã†+ð)?g 6üÄ[(بeý¢êGê~þœ¦§ÿW6lfþÆz½é R|ZÕ‰·RnàßýG±=8mÚ4L›6ÍΚ™ÎÝÁÁÁLð0™L(,,ä ƒW®CBÆë© ÕÐÂÇ-Ýù8UÕfö¼øûÄT”IQAÁRaa!7eÅ$F{êêêðÅ3«`ºöêêê -{Ëí)ö¬¾ñññÐLŒD&&G1bÇÊVïÞmG{.]惵Ð|ÐrþU@cc£ˆ­ `2™P__NÇF®¾¾/ŠÏ"88ßùÃ’†bèõzèt:ŽÒg4ÉÿJ‚ÄÖ Œ®¢ÿ ÃN A©TÂ`àÝPSSƒòòrœ:u ™¡SQ^^ÎÒã A§Óqƒñ³„B’B¡ÀC¥ w)¸¢§ƒæaá EIá÷Ї„Â`0x¬ ÆÜ°}.ôý®¡­Ô™(..f¿©@¿ ¹ÃÎ0î—;w•JE”J%RSS¡ÑhH^^žËq[zО–ƒÁ€ÄÄD–>×ëõ0 »ï‡…÷ìô3:Ž«¯¯GDDJ_÷C||<‚‚øΞ>ÐòÑøSਸ਼æI`2™ðœ8§)umÛoÚ’ŠJžØþz½Þ­ÛSÞN^hÀÈß³Ó–ßÌ5ÈÊÊê}çÔÕÕá³{îÂg÷Ü…ºº:—w¿¨¡UÞÎS8ã7ê;ã7ë~¸Œ¬à‡DhoÝIN-ãNÐÍ©TÊ(eêUÝŽÿ‹ÝÇ9ÃùFDžhRæ/Ü€¿¦ñKµ×¸úúzÖ6eJβ(r{ Rì+˜Oºj-(,,äêëë±× Ť(jg¸ÓUkÁ¾‚ù$oç)§9Å)þP\¥'àÂÂB§B£°/ñññ¨¯¯‡y¯) ‰`õÒ÷ŽÚ~þ‹cÜó_cBí=×ÁŽ»Ùzr A1v ?1¡@¸¿ž=Ž·RnàÙÓáVíoÙ²…³eþ/̉#OOí ûªÓ鸺º:HÏŸƒV«µRuzÔ°ð\f4¹{®r4”í‚$Žžmgá¨÷žlãÏ &“ ² èCBÑ ² œ³è˜4–€Ùl¶šK AAAXÿý˜¼4 Ïð33ù™™‰ÇŸÊCà8î}îy<÷Ù*´]ýCG̲j‡î—‚‚äååaÅŠ8|ø0~øa¸¤»íiélÎ pB>íiéŒþÓw·’]׸ô©¦Q’jjjnÉŸ^Xþzÿ´þrÊ£:|Ed`ÿPlÍãµ+1¨©©Á•ëèjµxìG+­<ñXÏ„gel7•\.''žà#sÍþΈššl_þ;—¡€)R777£G<–ePó;2Bq†3¢ÆšC=""ûç¶bò¿ðdìÂþ{Èå×™LFv܈yÿiõ(¨£ù¿ü£ùÈûàžÀíÌ-;ÑÒ…ŸE>nËSmSTTô¼Y[¿`¡qþÜå`wÖ¯pÓq, ¶62WFwåÆŒò#Q—8¤Þˆçw5zÝnάRy4YYYh¹Ú{ʪª6Õý€pÿE7r(—òÚ3¥9a9Ýî?¾£Èèásƒ. ñŸ2JzÏO×Î×ÂP‰˜|@€`yÅ_Š ŸÉ(éÚ7ÌÌ5Ô¶Ž>ø€:tEEEÈÊÊ=Õ755±gãÇÇ’%KìÚÕh4Dˆc¶éÜÛÚÚ°ô‰Ïpúø'NóÐ=O÷€ÙlÆ2_›%þ,bŸ+<¾•tÀ3ç®%mWĽÏ=Ïþ›¯0!Š‹‹¡-)ÆãO屿?}ò 1 ¶ù14 Q*•hjj´iÓøƒg^ „òòr—ý§sHçºâß ý÷<žLo ¨L&#M{ñÒC5Øx¡dp¨Ç€4LBdÜ +‰ºÛß I€-¿tzT‡­„éj…qt:GÕ©á-&$Iĸ8>Ýc"Jà @˜Ï£>2¢•Iqž.¤­4ëíüÓ1¼ÄMUˆÞÔq;p»1 ngütQã«[€èü ñ›¶…àNˆ–©¯¯gxÿØP1‹ÈæÍ4 ¡±;¨ài2–f‡’÷JE˜6mÍ_[åPP%HÝ2ta샣gÛ=J?l r¹œPÍ—éÚQ Ì@MM û7»hYºÿ¢ovµ]=Ü»ý' #2é ög‹Ù¿8¦j†@¯? ÂE ±±S5C¦ì‡7Þ¾„ÀþÍHLŒ„^‰‰‘ø¡ð¢ÕZÚú« Ç.\;[wBGø(Ü3~æëVBMåÔ‡ýþµs‰¼evíÚÅP™Íf¨ÕjÔÔÔàÎ¥!oO|Õ…v¶*wOÊR†¯P(PTT„X‡YÓz„üjà 3Kä$ŒL鈆h4Bïò…wýÃó•ö½ðà™=VýÉÍÍ%ƒ ®]»0{öl¬X±EEE8|ø0öïßÉ“'ÃQ0"G`KÿœEB¼]pj¢¨¨(¨Õjvé)HÃ$$** éO¶£tH Ôj5zÚÎ"rf´Çwé·Ó>À«ð_™}¯Ì¾Šºº:—§Óé8…B 3öÌ'555¨¯¯Gƒ,ÿ‘xu‚2\[[ÚÚÚ î9ÊÔ‡BÕ¼;P©TD­V³ñçääx:l½Ì«¾¾ÍÍÍì^é·ºù †¿5Ÿå¨¨(„††‚΃7mSµ?Åú·§ dþ€k£CgmS D,>>ÞeT5zua6›…džŠQ:$999ÈÉÉñz …‚Ãy¢>¥ðü®Fîát ŠL|R–ÁïÃѳí3ÿ'Vñ×7ºeƒÁ€ææf\ºì “Éäó¬÷߉P‚KQA^í?¹\NdÒˆŠŠbûO3i,`±ÑðLå‡Â‹ŒùS(+ï€ÙlFëõ`ÆüK6³«gíSæOq‚Ð…Í´´´poð9-d‘#X3€ÇG¿²R‡64ò–0ÊÎ0|gŒ'>>ò–NÛv4Žˆˆ¨e òÊ¢_- Dx‹‰ánVVdAL3àî¿ÿ~öûŠ¿G϶ۥ`w´ÿ„×b ……LÀl¨ `kh;‡[¶láÖ¯_ÏÍž=û÷ï¼÷Þ{X±bͰ~½Ýõ£~9¢ÿþWšnÛ»Ã8är¹¢9sÙsŽÊ_9ê¹ñ‚mù.³Ým%¬!** ù…#ðÔ®¨Õj·h2™PÔŽ)yŸ± Jïá¨e®7ðà€,Ll¶DŒýs[ݸ tî) ›ÀS&*—Ë­˜—B¡`Hþ[¸B ÕWmmm0™L^ t‚ƒƒ½b^¬l&¨íà¹K?ʸé¸;Š2êÏOñ—®ŸB¡À´iÓœÞAÓy£ÂNzB¯ñ--OãJ¸sVVë·7óÿü®FŽÞÅš‡§Á`0x|’O½3mæsQFΑk ;0\cc#c¨:Î+×AðkîèFá-&4½æyÛWû#44@/ ¢ôË•…=íkØàN|±û8÷CáELÕ aBÀ…a6›íê°½ö²eþƒÁ*8 fœ­']§ÆÆFø™¯Û%´ò++e÷ʶÐÔÔƼB¡@aa!g49!ýkjrÏ„„cL’8΢è®lâÕF„·ð}4 nµ7B­„T*eãv•_…‚е2ùÖ#«+ása\g}Ñét\QQÏWŠŠ\ ý¯4±q;£ÿ“’!VDb„„ôUœÀ TA ;à 0v’]ùùÓïGOÛY·åe£|íÊëõz,œ»˜½÷¤ÂÐŽžœ‚¨‘-ÏNÞž¾ tH >ÕË ÎèAö÷Ï_DD„Ý @$Æ“òÂS'E`0úó÷JEˆIXú_G®î@.—³T*½%ðQ‘8JР¨ŒHÏë¸yÒ§ûÒͤ±0^íï°ˆPµL•––Ž&Ü2›Íhiiá¨1šL&sHÄé5<)Q¦ëIHgª: eWÇ:ºÐÒÒÂéêæ.ÅÄ;5ˆ¥'Xìþè=];;ÁÚÝ¿á-& ꕊÎÁw‘cØ3ê*é è¸%Ðò(CºRÕ¿Ð €B@ÈNj…Áçt:WPPàð; gºº9zºwGÿo Ô§š‰£‡”ˆRB€¹b¹S…·&§å'Œ„_Æ×“³_žpZ‡ôzˆUyÊhyíÙŸÝÊ?hmaÎlz' ð–æûvT™°|aK;{7,™•ÿÉ"wj (—ˉÿ•&H†KÐz=Ø®}Óµ£h½ì6•£ÔÂ4 ëÆÍ_;ƒ0¯mf7Ûložs°€(A¡*5ÛŒ[¶ÆcÍÍÍL꯶– IDATµ8IU‚2Ô‰X°á'‡å_–e•Xˆø“Â,È\< ™™j¨/ J„é<*Fz‚Ô.¨T*µJìÌ Íþý%$>±"dªü°aKSü£iiµíìä#TÿYš.CíçËRÓÚf|Zî_èîÁi_?+Ÿb?óu ‘ˆa q8w/̉#y©ñsió¡u ëÙqw$|Râì¼IöÌ'%Z=túsŒ O‰7—§ƒÖÒƒ~r˜RÚY:êIa¨‡ãõêÝÒ»üò€ Ð9…‹]î}z»s²Ä*oæøNòõ*-CÇtçd RUýñÆÛ]n³Aú5÷G¼¯"9P}Ž?±Ñ¿-F ¦Ó‚ö`>o¼³TÈT€`Óµ£ˆºÄ¡< Èa„'Púž>³5>³Þ(s˜›M’Åv´÷j«¢}x;Œojw;¥9Ê6~ù°«‹ÆÆFH¥RPcHú·'™4ããã¡T*Q^^Žšš˜Íf<ôÐC=z4N:…O>ùÄ%ý»ÿþûYYµ,I1†/Ï=÷œÛö3&ƒpq(--µ:ÅOÕ Aì  6vF”t>~î©ñ/¥}7HÎ]Œo¿ý–Õi;÷Bm±P Æ€BÃ?ª) ß÷…aµ;ú?ÑÒ…”a|8òÊî.Fû‚~Û°ÁˆIìòª‡ îDÔ%Î!!èëòQ—8;jÌRF ¶i]é$ áጧ ÜÖëÁÓ<ä¶å`úœ ÞoWý¡åÿ½÷Yk™ dþô÷TÍ<œ–Œ÷Ê*AÕ“·‹DtÞ… Þ8ËA«øCÛ·4]fßR@~fžè … W0›ÍÙÙ+´žöõ³+?äæ}¦P í …DGëGA(`R×=Óú?­…˜„å©3w­š†Ì 5:V ú ~®ÝáT*…§yÄ… ŶORѪÛÐ/ÞßïïÍ0)Ìž¹ÊëNÇ6¸I R«ï•±-o6›ñÅ3«s^ηzÿÅ3«0eÅ$„ÍvXe"Ô‚ü¸¥›ø>`E€Ý¹žÙîC:F[í üy¯ízëÜ>V~Ùð)ì÷[çö¹\áºëƒ£”Ø÷ß?côMMM,’>Àûï¿oÕá¼öÚk8tèôz=¨kkbb"ÆC‡Ù¥êöyªfRU‰xù•ÿØõÝÞж©±4í7Úás:ÿBm =}SFr&/ÍÂW/¾ W#$üß•W‚ðoWkFûOmv “Â,H–øàÃkýúÔÀŽ‘L ³8džÜ ävˇ îd§oÊÛÖåÍ÷ŽÊy[Ö¶ŽÛi×n%v_Ôç-xÒþ¯‰?žöóvë°%ž¶"[pG|Ïþëïè8X~RðʆÍ.ëhüæyö­Pð¤¯îÀ•—‚§u8ªK((y³«ýGËÙ®“#pvxpU·£ñÛjlë2=wí;ë3ÁÄæÜͳy¼:æ‰ÐéªM[°­ÏY:`ÛTÀŽÒ}«x[ á)ßQŸûn¹boƒ ¿µU¹Ðç4>ÀGƳ­ƒ¾_â®Tu÷8üΓ~xÓ÷ÿWáמƒQcH’DŒµÇŽsÂg{ëNr«ãbˆíú©T*ÒÑ I} ËMõ[­]lÎZ¢¼™ÈdûªU.û#44ömA~>QgdB[RlU‡0vzQQæûJX„ÇZ Oòb(SD(¯àUØ®ìV\³öK5šÐ+?áï_¦Çf“]ÕˆöIp¨2Ÿ›Mœ©Òol1Àªðl’ßÐÛÖªðl2^.ƽGvÚµo»\ÑBú.I"¶£tíMŠ'Üèôš>Þ̈CT >xúQ¬ÛÔ]u´-­ì"VÄA•ÀŸhuÕ]}Ú7·¶.¾w&Ÿu †~çÏ;|×´hDô,'âpÌB î9 ŒÄsjùÕö¯ËTM òóɺuë2 ƒx2pIÔ,²nÝ:O\£Ñ¸dþÔedu\ ™5†¬[·Ž”x•™¿$šÿ&I"¶Ú(î@×ÜS¿n•JE’gEÛ¹^ÝŽ;m~jWß.ÈÏ' òóo¹­ùùdã"«:è:Üjî@¸&~‹ß‡öÖälךö‰2ÿææf$Ïâ­ÜcsÖ’Âü‘ ç’gE“îˆVÔØâ¯§0=6›´¹ŽîDÉóÏA8¶8—˜˜ˆoÖLÃæ´ qº ?ŸŒ)ߎøƒïbLùv«±&&&âÝâ±ùÃ+âæ#F’D ‹x,¢} Lasæ ¼!ú¾_ØœµdA~>™9w-™ë<­²bsÖ’1åÛ1uð «ö…ýðv^¼…Á)þŒá ÷%Ðù ÿÓ;súLøþDWµÝ÷®`Dô,¯ñgUx6ÙW0ߊù@~Ãn®bToUÔ tu\ ¡ëÿí¼¹„ Ή¾ HôM`ø6#j {—$#=!ÁÎÅŽÒÄ ñý°Äß¶à ½ôh½O?êƒOü O?Ê3útà>W+âðŇR„ßµO?êU‚U_œá¢³ýë0}¸ƒ±ð‘éþ.ÇÜ1l:† ³bþƱëúǰaìïŽaÃÐ(“±g·”ù Á'y1ª–ý ¦­ùx2ý3vø5À©@ È#b^"qÄ@]IÔ,òlBeîXJ¥ …“'OFPPV®\I„ !c¬/“lÓÈEÞ{Pö/ì­;ÉQ柡òCš½o©»þÐ8ÍÂ|Þ® r*÷œàt:G™Rò¬èÛ>R&쪞59sÈb‘‹Ez¬É™ãñÆ¥Ì"6g-1mÍGó¦‡`Úš*\äãW óa÷%P"$JZ„Ù¿…V«eï(Kó³/eþIJ_tG´"`¬mG{›³–T-ûŠËýÐy ‰tG´¢rÏ NRˆîˆV·ë›³–ŒøôUtê>½¥qŒôÃ;íégµmOÔ3 £´ƒ×#gaA~>)¯°àð±h|ZàŠÈ̹k ÌDË$IÄD‹N+UVýØqw$ÓŽA2V‰é±Ùl߸ÂáÃÇ¢qñ«¡ÓŸ³zî.»^_áE»i¨Ãß} ßÔîæ(s€d1‡d1çÁGû$°wBaÀŒˆžE¾ÙÞt»ªimUå™*?¼0'Ž|5.‡L~¬3ðüj\ŽÍw>X“3‡¼0'Ždªx{‚41Ä1qHOH@iu5’$b!±xþ_w _|(eý¤ ?=!éj5Ò„Õ£ª»‡1þ4ßVÆWÇÅÀ±fµ¯@•àƒ{^„ÅÑï`ݦ.¨ÆšP:$ËP5aݦ.,Ž~÷¼8ˆ ks³GÚá\lÎZrCû J·n±nÇÉ÷¶c“ÉdäPd8NȇB(*ú,$EŒŽaÃÐf$:† ChK e2tÿnº7¡-¼eü¡--IqßÀ“}'âñõúN"Nıè±ÑSj`ièÁœ¿üâ¶Û§€”ò8 óÛ»ò)n~Rðû÷ïÇ´iÓðÌ  ÌÒT¸pBæž÷Ä´l~ãcñœ82£ª†ë>у7Ëx?]¡úK¥R*É9 –B—F™ Ij5e2ö\ÈH¨ Ña¼'Ié‹äYѤíh;¡ºG§o¡{£+Øq»ª¶VgdB™"‚ïØø¥ŒEÞGÏC[R uF&Z–¥R‰YÓ.öy\¡0·î…ÙX½z5NÂÞQánB|?FÌt:'©Ħ~¼J¼íhÚÚÚ Láç’V,O‡ÂwšP¹‡w¥Â‚¤>Ðaÿrj^ÇŠ¦ayšõÜ-ÈÏ'Óc³‰iýŸž"bsÖ€~§ÓŸÃŒ¿¿eŠÈ©6Æd2¡¸D‹W6lÆÅw@8ÿ°qó×8•”mI1&/ÍÂøÜ\\p~|kŠK´Hóá…Ú‰ á‘q|ÄËò úÿÅ„Ã=ݘQ9Òª½ÉK³0`¡¢¤ElþlµZÛö…}§.EŽ(g¾£ßî\ÿëmˆœM©þûJÈ –óÑ> ø«Ÿi>"TöœèªÆï?Ž Õì›d1‡4è÷®®¾ÙyÏ<Ãþ¦‰|¨­¥q|h)ž~4ÒyÖ^Õ‡Œ=…€§å 2_˜GÄ1q<3¿Éпˆ[€ Õuo$ŠFá;¸p–›ŒÁ–éÛBšo+F~} ¢1½~ü¶ ÄÜinem>þªóæÍcêÿîZ>áÐk¿»ݵü³Âwš0oÞ<ÌyÐŒZ ±êÇï#¬.ÊRU‰vš áwîÆ$NÍÀ¡4l“%IÄŒwô;W+z’"fÿ7ÊdI#÷©ÇñƪÏí˜~÷ïàjE lî*d ÿÙ~›,æPr_š+ø>f,JÄžc]°H¦Â/î+ph@æR”WX «î·ö’( $-ZŒ7c:¬¢ ý›iù1‰*誻ÿv;š››q=r¾þ¦žÞFf3?Sá} Á„lZŒôr÷§ØPv/¿…çþÉûM‹ñ÷G”uõX!%d9¢v÷2BÂm2™¤V㣉ý¤Vó)ZoÐäYÑdÑK ¤;¢ô´IëP©TdÛ³Õe:Tp5±3ç®%Í›r¨~Í npÉ|GDÏ"ÊŠu]ظ¥Ê(cr”ù¼ÿVÊ+,8&^€öŠ£È¨ -áC[Κƻ ¾ô¬ã´¶Þ‚pó¥ùˆQ¿O?¿ Jʰãå—!‰šÅNþ[Uì»QcˆJ¥bZ‰ÉBd,òǀ̥x¡¸Ü¥ºŸpÏç˜Åp‡d!6õK„­€f5&`gü“ØPvÜjÆôØl¦¡ßØf•\CT >8”Z‹ Õ¸tðŽŠ¦àË7ÿ €òޤÆÎ—_§ÓqËtc‘¡N´›ÿÓñJ¨‡cdM9Ê+,Ø°ä ¾)"ø¤ÄaÝ—!‰Ã/ÍRõWÈH‘ MÌa®˜ïÚKÕ¼ûkë ¢8þ*ÈQe¡ Bss36("ÎÚßx ˆ!GÙ„uѱ Ç)$bŽ®år9œâO§ø“È™Ñäzÿ¾xÇZ_÷ôµGeA²˜ƒÿ|ʺnºþ[Œ¸C¥X$áDW5*{Ò|DðŸß«aq¦˜9w-yúù]hÞoAó~ $Q³`ï•!—ËÙI~ÍüÁÈšPý;›³–¬ Ï&á³.ÈÏ'«Â­Ûš˜Î«¥«Õè7!=§8tÿ01*{–|7ÉÃp:^‰Áï}€“,ceÒ!Ò—$µ‚M×¥8ýûÑù5ß¶³ûqG*xWkãJèÛ[w’[<#;vìH,ë±ñB Þÿ}@ÙéÓ8ÜÝ…½¯>G’͈qØ[w’˜·½ ;0ŽÑjÊëôx¿3 kræÕq1dM΢­±à©g>ç„×ǶW!T8_¦ÃȽßÚv×jüÆaòR?$§û`ÅŽHN÷±;ÝS¡àjEûvòR?vˆ´'z5Ì´ ôZÁvþ*{š+ºœâƒïzÊ+,P¦ˆy*n ìâ6(úU®o쀙K¡Lá~¥G¹x(UXŸO¾þ’-Æâ²ÿÂãÇûÙE¡ÄµI6ÈãÆ-Æé$ãssñÐ2ž`m(; 7Ò½¾ç½?càG¼«V !¸_)ÆÇG£P®×aáë3±ñ@)*íÆGËúaí±ãE €Ÿtj¤!¼—Ùx ˆŒ)ߎÅ"=š››3{6Þ‘Ôà/?w ¡°- =…V•wBRȘÿ‚ü|²è¥¶!º#Z̾sãDXž6ËÓÆ±Ó—N§ãÂ5|†APÉV%5"zñKP±¨SA‹`*èѳœ"Á+/ßGàý·Šp­øm(SDˆâx5ðéx>¥çöU«8mI1^ߨÃÏ%xö%ÇQén¨šñ£¨?@­ÎÄø1©Rðf*¦'©PЃª?½ߤëXÒ‰².þTBçvüáX,{ø+ôˆÿeЇ¹‘*6áíêTfË0 s)¥ÖbR©ÎåüŸŽW2ü€ Õlݧ¥ùˆ±Z‰œ=ŒãŸ+L@w &¦K±f>Ÿz8·dvgðs½;C‰¡ïŽÆ!cÊ+,8·L‡>Òa™n,ÖÌŒ5óãéGCPzóŠl›z<žìIÀ êi>"‡ñZ9Ƕ³u§eèÿ¥~lŽªº{°¡’ï[­…,ÄÕ¥íæS¨ErĤè;W¶Cݵ]Ðjµè®íbîk4†ÉöS­h—öGwm\¡´Úl¥ùý¦v7W»s57º¢0Gp¿RŒŠc1€S)JHââjB©Ö˜ÒP)O˜›A.—GÂT–ò§ï±â ¨,íBîS#9ÝÚŒwü BRĸÿwÿì»ÝÎ02ÿ¿>:])üåï¼p÷×G'8¾©ÝÍ™jcÑ\Ñ…1‰*vÝWCd.µ¢?ž½+€ªiüTø´RË:ð„šµ¡Äûù/Žq'õ:«Ú\ZÞ4‡FSSc‚{ëNrE¥¼ßpQi7>ûø0>)ï±"Àï¿U„OÊ{@¿"íÇKÕQHR«‘M²³‰¶¤jžØŒÏÍ…:#É›¯ãø®]h”ÉØR•ÿtâgò!YgÎ]KþXuóŽòH˜<+šHWÁKõùù¤õˆonÇýÚX¨32±ñ@IÈæO{ ½®*TJ’ˆ›³–ø%ðHÐ}´Úš^fåâ¼4';†ÖéQ^aAWåÇ`wƬ,Ê·¯ZÅ¥ªqX§÷:?¼3Xâï‹åÉRˆ’A­Î„V[Œñ$&ª¡ä­€×üe9´Úb””·á¿³VW8ýÏî2E„Ò²Y(¯°0üóMîgµ–=üÆŽàÜýfzl6Q¦ˆþÒòµ;WsôŸ#Â_1š@kéAÊ)Ž˜Û«uˆq¸Vü6"·‚”S´–TŒ&vjU¬£ÑÈ9›ÿÚ«¹eº±Ìÿð±h¼YÖ†ö²Nè:¶ãÈ‘aúx+”)"ŒITá›*UãD˜¼4 ûß.‚ü|BOë%ÚÞà1Îگݹš{ÿ­"öýÆÍ_[Õ­Óé8“É]µ£G£¹¹3ÆÒ‘F^˜Jš››¡hþÚ*¿=í÷ 1FøÌ~`â9wgÜ ¸Q]͘È/õ^å¶€õk‡õÞᎠÂCô>dM9ëøÜ\´±`ßk0k~!Ô™X¶y S¥:¹\N(ó?f±ïš^¯cÏ…Á¬ÖmºŠ5Ÿ]ƹej¶ÿè)nw†’µW^aÁøÜ\(SD8·L5Ÿ]ƺMWQZ]}üï¿U„(8ðJàó¹)YSŽ]1)8ÜÁÛaYª¶áòÃKÐsü~Ü´ï©TIzÕäI16Õ_dQ—ü¼ NüŒ—¬ÆF×Fz® Ë›Ž"((3Ægc½Ia$((é+Ø;Gk·ýT+*FÅùvL´ôªÜ'ZºpÅ_ÊÞ=6TŒÊžA¶Åkv~ÁQk÷ŽrÛ¿ÛW­âÖìüÂáÞ¥ =I"†¶¥#|$Ä6ÿA\?ø_i‚¶¥i>bft ô^|Ìÿܧ‡¶¸)—âo~„¿}øR&.EÅÏo#÷©Çq´ç *K»ÚÒbuØÎÉm:ˆ•ÿ=‘8^-ÅÊÿžˆÿÚtýΟ·£[#¢g‘3'öpcSA™"¾M›¾éÅ©¾¬:COªfµ¢´Wë°0Y¼£ÑÈ-ÈÏ'Çwí²ª€ˆªÉ(¼þáذä V>"" __½ø»ÿ ëÖ­#5„`ߦM0œ$jÆñFå×2_Ú™KºEI¢f‘ØxIj5®}ªEjÜ ||4 ‹R™j¶½Z‡3'öX¹Ò»ýɼ¾ã0Gðx*¯Þ8©I;0¢* {º²Ó§#&DçÐ÷Ô)\:x>%=åHº©²³ué˜5†<’ì$ÏÖב5å8¯Äµâ·1åÑG·msNv IU%âíì™0§mðºáo%G¼#XCV."x¤gLoˆ’á!î=¼]jµ~[³Äx·’ß B!ŽÎÕî\ÍÍž=›ÔŠRðvʼñi+¿ ?Ÿl_µŠ[ôR©ù²ŸÃùnºhyG}Ÿ5†,ñ÷EÖŸ’QôJ|p£Ú–V+Uohh(bEè5†ð[g†UBÿd©TŠ´‰Kír‡Óq_û”?ÉŽWb´~þ >Ô¸Ÿ}g–Oƪq½*ßLÄþ·‹˜²ßE™Õ‰ÖUû±9kÉÈšr\êoMT* »> §ã•xhY´%Å0mí ¨ôÀ*4:u’ËåäzÿLMJÄ®]»8á3¿  è?l8FµExä>E#í‡_cÏ:j:‘,áO—/Õö†•¦ª|º×”)"»ýG… eŠ×>Õ²¹¢óäs# 9‡3'öpO˜»‰CDVøës# ]þeVø´*<›øfˆ°ãÐöƒ&ò#†Þ¹#kÊ1`¡Új¿/ÈÏ'£+Ê1Qyš§+8¡m eJ_Ä-`ýmûA‹ä°cVsC¿ø=$“ÉHRw'’úùà“¾©ûÅoì‰'fÆ™®nŒ®@sÃTut¡JâkP¥R‘pÓq$K|ðß]qls4¯¸†à× ýIÐwÿî?ÊáÚ͈CŽž9ƒ±#FÀr±žEä|l¨˜­BÜ#ÒýïÉþÝ›O&Œåí"}ù%»ï§BÀDKŽuðBÈDK¶Íœ 8x´3ªj¸„ìlÒïüyt †1†‰Sp¾§¹O=Ž±â €£=±å•7€Ù \ÿò,:† CõîÞ=§ÑhˆRÉ }MMM¸ã]Þnã£WK‘ÖÊÛò”——;¥»±9kY¨zÛtÀ¡¡¡Ÿ› Àµ[²·À¬V(áܾjÕÍèV|4ª û²”WXPë¾»n‹Œõäƒ<£åF#ðäü5AS“xú駹؜µ,4«Ô¸WüŒÞ¨MF£‘CñÛÎÕPu{8Äg“*­I Õøxá¨Â€×@d,JÅ™UÖyœ+÷œàT*Ù^Y…S§Nqkr@ÎÉ‚°à£Ÿq”‹Ç§1¼* kv~á2·J¥"­G,xÚk×´DÚoúwVL¿!ÆS Z–…·þœ‹¶¶6œÎ\ŠkÅoó9¹32£½š—…å鉞‚OòbL¡ï¦1%ED(âôåý+ÝÔ‹ËâñqÚ6ü ¼ê±ñ»õ7£eb’< {FFî"91­ýÿu:'nøP ûý=_^ˆ°íÙjŽ¿š±ïš”)"|õý~+üqZK$Ñb,9á ‹xú¥s(--…rÀœŽW¢¶òc,ñá-öýÓ À?œ²é±Ù„1ž›ý©s‚µ¦·ât"oÐ'dþcU@¢ 'õü WScÙŒ›wÎ?ÿ‡}UÛ «;É©T*RX[hÅ]µ_»s5×ßÁÖét\lÎ,2²¦ï¿Å?S>° ×>Õò×HÔºO˜€ Ôä§ø“Ë78£Ñx“^œâ¢@b‚çÌ¿¼Â‚‘'&±õ¼qB‹Úèˆ=A¬r Pf[¡$µ;Wsd¹Ävÿ]«á0@9”¨JÔ¸O¡¡y¯ÆíJ/|ý|ÁšþÈåeÄ3ÊTù`ó:-Λ¾äß}¿ž\€‚Þ@MkræL‘Å„9)ªºy›&Ü®¿}żð6IÆ~­… VÄ9Ô>UI|QÕÃ3Šhã|nîÄ€‡Îá“Æ|ÒÃ!ÉÉœ³5@z g‘=ý¦¥þôË»dþ@¯&“Å2@, ]Äúµ½ß8iÞ èþàvÿ~p£eG*qäœ1z€?ù_ñ—Z=xÆOËà-þožä¯Vôà*´I£âç·‰üµ@ÅÏo[µyµ¢p °°3™Lཬ>zµù{:ÒZGbÿþýnñþZqo;S¦L±¢?T³Ô¯ûÖ¼šœ»8”ZË$ å€ ˜2e ¤R)–ßó(v”¢»®—)™å“~‰ýÒÞ^5£N§ãt:g0N†íÐö…à.*Rm AõîÝ\y…‹Rq.†¯÷Ð^èLz¢÷û£G&G¸q8ØÂKl‹Äعs'cþt Žê:blj ½v †ÂBßµ —úŸ‡_‚ =ⱨ޽›sÖþÞº“\íÎÕÜc“²8ŸäÅP˜€ ߯çc±Õ0ã/¿•£â¨ªîFR‚>É‹1²¦œ'|Õ:všûµ`oÝIޤ’ò6ì­;ɯ& œ IDATÅŠ8¶~;îæµ%TP°]?ŠKB͆rÀ ½s%v܈‚Ý1XôR‚þ@Í—ýbRfðF[‡j\ªÍöÖäʺz5¡š¿ÉaP«Õ˜òè£|RDHLLÄ7:¡ùGmlazl6¡6ÂùwfÉ»·î$7Z¿ £õÛp*qÆ$ª0æ&ãYSŽðKw‰9+æ_¢ãC =)¼m߬)Ç7µ»¹‘5å (¢jvg`4ð!\SU‰h7 EäÌh+aÙÕÞöŸ1A{Tøë¨éDew%¢øa»ÿΜØÃTǶc ÛÖÃ'C*•"ˆ»ÃJ}n‹¿B+Êü§Çf“¡w®Ä½yy˜8TþÍTñLµ³ÄÚ­”î™$‰Çbâ0åÑG‘6q)&ÕàTâ"+æO¿§e…}¡š*m{'¢}}°ñBËÀ…†C*•²ëgžt^ut±ÀÿaïÛâªö¿?{`¸ŒÃ ˜DH¹hIiY¦)çØU‰Š¬£©å!»Yš?3²:¥' oÌsHM KKD˜ñ)(â%œ‡Ë ³Þ?6k±÷\«ó¾ç}~çû<<ÌÞ{­}Y{íõý|ï¼Æ¥¯w'¼ŸhW)*:ÌxÿÇv¼æsKjk!ÿéÏ÷ gTƒENs]ü_÷”tkCH¤x¦þ:Ž™{̶fP p²ÐŒ’ü|¦òÀL½‘N§ã&Mš„}UUxú¯ øü½BŒ]¡Â¤I“úìKçÖýaáúCÉ|r3¼ÇI{õ»Ub«‚­W´ðæ-˜€™3gÚy?;;©Ÿ±W8,ºïe”äÛy0:S8€‚Cïõû)i/Ó¡`K1†ýÜý F§õª:¡v}ooo;²³q’¨¹°T”ãÅÉ÷ôùÌðÍ¿^çBô_ µ‚Àßß—/_Æõ–!¸²? ¶R{oÊñêLº€ø<‹ ~~H;ö™C@±®Qc]ñõ®_¸æüuXÀct%Â%B9Þÿ¢å„ŽÂØ~/QÔo>]†ûþy…›B¬.cóç6H¢æŠ¢6lšÜ'zÆ(B™úœÔ<;ßÍŒ.—GØüS«Õ,ZC©A‰2­æm%"n;…tÊÒ…YÏÔcÅs¨´æ4I)61 •’q¨´Ìz¦³ž©gQ ¶çòy"–©omÇßÑB6-4„TZ NÖ‡cD¹êŽ˜â¡ôW+ÌžÇ`m 8rd$žù[]ÆÑ“[J‚·z}[šôÍG¡o>ŠæüuФ§÷6G逘±HNtÀ›­¸~º çb¾/ý!Ñ•hÞV‚+û³päŠúæ£Q®gó~oU+×WuAÛïªS¿«ÜegC®««ãd2d2™ˆ‡K8x*y‡æÓ\ßåÀóufÜwÛ –º’0jÚŽ{¾Îl×W8*%ãXùYJÊ´'ñ°›«¨­#iš‚ˆX7($üýýñ°›+æk«èqœuä G©ÆláÂÝy°î.u¶z£7Â|ÈñKíw—2€[­ao À…ŽŒ¶D¿j¶»­ÍNÞ“J×Ï¥g,M&“Ýw# ç£*þè)b“’P’Ÿ/ÚOÛ÷¸¯ª ¾ã\`8jAÓñ.ŽZpÌë|¿ü^T*•hþP/Nƒ|Lß¹n•† @}· ²R2®_'4™LðTjðà ëkK½y“ ¯?âÁ¿ºtˆï×µ…ç‡sˆìö¤¦¶¿ÞH(¥Ä'ÏÇE…·yÇ)KNpý‹Ã€ã’G©†&=ñÉó.á<8ÓÿÔ?ç°Ô•„~üLõ  mÔhüÅâx!úz×/Ü×»ø”»‰ã½á6f ŽÞÀs,§y†h9­GÁ–â~?GÉ6i‰±…ÝsË +“Zú³]9 K:¹û G+[Owá|D ”q»0êïÍ›˜„ŽJ~ø,CZPþ»CæðLëË'eHšÇöQÞÛ3D¹ºà«N ¤Ñi˜ãYB"š·• ÂJ`*,`Z€c *­Ùmv‹èýa1{>%Ëi=‹èpäȹ÷lÆÕaÓ+ž(ýÕŠMßcÓ÷ÅŒùÀ iNt¬þp0މON”8L…ÝÛõ'͟Ы#)%šHê|D ä3>Ió›˜ä@ªT*Òu»ò›SÁqxjÝhÔÕÕq-窹öc¦èÑyýêgË ­d+˜o:í³÷lG}ž€é_¸MÇKŒö!Ä”¡ûLe%¢<”yô<ÿ Ž…Ÿ}|e»vqŸ}|”súÝã3ž­??—L…øuòçe§¹[&û";®(¼ýq+[© /$gRMÂ%L\¸ˆe5+)ÈDzÙÿÃúõæ|&º~©Ž À­hèÇ|ÞÂÛ?ÛËx Ò—D=ï |¨âíE|ü¼õÔ–>¸J¥bcCõ¼îÀç Þæïu‡Äé9hßéêÉ?ßrÂʤaFoã¯R©Èsñ|éešƒûŒ¹ úæ£ð]‰ysìÓƒþ$dêôýu¹ŒÇ¶Ø=x¢äAhƹ°Ä5Έf\%‹¸¨0»®Áüãéxñ‰S0à|D fΜIúŠÀˆñOºÆØÍ_ªp4~ÓBCeþóL@9!Ø?ïC|W¹‹«9³›ËßZ ýq+dj5b|Æ3IKXçàÁG\ø4o+aªôï*wq4¬ÌrZï0ö\9 %¥ØôŠ'¢ýµ¸dø†»dø†2&ÍgQ&?÷„3Ð7u(~W¹‹^ÿŒ¹ŒÀýó>tz}€ÿ6¨íݰi¨ àµ*ûç}ˆ=«WcùL»þžJ T÷²<æB-U×í\;ÞvK 5ãÄŒãCáú“¶÷÷|BŠOž `©#pUq—p½ö}ðD.WT×ÙlW¦ø÷±ïúnÎÚ@м­4TÔ]x|N·ŸO-'¬pƒåz„r<ø:üqD¹º8”†'ª³× Íà!X æ»rB@£u~þG¶ê»0'†ëo*ðþ’h„¥®$BÚ¼­§$ãàÆ7£ ‚3$N#N‹õ¿ó1~B8E°bÇkN'žðúÔH¯?'Æ[õ]½FQ©T„:M½î©$M=€y•Ú–õ|qò=З–â46C€¾+Ù=¸t)0‰àžæm%l!²5CPõä‹“ïA’ZŠ|Ÿæ Æg<ôÍÏ­UK>m‚^ÍÇÉ–”äã_ó¿ÇŸÖÝ‹ØØ$¸tÅK ßaÖ3õNÛù÷$>ÇÜ<)š½I¿gþ ‹ÿÐ9ôxÑ{ ¸ÁÊÛªD…%ÅßÇ7|ƒCõ»ñÿâ™éøÛ±v%¡q2-áqZbàÀ§¦çžcZˆœ,|êVRXx}Z*ØQ)`ÛEEb9Àª‘ «¬9«×u».¿*íž àÃÛ ƒÑß:Ž8ÏQ‡§€Ö™{-åý[¾?! UN'‘·KX¸”,u¤ÇÉÏÑd?ÿ`_ˆF ¼•ûµ¨?5™¼¶à¶—âØ3œ%ÀðŸtøs°6ð÷$ñç éZô;¢€€4\Å ¥(  µª’?-ï`EÔ„}mÇ1Ö«²È6ÝÄ¡z vAœ›²M7íʸ ûü\¡^÷áîRŒê/ª[pÝSÆÂñ¾kuË÷ÛW9fJÔ)­8dÈQfVahUù»þÜÌJS²­gó{ˆ>ƒÐ_*¬¼;Àƒâåú^#"~ 1µ½ê=<¢\/º³ûz]iÿºø‰:Å…cýc"ÕøWAÌ8‰CП럈ÁˆïÿÇáõé9èïŸñ¸8°¸Ä°Pz.gh;‘ú[‡ÜQa_gá_Žú½8ù|šÏ«{Õôž—”h·€Ðþûö¾üülk€ÓzÛÏÅGcý±“(8z£ßÏÖßgoÜ íßk#‡‡f š7ÛÓ*à¡á¥=¾¾ ‰õsT—ýVʸz &Ã#ÇÚ9ÑÑë¼:ª¥¢ýŽ@,- 5V†ý-ýþë÷'ì«äîí¼]‚Ò_{ÀDd×~»ùCû~1r2Šêº°î¦ãòÌóô,îënj**ÀX.ÜÅkO©&'¶>cL«Ñnàüá…&|Tc€fðŒpÀƒ€j àü9­¢JŸcá`žé´ðI{hzØÐÌŸÏö½ ëÙÓð? ‡éz˜nbÇầÌés÷çûŒ ÇL؇Ëõ—d2är9¼½{JÏÓª´@Øk“qhm‘HÚ·Mãî Üjiy>j‚g4r¾c“É„ÛÚø1¶]~/9\„©ôãˆú’‚õñ˜H5Ë'p«ýûs}Ûs ¯ ôÏ~x«/ÍYÿßÚªí…ö¬[9ßï©çý{I†Í®¾åk÷õþûzÄüéë=8ë¿|V8¡ ü£ßŠjy é‹Ew²ßó>×±k÷ Ào©§ÞÛèoÿß2?l¯+¨a…ãx+Ïðëû£}) ¾ŽÈ™ð·FåÂ@€ðÝÙŽEîjBôÍG‚2¹š›š¥„/uaÑ*_îÑ öö€cáÃYg XȼèvÜïå?ÂëÛnÛŽ‘‘‘(--uZ¿å ©V(db€‡ê%,rƒý~bZ rÁ¡zI¿B›ÿKÿËéßYö÷¿ôŸIÄüÑïzç¹¹¹¬¿Ðk9;;›äææöZJ:;;›dffŠŽgff’ììl’Ýë}M !‡çá¶£(‹ŽÃsíö«ÕjB:Ÿ[IIIÝ+é|ºÏ2ØÓBCÈÞ¨L]ŸïíÿÌ}µ±¥ÞŠ/Ù¶sTðlù¬pòãê‡{½®m‹ÞŽ Ÿ}ù¬pB9 ¤…’l÷ ÿn5à¿ôï§_™¡ÿÒoZþHÚ·¬ãÿ5ƒô7òAHÄýÒEÒѹþ%ÿS¨¡¡pÒ…L2HII!ÙÙÙ¤ãð\ÒÐÐÐçsçææ’ÔÔT°Ïÿž‘‘ÁcöìÙÈÍ͵c@ÙÙÙ¤ººYYY"É$++‹+*â}húú¶ü’ȼzŒ‹ÒºD gZhÉ/(Cîç ¢ýÔ6[RÍž{ß²Fì[Öˆ””’žžNàÇït:¿hFHª6ruÁFeb‡‰ê>Œpﵚ½ f€½1?µZM´aÆ7nÀøî(Òy(Š…¿Òw’÷æQª¦ƒvDÅ?ÔàÇÕ[ ðzøhrýÑ ²8Nì¨FŸ[WfÆ|÷6\4ˆåÒŽB¡ Ž$|*¥Mž0šƒa2™~³Êþ¿ôï!BFzÔ¾D˜´A¥R‘å3ýɾ?þiŽÊ-¦Îð%½Å÷F}!é£/ÉÇ–ŽóìµýÀqždð]}‡åd­JŽš°o™8ü¦/ ®¯ó¾•:«Oi-§¡¯7ë ¤§§“ßSŸ€¾¥RÉjy ¥¥þHX¶DsÌzÈyò¥¤¤Ý»wàùºŸ²ˆV«åvìØ·ñã°{÷nóGÄ™† 77—#;;›1šöI)˜={6›3ÁÁÁ(**BSS“('y 8 Ef¨ònŒ@L8‡!o³}ú Ò+¨­­Å7œ‚”¾æŽN§ãRRRˆåN$g.Bræ"Xîôa‹%­v–’’Ò¯r´Ñ3F‘‘‡GÕò`_Íq¿Ü“Ðb5ôOžv«$T½öEÏ=÷žy²mÿ%Éý¾ûÞ=Ñt6yâZó#vf:¿Q]]ŒŒ »ó«ÕjRTTFƒ-×ñÜsÏ1É›2ÿœœ6¦¡%#Ó¹ƒõ§çv\0¿  ?4ßͶÇã¯kERRÔc Ù¸ÕÕ¼o‰°#²@ 6~*Áïž*—ÿ,j³ñ³(‡m(sw‹æ™?iº† žJ|Tc@çöïÞV ’’Báçç•JE(“‹Åð7—‹l¶=Ș`Z°`1cÆ F¿‡¥K—b‡÷DÀÖ­[‘——‡Wîái¯<ðšè^(SÿÅja1ûÂÿÓBälÿPÃ4Ëg…“i¡!d¾{ƒi¡!äOI°8ºt¿p|¤Qn¢ý”†*§óÏä9ްßèñPÈø>—nýü(==¨Õj¢Ñhn©ƒx‡ê%x»²™£ –1+޼t·‡Ù½æCzKëXWWÇ?û¹(ο¼¼)))$33“¬]»Sîj„J¥"ÂÀ–²VF•JEöýy0IáK ~œ]·óP”èRRRHDD qò´/ËøöÎ;ïÇW­"T’OOO'*•ŠDFFbذa¯«R©ˆZ­& X¸p!RgøµZMß Aff&Q«Õ$33“Ì?ø®ìHÚ§ –z îJ|YrÆíWŒt#îJPæÿhìp»6¶”»»‰Ów]ÃúcØ>¯8RhUW£ôëþ0lÑ‹øuÿÈÎÎ&*•Ф§§Z¶è ´­‚FÍ 4ñ¸tœÆÁã›!µð¡;^#ƒy§&篃ÞÞÞóDPí@o @­VƒÁ€óÇ»°åá÷±åá÷aÐóÔJ¥g ‡šG2ÒƒŒäøÛh4NÁ¹ª=NïàçŽ^®Ä§À§€:r¬W»ëÕŠX¯Öž…x¦?qKoKÙÙÙ$16‰±‘ýÖ"Ý}蠟§“õë×ã©gOáñU«ÈC¯OAÞ›Cp÷Ò¯¸ŒŒ ®4ç\k~D4ŽJ¥MM|TBcc#ÖîÛ‡öI)0êJP]]öI)˜4ijkk±åZ£èšôÞ>y2ŸhãÀ3¸ýMÃppm5***Ø<¢GßÀ¹ÛæÁ}ï ¨ÞŒK¾Œ«yƒî] €/5›¯kÅï\Ö>¿ Ìᘖ )¦ï|lÆ‘‚$'záàšANÇmZh‰—ºÀ-šOä3>ÂÇÚx lNiii˜BEËàíÊ4B d%Ò…Ò~II „‹roŒodã»(Íá³ßM˜À§ï2ûÛ\ÆÚQÒ•^Õ„Ös ¨#‡±ÿêÈaЕ^Ä/V¾’*W”¤Qn0ŸêdÛã6tAåi”:Bm€4ÊÍÎáÐ@~‚B¡ õC®á¶Ž}ªœNlŸUåÇA!kÃ¥›E0šƒo9;à ý§—ôôt¢Ñhÿá#ýnOKžq ^x ¸ôÂjèÊz&ò´9y»²™j€nØôtæü“»»‰£ >ke9xð bbbà§ø›7oÆëêQWWÇ…‡‡;ôBU©Tdli#^œ·hwÄ©‡BÍ•aEé[HáKŸº‰íæÛ@ÍZ­–+//G’¦“ylþü8innÆ?? \´ ¹¹¹$''‡«««ãrrrì´ôÚS§NåÅú3*»ŽcDèÓÈËËCĹ»Ð1…÷ݹs'†~‰ŒŒ Ñ9(³.Öz½^Ô.33“8“€#݈›²ç£JøÆsÜÍ+ftzlt_–\px!mØt ¹»›ØõãÔ|x΢ä@»¶–Šröÿ×ý?òòò°uëVÖ&##ƒs Àí“§Ø=?UùS ÿBû9λ1‚¥@önŒ€¡} bì_;#NÇÙÖ™xGëGhµZÎP›?À3³P£s¿z #ƹà¶Þ^j¹Ó3ç{ØiœÑ€±ˆqG|Œ;öŸýFzäˆ(Pž¹*¿È.~}:ïo}WΈŽoAI©ÝX;¢¦¦&B£Ñ 00ÁÁ˜àç‡ãÛ~Á–_±î§,¸†Ý»wcûöíø±¥YͶæ7¡¤¹ u,Œº(Ô±(Pò^ÒJo F³¶Ïo*ǃ6ãmi¢–7`žf2òóó‘òw+cþEEE"-e0—>|®aR ºw%Nvù!)) IIIÈÏÏÇÐÅïBwZÉ@@pp0Óèt:îî{÷‚ùh#ŽðYÞ’bÚ‘œØ“úöîûjØoZB™’-3³V5œþ,ÞÝý ÒÒÒŸŸJ±æLh ó3&&Fô½Pß@%±`Áѹ¨àHa’ÜðõõE~~>(ÿuÏ (áÍ#´˜M"ðác£%®,ÜSú‹Õ‚ÐzgøÛ }¢\]à¡ñ`êý(W„I8Ôc¥ˆruaR¿‡†C£€@˜gbb€S.Õã¼› ä'€Ñ %w-Ç Mý‰ßÿO$£ÑÈõúú£ÙS©TĶüµèš—““ÃeddpÉ/qAÍMÈÎÎ&éééÄ™9@H%/ÙS©Dhxþ¾.ôò™þ¬òÖa>¢¢L5++‹KáKÒÓÓÉœ9sÌÜŽ5kÖàüÙÏñÀL~Á¡Ç=ì‹ó°i‚ 6v¶!FÒ‚õÅ7Dmþõ¯7±v\>K·ŠÌuuuœÂwdj5öìÙƒO Ãá§ø7þŽG]$0Îx9–.’µ2Êá€Ð³¤¹žaÆô¯^Ǽ$wŒ]¡ÂŠÓ›à9§³]\‚E2ðÏÝö™±²²²8[‰?00½¤¾LîÝÒ=à˜¹›ê-ÜÄaž¸r©_–\ÀÉo ™Bç¡$¦vŽ+Ê|ý·þØD¤Û§h^Yñ ÷ëþptÐ`|š_¹\¹\Ž+VˆÚi¾á!Q_*Hÿ|5€cfK†o¸Û®Ñq[JII!Tú:oiµZN¨p–IRª³åá÷q^}ëüñ.ì\×ˆBFz””2’ãpLß ›Î蟉‡æ•€”—Ƴ?J‰±‘ÐË•ýŠáMOO'ç}'aДEý²ë¡38YYY¨­­…[u5w«å322¸ãÛ~Avv6ó  d0ào4bí¾}ˆŸ…:£ÎU£²œÀ¨+QW‚c[ŠÙo£‘1$ƒÁÀÔú999܉ ,ÜQ“‰|wÔd¢~!Ï,nnK@Êß{âém¿õ\东†½kÞlÞ¼ùÝyØ÷®y{ÏVqT°wÍ{ D¨ÕjòjJ ÌGKp¤ «´AÈ×{ˆÎ¿J„}Ëq÷}HFàH\KHÓ5tž´ ý_uø¨Æ€ä¾Ã‚ ŸŸÏî×ZŃ˜÷ŸC¼[‹È ½^ϘZQQ,X€Øîdd&“©g)éI×,ÔB½sàÛ¿téRL˜0¾¾¾€ÒœœÀkŽŠÁµý‡»Kñ‹Õ´”„Ì?´žc&!Qƾ8º›Õ¬ëð„ùT'æ»·aqt‡¨ Ø: ¾à2*‰ ×ÝïíWH«q©óîÛc d  rÆ …æ gDÇYh†sÖæ$…BAh徨/i!rQ0[ °|V8±²œ EP3¯Í{dT(¼»ZÒÓÓ‰˜JT*ùª³ º2~‚&i:¡+ƒk˜…e&¸G¸AWfÂa>$u†/y»²Ù®GJJ Q©TdÿA^Ť×ë±ìÕ$,{•Om§ŠÍ›7#-- ~Š™™)òJV©Tä⎌-å?°ç⼡·z!N=1’<úá%˜ sðýcYHù‹&ýu¡è¡U*ÉÍÍŤ̗ñíÎG0¡{úå| *++1:. )i,>:t˜¼óÎ;"çÀãÇcΜ9Xpß}ئ«k¶–àýa IDATÀÛÿUüôüiÄ'Hq¬;/ôÄñåp«ò†&ëOÕ²B‰_¥Rªx€ ×뚀JÿW.u"˜sAkù@DOWª x#̇Œ•¸öšV5u†/9Rh‹óy€²ÿ )))$kåP&!çînâáðx+÷k.00ÅËfffÂÖ/ &&Æ!CºdøF$ñ«T*2Tp§C•ÓÉåacER©T¤¼¼œm äääptnŽ\¨mßr§€ÀÝY¼Î*¨­­E¨Ñˆ™ó=°åá÷q$ëo,»%ê;lx"®{]Æ9BpŽDFÇHŽcóÖÙØSª««ãR^íûG±âáϰâáÏHyi|¿cÔ5 ¾;Ѐ¢¢"¬^½º×¶4ÏüÆ$¬ÔÖÖ¢þŸÛaØ´ŠåuÏÉÉáwKáZ­–£ƒT«òæc!Ñp£ÎUãðáØ8´•å•åÑŠË(Ûµ‹+Ûµ‹£cÖÔÔNdz9}GM&,X€ÖÖV|óÍ7€O"++ 7·%`É’%ðóóiöž­ât§•¸œ†ÊÝ»ðå¤wî܉eË–aÙ²e¬íÛ•Í\’šŸ›sGˆÚ)hÁ¤%“Ø;Í×{à͸o…´Z-w¤ û–5Â|´„©ê)ó¥êþ÷Ÿ, RbWL<ÊË˱dÉìܹOxæûnÖÄ{ºÛ9¼¹“Ò‚ PRÂ_K°m:þ¶¦¨äwäææ2`«5ar¨Š33P&¯+½ˆÑW&ùÇM ‚Ði𔥠íEü³x=Ëk‚¤QnX×Ŷ×uxb]‡'k'”üýýì9ò“(ŽÝhò„Jù+¾¯Þ…{ǾÍülóPb ›4Ú­Q*•Ѝ#‡±$Z¶D%f“‰çWê±2¨ÇÊðŒO–Ïôg`à0Æ\‘# žúuÐÿ¬v}&X1n¨üýý{Õ,ŸN t¦¦0 ‹gïX9 ééédù¬pR«Ôˆ|n(%-ÞŽ_ÔÖÖbû™³HNâ‘Q¡Ðh4ÌT ì'€úkn8T/A¬W+ÂΔY-X¬Ž“3r‚QÒ"Gå(å¶×Ð#‘ÅÆÆbõêÕLŧŠÑ#ôx`ævèõzlÞ¼ÌÜŽ;w"!!wJûó`òâü¼=ï"fß‚²H?è­^ø`]=qêø0ž<Ü…·ç]Ä ¡ïØyé?¸t),9Q*™¤¤$ø-=ާçtâpc#¼ý_Eãêqø%i ¼áÒõ„f£çÏ~ŽeË–¡V«Å6ýÌ~í5¦*yTR†Ï·ºáƒ¿å!++ËÎ@$•øiRŠ’’¶(P'![aJW~jåN~cà&óí4v8¢§+‰k˜–Jˆ8“þmUüF£‘óñ:Eɘr×Yfb)ëªÃs‰¾výéxæ/ô  ¿±±Æî㪜NnøñÏ4j‰Ož6C®_=…BAnø•c(çy óÞ§¤¤Ë—ùd8Z­–í/-µs¢ Ÿªõ :AŠäÌE1Îîe¼ÄwV¡€WÒ_j4ÂõçfÑ9BFzaÃA8\¼P€›e<ƒ Îñ1îøR׎ýg¿qtë)å¥ñXöÕ³HŒ„öý£(()…ö}ç N„”žžN¾;Àg}»Þ2Ù›+zÕ|ñê«\NNgÍKÏ]µXþõöøQ;ú[¨P«Õdýúõ†ŸŸÑ P ~nâçÆ‰œæt:wðàAÆô…Ž} ,@mm-† ‚ªª* Ó= Çž ;wît‚ƒƒƒQÙ‚7LÂa„ ˜3gV¬XÁ"„íSŸæëtèt:n•6“–LÂSó¬L²OŠá™Õ«)5¼óñ«ç¹#-ÌD@Uè{ÏVq¥¾þØà©ÄâÉ#áñ'šÝàçç‡+V`Íš5سg2<Ýp¬Ó ‹'DBòlðT2BíÿBí¦Pʯ­­Å¼yóDÏK{[æ?u9?ïSSS‘›Ë›;BCCJÿÔ¾i†23À«ù­W»ð‹Õ‚ÑWTkç„á‚” Q†Þ^ÔŽužø°¸Ç$"røjo~]ÁúÒ• Ç|c4£ãZ k߃ÑhäZ[[a4ósbè€nusÛq®°ö=fp„)ã{.Ѻ2ï;B–Ï 'Ëgú“ç}ñæ×œ³$F1­D»J±p° NZÌЕ™`©4ƒ®Ñ®RÄzµbC³»C-œ­ÿF˜cø4Ó3>˜`µëo4¹½U­ÜÛ•Í\WÇ@€,ŸN¦…ȉ£tÜ0Áû*RRRˆiXŒç7•ãÀõ&57A£ÑØio%Tm0°¿X-øª³ §ÊLxoSJZäxlCžK°"'!•D*(TGdff’ç ¼¼<òòòòÐÜr~9ƒfnÇ·;Amm-¶nÝŠI“&aÏž=سg´Z-·±³ źKØÐìŽ]Ký0¶´‹’ÁL}Ì£æÌ¥‹qõÊ.TŽâ¤éd¶íÇW­b¶û¤¤$üøñǘ4icø°j÷nxûÿš³gиz2_?%­VËQ¯ÿ5kÖ s{2b}|0&ô0Ú¶òÇ’%K0ý«×‘™™‰múvŸMèâ óæÍÚ5k —ËùÉÓ¿ c¹»›¸±Ýð•KX_RƒGc‡cWW\Ãz/ʱaïôwß wöÅ©àH¡‰“É„ý-v9á©eÉ’%x§ÀÛ'OÁŽ;ði~“^† "©Œö½áW?×1P(ÄRG ¯ ˆOžÏ¾ŸëQ{Û{§ ¢­&ÀöxoŒ0:A<>É™‹0xn4¼½½1÷«—Ð’ÿwvŒ2h¹é’’”–^ÀÛÿGr~øÉÏÎùOX²Øý¸úaB¥ Ç°ì«gq÷Ò¯ú-ý=“Ÿn9ÒŸnð÷÷ç2331bÂD„»Kaogï¦$4£#"ôz= (Ô±ð8¨…QW‚öI)" *ùbÓ—V«åZ[[1lØ0^ Q_ðóóCFF÷óÕ4… ¼`ïš÷z*Fv‡Òk\úðe„ÍxÓBCHÊ«ç9ÛT¶ôYlâá|á›WSj V«ÉË;}1i‰}]ö½g«Ø9W6Þ‰={zÞyR¯Å<2å~À“:ûJrÂïÞßß©©©ìMß»sçN„ïD§Óqôj/Žv`õêÕHMMEuu5òòòXûw\ë±ÿ«Õäͯ+8Ê(6ï9  ÇögFK\±·ª•ûqõÃÄQ®!Sו™1®šÃ‡Å.lv/ø3w‰œ))¤Õ0ŸX¤Cáv(¤üœ¸t³Ñÿ€g’Âh[-ÀÞªVîͯ+¸õM(i‘óÏA®BWfîÓo&Ö«’A.¸2þ!lhv¥/Þ¼· '-fœ´˜Ö3Jð »`Zˆœ|t¥‹eaœ`Ås‰¾8i1÷i³^í¬,šGWzÑißôôt²íT'“‡óÅ€è\QGckvoÅô´Z-'Tñ×ÖÖB¯×#9Á1ïpºÑXw>ñ’9b½ZqÒbF’†Ã©2 ¢+Íx¯² ]è(·"á%NžèQŸfeeq)))dêTžÉùx@s ïDV[[‹’’Ì›7iiiçÂÃÃY_a¸Ýc›`2™°°Ì„„±2t”w"IŒ-uÁ²1Sq缄'tls«®Æ’%K ÑhÐ^¼w¿°üüPTT„Ñ«ÇáÇuü"ô#€ƒ¢Xw 9–.’îê"JƒLmÝ7þlý 4 žýhF‘¥X²Ä‚ÔT7ÈSQ®KrT ¢@ÝLÄ$>ýôS§j/! #:ºþ>2žÃ@… ʬ¤Îð%ÂçwD ’ùú%.uÆM²þ¸á¥{†8dþ€8]æ'O'OaæÌ™(//‡L&ÃÔ©Sq»Fƒ§+ÊY%<ªíàL&´ÉŠ “Éàrã4®·—£´”gúF£‘“ÉŠD~#Žî9==8C¶”>,ò€Z]Î?Ì8 p²ÐŒó뺷F ˜>-ùÇÉB3\!fþôþvbØp¾§7wººÊQp”÷]Ùö§eˆ—Ïô't‘JyiÒÅÏÏ&L@n.­@¿w!HMM…0²†Mþ‘éÛ±{÷n>Œ Þcδ½í3¤=Ê$Å÷\ÆÄ+FK\™÷¿ùëJ/bù¬pòæ×œùT€‹]Piå×s¥‚j¬¬­4,œ,.êÅ—ÆsQH«Yê_…¤ü¢c¿gæ°ºº:nùL²¾  Ï%R•¿(½è4UõÞªV.==äååA.—㤥§/´C¨Â¨VN_hǘáxƧo×Ù_Óh4r{À^ðá¼’A.xéž!xÿÀeÄzµ¢’¨`ý¡qS‚íz•Ø:ÃÛ’:rÐý.è;áÙE;õ¿Z­&µµµðöö1þZe ÛÞvªÓnÝsDéééäðáÃlîÔÖÖb„ óäz¬æi»ö,¶£®®ŽÛ[ÕÊQð‹Õ‚ŽòN´ÜôÆI‹ÛÍ·A&“¡¤EŽûþyÅÎ@«Õrµµµ=Bü"7ÄÄÄ "">^'˜ÍëÛ°\Ôž*Tý¾8?;îõ‚×cÃP)ÁןÄÉÓ¾(,3á£+]xìcò‹ÜDêÿ¼¼áƒuõX²d ŠŠŠðDÌyä¹A&“A£Ñ ²ÚyyyX±bæ|—ÝÃÖ­[QTT„ˆˆ6©‘‘‘ÁêTS/XšÕÑËKáËTý­­­À5ܼbÆx¥êŽy"¿È ½1ÿ¨±2‡ÇO•ñãVWWÇ9cþ0uêT<ewÞ+V°çÚ±c‡] LÖS䣮®ŽFÐ~uuuœ§RƒøäùÎn¥¥¥N%|:ñEÇ`0`d+ïé?bœ n~s.Ö Ìýê%XîôÁÍo.à»gKpó› 0 ¸qã†êµþD©&à†q0 q¼7Ç{cëÖ­N™?ïoõj>Úø-  Ú÷2韚ú" Frss19¾Ù+UX¶0é\IŽˆŽe®5f‹Hè‹t:—m·: 5¶c'dè2™ ¾¾¾ˆ‰‰Aňl\¿~1RzœªE…ÑÓBCÈÀ¤dÆüiÒ!Ø7`$`@õfQ’ !Q/êý_[[ ƒÁƒÁ€ûVø!9Ñ J¥± 'æoruaEs’¶oFvv6sD¬®®Æ¹GþiÎgˆw³×çcnn.RSSáïï/ʃð@ 77;wŸË@™¿···HÓB~=Úþ…D¿i]éEX¯v!Ií]¯Ãzµ Ö«]-qey¶uKðÂõ{]GÙ1LÂᘹ Ò0 Ì•¼[=VÊ~S¢š–íÏhäà9ŽÐ„?ô»—Éd0Ÿ Ì Ð©T*®$‘Fæ\Ò"whº¤D#½žˆ4¢’¨îÎK½gTƒî.EI‹'-æ^¯}¿Ü“œQ FI‹ºÒ‹ð÷÷G%Q±ãÛNuözÚ_Wz•DŇ«]L/ÔÎP¢~8:ŽkmmÅ„ ˆ¼¼<444 ¡¡íëËy1//™™™X¶lè¹rssÑÚÚŠ_»0jWúcZˆœ<‡ Ž{B.ä¨$@¬W]we± ìäÕIE'´(˜^¯'111ع³3gÆ0-A]Ý)N¯×Û=D]]÷Á:¼ C›î*ÖJùú)N¥R‘„ 2œ´°·ªŽ³•€iU3Ê€222Dí??$­Ê ;j„tíèQä*£åååS§¢®Ž_Ü–-[ÆîYh?¥÷àççÇŽ+ ?/D«½Å°óN”&`€Qнv»¶É0V⊱ V¼¹³Á)⟹©3| eötÔØNŒuñÅ›_Û¿8:~&“ ·âÈ ÁìXkk+™*6''‡ËÌÌ$BéÏŠ¿áWŽ Õ "t ´Ô”Ây@w Ó1R*•vê/šüà=ýC»#ü®xáHÖßìï«{¡2º@S»í°á‰"ÿ ÛgœõÐhbHËœªZø¹÷áÊoðÑÆoE×^>ÓŸ8{‡¶ÅLrssÓïã`NN§Ñh0æt²î§,2ÿ®L§ç Ò¤R©DØPq3:¾•åñjð à ãŠw …‚Ì™3ðññÁmç3°·z/Ë‘‘‘‘ÁÑù–ššJ4 ´Z-cþDN‚Ž|>ª««ùœü6ƒÁ€i&$'zaÞ–µ¢ûçûVØKßÓBC­¢ïéŽ žJ 2pðàA\Uðïö¾›çà&…î´R@ïýÕ”$'zá¾~¢ûS«ÕäÝ™MÑë?ÓfÀ±¶”úú³s;ÊùÙÔ€…AJé΃@))) ~~~˜:uªÝw¢}gcú¶DUÚ‹ÒCá¨0õ¯®ÌŒ½g«¸×ÃG“S–.–#€½g«¸å³Â mÇNÒ­úwV¥N¥R‘ºÆîáÛ6ŽJ:} ŽªRîwtÂõ®/3m_¥ä'XE¥¸)p %¹ûR¾¶ßþ­|÷¿§/ (,<¡×ÞUu®ýw1Üÿ-ÔW>ìþ¶éï‹uÔ÷Vú÷÷~]Gx\¨M°"}õxoËÜûê+$[f/Üß[Ýî9sæà\Õž>“ýüVêëýÓ6¿µŒíÔ©S¡ÑhPTT$2ÐE(55Õ¡0%!ó§Î¶ à50Â6ô]Ù.¾ôzBÕÿ¤I“ì´aZ­–£…h„Ë•ñA£Ñ°Øá}Ò¶D %%…™? ‰ôùö-ã½¼Ó×D6ñ [lI¨¦ ÄØ"kúü‡v„ ˆ $ÂñÝ9E…kÞ9p ³gÏfcèççÇrL]~™½•Jżãݳðû‰õjídxºaÚ©rø‚ºMýh_¡§»ðùlA0À‡:$ü=ýÿˆRØ¿õ>þ_ÐôÍýo¥ß;!…çø#&à­ÜÏyÝßBΘ}o àÿgêmá¼Uð$Ԣ؎ÍhËü…×±•Þnu™Ž£cÑ.p “"I-Çß6»`ïÙ*Ž2J«´Aµl¶í(2u oBð¢{ºY8¶ÔŸú톬ÇH‰µ Ks{Â$) ¥´:•גЈ’å³Â»å|±¾ I¤Á³%Úæ o·}½p¿p»7©p<ÿ­eÿ_ú·Poe:o_GÅoþÓèõðѬ†¹°n¹ðÙè~á¾°Ô•$,u%)8ô^OMqÿá+Ä­þ‰<÷ó!ûçï>nKÓBää~¹'¹_îI‚¤®ä~¹'IOO'!#=zMkiëYQQA***HCCƒCÇIjû8Γx ,Àõ–ÞŸ°”ë­ôû­¤}gѾ3Žì pøÞúC´Ð•°úapp0Ñ®awÛv4¼1,u% &M&ÙÙÙä£C‡ é:J²³³–X¦÷Ÿ¼n0‰ž1ê–‹ kÜ‹®c[Lì­ÔY¢m€§àà`L¦…†°¬¦|9Ý$b;޶¥lûó޵Úîsssû<£ª’,žþÝQÄøî(Ñû¯JêC†:œNç‡÷ÏqüýÝ ÙH£!\ý0¡¿ý9ºå3ýɴвg¨?«{ñF˜™ÂÞ]§‚¤ü7É 9)ŸLcñûú&é<¶sTóÃÙütT9ÖÑ|W©T„Ö6±¥ÜÜ\’’’BfΜIÞJEhéìþ~Žž¯?sô·–9—ôÝÄ9ý;Ò)þ‘Ô¯ÅI{@ÌDã¥.vû~àpD¿…ÙÐ{ ÿ3<Ýðzøhï.ÅÞ¨b;ñîR4>:Žõ K]I¾Øñ*¼Ô‰xzmæ}®ã™¿ jú_AŠ·Á¬¢õˆ[ý_AP±ÌÎ ç~¹'±^íBE‡’A.¨1[¸ïZÛ¸únGh=‡°‡ž‡- 6áêêjÑ·`ÁlÞ¼HJJ´V«å¼Fß1ØõŒw/ýŠ“¸’è£ÈÜ·Ç’¹oíQAÖ[8Y€+qTnÙÙC·èñþ¾Ûsõ§oÊ+Ç9*•]4ˆì Ö_/#33Óî:ê¯V«IàÐV”¸ äØZtŠ"CyÉôÙ ´«FØ-„TÊ×étœëe/¸^ö‚»e¤Ñi˜tè|ÿý÷0àã|3bŸƒ¼7‡ˆÊé Ï—òÊqî­–d,P"äuP П5âáxåžx`x ‘ìãdoü¸úa’ìã·Rgú;I-eUEiè"Í_Ñ.,f\ñò®½è¾Þ úN„¹ÿF#×FZ!õ’Y€+ š® AÓíßWiuø}êt:ŽúƤ¦¦r¹¹¹ÄP©T¤ö’Ü.Ò…š5/ŸáÛh…ñÝQdߟ“ÊpÞ8o ±ÃH}ÈPB+öÑç¶#ï9§<ØÈowœÜÇÀ š1ú?®~˜ìرJ¥w/ýŠÑtˆŒŒ­¦I5EôýÓ{¢!ÌQ®.ø¬¹‡;X"õ¢]™ uº¦c‚‚Ø}ØŽ-ML5 4» ¿¿?‹$Î-ªÁ&`xÇ^Z”Þ/ž(¾ÞÌ™3 M÷Ñ¡ÃdeÖÏàMIt›®MuuuÜ€›­‚€î<*dýúõP*•x>Î ¥V‚/¿üK—.źuëúä— …‚,pãp[›IÄôok3a×'®ý©z üNÐÙ^ÜѶí¾ß+mQµÔ­HëÂu£÷Qj|w‰í>ÊX}€¶höV_ïÙQ{aq’äKDÇ„ÏYxä26©ùB)^êD<÷Þ!´è PY!õ‘ËåP5}UÓ'ðÏçx  â\.’ºëÕ.œ ø®µ«1[D¡¢’A.ˆx~Ê?YÛíEËeþ#š²,‰t×jµ\VVÎmÞ¼a!ÐØØˆ††–XéöÄëxóÓ@<òO>KŸ©ÞÂ/«Á)=¦d ®oã„ Àv’ÉdÂ!C˜³7 àÌ*<î¬/}7÷Ë=IÑ•v–›!ü‘ ”²‘M }·G\ÅöEîhùÛ À²R¶/rGÕ™mˆëŠOJÜðîÌ&ŽxâÈB™€ëe/ ¸°Ò'PZZŠªª*úèo\gÁ§ä)¬Oëb¡€ÔÃ~Ô>cÚ³ú¬„ f@@¥Q¢7 ðVê,r¤ùæ}®Ãû ÙÇŸæàƒý0sU>Í/`m“ÔRäëÌ Cæ¢]±v\ÆÊðüJß%¯<%Á´Ðò|´ ‰cÄ¡|æ+gn±rf“—¶âòÁV,ú1XÌ-VN&“Aê%±{£F¶²õ-55•ËËËCnn.)8ôž¨]]]§Óé¸Q#Åäº2“œ£\]ОۆÄ9ôF€A) IDATA]xêFžºÑ„õÃäð|Z†˜ð9iw.|tœT_hAð`#º÷Av'lAéééäÑPÞ9p Z­–›={6²³³ ݬ&ô>¨yÆRiƉ‹µ€“í8~©‡yóŠk˜©Ç?ªªî.ÅÞ³UvŒ8``O¢!“ɹ\™LÆü)DÅë€æ¸ø'´‘V„††"44”…Ÿ.þ gur6o š+„’?eü^ñÖ>•¯x îšò†ÓH®uëÖ¡¸¸˜mRÜÉœZ¿üòK÷ ¬í$h»Í­!*•Š\÷”áKÃMÖÆ_¡¡„”¯Ò³ëýf`ëø#$¡=ÑÙñŽ¡C{õøî¯ô@IøAP‡!Z2H‘J¼;I”« >nmgÌ2^êI° qÑ$ÃÓ Ùm ûâÝù Yô:” I¶šá%‘ÛÚxÏoag¤P(H2àÛ9°ßÀÁQE*Òpq&#Š®þÊo7]ÃFï¢~’` â=ÜQxä22<ÝÐôù3húü—nAX¸Õns ’|4ÕnsPçû<ê|Ÿ¬Âg¶h;P±ŒCCô¿Ü“„»Kq6€0ÇQZ¼"d¤ÉÌÌ$¿X-(ÿd-ôre¯¶a­VËÅÄÄ`íÚµ¢ÜûYYYÜ˯]AXÈ` `aÒܼb†b¤¯J=×i„Ùûn^1ƒ‚º˜8rØš¨ ÀåË—  ÇžéHEwïN?È\s°Íz&lëL !Ñnp›8¶ @3؃ÀàÎzh4Iù‹Ú‹ÚQ o…¹;QK{Q;`Y„ÜÜM8UfÁ³9|ÿJ \ª¢~!‰ŒŒDæ|w<ó$Jš›áííÕW¿…ç™_P1þYü¸/ˆ1ß˃#n… .aÍ/À‹î…Í}°ÿÿÛÏÈ×™‘¤æAù‘æ¢Z ceHŒ‘#¦Æ15.(зâùhS÷8\ƒ‡f ž6!1FŽÇ=Y5Q!Q àÉÉñ÷‡Î£¾È!¨««ãÌ-VÎVðòkÿäþôPOvМœ.55•Û¸¥Ò!xùµr"-7º26*;ðÂÖ“£@ߊÄ9ž¿C‰K—:QüC yû"è88“é¸P/Ýxw)O‰›¸s¾ \FB2ÿ‘Å»K±Ií%At?<Åï˜|  [òïhâæ$£í¨¾G x'÷Ë= •ú)ó')D=V†iý£%®¨Üõ «FëÕ*2PéÓ0Ð$Iiii€´´4»jŠ/¿v}¶³g8³µ™sù•gFî‚rÊm \¹x‘€¨7P`ª·p7¯ô$ó>ÏK÷ô,L‡êêYfĉª=ŽNBM|ûØE¸¶õ³}w¶R´Í´ÐRi%°þÊç€×•™q²½ŸžãU¸ 2 lÆCüótÏ=µZM²=y «@ߊbš¤Ä•Ï`îT@AÀ&ãÏêñU«È‚Ïž†ñ¸oÞ·H•œAIs3¦ß?YYYXrïذ9?î_ µZMZ/™‘©’Á/º'™ÌùƒWÑXõ8²×0þ¯iÊX t._¾ ™L†Ùß·àÅÉ÷Àd2aÞç:|±èN¼8ùÖÎd2áÓüäëzÞ]Ø8RÄži>u£ .!< ûÆmàebŒœýþä¤óp/£ÑÈ4ÀmüíL”© ×Üœ.//‰ÿÊÙšŽ7àÝÿù3“ú7Ç„÷ÕµCWzŸœ00ð΃q¥›Ùè±À3ÿ ¹¸QW ´^ÓàÝ]#¦Ÿ®FÞ$ Fƒw\Cvv6óµIJJBcc#&L˜€©S§‚‚€Ù³gèaþQ®.Žn‚¥ÒŒù96… Ħ°È䇢ºvkëÀ±ö¼à£ÀñKí,Ú#Ú¥G…H¿úkn0™LhmmiÑìÖP:öjµš™?%­¡UÐ6³cRדPrw‰Š1 iìCšƒ!16¦" &Å}ŽsP[[‹»'¿Žû»!nx ÜlíI·ǤÿWîˆ7nàþ·ò°zÿLö½ˆàà`(•JÖfݺuv×~ÍOI<¯÷ŒIÔ•,pãìž_8.¶ FèKc0˜ÆCX.ývD@(}SO/,ü/D`¶I,èï…Bd+T*•è:iïý™Å ¯k2™p¨®^t-úÛ™Ú…Þ/•ˆâ¢Y;ÊÄ_{`£÷¦ŸBèb+¤ä(cÌ?F#AïóK]IäPƯR©ˆvÕ²âa>ÛÆÕï_‡º»$ñ‹¯BhwôõªXsBI¯×#)) ›7oƯ{Và×=+ƒÌÌL „$Ô¤(ƒÐaè‚b¤¡ššJÙÈ\É€Á=¹±Y ¯* ;ñˆ˜._¾ÌbÑm‰Jú¦z‹Hâwú¨ýR(Ý|öµh7œlïÄÞ³UÜw­m\´‡Òt®(,çÛ$DÈ ìiÎgøGU—¸N§ãNŽáÐò™…e&,Ö Ç;]…9><ÖŒö¢v˜‹ÚaΟ‡Ü¯øgx6G‚}« %%…Ä&&áp¡§¶lÆ{k!×: Ù/ÔaÞß ñÙS hµZ.##ƒÛ°± J¥s›—âÞûΠñd{¦“Áо'ÜÎ4£Š-  ‰x›Í爈|±èN\ûö!¼ò‚œ%Ï¡ê¡4h2™øÕà#èºÐ=Ç>9ÁƒI+¹—xh"1FŽ0 Ç´ÇŸáý„ÚA•JEŽó$AÓDè,êÉÉAÍBm]xÛHw¹ÖîuîxS"##=c999\zz:IMM儚€“»ÏpgÎñ +®¥ ]U]øþñ«ØàabßÌ}ÿ¼ÂQpxyæOõeÀ&®¥‰F¸åÓoxÍÅâ 0Íë#¼u÷M e/nÜ †wÐ\žñwœæÿ¼ç€—þ…Œ=)) ÁÁÁÈÏÏG~~¾à°¾Ä|‹ÇÚ;ðQÕðq³‘£9ƒüðve3G5¶DÕÿ”ÇÐï‰æÐ`§  š(!ó³É ­¡ äîbm.u^‚ǯ ‡‚«¿Ñˆ¨¹i€yŸë°øXLE´³bÁÆ_¨E´„Ã]SÞ`9I233Iqq1“ð“cqñâE|÷ÖT $%ÆâàÁƒ†^¯Gqq1¼«sEü@¡Pµ×={²d^÷”amgÏ- Mv‡Éà5"‘‘‘ dš: ØlM©T*ò´¯w¯«³D ŽJZ ‰ÆoÎýŸ}lŸ•žWxîË—/3‡ŽÿÃÞÛÇEU¦ÿãï3OÀ0ÌŒˆ8(B `<$ƒ ¢–T»ÙÒª¹Ûs•ŸOVn-YY~ܬ\×2­ÏöddmÛÓšùÉ­ý¬E»"*Êh<$>@ ‚ˆÊ Ã00ÃÜ¿?÷=÷9sk?»ß×o¯×‹0gÎ9÷9ç>÷õ¾®ë}]WUUUàC´`Å=õÇð–9yZ5ò´ذó;lêóB§˜ÈëÖ­h\áÂ…¬ìéuÑÍà=Û¶mцk1jÄàAA•£ d'ÃëôÁëôA«W¡§Ý‹uâ³çA@äX-x•Çس ÊšOñ¢2ØË(rTh8Àÿ̇¥Q3×>-ôdŒ‰T»û`ÍÐâ#?VìÜFA€ã·ÈìGFaäû'øÝÛ Xñ°Ø“ýé’°ç eÿí·,^/ŸÑÞ:îÓŠ±pꎾùæ›qç!ÑÝYZZ*lÛ¶MðªsðæÒ;bÞ& زhÑ"¡¬¬L(¼y~ï|q]át:1ï׉ø®®]ç§Úq8³ïvüÇ‘xd7ö]Þ…ò"ñĦÐŒÄÌ!¦¸íÞÛ‹Ý{{qGvV@Õ<øÕuײXð‹;Å0]ÔöÖ¹DËXˆcשðjí9èÄïU1ËŸ diÄy‘çB~—§¾vÂãòA?ZC´Q*âp8„ÁÀ€Ú({îÙs'+V`Ϯߑ[s³0gÎÜš›Å€àçLŸõk °_܋DŽ[Ú…ëêÚðúE?7Áš¡GQŠP€ñötâªF`ñˆ(Ñõ À„]åã—aÕ^1dW`Õ⿦ÿ E¸'ßñƒ€ñòóóEâ/D—?•ÊÊJTVV"ùÜ"òóóAùt=¦Öÿ~w/SôW?z=ªÝ}ìݬ±Øïÿ>›2Ža4Vmkh¶•³çtÌÓø­ü·ÓFA.Rëð2@Tö¤B«©FKŸèmÎÍÍ…ÅtŸßyˆºl^^¼ mèó5˜=e3ûÞ¦ nX®ÃÕ?y €hýýõ×0™LÈÉÉAÁò°vA2þãíÃX» Ë?ÀìÙ³qíH±<öoŠFcç…‰€®t]áIÈò{¡ºàu/åi455ðÊÌÌd$H(€¶;Ütê L ?¥œOêÖ§¿o›2˜ âšk®Áâ§bá‚›ëð#Cþð¦Ô1ªªªŠ](Uþô{Y5ž~Õï²í»¹€‡’LøÕuÑx(É„»?;rñ<6ž8‰jwŸ¿²UÖ$RÙzÿ{G+*Ûܘ6#•mnìÙÝþ†~T¶¹1}F$6ìüÙá:¦ü÷÷ú+añý ¢T*f;¡räBA€ü™PɃÊ67~û»6ìïéEv¸yaØïîE¾%¤“ ²Í Á,ÞVÚ÷|¿§¯Ýg z ¦gˆ €´t®y7×¼›.qÿßTù*bg¨–®ÂȧtÒã€öjü¡8´þïJØê\øÍ-u(°`ÍÐã ÁÄú•+õã>xð bbb»æöÙŒiaزe –-[†õë×¶lÙ"Ùï|·¨$luàà7ÍMxì×þ²¡Tù×÷z°å³ã°fh%œØ”.Z{IZ ‰zt ¾~áúve1k8læ;ìÚx=8àõ0O@_u/^/ö1«•ÀÓ7?K>ÿ²¿øójIl÷ÈÖ•l1Éô}ÄØàÔ­øØ'*ä«jñ”0–|jöaºþnÄMtÉhïmD¬ájT9Í»ìïFÒën¼sǧ°X,d÷ÅNTØ<"¹oZ‹ñËå½ê 7€ïIÀ³V¨ªÁ½w§arôt“?}z‚yú%%%˜;w®XöûÜ"TVVbíÚµˆ‰‰Áî½þ9>wîÜ€P€÷ˆË Qì;Õî>ÖtèÁbØjzn& À2O7ŠRSXYlþ=:Úß"W}&`>ðœÁ€â„V/Ú³\‡'/|y ‚Eãº0~vª¾ßI“&Á¨m ꀷ^=ŒGߏ}ûàªô2/@ùÑwѵ߇»~ù;Då©PXXHÌ[Ù~׎ŒFBBv^H@LL v^H@BBñÁ±ã¸vd4žÞq–y¨$i5äÉS9±­­MàïE°*…Ô§×CÁ­ŠÚÙ)òeL&æÏŸ/ ¨èy –W®€_AËÇ"ÖáUþQùℽæšk°ðw¿Äu%aêL‘´¬Ü+èú—_øñãÇX¡ã+JM!ß47aÞ Ç‘®Ã†ßañˆ(T¶¹A: ^Üy•mn”ÆÅ`ÓE„Ø8¨ÆÄ3åýFODECˆ…ü¸1ذó;†Ä7ž´ãõ‹]èoèG^DSþ›œnV1‹ŠÑh$IZ éòù„µ ç#ü®}@téìVi1²Ç…îöö!A€\¹ðžyZ5ö÷z0mF<ad/]^xò-áP§øuŠšU² öyÙËJLÏ`\€)wÍ`@€z"¦æà¦ebÝv>k`õüXRasbq© [Žý'lu.øZûñê^*lNX hþh4€²ÝÑÑuñ× ©©‰}v]t3[pøÞòr©rtá…êF„™Ôèµ÷³…œz²rtì7Ÿ @ï§Åb!Á^2 âãÉKÁDþÎðç£Ï7;\‡]ïw¢Úíg?³ˆýn3E¢o—Ø™PNz¼ÂIWðT,Aö·îJ7¦eèqýǧÞµ¿âáë±wöÔ @{ÉâÄ]¶lÖ­['”””`ÌOC7u2 ™*¹þƒâHõ¬¶<•þ1vx>tŸöà‘ìd¶ˆ{>ðY€èP’¶¶6¡½½=?¹5rêÔ©aÝà2?ŸéñŸí° •§ýÌéÚèXô7}ÛL‘È‹C×€†´`»Ò¨ÅFì9èÄõŸ¬V+¡¿§³cÍb±·ýã‰îq÷€ Ÿ8!,Ý¢Fë>ƒÈï·憌ÑÙÙ‰ÚÚZäN/À[oÞ/ÙþØ'*|[< SSErf^êÑö?¸â8Öv´Þƒˆ€ø±)ÐÅÈòÂï«{ðJÝå0›Å”¾«3¦…áùMbÿ žH¥½½¯UìÁ¶'æH>ÿl~·¥y5t³*DnÌ?øýã½*Ü¢Ó K£Æ²C Pæ? ®sÚ(¡Ö>•ȱÚ+ÓãòáL×÷XóÞ“˜>ëׂæT¼ñ] ¼ùö!À›oÂwÇ>ÆŠ+0gΔ–– 6›M 5è9øÜþk8*l✈­jF7´|(ÀñÛ $ßâG©ünSNxnà¡ýõS`V­È èñ[žÉc())lß¾‰öJTØÜ,æ3m`ü…¯±}ûvþ0-UÌK}¯W$%á¤Ç+d~²peí~¶ ,óøÓÚäk\ßá~\[8‹……:×FVןýÏH‚¦G7®OcœnV}!Þ'¯Ó5©‡gÞ<äææB«©FøÑXú²¦)‚€v£ŽŽ/ÐÑÑË23°@åï˼{½xò‘0|¾¡Qyâ\¨°yÐÑÑÁÞoýaèO|‡ežn–ÆÚÜÜŒŽŽ|yþ;¦Õj%tM ×'Ï¢¼8új<(š>M½v»MMM̘2™L’Ú€Œ(·®åV~0 `µZIXK >]óW¼¾i.¸ ûÊ×ãõMûðþˆu8ðÉ'ŸH.CˆÃáäñ×`VóŽã šú£B·›œnäþ©W&$¢Ú݇ÛSÄ4 !6v~%àšú£Bµ»W&$¢ÆÛrá„h1îôÎixýbT)1à_:9‚åÙáý~˸£ß'™à4C@)º€è=–‡F¿á³ÈÅó ï»UJ Š[;0mFíÁȫſ)yÔÓå\g½‚æT»OÕÛ±Z †+Ôˆu÷ß3o¾}÷ß3 ,~ûì/Y¡  Ÿ;{„ ŒÌ¬MS!c[–Ôv!¶ªYøl\,«ȇ*Ûܸ±¥] uõ;ÛŽà䮹@g)sñEmÄÎWzàªÃ`ÿõU$1f‹¸4~ßÅzee%šLù˜ž›ÉBmª‡Šé¹™l;ùùùHLLd ½U^T¿=)zÛÌë ˜D-‹g;ìÂIW¨ïç ]—HÚ&SÙÕv}‡û1}ª9 ®Š|>èõzx#ÄýIî]£¶³n3ã÷—Uâ/E¢Õôèq¢î$|6ª¾ßÁ€Ï¿÷{ˆxèW?Ù†?í*àÏ ÷/ß÷ºö‹kûGû6²}ùZN§šôIp¿¯fMažCꊧYTh·Hzü¶~zY€Â{å÷­¥Ç3 IDAT¬¬LHLLDgÜÐ2ÒÈu¯„ÈW>“§1É?“Ÿœýn›2‹œŠ×7íC¬Ã°–Øív,üÝ/ÑUÙ°–P¾¿?Olã/ð/ȃÅÏ)»ÿ ¸=%5Þ~,…û¼¸") lhDµ»Ùáº×ÓÊô‰D5&|÷«ýž~ø}ð5Šœþ€MN7¿;cìF2²Ç….ŸObýÓë8¡­ð×O¯Y>ä®PŠ- Y™>‘СÎuî(ß÷5úX ºš÷÷ôB+° ßbÉfuâË6óáCá6bZ µFøPåâ¼X:ÍÇ~Õ€ ›S‘é/èDåžry8 )t]´_9ÓT¤ŠŠ FDPP^^ަ¦¦Uþ€˜D¿×éC¡) d'£×Þ/ñðR”‰ñ}ÒçZ”šB ¬á°fH3hêÚPµî)Ÿ€Š¼N¿Á`ÀgãD"”|N>Ûa¨µä;s [>;ݬ±Ì+°¼; ;²F“§ÒF=Œœ÷ÁÃaxfI3žz-›=QR«Þ+Ë G W œ?ÿüó䘧f³å{½xpê»Aû˜L&T÷ÜQ©F÷Çãñêž hwD¬>ÇÚ®Âjú°ø-Týß§¾3F˜±ûb'{Æz½ž¹ù'ûVþ>¾¸óKè[üóeo ÿ{ç)T÷‹ÏŸ¿— «Î±¸ùï¶´£än‚,%wûÝêÔêguòD²ŸÇå x_Ïêâg?@^lÅjµo¼Z¨¨¨Â›oÂÌ™3ñØ“ €˜.H ÑPÍçÎvã£Þ·Ñ -Âgãb G fê5óUŒ>¤ÎÒv11E±û“™‰ƒµµ¨°y°±ô û Ì–4tž|pþÐŽEyy9;DSS®Yñ¡@•Ô¶«–àù/Ïáýãz”–– TáS¯]bb"voŠ[;†ô0-ÒR‹;m0JD%Kk…±qÌ °ãx«¿!ÓG|â#¼¶p BŸM$3ÆÆÆâÖ-éx­o®ßáW ^§MµŸ#1óäææÂ¨¯#²Û‰ïkë"¸,3-ÞŒªcÌ{BãË÷÷â†å:€»öû`±XÈ´iÓÐÙى情´~S2+UÆ{÷îecâ-z <‡°í‰9ø}uóÈÓÿ‚¥¥¥Bss3ãêdff"33f³YÒ•~_·¬•N¢TÜ„ ÿôSeKâjx+ Ø˜…ô†(ä?õ¥¦+ føÎœÂ›câ‘qMÓâ˜e,T*¾3§XC‹¢ÔòaŸ—¥M麀ý=½¢DEO«ZÑâ:ù‚öyq‹N#!RåÒãeñÎ+Ü;% Hî5³éòö¾|ŠfqÀ’9Ü‹).1æ÷vúlrº‘wX)ð“þ„Ø8ôW‰ìú{l]HS láMKWT|uϼ:°(ð÷L–þ}yõªYBŽÓ[𵏬°‰ ßövõüXR`5À²W\4'ªœ¨ê2 7ʉmÀ¢E‹Qé¬ jcc#*;ôâ"µùF”””à³Ï>Ã7Þ(ñ ¸p‰CßÁ@å鱫ÍHÂ’J§Üû§]p¸ûžK…Í [øÂSr ÄÇÇ£­­MñxT\vDéY ƒyáaA«º=ÛažŒ1±m[>;Ž%—Åa¿»/ö:PÔØ.üå—c‰hý‹\g–ˆåXo}©M-¢âÓͪ(Ipë‡&,¸ÅÀ_ á ëðòøã V«•ì¼ýED oáÞ%j‰ò_=?–t'/àω¾s—¸ .tÉ££ñ,Phq"þªŒÿæ, Ä8†?T÷Áétb~•øžo{bó.ŽIÅ{X6̶'æàŽ—þ—Ë…*G{‡«ûc@¾Uègu@vXfˆÂËÎ.„ç‚»Rœ÷{:Qr·X@;yðñ‡"ùÏ¢'z½žDä¹p¶ÒˇÁ€‘=9ßÝŽ³•~ãÃÙ"Þ'¾ƒ#]Xi`ÅŠX±bÌf3ä•ÿJKK…9sæÓˆiŽ²Ï ¬áÈØÖÒIÀêÿ-æ|ˆÀÀ³Ïƒ=p2PÄæÿŸ|E±û°ãxƒ°ãx`GûT‚ˆ‡`¶4J”?¬X±{÷îE~~>s—–– ùùù­Ó¼s„¦´QojL<@ÜX<" oF˜€ã ˆ­jΦŒ#£Z>¼AÚ[%a-*¼AéÏDå?Ë2Z¶å”%&Mš$f‹ÜhªýÞÌf3j|Œý©©©0™L¨ú~7Ô¤MMÊ—5µxlñfäû^r31íª÷„Õ7¥Ï Ü÷ðr¢â§döçÏÞQ—Ë%É^ãψÍâã㟈7 ôz=1d–e46–TTþòÆ[r¡Ê½¶¶&“‰=Sê°Ùl’wwP f82Ünkòï«,(ïë<”åE=<ÑO¾ €d; G|„Õ§B=¤½€¨Dù \´œ%q:9S_~MòPJ(îe>CN„T:ÏfâÆ}‚4V¨Ôí+mÁÂÇô§¬ý9ðîî7[ô -]OõDß÷&¬¸Z E}¬z¬ÚÖÎþ§ÖýÒi>æ \ x%®7Þxƒ`Ù²eHLLDSSQ^^Ž’’ðÛq±üŒí‘‘±"BÈçfŒn½ š=Â’=,þ_½ýØ ó•ö=·fhêÈ;Þ Eê”Wî2 ,Ű&J‹ýî^¼ab@–¶™½×Ûƒ}^üM…ˆó¨¼,/Ì»|úF7´(Žÿ/¿Kž:`¡[­V²÷n}©WÒú˜.s.Ÿ‡øÂQøè£$~aa!ILLÄ« û±t‹MMMlñ_=?–4™Æ,ÉÄÄD|ðÁ(//ÇÌ™3Q^^Ž . ±±g£þ‚ñÕýh2å#Ñ^‰?Ôô1Å€)wþ¿÷ðU¨°yðâÎ/% F¾$7õàñ<Ÿ§ÒFMš?” wå9ÆÐNžkV|(ðëñSåO?£ÂFÿæßÓW^yq£N¢¢¢ ^.gD¿/¾øBòî._6“m§óßã‡ï‰BvÝEô7ˆk é$(níÀâQÈ·„ã^{˜˜®úÛ ÄøØ1šÑ†Ÿ0åç_Ûíšï"椻'ßArÌ^4ž6¢h\\ãpóÍ7#:: ,rýÞºu+ùâ‹/PZZ*ð-7·dó×D½W= yáaxY‰o¿$Æ-êþÖMRã˲3’L4>×årÁáb^¿ÜËf°ùË{Sù癩ÈdóÛb±îH[¼Qy*tí÷aeÉU Z :uÞïqÃr>ßЇ߾~º¾kÖ¬û;YYr•@½€ë§ÕyIMMEBB¾úê+Ån™ô:>úéeXvÈ% ðmÖå¢dLžDm6›YJ úþþhà‡ˆüâäÊ/Ô¶¢ƒµ´ u%Ðø€œDÈMâÇjjþ{òËKm-*/u<ØwÓ¬!+^Áˆ‚p±BÌMQðŽl]©Pñ"-]…‹¯°‰™%ZôK§ù$Jžþ/ÿ-¿ô¿ùÍo˜õÿôÓOK®É’%¬¬&|ôÑG-ii —’ºhõ*¸ÎŠž™óÝí˜T˜‚ÓÍÍ8w¨'轡‹1¼ôvWGiü¡ø¿ïõö0ò&,ò¨˜ò€ñ: Ëð€âÖ‰—…Žãþ½˜–¡Ç²C’Ó§šñÁâå•póYÉ3ÈëÇ¢E‹„ÂÂB2=f6â GaA÷D·m؃¯¾úŠ}~Í5×2Uã (é:E¼Óôzi =(èÿt TçŸ5–K~1—FåR¯IéØ?¶ÈüØëJ JÊŸßH-Z% v @-Y²¯½öÖ¯_G}K–,Á»ï¾ ºíÝwßÅ]wÝÅ~ÓÆAò{Í/ä”±MÃç»Û!0~vÜÖ?à÷PÙÕvvHð*ð ¶ß½^±¢¯ì©¼0ïVhK_Gµ»OÒSîKœ\ÑQåëK½øàá0$Ü|–+˜çŽ6iê™0ð‡G~4K€ð £MÈêò &J¬ŒÉêîØóæ…Ôo9Ø5%9N»„%Ê9hu6:Ö„„dff"''999HLL”q v¬¢Y07š,˜MÂ&éXÊž5S9wž %(ûl¸-Z„µk×gEá›dÈ{±¥¦Ì íhÏM|þdŒ‰ÜßcG¾%Þ*/*ÛܸÃîV Ôýü`¤ Tù×xûÑž›@Îß–D´Y:´ç&y|š^±/{«”)^6î*'÷=¼< ‹†'‡Òf*p„X°tz4ûŸn—wÚ”w£siöìÙHLL ¨.¯<ö¯$ÁÆ%îr‘—Ÿ={vÐ$C . BÙ‡žO^Ñ퇎!Ôc)Ý;›Í&,Z´H²í‡<÷KÙw¨Öò¡ì©cVÒ7¡JƼydÖ3 †µïüùó%ýä•û‚Ô/áe8ëì cÞ1àÆ‹gç…i±ÅêÅÊô‰äˆ`yw/Eè0m’ ý¢ÒÎÒ¨±#kÉÒ¨1m’_IÙív´0D_ñšŒ×ä Ýhdi`ˆ¾q……0D_ »ÝÚÍp¸¤ÇP¿  &ÄÇÇ#7Ê9dkdj©Q€B•}rr2bbbÐÑÑ!)T±mÛ¶ ãÖÖ£>/jê\¨Hí ›¤Cïá>‰ëJ¨“W>¡|ßjµZ @~ï†ZÌåÇ1™L¸ñéUÈÌÌ È…Í¼ÐŽ_]'EP{ƒ!‚FRíîÃô‘ ùß·â»[Ñý_”šBŒï“:E m–Fº°Åêeÿ{jú°©[ô„ì8Þ ´ç&uŠšŽŒyó˜Þ¸«œÔ¼³€s¯ÚSºO?2æÍ#ô ¨¸\.äææ2¦qn”»ÎªÐÞÞŽM~̬Ñ>ÌíÃÒéÑl^@ff&ä Þd2¡££MMM©nô;ƒÝw%…ö%p— ¦c¡q°±”•• ü˜“““‘““ÃÖ²Pæ­Á~)RZZ*$&&**j¾µ«’Pf°í¡z 233%ÿßµæÄ“¼‹mlJÛä)¦ògìûV«•dÏ@²çN Þø.É>4Í2¡åé‡#¼Ë÷Œ®„µ´`ä7¾çÿüùóIss3{·ìv;‹ßSÙ¶mÛ }w¨1JKy`pÇsÏj•´¨©ªBO]]@_ÀÃâìGqg–3Í­°fhQÞ}K3ŠRSˆÝnGœÃŽ4•׸„e¾Ð¦6KTÚ˳{Qr7Á«<   ^ÞÖvÿ@‰û¼Ø†ýSú±¼»—mãþòì^ô7šØ1l6›ëpà„W¬r7û™ÈÊÍeÊŸZb­eep^øSþƒµ<–¦´(‹ÅBfö§ãY3ã îq¤.þÄÄDttt°ržTñSò£ÒXŠR d¬AƒïÛç ¸ý3Ôb­z¥úýr!N'ûì‡:λヒ-[¶ ¼¼w¾ð"¶nÝJ¬V+ioo'k×®tAV²TÌSÕȺ{a@þzµ»ý ýøÈ< ´ Ë{¦pìV‰ùÌ)gÅ{FÉÁ@)Uöáùá_m–Ž5¤ÙP-Ñ(P_Á¤/9›_Ú€¦¦&¼÷Ädåæ"ëî…Ð56¢jO…ä:göa¦¹&“ \#Äß[ (Qê°f&`G“ÖÌöâøíÅqPãÌ;¾‹)z«ÕJò¦éðvÉ1dff2g°kïììTTøTl6›0X)x¾†M§4OÖÂvþÂÂBÒn4²ë<®šŠ¸ƒ"S³5g:R}ûؽ lB[`Bµœ(£Þ×Úƒ–N†­V,.Ñjšˆ¢DV}RÀ^L³Ù “ÉÄR>¨âç'Q0k€¦Ò];P3„Mÿï=ÜkfBÀxq:1JÙãóÏ;Z‘—`„º’’rÆlÆÜÔTVûÿW›7CרÈBJD%^è‚d6›‘™™‰¬»¢æPЂ€È·X¦ð¾½›ÕŸáó 4.‚Yé$ŒxøÉWüü=[‰Z,Fw¥¿˜Px~8ûßS# Ü[{g€·R(àüì7«q……È^ ùìÆ§Wá¡Y3 9>>E‰âý/°ègöa×Y(§¤Õ4” @ò,)ç‚W 4“Ÿ3¡€ââbR[[û?¦ àÑGÅúõë1gά]»vXc(..&ùùùøè£ÀÇô³n"§[ú0vœÕÿcz<«ÕJ~9÷,:·²šïÃ9¿Ñh$ ,ÀÖ­b£™P _€Ðçf·Ûñòï\˜t ³ÿtÝâÙâés“P¿ý$îY7ÚÆY¨hÿõÛO2Fy°cÈC‹r­5ì^Ð¬2ÿ7­¸È>Ô=¥ïU¨€'–¥¦#>§Ó JÌj¹dÌ›G¢'«1N=5UUAu'/ÅÅÅ„JHH@ss3«ãOÿ`\ xJ½Òz+yX½ãÆ¡îÓO9’ŒÈÈ@XK È`7Ójµ’8‡®q l‘ùCMÒ„6¸òÝeúDB‹ì,Ï-ø½‡ÅE™Zñ´í©œ¸uþ¶$B¿Ÿ¦…:Ù΀Ćê0v< ( ^Þ¢ÏÊÍe‹.µ¶º¾ñÁyáoñ HN¤¢÷3Ø Ä+ÿÝ*-+\1ÓÜŠW÷\`‹wQ¢ ¶ÚfFÆ“¿¼¼òÀ:AÉyJ$2šFˆ `¢Jkf¼õ­82A@M Uš" pTùp›¡í’€€Ð ImÞkÑÔÔ„Ÿ^…[Ó&²´£»ÊÉ­i±}ûvÈ‹”( UTÔz 6o0Djñ@ã³Xumw7ò-áØß9‘”ÊÊô‰dyv/xž/­½Àƒ*ëÞ$@–¾÷=¼›_Ú€¬Ü\´–•áÆ§W¡jOtÅLZ£ÑHrssÙ»¶£IS§N±T5J$åG/|y*`QàïYLL ësΟ“ŸsÁÞåÕ7¥[m3\ yÿpÒ¬\ÚÛÛÉöíÛµk×"33sæÌ )ÏFMŽ Ï.ÙˆÊÊJ:ÿ ²­‘øüÓ‹PŸ1…¤ˆÿò˱¶ˆu8$x°Â#àÁ„_”w«´ÀY`Öh'\ÊßVÛ ƒÁ_«0‰/"t 4þÈÿM'àw E:{N‡ÂÑÐÅ]ÿu“€;²Œ¨óy1Q¥!Á¼ƒ‰RÁ$*üÂlµZÉÚµk±bÅ 6ö¡„·\é‚CÃ" 6äõ‹]È÷sLö÷ô"/" »ÚÎÂçó pzØvuŠZbñÓÆ;ž0ÐßЮ׈ZldÁ½µkê›%Ê@€òÄЛÝn‡iÀµè©«ÃÏ=GÞ{â ¡Õ4€ 3Í­(ïŒCll+Ê£×ëY&I||ÁÀd¨2²Ç_«Vl¡=ŒýŠjÎ Å_|AJk¤Õð2çšAƽßg„;ºÛŒ†¶6¼ä3//¾â¸ °XÈ›oŸ(tè ’‹ÃážH× þ}q ¬GJb^jÂoqÏvQ( ÿüãìG‘h¯?& ©øåÇüÆÏ= U¨‚ëÖy IDAT»ŸÊ„"€çCJç¶”äí7p8˜â·#ôÌŽã RSêúqg–NRÔˆ–æ+ÁÊ…'òeÌ›GÎ_©Â8õdœF5ÂZZpÃ#$RÕÙÙ9¤ò§ŠŸÎy!*Ú³†¯¦)!Ò¢ X¯oÚЇÞÌ`dj­ú¤^€'Nš:Ê;ã!|A%ôôûê̺M¬ÉŸw@Í\ÿ»Þ×`ú:lˆ Ãô+Äô=ªü©°>áz¨ì=¬Ç&§êd;û.Est²¶8á=ˆ®oDË£jO²rsaˆ¾íF#klD= JDžsÏ×[·Ûí#I:VfbccÅ—Ç”¿53iB>wö£Fœý(ãÊ1YŠi õ õ2ŽÕ'QþÙ-hV '€6õ¤¹ÿ<PNt¹\CZStÒ———ãÕW_ÅÚµkC"ÑÐX? Ôò§<JÄ v¬ >/" 3|Ô÷zðrÁþž^ 1m–îJ7´ùá®@ mt½î€§¦î­=,ÿ¿(5…lÜUN²rs%a'ú¾ñWXÈæà²·JÑZV@$ù•wŠï[UU•DùSë?7ʉS§ÄRÆ<ÊKÒpUmm-ÊËË1{ölÌž=dµÅ©W0Ø}ä=$mmmBÃwnA©~D0IÒjÈù=»ß¡ZÿT³òÛ¦>c›ÃpîPÐð; g(ÂwL¥ÿwu›±²D¹Ç-S¯®†«üy±Ùl‚53Wè@U—«>©”€8˜ÔÖÖ2 ªõÏ“ /ÏP#çîpnt³P@0þ±6›M Æ]ëääÄPÄš¡eÊŸ¦¡Ûê%ftttHxJ/CT¤ÿÅû¾½YlÕ^,bxu>/²5ìxNù“•ÀÈ€ƒeÈ…Zÿ›¤455áƒ#GÒ“äûPåožêOÛ‘“i ¾žœú^Þ3…ã»Ùá:F |ßÞ;ìn¼g<ÚhX €Ør7?PÝ&_–FÍzÓßk)u5RŽÉÑmÛØß¼û’¦¤"AðÎ^”dÐÔÌ¢D¿w…ýÓ߀Xˆ¨ƒAbýÓm´uéÌ™3ÑÑѯ¿þ‰‰‰,-I)ðc‰Ñh$ç#ô¬û_lllÐV°?¶È•÷yÜ_ñ ýÅYõI½°ÈX²;T¹ÔÌ›Í&Ðùåï‚yò@gÁØõöcŠ)pJk2ÿÞ\ʸ”,}¾ÍPBÏ5òZúÀ œ™*¡>+y…Ë`³Ù„Þqãëp fÀí{ó²ê“zAßÒ,ÉÐ2·ä¿žDšJ»F)Uè#ß?)h&¨±¼»¼~Woôô JÈxË,²µù,ú¿:ÙŽ áÌÀ#9:äd¹¨+U˜ý€ÈB5~——ßGÎÆ€ NÁVÛ [m3Ž Ò„6¦ôM&lµÍ(Jt-ÂÃO(z®²²2¡¹¹™õ€æQµÒË’ry8¡µ¸å5¹ú¼èòùàm½Õ^2Ôdeèbš´´`0À­ÄZèwKK¡Š~ì9¿›jì¹ö!½µµµ¨yg v-yK’¾f2™0  €‚\þ>X,r›)´ýêûön¢+šý=½n5–¢.¨n|ïKÆö`¤ i*ý "¹ˆ'ݶ ¹Ó 0qþü€k¢€”¦áRÅO­ú\©§«úG+RådÊ^Ýs! ß½·”¨:sæL455¡¼¼\’ÖÙÙ‰ùóçãÉî§M‡ÐÞÞŽØØX†[Lê_EþÙ%Îi:ØPiaT~èxùÜp„‚*râ_(@Þ ø›á„"r"à¥ö•é7)‚€"Þê¬ÜÜ ©ãr¡÷€ÞábÿJBË%óFÜ3©P÷é§‚ÝnGO]s;†ªüvoÊÊÊ„UŸÔ Ôí?å'Ibã ÒªèàÉ×\+Ü¢Ó`Ï·}Œ HS÷†šöÇóÂ\³l¨cÖ¿’Pë‹ ¯_)—H†*bQVV&ð1vØl6A)þN-zJÜÚѤGœý¨Ÿ¸2Vß”Nh·=¥sóÊþNLL„Ùlf)$òñóÊC´†~Ø$²2ô°÷û IÐÀÛ,†Þ«>Ájð"· NèÂÑã#, Xkþ¨õÿÅ_€¤F0/½îÚÚZ¦üù—¨æ-èÜ×ÏšÙð÷‡JŽÓŽ—ûH€›ÿ|„#{D…ÿra5è"J³KÜ•nøÞT·±€6KuŠY5+Ä™8¾$öOkPð¼úyîôTí©@»Ñè/Re0àÕ=˜•ït:a0ˆJ?MhÃÒéÑì\üý7p¼Ç*11Q£ ý‘0sæL|ýõ×!-Hô…ªtÑ“Ä÷”Ðëõp:p:ÃJ‡“c8Êo¨ãпÿQû vœá\ƒÒ÷/ÕË1ÜóÓô— 5§¢$Ê?Týß¾#@hÖ7¯ü)iýR«b €èÉj‰`8¬„{(BŸñP¼¬fU$½ãÆ!Ñd‚}˜ï¨ÐG½iªfì8>x2ú×ÔV¦O${ë1 .¼Ñ#Æäƒ¡1FÜ×hbV¾RL–f( h±ÃñÑW#êJNTAj ÒB—‚Ö\.âããÑ Ñ»£i"â좼ªËÀjX3°£¡>à<òsÊ‹’Áûô'.‹Õ1ë¬Aƒ¿ç‚E$üáŠËÄûxtÀ ‘•¡Ç{Õ'ry8Qb6óÝ /`Ñ~çtÂ…ÁcUtÂ=׎?ÔÖÂl63ÔüÁ‘£X»v-ª.^$€r&Š<“þ_[[ (t²£b4ÉnÙX¨â?¡g*3|ì(²±Ð¦AVµÀ€h§ù¿Kçàrô¢¿¡Ÿ€¯Îʇ?ë„­eeˆ+,DwÞÍ/mÀ}/gÛŽ¶´°¾âqö£8B,¸3KǼIwféÄ´ÀpåD¤}Y† uë———³pImm-+!-Ïi6×ùf-J[ù÷h#-^†;¥Ïé1;–Ò¾—r;ÿp÷î}ü!ǰ‰Å™.IqJ2 }—‡{ ÚWc8@„fædiûË çüt5ùOôêgÛBK(Ìÿ`"ï2ìÙ( z²¡Š6„*E©)d¨@ù÷iŠŸÚ¬q|_ZXžzÕõºƒ •Š QáSêø²¿T9 Æ Wz¸CåLS埚šŠ8ûQ1mr@ñÓ€¯µS~’Ä\¡°r• ‚/’~´†Œ5hp>Œ† gÏé0zTÚNöÁ’$Ö ¥€)9gt+eâ¤#N'.×i¦ÓâHŸßõy! À§ï”½þ:Q­þãÙ1¯OIÁ”)SXQ ÂŋٶPBS”# ä¶–½@­~¹òç…ïGÿ`¤ 4ñ|ïÃSé–Àz½ßkƒk\K±¥ŠŸO_ ñIJó×TUá²o¿dn~:wª8…/ÿŒ~~„Xàt:~þS@ ¿o¡úgÉíÆùCöÿ1:þXÇø±ÀÓ¥6#»Ôùq)FT°s_ʱ.µ­¼R:¶R*"?¾`Çù¡MçøuØáp(vP‚Ôø±”?Zh¸7teúD’§UC3Aë?®4`õÿùø?¾&_ p°1ËA@¨ñ§P?ÄïçFP@AµðäÛÐâaCå¦\NhÞÿi§…FÑb ›¤cÌ@Tú|v ­ o+Ì+ÿñ: Nôyq¤Ïƒ:ñøÐ8@TôTþÒÐ 9—Ò¶á”ø ö húŒ¼ß;/òÏä„GZÛŸ†œ¨h§K@OJ¥ àVcJ€›ð DEOkÐÿéõwvv2kž¶d¦Ä?ê5¢|ù÷xÆ{O›¯ÿêÊÿßòÏ•¢¼Ìsg¼Q:”Ê€@þýl¨}å@ûR¼Éôoù{®$ÃRV?T.õØ+Ó'’Á<Ôòüi¾¬0ÝÆs BÀð­ÿP¾CX||<›4¼'à±0ïAQŠ„ªüùsö}ýh €BcxP/güUЄ›ññn¥2ºü8{ÇÃõ))øKCƒÄ}Ç OñóÇæ¤½Ûåîkê% ŠŸö§üÊŸ -óK¹õOËÓ±QîIݧŸ²…câüù,î@±—Åb!råž&´xfŠR ’Ü|~QE©ÿ[ñÿ[þUåÇÖY—‚½ÿ,@$_Ëþ!C‘SŒF#¹,üò‹Øb± ™®Äo%µ)æs(ç UJJJ=ÎPÛüà´­’’²uëV²uëVRRRB‚sõ|±jŸR'4ºÿÖ­[G°.jõõõƒ?ÇËuŠÛÌ& Ÿ#ùì8T”®QéÚËžŸL’““Éê›Ò‰Ò¾¡<%áïÃo¼¡xŒââbòÆo}ÿ–Ë¥ÊPäêÿ˱üX’¤ÕHÆM×éKYù{ðcÞI€œa^”šÀ:§iO¡ÈULÃe͆wF(Xùù/èÎ)î«4ÎÁÆÏ3{éy”ÐV°ý©ëy0±X,d™N²®Ü:•Ÿ'Ôô)º°6Á.\TÉð÷[î&6é©’§ ¨¤¤„tttà‹/¾`™S¦L 8çêù±dÕ¶v ›ò–©_|ñ8ÀÎìzÊÊÊ„ÂÂB"ï.˜žž.Ô×דúúz¢¤õÝÑ0^®#úÑöSXXHª¿†ó ›ýbyÙÁ€½f¹¬[·ND…L¯¿ðñCÂY:IUÍuëÖ %%%$;\%E)rƒ!‚ ç]MLLdLïÊÊJÅï455¡±±ÉÉÉàŸÙ¿’Ð9öQ7à_Y~ÈÚ«Ä|ÿ!lx¹(Ëd2“‰ü=æ=°ôÿPÏ#WÀÕªh;ú}ˆR©˜žˆ8ß‘="7j†/ôº<ÁP/Èå³+ˆkAj ùâæ_Y“ÈŽ¬IûHÓ…8É¿Ö ­„<´ú¦ôA]ñ¼ðäªP,ó`û6‰•”»Ã%mµ:£Ù߇Cp¸"ÆCÿç7Ôøé¶Ò‹‚^¯—(u‹ÅBn0D‘=.Iê#ýžÃá`é8J Úb±Ã³Åk9ù³‘AÓ9ä@„Ô½OÇKÏ£t=%%%$99€¿¼’TTT`áÂ…/G¨‹ü{´A múnÝ:¯ÖvðàA(X€«^Ò|­†ÒÒR ù¾r¡}Üù–²€***PPP9hkk®Ë0`LÔe˜zÅ,@NNÎt}­Û/ô‡ƒzÍöu·÷îØ÷Ö­['ðJÉ´eÏO–k禗pBŽ›^BKKTqjüùÄ ô–ß-ñ“­[·âðìÄÇdz{ˆ`⫵·°ý·mÛ†ÿùÕCX·nbJë?[–é8~;„Ú|g8òÿB ‹ÅBb5jq¾ƒ­5IZäg¨cða»[b5jɳáSP §Àq›gÆâ†´y䆴y„/ÚUXX8¤;]éú.%}²°°˜L&Ý¡€/CŒZ…ÈØXD©T$â¼ð;ú}ˆQ««Š2Iÿ 3ĬV+›4“®\ÈÎ=Ôù?»rùUW5V¦O$K¯ÌFÿÑz\ûJ1¦N 0ी´‚_,hq‘¢)JM!|ùÙÁ„*Ïe:#{\ÈqÚ‡|yxÄj4%ÌlIåµ%Æ+;*z½F}dŸÝ8ëß_3š\¦1ÄEèÿôxtüï™Â1²Ç…{½=c[ïPk=â|޽тô0-Þ½Ñ2èõÓýøë­§CôÛ±xì×D¿°½W|¾'_5ÍáÂæ“WÀ!×ábÄ»`Ìï¡„* ŠŠ EÀPºFºMÖ­['ÄÄÄ 11‘5*--eŸ555*sê X\ªBÙsãÙqfÏž¥K—böìÙì---šššõ$P¡ àÕ…ý’w`Ñ¢EBEEÖ¯_Ï€ ºúwÖ‰q÷#Ìxàî_á•w^¯À#[·_v5÷`Ws< Ö??®Þ}Ê9à@…ÍÍB$­†äF9‘ã´#7ʉÕócÉ`iyR6_9”®)‹…äää zîž‘1ˆR©HÏÈt··#F-ªYªü¯¸,ÂÆ W¼r¡Êü|„w}Ö†ú^¬ja‹*ßP¶þ].î9r+ÇEü³­X9ö(fø<O…’…Ã7yÐôèq_Ò·HÍ„7Â…ÔüHÉýå]ò³gÏFrr2 D:Í÷V%÷°œI?ñ„^0øöºu넦¦&JKK…`Ê”)X»v-*l¢Þºu+™2e è¶œœ¦PéËJCS¦LQ×ê›ÒÉ«â1gõ)¬x(WÒpÑ¢EBLL Ö¯_@ä\7g-ôÝѸ#; O,kDÉ©¯PhJ’S?ZC²n"cljd@ ”¼X}S:¹ãÍÿAØÔɰ¯»YîDcc#H¼§Æ%$TqjX3 ŠScÞ ÉØøÖŸ±â¡\쩪Åî½½æ  ÏŽþÐÏ1ëdOU-öTÕâµû¬HÚ0ëîŸ(ÞC^þY®xú^d‡ëÈ“1&«Qÿ â?|W5š:¨Œrã}W6 w)¯3Á„Ž›®Õî>á„.g¼ý£Qc( `4I¤ ¾vÝ„ÀápOƘȩ'ãÐîíÎGèÑMç;×Ú]mgÙïãÇ0…ÏW°Tüú,ÚîíäÏ#77Çg)§e{/bÒsÑÒ×‹é ªªªàpá|Ô)xæÍ ©"ëIW¸ÁAföáŠËÂákíß = r㡊“z8žþy‰UM•~JJ Ìf3>ùhVH¥¯“´ÒÑïCw{;"cc™òïè÷1埦Åß¿ ’—õsR8E\Ó¨²ºR…I‚€1ÌDÔ•*Qù7ß°ëgW. ·‹ |o½Ó22`=Ù0Я_4*„T¼T-Õw48…5õGV@ˆ+‰‘Vìhp Jìb^äq'yu(:˜ð‹c¦BA@tß(ñ{®\¦sÏÝæî Ê‰/›8Øøõzý½½éqv«´’B2t_Yg/A üìViñrŸø/_¡Nî‰àÏIë§SÑôèqâoš=ÚöGÀ`0°†¿Ž… ¶lÙ"éøöÕÚ[È_~™I‘FAAA’““aµZAýŒîj<’ï=OãòTùSwóºuëÛ&S¦LÁ”)SPöÜxòóVÌ™3‡yè±ùï“¥-:,Ý¢Fbb"æ¬>Å:'Râ[rr2bbb°eËvh5½ç^NÆ+}IÈÉÌD¡) …¦$”Ìø9]É‚cÇéïŒGo½ØÛŽò¨455áá¼+aÍLxh ”Ž=99™)rÖ¦õxƒ0å'IxèÞŸÁVÛŒ,­hÁƒSOÆáÉÓ?Ä?˜Ð¹wÆÛ7;0^–_ǹ @„ÎÍ¡»wïFRRŠŠŠðî±ã˜gP¢®¾uõõÈÊÈ@VFêêë‘ÄÉ1îd,¦*nƸ“±Èò¤2j…c'F¢`éH¯oýv=r?:5³gò?ëb¿;::PQQÁ¬ï·CˆX·,ÌÍÎÀ¢µÿàJ[,Üß®öÁqÒMÛ?ÅcØÍƒT¢%Éj²$ÁŠUsG">>žUxæ_ÚbáèyÕ¥Rü —ðfŸÅg¡û¡I®Ùãtq2Ýhôôô@3a¢…OØFèº[.Ìf3Gùc6;HP©T°©¢«Ût/¤_Mkb¿i¨pÑé’>"¬¼¥µÇéâ(ó§m#¬xJ§eÌ—Z4T*•d•E*4DXðzçEDX0Én鹄×;/,Ìw;Ч…JÅ›ÞG Zñ”NKdºÑP«Õ,dÕ¦ŠbëÅï˜Íf&„ÒeÐ([av$!’S#’SÃaucà‚w­Ç•èNI+ÀY‡“›¨Tªá7yRû/¹`l°âO/œdÛÄ´zõj<úè£((à׌k×®¡ÅvüÀ/cÖ¬YÈÍÍ%«W¯ök{Öáä¢<Ê×@O"¯ôúhþ²1r&@÷™3 @ÇcîSÒx¶|Ór9^8z ꚪ¸ðÉ¿ja˜|ð—ÛØx>t©-S~„YS±fÆtlžÝÝÃå>y†£’¸°"_]]jjjðY_¢Zwâ½Ö›p{L ø¤E¦´cÇî•W^AZZ—Ø»óæÍÇò¤o°ñ-~œ{7àÃ?D]]þZèFbïDµ} €¿ÔØQkæ‹p~ ÈÊÈÀPÓ(ÔšûQ'(ND…€û¦g¢dÏUŽº9(m<|”«ŽÃ€„qŒ1Â_Ð ªíS|NþJ£ 09]]]ܧgÎàüy;ÆyÜÔg¨ eêï·cI‚—´©ØP„µ%­>@àgw5qÏîjâÄfT1Qí51L§tZTkþˆ* âuàß1XWÜ–jùDHÍýz½žL#bÜÉåöëC¬BN¬V+&Ùy “š¼‡{f³™Ãe>‘T„uÔ hh"-aßeºÑì¾)#³Ï2È4t  ´ž±uÆéâ¨0sÑéÂv‚ß„qLr)‘Ümu¼Xßww÷]fJˆ¸Âì³ÍÍÍhnnFvv64ÊVÖ¡p¡£ÃÏ @Žižª¯S'D`å’‘hr@6F÷%š†’™=éX¼ôÒK>Û[ZZ|‡¬¬¬ äžp--\ \†ªp|ÓfE…uˆí£ßÔB€ØçˆÑz¨ù¿ÿ$AÿI‚º#nl¸—‡‰bþ IDAT_O>ùW-Ûo¿—)QÆ~BíþîÃÏ+¼‹o°çRRRBjjj˜VðÌžpSPW_cƒD6œû€øÏüòdö›šö{{{1kÖ, $­DBÏ4ÿZÈ/Øííí¨©©ñ FlØT‹yóæ£dû2l|«•uÌ0oÞ|þ“ecàÀüü|ìœÝˆôôtœrI×ú¦Â²22˜ ðõ2°êÅ»¿¸0;+œEçÌ3D°0<ÀûŽRÍ\Ì£ Ê}ITÒTdÅËÍÍ%Û¶m#cn_Øú ï·£³³÷müü±9´,t ¢ï75_Ÿ ‹`šh(¢šúpý÷”K½c±±±¿Ë45*Ý&džoØ 2ŸnÕH¦G„‘œƒ¸ètù(ÔÔ,îƒL7šýÿEŒ‹Õ‘¤Çéâ‚Yõ‘M±6HÀ&®¢cG×YÊÀõz=¡‚D°ëfk¢}ð“ì6̞Ļ%^¿Ú/Ù†ºPÄÏ€âL.7Þ7 @ÝÙØØXIìÁ` µµµÈÎÎf.Ú³ƒŸïB!€¶¼Ï#-\ÉüûC1BæOÁâ> ¤„W¾úê+´··cÕªUXµj•ò ›† ýÑÉeàÔjV>ÃÁQ:Þü?~/rÇì÷;WÿIïergYPÞ°F+ïÿ7¨öàMù{gI¥eØâ)ÖF™¿ã8ÿîýýÂdÜ×ö9ºTéÇË‚ªöK’Õä$Ñó¥sƒ˜ÿ¥åÁÜâ‰,ÎLFÛŠÿõ€yXˆ]„tÜ( ÖÿáÐõè D«¹ ‰ZA,K@7'©E"PV(áËJ«çýÄbÄîÝ»ñ‹Ñ'ԋ汦ßÂ’»âsQ’²œˆÿS?{MM z{{q{L ÷Q³ºûb'ûOdóÙ~€×þ¯Ü;‘käå塬¬ '?þ‹Oþ=Ã̰BAϬé¤`éH²ñ­¬:†Êʨ¬äËë;PYʺlØTËï«ãµ°‡zˆ[¹r%Ö_¹õת9M…ýƒŒÑךûv… B¢@@Êô³²²`ÈÏ´ôûþVƒ7ß: Ã4%*6Tm¸}Ä—€Äûœë`­÷yDËd$-\‰± 9[­ý·hí?üžQVVª««Q]]1·¯ÁÁÚzôôôø€éG(d>òšäz ÑhH´LÆ,|6UÓ@_è5qFÒ@Í¡†L²Û0ÉnÃ/bÔxÀ9ˆX…<¨Ÿ^jî%%%FCzzz|\k¡2¤QS¿ÙlæÎ„EàÍ> nPÈ™é SbÊ]ãJ¤ Äb§VƒS«1ÐÓƒÏ8Pë‡ÉdByÃBT{™éà…€Éúoøˆñ{aPí…Ñz³šÜq´„{èR%T*:¾Â¦;\­¶]N¸Z ’OþŽÈÃx7ñ6œÈ½ÉïY(ðÏ0M9,ô?0üÒŸR¿¤Ú ·]¯&~5ì2—®'^4Ø9(à­ý¾f|q9T>9CõO( x)¬ò6×À37úM)PU.qDÇÿ øðߢƒ>/:& Ìâ°cÇŽšÞ+œ8{î‹hrÀ}±'Ý„ BõþYîãÛxàžN§CMM Óê V&0¼S¯Á_ ݨ¨¨` º‚¥#ÉmcÎb¨ÑCÆxlgGe]æÍ›5?e¦qZ’¹².ó²l L·sçNìÞ½ ÇGbÇ .ähQ±P+to°2 `i‹…«èîcÈÃ_wáÄÙ³H•ƒ±¾5ŸõŒ‹ ÅÅÅ~ãùì®&Æà™iÑC41P gA…9*ì~2Ïç9‰çR(KS¿Û͘Õz„ ¢ŽÙì>ó"Z&#œ‡I´â¢ÓÅ´Æ}–AÜ c8 ±(i4B…e•J…ÖÖVN¥R!))iXr„›* gÂ"˜é\Jƒ¾ßT€8ëŽÙìÜ>Ë wÌfç^è5q]1#%±ÐŠ!žèö§‹][hA¥ûeºÑŒÓmÖ¯ Ѓ%ìïêÆB}1êû®âLXcòÔ²$N•KûÝãtq]]]ÌÝøº"¬>k¬Ø—o2™j  –j€³nfŠˆP5hÅ™¯~iCÍçýp_rùÄÛ_‰ää•^önæææ’—^z‰|ùå—hllĦM›|¢`JòèííŪU«ÐØØˆíÛ·3 "Eþ÷»ÝìÙpj5z]n‹[·n…J¥‚N.cke”„‹×h½ƒ7íè?êÆîå_c²þLÖÃéqF#'ÆPÅouT.rôrlê°cS‡É'ÿ‰woCWW÷Ð¥JL*- Ò©Œg  `Ç ;Câz|çÂ[¤à‘áœCLßF{ÿ¶ýŸ# / ­ô\RS ¢ˆð|ÁÆ2õþ4ƒhŠj¸7fª )ª z Ú†j †t>Š»ÿÕ•J…}t3Ï ùÜ(£¦ß†i*<»»‡›gPcêĉØgäÎ:œ\Ó“». ´¹…««¯gi€)i?ÍžåÂÓ£>a(]Ã4ßçÿ×B7rŸ<ÃýµÐÍ\%{®rÇ>1qåf^®äѲó²l¨¬<€Ü'ÏðB„gþ»/¹`¬ï`Û>*aúÔ«€S©züøSF/Ä=P!`kåAdNSù['ÕI•Ãà(³ÈÆÈ™© ×å‡DS…•ü ‘ЋՑ~™=‹‹‹¹[n¹ÅÏ¢Cû xÍæÁ®'EÄbA¤,t³ /%ã7a:Ÿƒ+‘<£ Ñ3gÂ"p&,oØ "¬Aý”ÄîHÀëZ®9žšÓ… ôzp ´˜ávuu1 žøxú[ìÒ\¶£Ûzœ.f  ?ÚN,¬ê7 œ¨T3aX¨÷&SÓ Y¨û§×¤^*PQ0³^¯'F£‘ËÍÍeæÿ¾¾>k@JJ bccQ[[‹ÚÚZ¤¤¤ ¶¶Ö§F–…Ǥ…+™–@¦Ä™’•ô–¢³'W^^ÎmÚ´ øµrÇŽhoog À]ŸŒESSV¯^Í›7Ãb±°fó§k¬Ñ Íý49à+¤Oå5{£‘3Ü…³{páì˜L&^Уþ{þÓç¥z:-•ôÞ;“äèåX°|rôr|Õ•J…Ëù°gªV59!I~i€=ɤ–&!Â_¯×“¤¤¤ëʾ$ÌT'Ìpw=}Ö¯á÷mú/>O¨Ð¢@í„~¼ë½®ø\Ô *N2òC^¯'ÿüéXIu02¿<™P?þºüXÆ ÖåÇ¡¯€OFÅ?,#âóH_((ˆ…ú_œ×¿üÅIÞ~,KcñøBMºüÅIlû虑¤`éH2z&¿oIJ²Ï»#ÔÖV>)X:’$'Fq‘%á;(× ¶OLEÍê´Ï,¹¹¹¬æÂ¶mÛ$çžðÝ ví`m¤¨p¾‹ßávñ'P?4MÐ÷v8ý— [ Ê*î¯ø 8×nípû:ܵeIJ2sWÐãir ád”z^ô#Æv ’””D’’’ˆÁ` ôŠ?Â}´O‹Õ‘l¬'*D£Ñ¢¢"v]šôh8Ï=77—”””°¶………„æ çHJJ"ı‰+Z&óãYÑ2™¨T°y¨×ëƒö#P^ƒÁ@öaa‚Ž3/gc@…šñO¯×±Ö/$IBX1lIJ29é&’•Å‚‘ÐÇ&öí·-m?Üv¡ÎIã÷‡sÎïÒÿos=)šK¯·-í³µ,FGjG¼V!Â?T[!]Ͻ›_žL^;| FF\ÚbáÊ_œD*Ð|ÿá»Ï2Èý¡`9p­/d½ìuù±ÄØ`eów]~,™gPûhðâ{ÈŽ¶À}É…}–AnI²š}òX™]JT+=3’È/j‘­á] û»º}Â"óÿC K ǬH•ãïS`F¥ ¾´ÅÂQ¿å oY !yÂk kHQ´LFtr™‰t±:’ì³ llÞ…š“Â9 v} 㫇Ó^8w„óR$ž_Â÷Nx)Ÿ ö¾K‘T߇Ó. 8л'uŽáXÿ†ó¾¢%)ÉdW7&ÙmÌô/Üç;Ú!tãH=ûP$<¯xýu:>Ró‹îϲ˜P§Ö"òJ¯d¸£•””Õ«Wû¬{›7oàMYNûºyófŸmÂçBß½ÁQ^ÕýzúAÉ`0ãé±@ÿ'ýø»a…××ëõäôïr¡-z# û“ßFáB$BÑ·a–ßgûPçÅ”¿¯ëÓó|Ûó}—˜šþƒÅû‡jOÓñ/ª”Äç•Ò*†I¡×뉓›Ãûߩװˆ©Å1Ô"²0Ž?ÏþnÞÜöñZþ…\þºoÆBñBé÷·òù/(#R &%E·Ý¢Àñ+úb|î%Ð&î·xüƒ1ará”eá}¦1“–O)&4(¼‡á áR úûz?Cõ#C“z§†ƒÉ u­@ãw=ã&>ïpÎy½Ì[J0 × ÔæÛ®AR} 6¶YSÀ¹.E¹¹¹¤±±qXŠ_°ýbæÿ}ó´På…{ïI6³b¸5{~†ûÿWú>„ ï"½ÓsßÏÄû6/µPØŽAjúý"€¸¥J&™h(ÔhÑê{¨Å^ªM¨û Õ‡Ìi*TV‡<ÔB}½!¨Âkx„?1ÐHŒ+ tý`þÝ@Züwa€ÿèz-\×û~W Z¨s çÜ¡Ú}W«æÿvºE~(æÿCÐuK•Àõݘ°lk0' µ=c¦ËîJ%íçÕ *Ï!¾×ÒÌt²äx#s“P3n I>Tß c6±ÿ—4ZÖ/FC"¬!ÓŠ.II&o¢ñsc¿Y¹;yyýšoØÉÿ¨—·¤¤„œ9õ<¶í@æ4fg…£èéã×Õ÷uËÒȯÃyAB÷þ‘oíŠù¶˜IÅ|_Å&}ê~B›ûHZ—KæÎâC’¤Â¥ˆZ ã17;kë‡}4ÆÚž”„'—.ÅŠ+ÐÜÜÌ2´ s6탃áãjII&; N¬4*üì”ôz=ÉËóFB ÷šŠ”¥ÄÙ¼‡£ßÁöIsß‹/x÷É'ƒ^Oªí÷Aùùùð-:E)è4˜ ËbùçBãÞàÛ¹7¿- ×銞NK%Ç.œtL‘q~sN|ý¢O4:”kTxœBØq§„/Ñþ®nX­|-c)ÆÈ^zŠ›nvw÷Ì”$Pܰ˜Ä禈Öë0ÂÔž´­D¡O'´pÑ^’’L;\(ÍL'‡.wz“¬ˆãs…ç¡û¥®3ÆlBXº¬ Gzái¤š½fžëlª(,v;˜ïV¼°-II&E†AóKj C©g_wò8òÄü[±}k;ÞÐÕ²H€ï➸¢a2B´ìpˆ2€?mîF^^èB\XXF†»/VGc}þìñß/IV“·²S†%ˆçšpQ æ§ó_ÝMðy€2ð{ùè‚©"p¶Åwî­[–æSeóM€{UQØV߇<¡`BŽb(S]·,Ì3D ÷ ßû£Ûøì£i„ÅÇ‹©°°|à+¼{ÜŒ¢¢"RWW'¹À UÜOT á`m=æfg`Óv>Êâ`m=œM—ð冟‘PÄ}/¾Hæ=Ž5#G %%/ öQ ¾¾>  ”«9îè„a*/Tÿvö,ßîÙîy_•™aØ ;F5û¶×ëõ$==ÙÙÙ‰ôôt†%±ŽŸpqU¤,%ô{‚ûÎ¥,%ãfüpþèï2pEÊR2&ó9×ÏVz‹Výcg èñÞ}³H A¡°°$˜ø¢]kfÏÀoO…C§Ó1Æþá‡úÜG~~>3ýõ‹?ƒ­Ú†è51xóï ¨¨ˆÌš5Kò}fÊ–‡É’šÐÜÜŒøøxdddðÉuæð¥Ð¸÷|kÅ.ѵ1û¡)S!ÇI»/Ê^|ýR}ëÓˆž;ÀˆÔ<¥uE&ýៀòò0> PØIq‡3rV! ð¦1G™ÜÃ3´xâÑ1°ïÏ$BÄõó'¯qÏLðAh4"Ìõ]Qð Еƒ=¾IÆY!“!aœÅ})¼'wïedggãðŒ©Ì¼SÚÜÂÑEÄþã;XNlz=¡ùô•W^aZ‹ "R32&°ß‹Õ‘dý_¶ %N‹Z›õ/,]Ž]oª–ÎWåz(2 7¦‡ãGÏépûë v…—z¡Óé°èG|ŽnáØ„ ­,))!”*Ÿ;:sêùa—ø…Èt­ 555ؼy3t:ZZZ°eË\>ðѰrQ0dþüŸòÌÿ?þ„·²S|ö"!Z_£Ñ”¾]JJŠÆ!ÐØQ†/ì§±¾ƒ%1dŒÇºeiD¼ÍÏys}rb±ÄñïíÇY‹}¾­V+;ï¼,ß4À%îÉø»+ѯ?%îÉøÜ¥™qìš•F›ßñâIôý½ÿ¥€—^~°@Ûà— M\Øq„Ïg?³õ æfgà˜“ŸC÷³èˆ/7üŒK rKÑã¨|èøÄ0O.]Š Oêä0O„ßTm’œSO§¥KP¦òx cƒŽS#±üoPkîÇÜ©ýÈTÈ‘©ÃqÜŽè_j|Þ÷ÜÜ\’——Ç⿵Z-ècƒ†i*deeIfS¤,%#§ 3WCg®†Åb^™lj*8NT±í:s5Ì™+%Û.ÌÎÆþÚZ\*/ÇŠy#±¿¶Ÿ×¹±¿¶+æDaa!¡Ä~Ol<µ©°°•m^3{"r>Ìÿ?ÿó?Q[[ëó¼…ÌĈ1bOá 0oJò9¦¨¨ˆ³h ßÉ3ù¡hnæ%«ææfìx{ÌÖH>5»gÿA´~ÒMXŽ˜¯ýPÂÀ’”d"T…¥ê&ôz=Ñ$†ù|B]Ÿ¾ÑsçâÆå>e“…ß´ärÿÁƒ¸ñF¾_2aGèoFC¨4M³>‹…%õˆ¼ÒËZØ‘ÍeWQþç^8Ø'ƒuù±D¯×¡@ŠEI ö*((` 1e¬Ã ¨¦”€O_+Àô¥“‰Á` ”ù‡þ €wrÍù4V÷•›nÍ/½$%™¸/vbkÛÀl¥÷á 3oÅÆÆ¢ººeee~™ ÛÛÛ‘mñ i«¯?‡{6òqÛ4l­ÍŽêêj<1ÿVØTQ !c¬ñ•€mƒvh~éBVV®=xo¢±$%™ÈÆÈ±uëV´··£iÈ…qn¿ ‹ÆïÌ©ç±e˯Ï$¡L¨¬¬ “RŸAFFŠ×gë¹ÅÄÄ Ï<m-{QVV†Y³fáË/¿Dǹƒ›Êò‚¥á¤Ú´F&C÷GÀ}É…¯û-þ„è_jðÒ¦KlqÎÍÍe5Þi- “É„²²2\>ðN¹¨0MÀW…ÎAªùËnöÉšxÓr9ì©nZ.÷™/²ƒ›1r𵀫 F¶ŸöcOÉ.Ü–%Þ’]캿[š‚¡iÓÞÐ)¢Ì¿¼¼œ368°ñðQ牳gY5©ùŸíÃa‡KRìééaÌŸn£H÷ˆÃU=ÿ§H˜7^ÒðI/êëÏ¡¾þ22& ãØQh”())AEEâFÛÑuÖ÷ÅNܳqé…§}®gþ«ë†WﺮÚË8é&ȸ&GoéDôôô`å’‘p_ra¾Û«5@-j®ªU«p¸nEEE¤x}&.¼æÿ3§žGê¤:LJ}fX–„¾¾>,Z´Ús ÓéPVV†»ï¾ÚSÑg‹û_Ú Óµ*ɶÂèKçS󻿳³xvWWÚbáŒõè½wæui4)”°P“d<ïe9Œ£]ȉ Ç×ï¼ u7Á×ï¼ÍöŸrû'áÈ}ò g¬ï@ê­ >Û£]Ø9»þb¸@q2¢gw5q²Ó˜v×]dݲ4rÒîÀ”0%Ößw/àïO¬äÇÁnÇaY/wß®Gø3€}s4 Ô¿þõ/Vü†¶/Ú¾ƒ%áéëëÀ×ÚX¹r%ŠŠŠóר} °%w›°Ï¦AÜY;4ªA…JßÅÊ+Ôè…¿3rl‰Â#êèt£¡ÓÆËN«&ˆ¡SÆ–.G†L†öój´ŸW3kk vôÜ'Ý? S0ÅPÌìUQT Œ„ÓâFd,ÿÞìïàÇñFmß5áZ¾Ý虑dôÌH?a€šöµZ-*7£ÿàA\q3æ=Z„o”{ÜÀÀ„¥Ðjµ}ëÓ¬ÃP!~•8‰×r=i#¬H‹Ãôˆ0·v#¥‚N\‰T¡Ö:€ìKaø L·ó•È×åÇçIÞ¼Ž®Ý]Ü3SFÅ%žÝÝÃQÿ¹ð%éééÁÚµk}JÝ. /–2¥J†n$N“ãâ¡6´5LÀ™Ë=ÀèX¼ø·íHœ&GLL ¦Ür ¦ø¯×þœ=‹‰J „õa¾Û¦!lª(D zû·mÐîc1÷ƒúÜŸ{î9|ò»G!‹¶ðUÕÔ@z{;rrrX&,ß’©ç0è&°]CÜh;º{zçÉfqk”òÙ©ìr»þFE*™ýˆuº:¼~Í —iLƒk^ÅïEàÕ/m€L‰ß„q8`'A£rssIûy¶lÙ‚U«Öjj€¶–½R‡ûQaa!9sêy˜® áppÏrþ:Íg!ÛîÞ½›Ë™ÙF**˜)¶¯¯ãÇGUU>xŸ¸EEE~– CÆxü:<Ï‚Fs"Ãa#‡ù’ ™ŒÅÀ§”­0ŠAøŸŽ™x®R2Žv¡¥ÍÆ!1‚ä\Gõàr"Ãñ©…¡Se Éj||¨mA‡–gÐD䨝püy€€{E<Ó߇žÝÕÄ­[æÝA…€S_´q¶YððŒI¨4ÚpÔíÄÛ{Ay­­­hü 罹Úÿ@ ÒÓ€¬¬,´¶¶"ªu'Þ©×`Á‚C§Ó¡Ô“’˜Ö! ˜„ýÝ2Ķc›u§ÜNt_ƒÙÜÂj•àMú6ÕúsšO£²µ)))Ìâ"‘¥¤¤Pp,¡UÅ47K¿5ùT/LyÇ<  ÊTŠÿ>ËQRý IDATÊר1BæßÕÕÅeG[H‡Û “ç™r;é³—4ÿÃ\í§Àìݰw¬]‹½6°mâZ 棠À?íiÆÈiü8(ºíVþ…ß=eî‚óÌÆ¯°°ˆ³9^øñS~í'üä8ý»\LþS9¶mÛFzè!N«Õ²¬s”ÉòÉ'¸óΧPºs'K»›••…•+Wššx7éKcþʱ<PÙŠØØXŸª¦bß=µÒͤ#…WÉTÈq¯­º˜Ñ%§úìÓxÄóûu‹ÍOSxÞ0M c¯àáÂ’iV¼sÜŽ¾>Þ:éŒïǺi¾€]¡P@™ÿéá¨þ¼ï™p4\‰éaÈŒãc1†‡ïRL­o PË0draÈäÂ~­ ¨Çñ|˜¦§Vs›7ÃÅ7óã`˜‹è¹s1Ïã`ããÙÞÿ>úÛ9èëëƒð"÷wu##ŒÆÆ³ÊÖDqüuÞ7 à‘ä$íh÷ɱÜÕÅ3ôM¢Pk€Ö­D&°ñ­ìú["^Út [ªdèêòß¼x”9Ê@Å–jHJJ‚J¥ iº2~@ÏHd¿PÁe9Å  ‰Ü Øe4rÍÍÍü”H9jÐ „+q%’×þ®x¶ÉnˆÔʲ˜PúÇßá€L U¿ Ÿ|øá‡X±bŠ‹‹á-ƒbP…[soÀ?«Z¡ð:,NŒ ˜Ú,uä ›ïnXºðXZ;]˜­”ãýŽfÚ츩Br· ½¥Q³¸™ rŒÐàýs—pCo¿¹Ÿ}­CŒæÊÊÊ ÓéÐֲǜ’ŒWLyyy((ð‚õ´#ÊH^^zÍ·£¤ä ûk,XPÍ@XjµùùùàHv}|Š+^ŸI&¥Î v ôºÜøÔ2Ý Wˉ gV‚?Ù‚¶7›Í\ll,cò¡"((O•)ОiŠñ |z–_ Ï:œ\N7!–8N2±–pÛæ€ä¨ EÂ…)91‚œôTMÃy`J?œM—0ÁÙjD®««CVVöY9ê–âûb²@Û€ŠvÞüÝÞ®Á‚ ˜¦Iç/|x]+¼`®!&'†³¥J• µ N‹ µwÝ:d²#L#ÃÂñ‘¨#^ "eþƒÌx­Ê‡ÙSÊä8÷(³€àóW*˜ '£À¶L…Ä߀œ±ñØÚv¿ ãð›06UÒøhEÉj7ÚŽ…qn<:Vîs¿ÏîjâÄãO™yu5oJZT*š››Ùý?¹t)^yåÖVÌ=Xgñq[Æ¿ÀkùÂm5NÒvååå\NNŽPàº/‡a· Ý—ÃØ»[XXHž{î9Ÿñ£¾|•JåãËÏÎÎÆ¯~õ+ö_¸ïœl*ÄÌßÙ¼‡;'› ØÙ¦AVVcþYYYøÔ4‰c‚Û ¤[s b.1&e±XPVV†ŽŽ¬X±}}}¨ªªò)g+¦º‡f3¦G¯UUUûé x|Íx|Í€±Ÿ¾À˜kk+Š‹‹9jÐÇJÔ7p$yýþÞ(Ôü)ÑtÛóDÈlÕüÚ‘£À¼¹Ó`OÁšŸGû¬½M“Æ’—VÄÞ8_’ù ‰î¿×æ­Ì¹$%™0LSâ’FËÆqŒÙÄܳٚh¨§Ê¡èŒF!068$ÁòG;ÚñfŸµ6;«þ7è&tÔÚìxß4€×>ożù_¡æVÊü_·y§@qÂrÞ¦5yŽ KQ¹©˜ùôžñgz”öLŽÃ7Ê™€pè —¿XÏð ÀÃÌ7D}ý³#ÃñèÄÌ>vdJ¼7q¶ ÚùòÀž‡°¥J ]]]œbN,áÿ¿Hþ}ç^ã§n€-U2–@Pø‚1¤4·Mž"ï›`$!ãF… dÜh;€0†ªßÕÆo§!…€7âB}œÏ„êêêâöÁ/¬lœL˜Åñ¯ÂâRتywuuqÕÕÕZÚl\r"HK›l¬¯Åë3É›oFÆœ ˜Ž?¼ÑÂàŒ´¢¥ÍONÝ7Çlv˜Ù¯ö6ÎÆÕ•g°²ö2DX!íB©©©ÁîÝ»‘9MÞÞæ€Þ{Åë3I ˜üI©ÏàpÝÓì[Ë^´ŸWcír>”¯¬¬,¤‚‰ýÕW_¡··—†@:´P¨A?vW*Œõ¤Â%³nŸ8¬Xt꺱Z­0޶3-°¾ŒS,Œ¶´Ù8Lçûw&ŠP³¿0oi‹…3dHØïCô‡ÒpB§¨&þî±3¬ïTð@ë(&ÇazÃy÷ *m±pb%ÕŽìã'ÌeÛ…~p!±ðÇúÊ3dŒ‡!~¹„”––æçN£&sá{D“¢§Ão›øý3žÐœÖg øÒÎÂ{8åæŸ=_P*‚å2©®®öÉ àlÞÃ)ÒŸ'Ê©s0¡î—€§ hmm-+0ðLÛ6î? œ:Îs%ïÁÙ¼‡‹]¶ž\m0b÷ñèééJ¥Bcc#®jræÌ•>(mWA­æ…ÍŒŒ Ô××ûWé9ª««‘žžŽÆÆF6.kfÏÀÏ«‘ﱬPœÀãþ³´OéxàÞÆÃG1&f¡Ï1`¶˜-~½ö"%o) Ö¡K2`€7ùo<|”™þ ò)°U;™% "Gôu<®Pa{LÜ-§ KNeÌßyôë‡bÆLØ?zß§o/;­@J2¡%»8Þäß§ÆÇGŒX-8îtñÖVBàŒïG"Ça—8¿$%™íhg®bÊüoÔÜ ÅÈ€}–Ak;ƒã°Äs}\Ž€Re…Ð À×0>uã€ÁÃ*˜%áþƒqs%-”>¥Ç7#Ê´111Þ0@ „;Úá•sôüƒØ¤çóom;ƒ“4}]]]ܪ9n<3eÙR%ê9nübÄÞ¼Žé %Ž9PLQâ½GTxâÑ1< «‹sžäºÔ‚&t/ЬJÂÂnÐi…bP…îËa8×cgZ²*NA¢“n@GH“?|v'Îñe%Å×·‰Evv6æ»>•§Ä>?±Æ]QQÁ~óÌß—ÖŸÅ‹õõçðÊNà†è pFZ™Å@LÂÔ—‹Õ‘¤'½†ÿ:ïÃü_¿ffQ b*//ç¨V×g‹öövdeeaƒÇ”yÏòõ5p€gÌÔç_XXHîY¾F£‘+++C^^***‚ZŠŠŠÈ¢E‹`˜u?¾4hFF†_"–`€B)íÚXßš(ѹHÇîËa øWiÓ»ÇÎÀ1–8:¹ :¹ S'D°> 'Œ1ÐüN$Ì´»î"m3ÒÑ6#©2Ο癘º› Ä=ÿõ“¨j8Yaaû²cÇîòp`ÿû ˆr?a.:ÎÄÇ»^‡N§C ˜p†±àưð9JÿüiFÐû— ï³Z­·RAÀ{§ïã,…´5%*@<<Ýê\–¢%Éjb?oÕ16Xal°b]~,Ù±c*…мݫÉa Ýî8! bU¤,%±ËÖ9Í€  66jµ+V¬Àï–¦`‚û„%à-*TkÍÈÈ@LL òóóQPP€ììl,Z´ééé°Z­¨¨¨`QÙÙÙhmm…¶è=.)) QmŸ"ªíSÄÄÄ ##·Ür ÿ¡ ·ì@îG§ñBïX–;))‰FÍf3§Qs@x2Ì®,Ÿ1V-¤ A ¤4}k~J£ ó ¨4òJÑuF×Iتì#Eô  ×Üv=˜¿»åÜ-§à¦ýDŽã™ÿÇþ)v3®ö iÈÁJsj5‹˜¼U1£8Ž•S&=^ ŠJ¥‚bP¥Ê»NS+2Ùa7»áºÁäS¼,êÜæß¿ñF9Óü…D·EÏ‹L/ÄÓŠ‹2¡)cÆøÌŸ€7ìü¦ê.ª»l¸ÏdÃB}d7Ä£§§Çï%ÚR%cŒýÙÝ=Üó'¯q¿1„M|ÁöcÕ7J3Ó µ÷wuñu¤U*cüyyyÈÎÎöAbK-f³™S ª˜ÙM©’á‚ʼnÏë«' qZ`ÉHL†Dqc”óÝŽ€±ßY¦p]ÈÊÊò\„$,‰)Ô‡S2x¬Z®³v º &w]€µÛÉI bÚ1Æ_C³Z­Ø®ˆDúÿ šò5??·ßÜ‹„„s555Ì<ʇO÷§Nªóöųhz&.Ÿ5k®]»†'žx‚øúªjjj:©k×® *DP0`i‹…jÞ†…þ§n v>ò~8d¸,g ?zmu·÷’´°P úÁ˜»TB"!­[–F d§q¿¼ o?ý_œSÐðñÇ\âÑFÜ´b"jìvLWHÏU€·zmùÅR,ÐòHj óîäÇV‚'jxvW7KÎ Qÿüiç xæO3þ0S4¥Ç{ ¯^ 8FŽS#Qãt0+uéY­VVLé½ø6››Ë˜?f°ŽŸ Ó4¿\ ”:ŸáÎ~˜ËY,&ô÷jr0Á}ÂGp^ù3:Ÿñ»6ï§Ì}e¢™yBB¨‹&??Ü'0Á}Š”¥DJH™ÿk©Cˆjã“0%$$ && ÈÎÎÆ‡ÞÞ^¤§§ãî»ïfLœ¦kUèëëÃÛo¿ÆÆFÜ·ñhµZŸ\ÕÕÕ~á¸4ü’0+¾_³5Òg{is 'fþôà-T˜7wš€ØW¨àn9ÀËø{{/ã¾l|Q~öFŸÇC”_€‹ƒ´p%tr"ecþÖæJ¦”®Ä§ Ç<¹]è8Q!@1¨b®€Á§¹ÿF­¯à]<¸ï rá8!~Àë ¸í±˜÷h Ê^úY¨Ãq§‹YÞ°ÔD7r4óÉKå  7!dlðˆà™m£±ñ­,—¦$^†Z­uPš8é‚GµOñ5¤Èl6s[·nÅ ±@1¨‚\=.Ë9¶úRé’±ÁˆúÐÊØgäjûÕ,\PL´8ùN¨l|â'T]uáó `®×¯™%ûóöÛoÄSpuu|èžPÛ‰Ñ\ÀÚµk.‚b:uÆk9xNMû\œp_^^[xŠ‹‹¹I©Ï`Æ A™Ï¯Ã#ü@~K’Õ$ðOHâœ÷B+X¥Ì܉s6{Öáä>0pên‚%ÉjBC¥ÚRŒ,†?J9Øv€OúÓ6#w%bÅúŸ€þ?Ï/4Ô:ðwW¢@L4rGŠ(Sô+ž’LþùÓ 27›Gù—6·pÏîîáÀñ˜“}TÏ€rfš_€wÉm¼Ê» wìØÁF.%%)))رcWYY‰œæÓ]ÇxõKŒ'´>n=ŠÛ©q:p°Î+p‹…ú\iH$uŸ<»»‡£¦ü„„„€Ï_Xƒ21Q÷’x»Ðÿ¿2ÑÌÂö¤èœl*è±Ô ——Ç3zAö?꺫¯¯G}}=Ä\»ÎB‚©‹-ò1ãÿ:<kfÏÀšÙ3!“¡£Ã©¢V«a2™P]]+VàÝ?’˜‚¡&vŸbk-è(f@øì®&nã[ýº˜% Áoõcã[ý¨<(Æû»[Náu‹ ô àýÞtÜéb‚Ç*IÐØà¿úE'jÍýÌŠA…„Z3ß?1<îtazDÒ• 0O5þ(Žc¿)–nÜøÈnˆgç®ÅÎH+ÃDÆ* ‰ ôwر¿cC&„è¨ÜTì#Púü• :äÂÿ¸Ÿ ‡¹P¹©7\û€h6›9*ÉnˆÇ|7|;îtaÛ Ë““à¾È›™Ìf3(ð2:hïM‡#‰—™Ö³¿[cƒÿžaÈ„h[X»v-jñ®Ô¬,ín$çø9¬n¸,çÐÖxñ¶§ù÷žù‚¦!G@+ÀpŠoX­V~ÑëùšÐÁŠãÐ{sFZÑ}9 ‘2Ùahr@ª¶¸º“Ç‘éa(¼Ä/"W$¢Bõ{ÕªU>ÿ)SÞ°aCÈ<Ó_k!//ϧÖBqq1§1â,bH*áOMMMÀãõz=Y·,Є?tœ…÷9!@<.u¬ò %ÊÄÅùþiv¿`d‰ã°.˜Ífîó€›Aèvˆm—¨†¿¼ ÷ËÛXß)Zî—·aÉñn.Pjn½^OjûÕ8XóÛÖØØˆ²²2èõzBß_¡ižɘ»Ð×/\,©ðùÄ×Îi>œœößh4râ´¿;œ®€ó‡‘òST<î p xzz:P]]òòr®¶_Í?Ь×étÖEçdS}¬ˆjò¿[šùS+Àï–òŒTˆرc—`ªEÐWÐØØˆÆÆFôõõ1`À vã;La¡˜DZ“Øxø(ÚµüøÇÇÇ#>> ÈÈÈ@{{;’’’p鳈jû”­z½Þ›¨-@H`uu5š››yªo÷;NøÜ*6Æøé¾Òæ.÷‰#œ8$pIJ2y\¡b&~jºâ<W¨ð@Ÿ¯6N©««‹«5÷3¦/:§‚€TNàbÇà‚Ó…BÃ×zÀ¿T(¸àt¡~¤o‘.!QæNǽ†ÓA50C­þV»¨s|m…ÊMż^ÆO…‚ãF^02“É£ÑÈ1g²Teö;%™ðæíAˆ 4 ö©T*ìï¶Â0Íw»àDã#if0ñ~©ŠdB-}X ´X; ¶ž3«æCm˜¾t29¶ç´¤ôOÛÓF™gÔ MCXeþ𑏤f0†•‰k8ÓýÂ{«V ë²qhòâ ’GÛ‰Ø °XIvŒÑáõkf¼o@Z¸ŒÐžÿblB MŠ"ùMת|ÝÁC}HL®AIIIÀP>½^Oâã㑘| h4=GzzºÇ- ½€ k&P!¡¦¦o¿ý6{¶[·n…Nó™_h’%c=¯áñ˜ï8î·Êi>T‰k)KøùH-æz½žÀÚœÈp ŽÒùÙÔÝ.X⸀׾GE,àóèUÞyAËòªT*bµZ±ÀâËüqKâüϵåàU”¸oÄŒ,€#ÐëõäkðB#Õ¨¤ŠÑ1ÎŽ¶0ænl°ú½Ø~a¡/Êüirá9…sÍq¤ àoضmü“ÑsTôö••P¤LƧ‹*äìœKR’‰aª «#¢°yª ¥Í¾í÷wuc¡'€ç½dX¾Ý7ë§Õje”ÑÒ÷š2ÿ„„f ðñ`$yÝ/¡öhÿÜ'˜`õkhFÊ©s0 g@@š‹¼IHHðѲ©ïƤs¸ß0Â5³g üÆ™:t¿9⻎¨Õj'©Øxø(ÖÌž¹ÙX3{´Eï1„ÿË·cÍì˜ü§2& ÛLK§¬ŒpJJ ê4ªA˜=Ö ©q¤DÏ/Åg¤Š<•6·pO§¥’Ç¡DàNº?Tþo[E˜?g¬BÎ|üR8«±‚D@¾ÐwL¡–1¦oF—O¿˜ 5 bûO@€hµZ\q3úôaü/$ýí LX €Ïeâ&³Š‹)ìïêVõ&©¢?G/³â@›ÙR5üJÔ¬ö5À[œ–sÐp:H1aÛë R „ñ¤ um)¢Ç ׸ÑvX­¼iÖé©WÖr%RÅ€,N†¹XIš†Hîæv¨Fép@Ð'!ó§þHq½^O6oÞ è5× ¤Ä:;vìð»ÜÜ\"Ô¬V+KÞ´zõjŸ„9«V­BYY>Ú³Áï-´mm¿:hMõÚþÐ%\ÅeqU*•ó£ÿ……•¬V+n¶òšJõà¬ðś샋÷h¢ˆ%Žc si31}nû ÇB;ˆž‹¿jîH§£þ÷óêì Î‚‡§ÃGH(((`Œ·±±Ñg<„óæ$ÉËË“|'ªx´·€TÖ¯ÀŸáÐŒûɱ·Z­¸cå,|à±t:‚Õjeý€­[·B›› X˜w?ö2/' [Ý.¼ôÅehµZttt@«Õ"&&kRy!a€¡C¼€8tèÂoœ‰Ç×<€—7ng B««E¥òÌ-ž9ךû}ÆHí$ü/N£­qïñq;€·}ö *àŸ7_¼ŸÕú1ùªí é¹Ä¢ç.x\\ìÈ<ýr_ìÄôˆ0ÔÃ_ ¡ëˆØ´/¤PŠÉdF€gúÆx#Þ ž(**×YøÛP &?ÜŠt¡BŸÄ‹%xƒÄÂ\Áò„B]‡J#lOû)¥5ªI/\()ƒïˆáACA€¢þ»/‡…¬h<¤®/dbâã…m„×bÄî€@ç¡çN õP}Ÿ#”õ%Ô Ô>˜0!>o 1·‘êÔõ‡[¯]øì‚͵PçvPíõz=Y5w$+ûK‘âbZN„çÐh4D×/ ³÷'//999,_„9Fĸ¢á&s’"ñØþêW¿BRRóŸsTûwœ¨‚óÊŸ}îOÜž Ê©|N jÞ'µ8´½Pø²Á”ùSFðÌ=kÛa,X°€cÇŽ~ÇâÑòá7Îd€‡2aQH¿¿Õ7ù}Îâ{S0åÈlœÝ?8úï §tZÂÅŽ (ˆüw”$6 d`ÂR?ÆèØ`û‡MÁew¥^7èîÛ óRÙÝ?!´ôéÿ£ÿGÿ[¨43ý;Ïi)Áw±:’<¥Ó’§tÚÿ‘ïL°0Ëuù±¤üÅIAï+XÅÒá}&1¿<™*x6ÒëõdôÌÈoÝ^£Ñ(âøOäL‚1›‡}®›Ÿž+3=¥Ó’ÒÌt²w\¬GHâí{ÇùYOöxÒ“=žúO©¨¨ˆHE555êZx7“x[ì²õD\9Oü›þ§Ÿ@÷þ?‘d¡á‰2ØèÄ$"d¶b©Z8@R1“Ã%©â ewÿ$àà÷·µrÂ~@­³•FÄB€”°ðÿè»Ñ’d5NœûE………DÌÍÍ%ô¬‚àÿ$*ÍL'¥™édÛ =ä±tñ ”;CN»XI¦G„á…^÷B¯é;iª8=3’üw)tî ]+B†¿.ŸOPVi”»}fÊV±ÔüòdråÞ‰äʽ‰ùeÿ¨!½^OÌ/OöÙ·.?–Ø÷g’—6]‚æñÓœØâ),nߟIìûý kQÆïºÁ­y,V>™~'/ˆ "aåTs¯Q¶B3ð$âÓ;`· IDATŸ'PÄÌ¡2yÅrószrò/ü*Üüœž¬ù2Éï·˜J3ÓÉS:-Ñëõdvd8i:ÃCx3nn¶òãbIif:¡¿ßŒÅ„¡À)dò‘'{ÝiâÿÏü§ÿásž¤L^ܳºóæÍóÛ6¾}ºÇø»î"Z­Ó—N&ïÔîqãpósz²òùÈÊço ?]ÚªWÐjµ×Uâüÿ6‰ŸyÀPcÊØÅ >ØqÂíƒ-8⟖U¤ˆSú;Ð@.II&¶¯’/^Þ@(ÓVÆõé4þ|KG²côz=ëç—~FÊ_šIÄ„Ô}&'FÅêH¢×뉰d¯ðw ªúæ>RRRBšššHIIÉ+ãÑëõ„– vÌô;µ¥ò`ôtZàÅ|I²ÚGëY—KÖåÇ~'€¢ú‡slaa!Ó6(Ó§ bRRÒÿ !`ï¸Øa—%¥ï¡2ZFTq ¢ŠSe´Œ1a¤‰° µ|—~*£eìZ£gFe´ìwñÜÀÊÓít>JÍÉg¦Œ WîHÀüòd²$Y͘»”@™?=N¯×û1ôò'±möý™dI²šØ÷g’g¦Œ`m…mFÏŒ$ÓïÔ’•Ïßà}>‰adåó7áoúîR¦DÛk4?mÛGøóX¤ÊüiÛ›ŸÓ“[€[cúô7èÿÒÌt¶^>¥Ó’{4Qdï¸X²XI&*„jö• r&Š • Rš™Nz²Çó˓ӿrïDB†f °@¸ þIII¤°°¬ùÒÀ€@ñ »l=‰]¶žŒ»ë.’››K„ÿÍÏéÙ}¯Gìû3ÿ?m  Ïy8ÌŸûÛZ9Êã8‰I$ëþôq —ъѸlº€ _·Jú';;;ÎÎN<ÔƒÁ@–$XQÚ®B†=¿åàU¬[–FJÛUhG`ŪÓq ÊE-Ä—¯ëœ$[‘€3-»û'ä–Õ9ˆ˜ÿ{N¯×“MCNË ‹»Þg ™€¨¤¤„¬^½Ë7]d…~–oºˆ»c¯§¬î*T}sßuKŒT .**â“ÈaþúÙƒ˜t3¿{àÄô³ùÍ®®.ޝfŒÈŠÄ”‡PæDzí§ÓRÉ[ b%ËgŠI¨‰íï–a}1¿@DÎôÏø8\ÊŽ¶`ÕÌ]WaÂ(«ÕŠl`j84Q© ¡,=‹Õ‘D£Ñ„´nPŸ$=îÕg§J–¦ôC†mƒvI_(þ{ï×fy÷¿ï!áB ¥@Z ­%ômgQ·âêÓ*Ûã£S´Ý|žyجµÓº~;µÖÚyÜžjuÕuêœëië´:¥®-ô¡rìè!@Û($!$„\ß?.®‹;É@Ýöü~Ïëõý¼^¼€û¾¯ûp>ç÷ô»v¸ÜaýÿbæÏŠ_‰Û;»¼‚§ß'°âVçU*ŽÊxÃMpªc§:ñt’–\o\¡’ñ\ÓO¿oܤ،ÍÖß}ʘ…XA2öÿƽÁ{ÆCk‘ˆH>]„_P­óÚÝSHâ‡9>‚ýňûð,òê×V¿kÍf³PT Æ³gú„Ä/ så ¼r²¿?Ñï÷¼3 ¿?‘xÏx yòœðìÛ¹  yòœ \"]O kùB“ ï=3*¼÷ÌÁ|2æ“T˜˜ æ$¶ð8N泈–އÒÞ:„ˆéèõzòÑ*ê9 ½u­ràà®k€ƒ»®¡þ˜»Ô`×|´ŠºT 6ܦ޿H§vŸuƒn¬ñÈ`÷ùðt’–LUÊñ¨™ÎŽRâ­¾~ÜÞa^»hý1ƒX º²ÒÉÂ>%ˆ•ðuðzŸ–ÂId¾> )­@&$¬[·§§î@qq1Ž9‚mÛ¶aëÖ­œá9r§OŸ&ÿqÅOX¼x1*++Q7ùnìØ±ÃO“geãââ Õjq¥ÿlšËÐji…@›ÍÙá\üù nxù"‡Ó ¿o`aýg’N†ógçý"™‹ç»ñyc4“ÌȺi2’N]A’7G A€‰XOyF,ýY¨¡ˆK J‘•TCc¦¥¥!#Ýó„`eD„¤&ôÅ‹[È¢… =æû}óÚ%:v ‡~}Š98VMÓFÄíY‡ÄÐÚoçõ"§…2.1ÆôŠwìxæþ!ÌlœåXù¶ýçÛ½^O tð[Rˆ$.8*))!¬–¸ø8{¯ÒÒR”––b¼–€MwÎ Û«zÁúu¬èѬiQ$í‡qø^Ñ$üòÊdØ»0·¦ÿ'mÓWëBÝŸCûzÿ’®#ßzx2îy§oÌçk4òøÍQˆž‰—=ŠœÈŽ=¶(á6<)b¹ýciÿ¡ÚæææòÜéÚÚÚ1û}ŠBN\‰Ia­#·©£‰,5•ÓÍ$TrqÁ#Vål¬zæíǦ¤ƒôvãö‹ßüÞ¡ðaá¢4o’´f“ˆ+bŽ'…W|`4zûa¥€ëµ¨Rä¤Du]c'Nk <·²fËOWp ¢bƒ¯¾kÁV‡À„Pc£3轞™O»1¯~mÅ÷éðÒ{ Éxóüü(žîgoõõs«@cêÝxwz2ÊàŠiÝ »n×C1K‰_2ã‘x NñõqúôižE²víZTVVòtM–Z:¥¯³›ÇÞáðÊóçÏGqq1f̘! ¢Õja³Ù8S¯¹t”ãñÇLôÏéWj#à¶ #C–+iÅgW}S|€î7âú.c‘x­ ¬Ä60:þ†ÈYÃ5ê;¥u!Y; ÖSXEÌ?~A$p|˜£NM„}Eä2ŸojXu£¹óR¤×ë9óŸ¾b%bÎÿÕ/gYŠúâÐù;+vÔº0ý?£ÑWë‚Z_@µ…¾ZbÀ6h|¯hvÔž y?½^OVÙœxä=;jìýØ0#‡VO“Ýn6îµ{GÛ3æÿĺoCP¾3îIüå–»ÈÍë? 5±xèÆE8Ðú'~l<íõz=)--å .ãu½¸“}­'좛“…oÝ;%,3_·nã¦_©T*,ÈÄÔ¿ú›”ÇbþâÅî"À x0R|¦ß?CŠÄi]ê9ˆÂÂ<ž‚p>þYŠÉg=Ðê–g©‰|:Ý/fËùϧ‚!â9xÏx$…’‘o"OÜGQÚ˜ÀL÷eüuäòG¼[öñeY~:/¯€ Õ^Š@-Lûûþ•Kê…îS.!yN4ùd_nû¯xÀ'ûèyæç¯3`x‚—;¨ uö7É«T*À)bþÎhZ…/f30ðEàWðܽü•C˜x“šLÈŒDK‡Mûm˜¹B‹+mCXvo"f-¤Z?cü—jp¤æ_ÒuäQs/^Ÿq.\¼¦é¿žŒ‡ ˆÅ#§Ïáõ7àÄåNÔ ºéžêíÃç{l‚¥p‰*‹†§Þ—ÿÖ‹G§PFL¬íÃnu¡n–<©23þéÓ§ÉæýûñÔŠhkkCqq1ê&ß¶÷nÅ”Ät¯¿ŒŒ Œu ìœî¨ƒ¼O†ØIJ$Όµ¦A$Τ¸K jì}¯^‡C¶adÇç‡ta‹ñA^E îJ(Zž¥&¾«ÃøÄád©Ø”?ƒDߨÀº õÂx@Ìó×éthëY¦ŠKlàEÍd5µFi/ê0dÆ@£ ݶËÈD7¬§<”ù˜·0ÖS˜OÐÉÇ|èf³Y(ÔÄâŒ`{UoP‘µš–X“ØL²<;‹klÄÒŸPÄ(ÅœQæÏèè16ÌÈ!RÙfäoEÜTmÈS ¨0DȆûëa!DÈFQa>ÖÎV"ý´ç‡30úž b¸V­E­Z‹™²ÔdM‹ 4WQQÖE R©‘‘wv…Ç_gT¨‰ÅCE 0äÑï76z°nݺ1âúâpá+‚¾Zš([_-]dñÑhšGn@_­ ¿¼§=¤ö¿<;‹ìPøðHÚÍT‚ùÿ¯'‡µ0Öè9tÎ\ó€U¯þ|’«¨öaÓ3ÆÍüjm¹^æÐñw%&áô±2Yž¥r<{¦Oøû®‹aï³}Û6¿Ò²÷œ¤2QÂÑ} ÌÊ%=wÏ!=wÏ!BBrXæï"ÔÒæ"t>+T2$ÆèCÚõX­ŽâÀ&¾n”7¦P!`î€@÷Ãxiy–ú¨”鍿Ê(6¨%Ò÷éà©wã¥÷¨âòØqxé= ^zÏ‚…y*xêÝœùK­÷’ÿJBÔü(¿ûð;Æ2…ˆ+”Ù6:pØèÀÄt%7ñï}oQ|LŽÒh}¢þ„p§¨Ó¸Ò6uºJm×ú(¦ï1ÝKµNÎüÅ}ðúŒðæù `¦æßŸ¥ÄI×Ш¿@­ZÚlƒ»]¸÷/fÌ‹ŽDTU^^ï³ãµ‹6œ0bv”ŒK™¸8) •••8tè*++1ûÒ‡8tè¶üí lÛ¶ X»v-Ä€Lû¯¹t;I‰[–jwÜ—„%5&¨ðɾ>ÄNRr´¾PÌ?0Àv÷îÝ4þFÂí&EZB­ZËcÒ¢oTÀõµ',‚©Øu¦×SÄ@‹Å}Ôß`—QÐqYmqL¯×“Si@œ`È6ŒÈ`Õ HÖNäæÿ¿ÿº}LJÐB|ÈD7ôóµ~tz=…ÛdZ¡&–a©T*ÄÅÅa–<©v΂Ù+n঑åÙYdÖD⋯þ‹*‚˜?‹ØðÖjÌ’GÀ§àL±Ó2É_³ :fP3%cœPUÓåH Ny):RQa> y Ä 8BjíE–;Ü%CŽLŽØë7öë”––bíÚµ(--Åæ/ãÃ2%½^OjìýøÕ˜ö]Äœÿ+jìýغu«®–º¸¢Ô…¯bfF"¾ Ìð½"Z¢õ—÷´XcïÇ ¯w^AU“ëîÓ\÷73?«ëÔÐWJ"™! 4'Eåååä›0FLˆÑéPÓ¯Æç¦(äã÷¬iQdš2¸Tóx…³Ù,Ìï@ª°Ž«ü1#»Ý.î’Áétby–úºÞù™éñ\ûkþbbB€ä³GÌúb?û{¡è>ŠYJɵÃÜ ¿éAU­?Gµtö[L÷ZÍ“ç$¨×ëÉð&¦+áèðÀÑá —GŠ8Ýq_.w¸9óÿd_î¸OºÒ'×òˆmþ¡JYßpï¨P7!3ÒÏ þSj# ÔFà®÷ÕSÑI5-f—USRL—¡Pž‹£Ç¨ÿŒýftè×'¨à­Õ+zyv‰pà|ã0VFDàïÃE…ù(”çâÍnp}‹SÞ*¬=ñ5¶Õ¹y¼€‰ªX1 °¼¼œûû*RZZŠmÛ¶Ûÿ_¨‰Åã·¤!æü_±½ª—CpŽEf³YÐÏs!%™nLû€¯ŸCÌÌHÄÆXÇœŒl½¯¥šK•q0l  ýüÑTþ·Ô¤Ýt‡Žh4IÀŒfÈŸÄ-ãyfII IJJÂÖ­[©~f©€†„«hÈúgÀbÁ·¦©Ð3ìó;/Ÿ‘*ÙÌÝp¤Mâyéb ‚±¡]“BŠî¹ØU¶AÞnxO}ùœ»°Cá“ dzbŒÎoq+T2˜º. Z Òõo÷Eâ 7Án‚E>|Ý>¸¿î@â¡_DZ0j0äOºn!€­9 <°˜ê¼Ô(y꯶È~¥Ñ¿ÿ¾¯¾K•)0 O½ŠYJ<{¦OxöLŸà©wã±ãðØq˜+Wb®\É©~Æè—}|YXöñe¡ªÖWNöá•“}<1ÈcÄí÷¼3Íï³ 1è>å"®háèð`È6ŒOöõ¡ÎH£è/w¸¹PðÙo|<^¥}‰üÿ• ð\Fç…}£5F€MȌĹ]}•¶!þËWüéy3œ‰ ™Ô²÷úº‰ãLUÊñ‰Ã%Ôªµ¸à¦å³í>42fG)1U)‡F& ©HíLMBJk‡p{‡E¸ÿL7î?Ó !NÀ£S´Ø™šÄ1ʯö@WÓ.° @FåååäáeË`2™°téR¡¼k×.ÌŸ?[[±fÍaÍš5ÂS+Vp,€øØ¯‘83 ·æÑù2pÙƒ–¯ˆÔFÀbtÂëðÁeñ";>Ž”’çD“ÎÎΠo1›Í‚Ãá€Åbñ++ÎÒ4Cõ=£ÛÔѤ0Öš~ú.Ñ7*PÓ¯Fa¬µj-júÕc® ¿®Óé8ó+ãì=™«@ÆNݘ‘‚I£wôH:u‰°¿Âƒ+O(ýªë±3æolôøU bרû‘/“ P(Ï…bNn^»„;zÌ÷]‡Ã¿{Gy`ÈSðêP%`ßj¶Õ¹±oµ±s¨C§á9ãË((*ÌLJFÒOÓ…“"„bþÏÂX–¤ø!9éáú·ËÍÍžŸgbíÚµxg—eeeÂÎ;9Sb9ëRUñœN'í¿†v=0›Ía5€jYÓ¢ÈìÓ!<Ð4„ _ÞžýOSǦ 3rÈ*Û æö÷¢ªÉwz­ãôz=IZ~O¬û6¢çDbÑãýò°·>—N¢çDÂÖó}î&¤a{U/r¿¯w)”””qÝtvŒ!„­[·Žüü–dÜíÄã·¤ùVÓÓIZ²Ä@ŒæEîO'iÉì(%fG)‘¨²hœÂàn†[‡¹[JWÓ.èjÚùž:þ|¼qð RKJp°µ===˜?>v\¹×ø Ö;°sA2 9v.H†\-ÄØÉèowC®€B%ƒÇIËòZ­VdÈráèð@®àšbbAL(õOÑ8–…f6›…š~5^þ5º™`6›C–Àë»0à¸OØívA®V«¹Ï~Øq ÕrÄäMÁåöv@ ´!™µ—VдÀºýþe™ßáªF À‰«-Ò4Z´´´ð É„¦Õî½ø–Vá‘ ‹*0tìŽóÀsªÛ¿®Ãë¿¥fý?ýöÇøÞoBQ½ O>ö6îyœßo[kg+áþz5Þf´!ß• PL—qŒò}ÃÔJ°o€ÆatF·©£‰,ÖhÒ`˜IyãÞñû¿zè!|ðé§Ø92ÁÊŒÞxã Ú‡–Í(-ý5¯–ÇHlI1äO·é» Î/:¸«[‰”d÷ˆ%`¤šáÌH¤4 áÂWJdM‹"13#ÃÆ¼Ók…J¥Â*›K¢‡a6›…çÌf©ËƒˆÍmÒÇØ°N‹'Ö}žã5xõh/Žþ®‡¿¤ås[?‰Yÿvï4 )*ü¦MÂÆ‘ˆz)ÒëõÄd2¡  III((( ·&ÐLˆ¾¨ ÐÜê×ê´ßÏL'u^0Œ¦Kƒ¨IL‚Ù3Ú?¿?‘ktâ‰ûtÐ<D¥×ëIz¬nò'ÁØÐεؔ/²¯CHéĤÁ0Îþ[­qÇ›±ÀÔ¿Ò<îÕ,à6L[§ÓIsñ\Á¥1Óñôz=Y?@†×.chÀ#£…y*(oLÁßw]äÑðÏ@_@%ƒFH‚Ó鄵տ´¶@¡’á1C“…J†˜‰ tŸò°dïËæ>3SªÕj¨Õjüê‹N<~K¶WA2¢šáNxÏx¸vTòÔ@PÀßV‡`0ªHÅæ©„]³éOõcÌŸåü'àQàÇþ(óöLŸ€3}aÛ;cz¡G4êŒHžMÔé ,1¨ñÙo|è6ÎA;ÌÐC+™)ÁŽñ(ð€l€´©+á½öÚÇÖ4p$pâMj¢NWPÍ~ÄÝAÿÅZàiàÕ›ÛÀüMO€!LÿÏH|´Š2¤Mwèˆûˆ¿ÛK#“AMRMN\îÄÛÓ°|d?a.¶“ƒC<›`^t$nï°¶jÉp«‹Füwø#23ÿY¢”ßš¾>¸{zðT1Å9G÷í ´fÍ!mÇE$ÎŒBùñnõ dÇ磥©)óU4ØqpÀ‡Ã!§Cm@âM ¸üë¥IŽ‹oãz\×úデfü\äê!ì=0ü'¾^ΘJ²V­VÖöv Ú&âÂ!*±žOÖѼúŸÄâï¿î—|pZZðOªÝÆk+@Ñ‚8|Qq…—7 ,"Nÿ;V½ çÞ‹í_×  @K2/¾ú[Ì’GÀsƇ™÷oç%MÙÄßV§ÆÚÙÍÜPA™þ¶·øv^/ÒO'¶•àMÁ´Ü† IDATü Ÿ7›Ö—gg«¨éWÃlnÄÑ÷˳ԄIbᤰøÖÍxðÞhêÚµkWÿ¼J=þ¾d[•J…íU½×]´„iþ¬/ººÁ1XÄëùAA¯#]Ý@JÓ ¼—¸Lê#iè±ëyŒf?<·Õ†—ýWÉÂ9#’²d{¶‘U=(>ù¶J^5J‹{÷îÅ›ðÂÝØÕÜt?öÌÀ¶Ë³Ô¤Îëáf7³Ç!@$ìø3ÿs’ãât:q6Æ‹.e˜Ö{¶îrdrò§ÂØÐކüñ‚îPø°ÃåÆj«»®ám4ÒÀ@»}\ ½ÑNh„$À ¸œÄeEÂÚ:DB f³YxÖLÛ?¬tA–L³Ü_w¡òÇXˆ.I†èt:á!ÔÚ`'=ˆÉT ‘¸ìA‰& •ÆA.ŒX[‡ J‘“˜‰ ,ÎÈÀž}g±ûP­VÃb±•Å66´Ãé”U°hñŸ‡ªðû ¦ fa«ŒZh{~ß ¾¾†Ç1ðÏXD‹õq°!æê+©˜Õ@.4õB'L‚:×íHfö7M dþ$Y‡ÎÞxÄÆ¨@…+~÷>£†tK„+Ý+Òïþúc5ðæ¨–ËÖ£ÃdFò{l?&ÃC‹#G¾ß¨£ÉT‰8,£Šàò¨uØ•˜„GÍ=¸èñ O'i Kó¨–xGâ5x¾gô½XêœEöGçÑzó·ß~;¢óò0«°/[†âçŸ'•••~ºð·F&ÄN†ÃA}ìôѵXÐ(ñ&ÉÏ“¤$ PLá²ÑÄé*•ŠjùáîË7{ý|-.0~qt¼øãc |HÖN”,© €#2R«ÕPÏŒ€£i˜ûE_˜1ÿç~ô6ê½Ã0ä)ðäc๽…yy<#à{¼ `k@•¾aFQL—a[kg+QT˜•oý>ô[þ>Lðh¤ŠéÁÁez=­*flÒä*gòYÓ¢HŽL޳>/VÍ¢qáíôz=ùàÑ èËz ’öã™g¯¢9€!1úgMŽÀçÁ•ôÄé]úyá1Ä÷ùW¼ãXÄž]¨‰Å£å+ @Êê\àù) 9Y•‹…y*Tr x©ÿýµ ÿy£ÇÏHE±! ÷¼v%ð6~Z×’Îú¼Èî K¥A­ÌÀÌàÆ†v.+W´A¬N§óK#^’âÃá.™_>;‘ÏXé_V0ðÞKR¨yš¡W¶tb»1ާúIFÑÛw>Ê#ÿ'ý{BcæÿÀöLpgB½Ô9 W2}Ó<?Êsà­F5îVÕ…?F©+"ürþû/¶Àf1øêÁý†q÷”É^¶"äEè±­nNR,Ä 80£FŠt‰¾RÊüÏú £.€ëƒ²÷g¨r™ÿJÆ*õüÿG¡Ç%úZfNŽÂl¹§:1'=*ˆñ‡êG±Àµ$ŇŽ7ÒÓ•ð]ÆQ™"dèñ¼ç7;½^O® X-¨ý‹8BºØ&ü°’ž–%Ëðv_$g°L0ekn³TÅÄ7Q^°p¡$ ˆIÌüÅÄ\%‘¿9jD«÷áW_úûë¿9 ¿úrß…{-³Œ§}¨¶âïgßÐs` Ìî1îöɃP $ÀÓ t‹âM’éÿɃ°Ÿw šiʰõãYŸ&Ü”ŠK‹Áä[péÏÒV ñóc |>£FÄtúký¡œc |试!¶ÀDZ.åWÿ‰Çï¡…>¸ A9b9·Ot99&ǵèÑ6‰.'®E«èrâ¢Ç+LQÈÉEWXµy3©¯©ÁŸ>è»*++q¤§ï?õ”·r%™UXˆ—|?{ç¼üàƒÐét’ãǘ?Ã:¤ÿ{jXøÇ5¾Píï\™Còe² ä>ñu¡j%2ûP׳`>–ÚÇ,¿aLúüc§e’pB@(úß8øÿÂÓXV‚ñ¶Uóþ’‘óÆ»®C ,>àí¾H¬ŽºîÚÌlÐþñFÓMV#£.nÄáÌ—ci=ÿ¬1½žöâ6-ôq+ÄÿÔóCÝc<ýùÏ~þÿT{‹ÅB#<^ò£¡â­· u>Üs¾ÉûþÿB­ÉܱcY±bEØŽ G× aø¯"1`ÐõÙü+¨bóTRitŒËšp=Èm¡¨¼¼œ°8¸;ÛÞ”®œF&ìWƒqA¦?¦mi4’àNF¯²[rCÑLSq3£pÚJ(bÑý,½Oêš­Ï¥““µ1سאּõ¹t²nÅ ß½{7ùèý5˜kˆ°ã×Câê’»÷÷^w{–é±xñb”––†DFSÞ Øò,5a®ƒ{N ìü7Fþ¦4žþÓºuëÈܹseeeK·´Ùl°Z­¼ª««Çu?Ò (…–a½³BP,, X°×ÿbùߌ¤ÆY| Sò·.Š7xV‘u^A$v¼7‡Ã¢Ô}Qu|ìt``´Ý™™AfóoB׋ Œìƒ1›iࢂ¡˜ †¼0Ïòì,rÆ7*äÞxc/ m`~ùǧ%ïm0ˆ7­òÎX¿õ-vÇ\¯ ‘·r% œ¿ÿ žÀ° Äï)­ñÆÁƒxáWŸ†”®Æ¢ÓCž±/õ¿^ô|3Ô°pdß:—Tá=G] Kî‰0—Œ×þ_A›§’í”Рb³šG Iòšß«ò‡ 7¾Üryá‹n˜L&¿MÓTRBÂAêj¢ºw2r•2aþ îdäd݇c¦—àt:©ÙƒYð;ˆ ]hraêÌhLÙ†šË<“F±^hr…JJJˆÍfCgg'š››Áþ^·nééé ¬ü‡“µ1˜W0€y”ù—­H w­Ú¨ øªot‚/++ ùì² D,0¼¥ÒbþÉ«81/»ÑËÏWB ƒ,]ºWââ°éƒ0«°›>ø…ùùÈÏÏ'ïPæÏãÐŽ)—ä¤éÒ €v4]Ä…œŒ¦Óµ‡ئ¿g­ÜxçÊ2×ââB-yB¨:üq¯•³€î££¦_šš˜L&X,lºs1içÍ+1mݺU(//'¥¥¥())!,ÝrîܹøôÓOQZZŠÅ‹£ººš· Wñø/]ºsçÎÅâÅ‹±mÛ6~|bĘ¿E£Aa|>˜’ZÃs•J,ÌKÇl¹…±œêD׃÷Ûú9ó_Ð «y‘XûH<æD¢hA.aÙÂLäçOÆÿy8—GZT4êÓ4}———“òòrâÎÌÄ©^Ššúƒ»P¶µáÅ—ïÄœ„"0‚óëÃ;)s_ž¥&¯TGà§s‡ñ‹c!„b¨˜ãøúóÏpãñ0q1:Ÿ%ÏÇ« †Û/™•˜ýfõöKGÖmÀµþ©¨÷Éû0X|ó ¼iý0 $vZ&ùüÏiƒÃétŽ‹ùðš%ÒÒÒ‚I_|&Æb!]£VÙ¡ôt¿öìÛ322x)ãŸüä'èØîÞ½›¬_¿ùùù~ýä'èõzró#àL3Á™f‚7Ī͛¯‹a•)üЊؤ`ž5-ŠÔªµ¯æ¯×ëÉ+sÓjÆ¢-­cþìØ²„e7;\nTƒ<‘¸s¿)(.^„·Ê}4ÝH‚Ä“Ëb± =f>"†šß¨Y0##ƒ#,†šÔ¡¤s½^OŽ9â·³û$¸“ý¢®!…ÿÝ«ìÆ1ÓKHp'ã6•Ínô Aïp¡ÉÅ«g€\M§Vöü¿óLÄ(Ë$a%8ZÖ³¹¹&“I’1!€ý€[K· ¾Ñ‰³nABMû¬otJnàŒ¡WPßèÄDµ—^Ô7:Q?(#Öü™° ¦œ;î(ÛhÖbÓàHOŽôô ··GŽÁ–-[x¦ýÚá»:Œì.:t¾«Ã¨þü"Œ íè¦b! ì¡y³¯9‰¹†|ú3Ó5g&Ö¿³q¤oPYYƒâ"ÿÉ%%%¤¡¡6› 6› g}^ÈR#r¶Q'ay†Ɔvtvv¢¡¡· üþüü|˜L&ŽÂ¦Óé‘‘ÂÂB<ôÐC¨®®ö«ÑP~RRÊË˃Æ?-- µµµHKKóÿÅ‹#ÐdÑÐuÙÑš>š{Ÿ›› ­V‹ÒÒR~ ÄÄÀƒéÅ?W£Ø Æ‹®Æé!ŽVÑ€Ð@!€­ƒÀôţ߾ —K”8úíÛø±PÁŽ\³¡³>/æ¤ÓÀTù$é´:€šø©p´Ê‰“µC0uÐïhh¸S‡ï§%߯·ãh•‹ŠT\P$“Ée[göòÎXœê­âóÙd2Á™‰Ô’$ö§ù÷áˆy¿Ò8HA—ÚñJuú_µú]³oåJÙÑtŸuëÖ‘¬¬,$%%!??÷Þ{/Z[[‘••ů)--õ+c̽^O’,@}M ¦çÒþ:ÓLP_S3f`C;c0®¾«ÃÐëi-{¶i¢p›:šôÄ…•†˜¦¯×ëIÕq+ cp7ùÃ.Že X^ß,0Ä4†`·aF9ã#ðžÆÁïç‡mo0HII ¹kËWÜ´>v,:Ðê"ÿN(yê‚ðƒ|;G-F 9¢`gôèy‘ùßd2áíã¯sÉRŠ***¸ï• . a•“Ýn.ùF™þ%¸`‘ÏÃ3ë@¯²›¿g‚›–ïdÌÝÙ弇Ïl91À¾ø¼86€‘Ø´¨VÓM쎆*ž°,¥rݺu|<ˆ@û#?2vïï¶lÙÂþ¢%wª««ñó'WaõýÉ’ýÆ´{Ür0Q-Ǭ<ÍçÏSq—‚1A¹¦¯3˜Âx*Ñ/NJ‚²­ 'Nœ@o/ÅÀeøÄáz†}8=ä,5M—‘!Cv—À7Ö@„½;Wæè¨¬¬Aµ±2(g¦Y6ßö äÈäp7uR! ªFÒ `µZa4…Öóƒd©üyf³9d1õôô )) ‹/æómñâÅ8tèzzz‚pÔÙõIII0™L|èìì„Éd©$J‰ÝOì`¦kàjlDt^·h444À¢Ñ ûøqÔR VlŠ j0Sÿ ¯µ Ò耱щ?mø*üi÷0#2t!!@z“ß·çu¿ßŒ¤0Ùßî‹DµÛ ï9Šþ–#“ãTÇ Nu ‚¥!3òžëB7´›U?`ëkBªí,ŒNäçOy=ÓüY¥<€î5ùùùHìOéÞ*444 ¢¢BP¶µaþ¹ß>"öí³`ï­¡úó‹x¥:‚ ·Œüè·ÒøbÒh4„YžìžL®Éò"£Ñ(¨nÂm·è }úVzÐuJؽ{7ýÛs9¬à@K«À´ÿÙ¿|³ä˜.puB¾«BMM WŽˆÃt/£Ñ(È;cáMëG\\æ$!fÀÝ»wUÄ EŒùïßú9öoýõµnØúšàH0@¦ü•¦T2¥9²£ÃÏ ÕjýöÈžž´··cïÞ½øòË/±gÏlÙ²Û·oz6¢µTbé>~Ÿ™àíhçÝüÈ#~ 8°>q¸„š~5Ç2>*S ÀaóÛ¨^~þ d©P«ÃãW·by–š-ˆCa¬Ê™iPÎLÃ/>ÅX¯:>6.ÿê®kØ0#‡0ÛyŠü`wøïº`ÄÈ`0̲—|˨Z~mŸ=‹üêe¡7ípÄÁ–g©‰XÓ`ЧRž©1Ô„Kþ0ôp8Xûg,½‹‰iÍ0 $77‹/ÆÏoIò¡ÔÿϘ¾&ŠVíZäó`×íz¿ßâ÷a€äìò †V®–q«ËAwvy—Å$ˆÍÏmm4;£¶¶Z­&“ ‡ƒCYÂþîÙwV ‚Žû¾F£À´lÆX¶nÝ*´žª¨õy5-ŠeÙŠÂ4ÿÝû{…úF'†šÝtójt¢õü o¿Ûígi`4ÁjEdG÷íÞê)Á™‰‡—-õk×””„††j °0Ó? œMŠ¡gØ¿zbß¿x1æ¿gßYaûÉ:n¨þü"Zh( ´:vžYÄ–Öïe@ÕD ù“ ï²Ùl’®6~;wî˜y~ëׯ‡Ñh-Pâë{zzüÞ!--36þìžb×@Õj=‹‹‹ƒÎnçëD¼Y2bZ-Îü™`nltâ±ûuüïê¿QͬÒèÀ ¯µpK0jú—Š´g:»ºƒ ¤,u^ªÝ£™K-)²Ô?ËPµÛj·›Ïƒ“µC8Z%-˜2AÀwu¦5¿öd­t‘.¶7ìܹS`ùµØN¿7©ñcÄÖTÖ´(r›:šüìééüùs¿=•gçÂ[hÆ Í?ÏeªÉÇlê7ƒÁ@._ÜO¾°à;mñ|.++£ŠRò3T¡‰§’"V¦î0û—Ï Ú÷;åÀ,¯‡öü"ä{F¡nÿ9á\Ÿ HKKóÛÏÅqR”µS8ºifyÝÐéth4i»T˜ð]:¯3JJ`0HÞÊ•äþ­7àÆ‚`«P||<öìÙƒ††hµZn‘³Z­°Z­~B#~õ ÝÇC­VC®¡L{²¯ ¦ ÿ`t¢¸™Íf¡V¯'Î.çH®z`D;€I¥F ¦_ؘNÔ8â°< ¼îqà}j '8nEa,=Vò ´ g ¦Ÿ %Ô|'é80+—œô ã^:yÞNI„ü†T5¹3Àï0ÖD+±fV.an‚@¤û‹ç‘‘Y?¼püø0×PÙ¦7Þjs ™L\œDœ$‰àsàÔ~æ€+± ,)b!ŒñkµZžðÂ&¼ ±vÙs/9€7• —|@¯L{ÿbÆQ™‚J 2&Ë1†#›,/Yá”O¿OÉ7'§·’HÈ48€ÑM¡ò=a}*ÞüÍf³››KL&Ò‰ÂX9ŒÄ-™L¦ KFà\hiiÁ]}¿‚é—jéZyß0-~Vž ­ç)ƒÍ“ÉÑèórßz~PÈ‘ÉIŽLßÕaZ™+O…­tŸnB´L€k$C@ê>† Û‚–nº7³Š€L8 åú¨ýôõr%`±PB§£ûë°0+ŸP‚r ` àÍ7œAY.=ôÿ›1úÌÌL´··óµÍÖ¦˜wùíÄ=jð^%|œú¥~¾!¦‡ KR|¨éWcIŠ-)„›~wÉPà°ñÅPÓ¯ oÈ´`”ù?>å3ÆÒT–ªãVZ6ÌÈ!˳³ÈO†PïÆÛ)‰(š©„ü†xÏQàõÎ+ð]é„ü†¿òª#³À¤¦ŒŒ 8³8rÌ UËï1ë‡÷!ù– ÜO:V\³VòT(6¨QitpÓâC éÆÎ&±F£ ÊÑLžéP-H\ä‹S`Œ_­VÃjµr­úÃ2F&3so¾¯FåÂm*êGÕDu#ÁŒ£²Q³§}pTã_„Ií_ÌØo%‘˜¬SB–á§µªRä„ÕÔ· dèYÓ¢Hû¥*LÌX5Kãw&Œ…£ÿøÇø(þq¼òŸ³Í#b“4ççÉü%jßÕaî’á¨LßÕa®±lºCG}Þ ë'%q·£Á†ƒˆìèÀÙ½{aëk0jEׂ`–2¦ÑOQÈIRÄh_.VEúiûLÓb}òäÓ õù³ã¾«Ãð¶{qzÈÃݬ}A„,(@,|@v—€®n%wÉÐÕ­äíÙü kÂ4Ų²2dggûýt’ÒDé6u4¹pä0Ò‰‘ >n@°°ÀOãgÄM[Z(¦7[cbÌx€Fõ3}ç«ïZ8óeæÿ­Ž°ÅXÙív¹ÏµÿpîOqÔÿ©ŽA4]Äé!z†}˜I+ñ @v-Û‡M4-°ê¸§;ê8ó?=äïê0òó'##ÝyÁ¸ÎîÝ‹k±~›Í†9 E¸ÛéwíµØN(ÛÚ83a´qÏiá@«CX5{**ƒ¨4âýº hI!Èîx Ë«;[`lt†­uÂ,Ìeee<愹B¥¬F£Q˜´õ{ˆ‹‹ÃÖ­[±f£GŽjãÊi[gtHwÀ–VÁh4 ;wîÊÊÊ„Ö>„ÍfCôé&ôû|RMÂ’”’Ê KÀµh¯á’’ì†:·›·VýÎ…¯k½ØµáO® ÄÌ_œ±eË0>ÆöÓ5kÖðu!µgò]æLóè»ÉS.LÏp¦™`Û¶mÈÎÎö+ÚÁˆÅÔªµ8Ü%Ca¬†üIxóÁ¥Fà¬Ï‹E>GF ¬JÄèΕ9äΕ9¤ê¸Ê™i¸«¡ ¿¶ã£üÝ`eY«¸ýY¹¤Þ;Œ3>‚Wb"±&š2þ"C¼ç†±ºëœN'¦º!KÀ¿v ï.ÖùUV3 Äf³Ád2Á™ýtñŽÆ_~¹ ³~xê÷Úv?̲—¸À 5Æô¿o IDAT˜eݯcþÅÅ‹xyÒÃ]2Ž”ÅÊⲨ`ÎÔ}Nt¸(ð;FÇ%•gZ?@ÍþX¼x1Þ|ЀŸß’ “É„#GŽp_‘ÉdâL”5†ßWœH“E¢¢ÔuSgFC®–A3MI૘­J¡?4Ó”D®–ñJgŒ­+5_2ß'¯ñ>óa$ŽHJJÂÒ¥Tˆeyù»÷÷ ÌÄ/&qdôÍÑX’âÃ"Ÿ‡Cû2ʓɃL˜Œù[,~™¶¾&Øúš•¿ 0>²ÅLŒùöÍœ…ža’"dX¬ŠDK ñrdÁæ¿‚« ÓgD*øû¿øü÷É?[í'ëøuB~~¾_ß/ÏRYjùœ?z®rT9:§ŸÈŪH|âp L):ÖØÁSY@Fºƒ÷…FHò{ÿ¨[20¯ ó "¹ù?pÿ˜“Pô>&“ ‰ýi|ìÊËËÉ̹?ämØuâjŸÕŸ_äÁ«929ˆ†¹ßž‚U³§Âw•¦e§Bdvv6¸ðÆÉºSòúáí¬Y³ëÖ­Cù²S°X,” ³ë„ý$>–œs{ÐÒÒ‚~ŸWFj£eˆÃt}¸û‰ã=¤¬ƒX/Sk[L^ºº•èêVbš,w>E]OÑyy0‰,4¬€@×ãÝwßíÛ·ó1Ù»w¯Ðl›;v ?ŸZYL•˜ø®¡2Âd_’ì'/24UT@e>„;v ¥¥…—–d~›:š°ZÅõò'E„Öô«‘Ý% V­ ŠÀ?Ó쫎[±÷îüVˆG*zU~CÖD+1]&pÍÞ{n[ß³cu×5jbñHÚ|wêTî’áß™ŒûXü2˜äm»Ÿà÷¶Ùl8~|´ô±øœ˜Ä‹€A`®lÕü+âÕw-  E46îµâ>a$=vÄêâ žlb@ñÄ1™‚Ð1ÍÿÃ7™×ÔÔ ¦¦|²ô*©¶¯R©pÉG}ûv»]ÈUŽ2”w2.yÐétÜ÷/ö{£ ?öóniù,Œ‘ý¼[21C¦Udff­V‹«ÚäÈäpNšÇSìÆ"ÆüçΤ‘3 LáÛ¸×"üt^”ƾ_«ÕâСCh,k_]]ͯ GZ­]9Tš4¹ˆÆædJ—ï$¦9EvtÀ¢Ñ ¼¼\Òê%&±_Ó:¨ÓCž ˜%ñµb+žXÃkºD•‘ nIŸδûÌ—Ñ’B0s²ùi# “^¯',ShÎw3u ÖNÖñ,©*ÝÏ,Tl`k²¼¼œ°Œ€;w âù°q¯Eظ×"Œù³,@陞åjfÿ›–0 €8]QEE…Àüyqqqhnn†ÑhôctÌ8VüC£»^Ò±p¨Áìp¹á=7Œ{.và°¹ …šX,ѧøÅÔ{‡qØÜï9ZßžÒ‰Ý_<›Í£Ñ(TTTm»ŸÜ¸õz=YÿØ2TVÅöc2¾°õå ^}ׂJ£ÃñÒÅ…Ä20ú_Üÿ#w¼/Ä‹ž›X,477£¹¹ÈÍÍEMM š››‘››”ÎŬ îdÜ%ã ,åý޲Æð¿Üɸ4xÞï;ìçÝÂìÓJúøÙyûy·®*V«…ÕêUZQQÁ­3á˜O`\Foo/2G¢Ã{{{ÑÛÛ ƒÁ@vïï‘üÊÓ˜†‚£Ú0Û¸vïïÞ~—žgebÕ‹Í|ç;ßÁÎ;fpgf¢°°w‡Nhù`ªå‹9‹•y¿îBȶ þÛ~²Q·dð6lCVÎLÃ\Cþ˜)´¬ÿźÉd—ß~ëÖ­Bmm-¬V+Ôj5+ßÖ­[…p0Àãÿ‰Ã%ˆÛ‡‹ýhÜ·OÐÙí€íS¦Š Øl6èìvž (EbÀ'—0#Rá'UlžJŽV]ñ³¡µù™“£üÚ‡c‚21&!V¶X @Õq+7ë-ˆClŒ•Ç›0bn¨üüÉ!c—vîÜ)444øíqâèv~¼ÁÏ ¨Çyew 4(:ˆí7c2ÿ14xãåû€îg¡Q¹ ÓéücB¬;)㇀™ü¥HPãE0R©TÈÍÍ Šü]âï<=äÁ *?Qdñ8yÌ{þƒ ¬Ge Ìœ%©”•• ̽ €¥úSII ±Z­Aã/kóf³YÐk¯€YìžLèµ£¾.6Ù€‰o$Γ½çµ+X5{*¯¤&Kà º¦_ZµãÆK5ö~¿ÿ›»°&Z‰.·ß5*• «»®iþbC,2”ýªMeåQÜóº“G~ðeÔ‡»ü£ý7îµHJßbÞ}š¨n¿M… Mj2™PSC£º ƒ$Кšî:œœ“£¦†pið¼Ðìöµ*ðb‹ß~Þ-´œ‰ø- ?,]º4äÆ xç΋êêjTWW£­­ mmm\åF±þ™ö/:cTßèôK”¢òòr’••Åë·žôz=ùòõ׃@9¤èýº ’Á±,˜*1K˸^ÊÌÌ$¬ÿ?q¸¦½2F®ÿ±öA…ãi/~¾-]º4l ¬^¯'®ÆF¨T*0—ÝnØæ˜ÒÌhã^‹À2Ý+FQÀ袢 AÏ ´â1b÷ \ËR‘èf³Y`Xüæß'—pªcï.Ö¡¦_ígTˆXê_ëùAYPóó'ƒi0u¨‘‘î9‡Ù'ÞóÄã5ã z½ž€ôøa°ï´°¬©’Ðß„ƒ_¼xqÈs¡„<‚œsS†<Ë;Ê;µƒ*à/ÆÄ烱–")!€U8€ö/§ï¡ÓA§ÓaíÚXÜX ‡©¢:M—á»:äFMû,þ…{¿ŠŠ ¡°°kÖ¬AII '^ž7°r@B™\€Q4‹§´±¿—g©I(Õ?ƒÄð`B^"GÒ&pÿß™Œ@dÀÕó?xD…{^wâƒGT(.^„²ö»€‹8»"RT*ë"°Ú[nn.ÈaÄü Ï Õÿ ðÒày^è'W)ÃQPS¤ØÜÏŠ‰šÄ›™^¯'Θ^¸,^¿Ò³z½žØIäjT !ß%33“ˆó½û—I×A÷ؽ{7a ;€?³ß²e &§]À\C >ÞŸ"¹‘±çÄÆÐM“1nvž¥tÍÊSIÖ`¾×5kÖàĉ~~~ñšÚ¶mV¬XÁ}rllYàlõçñ‰Ã”eSà°ñTZÖN|þË-w‘Úa*ßû4h¾±ûßWÊë¾?c–ß´ÿÙ=þ¿hϘÔPz: ãã¹Û+--Í@7’ºœ‘‘††¿ÔÀÂX y*ž¸.IñÁ08*¶ôö³¸M`ÌS¸1¬-³¼Î‡ sÒi<ÀÛ}£‘üâûdM‹"Úø™°õ5qB|Ø+òó'ÃÔ¡†­¯ ¡@Ù®§°Žßxü–4þ#¶Z°gmºƒ¦XJõ30ý0Bâþã8û=ô35*oϱYØXwúñ2©1kæ³¼nôû|8ïör­Ÿ8~€À´N•J…´´´ï-EKR|x¾ñû8zlo¾áD÷ñã¼/¦.MÅ݆(|þµ¬³=Þl6órÈûs#tvvJ*q………<Çf³Q©à§Ó9¢ý×áf$6ÓÁá :Pó•Ùñ¯+«(fŽÏ>+èõzòN¯N§L¡‹ÿ_ÅüÅÏ7›ÍÂ=¯Sí¿¸x*+§ð"0µ’õ¯Ôÿ€t* ›Œé³Üÿ[TøôÓOà _v»]€ƒ£b· “£¦‘Á8 vÃç(Ã/¾ˆcz¹ö/^ØN§2¤î…1ßnss3/#6qG$\Âú%kZùèý5€ÊJ8NžvÐø•Éi4ïû+º`4Ž>Wüž·.• ©IÜ&p/ÐÐŽ–½Z:WÜ? hhGM¿Ú¯Àˆ^¯'Ñ €Êš‘sj¿öN§‡2(GP¥ˆEö“þþ±ñûGÚ'/X–<·,+ µµµˆ‹‹Ct^án˜õ«¡¡ `¤³³Óùî’A£ÑHö?#Zê׿ÿ¥Þ—Åë¶ç…µDmNŠŸ‚Ø‘˜.ÿw¥FŒâŒP`{m|62Òhè“Ö¬N%·˜0ýÒšêõTÕcï R©¨‹SH¢i­y*lï—ù=_Ü WCÜž}G¨õªÔ¶Óé„f„M•••@HæÏöÚ@`Ô‚Ãâ]Ì_|޹®‡ù«T*h5 ÏÌe1ó€ ‡®â¹C€JÕÔV J?-- V«5,!³3!Zr Ùä‘2U‰'Ü?Zžð_Ez½ž0 e7ü¾£x3¸Þú×R}*:xm Cb‚@8Í?BdLŽšF}ýïŒ2Ó‡Äó›Ô¬|`Œ€8°+Ð’!nP V|m(mñÿ²÷îqQÕùÿøóÌ ·a˜AEÄ  ¢\”D¼¬Lµ»úµD©¬L]*Ë]KwóÃZmµÙE#ÚM­µ(ÉÌÚ>}HK7ÛZ±¼ $ ˆ‚÷ ^A™a®3ï߇÷›÷œ93 dm»¿^‡‡sÎûœ÷9ç}Þ¯×ûuy>¥íDåÞ-tOÛLšÐíòÛWìŒÜ&=†÷H¯«ÑhdÝØ®V< ,]áKïA­VCš®þ[u@쓞ã6ã-H2Ä2Ä@ºÿû>ÿg{é*Ÿb¤óîkºŸîk cà@´]Opç¼È9¾ÒœWÆÿýöt<Néõ©wЇnjt:WÈÀîñÛ${_„¿ÑHê66i?ž¸Õ—‘IG®ÞAOýôôÝyr¿Á*%;—ÔíïJòc˜†b¥âÊx¡RÑšI,Åí˜=wg¯ûLûÁ'ž<íóMU*„%ÂÐ2?i¹Ÿ§ò}ÚJÏÓ×vž\ß`0ÌÌL"Í\åÏ᪻±ÑÓµù²-š€ÄÿëËû×jµƒÞ ðÏÎáð¿»>ÑR7þXÚ–î3 äùÙÁ$++Köþ#Gø’çgi²¦¢Ùì®®_UUEªªªH~~>áñþBûîɱžÎ7c^ù!…âÓ»úÛ•üÔï«·0"Âá[ áY)èÏâ™ÈûÑ=ñ_à×P¿†ú­´X‘/ýíÄñÜGÑjµ[û|}1zÝF@xÔ?½^OhÌf/´¸Ç’v%f2 ƒoÏêսόŠ$3£"ÉŸ¢G‘maÁl Hi3Ý ïÒ›bw{}N‡ÈÈH–¨ÇŸƒþ–k/%Àà…µÊµåÝç€óê-88Æ1©©ÑjµÄìÿ²PÉd{êêêØÿ`özH|ß]B'lƒÁ@x8^ mˆ™C. :ðÿ¡¬¬ÌÉUûüì`2ª ¤Hš@«(4µœ!––†ªª*lܸ‘•êUUU‘¬¬¬ëè] 5(úÒ•ÿæ‡ïÄæ‡ï”Í€¦Ïf–—–– F£Qv1Áÿžný^_?¤ÌŒŠ$ÛOž\ý-~ yê¾w—L+·=&=P‹KFD¦3§§›Îœ~jF€œ±FIèÜ÷SY@¯×“ǼL¶wàTˆî{{¾7ÖmV9t´%33“PH^ú·”ˆ§7ÞÙ ƒ€žÑó.=­VK*Óüð`§g|{ú›_]ÊÏŽe§ÒR>XZsçl~¨©k–eÃr%f³YÐ ßàØ[d÷»ƒÄ¤¿±¤6ë|qééAˆS){œˆx±ZE´ßŽsVÒüµ „à—ýv:µ>M¶Šÿs23RCî¹ç—uÕðbŒ†Òsóî<)qE£1T:\=½^OÌÐ6?ÅøË éö h±"éö˜[»0¬ßAÿã@N¢×뉋ÿäÉ“˜lïÀ{Ñ#¶•±bÇŽP_øÎáxšXEAèsâWý3#5äѳ¬v^¡ÒÕþŽ;PVVÆþåää`Ó¦M²Ï¹'©ªª"ƒÿñÿã¥^+[½^ÏÊ…ï[¹¯wHö8êêÿàp;›¦^…N§cȑԸ¢¿é¸‘+×úw‹'+~¯üW¬XဂIó}F® >œBKFcÒÓIË‘#ð¹x‘YýО†€$Dpv þÍ–ïí ¸Ù^^áSr!^äŒ:é9rss¸;q2hLé#S3ö*¼0áüÕ>˜Nª ~jD?ËÎ-=.""‚ÄÆÆbÏž= ®`Ê^ˆžWÈa=!ÃQE³ec=pÍQË]"o¬ŒÙÕ‚ *?· @®=ÿï­šá. ØØXh5´¡VÔBpƒŸgñD©hµZ25Ä.â6XfFjˆ§^oOŸÁšã'ñí70ÏÔŠo߸5ÇO⻳g P¸}Z­–ÔÔ˜­~øÂªÂ;®;T PšÏ¬¬,æb>}ú4ÒWfë´ïg¿!À5_œý†0 ½^O–ý&ÙÙÙøÕ¯~åpm©±•yµÞÏ€ž[Ë£rB=‰‰‰Ðb•eö²Z­€ÍÄŽ§ïnãöëhðScãöë€R'RšzšºKbcc±x¢uuuŒëa´ ²îìUxá7U'ñc¯;\Ï£î^ýv=ZvEëÆ/^™ _ÛيȾÄ~Õ†ÑB Kx3HàëëëQ]]Ícee%ª««1þ|$$$@¯×;xÜMNôÝÎ{çs–µÃd2y̦9CãGüq2„฽¾·…cYò8¶Oz|ii©ˆ™áâ·±§q¨@)†N§Ã”@qN»Æ›)3£"‰”—p¤¬•SiiiømñwøìäIìÚµ ƒdee‘Q/¯BVV)މªª*¦L¤Êß`0‚÷éÖã,".FÅæäCùû7[PKÀ}: 33“Ý'3lüÆ““3Tæk;[1sÁs_†Šû¼ºË¥Ý P(ˆŸB@3!hUû³Œë’’$M›†’’˜º@+ Òd·;œƒÝ?¥3†#‰-‘‘So½õV錢 D‰ÒJ+PzÄ µZÃÎ_zÄŠÝ;Wajˆó£–rðXí€|&¯ôXþx*ÍDü3H©Ÿ«“Ðû;ôA4ÞZPSã\B9Ew%€½05^ÛÙÊž½·’&`jˆ{L1@M«4›zf¤†=ߊ£èÄØ¡¾øöŒúaÞhjÄ.Jr£££‘€²²2' Z^T]]„„lܸ›6mÂüùóe€… "''×ö~‚×M"²aÁÝãðûã>0Äšœýª¡àÅ*¨Š…± $)Uø[y ŽÛ;1j ”;™*ý=ƒ03\Tü”‡žºõö•¶2¯ø¥D¥™2te¸ÿ˜B•»ýšBð Ž+J ñÊz”Û‚tï^½šÝGV œ:…éÓ§Ã<+WNžDÓ¾}0(މ ¨Z·ŽGD¦J)¼òÒÝ$++‰)à®ôá¨øäHLùÀAùÀ;ïÄûÁ£¯ïǤ¥Ë°oÍ묪Âh4’OBÎâýã©ÞgaN£ÑHè|M‘è¤cF¯×“ßž@Þ½×p¥Ðø¾ºË<¤›4h„  ÌNÐpÔÿf ¡ßÄsLŸ>yyòdAô²î³ú“ò£È˜ÕŸäv]‚%:Ó* 24ô,Î_ênC«¨Á§Rb;d¼9]û_¬:îd(PÐ0NÈ„ 0aÂP2ŸˆˆÔ××#//OÈÊÊ"ô·Ë›u#™™™„zúœ<f R3Gp­¨Õ.éž„NnÄbÙê³ÕÏa»+9}ú´ÀÇAùÉxúôéˆeÝÝê_¯×b±À_ؤíkm†Qí‹Hs#Ê[Ûe‘Öør+^Ìf³@•†Ùl\M®îOŠü%mŸ™™I***PQQ«™®ø­V+, ƒ,Y²Ä¡Š^ƒ=ÓkÒ{¡+Jºº•À ýo±(‚"** •••¬¬¥²²‰‰‰hž§^Ú@ãÐú^ƒÖ÷åö3Û IDAT®{‹ÿK9 xÙ~Ê"P ¾ÿ¬±bëŠ ì®U°¸½Ùlv×*05Ä. ³*}¾|ØáÑGuÙ*Ô‹"ݾðO yøpÎåA=õAÚ¹ím•ŽFi髃òDEÊÞ§t£1ûU¢}¼ÐL¾;ׂ ¥£*$È£Àegg 7nÄÂ… ‘€ùóçݯcÆŒa.ôððplÙ² .ÄÆÅ2/ÔMÙØØCì$)UX–<ÿžŽ   $$$¸|6€Xï>J¡Bç‘>6V¡À²äq8`ëÄÑsçÐyÁѯðŸýøÝ<$RC€nKIMÄ$ƒ/¦^uRþ4Ì×—jé R.‘ÇoŸI>}Gƒ[»”¿(34~d†ÆÄ+ë11&ÌáOu£jò&ˆŽŽ âûï[ó:vìØÁ¼PUU…L•RD*iÁk©fÁùÔß!öîoqWúp´……aÒÒe¸íÝ ð‹‰ÁûÁ¾}Ý%n´ŒÒh4’„„|ú‹'QX»ñ³F’/Ä^û rþùrþùxí/h: ^ñ =^¯'¾É:äÝ{ 0"F‰c•V«Õ ÐÂjµ2c€bhYìfôu¹¹¥ÏÅÕ3åW²-Ä/µûJ-h!ø ŽÃ$Âpr ˜†zÊ”–¶¥!‹·Þz ¾Öf´Ø ¸ö$¸ZMš[B«…ÓǸ~¿ḧuýÝív×*p{š OĨ°~¿†Uˆ«Gy~v0Ù|ØŒ¨ZQp'ÖvÑ˶¶ã¸½S„åŸ5UÚ7n–ôÈ èÃÃñqãFdgg r1É… ÇuÄ!ºŸcccñ«_ýÊí<@‘QoóÃbì¿´âãL§9تþ¶ÇÆsïâJÿ¶ ¥¨ ûJ[1Éà‹´å °+ç}権©bµøræãÎ{įtéož`‰§Óéœðôc¯×áÆC"ÁcÍ(#•è, ‚(€4dî8…÷FilE¦Æ¼ToG¼Ÿ‹Ø5Gj?ÛŠŠŠ $ÆÆ"((+V¬ÀSÇO`–nt¸~Lz:Éÿä(‡ö­ΧþYå(ÍŸY†‰Ë¡ž¸ ç ;0´ðMPS ‹ª«Š¥^ñ ‘;õ€ xi^üv28à±)UBð»ìñ؆< "ŸÉw Íþ4ðo¶@9Ú‚kµƒ‘pPLâKðFMñ5|ºU7CïIÎ~B 4îáF#ª««™—´½Ë…~Š$v=“êêjTá7ö††žÅâä¡XÿÝy,N X›0ÞãB€dç÷¼¯äŽØ;±þ»ól.‰S)±l\<\²*~â7ñ~Cðx këÌ(omGÞ  ¬½!þVÜ Ô»ödóùm¥¥¥Bff&Y´h‘ìêŸÒ\óSÃ800ÐÁ0 ž<@—€5õ°[Ùj­…ˆ‰-b³VÝâò# øÄ ~jøZ›‘y*®ØE ½ŽÓÝGA¦L™Â`T{ ^ ×ë Ÿ¦®l^\ÁpJ3Ã]Ávöt,?y¸ðáÏ™™™IØËT(ÔЪ[ V«1þ|†mϨÐÎiií—ÙB9¬§ÎyA«<o¢Æ„Õju€¿äïϬ¹î(uŒ‚S xâ °GCs¼Ô µ¾(0·¢Ãjw€–{®Ò>R¡Û¢¢¢DJk™÷¸`áJ:žœ ]´eÏËBm:´öÏœ LO´ãƒ -êêêÌõžýû0ìzíî_k…F£A`` [uQ WþTÁSï:q®£S˜¡ñ#'CˆÖ|~~>Y¿~=ª««±mÛ6lܸeeeºW Òc]¹ñiüÅŠ°X,,|E)óóóÉŽ;Üñ34~D1H‰Ýµ Üf¼íG/1oÍ ??'šPÅPpdKv±”±¨PTW)©‰Lùb² ž„xc–ŽÖ no:ÁÒ÷t—5KŸï žIb¯×!ÙÏô¾PF*ñ—¯¯cé0û-bndWÏx%1ïå—Éñ-[0jöl<5kªªªŒ€Åßîv0ä¥:&ÎÆ£åHDnasý·……áÈÖ­ýàë/ÄÔÇp©àB‘Ñ< wýãy6žFg¼HŽåÿÉé;lö×`ÀX%Z¿3Á7Y‡†£6øê.Ã?lŽŠ†_Ógž ÚüÂÃÃÑïÓ§¤ÏÅ‹N0ÒRjp*zû‰F@—´ªÅ†ö'ž™Q‘Ä~å E¼ 5Hö¡š“}}°ö†É~>âïF5„wÚச*++‹DDD8„²²²Õ¹¹¹„îã•?ŸÃCÇ oð ¾=râ'h˜…f‹üÇA•½ÍÝ“äÅ‘•JšÀæJyЀÐÐP\ºt‰¡ÚyÊ@eµZé%Þ%u;Æ•HûF'p~@WÛrí5 ›¨ ‘Ÿìå®M<¨²†ÝЍ¨‘8yò$ÊÊʰk×.kÐh4~õÏ‹l [¡`rë‚ç…W†Z¬€R†®}½BTè0TeÂy+ ×« e/ô¤)}NV; íÞîjìô´ú§Û\)wc‚ßçjõÏçHǺ=.V˜m&@p|O555Âö 4"88‹»­ ì®mEéØJì®U°sðYëÒx*Uþ‘#|É(… †;ÞÜÖ t­â(tè–aæ ™Çy8€uëÖ{ì1`Ì‘:ÎÁH=pà€SR./ÙÙÙ‚)û~rÛ¢dÌþª†áîÓ{®üû³økò8¸ŽÔ‚y|­Íøúó“ÐófT¨<{á¶Ñm¾+ç}ø¥” %5E…%H™ü;@J*Ø~ê xyg?Ù\"Wcˆ ?Ö¨'‹ÎOReOó–ù•?jl?yJ@T$TJ$76ã/__Ǥ´p¬ÙU¥ÐA1Pr7Lu€¨ø§OŸŽÕ«W³mÞ§O#-- [òòð2€ÍO=åк5 ú¢†%÷í[LZº ð·ÔråO¥åÈÌIExDIÞP¼ôm0êþ/,jºª¤ó …ÇŽ;0qâDìÜ¿”+eúôéNa3)¯ ‘mˆbJºsaŽØå“pùlA%„]¨Æw¾møÈÔŒL͸/pSþ= UþüwÇ/ù}rcв†?N€söd ±€ äà\í]„*ع.S¡ €¸Úæ±’+®Ø¡õ½†ˆ!¢¢¢Ø$æIVvll,BCCÙ‹ó¤†8@¡ Ä‹XOÒå6—|yC@.I°®®Ž)~¥ w^ú»¾¾¾t©+Û_§Ó!//%%%X±bòóó‘••EòóóIxx¸ý£ôœÒ¾Iã¦=‰Õj…¯µ¡^ÎöaO1ÑfŠCm'ס* jêIŸ3¬i¼ÛK-Yu3ëy}­ÍÐ"zhx.@4jýƒƒ]Ž_¹ñàdô´uÊ¥‘Žmw UX&“ áááìCæs!æÅiY™_¢¯˜ø7/Në]ÜÞén¡97nd1zÊI'º²ÌÎÎø¬d9y©~0€îJ¾>ý¹O«z4íWmØüð?…€Úkb(c˜—Šl~øN|ôìl‡ãÿµî Sî-EUD·?ì°+[4Š K¶|Ë  %¼ÔÔÔV«•1ÑIç,)·«þSe¯ÓéØ;ª®®–ǶŸ<%Ð ¦HH-2¯Öãñ~ZmÇG¦f¬9gÂ’NC…€T²²²Íâ]^^žp…cQäC7¯¼t79|¤,©oÒÒeZø&`ÿþväv dù˜´t[ýBJËtÇw<Šgþ!® g7#~m$ ÿâYé}¶…E¢7À4Ú!5(³VØì¯AÀˆBŠbÒÓIff&™>}:***Ðì/z̦¤ N«Å˜1cÐØØˆÌÌLb0lDó2fõg±ÿÃG¬8bïÄæÃfl>,zzûa^œ³ú;•ÒRÀÃ6|xê4Æ =ƨèg©» { pÌNÜ‚ÑÕ½;/™»}Buu5bcc™°gÏ„‡‡3| ºx`³*eS’ŠŸ é^=*u¨¹î¼ª–ºÚÍV?üæWI˜<؋łæî¹:j »´Þ\ii©`2™êvňJ H©@RK¸Ôщ»k½ §ŒøÕ%¿ŸîV¾Ô à‘*dzÏR"G|QRRÂ2ý333‘——‡·Þz ,ùcÇŽà9è]êQèéÞyi®«­ h²ÛY"%w«#½^OšÐ5l&œï ²¡*MW ¼g#@:6^ÛÙŠ?¦ŠÌ~-D¾Lèyå¸?À-*%tJüêÑp¸œ¼aë–X©+÷A*¬Ýø§9Ü¿ •òÐdGº§©–^ƒºþi¾Çq{'¾°´555ÝFËçF)œ ; üS__ï°¢­®®FPPC‚*¿‘ ¼T?555B^^žpàÀ$%%1Å£ËúÐí{  ^îEÐ@˜ÍfA5DÕ±ß|{“ÉÄâþÏ~üˆCŒwå¼ÏÜÿ4T03Üêäþ§;þ=ð㪧ñE“þ¤«²ÒÒRâÈå¶ Ä+Å,ÿ£çÎáàÅV,™‰ïZÛp¸Ó†yøÈÔŒêvدٱÈÏì¤@hlØb±à3.G¯×“¬¬,rKWþȬ®1MAÊþøô'%OJÌy “–.CÉò'ð[ÅD·}ûJP²ü $漆E©^HÌyÍ¡—ÜÜ\’”†ÊÊJ¼<•…‘¶lٟκª<“k»µC ÝdC‡ù2ŒU¢Ù_ƒ¦3§…¦3§…#[· q‰‰ˆKLM¦>q£wM‚ŠŠ œ¯8‚Ä~ýˆù%7n 66q]‰Ô4¹oqòP– '1 ¼Ç…`Rb¨ìq4pôÜ9ÜÃ6”·ÙqÌN0vØ0=wå­íˆ÷®Ãh…à6àNzƒN ˆ^uàCtañB>þOWÿµîLE³…>"—¹Öë´l œK¦f„*ðʼn˜1òVT\±ÃD¾é>¦«=µ¤h"œÜä–™™IxzUÀ™Ã^ þ]ÜF:¥&›ÝD‡zÜ1:ñ÷"û§×啽´|Pî\¼Ç@zŒÁ` Ò„;i¬=++‹¼õÖ[m©µËó@:g Á0e‹˜«2@Z>I¥ÅîèÕáÅÕ³3[ˆvèKf«†ª4°ùŒeù °79µåûOÃN4ñojˆÿ¬±ÂK­`dCÒò>ésó´Ïüû£¼Ü¡^*P60ÃÖ…ÁÞm—ûßí³ñ‰l&h}¯y”Gp{šŠa˜ÍfZîrÉŒ3#5„§´å÷EŽð%4L03RCøýÔeÄ©;544: è©ôˆ¢Ñp QQcU.tÅ‹^¯'þX›…¿:ËîC«Õ’í¥PAÚwšÈ˳?‚]9ïÒ–/@Qa þµî K\9÷ml¯V³ù¦7¥€ž„Áèû¡aLJc¬ÑhΈhù$yw“P½uÆŒGGhq ½/ŠÆ ¥>x±UL"ƒ¸úäûž——‡;v`ÇŽNßÂ+V0`É’%ì’ƒø¥¥~ô7”,˜óJ–?!K¦D¯™““ƒgŸ}°råJ\*¸†×¿|Åa»;cÚ•‚óMÖ¡õ;“Sû˜ôt—˜ki)QQQQ³gcçÚµ€‰'Bm0°ý4I°X¦l‚nî2œçʼnqÈÍ‡Í B(ñÊ;þø©ÂáðF™½Pè»~wåœ&­Ø>wF€«¼¤Þüð¡€ÆÆF†ÅëZML]Ð-ÄßàáREÃÕ]'”fwS>d¾£:ATþTÙ÷o›ÏXåÏÎ×õ!ÑR8Ê`$—‰=dÈ:ÑÛò €X,ðS̺ÁXX·D¡I9¥}“S0rl_tŸ´'‰sùùùdõêÕ,ó^Îøxã7™™Ù£“Ê€+{Òl|>­/uÐîŒ@‡ãºŒ² ¡ÒëK³þn# ¹÷Ó›þòŸ#88¶êó=[îŒ&é69zgÖ‡Ö€ÏXh…oº»û–º‹'ÚQzÄŠãöN>øÿFDÕ ¸ÜiCM èMáï…fø××׃7´ißYh@ ÌSÒÒ¤ÕÕ«Wƒ*?zŸÐºiÓ&ÙD\zM_k3tá^8u¦•=Cjœê‹’&M7·üœh²½ZíTÈ{€ntÀg?~„î’Ý1úõd¸«4q…ÆÇËdµ/Ùkm•ÝO½8|²'ÝG3àåÞ! ÏH“žNxfDƒÁ@s^cÉ~ÔØ¤+~j Ðýÿ'n e˜ý#ÿRàtÎ'nÝÖË’Ç9åÐ~,îÊ÷žçÄÄy‰’­/¼Žšš§P_’G¥¥ŒTzÞ÷ÿñäyüPÊógù/WÖÇÍÌÖv'=Q.þ”({Cª1p|7þ9ÿûgùï)bœÑh$YYY$33³Ïô¼žŠ;²¬žÄ`0¤Õßô¹ý̨Hòå݃‰Ü·:3*’ÑTß ¡$8<Noä™ÑýÈ—wþÁ¿Ç9é£H_û('”>ùf´ P(­s%üT„þã·ÿŒwRñ$‰îÇîÓ¿KÜâôV\!|I½}]÷$žÐÕ¾KZ!!S¤·+ wld@Ñ+‰Î¼ ™À`‘ä…ð™²?Ë—ðnXþÐc"ž'òüœhâªB +)Þ¾TfhüdÉ´h¿¯¢©´Ðaý.ä`ص£"Éoã­¬è<Ñé[½^‡ä„þpÑÓ»õLÚ+{®Ï–“wnøà=6<3º€/ýG@§ÓA§ÓaË–-}rߦ¦¢¸ñêÄrÊšb“CÉÝœôQ$V¡ð¨¤RNžŸMÖ^÷h¾Ì éOnØl Üæ@@vÝ/ïŽ%wçE“vÐvm匄’ŠQ;Ô·åñ|+Dl Æ’‚[Ý,¡c/~ÖHkˆÅû14ì@M±˜H¨×ëÉíK&6ýéÿª"³ñßì)ºé7åJÙÓß?” ¿H)ùßüq7S(æ¼Ý&¿¡‚í¿´tÝè•dt´[Z«ÿ y04c®áòÅv óÆå‹íøÙøÏO&\*|uLPPÊÊÊ<ŠWÏŒÔCìŒ?Ý€™‡kŽßBF p«8( ŸýªM–3ƒrû’VCšJ qªBLÂê<ù™0:ãE`HÅÓØïƒykÐyò3§öÛãBºz¯¼ã×ÅýÑ…Ž'ôؾ;.Ö¹¼w`cÒùG¯×“Dm€xý>Î ÏŒîGÞ¹áÃþNÔÀ6„e\GFFâÉ'Ÿô(Œ©Ÿ ÃA@aQ#µ(17±s€÷¥lý½§¢ŠšE:Uã1³ó—÷»¤_êí… ¾Þ¸n·cž©‡Þ‚w¯‹\-õ„×hÑÑëõ¤¹®M>ñ˜¡<†ª¶Dûx9üßà§f9IÑ>^P RâèùVNEïVœÝå±}Q¼ôÛé mB¬!I©‰8PX‚¯ßØ F‹Å‚ÐÐP‡ {>œ¸Q$æÝT”ŠIsªKì¼ÿ-F@ü¬‘¤ü³Ž9žŠ;.Uøàʸ™†@mdyHðÅ{‰ øMI6úãÁF±œäu‰CHpÉáf\è.çKLLd1G)D(>R°ÿŒû9NêÑ+ ªžFg¼HàX•££è(߈¶˜´Vÿ˜òæòÏMÿƒò¿YäŒQºG¸£Â+ÿêêjFELEz¼+¡ üéäZ›J¥BݳüN=oTµu8õÁ`0桳˜ò€ÈXöyoÀ¤öqª¢‘±ÄZð+¦9eH/ò3ƒ\m€ïZÚ0a°/ÈuÂ~SÉmѺT^Z­–Ð$dé>9oºýá~mPE‚ß8/´êèóêšžóè|0dÈÒ9y~N4ɽ~uƒVeG‰¹ ‰Ú€ï½X™“>Šô~­C¹Øå9ŸÒ‘á^"rä )ÓPõm3ÅßSîOs]øU½ÍA£apâÄbARÁ*¥l¢@÷اÄp¶'å˯ÖQù?ññ#0u2åO…Wþ´--Ñœñ¶˜ð©sP– ¢´‚ÿé/Ä÷Ÿ9Âú.¯Æ‰4V"ÇÏC5€nн^O4 ;ÎSåïI¦.)ž<$øbC ?TãÆcC ?ÖZÄò:Èk#ÃHýýsåo4‰V«%»îjÂd{*++Ai0+++¡×ë1OeææE½’D´o8*ÿÓÞóásäuýè6~ÏäßÓs¢íŠÏOÿ6¤áp9bccñÍ›’W´îÓù£äî óif®J+.à`Ä€•?½Æ¹ŽNá K‹p®£S¨jëÀÌH ¡ý£Ê_N¨òï<ù™Ðyò3!^{ †T¦üãµbù HßUþïøéðŽŸûâ—kÅBê—êMBn‹X‹M®× ÑÑ Ó0V%8°ú¢aPÓ4:ašl2f¹-ë ¯£éà €ìãHö‹q²y= E€T«ÕÔ^f¥r·Þz«[TÓõ…býùAÀˆ¿‰sõôU†Þ9’|^9 ­ƒºf—[ƒ"ÙÏ)~>˜Š’ÎJ¬léÄ»×Ùý¸ºÝïŒú.üªü0Mªüžo…p°ì¹.]º„K—.1ÅߨØÈÐë\=;‘ˆ¨ÑaåÿÐÒ§ì‡Øj•?mC·•–– ¡¡b}ÿîuÙ±©“&áŽQ÷à¡¥"zÖ0\ºtÉéZ?”|ߟøY#eÛ.sÔ²¯¨å¶K…/’–ÅÑm<ºo ôV¤>ø@¹ð^b´¯= ÞPä(<®½µ‘a¤.)ž(“Rñ›•Jºû¾BËÅî}áö*¼`µZQtt7êÓÒòØcÐOС!àŠŽîFÑÑݨºXŽ‚ý7e°8ZµUÏ §½çct´‚)ÿcUvxÅ/DD»XVe©ˆÁaÞXôxóü,?m¡ŠŸ*ÿ8•Ò)•Wª¾ñ2j?ù;îÓùÃV}õ6;ªÚ:PÞÚŽ¿~õ¥¬.{íH )iÒ ´â‚GÇ˹õ©Òç÷¹ò@tžüL  €ÍCg±U~çÉÏ„ÒÒRÆþ›J VtTùSXUràŸó®²05\¹þµZ-Aó7ÂEÓç— Ÿ f³Y8à…Éö1$`K@˜J‹‹¦Ï³-Á í“*Úwnø ôHön²¢åP 1^(X5~³ IDAT5ž}“Bz›8WSS#5"5%!ŠÝ¡šÖÔÔ‹úAqã%üßKÇ‘šˆÔ”À>Ï•sÒG‘KÇF#L~J¨Õj—Ŷ°`’ìëƒà”É(jÇúÂë=VÀÈõŸ*{ú¿Z­†_C=,&–pá2稩©.]ºÄt†ÉdBcc£K$ÅÒÒR ¡M˜ÚÅ i*êÄáÂ#,Þ¯á0`\­à-Gmؽî – pß>€¾a8’R1fÌfœHÛÎx‘”Ùìdñ·» õàî~•,þv7‘’-Ñãù¿ëïOªªªHnn.€uëÖ¡ªªÊÁè1¤ªªŠH·ËIùg'„«ç©!PþÙ aÁ 1l›“À¯Ö,H °°è×PeøP¦„éÿz½žÌÝ WÞTéóB·IWBÝæ=Ýhýýs‰jÜx´~',Õ¸ñPDŽ‚ýÔq(“RÙï8•µ‘aèž”¥ñ›»îwø;~ÖH§HeÁ 1$~ÖHŒÄÄD´&ODbb"ÌPµ¨QµúT­~•§p²è ¢RF n´^§OÖµê¿ãoSÑœ££è?N;þ6»ÿ¶ÈáÐxƒLó³ûßµHǧôÿÞ ]IΞ=›¬ZµŠ ¡8ãTJº«HjºŽÇ:š‘Ôt<8  óRЇQo³cµ å­í¨·Ù¤T8÷éü=R 0ǓտTh¿xw¿œëŸ+UWaÏÿFö"Møó?ÿ™ìõ¨òÄpÃÛ7špÇÅ:ááfFE’žâþrnýÈZì>¿÷u€æoœ ½ùUn‰¹ %æ&TØEExÿš+°·a’ÁEߤôz ý«à b œ:uŠqº»’õ…×a;¦Á„ÀPœé‚áž»9´×U z½ž‰nô‹8*Œa÷éªÍw­m°Ÿ:Žßì©Ã{S‚{]®LǤF£A€#Sü ïÑ ±Cˆe¨þÁμ2¼Ð÷a±X 65øïXTŒƒ.EÌoo좦+|ÀYùÓU= †jŠM¨(­ÀÂÔ Á– ýO¿”mOs[¿*†êèOú?Â<áæ »Û!¶ªªŠÔýi3 ¸¸-\Ù¶’‘tFrë­·"''ÑÑÑÝÎ ÕI¼ÎÊ™0¼Â—ŠCF‚Å„2 h¼2sQË­vÔill„ÅbñÈE*rÖ%¤àq¦ƒ%ÜñÕÕÕUæËÆÅ4&2c€J硃°Ÿ:Ž›Ù$S—Oèßñ³F’þãðĨJ¼ÿÌáÍ]÷“…û{–‹Ç£*‘”*òÔ¿ñ/œGáãA|r¯ä¥Ð¶|ž z%©ûöQ¬Õħ÷‹È%“›¢Äã¦(Ôj Ø[Øm¹ØoAyi³[€&BÑÄÄ´´4üß_ÿâ6~ì.4ßÇ<Í{à·QzK—?¤ÐñŸôÙXô?S9÷ä8јJÛ` ;'Š†Ý† X/\¸àD-*'OéH²ŸR'ûÃvʆ5çL \îT†y©H´ö*¼ý0UúÐd· üT„4Fïi.@_E.?¡'q—åOÅ] •fûóϨ/!;~ü{Ì`É Çâ¶P¬/¼Ž­kqö•¶ö*G€&¸ÑœŽ)W]¶ç•b³¿#b”ˆKð·õTæ¤"…Ehö× H5³!y‹œBz½ž¼7%E5Höõvãß1lN€¾a–^(Óè<⺨¨(ð|=¹F#¹çž{P\\Œ   ìÚµ iiià6›s<ßùö¸1dæáJa{Ü’26¯*wˇN…~Ð>é³a.-Ösi‰[åÏ?ªø?ýôS 2 Ä¥K—]µ'ÏòÁÎ,¦i$ø®µ oßh’uµÓ<ú}ñžúÿmôVFg¼HüÏæq–tûÓA:ÀÉ@úw ÿ-l}R4`Õ|2­¨Wý£Dg‘‘‘X³f ׈”€†´¾ð:§öÇÙx%‹Ûº›wÜõ¿^;~¶£#;þùû|Ì[ÀÒáàˆ… ?îÕõxÅ?/~8V,MDƃŸâèùV‡ŠOB ÔMWþÝ ÔÜüÁú€hܾd2ËüÄŒþšbèù\Bñç¡Øùƒ§õgçòÄ0 dÍk÷`3IbÛ¾}c/ ©H˜ @Y±M¥…²tÈ”EñLБ““ƒÆÆFü6É›»vírùmÑU΄qX^|q Þ8\ÖŽšb6/û–bÇòãHˆˆˆ #k.]|Êð¡°UŸG´öXÛXV'¯@zJâë ^ÖÕê?Øl-ä)SpbD|w 5͈T“hýmÙ²h sȵ‘aDè7€˜ 7º¥Ýe9ÔºöO>Bðr—óáÇ Ì8;.I©±ø]š{3žûûd©Q Ëö/))¹#Z¯ÓÐ ÓÄ}E8ct:9Ñq€ˆc­ø¸®.š€ó—¨Õþ_æÔ¡éC &ƨñØA?—F]­‡¯d«Êžøx‘"ëñ¿=Ee\¹r% ;;›1Q¹úø¤ò§èQ$ÙK ªðIÝUÁƒì¥Dñe1¡Ê’ ØåËÿw9rîÉAË‘#ð‹‰q@·tu4ä¤ÓépáÂføP#(**ŠrÆ/ý>,Ý žñ¾b®Fyk»¬òP(]åóJŸÖRóFõ ðÛÿÝB+}:Ö¯_ïñêqjä”·cöB?ÜþD N?ÐÐëë.NíçŽÍ…ªó fÄp¶³ Q8&[F(õý l¨¿þ¤Âí5iÙéærÑUU+ é—ÃØ~ÞhðS3R6O<¼Ræa›åʪéqÔ kˆe {x¹øÍŒ?#àŽCùb˜i´H€ôű­²çill„f¬³Tcq6^¡Gâñ¸êÖvÆàhGöïß@~Ù¹z.y à¯)¥ø}‘zTþ|Û[îx Ø·oN:…û¢¬øè¤Úcü«çªð-Gm°X,Ì‘NØÍ~ õ,3™NVüT¤e@, fT˜O”çÈÁ ó×¥îŸôÙLáêDk,ÕÔˆB] û¿ö½<øÅˆÖ,Uþ66ã½ÄLø®¥.‚o²’)ûÎC¡7^6 ' ^ˆ!…ï·à÷¹Éø]ڇ›»î']ô~Ÿ›ŒwÖ–öh‰Fâ{E‹²EŒ ˆ*Vþ'Á Ê¤W Þ_ü ¬¿ïí~kÒÅÜÒj|™S‡e“û£àÍzì?bÅÄ5~ýÉe'Wý`19(ž<Ç]4}·t=ÞU •ܽ‡‡‡36²ŒŒ ìØ±”Íþ:_&·=n €âË—ð¿1×[RwTÝ”»rca¬G<ö8à̺µ˜’‚kEEìWÊ_Ê:ê ôé5ݹ°iÆÙsМ€ëï> ¯ø…¬ôµ'刔ʓ&M•m+1y¢Êì6Ø”àØ±c(..îшŸ5’œ9bÈ%r&ŒCaI>8ÜŽZl}ØàdÄb± ÁbrpÑÐI›x(ˆƒ—\ºâçWÁÁÁNy®ðØéC§Ê*“¼¼^[ð-ú¥à_%]ÝÇŽíéžfFE»r,Þ1x\u÷ïÀæ·cÑÕ}Hè—âàAºÃ`ŠŒWqý݇^ñ ±ÎpOá'ü 9©ªª"ûöíCqq1öìÙƒ¬¬,Lš4 999¨®®v;wŒˆ ! «„å¨ µ#æñQÃÀÁà3 iv>¬¨ÒžlÁ^…˜05Äî@É 8Or«Wt´Ôj£ÉG¶nbÒӉֈ§Ÿb9ZC"ά[ë0ø¡º¤xâ}÷}lÅßþÉGð¾û>¢â/1Á¥'@JŠ²ê³™xgm)ÎUŸÍ<9k;`Õg3ñÂ}² ŸÈ'@é‡ä@µZ„~) nÿ‘^1ˆW PŽIÀ8ÿ'ðnѽˆW ˜[ZÍÿ«ëðÌ[Cdz”̧·eõ¦=…ù½YzFº òtŸ»6z½žÐÿéö›=]ûïs®›Õ·ŸåG”ãûÎÅ~3D¯‘ïøA$Lrxê^ ‡Ù+@AÔ!ª^Üû¿GÖìÞC^Ìþ–¼˜ým°—Ò¾Óß;WÏ%YYYä_¯¬vù1FòçŒ9Dn[ÛžÄÕq7sÂúY~úÒtøÌ¨H23*’¬ÿ½Æ„tLyŠbi0HDD‰ˆˆ ¹¹¹dÍî=äPÇ~†.ùc E[í«¶d2:ãE"…ÊýYÜ‹Ü)Ýf4IVV–öÉ€~–ÞK_?:uˆsí`‹à ‚¸·2CãGfFjÞU«V‘ªª*’ŸŸßë±1ìNgƒÍ•ôɰ邳¦’´úÏAÇ= ¿7kì÷Eä½'Ê?N¥Äö“§„×ßkÂö¸BAzWžWú?c%…JðÞXé;*--ÆŒ[ÈÍÍEQ‘ {öwâ±·¡ŽýdÍî=Ä]{^´Z-¡ÿ<¹^BN]¤÷ž™™É0îÝÉèŒIôýbÂõ±BÇpôCÖù?näž{îqx§Œ—„„PDÖŸåûˆd²“é΋;N†;WÏ%®0œ= y–9O jÈýã•¿V«%l*2Ä+@AŽ÷#TkµZB'ö¸—^r©È¥†•Âݯ2ÀìÙ³]®äk#ÃÈŸ3æ½^Ï®m4ÉÎÕsÉÎÕsÉŸ3æÈ®Ú ùsƯÇÎÕsIÛž÷AÚö, ¢ÓÕ3ü¾î7£ÑH"""ˆ«1´jÕª^“ßì‘ÇBòë±MôJRf³“¤ÕßÂݯ²gS¸ûUÒ[#@¢"l¬¸Ã0—zÉ"Gø~/AWð®ö¹k·-,˜l fígFE’íq!ìß^î\ƒ¶dBlE„´%“9飈Á` RüÒ–L̯Œdû¥ç0 äOÑ£Èós¢‰Á` ¹¹¹äo²ÉšÝ{ÈÜÕß5»÷xì›é±PFèÊ_¯×“{µþ¤.)žÔßïø,x!FÖXðB YðB ó`„ŽyÁ阄2~t ¯áï›ÅAÒ[ÑjµdØÈYDú›Î·ÃFÎb"ÚF– è?!vðüìà›ßGOW1UÏ =Mn999 ÌMÒ}Ë—/wÙΨuˆŠ<ún)ð#Kä`"WÝ]š Ÿyþ…¥EØ~Ê"VÜ~›ø¬L&|}]$!™dðBZZš“'£´´TøÇùjlyj:ózÌ{ý[ìÝ߆kÿHÇn¿ V«uuu¿û+Lžèã’¤ª¦¦FHÔ8<¯ždÕªU¤þ¾ñNJýóÏ?—5$Ÿ|òIaýúõpeÈõmï’˂߫xàüh—}jßGvÝÕ„ð0 ›ü\Á¦ÒßIó'3”‡ÖµáÖ½ƒe}Ö ƒQ7 WšÎCg«—µ»%2áåÔ™Va†ÆDŽð%34¢ñé‰ç‹JœJ‰‡[L²ûÜ%?Üb‚ÿoCñö&Ä^¯Ã¶°`BÉž&Žéþ~fFE’?EËú캫 ×St.CÓëxoAx˜Õ»ñ! ‰Ó€´ÿ @þÇ:캫ɉÒþ©Öà â>üÊjÁ–uµØ÷]"üNÇéüÿ߉ã¸ãÙçdïCªì·Ÿ<%LÕ‡°}®î¿62Œ½ªDsÿ£ÀÉÚØOGêK/³¶ï?sDX´h‘0ùÁŒ!oÁ 1dc–;wœª€ƒêwœB eÏä /d°ôÞÇðû"ƒøß9þwíµ§@B”Æø‡ðJÅh4’àà`4\ÝžÿúΣ6r9{)3F§“†«»`SŽuàca]ý=ܯ¹}èN÷U V'Ïmq¶m\/­EºŠ™?…»_emÿšRêÒ8°bšƒ™™I(¥#äåå W¶­ÄˆúWœ&ñèèhAnbŸ5’k.aÛï3p¥é<}·ÃËmN“à¹ÏÍ}<·¥N°_µ¹4 (z à˜IJ…ˆjµÚïA§ÓÁ÷е§Ã÷Š:aÌ0[»‘û¦$MƒªE“Eg®7:h·lÙ"Ø”ãñвßã·E UŸ‹1ñ›…q^…€dÆOxÜ¡mAA-ü9ÿSaÓ¦M(++Ãê¯ÿ…'oˆUweàöþ°"ÿ4VýëÔgÏ`þüù×ýsÆ¢Óé°ê_×…kÿH‡ÕjÅì—w üî¯ðÖ>‘Þáw…Éý-o8o?yJxâ¶PLÕ‡ôh¬ZµŠDFFâØâ5 AVV1™Ldž peÛJY#À]iTAA••åäiٻ䲰oéeÙp@ûî8Òô¶Ë‘Ÿÿ±,Xnò£îh@üšJ q`Ó^œT¦0#º¥¨Ìí÷ÃËGÖx²ÛV¥™ lì[ŽÚpùÂ.k—õx];Ø"ð^€ÜÜ\ò…¥E8u¦UøÂÒ"ö«6ðF+ÏÛö¸2í5„þ[¡¬ïäpå ØõÚ(n EEÿ`J B²Ÿ¾º`Åë‡1qŒ‹ü̈S)q¸Ó&kL, Dÿ÷‚‘˜j­ÈÿX‡Wf_g†­Ò ³ 1Õ†€åñÊìë÷Pø—1ˆ…_B*f¼Ù¿~c*Ô'?@Lä{ÐétÈÍÍÅOü‹-rx¯34~dé`%£N–ŽcÀ½P7ö |tN8 Ö²lû¦d%Èlýü'¯ØÞ%—…£GïcÆÁ¸{1P7… \›t¤QþReÏä Áã•"lüœžs²²²ˆÜwà‰Ô†…aÑr -× õ•È^åüPåï;ði̺;§ÏùBõ÷Ï%ÛãÆôØÞݯV«QRR‚à.ÄÅá¡MøbëËh½ÅŒƒÒ ´u˜·œ<k.Û¤›Ä•a@Ý^ôoÞæö„näùÙÁ²I5ûJ.ÉÎäŽCù¶qÄ”}Ï׎^I¤«O\ü€íˆÊùòå¨ûÓfTUU±ý·®øXØ»¿ÍÉÈÌÌ$W¶­t8×Àñ~äƒ5Ô¦k©of^Ñh™CÕ5Ì¡êF]nÀ?o°Ègê»8!`¬ë ®Œe}Œûi&6‘Ýwvºã­Óì½IÏDÉém()pÁ?ÓLÜý¯¥¶Æ¥ÈW³–šÌÌLÒø—õ˜³-uuu¨Í~;>GÞöõ§ù(½†å“¢àMö˜ÝÂ… ¾VzR䊭W{𵮓¹O9ÈÌz¥.ïµ Ñ šzfPM=’¹î¨4¸„ëð䉈cÅ 7ZußnmPA fC¢QðQ'›¯þ|¦Dtá^i+bÜòr˜Séªl†&ùr$\Víú^ALLŒ½Û¬H¥R‘aczç÷ÙBƒ=’ËåXµþ0LG߯øñ‰x`Ê*Pk@_Çš®cÁµì}xŠÝûrss™… 2=.# ‰D‚Ú«2(Ä#±÷á)øtÎJlÛ¶ Ã:0G:ßLyà€¦¦&¦½½3ûÐlrü†l%g94jYú¤€ÞÉ}&ÄûsVø2Мá¯Ù×Ìä—4ÀRX³¯™±¼–žžnæÛX\ŽãŸwÃÒeE•«™â—`hŠÆ¹ä3¬ ÿˆXGìm`q›¾#U•ì$ÍÊÊb(~3`îãÏW°åd§YÙ'Ÿ|ŸU›3Ø!AAøã\fº¸ HÚ€óá×6n8y+›ãïÅÔ™½Á¶ºr_F†k6†k6™mˆ@o€*J‚š‹]Ü{¤ï”âoS²ø–ææfNXË娿UÙ? 9ÁZ-kJMNð W×!())··7êêêàïïq§*•ŠlÈøž¼]ô:û*\Â'+V0ÿÈÞˬ5à‘/Þ‡$!r¹ÜÌJ°ä¾‰Œ­xú,jµšñ˜ð<ó ï@RR—YŒ¶ñÕå:LðñÆW—ëP]];þÕL\ÿj&$ þ~Û ×ëñ^~®5ÍÍ͘àÓ¨DgËx JÎXÔþ‘½—Ñ… >øà«û’““ÉôéÓ±5«þƒÖ‘[w%Â'þUÀˆì\ÍÍÍe^=æƒò?H­V3wÿNÏùæ$ã~š¡ l"žº —¢äô6|ôÁŸñZj+R‚®p˜ô%.  ‹RAIbî!ÒÕ_D¡ñðJ¤„JIpÛWX›êOŽ}Ó+ šó{Ô\ìbNÿ #Dbx `3 ¦œ»Æl†*ŠeÞÅG„áh-û»øÔÞÞÎ%„âÀŽrsÍ®•””p™¤±±±œ€àìbØzüyË[ˆõñAYYYŸ£ïiŒ@ii)^zp2þøÖ³„4òŸÒx•+&$¸ãda7&$¸#xηfé¬ëöLAdZ`&Ì”°PnÓ¤Èq–ëÈ¥„…’%i1¨F£ÁãazÜõÈj¬\¹ðøã#ÅÿÜ'~dVßÚYä æq3À‘wrãˆøâÓ˜1cüýý™!HIÒ‡¨š=À&,jp ÏÄÞ‚dœâ¼ñ¬{t:&-y"ӇПêBòŠÍËF¬#ÇæUbþÌ‚žÜŽù×((н|èkgEØßÓƒÀJrµ¬o8lÜpŒŠqÃG«ÊÊüŸuÙnn¯Ù×ÌÐ}„Îý|µy6Su¹ª(‰Ýuðe ?a||{EsÝÈD v=¢ÌW‹Ø ø2Пìð”c”Ø®á"{ ‹†³p椕`‡§\°•JE¾ kÁ”j?”¸`õèj¼0ß^KoÏMñ.Nà­Ó7pèJço¶·&ÒÒÒH||<2331dè ìy®‰¯°¹Ž,3›öM4wãòli*ÜãÇòKèl6âˇã±Òëp—»Àw¤üã$0iÿ‚‚—W0™™™Ä××999\Š[ª@mÌg™Õ™Ñœ¬^Œ]‚‘"༠h ¨\m·/éé餴´ã¯:!Î'jÆ×jµxH¯Ã·ŒN£™Ò²LY…O‹óq×ï¡ Ñ¡Q‘d‹BÙ§þs)àµwahP†þ Ìúæ[üØà…c–¼È®@73þK·‡&«Â}8qã¬ÑSc†ºŠ10‰ÍóoOnÃKò˜þ–,ŽuiZ'änCèÿû¢ý(CUöJ&wã²Þp mg x0l:Wïø£?â™[£àÎØDd:¶i.yN=²w£Úuïz²À®“Áó§D…€ÊÊJäää ­­ Z­Û¶mCee%Þ}÷]»A©dÁ‰®^¹i +tõ¬F0$(È&0Ýøè˜¬Mõ'ãUR$-ŠusËAÿg܃ðÐÿ-!'G]r¹œ ¤ëôBØzü9¾u ÊÊÊ0*JŒ)ÿÝ,ˆÅY²&¿øWí'ß0^åŠ|µŸœ=‡ææfH$H¥RTd%r‚%¦$“ÉÈó“¬Þ“³éSÂBÉk¢²²Ÿ}ö7wvîÜ Xÿ»k6ÛŸ½˜DÜs¦ÝL-À‹ÏíÇE¿E˜1cÆ.AÀd/œ|V8;õ7ŸYà‚·NßÀƒÏ)X!Àë¯ÿ„‘«5ó€ˆudmøHŒÆ ü×?ÜŠz¼ò'7ìuYÌ­ðR%Ú$ƒÄDÆ(Ðs—ÏŠ2“ ß²øaã†~,¿„çG‡pã›*%‡jtfÊïTà¯u¹üû-Ç~¡g;$s‡ _Ý…[ǯB4P„³= ,ôlGB¤'oB½ðe…œŒõtç~íáF´=&Ä{ºcÒOøû» èjÆzº£ØË×jSW©Täá›±ô^oL©öCJЫ fBÀºß_BñE]½ÔifD…„?¾ñ&¾\·RßpõÒÖB8µúRü*¸ò…{ûÿÚYdMá3@pF+ïÅå—°;f ¼N÷ Wå øl@#~Øe c ™ƒÇãã(Œqa°Ë@œbþ–thT$I9WátËË•#H_„º§è“û€ÒµÐ@òöö>a ½ã'‘Hà)ç®GˆŒrAVÓv³=Û* VæÅUTe"V>L‰Db×§)Ž`sŸ5²L«zÁ¹nÔeW°fo%“rîcÏp¨FǬÙ×̼ùJçëWEI°%«ãc°6ÕŸä—4@]Þ;I222ÊÔ“—ŸaV¹ºÁ{Œ+ŽTÄŸcð¨“ãƒÑh¨XÅTe¯dþðê«‚íOzé f›ê<çÛ¡óT)¦•üqó& ª’ÅsvdVZ¼Ó?}¹P(x衇Œ;w»6Û*Î’<ÇêqõÊ|>g:æ‹8KÀLìïŽÑX³¯™¡Ì?t¸Q—둯Ö!oó%|r®û?÷Õa6Çžž÷Ìœ„@1À|s‰å>KJJlFÑ[Ò’û&2÷-YŠèèhìÝÖšgÓÿo‹øùÄsss™£-­f¿«Õj&77—¡îÊüs<ŒŠ¬Dl|[‡ îØø¶5Nл¾q´ÁÊàlZÔCÕ5 ?ÞÞÞ0JHHBBBl2س÷œ)@5ÜG°·ý~Ë oyÀ­v:w¶Ù¶Z­f*?Ù‹?0Æ*ŽlÓÀPÔ8]:/îóµYvMÕ\Lù÷\ÿ· Q*2À˱Amá"lS‡áìNt¨ lúoõ׌L;Ñ@èŠw Zñå±jˆ¥"ˆ¥"TŸºˆQ1nfÌ€3Ï}u)>ÒÁÍ÷7_m-ŒWIí2ÿZ¼w±[>ìÀÎ/«ávßÄê\±Ð³™2Vè‘8a„ö°W4Z†/x‰D»ˆàç"Â@1»ÕÆñÀéÎnÄu´ º*G ‚km¼J q¸+^ßÙ̺¬þ|¨ÓÌŸÖI?=¸­V‹«—`ÓìAæ/‘HÐÞÞÎ4551|ÿ?U ÛÛÛ[n.€}ApÂÞÄc`pâÌ«mÅL?-êäñ6™?éKd2áï1d ?\ÂuhZü žŸÃ™Û¦lYÃfËâvieĈ>1ÀZ0ê«Zrss>L±³´Íu@Ÿ™?Àî1TQëÔ²Ø"•&bÅü@Å"þéõzèt:||îç¢ Øë]˜Ç¯‰°P2oJåxÁ5­Áž‹µcà:6Øåv$œÙŽZìIððâÞÞÇJ^~†é Öb”ˆÁôGÙÈÑÒ3Â&+x©Q¼ë$çHŒл‰9¢ÐÐP|V-A~~>$?^„¯¯/¦NÊÕ¿oŸí¼þÇx’kEz\?ÓÉ<òV6^ËgŸyHP^˯ÆÕ+W¶ÿ‡Q2NÊWëðÞSwá“síØòa3òÕ:›BBo¤ß) ³ÌL«ÕrLŸ~@II‰ÓÇk–Ü7‘³I/}Áߺ¥OBeþ¥¥¬I1##ƒ±Ìˆ°‹–ÏüOÞhÃ'Kïç,' »qòF6¾­Ãx•«M!†KCª„ò)Ø£GYHêøøxµ³.“a­yì瘘ñ~;þ:f ûAâ¸Ïñ—ñ_pBÀšß¿é°í®Û }Õ .&ÀPÔ…§]{ • ¹µ =å¸TMà¥J„4‚ÁÊhL+ù º\Æaþ ×Ñóa8»Ónûƒâ%h9ßÅ}÷éw¹  qÅ¿¶WÙ‚צú“-6ãk]'' ­ëd.˜Œ B½O¨ü¡ê†ñeØ#³Õ5Ì%ƒ‘)þöþy£¤•°>üs׿Ï.1¤Õñk<©ïb¼D"œë6à‘úf¦è*ûL¯h´ÌéÎnÁc‡uõR0î§µZÍ$¯ø‘¡BÀ˜=h}’úÃPp–3µZÍ [' @×õÚYäxÓ5½VA:‡ù÷ R]ªþŽ|uÞ Šg‡Å…Jœi-@¢x¦Õí2™ŒÈVq}hoogBW²û¿g½»wïÆß;ÎFŠzË8ûÜ}eÞ”Ôj5ÓWÍ`µKÆß×z6T^`luDT¸9@ ñ°­}V®f.‹FÄ7·Œ.1x/¿ëËÃp©¼­ï/€—*®£çÛµèê ðg‚ÐN44 y:HYÅdÀWág•¾b@n%Êðk.v1ÕƒŠtàÏYìþAn ß{{OǤ„…’Ên+ÀøöÈD Nê{nI+´ÂÀ7£Ï|\Æ*PSªý¸c‚ý=[NË=÷‚Áî<àkÿ4@œ{&; ‚”J% OlƒÊ8köV2ÉËÏ0köV2~Ÿ]bž™ú< …Í D~ÍÅzÈ‚š8H\¨íüc\œlÊú"x[–íOb/þ»éï{R*•äýÖ¶~çåijjb:.Ö2k{ wÑ2ð‹1½qÔúÈ=_çuîDÌüþö¬J¥’Äzé@q¥'˜ðÆ1Vr~~’gú§¿ Á*K ï1®Ð}éÁÁ@.¼ï9tk‘——Ç]³…*´ôsÖG±ŽXúš¨à`G@Û_²d jjjñãÇ#""‚ l¡ €<((äw1àæUÄø=´|N ç—[œÀZ5>9×ŽŽ›Þ ~ z]]®Çñk"H$ÐñÂç—J¥œ œþïN•ÿ;õ'óÉÛÛÕÕÕãìMúŸ1ÏfÔ2€*þîî`ŒW±L'õÕH$DFFšõ½/ ”oM±õiii$44|ð6mÚ„ˆˆ<÷Üs¨««<õÔS˜>}:7·(y !=ºË¸Ëën̹ÆX‰W®ÿÀù£ÀßwFÿ¡yyy6Ñ>éÿNtÛhw<ñ6ÛçÆº` ®ãîµìܦïH‡º†³;áûô´¾¿:7HÑá>!·vÁ÷é€Ö÷À÷éf±ü¶{îÒÂå'V@l'ô&ø ðç®÷Ü¥Åõ3\¼Kñ‘”JÙû'˜0^%Åoë¹Hÿ°k ÷;½Ç^.‘”°Pbú‰Ý'¾Öu240°/û…N§ífºšpº³¯h´Ì—þ„þo«-%Û»nâã2·«ÿ&Ð~NR*•$Væj Äç_3[ÿÌJ 8 ÊËÃôÎ÷Ù³gC¡P`×®]\}¶ måvCWo@O•¹;²öVàŽ®¿ÅíoÎBK÷gÏèûîç(ÛŸzÅnÙªCÌ/LU¯×£¤½%àÌÿÇ›®qI$Á`&¥RI\ë z½Ÿõ´êà‚kÖ;ôžX/Ž_ÐãùIfÌ°Íøi{÷øÌæ^SyBð (®4•^h¸Þ XžZÐÒÏqáÕ韽TUšÌ&ûÓAÝ\´åmX¯×cùò娩©Avv6–-[†üü|(•J $ –,Yb¾”Ïø [ÛÃ1îúO½e´ì»…¢Ûeݰu,N0qŒŸ{X@‚’ÂÞ1·lûö;æ‚ßøgáùý¶,˜oÕÕÕ\]+DX ¶úÀŸ‹|’H$}^–cÜÔÔÄÐ〔Ôj5óÙ³eþôu œ¼ÑÆY.øA–Ï/Ãi¹™:Ú¸ÚÚÚPSSÃ1ÿƒÙ-ÁÁÁ¨¨¨ÀÖ­[1}út³¶éÑ(`ºñ¶±¸hY ¢yøI¾?õ”íÚ ½jÙ6¿ÿp˜µþi¯‡#ïëÜo–ïßgü³\ìŒïÓ;С.à˜VÀíõ7òuðEoþ {m£Ö€FOöš'#…çX=W´Ôê!ùI¥’Í9ÿÆ1= rôìž1^%E¾Z½¾ z½€ÝRغè^"ÔÚÊüOŠ\ñe a|‘³¾ÿÄžP*= `î†bZC¿j¹ý»6¼<^K½¡|Ë6Ä,_°ü´¼WH ký¸^û”ƒÌæ­¥ÖÛRȽ»öˆ&È*•h¯3—|æ?oÞ<ìÚµËæþ;x† ÇüùuÔÞã-†…Øþc×¶-â?ï0ßÿVÙ¾ÖcëÔßµ¥¼9%=9Óg´ g%˜¾¶}§íÓ²AK?G‡ºWXO² ¥ŸãÊ–ßsŸ´>!æµyóf,[¶Œû¤$‘H—Çúq“’’J¯–¾xgŸÃ9+1ó°3xÒöÚbŠz½±±±°dĶúìˆé[Ž_x°$„prr2ŠÖýÇìYä«ËuÜuþñ þ½üè[Ëg¶×.¿ïTˆÜ¸q#–/_ŽéÓ§ãàÁƒØ¸q£Yyyy8xð ¶nÝjÕÖ'r–¹ýóFG//}G:Ôó ‰_—eèý/)8K€e9~û#VD‡º7ò·[ÁˆqáÕéÜ=†³;Í‚,ùdY–Z¿ÜC pùI.(€.N0áÝBg5zÏOòàî¡gµ'Ëg·,kY‡å¤¿Qa€jÿλÕ^Çàà:Î cK{¦Ä·ÞÙë¿­:ø–`KK}[LœM8jÛ†½P½?ƒýßBöø¶½ÓG¿ âm²@¡ æN‘_û¤ý9¤f{õòëòw:{LΙvøä¨N{9ïmùðl ý5?Z–Û¾};ÒÒÒ••…gŸ}Ön]ý5ÿÙëG_Þƒ-°§(l ²ü{„®S²üÝY«­þ9Ãïôù-ëø2 <<ÝÙ V¦˶ís_úà 9R"úÒ;1»÷çýýF}ßCmÞ˜––Fžžw ÷ÂX^À%mpDüs¨ÿ P„ßH˜ø@>wR¾¯uPt¸þfä¢y%hDz(==„„„ÜQþ€ŒŒŒÿÈÜš9“ÈT±¸öaÀ3* ‹‡@בûÌT´«K@S¢ÚŠ4¦ð.\h–¨é—ê{ff&©­­Emm-ÊÊÊšš €=¾˜‘‘èèh„„„`þüùxä‘G°n Ë>eff’ÇãÊ•+\ Zffæ/¿ü¿™l ©ô·_r.üFwFýá—)¡R¢Š2;";{†/É/r³)4Y€Œ £HVV³qÁ«ßžžw‹ F²G|4±ÿ<âÿrtÄL©T’v½'Ú{b¬Ê8S÷PW¢X{=»òrT{ŒèµWæwOŸÅÖ¬RÇnMWxFEÁÛÛã—,…LÅÆ$¾ò*qŸ™Šîýû0~ÉRDÝFFS«ÕŒ\.ÇÜMß‘7ó  òêÕ«Y˜®7IÆ‘£È8rsy‘÷–ëŽýªpîÐïöúžœœL(ó×h4¸rûÔÊ®]»°k×.ìÞ½O=õBBB Ñh°sçNLœ8©©©ÈÍÍeø'(¡··7’’’@ŠY³f!33³_ *ý%g0ì•onnvX‡Ð¾èlY[§A’““ÉçŸnó¤MOàØ£( ¤>gŸá×JwÒ{óÔ™9LùæÌ÷ÐáäÌ p ×Ù´ì˜ …ßÿÀÉ.`l¤„JIƆQ`%Œ  77—¡÷Ú{€µÌ}ž):Í¡Põ÷ëodM–É;„îiêŒ×ÜüŽûÝR ªwšÔ“øuêÑâÉšnW®ÆÃ{„3Èñ‰jý§Š†*ÊÕau€¼Èú°Ew±™ GÞíÁå„pD%))‰;óßÖÖ†E‹aÞ¼y°…Ç'©TjfªŽÅ¢E‹ Õj¹:CBB~Ö¹K [É‘¼ J¯^0 ™LF D” |€O2™ŒL0PÙmà˜?|RÛj °EkgEÒc£‘ÿÑ¿Ñuæ<ÊL&,I‹áò¼ ‘R©$£]48Û£ÀéK0ýÔy°+L=¸`2:%@PQ£Ñ &&!!!ðööƾ}û°k×.”••Ù=?¯T*Ipp0'èõzTTT˜]Ú·o¼½½f2”ÉdN[ 22بø²‚Œ_²+÷dÁ}f*Æ/YÊݳ=ý~t"jæL˜hV^­V3qãÇ‚Z¿Á9uN^‰Ý»wc÷î݈p]Š––|ûf'ðÁ•B‡{êAa·O´]0QÙ;ÿ‘w{àþáD¸³…¡Ã=Hèpî™’““Ihh(–±S! 9k@HH—ʘ’FÓ r²xñb´¶¶"##ÃL8ˆ‡·7{ü+33µµµx衇œ¦I=m -¶ˆæÍ÷÷÷gúÊ@„HÁàÀÛ{¥J¥"4O¼PÙèèh»ÖºÜÜ\&::ÚìÚ4©'ù¦¦ßÔÔà±Çã,;4ÿ OgèY/Bã‘{;êêêÌ©£çÿ9ÛXwÀÎËàà`L:Õ)Á?--Ðy—––Æ7í?µ :ÛU?FÞ£øf·¦ïÙž@¯'ÆH±~X£Ù½¶Ê(•J¢.»b»&`ð‹ocœÜMÐ `&dee1)¡R’––F.˜Œ¨D0B$æ~vª/èD²—‰f0JKK#(†¹ŒÃ y¯aõ¨Wÿ³šŸì1•ÿ DSsbÀ‚ã(–q“‚KTc¼fÓZÀgþ#‡Å’!.\;T°µRÂB‰Ç˜‘è:s[³Jáéu¹qªhP¡À-ðaƒ£pæX4ØÆ+F”tÝÂ\7OŒvqK£Ñ ++‹)--Emm-’’’P«ÕLpp° ó–Éd$22’…S­­åÆF¯×# €ò¨­­eÔj5SRR[Ì]©T’†•#——‡•Šïín@³fŽ /¾¼‡ÑjµèÞ¿eÈ,0 ]Ý{Ôpa¢+2 ©b1~ÉR,LtÅ;‰g­ÖQFFvíÚ…˜1"t–`Ò¤IÈ8r•†-(:Óƒco¿µ#ßáî§¹`„HŒêA•Ý„]c0ònÖóýE=¾¿Èñ}­ëdÂ,޽ËårøùùÁÇÇ …‚sz{{sÁ|!!!(**âNÀÔÕÕqï ‚n§º€‰'š ¾¾¾P(ðöö†\.G^^ZZZ°aÃ[C €e‚[9[9ÝéÄcÇ6Í%ÙÙÙ\¬Hpp06mÚÔ/…E&“‘ë§N¡ª‚`÷îÝà M|¢îÀ|s¯ËÍEUa­w°Ÿ‚Ÿ\gšÔ“ˆ» ª‚ ª‚`Û7ßp÷Q«ÍJꈞõñ"J=q„(77—Ñjµ¨««ƒR©äžõêÕHOO'©©©±íï¤ýµ©þ„ÎÓ…Ö¡âóÕÈÎÎvX–ZœÄa3pôëö;X½z5ôz=fÏží”0°ïõõÍ(,×c™ßÎ"°ÌïöMQr÷Ø*/—Ë!TÞV™Å‰¾Üù”P)‰ÑiÑUö 7ÿNioa|ü-L“zš¹ŠÍ€Œ £HQâڞϰ›Â“ú ±xøÝiØÜ2ÏÜ+Çò3ì> úŽjkkñÙgŸâââÌ\ ÇŽãr#Ø"ê6*()³›6œÝžŸÀ] Ö¡,ë¯}Þ«(ÑëõdPRR臅ʸ›e2NÓãyšò "̇Á§ŒŒ † º_ë:Sc/}:z¢Á.¸äL}ăQÜ#ǪÙü4ÅF¶…V«µ)XªÕj&á§3ØzµÇª¼Ígçiÿ¦Ænþ‡G2¸r¹ãän(ýº¢Á.‹ÛKÍ€ô•ç˜{š®‚š馰~Õ`xû¯ÀúUƒQX®·:À'Ís µ|à=›³²ºå |UXŠ´Ç†Ú„sí‹dȧ¦¦&&_í\e>–Lˆ ô.à¾ÒªpòÍœ!äL}üÅ.fÁS«Â}MjK@X;+‚änC&$H°ü¯¾œ àŒ@ÐÔÔÄàæwLaÝë8ücŠZÏm$ÏÓìwI'Û<Õþ…Há"â,ë«n0B±]gÎ#æ6à LÇÜššš˜CÕ5L±ºLÐ ÐÔÔÄœíQ¤±nœ*fÍÎ_ë:™³Føt jstîð5G€eF999Üf°ZßÄ °Ì< 11æ1Ô`¹i)•J`u=99™H¥R.ú½°°ÐÌ,®P(¬!Ñ:‚YÝÊöÜØq›Ý[²ìy}ú)”í¹Ñs¾·T¶Xm*[7>ƹ0T*¡®¡5H7K#áîŠÊn4=&t˜L Ð'0×Í“Ó&322˜®Ž„„.ÓfPP™vïíím‹šššJ*++qøðaìÛ·¡½Š‹‹°ÂÀZ.üüülb"¬Mõ'ª( Šó .»‚”P)±•ÿŸR{{;3é¥/˜ÄØh¤¥¥‘äädR'ǾIhnnÞlQx$ºŽêrs!‘HPUAàý°ÕüU«ÕŒV«EUA³LÆÆ€$'C¯dº¤)M­ØÿíX4 ÷î¯L~â 1¦üô-h\Ggy9<£¢““ã”@Ó56™ö;L}ð!T‰sæ±°k™¾ÿÈÈH\?u ·]ÀÆá>¯Íx‚|èO„Ú×ftM@mm-\üÊîøìx@^^æÍ›Ç^“H ÑhðH¶øý›ÃQÙmà„¹\޼G;'vÅ mw¿P=*•Š|3€E¾ä—§¢J¥"–cqyädˆÃf¨™3É·wM©±£¢$è*ûú 1:u"ÂÝß0“pJ{‹+gu €n¾Õ骽ýWõ·wŸ˜KŸ~Ál¨¼Àl¨¼ÀˆBGþ˜¹ib†2!ɧ¢¢¢ßæüw Z9æiùŸRlv¡:ø¹¨%My‡Í0óùðýp–“hU¸™&õ$ë«n0Úׄg§ú"Öà QÖw[(ß#Æh7"wµÒ s7Ž!köV2ùê.œ,¼ ï‹«ÜïËÿêköŒv­Ý•8Ö}[;ð=ð/¨¸¢F»ÞÓ ØC¨¨¥ßŸ’¦Ç[Â%1#¹ÿG1 ©¿‚‚’2οw¿PÒ0ƒ!ìÊ|FˆÄ\YÊpF‹]­6QêïçßÅAZzz:‰Gii©™ùžÞË¿B‚ƒƒ`µiQ—€¥¦¦b×®]\Ö@…Bàà`ddd0 x³,§b£Ggã3‡!vÜÇ Á~ ]1~ÉR¨ÕjfT”(ß¿ŸI|¥ÕRñ$:wIñÏÓÅÜ3yÝ+‚îL–,Y™ý:¤•"Âu©YÛtÍSò‰eþ ,ýèg¬‹ˆ ôññ··78KŸi e|üñÇÑÚÚ Ë ´ÐÐPlÛ¶ 999zœ’’’ —˱{÷näçç›Õµ6ÕŸ¬Mõ'TT—ëajìá°DÖ¦úGî€I/}Ádee1ÁÁÁˆÇŒ3°yóf<¦wêèsÔÌ™¤ª‚u¥øuöjí—¾BÐÑøí=ë­yb.y²¤*/0‡ªkÀšÒ²lSSs¢Í¶™ƒnšB›gSS³fo%óÄÖŸ°vVI •’Üc8f™¯îÂx•V…ûu™c4= W¤Œ_¯L‚^™K!À_ìBÖWÝ`¨‰4Öà …åzŒ ôÀöœV,ÎyÐO€Í×ÿØí«ËÌ“—ŸaRB¥dLm ¨P|ëøßéÿö˜?5[¯²Ú“Ì¥‡«Xpñ°qhÒL0¸¼Ú”ìiÿÀH¥¨ì6Ø š|ñå=Li‰[`ô½Óúÿ1{–íM„ÌùÿK¥r\2ScF»h T*É׺NæL}Î ‚&ÝÚÚZ³$•JE0oÞ÷´´4¢Õj„éÓ§`ýÕ–®:ö–Qú‰qI(>Òa6?Dƒ] ì‚C5:F]®Ç’§~gïU`ßG|<‹¥~àÀh4”” 2>Ñcp“cˆpwåiʸ«± Þò¸ÀÎ?cõÆX}€ë;ª««!ó¸nYÄŠ‚““QUAp·éÑMÀÛÛ›Û0(’_ÈÍÍe„Q×Âĉ°çà-£¢sssK"oké™ôЗxí•9ìG€ûÌT«Ë R©HÔÌ™„&€âü|Î œœLŠóó9í;¯5=ö’|káº×ZÐ]2™K#3MêI¨'P:kd˘€¨ 88ÕÕÕœæG¯èèh³ÍËÖQ;¾¿¢¢ÈË˃2’I/}Á â|í_4ú%ìé&gRåææ2»wïÆ²eË0÷ÆÈÉÉÁÇ·QøìíAåû÷3åû÷3LF³4ÌÐâ)ñŠw›ÉS¢JˆÙ5;n€òýûISzê.ÃÔØceÙ©ËÍÎXÒ—þäY/2ÔUŒK#Š‹‹ñý‚'±«‡Á]'Ä ÷9Õïääd’€ØØXÌúýÜ ™€Õª›e2‡q_ë:™]= çúùƒ¶Ë.óÌÓ£®®ŽC-++ãÖग¾`Ö­['Ì—››Ë477cÑ¢E˜={6"##‰©S§â¾AìÞGµlË÷ °kyß%Äá®8t%âp–ùoÏaã¨ûËÛÛÛ¦ V«™‚R Õßv?ä½^‚RVý8«~leEõÒ¡ã¦7‹ÚH4p•ˆðÀMWL0ðîÚF|RÛÏ–Þ}Z0”J%±;¨)¡RB…Scà¢çõýSüåœÇ%Swÿ«_Á~4‹•\.ÇDïFð­Ž&5÷¯ ÷!4ƒ½æèƒeÆ;{o{{;3MêI踬 ÷!ÿ¬iG³±‡kÇ_ìBš=Ì4©'yvª¯ÍsôkgEuÙ,” À™?.›}ÚÿÌÌLÒøí ž²Tpóägü£>{𝽽'J¯*«cƒ2™Ì켿åsóQÀü:õ¸d0Ú¿”°P¢Šr5ËF5kæ3ÍUˆ¨ùM©™ú›œ 9MêIÆzØÔü…È2{=âc ?Bh@¯ß?))ÉnV@êBàžÐþ°*«R©È£3‡á_ûD[[‚ƒƒqìð#x¦`4àÝûïcV»¿d)Ê Ø#ƒ×>Ì‚···FL[{˜ ܽ¹¹¹Ì›ùB¿Û3?R­†ÆÑy=ÔUÌ î®VûM°n€šš½›2=’ ???ÔÖÖšuKQ€"*„lAaa!§E/Z´>>>())Aaa¡àØén .=g ÕjñcƒîY¹ì}׸< EEEÖ!16ÚaVËÐáäÚu7³kze$My4ðj.v9µÿð‰j÷’¦<»¹ð§I=Ie·õC‡)?}˽3j±×omÆäå_â°ß 477`ˆ¾ß~c=Ü1¨¦ÞáÒ±‹ŽŽ†B¡@mm-¼½½QWW×§,”Ïúx‘]= -Z„ñŸïtº}>c§î#þ©:'+++‰%š&¿|]]ç˜:u*Š‹‹QµÿÛÀj½8–YQ)ª··7¾yâpWĉ]Ql4ÀXeÀ7†s Ü^ <|ó"¢Ø=91FŠ×w6 fDM •ŠîÊwqQ·)»¶õAìɾqr7a ¥C5:¦æbs¨FÇ8Ãü©ï`]ýeþ|T´ŠŠ œhŒŠŠ +íI¨ÜÚYÄXÙˆ”P)9k4`U¸Q*•„Æ ”tHa+»™Pº\ú¿å5úŽË4©'ÙqÃ"Å@(•JbjìAJ¨”Pa`L ‡Ã$:%Rœ ñû­,ŠÛíq }=4j©­­5c®6û?à›žNT™K)w¬È’(Sç?¯%F7=`+À¬™#þçSÁ)ÖÚàÈ‚CÍËô8 ŸJØ+Êe6|*++ƒF£ARRR¿sPP“ =Êf‹222˜ÒÒR³ :77—)--´>ÐM@.—Ã3*Š3/LtÅÝÿ³¸××ãijl>€ýû̘?­‡®âÛ¾qºV¾^óòZC1ÿëiÀèÑ_þz·Çüs-~ïÞ½¨««3ÓÈ***ÐÖÖÆ1Ëx €ßI“&qߣ££ñÒK/áØ±cóŸ4i|||pãÆ ;vÌæ3”•©¹v Çe †Þã|`/M Õ«W£¨¨ñññµŸ••Å\?¹ß}¼ R©R©”»ÆŸ“›7o¶:Æ›œœLh,@pp0¶oߎM›6!-- ¥¥¥ÐåîµI£¤V«>ó7VPÌs›Ûsƒóï¡Ì¿°ÜvÜ%Ut·ßä¶³ÖdScŽ0Ý8Âts PB5+€2~TÈår3„GK´@zl?¿øÇ¬bbbÐÜÜŒeË–qÇ-)..Φ<ôžäÞHþ]a‚^¯GKcÊÊÔДP©ÍùçÆÃ+qèõ¿#''MMMÌõ“{Ðxx¥C, j1¥ÔÞÞÎ\2qUÄnðÀƒQ¿-<ðÇM¯×£ªÂ1ÿ‡Í á‘ :ËËô-k¥R©4Kœ4ÔUŒ¥ž8ÝÕ#ºN§êhhh0 ‰‰1~Éö•J%I •’ó—»Ðé§€N§Css3d29¹‹{ÿJ¥’äääX ¢Çë½p¼ÞËŒñûûû3íííLnn.s¼Þ ±±±\  ­ Ì” ÖMk¬2w—ŠÃ]Í;[DÄùÌ¿ T‡„(‰`yê– b×ðå‘“ñí]Sà*aÙû¦—GNÆ7 +`Sÿ?À²I)ÿèÓYY[mó¡b…¶×w{õXnRBå-¡*éwjbº‡ß®-”,{0¬ü{-ßßþÛ‹0¶õLü>$ŽóF´HÄ¥¢ä?³^¯ÇË/>„‘•EÛ¾O94 H#gj»o‰ ¤DAÍ]üòkæ§™Õh4ÈÉÉá’x½~zj‚æ÷1,,LðÌ?¿¯ôn*•J’À™­ÛÚÚÌÌÖ;Ÿù e.ô»J¥"Ýœï?³€Ý<Ž>ýFE‰‘½g1bÇ}Œ§Þæò¸××sJô¦®8ˆ$ßÄ<õ4¦ ¹‹ëãÜMßz=ÆEdõ|ÔtLµ¾&F§5:nš ­­ :–ãciº÷óóCK ‹s¿qãFn.._¾¡¡¡(..Æ{ï½gV?½gÑ¢Eˆ‹‹CMM ¶nÝ*¸žSB¥ä¼hZ󸲛(%16[?øÊlþðß-ÀúS—<õ;””á£ìØ>?9‰±ÑøÃ–ï¢1jdñdpýÔ)³çzÍøü@?Ë:ôz½™¹ß’¨+èöùí7¸öù} õ*Ú‹Ÿßr˜çÂV›íÎZß¡( ¡¡såPa|×®]ˆŒŒ…ÑZ_wÒ¾­ò|¢'2:ýVuÑþÏ›7qqqHKK³Ú‡iÝze÷~ù.þûóëÔ#ÂÝ'E®X2ÄâpWì<Ôʵïh=[4få)}RËŽó]°J¥’x hãÖ$ AÜ)A'éUFLšŽ®²o0*J‚SÚ[è©’Z BdñÛ{K¦öKÃ8öŠUH€2í8SçÂ‰Þ |&ÐÿþóPYgÞää»-b™öG¬’—’|kÐyϬJéx䥗àV[‹Þ‰îÎ0k‡Ž?ÀFÍÓ±§D74JT@ ÂßìKúña€Úµ” IDAT`ùòå˜>}:<È}nݺ{溲²555˜>}:—½‘Oyyy\Ù;w Æa¤„J eÞB‚(Ÿì1r!A~q¢/öȱ-¨ZÊ|…˜7?úžˆg¹~ùLšÖQ—› ÀšùÓ²¶Ú§ŒË²}~?ì)0–÷ õ_#‹Ç##{çŽV«åÖ¿}ÿövÁ›þ´/Ô>9³ÿÛ;[ ˜è½×O²Rt(ñcªœá–ÏÏ/o¯gß?ÿ·ACŽaœÜ ÙZ™ÿCþŸ€ßÜ_æýk þNþŸ³}[>1K²µñêõzVÛGo €³ý§Ï?uêT( h4.ˆÇQ?”J%¡ N`Ú€YalÕ/t’e4¿J¥"±›ß@ɲç­ü„Q3g ÔÈmä¶Þ¿¥Pç3þYüíAÎ:ÀïcŒNkæ#´m@Žˆ&U¡Qü7nÜ€¦OŸŽˆˆ¦²²’$%%!//IIIf}ËËË Ø¢Á[¶‚¸~êÏ^àŒÕß²–B‚·3ýèï³óód­Ag¨¾´/TG0!²·ÎY ?G?îD²`¼bLœ û@«ýzm°Ðh{÷ó}Çvù~£_ÙŠqùoôå7bÉ ¨ÿy !F‘Y3Gpô;ýüOô£¿™T£þÑÿäñ槤¶y À’Éó! ø³üžûçäÑïwÜëßè7ú¥æîèó7úe)%,”ô5ŸÈš>SwalŒ;÷€û\öWœún9õÝ8N@ø¥ú‘––F233›—fÏðýEÇ!&&æW%¨T*:܃˛Ãÿ´¼N˜îw+€2óô?Œ»X1w!iüPu ÿÞÞÞÎ''#++ €cŸôoôý7Iˆ¹K¥R3ÿýN?ÿ§¹‰þ'Ò¯Yó§ä7’u›|û§K»¹?J' ô8YÀ*Cccܱì¯>ÈØ0ŠÃÖŸõÙ¨O½¶¶äÖÓ¿úqûOPƆÀ_l222˜þžú9‰2wµZÍÈ}ØTìÉÉÉ„&jkkƒÜg$ÚÚÚ0zÆ=IJ¬•Àgæ‰#;0Jì‚•#ˆ¥ @‰^_èéfYÖ~ú)²²²ìæ°¶G£=ÜÈh7³N;‹èôýß&¯á!D6ÜŒžqùÓú(b9ùùDý¬|¦¯Ó±Ñ³4¶&F¡×•ä÷w‚ÁÛ "ô?Û=ã2êoñ5G÷ËÏ*AJX(ù5 «<à-»Šså½GùÁ·ß)°ùí8]ÚÍ}Ξón¿sRØ¢¬¬,F£Ñ`Çθÿ5û¤-MÞ–öMáê X}óŽ,¿´áç ¹ÏHho°Ù%Õj5¹\Î;ÓÏèèhVš¸kjµš©¹ØÅ˜ t‘»àõÍ0þ`DâÈ+k€å'dvÞ2ûN±”ÓÒÒЮ÷tÊ ššÊA6N“z’™ÓB0sZd2Q©T$==¼¬¸ê¨3zí•9} ¶¤Ÿ{‘þ_$¥RI¢fÎ$xõU§Ç2==ðÿÝ/îF(Ó8Æ“0¸‚aQCçJÙÜZ%( P¦O™<ÍÁ öû fÏžÍ%ÿ¡‚,_P°E)a¡¤åñ¡‚U?; ÞÎ2þAåÀ½¸÷+D¬cÑ-ï=FÂgopº/C’QH¼Ç¸ÂÇg>íœOHÏ©>=ËË 9Y1‚hž°ŸC0W,RÂBÉ(± 5Fà×(Ü{ï|ðs¶}Š rëøø_üÔÕ³«çÊhk GÊŒð–]E[û´µá~ãÎy:s6ÜYÊÊÊbŠŠŠðÚ†VÜ©;€Ÿ¦¿uüLÔYM>%TJhö»såzœ+×#J$Æ4©§Ô4©§CtHGm'''{iÅÿSÄ×üU*¹rå —L,(([C«Õ¢ÊD¬Ž9‹s~JX(a‹&ÄÅ=r„½ÅVÈ·Pß½¶ÐÓd2i7„pG° Ž„€ã=ÇJ¯–xÎIIIˆ‹‹Ã“EÎ%¤ 4üž9ضmÛùkš››û]öµWæ;)Ü™oïîé÷û×¼£ö¾¶©ßí+•J¢‘Å£ª‚à\‰5x%Ñg‹‹C\\–-[†›ÍÀ1ždàOâ.w‡ü*ÇôÝå.¸zÅøé\é-œ+½…Q1nfæ0jΧÇ~d/`öìÙPzD]]vî܉¢¢"îwN'(¤„…ŠH§ŠrÅÙ(LH€¶öÙä+›A0NOænúŽÌÝô)í1Ù/ï“Æ2þ›¡@w!Ä7·³ß< t¢êb<œdÃ݈«lºZz5Ú’‚óøÛwÏôœ²kM¡ô²BNÿÁëê‚SçËѶ9áÀDÿ(± 6Ô߃@Pö“ ¥ejno¡Gí¯AÆ«<°4- ³ž>‹¾ /´úg‹I{ßÞJiÔ»··7$WNsÖ€A +,^¼111f0ÇÀí£ÕÂÎ;fK•{ýLKK#éé鄚þëêêðÔ"Ì/FzzºÓ0Æ–í욈ŒŒ웳”±!ôE Z¼-M>==å8T£c<'õBU‰Q|¤Ã* r܃^z %QØçììl»V„Å‹ƒäˆ~‹ŒÿäôQÈ`ú?M¥O)::š›{46@˜KߣÄ. ÜB0Õ|øË2â{\0Ö•]¼ÁÉÉ¡ÝÀfZª¿UDWöl¯½ID™{\\-ZÄá9G>óâââ°iÓ&<þøãNXrr2ñ®Í†B¡@]],3°9Cjµš™:uª x„3Ôuæ<ÿybŠèÍ-]TÄž î« ch¿Š¼úÔ&¬ÉÉÉäèk›È%_ ½ÑŠœÇí³  ‘Å蟃¹óã쑽y¸kkkÑÚÚŠÖÖVœ8q3fÌ@HH233­,]Ú!èÖö`ÈmÜù«W®`HP÷^ãž+½…³~°ê‹^¯ÇSÒalù8qâDï3h4عs'J…~À`JX(Q¼½±3 <ëÎÎå“…z ÿCá¿@ [Z(ãVaîôÓ8§fsÿ¿þúq”ö˜ˆP:W%ÙÀ2ûpO€Q<æ¶tî ßÜŽª‹ñ6× R©$²ánÄ]îoÒ #{¶M1úÙ­âã/[ù)}èO^VÈIüŒuuÁXwWŒ…“„¶ÍDóÄ\b/À¸ôÚŽù3ˆ¾‹5RŠ¢þ“ËH„‹» ckgEpõSÀ¬¥ia0ä¿ÒsŠ8JG*%kgEc›æ’—>…ÄØh¼¸ô)\þ× h¼ºkgEÙ3|͂ӥÝð–]åÌ­¦ÆŒÙŠk\nˆââbÄÅÅ!8P¹\ÎÅ èõzÀuÚõžh×{¢IC`™y³ººÚîþSWW‡ÒÒR<µÈ„´´4.ö‹+}…Brëi3p5[dyr‹fb…^¯w:ø5%TJhvÉ“Ýp|äŒG‡jtŒ{¤L=8W®GöV†_Þ–æ={†/¡÷QüÑ`¸Gš»§)P”Q^Q\\ŒsåzÉ3bXØÓfûnzz:)..vÛ ;;›X"Z:KüÓtB±trŸ‘féÄ)ƒ¿r{¯ã Wx µ0TêÞPyû?qd¶ç´rˆG‰NtAÁy–‘œ3²ƒÇ×þW c¤Ðt•üDízOˆ‡–|gÈ";;›lÚ´ .Dmm-*ÞÙ†“"W,Z´È!‹Û4—´…ÌFNNNœ8ôôt>|¸OÀ d¥/@”hÄï¹r#<9/¾¼‡™5sÙ»ÿ‚Óu¥¦¦~ö¬´´4â .9ÀúÁýFºà>•>ZUÎÀýëF’Ë¥\>hÍ)%''“—œŒK>lò“€Ü£¸{ÍZôõܵ8l16ˆ3˜;?ÇÞ~ÛîàÈÈHÄÄÄpÙüø©:}}}1qâD8p8@¥RInÂC~õÿ³÷åaQ÷þŸ3̰3 ,ÙDöÅeP"F'&-–DÅÄ´Móó’6½æ&Mr©ÍÒÔl5Þ$7i½1µµ6mbŠYjjn1uA•aS › ŠÂ ðÌ0ïïÃûræ0šô.Ïý>3gλž÷¼ßïûÝ>ˆMH`€»ÿÆj“ÛdB·Ü^Ž“G·C©T",,ŒÙÒ"""°aÃìÞ½6l…Šu•’¢D.Õâæ%Á8zÜŠ›—C±ä.ØŽÿ Xr½üè~vÊy.b¶Ì-Cfì«N—sµE€z}rµE¨ØõºS69žç‰Ñö] ¡X`úìò…SÏÁ~ öMÈL®ÆyƒÞe&ºØ[”dÜ4áü”s1;Çêy×>…☷$PP”ƒßþ›ƒ§lN‚Ô“j²8(5¡ÂºY¬˜Ê+°8@YjN46°k'm¨·O ÅA)ã`¿šF;AŽœÃn²œÞ²CÅ!_£EA|Ïî}Òi «”AdA‚Àø™2ØZPdÊXšÔGÊÒpóaý寮MKWMO›ZMô†N†(ê*}õÒ¢¼ôšéƒ‰ È»C‘/ø†tt)qn`ßÑ«ÎÀàà Ö®]‹ºº:lܸ[·ne÷îûàìP—-°M™7UÁ#‚é4X$išjº&=í”YѵKß§—ž¿†ûìÀ®Ày ëVÏ"‹´!8¼µ²?8z'ÐM; ŠóÙ!»KBË•?%Qáã¢ÍΉ£/]šÑ“¾jÖjttt°”àuuu=EÚÔè‡ñÙ!; <ò f·yófÔÔÔ8ƒùJ*•ŠDEE1Ó¤§yƒçIOþÀ!(/ežýû[ÏsOee¢!Ýàñ+^ï}pp0~M O—c‘Üôr§¨€\¹>JÏDKÁ·Ð„ÃÆ¾i4ÛR R´yˆ!©$UI´š¼òy7–G;|F‚OÈúõëã ¹ÆgÂüÅýº^!à¥î&5z*ÞÛˆmÛªP£7À›PVVFÑÙÙ FÃ^VzÝ—1̽3\mžëÇa3÷ f(Ã'aêò¢<¢OJE·n¥×<èR’§­&æjå¯b~Á_„¨½÷þl1Þ~â — 8** ‰‰‰lã0M yÀ7!€’ß%µÇìo‘7Ý„+'N81@÷Ù°a`÷îݦR KC7ͦ€¦ú?z\ (ãQ,¹ -‚íØ¿: ³%ðŸ'ØïŸdš0€ 3gB€ÿ<ÈCÂ.ÿ3€—…ga?%ÜëFpb"G1+'ɉù ô±ÏT8s|ÔIX¥ "? ÅÉ‘1ˆ…`J 'm —{±7,R8Õ÷f±Sÿ§Ç øsx8Á¯wŽãô8AÁ­B&Åßÿg 4sdø[Ë”F马 RoŸ€ãR7d1~Œ×|z‘}§ÂÀ¾ßå9 t¯¡¿»cþUµ§ï;ª®/T#y2ŸÚ 9&“ /•:ðê -º5C œTÅtmÝ~K?ÊŸªwZ?FÓÀÖã’ù³ç3IîöPñIUš{?""ªOñéÓ7ó,5ÔÖÖz<ÄS'ñ$…œäÌ ÄþóŽ2×ÏÙYÊnOBŒpL̬¦‰‹6!¹ Å ª~Úþ"mvléuËü© R©ˆ8k'íçºÕ³ˆ;DJ<Ïš˜ìСCSŒ»+L=soÌ_Œ )fþbé3DX%i©äÇyBcǬg*°ã¸ V«{¿Šã V,ò÷GÐwnÁë»ê¦9íP)¾ÅA˜Ä"&_µ”´Z-9þŠ ŠÂ@üôéå3Òèt:ò³•‘ØcŸÀÒ¨•˜5k®]»ÆàQ}©CÜ ï¨Ñh<.ZW´¥4‹.œ4ÊË‹À)öy ; }Ò^̽SPÍwuÂ_í…*˵þÈædxî÷øM#÷*€ÎÌéÒ¥x衇f6w¡wy ‡Ìl àCN¢_%œœ¥'P*éRæOIª HrzvZ>ÿkPû¹<ùp©ö§š‡sÆoÀÜõoˆŠŠBXXÆâãe6;i^~ùe&˜ìٳǩ«ÕŠÇVÆa©V`Çô£LÀ´˜&àèq+t¿*öЭ@¸ ؈Õö™É‚é'W[„w?Z ŒŸ:åKµÜS¬.yèZõ u×éW`qæZ'á2‚¨ŒˆTÇ"l¡}à.ÎI‚¼%ŒùÓ9]¥ "ySjV*,º†šÐYNœ³¡º§oɃ T*Ñ֗͘?%Êü«û&prLdOÈ¢8. §Ø.ÓG0 ¥Ý`ƒã’»AB"êmÂgÊÌ—jLôí¨º«ÕŠèHÁQôÞ¼y¦˜¿˜é¿}æ ïŠ?‚ƒƒ¡T ŽlÁ§_D LÕƒŽ.%óWúÃÏ6`ßïòpô¸?zË @`(a*á¤/}yž'FÓvP’’§}“jÕáK¦ã,ÁÙ Îáj *éZürÄ틳KzÚÃÅNwf|€[¥ "âÌ”ûÏ[8_Âo©# -«Ìü²ýÝj"¶=OjôÃìwWȰ3I…ß}÷¡®®NæB_Iœ]Õ!À•i‡ T ¼ƒ$vŠP,¼€€¾¶°ÃÆ%&}>² 'máÓ˜? ˜¨mކIQûÿTå±È‘s0[ƒ¼†jµZ’€ÿÒïÄbÑ¢Eؼy³Ïù•••Ü/?¿‚lŽÃÒ¥K‘••uCÌŸÒLœ>á¥48=%„i¬»{‡Ïei_iû«W¯vrrG£'M¸Ú8QS,Ö%cn¾.UâÚQ¤‡‡y-OéÃü€ þ€õë×ûîz'z=0T²È›nB„¹Ú¥úYjÛ¢L¶®®Ž1{úï޽سgS.xúr$`Ì$0 )ó„(WÝmjjšÆüçÉó„ñé¿¿¿ÅÅŬ]Êü©Ý?¯a°},ˆ}û=n˜ÿÏNqâ(ó/IUzr—͉5P¯­Å½¡Çô£ÐjðHYŽéGqL?Šgö5sF£‘ FßÕ[T AU­Uµ¼}æÞ>s FäÎî»m…œ1‹ÅÂ|’SïMg¼uëVôª3°ä±QütŸ aaaì¶8?€E HÉó§ëÌ•/Ïó¤êÄ >¯¼„àÀ¬þ“uc0 GƼ:˜„u’’ÂÐ)¯—¼ùdûã¬ÃÎìù3¡UÊ tköŸ·pâò¾0Ñ€lf:{?u ôd†(ª‹ù”——“uëÖáÁDEE‹"›IJ^1ó§÷…hâ}Ñóó)Jb•bb"…k“aƒ¦F8U:ÓoÆ©d‚…íÂÏË¿†ª: Þ8#tÈ“ŽÒÒÞÕ9¥ö·¥à[Á øÄtªà·$eþTZ)..FMM sü0 ^5:ŽÜ¶b6òýdxðw6ø_ÿú×Û°i¨ e&Déš ¢‘É@Oÿ”|1ˆI¬ ð¦} ªpU‚ U,FOš0¢Äì?Œž41õ¶·ù+//'ß踈¿'&!%%q•ŸC{ñ<êKïÁÊŸnö¸õçbõzȃßCNV äÝ¡8cž‹‘2.©ª‹¢æUTT^ªJ«««CSS“G?‚áaãã 0…yó“œÜü)Jbû݃æÏgJGŽay¤h„Ëùhhç LSoèÄá>™Ó5±6€2Wã§dyQ8ÍÏþ3äW¿‹Tç z—HnÒ90ÚGY^!ÀécÞfÈL®FKÅSΧJ‘£HºC;±Zä±^(œ(Äšiù›6Pm ŽÊxÈŸ ûÿóÍg§ùP¨¹[˜&€ší&ò€é'O±êú_âôÃzû´óì9P¿ 1@¸ÿJ¥™œ‘i á´ßwÅ™qEG޳Ó? „ƒRmçJÝfX±b¤2 N1‹Põ¸Ü¦=L¥IKKÞ={¦ígRP¯¢›ÂÐÑ¥Db¼… ‰ñ¦%ÀÐ2ÝßHÉ`±:žçy²´p‹´!øíï¯à|û¨×=liá8ŽUOÍ=-ÿêv›W&,=ÉK}¼Qyy9¡X"bSd]]Oû¿X(ÊÎξ.³1­g&Zñᘞîg!€“&@¯×OÚ²6ŠØ[lXä?õN%,’ YUc(êí.…ñË(F® Þ?]ã]àÕ—¦ZЉ[²d :;;ÑÚÚÊlE˜=bµ'In‚¼;”½\?[‰ ³Và¯^.\ÀÌ{÷îÅÕÐnÈ»C¡¸°Ç aö°qP¦àÎŽ2mK³ˆÁá@}ƒ]üã-X¤Õ Fo@G—´oŒxíÚµ¤³³“i–-[6MÐét„ª;º”è = s'§ÿ)¯n|1¨?‰ÛÑ¥œ6vºhè‚±Ç á¶´;±r¶À¶~ö9òóó‘’’â¤M—¥ã²Ç ~$ô3ÓÁÁA(süœÆ.Ý´¨/€«„;׊!S¡LL,Ðß•J¥S»ÅÅÅœ¿´/î8%)šœÔùŒÖ!Jž’+ Š'bö嘷`š€´ÿóVÐËRgIw +®ÆO‘ÅNÄp¿}\Ô´3M)N=œÅB ˜¨V Ëð!'½ÂØ.v€úyC’×!Fû£ã3z)º¡xÆÅÅáîÕ6œ¬cB€F£Á ˜V¬Xþþ~˜޳‹ó˜€«þHû@¿SZ·nÓ^àJpHKKcÌßÝ^#mëFùÄõIûë«Ýœšcrç3‡?_ûšHrç3æO… ÀàQyê·ÑÖÖÆIëô…(óþ¯È*ö£Óét¤²²Òi_§ÿœ)Q @žŸpÚ^äïϘÿñ+ÞnÂ÷RÕ¾À)tdrÓ’F@Ëœ\gHKŠ×øå¨KD@ÀIvåÀ!4,\ ÂJ§Ìüjh·K[°¸.© €}wõ"‰¥/Z61Þ‚v2ŋָù!paÞ©­w)|ˆ¥6ZÕ„ 'F*í3ÝX¨=rq~NÖ±ÿtsr71÷ÄÈÝ•A<ñ³‘–•n¾nÚ×C,Õ¯‹“,ý]ÊØÅBý,}¹o Îd­øtiåWx=ù{kƒú_pªëFÈ\•÷ö ] ž˜™Â@¼lÊæïª}©u=p¶€óó– ‹í²ôwZþÑMÑ,´¯£K ú>ÒwpvÎ;ºë“»9bs#‰Bq5ï®Þ9_æAÚ¾/$Bf¼¥BðLúÀó< tŠ D… 8VíïÑxiá8*>¼ÆI"o[!g3þQ$Þ{Åÿ¥¿S@|ÝD™¿ãR7š'mu÷¦þë=Sxás¦Ô¹û[ÏOÛ¸úU…ÈÌæ¦aS€š¤á,ñ@ÅL‡Ún¤jw/…«‰<Ÿö¥å@*@ˆOÀîTðî„oŒW\^,íK¿ûÒWcñÖîWEâuôuKÍ3‘Ì¥ŒÞÕ Tü»XHøGõÑ×úègO›à_Ey)}Xðâòžž±§2´m±@LôÄ?hŽuºîÎà­MÀØ•P2“:]çFÖݼÇ׳†¤ÎrRGEo}¡åo[!gרñuF¾*JM$çÛG9é!Ø4Ðè”#À]Y·%_Ô8ÞÔ Þ˜¿´žÿŽí|‘´}•ÆgzïÿÑú¯Pûýo¡¯‚ùüWͽ«D-qqqÐëõœ+À™2Oô?yßüªèF4b €Ø÷àÂ|R>‘šH<1|oZ‚D’’BhzAwÿ¥e¼Ýãé:%WЗk×SÎ݉Á—º’Ò3±iµZ’¤“Ôä@270™$)ä,Kýó¥éoâÿZ­–H¯»*'mSzÍS»ÿ(sÝó„þÍwàzÈ]D Å Þ€ˆ¾.*IUúœï¸1|óÿN°¨ÿé¿ëü]oöÓ¯›þýz:3œ¸úüî‡'ò¶n>¹;–|rw¬Ç{dÀÔf¦ÏGºAÁq«ÃsœT Nù‡'£ÿ Ç Åÿéï´-ZeJª©tµ%i©Ã*T;á‚TVº&ƒ13i:Vñ5•JEh]bi޶%fŠ%i©D©TB«Õ:a'©ÛiRúj¢ÕjI–ŒCRújÒÚÚŠ‘ÙHëã0?¾j?øÁkP*•(l‰s“Ijr áyžÌ Lvi;MNaªDž¼ÙµZ-2‹‰¯KÉ“¡T*œ­tÌ[ïñš2Õ]O·ÞC>¹[s]íÜzùµ¶PW™ã4f* |ñ÷Ùx¹pêëÆ‘·:TýaWL3°ºQÚ²6Š8z'PóÙO÷kµZ"M3Sú¯Þ ¿ï_'­M䤣 IDAT_¿þënbÆ4“Œ£Rk<Ä{õWE?þøu•+//÷ùy>×2À=N®~7‰<×20£y¸ÞñÏ´œ§wöéÌp⟀o¾ý-· ÈR“‰i ¥k2œwÁI( ×S“Éàà Br˜Ïµ5Ę΂pqÈäŒ \».Ž9Ìð‹‡i QpZ›2(3Gìo=ϨBaiœ€=ny«Ó‰=ö<´Z-É[NÚ A\Ü”/ 0uir¢•:!,Èjµ:AŠÒûŒF#G…ý­ç¹ ¿¨Õj\ŠÃw=O®Åa^ÜVe®!óâ†=Î `^Ü.LÚ僃ƒ™@¡ì#ÈôW >Þ—{q¸O† «ý˜Ÿ CHªPŒ† 3á‡:é„&§hNº»»1¢D4œÄ\Í|Âçá%†ÚÛ<:o _¾ÌÐìýW˜#ÙeÑu_0í‹ 4¸Q! ¨@ƒ¼Õé3:+fáÀú»ÈþÜì·]UkÀOŸ|ÛóÔ_¸=Oý…Û°À€ ¨;åÀ½/¾èòÞ_$—U*èt:2Ímç­N÷hž©ª5 ú±pÅÔƒ‘x#‚ºxÄÞ¢œñx®gþKR•¤æ³!üÍ2ÂýÍ2Â΋+ºžWbª¬¬ähÄ„´/ô³§MÈU¥›¡ô·mÏçz¬o&m»£+VÌ(ÿ%±™/(¨îÈÓx£_¬+%·ÞCn½‡üb]éŒÊVTT0æ¯ÓéˆN§›¯:1ÈžQÕ áðRQQ1 ”È{îédîé¬ýòòròòË/û<yÚj"O[Mxž'ýýýسgGaµ¬¬Œ\¾|™á¼vzHŒARVVFh”‡”|?%:ÒrâýY:WeeeÄS‡çZ¸¿ÿq?ÏÝO —’’B8Ò¡á0,-G}ƒ¹óƒQ/BK"œÀl•9~nè`ß9Òóí£eh29Î:ì,¡§ïgvdøÅãìDû]Jø¨wvÞêt2ÜÐuxóH€dŽC;!,T‰:_………!ÆlB­yJ¥™2µæ!„ZЫÒ¬vwwÃh4ry«Ó‰8ÔI«Õ’èáx4;dËpºÉF ƒAe‡„³@gphvdÉ8ü­åŽçy’jDœÜóüåEÊ0`´£#‚`°ÇÕdèJ&ƒÙáÝ”A ƒR©DÃÄÿÅ=YªCím\hr jo›G Äb§TzŒíõ–³¥4‹¼}æ‚׸]1å­N'bÏúØ[”¤0,털Œ¿wGŸÜ­!„KÇÄÙf”Ô7ݰî¥î&?ýSî½WŽÞÊJ—±¹÷¾ø"ñokà ó<Ìø—Âo|BÈ–&1Û϶”fihß–Ò,RT ÁÒ"!豪ZTÕ\†º¢-¥Y$h­—¸;Úö|.Ù±¥ mv®tMYœåM¨ÜnvksÖjµD*ˆÇäj|®H§Ó‘üü|– I§Ó‘¦¦&ü0\pŠóvŠ¢ý-ªž½Ï¹óå,‚…öÛó¹DüÝ]_fÒ¶¸\ee%'-ï¸âÀ ý&uHËú’½M\V~8—TþG?Ž4ÐÏ_º ‡^>ݦÝ/£IBCq¦qcþ4t‚š29#,ì;ý ?½Ÿ ”èu¸7WŘ¿:<‡•çyž”®É`üâScÈ|AÍA=áéä@ÑMBßF#Ó@#zUjX­VdrFôªÔ(P…¢W³ ¦FvZ—w‡²…¼*S8ñ5;”Y¬ç`Þ¤À1/n gyN>î˜T0Ì‹B_Hk»Ûf‡Ùá€,RxAnOFž\1ùC‡’T%™˜Lxž'çÛG¹á©°#)Ó¶81~Êü©ÿF£‘³Z­ “uZ‡f ñ›îNª/]“A\%B¦£…‰IªêîùÂÂíûà,wæÃs\6'ÃúžO§ˆo½gàŠ÷þ… ¾'bMÀ“jB1æ=Võ,AÖ³„šU~úä{ÜKßk„Ìq÷}ò¬Ë“ÇÛO<Á§¤ ¥â)Îd2!äËe6# « :ŽP]©óÌ3ûš9ºÑ¦«o°áõ]u¸ëþ7q¬ªK‹ f¬Q9mƒ7ä@1­R‘£hÇÆg„¬c”AZN83Ë7*9žÕj57iKi–×S¶˜*++¹7ß|“¶;¿¬Bvv6ÎØm8c·A«Õ’²²2·Z˜}œåNÖ¡$-•ìT8nìa©l³ÎöaKi)IKõÊüKR•Äd2¡¸¸Øç¶)mܸåååDÚ÷3£ãx2Bí¶|YY î< •JEÖ¯_ÏÌmXÛžP4+++¹””ö>nÛ¶‹ˆˆ€qx1Ú å” Ié« EÃô4jâ[»v-9¦Öayy¹×²[ÖFóKédóæÍÐétäÉ5©ùl‰ƒã¶ö'QóÙŠ‹‹±}ûv·'÷°:G&O§cÿ™wàŸç´ç¸Òƒ MN!¿Ÿgíï°âСChnnöª9ÐétDž¶š<׸„•Wö/(..FHÛnìÞ½›%øqE«?ÿýýý°•ý¶²aÙ²eð{d1àêw“ÈŸ’‚\:ÛíÚµ‹ëèè@GG‡Ûñ»{Òy[8«?þ8ª««YG@Xkž˜?l)ýºŽÀŠGgãùKwÁv¢Ö%óUÕ‰¾¾Á uxÓ˜¡ÑÌEí-‹ÞÏ‘nèõzŽªÚÆšÆÑ«Î˜:ñs1ÈöÇXÓ8²ý¡Œ·ëÍÈÉ‘!“C¯×st T¡¨ûD3´ÇžgKæ8!nòÚpC’9U'™í_¯×s~ñˆ1›…Ã}2ĘMèU©™V Ã/µæ!”¤¥’îî©Íªî·4dp¼¤‚½±EBNƒ\E‡ ùB\V©¦OdŒÔ×8–@i‘¿?Ʋ8X¢9¨d2´Fv¡¡+ŠØ&| µ·qÃ!J§4½T4éáa›4ð<ϛ؞b± X>A2I~#îÖ‡O¿ú®øO;½P qü1¥¼Õé¤ç ÷ù¾ËŸªçýº§mÇ}f*ºŸâ‚ï Àõwx¡ßĽ%Âï® bš0ÉðC“Sí  ùç’AÈæ8|þòa—Ï)¢k³²²’£‰3B¾ü:Υ꿪֪n¥¹ãµóx¸,UµÞüwëæw9_NÒ%©JRóéEœí–µQD ­êŽšÇlØÞ¬öçsIéš r²n 'ëÆPº&ƒPÕ¢åĘ“fÁd21¨i)œ¶ù¬µ„$°&,†£w<ð:::°äÒ)·å÷}p–óÏöÃÉ‘1ü(<‡·¶²°ºE~røgû¡êÄô”§bÊ“+c: èUg°¶#""ÜyÒm9NGjjjPWWÚwÍ€R6/ÐÕ¹Z—}×étäÊÑ÷yóÝ€x€KLLDTT ظ½Ù­÷îÝ‹gŸ}–™ ÚÏÿˆÏÇ™Ê Œ~.0…¶¶6ô…~ⱞŸ<$@?~G¹ôf´µµ¡ºº-~ಠmóßOà;Š«X¦n@ï¥È ô‡½Å†ï<׉¼@cÇŽn³ÛF.LÕƒŽŽ(l8ÒÑE­ÂÉŸÒ£›¢Ù¼¹Ã2uzðÃ÷[/ÃÞbƒæ80T'ÃîÝ»±cÇk–\:…û–΂½—à¹Æ%X\û}œ7èQ\\ {‹ !m»R‰‹éêw“È£*ttt°´ßQQQÜ«Ÿ]ÃÕï&‘ãMVT÷Œºm;LÕƒeË–AmŽE}ƒ‡ßž‚V‡/Á¡C‡ Óé¦ù"Ž£££%yß:| qìØ1ì?ó»‡>§½{÷Nk·òÅy¤òÅydn4y¡ßÄ­ÂÍE¡°¨ÅѪ!ìÏv9ß\JŠÀLè zª³9˜wõ V„ä …óÙÆYì>jß'\òr®¡¾Áêtú§jÿ€ldž#8c·Á?'׬~Ó@ã43µu]] Çà)S÷[' Ìñƒ¥qaaaèîîfa6´¬XuXubªPÔš‡2È„œ³”ƒú$¥¯&êÌÌŠÃ…îPh4ZØëP-ƒÃo!&šêà—îv\ªM‚-êDbHdÔñQÙ݉’¤,ò÷‡<]û9aª{Fašpà¢MøÞcŸ€%.ÅŠSû?eús5óñ¥a 2UüÞ'fltÌ—/_Æì+Ô~2„Êd87nÃhpC“¢‹I31JŸÁç•—œ~wŽ!¦Ø[”qÝ3QiVþr!±¾;†êžn—YäYÏ LžCw^zán²û´ò‰ºij}_hþš5$Êlv¹JUå%i©äá²|,-*@àÍùÜÏó$ßbbùÌ)’'“À*e›–¨:2OÝ&~¬«aáhÒ´aª1)S£§´ø”ŠÚjµâf‡ ³Œ0U~bb"òóóÑôƯ!‹ñó Ãó<Ù©pàäÈÎŒŽC6'Úù ,ò“£fÂîQ y:3œœ±ÛÐBxÞEOz-¼<¹Â­9 ¢¢‚ÔÔÔ é_³¾ç[„½"/Ð_è‹‹¾ët:Üy‡ûdNf5ŠÐ–˜˜Èw<™Ýèûµæ_Q_7Ž3žãÊËËÉ_>jÅE¿…(ÿ¶¿?øk,KLt«¡¶þW?ð;ÒÒÒ0™ÛÖØ€|¿¨Ø7­, a¤&·Û†0oÙr$&&¢ï½wèÞ;J™çjyž'nŠÆ¿½ß ¿Kj„† "­Ck4AZ‡:¥sLX–˜ˆªƒØ¾}»Ë55÷Ît2ÜÕ‰Ms§4¾öä™ ¼rP`¼ÝˆgÞ¿ìrÇúAž©ÀÓ|$&&â„yÎô¸oé,—ÈbºúÝ$òÚéA¼c›íä`GËìÏ&%õ}ßÈ…AD¾„•§*ü ..1¦³ÐÎÆþ΄iZ) Sß{ï8ÍÛâü<¿íâ´=øéÌp²d~0¾ùö·ðÔœ¿0sÕ'wÇû9;¾wqùs(Œ „´ÿ,~2s± 2?à ÈŒ±¦qteùÁÒÉî9ß>Ê•¤*I á‘ÉqÖaáâ Ì¾‚áÆ1æ€i¨€à*f‘ªýÃ*0û´pŸ8›=ý»(©T*²œf'ÿ^•­­­ˆŽG†_¼ËÆIé«I–ŒÃè3.t‡âÿÍ÷ÃxÛø§œF>Žô83Ap!;óšêÐìútñ܇Ï󄼆áXn¿¦Àí S&šñq í¸:áÀl?.Úì͉CWgä9P-ÕœN7éáaè‹Ç Hþ~n`ÐÉ!ÐÑExfµŸ ¦ ú'à”J˜­A˜+WBÇ¡íBTJΣ@@ØDZ[5wÌŸnô#ñŠàyl¸ÖzÌÆŒü´ösŒùÿîš0~é&š¹îyÒÒ, Ä¡ùçÓëÍz–£G«Æ±û´-Í×÷¹ i‚ _p!"‘â5)ø¾"›aÇ¿r¦ æöqmn{>—Œœ4aÆj‡”ØX4Ë£ %*€ò¦üXWã‘éÒµÀó:bbb¢GƼ:ýC;"o¾Û£ Mª#ÍP2ˆ ™Ü+:E”Eʰd~¼Wæá»ã# \, Ý-@LB”J%¾£¸ ÀµO@yy9ç{§í/ À6™Û¾Ó“¬£‚Ž[œ.8ßbÂQ™Â£O@éš ÒN{7h=³cV`Ä$hiøBµK±½Ÿ–»øíÙý‘ ë…”àF£‘ûźRRWÿ)ƒÔ˜çytµY †áP«e0À—8`o±M›ÃÈ…A„2w£ÑÈQÕ0!¸lŸpª¿è¦0|ç{σúˆ‰Â˜s讂2tJ®ÚýüGƒ m}ÙPq_ÀLnn‘µµµ>‡TÚOg†Çzï(†ã öÏðDÔ?¥¾Á΀ÄÄD9r‰‰‰î< í¤Iüˆi¾Ë=$r¡e¼l²<}‡©0ïJø£¡~þyLÕÿÉݱ䟎L04ßo½×Ã=¡&…±^Âî“QFJ¸8p¤› êðÆü¿ìž‡®,? 7Ž!“3B¯×sFŽ€ûÏ[8Žt£…ð3Bæv„äLcþÀ”f@¬mœãªgŸ¶£´°¶“9öØó¢QxŽKûuIZ*IK >éI¿»»ËùhdøÅ£W¥fåÄ¡~³C»Ñì ¸ÐŠyqC¨>—ÿ”ÓXØÎáä„ÐŒ+ Kµ <|ÿ·Ù}RæŸo1!+@Á²Áþzœ ¶¶‚C+=›_rŽì¡ ‹:eÏ[¶~‰s!‹ˆtR÷SócYYÙ´þ‡&§›¹‡yÂ3µ·Ø`o±aÇqvñ®ÇþÊÁQØ[lø£A…/eSaì*î Ö{/õå‘’J¥"ϵ pŸÎMÄüuÁ/¤®®Î­í^L”IS¡¾C‹…™Ãô“¦uw!|šð%P›cQubG::ðü¶‹Ì Ö“ï‹^½z•}?Þ`Åï—ùáOIAøæÛßb׃ׇàW§§æž£§ÿ/ ßœû¨  öþ§×œ¼ý%&€–tŽùˆM TÉ»SM,M‘È/w:õS^ÿXšß’´TBOó4õ!}A©£_W– ñ“'Ã^•ÝÝÝ‚Sàäg¾P͘QRúj2/nçŒßÀ2Ï0 €í,Á_S î8Ï¡wQúN 0õ?0•‡:C&‡rRŸëÇÂýü001Ó„W'„~tÛ'Ðm³cdv„Ó‰†þõgµ?ýLOýÑX:a±úÿ¢d“i0åsÁMt`˜,ž7?á¥è é‚þLøÎ+ ˜ÙlæJ×dƒáKô]ñGZZV¬X={öxÌäH‰Úûþ¬Ÿ²™Q§¸rjÄ©2þòŸ÷ÖÀ~N`|4@\¯ÕjÅŸ’â§EˆïyÿÝ[q´JÄšAí™\vEÁóFî2f¹K/{‹’Œ›&0ÜcÃ]›2™ðVk',]6 4 s WÊ öƒ¿ÚžL&b›ÎÜ@´ßÏüK|õ%ã¢ûçÄytž£j`q ú=µn)Í"zC§W-€‰ŒæÀŸ 2ZIZ*¡ªÿã ]8Õ%ÌŸØÔ!&–EÓm‹Û¦¨nÛ¶mãÄÚWõ<¡&ßS)ñ'³ŸÎMÖw:OžÞÄè’b‡­UÊ r端{tà¢D5btA_Êѹ„Édb^´ì/Ö•’¥Zî}íïÓÞáUÊ)ÁttñjE‹aÇŽhjjÂÆ%Â^&VÃóädbFOOÿsã.°k¹óƒÑ•å‡ÜùÁÐhæ2AšÄQgv€‹™ú Á92ÿ³;ê¬È”q;€¼'Ê?vê§Œ€“&€nÆbæ?88ÈB T¡ðÏ6½øfjÍ‚7ŒÙÄúY|Ú Ý¡X”~µMø§œÆxÛ'æS#œÂÅÙ T¡éújáçÀìp ­G`>¦Yó „órÌö“!%Ö*‡œ¤$§H_DêðG™?ýLM€S{n`¡É),ï|pp0‚ƒƒ¡RN­“kþW@ü1‡Qpt”M4¢¿qªà†º'ΛMüè œJηrf³™3 4âÍ7ßDqq±ÛÔ›F£‘{tS4Šn ßõ£ '~úþj?|v²Ò©lå/2æ_Rßĉ¼XSBµÒ<ôwÊüwŸÖ`÷i jÏä¢ûônœ7èÑÒìM äÊ )ou:¡¹&è:«ÿóV§“Ë*•[æïwI kßXeþ㦠¨¸ÈG‚a·keÜ4á67@Iª’d(37Y 8z'ɱ£êšOÌÛó¹Ä?'ŽùøçÄaq~5Qæ¯×ë¹ÄÄÄim`pâF£‘[·nÛ¾¼Ðoâþõò5|:7z½žëü²Ê©ïf³™³Z­ÈÏÏwÛ1´ôÞ½{YÙ¿YF¸½{÷ÂSD 0£ÏZ?bcضm×ÖÖæµ-›`6¡³³‰‰‰ÓÊþ¢b÷Ùµ„iyT¨ÀÙ ‚ påÄ `š`*Û±XpÙŒ±Xpuü"fXq}À…Ñâ ¸æ…-ª9|‹  ÚƒÁàò~žç µƒQ[æ™Ïq±·(IÞêt{‹’Ä&$à‰§ïÄŧE»â±…Œù»j{n6ùmôlœ}üQøed¹Ôüä¡e¸{SõÛŽcÛÁ]¹Œ`ã!„ŽíAK³u§NနñÓõ' µZ-ÑétD­VcöPÜ4çA1󗞨,]‚ºrVN ŒF#ŒXÆLðWûÁ­R­&1ïE·'aÑíIpôN°Ì’¾ÒþóNãÇB켑ÑhäÊÊÊH⤽Y£Ñ Ñ$80•••‘ÊÊJ΀À“ÇÑM ×ë9³ÙÌýÍ2Â9z'¼zoSòÏöÃxÓSûÓS?µ‡ŠI§Ó‘]»v±ˆ"Wm÷½÷bO|À ƒÇ,j²?¶¯œoåÎ:ìN¦Üµ¶¶¢¶¶–9R'@@Ð$ìÝ»×£Jùjh7’9Ž>;÷TõýÚm›”nŸÂz§Ï)øB;.}ö)»gÆ L³‘¤1ó€Ù¹yP«Õ¨«<د֟A]]Wfd4¹À0¶vàÀt~Y…GÂT=àyžxË‹`î䑯Ú'H"GÚ— »wï†^¯çäi«‰½—@›ÞãÔÿ3æ8§òTH ¤Ó鈔)ï ‹Dbb"víÚÅÉ"esIìܹ“TWWÃl6{¿Åbqûîx›7Os&%û9;ª{FY”˜<]ŽñùNéà¿øtî¼ëy"ÓëõuÖ ™ŸÈ>eêÍ\ _²D:×NÂ0™åOdÛ«o°â¬Ã޳]Ná]ë{uú IDATY~éE á¡ÌñÃùöQÎh4rz½ž;ó‘‰³Ç ÁXm‚¼;醼;êðÆH”9¦iiŠ„=n4–>SÆ1†¾¿õ<·¿õ<Ò‹^•z²?vÔš‡X‘x£¦Ì_™Å¡ÙA˜ßÞX‡ Ý¡hvÌíFu´‰]£Dë‰1Eí²?¦r½0nǀю•£ø{ÇêÇlçå€,ñ‚z˜ªþ©z? ¡ašùHõHC@CúÈT6Àa ˜ßÀåË— N©„JÉ›ŒCæ”JôO8@,ŒÌŽÀåË—Yž@À4ûxŠñçyžÐ­­­NR<]XnŠÆÍEÁLX£ŒŸ:Îü?¯øÓ4æ}è•éÌfÜŸ›Mäé~øaßUd¼ü*Š÷þeZù÷ß½•}§v~©Ö€»2%ð|þòav’§f%qhªTMm½Ò>uŽÃï’ÚéÚ§ÿqMÄeü”óRä 21ǵBü¡ŒW`¢ezZgÊì´Á{›žøÝž„Â{Å‘àyžPh@xž'U'AC=áB$šª¡7t2ÍÇ3ûš¹DS5¨Pàù„ZÐMœöžçIk´ 䉨 µæ!§Mwëyâ(.CŸ “§¶8žçÉàà Ž9⤠åi*ìòß K—ÍÉ€Î㣛¢1rÚ†UלڡQ¯nŸòè––µZ­xª\0/¬c1óô¹®ÔÍÁâü¼º½Ïeyi”¬V+[ç±}«ÕŠåÑSjÓÚ!¥SyñoÒZž¦î€Ï+/†¦ýv ÒßÅ ’޶AÛ–^—ö‹®}é}gv ‡9½Ñ‘ãL° uH1=¤Z1©«Ó¯¸ý•º9hwô¢§ËY¨¤æ:“ªbO{`êýyÿ !\ó˜Þ†7UM+{o^.–jô—Ÿ_qœhûÝÈÊÑ;ñX¨íÿ'‹Ã‘öï¦iãHט¸t|Òõ'nŸùšLzôÓ>˜ÍfîéÌpB£Ä‘îæþ±[ao±áõž ¯ý÷ã!Ž%t£e¥×¤Ð˾ŒŸ®]W㿞y“xö~3þyX³uJCõÁ橤Gk¶ö³h«Õ*„б;XAzTÿTd!€4‹ u RÁÁV±ØÉÏÕ€©  cÑjµ„zØÓzjÍCÓ&NêDLǽ÷TV|ö‡úÐ%4dÒ¹¥!JbÜxšÖ—&ø¡þÔ4 öú§÷Šç"..Ž +ÔLTÍO™//Wá?ôóLÓKˆæ /eútN\Õ)Þ>øY hèü°oÊ«Õ[ù‚‚ܶb6€)! tlâl`÷æ/^⃿úÕ´úÜ­_ˆŽßLúžˆ¡:¡*4ºÈ4–.&Z”Ó6E³X¯|îlNzl¥ <쨺æ$·«J®6>Zÿ+Ÿw³²âu@wåƒ ~†âç-¾Nóô¥mÒ2⺥å]µájýº[‡âv]Í™´nwuH…oqÞÒ»š?iÛîÚ¿‘²îêð–AÔ¹àÄäJxsÕ>BÄÌÛSû®04tЕã©ÿ”Ž´¸bfOÛ’–·íiüÀԈǯR©ÈõΛ´}`ŠÙŸÃúÿš6fé8yÚj’4ñŸÓ³ôô,Îó.Ä(ðGzÊÏ[Nh)ó—2"wL—þæJ( ÒAâ²bfíi3 ´Mi_gBbÆKÛwÕOJb¡@üŸþ.ÕFÐ…àŠÉK…"oý”^›)®öLʸkózÛÍÎΞ&í¯ß›öÃ/S‰oª·ÿs$ºNÌßÕ\1À·ù¸ž¹”2ñ¦:“:\ÝãîúWÝW÷úºÝÝ7“õ|£ã—ÞçnL_uY_ëðµžèFÆ0“ö>y¦‚ax+ïNxþ*ö01Ý摉‹i&}‘öï7CñOG&¾öýnFD;)…÷ý?ú?úº(I!'žâ®½Ñÿ­Ñ'Nç5½§²ÿa†ëƒž¾‘¹¸‘÷àzÈU®‹™RIªÒãû{½ëê¿ ÑÈ êhœ’’òŸ“Ìû-_ eg %Ô¦Lÿ´JDı­ÞèàÖ{œÜ“j²?7𔕕]÷&v#äÉ)o&uÌd¼ÑLmÆç’ñþÊH‰Ž&0”JR•dÃixû‡w^WÛZ­–¬X±ÂcÒŸ(h!\ÈÃ]VVFf"{۽ŸÞò7J%©JÜyï¿ÿþŒ’T%Ù¸q£[À_ëp5~1xÓõ”÷FbÏzWT^^îÕ·„Õ•¾šíƒÁg!@üÞïܹ“8z'þ¡BÀpÍcâ+oT’ª$ZM‚SÒ"1UTTLóÜ—Ò¦ðPÒ—ÿ_'$-$ˆÙî¶ýêêjhµZB#2¨¯ý}çÎ×%Ï„o|­À–µQ„:t˜L&'U‡§’Ýø(ýä©;!›7£…O½¯Ày,ª{Fó×}ضm7“‡ñUŒ¡óçOa9}ݘ⫔Adöˆ‹nOšñËpë=ij/*ð]p;r"¿ü• ×+ìýæ\,ç£aµZg Óøå(Y¼àzš ¨ýýýhzçç×]äѶl¹S0IìÚµ‹£øòÞ| ¼m€ÞhËÚ(²HÎ_wù%iÿ;::PWW‡ƒ[ïñI sôN ¬­am×ÝþÌ›6þMá¡ °i&ý÷•’r’37îHsùûŒNþ!·«½‡˜ÿ…^¯ç"""¼ *•Š<¶2‹nOÂÎ;É<ÀB1gº\Ï!$ra ‰Uà±¼lJJš–ðËrôN ¨@é³ây!ÉUaJ«”AdSx(‰\†û‹fÚ4áùÏä°#&•JE³l)ÅÁ‡¹¼gçÎÄ`˜ÛgâXh&ý½÷Ó×XôÍLÚ^í`kÆ•——³<(€UÊ òUÈuMBjr Ñ7X¡o°¢$UIôz=G“OPÌlwôðýßF~îí7,±ÓÛ°qAK©ênÝü.'†m-*Ðà–Ç¿ÅÀ¼edÓÃ÷ZM áµê“ظ 7;<‡O¹"žçÉQ™îHCQÆç9SQ©É¤$UI(ÚÝLÊsŽüì_øå¯fÞ@H£/8ÎÍƬÕjÉÈì¼vò4Ò_­d¬3Q¯õ½÷MÕ×-DðvEU5‡LÅúVÕXÎh£ÑÈ]8rØãFÌó´¹… 䯨¤a¢[J³ÈûOccÑ,|ôèèùô" B-¨Râ¨LÐJüä)áݨùô¢Û=˜®Ñ¿ÙB¡R´Aß`ƒ¾Á†kþW|Ò¸{þ·ÞCT*)++#&“ âìb¢óUSSƒW>ïFYY A™¿·ȺճÈòh¿…¾Á†âãý™)‡š6÷îÝëT®$UÉ€°¨†Šþ—fà<ë°£Néœü‹Rjr ¡ZjN^ípjÿ±•SÑ_ôaáÔ!i÷îÝȘ'@:¿µ£ K—.eþîÆ½¥4‹¼ýÈ7`±XÐÔÔ„ŽŽ„´ š¶Z|ê“K€†½òy÷´…æ‰öŸ·pú+³ý¿þÖÇéì)“×~ûœ{T9xpiz:;ñ¡½WŸö¹m1Ñt˜+V¬ÀÑãÙä$Ÿò*Sz¡ßÄ-]¡Ä¶«¨î…báÍ>—}øþoãf‡ Ë£(*ÐxŒ¡vE¹Š84ÙíúOqÖaÇ?¯òÝÉó •¿\H´š|ñÇ=€£ünËo@«IÀø$L´+¢/ˆR9•ìÅd2¡¶¶ÖgU>MÃK ´>Íc6¼vrj-zšCžç‰Jѳ5p¸OxÅ–G;PjÁ–Ò,¢Õ$¸}¯***H?jjjС.Daa!š››}>¯Æo†p›2 júñ™e¿ÂE›ýº„€¼Õé¤tMCtôvQ± PûaûÅ‹„ÔÊ3ÑíïF?vìØšš<³¯™«ª5x]?G­£œiÂeÁÓÆï+ó„T¬„þUÕp×sظq£ÇqöØ!Oc÷_[¢Þëo}Ì@”¼©®=¶2Uµ<¶2Ž­Ÿ-ßìÖoöA«IÀ3ûš´([J³HQ÷¾öw¼òy7ŽÊ¨SªQ;¤dIœ(óôU£¹¥X8ø6öáá²|,磽”˜š‡wî¾奰çOߢ€UµhÒþ1 3›ÍÜ3ûš½®!•JEÆšÆÑøå(ä rtuv >ÞµCJܺù]nKiž¤Ìpÿy §Õ$°6÷Må0ÑjØá-I!'i}œËÓ¿J¥"÷æÍÃY‡Ñ‘ãxåón,v vH‰ªZ¶”f‘µ/˜f‚¢óQ]]]»vqýýýè7·m~û‡ûqé¯Ï¢°°Ð£ãüþŽ`TÕðö#ß¼ù-û-¤Ýý3w)¨B±œf0õ5ĤÌ`ø´g§ž¥Zþy^1z:;ÑÓÙ‰ú:Gà?.ð©ýƒ[ï!¿¨ØÇÑt›DÍ„ƒ 3¡êžQÆ¢ªÖàÖ1Î-º= ZM^ëc—Î,žè!{.Úì\ó˜ ŽÞ Ø;íø—ºÓÈϽݧòV«ú´óLø u¹³¿Üz©ª50;!@(]ÁÒ¥KqìØ1TW Ž,·ÍêôRŒÁû%ÎÅ܃À“ÇñÅ÷àpŸ Ïìkæj&ìnµ†1j«ÕŠÖÖV´¶¶"** ¼žâKR•ä‘Å p¸O{§pòo³á¢ÍÎ=³¯™3mûžW‡(£i*qS)÷ÉP;¤dp¿®˜AEE©©©Á``0¼mmmؼy3Ž;æ?ÝÕ)ÕøÍÀ>³Œào–Ô)Õø›e„›‰ÀóBZÚïj…Ä,‹óð¯åËÐ5tæÃsÜX›cm ´žh÷¥9F&“ ƒƒƒx-½ XðÔìÂs¿W‡Øú1^è7qÒñÏ„ vìØM›6þX?ŽcÇŽaÇŽ.ï?¸õòú[ã¨u”³wÚó¿h³sûÏ[8½¡sZöCO¤7tâ™®²¤Lô0öÌGW§™annÝü.—ÍÖúÆ%‚ÀéŠyºCTtêCƒ ï?QÌöí|æ'x÷¿uó»eâïÜ}'^.\€÷Ÿ(fæCoB=$½òy7Þ~äè~Ò7*@²)ß ÇÊ ?•Øè™}ÍÜ+Ÿw{Ä(cÿ`s B…DmTJ#‹Ýžä¶E9µCtä8kÿ™}ÍÜŽªk0›Í.MP”ù`ïÿSÏÇ ­­ þNyס°°Ð­[¯×sTPÞX4 Uµü±~QQQxåónl)ÍòÝ™“ÞLÕ–%i©×eæ4p†œtETÄó< Ž–“È…AäàÖ{|ö› ÄcHII!)))>;²­R‘ý¹Ñäɵ“úßWg8±ãÜõ:®RËž’’B¬¿‹ ¾¼Ík]tÜ*•Š”¤¥•JÅêq·¤c¢mÓPJ_Ãñ¶”f‘²²2RQQAvîÜIš››Iss3›{oëhKiÙRšERRRˆJ¥"•¿\èÔgú»´\YY{ÆÔnGãkµZ-ñåØRšÅæ¨$UÉÆ/ýÝ]yžç…¿ÉÐ?æA=èn½‡TTT””b~)±ÅÄüRºÏ΋›ÂC™£ E3üOîŽõiíò]©cT×Êí»ÿà ¤¼"/UKRǨÈB­šÃš5kH]]¨?‘ný’tòç£ýì³V«e)nCT€ƒ_”¯ï,„t j„#’ÂòÂa@ƒ:• iŠÜ½æÐÎp µj’©ŠÀû§m|™6 ›Öþ5,u残2P?€]eƒå[¨UÙp9I » äoÜ~²X0ÊÏÏG||òºº:Ây¢âåëY÷È”HT²¿CÅÅÅ܇÷ý»ùbl[+Sï"NG^ÿW Ì5MÛÖŠ¹ ^<ôÇ:ÌöºD&*‘ Éb±`Μ9ì3uLNN†^¯Çó[긴´´~ e vnn‚Þ (’ —3¡õõµˆÂD}É÷öOÍ@xkw_U òó󹘘Üñu"²gzpߌ°sflºÒÍ)§ð>9j^NÛ¾mskXk×£Ç%+oKmc&MT`˶“œT3ßþ€nLQheP85ˆÔË®P\\ÌUTTpóæÍÃÊ•+™jT8gùùùa…ãJ½ÿ`¨°sž=3<¬ñÞ¥ÖÍ H‚¹Ó[=è4ΠÅÿ}| ‘¨Jd.Kh¿Êì\¨Û[[WÛï…Í•"2S•5Gãç¿© ËŒ©IPð󯕱>„*Ch||<zè¡€óˆ¨ú?Öé`s¢rô 999¤}žžÓ¾ N’ü£HG`P-Ãñs½xûOÿÄ}·§¡®Ï…q2ž¸I5¨5h2™ˆÔþ…FçÙc9ïÒ.r¨O 8øÕYØl6nãÆÜ#<"2¥ù Ïo©ãìv;ž¸9ñññhooç1 Ã´_Sš8is Š¼å6ö½P­,E”A§M#únd†œðTy©cT¢ÁÖh4xhÖLØív& £‡Æè ¨ÊfÍÓb0N€RÌ>ûŸ¨ ”v‘ƒl¸œ©ÿ}‘ð|‰.4‹ÅÂp:Õ†+ˆöšíøîÏWDßUkõ¨Öêa³Ù8F­VÒD7’l¸{v}†'§fáâæÏQŸ@˜-7=ôÐCx&ìûþBt<)ujEEW\\ÌÙívÆü;A¿Ò8ê@D×8õ k•ö塇 ~ºZùÚÕ*úZ§q¢­ƒð‰A‚­{íÚµX¹r%‹ Ög_úÙîvP-¥"¥7Ðã’4†ã iâø><…UœG¨Û? öq¹~âhØl6®§Õ…ÈÐÇB*/çM|kÖ¬!S§NeæŽòòr¿d@ÅÅÅ\ [0Ü8ûýþ5þt=Z7ƒ¢¾:?&o·ÛEBúê$…aSÔD¡•aÝû¢¢¢‚{é¡·1²¶Í#pP:-$eDÈ0ŠXßwA"õrØN÷s}VZ›š¹hlÀ„@Ôç,>>‹/F¨ù—*Ë<fÂ(• |wÚßÿýz5Q¸´g3Ê^{$ PÖ`稿=«}…€ÑJ¡èˆ¾íÓ¿'ŒRÁ{ÁƒþQNµÞ ˜9å-µÿ…ᜈ®?j>®O ¸'ózæü ðçäÆ9*ø 4W=À/¼'nN  !ETõ Ý=1¸8.111LŠ µ)~Sº…Ë\4–æLƈ¤$6û"Å„pº€»'/dN+êΨ;;XXa(Z§'б ûÿR‡•sŸrcïN;ÖÅéÃ’dŸ¸9‘ÅïÆ:ˆu:åGãä#™ úø¹^<–3m0ÅETÈšžžÎýäÅïDð«yìfkkkãþkRDÈ0zžôº1N¦Àv''.gá„hAAÙ¸q#³Þ“y½èýàË¥ÆcØÖÖÆå%;`6›¹³.7W±t¬(™ÆÎ;ƒÞ( ylÚd?×Ëü&îɼkÖ¬!;wî Õ|@¢‡z¨}TTTD<€‡"ž?>ÃÎ!@u2îÔGák{xíÒg :˜Â€£0¬?TQ?jmâA…Sƒ>«'ä-Þn:::˜0@¿ï½÷üæ,7½ïû[=ü>Œ)€ŽtüÐ |­›Á]'¾À>B!@§qòB€°Ü˜Ògõàú‰‰wÊ^{¶^6áÐ(Õ‚ü9;´l®Ø\)r¼ IDATX¿ £A#¤ú`;ÝÏõ´ºöAÈüðç_H‡CBw¤·qržµ©=8~®&cÊËËQRR‚‚‚?uºïÍ_Š&ŒRI:ÿ ýªLÆ$ì‘)Ñ©æçoL‰]e0“Âڃ׺ÿ…ë’»ÉÍÎÛ¼´TQù7r¹¹¹Dæ[‰Ãá€i¢ïí»ìç0Êû™ñ$%%¡©©‰9bјGƒÁ@Bi 0g2öš]Œùÿ¦t We닉§ŽQ‘Y&%²ŒFh4œu¹9E’ý‡=ÌC2­‹Ó“œ*ܶ¹UÔɼ£¹—:¬Ü‘ÞþB] e vÎf³1œí™ÙÆA©²ŒFTkõ¬ÿû«ªðLzè[3zûxuhµV0 `ý’t’žž.zç¿«'¬l|l~[#c´Q¤ 0×4­<²«”¨ƒëC[[g³Ù8»ÝŽ9sæàZæŸB5Ÿôºá¾ª¹ê!|£8=„`f¶+gEmm-Š‹‹¹p“ºQ`´RAB9rRHf)¢íÛCײÿ¥Î-8ër³¾î«ªa Õ„TQQÁ‰šA2Þœó1vµ] +„MXvn‚ôãv<]°+gÅÌl#Þ|ñï~^¨¾ƒBãW}‰ªQ¤ðÄ1þ·÷‚ÕZ½h#ÍMðJzãÒòÂú¡³Íöº .Õ#|–¾ç=o}'*K=aiH HÙ ¥ÊÓ¶…sj2&áàWgQ­Õ„æö›Ö)\tìi:^áÜ©;;0a”JÔnvv6ÎìÞ€ßT:ŽÂw8L°9Ô¼@Íl®ÀyHÉL…gH8Y‹Þi3 „T|lt üçôÝ…Dóüá ïƒlÜ„kçúyÃ1†ã°ïß]ì»pÑì‡ÿü ëÅì‹rÉ>-' áoÁæ^H™ªLSGâWº1Z©`ßû† ×ÀòåË1uêTã½àñs<£*õṖ>ç; ” r‚¡·N©Å'Õú¾ãFUä‹_‡-Réðž·¾ Êüç&x±r ï3ñÓ/¿båm6W¾ì'û„bþ¿y„ã —œþM炎£/.»/ =%º }¿J§æOضð=¤3áJŸ–¥ß<@hyš@D(¸øöŸ¾S ìu¦xF/|w›Íæ‡eN…'áØÍöº˜@ˆÕß¾(À‡pRÏ—‚ RφñÓ¾J‚怖§‚›0þZX/­Ã÷B½¦*GzûQ­ÕCÝÙ øú›íu!ãáGDB@VVßîÕ¾Âñ§¹×­›Iî~´¸ø[i§Z# ï*{QQÑ÷ëp(/-•åü©ÿ1¡ŸÃ)',ÿCö)Ü|x&}y&}\È>䥥ê õC÷w°ôCΩÉd"&“‰ ›¢&‰¿eûI¸¯†MQ“¼´TR6)<;~È ÚV¤-’|^ $² ‹=/UKîÔE‘²IäÙñCü&Å÷ù@ôåR£_âßÄ@rî`Ò®PDA‚ý¾aÆõñ¸C‘Éd"+W®¼&%E’ÞÀ‘Þþÿ¸$7× ™C_ HƒÒh¥‚Üw{Z@8Ôpè »“ûÕnLSGÂW cK“ÅËù®Ó¼´T²nÂb²nÂb¿ïCÂD Ôù×péZ XÃ¥©S§Jî¥` ŸèûšãRrr2’““EŽ’:ŽÄ'¼ 9wÂÿQ0ç/_ä4˜¤‹Ö@´LF¢e2ì™`4ü÷oã¹öàq÷¡È`0 _½MÓA—ìüç­~6W ž}m!&)äØÕvá\žIG&)üC5u:AôÃ>û„{’ö»*DÞÊÐoXž)Ù>í?}n’BŽ–gâ™ôq¤¬¾!è(Å®•¤æ!/ ·}“ÉD,ÞZX¼µˆì{Jw5¬ºV´··£½½111°xk‘cOD¦¼324˜rët:‚ØÇ ¸ë·sT 2¨ñz1[#ˆç†cÓâ¡Û…'–ŠÈôNœ—ª%æc®°0ÍzÜ~p¤¦‰óŠó¹çççsYYY~ƒ,µÂñÎÍÍ%‹<òHÀg,XÒ«[§Ó‰ð¸C‘ÙlæÊËËY½ßSz¡VM¤Þä¥jIsó@XEÉ“ºÑ] 1 ¬Ì®¶‹øñ¤ß—––’P1©M›ŒÇ¦MFnn.¡Þ¤ž $ô­‹Ó“‡DC9Ýåt Éx¹ß^ß}odˆð³óÒR‰1b"û{áø;È–4˜•Þˆç^ùц1FL}öP 0¨t kjj°bÅŠ LëË¥F" U¼Öˆ¶Iûp­t-óo³Ù¸çÄK‚ï˜ÍfÎd2‘E‹±È“ÉDôz=æÄ\€Õjeã£ÓéÈã·ÜŒ¦Ò(ÑsÂÿ»ºº0kÖ,Ñ: ÏrssILc)bK±.NO¤B·„Dç’2…h™Œ4ŽRƈž{±î$'%ÐúóÒR‰Á` ÃfÍÆÝg›±ý¦i(** Ÿ+Et_:Iih¤C8õ R2¶>½ ¬è‹²únõêÕÈ1Mo½ÃM”Ì…Âß,Yî¨Ûƒ™"Ä‘z )™? ߬ó*‘¢yóæÁh4¢ªªŠã[Ÿ^€¹†Ðù”Z‹´}ø´¡‘õa¡VMô¬ÿô¹OYtR(¸©¼! v8!Å” ±¹RüøS¨üáÀqSæÙ÷4´=·B鮯R‹¾F%èüwv'BÛÃçylr ¢ÔaF†´™1w:Ožg¿ …J2Øò… 1#¸­‡ÏÛmš`Åò*û‹ÑØgnÅD¹ýµ<;~çiÆpëÉ /FÔwŸAæõ,´ë˜×Òí—ýÈûï¿/b´Ô¹Á—ù„ÜUUU˜s[o5HþîíßæÉòÃãFW$€Ð)ƒ½C¦*‚èd2æõNoÀHFxû·X,èèèà‘ò$œCÂ^hŸ´Z-òó›^ÿW jkkáp8P\\0=MÿëŒÃ[cì°Z­(//‡ì'E ”¢—:¬Ü*Ï^H«†D“‡Dc¦I…•Éaµx}ç­~’ÿ?-•xå€Öã¨ø=ÁÞºÄåEÂô!PNà„¿ýéjÂ!Á ÂdLbœf$\ür9³uuuIbx³öSµdSyÞVÇ>yH‘Ífãl6[H<ó`lþ)ÕÇ¢ Yü(ÓÞxsss u¶ÚÕvZ­—öîA~~>jjjPYY‰êêê™Ø„”l­DJ §KmúôòriÏæá‡ƒ1_»­”J™TUUŽº=hu{Âb@BzñìSÑ)YùÛb¥ÕǾd±XDëí½G°«í", jkkžEeõ uš~±î$WVßÀµº=8vÿL¸Õa¡VM 9~ö,:Õ¼·ï2Žº=¦ÈKÕ’=2%–í8 ‡L¿ÿr©‘l*oú.ŸÖ[‘¶ˆ´Y¯C^b=Jæbg…v–"Ú^WJ>z–>'jßo̼µ¢ÏÈÀgå”tt¥äãnùI¤·~ïùD?¨C÷lxëp|µ6Š´EÄ]¿W+”SÒqfèœ/YÇB­šœîwãD¿ æš&ìvôáƒ.;Ólû¢Ñ¯Lqq1G³ü­_’.Ò˜kšÐÞÞNÂAâs8hoo÷c ‡ùùùX»v­ä­½  €X,¬ZµŠeáøp‹Åâ7ÖdåÊ•Ôuqz†gï>åÁ3éãÈ?FƳï;¾ŠFMM òÒRÉŽ;ðì{3‘·úIDŽç™4ËvœÃWª&<’trrrðÙ¯f2üËù¢M{èÆLÇ%@˜€ƒ ûŽ÷cSyài„xâƒÉA‰ .æš&?M@VVÊËËý’éµk×âÙ3ø›Ö$²Ïët:RTTD6lØ šÏŠŠ nw×pÄ/\ŠJ/ZZZØfxãë!>ö š› ÂòÂ>̉¹‹ÅÂÔ«•­½˜§n€gÖ{÷îeå(óW¤gˆn°Ñ2Y¡¶áÔ×;P˜0”½}––ýMþb±XðÜsÏ!''ùùùhooG•­åååÐëõŒ –Ê^{………p86{)€¡K¨Ýó5‰ Bìv8?ÿ{—ú=×1¢Ûo:ŒŒ‰øøx?{VoWãámu­TMäVVßÀ-ÛqpÂK€è›+ÎÏ¿Åme w&HݺM&éèè@mm­(\¼¿Ö¶ó™Ífã:ÕŒV*ˆN§#VÎÏ¿ÅÃÛêP×çB–ÝŠNµ†éH1z«BzS¯zïjÕÄ{ÁƒMå ¨ë“N O›õ:(®ŸwsàjÅÓ¯‡rJ:‹ êèèLFe0ˆl¸œe]¥INz£˜RµÿR‹I 92å|´JWJ>Ž>û7YPÕÛº>îXX·wp "Wt³WO!:“gþ ~<ÎK‘Réó2``aíqôrG½«W¯öæL&ašW¼äaØzyf]]S›CvÛv45ߎ®®.¼þ¯¨rß…Õjeu•””@§Ó1sÉœ˜ ˆ‹‹Cÿ®VäŒPáPJ,l¨ªªJ”U¨BÞuîNx fkT$SC)±hq{PíìcŒk×¹sÀnÿ_ƒ"öˆ“Ëp(%Ý'Æç¿HîyùeÒÕÕ“ÉDâZ£ý„€’ù£`%ßÂvî,zÁ=)|ˆwïà//‡#¤ ©S6¢ñbàn†NÙÈÆ½Ù w䥥’^"L&™7o,‹( ÀkS222˜ð*1àž”hJ‰Åg_§¡S­Á™2d:õMå ­TÊf{],ÿC]/|awrW‘1ý<ñu:ië ,‡ûaa¼·m®a8DJ« ð‘S4ƒiyy94ÛþÆàÕBæo·zðè9>~ú)̘ÈG¯&Š=ć£n.èÎ"zó7 ®V¤¥ñ>X•••(þüt:å=Žs² hsU3-ð7nÊÌSǨȲÈQˆélÇò$-ô÷¡ÈÉçÆ?áåûÏ‘Œ“”<@3Ud„BõMj|}ÌŽØ&/K„‘©Š #GF„„ƤI=„q£ÙÑöåÖ/I'ïí»ŒÄÄDFÔÔÔ`Þ¼y8±í]üúØ´ÉЯùT²NGl6Ÿçï¢l[¡Bèh<) ñv\‚ÓKX2MMÙ©Ö`’»{báiÕhr´Ï…ŸBÝÙôH%v;úÐíõr©cTd©5RdR^ª–P¬pª^·X,øüóÏQXXˆÛÞ ’Ô7)Œh{vv¶¤ôkÝx7ûFÓÔ××£ù™<Œ}£‚…ð ›½4 ó¡ LÓÔ‘à†C‘³+'gâõŽË¢ö‚ùŸU¼çsf°8ÚÊÊJ\W¹Ÿ}'åÇ@“ü´µµqBFLãõ}¸`D£ jÕøÂîd{ X™@ÚŠÉ!ìG >ä¥j Už›à…ïßOÜœˆ÷ö]¸–©†LH1¥¸ií_ýBǤúNÃéÞQ©W£ýÊÇ€×È´€’Çt0ï ”ùÓC–fåøLœÀîý¾ª¿Ädyi©¤«¥XÌs¢RD…-n¯®-nbήßä/!{®taÙ²eX´hf̘»ÝŽl]4†Íššš´´´øe¨ FEEE¤¤¤„ ÙÙÙÌŒFçjÍNk[@:ĵF£gÔ"tŸà—Âýf N¿Ù‡Êâb€;CŽQYJœ«v!®5f³™ËKK%gªqïÖZDq:ÕQNú9$ °z Ñ)ý/g6r#tÜ·°‘‘7œ7)ÏþÜÜ\R[[+ZS¾û¯Í`{ˆ–}â&^ÿ†÷ñeØR4Z© z¹ Gzû9NG–ËÉ ÷žÜ8+Ùí_§l„Í•Âÿo³q”Gø–ÿfÃO‰ëPÞVdžÑöiß©fP8&“‰tv'2Õ?5s@Éühl*¿Œ=2%;bàúa©E¥¶Å?»¢` QYY‰ÒÒR>'‰æ(bÏÀ ÌBV:‡/Žšy @Ãé^./UKL&!\"Žº=虩Àïz4xà"ïùDdÈÁ‘ÄÄÄ át¯¤ f¡VMF(äøÂîä¾>fÇõÔÐ/ˆbƒ?B!ª ¡ÔÖÖÆÕ'¤]äà½àA[[›$Œ¬ï&æ>ýpKK cþ7ndeƒ1€?$×/I'TåÿÄ͉°y²Òoq¨jkkã¼|÷©ÊÌûSP€{ÿº¿>.è,%ÛU¶n,Ûq½š(ô‚X§{dJQNú@8 ”òÒR‰NÙˆøøxÌöºXâ+›+Ï&îæßûeÒƒUÃÆà×CZZû¼ë¢ =ô²³³ƒ–§{ïõox³Z¸©À)óxááÖ$ ~—Öņy€³’¥ðfÂb$ÿô‰Ð@Ho¾øwÆü>qØ'N”Ôé »“[µ UTÎl6sRÌöÈ ðÓæØï‡•Ë™c ˆ®‘i4¦Ñ¢ ßAÓ¶YW³¾”Y¼—ª%Ñtä08ÒÂnúÿt^Z*ñõ˜zëhö÷ì‹rŒÿÖ‘uªÿ/ìNnÒDMXêЋ—"Ø"‡Þ:p'ˆ©LëëëãøÅŒù oÐ:9ïÜ!´Ó©õ9°y²À¿=$;Õ<ý£Xôj¢ÂJ¾`2&á »“1_b·cSùe,?~á„ýÑ!`µZ±{÷n|òÉ'Ðh4ÌÄÑ›pFo+u8¨­­Evv63H‘Á` o8Œægòët€#-8òÒ2üå‡5_ØÜíÍí\µVº>òGãè‹c¼Â×)¬²²;vìY޶C-%áÍÿÝÃgÂêC~~>Œ¯¾Žÿk9NSA><ùzId_õl¬“ÏlGU÷ÔŒù¯_’NÌ5M"!šrÌ5M(k°sUÝÚ uäç磾¾¥¥¥ÈÏÏç¨Í5¬—†øf×ë,\M~B•NÅg– rÂrëâôÄ{É‹õÊ‘X¹r%Ë9a³Ù‚ ™‡Ç‹—±r²uÑLã&%|b‡H»ÝÎ^€×|VÙºQYY4Lào]”ù¼6`ùòåÈÏÏGvv6rss E®¤cp®Ú…ǽKQ}È‹î-µÏrÝ'ªyñݧ¨ú>F÷ ‚ï>õ`ó9±²¯ö¨˜ €âKØl6®Wå—E2œ`eõ œÍfãÆË8|awr÷¤D㉛TX[ >wŲ5õåmgý4¿UUUArZZZ˜`³Ù8afÅ@$¬+Öé{ÿ Ïȃ_wã³³v9zB:dët:bs¨á¾@އûÂ@÷-ÏD¹oñîá3’ûGhV­TôH%ƒ¹ ^Qû¾¦ßÑc‘ãÎ çíÑr̘¨ÁãOgv{ˆ>.Eú"_ÆÙSÛýoÿWÓÓµ›˜˜8q6›Ó)±í©Q^Ìæ†£¦æ¦VC?dÆË8˜97: ¹pqϵa¼Œ5œô4C?DŒÎ÷ü–:†7]×ç‚ÍëïA?ñ*hC02 „| ÃúöŸŽçÚÃ6[ZZh.€PjÛa³—Šð¯T[÷x¾_Ñ'BöÁ`0Ù¹¾¿›Ê/c¹œˆC,ðV3Z© qrªzûÑâö„Ë €9žèt:Òtä0’““‘˜˜Cï7QÖ`©I2ÿŠŠ &8Æø¥2UÑ” æš&¼uà0Ѥ` IDATî»= I£fb¿ùXPÁKвìV¤G*q×°ãønÓ•A9ÁQ;åQ·y«Ÿd¡:óçχrÂÄ9„·!ÃÞbBÑB­š\Üü9¾]ý+\Ú³cÛZ1a” é‘Jܶ¹†“òÿð½•;cã’˜–;X»”É  ¨c'÷`u®®.äç磸¸4ô-Üü’u{¨¨v)X¦4ñráö%,¬ö®´ðÐ4}oþ/Žö¹à Äü›®ÚR·o߻ݎŒŒ $''Ãf³q555˜3gÚÚÚ¸ÒÒRdggÃöövRYY):k.|õ:::Ø:ôÍ0êÇcI\+o¯?Qú ×Rû,ðvaª °Ûíh©}–ývîï§˜ð€©§€gžÔ.\¢cõv«ÏÿƒÃ+¦#õ Ïl6›äÚ¾¯pÿ`—1ú 5å &‰N(.õ¼ÿȆËCÖ¡¸~:ànøBø7´».Ê‚žG”ù‡ÛþÙSÛ¹ ¤ǹ %·[=ØÌ7^¾€öövv™™@j¡tóT?xeç!®dþ(¤ŒŠf¦8s­w Ó aîý˘âý Õum®j^8éiáqA?í'‘)ï€÷âp|ÜaÔÞ6€Ž^‚Ô1*b2™HÃé^.*v¡VMôrsôeàœ)ÑÜÌi9œôºCNàó[긪n-ŒWÃ~Töc¸õ$–/_Žp<à,X0`ãäs§Ú`@FÞŽKèözqÞíAUo?¾°;Ñíõb´RAOH‰WWœÞÁi‹©ðu}/s©¯¯Çy·'¨ù—èŸݼôà{ŽV*Hv´ú!pA?Ïo©ãžßRÇUTTpï>ëÆ»ÃnÛ`0º>²Âdz§Ì¼ŒÃ°Y³€¾ËÇwcþüù˜¤ÃבIØ60` 𻹰ÿ ‰Úþ[ÝT:ûà½àaØB T»o/öÅ hooG|||È9ôîÂñU DmÿÔ[ÿ³Ï>Àk׆,°-Ypl _Š˜;n_ œ‹‹‹¹}U5!a¨…DèLUÃHüS\\Ì̓7"11ÉÉÉÌÞ?Üfea¬6›³Z­’¦€öövRXX(ò çÞ¥=›ÑÑÑMÓ‘‰³ãŸ(}Æoü”îj,ý³Cf­bßÑç¨ ENˆóx)\!ZT^=HhÏHÝ?Â5!døµÂö)€X¦*"ìþÓý'ä?@à½GÛ¢ÞþŒ\­¼Ý\‚‡¤&È÷s]Ÿ‹]vµ?lŠšTjù‹çëÿjF£a&?ê øßç2 ÷GdßÓH–eøÕ÷³Ýíh<×-ò_ksÝ€wlsUビw"+04œîå8Ò‚á6^R<ÔÜ Yï½½hû¤E(Â'23Z]Ÿ‹ápˆ‹íþ¾I€¤ˆzþ·µµq¡lWBJLL„ÅbÁ·þÕZ=/|$;°sçÎï•ÅÍ}g/êD€eª"HÇ{ð;½N/A§ZƒÓýnôLR‰WÈÉ©~z§Õ¢ÅåF´,¸Ô)E*G, âããáô¨=¡ßÓ‡úþNÑ„ßå¥j‰36'ˆyÉ?û|YƒÛo>¶'¿¯ µj|ní4ž}Y}G™NNƒr¥ñØËÇw£n\:ÆË8?5&u® •‡;X?jÕLú§ëbé3¾å„ ²¶¶/¼ð‚_Ýá (T¹ à³Ï>c7Õ˜˜4662A Ü´Ù"ç/‡š9ý Ç-˜bf¶ÉÖJ‘Fìù-uܾªÉäDRÔquì©ã_WKsHæõ›Ò-\{{;ôz½‰­¬¾kiiaf³ÙÌÑèúLQQ),,ôCj3“˜VÆb±HÂbK]¢Æç¿HÀ¥ÈÂé7û°ôÏjÉug6›9ß½*\K=„€®ÇpµÂò#eÀ‡ãn»ÝVÔŒà ÎX\\Ìutt„làyÉ‘Þþ°û/µÿ‚í=vž @»ó PÍ ï¹@·…!†ãï@g¿ÞÆûHEüÐh»ÝŽã\&ZXu­è‹|Ù/‡´uÖa¤‚hÿ¹ªQ]G êûx p‰8éáÃÿd×%"S¡DvÏu¸!Y*­ +4QϵÓH-ÞLUÑ_õxOTÂ{Áƒq2‹åï«í÷-""©…žv‘C} zˆ R__«Õ E’‚ }ŒFcȸÿ 6 $‚HO6OÚºÇàú:h¿gkTÄêñ¢‡ðžÿjµŒƒÊу8¹ c#”hqF#¤ÅqÁû=¨=è!Ý^/Rm]ÁŠ1Òétä¼Ûôv;ï}ß«‰ Éèâ –á›Å¬¬Áεµµqÿ5IŒ‚e0ð8ÕƒüMk½¯|’‰ <žûY—XH Ïžªö©Ú¿²²~ÙºRRR˜)@êÝ‘Ð"õts·º= ‰î¬ËÍѰ#êÐJép8°zõjÉßè\›Gßß„M r”¹ÇÄĀ̻wïFMM bbbðÙgŸáàÁƒ(-- jŽ‹Í¡æ½þØz‡…¥X¿$øzø ë¤à‚Q´LFâä2$*ÈRG~­Fs ¼óïsÏ='úžFµP¦_\\ÌUVVÂd2‘¢¢"ÒØØ( ÓlÑç0¦OUßæš&8’¦ìÃøü ¸án9ªyqúÍ>‘@HÁ„Ó(ŽCUo?:ÕÔõ¹ ŸC4Wß—ýüW“]9Ò…$å¤hÏ[,?ͬðÙX§j ë{¦*"dÿjÕDjÿQ<ÐÞ³ÙlœðÌ0àÌ*Ð ÌMðú1~Úoj¶ j¿¬Á´ýK‡œœU× ¹ç8Ûß”ös ‡ð;È=ÇEξƒÁ@„ïÑÒÒÂ÷ßñH `PfAÕ÷1ÎÉ&  šL&2ÜzÚ‹öþkã9dÃd8âæU)Ñá`?¾ŒÃ*õ6 ÄÐu#Ù‰hì?ýŽªANzÝ~ØÊtò££º`µ¸Ð«‰ò“&i8Ô¢§›´¥¥E„ª$ li°ñûÖì€Òh4hë¼Ú/±}z¸»Qb·©JËÎ˜ŽŸ&x¬Ó½\ÆÆ0!D”R9züÆO JÓ·¼/zT¨1¡ã`0È‚ D S|ç&v¡ÞåR›(¿¯GÄüG+¸E«‰gÏMV?‰ÆÆFttt «« 111ˆ‹‹Ã y øäoR ZÆÆF¸ŽC•­¾ãî«Dù»zÈ çïÃ9ñx÷ð™ Ò4Š€>çrHÍ,B;~ ’:hÍa°ù§}ÿÙîö€ýž›àÅÓ¯õÛ·_XdD¦®ÇSÃО HhÁðàé;„§í»T  ä`0ðxì4y•Ðs?-- z½Þo K…Ò÷¡ûÁ×a–fÙ”Š†¡7*|àŸLÜoÖà£_ ‰ G)Öé`šN+FÇ”2×øÍßÕp¸‘Q9hö·Ep8¬¬ ‰d?;„ ê)Õ¾ð=è­š:Éù®{!¬ïÓ¯ÇÏvó{Ç·>ß½'¤pTá•@Ûœü„ ­[ªýÄÄDtuuÁn·‹úðè95÷bLÉÆ Z«çsSèZ‘,Ë€Å[ËÂEaÊ6ý åôçÑÖÖÆÒ»ë·sl SǨHÚ¥‘%\Àñs½HT*“8™òüùìP(G´bœL úqë•ãh8ÝË _”Ä»‡Ïø9KÍMðÂdLÂ_Žœ1ÿ`PªH¸ˆèá™––£ÑšŠWHô7ìwa¾R*HO Ñ'ü˜?%ßþS©Uª¿Â2Âßóþð¸…å¯=T©öt:ÉÎÎÆÊ•+ñÞ{ïIF„ûþRxî4‘ |˜ÔøQ&:gΦΥQû÷ïTTA µAÇ€þN™('Aß±t€Jµç[O <ñÁθ}’Pòí§ðöOãÿ©ç¿ï¦åÃÁƒ§ï ƒØíÈTE Åå ”„˜èRëÁ‚ÈÉÉñÓÀ„‚ÆõÊä…­ƒ:Z,TTT°ù£7|êø—5E†ï>õà†»ù9«>äEÖ¾ùÝï‚®âs‹2ÊÀ„Î’’óGÃÆÀ #¯.‹ !àZÖ¯ÔÙëûí+0à¬ÿ´Ž’ù£@³Jµ+¤P}DR—@ay)(ö@íKSFªð‡›(ùÏl¯‹A³{®³"Y–³Ù”RG@šØH(ÐgD Y˜Èd2ë•ãpµŽ€rD+ËþGŸ•2„c§ †ý}ð¼ÒÒÒP__ïWG¸˜Ü˜a¸ØØ¡Þ?ã¹Öòßwü‚ÕNŸiª``àvn»?tÿ)Ñ›üŒ30þ|ÉÄ??4ý§×ÿ÷-*‰O¸Xòƒi_¨Q̾ $œ¶ýT[t1a•§Ì9–* #¤úMC¹ìv;,X j÷ÿ#nYÃÊeM‘¡úWön {ÿ )˜ð¨¼ïüé¹áRø^ó7˜³g°ýÖ@ý V6ãÌ4ض¥©¶}y¯Ty)þ%Ùþ°)j’¹h,ÉÍÍ%™‹Æ’ÌEc ýžV>lŠšÐç sÑXâ‚°P«þ^ðÂùOÓ¾]¯ýoiçèÿ/*(( EEE$%%…‘}»^#ûv½Æ>¿úÒÒÿ–ëN„ªxõoƒÁàw±ç)¦ûÿ DýKÖÅéÉ?FÆ“öì$Du(ÊÍÍ%︃L¼ãŽk~g µÈÃd2}¯úáö©™?Hýá:d/^,†ñöÅ9L½®8Ø3¾~A ÇßAŽ2¦é/ü-\§ÙÿTñÊ¿>q)))D;AŽ~iÂýý¨1× µ© òóz&EÄÇÇcÆ}“ÑúíeŒ¸q(8rG«ûÑÚÔ„K‡œÜB­šP•ƒ ™vÒ‡|màB;EÀTgEEE!ai})77—¬\¹S•²ßQÛE.ªëL&1ƒBûú?GÔaq0óUPP@Š‹‹¹‚‚2vŒ³fecæÜ'9šÞU*20à VYY)J[^^ÎòÌcǯ×mþ^k'/-5$úE¶‚µûLú8BsëÓC”f5¦q¥ÏMRÈñïá#0ýB+^¬;ùí^ÊKK%ÆËí˜vÕ™r *T¶õ2\Š@D™ñä,ê¶ŸeßS, ) &á:•bTz½^„€)¼N¼ãÙÜ,ú¾  €T]¹Úû!¶nݰßÁæ¸}j&!W:ï(£Î½ íûRÏô‰cÛ¶qšž¯ô™¤$>zd7€:Û3æGHIIAgg'ªªªDïâ{+¦õ`þNbÇœ©7GÝ~5„x¬r"kïçÓ?ÇÓ¶BÀ®wWæ>\ćb¦¿@Æ§Ë ¾ øÏçE÷þv"™6C‡sºîõKÒ‰oMELL ~ö˱pËDÖlxöã´;ÚñûößàÌÝÄ{û.£Æ\ƒŸ?s?¢gÎÄ›K 0)+@.:…/ì¼PŸ@Ðpº—:r­_Ožß|³ø2ÿŒŒ ddd½^ýû÷ツXŽ$=ö8ðÖðjÕä„—ScÀimmìvå=ß‚ßÉ”(|ìq4½õF¸Ý «¿À@"›ï#(1Æï´êHŒ Ò~Cärä¸ä‘Bo¨Ö«Ìxÿ1ÿè)@)º>(#[±‚g8ÔigíììÄ–-[Ø÷︃Û¶½ë=/¿L>ô.ÞfC»N‡¨Y«à•íÃD»•G67‹_-NY}W6)ƒÀ´«þ8‘>÷áC8Z<Úu:,^¼˜X­VQòŸvz› WûKóЋ@™þIÌ2©0oõƒø÷¾*ìÙ×Î!cì0 øºÑz„LŸšƒÀIìPjd¨¹²×-yg_}6› ¬BæŸ)çð«%ðþô vaÞž÷î¼óND=ûv½»sQç¶³ú}y‚ðoª ºtúÒ½¿Hàhu?Žl?ÅžÍ\4–LÊŠÀÑê~|õûK¸÷·ÉÇÏ XWÅ+SÈ^s¯_8­ïs²ôE£ñÁï̘5kz÷nB¹Vúpæî?bø­áÓ_ò6„ƒûª0A>?ûÕ€Ö&Þ×2ÿ{&é:FEjÕ$uŒŠä¥j‰ù˜ëdzÅåFˆm.L:³Z­HLLÄ;±|ùr¬X±·Ì‹EQQÑ 2I©>ߊ3ø!ÑQ„BÌÖ××3Oࢢ"tuuA¯×£¥¥V«UGýHšÂÉŸ.Eûv½FÖ¬YC/^LÞ|g7jO…Ÿà7௙3¨räÊ¥o`±XßRò, , V¬XÁù¾Onn.ÉkÝ컺º°{÷nìØ±÷ÞÿV7€€ý¡N¹¹¹¤  €ìÿî²äŽqdÉã˜ÚSxÇʗý„ìÿîžA—¥ÌåÊ•(>Ž‘I’¹U¯é­7ôØã¨ësá§ |úK>|‹zÍç¥j‰÷| >mhÄ™………hzëAÝþCí÷²ún’OÒŸPY¥(/-•<à´bš:œ}8àì ‘˱ˆ·ç=„ʾ¿LŸ×ñÙ`¯»ò-ÌŽÛYÅÅÅ\{{»ßZ+--%«V­ÂªU«°`Á‚€¦ÌEc eê?{Œ£ÌŸ G¶Ÿbß·µµqRÌ¿×,VwîS‡¸÷ö]Fÿ®YDJõOI×_'ì=t#ë¼xÈ©Bvv6†ßúJJJðÝŸ¯àGõî¬9Å?·w7Ž… PÔ¾ƒ_wcœL©·D³ä'Þ |Tv™OÏXW'’’êêêDY«4ˆùüÂX¾|9bõç°qãF¼ùÎnƈ¥„ €ßŒEEE$77—ìÛõY¼x1©¨¨àòóó9z(I‘0LÐn·ãƒ„X$%%¡¦¦F”/Ø-íÿuúOØf}myáPí)=vî܉¦¦&̘1W.}vÙW_ZJ Èb¶¡ü>ŠŠŠÈØ1v|ðá!Ƹ6n܈?}|ÉÉÉlÎW¬XÁ ëzá¹ù"ÍDqq1—œœ £Ñˆýû÷Ãh4â“O>a’¿oyJÜ¥½{ðÛgù œÇëçà‰GMЙÁ´Ná¾^Z*Y99ŽŸ,ÃK·@ù²ŸpnÄÂC]u`?6l؀Š6£üùDLRÈñLú8?†Jëüûãâ.}~×r{ͼ'úîÝ»áp8`š¨…qYž~íwMÎSñÊB…­p4#/ŒÐ~&_jƒ÷| ¼ç[D¾Erù¯‹Ó“uqzò€ÓŠƒÑCqÀÙ.~8¸øá˜ßÓ…±%TùŠ;N4ìÖïÃØºººØ?HNN†^¯…õ¥ÏsEEEÄh4¢¤¤EEEعs'ŒF#vïæx„-ÔÞvmÛÆQ@¼Í†¿m;«Õ ç±cˆ‰‰AßÈ‘Í_o| Ƕm“Ìàú§˜(¬.(@ÄÒ»³/,.Æ[‡à­ÃGŠÉSà>|qŸþ• $Pö‰¾‘#Ñ®ãdu¦l<øËéxð—ÓY_}˘ÍfŽŽÝs}³L*˜½)ŒñÏ2©0ˤ‚jÆpþ»½‡ŽÃh4²q¬¯¯GBÏHÔ›µ°¹RøWCá(ã¿~âh\·äÄv'B(¤•Õ7pc•QÓ ¦©Ÿav¦÷¾·3fÌ@ïu6pÞ:l½Õ€éåëñóºhØ´'ê¼8?äFß×`s uùùùÍ*ºjÕ*lذAr/Sïûý´j&¢ŠW¦õKÒIÄܽ¢òmmm\Ò²Fä>uˆ“z¸ÌEc‰ÑdDò§ßàˆ'U¶n¨;;pOJ4FþêU\Øñ ^ÿ¦s ˜¤cæ„<ÕߣɈs Žl?ÅÔÿî&7Ò#• —Ãt5áÁ¯»™‰ ò–Ûƒä®Âó#ûÅ¿Óx~!QÆ,ô¤¥æßƒáÕ—–’Õnì߿˗/ÇÖ­[ñÀϦ`ÌØ¥ â[¿Tþêu¿ž7ßÙÍâ4/^ŒO>ùÄóú¿=“>Žü6Y“ÉD’’’0þ|dŒµ†­Âß·ë5rïýÀâÅ‹ÑØØÈ¼ø_}i) eC§0«Üš5kH¬þàoÛÎ ˜ÿUÍ ™Íš5kÈûï¿øøxÌ™3G¤ÆÿÓÇ'ØÁ €½_AA¹ÿÞ”ÑK–½Îp„} äPTTDÊ _à /Arr2–-[† i»Qþ°™18jo6Ϥ#3&N„ûßuˆûd2^YÁç GpŒL‚ÅbÁœ9sPSSƒµk×âÈsÏl7/-•‘ÌbL¥âᇮÂxnštGª¾5kÖ©S§âòåËhllDuuuH¡›@i¿ÀnðGzùÄc4´TÊ7‰Þú0u?Ï bwõvãt´sïâoñ»>ëÂ×ÑXP›v¼ÍÆÌ‡Â À«Ä…þ¾L¸  €ÄÅÅ¡ºšW¯ÓòóæÍ‹E‹aûöí(**‚ÐnÞ7’G«»Ç¤ÄÆøà¶ÔTœ‰ÁѪ*ÜcRâ/f>ÜìØ¶mÜÅÔ‘„ Yê8Æà)Ãlr&“§Ü‡ùz½ 'q×@VQ:B„CªÎo¸šÄFgâoÛûÖ=-2sýn™ “¬êéé˜>“~gáÇü¬ù=öïÝ‹½{y½ï!î(‡­[·rT˜=‚×0ÔœçM4ÍýÍ,œ12Å…¾F%31 ×S^Z*)˜u ü÷8å:†×æGue&ž¼/ D6 …Ì@Í¿=ŒùO—áD¨{Ž+--%BÕ~ii)ÉÏÏç„ÿ¯ZµJÒŸ>ãûý½¿HŽV÷cRV¾úý%rôj„‚‚”]ß`0O½Ž1~úŒï÷ S´ð RÊÆÆcWÛEhµZtª5øKc7JJJpðënÌöºPeëÆQ·Çù§ŽQÙp9Ò.r,kM}xðën{ü…ÝÉ.û.nþæc$wý“uXÈx…·ðúúzÑg`€ùF?˜Ø¢¢"òõÎNÜu×]hkkã6nÜÈQæðàAIæ(ücȰ›˜1gΤ¤¤H&‰ùïBåË~òƒ2ÿ¢¢"¢×ë‘’’‚’’’AÙïkOéa4ÑÑÑššÃ :t霜Æü«««1fìRüzÝfÎl6s¯ˆ`EEE$Vùùù"æOûGiÅŠÜŠ+¸ç^ØW^y…¤¦¦²ß—,{[Jž€ÕjÝørrr:–¾†¼ÕO2­Cee%^YqI=6óÏKK%GÝì?v Ûoš†å?çUÇáØÄËê¸éZ±xñb¼wŸóæÍÃ{g£nd>xêZ×á&Þ<—cPáñ[† óHp_Øœ&ÇN+>Pëñx$kåâ‡cj÷eÜÕÛ„œÆü÷UÛ1¤‹ó›³ÙÌÛ¶£Ì¿]§ƒ^¯g¸q(&g)p¸Ú ³Ù,y¯©©AJJ ’““‘œœŒµk×âÍ7ßÄêÕ«1gÎ,Z´PRR³Ù̱̂WÛž”Ù3# ž8ê‰Ñ7r$îš:Ÿl~w¾´G¯Íÿ¶í òe§X» ÍÜý]=ð6œDßÞÁA·ý?º«  ˜<ªir¨¦É¡}(ŠÉSð;{/>ÌÎ95}Ð>Y­V4‚9:S6ªÍ"æOÿŽC§uÌÞìÙ×Ï¿zz:ÔÓÓïA̘5 ³gFÀ$ãz™EÜÍf3—––†ÞëlØÓZ—úšû›ùT¾5Üj®[ò âãã%™ÿ$…æƒwa2w?P`ÆÞiø¥V507æŸÒÿ òk_êžãþB)<V­ZÅxJ{{;)//—Týbþƒ|õûK ö~h«´âÞßN$™‹ÆúÙý…Ìý’t¶?î~û<*^™B¨Y â•)¤©${ͽ¢ödf³™«1×Àh2bÑš[¡ Ç7'¢S­ÁŒó‡P×çÂãëÆÃ£- ÌàÓô–5Ø9 Û{Ö忍9à »“;~®—ù¤G*ñÉí˜&j`>6v611‘¡¯`xò”„Z¯.@/ IDATÊüËËË™TµfÍBW®\)Ê_þëu›¹Ï>ûL2U'm_ø™Þþ™ðQ^^.RAÿwö;&ú¬Óé$AEÿp_Z³f Y±b3·¼ðÜü°}6^}i)Ù±c¶nÝÊÑ[(Ýè[·nå‚…Ò Cé|oذAø{ÀP!S¯¨¨àJJJ0kV6,‹ŸÖàÊ¥oü¾«¨¨àžzê)î©§žâV¬XÁ=úD ¶”ßyÉÉÉ~}¡Z£_öUáWqG‚‹á™Ÿˆ™+Ñ¿ü>§Ëun;Lšà)Nì¿n ¾\:Âoþ Ù´i6mÚ„U«VaíÚµX°`6lØ€òòr‘ dþ”¹Sæ}ë/†¡|/èÜú‹a¸õÃðÕï/1AÀ·]Jïí»ŒO½+geöé÷·a–I…»ß>=ûxoßeQ8  àí­ßò±±Ý‰pð≛qÃòÑ8Ó3¹O℉­MM 9dÃåÈKÕ2”´¼T-1MÔˆTm”Ùawr÷UñÁ|!1cÆ Ò 611v»f³™+..ÕÕÕ,ÑËéS›–°¤È·½!ÃnÂÖ­[ù$z=222ðæ;»±î×óÙ3Ṟ|ÙODñÍDhï 7þõ™ôq¤|ÙOÈš5kH]]æÌ¦ðÆá–÷…s dK~±î$Gû/4‰ è\:.,[2õV¶X,عs'fÎ}’£·òP}¿:ödeeù9\¨vK:^ÁÀûÐg„×f³™{ô‰’މôFCíÿƒ­  € vSÀ²ƒA«L5Ut½Öžò7[ùRY}G׳™Æ«>[VßpMå²²²P[<YYY¸´wOÀöéw³½.LNJÆx‡Ï¬=ˆu: ¾ºŸÓ#•˜žÉžkHÀO#¢zrssImm-jkkñþûïãåo†ààÁƒØùú!æ”Ê¢¬¾Û#Sâ‡Î>x{ ?}?}û¹ðäГøúŸÎ…¨Ý‰ð“ÆŽ;ðè£b÷îÝ(//È$ eH¥OÎ}Êl'þòëKPž7BêõˆÂ*}†Tòÿí¾ËœØ'_ƒ^9àÒ¿T ÀsÖ\Ù[ vîÜ)¬9{¿üëYüêù°Kv¡s--™šŠª­§„aµl×E¯‘L„ô·û¼LNœZV¦”¿´$0Ý8òú£Ñ(Ö¶R³ææf¼øü7Iü€ø’ÐBoÞ¼Yˆæˆ&-ûÚ[Õ‹fØ¿?ÒÒÒ0mÚ4¼´v7¯Ô–••ÅÛÁ½óï +ëN +rƱ²²2öä“ObÊ”)|ãÚ°aCT&€ðʺ“¦„AX´h`Ñ¢E fàóŸþDÖ‡”ánO¥p- JKKÙòåËÙîÝ»#ŽÆOÿ»\.nö &àuÖݯ€ˆ×sÏþ»L2øôÓO£5З²wùòålÕªUÂüùóeN„›7oè)ÊË˹TA>;wîæÏŸ")„ !ýãÿˆŸÿ&3›Í¬¶¶–Ks‰‰‰2‚-Œ§¸¸˜=±ôf¾Ñ“Ÿ@nn.–/_Îú“þ¿ ïÄÖ-˜÷ÝýXµjUD‡/:ÿD€aBjª}~,Öj§F‡V‡ŸO “ªëñâÁOÈç&«•œÒšbмyóP[[‹ÊÊJll(À#<‚ææfìØ±#*¡rÍCÝ.¼mïÂC'.áW_Æ…3^h;Úáš¶¨Ì¤«—ñXº‡Ü=x؇mg]¢Ô_í2S ƒèA¾á´@Ÿƒpss3’.u•˜¯Š‹‹ÃRÛ¹s§`·Ûù{’‘‘Á {{;¶nÝŠÕ«W£³³R•;¡'%ñŸîä„B¡ _ÏÌ>Ž÷¶œ†6/ûl«o’W /­ÂwÊ^“¯I¯tüµÿÔB`U˜–—‡›*öÃôäòˆL …þQôÃV{GH„›7½ŸF£ÕlglI%>Å$Œéøÿ7_8É×Àf³ ¹¹¢#{mm-***Þ€3]áÓº`át:¹V†ÚÐüQ#õûøf|­ë3l,¬@ÜÔiÔPÏÂE€QÌØÌ….JÂêŽqá¦Ï±cǼúê«€W_}U–uÞ¼y‚ôRé“@}îo"­Tf;Q]éÁâ¥FüÛ ãç·¶¶ ¤jZþ˜<2}'ú°ñ±œ1 Óð›Q0g,#)ß`0°¡n• Á/?éÆÌ€W&ÑÌË( P¸4޳’<¯øÌ€õÉ W»LQS!’½ÅKJJ’9üàvi_ÁÎaD0&ª|¦úúúˆÎ€;æßÇÎߎ3föîÝË¿× §óïüã{²cä õ‹_üF£………˜4irrr°páBþ2í˜Ûì˜,¬jEÎ8v~Ê4Y^»ÝÎk"ÔÔÔD”FˆØ'%%E,JÓŸdp®†hñïáÚJ+¬ $ïC¸ R§½þ®KÌ='V«•Ý7w4Ž¢åÅç¿ÉN}¦{ââb6þü9Cþ+@šÜ/Сè½ÑÑO²à„Ô4LV+qÈë1iH‚·<•^9ÜÜ\žÈ…ò Ûq¥í‰ÈÓ_*#KyÔƒ‹x;¾J…!¦åŠBÍËG;QäTs-ª  P4’ú‰è;=\”%-»ùæ›§NÂÞ½{ÑÐЀݻwË"S€¾D@ÐæåÁ`-Bº JÿæŽÑøéƼo÷±cøÞCCüPÈ>Y­Ää85™ãpÔRUÁsÔÿÉ:”¹=QÍIRÀd2!nî=pØ*øü#í9Ä”¤õÑ‘ø‰ã±|ùtØW©Ó‹°jÕ>t9Žj6---HMM•%*..f0 ·âŒç f+Oð:dŽ”®™ÔaØD-™¢Á¹3ŒLÑ Àš€IÓô˜9}’ÿ Ó‰ÛÑ}°û*!Ò?AJ?ˆرcg¢i¤³sûAñaÁl63)Á—Jÿ@Ÿƒ`ëA;ÌSŒøådÑÜF1ÿäè÷À+爌AêüF<2}fXãC"4y)ñ€og  «¨6‘Ö76Qˉ? ¬µµUÚðO|˜•,zbîQ¨qµË„;3k¤ ’ÁÎ~TÐEªºÂç‹&ÿ`¼¶î× Ñ5ÑJ¬R]åiÓ¦Ád2qâ/ÍÔ䥻ö`ÔοŠ_sîæßo»í¶°"ØO°î=Ñé§¶¶š>Ä£>Šœœ™ -Xrß1ÿ>1¥ë*çvugZðï.'OFøët:,5‚KJJs8B,ÄÿÙgŸ•­ÉÛ/…”ÿŒ„àòªþóŸcN­ÎÑ/√‹Í›7 “ Uüe¶ÙlÂ{[NsßhŒH‡ý¦¨9"<ˆÚSÆ~SQÓšÑçZRdKû¸‘íIêD©þÁE»u0ñĽ€œôÂù3H÷‘> —Ë…ŠŠ äææB§ÓqSJ$ж£M^Ÿ eö(Ôœø_ ‚‰?î ¨+F*¨ó5Xª•øàÎyŽGá8SnìtŒ┕•±ùóçsâ¿{÷n\¼x™™™hnn–б§Ø~mž˜Ì†k'þ5º5º%,ñ'Tûü(s{p¨Ç‹Ã>?V…½6/ü'ë0u|žl‚Q\\ÌZZZxU£Ñˆû§©äpÈÞ‹` d° š‰6ùM½hiiÍfZZZ¤Ý ¢¢oÎtÄlå œ2äÄŸ¤ÒÔ„#þÖ ÿÛÞ„ý½æìpZTz¦ÈÈC£½G‡ö»Q0g,#À_~} Õ•™ôo6›9ñommª¶žŠŸ:"?uD:ñ€=ûÅñþvßeÙqBÈC@„pË1÷íxl¤¯œóË´RmRmÀ¼yó°cÇŽˆ…¤ÕüèX8IŸŽ§¦¦ò›HÌõ±iÓ&ööÛo‡¤¹4›ÍLªÀý öïß/ëƒÆ®×ëa2™dé8¨Ìlð‚×@ZäƒIBRˆtýÞýú¿á[ÿûàßu:ÊgÍDé®=Q¯-]ów¿þo(ݵGÖ.x<Á㔞KcÙìÖœ=Uò' nÉ’%ÈÈÈÀ“O>9 b@ã<§;ï¼!÷MŠHÒy¬Ú’ÒÃ¥ü¥TÀá4P„X2DF eŒ´A ¤( õC¦›kmKˆ¥9ãØdµËêDïò­ÿïkñ˜aÕC;mÜû÷c¯ÍÉ}Öeá!ÛÕ¨’$½»DôIbeäì€k²R·XëÀ´\ÙT8`r¨”f¦úϬ&/--edÿã7BÒß’æ@ HéuÇÝs¦LUá÷k æO·ý€ÐÌ4g©©ç SjîÏQѱò·G«ð:ë†rÒt:ð_§‡GœBÿpÉŸ|¢iüYû˯/A™í„ÿ„ž;ÿÿô,ïüùDF>iöÚºñÛ}—#¶ «~û_‹‡í˜+$Ž^ÿi*¾_®€ÝpŽk¤nbáÊFJ\ ‹ênàe4éÏÈÈÀ† dýL›6 v»=$,0œ¶€2@ÑÆb0Ùóé!ÄHiU%©ÍŸÐ߃p-ˆÆ%Ʋ‰¯,Õ¸Â]÷zÇ@‰¾´Û#<‚ÏNý ö›dy–,Y‚I“Do`z¹¤}—••±²²2~O¤óyî¹çðì³ÏÆ´O,½9D:"bôܳÿŽþ=g ¥ ÔwÞ‰ÄÄĈÑ&tÞÂ… QYY)s ü2áZžÊ0þ&1tÊš§Ã/?é9¯¨¨………8±å7X¬KëWë³éj£aV«•ýÄ{†"Žq¨Ì›;—Qø_¸8Á× çIÿßÿý߀uëÖqé?Òs&e.ùû.]{_ņ¢iQú»”à†K£üÈ„öà««åÑôûÅÌìH}J‰¿ÁZ$Sÿ}){ÃU–%b~³én_*æ8^3®\ú„«þ)S ” ä>ÔÏ´óG0-O‡¥G´|_´gÜ-w*°& ÊÖÅMøcÆò¡û`7þg}~vâJÌ÷ŸöÊwCÑ,ážE"þ´gÿÛ C´T¿ÁØùó‰ìW΢e:û/…Œoùq"þþ±xÄ+çÄ›¾åljØksÂw‹[¾3¬qÁ?–øK'­ì&K›üêÕ«QVV†Å‹£±±¿ûÝï°dÉ|úé§èM‘ÉUïRI4šÔ-½V¤±’ÔZYY »ÝŽÛn»MÆdsBc€Å‹ßð³×²qý«Bʆ0yý•Ò¤‚;ÁZ§¬¬,X,L™2…ÿIsòÜsÏ¡¬¬LfŽ’öõÌþ*"‘29wÞy'ÆŽqBjÿTâ´¨¨wÜ6”38ÿê÷×l6³"à ìj½ˆÕ«Wó÷–lþ”*®ê¹m´ÂJ_䨮u}E­Æ”¹ øžÛÞoñŸ`A"©8Vaˆ×üùóyâJ†ôi"i›˜÷¶jÕ>¼eóbÆcã··ÌêWâ1äWŽñ‘“ªðÑÜAÉñŸîD›ÁÀý"91–ÿmÍ:Tøþ~5:;;‘/œÄîÎ᜸§¦¦"_86·}ð?½ï*n{oPÈõ¤(¸ÛȈàÀ¹3Nß~³3‹}Û&Àð£PwH$Z0¢=»áêH¥iôý‘éC®WØÍJ*ù>6R‰×®ˆ!17r³ú¢jB_ïõÃ]GÊ`PÙ?¢¾üWˆ ×Z‡[Ú6˜øG2<÷Üs2âEÙO}¦—yû†«ÇËxþÕÎdŒš¾ gÀ״ƘUþR‡áUα@R€h?¤ €´ïh}µ?ð-–¸ñÝk¾GÄPÅ¿´‰¤Ú—šFhüý9uKÏôû°‰ZI˜ýÍÎ,öƒâúkZ‡à × ªX¶ÖŽpæw |V@B8á†k­S­æv¡hä€ü¹–qô³ÙÌnŠÃ’TJþ¹)~Ìr­§ V²ô±snȸ¿Âÿ]„ u w,¤N€³õÚöîD]?xvØ .ôa[~.ol_0‘­ÈÇfëµ²õÛ–ŸËfëµl¶^Ë‚ëmPÛŽéüø3‰F–®Vñ>ÂÍ‹Ž÷·"gk›T s$mà[²ëv®^ÅÛR?”%q¶^ËJ²2y[znJ²2es vt<Òú|˜’Ä.f¦°óïc”ž’¬LFDŸÖGº^ Ò9Ñ”XoIV&'Ìt>õßV”ÊžI42Ç‹cù<Â=¿í|‹#bl0XÛ¤6[¯å7mÚÄ:W¯bm“ dÉhV䌓Ýg§ãűìÔ$æxqlÔ9Äk8Ó@D~Çüû؇)Iœy+ÉÊd¦$…0Tý’îŦM›˜4Qå?©ô¢2‘2—FËhŒàH#)|nðsëu2žÁbᢤ™”ˆð¿»þpˆº‡ˆ¼¯~kˆê*XIsò–Ëmas/Ö:P3$)$†˜ÂÕ\.:ºÚx"úttµñìváÔƒ¥ïf3GÃ(Ü ‡7­ÝwÚ‰ê&þ]ð7CÛÑŽtµŠÝ?†ÍÖkûÕ¡ß¾àöŽÛ†wÜ6þÛ;nšN…®Ý—±f<üGö%-yúϽsViñÞ¹ãX´ÔÇÁ0 ŒI¢Vè.xÛÞ‘ 0 ,Þ%z?'f¼X`L@¼« ‡CxC¥Å……N{XZjèÖ% ªÛƒƒ7 G‡V‡tµŠƒH‰…hœ”VüþŸµ`fÀ‹QÏ_ÀÌ€Ï$Ã2%Y™ì]ßÛß}v4Á÷ÂÛö.¬õ0üþÊUX.·!˜¨©©‘e†´Z­¬´´”Y,Ìý…FXVV†òòrÁáp{jTu{¸’4ÿAU·4vZkë{¢Í›ŽSHõdµ’·¬VÂ`0°µq¥‹¶ôWšìXëaÈ_ñÖzªº=Þƒµógùµª;…= 52NžÆ…ë}/<„ÝËWàkŸŸæí764òZK5bM—= 5îÿY ¾mïÆý?kácïÐêP¯A]G[šq¦7¬k*9ˆ5WØ·ócr÷`²6¦$1}ëy¼¦5¢ðÈATNœ‚Ssù<(--eO>ù$rrrˆN½›6mb•••X¿~=´§N"¥£«>þk¢}YêFÏý[¦ÌDrð#;vì1–.— cM¼¾õ»iÓ¦ˆÑ>Òç3Íø²¥‘ç õhi©æµ4“Ò'kÖ%òf³™¨eh7L‘Iû· ô•†$Îv[}ƒ@ß-—ÛdD^úÐOridÄß`00JÐCVЇLV+èùïáòÌY ;ûöœÛ‰3]ÅJRοÞsX±ÜˆYÉ›ÚmêâL@cü#ø›Që2ò1;{nDF éÔVá· V†WU(#ø^U!ÒÇÎaÛ¼À¤Ú/+¤Î@áw´<èáÎ%; ÅG_ÏØˆèLV+eLýa 8H»wî8öþ–[:l«‰é<"þ‰J…ìØR€¦»†r¢Ð¡Õám{WØöCÝ.tëСա‹1”OÄZÃ÷Lâ»DLó;ÿ•bǧ|ñ®.Ä»ÄTÀ{j¬¹â€N§C‡V‡ýÐ,c>¤ï4Uš§Ÿbø‡º](ˆ×`­‡qæÃápôn«o²&«•øÝg§ù\å*¯K°G¡ÆZÃ-†år_r+›Í&”••q&€R——— ´YÓ^7[¯eCÝ.œ2äíÉCþ¥?“ZkÂÌ€H<‰¸<×çhJá“CÝ.¤Ôe¦cM † C«ÃÌ€Ä|X.·ñZ ù*%/­Á“¥¥XWT(ƒô;Ý_}üW¼ùôSøä¦Ñh›T]­Ä´thuXªS=Kçç|~LŽÃš+<ßnj†$¡f°¯Å»pÈ݃ÑçÏâPw ˆÅ©.f¦°ææfTWT 33î±büÿ§—3‘-VÔ|ä‘GPYY‰½{÷¢½½ÚS'Ã2@# ÝŸßéÁ\ Ûž=!íkjj<Ì#ËWóЉK¨èöÈÔû¥¥¥Ñ–-"¤ ò—E  úâIƒ 4Ðo€¸!‡K? 'jûæ"5|kÑ$$:âÒüø¥dš‚gLJèk†$Ár¹ SFÆÃr¹ R† $+“½Îº‚âp8„æ‹§Ã:€›É¥¢`&À`00£p+öœÛÉÏ1èܲ¿{Þ¼Wêd@yy9?¯µµUè6uA‘8 ŠÄaèÖ% [—€.Æàò}ŽÕÀ™?#7Ý‚gÆß–h:µU¸_k…ÚW Rù7Ú*¨}•xµp­<ŒwÜ6¼PµB܈²ç~)™ cÒ¹U–§<øw 6&Àh4â©Û‡a‡Ð†§n6`m@qq1»´ð!ÌC¾J³ భ暘ÚDòUJ,õ†Üh(--åjáX™"þZÚý R(ØÌ€k._ÅÂ[eéœ#¡ÉëãD¯[—€Ò íÐétXëaHR)¹”5êù ²vÒ̑ݺ$'¼€øŽÌ2'cÔó0ed<žI4²&k?3àÅóíö°Å~râÔX6Ø’Àö‰ïäP·KÂVæö„Àªnf™“¹t8êù Xë‘"²Ùl“O>)cNf뵌²’J¾®Ç‹&¯Ohlläc¤}‹Ê/ÕȇO„² ^ƒÓwepi’ˆ» Œ p81K5–jÞ†þ¾mï‚¿ùsÀ2}<O,ƒgá"<øÁ!}JÛñJ­"ATdŽãZˆ¡n–j^9x.u=^þ{‡VÇÃÂGö¶ÿKJ2~0>ÛnÌÖkE[kž5ƒý¼Ÿ×´FêîjjõÐØØ(Pd@å¯cõêÕP@7m:’““‘““ƒµk×òú{÷î…öÔI¬]»6ì\ƒŸq)ñ'ámÏž=ŒÂ+¥¿µT ê$éyêµÈRmA*Lº\®!‘þDŸþ™P}E‚7X³YÌÑ]\\ÌΞ=Ö µµµUHtDÞܹìÛ/MŽf IDAT¼À–—ãÒ€êŠ .)‰ ø¾Ý.+2²­¾A¨’„CÞÁ˜22ž3Ä$¬¹â@IV&»˜™ÂUŠf³™…“ø ô›OÛw‚o†ý×étru’Î Wêd´|¾åååx÷­Å2{eC¤¶:Ž3.ßç¨ëñ¢¶©U~†…w—¢ ^#[çí ^`DÜï×Z‘>vûpÂvûé=Iìîû®a(ÉÔ³/Œf%™ú˜ÚÛívÔÔØ8£˜>vÛ–ŸÌ¯¯r+€ÈÍ$í—¤¹ k9„}5ømª<d,Œ@IV&Ó¹ßwÆéޒ׋µ¼žu¿,}$Hœ®n¬ú>]­bEƒœ(2 Bµ÷,~0>ÝmF,kXZZÊìWöc©· ٧ĹJŸÿ&  m6$)’  ^ƒÆ1#Q¯áD3¤›•ôý¬ëñòì|ݺ„° „”øa\`LÀ*-È´ ³ÌÉx É–øI ·TMJÒ?1ý‡C¨êöð8ÿmõ 9áå«”!t]—Kü‡C˜7oàxS“ì<‡Ã!¬õ0î±ÝéHûPÕíN§åÆËU.>þ'î##œ4þ'î#›çÆôP e"¨5C’8c’þQþóŽ!¨êö ®Ç‹º/׈thuŸžÎ«øNÊú–®ÁP·K¬Åp÷Ýxhýøoo>ý^>Z I!âOã’†ópέNÆäÄ©Q/†ÍñOù=Îûü8çó£ ^Ã,—Û`;æ‚5Oìß PÈ´/ª©9ÈÈÈ`=))¸rE ?§„=»øñë}bý„ÄÄD^eÆŒÈÉÉá8Òû'½'Áªvé³;{öì°‚l‚ `œB…À?gp‘V¥ª0+9 ËŠKø2öX¡ú6ãà¸L"lv»=jèΰ©SqlËá“5k0¥´æNÅ×–-C~QÈ0;WÀ·_x!âH’>½Õ>?&¹4X¬uÈÎ{¾Ý.Àw…x<ßn÷,õ€ÊÝûP ëKRnS£¹ÒCUTT„–Ï÷!?OÇ39…‹ï”®Q ýÈžÚÅú.ᯭÄH•RMÀ¾ºÒÇÎa^U!6x^Ñ©ðûn?ª{*q¿ÖŠgç?ÏÒÇÎaï¸m¨î©ŒÉ/àîûV2 º›µûŽc}í4ÔÔØúk"ÃOïIbTÆùåuáëƒBnšNm¤×_Ö=U¼þ »Ùï­ˆ˜†X l«iÕ’ [M l5-øù_ûª`õU’•ÉŽ ¹øàÏØ¿?”þãH;‡½žu?òjßB™Û­9àÄX`ƃà©õceÝIa êû‰we`Æ¢;v ~xŽ‹êÞ‹îì·myy¹ð°&kÕ 80|$n»í6¶Õ`EÎ8ÖþÀ·ØžùSÈX˜Ó A¯çj^÷ÐDz=Ö\¾Š5WxÛÞ…ªnߨƒ ÙP·K¶aÒw" ­­­Ù™­×2éf+mG>oÛ»x›­Ï$Ù¶ú!_¥DRRf™“‘­¸ô-L2'NÍßy@d®Ê‡'ÊæPR]+,Öj0Y­Ä’1£eó VU——— «W¯Æøôôµw8ÂÌ€(åÓ¾ÐÅ â57ù`MÒÚž&€´”&y©FÀ!¯˜ ycC#?ÖˆÏõ£Äk¸é€ÚJÓtç«”x¨î¯À93à…b„¼ ÚøôtŒÿÖýÜî?3àåZéõ€µ]€4œ1{j,5¬M®ù©"¦k_sÅßïB·p×ÂqÞçÇl½š›ÅðqÊ9Z£Âi¿¿r•›L&~òÀ()) ¦ùuÙl˜5U‰þp¿Vbb"&Mš„ºº:”••±œœ˜‚þR“#ÒùZ5¹9“%…½Ù‹]²½ »;‡ÃjIÅô"qÍ.ÇáfÓ/^±Dò…šW¤c¯u:A>Áa‰4’¬h:ƒµ=\óѡա®ÇË}–jL9 +ëN í &2’þÈÌàÏ/ø™/Þ¶wafÀ‹™/f™“1eded|ع+FŒBàüY¾vŠ£øüKKKh8É™ ô]Hÿ¨¸¤¯Ì°óý÷•Óâµm÷¥`¨Û%ó¿©Râ–>…y]W1B¥Ä¼®«˜Q$j!<»ÅH€Cî8œóùyä@åD±pWee%î¼óN477s3ß®W^Ĭ©Jè¦MçLÀСCˆY$ÿüç?‡-.vZ«ò}Ü꺊Ӛxþ[,šJT%eŒijc ‚}bj$ÁŽ;p13…Õ¤hnhÖL^akçÎÂÙ³gQ\\Ìjkk9# ½x8õ+m_[¶ŒGdç ¸tàò‹Š¸çkk«@ ƒTk@Ò?=Pk®8PR}Q ‹ràT%H2Õ>€> À¥xYT@$‡K ƒº‘3ôéµr)Ú‰ ªdFf¼«‹ÿÜt ”¹…¨mªÁ¹^{X'RpYs‰‚Ñtj«ðBÕ áÕÂI¨VˆÒÿô|§Äçfƒ—ÁwŠá÷Ý~|8a^T@Rõ_mËE»ï8®¶å"E!Àø.øñVµYÔ'‹Í¤%¡cÁ ¤Z4g8òqEÌ ÏöÕ«þÿCµÃí'yFµpÏŸt#;–ûmªß ™ÿ@ðþ–“BNœãoŠÇø›âqïÜqNéIyño~ª„Û =µþ¨aˆyÊ\Nü¥ ­Á`ˆA@[¸Í©®ÇBć|/iŒ.—¸¹“dÿ¶½KÆ, Öäõ mmma7Ô‚x ¯Ù­KÀ”Ï/ðö³ÌÉx 34IëÒñ“}Ÿ6ÌJ½k=Œ«ÁIE/ØVß ¿Ædµ{jÌ ˆ6óµÆ%åYædÌ2'c­‡…õA˜­×2b‚èX‚ €ÿxÄAƒS˜ðrr>œš‡7¿‘Íû[`LÀé»2¸*]êãðxxŸVÖÖ[}ô}ö×ê0Y­äªg©É±’`‡V‡euøÝgÎÌ2'ccºXt‡Bg™“±ît3ÞØ»¾ðsÌ2‹ap'OcÙ¨hºk(f™“ñaJkòúÒ–,5‚3WËôñPçk°Lªnªº=øÏ;†p&a1Aö,¿ü³ŸbS ÌÖk¡žXˆ—Ëë±·BdF&ÇÇñgìþê=>üzûG€ùóçã§7ò*‚‰‰‰8í«Ä®~ìÝ»G uuu˜3g¦L™ý[a·Û¹f §5ñ¨Vi°}ãñäZ°q &ca"™Èb!ÿªI-«_~PKTÁ6ÿ;w ¤!ˆ4:·º¢í‘«s÷–·ýdÍä…û—‚˜rø+ÉÊdÏuc²ú j†$¡ÌmÀ²Á†8X‚›9¹jŸ ôp·ùú$þ nNò0ñ¡çžÿêF8\Z8¼"S@Œ€K‹êc.À}D€ï¢l-È6TÛTƒÊÞ]ŠNˆ/fnºýGâ5꾺ԾJT+&b_]Õ=•(´X±P- ºG<~ÈrƒTýé#\mËEFr-&Þ!jeH ކŸlsž+†+‘uQÀ)óHd]øó—>v»mâ"àêÂûBM-f&€@Q=|WLiP·Õ7¼·BØVß „›¬˜­×²›Ÿ*Á¶§°­Á)L²Zbnk6›YI¦ž.ø‘}JŒ"ȉS£$Sßoèáoz_p:X2C47 tóVØÀͤ· Ò1©M=ø{]OŸÙ@J¬ƒû"B|}Úø·Õ7Õ>?–ÁËK£ #Æ„æNL¡ ^òþ¬¬;),Öj8SQ¯ás ú®Ö‹ØÕzQˆ¦§²²2¦®ä .g1÷ãp8Jh´Ýé†Íì+A¾­¾A8PÛÃ×€$} Ô)_®%è¡o7ñ)pfÀ‹uÙ¢¹‹ˆ?lL×r“]WúLóóà ?h6¬Ç-[6ɘ€ Pç‹aÔÓg& $+“5y}Â,s27'Tu{ Ì°óë®ËË¿/Õx 3BÒpT÷Jóäspi¯XAôSõ°æé¸– 6`´ZlÈ}pÕG€aæÌ™¥;¦²ëXúõ¯ãÈîÿÁÕC|úênl­¯ÇîÝ»1dÈ̾= A,ÉÙ¤û²ôü.Æpüs9Ý~þ¢½§Áþd±BêX~#¡WŠò¡Óqb €ÈØ­­­‚Tí¯ÍË“1úÍ ý|»] éÞr¹ Ï·Û…ƒçú|¾+ôE ±œp$©^+èû~“0tÓ2Çij‹—4ü¸”0¨9SàpiaйÑðY·9&žÍ›3„eމ—­…àU[Ää¦[ЉZ¬ØðA9n[0 ñámHécç0rÌÁ¯ØµïÃ;n¾¯ÄBµÀ‰´ f³™Y,V˜¡­­ D|’ùdÀ‡J½¤õ(ÉÔÇÜ6}ìÖtj«phÏ«<›VÇ…Oñ·¿¬Š:n‚Íf¦YP[[‹¶¶6쫨ÁOï͉ùú×3³ÙÌâoOÃKkwóP> ŒåúEƒœ\ð#þö4,õv¡û¯ÍP WB3~fëµLZ>Žùk1Ôí‚¶£×ö™l I÷+(t.ÖÍDj;'4y}…Ä…õ§æÒµ4*8ùÔC*Q‘ê6cê—›Á``Rí¡$+“•¹=8ÚÒ '¤þˆ¡ 8˜ ³ÙlÂÁƒQòÃ_²ýÑ:“1Í…À”)SB®ÿÒÇŸæ{ ¶/W‰kIÌÀZÞÀã:¾ŽDz{¿ç²ºS\ú'¢?5w$&kD鹤ú¢°¬N”¾;´:üî3ÑbEÎ86ó;ò±(FŒÂ×>? ÅËà;z/­â΄Uo X‘3Žùü<$–"(Hó Î÷De†kœâ¼ðÃV¬<7Oô`YB_ 4¤szñþáû€½gQ3Ø?8º°æŠ›¯vá„G쿪ۃS½ßÏž=‹LAàûæÌ™ƒ9sæà­§ŸNúÄòßšÆFìØ±—/_æ¾1@ˆô~º\®~™€pïÙþ) ’*?\N |Á:Â@‚…°ÊÑp‹AX¸ønRñûê· —À°©SynúÞß  €gìuÖ͵äiJ/õ¶úÎ$“Ð~ è¼ÖÖVáj—Iö[03 eÞ Î0Ts¡á³nQZN¹uJ€ÛüsÓ-ØðA9ž^ó#ìÙõvÔq©}•8È P'y¡6xr—üÉ0’S%›¨©±aòL±lnÇ…OqhÏ«1q•´áe]@›þ…Wõ*í®À”Ãáˆ8îàë﫨AÑ QsóË¿žZÓú‹˜ÿ½sDZ9ã˜ËåBö)`úTû¾xií¿­Á)LHMº–¯…IVKL&”éSMxX“‡&¯Ohòú‡Ã!¬U'` >RB®Óé‹ÿ†Á``a‡ ’þ>3àÅv§[p82éP· Œ Xë÷©Ô\î—ú ^gbb"½ßä=¿G¡Ycò- ïáÚ——— ĦM›¸}›$bPèÓ¡5Ò"=Ò\ZÖäŒÅ!¯Õ>?ÔöpÆ`©FÀ›ßÈÆÚ®>ŸõVŸÌë|²&ŠLù}Ø–/ÚáH› Í(øÉM}‘äpàø1êEâ©ð¿Ámÿ¯˜‡pG¾øyZŠHÒÿºìa2s…:_ƒ' z@Ï´qØ üêã˶w8Ÿwcc£pÊ<óg¡žXˆÉÚ8î@lÍÓa—ÁƒÝ.QC’­QèT@Ðë1y´8n0;;;±{÷n¬^½ííí(..f'7oFíÑõؽ{7¦L™ÂÍv»‡¯¢’‹… î§['fÁ´7{q2àãLÀµ¤{ÿ²† ŠöÖÞð+©Š_ªò®¨$ý-oî\v¢–ñL€f³™QX o6›Y»a ²s~\•5‡IÿäN-ôp' ¢cd¾´ñ;º™S¦º‘ƒDNRJüôpÇm*bD][šF•)Óx;õÈsÈÏÓa÷Gv¬üÍoC* ’`uO%ê¢Ç~°¤ìUâlí €X3 8@ðC)ŒˆUú“öQè´s[ë@¸ˆŒ\Ÿîݬ䬖Ô~éÿ±ÎEÎ8¶²î¤¬,õ@«OšÍföÝ!&¼~¹O,½‹ÖÀZu^¿ÜÉÇr{ñL²ZðÒÚÝaû5›ÍlúT‘Ýw O²)2 B…ã*Žßÿá}!I°Â­Í]ªÒ¤$&á˜h÷ŽŽu» e¤ã7 ,)) NghÂ-Ê`GïyQ‡ 8Ê!nK5‚µ´oìj½rÏc™{ðæLs% LpHÌ›7S¦LÁâÅ‹1=¹†;ÿIM+rÆ1rê›ðbɘÑ8äCKiì₩C÷Ánx«=Ø_ë¬&ÄO‰G÷Ánìz»SsGâ@í9”T_žI4ò”ÁÓµ˜7'å~ã¸ÑXãìFµÏ+нɌSâ3õ–QÔ‚Þòè`üýÕ+øÆ™6¡$+“ΟEA¼¥¡ÌTbȺ$\}¹Ýïk¹€æÑ8Öe¦/UÅaeÝIa¶^ËÎõF<7Ì„­·ß…á¾/KDø^·Ï^ÇrZÏO© 8…ö­_¿›7oæÈ%K–`Ñ¢EHLLD{{;Ö¯_U«V…HÞ‘Â¥ˆ&}‡{€^§ÊáJÿ¼Z]ˆ)7ZUÌàþº/ßH„%ê@ÿe£A•5‡ISKßzúé¨}JÃü( ô…&Ñ¢¤Üþá8³H)\›Xäa|ï¡aX¾âLØ€6;@¬pÛ‚YسëmÌœµ ¤<äÓ+~²p½ÙÙs™”!ÈQÈ+Œš(RƒâZû¹žváŽ_K͵Î?X"DÍ@4<)áþëÎó¸½x<µ~ìj½ˆe£FðMóöâ¾Øm"ðÒçOÊ$<ÿâŸy›ßïBæE;–cûÚGÛ|¤Ä:xó‘Xº~pÛpOŠà÷‰˜ßh!R‘6½`âOÄM*¹IA‰i*õưã''ÁH›x0S¬©’^'x¤óÎÍÍEZZÊËË9%É™ìí”~Zêy?3àÅ„Ô4Î ”de²ãMMbÇmé€ç¥åÇ t0|ßîƒÝðT'à¥?ÃÞ1¿úø2ÖzXÄ{µ1=…k Ö[}x©*O––b÷+«1}fÔùüýÕ+8}ªI&Å®E#ÕJô÷ìÆ*¡öÉpmƒE* ERW¼KL‰îzÒXj! ]/’š?Ú:_ªÖêDº±¬c0Ó ×ë‘­Làƒ5 ý1äW@„ecº‡¼ƒ1Y}…·™–+þf}ïŒ,¯4BAJø¥BÔz«ê| ¼ÕîÅô963CÝ.žipEÎ8FŒ\šqk‘°oÚ´IæèH{6‹Î‘~Ÿ7o^ˆ0ާc .Ć BþFcäÂ=KÑî,D¼¿÷0šTêßÒï…þAøÒ ä+|…¯ðŠ¢çr™£QÔ²ŒÈˆãÇÓ„Øb?÷¾©ÃýêLÒhPæ6ÈÚbÉd’9£‘#[°ƒšÅbAKKKÈq)²¿>õ3Ü!·st|Áã ¯ôw‹ÅÂÇn·ÛyH^{{»¬­Ýnç¾`ä¹ÿE#[ÑGšhÎÙ `p‚™ùo3‰v3 ®Tºá¬œ0ì®ßçÀ-‚ õ,€–ˆÇƒCo9#ìðfqãal 2™Ñ`2™øÑ_º§ÍÍÍhnn–ÍU“«Dó=†;ì°æ©QçÓ|Fõ™¹^¨nXÏ_\ã+|…¯ðå‡÷ˆZ$¬W*Ý(°ö™!r„þK?§ô‚ÉdBZJŸ/Có™>ÿ¡p1‹DX‘øgdd ¥¥…KK}„¤„@“«D>ÿOC§#ñçŨ…ÿxaŒÄpàöó`‰4Z›ÄÄDÙ˜¤çÑqrÀKMM ;ßB:§h¿(Û1I“€ÃQ‹QåOÄÞ7uHYèÄß¶¼…[ç~ÌDßƒÆÆF¡5û›l†÷'üçüiÅq`åxÜ"¨8ñ'"oͨC}}=F‹Å"j/¼çޏ90¶¢­­-„  uÀ׆M&<½éš a4C˜')³gQ(P -ʼn´<µ~hrûžg)c@Ú.½¾ïYu:Ðv´c|z:*Wùñ"ƒX¥Âqz½>4  ýoÉÒžÇÜÇZEíË€Ûn»íšÛÒ\køÕÿ_q#Ÿö.SØWø¿çq?œÇý€`FFÁ¯c¡Nhà>ÒÃ?pØãÁúу¡ÉU¢$µá2?WÜ€(Isá;ù|'_ƒü<•l³·X,|Ãïììä m¤hlläR´&“I¬‹§‚~¢Zö!(üÇ¡ð‡+%®”ÈD—ú¦,’—Ë…¶¶68NN4‚ÇÒÙÙ‰ÎÎN´··Ãh4Âh4¢¹¹­†&è'ŠëJÇé#eh"¡î|» ß.ÈxN²Êv,Ö:P ìKîPއE“‹&ÀÑ·b’FƒI ?7MP iôA|÷ÉL€~¼ÓÔâ~C3×>ZŒ€wO‰[ï£ê{µ.—KLlç*M IDATï=ôG}}½ø{}=Ê7lïsþîý=ܺ“ÄŸššÊ>“ÉÄŸƒÎÎN\عšÆFœ7™ ³ZqóÍ7èÓpXÇÛ¡ÉUŠÒ?k‡E¸Œïª¯Â¢PÀš§†E^«õ°Ï‡}nd+d+è϶pBˆDŸ>gÏ pþ,ÿ]¦X‘3Ž=TQÉíGä!½"g#»R¬©TÿÙ°Z­lÑ¢E¨¬¬Œ˜À(ª}~мÿ/¡®®.$‡v,¿ÅŠ|•ª×ðE€b•·Åx>ÝÿU«V]ó5ÿ/jnôýÿ§µBEú'bŒw¼CElïÿ5lˆìwé¦;£Pô†×p‚h“É„ÌÌL˜L¦°*q)¡ –¦IºítŒŽœãç}ÆÆtgZp&‡Æ †ø5KÌRBN}G²e§hnnFaa!ϲ§:=ö+û!ú‰J8ø9ñ7aû 9Z,ñôÒFä<¹$v•?QFøqa½ý:ñ/»ˆÃ‘XŸOÅÞ7uøË‰ÛPçý /e8¼ß‰¹oLÃÝ9‡0éÎѸëÉ ÌQdáX èöÌû {b×Z|´DÔ’HkÀÔbˆdC²¥ÚQžnDrSo"*õH‘ èãÍ8ˆ)2™LHLpIâÏè]#2¥ÀfƒÎjåmÅû'Jñá2fXõú¤ùèÆ^›5lªQM–¾uŸ¬M_§[Ïãl/½ÚÕzº¡‰¨p\•û%LÈtt‚X?þt—de²•u'òL]‘3ŽMV+¹¼®¨ÛòsTåŸ ›Í&¬^½:$Vt 8ÚÒÜÿIÿ"(..f¥¥¥Q7øœœ¡´´”]Ká zfª½g£¦»½Vä«”¨öž••éºÿ±”Ž„ëÑ }ëý¿Þk\Oûö­Ï½„º° È€AÉ?©¤ßšÏèQ}ÌÇ7ÙÉ…qÐNí±5öÚœ¨ xá>ê…§¶O0¨©©ACCÿßn·£¹¹iiiHKKãÒµTâ¦ï$ýM½pžZ?<µ~ÔÔ|çq?‡ó¸ù…˜zµ$éQ?Ò¾¥’8¸\..±ƒˆ:*ýD%:;;Á„˜L&8øeí‚MÙ N§“g]üèóf|ý¹DÜû=‘ñxøá‡C4#RõÿaHh ”íØENø«}~ƒ °‹`B2ªü}a©Ý÷âv<ãÔd¬{ú}8ë.¢dåL<öd&Æ@ÀÖ@=rÔ/"##ƒM¸ï7øû«â3BÄß sóoȼhÇön’›Øï‚sÿ9,ù¾»OnÀ•½{ñÐ+…ô#%úá@ÄPÚ ¸•©Ðµ6ÊæGs4™LU¾ÐO0ñÌÏSá;ù.q)Õ˜¤”kU9ÃCìçd’µÉdâšò°ÿÅ/~ùóç‡NB0£ÊÏ êPSóyßa&ªü])©¢‰¢}; €r|Äõ¡RâÛƒðøX#F{º1+9€Yɰ^g±HòVw‰.rÐÙÙ‰ÄÄD®É¨e #oÑ077••…¿dõ…666Bw¦%ÄáOJÄ«ü‰€Uvß¾Mþä¨YåO”IþÁø—^ÇÞ}6ܬœ†D\ý¬Qxs×2TìýœÇýЗk'I²w8ÅqH+ÅrÉ_=7Yò0>ûo²SN'SûK‰0Î KÂ!CPË{à‚ÁÍx±fÂ^›¹‡ýøÝÃ#°ålj˜9}ÜGzðñ§"ÒNŒƒE¸,Ó@ƒÁ„º/ZM}æ«B§âã0ed< µq¦òvMäŒgÈֈܢ•u'2Ds”‚6ìÙz-[2Æ€uEYP Wb±.jÏá°ÇƒB§=æÔŒ× ªbw­§ˆ-HÂjµ²åË—³µk×Âb± ]­b³õZ–9&ž•dêùßÀyQ=ŽZYwRÈW)Åúó’6™câÙl½–¥«U¬´´”mذË—/ÊhH1[¯e×¢iòú®‹ˆowºª˜v=(ÉÔ³V!$èÃH?Á@ÌGË—/guuuÌb±ðt¡Ìjµ22¿ôwßè9"3ŒÕjeŒÒ#[,ÔÕÕ±87 †kJŒÔÚÚ*DÊ} l6Ûu1³Ù|M~ªl5ÿ„@ŽÌŒÌŒá;¶5ë ÉUbñ¢nów„—×+±¯RÜl­ãí8`°7Âv¬O“ %¤R›¸4ez°”ÌX:‹÷(Ëú èäç‰ã2ÎÁd8‡Ž *~n4t”;‹¨ÔX_4 Z…À‰V$ê_`uœ‰i54aì'L&T§ÁìHØžæ–ššŠ«Š––¼û˜˜ ™¼Ñ³gn(´‰½¯î|'¼˜–žy'†@ ýx%LÕÜDÒ‹*ýýÙãB]]ËŠJsR|ZnJê‹qx3õH˜ç¡d¢9¢?K8âî7©ß†§Öq lÇ\xéÐ)Õ˜9}ö컊V=¶ü83¬z*Ô" PÈ>3ȉSÃÜyYæçq¥7”p¬Y[´Èt„j~ø‹EoRµ"g{|B7¾Ë“JD"`R”dêÙb]{<8r¦Sâù_8r¦›gòŠºš×‰’L=ÛÖà¼ækdމg”ï?ôç4FLS¸5”:F’rÃ¥lކëÿÑ1ƒÿè¶Àõ;ñedd°ÆÆÆ/ìþÈ5¾ˆ¬×Û•Ó¾QmW­La@t€Tõ_åóÊâÈ ‹‰„‡*{d!V‹õ P¡Æ^›¶ãFY(Tóqµ¾4>žrÛ}›½Ñh”1•R5nZZâÏpnlò 5pñ¢c‚ G¼œ°uñBuv’»Ä*£§¼Çx[ ø¶µµ9Ð*¸ Ú^©»[—€¬¬,>ŽàüR©^?Q ÕéAüéÿä옚š5ù@b}{½^ü<Þy<÷¿Üƒêc>d+„‚NÒþa‡;JM€¨ íIõù…b»fÆðÒSeˆk0¡ìüB\9 >Õ•}U%‰‘jkkãÒ¿A/ú‘Ü+_í2Á• ªíR‘Ðå”%–Òëõ|ÝtVkDé_ŠŠ}{ˆÅjjjøúæç©`.ÃvÌ%VR´ŠÂ 1•/ ê^”A¨ xéðLG'7 È0'ýgðc—IIJ°Ë ïØ»P‘4Ã{ëE\1ªÏ€$üÇ'`²ZÉ(_uµÏÏ€Pâ_ÆÓû¿²3xåœ#=¨ò‰yÀq¦[öW÷ þÀÀUøÁȺ( ¡ÿÓ8úÛ˜¹y%Ìo±˜UB\fëµ×Mü±¸ÍõâíN·®V X ‘®V]ñ®‚sÛ÷‡DÄ@¬×ø¢˜‘ÖÖVázú¢\ï72¥söÒøNxQ R¾Vœ`f8NLŸjBó=õJúR⟟§ЃʀhB -Á1Ù)A ¶³“# Yh¡cÐY`,0FíýŽ‘è<"nÔG¼È/Ô ­PƒËuv”)aç)ÍE èõè†(áu‡=[b ŒFcñ—ÎÁd2¡¹¹©©©ýjÈ(¢3ùmÞ¼žZ?>ùM€câû% W  `ÍS_Ý~€ÞóD&€TûR?òJÚÑŽ,Aú©qœ †Ëß&–~÷‘‰HÈïÈQà3¨ô-p°\®¡0èÜ\»ØÙÙyMùÂùaÑDs€ô»í˜ î^­H GÆ õz48(2 Bk¯–EÔ¶˜Ð4Ä„+­}Z §Sô€§Sž`eÝI!qã»B™ÛƒÇ'p¢¿"g[¬ÕôKü_9çÇkWâ ÓéðÚ•8ñeC_9ÏJ½áª}Ý(Ī„hоŒ ÿ‚땜ƒAæœX=ðƒÑäõÅ]@êòkuÞ”âZœ¥ø²Vðꥥ¥_¨&Âf³]Wt@kkë€Ú—––ˆa {}4H¥Ç•ÙB+2°((Isñ„?i)N¾±ŠžþC ™&§&‹ÎìFHKKÃ=÷Üà Á•ìH…_¨AÇ:&¨ÐÜÜÌ¥TÓD5šCu¥®”Tå* ð—õGgÛ‡pÙ GÞ:v»]&é}Ò?!cMqïiii0™L¸ùæ›±yóf@FF, N~Ù~LÈÁ¨Q£p"ÀBìúª±â¾MkNÄ?RfòAÜ_”_?ñ]$%% Goú>Ú§jp 9Šì¨æ¡ƒÌgpÎ)»Ž5c¤^…ÑãµPéErépie¦»ÝMc#¶öæè#z³)vvvòˆŽæ3zT¼˜aÕã‰Éƒ93PðB;1Žk(L•|œN'TçÏ¢Ði‡ËÕWJüõËøàª Ÿ{¼8è–3A!‰€hsßVß ¼|´ ëŠ 1Y­™êZAú{ð¤ª|^ž'¹µµU(äÄ+çüÐétœø·¶¶ •zcL¥I¯%Y™,pÁ]‰inýÎÂêÔõE‚GoxÏòÒ_$&¤¦Bü®eMc.ˆ5Z!P<îµbÞ¼yÿ2÷Ÿp#<ð>ïþÝ~ ã?lã˵ã¢2á| Ú jh'¨ÑÙÙ‰æ3zxjýî°Ãd2áD€Á}T û›¤2‚ø<'’B*éÀàÁƒùsˆ6𔺔»’¹ÛyÄ ýx%ôã•¢ä/è<âEJhÓÝs%Tz$éÝh4rç×pN°áˆ7IÿÎ#~þþµ´´À~e?&ªd 95JÍ„á;f6Aw¦…—öÝéÏpþã¿À{\4Y¢¨¨ˆ·§$@‹µ®þ×ÍOÀ“c’ªï¾‘†`±ÖÁÿÆàa_Cföƒüÿ10þ×/Úðy⨠¨ô ŒÉSB¥W þÀg8ýéÔø @Âø8@0Ãç pŸrLKK“™S´§N†ôM ßÚÛÛ‘––‹ÅM®’k“þ´5{mNTø½ÐMÇ“c‰Z‡B…3¬zìµ9ù3zL¢Ý.2 B¡ÓC¯ÿŠN§ƒQ©àŒA! Éëãç€b„èkÕ^¯‰?EDSS«ìþ+{0{íJZ[[¯K…|­†3^K(ŸÕje6lÀÒ¥Kc¶¹ MÚôEö«ÿGøG&¢¹Õ5ÝÿÙÄ8_R|Ñ÷?##ƒŒ¿ŒIVy%ÂHfÒTù¼Ð_dð÷©Ó)ýªôÿIJ~S%nú Fü»Ë Â8¸\Àj ²8|RKsþK½, ·ŸKÍñç PøËlÚ¦‰j¤ âRcR€+%&ƒ˜0¨/) øµŒF#***ø1òZÿÿØ{óèVîëÎóSUظ ¾…oáãþ¸¼]R"y—ìØ‰e˱äMvÜnÛ±'Ýñ93ÌÄé‰{’q–ö–x‰Y¶ìØÝN[^dy‘,ká[¹/o'wÜ;Põ›? UH>Iv’33}|Ï©ƒ*T¡üªêwïýÞï½×P ØÈÞ»w¯ÉfŸ™™¡áî*~¾NÃݺ·i™r333ccü#Ë!‹ ùÏöóHf¬P¿ ¨DíCG»8®È<’33Œßð»ÛÊ1ƒnS¬& 3wµô¿^Èdøf¶4ó÷Þ×Û~û“´¶¶J'î:Ÿ—þöéãâY¡RijŸß*1Œß¸›ÀíÝ`΃FFövÖôsòá‡YzúislŒâ?Fú_±ñÿÄ¥Kæ8ŽŽŽî`õwJë”õØé• ÆÏ€–åü@yIøÉWÅb1Ó8—L›Ùo“é,Éê“üw½ÂkfÈõ:úr[ŒÜÈë†ÝIkÛÅPþo:äG-V¾²Q°Æ\ˆ½t¾å¿¶¿ù[ˆWZ=®X.]º$=ú裿RÁÿ7åßBùCéýð/‘—+Dó/=±üK`pãúÿkþž_Ë¿Íõ¯vÛ¥8 й¡€ ¾5–ËÇúáÒX6s.ˆ¡ümm oïͺò7¤¸´nq9`((d¢F£æ{Æ1kîyªëƒ8犊âLjlõèd¶ÛÉÍÛì‹F£ÝawÖzqÈÀ0J"‘¹¦-¼ Äu$¡Àˆ˜ÈÅvCÀ8ÿ_eùÙßêJ)›7ÏŸH$Ìxù«?|Wcç¿|ÎËn of«ùf–RBà×2< ;².d2ÉψªÒ"Ò¯_þ}._yÊÿñÄâ&‚ß<›A“ïçm ñž÷©äœ‰D‚2ÉEheçx>|˜“'Où´@¹~iW½ €šH"½^SÙË]55¬­­1Ñ×7n033“ßB1 ‘±#Tàõr¾Ä0ÐCùg&Ô’º›š@®¯§=àQd ­ë 6BžP!Ël.ÎC]ÃËwüe‹þ§þü©íá¯"ÿ3–‚ýµüZþg’·þö13çb_pªÄ¸]mm%ïåKu|Ë£šÕØ Ê0Š ïê²QÖ½ErÈÍ×F d³Ýš£Û÷»‚ q–*t#ÁÕ®P½Ä9§—N4îÑ ƒpÛ˜ööVȆÌõbéìì4;ÿ¿Ùèh¼J?šè€a<ùä“;Z.ïÆ)Gì–ž»[6@1ÄTY-! Y×/ÿ>’õã%øxâNS½&ö–<óÏ?αÓeüIgÁ€Ûm¬Š ¨ÝĬ èzÿŽÅôúÛ$‰ *++©®®æ¹|!1ã}(‹D"¿t'E㾄RôÇøFóCƧ§K rh3‚7ØÈeMüºð¯å×òkùÿ¯¼÷ÿ¬°{ç¿íFÀí xéyOÓ’e¾?ã¼m;Ý«¶­»µÆ}%b@ÿ†òÝMñð?”.Åž¾÷Çï{î¹çvt£Ûž=óJêqwü3ÿöÿj Å)€ÿáK2ÿþ®èÈÇ”S’PÏêhSGx÷;^|Y£i»¼œ!ppŸS7”ššwá‡ÔG"Üȧþýªâõz lFo{ìö^n쥃šg‹Åb;>°ý=UiG)b ’²¿w‹ÄÞ«‚>õqFr…XÅÈXUigN@cþ^.>Gñw„ÃaœN'Á`ùùù’Øx/ îú°¹”£¢jGeÃz*Ž¡l¡¿ÅÝïåöÿ*ÒÖý^&†ýW9×íäüq•o½_‡7x$ˉ ÿúõúUy¹Éw{½lØýÚËCG»øâ /òñœÏ|æ3Àî×ëE)Í×6ãD«Ÿx¯ÏŒ9ö%°´XMbÙ¤PñžÒïÃ…* G•…ÔzŽÏ?bM-Ä«yÇöõŒ®x®fr4Ûôû°JQXWUîH~x×߬•˜_櫷ጹ/²!ðVJæ+Àþ®ÂÙAS=:ÈX/~àÿò9óœ¿ñÑ~fæ\f'»Ýú¿¯Å}Í8ñŒ¬&ת|¹õAu×u€™Kc¬ÿ|‰Ã‡›¹í²:θÔFuÞË-&Ë-U”×1$7/hÛ¯3í¯fÇÈÍ zîí"}Y˜¹ò†sMn^` Jæç-A©ä5å㈔³n[¡*SKM{%þx#ÇÚd¾E7ÙáG‰Åbœ¸ó£;¦Ç{/^ÔaßÑÑKtvö½ä6@ÖÒKWÇÔ‰±)(úô•Â$Ÿ³¦¼é,Ýbˆíbïí£O–Ä0ªåßã:v!M°uN¥O–ÈŒh¨–SœW'”Âw(¹³\Ì ì8çÔM—,!«ƒÌVxÆ «ƒ$š:±oHê¦câë;>ÿËÈä‘V ñÚÜ[v3¨Æb\+ÝWWöDIí…—’À¦ÞmÏЙ •ï[Þ…¯E>=McY\Fb­äós I-ään–áç5|<ìQ_C® ci±2ÝmaRhªÑ¤rr÷Žß´ýûÊÑ»¶JÊm Øb1ŒY¹¶´ØÑ®°òRL–Ul6Û'm6-²„Ö]†Í'ãÌxH¥Rx½^²R+²£*íTy2ìÏyK>öï)+ð6Y£re‰iI¬Òꊾ„òq§µM®G“ë‘P‘EØ| Ãá0ñxÜ„_ÖÖÖÈfõ?œÍfÉf³$“zDcyy™††R©B†«¡üËzì,,ÙpÎ'YúÄ‘óxñz2tJë¬Ö`ÂP¸p7­2ïÊf³!°‘S ‹:›ÍbµZKöýKdey˜æ°ÄÚK‡0)ië~/+Ëú¤ð…=Âó÷þÉÒ>¤ñHkï•7ùÑR¡¹H­¤Sñ˜ï3–Õ_2*Þlí Fñ£Vdvœôëögÿ{wù:9ÕÁ›ïM’Sæµ1öŸ>!¡æbë³,,Ù…5¼^ý÷Æb12™Œy=þüÏÿœOêSX“ ^ãCwœabhÙë55Žÿ@¥ÆsJK‹•¾5…Me¬SÆÞið0)TVÌ+O”1½!×@‚\ÊKô›aª™¤”É2 ¹I!J¶AWþµ–üq’Ä‚ªR&IüCîXa0ÔAå¥_žþ.TßoâXzKí[©L|ŽˆzG™>¡KY°¨ý̆‚Ì/ &‡>KÝ#úÉ“Ÿ!Íq~òäg8súm ŒŽô—±™€ý¾[8Ò©9¢›6^¯‡C/Ú•Nâ¯ëÀáppðàA´I_2¡ø nGÉ’N—*ИÝAtÓVòš;¨+ç@OþÚ‹edq‰í¼5ÝR-š ¶ñYA¹Ý 9;ŠäŒ#×*D2 Y’iOѹ—Ѥ€yFY,ç¿k‰$6ôg©V’±,æ’[R‘käZmµ ·DB˜¯Å‹:£š‹H´UÍ\2cs‘´€¹V¹‹º¤­û½¬mi nÑlí )¸…?ÞÈìh n15_È m‘%޵ɸOUb="1y¤k{‡¹¿Ú=Oµ{ž´ ÓÛ*am?MÖÒ‹ª´ãr¹J¼ê—‚\‰D "`x"†ò8?PÎÌœ‹Ëš «ÃB_{ÔŒï·ú,îæUÌ’ÝMŒ\ËíU n'·«µ ð€£“Ï˜¥¹Á–×½g×ãAWæ¯ä½b™z”wö¾wö¾Ää x$Ë·Þoå‘Ö ’ƒKü}ÖÍçz §¾ö(MÝ ûê#ÿ€ëW¿fžÏ€¶Ç*‹å®»î2{\Ã+ÏIþU¤«ÃÂÛߢ·­‹¬Sѯ,cüŸ¾YRïÚÞÛG²ºÆ¬šuh3B]dX,ÆÀ~•É#~½V|»Ä…\ÁÊ>?PÎŒÐðžrb43•¦«H­{Y>[ÆâY=Þv5£+ùyƒu=¯$od³¬kW3964ÍìÚe5“ã¾{îà¾{î5Â}¯y#ÖÜó+BØpþ>•‰Ïºò7^³–^öÛ?oþV{æó L ,j?­Ýcrè³æú4è IDAT©™Öî˜ßpì˜n€©ÈÛè§ù€þLzòÍ`@_®¼ð<Ñ~Ò—óÞËÐÀ++¸UÕ£°·¯ƒ™KºW¾¥Mât:J!=4T>Gµ{žµ­BI\ƒh*Ÿcm+X·»\.BåshJ»ù^Ê7¼‘Õñ {Ìû(ñô#‘ˆ¹]¼ßëõb JƒAª2µ8N®]»Æ³üö på9‹/¾À#üWFG/™ÞýKy£®ª»Íõêö¿Ci;CN)Œ³EíÇ¢ö£´Á¢öS÷ÖóìézO×È®çÒQön6³w³™Ál?Ïõçh¾ ßƒemç‘Ä0wuëcné9ƒj9@zTCSzèÊ?ÓCR7Õî)ªÝSìÉ×êê*#ùç?7>ÀÔQ™Ù ž®OžFÈ­ÔŸë¿íÿ}%bxñ?vÌ"i“ú’4CzÉ\nµÝ¾Bñ9·¯ßN oØáý¿R1ÃKE"‹Ë¦QñJeR”†*^²Ö…T÷’‹¶ê»í¢h•UŸ4òM-C9Æ—šióéÖkggW®¯‘l‘¨ž¶3{ö\kQ­²Äš¦E–èíìä¸"ÓŸH²ÕÛ‡µ¾{]U­EñùùO¯Þ lí"jwà´o°œŠc¯•H®°¨#æƒ+b1êÀU®–,Q‘FÎ l6ËÚÚÕÕÕ4Ê™Êßè—ìp8xÛá0ûz5¬‹‰(¾‚7¢ødªV«2™Œ‰6K6›%›ˆ¼¼òLïi7w"â©…!>Øsž5•‰\ˆæ°Äå­áÛžoey˜ÉGÊyvîA|£üâS×ùä—.î8î®»îbff†ÎÎN^¼·°ã}býò÷]ü,¹¥-~¤zÉL¨ŒTëžvÕª`1ì(¤!ÍæÈ†Ã\{þ&K¡ùþªà%‘€ÞÞ^œN'—/_6ÿ¿Z‘a!1‹ÃáÀï÷#IRɸ„Â?ÞÍÄ3³ nÞªÁëÉPç—©óë׫ÿ¼à›ÿ½œÏå¶ kÔùe‚õY~ñBŠ@&]’XÎ×ü¾4;LjÛÊÛ-ï±Ê|ø…³æ÷Ù’ ì’„]’°%T°17ac½ÕH™^ÿÔ ›õî¹*…[×Ò¤7TlMn”€Œ&µªÂº$Ø{kŠÃv+³Y•rY*yMh‚…œÊ•t¯¢°”Ëq+›#`±Èéå}oã‡?ý÷½æ|*èÿæüwIYO²žÀÓ‹ª”yNšHÚ±Ö=Ì­Átä8¥‘µå9öV~U9Nmà„ù¿òägÌíÉ¡ÏÒÚý1ïßÞºÖ××I'Aª% Qç—i¨÷SS•am£€rE"ŸŸNE/wš[<³ OT†÷º§_ìù¯ª%ÛÑÅ3}óúej9¾JÝ“›MWÌTPíž'‰Ç©ÊÔâ«ôãÊzÐ\ó%ð8¦ÝjaÙf¯zˆŠÔ›Vׯ_çøëzɹӬ$ÃD£Qá•Ù‡äõƒëÍ´ÉaɇÅ] {½^VÇ7¨ÚS @Æ–Æf³aßp’§ÐÜ aA(´H(´HSp‹Æ}gLsã:Už ÉLEÉ3²±i/AFn|„¦Ê³ÈbŽkîQ$äÓÈbŽZ×/°´é°ó…[^¬¿ð³R(ANДS\ï=Ïzýí¡SÄŽ/²Ö ‘™, HW·±Q¶Ÿýë¹[Í9>·t‚‚ê÷ÄCR7ž®6f[Hf*9œ«BK¸smxS·ÈV$™Ê´R{ ÅÆl Nû³-4MT‚àÇö)¨Aª©IìB©ßEæÝ8¢Ñ¨é±Ìê$ËÑì2uÒš~.‘+Afbּ̹·¢QªV¬‚y>Cù#‡t:MÔ{dôº÷_ŽÎ½74ƒŽ8w g,EG †²×B$ E`2EÈþàvÀ ‚Ú¢>` ÚŠ¦+y@XZA®Ý±hŽ×#¬]·]”ªªªO©ëÀX'|5@Ün§ìF{›Ž&wRn½Jõ´K{/w^]fY€»a‹5-L*•¢V’¨÷û¹¾¿‰TSÞ“ Ž LrÁOy"Áã:ùâ“m¦÷‰D˜_ ¹Àš`54ŽÓé¤Ê§¯f«B‡þŽ(æz…MÆU® '‘ò0¯ÏçÓáJO†e„(cfÎEó¡wy—Í<Ê%á¥:$¨÷+ìë±Qñ¬ÊbHEñÉtû#ôß̾âŠo¯Äów86£”çác…U‘a«‡¨Qü¬iúägO- QwG®x ª°PçáÍ¡,]Q<;÷ í—yK}ÿë¹Ö’ãA'¡LÆÈÉ–7϶R'I¨–SÔàSú ÿËw^ü73 QB”1Ÿ®àôÒÝí9ž^¶³*tÏÿê¹P5†gµÜ|­•$^ßÕÅèrˆ†v ŠO. Ÿÿ{}}¥¥¥ïÇPöŰÜvÃ(•JÑ|(Ç›ïMÒv$Îgþ¦–·ßïàí÷;˜™^'XŸ%‡t¦‚æC¹‚ap¡ŠÍÍMªÓúùÖížq*¼Ç*³o²ñÅû&8õwQöä2LE£LÙl¹ÜØ’ú5§4–E:SR-öë“–¤Ô›ÏG(Ò¯¡Ç‹'?™^Þ–ŽVÕ£PK”~Kà:Sƒ•d'pÔûÑ–kôÖ¡-מ.1j% Í¥#²ÐÂÆ~¨òÂIñxœ=ž“T¤æXv§Q|~Ö&"$•åååHÓv3 º7[W Gy©Zƒ½G–©9T‰s!Eâ7WÖCǽG˜¼a%“œ%7/¨ÚSÉzfœ#K}Y#ɉL^Ï+vƒßäp8pÚ79täÊ­WÙܸŽKkÅß{ü–¶jì‰}ñ›L§+©uý‚d¦’d¦wü&‘/ÕT¿j”î†Ô¥‚¡¶wP•¸NÕòIª—‚ fû±õqÏÌ úd‰ªäY¼)’æÚ1[s{êh{Ë2W®Æ˜Ê´âé¡iX#[‘$™©¤N’¦Ž€lE’`ü9×k[M$3ºat+zй‘”ô3Ê{ökpkpàZt›ÆÀKóî Âáp dourAùIbE_ÔQÓ8ÀÝ,8o•œ/Öïbeo†³v1¢Þ#¸R‰"Ö_“¦¯bCÀ™WÖ9Êë„Î È; €úz+Y šŸ+6Œï4¾w»”'À0DB€äBXZÑl½¥¡Ô3 X”ôåGYÁPîö‹àºøžÕoÌØ¤ÀÞ)!ÔV,¹¯Ópwñ1ì?„UH¨W» W b/šäs“¬Vx`ä{òäI¾ò(T{~Fµ&„`êÒ®ÖVb“T»çIFõ˜ÿ1·ÄŽÎ7°õ£Q®4ÌqD¶`oÓ/C‡lá’œàŠ–OÁóäÓ.šÞÛ£SZ/*£è&9”eTÓè”Ö9?PÅH~õιò½•_9s·8§u7ñÇ9ªH`뉋í<`“8}¸Ï<æO®Íí »M =ÊQ…sA\Uw3üã¯Ò°ÿ- _û*Ía ËëÞÃW¾ðA~ï#_f<«ñ•/|Ó§-9Çèè(ÍÖ{Xko¢K–ÑîVxî¾È_Ÿ?_~4NW‡Ž’´HW˜lÒɺyŽŸ~îññ4sí/m®% yöjqèd»¼ì¹½BZ±x½^Nô†¸óŒ›“§Ý%û>ñ ½Gö§?]˜ôNôÆ9?PN$¢CùÈ2²ÄˆÛÊòõ&ªÛõãÃ틲YY×4ò¸øz4ƲÓi6Í8Ø–yTØØ­?X‹7Ò”múoþYT¥VŒ»;'wSkúøì_1•ÍR©(l¨úØDÕRpmÛ¶qœ!“CŸ¥³³É‚2u¤¿JÛž-Úö~Ì—ú:~ãàY2:ãÙš kéåL³þ_¼*¸gÿxæêG8Ó,aÏ|ž´í£¦²7¾§xû¾×¼M>¬ å™ß €~ µ™kªN)–âðWlýçÛrïKÉ€[CúýÑn{ˆk[Ðn;Í’ýëzŠÙ†§k„}cG‰YN0l9Á±ÜØ¿±Î%M`Ð.z¬§¹Îyš/hTéª{hZ†²S½DÎã˜Ub0ÛÏ¡\hºHõÔk#]À¹¦-Á„ü»d‰BV©t‹!n¼UæÊ?ÿ3^ñÌŽÀž®Ç©ˆœ”Œrƒ¹p¯HÚ$“GZi½2‰ÇãáÔÒO¯OݶÈÀÎî}ÙËZÉç~l™ÅCÚ/®NX ùoŸ—¶o/ =Ý%!€Ûѱ$ÖL2`±È»)‹ÏÏN—MR ùÙ_"”#XŸev.Ù3¥€!gθM4àŸ¨çÓc%•JaÛŒ’‚/ÕÕ‚G£1¦²9Ø,T+ ×3YÖUN»”4X-LE£Äz.o¦!ƒ¼Uå`–¤#Aêr%é™°À–©EŠN]Hõõì{ÇïYâû§¿ ªjÜÌä´¬©I!pÊ’©üm"U5ÒBà%–›ÞAÀ§ó_%g9 @Wg7k;k;?é·qªy¾Ä@Ðäzº: ™{j$Tå8{jte:8™%X3Ïó׃æ{Å(€±¾§nI,ãº5ÈE[–ÍMÒé4V«•êjýZ__7¯·b!µÒ©øØÓwŒ±…ªz’Kúo+†ú $ ¼¨{:•½u%û–ûobßpâ«ô3© Ý)ÈTIΚ€;à¢Fñ³"0ù `| Òsä<ú=½Tá1S§R©U‰òòò’%³¶¶ÆÔÔTÉ299‰#`åÚµk8Vªz‰Û6ɹÓXZ?žb„]o#àS …K¼ÿµ­ Ÿ>ö¡þœ Ù‡??'„B‹TT¶Ñn;Í"ÔÉP'ƒ/ßìgýHÛl©÷‘]Ê2uóÁ‰Õ\?Ë’ ڑY²+AF«Î’©Lpðf‚«Çe:ó6se*‰óTW=ÄSÕ4H¥‘Ál?7‡}Ië¿'æVè(Õî)’™JÓ‘°µÌ2³ì7½~O×ñ§PzQÖ× …Bî óôR'——;ÙÛõ8ç–¿Î>ËÃ¥Iä@è>€T‹oeǪ̀]]á`6“Wþ¥RÖmÅP°wX°wXÐr¥VB[Ìf˜wB,Åá#¤°¸]¢Þ#& ` Ù"ÀbÀ@­¾°,¬ ðJR(„to¿€lGvC’ƒé]•ÿ%©‡%MWüËBWúñˆ;Á×+S¾W¢¼V_¾N¦®³°ˆœ„RS™ûdr­@ÌݶɕëkÜÛ®[\÷_¥Un¡bh‚ñ+¦§±F׸µ!d²ó­oÞOoo›[œZÿÿñ$‡³ÿ·‡õF­ÿaÂá0?½ü"å,󕼺AáÎ36Tµ†þsÓHlêýC)r–¶:݈ùd–³Ì§ð×5 ™T,PWTnÅà{”õØ\,X|~)‰5`(’u’CF…ƒÌ„j*®†v˯dd³zσÊÊJó=‡Ã;¦Ëêg_WÏÿô"ÇËz‘«K s†1Ð诧ôæ‹<òÈ#€çW¼¤Ói¼}ï`tô~=SëØÊö31ô(çU¾ÿäÀŽ”Á35÷pêu×™~¹¢Û¥¸vA$áO?Lÿè%žýš^xâBrFátgþ7”>À1>ÀéÓ§K鶤³³‰¡GQ€…éyö¿ÅTø»Õ xgïûpu|›óiî‘'ùÈ1¢)xޤøø•·ùéw±½FðnÌ ŽÞká + •r°µ)XeÆT/û˜k SÙ[ÆoŽTAf4¤³j±ÕÍœs³hJ;ž½c¬¸âY‹,¡AI'3¯×ËÌfž1Ô¿›|úÓ)Nô±#c…L1ô>•)e¦§2T* ïª(çD¡¢VÒSPHé¨ …ÿf™w£6 ÿÑA_Ó¡¾ëà ýLerT+…sljrAùëÛú=Í™ ;ŒõS=2/毭Ҏ57ÀOÎ÷ÒÛªç87ìKž!~†‘±éê8Cš3t’l%2× èàÂÕnz[û½Ä†S¯˜69ôY6œ¿Ï™îñâU¿ÛC31Ú$‰˜ÇÚ{icž‰‰XIοaðnll°ººÊ¡Þ>4`æÂ£¬Ë­:œŸOíƒBÀcÛx¯8U0‹q왋Z‰r¿1+xÓ>-_#`Í QŠBw×®]Ãß —cÕ”vduYGSÚ •ÏØŒ²¶ÄŒ°¶DÌoì¨P¼]Ó^Éêøòñ¼PCÁà_ß õ`'Ï/êÛ!}#Ü¥š"c9$1O,îÕ¹-EQ¥œ\x9±hCPÓ‰‘0 ,­HÙer—õ¨kI¡²W’™šVˆç?PJ0j²]ù›„?‰°8šõ ´bRciVƒ–‹©È=åïêòoòÊa9ŒèVH©|GÕø­ëƒÌ=h!õóufŠ”†^ø$wž±QíÉ QÉ'¾ÊW=NUUëëëœ;wŽšš–+¦™ m&€}ø|Ë\ÑòQ¦uû3Qù!!ªêø»ßJñù§œt[¾•ÎÁXÆ®ç6Œ3C»Yy©ÂÃ^J ÆÊßâZÊ §uŠe{9ÈÝ:kò™ãóñ ÿÀgŽ?¬IQ¡âõÓ}¼ï7þ¡ò<Ui§³³Ü¿ yžÐÚVÑönò„|ø)Õ÷eî‚~øÀc>lîëüì"óÓ¶×,qô^ ‡?êâÂç Æë.´£¼ Y4ŒæI†d/k:,'Õ½¬1’Ëîj4Àh4Š?^D²¹,h¶v`o‘ô‡tnvGa#•ïü@9ßþ®¿¤àωÞ8wžqóü‹[:ìÿéçÒœèsBo3ÎȘn T) Ef!©rG™5U3•óH:Ëõ /r…›w‰Ò…Ú_xÝr+IÆpµ+XæÝ¤uÅ£]ºÄ ¾¬áoÖ_± ØÔ?k(óùœJ…,™F@a[3cߦ&Ìõ‹_àØ±;JàýwÞ·ÅÕé –“oÆŸO3”±‚ßMŠ÷uuœa`ìEz;ûÈ)/^7^¼ªŸÞ˜fO>ulHd”F–‚fguïÏëõrñâEæKž‚n8§n²·O·DÖUööu˜1þÝýv^€!ŽH9'tƒÉPîªÒN]Õ9ÆfË©iŸ3ãÿ†¥•÷ E¯)zj˜at1bf o{%k[¥œƒâuCùiŪŒõÕñ‚ñP¸‡,˜¯×»ƒ§ §LëÅÓŒg\w}^0cí3R{£8fÂù?ù|’^E&sék¼ÿC7nÜ`}}•ŸÑ| Æž7Ô:©ßdׯ_çï³ñWŸ)tE2:0•·Û±·®ñ±`=k™ixj‹ç ñõ©,Ø÷°<ÁétZ±•ÂË1NôÚI¹yþ1Ï?–0¾­M1•KfB5-Äâ~Ê/%Û3v#ö^*Qø!ãtg£™1¾xéK¼ßb©vë0bèpÁ{îìì+Ù~)iîû2÷ýÞ‡xzh”¿.Êï^ü™§Ñù© Sùo‘éþûz­%ã6’SÉ©X[dº,úxm $ùÁ¡%.e¹4–e$§rYfÿêâzÁ/‰*ŸÓ[‰îB¼y%ˆË̜ˬòw~ œ“§Ý&ðü@š™9çv>–ÕŠL“ÕÊC?,j<µ¦jlåóòÿ>¯üzÅz^zYGªÔj*C–õß>vµVå+ ®±©<}ýU?΀ýŠ ªMM˜ûõæý›œÔxç}[4×=‹57ÀÕé &½­#c/˜ñ~CÁÛ3…m{žÚ1Æþ®Ž3 LŠ’ãº•‰¢áÂR IDATϙƚq?x*OckSسgYÞ4ºÑ¯§Å­®šˆÞ7(ë.Uä·«x;1ö¥¼zho2?6ÆüRæ9ɺmE÷¸e‰v¡Ãûk[…J †a~íÚ5Sé¿‚îtìѧ:13¶£>…‘ÿo(ÿܼ0=ÇÕñ’ù®¦½’fk“šØQµø™ÊZzéì죷W5Î[ÿ9±õŸï‹ÔÞ(ߟª`DDGºpwË&Ü.kCħN™Çn idžb]AÌîÀ9Ÿ¤¯ÃŠ_’ Q¢üS©™Lf×4ÀÝxV«Õ¬(„0«É=µ ÃFí?§;ûøþ¢^‰+T>ÇÁœ‡F=_›bUè¹ô»ÕH¥RÈ"\²oeyx×cwü®£ï¥Rnä;g§9÷·ÿ‘·þù ¯êîääk üâOø?ž¬â‘?^‹Åg¹5òvî>~“t¦ÂŒ‘ÚÚÂZˆ§WȆUl> %5¥Ëê¥N–QZõÔÉÕÚò" ß¯“°Œøq*•"²¦…YÓ„B¡Ûþ›·jˆÅuo¿íˆ¾ôUYX²ñßÿI¿NŸþô"ó9™9Ýèòz2,,ÙÌŠ€·¶b|1£ñÇN+’«Î\Á+_É©üi¹ M£L’ùk’V«Iâ̵)8}2žãï6ãü!¹&Ùð÷é^ÿ*°‘¥’»íµ$·'-`UÕÈ]’H ØÒôm·,›ë»-9ßk±æžà©³{ÙŒ¬‘µôâ«;C(OMýý¨Êqæò‡‘V˜²žàؽ8“‡Òk¤æðV2¿ËQÖHt£ŸTÚM:9ˆ£¬‡ÃAMU†Ÿ]Å[ï§, ›Ëú Jxa‚ŒX!#VЖkÌØ¿Á H. ªz–ûo’ÍfÙ[ÑÄŠÐSèdFÈ>²–^RöÈJœ -j–vÚ7Í´RMÓˆÇu"¶£¶JG$„ì3ƒ·mrÀ‘a>©s´MÐ6 E2¶´0Ο,;D»˜ f/pC\Y+d¦«³¿¿žPhÑLñëììÃWw†}{I'®33ÕOã¾3øýõ\¹¾fVxm :IÂup`ÿ&k}_fY`«¯Ç¸4ä§}ïs¬m5qMÀ¾™-‡ƒÌ²à»œç·ŽÂª?D}Þ(ÿÆ5'Í …Eqî¼±ýÅKÿÈ¥Åa2¼G]ˆÙªÝS&À¿š¨ÝÁÖb%+µœv½¡Ó¾A®i ­2ÃXXG4':xUÕÿÅFò.>øš30užûÏ#'žàÐüG©Þü†Pá’Ø´¾™·ë|ûµ_á;?»‡û_õ<#cúÊý ‡G‘YÎä¨Ûo#>žf(_ИcŠÆFŒÃ%à²(-nRœ~¥)P/× %‰°·q÷®Ô÷¿C¿N3sþ’÷·÷y½àÙüC]L€µôœSÙ,šÂCÑÎê|ù1Mwt h“xŽ¿»äøÜËšåaEƒË$NƒrÔ>‹´uú,ðÓ¼ç¿=õ¯X¢ªf²ÿ×bÑcõ“½4×= èÞ~gg'i›¾J<Ä‹Wgš%¾xaä§z`böõ»öè9ù1ÎjŒŒ½È=ÍC<3ý‘’ï¶L¹‰nô#¤VdmˆC‡º¹~R¨Xà­\¸¤§†îûoå0wž°«ú±41¤*SK¨|¶‚äæë¶Dí¸™½ ÑâTçë(êø®ÍwÖmºB1ÿvDÀoô–¼‘"Aq]oÀhj÷<ã[m´Æ%3Ìð¬ÁŸÀFG/ÑÜÜzO9MÌk11ûz\U%ÇWQ=ŽŸmxŠ«Óä”ÓTvžÃvã¡Ñ‡¨ì<Ça 3ðTÅ5‘Ò†3Ó•UL„äï«ßm>LfD_o¦cT`íé%3¢ñÅKÿ`¶=¾™GºÅ³x˜­ðPM!PlŠ\Ó«Æ2å&:ÒeV T¯é÷ãÓëÿ^àË?}}2,çp”BJ €w‡ÿ 97x€“=7K`×o¥ˆ}O7ÂôÊ®ž’ÐŒ!žÊöBÊq¾‡ÈH$Ⱥ-ŒÏåÛµïˆO‚p>r>%P‡ÑÕ%P}q?Sj`{á@mE#GK‹ÕÌßoÝ¥šŸ±/I®àñƒ®ø­:Ÿ¦Xù‡…þ}†ç/«…¿$@)‡ÀÝz (š¦}Òê’YÑaèÙt™Ð\óÄfgÉå‹4„B!⵫„–T6€LX‡ƒkï¸yÃδ7ðñ‹…e®haæSn*… ·k¤:fgyvQe(O§©ïìäÎJ/Ëš0cÛE²Ùˆ'â …›Óš‰R]]s>Iw…Ù…e,õ5Ì.æ¸07SÒêü2~ÖFÆrä<^Üé4¶6ç|’Å´z©L§Ó‰ÕjÅjµšÈƒËåÂf³™=âñ8pçÛ¸»º…dž~L<ç„§‰¹Ð"þzó½x<^ÒgÀ¨O¿½AqO£~}qÍ{¥î(ŽÙinÍJ8kưjÓÌŽüך…áóDÇsT¯=A@¨8îY¡ùæ1††'9öG*7ËPº’]É8ØP,H6±puS#ÕØÒ+'3q‰QÎbƶ£‚$I&äŸJ¥JÒqŠ+ë]]]@›™s1qÅE, K6žü‰žªh,F¡ ¯'CtÓ¶câ·Ùl¬Ë g×ÖùB&iµR§éÊ(-`Úîàf,ÁÅdwCCÉïWý~„T‹}q‘åå.±ÄØÕnRÓ¨3§`% ÀÞŒU.§F[á¨"q¯]æDÙ¾¿òé¢b8i!Ì¿¨ª™¡uMÃ&I¬kYÀ&IÄ… ÐþGÔù÷ ‹9êk%d—^î7ž3™þ/^¦÷>·m¢yç«. ‹y³ýö&@g5ì™Ïó¦7¾'žÎpªyž™õF*z¡zÇ—˜™sá­X *Tƒ­.TRýo»D7úI§æH¥õB/¶Þ: h˺º6È€†@:PËÔ`Á+5̳›t쑙ɤÚ=O"œ"”-Ç‘Y!›æ7+\”ç™E€ªÝó8Ž’{ÀHå˜ÝšÆ^߀+ëÙ(FÊ÷ì5«R™r…dføZôù`u|ÉëǯMPž;Ä5„«(¹§ãè½ØÊö3¿ ¾VB“õÐQc@?h~I Éhr#ŸŠ­lI%Àöàý(¹³LlØÉ)§9ª@róYfG¤öîóŒ\¼ÈžÞ Y+`®µK™þ|õÔË /ðÂÙë¸Æ•‚ÓG-H,£†üŒ· ëd@9À~ø\ZÔS‡ åàY}-3Ë~–¥ÉL%Nû‹÷Óâ­&Õ9‚£.ÄžùV®=ëÃãL UfØ3ߊwß&›u!,gÿõòÏX¯À‘ÿ×çǨ7ß|HVçL€‘Ç?y¤•ÚÕnXm\‹Zi;¢ÿÇ``ƒsƒ°Ö™‚…ï9È\µ˜,~ÃÁ3æx£/Dq7Cc_:Sßï׳9¬ae>ó³-êQ–…îÙãÄÌ(¯ ‘3‘€Â¢‹jÉÉÝz5ÀUA<[BOÏ5Pß2ëðh@ñ’z&eÖçÏ]Îå ûÔ!¬Çõ*~¶^´@ Ó¿Xù[´¡|&ÁNåozü—³æw‹¶¢!‹ËåÂ[ÔyË`×F":kûâæ–ù!£•b‹,q1ã²ËEKM 7nÜ <ÒC°Höõƒ‡†ùfuõ233kÄò–¯/555$jjˆ pøðáBavïÇ\ÜkÚè:áciÆI`ÓèÐ?cÜ-²d– Öoš"˶6טËD^‰l¯hÞÿÌgÍßhÈçfÀ#«ý·­$hôCx¹ß°Ûg³Ã?ú^Ô±K¨’„os“¤*:œª¨ãXßüIbÃb™PyŽç8Øägã±4 ³sÒ:cZŽŸ<£_;Éå‚DÏ^+Gd ¶öúæ¿Ñ«Üí ¹„—±w¯Ù]n·BA'zã%ˆ Àß[Jø9?PΉ޸yü—ÝiI»\.bÑë89´™OgˤX®®Ùuüªút³$ÆOÞ«‰¯€½Ô5îf>»ÄHF¢Ç*qÌ}%}–¸”çÓvŒõ¸Äsª¹žÔe²ÄªªQ–‡i‹×uÐŒï¿xUp&ó/ööÏ4Kø_矇Üñ?6WŸäT^ºÔÐÏÛÕq†Ñ¡Ïò‡ï¿ƒ¿ü¦NR+Í1 jxrH…Š]OO®i‹ÈÏðV\;wëÜÑ p»Ün_M{%ãEì~K0’Ç|„ÃaÆf5ÚöëE¶pšÍ¼TûÝk×®ñEh¶êá€ÝŒ€hT÷æ)RÆù¤½¬å§½¶ýLL’8³©yùn¨»}¿Nä|‘ÞV‰³ƒò&8»e ¨–SéÇïü:¤"”xˆò¦~dm„¹[¥Érw·ÌÖFͰ†Í=E(ñ1à<ÕZøMk/ˆaÒ£HêíݦÇ¥Šß[Ãx€èˆn”ãÈ=0Ì­ü{ž®æËob?ÒD®i‹èH·º†Ù7v”¨ÖLë|ï7øç¡¹gÿØœ)E™”m\CZ¯Lbm‘y ¾?S:÷¹»¯³þµ±ŠB§¥ ‘±HI½¹b¥¿}Û¸>ÞŠ\.[1R¤´WKŽ*’î]—G ž¾Á¦ß^ÄÇ”EV(=ôYZÑVôBV9v:˜Åä>ƒÝß úA©ò/–íÙÛÅÒbÝÕó7÷ÃÎ ÜHq»¬ ŽU¸MbEñûÆd:00ÀÌÌ Ö£=¤”Sd/ é¯âõz¹ÔwšŠsózš™™œ‘}‚‘VL@2ŒŸO·Ð‰>ŸÏlœH$øØ{÷ð¦ªtü³Ó´4!$JÙØÒpiKii(4EÛ`dT°riu<8F‡GÇ9#= 8ÈEep¾Ž:^ªâè™qDËEЍEi-Ô&EÚÒÚ"´¡@“¦I/IÖïÍZݹ§ÏùÍçyòdgg_Ö^{­÷}×{MIIñ[¸­­…xÐÒ±ê‘Rt׸PE† »ÆÅ"üáZ•õ¥×éÏõ®¦ =G„°AG5@ƒîÄJ=GþðÜîpÅÇI,€¸íÎè, ššš`±XØ;‡ÒŒ~€ tÒ²ÍÞ B€àè¿øŒwúÑdûàrÔHÉþ]7Ž}z£ÀüL®¡@0—€™Š›Ñö&G L;¢ë¸Á÷#&ï¸2‡"'%ñ¶ó÷RóÀò¹B6@ —ù?¹D9-;ìÂÔɇ Œí­ÿðñ0m²`Ö êèi“%˜6ùw옶ËܨZdiÌ¿ó+Fœ¶ø-/,0Ž£¬öº;a0 n¹åØ&Až,AWAÚ<¢7Ñg‹L1TAoLˆº èº ÎCÈ”NÃÜK¥ ôÁ|ów²®ÑuÈ!T¸¦y\CPûkDLÿˆ_¦/eü4éO¥›•…ßǶ"6ÖŠÁ“Q,•QqÔˆáÓã „P@jZ¢ÌŸ®ü^Cê“}VÿÞÈQÛNKöàÒÿt²$NtÁ¬ÈšÞBu*;ÿÒÿ&Gr,œNl ˆ/Áé#™¬J ¾s &GràœµpÓpbòaúÔycüì:eôƒoÄ5Q „a æ$B!¡IÒ^3€Ÿ6úH<°wI<é>0‘X_×ÿ`ù J¥’€^¯÷ÛÖ8iÄOþþ _(•JBßíÕi©ä|òH2l²Ìï=ç+|÷Ó6ö÷s­Ú®Óéþ×qNGüÍáÿ Ïv½“¬ 9É âý;))‰õ¥xÜ®ËM»¦}Éó]/ì±98ºJóÇ8xžgD›®ôöØïsÛ¶m>×]µjùê…»DË›éøƒV«%Ôgè]ýWUUA«Õ+Ðë rÅáË}.°s£?ì]O&Œ}`ФKÁh /Y6 ¶Å Ã¥—0â³í¸/s R%‚?V“ˆÃIåûNÂXÕ ­FˆÙÝ ·F£‘ÓétD¥R1!R§Ó‘š§AÅÍAMM T*cüâ_ ¸Ó¶?PAŒgbUäHgw½rý°nq™‘à—¾ÎÈNÀ·†=?™üájÇl(ðj!‰žùwÐX½K4déÒ¥ˆÂyÔøYùßAý‡0uêT”••áÛo¿Å€i“¡Zõw.zæ×uµ±w‰†6› ƒ¶ácU:ÆÞñ‹ÁÄÈ«šÑSç†äJqcU3 í¾NÇ4JG§Ó‘âò¯‘°ñNwŸFÖ`ÁÙ2~‹ÅÂÌMæV¸Ú —ù{ µ×:ެZµŠU«V")óÿÖÐm†Þ~/o­‡±ÚÝæžÝaæ‚ â{x K}Ïód`ã_j%®$pûÇUÜMÚ 466bÊ”)ìO³ÙŒÇ{ 3fÌÀÊ•+±|ùòëÎø)¦kû&AÇÅÅyLR™„Cbæ$¬\¹ØðúìØPê¹Ï«×pO܉=÷nêh¢mzLŸ&ŒUÍP[Ê»H``OÌMÀãÓ~ ­&¹‹R‰ÚRc•ÿ¼ b\ »ÿß•ã«-Â>þÈÚÕ(4Ò´t|ùâ äÅKÈòr ÝÖÖgž¼-(£õ,ãuã„í÷µCð»I™(4uã€ÿ|l–DZ´o½‘¹pY—›F¾zán2|É=x¾äKÈ›¿cZª>ÍËËC~~þu™”T€1}÷9öØÜÉgXcN¯×“u¹iäçCšÑÚÚŠu¹i}^=w~gÁ¨ãý¸n°àÔ§ÇCÞŸj+Ö-Žc‹¯$œz—ñøƒw@«ID^^žßë­sUnìÜþ Ö9ç"üc€çyR__””ü±¼Â‡Ãާ…HŒƒÕvì]OÖŒÜçqÂó<±X„„Eû÷ï‡^¯'<Ͻ^O6oÞÌy;KΚ5 Ùƒ„EÏËü¬é$>øàtßq'x”ÚÝÝ`ã¼V4™—N§#‡Ž@¤\±AÙˆ=§šPoT ¦FHôF#&è˜òÇìÃÑÚÑó$Ã$לùkµZ²jÕ*²bÅ @y¹1sóÍ7ûK™ýË[ëñì3Wþ…ºnq[í‹txv‡9`{©F û«]q“å_´#ýÞׯ›àóz½žL:•ý^¹r%~øa‚JJ¼ NG–.]ŠåË—‡}Îê´TòÎ¥6<4$Ó'Dáb3Þ›‡Û?®ò{ ŒØlI8xÛû£íp¸ fÉp·e¬'ŸW¯áöÜ»‰DM”ॿõౌ¼Zíòñ ÿÖétäZÙ`M"ÊD&_IW­Õ$ÂXՌà `6ép@ßåÊ•+„oÈIV÷9J$BÑP‡FEÃßÊÓxž'Ó§Å`ŠVƒö¿ +¸ºqÀÃS‰¹O>ås ¥RIæênÀ—EÁ+Rzžç‰Édâ”J%ùm ˜Ò~ o]nǤD5êÆÛwã^ܸ„”«°}ç1va“e$>QX)o™: Ïy6×c AŸ˜ˆ#»ŽsÃ&ËÈ££Gcz¶·<õGÛV£ûð,E›ÆÝÓ?pëÇ‘ò/ÚAÕÉS¢¢SyÞï³çç瓲²2r©R©••…'þ‰â¶hjj‚F£ÁŽ;Â?ç“G’Óäø®ÖŽ‰í=AµqëÇÊäµr«í «þò/Ú!÷9¦Ü:åûNœ›7Œ$^hE…BX9 ؆š­ã®?ކa·Ž…pCüNËÊÊ ¦‡áΡù ™<27eÈñZá%ö¼{—Ä“Û?>ãs ª‚ß±c·xñbrðàA¤§§C­V£  r¹ééé*ú¢¢".'YAêY³faÄgÛÙõ¦Æ' äÖùˆÜú j° ËåjÔÝ%…ã{!lr#‡œÊŽ2òÊ㇓<m ]q 8evôØÝèq "¯ÄTöœnöq:Ž †¾u®h>«"[-¬_è"Íß8ñ>V ½^Obcc±råJ3ÆßÚÚŠØØX´¶¶¢ªª bmÒºÅqÄ›¡ÏWÈÈ”ŸÂÃÕð.‡Mû¼Û²ðËâ¦Y7ã`ñ~Üy:°Ð ÏódÙ²ehmm…ºíŸ€7JBjÃ׌LÖ×]æxž'T4´+‚žçñ‡N§cSZZî¼óN˜ÍflÙ²…Óf®Õj‰F£é“РT*ɶÛF´›ÿjŶÚí% IDAT;—Ú>D€±Q‚mìHg·ßk®]º‘”׺ñÄ}|éo½1“Vþ´Óû3PüA>\J"£0tBF ÊíÆÞƒ°Ÿoô2…ÂÂB9€àË_ /¯_‡Ú®\” |¦»’øíC«ý2ð@øC^.yóÛR˜L&îy¹äÛC¾CqÂ'1¼íŒÁñê´TR7èü² {lŽçyòÐ!î·nœà[ î‹Ì…ãHý¡¬oåÃ¥dÚ„Ù8tôÛGCÿ±do*d÷¿€ëÇ‘7Jðöp‚_ç¾Cºâ  B«Õ’ÄD¡ÊßÖ­[9­VKT*SóS§Z0Ž˜ËN`ä­ƒÐe‰CÇéftœéAÜÔ±~µtuÌíDÊy’ŒùS¡à˜Û‰T‰”i3Ý›jèsò݉Ìè(ì±90_! 8@НE™?Õb‹™?Ì›7åå娼ysØ !@Xýû‚᳑qäÆèÞpºÏü`ÍøÁd侈!C† æÃG ›<T(ö7ÖŒLŸî„dD í d²!S*ð.éøH6_À' ðÒ¥K> š1cf̘²²²>=ˆÑhäúÂüÐ/ýüJvcÐï„%áJòr¹V«•x%)ˆXpIIIa‰WÎ:]ˆ—úÖ„•}y­eD0ÆÿÄ}‘x,Ãÿñ&“‰ f›§:ÜP-ûy'ç²Bõ ª®¤“í ó×ëõdá…̆.óŸûäS\…B…´‘xb®m±¶«»lÜÜ'ŸâˆëPØþÛ¹‡gLgÛŽ£L?q'ù™«»!è}ëÆ & “ÉÄm¨=Æm¨=Æy3@pü÷­Ô!ÇÞµ­¸{~¯ê÷Âawá°ƒ£+ÿE›Ægw˜9“ÉÄcþ€àà­jnnfêZ£ÑÈq*• š‰Ä‰ íÃÑqº³ÔjÄM sÙ Ÿã¨}_›!GªDŠúáîs.ü­ÒêAxRÎs0´+pœjê1™Lêi“ÉĵwÄà‰[B›ÅÌ(..‹HLüjB™A(󫯽W¸lÛ%/‘½KâÉ|…Œ­ð7.߀í{7àµÂK8|º·Ö£ó†xœK…“Éĉß!Ý?oÞ<B¾½ îs.h.G@m)ƒlR$޹èÑÿÓu?1ŸCÕ`Á‰Ññ}ŒUÍ(yÿòíM>~ÙÙBÝ–¦¦&äååÁl6£ãLĆ‚‚¨ÕjdggC)w@­V‡¤eÞf€Pf­îðéNÆüñ»/¸áíTyóï‡zü¯üËËË󧨪ªÂ¬Yž¦ÀPØÝ`㨠Ûæwž6s}eþ<Ï“U«V‘#Μû|5j>|Æj;‡»0û)Á7ÏÛ¤”“¬ Gœ=Ì¿ƒ®ü8ÞÅ s!S‰_ îò¸†‡`0ÐØØ¨­26Q¦¿eËp»p†Ú¡ûâ„e2™8¹\Žé¢ðù}ÂKÜ»DC9–QÏ1ó°Ûíp¸ V?²[¶lA^^š|ïsnft”Ç5×.ÝH>¯^Ã}^½†{µÚÅ„€îJ7^­îõäøFé%ÌWȘ­x]nóê–7×§$ërÓH„bû]ÖÖÒ§ó_xáìÚµ ---a Ptuo2™¸I$þú™¯í•‹˜Ö§AŒñSÐwNÛ)n¯˜hÐlo¥‡Ú̧`üqàKm˜”¨ö9.T_ȇK‰SfGÌ’|´ç[ÿ|…Œô'¢¢?Ð=ýƒ# vlq›gÅ7ZÎð:‹ŠŠ‚ åã– &æ²èjŒÄÀ¬ ¬ÌÍÁÀ¬ œúT’Æ-ó$@”àPfŸržCýp‚”ó޹… lô;ËfÁ8Ód²¡/Ñ &“‰{ã`À”%ŒÖP: fÒr¹œ &¨Æ†ÒjFò¾Çsj!¢g>ÁÝþñnÍÁ}õÂÝ„ªc¿-5àÑyCðè¼!ŒðÞþñ.œ0A½^Ojjj‚Ô¢Çswæ¢I5o¿'H¾5¯¿Š¿ìù'>VuÁ}ÎcU3šT‚)ÃЮ`+A£ÑÈÅÄÄ0æOŸFb$ÿv"åWjÙ75¡¸ük‹x Ká8óN ÷7Žtvc[Ì0œqºp¤³› G:»¹#ÝØÿ'¡(Æî‰éd÷Ät’×ÑŽŸ5ÄcÔ¨¨¨@kk+ÓÐEЖ-[0eʬZµÊoÂ)è+ãï/¨ù“ÿ÷'h3äM€¿î¾„£§Á±äýËøÕà.HÇGzøPß„Ý 6޾W±`wøt'ŽžêDmW Þ¾<€EŸYõæ›oâ©§žBaa!^xáÜyç¸óÎ;ûÄü^¢ŽÊÌïÍŠÃÒÏOaº6ï\jÃÅf§è^ô”©Óª«Y~ð>nN¡§P S>™Ñ¾OÄÞýŸW¯áæø4¯V»ÐèxŽ÷}lÿÞíØcspƪf8/aù­×妑ç%a9ïQ4©¦bef.×v¢¬­·Ž^ö¹<Ï“]»v¡±±±Ï}O1{¸¿Ì¾ûz؈Û)&¾4dH¬¢4™LÜ“Ï|ì÷¹¨úŸ®ú©B¸*$ ûy'g?ïäžyóqÄ4TÒþ©A@þÖ­[9jóGó$.%]–8ØÏ;9«ÕʪPCŠ U—8½¯Ý#B`wƒÛû%#"âå¦@…ɈÖ~÷Ÿ}üíçyž( Æø K!n49“ÉÄY,ÈårTUU!;;;hh–÷}(C´Ûí'Ñ †[žúˆ£êþžÃ%8xE8 ¦ð†^¯'[·neí„ÈÇî±9¸óÿJ>FªDŠ”ó2££Åúò:Ú1~Ñ#>ÏIMCbíƒÁ`€SfÇÙípàQlŸŒS0aáZcÍøÁ„2ÿ3ÎÞ×q^ð? *ÿ=6G·s*k¸œÊ¾QFç71³5}FN¥Raÿþýl_llìu± 9É ò«Á]ÐfÈ‘6 ’­úÓj|g]îþ¯8âìAGÒ/á¬ëñKÅ|Ð}Î…#ÎT(T ÎÃtŸÉdâÖ×]æÖŒL<t({εòY–J^i9‹–Õ©(5vtôÆ|…ŒdFGáHg7ŠíBA™v·ÛCš'6ÆFIqöÊ3;]eêbæî½ÝèxpoÖ !ƒ@¥¹ç%Ìy'˜ÏërÓˆ±ªu„gY¶VLÂÂwB]'??Ÿ466¢¢¢¢_Éa¨ ˜ÙÑß}õqkÂy~žçI ¯b»Ýr æ.J%Ôöc"z®ÚÃé/”c£È˜ŒÑ8²«×Î-.%ã#¡|äÍßù<ÿõöÞN¨âÄ-þ~ûè㈴Ægz:N7ãÂá^;õ¨ãÈ©Osã– &]–8_€ù ¡c…úT(Tæˆä•.Ä>ûüiCµPýAß+µýÓíPíõÆšñƒÉMr¼þ½™ÒHæÈžKáý>éïÅ‹Žœ<Ï“,›…i_Òy ‘[ß­¾äæ@…±S·N§#‹…™¨ÀxèèôØÝq‚ŠúDdgg‡í(ñ·ýÍSŒ ñm‚)Ú–ˆq¦3ÈŒŽò±ù‚ "5 ú%x{øPD¤¦a퉓hkkc´sÙ²e>´Ðl6“{î¹ç_ž<‹Ò»ÙÃÝÈ”FB:>å_´cÊÏÁÛ©6S‰#Ξ4˜ú˜ä$+ˆ8´xÍÁѹJ÷Ö«!¼PŽëw.µA.—£Ô؉¥ŸŸêóùgœ.Œ’¢Ýíöé¨ß„xinùbþ4áÍŒù‹Mééé ñûv»555HOO‡N§ ˜ ›î§J«Id èäÑj‘=ÈÔ†ÊóìOuoæŒÙÑk_úúÌf3:¿³`àÈD ›,#J¥’ÕF6YFÎír±s¡ïèØÐfÈÑÞƒ=6‡O˜™7‚1ÏÌ«Ÿ®|Ä&¤P}.óv` í?âìÁœÇ~C»Ïä¯Fää™!™? ˜jÄš':—“’’<ŽËIVgbUÄd2q Î_Vþ”ùSÍ dKÓ¡Õ$¢nçëÌ_«Õ’¦¦&¨×ë‰Z­Êü©V"Tbþ”·ˆßó|…ŒÑ»¢¢ñCT4Ìf3J$‘xµ›`¾BFž‰Uy˜•uþ"\Çj±uöLüâäi¸ŽÕB¥RÁf³aÙ²e,„³¦¦b“ô–-[XXc0\M ƒpÎ5™LœÕjå í üùŒ0·¦ü|œu=0´+pà¼Æj; í ¬¯»Ìín°q´±4ì¶B¡òàâ}ÔQ‚Jº#ËfaÞ„ôÅÍî†8, è}ýU1‡mÓCCb‚ªÿÅÈŒŽ"ñÒœqºp¢ÛÉÌEqê%ï(êýß×ÚVñ@ÏÎÎfLìÑ,þìZÞ×Âësš=­©©)l@Ìx‡:„o@A÷@¨xô¾¬úÃaúþàMxèJ¿óË&dFGáFÙüÃ"T4%ű™#Pz¨Í§Mó2R?œ ½#Æ#Cm€ “Æûy®¥À{‰ðPý(^1†³Ú÷ñý‡ÌK_û&òƒ£#¥d¨^-*øRÌîö»Ÿ^Ëû¹¼ åõ¢/þî*òÍðÄíxÆt<õ¸Pø…?ÄŸ¾øÒï;ߟþOµ†⨆ÂÂBvîºÜ4"›‰?½vžK54 »+¦ «kcU³G4†øþbC¤\‚»ðÞfM™Ã!©NÕtŒõwÐ÷ï¯ÿ½û)M)\zÑ(l=ú%¬¯ ~øa¼ùæ›ìZÙÙÙÈʪï}ðÁïÀû>Þ©‹û2ûJÅ¿³Ù|4ƒD˜ù£¡³‡»=æœ\.g9ñu|:Ÿ<ñÉt¦ÖçÁ~ ø“¬:Döb±ðX‡=6¡8"U5…z†`6ÿëpoPoXñà÷^ýa<×°71Œ›)8ÁMÑjPüün(%ÂøµºÝøõàA,)&$llµpÉc£ %”þ˜ÔLw#¦ôqÿôGxÛ¡ôÕdBA™¾˜ù‹¯•ÀBÉ‘—Ss×ãÞRC¦gk°xS!ûöp7ûï¥/[~R´ð?öü-xÄ4°/f°PïÓûþ”ÉžŽvbæ/¾^N²‚ˆM,ô}ˆVº\1}Þ(½„çž{»ÿø{¸Ï¹X¾ñó;ˆ 2NáaþCü)ݾëâcý Àú* —ÞEæmû$ ö'==…t®ZµŠ ¼Ú¶ôý¡õÞçúC¨ëý$&á¿qퟟOÖ®]û“!°ÿ×ñSñø7þ@ `¨ÊX«IĈ[‡Ýü=K.v-ò–ˆJÚ ºïߴ駃ŸÌ‹ åX '%™ì®oàÄû®ôz=ikkCLL ššš V«YÆ(@H{ã³  Ojöë…œ”d2Qß*¢ñ`[v×7\u{2-"Õ;wú¨ºÿÿʬr’„&²¹V‰ž~* s-'%¹×³ÿŒ¡ý›âó¼«Ýyoúÿjñ¿þˆA™¶r`¢4•W̭甪°’1õå>Àõ5ASmF ±%Ö"xG–{Ök9~r’D›!÷W |Ó³5(5Tô¹ êøSC°"3÷¯Ï`ÿe.Gî_ŸáñÉ\¸IRR¨LSSKI'\[[šššØ6ýü«ê”‹±»¾«tºP™{7&J# &äùùùÄl6‡µBÕjµ$cÑ"²lÃ]dÀéÓÈX´ˆ7:R¯vìÊl?âç(HÞÂ!$oáÉc£ U±¶wÄà˜Û‰œdsŠ»V K¼c“½÷éõz¢×ëC–ˆu¨w±ŠœdsJ¢Ì¢4ÿ³üW˜xÅ9V<ŽÂE¸çôçÚ¡ÐWMŒ7ó§ßZ­–´µµyTôÞ×â}ûÐ…dþøEAÛö¿™þWê?¤$“lå Æü ÒéÂ9¥Š1ÿP4CÌØsR’Ù;ÑѰÏpàúJçY8çŠM¡œÿhÆÆ––´´´\U o„ª¢é>çòH¸?x«`Yj¨Bù¾“ëß2¨Hæ‚«¯ÑN ò†Úc\áÒ»]‘.½‹­þ —ÞE‚i¼ ò‘]ǹʊnüzæDö™˜‚@[[Z[[¡R©ÐÜÜì1 é„£¹Õ)bbb`±X|t\*q¡@ûë•w6 ÒéòX½½ºw/nœ¹¡’^hµZÒ5r$þþÁ€úúz$~ù9ó*¥bGÀ®‘#¯ªÝá&âè/’’’õh¾oÓ&l òÊliYÜpàÛ‡.ìõÄ \Kúè]‡ÚË6ÜE^ûz3Y¶á.Bs>„žçI¶r˜ÎÃ`mgŒ_¥êeþ'ofŸ“’L Öv( •8ݶÙl>#½AëЈ‘••åEr¹;žž‡OÏó«eðö!¨©©Á{³âðÞ¬8æ¼¹w‰†•ã¦Ï×2'YA™¤Â#“TA󰈣“Ö妑žÃµŒˆ@ù¾“˜ž­A‰$ÿ¹zºŠï'Þó.¨P_Ö—nì /"Põ4ñªþ`u5¼·W§¥’yÛ>á‚™â‘&ï¡8²ë8·øî¯Ø1bA@ :É’’’ ÑhØäz³a©Õj6áèñâ¼êbø“ZÃ÷Jè]™PFF·Åߔ螚0{‘îs]E‡©S§%””ùoÙ"TÁZô_jœOMÇw'¨íêÁÉ;<Ç@Æ¢EdÀéÓá>š_ˆ ¬\kоijjBSS¢1B§ƒ^¯÷xž'3¦vÞ(…¼Ù‰Êj;ªÝNÈ&@†DŠS»1ÞÆŽo8ÑÉ2$_!€ÖÊxîÞvÖ^Fƒâ¶xpE:Z[[ñäv c ÏÝÛîQ[#'YA’ÇFûŒµ|{†bÀ7o˜H!‘Ì…’±\®f‚˜i?„˨tº|4Iá vކ]å¤$³°ÐÙüðÂÂW/ÜÍ*0nÞ0‘„“4(XÌPÕ1ÅLVÌl½·éqT#¬=¥=ûn3AÉ™"¿Ç\-ýñ'Øú[ùž+Yñ1Ë6ÜEòÞ:€òR.py-B_„lÜÌæ‡#[9ê‘6¨T*f¢ÈQÛ±.7잘îs]ƒµ]ðÜ¿¢=0XÛÙ”ù÷ÕÙ¶¨¨ˆ{þ¥B}Ÿ|ZV-:NK U¸ïåoB ™---ÈdÃk… xdg- cØ=‡…Œº&“)¨ÄÚ½i „yýøƒw ëµïQî„€@ Î©<Ï“â¶ømE=sb]¼©3Ý=è9\‹’ƒ]lÞußOºŠï'~€ä±Ñ$sФLˆ'¾»ˆÌª~©=yž'4äbíÚµ~3/Ñ•¿x]í‡ã0l²ŒÜ“=`;ܺÂçyžðSUx«¤‹ïþ 7ýìoÜ#/ðë™=ªZkmmE[[bcc=&ÝV«ÕÌþf±XÐÜÜì¡‚ãyžÌæ‡Ãn·ƒçy’€ôôô°jÑ‹W$âíúúz(•JVq‹n‹÷QDì݃ñéâ¤$3:Š(•JráÐ!ÔÕlÛ¶-èý)óßµyvmއʊnX.…m(‡B0úŸBÚMþ7àôé°4£#¥~‰n~~> Õ&@ R}-»K¥R® 6› 6×£¸¸•³±Š‰ßŒ©ÝÈH1M%†Í(h"EªÝNdH¤X>XŽÍF’¼…CHüabG©®MF@ÊÌŸÝ^ˉWš‹ÅÅÅǪÕjfË£çÚø“b, lcc­  € ›¹Öæ uLJÞ?U«V‘˜˜,—«ñr,ﱪÉII&uîÞnÞP{ŒÛ]ßÀmCºL «ÿ+þs$Ð9QÝì†\.Çl~xÈk}õÂݤÔPcµP¸&+"¥†*¿™ýÙg•J%=n!‹ù¦i‚K3Å…ÊxcbbBÚ´gÆëØv^^žßc®–þÔÔÔ ??Ÿ(•JRPP¥RI–.] ¿ív;Äûèx騨ÆûZ!*j¢4ņ*lþh”c£ÂÒ¬í°LôÝ5.ÈO7#'%™¬ËM#=unôÔ ¡…þ„z ×‡€&ò ëôp, EWGªVçQŒ·ŒÏÛ@îÛ´‰œ<¾+,柒’ ·6 ¬¬)}V*•>¶š²Æ™ÎJvãµÂ& ´´´„ÔéžþÛ»$žÔðÆŠŸaz¶–aï’xŸóöØÜÑSŒç`¹Ak+×4MLSKvù×4œèäFÖº°HEÒxäÔK<²‚õhll„B¡@EE…ßcæmû„9!¹Ï¶`ú„(ÌWÈü2ÿÖ_ÜMZq7Ù»DCaõ/ÆXŽÃýë3È­¿Ø÷— ŒØyk°•xLí&žp€>’21Á ª©&!W,­Úíö€&1q¢%?°Pq‘ñÿ´<³7sm**B§| ~ˆŠf÷ŸÎÁ`0 ÚÞP’ÕDoåJÖíÄDg7âââÐQÝÂ%@êã†;•™Z§c~l‡IYR—bP*•$ÃX.ïc>tÿÊ•+C:/ñ¤ÅœÇ~ï÷ø´‘ÈÔ«q)‘¡†:ì& áË»ë8:òóó¡^²·<õÐ@Ë z£/ièàØ±cGÈJL»ë¸ µÇ¸I‰j”íÆ£ó’=ÔŠ«ÓRÉÞ%òò÷G`è©EéQA½9–W¹± ¥‡Ú ˜‰}¹€ÊŠnL̊­¿æã5úþšjŽj’’’ R©˜.¶ÅQ‰\­V3[õÒ¥ß@ï ¯2ZZZXÒ ƒÁàÃÄèÀ§ år9ž{î9¦¿lÙ2ö›® är9>øàÈårj‡ñŸ°@  S>Ñö¿}OD*¥Q0›Í8!ŠÝËÅ¥aÑ©1)KŠ´…£1)KŠ7_µãƒÕŸ%âCv,ÿ_m9à‘TÈry_X&ív;4 žúù\ŸŠlþ@ Û±EEEܬY³0lÚ4¨Õj8ª«=ÔµÞÅpª¯¤¯¥•禩¢PYmÇÄ 9Yº™ Ë û\u¡S2÷b!ØØXFüø‘¢¢"–½¸¸e‡ÇbûÎcáÒ1qî½÷^ÔÔÔ`ëÖ­\ Â2»ë¸Zö3æüç3.¼í¼îˆå,CY(PÓÁê´T2Q· HHLF¢0>ÅêÝ@˜ž-12V Ì¿Âå •^òÑX­VÎ#–|àw0›Íà~”QxŸW__V‹‡“üt3ššš ?-Ôð ûëëëýªÿoºHâ8Ì¿ˆLê™ £zvþw!Î}z uÕ¸}èBB¡BÀµ ?2 ‡êß`l”c£¤¸XZ‚±QRÈ$dŽý¦Ÿêßøí“Ýõ Ü/õkÐQQ¹š1Øòò»ØõÞ§ˆ›:6¤@Wëƒ_ETz¢Ò#ÐSçÆw=Âø©tºïè†ëX-äw`çÊårXÈ×Â1Ò(Øl68†ÆB¡TXï£ IDATP°Ã0a¥ìÝÊTS¡Egµßÿê&¤å`ûs‹1xÆ£Ï ’f³ÙcR:^¼é—V«% p …ÉdâNö8¹Ú®<²³–•.¦¨©©a~$þÚÑ}`"¡Œú¨ä÷{׊ .”ÞI8¨à½" ðW=LœPÂ[õXXXˆY³fáÎ;ïd*Æ›o¾Ùg{ÇŽlŸÍfÃÚµk=;Mg xV˜úÍCYQ pÖ{:ÂŒ°ÃñîÄÅÅÁTÖËv»Cö ‘Û‡.$Fõ>öûÒÑ^±QÑc‰øoú£V«‘˜˜ÈÞ}LL 4 Ýñ¦?œB)sæ°rçSæÌa‚€ÃM0eÎöÑcÅ訨ÆöÇ8Ž˜Ñp¢“ûÓËïâ—ú5L0dÂhì=Ø §Íª¶÷ÐÐ<ãã7F c@ìøIUÿùŽnf3UïE”ønºa“ÉÄ9,eL 0é탸üík}6Ù‰ét¨Hq6Äù 9ÿñ?ðõÊÿÄ…’1ÎtFE#m@$;lÇÅf¦]¥¸å©¸[žúˆ„RчOwB÷›XÌœ>‹^he¥¤§gkðm©§IôÙíµ\ù¾“8zª“1zÊüÅ~=ÔoN ¿>&“‰Ã°N`X'Þ”ub@ROŸlÿÞ(**âú’±JìýOmý”ñó†j¨Ö‰Úœý%œê°ã¢Lî×ðYšnµû˜æ`šË«¥?ÔHì'³téR& p …ÏoƒÁ€-[¶x¨Ñ·ï<ÆQí…F3 ¿Ô¯dI8Ü~S¬'º¹.‹ ã#qá°ƒ£9¨ö‡¾·##ð]0¨#àá$ûG]Ð(ÁÚî·R0ˆßG(?"“ÉÄ<¾‹}®†ùûûíï~@ïéŒÓ…2GÜç\¨. 7ꙟqéeo”»TxtÞ””¶£¤´Ûn„Gç Q=‡K@1öØ]4«š!¹! Ïn¯å¦D Do!  àlIžÈL‚Ê•5ƪf¬ËM#ý 9)Éä£n'xž'«ÓRÉ;—õÛê´T²ôóS°Ûíx¥å,Vâ±P`2™¸âöø_n#ö°U«ÕLõ/ž @oì®ØË_:R±M  ÔVÊÐé·xRÚö†we¨Nù@œuº0¦»Ó¯[ÛÕƒNù@<ñ_Ù¨¯¯÷øï»ƒÝøÅ=—ê° £¢CÚâ)¨ébË–-HHH˜BŒšš&T½þ½ßm˜=Üo½jW¹\î÷ZâÕýÖ­[9­VëQO½?é7 lƒ=QÊîM÷‹ó\+TTT ¼¼€ x'-Y±bæÍ›‡K—.yø~±²ð /úc×Ü;P·óõ ã(Xúy;~ñŠ)))Ø;p,ÛO…X wzý¬í/Ún·³AD_ŒÕj š(ÄÚ jwKàÔöxNPš’3ú_Ðét„ VoT‡¦Ò°¥`^Ë4Ї†ŠMtâŠqÔ‰* ekÅÈV Ë`Ýâ8B5Txé«Î€Î”pË.¶"Ëf«IXlÈ.¶²ï,›…i‚µeïÅ]ÜøX{TÖxB2 ˆ³*æ\=ýáyžèõzRPP ÐJƒÁ#TŽnÓýâ<#ÞÏ@™î¢T2jÁ8RÖ&h9F-GF-Gz¬gرÖ½¥Ô{ê܈/aŒŸ2Z}&7rß=ò»xäðNíKÇ ÿEEÑï`ô‘Ž_oÞ*1›xÜ‹Çf¸¾'”>qº˜ y²ÇÉí±9¸=6—ržc+ò@iy^‡> *Ô®xãœÛ÷rÀðésJΩRña½ç‰–|6 (,,ÄÚµk=æ²G07¨®»éG€½·­6UXv¡Âqšñ ï\j£ï!K˜†Ó¦}¹€Ó‡`]ny£ôó¾Ûר§? ³¡Ä“G‹…£*&0"¢çÑV«ÕçùÅ‘r¹œPb%þ¦jSÑ Gôl6é8ÚÞNù@‚0p% ðÐTÌîÆÆêe(9Ø…7_eï‹À²»Kq¯6g®Øòkl6T0ÙL5x÷¯ÝnÇðc5xåchiW ¥¥²‹­xå A éˆÏwÛ„‰B“k\”É1´Kˆ¥¥×X¾|9§Óég]Ò;†Ìf3c<6› z½ž„ãÈ»»¾ó&¸áT£ÇS"È—^òxgÙÊA0\›Á®E‰¦xîѹH•[ÛÕƒ{UÂ|ùÐÒ{Uq¤³™¢ov¬Ã‡?뤞Þ,—Î ìÝÿ=_æ1f®–þ˜L&®°°ˆÇ:ݦšDïòÕ………Ó ùp) ÊøÛ+$ˆŸ£ §›¥ŠÀåÚNÄÏQöŠÞ²ØuãÀ¼ý' ®—ñWV «Þ—¾lÁs£0Ÿ³SÓ± 9•5¥}”îû[áÓ}*n,ö¯ÙXò6#‰@â~ ÚœpÊ1'$$Àn·{Ð ­VKÄŽ~ô|“ÉÄU(TxoV^ÿþÚ°KìPÊÀ®Srå{Û¤QÀ$@òýeœ!`ñ¦B±´lÙ2¬\¹§>ù/¼QúGšÃó<©¯¯G\\ªªªPXXèó\éééXºt)4 Ùºu+çs¡@/"ÜrŽôZáHÚ‘¡lƒáÜ“"ãˆ\.ÇCCb°¡öG®øØ×Ä’·xòÑý±±±Ø¼y3'xôúbôµ¼ëúÌ+nrcýÑ›0>C] Ü´ßçX;3_GÀªN=)9Ø…õ÷ù}÷¡žGüüT› Žý{ô;†Æú\#Ôù®¨-âßÞBh0¢ñ󛥸b¿Óçùéß– ^Ì3¦vãÛ2_Í@@ïË-·KüC¿“’’PQQ¬¬,TTT°1XSSã··nÝ xôÑG}ÞåßTÑà† Ã/N Ñ bB*®Go±X|ÌA)))L5M…‹Pc2Ø1þާmxbn«böÒ—-ã/ÐûîjXLË­ôhÿ„úÏn·#//ç>½ÄÿÐTÀÓ#ofûF,âÑׂþx÷‡¿gïó·Â ÕÁÞAî"Ï4ÐmÖx1ޝ¿²‡RsÍ]ᯭâß …f³9hÄÏæïZ¡ÆªÝ.˜»Äã^œHŠ‚FÄx·“2ê8ÞÏ@ûfÇÓó0cz6âæ¯ ÌÃ¥K—¢¬¬Œ r;žœ¾ï{ùŸó­V+§Õj‰F£ñð ß— Yt¡V«}ˇ³Rú©ÃŸðˆ(éõzBmoþJoú+Í)ž„t2û»ö‰@DŠàPš˜ªN=±•uÃ;Sb_„ï{ùC°‰èï|:œ¶#‚ÁîMŠØ\+S1*Ãa¼}}ž@ýïm ¿^}á͈ÂÑú;Ÿ"˜ {=žAl懺÷ÕÒŸpC«Cµ¶Íßx §¿r¥ê7 Þö¾ÇÛÃ…º"bæï}\(üµ~þp”Y†ö)¾N¨c‚i!¼i–¿~ð'Ó}z½žxó#Špµñ?)ä$+MCê]œ$T‰ÍãǃV«%¹‹RIѦ1äÐ×idó†‘dï’xR´i !®C„t?D´Z-9ôu;&wQjXÕ®W½ò¯†^¯'m[6“¤¤$ö¡%ýµý9zÜBvš³œn'%%yTl t?¥RI2£{ãý‹W³†½^ßçúý-Û׿u‹ã-% ôlZ·8.èu”J%)%ÏÄöV`¥ï:Ü2¶J¥’ÌWÈÚ»¯¶ÿí¾èmƒ§ãG<Ž®%xž'á<[¨cÄ%·W­ZE2-"´Bçµk­/ßòö§ñö­ t½@/ÞðÐWºàõ¨ß ´ҟϸÀó<©s¬NK%9)ÉdþøE$3‚»æBÀ|…ŒÐO¸Ç_Ëû_o¬øæ'ºVP´á‘ìnȧE£¤´ŽÃ]x·Û—ß3ãÎÔ¹xîîÏðêí˜:ë]Üüäß1uÖ»(Ø6/.íÙÝP¦Ÿ“’L&7rlü¶Þ;¹ÏÏÎ$~÷@>;ö%Ö~t'쇮„C¹ÞÅç÷äaÿ_o„òÜ šÑr¹, egZ°\…u¹i$öÃÃ}z_tâ˜÷<2‘ õ”G¼VØ€žÃµs‹¦ú ‡Y{3Øñœ ÿñÖs>žÀâëÐëŠWÞt ˆó^Õ:,e©z×T*hûéo*Øl6l»m”Ç‚!XÿxÿG3;†%˜qÒmï€Á`À“ÿżGGJ ýÌ”GZÒ[½K#Äô.sŠTTT µµYYY¸¨0bçöWðÅñ·ðßOÞ‡+Vœ1i¸&†>¦»ÎKÐÞƒöŽ<¥RIZžÁö8/ÁÎÂ6.îŸÌhÏrå|œCªòÅL‡ÞÃÛ·Æ‚½ËeË–ù=F,·µµ!..å.'¶Ý6Š©Ô)ógR*•d¦»ÇÃçGüŸ÷9â1(þ„>qr1˜:u*1uêT$%%y]гZq|lKÐä¯â ¯TØï·Z­\…BÅ4=´½9)É„†ÌR>»:-•dF´B2L"dä½"ä¤$“a3f€_[?…Õjå.Êäxdçy¿ÿÓ¾”ˆI!&dv»E¥°tŸ»ë¸¾$Áè/”J%yýû°ò;ÿŸÍö`*-ØŽÿŽý÷ë§ ª´4¬R¾áB=Ò†Ú+¼‡:YÌþƒQ2¼üžÏݵ€1û²âñù}{Ù¹ôØ@6mdª©ýJk¬î¼’!8ÑÂ2}Åögžë8«Íó<¹xïhRs³ %’H,ýüjn–Áúâ8&*4q¾BF޹Ï™pOäE¸Ï¹üFRˆÃýèܵX,X¼x11+•¨Þ¹Ó§¹Y©dç›,#2ÕTØîƒÙlFKK ª|É øïÏŽábi ª|ƒ¶¶6(Zšán½€%G:މ uAAZžóÿJ¥’œ P6Øûüù Ó݉3N‹f‰‹‹CÂÆs(‘øòÑ‘R2aT4¤‰RL ¥„ƒ4QŠÙÃÝê°ûeú™ TäÞl%.*Œû?Ý}÷f+ñéîÄü åååøâø[(Ú4†èt:bhWàƒ½ŠT¹\wëØívVDéÅ?šÀ·]‚ÉdâÆtwâ¬Ó…=6‡ßœZ:|V÷o¾ù¦°:­4úô¯÷ï‹29FGJ‰»U¨u2ÔaG‰$Cv<Åa¦»'ä|¢‘GþîþýûýúøPÁ“2Ì{"/ÂX݃ƒÕ§}˜?í'ãg¨ÃCg7.Êz5z?‚#½M;N…>ZMp¨ÃΞ*þ«ñQí ͽ‘””ÄjÀÐgŠÞ_„ãc“|ÎûÐþ»(“³´ïC½Ña4ìû¢Lî1ŽsR’ ­£1Q##à¾àf§D ©•w×7p¾b •˜zÇø¢Æz”š§Çù¸,Š ÏóÄj—aÉÂd–ÕËŸ§e PÝWÐ~wÒ³Nø¶K0›ÍØ}Êšn7Þv&!Òé™é¬R”Çh4r´¨Çëï3á…Ú5ïÛ´‰Ä] Ùcsp/ç6¶ZØçF™°‚…©GÍ8rj/>´t„T1y£¾¬/Ý8´?]ÀÞCaaaXi”»vîÀô›‘×jµä’¿Ç8}:äýÙüA>-S§ßä¡(wöà‘I*c¾xU˜”åÎ|k´áÙfN¬÷^_8tKL&SŸTÛÃ&ËH™¢“9DÍŽ²ÅŸ ÷t½+‹ïÿ•yæú6°ò/ Øÿ'ïŠÈ‰Q¸g}3xž'mmmhii ©F)%õÉGŠçGç ñaZ­–L߸‰d,ZDh ­VKÑ@”Úld,ZÄÆÕ )µÙÏi¸gUÿyïU™ÿ¿Ï\`fgTGAIELQ$¹h^W±›æ&FkÙe¾¹ZiÛW—5ÍÚ-5×µ_¥•®»‘Ùm-ÂÊt·V,ñƒ! ¦¢ÈMÇ”‡™æùýqxžsæ àî~ÿü>¯—/™s{.ç9Ïçþþ°Ù x&Y,tÅߎ5œ—«p±Íϰæ•:EÇ»î*н=ƒO¦÷Rèlh3 IDATiYúêÐ6/Òtb¥J% Ÿ!Z Ñ Ö ¹Þg.{á ÐÜëÑ·éº5ÿÀã#q²éKìܹwø ¼x'>-vbÁ‹w¢¨¨ˆ1ÿi&,?Ñ„%K–H0 .…éàv»™ÀBû¾×åÁ¥0L&¹¦Ã@¥Þ6¡øfgŠ)ÅhÒð©£³z²:ÊÌæð­G$óSb>)ÖG„ 2ûf± h“Þ€-m­>¤¸Ýú1â]¾NÏŸ?ĸé¾J‹WM:éaax&Yô°0äää`Ö¬YHKKCtt4–ßô ÚŸB$ót­uç¾ óGÿæ}êhA².tæ5ýó &H„§5„2yúlùœUùü‚Á`µÄP!€_ÇMq¬FS¾:Ìïcqù±'XE¯ææfœ*.2£~3(ZÔúû ¿¬µ ¿¬µ ëB²N¬é\åó =õù¦#ɘI„,?Ñ„=±ÿÏåXàÆ‚7 5'ztÓZŒIë:-!eGŽ ìÈ6ïá™ó4iZ 궺ÛÙa&'þïîú`=íÆa« éQÀëi7;–ÞQdª  @X´h‘"R¿Itguz¯ Œ}¡ÉšÛ—„™ÕxnÈœŒ'8ÝnÃÉx‚S3ÝHƾмW4Ž?>8Šx½!ñá VÅ PŽ‘±Z­-ZWWÇ@ŒR¿¨EÕý¢ð7ö¥‹ df¤ Vç’›Ðy¢ÕÆöCKcÀò§^ ªÑ4ï´3¡Ž ”ù?2Q xÆÿ›ewÂiKT·t fð`Ä ŒöèÍ@:"Ÿ_üæg\ñ·Ã Œñ÷:‚Ñ]r¸¢ç5DàR˜CÛ¼m`‡vã5D„”„"ZÙîJ«d5D«!±Z ü5~ÔùÄÎX­u>?*Z}pWÛ¡¬ÁœáF2D«!½T*I;¥_;„O‹( øðÆøHüïsZìܹ‘®TÜ=â7¸{ÄoHS¦:Ÿ;ñéëÇ$ý šª¼ç¥0;ˆ š㙑Ü4Ÿ¬ Ö¶ÎnÆ®»ŠOÁãçç,Ò# MzZAî€(li#xºw'¶J“Þ€ÏÖ b„rñâÅ웣çh(§[Zâ–~·´ ÷„ põÙ×P;ó9\}ö5v]uu5Ûéâã{~(¼†P‚3/R­ŸT’[W(?~\ò?lß¾/¿ü2 ˆ`]i}úHî³X,„ Z´´ÍH4òþJ‹)ÑJ„ÂèoÇ"}Nùê¸ÚŽ4]нm8QåAE«ÅÞ6”ú}«QcϦ?͆‘;|з­&igàr0é:‘Ë o[?Ö?:W*@d˜µŽ¯™ßˆw Ø{$¨QƒÌŸþ„d}3(šÌYñ;¼ÙúÓ«Î}% 1—P+€œálß¾=(šYéåz Ó =NŸÏ_k7™ššJZ ‚Ùl†~ÌÀÏùù̇©3Ñ2ŒÕQfò‹çúà„§ëÎI^̺F‡° ·…ZÑêëQàß…‹^aPE;251ø®Â„˜‚ž£'¢)—šªŽ—áׯï`V€ýHâ9}Zd™óž9Ïœ‡IëÖ§µÅ+–P6?óL¾½ú2Wê¸R‡¶zœ©ªÂAÛ5É5s†“êZ#¾ßÒˆãGŽb¤‰Xµ}0Cð£±ðç-–é-Ö\À~oß¾=¨Æ=Ðu: ¥¬¹}ÉÆµƒÈ-^ÕŽcŽ6„™:‚®J/á`§ÛmHk©Ä© ^Õ×16®D²æöeÏ{åË áOo½ÏžË é®É®{oÃHÁ}S#jkÛpH¥E“Þ€WþшÔ/j1ú6šôŒ ×"pµ¯©ðd¡]Q¢ÕuÜmÄê| ×?Z'2 MzNiÂC¥‚€¥Ã4*\ Ë0ôR©$‚@éסÈÚ‚’€)*-KËÏÏGII âããQYY‰Ýí­øþ¯ÇMß'ÿ^ù H§Ó)Øýí]VĤ–Êüùk阦|ŠÖHªiҹ˾*Zܶ´&<9N!vÔf2™ÈâÅ‹Íæ•Vå‰3<’~ñ¦ÿÜÜ\g¢€ÈT'L˜€¸¸8|tª oü+X˜ç™µ|~L&ѹEp&%«“Ò1 RFß…Á`@ÝjqÏQÚGø~?~/¿ü2^¾VƒØØXäää°÷/O»´ÙlBE«O"¬ñï_îöHÖ…I ÍINéÃrEmW°È‡;Ç1!9¢ªçýÄÛ1V‹Ÿjª¸"Î-˜e0`Ò5à7OãrøI{h»Ø9ŸÞ~0éàí݄㣤̀÷Íxˆ ‰ÃÙ@, ñéO°†‘yžð´â?¿†¿@bë¯q÷À×Hï; HKó8Ü0,…z~‰xà6Dñ,$‹-’”æµ.§Ó),Ÿ©Ã'Cô¨[=@Òa§ÓÉp”y €ÕjÂkkÙÿ´¼Ýd-­jµZ…Ó»wÕT_×è6~( ¬¯(áÊƒÏÆën`u”™PhGzœ¿F.àP æmI½Ðâýý‡‰‰‰xì­±õÈu\¿~S{_eÑíé÷ D¬V« 3“Ÿÿ-ެ^Åú¸yåJqÞ:LW­ƒ¹xÍ>uŒgªª0*\‹ÜbðQE«MzƒˆæÅÝs6@$1P?Å„€÷~r`ʤ^ìܳ©¥b? t­V«@Cxs–(\`&#KF§›`ôÅà1‡Ã! ìSòU ´Ñcõ55öËáÐ%‡#jø/áv»A\.èÜ- .®]ºÄîçn”æ‹Vž¤¤s·H=¯‰*v°ƒÒta,HŠ~ƒÔ ¯Ñ® F„ Ày¹Š1úÏ_ãGï 4EÎ÷'øÜÀßЛ¯ß”´YúµCÈûêºði± ÒL0&6 ¤¤ùùù(++Ã7߈֑M›6áåU“ûÍ3*Yš¯cu”¹ÛŒ–O-L¢Õ§Ó)RiÁ  {cÛ¶mX±bÓœéúQbörâç«Io` I(¢ë‘¤”~RiC®½‚‚!11ûöíÃüùó»víÂÎ;a4AÓB•ÚµXÄ‚R”x-Ÿ¤‚PA˜¯¬yðš ¥íQÅMI§û&ïÿ—³ÌÀñxü»Ÿu’ÿŸ'>¾¿iE²Z@Ø•#èu8^6¶ ¤Õùxºïó2¶ $®€ðÑÝVÑ£Dú›J¦Ôü*êšöÄÅ÷Í h2^ŽæÉï8ŒæÉ8ažŒ÷¢ÿ…Z¶°¬V«°aÃ$%%Ád2‘åÉñh©÷Iê1gjbºë>$¸Y‚óçϳhçÎ}½àF 6Œ°ÕKª·Q¢?_ò RSS‰R`±ó&Ün7¦YúãJ‹á׌ù7îÝƾtMz‹¨©лwïàh~õS¸{iÞØïÅ÷[19ÕÈ®ùí“Ñ!k8N¡áØ1¶p- ‰ŽŽ†Á`À˜ÌLE8OZ¾—þOÉPãG›S¬Èõh¤Æ;õpótyÐóBL”èšÚ¾};fÍš—Ë…—£Ãÿ,¶¯ FŠK„r­¬¬de]y&Lk+Pí^5@©†pتÚðñ)'ÿË«(ú^\Ÿ{.¸^ &ØÓ»w 4êèôûgddÅWÐïÄf³ Æ–{P_ScË=Àb@¯0,L$„²`ðZ¿Ó鼆ˆ ×^(t~ûɺ0vÿ–6‚ÙF=‘3w@ÔlOTy0ú6"ѵ$ˆ¹IoÀÓ^nWið›>½p»Jƒ¿¡â/Ö£r˜ò7yéŒT¸gúy,ZØŠ 6 ¢¢'NÄ=½óPIBg3 móBÕ1ÞKa:ìuyð”ßòž´´44é ðeÿ€ÈðL&±æÇ–6‚!Z Y&0ëÛíFE«4½¯C"‡Õ¦t}ÑC~žL&qºõHë¨ûÁ?‡Òå0ýa0$VRº¶xËjll,ð|Œš=“ J¥ÒåDÝÐ:w "=n&DËOùZ¢ö[ÚHÏP •SAAðꫯâøñãØµk¶lÙšoÏWçäÉd2‘§üŒ ×2KÝ;΂k¼ ßËxþ¹í¢ø­Q7€j€š²‡º2wþ›»îë5F±ï’Ø@ˆE£™ "#¢ÑÔbg“©„&éHô«.>D²Z@ÔÍß ï…ûqýŒMÛmE8In±®h='™Þ#¬o*Èðã æÚç®‚ßøˆ^xÌáÅc/Þo<ŠE>Þo<Šugòƒ^m///ËïŠÅÖ#סñÈ¥¬e5]öý•/+„™+ÿ.¼òe³Â¤¥¥!++ ¯¾*ƒÙsÁ%ðÂ?~ž¹'Mš@´ PÁ@Iâçü í¦Yúcù]±ŒùÀˆ™åðDFaù]±Ì°çü&8ºyqüÈQ ý}/| €¸Ð_É· ”ùÏøý'0Ü©CÁú¡]¾¥T.ÐtE.z÷` ŒƒÄ~~Òä…ë˜r_‰nS>55•ÐèþêêjÐô#³Z…ŠV{GªjÄÅÅ!??Ÿá»ók‘/¬4Û¨'{.¸„½.0Õ"ˆµ½ÏYbÜ<É Q¼ ?/Sjì&x¨‚‚‚ r¤Æ–{àqGã…o ïÈ ¡Ñþp¿Q/©ÇÞ)iý|ª®îѹ[ÈŠ½mŠñ7ôž3—½LËÖ¨%qLãuáX2î> c5 ,&€Zh{­>¬kt°T?ÖWm ÊËËÅy•ú¢&¹×`9n ]‡ôØŒ3&ýѵ©'!ŸC>}Îkˆ@K‡K‹wƒ…"~ÿÐ75† ú£m)ßµkV¬XùóçcÓ¦M,~A‰(øR©WŒý¡¿åZ>BÅoQæ>^«†j€£ÂµX” ºßWÛqÊWÇø¬ÓézÊü‘žm9­Ø‰À›Ð+++£Ñ£ÑˆÈˆh¦…S40~±X,½ ˆ~•ÀSKÄ ¸\.ŒÓŠ—˜1è;Z‡?¬ÈÇ„ ºä°Iד V€ê.u bPß'MÓ´ñòD¥Z¹Ù躆5mÏét ¯|Y!–üíçúyQ”„Çûº¬„§Ô‰'"%%ÕÕÕA%‘(Ñÿ1™™¤xÅr$Mš$aú|J%ù¸Ú®± ^Þã^Æüi™VëiŸDè{%ß.¼õ Í[¸sz;¿õ¨ ÖÓnøÓ£˜0õ}–ÐÝØl6Y,–PÑM|ŒSÀ…!j<©õùË]rr:ëÐY­V!66.— åååPªNk_ûü3¸\.V]/”Eо×ÙF=9gµT%kœ¨ ÚéDjj*9½{· ;PSjhÚ%ù\zǃ<¸âoÇÙ6ÒìW%é|ÿ•„6ú½ò]'‰ê45SaØkˆè2 ·…økü,h*ÐØÀ\%ã&Àô *‡ÅàÑúFìzèA¤œ<IJæö%•¤ÓTa(1šq邵X»Ñôóâ/Ù¤¨´Á€'ºgìuIƒäøÔÀP{½Þn·3!’æÂÓ¹Y¼x1Œä@dÔÀ§¤Ñ|x* ÐçTùü|EQ1{Á­GÎÒ™l &C§µ‚úÿ/€ÙºN–ÁïÇ<-J  µBÝwiÿ©ÖO¯!­>”zÛð”ßTʘÞK1øxÞ`±XØ5J‘ø” „M›6±àÅ]»v1óÿ®]»$×Rk¯Ë#È]/J”¬ S,żçüa¬Fíîj±lðÀX13 a8S$ä–vžxÀ#ù9úþ&igñPö6yä?z¬²²’ ÔwC!ù Äf³ –ˆ°¨Þƒ%âÜn7†?‡¿€ÝnGìâ†ßZ©ÅŠ+0a‚2¸KW ¾§š¿)Ñ>Ró¿Ü_EIÎøå‘ß2XOû@Óé½´Oo}`GóVÞû©ÓHç5µ£Ä.ÚßÇ„©ï£`ýÐcáó‚W]]]RIÓS#p§9 y_]N½Ù ä¼T+>†Oš¼˜±´k?"w(Rês]]è#t9$õÀ[A±·¥óQW@¨Ò¤ôùtC;¤ÒÂn·Ãn·£ø¦#þz#<(H• |¦Ô4ÝoµZ™¯ßi-Æ#5˜´n½âÜQæíÒ%¦ýb̵P!ÀXWª„z|ºžÎÝ"îÎ;%à šÊBÍe®-„ ±=€AÀˆ0-"ËúöÂü/¾Äx]86ßp2æ?ö¦§zuúi322ˆ©ï\hê‡ã,±Àh4bJÀ'~ ý¼Hè“„å'šPÒ ŠáÐ6/\±ƒƒö‹¡m^Øz÷ zw‘·ÄúCS&B7u§Ó)ÐÊ&“‰e Ñù¤×óÌžú›©ÒÆ_/PL‹ü—kÿ&]œÞ~¸M”·˜@î.³XÄrÔIIIˆŠŠÂ”ï>Ä=ç#q"½QQQŠŠeú<ã¿m€(§…&\èof.z?7ï"¢Ì™¶£ojd×ðs.§ŒŒ R]]¨¨(TVVbþüùˆÇñãǃÒÇõM,µ¯»bh|v‡Ü­='a89å«CêþwõH¢PpÊ/âX¤ßÝ ¿}2t@¹Òû:3.À¬|»AŒ4FTVV ñññ„2ýÖ†Døô'Û%ŠÙµ„±dóõËx_lF¢æìãÇÅ 7>‚“¢WÑÔ?9Ó§›€ÝßÞ#mš·(å™+]~ìVª“ÑëÃãÅM¢Õ!šÃÍ¢¤¾¢ŒÑMïDß™Ùlf&AJÔF˱ö$`mÒºõ¤uw>Z b&ô®æ2u>"ÍÔ ©c´°žö!uŒjÃH•À,‹…¤õêôSFOÑÑèüMëÀ7å³ël:€Ì l#êJ°‘›S•Þ½îîɽ´¼/=žž¿~Ѐk a’r¸òvº"yYŠtF×ošNÔ C­_zNoìI;~­Ò(ìþOf3<~Í›Ífc23Éo–ÝÉÒQXæûßb·C¯à ¦ýÓþ—Kâ çåËøïÅh4Ây¹ 5j*xž£ß7ÿ^tî¤)ÀtË#îiÿ(-ëÛ ›¯ßÄ®‡ÄÃÿøú›1üšú›Q2n²Š`Y‰‰‰ˆ‹‹CTT”$憎'!!1¶;wJÞÿÎB¹9hÿøsƒ”)ѱP€÷Ë#ùòó*,ÒãV,£ŸÁ1jgܦ®‡5 ::š ³´³fÍbÐÅ¿¯ûã‹ÔxDÛ„Ö9O‘››ÀÏᔀ1žйå¿~þiÌ'œ/C.ôV"íüøqTWW1~6GœÉŸZ-’uaøÔÑ"Êä³r~3'a8 \©C±· ï'ÞŽG«jÙ8ÿÚ?O•ÿ¬¸oÈç +â•ZÚÉ" U†‘/ j4» ¨ûw‰‚ù¡ÐæG’Ð0 ïWOÛì #éŠQ柒’‚;w†,KI©OtlÔ|«BÐÔÉÿÏŸ? L ”Šo%ýw4þ*èš› cÕ¥  &T©¤-¿øïž¡Á©ÓnŒcÀ÷ü¸{†† ýûµIŽŸ:ífBßvOH¾Ñã=]¿ò1Ðq„j/Ô¦A‰b_P. , ³ øô@Š àp8ØKKGŽ7 ¦ÿ)ÍÔy²ÐÎúu«Â<·r/Ï”î§ŒÖ Œù F#–† LûºÐߌ±7;5yžùoÛ¶M±]^ç…¾¡Jóãæ™´¼ÿ‹/ƶmÛ––&Qèq¥õ#¿’ÿY©ü3€`A Ôw!½®ÅnÇ’+Øñß×}{ÎGâüùóHHHÀ}-Ñ:çife¨«« )<ÊûÈ÷C‰tµ•æãVøˆÒÞ$o›Tᙿüü³ØJc6ÒL½p‚ ²?t(Ú:1ü§Yú³óiº0¨ÆJ”4ù)•’|Ì!ˆ|èÍ·Â<ÿêÉFøŸÐÿ×ý¿•>ߊ°ÑS¢‚À¿#üÈI.ð}L àn™ù}ý¢IlÄëÝóóê™]Yå 0”öÚ“þ‡j—Þ§ÔŸgÜŠÕK©Ý]ªÿüïîL¡ÝÍ=¥ž ½4×;” AŸsª—–1þS½´’ ÀPcWbJ]Yñ”%»«)ßÓñwu¿R?oeíR0&ú[IXE¼ T]úîÖ\@’_ÓÓïïVÇþßzNWýä…Od”䚆fê¥ÈÜùãÝ­#žºë¯ä¤|oOÎ…¢œœBM>]]×oœž4œô.—¢æõ§'OÎ\ êû⯕ç2ÿ»”Mš››Ñ»wo¬…ÆF1‡ž“ÿ  KÓOòK‰rrrH~~>`Þ¼y’1ó”‘‘AæÏŸÏÊUþ7æà¿AÔíru]àç¿)Ü(‘iXñ»p_ëôñ½4êvòòÖp¼º¤k+~^u;Ã}¤Åàg“ÓȬµ$eœØFÉI1ÔWº0!;;h.ÿ]ÊÈÈ ºGo¹> Ý7{²'ýÿn…ñw'dgg9ßS:FÑl}šNŒ]ë‡ð†ÿºÖíêÑøO×¥eddíÄì‘™!?=w+Å}rrrHzz:6lØÐåuýÆé‰ÙØ}<Ó¢ IDATù?«Ñoœžô§'[W}„7 ôwÌt1÷9//¤¤¤ +|ýäÌdákÉÂ×’äÌÄ4,ŒÐcrI)>>ÕÕÕ Å,Å>Mñ¢Ó|dkW8ù4(EÎTø{6nÜ(Ì›7Æ:Ñt;g¸‘Ì6êÉK£nznee%âããCSü§”——G® D® DºJ£:S+yæçv»Y Øpg3¦»o!êÉ‹NñÏì©U§~ãôÄ4,Œ8/¶ ts·X,$yîòmAú›^Ô>¢EòÜäå­áàçÕí«…µØí,¢˜žãÓ±L&«Ø%‚¤ëgüqqqèÝ»wÐqZ®—œ–›þ¿j–A ¨;êIö Oc23IA] NÃñÁzÉñ1™™äÿÙ½ ¯“<“"R8b~¬Èzlß¾§×õ¤/kFö!{Æö}­~ç¤_=rrr°aÃÁZZ‹™/ý€¿Ýycn¢úšhBõ¹E¦L÷ W>dÄ\2J%H ˜íÛ¿ë¶;hdÖZòØúõä±õëIÊ8Ò&MFÚ¤ÉH§BÊ8&dg^øýJ<¶^9SNt*½»ììì.™¿É$VSäJѯ]]]ÍR »cþ4Z¾'ý uÿ­®=zßë9·Úù>EÑÈ}9T~(ÊÍÍrrrX9朜œ æˆh¶>M RF xúöÏ2J€7ü×ÐúKpY5•W1æ«ÅõºNN)((TCFÌ%MW Y-ö6Â7¶÷¬è;®:÷•0{dð‡›MrrrH^^á+וö2Êr—5ž‘‘Aìv;ÉÉÉ!fg ¦zl]õòóó‘xožœ¹I}&bÉúLj†“¡ÍÑŽ­«>Bvv6CS“Ó{ "ÓO@iGÞwrjæ-ŒBé×aÇš+½ϪØÛÜÜŒÆÆF˜ÍfÔÔÔH„Êð)˜%Š2HÓ y“8]¨|Z ýé‘F~ʵÈï7¿…Â?Á÷›ßBm­X êÛK—ÐZøkBa€ „7 +V¬i%øOé¹çžÃæNGJð|Å(•$æ?Èææf†îv»͢ׯŒE¿³Ñޱþ6EA‰÷qÓß=͸€ä¹b©]¿+€ä¹#È»%¿~m ¹çY1x)f î?/`ÎÈW06% éozÁ[±ºÚÍ@@ØŠ“ ›ë®à íŠ71'a8Û ¨ehêÔ©ˆE\\ââ└ĄG£ÑˆŒŒ ’””Ä,7ÔlÌÿOç`JÀßÉ DGG³`Ë3—¥H{=¡®Ê»*Ñ[éÕï'έ¦3žÆŒwŽÃa«¯cL2tŠ49&3“äää3fàÛËÕzý-Z$i§»ŒŽ5#ûͨÐ?2=ôEž“äýý]@QQòóóqmHV÷öbñ߬ð9ëj@\ÿ¡D!àF…8ts¥P ì÷ž±ý‰fDè™Þ¥@:2k-©øô2û]r2€ç§M¶m)DÚ$-0mÒdì:'¢ìõTp»ÝX~W,òWÍ’´OµHyZ(}¿‹Xœfñ°¡Hq93Û¾};Ù¸q#«¨¨”ŠÆÓ­†,¿+}-tÉÙ®ˆ®µ[I©å3øãŠq=xV¤Ç…¿LèòýñûswϤsIÿ·9*^7Û¨'Ñ5Ù¶mêVÀ¸Aº{ulâk$e”xjRZ–¦œÖ_‚Zøë@k …Ð[±ÈÇO¿µŒŒ RQQAhTMWÅ Œ-5ûa±XÈ­*ädÌ™I*Á§¢¢¢°bÅ L:)))pþi™ò݇°–Õ ]ø ¤u|ÐM›6mBII ¦z$õ™ˆçß]‡© '=ÂÆ…‚‚/ ÓoœžÌI~Ï=÷rssñsàæ$?žGµ{(µ¶ ‡hÂ?ü¡ ´ ÜŽ5WËx”ƒ2ùøøx$%%IJ?Ò¼¸¸8Æðéõ<ÀÒD?.Ê#@Y}S£"\3²™3$¼VƒAƒÂ£Q£¶¶ ›þ0Þ.Ƥ´$´þšÝ—¿j–ä·­Ù‡¬Ù§Û…m±XÈ?~Cþ8/šÌn$n·[Ú6mÚ„ð/à®K»ÙG´:ÊÌj˜L&bµZ^ó7 Ì2éq#.._Í€:;®ŒÅÙa÷ñ©§4‡g€]ùðyª¯©AÃIðÐs#ñô²T)œ*‘´ŠŸjª±öãÕ8ò¡/=¶€XØŠ>c¯Ë#±ÐPøk>··IoÀÒ0‘QK >9ƒÁ³ÙŒ¸¸8äåå!)) qqq8ðéAäååaêÔ©HJJÂÔ©SQ\\ŒÂÂB–Æ×J§Ù6ÙÙÙÄ4,Œ¨ÆâèéZØI Þy眹ìEWéK¡Èd2Z¥;*x}Éxñ¤°pôyœÞ½[X³m°zxîÏ?bt`?^ù²BÈxñ$ÓúùôÒ¥÷݇¥÷ÝÃ¥‹8pàΟ?yë÷aèuq¯¡h”rHj@,vEÿ~íì  buEÛ·o'S§NEee%òóóñ+ãBüZ·Ëú˜0¿¹¾C|xÏýð ²aÒïFI²Zo(jkƒvœxmwî—Ç7 ÅŸˆ?gó^Þ>XH/Šâ#‡Û¶â±ùë‘¢V ‡î‘`00)-)¨}º'ñ `ÔWO×ê!•VÕâJ‹èèh¬þý½ ÌŸ^ït:ƒ„]žª|~¶ÿïÒò»bñÛñwôèZžñ+Y匈Pd0°ð— øíø;º|tVªoA+äÊÉ,LÇ”˜ ÀW/9žššJfõ¤ØÛƲ=y­¹à ¤õ— ¤‚ ¤B<}o®êö3ðÛM˜S‡9CML†ž?~>koþüùXºt)»Nåt:…È3°t°±¥f?17˜ºèż„,·Ð’‰à;Õ†i z#5i0zý¶7¼ÑÀ_ŠòòrlÛ¶iA)))èg%ZÞÔOMüýÆéI˜Y“M_â‰'ž@QQîò+ì)ý @‡©·Cã&ã¼°hYZú"95ÆÄ¦ùoß|Y.ñÀ2Þô³ÆÆF477#**JÂäéßÔœ ˆÑÓ555ŒÑÑ:δ/4ò´¢ÕÇr§YúcÈ·MhÒ$ž”JÛ£Õ5R“C5@ÌÙñxûýo±òù4).ᣭøÇ¯’˜5àÐÑÖ `ÍÈ>ä‘/ þÎLTTT„üh, ù`ªE~¬§Ýøõë;ÄþöM¥õ÷¯FëÂ7׆"Ëú˜`øb+Útjý4õ‹F07é ¸xä2†|Û„«ca·Ûá¯ëì Ctw–îäó{y­8” @µÓ°0qã>R†S%m8UÒ†K§«yY*,&j.—‹q¹Ú_ÔÒæŸ›fê…±5ÒL½$~ÒÍ×o2ÁŽº:h9 –Üü×—M(,,D{øhômë‡ÂÂBäüyyyÈÊÊbÖ¹FAÿ¯®®†ßÀÁöj¼ÝÖ¿+€}ûöIÒ¸º£ý&Ô ˆådyÊÉÉQœÏŒEú•/E §‚w%V€×ÎÞø’ÄÔâÇA"“É“'£²²î¡bÍüU"”êa«€ÇCˉ2û!Z Ye&ÖÓ>}WÕ%¢[ß¾}±iÓ&lÿ×=ˆ×ÿ°äæ)œh5aYžîmÄ‚—¾À‡÷Ü«•õÐT, êÜWB²ZÀôǬPuî+&t¾ýþ·˜·>8˜·Ž¦ŒSáãU«„_<ªÆÇ«V o,$“'OFñ‘ÃøxÕ*¡ädgó^bc}~ÚT!E­>^µJ%äääY³fáHq¾¿>˜½+ê¿—ƒQâÍ×ÑÑÑHKKC\\Öý韌ù÷D›¦ßßÛï‹_¾™wK.¹ÔÔT‚^'™kY ̯¹ I˜KB­7y»´<°Í­Zæ 7}S#|gH^½K±v¥*Ÿ_à1üù”ÃÚ–ã’´H³0N·òÕHsNNñŸ) *uM _…"Ÿ&Z t­J]×wH£ÅóÙ·ææÍÉÉ!t¿÷ `ÐÚ=عs'h¡µE‹IÐU€ø|ê `éà™lðú¦FP×€RŒ€’% °°%%%x§Uß©6¼ÞŽ›o5ãp‰N"Ùó‘ž '=Âû·àî¿A˜Y˜Aal @'ó¿]5ã"Ä÷çþ‚OŠßcÌî}V…ô‰FÏYtÔËxJ­-HNµ ÐsکƼ…âfJMþ”ñ—””0³?ÏðÑÒAy—Àžó„µ?³Tº¢ÕÇ éB–G÷²èúSׄ矺Ö²ŒÕÆâ…ñF|òô(Æèg®ü»pßçeBºZƒyë÷aæÊ¿‡”lÿz#W¾y Ü5jT— eþ0åÅ››‹ÀÕv,ßý{¯§zi‘}µ›o81k×o¶§&£Ñ»ÝŽ)K‡i)1Œñ_…Až©ÓyQ€±Ûíèd @=—îÆ3~Êü/®Â©’6äe©pÿy÷<Ûš„¹D“0—øÏ‹ë™2s ÿ íšD°ãßYE«o[ú²ßÕÕÕ(,,DYYf,˜uë´6$Bcp=FÔàý®Nd@ji2 ,nb×½·1Fùâ]ýððì'Ø=;ßý;>úb>˜òòìþ “ÃVÒÓÓˆÌ 77—=?//(™$Çdf’i¯e‘'Ö>DÒ^M$ýÆéÉÑÓnçºfdò_Åè‰ßLhvìØøøx.]Ľn{ëGüïÝwáy_ |[JðÎmë1D«!£Âµ(õ¶!éºw …+º^ø½dûöíäúõë(¯¹0N-`|s)&hOà„Çì«x~ˆ™ ®ZÒŸí,M=dÄ\²Ë[†yë÷1åÇívããÊ›HM xÝññP4¨ïãU«„’vqS|óOPr2€‘Yk eþgó^øX‘Ykƒ)àŽ"4ã“âãã±Ã人û7P(t¾OÝYæ 7jÑŽƒ1WÛáØø¨â=‹…x"£ oj Â0<€6†iüòL³ È÷ñKa:Øý킜áË dñ¤õ—@Ý~—U£YeãDŒ™3ÖÓ¾N4bz„Ÿ’’Ä|»O<ñ6×]Á`Àk²Eñz ÐiÚÿ¤ò&Bq6uä4zî4é H<æ2 3.€6J©  @(PMª¿¯FJJ 6~¹Qø#@h``vv6Ûìià'ÅïávÕx,y| ŠŠŠžžŽÆÆG0kÖ,ìÛ·6lÀóE-®ÍÑÞ=@)ù3¡ÚþÂ×’ô‰F¼ú¨“µ•œØÏLøýNQ`°¶°:Ï,°¦¦†Yhˆææfe \ž[åó 0™È¸ ÎåtJ¡DijÝ3Éz¼[‚矺_dî;n'§|u¨­-• ©Ý÷yY—±˜·b6mÚ„ìl)++SŒÐ¶Ùl‚õ´‘¤Ž1 ­°è# ?éÂð­ËsE¦¼ø w@T~ºÛíFbb"ìv;Ú«/#@:ó`Õ­gp¨¾´6$Âáþ!èê ¤<=.fð`”~uNHž;‚P¦—4cÓÒpª¸Õe{Ñ.ŒÂî? ówqøä£ap ÖñuÈtjÁ9h»†bƒ½_Z?~T¸'<¢PFÍöTX¬®®ÆŒÓPXXûU;üúžý;WXXÈî¡¥·ßÿ[Æ Å}ë>ÇÔôéxxöÈ;ø1¶nÝ XzÒOô!çvÞz7nòòòHQQf®™{ÎÐa$77°uëVJšØ˜ÌLrGJ'€ÒO%~´õº‚Å&Ž1à™Si˜3|?™8Æ€Œg£pß´zIûW€~Kl?: ‹¸‡ÃöíÛÉ–üC+âRSés¨™´ã[aB@²ý*Ö5:„!Ú²:ÊLxMiîܹشi€xLðÅø›§Dæßj§}‡cT} H3ÁóCÌP¹T˜vÏ=øŸc?ᯎ&?¾|FÄ(k@tOð0²[\GZZÊËËÁ³ÔmPÕñ{dÖZòñ®U8|ø0Óüùù¡™4& øÈaˆ™¥IiIØúÖ>¼úꫨ¬÷——_~‰‰‰x|¬(ˆÉ%¦ÈÉ(*õ”ÿþtXŒ[8ì"’çŽ ¡ ¹ýñÁQdRZë×¾}û‹RÄbÚ ›8pà¬Ö ^Çeþ´m¾ýââb ªR唚4VÔ@ ØñÍyÍýÖ‰ŸB¦ÖºÝn 2 ‘M®EqÇüÙ…AƒPÛr¶ºè1×A~ÜŸ¬ #ß~—Ât¸ân ‚oI¾ZœÞS¬_´uÌ“º†¤ÕIjÒ`‰ 汿~ §3ŽžI²JQþ ´*l©Ù)« ·tðL|ê `”J999­Âù§¤×o{ãæ[Í0ýþœä:A©}fg <ƒlxûÙØ·o ±aì\¹6lÀ’õ#©ÏD¢Ëàƒý[˜@™}²:óÞÏþÂ×’k®°v¾6”Z[PúµC ‹|óQætjýý‹¾`êë¥ñ4²“¾pÉ‹‡ù¤ÕÞ”^ÚK£n'“F‡aRªE¡8R\ëijkľ TK@)XÆ{è òÌå(++âE‹°bÅ dee!77WÈÈÈ qqqxïÉDè¦,úðÓz¹¸ÚŽd]|Ù¿Á”ïöÂn]/´ˆð›ð­Ëƒ§®6†ÔxqA/‘––†êêjØív˜…éH¨ByU¼½[f9ÿ,jQ#h™L&òÉ=ž¾&t u.hDŸmñcèwçL T]PÀ„Ž~wÞ ¾ò }wþQjÛ:`°iû4¶ƒ¯öE]S§NEYY’’’——‡HuºâúeAeee |‡÷ÿóÏ©¾v‰¬Q×Ba‘¸éô޾£uPäDÍó)))!ƒÆdf’¶^?"ìæ/ »ã< ÂHTìÞ‹† wã÷Y¬ó—†ï–Ù0çÔ5Å礦¦’ûoûºíð$&&²sÔJ““C —.Â=tX·¬‹…è;6ä®J¸æääòš{qäÁ3äÆ7—bÛM?~Žýg0õZ=’uax~ˆêájDîîƒý¯$`mÛP€BÒÍ›"Ýñï'11/ÞÕo~ØÊö¿·ÌçÏ›ý)ó—»èq^Xøãƒ£Èÿª b ÑÑÑ,5X‰‰˜Lb%?Þ$­„<è!.DFD³µ,ŸS¾Má*B FøõnhŒ*8/¶ÝKû‘â2XËjpðš ƒ±±b õ\ pókÅ÷Çc8(ádee!///ÅŽº å}§Â];­>–sOÛ ÀEsôé}-„ÀŽ(hõ ÐT,ƒ„ ôY´¥×Ô'Šli2™ÈÐ6/4£“$ŠÏ5 s‰ßn|µ0©K—‘걊.}¿=Å"è)~AÐAêÛ§‹{Ȉ¹Äã8ÎPÎä‚€Rd"Õô‹ŠŠéééLQZx@gÎzz:žw!îò+|Wõ¹hX²Ï¿»mŽv<9s)>Ø¿I}&JÌÔÌ¿hÊ <óæöÜKgù1y[ôx¿qz3x0lÇÐD>‹> 'q¶œ`dbçmcÓÒðã'íè“pRrìTq1ˆË…(µ Mzû{T¸…îVv\ MÎ(Ãþá£lâFFµÿÄÄD”——³±óóçr¹à$0 Q’¶è|~sßhÇMéÒýˆÌŸ¦‰v…1dÄ\âŠøÆ–{àŠø îÆ˜™*ÌýùGT=þ;2Hâ÷ç!ayÎÃëRæÿÉÓ£`-«Á3wˆšß•±yT$NÖz+Áu·=¿ ¹Ÿ•†LUéŽîØö>&Ĉü -møÖåÁæNºg¶ä:½/ß$õ‚úh ìv;4±Z¡kŽ@Ò@ÚÃG³ëøõÀßP’çÈÛlÒrÁê+f\:pýî¼}N¯NaÌÿl9aô/UÃsú4ŽCñc,j›Ž˜#éqC0ÑØ@E«S áhl°8ìèt:Z@ µyºf ™~½¸ÁP<Êü)ÑŠw.— îˆëDLõ´´4æ­A…û>¯ºcþFDzz:–,Yòºª+^‡XqÐw/ÆÌ·„ªÇ‡á%ã¾Ïë…î˜?µ4lܸQðW”cÛá#XS‡ºÕD¡Œó™w—Žu6ï%ÿ×å@! ërŸôï׆iý’|ù{v»Ýpºõpºõ˜ÒQèÉC\ð" s·0¡éÒé* AÇ­Aé´ ñ¾¤uš. v»@KYçææ +W®DYY™$f‡­§–ÄÿýסÁޱc h‰0Šã£çÐ}j¥Åb!ÅÅÅØ¶m&L˜Ð¥kUÅ›@öžÝ”ç?dÄ\¢n?ƒQ*A, <`‹F¦f3žhàÑ#<"Ætä­o]ò ”ör6ºuÕGغu+Ö~ôÖ~ôÚí¨ÿÁ%¦=ƒg;Úíø`ÿ,Yÿ8ÊnÅû·- ±Œ÷ 95™šìXsEرæŠ>ш÷^˜ƒÒ¯B¦&CGë1t´øql=rõƒ¦øQíž÷åVWW3Ð> ·˜L&2ÍÒs†“G«j1% ZHx©_tòÀ#gÚðÉÓ£pÄêÿ?Ó†=ç/Qj‰lÆ€B½HžÓ4_8fÛSZe&?-~ ‡î™;¶½ÜÜ\œ{<“2îFù{[$×Rh·Ûƒ„¿+ôóÂn·#¼_9ÚÃG£ìJòœN§ÀWúã³ øc450”Ãf³ qð«Spãü8Ü8ücü›¸>÷oÞŒSÅŘ Mä³ÌRÐ| yV©,‚— ËúöÂÛ–¾ˆôˆ¡Íf(eÞ€è.*++ƒÝnGE«ê¸Û£ yyy’L~îèsl6›àwuÆ ý€Â¢P]]Ï>ø@g¶CWô‡¬ÉÝ}kpwßdee gþþäWŒn~-Ü´'¢ÑYªsWÁ‘‹ºk@gþ? º²þv½‰‰‰ðW”³÷X]]-©'Gb”Óê(3)õ¶a]£C(õ¶á“ •¡³Ú*+•0y7áÕá¯OŠÚ.Ëóÿ¼7.—øð¦ZÔÆRÞÙÇGâòÁñhu„ªŒÇæ‹€IòÈ~ìJÿÑ@@êÈÎÎ&‹-’<3##ƒDEE1ëI\\æ 7†ô ¦qó€PÑç~½[1n]xÔJ@Ÿ[üŽ[†Ýߥå‰î;©‰*ÑjqôÌf32&Džý IDATöüµŠÙræÍgѱñ D… J«í¨hõáÂE¯pæ²ç»Àrrºõ€6C„&RiѤÇí!.¸"$f ‡Æ¨:K˜S €ä9ܺÈÎÎ&g®tfÝx ,; 77W°Z­Bcc#ìv;ëuX,‚ˆéÄéÖcŒJ¡¡s?¥óÑ¥&tþBer¨0”#jà/¨:÷• ɈÁ2êö3x*j""ÌPüÊ?{YYY‚ÜôJr\²þq,Y²õµm¨¯m ˆaÕô¨ÏŸ¼÷Yh :ØÒö",|m yåË á½æ SƒäÔXÆw~$|ºµPWݬéÿ4úŸÆ˜Íf6‹ôb€ýH ÁcJcæ]k+~ŽX½x¯Ôƒ#V/NùE)ó¨H,8Ý€qƒt\mkDPc¶Qß-œÍ1 ›Í& éïìqÉd"yyydY1}J›û|°ðq|°ðq”¿·ïîý6ÈÁ3kÊüi€Ï`B úô'ؽò’ÒAãè`®¡`8åו¯l6›å<ή5 ÐzÆãl9Áßwáªñ‹GÕh8v >ý " MÛ¤VÁhd5ÅŸ·]—à:üíz3r²ÙlBïÞ½Y*lVVšôL:Uü=í1dee¡¬¬ f³´¼vÐüw0÷Y³f¡ººšÁÖý€}ûöaç»—d„¢É©Z¶úØfý‡¼/…™+ÿ.ü!ëÁBÀŠä0¼òe…pz÷n¡êÜWBÕ¹¯„­G®ƒ¦œ†¢Ó»w BFF96 ³fÍBAA@|AA@µY*ô„ùÓu¶×åª|~¡ÔÛ%TLJNXˆfÞú}°ômIˆÂ /bï-€& üïlßñÖ5Æt9h/âQRå1/P+2âû>a °–j€šÅ^UùüÂí*i…P ic`ÒV2mS/¡ñpéÀÕ [è*ÍÝÓ6mÚÄÖ°Ó鼆‰%"77W˜5KÌÊá!¨m7G²gå‘Iìo‹ÅB,QB·î\¹%‚¬”HEMªn·%7Ž)Â’VûJØ{VÜFhÇ`Ý™|AnËÈÈ |p©6OPl¨9> ¡Îmݺ[W}„˜Aa’º7næ$?‚ú:ý^ôx´?6Qã=(:*úLM™xà¿Ä;UUìZ@µ~ÚWîÿ§DSÿøšs†“±5­ªÅ²ØØ36‘ðÎ ÔßÏÓœ„áä¾ÏËx¯Ô#AŒR«ðÖ9öº<¸A:ì¹àTÔ]nìýé¾TÕÔÜR¥¶ììlzýM¼‘ùÖ5:„½.@r². yyyAˆrü‡ÀWßâMŽÔ@Íè|x(†HQCáo7;M{ Ff­%±‰¯›Í&Ä܃˜»sÐgòs˜öûñ°hSå<ά3—-ƒÍfNùÛát:Þì/¯FS º$ÂGG`Eþ£Dƒ˜ÊÊʤ4”äã Úÿ¾}ûpìÌAIª««Y6@WV€¼¼<òú¿‚üë999dôÃ(ÞóÇG%­Âf³1!àŽ"þ·àõql X,†þI½œäY3€Ôr@‰nJšî^—Gø©¦:؜ټS@X<Ðñh‰KIˆBûYq³ö9ëQ\\ŒÖ…o">>ƒˆ—¿VŽj—ue„:ßgòs¸y¶ótÉÉRÆ©@Sþ(ãO›4/ü~%Ò&MfBƒœh;4°¼¼%%%H|f©ÄŠŠx8u¨¢ú1‹ æüÚåçÔç`ÅŠX¼x1{æâÅ‹1aN2Р ©LðÚ\\¬å‚* Œ:…žxÿ=Ÿ(· ÈÏ¢¶½k×.fi¡ÁÌÇéØú \m‰ÀÇ*ж$Ây?¯DûD Š’OëÊ”••I‚\ùxžèþGy)C“º$(–Ãívw[IéÝt§üI‚!”Ê›2‰ÈP”.©ü€™P€æþSÆï/¿achè€úŠÈÄï}V…¾`A€|d?-D}ÿ0xð`v8ðøQL†ùÿ¼ @Ìç¦/‹ˆSþvæó«Q³ß¡^oX3²ù¸ò¦ý-T* G·Û §/>ha=+ü!— )ñ)œüyÊÈå³<¢—fðÑÁ@çG@ן’& ½«4vjÚ÷«E êæY¡ÎŠÞ3Tð«Sp6ï%¶¾g.[ưh /¼ÐµG™5 TÇÝ»ÝârA0YŸÑh”0ÀÞ½{3—@ss3¦Nʾ :.ɼw1ºsô4TWWãÊÍËìœÏÀÔôé¡€/fÃC%%%,Æ€Îcbb"RRRŸŸÏê·ó÷.™Ô“Su8lõbrª¾}¥³Ž÷·ü®XLN7ÂÃV/>:Õ»ÝÎâ(шmz£‰ŠŠÂÂ… ±cÇìܹ3dU? ëuªìåŒ]ÙI“QòãIŸ•¨ö¥9xáçpQóîýAóNé{PXǼIUþ<ªéÓµõâ®Ïñçg¢×HïZ%ÎWGzà76(–â¤ßoVV}ÎJjÓ9¼öùg(1šƒ×;#Ϫ¡Qè´ ~nä;âÂÝ$\±œ5_æZ)0ò€ÊzLÚJ ¤¸ Š ­g/¿üy|ppWßþöíÛÉË/¿ :wr’êÊ« Êù%³0=(Ý™¿R¥Åb!T£ ©†èv»YFŒF­(àZ,b»9R„þ0<ÎÁÊ—ócénÎäû£Dù2?þ.¿(1úÕã8®¸pgÍš…Y³f¡¨¨ˆÕʦ÷.^¼˜Å„Þyç<÷Üs€wÞy‡19QŠœÛíÆÐé³ð̆NP_Û†ÖJqÏûù{222Õì©%€ôOJJb1ræ…³_íÆX›ëÄM“ÖL?r¦ ãµjhF¨qäL3íóÑÿrA€ÎåÓ}Zñq¥3Ë£¿¥¸DÁ'”/P)ýèy¾îrlC=¯'÷ÉÏweÚç£ã{ÒªM6;&9®õŒgùþšÈgÑk¤À"²- áS)ó§ýziÔí„ k¡6NùøùôE›­³t6nRSS‰¼ºü~j…:væ 4žNfA-¿öéæv»ÈEô:zþ±·~dÇxáŠn K&õe€$rRÚ@322È–-[°téRfº¦< j;wîĬY³…mÛ¶Õ·WZ|à—Òu’w0êU2;I4¿Ú7W±ït7lØ€ÂÂB¶ñkLÉ'.ßPC1¿™Ë–!mÒd¬™s¿â¼Qê®ò”€EÞóD@ñMc—U+M&á÷Iz<##ƒ³T]¾_üÜNëjŸ"ƒÒãJ÷Óú¸Ú®(@Ðûùó]14~]v%fgg“}ûö…ÌÎ Er žÿ–”´{·Û-Qbx 4·ÛÍ‚÷íÛ‡M›6I¾J|VÀ!•Vº.:˜¿ÉàAÿ~mÐ%݇ê‚~Ѱ ×D³Ò\Ð>¤¥¥!%%%¨mz¼¤¤„¥hÓ¶{Äh#t"äŒ@ÉÌ T१mÉÛ¤íò$ ˜o¿ôk‡À£¿Ýn7æýÎ ´cÍ!;;›P¥¼ô/õcÑM™¨@}x<àŸí@K©ºÔúåcméØl"¢¥AJ¼$ûYVéCèiîiBB‚$Ï•Ïÿ/úMçÅB6uåk‚6Û~wÞ‰çDZsrí‰^J@ãq äçøß·ú~º[ëÝ=;Ôý¼ ÐÕýr@–ž¾ûììlB!Žù|mù½JíóVÇPÚ›Òý¼F>ûádïßg³>@J~\€”_|Š’yÖ¬YÈÍÍìv;‰ŽŽfÿóÏVêCO´Ð·’×çÿ 3—-ÃþÍ›Ù{º÷ÉÛ—Ïa¨5Ï?eô´.ü?m¿«±X,B5}^HàŸÁëÉ÷Ñ]ª³¼ýPý¿•öù€cÞ2 ˆùó÷PVt°ñB.OÝ r̃P÷)_I¸–[AøgýŸ1‘[!¥ÍvûöídϦÿ—½·ª:ׇï=!™Lf„dç‹H$LA@µ6”¢€Úú¶Ø“öøOÕöמ­Z)TÑÚÓZy…7m=-ÇÓÛ€ZѪ` ‚”$ˆ@B$ ä{d&“IHff½ì<+kOf’ù çä¾®\3™ÙkïgïÙ{ÝÏ×zžŸsâ,--åÙ²ÁºÓEPÜÔ·W<ÊÖ^à.wZ×(qàPzg‹7¤8.PÏq‘ˆŒF#ÎiæÀ=éÐ]¼T²vU¶R±¯ê¸KUÈb±°Œt'šŒ˜pç$õâ¿<.Ý–²™i&+åQ¥¼ÅøÛ§% íD4_"#ë'Øsi ¿xm|2ß›4•h"ôçÆTèD,Ð{žžÎþþ—xó@ ¿På»Í4ª¾ówδ\P\öÝÞ€Úhç2ŽqŒcW#¤G*ñfM²vXº±Æ<ð!õC‡aŸ­O ‡âÄ`Tò×ÇiØ@·W’e™yRìèiQÖxž›š‚ihe¢©×± 1Ô Ä –¥V°“G¨æ¨«:Ùì)0éOÃ1Ynå„'öv´žøœfܦC‡{¿ðOèÂ×Y¦çxÛ<¨‚ ƒÍXØ›õN‰ÈÿÂu:L°(ä_óñï±ÒÃ>5üÓ/܇#“ÔÄ—òžCÌ< €`6[™ÝnGss3Oh#‰˜–÷ †-\"|ßåE¢e ¶N}ïõ€î“¤apz™p ¯  ²c0ÙÜ:Ì GäHñ Ù.Ä@噟˜=‘-]ØüØ%¾mË w¢iÑ"T|´oÇêTŽ%ž;‘? ž5ðÙÞ6ÿIGB•9qÉäç‰:-ëp{$è’Ø4çúÎŒúŒ]MùÆ1ŽqŒ4%%%ŒjNj˲Ve™&% ^7=`+Ñ@û²X,Œþ|A›®éŸÿp?^1Gc©w¯˜£Q^^Ž}¶vüº¹KæDñí}¡Ó0ñ½'ÅŽËv%þ>àòbZc+\^¬ÊÉf”¡/f}Q‰®ú>w‚ž¯AI.sæL$Y–™I§¥àÙdz8¹‰¥–}ÉŸÖlF¸/Lú>†ûÂttžV†¸Ý|=ëa÷g6›‘þ/ê5©3m-øþã«q] ½ãiœîýŽxª€ëâºv ÞÔ¢jhäKÄâ{jÈ#þɲ̯ɤ´›õW\DìXà´ã‰ì~4õ7 «h•ù£aBÖ/²!Êà›qoÒŸ†¾÷z~<’“~'žMk2±L½Ž×O• ªÕ°ùä%ió°>ö™ê÷(//Çÿ÷ ©UyKüYì´T*F2¢fO=N}t™?úÿ>Qå8\1p¹\<ðJ#nFVHÏn0-z[i0nŸ»™­4©—³Ê²ÌÆÉãøâC( 5L&»ùæ›ùoÖ;%Ë\={Ü“Î|!’ýí.'(ÁNlÿé/þ;O§Åo/vá×Í­| ù>[;±]Ä~Ø.òD­É½.Ü·»Ÿ¸=~×Ùt{%}œ†é ÄgO@jz/ß8Ðí•\íni Û+‘!f_ˆ1 æB'uÚa1ÉÜ züé ¥;‘µÉdbT( "u"‰‡zp¸ê /¨$* "¦EÏ`Ñ]±JÙÜÉŸ)z:úÇËžœÝ5yð¶yðÊ'CIìv;ŽìÀö^$õÂýöÏM~ù´ÒååäÜc×Â{ð^Žx\ü³ /¡¡¡AEøb×*ßVƒAUlC²´¿¾¹¾à fiþôÄT¼ÐâQ  ×É`0àì³Ï"uêTĦꓨƒ;FIº¡Êf¤bÖÔß³´Bõû‰Ê†èÁÔ¿³¸Æ–ß÷%Õz÷ùwÌdÿù°š”4<Þ„û6Ïe3×OTy5Äe7Ëå$¾/ZúXÿ럨”:^zì"®\ ³5kÖ0X{ç,öØw¾ úTÄ,`pUýË™ô-hv¢àËßÂJS6?gOŠãä?Žq|ñ¡J†yî¹ç¤·ïNe{žžÎVcØÀI/ÿí,ö<=½}wꨓHUU•t»Ë‰½wk°dNnhká‰t@$&oÑïa …ÑQ8qöì0/€>NÃôq“¨Clª—í´4õ#gQ,ÏÒ1·ÔÖq%@¬Øw!ÆÀ+h‰}¢÷kô¼§ºÉdbT? % è„â1Êzéìv;ܺoÀåra@W€¾ ÷Pz@‹JÀ´è윘;÷NÌGZãqèRÍ0Mþ/˜â·aNîIÀó?ïG”î„–1~uˆü½þ4)CKìVü@éõHf ,‰ôާ¹ÀjâžëK`Ô’lpùHee%¦÷÷©ê‹Óu£Ì^ß“ÉÄ &Þ Xý?wÍžz¤¬}Óçf"6U¬ç…ZñƒÃz<8ß…7g*ÖûÅC ƒÑ¨x^,sõX.'©Šˆ ¸¼8ûò&Äx¹«?11Q‘YŸª’{¬°öÎYìwÛk ±Z¬½scR.ªÿ‚Rds+ *›¦½¬(‘Óþs#<ëáí< =~;qŽcãøâAóÜsÏI‹…)-5¿¿„þ£—q*‰á“fh’µè?z‡=Áõ„ÞR['=÷{¾üçcÒ–Ú:i´Œo²þ +À"‚ȸÏË+¶Ñ8Y%ÓçÄà²Ý·Ó‹Ë§õhiêW¿ uù¾É| D”GT|ãܺèÝÕHËÛÌÝâŽ,8Ø ÜüÝep°p4ýî ÿ/Î~úº¤wWSàuâdÏq|ÜÏpïÄ|<åp;½ˆ›…ÏŽŸÅîß÷b_•Òï¾þLŸJn"ÿ9™™ðÚÍ`ëç_>]_wÀ.]€ÔòÐ}ùÇøÌðx/(ß³šƒ0 ¨©©Á©S§ ›3T­ñ³¨hî ŽxÓûûp¦ßÍ+‹‰×Z´lÉò«þ oTâK¼¿ïeNÄ$ê UîDKc#zZP³§ŽÖ9˜Ü·²fnK[¦þ&¼u®! ùÓR›‡¢$üè_e<’ªÅþUÆüè(\ˆ1 ‡1<%©~ë}øöèFKc#æß1“Q¾È£ýF<åÄ'Õý0;RA^ò\Prä/Þk†e®bo€É·Ó‹îF¥¨¸”,=*]U³}¬0ûSàͬ³˜ý)ðÞžV¼÷‰RÇ">>«U °u2È \îsÍ@ ¼ú<üÔ˜ƒ…¹¦[þãÇÿ hð*MV«•-Z´_þs‹ôë‚ɨóºñàuf|ùÏ-ÒOvÕJë‰ûàƒ‹…Q#«ÕʬV«*€°¥¶NIƒ2ˆˆvõ(©­ÛÆP{y@E6ú8 3$éXL¢-MC5Ý{™—íÄgO€|}/o D „þ¬°hWÊú”ä(z/«cÿަŸ+ßëOºtè’%ô}¸ ºd ¶6{ dYæÉ¾yçÜJ\ø—Ž¡·C)A5ÍgÌÕ"^ìoQåd hïåã£ò´ÐÈÀ#ÅŠ7âûàèe/väÇáèe/æüý?wÝ·ð™AÉ ÏK^^xà|zDé–—““ƒÁ€Ï¢¢ÁcÕ.— gú™ú ±œèˆHc$#ô ¦ßœÌå±u24õ(ey)æOîs±Ú—Ãá&Ç&ç£ñÙÞ6¤¬U½S€4õ7ÁÎ>Àþ–=Í­<„à[çZüÍ^ìgHûY^9ÝyŸÁ‹ý K½è3Äâ7]N•°x®ÖÇ>“Î镎¾þ©äjwK-JH#jþÐû‹'ú0sýD&Ëò°¦V†)º^ÜN/z™S•ðgg =vä&áà{×͇í‰-ØR[' Hç;ðÞžVØ/ĺPXXX Hü)ƒ»]²u2h¦þÙŽÒ8çvâp­²Ž[–evÓO猩ÜãÇ8® 4€R—ø‡?ü!öìÙ#ÑR»_kGN»ÄûJ‘`”ŠùïÙ³G¢‚:v»]• @]ƃwõ§Pgµ‡ÓRÐgˆEc|;ÓŒ(Ÿ=:£†7ü!è ôv¸qþH¯ÔÒÔ?ݽگÌâdL!Qú,Q§ebYMл«^‹è¿;t ýi®´ˆcÎõ‘¦éŒ€Æˆ·»Cò4`‘'Š7âXÚ®…ó„ήüˆ8öúSXð%4ðNÛ¨<†ÚÞ³øç'ʰíª> sþþ˜Ù!ñP€Á`uŽŠÑH(,,Ä©S§¸œ’Ñæt"ÚÕƒ„rÚâù?’ª„RVôèqê£3¼ö¿ÉÐËÿDøÆ¿}ן}öYäÜ0C©ÓmèFø´­¸2€”D P.Äx%3RþhRò¢æO6¦§e-è?z™¦m5ã¥YñŸ« ÔPÏ!yð¦*t/QB`~ŠºÐÊX á?ÿKzóùŸcí³†åEØl6©²²«õ?¸ûuþ,z;Ï£¦ß‹ÿÏnÆoºœHD'´ ;ñ.;ƒ =¨{©ÓVÏdbÏŽqŒc_<œ….İ_£WU„r8ÒÊc£6AÄ(_€8ñg’R„G¬$íêA¬$áBŒÞÖf,™Å•ÞnÕéEjz&˜µøìD/wÿ&Ç*“îù#½AµRÏŸEe@´ÀE+^ì¾d’>€»aï¶ ¸ÛL’Ⲧ„@ßÀ¹¾3úÏHKuJ‹Òn¯‹ñû@uzƒÝãE·W9M²î“X¨ÓcÓšÄaçQþÚièñNÛüóeøÍæu8²0pd?~³yÖ<]Žâöh¼p¶ì:ƒ³º|¼sú5U&> XüŸ9«’åï>q ’qh¹¡xM©wwÚÏÚðA¬¢(QÇ,"eWìÅaåCé=Ý{N;·¬u½¸c\hê9„‚‰7¨J¥Òu¯eî„!¥‘Þ‹ŸÑï'ÊD­|ÂŽ˜>ìqôa¾N1ŠGÃ`0àžwºù66›MÉŸ¼}†Xlyi;‘˜˜ˆÕÿöO %ä§hx2àXàñÜYìÍSõÒ®×ê¤Çsg±Çsgqe€<6›MòõØl6 =(­™í)JHƃ>C,~›<‹—Ý v‘aQj´æ‰Ó°óGz¥Y&Œ1Ç8¾àæxböDöÛMSy?eønÑ$Ð*‡Ã!íÝ»/¾ø¢jMUU•d·Ûùg¾î~±»ž¿Pl+¯Ç~Ñ®ôb±Ô;ÀkëC}•©®þ…ïO0kávz‡‘? ä8X'FB0Ùû5zdêuŒäãùzw52gÞ¡êÈäÈB÷IÇ@'LZè6(..fÅÅÅ̤‘¢Ór% yÀù:=Ž®ýwŸT»ÿß«x ð—m'¡7hÐíÅ/Ÿ®Æí¯ÌÂwowáöWfáÅê9`N'*œgð;­ÒÉt5:ò%SBaa!·úŤÀÑ@}âäEf^?À7~O+ –zPà´c©wº^VF;ðÖ¹˜¥Üï;VôMîuq‚Ißè7?x\’ Z±©zÜô͉ʱ Y»¢§Â2W}¶vÕý“˜˜ˆÇÜǹ³pœ;‹ÇÜ0¬À±V¯ß†Máà¯éj¥pa÷El©­“v½Vǽ,±=ŠGf×ku’ß<€ÄŸ2ô‘ Kb‰Pž•U§3ñщãvQ MŽUú±×¼~fLdÇ8Æqí0LX<×€þ£—Uý”w©â¤UUURnn®$Ö  Ïý;yöìÙpUÀ¯›[qÝÔ Ê„þêíÓøÿ§¥ð‰¼Ï‹}¶vÊD<Á¬EWýe¤¦G!6uȲÓ5˜5À]ѱ©zLYÃRWïO#Ê IDATý¶M¤ý‰ðU h™ õwövž Xòg?}]굪S> Ääo»þ, K XÍ´lP´þ©AQQ’îþ:RuZÌŒÒ#M¯ƒY«Áæ“—¤ù:=w +I›ªGOËψî>MdøïÂpêÆ;ߨÃÞ]Oò¾1”Éý¬.·gÝÉ÷ã/!­²²ReõÍ=3¢KŸÐËœpyU5³),¢ë5àÔGgàŠ½¨ò„ˆMX ªfì×è± =šþJíIä{ÞÅ[žÙü:úVäó]2J Å€öEMuÖ­[ÇÏÙ÷šÆgO@êÔ©H:ýG/#uêTÌ+ˆ‚Ñ8t^tìªãjc¹œ„ŽŽ˜¦eâŸãø]^LÓ2•®8²°2{1šz¨œ„‚¯6uH »/òÿcæJÍf“v½V'-¹a¨­µÄj‡·–íù€÷×$LAó“ñÎ7›Á.ž‡4IÂÎ7?oƒÁm«YUtkãÇÀ_kÇKÛU.óWNwãWÿÞ1Ì.ö<öŠù“Ûßß6D Ëå$üº¹§¥wõS'=RDš”®zƒ5{»‘š®$Îå,ŠEo‡Qf-ònŽC¢Å€(³’¨Öo÷@;Û‰) b†)#u|#â—Š g™3ïP%²ÑJ¾?¶‚+¾®ÿ®.e9#õ{ËÙ+íwõIû]}ÒѾ~ PHÊ_=ú Mîúîlè ¤õi°Ì8N§;Κ°ã¬ ûOmàä/ÈÉDnL&nϺÞPd¬ØG–­d4ª‰dOâ€Ús 6Ìà×`°b"]“”œ†!IǨ7eÔû6óx¡ÅƒéÑxõö8,HÆ~²¹U•èûûù¶¦–¼ ÔåùçŸØ eÊ‚F„ÿL”ºZŸqŽvÄîe‡CÚgkçJ@ÛW×âW sÐÑÑ¥Þ%!RoÕÄÊh‡ªfC¤øjS—ëÍSõ’ø?U(`×kuÝs²,3$þ”Éq'ù¹ú¾i?kÃ?Uxð {t3uxù†á¿ûø’ÀqŒã‹ Þ €º9Õ^À‰s}pÅhøç¸Ð o›.Kµn´àž={$@ñ˜Íæa!ÚYb§¥ðµýDøT&˜Úí.—“¸€–ò™fD1Qƒó-œwx“¨Cwc?::ÜÐ4~MY›ÚúvõÀ4-ƒ%™‰ðmvÓk?Ä¿s dºtß5Yé íV”šâ¯ÏGyy+‹1/R)»wïænÙŠŠ Uãí)Åë~êÔ)ä!_^œ…þ%4R`‹Ã~´ã»ÓK°í³çø¸¥PâÕó¦ß‡šl yó°ýФJõê©pÃá7W­Þ€kè½o²íÛáp žÐëròÏÅ~N;wó/ž«ÅÁã.¼ÐâQ,øÁk!6JLLIJeËP^^ŽE‹Á·5¨˜hHíQ:¤(t~š ÉS͘W $^FÍŸ Ê˜W…Šf²œ_ڹ얹zI¼„µÃá,·¦1 ‰ò–æ· z ¿”‰Ÿìª½bêÛ ¯«« Ÿ; ká“° Ÿ¨vRB+£¼‡W¯” ãÇ8®T“_aœÓo?gêå `X«G_%€ÜÙb@"û@­`Wåd³}¶vÕÄþpZ Äöº¤Ä6§â„O–èäØD\èéPUüÑ9ÚîÏËð×S›>/p*÷Οž˜Šœ_ÚUЉoÇ@ûüóÏãÉ'Ÿô[b×÷ZŠ¿³èQxõö8,)0â¡þ(|íøEžðGŸG/ŠÆÔ{Úùµ§ýmZ›ËªŽpÅ~pkš*< ( JÈÀ2W?¦äïÛª[<×[­)xoO+€[n¹«Åº¶&“5_½=_þs˸µ?Žqüƒª"[aœBž•ÝÆa†ÓÏ9@X.'q ß÷;_"pǸ 3j°ûŸ×`Íovãó³T„ïOn_k›¶õ7™ŠßjŸër¹““Ãíñû;¶¯â>D™¥’œÓ鶋Ŷ®ËÂ7~õw¼ò½›ðÀo«°ã;<ðÛ*ÞpÆåra÷cEü;Ú6Ø%‘"‚íÑ=’b6R/nßk;A‰Ÿùû­ÄÏ)3¾×¾ùÇɪ¬ý`îy*i½ÏÖ®Jø›­Q©tt_‘ìyºVâõñ§…úüúû Æ1ŽqŒãšcX"S›¸\ ˆK%KJJB–ƒ*+F*GII +++ y?áŒñ±`°(..fYYYüºX^ ˆ]ÃoGÉPÎõÇdYf«²_Èë7÷}iié°¥Øãøß‡±/Gv•9óÖÐÐÒ²ˆ"íÄf±XÂ&Ÿ‚¥Loii)-‰ÒPSSΡ9JJJXVVO: ¹¹¹a×T  Œ„’’VTT„eË––-[†'Ÿ|21†,ËlδèaCéñý册#8·Ó2÷Ú]¿H”·o¼1â{èþûï—î¿ÿþÆŒÅ}ÉøqŒ=¾ @æÌ;Xô\ *++C7-X‹‹‹ÙÎ;QZZö>ÊÊÊ•\Û¶m€aŘ‚Å·¾õ-¼úê«!+ÅÅŬ¶6@)Ù a2™Xӎɽþ;úƒÕje8|ø0¶nÝ @I–¼ð½ÆD•ÝFˆƒAII É;XÉ‚VUˆ9W ‹…utt°ÒÒRVRRrM-F°Â‘ÿöƒWgúó%{1‘:T³?ü0b™JKKÙ¡C‡FßP@$ÕÂQúÇqåòp­ÝŽDþ'ÿVÔš©×©šÏˆõÑCEII [´hžþy477>ÀV«•-\¸‡FIIIX®üš—^äã32†/ ¥¥¥lÑ¢E¨©© ™@ŠŠŠÂòdYfEI¨½<€ÞÉ A«©©ACC:;;±xñblݺË–- ›ÏÎ : ´gω~+"o›gôPîú€êêj•Šü¾¡«`Ç®4ưUÙFV\\ÌJKKYmmmÐ÷Üý÷ß7â‡?ü!vî܉P-Ʊªl#ƒ”0&äªl##ò¿Z¹ b÷P"ÿpŽ]\\Ìðä“O†-»Åbá÷å&±yW8Ç÷X}ÁaµZYII ‹4v© ³×maˆ[ÍÒÍ«G•a¥1†­4Æ0êéB× Üý˜L¦ˆâ÷+1ü<‘Ájµ†}Äß?Üóÿq‚™­4¯¿0è|©»dqq1ëèè`áäP¼}w*{böÄîaY–YIIIX÷É]VVÆè÷õ¢g.Ôc›L&¶*ÛÈ, +))a¥¥¥,ؼ#Þk²,‡íˆ$n½iM"[•¸€W°X•md›Ö$†´ŸUÙÆˆr=ÄýDòì zß"š{i¥¥¥!Ëéœéø±ø Æ&È‚¦É T% N£3òµX,,ݼš‰tFÂSëÖ²U9Ù\÷øÅÅÅ=À‘* c1DBþcqþᎷX,,++‹™L&–••ÅŠ‹‹C"ÿuwLb«²ìí»SÙªl#»pofHrPA«ŽŽŽ8Y–YVVo‡ÝÑѲò&Ë2¿ö¡N¢²,3RKJJXmmmHNÏ[Ø÷mÌf2™Xqq1“e9ì¼™=OOxþØ´6—…ó ‘ÒiÂàû[¿Æ6­Í ›ÀÉrE‰Q\\Ì, ¿—BɳÉx’•¼¸á{##¨€¯ÛÒ·üHÈÔëXlbà¥_ÁÀjµ²{î¹{÷îEss3t²„è¹– Æ¹¦Ï@A~>ªfUs˜PP\\ÌÊÊÊÂŽ»fêua»ýeòªì6†}üHån5!’ñâ}âr¹BR†ÒÍ«™­w5ï¢çt:QQQÝ»wíþË®·ðŸßIÅKÛ±¯]ý¼¨ Ï£¸¸˜QâfVVOâ 6›MZ³f î¹çÀâÅ‹±~ýú Ç˲ÌÖ¯_þ¬,äääoõ€Á`ÀÞ½{ ¤ÐÕÞ½{á[î;(įW&|s+‡Dõ/B9 ÿêß;B—AÀ¦µ¹lIa>öµkBº‡)\PuÜ…)Kï+±im.cýßa*aû¥!V8«_ººº°hÑ"<ùä“xùå—CzKKKYYYN:ÅŸãpnUè 5 ¼¼§OŸÆ…˜+Ÿï2Ž‘·zØ„Ì2¤8&b÷Å.É}9óæÛtÇÊ﹋õø=µnmDn³H]‘j¯ïoýZDã)vîø¿NÍ ;ä@ «%ÔðEºy5[}×–aÖí#˜ýX­Væxv&s<;“=1{"{böÄ ?¨811tB.ý`Æ“Û}pÕ3™LÜ Ìx[[[Öo=#š»ÎE/^°ãCMüC¾v_„¾ý¿ˆèÞÛ´6—½¿õkaY äþ§±áx0Ve=Ã᜹ëý å™iØS %…:NôZŒ{®!ÂyxJJJ"þá¬V«ŠüeYf³×mÕý_~Ï]Œ ¼ÀÄä­PMîÓH²^# ù˲̲gDG&¿){ÌÉ?ØqDþ‘ŸØ—ÀƒKäîäWRRÂóˆü)— ˜ý½°¯‚'í…{ÿF¢¼Ê²r¼|¤ß8œ9dÓÚ\¶imnØç)ùGvå'ï%’ù3ÒߟP[[QÞ‘x(rP¸Íb±D”ó4Ž1@0–¾?„;qC1W"pñ!Íú·Z­Œ ¼0l\( òŽxò`â‹ãÕäA“X(ûJËÛÌÒò6G”ìXZZÊÉ?ÔýPŒ5\ò“EòVŽÒÒRöÂ¾Š¼¾0™L)€c÷æÌu‘w8‡$ò÷Ú´&1ä9`ÓÚÜaÛŠr»Ÿp¼5¾ãCUÞü”ØH €PŸ="ÿqÒ¿†0™LÌb±„eA‡»Ä J8£É;++KEþ#Yÿdaõø0ì_–划NHygìX¿ÖäOYï¡Z0ä^×íYZZÊ:::XGGw݇CþDÞádüÓ¤IU Ãq»ÓyDòšL¦°ï#Y–Ùs[ÒÇdµO¸«†"Éü”üiéd¨cßßú5öþÖ¯1`0y0òUfqüX(ïV«uÌV+ Xwù_CȲ̠K kÙ!\ˉXÑú÷3šõOäîMiÆi¸‡r;^‹ã…ücEþá›ÈŸ<Ôýˆä*yùSØ@T\C9þ7ž~:b«‹È?{FtDÖ¤“p$sȦ5‰¹î¯6ùCž;RXÿwB¡Dbù¯4ÆŒ‰å(Êt¤ùCdɳ­,+9ã–ÿ5‚,Ë q«#"~B¸Ö¿èúòwódý—””ð„¿pd‹‡/œ‰ƒ–´•””¨ŽB=~¦^Ѥéx@ù D·°ãÆ‚üÉå_[[6ù‡;PÇüÃù Éò‰”üéÊž–€,ȱˆ}Gb͆Càâ:ÿpeôÜÅPϵ ÿ±ðÚМé²ãPžçp®Ù8Æ&“‰“ÿXüáîƒbÿ¡&~¬ÊÉfO­[Ö D“T$ù”-ÎxRtÂM8£E¸žƒHÇ"%ÿpÖ'‹Ç¦¿p,oòZŒù‡s–••E”ð'‚ŽÉý<–ñÕšÐÃ)òã‘äþ„ƒ±˜Èø‹ù› mEº¯H”ùq\eDw Û?Ü‚áÞlc¡yGš0HïÃ! L½Žeψû÷‹t|ååå#wÓ‹[Í&'ß Ó–YxsÞÐ2Ƽ¼<ü&‰!ígm˜œ|3l=×*Kvv6ÿöÝùÌßç#A–e–––³ÙŒP”€ìÑüü(¯ S¯c–¹X­VFîÎHÇ6ñ ÇȲtx‚–AmZ›Ë(?b¥1†‰Ÿ¶jžCyTŽ4˜ãh)ý~Õ/z?öŒråõwý®ÅyüoÂì|u?€­wÝŽ×ߢúnÂ’ øäß²pòõÙ˜¼iN×(¿C×Y'v°6…pÒ§WÚ†Èo¶dC×­¶ê•€îžxÄ\è„nª€ZQØ×®áŸÑ>‰Ø£ò´ á¤I¯´ É–l¯C× ×Ô!ù4+y$ `RzÓmü5üž;—Ÿ<]f Ö‰ f…œ=)ö€òóÎsÙfh’‘ì°£)W‹äîYp§Ö€¢ø‘>q{8ù±à Ü~¡FD(V}¥£›“<]g_+ZTD’%Â$ò§ãÏ×vâíØxð:3—•”òæ¸dsÃhkåDë”S`lgÜÑ)ÁhkEVj.x¼Èi—†Èüò2:%d;º¸|õ¦xÈmà€œvåûyôp ^‹£ž®ÄX'øŒN‰[üG= üÚÑyS¨€…Ëå‚Ëå¾v öµkPVVÔäM(,,äÔ "õ-Ë2«¬¬„Á`ÀúõëQ]] ƒÁƒÁ€ŒŒ ìÞ½ëׯGbb"*++yæ8ßAÜj–™"ál+ƒIú¥½&þUCCþŸ³½p°8ÛÊ™"a´¤³úúz<óÌ3Ìd2±%—a2™Xmm-«¯¯Õƒ Ë2ËËËCWW222pÿý÷#˜±,Ë,§]BCC*»8•¤hñ¹ô¨°ÏÅ-·Ü‚:¯UÇý+SV«•å´+®´ûžù}Àñ ñ_ACCC@¬V+3›Í0\ \¼x1FUfèTCÕ±F,üR&j/`á—2Qu¬*©¶ó‡’’VPP€eñm8ÿá~œÿp?–Å·á¶I–<ËÊÊøRRú#¯R0ûe™m,;w/NÅ]wNçŸW;†‚‚¿×¡¸¸˜544 !!6lð{ý222°páÂ>ž¿wMÕ!¦i¸ü1M²Ê+@ÿ“ü¤t™%h[ÍÃä×¶ša5E«C‚ü¤4óÎC×’=L~]K¶Ê+@ÿ“ü¤P‘¿Hbä à„?øÙQ÷€b¥³6É‹ž•SIŒ¿áÇÅvP”¾¸Ø.œJb*Ë_<þQ÷’v¼ôñR@Þñø<^ná;“”ù7+5j˜€Þ7L‘1Y«Áé–~8“ò' ß– œpcÞý0½¯6š¹²`K.ÙïYû‹ç0_§çÑâ0LY¦¸¦^ó"üàÖ4,õ–zð‡G¿…WŽ~6jÒËå‚Á`à$sË-· ¡¡ëÖ­ Ø ŠÈ}ýúõرc*++QTT„Gyp:رcÖ¬YƒÄÄDaÏž=àä€?€‰‰‰øö·¿ÄÄDþÝô´îQ;b½üòËÒ3Ï<ƒG}Í«^ã>ŠE‹ºšùC“}^^jjj(ÊÇ7Þˆûï¿iii£*šd-fÚZ`4ÑÝ6ó,ô]¿6lÀ®]»Ó.Á2×àw?555HºûëˆþÇAlܸK—ßëw|EE–-[æWþ¼¼<@||<222iiiˆWm7Ò9l?pUÇ`ÉŸŠ%…ù˜3-K óñÈ·¿‚ªãøÅ{»ÑmZ›Ë:;;ÑÙÙ @™h2|÷âTtvvú-·*¢¸¸˜mß¾Û¶mCCC°aÔ——£¤¤„=÷ÜsAņ›››Q]]Þ=xå{7áÃ?| èììÄÔ©S‡m_^^ŽŒŒ TWWãß¿õMn9Æ91pâ8ª««•ë³}{ÈÝÜ>/ˆDq 7É5X<ôÐCìòßwnž®Å™úgñÐC1¸íy#.>ù'œ|}6¼wÞý¡±_ZƒÿóY‘3)daœS‰£’ ¤d•å `ÈšŒ‘“uÜÝåI^šâpâ\`–6]!ÖA˙…qN#7OœÃ r¶dSâ胄5'Me9à ;“Ò`Ì;“LFÌõ.•ü ZÔò‹9DìÝ=ñÐÎVË¿ÏÛXäLSÉ/æ ±›'ÎAÞêËh3Ï‚1ï¼Jþšd•übÎ0äâ?êI@þÅå™'¼”¬îàïqÞÆß“§€”€Ên#V¸åMü=(BžzŸÓ.©\üd!·™Ì?_Û9ô^§ç¤?Y«AF§„‰²—lî!òôdœ·!+5J¥@J†m0ÒaÒHÈi—©×á쀛>y œvÌ› W)Ý=ñœàçé´˜§OÃÁA‘Ÿ‘ùÚN.;y? €¡ñ(//ç Ó}Ïüíç£`hü‡ï‘222‘‘÷ß6l@CC ÿäEä¾sçNþYyy9víÚ§Óɇ;v`Ù²e(//vl“ôl–" “ú§:::P__w3Ãr9 PYY [ÈÅÒ¥Ï<ó žúžyæ †€ ‘¿ÑhäúüóÏãÆoD~~þ¨J€e®ÕF3–-[£ÑÈϳ¼¼7nÄ~¯|âð+GQQŠŠŠx,¬¢¢‚߸q#ðàÁ€€ÊÊJNš00›•ý>}:Øüš²6TÀ /Wã‘o*á…—«ÖPñ’e™ýâ½f”••!Ã~=3¾‚eË–á›ó¢°¤0·MjDyy9~²«6 yʲÌHöòòrlݺkÖ¬Ayy9B²¾].Ìf3ö_ê /W#*O WúTdØ!++Ë²2š¡IIÃ}ÏüÛ¶mÃ}Ïü`mˆþÇA´ÿùO\9ü"ÈÛßs Š‹‹Ù† ®¨â“9=³nZ¨ûû<üíü»öÖ£Òª&ã¦'`É­ïâ¶çXrë»øøã¥Ù u^7wûóø>k²ô½LeùCÞ¸Ø.% `ŠSÇ÷Yz''ð°€»ÑÍ-ÿÞÉ Üâ&¢$·?ï³6né74U–?0ä ù{ÓmpÖLÁlÉmMâ0ù¤ÿ/zH~OŠž“jù =“¸ü]f‰ËOm«™ËïN­G͸ÕïO~cÞyþ=ßBì€ÝãÅL[ WÄ@ÆỹÄɉx4ï9¼^È]€ÿä-pÚaÒh¸rPmTâú<ö?ÊÇO®€” Ë;Žz`lg0¶34$(§[ú1QÖ ‘ÿ »Ÿ¾ãI‚ ŠR ·r›â©8•ÄðÉådêuœüÉÝOßQ’à©$%'€þ·]m-8êI“’øõÝÿdõ‹y*`ÓÚ\¶¯]—Ké]u¬K½˜²ônüë׿˜²ôî€Ie6›M"¢´ÛíœHüYœ" vìØ—Ë…ÂÂBŠåÙÕÕ£q0û´°ƒÁ¯n0ðpZ Oÿo¹È‹Òàá´,—“rè æNÕàͶ\®$<žD7Ö« IDATþ)Vådû=‡Ã¡Ú÷=<<ÊðwÞ6›M"ò-憆¬_¿ÔÛdYfN;wïy}ýë_çÊSqq1 §]Ân‰–dYQQíÛ·ÃårÁétªÆ/[¶Œß¸q#6lØPÉÈÈP)èêê‚ÝnGssó¨«(l6›D–†e®ž»ý-sõÜ‚ð·ºw\€?ž¹'8y0222PVV†¢¢">| .DQQ(¿¤¡¡aÔ0€(KFF¦Ü¸ù âM-¨:>Àço¬·µSn\ŠÃ‡cûöí8|ø0î{æ÷Ð$kQm4_õU(éwÞÉÖo¹+"Ë›Œ‚pd_•mdç÷ÿÛ·o¿bkÓRæ³³ŸBÝßà7;X:u–j›öÖ£’ï “ÒTÙòþ^ ¾I€Ý=ñèî‰Ç‰³g9y¹“¥Û…ÞÉÊäK¤ÔÝ£Ìm&3âããUÙòþ^»º÷µo yÈ nîÖãýGÒÀÉÞWþÞt—¿§e€»õéÕ{‡â<œì}å÷¤Ø¹ü<ÐÏ8oã€ü‹8;àÆüè(®pë@ÃGûú‘±G= È8oã=¬pu£ÅíÁì(=ÿ¬ÎëV… Nö`…«•ÝF8íÜÕÏcûîÌ×é¹B@ÇÿrÏ…Dݘ¯íDÕ ³€býÏ×éalgpÊ)œè)ÛŸg’ÿŸ(ëxlP¬ÿ/]ÔCnêMñœè)Û¿lB,ä6À–¬¬ÈÔëÓ®äÁÏÓiUî~ßlÜ{²x®+ü^•mdS–Þ²²2å¤z]¸34!±/OòÂ’?5 %Fÿ………hhh€ÓéD^^(Æ?’ ,[Rn¹åÔ××+qñã}W8\1À„\åÍP.¼˜´Õx8-¿nn (Ë㹳ؖ¦™Ê¾co‡Ë傃­P¾Oÿ[jëF$"z/ÊE„â,³¸Ø.ä´KدÑÃ`0€È¬¡¡Ae5Òv"™ø’ohhà’…”:y> a6+6‘ÿh¿ŸïùÆ9–ü© i²6ìk׌ºú=pkÌ‹a?„óèá—¢¢"ŠþÀp—; xQQŠ‹‹a0°mÛ6¬[·nDÒÒÒŸŸ{s\8Py Ÿ°Y8q–¹ú€òˆ×/## X¸p!>Œ;v}ýÆ ‹…>ÿ lÊ7†eoZ“È~ñ~_X²oZ“ÈªŽ»¸ëùJœ{RÊ|ÖÞzϬ.DëÔEÈœž8ûÙ)üy×~Ñ‚¸ PbÍIÓîmó ïúÅ04þ#¨™È¨  »wïæV¤Hd£)‰‰‰èèèP½:N¿cE€”š€³³³±zõj<ÿüó\‰ákíÞ¾;Ÿ}ùíLȱÿ€Íf“dYfß™%s¢ðOAOd¾ÏHçM×»²Û8ÌÅO“¯¸Ý›õN)Ðx£ÑˆŽŽ>ž®£ø»ŠãÅýбi ßår¼^Î)æB'W"I¡ †H躑÷ÇétŽzÏÑ{Q‰Ü°a%îîëzm‹/FVVÏGhhh@¼©ý5XæêñfƒUUUïÅH¯ßXÀd2±œœäçç‡lÁy£´ùÂjµ²eæãWqI)óYAÒ@uû þy{ëQzëïØŒ>_•“Íê5¨Ž%®‹Wy¨>€Ÿe€mqu04º¹0’ü¾É€½é6ôÛ=ˆ·3ž è`°šýËï› èI±#ʬEL“Ì“G“_¬àN­Wƒäïwà òEñuž$8ok3'wÉMïÅsªIZ¾HJ)`Dò_î9£Xý>Ç€ù:ý°¤A8ÝÒϳüÉ‹ ®˜(ëpºEɧàõkÀ'—x–ÿºË=øÛ¤Õê€L½Ÿ\V<´‚ß-š„—ŽT«D%`¾¶‹çðÒQe•ƒøäT ³`ÈRݰd*º’QYY‰åI^LYzwP“M‚999<~LîãÑ&A_kÞ7îîo¬,Ëìß—%bIÁe<÷ [šf"+©§Ûó†ÎkÐõ(Výw&Å£ä>Ó> HÈ€š$®t!!ºö¤À4ž;€öóQHšÒgž}Û·oÇž={$ºF¾×Âd21"Yò Æ <@ÛúÈúmnnVp¨ç¾*ÛÈ,ùSQu¬‘'¨<†í.umX2 Ð3ã+èììÕz—Ÿ®[·EEEؾ]‰×ÔÔ //O•8:, »ùæ›qÛ¤F¼{q*NŸ>øøxž;±,¾ ]É~÷'*cûÚ5XžäåZþÕvÿ‹ÏS°Ê-3­:îÂ#ßþ ¾ñ«¿-·Õje8¿ÿÏpM½555Wüœ“Ræ +ø³ú_ûå÷Øßÿ¶~5M½(ÿ¸[=þˆÝ7 @Åu„¥{\a\ÿD<¾d_hŠÃ‰³g1gZôðB@~ˆ}X€,eaÉ WYE _,øŽübÁŸBSöØÏÂj ^~‘ìÉOëðÉM-®àV«O]q;±öÕŠzîüÕ ¥¡Ð‡y:-$Öî—ÜzTÇp¾ /5ðí(ÖOò^ðx¹Œbq ±Ð|m'_ÐÕâF½)ë.÷àì€aé£XH,´îr_0K›ŽŒó6¬¼Õ„ƒÇ]*ižN‹®¶•å/* €v,ZREEEȰÂ/ÞkÆò$å¤üYþà»ÄÎ`0eÍÑ8RBhEøÞŸ€Þ»\.,—“x«çÇॣ½üÿ}¶vUÚç­* è™-Ù8ÔyÝ\ iRÇoݺ7n,[¶ Ü Œõ+æpPBc(.äMks‘¾¨¼ð»ÿõ>*))a”ð‹÷š±nÝ:Ü›ãÂ-ÿ+(%`Û¶m<’B#¹ü}÷±xñbÄÇÇ#!!¸7Ç…?ž2 «« «E³ï¸V³„„Ô¼ô"@“’†)7.ECCCÐJȵ)0•NÅ_]Y#X­Vöè­SðÂïþ;hca,@!øÌe¯ýò{,g†fhqùŒ§Îxðß›~ ø]—“oŸ••Å ³ê}+è‰?'åØ×ª-h_ˆŸ§¥¥€š<},~_ˆŸSnÀHò“åkæÞ‚`å'ËŸ þŒü ˆÿ‹Éw¾Ë}]×úþ¤—qùEˆÊ)"ù“' Ài‡&%m˜[ŸþCâAqûEg>Fò¢ûŸ^³R£¸§@ P%@‘äE÷?½Î› çž1L@• ¾îßk櫨’)™ Pb©UÇ€×7‰‡ÓF‚¿}“Õ2R!!’—¶™§Ór²¿çs*ò§íÄóü<’Ï222xÂܾv fitغu+wi3ž–¥edd ¢¢B•˜8ÒÒÒTä_PP€„„tuuÝwÈ(¬$ÞK#ÝG²,³Ø3ÿ |É`†ýþx*ð²Mý¦ååå(**Byy9Š‹‹é5(ÙiÙcWW_ù@ä|®ôáË V«•¡³³û5zh’•å6Tà‹€Ên#Þ}±3$¯©©Á7~õ÷«Jþ·ö%@!ýš¿þ€®)aso‹Â„Z·§ÎxP÷÷øÊO¾ƒßu9‘”2ŸŸ­‘øz§Ó©¼§Š€> €ô^ü¼Ð§Jú‹‹íR"oþ^ü<Ùa‡ýÒ DÍQ’ží—N U´” ô^ü¼7ÝPþ:ïP…@‰5s™) (dNò»b/ú•ŸÈžd¦0 ùhòs²”™VCIŒóµC‰ƒä~Ô“€‰²Ž»ái[ú~¶FR"¹Wv¡IÖ".¶K¥Ð÷ÕF³*Ûß7Æ_ub°úkãŸÑñé‰ÌIF® ÆþÅÄÀa9r 's U2@±11ЗüëMñª%}`mJ9`€'J^…?òÏ8o Ü €¬É‘’×FB ò¿,PY–™ÑhäIkâ6ÅÅÅŒêK1úmïôb?ÚñpZ –̉Âýøus+–" ß½=K .tý`µZ™¡ñ<öJxä‘G°k×®aqgãŤ7@IüËÎÎÆ /¼`äßÒjµò¥t”Hÿwuua÷îÝA%RÚ‚ñ@jï!ØDO eeeA¹ÀŸZ·–ÝhÑãêЫkú œ>}ó¤:|”¥XöCø„Íò{-Vc‘>)qK½\Ö‹v-nßÊÿ¹Ú^Ž­_MdM½€ŸoºŸ?Üùý_'}_oX3˜”Æ÷;RH€È…øXÕ‚Uzâ\_ ºÐIÉ$Œ tuuÁ˜wΚ)\~‰)$@y br£(oº'øQ`0òïqôÁ$%À“bG†&[ô¡ÊïN­GúI%¡OLô— àkÁÒvN§SåÒ†Â#…dh»éÑê2À^û?ÐñÅ0¿I¾aò8“$@JF¥£›/õûÛ¤aI¾aòØ’ErÝånéÓòÂyú´Q{Ðÿ£NÄ”|ŽàïóÑ2¹Éuë§ï)ÀpO˜C@ï¯v&v¨ IÔ7ëÞjµ²`bª¾ã}l%RŠÉ“¡\»@DÌýä›oêýç{?„²zP&å¯LËÀ=ª=^h5<€`·Û‡]»¥Þ¾š#9¾È¸M¿Š®‹cÉg¹ö}ÉžàW¦UÙFæ/Ñ”_EˆÖ_¢_Ì…N¾ÞßÝèæïÅ zʺ÷—èGdj¿tæ‰s`Øwªø¿O¢Ÿ(?^(ÈŸ¢à/ÑÏ{†žIˆ‹íB;¼0ôLâ+F’ßWåÏ[}5oLPË/4`R¹­ýÄý âvûÔ+ü5ò·­Ø<½MCgm<éOU¡PýOnJôSÅû•€aä/4 êjn‚I£$(R>…H ð%±aP¡)n(Ñïc»ªô¯o(@ŒýÓ95)Fú@»‘¶ †4Dàá´üöb¾3)¿nnåŸ_íLìP!*Ná^÷+A áÈ© "¹Ž¾y%999غ. Õ/.اá¶IØXvÚ¯7Fôœ‰×?9Æ4X 4Ȳ̆eÍûñú®££ƒwÍóGðb6:o$x ŒFãð¬ya‰Ÿ/ùû*ÍÍÍ<ëß7Ë?Tù}=¡Êï[ò7ùÉêV¹§»ÚÃ;ŠsÄdË:OSÀN€‘@G:¾¿2ÁªÎö:U­±P O€Ø-P´úÅê¾J@ n™zÝÐêJXT])ãß×+0O§½2퀯Ä0ÀýøíÅ.þøùHkø?/¸VT |žd¹•ò ¸¦Ï˜Hcþ7_³/È@ð—øÈýO߉¿èb&øºŸi[úNµîßO8 ûŸ¾ó'¿håûsÿG"?yÆB~*°`Øò?•gF£~œüµö§°ŒäCþޝò̯€ÚýOî|ßZ¾"þý €Üù¾µ|=Dþô=)0þ¬ü@É€þZc:퉫FêÆ7–©YÑç V«uXëcúßb±0‹Å›7…Û"yãÇ•A¸íÂG7÷Î;ÙSëÖ²§Ö­µÚ8® ¶þ¢A–e¶Ò£*j+ãŸìîˆx×Ý1‰»ífjàÊ´Ãá#ÔÏ#Ýv4Øív¬ÊpqEÀb±°®®.X,f6›±*C) -~>VÇþŸÜ^÷ó:iʲ̲gD_‘I=ØŽ£¡t&ÇèÕ°Ù´&‘Jh¥y pâD¤Üö%4šÌÈËËÃÜ;ïüBýf¥¥¥Ÿ[y3gÞ1&²ùUVeY¦^§"SñÿϨ–¾&Y‹UÙFFk™›šúñàuÓGÕTE2¤EñïË^¿Èɘ^¯t.ÁH$èØƒA»‚Êu1™L|¢–e™!vi¡‚HýÍ»åˆð¿9/ «2\X¯Ä¤Ve¸Tå…ÇJ عsç•U4q q«¯ú½/†è7¼š AöŒh¶*ÛÈÄWú£%Kcæ0™LÌ·[¤Øœ‹@£Á.O‡¼YÛMkG5˜È¨"CÈV«•¥®˜„üü|TTTàСC¨¨¨@FF®+Ð…ô[‰ýZõn¹’hüÕ¿]íCŽ "þ³­cs9FŒcR!xËÙû¹iÒÒ+o›-nì/æL‹†%_Y¯]u¬qÔåWëî˜ÄÊ^¿È·I’ÞÓ+m;–Dê ±(R8Ùì¼Ü@ 1#3ÍŒ m{•ÏÆXf²ô—Å·áÖ‡ ÷£Z|XÕ‡Š.%žöØ-—ðôû±,¾ o6`6›a·+±´Ñ–5Y–Ùúõë±páBlß¾ŸÚnäJxã/Kiy›YsÍ¡'n5C÷Wý¾÷wï]ÍãgψfTS~Þ\Zbq¸ª—kú1!/ —kú±ÇÑW»{Ìä ¤ðR²}í8Iuo^—PÚ<#0Ve™·ÍšKiÎ'.°Ì5àð»Ý~¹Àb±°ü|¥öÇT‡ µ4[oåß·¾û74šÌpOïFíëgG}îWåd³7OÕKDüôþÍSõWõw~œ•2x8 Ää?š€‰ðpK´*È*3™L,M/Є’––†ªª*ióô6^?%ŒÜ£Ë“¼ø§ –'y¹VÿÒÇöц†.‰!f‘߯¬V+ ýê>ÄÜ‹ÞjqÃÒAÌ ¹üœü)0Vh®yB2NZ††ìÝ»©™wàw*Ñ|ò9¼ñÚ‹hn¬BsÍ~_˜¤09î3\±Ø¿&nÄý®4ưåI^ô¾ß‹ìÑLLHûÚ5~Ÿñ^$Âoqº9ñÏÒ(Þ¯§{Ôc˜L&fHÒ1C’޵ÌJÊ=zZàp8¤) †?âó$æ¬ˆß‹Ûø*ÕÕÕ\é#üèÆXMј¥ÑáÝãNä,Š5hÓÚ\þüíëGíe¥7<õˆ/Œs‚‚@û eóÞ•ÝXyk"ff:@Êdu-)#ÉáO®`¶­ê` Åã¿÷O‰x³Þ)½Yï”Î(až…·ÅÁÛæ x öS^ÄÐúî߀“yy9š››1ý¨×ß.8~²»Cñ¾®i_ÿW¥lñ›§ê¥ÑæWr“gμƒÝµ:‡Â=÷܃W_}¸ˆ={öHäR„-µuRII +¼-O•í’賑ÆP©qº¦¤*•??Ù2 Ò£UÏ—,Ël¤Òä™3ï`ùùÀïTî¦!Ò'ËßÀÛæÁ?Î*1ÿq¶b8§ê¸Ë¯P ‰$ÑçöiêCî}P7qqq1+--e«²lÓÚ\¶*ÛÈVcTIl«²Ìw*¼ò½› _‹×Þ: é|2YŽö)T&kÀ’Â|¼¿õke  FŒíÓqñ~Ÿ„FZ*¸<É‹éÑHLL ê|ý•Ë-..f •´©À›õNÉf³Ibì'¤´díÇ,`Ð%1¸Û%ôòë°ÛíÜò§?òÀ Kÿ…osC.ßVLô…Hxëî˜ÄžÛ’>le†?¼ñ—ÿŸ½o‹ê¼ÓÞa@f/cä"¨ „È`¬·TIbjbQC4éf­![wMÒm¶ÉÒl«±FÓ¦6IÓ­mZÛkÒ6F¢²Db’ëµ(`”› ‚™aœAf˜÷÷ÇáûrfæÌ/iûÛý~>ó™™sΜ9·÷}¾÷g-;×öUþѱF`ä锯³€cúf³™mÛÕ…œ²üm:|ÑLçpöú<Õø Õ[X….STjœ®²ú=w%! ¤Þ³Nž»/Zq[9_=‰Ý*MÔ¤\²8Õ ¿±­V µM »Õ‰'Î\ÁaU0ìV'´Qj.'•‘ y®Ìf3“[ûîÊ’ò]RRÂj~õ 1¹µ9töÃaqâZõutö{°uSGsGíe¨ÆKœ÷µƒô«'/ö %ÀyygœrØ÷CàÿÝMHLLÄ’%K°jÕ*LŽ7òHš²ááþçWå³³Ò}Î'kS¦pû'^šæð™b[cz,äs©ü˜7<œÂݽ&$ÙßoÇ·aY$ßg±±9FöYlÌ›pb°¦œxV*++qøj^ëìÆá«=¨¬¬ÛÞqÿBÄš}Ïmëww0°ÚëvÔEqbIËÁWaš››QZZŠÆÖ0wº?Ù¼y3³&LBvv6ùðün_\\ ½^ÏCKa‚Ÿ_’®GôË—qòb¬V«¨T³Z­‚YÔC4Óyzº••åhji4ïÆ y¼HFh¿äÀÝñÓcqw¼—B (ëÕ)*·­ 0>XÍ›ì6ca<öYllýµ~úææf$t9¬j|2-&ÓcგRr´LzÀLN$ô÷¡K£ÅaU0º4Z4ÙìhY%Ž–U">XÍóóó¹»öK`/Ÿdäa²þß<&]2÷ Ùl6³¢z Ûxæ*›ÊÚðæÑnEk†ÄÛd&O2¹‘¾ñ7™M€¯Žâ°dp*)ŽvG»Ç¾ÃÃÃq¨g<Ž”÷€xÿÊܧñ×ÿŸÉ @Ûê¢fe—pÁÞnFÀ?ùÈN”_Ãâ$K’¦7i­YÇ*+ËÞB&&ZG;s\¼ Zõ×>“”ˆÔ7V–á™>¤HÑ»í$ß½Ý÷93ûQToaÔÜ$ÐXöÚ”)œºà¬ÓiC‘ÜΰþƒZö'rÙÞ`0p9øÓûÄÈ\² ¹ý£º!Øøz5L‡Ãª`ظÁZÔ6å$V½^ÏÉý//¾ò!Tãƒ~U²ºÖPËŠê-¬Ä܇ʼnl}(ÏHÀ=ªœu:\®#Yô§vœ¼(=»Éí Ó&†ÆÁ IDAT"eD0j¯Ûñ^¿dMÕEqLQ©‘¡F†:ØÅªËyd/ܵ– ³wï^ÀŒ3PQ+m:ÜÐÍ[å•-^•€MµgÙ¦Ú³lÑÎ]lÛ¶m¬¨Y cz,šÃgºÌ¥ÆôXäååñ §ðæð™~Ù=K~” ²ýI)Øg±1÷yɑЋÖìûó&áÝ«©©ÉdBx¸T ¨Óé0gÎÜqÿB¿ç>ãþ0œu:2"õçûX ntøŠŠ @ff&íëýYÿr ùðPRRÂ6ÕžeEw¦ú{ô\“â(—ÚëvÌuÚ¡é’ÂéºxHXEᇻ%ð·_‚' y¼HFh‰ AÛ¨1(ëÕá?îÖáâÅ~LP €¡Gº ¹m ¹Ž~’’’vï ï1z`Ç/|ÆôXôÝ= ³³Ò}ºñË+[p´¬Mv{P§Á·C¾ÂpO”ê4¼¼²ë?¨e¶±Øõ³×Ñxè Ï6­4ÉÀ»»ý[¢0r^@V˜Edðox8…S,¥„§¿!€RGùµV©>;Åû?Û,YþŸm–ª  Àw@ÁÞnv¢ü*G `o·Ç¤ãK\¹\k¦ÏúȈŽ5¢µ¥Ük‡h¦s¨Â¸ÐÖ¯×>wb08%ÞÍ™Ùë5ýHöÔ¿\¤xÅ#œb•XÎËp´H¼j|Ö¦LáJ´Ê!Ó†<STà+ÿp8lÜ"Àä„`¯._¾fö—ïÞ<îRToa§úúH.NÒqk»ƒ©u*ìo³¢¼²ûÛ¬¸dq þ|Ÿ‹’}ÊaÇÁv•KÌ”” ”Áp´8PÅÅõ?å&y9?P(ª¡¡GŽÁ³ëÏ 3…¡²²< s ¼•rMúìOÊËËÙújYœ©ã>‹qs—‹ßnÛ¶êµ·ÜàKÔCùIäÞ–Óˆ÷ôôÀd2IÞÂyópäÈP²”ß=mFr;Ö?à?™®éÜ^Ötn/ËÌÌDÓ¹½lWa¢{‡ü” (wû/>]Ãüõ0›Í¬ÉîpQZÇÚ¬èÒhQ{ÝŽ.Vx’Ç‘ãâðøÛN2áð2oÅÄH ìä}I~½_8¤Š¸ãM6\r &&”(ŸKÿîJg'é8i­ÖØ»1oÔe¼9¨ÁjÝ’ Üg®ƒÞ±Ž·®òå–Ez­%yP§á3Æ£¼²E´Ð ´ñ²^Ý?N_x?nóììlN>•~ú‹“˜c”†äñ.å&“ɧ@–Ú•Eõæ^ªy#ç¢Ïà¨ó=ä<²‰OŽ7ã\“…üD #øS4Ó9®×#’¤A« ãâó0…Ê®Šê-LòÒtu’‚ëá UJR¢òØ¢z #œÒÿmÞÃûöñýÎ4-NWYE¼Ÿ’÷|1y߃RXËÆ¥çŸ¼·‹IîÚ,ª·0m”š}'yç*N^ìÑvÅð…üwÕ$ï!18žu:ð£#…ä©ÜºÑ#‰´p×Z&߯Ÿlx8…_ø,Š~ú]lWá¹û¢‡eLѪ¯‡­ªJð¼ôÒKˆ.ù#ü*!t?Üs8Étñ“—ð„è^áú¿ù³ \¼Ÿ=a9Rv¿ý’ôÀ_n@(]+9¦,NÒqʸC$ÀóšþÝt¤F'’ÛU‚…nÍì1"†â/÷£åéríu)n÷xF‚XŸÍ׬Yƒ•+WzüÖ—{’¾û@r“QïŠÅ—õê„+NÓÕéo?âøü)ÛÝF)ÆO¡€Oq€üþóF]ö þ”øV¾ÕŸïc·üE„¼‰*Œî/Ã÷…I 8€? Vg/ƒ•>ûIøS@°Ya̙ٔÁˆVó}›K2”ø þôƒáÎàh¬M™Âmc# /q"yxé¾i³ íW¤I‚@ÿ’ŵM+Û«Õ‚!²'% g;2cGFBÏ"n+#bQ½…9/ˆPÀGÊ-PO †j|Ô:åéŽh›éš‡Z¯ Wí•Zô’'¯€üsÙÄóóó]À¿µf+ܵ–Ñ2Êü`üÂgñüóÏ Zðá€^^7¦ÇâͣݢänýµlÜÜå0¦ÇŠyôV5–ª¬¬D‹>_|ò±X&!11Y£GÃb± §§G¬{/ .9îRÖ«STR†“Ißtn/»Yð§k4ÜF\JÏ÷X›2=ºÇEé]3Szè-7w¹Ë.NÒñ‹ûq‡:w¨ƒpª¯ŸM]ú€Þåâuçr-æFípÙDÉAW?Yþr‚ _ûYœ¤ãOÝ•€¼y´[LLdjy»ÇçåN ×â2îòâ$¯¾ÐoÖ˜ûÿÉ'Õá0**ÑñÞŽ‰—2奀òwê _FJƒ7Þø[ö†<~šg¸lí3DOÍGë™Íð¹ÝB÷1+ÌââÉR²†”h±ßûÚB<ú‘«»U>žåá(«ÕеùáØ´Ù$¶nèÿu:`i#ñÇä)_7ˈIÊy?hùâ$×öµr‰Vó.V4!¢ß þ­Ñ×=¬_>u«Nâá°Hzcð”ËPyÓ¾¼1ƒÒ¶‹-BAArssEEFbb"ÐÙÙ‰ââb,Z´Ž„^¨üҾ»Ï]$7ËHªDK>œó¿‘ÿu¿~söÛÒP///GDDˆg‹”€S}ýŒÖŸü㻸ÿߟõxþ|ÌÍИތ1\:[ÚžÚCZ½V«5² Žvn~wMÏ}rrWÜ]> ý}ˆ‰ Ç ?@òNø‹§ºƒ¿;Ŭ¯ë@Ûº_ÿÛÅR'p‰ó»+´¯N€Jƒ'à†8rÀ—Çü‡ÓÔ'Peá‹ÒÄ'ï„G2×)eE÷^¥Æ¢Ïî`JËÜ·—?ÇsföûÌoÎyÜȘ¼?¿ìÃjµâ¹û¢EÌ»¬W'öCËɪö¶Pºîò倧;uëÖ­|õêÕ>óvt-ôw‡»%àõ¶oƒÁÀ-Z„ÊÊJÔÕÕ!++K”ݽpÿ}øÓ¹:Ìœ9;wîD\\š››En@qq±âþ†«@r.*îJÈp1HþŸÀP_«Õб6«OÃïVˆyó žüz ÖÌ#¼F¢Š®§m£†šúµµµ±Œ8´‘à{¢œèåB€ ÀeðÓï•´Nš€äLËO¥À×1Þ(/üxä¿•ÿÿí£ÑÈËËË™\ ð¦ È×ÒøF<  N^Âu{Ù°ÿïH”&”@-˜›ýÏ¿U~ŠÒä;ÜçVî1‘ƒ÷=QN1öißJ¿#bvV:~þÖ‡.ûØýýE8ZV)ÖÉ=ŠÄ÷ÿZW™Ï¿¯¾ú*JKKñüóÏcåʕرcV®\ êøüóÏðÆ·ò9¼™y/ß*)M¾äVwötnà?îÖágÇ-xíÓVEZ¾>ùuIAþ»~yÀÕú'ñeMxs=º[¢òåÿ0I|_¢()¤”””0Z/ßöv“PþOþWËÿÙÛ'ò0¹ú‹‹‹ñÒK/áù矇V«Ë€¿‚y»$PðËúw£I)¤L^Õÿ/nD|Žž?ñljxû†+æ\:`aúI!Ü|^Šƒdä„s¤ëÔThfæëxò|¼èûæ7Ç2y ŸÆkD/ëj–Š®ËŸaî„lÔ:9šÎí ˆÔB¯×ó¬¬,üéOBdd¤ØÖW6÷ÿo"φÿ[Ë—)·‚qÒ×s+C9ÙÉGË'pj¶nêh¾ñÌUÏÊ?ÙÉÿ+dä|Žk¯qL d2yyy|æÌ¡®›J!_¡÷F7r"ù÷@åË à Sñ`­ê†È¥ù¨Q£ŽÌÌLtvJ ÖòF;rˆˆˆ@CCZZZ‹––Oä—Iö©âŽ›þ¯¼¼<ÞÓÓƒQ£F‰ðJDD„¸´Îý3 ]£¿›*€•Œ‰äg÷7šñÄ'ÂŽqú øgä„óUïàÕRYD¿Ù‰ŒœpÞoÀ… ïn9%r 4™€wð7óù8|©DÚïàò@D{±o®ùªË²„y÷xM Wn–«àË’¶¶6VÖ« ¸Ž»„MJäK&ÿCœ+‰^¯çcÇ/@nnî ß§ Ë"ùï0Z±c›{U‹„ÁÞ릎ö@ÊÀ^7u´Ô7ð¿;Zñ"Ãáð*‚^^¯­•ºmÛ¶Ñg%Ùºu«ÿÒÒR”––*î›¶•/Wø'Ÿ|V¬sWüuÄ[7u4_œœÄÏ8¹¸ÞþˆxÒ–.åòw÷åÞÄÞëdv«úI!.Ûé'…ømƒ=jÔ(¤§§#33€jWŽF㡃=~ ‡âʑørä0˜˜ˆôôt˜L&ôôôˆý¸·ò½‘wßTZ¬üÿ‰‰‰hnnFxx8š››ÑÙÙ‰ˆˆø===hnnŸé÷¯@WµTröö¨Z4šYcµ c§…"#'œgGb÷öN,[{Œ:ŒÓ¡±Ú†—ŽF¸—MœD~á­²»4Û˪YªùUÓê0vüèÙ—xo¤Èß‚^v¸b0„ÂeµZ¥îk9Ãg“œ˜ž†º¿žÇßJ .1 Ý÷ôt#Æ Ü?ù\MmüŠ ËÁŸd㙫lc}ÖMlÂGË'ø<¦;v ??? Åy8²nêh~òbßM)Öv»)%`ä|¯¿uÿ8S)v­ËëSRR|*¥¥¥X½z5›9Ó³SyäŠ ŒlsKóJzºo½õ†à§§]úå»ÿÿâä$¾nêh>+M‹Œ N<Ü…YiZ¬›:šŸqr¯J@ÚÒ¥¼jÏFïòu´Ü}{ù÷`­g‡U[‡§«<4¹¢žž.,Þ3{÷ ñÐAT75‰.Ž)#‚QÝÔ„ê¦&|^ô?8³w"""îB •{­‹-BYY²³³o¸Drq’ŽH ÁÅ” L›Šìììz½žgBbã#¹bÐÓÓƒÎÎN„‡‡£¥¥ÅE À—çd’ÒD Ð?„à«“  Ó4h¬¶!|‘Dø‘0M#À}÷öN$LÓà`¹Ë-XöÇ8$LÓàTù5œ*Tf($" z™X'ªS¦9ÿŒíÕÉh:·—¿Û«“aL –\³uõŠ„ƒ÷ôô@§ÓA«Õ¢¦¦EÍZ<ÿüóغu«Øî 7øUFþVâË;AëÓôyìV«e½:,NÒñ¨qý¨¾Ð‡kÕׇ},wfeaÒ¬Å8_ Þ"Ùðp ß¼éN>œÚm@:ïÜÜ\œü¤ ;ú§àÕW_Ë‡ã  ^îɰþ”¿uúÏ\eŠ <Ï\eÇ&f÷sÙõ³×ø~&†+'/öazL(Ü•“኷ž~E3ãz-Ü­ê·/'Ä)..FsøLÌÎre¾[°`‡rHn}ýÒÒRÈ c6,‹äq=B¾ Í7…»Ö29ÀS/ùôt£ð¹LVÖ%ÀýôŠêêÙ©Ðý•¦ÅìLf¥iñXpOOÀO^^.@ÿά,EOÀY¯FÚÒ¥\II ûQüW³è¢‰T£®ÄAúI!üþ4O.˜+G£º©I|'ð§÷”ÒX¨nj™½{’,Ú¹‹iwíĶmÛ‡ÔÔTøkÙí.ñÁj>"5 |Ÿ¿?S‚ m9.H”È»Ðdw0÷1¡4F¼‘è™ÍfÑ„@ž<†Â qqqði{Jƾå ÑÒ;¹CˆRs¸ûÌœõêR´\´£±Úóù~ÖXmÃAg?bjpÅ<€˜Ú ì M, M…f¶ûÍÈ0Žô þòc–/'kJ5^Y+“‹ÝêÄþ6+2§BFN8W;ö£éÜ^öÚ©ðpu‘X­Vttt£££±zõj¼úê«hmm‚ÅbÁâÿ|ݧb¤$·ÛúL?Òg~B“ÝÁÖ¦Lá¥6ÿ`ži1¡úB-ÑŽÕßóóø~ä²¾ð­m8SÃÁÐâu›Û%¶Ïí(ù±ëBŠÒöðŽvcúýY˜~~üZ±â6þÄ`0p%ë_«Õº°Z¬ÔqlzŒ«géX•-Ÿ0Ä¥.óÈé¾½ÉéM“p°]…o„„/—èpÄ_µ~RŸ0_ÇWm¼ÃëM˜¯¹A‹:jˆÛAãµO[aLÅšÙc°8IÇ#ÕA<Ób•Ãïãg› ż²áá¾fö¼öi«øm^^žKLòHþO‰A\χ™Ï²HÙ3ª\ò¸[ñYYs ¹ÿËÊŽ¸(kó¿Ê|µ$^œœÄ3‚:1+M‹ÿ\‰ì§ãq´Â"¥|€wˇúß¿ûýï3²ømUUøÉËËyÚÒ¥¼tÛ6Ð2%¡ûamw°K>©²Àaqâþ4× Ãâtñ DDD`ôèÑŠû”+îØXÉÃZPPÀ7<œÂŸ>5´]\\²g†Á`àÙÙÙméRžód¦¦2|ýÉŠå§»K*IÆ’ÉË}q’ŽŸøX²DÞØV½^ï´}î9ÉÅÑÆqò“2œü¤ Ž6ޱã œÍëQ2-&ër*Ä3à>†m'ÙÆ ñ’r;tdé7Û˨Gy ljÚ(5k³"úå˘봣rôJÌ}Bð÷{âMù ·~oK?ÞßÒÊÿqßîÒ (¤4r>ÀO­YrH±^ÿA-£þY¡!(ëëÇñ&j¯ÛQÖ×cz,ÖPËÖPËäDGr‹¾äG |ŽQ‡#åÌ1êðì‘â~þÖ‡˜=Cb·¤ß4Ûˈ…ÜþYYsPVv ž™‡oXZWYY®˜ $³3u9Á3íÈ~:³Ò´85 5øqWÜ­ù´¥KùYYФ¥áÂì§AŸ ümUU>óìV'Éòÿ¤Ê‚Kô“B¸~RWëT^úúz—ï4W¨cÕž’Ñ£Gãßøà?ð.R{ ?}ùqp!5¢ÏÍÍÍtÇî2mb(výìu$LÓà“s¿^Kçåì³ØXõ…>h[Ž‹1pK— K£l˜€T²J)ÿŒŒN"¢9”\þüÂí/|@Rz(Q¼’2I:?$)bò¹^í±Ž&8j¿+zWO•X´¼YhhhÀŠ++V¬@~~>î;GËÊ NñLž#ðo¬¶á¾zdä„óíë¾`e½:LQ©1ãþ0Ü£ Á=ªL(éÇ>‹y³þWîqUÆ øí¹ocÚÄP”WYqÖé@Lí€ß¬t{¯“=ž‘àÂGN4³üšF^SSãBÚÑѓɄ;vˆß –µÁVÂô¼Ý?bø»!í7ä˜.2_ÿ³6e —+f³™5^oUþ±‚¨cÕÙ#°œªVIzÏ7°Â·$KãBå¥qº¬ ïm?á±\.K&ó§=‡Æª&$¤Å / )òmïÙ˜ËOí='ÎsýµÌö¹]âdìbI gî‰rJ–áúT1ù»ÿ·ÔÕ&^ÓïÏBzºjƒëOüÅ'É:ð¦ðiµZèÙÏêȽo‡f:NX 8ÚÅŽ?Z>Á#G@XmÓ¢K£ÅX›ªñA(1÷AmÓâåNïãΗ¬›:š›2™´|§DD¥ÿ¶¶;˜ù|?3ŸïgÉ3GâŠy§Ê¯AI È0Žôý§ç÷ü$òëLaòA*ò‘ƒ…VŽ{ï~Ž”KMpèÝqFºŸßyò!Áz*²èÉÊë­7°à™yxlêDDDà·¿\-ÖRÏoÕøéö”ü² öÒ`ôþæŽUY‘Ôé7‚§fÕbÎwžÅ?ã·›5[„H7z*¨4/Ú{Òû µZ§‚Ãâ„­Ã%ÏMss³‡û€ðº{ª›špõêUœ8q€¤DýçÞÅ;;Ï¢¸¸ÅÅÅ8tèš››QYY “É„ÆÖ0Ÿå|Ó&†ÂyyMv3_õêëp´8\°pÚÄPXcïFQ½…¹Whº:Åóp°]…iCÑ¥‘Jùª/ô …þ°*Ø…‘311áááÂ Ï @\\œÈ *z—€þó’6êìa9\(p£çt›&»ƒQ¬…\þÄžEò)‡ÝE ÈÎÎæùùù|ÅŠHLLÄÎ;ÑÐЀ††ìܹŸvuㇰ| x«mH˜¦ÁîíÈ0ŽDFN¸ÔR8M‹Ÿô¢úBNF‡£üÇ‚£S7òèÔ<ç‘M¼¢–#3…á¬ÓsFN©!E¬‘oìo³ ðWëTÈÖ»ºYsssÑÚª Šuuu°Z­0™LpOôPBˆL",‡‹pCàOñIƒÁÀW¬XW^yqqq~‡žµ)SøGË'ðó­ñ›D E@¯×s¹‚ˆÈ{±/7ð»}ïùVµgëíHEá[Û©wÿ;u{¥åç¼þÿêÕ«YBZ< !-K&óðÌ4ÀwJã÷lÌåK&óÏ·{òƒ¸¯ÿ –‘‰úR¼öi+òמö{Þf³™9Ú¸ˆãÒ¤Þuù3ÅžÞ„&%w¿^¯çŠŸŸYiZ¬›Øh¦óÊiÏ … µq°ug¼åDuCpti´¨¾0äñÒëõÜ›Œ„@†æŸLæ³Ò´øéö«²â”Ã.âÿÞžÇUïà8z[úqÅ,y¹W'#'œïÞîÆÇ!Oì9ŸÃi®×ªp܈t8XŸv$æÿóJ1‘ûcšVXþåUV1_n\×N +æ3\«¾Žäv† ]¸hõh_€G_9 YTïAf óKÆ’±d²°ìµQjžõ̘*ªÐXÕ„»V}]|ö?Öëõ<22Ë–-Cbb"žþy¯ç.oÎAÍ:4á3…˶ëògâ·òÆTþ®¥Á`àš®N>òŽ`Šà?Ø>y]ô!ÌJÓâ©ÓYh:ÿWlúÑN”•㣗Å>y±O1OÖ¿|ÿòg[¯×s‡Æê·Þ{q’Žg¨ƒ1+M‹cUVÌJÓbKq7žY4+ö÷Šóikkcùùù¼³³ßŲU’â³}Ýâ“¡[ ‰TcÙªìÞÞéyIpš¤PǤ¯HÔ¬7Øë`q’Ž;/ ¬¯Y¡!>s'é¸1M‹õ»;؆e‘üÄ'½"ÑQÎ>ê‰4~òNÏ ÅÿËÊŽˆõ••åb™<þïMÈêÄ©P.À±*«‹û?Þ?yy9·ÜŽ;³²pº¬L¸ÿwün&~u,§ËÊ·—ƒ?—*ùòá€VÖe••åR>‡—x*CºÆ¿:5ä½ ÐÄ PÅ2¥Û¶ÁVU…o=1š´4¬ü—RŸà//Ï´÷:•z“úúz477»Äø ü§¨$/€1M‹¨å!ï_Ö£.Š Œ¢€‡ØN²¦–~¸{ð@.¡©¥eHp{îi>þ÷R„÷”ðíôËÓñtÎd¬úz2~Yx. ŠƒÁÀ)à¹{C}z^åÙýë—7üqJ¤ïŠW—1»Ò3Ÿïš<äEèƒâ&ºh»ªñAx·¡'/öA=5Û‹ºE)àÊŽu£}²ÇM—$´×$¢ƒäv&\=åUV¬™åtš»‡&ãø·„ªA t\æÂrn­YÇÐ[È*+Ë…µïøIô“B¸Cc…[àÐX%>t·ò#³ÙÌJJJ˜¼&Õjµ¢¦¦Æe­V NçâRõû%‰J’8¥í—8ÁÈ¡ `_ÿA-+ª·°5³œ‚Ñ66DgL£?MöAH K£E«ÝwìÞ]GN!2…2BCüæÒ=*Ü_†Ös[$Zß” ñÿí&÷˜Ï÷3yÌߟ,NÒñÐãÇPøÝï`×Ï^GÊ)ùUi ›Íf&u:wwÑç<²‰çææ"=Ýè²òVÕ¤,ÊÛØˆ!—üåÏpàã͸{î3“JÓ••å(+;‚Oì¼ë¼…îÆˆ'ö rÚs®J”—f@î!zvKÌ}hkkcJîpŠëÿ "œ§_ àòb¶wczL(ÆÚ¬¨½nDZ*+¦M Ñl‹ë0ÿo²;Ø¥ì4VÛà° &“] ÅÕÚ>ìÞÞ‰±-NïUÈ£†Ø Ý…j¹åË´Z­ˆûëõz^¸k-ëêMPôd˜ù|÷¾üE÷ŽÖ`¸ä >?M--B Ö€µë¿‹Âýe^c â8ܬ‡Fú¶¶6¦¶iñƒˆpJJèÛxæ*{K­jœ +öKCíu;j¯Û1+M‹”Áx<1LäùÔ ãHàJ(¬ífm—â§”YÞdw°}£²<Œœ/eù«£808á«Â%Àv’yëöçMè¸H9ép 0 ›yò®•WYE™ß)‡]|ö%4/=ùä³.É€¤Ƚ¤Ð2ùœVTWÏäs2þÆ3Wð{³üå~Ò–.åT ø­'¦ ËŸÀ_“–æÓõoëpx¸ûå¥îBV|ʈ`$·KùZɲ¨ç•djº:q਋âHŒúúz©z€î?‰ü~Sòçà\ û%ÌŸ=ÞÊ(¯Mz€dÈÒ¸¿6é!f˜61Y¡!>+yh^1›Í¬¨ÞÂÌf3S*c$‘—ûÉ3üãââD~€\AàR&¨¨èõz®½",}诓'M.ê`ôÝ=K,ÿù%i¢>å°cÚÄPÑÔàäE t•´pù$LqQ%^k¹ŒЉ™ZLÌÔb®ÓŽÃ*)„\0])#¹:EJÊÒÜmÅÄL-‚¾÷p:.ßt…’óù~6E¥“Y(ÙúPEdII £6 JdEV«‘‘‘. Bz Ô1’õHïêiSÇ m PòšÙcðÚŸû„E¹föáð©”éõüõ âØ÷!kS¦øí®å¾^®ÍÓ v^@r;óÛ‹AÈ ÐОêõPo|zÞÈjÕ³P ¹­Ô³ÙÌNí=çªîBî^ʧœcz¬O\­g÷ÿÐëõüøá-¿‘gô+ÖøËÎ‘Ú Ëó @(ƒ®N--Òsd;Éâï`p|ô2W”\Ç^Üã´_‡Æ*®-¯=àц—@G¯×sMW'ÞmèÅw& 7íã‰aØRÜ Õø þtm•þÂ|ß½½Ó#ääGÞg± íC6S…{4ù T 7w9šÃgz¬kŸ ouäEõ¶aY$/ª·0—P›Ë_.kó¿*”;9È“À}½7Ùxæ*sÏö„ €”y¶ÿ»åv|ïﳪ={˜&-Müi.1 Üaqbbdô“BÄ2½^Ï))PÉx=z´ NÒå„b5mb¨x%·3Ô^·£¹¹W¯^•îõ` ±S÷g{P ˆŸô—kê.äÁŽTñ²¾~Õ[˜Ü«]Toaû,6jõ^†®” Ûdw0oóݨQ£\\ûÔ˜rÜû477»„Drý¹’¸SãÞAJ.ß™ Y>§vT_èC—F‹¬¬,„?†Ô§¾;vx¥å ”A)>GÏ'fjq¡Â ËEi‚ÐÅcZí3àØùÒ¶´ÝÄL­w 9üMÐÉR%ñ‘Ó5Tâ$§óNMMÅŠ+ƒ–ûõLNNFqq1"##=øªo…(±’Â…íëùÑtuÂ66ò„7¥mÔi8 ä²^2-&1°—D(`XçM÷QÅ¡™°249ƒÁÀ×ÌÍ]Áx}K»â6ß}& ¶Ïíxóhw@㇮“Ô•¨Tݯ¿™ÏGüÒjy5AÓzvÀu‚QGq~$î ¤ƒ.QŠ7{Ë"§spùroÏ׺©£ù» ½¢Ýµ¼Œ €èÏAàírîãd½+®Õ6äPëTbxÝ1"eØJñØÏ›7ç;v`Á‚â|éù’'*í×ý)‰R}¿¼Ý¯\) uîû ä>y8 ÐŽ‹ä¼RÇ?¥óó¸w€¸G6n¡S‡Å9B½ ­V‹-[¶€’iž 1¦iE÷ŸôŠõÕú0ÿŸW%’ËŸ”¹ K œ?{ ºz$ï˜ð—¿ŠPë5¨"Æp½§òFmJ JaøeË–q“Éä×§Lz'¥€¶£ï£F‚Ǧƒòöàò@Ò6+W®Ä™=¿‚5önÓ¾]Ôˆó_2pÝ;T§¨ÐÛŽK7Â:RŠe“·àB…M…~’Òäà/Ë’ötÞd)ðà$7¦Ç žf÷ëlµZ‘••…2…f5”h2™°`Á‚Ηðwì$ýOJTÊJûóõü¸W’RÝ«?þðaËM(vJBàÀ¥Ã›»·üþÓï¡D½ jîÑjµ¶Ý µy”z—¾1k¨™Î… )Tÿ.ßnP ðÖÆÚýÿÝ wšRúü{u ì¸dW»[ÿJ“¥ÒyûUš©üo^9.<ÿüó³ù‘äææŠõ¤бlXÉ剷¾îŸüwòuòþþ¾ý|Yl€€?I X ÎãƒÀOÛæççóŠŠ QeLÓâÝÓf‘ q¹P/—äv†¨å!)) ÿõ_ÿå¢äŠÏTþé4‰ @¹ Àf×ÝxsþÝ wÃKéù¥Š÷g ;;›SS÷ø¾ÜòWÿˆˆ/l8ÿ€"Ÿ(¹Ïv|ЂšÂG„KVÄ•“¾[‰ÊåVrÉûSœÜ­¸[z_‚Ü Îu¥0Á?Â5ðÀ¾&mùoåU••å°™¤\Z>6¬]½  0€?å[.~¯M~ä ¸Išßynųã¾?àË{v†C3oZ Ï/ñ¦°ý#ŠÒ=¥2Ðïì >à þô^}¡ óîAff¦wCÊÀϘP2xÜ××3.¿ïîJ‚/ã,//ËËúܳþ•¨åJÀߥPÛG÷Ï·Rn']©/ $±G.Ô‰/??Ÿpù2úþâ)tm xî’1÷×êFÙÇþ7‰RâŸÁ`ðÛ§ýo!yyyÜh4r£ÑÈ}±ÿݬÈWoäu»Žk¸â-Æ}3­£ Ãßý¸¿]è½õYdI„>·æÊuXœSqêEŠ€?e€ˆ@|õúþ[‚ÿ£nXJ@II +..FEENœ8ììlNÙœM,þO°yÓ¼  €SðÜÜ\6Ãúúz±îË8Ž Ë"=Z{² ä Qr…€>+­ó%-Oç~åѿ٘óȦfêNß)NNŸåÛFDD ""Ô²ÚýúÂ|#Ç1¡ÿÈËËã•••¨««Ckk+V®\‰Û©|Ùr;‡gy¯.úhù„aÉQNÕ›o¾yÓÇ6\‘·OÏÏϸ•º\’&…òÍ›bxî’1|ó¦˜aýv8¤o>€”ÁØñuÃpþ;pQ¨*ƒ»ÝêDtŸÔA[‡Ãc;¹h£ÔüjmÞßâ¥\nP:;;]zì߬¸OVÞ¶)¯²ŠþÞ%?J–˰¦¦Æ¥}å'Çãoôp¿Ñëõü£åé_ê¤WPPÀÏ6f¢¾¾~(¶ íi–””„ GQ__oJÀ­´žyÎ2¬ìM ä’(wó‘r _ˆ°¥¸ö“µÃ;𔂂^1àÇ”óÈ&~üð<ýÛßyl÷󃇼{|°š/NÒñŸôº4¼"÷­<ÔGcŽê¹ •«œÅ-..Î/‘‹»Dªƒ¸üÈo¶mÛÆŒF#onnFzz:’““ àÛßþ6x­ø{jN].ýµCŽ<¨Ópj-]ò£.3Eõö«ÏM~‰äÜEÓÕ‰Ý Ø½ð6á—‘ßßÌÌLtvvbÑ¢EÈÌÌ øÞç.ÃïLÓâ·o_AÁÞnöÛ·¯@©‚/!VLú>a¾Ž»/÷îDê4üA†V#þîÀK®u”G–Üò'2ˆ&»ƒ¶1Ø{ÌnuB©ö©ÈKîêJ¯á£åéŠ T\\|Kcƒò˜“¯mœ—Di )^ÅMAjkkc%Ç®¶ýéTÀ͈þ–ò«S¶/í¿¨%hss3’’’<Öçææ²¤¤$ ¼‡÷Þ]íU ‹V«Evvv@Š@ؤD—mÂóÿÀ¢s/<û5d,™Ìý)Ý!WDÌOî †<òº~ÏoÆ’ÉüÀH;~2͉¯¾4í¶ƒÎ¥q‘È R‰c*ܵ–ýÇ·çáÈ‘#.Ûåææ²9sæ(î#>XÍW-–,Á}“SŠÓø©¾Ð7D‘ i\T¿÷'$&&âßþíßщœÅ­¹¹9àñ.ü>­Dt‡Z¢÷¦äçç ¯¼¼œÕÔÔ ¹¹ ,À‚  K^^—3ÿý#IkÍ:Á:Ø7â›.óÏÍz™ä%žÙßodsŒ:®çåÁ&ûÑò >ÿË`0p£ÑÈmc#ðÆñÏ1ùõFN!ù¶tÏ®ú¦X.ÿ|#Bñøææf‘‰âÄ ‘îÇ!—¤I¡ü¯¦~ìífÔ1¶þ|+ØÛÍU´Z-p%½-ý˜0_Ç^:…œÑ‰erQR­<)z½žS@¢¬½n¿uJ@XŽWrš`­ Q݃dƒJÀHÆ ŸÂ5‘jQ?ïŠäá|§a2çð_×›Qtgª8v½^K“¨ç70ß—OP´\ÞÁ¯¼Ê Ÿ¡Íô¡Æ>€à"Ïyhâââóв›ÖÀÕÉÞºPìÒ׃ê.î]ÂÌf3s~ÑŠ/à PPPÀÉÕ§m9Ž7ß|Sàß{w5¦¬Ã £ÔÁ}@™ÍföïÑwˆïV«Up1PC*o Á¤4WŠè°I‰¼õ_ïÆˆy¿gÇ¿;ÏμOñ~+qÐþÝ€ü…èZ?ûg#ïb)HþÊ$ôœ´#cVè­WâÝä;÷ÌcdÙÿäåå<ç‘Mü{?xŸþývlݺ•=øS??xˆË’ø`5Ÿ61'>é…óò6,‹äÓ&† n@ªYµxŒð'à×GŽ"ºäSÑùŒBqqq¢ùIüä%>›ø÷iG‚^€¤|ázúß¡BFhÏu5>6oÞÌ233 ´µµ±²²2TTT¯Ý¶mÛØ¶mÛØp]ÁJ²ió_†íR¾Y‰NÝÈ|¼óæ{÷¾ðûaîÃüϯXÍýñ¸»Ëiùþªuì´|ÿ™-ðUƒM¸Ÿ@mv0Z?²’©4^ìa“ù¿›®à¿ÃÇaÀrËŸ‰!òøˆ_r D®¨ÆáÙ'"q¤Ü",}@¢s”w„£Æ^}ÈüdeZÑ K‘™Â$¢Æ=7ž­í¥+ išljó¡F<þx {^$¾ö~¥¸Îp! OehÄr@*ùw_Ç™óÐ2¯u·òc&­[ÛrÎ˸ç…d$LY‡÷Þ]«½waáüN$LY'ò&6oº“Ë¿Ëíhu?þ»õ ¯‡¥_ ›”È'¥ >ùý½~è›ü•7>«§õhý×»žÿR'¥’@yI·Ì`¹2«Róä¯LBKÁåŽñ© c¹5=='í5=…¡wº픜G6qK÷”””°üü|>6ü`מFLˆ_¢ØÉP¯×ó±6«#îYÛ΢qæuc«¨ÞÂ~˜û0¯¨¬ÄÔ%K±jÕ*9r¥¥¥ˆˆšf‘õ¥3DO|¥ãp_VŽ¼ËØ6>y—;QÖ×ïÒâ<P(³•ÈðÖFW.ÔiììÜñ¸?]¨nàý-XµñîžqµÖ75i B(ÕÀö¢n—žýÔÔªg–“|¸È`ùIÎ#›xtêFû%ä,ý6¢–b²á/Ò<·Åµq‹›xµî= êåŽtþÔIËyy@4ÖHšê3Ï¡­­=q¨‹““8€ó‹V­îÖéGËÓy@¡Aúð;O£òj†WGAA øóÇÛ¡¹Wƒ„)ë3Œ1X³f ¦¬sI:Û˜éqî[·nåï}?At¡Ìrã1Ÿ¿0_|–Sïù¶TuU¬£ ƒBëww°Þó ,ú7Ç=<Ô쇼V«cúÇ ðÓ/5 !%ÀW‰[KÁÅ={XˆéCŒåµèb)€¿¼XÍ ç¤Ý/ø þçWåÅ+ 8á¤p×ZVRRÂrÙÄÿ2ækó ¾÷ƒ÷Yyy¹G»câq—¹ƒ?u$ðŸöècøÉÞBtvvâÕW_ÅÎ;ÑÜÜìÑëÝÒ}Àüýy ©Ý„ê`ä]îœìîB€Í›73b5ÍÏÏ礀Ð÷ŠŠŠ€ ß´ù/ü¥—^lݺK–¿Š+VxeD½iQêö–Ã[ÏmÁ¯Ø'ÚêÕ«E¯ƒÒÒR¼XÔŽ­[·䩨g± Žwð§vÚÎËHŒê }" ƒÁÀ£££±ìã6¥Æd2¡¬¬ ÏÞ}—Ø6??ßüàÇ#¤> O†h°8IÇ?·»>؇9YÑØ°,’ûò'W2444 ¢¢Â¥9Óü…ù.–»õ/Óæ⼂®¼pµüÇôsÉ  íeð'Cú¬¶iý®ûñl»g.ŽUUá«+%F·þχ3å<,þûϯ<Êï}á=¯ûŽNÝÈ šB׫\¨ù“¼éàÚø€‹Ûÿ£åø×Þ¿$ö)ïvYYsû]zº–î"þšz×*Å^ø€okšÚ·ú£ö• Õh`“ ;;›ûñüü|®X„ÈQuعs'æ/\çòyó¦¯+v‰¼`I|"²ù[tÏ¥80ä‘‹ˆˆ@bb"VNíÅŽ3a(--…üzÈ…BÐb¾×h!÷ Ò3Aó-±FÊ[I“Õ_^^îr]èM›ÿ‰Çl*BVV–W%ê£åø ‡s²¢q¤¬U¼Àœ¬h¼yü‚‹UNã155555 nò\€+V`ÿþýHLLÄæÍ›Y ¹ „gת¯»°Çú’‡—Náì9ëáI$à‹ AoK?ÂbC@žo¯UcmVti´ñ³ÙÌ܀ФÕ1R_q[)าüÉ# $ã¦k8µó=ðZ&fjÑU݇kœ»€ÿØi®­=› ÍŒšûÔ•^ƒµÝÁˆGúþt5ÚǸ®WúìMü¿Ëñ zJöYlŒGäš,à™à"šéük>ßK÷Œ kî#ð§®m^D¼„Ÿ©á˜šÊ$oÀ Ù‰/ð$m9vâlôÝ= —çÀÿðÁ?b^x®~XYÌíWBÄgJb tòDðTÔrÜòÏèW?…Â=¿ðhnnÆ c ¶l‘šälª=Ë öv3²$ÿ_«`;y€äú§ßÉ3ÃÉšÿã¾0ìû´û>íÀgÝIHLLDff¦‹'@“9sþy()êù;Í^Á?t¦Ñ¿9.•¬9¨“ç„À_.Þ:u’¸}‚ñ˜ñôø*G$k¿#+–¯x„ÿ˘QxóäG˜•–@ÿcUU¹Kkï>ûU¯x„ûÿeË–ñ­[·òɆ¿øµxüà©»¤méûƒ: 7¦i=bþŽs—8°ȉGÞ_7f>RïZ%ÆÒ“O>+˜ñèwrÀµ^ƒ¼_{¨õšÈ ð%TöH N€ììlžøç<²‰'&&"rT:z’‘™™ s§ôœ–””°oDnnî­mp$Ze»Îß7þòùè°wœ ÃÊ©½˜9s&öýp”¼D!NFÓ\§]à¼3¨Ü0Q’ÖÖV¡ $''#++K$ÝÅl*Âŵ‹½‚¿¨*QãHY«x¯r:Påt ÿóv¤©Ô—˜»Wëè5off&JKKa2™„GŠ”Qo¢RsµN…+愞æs[`°ziRÿ´²/ ëZׇ̼¹¥² IDATûÒHoíµ1‡½Uî;k³Š¸¿ÙlV¤ï”ËiùäL´]»[‘~õþÞëﯛ¤›{¡Âêò>’IÇØ«Bæ7%'À'ú_yW?Êþ¤|#å}HWI§w`¤j›V¢yÍ çæë¸/«h8nO²þ•ÖÑÃ[{ÝcšÕúpâ“^&2’ÁXwèõßÃÒ}óæÍsÉd>×öUÉ+@×VÕÉK8ýÔT†©© Uû›á¸ØØ/AðŸàHî©– GQSSƒððpXcïÆÌ™31E¥F•Ócšq=t]ôz='eœÞP" í$km܃Âwã½µ"zò3Š›åååñ’’FÖ½\;'2ž©!8dJCãÙøø@„H”ká­5ëXtêFž™ÂP¸k-+Üó Ø*Žâ³î$œkÒcÜ}k±èû…XôýBÿ(¶Š£"žýêi½ ÈnXÉ ü_yã#ôžo`§öžcëww°WOëCî^¹Ûß};o¢N^“¿2 u=ž“v|õ™0¯JÀ¶{æ¢ÿóü÷5-ŽUUáwÝ=(ëÕáØ {Û/÷}ˆ?Ô7à/;N!ä® ô>€¼ƒ‡áËòšŽÕ«W³’’¶bÅ ŸYÏr¯ØìL ø«Æ¡¼Êêþ°øt;{âÐ(Gœ Oþ½pÏ/„" W”ò"##=À^þ=#4Äý'B233AnþÍ›73Êþ/))a:¾À?~òž•5…Ïÿ¥¥¥8ðñFüú׿Ưýktô$C¯×ó²²2ÅVÃ7%Ôæ\aþ†f:„I”jÝɧcìììJÀÎ;ñÔÛ5X±b…â>Ìf3K1äÚ×jµXµxŒ˜?ãƒÕ.m å<D…­ÓéDü\滑šÍfæ+üE%‡'vT9âýHiŽ”†`Åþ^”WYÑx€#wÉ‘«ÓéPSS£ÑÈ©$<<K+Ž#¿õÏ"¥»[jIo2™• ƒÁÀ üÉZïééAvv¶ï„ìq}‹ ®„âÓ’/¤¤y¦ƒZ§Â}é ø´²¸*aàÈn—$@¡Üdw0²f½¹û岿j›‘2¸›A>ú°;Ìâû‹_¼zÌçûYS¡™É‰zÆN EW¬ e}ý;-Týèb†o¹Áa*Ûÿ§Ûÿ§Aº‰ Wè„ù:^Wz þÿ™dåâ-9²Éî`3îC“ÝÁÖïî`¿Û‹ÚëvW&2Ñ KQóùv‘µ\\\ŒE‹áĉhnnFf ¢gµô öU'/áSSì—Pµ¿UEÇû%¤=øÓýOng R"mËqÀˆÔ\¯éG•Óá’€åOêÏ÷±¢ºzvS倶“ ŽvÖÚ¸DÙ*qoM‘Šê-ìÑÇ·¢¹¹bãÙŠ°µf§ÖLçÐÌD᮵ìÈ;G Éœ [ÅQyçÞÛðœôžo`ç«DóŸWOëAàïž<Ô{¾AQ ‘Çý•H¸üµ¸U'/áãS¥U#'£‹¥àÔ1ï¹.y#ïàalª=Ë6Õžå…Ÿ·4£ÿs‰|©Éî`¨o@ÿç¹+ȧõ9ã•\ë_½z5ûùk+òé¿wN€¿<û_NüC/ù14ÛËôɺ/üp7šZZ†øÜ1D[øán¢¹õßÐÐà*òxòê œês-£’‹<€–EDD(>kÞ$rTÔ ¿‰ââbvzõÕWqàã$P\½zõíÉœ¿E~‘ýRÀ‰Æüqqqغu+€Í›7ãСC¢íŠ+°mÛ6ÖÐÐàu?û,6¦„ ]8ÚÚÚØ£]-¶ucÕâ1>«YÌf3³X,ü»NŸÂ+¯¼"(ià´>¨&&ý%\7 xTh£Ô<ª{(–HeŽˆÁâÓ5·gàø’%ðìï72ú,Od†2l|¼7#©¨¨€nÌü¡Ä?ë_¼„“•à €:+¿‚Ï+ðÈð"ò&3YYY0™L0]­Æ•ãæ.Ç•ÃïcDjÒýeÄ>¨ÓpÀ´y…ÀM‰ %É]2†ŸªŠÅÅÅaáüNŒŠ|;wîT¶È܈ ¢cÒõ=ù´¶”‹„Voý½å¥ë%¯ïC‰X„DÎ çí|c–.åcy-.µ´àªe!`ZÊŒšŒš½çâÂ(^ñ_´s“»ù)ö*_¯ôÛŸ<Ä¿sÏ<—uyyyüÎo®‚ûr%‘{ƈ‡ÄO†Ü¥ßtn¯'ˉ›'Í=^,¯ˆ’¯OèTæx¹ÓwþUTTTøMÞÛ´ù/üÀÇQRRÂÈíïžß’€Aë?&$+CÎbGÿ\ì¿èz ТsîììDqq± 7+))aÙÙÙ|ÅŠxñűhÑ"DDDà׿þµ×*„ÅI:þì‘Èþ~#‹Vóßm—ßx»ÎË>ñhÃÃ)œ2þM›ÿ‰¿qüs— wÑëõü¹{C±gà:¸^Îû¨ñ‡ï.Ƹ‡öP&ÔrçoÈÊÊJÇ¡C‡°lÙ2Q‰b2™CËò9˜˜+@m“’‘u:i,Œ5 åå墚`Â|'@ÿÖèë85ç­80ÒŽÑ)¡B‘ Îû²ïå n!¹û…Äl6³Ãª`Ÿš×äL@ƒóUø—LAØf¼øð¿ o€/ð殺R÷ŽTö71S ]L0ÆN O—\n–‹v\¨°â‰?NDÌJ ‚¾÷²þéóŠW<ÂÔixÞÁÃX›2ElG =+”à.Nð$/·æ?$r Œ^€4©Ò €K³$÷}K_¸öéY±d.Ÿe94îž>y 5’+a½¾<„rKƳ¼O€7Y›ÿUVRR —Ím'4Œÿ_tB'ó¹Ú™H ôÂj0xqq±"oF¯×ó¸¸8444ˆûØÙÙé³±¨ÞÂÞx[êèÚdw°×tY,÷þòŒÿɯ—¸T(»V«Å›ÇTh;®V«…ÙlfTôdˆãÚƒ„Æ¥Ò~Ü ¨ææfÑ‹¢³³===¸÷Þ{}‚?ý'µžE ++ :£FÌ~òäô™£¢Åxøù¥8¿hÅŽ¯ Ö©pµ¶j›V(ׇÒW¶R7„¦«)#‚ç:0ôðÅ«¹{EàZë8Që„èPå»ky,%‹],¬ý®Æõ¹PùÊ)}i v]ë@°V%.œüÆÈ5*Zç—þfÅ]+”‹‹3˜íž•å:A–•‘߀!-\3%ê !…(ñ/PNù±*ÑX&''#==€äâ«©©ñËdfµZ5®½×F¹´°ÝùÀÄ[ã@èÚ÷™(ŒŠ|/¾ø¢Ëy­ÍÇë[þ_{_Õuîý;Ã0Â0QÆ" ˆ¨£‘Øj4qšÜc јäštšÞ7fiÓ˜Ójê2~TibãÕ¾iõµéJS-ÑZ#¦I0•h¢ EEID#8#ûýãøö9sfÓôÞó[‹ÅÌ™söùÚ{?Ï~¾~õ¸É•§|VúBy¨Ô²P¾ë† Ÿ‹}ñä|;†ÿ¦'çÛñæÅ‰&ˆglä?ŸEÑ×çîJDî^ÌB”OßÛòàPÀú/«%«Vf¶ý2 9+:ƒ$©Ïnš| w…àÉ7ÿ){~k÷³?½8_šàÔêübËVU+€íkw茻 Þ*ÐzH4N Äßn¹"úpÇ=þ¤,€T¹ò«©©ÓéijÏ>‹={ö 22N§Rœ@o¥ò}u‚…Z?"PŠà­TaíŠI•ßoäÈ‘HOO—J½“bΜ9˜;w®j]YÕ‚a–¤{ÏËË“ù¥§§#33—/_Æ|²¨”ç¦ïv»555!22R²P€¿àôi)ÉÌ6:¥GÛ±·®^f=T«ÜTøGÑÿÇ+Û¸U|€ ;Ýh‡Ž ¦M¥ €,m—¶‘bp;-*¤„(ãü¥?ú {¢ð 6#MmÌäf§²Wj}„? °Ðge\0+‘`…½?ÉYZrÚKÄe)À* <³C½£µÝð1h.o2ë+#p{ÈËÞ]«iÓFWþÚÛ 5¡Ô5(üÿÒö •0µÉðÛzÁ®Þ.å÷vœ³«•ÙíFwǃ2M“rÃéX»Ýκ²¢ußð¯Þêj_M¸Ri¿ŒŒ ;vLµíe_ºUS‹¦+üËÆ‘¿ô¸`a³ÙX—)ßt—bxÕò·õž¨æ@0L…· ‡ƒMK6±.Ÿ ×>Ž©Æ9Ð6µßz J>ïÿ6ÑÓñóm!˜Šz´ÏÔÙ]ÖäÄwÁÿõÆuþ;‚|0‚Þ•8˜5>!'æ¡m³Ì·XDž »ÝÎFs±$· s6£§í—@÷¤¼g%yɳžÞW„HÊsú= pOªgÎG­·<‰Ùl6véÈaTïEddd—7r;›Êöï}M"2ñ‡üü|6}ê@äççw¹ïþ½¯1‡ÃÁ,ÜÚk™ZJÙÎ*·°x[ƒ@5Õ»C?ÜSL5…³±avñ³­€ãÛ×> õ@eŠ¥€-¥RÀqu¡8–““Ó­û]”–ÊvVV jÂþݪSØ=ÃʾME §ãë/ô„©Ò¹”Ÿy$ „¥é%`ú£ËOÈħݥùrIQZ*›jNf{ëêqô\Žžë@GÝ¿N ë t§xÖа$Ù¾Ím¥ÿ¼ Tf™#XZõWÂÿØ-}€´ê¯„y;wâ½æk¯¸;…Y+ÌfÄÇÇcLF†L!xrÅ ˆÕEé3/~t œÈÈHäçç3ª@ûÆÇÇcæÌ™A§Fö”–ûvƒ¿ÈÈHIè[,–f)‘‘‘ðÞÛÞ{ûÌío^¥¨»{Æ`öʈ~²*˜e[6›cô¬¦ãX@ÙÙë À’Ü46ÕÎ}a>¶Ýû,F CãããØ’Ü´n½Ä•yb9Ö§NAuñÞnUåãaN2°@‘Ï<öï}µ}ö:KN cÉIa¬¼ü,~óæF<íxÉIalÕòŒ*-¨èÇŽ]1 ò,&Lþ¹°jù ÕUïªå3Ø„É?z›t¢­3]ªyÕpYÍêUn¡ôh ö•ºƒæ¦ð.w«0X/’ºì­×¡`cnpò.ôD†$r³SÙ›©n’à(iz• ¡ónÕ),JKeG¼fHèœi÷ 3?<‹w«Naª)\•bšqÚßJï%¹i,!TÏ}a>~ä¬Äkïý ¡únXWX…öC®î@œxýºè³¶ÛíìÀª+ý3'ÿ&èG¥C©üçÌTTŸX*›|Òtô£Ò1rZ2¦Žè\eNKþÞºz|Y{Ç<èïˆ'Cñdb(tàˆ÷¥¥m à…Î-=€@¹Ê«©©ÁÇ«Vvyf³™m;-ÀÀ)ñûP<-QIÚF ôD^à¿×|ÍgÛÒÆ+Ò1#GŽŒÉÈ€ó›o`8u Tܦ©© Ÿüö·°Ûí,º¹GœNðJ@||<øÒÙ”¯þKûìÙ³O û'âããAkjjpêÔ© ró)<ß%|¯p ¼÷ö ŠÖ‡°tw6 Š)‹…yïí‡{ò†{òï½ýT«d6¯Ψ*Í?"Ïàê:ƒC1xÈxc¯úU8zUX’›Æ&dXaÖép|ûz\øÇ›p^5`·aB†ÁLbŸ¬|Œ-ÉMcO¾ùO^>?»û.´ˆêê0¿ðº;ð¸­æ$[½,Îïùi¥´¶ø žq<ŒTVëPdڬؼi©´ßüŸýmŸ½.µ“™™))—š†,Ü*LŸ:ÐÇÌ¿`áVÁn·³`¸èƒÅ´d{óÿ5H+|ó‚“Âú/›|„}—ÄÝ1Ÿ)±$7MK61Ý ¼þ‰À9ð¡í>ïþ“•É]ÞúN+©¾W(€`ÄIàŸoň“âµüò™#''‡-ÉMc999ª–bþ›0Ê€1úI)XæóeIà_ 7â3](ÖV©º ¨ Çúìì­×¡lW3¦%›‚vÁÐø:­&sçÎŨ¡aAB~~>;iŒO‡>ì!ĉ–„W£· ÃaÕµ}QÿÅ7¸taª%À[Q†-}B¶²/,,Dbê+°Z­Rùå]Ç· ÞŠ2dffÂÕ!63-%™Uœ9@,~tÌÓ'C1zˆG¼7°ÌuBØYY%쬬Žxo`ge•Œ@ý³¨¨Hp8ÌŸ£7@Ê>­†_~à~¤§§#??Ÿ‘àûøÒå€ÊˆŒ¨ÌsZ–Ä`HbCÃ’˜9ì"..JB°¿g `H’¥'¾×|MPÒ÷´caT¤ÌüÜÓ.íÏoo0›q¡¨}Ο‡ó‘ÔjäÈ‘ˆŒŒ”*’6˜Í£ Ç"N÷F‚}EQjkk±¢(Aª‹ˆï…râÕ |ODÈEÏæVè†o'.õ­Å{Õ‡nÀ{o?FüäœmŒ>ó5œ7 Gµ´´ úÐ üñ±×ñÇÇ^GSÙQŸ¶vÏÌö—¹eÛhA§¶ê:…qɧ8rò\çÃn·³´¸±˜={v·®Å£gÆ=3›ÍLßjIJÕMðº;¿è¼êCÌÍNeáßKǾ}N””– £bQ^~ï9`ß>'Ruz””–cß>'Ö”žQII V¯^-¬Z>CFõyáb,Ü*(•€¢¢"!//Ïg{O`mľÒÎŽCLjÊÚóûJÝ~•XÁ0b=›–lbKrÓ)n¥åçpþ¼Øé©pÊä˜lßu ü¾k7~ í'Á[/ÈVþ”³}³ Z%@¹Ù©,â?ŸÂ¡»ïÁ_<^a©ð”þ °aÿeddd`Û¶m>}€²[ÖVž.­8wϰ² 69…ëz;Æè}sá)Xiæ‡Wa4q)Ü(±Bve àÇWq¶ éî&Tœm jüòóóYff&rrrDaërÝ׌F#œN'¢££‰±W±kû ´ÝÙŒƒ¦`õêÕ>‚l×ñíBII ~´ô $ DRp«O,EjbS_‘ñ\ %%%R®~Å™3xŒŽÆ‹øýq.~höSX¶^d en7®”ÅSyQvœŸmÁ+#ú±Ý33²øþpää!—| @,¯7éà<ûj:Žá«sçPõÛŨ;ЄS°aÿe<š([HH çf§²gB øá¶zìΉAÉ /Ê;:dUƒ]ü¾KHÕ³ñá}àŽÐqáÌ:Þk¾&ðûøk‡hNêĦ¦&X­VYÇQ##!úC*ý«7é|Š©!7;•eÚ¬()-ÇûÛOô}ßæBœèðâÇØ81&ÿ\J«xwþOüò]Ûív6gÎI9p8,++ ………øñS#°ñǃbÕ³X,ŒR§üíO5Óm£ÅÕ˜™–lb¶ÑF‰Fµä£«2" Ûh£¬BÏUîr¹XZZ'%¡ÍfcV«QQQسg䎱ÙlÌ[Qޏ8±XÓÎ*·°$7½þ±XlbrŒ˜Ú¹·^‡É12†·óç=&#ZÍ“ €Ìþj™ú¦¶¯þˆ ¬zìÿâ žþy¬]»VuÒLÕ3J}½§£s³’±¿Âƒ £ XWX…Ït¡ÐÚ‚õÙiØ_!*-ïV¨„쬬”4ÓÊv´¶@?DTÞ/#ä´d³Y‡H㇎»n”BõlÔÐ0Õ6vϰ²Ðqi¸óá_ÁåÍþii"ðìÙ³ñÎ;jHþKŒ½*F®7݉„!CðåO¾{÷mÄŸWlǼyóp÷¥û°â°:­oÂðGØ£ÓSðQå$Ýäò˜õÄ2¢2ðçÒ6,zr¹¬l3ñœi÷ ä ØþržY|Nb„Ä¢^cà بï2šÛÛ1=ÞŽRºJæ?R¤£¢¢ ŠhÏ_ôwüßåoà|kÌaÑÜ6–þ×Pw9B²”æfàì–U&œeŽ`éá}ðô@GÕ ¸ð5¶^GµÇ‹DƒË›^ÍÆddàĶm¨¬¬DJJŠ”~åÊ„ß$†ú¦r®ÿá£G#£_?ÙœD+QÊ]?v옔 IÏ…”µç@>:: Òö””TVVJßÉõÑ›õ ‚ÁTS8#:hþÜ4ÏÜaóÛ· äó_¶~^zé%Ù=477 qÙÙìJùQdíð«üÝ3³ é&˜œôa¾T‚Šß‘ðDΜÁC†à«sç07!—Ÿƒþ늯 ò©+সOú+œù(CÄ}l×ã+دf.ïRãRš'ûêt,!TÏ”ALÁ˜1©²”2jÒf³I+Hå1¤5šÍf6-ÙÄŒ1ú }ÿ«–Ï‚÷r³SÙØG†³± g«–Ï`Ó’M,7;Uæÿ_µ|S®àív;[µ|#?]3}¦s¨®°ùt³¾ÓÙôG—1³ÙÌÞ~ûmæp8XìÈ¥,väR_Rޛ߉\ˆ"þùèÿ%9ѬhE¢d†æ yKŸò”ŸŸ/=‡ÃÁl6³X,Ìáp0—ËÅl6›jŒ™ÿé}Œ 3ÈxTß½Z¹Ô\*ðg±2›ÍÌb±°Ei©Ìb±0ñf³™MKIf»gX¥>D}—>S ™¾(-Õo€ßï©O&„êýÆ(Ç þöáAægÞ’SPPÀ ˜Ãá`ùùù¬   `ü=¯¾IÃÂÇ1»Ýή¬YÍú& c.—‹Ùív6uD¶zöº¿Óª—¿†WFô“ú]}T‘”j«DêË·s©Œ=p8Œüÿã8¿¿Ùlf0$±¸Èé †$Fßé?̨HY›d-iÈËXCæX¶/ÞÂ6Šb³ÌÒŸòô£³Å÷:lØ0;r)³Ùl¬oÒ06lØ0f³ÙØM–Bæp8Ø“+V0bÏTÆ;¯™ÞÈï£ÜÆÏßjd’®ßDïaª)Üï9û& cqÙÙ¬oÒ0ñO§cÑúŸëÖ‡HûÄegËß#‡æUÃ¥þÏo t}Æ=3'˜9ÉÀŽ ï¬:š›ÆV-Ÿ!ÆÑÜ>ŽÅEN—ât´ãâc…E×]Èú ¸îÂÔ­kñêŸ`×ã+ÑŸªaB†Uò£÷ÕéXTˆ7:Ðx£Cš ?Yù ÆŒÉkøÇŽ“ò:KKK…Åï»åÊßl63ªö79¦EÍmh©÷ •_œîò\$Ó>aVÆÌÊ@4§{*j1qb2mâµOœ˜!¹ EEE‚…[…¢¢"áôÉ­(**†ÎjŠIDATV-ŸÁ6lØ€øøx,X¸U¸p1Áw%OB=|›þè2¶ì•pð³uX³f 8 íöìS÷`úƒˆ¹”Mt™8oæ¦q Eü—mAÉGW%«À¾R·D©IA|-zzæ4hŸ~úiÙ%¾óÎ;ˆEyy96oÞŒÚÚZìÙ³Gú}l˜A2ÿï¬rKÁIÕÑtNÊEiù9,ÉMó«Ä¡õ€ö¯€ŽyM„.”€'Õ·ÿ4öN<Óÿü¶ök´´´àþ1ê}o²%;+«„n-~{§ì·ÚE©ÒÊÂ(ÑÒ1F‚•UÅð ¥'Ô¢Uì¥p±¤²šðû¥y5ô&i‡NÇ´¶€¹Ý²ñ3jh~¿4OõÈKý«¼¼‡sçÎŦM›2‰ªÆØÜÜ,dee!âšh¬®í‹ 8?ç¿0oÞpxPÉcdÍÍÍÂÚ¯nH%y‰å Íä]•%§gqàÀ™;‹ŽÕjE 2Rè˜cb˜Ãáþº *äYÿÈ$þñ¥Ë²ß”–Ä(ØO ð »(­üÉ×o4aéMZ ™Ã.byc“Ì—_íñ¢_HtÉ©ÀC ±±“RšLþŸûB‰Œ~ýà6 “&M™G© NxÐÖç)x† îÈÉü¯ô/ÇÆÆÊüÿôLgΜé7†ð­M¨(P ô4sŒÜO®ëí¸§C|v ¡z™ÒqM4í_=Ï \”[.kÖ¬põ<Ãù]å°ô÷¥£§àm>ж‘bðʈ~LèÝRïšO{„æÓáâ¡VáðßN KrÓØ†ý—±nõu,. ƒ9Tìóq†8XïÔ¡¾J,‡­D“ü’ë±{ê%lôEaî$ຠè#šõÐ0uÇÇ£’¾CØïìˆ/e‹5ä£Btˆ Ñáé‡ST÷ bW ö¥½¯Í:DúÜRïU”U‚Ü«–Ï`žŠZI¸—”–Kfóß¼¹QæÓWsìßû+((Rü,Ü*ÄÇÇKæ† PPP ·\Ý!À{ÓÊAFÆDl~ûdeeaË–-:¹£Î}ÝŽ¶‰„47£Cß.w«PòÑUÐï™ô• )jˆÅæÍ›ÑÒÒ‚ÚÚZ”——cÞ¼y˜2e *++±gÏÌž=[rŒ 3°¸8xáO¦~àR¡§í»N¡´ü\g? @@¼ŸÐÁ€ÎØ©¾åxUð÷8߸†Ì«—ABš ŒÆá„ê±ä[ž–’Ì–¹N?½—ÂXŸ†1 Iûí¯ð๱áà?m6›Ù¥p£,Z{@k ZDIfûгm¸~Ì—Qn¿³Ïÿø!âø¹n„`2ÉÆÏó?~(àøáÌ”)Sðì³ÏbÝ:‘» ¦¦%%%~%‰‹%R ŒüëŽJÜõûÏöµ³Âm(ûæ‹.Û œ®ú;jΛ••0¶¤®®Nøs“8!ò‚Ÿ”R¾Ò€Ö¿D0¼küøñ(.. n@$f¡ñäïzÊËËQ[[ ‹ÅÂâããQâñ ** YYY³\0™dò—±ªálÇÍžÓ2öAs˜(¼[ZZ$ÓØ•©ö;íK€³Ìì½ækB?U'$áÒãEu{;FBqÜÓŽûZ®JÖ:×GpÄé„gØ0T{Ë08áÜ}Ï\<ý_æî>@t¨î}||¼4'DFFÂh4"22Rô´êÇ–-[ÀÇhðdÚï®Ù¿'tBõì3](þÜt gÚ½‚ëz;H±_ÞØ$ZWW'D\s˵ֆs‡¿D^^Ö¬YƒEÏÍ –”6‡]ߥŠ‹Ìþô,øó§£ñýÑFø‹ C³™½þq-Òû}£ôâ qˆî“”€ÿÖé –5’›Ê¬:¿ï.Î^ÉJ¼8xƒá¯7 ðêŸ`z–<ݧh5Xq¶M&üùþ•àóIÀ<Ú|ZŒ7¼úV£¬³cô,å{I8ü7ßô þÞ3mVÿz'\×Û1jhNtx‘R/@7(Db "á­Ìã/((`6lð¹NÞ·N°ÛíìÕ_=(ÆpõýI 8û¤ï‹Ïïl@…€bH׺{Æ`¶þË&É*ÀûŽ•šhÉ_LŠWss³`³ÙXmm­lÝ™üyÿ¾Í:`4a¹rÙS‡IJ‚ê ÐÇ0xëå1׫De€È[üTFü{\4{ø¼:C!ï/ÌÍNebZ(°lŒ>G¼70F‚ £ àéŒ)øWüù$ù~É—ØŽèQ 8?{ëuxñþXé÷`ÇsBìlÝI=µX,Òñá‘㑦àê`¸oBÿ Û¡kÈËËøÏŽáðH©¢²ºÍÍÍBB¨žµˆ `6›Ytt4rrr$ËÕ”)S ôý«Å PüÕîOIIẢc¨O£ái%lYWbÇ ¤¨õeIܺËÒŠ±®®NLôœÑßÜÓ.ÅÓ,ŒŠd/üÇ%ߥNjonÜ@µÇ‹ãžv|í½»Q´4}j싺º:ÌùÜ}žaÃ`¸i!ùè`‚DD›˜ Ú磃 ¨=æ[õUY¿žŸ»IøoÚ´Éo<„Zz#ÿþý=/%zRùŽoŸ/KMÛyVLµc™[Ö‚IÎdÉÜn&“×ÓÛ €o ô ¡S0n‡.ˆæ—¡Úz7à|“h=–e¼¿ý„°ø}—›Ê¾ó²@Âÿøî"¹™¶S„QeB†6«H߸ø}—lô2>G²«œQžì§¥Þ+477 ¼ÿŸÜæ$ƒß«û aÁ­‚nPÒú„âüyRêTÞ\œê… 7;•-X¸UP+â“——'¨ujŠ–ç· .&ˆ_H˜C\Ù/Z<Nç>™Àw:÷aÙ’ß`Ù’ß`úC9’ðç]2®ëíè¸pDw ¡Œ€Š³m2ªU¥ ¹¹YˆÅ¶mÛ$>mꤕ••˜={¶¬Ó’ `g•[ÆnH«XÚ·¥¥‡ÛE{øAéXÕ4@š(_ݲP|Ø×]ØQX„éYv/¼úçý½4éýàå¿tk#MòÊ•+’‰ÉßäaŒÑ32õó£zÏ)+3ºÊ˜–lb†Q±»?ƒõ!¨ŒaˆøªnÀ0*™6ë-¥Hˆ<ë³íôI±J®îS•BT¦?”ƒ:±hñ|ddLÄ¢Åó±hñ|ìøÐ)*vüu‘ÔÑÓú„B7(e¦H¤»›ð£â°X,Ìu½Ϋ&¤õ õQ”(--Ün·±JÛ•$2ÀÍÉQ‘^66ÌÀö;ËQZ~€|°î¬r 2Ó¿”ò§Ì÷÷Ö 2V¾ Kçf§2&¤I4ÔV]U$ ¹, ûÃå+øÃå+Ò6%èùûÔ|ÐM(õ R<€¿önuüDEEÁårIæþ={ö`Íš5x饗ºU§®®N¸zú”põô)Áýn œ¨NÇÊ•+¥ï%%%8]õ÷ ŽU£è¥kêêØ?•›‘òFÜn7L&Ñý@4µd yûí·}V Ô¶Ó锢Îp)\\Q9N;v EEEA? zÜæ°‹²à6Iȇ%1Kÿk8ÛÖ)üIH.t †ÃmáSc_$ôX[}ï6»±´ñŠ$ü§BŒÚ…¿™m}žBqq1j«·‹+þö¯ÄÔÜ›±FµçJ%eþó uô¹¦¦ééé“hw|ñf³™ñþsÀW ·b 1Lã”®‡>S\o ¿°–k’€çÿ3·d€kL¼q,Ô÷ùÿ¼RØÕ=PÉ„Ð)8|ƒaÒ™øÜåEGƒ.Zb¨ý. /X$LÏž‡?Mÿ#òÔ©ÁŒ¾nìw–ÃyÕ$å¶¢3Ø‚(d>ЇÕj•(4Õ‘šð§ï §9F‰+_OE-v¹[…”z×ë¤>qbFÀãÕŸŸ/+ûk·ÛÙþ½¯ÉK÷.æ¼ÓÿÖCÂŽÒJÑâù¢¥€„¿.øŒ‹ÅÂÊL‘è¸péî&I DÅ-­¢à¼jÂTS8SšŸÉ'+{V´mõêÕ2ìwÜÍ›7Ëî5.Îà“«Î·Eyÿ²"@¼ÿß_¾?)í_­0!M–ó¿ø}—°mÛ6á׿þµßãxÁ¯B´M¹&æ3í^b,x_œ,€‹‹xŸÓ½õ:Yû@ÏÆEÛ—”” 33›6m(}ÓåraΜ9~åïOÁìïÞý!7;•eeeÉ|°«W¯"û}j|û4Q¿¡çG+0B€² &Mš$­ˆ&Mš„ñãÇK Zª* dòý“Àç³x% >Yù+»Ñ}› e瘖lbΫ&dôucâÓY²zþžÅû[^•~ã­b3Þ ó&!iø ¿ÜÔ26:þ;_ßÏyÃ/5"­O(>Ó…J¾ úOG»´]y^T´Zâ/SRR`µZ%ZS³Ï> 2ÿ&³Y»ñ‰ož@m&zÚg€Í:ö_¯ƒ>M8|< ¯ @ @¶Äœœ–‘‘µkת>«çŸ¿øÅ/‚êjßß>uuu´d«8ÛæC©Íƒ„?ƒžŒZX,–Ñ×çîJÄšK¢Y™(Q·<8°þËjŸ÷›KýÑh›L&¸Ýî. )‹S¦L‘VÛÔöÈ‘#ñ÷5"1õY,€¿sÓùù¸Ú?ÝÝ$[…9V\\ŒI“&IYYYˆŠŠ’ñÂ"5l||<ÆïS€×ÁÞs°èNÄÕWÌwÍÍÍ‚+q0K«þJŠ ¥Ürå2ø"@~Ñw:Cë |¼¯ÀWÎM7¡ä©§š¤ÅÝ;=þyêþÐÛuø8TâÐ ø²¶´ˆY;Q!¢ROãŸVÿá:‚€KáFÉBÐfŒð¹þ©)¤ÁŒAºv*5J/¢‹°ëøvÙñ=~ˆÁL^F£s&ô—¾+ƒ™ø6(@Š_Ñv Ès^5ù0eµmîáý-/bß>'Þx«€zg¼ß~'æÜ=|¢’®rݺup8>Çfdd`Μ9’àaÞ$Ÿ@ÂÞÀ´d£8%%­E¯¿@ä0Š;üï~÷;F˜L&444È„)ÐÍ×Ê÷G ê€|ñ éG¥" ~åS !h6›Ùýö;Á„4Ì…‹¾ö9œ~€Ï?ÿ¼W)BùÁ›Ñ× ¥"`4~©Q6‰ôtü('Œ-ÅÌϪ^_ É$1˜ *ºM›6Kó}iÓ¦M(,,Dyy¹Ot6) ÊþéO Pá þ¼tœ²ÿòŠkÐôÜø×Rw·Ð ¥’_–9‚½5mæí܉ãžvÔÝÑ÷µ\•8º„AßÕojÔµJ«­ÚÊ蜲²²PPP *„óòÄX>­´7Þ‘Zß§v•Y(jý‚ú èO‰à¡¶æÛç·z/ô—bsK€øßoËÃãìÅÓCœÓá³J¹•öºZý·ªÀ†ý—}~§y¿ýNð•×ÎCÍoÎ_{·V·~uÈ k«X5…@¹¿rð¦k‚Úû»m¶KpVµ{ ô^nçä®ÊZ[¤¥òÚ[ã'˜¶‚i¯'‚Oyß¿êT;Yß* }ªáL¬^ÁÖ× Aƒ 4|  4¿@©~Á2:ñd ·‹¸Aƒ 4hÐÐ3ti’§¸µ:Âþ V“¿§ªAƒ 4hè=tY€>ßj-aMРAƒ þ¬É_ƒ 4hÐðï‡^_™ó¬ljô³½}> 4hРAC÷qÛ¨5%@ƒ 4hø_-ýOƒ 4hønáÿ¡ùΩ|ø©IEND®B`‚angband-3.5.1/lib/xtra/graf/8x8.png0000644000175000017500000046774512456456606016267 0ustar chriscchrisc‰PNG  IHDR˜oö—¥ IDATxœì½yt×™/ú«#œ»nH'¶“yƒq{tÎÂît?›Á8±Óvƒ$Äd·š°‰û9KÂÀ‹Ó4ÀM¯nc#éä¶™%AÌu’nÂ䛸%ˆ3H²8yH$6mçݶÑÙï]ß®½«vU ìú­uVíªïœ¯êÔ°÷¯¾iyá\ôöô!/?×±$YCc½ønüHðØôÏcïŸ&*Ûåmñ#qL*P–$¯]:%¥kÄöI»µFZ{|l Tl=ÂK”e<Þ‹‚‚<Ǻ}{¤º,äúÿk´øuµË´ßid!°¦ÕÊ6£f9?fÃëüðK'ÄýÙ¸n/ vé !7BÑOôùM§àù|†"ƒÐ‘Bá:Œn®Ç]Uyh7îB:Õ€ðBþ<{žu7dgg{ÊwuíÆöçVaÎ}+\õ÷$ÚadDµûÊÎÎF×ÎÍÈšp#Âá°V¿´O·ã§}Î*š©•Ó>ëwùgÖñÓ9t;þT*Úã1búûû‘™™)¶Éë‘HDô“y=;;ñx’\Zøÿ^Ç÷×?ï,¹»^èŬoå)ë;¶Ö¡¤t :v<†Æu{Eÿk­?ŒºåßCÃêï¢s÷Q<óne}íÚµ€îÃG”ÿU8y`ìuc]м¸¸ˆ¿vîÜ©ÈgÏž hlhrœ3;¼Æ§ñY™‡ÃH¥RÊR©&Mš¤œwøû>ž?_+ο|Þu|“ïÿxœËWNÿ~ü~& ££ýýýŠNº¾ýýý˜5k–çøX:§ñx\ÑI×7ãøñãŠ~º¾núíã«]?]_Òß_ϯïCß ÑØé6>wXêòûúï•ãØƒÈš:EY=þ:rÆOIJ¶&Ÿñ}=><øFNyHYNÆäèd¼ðû}´¤ý~7~@úI-i?Ÿ›^ƒRæ>í0˜'¿h΋u¿/:vüŠßFø}VyIq^~®xèd¬Ùw€µ½`RÖì‹£`’ž\vìx̼é­ïÓö¦ŽÝ¨5Ò®Iwó…+–à7M<^Š–k{¸b bUæöêvÏÿßÐX£f9o7Õ;H&‘Kú5­FcÍrÔBÿàˆTúmû$#®ÓnO§NúüÖG7×ãdõ2´Wß…2ö# ç¤ f—–ˆåÎùܹsð笮v™ƒ¤‘¼©© 555Z’6Ü ²d'Q'1D–:;»ÇŸJ¥YÚ¹s§ãøe²¡[êúKe)‘ ݒȤےȤےȤÛríÚµè>|Dœ#‚¼­³³Kœ#‚¼mçÎâtÛtðŸˆÒy—If8¤RÆ~yÀ@zÀÙËãÛéÓ§ò'öýÀX×÷¿ìGfæµ®××u|4¯ãûâ((Èt\߃Šë™™É ,éÿÎ’{Ñù¼÷øZ·|‡¸ž™\nêoXý]Ì©_‹ó$Q^ã3ÀÉ¥‰úµ†\fMŽÝw|Ÿ˜ã$—#§<„É'cï»1cQpBoÖÔ)Ø»±3UY<À…Xw?¦.}“¡w䔇Äv ÆõÜï Ø;ÑǦ“ ZK%m§%ufñ#q°Þ(XoÐ>7¯îæ“ßH*ZbZyEK ±ª 4²ëÛ—Ûö¡ ÙRÆb´´Ëšê-©-#+.)bé˜ÎªÅÒ ÖÐTÏX:Ád«é¤í£›+.)b0,²œôÈòQ`lt3ÿŒc@"oDˆ1@|Rä²n~T€•±\ñAyíÒÚϧ eìGʇ ×aQ~.åç"®C(\‡¯føÊaæJL/&f}+O,‰lÊ ëX»tëÕâ™w‹eSS“°ºavi ¶?· ÄRÆÜ¹sÑ“à/•l ¡•wíÜ 8ö›W=÷u!@–J™tÈëº~TY7-•2é×ÉR)“JyúY™TÊëd©”I¥¼~9ÂÏên'ùÃç‘™™éø¼Æ7€[, @½®di¤íÀ ÆGÛKÃÊé_ÛI]×þþ~ ¼É=týÆ×‚‚q]ãñ8ðá×y8É%-¹”-Ž~㻎\ÊÇ‹ª´úg,ªÂÞ-¾ü`êÒgµú§.}ÖÝRf¸ZwÉzéÅ/Ö1ÃÕºë¶ýJ‚¯SÙ 8-–2,ó¼»%“nöq7JÍËPRÊåt¼,˜ñx/膖ª™[¿$¸Ý,8Üß:x}'ÙRÆ~Rõo¸£å@KTý«EÚ8Á««]&Hf]Í2£¡©žÕÕ,3N.C äçgöš"¤S],æîw–N0##*ÌÆu{ù¶PÔh­ˆ°Š¥30¦5‚GÎ4àìE]Ç´VDPÙ–d õZ²V\\„ÎÎ.6Š1ÍÖv£U]S €ÑÀY5+­yNH qÝ^å?®«]ÆP”µj„rmœdž¯Å2ÙRÆd¡²-9¨††¦z&߯„ÎήAýž¥ŒÜò©«]¦ý=oe›jžl7î…`–±)ÛÔÒ‹“ÕÜÊ>º¹'7NV/S\äSÞ®ñ …9÷­ðt‘çG˹Í^ ¸Èý,˜d%õ­<ìz¡×!ß¶m8®…]^<óntîþ!½åR†Ýýë8&›ûWÆp[0×®];¬ÌÉ}pØÏѹÂ>>Ù!»ÉÕb©ƒ×ø¨K;,÷5´–LßñQ¸¯¡µd’¥r× ½øÇ¿ã×àÞ›;ðýõ–~¯ñ•,•»ˆ†Ç6Šg,BÝòÅ(((ÊdúÏD ÜH&‘I²XÒ’ÜØ~ã» “€º4ÝØÇÊïq%±€»”øŽ\Ò’àF2éœyñ ùéÎ]‘cë•_‚éƒI.,À=sïŸ,¹ü0ÑCDƒ/ë壑—@Çþ›¦šåžo5’Y[^ÒÍ(¿ñØ·ëiK¢‘…<ßÂÈýíE"u.rB¤ºÅ%E8²ï :4j«Û ]]í2!~$Î;bLvŇ"œðÍ^CuBÒ¾3¢(..BIéÑ‘Û]ùœáDãÚßt¸¸Ö?…0Þ1…vÈäWƒYW£‹•A¤R&—纯uá ƒ·ŽÐ(d’Áh­ˆ°Hu»L<=Ï×Zz,í»ªòÐ^Í ç]Uyh_l}÷®ª<åû—d]¬ÿzbAVÆ¢ÙN+$aeܱõŸ@!°;wt`Ö·ò°sG‡xé’c<·mÛ†Ú¥3PW» làCPb<·mÛ†â™w£¦†»¿¼\ä¹²‹Ü7Ë¥ÎÂ¥]w±\Òº›å’ÖÝ,—´îf¹¤u‚ÎE®;Gû¹Ò¹È¿ñéÌ™3—4óøñãèù³¥_&›#é5>–Î)Åß·ôËd3#33SÄÖ¼É_®2Æ­Âw–˜ûü]†çøÚ¹û [‹Í?2òÌá«î "ÌðŸ»àN  ^r[ËK"›¥mMðß×;Ü×2Ù”-¢²^Ú?P,¢’^ÚÏ4£ ¥Ìp%àD¾Ýø‘o/+‹ƒékBdL÷ D6àm†îLBMúˆ¯%­&Í;Õ¦ÔÙ`®I¶†S^K+£öø±WÆfh0*ÛÀÀ`˜Ñuh\·×"º Æ)UÍY1Y5p Ë£`0xŒiˆ‘³ RÐ7ƒa„¢Âš –E“¬w1 }Œ¬˜í•¦e­ ƒÑ¸n¯£g²_…’[²¥Œ€Î‚ÙZAe,©µPÒÿ'«²Î‚Y\\„ÎŽ.­…’þYkŭÆzÄãâX òX<ÞË«-ÉìÖMÙrI Ë$µEŒ%L‹§Ñ'~Ë-ôý‡®á‚LþˆXÊÖÅüh™è_ˆXÊç©höA ˆX¹!=¤—öEKÒc'š´OÒCîp"š´OJòùÎ’{1ÇÃJ×±ã1îVº†ÕßÕ’¦OB &á;Kî|ýó®çà}»Û9pN®÷+%Ó-Ó~=uLùzÚ-˜á¹K\ãJôÙ±•‡É¸¯µKæL×8}1˜A æ1$¹.S¶Xìodô]þñ‡*{{ÿ45wM?©W²KJ× ój´†›B“W¹B,/#œ¬6Œk+"lïûãtq+¢D^LW¼ Rv×ï)ƨjÆxÛ"—$ç®~+®Ôž=o„¢ Ñr¸†c0ÚÑgI“\ }.ñ–ëö:È%-‰¤É„RgÁ´“KZRˆ€L(u/SvrIK3i…ÉDI÷‚"“^Zä¡à$Ó¹ÁíH§ È"…'š <S}ƒÊ2¿ÐK:b)ÃN,íp#š7¢Ip#š7ÒDp#M7Òäƒ9kÖ,î–ÌÒ9¥|}ˆ1˜‡ÿßfÏÌŽÏ:s¸Îѹb(1˜d±”AäÓk|T‹¥"Ç‹%í‹“L~}›ËnòŸ©ž,,–´/N2ùõýÂÉzþ|-î½xþå¥JÀ÷×?Tl½çøúáÁ§xöø  sïF¥J@Ýòï]ñ1˜ø?ž1˜÷ÿÀ“T´ütP1˜ºs$Ç`ºñ‹.‚ Ó„WŒÊš}g”72¾î|c3òÀOø @É“ 0iYä—u &ƒÑÙÙÅŠ‹‹ˆ´(2n9TÆ’„\êj–Å%EÌ-®ð ƒ'÷4håµH1·ÒLF(jP¬©6n1`vr xÇ`ÚÉÙ¹ºÁíîïsuƒÛÝßç/*“J»•5Ù\ Ý$‘z –@¶w©1šÞ¹2 ÃM,í°Íþß©r;ÑìÜý†"·M#cdƒÄ`b¨1˜?øåÅbÉ×­ëë7>>±ïŠÅ’¯Ë×÷ 23¯EƸUÀËüÞ§ÄY¿ÛøJú1ò~ïSâOƒÄ`ž/|câì±3v¼óÎ;žò¿Ÿù÷žuÜœu×Ôu º?xÕ©nLÈ™À½ÜoŽþæ‚ìCÖc_?Pg=/õв}kø&q^‹‹‹”ë H–PðÉžÔ„jÒGDü¨.¡¸éØÓUoð¸5·M{ì•}å¢í¦I4j¯ìC^üüï—‡ ø;ÜSñ³€Þó^”t{Õ*«“®¡}¡“~ïvý©Îàü¤Z÷hK$©T Çõ£pò$%+àÄŠH‰×ý3>+³gÏVê<Ü:´sçN?ÖRfàžj7¶ç¬™›ŸÀœûVxÞYаŽ˜uv@‘ï‘YG_‘1R?eÄïz¡W{üºûW>~ʈïÜýCåømÀBÛ¼‰àñí^÷ÿø¬L7ŽãÚUþ^0žÇñcý(»:´½µ €÷ó3>+my›´òòÞ…"„`¨1˜ã³2¸Ç`?ÖÜ|½â:EþRìmàˆûó{æÌ|¦â,¨¬ÈŸi<Œã“\ë¨ηìÕïrbºéÐÛ|Ãí¦À<öÖrþ†èÖ?|.?žêæ÷ï«ü¼Þç盎K†ºßùêñ÷Ø’úòùÊñwu«Š ¹K}öß[®uzy£çJç}S´u1òÀõ¢E/oôÀÖú‘ðÂ\½ãFÀÈù oùçÿÓ[èþtÃñcý¨»hxöVàSp}n ¯5å îþŸ£áYþ¯:ÄgΜÁ±žwqcîZœh«Â£S‹ñ\ÖxµïQ•MÇ®ÎÝWtpæ,˜ç¿7p¿7èó%˜~uê.üêÀ/ìdòB‘K‚\n ß$¶¥6õáW€p.&äLpÄ&–ËgRÇnÔ -b3 ÓJƒ3ÿ=ï˜äÿÕÑ £x"¡Æ­lN`T5ê¼€ÊÞ£Š¼5/­¹m¨ì+wZvk›98‰ØO´í|I& »>¿:ö7ð-«,·¶y]ÿììlÌOö`K$_È»Ú÷y=@$Œ/ùËÂb#ƒçØëÆzÞ?Ù9ÙÂb£ÈMÂÙ_¿÷Œ`ØsVí‡gn~»^èäÒíþ#r¹k„:BÏ:ú :wÿPK~ü|`•]Ùêñ;ï_ùøi`•]Ù a`¡…ÇUö¿iáZ`Ó6Œbs<ïÿãpm Б(Vä%-8^uåcÚß<¥ÈËÆBùØ…(¼ú¯¸??ÙÙY€o§^WäO†'¢-o¦›ŠÂÉ“´…Öeîúü“K]¡õ;w rùRìmEþõŠëðÞr¼Ÿß¯eÔNÆ3‡¹ØæmX=obI8¤®úõD, D,elÉ€ãþß2‚ ’Ù“êsÜÿ=©>A2»ºŽû¿«;¢Â¨Öó oëÿ]†C.{#²³ßpÈíÞˆû—Ëñxvõ ¼ëÀ¹kµòWûå}™ü ì»ÞòÏ›oLþý ^û÷\_s8¡~ϯñ‰¶*Œ)oÁs¸÷û ð÷q])v‚éWÇͯ[€Ác8-™v<šJcëB3®˜`†¸^ÌŸŠ½ŽøÕù@L-·Cƒ»Q³i˜¬·^ú=0£;€•I4®+13à÷&”àDe£«-ÿp#š„•Š6õV™K»e‚,›RHçM2çÎk%Î $-’ž{V3ìÐW`]7Ìêý#¶”ñ˜³¬©yòDŒ%ƒ;ð¾1Ùûþ™˜ó%Œœr·ˆ ¬do^݇ñUà§ê NäÒØÞ‰k*ž÷ßÕM3õ*9"rz´ßù§EæVËjCÇäIýýKÙjCÇ_<ón46ìÁö)G±ëÃ[𹓿|0úlŸrs6që’ßýÿî”?£óýR\ûO ~/»ïNù3 |Vì³?V^N<Ô‹ç÷üàÝ÷¹µ¾—»øwå}I´»nL ô¯'+KD4½bäõÞ—!Í[¶ªDöóÔ}Úí1é÷û‰²þ\Ö8y%ݤs`Ñ@ÆÆÍ˜¿ü&5)P’&oŸ)t“ÎmU€1å-ªµÿ-ÇeoÁê)Ã/þçb`(ÇÐ[pn´á´d’‹ôÑTF^Bd%òÌ;k`…$[Ä’–‹2ͳÈkk–¡ !eÚ29ËÔ² ubLk'–ò >¦U >¼£åÀ ÍŠš¸D?k±¶çAçªia%pX&LËÅS>u Ï~uÝ@.ò{V3dŒ[åÈJu»þr‘Ïêý#ç2³R³¦Nß±ˆ„,,¹Øô÷åb#bF9å!älùà§o ò”ñÌ*ìz¡÷vv` äyÞ“£“±\äý¿âe[YŠ]#2”i÷ä,iÚÖù|Êóþ•-˜r–´e• cÎÁlÿ “Ø9s@ªüîÿ/ü,Þy7€»•m2òN²÷óÍ‹ƒßósgl1Pø_Éÿ¢Cnw‘Ûá÷üùÍÚcw‘Ûá÷üÚ]ä^ÏÂÝD•òó]¤q‘‹gáì€L~HýY6óò¯áK—þÔÛ-—dÙ”Ï*‘K™dÊ rIK;ˆ\Ê$pŸ&øõ3ƒŸ&h'›]`De²yËÖ^EïKû×"c#ëX´emk<ëßWU¬è]{ Ó$–&ÑœnÌ?¨¸Èqÿ”có«C<¦¼Eq‘×õ}2f«ÒL>ç¿:n~uØ.(æR‚Ža°ÇÒ[Ð7h#Åyº­_l ß$È…^Ó9Æã½Hµ”q9¸Ûk†Pbðìñx¡(ÿØûàKÈ/lG(ôt—!Tã/Nðåí•}Êg(˜—z=©>\S‘Ö´Má¡‚ÂðëJÖ /ô$ÚEÌ`¾'Ï€C$Ó^ Õ ; &È¥^×à1—‚\Úàçfó›T7@Ѷ£Ç_Ç›÷OÞ³† —Æv«H¬ßýw8q¶/á.B“\†­uìOŽ!µÇ“þ÷¯Cj'% <°x˜]îëÀþŠlÈšö&ÆeïÇüÀ›oLÖUVü%àÿüL~(Ž‘…O +ÿ‹ø°{%Žõ¼‹ò^ÕÚ}øˆò±ÃïùÛ¹s§ò±ã¥ØÛÊÇ¿ç÷™ÆÃÊG‡Rf`K0rÊWÁæ;Üκç[Æüdºº¸º:‚ôÚFì‘…·_'¬•¸%óvkÕ¯x¨0$¬•·d’5ób`Ö·òÄG·M7³š¼­xæÝâCÐm.¼´­Òþú4+åëÓ5ësPaÂ]UyX{ÀêKÖèÄ£S­P¹ €“˾ ×c±êëñèÔbeŸ\öÌ ‘äø×©»ÐÕs%mƒOJNË¥Œžî2ä# #/µá0ˆi¡OÇz·È–#;ÜbØî"TÖP'Ò á"Œ?ýu@:Ù€”ºÄ…†Fîúp#^¬Å,aSå1ˆk0/õ ®©ÈÇ{sW#ö›œŽõÀ@·`úÄXþu ½àWçñ\ðæÓ0+1nö,7[f£ßõÿ°{%FŽFžÀ®¼/i-a|GÁ-t²å’àwÿ½ßœÄájn¡“-—v¸Å`¼î_®1˜°}ÊQ…X<°ÛŸY¥¸È½îÿw§üY%–™…wû%\äÇö0 [VíÀ‰¦œøã÷ü~ª“±ÇzžÀ‰¦.ñ‡¦ÕÍ9ø?MMÜ^HîíØ¾È,AµQOÂýžß×j~ ¸¾ékÊöRf`䔯âƒÑ·`ÿÉ_àÃïÀ@'îÁð¼Ÿï"pbyuuïÍmÄ7vàýæ$BHbÖÙ]„ÌáÄňÁ$¸Y. n–K‚ÝMp7¸ìÿÅÆ<Åe>ï:Â7ŒoQ\â"Fd1åœâúš£Ür nÉ~î8v¯:Ä÷û žËºc@ûSc²¯T|jb0/‡xÎá>†‹ƒÙötOÅË0Ï\'w Uf‰‡‰()]ƒI°JðÌ(€–\zádZ\›`&m„&ádúb&ɉTà=÷¶ŸEï\‰%ÀŸ¤Ñd:fBÉ5ùhŠY‘Ün1V4Àœ+±´Ã¯Îã`±ßuØthJ]fÀ´_;l˜§º`¾¹NîdQ@0K„\‹ï¯^¸˜Ýîr1Syf‰L“™3~"Žùã':¬N€ÿý79:‡‡ñÍ(´är8±ý¹7r¹ç,ψ߽`%¶o~¥ó¼ïàz…\î‘Á“–rn;ú *Æóí+7ýw<™B÷ýžŸÂòÏàÖ ÿîò7bIð{þ܈%ÁXüž_;± *ì1Iå´ {À 瞃ïø>ßó“=ü|›¤rª™0vuu»š¥ØßÛÍå!¾¸P1˜ÓºxBÏžåü¾§%¾Ëcm›Â¹<É'Ì¿¿Ö\ažIžÍ“|òøç´Ä× ¨0ŠÀE‰Á´Ç\ÚáV˜@nl;x¢OU<ή~sïz^u„y–ºIöÈd&àÔõíµ’|hqÙ[0?Í1˜çŠá²dÞÑò¸&Þ‹x¼§c=Zr±÷O±W£‰Êoãñ^TÄ’ˆIëöÄ 7ãèP')nné °u{Qb¾˜ŒE°*÷ ­y9žÿa¸b0kF¬"6'a©|oB )UÐ-Æê|‰¥v¢9˜ç'oáTŒ<þ:Ž|ÇA.ý®ÿ±Å¸:q‡‡ñ~sRK=¾=Âòá,jívÿ~ü~& ¤LåØÓ~ú6öKë”øãwÿÝ[ŒÃ‰Ã˜ºþ,±Öí‰?Ãå"Ÿs_6¶?·JL÷Ç^èÅ¿˜ñžsîËÆÃ ¼ïÿS9£¸Ñ™w#½û‡¨3ã=‰Ÿ9ºËÆr“ ¿ççɰóšÈ¸Rc0ïÁ°ÿo¯Í“¬öäe÷>} tú>ß³ÎàÀ’IHgó$+"•ïe—"©;¤î÷BÅ`œHn±•éš/UÝÊ7I¦ Š xI"·2EÀðÇ`R¶¸¼ê<[Ü ó½ßI|å㳜ñÆ*x¤×šxöøk}<ó~õ[~uˆŸËºCñZ”Öe‡ËªÆ’˜Rð"Ê[+"LW”йFªÛE­2•mI´–G°÷ýñb@‘-´ÔÞ¶mz’…0Bm®¥S}¸Úpw‰·WG©n?'‹Ôpï3#чdp6½lp|'‘\Œ¡Åƒª3éÕz¡7Õçyç…s¯ü類¿èÕ§EQcÝL_Ê8­´€žÓ:#ŠëfÒøÜô5ÍĦCocáí×aÓ¡·=Ÿ¯úï¡Mc™*oI ­*Še»Þ„Ov]S;=ö|>OŸ>-Ÿìº¦vIñllÙ< óìמ¿¼ü\Ïg-;;]·"+çiÇ 2¯cØbU.wi^~®ç³J¨¬«B®ú×”MÃcíîÇïõ¬gggãÙÅ·âæJ÷ã×Ι[ÿAçlVÑL­œÎÕÙ´ƒÎ™_ÿæªßæÍ™ã9°Ž\ð$—€õ|íoÔ[¾Úª¢(oI`Ò$˲#ÏbŸjÐ?Ÿ4Õ" N·Hmª£·e•ÞÚá÷|wµïp+Žõ¼‹¬ü”ƒ¤}[Z>©ùŸ~ýÃã¿èBÀóÿeàÞ”Sÿê)ÖrùA§~¿þåÙIÝnÅË•ãæV§þ— ´aóærlÞ\Ž,Ÿ&uófn»ö럋f7£kg5ºvVøsÛsÃ^‡töˆAÊfÏ)q̆ÆzAÊšê$³©©I²¦µM’IäÒNüØœb”nïD†–ø±¦Õh¬YŽ“\Ú‰_zm#Ö=Z‹NùªØö ªYP¨Î5V}à÷QÍ‚úë«¥R{ÅÅÕ. {¹äyª‰ʤp¸åñx¯ç\§•mª+—@û\Õv ‰‘Ït#¿é$”l_˜n–"™†Nf8ä(¸_,“åN¹ ©M}èIòŽ„¥Ëò•©—ñ¢iíz_c5i/xíÕü­—OU¨â—sú‘࿘n˜hd2X!ò£eÈ7ËîÐv?ôHuÚ¨tÆ£©4XÊi• àDOª,qþè3Øówôøëžsû=‡‡=çvš6AL¿ç«¼EŸµNL¹€»Î‚é÷|ÊÜuLdNãÂÌiÚ¢Í~Ï7>·R,õ¼‹TJõÝdXËoà ¿þáæÐ€X>ÿ_†C¿a¿‘9MM~ýKÁ?ŠåË•;ôÛ±e·^ÖR†_ÿÔÕ¾]·Ž}Ð!ÿ6¸õÒR†_ÿöø/z„;øØÇÎR=«§pë%`-eøõÏNêÆ³‹ùñ¿Üê<þ¥Üz XKºþUÆÌëEFG7 àèÇ8ÉÁ21羘sß 1M*Y5ýúgn½üÍ^`’ËÍÒö^øðà;˜öÓ·1ÍV‹—ˆæéX*bITØkñšDóýæ$¦®?‚©öZ¼g5ÿ „ ˜­ymŒ>ºé#b `ŒÏí|t+ÀÊX.+c¹Zù(06º™ìr#5d¹‘¡ºÄŒPÔ÷¯“Ëû×Ê]Ö)€Myð W,–Ê’,/d ‘cKå,?Òmî³ á…Î:‡·™V¦« à‰ðÍyY3ï #Õí(‹ßèkÁ /Ìëá -e<¾ûL³ý>M„DYüF nÎqEK 7lÏÅËfåZö$ÚÅ[q"¹ùÑ2ñ¶ ÿ9{XK êÅçkkç:Ê0ÉuÚ Æ Ö’vU£÷”§Ÿd¬ ‡”sf_÷%È©”ÉeÖÔ)¾Ï%È©”ÉåÈ) K%eI–M¿ç‹,•”%¹ÍÉR)Ïá-M¿ç“,•òÞ2Ñ$×øüûµL¿ç»¨„g“få<¢²é ¹Æ«˜Þ‚é×?P¬\ÖU!<~K¾C?¹Æk߯µ`úõ/÷oàÇsåÓ¸ÿH¡¯sþ ý¦;¾ßé–÷럊ʦ˜õ6i)áI¯˜çìÍï׿=~K>^Nsë-e,?0󏙿øýúÇûñ1åÿâŸÝ¼ý?y›–2tý«Œ;·æáG»ÿˆåöçV «åæÍå˜sß aÍüûç®›…Õ²kg5Šf/Y3àãƒí‹VaöèñùË=·¹_ÿþþcÙx­æ×X5áû⓳«Ÿ•Í)v¸°e°¦Õ¶ŒôÚF‡ Û¡Ã܇۾hnû¢}xíëÞNn}ý—}ÜöEûpÛíþ¯™›Ÿ@Æ3«”`‘Ìšô P?°H欣¯ý¿R?øäÌ'_Th7Ù\†t²¡ü$Ë/T ¦½ö<ˆåGº­:‡äoﹸ-œ+æð AC~û.kNˆß‹Nß|{f…Ü”Nî&J6 }î3c¸Þg ’Ä>M=äî¡`ÚçËkew <ÏËÏÅ@4yfx ¹]ò#\½1ÛA³Ëœë,3^¨ì1€|Ÿ™|Ôz#®ýÂ+8Ñrkªúj‘¾¢¤/>)1˜öÚ”öL·ç“b0íµ)e’)'ø2%¬[¹>Ï÷L•ü\Xþ©”¬sr‚‘)Ù:ç×?FEIR"•²uNNð!2Ťã÷ê_€{pÿëøÉý+¬sg«œÙâ+Ÿ·þ‰Îñ£<”€’¡èœ½b&ÉÐy‘-¾òypëß^þÏò=öñ %CÑ9cý»•ó"[|åóàÖ?Òyx¹•‡P2³=ÿ“?‘Ìã Ô%Y)Ýú×íæ5qî:ú_xbO8Æ@I!ÂažÄBnñ9 8³'‹&Á¯&·8·\Bi˘õ­Þ×ÝdÖñúÐÔE¡_mOó¾nÆÕ\~ÚÔE³&ØÀIù ^Xï{þ›+# RÕn$[ʘ\h—ÈÙ']÷p1óÍ"×XHk@£RAÎG…nàáìøU¸uä·ŽXÀ¥#%¸u„ÏF@·ˆí0º‘H.oËT„š:¹£È÷©Óæ‡Ö|†ÊoÄ’÷_*‰Ê7ÐÔB c€b[}5\Ùçª[\ž¦Ò G¿€g ¦×óq8q“×Ìiµ]žYä²S†ƒéEî´`j ¦×ó©³`NÂé$–*üžo±”¡#–2üú±”á$–*üú±´ÃÔk'š¿þÉhè¼Ø‰&Á¯£ób'šâøÌã·MŸþÑhÈn'šâø<úWÀr‡Û‰&À³ÅÏ¢_Ä^ž5ú±ys¹°fúõÏ<¡çg"ö’·«…5“& h'‚^ý;`M2@PGw/X x¸É›B“7ù®œ›7¹±Töá™X*0g°ö½·±ßu"“&|0ÌÛ <•DÛÓ)3oäŒrê«{q`à ùIHôùÔ[x’-eŒKû2\±±ª 1ØÙ—¯‡¦s‡Ó@Vû(ŸÉÀmà9cÞ|nGV˼áÒñç?¨¦äƒ.c£VNÉÇ*\nb3øòûúé o6Kuú2E”¥8¢r±k:¹TÑPËìÌK½‚ï7àŸ6x¿7„š–¿Âö N7•¿D~äæAé¹Ò1ÔóWþ² “öeÖÔ)˜øáŽçB~>><¸_Iûr䔇°hÚõJI"y ·ä|ÙóùÊž0^IûZ’!%ч@D3‰x>ŸÙÙÙZw8‘Ëþ7ŸwØXÎ{Œ?gnÏ·‘oÎfíB,[¿À-lnÄò ›¥ÎŽ¢±ü<ºËfð24nÄò›¥¦%Ë¥™8§Þ”ë‰åó¦Ó3¹hî úýRÿ„vèo&G=Ò_§ä¨/º8)¨{ë«ãµrJŽZ“ó–þøÌãÿFÆ!ýñ™ýãÄ÷]¬jfrÔÕ1ýñ_÷w|ùÎ;úŸSÿúëdiåwÍü/À½[¿ Àé§,r·2EÔ?»•)¢,rcÚ®5H_ŠYYä:ÈYä:<Óxy=j˜ˆ.‹\†=‹¼£SVÔžE^øÆ›®ñ†”E®•×,GNÖ8טËУµØy¬Ÿ'ô|ϲ`À´Ÿ¾=g D` <é’,˜PK¢ !ädã =¯žL˜ºþvȸâË]Ñ @€Áaâü/°û–O¬¼a7@Ͼ.aO‚_RY6U‚vÕI´g`Sœéçå~,Pœéçå~,Pœž¨Ã¸p»ºƒMsý'ªT«Ë˜–ž¼W°×ÿ¬È‰ŸÅµ-À“wÀ÷\þÜwygÝ+[acǯžÖáÆk°õwo9ÈaÊo7aÞY8È¡¢·;ÖAþSã`ëïÞÂüØ®•où·9˜wÓ¬¿NTÀرøbû›Zù»eã°õwo ûùnýO?«w?xÿÛ˜wXÈôÏÀ&£; oêc÷êÆ ôBÿp^_ãí·0»´ÄF“™™‰;:—Ÿ‹¹sç:Âhh¾ììl.·…Ñp¹l• %­ËX™ä3fÍ8Iþ±Ó(*ŒÌ\Þ˜öÀJcÿ3O°ãûÀ‰\^D̰ÞòíÖ€JƬ¶YW…Dal»µ…0ç>ÞYoî lî Ì9¨Î¯=Ú4“žL'q2ĘVÕljLü,N6ÙëÆòõù+¸µb˪¹êz_æ~"e(ë'Eÿ®7õyu|š¸ÿ|“Ç9ÿŸ2ezçÓ½•€kòZ•uÂû=‹WçoTÖ åûxœ`ÛôÊ:በüw+/RÖ Oñº=%MQÖ {–óÿIÙ´bÝ,6MÉg”MKëTlzWÞ—@dÓŠuð…,Ýf!ÖÍû‰¬ßôAëD›Éú}¬ç]uÝÜÿWçñ@Èw¶~UY§ó½Á³‡_c7)넉Ù|ǯ¿QÖ 4 Å2Ò:•a§Yp(–‘Ö7™rš‡bi½Î´ª¾4ßÔ¿å:eýAóü´‡Lýé\eô·æpëYåѨ²NUè>þ×1€«>¡¬|?ÿ9{à/vþFY§ µßŒ?—W¯yCYx2Ëó/sëâ½7w¨ëàëM?áÖËš;–)ëµàë{ùýZ°iòòsµI>F3Ï$ÏÎÎÖ&ù\ÛÂ3ÉwuíöLòÉËÏÕ'ùÀ1VÚ$Ÿx’é·'™Üc&™~{’ Õ9%ýö$“Ygýö8Ï)f’é·ÇyVô–+úíqžSã\ÔãwKb!ýŽ$)ÆM›ÄB1nëø]’|Äñ;’|Ôãw&ù„.êù±'ùü£™äCúíI>f’é·'ù4˜I>¤ßžäs¯™äCúíI>µf’é·'ù›I>#é–äC}™[õonò ‹Ü3@€O8ŒÏ|AtR^L?øu–nóTÏ_á^¦àD2Ô—)xI¢c=ú2Ex¶¸K™"€ÉÍú2E'’‡ZôeŠŠUy@ÏçâdJ=r†hQa¬{œzüR†èüžµì¥ß«ÎiQaÔµL‹ÐÿÛMŠÜ©_"Ø©ÿK{ü.elHóÑÌOÿpÿO}Ž?æ­ÿµ§/ñù‰ñÔßÓÑå©¿k‹ú|:ôwªYÝý5jýK‡þGÔxK{¶=kÜ{Vø¹ÊèÌ>ExüñÇ/ÉñÓã홨o+k‹|ÈkÃçìs׫U¶Ä›Á?nŽ)ëe¶³ðÖS‡”õûmx¯ÐÀ¿°½_É‘@ ?Ð? ú™÷‹t¯¦|йÈý0Üú/w3@€ÃНo¹NdÎ*ÛÌl×HÒÊœ%”%s‘4Ýæ“:B"s–ð@Çd)á$sÕØ…8†cŠ|ÕØ…Xñ·Úµ³%8ÕBÓΖ ÌXx6ý0º Uÿ³é‡qè_ÅzÖuª…ïØÛ¶ÒAl±ºn¨3§ìÛê×'•õR¦Žƒ; Õ¢6/¥f.o «ÓÖÍOö(ë["ùêñÜ­®Â6[ß+ÓUý7íSõ÷Þ¡^Ÿ¼Ÿ¨þ”qS•õƒoPÖoIߢ¬ÿ"ô e½©ònC•ûÂ7ÄñÙ^X(|ƒ`·¶ß~ûmÊú¡C/*ë“l.â#6‹^aa¡²ÞÝÝ­¬{Yÿ™¸¼,¤Ó±n:¤>o¨CýSñ³ª¼P}£zª[}»þ/7+ë¯ýVëòs«÷ßW©÷ßTAf)ëPO ž>ôæ¨÷gÞQõþ|%[=?7½qå×ü$@¹«ò Ctz£ûR￵"rAö¯Ó3(ÝÞñpƒ†NÏ t×]˜ýkõ F÷¥Ý?K'.Èþuz£ûooû› ²žóÕÝÛÓ'>:¤R)ñ‘Aärû¢UÊç¥ØÛøú–ë¹d- åÓ^Ù‡HÒ"—¯ÕüZù<Óx“:B ¹œ±z:f¬æ®óc8†Uc*ä²2Y‰Ê$/ñs ´³% ¹œÒñmLéàD°Û8ŒgÓ°ÈågÒ·ã3éÛ•m¹üÜÙ*|îl•² °ÈåYc ÎS”m€E.ïÁDi™p¹¬AZ”ö‘ '‘ËYgø´s°N“\Þ6—äm€E.5¥±¨)­l,rY^ùÊ+ßS¶¹Ìf™Èf™Ê6À"—Q"j2 ™p¹œÄ&a›¤l“Q8y’6QƒîÉââ"‘¨!ß§tOΞ=[$jÈ÷)‘ËêEw zÑÊ6À"—±–kyPÙXä²véè]ú°² Èå÷ j>Ê„“È%KY5eÂ)Èå«§EÍG™p¹Ì?9ã'*Û‹\ä¡  OÙXärrt2&G'+Û‹\þv1Ão3e`‘Ë—ž5ðÒ³†² °Èå¯ÚÓøU{ZÙÀ"—_6?ò6Xä2#“äm€E.²®Â@ÖUʶ— Á¬Áùg11€ÕÂ9Al-Òƒ7ɹÔû/0é%Ò)°ÊXÒ±ÿÊXÒH§¼÷ï6§ë¹ Œå2Ä4nŒ2–ë¹ÿQ¨÷ £ÀРqK4£|òèZór¼ÄƒBk^›ëþ¹lxÁÒ f„¢Žý¡¨áG2ï¾Ûnf:w44Õ³Ÿ¾ø3ÇþúâÏŒ†¦ú!ý;©´¯ÛI¥}0gã ÌÙÈ×Û­rȪ( sŽqÖâ ®oú®oú൚_+²«§cïò}Ø»|Ÿãw'—­‘V´FZµò)߯Á’'q°äI­œˆ¥½MÄÒÖ&±´· ÷H1€÷Œp^&¹oÔõ“D,ímÂmsõmK{›@ÄÒÞ&±´· Q‰1Dæ*biodb©#™r°.XÎÖe±´· D,ímK{[à{.mr1qmaq¹˜¸¦°8K{›@ÄÒÞ&±´· D,ímK{›@ÄÒÞø²KÛK{›@ÄÒÞpi¡¯õaC#BŒñÄ3Ææf d3<’ À“ä¹Uì§ý§SÞûO§ü÷ïGòth­ˆ°t âãfL§ÀBa÷ý‡ÂCÛ?*ÀÊX®ø¸Y#ËX.k7ú\÷ßnôy’L{]@ ulÝÌ'‰zkàèfÆNiËdsœ‚aŒnö+Ö ßk^›ø¸í¿5¯Uö–»î¿²·|H$“¥ÌþqûžŽ\C2uøÛÛþ†54Õ‹›5²¡©žÕÕ,sÝ]Ͳ!“Ì ²^DSY/¢)ƒ¬—Ñ´C¶bê [1u­˜`èÁ¬EÚ0xi:à …Ð\¼H¦¡OBû…½÷ïEî¡°7ÉÕ¡2–4BaˆÎBéG.åýŸ3ÉŒÁh7úÄGg¡ô#—/’i/åb¡Á8Ã8Ymœ@:-„£ÀØÉjwrI8YmøZ2uû¯ì-ÝþýÈ%a($ÓE ûÇþ?r)ë:W’ùÓfÔÕ,…Ò\†B2íñlöu{<›[69 Z1u­˜:ÈVL{—ïÄRgÅl´ b©³b,yRKó£Ð!m›ðÁˆm›0‚Ô¶ r™{ÉJ™{ÉJ™{Éxq›¾MØXÒ¶ m­×jÛ„7Œ~m›‚êö;GŒ#Ú6fa±· 4 ‹½M YXìmBóÆŸhÛ„Šª§µmBãºÕ¶¾ëÒ6!}ÚqðÆkômG¿®mâñ^m›p8qXÛ&üåCÛ&|ý~¦mþª,¤m üÁ¥mb _ß&dûXÛpi¡Ü)iÝË~Êït¿¹Ôûo­ˆhÝÛ~Êï´¿©€Þ½í‡¡üNû›:÷²†ò;Ýo.íþKíÊït¿ùÛÛþFëÞöÃP~'~3Ìs‘ïêÚ­Oò©àI>yù¹ú$ŸVžä“­Oò©åI>»ºv;â0÷.߇,daÅ[›—ŸëˆÃl´b¢(3Ö#;;Û‡y°äI²É¸?ô¯¢Î[’8?.I>t~Ü’|H¿[’éwKò!ýnI>¢NŸK’éwKò!ýnI>¤ß-ɇô»%ù~·$ŸÁÖtKò!ýnI>¤ß-ɇô¸%ùˆãwIò‘窖AI>ò\Õ2(ÉGž«Z%ù~·$Òï–äCúÝ’|H¿[’éwKò!ýnI>âúº$ùˆëë’äCúÝ’|®ô:’W:‚“ À§`Ö<ÉÊ 'ý[ø3e“þIêHä¤ÕXµ8e“þv¶D‘S9é§„e{!å@ ?Ð?|ú‚yIœü>Íð!˜ç Ÿ:tà“‰AÅ`à–N°â’"I).)âÉ0^Æ€™0£/+t¡Ê @€.!Î=ùbðz£ûRס<×äŸsÑã™=oËŒ§¬yZ§ìyùûr¢P:–l)ëÉ–2EîÈ<7³ÒiÕÊç ŒqZ·²·ëD$‰hÚ×p+™L4•õ:)3»Ž9×ùÿ‘¯_kEDù¿Ît-†ë @€ ­„Ìàuøé¿¤ÁK‡Ÿþ!•:^2¹”[¡x*“¤“©´“M©Ô‘®Ì‘J;Ù”åD,íòâ’"ÖÐT/ˆaCS½ÓªéIÌsù­Ûwχ0œËoݾ{>Ìsù­î»3°`^3@€ 7†ƒ9”ßé~3Tâ0”ßé~3ÔÌ¡üÎSÄ`1˜—Á  @€\n²È¯p3@€ 3Ù@e[R[¿Ž¬lµFZ+'+Ø)ÃÐ׿#+Z‚úx®¤S`F^FFÔõž7š“‹õ÷|#B¬i>C»Ë3QÖš‹öPßž‰†¦zV»t†c{㺽¨«]†dsò Ûòžî2DªÚ ,ÚîIGO*õÜÿǼïOÓþÎS>€›<å7ŒÏô”ÿ²ßu~ÓAa|–·þã·7xÊÏ÷ü¼·uÇ­ÿR_ß Ðw€—/FÖ ©Øz°–JJ×°ÎÎ.€™sw§Í©˜BQÔ $КĈh²t‚iåSo°j`W]» IDATôV FD³Œå²MŒrFUl £*ÊÎ…hÚ]ÚvȽå†#/ÖEky•mIf?§F3¿ç[+ôò¤Ñ„ZËóµò²Ö\´Wö¹ê÷CíÒZòËÒ VW» ù…íEà§Síâ~)ß·W«»m:'®Olب•¯\¼ÐñÔA­¼ä¡)€²q£´òö7OZór´òÊÞ£€'õòo§øœË…“'iå4guqq‘VNsVÏž=[+sVoš£•cávæË…£7ðSü…ÊñZùŸZ26nÖÊñéøNV/Óëo®Œ)wÎ}'Úªxc“Ë;ÄB~ÜÌ…ÃÍ|ù^•^~­¹Û-›oÑÊç/àÓ=²t‰^¨ðê÷iå7f?§¬o½ÍjÏ{Ñùýž°5Ýb~ÊI » ¬9¸‹âyy‹t«4§ìEi:ÇÛÂýÒtŽ4•c€Ÿf(”¦bë®Xâö] … š°j«SÒÁ¨Š‚µ¸ÿÞUo:Á×íŵ¿áÒ{JÀb02¢Œn w—Óyl­ˆ°ò“0Â@Œ"I­h‰õFÑö´SÎ3ÌëÁªSX ª¼Œµ$°Ð(ãsKòâr=.0BQ£µ" òÐ 8HàÉjÃSnFkE¾«¼Ýèóüý`Ž¥L¾Öæ:À`„Âü2›ë ˆL줓È$ÁN:‰L줓È$ÁN:‰L줓È$ÁN:‰L줓È$ÁN:™4á &™°‘N"“;é$2I°“N"“;é$2)ôÛH§ “&¤s¡í–²‘N{¿m'×ÚÔÙI'‘I‚t™úm¤ÓN&í¤sëmû™µ^ÁÆ#fXç´'Ül²äK¬[ë]½ÀÓg-9ËÀúÉb½ÅâiëšÜbx‘õ‹õS}è€E* {BèÎO[ú»8Ȭ µoøyµ¿>Pf¸b‰7ÉL',rù4^<ˆ›PÈÒ@Oïf[ärýgx¿µä£¢ ˆÀ.ý© àSÇT‘žLÀÓ‚ x[0 É‚IÓÁh»éEÂB£ F•‡k"å·cë"[ï*OÅÖ#VUá)o\§w7’~¯ý/4ʰÐ(s•i€Btˆ…Sˆ…S.Ro+Å ¦ZÊð“ªsÆÙR¬`¥Dâl¿¿&¯€IìVDO4'«—ÁhF¡`uÊÙµHM!\ÕŽ;Zþ,¤Î¡ƒÑ^Ù‡²VÓÂPÇïO÷V0IŒMÿ`PKñx/ òÐZqü~¸å~0BQCG. ¡0 /r À•€ú ‹hêDZMº>¶ˆ¦w2‹hêð nDS‡%EÑ àÓŽ+ÆE>¦5"Þ°G‡"`é„â"îOÚÏ€*'bׄšäø=뢧›'DĪz¿OÅÖ#ç1<±ª ­|…¥qÝ^‡œõFa„–ŒPT{üÝïeb©“ËIJÉöÿÎù„Ðâr¶d¦S`¬7 “D:c=Y.[ , ´‡ú´zÝ,—7Ë%ÁÍrIp³\Ü,—7Ë%ÁÍrIp³\\-—Ë%ÁÍrIp³\Ü,—B¿‹å’àj¹$¸X. ~Æ7Ë%ÁÍr)ô»X. vËe€®l\ö.r;¹<…e…z¡0~ ¹Çb’L*¹$y†%—ÉeÛÓ‡\&—•±¤ÑZa–[ ¹Œ‰£`RJJ×(ú¹4よÒñ¾¶v.‹DPÈå#gr™\žî­Ä5y­É Eqy[/ ÆÉj°ÑÍõU]S €Ñ ˆP-Òb5Uí@KÀÓ"J1í賎³@”ß7öV²kòZÑš—ƒÊÞ:Eÿ`á ±äE•ëNa~× tJ%™e,—ý¨¥W<›eé<ÉtKô!¸%úÜ}n‰>·D‚[¢Á-чà–èCpKôpKô1á–èCpKô!¸%úý.‰>·D·Dn‰>·D‚[¢Ðï’èCpKô±cÙ·bº!‚’H»Ê‹®®Ýc#ÿÃ8Ž;™ûµz¯àAÌøõŸIbÉGî^¦>Mp÷™È‘jÕÍfBQ³LQµQ¾Ù쳌PÔ¬2Efg+äíFŸÑލ(SäæÆÓˆ\㙽¨]:ë¾€ø‘btìxLèaéûÚ’ïEüHÜ!o\§Ê™M¾÷'{ÎKའ¦œ'ÉXò?ñß¿7a/Û{$–Ž1E.ôC¿ÿ¦½¨Í›Æ&Ÿãƒßñ»èòÕØ{äÇèHáò2 „†·Üб|i08ÝàíFŸQÆòL’`/‰X.Ë¥.Ë¥±àI,xKžÄ€'±Ël0ŠKŠXÁ¤‡ ~$ŽÎÎ.ï:zÕíBNå\hIòââ"tìx 2Á«]:%¥k¥°D”fv‰Ç{µ%z.wy€+Õ‹«XæøLÔÕ.s½¶,`ô2v®H§Àø‹ Ú–1º™±“Õ†«~íþ}b=/û:ƒ²~"Bß’õ÷îÿ%ß6í­þ]ÿ 0«äÿÔëÇ6s9W«ÿ÷)îåøJØ*£èïá)³ògiõ¯)›x¬}¿V{5a,k¶<@²þgß ¸ÃϵúuIP²þ 9¼èåoŽþF«ÂSþK.ëßþÜ*ÀœûVhõ÷$x?Ÿµ<6²þ®ÜŠ[4Û"ܲþ-&Áœ/Å`*úÍ2BùR !E¿YFH.!$ë_´ùYÀÆ÷kõ/NrOцˆ•ž.ë_ÜÁ‰ô†ËZ+ëßl©HïÊñ'_æÇ¹Y«¿³£P\’¯Õ?Üçáí×6z[«ÿ¡î}*nyYÿC…܃øT·õ" ë_}ÝÀò·çkõ?ó¾øŒþùjgüù*3¤ç+¨CzI*˜T€ºÚe¨«YfÈ"TG/†!ˆ†+– á–ÆP-ÉÍ^0©FFu5Ë #5h9XýƒÍøBnìQŒ)§]^–Îõ”3Oy:é-oÍmó”74ÖŸsG€ËÕ‹«ÄŒ5uµËP]]`´Ým6¢ÁÎRDS~Ê„R&šò”ž2hû`ö?»ÔÛ}9wîÜó’·~‚\Ž8`µe¹¼*vV´e¹¹û ¢­Â$—lÕ–@äòÖ‰¶¢ß$—™»D[‘Ë£Ç_mD.ãñ^Ñ–Aäòpâ°hËÉ¥.œ€Èegg—h+r“\îܹS´e¹I½zF´e¹Ù»ÿ¢-ƒÈͱ·~/Ú2ˆ\î9kˆ¶¢ß$—M‰¶¢ß$—»Fd(õ* ‚\øŒhË rùÝ–h+r“\–ÈmD.~«­¿I.YmD.þ(Ú2蜟5VxžžçŸ7iÏ?‘ËŒ£o‹¶ "—¬;)ÚŠÜ$—ìp¯hË ryô¢-ƒÈeâÕfÑ–Aä2‘8$Ú.=Bu5Ë ;áihªgd‰¡ìSY.êè1N(urrßž¯þÁü #5¾É6ae4±„c&!#5ÂKPÑÃÏ[Ï:\„²¼"–t̺"ËËL:\²Ý¢²¯ÜUþÞ„O+W€+ ÍÍ-¨®®Ò.¹„”Jr.–L™LÒí2éY2e—x Ò¨±ÅbÊ.ñYg0Ë‹)»ÄMý˜ªÆbÊ.ñïU¥*5Sv‰ï˜:LUc1e—8ËtÆbÊ.q#ßpÄbÊ.qö¹/9b1åó?‚­Âv3gJwþÁâè1O‡îüìt™9otþe—ø@ÎuXh| K¦ì7 #xÈl“%Sv‰“ó,¹iÉ”]â9_ŠÕæL–LÙ%½±Ï|ÄK%Sv‰G£·£Ý °d^wFk^Ã'9"0€! 0¨ä‹0º™±¯FoN.6òdK‹Ç;l.C¤ºÝ!ÆÆ„Q€Bý “K¥”‘I2ËÒ¹ rIVÌöÊ>A2äyÖ>3–†að™Oˆ\’©íéÒÉ$B°ÖÜ6¹$+æéÞJ´æñóØÐX"—dÅŒ‰$óS‚ŵ"s|&ÍP]]…Æu{ѼÿœôÈ/9ö$¹”—ÑÌ?£ª#’Iä’ÊÕ Äd’©‹Û’]mº¸-ÙÕ¦‹Û’]m¤¿âÍUÏ!6îM­~£8YØ –ŸÔêÿÚ‡i¼R؉_üߊþ»‡ì¨»*æA ŒŸÉ…Èá¹$ÁŒE¬Ð 9öZ™ÖYà3ì¸uR¬7*æÁÖfСÙbìh\·W”G ðéB󆣮f™¡[žKuÙ‚nä%Dò`¹¼©ÜŒÝ‚Iò³Œ‹lÁ”“3äÉää ùpR('gÈ€“BËš•9÷ñŒÏÿ\1¡tÈš¥k”ù˜Éú‰Ÿ…1ñ³€×Ã!¡ß gwxžR|\ç-õ¨wÉÞ!0õ‡þoO¹.ÎMFe›wùªòó˜1íB ±¡ÉS~çŒoxʧO›.Ú:r¹Ã‡\ÖR¦²†\.5|†—a®{:߇zLXÈÊÿ¢§\ç)ÃyÿÿìoyìoýU.C-¡¢Çû…¯y×Ý-7{Êeø„ĸ(•½åFk6ȃ3I0X(Êj f™# ædµaüs3c0¯ùÉÅj’M¤ªÝH¶”±¶§¹‹Ç^~è ccÕ|ª@{’Žè·T€],MíFÊX.£©ÅÒLôጬ;´¤ÿ ó¾íéÊL‚–äʯì-Gk^£ç´¤sXW³ MõŒ °Ó2Hô 0Xðð‘(“-éº8ÌÑÍü²»Çó6ïsÙr9ç>}Ö)ÉêÿÇN­õàÌììlW¢W4{vuíÆöçVaÖ·Þ°’ ô×.•SÚ©ŸÍü³%ÝÒXÖK7RIÖK7RIÖKWRIÖKR)¬—.¤’¬—n¤’¬—n¤RLòàB*ÉzéF*‡»N(½¸‘Jz!q#•ôB"“JvøB™TêàF*…õÒ…T’õÒT’õÒT’õÒT’õÒT’õÒT’õÒ•TšÖK7RIÖK7RIÖK7RIÖK7RIÖK7RIÖK7RIÖK7RIÖË€T^~Îe†dKóªÿéÇ HemÎ1–U®Ó àœkuR¬!…ú ä)Ž:‰W¿kYíi ȱbºnÉù²hÓ@eZ#mökЦʘle‘¶ÖX®ç{Fð¿"[¼"Ò-([p 9YãD{ÖYÔ'[¼þ÷"«H:Ë,çûïoÛæÞ%šHço„z¬ÐÈù ë #;ùòÃb±iÍž˜h3>¼É®Û¾1¯T´ÃàÇ—‚u|rÁ Ï™ò$ù#[­"æYàDê>Û&ͳ2v'™çåˆT°<[r$M6õ†•Æ}jYž&³\9/´mÞ |[:ƒr^h[Æ5|ed§r^hÛŽ­Ö½¸ë~ýg}˺þ¥ó¾)ÚÔ÷ÈñîÀõ¢Õ¹û‡€â™w‹mFÆHÑž]Z‚þþ~×ûîܹˆ‰»ÞÿsçÎE<Wë„u|ŠqÁnþF„Ø5ûœSýÒÃÞßZ¥óøÕÙ{Ÿ]Õ:_}¿Ç>6žÇ0¾(ï™®cw[´=6þ@„ÉFÃÈÈ‘L†‘1׸P.de{{kì*z÷Nù¹‡`’K*¦Ëµfr@…8$HŽóB·ªK© UÍ­Ûn1H¾%ò599ƒKPÅ=Óê?ÒK W噆ÜÝ–ÁgFÏáÝ+ðœ|'†Å³èE]Ú±¦çD2iN{^y¹§¡áAðyU±z5Ù¹ÃT/] e¹3‹âX-2Ï.%““HNûû"×/¤Þg±Rœdrr q¶2$™D.!ÑÞÎ'çtnŠL—;³šX‚β’z÷o}Ì Ž4¿@¨Äòï¥Û¾M®š; ‹é ¢°«¢‹óÕsô¹™2YUúŠ'î¨sUˆÑ½8Ý#°f_µçtÀšQ‰¾âˆ9ÈsSÆê¦‰%uîã“ßþö·+»p¸Vv1ì)Òe r»+•ˆdzSÖ¨&"ÛÿÚÎD»&’qø™d‘ˆdÚbágSìD$ãБ’½9†Àˆ\Ö¿©bè2¿x—"™ßW$S“ËJPÀ¼ðßõ’ ¹|:p×ß°Ï ™D$ãö¹Æã°Üß×+B“àø¿ô£wïÔv"—K »ð3wûºŽ8$Ø>’Èk±R‹4 LZ¸õ[dûH»*Ò^œ$0éœÑÂèór§KÍê+¸WFÄääLDåàJæË•c:8„TH{ŸßµOX5w@Ÿ{ÇßÿH¹$›œQŸ‘œÉEÊ]¥ïç D´oÊ4Ç´oƒH&í¸zãŠÁü—ù½ïŠÁ¬Ë¼9c0™zéŠÁ)1˜"%ó “‡\1˜?H‹Ádê¥+“«—®Ì̱p߃‰”ÌïËäL®^.$“«—®L®^ºb0ϦÄ`ʵx§ “ÛêsÆ “ ”Íõþ †‚Iø™ƒ¸ùƒi1˜¡z¹Ìm[úž®LþýwÅ`òï¿+ÓÃãõŒ•¹t€“Ë×"H]%²æ€¾ÿööVÔ‰‘Ì]®ñ†ÂF”ƒk´»œáÍo~3©^’ÜåµQ3óÍ®j«¹výLGÜå¼jk’zè´Šb’B`»í ¤œÅ)Ò¤VÛá,²Þ/WÃtµÇ•£Z8Ùµ ¤M„]8Û¼ @Mﯚ;€—~ö?êãcã­ª86žÇF(Byl<ž Üãö>ÿ´œp©7üœ+“+:®L®èœ=ú•ˆ+šòlTÝ䊦<­¯ÈM—zÉÏÝñjÔn(šõ’+šûê%W42ÁMg &S4ß*¢1˜\Ñt©—óQ4]ê%?çR/ù9—6ÇÍÿujLÇ^f~ñ.}þÜ÷ï…€"àºÄV!,h.grª— ?Æ^ÞÀÖ ÖêeƒIÄ’+š§þ*‹ëVSSø„ˆ%W4‰TÐ[þýç1˜´å߃I[¯hzx(DW¥çh€|’›üõ€˜ìnÃíjØ¥iw%µLNÎHRÞ\}PY£¤6Òà"‘|¬iv‰äã°íœ\’€´ã7ãÆKŠð02ª4–*GôËl×µ“˜ 岫˜IEf>ûß’†Â”˜JºÞRÖµ{AíïTG©ªy¶Ÿ>>¥F‹Xûén!Dwüõ†gÀQWö³¿ÿØt]‡ô1˜>Ó…Fb00©‡TL:VÓI=¤bÒ1•ENI=¤bêcu½ƒiM;Ó&šv &'š>ÓÃcù 9†ˆ‹ü£?ºÄ?÷ÐÃùk`’‹œƒ'ûÄ)p”ìC.ržìÃã-]–Ç[:‰Y°Ú0ÿÒDç®K|þ(V’ â0{A æ! 9Åaž§á¿&á³È}yÉ"Bn—+ºí“fØ€]®H´~MíèLr³\Ñrg‘ïÞ½;ѾØï¿Ï"÷ðx`hdP&­TŸF¬}hdPŠ’¶óYI¨\ÈÊZ)¯_åB6rýbÚo´ÿŶ942()EÖ§œíÉú”Œ›çB±3öºF®ç}ëyšhîésXÊ9öððððððxÁ&o6©OC– YÉ·Üî"|Ô'+´µÛçäÒE2“Ú'{FFÖ§!% ëÓÃÈDÚ‹#¶ó™Ã4‚Gï±û bÉÇïz_Üõ‘>ƒ¹¶Ýö|~]÷OçÒH® DL]sH÷µ?–I¤ÝÃÃÃÃÃãB ƒd^¶È¼lÑ'}\PdFB‘²Óñ02š°ñ+t—<²PÄ=D)Žbol7l¦ âåÊ1ˆ6åvµ]ɶ›£Pì4\¹Ü…írUSLßr·ºË²å²çu_Mšpâø ðm¡Ð 5Ç÷L×!Ú9 ˆ6àžé:†eƈ«³û´çÍ~ÙDéÄq :ÍV IDAT_ìÞƒéÊÃX5w•Š{¶å²çQé*DÚoÚЄáëûlÚЄb·»t‹}žJ »÷ ¿o•ò˜¨æÃ0„JÐVØ %H[ýˆ¿Ïþþhõ—¿o4oÌ-}.||®ïaÉkDÝ]ˆ]ǵzxxxxx\,ÈË ’LM.ƒsR=¶5ÉÔdS¸÷ísóKÜ:M¡LÍùˆ²Ký£ëé{Û©ìrhx0ǧ㤔Ñ5‡Ã‡¼j_vfœÂh_ô~Êy}¡Ø)Ë£=zm[ų-·è—²¾ •¶içü¬†”§ë5\Y6e¯Ó=Áý ei ÛEÞ°W3³:i¥Pª@ΘËÞQ½Ðaddo}Șv!°ìñ|²>eº¹gr ^³VÊKkýolWUðD{ Ãƪ¹€³ÍÛ ë(DvúþÈ‘û!wmX‘ÓcŸ9ÈÖ-a¿¹”%“@ŠbùZ >Ú’Ëb­(g˘Àªr'²(Îw<<<<<<–àkiS‚OYn{¹5\oø·{î2¶Tæuž‘M–!±ìEÝØÐkY€5·öõrä~ck÷EÅÜi{>ì|~ ÓmÆÖ¾—kÆòåÐì•Uc ;Â÷ŠÖ)c ˜s‰ú”¹]fÈ™œñ:6žGm4ÆnÈËù6ñlxa't•¿:üÊ5z>c™œèÛµ…R…R}Šew’¹Ê;C^<Œ™éYa¯¥n×uÎ Tüß¿‡‡‡‡ÇòÀ?`<^7H#˜q $ ]8qüÊ£=°“|\ö$µ’c±eŠˆd: ÖbÔJO0=<<<<<G}Úý@•õ©äbì‹Æ¢×"?_ ¥ðÍŽ#™ ±¼PŠR/éwžÑÈ*8Iv×lÕ1iI½ú´Z2’&W-5A –•ŒËv!dÒRƒô"—%‘IN. ÅθÅ.%¹TKQzxxxxxxx$¡¡•|x’経~ð0ÊY´··êr2qãäõ +×·k‹Ts‘É N0k¥¼ä%”x¢   qÇOÖ§d¥«€lwòÜÄŠÊYÈú”ÉtÊ£=(vïA¥<6ï9K+£ÃïCv€äu=<<<<<<<Î'R ˆM. ËA2‰HqòT.d%¯ŸÉa'lPƱh2jòd FrÏ&’ öÞè=|©@Z ‡Ú–çÉ­tP¨Ôt™9r¿®É¸¤%©¤ÕyäpÕy\hŒ‡‡‡‡‡‡‡‡V0m"ID#ÓTQ.d%Õ³t­³ÌÉOÐÒ`Ÿb¥&Ê€&p´š‹‹\ª¦c±b–•Dß®-ÑäËøñë Ã2ƒ>Q—v6¹¤1ÇrRž›Òä’úš–,vïAeär1 âôü˜£> Ùµ§7¡PèD©gL.t9F àv×FóºX3‘/ZòqXfŒBÎ6¹|¹r åÎl¤Øs\5õï""“qªa\}ä>ìö5$D¥«@)—t•ò˜(vïAy´ ½\,*å1=ý}ÊMoÍs©g ]{:Qê»Côððððððx a%¸\àÎøCF•\Ë>ÎIä’\ä•®Bà"Wc­æ‘í®JHˆDâ× ²]U]°ÚŽ¿${ZÅJM+ÑUX*å1Ñ´¡I–G{д¡I.ÆM¾Äõ«Tj >í•KÅà ”%GÖÒ씹M„弃Ó8‚D§c LëÐ"¦c8SVvBù|ì¼´Ò!z¶âl÷Ï v;ֻ汞® i÷ϳô]!iv?ÁßgLxŠË¾LTÕÏáIf¼}ÝÚDûwO]–h_-oO´ŸÙhÞóD¢yMÇm‰ömNnþìcËÜþû¬ûpN܉rŸa¿ÿ €Zîv5õ²·o?WÂwWtáíçJ†YÏÿvì•j˰ú jübT-9+FÍæO?¨¶«JÀÙ.µåø…ûÖš×ýs'ß‚æu?0ì+2êû³±cÇ&Z±±Ã#~ôÊM€ërãøÎÔ&\—7ì7<ö{j‡Æ¾×üº®Ù£¾?4v{àW¿¡¶4ö³]¦ýª:U?—Yƒ¿ªŸ6ìÿ>ó+€gë'ñÎÌ:<[?iØo^¿ðœ|o×à9ù¼aÿî©Ëðî}½xæÎçvÀd+¾*fœÛjó ç¶b ù s{¯ø\÷Ø ¾sG«sûÌw"/ÿUñËÎíÑõ;ðážÂ—ÖßèÜ®Û׆۟ހÇo8îÜÊJ3®,gñÃb-fû¸üéŸÆßÜàÞþß?|oÿŠïËŸpnÿý‡~m8‡i¬pnÿ+ð³ ÛŒXéÅ’ ˆ•¤YÚ€2 é!Ô¨½^ •ÐútÕ©„-–ÀºìZý”[@q¬¦‰¦¶w²† ô€'ûÐð ¶\üçÀU²ËsSzpž8DMÒzÔqH³G“©ªÎ6h!6‘  Hš?mçˆ[ &ÀÐÈ Ôó ß1v{u{lF—Õš½‘ù[,½T毌ào€/ÍîÑ ^ñúÇæÓSjJ×äÜ÷'®üuÇ‹  å9q§~'šD(WcPÛ9Ñ$BùÝ!s2ˆ&JNÌÑ$Bɉ'šD(91ãD“åÜÉ·h;'šD(M„»œh¡üÎÔ&m7ˆ&›cF4iÜœs¢IãæÄ˜M"”ÿ.³FÛ9Ñ$BùÎÌ:mçD“åÛÄ5ÚΉæ»÷õê­M.à²Uomr ƒs[õÖ&—pÝc3zk“KÈË?Ö[›\À‡_xJomr ‘\>~Ãq\Y¾-\ÖpùÓÙXrù77ü#ö=O.¿/w$ËFH¦Ç…E¦¿w@ DþðlÔžaKÛqrIu'é×ÞÞªÔÚ³X;õ5>ðб¨H*`ªGd+B×·MÞ†F%ÙÛ ;ÑV؉B¡üÒì47U±qSÕ°!A¥WävSì|þìlü5£Ò NűVKöO„<œä~å~åšØûïÛµ}»¶Dì”ÄE±´CÃó²Sy*š?nO»ÿÅÚWCÊ5{dâüåËÖ’‘0Æß·k‹1|üåBVÊsþìgþ£ËEŽÓì à…ÛÝûˆ\Úû"—ö> ˆ&©˜¾ZÅ$ðý·Ÿ+i“À÷±]D@¶/F£ ß_UŠ*€|¿yÝ´ŠIàû;f´ŠIàû×寵ŠIàûØ+£ ,Û—ÝQ–ïŸíŠ*°|ÿ¯ê§µŠIàûÏÖOj“À÷Ÿ“Ïk“ð6q ž¹s RI$¾*fôÖ&›0Ð|Pom² ß¹£Uom² UñËzk“MøÒúõÖ&›ÉåíOoH$—W–“ÉååOÿt"¹|«ø×E‘ËŸÅ9x\XFFÿOÓ‹:ä4 Ú!HˆÅÚ‰€ÔF•Âdg€7jg ¥õ€ì×ý¯Æ þòŒê}–z”/· ZœÕDs1÷W((i´R‰20²-Æ^)óצê\ª¬ôÊXd~Óì/;!²¨TÆ¢®·`.Ï‚ivÌN  ÿMš@‹—y¢u½cïïDà¦+ëû?Û¼ \¥^¨æf§{ˆlÊnèù#‚YÍÌ"_ö‹³(ˆÎÄñ¯š; ¦z‡ú—Éõà·žª˜PqÉcôùÇÚËc»ȓ›¸È-ÓnßV0íömó•÷þŠÓ5®É¥œqºÆ‰\^±.Æ5Näò=O8]ãD.×ì¹Ýé'rùê7Ü®q"—ÿy¥Ó5NäòöÛ¿ït¹¼ýCÿŸÓ5När ïV§kœîgõnsºÆõßãƒn×8ÝÏ+ïý§kœÈå‹õ7:]ãD.ëo•N×8ÍÓ÷}$Ö=þÌ#È×cÝã_3ø¸Œw4Ä»ÿŸ«cÝãß¹£ÿ—ü‹X÷xUü2å\¬{üKëoÄwñçIæÝÿ©E*˜_N$™wl]Éü·BøÒ™addŸ¨ˆ’')ù\ŒDï§0,3xªë‹h몢^¤¢~r>v‚iï—C¢ärµ”õÍ —Ks6y²ÕÅÚ©¬P¶» ±"‡á£RÓm>vÞ'Ùí‡×šQK¶¹a§y¸ØûãäŠo—ÂÎÉU[a'Šc5JôíÚ‚¡áÁÙ©OºN.ù–ÀÉ%ß6zœ\ò-ÝŸ‹¼Óç›h¿@U .)¼p»¡VŽ«áô”0ÔÊÒ¸zÞ8q•¡V~~â§ðù‰ŸÒÇqŠ%)šqŠ%)šqŠ%)šqŠ%)šqŠ%)šqŠ%)šqŠ%)šqŠ%)šqŠ%)šqŠ%)šqŠ%)šqŠ%)šqŠ%)šqŠ%)š¶bI EÓ¥\ò­K¹ä[—rÉ·.å’o]Ê%ߺ”K¾õ ¦Çb Y[/‰m€œŽ¾q¡ö¥$°…J ;j‚„ÿùº~sT‹³ˆ¸+—àþ ¶»}±v› ,Ö~¶y[üà¡Èåéîøñ¡n53¦ÿùØI¹£íRÙ—šÀFâ+rI[¤\Ò¶ÑñH¹¬;ºoÚÐd¼æk÷Híß{»z°]â§{„ñCÃv‰_V\‡ËŠë¼kü5ê'pw¸‹lrw¸‹lrw¸‹lrw¸‹lrw¸‹lrw¸‹l¦Ç`&%øÔÉåßÜð‰äòûò'Éåt ¹ô1˜™KÑB¯6u<]Êc©ì½¨CS}Y {¹&>œgDø«ü¾‚U2hL½ªÅPAJ¿¹?Ö><þGo«…Ü=|±Ù‹cµˆt~¬a©–öñbÇg'°,Ç1'pKm·]tö1ÿιŽÓÆ?öHÖyÜ“ ¥÷÷ ä½'w.Õî‘‚õ+Å2p‰W¶<ŽÊ–Çíêµ&'Q]âÿµGâ¿öH¬Ù£^Ýñ">?ñSÚ%~ëŽ9ܺc¯”Oâ•rèvõDóµK4må@$ч+—"‰>\¹IôáÊ%€H¢W.D}¸r À+˜K‚L¶«jݶj?^ìöb¥k/VjÄÚQAjûý½±vW9#rMºÜ’—‚=¶ !-ˆS1Û?‘7R /5ûš=2QEÏ×[bUôFگ׹$·ùbÿ~Ü£ôˆÀR,mØŠ¥ R,]p¹Æù9—kœŸs¹Æ répós.×8?çrós.×8?çrós.׸A.®q~Îåçç\®q~Îåçç\®q~Îåçç’Üä€[¹´}âÜä€[¹´}âÜä€[¹ô ¦ÇRÀøQ×±¼PŶyAWÿ”¬ã¨!¸×2ç°×"·í ©#ÈáçÏϰðùK»~9ðîÇ®JŒÃ¼æCoH¼þ$gÉ üâ¡ä¤$ñ\Ûô–Dû÷¾öƒD»o?lÿÝ…«ðLåEsŸµ¯ãÓÙ>oÿ7ú6ã†û¯¥ùYîöß]PaôØíëXmæÝ°ç€þ ìö¸„æ‡ãuïÅñ“Ïcï†öZ»JXý½¦3NûTÇÇptê(Ž>÷#?©°ö"ÚVíö0ñµˆhìÑßß>‚£Sj¾wÔFìßûÚ°Waï‘ëÕ9ãxPFŸŸ|3íêsåÇ×6½d6ãóãuüyûÇßëÿÁ%-8×"¯×ªÈd©“·X‘hgu‹c5õ°çïá™àJA3ìFAçgØyAyn bEn^uÓì¯×ù£š VT=?Ú:ªçqþtMS®ùÓvîÑgóGv£Ž*›?²uTß?ÅáÑ÷½¿þõø‡¡ìþˆÑÿknÇ&¼í‘ñXûkÏT^4IÎ+ë:’EÊüÁðQƒäü¸²¸ÚìÃI¢\$ŠÃE¢ÎGÛÛq•& |ŸPFV¾Ox$³Y¾ÏÇw¶7þw#÷ñZ‘Ë8¹Œ‘ËóíPŸåöëÍÏ˜Ž¯Ã¿Ù¾@æDÇMþ››2ÂÏ™Žß‹‚‘C'ùðÕw⊤ë:”ŽuÆk­ƒÊî±vê?k|quTÉWG•ìiuT% ûzÐ×;)Ãú¯ÑyØxô}oAæÄOàÑ÷¹ÕÙý Àd]mxnÇ&`¢®¶)°É‚¸Ð‚M<3ïxfzÉÁƒyf:ß·ñö¾ñö¾€\^µ_·q×m «lØèØ:ƒŽ­3øqe%~²ðªaãsãš'>7®yâscϵ÷ö¾Û¾n£;ü„ÚëØ:ãü öâElÇUNr (u«Œ¬“\JÝz$³9–\>Sy×VÔø¹ŠÌÉ今+qÝÆYCEædrÓn5~®"Û¸uÍ6ܺ&>‘s¨yCÍŽºÑîkþ îkþL¬ÝÃÄÞ#/ê-½øñç'ÕßÈç'_Õ/ãx\%~¼®_üøR‡[®„êèÑ1­ÕmשlÔ§0-¸ŽßÙcWY!"±X{€åš¿´þù 4ºEÞ_â°o×È™Dë”&¥‹µ“ W'µQ{\ÕÕ¬…Ž!:ÝÔPc÷Ÿ/·`¯¬b»È£*f?_ÂDëäL™65w¢÷SF2]ßs¹×­­¸ÈcÌ ý8“ÚS0].N€©h'ªO.'ªO¼}"–•  kŸˆe×&hÈÛ'bù›ÿ¬ àùvqFTF«}[³Û·Õ¹ï}íºÍk+ÀŠã/â»Ã¬ a›ï*®„¯á;ÇÂ>®mz‹nsÓn@ÁÄÁV݇vqsÅñQÙÀTÌ ¡bYFr¼†®Má9rqÁ”Ggð›ÿ¬Ï]qµÐsÁÛ§¹ºæCoÐsÁÛ§¹ºÍz.xû4Wô÷E¤òÔ©S€µk×bÿézþ‰TNNLÚ;ÚÑ?7 çŸHåäd`ooǽsŸ0>ß[×lÓíÿ›‰Èç;Ô<¨Û?øó‡"Ÿï}ÍŸÑíÿ¿—=¦?_®^Òüspõ’柃«—;êêó´É±!Ú&ǵMo‰´Éá]äÉȤÕÑ,;åž©Ø3µB××#…¥Q;µÍ틪ã·öØUjèübíÞS€ÌNV‘¬†×ñ•r°ë¶¹=¥ÿr!+]euŠc5E¸y|ƒ\­ÈAÖ§äbí€Ê¨ÄáW®A[a§ªƒÊ–ÅlÔNàöÕòLÀ# rÙ#Ô Gìþ r™™E^¶¤Ž¿> ÉÕYM.³&ñ\5w«æ`ËeÏkrI÷éàärߟFíœ\ÊJÔÎÉåsd¢o@Hšâ\´Dâ\´DR]›GàT5bÔEW—SU¤6y»×VÔ‹·ÉÛ}Wq%ÞUÔ‘Yø¾ÍF»›v«Ç3•9·«ÅYcÎíã?>j̹}Lä’ ÉåuLä’ UÌàÿ"—"—?®¬Œý®À3w¾û]T½Ü¤ïJyƒò¼pâ(òwêÔ)=~NüEþ&'&õø9ñù›œœT!ì>6ýS‡1»­?ºÅ°Û}üÚ+wDîç|¸Æùçìÿœ]àŸ³G:ô7(®64»8vßІíg¡úh2í‰ýŸ/»ýŲÉ,ØNÅ~ „ç¶}ZפïåÊ1³}ëwÑbï_׊ ”…ÚùZñ.7üàa4j/”*ûš€KPÖ)e?Šs|ôÜ.òØ+«¨"¦VfÌý¨×o¹ìy¹g{¶ë ¨Õo|½ÊùcߟÇ^UÛ;ÿSÔ.+Àá`+ Qûsdðý+ñÜ#¯âm;¢.ªk+À3GKßU\‰jÜ´(;ÜË´²§*’²…O>)[?ÉžýθK6vgÜ%»+îÒ5vž@@“O †œ”Õ†'ÉÍÕaû¨°¾î4Ò|¹(²¾h1ƒÁ°}ì÷‰œQûD2Ïm¸J»9ù<É›²a¸›'"™bs+:KS‚yúÜ8sžPk€AþöŸ>ü`-Öê¶Ç1¡Çß?7ü<ÐŽvÝöAÒã¿wîÀe¡ýÇ••Øýzü›þ©Ã —„MÿÔqL`ën1È%aënÁÿÁQüÚ+wä’ðk¯Üa¨Lz›\ÚJ£M.íçM.¹ÒøÉ“ß0Ú·Ã ²“U£}; "7ñÑ>ƒð1˜ÉÈ,¶ŽÞbí²kï5TäX¬½"ÇRÛçiÛÞ´¡ µö¼>¦u¤ µöü’ÙËÈê:œDÖ–ÂΉŸÝ¿ý‡Ò'ê ¢õ€ú#M?×±íCÍ,±*¶P¬ LW^2{ß®-+rfÔ%°óZ©TjæÊ²zÓ§§L¢XÍÌ¢š™Åv¡æ¬ZœMÿÈSáüe²êEtä©A<ÕõEˆÞO¡¿÷µbFÐßûŠj¯÷Sð˜îüOÀÆ•nr (R¹nr oÛQÇ[ϹÉ%<ø®ï¿ˆZ¢º¸£~ÔIЖËwI±…D.÷âÅpŽ®c ‰\Q ç¨3Œ-$r¹£~TÏïËP0ïŒ@CÁ$rie‘K×ç°âx´m9%—†ýèLlÛG؇&—1}¹´û0H £mƒ:Úæ$·=~tãG'Œ÷òsÂÁƒf( ?·ÿ~ì߿߰ӹÖ½7‘\Ò30Ž\Nu|,‘\>yòذîlX§ÊGQ¼-!;YÅèÐñ¶„ÜÄC؜یÍ9E)ÞÖÇ`&c%«…'ƒí[uòλ'Ö¸ì¨@d+Õ·ßß; ú/àýùù»¸íçcþÈX.–űz3{Xûj@Dgöhqä’G. qäòRÅr(£ ¶×ÇØHš8tL^Ì}QS÷s;êGŽøû¸ÔÛ×q‘×»í÷P\äOÚA{ãG&"çx{ÇEΩöÔgº¿²?rîø×L—¸­\Ú.q[¹´]â.rIøäÉoPj)€ˆ;>;©þ/'ÑÅî;7ñEjuß׳7\×3fAÊ%Å`òãn: R.)Ó8>{;—^S0YŸ’<ÛùbÁšQ)e7pB$ËËi¸©ÆIL±}(;šÈŒ}<P²Ë!Œ$˜­Ûn‘2Ú£sC#ƒ2.ehdPöÞ8`dØs躗‹°ód²>%)™&îú[¸ö½¶n»Eîÿä¡Äë©´’+6¨X© çd·ÿ IDATI×ò¢¼ÝZ)/é3ãûËÂU1 \ÚW%_ß´!9KätÖ‘Íð¡_Nn_lø¹Dû]¿úó‰öë6¼1ÑÞÔ¼.ѾïO’K-eûß+„ñ‹´ÏÛÿvùU¿Hû¼ýñ{ÂøEÚüs‡pnƒJ.9·!TlèxóÙ!6©ä±)TlèxýÙ¿…ØÜ ytbsXŽßÛëþÛñðððpG³_BàÉœ¿8Ý-ıfTJ"qtŽÞ£É%tõ$D±R:ëY@ºŽ9± åBVò·Éú””õ)Iqˆj-í~dtðÀ!±uÛ-úáá²3¦/%ûÖm·H~Ÿ\O«å+5Á],€šs¬.šiƒmá2£ÔVàpó¸ð …ÅUÊW) TX\J˵E,‰\êXÀï*®Ä·Ë¯jri'ïmÚ­ˆ%‘ËÎÒT"¹H.$’K$h‚Y+åå02’¶ö©ËÐÈ äeYõiÈ­Ûn‘qqÊ&2cÛË­crYn“åÖ±†®"“z…^Öæ"Q2ãH%?Oä2’Å)‚Lq 1ŒŒ–]¼\ÈêÂê0ŒŒ$µ Pä†HЬOɳÍam´³ÍÛ"œâíeâ¶n»E ÊöŽv}®½£C#ƒšŒÑ÷aä©AsÈ¿#®ï?Gû¢uJÇ/ÎÇ®?fç÷—v=ÝG{G;è>9ÑL?·ÙD¿X© ˆðïA0A¦M‘ÎZ)/''g099©~6ȶ®*&'gD2éOP—¼¤ ¼¤ ¼¤ /¹÷È‹‘Ä Œ—ÔU ,P¼dgi c]*Ö—H&’Kkˆd!¹Ô±†I&’K:öðððˆÃJ@=Œžêú"n,}´E×eêºÎ_ß@¸”]ï€á¥R,õZP“ë[PŸ>$ÉÈW3TÙNË­còå™"ÞЪR _ž)¢Ü:&‹3úzZ¾uä[ø“?yR»qåLyÙ¢¨¢˜3V²!W)áØxÞ¨•(I.LR˜„Š”Ó×WÚBgqæ8 †´ý£wïŒ<Ì?÷ÐÀ„8Ý-„¬OÉ+Ëa­EÙ Z·Xpå²*f õû´‰ŠR*ûd]è{ ”K^ˆ»uÑÇúWë°«‡„ÈäD}Rì ŠÛœÊóèu|’ÙÞÑ®³°9i¤s„¡‘AÉÖÏv²ÜåœvúŒã]’Æ®0õiHdr±×oÝv‹.7äR1ãÆ?öHµR«$¹ÎD,d%­.ÚÂ>%o¯  oUq¬†bð‰¡’k“Jrlwz¶«*l’Éíôþó醿ÔA„’ãæ BÉ‹qs¡äŸã@Êâö˜ÈRË1qz¤,ŽY]¸”L»][É´ÛõÊ¥‡‡Ç|Taê^ÔñÀ×ÿ}¢Ž¶®ª‘mÜß§V™œ˜Tû€äÙØ™, ¥"–™,pàÀ!#[W¬ÈAJ`Ûm@¬È¡¯wÀXÙ¤8Û‰^Ôqøš?ÑûÅÙ FE.à=׿ïÿ/Ô¡»6:–Úê mr 7UUQîàz9­H‘K9­j%Òõœ\@¹u ûùÑ»wÊÏ}öaa¿>ú±úzRõ|Œ«¥4Wã©„ÍùÜi¥2AÉäj•­dê>[§0’鑬8›ÜÏ@t•¤`äÒØçý»ö <Ûšï7j矱«L}¶#Ènje< F2"ù˜Ã2CKƒlw5¢F•;³FƾÒÀI鬕ò:üÑ8I×{•³1,§jù½‚{Ÿðíò«Î}Âø=î}6¹´UL›\Ú*¦M.½Šéáᑆ•[·Þ‚m²:20 @ÒÎW{ùÖ‘o€¡^fÚ`Ö\ÍÆ\Ê€z˜êjýc5@VÙõê¡Kµ"û²õÈõä¶×êe0úÏ}öaJÅüÜg½{§üÜCãsŸ}ظ~ͨR0ewD\_ª`w³Rê_V Š`ëŠÇ)™VŠÈR2¥–d:ЋàGC& #à$˜»È‹PöíÚ¢×Þv2^/2ŽPöÞ8ÐÝE(9ää’¶½muxÃÉ%mûû°uë-ÆØµB´-grèÜQC¦­f(„““3‹ô#F'ôZNÇåN÷*K:¹«RSqì3.Vj‚«“µöVÝ')“D6¹¢ÉAä3-ÉÇ# ®hR;®h~Ñ$®h¾»"4±¤¸KKÚ·ŒPÜ%ís×8Á¥\òs.å’Ÿs)—úÜ¡ä$.×/.‰$YŸ’ß:ò-¼çú÷€V/ÉÎÝã´zI‡äžÔ5®¬µ¼ëÓ;jxCa#@+„¬Úçê%”D(¹zéºÞ¥^Æ®æÀb0m%ÓŽÁ´•L:–õ)¹»-$V™œ1®ƒ,r‘èï<£œ£¿w@$-eØß; â2°0q1ö¤X[‘É×Á¦m¦ ‚'+‘*OÛƒíkÂlíñÙó_.d%dø®,S¬r{{+ŒÄ- Q«’†€ÐíÍ_”\Ä -¯Ub©!w»G<\+½ðs®•^ø9×J/tn9â. vÌ%W-hÌ%W-hÌ¥W-=<<…þ•[·ª¥ ÷ ¼Hì¯e8”W#£<ˆÁ$ÅÒ¹M…ª891‰O|2‡W¦( v9¡¥‚L¨ä‚©åH½$Pܰ>¶\äÓ¥`/¶LQ¹Õ¤ïÒÊÅ]kIç}™¢‹§LÑr·ÏÉ&m;~)š=ηî —üãd“¶ï;tüµÿ´‡‡Ç‚àÿs˜'(¹)©þ#ÇšQ)Ow›õ/¹ý¥Í vŠ]çÑN`Ù.ò*9(€­æ®ìÚ„JyLÛùšðP) û”}½Fös$¾³ž<>žåoŸ”«ö½”Ìåj_z®íõÅùç×’)>·4¯®Š†âœÉ‰È=ãFF'Â]P?4zûïÑãÞÝЄGûR"Á¼ãCZÔÐnO¹>›M^û·©)y¹ÌÝ»w'Ú¯¾êêäöS–ãI´§aÝúµ‰öŽŽ¤êåK3?k׆c8uê”q\?W¯191i¿üòËhogöÉIãøÀºM×öæ›oÖmº¶·Ý~›nÓµ=5¸'¯kǺïL:··|g ÛnBǯ8·šªaü¶mØôÄçvxh›6ws7°·ø^´nlAó†fcN´1—GSSš››9€­7}·Üúëøò¡¯6m?g¾*Nk?м¡YŸ›;>§÷éómnfö¹ÐNíÇ¡ÕÊO°‘öý¹äÛ?ø• ÿÿóë—„‹œ042(! i»ÔíS™Úê>]㈱EÚìHeБÍÓ=§»…­SŠT SÅËdÕ>eÜ“ÈX‘ƒÈäDµ¨b8ÉNd³š™EUÌŠJeL‘ÊÀNd³RÓä’ö+å1Q©ŒA_¥øñù ²)ÔŽ3¹Äñ‘z*29!291üàa]E€æ¨Ü:Û¾=ÇÔAêÃîGÖ§d­”—7UõõÜ­M×ññë~hü€A"Ò2áœØ(@¢ Ù°ª4•ý#ƒ@%Àâj¸###I\Ö¸G†v‹‘¡ÝÂe£ ND=.N¸Ö~æp%Úö`Ù?"zÔ¦}LDÚŒDÚ´]mó>\m}8Úæ}œ¼®]omr ÛnÒ[›\ÀømÛôÖ&—„ñ£Æ|¹$ÌŸ3æ›È¥¶ÏÍË,¹$Ø–“MËÉ&€ådóBàw®›Fµò࿟s¸sÀW\+®¸"Ö~ùªËqùªËÔ¶Çò`Þ3\ñ‡þB®»F_Ç1\mh—¤‹ÄØéÁ=‚ èÑ<ÅcÇêŠ?Œë[v«âåkFÝäB´N¡^‹/>üàaÈsSº ºm¯g‘¯· /[œä¦RC¡Ð‰B±SFÌÀÆnBÐÇOHf0®y•3¹Øñ‘kž@sF @÷ÎÜ…{gîB¹e TµÒ:Æ›@ß®-ú3 zªv¼mº†W qÕ§¡bSƒ„þÞ!297~Û¥NŠåˆý§C¡„¤Ÿaͨ”g ê ê ¤Äö÷›€ê;Jý; n@&{ûïqþøêí¿GRŒçÈðnx’yqÁ&”¶¢fJ[Qã€AH8ñssâç¶Û¤{ámó6é^xÛ¼Mº:¿î;“zk“Mè8ð½µÉ&lzâ€ÞÚd“ƒ“LN. œdrr©íŒdºÈ¥­É$ri+ÇD2‰\ÚÊ1'™é><þ¥û°ý®¼~q{lªŠcSUôôôè'±‡ö?ŠCûEWW—~Å‘X"—q$“ÈeÉ$r9_’yÅWàøÜqŸ;Ž™cѶ/_u9ŽŸ8ã'N`zzaÖc鑱3L]…šíºM퇡M2Ó®OB­”—«æ`Õ\ø=ˆû{"îKhÕÉEˆl{­”—o(lÔ >\­â®a»À<ßwõcŸ³3³íD;ÓZž›2ìv©¦¡áÁäD!+Ñ©R1I[0²Pè4\èq° U$ÊÊä¦2O}»¶Ä.娷k ΔéÞ™»ðÛ=wiŸ›¤Úm¸ 29g‹{?) @8¿½¨!½¨ÄR*¤$ó"ûD*Ï@R²íÚ²´OãàÄRß3ê"nLÑSãÚºÐ%B•Ó㢀M(mØ„2bo·ÛäÆîÏ&7v6¹áýÙÊ%µMǶrImëó–rImÓ±­\0Žmå€ql+—"ÇË [Õµa«º»¥êºpøÈ‰Ä1”Æ’c}ãOíD(7½G¿8ˆP>²é.ýâ Bùð»ºô«Q¹$¼õ­W$“È%aíÚužd^$p*˜œdÆÅj‚³j¹*‡Få‰ã'"êÙ‰ã'´âGr0y¢½½«æ`ËeÏ+;s©r×a}õ)ôÖ'4YŒØ¡ÈÁ2Fûo(lÄ¥í§AÒ&£zc9HÒVJ󬤔8¼¹´î;-Æ0)ˈÞ_äGE‚H&üvI456Ávs¹ÓãÆè:G„ÔÈ·>W{•+cõ¥ŠJÐ2ÆÀ2ò9É´û¤{²¬Ùê©S™w}ÆÁ¹Þ¾°8¢A2=^°É¥Mrlri“›\Ú$'ÎOÛ8¼ÞƸàiëR.ùÖ¥\ò­K¹t¹É— oiÏ;§xK{Þ)Ù•â-íyß¿¿ÞÿÌØ8†m·=hïÿÔï&ÚmÕòûß2ì¶jY+}Á°ÛªåÔ='öçñÚA†Êšð"Í@¸Æ2)+q ÅÙÙîEÚ?qüš64éï¿_î5•íªŠ5£R—ÝiooÅääŒÞf»ªºt=ðéA,Ú—íL}¨ §}Z½ˆ<%µÏár‹“"šäš?! ¢Ñ#pB÷!29ÁÀL6 9½¿wÀPãÄŠœY>¨Á‰N53«ˆ'Ù%wƒW*cº$NpÆþþ>Ô…y݇º¾>ÓaR_‘S.°ÇÅj‚Xø€lÅ/w©—=?²>%íBîÔ–M2É…n/UÉçwã¦j$™ÊPÝ$Ÿ_gì#”ªËÝáö`1¸ˆniü¶âÏ牻Ãã¾c½ý÷HN${ûîÑ.pî··–*ö’p>b0“Üä.åÒèË¡\ò¾\Ê%€ˆ‚ ¸Ýä.åp»É— <©ÇuÌ“zE.yr Oê¹lks¬àÙgŸMÏןúz¢ý›ßü¦qÌUË#G¾…“¿9’L®ZNLNà\®“á=rÕr||ç¶mÂøx²¢êñÚ€V0©æž cy@WÜ¡•qk+VœHž8~BÇõqœî¢VÊK"•”yíªŠööVµ¬cZÝ„ƒ\†¤6Q"=ˆ“ì´O÷îÚç{—’É“:h‰È5{B÷¯¬O…kU·NA-¹ mçÄløÁÃÐKn’ÒÈ’JªÅYT3*SÛqÔ <…NS©dq—…B§A.9±AB(6M××§¡Ç'grÑñ!w „Ê]­”×÷Oãçóc¸‹™ [dr‚¾Kœ|Úñ˜Ù®ªNê­SaS0I…™œpßw© 7¹Ã Õâ¬U Ï„Üá«!¥ìC%è;A÷742¨•hLÔ7©ð”`¤>2îî‘áÝX¿~=hdh·-í Ýárdx·Ê.‡'™8©t¹Ê9©t¹Ê9©t¹Ê—3“Æ×?®\@T¹Iô‰s“Qå@DÁä‰8é¾ÈòDœcSÕ¨%âÚÿhÄ>~tB¿\˜;>§_®Ìé¹¹9ýr‘ËgŸ}V¿¨?ޝ?õuý€§¾nþ0ÿæ7¿©_ðä“Ov[µ´a«–6¼jùúÄJg¼JͨŸg“J:æ*&·ó,_*'ãꜻßß/÷ât·Yµ$/ÎQUAÕ““3´¯ÇÖ‹:ì•k8Òìiíóظ8ؤ’Ž% ¯EdõžÓÝáÛ©®¢X‘¤véjP²J߀&‚‚-÷˜/·(RÃV/ªŠ0>¥Pè ã/‰H–ÃxLÊ"7}TÊc:^µOÔYáÍÐ+Úd²pŽæÎÙß; z§!çQÍVõõÆüD‹¯èÄU¿ ÖR:ÚWj]P'SÊKöÉIÊ€™œ®):4lh· DÉ&•AŠs“S¤87ùÓO?è&?wÕÕ‰nò³»Ýä@4ËûË4ƒÇ¿tŸNö±³¼‡<ŒcSUìcgyüÊWqhÿ£F²ÏrbüèDl$@‘WžÔóÔ×cíÚu¡}nÎHêyòÉ'ò?GŽ| 8œ„›dNLN¹LÀMžÇÇÇm›0¯Z¾Þ¿× d}JÒ×q¸ZJ¤Å.5èAl'F ##)æÒ†~p3ÂWºÄeÓ¨PwܺÑR!›64i¸iC“©¦²uÛùy*¼].de¡RC¥ëå1Sb-m¥–ˆㄉ¯ÿÉãj),ƒßs¤öä~K{¼qÌ—ŒÒ#´!%ƶPì”gKñÐt\(vÊ÷þ絉ÝßvÇûSø¶Dëæÿp=>±ó¿èãÏ<ü‡ÆñÁ?œÆ'>©·Ýö€qÜÿ©'0tÿï°ãß5ŽŸxì÷—uü—zû"ó3Í߇‡Çë ã¢8JW© ,£‰µÌä ±]¶P.Úy"ˆ%bähPŠï…Zwºuã7ޏâà ¯ý¨Ç?xXǺlyA œ\8¹”õ)åÆH~_ï€AíUaøyµvyHÄí$Š/%÷¬H¥—ÈýkÇR|/µGëdëöƒïŸW,"'¨®µµÓW@ƒ¯¨Tˆ~ÿùšÞNrÉC büoÊõ÷åŠ_^ âjqžo|bçÑID.ùñ'>©“ˆ\òã¡ûG'!¹äÇ·?½Á¹O¸²œuî.ú§ûóG$öåL.²Â _ʯ„‚LÛe‹J.‘(@æË-¨ŠYµLB¹®V1¡u±U°ˆQIN®xC9ÈÒHíŸÚã®o~ (rx¶Y¹aVÍp’º¤ÕfÊ…¬¤8XJ´¢6 ÅNIä’’¦8¹´Ëøðe!û{4¡+Tjz*…¬Ñqš3:IÊ&ã\ þ=œ32¥³$Ó}…œVKÛÛ[5Á¤sg›·EÜ県s%¶¸Óª¦…lè%:]™ùs„躲Ð# ££ûÿ]9Û¥c { eEƒ’H:7pÑÓyR. ¤‚WÊcâñGïK$¢K¥ÐÙÊ%Sû¶r«ömå’Ž¹øå?šQE²ŸÞ€[ÿánþ`«1~ú»¸²œÅÇÿv(øÞ…ã?ø•¯bëMÀåOÿ4J?:€­7} ¢0~ùÔßæÍluÎ}wÃï´9?¿òUª7ŸŸ8xÓÃÃãR…°‰¥ýp³‰¥ýp$² ÉI&;ÔCŽþÓuî¢^ )‰´›5‰ÀÙäˆ":¶É%kÒ˜Ò¸¶å²ç˜ëRóqÒÄ(ºON4ézI ²6Åî=(ö„}²ãJW…J-¼ç f’æÂŽFFÞ3]‡h‹Î%ž#’ù™Ñs†]v«Òíí­8üÊ5hoo)šz¬ImŠ,ó—ê_µ­úï—ªÿÁˆÛ7óŸëþíLjýŸ“L÷ðƒ‡Qí1TÌ¡‘AÉI&M"—tÎŽÁ _ÀT,9±ÔÉQL±äÄ’~`áæ±—¤zÓ\©LRvçZc}¡×§!­¸ür R‘òR¶‹<¶ •Ùj¯ìÔß; š64%’ïåÀrÇ`Þú‡´K€ÞÞþá{qû‡ïÅÇÿvH»Äè­X¡Jj•~t@»Äèíúæwhxó[ ’|û‡ïÅøÑ ]Φo׃$‹9~ÿœ÷Ï“{ì8L~­DqØŽit%ñó\żgZÍ©˜|YBZ›Ð‡ºàËr噎éûA¤Òàu.íÕy.f’y!¦>’’Y³ÂGº˜ù\ ˆTI³‰TI³‰TIãÇ7°UÇ[Š ÞüÁV½>sß®-,ÞRýmôíÚR{·Þôo (2¸õ¦à…¹?×ÀI «V"'D. ;#¼mW}D~îàÁCze?·ÿ~ce—¸sç‘ØKŠ‹‹½äYÖt Ϫ¥}~.‰\òÄš+ËYUŒ¼^Ó.­ÓÝÂX£™Ú£cŠYÏ™FÁ=ÓuˆÖ)M, {Å,®U$©ÿ´IL¿—{”Ç\Úà1˜¼/»4`º^ãÊQqñ«\ù¥̸²Oü˜ÖÛ&ÕÒ>&"KýÚÇió·P¤ÅCzœŸL‚+“·ïŽÅ ÛwÅb>ñØïãË4ƒýAMC›øÝvÇûÃ:²p¿·áàW¾ŠÞÞ^ˆÊóY¦ˆ\î@x¼}r¹ü>Âö¹ËîÃÇ`zxx\0ÐÃ\B•âØ<öÑe·áZ2’£»§Kv÷tE”M~½]N†¿?n¹Ê¤öíò/ö±Ý^RÿvûÝ=]æšåÁ’‹qÇõiu¬CD4äÀ5n§[´ÁµÒç *E•Vª*Îî‚}ü8/[ÔJDß-Ch÷5Ÿ¾_÷`%—$ÂUŸÈ¶ï~È}+ã·õiõ¹Ämåßýœ”W_»Ý·ò6ˆØ­ô2œÎíÕWËCë×Ån÷­„üRç ±[ HY*Æo¯¾ZʯÆn!Ô8iË÷! [ÛZä02zË÷[ÛZäÍ[o’‡Ö¯Ó[¾óÖ›–¿} „•z¯¬&#`PH­T:ìFF¬€¤eö‚÷EŠ@¯]·vÞœÏ5 iÿ|"ÓÖˆ¡È2…ú Vv²¬OI®ZD”½ mÏqÌIöÈ9Ç”@¼›¾*fUY)Ù‚íeÁ*D´Æ7%ݘ×GC$+üÎ÷—®öìsiÕÁVr[à+ûÊ­c²8Ó)ìý|¹UÌJTÔ2¦yúë%âI‚àïø]k‹°ò‚h +/Þñ†pûç/›[ÿóU¡·¿ºR[ L ã±¾<‘ìË+Wèíͯž3¶Pÿùƒ§c·(®rüöëƒÀö=ÀÞ÷ÀBâ6©Æû«+%ðªÀ"ü:>ÖöNÜ1­–èëE˜~µ½SÛ÷e7âΚZÐàæWϵcؗݨíqíß&žKhÿŽégq´©)¶ý;kÇðe×ÈÃÃÃã|AÖ§¤VÛ‚—V6Iõ³ì\ ÔJ^pžöµÚg]k+{¤$Ò+NY´_úhßõâíK(EÆÕ>)—ö«Ñþ~ë|¿¶ó±ðŒòȼ[öhæ½Æ©ŒIgU í IDATv:Wl_Ö§”Òlé¼¡È H>NÊ §8S:Öï± œ“šIJ½_²\ÈJ ˜×ÓØOºç8…½Ü:&]û€"t4Úò5Úù¸æ«†®ìî4;õéÊúOêŸæ“Ï);Ì•É &½bLzÅ(˜ôŠS0é§`Òë|+˜|nH]ä #ŸR¹ÂÈç†ÔE®`.[û (v½ ‚Ç¿ ?xCÃÚ.ÏE‹Aó)|?Ve“D‚õ¤u ¾ÈäŒþ]k¡§ªxVûÜÄb¨½á‘A FÛ0º§d\?º§$ŒsvÿôxÐý€ìgÇÖ5)+Á¤®Dc!Ó‘¤¢¹ì"“³Í¶¥ –{Ú²“ûz¯0³¿é»@q²½¨«uá²ÙHÿùr òåì•Uäe‹”¥©pÞmåæ±­\Ö±­\Ʊ­\0Žmå’må€q¼h3N¹ ¶·É`ÜÁÜÜy†zyÇô³F’áÆ¶C½¼³vL;˜›[6å õÒnŸŸwµÏûuµÏûõððð¸XÉâ2¼û{t¢ OV‰7gºBww—q<º§LÒ*+|,®óÔ>¹Éû{œ×§Õ!Lëß&›$¹¬ÅÓ®“¦‚tWÃU’‚6ûû$†Ñß7 ZW´W¿€¶ÂÎD;ÖG߸Ém×ÉRì@¤ŽgmÔ\mÇ® JãÕç‚•Ÿâz=”rInU‰zÄ}Mûv¡Ü:&_ž)ê}N2GÁsòºôO^*ÜË­¤&`mQ—z¾Ü¯sß.•½ZòåÐ>,3èu)‚ýuGt^ VÊËJ0OåÉÈÅW&Ú[‡Ü+«úo /[$ÖÎ&ºÉ¹;Üé&ÿ»—Ý俺òïÝä3w¸ËMÞËÜá.7y¹¬ÿÆ Éä²TLvïíÞg&Ý&C÷8‘@Ž;˜{üŽégõo5ìw2÷øµc0ò¼ƒ9§¹±Û§9§¹‰´Ì9Íw‘{xx\4°]Ó亦÷q[wOWÄ.ëS²»§K·çr/Û}%õOï·íúØážvµŸ´Î³«}û>í$"1nëý»kNsô~—Âér#úùØîð$;Oâ±ÏѾ¾°µÛï±Ýã¼$S­”—¶{Øv‘§]„nqî>¦sõiE€]c¤cr‰óë¹›<âZ†éÊæ}ér^®„¥˜ëÓì÷¸se÷Ûg‚s“KWbw“»|˜›Ü•ØÃÝä®Äî&w%öp7y’{|ßÊ÷8è'¿=?Ü…íšîÂvÍwaëvï‡|üÑûŒÏ€Bè{¥Ã<˜«\·ûw?'eýŒÏàÐúu©žó†4‚GäÄvÙºbí8F×þ|úO´§¸˜ I³‘þ fJß.»«¸½QÐ^ ÖN ¦«›¤8Ì$»M$Ó2¸“²Íù±“i¿Ÿ“K°]Êiס²‰U}ZÅn¦e¿¡´ã/ùøø¶Ñþ½>É®I%q7ÒRܧsio 2é"›VÌ¥½µc.ím$æÒÚÚ1—ç;‹Ü˜Ÿû£q’|~lò§ &'Vœ$µýø£÷%L#ŽØE0ëÿà ¦‡‡Ç¥8ÑVãââ‰!\̘–£ý‹q$“VÖ'N}\ˆÝuÞVXù±A,y¦E.㮢¤Šk•2dÚ¤Ò>¶ š}œÔ#×§Še°ïRkãúw¶œKJð±L'ÙLHð±LÙLLð±LÙ·±RÒËeçÊewV/˜Gû´J-,³ú@ˆ$–Wq0ª74€}+Õ5ûî¶Ö±TѾú{9¾új¹®i­”÷sjkCü5®»Æg¯†”Póâ8Æ)×5­•«¾¡¶‘ãÔ8ÞýØUêýöqAçe‹óøÚ¡·ÈuMkå ¼E®kZ9î|ëvc^ìãrë˜1/öñ7nþ¦1/öq£Ÿ“‡‡‡Ç¥½îŸ‹@j­l‘ä+õáŠ<ö>?¸]ñ$•ÌõPwYwí)c” °WVñ¦£Å™Ná²H‰Áäk 7Ú¿F@ãì”…oϾ.ÃTšB_ï@3ËúåÍUÇϺìË}}’V'jooE±R6Ñ\ )Ï`O–¶ã `A • 4]ÊcM6#ŸA VCÊ3B¨ö…ˆ´¿fTÊÓ="¶ãt€‹hÖFó¨º3äàØxv²at´¤{“R§†jxxxxxxœØõ çk_ õÐŒSqlW˜m·]q¶†bmH¹‰#y¬Æ¢Q{¦kßEàÒì| qµ)é]«!‘½Ü:&e}*¢–Ò5´åIU:Ö5¸=œ²9´WFÂ"æ<ΑÆ.…Œ·S.d ®óz„?œ×'ôOû|¼tŽo]u6Ë…¬äê"}OéEµ5ù˾ž¾{ôâÇ®öùõµRÞèoͨ4jxy¶û¤ý4»ýÙ¸>ŸD$¨—t«^‰ê¥¼úêDõ’ŽãÔËÕHQ/7Èdõò†dõ$ª—×½%Q½¤ã8õ²Ü:–¨^~ãæoú¯YdèA×Þު˿øƒ0ÎNJŒd·ÙøšQ©É_ƒ@¤€¹:H€útèÒ]»n-N=•‹µO—òÎëO<¥_ÙW'"ßE“¥í‰ýß4Ó­íô·u¶y&'gô˾‡4;/Æÿæã*÷ðððððXJd\.pz¸g»ª"Í~º[ÛÝ'F·`·®ؽ¨CBÕ ¤º„Ü.§Ãåöx NÂÚuk142(û{Äèž’°¤DG÷”DUÌŠHE¹Å¨EÈÉBßÖ®[‹ÑÑ’~p/•]J ¯7Þ^nê}o4ìDG÷”Äè«%ƒ ?xýsa½O¾¢+*Œî²Ûh„ Ž–PîÌ&^_.dUñ{¦æ)-!㸼¶²C¿âú§öWÍ0ÎÛ$€ÑÆ}…œÞ¹ä$“ЏW Y¸®Ï¾:¡·|ßÕ¾ëú›fº­}}»¶àló6JJ´v5>Óì@ø€`ÿØÂŒüïyß}À÷ûV¨"âöq½d²ê»+Dôø…cƒõ/Ç ÿZÇúŸÈDޱýq`ïíþ€EŽ×ì‘8Ý#°ZJœ"rüJù$.+®ÃIqëäºÈñ»÷]…gî|¸ÀDŽóõT3³@'€±èqñxå SøÉ«øqeeä˜æ¡óêíû‹½‘cš‡rËг‘cš‡±Ö½èœÙ9öðððx­B+˜ôÀ+Vj‚”þ0г¹$õò  »Õ1W0I½ìC]Œ £c݈\’z9‚ D›:æ &‘°ÑÑ’V’¸‚ɨDd¸‚©ÕËJ¿*h¬uÝÝÓ%ùµCA1sÂRÚ…†GâíÅÙNœ½ó¯ ûPó ÞçdBÅ\ÊÒº»»”›},\• BÅ\êkëSj=j^À=@A㤊È%'™®ë5ÉŒ‹dlæjŸH&-îR§XLøíœš"tŽìt=‘LûúÚÊc¥(+5qêä)}=oŸ_ÙÿÝOïù²ÿ»C¿ÈNEí)~–ÎQ|sš½¸ñÇÜ„’l¤ó9=Ÿ z¯?dx¢>¨ÛÛ[A f’ýt·0ì«¡‘HÁävŠ¿ìE¤`r;-'§Õª+öÊ:|ÅR0]7ÖÝÝR0 Ca@t9B[M´WºPöþÞYWP.zM .yiÏÁðƒ‡ ;b 29‘FÐÈÕÍ Vq¬Úƒ-¿^Ûd½í·^ˆ| â(nü±n÷ló¶Èøˆà* 'øðvèûY¬Ô'•„ÓÝB¤]?º§$Š•š¨­ìˆØG÷”R¯ÏvU­ d/AIv‘ɉJW!²ÊT£v=rßlwµR^¶uUQ¨ÔP¨Ô099ƒ¶®ªþ˜¤^î»/Y½¬×¨^¾pìoÕKl§ùØ‹¬2Ð%!Ž»»»ÐÖUy FA¡¢¡RC[W •ay-3xæ±}°J&Y«×äe‹Q´™_oǵÆgÛçp;ó'Uà6;!Š@óE÷Yîre„ŠÈ„bðt¬ ÇÏ£c£¸¾=<<<<<^Ï8þya‰¦+A‚ƒ¯´aÛxYû_‡Ú&(:Ë= fIdÍ^烗µ±ÏÑqZ!ñ´¥ãæ‡ÆÈïÎéñ»J눰`¸«|•¾ÿ€ô¥‘;ê§‘9r]ç\#€k­ðØXÖ~ëúÔsŽëµ§]çáááááqQÃ&@:9[V,ÁLw£«ñðZžœÈäÅ"0\¹´—Ñ£óI«óØõ$yÅFÇŸvÿ©óÃHfdyCþ°Z¦Díû¯O[÷ŸPß4Ò.µW€ßEÄì‰ïs(qméA±{ix, ö´1z’éááááqÑ‚[¡¢äã¼Í82¹Ó5~{½`n³—¹tBK‰ÓíZäÌEàSÁädÊ.^ž4þ$3îþ©¯´ù‰¿kL‘pûþ#*ªCÁt'G1òÈ{¾â'‰êaŒ+=–ôÅ|þ®c{»»‡‡‡‡‡ÇrÀÈJåÄÂÎÞ –+lTõ+êZ$ñV&q¥&¸ ÉÎÆMUܵÑÌâL%Í•ý̯Ï<=>>½O¶ Ù„ x²]UˆBçº{ºäÚukãïß‹aoß %Óœ:y Ô.A·_€Ì—[ [µ8 :·WÌb]O°³ómPL­”—Tœ›#iì|üqvº]&ÊÊd'û02Ò;¿*ogÕS{2XƱuÈéàÞÛÒïŸ×9uB@R2¿M¼¨…Úé=‰vöy'µ»àöì‰säááááá±@d€p%£þ¢¥ºyÜrÙóª6c@æ ×~~¹r /WŽ0ɦ]‡ïØx_86«URφ< zq²éº¾¾z \uÓu#‰lJèBñ‘:€¹äª¯±7i’Kº”'¬vûÕâ,ªbV„µ:!øªC}¨垨†h\ÿÝ=]’÷W¬ÔŒr6T¢¦‘ñ»À–ãì4^»jØ!ŒRKTÃt¡÷?_rɯãÇv ±ó÷Ä^_ñ>ªÑj÷±öêßÃÃÃÃÃc©Á×÷6âß„*T+åÃõ¯ƒ¤ŠadôºÏ交ã.Yî:§µŸµÍrÍò8EYŸ’µR^r÷ªî§uL®†TëmÆÚÐôêîéJíßÈbæîS‡5ͽ—äCóìJòÑo°bñ"m[Ùäv¦«רùÚÝö½$]ÏÛ°ÏÇÅvrر”¶=’MnÍ?%ú$Ýj\aI>qîäå´ï¡ÏÞŠó\îþ=<<þöÞ=8ªãN~zÄîW61æâ©,  °ï#¡ÑH²wËU‘mœ8!6’PB[bf$a²®$X°?—‹‹F'•]Û’f„d;QHØ!!ëwÅE©rå‹‘„pÈû$Ç›2`s1¶ãúvaúû£Ï¯§»OŸ¾ÆÙÌS¥š3§gúôéÓšóœßåù¥‘F%˜Y‰Æåª¼Ò‰Ö˜¡Zc>ŒÕ‡Õ ×ŸZÒ‚IïC±a­9¹Fcy]xht ¾ÛÑJ-š®äƆfW óiyQßDDu|cõ!@{{§õørÑÚPWW+…Àmå <ä‡ÖÐu(åØ×—IÍIÓå.÷9.r· ¼ØßÍ„%SµþÉÐ[%£Tã7u.ÍJI*2³2QvãÉ”çOðjß_û´Ô=UÛÈu^_/Ö›¿bUîhï”eF½Î_ZúŒ:ó€#¦ï;.çÂDGG§ß6¬|ª{p[?êvmüNh‡éÿ¸ŽŸ¶b¦‘Fi¤ñ±a¢Ä²l‘µÑü¾-a–h¢BÛgK¶QöÉr”†…PŠeOðý ?ÌZë^û¼0îÏÚöyb‚ó“H•IMßI•Ø4Á÷'²Ndp|vü²}&ø‡Ÿ—L”\·Î÷Íu,—œv/9¨‰,ÔªõÞó>!ý×4ÒH#4þº!,$N’|U’¬‰8>QwYµJ‘ÅÉÜ&¨qyÖF5áÆH¾¡jAÂjÕž¨ó0Ú‹Y·ÔmÕ³6·¯ê±ÔíkÅLp~â;êö5Ãc~¼,x”4¢ZðÔR‚´]ÈÅßoû:a6¿;ŽÇš%zÊŽc¢_–'* ™\ª&Äj äÚ²ŽÖ—Iܺp0r‰72ÝòÜÊ‹f(‘ü¼Š x™Ýž3¦{&=›t_ªÍÃ/Ù(Î…’Ÿ©Žæâß;Gñ¥Za¥õÿÿµö6ÂÚKV`uûÿ{ò7)¿Oðj§k£&Š©Û Ë›qìH5òk{d=õPl±ÁµÃPK±~ûuü_P-Î;EŒmi¤‘Fi|Xø¨Œ¢-“ÕD5Ïå5¬5<5<éñl¦‡b é½Ã7ÜY­YSlbÛÀë©c ‹€ùú0És>ÓÈÒ:ÓÈ"ɈÁ%.n&M4Aª¥ÒŒ›¼+¦f©dà@·¶yÁЉt½‡“%¬\;—˃Q¦¶$— 7Ý÷æ÷}ù`D(A.}ù`D:™¯€©å))4€Þ{O#Uª"€C.eH0"”€ —ÚD Œ%A.•þα™ÊTÏäDð¿T›‡vœ±Ž$¥ñ¹ìæ=Z©NÞ9„nÞ#ßw´w2"}D.Õ¬‰®ÏDíT*•Ð2³2µkæ¯íaŒ%Cƒ«.ú·XljëÓ§‘Fi¤‘ÆG-¹À" íúÜÂÜD Õ$ ›‹\M2±¹ÈÍ$u_]}-Ÿ nM‘I#Î>J42¯î7‰.O yº‰HÎêàò˜*¹LŒ·§—k2I$›8‘L•\R"’§kSc~Ì×¶ùc[ýŽê‚U5%É]›Ñ×7­ë¶¹¦,I,Òõ¬®Á®[ èBí¦®¥ÖGûLðä¼;ûgup9u[=ÿjžËybȺ­>Ù¶'º>µk –mzCÒ=®¼§%D34ÒH#4> ø‹ŃdÒ>²€™èhï”É&uuµ.¹¿¶GJy.¹ü%z822@2ùƒ\‚39—ÛÔÖˆ„´dvtt"Ü5,“Œèøt³Z‚hȯ»ëëzÀ|Œ_²Æ6ž­clVçwÖÐ]ä‰ð®'ý`¾êŒÁFÏ1Ilxf¢EZÐH§’,¶~L—BðIÁt“¿_ØqWÝÛÒÞhVI+µé*×з«\Á9Æ\®r_ªÍÿw&“•ÔmÕê÷i³wT»öEƒ~- ëß~øø§jÌi¤‘Fiü•À´¨xY0ɺ¤~ÆSêÇ*‘£Êy}×” ¢?iÁ1-WFÍФk\•SJåª7¡Z.i̦3Ub… —MÚ¸M æ5%fX¬rÉÓ˜Om›Áe½4­˜ªõÒÖ¿j±¤vuŸõaE±bJK¥iÁdJ[ŠñØvÕzi;¿‰æW³Þ;P÷}Xy!ÕbIíê>µ:“úÿå%•¶d¦‘Fi¤ñ‰áZuôL’ è7S³T¡ƒi+%HÄ.•¥hªûR¹LU"iÞ|åñ›\}Üîq•\ÚÜäê+`¸Ç¹Þ–t“«¯ò¼<ÎO%MêÚ–±R}ßF0UئWÿ.ÍO•LªÛ!1Û>dûDç?Q»`~”ýÛ¦ “dší€ —i‚™Fi¤‘Æ'›¥RÝ6 % |TI>ÖZÚŠåÒ$œš%“`y-I>4Û«J"gup×{ iÁ´½ê‰î¨ JŸêœ ãlbgë;ÆTW>`—]Rϱµ­Å9µ¥"DÃÕÜå(üWŽ"ôK™#B¸kXsóÏ’§ ©÷©]ÃÄÖ®µ™nÖˆ„¬sßÑÑ)“º´p‡¼.ÙG,¯ ]÷uÉþÕ¶ "•<1ÄÏ„‡aŽ[¤¤š4ÉL#4ÒH㯓è†Î2„xº—ÎÕnd1ó«C`’„Ò{@™²Obà­… WUÇO½a·npKT¿o»¡«Yêê÷ÇÇÆ]ýMÔ¿J2;::ݤÓËj শsž$[ÃÕð×õÈŒ`5Ó>ÕüP†¾K¸Þãülç¯Î_<>ª½¿° Ó_îǺrÓ ˆ,ex(¦Ç’žC³Kß3åõµY¼•µî¤Î$¶ôÞH†G_±K*Íi+ÛIcd¾F¯j‰úÁ4EþI¥€&½·‰ù§:ŽœZ3¥€ ÏÃ)¡I¯ïûøi¤‘Fi¤ñÀ7ñGÄͬ“¶šÎ‘Ö0_«««Ë(H~ƹA654³·¢©±þºYߚк}ÀU F½ùÑ´©±MÍ0AäÊ_ÛÃlD‹ªU¨7禆fÆ6‚5lDSc3XÃFí³ªõLî3*¹ ’Ñ…Ö9cº[:Òڂ豿E¤µEëj¢ùQe ld{¢óÇG]µÄi››1<©á®a„»†å<„»†qaAA*ÏA¿.$ÃÄ|Ìkü.‚CsæaV¯ƒz=£¯ <úŠöÙðhP{À°‘1"Ú^dKµZž­clvÔ/Ûh?‘Êpl˜©sHû͇%æ+`ÓjÕ^åÉúò¬67543žâëË` w rÙ8ÀÍøR"—³|þÄCFi¤‘FvXbëL«Iûp8qqF;ݨ(ñ†ê–« <´_ r“u¾ëƒ©~Ÿn¸ªQ­Ú£fË1!Y…dz–ºGÿêÍÞhËò¶Í¯*S¤$ú˜Ÿ¥±Ðy\Ëü¤rÉNtþê|Ùb0Õ1™‘¶®fÉkBæ–qÐø=-˜®9ƒu}ªãIZ+›x4¯‹{¹ÅU &[<§:6õ³*A3ç~VOYŠÚÔ¾Ia€ÔlçhJm™ã2ç‘þ?©_ŠC¥VÕÍOÛ4Ž74ÒH#4® ^7o¥Ý*¤~ßøl]}­$˜9Q2‡mnj›¦¢ëØÆ÷½*—Ø’Ulš‚õïšxÄeš¤È«ÍÖnŒÑé5?t®Åýy?AMPQû"­Eú£ùrËá$«ÙˆKªñðLó’¨’×]9>‘ËT$3U¢JâÔ}@2ÓÜ”c2hlÒW^Ú¹z<äÙH¯:Fõá+INdÙTÉ¥I2msFi¤‘F ¼,'‘$¾l¾ºúZ»¶¡•„È›¼Í‚fô¯’ÌTcTI–i™¼–ïkçw-–7¯Ïyì7k›°ÎtQϱÃãü¨$““I.SÏU×u?“ãV­oæø%,ýº ”m·Þc“fÑ4»OE°] Þ¶ßë½9ïêûTßµºÈ=¼æ9жšiˆLu{Âã§‘Fi¤‘ÆÇ…Xšz“žnJKV¢ Øõ'€FRÝ€¯å½¹úß¿¢=áç•}*qKåÊ'¤JÒ¹– æ”RK€V®òýÈ%¡“»Tõ´'«6÷ßv,óû^DÎfíS÷Ù¤‰Ô}–`¦JH³Å`šÓŒÁLÌ4ÒH#4> ¸(ûÕ+ 6O7ªy.ïaǽþ¹Ç#GÌYoêöG„Vøx#ÌÜ&¨‰<©Ô‰p_¾÷¼Mt^Ö5ÁÀƒskPòÇnm÷àçk°lKlÌì8 IDAT6ªîyÑÜ.„FõÂð±¼.„Fò‘½`%ºòºQ¿Ok?x ¥ýÅ`“Á¹5Z{׺±óG›QuÏC€h®^D>|<~uÙ VŠÏçéã ŽÖàôË'À2&#ƒß‰«k¾©µ÷fW!cžÓ?o¬=qîõb–'ú¿.Ñ„3]zòâù¢)Àä3`“QT\ˆ#‹¾§µx ß]·U÷<„òò•xai¿Ö~ûÁrôíÚ€ì+QYY‰Ø²V­=t ‘-Èþ333µöññq­ÿ@a@kkýF{<.û÷º¾]û¼®oøxYÙ™ž×78Zƒ±Óãì×W…íú@V¶8oÛõ€±ÓãÖë›±ãǸÊö‰7–ë{¶®`degZ¯ïì`'ÞóE0vzÜóú9|<¯oÿdegz^ßÝ»wËþm×Wíßv}Õþm×—ú_ž:‰ãÕo-żg~~…aϭ܇$0ÒYüÚ@|hd degb;g¸ûÊU¼Û³“«<;)ëÇØéq¹~ÔþmëGíß¶~Ôþmë§$ÜÁ¨¸î¶õ|*ˆ®ûÄ:²­ŸÒ§Wàн{E–õ³•ǰ…Ø×Ïó¬wpq\Ûúù¶a.`_?5§ÄÒe¯aõéÖõ³i¨ÁµÃøÜan]?}Cå(­ÀŒ#—“ëçÔø_Ü}JÅ$•H’ÔJ¯i’ùé†Jªy.¿-< 0^ÕkHVG×ueHÊâ¨Û&"h\‘ÅQ·Ø­ÖÉœ¦Ÿé&¦}HH93‹Ýó8ŸB¨•”ˆdªdÓ´Jºdˆœùï w=€ÐÍcðó:AX¶%UƒóåÍ#–§„ÐH>fGýø‰só8xJk/í/ÆŒÁ눛‡yÃØù£Í¨œ@Ü<è†!ÏãêfGý¸âæA7 Âé—O`Æàõò摱ãDzí™-û1o3žÝ7*ogë’*‰‘XÞZ·È›Çì`R•àÄñÉgÐÿÜ/åÍ£èÄcÚñ¿»nžÝ7*o·,×Úûvm@ëöyóhÔÚ#[‘ýgffb||ÜÕÕà|I>âGã®þgGý¸Ï!ñ¸ÞÙòf ^¯ë[òÇn`n Цþ£ýú޼.äädÛ¯oü>tžÂÒÓ¥Öë«î³]_uŸíúÒ¾ÞͰÀ>|kãÄõÅñ¹¯ ""ðå áÄHílþyx‹r·p®ïqÑ^¼Ü~},úŠðæÎ™k½¾/,íG9Ê‘3?Çz}cËZ088h½¾D8çΙk½¾D8sæçX¯/Îñ–mÈ«)ÅÁ±“˜ààís0?k!¾úÌAà ƒ Ë;ïE,>Š€XÈ@  µ=÷a>gøçX= F1€Cë Q\PŒ»«&eàù¹5È^ú*ŽÍÑú/y&¹~kXܯõªM®Ÿâûã84T¨õ_Z\?½›WO½ È^ú*æå¢Éõ“Žùµ8ﵿƒ¢à¾äú9}ì<Þ="æ§øþ8&mB×½{­A¿›jÞÃ+§²¢æôƒ˜ŸµÖ„±¸Š[0ÜyñxÈæ¡y¸££gë€ë™8Òu‡‡Ê‚bô •£¸ s»Äì PT¼C®Ÿ¥_y ÌAÑ{Y×OpÃ0ºžôãöKåÖõSºa‡Ú˺Ø(×OkKþ’á òdœ] ‡üÐ:¨¯&>hÁVÇ[E*¹@¯nkWc?È÷“îUïLoíÕ‘é’dÁV~˜x~ÍD£Û“dIÏÛ“äA}5‰d86Ìl 6ù©÷ƒ¶TŠW6k¥±O•²!ÕøLk¥º¯q}€¤¼O¤­E#•^±«ê~ÛgÔ}¶ìyu‡»ºÜ7Q؉_>J•dÊ+²O*É”ýÅÀë B$3‘½ßuh"—Á@Ñ“®v"—›Úw·>áj'rÙ÷Ä j¾0ÇÕ.Éew•ÔSÕæÆ!—gëºj \íD.o gáÞ]^K%—+÷!Ò,TrÙ°¼ÿV¯Ÿ¿J.ËËÖà–ëθŽOär||eSÇ\íD.ãGã(›vÊÕNä2{ö_58E'óìvÔÛ–{ö?cðz„4âøç^ÂÞò \¾ímÙ~ù¶·±·¼Ç?÷>Ö¶\Xý†l¿°ú ´¶µ``áóøûÿþlÇ…Õo*ío¢ÿÛ1ð÷ÿ¨Ù‰e[²±óG›eûÎmƲ-Ù@ÍNÌjçäkE:øÕ!„Fò1«ã­èJû‹qúå²ýôË'PÚ_Œ·¢cøá/ ±÷¥ ì}©ÏlÙ‡g¶ì“ïø‹BTn]‰¶ý-hÛß‚ÄH‰‘ˆ|_¹u%š¶Ö£`úvàÄñqâøƒò}ÓÖzd½GovøÊQyü¾r½ÙUÈz1ŽÂ¾çðz1Ãî {dûî {ðz1Caßs(ÚÕ‡óESÙОœÿ í8_4E»ú0ôâ,LùÍ È}}±lÏ}}1¦üæ ½8 ý} 0½÷³(;y‡l/;y¦÷~ý} ð‹Ù˜Þ{Ê~ÿÅdû￈é½7á;³óž9ˆß¾7Ù¥%øí{³1Ú}H[ùµ=¸”…üÐ: \ÊÂþÚ§µöÉÕcàb&—Ü‹9øP»Önöú༔ýÇŸü§”ý~B·ÆFkð³ß]FÆ¼ÍøÙï.cõCZ3ºîëÂÖ—Áò†°õÀeøŒŸŒC÷îŦo“Ï`Ó7‘½d†l{fÒ>ÌË9ˆ²5µÈ.-AÙšZÌË9ˆÞ§«,)êA¨3†üÐ:„:cXRÔƒ3uâqâêVL.Ú„ÒõÏ`rÉýâµhÎWës{_ª@ÙïûTÛþ„:cžíý;PºþÏö¿DLÊ­ð¸ÔA‰=Ž·b`ûׯCä­…ÜÔŒŒ†ü/÷!ÒÖÂ×—išŒÌWÀgµà‰!>;ê RBOp&8çu‚d>Ïj4Qt©&Áï Auëõ°ã !p²Æ˜$*–šQ€ÿ&zÅõýÄ8Žx.ïa_‚@Ä6"oâ`—¦%‘»ŽŽNÞÊ}ÁiD‚µÂǧåEÑ:æŽ$ º5‰°|AÚö·¸49bÀÇÇÆ5ÍÍŽöNN‚ï%ÿ„“7Ùx|ÁµÃ†T1¡×H„—Æ*³žáôŽöNVW_Ë;::5qxº1¨„E#/>AŒHi1Ò6 a5 ×È%=hœ­cŒ¶™ÉþëïjãS瀮wôÕëÁ|¬®¾–gfeJ-Nžâ­Û`MZ‡¦p½¹ßl'ÍÏ™àüÄú¦}êeW³ðrù!O ­XªL±Ô,˜fhBœ,˜½[Àñ¤ 5ã)AþzŸ®ÂàçkÄZŠ!éBMòw¦Ž!–×…ÒúàñiIêøÿÁŒÁëq¾zžÂÒe¯a0št¡ªäµ @pí0ºŽ$]¨*y (­À¡ï—.T•¼ÌÏZ¸ºæ›Ò-Näò[ïÄÑÎϘÕÑ"ÝâD.}ùMxçàtÀ™®Zé'r¹(w¾Y"Š ugÉ+xvß(vO^‰"<&Â9¤ õLx­Ûðƒ)M¸ÂÚ@ºPÏ—ü ýÏýµS+BK_x {Ëo•­»ïÌCÕà|T¾»ãB±a´¶UH‹Vãú2ÌŽúñËÄ”>~ý?X%-Zåw}3¯Gç¥>Äi=ËÌÌÄñϽÈDrŸßïGühÂ> ÷åää #BIíξï%5U’IsµêÃò½Y NhÉþ/ù^%™4W«×òÞ—*´v?¡m¿î&§ñúvèír'q¬>½½OWáG’ù°úÞèT…o\á˜}˜ãLÃîA2Y>0»ƒã på*f¹ŒóÕó9á³EÓ0£çUœ¿2ÏLÚ‡½·U¸HæåÛÞÆ3܇o\Ù‡ÖÕ-.’yaõà£àê\ô¯Þî"™V¿‰ñ­¨‚_”:´º‰”íw_¹š²Ý ·0a†[˜0Ã-L˜á&Ìp j¸Å·®Ü‰gÙ‡«>„Œy›qõÕ‡äõÍØñc04çGÀG Àò†ÀG äõE]3elÀ‰E[³Ég€wgËë«z=Ž,ú2ßÝ#·M¼°´Ë¹m"¶¬K}rû |D(/,¨@~háhÝ> e4äw%ŸL¹OJ„àÒ8dµ’PR mMW°.I(m:Œñø¨$”tST-=áã’PwV»2‹l<<‡üÍC1;êG,$yå‡e8̼‡ÊË÷+÷Á„º¯a¹»ø†º¯¼l«]î{T¼¼}ð€Gœm§;ÃŒ…ü`ùâ7;çÂGœ¸(Îa]!°h°hšØ†Óæôßóê9”„»QîFÏ«ç\ý‡G_Að© ø_pŠF¨ý{ä$JŸ^Ò§WàÛ#'“ý[ðó+©£~Rz› â/SÁ ·0a†[˜0Ã-L˜á&Ìp f¸Å'õÖ · ýÏšá´ÿYóÿ÷/“ÞºñªÛ#±Ç1Ý!lTµEÝnjhfR0½Sqt&­^ä&dɃÒöÙ:ƈªÄH-¹GýWGse;m÷°ãÒZ©VQ¡íplXº×,I~Ÿ¶{ØqÅ¦Ô —ÛÕZ)›U’C²8GÃòɰ ´Á‡ðhPZòøÀòœy¡'%@Zê¾s98á=áãøûhBÒ’¨ºˆi»£½“×s8v¤Z¶Óv<>ŠhÈGK2åµ®®6y^†u,~´.TK& ‡4 ÕzIÖ³(Üd‡¦Û±tŸ cvÔï¶|3ðHk ÆÇÆáŒSŒ·½S’f:&ö×)ûÕs°A¿IH©JrIkæ„ǰíçîF3æÒLò1c.]1¥ŠÕ’Üäj³ïôr<°KÃݨÜ)-—GÖ¢ O"øT³£\Z.%^¼‡”>½3/KË%¡ûW¯˜ƒÞͯi–K‚(êGbxX³\‚CèBNÐ,—„§óp/F,ű—’–K8ü!+Cª1°?i¹œåü}»}9þ­~?Šñ0ž¿”´\Ò ûÞl`ì$ˆ¿†g÷¹cé.eñQôõ £ÕK7p1:ŒHïQô[bé¨ÿ¿ù êà|×͉ú¿a÷Ìîô»nNÔÿÔ­ÀŒCnrIãUã333‡t&®Šß,50PÒyñâE”Z` Ò™¿h a­$’¹³ä8  CþoÓvL÷Ââ|ÉŸ$É<_ò'rG^|¬xwð?e\ç»ÿÈÖÛ/ÆŽI2x1ÿ`Dn\ê–„ïRž°ú@ƼÍÀKâ~ôd–.’1o3XÞÀ~ñ@§Þ£º_ü/¿D>cüvM>à3ïë͘Ը¾ ±Ú>„cÃ, ð|‘Åx|ù!²V{vÀ;‡@äÒÖ¹´!È“q‚6TGsAäÒ³†¶ ñTèý}a­Œx6›5ÈM\ kïÁIÈíG€òÃÄGõ¹2³›# ZФÔõvÈ”çñ…µr¿‰^ÁmáIÞ5,–’$;¯®G§91–ÔNa€NŒ’IÄN’K硚çJbä"÷r ™´Ï¬Giká‘V%fÕ!—Âý/È}ÒJØ otÆMµØ3³’±˜¶úäŸ6¨1—æ~ Iôm5ψ‡3ç¦'€®AI¸ÌÁÒ^ÃAÌÁRç=þ(ú >Dד~„bÈÁ/ß;Ï3B¤½ ¥Å!”É÷Ĥz7 79YJ{7 ² ǃšnr²”&†‡÷¢ýô±ó¢?ÇRzúØ€ó^´oªy¯ŒDwö6Ôœ~›jÙ솵¢£x¸`›âîdóaˆx=‘!zýè*Ç‘.A6+ ¼_»yŠÖÿ×ný;ÃÆeS´þ7,ý¿à´?¼ì&­ÿ‡—‰þ)ÔŸúgÖ­xeìE< oŸƒw©õaAâñ>ôõ #òãZÿrVáðÐ.DzâкBÙNx ~PÜâ&úúöŠ[ÜD¤w'à¸ÅÝ>h.qT—¸ ªK\Y£EŽ3þÅÀêE;ñ­?Æê·`Vœ$güËÏæðå7ãæ¬L  ZNy0ãÈe,ÊíÄgf‰p]k~Š])Æ÷ýŽ«ø~ŠöPì4B)ÚWV]àYçÝu®öHÛHÞ‡ntµ?º}: ˜îj!+Ä«å6Ð×·صA }ÐŽß»Øòˆú bEpgžxµ ±¡X_&^-(ÿÎzà®/‹W (>5÷õÅÈ»ØÕNñ©e'ï@Yîîv'>µì÷_DYÞµ¶Õ÷îDï#UÀSñ—*fwpœÉg@"_«bFÏ«8¿h0iâÈ¢ïျñŠg æ 1ìƒPŽ?ýŠÁÔn°ªuÑ[ü˜jQ3“T¨®pÓÍÍëâáÑ 3_¯µý/ . ê§I«r"L edZWÍØÎ‰¤ˆÌøBÓœ*'Ǻ­f{—­©•ú”5Û;ÔËR‡NÉö.]ÿ ²³éÜÐt/màW‡d¿êI Ô/ú/*.Äw×­À÷TÒ #”—¯Dß® ¨X%l€ýý{´þ+++Ùòˆ´ íÞ½ÛÕÿßü‹Èøþïmíÿ†Ý/Þ®\`íêV‘ñ}iCŽÒ‹37§4sÕ="9e&ñªgº‹y–“J{Î }ä'u3[(¶3^ù à*[?ǯº'\XÑ®âq´àlB<èÏòùqÎyȽ9KŒÿwµà'……‘-¼7_½‹Ç„ÉÙL,¡8@¿ó/l&–§a~¶ÈÆ5K(påØ˜U‰ ð X•~‘•iU"Dø…Ôyt4Í×®?tkŒækË;›5 Fóués¥Öc_+ÔõoC‘#ïCš—„U\ŸÿF¦Ï+×ç½ñýíÎ÷WŽÉþîúñ&<÷͇­Çkå>4$Ž¢ÍW¨Æ¿3ÜýÊoñìü[´ãz“KþN„((È«)Åh÷!øÁ0-´cÇ´öå÷bíÓ˜Ÿ=Sëü"DAÁ?Çêñ¡v¬<=–¾Gü1 HÖŽ¦ÌnÊè%²™t w&¬B6ˆX¨C#±aÝíEðšcÿ ÎÀ™…Lzµ›'dÊ™„ÙÓÒãÀ”/2  YÆE¢ W³JȽ¥‘’ ˜Î‡ë×XÇÿgÃÕ‹"m-ÒJhƒ—,'†¸iÝU1ÜYÍ'²V§ê›®3%ö4®/ƒjý0P{Ô˜c^焇˜"óPÂb°&æðQ‘Õx-:¦È<ŒnDšDqÀ>¿ —t³€²5ú¾hÐïÄJ „:õ}]µ*1ا׻÷‘4‘É$i"É’ÒDç-$“ÈeÕ=Éþ‹Š 5¡ã¾]À2 dÿåå+% $r™½`‘$±•••’ªäþæ_Πè_õþ‰\À »_Fy¥Þ?‘K˜ºõ*!ú'b)¥ø©êÎj˜ÌžõKB ³êü`É,ìƒ×KB ×cz§ š“|Ir¹ú›Âì»óÇ@Õ=«%É$rÉ|Â:ÅÀ,_‹$™D.åüH´Ÿºla­$™»ÇX P?ëÅ8¾:‰K’ÙÈ8Z¾R¶ö=§…³¬gGV'¿Švõáî+Wµd“wfÝ*Ýüwß™‡ºWç‚ éæ^9Ýžx!g•tó—ßõeÚþ-˜( wk¯&‚OµW¥O¯Ð^åùX„Ö`÷.1ß6¡uhjóoZ€††bþ+WéöòÇvç4²"­-ööŽ(Ö3޶6]oQÒÑòJI.à®oBÕ=a7„Üâ¡!q,£­Ü'I&‘K¸û•ß"{Á"lçL’Ìwÿ“KþN;¾*µt1v ÓBK´vUjéRÇ0¦Öé¦ÔRHcº¼AÖ‰lf“d&3}¼à$KC!S$qÓÑÑ 0h$“²oãñQ™½L$“H$ ²j‹…t¢væ¸M¸D¨ LTÇ$Ï®þ=2…]±£p“Wõ|µ8U:·z†™œ'“¤ê™&ýÁ2 imIÆIf :‘ ïñ‚Š›Ôw åÁÏç7z"z>?àr© @€;.×”VJœW‚à¶lòÑMÚÉ´\ªóefÕJTG'øÕ!WBSC3kr\9‰ð5Krñï£8[ÏÍí’ [ŒÁ5¿‰a%Y+£ y=œ0Öá<PXÅ;R ±"@ïMb­Ÿ{öÀÂX²*‡ùžR;(D@¼O 1.ÆëÈIIÒêóZJ£~H$u/9ªà&™’\Ö³á&™D./Ô3:í$“Ž“ ¦LŽ S&‡ ’Kmßj±­’K »_%ëªä’0uë)`·°&Ö|áA,Ýüšë3U÷üÿòM?6‡ q‡Íòqœ› —£tÄ]H€-¼ŒÔùÀTu׺¸zŸþ¡¨†]¤¼™lWÔÝ[2ÿá㨨‚Œ¨‚Œ¨‚ŒvïêCåª ìÞÕg%œM͈´¶ ©±ÙJ8ÐÖÖ†††á´­ûg÷%Æmë^ýM´­ûþç~©½7 ½ “Л°zÝ¿zMZª»õV·ùp×°´T‡»†ÑjdÂ;‡¤¥:Ø9„ퟮ0ú¿ZLì:~6rI–’…aƒØÑÞ©%Ž˜$Œ‚$–ÉTÐ{Øq¦Z'e66#íJ½Ý$”&É4 ¥I2MBi’Ló\L’iJÉ´¹ÅiÛtÓù2€q…¸Ìj\àl=“¯uû€´ÈIÍÊŒÙÞ>.-fD6“‰MËKZÌÃV-Íým’KÚvö¹$²—™•©ÍYªŠ3t=Aöˆl©sâåî¬æþº$©T‰¥:?á–ó@â5K„%qVAR_­‘%ÐèRñÑ‚¤ÅÏ2¿¬RÓн4ï$ ä\m ¥21’\XP!nNNlvŽp0( IDAT[[.hk[…é§váBÎ*qsÊY`H#—¼W»Wk$S%—çÐŒ™u-ÉTÉåÍW;ñ»ÚZ+Éüþã{¥‹¼¨8iM#T¬Ú*]äåŠ5дñQé"¯¬¬ÔÚþû_gãÈuGñO!qüuì5½W@·+ êžäƒ[ø8Ê/­Å~_ÚƒŸÝøÜ×(41Ÿj=Œ¯½õ b=ugoˆ2s!³$þ].ž,pômHf €ˆïleæ$³Ôûã[œR¶„»üV¬úÆ {žHZÁ„»¼"‹Y¸ÆOœºG¶ wù=¨²ee} øÌÙqËuΞÁÀŽ]íÓ_îCÙT/!V뎜~jʦ8u ‡¶»£-KÂÝÉ$%¡‘ÎàSA™äCÙä*é,}zE2ɇ¤‹ÒIkÒ´4hMš–F­IÓÒHP­÷6©Zïm„SµÞÛçü¬…¢Â€¥Ë€ŸoÔÛ<)‹\ l3¢Š Š1¹HXAO×ÏæÝ¤µ«a[«—ºÄâÕ0ˆáŽj—X¼ñRtmÚ‚ù)ö êø©7M‘ËF$˜¸‘Ù3ÁÁHœô)é#ªº­Rjx.jx®kÿ¬!Únîa&‰m˜ÎÍ6ÒÖ¢ë3:®ìC”Di5st M]1š³šÈ&FÀU‰!@¸Écy]Ú÷ÕsœÉ¹Ëò¤žc¤µÅÕ®c®v²ÊίiÙR-—Οzý#m-<3+“¬ƒ¬£½“©:“ªå’þL $+Ö˜•jL+¦iÉt%c)ã'2¥ºÃil4/¼N„%<\¿Æ:¿ª•11¬÷OhêCŽö¿ã¸ÇÕk¯†KÐøl™âuµrŸ<¾fáThÔý¦ ;à„å€ÜvŸ9뾉‡»†¥ÛnúËî›x°sHºí¦Ÿ7ñª{ÙÅ5 WÙjéú% &Ë(À™ð0X‡pÕ’ë—,˜Ù á|ÉŸ0½S¸jÉõkZ0É]ýÝu+\ñ‘@2æ²o×¹­‚Üá‘-Èm ¿þ>&þð+w3ºDU­Û“‹±ë¿b“P´ (Ú&¶MtÿªM$?XýÐO]íņµ`v¾Ûè¼4Ú/’Ÿ°üËrÿêo¾ˆª{r¤{ÜÜÇ|}˜åóK÷8mߢœ-¼^ºÇX÷}Ü([S‹¥/¼†²5µxgÖ­®öPg ¡Ø0B1MRPºþ”>~¥ëŸÁ…œUöƒ8ÄÒÌ&'±4³É%H—’ˆ¦‚#‡E&ÿî]}.©+@¬ÏøÑ8š›]RW€XŸñx .©+ iÅô²â©ô²â©ô²âÏË9ˆWO‰túÕ_Ý¢¯Á%E=RÏç‡HnU0¹hÞ="â7³—ÌÀÝ£ojíƒ9?k¡‹\1˜@ž‹\1˜ÅÅirù)‚bÆèÕÔñ3KºÊò™¥Är‹«bêK§ÆÔÑÍ×Ë5=Q»)ä.ãßDÚZ4!xWü!änVœ!«¬¦‹iÔÃæH–4+ʘ ã¬Y’ ¼Ç5~@ÌõDºŠÆN ¹ó¾jq×Ö 0Ç¢¾ç£®c™ïͤó=$šÒ’é‘TfŽA­¤ÉÅÀfÆ8Î…¾T›‡/Õæá\(Ù¥m *ˆTRA@ÐÖ­RÜì_H I+&!ÕÄ:3hT2ªZ‰‰´ªd™%½šÛD(éÕÜ&BI¯æ6 “L•\Ê1*$S%—•dÚÈ¥y¬T°ÅwšÇJãýc||\þÙ?—Ööx\þýYñ1‘LÕ‚i‹ÇT-˜¶xLÕ‚i‹Ç¤uïµþiÝ{­Z÷^ëÿÕSK¥Ó†cGªµÂ&Þ=ò°´`zªrya"ƒUÍJãÓƒI€ÛÅ<œËX2éOhdJ‘ƒq¹ÃAÂÝÎ>5©‡$‰´}Ðk„ÛH¤W»ZbHÞ܉˜™–2S¢†ÜáÔ.oþ1·|`T’¹Ã²]Õ4ÏA=–J<„žgþ½s¼xk4rL–eùž1X‘„|ïhgÊ“Ð6¡ Z»9Gª XB)i#u43þ’ Kdz$®H¹#þ’ ÆñZI¦iq5bDÕc˜çÀØp š/9Ö#d­Œù1­©fZîRÿßЮ¹¢AIíªªmT (ÀÉÐTJd6ŸS¥šÝzl»6k¥ ›µRk?•JàE@uáÙ ºðlÈ^°È3öRÅÉTWaËTÿ$Pó…é"ïÝüuY‰ˆ°9”t‘Ÿaš‹pâ09™"]äŸz3€Œu+<Û9°kƒgûéÿN[<Ý'Ê *[1™”9’iÆdRæ8QÙʈÉÀÕéÝUÚ[J%œ­gÚøßŠŽií7†³äømWÛúQa[?Zû'µ~NÿEqÿi˜¸efC'ЩQëbw´w2UЦÃGŸ¥$–7„ü<8ÂÁÞq× Uóý’K›x»¶¯(­–3’óE¯6+&àŽQ´ášÃËÜ“áNøün2¨º eòµ¶;¯©úŸ¨¢Ñ§D,‰P¾^,¦Ùgù̇9_YÅB!š¦KžÂ¨*ÒG ›ÔDíEÅ…¸œù6öBOŒ(ùc70·—ŠÞÂ…Â7кZÏn ¼.œúÒI\¼‰þÕÛµöÒø}è <…¥§Kå1Tç& ByùJ\(|CkævÉ›xee%.ô¤€®¼nGkлY”ô³Åµeð;ñß#ûP¹Õ®3Þ„ÓÇž@ÓÖzk\Ûu‰&ï@ff&¾«”AÜYò ªð=á1Ì3Âú”2ˆgÂØ~”£\–ú‹(eÏ—ü 3Њ€ÁÁA|íæ)˜—£n:Ÿ¹sæbò)XR¤WH¡óÉ™Ÿƒ‡—Ý„ÉEkôvç|ñÀWŽâà3Àb±tÙkòzÏ3»7ìAדcÀr\;Œ6Ǫ™3?‘ í2hú©]Ž+^ͱ±1Üugž&‹Cz•«vö#¿m+œ{ ô*[6"»­ wßõeM‡ô*·?؈]«*P²¸[ãdÿo#ˆÌ¿‚˃hÝßbôÿ¢è´ÿ{ JËVHbœìÿMt¡K¿pN«£èæ@MÐ]…Yí\«£RÄœ­gx+:¦ÕQ„åxzt 7†³Ð»YÔ7çç™-ûð­b}²¼!×ü$F"ðå‹õ‰Ég\ósâøƒ¢¬éêðO¡9øuLÑ}¯G¾ô.V“’Eò'¡üÒJôÄZàþã îk,ÆS­I+ñ×Þú~º‚ÿ÷þ·°kïf\}õ!P%r“Óú9üÿt81Ý"qŽÜä´~úv=¼;[öŒÅ×c¼eÆn `¯åÿwÕÎ~øÁp´â.´Zþ[6b>g8²ª Ëÿïöa÷]¤ñIÁGVBãú24543æ+`D.UBI±•ô7œoÎKþóNË‹bZ^ `D.£!?óù…õ`$ö8à+À™ºä¢§3Ñ…@ 8j"!<”åòleóá>”í !$" b©n‡GƒŒÈedA‹ɦXÆ’ä21ÛG¼¥LÍ”&³6*äx\®{&ÜÚ2¾ŒkOÆN;àH×$†¸Ì†æÉP[ÿá%ÿ%»©««…¿®þºi•V“·(FR{¤­E$xM*Ä… „/õ܈x#ÒÖµ9cÉl~R'°….˜ß#âH T³ó9fçs¨kìlcêñëïÊ„0ê'Õù©ÒLõõµ¨¯¯ÕÆÓº}ª}SC3k"ŒÌ¬L˜Âôr^”„²OºÏÏC»2–?‚Xþˆ–!®Îµ«È}}1Vô÷aÊon°&h”¼ ͘ÞûYk‚FÙ￈òï¬ÇôÞ›<4r__ì™=KÇðÊž¥cxeÏ~kãxà+G=L|ùMؽag‚É¢ÜmˆlhO™`²{òJ|ÿñ½IPënÿ`J*VmÕH‚Zw»vjš6>ª‘µîö±?MÇQ(³tM ¼µ•[WÂT› <)M[ëe–®‰½/Uˆ,ÝGD¶î¡»lÛö·àbìX¾È֭ܪߖûvˆ,ÝEÓp©cM[?i¢ÿ P‰±mÛ~»,íW‰± ¯ý‰x ~lg?ÆÇDZäú ®ö¾¾=` ?×~ ‘Þð=؈x<Ž;¦Ž#NãZá#K%‘/Ú¦ÔÕÕj7uÚ¦öÍy;pq4,ÀÍÚÜWà`e7žD~m˜)Ób y]2~R%™jf7Å'ª$“Æ«Þ@ybˆË¬^j¯ AX…ü¡$„Fò)‚Ѽ.Nä²éåfD´€w¡q}$áLˆ¸ªV V[V[€æÜC.ë°zçm"ôZ+ßÁêèènbÅ•NþQ,¡&{3¬X3ŒøG‡°xõï¯Vf™¸¥W½¾@<©0ÜYÍëêk9%‰ø¯Åô—û0<©P~W×ÌÌÊÔˆ‘)zÀ!­K)¨î¬C"ˆ ÍhlhvÍ3Ű±Ž¤:ÉpÑñ×—¡ý‰0ÚŸc|l\þOLt~4nÛøá¿V—>õ¯"?´Nn—ÝxÒõ;½÷³š8ÐÄÃǃŠ„gÍkí£¯ <ú l(ùc7¾vóÏ„ŸÐh–MñLø)߇‡—Ýä™ðœ[ƒ[®;ã$¸ÍíBÙÔ1‘x`AW^7ʦÒ«OïÄ_9êÙÿçsìްdzÿG.#²¡Ý³@ÔþÌÙe©<ÍâQkxúË}²TžjñD­áé§vÉRyªÅ ËWÆNŠä …Äã£"yÂÖàðÐa—¾  6k¯y¬”íkQi||uwê© +»Yó¼ YG}úË}®šçw_¹*ë¨O?µË³æyŸ,|@2fÌS'Ï#‘ƒ¶ÉRÉö®âáú5’¸Ñ ™¬>ñø(F:ÝOâ$´|Í0u-'ñ¦ @—.óBD3–?ºÁÉ”™Ø¾ÄB¢´]¸kX’L䎳Yyqܦ—›Áj ¤¥"² ùôé5>‚I,‰@úk{ õOµVhZœ¤C©B±NúòS·3_“ךƒ©¤MýŽyšõÐ"Ge{Oä‹H%ÁÔª3­yæ{s|*ɤc´¶µ µ­E#¨ôaºÁMù§úû£šÊ<¾×ùM4~[=v²jÒ¸ybˆGÚZøÀ[ 1ðÖBDZ[Äÿ§Ìrµ]Z˜œ°Žˆó—]_ÙÎ"H…ÁÏ'cЦüæW{,/ƒ&H«ŽC§”v7ÉQcÚÌøK ùÿè2HŠiÜ2H&V,îsea«hXÞìÊÂVQ^¶Æ•…]tⱔǼý`yÊöÐ;q%¨ÖWÓÂ@³¾šFšõu" £—%Ùv,k»aé}vß(î¾3OömØÖíRŒÜã*úŸû%Êïú²ìÛ$°SëÕ?ÅÔzöïÄÔzõ_58?i‘îæ®¤«ÙQ¿´Hó:¸’®f ^/-Òjõ¤«‹û¬óCçÓ°¼Ù:?t>åek¬óCçá*Pô^!Ž\§ëÀö„Ë"å—V¢ª®ûTëaYàko}?»ñ'²íê«!cž"µIQ¡ÀCªèÝÙÀdQ +•TÑϯ0YZÔ†6ø`êM«xvR†VZ4O|ªN‘ õFK7ÈŽöN!ž®¸Ëº9ñ†Žû˜D«ågœ¤³ ‹Ú -“ز‰êh®WJÉŒòÐH>¢¹]"à{Ä)K !ÔC4èG4èG(6,K•ɸK'æKûs\äM/7‹c;²©±Yü)É^ãS%„H„D°©¡™©ó Jïh2K.Lu ”YŒæ&˱)r/4VÕ½Í|2ù†ù |²ÚCZNx4(j¢;5šÛåÖ‘ŒEZ[€ S)‡Ú¢ÚÍ{À;‡À;‡Ðͧ8¥ÞnªL_“L’æ#Í=Å»p‘+Ê ÷僩nðkmWcjÕþ5!yªÝCïu`Ž[I…cÃŒH‘J¾üWŽ"f^ó’™%ªy¹—iÜj¬èOZé233]¤³±!i¥ \¤³ü;륕.¸HçŠþ>iÅÌÌÌt‘ÎÆ†fiÅ \¤³ü;ë¥3¸HgðÀ@ÒŠYÃ\¤sSûiÅdnÒÙ÷Ä ´bNïÔIç·6Þ©Y1ÉzIv_~“fÅ$ë%YØånÓ¬˜d½Ô,ìÙ;¥óÈuG]¤sV—VÌþ©{\¤óÂפóg7þD#?üE¡´bÎË9è"—•[WJ+æ’¢¹lÚZ/­˜“‹6¥Éå_&Ùtòš”øUD]!;²=){“¬±|ÎðЪò.Óf“‰2y½*øèÔ¬`•D2€IÂç³ë¢©õÍmUaœ0î+H™E®fœ›Ÿ!2iÎGr'Ó\ˆx(Ùá”Ðãó+e ¯±]ÖU÷è_ÛVa‘4"Kuক/…ºŽüWÜåüÔvÓ (  ££SÆe654'u0ïÓ|«:¯\õÂý¡Šb0Mx_ªñ«•£íO„¥BC (n×^UÛ;::­Vh¤ºÉhhâ¦K½äÝÀ3À<€[Ó/4jñøtµ—ÆïªRÀ}®öàÜ$°_n›20O*Û:„ ÌÊö'‹#‹¾‡[N?(·M¼°´eCrÛDlY+ʆÊ嶉ÌÌLàì™ä¶@axy,¹m¶À©SÉm¼ªèï¯*‡»w€·mšÁÛ¶Àa™ØÖ |g=ÛZ­í+úûð¬ó ‹Q¬±¡­€+vŽPþõèûžÄ ”Ë¥±>WŸÞ‰ÞÅUxvŸ=|ãs‡9^_Îкݾ1ãÈeœ/›‚þçvXÃ78$³ ÈÞ d»›Éd˜UÀËíOÌ9x£ð5À0Pî}©+ðö¾TËÒähÛß‚€Å¸)Èýlôì€Wø®”)zæ ó¤CÊÕöÀVDIÊU?îü¥ñi€'ñyÿ=])ù¸­@×w,‚Ó*TI¢rþ×"mC5ÛÍýfFùG2÷i¤ñAÁÀÓ:†©u ?îùQu6 ^:›/M‚©³yËug0?k!^;‰wfÝêÒ1,›:&Ã@.,¨pé–M;…â‚b:Œ 9«4C@ˆÏSÿ¾ÓËÝóô'䎬uÏmì/Þ¯Í?õO([SëªÖ¤Š­‡:c2‘QíŸPºþY­Ék}f<•¬e[ŸHˆŠP^ëãÿÙ y®Ïe[²µs0×gh$_ö¸×gi±ì?ƒß‰«k¾)Ûz³«1OÈ ­~o¬Žd¾ÀëÅL(‰Œ §<×%šp¦+é;_4EÄM¾;lÊÛÖõ©–|µ­O*ùêµ>©ä«—ÎæŠþ>¬vþel:› Í` ž:›åßYì¿ñÉë{ù6]&ÍÔù½°Z—I3u~/¬~ÓhOêü®â 7Ì«ÖÚß~µGû}˜–ÕÚ/ކµß‡©KtU€KÇÖÈ߇¿dPíYs"=;kˆË’â¶”˜x?Ï6>SüšÈ¥ãIíD.©}à­÷×?‘K«è¶³èTOp퉪ʤ‘ƧÕs‚ vúñúù^U.Ý›_Ä¥K|àm[¤{³ €û0ßùñzvRÛZ¥{óî+WIxÞ¹y~¾˶dãÀÆÓ’:›ESÿ¡Ñ by"všìHg3''¥ñûp(ðJû‹q¨ü0]g“45Õ2‘ªÎ&ÅW«e"UMÒÔTËDÒ¾Uœ!¯¦¯:óEåìÔùYÞy/(-ÊÙ©óóϱz¼ë´S9;šŸVçæ]tâ1|íæ)øÙï„uêÈ¢¤Îæ KûqûÁrlX6[ˆö–&u6cËZ:Ј‡—Ý„MÄ0¶Lèl¾ñâO1?k ^;#¯ù’ë/à3׊ \|À¨y;e7žÄô©c@ùJÔÅ7áðÐ)Ù~ÇÔqLŸv ¨¬túÄ’½ôUÔŒÍA÷¯^Ó‰¥ƒÀÚ_#I—±tP|]C²òQÍæÈª=P¶Fß úe%uêûºj“}ÀéõÉ}Ae}ªX±†Ôõ©"±†Ôõ©¢b ©ëSï?©¾®®ÅdÿÉñÒZTq¢¤#‘ËŒ?N6nQ>è˳uŠeWÉa%r9;¨„Û(9ªEÊúÔP²EÅ…ÚúÔÞ€òò•ÚúÔ¿ÿ*++188ˆÌÌLkâõ( XϨÿ@ àJ<+‡ÐÏ=ÿ“7‘½ôUlèÑ““¶V/ÅV,ÅMC_G`í¯¥R a¸£èÆÅÿ¸Å÷DZ8ü¤ÖþRt-^ÂZ¬YÚˆÉ%‡®_é×·¦dV þ'ü`˜Z‚p—~}£!?ZcÇ0Ÿ3L­ó#Øi< ×`{Ç0v;¿Ï? $Iøøø¸È¸W~Ÿ+*’$<~4.2î•ßç¦ÕU’„Çãq‘q?)ãc× •iYuõµÜ¦£g‚4…Û‘d“Û¡øE^äÒýý$([Vµò‘kQ”üùbm7¾X+..Å\r€ßÁ»á¯íaûkŸ–?úªÆe~mËMo;í,økgɱÓküÉ‚¿¶G«.Ïߣf·z~e7žt%:Ñy¦ÒÍŒ´µX5 ¯õû¤)éÙ®j}~þÑÄM—tèzdfeBýÞÅ#› ›ŠTt—o{ÏîuYV¿Öí.KB²ýMô?÷K—%AÅÕû¼kð ‘ÈüëîyÏDvi F»!¯Æí€Ë¯íA~hö×>å÷ºÚ'W?ŽÉ%÷ã?Bíøç˜ƒöµ›§`+á–ë¼åº3rlX6ϳ”Mîñ²©cr<¼ì&üÛP6MÀ²i§ä>˜ŸµÇþ4];æÏ~wó³±Äo-ÔÚ·¸,ÙŠ Šñü¥L­}Ó7Q\P,û?}Pwjnè9¨õì庌 IDATòŸ´v]Öÿá'tëÓâð“²ÿ—o{{Ë+R¯Ë¶–ÔëòÛS®Kê»r•]“úŽ´Ú51©ï¶¶6WÛʪëPùºÎúÝHÛøÎå"m7ZÛÝ>—úðèöéÖvXµãëx ~TÊ™øn]úúöH!±P6"½;¥Œ‰)¿¹¹¯/ö<þôÞÏ¢ìä)ÚoBÙï¿èÙ~ìOÓ±µ:©1KÛ´nÞZ(«ÓÉJu´nŸ¿”‰—¢ke;m~"€]ŒÃwz¹fa¯ù¼;øŸØÅ¸(Óyd­faý¸;†F–e:_¼_³°wÕàRǰ,á©’K@„ÐüP‰EPÉ% Bh**’ÔQ%—€¡iZmOnû¨1‰tò:ÚH›X褣§Æ5ÒHNH'.töš´öTß/»±š7AX Gb£©Q’°¯îÝi&8qžîàî­Vøx`í¯ˆ‚Ù?„‹ÄSF¸Öæšoâô£®þ`Nïý¬$”ÚS¨A.ÍókRââ(¶5ÒÖ–7ƒå ¡ay³,éH"à€ˆÑY­ÕJbNô} Y J=mû3õ’šT¥(žX ¬Y’‹k[ûolhChlhVÂÄÃÄLp~f„ás‡[(v—¬T«DK¹Bl«£¹®¸[UÔ°—d[s ‹iK$SI1ežÃ„3>[¢ W±l•œœ±<¡¡hÆüFÚZ8kØ(¾ŸrÍ=Ÿ©µi}€0½ Æúüê$ŽWÏºÒ H`D97w_¹ŠwϺÒ+úû°·üÃÆÐm÷Ž¡›[ü±Ûß 8.ÈÑ 5¾p\ñûRÆw~už9Ô,¯j{€Îjñjàî+WêÇñÏ=ë€êÇÙ¥%BS3ØÊcèÎÄpgÉ+Àïö"?´NhjÏ£ Ür?°“KîššÀ° Â}¾äOÀG‘]Z‚cûô¤ÊÌÌLd—æÉþŒxã@aù¡2Ù?x@Ü &—|Yöúài­=8·Ù¥Ù@ÏAä‡Ö!þ¤.ûÍíB~(¨ëý?qXkïÊëÆä’bO¢rUÞP¹êV|æì‹xgÖ­Bð~Ö­^C¤µDZ+¤bEëö`A€a´µµá€¶¶U˜~j.䬂÷9«èRuä&ß[^!Žq›~ýÈMÞÚÖ"ޱ˜†)²Üäý?Ø.ޱÀs¢È%¹kŸÝ7ŠÊUR²‹È%¹k[· ÒÚ‚ÎNaY$rIîÚþç~‰¶¶6ôõ%ÿŸÈM¾÷¥ë€—FTÀ¯È±’›¼mÿÀþ-ÈÉI¶“›¼`:€_جWarÉßË„µøGŽbõ½;ñÜ7¿Ü@aßs˜Z¾VX‹ûò÷`vG›/¨¸ E»ú0µÎÔ;Ò~‹vbFÏ«(šŸ ¬ª@îë‹Qvþç¢bnV,îÃÁëæàeGñîîZŸrî«÷‰¹iXÞŒØT?v¯ÝƒÁM‡Púô Ñ~ï^\Xý&ÊËÖàд2DêÛúI…öà¬M‚úà¬M‚úà¬MÂÛ¯ö`rößH’KGØV´Dœ¢C.U\:¶SoŠÈ¥ŠâG ¹ÿ¹óÞ×·°{’uŠôî r_|"²N>ÒÉ««¿À~ó?[ÇØó¬ϳ°±P]ÕvÔ UÑnh©¾=ö·—Õa 2héfê5>"\¤gxf„aIQK‡‹â IXÛ­:‚]êù‹ý‰‘ˆ÷÷mñ¦F¯z~”t1bˆ¼šbTÉÈ%ezûòÁ:Ú;ÙÚh­l7¿?;êGÛþ)$®&ŽP¿ô}•\‚\€Ïñ˜ý“~hk[‹s\’K2@}v¾¾<êêkyãú2¨U£$«))ô„kû)q&3+ÓÚO q>Z É¥M\U)P÷«Ä“uˆ‡ ™àº%6®ª˜h…7 áIÀf‚óhÞ|Dóæã¡Ñ5®öVøxãú24$Žº4Z!Jÿÿ³÷îQRUwÚ𳫉ë‹$*˜—Æ•(}¡ÑHÒÕ]Ý€Ž3ß’‹=1qâiÀà…jº.:ï—º«>'‹KWFW&H×noÄ1£ãûµ@»V^_ª«/ lšè,iÞbĬÏе¿?öùí³÷¹Tc2úõ³V­ªsv_ísêTçü.ÏÏéüS‹¡{µ“€–õ¤Aç¦GGVnztôgå¦GG!Èî¯7ØÂ‘€©³™öfláHÀÔÙÜWû¸- ˜9—™ßwØÂ‘€yóGdVP²±¿ÁŽ$\­¾G6=í³ÊäÌC?ÓZÖ/Ú€Áœ AþÝÞZëÂȪŸâ½ÙÉd`O‹Öºð‘MÏK FÂ|¥µcý¢ ¶ßS‹ÒÚ1²ê§Rƒ‘°@ií¸øîÕ˜·^¯*QS!XQM6NM…(«˜Ž9»to¥š ¡¢ã•·%!sjÌ䤆ªSC€ÆdÔPuj@ç&U©[«Õéܤ*ukµ:›T¥î¦Kûà¦Kûà¦Kû`Õƒ-Úò4жz™¸©dREè áq=Ûýv,Û†Ÿ×ÎaYqšaDzmDkÑG#¨¯¿õõwÈëë# Éx?‘C =ˆÈ’Å",;} 6½Þ íÆÌYhŸ¯¶Øüq<Šÿ³^ÏñT[lîŒíDK½žãy>­4?+ò9~ö7´õ´LäsB J§e"ŸW„õ®_´|¾äó¿2Ä:éä1ó⨒Nz=Iu`ºéì1Ñ>R½h:m¯¶$hzöe;CRI'ÐÝ•+¹´¢š2³4#Îpž21 ¹´"ÑždCdžineª&£úÊ¿´Êð¨Û?zY±‡»065Åg íJz` 1ÉKƒÁSCÀ£ÏOµ“m³Ï·›×Qƒ¡5j{@œNp'—&¹tï×çÎ=Ó€-,n…5,n‘K ‹[n ñÒö4(õ@z/ ²IäÒÖ!ÃÁŽz¢Ýpé¯Ô Þùå7´g+ÞàßÒž­8ü–O{¾ØØºN¶‚ô_­:°„Á¾÷´g7xæÈB'Ü’¼Wæ|;áïÓM²ÐGÅ#›žGÙœÙ6rF¨_´ÕûmäŒYõSŒŸ}ŸüÀ‡Å7`p_·gïëÆoÿ4Y?UQÞô&TîGozºÞ/ÕÇËál÷c?û>œí~ ]§ËµqÏà-š}µ p`¹f_-ȼ~Ÿf_-Èœ½•*ÜÚ—Êq—ö¥·´ ‚[Úá|Ú:y+U8y+Uê^EdÒ D&Ý@dÒ ÇnÐócnÑ!:XÿmYÍý€–¼Skî_Í ÃŽ¯ ê8¾&üÃâAÇ×sý6æþúmmYM5 ¤sB[YV¯s6ÄœMµe·T£ÏÆIò¦‚ÈœÈÝ3QÅ€˜„6é±*¸=€bƒc »lÿæJq'„s†ÆEv€fÒZ,8?6fŒ¼AÁþFó5hŠÞ4êê×XÕ{I{h},ØßhжòuöTDYŒ{ø„@V§Í?O­«L9&«Žf¸)d«@7·O†gO•S­j4LÝÆG“‹MºIm‡ö—@PwÒ¨ N-Þ> ÔvkNˆÃ.˜žÝ`ÿQI2×yÍ»ëÒö4x|½Ð¤1•h„± ›k˜œ–­¢î…°üž·¼åOÂQǰƒ @‡½‰ 2å €ƒp»”ÍþÏÀ¹é #¿­ß}|Nv)P ZÕj¾ 4^cÏ,Í^K§¯q߽ϵî2gññ{æûºám˜ƒ)OîÅËñéMúô&Ü’¼WüXlŸí¼è~ ŸnÂxÿ&Ìw˜ÿé?ÁânF¦¿ž» “Sjì逨Ow¨q>È}M4r1'¢¤Ä^ÐÑufš‘‹9ÍQËð¥÷KŒ\ÌÔÖ–ØÆ÷N1r1§8æÁf7ßdäbÞ„TåM¶ñýÕ¹˜µŽy°j…Ô" '¨EN°ÊYa“)²À&Sd[n0Á-7˜0šö«*SäU¦È ªL‘œ´_U8i¿ªpÒ~Uá¤ýªÂIûUwØÜ;E+²êûȻ쵯"Ûó7Z‘•ª*3qëÃéò2­Èê¥÷Õñ¯aãøª‘òÓƒ@÷×ÅøŽßw`8&ßm iãÿ¥e ¥Œã #å'¯ûŒ]YÑ߀™Æg¹åÆÜ„/ aýT ¼K§êêów„%×,ðqê(4†/èF¡@üÅF¡sõÇ |ß:Úc˜ôuÆàáÐ1x8xiy ¶¬”ók®ÑÏ–•òÒò^„Ûxã”íQ„ÛL_*"<åÍh "í__šà{çïÓ×—&¤ý­ëíþYu]¾×>NëJËK8ÿãWyiy‰ö u`àSlÛ«ëRÞŒmœÖ•–—ð½ó÷ÙìÓ:ñþm¼·i°mÒ–©¸a>&Kû˜Êùõ¥ í©ÜaþÛ¤]§ù˼c—ùc*—vÕù“­†ÙWó†ÙW»Ú—ÿ½.ö÷Æïà{ãwüÕìϼaŸyà Wû êïà êïpµßÒÚÌ[Z›]í®7ûI¯x¸ÙßsÇT¾çŽ©6ûú÷»L{zXíÓ±§‡Õ>{z¨ö74Ìå[×C{lh˜+íç’~žï…öÈ%ýÒþ‡{ãœÿñ«Úãýqí÷…eÛõ‡å÷Eê6šÊòûš¸W¨¿/ý·µM³­~†ú õô@¿-õ7¦Ú·þ:ýßhÿŸûÖÿOiÿ‚_^ ¨ydNáNĺ§œÏøZÕ÷ņ“—V ±Žú½Œ²ý§‡ðÀ>^ _¨“É⥋õ399¿\ÒÏ­­Qƒ™œÔ”ú¬.Ûf_ÂzŒÎsûE`üûã8öþî!šûë·ñ+Eg-Ð=Dtqx0µl æŸÁ¾ûu·×œM±{\N‡Ê$äË^ÖÆ=ƒ· óøIŒà[³;S×™ÃåöÅõ¥%øEõ4à†Çôñ×ïý‡±ª1Œ%«í®ŽWÞÆÖuÀ߬¬®`&‡|`S¿Š²ª+m®ÆdûÞCà[õÈü¾ÃÑ>é$í“Nbcƒ£ýŒ·sŸFߊ{gëçÈÝ^Œ°%˜Äã$Z‘ è^û`ºND‚¦×$ñ‹&ýø>Ð~ þ£(„Æ?/¢ÞFÑ:¸Ñ‘£ñš—…Îcoµ,"O? O{yyæìš%‹†N…€‰Iñ¼·²ÛzžÆ¼õeÜ× 8zì°&¸Nö{Ó¢j>›í××ÉþÙnñýîïÙ¯ ®“ý‘ãB‚jïž«1wÞÛØ»çjÍ>¥Éd6ûи<‡ÌfŸfgEZÀ¾ö:Ìiê¾ö:Í>= I]ÆÊw¿-íSÔ${0+uëß*íSÑS6›•ºŒuo~Çœ¿!¡õÊUÀÍïŠgîiö),å‚ýâ™!cÎßÐÚ;ãÌ=ø1öθŒ§Ú=WêØŽŸý Ô- aäøjìÝ#ª™UÛ *’iðþd6‹jfúýîW„+Â>‘ {v2öµ×áýDÏ ÉBŸ]øžð”vpñ­X€¥ÎãétZÐŒâD›TЉ!Ž©eSd¡ÏÞ‚™N…Ä9»–ÅðæÍe˜R¾Çßš‹íÅöeëð O¯¦ßƆҹøÎ¬kP5³}üðeE;ææGgp¹Z?¦Mý&ÆÏ\‹³Ö æà¿àæ7e÷àñØ~ôÌø'|eÞÕÚù>;Ø¢)ë°gÕ 2¿¿“øbí|o|¼ÌÛƒtu/V÷/ÃÉ©úù>ç‰Ûñ'°oÁ~̘ ¼Ålp'n¾Z;þ”*2‰sœd ©FŸvüƒ™JËJpŒC)/E&T£ÿÆdêW‹‰v0nÓVU‹‰ZX^j«’P¿šÏ¹‚q©­z¡…Ö嬨¶yÄàáZá‚åân qÇ‹~8y5=Åx9ÈG:ÇT’¾:݃`ºÎxèã£ÂâÉ´-ÿ›wÕJ.­¹„_>dž¬rìjk½òñZê‚Èiû¡nϹñcP¶WÇó9ÀŸ¯tÆÚ´>Ý"—€q޹Ô4LÿÏ6moÕÆÚ@wؾP'³èä~\Z ¸Ä1ŽÈóÓi\Þ;ŒGcm ONÁù(z|>,¾AŽX|ŠW’ó=8UaæRª¨×+݇~‡Så‹ÌñòEÀÐïäò¼õe6ûjåq ·Úf_­<ž³k–;Zy¼ý)ûü·?eΟØçÏGáí#‡löºhö·>}ƒÍþÖ§Íež¯·Ûϛˇ޺ÛfÿÐ[wÃ"—.-„È¥ˆ\ºÈ¥ˆ\ºÈ¥ˆ\ºÈ¥ˆ\ºÈ¥ë¸A.Ý@äÒ D.Ý@äÒ Ot{±¸{*–¬Þ†'ºíÇ9˜®Ãä”OTd§íéJ´ß‚+»/Ùí·ØÆGf¿€›æ®n¾#³_°O ÅwC^œ 0 µoZ‡•sàÚÆ«1²'KŽŠ‚·W—ÄQÔ}›m!Ñ>á¦ÓH´OX¹„]g¦ÉñÝí Ìo cw{'³ûÎÄ© ¡Ìä´q*n‰¿ÜfÎ/éç±ÐãYºó_‘¤( <.ÆnzjÐ’ï \”<5÷§%ßÄ‚¡ßPälJ¾ r{V bþz¯fŸdlÑà ¥·N³O26°oÁ~,Øõ=;*c³øîÕÆŸ®W[G?¬¨ÆøÓ5í³¢yLÊ*¦º¦ý²Šéì+lŸòêÜìS^›}Ê«[r×ë¡4í/¹ëu€‰bæÙiJžg'&Ax§—?eJÓþôò§€"K^áÉq#™äÉq#™äÉq#™ä¹t#™ä¹t#™ä¹t#™ä¹t#™ä¹t#™ä¹t#™ä¹t#™ä¹t#™ä¹t#™ä¹t#™ä¹t#™ä¹t"™Vïâ“ã^Ðäl¬ÞEލ&gcõ.Ù ÉÙì˜ÍqSàj¼šǾWã,LÕÈ›òrRðá4Lõ`ðÏXÚ2 ÇÄïv³gÞ‡ù={y/¸§{ºÐÉOâÉõ/àø[¦fåÁÍ`È`mûqùÞ(úøåøë›S`<…uã‘Ã84°g¬QŽÐX¸¨Þl‘Ú°]ü œd ÑX›l‘ZÜε‰R^Šx<.[¤žI”Ÿ‘Àã÷ÌEÇ>ì`¿p§'Ø›ôãåÐøF Ê$ <Ûy?þŸ@;îð ¢”ëÅvŸG8Š4щGyrÀxhO2§‹0y¬¹eÔ½FõP"9ÒjzW¬'ƒdÒøO k7 riv"2im÷hóL¹x.Õ*\'I \ÒÏ å€ªŸãè S;äX5‘IZ¶þ{ªE‘Rq‚sz è^LÕëì$›CÛÓëO²ÿÁtŽÙÈ% Iº:î畜þdˆD©ã0o^¶Ï÷‚“'9u\ó…:™/ÔÉò½äÒNÚ&oã7ÇáÆà8øy%÷óJNfÑx¯­õâTE½Úµœ´ý–¾léж'‘Þ‰Gv"›í×D{Õ)D´S}—héôþDûí™¶§ñÝí í™Æ©ú4Xõ1jk½ZE­/Ü)·Ïlö!³Ùç:?@xd(Õ“S>Ju•ݗÊPªF–®.ÜmÇ"ÓdCÉ7áÖm~áIâw[ó£ù]Ç£ìD™½ ›°û…~JuBìᮂh»ž{Q†R0r|µ ;¡°Î+Døìd÷q  ½®@A&`ÿo³b´>…<˜ z0ô`¸`Å&„BL °@AæÆð_ ’`ª ÀÚ;T"©¼¶‘0%Ä­^èÕð\´Â¨dSdhÔÞÜrŒ˜2Îã¢Áj q´€$Lqt·>êÁLN—Å ôW””–È*\'’Y5Sx}èÙ:^[땲2N$ÓŸª”‚Ý´ô>uÛl¶ßÑþwC^'8§g«“ÒèÙºýÚö-(NpNÏÖñD") ¤MòÆ æVr ž=ƒ@«:š4NIå1x$¹Tó|ó½àDÚ¬äÐå™TOuûeU†ºåFE=ÿ(ÌØÉ=ȃ¨z£±6I2ÕíI{MÝ>›íÝD*DSíi«’½TÀÇsãfÀwî vliûhürÑÎM‘â"ÒµáÇñ(~â$c²2ì‹êÇiè:3Í&c½Oݾèñu±\Ü=Õ"W‰åä”Ï"W‰å•Ý—ÚBä*±YºÚ"׈¥§Æ"׈eÉ7m!r•Xþ“´…°UbÙÀü¶¶J,£ì[ˆ\%–»_è·ÙW‰eìá.›}•XîzîE[ˆ\%–#ÇWÛBä*±äý5¶¹F,ÏNv‘€ê±q©…ÆZ?r'Xs‘­Pû‘;aïžÂ•ä™Í…+É÷µV±pꇭ©¶6ž-<þÊU‡‘*̽±wÆ%Žëï9w›-7RCÄ–©bzу¶ÜHx[ó^.êÖ/ŸAä4ïe,­û­–ç÷kÞË ©/iã¯$D>* „××6èšžé¥"j¹¤.g´wi1Oè=Œ™ôÔ±X÷^b›6<ܤ{/'Y.—uïå1vL_Ähñ^êÛÿEš÷²…éßÏæË4ïå Ëö;/(²ÞÂòEÖW0þWY ‚I¤²P' éá² ‚zaW^«Ò8‘#­:TÞineUÞ3 Ö¼ ?Ž‹‹¯øè}Ì­L cÆj…!ÔŠC˜Ò.ª­ I¥U*†H J Õ;tI2é%Mê&Lç‚Èäwd‹Hå¿'ûñÝiŸH"‘J«T‘L"•kš–amûÛö’Tа³¶ÿ6¥JЙ †©Tô+7,*©¤ÍÏ걤 ˆ«ê±¤nFD.ÃM!ÛöêWÿ‹`íü ¦sÚ¹5ñÈN„Ã! Bªï„Ã!DZZeцu{Oµ~nÓ9ineu—–ÞD"™ä©Ì%ý¼¶Ö‹D{’Ó9¬úØìTå°=‘LÊ3.4.~;‘–VÓ›I$“ö½ö¾tŽýà鵺×Ò !‹ï.Çž^‹æüA\ )öøÐœ?ˆùG«‘K"!lÚ¥˜ô·‚<)ä’þ Ÿ»k ¶>}ƒ J ¹”ƒ<3Àóõ‚()äRv šú-zënMÑÉ%]oY¢)ëÀ¼:¹¤s•…jD׬ñ'4rIÁëâ×ãOh €IBÙô<æ­/Ó @“„Ô/Ú€@oµV˜$$²ê§˜³k¶?õ–F.µÊ<>ÛŸz ÃùœF.7V›Çg8Ÿ?ü‘F.w{¿&?¬h²fˆÜ"w…ÈÝ@!r7Xÿ߬Å=. ¹dq dq (Dî ‘»Ž!r7PˆÜ "w…ÈÇðÿ/4^Ó€<½V>¬HUfМ?(Vd¼˜ô·òq11N Y:@¶Ÿ³J+,-UDš[G¯ê €[õ“üþ #øIsx|=Xó*LB~‚8·V¼»i5Z ‚‚†ð©ª¨91 IDATHÏ*Ñ$r ˜= U¢©æÖ©9v&ÑÌq"•²‡µB4¨­‘UÆô¬þ¹ É¥J4¯ r ˜ZX*Ñ|Ä —$¹T‰fN!ô¬M.ÚLÊœK¬“ ˜aq‡3§×êUmAžµT‹œËeU•2Ç‘ 〠‹[½Ê‚l޶}áó/˜Î±pÓ ±Ül©©ž/çsþÊ §q3C$Ï)”–Õ1·íG³oÃ'Üþ¹»Ö`ûÓk±û…~ÑBðl?† áÇOÝŽçîZƒãwýß8‘?(uLct!»7‹ù÷ÌÀÔ²)xïèo±ë¹E ÁØ‹ÈîÉ"zø!ìžú-,œŽ­O¯“öù ýøùÐ~|ÿíXr×ëX|ׇàùiŸ?Ü…úƒYìÜñ ˜g'®/-Á¡¡ßIûùç^D$›EtýC˜^þV5®ÆSLû_/îÇп aûý¢š“÷¯F‡×´mE² ³à;:ÁûkÀ¦~‘ñ'¤ý©/"û`o¬Õœ{VÕcþz¯y|^$óÇ÷ߎ=«ñÁF‘?*ÏÂdîÜñ ÒÕ½(/?ƒ»¾'í‹ïBÌß‚ýXü\¹ôÎ¿Í ¾¸?ÿ·!üøéÛ±øîrüÓ]> «Ç'Þ……Äñ/öøpr*À›óÏo|‘ YD>6íR4Bä‹ ž›»6sH³ùÅpeä›9¤—Òssy°— C€bŸ*íì}ÚI”ìÓM݀ѽvYÅt¦Vå·ƒBQ€ôH­ö—¬€·]í{|³Ø7•ʪ®Ðc³?s–PB QôÊk¾­Ù_°ÀèŽcÜ ÕUÞªÍáÂ…LQô:ïw4û£‡Á’ïXŽ’Æ|0`9>_ò ]%J&ʾäúÎÉù?9îà‰çGÛ‹n‡F6þ ®ã ¸H× ÷³õñ|@¸ÑÈ †¥ÀfÏ,`#0ÓcD,717‡:—,¦…¹ÇCeNj¤s :a9–¯4lÇ30ÝxXPÜÎñ(ÌŠí­Êq&uL¤[ΫæÅ`U‘ÝÁ~‰#:0û †ü 0r6;0ÉÂîð —ãž•N{ å¬;AÍYw‚SëՋϦPäBËÐüµÇ?' œLŽómü¯ GGZZçG7kuÌ\d|FÁh2@ªgœÕüEÇo´ùÚÿÑ>T#·Ïgà” ®âWç˜ õP‚ºŠ8ä¬Ð{lcpdôý¤KD&˜å‡ PœºÁp€÷&P§’ç¨Bz]¾¿Bó×RÄ{´ãC:~€È¹cE5ç­ p¾ó+„Ñ>´ù»}>‘KknÏ÷Çq@ÑÁ´F9š‘¸S riÍí™nW„— rÙýuýröv†Žd ¿i¯þèo¼†`v)öÝ.s²K‘©}sçØ4áhëHN…ºŽ4áTÐ:ºxmyZë€| ʼn6qÁP Ö_ΗàD&„ÉzH¬fÎÚ‚Ó‚™‡~¦˜þÌÄÏpÍÕ×à×swáïö꽘=w`ʧ–#=/†À½sz^ ÝÝÝŽ¡_"‚×\}cè—ˆ`ùÔrÇÐ/ÁX4.õÌ«L Óñ_0Íô:ÿ…ך@õ;)â·‰‹µ¡å·dµ²€ììfhŠÿW³›Ü—óAÈŒí˪®4×Áƒ5¯k^å8î©#ûNV-r'ËB(ôë˜?U©õ}Ny3¼vù«¨]þ*ÒÞŒ…\Fx4ÞÆ©%‰sNîg„§>d³ýð…Š»ýˆ6D¸/Tì2.Ìäç·ñl¶_†‘É´Vè3 œWîGuà~B"¦¸Ÿg›PH_¶SÀ5Â<¿aV©ËùÄÚ´ýíóG›?áàÕ¡NýøŒa ŸT/©Õ[è^R«·€æ%µz‹ãFÈð^:õ›qô^:õ›˜3é½­ßüç 7Oêæ~C>¬:‰ÁJ ¼¼Z>¬:‰Ë«Š¼¯J>¬:‰ù²—±Á?×½]çÌÍÈ%üîí:ox ¿I-wm×9gn7¶>=¿ô—:Ž–? žoO8Ä·̹ï_0xt9SUΟoÁgÝvtûì£vÜÙGåò‰`Φc{"hž¤ïÍþȦcûÞl3zv°ÃfvÐ$ä7Úì7>nò9OÜn×~âö‚ûøYa W÷Qþ`ªÑ‡`:§éü©½©(¤¤´„GZZ@Òá‹ÆÛÀšWÉÊ–GŒ{Àãë¥ýÈ‘VD+Ä3õVÐç^Á>ˆâÑË"nb(nçøÑQñùñ6´4·"f<3&Jâc4´áÍ•ÛpíÆ;ñæÊmèô ÀŸ¯Äµï”ö[šÅ]Ìä—ö‡~妿–³÷Ìm¼:p?ê„§,—Ô=˜Õû9B ‹½OzÉ#À©JÞZ‘.êå µ3iœ¾Gã"Çy¾‡7Ý—BÊ% ‡Ch,È)Ôƒ‡g³ý8îC*à³y¿(/1›:‹©FrãDÞ¢,¸ ‰ýæâðð[R5èC €N'8†[1)$~'Ѫô.pq§..:jþk4Ö†HóE0A*Ð…T Kˆ³(…•¸òÚ„\•ó÷;ˆ®3Ó´ùGcmFô:¡g˜LK†ö$?‰V0éÀЬ< LÇI‹SÍÉ•…¨Ç½ åü¦ß…Š¡cCˆÆÚðHs„ƒQ jýüa0ŽæV ßã8ÿDûs>>¡Õ Ýëv¬×ó³×3W»à”ÜXü^ŒSh\í‚S»¤0j)4®vÁ©]R+{ÓShüW«˜|~rý 2LN¡ñÕùœïÊ09…Æw{¿&Ÿ ¬”arÒ{I˜ýŸPÏò^ý*?}ò^æd—_2ßOÞK‚:Ò{)—•ù0½—¬ó¿X¸Ð¿³ eŸnz¾2ü:„Í”¼¢›RÖ8UQdÍjsºé™øÖ1^¾8 ÆwOÅöÛM'·{*Š >krʇ+UÇVNŠÏº²ûR¼÷]ç÷ÊîKA¥{Ý©Üì¾M£o£;ÕÊ[Í,Í ùñF@jãçYj^töÝû<h„² ûî}”ƒ}!1€±&š|Ρîòȹ$””–Èñ‰Gv"  Nùê:3ÚüOѼD~ÍnYQ‡¦ûRÒ¾5 z­˜“Tò_ÈžÂ2àåü2úím­©¾K@ª€)3‡ÏÅAmþnLJà"Wà"Wà"Wà"Wà"Wà"WábSábÓÞïbSá"Wá"Wá"Wá"Wá"Wá"Wá"'¸…Èå¸Kˆü‹† }£UHç@aS`tÓÏ 7_­©ÐïŒ~_Ôò–œô;£ßW&T£©ÐïŒ~_¿ô—‚Ï-Û;èhŸ'¦ÁÔkŽöSUÀœ¿öý/Gû€I* ¯¼…‹L *'ˆHW4fz‰T“=ˆÇÁ únÕ êõ×ôÝ*7*È®Û9Dv]Ï!²{Ï¡qêuQÉ éè"-­È%üHÀ$•ÑX›¼PûÂb0Ie´¢^ŽGXNöÍ$Ry*fŽ£%'½=D*O)ö‡›Ì !‘JÕ>c¢Ï329I*¯U¶ïô šN‹ý˜b¿¸Kûª—ö_%‘ÑxgÆA2­iTÈ‘Ks_7Ö¾˜D; ½//Î!7Nïõ (áÞBãFµ<ó섙ݸS¨÷°cM~ÌØ®y–Kø¹/Ô)Æ39y#8—“ÛúBL¯×ÿ€_b ðÁøc6¤ ›‘G‹1†$ÐuF9²âs¢mˆ4·²\ÒÏÆH=´Âã…çOdÖÈk´…ÃáVÇ\;À$—ò&Œ‡Ã!«„(rWÅ49¿_œ0«õ8Œ®øzsþ¡3BÐ$³ }~¡ùç’ÃOlmÃ1Œa4T¾ûmdöwÈ*ìû¢ò]énAÝá[ÜÕ(«°wízu‡o5ÇßüŸiUØÏ<ó êÞüŽß…ïaÇê@—ôŒcתÛ#‡±ÍhñEåx Ë£EÉa\Ã[°¢*ЇñŒcMåF@Éaü<ã•ãöš]uÂÖ*ï›Í*㤵ʻoxÌ캳âfçÏ™Z:  !ý£Ç^–j‚¸ù'%•ÍÒCM˜U3 ¿I‰Jòý=I5Ï-ÃÖ¹B—íí†åÞ¼ÑØ©G´JjÍù ýñzß¿A“ ‹9–y—"ÈbÎý¶ú "ÈbÎûј´_¶Ï>jÓ±Ý>{–Š€'‚9›Ží‰`˜1ÿ÷fdÓ±}oö YðNýÓ ESÖavp52ÆGRÿtóö ññ 8õO—sž˜ \ø8@ïz‚tNkË'¬9!©bWXuþ>é8 ºSlÂu…Çé$ùKÇ‰Ä J/p°¡cC’Dññ…D§”Bã€1[=ÀÔêP•°±JåXåm>í¸)LozK}¡NS†È”$’óò…:™Ìå#§O£¹-Ù¡”+Ô÷PÞ%UƒkóS‹‚àRS’ÞcwÝÞ2?Ø»Œ“ Áº< m¢½ZX_&Ð0ÉWˆÐ~«ÖÅÏ+y§gh1z­Ÿƒ‡3ˆ‹d qÄ´47#¿\xÿõó Íßvü,û¿¬°Ëf c8Ør0_ÓÇm9˜[õq[¦eÜšƒyÏ*}Üšƒé©ÖÇ­9˜Ó+õñ%#ÀV£Øíûã¸ð¸+^q‘rej §½@ñŠ—}ɃÁ?È"Ÿ}µŠW|Éj`ëºÕZ‘”JrÈçj‹|Q˜4Ø7Y+òR¤4oÙ¸ÀŠTeFk\`EÆÛ9; wPLù)úL ÑÔë³ð0êQ’Ÿ¢Ï´†h—ÜeµLg3êàd¿lª³ýýð×_æ¶[ذç<8Ï}|íž?`ͼ¯9ŽY›$P‡Ðù]‹E?¼Õ¦c»²7oèüpMÇv~ÿ ßßâ—ma\’œÙó¿©ÇÖu;qçwu(ý÷Ç_nC>× 6UO­rr][0Ø· ì«®»ý™@ó`Ú ‰‰O«Ó÷y?Vh\…•Äh}Þ?íø'°Ãm¯?ÒŸô¦¦>¤”Q@„ƒFoZõõ'ç`)ø8SŽ\g`èv¹z/O2†Iœk¤N…5]!—ôZ3qcpœÈÎå`7Çqú+&×T ‹3yãüëâÁ–°IíóG›¡ãCËÁËÁ,8þ ‰¶ô;pÊÁÌßS&`þœr03¼é”ƒ ˜áMÇL@’kæ…ÖIT½—žÜ‹Ì‹úïEõ^Î8ú‚ë¿gÕ{é=šDc\ÿ½êÞËAü°Óò{Ô¼—¯…-ÿš÷ò¡,(ìw¼ò6nŽ;‹oÐBã€p6¥lVä]ª¡q@„Ã3!`Ï[8U¾È_r×ëºÎ¯¢cë¨ó«èØJß·œul§—?…ÿ7&Çßš‹)å{Qué\å´-AöýPw!jk–òŠ.3ÁþF›Ü‘ºÎ É>K×óS‘²*´ÿ…d¤>Õ÷žów;þ·gàc:•£èÐ5l‡# ÁrJ©±b¸‰¡´¬gRÇÇ/–~!ì[5 š ”ãï:þÒþ¼‡„­©zeqÑQJ­5Âl¦^YÌFX>Uü?±Yº:ß/óv‹jb'F’ÏñVUâÎ;ïÔÆ·mÛ†;ï¼ÉdÕÕÕ®ã;wêùƒÖÏpªØWm¬^ힺmÛ6ì~ö9±ð=ຟƩ=ïàäø,Ý(Q´Âƒkøg°ÍýxãŠZŒ<,7ý~=ÍE˜ñãøø±Ð?¡ù¸ âLJ°ˆ3|uŠ_VFw§ðÇãšïoJVFg–fpº?¨éð^QµEVFï»÷y¼ß·LêðÛ€&+»wO5:Z‰c:‰s°de÷ä”O\˜8ÿ±c˜˜„¬ì¾²ûRœ ¥\œÿ Õã+ïk¡ø‹oÒHÑX&Ù©…âOUÔ#ÒÒŠÒ²ÄãqL|k‡Š?U¾ÍÍÍ\§òBCó`Žª…È„×ÉŽFGÓTs @¡UUh;?îCÖØ>Ÿ¨rœÃ$ã>ô$cç­ƒx¾öGÓ)tçÒFõ>µ}4e|"Èf»Œ9Rx;jÛ?’™Òo„ãÀTd±Yx3<ØßÈÌ.2L)˜ö©°0 _fs‘¯YÇE. ;¯ŸÕ@6à¶Ðú¢±¤ý ö‹ïm–ñ“`,ß žY*òN°Tì‹ü0 å;œ»ç£cétüÔ t#•‹ê줶m4ÞÆeopK7ªBŸOûžÍÖÈãït|Ïgþ›ƒI$Î!B·í‰\=nöÛÂÏê:•È›ý¶³³Ø¹Sש„ÑmGìKÑ­ºNå7þQ+4±ê¸Zò¿µB«ŽÛ©%Ð MHÇ­ˆß†'׿` ™Ž,» [Ë^À’Uá ²âDÞÅ·æGph`¥-dz"Â{3W‚ý_‚œ9ù4lGñ áÑp*ò)nç8S!–Š|ΤŽ¿Üñ¹¶_4÷„=‹px¿M|K¬`–|Gx_Η€¦éíÇ/ç#(â/\Pû@#S¯–„’ ®c3}’PÔul–WJ9®¬sÒa$ÂIä’„» D(‰\ºÿç÷_—íQ5ûÅÂþ›+·Éö¨*¨-óÑù;d{Të*1¾A( "^TÖAË‘‡óÀÅòÈÃys¹ÌÇGäx>>"×¹üãq3¼þÇãøê?ï„ ¼)œîÊñÓýALð¦ëbªA.ßï[&Çßï[†+ª¶àá¾e¸Ã —èàf› n¬Û†I|±Ù"ÕømS'…9Ž1¥EªÑõTH¬;:†…‹â+ïUé"ÓýÃâð•á×±pQ=|>&ÙiÈ §*êE}G¬ ååå˜øÖCFhHŒ—/ÂÄ·v £þŽ…¶ïæó`:òrùBPåqL¢áµµFzƒ Ê mœ§„:Á Ô ™Sn ñÒö4R}— ´= Z¶µd@.áuÊ+넀о:îÃËi3QÙÉÓz’1ä~|'¤ËËL Hd ÃiÑ©„OhÝ~4ÞÆ«"ç­7½ M÷¥´‹¸ŸWòj~¿g¡u\Ú¯ZžCU/€jAÌTLצ Ìês”áI5vèR¶?ŠTÀ'÷—ª‹­ö­Ç/˜®C~yù^àªýmŠÌ½h8®’0ëñS÷o8Ìd𭉣 @›´o††#<³Tx &W'UÄ‚É îÔˆf*àã¤!Ù›Þæ©aFÎ-×rVŽŸÜÿLùå9äsÀò”á-4öÎsS…Aoyn ñê@Ðüü¢³ÌåûU/8”ùÇ=349)š¿Ç'æ»<B¸É<þŠΫ9¹}±Çžï3z€«äáÔŸ¨|×X¡K@„SëÔQÛi…\"œP÷¦X¶’K@HÛP‘€•\BÚ†Š¬äÒ6T$pü­¹R6/âxƒèûÖwÀï eGŸ!ÜöÀ)›Φ×ÈÏ[€eøtÉèÓâ2|*¾5Ýs´–Ådø´ìK}ã$Ff¿€›‹öê’·möˆš­f=6û#¡uXÚ"< ©©=6û57 [ºìèöÔ±tÙÑíÿÃâAK—Ý¾Ú j‰C¶„Ú ÊéÖTíUö%{.÷…¶1°ý©uÜ×­å2ªèëéDozü çT—gŸyg»Ã=íf‚ë«{7â¦ÀJI2ŒvŽãÿžì‡?å•$“Ô,¨èoã¾]XÙ²@’ÌÍF;G¿nqcbˉó¾‰óĺSgßÁ×1Æ òÈ—{qýrqœÙûýøö#ÕÚø%÷]ŠY÷ øÇ§?Â÷GÆÃšË)rmź;¿Ëa͵¹¶F³Ž©µ‰$ˆ\[±nûóo‰•³ÍñíO™ëýÐà:&Åp^]wx}Øç‡?’ëÚO¥Ó`1 êRs]Ýå‡Z¯f@]7íŠ" fˆ\À­W ÙÖ}^1Àöö$À˜ ˜ò*Ùl¿ôRžª¨GPzi„W-»ù&{ØÒ(.`–Ê5Ò j"•Çš rƒ‡· o#Ù€a…Ó9­’™ˆyé¬Û¯ Ô 7N„åS:‡8<¨vðž²ßuf†Ž )’0—ɶÑXÞ\¹wÐ ]: ùE±X à«Åk1À.c•ãÙl? Éð,` ¿:ôeg@ãþÝÊÒ«ôTS¨‰Éqº) Â-µy¸)ÄÑž”ûGö‰XÒ÷#„ÄÅq)Ý ÄÀ …ÃW÷/Ã:ï¬îwªë¼[ì7÷ z˜B.ƒé ¦õãŸÍö›z¡Ž_¢ç9¸Ì‰âImþ¤6 e¨o&…­U² ˆŠóp8„ç`_#b™Kúyu¨SHyt•€@:‡€&ºs9þÏyàa 8L“Ü“S>á9n3ïüoß%æüü»P6`êÄÆâÎa·?ZØõèÃŽãTYÒlj\VîG'6Ù¤Úˆ\ŽŸ}žðÒûæ‘L@èÀÛX3×H& ÑÌæoœH¦X–ç÷cQ³ÿÆê»¤·òºuFˆü•ˆX÷ pÒ‘ÞÊës#`›ûq(ãë2y|´¯Dz+gõÃÇ}„Þôt±.=‚;.°ãâ»Ë¥“ˆ¥ºîŸîòI&Ëb¹îäTÓƒIÄ’M»T®[X;Qz0«.$³ï#sçÌ4éÁ¤Nu]ʺ·Þ/‘Ì[¯¼¤¬û¼cé–ÄEž€õ+ÈF„##…« r’3.ÞušA"P{ù«RÇM°´]¸mí0 #@;pDq¬)€Ô¹ƒ @m­ÑŠzc4Ÿ È åÚÒ®q! IDATþ´áU#?ª$)«}¦èxªUÊí5ÝAU0x²LéЀ?U‰Þ¤Ñ3Ó¸Âf³‚Úéц#ÍÐÆI’©q¹ødŒb::Ö]ÿÑ%—Û¶§÷D+ê-IXÂû&ìƒwY$–Ôq"ïDfUzžH$tØ¿¨¬"oe“À…Ì'©˜ÀûÙ$,ãD.O¢«ûÛ0 ÀIDîk¤…©Í”Jõ &ëñ£s«£Ä¶ÿæüMOoΖƒ™ ø8k;2jTðk€Óñ€®3RÙ Uò\”–uÜŽq»¨eÎçP¬T PF–®Æe_oZ•—½ü÷ÿ<ˆî¯R3žLôf¤VåÄ­ÀÎþg‘öR3%ßÄÄÚÇ¥VåÄ­@4»ûj¿cØû*üþ @ô¾ÆïEN&-OÜúß°kàYì³bÜheGË·~ Ïô?ƒgðŒïasZî(Ûh„€Í\½‘ew¡¨[xZÖÔô`8Ô µ iq¢ ÃéV\_ Ô×ì2BÀåø‰L“Û“À`OcJù^,Y lðÏÅÖu{±dõb™Ûøk@ÕÌNx|‹.Z±šrg¿ÇFŒŸ¹eUWâ7©åì[‹²ªR™Û¸õ‰ÅÀOJã"Q¢Ú?fརҘs ß Íþ{þ)À¡Ó¢ÒøÏy zO³¿ð쳘›‹ï^…‹ê±ý©uX|·iÿGD¥–j4ÖfDWLûÉ÷wbÁ¾‡²ŠéˆÇã/ÈÜÉ\rØáø˜Íd>p8>Q™;9²ì.lŸ}‹ï^ 4l7æ¿ZÚ/N´áD0VTƒâv.%»Èþ‰LïÍþeÓq&u ï9„²ŠéZn¦Sˆ\…Sˆ\w‘Ë×Ûwad×NL0òä^L0æk^4·Šßz¨Õ¿{º‘ó¬l~´ã›0Àˆ¹›æ®Ä«{7âÕ½mí à»!/þ=ÙOöÛÚÀÊ9 °qß.lÜ·ËÖ®PÃ÷\^(Záq|Mð49¾þÕ*" å`"TþÎ*" å`"T>µìk¸¢Jè©9˜´°9˜ókªä‡&ÿa`bÒù5á+ï^K»î&`(×c«î&`hm9˜VÝÍÏ3Ʀsˆt1ÄîA Ô@ϵ4=_ÔSzÈB†—¯`-ÐêÔ¤WÄ먡#8º£X©zøÌðñhûGa[ê·l­–%ûª“<«êûšîKÙH¦ ª±‘LÓ¾šW)ÚÒüGï:#Nê r0U Ì ø”7Ã'ZK >Á›B°¿‘9íŸu~4F^eujaÎÌÆËp ³F;>ùÛò4ã.cþG5r ˆüÑÉh3æŸÓÈ% òG¯Ì„ðÞ‘C>²‘KBé-"¥âØËÎ!ìË:¸Ùɇ ܰ\üǾ¾Y¿ðÅ ð«í»4¥5JÀãëo^¥]{Ô(A~c »W¶hJ %¸6 \‹•è(ÛˆŽ²¸iîJ-ÕæÆà8܈¬©éÁšš|7äÕÂÁ37;±õ5»P_³ +ç,œ œr08å`ªpÊÁTᔃ©Â)S…S¦§LN9˜*œr0U8å`jÛ;ä`jã9˜_Œ£ ,€Â:‡È³÷ð *×*ò`ºÎhçgæï‘ 7@Ý‘Ž6Nã£éŠWVÒb’ÍÑö/·Kë²õ¢o%Y%¥¢ë å©Ñ2ÁŸªDgp ̯-;ÃN"õ}sèúCÒA–ý#Г~”´L?£íŸ "AD²_=ÈÔ@„iéõyÍ……Ä…—“±IfcJ31Ћ{dyz/fÞ©%?×áøYy˜QØJçH$’ŒÂd/¢Ì`s+ 7ÍඦsB c«ÇU=¾êÝüŒ4Z€ó9þt¬D{2˱ÃyaMÇ—AÒ"Ö4@_¨ª‡ÔŠ™—<¤_`mVuϹÛ#8âdŸ!bº³0½èAÀ(Tr²ÿìö?áÙí¯öo³Ù4ŸA¤™.zöýxhÅ)<´â)Ã~Äfß-¯`Õ0¶Bh$~îXŒÅ”¤†›X“ûøåÁR¸+E ¸K‚±$X‰¥ŠŒc‡rЭ¥¿¬þ~©,ßißê«Ò¤AÕñ7ÀMžL"—÷Wæøk©sø.„'×ÅY+•žL"—w·ë®Œa çq£éJù#7ÑêAQI¨¸†­8p× ç£c¨V=›Ë翽›÷’`­Ÿ¨Ò*Ý)îÔN0Ãán¤ÒyþÎûS`ÿuƒýfךËÚþÚ?§qZ–:Žçò 3tÏäAå(4`t!s•\Ò¥J.µªnE‹”H¦Ú6ÓzìG;~€ÈÝU·õ;(=˜&¡¬—^ËH³SˆœÂáVRYèx«ËVR©b´ã_ pº#/D*Çt* ëTŽÙ/lßMJHÂMJÈ€›”ÐŲ¡s0­2EVXeˆÎwüÃâðuƒL.ijÀ¯tÇSõ¸Ö “×" lÔíœ*_„©™Lb'°Û%ïï…È ÂcÙ¡¼Ö!œ#ÊkÂcy»òÚ‚±ù_Ú‘æ$ä YH'p×Ù“•µ–;X«îß_j_‰£;é~*Jc?¨™yj=¸ÔspÖB ª{¢=Éx¾‡»}Ö…Øþ¿:è;rÓ”ã–}¦ã Žÿ5ŽM¾Fµ7œeÀþ8y›U2úHÂ^r«†€dëÕ›-ozÅ|é­ªD­~säÍV¢¿o¥e%¨®®Æ¡ÚƒÚøôì ôööJ8'™U'Κ:@ëH'ÎZXBëHg“Úì×çCm »v‰üNÒé£6…„gžùÚþŒ¦]ª´ÿÇë/CßGB€Ñç3‰ UÚ?8ï2™)//7ÇJû5󾆗ÞŸ«ê$^ûõw,üÂü¿Œa cøl!eŠ8À{ ÙêäV’é¦Ië éôÉФQˆÌä5t? ûT¬aöAí·…AÿRJÀ$—½éMè:3 ®äÄSƒ‰ø…ï—íPeohùbnÿׯ¨7J:çúÉÉó=†ä<5ˆÆÛxËŠ:HÊíq'’é”;ùäFK/Îkäü ]žïá¢mœ3Í÷‚{ªõºJ.[g3'8W½—’\†™H)¸¡ÜºX±ŽÈ¥7k Eöv À³y^T¢¼¼‡jbzÖ$JÏvîÁuD5f`ÆŒRTšpû·wbÉêR'ŽòSå>ÜÒ ¯UêÄ577‹öÔ-CY•XW¿`!fΚa#|êº î„OÚPÖ-\¸P>‚ºîBÚÂïüwmìI³­4ò#ÏáÝßéäüß™¯ÿö"xã%͉c¼äˆ9þî;Â}¥~Æ“ï—}ãç†}µQ?ãßW}SØ:}ú4ŸaÚ¿®¢cÃÆP?¯”§êée”½É!ÈJ6Û/‰â©Šz¡uhä¾ñ|¯ÜòðɶuÆxm­¹„_Tå*¯ “À5ûkjzD±±=<²Ÿ¤}ò\úÂòÌäD (Ã+j_oz“6??¯ÔÆYHTSÒxuà~4Ý—BªO‘ RrCÃM!n qÒ_kj I‚—Kú¹ÛCý"ˆ’­’ÒM{PEÊ›á)o†«¤ë“l¡‘Kú¹Ì‹<Øb¬M¬cà<ßÃy¾‡3&Ž{ìá.ÑØXO,öpbqÑ\õXÂ+¯Ž«Ÿ·qz¯º6G˜sQ»¶ËŠ΋œ30ÏNñ`æzu4¨½j]|¾òPǬ))ÖTá0cjØç|ò/·Î+<ž_^xüû¬Yzûë ËÖyn­ó¾ øçèþ9:d{MøŸ½øŸ½¶×„}æ#üë3Ù^}˜U»jëHêìÚU[GRfÕî½uäÆ0†Oq¤jð@²†÷BTCòÀxÉhOdåJ„§¡BÏ%QÃÂfQ 鑞µa6Û/CØ“À9KkЃá&†âEd–GKäSÒìMoB.á—¡÷T£jˆžRžïáªwRõœò‘40?ßÒ7€ôæ—çp+çð§z0´\è«>æ½éMðë7*ÁÌœËh¼*¬‰åg[Û4:U5†Ž ٺŖ6‰Þ ‡Knœº}¡Ïù,Æ *É€†æùΊj·wq4·š!mãٲB(DZZa%L¿f÷žÝ…Æ î—§Fiuä{À=5š—ŸÚ{R"EÁp8Ø$£xí$¢3Vœàœyjd!ÍÏx–ÇŽ%W8¯g†g“œ÷æÁªE¾¦ œ&É¢í¢*Ÿ% Ï¥•dÞ,ž¶ÎЦ¬“=“ "Ï/˜·GöL&PˆüûÎãOÈžÉ ‡o]çlŸBäùœ³} ‘ö½çh߶¶¶âBÛÿçH‰ãkÂßVV;¾&üãÂK_À¿þǶ÷«Â÷öØÇUáûµ{þ`·ßa cƒãTâïíä“Áñî,êM  …³JJK´ñ–ušÇŒš»‚éKütºÏ±ˆrÁ†›„þš” 1H¦‘™$S%Š*¹¨½ž”M!nŒ„¨í–>3·lcµk5X“ìÇð9†ð¸ÔÒD^%n+ÜtJ¨WõZJ Kg«º¢V„uûövApÉie•蹄“ÈÉ5©ÄR Sç{sXUBé$ôüi¡‘_‡°´õ|ÕÞã©AWŠ´R~tä{@^WkxŸä^ðÉî…¥rÛ¦ûR ³J2‡Ž ñÍÁ$âբȇ¼‚ˆ&µÝä½°K“à@.ðŠIþœàÍV¢·cÌëÜedzvžíÜ#ÈŸ.ªÇíßÞéj?kCó-­®öãñ8Ô-sµïÂVáÂVá¾öKJJ0ðLïe¤D{];£ÿö;HÏâßVVk¯kkkñÆHÏâ?.¼T{MžÊwtâJë)óß~§Wò`RæGtâ:æÁÃÆ0´r¯ÉÕ‚Ø]µßÎi(GÊAЀýmE*àã¤åçT˜@ºkªþšŠt(€@Ò*}{±O£sµuIô|Ï«ösd6 Áõfäq:݇wg1Ù– 0u=SŸ\«>¯Ç©Šzœª¨×äab\^§¸ÚeÈÉS)í+:ÁþFfí”ä´}SSMMzÕ§/ÔÉ(ÄÛufšâWÇÜÆ)„·ñTß%©U÷´@ÕuÒK—7r]ÂД;…ÌYQð\*é *·†Æ"IãÖ1:o)o# ùtðNøS•ð§*ÑÁ$¹”v& ˆ&Ù ùŸd 'Á´ù3O K´')È4c½§¬y¦V³jòW×;‘KÀÌ·,H. k®ô,.Ùcï;à—žEÏfûøÙk¤gñºÇ.·köº½hö~ƪý2§n8ë ‡Þó¹Â¡÷Á¾÷ †Þ.ª/X µ¹þ?‚$«¹¤€éIüçH‰$€êkò$þmeµ$€êkò$þãÂK%T_ ahh—}ãçÚƒÖgf‘=˜ÅU߬×´>›ë*Z´­ÃÆ07ŒsZ9fLý·v¥±.[½—ÖeYIžÎ1¤sÈ%ýü@zÁ¬Â¦Öeò:R¨ÛôB Ó9®’K¥ÀGèÔåX“ìÇ»ËÒ›}˜àªý=X»t r#¼ª°|4®w½©uâexp¬)€öö$â𠯕}W¼‡ê2é*’=ë2iUªŸìod´~´íå1UH“•@¶l-~Q—¥7ÓÈßåùnõ`&‰³®×æd„ÂU2©loÛ§ÑÂïç[%^ˆ”Êq€K¯¥ƒ6k“ÞKÙk¼¹ÃaÆ".󗽯<ªê:*æQË*Ä:A2Q-<™NeŠ?_Ý˽{®FÇ+«íUå2›}x,ë\XûÚëðØ»\Ç÷î¹N½ûAØ;ލö—篅Ó_—iU1šÆ¼iUáÔbQÅhžw§‹pO]§¬êV!Èç5øÅËt=_‚|–ckÓFYÕ­g³x÷½jÜn_¯·Û׫ƭöÇ0†1ŒÁ ãFŒî)á6Pñ]KJ…ÆãhÞK§¢§pªJ¶¾25úŠÎŽ- ‡«¤RƒSA‰"¶MÞK•d„F¥W%9†ÁP\ñ¶Ý®£EZŠ0Dµ‰tŠ<¼I*Ø*äHñmY˜aÕ" €w²&‰eÀ^dâ©#"a-dÉ%ý<˜Î1ºø[ÃÊ¢Ú—1ú.Ô¾Û€ðX2€Ñ±´J1ðD{’Ib©n?¯ä€»µªTeuN÷ƒ‡«Õë´Ïù^p•D–(Nð‚¶UrNzªÖ퉀;y/éûT» iÏÁª­hu-Ïh¼MHJe;i>c¤ŠDlZŸ¾P'ËÕúÁ“úùé©£} ö72æ©aÁþF¦î/ýf:ƒâx§ÁÈ‹yª¢^ D©FøHx¾‡«jt£Å¤êTß@“÷ÃÆ0†1ŒáBÀF†&§|áÌ%ý¼ëÌ4YØÓ²¢½éM22˜ÎÙ<˜VïžêtêLBr+qx0Á›²yÐ4‰‡íI:hèØð^*„SÕß„÷Rx.ÅÜÕöÖ°8Ï÷pJèd¶²ŸWr’9òT;‡EÕϲ†$S_cè~‡E¿m5,^œàüD˜ø"˜5,ÎNÕâ‰ö$³†ÅÃM!þÿn~Mî»$˜–ð+Í›H«Jîé»P½pêþ;yr‹œ¿;‹¹¦ä’~^곤hP!Šz ˆXª9¸¯¥Î¡ƒw" `¢›ê´½†x´¢ u—–•ñ€QœÑ(°(Dÿã¨í†A¯)LëTèØh^ñàóóJy3­hÓò;©­(8Ó‹­TûNEeD’‘1Hæ˜s cÃÆp¡ ÊÓ8åcFãm<Ü’]FrI?W½I€#îç•\½Xââ™ï5; 8]hcðpp«×Ìi~NÛÓÜÂM!Çî1jçœ|¯èüc µªŸUèXY÷ϊѼ{ÖϳÂéø«PCäNpÔÓ4¾×eÄàáV/)íŸÓq¢¹»í+R·+Np> âAã©€ç’~îç•<ðÉgZï´½ãÀsI?'o$-“§RžÆz0˜ïUÆÕm¬Ç‘ÆÕsL='T0½&ï2ý†¬6UO:ÉDYÇœ:DYs¾Ú¾9½g cÃÆ0†Ï Å îJ.A&ÂM!gr ÀíÂHP ¦Ó8µî’ªQ½¢{t·ß‰5ǘT¢Í5@M_*xµMyyñ~ãu¤6¹íÊjƒ{Ìÿ¶8Áä׉ÈÒs›EB@ 8SÉôÙFõŠÙ™4 ôbŒá#`yÞÁÑÊ$å-[$=tÖn8£zEÉÌò\É ™ïKÍ‘"ž:æ‘aîó•ï’³Týâ=¨ÉãëÚiro_äx˜]‚Iûœg‡ñbzêëADDh²¼¸Ôf7=ï7ê~­(½…z²¦’êÃëûã¦UŒXæxËÝë¾ç!‹¨û~øö&w¯¥ÚÂÊñ½éO@ ÎYLz‘gy0é%µ¨—/UNΖˆeÒgy0‰ŒM»ð½Ô-L3M·yr‰.¨?ˆ¬0’é"•œ\úòÏ«~|ÏR¢û¯Bk(N‘“'“?‹yé}Þ:ߨŽêCù1Ý›ewÛè{®ÊL̪/¿æ{–²H¦oü@ 8W—ÌkŒ½7žÓ@%S¶æÅ·@þ¾—z4÷ÅÄÖ%YÜFõÉ춦ͼØ3êOžJm¶µý†—¸ºž7OÙ­¦ž «™kUS×ø9óÜYž>ø×^æ®ÇÌ×"ÒS´FµèGJÞžï/e Û:=&Ñ9y®i©}²Æ™ßã­ƒ:y¤¾yvÏòoS ‚S¡Ì}1"!?YÞ;JkåÁHQU/[ßP0ž4îQãײˆdY‚ C*©íšÖ„R°~Iõ«?‘/—„ˆtø§’ýÆî'c…ØFÄÄC2‰TR½òH¦Þ¾)ϦÊú¡ånþnÝèG…†éõ‘6×ÎÇÎG0ié€Fö2 öZb«o¶SíHÎý$3\æSßdÕ3ËkM}ÀëÁŸ_î[?žèùÉì @ ÎÜ«âó°Úãu‡üà t¼vLœ\:Ó¹ôtÓr¢SÖ{Ië0SWÎ Ù=ïIyñXzºÎëæ[§—)M&=×}žJ—Ì*h®ÓèÖøêÆÇÅ%’îê3N2‰\r"é~RÁRä!'ï™§î.Ét=š.Ét‰œK2]2ê’LòšÀ*F0ùYR]†@—#—<(Š“K‹0²ñ´¼—q¹ÖZbÖFÓq~|=-©¸?Ð@ 8t@;ĸÇEЇk雂ë#H}Œç’0ªár²Ppwëɶ ýàIôƒ'-íŽs|ßþÜášvïqIfã°¦FËö~è£å FË“Dð]AûVÿÉl«³A·›o*­)ž~Çºî½ ¥ÒBà]åŸ"ïFT,É(}nî?zÛ±Eõ»?>€é£¸/9 ¨ïÚ•û 4Æ35:øFŸ3ý}çƒ;QZ&.Ï·¥ëÖœñ®A´+ À"§3àó\r©d. ˆqÉJ@$zJAÁš¿óÁôú8Ïûb1ýg'¨Öðè@gn£©ÕG~>R{Æ’©¡ø³~¹~—ëדv×+ºqXS|§¦iã¨E}Ú8ªe5Y ‚Oܳèz]Ï#?wåy\¦;õêõ`\½FgšÐëÅ‹‘å½ä:˜t-¥…èL§:'öNºžXwªÙ·F‘ßÏm©)OËN*J IDATó¸ï¥d×ùºN÷¾V•ú/Õ— Ü3íæåóvaéERž/fÖÚMäå‹tæíôµÙ ÐÊô`:ÇÒ>¦žÛÆ{ݿͦÈïeQR8G©©nòbòº¹hÚÈ4:©LzG%@¦Ê@pîðŠ,BéžÓzº¬z™å‘¶ìO†7+kz¯t×_ú„®‹¦ÊS$“¦ws¦ú}AHÔ^"—|zÔÖ¼QžÉwñTxWz&³~l:ßÍÎ÷£‚Ž};ȸ/<¨§0ÀÇCn‹dt8‘Î#—®HÿXõ«gÕ/ò,S{ˆdºSäyÓ}½$Ó)Û­J"›^­C0]ÈL@ |ª(C0síl+GŸÓ%Y^’Y‚`æaQ’éÍ#~û¦!mÙ¤[²&ç‘b*ÃëÁôä—uY¹6K„=ƒddýH¼wI^ ̬u¤q=Rë.ñw×]úÄáùºK·oRë.³HV^ò[&+ïÙ*$˜N€O0?ïùlv_õl ÉÁ§ 9Ézqú¦’³v¡)¾‹Í"yP³öÍ>+¸Ó“®=o ¹h+ÊL8D H|Ýç¹[&Hë‚ß3Qö9ñyfùç¬ëš'…Ä£ç³ì¾{Lžl‰ƒKøóêÁ…áùÞê 5L ‚EA¤‰^ºœhrâfMÆ^N ³¦/]n—(ùÎ]±îV1V±Úœš©ñq³Ž—æQäöKóãfÞ|Ql"Û-ÒU@WÝÅ€m}I“¶dãðhþ"EÀ|Sôüš‘~zåz¯Ü‚þdßRpÉdÉ$rtÖÞcøoê9üé¿tÑíwôŸþKú/]«-nÛè{ !ú±XÂyy-`{kÇDÞ+úù#X…º?>@P‰¢øƒ Ìß-'àJ¨GìƒÁ0¾“L€® Cs £xä8·Õ6g˜ÜŒþ¶Gµäo\ ‚ó€Õ+º¶9³.NnV@×&ÏNà•;‰_Dô€È«¦Áä×]¢H "š–í‰@ùq|؈êõè(zIþòë Á*‘ "rD.9ˆÐ¥È%#̼Þ@: hoïÐß` ¶äÏ|X5Ç$[DÒ2÷Ç–ÌŒ© 'ì®luKa[_Ew¡T·ßÑ[OïXy«ÛXDr:œ„û¾·Â÷ОÄVøž•ÇÆwGØýAßáÚ—¯™ë$MtíË×°½µ£›àqBÀ’åá;ÓàÈ’Rìe£š±wû}åý·QÛœ¡»ƒ­§w0¹YÁ½ÇžÁöÖŽõãä˜.ׯ£1ž)N2i¬¨~mÊ·×÷î`°;4ϯkw(Q=ï|p'"vNÛzt[…èéÀ”Ki¶Û;¦íoDRNJ‡ûšdè~êë6BÅ€Œ–“¿Së˜‘ÉÆd†Ù ŠJkj®çýÐà¤0L€¼îùýÃFêe Ù&y.‰\i/&'nº•؉@ú¦À9¹<Þˆªðè¨bÈ%!œC¿4 ¹ôaT¯èûãܤ§Çãö…sèã e­•#BÉ=—”ÏÓÃïBÉ=—·›oâvóM£…ÉIÓ5S¾¯YÝ"^fäÉäýëŽßq+!Dò^š‡ ï.¿ãfãfóñ«†TÒ÷î˜sýLß7aÚ8ŸŒÖŒÞ©‹û‡ ¬oþ(z殼ÿ6î=ö ú·;Ønï »ƒ{=ƒ+ï¿¥‹û“÷)g‘KÓ£ý޾ñÅŸƒ>Ô¶Á`ˆÖFS/ ´þ°1}"—vÿ¹€V«™»ç:Çöû;ÞcPM›\RZšŠÿä䈈¥ ß5@ Î ÑÔŸBãÇEP­ÈÛèz.É$Ä“R¥¥s"Ÿä%Zh½´« É4ÐP˜C“·’¦f£©òÐ\§)qòþД¹å½ÑPA%òÒ·[Ïûã€M—sIç«ìþÛÍ7q¹~=M(‘„Ÿ®%O%•›à&ïeת×îàåÕ[˜aŒh̪ú0Uÿ%ÕÏQ„h³JÎǯB÷ÿ ÷âóÕú \‹ÅÒ‰\ȓɯñöDÕ†—\¢ PÁ˜¨˜$m$šo‚yú¢%㙂šén¯ƒn/òÌ’×Á |Ò­P¡ÒžKòßúèñT{8Ü4Y þâSÓEÐÃ}èÍ5€"ø×΀ ­‡ûP“5soáî;üÙq®7Æ3ã'/¦@ ç €@ÇVOÌL^P?÷ìp/…î®ãÌw£É]Qk³µÞ ¸°µO‡ø>äY²D”Þ[ ðáÓž­%ù5 d¡zút$³Àøq·ßIE+»X$Ðg6¬Z{Í»"õeörÕ+ºÛï¤ú/«?]‘®Éª‘Èiqx¾ß8åã bóm%™ÒÙt¥¦òtHÙš×n¿“Ò@õnïÈþùóÂ}Ü`4(;ÐÇ×o@ œ Ld«ç¼ˆ`fIù¦¼}Д¾èZ8±ÌÚ)§,!Ƀ»ô"v7 §t¯%öD‘»ý’Ò%-ÄÀ¥løñ™‚t&3ÄÀ‹HØIÀIæyù"C`žÀI¥É/û‡ à³†Ò üùË­0 @`{PÉn'ð³—~˜ª#ï>ËfÑ h!8ÓŸáúùëÑþ䯥ƒxø”rjzÙÉ?+ˆÆµgåà=®W@‘æ<¢\Þ~"Á¯S7hxûéØÀT„Ù°ª+­) ¡ø1`ߦêH¡1Tj\rÆ)VX$µ‹Q½¢“™eçÑü¼îgaϳÑ3½Ý¶×Gš©úxœŠÊ·ÄÚU·tùä¼ذÊÆ+@íhíeÔŸÛI{W¾hÖRk•æT{@p®€ˆÜp½¼,Ƨ‡ß±ÖhŠÐ·6ˆ^’|{>e뼄É/çó[>}¯ë)^×SÑäg‰§'̈_˜ ª˜ ªiíÎóÉ>ô'ûÖÔ£¯-üÓG€ûã ´±Ñ4ROÐ*XS4ålô¹¤~é½r ?{釆˜[Û*è/ýXãàÝ*¾ôc[?o»‡UÍ£ß÷öM?Tõ²ž6Ž0UGjªŽÔ´q„iã(!œtÓxe%Y{‘;õëö;úàÝ*èã_c2èVažæˆœ>A­bö‡'{c2³"ü©Ýtüã}c¿ª5KŸ“6nñ燮•+[ktÕ…F7"‚Ì;W>ÄË+#³†”Èeã°¦Ìúã"â ?¹àÓ„3Vu¥95²/ãN+rÏ÷ZÁ$y -=Ój5#»Ïsè#2Dz\¯(kÆR;ýàÉt‰'ðÁw]²# ã”ÏÛD/oß:ÄÊÇQ=êãzýî|p»»Côú´·v°±Ñ42?U½¬§êH¹ù v‡‘-H"®Su˨_ª¾ÁÆx¦P‡®Ž–í>å[5æx0ÍX"‰Æ6}À~Œ|ÍöÖŽ"²ÁÉÒì÷ß‹ k j0&Sϱ'®§ƒTÅZ­¦un/bÖô7ëßÔ‡!%£ä¶ŸiT™£º•c•÷Œ~*ÿ¸eS?ºõàÏ€+“4ªWL½ŒÄS|Lõ0òMìœ_§g’ŸÓ=V]<2InàR*)7[bŠŸó~å}êjhò¿Šì÷Ùà\ABáYçE×X»ïçy:Œ¾õˆî5N4³©]`Ýã,S/‡»$“Ö4Ò5~γOo_ ¿æj Zç>béLù1é¡t?nÿeó¶Ó€ª^.M0 itLjÁK:Ïâ\ÁOhiÙCö²Æ(;‚I÷ºmuPD ËLÑÒÁ§…3&3S°nw pBÃ×XVõ²þüæ7ðë›ïX÷ÓµY¹]ü0Ýžú]}Î`ù°iËÄ<:\±Îævúë«Ëb/a?œûˆÎ +« C98ïú]$á?‰Žª@ ‹à!~B’)6fð‰ƒóµt>¡ó6¢=¤Ýµy0ÒClí]sÉåëêMìîñœŽH&ðŽ'Wó×RQ¾áìÈÌ›‡©=Ò?’y0?Â’ãÄ:ž+C¢æGF£p0?²ì|ýft­¶Pzåô¤vì…éëNúñbù»kLv‡–½×·ƒl¶vR$´f­¥#©dì+ý½çñ_š+©à¤o}ë[Ö½?üáíú8ˆH°û£ˆÖµÒuÒ}5âäñš]òäßn¾ JΡƒU¨pM’Eel¥þØZã³@8‡&ýÑp>ÕB2@pž0/™DKP©¥Ö.Éä/âÍIfÖ´›ïåÊ=“ÜâÊáp²Ùz¨ifD(a¿ó?ò &‘K­aH‡3àK?ÖÐ-àØQg_ *PàÖ°¸P«Ñ·K ôèÀïdû°ë–ä_dNû‰ÜëêèS±çÕo¡`=Tý;ñÄSÀÚZhM$seuYë[ß‚+òíË×,’é’h­#‚ù¿Î zVÝ啿Ô(¤ô@kѵ¼¦EÈe*¸ €Ðf‘OÀ™Ý|Ht=öTNžMfê¾þÔïVAß²£@ Î '–tñ¸¥‘Kß´w¡âäÒ÷"%"êî›M¤’ô,}ä’_ûõÍwðùÍor Àœ»ÓæyP*Y(èzëKAK±«“ÎGW5]Õ™ç÷–P·{þ—»¯á/w_Ë<y5°DºÝó bë,ºç_S?Á×ÔO2ÏI?4ó<8twϳúŸÐ¿ÝAÿv'ó¼ä2ªUpë£Ç1ªU’µ1ÁãÒÇ-¥|ÚƒÁ0‰ž_=zoïôœ ¶zD~½;A˜Ü¬˜í-ßÖô7¤×sâX-ÛÚ£µô=ü:tíš)V•D ŠÚñèªF¥¹d=»@ œ‚ ‘:n)å¾¹g†¦}¹”ŽïB©¬lziZÓãŽTÎT)—Hþúæ;øõÍw2ÂOŠãpfˆå’;§.85¬` £zEC£Mzåý·1{èI CŒj„›IúÆa-SV뤠gõéáw@ 4&3TZÓÈÃGÒQ“hw¢JkŠj˜AJߘÌÌ5 ]§¿›®:ní`i £-XƒµÉäðz2 ޏ¼ezvâ="Ol¥9UΣ¤ô-Áyá¡GGжôâã{e¿¼ œ‡fmkïÅLzÁrO&·šohºXÏzõ«PSiN*g å“ëÉ#–4 ºâÙ«Ü7Eîƒ˳=cvMÖ´Ôúú 0™Amý9îǶ/ãP$ö?3Ï‘Ë,¯¹«%é·Ç=¬³`4G{:@›žTÆ×ªaúÙ²vŽŠ½‹½q’¾ªÿÀ?à9¯‡ûÖÒ׳ìCêyg$óåÕ@C…¸Ø0K&î£(Úº2©[°º«èàÑÕþqøœ·,@ Ω5˜@äÀ»Hï³ì{áÓ5¾o7`“S~l„Æùš7 øl’É£ˆ¢´K0ýA>È òQäù ?Èg anOý0?ÈÇMŸ ÂÑX,}*È åï’Ï òiÇA>ß ÿë:‰†Óî4½~$>ßÓµ“+tνžÔÖ6BEã_ä“…ÃùQJ¨>é„dý£ÏlmàC,–OË>ÌwÉÝ“ ôák1'ÏN¢í/Si·u$öžõóJ ‚³"rIk0¹7“¯Ã$É#eËL hèÁ·xt·€´v²áç,-­½ôÌ<ˆLу±S áòÊÈ:§£zESô8?ì"ô<ÑóuV2En›ù3éy>3ÓÓNQî· —džiy¼]¥êzÛì‰.DS çyÁœ|0NÄži¯êe= ŽÎ¸´RfšúTÏ(÷ÌûpÜJï;nAusÍK»ç0SX?t­Ù [çRt0@ðiá¡ÖFSïþ Þ+·,í™ÝíwôÖÓ;P+û–]]Z‹I¶^tRSÌ´4ôU­í=˜Ø›yƒÂMàygZ{™ôÕ0cl #™DëÏLö &}æšËØ>ZžàÞ·åm?ÙG5ú|ÿôíö޵ŽÕÜþÉ~Ôo@ÊΉÊñ†ò¦¿ªµÙ;ÛµóµÓàÈ›5˜õ„®Ó0¥ÒvÖ4¶kw÷*÷¥çýHö¿W‡¨êÁÂ9´ZÊw÷õ> xÄ>í—>ZùŠ×Þ8ü€ìµ±~¼áçk4¦Y$qi=3îßA ¢o>ã·o›~ÌÒ¹,² @p(zÚ/Þ°¾Ýc}¸f}0Óm@òB¤ïèæíÔ½< —ey-^CIßIv/O³Å‚H1K—‘H'Sœ^yëëÛÅhyb}»Øng{›ˆ\êOö3ïÉ"*@B.¯æ8临P D.=<™7aJä2øåI¹tûî®Rø{-O*I.¯Œ ™­Lt·ßÑ:Ü×Ý~'Úw›mƒéîÅÍ·£¤kßÛxÞú¸hþÂúøÚÆ?.–vµõIÙëãB ìOʼm}\¾%ÁÕô,² @p–0l¡ýâ ô^¹e¾]èÃ5¨•}óíB "O }»ˆ‚ vÌ·‹×Žðüõeóí ’ðDÛêy$ìMß)»N´0}DêÊ[àÞ·e¾]p‚äõfÂ&«.ˆ\’Ó‡¼éV"—wsX /ÂـȥŸÈ޲`È¥1í /Š;«ï´ŽÚƉ'ïëÑÊDßûö¯R?~hǨË+#“''š£Zj½§«?êb´ò•Lo&µ/¯Ç*÷GÂqk'wÊ[·²½™@äÉt½™óñ«†,nŽš¨ìM±9jzíj5ÚyÈ÷÷!ÁY" PˆTºä’ΉTºä’È"½S/Èx Ýç’K"‹D*Särbßç’KŠ(¦—fÖË“x™ËÏÈëH¤ÒG.“E.y^>ˆÓïÁä6‚!£L} ëù$¸B÷¿- ËJsªn6¢þ§o×^äáà¬ðÐ`w¨»ÙÄ`{kGE“ÜYž·®:ny!´ùVw}˽È>† ÆAŽ4ÔTe§6BÕö‘JV¾âçžü‡5à°À^âÁ<s4*éþmÕpZ7•!òbö^¹…+o=‚û‡ .cTzª×75n•é™ç(Ú%¨(àÇ75Îá›·ìž©qÂlXÕï­‡>‡Íиþo^û¦À*€“mx$A)<ô +ðïyÞKB¹Ìó^òÈe®÷’C.ËÖä‘Ë2[4ú¼¿A%"Æný ™Ö‘”ÑÑÔ·C.¹—3Åî‡5µ„ç5èCÈ›ŠE܋Ư(it°F’/?>Sœr|òP¦þEýkÆ×g¯³<ëí(h_U/ë¬]¾¿Ÿ‚T¾¾k@ \ôÂÕ+z}}ëë+à$¨¬töÞ­F/IÏËï´Ög7„AAjŒjëEo윸ÔÓön¿£o|ñç¸ñÅŸƒ“:Öá¾î½r ½Wn“oÿPxù.òÊïu¼égƒ*fƒª7=ï—<낵ԨVÁ¨^ÑFC”å?V“z°c7/— [ã³<‰‚|Øø´6›Þñ¡ë¼ý%ÎeŠÈ®ÕÓz¬ú»íàí_îkui- Ärû …ZÜv¶ËoŸþd?I뤯êeýÕ—¿…¯¾ü-ïÖ“Kmþ†Â94y^»ýަõ¯ôüŸÄ“+Á§N"|äá4vN€ÈžE`Obwïñ‘+‹dz¼OeÛ—å+*¿‡@÷hÅј×rì!0ùgÙ³Ò›2YèZ®G”Õ_VeÛÇû†êà–iÒ;䈦E2cri®±ôá<ÊÃýCvê§,B_4~YLžÞó“•ž<—T¾ëÉ\h½4ÐZ#z5"‚ÉIfÞó%Á…½˜‰`„s?Á9©ý¬lö v[Óç*¢óUh{J“}ªzÙ" gÕ~ª·ó´<= ©;rY?}û´{/ÝLê?òŠù '³)òâ#çlJÛõÀº;÷ù`cÎã©xg|ÈóÉÓÓyQþD‰\rï(íÄ ±Œ‰&Ïß%—eÇH¦K.éïH"½é—ùûàÂ^`šM½º´³°Ÿݶ¼sD2³¦!IÁ<ïöŸ—½ˆ`–!(œ òòL¿•è¿¢ñ˪¿K0óŒÆ‡{W¹Ó%˜®Ó%˜¾üËÖÈ$·»“à^+ì?@ ."hJÚ v̧¬/ª–™úeÇ£zÅ&HÊ9®£0C:<ön¿Sº~>;­+=‹öó)r:Õ+†lûÒs ŸŠú/•Æ9¦5—Þö¯L ǧ(}гcòªB%ACüØ Ðq<—n_úÚ:V2ê)ŸH+‘IZ{IÇn@y-¹@Ñóó)ý7!ÁÉÀI…E0>#v¾¶Ð·Î°HfæA×ÿ´v¾6Ò·Nò´ùŸwÿwþÕQ¼³OÉü5`¤‰ø±{_aÿ ¯ŠìU½¬_×SsïsªŠ©:J•ΡƒÕt¾Y嵊T‘@ .ÌV‘:Ü×óñ«™7ÙIÃ/Á4uÏi ŸlLf¶]E:˜–£@À›t( Ûžº÷^¹•™¾¨xýSu/Q>´ÑÀPiMu^û}¸ŠdJ<Þ†ÑÚ%‡vx€¶“¶Òœª¸þºÒœzIMÞøèp_WçÙ•cä0ûªkNÂF+“$ÿ£šÉ?ÖÀÔ[3ÉeÑøÑ=€ÿÙë!ÐízÔ?³õ*Ú-ûùî!Ð[á{æ¼Í¶%ri•ÿ’]öÒ@ë_~]Å:²Sý¥k·¢ <ÛUOúrýºiÿýñ‘X@ . "7´Oöjý¬Ö_@k£i‰MÙƒ˜Û\jŠëOM-;0ú¸(²s!óõõËÆ×6&34&3\Õ:)¿·w·ßÑ´—ø­Ç­ÏlûÅh¿xò“H7õ¯ò¦d‹Ê§ïJkj>ÜÞÚlš¼÷ö±·w˜êÿ«ÐZ úp€>ô¤ÒgÇÕ+šúÞ%÷¼ÿêóUÔç«vþ¹$˜ýÉãu“µ7¢=%koÔ¢ôNßö£ÇÙê ‚ë½,3>Ô?½q€ÛÍ7Sãkú/xýàIc§ip÷ùùüw¿.Sj5nnü튭s|°Y‡@ –¨µóqe]NblK’‚ñ i—±“TÙ¶#ÓÂ䚘–¦¢ûqE½Ï ý\êæ,úoQ;תtƒYHÂé*´±•?oÿ1¸:¥||n‹VwíðCßeêîÞÃ50í_#¡T/?>U½œi/£ƒYj|@ ¸``°;´.v{ëü´ö;wFËt{\yëC6ª{Éò3퓈džÇóã®kÍZçZ¦@ OßZ˜÷䡬¦ï¼ Jé„ÒyÆ'K¦°µ0}ç@4íÚ5ܹs'"hy㬥Ÿ^'÷¢ƒ)Áè`’ ³Ž¯È^Fó´ö"ë`mÛ×íwô=WÞ;:ïu°½•xY{ôÓÃï$ šo¢Ít)¡ t0y]<ë0 ¤…y̸ü…ò¢:˜ÓàÈjcí&ÏNP{£††#ùIZ˜T?å”Oä®]»yo&^@’2ÒŸìC]Z‹Î9ÉCUõ²þšú‰þ©þ½”|L«ývýES ÿž`t0ëÃ1€DG±ÛëX:Evµ² ÑÁäv _Çò´ö«Ðzi7**KÓÕXä‘ÐÝ~G·_¼ Ñ¡äõÕ+ZÚ:†£Z%Õ?Ô7nÿèpßäï±gpï±gÐ~ñ†å1Ý ßÃíæ›æ³¾gÙ»½Ž©ÕÛu¸¯©lПì§<º\ ÓBú§ú÷$:˜n¤xŠ ;vò²Ñ‡£µÙ,ÔÁ 7mLNàH¦gòlI>yv’ÖU0Z‘m¦tJw_m˜õ‹wîÜÁî« ÓT?ýɾé;®›IùOG ~âíom6Kë`Rû½:˜ñß}Óuž?At0@p‘ñ×Ò[­¿€J+yÑÀ;w²«KSèOöÑŽ9àöÖNDÀ^¼ùøUC€âhX uûÕDcß[Û& D6¯¶4îÖ•¹¶ Œw‰ÁGh=ì´ÿ’ݾ+ï¿À§w .í œµM¨`öð“Æ^Ž1nF/~"”¼€hêçßÚlêÝWÝÿ«”H¦n{¯ÜÂv{Ý^ío9$²ß{ì+=÷’F$z†¥X¿Ûû—­§|N'ýSûc‚Þh$^ÑêhÙØ»ýŽÞzñ<™Ô9j‹æÁ(£ê b¿_k£‰Áo†¦^;8BPÂðÚ nBSP Éi ¨£F˜ µÅûj !Ú°d’Rýo±ç_]Z‹òWiõÓëê(²×¢~Ô¥5hÄéãòwðÕ—¿à(ÕþêBýac†GG|Øx!þŽÎy“«ß,å…à¢à! !CäeQÉ:ý¬ l¥µ†Q­bÊüþVâ‘#Çã„d‰gŒv†á$³Lûj›±¢ÝŠˆe¥€ºç½Oò2nþyvÞdweœŠÒnÍTî]¥pUkSçí÷wòû‡y.]‚î–¿¾é€ê€쀔p3úÎêßÊžLÉ5b’9ûæ{¥^è¾ÁîDêùõÜtn`Ø$ÞÎò»Åé‹d…Ž[JÍUU·¦ }m;2P@ |`E‘ó)BNj÷¸ÓسÖ©ää’ƒˆ'HeêO Òú‹?·þóÙ©Oʦo¿xÃôß]å ÉêuóØvˆÎt®©Ÿ¶¿]dõ/i`òô\x½lþ…ý›—~R"ÿSØËè`å/ÁE!˜nËyœóüYÛIÿ2ë|Ú8Ê=/ªÿäf%÷üÓè¿“žwû]ÔEý3mYÔ×yù·6šfjX©´Žcp¹ç³o¾g¥Ÿ}ó½”f^þEýU”Þgÿüw¿qªô.h©f_$½@ )L">ÙgÁ¾´«¡[ž@–DŽRA?%óg¹¤ió³®ÿYÛ)rºlú¢þ9mÿ9Êšö £µ—fÚ|ÑôEöÓÖï¼ì.©ô‘Ì2ù @pá0ªWô¨^Ñ)=É’öpΑi?w¨¸ì¬òëШgÛ»ýŽîö;™vîkNkÏm"mÊÙ°z¢þ7íVÈíƒS¡ìøœI¾ü˜ã´ãkÁwOAûªzÙD•gkÉzRyú® @pQàÕÁhLf–a‘ë`†³)‚ R:¤éÓ¸<µé`6&³èeÏïáÄ% ذì–&‹`';×ÁŒelêŸ"¤ÒÓRÒÁÌÓÀ<)¶·v”é_È<VÏY/Ÿå(J¦qT3ãΡƒ ìÝbÙ"W¬?Ohë`º˜e@:˜€|©^¼"ðPдD@]ZK=U½¬£hr ª¡]‘õEt0™¦ˆ¬ àB»MÖ-§±sµ·w˜"!§µÓ=@6AÍ%%ÚGº‰¾]~òÊ·änh7²W~ uÓ~â®=+½+2oê»Y"ëÔ¶;wî˜)õí­…þ¨^ÑT¦zÏØ‰‡“CòØq’iE•;?bHhÝ·S ½»ä«°ÿbдtÖ.CYù¥'¯%ÌŸ½ôC0;ùÞåµÐXù7Œ?‡¿[ŽÖxÉJ<ß@ \$BÖ”%8e_à§%°§%pçm÷DZ/çeðkga"b$ä2ÖI4ýDDæxÃ&˜Ý~G“>äµk׌֦K¤OêaÎë¿plŽ£v¹%AtÞ¿•=‰Ù7£þ¥ã2ãSÔÿƒ›ÃÂñµv(ª‡˜­WQÙ›š*yé«á² Äñ뼃©:RK­ÿø¨…¿[Àý>n©Ò_@ \­ =zŸÖD£µÙÔ£ÃÏatø9“Žï„RÆNysûy×ûìá'SäòÓBk£iv1JE0³þûã£Vª··vT·×‘;—\RzjßYŽÏ渉›ÑЛõ¤9¹tÓ—yþrû­Äø¶Uˆv=måy»ù&0z:(Lÿùï~¿þÁ;)û¯ðŽ!žÇ-¥+ÿf¼•üü´íàAÀ¬Át£]œÔN/H"0¶£Jiû=De\CzG–óªÿiíäÕôÙ+¿yëë+dØ+ÿ¹vÚÙèÚµk©>¬üæ=Óÿ­&þø(ÑnbÞ=M„’ú“y05yÏs|‚ hWï5U¿÷í_áÊ[àÞ·Ø*I™ùóýÇ}6ò–o÷±n}}ë>€öÚõÔ£‹>?ƒM:‹t0‹òàB¢Ž}QÄ<*ù¢Ú)êÚgÕ+&jÜ%]Gaþtì³wûÂôY>áíKm®ñ4Ù€œ(r÷šs\d­L²ÇgebÆÇxDùq½8=EŒûì(ìŠ÷¦÷sŸŸÙ°ª‹Òwû]ÕËæ›ó½äÍß"ûâeyÏ·@ 1O‰ŽÿUtìxQ>söÆx–kǪ2žž8ÿí­µ]¦~¼L~œ¤<7; Ñ´e!y#y‰7¯äÜÛ>gýŸ×Þ8¬eÚ‡5…Üôc¨òÓ7¸Å±+ bËé¬e¶Ù¼öJsªÐÌ~~T°¦òd‰~öҭ䜞þܱg¸èùàbBt0ÏWó"£ª—M½ùñ™¢ìøœäÉ4žKOÝ~G󵣩< Æ·‡ÀòJ§n(hß™ë` @pA!:˜1> ̼úóòo}ô¸W ©¬ Ôíæ›h#,åÝê!ÐmbªŽHS7‚tý>C:˜ÈÒÁ¤õ–>”ÒÁDàã>[qû€¦@ f«H>Ýæ#Eö`59÷iZ__‰ätÌií©¾{>fçL®ûè#w|ºÔ§“ØÏÔÞÞ¡_£³]ÕËúÑÇxgôq´§7÷¤Ö¡·ßßÁ­Èåû;ábvÔ¡+{ÓH§†Túf ò/ׯ{½^W¡õUhëzL^PÕ˺YR?•æTjŒê•LrIQ싎O8C4&tž±Mdíšõ]qÿ ~3Äà7Ãtÿ!_ýÉ>‘ËLrUÀSFNû|^K~ä£hÿuú¦ë¬ "².‚‹Žè%•5-IDì´ö祃YT~V0„ÉçŒÚ?BìAÅ,±32BûwON´s_êZ‘ÝÕãþøÀ"&Y:˜U½¬¿¦~‚v=Du´Œipí9·Ïñâ‹í=xúÇíßw'h©5˜×LïnFk0Ÿ*οõp ÑzØÙÉ'¾6øÍ°°~–½¯±û¤]Kã|lé`å/Á…é8šègvÌu(/ªŽ}v®ƒiÖ$òc¦ƒ™•¿¥9èØ¹fQýLd6;æS÷¾ô|œ²ìtìkߨ^1Z—¾ô|Ÿ¯~¼|oÿàiøÇ”æxLJé`šo~Ìt0³ÒSĸϮYŒWg0:˜Þôá¾=V޽ª—5í?ž•ž4/GõŠé:^D3óùàBt0? Ìrõƒk÷±S—ë×5âµtÜÏÆI ¼›¾”f‘]_pä’ !mé`¦Òj:˜9õ?æT©)Ö2óL@  :˜ç­ƒyZ{Qû¸Ç×›>ä‰3ÇN<ß“–Qz|NòdºžKŽÓŽo! Úwæ:˜êïL ‚|ŠÐ'TÖN:˜ïV#ÙÏËï<˜!*ÒÁ$-L·~© ÇN:”7¾øóh§ÇN:˜½WnA²¿pÿd À"égƒ*fƒª7}VþE éb¬)ê_.ÓCùÉ%ÆgyÒ¤{ø¶&£z2ÍÛ7Z™hú¸ý£ÐÓz:€R(Ýÿ¼žêÒÔ¥5ïøR½Ü(¼}$sÄÛGvÒÁüêËßòÊ- ´ù çÉòîë¶ ÑÓé_Ò.õ@ éÿñHk.3SÖ°®ƒyV6ËNå§àÔÏ ‚™¤í´"`ë`’D¸[“÷OSkªÛë ÛïèÙÃOböð“ПìOÙï=öŒI_Ž IçéG‡ŸÃèðsIúØÞÓz¼vN|:˜ƒ›CÕÚhB‡ûúÞcÏ >[Ëô_Ž×ÆÇ§ƒY4>ÐÚhZãÃrxù>Ì2ãOýwçÎܹsÇê7WÓm¿ìT¦|Ÿ®¨OS­ÄBíñ÷Ò@kÊ¿­B“VÈ¥@ .:MÒ…ö‹7 × V’íiíä"ï›ë+k·vêaö«H‚UÔø°1ã£J²ÆyǪ£e¼®§xNUA»©Õß¶T+ûЇk†HSú+ï¿ ¨m΢ôÁš±Ñ.2»¯6Lþ@»ÔÞž|°Y÷ÚU°fúi7j†«ƒ©Ã}½ñÂ×®]CûÅÆ‹gˆVVÿÅRFEãã³´_¼Þ+·°ÝÞAk£‰ÝWQ=×LÿH=_WÞz÷¾ý+óM?2óßÚ)ì>F„­§wпÝ1ùÓ¶ŒO¿ƒÛÍ7±¾gêŸ[~{Õp¯Ø:˜ôü<=ÑÁ¤gÖý>n©Â¿/@pÑ@kÒºýŽÖá¾ç‰×‹¢`Oc§2èãÞ³ˆ¦1¹TÐW¡õÒ@kî›È饶"’)ê—"ƒM$oNýÉÓEëKÝkeû§µÙ<;­ÅóÙ‰ñþ¥©Xwê˜Ê¢vXÓÂ9ý—;>ÊîÊÛí3^wJK×LÿÊDóvðó¼üËö/ÝëŽ)­7 «uš¼òÃyÔOîóCרÿ)rœžk:/ó÷%ÁEƒ™ïk¿x@â]qqR{·ßÑ4ýìz_ô'û ÙëÃqâ¼´f¦¨AôMÞ¤Cùœªâu=]¸}îýZ$=yé\;í?î³ÏǯÚ‹òwû÷—_WVÿ‰‡˜À×!’þ¢¯ÿ¾Ñx(|;×1ôÙù8eÙËê`úÒsÌ¢ò3u2Ý4Î1ä˜èmvÌu0½éëÅé)zÜgçÑäYís=­Vúpߌ¯ÏÞCòÔºéI“¼–üxÌ¢çG ‚‹ÑÁÌS•ÏÖ¦ûW[:˜éöÆu0ÛU;XË´‹¦@ `23'´Ì…ØÃ“i/ÐY4kê2 ÃýÜuo§í¿¢ò‹Úg<¾'—þáÇgŠ‚ú ¢€<™î1Ç©t0¹;Ÿš4:˜ìEoìŽÎ¢k·t0 áÓFÓ @*Ó?©Æ,X>àè`zÊçýT–|¡mÖŒÎeã¨f<“”¡uA¶Æ‡t0ÙøÞ%'–£•‰ÑÁäí÷é`’]F®IE>>•ª“Ω3ÒÁäå¡P‹ÛÎd®xûŒ¦çù;©f·ßL@ |6ÁI„<œÆÎ Ù³ìIìî=>re‘L÷©lû²<`Eå÷èÍ 'TdçÒ>{*=/gŸjNÄóæSÖÕN<Ÿë`šo~Ìt0³ò·4;×Á;ÀÖwzúÏZûéKo嵤Ïð`¦êoMU§Ós¢/=yU¡¬édÇV€N†Ž§YÓÉÚÏû?Ys™®×Á$¯%?^D3óùàBt0´æxvâô–ý©›G±=>> ÌtÓý«óu0®jäè`6kùýGví··*líd¦ßÞÚ1ùo¼02v~ÜF˜™¥9Uhf??¢ƒ)‚ßZèX3P#ùйûmìNº¼ô¤þEõ[ þeÚ—{§ž‹¦/e¿³Ê/ÓnúEÇ ëš[ÿ‚̾ñÙ³òË«CnßÔÏ=·<˜PÏ?^xw–7sòémoAÝ>¿/@ N„n¿“ýR=ûy¼ó®»{óhe9(›þ¤ö2ãOÇDŽx:kÛÅ‚çŽq^û(=MW»vŸ¦¯]>»{9WéòËô/'†<¤';'—ü>ŸT¯?—(:éØ @ð@A/±,ÏÈiìçMðλþeíYÞI ‰²NµÁ±S¶«çèÊä¸v³_5Ëß•(âåeõÕ‘ßëæ‘Eð8‰+º‡çÏ5/}“§wåƒÊö?oóBãç<ƒ ¥g ’I¶,Lx]gL0]’)žK@ |¦ÀI‹F¤EÈ_d§µÓ ’^ž'%x£z%ã›è`^Eôb¶ô̪^ÎÔÁ×ÁÔˆˆæ¢Ï_·ß1îîŽC$ž%˜îëÿ²å»:˜ÜÎu0‰TºßeÚ'Á…×Ùs_^DpNc§2ΊÀ¥íID²K.¯B§t0-rY?}ûÎÒî’—2ö“ê`º…“Ùyñ‘óLN°sŸ6¤ƒéŽy.yz:/ÊŸG‘ób®ƒi˘h.2>YãK$Ó%—ô÷$‘ãtͧƒ™õ÷%ÁEƒÑÁÜB¤e¨V=OßxR;×IÜB=îQ*r§-b¯g);á*:ÝÔ »ÁÓÆª£å3kßYÙéžÓØ}àý÷aKá—_W©þÓ€æñäÆFÄœé`šþóè`¶·v°õôŽw|Ê´ÈÖÁ¬ÇÑè”ÞÕÁ,ÊÿÚµkÞcBûÅè½r+Ù‹ÜÁÂTÿ«zùò‹ìE:˜eûO ‚ ÒY4^+vÌu/ªEé©­>;yUɃIöÓê`òþ§{}åsLòZòãEt0³žŸOëÿ @ NN*RS¤Ÿ;_séÛoÛ•™¹hõ?­¯ô­“á:¨ B:Ü‚ ¬|F+3†£šeS€êé@€R¡÷ù¹sçNfûu¸¯Õ¥µèØ3¾„ÛÍ7ÓÏVÜ>Z»©.­¥î©êeýÕ—¿COÕ‘•~i õ/¿®pðná|ª¿ôcmvZj#T=èËõëîÐν™©G IDATh£@ &ȇo;ç#Eö`59w‰¨õõŒj•”è´öÔËÖ=³óIÚη Üö,¬%dæÒš·öö±·w˜êŠ@¾?>Àýñz:°=ü*­)fƒ*n7ßÌO¯~‚ŸêßK‘L~í¸¥ÔÓên7•ÍÏ‹ê×F@ .ÌLÝÿ+ÛÒÞ±NOj§¤;íJ3Ä/ð2ö{dì?Ãí¥êGÞ'cnMjßIÓ_®_&3oúËõëX__A»5õ¦§4yö½½C`2ƒîÿºT—Ø~¹~½ñ!(¹Œ“'äO“·2&ŽÜƒ©‰ ºÓ•Öt¡ñÉë¿ ôìÖY×G5ŒV&Xßüön~ë›?Zöýä=6ˆÉö›u`w}sÄ×¾|s\X?7ÿ½½CÉ¢2é]ûOakmé`=Ÿ@ \(PÔ±/Š˜G%_T;E]ûì\ÓDWóc¦ƒ™•??vÓs̬ôY>!#ýYØI“ú’÷)Ù€ì(rê__ý¹¦7½Jt,½é™¦OÇ“ë`f¥§ˆq^K;2†Oˆ‚{²ò×á~õ‘U/ë¢ô¤ƒ9V4/¢ƒ™ù| @pñó”èø_EÇŽå3gçI>;ÆP•ñ4Ó^”ÿöÖŽÚ.S?^&?NRž›"‘DÁ9H‚T˜ÍŸ¬>\¼5Tã°–ioÖsÒ¡ÈOßàÇ®â5ÆyícÁ[éô,°ËgŸª#5ÅZ¦]k*O–èg/ýØJÎéyáÏÝý/Á…= î'/^O$m‘køù"ÉÏE‘Ë\ªÈIÎ=J¾HòÓöOŠÊ·Ú—‘wQ TøZJ_€V‘LQ û'ŸêhÓà¨tþñV—Š»÷öoòú§È^ÕËúuL›?§ªp¥Š€èoˆ+2P¾Yåñ .@ . ’5˜á¾ž_ͼ±ÈÎu0#LS÷œ– ñ)ÁT$³Jt0£@ÀÛÒÁ°íع¦EýÃëßßÐM‘Û¼òm=›³´æ¶Õ³ëÄ;Ÿ«ìHò½ÅFÚNÚJsJ:™™ä2o|t¸¯Ç«9›h3r Õp€­™¥ƒ©b Ì-„™ä²hüèPÁÛpǧ‡@·ëQÿÌÖ«©5–=z+|Ïœ·/Ϧ!—Vù/Ùe/¢ƒ XZ˜@ \8@ôr‹^ªÀjý¬Ö_ÀU­Ç¬Œ=X(Ñõ§¦¸þÔÔ² £‹";×Á$Ar× $-F«ü:4ÆiÊFèö;z{ë#À­Ç­ÏlûÅh¿xòëp_«àmÓ7¾þ¶-*‘½mcÏ+Ÿî«4—ÌçªÖæ:'ޤ…éöÿUh­}8"OX4WÛG€>‚Tz«þzÛ«SJ}ï’{Þõù*êóU´6šöø !—„ipdʾ ­}:˜¼oû½mõŒi‰ã½Ì6~Ô?½qMé¿àIôƒ'¦ÈÝççïաѤç÷ÑÕ¨ ôM×yþ„ÿŸ@ ‚‹ E/ã»HG¥^EÙ}Rû](µ4Ðú¸µƒÙð«õKAÅxѱSï_Œ÷qW©˜hå”_y„`Ö»¸:ÎO¿hûuø €ˆPœEÿ-j'/fc|#j¿R1!ìbiWC·Øýª[ÜPÊKÐU×4îA-;>©öÕ»‰}¬-ûhå+hþÂ|Sú¼º»Ïw·ÿEÀöÖG ÷ïlxŒÊ^ì¹o—Jÿ?ëü½:ôÚ«úŒ¦nEÄß÷]ÔÆ”A ‚ŒH¿¼–¶dÐiíô’¬4— ‚·ñ訂»Ø1äc;/3‹¼¸å§È#1gÑ>n§úŸWþEöhúA'm?Þ`\Du-7¹¬w-/&/{‘ñ±ìT+““K†dæ×ßCžâÌòsêWÙ›b¶nË5-’>Ë~ÜRê‡Ï™)q÷¼ðùà‚!¥D½4èต­±·¨ý*´æ/ÈÓÚ¿·fë.Z?Ô»~ofÉôÝ>ªßJ“L•jŸ'l‘üÝþ;ëñYt¼ãÃI%'› Õ‘ÓG2Kå1ÞŽ<˜çðüé`–Í_ ‚‹C0iº¼Q|úï¢Ùiúw‘ô®×Ò=¿Hí;ý/Æû^;÷dšióòOõŸƒÓŽO;÷`r{aÝÙµïomŸ¸| ™¶?ëöE×tjMí"é@ ¸(Hy0ïb'^Ûå÷’|Öíoçz1týνý45®ü„±tÿeàÜëdÚˤ}ÐýŸewI¥d–É_ ‚‹ÑÁdLÑÁ̃è` @P¢ƒãSÕÁtë^¢|(h¾xJÓi¿g¦ƒ™±>ðߦçÙL@ Ê#"r£â"é8rÂ2ö æ6¤ƒiéâè`N²;¡Ûïèív4åH:”Yí'Cn×á¾V—Ö,L7½ë]åûa•Oß•ÖÔ|¸½µÙLé`†3Xý_¨ƒ©"òD:˜îøeÇÈÓÁäýw"Ìxÿp®ƒÙÚhš¼)Ÿ~¼âƒ÷ŒÁõ^–êÒÁäýËí¤ƒIí3:˜Îóóùï~#¥ƒ©VãæÆßtçOø`³@ .,Z›Mm^¦ñ'œGßd;H^à³aUëp_ëp_»/ð²öQ½¢Gõб_…Ö‰hyô‰¦ê#qnÔ}<õC§nŸk§úŸUÿ-j§þ ç0שÿ–ÚôÙÊŒï?Ów ”?•ÍÇgáöÅãEõçöÑÊÄú.Sw÷žn¿£»ýŽ7ÿ¢ú͆ÕÜúùÒWõr¦Lh|ÜïRã#ÁCƒÝaîM§µß¹s@äS—Ö ×0Ø/Ô"v^&Ù r¼—e꿈ê^ùÙ]ïak£iúë`òþËÍßçý­ÁòbRþ¼ìÒù»ö nÆkx™}´<‰¦Åy0GË“â¼ã:ò{ÈSœY~Ný²t0O;~Ç-¥æÃª¥ƒÉÏ‹Ò @pÑŠ"göËý´öÖfSóäiíµMgm¥[þ¼ Ú¶ò,êÿY³jÔ6g)‚Føpž’—8‚›°ûÂãsÂö5Ž"R΀ɳ Ù\$oèö:Øzz'¿YyL"’éàEêe/«ƒY¦@ âœ_¤öæœÈeÞýw•Z8ÿTÿ9(Ÿ³8'RÙ8ªYöº³kD.OZŸÖÃÍ3k ‡ìhOèN™ô@ \¤<˜@ôòÊ›–»èöBÀr§Ítý/´}‚RdóAÕ¯(íió¿Ybs|öõçÐzЇK~-š¿@ @ @ @ @ @ @ @ @ @ @ Áoí¢âc¿6BëÕV–Ýwí4Õ+FXº1™Ú®O‘t¸oîQ—Ö¼÷dác½«RоoÁÅÇlXÕ€½ !ï37ë€Æx¦t¸¯ŸSöÞÛßhÂÉ e¹®@7OöB$ò{{‡)Yd×á¾î½rËä·ÝÞ±ìÿtûõ>ýGÊ=ö혬f·Á½ß½×%l*X+ÕEº‡@·*÷¸l¾ëë+Öõ½½Ã¨¬ñLAAëOö¡‚55VõÞÞ!êÃ1ôáZÔ>] —1UGÆþÎècLGÀ8²ÏUTšSõÞ| g϶ðäf5§8ÿpõ¥¯mΠV¢2¡ —v5Ž[ÊØ¿·¶ÝîâbL sç¬ã"¹$ ÞÈÝòçãWÍùjý빫՟÷î 4¿váûV ŸM|ßãÖFSwûs®=BgÚçOh=\®@·6š'&—ázoïОÙCO"œPñÞÌÃ'Rv=x¤Õ+ZFž¯ö‹7Ð~ñFµŠIŸÛ«PÁ*Ôë«»x}u‡ÿ›††ÿ…L÷ót®^ì*XSeÉïShµš‘eõo#TÐEä²¹r]óo "‘Ôwâçà*´þ£æë†\¦ñ²®4ÿcB.=ö'WÿÕK÷ ¿þÿN ¹t¡µÒ«7 ¹$„shNÜ]¯Ã}͉¿û#`T¯hþ…êÐU½l®ñc ê—¥AòwÀ€ÿ°ñk­ôUèTžZ+MõÛ{w†õ§*VµÊ<¿0¿ŠJsªVë/ ÒœªùøUÓÆZýyýÌ}¾OñàL@$S#"ŠüIú&;]Óá¾!™ôéö;ý§Ûÿ˜ù" çÐë]óim4õÇzW‡sèp­‡O˜ãpÕ®ëázT¯èQ½bÝCälT¯èºýšÊÏ:ž?¡õðzSO°«çOhóáuôÕÛôŸCx|×4 ù‡®wû õo´¯\ž–ÀÉdk£©›+×͇úˆˆLê8.G‡ûZ‡ûú*tª‰€EÄëe:’OÜϳa5&q/›2)"€áúá^R–÷54¸¥ADº®B›Ûß<-ï êo^wn§vS=gêeG=:¦vVõ²e§ºP=—Ú[~Öó¸÷¶¾ãz5V +Q^•dÜéZfên®\×V»âþáDºVÞü-ÔêÏ›OQþ@ œ(@i@ol4¤§ÈWÿY©ùZÿ r+ñ)òÑjâéºÿíî»cΉdþáÓ¤8ÉÌ"œ/làÕ›×áõÝ”}sÔÄÍÆ0ªãSÿl®×6gÖ}A‘4.›¦Ãç󹹇®O°›šî÷á¨Dö\o[Šì8Þ>Nv€„Ž®71ºžô1ÜøâÏ[OïXí€þí\¸Kš+×µúý¯[„Yýþ×ñ¿¼ÒÅðð`!òRPÁq˜ô¥ë¡ªÿUý'ƶ½Òü˜ ÿsîzI? øõ ÖÇÃûa3À£ÃМóéñ`ŠúU®áwÿÃÂï^þ‚•õ·ZÙÇåÿüËÞÏ®½½CüOÛcÙ1†"Ïå´q„¿½òe¿ ¥Ès©[Àÿ·ó;øÝË_0cåÅ´påc¥+§ÆetE„2¨¤“–Áðæ«õÀ§Ë “ñkêí¿~ðÌ}Æ\;YI@ ä#"²³±ÑÄ`w¨»Cµ±ÑLy0‡Ð2öá´Œ“¦Å9±$\~kÇÿáÓ¤Bý±õÇz>Ÿ§¦…9¹ôÁ%_™ bä’ðO·ÿQwû½ººjΉŒÕô\:¸ŽO®DíýF”n°;´Öx¯¬ŒÁ½€’õ‹1F×›h\Fóà²!™@Dvº½ú·;¸öåk*ÀÁ»Q`Í•÷ß.l¯úý¯Cÿ÷ão_ÜÆß¾¸ ýß ø»¿ý;ÑÚËÆx¦FõŠnŒgН¯¯:šêW—Ö ¹T+ûIÝ5ÆPÓàÈËêh9!—ª1ž©JkjÈ%•Iv¬© ’K}¸–ô†º ¥Ž7”!—jKÓŸ¬_/ÿç/à£ûÿª>ºÿ¯†TòqùÝÿðŸŒH%'—/ýÍûÆN¤’“Ë/þM’?‘JN.}ùwŒÈäöÖŽ!Àü85^΄Æx¦ÖŸªo%ø4V GÎ’=|Bû¦Í››«Þœ£¹¹jÈ¥dÞþë·ñößüu¦] ‚SÃom45¿æN·6šÖ5ʧÛïXSäCgz/ÔkïqLÚø49ó©pkê3>§)òpkº—ÎiŠHÖºÓä0Á®^oêáõ¨}ÃëMÍ×aZe3iúMÛrÊûX¦ wšˆ ‚ý)š om4MÛhœø}<ˆˆMc»Óå¦*^£èN—×;ÕŸO—›rT2ÝÎûÈô£B´ÆÑ™.§iiJóÅË_Ð_¼üïrîgÚ©.YvjK–ê’e§vðMî¨<Ðyc%ê#~lÝèy.h*Ü"§vÓ}4E^«?ïmƒ@ g k™C|8Á"BéžÓñI_®œLfLw-fÁääÒN7H †×#ÂÌÉåü ­5ž×ϧÖv¦<•|M` ’é#—@LúbòÀ‹À×_º ’™"”× ”C=v70Ƶ»5®Ý Ìqín`M)zö¬g¿ÌßK.ñÿ³÷v±‘d×çÿFWkž4­j¯ÈÒË‚…QkÆÓ“™dµ¦íY`!m•ä`Yê]{†”ÝŒÌdKk@V™ÛO¶†™Y¥`·]̯nZ;ë‘í–-`K,KO{»º2“¤¥]l·,Ì‹»ªá*·å}©:Î>Dœ'nÜH’Udéü€@|ÜŒˆ{#’È?Ï=Èûe„ûO»¯âRQEQÞ&Š„ßqá \y¯á³îJ|›‘Á3EçˆhDþvsn€\\ýJN°ûŽÈSÄ:>ñGш.®~….®~Å{]Ø$³E¸VHåΧe"ZžÚï¬õ·Ip ^Æ¥x¹t‚ßuEQE9%wäPޤÏX&‘y°˜k—âàVÃù|ù£ºeörírÚ·»ÙË__ühÀPïq2õäú÷Ïê%{}þì›Ý ­K‹œLV~~­Ó²ÛÍUÿgŠü;íø ü;§!Ó@¸Ÿ|š'IœPý ƽÿ•ú?¶ïÉ&YODe%Ùe‘¹hÒ  æêºiu6èÂ#¯`ûd_é|ͱ¨¼rùkÁð1 v‘ðõë+§WñÆÝ¥¹X_üÀ›“Ó¹rÃøü$‹ hD˜ƒÁèÍÌC‹Š‹ž¬Â_ô1úµJ¼F yÚ2{Ù|´ý7½ÏÏÞ§ÜÆ:€–bqyq€Ô$ È+OF¨‹†ÛÓEQE9 ú°Éhi”ü¾'Ó™2ZZ¶³ÅDæ.tÏou62‰Ðe;ûÀÉÜŠ²½±R'P·Ûó_q~ÈN<œøXïqB-:‰&(0 vVì´½|PÑT©o–…Ó»m9Hžª—–6¾^P†¡ÝEo®G ɯYêþ…SÔÇÌw®}›(Ñöw_Çöw_÷NÙr4>÷ûÏ}œí^Ä/Ð ˜í^ÄŸ˜§ñ'æéääX<"aÀôY3·ßø€8*µT^é|-öbLJؤÅÇð-_»Û÷‘sx¾ùÄÇq®ÜÈ%×§hD—šÿp¹õ/2ﯱR'óÐ"°7öFq•)0 'k§PÃ8­'B-ÁVajlÇÀÜjÃÏÌtÙ3.&åE|cøÆ.ÀBSÅ¥¢(ŠrR)TX`ÚJ$!¢3˜l=#€ÎtÓßxp6Ø9_FÜrûÓ4oÛ­À¤×çÔI`&¥ír0,0­Å®÷8ÉtFgʄۡÉ\H#{mD²H‘´×¿ ¶XF´Ž{U:È’ÙF@û+aæØÙÍöWBÌÃÚÅ öy»×wM« ãë cË%³ŠҒɰž;; }O û{.>_«6›ï\û6]øä3}ÙþîëÇüIÛcv®Wñ ô‚Ýÿ« ¯Vlå¡Jí¸)Ù{lÑ)Îâ’‘ý—PZ/š0úA×_ÆJ&½QùÙºþnÜØÅëcô&#,T®ãü…ˆÅ¥š+_ì§Ù ”¦[2-Ë@,?;FpˆžËiÖ0¶ßÓiâˆÝ/8@œt}0-€`.ôË¥XXþ²(æô$¾ŠLEQå$0œÇ±hÊÕZž „ û•ôc+]a]fŽDüб¿YAMæ6KŒ+"§!+%)3*(—{DÃs°ó¹Ü¿ý•g7Ùûu¾ŠÕóë™{¸"Ó•>‘ÉÏxí‘ÿ#sý ž°Sù<6Ÿ°ä붯lcíÒ¿ÂöŸþ .ü¿c(3v·:˜RTn÷uÀ…O~ЊKSe¶Xxî\¯bá‰-|è%Â_}<í‹L˜ƒg¯ÆÂåê€é?íÅ M.*Å%s‘)§ÈnÇÏïÏ/t­³V±ÀÜyþj|‘òïBÞëï~ôw¹tWlÁäòœöo€qþreRE~ÑÝÆ:(Šs[šàÅäxœ6ìó0ÖŠ ¤B³² "WEQNŒ€vãOp‹KÚ]ôNÉR4"“{|Á+³]"žªôEÔR4¢j?±`º?²ˆ§ÎÄ‚é lh¬ÔiqîDr™ë Ë/€‡«ñ>‹P—lÉ´¤D¬y§žÇD,.—_Ž÷XXȈKê|kˆÌÍý›ÓÝîˆEX.¤ó®š«ëÆ—²¿Ì4q¹òÅ> }ù_¶ÿôOì;÷ªÔ»:Éœ³´TB?¬dÄ%O‘»M).yL’÷/<ƒ¿«/ãý ÏØ…EÔ±  ¯v±ˆ¬õ’Ù~ã#ëå…G^‰Å%²–Ël§Š] \qÉüd æç¶xy’ší'ƒçй|Ûw.cûÎe,T®ÛÏ_Ûþpþ¶-‚ÞŒGÀýö ˆ}.´zçN¡ÒØBm06‹½§ ´Ø{ÚöãL?›=öÃL-”<=ÎŒK*.EQ”“#°>"’}þŠD(bľ_y‘ÉÖ¶µ‹¼çsCµ?Ÿ« ¤ÉÎ:\_F …«ˆ¼"r ‘é "ÿ]Þ¤M+,9اRß2œcÐëû8&Z~°âRïnöÌ"³¿æÄ]w³'!/Ç® üœ¬O¦ ­¥™ÅYÆÇ1 frê=žÏ«ˆrBœÅ%O‹ç†–ˆKž`§¯|5æÂ'?›ý¬[Í+õ-óÿ™¸¢ ¯™J}ËÈ@ÉiÏ…G^÷d¦É ¬Þ÷£¿Ëcëe‘¸dXdr€Ouó ¬^ÚÇ·þø[X½´o¯Ÿ—ÆŸò‰Eð"sw°ƒ>*¹ºé@,. > ­0^ìf-··ë9‘Éð4ùeÀ\Ì7òeâEQåX±¾®• ¾–‰¸qK&²¸`ë¥éfš­ø´S¸/xÏ·u ûó™vA›ü¨Zkf‹OMl̓˶G±úckŸïô;+0åéÓêv*{L4SþÇÄ=ôÿ¬·ÇÀLò[ư0æû¹nrÚ›¯+§Ê}~˜Óü1§áFŽKÑî™û¿÷v[ŠLFN“sÜ}× ÃÝ/²[ ,IAéîg¢û[w«Ö_Ñ÷OI·ÛˈÏÈKùÜ|Ñ÷4ú™¥¿Œ§äG#³ø—97”­ö†¾çëñçN‡q5«¥¥’}æÆpãå71j¼€™äºÛXÇ 6<ëø¹¾˜•CF¿+Š¢(ÊÃUaÜã“nÖjçî362úùÝ$åãò<Ëóäk£hd+ôµË*62é9/0†>`ŒŠvyýÃFŠáºP4¢¢:ìJQŽÅ£ðæ¤jqOºqey=ŠFDÍ^_ŽÇ×þ<„¥uÜ͵»ß+!×~Òm€û^äJàã(EN _òsoÅ .ˆ þö@þíäΕþÅK¿¢(Š¢'ÿ×K ô‹WZøÅ+-ou˜扗¢‹ñTåQ0Á¢á ,4Ò)`®Y-Ûyz¶¨½¶ðãL{P† kbP†ù^÷ R«­ÛÎ×çö£0-Ñ8E#š,VñÁÕUœ”ÈœÚ7Ä‚‘×EŸ»ó½Ïåÿ¢u/ÿL2ãñ´K‘‰ÿ½›k—"Ó×>•`1cÁâôco3 œÀÿÙZŸäÚwì»?2òo݈…$/ü]Ç (Š¢('@°ýÝ×­ÊüÜÇñ©?ü4ÌÏ}<÷ÁßnÄ–½¿ª¿3(•î IDAT‰þ`€…SˆèÑGA&M5‰›û7­/_«½‘³†þÒûìš§`“~ å4Ä"Ú9§fQ{7jxÛ9j7übѱLŠö…öòí‚" -ÊŒîe\ú/_}4žê}ô÷>hÛYŒ\øä -<=\4MÌATn0•yhk/Ä95ÊZí ` `Ö™UDàþæîÄ¢ò‘Óï§Þò€6',>ñî~ïGé4-ç•ý&Øð›Oÿt®ýSç?m¶¯}ð b_ÌŸÿhD4Ž#°ŸÁ¢á —œI¶Ci–$+& Ýîdö `þænÚ_è§ßŸó¥<»áìzÖOWúûÚM°hÎŽAW¿BôK_ÃýÒ×pñÒWpv úÀÏü÷ösœ‡òV”M”þ³µ>ý?ý7ì>EŸEŸHö.[/e_å1ê‚L#ï/i0Ô 0O•É^®½2Ù3îlÃbä=REQåø9ÅâHi?П¿üâgì‡F»óX,íaaçúƒªm% V«ƒ“ï<újœïÂR Ûéï)z»;™¿ÞîŽM4ýûâÌÐd$­AÁôöFÐÚ>ølJ,fÚwžžÏ·#|+ÿ]ýä>:æÎÎj˜`Ñ4Vêôê_Ïû> ‚ep…›Oÿ´‘ÛðÉóŸ ï^û^eœ—žŸ…ƒ¦l E¤©n$¾c„l²u¦·Ü£Õ?ú5t>ûoã—wųúµÌô¸+^A0Ò"Ëù/™Oÿ´áéñ<ýý ^¨œ³íÏ`Ñðôø?ýðgùPæ|™‡³¾üDÜßaœèÆË7rcIsNBƒö_®aŸ#ü»þtHøfd¤loÄi.‰ƒö+0X?ÃÜùdVÀÎ&~³AÅ–d4Á÷rM‡™"gAÉÛî5*“=ÃVKŸà ¿?%¯ß˜ -{:©(Š¢(ǃý!b¡ð­?þà3¿ø|êü§Í¸íÎçN|)<‡S§N¡¶ðãLj˜Ÿùwøë_ùŸÐ\]7>NøýÿòŸ³&B/µbæ"¤MR40*n¯Sh­˜¾öÞ3kÅÌ%–7 ñ¼µbf’'“‘ÑÖ .æ/ç¬g®¸üεoS§Ó˜|¯" pÝn“»¶Ì¯hZ´ Æ3IÚ‘É•|€4A}!U·øÄøäÚ?ÅwÛ†¥ZÉŠp›<©HÃ×åïGŽçÚ·IþãÂ"óéñË0•†y#b«&ú`öõ]"CR\ÀrøLæ{43>Ö˳cÐ~½Z|þŸã3ʦ1JÚÙÿ‡ÐÝ왋«_!¸ò~„‹ÿùý€Á oï1ÛËš.Àë[+F\ÿrâŠq)smngqùË¿ô/ßøý8o§üIK¦Ïª9.§–L¹=øX™Â¿œû÷ƒØ¤ ‚±mŠ¢(Šr°ÏBäêf3\ d€yZŸÉ}nð±²õ=“ۙξerßžÌ>~‰/$Oµº>–ÒM¿AáŸéú`µ{Uëã8øX9ão Äâò“ç?aopâÉË'ÏâØ&+3>—"¢Þõd¿D^»91åT¹õ,ŠJ7©ÿ¥¯™g||<à#ûê9¾>C®ÐtÇçú^R4"ë[é.<6ç˜ÍD´_\ýŠmg?LyÙ.Ùç5Û}0ùX¶‡YÿKàð>˜¹±Šc¾À;>Æ~–ülx‘mŠ¢(Šr2„ WdJ9.X`²¸ä}¦Vì²ÜΉɄ¢ã …âIµgè!Ú]íŠKW L™Ç).ùº™ÀO”1‰@Ÿ“=¾ ŸÜMÅ1ŸÈ”Ç|"3“¾È#&‹„gr<îØ eÑ>??§Ý^ÓÙ—¢’Ïñ Ì<îÔ¸»<˜À´!. ••¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Ê»’6ê‡ê‡o¢æÆJƽ*{ÕÂvY'‡É'ywïÏUv|í­ÎFZÅÆÃ¸Wzþ¸Wzþl—¼>¡øúŠ¢(Š¢(? r‡«½p)¹"jƒñÔúÅ•úÖÔv®ß]Dw³7µ=WGÜ!W‡ü˜ÏŸÖN“ƒ¯¯(Š¢(Šò^&8ø#1mt:\”‚th¬Ô©¶ðc±%Ï×>wv@liÌÝÀ€ºý¬ïþ—&Àg!lu6híâI¹D‡q¯J Olž?îU©~©ðüÙ.Ñkµñ}_ÿ~ÉÔŸrLQEQ傘PGèMiÅdqyw°¸;ØÉˆL—ý÷ú;ïˈL—7÷onîßÌŠÌD\v»=@·ÛˈL——Ëqÿ.—ƒŒˆcqÙ¾²þÊvF²øÛ¹^ì\¯fÎgq9<˜ žËœÏâòL¿8Ó¯x¯?üÂ0üÂ0'2C4=?Í=á ût¾¢(Š¢(ÊaÉY0W½ýxO°ôìʬŠF´òÅ>`å‹}¯´,ž’o_Ù¶"Z÷ªT$îsÿƒÎWEQE¹/¤ÿ%/îg8ȧèä3­½0À°A>EÍäSÔÎA>Eíä3­}Úùäs?×§hD•:Q4*|· dÑ=?ß;:èþ¯(Š¢(ŠrX2Á(˜@>ÐGú`ù@éƒ x}„&ô‘>˜@>Fú`ù@é#é;_ú`úΗ>˜E×ÿßj#<¿³‡gæ±eö  ;¶:ò4¾;v¨ÝÙ»ðs’ŸsE¥/Ðhܫһ…AXÜy]>––J˜v¾¢(Š¢(Êa8Ål±ä)rÈ™ÊtžßÙ³k–²&X4,ìÚW¶±vñÖ.^ Û–<÷µÕuÀÊJÝúª¶:Äbð Èvààè}ß5*õ-Ã"óÆ],-•0^*Ña®§(Š¢(ŠòŽç ßÄ“n§óÓ>~EQEQÞ:MÑIQ$zøøI·¿Óùi¿¢(Š¢(Ê}኷zÿÎOûøEQEy—Ò/ ‰¹.÷´#Uižª4ïmŸÑl7^î§ýAïmiHÏù™2—žv¦žŸ)ƒéiÏ”¹¼öƒ®M@÷h“îÑæ}=EQEQ”#“©Óí ÚþÞnWEQE9VlþF[á\¢íïívEQEQ”áí¶ i»Z0EQEQEQEQ%Ïçžú¬ ^‘ ‹HË—\8˜…Û)eÖn{Ñù²|¡\õþ'Õ.ƒ{Nâù<èø¬uò¸ßÏÛýýTEQå]HQT4/šRåãEQÍ|ü óôþ'Ý~ÒÏçA¯ïnõþ‡¹¾¢(Š¢(Ê‘qEŽ»ïŠãÞ»ïÿv÷ïA¯ï;îñ+Š¢(Š¢Ü,jŠ,jYüØ"Vd1;èü½ÿI·ŸôóyÐëq®Î¢<˜ú~EQEQî‹"qÃ$>´ýí¾ÿÛÝ¿½>‹Löí´‚Òs¾¯”¤¯]QEQ卨ZäýÒý½¢??„OÄ´)m ¼íAÏ,ÌËð¶Ï€((71Cäm÷ªôè«/bÜ­zÛ+uê\Û@£Q÷¶aDþûÀží×í¶ÛÜêl)ÐjožÿoV›…ç@¦\|ÿÙ.ч^"ÌnÞßøg@t¦L…ÏÏZ/øq·ƒE ÷~ø8¯ÝñÛóEQEQî‡~iH3 š4Ê•‹ä2Ñ$.ÕØFµ¤%e£I¼F˜µ´ñµg»é=dû¸W¥~X¡hꇕ\3Grs”µ; Ì}ã…Ür’&·ç:>\†‘ïážÏ¥,mßûËp÷þ³]¢Vgƒú¥!µ:¹r˜ÿ çÇÏHZ.3/ø€÷sàøEQEQî‡ÃÖ"ωK&ô‹F Ø" žO\19è p‘Ò'.)`‹Î÷‰Ky^Š,˜Ój­4þÄâ¶èù1®¦êvÞ;EîŽ_§ÈEQEQEQEQEQEQEyÃ>€„ØІí‡[Æ×Î>‚<îó¤hT8Þ/ Óû{¦é¹rÿ"DEQEQåD˜.ÐØsÜ«úý0¥ŸGÀµ¤>ž>˜ä€,ò“”%}~˜Sƒ’û³Ÿc¡©¢(Š¢(Šr\¨¸TEQEQއàà(Š¢(Š¢(Ê‘P륢(Š¢(Šr|¨SQEQEQEQEQEQEQEùiAó_*Š¢(Š¢(ÇŒù(Š¢(Š¢(ÇŽŠLEQEQåxÐ(rEQEQå¤P+¦¢(Š¢(Šòà¨SQEQE9^f@4Û¥B‹[. -~l¹œr¾/:œ)²X2­ÎQ4*l·âSî?îUÕb©(Š¢(ŠòVÁÓâþ@ñÔsAa;O‹µ÷KéçÀ+õâû'ÓâÓî_œÂà)ýÂû+Š¢(Š¢(ÇJp«aÌo‡‹XZ*¡¿\+ `N‡ …í[fÏôQ)l¯í.O=S¹÷rñýƒEóè«/N½ÿðjñý+õ­é÷WEQEQN†~X±A0^Kä{¼]QEQE9Þn‘÷v·+Š¢(Š¢('ÀÛ-òÞîvEQEQåȈ°ŸÂvEQEQå`öÓÚ®(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Šòî†k’Ï€¦Ö$o#˜Z“!¦Ö$/:¿±Rÿù\“¼ÕÙð¶GиW#çÔ$/º¿¢(Š¢(Šr<@,.©¸uÌejv@ø£8. MA¦½Jó´UÛôQ–‘iï—†tw·Vx~c¥NÝnF=홼4¢ö•mÀÍý›hµ72íÑ´s½ ¸qcãn5Ó>îUéZýë…÷WEQEQEQEQåÝ@c¥N¼±åP¶GP4¹?Ë_?¬/¾vŠFÄKκhÄô·ƒÚ>ôßqžžŸ6EoŸÏ:Æ.ÓúxЪ4OUš¿oË«ÿ¬·=3þ®Á®ì~1¢~iHìrq”þA¹ öú­ÎÙï?ó}ÎÝNif¬ön«<æk¿d?Ü~gú‾+Š¢(ÊñðFc¥NÝÍžáÅ< ½s½ )2¥ ²Ì¡V¨6ci©„Úpì-“Ásv¡7Gv ›"Ч¾í>²ÓãÑ8mwE0 Â~X¡¥¥––JðЬÄ´6_ÿ.<òŠ]Ü)zàg³s½ "äÚi¬…Êõ­\Û¸Wµc*×· …è4Aé¶M™ñ/W². ˆn~&Ó>>ÿÙ-³gªýyÜ à·KÏ#Ü]FÖ™¯é¹¾|¿ì¾ac3éUA“ø¸{:?å?Nî÷•¿ÿ@V<»ÿl¹ÌÄo½ã”E4Vê4wv@~LöyÉw£."Š¢(Ê[‰´à´:Öb6îU‰ix #Ö|A6ý°Bm$-˜ü9¾ÖzÉÁ8lÉdk—\ú¥!ñv¿4$i=Œ&Ùv ™Ó‚€"g=dQÕ/ íóàþIK&!½7y.|ýq¯Ÿ›Cñõ€Øâ&—q¯Jlµ´ÖËÙ}Ù×D€‰Ì¢ñó8}ÿ Ègb­ÛŽÿ,ð»ê—†…A`l½œnYd+`3û™ŒxmZ‘iŸµÓg~|̵ì±`lu6ì÷Ýýîû,ù³]Ê=£¬¸l’+&]Ëe¶½™û¾¦ûÍ)Ï)ŵÀÊcÖ¢nâ Š,ðŠ¢(Šrœœ*j¸¹ÝÍž?R¥ÿ¥·H`ÊÀ5|eèÅŸÖ-Ú~ã#[È[å5ïvp¾÷yܸ±‹¥¥@œËv X0€‘bamwÙ±¸qÊ0òº&Ú+õ-Ó\}@•:Ð/}Ñx Ã/ ©¶·ü8¿ôy\«ÝN«R竨­®P2±×’{<ú{D~ˆpw9î9ÛýE˜ôªTil¡ÕÞ@åÆzÜ8D,?“iK¶äï}>¾GýëXCdÎ'‰¨ªýy{ý-³g¤À”VÆÚp_?ŸÍ«ÉþüÏÇïgoýå ø=™Õ_?`@|~9üPߊï±ðc@WŒ³òççœ&PÛ[NÄ5¢ (¨í¡ŸX/ Ò¾µ:Ô\]ß“Vb=¿‹n4C„Û0±DB“€€– ’罊(s=Xxb —ËV’ë7W×MKl7W×íççÎÎáæþMa‚EÃ}]«q¦ßD«ÛïÛ0Éý›Ôê<‚;xx„AÜ/þ>öKCr·û¥£¶·Œþü0#Dk{Ëè—†¨í&÷½x+_샭«’æêºq˜;;—y¦A%ùx5­öškë$¿#Š¢(Šrœœ¦ûÑUê[öG(š€Phàzú7¾úbz,™ âÈí»ƒœìT¶™°½ŒŽ™ÄaéÙÿ„ÖÙùÇDTê[fÜµÞØ ;x=mß•}oL  &ú¥cùw—1üÂÐþ¨×v—M?¬P¥±…~˜Š-¬®Çý¿îïßÝÝN—ú…ý·ÏïF,Κ«ëfÜ«ïÀx©šà>©­öç±eö »¶ïïÞËÀÑøÔíöâ1&c•Øñ–M­…豯Ư®£=h ‘1Á¢¡hDà8¿±’^Ÿ[Å:ºÝ¤¸~aˆ>—ü\X(?¹ð«¨íþÝM ±rFÿõj é7°Å"Óq¯—fˆûúoÿ~Àº½×l—èVÃäúÐêl™|Œ÷)Ñ™~Í >·™“â“Ïãsª4Oüޤ¸RÑ™îÿýÒ‡í6ŠûÅïI‘)§Æ™›û7³ýaÿË!ÐLžE«½)²EQå8 Ø÷ò0f«)çÛÆ§Îe`Ÿ? ™ÌÒR ®u³œÃjôrú–Y=¿ŽÕóëh®®›ÿ÷Ò72¾‡l¡Œ—u¶Væ}“ïá†XþÝåL[ c`9±ü!õe”},êßaÛXlZQéñüVÿ:®Õ¿n-™@*"å¾?§x:»9ÀÝÁîvpvs7íÓùzf±Ï%¬Ð"ƒÌÍý›±%µhÒGQ°¿Ús3i¥€šènžöŽÝ'.ÔôÉ…_û“¼§îæit7{æ?˜]û™Vgƒú¥çüÙeƒ‹Ë…'¶p¾÷ytàËÛÂl7þÿ„×®?ec¥ž—7÷oæþé:Ó¯À¦ò¹ÜÜ¿‰¬%6ÿøc6W×ÍÜÙ94Vêd‚Eãû[å{óº›=“³Èò;M&Ìݾ*Š¢(ʱãFËm‰ÏßM^ƒ}½\?= õåcL>Î~•|mw ëÝÏ ÊtŸ}­o Ø¶ýÓû¸Á,ì×Fà]ªÿ¢ö~ÏÇÝvÇmÅ%÷9“M ïlóX­ïض~¬‰Ÿ¬í¯“>f2$ï7óŽ bA¹vò”}oÜ@¥¬¦x¯œÄ?Lýpåy®0¿n—Yf»D>‘)}åšádÿÞwƒ´AQ{ÞÿR"}1›¹ïûʵÛß6Øwšû»QEQ”¢_Rc¥^d㟰¨’ב‚Ønú7ÀGŠ2Ÿ@ˉ¾#îó˜¬`’Û"bÜ=îŠJŸÀ<¨ÿ2¢Ò ´‘>ò˜;†Ìµd…"¹ÍבÁ2è‰Ç]t~æ¹HA™©ºÔÌ Ì‘éŠû=rÿùpÇËÇäºhás¤s­™î?S2À§Èu„E_#GšíRqûq‘|k÷yÜ ôQ±©(Š¢œ4:M¦H…Ý»9÷oÔ± y‡··û“æ>óƒE±Ï•@QEQÞMF‘7®e0é¬í'ÚÄV;×@œbhç}qpN²ïžKoŽÒ?´˜ py+ÚÇÝ4 ªÒØÊµ?ò÷ãòçÃ¥o¾Š7þæG¶ý8Å¥´Âå¼äwpw°sôŸŠ¢(Šò"8ø#E#ºóØSvÿÎcOe“©kû‰µ%jÏ'˜LPPQúš`Ñ{8Ó6å3æ¡)ç¢Ó`ù`qyùsM½†ƒª1z‰°s½Š½”ÿø¸W%ÐæóÅ”n&òøw’)ýmÛÈPEQ”wo™•Å ª0-f„Œ¶Ÿ\»L—ãÛO%ùóÓÄՔ쮉-ŽÖ‚xˆv 9–ˆH_»ÄmÏY0öœ3i—LHN?·ÐþJhsK²ðãÏÛ ¢r ˜q¯Jœz‹á”\®«Ál—èOÌÓøzÁF¤  ÎØ·ð1.WEQÞ¼%L¦}e{jûÊûXùb¿°ýL¿‚Y›9:ÏÓ¦ S?ÀÊ6ÅÂF»‹˜ ž+lŸ žÃ NmŸ6FÚ~ÿ§MO›âܘgúœéPž`PžäŽûRe>ˆK›ÚÆçÓ²ë#¶³0“Sán»\û¸ æ"ÃW6¨Ì :b±¹¿"Óîqˆ; ’yb9Mç}Í`@·V *-ÜZ1¹gì~k¦ÿ¥(Š¢(Ê;›·lм}ekS[;Å˲Ûí¥BD´ŸéW@øÜÙ ’kÚTmÅSÏŸÏ®ƒà\®vÁ9õ0×>÷R‹å6²ÖKEQEy·râÓoîÔ­„E§—™sÁ!Ååm¬c¸uPûJq™9¿—!.™5¥V3!.‡Wc!WŽm»—\µ¨6seHqysÿ¦-=¸ù;5{}—œ¤¾ƒÀ&f—âò^þå´‰ —âòËÛʵKqɆîîÖ°½ ,ÚÄì¹g”--w‡˜Â~§¶û‚|Ücn±¹o§ÍM”}«fqA_ _×½O“³ÕR§ÇEQ”w;'nÁ”‘¾LûÊ6ÚW¶Ñ\[‡ ÍæïÔ0wvôæ­öºR5Á¢y­6ƯuZ¸Ñê<‚_\i€¢§lû ´…Öc Þ­Ç6Ð8UõÒóÐîl`5zÔù*öWÂÌõMi„í7>SáÎcOa|ê\¦½~ w{ ao€VgƒÆ§ÎÅQÊ¢ˆŸ—òúíÎx½²RÅŸèÿ?¼üËx¶Ä"uíâ…Ìø¿ü·-¼V{ÛÃIwþåë'ePç«ÿÜËöú@:%.k™ÛzèE=ò8ÁЛ#ÈÅýì;µ§È½cL8»9ðúÈóú˩ȗÛò³®õÒ½o%)åÉk—OæS€ÑéqEQå½ÁS„;§¨hŸ“Oí{žÇâÄS¸S“S›$ºÖ7}«€¬v”/¥yþúîëô×w_?¶çïKˆÐçzλ ŠF¹ CÇyíiûŠ¢(Šr¼$Bòá6ˆ…åÃíD@Ü9•)Ÿ'«œÙ )Ì ¨P€äJ &Ìv‰ ¿¾û:üUP ®H2­ôàQ‘•c¦ ˜^)¾¯ßmÄÏ+®²s?Ïî¯ï¾nKº"S>C<3­Ña…¢|'2ÅÏQŦ[MÊÇA–ÎAöµ¨ß*0úÇ/ö¿M׊¢(ŠrR@".Ð^}ॸåÎ)£÷LsuÝðÖÚÅ Öïï°¹ù³­ÎÍÃÜÙ¹xÜ©gº„üÿ Ît ¯ÕÆx­6¶VŽ6å8A )Ç>ŒÇ!2+Oý;ë÷´TÂÒRÉëÓWß…é•@õÝxêøméÞZ€å=ÍñYig@ÔX©ÓÊJ=ŠžÂÊJýXEGR³€ãµŒ°Î‚jgK@ö÷nó”s?¬ÑÈ„æ ‹C·þ¸ìϵú×­Hå6+Z 8!;_Ó}·¾R¤RdŽ{Uâ@¸ö•í©BÓ×ÖêlØÖV×3e"ù³>q©VLEQåDy¸øG+6ˆ-šl±tÛ}sq”²´bò”xÎj`÷åô8E#âZÏ2µ¥ª‡~ß$–[+\—)¸V1Wdñ3î™}À J~.ÖÊë™Uš/Lžî£±ROß šv›ßŸkMóYhå;`+´¯Þ|4‰¿Ñ9ka¦Ï!¼ßŸhoú [>y?E ËÝãRèq½÷Lmv$Äyò>‡x¼Þ仕ý…AfÝ+ÄâR~çå¶{¿~iXXgÝWWHÿ.ùo˜¢©SQE9Il©È÷]Ns¾ïr’ŠåÑ{¦‰Ø"²òžm/ÊUyW@Ñ'`‚ïåÚd¥˜n·ÌÍý›4wv_þÛþíßoâËÛBûJüy™ÖȆº4‰Ò –ó÷o# ÕÞÏÂÔàµDõà yËø=zÏàÎ)ªµE”õÏܳV\÷:Ô{œLý†zÓÀI² dE&G—7W×mÂnNfžñG«é|>®À¬Ò<=YK^™“,}ˆ¬Eu+þx³ ޾‡iá63ØHŽg£ö{%йg«@}++@ÆÀ¾»ÍÍø>ÖÝì%Óâ[0¥øûaJ#,`Ñ”a£Øm‚÷L7ìB±E8š€8’ŸÏ¦éð{lu6èæþMœ_ø±m;ð šÉ{¸qcç{ŸˆêW_§tb8<Œ1+àl­Î5W×sßßñæêºaØDje]CdÚÄßárœ2©=Ø!$Õ.<ò 8~üÂ#¯`2HDÇ2 IDATx<Ö/ ©¶»lx]ó= sgç¼ÇoØÍÌ€0ÄÇ .£(Š¢(Lü#sç=<¸gþ$<WXñ83wvÙ×Ës  ËÈ®aE€¼‹,ž”¬]¼,Yo:š€dª^ #@|ÓœÒåVWa¬ß)?ƒfœ»°Rß²SãrŠœE& fi©d§‡s"D¤¸iu6(W9G¦ÀÛ,Îx,µÁØð±!6é¬dÆó<6±ŒÓX©Óovc‰X\©è¸ cäó‘‚H&Û»VVÒiŸÁ±Èä´Oü ¤õr«¶•R`ò5ÿÔz®ÖzòÝïemáǹóùº7nìzß?G€‡ƒ8JVì³ ÎW3Ÿe—~§E>Ü>­z­F/c2xåðK6É?o—Ã/Ù, ýÒ0v i¨Öyû"÷åwß7¯}}REQ”ã¡h*؉"÷}D§ó.ÛÅN©Ã‰SÄ™|Ét OÊûÈiq€V²ø¦L%M{>ܶI{Èn ¦÷p ßã `’û¥JóÔ+þ)r“öß7½žq_¸Ï$·_R&z_Lá³èaxš<7þ0©‰‚¬ß¥3M.§ÆÝir÷ݹû<5ìsOàw#ßQîÙ!;•ÍÛ@úÝå{¸Ûša¢‘&ç>Êc¶¥¡÷ûíóûôÓ(rEQå­Ç™ÑéþhúD/'ÂærFàH¿K úÉTº?xrŸT¥Ï¥ÜÎpP`Ì”v)*}“qƒ{ŠÄäq§ÓqEåQü0]QyT‘ $¢^¼¿CG‘ !ÙX©[‘y” 1_Üc®¨”Û,,åzÚõÜk»}–E9¬Èô‰I÷˜ò®¨÷Ýï~Rˆ)Š¢(ŠrD|?ÊE?Ôo¾4Ll•“âÆµäšcŒBglpQX|Ýç1Í•¨œö™8ÆPÑöÙôÌyË«%<Äs›úl›Åc<À¬(Š¢(ï%?¬&­Ä7k@+Ø"ü!ï·Çëÿå µÝeë»&·‹ÚY÷ûµÚØ[‰ÈÅ‘[äã6Û%ºµb0»I Fü¹~X¡°7°¥ O‡ …¾¢"Ýd9Å)ø¬‰²”a•æi«¶‡j>-7)|'™™nþýÊçÃÁFì[:Û%’e@Ós6 ¯å³Ê5W× nqÙÍNpEÏÏýždÞ½Î\åÈÅ…™Ï4Å?-Ñ.ß ÅRDžR‰/ôOÖ ª+ñÌ‚xÆÁh2(­ @MQEQÞ D©È&¥?ðé%‹Â3ýÊùmIËVÖÊß+µ^\eFúª±hw—!×®˜à©vn/‚5òe.}ãgñt+Ѽö‰N7‹Kß}‹B8ýÏÔwàˆË¢ëÈ}—Îk):e`Nô¬ÿÖr¼òý΀èVÏÜŠÆq5m_Yd›n€ך7†Ÿ‘—͵õxÁ+k&ŠËf>´× / ¶»lj»Ëæ7WžÉµñ¸ŠÆÉ0ìZÒ/}8Îh™ ÜD~h­–ÕhÕh •¾:ãhçœÙýG÷«º•I¨§âRQEy› €øÇ±_ú0ØdÜWdº>“SË; ~kóyüÖæóž)nãý¢kÈHcŽº­í.ƒ&j»?D¼N-SœÞåt)N­4( Ái\ë%…Ep¸àˆÛ0Æ ‰ÛXG¼Î[/Ýgt+ÛÏIk›Ïß0š€hwA ÝEÿÔ¹gÊ•“v»}wß_w³gŒ‰#ÃÉZ/ƒ8ÕÐó;{˜Æ­hlë¥3·aÌl[„gƒJ΂ K¢[Tdr¤³ï\«>3N ¼Û.ìšàûW³kAÀr²¶ÄSâµÝecE%Z¦¶»l'÷‚ø¹Y7×:šÆôÃ8÷–Ï‚)E§ÌøÀ–Ë‡Û >?'BEQå퀭},¼¤õèg»ùdF&J÷úŠk²œ{O[ư@¼Îv) ìI±0m# ŽÄ-òÁKÇØÌˆ2ßâÕþûËçRÍ ä££YHrr¹dN~}Eýõõ?7†¿À*ͧ÷-ðÁt¯ÏÇy¬rì®…\V™á>Ém·D©„£¾ù¾2Ü}¾ï7Øèv¹¸Ïˆãaú¼9Êž?æîçÎO"êe–-Ó*¶nƒ>– >–éá62‹{yYÞ•ÏSEQ”wÞß„ƒ*ôKÜÈd@"â›·yí·²®0Š"·‹Å¥¼‡{,?Ʀ´îºH@t9÷9²Xœ–F‰ƒWx)ŒP7ù)ô¢þV\rY\‰L®î䦙ŠïÓ$^g·³ÿÀð9¾²†2={o·ÊÛîŠËÌwÌI¡T¥ùxZÛ©<ä !h ‘Ùtö ž«÷B,Y ö{ q)a¡¹Ùs®éˆJŸUEQ”w-¾pŸ¸,Ú÷ Ü"Ëi±Èlæ®éÛ?ì}ŽF±é4Ë%Š$Þv…’/Ê\⳺LȘ!ÍVLŸ¸”å#e~Hy_¯í1|.î3*JdkûŽñ=YôeÖblVT&ýó¦…’Ÿ ¥mZ+¼µÆÕ–Ïó±°LýÞõ{ Z 7{Y‘¹ÙK©ÜVEQ”÷4®ÕÒÝžF‘ ;J2óƒ,˜¾©Ûãä qɵ6sqy,LO˜…âR0Ÿà}«jeË2–î±£|&ýç¢ MQÁô¸¤ß[8Ô˜¥ÀdAÉ ·ñþa®§(Š¢('ÂÕ\7 3ÇDü-#©B3­âëß8í³ÓÚ˜wJÒkYu¦ÕÙ80_äQ™î{䬊ì'HŸÕÊíÏ=õYúÜSŸÍ娴Ǒ¼gãù^øü4MöŸ)ùÌùšEù<‹`Q:µ’„+ƒæØTEQÞ)d¦`(.ûÈm‡ wÛŽR½å°´:‡6²œ`NLKºh ë7™XAeL·¦Ó¬WÄ!’x»Âã~¦í¿s}Y"ó@ ¬§EUœ$üÜ)yE¦÷qÌúY:÷fqÉâO N˜€ÇÏÓóŒ­È6©v¯›»8×÷÷Ç¢!ìÚs(z?Š¢(ŠòVñÛÝÁàî`m À?”0¨‡ˆÆÀò³cDãxŸà¨H6²Œéôi4åÒßÍÕuS©o·Tž,ôºÝ¶ßø€8ߤ™dóF:?ÎáîršR§§92eÑ–ô¡ÕÞ°çð¶ÌÕX¥yú½]üÇÞî‘Ê<†ÙMÊ,2Ï$”a¢q^h!Ÿß (#Œgˆâ)l“--• ×ÓDæ¸[Ÿ[µû6÷¨HrŸÑ0¥hw4qÜ-DáÏǪ4O/˜=`›@«ÑüÁeEd~Ò5Ùï÷cܫҵú×Ä©’&½t|/þÁ¿ÂÒ¹¥ÜÂôà •ë[€p0F¹ß?z5Ä) ž¬²Û@üŽ|?ýùaq4»¢(Š¢¼˜q¯J•ÆV& ÿ€òæép@,0‡W3Iñƒ‘Í瘭Øç2¼±òÅ~朹³s²ìAi¬Ôɽn«³A7÷o¢»Ù3l=ív{6âÜÙ9\xäT[Ù‹%c¯Ô·lÅŸpwˆÒäåƒòÄæÛdqÛ\[‡šÍÕu3Û%ºÕˆs|r"ñÛ¡‰«â˜=güqE¥iãd!!Ïu+èØ{šbðL¥™ƽ*}ºþn‹V9c0C„ßQŒM?¬ÐÒR 7nìÚ¼žý°B™Š:‰àaqÉÏ—q­2Ñ=‹LVà»ÉÊ3Uä2µ¾£CËH+ `>÷Ôgé›ßü#ïø?÷¹Ïâ›/þ‘)˵á8ówç{Ÿo¯!2ÒJéãÂöQŽÑ¦§ÃÜìØ¿?ùüdîv¬àí—†TÛ[Ž»¸»[‹ïm"ô燙œ°•:ñßÂIü³§(Š¢(ŒU•Ed€ø €—w;ö I“¼Äe'‘ârî윗€ß?ñ ß9ßtx«³‘—¼-ïFÝÍžénöŒYýõ䦩Pw«ö¼®í.›Ai‹”'@°ˆÚÞrá$±èkfÿœb _^\±¸,4J¦vÿÉÂþÉÂ^Æ zÆäÄe2®h‹IùO\ò7oÀ»¶¿é½Ö3ûKK%´:tç±§°ýÆGì÷ˆÈgê„c±»ðÄVN\YAéVQ2€1åbq Ä…|Tûóq%¢¤ˆÓ–Ù3Õþ|æ3ŸûÜg3‹|.µá8“ Ÿ÷ûË@•ú–á¿).x-–Ңɬ!2òÙ¹ÔcÃÖaÉ_ìü¯™}.(àkcQ©âRQE9iŠËž$Ö¦ý•@**ùGp ‘Ÿ: µÍ»ÜNŒGücæ =¸¹Ón³°4Á¢ñ‰LYÁÇþn®®¾–+@YpÎCw³gg­!2|½q·j­7nì¢Rß2R…»Ë0¨í-cP>6‰Ÿ·CƒÛXÇ–ùgSÎ(—<…_ßþ¯¬õS昴âÒ±„Öcs¹ŠK7oKëY«½Vç´:ÄcIDæ?§*õ-Ó\]7fõ×Á‚]ú·¯V°üìËÏŽí¾ùþåtwö1¤ý–Säì’Á";c½tÀEû¢OÒF@üýoS`ÿ>¸Oã^•Î÷> ¶b27^¾aæ©ÿù_ÛcµÁØðû°VÉå `@Eõèå?ƒ[fÏ€`j»Ëfùw—±ü»ËÖêû'æ$ü EQÅ%¨Ô· Oó­™(Žb ³»Ù3kˆÌépÁþ°ñ”¹k ¹mŒ–þÜÍý›VTòÔ5/aؾ²gÒ¢8îUiû¤ÓÒÎ4;ûXNƒÅåacE%ÁTÏòûÏIø¥Èä²íHßQEQEy/ã G/S„ïa®ïχm?ˆéuÊÆWÁGâK}ônÁ?rœ™èD„w¤=·¦¥´*,'yHJÑô ‰ðej»¨Îº¢(Š¢3ÖÓµ:½Õ¡hDåðKv;÷;§wN‘ë?(#Ä%oµ“Ö´×÷7 i§_=¹,[ j®­ÇÓÔ(š*bŠÊ‚ý~¬!2—&ñø.M"ënQ¥yâéê~X¡°7@ù¦µï›£Àdð\Úÿ‚±‡“2~så„“ræøl— «ð°…‘÷eÀ”­²t@媃ž/Ï‹þÉh¬Ô‰ ø®O—ª/UߢIŠ¢(ÊO3¹(’"9ÓRÌæ\Üc‚ÅLš 6úv„Ÿ„§íGSÂA>|-NW$=Üöÿ¸ÿ¤ €à *¿GGÐöJ ú. ¯ù\7‚ùµÚ8óÜ”3î³u-—>Q™­öFƇ`_Ì4’üµÚ8ÿ|¢ª UQ4A쿉û~DÐå²?–ìÒ$BP†©ÒWVâ4\ÝÍžíWm8¶c—i‘Žò7®(Š¢(‡FúuQ4ʬÝ‘¾š×²Kº¶ðð´¬X"§,å9¯¹oýÒnƒn#7Å [,nÃZvä_‹«ùÚ)‘Ï‘zõ§^ ™)qwŠœÇ «$e*&%ðXä¸äøÜ2l¥šf¥íRúž„_!mšSú/ÊïÇl—2ëÃX2  ¢ñ¹V=þN¹ XëaRÍÈZ Èøér[Æ'QT¤ê‡ÊÖ¡Ï.œ×•¢Qê3ëÔwФ/±;Ïßo~o\v•ûW¥ùÌšÇ"ß»×r‰|=x>æúvæ|­EQå8%Ó!8G—&:Á¹¸ÒÍ`‡Úm{… [W¾ØGc¥Ní+ۀεØ$S±e‡×™ ¨~ÉZÝØŠy­þu›Ûïwþ}É]JJ»iŠ8¹ºkÅ,ÿyoêƒØ\ø³Ì~7Y×wa¨÷xü}õéê?@mêcúaÅVIZ^F'8g×Üæ³Vr¥!ê|ÕŽƒ#ì‹Â߯œáÉP‚5ut»â9$ÖK‘ßêlPç€$‘ü~´Ñ¥I”²ß¾T­"‚ ”öN#¯åøÖ’m¶`±…ñî`'‰¼ÏZ0­Õr³…=Ò´U}€Ì`l0H³Ê³õRF~‰åRàæöœín ÌO¬ÐŠù÷ž}ÿõê_dî!ϗ鞀ô½•à É4}šé ó|Í÷éÒ$Âeó}û|ùûÌÜÜ¿™±ÚsÚ-žB—ßû¹³s¸»:°ñöw;¨ˆ @œ³SQEQŽ›ÌÜå"”‘K5Ó\]7í+Û‹oÝÍžáD2[IdA™,ZNWŽ{Urs`ú’q»4W×íkc¥nxyýÒªö³õ½xa^ú@Õúå€iü¦‘ŠÈÉà9øÄeÿêÐ/9y“*2&X4¯Õƶ»à¤€—â’S'É–kˆŒ|Î,.yŠT OùÜÎô+™)s&#. ©™Î»E©Ÿ¸û+!‚2 çF•}€´PA.»냙ˆI›l|€Cû`Vê[fi©ûöªÖ2z?:W\Z0Su4NÕѽ—}Ž\ÁÈþÅß_,šæêº™ žC9üš«ëF–·œö|Ý¿3þ[cXpºÝåc§Ã4up2 `8‘Ìש(Š¢(ïH|St@ñô°œ&v} 徜"wÓ±¸÷ÒV÷G·WJ§„å¶½gïq{,·í^dzíNó¶ì§œº”×ôM »ÇxjUN‘óq×e!ÅîI¿“™&Ož•œŽõM}»}vÓVµ¯m_„È,Š gäwâ hz7Å“tÁð­í´{2fÞæ)òt:<»žqÂaª4ïI-•Ž—® ò3üžŠ2%=ߢ ·Ý—F,—K¶ ’¢(Š¢7Å•|Ž[Wx9ìyl¹ä}iÙaN—úvJÜÅÖßì9(­<BfZü>`ë” Î(Š|/¢ÕÙ°Sã<.y~Q‰Ä ,¯ ,™ÓêlУ¯¾x`°‡ûNå~w³göWBpR~î›´ðþDì@>È…ùçD¦–ƒ´‚N¥¾e¸{×Ã×”Û¾1߯:f°‘›6—Óø>‘É}¨ ÆÆWc½}e&X4åðKð¹9=ߢïÊaÊ>Jë§´¬úJN*Š¢(ʱã›Îäcl•áéGn÷Y¹¦YhøW%_pÙJ¤ïOjÜæëOÂÇÃ4K+7ù’‡3½Rl5ó†Ì”±¯'y»ÛŸL’ó$iÚ=ïç]vzü8‘i„|SëÓÚ3ß­dÜï…³Ô¼™E¸³‡Aö×÷üÙ2ì»ÿ^*Š¢(J1ûã*· q=äp0Æ ¬d¬ w;éT2ÝÈþŒ“ÁsÖ¿tå¯ïX«³A Ol¸T¥íO4"ƒ¸Ü!Dcx+Mû~˜}Q/I r¹6ùY˜`ÑÈgÃ×câà¦Îµ õ+û@шj“èúµÉ(7…?m š±¹!=0=›lˆéïáÕJ¦r§òÕ$·ÓíSvQ;‹Vˆ&Ya{(Ô `š¨u§­!èÖÈ`«¶¶2ºb¼¨ë3Êk¶¼Ú¿ þn…b³_R¸»üÀ"S¾w7a¿Ìéé;Gº¸n*n0™ >SEQ”cGZåÂǤգ€Æ½j6EM".eê!› &ÁW!…ˆmÚ–$e‘C!2é\øþÜ'Y ÏZ*‘·l(n¤`0  I®ˆ°©“’{[‘™ôÝM€-÷øÇ\Ч"?ÇiHë›ÏBÅ©t\L~/®åÒ÷»×á¿W×Ïõ~ú¨(Š¢(‡!`K ´Êc>¸ó½Ï[ÿµþrŦ}áu›káäÛpRÎUGé—†Ô¾²W§!˜í7>‚ë‰õrÃÉ©ø_¦›Y3‘•ìÙîl Ý‰-ˆì›Æ‘é¼´:Y‹¦´NQv-,™l¹ì Àj’rGZ0Ô7’×ìÿÆIÕÛW¶qú÷ÖÑ//ÆÏj0Î¥·)BV»Ùªížb*Ü&ªïp¦_Á­†1®õkx5õÓŒÆÙ@ö•mÀ€škëÖ?P ¶H׆co5œgæñ‚Ùƒ‰ƒŸaBೇgæÄVSÚÇÍânËì,šÝÆ:ZGÐX¹ huI|!‰L7¶äÍvãmjÄ—9Ó¯Xákcê‹™gö÷ž}ÒZ)}íü\¥ˆì8.ÉÖ‡TÊ€£Çʽ†È¸×ð?Rûãþ³à¿¹µ…^ß¿eßõ{-J¥(Š¢(ÇEÄfžv¦IÜ åIÀiM|ù,enÁ5ÁÍ=8(O0(ǯí-ÛãÍW×3ÛÛo¤9­(aL,\;¬¸äÓ¢\ö:‰ôUQqÅå 6rm2ⲃÀо/ç#œ;;™2‰…¤¼o®SpÅ¥e‹Ì"™G©ÔÒhÄ`nîßD·Û³ûü¾û˱›ÄÒR)Sf«¶‡Yfñ£œfAØ âþFPp5í÷VmÏŠ¿ÛXGcå.š«oØg×\}•»¸u¼VÛªH,.y#qhœªOmbÊÀ¬Š\ÒŠ™0@ü7"NòþspºÔG¸»œ;.-¦í+ÛV'Å%T[^qË[DžtTHÓ?©¸TEQÞÜ)AwšPZÙ8ýŠœ"—Óâî"§Ñ3Ç)rl"¦0Ý9%.SÎÈ4=ÒäKßSXùFNóRhÄ–\iùâûò¦ÜæÏ¥7:žföø¸~Žéôx3wý¢)rë×çIa”©“,6Ýãa¯ÄZÞ‡§Ìy:=MùÓ´ÓóòÙÅg53•f»qê ÜyEÐç&aû¦Ñ=r|ö;ç[äsç!Mo$Ççí“Ø—çË©qïg úæúa¶ú’¢(Š¢+¾GF–ݲ~]˜’gÏw}/s÷Á#EÁ ^‘™àKž¹¶g@>O$‹KG@ä¬ZâZÒgÎ/”²»GÍ3éM8îL‘K– åø^,ìø]I‘ÉÏZ )ddYEwGîYŠþ³  “û‹þ˼üÌ|SƾR¥.UšŸíËeéþS%gÆåŽÑƒûývÅ¥ôÏ¥hTØ×i"3—[UˆK;!0åß­ú_*Š¢(_»Ö+7èç¨÷‘¢Ò©|XqYtlšå~$Ü:韪H<åùÈ@™¢c®ÀLEfü™i‰µ]aéŠLWXæÄæHqÌÛîÚöó}¬x án²E¦ûOUN`úž›æ"E¦´ÖºA;2¸Ê½†û}•5#ïmƺ*ú§"SQEy+±éX¸†tr0sü0ÊÔÁ~hÑë'Ó$˜¢qš2'éIöOœOÑȦ@:LùHòÇý(‰à}×èv{¶LÃ~‚@»‹øÐKñí¸\£cGñ‹ôö_ÜÿP°˜䓟3ý°Bá`ûµ\›¢ ê!ÂÞ2Ed²vmMúæêz¦ä㓵Sø‹þ=¢¶¸;>çýæ|þŒ{LîÊâµý0 6Åä”áQΧh”ZPrßF×Â"üû¤Fs÷t¸öÓ³L𾥏îœòN¿ò¸2é`„•Uö1šÀ¦Òáó9½'¡÷N/#•º?ټɗxÌ1¥Í–¢ÍZB§=¤Öl÷¸œòå„ó,<«4Ÿ®ù÷Ç%§ëYpæü ‰ÿ®]ûÆ‘”-#[}¹Àÿ-H+¾=žXCÛ¬+BAÆJ*Ÿ³}¿Sà´Nü]d¿U~.2÷Ù7+/|ÍãJ¯(Š¢(EÄQ䈓cÅI̧Ó$ƒ8 Û ™Dds LpbZñß0•˜BT[q”,c@Ôˆ£†Ïô+øzÁ6åEfZGú6ÖAl¢ê\:&q_WrÂðÌ壑©•ÒwŒ…Ò âÆ] ê!~sq„ß\Ùþñg‚2ÌæfÏ&Açã3 ¢7GøãÍ.èÍfˆâñOƒ–DälÕölµµì%mK²žR c„ƒ1Ü`_T¼ïX ±•÷ÉÚ)Ô0Æ“µS©ÿe{͵u´Ú6"ßæöÏã±À€ƒ¸…%–ëÙ·ÐÝÝN—úÞðp¹€Ë>Êó93‚Ì`·¢1(zÊžGì½â©eÀÜ–¸fl@Ó•íxÚ?¹†yh1WOúVØ3ý Li„¿ú¸ÉUaa~sq„Ïìfóìt»=ûlÛ 4õ¸vy·‡Ý6ÆNIÏÜ6·aÌLr ±Þj;•„’tF¬±éŽYÖA€6™gÆ_öWBt`e%~/ãSçàŠÌö•m˜Ò«ç×­€Ú2{¦†1ú¨XÁÅû,YP¶Ú¸¹3SGÞwþò³éù…ÓàÃt³€8}LGtºÔÏDWóxN‡ ɹ-yŠ\’ÊS‰ÈdqÉÕ¨Z Z[]Ϥ³â1²Õ—v3‚Ò”â`L°hÚhø…!ž\øUtïõн×Ã0»¸\²B—ýr¹š“§”(§ ޝ¬¥¢(Š¢øÈe….š|nu6¨¶ðcÌËäªDز›&x1{·±`!+îºÍ¹øl¿‹+qìÛ½§M@õq“n±?f*.Ïô+8Ó¯`¶»¡¹˜VîÐQÂ×¥HdŽO¯Y\J‘ÉãeñÀŽÿö‡ ï'Û8÷as-Î+jsв’Õþ|,*0îôòþJˆó½Ïc%ôÞëìæÀ®ù3<.¦HdbSŒÍÎõ*ú¨¤â2é—›¤ž§%9ŸsiWaÏ·bYNëx2uÍârPbPât©Úí.›»ƒ[L€‘ÇXHJaºŠ«ˆr‰Ù§Q¹÷2*÷^Îãñ²¿ªš¦4Êø5מXFÿzªš¿†7ív?¬Pp5ñ±-ÇÏ¢´Â <É:ൊLEQ夰‰Ö–dDi@ˆ N¸ðÈ+ö³©ÈX2¹Z.m Gt&”ÿ¼—Y˜J}Ëe˜½D6pÆg<Ó¯€À­F~z<Ç}ˆÌV{ÝnÝn­öFáçXd2ß*udÅØ·JÝLGw³g@0œà¿JV–O‰Kwd#Êàîn wwk™~²µr ‘á¥hL¾v›Õ` ,óÉv¥¾eÊõ- H\*‚X4γâ’vmþêùu˜ÒÍÕuÓ¹¶aE&÷™Eu{dDæÝÁNFt÷‘þƒ¤ãá¤lÅ¥ŠLEQå$ rÁ,¬å²¿ó>{üÂ#¯d,™‡†{™ nû­ÑbFŒýÖèp‡å6²Â5(ÇeÝϱó0ÈëIk*‹&Ÿ…•-™¼>â0ä§›Y\N©I!ÄX$ñØ|åÏnr/ÓpÅ%—›ä’…¹dá ü|䱩ç³åp9 öI¦ÿÙ:»†È°@c(Eæ"Ã×”ð1˜6’Âr ‘i#)Šš”ýG¥eØ·×$%Â}õEþRÅÛH¿côœ.õÁI.ý°bƒN‡ h‚Xp.W ót2Ò'SQEQNéåúf¹Ñ¶Ó’4Û3"eÈ…?Ÿ•VI×i¢pß}äñ $JÚô2"u‘Û/œÀÞêlPsuݸýàû4×Ö­$dWÞæ~6Vêä—4Wד·£ä ‘lçdÖmti[’.—o²mU.Ç Çè;Æ"îZýë¹k““ð;·(“üÞ€èÍQÚ"1Dé³å$ël¢õVgƒ.<ò nÜØÍ%ï‡ZZ*Yëhc¥NWk±…ôÙ~=ïcéŠ¶ó¾ ˆ#³­Õ;IvN“$(fwÑfCpý‡¿Uêâ3»Œë€›J‰Ÿq&™¿'ÛºñÔ|ò\s‰Ö (g‰æc¢M°ãç}ÿ%,š›«ëFnO;GQEQNŠS,&gÿð'x &þ±~ôÎt ·îäöÎÆÚª N;¢Ûª²Š‚=;²,A²žÚ’A;b"<¶ZD! É»¢:ˆÞ‡5)w–¼û°2Ywnž[73oV@@_}~yóžüÎBÔçžs®~ŽÒ(ë“Xƒl)‘I"›—™µÿí;fð…v$žIDŽõ…+‰Ê:‰É w$¥E¦„ 1M¤Ý‘ÙiA:)uýåÊ*gW0¾HæV_‹ÜÃ{Òz?'eüsb™%«›—71¾÷U$s#™{Ø:߸)2ɳ)Ûi}—K94RÁR?ZLÎ@Þ\ƒ¼¹¨ÃIâPÂR$TƱ™]ïÙÄM|¾Ð-4OIL$x@RÒºIlŠ$Q’ßÈ2WHâ2Ü&ñ}íÈ ì¿´Œý—–u¿)Ì3™Hd™bËôì*aYÃcIõ]:Óêt³Ú} éÔ³ àîúí‘RQè%iL}:35+ÌÄ'òdn^Þ„YÆ)€Ÿ0Dâ€Õ›éÕ&d¾î Š =ºúù„<ÄôÝ“²+»òƨœ]Ñ3“ßô6Ë›k0‡ÒI\ '-J§\LŸGé” á¤…9}'Ã0 ü8Ø: &ä œ¤/€öŸFª°$R…%q¼öJÒЧþ4~ Þ©èþËöIÐLF“_ f‡(P½QÄ;‚c£¦ž‰Kw¤aí_=Oê"±™¯{"œàÓl¶µ¸Ì×=A"–„¦ M‰ ÈAÒu‡ŒM¿€¶Õ5U\ÜðVÝøK¬ã tfàbâb@ýáû°¨<9:˜~3ütˆE¯d ýÝúb)XW뇋UõŒ§Y9»¢§Óœ>=. ÷×»±³±çf†a˜]ÄùÆâye¡ÄeYPûjQ7ñQêÇ’a{Ž,ÏÏIZÞÚÕî,ô÷TžŸ‹ü­½Põ€pýQž‹œa†ÙUHL’é%.{ -`ÂâÑÏ–¦ÌãN«+²†«ÝcWÕÇlÓ!Š¥‚ž*  ÓñuAòP¡÷ éæRmÍkï%`.¤my†µ„*"^KŸ‰JÚ7Ndš"0N\Ò‡ŽOψޟy^²QÖ½¹ ߣW›° L*®î§bëfóð~f!}ýìüú6â0m7¿Ÿóøã /HúÝì‹;—•>é#"|@/d±TÐYß²³yÎ8’ ¸›³íZ`úâ–D& L†af·æP3•ÌÉNªÚ“¦í¤¼ ¡ •£›àBèBÕf¡h¿Ö=ç2eÂÎLϪš‹E!¢õu1\•ò í¢j¶ü˜›±ŸåÊ\0KxÚÏŒ÷KòÄ=€it çêùš™ž…WÐÃïåù9ù“©Y\0¶qýÄêBÛOÔ1’_2™D๹”Ì7<{éCëùº'dgMÂInÌ­ '-†«R~c-\­®3пž^Sq´FÆTaI'åP¼d8QÇ]¿=º@¥†ÌòBbò~ávŠ]]<—× (êÙ£<¿7úýájŠñüËú¾™Kã/ëkøóù²Þ†ì” fÖä$ûÔ™3¸ð“ŸŽö³˜ì±­Å! ÈŠtTųº‘ÀÆœP *௿è~WÍD& X¢©3i¯ùê&’BÂ1¹€ú§âjQZÝJ´}xa†avazŒ¼¡1*³›È×=¡âýüH#~ðæ|‘9ãÁ©}á,ëmI\šqifûÛw¨c‘ÈUÕ¶f‡1‚f M:×Ìô¬Ÿ©DÑ:˜‡ƒék*û;Ýut´°Ü¼¼‰ÔÕ`†<”pN†QF±XÐ×nΚ Ó³8%Õ1;-ÈúƒÀØäÂâÒ™aQ)¥ &¤þ|ÝSÒ¦¸$œ4„ÿ¯××A1ªÔÎ×=-0ͺ?ss3aŠÄ¹ÿJçº% èÙ$¨Ì÷_]܇˜Ã µ‡âÜ‘€*…d>[[L#õ™"5™TÙ[­V+F\ÎÈî÷׈9&q‰ŽþŽ‘Ø4Å¥Nd3ûŒªèïÆÓý^mB&Uát½¼¹†Vý;H–T•ƒœê'9 þ†u„"AÅ÷¿™8\+‰Ñ®J)‹€¨ßX<° í'R†aæVq(ƒ9l0û_Ǭ–ôãì·•èô´ÃBtfzV'Ñha`xt¨h¸™©#ª-¦€@¦ÓL´Ð³ A@˜Á:ûoø³u“lèºÎªáÔG½@O€„fY@ΠZ­ê’™™žÅ¦§¼{T¾Ðö‹›ûå‡HØ…Ëå®××áfSªÈ|6…ëõu½l©\H¤P[¶ºÇ oâõúzd*Iwýv]®Á¬ùI÷H"4ìÁ¤ãåž¾¦À9|/ÞÌôlÀsl>[—¯Cˆpò=ÇkGNhqiÚÌ*ôÜÃטL&ÑjµÐjµ@B3‚ÿ¤2\¶{„„ÐbÓðNÒ÷Éü¾®±ZÃõú:®××­v@ ËÈy}qY©;ø—â•®¸€´7ÒM4¤›hè°QUåªhö& )Ñ3þTÕß HSHÚú†af׈Oô˜¡+Á[Gín\㌎9Ô =¢ƒiÆFÒиm&=lîï_,BçïÚ(æOÇÛPLfÕ]”ÀŒ¬º‹Ý8MŸÛ*jÛÛ*Ô¶>:g˜Ð5} "ßIÏDÇ© è˜Ðª»¸7ºF:†9{K8Yƒ SÛ;-– úÜf_ä>ŒD§¼‘¬DǦë ïFÏ={i<;…è•XÔ/ñ(lëÆyZ0¾?ú{ä÷Óý™ëáhÌï^`¨÷~>ôèo °ÅÓÇ&0Íuò8ËÎZÔËj™äé ȰP {²ã&Ã0 ücô*Ã&\«òíÀæYt ][Ú4”(£ÜÑLL{‹Ðrz™&¦H°žóm\§dÇZ‚Ê,Ñ´Úªê¶9L.áÏûû{µ¤ ­µ[§S²æ¹=í-OÆÚo«-ÊÛj‹±Ï‹„[ì0y¾ ‘þãñ÷›¯õ|þýì»y/ßîó2 Ã0ÌNáôߤ‹ä¨ø¯p ³8»M PmËÞgˆÆè·U —ŠˆÌ|;+æá`_ÂE®Å<\oç‘kg!qµ$pµ$P,]‡šsVµý~°ŠÅ˜¾â×N¢øµ“(7¾a߯'ìe®Jy%ïáJÞ z–bfu!áZk5°4mƒF?%;z›‡e'°4m©Â’øÄo–p꣞^$Q&»‘Ñn^—×Z ,×Z«²æ¹]›ç–5Ï•-¯û,Ö=Xš¶AH­Ýä ’–Ȥ¥¦°4û Ù„,d±çÜŽ=VìÆØ:ò†tœ!ÊÛ©—$Žókü-Ã0 üëp “ç{þ¨m Óc)ý¢ßæ1*päpUJZš"óº‰ñ³¹Ìv{1îb© qm(’„ã&’.-µQ(/& ÛÒÐ-õáÚž4Åb¸Ï÷XÒù©‘q¡ÃUx¾fFD$Òð²ÁZkU'‡Ä'ÒØË)Ù‘§d'Þ û ÌD'3“â>Íy/×Z«r­µ±SÍs•È Ù©¿åI%2CvÝhAæµû}aµÃûSŸé¡¤gbŠD²ßV[”½ìgmy'Õd5§’¼ª9òßy.;òF0‘ËÇú¾,žXB%²ÅÃâ”a†y;Pµð6²“®VkpGȵ³º¨:•ß¡m¤?tܦšZAµùÂÅÙMºõ6˱ÛKyþP ¿›Fd Èy8—$’‡¥öXšmdT†€éÁƒV†PüÚIT¿u^ßhößèYêEÕ| t±ñ™éYÈ›k8è¦@5ÍÚ“&k­UyáÂOôºY¬~óò&ò£oêuù×qJvä9áˆS²#ènà‹ùüÐUż¿˜Á9áèmo«@Òs½­9ñ}ÀõK-™Â¤UÏ"Uh º¾trL¬µVåžsk¸y*=甇óæ©4š²…B*/jž+'Ÿ,bá*&ŸT5¨¨â(rH¦„hyR¾x²cçxñ¤*—tì|Éj·¥ƒ58·¶®û~W(‰°Ø¤>Ó×Îç 8W(EÞ[¡ów¨5Úâ”ìH²Ó9ÿÙÌþøÞÿAÛ]7X–èŸÍLáë¿5æWWßÁ£™ ½ÍÅæŠõîw8<$.î‚xù‚„[¦ 4ŸÇß ˜W_æ°¸,æKBvÖ$ÕÉ ‹KÛç Ã0 ³ô"€ QØx°±UàÈy8˜7^'¯åÕŽ‡x/挧8‡^^Ìó‡jø]n(öZI\N¡ÓMÆ‘3Ñ;:DgÀô t&»}d6‹|W¿u^ q™kÝç륓®Î¡Xº +ºª:y"uo3qÆ€êKVήè™[‰ ç„#¾˜Ñûüª0ßœvm—@¼I'Ç-ožêmRy½\x [èôæcªîd2%ôòØù„¶O¶‚×÷»µuØÖiˆþw…Rp{‹ð´qN8nMÀ­‰ÛÒ£Z¼ÕmaÚ©ÿ¡ÕjÄþ»BI˜×÷Ɖ?ÁÞ}Ð^ÊÖEµïÅæ’Þæhf…Ĩ‚âRÈ6„l–Âúþu„ŸEÕ]”UwQæÇ”¦% Nò†Ê¶z?zÉÞL†af· ¤[?-aex²›Í9ÁÃ?^ƒiÖí‹^ÍŒž‡Ü6çùm ”\Cq *ãvF‡ëóÒyXÄæ,žXs8üÚP`˜zÐD=Iùûï•uî¹-Z¿#152ièö”ìÈÔÖ­×-;kRzÕØ{RÐI«ÝŒ]ÏFA±˜5Ï•{ÎD³ði8¼åI¹ì^ mG†¸CCÝk­ÕÀz`ÿû¬ñš>{÷}@ÛI<Å{†·)$F% “Wmß3(¡ywæp¸‡Iç#YuÕu™K ǹwߤ¹´]Ã0 Ãì(fÌe8þðã(ýØK›²W<"‰FúÄy0ITöò`Ú‹ 1ã0w$‹Üˆ»4kyö‹ÁÔäf F£äSXd½xúÅ`ÆA‚²—¸z{´z‰K”qâ’eœ¸$A—šb0éüÔ¶ÅhÆÙ¨/Nd’¸4—½þuš^ÌðùÂ}qÿ˜Ç³ÅšÛ’'3.³×? Ã0 ³+ô˜a¶Z¦ÈôLÆo5ÓS\ýD¦éa5e¯¾ž„|Lofß}CžË@ÛV×3Æ‹y«ô–ƒ'. ›°4± K«°$ Qe]GWl‘ÈDPšm›#‘hz.ÍöÞ}ˆdª÷òbÆÑOøÙ—þg†a˜÷,aáÐOHÜnHt…Ö“9ÑsýÝL ÀzŒ¸ Ël@½ö¿•ãK™•¶e˜N ÒKŽD* à„#õýÅêvYLH¹˜Ø½ââ2{·¤¥¬ný)…¤eXLvZjt î·~v†a†yßA¢rq™ê¨HZFxÚï:ÆN¢2,6}HTÄ¥u¢x~|á'¢ ›;±›!qûIÄŸ—us•›ûóX‡gJ";}âöïgï´šú˜áíúMdzï¤RzU)½ª.´‘9âBޏ°{ý÷º˜½c½®É&(Ã}½¼Í;iöÑ»ýì Ã0 ón"’|QÞ%Š_n©| eÃ@­½ÞwßjÒ,ѲUû_¨=f¹~ózèZÌx·{äã8°ð2^~y?¾ð‚üÜñÏëã„׳¹“²Q?»¸ýMuÂÞÁ IDAT‰·îèyßY£høK¾ xycDeX× ÓM•UžÉ$à®ß9ZC­àß_²¿1§³ÐE! 4Hˆ§– ßX™W›Öê(rñ¯ÿͿƗîÿc@B”ççäþKËû¡Ã‡035«K$:|SÇC$Ô)K§\•Ùîï¾Ú7ü|SÅ%ÕW@ª°$¤W•H– îX}dcÉ¢ÿN’’JÑ?&”YîÛsÆ‘7ëˆÿŸŠ˜þþŸìÿ‹ÿ¾ñ{xãúoEœ×²Ô¢ÃÂ+NpêO’É x‘i¤­Û‘]<ÓÇÞèmO…˜A¾î ÔÕˆ$.âsÇ?_xAöº¿l–D؃òj¶Ôòåq÷Ȇ¤¶¹ ‰KøÏù“ZdÚÄe¡ÚŸ‰KÈŒe´È$H\@2™Ô"Ó&.Ë•9->‹¥‚œ®ÖP®Ì¡ `zjV„ Ó¸” ü̾÷Vˆ”ïÁÌD‡£ãÄå ˜"“¼ƒÄ¥'?‡r¨üDÕ"-WæpéÉÏÉóë)½MÕ]”³Úm²G#µ?I\šÜ‹rÈ)áFg1ÐO}C¢[Äýïìå[±üô2NÜÿ¨þgæb˜4<–ÕÛ(~·†êƒªýêE 4ÙÝŸþÉûO4ëW&j¤…’­“R¶¿£ì­‡$þð‡wH³<Ã0 Ãì$ÐõTæÿOÕIKêÿÜñÏ úñ#H”…‡Äkíuqó±Ž ‘Ðj)£ç@x }Ó’ì¸÷÷°ç!‡0‡ÅÙ[u)Zu)Ìë¡öpUÊ»G6äÝ#Z\’¸ûñ…äòÓˈ»¿lî¤\~æi,?ótÀnš¸l¤„Hø‚`,+åË#¢—¸ì‰Ë0¦¸´aŠË^¸$Š¥‚¤"ð›—7õÐxX”Æ¡‡£—;bìÑIP fýÄåÍÍà:‰IòV†…æÉ¤’ÄùõNŽª:¨¬ÏŸŽ½„¿Yý Ö¸Ø-Tî'÷а¸é½Üp/êc†‹à“†æKm!ÊÿüMí½€ÉŒãæ÷o2ÓÑžÉÒäÏÕ5úâ’úÈžõ¤’!iAB­“R&ïnó‡?¼ÿå‹oFöa†a˜]ᢼKÒÇf'QWïæ$S\†·½{d#p¶û3J¨4M¤"qû›22TNÇö¤õ 5ÈB ò÷äIý¡õB 9è%„jëõäSË?O-ÿ@þýækúCëO-ÿ@'‘`þñ…ô:ÕÓÔu5u6³ Å$HQ¡þ m×mâ„ho5ÁG¯üLô½û> ÷œqô;°Å`RŸôªú¾èú¨-½jlÍÈ0Ö$_xÞ‹Ä«òüœ¤as½­-ÉGvÑ(>2›;)mu3ÉžK4vJȺ+çéû£6 ‰­“R¶NÊË'1 Ã0Ìv LyTüRÐǶq£~^˜ 7t‡8{Ðs”燖î÷ûï·Ø]Häýþ<„­LQ«®y7%(ÍÏË#Âê¶ÝŸ9ŒøÆõß ó‰ÑE©?¿ÿ¿ÿ„î3Å&%öØD¦9Þ ò\ÖšÁasÛpxà¹Ãá½ ÏåæåÍàô˜‹µ®¼ Až´ãµ¯èáX³ Ã9\YF$ö²ô½Úû“ßÃÞŸü^ Á§ß¾"U3¯ý‘ê0Ú"Uqñ–‘ã!HP~âOãeC"zŒ!'8¿¹pÒ”²³&É»Kâè†^˜"Ò´×ÛÙ€ÝIf‚ïÅh;ÉL7þódW„ÿ—/¾ ™ Ã0ÌÛN-±R(–b†a†aþ‰ÒOdJ×øÃ¢^m"0TºëÉ0 Ã0 ü{¡!7shN‹L¸/¯6¡§I¬%¢EÌÍ¢á‘cùímyI†a†a˜w=:3UXn.%›Ív æ ‡H‰%=S‰Y{/ŒWÀêÂR Ä¤£¡~†a†aæýƒž)Æf¬] §  Ú¨CH,lµ‘ yl²+6 mˆÀ°¹TûR¹†a†aæýò`Ö!`NÍh®çýö˜±—a›œ—c“0…£nËÐ’a†a†yŸCžÌ\(FÒíÖ]ÔŸoYKÀZÇa†a†ù§A·f’¼’µ‹@á¨eë°'ÓÇ”ä­d‘É0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 ü—‰äˆdÃ+…¶n¬%t;åõÞïq±‡äHìÒKu·My¬Àzk£çñG“#º}ªógº}Îùk¬¯-a4=ÑûæŸ0íÖ†x§¯a†yÿ1d®´äC]áfŠKZ7EæãÂ.’#=Ååãb# »È„S?Ã9ç¯ëƒ¾†a†afû8Ô0Å¥¹~¥ÐƧz®ä•«’ÚaÑ9 øý<˜&Û–‰ËS?éΟ!×ÎN€ò‚†?&$.Ã÷Ä0 Ã0 Ãl-0“¼–@Wd.?õˆî3Ûa^Ï ¼P{(Ð×σÙz|# n{‰LòˆB=ÑÀhrë­¨—”ú‰+…vÀ‹ÉB“a†afû …;’D¼™Ý”µ¦3 4üT ¯Ÿóq±ÙRÛ†=‹¦04…%íGô7Å$µÃ¢Ó M:g†a†Ù—[á`2š/ÔO\W môÛ²¨–ß윀ÀzX\žsþºoÌ¥éÍ Y[‹K†a†a˜í¡¦MX& ƒè*ìɨƒx0I˜ŠjïsØ’‰Ââ2¼nz+Í¥Ù’,.†a†a¶˜á¡q3ó`-¡E—¹$zÅEêÁ4Uà‹çº°¸ Ž¿ ÷Ûâ-Y\2 Ã0 ÃlÌô¬ƒys½ÐÇëøéŸÞ×Ó>þÁË=íyô)´Ù‡û~s/2c½Þ\mÖ§ŽÏB$Ù‚u óp0…ŽuyF¾ÕóüB A ãN õRâu!0¼(qµ$"ëÈh,9‘uw¤üFV7¼9@½Ç«õ,‡^Ç, ‚yõÐ \÷¼Ÿÿ5-:p³ö¸Û|CÏi ûÝ,F—ùlÏçS‘Ýóôê¯HSUÌ;c‘þ}¹Q\¯¯ö?^û .¾§·3ï!W«CìIG®EÞ\³öÀ}÷Ý‹å§Á‰/= xæ™g#ö<} ðÛûhû©þ¼®v<¿|%ïaØQí×E×ó/o®õ¬ÛÚ¯®k?{¸”Àu0†a˜Ý!ƒù^gÂUžÉ¥¼òŽfÆ2ZTÚ–bJí×K\Ò2,.ß+¸Î2@v€agN‹ÌiÑÁê}÷êíÇ–Ÿ‹Üãµ#'ôs›>=Žz!9Oö»ÙÀ’¸ï¾ È'f¦»ç/W‚ÿÈèÿz¦gµ¸€©Î*Äž4*ÒÑâñz}ûr£ý/¾§Ûn6¥Å0äjÑ>ys Ý”Ud’¸{ÒÚ~ß}÷jiŠKøÀÓ—pßýÊNÂ’% SU%4Åun€“ÆzGµÃBq}mI/m"r}m ‰‰X;•îz14¹Ã0 Ãìï+Iâ’Ú6‘^—<•æºMTnEdöò^ªõxïå)ñzCÄz/‘òxï¥;Ò@¾ýÚ@Ï.àÕ}ê]CtP6zÚg¦gQ®Ìafz6"8µÀ2¨œ] ¬Û­I¾ái/e¾á¡²…´¸,a™q× .}Žò3—F¶õÄ;:t™ž·“:Áó¸”í4Db-""I\.å77*2I\C⪑´†af§yï¸á€e¸º‚*칂ëaÏ%€Èú»Ù9¡‡Æeçdç5dKíAØi㼌ý—–c½—¹¶úd¿›µz1 \™³z3IÐÅ Qg2 d'=d'=t,Qæ¸W튫re׎œ@¹27›B¹2‡ÊÙ\;¢îÝ—¯cV‰Lß“iBCã'¾ô¨¾â·÷‰|÷~{ÿ½þõô AE÷‘—¤>DÌ;é€ÇPâÒ\šv-.ýs“'PÉ{×Ûy CâõœÀ0$}§xe†a˜[á=/0'Ü‘€çòX~Çò]ÇlX\6W›ýã<—a&°½aòÞÞKôö^ŠÞÞK4ÐÛ{¹‘…p–1ì¤ôð8k_?rµ:ru¹Z]‹³0$Ðéyš<ó̳h®613=y@×;ç%=º„õ‹J8:)àL+(î)3“I†ÇMò O˦î]ìI«¡êª %è]E ‡/?õH$þÐ0¾{gî_Ö»"Ó,ç5šžˆx,ÑéÆbÒR$ÖKÓþ¸\Òî—]fò¡œiuð؃u‰«˜a&Ã0 ³«¼ç&aŠLêG¾Ñˆ½¤u›çˆz0»Ø|¿Ð\mêÏ­'2oÕƒ¹~q£G—zž;“‰fÿ“ ¤e¸Mç$‘i—¶ëÜqHd†Å&¢"3ciŠLS\¦È˜A"ù£]¸†a†éòž˜Kù Ëé!Â<<•yžÕhïƒ ô&z“÷£—÷²ã¡§÷rxQöô^NtFzz/eÏú]¤Tž9úl3S¶ÔT&äõÛŠSL}M·MfÇKFŸý…Â÷¬ÞKòVöB‹Ì>2ÎÃÚoæÒÈNªqé+­`âöhzB{2u;DØ£i³ÛÄ%A"“Å%Ã0 óvðþIò!=SÇ&2‰^Ãäè3L> †{ÇQå¦<£¢ORO½r) Ãþ-¿‘…;Òˆ$ú˜%ŠÈƒiË(uf¢Ž”ßÃ…mþOWjiëÔuSf8“ޝË6eSXùMÐþõô¾þRïó÷*1´v³¶-Ã0 Ãì&Òi ×*³z¢\+©tÝ‘¨xÐÙ¶rÃÕ hùÕ'D¢[ÒågŸy&`ÿôOïÓ¥_l¢£¹ÚÔö¸ë3Œíú4–ë»ZœDb¯Ï,Cc»>²W¤›­Ú’5Œ;nº~Ón»~ªwýÏ‹‡p|<öú¿±¦¼dyIZ¯êø,æ/ÌÅ^¿‰íúM¶òümI9NrF_? bQM®–º^¾AŸÿ ×_™ŸÃþ'>{ý×¾üëÀ0zøúç/Ìaêø,¨òùý¹’We‰z}¦ŽÏâþGU£ÄhoÑ÷'­Wt[Î+àÕ€ï'?®Ûýê`ùè\z-˜ñÎu0†a˜Ý`ˆ~|ÃCš¹VR†¦!Wʾ%ñsµhü ·Ê‰5TήèßpÁõå§Ñv3.Ò´tSˆ½¾vðEŽíú¨O‰ƒ2€²5þõÁ ¿ÿQûõýì3Ïà>¨>Ûõ‘`[~Çk_A½ÙF@=—B&“ÀTa ö%\d&Žz3°ç ÝëïxÀúÅŸ«ãNþ\ÅR‘r9¯vÍfÈ$ðµ42™î©>Ž«EྗôõgñÐXHáÓ¿¹/pýO?ò, —ãj¸8;éaÞ÷bfÆ2˜:=( DžÞÊÔ× ç¿…ìñ,*æBö_ÃE_/Ô¢J7ŠÀpõ$®–:ôwÁÜ¿ÓòßG®ì—”2åoîÅ3Y 3©öU™ÓJ¬Q,&]ÿØòsX=ñT,q•©¯aõÄpmìר|9ø†ùý¹ï¾{qmìױߟûµ×ñ„œÁ}'.!3–Ár¾«B¯ä=D÷ù?òÙ;0z4÷IÇ ¾0f}Ïkèćg¬¯-¡UÿN¬È<òÑ#õàÎþçd†a˜[ÅÁÑ…H'‰Ëo,ž·-’¸¼ZpsÁz…¦¸œ:>k©‡Äesµk'/ÐÊÏ£2?‡k_î €k_þ5*ósX¹óy /JäZÉ@lœ¼¹†\+‰áE‰û½óæ0aVVY¯ßÿè½[~¿ú„ÀÓt3ƒŸ~äYüêcËÏá™å#ØÿÄ‡Õ³Ïø«÷`ÿÆ3˪M²°„•ßF2÷0V~s8¶7>°7làÑŸ¼ ‘Xã?yFMnH”1zt ¹ZÉÜÃÈÕê=º„+ŨãiþÂrµºµÿz}"©²­ï4:Ä»[Ì_°Ï׿–—Ÿ…˜úšú>í}5`õLOÍbÿŽM`õžØØP'9ƒ§y¶gÔ·ï˜Á‰/=ÑW Á¹òƸÿÑ{u éV¸^_WÙûõ ÕôØ’¸l6ÛZdš¸Ìod1þê=8òÑ#`†a˜ÝġĪaHâ’ Ùݑܑ†—4W8eîWç"âÒIÎhûÏ>ó ~ö™g´¸üöÊ›H?œ™±Œòùâò«o–u?ý°¯Üù=®=—&ËËÏjAI‚“ÄÔ“­ÀúA7…z²¥×§ŽņÙGYãõ\ "©’{ê¹”¶‘=ß~M§Ùqd+rXÑáË0ááþ0ýæï¶a>³~ó¿‡=q•³+˜>=®maJ1‡qöƒnJ }Y ÎO?u|Öz|ó,å7t™©û~s/žù`÷ÝÒì5@ïREópz>wó™ïâûùÌÃeŒÂ˜ßob+Ï|+ä©Îª*]d~Й£é $sëä2™’¹‡õ0ù¥×.aåÎçõ?-îH+w>ÏÃä Ã0Ì®âà⤑¦ç’È7T\_ÇCD|@¾>Žf³õ‹Ï%±ò›Ãh6ÛX^~6".Mûž¾d—´= KSà˜Ç¢8@Sìl…ëõu-(©h7Э='GGpÒHÊ0mý°e¯¿ˆóÈ‘·Ì&ÆL»ùφIø{KŒÖNËX!övñoÊ6ß æ1Èv²F½C½Ãø/BKL‘iŠK™,.†a˜·PÃà…~õ aõ®™v›w-“I Ùlc|ï«qiÚÉSi#“IàX~Ï‹‡"6’{0Éf––¹’÷âRìIko“)F›«M$ÑÙ¼zûd°@øýÞ +Úø[ÑÖë;)$ÞI¦§º^ÆÌX&":§§fµ33–‰ˆÎo,ž×Â^Tƒ¢ÓIμ˜ä½4=€Ãi©½˜Ï|ðÙ€è¼ÿÑ{µsôèÒ»^\îô½Ôá,–˜L™qYä$2Y\2 Ã0oCÙïfÑXH!W÷P‡òd6R€¯£:ž&ÇÅI4°€ŽçùëÊ®2œÛøzz ßh¦áÕ”ØüºŸåûÈgïØù¬²ÿÌ¿²_;rÍæ2–—=Ôs)\CÐÓ·¼ü,` ‹‡1‡ÄMœä †«ð“xüý«¸:'9‹ûN¨Ü¿ªÞÄ_õxPåù½€Ž¹Ü±//? <õH`èÞdzj8=‰ $HH¿zÆGî ØV%®$Ð5þðc\LóÆ`ÊùoS³ó߂͇:=5‹ {}ÓS³¨ÌÏÅÚ¿±xqRy.C%‹>ò’Ä¯Ž TÎÚ‡—™Ãi „ÊQÎ_˜ÃÒ˜¿0‡Ì˜õôݸ×Â,3Uª¸×|[ôŸ$5„¼`´·ÆÏ>ó Æ×Òº&3–.]î¶·ˆlAO5YÏ¥"è_“Å%Ã0 ó®ÄÍ¥d§ ñž©/¾%¼ÚÄûöÞÞidgM–ççú>ßòü\d;ÙYÓëfÛ¶o¿ã{µ éæR»òžËós²ß}ÊÎZìßDï¿­~÷×iõ¶½ì Ã0 ³Sl)¥•†Ê߭ĉÛ³Ù§EÔ,,ï&¡Y#;-HS<ÐzޤmÂ×K6Àþ\z µFvÖ$•ð)WæwÞb© `óò&ŠÅ‚ÞWìI£\™Cy~N·Íc„ßoœ£wœoxJÊm¯6!{‰Óòüœ¤D¦™éYëñegMR5€Ž}Æ»”NDh–çç$=›b±¹¿N ²X*ÈÆB ÅR!"`iÿý—–Q,ú Ã0 s+¦Šôj2U\Šýñm,¤ô7F‹¥‚?—N €„è´ ;à$ˆb)'+‡Õ3Õî÷¯×ŽœˆÜ?ЖáçC6JX ˆÁ€”w—T¦žK ²L';un.%͹°¯××1ŽgW$¿"Zð… q´yySßç¡Ã‡$]+ Kº§re™½o!U\‚WЀî#Q=(©«Ûò0ÎLÍŠb©`ýÞƒ{/ãDh³Ù޵¹¹”Ìì}­ú«˜™¶ Sá¤ExÛ`0ÀÖQ y?sÒ-ÈÅsy”N¹júŸ‘‡’•³+X<—GµZ v†a†ÙQòÌLÍŠñ½¯‚ÚƒþÀÓ°àæåMx"7}z\¶Þ¼¼©EÙ·*ô†«rÛC{Õj û/-c|ï«Ú;6($.5Di»ó^l÷EÏgúôxÄ^,ô2$DåìJäñ`ÆÍ c³M‡æü' á{#e”œ$„).mP¬e®VG¾á!ßðTñnt=΀ò°ÙîÅ|G¦8l”ÀD\ÚbœôjÒ¼®ñ½¯ªéK-߸sߪ÷€ö†AÇîuüb© éYÓyÜ5ì&Ûùþ1 Ã0Ìvê¿IoÌ!¼ðW8n.ìÁÜÊ0ÝÕ¢!åÕ’ˆM ¨ráå­ÞK/„“¶Æ’ð€%¾SÙt¼ž$¦Æ Þœ”¤9ýä:€t0-:Ø— œw_n×ëë¨Àѱ–!© ôõÀ|¿áf¦f…QõT†=y“ ­úw°ÿRÛ*Ân%ùÆ$.>òô^’÷ÛŒ¿ôØ;…™€ÄžL†aæmgìiÓ뵓tZ·R‰Ÿ[¤WöVl½¶µõzOÛ-_DÙå=3ã9¦@ïïV¿ïg»ì¬õ-ŸÄ0 Ã0ïƒüH Rð½&âv Ñïö{{§ê%ö«Ys¶÷ÏGàRH)…Ü»ïïêw`£ß?_½ìôáoùßÛ¾[ÿ,2 Ã0ŒfPñÓ¯Ðõ r»ûì zbzmu+ûîOÂ{—‘59\ãLJ IDAT•Ûúç`»”ççägŽÿi.Ãu{ÙÃŒ¸#nÔ~o‡ÀôjÉ[:ö/¼ØŸê\º¹”´Õ¹ì´ ?V«J7—’«UcGÎøâ’&Ã0 Ãì:ƒ OâÜ »Šc›‘å€B‡ K2Á>¯6!egMš%vÌ>½¦·Çr4øÍã›}ÐÅÒÝ\Jº¹”™ý®Ï|.ºÏ¸w6‡iEÁ1#ÝDCº‰Fw½>6ï%0ŸZþÁ¶þy¸Ùò¯ÍøÜlMÈ›­î3BJ@>a=FNŒÊ𙣱×@ÂrÏÇ*0«9È3ˆŠ³rQÞ‹ºÖm3ãô^-)«¹øg6ûé©¿¼_ˆî÷‡þF©¿Ÿ=îþÙ{É0 ü-ôóö‹eë7CH?û ÞKÙYë).m?ªtNS´QŸyNSTšñœôCLípÓ•æ?ýè““¼˜$4û]Ÿ),únÚ–„%íïÕ&º±™¾¨ÔâRøq›½Ä%Ð[`žM‘—ÀÎ L—{γëÏJø…ö½!%DWdj±é÷™ÛöƒˆKSÖ \Ãÿ˜þ¾ æi:ë%tFu;ŒWKʋ͊uûúÙ|áyáœÿÛ²ß*ýîŸa†av’æ"ïWÂ%n–›AíT„üVJ¨L£#rµ:¦E'2ÓŽÙ6k9:|( I\R_?q K¥n¬–ûr£J[FjnN£#¦AáëÛ +o܉ñ½¯„&ˆÄšnŸÁÉÑ«mêø¬šah‡gx {*w‹_^R_åÖò"v޽d†aÞ D¿ys­—¢Þ±‹™pÕðíR~cà}d­÷õtS=íW׺Nª wDŸÛl÷ÂE÷ø/º7p,?h¿èÞè¹ÿ'GûŸCMA^ô ŽvÏEëÙÉèÌ5&[¹]ÄÔ×p¹”ÃáźuùÃÅ*þH&ð·¢m].‰‹ ù£Ø%=¯8®9ð<‡—‹çò=÷Mwc>}òàÅ¿{Q÷ÊtÏ//ªgi>ç<<¸Há\óÚõ®ÌõDsÇ>y,Ö0}z£é ½O/3f³È#ú.Í‘HßNÒnmð9Ã0 ³ãÜòT‘&½¢‹”þ5Ûæ~ƒ§Ý®ä½HÛ„åp:ª«—òÁs7d?¿)(å‡ox‘{Û*½ÄånB"îr)Vq $z—0!¤—aq9èu˜×cK„ê‰Ê¸>ù‹ZÄNB\ÿ9+!Ú}æ´~7´`%‘Iâ2— Ã0 ó~e ÌA !õÉÑ «¨"OPœ¸\ÊoàX~ŸÝxÔ̡|Äî•ûê›*Kú ›ÒmÓ[i¶M>9º¡¼Š!qY»hoÇíŸoxp³;#Id]qiŠ  ,ØH,^¬ëeXlÐ1¦¨$‘ KâßêeXl‚™›ƒòâß½hýâhÊú€sÍzIsÝ<]_/qÉ0 Ã0ÿØIBÐî4Å¡9ŒLÂÈì³y*Ã}$,7/obóò¦UdR©£¯¾YÆôéñˆÝôZÚ<˜P8ª>aÏeᨖµ‹¾½aÝ]‹“—æqwÓs'ØÂžKõ°ç@`=ì¹YïEØsI׺‘yì“ǬB^ô¬!îvf#²¾ULïeRÍ%d2J˜› Ã0 ó^fGæR~# Ãëä½$´³Ñ{|ÉQ6–DõFM­7º1–´üöÁ*ŽW×DÀ[I"‘0…ðÀÃÙ†wÓŒ±ìoy+„Åånx1mØ<—æÒæ¹´Å`Û&·y.·2LnóXš}a%kßN0ÈÐ8‹L†aæýÀŽ‘ëv/ ‹‹£)UO³_|£±ïÌ¥YToÔ¶jµdÕ°¸9$NK±' ±§›€¿Z¸Z:îR'õÄx&»w“â.)©'ߨyÑgó\î–73,ÚlžK³ßæ¹ñ`Û&·y.Ãý½°y,;°Çz4IðÊ és}PÂâÒ 1½˜‹L†aæ½ÏŽ%ù,å7pÌÿa$Ï£M@êòAÄeh›€øñmӧdzÝ!ñðò ›Âÿ¶(ð¿”Ô8-‡ýÃ\]:“{i£ÏuÅ@ûç7°ãCãfÌån “‡E\˜^YäÀ‹=³È»çR‹Í>Yäæõm7ÑÇô^šèŒ{žò¢‡sÍ8• Ä[†×éXôìÖ×–t¦—QË8qI¤šKmIdžÃîyņaf·ØÑ,ò<<à(ÔgìÚ‹iä­Œ+«tÕ¯™=¼½,ÐùbÎÛ(î6÷äØ6‘)/zÀä­Ÿ£Ÿ'°×0ù[øø- “ËõŸ´×0ù Ø2ÉMz…¨8Ë”ÑF`ÝV¦¨rvE‹Ìð¸M\©æ»(e†a˜÷¢X*H³–`é”Û·¶`à}ê`ÊÚš.·¼æ1ÝžBGõ#ÿgZݶÍ5Ýí Î$nª>ìÑ}«èî?æ×ì˯ïÑÇO3Ø]ÄPÞ>õ aÖ9|à°yy3àqë—HÒo85í®!‰›hau)ÄPË׺¬¼qX‹D^~ô­Àt”½ìO>ùdÏëcÞY¸&Ã0 ³ÙY“$*ã–=˜á–Ãi¹kâàô¸7åbO»ƒ\O»)6m$PÕÂ’æö–í´œÎBÏÝ# LaÈk+‹wCT_ŽØÃ“ªh™u/ÆŠËö åbÅ% .J¥^þYü3¼ûÓêÞÃÛPÜðt/–:˜p¢ WúЇÿøÿ¸åc2vX`2 Ã0»Á€ˆ˜T\† 'ú,å7zŠËíˆLšÜ,C4“«DͰg‘ fœˆ$¦é±4ƒg½„Îè"öÈîø¸H¬ÁY· ßð Aa¥ íÊâÝ@³+2MLqI÷Ö˃ÙK\¢–ÖÕqÿëF ð¯F’6 <–ú³à6æ°öúšú­5ºéûë­uë}/u6ôÒ™úЇðÚ¥×ÿðÿ£»;à Ã0 Ã0Ûg°‹ÛÄeåìŠ 6{d&`ÇÄ% K:å슙S1 ! É8Æú$ÛkqYÿ÷j™ûO‰5ȶݻ™ýbEõåžâ2ìµ4½š½Äe {ê%. .P*èŠÉpÜõÛ#×öÊšâÒ Ê…£'»ÍUAq ÿâ_üs´×7Xd2 Ã0Ì»',.K§\놦¸4·£?ıüP àz?æ „Ï½x.ÍË›{Ò˜‡£?„Ù笗ôGß´Ñ×Âý!̾Utô‡0û:£‹¸)ìâ),lITšâÒ¬ÉH‰"ÖÙf q)ëÁó„½–&·êÁ¤kú¯-í¡4Û‡ÒÛü«‘¤ŸfÜwJ?Ãk ^í|Ïí†a†yw3Ô+öÒ\Ú(r?Æ0ì•£RCÓ·îÁ$O%y1ã–LÓ£yÓâ½4…ŸÍ{싟›Mg½¤c/‘ûOº_¶ÓV¿ç±ü–Œ ”Øt½~¦G³}#˜ä#ëÀŠ¿1ᣦG³s‹ÌÍ>LºfйìöÛ¯ PÃã&¦×rµ¹ ¤G°ŠÕø0 Ã0 ó®f ÌjU%š‹½#õáó‹ë2,¾€ÚÉLÓ‹i–#z'c0nR •Óº"xî<¼@™¥Ab0MDÎ..m3%¹HíH æßüéɳÆmv **ŸüÁ÷qèP7CÝ«Gªp Ã0 ü÷²³¦ëôôKì1gÆ!' i%höêÿ²È®ˆ —+ê—E^*ô´f0²Ð¯LÑNd‘ß $žM±—ýÇ`œè³Sp9Ã0 ³ˆDrDA°•:ŒfÇíò'­WðýäÇñ'­W@·¿Ÿüx`»öOÿuÎÏü¾õ8¿j©ÂÔI&¬ö¥¢£U{1vzqEʆ¦YZ"ö–zV£Iû3)y*nq1•´Ú×=g9šº{[ç?•Q±¯áYfˆï¾¥žÏƒ·ŸÏ ÏŸyÿÁ“a†Ù ‘™Húe5‡yànÉnŠ›)tzŠËÛê7tÛ„Äåë8«Û&$.›Í¶n›Ð=W«5ëý“¸[ùé¯u;`÷Åå<Ý6!qùjŽnö÷Å¥\—ºm;?DÆz~—ò¢§Û&$.×~YÕm"îùSÃ0 Ã0ÌVpH\†§ÞÛ ‘y¥`ŸúîOZ¯` žå†L¯¥Íƒiz-mLÓkió`š^K›ÓôÚ<ˆ¦×ÒæÁ4½–6¦éµ´y0ûßôZÚ<˜¦×ÒæÁ´=ö`2 Ã0 ³ 8¿s/ÊGæP*XãûM øä“Oâ`-™$n¤ïÔMް°y ?³Ÿa†af;ˆDrDÚ¼•Õj ‰Ñƒi›Ò°z£†Ds<ð@OiÚ¯Ú8XëzÐL#’jˆ™& ÕچĮ'Ó6$t=™¶!q ëÉŒóÖ’'Ó6$ t=‰¶!q ëÉ´ ‰]O¦mHèz2ûß6$t=™á!qâÁÛ)|ç*eæ³ØÃ1˜ Ã0Ìn0(!eŠ,—Dq¨`õn‡ xñ"ÌÊ%»X®mCŽzMOÄ¥lSÉà KSÜÜV·'®¯ãl¤ï#F»Ù´‹,B—]20ŸÁÊOÝsÿ¸RIĨEí¶\—{‘±tv‡ÒåEKF¾1ÕâÚ/«Q{Aq™Xƒl¥!üþ~÷Ä0 Ã0 cC+sö˜pù—jµ`Ôg&¿˜@‰J²;) ;ª¤Î¿²Ž¾¸$(Ѥ¿›ésgâLO³.«´M>7þyݶ ±iÑ{úÊ«¥ÞŽ#§Ï$GÂé-H ½“ÿ‘ÁúœºX<Ã0 Ã0Ì-b[ ã×¶ ˆL¿o4=Ñym Ó§ A×1öEP\’7s ]O&y/ãD¥ö^ƈJò^ƉJ›÷Ò„³)*mĉJò^ƉJò^ÆŠJß{'*É{'*É{•úð†¸ {1¿sI Ã0 Ã0qˆ^Ç,`¯c6°ÁÌ© «€,ª¥ÉÿÔŒŽµ±¾šÀèXp(úU‡×ûÊbpÿŽš†ò•Îe|Ü9ŒW:Á9ÉÝÂí1 Ó ŽÁd†avçuÌjqI˜mQ C³=:ÖÖâ’0Û²¦fû•Îe-. ³Í0 Ã0 ü·ÐCää¹ì%4‹ÐôG—ÉsÙKhšÇÑm¿Ÿ<—,4†a†aÞÛ8@PHÚ<𦍴y4M!ióhš¢ÒæÑ4…¤Í£É0 Ã0 üwpâ<–$4ã†ÆIhÆy,IhÆ “ÐŒóX’Ðd†a†aÞ[p &Ã0 Ã0 ³£p &Ã0 Ã0 ³£p &Ã0 Ã0 ³£ÈŠtTasƒy8ºp¸;Ò@® Øë‰òÝ>w¤°›¶~Ç/ x.,°ù…vQ@/ HÝXE&“@³ÙƵ#'°yy3P Ýͦ´'ç';‘«Õ!ötç'·Ý:k‘mLr­d×.g0\í ò_}B¨‚åí4œ”ýþ®ä=½±XÀ¡Ã‡öé©YÑ=÷µ/§ªÜÿćõ=V¤ƒ} 7`¿ÞÎëç»Ûï7|ÿpµ8 ˆ2`xÑ^ ž Ïߪ2¦¿þ¾v¨ûóþ`U¿‡™é`=XÈT03-õÌÂEñ{>Û5çdÿ[µ—+Á÷óä“Oà:˜ Ã0Ìî0Dâcäü· ¦¾ÀŸIÇ.¹võD¹Võ¤šv'×ξqGÔRÞìŠ2ê«HÇk_MÖs¡ð½Àñ/—rx.QÅÚEäGß‚»~;à¹DÅ"”°} Íf÷¢Ç÷¾ŠævDx™ÉŸÃm¦ôÌ=n6˜Å'Wëö‘¸ª'BÒ¸Zíþì7¾¸ºZ4‰13‰Ë/´Cæ‘G±X:|È>×{±€Ô/Æ™ü9RÅàlI^u&p¡ð=ìË"ß Ž\ •ú:õ¬K¥®ˆÝ¼¼‰ÅÅZàý¢³†ÊÙÃ|¿×¾üëÀ5ºðŸ‰œA§U†“ ^ûpu¿úDyI‰ÃÀóñí¦pÜ®]÷‡äLPÔÅÙEY¿ßâ¨÷13=|çþvjF&'eô¡û=‘R ÷)tô³3÷ïxèþ㑜 \S†˜ß@àü¶ïßVìåÊ\D0»ÙÎ5o€a†avƒÀ$Úã{_ÝðÚ—ÊÙ•ˆ'-x´´µ;YXB2÷0.¾‡ãµ¯lùÑ·ð¼x©«” ¤>ÈdXyãÎÀ>îúíÈdÚÞ\øTÀž*.i{?®}ùרÌÏõ¼/²…½@Pžß‹¯¾YFy~oìþ^܃ÅÅšuö?ña¤~1»ÿÊw«Nèuj7>¥¼'Z7›ÂõúºöPšâP‚¶T*tO`ˆK›=,.ÀûƒUÝ^¿8 æÑi•õòÏ‹{°~±{ÍÌC¢ ‰rTì@®Œ ù#LÈYíÅÒu”ç÷ªçl±W¤)áÏK¥ŸÝô"ÛÞsE:Ú{Ù¹µiì#äG€âdRäÍмðGàU'ïØ$7ùmÈN²z×@ç‹;Ã0 Ãì:Ég ´ü¥é©YTæç0=5kµ»#   Õ™L¡–€Ú„ZHæÆA7¤çñ¾ž^¤BÆ)ÉÜÃX1Ä P27®íÍ…VÀîŽ4Ì%âÊ•9\P®œÀþK˸vä„SGN*&®ÌÏ©m¾ ÀŸß›Dyó*gW"B„†‰ç/ì.¬˜Ãáůa_nrRk1YÃÁªÄagPÊ!õ‹1d¿«ÎÛxP{êø,ê7RXÈ×ÐøÅX@ø›B“¸ÞÎcßQ5e'‰K“8a;üÿB¿ÛÊ|T`Ð"Ø—€šë]ýã°¤EØñÚW”WÙÿŸãxí+G}/¬EßÈ: 'ÕöÍlèð!LŸ`¾àøU½‰©¼ÿ¾÷ÿ¢¡ñÍË›]o²ñîihü±¤£—V90LNÞK"×Î"o >“÷R¯‡ö”^_½ìô]ÝipíÈ  ùäÖ/€a†a@ÿ"Òã<œˆð ‡ë‰Fd8èÆ|å7²Ñø3ãác—N¹¸’÷ôòÚE\É{JtúvÄôéqíq{Òȵ‚ã³æP~àž'ôC¾Çz¢ýO|Xmã/Ã÷IÇ «ÅY\-Îbfê eŸzûr£¸^_‡H" ÈÃåùök8˜”8˜”È·_ÃæåMLºd'=Lºd&¹“ŠŒ¾+ôì­ï×IcÿÜ¿)J÷?ñaT«5ýn«ÕZÀãúõôR…a8Éý¹G>Ž|]½·çÅC=º'¥¼ψŸp¥( [jèY$±õÍ2¦OCìI£rvòæZÀîÕ®FŽoz9‡«s:æõ ›RB›uˆûm»—?Ž@l1¢_²z?¸/Zí€ú®Ó@ \„a†avƒÁÔÉ.sÐMañ\°x.Ò©`ÂJ½C®V tê…ÜÀv›4ÛqbÒôԒͶŸ)&M¾}‡Šÿ»^_Ç_Uo¢T* T*@øZø¯ª7õ¶>_ÆKÁÍù v/¢ ‰Ï}¹Ñ@?­*>w›{äãZø‘4ã+V¥–$4Mû·ï˜ÑÂ’„¦iO†#Ç7ã/¯gµ°ÔÉU†=õ‹±À»­VkïÃ4¦ÞÆiÑQ1”;„»TZúG&“P±·Õ àèBtƒü15TÞÉ"7ùmul_ RÈ‹K†aæí@‘ÿ7ùqwÕò_ŠW¶| ŽÀ ½†þŽ×¾‚ …ï!”‚Ò)‹çVâp(xíÈ ´êßA2÷0ZõïÀÃ!sƒ‹“»JÞéšmÞJ“é©Y«WÖÄ6,K(1i·_.Åp ö*¶Øk´·N®®D ÉÒºÍýN‘* ˆe3ˆ|) f¦ÞÀ̽ÇèqÂIPa®–D)Þ‰Á|"hÇ`†“š„¤ìè$Ÿz¢žD't¼´5ÉÇiD¼ð6Ì{TCáAO¥pV»»~;ò£oõ=>Ã0 ÃìZ`>.6làñ‚}Ã\; ´í6@Å"àAÄ´j@ý;8^ûŠJø±ìÿ\¢Šç\é5‹U%º¨XÌ;qÈR"³¹ð)?óSpG>±÷Klˆ”) ïß'ö-\¦'L¸LQ˜p™"¢¹ð©@’ÑŠá(Ýÿć1-–°Ï¿6.u?¿iÚÏâúÝîöýï¶=¶Ñ ö[„’‡è9Ûb0îy8ÓÒa’É$àù^ȱ׾‡üÙÐûʃÌSm÷Eˆ¢²ÒðàffSý£V®œØÆÝ1 Ã0ÌÖ¨&ä ÜÄGö|û5í±y-;~eTH©g"`¯û… iÛþ¯øëBXË´ˆ¤òC[µSÙ jµfµ×|á\•‘é÷ü*Ò‰ c›YÞ^u£Gƒ¸õ‹Úcu@Ê@az@«§çCÛ˜˜6º“pÒ} 7ldÖѤó_ñ“dº©ÀùË•9ì¿´¬‡a©V)y}£#hgþÿöî&6Žó¾ãøo–rN%•# Ô1X\î’øÐ¼Xj[€ uhÅhßHç”J$Û§¤å‹dôИÜJ2R@r¢CN ÉE q_¸´ûæ–“Zv“S%ÎÓÃì3ûÌìÌJ²(Kr¾`Á™yvg—»+èÇçå?›‘çÏ6ÇÔÝØ ï!޳ŸåÖ@Öî®È¶óvÝ9½v¸|XO)ýý³ß ï@ô€¹¼WåÍà÷öÙg#í.\8wáÂ…ð=9žÑ“GnÈ[éê??5©íÓÁg“vŠ[¢&à^ë`6ŠÑÿ gmÉd4§Ù \Ææ|Õ5£Rw>쉉÷fòmùí ¬¸áÎ*­+Î_èÓ»:©z1ºR¼Ô‚ͲgTìäôb=P¦ÌÏ{¡"Õ{=uÅNN“^éžfWíꔚÍÕµ¶º’ÔÖÚJ>x]+Ñö÷Ncëê–—Ô¾ºi/f$uƒç4Fª+xý×»¥°Žèžâ¸Šµ†LwB{VÆÃ:”v¡Ïœfµ·º„3Ô’YÖÁÚßhüÀ¹ P6ÏÉÔZúŽ7¥s+çÔ®Néå³á•“~=£Â+yÙ–«½Ð5z×ó‚€îyªòáó¯­Dk^ï–Âí9ÏÔ)Ý“­GÚ¯wKÚ“­k©[ÒKÚî_¹©w{%¦Ç*Fß[^ WçKÁj÷÷žVì/.-!irSÙf?uÎn*³²©¬‚à5?w2²"öàIeò'ÃY©”¥[ˆ?­})V@RôX/\~¿]|óbµ¥k…u2¿ÿý?0¼ù0PZö˜ —¶°¹eÃ帠s¥hø–¤Å'úïÇÈñL(ûÛ§ýþ1@Áø©ßê„À{O–ü~ÏO±“hw猙íÁÇ»=G·l÷¶ûƒCyñKLÆ5›Ý¡õ/×Vò*̤/r°ejÒÔ³RiÈ4Rã>WÏ+‡ïP\Ô7ËY½[ô¤âà*æÚ• w🽮ÔÒ-m´|yAÓÏÕWê_olH™ m\™Š”*²DØ›ûÞŸèø*¼RçÆ]óÛz§ÔÖ5§ø£{ìÐî·49™”RJ:çϤ6í;¸eîø¡Ä›õN©=ðý³½µ’Tx¥0Ðn{{ïÄFëœÎU¢Aögµ®¦œ9%uåUwê,}¡½­'ÜÐÚÁ¢03“ }±À‚Àƒ)˜ƒ™™Ðœß’䄢̄lþlä:šëŠ´»sƼ‘‰^h‰=ÚÖn‡½ÌÅ^ tÚ3õX¬ ¡íIK ™¶œKZÈ,Ì´‡†L·b’R7=dÆ{'#‹l抾¦êcaoU]y]W?®¯œ“§5}õŒJz[~g1R¨ü]ÏÓâÒBx‰Ì½«&r=x";µàê>/i[ÒÝ~îÍäÃ÷݆L÷Ø÷–?ö`Ú@yéƒÏ;½šA˜µCäþLÿj6.;î^íÆÖžÔ‹éú\=¯wŽKî÷/(“,*Z;º¦ÙW ÒAÛÚæ;‹lâCäq­sáB´súad.m2{ßÙ’TR[‹ í¿çGÂÞÊ/´·å­tõokùàØš×CäÜ »Ü[{Òí½‰°Wêñ“â|Ç ÑY“¼¢7iœË† · uܰè/”ÈIDATLI·¼‚ϰL)}±5¬óat*×¿Ž¹;SŠ«»ï{Ògðéß^”zï}ÒªýlsL³›©ŸíâÒ‚fžLm¿Ý9—ñv÷»–ôýë¯L¿õ÷ÏOªe™4DnÏ>/Íž ·õ¹å´ÿf9«ŸÕºúY­;0Lï9žIÜàA‘Ûp)õ‚flˆçÒÝÿqã~ÿŒxàö»¼|ya 쮯œÓúJrïýùÜSÏ…7×ëõ›úf¹ÿÅšŠ×ùà!³k9³_ïøëaÏÒÿ^ÒVwK«~IË™ýšÓ¬Œß ÛÍéKš¾º¥Õ—Kò2åwu6Ûoò‰KÚšÙ’© V3]Ó\çPÿü§/i«÷øF®£ºÇtÍ=ÿò%ÍÔƒçß›ÉëÙNPJFýR<צ½ÞôÂÞÎ^»]©nËûØÿ§ãíAHi´ÛaURêcûûížS’Æ“´Ù?¿Ñ¢TI¿ô`]y©$}ÙÎ)Ö^WñÉÎçKZ:²wÕè$)+í]Ÿ~IÛzI’Ê’tV™»Ü²Îb0L^p¶£îfˆ¼=9¥¦ºj6»*©-MF¬ú¿¨¦Ò¯4s¯æ`ó“¿^æ¢äÒ7®¥¤ížÒræyÍv|eòéeŠâÒJ½÷Äa=y*Ø~R‹Ò©äû1Dx˜ÜVÌúØÚ@!îF6ZÛrXÅ[Õ¬TÊ…ȿխDÊÐÄçFÚáb9u0÷BX3>GlV¾Ô«‘Xì.¥Xì¤^ÈZH½.¯U¢C—Á±àòˆ?ÍVõ­ntìû§Ùª*½CIC×£ªR)ëõß¼þ¡yì<ÆÚ°£Â2E÷ûZÕöZÝx°„3qˆÜ‘8DîH"w% ‘»’†È]ICäxð0D€EÀÀŽb&€‡ÜOdî÷KÀÇÅOdF† €3r"s_C¦ñ[FÞ°çž7{«Æ<&cvïù$AàäIÒâò‚Ùºº¥ÑÇGõüïž×ö~_•_–U­Ö$#ï‘%™c[e>>ª­«[’¤3£5ݘ—d也;~(<ù§>ó}pý‘vûxIáùm{þæºJkmU*åÄöÕÕšLGòrÒ§ö|R¼ÿÉ¿ IaèÛºº¥íý¾‡£w:¶UVõ÷ ½hNêÌhMÕß7tl«¶ÛÇÚýuIR£\hŸ;~(1nèL’.Ÿýö‘;ù=ðÙµ¸¼`¤ ÄU¿ZSã°Ôš Âc¥RÖèã£f~ýy=2éëF3#IzdÒWµÙÛ¥ \JÒWçß–æ¿"IzöÛGÂö­«[‘Ðéžß¶Ç¹íI*•²ª«ƒ÷Ï.7ØU~YVQ5Uœ;l]ÝRå³EU› =2éK’n43ª|¶¶—Ư¨Ù FªOýåácO¼zþ–=ô^|¼x•éò@aõ«5U~Ù?3Z‹ ‰Ç]xõ|âÉÝ ¸Rªim%¯ÂL[™¼Ây–·Ûž¦ºZc&À$ÎLaŸ‘$ï̉‹glµ‹o$)›»«ÕÜÝÎæGýŽL&Çâ €{Á“¤›fÕxW" ™—›aÐüÅ埛N§iߺº¥jµ¦ìøXxl#·nwÆ÷«N¿ýÏsAûNLã·ÌÒéK’¤ùÙ“CÏéw‚RHi!ÓÎKµç©e*Áû¦7Æ ‚ºgR_G½˜7¥FûCÿî·óøm“3#^Ç“$ßÜ ^“éJ£ò&Þˆ<¶iæËËÁ´‡ÍŒtÑþñQÛ0W²’¤Ö™ª šŽ´·:ëá—/¿vËÏàN ûþÙ?tÜžø ¯ž××ÿÀÜ'»ìFæå¦üç&ßqn™¡ÑÇGÚ7r›ÒÙþþw%ý0×ßÿUgSÕ62º2îGÎaüV‚2wŒß2ÞÈD6—ÌüÜÉÄ^X¿#ãe[2݉ÄsÙpéª4äÅÃä°pÙÞ¸¢üøÔ×[/æoÙë;,@Þn¸´Û‘p)I¹WdZG ™n¸”‚E\7”16dºáR’&ŽU´vFÆ ™¹ýž̓Ÿ‘–en7d¶:ëæòå×Âýxx´í~KõO ´ÙpéNÕØ½ç“† Àý‘±n¸Ì¼Ü¸£.ã sl¸Ì+£|ï”m껽N'.Wô¦Vô¦$é€ñu`#|ú0\Æ··;Sáv»–3íZœìOIZ:}IOÑW¡fL¡fRÛ —il½Mi°´ÒWÎŽI*gÇSÃåÒ©¿O=¿Ô—ÃbZ­ó&)\šÖ>³mrÆ´ö»í¶{¦Û— Üp™Ä —ôk9ã])I’|&Òö‹Ë?7‹Ë fqyÁT¦Ë‰õ?ýÖÕÄpù¿á}ú·%)1xJéó€ÀG/LxwÛƒiµå‡!3ÉŒž Cf܉ùó‘ŸÖvgÊlw¦LöÀ¸²ÆÕ®åL¾ÜñÚµœyú)ß¼½{>rÿ·wÏ«P5ЇïèXØsw‹Á»á²]Ëã·Œñ[¦Ú9#÷§rmÏe ï$\º÷±œLz¶'Ò›xÃóó»d‡Å?Jö½È—;žíÍŒ;´û­Ä9‘Ûï}柂2Wi<}ï†2Ñ!kg‘OAÓÞÚ™hop|‘Oü³Hëżª«5¯2]6î09ó/x@˜Â>c ûçÇIÁbŠøü¹ln̘ïÈ Þ3Ùܘy¿·¿½ñÈóØ¡è;yÍO?å›BÍûÓ½Ù×YË$ÿ>·Ã"ßlà5Æ3I7{wx½Üã›ÏDÛŸz-Úþ%ÿK‘ýßd~ÙïnlFö³ãc‘ýý“û#ûëÍõÈþF'úøñ\ôñÏMF*2éåæÍÈþ£7¢µ•þøÈxôõýYô÷˾~¹K€?eÁ„É^¸|ôf¹¿ŠÜ œ6\ÎÊW‘»Ó†ËcË~¸ŠÜ œ6\Nè€&t rLê‡ËJ¥®"w§ —ÚŒµ™È1©.M§¿ŠÜ œ6\NNfÃUänà´áò×?òôëy‘cR?\ŽŒ7÷¢Â9ny¢¤REny¢¤REny¢¤RE6XÆ·-·ŸÿœÿB!½½cÖïÞs÷¥k­÷÷÷Æœïcÿÿƽÿ½™RR!ç!sssŒ÷Œ)”9!ÿ„ÿRR)ÿ¥¥k9ÆÆÆçÞ”””{”­”¥µµ½Îsïïç﵌ÿsB66-''­„)1))ÿ€­”šª­µÆZZkµJÿR!Œ”œs9ÿJÿcks{„ŒÎÎÞÞçïçÞÎ1997©ˆ tRNS@æØf“”IDATxÚ콉v\Ir%$@¬É"Ap™è,T&x²ŠSJæ(¥R•¶êJI­RϨ§[³èÿ?cpqãâšÙ{/V@ø='"žÅÛÝ®››oæøç‚)¨ûÿûÃqÁÿø“?5}þã?þï€ÿøº¿Þ¯îÿ—ù?¯ôJÿ¡ëaHß=€’ýYg“ÿýß³|v6›||<Cè'Àÿw‰ñèÛŽø¿Fæ!Àö~§‹‹HŽI÷Ÿ‚+¶P/UìïIò¿ÿûÿú_¤¿¡^ªØß“äãã?ÿ™¸úîªx² è#À?þ#ðÿØO€ÿüOmÿçvõ#÷'ÀN@¶ðZÿóŠTy$ím¶ÓAê¦S¼e©ÿŠ˰‹ª×g(àì,òB¸1`-EÁ2|€Éø×Õö¿þë|@Î×÷ÎÎ2(/D€•[€Å•¿€°z 0ôÛM(žæ¿¯€‚3rÕ{-€Íût²Í¿ÔU<$Û øï7á  Z~Óà.ú˲Vò<Ñ ¼Y àZ+‚ý`:`éX¹X´ìïÏçSÚåøÿï%æ'@´ÝôŸlf!ÀÅÅm´‹V­Öieþ—hæ'À°8ٸܘ·¸°àÿa<Ëçõf«LªÞN P‰0½\-@Tù$yé-Ë"À|-ÓWo«XDùÓ«} ÷þ1 ŸjêïL®Nj œ¦xûÛ«J½s‹[€Å  `ž–Àþj ï~j·ÊÌêÔÇèîÿ?Æ9“}€YŠ ?]>zܘ°,j%@ì^†P>H€Ysx;~òñÓ(ðôtæ|¸4ìÌœÃÛñ‹àãÇíí¾Â´jCîžWå›× þÛ% zþ6 ° ðñãÆÆÏ?OOøþ½?ÿüéýˆ[P<ó>ç´¯àã)ûxí×ñ·'‡â˜—/óñãñ/_Îýi,ÀÛ· ÀŸ®0¯øp À0ö/1%fÏ]A°ÌããþÛ–C «¸R îþüç|ý?ÿ9__û‡õ¿}ûÝw?þéO?ÿLdõÚdïîöàÇׯc~ÿS•ÿü¹÷w‹€-ÔûáƒNõ[Îû™dò u}ɺ¾÷Ïžãæ;þåKY@"E ^(<ª?²ðúµƒ­þçׯu%lEPaÕÀCñÄþ óᔋs¥bl¸Þþ~Þ?…`ÒÿÛ¿‰áTÍ¿ý›äýR/?0ô“eœ­Ç'¢ŒëçýÄ¿þëæfÌqc‚{?qx‰x<äx¼÷;ã›j÷·÷h¿s7¿ûù]÷Kñú–âõ"€Úhøþ[—è'pp`k€ü/ôYäa*ÿÛ”C-óã~›wù!Ùꥊ‡d<Ô»» [ý•àÞO•ŽÕ/ Hý¦K @¥ÛHé²/_2oSÝüXý’¥~|”÷¥å}Ùr) i°5Âô8:Šøôéô²;;TÿÎN_ЩÎf"Ãí(ÇgÙ >=Í ï—©^&)eÀãÇPÿÛb3Ol²¨mªæéº±÷óÔ¤^»¹ëÎß±üÏ“[\λôÏÐþù0„Hz®lmellÔZ•¿4 p;gn÷q¹ ÔëÓ4H>Š,·%°[LC€ÉûŸÐ·j‡XbK`;~Ü4j;@ë \soàzñß Öý< ËG‡!ušÑË—Yötˆ†;‰F€{‚„sÓ,{¦ñò –ãdå†;ªÞ êMªÞ êM€8ØArœž ü0‚äó|ÿLÀ‡#¬êýŒPeýSŸ?O¸î>ïînýç–c¹æÿͤÀææÁL°~x4)p~®‰L¤€gòñ9>ü0Âj(à©©T8fëÆ¬N>¿gïòŸƒk(ãÔîj¢ÊÞ:×<q><ãS@ýï/±¿ÏäBb@¥››?ü€)LœÉöîÝ?œŸÃVà~îcIM5ç”ÈUPÀ“Ô9??®À?P3ß‚³l©xÿ5ó©I*>þsG°,;u’²Rª,€ Ȉ²"Àj,€T}|L `åóME—É÷ätþ÷³É—òïP!°|êŒ>Ìzôž=“úP@êçAè`2ôª|€ZÄ5}EÀîîä"àààÎ˯Dˆ.]@ º€z‚(¯ÒÌ1¸& ¦N¸ÿ µä´¨”¨i3ÙËX÷»ÌðÒõ%³|ŸÐÐÐÐÐÐÐÐÐÐÐð壥/wþÔJ_=~\gмçÏzýzüÐù 1áð£jÅ*1·êñuÿ…d pÀ‹(å²ëXJ®×Ó~ÉŠÞ-YL¬þï.a ìí¡;Þ¨×çh)SàÕ+8A¦Àé)^wë•Þr Ê¿Ipe1[~¼x!¹`aL.¨þ'OüÏä" Z¤ê£ ˆE®ÿõ×&ÀâE@òú»¨Xl(H.ÿû€zòºÓä^!»€]ÔÞÐÐÐÐÐÐÐÐÐÐÐpËQ î—\[îjËÜö6úFCÐçÏ>?·æ–Ì«@Sel …ÛÂ!».¼¿Ù“¿>„ìxö ²—1Œso™cS(d'øÉ d'ÀÖd7ÞüÙ ðáäØ 96…æ ÏŸCVx.2S@“YE¼9ûH¨Ÿ H hòª(õs%_RêgS0S€ê7 ~Ž€ú¿þ-}L¨ŸMÁ|¨Ÿ}LÜMÁ¤ÔϦ`RêD<=fb ÌÖVçþÕ¹{uKÌ´òPoØÉ‰ÕÔÞ°­~R`¶¦ÐØ”×ç»ç™}T¿»ƒ¨~ç!ªßyP ¹‚o€E››9À„ã P¦úI¾»ÖgPýî.¢úÝ@õ»7€ê' Sý¤Àµú‡zÃþéÑ £È&P9Àê¯`rgH5µ3¤šÀY;C² ¼÷¨&P   ÚTÿ?ýӯ͠ú=\«…+‚G]ÊXËßžf¨€ J…S ú‘ ¤€à·¿e¨¯ì»ïHq ð›ß0¨þ­­OŸl9&Œ ì+¢BèØ ¨Môþ± \ã‹ÂEá"€p@¸ˆ¤`/@ï‹€Hà{Os›œÒn¸âûÕÉÌu¹r€äªqªkY ùñ’ë8ü“$_/t<ÂÇ$+HVˆ¯_9.®N ©úÒ円††††††††††{†E'†Ô¦ðÚô=ëÄZo¯Má­·T,61¤Û^{ÿfP{ÿjS¸:wÖn_  ìL¸Î½¡™çç™ @$ÀÅE&ZC#Ðü ðøq&Àöv&Àéi&(Ò°T´B`#`’d¹N¨‘°= xô(Ë5e=¿Î_­Srt§OÔ`•5˜eM°ëÎÐÑÛç÷­a^£àÙ™Ñѧ§™ÑðíszD D ÀýK"€»B Âç*òÄ¡ˆùpIìÍÍQÛ>bF¹/ ñD=rg(’ÔaWÑZï®ÐÇq½w*ñÂ}aPáÞžûÂpý·oÝ•¿~í® Ä”xùÒ¡ˆ!±µå¾0\ïÍ÷…EÊÌJÿLŸ.ýëD‘:5kˆþ•î5VkÝ¿*Ì–_’ÈJè–ågÏù]ÂQ®ÀÅE-2ÎÎrþÏSp¿Ú{—ß=œ Ëê=€ZÜBà~ãÞz Ī=€Y‹¿5x÷hŠrõêäp4E­QÖâ3‚¢\KüêqÔ AQFCкÓì‹Bkhhhhhhhhhh¸×øùçO×X÷³4¬?4 Ü ^¿µõóÏWŸÖý` 76ì@ßWøÓŸTÜ #„ãØ ŠŽŽ`ûä:X*&†sz¸¦GkLD1€ãØ!Œ‘ÀQt„p<€dИ8¶¿a$ǰC!ÇQŒàxvc$ǰC#8€Â Àñš­1}nÐ}þêµ°5 pßMƒ×"òþý±÷ðöRfWîo¸øùgþ‘ûG4 p¿ þh>À½Æ§„u?MÃc+`ÝÏÒÐÐÐÐÐÐÐÐаRÔh»³Êè X¦|Ó¨Ñg•ÿx‰eÊ7 t£ÄJï¬2¢„.S¾i [+ÞVùÜß_¦|Ã`â³ñ{ùèh¹òMƒ‰ïûÏ*ÿñË•o޵ËîÔYe+f¡°¨|ÓPìcM÷˜UFþÁs•oTèÎNT0úß'Éñx†‰¬PŒˆrß~üöÉ7 *tg'*øÉ“'O,ãý£‡ÿë¬Ð?þ1Ë}ûñÛ'ß8úL“ãñRpÌÑ”b‡ŠóþqòMC Ž€„d(?Êñx)8æhJ1‡CÅyÿ8ùÆÑgº Ê)c+ «àœÃñϸ_-ÆM£ÏÐäoYôˆE@UpÎáøg\ޝãÆÑO€I„Ð &€r±äšÃIñûI‘ÛCªœÐû›ÊÅ’k'=Æï'En¢‚§õ&åp-¬4~ÿíò¢‚§õ&åpJ“ö¯Ñˆ–æ“«¿¨|ÓÈ^ýìrõâ•n5QÃ=C#À½j9s¢™»{€ú0—oÝu‹—Qì F¼{ØÙÙß ò'Q 6[ k¦›ãUG9¿àDõ×0swh…àâã­ë|. E_Ó›CÕ˜˜ÌoþS—NH€w¡jH%[[H­eÍ›àäñ¡y5ö÷Ò %¼ý `|Z à9…Žï¶'²üÖT2Þ'¬Ë±/ÄÕšŠƒ¥ WF ?ö½ÿ‚w»Hk‹!ý‡j=úåØ.°õ+À*×"wÏÕ¿R -~0H€»í ”kë·—¸ID pÙê÷zàKǸ۞ÀZ D0àŒbCG±Ô¿6 0P ¼Û¥?P°½ Lr—=y6_ñá–¨þ•{‰˜DÖ°’ܘ“ï®é'zj|·«!èaÀ ÝrÜíÒ_å¿5¸AÕw1hîréßÐÐÐÐÐÐа&ìï·Q±ëG©Ôß\€¬ý},¥Nœ]Qåõi¸@ßAçEÜè.döêÕ²še÷÷7. ðÇ?žù³î”¹7(í¾èŠ;sçÖç^Æ;€!–9êd"*ÁïvvJÓT7vü-óÄ2(Ð)ð# pC88@˧Ûy0uk|È·üßý>Bé<eÈs„]3Ëëž…ó‡ì>JrÀŸJ‚Ú˜ hûÉâÞÃnèáVŽB€jòWk×þææÿèÏ$•-m@ÿÑ_žè°Ñ X¥DÜÀË[ñÜ’ú£è®þe! *ž¿ÇÇp’¼ òçϨ|þ¼¬ÛßFtÛ%¾t ŒÝuùsÀrnž`ŸÞÈËä.ÝqÍR_6Æà¸àsÁ2î‘ÐpÿÐpï‘®†††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††Éx{‰u?Ã"P@«†)‘ìíÛ“K$ ̸†ÔzC¿s1ÚF©‘ êq‰@,í›(0yU±ýýç—ˆ¨9rÖ:t|}žffÄ€CRŠ"¹'S «?çÈ)rhÚÙ=¾*¼>ÏíZöî &ÊX€à  æ8X€(Y€"wî—÷wW7oXÌ_Êc*R!ÐC€¬þ˜CY¸È×>ôטçë;?Ë}Ç7 ààÀ‹"çc­Äk °½²\_×óÇ]ð|þšt~ßõâñ S '˜pýÇînIѸ–rŸ& Ê½9¶èoÒùÓÈ ˜QÅ5Á3:§+¬àf1â“ €HÜÓ[„Ñ6f9¾`A¬’<6G~Ÿ³[F€±Ê" ›ÿg%À&HÃqy~¾ž åu•1+êªý*b0;&_ϨTé»_—@ù>MºZ#ÀÌÈ ”ÞÀކ&c(ùg¼ÜÌw[îõï!îvgpCCCCÃmÂ4…ò¤U[¡¾bô'pRÉHˆÿ]oãôÇÏa+×ܺ÷Šû벤‹:õ{{«L½/5Ùó7ú7 üI±ÚtʽV)¶Òå~\&2þ÷êU$ÏO'ìîÆ ¦V›ì½>”¯OÃä†5ªµÿ«?’À*vú‹µý‘ ½Ðÿ’¶¦'À«WÛÛqqâ¬íë ê//60¦@mØßކ® ìåþD€ë ®³Ã)Ñcqªxõ*iü‡ÔŸÒõõ0´B˜KÕëNã[˜ÀÃèXŠéìL€pÀº8;‹ÿÕ]Aöa*i$‡qˆýEZÃXÄš\ôúE?¹¨×Og^ï‡ïž>¹÷Ï@€©Îo0ú¬Ï ¤šJæ+§W'°Ðqê®{Œn¬šÚ1ïˆãPËèa…5¬S`Òñ“ÅiŠ€ÙäÞ?æG#À=ÇM`¡ç÷g#ÀüX0Oo hhhhh˜/±îghX3)«•ß(°F¤®Õ>t‡áF‰£J' ^¿}b8ckkÝiôå £mŠ×ª·ÕMµì¼Ã=b×ÏÛ·ÚO tÎÏׯ°âzª¥ËAÑvÏ_››¹»ª¤áÜѹŸûeêù[‚¾{‡ó–‰¼y=¬(`£ŽßÉÃ=dÆ sý¬Ìü[Ï·1hX œÀ£¿ºEs¸)@ à"@û{‹€Îõ7 JÿKÅïí5ÜÆ »yro×CË^âÌd'0Ä~à¡yòV,¨øë!<] 4B#À2Àd y˜ BÜŽÎQÆ4³_£ ò ÁL€ÿ‰€F€å!èƒ *!––L€è5. úÿ{®/Å7, ÉÒ+°¹éÀ•A`cÂõ©ø¦þe"Ôä{;î–N€ŠL€žÝIl AËÇäÉW‹` Lì1nÝÉw m~yCCCÃ]A'¸r+sï¶·K0à"6|ÑØ.(ð {Wçš5ÅßÿýÍÞo‰@‹ŸÂµ_5ÿjc$^aw7S K½wq^ë0þþ 7w¿¥‚ºTf¿”ô‡w‚¹Ë>bëkz‡%áÍ›ð‚SÿèÑõf h2^¿¾Þ<:ZÛ[OI€œë³ü¥X€7o®)P Ð;DîÑ£k T ¼A”ÿáó_¿¾¦À @M’#ò¨âû@€ÞÇ· $g ¶ÅË—¦À?üÃ?^¢P éün`x ©Ûòôƒ(Y~f¯•ìŠM…<þ˜¤ð*aê,:EþŒE@GßëÜž?Çÿ÷Ÿu{…œÀÝÝm¯™ƒ-“kÝãïzÙOX÷´·Æ÷îÝb÷ ‚[’ •“Ú¾8ìï϶ôí»+̿ׯC…`= À®ð††††††††††††††††††††††††††††††††††††††††††û†—ë~–Õ`LdÚkäµËo«^ú:Îívh^-|1ÇŠ¿|‰Qðøî'@7¾ÄÝ‚;GTdlÍ¥ÜðôÔ!øô!9w•à ^Œ] ÿø7+´C¦Õuôðßÿ~kë÷¿ç÷êžy™x0B}ÿ¸@‚sü’ pšÀå’ µZ °µýÉLC‘ ¥߀âA(|¯ò©—¨ï& T ~‹áK&ÀÞÞééÎ?PóææãÇþðZ€Õ‘ ø¨€é'.. ³ôO€»f¨~R€ï¯™RãÀ .SÆÂöö^\bgß«¢Àd@ñT.®À/ÎThý‹`ç$@ÄM`Ö" øwÜܪàVþ¾a|ý5 ðõ׫"@vE‘>‡}¦Œß òI‚Õ<ïr!ç[ui¤¨fªßñ¼–âï]K4h-²³—°ªD¨!¾67¯õ¹a Pê!@çj$Áªžvµ&Uñ»´jàV¯þÙЂX¸Ñ† ††††††††††††e‚1’C°ìKÄv€i0ëñ ·ïßãûÍÔz‡Z.•êp‚ <:îWÿÛ¿õ÷ÝEmÛPÇީV`ÿýû7oö÷©X´ûéDu†ˆlê%b9›‡þö ë~³yÕÇÅÑ ;‡J€êXÍbê5Xã* ³âÍ›÷ï¡~| ÔããßÿÞkƒhÖ Gs/’ˆ{I$ÇßþmOPÝ[ªÞ}T={Kúާê2U½ ëÝUO °½œoõïà Æ²;{A–ÝÝ¿û;íU€ÄÀ÷ݰ´y*Ò4Ä`G™ ×VVhx€ÍÄwŠïßÓP=?²R®ò8U/ P÷’üÜ ðûÈC¨}£_Þ¿ ™IA€9ú ° ÎÞ+ ìåñì&º+>É ÊSÅ&½€^€Šž @/À¸#^ÀûkPìHÅòD怼×}…w#ÿû}¨h ±ú©^û£ Hõ$ÂË—R½F®ûý¦@T? ÷CÁ5ÉÆï%ÖýNÓ‘ð­Z+^[R¼(ÀœO«_)^ˆCFïÔ tÇñTg¸Ût— @Õjñ0ø¶&e ßÖ€ °îwk˜ u–O•k°Žv¬6ïÎäü††††††††û ½ÒO?Eù§Ÿª{x~åóó‡£üðaÝŸ{··?ŽòçÏjo!Ž5E˜8==9‰òÉI^Íl¿î_wzÞ9<~|vFà÷ñãgÏ~ú‰$Àï³g‡‡ž¶»{x¸¿~N%ãwÿèèáC’¿GGuÿÓ§j4ÆïÓ§¯^}þLà÷Õ«ÓÓãc’¿˜ÈIœ6¼·÷ñãÉ ÕŠßŸ?×’vø}þüÅ‹¸ÿÅ‹%%Jîçd¨,ß©þî‰ï PùÀ³g‘Ü:¼• Ñ©dn}ÿ=IÀ-þ‹ó¹õôé“'$·ØjHåcëôtk‹$à'SùØúøñí[’€[ÏŸ¿yCp 3ÆHnÍ•`p\¼ÓR3bÍöààéÓÝÝ'OÆOœ¸K úýýìÔïoªßßHz(_ßGGP¿¿¹Óx¸ÿéS¨ßßè>†òõ UCùúÆ™ñûãG¨ßßÏŸCýþÆœQ(_ßs%=&Êž\bݪ[œ÷i”÷eœ÷i”÷e”÷eðç{‚ð˜÷e”÷e”÷m˜÷e”÷e”÷e”÷eæJ„ûLPÀ€ À·7 G(õDÈŸ?K,ë#¸ß€ 9r$äHî7æL‚Lªßp÷å/*D"€Š@E€ "@ ~@E€ "@P ¨Tˆ"  "`¡üo ˜ pp` Hý_ ~’À€$° lH[’@“g @ØÄýP?I` @ض$-I°0Hé ð%P€Š— :ð¢ :ð¢øð!¥~©²ÏT¼œ@øÑ „@UåˆN |€èˆNà\ÀƒGY±‰„Ü­I¬[m˃Í?ú)VIWA€X b5@iŽ’ˆÕ@ VA€X Äw¬‚±Äj «­!ht@P€ê‡Üu¥ Õ™*£º “T?dR€ê‡L PýIª¿ïz¤ÕÏý @Sÿ8AòO#H®‘AÏGüpÉ'#H®a3? ùxÉØ½ýÆíohhhhhhhhh˜ Ñ[¥ïê°œ4eÎ!b a”]÷óÏŠWð–Àr„`@!c£ìúÁîn­-äò`sïYÅ]üjHÜê»~”—“ Ï®pµ©°Ð ­™‚Ú"°Ÿ[l©ãÚònáõ znIMž  • Îðb͈[ñüîþ|¾æÅÙE’z~•—‘l÷@ËLjï-*ŸßP:(@õß½1T¿¿='(Δ-ˆ“ǹå9@üv¨yþöíç[ñyKßõü*/Cýìûäm(Ùà(û¡~w ÌûþΊfÌvç}X‚¸ŸvA9’¶¢o¿ómÞv¦‘A)¤-}×ëWy%° ¢mH[-ÀÝ#Àǯ~€ÊœCiú'ÉÌã, ;Ó8´.€”ðù @ÌñhŒ¡x?®×‡l ° ‹ ÃO\mW çNÒ—gL‡?|Š¥î!Yf^æ׌Îbwÿã3í‡ÇD•«o€=„V?,@>Ÿ2-@t(G?âs%ÖB¤tyøvùO´ëVçìä`ËFŸ[2ã2ßu¿]A{ø“ àئÙ×!u[®×ï»ß¢pp%v @© Z€u«svÐÐ&)¼5GæÑ“-DlH€®c¹\ PPƒ D€rª‚B€àîðT¼²½°Éï“s_—˜éÛïœLD…‹¢DuJy®\Êåd¹ÄZ@îú:‘³‚ú`êþ¼ŠX&@wT(äèBŽw?ÕÖv_>|p{`WAy Ÿîþá•D'ïÕ>ýãöÀþûµ+î9–×ÜÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐpQ£–¯ûyn +Åáá ‡ô<ÅÇ8¯¾³sggð|Òsp^‡¡>¤çàj±>¤çàÑüIð!å`OÙšx~Œû0x³™±nL»Ò‡ôü…»2–M‚AäÊáS©?GÞ(» èŽè‹ÎVPÆ1‡O¥þH€žÞ½ B|@:”ú”z‡rür)°Ä?»”‹€Y €€ìQšñÏî‚V±ÙUò´¼ðýr4zÐ{ÀF_‚>¹ M^–fA£;;Ož Þ>¾7¿ñð_‚F÷´{€IŸØdŸdôË?!Ëk3Zëy{}r§èÚ€(¯¢´ÝÝ“l@Ÿº'/î:Tt Dú§è7ç~ *¼"ë³OÝù¿N!Ðë8§ÏF€Œ~…/›‹`Ш(»Š€.?Ò?}V `ШH;{lúðîôï`¼š¿$ X€ûD€qXc5°gúw¢úû¦B–ÿ& gúw"úw¦'ª¿Ïë/ÿM¬öï¼þw0«wÍýòý€`ð߉E@ÿÎôïŠ 0øïÊ 0í¿ _úk ÷C A _:î5ZââN}H÷à)–½ö!å`èRŸ1È»{^äþÀë׃çûžƒ½hÀXÄu:;·¶Ï÷!S<;¦YèCº¿};xº)ßâÒì=Ë´ßz`yê¾í¥aù€zø òI*Ø ÈtOa õü3H€|@çðAäÊáS¨øŸq{ÐE> çð¢ÍAuoÜnL£îU Ìï9`c"^¼x;BLäeX€±HúÄ&ü¤R<âú½lL&@\/ ÷€¾}b“F~R©Ó »;ÿ3`º»Ã? »{Øtÿš$m Z€îîòÏ€èî.ò_“¤¥àö Z€©0èÜr êô ƒµ€F€E1‘ý;ã¿ пóúß©À ÿLTOµ¯þ7‘ý;Ó¿ п3ý;Q£}Õ¾¥W'6õïŒÿ(`â¿7@€Áo9¦ÿ÷‹Eë ¸×h}÷ @ßÌ©E Vã)º”¯ VÚ{æ†//Ù5^!þ3ÅôëPÕ_;*šú' xÕDÿWçzÄAúPþÑQ¥€&ÒÔ“ý˜¢·r¬)Õ›µg§a"ñ ~ i FSÊ×€òõ‘úHl&¸‹>º%ùI‡]÷6æ" ÛÕc@Q úñ HR\)3¿£ ÀÔ=Ù©ŸàÊýsð®Áe%Iý‘h×6 PzüPí\²R ¡+ ÀT9JBŸÐúÐÕ€üo ІЃj´,¾[10–kfÍý¼çD ‡›lt-€`ÍL…[îÔñFj`,©½ù3`¹µ€˜û®tPQ Ðj ã–µtÔŸÛºÕÀŠ–ÿ׊շNnjE@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCÄ‹K¬ûÖ‰¸(å½Àñ%,]\ FÕ$ |iÉ ßßÇûß* d ˳àôôø/|||zʶFwý‹‹½KÜ$jŽ’g{)œïO)S`™÷›ÇÇÛ—° Ž¡€ñò¬  î€K¿ 3öö0î~oï¦Þªš,ã}ÇË}W˜ïýu6Þ>ÞïŸmÆJàôôÓ%ôxPd+ Ê5Çfõ.a)¿0ím‚@IÇïìà~žz'óÓ-P?ßŸÉ uó}÷7Š<&Çæ…¦»Èï~.ùüœgëýu½¿®‰'[ÝûoÌNsvåàíí­-̲ÐRŽ€¦ó¯qq0êõ×ýþÙbìïóù*%âõýþççqurR`òû÷]I†°TÀ •àñ€ím)Ê ¬2YˆÝ]8RÿÅEÝÏ»)tÇ\`¬âíg!@µ~¿¿÷ ;?§ªñ.¦lß>`üû¯ ö”#³¼·Cyˆ@†è^¯ù~xqÞogG÷cþY¨©¨+ïíA} P?ß_ˆ×ë#@¾ÞŸ÷“ Ðû¯TýT’xHÆ?H(Ì ¶T M~—Ýû‰¾ œÕ$BTÈ42þÁûG°<ï¾?÷JÁ<¦ __Gû üwzŠWD$5œyxH¦:¤¼¶ÀR^Å L ~ñ_>Ÿ-T?“,ïÇw½·ç¯ˆN§OHh&÷þ>;YÎ “Ì Å"@NžÏ§9—¬Ê ÷omõß/^é €o•Á*ûÇËP™@ªðôÔ>èè?|\̓” ¢«QÑ”apíÃJ^ÿJarÚ”ß&ÉÈù1Ç*[=Øõó<¿M<ßßè^ŸÇIF®×ýVõþ}íC² DXö?õ| »„³,ú­*ÿ‹“}€idKUÁ‹_ÿÖ`¨ ¤ÛÒ7ž}2‹€Õ½¿rô´rVrè¢ ºÿêÞ à'îíRDÛÛÛò!¤Ôáûçë/³`œ“8NÁÃNåÐý„•%À¬È-[Z¢,:T° X$¨Q$6ŽL¾Ÿ|‰UU„æ©D…Àä6øYeYÆ{KâûÝoÕïßÐÐÐpÃXqÓæ­Ç½zÖ}Ù^à׿?I0Ïû£ûù†2»õy áþð aW‚ÚдÞ÷¿éñsŒÈèŽøp Kù…Ž$éüuŽXÅûOñîd0]÷ûÏ‘Ùb¨¿^øð¡zMXåÃÿ)0íx€»òþ`LcßxˆƒƒGÞ0€éºßæ˜Ü %#(óIÈ÷Vÿ-éŸ{<ÄÁA|H”ø QÕ[[¦À£G%5Íx]é J¬°*ïíAÓ w‡æëõ ß/ÎûÝPøU1‰«¼·ïOyˆ~ÿ|=(<tèÞïÏûÕ÷_¢B¦‘ñ †åy8‹ }È××Ñ>ÿžâßÕ æH$ñŒðþP˜µö½?Ï—‚Qæw нŸ £ûžâú+yÿOŸÐLîðb“å¬0Éü˜P0ú'žOs&™9'î¯rßõ— ª†ßHð!¿TÍ:œ9HvòÞ½Ãûãÿù|ÂŽÜ4ìùú¼n¼ßé)·Wf‘°ôÚ•ß&ÉÈù1Ç*[=Øõó<¶M<ëÄ&@÷ú[iî÷èQ>é˜ãœÄq v*‡î'¬êý«B†dWë$Å%I îIÇc<ö{<ÄÐýVÜ4O- *¤*èè(ÿ“eTi$±r3t¿Õ÷‡ÏJ€áñPøôã!&߯hhhøÂ0Ô´{ãÝ¡·ìýo«ív9 Ùóã}Ìš»CWŠ;0bÑîС«omù•1ØÑÕ>Ôv)pÇCx¶+—Òó|ø~¹‹nx†_ç?|(™çx~¼îgð~®­¦=lùã°Òmßûó}%kà÷ZÇ G*˜üVxŸ¬GòiþzßÕyUy aØ£#.ŒWÆõ•ºŸ@×ÔõWÕº¬ñR:×¹5b•oÿà@þwwI€ç˜ýñ– ¬²JÆ2»òÞd ÆÝ¡ìÿÃKqDŒ¯·µe lnâ¥ëý8-|wW^ÀþF´«%€¦ÃKáýò¸îp)hsïµnõ¦y`rìÁÁẈãx¾ÞeBd¢'ÉÕbÄ€Ò95’Ý¡"P<Ÿà?››x­z?Žá`x?åŸÕP€y=oLâ*#8 ìà¼ñ¨r^¯ù~xÞï†â#ÐS44“e,Í0AЦǵñÒ:x>ó<¾MþC^ßïô”×_¬ƒ¼Ó ’sÚ¸T‚RS¿ûÏï ï?8転‘®h<„$ÿôi{{H¦‚TŠÓ¨SÆËà¥779$ å  ÀcX>|¨å½aü¼¹¨{?››n=_æû#¡™ÜPÉL…!‡JAØI+Þcï‘&‡Œ ‰–#^¿Êè äýhAV–ÁPˆö8¯ä­² 2¨îCˆ@ìELJVs×õdè ݦ×_•P}pÀŸ$ã)Pã$؆úùžŸôP´X Ê*|}œeäzßmeØÜ„z˜_§‘³B%c‹n Œ¸öïîÚ^ðz™ÓÝouN Ëèéd+TrœÛënJÐbøz*ó§½ßЧ‡W ÉPÊä¼_ê7AÆ/¨!hºû¯Ž]… ÉY¡5‡ÖéÞõüªàéwO ^sì8¹K~D€q„á0ëØë}øþ®¯âýg#@tÒ¨nJã^¯ò´÷[¡àŸNžÜÎF6†¨%orøäû­º?|HA]…uß?ÊõøèòýFÐ`ïÉ÷kãŒç—xòdgçÉ%°½î繕øí5Öý$ À·—!ƒP>¶ÝÀv=~Ýï¿Dµ¯Ÿ¹cñ`Í®IòÐñÞ¿y…—àVÝ¿î÷¿!0춨òçÏß\Âû¹Äƒå§OŸ<‰‘mON„–sP¨W¯^^Â2ÂÃÆUÂö÷Ç™c©#ªT˶“‡Žû¥~¼÷¯[37E÷•1¤úß¼‘J¨~¯ñõ?yrxøô)eª‰HÙaÕùKõ¿|ùêeªÿèˆÁ'¥þçÏû‚%Rˆà)•hQV©´ÊCÇçýPÿÉ%¾úЍû×­›€Ô¯<+õËHý²»»O®Yê— ˆ9”’úe¤~Ù©¿ß@!ŸFB•CE€,Ÿ÷onBù„÷¯[;7S€6`<hž>=<$hLÚ€ߦm€)@` tmT&…Œ3ñU:>î‡Ù'NNÎ.Q÷¯[77S úöLÊ´ eS@ûu]þšP¤÷#ðj¿  ž>ÕìÕ¿z*YþÕ%¢|~‰(sM ×`ô] àÓŸÉxñâëK¼xqãT‚5nå¬2+XŸ?»üç7i ý FÝ< 8°<‡‡Ñž@þÕ¯^ð«_A>?W,ßósÈÑ~AŽöŠEÕ…Õ/ ¬[37„ºÄe·ôï/Gå®(ÿG¥Sæb4*l(ðeä×÷ ï0t¯¾:<ü:àžñm—)ÇÕtäYmGðƒ5‡ £èRùŸ6€[¸m·œÿiÿi¸…ü¯u ñA~gžçÖÆF–‘ÿUà³nÝL\Ÿ Ë&€£ã µSϺ†¿éGøjߨð7¯áoú-þF2=îoxJ<PýÆFü®À²/øE8hü>~Lk'«‡`Ðø• ¿ò¨êùZLµ0Ýo¾±ñì—™Ö åH1^—¿ -ß`n Ü$Hš|Q€²Û*dâõܪ@Å“„,€ä¸R)z”ãÑ$¬$¤5`ôsY€þ§â ,F§â? H(Þ+QñP–œêz¾"¯«"Îw•çCÅ?{¬-Ùi–õZQ…‹ÊbtVX&€Ûk ‹ØêÄV…>Ôb ½J,À‰GÈè{*¨OžÎãÇÜsvF%j­!¬H[D"è™úÎÇ™øðxc­ŸðÓO$ÂO?q K| þãcZ0Y15ÅÍEeÊÊ ‘q¿l€$Èãòt£úEèDõ‹Ñ D²E§O9H@‚G'°ÿ‰D¨>}QÀ« ú3ÍùZD3ª_@Ð’<¢ÀÜêoh¸åøRV¿³¸¸Èëùüò—ß|#é»Kà{™w¤Ç+Óî%¶â¸†<ÆáÞ¡Ò¨žº,<~) üò—ß ˜ k¢oßvïëê·|n¹þÀ-ª[4þ¬Óïïã q¾]ýÖ+”ÜzófsS 1ÚºgPÍTêWMÖký±Ê!õSíYý&€Ô @ÐO€'O>}R˶Ð;ïUÉñáò¬P?¶=z÷ P?¶ö÷Q{¸µ¹‰ß[¯_?N pëèèûK b‰_,€ûþ½Ž×Ö½Bî¨ÅJÀòŽÔò8W8>ÞÞ–úA¨^êW0‰Xux¬Ê˦ ŽÎÚùÍÑ7Øll@ñP?HÀ&Ôé‘{©||Cýx;(ÿùsÔñQ§66 xVÇCñP×ï™ìLæVŸ<¬ƒÉûcFë“«\ëûµý¯ÓPn´ú «_`õ[õÀñ±Ü?â—¿Tî_.tÇ(ç–D·{; r"t{sCSmW¬ÇO»¶ùDy0\Ç_­¨*ä5@‡î}~žž-o÷ÝÏϳ‚k0Û Ü@*S –Î**TtþWÞ'ú  "Àwó·“ÚP燓Àß|z÷VE·5¢ìçñã<fÈkx≨p%± 6BKÉgõGxeƒÃY¸Å¬h•ÓB«O£¥üîLçßýÎrî·p¿F!@–g©ÚBø±”ÿ3–]œt"YN`ß±qQX*ßKÞâªïÈœOÉNùÁ¤Œ)PŽŽE0R=÷b¼z‹df:@r1 àIþË%¤æós7\³G{ÐÝhPÕ]˘ºjmw gª?…<€Iùÿv#wdIñqµ`oîNâHˤ€iP×ÎÈc°] ¥-W üîwT?)°¿ïL¢ÕŸ,Áb¸¸ êEæ}6‘¼Ùm±³¢.]e©_­R¿d‘¤€' ÙÄî,i'éœåL€Ø}ű™¸_¤»0ÐlHý€ (ŸÍAëVæ<è#)KÕRx•éÁ˜´&€ÆIBî#-^eöû{Ä”†¯HÁì·ô¦º è§¿©x5¯[™óÀŠçot+¾ÿWöÒ lP6(›ú²,Р £²,Ùðþ&›ì€š‚—ÝtSˆ._–ùë±Dý¿R»ÕOµ[ýT¨ÕÏ:€Õ/µ÷ÿJíV?ÕêüO…[ýyÿ àîæý†Àc÷ÆÁE¹Î=¨=¹þÝmPqûQXêùœlß+¿Y­ÿ×™!¹Þí*±ÂŽm°ÇMaÛ53nŸYmךi"É„üp '&‡:ñkS‡}coÔƒ#‘ê ÎY †úúéÙ3Ýê?>>=UpbÙÑ‘îËg88P@ýgg‹4PÿééÞž†Šjà¸æ"áüçÏ>|°ú?|øÕ¯T¾CýÛÛOŸêy þããdfã@óI²®l>¼~­‚”ëo¾ÃÈ]ÇŸ.Áá Øâð¹ï¿Wkft`YGÃô6Ö °µ¡1ªüàF!O†Êç2•Ïd*Ÿ>ª…˜4&–¶<†?7ÿNK€øÂ @|A & ˆ œž²Ê†-àüœU*l‘ÜÜ-j¡zH€ímŽGÄ€7W»prÂ*{D‡d\•Ï‹­ƒT¥ÿæ ldïV"]ƒ™òûk0ÓºC²—Je¤lx¾? @+`Ð ˜ž¿Ï×ç·ÔN®òq•ûù; ˆ/ŒWŽ/ˆWŒ €$ˆ ¦aÚJ$‡„²ˆµjØ5ïçùqš Ie!ký(b-¼ÖÊûäø¼èÊÚÛû›¿ÁçoþF…Èl C0SÈêë¤F9Ldf‚˜+löö ÛA¶xö ²-Àþ>dYšÿ³3[€Ý]ì×t$ØÓ§øg> _¯_¯I ÏI @+@ÀÐ »»;;øˆ°´$,­ À0ÙËUÿž,ÃÐ ¼~ûÉ"‹‘ ÈX1C ˆ…@Ì (b¸,F%Áu¥D²¼Éò$‹o’åPùH–†Ú//Êgé?¯ó¿_PN`ÎÿN0Ï´‰ùß9\N`ÎÿÞ¯ósþ·˜ó¿s¸œ¼!9ç[€>õfõ?z”Õÿý÷Yý[[Yý×-ÀÙ TA`9»*,G7ên  nKýó@À³gÎÿR¿ò¿Ô¯ü/õ+ÿKýÊÿR¿ò¿Ô¯ü/õ+ÿKýÊÿR¿ò¿Ô¯ü/õ*¿O’å@ý¸Ÿ<õ®Ò[“úA9åL¼¹Õ¨ûŠ)…7·úGp£$A“c™N e:–ë´MÕD:LS:çÏÿpÿbþ‡ûó¿çÉÌùî_Ìÿpÿbþçä1ïÇù@¢ü÷/æ¸1ÿÃý‹ùß1’†d9€TÿƆ@®ÒûˆJAï/"(}D½¿ˆpû]?d~°ÌÜo™|³Ìüb™ @`îõOæ˜øÏl€ú£ õGê. Ô]@¨?º€PtéýÛÜÝÅø#\YÕ3Ì9¶ õGê. æËå›$Kýò¤~t©Uwƒß¦z‘sw㫞¤~MÕƒF`ÒXL ËÌý–™ô–™T–åJbîÊfbͧ~?ƒ*£eääçÊÊ–Ñ”“Tcjœ®wRå–¤{÷Žàõ8åœ$Щj YcÔø[§“É´2*ÐÀBw'‹š*ðíM¦Ž  îå¢ú.ÁêG²DõÃDõã†QýH¶¨~$k”ÁÝùWý$€ÕOXýT˜ÕOXý$€ÕOXý$€ÕÏëYý$€ÕÏ7³úI«— ’ÆêçóZýø–O£7’O¤‘¤¤’ |Á Úýc’Øýc[€Ý?ÞÐî“ÌîÝ!µhÐYÌýó´Dõã7ª¿QýøêÇoT?~£úñÕß/þú*[Ž¢úñÕߨ~üFõÒÌO–¡xE3ˆêǯ‡“ð­”J½¹RA)£TÊÃK®Šµ²”Ìùao@j>:b#Ôðì”lûûl Ss‹ƒÁ£hæk Šæ?€Ÿhþ3ø‰æ?€Ÿhþ3x½hþ3ø‰æÜUæ\5ʸk”ÿi¢ù¯ÀþH¤G$ž7é“G}_Z@4l2Ød° È`ù8€M@ÚbP—Ù S5€=&{Lö˜ì 0Ø`(ŒðèÑ_ý®'°'À`O€ Àž€q‡èéóú–5†P²,£ÐPû¥€^¡°±r™fwý¤€_pq(à bŒ0P Æ$Hx¤@Œ9 Äe @ ðþ4ïP1¯o™÷·L À`w÷õk€A¹`ÈiÂÓàÁƒ\°”‡”Ý0*Af§€¦ÏÓxÑb¡)4Z¸ÝMÏj `? '2Z4ô "_*ÿê¯Ø( y<šC¿ Vƒâ<Ú˸o”]@…3²çH+Q+-¡Ó#FZÅûƒƒ«þÀôþŽ”Ãv±OÛqÔH2íÏŸ-c;6yÖž¯ÿí·–ãvÚ»?™ŸÜ=Êy$üö-‡x’Ÿ?s#¶Èo†;bC ®Êëñúß^‚lÇÖºß~°¢5.`Í̓é팧¸’åKfãu×]ÇîQÈuPñÛkPöVŽesaöúz¬ÄAËëN¼y{ÛÖÅ=6çÁ”·T)ú¼ëG¬›»@d´-fíjæôÖxŒ¬Ø9EÙ>K¸¼º?u{uBŽÝ•”9ÈS·€  8K×tv¶³ƒ @+p7  îf Ȉý“”+eò€ŽØ?I9gÀØ?™÷ó|¥· ýˆª–‹ê¾¾&@´`Y´x…h ²h G €B Z€< bwNT´Óô[sstÌqôsmä˜Cœƒ4%\2=qç(úÕΑôìm$sŽËÍ€F(ˆ°øè *e4BAÐ@YPwTuëÎ><_i-€GæÎiY€ë*xV¿†?Iý¬ Xý_ÕÿömVÿË—YýoÞDõŸ}ÿ}Vÿt kÕ×OáÌ XP´*¤æ‘˜àV¿§—æñ ²¤Z)“Ç'ÈxjŸ yjŸ`õsHŽÕÏYAV?*¥Qý¨´np ‡Õˆï,ÜJÍb€¡^¤~@q9Y àa¬~€×¡úAÍOe10 j %xMÀª€š U!%¤wo£Œú:Õ¯ð’^ÃE±D÷N^áØ½—#?@5A5A5A5A5A5A×ÛÝe¢© ?àn©ŸöD Í&€:¨õ<ê ÖýuŽî§j½Ÿ:¨u?uPëyÕA­ý8?®¨âlÇ)_Φ°_j˜`b[ì†+‚Ø©Š †ª"H¸"È[¸"¨y­ªja)\ÍÀêžTEpz ÀÆ‹Ønˆ ÄŒJ“ˆ ”H¾„0duímôÓè‰ô4z"S†Çën†ç¾‰øôz=­žOàzÊýúVî×·r¿ Üàž/À=c$€{ª4ÉPæ…ð’O$€Í ÀîÔwïDŒšž5†¼&`U@MЪçR÷ãó3´Œ /à¦Ç'àiô<1µqDÔÒÙý’WEÁ±?‹‚ë1p"€šD5‰jÔ $¨H89Q[:“áÛoONHé àÊîR~Ï…€;x(»ƒˆ²;|(»ÃˆríªR‚3fyq‹G)²fâQЬ™x”"k"¥Èš‡G)²¦ãQЬÉx”"k.?ýä õð¡ ÀhÃ&›íLÒ3F1_rxçÏã`ØÎáð‰õ€·oãš_ØŽ Ja›)¦Àɉ@ L“ÿÕuÊ @q&Œý¬ª!4@J+¨ÀcˤÂíÌÿJ V•à<ÞêÔóylŸÇcø<™2qDïç± |?[`>¿-4Ÿ—tDjr9Ü ¤ [b3±nÄÜ` Dà!"8€áíÛHHP  €‡>9‰˜¦)È£X™D«Î ÷"É]‹az”¬’Ì}}HR²¥J”ÿa A%¸Ž¥$€(û'MQ ÷OÆ êœÊí0¹÷CÊ¿{'Ùîa÷¨AjÊļõ`ú¦@.Ôd ä"@E‚)‹5™9‰ÔÄa/>>7,Ùd¸w2¶D àÞI×c"Ü;É´÷1Íc ¨Ü@ ¸¡,5tiþ›nBÊàˆÕØ” ¬÷ à:©½ÒHù³@S9-+±%¶ Äâ:¤¤@\1DSG-«kW8?Wáë]*×OÃ'R! Îi×Ç?ÔÝ´.ˆÞŽo¨B@Ó*D@>–XUÛk о*yÕ9}Þïªbÿ7GƸ<†y£c‘eP@``î^:9ñ€$ÐIÂthX#Èjç8¹Z¢YíFV;G‘ÕnË'«Cç×læùÝE"o ]jÜÁÅq³aªs ˜ Vä<°ƒ“Ÿ4OÝÕ8]=;zÙ®{:¶š9<²Ç¨™Ã³q {:6Ïg+$;¥æ]ø ‘rð™|¦~µ¿©ã¢HÛZ]Q¨k !Te_˜Êq«ÖȮњF«·¿ûŽ«6 ù¤×уro~œüH¹Î?¯óÍã4>vîî¬#Ðêxƒñãp¾«ŸôBæS~ßölêÏ¡èÕ:¼|Iõ³,ЃÔUN/ª?S`Ò‚”¦ñ®UÕ¸À’¤‡) ˜+Iýù"€¦?‹uþyo^ç£×ùëe>zg¼A§c{…>-Ú8Ÿ'cȤwÕ{ÿ•˜´P¹Çà™lÀ±Å¬p ±ÉêòðGåJaYý¢{MåÿlgÝÓ±5"AMѳ#šè~åOF&@¬÷óêV?§ÅsF„£¤ÄEv‡ Ñ%[+4ÌÈ-* <£Ý]Pý×°ú¹€³ÕAϹ–‹Óc-W¯Õk¹c-r¬åB޵܏ßêwOä|>@6Ñýˆ&*¯0*˜†"€ZÞbôdª_¨E@öòª¢]t-@^0ÖÑô/ÃõŠ=p]þÕ+Ï~%4úF]}£®5Ѝ«C£kÔÕ¡Ñ<êêÐhuuhtŽº:´ÿàÓœäÄ!i³ šèqêÏÞ# ~ÐSÀ±˜%ðîψW7ìRùü޳÷ºú3âªêP©Ñõëª?†êø£ô¤ú½Üª&?Û\bwçU@‚¡îÎÓS< ¯ÜÎGl¢­"yëP?“$žåßG€l& ª^¿²¬8×"éö‹K¸{Z÷7êò>³ Xå~}+÷G,±»óŠÓMÇöõ]­»@e´ÿ‰n—‘–Ñ—úû(m†‹—j¨øèF—ÙêâÔ/>­Æñv£´G ô@êï£ÀÕ9±7d°ñgQ°ä騛ÓNÇŽ].qÉöysh^à‚¥¾—^fÞwž³úù—¬’ ˜ŽÙ (Ëä z™uiܺºÛdXý¤«ŠÁ˜h úüÙ@SЇ1ú~c´ üÆhøÑ+{ MÇÞŒ£ðG#á—ã<{q'0S@3—c,øö6ó¾Îíãc~{Áö.ºn`&@¤@&@ö v*_€O» ÐuM€ãc~£±@:b+@lZòtìÍY§cÇò(v «fT…w '¢ŸÑ_äß> üâ"¶MMcxÆ V'€¶¢§#`IÓ±7gŽ-h4ñü ú,@—ÕXŽÁ1DU2I±>ô×¢ÛjðÞZ  úsS°¢ŒMSˆî ذä騛³NÇæãº+zŠ^ 9;uQåÕ ÈE€‚¤~ÀèSl;ºê7ú@5Eõ‹¹¯5R€ võ“l 4ùùÃÆ‚Ó±wgŸŽ`&y™³ »ÕÀìÓ{ºwŸÜ=>·4Ä–@ª½ª?¦–¦vøéäüE'0þšÚÊ©[¹ÿã5ttQCCCÃ5Þ_c¾ó]œVþê ’ß½ã~Õ«¾þšòjº ¢Úç¡ÔË"‘*æðw†·”üé ’¿úŠ^%)õÓG! ~@œ“_}5YÎërtûïëñ_†rh]÷ý{î=òñP?}JP2VC@È\ «AC†úYk°ŸkC£AÇ¿}ËV P`Ž×û² Çoþ+@}¿¾‚s( ÊP?B à:®¤Žÿð ]àx€uK€Ëâ™\ ÞàBá&[„MX‚9 ðåQÕGÍ’rм$€úYÍ ¿OCÕhEì24bLìçttŒþæñŠÍþý÷”o•À%©@Ž0°Ìf&r2G,¸ó–#||]”jqÄÑ1v?î«]?[[êäU­[æ«Ø‘¸c$ª§&»"8Á`ë†ļE>¼K|+Þ¿d Ëä¿h°H­ ãµÁrÔÝÿ_íí«qT=F£‰@ظ–gn]-@×å){T.©á©§¿½‚§–òøeä/8ëE(9eË3÷ò¢´UÞÙÁS>|ˆoQ@V`^ ,ÛÀ‡E€í+‹núä5Ù¹­ZnCíjhÇ6Z/5 xs9þáC–77³°³“ý–Nó«=ªQ//ä©›[[È‹Ú-øß‘^+¸¡w^°ÜZÀ«Wb„_¦- €_¼£Ôþé‡Ð’øm§žÃnz޹b6Õ?gë%ަ\ê,óáL¼lÂÁòi^ Xá‘P5Å~æƒØóI='z.õ¬Ð ØÜt7™íÀìð=‰ÚÁΜÀ“¬…Sd¬CΠ–Y°38+x¾´eÁ±…‰ÓSuüð{§ {ÞÜäào“`>DƒùšêwCP§UeOsyõêðE~e]™Æ,²üö<#ÐÜDÙsSçx1€£ ½þÁ•|àù ¤€M)àùóS ¾pÔN&ÕÏÎA-A$ä8csqPí @lœžP;CþRý‡‡ÊfÈ 4Oã||qÁÇhiê?—&T?ðœóB<º–ÊÓ˜’•ˆª *‘U´Úñ²+gyˆô†@,@£0=ú¦¶@ý’hòù!¤þ‹ @êÇh4@êÇØ°yßï ëj²âõ¤g!€-þ¢0Ø`À…V$oœv;›pn´X?ðšPxWýøµúÙtzª&¡+­~6YýW ¾\C?n³úæÇ‡(yAˆÛ²¾!¡:h“&§Cã´5JÓñ £ãeÄElÖÓbæõc=ïXè™-G— ¨³$êÜÆ:•-º€P kÅô÷õÇë\Œ‹HÖf’YCšš?âöBIgMs!H€ßýÊÇ7ÏÓµûR-€§áå™ ¤¾³³¿×Á7ÏÈ1[­T*ò"˜¼ãìÐTs=¿Bê‰j×\—ú5oDê×¼©m€ldŠ¢@ýxbP©ÀGé©y%ýàzøP†êù¡ ÕósCPײóÇd8l·"ƒY€Ú*P§’}qˆ ·­‚››*jÃå4E€V¬©ØšRÞ-r3P\†«?R šhÞËf÷4á\ ’›)'ÓÓ)»ížr,[;“ z@9Ø}”kÀ è,èIý×Xz°ˆÀÁOÊ @,úÐIļè¼~‹HRëÕç˜}Q^O31bƒÀ²g=˜q®t޽N Ä磰L `™Àrˆïð˜¸Â-K¯4'fr2³ „ )ß/l¶ó[¿ŠÈåÈ\@V’]*9|ßJGcˆˆÉ[‚Áy3®D8ËØ’ƒ»Fˆ“^HXvßæ(2\ŒØQbØ H ÀîàØÊ¥De± $L`‘ dáF6®C¬u«îj.MªÈ—çç”ÕL~r2% ²à ñ’å8 m@§!@YvóTù. –8ÇhÞϞݸSEDL€«2qÉE€n¯ˆ³!­~S ²Åƒ6F<‹äкLÐZÄÙ’ý°àðІožj຋€¼<ÇÄ"`c£Êr#/˜31´ï,a‰G>¨½ÐÙk|ÔHW£Ø÷¾\þÊÁ¯iíÌÓ´nÌàô`©>Àâù×kù¿(rŒ¡ÅÛôQ® Í™|ê(× [™¬ F9€O]µå²Ð5ƒY†?²ˆ¡‡‰™&/âðaý dÌæèmÇ[€®0ºáµ¡¹Ù«c˜kÄÅ:†¿µ¨£¤ëÓf7<¦ç£€CûåU¬úJorC¼sùê8¢ú³Õ þ:ò¬}u¸†küÜc'«%ÀÐt‚Ûª ÍߨÐp³Ð¨qrÃûýn‚ãÜ4 #Ç_wtØŠñÝ5–qµØo‹íب˜;žû1Ò4P;.WdÍâ”ÐMÙ;‚G¾ûŸåàð·Ø¦ùºƒ‘Ù3÷áTõ;¸R?Øঀ"s°–Á¾‘}ü˜³ÇÉggÝPåY¯?„ëw,ÀÐóO¼>Õɺ¤ÕOùŠšÒÒ%ÀUÍ…aÞ£ úíjš¥+êyPp‘¡~®Výömn X8wÍõàYå.òø—|<öp¿Ža[¹­m½~‰Ø#õ_ÛãáçË#†ÓþAHCîc}eTo!E“WPSWBØFã 2ú|~$B”¦6ruîn•k|ÝÌåÅ €EÙâÝ4®ÿø¼ŸÍ¤±±´_FIý×]ˆCϧ°q‹€7lµÃÂ"\•Ma *pM+ààÀNàˆP=˜²8=ÅóƵ󼻋©VbS0L‰(½*Kãå8ËÏ{aõtLq>~sÇG_+ËÝã/.1ú™ê'zŽïÞïäç«)¦?ì礕ÿøh•/nmt-v´ ôÈ…‰ù«V(÷ðPùø€ à:HO··_¼€|ÍPª~pQä¦T„›åêlmxÞÑõðhi¡,€ßÏéùîΧ¼µÅB@ò(ÿGo”Š— Ø~ç¨Ñ »‚‘±A¨õGâÌè.³–ç©tgÎf9;&@|7©¨K¿z?}€ê„ ¼oGÎ@··‘jaÝâõ0M²f'ÕûMÿø—þ%BæÔŸ àÃ'&ˆ*3µÞ6d Ó}ßÉ©K€ü¡ö¢­…ÌÎ×PE0ª_m‚ÝÃàÜ?eCÐÄ–Å -óŒO#,ŸÞ êt¡”ß·î‡òTf÷ÿË©ëSÿdt˜7 Pàîvv644444,ºî§hXêD­UÁÓ¹§Û?$ߨMS½ŒMê–ÕúšÁ\+ØÜd³™¼òÓSO ãþ:¬*ÁÝ%ïï rÙƒN&QõŒNp¯ü "¸Ï”Dð|ÁÆŸ[Vü²¬ÈõúuPŸz¯F qgÇûA«Ÿàùó{ªþŒ:Ë¿&IÔqJu*GŽÈ'…˲µåñºseôxlÅõ³×ñP\<¢—^Ä¥_Ž£éø8yÞ»Ë,»£šàâÏKzØ„»N€k Pý±)?ßê_dÁ„ªÞ!u3„e˜Ëè/£/ÎÅâ·ø,ÑêÐ¥÷l#7‡w»ÏòQ1%–S€T‰x¨@ˆT¿§½G à—H€m«+ÇhS|ÚÑÀµë×qt+>žrŒC½„-¸«ê—µDè‰ëK+¡ƒˆ¥*¨|ÞÕwçS¾_gãÎ &š§Z2Ô€e†2°}Ò˜Z1Rq4e.kË5 eÇ , |Ö;dã¯E(„àb_uˬXö<`ÂA—ƒZhV3[­®i çíNÆžÝÒÿð\€$¯Mn‡•”u=ÆÑsÀæ(ųÉë/¨ßkþäè A _¢1‘îÌáQ@“•ƒÛc´…„Qò/› åâõ^Õþ¬ÄðW6¿ŒiE…ãW#êõ«(ºúEbÊà—1­h–CUÛˆJp“¸5pÈ5“ Ê6ŸÜ²9ä–Í%·ÜSÏ-ÿe^÷GÏ™›EÔ ä™y›£úè9a¯<¹ÅñÁ);,ÔºuÕÐÐÐÐÐÐ0„YúôÕ70é˜<бáÖáÁƒ8c¸Û§_—hp'AÖ[Üz Å¬‰n—0öö¯ Ò°¨^@ tWù©ÑtÙ™ÂeÙAÖ\/È«÷Öà°Ú?n™††«…ýp5‘úE7^‘®Fö€û_¿n¸%XØ‚1D,ªüöm#À­A%€\ÀZô Æ ï Ne!j÷Ñ,ÎQ=–جÔE£*ê"TuÑ©ºy€ÕTcÌ—°â/¯1æþuѪ•7£=xÀÚ——WstPÉu.ÒÞ^vk_ fúÄãgƒ{[ú÷»!ž2ÕÿÛߊT¿âWPýZ´[ê?=øîïßëý©þᄌ¢ú¯-ˆê¿Ž¨`õ§¥ä w8õjüò%£vסµ³Ø¹ßIëµ3¹ò3ÿçoÖî€ “$ºj¿ì‘ÖVV皣!gI ®(û¨<-úk<âƒhzr?)@YSÿ®&÷ýå_zý käMjx¯«ºÕðÕKD6pÝéä5·ÅU»ˆ³Á­Á¡‡xÔþÖª0÷¿2‡ ¤ßþ¤tÿªH˜ aèäÈ8=ÅlRxSðñ£ €0qè)Ðiæ<®Âõ +Ø=/ˆ=(íX‰úéÄò?þvrи¿Ÿ+±ü¿PÁ"à0Cj<Ãæ3;Ü w¯³ðx .$ç€:,›…€»ëY8B ‡a!àÐÝW…€ 0Z@Æ hp@»‡ h °’B@Š72Ü·)õç_÷]JýùWjÜ·9/¢Ší°ÊmõQ#H€¬ðg ]B1ÐA8 ðñ$ÀÓk§×(¸N—ôdžh*An€§èü¿(8"Çù1Ä<î'޵–2FtÃÐó«*×ë™zÓìôš”MÊ&ÀFô®ß'Ç|Šy¾ÿJ(]À:PµŽsö:ÁV}ôèS(†î¬ÕsnhhX>Rl)—?zþ\±—a5‘Ì×a]œÛ…_<¿2¬~–ó VÝŠšh©ùöÛu¿_~Cu«®vÚQZìí±|Ôñt›Th Ø C¾Üõ#ýgAS— ¬Ëþix¤PW±+«Ê…eùýí·''7Gµè—Ñ­lxÎx½<ã`ëÇc°k(ØÙ9¿Ú Ôn ¶ƒjw ˆïïæôôä¤fÚ xò¨)°¿ÙØÚ‚ì ¾| ÙpF%öCù ôtr‚î,¨“¶¦÷µþŸ~Ÿ<ÙÙaE† ;œ)ìðÙùÉŠ[ üqkëÇa~üT@î‘Jß¼aÜe~ƒ¸cˆÍV°L«Ð®|qeÅ{÷Øîƒ€‚" G@Ž€ ÀP¬Ë"gø›ÿï—˜ŽnäVœûkÕ¹iGÄŒþ @íüE[7-? (°¿ €oªÞEÀ¼V`’Bù.–‘¦QÆñ±s»ºÈ] f¾¬7v‡_ Q o9p¾Bg3¯žž²y—€À->·÷iüU5„ò©~½o $9ªÂ«B©ËHSÊ|^ i¹ÐÌ#ó›gœG—‹2|€(Ûà¿H n±¶ €aQ§›Á^›j77a¦m5êóº@òˆ±LŠG€o* -ØÙ¡€úÑ]´·¢3ÌST…W…J’AÊ$þöìôT-áÌäîî²µ—‰~~¾»Ë–!ʧ§»»|Dʯ^íîráEÊq…y`w—±5E€o¾a Äi°¨P$WËŠ"YC(q溋NOaüéüøãé)kôö÷÷ö¨xõý¿yCÅ+ 䊀èÌëjˆ—ZzW6œÿI€8¾¨mÝ3–ʶ”m(ÛP¶pÀe*ˆfÉÁyü,€W·H« ]½BSGà·¿õ€*¨fßu€Dòs‹ŠWþã(!Æãh^¼ÀK‹´`ý\í{ý:Ê‘ ¦uUâñÏžeùäd†vI#äH– Y^€Õ“ùÉ ,/`Úç©Ë¿;4Ê´É9?ÀÉ/°ìèšËhèʵ»vèø®<€ºØy½] ÿ]@ª* Ä×ߘÍ\ui\ªß úMª?Úup« V<R@êæžÝü¼ly1®Þ<¿1î~\†¿õø› @ö\ ž£t×øqÉ5Ch¹äJø†††EàØœë~’†)Q»f•íõKõl˜m¸Z3hHÎCcÃì<ðZÈô¼–/ëhìÑŒ1°ƒ%:‡x ù‡µp6¡…ãþµ¦ëýëNù[‚¡µx‡äÚðst„ýu6Ï´¨µ€Ú’è‰"@žÈU=Îãí‰þ•Pï9´øâ¼¿µfQ÷ÏóLÕÂÔjj­%T¯¾Žs$ßy¯þiL}pS±×¸ŸEf4bÇ$®ûgÇñ1Î÷ ¯:•‹6ÀûݶO<|õ»ª3nû²oS`ÙXnP÷Ïú4¹÷rs3÷Vn@F33 ææºzø»Èuñë;ˆåªIŒÄ¶‰=:òxÀË»¯^Aöˆ¢:Y[«yÏó,[›Û²£ß³×ï ^܌Ɩ€)ŸXêJ¤Œ ƒ'°/! ÷ÿ»m}v¨Q!¢¾Jæ.˜íü¿½íå_¸…\ïüDˆ>À­$}:ÚÒr)ýAÏ–A³3Vâ´jÀÇ ­2ôüœ-é_ðð!{<óóbUœœ°e}¾2j÷L8àbÀûA€L¨Ý3çHË$€ ´$T/µÆ£ÈSùjÀ¯µy¯× ~Ê-‹V[øÎ^HS¥þÚ¹3ëÓ;ÿ;^¸úÙsþÇwÌÿøŽùß1ÿÏžÀ¨ªmAäj¥ò8@í‡#èå®Z ÎP ”‚QD%P²‚–…Y’#è ôLÄ‘¦Ö[kÈ#ïDõ/„Ä|w‚$Àk(\;(ðò¥öÏG@Á¢E‹voz&IkЈ«óä°ím5$ÉÉ»¸€ú/.Ô ýHOTþLH>¨– vÉjPwó’ÕÏd´úI«Ÿaõó%Ðw/`fwáÇÁûOžXý¤Ô¯ÉºóQÀëðå.ÞݩԠњ_ä˜}¤ºWñ;¯…Çv€<+“cP…÷g Œ* ª‚’Q´½\tøš €©0±vMÊyL[¤å¶Ñ˜/Mg#@wÌá [OÝÛËŽó„þ?‚3×èpBÿÓ§yB•sü{ó{ݰ_5,YîO§ñ³ k´EªXlbcžMÕ<ª_ ØÀÖª_p; àvàVÖÊ8tÐñõù?ÖñZð­ÆÌ)ÐB‚Qû¯g=[ô'úûÇ«¬Ð^—‹²šþ[X¡”1YFСo¾ (Õëuez4ø^NOou–&¤ÐÜ0ûñ{{ðÍÊ^o•k»„§‚õµ3 ˯^}ó Šï¾ë Éã(‹«?ÏÜ!HXXý¦@,òõ©òXd¹_eRÀ½‘_}…ꫯFbÀÐíÎý׳ß•«*#k¡Ž²,wZ¯7$gp’ ç*@vœ=Œ)xò„N/þH*{±HT±Í_Þ ûuG†PDE¦ØÎŽÊ|JOžHæ¢6€ãU+ÀÌ\‚ E/^ÈP­A+½RœÌ<íjTí¿®†Ž¯ríÏ2òJîÜÉ7ˆ%’ZÍrwUhí ÊòæfÝ_Õ¡µ%8î%ÁŸ?ß-p§W¾,¨½…l¡úR›êjï g@Pýª,’ªÚÂýƒú¯@Lò‰ù¬Œµhȱ' ÄZ6ŽuTÈqZøìz/yZpµñ =ÒTWPàf å6%¸BðKdǦܘ jK,Kýùz¿úÃ=KÁ¾¿ÔÍãµüùR?e)ÔçKýœÒ¬óÕç®ãû+JP»ëÙ$À/Fœ$€}Àí "@¶nw%|?Àíª$€g à›À˜SýêƒÎ Ð% º!­àׯ­~lãøLôZEhTŒ®·¹™X øòeVø“'UÎç?y’ ðòe&ÀË—™/_fèø~`˜¨òé\)૯8m[xóŽ pp€óM>µ lp`Z$d€1óMoðxËtý üós|®AçÞôèHh‚Ñ‘ÉîLšPç*4Î_Ç~[V_B.Ø'ŽûñzrOdÂ3‡÷õJݧ<Þû)?}ªëëü,¿z%“Îã_½ÊEÀ«W¹ðñãb‚T'¸.·P×ÿȵ;‚Ú_ÔZkªs k­§š,+õã³AÅ" ;YQ,§K¥uòbËéÙžŸ_kõøzÿ:Q£î¯/(úúy„O½_e;4$LÕ@ù? FòTÀry, ° €vŠH…Rp¿H…N×óæÞÁÚûX÷Sù×ê§Jr+_ ]ÊMFžl] ÐÈQ{®jÀ…z|½=¾î«…ô^¯Êu‰£ºâÆäõw<¼œÐœ*GÑÀ"üíŒ"ü Põ‘þÖ=âÊ¢uôRoP÷»¸~¥F€é  ný²ô÷/F@ÄkÈëWÝàúUÇ´~¥ ýª[^¿±›¿Š+¬ßº¢ˆÞ]¿rAÑ+Õ2­–AuL`=¾ _å¡–ÀEåZD,z½„I5..ÎÎ"¬J †¹ñ•¸õÑ?üðùs$ÀçÏ,n•jÈx‘#..ZBøðÁý~Wg.ì¸uV°ÑpÿДßPÑ-óòÌØXf²q†í‡ú/¨r”­ÉëJvêÕãk™_}M¥Ž`<­þûÕç]O}ïçõoˆêÓ ÏªQÇò:™}¨ÃQò¼Šú<Ýw7š¡]'.—¡¹Þª& «#bêRµÞ[²êsÔãk5°úììR€ê‡¯¢&¬¾ç­K"uß//T!Êjúñº@µw³¶t ¤òV¬÷Ó{ÐóÔñZfr°­Ì Õá18©! Ö[¹×/tpõ™xÙ¸ç#’œÕŸëݵs©ÏVÁØÛ˜gßb2ÅÖV l(G ‰€'!L€ü¼Ý€ùý˜Ü~žÉN#z3 ÀíT?žÆ¨íP­þííH€~ØÞþá Ž*†ú1þÂé³×7ßèøë1RuÔ ‘qQ!;;8Þˆhž ä¬Ä€]gomùü/ð@~á:·_'{Öã¡þOŸL¿m{"aý¼ÞÂëéêûýðÃÅÅ?(ÁÕ˜ 0Y®÷¯Bjz@ý~² €gÙÚÿ<{{x?6»óq¿8#ßCFÈŒü¿µe 0™xU¾ ‹·‘Í”Ú=~ˆ>@vPß§Z˜ú¼&€š\òû6¹Ýë Éq|=ŒL€züÎäHÈ"À× óùqP?ºÝù'°†G‰%2<:ìasrò?²ÞIÈäÓK+“§ÛP“>€‚88¸#Ûæµxë ççµÓ§ç­ïŸg¸ŒÎé3þzÝû×XòGRp=_mº+ÆDN¸_ukCJvÊÜ},9:ULNr^Gø|]#*\½6õøXFsxŠú˜ŒuHZ¹‚DÈãúže¾”sq±³Û>³È5qbþÎrÝï2Z÷ƒ` žïaé0åR?A™ (€Ö¾ê­A±8>¢öçWĹ|‘òÄ• ‡‡XêEùÉNÏ£Gõ Ù ¤äz<ò?‹Ø _ÑX.ÞÀÎT‚ùyŸ?×ób·Ûêsw5“[IÎxäñz››¹sÉN2ØF·½ý<@çÇôˆ“ó²úiâó€”;Ÿ5‰ç7Ò½¯XšyôüŸ>YýØŽ«=“^\f¹Ÿ¼†Nƒ ÙïϯQ®2ºÇççA4(BkV ©2Ž"˜ž—*àó’ê´™ŽÊÕ"€®/h&ÀÖ–”~þé( h9d©^Ê~ϳ¤ñÏÏ#ðú‘>1ÿã;`ÔhL¥Çþ|-ñíÆ ªD&/‰4±Z@c`˜?µª´ÏCu=' ŽV÷´ìFpÒµŽçiQÑõHé¼¢F%ž ÈÏë÷sÝÝ&wèú¶ Y¡å13Tuµ‹«1@”@€ÜR P¥Dz°`!P Âñ8±èjA3ì9¨ÛðQ  ž/Q™0¾4^-߯>OOÀÈz®d ŒÏkĆÏjÒ8èzRp½~ÝïZKëÚ¤ããt.å“ÀýÿHŸ¾çñ‚èuj[ž•K€èŽ#€ä<"¦› õüÚ”e¼^—ñy*&;•`"¾ûŸWõdý“ àëÉǮׯûk5°¶êx«Ò ããqÏÃúÆòñS 6ÍVÔ!Q5AëùÕ믄¨Ç/‹~^Z)d¢úc’O&pWÎóªXw)NÙ3t½qས'€ä[N€ê”.JMßðÀ¸ d®»¨Öd˜B3 ¡á ³¬ŒLLyhÍÌAåì&Þñ»ï²¬æ‘† YjÓlߪY\ñ’Û“šbã@ß)Îýëv'wûûsShî> è—™#âù ÀÍ­(t‹ ž#L*•'—ÁÝþêZæjžœänw|æÜ è›F9õƒúE©ÿžS@q,5U#+üñcŒ ‹PZ€‚cS,,Q Û_]ûßkÿ|íï¯ýáP?¦›`£ÿ÷öޝOjîìÀÄ<Ï‹| Õƒ~¢€†JÞc \\ wŽ€Œö*ĸÔ~DðC4?ÉîŽePƒ5râ´d¶º¬óG#R:ã jwoíg³‹f¿‹0ÃÆçÁñ±;–¦Ñ9rIVÔîÂjª‚"o+rŽvÿ;$ñÏ0b¸—‚†Ê`*bS*ìR|Î6@£³3ì¿Çà@aK™PlÞ¿µ…G丠šó}•Ýþw»€(‚FÿÖþpOrÍ_,WìÐFùyhöíP¾çƒ¤ª0:m¹¿å?üÊPb.³5£‘%;vé¨~tï¸ÿ=VA9"€šBÔ?î† ®PûâÅñEôëcÿ9:\=‚—\²€‹°%÷ØÐjøVwaîï&Ô¹Õ“?âx¨9ˆ8>ö"HrᲩå‰@ßžûßIwΘؿ·g@ŽÝÉMW{sÿùùù£GÚ øl¯u…ïq=€ªï@å~— »ÖG€­-¯…mwWrþ=»^HÏ—uÿ|%7ª)pÜRJÑ }ú„NßÜ÷c\c”1Î$ñí·ó®pÇA¥CÕʱ™Š)!Ôþe¨žÀ‘ÇÇP}\¯KMôPÈ–Ø?ßíï‡ÚÝÌUÅvXÅÍ¥ú vGÁ@î\Âñ››<ž>€ /»˜}€{\™ÝþâìÎJ_S°Ç@ýó]ÔþðØ›ÕG€x<÷7ô`$ÏB€<&¯{½¾þ÷Ø?dtûÃóóU'°ŸÀîñ÷Þ \” É`‘¼Ú$™®( dhšƒ'zL&@CÛÝßÐÐPðÛ+Xþî –ß_Á²ÃR¹o§{ü_\Ár U»ñ›+XÎ1žV ©^¿R½~¥JýJõú•êõûþ=í¿Žÿ‹¿`C¡(ðÕW$Œ(ð›ß0Jš(€ê9pk(0ß*âw1çc;æ|lÇœŒí˜ó±s>¶¡~J¤ÔO™€úu4(õS&Ÿí–P€κŸbµÈëDÊ˳\ãGäu#5‚ƒÛlb£¶¡~ídS¡ævq›+5p¢¶ÙBCìfVEÊÁG ´—LC>~|{Q ®º¦•ã”p5Τ:T­ÿÕ¯˜ŠŠä¦ý–ÿP>ýRE!ÊUþ3\. À¿¥µÌ”‰uí¢þ8)”¨C^§…½ã>7£®§îOž„ ®Aý‘\= «ß#:ù›ƒoŒsªœûmb!P—Þuî·ˆ…€s¿-@,œûmb!àÜ?µÀm]1)]Æ”A©óÕ4¹½ª?/Š3ú5p¶ÏƒpLáøÌت÷ÎŽ"‹’ oP_9ùñã—/mÞð¢ÏŸÇ0Ø}Ϫü½Y>‘Â_Û `ú+¼µ½Y¥¡¬ß•ù?z²¤ªÂ[OE±Oeؕô$+P‹˜0óÌ <ÑPí³ÔâI*…’¼Î²öÇåíðQhXž£‰z´yRÝ£GyÚèÎN`cà­õ¢2¬ýϼÌz«ö`;•…@V­Ví°8µ°]Pub>H6@ò»¸Ôo\â…Iˆim@n6€ÉU×7Ë£ .ƒp "/þ °™G@õ€ An `C[Ød»ÄôpK€'õ“ÈlòÜG6¹eCß› A^Í™ AS{yuó.pŒ¦¦\¹?‰‘'FÒ²•µÇ’¦±õîý0â³ëøqàõs™H¾­Õ9R ÿ‰c[ )`Ķ@S ¾q=Þm¦SÑð™±-ЦlªIا‚<5eTÌP¤Vñ}E阠±5ÝÓyº·š‹:ßWÏî}Å€#&8ˆ åú´u"NB7™w´7Àk”òWI_ç6`œšÄB–¤ íÂÆfº^ßÝk«âÂtœíƒ4 Wd=P<¾9ž‰ŠçrSŒB( ®–¤UåÏKðbKŠ÷ ¹~ ÜÙþÀiÔ¦ˆõs‚gJVÌ¢~ùõãÔß§OóÓoW?~Ÿ=³úYϰúùRV?~1¾SêçˆÈ©’´¡¡áV!δB8.ür­â/gg˜'0Ëd­¼JWuúøbtïõ#†àa@>¯ûÙV\Ÿöå¤úqê§¥€T?=j%kÙ# ¥pnçŪ»KKLûÄËzº`6HíãVú’Úó‡ñÚÇ-U±ŒA¦y2mß^‘‹€º´„RBUHàéÓÿí25¹U`-¨ÆlÚį¯=i$@ AÓwîtÏð¢à¤`š'¯QÖºé‘÷Æu »Áq¯JäŽö‡£×¤úÊ韩¼\ÈÞA‰œòêw„é8` ›€xŸMÀ2±ælPÔ5üt¤ä¢Í"%kÐéS*~8ûwÝÙ@åq0è>޹û{Œºà9[úý1ÕsgUaµŠ¶=†z?º{jdÍh hñd\N÷ºÞùÙ°ï"flEl¤@õÙSûµŸ=mÈëÉêýWK(]ƒ*Å~¼–Oj--þV}]6ìó7ܤæf2*"¹o·M€ñ¼w‰ŽÛ|^bõóy÷üP£åÙȳ æj¶èóTvÁÄýwëÿš‚/_D€/_¦ãV{ïÕÞ.mìùúUøúé7oDºÓ¶?õÿb»Tþûo¥µê3 >¯%ÃZ4C£"ýîÀU¨ôFè³¶9b· ¿_X×ÿDíF}þŒÜ®&@ vMñç¹…á@Þg ~èãǦ@ËÁ-þ¸û~C@ìÆóç­Ì(ÚÕ©=ž»ñâÄn g\•žûß{L£¸ô4ŠÌ‘~‡_¿þ_Àë×ÚŪ=­»qzztóst¤MNÚê±ëiî߱ƫáØk„•îCfqøN°é}ü}9U›Íöör8û½=w—ÏÏ‘Þr3˜*ñƒ¹`ªÄæb;”ÄWp¨ ?j:%*ntLÀl LDZÄÉaã“?Òðl ŸG¿Þâg¿ÞŽã@€ÅBâÇX j‡òƒZ¿Æ?üÓG0±î¢ˆ* šÖï²±æ=nËñp?°Ÿ~Mcƒü¯&ä#@xMƒí?F ï:¿Ü÷sœÁyp[„®‡ï›#@5ï<¦4À} @îöîïW#°FX™ïVG#phæ^ÑNÀÖóÈFà<63‡˜6ã^a‰ÿZF (Àl3«? Ð,‹BâDNRò§Iü €D5˜ü©?v}ž»Æ%~Nî? pR—@‰á€¡ÿ:¨‹*MS vó´w^ðfSEUÊ RLR€å` Ô^w Ó ¬½´ ÁyuàÙ3î‰0û ðü9§E€_åÄ–pp@?"Àï¿sK¦®-šN£ö˜ˆU prÂy}àõkˆÝÀˆH€Å‚ëD€—/!vàã{N؈ë¬Ú­Û¹¡œ8ÈF`u\7›÷2ç÷Õ½ÍÑ¿!GW>L¶Òó*‹uß­Zí×EµŸ[­äš®*¯Þ—#1?ï5p@]ÐQÃÏ_/x2wñʟ니r¢ðD X  F#7rŸ Bp°ÂŒ@6G`'ŠЮ\/bÝ| (Ûud´Õßw-`èòG£•eª~U^a2\·^]EÕ?–¦êgS0v¿ºª.ª £¸¤LâgŒ#R`CD†CßÕ¨„Z_ådêÐwí\«[u[uVí×YµAçºNMìÖY…³êÌÚ/×.oßÖûªý:³6`¬œµBµ_gÕUû—ç÷^Á»¾˜#@»¸Wh4𯛀Â=¹q!Øp5ÐnpyÉoZý}œÇ´_œ¹ç8ØO§my¦m`£Æ~ð–ê ±½pÖ2EÝÿçG¤/.ÎÎ.../qt¢ÊÔªÛ˜Ç:¡—©Ò6æòg.‡æ÷}ú¡âˆô›7ZÅÙBääòòðGåÏ+ýÃÃÖ(¯¢—9¤ã"L³W»'O µ‘¸ŠûÕqÁë>®(~°£ž(ø¸W/û¾Ë¦%~Æ6„ø½~o‚×÷á â×H!®(~B‚æï‡ÆïüK6Zê>œ:÷Í §kIƒ0PÀ6^xUß—iFˆÀû÷8þû/Än ` ów÷ spŸ'“ÈViìð/Õª­VjÝZ•­Ö/>.Á&ââBcý,ÞáHVŽ96tÛèõ L{ÅÀ½°Ü‹ßtq¡Ô|}?—Œ\^*í&€=<ÛÂÂ6Uu7½%b·-¹žP7‘©Ømã_Ô SÕO' zn¸ KÝ0þ‡\ óècVág£Àµs& vA€ØM¥ï]@Äïj~â8Áz ÛPÕFÚ4ÙF¢·@jsÙÛ7ÿé~Žü‹½ƒ_ƒ±_:$ÀMiÚØ›i®LâJ%¤9êWÎG µo €BÕî_îH†Ú·ˆqD#˜»u€Ü€Î÷óÝ@Š„ còdg=a8Ì勉S’g·ì‰[»þòöj,]2 Ö}êÚö¦‘)@Š9ü¼(•5€¡Ê`¨îK¨¸¼d££ÕiÚÿ&6@]_ýÅ@ºª"1]Õy]OPç-ë*âm\êñǨ/&ðq€^ÙÙ7§+P„WVÿ<[ü¤@ö^ VçéL‹_ð*EEpÀ^Ah”W?>§B8–ñ·OÉÅO*¬+þHZÃk,å:²WG«Æ­«˜«F.³ßuÿþ~D¯#þ'6ªûÒU|,¨>uØö³þƒ܃Kà â't•=e¼J R‘S^Yü8.NsðèêL]ÊŸ]Áõg ¾ŸàÿÝ  G[1ˆ6@Muš¨£¶NO€ˆWhùm€Ñøãú’×dÓùy%ûû´èK#š‡‡hùmàƒ ¤(P‘#l½¼T? ¶ù°ýÝ P®˜Çu›€ï©8ÞBhàíš NOri£§/13ôü¹ìõDf†ÀÈ ¦  x>  ðì à 5Ðyºªß6À‹ z̉âm¾Å ànà&UHv?Oñ“<ÅO 0Úcþ0jˆCȨÄ50Fš*èÄoøátô$0ƒcÀ½22R¢×Öf_?Ï?Ñàv«€Õð»ž=Sä9u=¥”ߺ)îâ Õ(¤0¤~€$¸ ÈéuK0¦ï‘X lÒ Ä°ÄT7÷c70±ˆc'= «Lv…¬(~ÛC¨8U¤°ëÙ œžŠpÙ¨ÊvSx(ó:Kô:+3Ñô™âGZg‹ÞõiR€Å«…"¦òwxF–Îêÿ{@9ç•D¯³ “gˆßù“ àB¥ø•–øcþÖ)A)~ùK|dÉøÈœúÈ’ö‘9ñ‘â÷‘â÷±Ñh4Fc̹pÙ4ݸW˜óà±iºqÏðð!¶+G^/}Ó¨?uYt‡¨ãu2¥ÍÖq:4[Ç´„LivÝeÔÐö®ÊcÈAü6Mï–‡‡¿-A Ø) ÿøZ’¢ÊŠùSݹ+²=Æ‘ær.‰AšÓÈœVFZ‘íå‚c„FÿZB“Ûzÿ½¡€æÛ”Ž3,rn³Pš^rí\]ëgvCÔ}Š_ ”£8‰t]ÒVWüÔGuET\Q„t\q„4ê>ÅO îSü|ÿÑ)p~~£ž¼v M¶*­É_¥¹Ç&À.“åÕ¼;p×›ÂÏc`;{6¼ÃÐb é­þ‘Ð^t¹|QKÄ™µÝäð®€ËÇüþ£#<}¯êÿÝ&ÀÐiu”˜Ã= ]²Ô¼ÕÉ™:™S'gª§ÒX™:`êù;&ÀM ¿ÿÕÿûB€œ®Å[c†Ö-$5gYüq&¨+îk}®+êûï‘øïZü;„ÖÜjÑ…k!¨\i¿=/ fN$@ǧo4CT£k{l0=Ý$"}À‡%vS6?ê’¨q¨ù¨»…+b ¿NNtpåî©©U>,Y\,Dê´é@]„8×íªýÞÚíŠʘ›Œ¿©¿e6½œ6ñï2(õT50™ÎC=Ãûˬ@ð@ @|þääÃ>à:ïø ¹Ý×®§U¥©Ø>*ü¦ÒA·”ÿ¸†’¥Ë<¯¹ô@¼r÷UüõY>Zs¹rn¢®úy«CŸuä-nV”ø#òVP¸lÔbí³3üÕ#w¦CÉFi~±89Y,þ#bÄû¸! @À(Tßg“¦ÇÓ§Èñ* àÀ*Ýì6N[o$¾'O?†ðµÙÖ·ÄŸÝàÁò£öŒ[îx”tâØäùùË—(í‰PÜuì?/ºÎÐïf&€æÞDU7€s&¶„QüôÚ) pîNÀ@LpÜ·7™.@Û,t_u_$x)´°çTá¡Ç{<?J„UH{*Õ­Žš×?VXS°¤ååLâ÷dÅOo(Èö\*`'«¦ö7Iüxߤˆûÿ‡aÌj„ ˆ?À“¯*óL†Z5è€ÂBØdz$4y«g0G¡Õ÷} |"-Ñ“K àûÖU¼"tŸE]cO †~ÀžCM€¨ØXxº[›o³0¤ DUÓ¬&¦§£øYÌÙˆâç—e Ѝö–ç ‰_óf-þ¥îËõîxÛðþÊôIƒ3Oâ—@ŬûT´¾tÀœø©ð‰€ÞØs©E €OÔøD €OÔø¸õ7˜æUÔ+)°K@;ÙbtÞêØ°$mÚæ?}Š”Ûäb PÿŸå&@6À²Ã† ÖÛZ“Øó™õß6€‡Þ˜Ö¾kU!ÖÛ¿b6KFZ£Äú¿Òx^pXpTpQP·“ŸÔðëç´òxâ¦X,`•#Чq|¼â€ùcíe«ÿ‚J€.~LX¸yU#;fX¸¹U£ëÚÏ&ÀµŸM€kl¬î ºÉ¾ @,~ä|9;10ów¹öÓʯo–HpõÓ¨?e’žY§€¬vãÌ ) +€BµÿÞ¼ºöKßÊ¡€2§ljë¥zÊŒ²Eû_8@€PyóJ³ê Ðþ—G *e;hŠç,²áýzfî—–|!¿¢Ç96W8Ö÷Qé À)C0j5ÑÌVÍ¢P#Íî¨ÔXD30×~‘`R e² Àýø¶ÐrØ€óåh|üX¶“Ÿ ˜\¨ïß#Ö¶m€OŸàÆê©èš‰uÊö€G$²±û5}|ŒÜ÷;$$À·ÌÕ÷yˆWõ}•ˆ .0µZ°LâÔJ;›Qp»mœzCé[° ­˜'ˆŒ¬ø¾‰f þ„›2ÉàìÓfèÝA«Ôj¤¥¦ïó?`—$õÆçó(ªï£èmtMÙ`/ ŽäÞ{q$ ÛìÄ‘€l°#¨@Pe`Ö ˆâ«p#¢Å/ $›ëÁÐóçXˆöγû‰`,½¿?}Ÿ€&XJðääJ~«L@ž‡÷5äªó´)àquY^zŸÇÔ dy»ˆtìòÿÜ ä7z0(6žéÞ¶˜ 04¶ƒ,˜+-6*þ¨H€1#0`#bu'PlŒb c¯‹lt­¬Qmb<£µè¡àH½or ¸Ñh46€ôjžíŒ>M¾#¢»u£jÆØ5ìв®MÜ4ÕëãØ}9ïYïòxƒåêÜ)È/™~^ºqsâ¯muù¤e*:G?ÂÛ .zÏÐOZÏ÷ñÿë;—ßÛûóO~˜Þ߇ÃN|Š%Ì.§o‰c#ÂMP@ÂìËÏØ­•…¿-ìâj½çݺίÌ;¥ÔÓã5LJè§QP̹µ 0·of»@ ÓŠÿzjÀo«ñ ˆëiu(›€!6YOY—Ê»9ãwêV_r#LS +ÕZ”u_ô» `/q¼ÏÀ†¥¸ ºf‡˜j­­Î/4þ¨4½®&ß·šuÁ]] çy«#†Ï×&À`iO‰Þ_c( ¹gZŽÃÕä‘¢<ŒP~’xc„LË×à\úັUUTAQ›¸L—'O´™œìüí7m&<¤Jxˆ–TÐfq‰.:Î÷NhàìL~ÑINI›ûû~ŸIGM1b`A ÝKH´ÚÌ.¯ÌÚ¬.*ÔçÙÿ8–á궪Ú-ðû.Y¹ ÀÇÞ£5Æqxøè?"À_ñsEŽbùg’MN#\ä|bÿo0w+SÀÿ,Û€3€§OéÓ\¿$€ïSø‹Í lB`Øû3…N¢Òw4>òíÙGp/€2Bý§ûý¬½½·o£YñøñÙYŒ9â ÃûБ ,+À‘C$ID€Š‘WçöO¸£ÎPà[„銚¯”ÀÈVÈÞß÷û*™5@zU´pd  @º"@}^θEäwŽ,s_ç `q°ŸéàÇÄV¯A¨W¥ñUq™£eß§8þ$‚ÃÚ‘ï®® @"x ›¹’sk °º«qѬ²5áíz¥Ãà}H€ú¾ª!ôÿÌßçr;Ï1Tb|=ÿîŸ÷@}^_myy(ZþãßœNÃùÛ#b?‹ @x]5»"”¥ÌÂluæûl|Îq #”½<ŸY5Òé©]JÄépý„hÅénýü<“ àS]¬Q¶ø LÞ_CIû*L=Oñ¿{Çtž¬æ·Š>G€ àݸ¼’!Ï»¿$‹Ø…ªŽ|ß`žî¤Dˆ,îèß|HÇPÚ–« ðêÕu ñëùÍ`dyäq€¼ŽF ÓŽ=UàñõîPˆñËæÓ}$Ï&ÏLKôQð̧êàŠý¡[`dR¦Áoðü¿ÁÿÝä7`À€ 0`À€ 0`À€ 0`ÀÀ ‹“ú{ d‡KAŠ_ ~ƒßàÿnð0`À€ ønÀl6K™,ý½¿ßv|—ê9ëí•C^9უ±¥ë•ÿuÌø?­Œðie„ˆ/¶Kþ¦² MeAÞªÙ¥,Ç’¿ t3¥›¹úwÛ”E/~ 0`à˜Á†”°¤“Ö@æÈeÝ¥Svóç\yºïƒ éœ+ïH?}änýöÁ†Dä¬©^£+ÿšê5eqY]ºò»¬®Œ²¸Ã]ùÝaGfyè{þ3¤/ëË_Î,‹×¬/¿×œY–r×}ß5&£,î÷¼ú^ïy3Ê2êŒF]ùGјQ–ŠéºòWL¯È(ËçЕÿ@åþŒ²Hïê{þ¥w3;ÿ 0`À€ÔÈ7!囌¾ýƒïúõ×ßÇÞßüßuôwýüÆõoÀ€ 0`À€' Nîï0„Ðø6{bÜc!9îMrçô.øßdw’¸KŽÿ“|Óþ…çØÿÒÆÄA KJŽÝñ»[â~á+:fü·íNìûyìÓ1ãox÷Ý„¸é\pÌøo¨®NŒ¬ªÊ9¿ 0`ÀÀ±„Ùl–"‘ˆI¬¿küýµÀ|ÅŠ 4€üü| èèè ³³€Ã‡+yçÍ›'1û·Þçdûöíttt0eÊ”ïD=/-ðï+c¿‹N‹mz“;öã)o?â åQ/¡ £þ[m±ßÝE±íAWÁ™ÑíïÊë`—¯ÎüNS¬í]èˆUÀyÎΑ×\Ïóuå¯%¤ü5îteûÚ+.R¶_|ým~ùÕÿÆ«#¿ 0sتçTc±X6lùùù 6ŒÂ« ¥„ÙlmH^=@{{;”Ü^Ò÷Yo“‰ðz*/ÓôÇ!ÿ9WÞÁÇü>±~û‚¨þã×~Üó0`À€ 0`À€Bø8£\þÞ±Öï“:¥c;î+ß„t¬9ãùáØ÷·ñÂÚøúñ»>8À´iÓ°R¦KUŽûcu-ˆýè¯{ ¿ø—úûÒ_÷~¾ i×õýÂïÔù7øû.—+åý×ÜÜœÓzø®Ž2`À€ 0`À€>0 N \ ’þW†tרåÁç…r!B¾$!ü7›ÿ#!þÍÈîhºKrÆ/„ÿÅ•‰Ç¿´\>þ?øswüBø?kÖ¬„ø%Ë—°bþüÜTø_\—8­GÍY;xì³Ñ9ãÂÿÊÿ°$Ä_ýÄ?äÙçŒ_ÿ/¿üò„ø Û¶à7.güBø_[[›_æŽ `|¾œð0`À€ ôÌf³4yòd6nÜØ&Ãk0ï«üÖ"ó%K–hÂÕâ5òóóéììdРA>|˜®®.%ï¢E‹N˜úÇÝÓþê•&Û}[½zµ¦þW¯^ À¬Y³úÅ Ç_~sMÝ„Ó`ëQ9üýèzüø”Oor30*þoýR~‡%(lŠFˆÙ%'É¢ÿAWÅÄÿy­@>º@ðŸÇ:Öß{€àÓŸ0õÁ³ù0pç9?VÄÿ‚_bÊpöÍÞøÿû”ÿË( õwò·ÊM^Šî±ñâëosí)âÿ]Û¾§>ü 0`ÀÀ1jæÞSæÏç°µ¢‚Ÿýìgl[½q³ÆÅDâ6¤m«·ÑÞÞÎo½g1ïêêbþ²ùÙØ–/XΘ1cØ·o]]]ryÉÊŠ¦°X, >œ;v¤N¼óGa¹ú(–«Ý¼]ãK>Ð3Sà¢J7p”_Ë`G"wƒí¡¾@Dî΀TÆ Aƒh|´1f¢ÑþÆG3›ý   €²‚2ê¨ë3™³LÞhËlÜa>[°Ïüîp– 9[ßÏ–ôm®!Xù¤Ïüm®!, ’·äo<: xÍry4g´ ”»ÆàgGŸùË]c2#ŽÂýžŸÍÓ÷ëï½ìfuF#»l}¿ÿG‘ùýo6›©žSMÕªª>óWÏIbÔž>?gêpý¨ÜŸ¿ô®Ó}?ÿÒ»Ùÿ¹î3`À€ßÑ㽋«‰D"¬Z&Ë…€Zè›Jؽñq˜|Kr~Oùõâoü»üñ¡äßÇéºz äÚ  —â×9 *”íUËj¥dqÓ¦M`„ L˜0!eºh}ÚQ—xz áp˜H$ÂÝwßÍ´iÓ°Ûc³‘éu¤ºvDøåô[ Dà©Òe»/½ñ¿œÿ¥¼ù· Ð?Õþôwý«ãÿ¾M÷{¿·üjó ±îó/®¿Žo à¤ÄçL®ù£¼â:ì7þc]ÿÇ*<„ðÿž{îá«£ç|e+ÖQ?$??Ÿ}ûöA´¿.—Ff³Y*//Çï÷çf<ψh½í«³±úLˆï)®§2×}ø®ó0`À€ øÖÂ08AJü~$¢lW†ÍÔØ"Üf×ß •ø_Íù?ˆDþÆ›ìÖÝ •ø_Í¿°Þ,ÏX®¿ @*ñ¿šÑ¢E,Y²„yË—ënJü¯9ÿæñÔ|½•ÛÎÚ©» @*ñ¿šÿå{Æqõï¶a{⺛¤ÿ«ù§L™Â† ðmÛ¦» @*ñ¿š¿®®Ž²²2ƹ݆ €z ¢1â0`@Oô·òw‘ßl6KK–,¡¡¡aÆóý0›ÍRÍߺð\òEc/¥c_ÿŸ‡\Âl6KX,±wm±ýþs%òº—2,×(Â¡ŠŠ jkkO¨úJv~ÅûÄŠ+èêêbÑ¢EIß/D:=÷Eð4Hÿ‹¶È† èììdÅŠÌ›7/gæÇñ\]¯ü/BÛÊïó£Gõ~4•08ßïC-›97Güy6yÝ- ¢†‡UÛݵ@oüŽ1a0õÁs”mg–œÞø¿w§oûˆ¼xOlût0 d†"FY ÓÊ{¼ìC¿ÁÿÝæ76$!ÜRUÀÜ lüóâG%ÍÒÙÙÉþ_þ‡ÉDP’Øí£­ž#Ö¯m¨Mß@%¾maºµ|ÁòDQ}4½H›ŸŸ¯l'Mó_Y<Šç±nñÅɯå,®ÿë×½öûã›?ŒéíŸT¾ÖËÛÀ9WÞ¡‰þ8ýO–çGcøgxÒ¿ÿ;GG×OjÃm7÷ž7üdòðD¿ì”8|ø0 ›h¨1³jf¯yãóˆ²2AGG.«KÞÜÖ»Š;>(+ŒE~ÖŒ kÃËm½çõ‡ãCä²|™ì€8W®¸ðtDìñy²Äÿ'´•Ñ„Y›{ò·¹´y–ø3ÿ Hx<.ì–4Žÿñ¸ãïKƒ9^¼ïoÞ‘qžlàpÞOvjÂ=CF÷š7>²ßxñþ®#%çÉ‘è7Ua$PÛлˆ)>OD=>!M xD~LwÇ…çÕô~5y×kÓ¬5ì@ž©Ul*ê=k|ðd@üí€Ùl–6lØÀ”)S2ï#îï÷ÿþæ?Αó>ÿþ®ƒßà7øû? Ô‚×}ûöqër;èýÓäøóýòÛ½ÞFßÝ^ NÑu´@0“oßÌ•…Þ¿2¤I£ ÏšÿÞÅÕØl6n½q¦¦l•ð_IðàZÃ&UxÆÜ÷IðÛ,DœjáçŒr7kýµ¼’–Óh!îž0asTh~ „ƒò÷ –,ø-â×ííí2w8œ´\=ïNéIF:vnjȕKœêÐ:‹7þ}üüºXºâR¹ÿ°©¾.[z¦KòçC¿ê\nM’î‹Çò¯àiäûMJºÂKÙµë ù¦4úlz@Ö:÷.î}Tç°?ñ¶ãUç©\‚N ¡Oàô®¿ ß8 ccüÓ£cõ²üªËPÊíh!jêÊ5©÷ñ§ËŸ«ûOUFZÏRõ3W~ˆ ÿçÎË AƒØ¹s'‹…Ýo¿Áà“O¢½½ÝÁ¿sþÈQ,¸ÃÍ7'Ÿ900›ÍÒ[o½Å]wÝ¥~äª-4¯ÕÄŠ’/ß;þlFl=(¯9(% ßzP[ؤy­&VeØ×y7Œx(aØû$Œ¸Y¬¥á û@çÝÿPúüÈ_ TS€ ª÷Mùw,>žÿbàéÓ?¼î‘È/êR9GÉÂãëzR´< 0`À€ßq'.éJÊh†óS|Ô®±eþ±;]þ7óï–{zàDþ–3þ+U¿Sñ/-ÍÝñÿ¤"6° üLzò;9æäŸòü½5güGÊc=Y©ø¯þݶœñ/ZX–ŠÆ 9ãâŠ,JÅ_VV–~ú ]k°œÝlËbÖRWe¨$ Èf³Yª)µQYîc³Ù,•E¨oíc³Ù,EJ#˜ë¿Ùl–mmmX­VrêDlj<Âo–`ßw×*ë¡ t3ÔO<¦¢ötDØ}Ý!þÁ¾*©Ò8UÂÞ@ ùïÀ晜t ¯Æb±èfÐSèu.„Ð~Ö¬Y.!´Â’ŠŠ "‘~¿_“N¼‹×Õõí°8Ö%K–`±X!ÖO•Û#§]{¿ó7¦L™ÀêÕ«9|ø0âüÕÖÖêzŸ–••Á1Uù-?”|L [޾~6›ÍÒÒÒcUêõжÝäÓ›Ü |ÊGÑiЪ‡Ã+ü8úû\¯ƒ–@…õ挎?¿ÃdÐUpøUè.‚¼ø×ÊP"  :õå?uœçü˜çPè8Am¾NðÖ˜€Ãùà]ùÿû”ÿ˵W\Ä‹¯¿Í¨q§³kÛš|»vd×ìƒò àÉÛ™9À4øû}l¹%y¸¿+·yÕˆòô(ŠVyûÊ­C^ƒßàï÷ûÿ8௞SÍo¼Á¡f­âsÅë¯k ±Ô|j¡±0hoh`°ËEÅô ÚÛÛåYÅ{9†m«åò±a}ü±*áªô 6Œm«·1nÖ¸ôDøýÉÆ´nñÅRùZù[ƒ^ø!£_IOßßüQ4¾&¯-WÕ„[®vóv/ÑH"z..ªtÚ<¿+/ŒtMêeO“'%ÿÈbo?À_f*`ÑÆ‰G㣔Ü^’’¿ñѾ‹ ’†—”É÷o ~a’m™íÃIªìFõ¬àIø??@RÁõÓÉNe/ÈKf6`ƒnjþ¼òäeu'˜ôŒEåCøóŸÀ?µå8MäÕH)ù»+M ywšx/ð=üi˜8S˜–œà¬I}üÊ MÇþâäßY„I]&sj¢{Jþ"Wˆ/rÅLêٜ҅ܭ¤zN5U«ªRòWϩΈ§7œäоÎHu`*K}ýÅ‹ÿûŒ ögoüR]b²4 vv-y=¤ûÃÓk‡ÃD"E(¯Äuô8¥S§]bÔ—/²k×p Ù×gÞã¡þ{»ÿsuï«‘îùÿSô<ìÕ…9]þ 8Š1K0`'Òï}û7sí8œ!TâûDäêøÓåÏÕý7gAf³9é³8—ü.—Kš;w.gž*Ëdó7徜|@þ¹C”'qÆiû8|z£í—1qâD6oÞŒËå’ô00›ÍÒäÉ“yùå—¸úê«yŒÌ¼yór?þ):{üp{_ÛM@{9[‰V‡³5š^ï™æ£ûç¾ ¸ &B·ê•N¾ùfý÷!Ê?ðGDº€ºWmàýÀýªðñÿª¼œ_L„ }± ¸Á _±Ù—›s`À€ 0`à„‡ap‚ (]@«n³ƒÛãÀˆÎ.Œù¼rõÊß9W^ç¯äÍÎÝHÞ›4ü¡Ðn%^N¯/½'ª÷zà^pàÀí‘ùƒvpG?|3ùЖÆÀÖ­[YÚØÈµû©9þ¹s—(")½áž],s=ÑÄÝ­8eÚóÿ®<óCðèë9á¿ï.yf‹ß>¼ƒûvK¸_ujøÏ¿M¶·¢„3tæw8ä ix÷]Fn™©áÿÃäNù}ûöéÌ,câĉlÞ¼™ª«YtöŸ5üN§ÜáÚÚjˆ ¨…xý1³oóø–Ædïaæ²PzЇ3ÞüÇÄóÆé4QŠp‹Û«²õ˜ÎBà´Ûi{'ÓoMe}ø˜óÛvBm!ì¥v•¹å7›ÍRyy9¡P«ÕJ(¢­­ ‡Ã¡ˆt‘HĤ·+µÙl– J7ñ¿É}wÁã“ß>¼ƒHäj¢F¹äWï$7‹°Þ—Šjñ?À¾?ËH ìZ®@ ö;Y˜v»Šúþ1^ÔÁêÕ«y¦Ñ;v(& ¿à}Æ pÖYgñÙgŸ)3:>ûì³\vÙe€þæ[já? Ïf¯~ €¼«. ûU¹Ý)’§g›5k€b —€¸=¤µñ~üÿE?ž•ž9Eºø÷•ÀJ¹}SéæÓ›ÜÊzàS2ïù&X­bõšÍ«º¥ FÆáVÐ)çïŽÎ|7èªØúð«òvž ºUc-Ì›bH-™ŒzƒÓÔŠÍ^è+à<çÇÊúÃÀ9€,Ôð=Ѥä«;«a9±4½!a-!ˆÞãÆÀµW\¤¬_|ým@j´úßTò™Íw²¿¼Ý’% ÀE³ÛÆ·Å|XÙÞ¹s§&½(/ô7¿¬_Y2*þoÎŒßÚÜF² ÀIcç›–[”4Ý•&y&ô8~YüƒÈ÷^à{X›?ɈßYÓ¦ˆùq‚ƨ:_JâóŒ¶ßœ5™yµWóϽ̫I3·G~mÚ•oÈe”W{3â÷ ÷é8nˆÃQÚšû)¬šÀ r¿¦¬óœôš >ý)ž!£3âßu¤„QÛùbÜyÜw×¥­ 0jÜ?X·øâþøgïµW\ÄoÞÁéÛ>dבÌîÿªUUÊ»Ôĉ5ßt×T¯‘ßâø×T¯Ñ”5|øp忳jUUFüy5m±ë)îúó>w:žŸ~‘xþ[Á÷fÜWï¼#x¦š2â7Åø¿ j“~@Jùü‰O{’C‚ |½¦ÃÿmÂöíÛ¹üòäF½ÁáLÞVMÏ€$E;7’þæW—{¼|ÿ}›”EðyÁRœ›¾~Ñߘù¿7eýÇÿg‹¼TÝ(öì €º3è í†ââb.øÉ,_ mZ>z9ó—ÍOÉ/Ò‰¼óæÍcúôér@¬‹Ôà7øk~!üÿÃÓò;…¼ eªœˆÿ¹ÎF§h¥Ô¢àÆ¿ocß¾}ÜzãÌlŠî6›ìB¦t|tÇÞueƒ'e?Ûwox?ú êŒK|ìpðµÓÉI×]§|¦àêo‘z 'ô½‹«¿Þè &˜n‡†`@ùºþc}lÓíòìãêr2A¾ iט6m÷Þ{¯rÌê™ÍÕý¤"|­êÚÿ¯ÿú/B¡}6H…Qß/T ¾MHUÿê™ÍÕõ/Âõ¬ÿtîÿcqï0 ð§ùùu%ÊÿÀù_Êájà¾ÂårI÷ÜsÝGp¤ãvæc°ù<žxÜÏïŒÅbaóúò½“)›z=ù’Ž>aØÐ³ùÏÉÅü¿Ö6€>™˜ÍfiÅŠ<ûì³\}õÕ<ûì³¼üòËLžÞ 7¸ÝÜàvóŒÏÇ nù=óŸ»ÔâyÖÓ Ä€ 0`ÀÀ ÃàA«C6( BÀnÀã”M‚n_t°~ôCO°¤7{ô¬Ìù+e€Î¹ŠÈ_Íoº_ÿåÎû7y’K¹Y7~¯G6ðxåmŸ|^Ù 艙8¢ÁÀüúÿÖ­[?~<ãÇgëÖ­\;B{ü÷í•…ÿB5oùrVÌŸ¯¿ï‰&ܳ‹qÏ.Æ÷D^‡–ßs«,ü³:ØÉcŸÖÿ·ïྻÆpß]cøíÃ;p;µü#¢Â!V`Ü?`öźñƒA‡ƒ`0ÈH´üÏD‰ˆ#¾mÛp§ÿæÍ›™8q¢âLË_\' ÿ‹¢B ¢¢"ðùô»ÿ wè/¼à}ë­·hoogÊ”)Jرš ë` ìôa)n=¦üŽ/äDtkCš¶#ùH˜ýÏ@¨&DªxB„ÃYî› )X™|:@@ÂÓ"U¼@¹7Ø'~¯ËŽÃé '¤ „Bø»dÁU²x/};þŠé²ó²ÅbáŠ+æñúë+èêêâ7Þ .PGªøHDV›ÑÎÆu¹6Ìf³Ô\S„«Rk°SZ¡¾5·âoÁ_Sj£²^;Úå_f{ŽÅç‚ßVc#\©å8#˜¹ß ¡¿þ«!~ ‡ê7ê&@å ¡¿þ«!~›Íf)2¼ó¾J]ùÕû‘LøŸ M5rÚâÊÌÎG¼ø¿¡¡ ‡ ÑÇ\È¡ b6@ú Á¿ZøÉgÒ«¨¨ ¶¶6ãëÄl6Kâ}cÇŽ<ñÄaÈØ±c¹ì²Ë4‚÷\Ü =ô®€‹®þ!þóŸu-ßl6K6[„éÓ+°ÙlÊ€¢»Ö˃L¾zà.ò¶nJš_ÔÖʃqD}”—Ë S¿ßŸV½Ä‹ù+**”ç*€ãò:øž,:WøûXçf³YzåPâµ.ÄÿŸò)Û(þWó/¬ÏüÐl6KŸV&ò ñÿáWcÛ(þ׃¿©,ñÿTˆÿ? œ£l â=ø J7'„ ñÿ‹¯¿­l âÿ¾òC? Àãøÿß·*ï9Ùð«ógÂïHQ[ ø{˜6•ù¤–ß#íÌ EbåfʯΟTéihêÒጽ眜5þJ R;ú\ýNêi¥%€Y@¼víÚœ‰€ÚLÚw5„§¶¡o±[þ8¿¦Á-Ò0a%Ÿ~*:„§ÉwB  ú›ÿÜ&ŸÂÍÙUì+;]þ‘‡gòÒA¹ŒsOú°§xþÚívjjSÞÿ©Ä÷™@ hÞqL2ÅÁŸý €ùËæÓøh#—}ð&Ï7/¼ f'Wöáì?ÿYc06â]—«ç™lHË,Çb±h„ô¢½ ²ÐY Ùk̘11a4òLä—]v™R†Ífcù‚¨x¡§çÁQ%G IDATßqÀ¯À¯[|1ÁV‰©+bèžð-G_Q~¯ŸçÆQdÊNŸþtï¿ò-å. 𫟃günE€’«Á…ÿ&¿gýnE€ÂòàçÑý¸g^¬Á%LD9¢ÜÞPQQÁüeóㆇe1ÿo$ù»ÒüGd±w“ »Áv yÅrU,¿S.ã~S‡¶r7ð”R®h“¤ËŸŸŸOGG‡bÀò,XâZÏB!þ¦B”‘ŸŸOgggÖüf³™C‡1xð`å™ÔÞÞ®˜¸¬.šÛšñ¿à³?šåöHÖükï|mL[îp+&þ°,îâÿ®ßÇ €Ô¦ÙòwÅÚ;ãÏ”ÿž)¤˜˜Ê¢Âó¥rÞi×Èi¶~’MŠ@¸Bd{üß´ÜÂIc×ü&m®!X›?QÄÿêtÉÊÍ”_#þ½Ïvz±ŠX[•Fä&éò××çã,“ß5âÿ$üâúOÅ?÷2¯bP_ŸOiiï®øêã/tœ¦´7?<ï<9Áúo8P)›¸ßóâû'&þŸ*O {Þ‡òaà |úÓŒŽ_Í?jÜéJ{sªåCæýå×? ›ˆúâÿ?‘Í®ÖwÇ‹¯¿Í¨q§Óº-Vn¦ü6›}ûö1|øp ù;°¨wqÿ‹w/aßÑÑÁ¾}û°Ùl„Ãá¬ù…øß÷æé±yGð®—EýÓ+¨m¨•ÏÜŽ/”d¾7O‡î3€lø… ÿ豿º­G¡1 %¶˜IcXžxo¼*Ý€GL|4É&ð0räH.¿ür6lØÀ”)SÒÏ}ÿqÖÐ>‡Ò5 ªºœ5dôþ£1@™ãUž'™ð3ÚKp•GáÏØÂ†¨$6ëg·,ô">¯OsˆTñâØƒžæPÚ†{©`6›¥®¦–bm»Dïo?ÊûçÂ6Íêó{TÅÖeÁDž:í·Ài#%ù¿`ašõ/Þ¿ý˜_cH¦Pžê3Y·?³ëoþ²ù,_°œ ~"›GS™ñ‰v–fìÅ0J@äÎtæ/›ŸQûÛà7øûƒ_{W+¢úr Fô’^IžÙ¯ãªgéNâ9Z\Z†ÙlÖ´ƒ’í¯h÷D"šê“8be1–nº]î“WfNø°t˜ûÚèY>} ÿ÷„hÌ»ØÎ“çeïèÈ<•úÞÅÕX,ººº”YØ…@® ™…[1{Ç7‰õŸ-òMH3ÊÝL›6 M„ÀßiO]¶üÝFŽ[ë÷Éâs”ë_7€ÓoÈÇ P0vz¡±‡}ÃÜè5øbtï¿ ÀvØ€Ý'{ôz¬þ…À_Ý÷aÆiŒúZÿâþ¯‘ 0öó%äâÞ7` ?àr¹¤;ç˦—G:>á`LJìÞµ‡]¡×53]]] ùž,¡Ùüò <Üͩמɠ8ò•DþàSˆàr¹²2ãªÔÂ5Äo19„ßï×å!t﹯åÞ¸p!ðµø_`ïø³µ™ÆË«js€tÕ‘ÐùdÜNÈ!ü׈ÿ•ˆË#Ÿÿð¸µ@Tà/„ÿñ¿@ª.‡Dâ^/Þ!üW‹ÿSå1`À€ 0`@À08`±ƒÛëüaTôîq‚Ï-‡»}AÅ ¼7%å—~#¾2ÝO¬ñ–8pàójùA6p{‚Š @.píþ_rí-¿Ç ¿!ö¼oïDĮ́zÃá(#z¨~ïä çÖ˜ @.à~Չۙȿ×)Wúˆmþ˜ @0rËLF’ÈÃáe<³oÒq™ ,:ûÏ,*Käo*‹Š¾êZßNˆ55Í8v\.Ë1À›ÍfiÆ ábVÞY³fé.¼ëj*ÂRܪ ´èjJ¼¾›kä01#·ìê «ÕšÖGÜtÓhüñb{sñçLl:“c=ËÙl–š›»p¹,º_wûŸ‘×Coˆm÷–VÌáÄðtÈÕëtš”íÞÒªá0Aèµå÷òA·/|{Â/~ñ ®»®+®˜ÇOúS®»®#ÊzŒw¹*¸ûîºB ù€…lQZ”\ˆ­èçL„²à?¿z@Z®ø#ÎÔÇ)`®×Ÿ_IÄL|ñk?>;¦OŸÎ¢E‹tÝÏ,0€Ö––„µ¸ºŠÆŽ¥uç#xwßDåè÷,ŠÿûâÚVãn=OTÝTÉØ@ ,Q‹ÿƒ!y-cf(øW‡©ÅÿrXóh©Åÿ=ôápXÿ‹A2ÿ¨«£¥¥Ec ‡ €ü ¸Ún‡Å¨¯Ít!>¤ªYýúUyö»¯¸‹éÒP Á›m/ïªK8øø¿iÊŠ7éîÇäÉ“5ß"‘#FÀdÑ𽘠@Ùg5òÆ©AêÌuº¾‡ÿâ÷1ð4Ä-³LðãÁÉgûêë~tÅÿŸ? Å͈ `s}nø §)‚ÿ ×L¡ÍŒŒîÙÅ×9rÂ?jÜéŠàÿ·ïPDj•_JGýD}øÃ˜<„$½àiã÷ºìLýõ Xÿ«´ù §þšõ¿ºNÉŸ)¿ß†¤Ó« œâxâøãÍÔïcþ.²æ/·@ÅšwÙR{CÚü*ž¡væJþLø[|å˜fÈ*â¼;ÆÆþL‚-¥®5~M½«Ó)é£×ºÜ¤PÏc=FÉí%rpT/™U35âëžD@3fÌg"·‘r ¼Z€3hÂþ Üp¡üÎ÷AÀÄ_LÉŸŽ ¸~Ë<ôM¥Ç±Ÿ(üõ ÛpÖÀœöv¶L˜ÀÖpÃH¹o/ ²gКÔõ—Î6&lÙBU´ÜÒ¥½÷Ëö÷ñÆTÛP+©Åüêþä¨;áþWÏ~h̺jj3zþT­ª’ô6@H—ßl6sˆDñÕª*¼Q¡ïßÿ¾Æàïo±Ï*y ¶»Ø#TÊùjùrÌ]]½Ö…ÅbQÎÙo¼È3ˆWÏ©fôèÑŠ Yööv:;;i|´‘;wÊÇÅe—]F8VÞ“{Cóyò咽JÉÕ¿À¿ÌÃÔ>J®þ·üÛ)L]áK)€_?O>?¿õ•"Úåˆr{Cñ ïàÏñ ïÐtÝ…©‰£â«‡žⲺð\æaYkEüËd!]á/÷Ìs*â~5Døe1±Þ²Ö ž".«‹‡žâÌwB>R H¸þ¬V«4iÒ$jkki|L¹tû Ï}‡¶rÿ]²¨ptÁwµ1?.¾Û÷Øn¦ñÑFn»í6&MšÄ¦M›’öK&ão|´Q13µñ›@AAíííšøÎÎN¥œløËœeŠ  ˜$kÛ <˜öövM|$¡.P—5?a¸q@Ô€˜@|ûä6ÒÉÑÆ¸ˆú¨l5?À$¹½³õªbÐþAþ¥6~М¿õöÚœÿTLÔëx$‹/ð=¬ÍŸdÅï¼½$&06%âÒƒ²ø5]þEL¦´t#Ò:¦Ÿz¡Ê3È‚åÊ«½HÏy°]¿‘ELfÉâižÿÑpïN¦>xvÔàØ@\ûdƒº×kã×ß{ÏÑY__l ÅÚ›W\¤˜Ä·?A6¨›÷mü®m_Ðz$ûû¿zNµò(fê÷áÇ 5ñáp˜ªUUYñ›ÊJð>ýŽñ§‚"´Wõ 3S‘)kþÏȯX[jÓî·íï¡!m:apfaz×ÿ· {öìaûöí\~ùåçmi `Š~¶Tž=jÑ]0&¶W XHL'6…ˆS]nOí…§'f,ŠIRþ¸tj”tÛ?ñø°ð¿râ{>üð¿òâ´÷ïqCáÔx}…© Î=}ûɦ¯=Úêó!jƒÍÁó{d1¿Àó{L1±YP#üOHgs@8¨”kMæ°ù#o á¿0ö•ÈFKcyÒ3P—ÛÔ}/BT=r¤<âæ‚Ÿ\ „EÔßök‚Jº ~rïþå]%+>öØcÜvÛmºñ¿]ûyn“ï˜ó«ûókj9Mi¬=牚›KþOËT3­7™Ž9¿zl‰CÇëO@‡Mnº 'ð?­úûÓÔ_¿À´iÓhqôlbW8õ·ø§¥ó¨I ²§•<ë8`c™~qc¯[Fãßu"‹ƒG8f¢‹‚‚Å„!ŠKËèèè ««™®.+‡ö¥6šMwß}·"O†‚S䶆¾œT¢â3)§'ØívÖú}ŠD<~ñ‹_hÊv8ª )B4Ì(w'äËù!„b× yç¾õƙܻ¸ï&¤ñP®Á¸gÝ¡P4>cŽEý—–iîEøú·Z­X­VÚÚÚ(.-£©¾®OõŸŒs+òñv|•u± ÷øü__óþî¿Sxö@>Ùûþçé†|ïdæI\t œyÎH>ÿø -ÍþÖÀל=BÛ6ó¯/?ç²ކfº‡‘´¿4üñP¾ įA~VLž<™‡~˜û·ës;HˆûÕøÚnâäßÉBþ½Ä„þÂàë{L@b>µA@&â~-n¢;úù¦[Ý 5È›(ÁÄÄ\ƒ€4qÆÈ$#áÈïåÍOÕáÑ!ÙgÜ‘¼¬#{2¦gîiIÂÞ‡³„•Jô/Œ>{H’oå—™ó0`À€ øöá¤þÞ™Áç•{¼Ôâwõ6@«C^r“ç©^ùÉß)/9@Þ?è——\àÅ¡ÿÝ+[[[Âl©z!¬ë•?xôu‚G_Ï ¿ïª@¯ü»¶}Á®m_ ì™°¦Wþ}ûö%$¢–üY¯ü­­­´¶jg*ÎÌf³$–œ“ü gMM355ÚÕDX.÷Eˆÿ ”—ñ3\,Y²Dÿ}í¦«©Eü?Ú-/o…°k¯óšRjñoÂéL`µZ¥±cÇ*Âw«Õ*Å/"|îܹ¼^üÅùmiñ/,¶èÎÏYÖÖ†X62”ðÂIÄïK. ®/!þhnîÒ„ëÁ3ô†äâÿP@«¸zƒì²ð?™ø?^lïtêóÕ_|Lç J=ǧšÁ7È"þÄíÞⓥͽ]Kõ­fškŠ(-Š(õ®çó¯·²¶Ÿ2ˆšR—uX©÷cÉo˜±Õ؈8#Øúó ˆYIÕ뺺:e ”)µµµáp8t߇¢òKÖæ}•ˆÙ²ï»KròÛ‡w‰<¢ ¿0uðeÁ¿X¢žk8ì`rįêÃTSM$­}1›ÍÒŠ+Y$Êõ©Dÿ;„¢µø_þDñ¿Ëâã¹çžã¡‡¢¥¥E#þ_¼x1C\²0ÿuu<ûì³¼ñÆTTTèr\ ÷þO‚ø_ŸýìgÊÒWD"~¿ûcîZ¿¼«.!ïªKÒ?)½²²43ÿÙÅ¡‡Fp行h!üW¶O ÊKlÿuùz_‚Ö/µ‚ÿÖ¸‰9ÿ‡å¬jÁK^\³*Ïž;ñðéO9üR#¸8ÔV@.Åÿ§oû]Û¾Ð.âÛÕºŠÿã t9Æ:•d±½~«·ÕéD^=øÏûh=ÎÚüç}´Os¨ÏüN»=:ó‘Cs<^—µAØV§yõà?¼¥Vs<½ñÞR‹¿+Ã÷À¨Ò·ÂK¹ET,ÄûÁ–€²N&ò¹îÕé@ÿ{šC”[À·Â‹3߉ÓéLùàÌw²eËvî܉Ëê¢jU•2È% *ÂêTB$ÒALT=§š-[¶È"Ì$ÐpmÄÓäãð–-<óÎ EÔ/Dþñ¸áÂÚt‡·láÜ&ûúÈ[µŠ…“&¥lÆóëyì6R[[ˤ4øç?°''üóØÓ+ÿ‘qS)]j¥ñÑFÎmò1AÔÿžЍäá™IùGž©I²øÿÜ&6RºÔÊ‘qSÛúO±OX­V† ¦, ‹ý…à_½­N'òöj‡Ã¡ûšê˜ ƒz[N d ‹Å„ Ùü`ïDy$×Ê•+ñZägßþuëºÔ­Y‹p¯Å!Ïö‚Ýsæ`±XÒ2"P‹ïëuÔê”ò„˜ ^„/~‹x«dUò ¿z°ÞqÉ}þòz+.« ÿÔS ¶JXæÁ?õTE&¦®ð)"ûx¬Ÿçfê Ž"þ©§r`™‡`«„꩸¬.>y½µÇ翸ÿ›®»ïzIW~ïz‰¦ë.ìñþ8Ë/÷¥8ó,(r°¬5HùúQ¸ÀËe98°Ì£ýŶ/\àÅû†W1ÿ7¢Ü@gòÆX›©M›6)B•ê9Õ`»Y¸(Dý‡¶ÒÝd‚ðnFº_…ðnº›Lšxˆ‰ÿ«çTsÛm·ñØc±iÓ&ÚLÉ¿K%ã/¹½D¹¶Ô&ãfcMõ Äšê5Œ›5N1ñ_øëuŠGmàkòá²Ê¢ —Õ…¯É—`J(Äÿ}á/W=¾DhàS>Î,ÔÀ–E¶Ÿò)‹@¹>ñÓŒ,â'Ö:ü*°0*þ´Ggƒ^Šø¿/üÖæO”x!êÿ¦åòj$Ú\²9@›ky5’&^ÀÚüIŸø5Ú™´LeÐ]ibÝ•&¹â Äÿ™ð/Y¼‘ðºÉØ®ßH ÎAyµ—•o$ ÿMeh®ÿdüBü¨s`»^.wÉâ¿gÈhÖß+®mÐçPX3÷{^®Àýž—š¡šxˆ‰ÿûRÿ­Ív¥½)Ú /¾þ6ë_¬©ÿu‹/ÖÄCTüßlï¿úLm0³j¦æþŸY5SÚ÷þlù=?ý"©øß3ÕDÅô Ìf3Ó+äë?hâ› êÕ"¦¢¾ÝgjEýûíòâ‰Àç`À#&>? ÿq[ÊÏ¥tùãÑ×ïªýñ]Øl6K«W¯fäÈ‘\~ùå$3JO‰èûOÐ'·©5Ïõ:U—‚#.±g×e'è£×÷Ÿ…ÅJ—Z‘êÐò c‘x35F{µéTüR”.µ’Í7É_M-LºÝ[|²´™"o?]MJ‹"ŠYC¶×œÕj•Þs·a-ídÚ»,®Š÷ŸßcRÖj‘¿ÓFJštÍ¿¦í°c-íä=w[êú^ËCà€n¬¯SˆùŸ)¤ùkø¯±kÒœ¿Û8 qy¨×믢¢‚Ûn»wÿò.ó—ÍWÚ{öìQfT°ƒÊ" ÒìÙ#«]ÚÛÛ™¿l>ïþå]n»í6***zlg¿.T–þàoooW–þàcKðwoÿ»²ô )‹üÇ#‚žûoG}__ƒ•x¨¯ítEäÙŠÍSáORLt~q&Îví2:¾+¯§+§@24Ȧދ-¢¶¶¿ßO]]]Òt}Aªz,+×Åkï¼ËkK˜cLŽófËô|ˆÙçø?Ù÷œžÊvÚíL·Ëe€< }¾‰¬ï½»K´Â‡<ûüϯ“ã| *I¢¾¡F’¯Ã‚“dÁ¿v»lHðµWŸ1?ñõ/ÄÿÉús{ªÿaÆQ\ZÖ§úWßÿjl%f@aÀÀ· .—Kºçž{f>™ÁæÁ<÷—W¨[¿Ž /øó$®¸üR†æûçÃÐ"y¢Ã¡E£Z4š3Ϲ˜sNù'mþ E¶0Ø<˜ï |v³ö›ÇgïÇÒˆEž,Ÿº< 0`À€ß]' „ @<ܾ EÉ£t…0H¿ÿÇÐ9:çüAR¿'ˆ#Nœñ&ñ¸oïÄ>ºL ž[Ý8\‘s~a?£Æžs~ag-H9@WO€x×™)ÊRð“ ÄàŠšR›â„},\®Ò¢ˆâDÞü+V¬à­·Þ:füBüàtÚÙ¶3ñ>øéÌšœ0ÕâZN™2…Õ«W+iD‡}NL€®¦¢˜à§ËÿGãÄHTÖ‡5a¹€0;v,cÇŽeÆŒÌ;WùÀ[QQÑ{!}€0(ÎoC, ‹-¬]˜Õj•Ö.Ì×3™è_ Îje2ò¬Äᆅ„NbsñçJ=÷CÜf³<Û†Ë%‹U]. ‘HĤŽ×‹SúCP‚ø_Ä«—ýÏ$šôBX…Äö"^½RÒtYóG…\A)&þW/P(iºl0}z5sçÊ“¹s—3bDYñӧ˽ã#F”%¤ÍÂH$ÕµäªlM:+LOy2å†&Éâ+ëÃ\þU¢ ¬§<™òÛjR—® q&Oy²ÁàÁƒ±Z­D"Íd‘’ÃáP ¯Dxt&u]ö¡hìXEàŸl‰<ÂoÞ¡ /(ݬ0$ ñÝhû$E1q¾]Š-ñ&™Àb±°rå|…7vIõ«…ÿñÆÎäšÇŒ°uëVZZZ°ÙlaWÉ¿cÇæf:ÄYmm q¹ø2 +â£w\’8Ë^ƒIþ. ͸<³ÙŒÙlN'TöYt °ÙAyQ!øž6}ð£X|Ý©uº‰ÿãñ‰?Ñ (‰Óx®ðù“±m10¶;÷M-AoìÜ €BDZ«ñ|ƒ˜ @ÎÚÚaLz ÀÓž}º~i­—`K€Â©¿Nš¥pê¯5üÊò>ñû»bFOÊ~‚)Mb3ßÄÒB!ü]èÂ/ŽgBÅ3I³L¨xFÃïuÙ³â÷ﻄùΔ&ÉêÜ ¤(7•`öìÙ<ûì³Ê>¤%C*ËêRÊñH*R™Qÿ3ï àGŸ~ªY‹pµøßÓä£zN5?úÍo(ñxXª“*“cÏD€ä[{&*¦äçMºò—ü¼‰Æ?ã[{füò{56Sò,U›Q¿XÇ#>^ˆÿÅñjlæãO~ÜÖ¿aLµ µÊ;µè×iooO9(yذašt ›qõ6ã}*~= Òæcš¿l>]]]Œ9‰Ùì=]AŸÒÒNüU²ˆ?zºþË«½ø«<”–vjÊí ÉŽß3$õ÷tÇSÆy†ŒÖ¥þ[›S‹ÐzªÿÖf».üâÿ?zºÿ«VUéÂï™ûËœúêL}õå·ºìèGï”S™>÷_I”b¿ºBò"p’#voŠ8aPbËœ?Û·oϪÕl6KÛ·oÏ4›nسg«W¯fÊ”)÷‡Ýâ—ßWœùÎÔ&ÉBü/ÞD¹=½ÿ,mê"\߆­ÔJ ²€dH!þT‚­ÔJ¸^.?]Ÿ|Ñ]öMãã}ÑÇe_ e³ùÔæ¹–bsÒo?=åé m¦6~à³réN oŽî‚¥¤4H†Tâÿ¼rxst—î´ðŸµ×úÓ»þR™$åO!þן(·§ë¯¶¶–—^z‰k®¹†å –kDØ6Òøh£ü>X÷à¯tPr{‰’bâëå –sÍ5×ðÒK/Q[[Ûcû;]þе‚˜ŠÝÇ”¿bºö9*Þ“¿0üðºìÇ”?¯X{{åKÇ”?wýu¸þÔè”0­ZVËœ4ôákJƒIÞ®õûè”2색ÃZ¿UËj•ß%ÿ>ŽŽy-°jY­"øÕê¾®ò1ßðxyïNâ—(“L©Ý7¼š,ø‡ØŒì ›ähs2´ßïgÉ’%¼õÖ[ʲzõj6nܨ+÷„ ˜0a‚&lò-²ð?#GŽäO/4R0VŽ¿eì?"Y9záÑGåÞ{ïU~Aå{A.Qp9;ç=áO’,øû  õÏþÄ׿Þõ4‰Öû§AÁI9še΀~D~~>ÏoÞJ`Û+|ðN ‹…®.y¢£ý­;y}û›liþ+¯o“—×É¿wîþï¾%?›?ùç×ü÷/«m¿Œ~ú/Å5[Øl6®¾új"‘ˆf ²ðòäɼüòËÊo€+Vd7þi¯ö=¥ûµ[1¿X ±ÿÞñgk~«Óu¿çD³7ƒ÷Ÿ¸´G¹Pó‹µû\÷¶æ·:Ý‘G.ÌnT鎜ŸþþHþ=õ'Ñ?a æ_«ÖÆü‘œïˆzQüg=éSÄüÊ:*öx/šßêtg=÷.˜É90`À€ 0ð­ÄÉý½zÆ¥ ]éáÛ0ŶÕpûboÂà5øßÌ¿:ûËx IDATçÊ<'¿ŠïëÄ‘'¦ûû¡£ À¥ ] x¢½žØ¶nÕ,ìÂà5¿>ü?©¨`üøñ€,„ÛjÜ·w¢²­§ À¥ ;Ù‹{v1¾'š”m5<·Æ>Š €mŸéä<¤™aUl«1"«l!LëTÿ‹Ö¬Ám •m5žsÖÓàR†¸\LŒÎFµyófe[âºØ`aðIs£·²„%ÆC„UÖ‡¥\‰€²ï"¬¾Õœs~áz©†ÜR[[›þxñ ‰ÀXütf Ï­©ÌÉ~á? ˆÿW¯^ͬY³Yü¯"‘ˆÉrv¥Ôu°F»a§Ü¡d9»@ú7×áªlMÈ/ ô¨!øPo¯]»–¹såÿ§%K–(µ3fÌ`íÚµR[[›.üÅù±+êí¦N+B®o#ÌWÒ4aí3¿þ«Q§ú 7,Ä6})4m6^(ÏN,òÔYû¾¢3YÜÍÍ]¸\)>ˆ÷ôm&ÚýÉõN)Óè)ü43 ¤“FOá0ì±<µÐL Ë¡ÊÖ­[{M“ ÑoiQ„úVùÿõ·ûX7õ••4×ñ¸/˜Vo\þÕa¶Ÿ" ¼¦ß8šëMN*O SSj£áé iõFÄÁß^jgè ®4c«±ª%¤Õ71ƒòå÷û)//gÑ¢EÊ€‡øÎj#‡ÃA0ÌúP6¹Sjõ?BeýDŠJ7SùÌ@åÈÿAja¬ú÷}wÁã³ùάøÕï9A Î~ç$þ5¢V óƒ!4†âw(jàqCSM„âÊÞß‹ ÄáÃòõãP¥æ¢lG’q•N§Ö@ YXº3jíØ±ƒ––ž~úixàÍl‹ß—`ˆËÅ¡C‡øÀC€yË—ÓÐÐÀäɓٸqcNß õB$1ùý~©¢¢›ÍÆ£G3{õKä]u ¶nâèøIÇ|ŸMª¶Î§òdñ&üo¨«ËøµÞfdç±×c'ô•ƒrÀÆä!$y‰ŠÛ³€g,>í…ÿÀú_á¬ñ¨ÔŠébáèÆï·! á´ÛÄýñÐMüß ÿ–Úð4‡+áÑßÙð·øÊëöãó{1Í…žæ4Ëx^—=¥¨ê\…@g€–µ^ƺý´øÊ1ÍH=ˆtçÎÌž=›'žx‚¹sçÊ¢]Ј€ªçT÷8³¸":Vaîܹ<øàƒÌž=›;w¦È©àÔÖÖR1£OC-4Éí^o±›A= ¦¢6×~ÓÐ@EE?úÍo¨¨¨`þ²ùñ÷娓 €zâ_¾x$%?obùâ‘Ì`súÎ_õàAm¹ËRfgùÏ–3ÿR(]º’Šœ«ªÿŠÝlé¡þSýÂ6œwØäòãú׆©¶¡Vª˜^ÕjM÷ÇC7ñ¿Š¿jU•$Ž9[„lÌæ/›¯iÅN²Xp˜òÁá {ôh¦,¶ºÔÍþ…òµñü×_“·s'ƒ% _¤M©CQnºüÉ‚kj5¿m$???&ŠQÁŠªÿ?‹ãO‡_ ½øÌ.§ð ?¶ßoÀ?õTE±ì… ¼Œðc,-¯°ñRQ|÷«»¹²x-G_áÀ2þeD× 3@ù“ÿbÇÍÿ. à—¥~þ¿ðK¯³QüÂ;4]w!…Þ>ñ.ðrZíRM¹â¸’¡ûÕÝüÒ³[ ;çÊ;8ÿ]y–ËÀ2”˜˜ÀǯÅÒ |üÚï•òΖïÌw'¯ƒÚÚZÅ€ä~M÷$7¾&“"ºén2Ax7#ݯ²Ÿ"Fº_eo7ÝqiÜÅnÖ®]›XnWC*þq³Æ±mõ6@6œ³ŸÊ,èñiôä÷5ùpGE_¾&Ÿ2û7 Ï®…+!žüg6ùøº+£ƒ|k$Ú\CøóŸüÀùOÚB^Í'š4zò›Ê|HQSÊìóPf¡7•Iš4Ùð—–v^7ÛõrßÖ’Åñ?àÁTæÕ”ìú7•ÍÔ¤ñWyX²xcb¹YaÍPTÊæƒ…5Cq¿çU¾ñ:\û=ob=¯¿Åsýÿ`Ýâ‹“Ö^\=ùgVÍdMµlì4³jfÒû?>žüž©&¼ë%¥n+¦W(æf³Y6 i¨Uîÿl¯¿Tü%M>¥]·0úœðˆ ðˆ‰Ïï”8ÓKe¿&JlÙñ§ƒT¢‚ã¥ïÜý¿T¾EfºO--ÆŽuâö…ðDÍ%Õ$ÊžM/„è^@g€øÇ:ii `êÁ´²~¡,þ¯_ØFéR+Þb ΚX{:S~¯ËNéÒ.M¹=ªôŸ»wA¿Ï›½è?jJmTÖ‡£e¨o5ÓÕÁç…Ð×o?mõù0º“¶ú|¬¥ðž»î… ¸:,l=œ€¨è_ ¯Yô¯*—²Ô½Âæo8à:‰i+í¬Übí-µþ¼b‰u>-ëŠ[K”Ü®}Üæ‚?XéÀUÙªŒ9ë`G?â;×ñ‚Ãä[äþ¥Ž8r•¼.;S¯Ÿ0€<ÞðV¹û}l×.£ãxñE9îšaaló–qß}}Ÿ$U_WqqlüågŸ}ÆÈ‘#ûÌÕÔ¢~€+/¼Hn-âgŸŸnWM>‘…°_Îb­ßÇŒr·0Ã25ÃÈ7]BGœ§„ò;cåßAý¼/zÅû*ïo»]æ7E¿³ƒ—`·ƒÉôdòÌ)_ÿÅ¥eŠák6ÂþaÆQ\Z–uý‹û¿Ò$›ÄãýÓ àO¹1`àD„Ëå’î¹çþy`?Có-œÚù;wÒúQ77NMѰshmÿ˜ F›y~ã«|b‚/—¿ËŸ1ÐÌ‘O#ÜXMÛvÑùA;ÃÎλýÿ<„Ë…ÔÜÜœö³/‰˜6nÜ(Ìœ9“5kÖPX(;’ÖÖÊß„ð_@mõØ›½˜FpPúÚ.g&êuœÍ›7+Ž—eeeÔÕÕ‚³L!„ÿÛ·o§££ƒÎÎN%N˜#ݱ3Ö¡Ôu°vú©þc„@2#€¾"^üÐÒÒ¢l«Mš™N¢ùú$€ÿƒ,úg횬¬U ÑË´¢…»a¡²¶M—G€Ú–nΫ•xã€l`6›¥¨ ŸÊJ55͸\@6Ù ²Ò¥Ä?·FVbem†Æôü˜d•bǬØ>M›©-ûiaLŽš ¤-ߪÙrÔø‰ã§üBRbù1O³8þäiúÊ_ÛP«â× ¬X©m¨%U|Œ¿ïÏN»úÖ0€„ÓiÂ2±2íÁ^fþ‹†]ô Û[eQÓn確º´…þzðc²¹…Ýiç•aá´…þºð# ¹¢ÿ±1¸zÝ“Ð.D†×P Ú6/­--À€„µg– ÿ°‹b_¹vøóÓ'á°Ëaj‡B&²l‰å WôÌC`rÑñ‚Ãã–ÛFÉÚGÙ ÿã!Œ?n¼ñF%lìØ±\vÙeXfÏfëÖ­šóÿÀ­ò -›ÃÙ£`îxD$1ÕÖÖJâ}ê‰Y×(& ¦ýL—†ptü$lÝDÞU—pðñ;ÓoGfá X‚00öŽï° v©~Ÿë ²®RרïKp¾ ^¼f³([Z­²´^t¹ёéKKõ¡w‡!ÏDÀ¼)Æß­õõ$0y!èÔŸ?øô§8nHðèëÔ­Û“‘|O4)iÜn¾ñ;q>8GwþÓ·}ÈãÎc×®ƒ˜Íw*ÇßêSI#ýŸFxCÔ9ËuçW}ÉZž­ø´þxñ¿€×eÇYã×äï+¿ß†äò—[gÀSCÝç˜?^ü/Pn¡Oõï[áNŠ®ce S)µ€€¦¾QÍ8'”ºP—Û“2 1xð`y×UƒOÝÅnBQ“«d3‚ £õ>Øív|Qá¸(«­­M)'’ p¼“Ü,Ý´‰¹sçâYU¥ˆÑ†.ÕÎFW=§š•+W2iÒ$&nÚtÁÊ•üõþûiô¦žM6¿{’›MQþtŽ]ÍŸ©hþ{hüS1%?oÂ:ø9jWý÷ 7¾µgR}ïÙióW=x÷ŒÏ©]õ5ÖÁÏ1ÿŸ*å’zÒVæÿy>ù¿SZ⢭¨-&@ û¨žP͹Iê?)ÿ–*Ü6YÕV$‹iò›™GÏï"ý]ÿ P Ø‘´÷Ô¯¬ˆþUù3`KÊ_µªJáÏØ|£æʶ„¡§o|ÿû‰Û©úgûZQX%+3fÌÀl6c±X8|ø0#GŽdß¾},_°œ®®."‘ˆrÎõ„ÍfclÁX† †ÕjU _ð“ x÷/òð¦¦&ÚÚÚhoo§££#«ÃBÿ|uÌL÷ÿ»ÆË®ùXæaˆxI^ üº¨Ø]à§ ¾„ÿó’G)/|Óu*â€Ój—RX!‹ø¿¬XÈÿÏÞ»‡GQåùÿ¯&Œ"(tWfP'tGÔU\±»ƒdÅH«ì,I?‚?w¾3$i@FEivfgV0±/‹`w¢ó8~¿¹ìêbÆ‘tWg¢ÐÝ0 :*¤›xÁÁ5I#Š õûãô©®îtîÕàÌæý<õÔ圪w]NUªsÞïÏá~ðKÑÿIw9çzªºo·§ÒÆt„'Ô#oD¹‰–=[‰PM[™88YÕ̉Üy¸7ÿ-¾>~m:£[·q"wßô¿6=évôR X±bøü>,ª…ææfÜ…n<¦¸È›ÙÈy7æ#~Äþ¹žò›p:œ477âLi~iÜvïøƒˆ’%E¸Ò´„ø?üžF&ð!¼•u}ÛÏïK ¿^à+qüŸJ¹àWñÛ3Ô¹'&ðÆNë«4å©áO«öh‰9Oqzw|gà´j5%ü&§GØCLk·ÃiÝ¿“sðÇ_±Zˆô+VϦd‹jIj=—É/ÅÿS„šJWÜvzüÎgœÀÀ¾ø&Ø… %øLlª/IMùÓ ü¡çóÿâƒ~½Àz¾ÿU.2œß™ãÄ5ÏÄ<Ýù·Z­Z³þ›"åß™ãĨÓßþŒ°«`‡ Õ#—2øòŸˆ°k×.¦Nª‘HÁ©4¯¨¨Ë´<»víâÀýæ ÿ{ æ?ˆé…dÞ<Þ¨ãk2ñ¼É?/¿K®;­}‹ë·Û[ý§¨ÊmKuü*Þ|Uþ®Åû‰ü2±òütªü]Ý·ÛØ„19ªÑµÿTÅ%[°à¨ÖoKªñ¾¯‡Xÿ¶;BPo&Ïšôts4ØAßFÛmû°urÍÞt˜"ÚÕ¿ï³É`ñ[ˆTG¢âþ„ûÎøyMôŸáû>K·íöÖ Ü´1Äu8hÚ¨;6;Ø¢Õ»P²€º¶æSÄÊ_ÀÐvU¿ÝÞÊߊ+´ì ¾)B@û[›ŽáºÜNYY޴㼇ð\a ÏÛPÕÐ}»½2þ?Á? ‰ý÷?ü0ãív¨«c¼ËÅ~‡ƒ+￟?:ãóæ6 ß](ÿ€&ö_»v-YYYÔÔÔ0cÆ , ¸Kâó6ÀïÍ·iòÙë¯.ž㠬¾ŒÒe.ìŽùeõx‹âóVÀŸV ÿ€&ö¿i}+]ÿ5õuð㻿æÓi­¼v¯0Ðçmh°™?Xn×ú”H±—?ÎqmØrtù!=_˜èó°üéÑ©bj¨ñ©KV¹©Yç¡z€Æú5&¤à– ž{ƒüKÑsP‹Âݱ[À¤ ó~þóçÏg·½÷Ž˜æfiÍüÞ|F eýÝïÿð¯W‘së:ž{ ¦Ž b½e™#`ɪäÛ êêêâ¬üéO"ÂÒX»v-¤²¹3Qì/ç8À·ÎåÍ÷Þ'hp!è-…§÷'ïPЩ¾MæÑþÚqšn¯`‰ÙKá¾× (ÆePo A°Á³ÏÎÅf‹å*zëwšxþûÛGu X²ÊÍë|ßX}ŸÖ5kÖPY)ÚYä;*qüË_þrÐ\É Eým+¹l§ÊÁ2ÑÖÁA.däúÏ88£’‰6’š)ê?~õ[pٕйR$t®äÔÇV’V¸>©9€¢þã!Dý7ƒ4 ŽGç“™)êÞçãžËృP|.pο óù(>—¤æÃÆ0†1Œa cÀA¿)†‘JH1›)ŒðÚ#¢bþÒ‘_âûfz™‡ókÀÕ{Ú”@vºŒD"̘1ãŒóK1ðË·´(„gRÌ¿¿õ î¿'¿ö{‡ìhqèÐ!ì½Yà§RÌßÖÖÆ¬Y³Î8?Äwxp8LI#SëÀ÷©Á~›-éÏþ7ƒÉóÍ?qâĤîÌúàFóë„hÝÛOGñòË/óÎ;ïôšgíÚµqTC…¢(¦ô …Ø2=¿®®–^óWYÉ+k#P)«*LÛ½{·6HAý† Ð#‘ˆÉãñP[[kxgl§E$¸^t‚‘ãH$b*¬ê¤Êßg0THñ¸¼@ãb¢ÿèX.—Âÿd¦ƒÅ?,Šï”X««ãËFbþ#Œ)bŠÉï>œþÎ$O˜"† "¦ùÝ=²t#ùÓÓ»zþdéFòG"—wâÎ’tCøuh©Îîñ½×Ìf³ÚRmÈ» ºÈÚã{¯7þê"«!üÖj+6‡P``üÖjcøõ˜2eJ\=ÌE&ŽSïæRåqm^FÆNöwÅçò¿oÑÍ„H?Â|Ó «©üë¿6i¢Ë `ÚÔ‡M¼^Ÿ0™„à_oГ1À@!Ív233µaÆŒüèG?"++‹¬¬,MÖÑÑÁu³ò7ÑBGG×^{íÐwà CQ“ÞHé™Ûçpê·µ³Y[&Mú‚¹­Mk¼õx<ƒ¯U®íéÑhã jKý‡ O ¯9¦Ü´”@(hç¿›=H¤"5àRÌf³*‡¡ðŸJ>cnŽñ?eü(‚©KP ŒãO4Ü«;¿L›¶ýÈE(h'øå[ØìAB¿ôú¥矪 ã?¯õ“¸y³ùnmú©’ Úi«Ù'Ž¿æY–Ö<‹¢c㪠¬¤éßš@Y)ÄǺù«6RùÈg8ó?Æ×0˸„I·Ý^ù­¥Œ››'„´Ñçss3îëÜT¾Z)ø­BäbQ-”lû ‹j!ã¥p´üAå«•Œ¿è.íø Ã‰ÜyŒ››G©µ´gòoÁùï %ébð4zX¾n¹6qóžF–×0„1™;ÍÂXáéJU.Ò n¾òéJÖ,Yƒ¹ÓlÜ·_“O áê âòûX¾n9s2W‹ä'§—¯[ŽËïÃÕħ„ ýöü¶áÀšÀN?=$„1yó ¹^wþl%Ñïº2 Vÿ‹jaü´»¶©,XýÆO» ‹jáÿÌ3ßôFÛíñù¸Oý·^Á‰ÜyÚý§óËû]Žƒm*Õ‚w›ª-?×SʼnÜyšø?bŠÄm·¯s  Q\úþïºe;骫'­…,.­‰[–t½$ÛMÆíóûb"ÍhÞœœÚÛÛq/tsÊo‚ðÛL*}ƒón<ÌCª…ón<̤Ò7 ü6§ü&M$¯=kzØî`øsoÏÕ¢Ÿgffrþùç“™™©EAϽ=7¥ü>¿O‹þ=nÜ8Mœ™™Iž%Ÿß—Rþ1 & ‹G ñÿ7Çÿ©”Å£Äò1H)?åBð©F«¸3ƈ Õ‚–§–?­Z%’wßwü#rž‚¿&ßwü‘¼‹H«VSÊor¢EŸ`ŠxÞÈ(ô2òú`ùKÖxc"}ó+]ÔTº09éµü›œPS)„°«g÷ºÝþ¿<ŽÒüR&T_Bé^죮g‚ý\¾ç8Âû¹ØG]Oé^‘žÂóÿâƒÝëùñÁ¿N)ÿ¢ÊE½Þÿ‹*¥„„ùÒ„êKp/tc6›™8q"™™™Lœ8³Ù¬=RÉ_n…ÏèÇM"Ä)/ØÅü燡Ü:þ$ÆŸ³gϦ˯ Íçí¿ŸDu‘•.¿¢ÅÊu€þ†œ>^¦ ÿw øÿ‡¼è ¡½î<ù¢Úö@¨uľÛļüþ•!O•zÜnoõŸòüt¬EB¼¯}FÅÿEUí»Gîƒú‚+~¾Nˆýó3"šø?bŠÄmw ç¤¯ö¯k±ïý ×a<¤–±Ë¯`·Làj6›Õ.÷rÑ>(°oJ”F´óoñ[ø 4‚¥ÌUâ<}CŒçï± ì:»WEÅÿaâüë·Û#˜NÕˆrrª†¸s÷û"1N+AÛ›æï±AU¬üI†= =n··òçv»™3gn·›ˆ)BWWÌÍÒêŒUºþ=7N–¯««‹ˆ)·ÝÞÐuB@#Q3Å# ¦Šú|Fòë °!ö|K|ÎéóÉïLPK“N½Ygb>#ù•‰MqyŸyü;qãdù ½þEñÇj Ä“å(2Hcë³ }‹ºþ‰éBÝñµ¸î_{é8-–‰iÓžê1mäz•C¡ÌÓ‚S;zþŒìMìßÛzýÅè#@/¯” nìeåÊèúCÄù—öœæþªçcìm½a cÃÆ0†1ŒaüïÄȳ½ÃèmÑ^ÿ·ÙéÑ)sÀÈÑ<}Å[§³ïlýA0ê|=ñ0™[ö !£é Dü?˜<=!øå[ÿËuŒÀþVñ·s âÿý­_0Ú ~)öˆø?™@|°hkÎÿËu†1Œ3‰¬¬¬”9÷‡ êß®!ºÝn<å.‰˜V¬X¡ÊèzRü¢ã”4 0RÌßPžAaU§Æo-²¨2º†ž??#¢™ýŸDøôŽ‹7–c]X¥F"“ÅbÑjr^Šÿ‘?“¿7´}PÅôÂÖ2õUk¢þ––.@üÔÙMà• i ó½°ÕØèÄ}‰ *’(úT$>PØM1Að`Ò‡Š¼¼ohiéù³ÁéG]1&E1啵©²S‡-§”§|.ôaDJݬt IDAT—–ڱ唲Ÿ6/Q”=4'xEQLeõaµ(Ú§hÉAã»{A×çeáâ),09`ql^bê×Ç E1…ËÂ*Ñ`—Ü¡„g«­ÈÆ%·Ø´ym}ÇÐðE1ƒAÕn·k>#‘6›`0ˆ¢(L™2…;wƪÿ*Šb2›ïV•½C´‘ùáÇö]r õÀÞQÜ¿ù:\Wï‹?ü´íÝ×ë¶ûƒöwGÀ§iWˆþ¥ !¾~Ún‹-³©ûüŠŠÎÕ—_~™ŒŒ m¹þ~–!SÌßd‡R{ÿÄþééCS†Éˆk²SÔ /¼ˆhlúŽRáp«ÕÚ-‚F¡(ŠiÙ²eêæÍ›‡´¿uuuƒ~÷Èë±yófŽ;Æ3·ÏáÇ›_aÐ8£ ß0´óì²S÷uίœØÇÄ–Ù¿3pþ©š:sÙ£¿›ÍfuOÑ9t8¢ \±4EQL^³Y­*Š=Sœ^;ûr‚Ün‚ ¯ô»J¹ý¨HÿP…Û+‘ßáç77ÇóóíŒl’fƒ¹Ëmüç+!ŽÛDú©0˜ëË/žáÁ;c?E1Õ™Ëâø]OúúÚ(ý1Ø] ŸÆSßè¾gü¾&1~!nt¸ž?~óÝñÇï}‚˼!²KàõŸ—e¿9ÊþÖ´ÕìÃl¾{he"÷©

8þ$yƒ*8³5–c/va]XE¸±¼5Ô—Çÿ›Úcr·;}…Bñ¢~„áÛúõë),,$ ±víÚ¸÷>*g¿ø…PF--( e,¨éé444P\\ŒÇãáõ é§?åõà·ÝÆž|’_Þy'3Ýn^õxP.»ŒÝ»wS^P DàaL.¿Oõæ—âê[Ô?'''ŽíÚµ¬X±‚-[¶0gζlÙÂâÅ‹µTò»·@Çßm»½ñÆó;ó?ÆóôŬ¹ïB–¯>ÀÖ'§2÷?­MN.Ÿ¶‰Ö&'¹sëØúäTݹ gþÇÔù/¦´ðsš›{Øn/üãsïŠ -¨'rçÑÐÐ@I¹—åõ.¶.ÙJQEG›ZðϽ‚p}Ö¹yä——STUÅøÜyŒnÝwüGxBŸ{>ÿƒ:ÿíííjånÒ¤IlÙ²E‹üÕÞÞNqq1‘ˆû+Š2ðóŸ Ñû?lÎÃf³Q²Ã¿Ëæ<¬J¼éžy–[”ý®–¡?ï¤ôôtE Äê3cÇŽÕ¢ËÎú‘HD¦¹>¢G©Ù†Ýdâ’_ü‚k?þ€ÿüæÒöîå’ øèÅ!$¨ªÂÀ(„1E¬Õ¢Z…Bdff’••Ezzº&¼D"´··k‘ˆ 5¿ cj¡E%‚ö8ÕC!$[o0\‰‹öï®Á6%þsÒ]o¼M¡ÕJC8Ì-þè²}ñë h_t÷iâý?:jà¿õ ò_zÿ­WPþR˜B«•ò—ÂTÝjÕ–ŸˆÞÿrœt»8ꇯý- Jl¨9v“àøù.¸~þÜÕ¬ß ý¦/¹1Li_òt§^»‹#äŠòùü¾¸ÿy ž»wïÆ‚…ˆõjøÞfÍÜcÿ!—›9à›Ö«µˆÑ ëôïÙÓ~‰ûÀdddÐÙÙɱcÇXT¹èŒð·DZÈ#ߡТÐÑÑAK¤åŒð—X#†Å¿òq¸àW>þïÕv\]Á3©‹`Ž;§‡8ö˜B1ajªù--"\Ä÷YÊžâôî¥|ø+,-Ÿžþ´ê§ÊLƒ*v\ƒp&ÒªUCøKÖx{à§_åíƒÛ‘ùõü½Šÿ{9þææfmÞ‚ß÷]”~à…û®gÞ#ãÙvßg¿| ß÷]çÿÛ~ÿ{=¸ºÙ±c‡öKQ<ž3Â?fB„ÏïV…‰v§ƒ&¾¼[eÌîÿ$­1iÒ¤¯3˜ÍfU©V;ÌW‰i€´N8•-ž}ï:\Y&OJ‚¹y`ÿ’o0„/á8Ž`·ƒÕj!Ž7—¨Ù£‹­ÒÏú‹êÍ·Å ø,¨ùBü/Md[cøÅÙXl£Ëe»cy~º0H¶Ý! ¯ö-W©0¥*E1å—™Uôzc‡ ×ľñ}^±ÜçÕÍG!ÚŒð „òꥑ˜ß‚qD°ø,Dª… @¤>Ë ÐñÛû¦À5{ÓaJ§X^„ÿ,Dò£&ɶÛË>$.²µÁï<-¯Ù›ÎG3…©Àü½6>ª ©Ž/ŽˆƒÀ@þ¿„1-_·\ÝèÞ(Ìå˜0£ê³Ø‚A˜ ϋѿÅ\ÖF˜±Ûî ù_Œ:@L¾ÿ~mÙ•uuP׋ÈÑ@~Ù¯B/öíóYg ¿4ÀÈ/‹5–Õ‡¡¾—vùOí¦f¯Ý›ËÑeÔ¥óZoSù¥ù{z~¬oU^Yý¬úËŸ*¦†Ÿºd•›²"`'C™ KJi¨ñÑ©kD8Zç­wâ<;£ÿä-76ø{J®;ÝÑ÷óô©’Á€ £º`Ü¢¬QÆO¯ƒ[âÓw¿´ŠOÖÉKVïLj£ §Ç™ùøK…‹G™™:u*€6?â¨q‘ç{3R&Éð䖭ܹx m}o'þå_þ…ùóçSXRÚmÙÌ™31›ÍX­V-(ÓO~òš~×Ê¡C‡´ºðÊ•+™?~\ ¹@¾› >ˆ0°‹èó¢|Káéužî£w®äÖ8ö¥9ŽøÛÜ_‰1Åò⻯7Œa cÃÆ0†1ŒaH |‹q ¨+l€ “úc„ÍÀ¾!þ¸Ô}¼-„üµbè @ç®á‡†ðßí߬¯«&öx²Æ˜ã_¶QtzŒD"ìܹ³_&‹…MË—¿â|a¾üò-|Ïøûe`u=þ4Å~ë3â‡ÈþÖ/xø±=ý2˜œ{áÿµ!ü¾VáöyèÐ!‚Á`¿L&NœHin®!ü¹¥âGl[[;vìè— @vv6­>ßùQ]d6ø%7Ö· adQ¶¢M ¹Ýú¶0—&iëø0%ôREѦ„ÛífÙ²eÚt"ê¢ ÁN§S›6eeyÚ´>ÂyOˆtžÐ äôk×®]k(§¢(¦ôü6µËŸMzzì8[ªcnûú†XYNìž““£ P£bUßÁIÂb±¨2jŠaŸÁýílÓ#~FD[0ÄàâQfö$á 7ŠÈcáò¬UÍÝj2ctPÒÿïnñ >>LÈnbñ(Øâ²sÚÔÒZ4·ž>`sôÕµ¯ô¡ÂÑGDó¾Ò‡ )òê©ã•ËžZÓÐØØØkº‘QôÇfº÷,B|ØrÄ{:´Û§u1êºÑwHjì»ï›M˜¼¨¢ûkŽ‹?TS‹î; —_Õ~ô¼XfÆ ÆxtÃÑ£G7n%%¢r^QQAIIIÜØn·Kƒƒ›%¡m÷n²srÈ,ÚA&PvC:Ù%;âÆ"ö݆ñKñ¿ÇœŽÿ›ìCkîììä_ÿµ‰þç¹ØM1{ôHl*ø‚Bø¯GÈ[€#Q¹9ìÝ»7n^ ýwîÜɵ×^ ˆ†F½øR/þj#äÊ•+yôÑG™÷Ø<æÁó“mÝ#z>p–aQ[M›—Ë=ÛZaÆà"ùψ Yw~Ô@g4jPP>Gô~±?–Ý(€WøTš--¹ˆ¥ÀuI„ôu.!üOÄEÑŽ+ú|lV”›èù#æ‹ (9¿Ý/„ÿ‰íssìg )6Ðó?ð£æÎIÊï½³4é·¸Ýý0zfp×$îøKÜпÝuÙ%×t[_~Ÿ»jöÉgàÊDIzÌx$=_ôÆ'^ŸX¦ׯ‰à‡É¹,mfó~˜ŸÍ› ñÿ|Ûa¶ýìÖ(yW‹qü6sìÙ+ëXzƒ%oôdØug8¨ŠõBô”üž¨¨_šÜvÛåÿóÏ¿g‘˜,ºÜ8þ0¦Uw Çë×8‰EwîbビÈ[Çûo.ãòi›hz.Ÿ¹wøÙøà$–¯÷’‘444ŠÿOÄÚ±M=‘;šz"(ª¨ ¿¼ÿÜ<ÂáV+Q3€¼¨Hf[Òãï—ø·Ö@a„+ÏûßrÝ’šÁãž§—'].·ò,y´DZºmo°âsô¿^VV–fTÕÞÞNWWŠ¢¤Ü|ò£_„ äNÅ–EÑ–žÆõÃîáp˜ôôô¸(…©„Œ|œ••…Åb!??ŸËÿþrÞÿÍûøýþ8î{<çf³íª+yꦯizíjæmò1-Mù/LiA>¢¾§û´§JùŸt—Su«0HfpÒ]ÎhOÕÀïÿ0ºuÍ­Íè<©87:> øÂËïc¶ þÏû(Ÿik–¬¡òé¨ @鳚øëš­TTTP\\÷~ìm›ƒå—"h@?ŸIþʧ+5°,ïg’¿äéJÍ`Ë—àê žñã—&Rü&ù-OWj&Rü&ùÓª+5ºŸ§š¿bõlÖ>¸@‡³{ùW_pa]°úú ŠŠœï à—ǵuÍVé>j ÅÿéçÿÛtÿW>]‰{¡;Nü&ùÇ<])L‰ÿ ãBQSMMÚå•)Ÿ7þg‹4?ÒÃçµñÿîí®éùfCÿýÛcßQ`[rñ?ˆïŠO1΀<úý Ø€Á€RoŒ´y{ŠL¦@€*Ï}²^Á`TŠ$ƒ±}èXµ¢b}9+êŸaP5(BŒo°pÍÞtöM銊ÿ;5“€J£¦ºóß§ø¿‡ý YQec©Øêá£*± âˆ>S”?[•ȳ§(Àuƒ/Ë×-ﱇY¸N|ûY›„é[xîØ¸isYôt·_âë>øË¢A5ö?ü0 ŒôÓWÖÕQt]#ø·oæ>²EEEEÜtMM ³gÏN]´MÅ_-ÁóËêã¦ËêÃ8­Ö”ñ› ³¹›Ö‹>Y¯Ý›7}A]:ÊÄä‘É ¹þQ£ƒ.¿¸ÆéùmqÓyemH³øAñ÷£Ú“‚NÓµ!õ¡bÔ†x Vˆ0;t¿¡ôf ¸²åQ®g´Á™B¸´”ŽqãÈ!ÄÜOnÙJæˆEÝ„àÖ[Öau¼Ê‰·ƒÊÞqjM:ÀÐx§Ç™ÙµkÏúýPQÁ;ï¼ÃUW]ųë7²9++Ú˘ŸOÒð6AÔ†º‰þ8À¤I“˜4iϽԔÔ q;}!™H¼'áø@–F|.#¸gee‘9ÂCÇi!¬‡$†:tªo3yò!öïÿlP"üØvžeòä É!ž{6•̦nÜ6›ˆ@þ¡îÉÕqJM1þâÛrþ;UL¬®Tï{p ¬®ä¾…úõ¹—š˜që\>L²Îs*ÜQ+ž?r½?×ç ™h8l6ìŽö¨á„tZÉaç‹§¾à«à¹œ Âä“¿fÿþ‰†”¿…ª0¸ 2ûK£g3û\!þï8-+Ýv­þ+ XÄuhD5XBÿI㉱cÇ’‘‘AVV“/žRþ³ßü÷'ÜrÕ(Åú³œøü8üŸd_4‘Ì¿º¥ýcÞb+¿õAǧœ6}FFÔù~ÀgŒðёӌ›ÆµÙãhÿôÿï× ÛG`cëVñj„ lݺ5nìt:Ù¾}ûà¿Ábâ2Ôem&6e«q&iÓžŠC•Úr)þ—ëqp÷tè\ Æ›ôMô]oÐû ùoFˆûõ&À7ÆÆÇõu1y:äzCäÿÓ‡Bȯ7peÒÆWè¼²¤èÿ±¨)À®Á0†1Œa cÃÆ0þ¢0lðg„þˆÿ%nÊÞþˆÿ£ØÇ³Àà~$CÄÿw–ÀRãŒèú%þ—X¶q#Ë—/ï;ãÐñ¿ÄŠó÷âúÓ”¾3ýÿKXŸùû~ü׆ò÷Gü/ákm%77×Pþþˆÿ%rKKÙç3À ?²K6†ÕG…×eõá!G<î$‡4Ðö£ÍÌ¥ŠH›f‡û0æ,Ün7S¦LÑï2¼ÇãÁéì¡õyˆ0›ÍªÛíŽùÏž=›¶–ñ“bÑóCo:ðÂÖ2ÙßÐ(h"¨¹ÛÛ §åiü‹Eݰa€Aœ1nÉg@0BCy…U¤Œß¥(ÀEœø[áßyùä»óàÛ8ñ·.aPtOÕ|ÊOGÁ/¾Œ­W7ÄÈÏ ®í [ËÔXTÍ–/ÁTùŸ°ÖbH„µ åÀ–/á·ËÄ‹ú…­e†t Eíäû#ôe=¯ƒlÌè <Büd"³DÈÈ,Á”ÀåË…À"/¯÷‰&¾h›kL˜+æKí1áÈ¡`l >}ff&Ü{ï½üìg?Ó®­^ôðàAdÌ«Y³ŒáŸmH€M›6€£qõ=qùÒ¦_ÍxàÈ{¿Õ–™ÛÚë-[¶¬ßïºóË! ×–S‡ó«øú­Ky—ÒcWF Àù•“:sݠ뜊¢˜Êëuõ·"[%fæ‰~SKñÿ‡*ÌÜUJ×>F\ð+—šDÚ@Lúÿ4ú‰#Åÿ§Â@üç+!æÏ±±ós3Í*ÒbÐþÐ/EÝF~‹·gÞ#òI`<ßsà“ÀxJœïÿ€Lúuü5ÏhâÿóZ?!û^+Ë~s”M?Žm]ðë·Þ%»äÚ 2ñ¬qØl¨„Açƒ!p•– Äz~§Êˆ(ožàŸ0}OåÅø·ýìV\-!¼y6Í|Àp~‹ÕîæK©¨ÉíÊãò,ºœ"Dþ.»-Î üòØýÒÓ#ø\%ØsØ‹]tuY7–c/vás•PTå'?#’,Xõ …˜9s& X­Vî½÷^222X½z5›6mbÙ²eSQQAAAÿ ÷ I'áªæfÊ ¨òx(/(`Vs'¯?àºð!^à~ñÏÿÌÚµkyqÝ:väÎO>·9þææf ñx<ãñxزe sæÌaË–-,^¼Xšâ¥D€äkƒ{ÉH–¯>Àšû.dùê´69¹|Ú&Z›œäέcë“SYtç.ÖÜw!•|†eœqü£[·1>÷.õOPR^Ž¿ªŠ£M-X­yâøçæ‘_^NQUùåå4TUzü`Éó+Ï»áç?VEйã¿=ͳÜ ‰që'ÿÒ€„ðqÒ¤I:t¨[>ÃÆ„ 5¨ªÂð£‡wL +]c<’kŠdù¤ C*!xÉ„xFC/€‡*M/ðÿMì~K…~të6NºË5qÿ¹ž*Ê_êYü®g÷DLÆO»‹7}É‹¯btë6î 7à¹ýY~὚G·ézm¿ð^w‹—Pµ±u ÄgOÓ†&æþäjø+¬Y²†ŠŠ ©­­%''ÇÐû09ÿ\-ý¬ñGÎ.Ô›üìp§9ü–ŸÌ¾`>=+üiZùSSÎ/Åÿ«gST´@½0ÔÙ±.ˆ¥ÍŸ““Cmm-………TTT°¦x •O»´ô¿ôóÿm½ÿ%Îÿ˜ŸÌ…j&¤–?=_šÊÇ·èžôß¿eùÆ¿K{„'^i®ê5§ÀÉ á²Û¨òw‘žAŸØ »=$¾Ãìv±\ðOlå;Ù÷§¿‹òüt¬EDMÎ,BôoÕ™èÌŠªúÞæ@P}ÔôÖüVêW)x ìò (Š©¬>¬RoFQø«òË€RWHþƒˆówù!DŒ!A’se XˆäëÄýe1ñÇo#Xn@ÿËq_ÛlmÊûAz„P9ÌŸcƒ™¢ü]³7f†•ƒ¥ÌBÀA[ƒö5\gF©Î"ÿ TgN–nÀ÷wY[ï:\ÙK`‡Ó àß¾};%%%ÔÔôÜ©¬ÇtøëÂáX»gè1Ý~ó¡¹wvqA]Ï?W;»0'K7âúׇi©ÎŽ 4‘ˆÓ‡pÿuª˜j|ê’UnîXçá¹>þ¯Þa‚Â’Rj|†Š_ KJ7n™92º¹+a KV¹9zô( 5C' €6˜0ï09óç³{wò«ŸL8ÌÒ¥ó)¹î4¡Á‹€õçü¾×pÛ”.¬·,â¶Û’çÿb&ß]{ØgŽ€jàaƒ¾‰Ç/ŰS§NeíÚµìÚµ‹«®ºŠ]»vá÷ûã°=1\ýP±MøO»B˜ý&Šý€Œ2¬ %š4ý®U'ƒ>¿Œhß_#‚N“¿¾NÍ/ròôº˜øÿ¹—š¸ãÖ¹ñ™íQC€„÷}†é‡Cºþ¦ªÐD§ú6ÁàÕØl=oêëúÀè¨`åïÛrþ{CÓïZ¹ôosùðÜîiÕ*”Pâåõï)}ÿLJµé¹Ûs?ß¡\ÿÆê¾»|õˆ¡–¿FjÉÚóCC;~yÿ-þFSÏý)õ3äD¦òO#:Nf~÷"FŒ9ŸŒ´/øä³|oâ4ÚÚpÑØsP:¾¢óÝw8òù§Œs_ŸP£Âø 02ýbf^]Àsÿù çŽIÚ˜¿"üé>æ\ûwüÇvì}ÃétRYYIkk«Öö"ƒ¡éÇF1«u^N½¹”‘ëUθËv~†ª“6\¶ó3θ‘ë?ã›{M¤M{Šåö¥†ñpðYÒJÿIˆû¥°Ÿõ±ôŒG¡s¥fpÊ÷+È0®Øè»àÄx„¸_ û€cDŸ^Ž.šŒ>' lšùÓ‡Bè~¶ª û—骺÷\&ÿç_&Ì<ç¨Ôö¼¹a cÃÆ0†1Œaü/ŰÀŸü„n‹þˆº&ˆjHòŒ~JD?¼®é4†?8@!¿Ì Æð´CŸÌoðË·•ß(þý­_ *¿Qü‰Lû›ß(þ¶¶©Ùe~£ø“¡¥º»À1•Q !&2ÑØ˜È÷f "ô„wÞy‡={öÄE¨MUô1EQLG•öfÏžÍöíÛq:äå¥3{ölêêê´å2_*Äÿú}’Ñio¿ýö”rõÄŸWÖ¦ÊF×Tð÷f&°aÃ&MšDGG;v ·Û­EBK58œ§JÑG%/ÏO7ôì‰ÿâQf˜UÆ;ïÌ#TìâJ Å3¸x”FIÓã÷å´7v£74„),´R^Þ ¥å­{“é…ÿ=‰š¥ðYŠ DbtÛdˆ ¿m†?‡í¦¾þÞ`(.Z¸‘p»ÿ‹ÅBcc#--É?6n\ÀÎ;Sf Ë_2‡CmÚuõ¯`Ê—dçäÀÞQCll¤ñÄTŽqá{#^qš uéíïJ¹»(RŒo·Á¿o&®hT¨ü²þGÃJŒ:¯7Ðx¤Õã!ô—f6„€cÇŽØIˆÂjµÒÑÑÁŠ+apðàA-jzz:#ŽÆÞ5¬ØùEN-jΟ3E1-[¶LÝ´i]]]š À× &É0Øs®(Š©Î\¦ÆÏשÒ ø”r¥Hü*ú¼;gèp}9•bôIJ{{BIn; Ñž¿üÊcþ´ IDATÇñ*å" ûW>ÚNÏŸ–ð Hkƒ¹ËÅÂcoÀØéÀt16@#²þð'ñžÄîå_|ÏÿbŸËáàIzé³:(~)þ—Øßú¯ÿü»€ÿßrý•Ür=ü:÷<ö·~A‡Qñ‡CÈžØO»Ãg üxC+ÿýÌ8%Ýù½º|Ϭ0ÖøOý»^¿,ÕßÞÏ?ÿ>žE—Çê?ºº ÃfÓD±Ï?ÿ>·Ýv¹¡Ü!ìéhBÿ¢*?áFñr 7–Œvµç8(Ïâj1^è 0“™¸ÝnY±b[¶l ¨ëé_\\LåÓ•=mfP(,,„;h-(à§6làÆ+xå•WhZ´»ÃÁ«v‡ƒYÍää\)mذŋóÊ+¯0gÎÍø U$÷’‘xžþF÷7=—OîÜ:Þs—OÛÄšû.dÑ»p/Iå#ŸáÌÿØÈÃæ{<¬™¹†Úª*!r™›GþKï±øÖ+¢¢—*‘¯Þ…3Ç™RÖ™<ÿa³p]³îð°Ø£O4ç¡$Y.סËH €³ Ÿ¢Ô,ž}%jì×^Ä^ 99ŽžV:˜ZhQó,½8àEÑi1Þ€ Œ jGGx=Z’^ˆ—ß@DLþÏ/çL jø†p˜[n¿›ù•ëøô­6Þôob~å:‚oL3\"w£=UšÈ_Šþ ÑàDîB}ßKði™‹ðWVRÍG$ÂnK’ƒ„¢øÉÏ7sá…S_)ö)Qþ½>‚Á ÈÏ7kùÀXSŒåʳ,χï_¸šŠzF|„Úà…Ó.NM|xœÅù@4ìdc ã?ÛǶËßÙæßõæ.*VÏæºk„_œ WÙP_ü*Àžß;Øó{ÈÏßÅ®7w¥äü¢~›žžÎÖ5[;vìÿŠó¶ùW^v7ÿò‰‡Qòþ·ÏÅ{éyv€yo|Ì=ŸT2ê²u<\¯‚=‚ÕjÜóïlòKSuin^ß&Œæõ}"¤|²ü†¢ ÆÎ òù³`J¨b(E ®‚ø¯C"-NRèo-¢¹L/<«/à¨6öû·(€AOE1™ËÚT)ü·ƒ„ªí„ç¶am:¦å Ï‹R-$LÌ(Àˆv¯+ëêT)ì1"ÿûïgÿÃkù&ß?ï:¼ý$óÁ_SS£Ja{{;%%%TTT°víZ-_EE%%%Z¿™ßþ²ú°*…ýÁ èw“_V¿ºHË—_VOu‘U3¼ù iw¬KW¥ðÿÔ®ßqÜÙÅk÷¦sÓúV-ßk÷ærÜÙÅ©]¿ÐŒŒà×÷1 TZª³IÏo£ËŸ­åKÏo‹ë•Š>)ßCëû\ƒÕjeâĉdeeÑÞÞΡC‡‡Ãqõ»#„Ñ °¾¢ˆ&Ê{`½eù`÷K«°Þ²..ýDt:üëU<§®ã0ÆCäÅï÷kâÙæm·Ûé2àŸ[§ŠééuuÉ*7KV¹yz‡ÆPHÿK1¼“&MâÍ÷Þ× !CÂàéužA q{?'FöHÞbÉ*7™#<<¹ek|B˜è>™90áê&:÷/l¶øsÞËô鿎N‡BP¢BÍŸ>½‰¯ýõñõëä5û?>Ì¥O`§á[ŽG‰ —ÒâàR“Nð­ÃÑ•SA˜|ò×ìß?‘É“qøí$ÿF‡ñg…ü"'YYY˜Íf¬V+cÇŽín‚09vì˜ölooT¹?ò©pÎûW—rôé¼Þòºþt’ì¬ñ| ú¦i |Ê•ä«o¾&ó’Ip, œàÕ·šù¸#õÿö(Àëœø|'†îL÷ÿñÚô£>ʵ×^‹Õj¥½½›Í¦Ä¦l•{Sˆù艶Ø §Þ\JÚ´§8MË^¾†ƒTœzs)›² 섘ñ(i…Ñíu®$­p=§v< Àè»ßãÄãWˆå¢jÔ,À ”/ÉéÑé›ébÙñ×aç!Ž¿M›[åÄxÀ &€ó/¢~"ÿ÷L&@ÅsŽŠû+!öß„XþØA•÷LÂ,`Óeg4Ú0†1Œa cÃÆ0þ 0lð-‡ÿ;ÎV]^Šÿ;‹Ï ½ó»¼½çKdC÷Œ3Î ¿ó'ŠÎ¤˜ÿþ{®;+üRÌo·Û{Ϙ"H1ÿ¬Y³Î "¤Ã·Œ†¬‡ìˆQ”ml˜dÉ¢|hiÓH¿Ç#:¿¾óÎ;ÝÒdãŒì„bÌf³&þ׋ûëêD´ÕíÛ·kã„|C޼™ˆ—_~™›o¾YUÅ$Å‚’Ãl6«ú†éTC6ЦÚ| «««[ºþb÷îÝD"‘!í_WW~, ¦‹¹¿ÓbÅÂR>ó;DdàO[­_±‹²°™=ÑG¤^ø_g:¿^üÿÂÖ2~Rÿ3»¡A<“:áý [Ë i€7wŠgJ¢¨ŸGǺ4™ÏÜiF1à9$ù;>éùõirÚH~Gžo°g~}š…ÉßÞÞŽÇóßè?ôüÒ@/þ7ŠDùk©Îæ)_¥¥önÆ7¶œRB»ã{*[öÂw'ÀMä¯.²Ò¸e/ wû-09xQ7¼f|gÈô˜ÍfÕZm%TÂVÔÝàâ’Ûà£çã×ÑÌ Ä¬Y³Ø±cv»`0Hff&ãÆë–¯££ƒ`0h¸)Ì‚g¦òâwɨÖ(T'ϸw”HOÁ{)ëÊÓ´¿;¢›„08É€jj¢ €Û½GDœ³ëŽHÞöÒ “Œ„­Ÿy}¢Sf Þi|âº~ÚÒ™™BðŸžNzºˆø2n¢…£‡D»nVáp˜p8¬mg°çàå—_誀¨ yýM~6ýJ~þàc0ýê^×è9—\ɦ{„NøïüÊI¹Î:Y²m$Šÿ%:]¥dx…à?;j ñ_GþÎlð>%ËŸ(þ—hÚbîrimpŒ¨ @ÇËÌÕÆð÷ôôš±»OÂ@Âï ’_g7„?Qü/qãÏþÈë?ÿnô{]˜Hdí€úYƒ*2²¼D Pƒ¾*âõ‰4‰Æ<5Eâ“üϬȥ¦ ž"ÄüŸ&åõújøù¶Ã·±|F!¤€MÔ0Ñ„IÖ½ì¦îëÉÛm—‹m†B¸·¾7*ò÷C<ÿüû‰y)þ7Š_bɽXD›*ÏOצåXNá $ݸë¯Ç«¯¾ª™²zõjî½÷^Ö¯‘ jkk9zô(N‡“º€qÞ¤øû§ütéRnŒšÌ™3G‹_^P@Us3477ƭ篭­eíÚµšùž_ŠÔSÁ¯ÿo}r*sïðÓÚääòi›hmr’;·N3 (-ü_ÃÅXÆ'Àohh`Mñjkk5ÌѦüs¯ \ŸµHˆ„={<Œ¿è.v,þM&@Û²e `íÚµ) µDZȳäažåÆb±h¾÷< ÁrÝ’ÚòH$¡¢iò …ÈÌÌ$++‹ôôt­³±4]ìèèÐò ³Ù¬º—¸©|ºG†ƒ“)ÎààÁƒî…n<Õp>hõY y屇ÃáÙ½ÆÊAff&n››’’ü~œáeGG‡¡×]—¾ :ü-·ß À®Y¥åÓÆ àG·nÓDþù/½GÕ­Vò_zB«U3H¥øü´»XpÓ—ØÛ9~¾ƒ_xáçωô±iAṉcÚÔLŒÄîÝ» 54(ÖFÅüký€ßU2ÄpTäf Ø?ü2ú¯ "´­>ÄñHa{À,TÌ/Ç$Šq¶ÿl—¿³Íï÷+øýÒÈp{t@7ŸZœÍc—üÿ›¯ÿ U7Â÷,ñ·V º8iú_?Q«ÙlfÊ”)"Úm[Le,ÿ*Šb¸PRˆÍªR-žqÇÞ2옎Š^j‡.³®Úin6Fü-Q³gÞè¿Ýúòˆ&<×wK°—ˆ¼y§qµg‚ÔMü_dâi°`»f`´øßÜi&°âõ…€Ø1éÛ|^Ñ&¢ÿÖþd6«]~Ÿ×F©+D0ÑgÒN·È¿Ò zŽ–>$Šÿ-Etü6¾)ÐñÛß¿A—5 0ŽˆƒfŠ6¦J#¤ÏÿÚ?šÿÛªDù ØÝΉQ"ÿð\Ñ®&Ç6Ý…±MÞC˜¡·»%ƒùO¾ÿþ¸ñ‹:þoäº:Èo­ŠŠŠ¸±>è€%…õay˜ùeõqcý}awءޘ²Ÿ)òíÞܸ±\pë´wy-5§_kûMÏo‹ëÛ„mwÓG¤¿c§GÑë&4Á¶Q‘ß¿Mxª$@oÝðv?Ð={AE…0s}r‹0¼ÊÈÈ çosEÄwFGcåܺŽç cïiŸâïýTaåÊ•š©ÂCÅ6!þO¨8p€I“&iÓwÜ:—‡ŠmæÃÆ0†1Œa cÆĈ¾³ ãl#û FÖNŠÎ)g•ÞnÔß´A"• :ý}Ôõg•rîyg•âĉg•?;»»Øþl"*¼¦¬>7œ©(ðQgrêÛÌqÙä¿êª«¸ýöÛñx<Ú*þ¨.Nü/—'Ž“å3jn¾ùf6oÞ¬‰²õâÿÍ›7¢aêL^ £·i6›U½èD§ò††<OŸ o²ÃØ`Åÿ=ñWù»(¬êÄZÔûûÀßiÑ#ùgùÇ`­jƺ0¾§Wi­—®ê˜éEÅ¢ FŠÿ%òòÒÉËK窫®Ò¦óòÒ)+ËÓCÄÿQîKnQÎåpM´ƒËå6‡ùël=îû`ø›M’ñË囥¥vCùí;.» —ݦ Íùí&Áí²Ûð¹J å_¹r%7.`ãÆäå}“”ßéÇŒ3ظq­­ÿb"ôâÿê"+õmf•Ðn¶œÒ¸¼eõav}g¬¡Ï§…‹§h ÚEÙ »¾3–@(Ä‹j€¦x{ú6³áüzñ¿R¤`˜ B|ô¼¸Gô0×›1†þN6›ÍªÓéLê,}&¢»›Íf5³hGRá«ùPYJ¹E1íŠH\øÞ>»âtTè6!¶ÿÇűÞYWžÆ-ŽƒBÀkón·ˆ~ ŸJ‘P™”Úcf€˜D½)233ÉÌÌè®hÈÎÎæ¢¼aøñïÞ½[û÷°bÅ æÌ™ÃâÅ‹Y±bx<jkkihh ¹¹Ù8±Zôþµ*ÝEÝæYZ~îÿžê áp˜ööön¢ø¾Ö0¬¨›7ofÊ”)š )¯‚ÁR~ýë&ŽØ½oÅpËäˆ)BK¤¥›¹H] Ž–H “ÁŽk ÜžFf¾ ùå>¤ã§ÝÅÍã®fÁM_2¿rK¯+e~å:Ò¦_MÚô«™–¿Œù«DúÍãz7Ä NäÎã\O•&ö—ã†pÿ­WPþR8Nü"wž¡üGÞ|‚#o>¯Ú‡ëZ«²íüü98×SŹž*Þ­öQSèÂWíÓòââ⸱üîÚ²e €‘TF æææ7«gÇëë…±_øÅøùTñËíÊã”Çý¿åüóŸyþ¨É¹f¬.±k×.^~ùe6mÚD¢á¸ÌotÛ§¹,Z¯ë‚±ó’tˆ)übÒhñ¿7ÏF 3€Ï%„¶¥^úb¢Û`0f¸÷TI ç åùéÉÅÿáˆ×GâÄÿùÆÔCeûM©/„Ï >/=¶¹JE•Üç_ ~}# ÿû«-"z\à(òË̆ö‡ˆäGÅýÕ,EDê3ȼÁÂ5{ÓɼA˜èÅÿ‡Áßvñÿå÷EpÉ«6®­‡P¹˜1–åoÏBãËŸD¸ÎL¸ÎŒRµéÖ¦c(ÕÙZZ*QÖÖFY[ï:ìøaö?ü0ï:ZZ*±}ûv¶oßNII‰öÜ[»v-%%%ZZ*QSS]dÅ_]€¿ºˆê"«––J˜ÍÅ|h.Ç]Ü´¾€›Ö·rÜÙ¥¥¥²ŸSKu6]~ñc¿ËŸMKu¶––Jô§mÉÈ*¦jC(ŠÂgÇ¿æƒövæÍÿG²¿›Födø‡[®çn¹žü™WpýÔk¸pÔIòs'c¿fógOçú©×pýÔkø¸#»ÿy ;_‹¯ÓFsøóÁ›ÂÊàc?øÁº¥ÕÔÔ$YÃ@Ä´)[Åät1r½x¨\¯Ò¶1þYж±“Ó¥¥›œ.!þ?hÀýÂe?äÔ±¹S;L¿1ÞtàøÞ¸t.û¡ÿubâe8ñ »NˆÏvâ@Búñ¿üç_*„üÒPaS¶JíÉølµ'ãÓå:†\ƒa cÃÆ0†1ŒaüÅ`Øà[Šk@fâÿô U÷i_/1g¦ÙÅvË¿/ceTüŸ<öq_üû2V‰Büïè!ôrŸÇÏÐŽÿïݱ¨Kƒáÿ{·{Hü¹#½ØG]}ñƒâÏéÿ‰’“sÏ‹‹&8þ%¡!ñWlÝÊĉ{-õÅ_±uëø/ÊË#;;{Ð×ÿ¢¼¼Aó÷^?¤‚g˜?&‚ôx<8Î^óêó-€ý6 ËŸÝãqÉHÙ)ãîêÒ†ž:â744‰DLrH¿ÕÚ‰uR•Y(¬ê¤Êߥ‰þSο°Šn¸ëÂ*1T53Ë?FýÁ?Øòk”ø_ÉPø»vQž.¹¸Èçû¬ñcéRýwíV” eÐÇ ù[ªEG‡ÃךŒ_äÄ¡·TgÂ/;zØv-ÚlOüÞ`Hsk÷WÂ/#p_wÝuÔÖÆ¢N&ã_¾üE®»î:^~ùå!ñ÷úk"$ÎÄ;I/wØlq‘áÏÈ;Q××Ìæ°Å¥3Bü/;6X,<ÁhO¼Ù³g …4s€d&CåWaë<9÷<-ÚˆÙ,¢O*«i«Ù§™ô;UhwíïŽàß·ÄÊÀ¡ÍÆ}Rëç]]]ÝL¤è_}:ˆ-E—ËqGG‡¥u ûàñx¸öÚkQE3hll¤¢¢‚£‡â;<êÅÿgº^˜j(Šb’D‹%Î múÕŒ¿â-ï`Îw …þ‰çVQÓÙ0øPMn Mþë¨ñïip*œÜ@š/3ž_š·Oj MüΠáüÒà¼ÖO’H€Ì¢†ðAmÐϧ?ÞЪñyólÝø½y¶¸|©B Òý|ªñüóïÇñI“ƒÄy™/„B˜ ]Zgs9Ü@m&®–5ÆÃÑ£GY¾nyœØ5 ÒôoM´DZð4zðùû×Y¶¿øÿÙ{ÿ8'ª{ÿÿ5¬ Ù] @²ø£`+$ ¥ l¯.þè•ðÇ·…$ЍXÍͺx{{û‘uÓõþB“ ½Ú.´ ¶õ–Õ[6«hQ’@o«•MXŵRww."Øe¾̜əÙÉn~L6HÎóñÈc23gæ53çÌd2s^ï÷ÌÖV,]ºMMM¨«®Æ÷~n·®¥>üäöÛ±ÿ'?AË…‡£çH&|ƒ3 oذAÑ_ºt)–/_·Û«®º ëÖ­ÃòåËÑÐÐ ¨®6<[jÓóÿÀªûÎIJ?ĪûÎDÍ-a¬yè|\p鳨ÚbGÍ-a¬füF¹à0‚á³ Õ?}ë`««Ã²ß.ƒ­®æÚn¸Ýn˜Í&Ø6~€åË—ÃVW‡ÖÖVŒ{w^²ÅÒç« ¼Þ„Ï/ÃïRƒÏ/ƒðºt/®7=ÎW¾ $À“QåÒçyqÕ’UØÿ“Ÿ(ÿ+÷îÝ‹9sæ$ E£Ø¹s§2oêÔ©°WÚa¯´À fˆ-Oµ`ýªõÒz4½Ü¤|)@ÉúUëÑòT‹²LÎÚè×ÜUƒe,Sô×Ü¿îÝÆëC:ÿÞüïF´6¶"<ÿB,0›ž¡b€ÿŸÿw Â7JóßüïFœ¾õFI+úGÝuÏ¿PÚ6~€f3l?@ã|3ê6Æó¿ÑúàØ u8wéÝ€¾-»‘àJÐ2”3 ¢±òù•Êü444(`®\ˆ—€?ìWmÓgúL?w}Ç*Ÿ2¬pjk» •Á|ý&„Be¨´GóªOÖ»påB%T1¦_}òn5(ÏõhjjB @¾ÞÅÒAnD“"ýhMþËe´ùŸ&±€«Hšý•ïQ@l—¾Wz¥ÿÀFÒîA¨N2ÿ‡ê$Ó¨.³YP+ æÿp· +Ì…2==òÎZ+cYïýÓÅŒßÓ#äýýiÚj¬•Éãnd0…eó¿Ç„œro™Úƒ®·“ALa9@$? CúbÀM‹)í|ÿ¯?ÆpÝ)@_RPƒÎ»vò{P³]횦’éÇ÷ˆ×øZî¢`ïËý.¼r2ŽSä ÄdH¦ïúùÏqñ¿þ«¡ú@@1þ’÷a$Ë2’é †&` É6H¿ »üÿš~þIO{kaó„ Õ,Å!»t&JÁö6¾{‘jH¦_ùØV¼ù㙆êWyÚ•÷ðä8Ää6N†dzO¸¥¶vÈ9wÉýn•á•0R–ú“ÉøJ€X+][?߉éÓûwÈüôÓNL¿]šþÀÚXÎ&ànÜó4ᾇVá¡gÖô›_> ˜>ÿÕøÇT¬e—{zÿÃ!õ{µÉ“'è í°o‡qè9s樟uAm|'æÿL–φTïx®¼òJÜu×]ƒ–Ë–n9î>¸]Çåà‰òé@¯C}›Ñ¹»Æú—ֳ㧴¨æY,R›«¦N…òaÀ/åÍÐþ‰DBù¡ÑÿTåòMË;[qK®xÝ"¸@–ë5ªþ_ÎòVÞ(ýl÷ÿå˜1×?íuï뢳Òokk㺺ºðúë¯ãóC_¡üÜ Üv÷xk7°ý½wðé¾wñy|ðÿƒsÆI}}JÏŽÝüûÛwbçîÿÅn^ŠSN‘úì ½8ò·ÝhkkË*¹ï¼òÊ+A€‘@S‡¿ûÝï”àzArF6ï}&&mþ0Ñ¢îÓBÆ'mþ{gŸ©ZÎÈmÀÞ%S?€’©Š(ãeKåŒÜ²ž«!™ú`–¦ M.—ýÕ{õÇÇg IDAT“¤IK5y%ÈøŠIR9Cõ ƒÁ`0' ,ÀIFETúŒî©rЀÂ`uHŸBa2™`2åç`:XG|Öß+˜þÅ3¿‘[ÖÁ™8q"&NœX0ýŠŠ TTä)í$£ Ld8t9£_B ‚À‘‡€©0òå³V»Ô&EØoóöÀó¼H^Òæš}!À´ž|Œ2Ý»~.eþ€ëvH|öÿZúX*-ª 4±H –J‹R–^>ÓNH¤|Ô#õfŠDDD""*-–”f¯H,&Í—ËÒËg«ñH72äŪ•ÓÉò*%#0ý–,Ÿ­þÖfÉL·cÇìØ±¥¥Uhk;Ew™®®.Øíc”²ôòFt#Çu°L••žóGu¯Q9éËF»P;P{ê,• ^^·ÞZ³¡ú±H ±H |ˆJ­o©´ ŠÁì5VŸ˜žÀjU§Ü‰ÅbªO> æ Aí¿¨>F"·íÔÑ€3?†Ï/ÔÏpLbsL¸è8äDè°yrïŒJ‚”––¢§§K—Jaè Úq«%9=Æy^ww7º»»³ÚÒùW”——ÃV+uȳZ­˜6· ½½½0[¥ÞF™ÿÓ¹ßÑ#÷^4$élA ÉöxD*ó?½mCtá-çRj$@»¡|ÔK~T ï·˜q@ Õ ™(‘“AÜôåñïXôË÷TúH €Î¨t>ŒÃxkþÀ®]ŸãÈÌo)ã$À®­GHArý?®5tf€7Úè^X>SYïµÿ±Q¥ílTÊÒ匂t¸&DEêz+ö¿'Ó–7Bÿ_þåe½îõUé»×'Mÿt9£ôŽÒä0âq Ò›Ì>Qé €[à‚¯Ê¢"0š`${¥þ°îÝXsÿ,\)eZ¸r!jîªûF7œ6ç kÊœ  ãå—QW]ÆÖV¼n;Œk×bŽÛŸçüìgøþÃcêÒ¥’ ¿Ô؃°`Á¬]»Vê€êëëáv»ÑÚÚŠéÓMä^r V>ú¹2$ÁÖ?33k‚hù¥ ï܆5ÿ†‘°Û>1TÁ‚76bÜØ»¹`««Sö?<ÿBô¶´!ÜØ[]>;ð¤áû_èãß–h?×iKÖà†Ÿµ`Úu‡hz:?×—Lð$è—Qåƒd¾9ó·¿€3a Bò‚7mÚ4TÉ™ й¥eeeˆÅbF‚@œöŒ‹ÅPVV†Î-¹Jf¬¿ì)8_>ô\WþS\¥u¥øî¿½ª˜ éÏwÿíU¥œ‘|1óZ ojT†$À†x\ Ð8_ @‚‰cƒ•çKßϾr‹jÞøû}ªé•ç@n»e¥›Z2<ó†zô¶´áG€ªã¸î•k W.ç¶//OžãáøCüñÄĉ•(zåŒÒ'¿éôoû‚ ‹ÅP]]W^yºå Ò?,ŸNdxÛ7¿‰]Ÿ&pÝb×§ ̾±zåŒÒ-792|oùËèz;ו ‘ð&Ps¸zåŒÒïóÈ™µäaýÕg"þrìaoÝ>üÓþùÐ+g”¾(¿r!ÃzÏ™ˆ‡ø—ó"Jàšq5Ð+—/ý¥·Y%`ETæU?$¯_î¿élÔýýw8ÿ¨ûûï°ÿ¦³¡W._çÿ™7Ôã»ÿö*~}d*¾ûo¯âîß zåò¥_[[‹uëÖaôèÑhhhPî ò¥ïû½ôÿÙ÷iuõW­D<žÀÁ)?BÝÆ8öO¼F5Ÿ”7J¿Q¾œ“aÉÊ•p%èX¸®D©©^9#ƒ‘çJ‹/ÆŒ3põÕWãŽ;îPoÅs'%@0úZê>³@8æW[ ¾*‹2ƒGÅçìR0€ˆJ B# Õ%PÛhB­T5Œ‡¨`rp 'Èu‡$TJ—5õû¯hÄ"=÷–ËÒËçú"•>6›'õ»«ðû,è x a“Ìÿ [çùå ¡2”_. IPSØ„D¥Á&¼(¤À dØ Žš_'(q@ À/âA–h¼Gª\ÞÓK4ŠxиÌçáioÇ+Ñ(.’ûa\ â•hù?ßÙÖü€M›6¡££CɾÐÑÑ¡˜²R% 1Š`<ŽhÊ;POHÆ¥q«Ž9ÛHø}5èÛöF¥g\£‚¥èÛöø}ÒoÐØïå·ï“'G$"¢JnUžvå½0à´üîoooÊyùèwÖ-‚{`m /µàùGRà€çiB×qɯ ©²Êgšm>[.½Tz¼ë“NüO ôõ~•ù?߸Ýn444ÀívÃáp š&HXr¿¬aÞíÀ»üï~ðW|ø¡:ñ-ókÐ%Ç=}`m Kî—”>ÿHSÆYßé,ô/Çò7 :Äbx9†¬³Ïk¹ï¡U(&™ìI½`CÁÎ ‡„´»X,iþÏíñ‡‚)Ÿ}tü;::s>þtŒ;-LYî— wòAa'[­èèè@âã`ØH¼ZƒOºJðÞ©YWL©Fé¤+°¿}'ö·ïDoÏ^¼à¬\õÎ3™ß—À¾Ï¢÷+c^Æ’€3@2Øáw¿ûê“/þñcißOyLÄ)‰ý¾“ùù¤d®¤Õ÷:‡¾×¹~ßÉü|qúÝò—•òGó]™Ÿ'þïcixƹÒGûÌg0 ƒÁ`0ô`N`RùŸŽIÙÇõæµ[ÕË^jEöYÈSù¿ƒ))õQ¶Sµì_ÊîÍZ?•‘ÿ‡®Ôû ¨—½Ùï*#]MMJ}b !Ëþ“Ûýþ§0òÿÐ_‘zÿ¿|OµìÌS|Yë§2<=…K©OŒdÙ/±¬õS½P¹ñ‚ RêïÛ·OµlýúõYë§2òÿzåÊÔçŸü"’,;¶ª*ûó‚D¬ƒƒ \¨ÝøŽ'‚>éh2X¹|™ïéa®årÙmÔiÂâÅ‹OºŒ»4©LñCez+&}Òf°@ùÚ¡VP™ùÉ6Hy€,+Ôf÷¾¶BP™ùé¥f §¿ÁL£_”’ek+²Ó7›…~Õ£¢dÓ¼È4ÚˆF–5›³Ó„ï©Ìü$ó¿ùÒ‡‚Nèl×dY­Y<[ˆñŸ´3m€Øv¿RW·;ïDŒÿD_à1¢Ôÿ‹Œ€EŒÿD_`ÿ¯“íßRkl'DÚ`F“OWWæÎ‹o¼K—.Å7Þˆ¹sçª @eêçù{Àó÷H#;GàúfàúfÀ·ûV\ÿ T8¾c¸¾^€Ï/<Ž õ`¤ùŸÖ¿ãŽ;”ñ~Aäàþ(ÀQMß"b4 ààÁƒ8xð`ÖÛ°iÓ&O<Goo¯ò$ã¿Qæ-«W¯ÆŠ+RÎÿõÞ¹vÎ2’ˆ@àÛÛñì³ÏâàÁƒy¹'+ô=1ù¿5H9ÀhˆÉƒü´‘ FCLþä¿v*H£QLþ»>°ù/žñþÿs]N*-ÒoL¥Å¢|l¹\õ‰¹|ü¬ñ*ý?üûüþY÷ò OpY-°ÊS­”ïùÖ·È?ùo4ý‹rh倦…ôz`”¾ Y¿? 67’ S@òþ8ŸA`öìÙ(Õ1Ù÷ööÂö+Y²bÆ øYe%¢‘þôÀ˜ ßZÞhjBË…ý?ù ÐÔÔ„ºêj´öbÆ ¨®®Æ† ÐÐЀµk×bݺu¨¯¯Çºuë°|ùrEéҥؾ}»¡úMÏÿ·Ñôü?°þ™XùèçØÚbG}}=¶¶ØQsK럙e~ˆU÷‰`ølCõ7lØ döŽÔB2ûoüõõõ°mücjªªK raÕœU†ïGG,X“É„§Ÿ~Z×€¶téR$ TWWªê<æçºUÃt—Ër¿ÇÑÕÕ…ŽŽ‚€D"AÐÑÑ®®.ÄeB®÷'<Ï‹óæÍSÌÿ@ò¹.L’ïó†E£‚ç“ÿ…Þ|óM0&€bËS-xóÍ7±cÇŽƒR;Ù±cÞ|óM´<Õbˆ° úÿùGÀ:Ý…í_&ïüˆ6~ömüç]w©±½àˆ©ÿô­€mãÞÔˆºq,0›Q·1 <ÿBu×áô­0FØ ÑâÑÿ/ýÙ»O:qéηx,†ÿ›ˆ#èž,ÝÏ5Î7ãaÑ„s¢/¢Ï¿絚Uóüiy·ÒÔÔžçÑÛÛ‹ööv ¼dþ„  t¸èyRê¿îKiÚkN§j™N†=Oú“Ar¥1ùõà¿KÿLíÁì‘Ü 0yLªùÚår¡ÏÃaØôçE¾ Ø÷ì¿)ó?Š|S™N†Ã¦?— #bÀTéCbË8ïxN™v<ÊÁ雦𩾤 ß@ýµvõÓwú¦)úd¾‘ú[;>Œ¸¾'e;nüæýò=D×BôË÷ÐøÍ¨æ‡ˆÍ˜?¿zçÿS7½Šk¾wvm=‚öÇâÊÿÑ|œÿzúW]uÊËËÑÑÑX,¦d¦Ï‡>1õÓ˜kM@¸yÆ\»å4Î7§µ\6´èĺõ™Lø ||:ýô–3mpê¡8I‚¤ãðôäÏüO Ïœ~õsúiµÕrœ‘ÓåWlÕTÜAí@ûüOïø“ráPÐãŸ)FAéÁeú(Áèú`mfÇÐhýL÷ÿµ1Cõ û꛸æÿ^xq=vD¢8üaø¤ócŸw ½½mmm¹&ÂP¾“þ7€t®ß{ï½X½z5~ó›ß`õêÕ¸÷Þ{s‘”ü˜S>zãCAÉ\QùèçUÔGo<ÏüßÇÉÞ8ƒÁ`0 ƒ‘ ýtžŒ‚ò@¼”D|ÎàÝ,ôït·/; )¤£_¿~=z_Oq2H€w3ܲÿú¹>Ó'Utõ±>7}`ëÿe§ÿZnòJ€x–Ç?W²}Iôs}tJ‚h3&#Wº/¶òi>/fý½ý*z©­]$/bõH'HD6ºéLËŨO¯ŸÎ¦A¦ëM3T» "ä—jбŸ\Fisùn†ˆ6 &_µ-•e™L·O.Б¼Ó#/>•ŽO)ô= N jYèÇ„dçqŸìàUŒÿ)ôcB²¬ËjI.“…>ÌëË–IÖ㿎~Ú¤í}Yš|ã7ƒ¹½ JÕþõ²¼D""*+=52ÒÅô ‘C¤‹Ä’mßÈË&íõÀn·c̘1€úúz¼öÚkè‘o‹ƒbîf {tõ…‰^TL—Ìþoþx&®y›ê•8õKð‚ßçÉYŸ ·çÅ_Ä™H=P¢‡Uà¢üFšÿiýúúz±¡¡€`íZ)ë'm@£r@ “§GE`Ú´5Jýä² €tü‰Ñ?U£›1c†¸gÏž´Êç#øS*äŽ"éxëÙÃñÒ'’é;×c=&ùÎó¼h?fGð´¡ÙgA¸+x^l¦^H/¦T?ÖyÿjdA8ÞË‹tPŸêR×§ÓéÝÈ ‚ p¶ Uôb³2Íù#›ò 12€ BsÅsÎiV¦ÑOˆƒÆ îcô:¶Gb1¸œD#QTZ,ýøAëG<%0Ñ'6Ä|éÇ}c{TLfƳrý;ÇçKßQ*i}hïQ ÆQ*ÝÓr Ô†ÇJoâüÏúàj‹ÁQš¿mpÚœ3f jîªQM_sÿ$ 4½Ü{¥] `Õ¥¥˜ÙÚŠ×m‡ñý‡ÆŸxæF"‘àZ~X|úé§±|ùr¼n;Œ¹­­¨«®Fck«aúÓ§OGkk+Ün7êëëñôÓOcÑ¢EH$Ü¢E‹}·Û¦¦&,X°6l0Lßnûþ gcÍCçcáÛÐòK›J¿å—O£æ–0Ö–=ø!ÜKNò˜>}:‚žÄ÷Ô66¡·¥ áš áù"*ƒ¹XãvcÙo—aÜÌ»3ؾ}»áA2¥éå&8JôD¾ ÂëMØäô|{€tOC‚‘{ ùÁˆù_K<‡P&€ï8Ód,ÿÏÿŒ3û[Tµ·£-E×LˆÅbèèè®+©+ÄÁÉ€8{öìœuOý°¤Ì qÖÓ¸}ò©Àð¯ï¸0þ~¦¸ã¾zÇ®²*ÁŒ‚6ÿ³ã|3‰×8ß,ÒÓI€áM9: S˜÷­Ó]ˆÁ¥~îDO×[O6Á8ÌÏ·ù@ßÒ–8'£/,}_ö µÖÑóà|›†]Yë·<Õ¢š4z´oÆ øçþgeú† .9ŸÐòT jîªÉZ_ȧ¼¼H¥¥¥ªN±¥¥¥ (ó öJ;‚f­¯5ñ/84˜LXtwòƒÉ ¡Ì'îFæPÿ% šTbúäg ›÷¿Ï]5qV"i˜)q}ìõµ&þó*ÿ´sÃ#±·òveúÜðH€KÎ'ôy8”xŬõ#õ¤iàˆ‡`gò\ ‡€KÎ'D<@¥7ûý¬tH8ÙöžŽ>™O¬tÁ±Ê—µ¾ïÀNÕ$çlð‡S”×™ï;°.óTÃÏÿÇ—ãÕ÷^U¦>¼PR‰òaºŽˆJe–ÜïVê&Û¬ï~‘˜Ç8œTðƒÔ÷6ÄøHf}² ÙfŸO­ù?ß6xä¹/ñ…s„2m3£ü—[mêàÆÄø{üå â}­ROìú$ùp¤æ²™Ê´‹ÏÒAammm\UU•‹ÅðŹgâû—]ØÎ?£ïK®^ƒ>>€Ï{ÂòÝIè=؃>°eûN”Ÿ[¶Ím0WLÂûž³ùŸ$™Ðöûp»Ý0›¥'ÀãLJ(&ÿýà?À%—\‚¦¦&cú?í7 Ÿ‹ÿ°$WuÊc"þñcN&mþØ›‡ó/8LºMnU&õ½ÎaÔ+ïãÐõ©Íÿ“n3~ö‚Ãkq>5m%púÝÀOBmþ yÑ_1 âRêGæŒs%Ó?VLʃ>ƒÁ`0 㤀8A!æýÒ,¼<íVõ:²å9Çm¸=°;óËäŽ Y Œ™»çÌ<@T6œ[s4‘Û± çÞÐ2xA ‰„Ô )ÛqáTTr™;HfB [®Þúmp+2ªGL$@¶üù…™˜ëþkÆË‘L¹F#µˆ~tMÌ<¬ÉDSa@çSãD‚¼ˆÕ›Wåš°ŒÂ’Oó¿B\̵Ó*/ F:aeÛù-.Ù©)}ý€Ü!

1g½ï„9sæâÑH¿y]Ç£@_ÐëPý IDATœ3g2ÍœMÓ-‚C4".pHÿ£É0@ƒÿ‰1¼££÷Ýwî\´0çãAŽÿ3ëψչ»&/õÝ5","z"N³JA½IÜL•½…3¦ýezü‰ñ?ÇŸl9àâ³Ç+óžY·'NÌÛ5°[w ñ—itEÎWýÏ»bW1€ó¥ŸîþÏ»=׿tοBëyý%AÞÿøs|¶±ß5 çLþ.þçw]à¿7ÀAÄþGJ„qê7JÙõ!ººº]±÷s6ÿ§êÿäp8ÐÔÔ„={ö(¨8ŽCgg'®¾újìÙ³ñxò}ªaANyLi³ÿ¾X9€d?„Sók<ß ®œH›ý}ß”%‹ô½Îåoö‚ûâIˆ´Ùÿ MÊ/žD^õϘ‘6û¯Õä—8ãÜ<ê3 ƒÁ`0¾ö°'(ÄÄ_©ó§ÿ/iu“ÖQhÄt—£‰ø¦ Ò¥özÊv"òð〺²Óm':ÿ0^5-ÝõDÀ¶n…ÿG€sæÌ¬ôÇí¯Ág稃¤»žD"›&5a†/ûý‡µˆªƒ¤½ÿ_¾ç3.üÙë[·pˆÎR7Ât׳këü¦Òä°ÿ߸£ç¨ƒ¤»ž}ûöáüƒ ñ‹ô¯:s%þø¹:@Úç_{;¼ö68s©ã£é…E[¿CRßÙt2²ÃÓ/¬~„Úy„Ú¥ž0¤MzBñÌ£eɶSGc›|{FôCíý³Óä >µ>ýúúzÌ›7v»cÆŒÁÎ;•év{êHõFñægB˜èEEíë¸xæ7”ÀSoþx&0Ñ›MH Ùq(:A‘ ===Xºt zzzðòË+%µ.wƈŠRߘo”î_ó••>ß‚ÀMžÑ û/™\Ô&˜pccÞö_«?ÔÇŸ´qz?× ÄbÒP¯|ªûŒ &²¹ãœŸý Ÿï܉¦¦&%1ùOm‘žË/^¼XÙ>žçŕϯDËS-Ø àÌßþ6§méèè@0”žÜv\ãà愘ˆ$`‡1ÿ ­ÿùG)ØË+}[¿¯<ôm•& @Æ?Óy»þ¦ `jj‰ùßèó¯ò| àÂi²P[ò1 ó+Ï¢itN‡Ó¬Gq$œfRÞXyy¹j˜IùîîîœõÇŒ£fR^Œ3ºÕ ¤T(Ýré2zpfRþpæ±Ãû1lús\Ê0“òÇ·ßžû9ã­Ãpr˜Iyúi¶úü/”þˆ'8€ºåñxÿIÑ–Kw9-ÄàO–Ÿ=BS`ªI:¾I¹Opè$€‘®6Él]é…àƒŽëO‚Ø“ãý7¹§1ך'`6«ÿÿ4†¡0ìþçÿã Åú¹»Í“Ÿw䘚j»Ñõvå—«¿ÉO0úÿ_R€§D4B2ÿÈÃ:jÆ?!ÐAüþ§ƒ.ÂçþÚgý@þŸókõI‚'R}€0*˜ó?­O‚ ‘x‚6ß’„3ù†ÀZ“È®¼   À姪ÿ éù0Àw‹àî\´PüåÆd?Ì]ŸtâøÆ@$iŠ?÷¨ñæSzèýðÎd Í|ïûó4‰Kîwc×'˜~ÝuˆG#èúJ]Ž˜Ñw}Ò‰ëä2Fï7¤géZ#:üô§?Åu×]‡ûZ³Ù¬J¸DTBÛ´”Ÿ¼ÖYŒ{5÷ÔÚe¦QæZóD9þd]>¸R’mî\´Ðp-=í[8ˆ›(“ïú/Ÿ±ë8*ÂR¾õSï¿d(Ÿžßë_êó¯ÐúF» !&þªª*±çðQ–À믣\(ÇÖiøÝ¦0JGGÏá£ý–É7“'O†ÃáÀªUÒùÿ‹_üB™îvë¼2€SA‚L´t)ÑONylèž5ô½Îõ']ÿ¸2}HX (Afxš>œq.@‚,¬ ¦3 ƒÁ`0QpÓž(Š}KÉq?ºð@¼ÔÚ?ÀÓ±þdRv Þf`Ü—×y§ªì–ðC—¾þ È3ÌõëׯǕW^©š~ÕøñºúõëŽذpá×nÿ™~ñê3 ƒÁ`œ(ðØt¦Ïô !“ …V’äjöìÙÊ´Å‹«~¿È}wii){@Õµ`Õ’U˜:u*vî܉?ÿùÏ’‰>Óã’êZ—ïeO}²ž^ÿ vþ™!Ž»ôn|öî“€GÚ£¸¿Â:ðñ4CTÊP–ϦÝÅwæ)€²qtÏ7+ëÑ3—)ûm†¨” ¬'‹ Ü$ÈNç–NŒŸ5>m}¥<” ÜëW™ªÐ–Ò¯Z² +Ÿ_™¶¾R€²ž õqÀ!Âýu~œÓèL[_)@YO†ú¨ gQ½88 ië+å(ëÉP?Q5¦¶qƒO ú”¦¾R€²ž,2 —ÈÆiñ¯>pd OÊPÖ“¡¾£jm;rÖWÖ“¡¾ó#üçIëCQpµÖôõIyÊz¾fç¡õUí/pv¤üIydßþ”,ó:ëL_µít¶zFæëýÀ püO„ç/:òÝÓgú…Ö/ã .¹ß žçóbüNGŸ|Jm¢K€Éüžïm!Úï~ðWœqÆ8¾q#N‰D0YΊ>ÇAoÿ‡jßÍV©3âœ9sðü#MªùKî—Þ¿ñÆ€H$bè¶ý¦ è±XLÙžça6›ón'Û±ë“N\|öxyîK|ãöyÕÔÓ'º—Oä[ÿD9þÚí -=Ý]Ÿt*Ó.>{ümÑï:.Ý(Tû#íŽlÇPë“ó¯PúONŠóPUU•ò=ÌPÿé>&@ e¹¼%¡˜4À{¨¡Ê<_èm(v}ƒÁ`0 Æ×–‚ß,²©ëà;r$çå–ä´ldjþ×êÿ‚ 6Ÿ:[ó3ÑÿcgòaO625ÿkõ ½ÿL¿8õ ƒÁ`0NÒé|“Ï:…Ö?Q û˜N´ï¯»ùŸÀó¼ØÜܬ p"í›ö퉲]F¡ 0ñ?û® 0ñ?_út€ŒÿyÛ*ÀÀAPN®¶Ç8És‡ó]_k`úLŸ‘tp«¬ïídCLËS-¨¹«†àòM¡¯ÿFBÛplð¡ò|ÀuIš&Z3Dߟ}ˆ|PYÓ=6”v‰MÄiÖ£8⑱ôž/q,:}aj±4·Ÿ|ÝÚ¼ååå¸àŸ.ÈXÿ¯ÿýWtuuaæâ™Yë»o”¯/7e¬¯Z6KýÃÀ¡[8+ìÏXÿo6'F½äÇÈñÔô õÑŒž¥6ÿ§«?z pp  dÎB¿ÏÃaØôçTæÿtõÅ >ß~»bDÎF_ JCÚ|¶>½ì×T?bkÇxëpŒ÷ž“±~§g?:£GQ¦Ò•ÍÎÿBëû~ÿ 8¿s$s½là÷ÿåpÝp$k}±@4‡ögÕÉVÏÈEþÿ³Ø)øñ?™î¿Œ¯ÄŒ8ÔæÿÚ Æ\m½m*}t‚pï½÷âºë®Ãœ9s”iÏ?Ò4$FôT å±jÍAÿD9þ…¦XëŸéŸú…„õb0 ƒÁ`0ÙPð?,Ààu@ŒÈ@j#1]FK®æc¦Ïô™~áô ƒÁ`0 š45Iˆ“é% ýr8ñöl߉¶]F¡=þZò½ßL¿°ú ƒÁ`ä £î¡ nÌa|½0CwéÝ8ûÊ-°Nw%Mü™fp‡< ºÝ‡OÞœ…ÏÞ}rðu˜!"¾ç;· gÒ¼Ÿ±KÞ†›3üøÐ? 0Ox]fˆ-OµÊÊÊ’æÙô·6oEww7 ˆÃ Ñ^i/ó‡ý9ë;mRÆÓ/N}ƒÁ`0 Æ ‰6<3þ3 ƒÁ`0 ƒÁ`0ô(øC# ðuÀ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`œÜðƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒ¡ 169]“)£÷]o½®TËèéÃaœ>YWFúxÑ8}y]™è[t·aúd]™è;¬Ö¿5óãïv» Ó'ëÊD?ð¼Ë0}²®Lô§; Ó'ëÊD?j1®þ}–Ìë¿Ä)¨Ÿj¾ž>)›‰~KK‹aûOÖ•‰¾Ýn7LŸ¬+}vý/ìõ¿Ðç?«ÿâ®ÿB_ }ÿQìûÏ~ÿŒ;þ™Üÿ1 ƉŽ@á®cˆpP/ŠÒ§08ÎÂí¿ót§è<ÝY0ýq‹îÇ-ºÛPýy#‡¥½>Òþç&f²Ü€Z¶ ê“´›üɽeÊîÍ`=rû/»WÌl¹ÔZKúûAÚ¿Å"}2•×[&“öLÚ¶çî2VkÚëQÚ¿Õ*f²\6Z ƒÁ`0 †{˜Yܰú/nXý7¬þ‹VÿÅ «ÿâ†ÕqÃ꿸aõ_ܰú/nXý7¬þ ƒÁøz£5©ÐÆ=z¨gfÑ’N²ƒ¥RéÓÆ½lôI'Ù¬õ)ã^Vúr'Ùlõiã~6ú¤“h¶ú´q,«ú·"¥‘-}Ú¸Ÿ¾ÛíNH }Ú¸•~àyWÊ@éèÓÆÍlôIçälõ£–Üê?jAÊ@éèÓÆI­¾Ö€©7,qŠi5SéÓÆÅlö¿¥¥%¥‘2}Ú¸˜¾ÝnOi¤Lëüg×ÿ‚^ÿ }þ³ú/îú/ôõ·Ð÷žÿì÷/·ãŸéý_&xÑ“…7W]B¶Æ7Ãô³4À¥©1µpú—L¾C¼dòÓÏÖnØñϦŸ›>©síp ï†BLÿÚá@ß …˜þµÃ¾¹æi‡}7T_¾æk‡}7bú×úž ÄÔ?Ð|íp°sfÞÈa_7‰© ùÚá`çm°À/bè×kÿƒ e÷ŠÄÔ?Ð|íp°sÆbø¾Ágö x_£m÷>³Oô™}ž ÚåIy=Sÿ@ó5ÃÁÎV«á3 ƒÁ`0_/†å²° \¡j0 «ÿâ†ÕqÃ꿸aõ_ܰú/nXý7¬þ‹VÿÅ «ÿâ†ÕqÃêŸÁ`0Œ¯7‚ pôø yH›Zjµ‚ aÈwz9žçÅ&A@ˆçâyÝu§£_bî¯/Ô j“úä»VÿGâÁ‡²×ÇÔIýõ…' O$õåïZ}ab xþðü=Ùïÿ¬)ýô‡_s+†_s«¢O¾kõOoðâè«/áè«/e­oµ$×G†µj+¨ú¯Ð?þµBí‘\û­gYU¦ælà mp.™5ã×øÄÏÖ=É‘ñq‹îǯñõ3DgCÇÈa˜{ø¸®™_¯ýW¨§‘2©Ú¿ç>ŽŽ‘Xn@IôÍü)Ú¿2”MÕþKª$””íÎ[}3Šö¯L#eSµÿEœ·@ÒHA$¸\cuÍü©Ú?™FʤjÿN'D—k,"‘Ô»ý[®/\ MúµÿÊx%*ã•H§ýûÌ>Ñõ… Ñ¿ESêöÁÛ¿Ä©kæOÕþÉ4R&Uû·ènqü'>ûàíÔ€Á`0 ƒqÒ“U€¡xˆÁ8qaõ_ܰú/nXý7¬þ‹VÿÅ «ÿâ†ÕqÃ꿸aõ_ܰú/nXý3 ƒqrò=e…6õCKˆçA›bR-K:¤dÔÒW¡§M}DŸñ M©–Õê§Ó¿dÆeªqÚÔ§èó÷€6¦Z¶Ÿ¾ŽqPË—³«Uã´©Ÿè}õ%ÐAR-«Õ×  ez¥U5N›Ê”úoçA›ÒR-Û¯þuŒkZ&L˜ §MýD?€ jY­¾^à-V«º£.mê¢ ]tP€TËjõõŒcýôm6Õ8mê$úÁÓ‚ M¡©–ÕêëGµœWùwÕ8mê'úž8:(@ªeµúÚòz¬ž5\5~Ôû7x./ÅpÏYŠþ¨`)Ù%S&½>í²Z}=㦖òòrÕ8mj$ú‹/mŠLµ¬V_Ï8©e̘1ªqÚÔHô7mÚÚ™jY­¾žqR »þöú_èóŸÕqס¯¿…¾ÿ(öýg¿êq½ëŸû¾ßäíþ@Œý@´[€¨"1ÿÛ-Òô¨%YFº¾¼ ÚìL¦ùvOF¦&èL  †ëgh€5Z_1öO…ˆéL–Äü?]žîH–1ZŸû/™|‡Ø7l>.¾¸E$æÿ¾aóqÉä;Ä‹/nQÊ­Ÿ©ÜðãŸ!'„¾æž„Lýèw¯’}í=™¶zúÝ« †6Ѓ_ÂH­ßý8‡{Q⼕2õ§nÿ%3.ë÷_G—©o‹%Î[¥ó¥ûñ”ú±¸hô\.(¦þÚeåTV~ø|cE— ˆF K½ÿþ/ü\ÄÕfCQ‘LKÕþE'ÑɪET´Úlˆ˜#ðáO}ü£Q®oËn|õà ÅÔ?Pûÿrvu¿g½zŒ_ã¿zp…t¾D£†£b0 ƒÁ`|=9%›…´™Ÿ¤,Ò4£¢~ÑîÿÉzÿKdSß>mÙ' dùØ~_MR_xB.+Í?dïAß¶w€{U&ÂTúÇ/³`Ø;1œúÐjÄÔïQ•~Í­8úª´}§7xñE½GYßðkneþ°wb±¹}[v«‚¤Ò¯ò´£Í[çüR'ïé•V Ô®*[[!(YfkÔ…¨ú¯ë_žßæ­ÀöHÑT&¶TúÄ\¶yófjS?)ëp8Hêëë•2‡”ùÍÍÍèèè@"‘PH¥_ZÊ£§GÀÚ\«Õ@•¶éÑ›”,¯ápl¶ve}MÞÊüžѨ;þ\Ù/ˆ€ž¾-hEØ…ÿW^Ißf‚ê²öcv%˳·Ì Ow²þíÇì ÌÛ£ˆ†Ãˆþ-ª2‘¦Ò/÷ŒA—·;ådhçUr@hŒªl›Y@U\:&;jOôÐ1e}mfHA ËÛ‹"ßDwô€*ˆ@*}Ïå¥ð¾ÝƒeÒi„5³HëO–=d,ïÛ=ð\^ª¬ï½”,ÌÞ·{°bËQ‹Ǩ`é ú3fÌÀ¶mÛðá‡P›IÙææf%Ëñk¯½†«¯¾Z)ÓÜÜ ÊümÛ¶¡«« ÝÝÝ*e*}Ü¢££€ÚÔHÊΛ7OÉrl·Û •2óæÍe¾Ãá@oo/AP™(Sé³ëa¯ÿ…>ÿYýwýúú[èûbßöû—ÞõϨû?=xž½‚À‘ UrÀ%bøÆÔå}<bt×”·Áó—+æg×”=àùËÓÒ&ú~!i€ót{à-ó*oµPéºb°¾_P €Ï1x½§)æ@­64~ÿ…G‚€3Š!s»¦ü>ãõ‰Ùöï_ŒsÎiÆÅ·ˆ}JŽoT•ïè\o¸~@¬›çÑ$JÆk­<”‡ö—Éóti~õe£?À‡’Óþ»þ½‡‘úÄè/m€€5mÅ—ú÷^z¤ÊdNê|†<¼‹ÞÕÓ¶QË0€áxà ÐÕ'¦ÿ³<¡’³ššÖ§–d©Ÿ*“91ýO$i:o•îë¨iR²ümYé§ÊdN®yVëX€Ë%«9™P–÷û³ÛÿT™ÌÉ5ßz–dÈy³ÑpX5-ú·¨²ü€†çH•Éœ˜þKfM|õà ”lnUMëÛ²[Yþ³uOf¤¸ @¼†¾#Bü½f¾¶ýÓèµÿœË¯Šiž p%fˆ#oV@TþÿÈôkÿºí¿9 8ü"Зֹp×·m’ø;¬8EòÿGAÓþUè´ÿç­8ÍzGž}éœ ~?8«u¬èt@e%DŸO=_ÛþiôÚ¿ËX,à÷…ß`P}WÜÅEýQñ[¾qˆDÛEòÿKÑ×´•¾NûwÞìÁ·¬Ãñ©ë3¸àTÿ³uOrãgM¿œ]²=q‘<ÿ%hÛ?^ûÿêÁøÀˆÍ­èÌð\`0 ƒÁ`œ| ËuÏ>û¬ÛqR í›+Úu¹n£ -ÅYÿäE £8럼èggý“ŽŒ"­¹£ £8ëŸt4fgý“ŽFŒâ¬ÒÑQœõO:º1гþÛÌìúO(Æú÷–y/T$cý ½mLŸé3}¦_¬Û‹6é8žj=3<%&Ÿõ¿Õ«6÷P̵‚dô£oõ ¸b ·œASO_1ìéè—˜´&Ÿ5 ~µ¹€bþj%£müüx'Q^^µŒJ_1ìéÇ©“ÐçIyÖIÌ]ÄÜ@1ÿ ÂèÛöŽÊøGŒbü¾Õ2´>yަ»ÿ³¦àÔ‡V+ÏÚ†½Ãé ^ÅÜ@É5üš[1bs²×ð°wböN Ç/³à‹zjZŸ<ÇÑÓ·Z€çüQåYO›·BÉHK Ygk+l$AmÞ ´y+PåiG]ˆW-Cë“÷Èzú&“ ›7oVÞ5777£¡¡A1÷É´iŒ”%FµúúzÕ2´>ù«§?í’Ö¾àRý× ‡+sÅüÕôèMˆF­*ãWO€ÒRÈÅ5Q IDAT6[»jZŸnÛ¶ 3fÌÀÕW_­Z†Ö'ïÑõôyžGGG‡ê];m~ÔÉÞÞ^å»ÃáPeƒAÕ2´>»þöú_èóŸÕqס¯¿…¾ÿ(öýg¿¹]ÿr¹ÿÓƒ˜™ÉösUœWÿowH¦7Úüïš²G1;g‹VŸ˜û=Ý•ñßy³ƒ6ÿçE_6÷{<ÇTÆ—ŸKeþχ>1÷ó!^eü/‘ÿÐæÿ|èsÿþý‹UÆÿ¾aóAÏÏ—>1÷»y^eü¿K¶†òÜþ´ã©Êª_+¨õ©ñTå‰ÑŸ˜ýsѯÔúôxªòÄèOÌþ¹@–gPầdþ'ßõÊæ¸Š>17—˜¥O_…ü½=ù]¯lnP†ebnž: $û9¦NBß¶w”ïºes€6ïs³Õ:$û¹Õ:‘Hò»^Ùœô)ó>17[ϲJ› Ö³¬ˆ†ÃÊw½²¹@›÷‰¹¹dÖìç%³¦`ÄæVå»^Ùl¨¸E`öˆäõM¯ýŸ+Rµÿ»8i‹Ò:ÓÕï{ÜÁ-ÀèYP‚‰èµÿѳ¤Oªö?ú?¤ù·HëLû켜;ŽÝó¾á“àtÚÿiÖ£8Íz4eûÿ†ï&ü螯p,:ØyyÚú.×.,—ø@赋°X²ýû|Ò:b1iéê[aå:£Gau øéã?‘¦é´ÿñÖáož²ýÿôñŸÀêÐ= +¬iëw.“´~Û„¯\@¿ýRµÿ¯\Öo›Tëd0 ƒÁ`79 H`NžlG¹Àó¼hDg :”¥a¬þ“°ú/nXý7¬þ‹VÿÅ «ÿâ†ÕqÃ꿸aõ_ܰú/nXý7'[ý-Òq¨ÛÑ$0 ¦/ôôHÇÈfkOYÿ6[;zz%pÀÚ\ƒêO ª‚)ÚÙáÿ•WÕÙÞy³Geæ¤×E2Fœ7{ã(Å,•¾GÎ.Kðšìô‰(³ŽÅy•G™u,¦º8•™Ÿ, åž1èò&wS]œ8€HŸdÜ&²KÙ—zÿ¦'É|b¦¤×ã¹¼4™‘Àš{ 7ióf*}mûinnƇ~ˆ²²2”——cñâÅ8ÿüóHÙ‘S­ ÌÛ¶mSŒ“$‹ò@ú›6mêgpìèèÀìÙ³1aÂð< &(çÉbLgL&Ë£ãìÙ³ÑÑÑ¡ ˆ‘òüg×ÿ‚^ÿ }þ³ú/îúOçúK®O©®¿óæÍËúú[èûtöŸü>¤Úÿæææ¯íþŸ,¿ÍÍÍÿýËôþ@›}‰™YÞV™ûÉx™u,ì ;zUqi¾z]—Ëzég?O¥O›ûÉ8m•®EyÔª÷?äUXçX^õis?/1˜.e[–²ºçOŸ6÷“q iþß¿q^õCšöây•ÜÍçwÿõƵË®/›ùÉ3gíx?}M"%€—¯Ùéè3?yæ®×.§MÄ¢2‘ R=þކd/w"mx¦?@rHߦ^•j]ƒéR ‰dHžéÒßI†t½u¥­/g/^iÃ3ý  UßI†t½u¥ É^îtB¤ Ïô€2¤¿ÓÁQ´ëJ[Ÿd/?Ý)ª ÿÔH¢¿ÓÁa´ëJWŸd/·èn‘6<ÓýLÐ@2CºÞºÒÕwâï´*†«Gè·mû_=BZ¶ý(Pp·ê?ËèÿÐoÿ4ÚöOìà2mÿ}þ—ð«-Çqó¬apì^¨Ûþi´íß±{!nž5 ¿Úr}~ŽË´ýû|J\@Ÿ¾5>ÝöO£mÿ¾5> Ï”¸`µ‚Ë´ýûåŧ‘qøVågðýÉ¥Ûþi´íß÷'¾Uù>ŒC¥¿‚Ë´ýŸúÐjTÿo­ß6áÕæ'tÛ?¶ý¿ÚüZ¿mBõÿ&Ð=ÙÌeÒþ FjV­Z%šL&v>1 ãkKÎFmÄv|íÑ똓ÎÖL×쌘úAòPb2™ ½ 'ÅZÿ|ŽQFOеþsŽòz’P¬õŸ{”Ý“ƒb­ÿ\£Ÿ,kýgeùd£Xëßj)ôœmýçåýd¡XëÚ%‘Bo A±ÖYŽY&Nеþoît ^¨8YëŸÖÒv’¦·)Õ²FêkM"C®¯1‰ µ¾Ö$:ÔúZ“ÂPëkM2C­¯5‰µ~•Ƥ9ÔúZ“ÈPëkMÂC¡¯Ý­Q%ßÛ ºþ8y%ûíPhRÇÖ±'Þ·ÛqŘþ×Z£V”ŽçcÎ~™±²Ù¦¾ ຫ,8¾GÊ⫽þÓëj¥ãýuWYúeÆÊF¿dÆeXs”Œ¯Úë¿J_x$Ãïš{Ð?3Vú_ήFë·Mø¢Þƒ›[qü²ä­þñË,(™5_Ô{ÐÖÓÓ/3T6úÓ+­°,q¢.Äc{$Š*O{Jý*O;¬ .Ä£çs¯b\ËE„ ˜6mêëëÑÑÑ¡Ê «Õ_¼x1L&êëë±gÏ%p@.úVk==m°ÙÚZUf.­~Ó£7Q^£Jà€œôm6X]®õÔ «ÌœZ}[Pꬭ§V—O·§ßó™tõ+åáy•Ç0§ˆ‰®(÷ŒÁN_rq¯YmFÙéQçÑ0Ì)â¼Ê¿#ÕoVº¬ž5{öìA[O´&ÍTëÚâŽkK?ÅpÏY8ÍzT5/SýòòrœqÆJcíï½>œÎ8ã ”——£¬¬,'ýúúzR†ãÞÞ^•™Q«O²";¸ÝnÔ××÷{?Ÿ©¾öú¯ýíÓêçûú?˜~¾¯ÿƒê|ý/ÔùOÐֿלú÷·Íœÿßíý·öú›ïú×þÿ¢×'h;¹êŸ¾þ¦º÷Õbäõ·Ð÷ôþ§úÿ£ådÚíïß`׿Bþþ‘ßß|þþiŸ?Ðë³³«îÿ¬ÖhÚ÷Òÿ<:ãùåpMÙ£˜žõ¨Š«÷-*NÖÍ|^9yðýÌFßÓí)¬¾çXAõµÞ‡ZÿþŪñ¡Öwó…Ýí¹”³>eîçC<þ;Ó:ú×=bQŒþ4³GÞI‚ç“vɬ¿âK(¦ÿtôý>«bô§9ý‰ÌßÑã?14¿'&?„ŠáýÍÐw餀ÈЭÿeCsI{òC ÙÏUTëLs@D C´lü'†æ¾mï(‚’ýœÞnç­:éEà¶ŒLÐÄøO Í‘ÈXåC ÙÏi\®þÓœNˆ~f&hbü'†æh8¬|$û¹JëfOÿi§;EÿþŒLÐÄøO Í#6·*­ú«Wô›6nÑÝâgëžÌÈM‚›*†÷oÿzÜÅ‹F$ÇŸ³oÿ‡_LŽžÕ¿ýëR Œ¼-9zðß‘uû?òl2˜Ãîùª_û×Ýnç­p4OWƸ~ƒlÛ¿ßOµõK|ýÚ¿.à\òÿÔãY¶ÿ?x[’ã.¡_û×Ãy³ÎP¥2þÓ{–uû§Ûzë·Mºí_ËW®Àîp*ã§>´:«ö¢±XD2dflÆPát:Å©S§¢ºº¬Ý1ÅǪU«ØyÏ8)È8€ö¡§v^î›”Þ6 …NºúÚñgŸ}V5=—í%<É: «ÿÁëŸtR3²þéŽo…„ÕÿàõO^’Yÿô‹·BÂêðú'ì¬ÿT/†Vÿƒ×?yaddý§z 5Ô°úO£þåN†Ö?Õñ¸°ú¼þI'1#ëŸîxVHXý§ñû_‘‡ßÿ výjtõµã¤“˜‘õOw<+$¬þ¯ÒIÙÈú§;>Vÿƒ×?1¼Yÿ´‰¦°ú¼þ½e^Õt#꟬s¨Ñ †zßjA•™ˆ´#h×A ´–P+¨23åSŸ:Tú²ùsö_6tÒZï¹U6Ÿä_Ÿ Tõ_! ¶bhŽ?1´ÐZöcvØÙ‡DŸtè§µš½I2 > ¸Ckµ™´™‡æøC­ÕÜÜŒæææ!Ñ'†^ZËápÀápäE_ox¹ƒ5­7oÞ<Ùhì6¤“-²', 'œ[ý“/M‚€·zÜÅõïÛôÿ³÷þ±qTiÚèÓñg!eç#Ç6ÑÕ$¬’¸LÐ&Y®¥8Y…| «¹Ñb.hÜM²0É5“a5팡åE7¾/N·YFd1ŸèÖJ l]§#y³IV˜.;èÙOlÇì 2cw99uÿ8õž:U]Õ]Ý]Umˆ_Érw×çT½§Î9uÎû<¯Nð§ö^4ÚvzZÅÿ³w•÷5@þ\ˆm/t=$ðr5¦2‘ƒízø(0øËl5ÆþÔÞ‹Æ·%Uܸ bð‹aÔŒêäÛÙö¢øÒ^¨«áj8Dzýn¸sCç°ï #q©«D`¬óq´íj8‡™ø%ì;3ÂeÏŒšÈPW+Š?sü(–vDZèÜ0¾zq=rá+tœ½Œkbçjz×0RΑ _aÉàIÌù_½¸K»ãEñÓ£^îPq*ÞŒg"Œ<öAV. #wúQ¼– ÎCt4«xȆñAV2Ì2×¾ÜQüþ÷õõ¡»»ýýýhkkCcc#ÏàzâÄ 8p à:hWW'ŒÑqãããhkkCwwwQüýÏ¿L¦¹œŠ§ŸJ`ãú,Eæ ×ÓO%ɘÔþù+÷‡80—E&ÓŒööQÓ1…ðS‹Sˆ×Ç‘ +<ƒ³’ÉàwÙo`„«Èã1»Ã°9"eÕmÛ†x}Ê%v.?Âß6&a¤c1&ãÓØ ¡^^‰O²w P×ζmˆ†0Ò±˜•G'÷[ßMn(!@;0SYª3ñKˆŸÍñ ÊûÎÌàwwÝÅ÷³*Ɉ ?ËÖ®]‹™ø%Ì*µœÀ[ ¿³³'NœÀÐÐÖ¬YƒúúzLNNâóÏ?œ8q‚“@E"¨¸mhhCCCøüóÏ199‰©©)¬Y³'Nœ(Š?00€p8Œ®®.žõ8£§§‡g8&®Ýz°$TUE8†ªªhhh@Xo“ >ÿ.Ú'|ð»ý/†ïwû_ ¿’ö¿ÚÏ¿ÿ;=ó#‹±mÌÿþŸD¸¬óa™L3ö?ÿ¶ïþ'6k?¼´;Ž™ãG¿ÖþwÓþ:ÕÿJÚ_7ãBq0;vì¨hüQÉõùÜïë·ö;Ö2Trýnú¿bí_ýŸ]ÿ À$6àWÿG"„Öõ˜x}©Å)är*ÿ)ŠŒ‘[‹ŽÿØ»š‘áœþp´Õ6¦YÖ{«€q=gyös9ÄHÑÑDâRñÛS2Tõlž@!|§5¬rð·mcYç­"ñÃÞ]ÿ²8÷’½ á««½ÃÿÍo:¡ªgóD á7¬ú+Ïð\ήß*P¿‘½T|:ÆinÝöþ˜KQ;TNöçHÀéG|ý·ÿx÷o‡ÙÜDüUådq~…DœŽq§s\D¢ Ò’3¾h]€&Š6¡ŸþÓ3›F†t"Gñÿ}ë®ÉÏ]ÐL¢MÛÍ™Ïo}’‘¡àÊö™ÈÑDü¯eÇ‚”kòóš(ÚD„~úûÖn™¿ƒÎ*µX,Ï`±ÌÆzDüŸ:ÇÆ€ åŽü‰@“Qu"ôÓ_$r-úüð0hiaDüÏfW"ªëҹܒŸ#K#š(E„~ú{8¶ «dV>Uf°J®Å*¹J&cdAÏdø8•Îå–üüíÇ~¨‰¢•Dè/”ý`´mÉàI|õâ>Æz‰[ò³µþ Ó -1תûbý§mðÖõÊëÿ•3Æç[Ÿ4×2±þ‹Û¾x£òúÿú¡[Œ¢õßoªÿo]„Ç·.2Õÿ§ö~Å÷ïëü âú?ü¡!¸ùÁß›ê?æÀ\ÂTÿ[Ö'øþÉü»Šë¿’0ú·HºÕTÿïjý wµ~fªÿrÔèã’ÙŠëÿöÿçŸßÛ1Õÿ“ßmÄÉï²õªÿôîM–\ÿ+5"æaGJ´¨Ð‚¼®3ÛÏþs-‰Ì ¡‡d2ú¯Ù…“'Ob||¼ê 8D‹D"ÚÍBN®y‰=û5/a^Ô‹»ylÆ â ö°?*õšD'z{{±{÷nÐï~d&rs^¿°­Æ‹ò'^ˆ¤O÷¢’2Ñq„³{÷î‚÷9Èk'<ú­««‹OÐßÌþ§àº•”ÉêÊ~ãtŸ«éZüñ³_ÿӢ݋JÊdõ?-¼9Ýçjú_Ìüs3ûŸ&íE^¯üO—N÷¹šþ3/ÝÌþçÄÿ´÷þ§ÀW§û\Uÿ ™¯njÿsâÿÞŠË”ç=ðØé>WÓÿµ=™ãG}-Ç×ÁÿF÷¢’2YýOgN÷¹ªý³ŠôèBûOÁñt/*)S^ÿ¯g_uºÏÕôx6ŒÔ┯åø:øŸœè^TR&«ÿ)ðÌé>WÓÿ"ùáfö?%Y€¼ó?>;ÝçjúÿT“ÊofÿSP¼”é•ÿ)“¦Ó}®–ÿ/ÿ_+1êg9¾þÿíuo®J˜‚b½òlŠñÓ¹«åkvŸUåA "¾_e±f÷¹S!Ńïٴ¸h|WWƒtqW`ø,Ȩ_K»ãœôþý­26ÒмÜa>ƒÀ—ÛÛcxez&Á—FûÎHžo†Oëïôrþ}¤c16xÿW¬Xaú~âÄ ìܹ30ü††Ó÷îînNú FGÍi˜Âá0R©T e ËeTÔµ{ãUUCû-óú°_¿¶ýwšƒÛ~ê^Õ€t*…UÅ!`Hcd:_º@?¥ªjHŠ›ç•`ÑZvüœe~õjLÅ2½íçýÂI`Q„ 皌RDâç“ÒEð/îÒ¨}§ù¼Úkß¿T’1¿'¶ýÔ/Ì%¢V'ÖlÚŒ¹ócYªŽŸO’öÄǘFíûœ>Ÿt ¿Äõ¶í|þÇnž‰úÚ‡ž@ÍÖu8öoì˜[Î|„›[p z†âãG â¿–4jß;ô{šx5û[e>ÿ`7ÏAý@G³ ¹Å8F¦¬µ|þ¢ þLëÊd |ýÓn•Ú®®.466bdd çYiõã â··jÔ¾÷¼Â2yµ·ÇÐóÊ£z;/0ž±ýgÇ<ŠºÿC&ÓÌûŠº:vŒþþV?†˜Fý'LÅY¿ž £=%›æȨ φ±6vvŒò¦‚ö”ÌÏ—’Rñ7¦%ú—SMz&ÁÄJ³˜R.ë}Í,¡÷±ú${6ÆfÌ"Þ¤bEÌtLáç/v§F£Š¥ßŠK8¸µWÃ9,‹$ÿØ–:~ìÁ­µˆ ¿Ñ¾³áb[êP ~6‡Ø–º‚ø;wîäõH†Ô¿ÑwªObßGýâ¯ýk‘rÅŠ˜ššÂ¦M›øññS©”i]0úUoi Xìw–%¦§§ùwUUùs¢¯ÄwÓþÛáKz?Dû_?ˆö¿~¥í¿›ç_Œ £çÇŽ=ÿnüo~æÙ{?Kƒð?Í‘À ŒËð?õ»â»½—áÿ«á?'ùÿj8‡µ1¶­ÿkRu‡ÃX¾|¹©ÿ¥q9µ¿;vìÀ@ìÎ’Ûߢã=0ÇÙÐ3Qéø£ØõwvÖñ¶ÚuÀ ŸÓõ³¶Þûë'À臣/ªôúÝô…Ú¿ ú?»þ0ú`¿û?{‰s4/ñÚëQìÞÿ|ØZtüÇæù¶hÑugMdgÊ\ž½€<4‘›£ë΂2žg/Ûí_Œü~!ë@ðÈÿAá;‘ÿƒÂw"ÿ…_(M ÷¿À|ˆªª!)-i*TÙ¿íVÆ4üb8O€ ÀˆÉ"¡"µCÅ÷þ[ŒüOøiIÒ öÉ–býöµ½Jž‘û!Ä^Û«ðmÉ„N<-‘ü¯ÿ7²•kæ9‘ô/’£1ôcK̰÷À @@P¸ :¡sîGF¶ò˜çüEÒ¿HŽžkf$è[Ÿ®ÀI`š È=ÐIÊç·„èóÀ‰ý€™ô?«lïšM›17tßÚ-c›1—Ôçf25Ë‚îlDRŽF/ ÙÊ b?`&ýǶ¶^F6»‘Èe—‘HÀeˆdêd²ðõI9:5²•gÀ‰ý€™ôÿ©bT¹½J&ƒ‡c»´#ù&œÉÔÉkÉ‚øDRþtO”g+_8’þE»Þ¶“ ¯·mÇ-?;È|'©?{ëñê?fìE/D£úOUußuöß‹úö¢¢Qýí÷öß‹úÿú!ƒØ/Ö1(Õà~µî± Ô ʉýbýÇœq,Õÿ–õì{tð¢þ±_¬ÿ¢Qý—£lÎ0úg¬¼^Ôÿí0ûíŒê?¾<ÔÉæ¨K©ÿ•Z¶¥EËÊÃÈ¢Ekö}í#(û¦^××Å&&&ðÈ#àäÉ“Õ.ʼ¶Gyï¼óµjˆÔ¼mîGÅúïìH´¿ Á_ß‚vøða­§§g^ˆnü׿ìP¸?®†>|XÛ³gOÕïÏ‚}}¬$» CQuð6èEÄ£`HUUCâg»}ƒ†´ÚMÊWR§ SRÌA¢AÙáX²nVÿS† F£}¼:¿ˆCóÁÿt@v³úŸ¦Å€ ?üoYt«ºÿЀ´Pn?ðæ»ÿ)ÃÁ~sÏý/]ÎÿÏ5³IJ²›ÕÿWc*jJûxu~‡0æƒÿk6mfó°rû7ßýO>( ˜öñêü"aÌÿ_oÛŽ%pÜ(·xóÝÿ”aÂh¯Î/âÆ|ðÿý­2…s‚nVÿS†•Òþ¶ÿ"áj>ø`‹\©©|Œ—xóÝÿ”aI$úá;h5ý/oˆHòï7«ÿY†Ÿ,H¦}¼:¿ˆCóÁÿ÷´þÀJ`l–—Û¼ùî–ár%ˆ§}¼:¿ˆc%ÛWÓÿ«£zp’ ÕK¼¯…ÿÿÉßöÿñO£xÀw–×ÿSèü.gY)ÀO ¤}‹=*Á—",Ë3( Ùfß"DJð—¥êp5œã~¢ €±oa¢G%ø76·`ѹaÜò³ƒÌ‚´o1¢g%øÛb£8oÆ‘$ 6¸ÿ‹ *ÁoOÉÈ„#ÀP }‹]*Á¯«“Ë©xíu 0K€£´o1¢g%ø+bË1ŸÆù{ïi qAÚ·ѲüM›6ahh¿þõ¯˜hßbDJð‰388À¼þDû#úVZEQ Ë2¿vQ€ö-F6)›·´&û}u2nIØvc ,·¶XÛß¡²l™Dò#¡Z§Ì€v×ä„Oõvª›{V;X¶`"ùq¡Ô¸øDô·öXÛ¯ž?„šÈœÇ…:/îbý‚M1ÜâÏ?ŠEç†1³¹@ _Ž-H@œ9~8®‹Q¶m7‰”ŠŸ•p*ÞÌdéQœŠËHÇF9ñ_œ‹ ~ =*!=Êú€û[Í"¥â÷õõ™Ö»ûûûÑ××Ç ]âZ(µ´²ÈŠ$ÅRñ÷?ÿ6r9ûŸ—¸ýNf„¡mìM2‰¶•ŠŸZœâ}ò&ËäœJ¥¸ 혢ÄþÑ*P >2›5‰™¶é& ÓlLÏÚŠ¡•ŠpÒ$b–é¿É2~6‡=‡ò!‚,K¶ïÌ jKÀëølÅŠèïïÇš5k8É‘ú'‘˜Xîõ pÑ ;Ò÷òåË9IR¬ëVrn¹øÔÞFÚ_ÄNK,K÷~˾åàS{Ï ¿éâø’ž%| î¾ÞÞ„csûo‹/íÕ}UyûïôüØ ‰ü?00ÀiOÉÀâòñÉÿñ&­°æO)6DCX[α¶åâ“ÿíÚ]€µ½=¯DñôS dËŽ±ksËÂ×ýO‚;Òq³ÿ™(ÏGøêÅ}¸±¹…ÃÞ¿üó?½ƒ.–gP»óÿLü–Åê<ó?`ßþRüIWW&&&òŽ¡zXiûë4þ(D@÷rüátýÔ¶;½јůë/$@ãåõµ5ÖþÏ®ýëììÄŽ;<ïÿÄq õ¿L}°×ýkIæ±”ÜÞŽð›aDq‘ýϿ̈́:ÚS`~;d‡Ïæñ Úέå„èbFYÏ[ dé IDAT–Aþ ú‰O÷¯ÎW|ü_ˆè'>'ÿŸ¯>‘ÿ?¼Ð[|š?(D€õõþ»˜QUC€ì] ëÛÊÄßœìöŸ2â?€¢äŸD¸Eþñà]@øÍÉ.aÄ®ÉÿóO ‰YÐ)«9‘ý­Äg²æZ3,ëù!à9Ñ" ŽCñYÈ‚NY͉ìo%>“ݾ•¥¿xlM@çŒÏéë5MÀeŒv$B?bÄg# zͦÍ&²?e?·Úby³ØŒ/{Y&ôš3š„ÎSt{"t2‰P$MÌ‚ÞÚzÙDöçÙÏ-Æ~¿Œd’ DõÄé‰[Ÿ“啈D.k„c‹-Š,hbt¹½ÝDö·ŸÉØïíx/~ r{;"³y)Q r‰‘ªúÏÞúEèÛýP³ »!ÿ“‰"_½¸ý¨¯“Ôl]‡oƒ‘ªˆÐß”ú?çCýý»úß×éWýgºhýÿÇ¿ó¥þ+ 6,Vÿ“_êÿöÿ·¿pÁ®·mÇýIvLõ¿#’|«Ò‚Ž\Îwrfx’Ìþ£±Ñ/@G.‡´Ò‚€êX2™ %“Ié‚ÏT‡Ü>ßíH´gŸ}¶jø5/AûŸcÀß¼íždã¼ j{iâõ-ˆo{öì ;vL{öÙgžÓïMµ‹±`_3+ùA²N”Ò$8MΊ‹ž¿8LÒ“ õ"HÒd ½½½X½z5¦¦¦<#ÿ;a΋ÑNÁ°^›Õ'NœÀÈȈ) ËÍäÿ®®.´µµabbÂ3ò¿6`/4`Å Òÿû÷ïÇÄÄ„)ÎÍäZ›žžöŒüï„ Ø Xñ‚ôÿo¯«xë:LYàn&ÿSäûšwä'lÀ^hÀФÿo\PñÅñýfó? ÖŒzGþw˜`Ʋâéÿ™ø%|Ù«˜² ÞTþWYðÜÐ9ÏÈÿNØ€½Ð€/Hÿ/:7Œ%ƒ'MY(o&ÿ×>ô¾zqŸéˆeñÊÏNhÀФÿs§EâÕ„) èÍäÿŽfÏDd|U<#ÿ;aöBV¼ ýŸ +P2SÖ›ÉÿáÙ0WùöŠüé„ Ø Xñ}þÿ‡r>ÉIé7›ÿ{^yO?•€¢Èž‘ÿ°€ ËŠ¨ÿ3*.& âûÍæÿSM*6DC,ë¥Gä'l€„`²âé5©r"b]»tÓùŸ®_|IJxeAû_œß°?I`€!ý·´Ä„h„êA¹å߯­ÄO¨iæÆôýÓŒKïážá32¿iØp/pþc}ÿ½ìwý=Ð+|Êú, Ôl]‡¹30È¢ôâ>e}ä@щ¬@ã`¯ðí²ÁE¾S†r‰ºY†Æ¢^áÛ‘‰H`ãú,F>d_ˆ,Jã¯ðãM*b2 ÔË+1¥°·mc&ãÓ¼ò ߎxAk~õõõ˜ššÀÖ£†††099‰;wz†OÑH ±±ãã,0ŽH"´S)¾X;ò% H¬­À+²,£¹¹™2V–]Â^tn˜“Ëpò?`Pß#ö ¥`[÷“$I£ ¾DìX_° ,À•ÚßEÁú|zZ5îÿ4þÀ¿é_ðÒÿ=¯<Šë³e…¿ðïÔÖŠcv/ý_ûШٺŽgI·üì ïsÅþ×oÿ‹$súì…ÿ‹µ¿bûS¨þ[Ímû+Ž?¬bd$@`mû á{uý‡'öví¿×ïóGïa"ù½¾Ûë·ëÿÊiÿ¼ìÿÄ2‰÷jj*ï8݇JÚ?Zë‘ÛÛùüþæ)Ä9‹\N5!‹½9ÍqRVsÊhN¿±,èŒìLYÒ£ëŒ}ˆünRú\M!!¯ñ‰ü/ÎÕð_'ÿËòJ(ú\I!!¯ñ9ùÿ~è'+ à5>‘ÿçýwÔÜøW……¼Æ'ò¿8W\HÀóû_âÜ‹#~‡ŠïýC ÞýÛaÓ<Ãí?5²mßþSöÿÊO„¹ð;TÉ„ŒHT1ͳ\bd?¸„ýßwݘ‹)gî©І×H"¿D„v"A‹öÖu㳿‹Vó´¹1ð¸º9]ä—ˆÐN$hѾxÃøLkÅ3 ë¶á¬†ó󸮚M›€ 8‘ Eû²WjÐ׊e@'K$VjŠÂHÌÙ,#ôàBN$hÑ’I#ó¹›vτߔДKLpJÉ0B3.àD‚í½ø1ßE»/ڪà mîÌG<®ª²%ƒF¶hZ#qK|^¨ÿ õÿf®ÿ¥ÚË€&u“ÿBÖ á¾ã566j®«CV†Ú¼PwnÁ*7òy5IÀó¡ ¢U»<œßFþï€vDžQƬÿ˜Ú'‘qÐu.ˆTǪ]×çKD›oåY°¯Uœ€ý\¼x»wïàmð£Ó„Hoo/n¿ývÔ××T›%óªLbyHý‚žD,¯‚`ípOœ8€)‹*À^=•Z– .`ddƒƒƒ|²>ÿwuu¡±± Ž‹¢ùá‡îînlܸÑVüÁOÿ‹ Bâ"G5ü¿ÿ~¨ªjZ Âÿ QLí™Ì?„Ãa444@UUSüö¿%;UÃÿ¿½®btÆ„ÿÅ`Dq‘ÎÉüðCªâ±%lRÐäà§ÿOO³EÊÆGØÕðÿ *S'=Yþ¢‡[,ÑÄ`P1ÀÃÉüðÃÕ˜Š[Ÿd“²Ö ?ýOAÀ” Œ°«áÿ™ø%Ì*µ–Øü/ãŠ.Næ‹V÷v˘Ujó‚lüô¿D"UÃÿ‹Î±¨1*ÿ‹ÁXbð³“ùᇥÝq>9o Ò÷ÙÿtÏ)(aWÃÿ¹Óbø?²8’TxÐw ý³ ¹…ežƒÏÌ?¼Ü¡"ú\Ãÿ‘5•ÁoÿŸŠ³AÊÆJØÕð&¬/n PAøß‰xïd~ø!^ç‹ƒÖ {?ýO¸Ö`ÿª<ÿˆ5QSnþƒíHVóÙL3ä  &šäç§ÿs96þ£lÄ„]ÿgTÜPB¦ð üoGF)d~øa¤c1VG/ã†Ê#¹øéÿÉø4#4aWkü7õ+ÆÄßCüÀÞêï«ÚøÏ*~ bùúügTŽé÷øO’$M$tŠX¤Äy/ñM„N]‰ÞýÅ)¿êŸHè¤lМ*H‰ïa^â‹„"ƒÒ» $Ö/ñEB'‘AiìýAVaÙŸÓ8ÔK|1 ^ (—ÛÛMZ4ó_$Q6R{(Ьg†©ö_$Tá’ú¾O²w°ìË€©ðßš…0ˆ/“““<û$0¼Æç¸iî›Ö~ˆÀ´â>•A$µˆä§ÑÑQ477ct”Õ}EQ<-ƒ$Iš©Oª¨¿o ?øe/`jDzŠ"Låbö¢/¢‘èíÊ®à½dbÀ¬(NÛ£ª&q`7øv¢/¢‘è*Â~ñ†äj#Äz5¦šÄi]áÛˆ¾˜ðuÑO „ý²W0k]}Ì$Žê߉À_Qp‹ïDàç\H0¾‹}}‰lnñüâš/ €àßÅ6‚>‹Bnñ‹e¦w.z%˜§ŸJ€ãû¨[|;Ñž…ÖA GÌBët·øÅ2xÆ;Èù–’ ÑØ‰¸Å·’fÉfâ—pp+ ¾Þw†={g"ìûÖä ß&’6E1ë\¹~!%m_³fq/&'9 Ñ bÏpsý…¬€ÑNOO£¡¡uuu€<¦‰ ïöù/Òþ‹DP*‡ª‹X…ðýhÿKÁ÷£ý/¿œößîÙõ‚í•ÿIôÉ.&سo'„è‡ÿIts¬½UÎ'1òa«­§þ'ÑçïkwŽýÛ/!6LBÐùߎÌ0ÒÿžCÀá½Îí/K…í/‘²V瘾/_¾<¯þ—Óþ:?Ê! —3þpº~" ¬Í`úNïCbûïåõ—#@SÎõëÿJiÿüèÿ††¥N¼ç¢x åôÅžÿðl‘Çcœö^üD˜¸%ŠE¹}/SZ ¥†gºŒ1•Hv ÐDж’ŸO5Bqnˆÿ¢Y pLP±4|ªJ'ÀY €±ØléøñÅ~‰@tAÃ@ͣ콒eq/ Ÿæ)¸"þ‹vß}Ç´šÿйEÿð›ßt–Œ÷Ýýü|nˆÿ¢Y °Lе4|JT”N€µ›ƒ-ñþû0Mdq.šD¬ä?æà‰ì/ÎÅ“(€•ü_.~Ÿž¥œæô­èb6*pƒéØ÷5V(Ãz¡zPóç9}+º˜Q¦tñØšQ}~ˆ2¬"Bo8«àsúVt1›UŒ›DÇÎ ÓIДaÝ™H¬ÔpÒ³•]̆‡Ïtl6ËÄO(Ãz¡v0ÑÄ^èiNÝJ€.fŸ*Æ=¢c•LÊ%…gX/Ô¬:ÌðiM£\´xì’Á“˜;óϰ^ˆ½Pÿê?póÖÿrìH4µHèó±Aƒ$>’@t|RðŒ[1 ,‰hÉdñ±óË€Ö.<$­ÃÞ”1ÛÒbÄ< »?p[ær¬Ú„×jãÏ·²é‚(ù_À B„LòùweÐj„þÑk—ÀÜ0€tõ®¿Úu¾Úøóµ, öõ³?*÷@šØ½í¶ÛpÛm·ñ X/¬é`H X»vmÉç®dr†‚,i1à¶Ûn³U¸õ3÷âÅ‹e.\ÀçŸÎ'»î›&.Ô××ó` /¬é`AnŬçöÂÿ´ÓÐÐ'þ þ÷Ãñ—ù—¸pá&&&xKþ§ ›ºº:ÔÕÕñA/¬é`‹~<¸§”s{áÿ®®.H’„ºº:ôôô˜¶‹ÿý°‰‰ ¬_¿ÝÝÝÈår\ù?Hÿñ|é:`“¢ íѹ‹‘þ6±ö'-2êF‹“ÿ¬çöÂÿ§§U4/–®“ñàh~æO?ýÿª$e9×>RxEþ'âyÛ­-ÀŸÇF‡‹äÒŠ‘þÍÀ®?oÁé†1»] žÛ ÿ«I·oÚnmÁéȘi»øß;ÉÔ¦œhÂàÃ<È%HÿS0ÃÁ­µÀV :t/pÑ›s#ýl‚ÚôâöÜ^øÿj8‡oéÙ‡b±ü ~ú.yßJ<ŠøÞö™:Ä‚Œ‚ô?¥ó ¨­ë€ãÞœ»é`äßÓîFzóJ»] žÛ ÿ/:7Œë¾¯Ýô–•¦íâ?Œ²¾uœ½ŒÆoxwþçÄóµ-h g¤K늭é`Aç-ÚŠºµÎí…ÿOÅ›Ñò§­ÀÚlÊ„ÿ$$EîàÂ0^î`YWƒô?ÏI[¾SFj*Uü@æ†ôoG¼w{n/üO$üUr-ÖÆî3mÿûaÊ%2Úq!þ+|ªÌ ža¾Òÿœx^Ó @ÁÆõÏÎ]Œô²œ  ®n[ÉçöÂÿ¹œ ÌE€šVÛ ?~úÿµ×£xú©r9sYd2I´·êNòEгÁÍ?Ð…#ýÀ=­!,’/›ˆ×nÏí…ÿ'ãÓX$k€ ¬hÏÏpé§ÿÏ'4´$u!Å ÙTcü÷忯BýŸq/Ìé:HpBcîÉÿÖs{5þ«°ôßW™íƒðhŒež‰_·ð)ÒÿèЇa@É‚¡˜k¾÷ç-übØ €ˆOïŸûÎÈø²Wp’‚ÿ޶'¿Ûˆ#Ú_ãØ # PèQø÷·ÊhùA-:ŒÄ« (ÃÝ€ ðåövÈQ«ä]<zÌw ø²@¼! EIê$з}ÇoÕÿßÓú{,ŠhX-_æ,² ®ŸÖ¾˜Aá744`ãÆ¨¯¯ÇÈÈÆÇÇÅ€ÑÑQ|ÿûßÇÀÀš››¡ Aï~•¡þ>ó|çÊ2üŽ%å?tŒ$IZZ’Š’ß×€‡õÏ„hf`²ý¹ •KÄ—ÒRQ`Í(}þõÝæaÔ˜; ,³³,nœË5¾´·( hnè Ë,û¸²s€I•ŸWp‹?sü¨­ÀÌñ£Àq ö!F6üͽ þs`c2+ñÚ?—[üô¨dKBKJHà ž‰°ùH¼Êˆ˜§âÍø «p¼6Îåß*lM&üÛÚÚ8ndd[“ž˜˜0­ 8p€ŸË-þþçß.(@Âk¯½Î¾ñôµ×£úöǹÅO-Nå‘@E1 ­’Éð9;â¨ø»[ümcRQ‘øÏ„hØï"ù`¢$t.·øVa[@_oˆÕ!"ÃÖâð^à®ßý¿»ë.ÀžCùÙÚØü\ÅÈ—„oÖ·3"RÀDÂ$Û¹s§)>ÃÍõ[‰ûV#ò+‘oszÖ5;ÏåúùwÑþáWbí:/—µÌ~µÿnñýjÿÝâ—ÓþÛ=ÿ"¹Y$AOOOs|§:SêóïÆÿŸdï`ïâ2tª•8Ÿ¸Œm–9 ¿ü¯(2ä jZ!ˬÝEHÉüòÿ’Á“Àÿù×xfí-øçÐv,€ŸÄ5KŸí•ÿ©íEPöbB(‹e¨5µ™·Ö‚F¥úß®ýݱc'v“Åúõë€{íê9í¯ÓøÃî 1‚®®®<z9ã»ëïïïçq^$‚¶fÍÜvÛmøüóÏØ·ÿ^^¿Hn· ÐF2&1­œëwÓÿ¹mÿüèÿHü@ìâOËéÿÜ<ÿJ&ƒUò.ÜÕú[‹Ê˜E°ÉÚÛGùXÒÍ{™ÒÂíŸé2Ö”ÙüîD×áù,'A0eA—¤-éX À8Õ¢r€  \äqAÄ ¬ =%»Æ'Qpˆßç"ÅpDŒFßNR±m›ûë?uеG$¯ä"Å€èb÷¿æQã§«1RÜ=þÕ˜ÊÞGI< C5D6@+$pß}ÇT'ÿÐÉüîñEòÿo~Ó‰»ïîç"ë×îÖ ö9aÓÓ*”Ü㟞V!Уª|~¸ÖÎØs¹Es‹/>c^Ì誒Ғ¦B'ücØ46!a Ÿüï~Z’4è„DÓØŒ„€|ò©ø|_ >ùù}}B$?Ì÷Åði¿ñp—ýœÈÏ5zЉüÌ P|}DÏV>ƒ ¸Ë~Nä繡s¬&ò3ÀÈÏ…Máó¸ñp—ýœÈÏÙ,ë;Dò3ÀÚ¾¢øz;Œc¸Ë~Näg%“ù`m1|ÊV¾¨ˆø ýx"?À·û¡#þŽ[i _ÜÀ$€?ð_ðÇ¡ÒÈÿâ~£3Ʊ«ü€f@Õ±¾¸a~&Û¡A§P˜ÿ.Hÿ¢™žýó0ðš&hsc:VÆÒ×ÿߦ6€™ð/ËfðøÖEÞ‡}»ä·uýããã¡Æd£GpÏ?`´ÿõ/» ï¨sÓcÛ0Ö8æé³1÷#„ŽÐøYBÁ±ôÿÅ1œ?~<ûÀÂóO6žÿûz[ÙSSS¸pMº¬]»–g¥¯ÔÄ ÆÞ^–å‚Hÿ€‘y„ŒHð@~ Ò•+W»wïæç-70ÆZ¾;wrlQåÖî˜JM<Ÿ$IÚîÝ»ù"Àm·Ý†5kÖ ··»wïö ²¨MLLpŸÓ$¿&ú_ÌöBFÄZ¢:811©©)LLLð})(Œ‚?ïüßÙÙÉ øÖÅ¿ýß××gBœ³føeÓÓÓèîî`Ùxa¢ÿÅL;d´èDF$x€-DŠB´0I‹?úožø¿¯¯c[ï½ßþׯPWÇ‹©f{mïk@®™ÍTÕŽâ´GW+ú_Ì6Gö@È<—knƵØãèŒ1ù Ï|xçÿ—KüúI Áé˜JÍêÿ´$a“¢àiYÆÒu2ûHÁP‘€ ¯­f”ÐàtÃæ’ÞœWô¿˜í0ÄIN"Ál F ¡ÒÄ¿”öÞÿRDâØW’àÙ펩Ԭþ—Ò®6©|rm·¶`ðÉa¨c…f¼¶¹¡sˆŸeínlKjÂ9OLþ²-’ÕlÚ¬/Ą̂EülŽgšUjùâ ¾ð"I{=÷ÿ²T'àÏZ‚E|÷¿´jï½Ø€¼2ÔhုmÉàIì:Ë&ØÓ[VêYé‹gâ.f¢ÿÅl—dÖE¡Ž³—ñϡߘÊEF ?ü xçÿ›[8¶˜¡Ïî˜JÍêÿ™ãG±të:üsÛv|_»ÿܶµ}d›5Î/û « wš-ÄÔ=ø6NÅex¡`êÿ…l£dDü¬mAî-ÀÖþÿGd¾¯¢/ˆRðàÿ·ÅF9Ÿ‹!8S©åõÿ£äWˆ>Ö¶ ú\ÊpÂ6kŒŸF>”‰Þ ý/f{MTä¾ ÿ*oᙌž)øðÎÿ±©Ç&1§c*5«ÿS‹S32€v}A¾á7íƒÿý2E‘‘˱A_]Ý6=+}åõOô¿˜m—Yò]h`@ Ëæ²üxå¼1¥ÌŒ|xçFaççbÇTjVÿïþm=q’@oz^.˜µÒkû${rÖÿ×µK˜ŒÿH//rTqýOYŒˆô0²É"YßE6HðpCaèȈIäÀ;ÿ¯ˆ-çØVÒ‹ßþß6&a$±˜௎^Æ)E³vziS¿jBý¹1àßÙX¨þÜn 42¾‰þ§>åñOÙ8ã2X= òÿ—ÿ¾ ˆ_·þìSLýª Zp1±’“"ß\ňi¢8Š—ã¿ÿ¤ˆ„PREýŸ}Š/ÿ}4é"^ö¨* hÒƒúD(ÀF7éB„^^;_^©¦¬(ïl®61!<Ïñ¥½šºúj6mfsCç07tûÎã’šÈP‡î…tq—÷øÇjK»ã¸Þ¶_½ãÔ žÄí¯ù~_½¸K·®Ãµ1ÏñÓ£’ör‡Šû[Ùõ~UðAVAËŸ÷ÿ™ˆ Y'zŸ’R\p `ã< À'‹<ƒœ‘õluÞâïþm-“iÖIÿŒìÉHƸãé§ظžeõÛ˜¤t,Ö‰V¬û$ ¬–/ã†ǵ!ÂH– ÁxßÙÙ©Y³_é„lÍš5|Ìkü¾¾>­»»ÛD|›˜˜à`hkkã‚À^âS´p8ŒÑÑQLNN¢¹¹’$™æÜ'''¹¯WePU5$mnÑØüŠaÿãÞ¿ÇÁøxsU‚÷¿½®â;KÊþ$‰ešKK6Ž‚¾Ï…ÙÉd^·Y …N}±$±L{RZ2„^íl;#ûñùÔ,“w]BaA|"þlp4­‰<¹äQ|Ù Fþ7yçÍcÒü\!|"ë×ÔtK@Øü—((PŸÈbrKáéÖþ3DÖ/(8’Tlç ¬„¶Bø´–VLPžžÿ††¾æ?88h»j(„Od-ãÓÞ^{=ÊÞÁ6D´B–YßHÑ{,½ŸÂ'²¦ "mKM¥~3? -Àæd¬Yh­„ÒBøñ&±1É• ‘ÿIˆ F¶šUP >‘%Ë3@‘éŒ}gf€­waß{3\ˆ8fs̲TÏÄL$?'|ZËû«­Y³¿þõ¯ùwk܉լ„ÊBøYÑö\”…›Ö¹iÍ[ÒìH°VBeÁçßEûßÐÐÀã,$]ÿÃ?t¼~¯ÛÿRñ½nÿKÅ/¥ý/úü$l·$èRž7þß ±çŸc“ùœHþvB$@ÄÛy¡‚¤- ¿á^6Ÿc“ùœHþvB$@Äûy!çìçÔ>É2#í!Z$ýÉßN€Dˆø/’ÿÉ ‰ŸPû,ß)ó$€9ó9ÅZØ ðdÔ'Úô‹…Ä_ˆ _³uO—)@Ä»q¹ÙÏ‹ aømÅ„0ü¶bB~[1! ¿­˜ÆÍb7Q¼Îx¦Q ‚üÚk¯aûöí8™)<Ññq´ëF+rhõÈ/éº:@aó ™áa$\${Ýz'Ož,º_¹&’€o¶ø„͇go>”!h£k êù€ÿøÇ¡ÆÆF p~îÆ[ÇQC}bÓ)ÌýÈÛrÕ¼íoôÏsÃ@c¶@y< ±³›]àf|öÌ{+¹òÐäBoo/V¯^+V`Ó¦M¦}* @'ÈÝ‘°iöÊ•+¶DøJËDŸéwšˆ¶›t÷:ÉZ± ;wî4ñý.áS†7bíÚµ¦}‚ôÿ‰'LÄÿññqÛ ¯ýßßßϳÏX³ÐåZT!ñ±úíZ€–$ ===¦}‚ôww7ÆÇÇMv‹€^û¿«« ’$abb´Ø^ –Ûòˆe à&¦zï·ÿ;TÏ…ØDØw–˜ë‚ô®¹ÿ߰‰ÿCÈÏBäE™è3ý~zZÅŸ´ÈxMQø¢I¥XnË#–áÁåS\†uáÅ_ÿ«*°MD.Z[=ÿ?8Ñ„wÿßaCõw ¶Dx¯ý¯&Uܾ•¡Š ~•`¹-X)"AM2ÿ‹ßý¯BMä ,–gL0+Á.Çÿñ³9ì9d¨.ãüǰ#Â{íÿ«áË3ø²W1eù¨ËmyÄ2P¶ ÀœýÈoÿ×>ô „ò²°é"áñîŒ=ÞkÿS@¾5ãZ%XnË#–áÆæ^Ѿ÷ÿÍ*ÏW÷ ™xhÿúQñ_†mº×þ?oFËŸ¶"ñj”ñ®,·å˰-6ŠSq¶R.Šøíÿðl˜g ~*Á.Çÿb¶€‘þíˆð^ûßšåÄ ,·å¡Ï$<`ôï·ÿ{^yO?•æ¨ûoÞ\YÏîFÈÃŽïµÿ™àE‰ ½Ý©”ÿIx€•&¿ýªIņh‹d uíU|ÿ˨&â?e=²š×þŸŒOc‘¬ább¥pY–ÛòˆeX[ŽÉ8›ûE|ÿëïõ÷Uuü·èÜ0'ÿ°õ‡e¢Ïô{.î?4†<â}Ðã?*‹øz]kP!À™3?[3GzUkP%  68iÜßÿ}Á„éj6m6e~¶fŽó_F»Þ¶·üì ç±fŽö_溿U6?­™ ýÀ…¡(²˜!Yÿù/ ɲbÊ¡ÄKæf?ði½Hâ˜U Ù|Qº¡¡ÁDüµŠñzÙŠeʼnGGG±bÅ S†Rq ‹2ˆØ3ñKü÷ƒñ7Ä (Û®³ŠÚ’ÑïªÊÅ#c Ý1bYìÜíðUA>ç©4x€·+\H§|kX2ú]Uâ`¢@~ruõ1>?X ¾UTriwœÏ3-:7Œ[~v·ÿb s!ÈR𭢆/w¨|žãT¼G’ oÿ?È*&±E/ð­íHww7_gíïïÇàà þ'&&Lbï^à[EÝ2™fÓ{žøþ 0ṑ[ñôSL †ö+Ÿ²®:Yx6 ùNÇXZ%!ñ€{'!ÀRð­¢f, í,ÿLýN½¼«£†ØU‚?›ã$V»g‘æý‰t袼:Öº&Q*þÐÐP^\‹ø;­ÿSÜ ed¶;¦|;A±_¡õ÷ééi¨‚Ð}!+ß©ý§ríØ±û`$"ðêùsjÿƒÂwjÿKÅ/·ý/öü¾˜abbÂ1þ¡T|'ÿS»pªIE½¼’ÿ7DÙéÄ6£|'ÿS»Üóʣظ>ˉÿO?ÅÚa±Í®ßÉÿÔ/×>ô„ATœ×Â|ò?­?ž‰Ôâ®ßýïåîbbäJ­m¹KÅÛ_»ä]]]˜˜˜0=‡Ãcp¼ˆØ ¨««Ãàà /ƒ“•{ýÖ±ÀúÊDO}@gg§-Ýë뱉 /–Á‹ëwêÿ‚jíú?Ñ”Éíµ—ŠïôüÓsIã/žÝØa-Ì ¾¹gõÏ[,ÇžåŸ)ãyâ#wÙª‡_Z4ÚW’¶ ªªˆˆùõ?<.Hõ?¬$Àú¯®VóÕÃoXõWøðBoÕð;Tµ Ü÷û_d.D’˜CF¿Àí?®ü„ý€¶[YŸOb¢Ñ¾’ aTIb$@~ #ý—û®³ÿ°ôksH @4Ú7]‚0oŸE¨AÌ‚NäçB$è·®Ǽªñsºž«yÉŒ/fD'òs!ôoÇ€8ˆ¥µ6œ5á‹щü\ˆýe¯Â™KÒ|Œ3ñßj‰ÄJ¾˜ÈÏ…HÐɤ!ž’HÐoî¯?Ñ”0á‹ ˆü\ˆý^ü?&ù&ñ.Ôî[mÕa3¾5éK1[2x’sËÏ(ø¿Pÿê¿øýf«ÿnl>«]†ÆÆF-Ö>¿IÀ¥iQØ0/îõœnÎë'ùW´#]ÐÔ> Ñ\=¨f½{Ф.àföæC‚zþÝšϾӹ½>¹v¤ Úß4÷$oŽç¿æ%hÿs¬úÏÿ‚}3Ìu'.ÅEú5kÖð‰bÚæuÀ‹“ùÛ‰ôOeòº,´ø{ñâEŽëgЧX»`T*à ÜÎÿÝÝÝØ¸q#_ìÚÿýýý<øÃiáÁ²P61ð¬Úþïîî“ßþ‡ÃhhhàAûŸÔî‹-z{]Ê *ŽWÛÿá0 ŠÅüöªâ±%†@Ðþ?=­r•Y;Ò?•Éë²:²ø^mÿ÷è û}¾ñDÿ_©¸õIC hÿ«I•«üÚ‘þ©L^—å*e#‰UöÿÕó¿Y}Ü_ÿ««á[»el´ÿ¯†s\eÙŽôOeòº,” ÒLü¨®ÿÕÕ,”(Fà·ÿ)+%=íÿEç†yð³Sà³e¡ë‰7ÕöÿÒn¶Ð Šøíÿ—;TDŸ‹r€ ý*Þ̃ÏÏý( eC‰OÕöÿËz€Â >ßD<Ñÿ”••‚ž‚ö?eˆ.ôîuYìp«í*“_"vþÏdš!oˆp€ ýŸË©<û—éŸÊäuY(°Hü«¶ÿ3¶â/’TüöÿHËBOÄã ý?ŸæÙç ‘N¼.‹H€!Üjû¤c1˜Èï~û?—QMøjŒÿ¦~ŘÿNÄ?¿ü¿:z9ïÚ+ÅqSŽ ýïä‡ÓÓ*nz.d?IÀ«ûᄯ&U#¸i»à]Àoü«ánª‰<ÁƒÅIÀo|"Œ|Bï`$à7>‘@à™ˆÌÉ $à7~&¬ðàªÈã1>%¿ñs9UÏBÊÈGD<"¿ñ'ãÓ8¯Ç‰mˆ†8ñŠüÆ' Ó ‘4üÆ'0´µµñu/"ŽøÑ÷YM–ežõsrrŠÂž"LùÙþ’€“@©Øvý»ØÆ§…Ì€4Çl·Ý:'oG$´ë#lç…6žæY¯ÆT>Çi·Ý:'lG$´ë#lç·…6žÏó „>»íÖ9I;"‘]a‡/¶ñ4ÏT*Ñ*$Ø÷vøbOóDLëhV!·€ÿŸ‰°öW$­‰û‹f×G8ÅÐ3Në¬Ô¾tuu¡‘ý`mO³#ïÙµ¶ã[¡^Dá—ë³à(c·ÃwêãÄm$‚#fÛÅp¬ÇÑïÖ>Òß®fHN_£ï…ÞÉìú(Ûù%äoGÄ£mpx/L¯ƒÀ'9­ÛŠá‹}Õ!Jºà´ SSSœj%RÚõ‘vøDtò³‹Ûã ÷kßÃá0_c¶–~×ä½nÿKÅ÷ºý/¿’ö¿Ðóï†]éóoçQ„Ú‡,€˜þ¬[çd¼ö¿(¨b×>[ç½ö¿`îŸÅ5)¿ü/  ÜZËÉÿ€Ñ^VêÿBío±ö‡Ú˜JÚ_»ñG©ôJÆ…®ßéý‡ŒÚx¯¯¿TšJ®ß®+µýó²ÿÇrÅî?Y%ýŸÝóO¢Ë€ùù¤1‰1ÓÚP)íe5€è:3™YÑÖòìçÑuøwq?:°'E"A/à/àßôø*'õ_ù‰yû÷þ¡ƒ_ ómô]ÜŽìE ÍKK#ÿ©ßuóödBƵ½ ßFßÅýèXÀ^ Ø¼| ‘¨#µ¦{‹„g+ztÆØgtx_3ÄE¡È‚Dè.h$êX£ :s"3Ì„g+úÊcŸ+gÀæ€ô=“PdA²ÖuÜp/ƒü ÀDx¶ iìEä蹡s0€hG$à@:XŸ‹×:÷£…ú¶`•Û¹ÝÑiâ`rr2o¿Jƒ@­Žvç”$I³SÙµ–WœØ-·<¢Ѿv5Œ2Á÷ööæ‰!x”ët<-@ˆûåÿbjÇ´_¡ò—jD´/¦6´8pÝÝݶ ~ú_”Ii¿ ü_Lmšö+TþRˆö…°«a©T ápØV­ÝOÿÎXbÞ/(ÿË6Dû*©FDûBØÕ°ý’„UÍËÀøëÿ+gɲ_Pþ/–í‰ö+TþRíªN´/„] [—p5¦æe@üõÿ¬R‹ZË~AùŸfظÂ/ÿÑ~YªÎ·Z&]Üuõ1X3Pþúßn¿ ücs ®)¯×þ'¢ýÍ-°×?®Ž];ÃÒîx^PÀ_ÿÿG6o¿ üÏ› ÿ¼ö?í aWÃ^HKx¹CÍËÀ øë%“ÉÛ/(ÿs²ûbçòzíÑÞ·Z›Š!^ÏË€ |sÛF¬ÕÿìËëµÿ‰hϰíEªaíí£Èdšó2þúŸ2?ŠûåFzœ…];ì—ÿ‰h](Ó]5lcz#‹ó2@þú_kê,û9þ“îÿ{]Åe¬D]»rulcz¿½®â·€)4Pžÿíî›$I‰Šó›„9À´$ÑDÅuÀÿª.¾'¾_m2ð¥´DïÀ¾à“ø›øþ§Ý+·—ÞÁ|ÁE×èýcéÖuü=hæøQÔ>ô¤ãG}Á'ñ+qü+gþ9=*ÑÔ|“è”>þ’3Á%µ8ÅÆ@RÊ|ÿûÿëeÐdÿóoSì >‰Ï˜²3gƒõƒÀ¶1 ñ&±1îÿ‰'°bÅ áâĉü3­Cuvvú‚OâËâúKcc#ÿÜ××Gk ÷yNe‡Ãå„€­ Ðw¬Yvœ°‰øO¢›1ï$kû{]ÅwJh)ø<-I—Œæ’;lfÅídb¿Ð¡ªxPØNâûmÈ4oiÅçÄ~ÊÌ·ômÖ¹N¡_P;Ìäâvä6o–‡Ï>ÛXØ·“‰s’ªz’@#qéâ®<|š·±â`Á ÇÙç%ƒ'q ¬_ôâ0nÑ;‰äo% Þò³ƒ€~nÚví@,Ÿæ ìðå ­¿b} ·õéQ ÏDš¡ ³:O$3«(㑤‚Žfö™¶½`C~¢uK;|ñù&BX__úûû¹€˜V…äk¢´íÀùãý½ÉŠ/úÅ﬿{›“PeY±¡ÉÿDNmoÏ'ÿÓ{»íý¿SfD3½¿ãYhÁÖ"E’(`ˆ€§§Øº ~n"§Å¦òý¯÷¶øÛÆ$ÖÐØü>‰iNüߘ¦ýØ;Ù©&Õ–¼ÑÆÿDŠ´ÃŸ‰_2‘[‰T¹Lß¾O¾dZƒ í3ñKL$@ØwfËbùäK"ZñÅzäÇ}XãÄ~±¿¿ßô]Ìmŧu[»ë·’ÿÅßɈx™J¥LäpqZÌÎ÷üiÿwìØÀ,0o-`^ß±c¶WÒþ—‹?1¶WÒþ—ï²ý/åùIÐðá‡0HÐd¥<ÿÅüJÇÚhéo­s âœÌ©&ŽyÓÿSûÛÞnnc­m®8'ØóÊ£Ø1¶WâÿÚ‡ž`X·Ö"®IÕ>ôàƒÿ9©<œ]¥‡õ¡HL¯¢¥ø¿”ö×cD11då´¿nÇÓÓÓØs×ÕÕÅã¨]?Å[’¸ ÅßQy¬4n¯¿XÿWnûçUÿgršœœ4}Ï]NÿWìùϲ:. ,È[káb‹u¡ˆÅ¡ýhÞt‹]Ç2SærEcLf+‘YdiÊ–]w–G–øh-Z×B'KŸ…$m±}/\À_À¿éñÓ’¦‚õ'·ÿÔ úùDþw1Ì ÿ|Ž*?î] óó´ÝÊÄT8ÏK«ªJK’½?;¸Ä úùD~DNøçs0º€À¾ëôý.ab×ö*@‘yyœ¬õ¡M€ö@ˆ™FfIÏôT‚i®eÙÏEeYŠfAïCh® úÂKÐæš‘`df‘ôLÿ‰øL¿}ñP#œ’ˆÔtþ‚øx2„óohŒ¤|V«Ù´™‰9‚¡EÒ3ý§qýöe¯b>å†{…/…³ '“E"—µd¡DZkëed³Z$=Óÿa£Z¢¥…e?ˆÔtþ‚ø×’¡È¥ˆ–¼– %ÐHX`Dh‘ôLÿ‰øL¿½?fƿӘ›/–ý³·~ú6~¨}öÖ/B«¶&´ëmÛ±d)€¹%BÓþdD¤¦ó:¶œú˜ÉÿA×ÀLþ²þ?¾uàõC·ðß­ÿs Àð‡Qþ[õÿ®ÖÏJBâ¿YÿO~—Í‹nÿÏqþ[%õßÍÒí|²ñññP<Ó¨é×HÀÁÛ @(«0b|ZiA ùY7_4ˆŽã¿@lŒÈÿ­J :ƒ:°³cÇŽiÏ>ûìÂó¯=ÿÇŽým×®] ÷$`›ûBCÄøÈ8“¾>ÿ5-ÆØÿ{²þb™p­B/~Ђ-Xs-@&N^¹rÅv/ƒMíÎe7Il õ¢,VœÞÞ^\¹rÅD°÷+ÐÔÎì&EìÎÎNôööæ•ßË2‰÷„‚/Š•³T›¯þïêêâ%v¸•â³bþ?p຺ºòÊï—ÿU ùß©œ¥Ú|õÿŽ;ø’n¥xŬ˜ÿS©_¨ó«Lâ=ôסÂå,Õæ«ÿ;T•g6²Ã­¯˜óÿ~=øžÌoÿÏ™'ÊYªÍWÿ«*0f:Oþ_—x ¬_e2Ý“ócÎE9KµyëõÏìe‡[)^1+æéâ.¨8”W~ßžÿ3a GÂÿ¦ú¿ö¡'x`µn¥xŬ˜ÿ¯ˆñ@5¿Ê$Þ–ýÍ ÿ8•³T›¯þïhVy`»n¥xŬ˜ÿ_H3ò•µü¾ù_PÊ.TÎRm¾ú?<æ™]ìp+Å+fÅü›ŠqR€_eïÉȇ­’EËYªÍWÿ÷¼ò(F>4Ï'ÿ··¢ç•Ö¼òûåÿ)å2€• ò¡S9KµùêÿSM*¦sÐû|òÿÆô,N ~ûÿb‚‚+nÿÇëãÀ§QžÑŠ[)^1+æÿï,‘Xõ åJÊd=†H"V(`d7¡c*%ÿ;á«j0²›ðûQ!ùß_=Ä -;ŸÿŒðIþ¨Œüï„_ûÐ:Å„NÙ=8~…ä'üŽf/¤%ƒ eæþ¯ü ³|sÌ=Ë®²Ø8¦Rò¿~Ï+ê$sdã Q~L¥ä'üSM*#`¥Íâ3¬6H•’ÿðûûûm…¯‰„BÇTJþwÂïêêÂòö¥u(:Æ ò¿SvìØ‘G‚Ñ÷5S ùß {&~‰ÿ S ùŸŽK $@€Íu¿ªo3ú¾Ÿ× B›`ˆÒR-:ή“Ò ÐçZõXFÓïBFÍš|Ý/>ÿYÓĈ6WuÁü8[|i¯&Šgªê! yœÈ¯ÿ.fô¥àXó¹ôù· ÷rQNÊ¢EÇÙâ?ª‰âµ=üì û~¼|¢˜™˜¶Ùá§G Àæ:Ž$¤G%¤GÁç^°@­bƒ¢0Œx>#­=ù©¯¯O‰…]]]4}÷ü[…¸ER˜x>‘@f‡¿ÿù·5Q<­ç•GQW÷6 Á#ôHêWûŸûŸ—ø6:þe™E9Õ?%¥4Q¼/<æÙÃäöv ¤¦Ø6 JN-N!Òƒò&;?‘ϬYh#Ç‘ Ú?6Æúz·‰7©8Ÿê啘ŒþŸdïÐ…gŒkŸŒOs!Q„ Láñ0ÈÁ¶õ?U§‰ÏÖÕ°%Ã5ØÿX ØwfÆDø¯ÝÉÉ•µ±;YÖfýwÄ/áàÖZ`/#¥Ö:\gg§&Ö‘þþ~žaØšy˜HÖä´/Ô××cçÎ ÁÀ iÚá h"ÉÇŽ˜˜˜@[[Ö¯_žžþ ôõõq! 2ªç;vì@__º»»‘Ë凱|ùrÓ>¶Ïö_,—ØþW4Sû?0àIû/â‹í¿¾ØþĬâýW ±Ïñ-dþÁ/†qå'ù1_$ð½hÁ»æÛÛn5W¡r1)ßöZÍJæ¿¶WÁ¾ëù1‡$pp Û—¶/=$QÅtHKÅñ Ь±ïkÀcK ²3e8·7ƒýFóBïkælên­æ%hÖØÂšQàÖ' ²3Ïp.lÇVöÍ ÕŒš³©»¶ g5klÛÜÐ9|k·Ì ÿ”á\ÜY†Hšž:gʦîÖ‰•šÂ×V™e³+‰\æ„Êp.noi¹ ‘4Íš³©»ÆoJhÊ%º7%“Áñ]œðOÎÅí«ä]IÓ4a#RÈVNh[FFÍ‹}IÓ$„)’ Ý˜]ý· ^Ðó@FõŸ~{뺷õß*xAÏ?F¯ÿôÛox[ÿŸÚûàõCFýÇÖûùvªÿ]ýì·¾Î<­ÿ-ëu²ÿ0#ûg³+ùq ÕÿÈþüÇ¿ó´þËQ6®#²¿’É ’6b-¨þÓoÉŽ¬§õßJö_2xøn„o§úÿÞnöÛýɲë¿E"í‘GÁù7ßDð;#d²°ÐÂyk­Ãá,‚hoiAÃhoiAc.ØDþÏåü†s´Ã‡/ÿml||<ôì³Ïj‡ÖöìÙ³po6¸'ùͦ¹®qÁ‚·E¥ìLÁ•4‰`—iÞ.8Ó ³xZÿüÀ¯µ··»wïλf»}ƒ0§kÞ½{·IÀË2Yýo—iþ›ê &qÊü>_üOpÄý¼Â´úß.Óü7Õÿ´8e½f»}ƒ0§k¦lâ~^aZýo—iþ›ê ް^³Ý¾A˜Ó5§-"~úß.Óü7ÕÿµùÕÂïììDÕðiÍ#H|khÞ=¨2ˆØÔæû}zšÍ{ÿïp=ªŠW…³’àl‡4‡?‰à} ¦ãJ)›šdó®7.¨¸3H€!x*Îw’Qpø­OêÁ±Âq¥à_ ç I{1¿uõ1Ì%ù–É÷i¾Œ‚ÿµ[ÆÜÐ9óq%úFœ{çv¬ÙžhßÚ‡žÀ¢sØ9~g/ciw·üì`Ùøâ܇8·ðAV±Ý·£YÅ©x3Ò£r§ÅËŒÌV.¾¸ö*®mZIдoWWúûûÑ×ׇ'N »»ƒƒƒ%ã÷¼ò¨NÞWûC™L3^{=Ê·1Aƒ€Ê©Ìr9€yCŠ"óãJÁXæ±ö”ÌÄýfÃà"8‚Yç%hêÛS²‘™Ö%>…6ßÓú{,ŠhX½ŒO²w˜Þ-˜Sùö{Z\NE.£â“ì8Ÿ0 K¹þƒ[kÛR‡3‘Zì;“Ÿu`ÏhlKjcwr‚^ül.\@mìNì;3£gÉ.hhˆg[>qâ'Eñ“H¢éqÅŠ˜œœ4W ~.—ãäÿééižù]\‡×{Åã`ùò嘞ž6=+¥àŸžf$r»öŸˆ¿vø^¶ÿ¶í!|/ÛÿÛö¿¾Wí¿øü– Z¬}}}H¥R< œçŸìô´ŠØ˜}ÿo}æEóÒÿûŸÛÖÿLðòQÓ|™—þŸ9~ÔÖÿ$¸,öÉd~øÿj8‡™ø%Nô'[–ªã¤d¼-\–ªÃÕp®"ÿÛµ¿ªe¼GÏÈÀÀ€çí/`޽Ƕ$Âøc`` âñ‡Ýõ[ÉçWÃ9tvv¢³³Ó—ë'R{gg§éúíhÄëïìì¬øú‡††000`ÛÿjÿüìÿD¡Àßþïj8‡Ôâ”íó/ŽÉ¬VjûÃæ5Ï‚þ(“9‘ŸO5©˜ŒOc¤c±iÜE„g;cs[ø_¡¹Àbøñú8.Ä…LX1e}.„ÏÞI=Â/F.§âÔ)Õ”õº ~|±gøj‡ 5Éú Qx®>›“ôÿî»ûÑÜœÃÝw÷cfæ¸+ü»ïî÷ ¿GUñÛë*NO«¦¬ï…ð{Tï®_œë+xÿU5T¾>— v0òÿ•Ÿ€“ÿð ÍMÓ_1|šKéЉýû®ƒ“ÿð—r&—ÒÜ<ý¹-{—%SùØxNÌnNã»æZƒðoÍ~0ò3 wÙ¦‹Ê·¹™ñçÆX{úÅÂozûzûVƒð/n'«i2‚Ñåç·˜ïÓùQ³i³)»9ïË3œðŸ—ý`äçóë_Þp…^6á+ #ö‹Ù͉üßÒNø·f?XtF¦"w׋šñ/)ÛÛMÙ͉ü¿J®å„kös€e@W.±ûYq…ÿé3þÜ™LÄ~yäñ¿h5[×qäo?öCWøÖú/ýɬ‹þÓ1^Ô‘èÏ÷±Š_À\ÿé/ê?‘úEË¿€¹þóc<¨ÿDêÍ*~˜ë?ãEý‰þdVñ À\ÿé/ê?‘úE+Vÿé˜rê¿544àwÞ)÷ð›ÂÞyç444 ±±Ñ÷µ§3[ëðp¨Úy¿ÌzmÕ"ïÙ³'4ŸÈÇüùãjÙøøx¨§§§ÚŸimîG¬n¦Ç¶“g äÿóÚþ¨”‹M d¥h"ñ_,¤V£LÖ XšXv)ð ¯ÜíA”Á/‰ÿóÝÿN"^á•»=ˆ2øeâû|÷¿“HWxån¢ ~™U—>ÏGÿ;‰x…Wîö Êà—Y ùïóÐÿN"^á•»=ˆ2øe"ñÞûßA¤À+¼r·Q¿L$þÏwÿ;‰x…Wîö Êà—‰Äÿùî'‘¯ðÊÝDü21À~¾ûßI¤À+¼r·Q¿L$þÏwÿ;‰x…Wîö Êà—‰Äÿùî'‘¯ðÊÝDü2‘t5ßýo%ˆUbtN@t{­^ÝNjÕøª†¯ ÀU ŸH ÕÂ'hµðI€©Zø$T-|ÊÂêtÞ¬ÏøDº¨Öõ 8h|± DD ² ü>~ µ±;}ÃÖƒÅ5ž±7Ä[ß·„²=Ò–c£xN?îÁåŒ4(·IU±ß¡у嵫BÆÌšQXüÛÁ @ÇFÿ€íì¸e& wµIe¢NøÒ^2öÖ€¶Rp+YMä µ×t ûÌú‡šÈ˜:‡e©:ÌÄ/™ŽS‡îÕEðÕ–vÇq½m;¾ è\º5Žkbè8{Çþí—,ðSŸß!"`Ìù|õâ>,<‰Kvâ¯^܇¥[×áÚ˜#~zTÒ^îPq+#|U ·¨x!͈ü‰W¸¿UF:ÆœòBÚ 9‡g"2>È*º8€1}&"CÎ*xÁ¡WU5Ô××§uww£¡¡#øwwwãÀ8qâFFFÐÐÐÀ×78`Ê mmm˜˜˜ÈhkkCcc#8àˆ¿ÿù·µL¦Y'ý' (2E†¼Áh]IìÅúŽ•É4sB*Š“ûƒqÜÓO%°q½ŒööQGü””Òâõq\¬d2<¸XÌBKbT´©a…ÿöplÖÆîSÉd›röÿ¶1IéXŒ{Z „O²wà“,°Z¾Œ ;„Þ-N5©Ø(¬3Œt,æßãM*VÄ$äd•·!ÂHv16¦gëªN›¡ŒÉö™Á¾3À™\ÛêXöd1/yéY«ÝÉÏ·ïÌ Z#wáT.‡­ÉÞ ž…Ù ¿³³S3ONNæ‘,׬Ycú.fLîììÄš5k099‰M›6ahhÈt܉'°sçNGüMÌXLÄEQôÂÎx¦c `D:¶¡¡áp©”ýªÜö``ÀÔ7Ýþ[ñƒnÿ­ø•´ÿ…žQôA|þ­$èJžÿrü¿mÌŸÆÆ‚ïÿ÷?ÿ¶i|xÿü¨éýÌ/ÿóv/eöÿ¾33åPòý_çÚÿnÚ_±zÝþ:?lÇD@Œ˜—JÆn®_$ŸuýDä·^? ÐF?TÉõ—ÓÿÑ}§zQíþÄèè~”Òÿ•óü§¤”i~¢œö‡Èω›¹u- ‡Œ¬çQUE½¼ç—Q_ ™¬$m2²¢ocÂ)ƒ0¯Å-äF7øáÙ0'€ŠÄ·bø10á"Àa)´äµüì¨EñÃ*Z[ÁO$þÅ1á"Ð’ÉÒ¯_]­2"åI²)[ñ¥4À| çKÇoXõW˜LÄ7ø¨¹ñ¯úy }x¡·dü}LðÖu3ñµþ~]8Àh õ•QÿÜÎeäÝi‹«¹y"ÿßþSö½íÖ¼û·Ã<ŽÊ5~Z»Æí?T¨ÒîÖˆüP' /=$#UxŸ[ü´$Q…‡ÍÇ”¼6Aþ¡¬å”Áü}ùÞ:|_¨âxqH?WŸNz¶ó»CB€‘µœg0e¤çËxð‹Q˜Æ‹´}nŒ«æ%ôÛçOê/¬zÖr=ƒùÜÐ9ÔlÚœ×|9d¡MýÅùÙ¹6œÕLç-bÔ>QÖrÊ`žÍ2Ò3‘Éèwöy%ß®(—‘L"”H¬ÔÄóÅ×ÛgÊZNÌ•L†!ES2°¯*—$¯%C‰&¦üg×îÛÙgoý‚ù_ÏZNÌkô çv$"C/<É·ÏùŸ½õ‹ÐªÃ ŸÎ[̬õ_$ÿÎXê¿.„"Öÿ·®Ç<¶Ä(·þ‹äÿ+g,õ+û'Öÿ/Þ0޹õIA Ìú/’ÿ_?t‹©þ¿y†Õ±þ÷u~Àéê¿}Ôù•WÿEòÿð‡QSýoia¢š­:??›]‰ä?þ?&òƒ¿GòÿÎtÞ¢ø–ú/’ÿ•„dªÿ«ä]Ìõ?Ù‘åÇDÒ­HvdMç-fÖú/’ÿ·ÿ縩þo‡. Ôÿ‡{“ü˜÷þöî?λ¾ÿKk’”Èh ¡„À2k³iM!¶$§Íhñ®Ý:÷«ÍA¸r¥–úuI¡ç¬jó¸;Úd£Û@.¾8ÒúÒGxÔΗ]§Ô½Ú`ïnjÆÅ«‘$æˆ×R †µd @ÈÙóýcôF3Òh4#iw_ÏÇC]I3óž_Ÿ™Ñ̼ßó‰8Þ·;]1\·vìØè¤Äöx<®¾eóf `jjª%Ob¯gjªzÛD­Éf²,û¾.LæÖ#‚ÖhÕ´-$O>ùd»G¡—Íâwñ¯ÈÉ9õâ_#ÙaA%pý"¯¹Z¡ŒLwïÞm›¿X=U£Ó¦ÑxªÝS@ü¸! (ߘåGœNÀåoOüo~A§Í›fqù[Çÿ‹ÿüˆÓ ¸ü­ãéÃ7^ú§pù[Ç+÷~ÛäøÅ€Ëß:žø_ÜøäGœNÀåoOü/ƒüˆÓ ¸ü­ã‰ÿ7¦{§pù[Çÿ›“!:mÞ4‹Ëß:žø¦”˜èGœNÀåoOüo¼Ýë8`)/»áÚ}ïõ|a|Æg|ÆoWüvC;b[ÛI¨åâ²æóþFÑÒbojög5¾Vç–&’§P¾)ßtÞÙ¨Õâ/ëEÍþêÆE_JIAÓ_ÐÏušÏ{VÄ/–÷ºzeÍþêÅ7&÷w}#‹Ëîú¼~®Í|ÞÍø^ü/Š ØõW/¾1¹flJ+ú¹óyã{ñ¿Hf³ë¯^|crÿÞ½{qôèQýZ³ùº³ñ½ø_°ë¯^|ñdé57d+ËÓkUÀü(&°çáa½[cõâ‹'ˆ3¬?mÖª¸ŸèN|W«?ãÿõâ‹'{w‡¯Á[#?Æ“)Õqq1ñ»p~ìBEÆß‹õâÿlH»ÉòòðËøü»¯ÀŸß=ùßœpiä´¿zñE"¡HŠ<}útU¿‘”ÙÝÝ]³¿zñEr«$I¸úê«qöìÙª„K;6l€$Iz’¬UuÛ?·ÿmÝþ;mÿæ$h¯Ú?—ÿÂXþb{'¶q^-ÿvo9þ0n×¼:þXHÓoܯx5ýK}ÿçºý»Øþh¿ßŽÆ£œ¼?Ò>ë_ƒóʹR!@-ÑÙ˜,=£ <E]¥>\,Â*ñß<Ýæø"y_$ÃU©Ž/Λãýz¨nœeüRò¾H °##¿¶Ž?v¹þ]Eü¡bÝ@«øzò~)R>ŽX,†£Gâæ›o¶o, äóyÛþœÄßöW_Ä–¥pò[ìyx…BNlû«/¢P(¢¿ÿ ö<<Œ-K¹Š?qùâÑŸ ÿȬL\>‰Ë'* Ä?2¢'Zõç$þúœ„ÕÜWÎU%ÿ‹âvV0Ó[Ä“)«‡«7Nâ¿v"ˆïÐn0ÿóû¡=E¹ä׊ñ¹×•œôç$þí·ßŽ'Nàüùó8}útÕÓíÜ~ûíxûÛß^³?'ñ9‚žž‹Eœ={===ŽâÐûÛ°aƒeŽÚ?·ÿmÝþ;mÿGŽÁ‘#Gô„Y¯Ú?—ÿÂXþ¯âµA=ñÜ«åßîío#ÇÆdp¯Ž?Òô“ñ½šþ¥¾ÿsÝþ]lŠÅb@’ÖA¼†‹ÕÇWæäÿáwœBæ”õ8dNŠºJëÖ¦PK­øâXÒÈœüï4¾UÑ’ºñ‡ª§ßœüï8þDãÓ_|[u|sò¿ÓøÒ³Çï¹öC–Ý“ÿÆ?ûÃG޵XÿÌÉÿNãÛ ªßî܆1ùßñü7µkÛø“Ä«füRòÿOÿpô¥¬åðŽ¾”Åûÿ.¤…pR’ ^µâ‹äÿ¿üð‹;ËáýâéTÑ¢³øVb@`œ€v,”OB7&?ûýÇàîI™ÿŒ#p1WÚ–¢œèl|º1ùÙØ¯è1—Oê|r]øhOΕù¡':Ÿ„^‘ülìWôG\Å>H§P”sP”sÊ‰ÎÆ'¡“ŸýŠþãqwÓ?œ¤‘(/*ú1¨žèlxº1ùÙØ¯è?~eÜUüþùpàGûþGàâןÆÅ¯?  œèl|º1ùÙØ¯èÿþdÃñ?-ùÿÌËZ;ktý¿êWœyYÆA7ë¿á˜á§ÿ­ñõ¿"é¢ñøË₼» ÿøõKÇ£ ¯ÿãï¸<ð_¿„¼» ËâjÃñ‡‡¡%ÿ/ÆðŸ7¼þ^5À²aàb ŠÒøôÇ?2‚7E~„2oÄð{R ¯ÿp8ðBæxSäGÈÄÏ4_$ÿ|7M·ßÑðúßÍcê·etŸÊ¹Ûþu¸;v˜üK­&Ö9®{íÇe@DÔ⤩ÕÉÓÅh¡Lc«Æ“Ë¿3qùûc¡L#—¿?Ê4rùûc¡L#—¿?Ê4rùûc¡L#—¿?Ê4rùûc¡L#—¿?Ê4rùûc¡L#—¿?Ê4¶k<Û=ŸñŸñ—ê8¸]ø"©ã€úí*öïã¨|oÞï;í/Vz_+þ²{ b¢²¿e÷Ôï¤?ÄêÇÇêc겸ZÙßêcuã;éx¤nükL©Ý§rý]û`ªâý?üI}8ÆnéÏ.þC1¨J*\ÑßC1Ór £*~£ýÙÅðÁÕƒVô÷àƒV¼ß¶m[UüFû³‹ŸÉ„UU­ïL¦rº¬–¿“þÆÿ×pÝø©Þ”š‰Ÿ©è/Õ[¹ãWÆ«†ã¶?sü|ìõb*PÑ_>vMåpCÕËÑmUÓÿ´ª¦ž®lGæ÷¢yÑŸ9þñãÇÕgžy¦¢¿ãÇW¼ë™qýk´?»øñx\_OÍë­x UÅo´?»øÜþ·wûßîöÏå¿´—»·¿í>þXêÓ¿Ô÷nÛ±›í•CÒà ŽèÛ̧UEUUàiý}êéò{cwæïjÅ33&mƯŒ¶µã»k*¾!i5‡;›~cwÍÄÇjCÒàj¨Xí,¾±»fâß°êªñÿV}ÂQ|cwÍÄ7&mÇÃ>»vü˜GëŸGóßÐ/ñcPß!TnÃ1¨¯û!*Ú´øÜê»fãÇUM…õùÔ—~ÇTâs«ï%†c~›þ_Æþšf1ͯe÷Tþ­xûkÚ#ªåkõ±Ê¿/cÍÛ>ó+•º¦â¯ñeì¯éø¥m¿ù•êMUü5¾Œý5ÿþ¤jõºöÁTÅ_ãËØŸ›˜ÉÒo˜ƒ6ë¾Xﺠ¼þ, +Ù@[XvOi»1a½îëëý„M7ÚhÿOhÃZvOëÂêcê«S¿RµÄ}ûõY\µéÿ/‹«ê«S¿*µgR©kTU…ª(Öë¾Xïź ¼þ+ TUÕºw_¢þ0õ¼š‰Ÿ±\÷ÅzŸ‰Ÿ±ì(¯ÿ™øõ‡©çUŠãøân÷©œåº/Ö{»n€òú/º¹öÁ”ÛB""""ZÒ*O†vÆ 8Ô:\þK—ÿÒÆå¿´qù/m\þK—ÿÒÆå¿´qù/m\þK—ÿÒÆåODD´8oâ7¿j%î¹íÏ*¾¸aÞüª•¸ç¶?Ëø¥ÄžªáÔHÜsÛŸU|‘ o~ÕJÜwÛŸU|‘ Vµk$޹íÏ*¾9aK¼j%î»íÏ*¾HÐ7¿j%î»íÏ*¾H¢2¿ŒŸ[Å·{ÕKø4ÇWBÖËQ©‘¸ï¶?«ø¯NýÊr8âs»ønú³Šo. !^µÝög_$(š_µÝögŸÛÿönÿÛÝþ¹ü—öòo÷ö·ÝÇK}ú—úþÏuû÷`ûcfNþ·Kö·J‚ß5ÏÌœüo—ìï[|Sò¿]²¿_ñÍÉÿvÉþ~Å7'ÿÛ%ûûßœüo—ìïÛü/©§eñk$û[}nÕö›‰_+ÙßêóÊeÔ8s¿9ÚÜ9 ºiæ~s´¹stÓÌ üæænÌIÐÍ1'ð› Íݘ“ ›ŽoJà7'@›»1'A7ËœÀoN€6wcN‚vC$í'-Öc»VßûK 8†Âæï¬ X|oìMïÖQ»Ð’öË…-*¿³.`ñ½Q©['íB$í‹Âæï¬ X}oìOtë¤]ˆÄ~JÕzlWÀê{c 5?£·™ZDÒ¾(laþΪ€Õ÷ÆþD·Í´ """""¼és©ãò_Ú¸ü—6.ÿ¥Ëiãò_Ú¸ü—6.ÿ¥Ëiãò_Ú¸ü—6.""¢…ÏxÓxåMö•ß»o¦?«øÆDópì’iÜögßT5›$ ·ýYÅ7&ò›‡c—Ìï¶?«øÆD2ópì’ÉÜögߘÈoŽ]2¿Ûþ¬âùÍñKæwÛŸU|»DOãwVñÝôgߘÈoŽ]2¿Ûþ¬âŸ¼kŽÝÓ“ÝögߘÈhŽ]2£Ûþ¬âÍñKftÛŸU|nÿÛ»ýowûçò_ÚË¿ÝÛßv,õé_êû?×í߃íÑH)aPëVKrv’=bH4tÇŽHdk4¾1®©øqwÓoLôk&>V»‹/úk6þ «>á*¾è¯Ùø1—ë_Ì£õ¯r Ìÿª~=ˆ_JòwZÀëø"Éßi/ã VÉþvï}a•ìo÷ÞVÉþvï½g•ìo÷Þ—øÉþvïý`•ìo÷Þ WuY&þ æõ=Yz‰÷µÖÑý†«ºìDZß&ñ¿<Šõ}Ù=¦BµÖQ4 ¿F7ÝŸ²IüLëûêc¦BµÖÿR÷ÝŸ²í&²NüÌë{*uME!ŒZë¿è>ªÑÍ•qUb›¨o^ß(ªEïk­ÿ©Þ”eQ á°eâ¿`^߯}0UQ£Öú¯Í‡}ÞFÑ¢çåIZx¸ü—6.ÿ¥Ëiãò_Ú¸ü—6.ÿ¥Ëiãò_Ú¸ü—6.ÿ¥ËŸˆˆha‰+µn"·úÞmvñkÝDo—Hã¦?Ûø¦ŸªáX$¹éÏ.¾9Qß<«D~7ýÙÅ7'Š™‡c•Hæ¦?»øæD}óp¬ùÝôgßœ¨oŽU"¿›þìâ›5ÍñJätÓŸ]üT¨ör4ï¶?»øæDIóp¬)Ýôgßœ¨hŽU"£›þìâ›ÍñJdtÓŸ]|nÿÛ»ýowûçò_ÚË¿ÝÛßv,õé_êû?×í¿ÉíO=Z¿O«Æ$s€f†ßh|cÂ[[âþÚ«¡š ´2þ «>¡š ´2¾1áµ-óßâ;ßãÇj$ù7Ù¾ÄóÜ*~½ã+/Å&=û8ªþ×÷¤+"ÑÙÿ¤+b»×ФËø¥í~+’þ­ˆDg/’þbõô ݉¿¬ÿ®êªÝ}¬N‚¾±;ñ·‘õ¿¿^÷ÔLЯèNÿÛÀúßý©šÝÇ㨙 oìNümdý…jwŸêM9ZŸE7©Þ”m±»þjuÿÆÒQ‚¾ëõ?ö´½QY&´Ôø¾ÙþŸñŸñŸñŸñŸñŸñ—j|§D ‘ø_]À_"¾UhKã[$¶2¾Hü¯.Кø"ñ¿º@kâ[%À¶tþÛ|ÇøD䆓Ä«~ÜöWõ¡“Ä«~Üögæ(ñߢ·ý™8Iü·êÇmæÏܲp[ò‰ÿ–ý¸íˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ–·7š{uƒ:ã3>ã3>ã3>ã3>ã3>ã3þR‰ODDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD,3w> IDATDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDÔz©ÔTj&SS!¨í"""""""""""""""""""""""""""""""7ºÚ=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDíaýúõªÝw333 ¯ñx\íééÁêÕ«kÖ¬ÁÉ“'që­·¶t<3Y–õåÏç9_‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ|ÒPB÷úõëÕéé{»w===ßßwß}m) *i¤Ó F¿òìØ±ƒIê‘eYMôõ÷Éé‹-aR¨SƃˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÈk¯rÚ¡Hþ‰ÿkÖ¬Ág>󈂷Ý6æÛHÖ““ÖV¯^ݶqXlŒÉÿ‘ˆ–W—@Éi¨vý,õ|X¿qãÆ–?}ýXâkúûuÉ÷ø_ÌëÜ úg½›,™íZ‰ÿfO½ÇïøÔ&ŒmM$þ†äÿ’ùcھدB²,«ÆÄÿ‡N½èÿ×ï¦ÿèú–AÈ=¦Í‡ìlZÿ|0‰–n“úúúªŠ<óÌ3‹¾]-t"1¿±†††TÌ͵"TK§‹¬mÙ²gÏžÅÔÔT»Gù|>055¥‹ELLLtÌz100€žžæ^“#Ž ÌÌÌ–/_®nº³ú»íÛÿÿþï¿Ö»€[n¹E]¿~½*Þ/6J*¬“â3Ããþí ÆŠD«àë|Íçóä4TcR¿–ì@( „ÂâÓ€é{ “Íú»ixôTàp)Ñ_Õb„Ú ^ÿzíïŽ*$ï>ܲt«Äåx á›´¤DQ=](‹ÅhÉÿP(ôïý~ú±Hü?{ö,zzz”‹¬[·Î÷ø[¶l©ø,—ËA|¶gÏß0Åò¼ÿ%¼5òcÀÊdë 0K!ÙH/vÑëã/kŸ%»eOþú»óˆ„BÈd³˜Fk–¿,˪HüïééÁÙ³gTð½ý€HþŸžžlÛ¶ ;wîlÙ2Éÿ/ ÿ°û1(z_–eÕ˜ø¯ü:˜œìD£þÎk$©*ÁºX,¶¬Èƒ1ñ߉§^Èãÿ¬Òþôhß/˲jLúwÂXÀËõA$ÿ‹Ä³þýž¯Eô‚Éÿ°?Ñ­ÿ?˜ôwýìëëSþ•VðëMÊ úç×ãv}mE1c‚vheüvO+-™PH½wåJd€E•,¿X§k!Éçó³gϪ›7oîˆjóæÍ8pà@»GƒÇ`~~°ñõ;üããÊói¬Æpý= ÿ   Xq(í;/ ˜ÿÍŸûY@jEÂárz!€¬Rî'“Í"Q*†ÓÛ;Ø\"Z)ùßL$ÿOýä'úÿ~“eYužøï}l«ä£B¡à[»ä£cÇŽaݺu¾=}Y$ú÷öö"gx³°eË_‹È²¬Î%ž­øì¹ÌðxÿK€[¦ý›÷âÿÏæ+¾ÛìsÑ»ñ°ãwx¾[[¿Œ_¦¯Ðb–>“Ñëùº'¦¹¿»<ß#¡€`ùÿRÑÏ ž r^çóù€]ò¿Qé{Ï×sâ?œ>}ºb°k×.ÀÖ­[=} ¹q>ˆÄ œü/ìÏïO Ø%ÿ%/!™ô¯íI’¤ÎŒ­@è¦HÅçÁ÷~QmU€÷ÜsÌE ÿC;æ ~2z¿Ùþ`¾©"z¡|>|WR_D1€m?³>æ[¾Î»‚;Æq©—ü/øU@–eU$þÕÉÿFƒÉó^†® ’Э’ÿà{7ïÕÿ¿·«~&ª÷õõ©Ïl|¦ü}¾Æ³Šÿ©›Oëï?çS|1Ï¿7y³þÙõQí7 Q#D’üssˆú˜ƒ&Lg³ÀÊ•Ú_Ùûûý¢…&çæÀ"í•N§étCCC*|~ÐéB#rÃn½õVÎr¬¡F££_ÁÆ×ï@ø2`tônl߸ÀzG­¾x<®nNkIP‡ÂalRÒÔ:'I’Zxâ6@öx¡Ò_k_á‰Û=ÞÚB‚,˪1Ù° Wü­Õ¯Æäÿm?Žòºr“|>eY?–ÇO¿^êgDöý¤ƒ0X§Mÿ¿~ÏÓxæä‘äoÅÏy`Lþw’øïGRº9ñÞw—i›ü¡×h×öé{J/ÆEÄʉÿ@9ù_ØŸö;À‹BvÉÿF{¯|·÷±Õ—BhbÑR2~«“²ýŽ'ò ¢…†'&&&ü Y!«étºî4&µßŸÉf½yµÓy-ûœ‡Æ"&ÿS3\Xª2‘H "é?OW$ÿG"Àƒí|>HNCMŠDB!Ü8žÅ‰l)/ ÜhHÄ7dæûY @Q€p™Ì¡PÐ’ÿÞTÑÍë”CMÅeY͇mŠ)”Š(¥ïLýä'PRJ <V»7hIÈJªªõnúPÅ_Áœø¾iÊñ”gqŎμSnݺu¶ñ;æ[ü\.‡={öÔíÎÏ‚•É·a.ñ,žË¼¡fw^ÈçóÍ¥e~àYû§loõ±–,Ëj>Ñ­%ÿÛ$þWt_#Iµ¡˜†äÿ_¦¯Ð¿3þoÛÿùÚ‰ºNäóùÀ4Êímzº€þnïžt^‹U’i}jiû7¯Ã7n¬ß«6hŽ,˪^ ÀfU÷²í÷n>bú䪪XÆäå×Ú`r²Ñhs?LD¿VL(S>®º)¢ÿÓº…€Êb’$Y~ÞŒ|>D¹@"˜G²àM~Uò¿ˆ9¦Å’G*·©¯{7ô"~ÉçóÁÞ^Õø^–eU$úŸûæ|ûo7éÓ?ýG×ëÅ ¼còÿþR¡•‡Ò ¦Ïû[Á˜ü”“ü­ø•ˆÞ××§ÿë¹~ö5å7k›KïëëSIÿN ø5O ™ŸT¼7)`A"""""""""""""""""""""2Rggg1+·î|í îùOÉ20;‹¡¡!µI×wß}·ºzõj‹Åº97ÙÒ æçç=IÂÏçóL(TÎÊçµyPÇÀÀ¦¦¦XÀGLþ§fy^àî»ïVàñÇÇÌÌŒo+f<W7§ÓŸ ‡±IQpðàAõÖ[oõ<¶–x—Aè¦Ò̈—ôâz‚^ü/ÖêÉ{^E ËÀtÛóyŒÊ2¡ 9]Ây ›­*à·L6k›ü? or] *ÉÝ*ßP`ê'åD(?’þóù| ·wPÍåör‡Eï¦AI‡+ÿIÿ^&ÿ›ÇE–euÛ¶m€£Gbvv¶e`µâ›‹x5N"ñßX¡ÕÓ/†¿2i_€áñþ—|½ÙÜ.,ºñ•â,¹ßëq1&ü;Mì÷# Œü²ÿþšãÓ©íßï¸âY–Õc‰¯á…áåAOã›c%åvL^UK$ÿ{%“Q‘Éfññxôäÿô³ˆD`flí%øÞ/êëgá‰Û O!üg)_?¢zU~ëð«¼Zeòò]I,7TyX^úkžï~'ÿ vëÖ¹ožqÜm3±{ÿ8YQT@=”ná_ÉÍ‹þÿ÷nÞ x!ü&Üü÷·øžtÞw¸Oÿ¿^1€ï­ý¹§±?wôíúÿ¢Àº÷ï´ìvðÓiËϽ`Nú¿ýÚ<éëëSÿÏÞ×"p¹¶Í¸> ß ÑÂ"’ÿ—Jòµi:ÕVسg0;;[·Ûá|ý¡þ>âÑG‚A,_^ÊÀX¹kô·yófôôô`ÇŽÍŽBMÆ"â³Å¾>ŠÜ&ÿS³Ñ[•l¿ØàÍE.j ¿ÓÚ«½)õF½€Ÿâ7}éã_²ü.™¼ @ý¢Š„Bz¢¿ø+’þŸ‰b‘P@3c+JÇ&šðŸ¥ ü¯a’çãÉ‚wÛ ä»’ÊmlþX?ý: ØÇ¨õ]+|ûo7µ´ø…Ùôyÿ§ÿ™gž Üü÷·¨â ü´ùÂoò3tÅ8ß÷A‹ÿ½Ãö‰þ^%À‡Ó××§ŠbŸ;jèïeâýõÑ£º ŸtW|ÿÌ3ÏúúúÔCï=Àå7ãÌÿ8ô^`úX€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆh‰[jÉÿf¥éö½@>ŸLMM9zÂ}€\(èùR²,;ê¯^üÉ`PE)s:›E¨;LI’Ôt:Ý’uCML %ËžLw'‰ÿÃù<²CCLþ§¦5\@Qb‡Ç-ÿ¹–$þÇãqusÚ:ñæPXKÆ>xð zë­·z2.ƧÑ&Ï(´ÄÿÐM &Ï#ŸOùº3€ÑÒølÏÐoÏ¥|䘃 ´Æé6K)ãUÉÿoŠÿ‡½ˆ'Ÿ|úúz1 i"(õP‹ú áá°ª¤¼-¼`%wèQ=ùßN+ÿÚ} ¶Ôã ­‡M©¸^ UÚ‘€^ož¶;½Ýñö¯ÿ툟Ïçë’ïQ%¾Ö’X½›¨¹ÕED¢zîÀ¤ ÉäUžÌ‹LVÛ·<®*ðPZÑŠd³ˆDÂzò¿ÖV.tSyXZò¿wdYVŸz!\åé`Ï7ca€veYíÿ×ïáÜ7Ï´-þþD7J·¨ÒSI­Dò›ÿþO“ÞŽO__Ÿzýìk?xøù}?÷}<ÌÅ>uói¬{ÿNÀà§ÓžÆ7Ç:ôÞr¡‘MOtWÅÉÿDDDDDDDDDDDDDDDDDDDDDD“ÿ…Vð£[§"ÙlÃÃlUò¿š˜@vh“ssˆ ¾¨•ëg¼É`÷®]‹ÐÄ&Z9´(9. VÀ×àðá»qË-·`ôðÛ‡ßo}ë[þŒaI~ÆÏD!€²#-õ¨¬%šcºÈÞ&§wªP@¢?¥”o¦²UÝ‹ä£×)‡ñsÃèít¼–z|³Íokݨóù| 79¥æ­çH» ,Öøù|>°sçNuíÚµŸ·{ýow|³7¥ÞˆýÃû1(¶¤òW"ñ’Iÿ~`ƒALž OÜx( %øgJ»Þø_¬EÚz19r“gr¤Ò_`d2g¢(‹M¯Hþo…|>×É*Žå‘ËCÑŽ æµ&¾‘üßÎøÆâSíÒ××§ý«ÇñB»G¤ä¶7þ±Ù¦ðÓŠ¿øl“ü7=Ñþõ‚ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ:“ÿ+µªÕ–™¹9õÞ•+õ"~Îç‘]»I@MxôÐm+Éÿ+Wâι9D|ŒGK‡ã"û±Çç?ýiÜtÓM|POÒžŸŸ÷i;ƒØáYUþhÇΰ;àtFÁKà ~Þ¤vèЋ8{ö, …þôõÅë”CØû¥LÃÉÿNÉSå ¼±@÷o“ ì*½“ÿ[•ø/ÆgÛ¶m~‡aü:ãK à;O·u<`W>­>W;2kwøR‹óÍ7‹UXêíÏÎþ¼ÿEâ7}éã_Ò‹ˆÏÓÇ¿„dòª¦÷b |ï…'†µØ¥„ÿà{¿ˆÉÒw¢ÛZÜŒ“$Iú´‡_(ðæßÐ  Tc XlnškÅ* èZ%AP@Á`Ë×iûÛå¥î¼\ÞµÆEü\wMÅ÷­Ž¿~¤Pú¾uÇF"ù¿Óüü¾Ÿã™gžié¼xæ™gŸCŸú©›O·$ÖõQ¨‡Þký]__Ÿú½É›¡þZÁoÝþ³–Ï """""""""""""""""""""ê ñx\ݼy3¶nÝÊäQààÁƒêN§9Ú ’Í2€^ ’÷÷A‘ý¡²¥¿ÈV?Û+ù|> …T=ù?›åúEžpT@–eµP(@Q„ÃaÜwß}X¿~½úØcUt733Ó²óŸ| UÁ –êÎ/9]@¢?ˆŒÍ†nÍó7`Ͳ€×Óä‘Ô/’à‚çÏÎ)oîò)ï6úæäÿÞÞAÛqõ,hI­DÀíÛ·[vïÅžŒƒU|¯¹™~À›§\×"’ÿ;Á¦T‡†Ó--ÐîðÅ¿‘õ}çÎÊ'M·{ûãg›«—¾jäwJŠ/ü‹¬‘tŸL^å>p‰y£ïû q­b›y½>êTSórßS/V¡Pð}ß)ãÒÎøµÚ¹sçÊíõ×G¿ôõõ©×Ͼ?x´-á«û—mØßN ~:­¶"ùþÐ{Ïcú*byàŸJÿy[‹ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆŽžž8p Ý£ÑÑ8€žžÈ-~ +•‰"‹-I~±Nµ—£FŠ¢T¼ƒ-MÊ2&&ÙhWqò&ù_0ökNŽl§VïÜë%vÂ8øQ€Àil¡U‚#Ú?W—²Ž}Z>µ’0õq´qð#³] ê%b·²„q\Ä8ðź¹X“ E¼ZülûŒ‡àÅøtÒ2p’`íõ>IL›yý7~·cuú¸´;¾•Nj ‚HþïDûï‹û^ ù ‚‘×ëEÄç½Ã=ø­Û†V """"""""""""""""""""¢Î´cÇŽ@'åàÅãquóæÍ$ SSS‘p?55ÕîQ hÉò­Š511¸3jI»`ò?y­î %6úvI@Åb1Ъ@cRÔÐÐÔtº"ÑÿŸK?pð n½õV6–&Yíðû»óHg¼4¬Tu¿÷Kð$ùŸ4V‰€F­nw­ŒÛ‰±kñ;ù|©Äo4n§Œ‡q;)ñèœñ©µ,Z±Þ·bšÝüÀæ>–üÔ)û_s!3ñ½_í¡]ãâ&îe—]ÆDDDDDDDDDDDDDDDDDDDDDÔQî¾ûnuÏž=Ì "r¡î†S$ ˜ŸB+žúÙÊäÿâŠùüyÀÀÀzzzpöìYôôô`õêÕÀäØ%$ærû‘¾&UõyüÜ00ùŸ•v'A/Õø­LúvªÝË‚¿z…¸o¥¥ Ýp:a\:iQë9N±KJkU2š( ’ÿòS0ý~úçRV«€Yoï .""""jN']é¤b8Lö'"""""""""""""""""""""""ZüJ I(­N<áqÛ«Þü¸ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÜëø„m»äs&›·—‘::qÛ˜pÎ$s""""""""""""""""""""""""""""""Z̺Ú=N0ùŸˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¨%Æ7’$©âÿb±¨î¼’±ûFû±êÖÏø‘HDÍd2u‡ÙH‘HD_oØnã¹™ß~ê´ñ©E–e5ŸÏwìøu‚V´ÿFÆE Ï‹¶#†)þ÷b\[ÝþdY®˜÷^¬Ûb˜ «Û§±ýhû­˜îZûÊVC=Æõ°P(x6^·¯Û>ÐÞöoæÅö ÑöoŒé´Ÿzët#œ®{ ±ý×›Onæ=‘vÿþ7vÓ)ûþNúýoÔ)ÇÿòrÿÏãÆÁce"ZšùÝÔß÷×ê®Ý¿{œÆ·Úß{y `þí ´f[ÝÌü÷êø¢Ýë@'ŒƒñÝì÷½¶ÿúÄ< ƒúg­šÐþ›/,õøNðwÑÂÑh{í„kŒƒ›íQ­ølƒyþOã×õ¿Zã¼Ïÿuòõ?þþ¯¿•¿ÿŒWxüßþø‹yÚ;½ý-$]âI’Ôé±(Æ¢½ˆ®(V]à0³úÞ®I’Tñ‹öbz,ZÕ­ñÅ ú‘HD}XÉTܰoÅø}$Q#‘ˆ‹=gÙ_$Q/„b/»nÄß5k.Ö/¦ÁnÚ’Ñ" …"æÇ.`z¬þ<òS#Ë_eYµºpá6¾ñU/îÀÀ€åE“VÄo6F+â7ÚþÞ 4¼üëm.‰¨c— •ÛàÙPͶÓȼ˜‹63Šãºoß>ìÛ·<ð@Ýöïdûã”,Ëê\âYÌ%žE.—Ç\âÙ¦×mY–ÕÉÉi'~¬N9íuÛëØÞbâ•(z¿-–$Iݽ{7b±˜å°N¿‹R IDATŸÛ(Y–ÕÜd7Ä+ 65üjÿ’$©ÑEØ{¸×Ïf2¯zí_é÷®ý›É²¬îÚµ »víÂáDZk×®†×÷FÛ¿yÙ×êÇÉñ_£œ®{~µÿp8 ñZ¹r¥§í¿^ÛodÞ73Ý~ß´Âb˜†…ÎËã~ò‡›ãÿ“ÑË!^µúq²ýï„}¿Õïÿ“¡YÛ}ûÕW_ ñª·ÿÏdYtÇÿNwù±ÿ7¯'£—·tÿ_,ÞýÕõ§m9þw2ý@cÇn‚vðøƒó¶ÄɱÓ}p½m›Ø^rßê¸%‰¨ãóµe‘þ¼¾ïoÕõ€f濛㠯ÇÁ«mñBYÑè~ß*¦ßã°Pæ»Õù¾H$¢^º?Ûtû׿‘v Pÿôçk&.Ðí¿ÙñðÂRï„çÜÛůóöª×'ò—›ýÿáÇ!^í¸ö×È88Ù5rÿ9¶Ýq€øëôþ':åüŸØNȲìøü߆ ðyrý¯ÞüÝ-´ëÿN®ÿ9™vÑm£±kM ÿ×ßêßÿs‰g1™¨ýÀ <þ÷?¾í¯™qieüNoÿDDDDDDDDD M—ñ’QÉf1yFr<€é±(ÄI;+’$©Û¶mÃîÝ»+>7>½Âøæ¤ÛW”?·»Y_\ììb±ç0>þÖª§û‰äÿ+¾qþ20_ô‹D~P3>Pyáǘà)IZò,R5´½Pù ^^°Kô¨ÕOOOO3!›Žï&†ÕºàgüFÚß÷%­›·‹xK±ˆé±¨e›vJ\ ‹ n|öyìlHÿßJ£IèJFq=ŽB$Qxàœ>}§OŸÆùó竊4ºý±š» 0#ýyýý¥´¶M¨w`-¢mŽŒL ;n£^¯Fõ.„5Û«¶o¼ðÿ@ð¥@6›µý®‘éOF‹^Ž€r²‘HÄv£™ö_øÉ ?Caz Ó+,—Ãä ™lÖ³öÿÙL¦b00ß¼æ}]úçæö來ÕÚlÙ²EúôiÀ¶mÛº‘§‘öo·ì­úiäøÏÜ_­„¶FÖ=/Û¿Hú¿pá.\¸€\.‡ùùyϋصýFæ}37?-†DÀÅt²—Zyã„—Çýä/7Çÿ£ÙsÍžÃp„?o>¾$IêH¾âZкënæ¿Ûó‹^ŽƒàÕ¹°…²6Âé~_–eµP(èïs6ÀøÞÏqè„ùž;°¡n|óù¾K÷gqò_j*¶Hþ_ƒÊ¶‹0ÒŸ·-‹Å°{÷nO¶ N§ßÈëöït<ü,¾äf>,¦øN¸=çÞ΢Y\Œx¾néjdÿøðáŠÏD¾nÎÿ¹‡ZÛ£Fîÿ±‹ml/nîÿ1êôóVÅZyþ¯Þü7Zˆ×ÿk]ÿs:ížû«uÏ‘Q¡P@âÀ‹ï[ùû¿ÑØ^r߯ßÿ¢ý[ýþoE7ó߯ãÿ…°4ÂÏö×èxÔúÞÏøÞþ‰ˆˆˆˆˆˆˆˆ’.óâÄ[±X Tu]"NNEÑ?2 ™ÌYv·aCù&'Oßö2þk·\ƒ‡• àܺð°’ÁWŸ²~o&ófÄbÏ!{ÃÃ]‡ßqÏXÍ[$ÿ?ÿüíúëÇ#˜››«^$ò¬Ys±â3qaÑî" Ý…qÂ_\ðk'§ó_ðã€ˆï¤øPÿ‚£ßñݨ•àW|'íO,»±h/þ!ÃÖX¨é¸™L&[žÅ¯Ñ.ü_ѽ_P‡µ÷˳Uá§‰Ðæ‹Í^¬=þŸoÙÆÁu@¨7ýÆö¢í‹‹ÿ@ù¢?$% IÉûD™b±Çøø8Æ¢½뫟ó¾Qñáò}EqŸ\ßTû2­½VÇ¡(¡ªå-¶e^$4“ÿS²Œ‘L#™06eÂUíÍûº¹3Sñ™ÒŸÕ“Àj%ÈÔk«W¯ÆÖ­[+^;wîô}{PoÙ»9þý9¹îtÝóªý‡ÃaÀ… óóóÈMvÜ߬Zm_p:íÍÜü´½(üÑìÍ¿tó°$Ijo¯?Ç«f~÷“œÿŸŒ^ŽÇ YH’¤ •®ì¶ÿÍûfÏ! Y!hdß1} 'C³8šEìé·ãcw¼‘Äoüý/’ÿçææ0¹æ9L®y{z¿Sµÿ__…LæÓ´j…úñ¿Õ¼77ÿ ^îÿOF/׋Oˆv¼Úÿ‹÷koJIÿÿã½ÈÿñÞ¦‡oVïø¿‘éws àd;°P4z àåþÚËÂc ÕRN*ZLÓ+¦åå±qmæºúÃUWíª»}mô÷·Õ¶Çml¯8/žþ_P‡õ׉Ÿã=Y½·ã Ûr- Ýó¿Çá:å¼j Ñ‘ë¡[N÷ûÁ`‰þ &ýPŽ_Bá‰Û*ÆÏëqh÷²ñ OÜåø%L&ú‘èZ¶¥_;çwíÌ%ý•ýÁ%„§#z7^—ØÄ"šó¢Þµ¤zœN¿ß¯‹ß¶{>´;¾SnϹ·³ðh#E£Åz¾Îi0©¨•¨ìu\¿5ò»ÿ3ŸùŒþÿèçþÍuL·çÿ'Û#'÷ÿ4ÛÍý?@çŸÿ³KB73ŸÿûÀ‡Æ ßéõ?§ËÞÏëÿ¿ü8~ÿøñ¦‡oääúŸÓioôÜ_­ãDý¾ƒ'^†òÍ_b`{Á|Kÿ7Û+NãûýûhϽ€ížÿ^Œ‡EHýž~´¿Fh×9ŠãßVÆ:³ý-D¯²ú°‘›~ÅMÝÓcQD“Ó(*!“¿-¡hd2LæjÆh6> ]TŒ"¢Nnf#*€·àá=¼vË5øý“ÕU½µ÷x3†‡» ¤´óžÃÃ]P”çɼÚ÷Öñ•Œ‚ät¡"> U~ €· “¹ˆHä–UÅÅteçNõ粌D,„]ãYõ;(?îceòmÝÏ%žu:›|c7ÿýb.>0=­Y|@ðòÉänâ7Ên]hEüzíÏü´Ÿp$ìIÜL&ˆE ~¡{¿ˆŸ€’QŽ„172§_˜0v/žD4íE8®{“½(”0íu=Ï"‘ˆºoß>ýIÛ"6€¦¶?fNnØ›LôëÿG“Ó®¦Ç-¿Ö¡Öô7Û‹¶_,·—Ú^¢´Œ÷B+<ñ©¦‡Ç›ŽaF&sjiU7lØ€#GŽTtçõ¼o”¢(P2!„#Í ÇMûÏMv#RµöŸJÙÎ óÅL/ˆØB0¬hÿ‘;"jèþ,®¹`5þåÎ BoîBסªö?:: ؾ}»ju#O§n¬–}³Ç€ó–¬{^µEQTX¹r¥žü_^þÞÞŒa×ögggõnZ1í 9P´ùÉ3"k¤h7þjmSܨs24‹ÖªÜ,†S~øGêßO+V¬@.çý1k«˜·ãVë¦,Ë–ÛQ?ÆÁ®mø=~qvü¹þÞ¼Ïófh¨ˆpøçÔÞþ»Ù÷?Þÿ­A­c'û~­­~TͤAìé·#òùßÓ¾xúßñðý³¸˜>…Hä£ÃIØB0(Wîÿ±V=ŸÅš;¾5xãïxËâ«%têþp6ïÅͿɞAâë‘;ô¨gûãúW+ñ]ðjÿ/Iw¨PÄŸ€žøo\¼Tûøßÿéo×>_$Ñ…§#(ïCÝí;=0ï¯[{12& ¦¦¦ä~Qprü”ŸÀ·Ð§×ì7“¿KºúÃK/muÔO£¿¿íæ©›Ø^ª_Üüãk€+º×"ÿOúwJ¸q8ñs`ä• 4³]ª¯­¹ÐîùßIãð¼j Ñqëa³œî÷“ÓLFü9öìÔöß»Y;÷:™èGrºò<´8nYó¾.\÷;«ñ_ÿ?Ã5‰¿ áù7kÇ´'ÿ÷%Dà®ý¯AÀqÛ' n…Ü¿¯ÉçQôà$U­éo¥vÇBŠ/’g9ûj«vèôøÇí9÷z…GÆwãbúNƵs¬±G^J¿ÛÅoc›urÈ-/æ¿ßüœ~¯x} .¦y¦X~¢yêÊ&¤‰ŠsT^Äm×:ÐȰF?÷oøÅü ®\¾¾©˜Æó÷ÞxIæë1÷è„åù?7ãPk{d¾ÿçÞ{Wî¼óLÅý?U×ílb»¹ÿÇÈÉù¿ßÿƒ„þÿW¿’¬Û½×>ó™Ïà®»îP™„.æ±ùüß/æŸ+»:âÙõ?'ËÞ¯ëÿ"ñ?õ…oã·šŽP¨}ýÏëi¯wÿ™Üü›€íy¦dÇÃöâ÷¿›Ø^ªßüûÿó/Ÿ›ýˇÆÅïÿvÏ·ãaØ·%¾~¶¿FÆÁ*ù¿UñãÑ®ØDDDDDDDDD‹EW#[U;ï™Ôor) $I ƒUÉ_€ö”øb±p{±Òi|Q±;¶æŽà:¤3*Òï|(ŒhäÛL&8yr-©A$6Œ¿'O.«êO$a‹iDü5±2ø[()JJÅðpWÝ‹ßù|>œ.àç² Y–UãEœÉD? …‚~ó0l¸²­ÛJ¸Nç¿_Om0×X|  B’$ÛézÝë^×Öøn×…­±PÕüŽof½lÇñÊ»>†hrÚ—åß?2‰Â´uQ‰FÁE­•üßHun»Â¢ýïÛ·¯lûºãíPº„ýû÷ck,T£ ~yÞÏ%žmÉ'Z±8ŸþÊØv7ÚxÑöÅxßÿC*†­±Ú™^,“b±™Ì!ãƒü éÛúÓï%±lEÛOÿ G²UÝx¯d§Æž²ü®P(«ãúûVBP”~œ`Œ-ÚÿWŸÊàkë/áÖÿÜú_€÷o Y&ÿ×ãf{°k×.Ï·N—}³Çõ¦·V|+~µãò÷‹±íßu×] O»W7?5=6idܽzX9‰P;–X_¥ÞìÓ?ı»›cxí‰ìC˜ššjéÓ½dµ_1&nöñóÉ_>^Ä…Q°~JWãÐÌòöšq¿^Nz®>ö ƒ»¼”ü_Öèïÿþ‘Iœ:uÊò;? P•ŠèÃÃ\“]‹Hä£ÕE{JO^„B‰Ø¢÷ööâ‹·!òùßCäó¿‡ØÓow´-éäã þ¼—eYOþ¦Ÿÿ‚gûX3ùëÒ>°<ìøµÿÍžÓ×?™¾üå/[N¿Ý6}¡<%Ǹ\ó¾.ý3¥?ÓÔS³œloŒ±ûkã~ܯش0ˆýßÞbâ•(Ö~Jm£Oàë4²,«æóŠ/&¾‹®þÇðêã/èOâ¶ëv¡Ævnnã=YÄ–[ÿ&‹-Ïb¼'‹•+W6|@Œ‹ñ3ß8¢ÛF†]/f»æ§ŒP}NëÅÄwñª®øÆuxÕ@B¿â›—¿Ý<ð;¾v¢?ˆÉD?”Œ‚ÉD?r6ØvëUL ýí?w`CÅt'úƒz·sssOGÐuGå9aq|Üu‡vþO6r:âe¾(–s÷[c!$§ Èçó«D¯§ßÏëOæög7­jÿ­ŽonÿNã‹ó¨õf«ßb~\ïµ+PÝþ‚Á ’ÓD“2¾ýðÿ  \ˆ@tßh »vqI TÝdã$ Ýø­ùâ­ÕEèH$¢>¬díª¶½oß>ìÛ·óóó8}ú´«öou!H´ï®°Š¹Ä³H¥¡Ï{ÁÍ |>ˆF“B:­Ø&J’¤^9:†+GÇpŦ?±\ÆŽ<Ù˜§ßxÃO2Z´Œmuñh¾í VÓS+ñÌË$Àd´ˆÞâ r¹b±˜íôûy#$IêX´cÑ^DWì/_P ÿY ý#r%\/»vñCåeL)MµŒCÉ(@DâÿWŸÊà诀~×û£ZÛƒîînìÚµËõöÀIû7ÿY-ûÑÑQÏŽÿjµñ_y×qD“²íôú×þÇk>yÚ Æ¶???½{÷ZN»Ý:ïÕÍOV½s!Ä¿˜>…“¡Yœ Í"öôÛñ±;^Ñoü5·ÛZ±—ÅW!“y¤â3QP ^û·¦,Ëê\âYÌ%žE.—wuÓŸ—7Ãú¹ìë wz,Šé±¨þûÃÌÄ;ñ¨8P„zPKÍЮ@³ã ˲ºk×.lÙ²ƒƒƒX»v­åònEûÓ¶ÿEˆ—¸A߸Ï)Šúö?9Eqþdt»6qöìY|ùË_¶Ü÷×*Bàbõ ½3pò£ÿ€õïÿr–Ê}{oo/z{{1??\.·¨ŽÿkÍû\n¿¾~önú"‘ ù”ž æ\½ý?d²ÙŠy0ÒŸoéþ8Ãp<Öòc€óçÏcïÞ½UÓo·ðãÀëí$Q/ÝŸ…Ò_ùû;sgF/à×xˆvoµ¿ÅjÅuÓnxµº1ÞàÙÌoJ»~™žÅxìW/žHúÿ ¿Ô,àeñ ¯–¿S’$©“‰~LEõ‚³€önøåMo«¿ ?‰ÛØm³ËD’$õXâk85öŽ%¾V7¶±[/ÖI’ÔÇëç”ëÅÝîÛ·sss¸õü(®SÑ_/ŸŸEì¬v¼ÐÈÍÿbýÃ73‡ñx3óÁíô[wz|a5‰/b쉗‘8ðbÝq0vëå6A?î‘_‘¯‡—ÿÃó¸â×éã`<ïÕz(I’:::ŠÝ»wëŸÛͯã‹q0o’Ó(E?®O$¼ÙH’¤ærûQ(Ì —Û¯n7ÝÆn½šï“Ó˜R09P..%¦SþO_Ý>ú"æææðÕý¸PÉ(xþ©'‘¹S;¶i$ù_\´ºhz·£££zò¿Ûé·jÿvÓïGû7Ž‹¹ýÙ‡×Àĵ¿bñwõÏœÄ÷bDb‹¹ý;‰ßLâ“ݘ¿ïÑõ|'œϲ'7çÙ튾v"IZ‡L&$-ùÿ­‘cùÈÕX>r5o¯y[Íqí+)Ï–5´¼€$iÉéáp7Þx£žÚŠqp“üîÅ1¸$iÉÿéÕ¶ãá‘ Â#ÛsÍÆí„6(H†ëÿf" ½Ppí×®­fð ¢ÇÎÕž‡Ä¿æšãý?—­†åý?æ}—ˆÏçV÷ÿ‹ ÔšV#'çÿ~1?SÕŸŸçÿİíðs¹ýú¼oÅù?Á¸þµúú­|/®ÿ˲¬nذ¡âÜŸ‘qÚ½<÷—Ïç#“9XýþOáÄ“¸½þýouüi»Öñ§Ûøs‰g1?vs‰gëÆÝ~3¦è¿ÿ3³Ð_ÍüþÇ~æû¿Œ‰ÐF^{9ÿ½8þŸ+"º¢|ÿŸÝxˆi7ŽŽâ[ßúr¹œ«ßCÆßNã7{ü/ÚŸÕ²·‹-¦[lÝÆÊÇÞ´ž¶ÿÉDÓcEL&Êë·ý¶§Üm;ÎGu"G$IROt‰ ÑEŒLæ,Ÿ¨}öìY@±hýôîFˆ‹züߺd_$þg OÃÈ"Œ,žÍ|_}*ƒ‡•ÚOK¥.!…Ž?p]Õw¿úÕg+Þ“°û ýÂßQã=áá,ÎBQ¾Xì9¬Ys±f|qÒEPWXë\É(虬ü¬ÔM½"b¸;wîtuŽ –Î÷Ú-ÿâX½ªŸˆõê@&$£ÖÅm>lܸÉhÑÓjèâ t?‰b×ŸÚÆÏårؾ}»çñƒÁ ¢+ŠØ¾};Dñ†ZñÇ¢½žO¿¹ý ôwçÑÛÛ‹L6[ñTÈèŠ"Æ¢½ ˆD"jìlãó!¼|~W¦oÄ{²Ÿ¨èF7àì-Z'‚¦‹zåâF§uŵ „|ö³ŸÅüü¼áÓrÌáÇõÄc7nŒÄEpqcßàà z£Zœ>/ë7~­L¾ @ùÀF–¿U·æÏ$IR¯Øô'úû÷ïø»Šu`"¬XD‘€f/ƈ a€Öö“Ñ"”¬–ì#ˆy ]M¿" Z,âú§åeÿNhë½yz½JD @{Êì³ÿ´’$appPÍ\X©w‹Å|{ò±ñ¬xê©x:žLWt/Š8]þNÚ¿( I’:öbèçc¾~ñÝÇÃzû?5ö”ëö/ÆÅîóÁL9AIÉ„Ždß=Œþ‘I<õB^Oü?ú«róüÍÔnINÆù|>°}ûvõ÷áVÛƒøÃÚü1l¶n-ߘ_¯=ÔkÿvÇvËðîøÏªýGWhÅv_L?ànûç„$Ij8F±ø»¸ú꫱|ùr½èÀÈDW_}uCë{#DÛxëMèîî¶Lþ€/ùËUÓíÕÍOfVÓéÇ´ÛµE?â7ú°½Å"NF/ÇÉèå±3™LàµA,‹¯ÂšG¾¡X_U÷ àâæZó“ŸdYVû¼Kim"éµÞ´I’¤nÛ¶ {öìq`–“ÏšIü±{ú Ýd"Žy­~{Þ?õÚü¤) Ò”ý͸͌ƒ,Ëêàà`Õçæ"ïÔX,†Ý»wûvã‹$iÉÿB8|þÿöÐ5؀竞 ŸJip²ïEĺ±mÛ¶Š"¿ùðfÀ©S§šÚ÷Àø;NãÞ™ Èå¬×-+Ñä4Ö®]«'þÿSïþŸH½ûâáû/«ÚŽÔÓIÇÿcc—C¼¬æ½Q:ý‡´OkT­ýÿôyÓçe„#YL&ò›–‘Oä‘O8Û&6¢" èüjýs=ùæüjßöÿ@õ1|àoâs¯»¥\бÇVÓØìS83™L ëŽÖ¼¯ ™;3¸îwVãÚ™K½¹ ]w„,÷™^= 1“ÉÖd×êE{>vÇ+XóÈ7°,¾ ¯VÅ–$I[·¡ðÄmžÜìXkxSü§Vr€vŽ-ªŸ·©5M­xe­qhõ0űPNú€¤$!Y'§‘c€ZÓì´WDÑ‘Tz™ŒöÇŸ/&¾[Ñ­x ·è.•oúè†Æ°.ùüPyô$\»Ø€V(p]ò=ƒU±I”eY}ÃÐ6n܈ññq(Т߀m_QŒcãÆúÍÓχµDÂOŒ ¶<‹_ÄΆ‹`0EQôñçýÍãÑV1??EQ õùàf;!¦_QÌÏÏ×~wãÆUóßÉñ…Õ÷C;‹Híú%”oj/‘è`» JÝ¥výC;½9/ŽûÕ3 MÙn²Ù,¶oߎ7 á CcM'ÿ¼ah ×]·Û·oG6›…øMP/þu×ím:¾óv@ÅSçí‰ä‚Û7 ¡·w¹Cjñ/¨Ýþs‡Eoï 'í?-":ÕôÃÓPöý ßOTM'PžʾŸ!ýð4¢Sýzû7ýêº#„Л»ªÎýÕã5À7bß¾}–m?ÑDWXÅèè¨ÞfúçkÅ‹öZ¶»é÷ºý víÏn<Äúoßç8~³û@Y–Õþî¼~íÏØþëŃp›øTï ÌcÑÞºýä$¾(êe.ÜY¯íYÜþyí>»‚¢ ¿WçœjÍ‘ü/ÎÿÕÒè¾ßíù:¯§¿7Éï^ŒW±X ¬—Öc½TNøõód'µAóõÿd´ˆ•+Wbvv¶" ]Lo£×ÿÍçÿî<Ñ…ÿ~f ¢Q@’´"ôâZô]wÝe9Ìf®?§R—pÙjXÞÿ#Æ×júeYV­îÿÙúgilý³´ãûŒÄù¿ýûsØ¿?‡ßÕÏÿÍÎÎbvVÛV‰ó¢;¯Ïÿɲ¬&/!‘x©j½IèF­8ÿg)q M IDATµþµòúÿW¿’Ä/ægð‹ù߯ÿ¿rcªâúßÕg&pÙ‰áŠn¼<÷gwÜ?°=¯ÿ3?}ÞËßÿ½CÅŠãÏz±kîŽÿW&߆¯ «x.ó†ºñŸË¼_V±2ù6ý8!²V^nBrýû¿wH;öËårúõão1…)]aÿ?{oGuå‹þÚ@LH®²Ç7¬jf0ùuÉL7žØ-›dµLVx–„gÈcfM4Ý£ÌLîÜ4­÷N²â!µLpÆj1†0¶ÊÌ…¬ª¶ˆÉ`¤’‚“ñ5cwY‚ëýqjŸ:U]Ý]ý!›äÖo--õGu:ûœ}ÎÞ¿½;::¸אָ¨Üfµ£ú?ùþ%ZÝ:—{ŽB¡àÑwíÚ…üà˜œœlˆü/î?ª•Om_oûåû>LÙƒÚû‚ƒ!×R~­òŸNšM•ÿTVÁð@.7•çf‹Je•†å?B„"Dˆ!B„"Dˆ!B„ßœ]éK2fôööâ…^ÀòåË{©,`WWˆÄÖÞÎŒw–ea÷îÝØ½{7½¯é–ÊHÅñð¶¸iÓåÜ©&ï_©üÔ ©¬†äb—$3ûß -ÃÓ/éøßo©„  4 /EÿÖõ`ÿþ³pò¹R㟪ªöIØç'a°Sõ\¿ð‡ìw܃xï òý ¶˜#Ï)c^ÍÌ`T—1Šã Œâ”CGG‡çÚrPÅÞµk6lØú œÚ?þøö?\ñ¹è¹d3 à¶¿5`!»z‚ÿ¶ðÒ)´>>‡éë%;È®(Š– DB6e!“—<†÷¡¡!1_U»¬†PeT+Ÿ;9°| Ò©û=å1¿Ùå+Šbg’2jZVãe –-?¡&WTVk¨ü0òÀ#½PÀ@ªéü4?x¯$ÿº®Ç ÂÎÉVc]KX’Ž ¼Î߯êZŠb¾ˆÔ ÓÒ:è…=(%áÚX’fu¨6÷¨ªjßgèX“PñôK:Ö¨ª-ʨªªö¶mÛpèÐ!Oõ ¶2¦70x´ö0óO9#`>ï¶wGGVfÇ=ï`||6là‘ ûúúB÷>Ï»»YÿNL0Y¦1zö(¾w÷Wpýš/AÅ9ì7Âï ÃÀyýÈ~Ö]κú2,Ä­žx0ÔBü'ZUò*›ë‰ˆÛßßïq~ìëëkŠÑ‡Œÿ/Xàç*« “d}ÿH8±¢)c š0·5ê|äÊ¿ëLj±Œƒü5‹Eˆ$ífú_Hax$Dzâ´Ñ:—Gj…99…¢¶¿Éuar ÈOIUû¿’üÛþ7¿NÛdð÷‰s¯ÄÀ èÝ=1¤ó.Që4K„’þ̪jI*Jåÿé—t|K¸6ŸF±Ç%À‹¤À%‹ü|Ýœúfû;…„¦"Ú²ˆ(7áŸÞµÍAò_Mÿó÷}³õ?àÝ#ÿ‰D'Nœ€ªÓÓǰdÉ'ð ðÔ ·1œXÑ ùø$dYnxÝ‚eÿøñãX¼x1nßúŽ?޹¹9ó[<ÙÁD,Y²¤ÑǨrþ4t£¬#dX¨ÂšKûý­“PÑf—“—f–ð 6ðCÞî:€ï9·×ëˆÑz°ªk)ú Gñ#¸$ÉÇø÷Fb8l;^+?þößV™üO(—ù©KqG?aÇšïÖ(ªµ}9ÇŸ0Ï[® üek)¤²ZI ‘f;#[–“îutÉv Ë€…;»ZÑc?k3žá–[nÁ…NÝîîÂßí9x]µöª4ÿïÙcaxèéXÒû£H§%ôŽ¢¯u)®Èÿ ïA<Îæáövw>6&aŒmëZûgfføu;wîäïűÜ×ÊäPÔýwî܉k¯½6ôÚOŽÿªÞ† î¿ß‰ˆ 2=§Tÿ?q‚õÕþÛ>ñÞPsôÀ þ”R¼`â×Ý H§™#¼Øöñ8{"kéúGÏ»ca¾×3c"æ7³Ñ„²½9NÀÞ3€UÀñmVñÀЕ¸ 'VtÂ2?Ey¤)ë?PY ×ÓÿO‡@àüxM’ 4¨÷èºSïRí?Øs ýO 'Ãðÿƒä«ù’kE±_ xú®ÖçÐu=¦¢Í¾âÇ?„úßܡưnÌ{‘ÿ[?©BþôvÏçõŒoB¥ùÛ þã%ÿ¤“&´pu …aÎ <ˆU«V•Ô©ÖvwHEv>Ÿ M*¢€…BOÚ/RÅë(¿°,+v‹³fœµ8+Iž@DåÐÒÒªŒju. hüŒÑ"l®5 ®ó5á”vàMxI¸âµÉÅ&44¿OÊ•M ’°’½Ô¦¬œ]³­€Š²û‚¢(öÙ홆ÊÒ{u]u©°±$ÜÚ/>Ç‘ÌËèë»ýýýhiiÁ)#†W33X™uŸãÕÌ N1àãÞ}øÔÔTMŒšQû•õ‹ g ÇnµeP$2Eµg¯•ÛM`¢þñçqþ'*ý¯'ØYׯQÚ‡·áãœÝž2‘­ùÄ~˜úò:,Ëògâ×Tꇩ/¯k¨|z†Jó@V+;ó'B2 ñÏ9W ¬ É nE˜ùgdj@ð:#Ú9üèþÏH·©åìÏo Ⱦû $û-o!½¿äyÂö¿[ÿò¨VÊ)ÚŸj‘B5ù«ô=Ý]U=²ýañ*¯„*ßÐ d’¨Ë(ÚýpÛŸ(ÿ•Êßµkî¹çN­/1˜&²ìLW+²Z‘ëýéü445d:ÏÎaòÓ$fçýË„Pv¹3?Òç…}w¨óDBî²C8Ñy‹žÂEêë@~Qàuþs¨fAl( €·¿ÿ ðÕÌ ü±¦s+ Ë>FÎõœ×ÍWý+a çûá0ç¾auðj°,+&|źüiéõõfß&œi,gÿÉ1v'Î/ÉÅ&´ãì,¦û¥ó¿ÇŸ¾Ÿ_—zö(ÖÕ—O«W¯Æ¾}û|¿¯ý ªý¹ÂúÿÀ‰Ö.,*äJêv{ÆCüoÄÿ‡ (Šùþ4ôgè|à2ɼŒ•ÙKù5™ ; Ìf;ÐÑGæûÓÈ|ÙÏÆ›rþ§(ŠLJH^pâ×ÝŒîn@–×áë_ÿ:úÿþüº3sþgž1ûÿVÓL³ßþ6™kºý_Q»­­ ç-qƒŽÙÿvïÞÝÔ³¿jzÿç?ü8·7oݺ:®çßÍ÷þ¿RÙ"Oô+uéÿr»‰ÒöáËoÖþ_n÷nšÈÆÅ÷ý Ž¡ÌgÙþ߇Z÷ÀA动§ýúõ¿ì‡yŽñq6îÚµ ¹\®æ„Cbù%ûåî¹E=g•ú>LÙ‰+ßË^ô™˜pÆH-øm”tû¶ªò!B„"Dˆ!B„"Dˆ!Âo}èÏ´÷ /àŸø–e<Œa“È_–eÅè/ìCñ,¿©¸ÇøÀãt] Dþ'L½ÜžP¡ëz¬Ü! h óCUUûŠ®.¼õ©Ã€·>uì@:?t~ìð\OÆ?ÿ½+•¸ŽùL’;ҮџʣÏZò]ŸI–F?­•üÏÛÿP'âÏaå7;pÅçX{¿2ZíçPƒ\á¥S°ØÁµh ‚`˜ç ª_A4¬10;ø§6K¨ O[Ôc+q2ÿYÖ•üuoo/,ËÂèèhÙòëßù?ŸIbtt–eyÿAåÓõT~-Ñ€•?Ñ €²„É@²‘[^À¾7ÜÏæÜ,¢Dþoé9Š–ovÑü”„ý©÷ðùOöØ86pE-\fÆÛ*î3týC–ᔲ‡ùÿرcœxAFص_ù.þ£å&lÛ¶Ís/"fÂÌ?å0==ÑÑQŒŽŽbvv–Ë<À Ý]]]èêê‰?µÜJ1SrÒœ¬ŸÏ9ùÿ¾z@ÇÛUï·pÝשׂ/ÃÂënÅÀ³E~ϰY*É?E{NeõŸà¯#ÑøOXàc`rg£€ÞÞ^hÇH’„6x~?_YQÈ 8;;Ë Ö°q¥Õð¼¸ýTÜ;ÀÉÿ=Ý]c2À"ëe¦U[[‘Zaqg©Jý_Nþ“Ï»¯òÿçþÛð¹ÿö÷¢Ë»!'§0ðë§pUö?FîÓ u88ðRUù'9×ÿ\çk(ÿO¿¤ã©“àÙ>à!‹àƒð¢ï=‘ÿËÉ¿iš±¾¾>$‰ª™»æc>’ÿ3¥ÿÞ-òOäñ~‹-ÂS+4¤â, É?e›OÐÚ277‡-[ÜLÙçüë}\öƒtÀf?G˜LìaáÏØ¥ë`ë$®(”'Í7³|ÿsþnÏ ÜpÙ{× ¤,~}k+îîÂýÃ]|®—$ÉÞŸb¿I¨ y³Z&‚j™ŸW×u½J ½\___ÓœCö}=z˜6H¦ó\ "¤6Ëé×ÿ\ôú5IÂýÃ]ëÞŒgHÅqÿpîìj-ùîc€}gW+ÆÇÇñäà`]–AàkÑòÿ –8ccRèù¿ÜÚ/’׈ü¿fͬY³Ð_`{€ü”„¡¡!\uÕU€½{÷bçÎ8xð`è¹ô ªªDZh#,Z´ÓÒ:hÇ©%Á5ÄõB¼w5ýŸÚÞíƒ"¶lÙ‚ÁÁA "—Ë!—Ëñ1?ßú?‘ÿ370'TÊÈ xÛÞrþ=ë¿™1=äÿ–í^§·F×ÿ@ÐñË‘P °Q@>còõÇÖ]V-8Ó:€H~˜O$Óyüìdåý{3žE\—Å5»ø/C•=ŸÙ7øø7 )óF¸šÅÎ;n÷z³… hsºÆ PJ^˜²«Õù–[nÁ?}õ«xrp¾.˜6ßH'M,Ë^Š#™—ñ¾÷mÅûÞ·o¾ygÉu†S•#™—ëšw'nÑÌËHM0÷É…È·keçÛñ,9–ðd˳ï•ÓÁ‰t}8q/ŸœÉ¶ÖVª{.—ÑÌË ô‡·ñLìaÏþüÏAuéëëÃÌÌ ö}ü‡üZz€Ù6mÚ„Í›7£½½ccc0 ƒ‘ÀCôAPýý$ä ú9yË–-eÛ?H¿¨í}áÆŸ>Yú µÀïü[á~W,Ÿ¡££ããã¼ ¨ö?¡\ÿò,lÞ¼y^˧g ý¥0-eµ"2I™¤ŒéG×#þùÝœü_î~µ”Oã/yçÃü³LæÍŠ}Ÿ¸e´aù'{KBM ŸIbâB7 iûkÄ?¿Ó®çuÏjE´¿Æä}ìýinƒãÏäèµÊ¿hÌg’%²Oåö}ü‡ž`iâoÞÕß/ÿAõ応ý©Vù¯&AÏAã?è\¤ÖñWÉögš—„*ŸÚ±ÞóxñÜ(“”=ò_©|‘øTKÿ¡X,"Ÿf{œ ²,ê>Ú€…|Ƭ+ãv5Ð^F¬ƒø ~Ý[ê;íÉ`?†††ÊÊàÐÐúûû=Ï$;ÕPÍþßÓÝ…W_}qkâñ8ŠÅ¢‡ü_ý¿Üùß;Ïü˜¿&òÿ×Ötãkkº+Ö¡œý¹Âøÿœhe6Э]øéŠNœÿÞkÐþ¿ÚášU¯ÿO ž) ›í@6Û?üÛ9|ãê…ü«Ì÷§¡ª­PÕV‘ø_Óíàõ™ÆM2)žÿ­^½}ú|ýë_/9ƒ?çgÊþ?ûíoã56N«ý¿ÜÙßðƒÿж¶¶†ÎþªÀõI௽r» ¹ÝÄ_=ZJÀÜ=e"S¶µ ÈŸÇøøxèúûË/·ÿ¨V>µA­íTïûre‹EnJz!ÒŸ^ˆ±^ Åb±Ä¦¦ürhDþIG ÓTwÒ%”Ÿ’ÊŽ¿³ºW(/ÿ"Dˆ!B„"Dˆ!B„"ü¶áì )š09ß/_¾³³³X´h$IÂxrº^Ì:3æ¤ü«—0b,Ýqˆ\þ»ÀÃÛ`ùïž‚ÚÚ C70ŠsC°}žˆÿÇ/u º®Çn÷eôöƒ}Ç®QUÕ>ëÔ÷ñ΂ÏNžü¼õ©ÃžèÞpÞ3°üÃ7ãÊ™w€ïøÁÜðwî¹_ ¼w­m‘Ï$‘êëömÛ°ÀÐÐ `_K ¶m6mÚT‘T ùŸG|?Ô À%û­Cì1ÀV€Ö.Àð+£ˆ?ä¯g‡:‘]Íõ͌ɈH¥²³€…E€°oß>ñ;lÌš³„8ˆx¦T>ËšçfG¼Ž]bV–r¨Mþ ü‰Ž1K&±JseÐug\  «º–â"õuœ2bX¨|Ž¿ªk)vmQ³ 'KzfÜ¿Ïбb!ptóR´¨bRµqè3®±ÛŸÝðf'Ý»w/Ö®]˳_ûšWþ«Í?A ~Ë:¨ …wº#ôõõ!“”k"ûQÆÀÌù>›[‰ìÖÕ—á{wg]}®_ó%èx©g"ÕRž-rǃ·z3X8˜Å×ÖtãožaÙPöŽ0ã¨,ÿ€›)¨þ~Ô*û~ãÿÇà»p˜¡KÓ±yófŒŽŽb¸KFVs ëZo €É2#Õ+h›à’ÿeYF[[Ö-z€C^ÑÜl,§®ø6G #y+îemˆì¯¶¶bx$µµ 5cR÷@ÿéÐW ˬ rHìÞÒƒ‘¡a.û@¸þ’ 8÷J$6ý_ø¹ñ>œXôsŽÄ¹,HËÏ·ppà%¬J4ð:UUm#Ɉÿ­X€ >z9°ç¾û!wMyêdéï ¸qaÀ²lDÕåß4ÍØ† lÑ™pÇÎ|Í¢üúûûCëbß7Cÿq¦å_$ÿ/Z´ˆ¿žžžV0ù¿èx¼DþE9Ù_;7Àuþ‘eýýý˜Û;¨®ìOçM½oz6Îj™ØkÁ;#±¿›17ºxÀÛÈ]öÏÞ$?þò) €†Èq”ì¶±1¬êZê B$B/Ø|èèZ"ù†¯þ€û¾y d#«4ø3?mÍì7ñaÚ¾^½ßß”IJ–e$Óy®£ÒúSÏúZ+ÊeÿRµ\ÓŸáý¦‰\.ÇëIclr’9Zù?«›N-™ Ó–*‘X ] ã(zzØç{öXX·NB~êW(-Äãl®ÉdÞD:Íôìzæÿ µŸÖ¡x<Ž––ÌÎÎbùòåXú !vvÏ>û,V­ZUµ\’KUUícÇŽyG-ZT²ƒ¬xn¦>9UBü÷ß»j€§œþù¸øâ‹qèÐ!þùÜÜŠÅ"ŠÅ"=k~³ô·nãÜÙW;ü ´Ã`™Xéó ¶ÏdÞô8ÿ†)¿ª­ÿ3™Ã—HþÏ$ed·—^[Ïú_BâXÀ7£ hJÓ×zÞw³Ðìì•ó~vÒÂG|g²,ó³¯FÉÿºþÎê^…ýßp[³ïxæ“XùÓÛíJ$ðFë”í1è:ñ¬/•ÕJKëí[˲bÉt¾¤Ì;wâÚk¯m¨ÝkÍþåD°ßPþó¢|©Yý^ ‚È?¢~P_ˆ}–|P­Î€»w·ùø;‰Û€‘sùçbf¯tÒÄ@öR¼)üΟ1 ¾ÓínšE±E’H-s1íõ?œXˆ<4¤„²óí>œXˆŸo.0à¤iƒv°XI¬>ÖÊF!² …²ÇìxëÞßßúü¹^,2~ÎÌÌÿ!€Mœ½2ÛÂ÷ì´/kàûñ@CeÏÌÌ ¥¥333%õïïïçßÁí„r}OãïåÄmÀ¤;þôIæ0Çî‰~oÓ:eÞ€—¥ãÎÂÂŒ¿ çÂæÍ›1*ŒÃŽŽŽJ·j*ˆܬòƒd“^÷twax$WšÙï¸Âƒ|f5/ùŸäŸþ÷twAÕº2¡Œt¿îf$ŸyYßÜ£m½‰ë¤ó!ÿÆÉç‘8÷J'Ÿw‚xƒÐwx­5+ýJç‹€/¸œKöZYvûK$ÿ÷õõ… ~ùÞ@”ÑþT aÆA5ù‹Þ%ÆÌ‹üU°ýÍgù¢Þ7€·|"ÿñ©ã@–e$³,Ëé¤É‰ž”yô/]gû ”Œ¬VlúYŒüfó(^Ï‚ÏÒPBM X,z½“.ßõÀÛP¿ñ{ìò#ä.;ăð•+Ç ÔgÅÆ¤1û/ÀÎòŽ œÀ’4Ó3–ÀÝû’-”ÈVÍ Ä¨(Ší?ßá×} Ã@__úûû±cÇLOO×¼ðŸ×‰¿§6öõùª? Ø£ŠEhRY%P÷ø—·AúÓ¥å7B¦gXìMð>žöœAR¢%«xÎA›’Á¾¾>lÞ¼¹¬ R`èlÊ€Æúª½½SSSž³ªj8“öÿ ó?  ÚžUœ#ØŸˆô_Éþ ¬­×ÿ‡ð™yðÿQ–>›íÀšk2xúIGïx¦Àíó¼ GUÎ~6޶¶6d?Ÿ÷ó¿ œîó¿ û_[[Û³ÿwv¶ar²qû?õ=üâØLNN¢ÒÙߎ;pÞ’u8oÉ:“ ŸýÅîŒ{Ý÷FÁÙ÷OgÚÿÇîðÖ§ÞýÿÌÌ ¶mÛ†M›6~¿mÛ6®ŠûDB£úÿÁÜQìíZеeê¾7ù&³JÁþEÍéy+#´¢óL+'/ÍF£í„z}*AQÖ4 £££hï3ùy@­Ú˜ª T)¾PùþÅÐv£0˜ùØ9ÚLô‡—ÿje§“&/3hü]ñÀqÞÆ}X…ýgƒ!B„"Dˆ!B„"Dˆá·×¹}Ö!ÒëÙÙYž ¶«‹…?&cKGG¿¾YF`"ôÓëÙŸ¸ÑÈS+˜ÑU4>Î]€ã—¶–ùÃöUºfá/ÀY§¾øÅÕ—{þ?ü€ÿê)ßïðí%¸dãééiÄãqù8•ÕÏ$¹“8{ ·ò?Èÿû;ŽPc&°ß<Å3$“Ñ[$ÿ“#>ý·oPrþ ó‘!´ jÈ*4…;qʲìf ‚+s:ýŠ 1}â ¶3‘>PÌAh‚9) >µ× 8úL·¿iâ EÁŠ2/äñÙtÝKòzœe}`€u‘üoGH ÍÿâÚ?88ÈÇOoo/ð ;wîÄ×^ 8x𠮺ê*nðšééi¬]»¶ærƒpâÄ ¾ àôlO»ä„Ûßêÿsss0 ³7ߌëœ_žûo¯òyF>%Òa3õ‚èüëÖá#Ðõ=ÈܰÆC›qÅ-.E–å¦:ÿ†]ÿí)0¥l…ë°×Ìõ¿ hxó¾þg^ÊØ”ññBËò\[KYb®Ã/ÿõ ¾ÈšŒ§L¶îþ ž: Ü©(öûM¯IRÙÌ“µ<é(ºþîÃ*ìK°†,<§£õ“*P® ÄìŒ}Zóûûû¹óø† bV9ðŸžýÎ!•Œ;‘HT)0=·$I¶x¾¸sçNÌÌÌ ¯¯¯®v¯'P¹€Íì÷° "À#ð’ˆCgB—ÈK˜ù R+ Ï³ä IDATª¥ÎåôÄ |§û$¾8r®Kè)˜|þ¥¹N×sÜùv@S¸#0‘ÿ/0Àa'+÷Âô21] ´—ÃÆø5€ÔD-ƒÏ¥¯çAð€?7ÞBj"Y’mñã =ƒÏã'nƒ1Ü–”®ÇD<çÏ,ˆÉéZ  ¢P(°Ls²Œ³Èö‡·aÙD¶äó =ÇÂô2Lk+ ']"—Hè"|ZdYæ™Ð/pžçìö ”‰lÙ1X©þD<#]jëÖ­Ü ·ÎÜØþÔ÷À – `/'NâRã\NrÐarçîÌ£,¸ñü/¹ƒÿD¿Âù¿žñÇ÷·Ž>A:?„ê½ð ؼy3-ž“P–z*¨Þþ„rý@í7+ÿlfùÚ@Šï3D›ABMx‚hÇ™Œ'³¹@UÙ®³3Bº`ö:'¬$ÿÉ;F&ó º»w¢7#yÓMã×Ý €éªÉ;nXþýöÂÄ…YÀ!ú@âõîÏe&.ÌB†hgñd­†ÞÞ^Ȳ Y–qþùŒðL¤"~‘ΰàÃ"ÈEuªÛ¡*Õ¿^ù7tƒ?ÙÂfÿlDþÄúSÀZìpalaËoÔH `åäßO|jFùnàð$4§ÿ²)‹Ÿû ¤âH¦óȦÜs±„š@^EèÏaž!ŸI"õE fƬÀ àØÁÎÙ ðC>Žu *ùߨO–elÏ™Øèý ¼ø©¾ÛsGÑ«²[ÑYÔ±vV¼$Ý<¼Hdíïïæ˜Þ?êØ·_ÍÌ`gï}}}صkî¹çLNNÖ¬ÿ׉ï;::ÐÕÕÃ0P(øþ„ê¿oß>ÀêÕ«›@sü teÉïÆó¿ÄD¿7EP]jm‘ü¯N«Ðãl2êüU'Òyè¸sÐBΙ«f6šhÙ^ûÙs9É`oo/’éA Ààà dYæ gggaY¦§ëÎÐlûÿúõëqÞ’uxúÉòºˆxþ'=ñ ïÃ…¸ã~`öçÕ«Wó±Æþ|ÃÍxúÉlI°â3íÿSk®Éð×±+¿}ÀëHüÅkìÞpu+öüÍFÀyKÖÁáÏëù_â]pþdÿ£úoÿó±Ójÿwû©q>Á‘•ªg“““XsÍ:Ì ž³?1û·> ôÜÿ^è_ú¥gÿO¾D½?hÿOä_}<+÷X/óYê´0Ñ_>À$®|/Œç ÀÕ?·mczùÙ럮L듌püEtAmþäÞ\Eý_¬»H"¾SQ°5gboWp°áƒ¹£¸SQ Ð'l„m@ØmoIÜé¶Ãøø8ÚÚÚ¸Þwùålþ9pà^xá~ ÀÖÃÄ•ïÅðVö[¹Ý&Ê¿Jå6ÒþÔ÷ý^ÿ¿J+û Ä%Ö}×®]0 ƒƒƒÈÃÆ@Ê *¶oß>¶¸çfhhÜé×ÿ ´ï±§àqXÝSë;qãЀ›q3”žÁ¿.¦óÓbÅN0ÊÂ6>>^öÞþ€>µÈ£®/…ª2Ú0ŽblLBg§û}>1á%ÿ5Fþ÷C¼×àà ÝÛÛë!ö @ ù¿ÂB"ˆÁ¿Äy_Ü‹¡Ñõ¿X,–i‚0ú?­ÿÚᑼ€éîäÔ›rî‘Sp*¥@Ó˜l4;ó+—ý/·þ›ªãlæ(劮4uý¯F:ë?pft±]iOAó?íîvÉ~aÏxb.#©8€wµ¢Çt3 S0®—þÝÎ>â|þÝýÍGÿS¸z“ÌR¢uÒ”po7@á9ºn£õ“nÙéü4¦]‘oM¢ûËm?½½nŒ?ë'€*ÿÙ°aŽ3zÃk/ÜóqýJÛ¾šˆÎ³ˆð ¼éO#°|÷ ûùea‹¨ñ`ØÞΨÜ[$ ´.‘3p#^g¾ß“={rÀ tg—ëM$ÁrPÅnoo/ë„í'Î<+ô!e×õ'ˆ ³€ jÌ:¯(Š}$ó2 Šÿþ×^âÃcãséë=¿û¹ñmšfL™ÈÚT)«Òúì'\‹åÑ„þÓg"~=‘ÅÙíœÝžám@õ¨òXeŸÃß«££Œxã—Ç¡¡!àCÉ^jàä÷°ýQ©þ{÷îÅÚµk177ljÉb 0í$ó2¿·Aã¯8áäDN?(XÀ¨müùAÁ„xãËÞ÷tG¯×¯_Ïß›ª Å©c­íO¨ÔUËo ÿý ùÆŸÕW‘ÿÃ4͘ÅVûG%²_þ—e/ůá­÷ÈȵèîÞéù˜¶òO礿x澓Ï#qî•ü?}&"«‘IÊ%¶—Zå?™dúÖÉß¹ÿ:#oК\i#Úk ]©þaä?«ÁPûÖþרüÕª– Ší¯bù> ¾ýýwü(ŠbÓy«xN099é!>5Òÿþç ñ@ý–NšÈ¦,®Ðùþ€æÝ{ÑP-çüAÏ Þ“‚ÊÇŸCúz7¤™1QxɹH5ÅcŸýûD[þ| Þº¿u*Ú*fþ ún»cK¤@©¯sò?=ë™üTÿ (`IÚ={id?ì ±2Û‚W33ž,æì ‘ßr¹&&&8A àbÛ†D"Ám«??€Ç­^½ºáúû‰€@pŠÎÁà’pýäÿjhÙ®`f£»÷l4©_¦ûutt ··i!›/Ñù—eYãŸÕ’ýx÷Øÿű#=ñ ½·òô?}?³?Ë 6lØP“ý9 ΔÿàÍO?雈]‰vûy{! pµ{þ' ¨µžÿQð…3qþdÿëºíÿ¿8¶Ç >Ð6oöÿJgO?™E[[Î[²k®Y‡x*[×Ù‘té ¥žý¿Qœ`Aèäv7ó<ía«·Bésµù~8p€ÁE˜¦›èWì  „ˆÞH¹Íhÿö>“·m%Tóý›Î³2â©Qn/Ùµk:ÄÏ@²ŸwÆÂןÐèþƒêXOùõö}#ºvØòÅùL’ïý ó)ÿ]wƒˆh†üGˆ!B„"Dˆ!B„"DˆðÛ„³/ùOE'R—av"‘àŽçäŒÐÖÖI’ò× ©ˆ•Ô—~¹ ‘k÷jN˜µ`x$ÇÉÿ–eņ%Éî±,è…ÔÖVOÿwoÉ@ïêáÏù)Ƀ„éÿJ°,+6&¥í徉m®îÄ…ÌA†ÈÿcïO?p €û€ÿ’¸¾üMÁäÿÔ7 øÞ®SÀ=l°½¶MŒ;²}…c¦>v^7`ê#õT©,6lØà´ñf™mö| XÅûŸ.ýÏw‹üùŸˆ äÐGï«É?àѨ•]Mö_ÍÌ`Án.©V+Â/ûµ] ‚Hü˜^h+Ì ‰QYP€Sˆ(àZŸÃôõµ9ÁªªjïoÄNvŸ¿Ûs“ÙßáNíí&ÏL¾g…Ž7|±hadÄ›¡£V'ä  `/Zà8ùìçN?lmX8ÁNæòW÷\"´xÏz@¿;::°2;îù®££ããã\3=I’dïܹ›6mjÈùLQ;¹Øäú¨íwîÜY’…Ú¾Þ2ƒœ¦^%ÓÖ¯_¶6`ùòå0 ;vìÀäq¥i™wèNÜa¹Î@b+€ô½ÓX¿~=Ö¯_‰åË™\( èõ?ƒ$Iö¾}ûx¦G€õ§˜]‘ú`ós¹9]’$»««‹;G:÷ $¦–Óÿu}©‡Ô?6&Ù ã(‰¥œüßÞnBUÝÀsó˲b@Ô½‰GÎÏäèÜÛÛ‹½{÷âK_úR¹[‚‚‰Ä5€^“Þßþ¿Ú…%å÷æµ X,bîþ¨äs"Á!mßμÕÿË­ÿÚá=N½ù¼i§R tý#PÕŸqò2)!yÁMÐõ=u×YDøõŸ½ž¯õ¿ h>× œþOÁ„rú½:ÏÀéغÈÎ'\Š,3Âé' 'áCµ è Úƒ˜…í÷ÏuÈÿ)ø9ž2ÝýÆKÿn⣊R‡ÀæÉt~ÚFHÙPÕtÝF÷—ÝsA±lU¡ðœŽâ¿l„üéíu¯}€›ùsóæÍ°, ñÔxÙà?›7oæ×ûÂÅ Ba‚Š´´´ð9·\ÿ‹ÎÀŽc|Ã$"Á ou³Ëò²àñ÷<Û$öµ"Ÿ©OæDøI;³j’i /¼ð‚€e]cG©Îo;ÀÉ3²¬”üßP'³éòŠÛÍ›7ctt´êsNÜV–¤ ˆXsž`¬€{ΨLdm"üë• õ¡iþªìF&ÆH©‰,-–¯Ld¹¼¿5p¤nòsPù}}}èèè@¡PÀøø8Ä$^Ou¯tŸZ`YVLNNÙÙ”…ÑÑâ¿,ËØ¼y³‡ä8]+‚ž{Ó¦M< Ýèè(í)7 ï]C¹ÕÆŸëLÿËÇújã¯X,(_¶$I¶Õ.Ø,d°­]ÑyídYöâ_+: N¤èÝñ× @Ù2Å×ô›zû_Üd}öñžLösœ@úüHœ³Ä–a4þâñd2,Ð^6þ0 ¼ÿf>å?ûÁÑþZ†Ÿ9¶¿–)¹^´»”»O½ z‰²WVÏü ‹fÈÀH8Ò„koª©ü¶¿Šòß üíƒK|R°{÷îâ¡ý_ Ù”Åí±1`°¿ßk ¼'‚îI{‘` òwf1ó{mOz² †d€(%ÔEø»='0Ösgu¯ (¡G[ƒ®Ÿ¨?à%¡ZP Iÿk±LEQlñ>Í(7lûõõ}Xß? îÀ£ßyçžç®µþï†ý¹> 9†þÓy¡X,⬺J,_>à®âZ ° µÈqBA™Ø£ð?:gH.6=¯K~Ó$ù!B„"Dˆ!B„"Dˆá7g—ûâĉòÀŒjÓÓÓöôô4?„œÎ/ÆÌðSÀÌSØ{ìcånW7ÈøHår#9 ¹Yùo8Œ±ßûLÓX~#à9çMbÉyŒöÈUã†go*ùÍ#W=ŒÔþ‹ê.3ÈáÛ4ÍX±XD.ÇØˆäàâ7`üùŒ‰DUÉ'AÆPʶ@䀵¿²ÝkÜàíÿÿ›§?Cp<ƒÔ ÿÁ²èh¢ª4à Ž¬sŽU-W\,v›\Ü@&rú',œGŽ_à ï‚,ËŽ£Á#Üù©ZV® H’dwÆã˜(§:w,µ“»«Ü¥9ŽgÈ9 à'Ì ç4NA‘¸‰ü¿Õ4ÑÒÃzT> ðCóªªÚO¿¤cÊnO¨Èë?EjÿEø›¿aßñŸˆA¿·÷.ühí7KîÙ×µ©ýõׇˆ–ÝÝ0 ôe5nÌ£ ÃäXDx53€9Qör†ÙÕÛ‹ 6Ø@¸ñ ÊË;Ïü€Kþœ9à¹ÇØðó¼âcàÂ_ã žû‘Ó¾ZÚ^•à7üLîÝÔ3üs±þ$ó~'¨Z)’$ٔ幜ñ?ÑÌý€E÷ÿ¸jŠ‚¤i"«ÁCÀUU ¯6FÀå@4gÜÉOIH.6‘¾fòÌÁFtÂ$$ÓùŠ2´è…‚‡ü8|E±qœˆ2ýp#CÃ.¹‡eY±ü”d÷ÔTãp L\Dþo-ƒÏýÀøc·là»6.o¿üŸúfû;USqø#,¸Ëxã¾ }]KÑï‹üOŸ7"ÿEQìé¼ Ã`Y®E’AªùàÐùk­/”CÚ™Öÿê•0¡qù_¹r%€òäÿtÒ,‘ ˜€ßÊɾ‹²¯ªî˜©÷ˆø_xÉÉä£0ýPþÎ,Š×ŸÏ¿‹9B²Œ\§€ ­eN„Óׇw‚Í]v':OàÏ×-‚±HvyI çH0"þô´ Yö¶E6û¾º³žÁÙ8ÌqúÙÛµ¢+±,ËžÀCþzÖCþ'`Ñ©»­­!É›>+jl¥’“SMqþv³P1drøÙ¶m' FGG˶}¹¬³•äüKÿ‰tßÕÕ…¿üË¿dYÞ$ÞÈÿ±îk1 €Hþ߸ÒÂÆ:%I²zè! Þ| ŸóÚÔpsôäÙîÅþ^@ª‘$Éîïï÷ìMÓäÙ¡ÃÊ¡HþØü?á8öPwrÝï^±Ò5q¾@ªÉjóæÍX³f 'Á‰Áüã|ì fsÛ›|kµ÷•ü&ÅOÚÿdYÆ\ ×7Sÿ'è:˯.fô²,+¦issêÏúÿ5à‘áædogzýç$ 2äÿ{»v•¬ÿ¦y ²Ú+M]ÿÆõÿzuN"ç3]H¦óžkó™$†GrœüOŸ‰A`–¯ëzL…jëº{Urƒe, 8 Ü©(è1M¼ôï&>r®wýéßM| .Iû©“¼®ZùôšÆ~:?m Žî/·¡ðœŽÖO²=,˘~t=ÿ¬ðœŽÂs:ö ¬p¯ùt+¤(Ф²£|Ý_)¬û€›sÆ îõ¾kÔLþ§¹“ÞÓJäç µÛ¶møçþgpfff†WëRˆ0G@ª_ƒÜn"óè¤?½ÐsmæÑ#Þ ôØ­þ¬µ5?bð‰}Ÿ,ÑÐÐvìØáù]½ÁGÄ: ð⣳Èl’KÎY€YZºùÿî}Á ¨"i—ôưÏqDÈN„Ú|‘ÉsÌÛ]OÝç+G†€…ée0}:H¥5¹X,"4/;k»d†ôñ4M¯¨lUUí\öÿÅÂÅm€ñøŸ?Dîý­èRQ‹ˆÃ<{x{ÊDÖÉ" Ïù;`à9ö—_Ê=G±X„ªi˜â?ÁŸÝUQÛCÀ/P¡Z¹tæL÷—eÙãt.–ë¯P߇EÐø+ŽŒ¿þæŒ?üCQP±c+8º¯Øþ"H篥ýÅç–ÆÒö²‰RÂe:¤ú•OßÕÒÿ¦iÆ’é¼=bÙåÅyFü$I%ó€&kÒ¼KAü¨´¯*ÿŽ˜Ëòûͺºw:ý+çÕ¯–1pÙßHþÇÞïÌ?ùy#à~ŽbsäŸÀƒ}98ë«_eÅÜ}7ÿL”ÃÑÑQÞ†¡Ð®Ü¼a X(¼Äà’ÿEÐÄdá²Ø;#?¶÷wOBE[耜¢5¬(ß¿Î!ÔF¸G·çŽ’Äþ|cÙåDCe‚€À¿êÌ ê:ÃOC–ež™<,‚ÊÏOIÀ9§§ür`‡„Þ”ªªÚpà®}˜Ñ_CKÏQÀH`F ©ýÕEöñCtøVÅnkkÃòåËÑÚÚŠD"á‰Æïd"â†-³x–”†9øö;j,º—¬6Úþ€Ñ!“H@ þ‚ý·1°Û-ä'$ˆ§E4J„cÎ?`™ÈAÇ0ÇyM«Ë`l𵥨Ÿ’$ÙDðX&™¼ÄÁk©Ö|ÊwÞ×òlA°,+v'E­w†9Ì ÀQϵ·H’]„ûL~2´®ë±5Ž\ÀÒ< |ô"Nü§kÄgøÂÜ=®üÏ5.ÿbÐ1Øiš1I’ìéübÈÉ"Ö¯_]»$à>³6 ¨¿¿0 N ç‰rhooçd½·žx@éÈ,^ Øj%cà<<†óÆ@ú*¹î¥n¥ IDAT1@r?,$X¿yOªlý üáÀoø €>Ð>öÚ»Y›iBÌ;Ô—Aß‘a4“gs^j……ü”×& ²W –eÅ’é¼çÚü”HUú¿ÀHÿ®Ó°YFIÿ‹÷nt°,+&ËOÚ>I¾ ŽüÿÞÒÿ Ï_rðs±¬ïÚÀWùïƒä_½KµÉe¹ð³SPá%þóì¤Î<12œÖ£©ë¿iš±xÊ5œþÝÆAüùö^ä3&_Ó }â÷Ù‹óÁ¶m·Î¢CÉÍéÔÿª¡Vù'`#"~.Z´ˆ.ʺËÄ€P\IЭ>ù¯$û•êOcùŒc´gã¦fGÐrŽ·1“é‡Å,Hi©ä{°€‚TrUUÕÞß:‰wF¸,69©ØX—dúÀ2èNtaÄ`A `Ï ëÖyË÷?ëuB6}ÀzLV±ƒŽ“类¥ØŸz€òäÿFáYƒ-À_Ľ@>“„œÌ£¨­àºá¦M›êʶ$ÂK¨cY?fff044T’:€t[òºª9ÿ®_¿#ÿ†u‹^à>cCY¿…g°TËÍü7€4á>Àœçö6ü ³³³¡žM$ˆúe”Èÿ¦iÂ4M(ŠÓ49Q-h|F¬‘jœÿK×þfò¬Øèè¨gN|öÙgqÿý÷ãþûï/¹vppÐþÒ—¾Ä?«I„¸–›ŽìÓú?YRz¡€äb×ùµZ6ífŒ€ec¿€ì’ÓI€…n'¢{Ï@HDø ÄåÊ‘eÅô2À!!‹Ä»|»CÓH&ñáÄBüÜpû›Þš†¬…,˶iš1UUíܱVì{È-FîX+rË Àl+r(%PнóŒÛø½ÑÝÉ\þ³Þþ~–—Îã鼎ʯب!p8á>ÇêÃÌó®îO$< ¸¸{ƒññqÛ Byµr—MdyðˆB¡h¨T±(‹Ü²ì¥¡žC|žÓ1þª!æLü+42’w| `,UDÞ  d/åí¦ó&ä¤Ä˼ ²õõ?l/¢þK.6‘hTµ ºî¿ÐÏõAó`%T’mëMÐ?ˆä·"~Ý͘~â»üwô^;ü ²Ù÷5,ÿÜn`º'WVþóíLù£ùgä> f›&ÿ•Ú pç"åRvèõë×crrÒ“ ›‚„§¿ûc òï©{ü׫——“? `üOHÒNSà³ý…‘ÿ€±Tר bq¶ñ‰æAqô÷e=妲ß¿PŠÙXEP žà„jcпÿƒø|Ž‘ÿé_Ñ’÷ìI¼¨êmÐG¼ñ|CúmÉ’%| Ù8+IÈX¶çŽbc— ` §ö¬:‚ÈßÔ4¶â)F£3ÀÁÁAÏ^±ÒùmŒî#’|çr9P`\À{I 4_j©¿¶Ö¸6’ùL^B¼“í÷ˆdW)øn­¸Ï°,ãˆãˆÄ²Ë˜°'1,ü¾KŽNšØ°aƒçZgõÔ¿êÙÿŒ¥ªc£X,¢]xî±1wmvýý,dò,ðèùçŸÏ¿¿å–[©pïr ü¨Ôn²,#4ë’ÿJ¨$ÿÔÖL´.÷ýýýÈårç!¿þ/ËÕYˆóÿø¸éùnݺúô0ð¯ý»~Î"ýˆYiJÖþU«š¢wnxö&œ³“]Æ…hËÅÔŸùK-èííåþDhš†¾¾> ñÏÕÿ]ÿµ­Þlh‰[F«Ö?ùG¾©ì+eõӼĩËóMÙûÖ«ÿ7ªTÊÀiè´ÿNÈ | €—ÈÓ(,ËŠe%ɦéE°½ÙC–…ß?—ý_ ú Aõè"Á_÷¼WÕ'þ§óÓHÅùçµ@Ìþ”®û":::øúO×rÒ“@«—ø-‚æ$r %gà¡¡!´´´`ff---üzšg(¡Ò¹ŸåÚ`¤µ èdò`<$®|/ÿ¾™ão\â?à‚ÈÿAeׂJužýÉ,ÿÝSü\S/˜P‚õ?•_Ï0Mox‘@L$’ì¥|ßã'6šãüŸ‹Eš†Ï¥¯Nþ78¡‘’Èh@Öv‰ûÞsúw^c {ŸCéžžð?q._o}æìÚå¼>tsss˜žžÆìì,t€g¹j;c+‡b±ˆ…éexkà`Â!h¥%µÈä§xð+‚˜¥·™ ç¿ý`6ˆ;DÅûU:ÿ?“ã‚~‰¨ ÿkÇ•Š6€¿×Ùbô§êɺžç‡?sú¿¨•ÚEb ölÍf@—’ÿÐÓÍ^]÷€ 5Q1 y%ù×?ˆîn¶Ï$ò¿v˜§M>Á‚$ŸaAõÈ?ãò~ùOM$ÑþZÝÎüÓ$p0qacÄ3€í_(Ø×Éßaºä;wßÍÛC„H²eAvF†Y»w÷„ ÀPÅb1Pþ§§§ñ /(™ÿ*êV•ä¿Vùköø¯ÅöÇʨ,ÿdTk œ‰Þ–à(ŸæSþ+õ§?[+]KµÞ#.#žÁÑwây¤ÿzqÞç–Õû¶¦¦„×´GÉ”!ÁÖŒ“`€K꼺ݡC‡Ð××Ç#^W+‚žô á ©äÞe¢u ær9›æ‹0eøáßëŠûÿD+Ÿb¶îB›KÀØúDKP£çÆïoËP§U`ÐãìÚûÜ ¿âþ˴Ѭ„ÎNÆ×ˆø8aöÿ—ºîkYVì‘ï¦íOþ†Øÿƒž¡Yöç0˜/ÿ²ÿ?dûâñB= èÂ9½ÿÇg^æ$Ó4cÙl‡}$ó²ç~Aøm:ÿ ²ÿÿèìáz…Ãoÿ{Ë0ðdö´Øÿß-ö¿ œ®ýú']þß}Êo‡Ö”×ÿ×NL Ç4±Kq‘ú:6b)31¬ÔyÆ„!ÖÀÅ" V"îÿ݇‡E#í„júXß¿ö>ý 4&gôñ”âÈ~ú÷ÿ­û˜þ_X]ó£pŸ_&/yöt.£° €‡zˆ°,â¯óð¦ëPÿ§Föc=>ˆµZiàØrÙѪHØpA…ëüο€t>ÎIF¬Éÿ‰d’ ÏI'€’ek°“åOUU;ýöVbeEÇ_Àç̦§çžÐrÀf¿có¤h§ásøÎxÙKù{ÚóËÉŠÚ È«Wósÿr€eÂïC€È^ê å·?ø3ûÞxãX½šy¸7Ãñn~ýŸéâ 2°L»FÈ@À4Ï.Ë^Š„@0)À0€d:øpƒN@Âû¿(èµ¹®»ç}ºžãØ|Ç^gòUæó•+WB×u¹£Lõ“©!ˆÕ~P6ñ|ǯۉíFA¤D2lY–eÅRYÍÎç݈¹\Žǯ,ý1¼õ§ ¤#ÕSq§ °è†¯ä^Z‹ÀbWîièתƒK’dwþªÓó‘ÿ‰øo1€•–OgrbàÚóԚϚsO#CבH°ó\9y-ŠšÅu‚jûʰÙß,û­öçf˜ÿÑþŸÍvðÏEûÿž=EÀGþÿ“g˜îñŒº߸z!þ$ã  d/µIŒwëù_‰ýß }Ð,û?žt[t¾íÿ§Ûþgšfl¢_)ÑS+,Ï||:÷_õèŸó­ÿïM¾‰íÎ6è§ú»x€†ôY–í‰~™vw÷CCCáöáýî¹ØýPߟiý¿’ïàöÙtÞ¿¿9þ7åìµèÿFHýß²¬ØX¯»F‘'¥ß×|ÄÈÄtÎûûûÑ××*¿Ý¨üc€ ëÓ|þÇÏܲ­®íƒ>O´‚€b‹þªªÚïŒÔˆø!B„"Dˆ!B„"Dˆáÿ,¨:lkkà /¼€O|âùëÀ5:ë-ÿâÿŸ½÷o£<ó½¿N ¡9@FvÉËKDJ¢¶Ù²%šqXØ.¤DNJw»ÀÛÈ´d—^…ÈIöÀá@ñÊÇíõöp®Ökm(” ¶‰­,¼ålB‘R~l_ ØN Ù]8`I¦ M‹cK°»¼¡Ž&”¦ü8ɼŒîÑ3£i~ÉÉó¹®\±F£yžgfžß÷÷¾ÂOvÂW®WEg¢$2BDk#)/H’¤DDðì_¼‰5å½ÎîÓ›©Ä=; ñ¿1š»èO@Ç’1D·nõÅøŽ6Hk-àÒýŸ¹®ˆ™Ÿ«¾\ÿo~TA >Ü3ï²Æ…_bÑcÉ5Ò9ÈŒ Œ©‚Ç÷¤}eõ±#€ö•N<  9ÈL Y…L¡XP3Dç}±ÁÇ]o@‚ Ðµ²YÕ™ÁÓO«b6[þØ2™Ò÷}1¾™õÏŠ©¾ül³u ˜'Vïñ;Ùü§ºk¬Ã’$)×^{-ÚÛÛÑÑÑ@õ Îrß}÷¹vÔvú°ºlôëÄ·N ¨‚ëc—~ÿø½;ðçߺ €j|‘Ňxò¹Ý$©ÃÊøçè–"”iÕéaåd0VD_Æ›ðÜhü?hžÿ›ÿäÝœDÑbË ÞëÕï\6‡D¦€Ø2¹|¥í¡s¢‰ Ĉ¾vjüS¯ çm/bh8…Í=ê&¤Ø)!7žõ-â§]Xc\åˆ€ë‡Æ¯ú9ÁEÈj‘Fï3w»3›m˜€`0¨tvvbdDòåÆ(ßëÆü\ÿ¼Öÿä˜?õŸÄÿ€ê`vvV‹ÀcÿSÔa–åË—cjjÊU?l|Þ/½ô’ö¼Y!ÂèËJ¹Y Ž±ý½Œºƒ­õY¬€‰â ,B}#Pca ¡é3ûýÞ½k°w/t°}¦™²ј®‹/ÆRéÌdßÀÒ͇œˆ™ìØ3q!²¬µŠ Ø(°$þ§ïGרì-ÿÓ× hŽŠÅb[ :­ÎêåÃ,ª# î܉ÎÎNÝwf÷žD{µ"˜aUÿå.Ûfä ˆŠ³//»*Øn³¤~FËÈÓiüü.ÖÑYÅe ȃ¯ížw4‘Ñõgd$°NÁRd¤ë¥=¤ö¿«KÿoÞ¬D€|ÈføÀíå³{÷nüüç?×>›:ùeøKýÿô¥ÓÚø¿PÐ7€‹-òì€"n÷ööb>süàÁƒØ¸q#ŒÑõÙß¡ç ||/ú®Y @5þ-<õ°&ÊòJ«ôÿfâŸzãÿb1¬“ç}‚ð çy¸—ñ¿]dYn‹&2 ‰×Í"p]Ö¿Ý{Àrì-ÿXVþÿH% ^#Qæ»U‘„~døããZ†‚ALßäv °|ùrdSuúwI‚,Ëm‰LAI"„,¢ÒnTQuV®º~Ÿý_£’†(‰ÈHzX(æÞ ÙÈ¡C‡tÿ[Á:ðÝ G”FÕögt´bðŠa6²ðZfÖ¬ºüyPðÈ_§µ´Íˆ‹È¥9¥þF–íçÅËóW{çQnÞ­¾—…ØëÒ«—©=fÿ6[—õŠ ÊXwç‰ ðï¹÷5á¿tN•s±Ú}29ÙcïQ *(¥1u=÷™gžA*•B$Ñ".²Ð1?ŒàeYnK  ®Ý瀡õëíŽ\‰(­ö茌`ddï'ßlÝz®oóO 1µ0³SÊãÒ¹Rº‰hQë‡ßO¾…s?ƒB¦ˆžÍ1¢Ü%#6hB²ŽŽª"à®.PO÷ôÓO㪫®Ò9¦r¿Ÿ| ÿ`Aâ\ƒ‚¾Œàiücÿ“Àß 5ªC€A¤<½APr»6鯖ä ÀSåþÔÿ¾·Cî½Ñsc¹Ý¿­ú=µ?~8j 6®½öZ<öØc 9èxúé§‘}àRˆ" J™¹¶Sñ7ý-‚²}ûv­m3®3²yô³ýsRÿèo@¿ftt"ʲ±÷gVÿÙ=@]ýw±Hâ+6¢¹£ðÉX~¯õ_ô–Ç"fm'{ÌëÚ¯qþaF¬Ð Ü àÖ=Èã„N J4rÞaF|1IÆsLsÀ|¶{=Öƒ(‰¬“GЭd¤í0Õ7ƒååˆÏÆçæ;ù¾òá‡Õ±Â³Ïê~—J¥<­9Yí÷g¦ ©ïšþ¬¼Åb±-.BñÅù? ‰ÿÕ!À¨2Z•~_[bƒærëz{jfçÓ:0ä²Y¤ ¤Jcª£—@TÀXRF À¶mÛ€Þ^\?s/^Ïž£9 €¡ãç[ôßVØÿŸ‹ýg3æÂþ§ÖþÿÚµ$ÿ¥üsø|¥þÁç`í«ïáþ¥TåÀM>¬ø¨¬ÿ ûÿÍÜÿ3;ζÇs5ÿ÷2þôsü±ˆW îýH°X÷û ¥·ñzö_œØ™ÿ¨š‡woSû¿­z{ÀÜøßŽíßhYÜÏŽ¿i-Nu–Qÿ:¦»œÿwo“1:ô<ÿ§ýªÁXeŸöóŒŽR)u5@oo/ð­oPÇ]ô䓨¸q£ívИOÖ)û\×ÿÁ˜ IREþlºF裠:¸‡Ãáp8‡Ãáp8‡sª`Û€  +øX²d „òÆF(Ò‰¿âñ8R©”¯âcA”‡+F§K>}Ry±Y¿ù¨FAÈLû+~¦Í?¦›kDàšóÏÇ}âM_œÐþª6xØïÈ €Ñ(Ð V÷L]ÄW%D>[-þ9)Cp}Ÿ˜l\pÎdJš(Ý„'#x¹«bçÊàûÈýg2 :rrû7€ÒƒZ4 J?ÓE(6¦OïÈ”Nxõe”Æ–•ÿžÆõ×_@Ý TGÑDcɘg€Í®Fh#úþb?Û |q¨"þ?‘k+{åöOˆDâ¦âÿŽŽœyæ™8tèg',VNŒ›šñ—OÎ@ÌA9vé—µÏó?ÿøÓ+¾ Úøbá@èO¸~¬ŒU„w´¼!%Œ À(L€¨b\wuÏÊø¿›‰Ê•ËåËå Š¢eP¯‚ Œ±JÜ2lD€\6§ %c!$\Dša©ÕФHDK×(þ/ç£am€&D|£ÃŒ©†·¨âævÿÖ…{#ktý¿‰øŸŽí{¯1NÈÄ 3£|¿Ûƒ¹ÿ5»þS³³³èèèÀÔÔ”Nd›¦‘Îè–—éøA³Ÿ7‹Ð›åmêÖ=È¿zm! øˆjüBNè7ïƒYþÍÒä‘4òy`íÚÅ47¾±+À«GlâB¨Ö¾[.,½°Æ/¼Aå¥ñ‡‘%K–€Äv¬ñ/Ý/e¦ˆs@%"´Q vÛm·affŸûÜç°sçN_Þ¹Zõ õ'Ú^t${#™ IDATõÛƒÑK•!J¾ˆ±iÕ @q™³<ooï÷0óè·´²w–Ÿå‹ÇoB¹íIcQ;0Õ@”ê=EÝ4BsBú? ¢¿¿ßqÛ,‚ÒÕUéûEq1$é0£øH&OGÂãü¯Ô÷oÚ´ ?ÿùÏqå•WPëÁ¡C‡033ã{šlÿo&þïèè€ ˜žžöÅ  ¾ï0ŸW¬X`îÛ <ö‹VÞ/Iú7MŒe4þõãù7»ÿ׉€ñOWW%:àÉ:þ'ŒïŽÎsæ £3râu 0!U¢r­bœýÐñÙÙYМ¸MPûý 6èŒnÍ þ?ÓWD.›CÏæ<€ &›KA”ñ¾ûá+d×p ©í}`Úº…æýƈ¯‰hÑQÚ}²ŒA‡ @}þ+ÂÚEµEËòáC@ÙA+þàé zĹ£aX³“°ñ7 ˜æÌÏÖ)ÍýͰÓ›Ý#ÿ[ÁÅ›9p‹,ËmVsÀ‘£„ø©TJ»æêÕçšžCßÓß[·žëË>ÐÄ÷ÏØÍ˜ãµS×þ+y ûðV߯Š}¥R©²_r×w–J% Æd$Òiˆ¢Z—wïÖ¯ûÆçIœëû€$Užk=cIг8¼Î¨D•5‡u @ãP3¼Ôÿéû'üô›¿1ýÙÚ£WdYnÛ¸q£²k×.\Àß¶m›¶×¨õžÞ@Ý'¤"é4Ö­[‡D 1oACÚ?õ#ÓPÙ›sTÿlïýU§ÏîjõÏà ÑÜè€ÖâNˆüØ$‡’ô7­ýÓºÇÑŸ­<þ©ü¦ÇYØg¸üÞ äz 0oï¹h¦w]¼"ìj6gfÞïå^hÎOÇÆtÏÖãÔñ]ŽÆçæ6ýZ½½ ›—0}¾§ò³b3À¼ŸQëtõ»=v$䋚à/•“Û{‘wk‘{+ñ\¹·ÊëŸçŠ(•JªŒÿsy 1@²=‰AeР¹ Jеe‰h¨êP÷‡©`¡¨ÔJoÛŽþ[‹VØÿŸËýg#ͰÿLöÿËBÿ俨má‚ĹH¸ækI@âUN¼æhýõ?*ÿã;'Åþ¿Óý?*ÿVŸ×©=f÷;ærþï×øÓËø_ 0bþ›GR‡µq9ð“ÎÎN[ó?ÿ‹—|Ø&c«Oö€ÍÿÛ±ý Ô<¬ø!^òq$._€Ì´  Ó]Ì?èþwõ«c1?æÿ쵩\FGÓB/úûûuçоÑSå•WÚ7rC³ë?³Ün 뀜˜ÁÅÿ‡Ãáp8‡Ãáp8œSW9£ø«P(à¿ø…¯«™¾Éæã¡_ÏÓŸtZcÒ~>t5.śؗpÙ›øÂ?4&Úq?ØH]‚"~£1$c! îÙÓ¼1ÿ›EbpŠqóŸÅlŸÎ;R}/(JÛ€U/ý—˜i4 ‚Ýx\;–é‹jQúèZ^¢²Ñ+ÑiÍÐ(68¦s033£†ù)0£™õOåþbåe[_¬E;Ћÿ‰ØéXå³QÒÅ«fggÑÞÞ®‹>ê'¥R©®Ó‚m'’±o›µ03¾øÇïÝáéšvŒÈ鋱ü‰Íˆcïße¬Œÿ‰t:˜,#câÝŸýÝ4Ü XH|iV¯Õh“*¢$}TÚy¿£r˜‰ÿY# ÿ#‚ t½Q‰'žq ÄëÏ`ÿHþï}Hk|­ÿ¡cÃÀªÐÿ"O,ìñëÒ¶`Å~äÈH£ÛƒFÿZ©þ“èŸ]Fú2j$P³}öw³³³X¾|9¦¦¦\½‡­ð¼â@üOüô” ÐV”WÕ1a',ë”þ#¤1<¬Š³ÙÅÈçU!2p~F\·ÃÙl%RŒGá/køKÑ8Yñ?ܰQ`È'•JiÂ/?¡¾‡"Bcl ›6mÒêþÌÌ –.]ê9;õ_ÿAç T*íåSʆênÄ€‚ (²ÄÌAjˆÿ)tâÇeE P6P¬+P%ry —ÏAŒK®ùÚ1-}5Ê…f Tœt‚   X," êæŠ~D3ÿ jÝ#Ó÷oÚ´Iû …´÷Î(þß¾};¶nÝê»r~e!„0;;‹E‹aÙ ~ô÷÷cûÃã—Î>ûlllRûoÄÌøwðñ½>Éœå|A •úý›Íûuü/Ë—@^¬þ’ý]Y4ävþOxÿûE–MA”Dä²9dóylî‰ëÿ^Àà|utŸýzXá_"HdJ:$t\!ÀAPƺÕ6ïßsïkBÿœETÛϽ¯9 £Q”Ò Ïé›E¿³2ˆ'! ÖG6"›WXq¿•ÿœî$Þ,ÿ퇿¿¿¿êšçç~„·Ó mÎÏýoŠ_×åcÏó(¸nñóý³Z «÷³XØî³y`ïÃ[}¿Âù¹¡/]Sî’!Œ:‡È²ÜÖ—”Ò˜Œ\N_Ð:ðîÝ»ñôÓOãÈ‘#ظq#$ÎÕ98§;©¦ïqü[*• 2ó¬lÖü½V¤Êí` ’w?ö‚ú‰Ë¢çß`a¶ðÔÚ³€èù7 QÚé4ɪôǺs•5Å÷^DÏQmmÑÛþôÜEÚcû¨ÂGË#šÃÑ|o×®]hoW'¼ôNÐüS=¢9pµªÚ?3¡×öÏkýc`•=0¢^ýsº÷W+}¿ö©þ'c! Ž•Ôõ¦ÿ«¤_ÒÍöÍÆ{Õ" *ž"ÒH#òÙyX~ï†Æ&X£àï‘ÔaôJþ·µHÀcPÑ¢æl!68†í¼P¬€:_ðÛé·FÁ_>Ÿ¯+ôŠ]ù0ÙjꀫS±61 ´«ÇË¢5¥/#Ø®‚ (Ýt›~GâÝ1Cˆ-“+NÆ5 ]ÿ_ÄsE$`_.Ër[ºPPÒ‰‚æ Š~ Æd„bj„sb0&£oÛ6´¾âì³ÏƇ+V`ãêÕ¾®Ã7sÿŸhÄþ³æÊþ§îþÿWÖtÙ~~ݺuHüq`Æ‚~ÓjëÆòì9iöÿYq¿ÕþŸ±ü\ÿmC@aNæÿfãOÖé.‹ßóoA”‰Øé¸PšÁëÙsð T¡ÿÔaÓó_Ïž£Ù!]_ŒÁŒ?ÎRGFF`gþ—îU…â¹uËÚš š1þwbûèÇßÙq@êr/þÝÛ~t¯ íÑrÝvÀëüƒÒT'Ùq /-¸žÿôeÔçTÊ• iAÛÛ¨ìuÓ9ý½ê¾ ŽVûØÿÏeý''Ùl‡ðåsÈY9‰àp8‡Ãáp8‡ÃápNul9AY·næIœÄ_²,#ŸÏãÐ!Õ38á嘑_ ðAPVø–|ZÑæc6ŸG6Ÿ×6—|ú„ö÷êßÁKE—F^\:—Þ¢šÄ-xþ|¼Ù›ÚñÕóMüàjï^ÀI"JQø†ÝØ—e±Á1…¢ˆ’ˆRÆŸ§FAPŽn‘¡”ךIüŸõ6¿Zÿ“ Žn‘!ìðß h”¼ÍG¢ çt«£œ·Ó dûöí(•JèO¨Î!ÎéNV§ïÖ_ø›“ͦª¾×Že2¿ª‰ËŒÐø³Öor»6AܸÓÓ;`Ùþ”×kýÆkû#ËrÛêÕ«•]O>‰wÞyG›М®½½]{¨¾&c!D-:4»~ä†VhÿtÔ¨ì¨Ì4‡ëÝÞ9ÿ®¤ÿ iúöEI„qÆ8Æc瀦éŸ$D>;ùWO`"”Öö›W}yðKT' ¿K’¤lÈfU‹«¾{={z‡Þ6{_ÿc ƒÊ† ܳ‰h±ì€EÛ’#° Tg4&o”I’”/|á ¦ßår9Vtêë¾ÍÿY'FñýŽáÌ&Ù~ÄsE¿ã8Ð_™ ÆdMœÆ:`äÞÊaà®úNÀXè<ÿ³ŽGÉñ»¾[&£¿m>Zy'CI"Õ’¼"I’òá±Nû¼šÎ¾°ê& Ãñy†}¹7±FT7 ?6EIDlpÌÔ¨—D:™>kƒH¯°âþooÂæG+ÂÿU_fÄ`Ÿ&~zÂäJÞ13 ¢íE Ž©Ñ7Ì~÷󻾆—^šÄêÕ«=Iƒ][ñè5{Ü4}´¯Ä–zÑ„»Eiº®Ù»@ŸûûûèííÅ¡C‡N§+¢.i…úÇæe—,kp$þ={…æû‹CäØ%ËØèÑA’$å›ßü¦fàN‚NŠ6JÇ:::ðî»ïjǼ8e¹-;¢m® VNÆÊÂl? €Xã 6êÂÏ ë /ÖÃ+Æ:O^ÂYoá$b0´ñxß bÿ—-[†t:­ûž6DÍ hóßMA4QO=Ñ KyÖWãÚ$á¿Ø)axûNøO°NüD¥ûÝ$Ä3T‘âævÿVý÷žµçƨæ ûÝ$Ò‚ýÈ+fH’¤¬ÊfqMù󾲸ˆ¢~/#â¯An0Túú~§ Iˆ¬¥ŸW@_ßï0è£Vü¿² „ÿ_T>þHê°/N2öEÝ!5ªwL”DD·nÕ¢FyM“`ï]0T6mÚ„B¡€B¡Pe„Å 7mÚ„;wúrïÍÆüÂhÙ dUüoûbˆT6ü¡q"ÈL“q}Å@¦Š’ú[»í ÷;ËL úçm!®u-¯âªo‘0<\ûoÞLg†$CCNS±—ÞÞ^í½£wmff333Zd +¯¼RsÐÛÛ‹mÛ¶ù`ˆ$)³³³ZÚÔ¦=zT÷G‡ê€ðâ€mÿ©]oFûÏÿ²Q¿†‡¯ÒŒ}û®Y«=åh`þÐ ý?+üq:þ''n"€¶Êø? *}Ñ€.Â*û‡†S"H‘HCÆüÆ|l.ñ €Wñÿ}ÌxœŽ­9¸¿XÄÍEA¬ø?r©„ü z‹ÄÈ¥²e Mú;¾ê¼8 3òfEßF‡ €¾ÿgÛ¿ R>Ÿ×"À£> ºc~;¢nýúõš€D´6²gfZP¹¦a¨hþ¿jÕ*@_F T§<ú´Qûdgÿð‡˜˜˜°&µé€þù“3ö¸ñ€رÑÉ€,ËmêýÏkëƒ~AâÛ\Yü˜3ˆ ‰ÜØÄh´ê|¯"\j×ÉØÚ*Ê-½ÿt>çuìÉ (ºü‚Ĺ–c¤ ¾Tò&°J—Å,]¿iÖû§Ã00"wÉ@:Ëû¶lRv¼Šñ~òWx•ç@í<­  ··²,#•Jø&þ'a¿*¤ûßÈØ›!zþ Uç{u@í ­%ævÿÖô¼áÆÐs#Óþ”ϻ޻€7*€*ò5¢%‰< Áµ9@(6†±dÔsŸÐìöO‡úgœï¶þ¨¹÷¨ãûDæAëô=îÒþ_3œ€Ñú³œ/ƒA¥ØWÔÖÍ(ªNGýLV‰ÿ¯+¯ñõµáõì9xÄøºøb åßú_©TB$Áž={SË700 ;ÇèÌkôc3HüONÉâñ¸˜…q æ¸ü´×p´üùÚk¯PiOV¯^½ÉeÏæLß¿-=˰61­­ øºˆŠøŸæÉvÕåF"“Ð9`Ï''â¹"rwäðôÞ§ë:3R*• –×9iïlDÞòz‡oN˜š½ÿßÌýg 9ö?Æýÿ…kñøÃÇZÆýÿmåýÿk¾¦®Åj뙑\óµŠ œúþ¿qÿÏøüs ‘‘…-¿Ÿûn͚ǟ´ÆoÄ8þ¤ó¼¶û$þ§>þ€¡¯'IÆuñÅÚùtÞD|±g'€:ÿëÞ¦¾Ïé^ÁÆü/¥Ÿ»¤•Æÿµlÿ€rÜÿ>r/þÞô÷žlmÌ? iÝÛ,Ö_]Î?ÄK>@-=û­[·*»víÂ;ï¼£^:@<G0D?¤N5~ÛUÿIüOc*«u‡Êzƒþ<î€Ãáp8‡Ãáp8‡sªSÓ€QüuñÅêØË/¿ A4Aá;EäóÖ¸ùÈFVŽ+çf™è%Ÿýzž/^È%IRÞ{ïN¼ÿyuƒoŸÁûùÐÕÔÍÀ}PÏ!/à ž?G/s¾ (‚bµÐ]‹F?Yñÿæð&ÀÐäNÕ㳕só¯2¢ÿ ™áèÂ{÷ßjóŸ…5ô›ÞÀï…(ŠÈІDDÆ•w<\Ós1¹Ï”S}Ž$©ßEjºÂ‰ gT2 > U*c%vÄŸ1õf[§ïB¦/ŠØàN@ww7¦§§Q(\c·BýcóBâþÏÌ -Ö ÿ Ö €$IRî¼óN´··›Fs&Q9èèèÐÚ¿#GŽxrP*•`%±rúM¨;‚÷5¾p ‹UcŒ+*ç>ù\¥>Ìÿüàø?ÿÒv;Æ?v¡ºÏ¹ÝŒ4ÿ$ˆÉr•Á¿Ó€&Œ°½ùg³ÞS‘H«ßìf¬WŒâ±S½æÆ³êgFľ£R$‚l>O‘‹=¿‹¬øŸ„ÿç‰ ðÓoþF'ü'X'^ ÿ‹ ŠŠö"‹†Ž (;(; ó^¿NæZ6—ã¿V­ÿ$þŸßs¾U;N‘µJ¥RÝëÌÎÎB–ï… Üj;­"*âUÂÿ¹€Äÿ@µð.ùŽ$!ƒ×ñIµ VxN”Ÿ£¢µµe# Öà[EìÝ»·!"0ÿµ£¯xÁNý—“2„„@}JÝkæò€ûF?Ú \i@~¢ ¡…½KÖ˜Šÿ‰°ö èûµk×*ÉîP9ÝŒåó¶s-·Åÿdߓϫuñl¶G\î0º»e¤Óþôý$þ'áÿ’%KðÜsÏé„ÿëÀ+’$)€úÞ›ÿó+ÕgÏ:X¶l¦§§qôèQONšÝþC_úU˜=ÿD™·¬8KÂòIGQÀZµÿ·þÈò%Úÿ‚ðbýë¸ˆÚ ãŠ>HkµÞC62`´½ˆ1øç€‡Äÿjö¹€Þ׿bCÁ bgŒf„꾪ȿR´Îs@Djb^ù;ïȲÜ&‚®»°Çèæ_€Äÿ€NÜc ëhÆ ž#‘‹Å¶PL}‡APX'Z'm‚¾Ñ µ¿ëÖ>Ó|‡æþW]u•&®±šó—ÓÖ•yP”E›NÚ'Ïßm™­ÐÖ彚A­TǾ—]ôÚu«e%1¿jBöxâHYèœÖÿÖÊY€AP¶oß büNï¾Ñ(ÞLl·}ûvÛmw½|ˆ¢ˆç]þÞ˼¿éšåa.Þ?«q? ;*NÈj!Šb¥ÎvÉØ4hW+_¢(âùî'-Ï1®oÚ´ ÝÝÝe™"ˆzf³©*§‡€*º`Åþ’×DtÜ­~n—:ߤqeôü4¡?{<‘ø ü‹ºßZ9 °ƒ  µ?´†Øsc¹Ý¿ÕÖéxúLµýa5ac×ç,8! *ÚZÛÎjëõ©$÷Rÿç²ýkTý3bUÿœîýÉó¾a+=¯{€n÷õéû»`N/±ëŽ€aŸêZäÄOO  q:jÄ(øg_‡òÞd¹Jø±þWË(aæÌKšµ0 þÇEQÔþv[~vïŸ-+‰ÿÙ¾ÈÌ‹Ý5@«±?Ë®úCê<`Æž&hß®þ'BÄÅw]ìÈ !Ër[_F0wV¦ÎÀZaÿ®öŸ­h†ýQ*•4Qû±YýÜÎ2èÃÃê{çÇþ?_ÿkîþ¿ ŠÕó¯ÅGmþe†Ùø“u<]oüiå,À‚ (1µá¦þþº²Óo >BÇËÏ~0óöû‰øbKgNó!Š"ºïy9‹%æFÌÿš1þwbû0v$PuŽqMЮ  ÓùG @ [~É$}·óÿÊØ¿z†ÃíÚµK;Fâr@àµþ5»þ“s#J›ÖèÙÐqÚÎLëkå,€Ãáp8‡Ãáp8‡Ã9•°t@Æ'´H¯ûöíÓ¾ ›F1Ø’%K¨‘+R©”ãHäÁ`PYqXMWõ4ž×-0½²Ÿ³ù<–|Z5X¹l¤à\A›Ä ÷\öfÙów5´ ¸/§z¿¬ðPžý 盀‘H‰´ZÞzÆË2ü&˶"Ç l~u¸’?C4ösþÕJtزhǶÛlñÐX=Ç@  ï…¶yžÙZó·„•!A_FÐNÓ„2Zp³ îô]…BZÔ·´Bý#Œâÿy¢ú:ȵáBém\(U.K^¸`e\õƽK–±Q°ÿje*‹ÿ‰\.‡¥K—jb#tœDB/¿¬FBpëÀÎ&Ç“q ãôA'ÊuC0TŽ]úeÀñþ%žÄƒ`MQ)ƒÙç'Ÿ{ó?ÿ€…ŸOý [ñ ï`ìˆ^Z*•PKcÇû·ã:ïÿ´ñ“e`ï^(d€Tó· •ËLüÕ_áé^°D…­÷¢Í IDAT¬s3Èñ•ß*âŸÊæ+2ŠOŒÎ¨M"E3tÓÅÿç‰ ¨ºÄëςȄf oÅ3.Aî½Ñýni!áªþo`vlï+G}Åâ|r@ö àÎì°/NæRÖ¬ñ_3ë¿,ß c“ùz× ˜ÎJ«õ5>¤¾8&ËPCŽl!ÊÙc£þ;^ï*AHlmŒ·‚¨6Âk‚Á oQíÝ I’Rvä̪×q uP1ð¡ÈÃÊ‘@IƆl{X…´Gr¹ÌÌMé™ûù¼YæúÞ[ÕQ4CN3úX{d­z¬\v£S€Á˜ŒEWÖvüe;`Çý¢(¢|»5BAX‹B¡’!«ÏƒÜ%c‡àLø4ïyÁ`Péê*–Ó: `±® F'ìçlv1DQ5”E ‘p?þ7Šÿ©_9tè–.]ª NèÆå¡P…B½½½Ø¶m›«wØ(. X´h‘&ö7BÇ©ÍP_¤éK§]Ã7³ýƒJ4ª¾Ëj¤¯‡€áŠ‘/ ±Ì>½ù$éß’tº£çßÌþßLdtúÇŽÿIøo5þGûJàÈío'@[aüïÁ wAŽ™øŸÆàƒ†qè®òî>ƒ£.· ÅÕ& r©„ü j(ImÈfD.•´Ï’¤ ÿBãHè¼1Wvà J›_‰¾DaÄBí÷ fâ+Ã_2~ôÑG}Íûî„B!°Nh}ƒ¢P„²@ÅcÛÇŠ(Ú2 ¶Ç}™\U;V/m¯B ;Ï¿ã5Úkås&cFfZÐõW^û VÀO¢ÿÄ‘„NèÏBiçr9DÓå|¤Ýß{VèFï~- ›¾µj»D" ý§Úçzwô2æ\/Ï Yéó0—ï_½µÕé_Éò™ ‚ ˜ÝY–Û„QAé+wòNØ}Æuà®®.m ìf¸²o’ ö±ì;˜ßg2ŒAçÀ-¬ ŒÆ–ªØ§éùlÞÄtÎN×õuJŽE[SiδN?šÕUíO0TB¡AÀèè(€Šó½R©T5~4Îoõ°퟽·²°¤êºfå×}?* ^ý³Ÿþƒ¶Ò÷cP?°ÖøýüÝbåˆ(xÞ²‚öšÛŠq`ÜèjÓí3²¼ž=׍ü[ÿ³rJß;u éI’”/|á ÚçxP¿Ï|àËü?}{Äüžú=ÿkÆøßŽí`íM%}ÛeÚg§6€vÆÿõÒŸþñZÓôÝÌÿk={r Ë¿(búÇú´½ÐÔõ?&]z.™iA'ôgaß?šge¦½¯¿q8‡Ãáp8‡Ãáp8e,êfìºuë¨÷d` ÀtQ™D`Fq˜æ:väô¥ÓÎÆêßQÓÿõ‹Åª¢†ÚÁ©¤³³K–,ñäôÁŒ÷Ÿz ¾¤nîÿç_jF€>âAFFã üË7ðß»£f4cýÇãÚF$Ùµ VmÀ ‚ ˜ `È@µ–÷o#VÆÿÝ¡”|^ÛôÏ‚ÎøÆˆQ˜Ò'ËXõÃÖŒb[²õžDØ‚ (}œ¥ìí]ûÝöíÛÑß߯‹|éFŒ“™´H Ù|^W·Í¢jFHçc’ˆ¡á2ÓÎÚ€`0¨t½¡næÞ{Ø}‰^ä_ŽÈeö9·û·ÏP#µŠÿ{ŸjÀkÖèï"¨E_yÏZüO¼UøOÜsbûl§jM3as=þk…ú¯¿î­@úVÕõ¿T*Õ¬ÿSSSºÏ(ÿ»jDe#xY« …„y! `ŠPë/Ý+?Ó_»–Mÿ-ÕdòtÝy”¾[¨xÀÙ,”ÇdÜK½­ÖëN.xÿQP*•°}ûv­.är9Í蔞õ¦M›°uëV ¡JýHn1ä½½½¦ù·‹•ñ¯±ìtÜPöªw̉ã/Â8ðš'†?­ö¼ÓiÝÝåH¹Ãš¨PEþFÈ €Ñ9ÀÞ½ÀÐN;ïû7mR#Ò˜š³âãç™™M0SŽþd7Yzñÿ¢E‹ÐÑÑ£GZŠÿ‰£GjÂÿLœÿ[¢ýÏdŠˆÅÔI6ûIͨ€i„U26çvƒï­ Ìmÿ¹\NY·n–,Yâ©ÿ·rþaìÿáÅšý¿p¢<7*wSv"€6büo<¯‘Ñ1ÉP0Xu̬_ßX~>ì="ãX§if³Ù¶Í(·©öÖµ!ucNûPä_Èb(lN©k`’$)Ʊ`=ìôD£ûZO`×Ìî;µ¯Æûî%m³û‰D°~ýz-š›ã½psÒé´ÎÈ@Õ30ض×è{@ÀÕó§2û1æfÛZ÷4»&µƒ¹\N['õÚ颫Dÿf,êÿ"‘"‘ˆéXÌ.²,·‘Ó:³ïŒÇüNŸÅ¬¨…_ã€f¥k•‡F¿vÖþ:d¹?AXÝ·ï‚Óçàç:°Ù܇ò`%‚d$zAûzÑÿ\ÔÖa(ÛÌeý/ ( '<@íw€}÷oõ°Ö>W#î¿ú8+?ÛW×ËK#Ò÷»þ{Iß+™iääÈ(DòÓù’_øáx ¨vx]|1^7™Ãí‘$ìa·v¤ =¯ÿ±X9„$åÒX~+a׳Ï>[%øwZþZu¤ ¬Å_§\NÐgöþ±ß;Y4ûVŽGèº}™rÄ\03øðký{.µÂþ¿ßûÏï?U½neF³íAPžï~RçX«]Ê‹øŸÿílŒ~Æyb´ÒúÙPœÌûÿÆ2©\ w>êó/#s=þ4^y®ƒŒÝP«Ïÿýšÿ™ÝÿZŽï¼–ߎí_#çß­8ÿ¯÷ìÙkZµ^hfýg¹ŸK£ë?‡Ãáp8‡Ãáp8‡s²ð1 ÚðXͰÒ(+:c@PqöÙgÞyçmóæèÑ£5½ÐÖJ߸ Éò•ëõÞڢáá”éïœ@^¼ñBçãÒ[TïÞûjì%={“°(_[4èïÁÀÀý¢o-1 geømׂÝÌ¢ûotÀ²êËúûº9¼IÿùÑaíwKë¤m¶X º=ö˜î¸ÕuÜÞ‹f§ouí¹xZµþÑû¸Q´È~R‡5Q?ÓHäÀè™EœE#yùå—µ¿C¡æi¸–¨Ÿ"ÍÎÎâ–[n±•–ÎÎNÍ“¶û0Xþü[wé>K8M÷ùÎç†MgD–å6;å7Ë¿,Ëmããã û»ò»HŽ€±~í\«<˜u—Ed@Åã¿ñAÐÎ-•Ló8( úÍó`öLõžøX ZÇÇÇÑÙÙ©õ»6lÐ6îèúì=®åÉœMÇè€esO\÷YìÔG½Þ>dú;;P>Òg&Ðýn€ê€Dýtδ<”ÀIý/,ìAÀBÆ-g¨Ç÷Õˆ0zѱaíï}¾ãC$ @ à« Œ}öfýÉ\Žÿ€Ö¨ÿ‚pkÕ1¿êÿÔÔ”B×·ÊC+ í0D6·0„IÆÔû08VªúÎêwV°e-•JHh°‚eúÈžoš¾Œb@uð`4À ²@"S¨kÙ-»±Ü]×Ì%•JaݺuÚ3ߺu+J¥€­¶ÞnØè+V÷þ3?àîÞ[]Ó¬ìt_MÊ® ‹Åb›Sfå¡ÙÏ»Öøßè€eófýuŒ6?ÃË˿»¦Üþ×6ž2æP£þc‰B¡ ‰ú˜:㢱·Ñ9á4!+æÇÊJÎZãÿéK‹¥YÔu@4«ý¯Õÿ€h†ÀFCßЗ¾¦û<<|•îwµðÒÿ•ñí¡C‡\÷ÿfF€~õÿµ"€6rüo4­×F°ù`ÏÍæó:`z½‚6?"H‘²ù<¢íEŒ ºvdl@ßÇV_ÓN?\/MöóÔÔŒ×3öûË—/lNé‹Gºf½¶ÇI?@4¢?ðó¾›µUNÓ7»ýýýä@Ë£Ù½prÌÊT«ïg1ÐÀn™éoVüoLÛFºôO©WfÂκ#{M#ô j­?Ò9fõÀ˜þöíÛuk®lûg•‡ZiÛ]weÛVš÷²é[¥í5}6„Óg`'Vy©·ÿàGºµhæûGõÞ*ì{بû_+}7Ï¡Ö:°“~ßM:;;µ¿Ù6³–s^ÿí½ããã–÷Ÿ½GVù°Ê‹Ýòîî-œÔ?'åg©5hTú¨ÿLß —±y-•J5¹…M£­LO@Ø!@NÊP‚ÕN鉶XÖoV­ÿMMù¶þgÄÌ¥Ýûï—Ã7÷Óÿ\ÿ4–ÍÌ—ß寵öWÏùá§0;yñë´Úþ¿qÿ±ûÏv×çÊþ¨~}Ÿ_€ÿŠ'ù7ï ‡°åœz—à/ÿæE/B|Rµ‰ü³Ð)±þ÷Qßÿ'š¹ÿÇçÿ­;þŸ‹ùŸÙœÏdÜÛù³çßÍN¿VÚs±öãGúvê¿“ôçºþs8‡Ãáp8‡Ãáp8'#º…Ͼh‰L¡ö/ÊtwwcÑ¢EÚçH$¢[°3222RwãÃIú«?|Gç‘|sOý·ÿ½åù/vvÍͳM°ŽŽpÖ«÷ó¡«gœñªëlZ¥†$U¹%5Q×>›¶1Ú-|ZRÐfyþ%Œ†ßv6@œkÝ"ëŒ/†þ¯lùþ°åùK "“éÃðp£££¶Áçú^œªé·BýÌ «YvYlØqHÙy¢þ23CªiUæ$c! ŽUoÒZÕVpd„¢’²¸©ÿµ Ô¦Ž×5¦ uŸ=K-°¶`Á—nÐEdøÎ=ø¿¿W-¢%Þê!KC›f—ß AÖ ]¨ˆ?Œïªñ<»‘ ³zoçy˜Ä ¶ün"dƖɺh=[7£'¾ÙòüÌ´¹p×nÈ €‘ž£ºÏç‰ tŸúÍß[ã¸þo(‡l-,ìÑŽ‡Êÿ=&Â~7õߊZ›ò~Ôº”Û?×»¶Ÿã¿S½þ·Jù"$PÞú¢êÿtÌ©q¯SƒÈ*ƒ8é[Õ{#VmÑ¸Õ n `Ý`|Ÿœ@øuï@Ýq¿Uº­Pö¹ÈC³Ëìnþ/C+ޏzzW9`I§½õýäÀÈ•W^©ûltJóÜsÏP#T×j¬ú‚u_iíÌè£8þwÓÿ'“§ë>÷ô<žžMg«†Ä¼ÿ7§‘ãÿZXÕc¿O°}€UútPí¦í0å«T*Ù¸™õÇvÒö«¼€?ý×|°yhÄÀŽÈÌé}hÖ3`DxMÛK™çëŽÆt­Ú`«:ȦOmO<÷5mÀÞº+¥3—éó4î˜åÅËþƒ“t­Ú€¹|ÿ¬Dqͼÿ­’¾±ß÷+F'¤Æ<ðúß:õ¿‘å¯5hDùGFF0“‘«V‰·býkfúVya=öØcšCc].•JX·n&:#GDlŸ_/]%c¡ªùG½¹‡våÔé¨Ùñf®ÿy¹ÿFìÌyÇÆ’ÎéİsQ~³=H»e`Y~7â/Öù›v=Œy0ÒŠï@+ìÿ»™w»ÙÌçâÍ´ÿ1[ÿêûÕçûS5ˆÁhÛ%¶Úþ.åEüÏÿv¶vìÜÁÏXžÏ×ÿZcý¯Ùåçó>þŸ‹tçzüÿQŸÊe7¦ßŒúÏáp8‡Ãáp8‡Ãᜬ˜ ­Œí›-Ö9ÿÎuúf›» è7ýÌ¢vtth›€°sBª:ÏŽøÐH=Ñw=œŸqÿí¥Ú¹V×w’?»üS)ýf×cì²K–±2^"-Ý|OYÜÞ(T¢²ù©WÿY'¬è¿Qõ¿㽟Ëw ÊO¸€#£K-#ÀZÄï/†oÍØ¥ûÝ$Ä3.Ñ>ùûŸÀÿÏOšž›>S !î¨þ“@/ú÷«þ™«úPϪYã¯S­þ·Jùk•Ý‹0ÉK$$/Â(£±V P?"«—ço'/vñ£Ü^ñ#ÆwÛ‰øÒ1›;4+Í~ÞÍÿ»©w½½½º±ùW\|ÐôÜmÛ¶Yæ¥^ÿoÅÉ4þçý¿ÊÉ4þ¯•žlù­Œí`lC¼D¿4»ždYn£•^œùA#û»iØÁÏ|ƒAʼn¿Ów‚™#Ô¹‡Øé‡½¦aÄëº#Q¯ýeo6ÿf¿·y¹M›°ýz.ÓgóPFäÃËþƒÓtݦïG¬Þ¿¹Ìáf¨‘雵;s•‡f׿f§Ïæ¡'cý·›§ù`~4#ýZ´ZúVyp24;×X§ê­ÿ1'"sÖÑàÍñX3×ÿqÿ´òúg='äNû%öüfÎùXœ:Aææhµõ¿FÙ ˜[Íþç­¾_iÿåß¼cKüðõ¿êú_³ËßìùW³ÇßÍNŸÍC=øøÿäŸÊegÓofýãp8‡Ãáp8‡ÃápNFm€8ÙrcˆXoó¥Qé×[eEf›~NηãØj±“-S­{åÕØÚŠF?–fß‹S1ýVxþÍ0Dh…úß(á—†F½.?QO€Óh¼ጿµ:·Qí?0·c€S©þ›åÇÊ€µ‘‚°fÿNõú?å·ûLìÞ‹zí‘_Bt«<Õùát õ’~ ³í¤ëç=·“³ï½æÁNØè²7+Í~Þ­2ÿo¦*#§ÊøŸÍ‡¼ÿo\úõòàäwÍèìžÓ¬ô͸M×꺵ðâˆÁêÍêœæÃ‰ F¤ï³ˆpV×oÖ;ߨt¬;Öʧ›<ù¶S\³ÓoT>œFmfù›ùþµJš¾—ëZOïB+׿f§ïäÚ~ß{ uÊßì÷ÿTMß®Èóv»ï½Ÿó°F×÷ký¯î?ÐÜõO;÷À€Í‰Ó±ZØÝw·úM=šù4{ÿßïýG¿œ¿œ ë,n× øú_ãÓoöþŸÿŸºãßS½ü­>/{óß?‡Ãáp8‡Ãáp8çdÁÓ† Ë\ •¯åm”V3hÆýç´Í~þ~lÈúatoçúN GœæÁé¦u£„‡v˜ ñŸ“ßù-zµºn½ßÔÚÆf=¯é{É‹ÛþßÏúoçšNÆs!„öšŽÝ4O…úï´'Ó˜“Ãá´Íšÿ7£ïwšn£æÿ­2þ¯uýf¥y*ôÿ‡Ãáp8‡Ãáp8sÅGuÿ¿™û]Zÿs“ž“4æ¥iÙIóTXÿãû‡Ãáp8‡Ãáp8‡Ãáp¼Â78‡Ãáp8‡Ãáp8‡ÓpÂá°“““¾®K‡Ãaerr’þöýú­Žß÷•®Gœj÷“Ãápü¤Q}ßG ~G«ßÛVχÃáp8‡Ãáp8‡Ãáp8‡Ãáp8­ÊǼü8 j†€ÅbqN7ížOoÇl¹ÌÊÔÌ{ÞJ°÷89î•ÉnYØ{P*•Nš:`‡V¨ÍjƒZ¡ìFæº>Ó›‹4­Ò÷;]Az—$IR²Ù¬åõíæC%Ô=ÏøÀ~ôS©ý±C½¾Ü 'cÿç„F•ßÏgÆÖ]¶N»¡Ym~­ö‡ÿÝ •z÷ËI`»ïu«Ì?êõ=­Òÿ6ó=´“¶Ó9E«ãå¹»¹Ínÿj¥/I’–~½öÁ6„0‹:ÕŒö·Öü·‘c/cÚÄ\Ô±V÷ï=И€­<÷°[ÿíô÷^ÒnFúÆ<ÔZª—> ¿.¿|!V‹ÿŽ»î +~ŠÕ÷œÄ†p0ñú$Vù 4k¤¾ì° Íø·ÛkÝq›Œ—rç¨äÙí5Ãá°ràvÕ™Âüàø0°ònë<:Ƀ@ør?9œ"§º¸¶•Ëïw=û?ÀŸþÔé€ÍG½óýnû펜övû*§e7¾c^Æìg¿Ê݈ñ_£ðûýçp8‡Ãáp8‡Ãáp8‡Ãáp8Ç 5Ô2 ƒJ!Ó®}ÅÐ#S«<í’eíØ+= ¬ZA”±d ¹lÙ|™i}™ŒF¿wÔzîN ¯e„ •©¾À¼'†Û°|°1F΀7ñ„Ý{ •L¦ÃÃ9ŒŽŽÖ-K0Tžyæíóúõë %ë€ßèsUjq ¼a8æUäÉ^¨/Àc?{){=±E=æ²>Ry´cýýýMÿ³Ÿ½äsÅE’ò ý ¦í“>8ÀIû"‚²}ûväóy¤R©ª÷ú"@ùÇØéºß¬Ê4¦ö*^óSüfA”Ø2R$QMd|»7fâ³F‰|Z‘`0¨Üÿý€+VààÁƒ¸ùæ›=—¿Þø‹MŸþ¶>I’¤PÝôu¨/Ø4¦Ù# yÖl=¡öh"2 UõÇdü1§ãÿîîníØôô4r¹\KŽ}XÌê-‹›>¨?&·ÛµÒü£VßÓˆwÏͽA)•dݱ@`næ¡vú_§sŠVÇËûgç^4»ýs’¾$IÊ¢E‹Lk<¦þÿ#HÒ×=ƒ¨EQ;vôèQLMMù6÷±K­ù¯×±—ç#‰h›‡Ãê)Pkà¥ëÇ<Ë®¸Þiù£ ÿæ¿­2÷°ÂnýƒJWW—¯í¯“ño#Ò§ë枀ÉúS½ô7mºXY-þ; Òy€ pùåÇø'[xÓ'°çï'±aEÿñŸöe§®Ò‡ÃÊmkbËLJ kˆàí^“þîo=Âê¼þ6»v= ‰ê"g!Ò ¬Õ± ‰æ—ÊMVÿ¿mÍAÜcr½p8¬¬+·ËµD‚ô· {@Ïh®î|€Ó >Šs+œˆžÙßø]~¿ÀNÛh»å7kküjÂá°²ëöI¬*žßìØÒVÕØÍ«Û1@8V–/_β,³úÿc‡¯õí¸Uí çmNìVÞë½tÒ÷ÿøÇ?Ö>õ«_­y}³wÌÐÞÏr³çÞq›lëÙÏ•#Zïn8VìšÄ¼HNìPMÌW<9‡Ãáp8‡Ãáp8‡Ãáp8‡ÃqË<«/È7W LŒÆŸPÈ´›F†óA”]²Œ]²ŒWíôÉrÃÓ÷B0Tê €°âÓïK¥Þêû•î³ëÚ…}îŠñ;³ók]o0&×úºf>Ì®MÆç '¢E_î+’$I‘$I™ˆŒëŽÛ…„ÉXcɘå½"qJ"‘FOˆ®®®še1ŸÀ3Ï<ŠðÝJ¸Ÿï( ¾÷…'Öé>û‹ñÙ½!¨õóYƲŒ±dÌ—û_«þ~—= »»ÛUûÙèúhLk``@'þo¥R }O¼¥ûì¶¼’$)©Ùˆ*6°úLõxüPDûÛˆ“>ØiûBäóyËïèý'ò‡}yÿýjéüŠøÍyûí•Ì´€l>\6çûµ=h6µúÿM›6iŸTQ{{{})½ñõ½ô/X¶›«Ï„iNÍF,ßÇH¤ºÍ׋ÿÕÏ~?k¶žQ™ˆŒcU¾³ÊYÕø£ÑïŸ Jww7º»»1==­ýTQj­ñ•×tÙn®Q¯ïrÓPÞì³Û5{þAXõ=x÷ÜÜ{VüŸÏWþ•Js35ö¿³ÒÕºþ×mŸèßwsí7c_;÷¢ÙퟓôIüôèQíߢE‹ªÆNì¸g~ÏJí¸Û¹¬(ŠEQ—.D8 ÇÎü×íØ«Þü‹æ;qI¯óX…6dú¼÷Ë^÷ >Ôj¬^¯ü‚ X–,é_Û׌¹‡‘ZÏÂIý_²d‰¯i;ÿú™>åÁlîiõ j¥¿ÿ1¼”;‘Î 0¾ã8ÆwÇ–-ómå1+ôÏêœÉÉɶ/íoÇ›>×n? ˤ%Øsp oú„kÁæmk"©$¹ À®Û'ME¡v¯ù“߯Aÿ{ë¢ò>UH›ýæ´ƒ“ V÷aË–ùÚ}t^€—rçaÿþc®tñˆ‚•w‡uÿîÙ·ÂòzK.¼°æõ.¿|!î¸MÆ·Éزe>"àòËÚº—ápXùõ®³@ÿ¬~³ð¦O`ÏÁIP@@uáæyÑ}>pû$èßS—©{-Dº}G¼P¯Ž´:^óþQ/¿*âß °eË|­®Ù­c­„1¿vžk#ÊO}Àk¿®´^Ú»m´Ýò‡Ãaer½>?ápX9óÁƒ¾Ô%šøŸˆGܶ¦r}êŸÖ­_¿ø›šéºøjjJû·|ùòª2«¢ÿ°nd÷½©uYG8$ÏÄ) IDATgËÏráÔLÇMßÏŠÿàÇ?þqÍ{löŽ9ÅÏr³×¤úÉ>{³úi|¶j¿Âá°2ð½¬[¿§MU×£»&— óŸãmžÚ‡Ãáp8‡Ãáp8‡Ãáp8‡Ãáp¼ð±Z_Ö2€žÍ9 ©Ñàr¹ dÙà»$þ*¢HdÕô“’ÿ";¿p‰‘Ä7fÑ7ßO¾…ó²€èOðñþÀ;ç·ÞsKªá¾rÙ™‚ïé³à~¶m›ò  »_q© Ë—VýÎŒq²Ùa~ÏJS†]ÔgYû~ºåÛßþ6¾ûÝïîy¶!iøt+¨”ö_‡Ü 'é‹"—ÍapÌ·$t˜E¶ ƒJ©TB2‚(‰¾ |k‰ß€Æ”ÝË3jT}d!ÑE.§Þëþþþ†¤c'Üÿ>r/þ]ýEdÇŒ]_3›Í¶Å%()D€C,¸°)xÿÌqÄ;ò5ÛžFõÁ²,·¥R)µ¬±™‚V‚Á òóèï0?¬¿¹'Ž1/¢_í/ñ(~æ+N¼DÁµ E¢ÍL "þ]w.ÇÍ¢^ÿñÅãæ›«ËëW;`6þ¬…_ëׯ¯ªslþe3ÐÄ•XÔéHÊÚµ½(ª£ÞúE­¨ÙLJ`¢gÿч>Dê*õȘç¹p€&ú€!u6°©p‘éï¼FÀµØûý|¼ô@í1¹Ó¶¨ÙóZ}áç»çåÞçó€’WDRžòbêGp¾6þëÿÌ‚ (cÉë—wÝ,B½æbÜßìöÏNú¬øvv!®Œ@tZw½ù=+‘þ$éëÚ1SIè´ý›•?òÕ6¼ûL¥ùàAä¬ ì4c&ì*·õƒñˆ‚{öUŸÿìs&Ô¼‡»cVüO^>[þf+žšÕ݇ù=+19üÂák™ôÃüž•–m À÷íÏþÝ}¦÷7þ9`å½+,Êb/}?;þ¼wh¼nZ~Œü*·þwÕÏÞj pÙe—áÒÛÁ÷7Ôw.à…}ûkŒiÊâr€`ª‹Õv—Ãáp8‡Ãáp8‡Ãáp8‡Ãáp8­‹¥;" @5üÌe#¥FfSÍÏÆ²§¯,¶JdE µ¶Ã}6ú`2© ˜ìˆ‘¬Dç~'Ì‹þ¿û]cÄ7?Û¶My7D_<‚ûSyå „PcÉ¢‰ Æ’±†ˆÿ‰zFøé‹jÇ|2w"aÅafÏ«Q"P–{žÅ±Ù½XرÖ×ëRÙÌÊeÅÕ…B!_ó¡«G¨ïÀàXÉ÷롟ñÿRIŸž(ù%¿²®ì9~—½X,¶íܹSéííŶmÛ\ ¾ü¬Á`Pk#Yñ? ÿçRôoÆàÕçºú‹(yÿ$B|¨}3Žõ¼¤Šú$S‰©º‚ÓFõÁ”f"SPh °nÝ:ŒŒŒ8€*¾ñ¿Ú_¿ÄoVØi©Í𒎘á´Ý¯[¿Í°Óÿ_ñÅ>­ï{îgƒn³bJ­²Ù~ ‚ LMMáÞ¯Åqlv ;Öâ¯Ñ‰Ú†,Åù<Ú …”b5ÞÎmîÁp6‹IBhpÔq™( =ô÷÷ëî¿*.ýº’þâ¿\é¤~ñËÿ…îÇñ᤯WÕ›F?ŒÈ²Ü–N§ 1*‰ÿò‡ó€õüq@Ôh§W€ó>€Ù“;m‹š5ÿ0¦oì{ÆÇ+†î~¾{Nî½ J©$kâ:7—ÍAìñœ•º¨ãÏÓµÏ~Ž?°âO×!Ñ¿$Iʹ,nôèhܸ¿ÙíŸÝôÙß2íºõ@  9¢Éf³m:•‰žq¬ºõy¬*£Ü8T’e¹-—Ë)°|ùrñÿÐCÿê¥Øž±ºÿnÇ^væ_L…øS}3N“«¢‘ë‚ (½½½Ø¹s§åü©ÙågóÌíÜÈga§þ;àÛMûŠ/öi×ÿ6*}ÀÞܳVúápwÜ&PÅÜʸëz¡¦HŠÄÿï~»n¿÷XˆÙVÄw(Ô¬H°ï` +ïÖK)D‘N!!àãgöâw=/!›Wqw×þÝÍ7] IêD6[-œœœl»þú°rÇmO`UÛÕ€;n“q×=~ˆ‹S˜¿:¯~õ«8pû$VZ_CÁúkû÷sì‚ØÜ“ÃÐ0ë„Bÿ\Âá°rÛå 1Š…Í– ”@8¹µÄÿ­J%ºòYˆt«Eul@bøV"†Ãa…Äþ@E¨»lß§\‰&­Ë±²sçËsVv§b~-‚{ùùá  N@æϾqû/p^öWøý‡ÿ¯»5'õX*©Î^^ÆOå‡ÃJ<¢¶~8€±ÛFSù_ˬAö»n¿Bu|³ÿXUþ&×O"‚6|jüLíøO¦ üL¸rŽ‡ç¿ ÕýPéÃá°rÚÁIÜ|ÓŸç™gpÚÁI`…µërÒád @ªB8VHüÿÒ?}rëoûÅ­tS†Z<ûw÷áÃåaÜvãŸÿ—«êŒ™„·´¼^8VÖ­_ƒY‡Ãáp8‡Ãáp8‡Ãáp8‡Ãápü`^­/eYn“e¹-‘)  QN…°RDU5‹RÅ`"õ5‚*AT.Qk ™ŸF A¶ oõý óÊÑ7çE‚ÿôŸî·<×-¯mÅb±mp¬„›ã‘ª{Hb¨±d @~¥K”бgÏÜà"ÀâÚ)|ø‡7"68†©¾ÏϺ,ÂÀñá¸ñÖ!ýà ýàÿå LDÆ¡F•V£H ‚ LÄNÇlò(f“GM#ÅRY¼äÉŒR©„Õ«WkŸYãsA¯¢SŠÇ«î½Ù³¨—ÞÙgŸí%;Zl:…'ÖiQ@3}QôEÚy~½‹Fñ?`VþÊ;è—(ݬþÍEÙ½;jð§>ƒA¥)" *$þ_¿~=úûûQ,Ûš!þ7¾}O¼…®þ"F‚èê/"ÐUÔÎóëý‹&28pà€éwµú`¿¡1€(Šøîw¿‹§Ÿ~«2”ÓvþþÓs5wÚþîM.Ciÿu(í¿N×e³Ù¶³ÒUìö£çqã­jâ§â73Ü´^1¶Vã¿ûbº¦ÚÞ íß¼o¸*³Õ³g±ßÿCÿßÿýs:Ö¸çY|ûÛß®yÎä«xüá„£ë²ãm*w¡  qÅ¡a åò‡¼YžS;j _ÿ`×@è‡B!|E¾N7Žr;þ1¾Cý+î¹ç¥ôN­ù¯˜Í¿¬Æ-¬Ÿ¨u~-æbÝÃÎÏnù©ýgû@ àºüf°ízmrRnÈÜÃ,ÝT*…T*¥­}ÒwNß?§ëNÆ¿Çf÷Öÿú¾Ó¹§ôwì8® ÿî±'ü*â»]·_¡ $‰ñU÷BBò˜ÎÂÄë“U¿q ›~#Øx÷s8°Ë^>+_=“““mwÝ#`By;ÊQÀ=!ªBÏá!àÅÞèýz@Ù„Ê„ò®¿Þ™8?—Ëah¨ºl$þÔûCÿÜ099Ù¶òî°©ð5™û­kØq†à7ý}|ÇqD:/ÀK¹óZZ~|ø¦×¼†é5¯!þê Üø_>Äääc‡ÃббZõêüs ?íÔa¶,‘¯¶iÇ&×»o«Tñïo1¡<¡»ã6ÙsÛ×,.¸ûs˜¿ÿ«`KüOå@Y¬ó£üÔ°ÿV¹¼–“6úS±}èüG[?Yµo#þÿj>ùÙUø·W'ð¥ožÀO–Ç—¿Á™Ä™„›÷ɬžíºý ÜvùBí–›oºXsÌóኰ­öÆÍàos³èÙGD¼=›+ë@”ßåË—cý›ŠÈV#òƒÕˆ¿ºÂ–C‘gÿî>Œ<ó n¾ñbœ6Uë~¥0õV<ùÖ'qàÖƒ¾Õ«Óoù¾ùØk¶®WKüOø>ðöOà…g¿oYî /¸ÀÑõØçoÕG}Ãø§{U<ÇöUZ¸*€“““m.WßÙ{öÃÍ7^lšÎ$^ßÜúLâ5,\Sqe¬+ápXÙ´i ÓÓ~f“Ãáp8‡Ãáp8‡Ãáp8‡Ãáp8š2Â=ºEÆÔ­{zò¢•ÍìÿðăèêêjXF3‘] ¹lÎòü`0¨tuu5DF¢8?×V×ß³§€½{Kس§"::wð3€ß_úâã/ü‡…“=ׯü”J%$2ô=ñ–îx4‘Ñî{©TBrÿûè{â-_EVFè0OT0Õ7ƒ¡aà_øÏºßy5<·aœ•@þÙl¶ÄÿJo£#±‰EÜ‹@‹Åb[,6ˆd²ÃÃ9ŒŽŽš´SÙŒ/2ï{©Ky}VàÞœGmoo÷’‚ Ý"C–d—©BkŠJ‘W)èöíÛ100à‹#@I’½ï@ƒc%ăÚ;è—è`ë_rÿûÚq«²S=t“‡b±ØÖßßíÛ·Ûzw]såfÄÿFá£Û_–ŠøùíØàÕçêÎ)¸ÿ¬Dq‡ÂÓO?­{&‚ (ëÖ­ÓõÁâMCˆ&”J¥ªçg·}±" *ƒ1!y/fggqäÈìÚµ Ù|^÷Ìí”™úd+ì¶¿{“˹TBàòG¸ü-}öZ7=0ì‹øÍˆ›6Ð-tO°}ûví¸Õ8Àïöþ£ýåÊ?À±B“ºµúÿöövÜÿÿ³÷îñQÕwþÿs¬—/Ì€Ú®Uar ¬VÉLpÕJRIˆÖºÕm‚ß­«›pqi-¡lÆøÝýîvm˜”%¬-rYi»@®½xá2Ô„®u%3¨‹2 Qäa˜"J½œßŸù|æœ3÷Ih÷÷xœ×ãÁ#çœ9ç|>çœÏí>Ï×{õjNÛÁéc;RÒ8[F¹ŒwŒËÙ!Ž„ÎN¹Øx<îmzºû‹¹ ͺ BÏ$¯×«ï.OFýþŽì¾ï&€¬õFŽ?ä9ÎV{l=ï‚ù,˜ß˜õFn©€ýhBŽR™ÊőгC)e̸uL>&P«£QzâqVG£j{¦vǸïh>·Û­Ïš5ËÔ÷%ËÞH¯9Ÿþ7ü †Ô½Ÿ9óì÷ “&MâÖÀ…¦þ·zœù¾´Ï‡Üð®1ØÅ —óD(À;)œ'BAú_ ælN§¾uëVvíÚÅVCÔ¼Lc_ã¾ÅŽþØí_áéw™ÊžÝ5¸Kò{WÉþ´–r€ó¼Þ=)ûX¡Ô‘@XóÕ:J[è¨ <ýß(£ñÁhÂÿÆ:9¦ˆv·0€üÖ‡&h÷`Õ~e Ó®lZBÕá*ªWe}–£}ý…^÷„«¯ÎëœÎ6*òOePl^Îüû‡Pºëz³i/ÏØÈgþûÏØÈùç·gÜWJ^ÿúåE_ºsËôùûzþ4mtÚkÚß[ÅÀŸÜC08ÀÀŸÜ“’¦¶UãÔý":yÇ+ ÄDûtêþ2NÝ_†¶µ°¾OÓ4}ÿë¾\™áÜë­ P}ÁòÖå,o]®Öåµxíyç-Ùþ']$ø_ùÖ 8bþ’íeÀÕqÓuö=4Hg|¼k w|î­Œç.)Ínü’./¿èë&¨H徚£ïO‚øÒ0 [[ðqÂ¥Ðûl½îwßüyŽ#à7ßÌëÜòùïÜyšCWÈmi¯eéæ7¹å¡£üú±K¹å¡£ ¼Í~HæIþ]µó4=‘Už¤þú¡ñüú±Kùë‡Æ›¶·~¯•Öﵪ<µ~¯•¾¾>8ð¿ÖxÇ–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lýÿ[yÈI¸ ÛÅzø­Oˆwš'á644°}ûöQŸ„-åt:õžxœúxœkÛä¤ÓæMC\ Ô—ÆS&ªO˜0aÔóò‡ˆ|Ùì6êêJmRy›8’‘ׂÁ0uu% P2îW̤—ËE}iÿ×>Çì"JSus/mõ%j ôÒûø¿ö95IºÐt²INB–“Êëêê(©Ï=pÜ­Iþ‰@ròy±ùHa´üË•@f FÂaÅ‚féòjÝæv»õC÷D9tO”¨OY>úhÚóÅÛâ”?W^²m ƒŽúÝWsqÃå 4êLô^Å¡ 7\Nå5Þ¬@½ÛíÖÛêK¨­­% qìØ1e“iì{ìØ1B¡µµµ)å¯Ð{ñÇnÿòI ,Çã 3ͪ›{UúÇŽãØ±cj¿Ž/ýˆŽ/ýˆ';Ýåƒ?)¨>:NÝãñàr¹;V˜Ýõoñ+žcÇŽTæ‹1Nq:z -®Æ5úmg´ëÑ4G–­ºº:Îñ$“0QœãÑ©««Så¶¥¥E§Ð´ÏÆw|ÞíŒJwý­­­¦ë—ºðÂÕœãÑY¿~½º~`TLä»Gc'è ž¸»Fü[Oº±ÄÛ2wóy÷È$iÈ$ïñêÕ«éééI©ÿ.—kÔÇŸ²ÈñÆÛ¾×²Žå~£™~s¯h‡üõ¢îÉ:( e~¢>ñ}j4û ûV6-A¯QŸçµ÷«¨ÃóÚû©:\Å5×<­øk/£Ê£«F<uyF$¶æáð✛x ˜×Þ¯¶Iø±˜èÊ-ÔòïWññ»\Ø9ʰÙàCšhš¦?;ã8í‘– ^»ÆK?ÀGŒgÍ£”§_ëà¢uƒô4Eظq£Ú§òÂâ ú|áO õ/™1†Ê #L™÷;õ›·¡ƒyíû7.¥òˆ)"µ?GÛbþ‚Fæ/hL1¡È¤|ÍFKg3ú»¦iú’ªAö¿a_S„ž¦â£Ô%MÀ î—öMFÓîNü.ÚGÓnú®ìËx®Ñ¾þ³yݧî/£|ŽƒÈ?Eøü5Ó˜Œ}ÀË‘È#êŸÔäú> ÞKY÷Ý_qJý ðÖ«»‰üS$±oáðWÇåxÊ/&žÔý–Ìx¾¿‡[mpUúÈðgKóÚû™4i“&MâóýW˜~ëüÒèüÒxâ祘‰¤“ñI3ƒöH„öH„#e„¨û<õ±2/Žpxqþm‚µïo8‡~ûnÆþà_øE_7€2Ð4M?ñ­osÂ{/¿ürÆÿÿ“ûä{}ùäQ”-7çVü¦ àÜ¿ùqÚ¾ÿê«®Ê7‰”ühšFO¢}í1Ôÿ•uæsžîÏÁ¸ïh–9MÓôžH¡’žÏzÅÆéÉÓßòÐÑd>¦ë̪­¥og?-ˆw¿7Ò·³ß†ÿmÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eËÖYU^œ„ëùÖ'”^ÖÕ,&#_rë2º»»‰ÅbÄ;G¥“„ÿ_JŸ%¶¯ŽF¹²+Ì׿þu~楳©›ÓèŸF¹Ýn=Sàt×=‘n¼Þ«–? |O_7E]3êmßk¼í{MåG.…Lúw»Ýº¯ÚÅ‚ùÉèFÒ ¹w9)Xn1¾×W=ªÏ_NBïíí¥·WÔÕÕ©‰ïr]‚‘ròùH'žK£mlW{ß͸Ÿ12ìHÔÛ+ æÏ÷`R'áÿiwžÃÚ¥óéø‹ùœXgúôé´,ù2>ú(Q_ÿôíê˜ð«Ÿ(€b ètèä9䳯nîUpm&Hr$2ÁÿR†ê\ïPï(Â(™/_u*ŒVŒ\.5 È[ª«¼åå,ˆ‡iJnƒ‘ÁV²îÉ6WÊsÃgÔr¦kßÞê¦×W]T=ŒF£Ž¹sç¦Dœ·æílÖG·Û­õFñU»h ¸éõEêM…´¿×‚ÞØØÈš5kŠƒLð¿E_»â¶·ºÙÞêækW<“ò» 6äªÉ CƒAGׄ0ãÃì:gŽð G‡Rÿž{î9¾¼¼¦7ÆhŒRFÃÈÞ¾d“,‹FˆþøñãŒ7ÎÙ1‹™"ÔËcË­­­twwçÕÿÉö·yæAÊoôfÜÏÚþJø_j¤ð[&¥kGSn·[?·ÆÇJGÿ>ÿµÝi(ûÙÆÿ>ÿV::8·ÆWt[ÇNçC8%Óÿd݈ûºB”©½‘À“\íþHúÛ>êRw<Ÿ¾Aý˜"´þwêÀ7œ9>À®SÐ8>LׄpN¶¢¢‚X,©¨¨PЗ\Ïç:=µµµ97>î܇×{_ZøÔëõê2Â4@II‰Ú/‹)ðÔãñ0iÒ¤Qƒ1%üðàAJJJؾ]ŒsŒ‘¯õP''JgãñxRîG1p€¿°ok̶ۡÒõ³Öõ\÷²÷Æò˜RåP–;0É¥Œ†ß‹J Ëż<ÊõÝ*YŒ‘ÆeßóÀê¹ë»Ïp÷Ýw+Ó¹Ûo¿X,–™>׸þwãÆ ¬Y³†5kÖpÉ­ËTv«ÎhÝ{yžžžzzzسg«W¯NÙoÏž=ôôô¨û^lŸ_ˆ²™à8p€OîúAΠεk=Ôï¾:gÛgŒ¦žNÙÆý@Úño®{ñÇnÿòM߸n5²‚ÿ'Nœ`÷}7ñÄcçñqç>¦…+ðzïËú Œ’ðÿ‰'?~¼ÊWII‰ @®¨¨Hküa•*ÏWþÁS¡óÝÕÕÅ‚o|QõÇÕã¢yå!És´´´¨ 8N> 98à;d*‡|‡ø$äPã³––žèâ IDATjjj”!D1éÖ{–ÓéÔŸ{î9æÎ›÷·§t×ßÚÚÊĉÕõû½ßü*Ÿ„Ä©[[[MÇ«tïލ0Ð C£X,Ɖ…ñ”cË…¼{¤Ë‡ñYôõõÑ××Çúõë¹ï¾ûThmm% ÚøS¦í{zˆ`0¬Ì@ßö½fÿú|›ñù6ÓÐOƒïéÑ1uOšn€¨ƒ^/ôú¢ôú’ßD¢¾(ލxF‡îMÓt ý 诼0ª§M‘†¥¶}€¾ƒþöUê_$qŒþŸâàû¹?EA©KfŒa]‚¡è·<\0ø‰D­ŸÞÊ×?ÓGÈq¿;À]§Vp(x©ú·¯)³3Ž0¥áRuÊÊʇÌß(>Z›j’X¬$üÿzHgL„7ŠS*/ŒpäŠ;ˆÔŽ.€gÌCå…Ipþñ]lÕÎÓx<ôݦß¡=ê_gG]ÀÈ ö5 t¢÷¨Ú.£_Oô-Ê!Ÿtsýþ‡Žþ.!øÆòd’Ó -|YŒÆÁªýjý~yþë_ôÐjß•}ô4UfLk$×o½·…\·Q%îüÆÒàÎÛÊùû ¾²ôÅ=_å2étRĵ߉`ýw¶êúƒ‘ß\ä`õBX½ŒˆºÿfÓ^Ó¾çŸß öûæ"æÈW1ðÔ8Oó¹ïüóÛM¼^Ù„^ÙTôý&ëÅ¿q{ˆDÄ€go@ªéȸ=ÀzÖþ—ÚdìOÝ_Fù•Ž‚Úg#ü/å)¿ B¢ÿ›×Þϼö~Ví&<ý^áô œ$ïûœ­ïøE_7¿èë¦ò?_åÄ·¾-6Þ4…ÖÖV^~ùeZPÁ£>ʉo}›•wONžø¦)9Mò‘„ÿ“Èë9÷ï¾­Ì&hœvoýÉWˆDÜ£ö¬ÇTE˜×®ñÂBpÇð©Š_(à^þS%ž‹38žŠ1‰Ì·õ: ̓þ7i—ƒ} òëÇ.å×]Êí—w²ï¡AØ%ŠÓ¶­[ÿ?±nÛ¶nµá[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²uVun®ÒM ¿%Lbÿgëׯgîܹi'ᎆŒð¿T)p-0üøãœ³ûA@ÔxœtR‹›ädÑ60*ÐVOus¯ú›N™¢暈|ØsxîÃïÿ‚‘*oóÑïÿoû^£ô‡"ò˜ÂinžÉ™¶·ÕúÛ¾×pû¿ L¿.¯˜š„!Ÿy¯¯šúÖ5-Qf¯ˆ³i™˜ä^2[ ÑÝ-¢ÓTTTp÷Ýw³y³FRÝn·Þë‹ÒÙQ.ÌD¼öÊ”ç|Ú_QÑ U üüzµ€ wàJpd÷ó;Ôq›7o¦¦E@Ò H¶goóU{ìEg¸UfhhHAD‡ ²²’Ý»w§=ÏÍ7ß À¯~õ+ž{î9&L˜ÀÍ7ßœ¶}‰$ˆyòäISû|ÞËOà«vá õF)©enëÖ­9!Ø´íïLó>¹Ú_ ÿ‡_  êxƒƃŽëðfïûò‘ËåJÛŽ–$üØsŸÚö¶ï56û¿@]] t§ÈöOFé–Ç_ ¸·û‹jÿ„ @òž ¼vM² È' ½Q¹ÚëøÀ¸nÌ{!}ŸÓéÔ÷µ½Ê‘Ð:Ÿ€!ðÔôéÓÙµkðe¦OŸÎ+ŒóË¥Gôúà%¸H,ï:ENðß*—+j2°Âÿ ¢ÀVTT¤´óRùÔ= YGÒH‚¯0•‘ e0«ÆŽˤI“8pà@Q÷_ÊÿK•””PZZŠÇÓI0½>¨÷‹ñ¿õþ@aã·Û­W‹*Ø®­m~‚ëwìˆñÃîNÓ1Æ~VØÒîIeêB¼¤`Y¾d™kn6Ÿ£í£>nöß@焸ÂsS›¯)h´|ÿèðÕQÑŸUG£²¼øNÎ$Ú0¿”^O„‚<€˜GÒ§ë{Ö¬YÃ%—\BYYƒƒƒjß“'O‹ÅˆÅb¬X±"Ó) îûûûÕ±Fð?Cÿ«Çb±¢Ëÿ¾}ûLýýõ×_À /¼Àºuë »›ááayd'îD“1Ú}¾1O`YÍ'œN§‹í`èÙ †±¬¨S^¯WO÷üSÞ;½PßÒÂúõëÑÖ—|­%eì+û•E‹™úcY/ó½ìö¯Ðô=®ê±@iÊþþ·ž»zg„ÿ¥ÆÏرci›½ƒ`P€Àõ~·É˜È(ã·9(¤ÿ7ÂÿRžrèMõ¼ÂS@¾W—YéÞÁä{H<ÇÏ£ø.ý¿€0˜:”€ó»ihh`xx˜M›6ÐV_’õý3QDºïkÖ¬•÷¬\J7þüœÿ @¢ üâo˜þòM\x¡4"ù*»¾ø:DKK‹ƒ\úIÑãÏtR&Á¹=Yî‚4ªõîaT¾ß ºººX³f [ÀO($@!ës(æû‡IÿÆïF©¿„ç™Ëð'~ò==„÷ƒä2€ÿ«%jy$é[ëž×‹Zîèß\A€ÿ ž ÀÄ'ݺ'i PLúØZÞºßÖw¹íÒËÙú qŸ¹Rü©¼0Bÿ{•MKøÍj1@¿qñ›€€ÿýí)àÕHà«$`Ùè…©í ¯FoyK>`šžozr¿V ½åƒZµýõî£ ö?'.Hè;“ÆVýïi<;㸊L¼eaÂÀçVPt½3ÂÿRcA°aðoilü>]]]Ì*)Ö‚Íp¶âÒèiª¤³#"¢ÂO—†€ýT^aÊ<×{.`òœ•H£€rÏõ&6‰8ê´üŸ‰1ûš" ^Ê”زð(SÌî¢8rÅ<û'/ñ•ž»5yœ¼îƒUûјœö|š¦é~³—7ý}çÎ⢿[ÕX®3µ]ƒöä6c¤v™¿Yµµß®k9rÇ®¸ó«8šv«:o•¼þž¦Jæµ÷§ß‰Â¯_Ó4}yëržïïãùÕ?TÏCÂÿwf=Ü$wIª‘_¾š×ÞÏEëÑîO}¶‘HÄ!ËÀ¼ö~zš*ù«E]E§•M‘HıÁ’ÖÓ G?-MÓô™‰÷·ÉºÎ~‡ƒÉºyxô©sø=IÀ´ïÌÁA(¢®[ó’ÿƒà§¶'ó±¯)bà{îãÊÐO„ íE¶QþõÞ”yüöíÏðÙÃ?Kù}ÉŒ1iqNÝ_†F~} þo\ðŽZ^õ»,¹xY¤ Ù¾<=̶ö9ªNzÀ—PX_˜-O“&MRë“&Mâ-&‰w° ^&UQ¿Iøß¨;÷þk𦇇#ôëU –»ÏÀãšèk/íÞéÄgm«F¤6b=]FeêûùÍëpÓ@|÷Ëbºòÿ’ñ|cð/Â,à¦)œ´"Ú_°ÀÿRã¦Âñëùþ÷ËÅšùmô¿§1«´0_s¾Æ'…èöË;iyD˜Šµ~¯•u)ûHseN\ÇShÚÝyß+üïò¨eï^àuâ4cª"<º½Ž»®s0õ±2f%߯ lÛº•1U´Q(ÿ¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eËV&å4ȤØÿ™ &ÖAï`,9 w¤~­ðÿµ –†ˆ¾ C °B@qÝÝt4ºð’”œ$tŸ¯ Ñ‚aŒ`0Œ×[žX&ï~ommUÀÒ•¡Ÿ˜&nüT_ã`:L?VήS€—´F>š½"Np ¸‚ˆÆ*'Ì#³~2íqÞÝ&9—ò…yŒ“¬“¯}Õ®‚!C©$(wlrnÒæ|޵`|³˜î‹ÇdT”¶úš{‡TôÑBA Ž·ùvÕГ~6½ÅñK1é½üšsèˆt3íÎsZ›ÜßíONÆ–ËRáW?Q&rr{¾yt¹\T‹ªˆ²®‡‚!š{‡Tù—¦€bzºk*´á«(ùZ·Z—‘φŒQI=Þ°šè®Äÿ„‚å@˜Ž`ˆ’úâ'~fRè¥÷• €”ÎEú¡”ˆäò9H¨%[]ŒF£Ž¹sçêÏ=÷·ß~»*ËN§Sw¹\îîî–p {+xb¬½¾jêõ2[¿ ˖ǦÞSm¬uÿ|ÚßkA_ÜXŽóf.ŠF‰SÄ$x#üŸPôÄ]°=uÒ% ì‘( :dÛ,ëª1êêĉfÏž=,[¶LA¿ƒË•Œ¶)¡Åááa^xá&ªëÈ£Ë}(JDÜusëÉ“ À”F,'µ¼QþE  ÇÚþ.HÄžŽí¼׌'u %Ú°l‡~> @ÁJü8^8ü–é~\”b­m ±½­±F:Åãqe Çg«ýËf¸À9÷£g,b•ŒÞÝÝ-̶ì)]{“nÌ/ü›Nþi=׈íHè ž¹‹Hí¼dúÍX§s¥+¯ùÀMå×*ioÝ ƒ¯÷>]üõêÇŽ3[cÇŽ5E—Τ'N AU Á–””°mÛ¶‚ÇVø¿´´T-oß¾ù1þo ¸Õø_ô1±¢·¼ååøýuTÞ&Æí›71s¦ÙÜ©‹_õAr¼+Ó,¦Ý3*] Ë”çÓ7à™{1GBg¸ÂsAÖóHÓ€#¡3ìk{•©Í×’ ¥Wï^$LŒï ¢Qõ^–îýc Q<\|“þ rð <—’õàô± c‡ô}7ìÙ³‡={’“Õ‡»Õò„Æü`•|û_« €UÖþwêÔ©E•#ü?mÚ4µl¼Öîîî”÷ßtãïÑhŸ­ýÑ¦Þ +ø_Ê“ÿߤÿÕwòzþF:tˆ‰'rèÐ!e %£’Ks†tãßt²Þ‹?vûWLúCV0‰Tðßzîœþ;v¬Z–é¶Ü€šš¶oßžbP33™‡L²¬÷ò5WGi ¸ÓšäŒ–âñ¸úë‹Øœƒ?0‘ÖÖV†††ÔXCÖ ã÷LÊgü’ë=K~÷0~s:úsÏ=ÇܹsGTÿßö½FKËhmmU&0WÀŒo Ü®ö¿ ùsjù]C^ ¿ö/Ó»‡~0ñ®›€ÿ].‡î‰²öX9¸Ñ»‡Q…ÊŸCEE---)ç,ôû‡ìåXDŽù¯° ð~Züõµ„ŠŠ ü_M…¯Šùj¬{é$A#üï«vá2ýõäJ_‚¶U‡«¨ýi-¾­ï⯽ €ÚŸÖ&M²(ü_¨¬ðÿë!)åsœ»QGKì·êw+˜Uû]]]&ø±ð1‰8Z5¸Â`JÃ¥"ú|ˆ´Q¨¦bßЧÎ˾:Yáÿ)‡ZoÔ¹÷jèô÷uÑØØ( 1ưjgú¼…FÞØ¿q)Á]A:;ºDTi ¸+h0H/ ÿ†„„ÿ¥äsðr”iQ7æµkÌ*)áõ>Ú¸,gÌœŽ„ýE>ŸâSó§RÚ79mž­àwºkM§b®?۱Ƶ]3­KãƒB˸UÙ¢TKH^ƒÑBþ=2špœí´²éÁH„ÇÛ¯ãͦ½”®ï¿ÿ}SÊ~ûâ¼Ù´­ýº¢ág#üï.)QË/OóÅ]âÿã’_M”‹­¼Ù´0pb°dÆ¼Þ z¼P±ð µ=q3¹¾ý½ðÚá]‰zï†4MŽ|NóÚû‹ê ð¿Q"Ë*m];“ïÔßþŸoÂÿ¬+4‰¬²Ö#ü¯òb€ü?ßo%L¬ð¿èOóÀ¥Œð:Ej#ŒÁ ÿ/™1†U[µ”}sµƾ¸¯ÞænšÂŸW5Ô?Äë8Êÿ|•Ö¿¸†––¾øÅ/26apâ[ßfìþ…ï~yÿü¸i KyŒ•wO.È2þ7 Ãz`f¢ïO~{øÊW&qà@ò¹•”–äuÝéä¹nÓ¿ÉÊ:;。½Ç Qǘ*±Ï£ÛÍß¼<n¹î¨Z¿å¡£ð˜È˧æO%Ò)L ¿~ÀÿK5}ÔD{_;SûÄúé>ñœ§öÁ¬ÚZ¶mݪàÿîînnyè(¡½…\¹-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²U¸²'áJØܸ›1Áÿ™&ᎆŒð¿U»ÿõAÇÝȨr* } @bâ¹ÚWND/v´`/ŠFyÓéÌq:Xl$Æ+C?á#P€¿Ù0¯·œ¯“¥)@0("„Y#Ð_ú ÔøøŸpØs¡Nø†£ÆgŽÀix†E:è_n‰ÑgÒë«Î•;—Nžó‘­_ˆÇãy¿|Õ.8c„¯ói'@Ðbž·0ñxÌ2á `*ѨÆìÙc¹îºëQþU··º•)ƒz65QØž_ÿ#ÛŸx<îX±b…*?²žMœ8‘[o½@A(••ÉI¹DRûD²°B…2*¦„ðæbô&æåûª]Ôû˜U[[›ö¼V¥kƒA @lç=„_  ê”ß(Ž3F¿Të² .~K'cÝÕͽ¦6°¾4Ž·\Lx”PX±éœ[#Àc#L+#°Ê26<<œ±ýû\"J·<À¹5¾‚£°ªzÀz 9T.püzpbŒÀœ¶ß“‘=OQ0–±!}{#%¡Ø;ÿï#@êx¡u>!Ú+ß»Oá¿ìnÚÞí£ùÜ*õ{`vHHøÓEɰìò~Zþb±üÍcHÀÒºu[¾u/WOœ8¡T 7ƒ0ØÂ‹Ê´%+ÕV_’Ó€Æ*#üo•ŒB›nüü`Œü,Æ0~*oó †ikÛAsóLÓþÆþÉhˆSïwÔ±ØälNŽ!NµÁú¤ @`vˆêM¢_ß×ö*7ûoDy }ð¡'`þÕiRÈ-ùþÑávSrâ=¬4a€"ßÉ^IìãJs<5>´€!N{o¦b÷Õ¦ëË¥ÄX5kß³hÑ"ô fø¿PåÓÿ›ÀóÊÊJe²“©ÿ-¦ü᫺»»UzÖòŸÎc¤J©\öƒ¯G IøèÙ Tt9è5ÈïÎ@½G ¬Ï?ÓØPæcò^®^-¢Ž'¨u<ÛøWÖÍlïßìö¯ÐôÕßú!\.— þ·ž«˜ñþ·ª>a2WSSC<7ôѦ²7r3ñ7€ìr¹˜>}:===„¤äÁÚ&ä£tå°º¹—X Wu³fÍRã~©õë×sèÐ!Õ& Ê yÿÌ5~Îúž%¿»‰¼,ªþçJ󇡡!Ö¯ïEòÚ …æóQ¦wçv§Hûž(ºüOŽìÝ#^¹ã^õýɨ_>ú=@<ës3~&ðäßn•oÆñïvÇ °ü%à]<‹h÷A€/•³ãïµô­æ‰ˆ×žró~úAÄwšÒäwùýmþ‚pÁé/o]nZ¯òèl9*ÄÛ.½œÚŸÖRK-·<,~?\ÅoV_À‹ß¤¿} 3Éÿ[ÕØØÈðo¤l©dÞ#‘ˆ£ÉA¶wG€¤ €ˆB­Áà ûz"L'`´ggçõî£¼Þ ·­MŸF¾2Âÿ)ù\¿Œþ÷4–·.çá–‡“`ðÎ~S~¹ž”ðàÌÁA­%¸KÀrÏõtvtQ·‚à®`>Ç=5܈2ÑÿžFž@|®¼áÿ‰Þ£jyËBøìZX4_¤' þ´áz°DßÎ× áãÎ}œ¿€Æÿüø®Тʞ׎)Ѹþå­Ëy¾¿çWÿ0c¾³á3gΤ«+ÿHñ¦(Ýz%bÜ[u¸ 4q}ze†W]SÄó‘BøF=¿ú‡|X¦Ñ³þjQ„¯Iþ&ËüòÖåpôë,Ý,Úâ•uÅ¥¯iš©P>ÇÁ[¯Âwïî=* u0aÆ¡­åé¼Áµ(}¤qY抽ò>jš¦oÜø?Ì™ó§<½0ÿçXlšze?nº¿Z4Fmßïp0Y÷@šüÞpÜÌÄXc²®+øÿÇkN›Î[L~Œð¿QsæÌ¡±qÐ¥ ¾ý?ßdV-lÛšÛ &—¼Öÿd;¾/y}Ÿ2ð¿øm´¤iš¾ÿõˆ2X¸@ÜScßß××Gcc£ZŽÌÈ’† L|_2cLÞf8òyU¾5@Aýû¥À¤I“Ô6+ü?óMÓôðp„¾Äzw ł §£€[,CÒü§qÁž‚û@ão‘HÄ¡%ºÀ/èV& `ùî/×ùÍëüý÷JžôËpã——òâó+ùïO-VæwÒ K nø[úßÓhý^+-´pã——pàÀÊ¢ûþLz¦ûÏ4À}©¦ ÏÌ8Æ3ÝÇ`¾0 ð\gvèüÏW©äCž`*Q3ó£išÞéQvà!ùzËCÂh`ò{>úúúü?tP˜¡/Ýü&kV¿À˜ªZfP¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eËV¾Êj åÄê³JêÝ&ø“pËÁßlž„ë˜'¤ ŸõÄãÊ@Æ\6b@ãnÖ¯_Ïܹs©¨¨P¶}Õ.JêńӎC½"ß#ÿÛ^HN&o¾YL—‘ˆ%phŒÊ%#på‰Ñívëoû^ƒàM€˜pý‘åøvwò͆ù¦ã‚Á°é¼îí~ýÊד  Àÿ€yòµ4°ÎQŠF£ù¼­ðn¡’¦¹$'×—‹™I&8¹¥»7Ov‰ ÈÒàjï» þ1áÿ€ïoE¤²cmï2¾9–ÉGP ¿ú åל£¶]ëäĸú äïr¹X‘€ÿÇ®u#¦öwD“&³fÍÊ;F$àÖM]]Ë–-£91‘Ù²eÄãq6oÞlº÷½¾jJê…Ç I/ß:('“#«Ë¼¾mÛ6µï¶mÛL×õFðc1 •‘À!Þ¨ú½«eT %M<^a Ò/OD¶Ï=ß þ§kC:‹¬²q£h4ê˜;w®î¯åmÁ®êƒ¦ÈëIC˜$ð”®>ÊvÁG²mίÕh&! à34‹y©í¯Úü_aÄ[5ù-1±rÜTÓzÖòwâ.¶·ŠËjP¨Œ@õŠ+ôeË–™ÀÂ5kĬd+|˜I…ÐÄb1š{c¸,@»Œ¼ìr¹R"’Öû˜!Ú½¾(yÁ'éÚ_aÒ üF¯‚ÿA´C?ŸEøÅ 3›¦D-øÿ?ÖïaÂÑöÖ—&ËÝôETê`8Là¸[ÂÀ#2±‚WÖ6 kù‹Fnÿt€Ã#€|e6Á˜ Ç×# 0äu;!ËãÞ½{i«/Áˆé2¯Æë/þ7F’ÑOImo€¸P¹Ýn½ò6|Ô‘òÛKÚˆ$M\¸LÆ;4 ØtQsÞ¾Óå¡¢¢‚6î´í¾QÆß &üí̱‰¨¹#ŠˆlŒ8mŒFmŒˆnük”± 2›¯œN§>{öle Û-cZÙÆÿ€z(füaÔ‹{‚Üx½—;ÌeL}Èñ®l÷Ľ§ v/›Œåi“³YçT› ìoû¨ þIÛà ‘ÔÉÛ‰hí¦<åóþñ3à.˹^1,æûG,cÛ¶m¸\æ²›©ï1Öÿ‘ÀÿVåê¥òíó•ÓéÔ÷íÛ§ ֭ѯ¿Þü<3•£ M!}~.µµOõ•ßÀ3¯›êæ^强¹ þƒ€ÿ‡Jsóï™4iÏÀoÎgŸmìû«_ýŠ[o½•“'OrÉ%—(¹¯kf’Ѩ#—þ˜í_!é[5ÒñŽÓéÔ†2=ëuÔÔÔ¨åÓÇv$ÀcsS¬J¾²ËåbñâÅTËœ‡»îmËËðÎ(k94=iLÙ IDATJoHþöÛoÄûµ|ç©÷tÈÿý3ŸñK¶÷,™Ž¯Ú…«ú ±@)"͹sçÜïåB²îËúweþÄ  ‚ïl‹SúüdÞØ}ë'>D¾ÊôîáÜî߆\ÉèóR#}÷°¦Ÿ¯ŒÏÁë—Ô»‹dÿnwÜ@þ¡åW €/~ú4ß%>1ʺ ‹±W4ñÄ‘ø(ëºM߀Fš¾ÿúBúx­øÆVÙ´Àÿ÷…£ÿkš¦^aJÂ~SFøÅâ¡8áê«~ã @Jø±ð1ŒÇ5išÞÞ1ýÏΦŒVø?“$(žˆѺAdWÞ(ªþ˜²ä>ýïilܸ‘9sæPVVF08 àÇc˜:Oc_O„—Q`^ÏeÉŒø;ã:ÿwv$ÁãpháÐæ/h4í/ !$ >Z þ·ª³ƒŒF€: RE¨î|ŠÆWË(ÿ—é4¾º‹'~„­y˜×Þ¯"†ì]á“§¤‡% Õóý}¦uS'êA08Àª§Åµî/jRº(Ý}!Uí €D°wÝ£ÓrðåÄ>þ¯:\•Èdîò_^’àø×ÀÜÐZ^ó,TûÍJvýú3üú±KE»Ô¾J·ÙÍ ì«é§¶Š¨âÌÙÍ©ûËT„qH\´N4Fg¾$¶/þkñN°ú_÷˜~Ðî/¼íÑ4M_ºt+WÞ«|¼ëAõÛ‰1Å‘6hšÉx¢¸;×¾?^sš¿Z4†e‰gpP™ìke|õBðÿ¸¦)# ÿ_ú o6 sÖ«Ú…iÓ›M{ÑÚ¯ËzO4MÓgÕÖª6=šæ}.Uûu*]ùÝM¯lB£½ˆg¿4"G§&w‡ú&­iQ‚Á߆v´HIø?¦×žòËL뀟­úÎ’8óÚûRŒò‘ÿ!ê—2Lš4‰·&e‡ÿ‹Q_ú—)Køÿ¢¼E´„ùFâÿ×´ˆf2C)¶4Jî¯~øÅo¾ÃŸ·ü3¿èëæÏÿõAúÑhmmUðÿØàepÂ{›é\ÒÏ%ÑN=’ÑÌ}ÿ¤I“x÷ÍŸsÙU_cÒ¤IL'®·k­‡}=zQ×=ý–÷ÙõëÏâ^ÓááwKÜ+Þ‹Añ>úL÷1±OŸí¥B{3¦ê8?8Ïuãxà[oÓÿ×€–»|Hø?ô[1ñ|Ö›\ÿ<,üaô±öGµüÉðëÇ.UðË#-D"ÇÊ:M—F¡½Ç ¹|[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²e« åe aÞ^_Ôÿ»\®œ“pÁI¾ I¸.‘|m©e]æENø$hÚë…’úÍÕæ( ùÊí°í…A>T¿¹\®Äå!Ó6ã>¾§‡ðµdDàOºcëêJÔ$_¿¿Î4áWãÞîWÑïδ½]0ü—+RÖ9=r_£ñC,£zEoAP\,ã䃦lÿ`rbRc"úÚ“On ¤$ù|ÑßGõ=::Œ“Þ»¢ÜÓx¹ý¯ö¾Ë±¶À Þ^Æ´Þß³»þ|Þ^Æîzñ;ÀøæÔŠF'ÖWÞæS“½wÿRÀ¦c×:‰ÇãçZ§n„ú'>)®ûÐ=Qʯ9‡ÝQ±¿¼×r¦_?“ÓǤ3R`R‚ÿF#wJࡤÞMsµÆIo#¼q:z¼Æp^ú%–F.—KA°ÖewPLNw ¯÷™äñ†ñÄùäy%ÉöOnO‚HåÖÓ¬te7¶Ý-"Ê[–iƒÙˆÃˆ©ÈÈÙêƒl÷š«£*ꦫú .—‹//ÛÈÉçW¤…b6Ììåœù¢ë£T!ÆVÓ€^_5óWw)Ó—ësiÛßÐKâ>xv•Óë+¼¿Dù;çþä]INÀL¬g-cFôÄ]¸Çþ,]EKF$^¶l™ ¾1FRQ6—-[Ư~õ+î¿?y=ùpN§SŸ]RÂöXLµþª_ꇫú ŠzjÌ£?€.HF‹-ôYË2€^¯ƒð‹I#€ØNõ2ü?RP<^-Mÿ À„)Ÿ(ðÀ[^άßCÂ#F™Œ´ó}KWæ¬Ûå1ÅF6Ãÿ ›*"A‰À«ÚâT7;Ù»w¯@óëíÅívë2Ú'ý÷ÑG¥uÕó&øIÊØÞtu9‰Åb|ê97Á줌 Uç^Òö0|dÃm€SmI—‹žú<žOß öò‹åßo¥30†ÅÀÿÁ`Ðáõzu#€*—ǯ–%øWó[‚†§†ùÑ~e”6«ò­þ·¯r=Ûø0¼hÔ²ßS«á‘Œ:Ì¿nc·µÝ£–­ãÝ^_”Pæ/c…bÛ½lŠÇãŽMÎf}Â÷âY/Ê^胗Ø~•¨#þßtQ34à øÏ§•.ß‹Ýnª£¢Ÿí0,Éôþq(ø&puÎt}‚Lé{æÌ¹€E‹œêì‘G®dþDóù¾³-N"ˆöˆ4ý/ä_þ%ü¿gh‡%ü¿gϺ»»s¾ÿM°ò…ÞÓIŽ c± ì—ËžyâÚC=bv¾üqÏ‚Á x½z¡`zºò7wî\DZÝÝÝjÙxÌHèþØí_Ñé3Z’ð¿1]㺄ÿãñ¸êc**DôñÊÛÄ{¦’Û¶ø‹±3Èm‰¶¼¹:ª~wÃñS~¶¡y$·@);\Õu}œ¶À@ZðߪBÇ_ùŽ_2½g¿{¸\ Ð&~k&НWÔábÆ'éž—±îÉöO”ë é<ôó'Þ^h2Jù¾{Œ]ëTÇĈê»G,ãSyì÷ýï¯0=‡þ-~õM®ò6%õ~5þ(4ÍÍOòÃîδãß56m9ôN§2ÿKÿð✄i¦r(¿š¾okô?ò˧„JAÿM^´Âÿýí£~C2꽄ßËç˜×†ßxÃtÌEë™—èîF£¡H$âhÒ4½=’ŒJÿz÷Qš43ü/×Û#¶,„ÛŠÌ‚Ž¥ù„ÿåºþdÕ ,A˜ôxaê,ÓXò×׳jçiŒDt vWðz–ÌÃ4º ”ˆÆžtÏ¥tÇõ…Ä&iàhڭ੪ÃUèF£¢¾}XÕÓanh­iÛ¾¦‹Ž¾Cû*£KÝvéåÜ& !ò2~0* ûjz˜ˆ*ÅÆú7ÅãPõòÊ2ó# üø°L#JæiʺA´ûµ‚îE$q¬\y¯¾té@”A@÷‘f—‡°c!K—ŠÊ±rå½yõÛ¶nMû›žhãåû⎲2"‘Z¢=Ûïp0Y×Y½¯M9…2 ÉÿwI¥ƒþ4-—•%QÊÊÊÀ`8Ož4MÓý…èE›€n20˜(ƒÚ„Ví<­Ú„búMÓôï,Iþÿ‹§ü2Báw …ßÅS~™Z¿ì²Ëx÷]ñÿ[Æe€^åä;Kâüó*gÊùó‘„þ¥¬ðºß¤iÀÏgÞ7_i‰>ÒÃÿû䜅¢¨OùBòÙK ýÿHû@)#Ôÿ‹ÖïÀMST¿Wyaï—ñ÷¿y(íþR/>¿2o€\ÈFø?ù|„ ÀeWÁÔy+YR5È_ww+s&§i X~·ø>´²îªäuXŒTœÁñÊÀ(i¢"’ò›u¿lùhú¨I­{>ë%ôÛ ¡ßñ|Ö‹ç³^úÙÉ7‘yðò Ëy¾mJí¨5Žb±===jýäÉ“,Z´ˆX,†ÓéÔ].çÖøÔÄã¶û {jèõ¦HPü¯nv²fÍžzê)u½¯G^'¡ÄåÿËñ‚Œî …èßâÏÙÞÈc 3X•nüe„úeÞî\y)¡¿ñ±ý*?Û¯òãI×g[E£¼rQbý”; ]YaÃ'&©HÄŦg…PÑŸUý·.L9¦wÚÔï¾Z-8 !ØæÞ!èÊ9þ’¨!3üß\MÿCf£™|Ç"¡`(e¬Ð¿ÅOÿ–ÌÇöÕ=ÞpÁ‘n‹U胗ð|úÿ×¼éãÎ]JèoÄïâ>oÐIb6°–÷\i1Ÿ ÊžÜN¢Ý±¾ô¯f¢÷* “Wºß¡·êÉ ƒË¾gÌø™‰-¢#5ö=Ö<>òÈ•)Û¿³-ñ®’¡¯.VÅô¿²ü»\®ó,£œN§.Ûötð?¤/ÿ ø»»ó6ZÊ%#øÐÙy;óç?Ç|îeèÙ ”|å^B‰.¨ä+÷šàkÏõ¼s}¥©‚ËåR÷PÛ­çóø·Pý1Û¿‘¦?9N•çLðÿEÑ(ó=x<ðE/ªí4¨e£™]! v>òEQaP–ÌC2]Càt¥|M72•ÃX,†×+`z þË6%ÉŽ|‡Î÷ý3Ÿñ‹|¯²®§|÷p¹\Ôû]êºe»YR<ëTŽ?/ØÔ¬®Ïív›ê¡Ün¬‡4 ý±ß= OŸCõ¸(„/ÍAÀølñg½÷Æñ¯Ï·™`0œ×ø×Z¤iQ¡ée­w ¾¥*³ ¥M¿¹:ªLŒï@ò]Üš¾|”òm}툀ÿØÕ®ë•M""¸G7ÁÿÚïNÑÇÅù\V^Ò4M7FÑ.Ÿã ¼Q'¼Q§|ŽC­Køß‹žº¿Œ‹Ö rêþ²”óަ^ï>Ê”†KM°ÿÄx=Q%f…JÓ4ýðbq\&øÍï*g_\7=e‘Ú«¶j,Áü, …Ñá=”{Äx§³£KÁÿ‘HĦé3Õ>FráƒÌÿë_o&M¦4˜×s @ÒÄ TÓ4ý`Õ~*ÿßð¿<Â`û5ê÷/WžPlØáÞ{5VíÑÎ÷¿QQ»¥ŒÑÙ‹‘¾<Ó½‡IF\ŸÚ®±¯)¢ÒoôŠmË{—C}X M­SYïåzMTytú;švSu¸ ½}šjôöiT2 G“¸Y}Wösù þ_ïYÈÜÐZuÝýí«Ô>SÛE\Þº\m[Þºœ©ó.*¸Yå_µ¯£såjQ×.Z7È™/™½hÝ §7&ëëë!)¶Gš¦éK—nàÅÝA¾5ÿ~Ðù=M•<½ÐÜ–ô4Uò#Ã>K—nÈh išÞØØHWWWÖ{pØsW%àyÃýMcæà *«êjÙ°_Â@A”½²©`3MÓt#ÌŸMVã²lŠÑ¼öþÌ÷H~¶|£Ö´¨:fæºWh½ …Íã Oùej¹qÁ;„ˆÓ]vÙe¤“,ëKfŒQýúª§³¶{Æ1ÀWá—G®Hÿe{´¿éb1É;‘Éí¿3íóÌŒc‰íÅ›@*øPu8‹d>í¾‡ÄsžúXKª™×žjþ3†,ê (>H½þïq°s<¬º”¿g^Æý_|^@øöñ^Ì’†¦izähâ[QøÍüm|¼k«èûoˆÀ$Hĸk?Wçò–ëü÷îâ¯Õºí™îc<®i<‰@7<®Ë–ãŒmæ-%´÷xAi‡~4­{>ëM.y’þBk+øu»0Lð¿¦iú˜ªkV¼Ïé@زeË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[Ù”Õ@ʈÑ\‘×pÂzª“ûÉI¸éá×@Ar­à?Àµ†í2/5ókؾ};ƒ €Q*šgYu þ?Ó¿€ Ûë_x‡Þ›Å„;iI“€;*ï7šä¼^—ËE¬ùsP/ö5‚>ßf^ÜäÆë½x½åƒÉHrýÅ=Aú·øq¹\z4ux½^½ëX9»NA×øºŽ•Ó5! Ãåt‘ÝH™x É ×b½¾4ާÜ<ùz4‹Å(Ù ¢Ï ß{¯Úþéýb²‡+‘§{î™m9r§Ó©‹q½¬Y³†–ÚZêêêØ¼y35.›††ôB#áÉç1~üxUF$ìo”ßéÄód×;ÜÓxyÊïé‹ÅÔ¤z L8›Å=5æÓívëFøüå xFI$.’&Æõ¼2Ið?0A†{÷îåºë®K˜²EßÌ·f’#Ñ艠¹:j˜Œn¼JêÝ õF …’ÓЂ®‚¢OJ%r|Õ¢-”:åv«(”mL÷¿ØëUu Àívë±XLÕ7ˆ3?1ÏÙ˜¾µs­®ê˜Š)Ÿ·¬?---¦s6Ÿ¨ ’3ØE¸Ýn}ëÖ­œ|~EZ¸2[^$ˆcº@è¥÷™½â}6% HÚvžQ¿P׃%ªsÁÏ_éxô·ŽçWþ&¿uÌUþ¬ŠÇãŽîînS?õ /°nÝ:Ö­[—²ïŠ+tcâ| 9d;ár¹tã1¶8!|½NÕøzÔ—Æ©/Ó{Ð9âkL§tíïÙ†þÓ¡ ^>²w„áÉ„)ˆ ã-/WûIõúª©n..ôôaÏ}jùsÛ“†?þú8¾^'===œŒ&"½{½^`È7ŽCÁ7™¸à…8|“úÝW›Ž‰ÇãŽèÞ/DVð ´´Tm7Žÿ›£´±±yÎ=þˆÅbx¼â}”›àc)Y‡2Á¤ÕÍ"ýÙ†ÿãñ¸ÃåÚ¢o¿j‹ôBJAýg‚ÇKÚ×áHr_Ø Ã#†|ö¦”Õlï ¢Q"ÞÅ®ÇyÅpܵÀ+ˆ÷²€Ûmzÿèö¿ë~‡ŠÝWÓ;í ðxy¢;HÿïP™%"¼±ï1šûžY³fqÏ=bû¬YÿÞ÷–ñÈ#WªÔþ´´´Œ¸~ʼ¤ÿ…üÆeVð`Ú´iìÙ³'Þ¦/ÿÒÀ¨¢L¸H‚ÿCÏŠw±ê+¿¡–‡Jõ³üw¹f‹‰÷´tð!J7ömmm%S^^ŽÇã!Jö±r=Ñ_˜ÆÆe9–-ä^ü1Û¿ÑH¿X¥3;v,ÇŽSP}¢ZZÛ^# /ën1ía&¹-à.( Œï -“ÆrX ×5’ß]víÚ•µZÏAŽ1H>ã—{wÔ‹ßÓ¼gÉs ^r+uuâ½hóæÍª?rUTïu¹®]~xÛ÷šÚæöA¯¨¨`Û¶m õFqU;ill¤<1î]´hѨ™¬üox÷ˆÅb|*ËïòZÍß Dy €Bdÿ¾í{oŸó!eü;ÛQˆ,·œÄq€2((YäMðOÉm÷î¨ÏX¥ ÀH¤ù¥‚ÿå¶ ^?/&¶—×ý?†:Ä»ØÝÀW7¢4 o4ß¾ò9Éb%#p§‹dm…% =Z’`?;ù鹘¡ŽK9Ôp4eßÛ q³Â¥YÁÑÇÃ"éU}eÐ'¶ÏZ,¢zk[“&ùÊ¡ÉpHŒLðâšÐ4÷ _Âï—²öñ5¬}|MÞéæÊÓ³34˜ þ¿mv[ Ú#šH5@(íºf#wá`ð-ÕÛëi sm·r÷¿aòó½þçUNº˜àéô`$’[?‰0µ]S‘Ï¿ý?µ,o­âùþ>v”•©z •X/ÊÄ3qô·Óß/Àn€ª„@_È£¿>¿%ŒM»S`Ü|¤iš~þùíð"œ¹ñ00`-SÛÛÑ+›¸Ð±ã–‡ŽòëÇ.eËÑw¸íRñÍËÑw” €^¹ Ga¨©¼Ë<¡éC]~=¤ÃcàNþ¾à¿’§—&cÊÄ~©Öh™¯{éÒ ”ëk)¿æÌYÉM·.%ìXÈ 9²@Œi¾º¶Q3gΟŠ2§• €1éË[—ópËÃy݃7›öŠkývaìH”µ}=b}ê¼dãd<¯ÕÀ¨«Ú¯ˆë.)É ö‹²n6 pô·ž›výSó¿ÁÇ?%Y¦‰vål€Æ Äÿu “‘w¹áüŸЕ‹QSçiì뉰;”,#ûtTÿ%üŸkÿgfýàŸ ™MFóT%þã·;ñß þÌí‰ÄSr  LF[š¦éK/FG?Øâ•ÿcï;vŠ÷´±¤ºTF"ÇÊ»'ëF3—œ²‚ÿ`2>6õý“èûµ¨Á ©Ÿ_9*ÏâqM˺œ¶þkšþã½Çxà[âÿñ»®äSó÷£1¹à~È3$Ú½P‰xç»å¡£Ìk×hú¨‰9sæ˜ö•÷Ùs]r<úë¾BR³eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶lÙ²eË–-[¶ S^ þ|ãÆQRŸf|­u®1 ähèÚÄߟ%þ.èh$àPSS£ö©©&ÕÑ(·›^Ÿ˜4ßë‹RïÏ_ºÝn]F­jîMFt’ðÿé–f.HLú}¦wTÞOý ïàå<‚|ˆ—óÔ1¬ðó ()™¿t’}­Ûc±/î òÍò[Âÿ/îIF)ðzå,ùdÄ=@ÀÿÂj™ñb½‹ìe49¹,·‡Âæ ùÆåÑ’1rf:pBÂÓÁcèré,ǹ&êŸr»)©“T]ÿ>lNã§Éà`”ÀDkžN»¯4h®‘{½¹ë ÓéÔã^Ë}s ø_‚ÿn_ปšš&L˜@II —\r‰š:ƒbr×ÛÈHåñ&à@*ˆ)el'G"AOüâñ¨Ì÷ælÕ?¹,MŒõD[YQQÁ„ 2BYµãP(—ÜŠ¿@e(ag‚à­€Ù+QB_Ï ŸQ¿KTX£±gR~6hÜTsôãûp»ÅÔ\å¯|—(áéù^qnYM@¶¤§1§Ñ„";¦NªK`ÅØOæ##jm»Œ NïA1HꬌDÁ®DÝtŽ®”Ñ%—TÙ³ @þQhÓ©¾4 <µ¶¶Ò××€Ûí&ª~Ϙ֙¶·“ëÍŸ+,Á 御!=üo„®{½ `7¶_9á,õÕØÞ8NÝõõî»ïNio}ôQ¦OŸ®Œ žÕá+‰”Š…§6_c:Æårqòý-Êlgh€®¿è ñgÒ+‰‘|•)j½ ™L@Ô÷lÑÅGCw½ðuÎÛ=À@ãUºŠŠ.>òt<wlÛ¶­("©ÒRñüƒ£Á„T¦¾7ßwÑ>Æ Ë¸™€ADÏ5šoy½åü°»“~KDÝ?Ľ‡|Œ ¶¤öÍ×düíýã pWb]ÂÿÆ1¯|?#ñÞ%õ»îwxÀ#èÁËÿí¸æjµž¨œ­ïÙ¶m›zðxy(V±XŒêæ^m¸ßžh{65;‰Jñõ4?žzê)žzê)}ôQ9 ž IDATµM¾+å#ã7H?~Y³fMFó‹ &¨rßÒÒ¢·¶¶ª<ȺPì³øËŽ›ÄµÇblÛ¶X Ù®ÊqšÔÿÇÞÛ‡·QÞùÞ_…’°6£8@·PÉö4Íö%‘”p…¶±!~ 8°'6I¼Û8–÷¡Û!ÇÆ<Ïv¯{Ó8ínOœØ9dÙÝ$`ål)À/;[šÓXRRÚÍ‚ü¢K!‰•-ä4”2Ï·îÑ=£iFÙiûû\—.kfî™ûž™ûmäù~¬¾zÞ3Áª]ƒ€ézöPïÇ–-¸ìá‡5÷~ü?w µµç7&B/àŠŠÂ *š+â…˜‰BsEÿç»,åËç¿ßÿÚ´ù¯ÿàÕü_‘Ú/ÿÓÿžöÏ+ñxÜÅŸÝíäd~üYÃïcm/,D<çA¼%Ž“ñTÛ3:Þùï?@kíÓ5܉Qh…\—ư|ñ퀟~~”õùwýŸP÷›9妼¢ìf‚ ÿ3‘&~<<œ³øÙY–•²+Ùïâu¸ípRl&kMb±˜kQE០ý¬ØÜaäO‚¨ëF•`îVU]­"Īcûdl*EÀ§€Ýûì¦uÃØ´b6àíϬfBÛRZAF#øE„Õí”Ñ‚uóLè…ÿ° p¯%§U¢¸ 4É)={›bGÍo¿,ËÊxùëøm÷ â•à3–‡‡ÕtõþzìŽ0€è1`ÿþÖ­Óæ§7Я³ ÿNIE] <ÉçÑ—‡‡ð?ù5¾ñ'eXTDŽЯ"eŠ‘oôk %®˜è_k˜‰ó‡".”ûµÕ>—(Ü—ŸfÂÿÈNÌ„äÃd>(giX„éyîÜ4m2+ÀR†?QU]ù7ܯ‡]—ñ¯GÙØÄÆû]«X,æú\§¬”½u7†ÆëM €ÈpDü/˲ÂëY ˜ø(å/Œ²ŒÓ«žW rÖ/Œ˜lbãÞ¦òQl*ŦòQüù ðD0ß™± ~S"c៽(û—_h7þé#A|Npãcì|cßâÈËÛÌÇþ˜²ÇÞ&v ÷6ÅP×™}î‹Å\ø¾¬Vh×˲¬\qwŸÅêú"$g!…SÆt|ù` ÊYÖŒ|<ºãå¯C–ïF¬û‡71eY){K[ÿµø'üªð?òË0pÛöµoŸAç÷;Ù¹ndãk\§”½µÃ×Îra ‚ ‚ ‚ ‚ ‚ ‚ ‚ Â9²ÄãqWÇ {·#)Äi™;ͺrz W’$¥&)ž(F*Â$gÐãÁ  ŠWB"ñ8jÚS/œffeç]hmÖˆ´³Ç]ž­í 7à˜ º²±|1ͤÄÿËT¾ž¥k^lgÑ5PÂá°+(Í¿éE J,G¯)˜ ŽõFS)úÔ‹yô/߃A¸+zÐ^“À`PÓîÖDEv¢Œã&ëKJJ‡Uô¼ËÞ}MêR"¯æƒûŸOáØ³Ã€ r= ½yWŒ¾Î#óh¸\h59˜@$Tô‹nyýéô(ž`°£&í¾ð&ªà_ï o›p굘¿ðcÃ4@zݳÓ÷Çãq—§ýóêþÍq5".ÍxÖÖÖ¦ÿsQ´Øý§`èê}<Ut h¿Çã2<žB-qDÂ4lˆ¢}Уö_ÙÚžõUŒ/gƒtÀ ²{"‘0—!I’jVâõzQ\\¬ ÿùy‹shý\TÕg>ÆO„¢èNêåRæíøVýÂá(êЬ™kOåµ×#AéëhE¯ß‘>˜?]‰âÿb¤æÁ?Ó1%»îKÖ…@  Œ'_¢·¡\š=UUU8zô(–-[†-[6cñâÅEii)FGGQWWçè¼›cuüµ[ÿ¹xñâÅX²d Ž;¦n…ý@úÜs·‰ @®ˆÂþææÑÑ1@Ê ÀIÑ¿h<Ç—%IR ¨Dñ¿×ëUǾ^0Ž)h›,dÿWˆü­"ö½EEE˜3gΟ?¯I# fzî)))ÁØØ˜íþ'›ÙNò¡ÖëUÇ™¶¶6466Ü㪹 hBx÷ÝwcÙ2æôÅ××´§Lr­|þ¢ÿ›˜(•n7^ÞºU5-Èþ[×§Û?¿`²¹«;Êžù›%͹ÿð‡?DUU¶nÝŠ-[6ãᇯG÷Éð –«i^XòHNFL—Ú³ S*ãÆ¥pˆƒ ßkŠã#iJÁêk¦: ÎÛÛרëÅùï¡C“€Nüÿ—?fë³ð½¯ÎÂ_¶¤L&''-ço†Øöü>6%u Ó]³óo®ˆCÍ?Ãï?zá£Y”hן<àvõû—’?«>úÈEMº‡Z‘²,+±ê˜fo­V\}RÜgMü¸·É±n?ß”ÊXX÷+À‰&m™ ¢;;ÑÅóŸ]š«ÛûdÔõ¥éñ‰ U«GŒlE„È#µ ££Y÷ùM©ŒÏ­Ý¦î+’‹ÈÙŒfp2<À\»3tš t&¤M‚ ±®SV˜(ÒÜ á·Ý'˜H1y+ÃáKÕëÂEü/.…ß—@äè5ð/{¯¿¦½÷Ü aÓŠÙê1ûâoY–••ºhçÜàPi©jv 7—•ãÝÿ@*¯EuÀ¦r?Öå'þÏÆ¬#,¾ý‡à"ùNE)kÊùx²,+3g¦Bxsñ?À \Ã,º»ÿË­Iñ?cæÌN w²|Ëš6áÅ3ïæ\3ì´enC,{b$Í5ØŸÂη®3ÕÎÿ®ûqüEÃ}xòÉS׌¼ª~¯ëÆÞ¦29ÆìDZëÿ¬Šÿù}»>¹|ÚŸÏ¿ÙÄæù;:¿¬š|Nq¾_•eYë4ÇãõªÂ‘løÎ(Óš|Òöµ[®›nº)¹´Eûwh‹Sž'¦pñ?À F¬^o*Åö>ã}NìaíP²`CPáFèçÛ_°Ü_|®óWà¢í·ÊÞFIɵœëûEñIò¯(þG¸fWÄSM6nONîËþåx¦íAu9àb&ôÃf;dA–e%Kþ^–f ÈrG^Þ¦¦Ÿ‡×àﱘuâr~ç}p÷Y|e'@Jüp÷YÀj0S€Õ(vÇ4F |<ÕžãÝÀ½2qñ?À †¡÷×uÊ€\‡½±½êº¦šÐùýÔE(äøGAAAAAAAY €”8¾y<]úÌ…i…z Wÿƒ½KZ™|)Y/þçÑý*’Ñ©*âqh·8‘H¸*šCê[E³ps\üÏ×uèà|òï¡äúC¾ €ÇÙMfY=Y’$)‡ÔÈ£\øoO“f&ºÉU ÿsø}çëÍî¹Ý¨o€6"ÞeÂz.æáÂcŽøò½žÉI‰­‚Öà5xªç]Ö©&ÃÅç'ï‰ãä³À’;Râÿ ÿÂê¬g"aû<´1{ƒ[¼—‘H"mÛíNÞätݪÌdr}R×À…\—0ØQƒšöAL„âhØÀ¶µ„$$*¨i÷äUÄh„•ñ¹ªèD/@IF¾Ë[€”ŒXŒ¾¾>T'_4æç,Šùw¾Þi¸«ÖëEïä¤F  ‰DF5Ñ ï¾ûnŒŒŒh„ÊN19ÀêÿÀÙ€·Æ#~î‚ÿEéëÎæ.‚ôñnÃúW»56Ozý›q/jÚŸ.H´oß>¼ôÒK겑àÙŽyM&x$Ê–Ð8Ö¯_xá…I1Nh\‚ßWø(Ø"wù+8v,{Z;¡€´z Ξ=‹[’"Ëú÷#H|å*üãí®½&¡Ö¯‹ïf5|LnimE0Dqb+•““í‹_Åú/Ô{·Ç§þGªÍé÷‰Ÿ_`;ü(¼5žœ¢gŠúºlÙ2tuuö7ýýýغu+¸x@^â_ý>Ÿñ³YÜÛöFpå›-h¸¯5vñdJÇ…°úèÌ…"(\lZTT¤–AdΜ9¦"Ø\òž9ø¹òÈÏzñ¿Qh¯×‹H$b)ÿx<îòÖx`Rc¾sàÀ„j²%r©˜„*ÑýxJüÏëªè•‹Y’$¥%‘PMظðßžFo°çûrxþðx<ÊÒ¥K“‘§ÍÇž[o½U5¦ç£Ü XÜë¿(þ_¼˜Eããõßdî‰D"ÉÂ3¯áp\`J/þ/))à5cHI ò2áÑω‘Ïõý¾x­yšBšLGÿçTþ¹ Šÿ‹ŠŠpöìÙ¬usöìÙœMDŒÈVË+‰DÂÕ;1¡P眣GÂ+? ¿¿ýýýì¨T4¦Ì¬Ÿ‰¿ypøüåèÑ£¦ÏYzÓn•o}Sˆ’g-••¢‡Y¿ËÅ÷<_>3#_#¦©~öPïÇ–-¸ìáTÔÝ7Ÿ;ˆºº:œß˜ÊÇU Ìifýíù ÄÇ`؃öš8ZBöîE¦ùïÊ•nt¼2 ü8 |5U¾÷ÕYXù6î}ï•I @"‘ÛõçU|žÕ’p~cÊ8;gŽÑùw ævþV…R>r-}ï¸Ð÷õ¤ñzó}òAŒ¬í[ëÂû}PßzìˆóåDS /nVø=¾(þŸ]  ªð]/þ¯ª®ú€Xu ¢‰Àõ?0W¨ŠâO.8¶#–ÛÛT†î]=˜@`ÿ}<7¤,Ë ð/¬Ÿ‡3Iá?ðÚî3h’e@Fg2@èŒÅД$²ó”“Q¼#[ËòÝÓ†í•MêRÂþX,æúîvYypSªmß~Çêä·”qÂöd´ø½Æÿ2°þëñx½¸¹¬\-//7r:oü›ÁÅäChê|êì„Qdõl\\~Z“'ÿwbæÌN\ÄiìZv‹¾¯­ÛJY\ÃîÜ®.ïóoÎN*µWO$ï÷pðÖç½ XÝv;Ь0 &@æ&vŽumĶmë‹Å Ë2þߨø·àèÀe ,Ý—Ž+?š‡Û0±X uÀÞ& Šê:™zíÚµ–óå÷ ÈÜëÅÿ¯»\øfL+þu#ñ?`]ÿÙ¡/ãXî~¼=«';³:™}€õºÔûYŽç%8öû®N[‰¾ÇÄÿÝLüQà[ê¦òQDGXÑ6ѽ«]Ý@cCòú •âÁM ÔuZ7É”ŽGi«ìm”$%ùÃ8 1r{II § @‰ð},¹Ü$Ël\‹3<©1.VÓ˜l*uTü½íWÌðç|`ži{w¶~ÿ‡•ßà™¡Ý˜ãTfiÆÇquì׋ÿÙú>pXÌÌ]yÞÁ¼‹±º¾(Mü¿º¾H5àëW×kL’f:Ì0å·Ý'ÙÚÜÂmú€ùeþkˆü2 \ÇÖýë÷ç¡é£&D~Æðu‡Q'׆¯; ¼4]Û„ÎOt23¹³ }AAAAAAAA ¨/7GÂ4‡&PSœÐoyšŠæ#/áŠB.,*jO¢çäÉ“hllÌMtnƒ@U€@ •E÷–?Àñ›ˆÞ€a¹¾¾^]çDc„(þ€‹ï ÔüiðúçñxÐÒ*i¶Ïjþtî&EÿúvÐ\7osl(BE³”4Ü‘™q€´'o QÔW}s׺<½¿Y3<¯ê ø÷ÙÎÀ¿þ“øŒÞŽ\DÃ}è~|•hÁÚ³À&G1÷ó±Ø(}!Eè\| ÀP|ZTTI’0>>îˆÕ+ˆj¸ÑA$A{MêÙ"4.!4TåƒÞ|G4ßš]´€±áÖTšð1 òÍt?>ˆ†û˜¯Ÿ‘}¿²ñtgγlM¸ €¹ŠÿEÜãèêêBcR`k4ö´¶¶ª}ç>õ),[¶Ìñ±h*Æ_.ö€ãÇcñâŨ««ÓÔÿ^i½! µ‰bGæžñxÜÕ’”äÔ þ곌¦ßyêÑrÀ=ßÊ;o3üþÌŠFQ­’î$SÝÿMgþüøòall¬ uO™¹½&5ï(d‰„:Îöôô¨Ï3fFƒƒB£ì¨AEccšQ¡2Í_2>g%ûÄ`0¨š8{{á÷³¹Ø¾û´æ+¼<;ÞÁÖæOcË–Íxøa&á{#|5Nܵ''#¦KáÙC¼@ú=‘$`¸k]àéÍ|úöH›ÿ&…þ¯°ãÎjþ4š‘Ê¿ù+î4€\òÍõHÎ'Ôï€æyßÉó9ò›ç0anKÐ^ÿWÿc5ZúÞƒkxÈ‘¼|kÓ/[ôI…‰ÿïeu ìJ&þ@NŠœ‡qbo ‹êRâ¿«öŒ¢î^g# ÀĆ1&þ_Å”ûD  Öóa¶PÍ/Œ¦„übÔûÑÑQÕdÉLo+׉‹ Ë®Œ¡{W X?X@øháðH¦Ým!^Ë…õó€Ã™ šÀî çùçpR&™òÒoç&fÛôÜRüè¹ìÇ£k[E–eeåh*Ôµ‘ø€*þçp“Ѹ Ð,¿ÿM E\p ž¢˜œS×9l«rÑ¿ÞpàÛðï ÙM=fÎìćÃM¨–Õ2YÍÛI¸°v |ÊNÍò·ÿãFöåYhÿªŒj–|ÊNnú€½M1,ñ‹ê¬‰óy~ï”2­rþu—K5àßÍÌ) ‰^?üŒ7›~†Ïv~'öÆ4øÒÒRÔuæ~ÿeYV˜èÿ€õZav’˾Žßvÿ#€õˆÅöA–sÀG¢ïi–¹!@$ú–6\£1àð>¸aC Úù';^þ¿Ësñ¿ÈØØ˜Füï-.ÆÄøxÞ&\ô?–-¡ûØø€ÝgÁÀ)dYVÎV¥VÜ´w–³ßžEñ?œÿ‹¿„üwßË]pn`+Ï;¨ûÇÆRWÆëÀÿÞeY9¸â,&þçÂ#xÁ@mozslD~©50ä†Ü`‡ñ¯ßŸ‡²·V &þÿÚ·Ï–}íÿbÛšÏbøºÃð”Ú›AAAAAAAD!È*á/áêaÂSF$QEr5^4‡&ò~ — KÆM¶÷öö¢&‘@È Ò¡¸ß8€–Dí’uQl¦ts¾óÏàr„ñp9îÆê²{Õu³Ë÷À½5%[5íƒf‡MC’$¥£ãhHGŽGW ‡£ªYÀòÅ<½?ÿo%IRŒÄUüúð¨Ò©(äéâãǾ‰\^þq»ÝL̳?þ LÌSgòò= þì%ñ üذpWŒ;*ˆæÂÿïáðÕxªç]lLÝ hFâW<ËN9 F£«˜›=ƒŠ¹qUeI’”DÀÄ8Ĥ*›õA¡– Õ¨„3Q™€4à¬0¾cÐc*È̉˜GMZ*Ü&4ç.ø  .°/†é¨ñj¾7æ(†1C'è…B¹"I’’HÜh¼QoD¼á€=«l#<´ôJàÇL̸7o1´$IŠ(8÷z½X°`€tñaR(éX}ï¨ñÂ[s€v|LFVx¿ÛÕÕ…‰‰ lݺUѧu .ü÷- z$ŒpXo¹Ó¹0ŒŒPà¥ñ^Ôú|ØS_‡ù ?FÀçCMqƒçœb' WKHR®®íÀiaýõ‘'ðXýãíŠÿõxރČ{Ùç<œÎ@{07C’ÉÉɬQ¿9UUU˜ªµµ]û÷;&þ•$Iéøh˜¨ИDöý x³EMß+5;n¾Â1šSê  MtQ^xqöìYÌ™3ÅG óò/ý›_KˆM™nˆûMLLpa°åûbd¾ËÀL·_FíB!I’R)Ô7ÿ7¿þ“tâ ¡Y*Ï©>J’¤´$£ÿÙŸÇ~Ž”Y@1€Cf(ÜÜÃ[ÃL6Õmmmmhll„~ìÓ8Ù§rüå¢ÿãÇÓÅ«ÿ™Ä¾¹F~ñ×í6½~ÁàiË×pÏw·ø]’$…‹Åèç~¿ßPèÏÀçó9*‚™ªþo:óç¢ÿ³gÏnÏÔ÷ê÷+))ÁØØ˜ívI€l· ŸßØo‹­­­šç™ÁŽõÙRìgÄçO€Í—Û°•W"‘pµ¶¶*âüe°£Æös–Ûív¤ýsúûû19˜@$Âæe¼¿Ý·o^xáœ;wuuuªé”ÛíÖì_š§Ót<{x<%ˆ«¿A)C=|þÉ¿÷ïìG¢’]ÿöšÍ¿’ºÆúü›¿âÃ0«ðßû8FmoÎÎôßòôõ°yçDÞç¯GŒÆ]îW°jû NÿL0*#ÿh«Ñ'µ?épC€è“ |{Fñþ½¥ªŸ³·© ‹êÒã” PŒN¤"ÔHÿ‹Âs;Ççß¹èÿ¨qÚþ¾>ĪcûÒÏNÜïÂ(púþää[–e…›.€Ï¿X4¯ÿoZ1Ûmž¿ÈÂú”ðÿµÝg°°~n;<·àzŒÊ/˲¢ïSŸ{ö ¢Ç€ÈÑkðÝíÆçmWoÆ¡ÒRf~ñv /n#<Ëà¦ÛQŠM壸=€c­ Õ”ûSmôæ½Q¼\§mûª˜\¨×ÙeY™9³S]Ö‹ÿ3ñá‡M˜u¤Ëšàîć6LôÿrõA,ô»ðZDoÉ DÿBÁËÕP×]ðrõdYÆM·<€åKÒ#b‹9° ±X,)ú/SëZ]'»övË!|v8u?•–É:Æ¿s€ÏÅÔèßÿgÌð20’2€y³ég€7›~†Eu_ø`ÒyZ„×Ûñò×M&©ö`sƒ” @nyÝ\f\^½!€~Ü_xDí‹6`ûÐðc>¸)aÚ/ÙeøºÃ(A ö|·ò="C–eå›Âøj(þ×ýLî“!š«lZ1ÛûdÄdvœMå£yC†‰ÿÛtìðf°œþ¾>ÄbcÜh!…¸ß¹ˆau^f‰€ñ3(G4à&FdËßÈ\‚£7à _w8•ægçàÿò\ý×?Â×¾}ÿúýyèüDªßjú¨ rþóR‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚0ÂrŒÈH˜½po$îoM(Éïþ€å&J’$I©^\6›Œ£8CÄÊÊJìÀ†x<«hÅG©xîuè_„ ì^ n5Ž[YY‰Ëyš ŒXÔÑÌûttBsóJÇÄh.øÐ>8 QÜÇ]ƒ`âðBÝn·æ%{Ñ\¢±±QØKß ,P_µT ¢9·Û wŸúµeM8 ,¹&mÛ᫱y×{À†0àpôGI’”óP’Úz.þþâcløEJü¯x ~?¿1igþ/^sñ?}ŠPý â~€hƒ(P4b7°SZõsNshÂrZ?4™ßËèG©ŒÏ…/A´ÇŸ1âdsEƒù].þ¯)N àó¦‰ù9H’¤¾ÜÊÛ S/ÝëimmU¿GÂÃö˜H$\FãÁ›b=Ff$úÐf&$Ž1wvþ×í,Êä mÿ?ïÏÊ IDATÑ»<";ÀÌ&z…yˆ¡0¾ôÒKùÖÀÉPÈPTãvÔ &YG6oÞŒS§N¡··×1#€@  —| À :ã‘0¾µøûÎö¿¢Jé»§0áÇiiÂÑ Oû¿ë#O¨Ëïõ6£­­ ñx|>3É©«ÃÕµ8íÿfõ6矹PçŒm.m?ØØ„wõ¡¢9·zï®Ç]ë:pá,3C2ŠúÚßß®ºk]‡:gpJùõOSßP¡Š­ýë? ì»Q“&_ŒÄýú±¤Æ3Ù¸vK½ì%ïóçÏcΜ9€ñåã(B‰Š‹‹sŽB-I’"ŠÄÿz =lìM™d20‚›ï´´@ àCuµ}}}ˆD"hm]([ÕRÃ-»‰ÿ»×™Œ]•ûñ¿&ìדiFÍ÷±kºfÄÈH*Š(DÝßߟ6ß TUU©óaìÉYø›BŒ¿’$)›7oV—Äÿ–æž`Íš5y•ÐŽÙ@@á"ïmëÐÝ}«é~O=Zîˆ €‘Ѐá:ý>N …ïÿ¦3}ßk$þ·öÜ£à›™˜•!›ÙNŒÌìÀŸÁü õ÷/ ûo`@æùr&Äß<¸ÙÀT>géûàŠf W×vཤ±Ôúõë€tuuarr­­­hmmÅþý]ˆD"øÔ]{P—§Ót={xÂLbRóü!)„¯)N $Ì?g­ÐO˜ÍËó1¥ìÏyþŸnÿ|~ ø}Àœ[ö!vjŠ ç/þöÂë¡Sç¯ÇHüÿGfaRBÝs<¶,ËJ¬Ú8²·Þ®ÚÃÄïß›cïm*KŠKÁuÕžQÈ÷:+4ÿ¿¸ΤÉsmW<#ñ¿>꽞ªêjôÿ€‰þ³™䃑ø¿{—Þô'wÑ9ý¿¶ûŒáöþ¾>tÆbh’Óó÷{m÷<_Ûf fpQðsÏDÏ®kà_ö."G¯Aôà[ï‰hÛVð-ÕÎH ‡J™ ÀÊÑQlG)0Ä69Y÷¹ðßÕt Jç E\¸Ù©ƒ›pqùi´W_‡†™ÉÈç»™9€RÆÌöû»±¾ó}IÓ€™¸¸ü´#f$"²,+§ïa¡ß…è“ fë¼u^‹(Ì ÐgïØ±X̵mÛ:µ£ÅÿGŽ…5ßEØú4pÕu"Í„!dYVV&þp{Ò„ãÎüâöúyxΤÚÉË®Q‘(„¿>òNû¿€™\yÛ‡:Uó£ä_ËuA–e%{XõŸ°˜kl÷ÛîÄe _O.­°ÅÖ¹XÁ=ö)í¾n‡¬lBj®,«Ë‘è{ØTþž#bx.:K Ðß*{01>oq1&ÆÇù¶¼ó›Õà¯+CÀíøÞs@ Ræ%ˆ¡ 2ø¹óó–cΞȲ¬œ¬nZªøÿ™¡Ýx~ò[ßú]Õà|`dÛõM0ï6ÿókkFUu5Ðw1¬ÖšÌ3Ý%cy®8‹)\¤ ýî6~ž”ÂEªYÀêú"ì8l˜,/ü×0¯cð0 7 "H;ömà_¿?OMùemÿІև[É€ ‚ ‚ ‚ ‚ ‚ ‚ ‚pœVú~ßõedM4')ð©;Ø÷âbôööj¶G"ŒËüùÚ–d´°\ò÷x<ÊÅÍ-88¼G#þt¸ppxš6€ËQñÜëpBœÅÅÿGއ5õðõápápGއqäx‡r>g=zñ?'»Ïy@ÆãqÏo°£ƒ5hN º¹P¦«« ­­­X¿~=&''j©ÐìŸH$\ÞšsމOׄø'x žêy7ÞÃá«ñTÏ»št÷¯Ášp@À‘ë.Šÿ}_˜ßf`ƒ\è/>†+ÎÿKî˜%w°mKî°Ü¤-199© îZBBãR𨓉BÙz¿y / IŠÿ&Þ‰Jö"º?à7î‡ÜÀÆ80Ø‘{?Àñ#èôhÖ xÎ!ÚS˜þOAÍqTWW£­­Ma1‘H¸BãRAÈ€¶=éãA"‘p‰ßõã~ÿ|i Ijž¡qÉq¡AI!´iý›q/&z%–2ñ¿Ñþ{ªs®¼Ïóz½ñáÉ“'1<<¬Šo¹åuŸÍ›7çU×%IR;j@#€ÊD¨¥^¯»wïÆÀÀjkká÷ûó¹ø?p!Và[@ôHá°¢KçKçLÿËáâøX‡ø¿÷±—qO½6C]_17îÈØ¯ç´ÿ8íÿ†*¾jmm…ÏçÃüùó1þ|Uü±ãõEä¼ÑÕy±ß7jsÒÇ{4ØìCØxÚ’>vsf­D¿Ú¬_¿žEgíêÂæÍ›Ñßßþþ~Íþùö7’$)µï§d} ÷±ùE÷ãƒxö3j¤uÿúO21ö7¢öýGæ\^‹%­¦Ë‡@  œ={VÍ‹‹:ÏŸ?¯þåëDÃ.BÍ7¯×‹/Àù}0œ˜õÿ\üï÷û-ß—ÉÉIÕH«¥åª««á÷ûÑÖÖ†¶¶6 ¿ØŽöö5X³Æ«š89×6ƒ×G^׸ø?²ïWxö3ªøŸ×SyÕG.þ×ýÕÃ×ÿ<ùO~òyæÒÏxû7›oô÷÷£lU ÊVµ8>öÓ3þr/^Œ7Ÿ^ €Í=[B‚Á  ¢W·4÷̵,\üÞÛÖ©ëÅïúuO=ZžwÛçBÿhrnë÷Ÿ#߉D‰Dà÷ûá÷ûÑÕÕåÈõŸîþo:ó/**ÂÎ ÀyÝãÏn·;cÝãe*))Éë>ø}©ç>»eàä]†äs¥•ßÀòùŒÿn!æ;]ÏYñxÜ599‰‹ïÀ[ãÁÅŽwÔù§˜Ÿ‹¹ÝnlÞ¼Á`hllD]]]N¿¿L糇$IJsEs™›â]ë:p×:6l¯aí«¦8nVQSœ@R|Ϩ˜GsE\ÝÇnÝËwþëT=àâÞ÷Šç,~××ʹ©ë—ËùsdYV”²&”ûø¿¥ï=¼\çÃw™ fÎì´õÛ¾µ.ŸÐ®»jÏ(ê:‡ ,DBæDŸT°©|4¯2ɲ¬tÆbXX?O#þ?ž‡“»æ%ÅÿÀª©}:c1G®ÃìRàÑ‹[¯ý}Zeñèè(â&&[\üúþüÊ"˲Rve >ÿbø?ÁÎ]ªø¿aCPݧìJ{yòkÌ1ÿ›'§ªº·ž‹…õLõ˜ÉD Wöï76©˜ Àþýù_ë•£™]¸ø?:bž 7p Þ¡t.ÁÍ{£PÊšoû\üïñ¦~óuäzMŸóß~ðׯår°<Ü äÂ(4ânN"m,ô»rjs±XÌŪ\ð¿mÛ:üä¥mضM;ßÿÉKÛÔõ<-?†ý³ÓÂëàÿEô¾½>¥"ËÈáÛ¿éPŸgÆí×=¯)ÿ¸†;q}ä õcôœÝ1 %þ×qnqÆ}Xùvô:pñÀg|ÈX,æÚ~ø¥iãßÿ¸ìmÊíþðí\èÏÓü˜PSRR’×u˜ÕàÂÕ•!x‹Ù³w_"|ïŒÅÀÏóÍX ߌÅp±;¿±_ÿßY^;Ëëp]Žg†v3áÿO^íßÅ­ßõ¯cÌ]„¿mùc€·¸8mìÓ\o IØ™Õ9"pR¸(mýêúôuâ>ppÅYgëRüÏëž²·VàÂŒÆûÿþ/§/ù¯  ï¿½ˆ'Ÿ|² ýAAAAAAAñ‡É'2mÌå%\@ÂçHô=.þ_²d‰f}MòE÷šD!){Ä›qmmmhmmµU..þ  ÿÍã7àrÀÅÍ-ðlmÏ9 xGò$¯[…ˆÆ,¶?.nl©p£µµUíÇôu[4p²ŠešîñÀj~‡Yï·R‘GÙËmÆõm«h–˜‘yˉ°Èà ,ÊY -ŠŨÃÃÃêÀUÞrË-yG#æå·Z>¿ßæ^VŸÏ‡H$‚D"áp´]èÿÚõaø–óhLÎDàÅÿÿuýâ¬f¥ïž<žœÇ~¿®?1Ø&Fƒ5Ãj»3«ÿbo¯I¨¦|}^‡Òä#I{.ÖÎ¥íONNªÂ+•ïmkk«Q_“ó!§#sQµhØw#îØ&„¸Úw#ð~z¥fÇòwzc. õz½šÈΜè"Ö¸µ¨¨HBÍ£TçÓ¹ø?J­ V ‡&&&x¶t_Dó­²U-ªùõ/¬YãŬßëè8„ææ•ç4âÿ¤ðÿ3þŸâ×lŒ…ÿ ÷U¤êh´$Ÿ¯ø«ÝÅÉï<þ_oôìÕ’H˜šØA’$ŬýgÂëõ"‰```ÀRLßø ¤ÄÿúúŸ vê¿==7 ¡Xºt‚)¸9€¹´}I’”®®.)q¿/iº£7èéÑGýººº,Ï]²1ÝýßtæÏÅÿìZfnÑzC4‘³gÏb°#Šfûu‹ÿ§£ ê3XŽäúÜs©Qøß°!¨8ÁÂúyX°á px®©ÀÌôðûóüŠs¸-Ïèײ,+nJ rôDŽþeÚߢ£Ç˜<¸)ïnÏ?Ú¶ž/CCÉüñtDo© ÃCéû¬äüÏ÷Cûw.ÁPD{Èr¿‚!4AFgNõŒEjgsÏûî½àñ²¾oíÚµØ×tÖE€?l‚k˜™\\~—ŸÆ~ÿUXßÙ„™3;¤Lk{ µ>”÷ùó67;K ú×" úYV±êdØœÆb1×¶mëxàÔ?—D¾Þ§ìDݶuŽÿõ<'˜gÜvx®&X,æ‚,+ø_)£€BrûuÏöý¼,2:•7›~fºÿso݆½Msö±?sgؾ>eLÇL¶dÍ‹÷¯'›ææ"K\ï> ®S¶|ŸKKKñò0ûî÷%°Ø„£ö«ˆ™ø_ÏØØJJ˜,ß[\Œ‰ñqq]Æë ˲RRR‚þäþ¼ísÁ÷Úµk-—·¤¤;ÀLàb·‚¶ýèïzñÀÅþ·V~ƒ;ËëòTÚg†v§nZüä5œ¬‚œå¼3’ÿWTT¨ÿo€XÌ£þ•åxöãœ;ú–zìÞ½ÛVY¸øÿà¿zî>‹ÕõEééëÕÆ\~ïß*aõ‹ß{}=¾îpÖò—””`,ÿ£ªÿa&Æ3AAAAAAAD.d4È÷%\;H’¤ÔÖ֪ˋ³(\øë­·z{{Õ4\|R“H‡Aá¢O{A‹Vø÷cßü&^8r·Þz«¥QÄÿ‡YdÛ ­ÍÚį°íw[9ݬˆ~.úz³Fè/ÂïU$AsóÊdúÜ„wŸÏ‡h˜˜&'3ßÏ i¥ºÝ{o†u¬}~¿ÅÅŪ¨GÅ9Qÿ2”5‚rwó.Þ_m˜öðÕ¸' 'ŒfáÂ-àñx”“÷°—k\q б᩺åû Mzq9ú‹¡$µ‰Ž¤f&Ö̵.$ —$I ð¦Šê“ë¨Ñß슯EŒ„×@2âoRü”9¤‹¾Z1€4 )-ÂùØ)—ÇãQ*â^trÞþ8¡»î­­­iiCã’¦¿vº S;1!­ÄÄÒî"‘p…Æ%eBJõ¹`¥þÎm7®?’¤Œ?™Š©©9Š¡õâÃùóçN:… ¨‚D€E#æx½^LLL`óæÍغukNBŸÏ‡æ^^ÝÓ©eãb=Àñr P‚KR' ßZŠèc'…è‘0€Ñsl†a;8mìaŸÏô®V—ÅšmÔÞ$¤µÛîÄú¯ïs[BöÛ\¾B4+ýM<wI’¤ðTkkk1>>މ‰‰œ„g.¸ÿ7"²ïW©r­ÿ¤Flývä">㟕Ú9Ç£ð¶;Ýè£GOLL`Μ9ªØT_ÏEª¾¬B/Ï*BM™P°{–2¡`ã.7þá}(Uø_“H@­‚ɹx½^/:ÁŽxF¨$IŠ‘ùÖ·ê'°f { X4˜Y@ `2x8€^üÏëÚÛ‘‹ð¯ÿ$üHÕEM=½âFD~ýSÔ&뢑I„*Ö¿ÆÆFu}>õo*û¿éÌ_’$…E6O$óeëýþ¹üpW°Þ %$©Æ+jß[œÀÀ¹sj´ïÁs¬óÍ ŠŠŠPÓLÎ…»bܰî¥ÊÀÏ—Ý×\Ê b¥ FhçÀæ"ûLÏŸv™îç,‘LóO=“““ðûýªX¨²²^&еe†5]Ï’$)'NœÀwîø ü>€ÏmEÄù‡ˆÑø£nóOÿÕjœ8ñ6-Zd¹îMÇü— ÿhúÑŽ¯jú¨o_ü¾›ÕC¿xé»ëpôh Ë–-Ëzþ›•K#þçU",œÁá'Æ“á”ÙÂz&>ïŒÅÐd!â¬,ËJUu5ªP ˜à €•_e¿gpá›(~çÂÿXu 1¤¢ÒË`ëg—¦¢’Ï.6nFôÉ(Ö®]ké¾ðz ŠÿËØ ‡†Ó¢Msã?ðù#9޲+cy‰Ï¹øÿ˜®ãëLŠ;“×7ëq^Û}'FÎ`Q]neáâ ]ø?U|)(˜_|üe pma÷0?o*Åö< ¤ þÅõåKàj:Ô±1@Îñ¾‹ЇZR¿3ñ\êZ–›”YG˜ €³Ž\œÆSO>i¹Þë1ÿóv¥7ß8]ÊÒEŸÌÿg«X,æ’eYñ)Ì]$êÚ¨Y0ñ?ìïò ¨F ££xÝÅw{–}¶ý¯³@2­Ý²ð¾o³kgØ÷ûØõ´+€çæ ¥¥¥¸ýºç- àÇË_O ú“â¬p8·8¹¼/Yvþ‰-ê¾±ØÃÌÌ1:oØ>Tªš˜][~Ïy6%Ò÷x½E,s}w»¬R²|öDðâ2ô¦çÛyTú²·Vo`¾f{±œ§5»÷›‘õõobb¦×Ô©ú§G/¸'x Þ0Оp@¬Z \¸Ýn[/eÏÙ)áüF–Þ‡*ê˜È_7ЛààâØ³CÚ™_Tdþ‚w$2¡Ö­D"ájM(þ wr[n„и„I€Ç nôÔ©S¦Çë ­NDEŒ$ƒŠ zŒ#M*ˆ¨i*Ç  Î¥/ËÏÅ^‰DÂ¥¯C¼ŒD"êµr² S?ˆÂëÉÉItuu©¢°H$’\̧¾¾ ï‹­\{+õïÔ©SèïïÏx³óÎ¥þy<¥¾ž½ØÇ…¬¢ÈPê—Ož<ÉÅ7èêê240ÊO\ËÏÛ$IŠ8ÆqFFF4û%óL»GvÛ¾ÿ \†âÿžc3УÚ]iý¯„£9¨8òÀèd"×vgTÿõm.Sùx›s2ú,3@éÍžÀÒ¥K1þ|8pÀ‰ìÑñÑpEj™G]7"²ïWá5È^û~<í¶æ=z²í+ØceBlwsæÌAQQΟ?o*>åœ?^ž@âö`ã]\3 ýürr2ãüߨ¾6WÄ6ö Ñ`d¾µreªÏÓ÷¥ííkÔg§ê?Çãñ(•o2ë¢È¯ ìK7£—#û~ÿ7²õ ¡ùå–óÍ$öŸŠç»í¿ó‡Ç_KmÓ¬þwÔxŽF—4sA³úßÓÓý8]tòa„O¥6†÷==7à©GË1ñ<{UEýª¸ÿôˆa1Ñ®c°mXÏTÔ¿éêÿ¦3ѯŽN° A­× ÅÅêžØÏñºÇ…÷½ø¥¨¨¡–8"‘8¸hªËÀrDô}I®ÏŸV™®ßÝÌÈeþÉ÷±;Ÿ?¦ëÙãØ±c¸ë¯¢®®Á`úøcf^atB㬞ù} Üõ×mýö(I’ò“Úƒ ½2Q©üÿôЧ0ÐþyËyèéïï×<߃AuþÏ}-Ïy ¯c$QªªªÔ>Оÿ-î·ôÛô=ëÈõ€#?ø,×&E½ˆ°(ß"âòPÄ%ˆqY$pÀºèÊŠ2‹¦‘eY@ŠâGù^YÙu_[âG.4g‘äçÂüuAàŒ&½¸|2< ë™!Àó8‡Ûϵ”'þl æãpù•³C\HF»fâj½@“sýÒ…É[oØjÉTþs¢&hEþ¢ø_¿$Eé€Àödt³ëÏEÀ?bþèJz­‹œÁd$eú Š ¹tåè(0:Šßò L$‹…õó’÷}qéìÝË!øÔÁ¯ÃGÉÃðö  ¹våè(%Ï3ÌÅÿðj°·+·sç}çæ½QÕDÒ¹åP0„&¸†;ídÃë†"ŠþyŸ9³À_eÜ]¤ré³M•U)kB{õÕˆOän ËÛ€”©ˆ¶Ì*òÒÛc¦vjÞ§Ž®Só‹Åb®mÛÖ)IA¸Ú×嚇׋øm·©Ë·6>~,sûrὬôýÙ¸åÙ5iåàõjûhiªÌ–Åÿ€<ï 0ï &¿·â}å¤À¼ƒ–òâ×pxÈx{Uuµú=žÅ˜Ò“|怛ËÊÕþ2Wã €‰øß*cu0“øŸ366Æ„ÿIø¾™à÷H{WUW«F¬ Œ¡I65€PJJJà-.FùŠ2õ¼¯¥æÀv¢¿³6 õI‘¿n 7@y=ži{sÂ/fÌ“ ÿ`÷îݪ‘WÙ•„žcŸ†,Ç“õ Ç~™×ѤQìÌ"üíß®Äàà`ÆüED?ýïå”Ð_fëx9JJJ°{¿úp aÇakõÎèÞ‹ðúŸ¬ YÇ/o1³ÌëÁ¥:ÞAAAAAAA¿h ¦[ØÛÛ‹Þ^í ·µÂ %\”¢ 7$IjºÉIÃ<Ú%IAR¸c%£>Ê\GMªÍ¡IC‚6Í„éµ2Bí»ººðÃþP]¯¯Ûí6|ñ‚ß#£ëŸíåg}þ<Ê©øÒw¦hÈFyók—ë5M¸øvª¨œIeùiê€46fxÿ­Ûèºòk§7Yr‡Vè¿AÖ¾ø³á_º ÷³‹$IŠ^ ªhç#¾æ×ѬêÛÛí6lbÌëݶ`„ÝzÄi¶Ÿ•ögvÞ@ª¾dêì–»PãA¦2õ½]]]jž™ø===¨ªªRókll„ÛíÖœ‡QÞvê_¦{Àqâð¾cë֭ؼy3&Bô ã¡(Fäp¢^œ˜-/ý=Ô×?ñ~àð4K—.Uû‰5kÖ¤‰€²Ý 3zŽÍHþeËiý¯Éø+ÃŽ P¼&¥ï²k0!3]>Ÿà IDAT9õÚ ½üSÀå©ôó‘ÀÿÞw@ªOöx<š10›ùK¾}Çný3šËµ9£ñÌ Í)n·;§qÖ‰þféÒ¥jS»ã¿x\3Á¿(¾6Üžÿ@ïUÍpgð‰ðóŸÈò’µ˜`ç,Irn_fˆbR,‚ÚÿðèÎFŒ/œ$Î"«h•cdBáÔü?‰(‘ˆñþz²™o% ÔÖÖ*\ìæ„Ù–¼½õ^ÕŒÚ÷;°úÅEý€q}äu7­'­Œú¢é~þ0*ÃtÐLåøË1ªÿ5Å t‚Ê´ú?.©Ï§íƒ©ú¯¿Oü° LtË¢h‹¶¢€s½9ü›0qAFgFá–U¤(7‚ ó?òýšt&\Ô0‘¿n 7@.‚Ó¯ç %þÒ«âd½A€þ8òd¥=b^†¨Ñ¸ Àö|99®Šú­‡›èÍö€î]=@–¨ð\ø‹êR&åWÎÆedžC¥¥ê}É$‚T dö÷yœÃªôâæÌºuú(Ôll{p“uƒÙLˆbh}ðçþRâÿ·?³o¿Ut}HcÌ áKAXŽ~.¢¿¾å~Š?]üïîÄð°°ŒÜÚÙ>óçwá;Ïþ1\£š4¬4)òÛÆBxÊCÙmµ\²,+›V¤Ú#H®ÇJ+Ȳ¬<Öö^NvŠF¢zÞßÝwï}x¨õ!ÇŒ-n.+W¿÷÷õe¼v¼ïâ}´Ø÷ZÁjߟ˜°d,àÄP<ô9@mâ[,ÃãõÂãõâæ²r<Ôú­<5u6Ùæk{ ðøžÇÕtfFFãÇÍeåx¬í1GëÅØØ¸Ø›óVÉÛ(Aú:ý~ÙÊ ¿å+ÊÔmÜ Û1&ÆÇQ¾¢ m[ÚXäx¨Üî=I3¸³õ»šå€ërÍò_½Üe¸ŸQ>0ûË®ü#õ;ÿ éU3žnøƒÿk<öËP’^–χœ߸èߊðž0´>Üšsýge–•¶-ì9D¬ÿVàuE¨—¬áAAAAAAAñûú¢´™‹@FFFL_¾å¸Ýn5+'S°l/%K’¤ˆ Þ‰Täq½°@ŸNÄ®8G/nÎñš†B-èîŽ``` ã à-n4‡& qêÔ)õåg+×@ÆëoU|¼fM*Љ•2˜å­Bi–ÿ¥TÿÌDûza‹]¸@Á(O~ýÅ:’í\ÏoL@ñ¤–wýi6në6M?g§d¹E_ؽàbPýýšœœDUU•*¾äâk=…ªƒ+íÀ¨™Dÿ•Ây dÉŸ§Í–N̺Ï]ÏTµÇLmȯïË r©Ö¿lf!\„¨ç–[nÑ,‹yÀpò­èÖÖVÓ1Èʹ[¹V^8SÙÿöæibœŠÔ¹µN^Q„Æ™œœÌØ÷›å7ý_¾íÎj›ã\*ã¿ÇãQøü«ã£!ÀÛ´"›·#5ËÝGµê½Š‰È펹•••|¿4A¡K—2± 7Г‹ø`Ñ|9¢5º(ªOªR¿„…( ‚€=ÇrŽ>]óI’3ñ1‡_sÁl@~¦ ÙÆn §á¾ Íògü³4ËÏ>ÀÄ`ÍŸ(7싦ûùãRhÿS1þÚ­¢ >eÑÏÍê¿Ñøh§×Qã5c 5=…¨VŸÁ9SÙÿMwþzò­{œ|ŒQœ(ƒ•¹0}ó¯l¦cSõ»ÇtÎ?ż§ãÙcºÇ£ü[žcu8²ú=À€ëFKùW*?Å?=ô)uݧÛ?ŸSþSyþ\غýðU誼‚è…þ®¦cšå—ëRýå¬#×ãÛl‹0¹H‰À² @y$æûî½l 1ÍÊÁMô¬Ú©[á×.žÜÅž_n;<â5¶š¯™@.é2åÃË0Áÿð©HË¢)€ž† AÍr`Y@³¼sûí29šã•C¿ÎîùgJÿçZ²Cˆ‹÷Yß¾ìä#"ŠÁ¹([–eðÚ¨¾çsîv"×ë…﹞¿>£óÖ§Év rÁèºY¹–fûÙ­bßg&üæÑçêïÌú\3³ ñü2õ½²,+ϯ8‡ÛÏÍéü9f×A_³rdËsÓŠÙ¸fÕÿ—s¾ÜÀN¾FÇãõÐÕC£õ¥¥¥ªÝÄÁ¨~êó())ÁØØXÖò‹Ñàõ峂‘øÛŠDÏ#ÀÙÏÛì8b™êýùÀ*অêò_ß܈¿ÚòmÓcÎ ¿–çlÌM˜‹û­¥³‚XÚ¶´iê¦ëϯ;‡·;»&âñÄú?1>®Ö%#£ £uNÔ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚°ŠáKÈ—¢Ð \¤‰X}!]Œä&Š#K[ˆy ¬3aõÚ[yùÛŒl¹äm”ÿïjýËD6!‚Ñ=П³Õó3ºVVê}¾e°’ÖÎù[ÉCO®uÑi1­^ìa'o‘Bö™ÊS¨ö˜IÈ÷ŸœœÌ¹ÎGðmF¡îA.ýÎæÍ›5‰ËÊʰgÏô»yž,ù•?Ax.âÛœ3s°bYr©FB5;Ñ?Í(dÿgÖçkíÚ_*ã¿x¯ÌÄÖüÏÕª `Ù¹Øß»ã.–ÆÂs3ø~ú}rÿsDª£(ÔEEEªv ¤¥³*D¶K®ó}žVÄǼ®‰uõÀiiíô;¹œ{íûð_q£º|Ƕyxäÿ9h˜V¬§b¹.µçéÚÚÙÇ_q̵*þϧþst&q¾Y},Ô¸k%o+cŸSõ“ÉId*ú¿éΟ3]uïR(ÃtÍ¿¦[üΙîù§ÙóÇT<{L÷ø£Ïÿ–W¿ÿùcÿiIüïdþS}þ™Ä©Fâ7¥¬I³|óÞ(~â½Ó4«â}^ÙDfû‰9Nˆ¿9±Ö§ Êl8ƒ—êS1š’uó`gpfÁgÚ×Ȭœ²+cðù«Ë¿Ùˆ†ÿ¾Á4ŸLâ³rM…‚Õ²‰ûÒé¢Ä\ð|ÿLbp#8Ç)!¼™¸_ŸÎ,_£:e–ß?Óy‰tÍ„ðF÷ÄÙÎK\ÎT/¬Ôñ:Y5 0[—K_cÔçZ=g~Œ„çv ¬à3í ØÀó}7­˜û£¯!žü #“ðÞHxœéü³Ýw³|ÌòÒ“)M¶z‘­~êEÞváVÄûâ¾FâïLb|ýùeZo§úôvÌPÌʘéúgÊ/[[ç&Fvæ¼TUW› ïÍörÞÛ©ÿFÛõi¬öËAAAAAAAái/á:-äd{w*VʡǨ\úcdK£Á6›Úìz[/‰Ø`çR†Lyçz§«þ•Åê1ÍÒ;-~µc‹àÕª è§N·;¦v_b7‚›è ¬0]çnvL§Û#?ž•k’kßk”ÎÓYÿøw3ñu!M@r=ý~ù\ûlå0ʧu [y2ƒ…Ì7Sfé­¶9£HÌfùZi›v(ôøØ«Ãzriw¹ Ð2aU<šË˜c†(B5ÚI_ñ©²µ«õϬ>äc`V–©¦óùcºÛ¿X±ù^û\ÆþBâôs¸“cðtÕ¿éîÿ¦;ÿK¡î] eàLåüÿRú݃s)<ÿØ9†óïé¦"ÿL嘪üÍ®Ub.8uÜNù\Ë`F®×a*h¹ íÔ§²èó+”‚“åÈ´¿]ó³mÙÄ÷vöË¥<ÙÄÐú}ò‰À-ßLåÉ÷ž™•Ë(o³íúòYm_Vï±]#†lØÎÚ¹7|›]¶ÙqŒöqBœéBxo´ŸÕñͪXZ¿¦íù–1—´™ö÷Ï¥Ó\Ê"p+÷ÐJÝ´SWÍÊ!ö…ì?ÌöÍe~—kžAAAAAAAá¶_ÈÎö¿˜Æ¹ ¬îï”((,v„……~N'¹"~ÎûRÁŽ(3v„˜—"Ô§'ÄPt͉ßEœèo²í—˱¬’o»³je–ÞÊ>fعN‹/…ù¿]S‹BïX9¶U~Ç»sˆBšåƒÓæ_ÙŽOÏ¿ù3ýßtæ)Ô½K¡ Ó =g]L÷øc'ÿBÔy§ûBÔÉ©ÚSK®ÃͶMG=ø]zæÂ¥~^—Z= ~?¹ÔÀv„÷Ô‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ˆŒ8p*8åOùgËWŸW¶e'óþ]@,«å¶s¿3åçñxþÉ·LfùY9÷|ò·Zײ§ÓõIm=rYƒâèµ¶šÿTž÷¥ÈTœ£SÁ‘â÷‰K¹]˜£}"AAAAAAA¿C¬\¹Rÿê¿ÿ¾çOAAAAAü~ò‡òû³ÇãQÐ %Mh«[Gù.ÿ¤ç¯_WÈü'ÒÏ_·Î™|´Ë\Ð, ›ÅeþqZøìñx”Ë3¸ç—âõ‡ýêµàßÒZ=®ï•šë+®Ë”V¿Ÿ>ç¬(Л/ë·™íc7¿W]ÚüÄe³t|]¶ýì–Ekˆñ„ú)¤ø_ÌSü¼ê‚棶òå®Hßö»ŒÑ½¿ó¼/ïó“$Iábfþ]üìØ±C¹ÅΗÒ}JSþÝŽY ‘úú/I’‚^¤µ‹©n'æuÀxÞäô܉ ‚ ‚ ‚ ‚ ‚ ‚ ÂF/7ê_~äŸßÇü ‚ ‚ ‚ ‚ ‚ ˆßOþ廬xÊ¿ ùsÁ¿™!@¡óç¢5sa[~Ç7ùë—Eñÿe Š£Âg½È™›ðôNäk¥\úeQèofÉÀ4Ÿ ¡ø^™¡~GªÀ_\æéÅõú4šï&çcõ˜‰ÿÒd2È–ÿ“íŒ ÜÅå ´ŸLëùqs5H¯ëO(Jt—ú)” €(àÿà ¨ß_uAQ”û¼ºAQ^Ýf ¦ãTÙ E¦6n&ö×çrŽ\àÏEþµµµêG\?U&VÏÁãñ(XüÊ%q_§¢,Gi˜Ý Þç†Ù ê²QšB•ãR¤Ðç›Qì/¬7KW(ŒæCFÛøwÞʰ… ‚ ‚ ‚ ‚ ‚ ‚ "#ú—ƒ»v)â:q[!^‚Ôç±õñç§4‚ ‚ ‚ ‚ ‚ â÷“Ké÷g}dàBå#¢ÀgÄSþÎç/d3(Dþ¢-›!@®yˆâ~ý2¿’úQtÿ‹‚wQ¸n&þ7Zï4™ÄþúeErYƒ¢ÿíC%¢(Š¢@ÝfÉ ÈDܧ»»•®`ß?¸JØGþóë•-½‘øß÷Ê Ë×ÍLà¯_öxõS[[«ˆÛ =æ‹Bz+çQhá½ÙqÓÖO‘^øo$øÏdàd/3ˆlýl®íAóÝ®ø_—¾×Êl¤]ÿ„Úå²%ã¼Él~ŸiþŸíÙ`*Ÿ‚ ‚ÈÌŒé.AAAAA˜ˆ/3:tÈܵK™èíU·{kkÕïÁ]»”C‡¹ôûåóR¤>ÿ­?¯¼¸w›º}UÝê÷­?ïxþY–•wÞyG¹ÿ[ßRÿêÓ˜­'‚p’‘A%¸ ÿ;ÝåùC`d'”‘Pº\ ÿ..Owù‚ ‚ ‚ ‚ÈKå÷g.Þi¯I ½&`0ˆ`0XpQÇãQâq`ˆWÄÕØöx<îò4{ ¿ò½Qþ¥"ÇQñ¸ú9ŠTþmZã<ÿ9ÿ ,.A|Î?«,.Qó÷xA<þHÎù{<åÊ Ü0àE<þˆúùm÷?&óx›+ŸÆŽ†ŸasåÓhhxEÝ—åïœ@4¢ Q°ëÐ.ì:´‹Ýk£ò6ÄqC·ñxܥߖiÙ âu …梦朚O<wÕÔœC(4FËðø÷/Çοu_ñ†ù¡¼º˜»«¿ 5Ûoíîôô@½ñŠ8¬¤óðx<ŠûŸOaòÏæ›–E_®‰‰T½ŽÇ㮓 × å¹ ”6ìR>QÙ‚“ ×hö©rý ä »Påú¼Tñ¼^ZGÄcÇ]ÿeÿeßr¾/Ì@´!ŠOÝÁ¾óÂ,}¶í@ªÍþ}޵3»nðªËï¼S•+W"A4ràõx±u뻀7*'ÔöäD›ˆÇã®/ü±ð£“q|ñg؆Ÿwk~±øb¾ø³ øâÏ6àG'ãøÑÉ8ÌÚ¦$IÊ/þ#óý˜jâñ¸ëç‹'ñÅãnx<å‹ÇÝøùâIµ®ŠëôË_<î†QzñøÙ媪 Ÿ8¾@@ýTHc¨ªª´¶¶¢­­­ bæx<îòœÿ3µŸÏ(À_üJÁ͌ʠ_ïñx3-o¾ãŸ¸Ç]×`àÚÄãq_®üe¥i]ÅÓåZŽ$IÊÖDB3ÿsz.h¥ÏØ5ñz=àiÅ}¬CD’$%ÑPëy"‘pI Äujš‰m×/'ÿêçÄõ±z.âÜ貆¯ã†/¼^/Ξ=›q?I’”ļóiF|½¸Œ¶e;&AAÓÃ'þöÞ>>ªêÞ÷O„{Th>6É%·3“Z«G)Ž­GiòÓÊ¥JfÐëVRcЖ¶BCC >\a&)^9>5€¿¢‡¶&B9’™Ïù%:;PDå60¡ÇS-Êúý±öÚ³÷ž™I÷Ÿ½^¯¨¬¬äçuuÐáPª€ÊÊ*̶)ði ²NúJH-Ì ØAÛæøaÂ+u´»4¡Ë¿uèö|Ñè7[üЬ^½ÚVfñâÅ4­l–øñ£¼ç|ÝV&uðE3ây_£ëì‰Dà²ùöB;¥&f…¦‰]g…–ßH7ÿ¨ÿú2B‘Çe[O[œhxš¶LHøYfÿu[~ñ?Ž®Ggâ•?À$?¼‘ ¾;B0ü˜ª)S¦mJCù vÐZ|&(žnCævo:#ü6e‘m©(‘"„ Ûòu]÷hQi Eí1¬iÎÏö±É ãKè_^;ܯ>«ý¸YüÉ$,¸ý8ëͺFô¥·iDw[ˆq·…8ú`”so ñäðÛB&ÔO[È4èoy€q–õûsLôÊ ¢yñ{¶4 úßË´ÖS˜z{úÒf}Û\²£Yš&6O–“ê—Ãi€ CéŒí _–UùYÅœ©ñÚ;:hšxí ÎÌ4ÐLûœŸû;¿œ€¿3àÙ% (·d”Ê?j§Y¥˜×ëgkÝ^¯WÌœ9“rAJKƒìÛ³#•Jyjjj„žUZ_û×WÉöΕכ±£is3Çxìã(£­{îP7ÁÖkl±Õg}wñ]Ø+yÌö]“6 ˜Û¯¹ öñÞ Z´–Œ}Ÿg`ùŽ<ZDËÀ;ŸE^¯W8w]*@•a ¶oýÜW`¿H&u|¾¾}‡em¦+êsûfËsÀþ¦)@(hÏ€ÿ²Æ~9cå’ê¯ýwMÚ”Çú;'&ËžšÇ”D¾²2ÚÚÚ80#ÉÇÑõHs€Üãr¨ê gÕƒ{{v/ qì:ù÷‹ëÈš>6®àUŸ+W®\¹råjäå¸råÊ•+W®\¹råÊ•+W®\¹råjXõ /x¬0²©‰dSÖÏÖ¿V©tk=Ö¿ýåwò»'~ZyI}¶þµJ¥&¾U%%%bÇŽÜ·|9ÍÏ?Ÿî§æ³Ü]s·-ý³fpË­·ÚÄç£ß%%%⎩T–Bƒ\…Jã%œQ7‹ÏÄ8Rµiã&Ûñ¿nöuŸ™ãQRR"žøþ¶´²E CÒUw,ÑhÿõÛ&²ÕÈß L#m0Tq]I9áÿöööŒñ½ñ~y]j[+€kàÊ•+W®\¹råÊ•+W®\}òõ /xJKKÍûY_øÂúuÿù‰kÌσ¹ÿ¬à«ÆŽKXòÿD*íF6¨ÀuZ0áÿâà—låf‘ZÓ°¼v—±Z·‘®ëº'Ÿ sÆWðÿ£>j+·zõjXŒ2È[|ÿû¾ôg[¹$_'~+ãC¿ÆÜ÷€ ÿ?»|‰­Ü5KW±'‚2¤YÀ TU¦º®{²™ôØ}™üPzž ÿ'ÚËÅŠìR&²ÿ6n™ ¸e3È çNòÃIA˜ x¯ ]×éîî6ã©•u•ÌHšFÙ¶ûž|w#gS浘”‡ÑZ-`¹I$ÜÞ†ÿ £iøÑúÙ:¾ÙLTž„ý%ôÄD>œÉÑøñ €ÌQaÁGIO˜Ùp~'…&±àöãYêÍ„1õh­š8‡ È´ï0? ÿ†B8.CœÓÖ÷òË¢ ‡¸ˆhF›Æ=¾æf‚¥ªMVµ34AÌôüˆ²äv pNÚ`Ûšù‹w~Á¼A!ÅÑÃ65ÛüÓ4MlîÔ™U,ϧg—$œCeSoù&übòseƒÎ­FÔY}Ô•É…ÖâC›gu»vîâÒË.%©ê|ëã<ïK\ì«ã1Ë8>5¸ ØnTÒßöôt.Y?ä:ÏrI×u¥HP õÛÎw ¢[>ë.** ®\~ÿj­šÙ&e$`…ÿÕçÞÚ‘:o6Þ77šFÄb0s&ÍÍÍ&ü¿bÅ ”!@_úץϓܾ­ü!ûþ¨·•×/໬Ô¾k7*èãyf-§ëº§Ek±™8M4MÕžjjE-ªËmõU¯¬¦V«5Û<ã½´œÞ2 Ó ¯øW |*•ò(èÒ`QÖi`ý<sÅö›c @°›#ø|Ù œ}³‚üVØ?kÙ9©tB ˜Ÿ[,eŒóÄf˜‚úÏö{Æš.÷YfÂÿSß*ç\¿ŸD"Ñgø?k¿¿(ûYvÚÅ”¸NºÓe¬é¬#õÅ^2Í\¹råÊ•+W#/×À•+W®\¹råÊ•+W®\¹rÕgUUUÙnö×ÕÕ ùÃ8MÓÄ]å:•A 1®2(Üþ옚¦ çÀ`xh@ãØ:tHdKÿ,i8æÿgENø_AþVSe@¶2jÛWQ!Âá~¿üè„ÿ­«,©t¥1ƒc/ýÖVFm_yã¢jÁ7 ÿ+)Èß Þ]s·m¾©<•®Œ>mR ¿üÕg«9‚Jo~þù¬Àì@TRR"ÞXÜÁ¤Õ©ß–NWÛkBà¦èg÷{h8¤@ø«ÏêE4k9¹:MÕ§úx(@ÿÆû·ÛÒÛÖVŒÿËD#[·É·p·B–sªD(#€Ê)ˆ†½ŸMýª«®²]“·lÙ2$ãÐüòxÔS"î ƒ _ж1”&ÊøÄ*÷:çÊ•+W®\¹råÊ•+W®\ NÓ§O]]]ܺo•–öûþ3`î;óY%¯×˪ª87Uǹ©:3=á‘ ¥?UÇ[^i  úk`Âï˜ÐcÌ#a«:c¤9~˜˜¥Vè.áw½[axÍÈg®*ëˆ?ö­&`µ-þüùóY¼x±‘—ßøk£qªòu[üäO#uðEÖFãp×ÐÆ¯Ñu*‘ñËu¢a¸l¾-þ5KWÁÎGež¥ÿПšfXÍT|§!€Ù}ð]Ùgóö“¹¦Ì~ücài‹³yûÉöñOƒqà¶ kš­ÿ€ÎÔ ˜$ÿÆwG€¯PWwQà[ñ£ëÁ`ŠÕÊç¹¶Ó«òö Þí­ôsFøíÜ&å:‰¸0Ëø+=‚Öôþª…Ql€²ÓÀ:† ÒŸ3‘4n§¯{`4Ü~œè$¹ÂrÁ‚ÛÛLzꪯ/&••:ïÿKfNøßšÞ[ù†÷»ðòy IDAT/!ˆDy%⢅:þÿYÀѹEæɤ­­}ê M`Åâƒ,a41޳äö« 3€ÇYÁ|jVËÕWYLV_öw¬¸ì 5¡ôÊÇN€5[¿Z5Ê=#  Ü0£¨lÈÜGåÛàõ×XÐ] lîÔ{5Pða‹3’]o‚ÿ=• ]×=d1Ð4MÌ*ÖØÜ©óê ŒúÚ>u>õt.eû<Ð>SŠ ñSŠÐËuªŒïÖn$n÷ïß@U‘LWF6°êÕÒ£\¸oúX=#Ï©ÎÕiøß!ÿ×ÔHƒ¡œtLœc*Çyn¿ ûþÊ@ëž+c™†˸‹ïr9°XÉc†!½­½]÷`Oí±šXáÿ9µ­¶²ª¥ @üÝ8À€á«” €3}°ÿ”ùáýfY¥šGâõö‚wBüVc•fùlÎ˵¼Çï^ç§¢²½ÞW™˜fÞPüßò­-Œ?ž½{÷rôèQ³®¥s–Ê:6dŽÑP½™Èm ÿ_—ú(2àÿ½þ¶~Ãÿ‡ªrVÝ9¶´pA˜…Ý $ðÚÅ´ýù%ÊN»€¶?¿DãØué>¦‡ªE×]¹råÊ•+WC$×À•+W®\¹råêoL_D„“á‘{{ü‚#õ#‚ #„ü~M$>³ñ]¹rõÙ‘à¬>oܸ1£ÜƇìÁœ¦iâÍêNΫÕXiyÖ¥¶×Vê`QÃg >Sð¿ó`,R)†Ê`ûöíx½^ó¯þ•!€3ýÓ ¿ÔüA ð9Õï}|o¼°h>Hµ‚ýJ¾Š hÃ4  |T˜FÖúÔvo/B抟kµ¥c/ýÖ| sÌÅßàJÒ/a$¾Síííž»kî;vì`ÿBï=í;vìà¾åË3 ø¨¤¤Düæò#é-]xâ£X?ž÷ù­ HƒþNðß93ÿ韆Ü}¾a_îq¯§D|ôH‡u³ Ç¥äiÐß þ;Aë>ŸYçeIIÉô]™ D#í=^oÒyÆJôá…"iàÓjàý:::èèèÈ(7€¶µˆÞà¥öövÏMí°&äCeÿ;¨ß–^†íŽ©¬ y„kàÊ•+W®\¹råÊ•+W®\ LÖûÅ €‡ŒíþÜ~âÁsßÞöz½¢²²’º³NÉOà»w® Ë»œT*E¤R‡cÇŽåçur[¥Y¼^/uuu}‚¾Lˆ4¤°"q‡í…=2O1° ž×îÒP«%Ób¬nüÕZ ÀL ¾·øÝçVð£«Ï²…þÑ3KkäAS^ã/ ¨ý᪬ãµ( øÆ_¡i݉†"0ïs\c-8ïÁt^8lÆW ¿”÷ adõ·Õ(˜†ý×– køYW|ÀæU¯ólFïOfÖ}’tÿèoÀš”‚Îãæ_lÊòÙ!8ÏE_3¶¾†‚ÿÇ¿ñüLhÜíÑùËïÏâ/á_ÙöQ°þ˜¶¦õGŸä?qÁ»‘³MÀßËÿŸ|w#g›æ$I{¥tšÍ$À©´1‚½] n?κF³îÑD#0*,Ì4€Ð%™üœ¹ú²çg­[ÂÿGz|ªLNù½CÊVò?rç½ÿ/`LÞ«¬ät€¶PVø_¤ áÑÎЦµžÀã;OÀeÇY4i4¼1šÅ;?dµÿo{àQj,qW=eîíó N‚Øö±P j¶ø³4MlîÔ™U¬Ù€þVMcÆñÌ™“6PræƒÎ˜Ãyº„r¯&ÆSÅêíÙ´®ë­Å'À0»èEªüP™8¥ãð’€…B^ÿ^-ý3èKÿ­`¿ÕPÃY&×>}5ý°Ê,ë€ÿ÷ïßOQQ‘­¬Ó¤€¾DGCÂÐîH€lJ¥RžææfÁÌ™‹ÙòL#€X fÎÄëõRSSc~—;a‹AÀ€M¬ãeøÆu›Òól°:ß>¾Î1ïï1°JŰô¸¥œ¹¥ªm3Þ›AËé-8MœÀo×Okj»åô–Œü¾(¬¿‡,`¿Cê ˜óëÆº_U“ˆlÇÌ ñ[Ó×ÐÆuajî‘Û DÌï$uæ2]ñz%üï yQýU†Þ1sRúñ!öïßÏÞ½{Y·n]]]feeeLž<™åÅËÃ`†a&Ðó û¼]–ó÷J6©ß#ß#LÑäɼüòËl;·µßðÿïù! Y`KW€¿ÿ­ð¿ÒÂnû>ª.Æö%²+W®\¹rå*ßr \¹råÊ•+W®>aê/àï,?hƒ€þþÎòƒ5è/àï,?Hƒ€þöÎòƒôG:¾+W^¯W´®LÙž-&ÑÁð§ôù$HÓ4±µüýŒôç9Œ'áDþÇÞºº¹às– C`ÆDÎ+[åC¯#â¤ðgLÊõp0Ò4MìÚµ‹úúzàîóùl†Ê^¥ÚŒ>)ó$>ù€¿„Oˆ @¿÷>}º°@þéñ3À~ŒÕ`þͶí÷Õˆ\Ù6ùÇWWA²J(3€¾Âÿ–—,ÍøêÅÊ1€‡Ï·W3oÝo8öÒo¨x°•¦ÛʹòÆ;M3€Á®Â´kç.Š ûU¶7h´7YáÿoîïÈÏo.?š@W^AÐ[n½UX ,}ŽÏy“a%ÛžµŒjǤÕ%bM¨cXáØ5!9WGÊUm úK4ºM›6n ò‡4è¯^,v‚ÿC©5!0Þc²ñ÷eàã6ñ©…Ûúe¢™ööíë¬~ÛD¦Ñ¿}†R‹B1ðÄG±/ðkyN8'诔g½½é¦¨ðHã†ìשÈi@ ÌNÖ„:>1×W®\¹råÊ•+W®\¹råêoEÖûÏOj–›?>‹/fì[MYãWl¬`õêÕ¶º/^LÓʦ~Ç_Sý“%ø¾ôg³\ò§‘:ø"k£q¸+3~ühï9_·Õ:ø"ñ^ãú¾U4 ëÿʳ˗˜I×,];•y@F®ÑuöD"pÙ|{å;¥&Î Úúo¬j«Ò6o?™k–œO0í=I¬/½ìR:ÄôéÓI$Àï—ç®2¾HœÌ¸ºçM¯½£s1N/Wÿ\x¢ïFªŒuÌÒ¶†–ÏZTŽ“2Т}‹“ˈÃë•p²õ;Ø*«9€2 ¨+7¾›K埞€x› ØŒ¬&­©ó¬m²Áþ–Ï^í\Ó4¡}Ü„åÕwÂÁ臌ŠÅ8# 8¾B²ÂÿFfKýj‹Ä—i#€}orßår`°’ÇLeà4ÈÖù÷Ûj8#@ûw\ORciíKOòz½BûU^ûjö{Œ¿­šÆxý™>Å?¢]kî÷•,ùÙ®Á òù=¢ò”Q‹J¨¹g&•ÿ±Ôšugí»øLèßÌ·Àÿõõõ$“Ió7µÏ' ~þ½©‰¶¶6›ÀÒ–¥}ëXÿ¨¾JS$™n7¾X&œ¿—üÿý±?@ÓJÙ·o›¼¿2ák,UOOmRp¿-íÄÅ„Çïßt§Ó•1@äDNˬËjàÊ•+W®\¹Y¹®\¹råÊ•+WŸ0…“aOÄjÛš§Ò{ú<(øàH½‡ñwsÛ*•ÞÓçÁÀÿð0Ç€±œ ÿd—íó à€h"á ùýBm[óTzOŸ ßtü¾jmezì‡cnµBS# z½^QQ‘Â/À‡¸ñì$ýÛ……ü°²ÕòôÅbñ»¶RÁ`~4Mw9îó9ÏT¡Z§òqý©ùÿI¸þ̽¬À\i'ŸûZW*R²˜iðÿUç×¾±ÍWò!°‚ÿsÅÉö"d¶øÎ—øÿ*¯ÛÒ×/+ŸÜòº¬BÁÿý‰ß“ÚÛÛ=w×Ü-Þ}÷]qßòå<üÐC9ë¸ô²Kyqû¶þ„èQ-]´·ÿ)#Þ7)¿¹ÖºÅ¢øñ¼ÍÇllOP¬2 js€¾Ô×ÞÞî©§D|ôH‡us~¡X+lŸNk±•¹×„<Â\)|Ûv`⬞ òï üW¦ƒ1w[þlµäM›ÚA%BŒ” €¼¯0?ßxÿö¼Ä‘ó½D|ïûWP9¥¡Oý}âûW´Sÿ~ ¹Ì2£l`ý´©ò8©¿æ±Ú6øÕêKJJD6à¿·k‘/®ºê*±eË–žñþ’~·_™• ¥œ}UŸ•¤Í\#W®\¹råÊ•+W®\¹rå*·JKKEWW—ÿ•.ýttXÀ~™wÓ{mû¦j¸uß>¹fçœ9ìÝõ8ô6뀇J% Ø—ûÏ^¯W¬Y³€[>@÷NØûî_øî+Ø¿?]ÅËùAUŠsSuøE”°q³ÿÞ¶Ø!øÊÊÅ=šèºîÑîJ¯RO ¬H†Äa{aÌ«iIƒþÍqYffÀn0ˆÔ&\®£µj(ÐÞúì&[üîs+øÑÕgÙêúÑ3K‹Ì;tYº‹/`õêÕ6ÕÆbh*oêWüE¡µ?\e««õˆ|¿±:@õ)iÐ?uðEf×a6GHnþ³mŸ$_'~åñã¯0LÀýB˜÷9®±V6ïAù7aôßiôù²ù6æ{"PÓªi(£ŒþP¥0ëŠؼêužµÔõ÷»Ÿ`Võ Ä’ÌtO[œ–ÚZj¡ú;#@(²‹èšÇ¤í@UVøàn.áÎ_~o™ WÀs'8#ü¶ä }Å+€I~x#A|w„`ø1 [|Î0¦2V oÕ„¿ÜCä…HÎ}rIô$'ü«ëºgŽñÞÔ† ã™ã|‡Ê!eÐp~úcè¿f”[÷ÀhÜ~œE“F“Lzðù¤Ñ€ÓdÀÚ.gš‚ÿO‡¹8m}Ô„ÿž‹FMs€÷ÿÅnð¤1=¾s[ˆ·>´×=îñý0WN tkùû4/~ˆ2ÓóSî#Vý@L^W¬2Vß+óŒ¿+4ËÔ„ÎÉ+¥J –Ã^N¿sP®Ûß?hüZ Ôo¶Éj  ^‘°ÂÿJNÃlí°š#(ø¿7%â÷/ƒèzÐŒy=#‰Öâë7x éçêÊ üoUoF¯Ì:úڎ¨†:? £šú®YåçÙ% [š^®s’qÊf1ÝÈïÂ}ãä‡R„^®Så­¢»»›îînŠŠŠðz½¤R©¬Fδ*o^¯—¥åDÖZÓÇôÂ}ãd G»š›%4í4°š0s&ÍÍÍ&ì¯Lzë__¤€y'À?ÊhÇòåYº4÷µÛ„ÿ€?öq™Þ=·_ïi8¬í“ùs…βìû:bYáûžú  @µ­ÍÕžjjE-ªËØ@9sj[Å2úÓ[½V¥R)O•a ŒöûO‘¦"Šú ÿ[õ JÎáã«k²j§øWª¹GÎSÿù±L¿“¿0¾”WÜ×Ük»” @*šÂòâ yIÍI±{Án~ýë_³mÛ6ÚÚÚÌ}|>÷Ýw÷Üs¦Oç?“Iþ½©‰d2‰Ïçcùäå,³ï‡¡@O¿-¿ÔÏe`ßWîsRh?)ZÏç'‘HðK"&üo¯×#[{Ç®ƒni(/'Þšžc‘Âaú·¦[¥ökûóKe]¹råÊ•+W#'×À•+W®\¹råꓪÃ9uŸ`‚tR4ÁþÃÒ¥ÑjñE„LB×ÅÂÙP8[pÀ€áØ_8ŽÔc3 ‡ p6fÙ!ç\ !Þ2 °ßs®±¨Õ$`Âs.˜e‡@‡H âB†Q`}À#‡Á é‡ü~ðxPe? ñsIÿñ„=-_P²üohÈÄ ­«5§€‚O[Z4ZTb ÜU®çu<œª¨¨°ô¦¦¦ÇUð,&áÿ\7‹W¶jbCP'A µ @ü×mÃ5®--2f‹%mÆ ]>¬&÷y£ë™±¦µjbkù"þÃ"Ÿ°yö‡¹")hz¨áè¾Ô§ëºge«&>ŽtŠ“Âƒ‡‘ü_{Të½°C¿ž—ã¢išP^Tº®{jjjÄ®]»H¥RB]O{:‡õõõX¡ùáP>¯¿#9ÿGúúdô@ „c_õ”µ½ê¥ÄéÓ§‹†pØ3}út‘ÿ‡Ãið?hßÿUµáóÕD_]ɪ¦¬qz‹_µà›ëJLJë|ÓÿÏ­´¿MôjƒLø|·¼.¨x°•¦ÛÊq*Wü¾¨½½ÝSRR"víÜEQaaeûR¦¯1äê9?ž™?j~þyn¹õVÑ“áÁgA ö·Jÿe‹̱i[[)†Û`MÈ#‚þ…İðMíÙÛÞW%õ$›6n×;nØÿËä½KÄ´©¬)“×µ—ÛÃa à+ôï\yÞ™?Xý2ш¿Ì{{?ŒªlCtèÌ7ôÇÔ^F¾xZ…|ÄËÀd ô4¬Í2ÿ bþLœ8‘BüÙÌú£ _룇Ÿ‚ÿƒ~Á÷C.뼫gè\¹råÊ•+W®\¹råÊ•«O“¦OŸ.ºººÒðþYgKøØ;q"8@þ´!@¦*-å!`ï† L)-… ÿ`‹Ó×6%âÿÖ½ëùõOç™éí?„ÔÛ)ü"Jb¿\]ù-6 زš_…þJÉO`ÊŸëó8($Dó@ßôûjÒ>”+—wÆþh>Ÿ«m…¤åù@gì4Ç3îTð{¾Š?ö­&~üÜ!ÐߨØ(7Ž´™éóçÏ7á°K/½”… Ó†¬óçÏgñâÅŒ}« üý‹¿6§ú'Kð}Iý¾YÍ$ ØW‹ ú'ÿx³k¤óf5“Ü<ÓÌK|‘µÑxŸâ¯0`År]‡hÖÿÕô+ŸÚZþëùÜ㚥«h­­5JÔÂ%W›å¯YºJšD%gÀÿ=šè<Îæí'sÍ’ó ž²µÕZúßb‚þ±h©mIç]TKõ+Õfž§-Îæí'1–™@œàw0ú!g¼+N_Ê‘I¿'ÌïÉÐs®~7r¶=}’N Â$¢Z=­ëºG‹Ê1W ¨Öª.“KïÄNÏšÃ$³è@È\¡<˸k"ˆ“L¦Ë q~κ¬Z÷ÀèÜé·gÝ‚—6™3çÙL4Mã—óѹ`~ÿ_€“õQ|-òéçk¤áÿ«C!.iiaEK » €'?¦ÎuAžü¾srúó¸Ç÷stnQÆóYþ·Èj0M `5ÙÇäØÏ2÷‹ €ÿœ Jyöé ;¼oÕÔwr=¼©à˜qšZ÷/×uZµžßc°ƒûvøÿ¬³¤Æ®»Ð|™õ¨²×Í–+Qçšó=Å~í9G/°˜(ø¡ˆÓè‘ç|4`7ùÅÓ¦=ôAÊ”Èÿ³ÿN©2šñ¾’Õt#×êÛº®{(•Ï“.Ü7}‰Œ÷Ö[oñ…/|Á,×ô¯Ò¾ýíoL&Y^¼œT*ÅF6ÚL6²+VPSc˜Íœ™Ó@©¦¦Æ„škjj”1@N£Ÿž” ”×´eœ]ÆòåÒD£7³#'Ìß“œFÎk•®/cúôõœðWq"Á /Ì3¾S²×ßS}ÙÔrz 3Þ›A‹Ö"¬iVøßúγ}*¿ÚÄÿO—×PUo¶6x½ÞŒñßcüÝJ"ÿÔ´~ÁÿG´kÍýyÿu©UF5Gœ&, |ÏVŸ‚þ×¥ÁHÃÿJw~Cæý‚0ëšÆ&éú½^¯°ÿƶ’‚ÿ}>éê‘4¾$¯úÚ%øANÕu&LŸÎá^Àü + k½=›`©ß?=ÿjªr áÿ‡J×PTTʾ}û¸¿ûçø?£^3ž³îT*åñâ©/¦Ì´xk+òræ´ÈwZª=Õ¦ @lÚ[·žkÂÿµBþÜ0£ÕfàýSïæ®\¹råÊ•«üË5påÊ•+W®\¹úÊ„úAÿ^2 sÛ(cš Vö—1د€ÈÜVe”IÀ`µ0ì·:U;¶Í2†ÈPP=Hà>.„ ÜÛªŒ‚ôÿÖã+)Øß*þ;`D‘8[Áÿ üÏv3±¡¡AT:ŸæI < ÄRQÇMÕê 2¨åýÚÚÚl.µªÜ`L‚AÐzxØ¢ëž9µÔE øsˆœ+[åⵕzÆ8 Õ¼Kx²ß$oiÑÄŒ:ký²¯ùZ•[×u‚üápÏùÎU2†H7n¤ªªJ §™F65ÄòofÒ“ú s÷æú=PYð)åz8TÚ¾}»ñ‚Wß˵ùC.åûú;’ó„®?¶yœ”5½§8bÖºgÂÅçš¼.ˆqœÇwžà/á“E®}­>@²© § €lÌ+«d}[ƒ-ÍöÞS¶}“MM¨ºs­~äŒÿ»'~Ó$üÁ%ŸçµÝ±¥½Õðwæçc/ýÖ¶ïïžøE¯ñûªK/»”·ot™þª·U¨×F‹EñãC~ލ•´o¹õVð·bаohêi[[)b‰Fö·Ê þ§¬À¿’Î'2Ô«¾WUUyêêêĦ›ÀpTN!cå{9'K„ZiþŠSÚ9©ÌÚ2Db˜Œ²XáÿÞV¨ï_Ù×¶µWˆh¤¡Çþ}Ï¿hd–19$áý&žø(¶þYãŠSÚ¹ÿ} ¶É2ê8ÈÏC;ÿzÓUW]e~/*“kÚ` ÚÛÛ=7Þ/ÁúÞ®¿òœ”}¿ñþ’!9þíííö÷_Ôoúóß•+W®\¹råÊ•+W®\¹ú´IÁûtt°wâD¦ttHˆßùm&†)À‚9s¤I€¡)þµÞæ·­ðýç_Ý~œ_»§î} €ÂÄðŸî'ñ6¼¸k4ð({ß•«Oæé§ž"‘HÀ–Õ”üÄ^—ßïgÍš5ÜtÓM=ÂÖsƒV$›Ï6[hiÈ[ÓðÕ!Y=ži­§Øàøòñ–•š=ÐphwiКís;«øÝçVð£«Ó«¾;ã766²páB.½ôR{üÆF3þžYÊXQ(@íWYr èVðùLпü–Mé"F^h¾}5ÖÄ'yŸãšýÿûÝÏñ_—\Më?ÿ7{ÿy.=þóà+qX¡i´’6è-þ¬+>`óª×yÖÈû{Gk пõºÚtFÞï[j=™÷ž  isA³®¶kv À;gž)M¢X`¹ef¹³Â/8›Ö ˜$ÿÆwG€¯™ ta‹/§™¸¦i¹º¸fYðÈX}ÜY¶'Ó03H#« €¦ibÆñ€N迚@ÿG>ôN&sÇþ8úFFZåëY÷ÀhÖ=0Ú¬G×uþãç\yÌÇ=¾ýÿÀŸçIs‘KZZmƒ æÀkïèüy^È–~ÉipÚú(oÙ½¹ ÿ}0ÊoC²Îlðgh3=?…¢,¹=d¦ÔRË4NakùûfÚ¤àæ^V`ÎûêM²ê ˜[Íš¿;?dñΙ{YÛx”4:m×CÆãƯÅXø‡ þ H¼v"§ Àyz NØÒ*ÃÐ9Aå¥9‚›;ufg_ÌCÁÿj¾]o潸}KªÒF ›6¥¯9×]w#ýUs®k-¾>¿¡ëºçãÜí ð?ÈkÈ ßl’ɸm_Ÿo¶¹LÊŲ\4^d¿6fk‡2å8ÒùØbŠ¡àÿXè\r˜@qø0ñ8cé2ÊD¤é†5Íi¡âèKtñÔ4ù›H$èêꢫ«Ë4(**bÿþýLž<™T*e3øú׿N"‘߯Ž}Ù³«¨KÕqÍ*?¯–µõ×ëõ*pßLK¥Ržææf‘Ë u[ºœ³Ž‹Ñl IDATT*åñ: ïÞ¤išÐÇ>.·»çbÝÖ´e,]š6¨¨ØBS“Vû+èß:¦ýï‡RVÐÜlGŽøš¦‰ïÍ0A}¥jOuÖºs¿iø¿šø»q³>U¾'ø¿.eOf¸&üê¯?ÃSí§pCÉû&äï4ˆ½²˜IbwŒÙµÀáý¦ @•WÂðšfÂÿYû àóiÔÜ3Óý÷EV#€… "8œåS©”ÇòŠÔœ[¾µ…½{÷ÒÖÖÆ“O>É=÷ÜCww7ÝÝÝœ-à?5®®.º=0¸é‘GÌkcEwM-Mx7¤MúfûÝ1ÿŸšgKüëO3fŒ¼.üp þWõÊý{6Î0ǯhüâ:ÊNÈææ´”³¹S^»f×f—µ¢6]¦¥Ü,Ó8v ÿ»råÊ•+WŸ Èà‘GEEELœ(­;::Ø¿?7ß|ó°|ÁWTTˆ¢¢"4ã©®ëìß¿P«]öGO=õ”(..6×öïßOgg'7ÜpÃg"~e030ÀtX®1#~ÄÌÀ ƒÿ€± 9~˜|®‚iÕH÷¤ãôù7ÒñõÊ ¢+xeBÃbÐëü]vÇÛîÖù?Òã?ÒñGúüéù7Òýéã?\ã¯Àþp2ì1M&¼À˜åc¿&W›¿Ž-=fÂÿÖýÔö©÷p¤ÞÃø;äÍõŠò·‘Çàe`bú´ž†ÿ­ûD ì߀‡ x˜ƒoɬ O…Œ_¨A¡eˆ¦4üoÝR`}4‘ð(?.d•w’mü,~Ž ß[÷ÿ[Œ¯T@üiØßªá:çmí©¬$i}ø¥SHxRør‚V€ÜJ#'ðïý•œ0p®r}Q*•2ÁþÞ tcåuZaCõÐäzX¦Œ¬Z[©™ùDe s¥m]×=--šPjÊÇëx°Öˆ'òsNô6þ?yYm^×uÏÆEUU•ržwŸ4 …a€¦i¢zœn¬.Ò÷óz ûõG½=ªº®{jjjÀ¡C‡D}}}sàŠ+®°=|j ÷õw¤çÿ0_Äç#0÷²‚Œ&8 ü@\boàùsjó‚ÿ.7^ÿ+ çÛVê±] ¾w‚ÿÿæój%&üÿØ”E&¯øÃ|5a<$¶|õMŸ>]õ €l/BªøNðÿáó=¼Êë&üÿëùÿÅ·øû €W^çáó=Üòºžc/ýÖV·QoÎø}Ñ®»(*,t™¾ª½½ÝóMJÄo.‡7"Z÷vcý­ùÄÿ4$1³µcÜn¹õV1Ü& „ýè‘1êæÜ®U•¥pÓ¶!–h¤'x8´ÆXI=è_hþ¥²Çʼ`°`°2Ø´q“¾ß1µƒ5edÀ϶þ–”¶Á䩸Ë<,*“su2 ú˜)¨ß*9ö½µ}èÔÞÞî)))¿L4â/óÀÞÜ—ÿ¾”é«Ö„<¢~ÛDKŽíÆLê}>­ Œ"ðÑ ç_GG%%%ìc{ÕUW øOœ81+ø?Øc¡®=O|¿Ý<ÿœsJÂÿ2ôPÁÿÎøÊÀß ÿõ¼Ë¥P4$L&8E¾¨Û{â/ Eÿ&þoâÊ•+W®\¹råêoKÑ)bJ &ƒ½mÚ{bX~Žtüææfáóù?^xGŽ!™L2sæÌáé4$JKƒ‚râ±ûöÅ Óïÿ=!¿ð÷(•Ÿãû@ÄJùJth ×s©©©IS\\ @gg'TTT Kük¯½V³êË_æ–}û8õÔSyóÍ7yæ™g†%~MM˜:u*Û¶mCömÛX±bÅðüÿÓ_ *so¯q9æhbàçŸu•ß+o¼“'¬‘Pÿ„Ðÿœ92sâD™nÀÿë6l`Áœ9¬Û°A¶ ˜RZj« ÷Ÿ‰qœ_ÿTÂFߺW¡¶¬æ[÷®7ÓÛ?>]‚‡¶¬`ÊŸ3÷¹áØ üêØ T½YÕë8X᧘jü(~ _í™a@ÞåãuBQòñN·æECé¢;c$X{˜p¹.¡ê&wõì[Müø¹C<úè£2¡±1#~ç3K³Æ/¾v¹Yçüùóé^¼˜¦ò¦~Å_Sý“%ø¾ôg3ß7«Œ•hËÇë„æGÌø>MŸäf;fœüãi,:ø"òx¿â Ãú¿òìr þþýîç2úÏÿ÷ déÿ³ÿí6³šk–®bÏÎG)‡iÕ4@¬ÈÞóö“¹fÉùÍÛÌç㻨Öìÿ]rµý/¹š¿ßýœÙÿêWìpZ¬+d ÆýD޳äöµÿì3Æi­[Ëß·Áÿ&ìøÏ>Êÿõÿ“€¿ç§4‹{™éù)S9Îêˤ1ø*e,°ú^r¨1ðÇü\³ÊÏÁ×öõjMª\C.N¶‡z°oþµœ#[þõ_mæ×]w›6m2á3ïºëPç–2PõöÔvëü¸@ÓÄkïÈã­äóÍNÇñÍ6AÿgËiðjA. Á«Q¾îÕÀh¦1‡0ÆÐ7Çr^´j$7èˆxŒª•á¤Á•ÖÛX(ˆáÂ…4ß;]]]‘J¥HY`í¢¢"¼^/>ŸÏÿ=*JÆ›n–}µôhFìT*å©©©±ü*½'fΤ¹¹Y¨}¿bÅ y…¯©©éÑð2á}ËècÇÛy•iPQ±…©S§iUÎiÐWø>g»ŒúT[d]˘>}=~¿ŸD"Á /̳Ö}²Äík|]×=-Z‹¨öTS+jÙP]næm ÷Å=Ô~œžû½9§R©”§Ê0Øc¤í?¥€wÞ—&#ÿ©iŒ×Ÿ!ÆŸÏ<ÏíZ’É$x<ø cPð?$vÇð_š)zÿ_ªŒÅDÔ¼ÐuÝ£À|ÀvmÔ4MÔÜ“þ=ÓðÕôL™ŒùqöqøÅoí;ŸOS×^Û8˜Ð¿ç[÷Ù¶mßùÎwÌ´¤®C2) ­n¾Ùîînîù_7ËX 1FRÞ7#NÏ&Ë„üíñ]›ùU?)ZÏçc̘1Œ_Lgg'·î»)þwÖ}´ú¦ O¦Oøá±aUäPüCU䬺s8Tu3CgójûΕ+W®\¹ú$«ß[¶l‘/bÞr‹-ýá‡fË–-⪫®Êë·¿z{ãÆ¶ôÙ³gËJm»wï`ÿAðä“O²{÷nqÉ%—|ªãGüŒîÓÿѨ§Ì„b•^9AÒõÕp~ØZ>=€È7;Òýéø#}þtüXÑÅaæÔÚoŠn¨Ö‰C½ò­Söùÿ3#õ”a›ÿ#=þ#¤Ï¿‘ž#Ýÿ‘>þÃ9þ âW ¿ÒEO\dÿ Àðʯ0høÒ¿ù U}oP”ý|ê~ùƒ†ÿ! ñϱ¯J[U,$gOuu þLˆ^ôJ¡p‚.È:BÁÃD#~†¾éøNüC·ºú@”J¥< öU™½^¯¨“"áI!âVàZȼ±êõzÅJ_ H±²ep p.¿·›¹êgO^{ÓÑ£G Íç?=JÅSóRäó;ÉixpW/ÂûSoK‹¬/àÏ„ï­q[Ñ-à—eñäµÇ/¾èºî™Öª‰­åÐ+N£'k¾Z)c¨¥ hþóNÅ_Ùª‰#â¤pÌ ‡E CãÒŸsÇ ÿ„¯ ~«z{8Ô.çê¼Þ¾};^ãá].õ¥Ì@4’×ß‘˜ÿ#týñü%|²hZ‚€Ç^EUU~¿ŸâbùÐ1‘HpÇw˜+\rÉ%~É|}£Ç6¨—€ŸljÂWQaþµJAÿ6ø?›Ú€2HV¥ëj‡³®‚äŒÿ»'~Á•7ÞiþµêµÝÉ€ÿ³éØK¿eÌÅß é¶r³®ªßì÷*LVµ··{[ìØ±ƒýd€ð%%%bÇŽÜ·|9ÍÏ??9ã~ ÀþærXK·°š ‡„Ü[¹[n½U4?ÿ|^ èI«KÄšPG+qÜ1µƒI«‡f5ì²E ž¶µ•`M¨±×رD#AÿBÒgðÀ¥€_%üßÖû ókB¡L†âXXMzÒ¦›DRORUU5è˜ ~Xê· öf^ËTÿTY¥ÉS%8>Ðþ+øß ühíÔ÷ü ‰FzžW})3Zòˆû·i°mpã¥öU°¿õä€üE¶ý†Bííížï— }Ð/Xòˆ›¢Â¼Öo¶ }\k|5·­FõÛ&2ìðüËïèo¯äwFÚ¨Q£(ßp'¡øÿÑÀÿÊ{;BѨ ´”  Åb1Ø·h(4,c0ÒÐHÇi«  ^ÀͰP¾0NãqàNœ¸cXâ+ëË_þ2o¾ùæ°X! ˜R&?ïm<õ·̘1¢¸¸˜óÎ;ãßÙÙɱcÇ>çßg}þôøø Åð»mpå t‰äðô¤¯¿#¿ t’ \P0C®Žw¢å´z8ýxXâ·… ¤áSu”E?ó$㫱¿îwç ~€Ž5Š_•wÒVV ò} F:þ›o¾)ß?™6Í–¾uëVÞ|óMqÞyçå5þž=Q0{ö}¶ôïaÏž øÊWòû¼-Z `×ÝwŽ-}Ó=ûh ˆ²P~ÇÏž=àúë¯à£>ä³ð={öˆ¯|å+yóÍ7‹SO=•§Ÿ~õô}Ô¨Q¼Y]Í-gœ!y䑼Ư©©ÅÅÅ,\¸Ð–ÞØØHqq±åùÿ`¶óÙ÷>úˆ{¾pà”1Žl÷Ÿ8ô6Løœu¶„þ/ýš„ýÏ:Û„ÿøo5Xwèmn=ô6•–Úîe÷÷þóy¿…ó~/ÿSxÕb.üõOçñ­{×ó-ž–F÷®·í«Ì~ýÓyþQ ô&MÓ„¾ÒxNÓA+‡ÍçšåãÁ‡&!ïq:!òïŒý‘`\7ó’ÕãÍ:;c4(ÐWêhwiê¯p>?¶Æï>·‚]}–Y—5~YYÅ“åT€¿Àç³ÍÍùóç³xñbƾÕþþÅ_ PûÃU¶1*7º¶(À‰ã௠ müãi¤Œ¼¾Ä¯1 Ú=¡Ìûר–þ—WWóìö× ø—ï|_­„óÿë’«Íø×,];•fHX{…¦©¿™ýW°[)̺â6¯zg­`Ô=ëŠ|G‚ç±ð´}`X%óâlÞ~2 N ÇÙW>)4sBë×€¿ì˨ûf5§oãýM[FoReÔ3Ôޞ͞~›²Hˆ¶T”È ‘¬&—Öþ# AÏðô°ipÝQ n—Ä)¹­UÆ·¶A×uÏËûUkßð¿lû?›Ð$@tÒç½ñW3OI•I XûÆq¢“>gšlØ ÎÅ#H£z\Û?[5qÑBWa÷Œœó^$Âi룼ônˆ²»RBýÙà¥ÊJ8hÙVc9îñý07m6ñøÎpÙqi€ðÆhïüÕÿšdÖ?Ë15£ĽistG^Ñpû|YÙê{mmXõ@Ôüж‚¨foõ ÐP)W¨ @|W_‹ñ«wüœ§ØòÿG¼›;ufe™‹VS]_Ʀ§f0 >VÕ­BOꬪ[Å’ª%¶¼DâBü~¹Jua‹£¾Àÿ¯½£s¥]o}/G¨ÑcÁ''<™Ühš¨<§.ëv_ö5ã[LzÛgÆ{3h9½Åüž°ÂÿÎ÷}úc$ЗrJÙL ÿÑ®•¯Ñx<¬xê)n(yŸçÛŸãý\ðbwŒñú3´jׂ®S—J™&Ö¶ú|rìÔµ æž™&èßðÕ0w~Cnÿâ·aÓ  òGi3«A€U DXqŸ–ÿƒœÿ”O*jk«k¨÷.ÕyÖÕÕ%3<жl1·Ñ4ººº˜2m:Éd’®®.¾ýíoÓÔÙdŽmî‘—²~ÿ¥M'…¤Ñ–µ—OÃÿã9räs_¼ÞÿÛß8ëïÂa"'"Ì*–¿ï¦óu3/ÞÚÊY«lm¢X“¿MŒý\¹råÊ•+WŸ,õëÇÀ#<"ŠŠŠÈùkš&~øaöïßÏÍ7ßœ—›°jåßl/`kš&fϞו€Ÿzê)Q\\L6È^Ó4ñä“OÒÙÙÉ 7Ü𩌯V~Îy*ð!Ÿ+A«•ϳAÎÊÉ1Ÿ+¡tÿG:þHŸ#_­ü h“ Žž×•ØGzþôøtü‘>ÿFzþtÿGúøÔø[ Æ,Cqq1¯ÜøJF¹ZQ‹ú plé1`J€Šò·)**’¿CÚØ_cƒÖ³eâ` ”,¨*<ñâ‹/fëêêJÇòÆÛ` ”¬þ݃t³¨!˜5¾š?‹Ë†Àéø Ï}è› ÀÚÊü­„îõzEee% Yoªö–ߟ88•Ÿý< <¥ç›ëj•ê––ÞËöE𦉲²²œ×µŠŠŠÁ¨¶¶¶AµÁ Öç:öj¼‚–gCÁ Y¯•ùˆ¯Ê¬lš1·Ö 0c†Žˆ÷<§m«'ª=C‚dû§~ûåÛüI}Çö@WUU‰79„®âßU®÷éú3”ã^=Î÷ôûZ•Šßà þïë@U>nÈËØïÚµ‹úúúœÇ¿/eúªOÒõWi$æÿ_DäuAø|UUUÜqÇœy晼óÎ;ì߿߄ÿ•î¸ãêëë¸öÚk¹ä’K ÷+#‘ý—Á¿ùüZ ónªÌ þÏ+«dýš.l€¯&Œ‡ŽmÒL@é…^ð¨—,Õgkuë~#œÐÿ˜‹¿ÁÃç{x•×™µ® 'øÁ%Ÿgó‚\ÈùÜòº qì¥ß¦_æìCü¾¨¤¤DülÅÏÈ9÷”7T*))¿¹ü­{»Q&jèáX¡¾¤¤DÌü§Âi~ ”/ûÅŒº9w?3W-:µ­­±DcÖqVPnп²ECsýW}±ª/à?7(¸®®Nø4×;.kÝCi`•šã¹{¶2/i[1Ê /ÇÓj¯¹?mj“é¹ÿ½•éœó¯/ýÊ÷ü“†š±­«ƒ<ÆÒTäÆûKرc‡-ÿòË/Ï{{”éÀS;Š´ÁÉÛ¯Ê{ìP4$L&ä_XX(®üï‚øËDó¸hÈp~7{¶™6jÔ(ÊŸ~€hžœž €|@#_Xd°äkÞù° >çœ#¯K :xP^÷Oœø»¼ÆÿÁ~ ž6æ›jÃlc>þüç?Ïküè9þ÷uePÿUˆG:þE]$s6_™Þ½òÊ+Ÿêóï³>ÿFzü ¦ÉþŸó¦½ÿÏ“ý?±5Ïò_G:~A“1þKã¿ÊÿŠüÆ?•tñ}iZ¸y`Gzþdüè”1¥,»ÑBaa¡ØtåAö¶åï4Òñ›››…Ïç#ä_XX(¶nÝJ2™dæÌ™ùé4$JKƒdƒü ÅÆ÷°o_ŒPž~ÿ+ã‘lטÂÂB±éžƒy5"QÆÙæ¸ÏçO?ýt^0~ðƒˆÎÎάÏ! Åõ×_ŸW# šš1uêÔ¬ó«°°P466òÿñÜvÛmy‰¯àÿlçŸÏçÕc;ŸÖûÏO1.ësy¿kwÏlÊu*PãŸ@qðKf9'ÐoUP5 á.̺•²Á÷Îø?~î>ú¨¹ èw¨ûÜŠ¬éƒ‰_ý“%ø¾”èwhQ(5½¯ñœP®ëÖÿ•g—/1÷qý6…"ÙÓ¯Ä1ëÎÙ= sêcçôI¿âš%ç´Ü‚výVͺ⃬éï=Èö­« ˜‘´ÀÊËœ»#^ù¾YtÝP­ ?f´;]V×—QUõšù[dÆŒD£—š ´Š‘¼.×IÄSì­”çP[JáéÒ@Å ªŸ3ç›Æ%9#ü6—Öþ£-}WõïÍúßœM[*jÖcí»Š¯¶“IÐ¥õŸÿ›mÅ÷dRgTXðQÄ#ö,y n?NÃùq¾ Zªº%ü¤Çg×ãßÏѹE¶ã¢—K€ •!N[/ÇãÉàbLë þψa1R°ÆRïOL 0ÿÅ;?dõegÂûÍ" õÏôü€%·‡Ì|%Un¦ç§L½}>Ûx4#š±pн¹SgVqú¼kP}±¾âƒJãÑgCÓcaŽJËcц\Ìe ^i„YÅ*fOç€Ó@þ«êVá”3ïºÙÿi®BÝðÔ48S³ËKŠ8Ñ@€P[ÍfΜI¹÷M‚Á ¥¥Aöí‹‹ÅhMGss³ù½î¬k°R@¾ ÷ë˨¨&Û¶m£©éªŒÏ{šs½æÙb¥¯aº¾ŒéÓ×›& /¼0/ÓàEÿý0p¶ÉiЗ÷y¬ï ©}m×Ñ~¼ⵘ´ð¿ÒíZ@ÂþKžúVÝðe[Z6ø?n4÷xx?EïŸà+@•×›ó·`2©Ó¸.lÂÿc~œÎ?¶Æ\&MîüF„c;e^ß3,\É þ«¾*øßªÔœ[¾µÅ\èVkÝÝÝtuuQU%!«««“é:ck¸Ïç#™L²páB–v.Å»!]·i4àè·õ÷Õ„å¤Ð<¦¾%€Ùvn+Gåoí“BóxvÖoÌßäÇŽËf1çI.y½^‘úbÊ–¦`þpA˜CUynå3ï껮⬺slelõý)û±våÊ•+W®\ ¿Fõµ ú1qâDyäá„ü«ªª˜8q¢m°¡”НiÂyº¬¬ MÓò¿¨¨ˆÝ»w‹­[·òÎx²øv¦M›FQQÃÿê{–ðÜ}ˇ)¾ÎÌÀ*=‡EÐï'Z Aè„ –H0Ó?XžV¡Tñ ƒÿ ¢9~˜G>¸ €›O^ÃÌÀûÿ/ôn4;¨øÖþ×¶ º|ܰõdã§Ï¿É“'óòËò5Wµ=çŸ5þùEþô½? Sü÷ Ⱥªí†j@:û°RîÀãëŒ.»H<”±Òzõ8ÑeQˆ‡òß>þÏ7®-¼vDŽÓò¥‹ŠÏ¦øéóÏ â”ׇáüKÏ?€½Æÿ±§D†gþY¯?Ä›ÿˆ\jžy†¡µºoØÏÿxÛ÷O œßñàðÅÀ¿STTOÈU¬¿žœö¤ý7ÀዉœºO0ᥡ1(œ < Aù6&OžÌÿÙ/¯Áÿ³èO¼ü²ã7Xál(œ-8°qHŒ<çI̽]ƒ<çÕñCb V `-1y¼#(&Ç6‘@@Ä…¿åèQî¶ÄÏÚÆ<Å·\ïÄÚỂA‚· / Ëð¿U "5 a{Ok礹êôPBÐmmmiwaK½B¹ÔæÒ`Û¡V`ßP­³ÖXéÒzüðÿÃ!_®Ð­;«pü»ÊusŽYã[áÿ|¬~ÐÓjÜV)£‚„¹ ¢ÓZ5±µ|Û~>O~¾wmظq£®Uг©2èaQCn¿‹¡„ÿAö¹;Xñëæç|™m9ÛÐ[™\fC©íÛ·› Ã`ÊôGŸ”믊=Üó¤¯?1ŽèW¿«êëë¹öÚkÍ— ø___on?óÌ3TUUa¬ÚÝëXMŸ>Ý„ÿ´ï«¨ÇWÛ¼²>¼éæ~63ã»+Û‹Ó§OÖÕ’®¼ñN޽ô[[¹ .ù|ŸÂ«ý¬f=Åï«ÚÛÛ=w×Ü-Þ}÷]qßòå<üÐCž’’±cÇî[¾œæçŸhõ}ŠÿMJÄo.‡µt eðIP>á}Ÿ´ºD¬ uˆÊR2Œò ÿÜxÿvžøþBÖ„Eý¶‰<ñý+™³4 IDATˆ%äËA¿|Ñg¨à%¹êøBr(YÁk™Uêóÿƒ}ô5¡h4ì•×6¿¿Œ„þ­û u[zkgþê-ßûþTNiªßJÊ€ i§þý =GM}×ËÀ´©”ÆG!QO‰ÈÕ¿EÃ0ÿLøü$N¿òcÚŸ„’r¶i¨ÕÞÞî¹ñ~9wìØÁ®»¸ô²KÙµs;vìàòË/Ïk{ÚÛÛ=%%%"(Ú‰¿ W LŸÎWláF®Ê[lŸÏ' N¦Œ†hH8!ÿ+ï¹’à”ÑÄòôü dÀwÙ ÿßÍž-®Ü¸‘P4*¢y‚ðšššd‡Ü®¿þzñôÓOÓÔÔ$òtü=!¿`°å]wŸ°ö„ü"_VAA½ ù°‡Ççûóß)(¨'NÜ‘—ø×^{­€ìõÓO?-®¿þz®½öZ‘/+ä/8Ù v” Bþ‘¯•ØG:þ˜1cd‡üG%N=õTÆŒ#Ž;ö©<ÿ>ëóo¤Ç¿À'Ä[Ox8úïåÅø ĉd~ú?Ò×ß‘Ž_:I€àDE–ñ¯ö‰ÎÚN B'‰Ñó¿-T â±EYÔâûî›®<ŠòÞÿo¥K&Ay’B&`jQK²»Ñzô(%cýùp*I«pìOÌî‚¿VÀ’B#m9-'BÃQÐs »‰xôˆ€ý–úµR| >dw|àTvD”dCË©(d~ÜsÏÞ3;»ÙM2»Q>¯ëʵ³3÷Ì{î™ÌÜï÷­¶µµá¹òrœ9s&î7ÞívcŤIXb‹:Ûþ‚‚¢¶¶V­««3èÏž=ùË_pôèQÛôy_ÒV÷åRbݤÕóçGµãŠM›âg8òÖoÚ„9••Xϧ åø¼}yþüüü/à »0éµwŸŸÏÚX”9°kM]§Ó‰;NÞøX/âÏ{?GѯYÙ}¿¤eÖZŠ¢8xôü=·[êÂÇs›"›æõ¹ÄB€øÀ>½Çc=2 Fûdú]«ð«›ÇÊýêw W›6eʱP >0€Oox}lÚús½.¬øe¼Ù–Os^Í^¸óP >0€Oo8µªGý:Ù¨¯¸ë<Ü"¼ëðixå}B( O¿ì<”+ šdbЀaûµk¹þ­×†-«ÞÇâ¶~(n½þ3¸îdÇŸ‡ˆ àÓž`ÊŒ ˆÆg®3u.Ó—áøö?`n Àd'°wBoøõ@€Í›7cK{wëöí®‰3ÿ'3d¶xœíûGý£Tò¢9€‡¾rÖØï…¼n¯ÔLÚå F»?Â÷1Ãøò"8š¤ã]Þ»9_18€õN ¡­GunðìS1…–ÓDó?‡oge%Òî}XQ‡Ü$«ß®VÐ0íßRX˜ÿßiòýäÝçÅÁÓÀÄóY`+Çê¿9h DZ×;^7Ôï€ 0Ãb½¶©¿À¶Ç,džWÿµ¦2Óš†tEqܪÕ÷-m {SÚ °¸§ÿg·>ìáåµö7b!&Ucšæõ·ª‡¦k÷ošÑTÄÊøßÓ4~~ÉÛ {<þ—‘ñÞÇ .7™ÿ9!—›òòð­½aüCd³>¾ ð2þ÷k.ìüÖoŸåÝp…W~w ;)z2ÿsÆX=¾¢5ð‡Ea¼Û$#²I¸@ÁqÌÍ¿n¶¸ßqÈ~fþé±0ÆC6´ÛRÅÁÏ=®£(ŠÅÐCniuË¡›ÿ#ЍªnBŽD"€ÃB°P€ÆÆÆ¸uÿ"VæÀØC¹`ú7ÜÑlÛ¶ ˜1C¿É-.z{™1Û¶mS£Ñ¨Ã*H §}*üwbãÆeXð6n4öxnu|õãû4dy¶e}dËŸnÈr»;ñš.˳!òì¸6{É–ÓMF§²7âÍÿâò¶ËÛSºþ&3ÿ0|_uÇ¥†q}1ÿÇö[çdæÎOoôë!ï5Nãó2|ˆDü(,L„`àÿ_qººØ?Ü¥¥¥èììÔ‡#‘º´ß|nþÀü1¹±e`榣Ÿfó¿y½ººº››‹©Ë’ØÅmíÌÿæÿ»…•ßÇÇ%¯ ÑhÔ!…©9Œ±õãàËñéÿdpó?ŸÌÿA1°H)€ß”Õ××c„ (//Ǿ}ûânˆ÷ïßs0@Àõ›››1aÂL:S§NÓWÅ–Þ¹~mm-žyæpóAà8ºÜ\ƒgvÓ¦MÃwÜ‘ý›—> ?è¸yéz€úM2Ü!µ®‘˜™ã€÷ÿÛ ßG ìÂfçHl Gƒ †®¿¢SÆŒ ëó±Ïæaýûá×Oü­Z‹ _¸ÿ{Á´ÚþiMX\® Ô¬hv–Û¿ýÙÖÏ¿]»vaõêÕxâ‰'°gÏL:ÕöóOÔ´jn^|¢—ñÚãbê"ûõ§5 Ã&73YªÁø×=¡à¶¡VCýo^Š›æpØâuÓÍKm1$YíÿÇ÷<®Ÿÿ÷L½'£ÇßÿïêçÿÆUÀ÷cû¿xþÕ:¡rÓÝ àí=ÿÄú×èî < ¼åªƒö×?qû·…¸inƒƒAl ´q™»þÌ{üqt{Ãȹڋÿz£÷eàú#îÿ{L¿?­®µ¶ì¡_eÆ#ßBmíŠïN>p’…pãÿßú°ù Ufüph3š»bÇàáÖAðùÝxhmÿÙz!òcÐt13ÿ÷‡ñ¿ªc"TÍÁ®AêF8&²ò}5þ{N•ÿCªŠBhóÔïÛü#áÒB¡qp9èã=×_ÑÑÀX­èo}3M2Vt£my¾—SÓÖ‡™6ÿóiúÕüv°ž—]A@u%î}ž÷8ͧ@ßM÷"|YÜì/¾Œàæÿþ6»šá¼ÀíÖQùº¬lÊÓ ÿö¬ ˜É•¬l’û£§ë´ô×y”¸  Y–ÕéÓ„3-óùú{=…d›þîýÜŒ¢(ŽI+duGQ=nùŒ†Äþ6ÿ‹ºâw1ÀïTôc ˲º$OÑz©ï{ðEo°sß×ÖÖª»wïF43À˲¬îÞ½?ü°ÞF_(×ßT±³þgëúóô묡 oü×ÞÞŽïÿûhkkÃ÷¿ÿ}L˜0cÆŒÁÂ… õ€>ÜÛÆ¨&Ó>¾ã÷>žBîšgݲ婵 ¸¢øNØ ("5B˜€FYY™š¬¤©Ñ$îZÿG<5ç2l™ó>n]Ÿc9Ï–9ݸ—áÇ﫺ùøU7bã}åqËìI¿'¸ s÷ë»1aüx}<ÿn·!ÕðÐ_™ÚSõ•SE¶ê/œº8½_7œsSºÝæ7‚?¼‹Á¹¾ÝæÞóöõŸ7—¸|‚áý¶ÿ±÷¬õ:Ôµ^‡jX碪®33þ?ýD@S&ÏS`ÏÞµÀ^ó?‡o˜œïìç}À ßP›×y,ÙqÌ{âñp#œ¥ %~•ø´†@ÿlÿ:½®}¹.‡:mê~Àéú£*ÎÚ-‘~íç߿ۧøÝïwë!™ÆUV¦¤'žÜü²uùVÀ5îj7ÜÕnõ¶OYO„¿¿ð÷€`Ë0ôzÛ X˜ü+–.…ÛíFÐÔh¬¿0€vî܉voSUX…iÓ¦Ùj²ÔßÈUUÚ®o6`]lÜÚy„Ü¥¶°P=9ñ&ÿ¶¶ŸÕC€ø¶¸ýBaa¡:xð`Lš4 ßÿþ÷Õ+¯¼µù¬á~]GÞ~ûmLš4 °EŸ JJ¯#Gu»‹÷\61¸Á`+JÜ@ðM[ä-õì\S«‹3¢²FœV&ÿO?ý\på¼ý¥Ï¿Ç{ pï½÷fäüëߤI“0iÒ$ÀpàÀŒ×¿å[?,­¸0Cõϸÿj=ñM¬«ËÈõ÷0cë. ÂÂä߆6f±GÞÚ»–M+™Øm€µÒ÷™ÉÑïnµ]Ÿíÿ3=ð:âLþmåíÈ™žƒî¦>¸@{ÐoifT+“ÿÒ‡mÑõcýÿY„=ïùmᄬ܈¿vê?^·~´ qsÇ0킎xC?7û@Pìí^Û³a——÷„'tó»ö™Ôè—{pcœ¡Ÿ›ýsnDÛAöÿ7`¬6èóòžƒéë¯ „â ýÜì¿.ñi‡K~ý]Ãw^ÞH__œ¡_7û|±` ×ÞmÐçåßvA7ÿkŸIõ·¼24ÎÐÏÍþ[^Š-Zc(Ó+5î^~ÔCqlï$¡ܘŽ›“Å0Í´¬­×²¸ýŒÉN`˜ ¸ëívæÌ™¸U{ÿ9}útl~Y0ÿ› ÑÜèî,w RqÔ± "7Ép–;àß¡õ² Žú/ÆQÿÅhްÄÁâWš£1³¼¯Ìد¹÷qEQ••ìêµiS>\®ûTœ‰8˜‘¿°‘ˆïÞ/0wò¬‰(ú´CÓ#–æÿM›òÓ2ý+ŠâÀlYÍ{º˜m4ÛÊM2<žžß§sóÿ1y÷Å:º1ÀË^/Xf[·à=Èï,?գ֌գ !¢ùßj™É0„^h½H{”X˜ÉŸã1urÍÍþ·üЉÃïµ¢ÁßW†Ó$Ë€¢Äm¿nÀÝ^¨*Ê2¼°¹oÏ2^Ø|nŸÉz°Î'Ëú k†¾í"—à ±ry—GÿÞæ½ø—‘(haí¼qÜ^àÝ)~ÜZÀ’ÁÃ!o¬œ²È8Oa¥ŒM~ÖáÓ\ïE€§ŠnŸ••2P®à‹Â›dÃr¸ñ?‘ñÅì|Q)jTf,àp<4Å›½±±Q7ûÖÆÿÎNíù<œl½¿ŸE¢Ñ¨C YÀ|'¼MݶmÛÔTB$IRPP[[«ëmÛ<Ü"ì·âIظñ&$ ÐçŒÿ–Ë2a}n,CYÙSp:‡Ãرã.coí‚Ùß°Î\3Aà€¸~ÓMlµÛÕíXâX‚Ê+ô[¿ÿsû¿ÿ“eY—××v O ZNïÉü¢Ã¬ÛNȲ¬j¿)j$¢Ìÿ ßñ/ÃøŒý2Ä™ÿyhÀÉ_ñy}¶4EqD£Q‡ä•TnþçF}ÞãȈ#pâÄ ÜÿýøÕ¯~…'N€Áp, "_»›6mšÀƒt=á<à¡â=‰>.´x›Q.Enn.þZÕ‰?ÜúGÝüË–ïYîSÓ2MãÒ¯ Õ]sPúõ«àËñéÆ~?bacëÇÅÆwûÑü×·Ò• ‚ "C¤t#`N¿ª©©‰KmooG}}½-ŸÍú¥¥¥–úÍÍÍѯ®®ÆmkXó/Â3óÑØØ˜1ý›—>€‰ç³ïO³€3¥_ž¯ ìvé~]aœÁš:ì1á˜õ—ä)xì³y(Xt mÕ#¸wèZ¬èÌŒ~y¾‚¦å ûç¾I–õqç‚~i){ÊÊp÷ìÙ;ÿJKKQ,Ã?å±(_ëìÆ÷ŽŒéï,?…nc*ñˆàȸtO»ô—䱞ØE¶…Žg¬þ—––â`ÞAÃù?±sbFÿï0œÿß¼üDÆôËó¸Md‚dìüÛY~ M Çq•¦ô– ”{2WÿøößêfÙ·ÝþÒÒR<[¶ 9W{ñ­7T´ãܼ㮌žÿ·í¾ÝPÿ~Í ¶ì¡ß ½B] ù=䋸ú¾.ù 5sYcëÒÒR´He8¥…ÔkJ¢Ú5¸‹5Ìî³ù*A'rPÖõ^ƒÜÚC÷>šÿfÀ¿o׌Ðü%Ñx÷'Èq©hó³ëñ´¦a˜žÇƒûÃ|Ïõ· l®Ÿè7¨?õEøyP]]¼¼k91cáÂ…xøá‡ã¦Õ××)>c߯F6nÔÍú|xÓâÅøF4Šw¹÷ßmšQk$sEð¡$¡rçÊX€¶3V ë×ÿQï… øð¿Ý'Ókp6ÑsÚ0ßÁv~.Ç’„•»;õ¾œTôÓE4‚ŠdªGꢢ"õ×±¡+CŸâ•SExî‚ðÿ}Ó–uà¦ÿéÝ#ÛsØËø÷Ïÿ12aþ)**R÷.ØÉ«/Á©ûa§ùŸëþ1ëUý÷ÿ 5Š÷ö.˜×!Ñ´L¬Ã”ÉóÔ=G‡{Ùˆüɘ2ú3üò×å°Ûüo¦¨¨HÝ÷éM†u)ºð%Ûzž·¿áþëQ:·ÁQTT¤n¸ÿzÌzèÛ_— ÷_€¿ -ÐõþØ’íúÇ×aß>YV2zÍ×áÕW_Ýô͵׮»îºŒ¬SQQ‘zÿ™û°€Y¯ÜÀžãÀ pæÌT,­\SŒ…B{°uùV:tÈ6ý3gΠbóf`¦fÞ,±Æ]Á`‹ÞiûKž{î9póÿÜu­˜Û‹QUX…oü¦Lùvfô7F°.¸Ý®»UU…¶êóá–2£çàÖ7ñfµ¡³hliÁ™âï Ô ­wèþ×çÛßÖö?Ìè ÚÝÆ Ð¨±ñ twŸoký›9s&.½ôRÌðfu5¾Xf²꽿ô`InJJwÌ×ÚÚŠ’à\´4Ûk@õ[…-PQ\ [õùp4EAA ðÐÖÖs0@é›Ï¿Ç{ ­­­¨®®F0Ľ÷ÞkûùÏë?ß™ª·o‡ÖÖVÜyçØ»w/^¨8œ‘úÇ÷ÿÁÚZx×-A ¹‘…dâúÛVЦÿÿ»Uët±‚û³‚@÷N{ë?¿þ6ú€êyë€` ›ý¨öÃÖë¯YßÝXløý V·fæú¿¢…èÞÞ­óïÝUöéŸ9s/T0£¿ËÍ܇´ë.'Sõÿg‘v`®‡?‚-ømᄌÞÔæç~ÿê::lÓçágΜÀ‚{ªáÖNÄ ‚pOiÄòãl¹ÿ´ÒŸÛ@ËeÇf`].2¦ßØØ¨÷FʉD"¨®®ÎÌö/­ˆ4Z[ƒXnÓýaa¡Êµ`sÅ…huÏE±f´nmmEqpfnýÔV}~ ¸÷Þ{‘ŸŸîûjlŽ=ŠÆÆF[ÿÿØ1p»Ý¨¨¨ÀÖ­[1zôh\pÁ8pà‚Á`†ŽÿR`×®]zg4X¾|yFô+¤Ãð|‡Mã×Þ hŠ ‰ôZ?Ñóç ° !=`÷Ÿë|„9PYgþŸu_¾ÜtŸ?K’¤®¨dÿÛþ÷î!)­ûm¿x áp[ÿ­a|Éèóôáñ7-HÐ/˲ª¬ÔÞ'oü!¶_­p«€Ï¢Oغ|Ãbè½Þë¦=+£Ÿ _ÕU…܃ñï kb6æÆOëOýÛÅŒþÌõºà ÆOë«~­Ö¦ômðûY€^ÊG‚Ž)® ur ÛÏÍöÅ“à÷$¶¼2Ôry·^ÿk7~Ôäç-Ë{Æe2ÂÅôuÓ¯fþ‡e†ù¦sbש0N¾è|÷A}çÏ,`o¡7üpûž´ÞpÃö-3-ÛbûË„C±ÇœÜÌï+óAn’¡”³ããßá×Íý<ÀŒ¯Ì§/ËébRr‚wäÜ„9اbÎ|föwÂïÞϘ|ûØrž‡ã} òN¶4ÿsX@‡a8™ –o[*440cÿ¸æ˜Ñÿpi@7þw>†ŸùŒu”ÔùÛãš½†} ˜Oa®;ËOa²ûf_›7†`Áë§±úÚó±j [Ö6õ˜áøMœù†ã7úð6õz»@+-®g6Àó¶Ý=îíh8FõŸÝwy1þð\8y€†¸½bÝï¸}æßŒ&é$æÿ+öøðî”X=~KªÕ! àrÁ ¡Í{# /³ °`€ÀËè¼ÐÍÿðÞÇ .“øà†ýñc]ë¦Ü›6]} só/Âí…†r¼Ž‰â2“¾£÷@­‘j°c áéÔÚ–ÔÕÕ¡±±Q7‹÷àÉŒÿyy,LÀét¢>ZŸðÀ‘$IÕŒûâÛÔI’¤Î˜1åÒ¸Ýn»ÑÚD0DSt¶mÛsx€¸ÌtÚèéæzÍ´/~X]­ªzI¿ܸñ&COê¼<aëcŸôÚ” `Á³¿0 ‡$Y¶hÔçeùx×h—Þæ× oïÃÛþT®hÂǬPW`ú±éúòøpOíB$IRë£Q¼  }Xöœ€|åw€€ŸÕ¯æ`(. óÿ˜a9˜pŠu&q%€ÉØ+¼xm¬]‹qòÜãw4<îSz£'_þa§y¾Î®!ïM?ù+öÙðê–³óu˜‡SðàŠheÿVðoسgÞÉÀ‚%Aý·Xn’ÑÕÆÎùÜ‚ØpyeìþPÚ¤ TÁP%¯wð:Ww??ß—/_ŽŽŽüøÇ?` (J4oÚI’¤F/dÿø»Ù~mþë[z€¿ÛWy9BMMú÷›ß„W¾ðå°c%}¿½AAd´nÄ{*cgãç¨ÏM`<å/Óú[´›MþÏm¦õóg°îŽmYÑþµ ÀÉ¿oÍŠ¾™sMŸd¢Z+}ntåÿ Ÿkû?ÛútþÉ´>Y#¾Xɤ>7ró[¦õÏ_2íx£W|++úv×?nþ÷E|1@| h¾à×DNŸB¸ù¿ãa‡ÀC`ðt¦wf»v ææN_B¸ùb,®AÜüÏéC7ßÂa‡ šñÍ÷€Ü|Ïé‹ ß¬o°¢?õÍȲ¬róÿ„ ÐÞÞŽÎÎNÛ‚§¬ôù07ÀÛaü·B’$5Ï´oE2i>Ÿ9s&œN'"‘¢ÑhFCø:± ¢?QÜ€‘¶™×¡<_A­s$N¸cDp$êÂÇm7À‹úbtÉÖ_ø¶—+ šd{ö7?—\ϵ¼Âzà›qÓY©ƒ–´aÒŠ,.W2a^ÀÞÿÅÝ{Z½ÌTøÆîÝ»ñðã¾¾Þ!˲ʿÛUÂõwÊäyê{ÿ²ôvG§ž.ÿ¯yY«ÿåå®üΕ€·ß|MMQ;×A}öÙgqýõ×c̘1øøãÑÞÞŽßýîwp:¸þúë@H×ü°ž‰øpaU•!¾¡îô +´Þ1>ÔŒx•+WêÓø2"7êõ€$êWÌú©!À ÷ ó]Ë ú<ôŒ>/cë†ïQ?]ŠŠŠÔ²ýû1E-ìq´`Ç%öÑ­Öáþ¯+xè¯2®>ò`~Q~¿‡© §îÇôîØSáÇ'þå%¹Øžs"+|ž{î}üð‡—eÄx}øÇûð¿ZÏ(`!™¸úȸz$klüÆñJ¼1öꌎ¿6¸ {öF0êÎoâØÖA@Ç^L™\˜½€}²a]2iR\lyOðEkkFŽÅ´©û1À¼€ê0·S÷ƒžÅ°GY+ãS? á›ß¼#+ç=¹Ð+ýW_}»_ß­ÿùp¦øzl¸þ%[Íÿn°‚›cúb¾HF|ÁR@3Zè´¶b«³hcd#ZÝìÿ¯â`1nw›m Ký¸ç²ȃëîÅm·³]Ÿ³¹âB|ǽÕ%ì¾§±¥oÔ;¶ IDATçÚjÀb Ã‡¸ÞTê ÷ìbÓŸ   (€½ÛÏÙ\q!Z›[Q]Êø66ûQ\Zl»VÔŸ ~ÿÖ™»þW|”›nGš(hš‘ëÏÒ‡QRÊBBÁ¹˜ÕN¸¹þÿ,Ò¸Ùï/‚-X>nLFï?jóó ¿Ël4@óu¿Ÿ9s‡Ùûß­ãØû_»´éÌ Æg»¾ù7ÀН²¾¸ÿE#:À ÙÖ·óÿ³¾»ÿÿ²üE}¾âw}ÞþDÏŸ‡_u#ÖÎb×Ú–ÖV`,ëœ¬×æIdþOçù37@qR öýøA fü~þp…]˜6|ZÂn~×Mêå Ÿ^žk%2»)¹OcÔäçqË¢Ëà¾$¶¬à~ÀÑ–W†âØÞÄL¹OÃ;ïI¨¥.CyqžÀÚŒ£fC¾ÕðÙÀS¸¥k Öú¿óñÇÈãÂɱOŠü½ÿ„U?w(øûkcñw_|ï½'#¼ÙÔÏÍþé©(iããà(õ_ §Ë;þá<æÌÿɱsx°OÅÙÀ ¨êe=®Ca¡gþ7›mù6¿Óäû™qÿài`âùÀ3Ÿ±2Z?›d½Ýã^özõi ˜éŸÏËñx`¹ý|}Ä÷ì¢ùîä!î…Äص†ãfó?Ô-8¬»13VÒÛ‡Yðuàâù¿AØ6OƒQ‡O»e•‡ßcÿ …ßc&[`ž¿I– mÌ!p6ðT¿$*£t‡€wY°¸¢Ûp"@A€…¬‹A†Áü/ngO!@|ý8äUpVëôû–UNüaQØÀÿ·¬râÝbÖNÏjœñë: (ЍU]Uzoã;PVVY–ñ /àöÛoÇ /¼`0øWWW##ÇÿÅe|°tÞ-îLxLøïOfýTBôÉüoØ/¢éß @, $7á‹ËŒ›–Àü,‚V"}qnþç~s›^ðå,—åïô"t4d0ü‹ËKvÜÍæðxJPêvÁyµ¹†ÔÌÿWjeÍæq?X¥$ àãã4Ï›ZÀ¿ÿþ²OÿÞðªçø-¯ÁÉBNœ8ã;và|·‘P÷,ªÁæÍ›1sæLlÞ¼]m r d"‰èAÒ&I_~4…ä•bŸ¦Ѭ/~¯×< ‰èãK<ªÞ’à~ªGjã—K‰Ò¯_¥pã?‡çÍ} ¿^þkŒ­GA1ÀHëG9™ 2Û=Ÿ‘>é“>é“>é“>éÙõý…~•›÷ゎ_Œ|Ë ?$Ô¦õÉø0ó?7ÆÏm6èÆmZŸŒÿ3ÿsó¾)À1Pƒ¸ñŸOë‹ñ`æ{nž7ñ]BªjàÆ{>­¯ÆûDúÉêàô¼¼~Ó·B–eµ¦¦&L@II ZZZÐÞÞŽúúzÛÏ?I’Ô 6 ??˜5kûÿ"Åô=sæLHšÙ0|=–ä)P]€o­ÝÏECP…#„Œ,.Wàv®{ü=îC0ˆŒÁùq˜:u*JJJl5?÷´¼úrE.ê÷Y–Õá_«@ÉõŨüÆaΆ?áÆÜËÐòJkV Ð|6oŽ`æÌÄ *ìÖ¯U\å06\xK…¡q‹-¸\Ö¿¡PFê~]]"‘xà‡ù»ºÓÕ·ð_?ø—Ob»ãªŒïÿV¥i-vŽ™_Ÿ| »N…!—g/ vé LýuÞp Ÿ £nù6»×AhooC@oÍÿ¼A¢Ø`!ÄŒøn¼€Ê+-°ÝlþOfü·Òç=1ÐCzÒ_¹»'ßb SÌ/ûËøÏ)**RïßwJ§°F?Í{rðPÑß2À`þ_³…qõ§9\ hjé=àá]™ =àëãñxPV¶lÐMÇ7ì‹ûSæÌÿ|î?s?\e¬aQhÇ<4ø¡Œ 2©̾»0£æ¾><Ž=óAƆ«¶²žGÅs~Rܱ«ñvŸ‡¼e?rv<ÎhÆ@‚‡ˆdÒü/®™0ÑfÆNó ×N4-+Ð…>Ýúivô/d¸O?ÝšqýÃÿpŸe#‚ƒ0në?gÜÄáã3½ÿk°q0 ™ XƒÆ’%ì™s& hVú?oküfܸŒé'2Ÿ™7ò I’²rþgÛÙß¼tõo8ÌŒÊ`ý3¯½ëÏÒlû—Ÿ°ß€ÜÓïŸÝúÙÞÿÙ6ÀZíÿ¶ üT°õ¥¬\Äß?»õù:˜÷}&Žý@Ñ7Ÿ"ç‚~²ß lÿ3gÎØzî›õ³ñÿ0°Ž¿H_÷*ÏŸ­BÄ€G‹‹ñ“ÖVÂLþ@, ¡™ÿóîóÆÀ©ÿbŸb€hþÏ{º³'Äm¿Ø™ËÎòS¨[pn°}ÄpcV­ `Ñ|/‚`û¢võ¸¸íŸáø Ígë¼àõÓ€½Áñ(‡Ã‡U‚8?ÐÍûnAm;´qšóröì?¡ù_˜ÿÆøN ÄóNQ–õ‹ùŸÃCD=Y–ÕÈ–ÀÞØÈ$A» é&óøÿŒ™€Eóüµ%µ÷äü|ÐöY¹¢$b»”Î1q9‰Î¿+Zó˜9_ “`xî¹}˜7oÖ®]‹yóæéz;PSó¬fN¯3þ, Àét¢>Z¯‡X ëêØ½ƒ•YŸ¤Åï=…ôw€Ùü0ã=ZÄ… x’¥©¿G¸pëŽá<BzÛÃlدKKàË @ …€¿Ž\ˆQgqô——— þN/V¨+zo#ì#ƒîyŒ½ëŸwí¬}}Š>Ü“ù¿&Öf1á~1›ÿù¸Ú¥3`øéìú Ô-߆ڥ3àùºïE\h7ÿ›5$IREƒ>`;ôI’pðàAß±9€7?؇¦¦&”——cÞ¼yhÙ¹….7Nœ8¡›ÿ@Ú$éç_~¢}` X&ŒgÃ3gÎÄC]¿ÅÔƒåXC˜G¼ž‹ËH·Nò}ÿuÍAcîz©9ŒW¾¤¿yñM[?Gjcl}ì7‘ÌÿA1ð f‚ ‚ ˆH\€fòÑÃLãúeÌaÜä/ÂÃÌãúS€nòÑÂâÆõf3>7Ù‹ðp󸯂>‡?ˆæ!™2ÿìAäË/¿¬ëÞxã°ÈMß .DKK víÚ•5ãóÌ™3 +ú|x€ÇÍä3À×agù)œpLjàH=e=Ó²Zèæ—SE(ìè÷1àå.Ö68ù÷­YÙîéê[ð½pd%@ ˜x>—‘—K…r`T3ÁÛ:H[©W3`5ÞÎc ˲ztÉÿ`õµlg/xý4F¯øVƦcD­úÏ`çÑ¿f"ÐB ÄÂaÖ "]ó?‡7~ä ¹ù?²q# ëÙð¦i‹/@åÊ•@)©ÙÃüUUhð%¿6ëóÆ—[7ü;ªaI狯ÉKªÿÀCÏ`øU7bã}å篘õSÔÌù^¿— šÿg°æº“¶Àôî€í9¬qŒ½Ž'[ŸëD”lßïb@¦Íÿ\?ëG‡{ÙÈüɘ2ú3ìÙ»6+ï1xÎŒùˆ”NéÆ7ÿÒŠ.e=¿5ïÉÉhÀ¯ë@“ƒmáøÞ«ùAÌ! çê~ÈÙ6À P6õùp¶ XVã3½ý™6ŸZé›Í°™Þþlë›9—οPÿD2aþåúaÿ›9¯¿ÙÖÉöõ ûLèAØA*ÏŸBÖkã-fÏZŽ‚’‘éegÝW—òóçž8<`aÜÜÏê'ÕÃvaÒkïÆßÄR´®¹{zg/˲ª¬dXy±¬÷¬W®I0vòÞìS0Ìs’ö|ŽëóÖëdÙйH“`þ¯UÔÉrJ©è‹¦5n¨Œ+gêš›æz °Òç!gOᥗ.Ô;™hooǽ÷³Þ ò÷þTeüÜ¡àï¯Åß}ϳ€›s€Ù;š±¾ ¬ÌÆ©¢÷l_®$5ÿHàp¼AÞɘ3ÿ &Ÿ§›%1Ø—ø²1gþX¿fÎø(,dÚ¢ùŸë*å —2C?ÀLÿÜÜçPöÆ5³éÉ þÉÎ1€·#Ù¶à¼~{ƒãõr3¿,šïŪ5Æ^··©¿°ÔçYðúi¬¾ö|ñjWô¦aqæSY–Õ-mŠnÌ/W£yŸ4hÓœ—çÌÿM²°,æÛ…X`ô6@ÖŽ±"Ô—Ûgþ ƒ¼wÆoo£Á¯ÕïøŒ!@JAs Þ èðÞÇ .#ëŸÉÞ“‹aæs…·{ÏSŽ8NœÏ|^[-“›ÿ¯hÍ3„ ˆAk×®ÅX„çžÛ‡þ°È`ô¯®®F8ÖßËÆ-:IMú`6ì›MübXÀ®]»’†X-+•¶{¢ÁßÊü/šíVwÍ!©ŸÅ^>™ùß2¼Fœß"L ’™õeYV Bê|¸Gä@í`/˜ĺœJÔG£†ßj3555€«=Ž·ÎÞ£›Íÿôz@O ×H¾^QÊèììDý¿ÿ n^Ýüÿ¦˜C@Ýòm†²æå‹ænÒ€he4. eç¼ùÁ>Õa_Í>C€¤æÿ”îóÿ ï]¸=ÛÖææfŒÁÚ?äæævMlÒ®­Ë„åÄŽ€X°Q²ð¡Dðnþ·?®œ/‡-ðrdþ'‚ ˆ‰uœ*AA‘UD#¿hôçÃf£?o5­WˆF~6¬êÃb8€X&¡j9­7ˆFþMp¨ÜèÏMÿf£?o5­ˆFzÑhχÍF{>ÞjÚ—QŸÃ(Ö××£¦¦&cæNGG‡á3[´´´dU_QÇæÍ›ÓJ²¶‹0 Áãúð6Ϙ¶¢(ŽiM²ºÀÊ šÿ¹?@ö‚£ù„ë0\‡`â€ò>ÑòJ+n¼¾X²Wçæ_x€uŸd%ÊPQGö‚eK{áeN×·“QgñÒiù_ü _‹…dˆå§0Þý àPð"=€ã«Ì©']? ëÃ@vê¿¢(ŽºåÛT,™2ÿ€ãŽ;î0„pêëëqëúÿÁ–9ßR‘æ)ö€´cÇGaU•ÊÍûhfe\. ë«â‚*W[½VU鯀…$ëýÈJ¿bÖOUÞxòä[/ëúU4Å<ðÐ3†ï¼×%±gOú½aß¾}Ž‡ŠŠÔû÷°;™6ÿóu@ÑÕêÕGÞÀš}˜ÿêp¬¹î¤-Zïº §î×ÿ@vÌÿÛîŸ×þ\}°îÁŒ˜ÿ¹fQQ‘š ó?רè!õ~Ö¶(cæÎßÏìÀ”ÑeÀh­‹dÏüðãŒõ€nÅ—B2Ió]ÃZ* x5ßV½}ûö9Šþ£HÝöû{.›ÿ2ügšL˜ìHŸôIŸôIŸôIŸôIàèAØA*ÏŸ·nøwÌÛЂµ³JPR\ŒŸ´¶âQísÎØ‹kþ-°ûφ €þ|þ¼dS̵¢2Šïv‡0iÍ@ð†œ!LÎLb©ÿ˜ù]4ªcz̸.NÓ†cæwEqÈ‹eµ!‘X3Èó²¤o­ÏÍüœ+3î‹Ó´a½<Z²ÖçÉ‚ÑE3¿NëÁĹÌ<,˜ÿ‡,/S•½ äÙËŠÓEqÈÛ UËŸÏža¶··c„ >5hrNãb— …B btàtL~ >¼/®™ÿ¹!?¶îÉß× *Ôz׎é÷aŒq|¥—;ê¿Îr‡Á䞎ù¿'¸yß*àl`oÜ8Ïû—`ýš!qæ+EqÈM²:^4h†þ;5ó? ™ü½^ƒÁÿài­ÜPc` B0èßÍaœ¯³o[p 3V³ý»Mý¶-8W–›ÿëÖÇÕ®g(³jM³çß ÷d ¿›Øºæÿ-m U¡›ÿ‡ÿ+0IÉfðwhfp#¡ù¿Çùpó¿Ð‹:—{hzòöÂÄõ^3üëAÚç{´É9ÌôEw(ÞðoZ7ÿ¿÷1[ŸtÌÿ‡¼ ä@¼ùˆµ¿óù e±å0þ²j^&Š¡òO(pÀÃÞ+mÌݨ{—Í ýyye–&«q3ÿ'#:jkkUnXN4]3óÂ3fAf|..ÖR'‚A`ÆŒDAIC¬ þæi¢YŸ_¦nܸ ÀKºù__†<;a½—'–OºÃL°z1[5×tHg>GþBŒª8‹Zþ—>èÀèWîÓÚÿ¼jXÞôcÓ±]ÞžÒrÅc_®(hJP^Îz ¿£èj<»o˜> X›ÿ¯ðv ú<„€! ˆ™ÿù¸šŸ>¯òqqæÿáמ_ùѰ4``á&}R!m’Ô*@ªF1bÄ”WVaÞ¼y(CæÍ›‡®®®8ó?¦Ø »¼z@Já3ÿߟû3 wà¡®ßÓCÚô’p©`¾o2ßcÈò2Õj|ºø»ýðåøt³?ÿ.NoÆ[‰f'‚ b@/T‚ ‚ 8¢ù?Ñô~1ý'"aÌüŸhz˜þ!šÿMïÓ"Dó}¢éýiºhú€Ì›aã£øb"[É¢¼çw »¦ï€,Ëê’<ã ¿6ö|žd=€ìq³©-®ƒ ;DÈôÞ0ük†ñÙ4àɲ¬¾ÁíñÉòÙX CõÀåR¡\Ç^.ú;Þnv ó•¡ì ü* Ù¾²,«–´!çjö’¾û&­(°}ûeYV.ùÀèßÊØqˆõÈêõG}öÙgõêëëþ÷Uø.ÓW¥WëÄBñf~úwóx«é"©6€õÍf~úwóx«é½ÑO½gø,B‹ŠŠÔ«¼¡cìÕý¾>±ÇkÖ |ö×#“d«¾ Ä㟠†«¶²†}¥SXã¿æ=ìûOŠ»ñEk«íû¥¨¨HÝ»`¿pvw&¯¾$#Çd \ï‚ ‚ ‚ ‚ úB*ÏŸOœ87_Ë%— dÿ~ý;ï)”“ìù³•é/UVTF‘;-ö.HÏø/"öXkax7 ‹åP…¤ó˜ç#ýžõ- ÿ†a±œH:y¾”¶?ÞðoË?J:y>³&ŸþÒK"??hooǽ÷ÓÊ—£†.ÇÇcÆ`ÌÇã£Pã¼ç[$#Ùº˜{WʨsChñXy.ã.õï`=ôúÊ|qeÍ=€Ë²¬nÚ”—+‰©ºŸ°2^ʲ¬æ=ÝŽðvãÔ±q¢±Ÿ›ÿfäçe: ï>öþyØ¿eÄžb±ò‘ˆ‚6ïHLv¸ГútnòX(Àª5ÃøÉîCX}íùz0ÃñÀ¢ù^¬ZÀ¢ù^ñjWÓCòE*_×rEIlþ3ø‹ð²pǦõ4“pÞÆ.à ›/H¸¿zBNôàt¾›°'v€ð–öëSýް‘<€£¼;…Õí+ºCñÓ¯ð8â¶ö¸r¼ù_ÜO|ÿ¬ƒ5xYi‡nðsÞLUWì}7¿èìÜšöû+þ1ã}”½Ÿç½’÷¤/õ­Ìû°š6cÆ ”Kàv»Q\ìFkkÁ`MÑIض™¯Íóõ´cÈ‚ `µ?ÅßÃu€üÍ# ðòh=€²²§àt:‡±cÇ]q×ìDuÊ*b›~l:`û¨í ×s‰c |y@¹ë@¬óùUø;½X¡®Ð·¿§åŠH’¤ÖG£x@û°||ª3üéO 7Ü`ø~GÑ)Ýü?f»îpó$¡>´a«cÏÍÿÜÐo^OI’Ts€88®VëC¤zŽßdÃç‘$ݘo¨Ëú¸[ol-ËÝâŽ[¾nü;ÇèóšCâföÛöeä½ ·G O{AzgOÊòÞ8x*A½Œ¿O²ºçè I’Ôè…QTwÍAéׯê±|ó_ßBcîzHŸ¦v­!‚ "³Ð3AAħ'ƒF’ü3ÌàŸ€dûLdSŸ¦ï‚9µ˜öIvà!œþ4ÿ‹â÷p¬S}©û•B ¬_~•¸6ùú7ë–QkjjP__[×ÿ¾wÕ¥ðNÂ`=^hAií#ÞSQ¢€Daâ07þVU¡Áçs¤Óû‘•¾Ø3Q€8Ìÿ³~Šš9ßKKÿËŒhÐ&s.AØÇâbËÛ™0ÿsx€Œ™ÿ ‚ ‚ ‚ ‚ ¾ìôöùó†GjÑrü”Œ¼H7þ§ûü¹/!sžöÖøoE:&x«q‰Ê“~êú©†XKT>­íO1Àj\¢òf ±t³ÉÎX6¶¬ÃÓ¸ØåÂG¡ƒ¸F/§¾óg`²ØFè ?ܾ'./Y¯Ô¢ÁX)WtS¿VFÿdˆ!< ²²3HŠ öÅ. sæõk†àŒßaè}ÙG)Wp¸4€c.ýšÏ|Ü9”8ÿ_f<íœ=A¯Ãìksôén ÑMý3ösóÿ¶ǰàõÓ€Ù׿`ך' ©0­i˜aÊ ~Àyyl™ÿ‘lþ,`K›‚[ Ì÷Ô™ý­€Ä!ú ŒçÛÖÛ¶b»+Ó¿9<Á*€ÏÛ[ý+Zóð‡Eá„exÀ‰'P]]m0ÿå&W´æáÝâΔ×ÅlXæ÷ÉLüUUUj²€tÌôdæOfºO4-éxeY€”ƒÒü½´ÞŠ!Ýsî}üqЇEó¿Õr{Z@˜™¿Iû-· ¸á†tóÿ„SÝh×>S èùß<ŸU(€q|\@ó¿ä•ôù£¨! nß Æó|bÀ€± #fì¿?÷gú´‡º~«›üEŒ÷7=׿¾´•ã!þîØ=ˆ/LJഃpïœ7È[HAú‘&‚ ‚ ‚ ˆ/¢A™ÌÉ_q\.ëÆZ0ÿsx€Œ™ÿ‰‡ öQ€ªÂåЫA¯êƒ¹äŽ;¿_ ›û9æp^ž/GüÞýúõTèæ~޹qfèA|à¡dþ'‚ ‚ ‚ ‚HÞ<æ½@«ÙÛçÏ} èï?ÍFL«aCYnt7Þ{k~"ýôô¹ÑßløÏØöëF£á?™¾ a7Ûõ žù äνa8¾ýqæ=®—lŸ˜ Æg# %“"7%î­\4ÿ[D" ŽÏƒ¼Cð¶X·—…ðõ7@²ï¢ž9ÀlØ·âF ß@Þ}^<óàñý|yæå‹ãÍûygù)l[p «Ö°h>3œsƒÿÞàxƒþ Ço0uþÝpcèóÌX= Óš†v–ŸJº ¢ùŸ¯ƒp@îÆÉÙ4nÚçpó¾Øá'Ñü¡Ý9zÀ;sa0ÿsýdéþÍð€CÓY¶ª÷¼íJŸƒÞ àÝ)~L<¸EôÁ IDAT|ŒŒ÷>fË»|Lß:ÄHÈüß-nÖ1‡cpªºªðÏÿüϺùˆÿoYåÔMÿârÓ]WI’Ôºº:@mmmŸBzkþWrŸfÃf} 3~²p€4Íÿ‰Ö¥?eY~l:`û¨í†@>Þ5Ú…ïný.þ»â¿@ éóôVŸßÿÕG£x[w%bûGNˆ›G4ÿó²|¾‰™áë£Ñ¬ ý,Ç›Ç%ŸhœÕ>€ØýlÜø&qØ2TÀ¢îóú6È{àöèôi/HÏëæÿd÷;€ýmþÌ!¾ŽÔÆØúq†qÒ§É ‚È.ƒ³½AAAA¤°Ï!2hôO„¢(ŽI+z—pO|epŸjpoÜø´17X,++S|>GYY™ZXÅz=0˜Ë[-§/ú¼'%Þû’¹!fêA| ã?AAAADúôæùó¬ûêôq}}þ,—Ò§¿ß+%ÇÉ‹5Óôb£Á«·ï§H?=ý:ÍXW'giûåeªø™Š¾¢(y{¡n¶`0{Šf}q:›wYü÷†Éì3ô†À?zëMÅüoµÎ†Þë˜­ÊÆmk€™–å;F••0+˜ôkÀÙÀ¸C Á¿ÃÐcse% ó‰ßÍú±išîlÙ¸ï›ä¤Û÷íjàŸðàiöBn’!†X™üùø¼§ÛÁõøöF" Ú¼#±àõÓBV_{>ê®=ŒÚÕã,×eÕš€þ9CØÆ‚Tn8U<#õ}8­i"°0ÔÿÄÀ4ø»÷Ø8oB¬>Ü*Ëê–6·Z„x|JÜü ~šùAàQÓU×q$ µè+bÀFâsWV¹qŸ4~›K«ßñé†`0þºùÿÖ¶_ÞûXÁåc„á>ô€ÍÏ›Dãíjÿ`077im-LçÆÆÜ˜fuŸÿå&¢Ù¿/æ€ý¾×ÖÖZÞ˜{Pß¶m0c Š‹Ý¬`0̘IÞÝ[!š÷Íè/ÏÖ¯3¾0M\+;[µšžÎþˆ[›ÌÿÛG±®æ§›ŽíòvC lW·ã»ø.V¨+@žŽé±õìåºñcY#Ij}4 mõÑ(pª8ÞŽOuãoÚõÇlþ×ËjÃâò¬îEq&6îÃTEQ¦yôº` `U6Ѿ‰F£Ék4û'2ÿ[Ý'ëÓØgÜöšÃDóÿcª Á†0¤šÀC]¿MhþçÛÅîs–í¯e¶]‡D|9>Ýð$tÚ0ž ‚ ‚ ‚ ‚ ‚ ‚ ˆ¯½î=(eee*oÔÈ?Àã÷«|š8],c§~ýú?fDŸ ‚ ‚ ‚ ‚ ‚øj’íçÏ’$©Vý©AÙF–euWUc&ÿäßÍãøðdÂ?^Ƽœ¤ëô â5µqúò’|ç·Zž•f0èŠÓäãøŸXÆ<½§ù­¦;wçèÓù0<Ðÿ ûX'ίÏgZ¦ÕwQ[U¡~Íÿ™z‰×¯ÿyÞÿ\õ¿¯ªž÷?WÏHU–eUñŒÔ§‰e/ñúõ2â2ùúòaó4þýG¬¬Ðÿø8>ݪ¼8í óëûÏæËµª¿Éên_þÌÇÚªÎj\/¾mï8 6€ý©ïøTõŸ>N}ǧªjˆýiãÅe$Óì-ý¹,«eßÒå´¬£æ2â¹ÁÿÄyÍËêõ–$I}ì±Çôßñ;æß«ªªÔ€×©†^µûí€xՀשVUU¥µ²,«(Þ·âx½þ å.«'-<©–••©555Ú½Ô“±åï¶\—þÄ|¬½ÿàÎÏÄåÄò|ž¾¬‡$IúyLJ=€:cXŽ:cXNÜ0/ÇçM÷Ѽ=âõ3ÙôdãøøDÓm76Zl‹6®§a}æÏ0,7¶MOªƒ¼ªáº=È«Æ]7“í7¾;¯M:“ &ú£ÿ ‚ ‚ ‚ ‚ ‚ ‚ ‚°DlÈhNô÷UÒ'‚ ‚ ‚ ‚ ‚ ¾šÐóg‚È,VæAs@¢iæñVFh£Ù:ýu²2ð÷4.™q4UM³aßj|*&ïT¦›Ã’}7ÏßÓ¶&ÒU<# þ÷Uý“p©â©çÃü{*¦+ãªÙÄ/nk"óOßy˜€h÷†ò|sˆ…¡æe[1@<¦æ q˜˜÷›yù_Ìë.I’näç¦~I’ Û*NKdšî/¬Ìÿ¢ñ_4[…¤ÌÔo5-•€”4µ .× ÑG­TÖ%U3?_·þ0ÿs¸ñŸ×Á¤nîOówO†ýd×W«r½1ÿLý†sy«ù-ƒ,¶E ð{œi—c?‰ÁÈüOAAAAAADJ˜7š{D²»d¶õ ‚ ‚ ‚ ‚ ‚ ˆ¯&ôü™ VÉÌÔ‰ÌÏikö`U¦¯šæ€DÁý¥'šüùw1À* ·ZfS¿ÙܯxFÌûf“¢q|ùf³ªÕ:ˆÃ‰z²Ow:àV¡Vú‰êp_yÕ´Ìÿæñb€9€oÏ©¡Ðÿø÷ôjÃÀ„›û¹ÁŸš§›ËÙ½^fs3ˈ!é˜ÿ9ɶ#a@ëºá<³ °™TLý¼Lšÿ9âñä!Üð/žƒýmïÉÔo5>ÑrÒÙ' ÍüVã6Æo·94 Õm¯‘éšÿ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ¾´$jy®èAAAAA_Mèù3A ¬ÌÿVßë‹f²qým LEÓN=³©¾¿øòÒ1÷›çI¶Þ‰Æ%Z³9?Q¹T§‹ëŸªF²ºœn€y¦»Mæs€9 ÿY |™1ÃDÓ…d‚D†çªªª^™ÿSÁ®m´ª¯ý4κ$›Æÿ™ }0?Ø$¿&ô·–VÛ”j@ºûÃ*t‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ˆ~ ?ÍàDrì8ÈFÈ‚]ËìFOæçTÿìXßT4ÎÕó,YHñÕ$ÛÇÚóÿ@FÜÞþÜöL…8AAAAAAAAAAAAAAAAAA_&²öEúç¶>qn“íúGúç¶>qn“íúGúç¶>qn“íúGúç¶>qn“íúGúç¶>qn“íúGúç¶>qn“íúGúç¶>AAAAAAAAAôI’Tx J’¤ò†0âp&ôK²«võ‡9wõ‰sI’Ôd·þ‡œÙÕW<#³ªÖïȪ¾¤ë‘Âõ'Ûú/eYÿGvõO ¥ë‘$IR‘¿0»ÿÿàÉ,뿎ëN×"+ÐózþCψlA÷?áþ#ÛútÿCdºþ „ó?Ûútý!‚ ‚ ‚ ‚ ‚ ‚ ‚ bà08Û+@ |$IR£Ñ¨C­Œ²i›$U^–7Š1ÏÛú]s5Íu’*gJ?ºRÓ\,©âp¦ô»÷jš“%Uþ*êç6Võ¯>Êê\$©â0™ú¿£i–E$UΔ~Kåy€’M’*gJÿÄÊ.ÀˆÅ’*gJ¿³‰íó¼rI‡íÐ'Îmâõ'Ûú4ÍY’¤ŠÃ™Òµ‹i^'Iª8œ)ý>cšK’*Û¡OœÛXþÿ‘s·6í U2ôÿOt6m¾*gN·6íU>wôkÓFªâ°úĹ =ÿ¡ç?ôü‡Ètÿ3ï?²­O÷?Df ëÏ@<ÿ³­Oׂ ‚ ‚ ‚ ‚ ‚ ‚ ‚ Ô0HŠ$±ÞÒ&Éа%Z¢$°OhäMl@hÞëF0’Äxç®3êwÍB=8Fê VÖ1‚}æ®cú¼a¸8ooô£+£›¶ePeÀ¡°²ª¬Í³XÛþXÃð>éwï"g²Q¿{o'_†ß œ|‘•~3ûÌ™ÌôyÃlqÞþÔODêç6’fp­‘Œõ¯>ÅÛ®ð¶VöJí³FbõO0Æö©þï(Œ¢,bÔßQE8 8@8ÌÊ:ì³,Âô…`€>é·Tž‡’MŸô[*ÏCGè8ò]#Ñb ó]#%›> †|Þ'ý+»0bq®AÿÄÊ. ^„ñîOp(x`¼ûÀˆÅ¹Ä€Ü>éw6E‘WnÜÿMQt‡Èq©è±Eç¸X'Lyålÿ Átý!zÅ@¸þ$Ò?`€ZÙI6éoˆF1ˤ¿!ÅcÑÊŽÕ>giúB0@Ÿô_íŠâº\£þ«]Q|¨ßpj}¯}CS¸.—éëÁ¹}Óÿè³(.jÔÿè³(ž&ž<ÍÊN<Ÿ}^<”éëÁCéúCôI’ÔhÎݺŸ0þÿ‘s7бÈŸÌ>6 @ê~€`Ræí•~t $i¾Q?ºÈo:ŠÙ'À†HÒ|¦3¦ôQ7$é“þnAníÚ0 I×húº1Ä&ýDóô·þqHÒH“þqû\¢}B$i¤¦¯SèúCô zþCÏèù‘-èþ‡îèþ‡Ètý¡ë]‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚È Îö _´Fàjüñe9¼1x_{ÃèšÕ{xQO@o€® e9¼1x_õµFàqúEh€.”åðÆà}ÕïÞÕ{X9ùb¬ºÞ\hœÍcÛ¥oн9V¶¿õ‰sÍWÿÞÐ>,‡}9Õ­—åp3l_ëŸ§Ç ÀЂv8cú<  ¯ú, ^¿#t<@€ãZÙ‘útÐW}¯(x‘@ŒÔÊ~¢Oça}Õ×Bâô»CŽX>ÑËrx]ˆ¾íëO"ý:„a»ôµ€8ý#‚®X–3«Ÿô_íŠâ: ýÕX¿äÆ ÐWý>‹âb ýƒ§cЂ>BLŸ‡Ðõ‡è Ñœ»Á{˜4ÀÍ'Âp4ÿn}7£ôùÿfB‰×Ïo 0ZÙŽ51}ÍŒÒwýÝà=< ˜XÙ˜þ56ëkë€`ìÑ?Þä‘ýqÃÜxÂtGö‹>qnCÏèù=ÿ!²ÝÿÐýÝÿÙ‚®?tý¡ëAAAAAAAAjŒ@Ä!6V‰ëíÓ0*õzŽÅ–Bopf}±·7Žº"u}Ç’˜~*½ÁÅm¿ÐÛ›Ž/í÷ ÛŸBopf}±·7Îɱ©ë?ÓO¥76+}3vêç6æú'ö¶Íñ õú×€XýK¥7l³þŽÂ(ÂaÀ錕q…S×9cúe‘ôõ[*ÏCGè8ò]1c¿Üú)¤xbíK6}ž¶þ‰•]8¼ãÝ1cÿ ßÈ„ó›9ë5ˆ±87mýΦ(ºCä¸bÛáp§¾ÿÕ`lÿç•Óõ‡HÎ@»þÔG£8`R–ô7D£8`¬Pæ¦4ô_ôgõBÿÕ®(>Tos}[M]ÿGLÿºÜôõ?ú,Šƒ§‰çÇÊ û,uýSCcú¥ë‘œ¸ÿ?ÄÞ&9Ϥ¾Àü;cËN¡7Ê8}±·IŸ¥®ß Ëî¹7Êx}±·Iδ4ôw Ëî¹7Hk}3™Ô{›ä|# ý…eSo”Drèù=ÿ1뛡ç?„]ÐýÝÿõéþ‡Ètý¡ëQŸ®?AAAAAAAA \g{ˆ…Þàˆïñ·Þ4Ê`ªJÆ·ÕQ±ù¤¤Eu}Þƒ›¹Ç7ÞÓÒÓ×{h‘¼,×ç=¸™{|ã=­©+ÒÓ×ç““—åú¼Áµ¹Ç5ÞÓ|éé›{hë­¾¾cGÁé<†ß„_8­Jħa”&nx×ãõÛÚgF¡¦æ®”–W_ÿ”>ß•IKÆôw2ý²ˆQ?fŸž4õù|ÎήßRy Ätýí1#½+œž>ŸO H¦be`„éúw(x>Ž>ŸO H¦ßÙÄö^¹Q¿;ÄÚMòLKŸÏ'„©^\ØšÒòB¨Hûú“Hÿ€ö¹2M}>ߤ¤%cú4ýY&ý#Ú§'M}>ߨ¤%cú¯v1ýëLújßnJSŸÏ÷š]sÃ?\lÒ?xš}~[…‰ž—SÒ?Øp£>Ÿ @Vè† ¾ÇI½·ÉVƒ©5êŠQB‘““æúÑ5Ú°©ÇI½§ÇgÒÓ×ç+N^X×ß­ ›{|ä==þ,=}S‘½×çLKS?ub†Xô8É{›LWŸÏwI²¢‘òó1T,rƒÃ–ç?éèÛñü'};žÿ¤£oÇóŸ´Ž?A¤Hª÷?cûuJË;rï/m¹ÿIK߆ûŸ´ôm¸ÿIO?uR½ÿIOŸîˆÔHõú³×µ<¥åM-µåú“–¾ ן´ôm¸þ¤§Ÿ:©^ÒÓ§ëAAAAAAAAöÑË€Qi8éŽÙДôíÒF£ik΂#  S+ДºùÜ€”ZïoÑhÔ!­cÀyCpõ†\¶Îœ«½è~#€÷ç&Þ-Ž©õþFÒbÖœ7w(½ QåÔz‹F£i2k„ÍbŸ|Ñ:|à²uÆE%Ûþá7§Öûš•>_€/fþŸ:4Ù’âé¿Þß¾ºçß¹®F5š –aßÐ>,°íÔEó·SsÕ‡¹Ë>W"µÞ¯£Ñ¨£,ÂBx@8l>àý=é;@Y$5ý’M,€t„Ž[†x<Ëe444ÄËwDɦÏSÒ±˜…ð €CÁ‹z> 2Þý F,ÎMI?¯œ…ð €î#.|À™Bš‚xLr\*òÊéúCúÉIåú#šÏ=ûÀª;.MºÜt®?fý:´ébø×NERú³´pÖáÏîf¹Œ;ŠNÅ `VŠú×i!<àCµwá"ßp×妦±Àƒž6†Lô¼Œ#îžó îÕ‡'ž\<”®?¤ŸÖëàj4çnp#JÌx˜ÍÿÏLypçž;’/8rJ½O2ýùj4º܈ÂzŸŒàÚ)éw§Ôû$Ó¿FFw#ÖócÐ2|àƒ9û,—ñÍõEÿ?{ïÞF}çû¾e dIì✆‰’{¶Ē’C/‚cØ\hZâPÈvŸeÙfïRîyã@Ú;fŸóÐö4–D7{8Bã,Í&‡e·8!°pÃM4r(—Ü[B"%œbSÒÃ⹌>£ïüÒŒ4£‰?¯çÉi4£×Œ<úê«Ñ÷ýùÚ,{šýÑÞ_Øå0ãÝߦ*Ê8(ˆR þW=“ º¤—8ûä™ûþ›î~/×Äð÷KZqåî»K?q€×ÈOn/þ ¯ÿÿã¾lŸãì¡«-Ë‚¼þã5|/äõŸ\BõT̾³|ý‡ýnxéÿˆáï¿ Ïümþdé'°ÿC~r{òØÿ!ÿžÎëlŸcÙè³6Kƒëÿx ß› ªÿ3ç§âÆkïpõ=õÜ&á÷ØïŽ—öG ¿|ϧW<ü~é'°ý!?¹=ùlÈÿ©-×Ú>Çïo{Îfipí×ð½™ ÚŸƒ±àw±Wßyòná^íÃ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0L‘ ÌVð6>jÌþÍþjø%Éf¶/ÿ›ð€Åðùç_îÁ+W$ñù—{¯\‘´lþuvq{J—¢Ï*gcç×]ÓôQûð¿º_T“½Š>«œ¿>èš XÃÿ^Ž_=„(ƒŠ>«œ? ºÖ §­¯¿y_Äeäå´çšuPÑguóâ÷#”ÓŸ‹áÿ=hÿØpû’)—ÍÎÖ·Ÿu0UÂïÙj9³û«á·;ÿ(ttfÞ95…W` ŸÇb1ý¶9„Oþ£3›€SSR}Vm/ç?=€ÅâÑhÔà.åßY`WTÁò#Þýº§iSø_–eËk!.#6 D1ޱ®6´—ÑþR€ƒ ˜‹Ȳ¬s"‘° ¿vm81ø.ZËhÿ¦ä¾ò¸^|€ Ȳ¬ÿ ̯E6›ÕýofÎÇÅxùQáNÿíO9³û«á÷Úþ˜ÃçtþݳE¶„ðeü‰¾}%í…î'¼ü÷lùÿ íO)ÿDá¹ÊõSèž ¤Máçöç ~:ŽÍŠ‚Õeø)tOÌÅd¹xÌ[^›i)<@þc ÏO*¸¦ ÿá‹ûq Zû· ñ4žîû4€7qųãåëÞ\ñìņmçdêçß[*€·¡à¿wf«g=ä­ÿÿÉ}ÕùþÁþàý¶ýoCð0‡ÿbûó8¶XBø†Ùç'Bi¹CŸÕÒSÿ_}؇ÿÅö§¤â Ð(è³Zzûþ‘)îÇÄAƒÿ×õškÿG÷·&EyQŸU²œï?zÆT|@–eý˜ýW¯Y _ÿ €x~1x’ Â—¸¯-.Þ eM‚¢Œë³Zúiê;û7û«á÷zýÇì¦6à%xCÏCßÙo†>žgØò©ç6™Î¿àú?Õš}œýõó{mÌnýúã=²%„oðÔþˆá±ý)é°ýÃÿNíÏf€íÙOÇü©-×Z _ÿàÚŸƒ±àS[®Å,|‚“Ÿ…Y÷|8ùðY†-Ï“w›Î¿ Ú†a†a†a†a†a†a†a†a#e(†Ïã63ÐeJO‚쯆_’´ß ˆ³¾9„ÿ º-.ÿh²üôôÌ:µmÉ#H* ‚‘$mÆ7ìo.áÿ©½)¼Úk¿cñw×€4lôÓlo„aÖ7SøŸBÿ忚8®©ßèg[L³¾•ÿÛ°ó‡Ö×€´¨´ŸöA-LáøN´þ7#§à8¦äÎꙓ8®7û½S ŸÛÍî6 »Ø_ ¿T˜ñZDœuÛþ§ð½y¢È†¯ŸÄ†¯¯@vo±à†™ïê!\蓌çÿ®ùF?…îçð¿€wóÇõ"°üˆÑ?ÖuŽa{ ÝÓkaþÝæef:{\/í¦ö÷Äà¤ÁO¡{z-ÜÂÿæ¿…Ù/ã8¨´šÚ¿ü¨ñõŸ’C†þF£zð¿TøíCØp+ íOr(€pgeí…ÏÐñkË£ßÞ}™eY°°¿~¯í9|¯w1Ø‘ùÕ0ïíÙO¡{À9ü/à)tïäOà¸^ÀοÙä§Ð=àþ ˜—™ýý…~+yV›üÏOýº§×Â-ü/°ó§q\/טüo`ôþÐX€€ÂÿÇâ‹pųÀË×½Y2üÿzOèÞÿyJ=®€ ¤ÊÚ Ÿÿã¼-–Gÿü —YØ}Ãþjø%IRõÙ&‰á ß—êÿLÝÞÜŽÂùÀb=„¢97¿ÿ(ŸÀ0뤳ßúwôO@¡hλMþMÏ1`¬áÑm^fô?´@¡hΫ\ü…}Ð_‹ÒáóßÂè¿ÀPÅÞ?#öá5Z þ— ÿO­°’¾uØ ¡hζŠÚ»Ù× ×Yà}Ãþjø½^ÿ1‡ïeYvèýç>pǶoߎ¿þë¹þcç§c¾F,þ®ÿ8…ïí–™ýA\ÿ)þ Øùƒ¸þ“K¨¸8þ.Pþ— ÿü=výÇnöuÂuvß°¿~¯ýsø¾Tÿçí«³À¯VÚÿ±ó;³Å@ÿÇ)|o·Ìè¦ÿS*üoþ[ýÁôæüôAÜxíúè;û’áÿ·—öÞÿ±›}p…Ý7쯆ßkûcß—êÿH;oÄ1ÜXìÐþØù阯0nmõÐþ8…ïí–Yü´?¥Âÿbá«?˜öç`ìø]¬x˜uÏ'%ÃÿFPíÃ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0Œ•&ï«Ãç÷'Ú°¦'„5=!d²ÐoߟhÓ×.göùJý×=ñ®{⵺ùå‰qÈãuñ÷dgë^º]©_Q”4"î 8øû=XÂÿfœÂï€>ž¯­ ÒˆiD2Ì€¡(J¨yXó«'„Áßy؆ÿè§ð¿Å/¡V yXBó°Õ/õkþPNüM¯ÅˆÑÿÊIKèÞíøC­€¤~ R¿Õß´HóŸÜ)̸vÂþ¯ôõW#Ú,lM‹$4-rö´bøÐBÿ_Z¤ä(üÿ¥EÚ?B ÿkƒ/›bÚßfÖMÚ2;¿7ŠáóeË–éàl6«ß^¶l™¾v9³ÏWâ'o½üõ>þ ýŠ¢„ú$íüÛ‡bøöSS–ð¿Y–‘N§ aø _×&g÷fýb0÷Ô–è“$ôIÖóùg/:ÿ IDATÍŸÍÃÿGg6YÂÿ"¥ÂÿfÿRÑ(°üˆ„åG¬þö‘haw ÿÓkQIøßìF–XÚG>BûÈGk3-¼Aáz-ìÂÿ±X ‰DÂvìü-±6\­ýÍhío¶øÃÚë?%‡ôð?½bøß±…ÿ鹨ý¹8þ.šb*•µ?>ÿÑŠwlÏÿ­xG_»œÙç+ñÛµ?µô7Êñ‹ûP©ßKûCás3²,ã¶KOÂðZø¼¼ö‡ü¯£þ Öð¿ˆè±ó·XX¿ºà?†bø~ÂÿFÿBs¬–$¬¶ñ_Ó¬ùßR‹áz-ìÂÿ±X [^›i»?vþ9. ×4K¸¦Ùê¿`†æ?üa1üO¯…þ·C, ‡ÿal. i}¥ fH¸`Feí…Ïw|á)Û÷ߎ/<¥¯]Îìó•øíÚŸZúåøÅ}¨Ô¯(JHšÚ¤Ý™8X2üoF–e\ö÷—ÂðS·kÊÄóвÒÔ&HS›¬ß¤B˜µå@Éð¿HÉð¿Ùß²˜X Iº’t·ÿªÂ½ Š3>¬<üoöO,‡$]Iºª„ŸÈ¯…5ü‹Åðë¿zÍvì_íg?}w?„bø¤ðZá;ÄbzøÆöGãHR$©­¢ö‡ÈWl²}ÿ\±I_»œÙç+ñÛµ?µô7Êñ‹ûP©ßËõr›‘eg]mßû€Û¾};V¬X¡-ôyýÇÎïTðÀÖïóúO¹á³ßïõ³?‹áã¾l÷ÇÎï÷úþ·A,@á³?ˆë?@NϽÐöý—ž{¡¾v9³ÏWâ·kjéo”ã÷¡R¿—þ¹ÍȲŒe£ÏÂðo_­]‹²ÿcç/þ7û}öÊÿ›ý>û?f,ÞÎël÷Çþõ÷×ÿ¡ð¿b1=üàû?@Î=8Çöý—{p޾v9³ÏWâ·kjéo”ã÷¡R¿—ö‡ÜfdYÆïo{Ά—vÞÀÔÿ|µ?v~§‚¶~ŸíO¹á‹ßgûcöÇb1|j˵¶ûcÿúûkôð¿ b1 ÿ[ý€¿ö‡a†a†a†a†a†a†a†aÆŒáó‹ãGEoŠá¤6ŽáÍÌùXŸÖf7Hýªê¯V@N^`¶ýÈá²°ú_÷k\zé—pé¥_ª‹ÿ·ŒˆZû‰³zÚñëƒÀ%Ó6áÿW®Hâó/÷þ9…Ïeù;Àq`d6 g€³ó7Kµš° ÿZà€kø_÷§gC=QœÎöøû%¨Ó#¥ýtÛíøÕÙåŠ3ÀÙù›Iú@i›ðÿ+W$qùpÈðÏõõ;‹3°9ù͈áÿïg?¨ý[pn1ü/bÿOÉ!D£ÇqrŽˆrò—Æ>¿ä’KN§‘N§‘H$‡ž={hä ßf"‘@:Öר¥Ïž=úñ@:>íý‚]jZ^*ü/¿ sø<»7ƒ¾¾¿@³±Å°íüËH0gÌÂÿN8ù˜lØ5ßÙß>òZbm†å~ÃÿäegcBÇX×9ŽþÖþfKÈÃ.üŸÍfõ¿½[øŸü‘´ê?18éèwJ¦Û° ÿÓß\–eÃ?»ðÿ”B_ß_ଞ6LÉ!äG+kÄð¹SûóÍ퟼~W2ð÷ŸÙo×þÔÊïôþ¯åñ´~ý¥Ú§ð¿]ûcŸg÷fÿzjú$ ËðÛáäÄl¼îâ_-I˜cZî7üOþfã€Í%ü×4K¸È4,Ú.üÿðmˆÛ.=®áò߈ÙxKžŸtö_0C‚sËíÂÿö¿âÙ‹ ÿìÂÿSr Oã êlþxûƒÊÚ1|îÔþÜü+màùïo þû‡Ùo×þÔÊïÔþÔòø ±ýñã×C(-æ"Îá»öÇ>ÏîͶז™.E¿tw!¨áÍo‡£âq å,3]üW‚vþJÂÿÅã¿@ö3M:…P`þ¿ýåÛpÙß_ ®áÿ¢¿£à)åop‰ékøŸÂþ—¸ÔðÏ.ü?%‡qÊò0†ÏÚŸEÛµsëÜàØ±1üô§ßCPï?³ß®ý©•ß©ý©åñbûãÇ_êúSøß®ý1‡¿·oß®mïãú“ßG¿ë?~Âÿä÷sýÇÎöÐÕàþ×ßÇõsøŸÂþ ž½ÌðÏ.üO~¿×Äð¹Sû“8úZ9èϳ߮ý©•ß©ý©åñbûãÇ_ªÿãþ·kÌáóìÞLaûÊû?N~;ý>ú?~ÂÿÅ㯼ÿcç_6ú,¸†ÿ‹þÊû?æð?…ý‡>žgøgþŸ’C‚¿òþ>wj"ß= 0ûxÀŸÿf¿]ûS+¿SûSËã'ÄöÇ¿Tûãþ·kÌáïíÛ·¶¯¼ýqòÛáè÷Ñþø ÿ¿òöÇÎÿûÛž×ðÑ_yûcÿSØÿäÃgþÙ…ÿþJÛ†a†a†a†a†a†a†a†ag<°ŸÇ…éæð9`3ûNÅ8‡ßà“äx]ýï›]ÿ'ÉqœÕÓ†O’ãÈ%Ô@ü†Aàa؆ÿàòá¦ö¦ðÊIý`>Ï÷^òÐK’d˜e.Á1üO—põ+Ð;ùix¨®áÿr_=}¸“Ÿ«؆ÿ‰W{UÃ?/þPú ðR~@›±M ÿÀw¢ZàÿK‹Š3åŠØ…ÿ—$‹š“; ;øí±†ïÁæð9ìûÏÎO‰DÍý4è”f`§PþéîC¸s 3oÛ…ï³Ù¬!øMØ…ÏŸx½8pïèÌ&=„ëtþS€¥pÿ“ߌ› pòS€hÔþ´s®Üð¿èÏf¡pòS€–X›!üoöÛ#póOÈãz'?¸8þ®kø_Ä)ü¿öõ{ôuÞÌœ¯(§ý± Ÿ›Û1|.¾þ±÷›ÛŸZúíÞÿµ>~úü üví]øþáÛþжý± Ÿw÷<ª?î¥ý¡"-pÿ“ߌ›Ћ8ù©ÀBÃÿpÛ¥§Êÿ‹þ×½€“ŸŠÌ1üoöÛ#póô"N~*pQÈ=ü/âþ¿4Sü;½¥B/PNûc>7·?bø\| ücï7·?µôÛµ?µ>~ÀØþá·†PìÃ÷·¿|›mûc>çLíD!„âøý‡B(-‹\ýf\ýõг¿B™Xlñ_ö÷—–þ7ø[€B(¥ý(ìÃãŽ~»bà)åC(¥Ãÿ"NáÿOåÌ-„RNûc>7·?bø°›ý²Rìýæö§–~»ö§ÖÇÛŸ üv×ìÂ÷Wî¾Û¶ý± ÿéØºâ†\ÿ)å7ãê¯àúè?{èê²Ãÿ¢¿’ë?N~»bnþJ®ÿ” ÿ‹8…ÿE¥×ìÂçæöG ŸÁ~þÛùÍíO-ývíO­0¶?Aøíú?váû¿ÍŸ´mìÂç7}ÒmܸÌþO)¿WýÑ¿lôÙ²Ãÿý'¿]1÷׿üþO©ð¿ˆSøÿ¢O†M–òû?vássû#†Ï`?ÿíüæö§–~»ö§ÖÇÛŸ üví]øþЇ߷mìÂßË~v¶qã2ÛŸR~3®þ ÚÑÿûÛž+;üoðWÐþ8ù트¿þå·?¥Âÿ"NáËß¿ìö‡a†a†a†a†a†a†a†a¦4¡ÒÃçÄý m†bZ*üžÝ›ÁpŒ4f8îâb9þH:äZü \¿$IªÒ¥ €‘ÙÀqü™ÍV—‡ôÐ9Q*|¾³ÎãÚ r F$(ŠbyfI’ÔÉ^ê ig¿Ý>¸ú»Ž’6°»yØÙ¯ *å´ÁÏ¥üf\ý‰ãµj»¥~gÿÔAE(ݬ?´ö8Ôˆ6°»iQi?œœ£ù·FÍkiüÃð—íÅû¥ÂÿÙìl y\ŸÝÎÉo¥>'–-[ú@ÀRá{  =†Jßì¯_’$uHQ°Öð»¥ÂçCCᆙïbî©),Ð'9Ÿÿ»æ+Èfa ¿ûõ'pKD£Àò#Îþ±®s0!ëá÷ üiG4 ´ÄÚÐ>ò‘£ÿÄà$ÞÌœH:¨_ŽGKL+`ÓÚßìèÏ*˜’C8«§ÍþwÂ-ü?4ô˜diŠ©wzo(|NühÅ;Œç¿Sø<»7ƒU™4§ÿ•¾ÿØoïß³gkñƒrýæöÇ.|ïD©ð¹Œ?ñÜþ ) ^‡5üîןÀq´@ ö—òoVƒÖþéïÇq,„ì_]Âÿü¤‚·TàÆ€ýiÇhÁþkšýo àð‡ÀTkøß ·ðÿáôŸâ)ÇE!`Á¹À3¼·?>'v|á)Æ÷ŸSø<»7ƒ¥2>¹¯òïì·÷‹íOP~I’T¥é-¨á¾w¢Tø\˜  0³dË"HS›œ¿ÿ(hA Sø=Ë"`b1$éîþ¡5î Ößr{!Ô‡$]å‎€hvÍÒþq‡t¿êÞýq ÿkþÝ…µ/$µynÌìƒ+6iÏ"¼ÿœÂçޤC¨ôýÇ~{¿Øþå7_ÿ± ß;Q*üI‡*ºþ¨¿‚ë?ú+¸þ¤¿’ë?æð¿náÿH:Tñõs;=÷BÆ÷ŸSøœÈÇþú»¨ôýÇ~{¿Øþå7÷ìÂ÷N” Ÿkþòû?ûËìÿꯠÿìñ—ßÿ1‡ÿp ÿkþÊú?ævîÁ9Ú³ï?§ð9€ÉßF¥ï?öÛûÅö'(¿¹ý± ß;n["ü­ùËo÷—Ùþꯠý öøËoÌá'ÜÂÿš¿’ö‡a†a†a†a†a†a†a†aÆO9?d ŸÐÃæñ™léðyå°¿”?MVÓ¯ñ/*𭇀±û‹ËÊ ÿ'# 9¨ß¼®þÁûE\ýñ:û;+÷¯ÊáDI9kXî5üŸÏGZ›CùÓXÃçô°ùÉ“…À±ÇÙÏˇýõõY  á°Ôçøx)÷¶mÛðyÐT7ÿ 3ßNU¬÷í·û©¥?íßÍf±PÙ…×¥å`)àþß¶mäèqmeš­ászØüÚgë·wk3a:…Ï+‡ý¥ýQȲ\E‘D¢éô˜ãã¥Â瑯âó9íO0þÊñëOÔÙßïÃ?'s÷b 6@{>sA·ðÿÔè-¶Öð9=lþ'·þü mr§ðyå°¿¤?º²,WÑ_dã àÎVçÇK…Ïçý<‚.uÞ˜ýÕ÷·¬&*s‡²Àð‰(z[µ~¶¹ €[ø_;þu˜­ászØü¥ŽGÀóìçìֲ㑲fŸ÷ÃãóîÆío<âøx)wÇèL`qå×ñû¸þˆ¿«ÎþDåþ73çüæ‚náÿŽÑ™_ÿ± SØüï ×<Ï~Îþ`ýÑhy³Ïûà»c=x°=éøx)÷¹CÐ÷쯿åöŠû?O=· ßKâv­e.àþ׎Cfkø€6—ïÑÎ{ϳŸ³?PÿÉ{¢åÍ>ïƒ_|u_yÒùúa)÷ëá÷ýÇ~Ÿ~íÏyònƒß\À-ü¯%íÃ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0Œ7 ؇ÏE2B¸TøÜëìó쯯ß0û[ˆDÎ ã†ÚÒ†½ÃÀ_OŒ[‚ènáó\sø,´Ùß\üúìoJ€þ9}æ9×ã§ÙßNèçô™çÜü4û[(Ì Êß™Ógžó–;Ç¿&>†5ñÍ´[ ¸…ÿ߸5§Ï<çûð¹Ï÷ÙÇ+yÿ±¿¶~qöí£3›i;OlI<†%ØýÙDw Ÿ:—Ãçf6aî©)Wÿ®ù ²Y` çþKÆê3»ùǺÎÁ„<Žl68g.‡¥L¹y[ÿ‰ÁI¼™9ò8"‘bƒáÇ.‡hh‰•àK’¤æGLÉ!¼™9ßpükâcÆðh¦YcóãþßΡ%Öæi&Ë"öás ž¥Ãç^gŸg}ý¶íOáóoI<†%ñ5ØŸ‘-At·ðy9íÏ¢àuhc•ÅÏ_¿þ+´x8þÍŠ‚c^ÐߙˡÀBþç'¼¥Çô¯Êå°Àþ·?PpøCà-–ög bx4ÓŽ ™G Û¹…ÿïÏå0ÀEe½ìÃç"<J‡Ï½Î>Ïþúú³Ojçß…Ç–ÄcÈØŸ‘-At×ðyÎ[øÝ8ûäÁàý-ÆÂöþÂì“-iÐ_˜ùÒ›2Áÿä }æKw?Í>iüûkíöý«×Ôr ÿçÖ¹º­Ø‡ÏE(xx˜ý¼‚÷ûkë·½þS¨Z‡ñtxòù¼%ˆîþöuý'¿Ÿë?Aøý\ÿ Âïçú?Sž¿Òë?n³Sðð2ûxùï?ö×Öo×ÿù°ðØ’x ;‘ÂþŒl ¢»…ÏýôõWÐÿ Ì_aÿ'¿þùµþO/Í´ãÓvnáÿJû?n³Sðð2ûxùï?ö×Öo×þáp{¾ñ1òù¼%ˆîþöÓþꯠý Ì_aûˆßGûcïß]æñ¯su3 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 ÃøÁf`Œ{ø\¤áwöë· þ>\-Ü“ÓRXßzH ¢Çbß·lï)ü_€-HPŰO–Áß™€üÂào€ÝÉþüÃÿ£BøÝ_ ÿSù{¿þ__ ÿS¿}ä#[¿þ_™Æ/†ÿ)€ßÚßlëÃÿ£3-þ…Ê.OíSøŸ¶ wº·?nás‘z„ßÙ¬¿TûÓ’{€6 ½—óß)üïÖþˆá±ýñë§ð?ðübøk@~1üOüÕ~1ü¿> ¿þ§þ5Íö~1üÿ7‚¿©óŸ÷b§öÇ)ü¿à\mÝ f¸·?nás‘z„ßÙ¬ß>yMì[µþ÷Æðtþ;†ÿ ij“ý÷Cø$`¿‘¤»übød{p~Ý/¸®*á´ðɺ`ü6ág¿>ùß-þáÞ¾9‡ÿ/)¸Ú\Û·ð¹H=ÂïìÖ_êúÏîN-þø¼»‡±bÅ ËöžÂÿ^ÿñåàú/×|ù¸þãÇ_éõ·ð¹H=ÂïìÖ_ªÿóaßZÚ,ô^>ÃÿöñûèÿøöûìÿøòÐÿ!ÿ÷Æ’žú?Îáïý·ð¹aßë~g°þRíÏS-ZÅå_|uÜÓçŸcø¿Âö'¿öÇ·ßgûãË@ûãïø×¡üö‡a†a†a†a†a†a†a†a¦<>UêÁXÓΗ ŸF"@.çk ûkì·™%-YCýð¾ò‡œü޶o… º×ð¿4¢=y©Á/¡VÀ<¼¯b¿iðwó°»_X+bTì7 þ–úÝý³nÒ`â7 þnZäî§}À€Õß“Îb( ô%µÍi ¦×ð¿W¿ÈeÈ2㸈Ûìãå>d=ýKàÔTa„çV®ìÃá×@›‡"{ ÿ÷Iîç_4 Œà7‡ÿ—q÷·ÄÚÅ8÷ï7‡ÿÛG>rõk!ý6à P©ßþoíovõ7ÅT\Œw¡@Ñ¿k__Ž<¬¯ xÿ‡;ËoúŲޗ ŸOÞ¿ï?ö×Öo×þLD¾ H§ÇN©äöç©ð¿—ög!´¾ˆ¿þ÷âŸc³¬R¿9ü¿Úƒÿ¢,ÀJýæðÿ5Íîþçú´“´óØÐùOØ^C €}ûS*üÁŒòÛŸÿzø?æ;?^*|~q*‚ü}ÿ`ý-‹ô AaÐ;oÍ9™Âr»ó¿Tø_šÚÀåü›X¬5(P|û IºÛݸVE øò áIºÊƒ¿°ûMáoþKçOÑß{k½9à÷pþþU*ü/Im¿Èãóî¶Ì8.â6û7|¾ÿØ_c¿Íõ*Ƶ»óà €Þ™„òþ¯ôúOÅþ€®ÿTìèúOÅþ€®ÿTêâúÏwÇz,3Ž‹¸Í>î÷ûûkì·éÿhÏ<Ø—>vîM°ÿü-þ¯´ÿãÛï³ÿãË@ÿ§b@ýò?з|¼%÷°ïÿ” ÿWÒÿùÅWÇ-3Ž‹¸Íþí÷ýÇþûmÚíy€§žÔ‚àÛ Ÿ€vŸ¥Âÿ•¶?¾ý>Û_þÚŸŠýµ?•ÿ:øm†a†a†a†a†a†a†a†a¼`Œ‰DÔά߽I-ì²?#[‚ènáó\…áwö×Ç/I’ J—b˜ÍŒ>#|RÐâþŠÀ}¸ÓòOö*†Ð*ò/(ø…™çh¸›_T 3 Uäçôc¦™çh¸›ê ‚Ö«|ú;sú1ÓÌs4<(¿XÀ.üOÇ\ÞìoÚùO³~m¡6ÞŸ‘-At·ð¹Ÿ÷ûkï§óoHQ 3@›1ï›Sø€À ‡pÝÎÿ]ó¬Ìûó_2~ 3S7ÿX×9zè¢R?}~P XÀÍbp æùòß_ðSz7~TÁü.÷×`a±€]øŸŽY+j½€—ö‡fýÞOÐÎsÝ-|îçýÇþÚû½¶?4#½D· ß•µ?Aú©P,àæß¬(øŸ~j¨P,àæ~RÁ—çùó¯*ø©P,àæûô9g?›¯Å‹…ìÂÿtÌlTÀKûóf·¶ý¾–bÿßDw Ÿûxÿ±¿ö~ýûGÓ†ÍPß:ÑöÍ5üOB(®ß”G 30úöf¾¤Š»ÿEà Œ¾üÂÌ—B©‰r…~Ìn³OZýãˆD.sõÿ>büþe ÿÆ0Í%žfŸŒD"*Íúýt»ö<ù|ÞDw Ÿûyÿ±¿ö~¯×ÌûæþªrýÇ“¿Š×<ù«xýÇ“¿Š×¼øý^ÿ¡Y¿wž¥…÷gdKÝ-|îçýÇþÚû½öÌûæþ'êÿ”í¸ÿS–¿ ýOþ*öÈÿÖYÅBöá ÒþÍú½çÐ>ÍAt·ð¹Ÿ÷ûkï÷Úþ˜÷Í5üOÔþ”í¸ý)Ë_…öÇ“¿Ší·ã_§soíÃ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0L¹#D"}. ñÄÀ’xLŸñE¤áwö×Ï/I’ªt)€D2΃€b\Ä6ü/Pà:œü“½ Ô(9½¤ß4ø;Ô ¨'Ü€“_TÊ¡ä ô’~Óào5„rîÀÉ?uPÁÉ(9½¤ß4ø›f•s.ú”á°Õ_*ü¸ûÅ󟂾 ”!OçPáwö×Ï/I’:¤(Ø­+퟈]ø)€}pà’×|Ù,J†pKùÍáÿhÈfÝ ¬ëLÈã%‹”ò›Ãÿ-±6LÈã®ÈbpofÎ/Y„ ”ßþ¿8þ.ÞÌœïZ€üùQSr¨d‚R~søŸˆ{) žÿôíCÔÓùTøýõó—ÓþP]Ä.ü_nû3¤(xÀVŸ~ ÿ/ð:Ü ³¢àÜÛ?'¿9ü?À1¸ ÿó“ ÞRQ²A)¿9üQxKu/@þ·?PpøC”,BÏO»ðÿ‚sÃz+ žÿBÿ¯G¼õÿƒ ¿³¿~~I’T¥é`â "‘×J®KýlÛð?Íjé@ÑýÊ#@Ë’!Ï~ €´p  ý/È” Áxò ³O¸PŒ~” ¡”ô;„O´ç÷âp¨r¿%|B³ZºPÄ󟂾ϻápXŸñR¤áwö×Ï_ÎõÚ?Ûð•®ÿ8úktýÇÑ_£ë?Žþ]ÿqòuý‡‚¾ßëñôùTøýõó—Óÿ¡ý± ÿW©ÿãÉ_Åþ«¿ÊýGú?ÎÇ¿®pÏ_ÿ‡‚¾¿øê¸§Ïß Âï쯟¿œö‡öOÄ6ü_¥öÇ“¿Ší«¿Êí£¿Fíóñ¯+Ü+¿ýa†a†a†a†a†a†a†a†©Ç„y6ztøœýõ÷‹À‘ð™ôD×ÃÿŸ-x-„ ‡ÿ…çôA߃…ã/c8íƒ×Bþgœ£Aß4¨»œà´ná©…ÿÅçÈéÕowþÛÍ8>gýýb÷èÌ&¼sj ï{ âSøÿs3›ø}’„!E;ÿÊ)@ûp¨m®gÿ%ãG 3~Sè×|Í_NÚ¯…(ü¿´°œøí#a¬ë(«íƒ×BþFµåÀoíoƉÁI(«íƒ×Bþo‰i3…Qø?Ü)!?ª½þå ̳ÑÛÿA„ÏÙ_%íÑ)|ï·ý¡^Êö_IËQ ý—ã§´^ !Pø¿¥°œø«% › þr Ð>x-„@áÿ……åÀ¿¦YÂó“š¿œ´níèê, IDATŸþŸSXNáÿ fHxûÍ_NÂ<½ÝùDøœýõ÷‹”â>y+àþ—¦6AiºC{þ2(´û -tòHáù½PhÊö 3^C'/žß{…öÁk!=ü/ÌxYt–ã×(´^ !Ãÿv³NŽžß{ް›ñ>|Îþúû+¹þCû§‡ÿk|ýÇà¯Ãõƒ¿× þ:\ÿýÕ¸þc7ã8|øœýõ÷WÒÿ¡ýs ÿW»ÿãè¯QÿÇâ¯qÿÇà¯CÿÇxüëtÿÇnÆo øð9ûëﯤý¡ýs ÿW»ýqôרý±økÜþüuhŒÇ¿~Ú†a†a†a†a†a†a†a†a˜Jø”Û z¨2ïMjwƒŸ³¿üRñfî³Ú j§ÐÉÂþ郿ÃÐû Ô ÐH0Tí4Z÷ÓàošqÎjD«Œ¡ú j§Ðº¿°Ÿ4ãœhÖ¶ ªvšN÷ö“fœó íCnm³nrž._èÒ~ÒvA±mÛ6í†>ãw1ˆdøœýã_ §¦€™M@!TïD¥ý£ðíÜSS8ZáVJ4 «íÃÜB¨Þ)J~ ÿÓŒß~h‰µ!Šq ,-„ê‚ðä§ð4 d³þüÇß íÃ6h¡úŽÑ™%ýþo‰µaB÷åoŠ©¸Ú>ìÆ)\ æ•ôSøÿâø»x3s¾/¿ÈÔè-€U(ÑQ ¢>gãøËi&"_lû³ZøýJ(„ê‚ð¢ÿJhÁÿ _vè!ö×=TïÔþ‘ŸÂÿ´ï~¸ˆ:_€ªÿ?íçhÁ}?,8À‡Ú>ü$—ÃE!àËóìýt~Ò~^ÒŠÅÅ)Í»´[ëçïÛ«-:|ÎþòÓ¬‘€êp bÐ÷KøÄ‹ ÉA=Ôáİø…}¯œ¸Öˆµ¹I-ÈâÄ0øÅ/}£íC®dqšR÷ëášñÒ4kd¹Üÿà<#fñø×Á<ãeP¿o7Öè,:|Îþò—qý‡ö¯^×t®ÿèþ:]ÿÑýuºþCþj]ÿ9whpÑ÷ƒèA†ÏÙß@þ2ú?´õêÿXü5îÿüuèÿèþ:õŠÇ¿ÕèÿÜ8±ðÔÏ´ ïöÂ'pÐásö7¿Œö‡ö¯^íÅ_ãöÇà¯Cû£ûëÔþªÑþ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 øa0c7 ‡ÍH/døœýõõK’¤€>PTí0#›að·8»0=ŸÛ p¢_Ÿ  j‡ÙÄÁßâlšŽžÏm8Ãñf‚Šƒªfd3 þ`Ó pô|n3À‰~š „;ÌÈ&þ`Ó pô|n3°™ýfNî´ˆ.þ6S®ßíü_©Ñ‹>g}ýtþÑLÜôPýÑ™M8Ô6ײ¾ø47=ŸÛ Ø¢×|EÒS¨~ìgÄÃÿb?–Ñü»æ+X~Ä»¬ë=HO¡úlÖ>ˆ+†ÿÅ~K¬ í#ž¯}ä#Ïþƒ“zžBõò¸m!1ü/ð/Ž¿‹ÖþfÐóµö7{öçGLÉÚªM1Srofη-D †ÿi]Ú.Ü©½þùQáNÿíÍø-døœýõõ7Jû3¤(zžBõ°oÄð¿À_èÿYQô =…ê_‡}!1ü/ðçX]ðoV¬.Ãÿü¤¢é)T öíŸþø…€kš5ÿó“ ®iöîû‡?Ô–-88ü¡ö¼v…Äð?­KÛ]0Có¿ý‚ føohFz‘ Ãç쯯_ÿþ!ÎD)„:ì‚(Ö™‹ÛIS›@Ïç6¥ÁO3QÅP‡ÃŒÆðÉbÃv’t7èùÜf 4ú 3QÐC3BÂ'†ˆ6%=ŸÛ V¿û!áóóUêg¢¼D¿mD1†O.1l'Im çó2¥ÛùO3~‹>g}ý|ý‡¯ÿÐúfáúÍø-døœýõõsÿ‡û?ÚúÙÿ¡¿E‚ Ÿ³¿¾~n¸ýÑÖ¯OûÃ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 S.Žƒ¼Ñyžý ã—$IUº´AÀÒˆTžð™Ô›ëëÒv…/’$©å ~‘$IìÕž§yX*7 D7þ¦ui;?~e°pý’> Ü<Ý<ø›ÖÕ·óá§AØM‹$}@¸y ºyð7­KÛé¬Ñ̓¿ƒò{ ¢>gãø%IR‡í<ê“$={tfÞ95…÷ ALsø–Ö¥íüœÿ»ækϳüˆ¤0ÍáZ—¶óãë:Ð>ò‘^À\ˆÀþ§ui;?þƒ“€Öþf½ €¹9üOëÒv~üùQíu wJzAs!søŸÖ¥íªÕþP=Èð9ûÇßíÙOE^ ~1ü¤sáyVK’^À\ˆÀþ§ui;?þç'µç¹¦YÒ ˜ ˜Ãÿ´.mçÇÿöÚó\0CÒ ˜ ˜Ãÿ´.mW­ö‡‚èÎ<Ïþ†ñK’¤*Mwh·§6)(QÌá}]ÚÎÏ÷å‘Âí»‹SÆ>Ñ×Õ·óã±pûªb Å„1‡OŠëÒvAúsÆ> Ö?^¸Ýf ¤ƒ0æðIq]Ú®:íÑyžý ãçë?|ý§‘¯ÿP=ЙçÙß0~îÿpÿ§‘û?Dtæyö7ŒŸÛnêÙþ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 ÃxÅu@‚Û@œj ¾aýý%€Ú kñ6 þV”Pqʼ”Í'Þ¦ÁßAú€Ã:Óœ>ø;@¿ÓpÀ:Ó þ®¦€eV:ºMëå'¦ëûoºûKp`î©)Ãm ßyþ;`™é›ÂÿAú  àoSø?H¿S@ó‰·)ü¤ß©\×p›ÂÿÜþ°?¡ýq*hñ6…ÿƒô;@Á'Þ¦ð~§(øÄÛþÒïTŸx›ÂÿÜþ°?Ü((|ä÷ŸóL—ÅðI~‡ `™é²>©¦°ÌŠ©ßFüN;.Ñ'Üþ°ß/|ý‡¯ÿðõösÿ‡û?ÜÿqæL}ÿMw?·?Üþ4BûÃ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 ㆯQª=ø‡ýõõÓ piD€â pÀ2[œí-Hÿd¯‚æaͯ‡u¶8Û[~ePÔ_8þ pÀ:[œí-HÿÔAM‹4? ¬°ÅÙÖªéw¢~‘éøþ›î~ ÁöIÚùG!\ÀÀg»Ò¿k¾‚åG4?¬| ÿíë:í#€^°ð)ü´ÿÄà$Zû›@/XøþÚŸUîÔ^*M1Õp›ÂÿAúE¦ãûoºû¡ý1ûøÕòoV¬.ø©` ௮’ÿùI×4k~*XøþÚÿö .˜¡ù© þÅÛþÒ/2ßÓÝO!ijC(¦ˆ8Ûd ~åHÒÝšŸB(€%"Î6¬ÿEHÒU!„Àg{¬®ßiÝjùÇ!Im¿B¹Äp[œm²LÇ÷ßt÷óõ¾þÃר_/?÷¸ÿÃýö×ËÏí·?Òþ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 ÃF$QÝfå`ÿ™ã§Ù,ôÛ ¨H@oë÷kà­…Z«ùè6ݯ…I¨H|…Ûúýøgƒ:ë˜æ£ÛtÿLô›™nï¿éî7Ÿi@MC;ßè6ݯ…_ŽB•£šnÓýZøs‰65—hSÅÛt¿þO’!õ“dHoÓýZøÕ T5£½Þt›îWÃofº½ÿ¦»¿ÑÚŸzûŸÔ§ >ºýT ý¿ AýUHóÑmº_ ÿ©POÍÐ|t›îWÃofº½ÿ¦»ßòý£å?«hùϪx[¿_ ?þ› ü7U¼]¼_ ÿ«*ðª*Þ.ÞŸþTà#U¼]¼_}¦Ûûoºûùú_ÿ©§ßÌt{ÿMw?÷­ÿQo?÷ØÏí·?Ó³ýa†a†a†a†a†a†a†a†a_H’¤vÑoWq¸5€{ñWs¸-`×ÛÏLoìοj`½ø«YÀ‹¿š¼ø«YÀ‹¿–˜éM#¶?õöW³€5 xñײ3½±ýþQÅŠ'(ÞüÕ €œ~ 0µ¯ÿðõ¾þÃÔ îÿ4bÿ£Þ~îÿ0µÛŸF|ÿ×ÛÏíÃ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 sSïÁ/ìŸÞ~fzSïóýÓÛÏLoê}þ±zû™éM½Ï?öOo?3½©÷ùÇþéíg¦7õ>ÿØ?½ýÌô¦Þçû§·Ÿa†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a†a€P½w€a†aætD’$U¼¯(JMúUõðÖëXm†a†a†a†©.ý€:„èqY½ö)‰¨ËåøZÃ0 Ã0L•h„ߦÓopµð:9ÌËíöA\GQ”ù>ûÙÏ~ö³Ÿýìg?ûÙÏ~ö³Ÿýìg?ûÙÏ~öOW½½Þû‡m¥Èçó!·íòù¼ção„}`¦|R0§%Ô¸—óáÂ0 Ã0A@ŸAùçoÕ|¾/¯êçR=½ù݃yÐÙ? vŸÃ°Lc@¡ ‚à Ã0 Ã0 Ã0ÕaöíßT?þ£ªç² ÷›Ãÿ´¼E"‘ˆÚ™ËF#‘š}uú±œa†aæLƒú=£ƒ]€Ø’8 ÜÑ_Óߡ걒$©ùü.íÎ+)ÍyÍÏT·ÿW+¯øû ½ž .¡ÇÍë„;ú1:؅ؒ¸¾Ž×A°ìg?ûÙÏ~ö³Ÿýìg-ý«V­Òïoݺ .¡ÇÍëlݺ7Üp$IÒ×9]ŽŸýÓÛÏç?ûÙÏ~ö³Ÿýµó×ûØë½ápXØ5 ßoY¾ .¡ÇÍë´,_‹_>´ñ¥qÃ:^Bø°ÌôOæ´‚~xíëë àÁoLp˜ƒ… †q àë¼’BøšŸþ™T//¹é •H-Cø°Lc‰DÔ#k[odÞtŒÎUï(‡é>ãÉt>~:öÍ›7ãäÉ“Èf³ …T ö?F×ÒÉTŸH$¢v®] \}‡ñ6at`@å–Œ$I*¿ç§®|@“þV„¯ùy çI½¼¢Ÿ<™¿XÑíÑBñµÎþ‘ª|7Â>0A$QwwžB*™Ã@>`&Ö†sØÝÙ†ŽÑÈ÷-I’šH$è¶Þ×jsŽ7‚¿kpPï“\ÕÆ}o†aÎh(à~¦}žù%‰¨_ú§N\uQñeyñ-Uý÷[Fùµb挃‚ÿtÛîq 6Åàæk/®MªéžžP"™Tw<÷*€ÒEÊÅ-üß›hÝÏ%ÚÔHz<Ô¨ý€JEªQ@ü\ŽD"jgrº°Ÿ£ôwæ0XÅï¡þ?pàÂá0òùñ7ÀÂíüóÚÝð5?ì÷¯zyuÚãÈïÔ~ó+Üó²=‘ß=ˆpGyö³Ÿýìg¿Ñ?–AjcÝwö”Þ3õøÄ }ªúJÝü^¶ÊýÅÀC¬»·!^ÿéê—SÆÕbݽ5õ›Ÿ»ÔöUõB8Ž3•úô777cÕªUPÉüÞŸ÷YÑNÛ«V­ÂÖ­[ƒ?~nÿ§¯ºŸÿ¶'ÎÈ¿ÿt÷Wùüox¿‡íÏ4hAÌvUõ°\¿á¹ùïÏþjùë}ìöá²u1üzÍû.ˆ}hcb×€¦·q{Ùž˜Ø5 ðË¢ö9c9- ÐoB!Òéô´zÑñßpà €¹sç˜ÇOǾoß>œ8qO>ù¤áqEQ7nĬY³°zõ꪿&’$©óç+ˆ #‡‹?€Oç" §;bøÿð{€ùÏ2Wßεà" @=‹oH’¤þvUÒÖ0˜&”À‚›£^^3Š¢„(T?:Ø¥tªe¿öi,òÅ™QoÀ©zïRàH’¤R¿Ðú»}}}‡Ã€ûï¿¿ªçx#øÏý³¿Ðî¼° Ðõâ8â8ÐU˜ßã Ü‘üó9ü$USÙìiÕ¾U£xA$Q¯_{=b_ä'[žÑ»~íõX»ïzÈOB}fà.À0Ìiÿ‚ý´<•B¨»ªXÀO1 ñÓÿÇÿQ(‘LêÏMÿÙ·ÓRŒ@ܾ·ü'r‰bѯÞDÌ·‡Óãúv½‰6 =xð(\#Î壅ϸÂmŒŒ©r…ÂÿŠ¢àèÑ£úr.PÊ0 Ã0þ$IèRƘåG‹µßbŸíŸV×µbJá·&m†½ÑA¥*EÊ Ý@gÿ€`ÿ°ô|°Ï?kñw¿*òkíU%îèWóù]Å…íqëàÏR”»>ûmý©îâx»î;{ _Ï{†ÿéàOu'ÐJWÝ/oLBÎÈèN•~ÎH¥“U;þ¦ûìSɶëíweøS“èN¥ çŸÉ3 Ž¿^~1ð }ÉW϶¨Áñß{ïø×¡!ÀŸôõaƯUÕý̹éÀ±ß+ý$Õ>þ “fbKâÚ:gðù'âø÷˜Çï¼+¬ãÇ¿uëVUÌ:Pð¹'ÕûÔíx(´Éní½wïÏû,ÏA¡g/i;¿××_N Û~˜ÿFñÛ`àóßð¹þ þþƒÑÃâþl²¦þ¦­=ÀÖââ©UµõŸÑï¿*žÿ§…¿gðß?´ †DØ~ÛЂ˜V`:œ6èý3ôï¯}çõº>¿Þ¯½—}ÿ—­‹áoW©¸l]ÈXÀÇ>´,_‹‰‰Q '¾¡/ëMÿÌû´Ç­Aý ÷ÁËs¶·÷slìgí3=høâì“ ­Ó/k“¿#‘Ð:ÿ„μbÅ㟜œ}°-¯ÇñÓ£Õ þÀæÍ›ÑÒÒ‚t:]rýlV;)ž~úi´¶¶béÒ¥UÝ¿XUèEhŸº´‚‡%ã¹y¦—õ"" º jÀÿŽç^ÅÍWƒÿ×}CÏ^Ø„ϽŠó‚” ÚÇwº#I’º{~ÿ¡çmüÏäè8R» ¾$Iê®|Ã?Æßƒ‹œéL÷à¿=w=Cø°"ɨ8ˆõ$ 'ÓèÉÖföÅFñ׃H$¢îî<…_Êã"†ÏË_ÊãØÝÙ†Ž*ξØ(Š¢¾Z¿~=€êñÉ6~~?xð `Ñ¢E ×Ï6j»ÓÝÏ0§3¹\.ô“hTý›±,p Ï⑵9Äb9ÌïŠúüׯ½,Q1°tÔò}ø™gÔØWµÇ¯_{=R=)§§aÎ08ðÊœ‰ˆa~H&ÛÔžžñ¸<™lSey±Xdy\_— ø)@PÈÇs¯âæk/×Ãÿpóµ—o_›Ô×­´À ÃüÃéq §µc£ûâÿ"´\|ñÿr÷ʼnžd±Lñ¸öL?Š¿OÄã ô#Á*Íçó‡Ãxùå—1wî\ìß¿+W®tý­„a†a˜òÉÊdíûeþ=íG†éP@’$utPA¸S2gg¿6îaíH0ßÃ!tßû`†ž»Ö…jé•$IµÌb”?˜±ÂÁnþßý}øø¼ÿeš…ªJ~Ï´Çõ¿% îÑ_ øšÿ/oæ©rð{üM÷Å´ xü¡Ð ¨ê5ñ§º@ü7ŽEõ¸®ï ¤º¿æx>uÇcèÛò†n»´*ÇOÁÿ›î‹ÚnKWãïÿÒ‡_^úpå•瀱@†é=¢‘4,ÂOnWª|þu§Òz¥Úþ·Ó2€)¶±$b…åN׿ aßf{õhˆÏ1ðÉWÏFÏåÃÿ@¡ €xûó³UäÙ°ákzCøßa}ßþr©Öù_ÿSOdtP^ä—SÀXw¯°—9®³?ìÏØ´Ëðë4Àùß~sðn×.úÌg^ºÔ8û®ÿªU«ôûnBOÊ:þ–%»‡J† +ñ—:~§Ð¿eyþþƒ¡úÕ`>ÿÝ>ߟõ°}¬œ¾·ÙoÀ!üï–×±Áîñixþ¯û±öy´î®>ü—ÇRXwWŸa™WíÏ`´wÍ(ÞÿñÞ¶ Êß´µÇÐOÞùP¶*~·óŸn{ÅÉOŸg„ëçÚi|þ7´¿€øwlþÆUö›¯ÃÔâú‹þG­ßAã0Ú aþþfäÔ0ú·Á ŠEªáo~'†ÉÏ•úÞg\?(jcþß³HÁú™n÷9ï¹X€G¿Ýñôôh]’ÉËc•½ûÞnû þàoW©ø»­¦ð?`)`~¼»0œøzïZª/N|£ì"T@ ¬í„}°{NË¢öoà¶p}2gzÒz1€±±ŸqøŸñDÙj9Ã9…ß(CZè¿ð™+ü/ïÖ:÷T¨~àºÇh¡ÿ¹sç7jwü›7oÆÉ“'qçwî“$I]¿~=Âá0öìÙSÖ¶O>ù$­ÀÄÄV¯^]“æéu¡â±¨ñÜ*\,=©w8=‰¨£?¹ó/ú­¾ìÈ[Ÿò›g±r ¶¼ùÚ˱ã‡÷`‡Ãc£{wúU8B3ªKŒ_nBûe<3ðÌjô‚þÿ\ü8þgò ¶ ¢ýUH’¤þvU!üÿˆ6ûp׋㹪­ªn»A·Á:˜©ÚÁÂJø~÷£^ÞrP%$I’J?€Õ«@½÷©/y-\xdm Þȼ…ŽÑ™ÈGpNÕyÏ‚çĉ8qâ„~?*\|Ìf£\¿~=òù<†††o·ëíà:úÞN­?vðàAìÌýWÕ¿(µã7n´†X HÉmèêšè~E"5öU؆ÿEþý–Q¬Ýw="µ)TíB˜Li$IR÷íÛ‡¥K—ÖýsŸa‚ÀÜO&Û´kËò¸ø ‡þc±6ý>­çspßôßñÜ«øð_®4,3ÿOÅìžÓ søŸBþbb^|ÞÈl7¬C·{5’,ü‰DÔþÎäÂoýƒ£ô£X O öÅ&È{§üª\9zô(EÑÃÿGÅÊ•+±mÛ¶ª»†ñÆéúý‡ýìg‘ýBølI¼øûlögB!€)„;7Ì÷ZüNÖ¡{ ¸ãj„}pƒ~ÿ¢ßÿjY ^¦Ð©¼?Sœy·ŠÐ€óóþ/ã,Šä×7D ú0m×ÍÈxoÞ-X¼xqEA$;̃þËY?¿=ì/ܿ龨eyµÐÃþÂý?H.@(tذ<œÂ4ñø82™ =­{:C[ØÑnfºy,ª¯[‹¿¿ùõ¥ûNË«ãŒÌ~Ëha†;{¬! ÉšÛ¿æ3úí/ýö·¶Ëí×õ¹àA•?sÄð>…ÿ)ðOEì¶1 (·@)î½÷ ûÀ¿Ëc•PòóMx,ÞóÞÞ:z áÿõë×cÅŠúò±±1t®^­ø¼˜sÓSß3ülç÷Ê^Ç/^ÿA¶ANR»¢k(Ñ/cCð}æ3¸tÕ³À¼A„;úµ^Àÿî˜ÖÇnÍ´áD|÷e¶ãDÜÿ5~¯ˆ¯»XdB,@A·kÙ÷ÐÃþÂý»fX—WŠ—Ï÷RŸõ¾ôÙc:·hRH/ë±|þ‹!ºí5ø$tΜ£Ý?u¬¶~ê+S?™úÅ•rï½OèÅ~þ¤¯Ïð_³óÚgÛÏ5»Âÿ¬Óùß0þ©îbñbÝÚk*§]cðÂïþ †ÿ÷‘„Áÿÿ VÕk/f2ÙâwÐx4ŠîTZÆèIã IDATëíòVh£"êü÷/ÕÿëßzDÿ_/0ÍïİäëËÑüß=¨⹞êNX Ø- „±ŒûßÖË:±»ÞçTôˆ®Ù˜ƒübàÿ²uöEýìŠ\¶ÎZ$ÀL8Ö+éMÿ Éo`I¼ û3Szˆ?“ÔÎÿxO¯~ÛL¼§ÉoàýËVc~d~YÅÄ}0s×7ÿðãý¥aù–Å‹±eã~`ñb¤{xò0 QV1¾@Ñ:„kGŠ?2Vó°XT Wÿ—wé·)p] ¼xüy‚v™¼Š»B´Œö/èã§F÷íÛ‡'NèAû7bÖ¬YíÛÛÛñío(ž¼° ;ž{ç ûc·}¥~1üÿÀ¸ °ó3Z¸-ƒ®_ .PàsñãKD±_©í,uw1üÿWwŒôå‡Phš«‚$Iê¢à¦înìL¥ðŸBÀ‚sÃÿ· ÜÔÝÏ¿K¬ÒÁ.~¼ÙT7–÷®Y°st°KE$Ê áQ$¡žûÝÝÝê{sçbñâÅ8à¦ÿñ.So¼ñÆš¼_êíoÖ†sH%s…ÛÅ¢gŠ¢„dÙÜË,Ba| â÷õõÂo¿ô/ü;ðúm &Q!€Áóu+`Þ?ûì³–uÖ¯_¸ÿþûßÇFñSðÿ»?¼Û²=Ö…Ühä"H ¼ß¿?€Ú¥+õ'´ð!…ú “Ñ.h‹ËÄåôX¦0#°y9Ä2Úõ˜ÞtùAD±@,S/”e,{'§?¾P‹a`b¢¦Å,Áÿd]ùªì×þ©ò“Þ¾_ËOjëç¢ÕýAR›Q»DŸ’)âö=Ö)„ÿk·cLÍ©v©‘èîÖ>èÂô‹˜·{± €WfßþM•‚ü€vmôÁäåÈ<|ø/at° ýýèÔCÿN”þBHë¯ì'zmx#³]/0/¾½Ø® ŸnQ`4ÁèÀ¨ýƒ‹¢ÀÞ3ãÈÑ£G±lÙ2ìٳ˖-ÃÐÐV®\‰t:íø[Æ™ú¾a˜FâtýþÃ~ö³¿ˆ¢(!qŒ ÀZ @/0º îEôBÒïYgÒ ¶?¿ý^E¿wùEü.í5tO3BY¾«öÁË>À®Áˆvkç\8¼\Û—2ù•ü>©; Ï´WŸýÉa¶K‚þÊ!\ˆZ{{p0ÑÙ½±`fŸ²™mN þ—òÿÎÇ@ô’ÇèÞ5zM÷‹¤º£ø¤} Ï‹à³ø»ïì)=êN )­{šJx  ØùíÂÜâLðA†½íüæ?-xØßíïøo,¬£Q@ü¶™êNñߦ¢~ýÚ@ï¯áº¾'ê6†|) Ñ·å5 Ýv)R™êœÿ€þ§Yͤ۳¾ÂN^ü"^f—Uêé¥ ·¯¼ò˶rj~MÆw}°óSÈ_;ï<¼.% TâùÒoëø'¶üÙnû—òÂ^þþK mnûS ãìœ}þˆAþJÃûbÁ€rýNüëÐ$¾*†1ü°óSèOD\vlç÷k‡]_èƒtvvê·ßÿ}\rÉ%ÆõüÌÀi³-³ÝëQÎ:•úͧe~ŠØù¥ví©ßà‘[ÿ3ÜÑÿgÃünÙ22=üî÷àwŽ7šý¼¹¹@qöóîX )¹÷a»áÿîX =©nÃ,è~ýNÇáŠïë}óç‹þ¿pÅ÷ñ›íß Ìoæ,´7A†ýíüNAb»å"¾g?wxÿÝ»åul [rcm½ÛzözòŸçÿºw`Ý]Öû^üåôÿœÎM ÿ?õã§pã]7zz®JüNß(ü”ƯéŸùæÏ÷Rïñ¾¿ì>Êý9Øèà.tö/7lx/Uêø)ü@/àD¥Å¼þýK…û)ü_{\ÿnÑÓS¼ÙÓ“D2Ùãëû§“[ ø§6æûÚwþŠÔ¶û ùÝÂûNˆ¼0±k äë׿û÷ ·B²!ü$wŸ.sŸ'&Æ•˜È$cë÷ÿþÎ%øDåLyx.@á÷Êä, C ;t¿€Y €|Êî!Ý%†«c!§™×ƒ ÂÓþH’„Ý»w::: ²ù&''199‰¹sçB’$(Šb[À¼Œöuhh(F)èŸN> ·?ýôÓhmmÅÒ¥Ky½[[[@­×¬YƒY³faÏž=e=í___/^ŒÕ«WÛþIÇè„yæLYÕ ]Šö¾ÈjçcÇ=[Íf¡ìBZö?è:xîÕIáÿOºø‘öþûïëjQ@–ßBøÂë´Ð¿@voÃ)€ÿàÍ×^Ž?¼;Ý»S >¬] \}‡q…6at` â×៟››—ƒÿ×½s†Þ¡ý2þù¹zñ¦~P€ô忝`Á"†ÿg÷ôà&Ÿy,¥‡ÿ`g*¥€·¡ø. I’:øb?’B­‹P¸_¿ßï|,þoDS¦_¿ðZÀ^õ¥‚ÿÂãâ/§€//€hw »  ¶YÞüà3ó¬(@qæ å%„OëT¬t UË} R©T(ƒúÆ“À;aÓ¦MøÖ·¾U³Aõöד_ÊãXnˆ!sø¥ P? ¨À‡âñ¸ 'Nœ¨¸f>O)ߥ( KMÄW¥*!|;ÿÂ… õþu-ýT KQ°ßP,y!…®Ç1rU[]ánܸQÞÓY"¹\‘Hõ UÔÛ?øbÞ6øO|÷‡wãÁo=R5Ðxùœ¨W¡¯ƒÚ½î š©dæ<óàû|>ï©To¿ˆ]¸_\&>&®OEìž'¾˜•ñ“h“ÏëË®‡ñeYÆ?‡€ŸD£j*›­z1¾µat÷hm¿,ÝÉvŒŽV'ü‰DÔ«. aà–g<­ÿÌÀ3X»ïzü{$R•kz¡“®ù32úGŽp°2 ÄB£üÇŒû·Ó¯)ápØrž 4\†ZŸÎ$èµÛ¼y³a€å¡C‡¯ãžîPP¿»jÌüýF€Šôù@ç…Àèo3¯EfßþMýý&ûo¾V ÿÇoFúØ›h÷ã·kÑzâv;ž{³oÿ¦êV Põ¿þ§`ÿ¼¸6ãÖzŒ…?w`;àŒöÿ@²k{RèM´éÅ‚ø.˜ËåBƒ£µ¿³X|Ç\ð§–,[¶ ¹\sçÎÅPaôǶmÛôÇ7oÞ  øÛÐý÷ß_ûd˜Ó„zÿ`?ûÙ_?¿æmiœK—¢ÀœÏÊõ+`þSQz,üY÷ßõ´ùŠ¥xT~TÎé>JêE•3¦ßẻ¡nÝ*•õûWgÿˆþ[Q*tOÄ–Ä}wö³ô¸X þ;Ÿ$Iê®Á ‡ÿâï^ù´Ž×k‚†à?ñJ ø|wU½Æ2†¿Á…r‹Ò)œ“÷gðËX‹zS8ˆnÌN;û…ÿ½ú½ÅSË£8˜Z  Hè3²êëfdÌêèüyó066†Ï¾ñO¾‚qú¶íqo`hƒ ?i_ƒ Ÿš‹c7z ˜¡0 þ š ~çCY=#®Ta€Ph†.ùƒ¤öü_=ÅÐ) Çƒ, bÇ{³Ž³¬Ñã™áhUgc¼®ï œ|v¨øÛúÆ$®ë{¢j>1ÔDá»F@O¡@…!^zé#}¢F®¼òÏ3ûu_yå9zº- ð?ßEÌt§Ò†à³å1e pàí´ýßnÖ¬YÀokûØÍw܆›¶@ÙáÿrN´î/YÒ£ Ûû“v›•…ª¾b(`ó›7‡üË ÿŸiØnñK¡È“^DÐÆÀÚ5éõë×£³ÿ~Œ±€fáÔ>ß¿g²?÷í´®SYXk]!¯…Wª=#ñyeŽE¯ ;?$k}ê‡B+pŸº]¿_mèu¥"´Lß¿Â2 ÿõºS˜z0dìÿÝUèjýøèlq  8‰½Œ?÷ÚãØ gXF²Ž!Qíq…мÒhç¿9äï%ô_)¥ÎÍ™s€½›÷â‹«¿ˆSÇ„óÔ¡U ¥¾íhÏêþ›Ç¢ÅïIeúï½÷ Ç‚>ô˜Û{Ä¥f7Œëñ9P«ó¿Qýúu×g‚ÓÿHà kó1¨Cï̅ýÜ Õþû›ƒÿ·ÜÒŽÖÖVäóyý;ú·Ño®š_±¿ùkÈŸŠ ,ùúr´¶¶â+_ùŠ¥(AóµÚv•°£;•F öìøÇ¯| †Âý…ð2Ù£ ÛÉdqÝ ipþ^k.à—_¯“qÙº^Àæ7?nù—þN|½wi“ÊľX¸Ÿþ2)úûk×^ã=½È$µ÷H¼§Éo íO¾ƒÿ4?‚]»váÓ¿ÞŒÞôÏÊ“Ûüíîúæ?nÿøG H÷@bx1Ò½8üÏT„ç"b?&\‡5ò01ôoWÀiæu è§ÓéÀö‡f¥ß½{·~ÐBæT‘-(ßáÇõ0ù$­ÀÄÄV¯^íëGБ‘tttèÞ}ôQÀ~ð´¶¶Z 8±lÙ2œû¬áoeFQ”ÐwÞ©Šˆt: *F1rØ8@,°vDÒÏÿæŽbø?H"‘ˆº6œ³ß~)cÕìN¼üòË€;î0†ÞGFFðÆ“ßBá{7b±‹0šÜ Å/!È„€ÞîF&|;v<÷*nþÖÈC›éýº³aèãyÀ ›°ã¹Wq ÿ?~°3ÿ9@æê;йøòµàŸ~U(>ðjáÿøòµà™½Ú½zð‚yÖ©j €y'3»O[³ý÷²o 3<–ÂqhaÿÛgÃÿü‹<þþöÞ>NŠêL¾WEŒR=ã¢">CÏ„ä h`ºj&!¸ák€#aFñ]³ÓÕû(‰z$šcÄi‡uƒ²ÏLWOb¢AtT`Õ¢1ÁÌTõ`TöÝ…™ž‰¨‘Ý¡EÔûÇ©súTuõw5hÂõûõ¯»êœªûœªÓUçã¾®­'XYÁšF襰H] (üšQò¿÷ŠasÅ$l{<ŠD0‘V`Ú;Å+ZíSç€8µÄã»r"à3pN/|Ô sË¢í‚8E»‚UމX‰ÿ<™žwˆ²“ðÝ3Ö''‘þ¼Ê˜-:Ë©(ƒ.QF_q™4iR–ÜÎãtÙß´i“‹-:eÏGJàˆÅb®~ZâÄb1WÈ Ý=}äúŽ®¬¬dލ‡‰‰DÂEÿ›õ•» …aH$ðù|ŽŽy¬öiýÊËËÑßßo8öiýï>ÿAha˜…^~õÁ "S'^C˵téR“Š5A íÄé_ƒýÀ·~î·o6í·F†U_NuLþ¬"¾;÷Œôí(S_ÈiðÏAt·›xùÝnHöÿé3‹¹h>·ÛõÙ³cÇz>¶ÏꔟÍ!¿¡¡A§Ï; ?çûÓmž|l˜Í¾ŸHÝŸLƒ)=¹Ï¼Ÿàd®Ea‰¢>9ªaC5éó.ëÕ^P¢¿‹A W{õe½Qˆ¢¨û5­$D|Jü×´˜AúO ¹ù8/4 ÐT¯ÞR"!ÛòtÏBKmnÂÅ‚ïkÆâŸ¦ ••èì/®/YLy(N§}'Ç7nÄD`~Sxmm­I ¶¶–’ÿSÎU¬ž"®mmm”x{F ‚ óÄz»»»Ù¾Ó%¼SJðD}JâïìèìüØ’[@gg‡iO0Hé@(4J÷ûg½F” O¿}¡PŠ€t£ý±T€€lÄ€Œï¬û˜€Jü_f‰(9ψ4ùÇ™¡äÿtvœ…“$ÄÉàí=ɶ©Fð!€0‚]ÅùÒõ1©˜×ž={°páÂòÿ¾}dQøÕW_Å´iÓJ:&;ƒ3ø¼ãt?ÎØ?cÿŒýÓ;þÏüü#´û5ˆ†Û@$žV€øÿm‰ÿÑŸ+ðþSvÙtäÿº€`üz€z EK–zggæ>º :¿&ãž@|w0'â?±F‚Ö£¢+XŸ·€eàפx1À¹±±ùŸG6B¾Û=üZc¦uÂâ?OèÍlßI»vÐzTŒÑ\8$ê˜ÝÆ ÷Ÿ1Æ4×~ŸŒC¢øC¸8”¥>™ÀIûc ç‰ñ¡Ùñ´û¢]´)†&–®È^Œ¹ö”••a``gõv0'äBì3²æm‰îÍG¤vÙÇÎÿÆdòGèbêO ÿ<¬äk«@1ö)ះ•üoÍc(Æ>EòZGÙ½Qd¯ñM÷Û;ž;aÆ{‰ÿI?€Z3GþvÊ>%aD @” ²À.{2J¡ö)ñÞê;h%ágƒÓõçÏû“4l{<Šy7x±íñ(pRDбOIýRþëÖgA:Á€|í?ÓÓŽ gß?Øþí(ùßN_;”9ŒÅÍF€¡û<É?[ºËu¥)ÍJþwªþßZ¹’‘¿jÿhmW­J/R¨}>¢<%¸g‹2Ï ·8ùü¥X½z5Ó´[{°ƒö׬Yƒ5kÖ˜ˆþéò”Â>PØý(ƾݻ¬á•¢ë_-¾«€Eâ÷þûTü(rQ†ÑPéžÿ¹‚rŠÁ¾}û0éÚ{˜…ÆûöíÛ‡‹Ò[LýožºÏJþ·æ±ŠÓÿRIÅÖ}™~j?ÕBMÀõ-»ðD3°jÓAÍvÜ“Žü_ˆýß´¶â7–°â_åî¿ÿ†’·»wN¶÷Àç¾ýŸnûEâ¯É¾¢j¦w?&rU‰ÐûRÇ&Ÿ·û¯)í8pá <õÔS˜6ÍLø§ßL„>±»8ÇÛoŸ‡êê¤@šXU>¨Y23c:/F@¿k–ÌL(öú+²7=š^èâ¦G£L ÀŽüÿynÿé„þL¨– /µÙ_„mžäŸ-ýËkÌÓÉVò®e äÿö‡ºñÝŸþOÝù-²mˆ@çE)š ÉaÀ¥1ò¿§ÒƒXÌDþ§"…€þ©ýý½+|øT#Ü”$þŸåò¡:è[1e8ƒ¿^ä$@£ÑW%Hg'ÞkÜ3Qô}™´óù 'ÁóÑØM«HŠðâ|yøÈëìðùVUŸÏÇ” ÍÔé6E1ÎV|ý£Ñ(†††044Ä„***088ˆ‰'"‘H˜„¦OŸŽh4Ê9Y +¦þR&¹®»î:[">èîîÆÐÐæÎ[MÑfåJÒžèu¾óÎ;!€#GޤPø|> áá‡fûx!…t íFÓ ¹?Ògß­êïÐoÙ×P_•mšD"¡ñäÿ±Ò妴٠ÅJ*0qâDttt0!÷%'¦kÚ›¨»öfT^^cÚ/íUÑ®hpB„`ÞÔ Øvï Ž„oNëÚ»8Ä^•$þÛ‰‚­/Ǽ ÁΦ¿3­Ç^€«GÃÖ‡cH;˜Õ< zYËÕ£agËÎ’Š@PØè3Òãñ ‹áèÑ£èììÌÛÃz^§Êœ+êw¿XO\„N÷is–}ÿæ¤ÃÅòßGÀÃIÚÅ~?®1ÒÞ¸à}fOýï‚X·^ÁŠåf!^@ý£àŸqÓUà ál|ÿåð³«Îźõ†ÃGgq¤ËŽo¨hü½ïÃ}ýdZ€/Ɔ!jC¦ÊFÈ˵l»‚U„ŒÿÒõY øŠHÿ‹dð#kq˜yMa4îo>‘ûu1œg2ÙMÚDÒ&ˆsÐ.ÈE‹ð„{ ¹à©4&k´Pr‡yÀgG·ï - uò²–€©™„þZ ˲NÉÿK–,Á£>ŠgžyF¿úê«Kú¼A§}€M›6é§J ˜Hýš$£³¯•¯áÜ»÷aÉ’%¸ýžÛeËóÒ=á줗RÁãñè³Ün$¾øE¢¦†ôWxÇÔb ‚^ŸH@ôZˆa"ðÑ1JEøðxQ ˜胶±]‡aI¼¨@&\|ãm:ýæûh”ü¯>F¶#$}£¤ƒL€æ³ž—Â*@Iù@÷„»€n%ðÏ fÄæìo`™ñýU¿‚?†d´„d4ûSIRv"Ea¼Øk3¯n BqâŒÅb‡ÃŒü$׃x€ÁÁAF¤¬¨¨Àž={žÁü5ât?>Ëöý±BÏßlýÏØ?ýö6(ýø?AÐ[ꨑDô¨"‚€ᇣpRŒ9$ —û¢€IPé7òØ—Y€S=<~?\É߇]tlÓÐÐÀ‚NPß“ÎÎNv­C¡Qz ð1%á …ÎÑiD¼Ó®Õd"ݧ[ÿk$t‘·`}%Ü3tÞ/mørh¡0+/F`ԣ赸]Á*&ò ¤_ÿ²òs´Çˆÿ#ÿ›m†L6ÓÙµ’ÿ ÅÅM"Æ‹äZ—[¾)öƒðSÂô&ÛS¡÷!û_yÄrpö“N«Igs˜wæ$Ѩ4UÃW¿÷o(//ÇðÞîÖ¤ãnõç£yÛE÷¶:¹öL|ë-<7y2¾æ2G/ôúo«6;^ÏëM’^øèðéòkÿà™ås^ Yš’M3åq¢ýQ˜É5É:+²7-ùßIû@RLŸ>‘þÌëûÛ—¼©‚šš!Ò[‘ö¿þõs˜€ÝvV8\+~ü¸ˆCÄO A…°ò°²ÏG–•0!ÿÛìç µuMðþûøí˜öûÛWãÙgŸzú.&ÀcÞ-‹ÌbN]ÿj Lù¥ZBMMòù_cˆ°h=jjäõ"ìgàzãlø'|’šà`ûK8cZö3 XHþï3Ñ•pF„„ËEüaÎ U™Zœ¬ÿ°£ œ)à­ \6\`sÒt{ØÑDêA%þÿg…Cö3Ý”6_ûÃÁÿÒ·Œñº»»ñ_ÓQ[[KÒÒDf/Æ>v.‹Š)úúÓ¸ÏumÖã= €ìZÚï84°…lKä4ê›Øñô]€‹F€¡ÈúŸ?Ú¼}üíäoJÂΔ§Pû¹ˆK¤£(öý—ÕžhÞR]‡Ãôm„åãîOKþÿ[iÿkn]iú¦p¢ýÛÁ*pþhà¿~ó_øÒ·¾d"ÿ—êùgØVeöyò)Ÿ¿§¼ý§A&ñÏ{ûÿ¬Ø·  ˆRÔ6=å9éýÎ3ÏyýÇz£–t«ø¢“íO1Æ™Ö:*²¬KÛ Ð}Nï¿áÛ‹Å044„ÁÁAÓ÷< éï ùಲ2¶}vöàÑGMV£·8狨L„ ÌX ÇÃæ¡yq*ð­ï7à»ßý.FN±>Gîÿˆ—%äeÏ«(ÀMFñë%–ù‰Ïiÿ7]ÿ'm¿¨Zbó‚ÅÚ¦È&À㇠:þÅN:24…Žvß?™öµ?Ô$ó+ü3°’Ÿÿ¿öÿþëáðoîaù©íÙwl†“ Dÿ&ô*í¨–› †¬‹<©pº gðùGN}ÈoÂÑÝ‹LÄ{‘{Öõ +MêbHç”Ä?cÅ&ì^·ˆíf¬™æi5ÿÔÈëšñÌxäÒ—\?&Nœ€)xÒ"‘`ÄûbI÷”ÄߨØÈOþ—j IDATH×CCC¨¨¨@"‘@"‘œhª¨¨€ ¨¬¬4‘ÿ­ rÅ ­­ ^x!sºõz½¸óÎ;qûí·ã½÷Þc6§M›†²²2„Ãaø|¾L§ÌJü§BmmmˆF£ðz½èèè`BˆÇãˆÅb&ûëÖ­3¯¢¢ºJoïÄÉþ­-Í;¨¾*ÁŽô ˆ,]ŠúªD ŠÄ™aÆŠMEGÌU]ٟÀú&vh‡¡–¸[ñꫯ¢±±·Ür ÛwìØ1D" <ù#466¢¾¾Þt\$AGGG^޹é„Dñrt…vCG²ÓåÒÈui’EtµÉ·Z)Øöâ˜÷£uH×Õ–ÜŸ‹H@!˜?õ¶®{ƒ;/uÂŽùSO`ç^€’ÿï¾äÀö ˆ-"f5£ä"Ì9`¼Ø…¶7„º#'1õ/úÌç¼»+I'¾'AœÈTåñ»iüÙÀòOð‹õg#‘øaJAe(¦£ŸH$\ÿ»³SÉXL8Ì¥õ}üAQp €íŠáÔ¡$;V BÞ¶AÐëw˜µyŸ`År™‰¨øX~ "SF1òÓø³¡îOžcÚò[°gýÃ&±€¼+®^Õ‹yë¼8ôú¾¬"võHm`ø<9:#yeÌ„û›Od%þ[aØþ_ú™óLü¥ì"ÞÉâ/I9ÿÓÙôÊÅ‹ð„{€,jRG'+á?Ý~+ _^ê·U‡Ë»,¡°­ð€]9ì„€,ΟðäŠS!@Ÿoš¦aölkO¤ôðGáŠùFé÷¹fÖH: ºöóÀ`Æ ˜±lYú“””ü¿3G €ñ8Ê ’|yyyÞïÅ\AÿçšFz©¥&áVí Ï>¢Ÿúß ÄE:!‹ÅŸÂ酨ϒýs¿}³‰øO£ÇòøèÙG·ßÐРg‹W(x§b€kk\ŠÐm'ëgÑmz)Ñ‹îç„îX¾BñgÏž­f§zº(PJœNû;ŽŸtÍ>˜$Éû¼ @ÈüvÄþŠã'Mi|z÷ÙÔ&–õF±¡Ú›$ÿƒýÓ‰Äb1×#m§„XÇ£÷GbÐ4 ²ÞcØèµ=gKW±0\>_µî—zÑ*ë‹+ƒAîOKþ§dÿæîY¦ãœ$ÿSçV;â?ŸïT-îPò?%€®]»Ö1J‚€ÚÚÚÒ?tuu±H8ÅÔŸ·µaÃfÂ?ÅâÅ‹YôwúmÀßËz=ò!öSây¶¼<éŸæ§eš3g{FÓëÔÖÖ†¥K—f=§üoL4¡sÛ¡Ô„{zh{Û¸q#œàÛÅóÏ?ÚÚZ~Óý¥ð¹ç mŽ+{ÞÑ?e™¼¯yò¿-Î2Y?µ'™Sò¿(Ž‚¦†(Ž‚,Ö¤Dt’ýw{Ðe%ëÿ$4êc„ÔO þ‘€åþJ"ì‰EÒÀ¶¹Òß`ç¶’ÿ)xh†U äqò0h{OšöñcúõiÓ±íáàçÂAÞRÀ:HÉÿûöíc}MÙ&"樵NÞ&þ°Ôoz.ÒùQ5e ‡Ûµ˜…¦¯|/´ÚK`?üþäû òmß*6ðÊ+ãë_?‡mÓçOÈ5‘q¨?ïðO£@[#@§þ\ ýË|Þ §vTž}öL|ë-ÀÄš&üÖæ&ò¿qN§îâCFOŠžžЫ¢F£ÝWm›ÿTµ?Jþç\®+¡G>¥í?%ªÿy¡*|Pó+(>EüL™‚ï‡~Wrû'G èîîÆ¯ºº€Õ«±ÿ~Œ?¿zàÿbcEEª²ƒö׬Yc»Íï·æ9ÕÏ¿i?]vy©ŸäéU‰àˆ±m—îhýýÌ·ÌX{J7NÈ×>õë9r$V=±!¹¡Q¸CC€éB²‚UO¤Š P=z‰D"gŸlõ—%Ü>L_Ùq/,Â'+_F ¶»*PÅTažRô¿Î!øóäÿRô¿Rû\6äâlpªýõ&Çl«6L™Ç¿bÕ*ø|>ÜÏï<ÓþmÿAïôÔ~I&ò¿SרÄþÉûRíg"ÿjÿ[+W2QŸ¯uÿ£Q÷U«¬*SiPdýiq}ÍÝ)û(2‰|žÚÿgÝ>gjŠÍChŠ€ÆÒJićÀç!ÅþWfi¥²¯÷‘¶O…Îèov¬_ùçõþŒè?44Ìçš~/X°€ú¢_ s}[¶lÁ–-[Øù‚ •EÕŸ®w³ß\ì[ÞŽUœ€úY÷÷÷Ss' çÚÿ¥äÿ/\üz‰7E €s÷Ÿn÷ª…ü¦y¿?ÄæP-™ÍÃþéî{g¬Pò?/ðå5.üçüPÎeP»UHHмý6Q‘bd~?÷ê2“ÿ¤ÿÕn•ïãñxÖk@ËKý{¹9Ÿ³\>TËMxrËàºc .Ãüí ç°dO=õv¯[„‘36aä 2Á&z‰€M’ÿ5==Ý ì^·3VlÂŒ› ÌXiR›¡ e`Û\h9¼^/ÚÚÚ Ž÷ÔSO¡££•••¨¬$Þ'NÄ«¯¾ŠW_}•‘ÿãñ]ˆÇw9Bº€ŽŽ466¢±±^¯—Õhh}}}H$8zô¨éEÉ—-ÂYÿ±cÇâÀÆ™ó¥¦iسg¢Ñ(¦M›†iÓ¦aÏž=xòÉ'‡M޹ù¢²²»wïF[[6n܈¥K—²4[pìèèÀ–-[àñxàõz±uëV<üðÃ,}þüù˜>}:Z[[™˜€ê«h©'ƒOú¢ ûèþBÚ4m»»×-‚O„\¹R/ä>H:°6z²¢±ÏÚ(!ÿKÎÆ6JÁĉÑÑÑ)S¦°Ïœ9sÐÑѱ×ÝËÈÿ_øÂØêëëÑØØ˜–Ôo…ÇãÑ»6,@ÿÖÙìÓµa67—¡¾þê®ÿ­~ö‘éG“,¢]ÑØñvŸ\ëIÉý?¾w9~|ïrüÚ „ìÏ™¨HÀO~´?ùÑzüvÍ2ÌûÑ:æìZ(¶¾8óVLÀOBäóÛ5Ë0oÅ" ðâp– ÄÿílÇôw¦C=¸z4–æ$AÐùBþ?KÆ{!NNª Çb1ôöö"‹1ÕÅ|Ûù%þ·P#g`Y0ëñ#쮌gýäZŽöý„üOADȱ‘)é³AÐwÅã¨ÿÝá´yòA"‘p}s$!îòɸRÕ0Ê'£ê\’~8¬àYÆ5rÒ±¢ò?ů_> Ÿ@H8ßù#Fþß³þaìYOž©7]5 ù_Å'øÙUçbÝzÎÆ´å·`Úò[ ®¯!õݶ"Š1WLx¯ ]”D0‘Ó=ô^1 Q9Š ¯!¿ùrÊæ•ælØ“ðâü"kf‹£0 Ïeû5Ñ^È¿ôCùGÎ9èJñ—®O[ïd‰åKg—Úá…&&gò\ÌGAÖ´”È ùÂJ¸é^ô“ziÉ: ´ÝEìv„R"²PðòR?S/J£rGˆ\ó¶»’åk ‘kž¦´ ´NÖ‚…€'á/Y²ÕÕÕxæ™gJüN"ØP™ò9Õxê©§°iÓ¦SVg˜Ñu>ûÝÕ€(—¾=Ú¤ 1ß(=ä…îxÔÇ  äÿÄ¿ˆššôôô ¦¦•••Ì9«X‚ ×'}€"–g~"‘pišÆ¹âœYLdpG///Gee%ú ažVjû¹Ôÿ£g1õÜ´oWž$Ç™ ™ùžnsÒþ¿øÅÓj¿Þ8/ßG¶#ÿÓ?΄;v8~ÎD"á¢â1gµ¸˜€ `8Êî²w˾⻃è Ö#X_Y²öv*ÐÐР744èýýýE;üÓs•¾WÍ~ÚBìó ¤~þc%ÿW?i àóƒ(êoê„ðoÏîŒÇ±¡Ú‹e½QÈ^¯©~J4êzSš9%æB‹Å\•õH~¸b±˜+Âo8Üë’üpKÀ0ÈýhîžÅæ¬ä>_© iÉOg ùßNäTbpp«W¯f$s'H$\µµµBww7›÷£ìÅ‹›ì=÷ÜsEÕÿÀ8pàöíÛ‡}ûö1Pj‹#®Û~wwwcíÚµl_mm-V¯^îînöŽ¢i¹Œ‘)¡›'š[A ºô»¶¶ü73X¶l6lØÀ¶s­—uî…¿ÆÖý4?-;ýív»ÑÝÝÅ‹3"1Í›© )ó>–´çŸvår ”üÏ·ê`9nܸ”ëM¿ùú¥+> ×‘ž3Ý=À¾ùüùÚÓ´ÃÐ42T7æf@™ú&!nÙEoݧ ª‘ËɇïDX¦ÑüËøI(9j°«5ùF™ü_õ+Xæó2ò?®”É7_OIÄ2Ÿ_õ++]‹±Òµ)çnòB¹ ÓÍÇb1W°ËU Cû¹ qò0H’ªZ±ž¶“††Óöàà Ün7âñ8#üSL›6ÍDþÀ¾[[[‘H$ñóæÍ,­(EÿûŒý3öO‡ý\Ǫ}B¹”ãŸ|ÎUÈ1ÞÎÎÌõÿ Áà Pøc1„<žÏuýÏØÿlÙ?Ø<`Ê÷µ°ˆžvó°¼¼ÜDþ/vüo… zK}5’ˆUCs$uþ±9" Çp­‘D´Ôç¶vUl¹Y\L’ÿíÈþ3}iÇ@‚ èÁà9ðû»ø}ª*QDŽüÏûœP¨ªhêoûý‡]Áà9YëO×dèM:ò¿Ü*h*X×§2‘ÿ3­C‰~´P²?H ê‹nY×Ó¬ÿ±µDcm‘­5ZBþ ücò/ý­9òk˜ÖuU;$ W] ­ÇüŸ~·4âý>‡ìïïÅ!?öûdŒ+£¹Ì„Ø9-— NÙÿõ>‘®pûšÍǼ_‘½˜¾òqTTT`hhüÅ?§“Š©?%|S¤Ÿ GU*@pÄ/co#‰V|ý“¼^H^/ü²jÀ‡mÕQFþW>øeËcE)ìÎÈÿ¥¶¯È>@:©)šBü·BV¢š¢€tˆ9d;QkÄg¶ùìà„}v×ùKßúÒ)³ÏcíÚߘ>¥²ÿõ¯Ÿc"þçGÚ_¯ Y ã¢-D`DrA–\˜C8ôô]¸h`KÚÅÚÿí¤ä½Ì—»‡£÷¿:#ÅŽÜd ½û”ÌŸ ”üo‡R¶ÿ\P û?S¦=Æû°†´…j~uJìós¼ãÇgk)äÿÙÏŸgûvÏY ³`2J[È´mM/Ö~ZD+êàž fzmž yØ7ˆÊ¦ý÷¹®Å}®k¡h2†¤ÃP4™í³bÚ´iøÁ~€iÓ¦±}‚ ää“Oý­ë™PŠþ×ù£ÁÈÿ¥êÉJØôá÷YQY¹0åãXý{U¬Útþv ×·ìÂrCüÜŠåãÆáú–]ð·kXµé k‹gÚáퟒþ©ØÄ­ÃS÷?xûå·SÉÿÔßjŸ’þ©ØÙ5wxSöm«Ž2û&ò‘ö)ùß,­W…¦´§|X;¨– ¶OûS¶}ª i)yKÔþµÕñöºÿ¹Ø—•¨I„P”ÃÇ¥NÛñ!Rìø0}~'íË’5…,‰9?rQÓú•ï¿(7Au”——£ªª ,@cc#,X€ÞMÁǤÏeõI/¦þwÞy'ûPÂ?˜1c+Uœ 2Aζú¶>âåÔ}ŽÝJð7 ù ñŸÂ Ýbÿt÷½Ó•áËkDü0‡åJþ·C®e˜}Çf¨ÝYþ{.}(ùôh‚ðÿ÷{&±j%ÙÕ’µüéÊðЃÿˆ[oû%Û¾õ¶_â¡ÿP-7¡ZnbB”üOÓí|Ëp;ø»\3VTT`×Aë#ã‹ Û}0ÿg¬Ød¢<@Ï·Û°IχÑÖ¶‰í§iÑh‰Ý­&¢6=f÷ºEf¤W Ë†ŠŠ <؉Ž²Í“ñB¬à‰ÿ¶/È‚/%ÿ_â —JïÞQ/N9çŸC—e<E"‘pE¦ŒÒ¿gøñøTÙoˆLÁû qD¦¸†¸é8Aô÷âhßÿ ÂÀ¹+‰DÂõMAÐ_ lj Iu Ø®}”üŸ­“Ÿn¿¸DÿuðÏ>„ä‚%þÿwg€]Ÿ= Ä1fÅrëÖûô›æË»²´AOÔ'°mEàýTr\“è¿úBxƒäÅÉ,¹Í¶gúôød%•„ÿšbrбb¬òs޵0ù}¥ {Ä{f÷%)#ùß f€¨=gr¢Ñ6v«03ÐçHô±F‚Ò vø™ó•ØqÉÊt’ŒßDúsj#TŒ€ÇcìÒ{¸røMavàEò)ƒxò?Å’%Kðè£â™gžÑ¯¾úê’©¬É²¬‹º Mµ28ôô]%-ƒÛífävŠM›6é‹-*¹²œÇãÑgÍšÅ&y jÀ9É ŽÊ×ÐøÀذaf,[†XìÔE{äÉÿ===˜åvc–ÛÆu*e¤T+ ¾qÊÈ‘#O•éÏŒ}áÙGôm ÑèuQ:;µAß³”øŸŒ^µ>ŸG5‘uÒ‡ÎU‰:Wû”øO…éV¯>µö)ñ_ô"hpî· iÍŽüÿѳmßΡ»””wÛ5t7ûQÛBW°uˆ î»í!\Ü$²t,AÜ"á¬g"åñýxMš‚’9­ûÓå§çÊô,¢Ž÷é044ÄÄLxQ“t'ô\¹Fè´Ú÷ª:vrCGÞ®èscg×GíÀŽã']³Ï¦ód<ñßJôçÅøü…´ù1š†­^/`ˆ©¼þNÌœáú,ëb§åÞnõz1_³ŸÏôœ¹éYÉ’NØn©ÝIIÿ)ä+h>'l ‚ 7bŸVÒ¿5}"ý§$Úã±cǘÈb)@Ÿï0 pÚáÈ‘#xî¹ç0wîÜ‚êÿÞ{ï™¶é<Óf"ÿÓo*‚ÀÛ¯­­Õù(òFþ¬ó4‚;Oâ¦eág8ãX¿—-[ ùŒ¦u\ºtiÞôœ´.sæÌaí{ãÆX¼x±­ÁâÅ‹Y½8ÀÈñt_&‚ ·µ‘ùLjƒO·ØÑ­yø:ò×,Ÿ¹ \œËÒ]Ú&P‚ÿ—|{ÈdHÞ7Zö\mòÄ|JÚ¯s3º=‚`ðT>Æ.:¢ÉÀ$c>‚¨Ž|Œ`Ðì$®i‡!Š£ Ò5í0.Y†Nxð$ýyS'  dÙÞ:r¥ ñJ .7‘yjwïIÔ]@}Œ»Ã~¿ëâoÓ/¾ñ6Ý*6) %æ·‡£É7Š}›ê³÷$D(ÐöfžÛPŸÆXéZ4ûv.Oø°+èÔ^:x<½ÙMÞµ”ÌÕý;e¼0"ªòBäšù@Á®4ÇZ@ûí³gÏÆÐÐ4Mc"+>ŸÏDôÅb&òÿÊ•+SÖ6ÒþùçY¶2ÙáT÷¿ÏØ?cÿTÙ·Ž?TA…g(91{ª¡®Òެàí¯ŽÅ°Öã)‰}JæWÿ²Üd²ï7¢«Œ«}C;‰Mº‡?ÃfcݸõŸ5kvî$Â_¥¾þšEöý)Û ü¯ÉuC§ìÇ‚äúÆz­ð’íÕ)ûlìiƒÚàŠK‹·ßÓ®¢¦‰txú#1œÔ\ØÒñ¿†¯…ɼwO»Š“šù”ð‘1ïÁæ|±elAãÿbaˆè-ÐPã€Øp&ÐwyK}Í!…øïµ˜·HwÞ®®*ÔÕõ!þ?A¸þÎo»¶è5„´¤IÒ\ú_Bºû¢Œã³:="ýz—$f$ÿ[‘iŠ®ѹºlýZQRMeÐz’Ûé`·EÖÊŠ„ Qù`€äš³k·æ˜&€×”Œ")¸RГqÍ1Æš©i-3»†¨¯IF²Úª«&òý‡þaXš ´ŸÀOmÈÀ!QÂÀø°‚ôzp‘³rÁgÑ>…5ú¨"û0}åãøÂ¾€cÇŽÙ’ÿ‹±o=—Õ!˜F£eY9¿6ÈÿNØ?yŸ†awˆ˜×ë…ß úd Wß,ÁU퇾™ü÷´¢$B †mI0…Ø×u .WÎ €ß ú›ì/nkÿ¼À |èŸsb(âþÓ묪c²ºAð­‘0 µ膚êce¡¢4ê¡BQ5FŠPh4DÛ?…5;àK^/B3‰@ vYœóK`ŸÇêÕß2mó‘ùœ°ÿÊ+§äyå•mÅ~ü¸M_Ãú[ƒ6È’ ¦ob ¥¾dŠþÌÚ°ûpáÞ7ûZ牭é¶HCŒÈj?ÍýïQ|¨‘Ãè©É‘¨dß彡7ΆÂ'€ÐgÃ庒ý5¥jÐ^XÇå½…äw¸ýó€W­z<=YÐöçr ‡šÆ½g¾!>4_ A€ÿúûØqºîÜÿŸ9‘h¢ÐÕÕ…îîntuu±µvkð§ž?¶QÅôiNÛ/%°o%²Fj7¥—ºþ–ˆ¼™"·æjÇŽzCCƒ) :ø¹1@ÈÓ²F?¯®®fß{öìa¾74 W.öùúSáQnbïþ`}%dÉ…õMìªL@½P‘ìoðÇsýº† KÄñ·ówÙôÿÚ÷ÿìHØ¥ºÿ”èiN©¬\ˆþþÍÅÛ¯–p?—gÕ&ûõ»õà‰fŽ]`‰\°ý^®…©ÂgúæÐ_uûzýŒðO‰þpüíTòÿè«F³vWlý©ýa~Fø§D˜×ëM!ÿ¾j4÷8e?kûç"<[ÑD2’³Ãý¯¼P¢úkJ;{Ï›|œhÿ§ûý“ýýKúú²^óCy¨'¹¦|NÚÿà<ò=âC¯ùñAm(¹]Bû®*>7lEfè8¸”ö3¿$÷Ÿõ%ŒÅbDdטWO Êͧsbÿ çÑäüaÍ’™†È€™A×ØØˆŽŽ,X°€‰åïÛ·‰D¯QpôR øsq×_VÂPàÃMWEmIþðë%^È(áóרN™c0ö…Bþ¢îÿéî{[Ëðå­~ü°AÇ¿Ë6?lÐñå5I¢¿¦´ã±Ñ>dZÒøòV?ÉŸ¥ ñxÜåv»õÙwlÆ?i»±þdŸ®Ý÷OÀþ<ùÿí·ß¶%ÿç[SjÍ÷€’þy1fFn2‘ÿ‹)Ãüm!g€ñ)‰y¥×‹¥K—¢­Í úG£]Iâskë"ƒˆ_8’Ú]`ä}ꈺ{Ý"[’5E¦´BávÏd Z^o£Qÿ6`Ä{JŒom]d"âcÏížÉÈû´þ&r¿™Ò Aºè¥7nÄ{ï½Çˆö7nDYYî¼óNüà?(Ø^™%zÝwÞi0 öÚÚÚÇ™`ÀüùóQVVÆ0iùžzê)|÷»ßÍhS‹2¿èM˜ö€0ˆô¥¶åú*’·9" >ºˆýìˆÿbîÔ q¶È;@Ž"dÿ¨%ʸ t +÷ÓgµÝØØˆúzs¤§H$‚)S¦¤äol¼ikömñ^ Çv¨ioÂ=fº‰Äѽ*Ú €þ[Í“’‘‰ˆÅ²‰Äb1—Ûõm÷²]s3p•%¢ùË£«¥óþý?QzúÙÐúÉXà凱íÅ70…ð·¾8óVL€dø¹bÏ IDATOg:Z½W†­/Ljóx<}Vó,è5æ!W†-ù‘#¦ïEûñGÓùßÁžk4 ÀýÍ'݃;\1|øÛÑ87p‰é<¹:~÷ú¼¸Äÿ–­ÍóçÐeèI Jþïõ.nƒ’Üëwß[þ ~ñ¸ Ó÷âÆvtº‘ÀïØ14ÿ§8B°ãËóMAÐ[ó"Ït6äÿ—Ž&PRà¾MFßG@Õ¹ÀcƤÔÊ ÷€ŠDDœ `ÉÃîag@þ.•tV ùßTC*Èú¹Mß5úˤ¸¨O°µv!`l`ÛýÍ'ôøK–‹Ó;ÄCÚ ‰>ˆ™üç¢ÜøÛÑèò/¹¨"/]÷7Ÿ0݇»6b¼Írñä¹µçÀpʃ±¼MMKqÊ;½ Cî%í¶Ý±ã’ÖJÚ5¢¯Ð¼@ AHÛŽy>ï*G///Gee%úûû144”¶~¥°Ÿoý©€“°#þæÿ"B¢¢c€sä{;â?S¤´SaŸ'þä~ ÀGÏ>B~OM:ò:Aþ§Ätd>Ý)‘ƒÿ¯¡[Eòž¡"Á ™Ø*ú1¿=dJÇ‚ùtæEv,5¬‘£Ó•kÇŽ¬m9‰\ :Vû¢OÇNn`;+V†h–ÇɬXvzŽdß”ÐÏ ð"ü6/P <>í–YDxr4—•arTÃëïÄÐ÷°Wu¿¦¹vÆãø×á€çÒÜȇ¹”§?’™üaM¯¬wƶE ã;µ¥v§£"éˆÿV‚³¦‘>@°¾ò”ˆtuu1rèÚµká›±‹±Ï?+âñ8³c: H$®¥K—ÚΗXI'<¡ÿæÅ¬ÇðiÔ^.eAç‰äV~6Qºi%…ç>Êý½víZÀóÏ?ÏÊBÁ“ÑÝn7  ³T|Àív³ó¤%ÿDÀ`ñâÅhkkÃêÕ«±víZ,]º4- ~íÚµX½zµéÐkF¯E6†|®…µ=ðy¨ðA¡°Ö%Ó=çóeÈ©®<1?"Dø®C˜ò”©o" "þê`ŸÂ]eê›)çÔ4ó<1%ýÛ‘ÿ)æM€m/QÑú`u2 Ä„(ÉŸŸ£°ÿ ‡ JþßöâL\àÝÇtÙ‰H!ý7ùFa¬t-``Š“‡AÛ{Ò–ü/N›'+]‹õiDP€È&P8a€\qôèQŒ9}}}(//‡(ŠÐŒ9ŸÁÁAôôô0¢8†ÏçÃæÍ›±páB´¶¶bá…ؼy3DÃ)ZÓ4444 ‘H@ c%$"Ng‚h§ºÿ}Æþû§Ú~ÊøÇ¢no VCy‚ @Î2ëC›òxúÌýôBÇ?~Ue$+FçtÆÂìo–Èdú8ïëøËN d”!6òר,-ÇBUÅ QB áßc³$1Ñ€ØÈ_˜’rÞ|ìSx½^Fò·Â*p˜í¼ùÚïõ’¹ÍO•Op—çS…rÎ’Ïf¿ùíþ“m—Gk ¶¯®"×ó,Ët3Ýþ´ÊœF·ÿ$ÇØvùýåÛñubÏ Ã“yöëIÓ†'óÛ 1ˆiéå…ÙÊŒ¡4%ÿÀ0ƒd©&R ûB:ËGÓiþƒÍøZ8?û™ $0@$¢GÕÐÉ<ÿhˆØ¯S€ÿ F±KÜu} ¤q;ò^Äï,ÉŠÉ)¿PP§¿.cºÐŽtϯé井O$SkÒ!ßu(ÑŸtÌUÀ ¯¬ä¿æh'þhôÓÝß|"¥ ‚ Ç_ºÞ”OùÇPÞkŽ †Ð;»V‚ 3ñ+Õˆ€¥ë¯áïüÉõ~]'N:¤Ý„ Y_N%¬ä§ì_°\Áˆóà´³ÇZQŠB“N·<ùÿ…Öl#“:eŸ–H/@°}‰“;¢€¼6LDÕ¹äûÊ“¹_«}^@ª¦õKÖÓJL²%ÿç«}]?ÁD¤ } ¦·o&ÿoŸ‚¿·Šìƒ"{M„‹$)£¸6éþ¹öæàÍ¢tJ"4UƒäõB–D\û“gðô¯.‰} ;„Q„};¢=Ûý~ˆ‘!è¶)BŸöÓ•'—H¨…Ø`K÷ño<»õª”4«`@Áö-uz+l¾¿—ùœWÊ¥ý‘ëæÊXüs×Î> Iþ]®+™€úgtù“ÏC5äz“¢Ø·Ëu%ôhn}¡œê8S„àBaµïr Çy!ÒŸå‰îóE¨±UQ ÷[5 ²1ïEó€Ë•ß³8cý«%ÀxîÑ5Ûµ‘"ˆ‹vöúoj?2 ”Ð>¡Q$Ó6Ÿ^Jû¶p‚¬jاs¶”¼LIΔ•â3Eoo/ª««ÑÛÛ[°}¾þvmO–Ì]xI‹š`Ši¯Vû&€`öþŸ-ù¿ûé`Gü'û€häwÿV‹@1ö¹ß÷X>î~\±jÛ÷úý÷ã2I/º¦Ø7Èÿ>wj^&ÀÀ ý‰ÏRû§mýÕ€±Æ/Á–üý(¤ òö騇ý©ýa÷EmÉÿpÍä{ØbAc |ž”ü¿víZ\{íµloo/ê/&"y¶‹BŸ¿Š˜ì ÚÎ}8hŸ‘ÿéû°í¯–Ê>€Ô÷ƒÿ¿Löy¹|Òœ²OÉÿvÈ”æ”ýp[EæDZû½*”Fò®“;Bi‰ÞÅöƒ¬ã¯Uh‡¢»wï6ùñ¾úê«/0Ø@ÂVuö#ØPéØûÿ¨œü|‡ü¿©È@4e|Àx<ŽòòrÄŒu‡t‘òµŸéÿ'+QÀOÖ&†¯Ñ‹ËuÀÜôh |Å_ÿ4ö­s ùÎ1c»”}okþsf"üy‹‰<6Úgÿ>ò½* À¾¿¼Æ…ÿœŸ9@¤ÛíÖàÈ®ÛtIÚ¯˜ÈJþ/|ÔnRµdKø¿õ¶_2AxrË®[06E€î»nÁØ¢ËvÈK€’ñyP¢óŒ›ï&´¶’í|ÈΙ@Ex*=%]›lp"òz:P2>Jxnll„×ëeõ/–üO‘àØFg—·MaGüOªpÞA;räˆíþx@Ò9õW¿úK+†ø“íXJü§‚k×®ÅôéÓ±xñbÄshhÿú¯ÿÊŽ¡"vèVB˜ A™Iâ?h²vG…꫽ù¿*I8¥‹vÄk[¶Oþ+]nJ› ÚaÈ~ÒÔ7‰(€Cÿ7žüÏG˜;vì¸å–[ؾH$‚'„£U hlldiÖtâI•¢x9ºB»¡sJJ. P]@“,¢«åB…RÒºŽx å  T€’ÿïvÿ`{üR€zÕ-¨kº¾óel›œÊ¸œ7uB6ñ€´Ä„ùSO`ëº7°íyÃøŽùSO`çÞÜòPòÿÝ—òm¿`;);DÌjFZ»{ŽG ùÿxïm!ÞpÔAžæ»O÷à÷;@܃;þ!†“ö_gçùsè2Ìèwg$ Ïèwë»+ãøsè2&`—'X–ôÒøsè2“ €#V{f‚ ¿ßGdŠT Ò |où'h6~aÊ;¥¤äŠD"áZisoøtžüÿ®Ï÷mIÇœ¹Š‚çd­‰DVR¯ô¶hZ`м%ÿ[-äz¤ˆ€üYf!JöŸwƒ‡^߇h0Q´@Èú&ðŽîóñ+û£&G±Êsøà<à¢cPgù×ìÛhª]Ë1ÆoqcÔ£‡M6E-ŒÎS¢€xe» cf /o§#¦n ³è*£=Œ¿O>{Å?>øF2 $Ù[¸() ×rP1þ<ÔÎWöGMå»ô|ð ?p—é|^©´äÕÕÕ%¨¨¨NŸš["‘p% “À u®,•@p! xâçë³f%÷×u èP YäÜ»¶š<ñ4 %#þ ž„:ˆÈŸû³8b?ñ?aЍÌNkk«îóù!ß Rf:âÿÁƒO‰ýtÄÿˆ ¤Øˆú¹ß¾™ jŸÚ¶:qsQ·Á§;ÙÖ(¹¿¶…û»›ÍÛéÒB,KéSñQ¥ùm:ñM¿­ùâñxN׆Šýå3~O'X2Ù}:¢½¤ ¢$]DÀ«êØéIæÙY¤ÞŽã']³Ï¦[ ýT âøI“€UÀz®âJc}·üÑýÍX ¼^ìŒÇ1ËíÆ|MÃ]Ðç;iÐ]W ©ÕèêJ ®N€_" í¢TÖ›Ç×N½=#ÿ[ÉývB{N‰ä:žI$®Îþ~ Ï£R‹$ ×êÕ«MåZ¼xq ¹˜óä¹kçà–®^T€’¼³åϰ%[Óz™ öùÿí€T~:¸Ý¶õü¹^þØÕ«W3‡Cþüvdt#ê=›]ºt)‰ Û™@çJ7lز? êêêÐÕÕ…ºº:vGþÏx2Í=ð ¤~»rðõä þ9 ùŸæ£Çæbƒ’ÿ$q_G¡nÌÍè:ô‚ÁsPø˜Éâd3Éñh0xËO!Š£LB²LÈïv"ï>ö kn3]ÿà›d®­îr2éúÔ¹ ƒìC„AI¿£®¹Ò€úXòܼ€ÕvÐ)ùŸö›|£‰ŸÕgrn;ô8*&ÎJü÷x<ú¬Y³ð?˜4iÞpÍ¿ß1½½X¶l™#¢2…€ íµ¶¶¢²²š¦1òÿæÍÄÁpóæÍ)Î}}}LXªªª˜@®H×ÿN(† €Lúþ¥èg²ÿÖ bÿ²á§Çþû äZ_Ðé>-ö»H‡¬®S<-öãÑÔm<ƒNµ}Ÿ BéøÖ)ûüø#…äï`ã[ª *ö{zB¨©ñ£§FEâËûýž«}Jþ§¿©@×ó=íò‡zC†‚y¬¢ë¯ÙŽYs±o;!~»PØ×Ÿ°üCè!–ïÜEÓ C$BH  ˆi·<âƒEÛ·‚ëSbÿþý?~<›c¶ú+å‹ÏÃÿŸ¢¢éìóå§¿³};iÿT’ŸGŽÉæky¤#=óسgöìÙS°ýLõ§Ï}80}Œ9€q+Çáý¾I+®ï‘‹} ·þÚž/;û™ˆÿÚÞÄÉä]O…rõ{ÏÕ>zU\ß² O4Ï„ÏçÃòqã°þÀ\&éÆ~8úþåÉÿVá% €"ñYoÿ@rüõÐ 3ùÿ!KW¿6˜ýí÷™ÉÿÛï3÷{ ¥³¿jÕã¦ß÷߃)¢0¿Î{ìØ1&€‰æc?(ñ_Ö4h†("¿/ätý)ùß±F"iŸséIœK±ÏÝ\í[û{éÒKeŸÎ?}pž}¾ÁÅ\ípž=ópž˜wy2Ù÷·k¨Xp/&Mš„gß¾]z¼"û ßZcÞÎ㞤³ŸH$àõz!Ün7 lÇq¯QnB¥kÿG/Õ0òQ«–ÌDÏ£Ÿq‰ÙGpppƒƒƒBUU~ó³N½Ô¹ç¯¬„ ±Q|p0âå¤àð0QÇðõ.(¡j`Iqâ §£ÿºûÞÖ2ܸÕî7óe¨ ÀttM0O%ÓñïtüK§+å8þ}•Gvµ°wUSøçh÷ý“‰ØOƒm|÷§dÞ'_ò¿ÛíÖãñxÆ9pZÉ(Oô·ÛæÁ‹¤#ýçR†3øÛA^”Œ‚…ä<„øl%;ƒL‘Óy1‚ÝëaÆŠMðz½EG^Ï„$ˆF©ú %×7"šˆÿ$-÷…o+è¹íÄx1‚ŽŽ&@`GüwBŒ€F’¢à•nBLãÉÿ@q¤€lÇÒz>÷Üs8räˆÉᳬ¬ wÞygÊ1eeeiÏGˆ|>2Èf˜÷Ïž=G«0²¯õU Òþ,z šNþô·Ý!×¶¨º ²?žì¯*\ÇÆ Àöñù:-Ru'žÌ€‘ù§pmŒÀƒÆë&¢££ÃÔþ(ïlöÛAÓÞDݵ7£òòÓ~‰#ñ»ì'UrÈÛ^|ó®Jÿ§Ÿ}­ŸŒ^~Û^|#üäGëSÒºZZU< ÀÖ‡cÞŠ Œñóôw¦£õØ põhÐkDÔm¡˜W¸z4ˆ7Ц<[_Žô<5Iâ¿]+AÐéçÈ‘#ÄêÕ«1l¼€—ÐaùŸæç¿Ã#äW þv4Øú÷5Àí'q‰ÿ­ÔòXEÒ!p$*0£ß ^ÀšoweœåËJþÿÞòOЊc¦›ˆÀ/Öòÿ§Ê'ì‘î4ù?“ó»Åz\YHû6îÛdÄTPu›ŒÇN7Þ&c®B:Ó+9ÕÐL¶èy? þ7]5 ÎÆ÷_þ?»ê\¬[OΘâÆß7ñßæû÷ Üýè L„áIÿiËj8BE•(/aÌ“}=šñxz½² !˜ùWÊB,ú†&úK4,…± ‰”N™Ò.*F:»Ì&çLCÏ9€¹€<—mk¢ïåÊd¨ä¥‰Î’€bà»ôÃî]@Û]l[k »F­ÑO&ÂzT¶ š+é>]™x°¤`‰¼‚%£X¹`(%Ò²Ðr|V¢1ƒÁÁA\tº dŸ‚ö7J-@mîܹSŸ5kúúúpûí·ã±}ÄÓ˜öTn¿ýv,[¶ »ëŽÃãœ0?ƒñ”h´¤mK½>‘€è#¤ëˆ>ú§Ú¼ÇãÑËËËQYY‰þþ~ åÔ¯tÒñõtÔ¿â?p8|ʉÿ¥°ŸñŸÇGÏ>Rô=°‹Vÿž(fÎ[(èdä¾!LÚ"[DL‚Š} 4LÚ"BkÖqu|wДÞ]wúZ2!ÿ ëgÚ‘ðéØ<—ñ}¶ö™Í¾(Õ1’¿Õ>t¤ÿ|í§%øÛíãIÿÖ|v‚N $Šú›š†ebÆ»G‰Å°ÓãÑ7Äbh.+Þ‰e;MÎhn>¨oñ # á0ÐÕåÑyg§ ’<ù?‹¹ZjwÒmš»g¥=Ö Š\ÚOg?*+¡i§F@½»»]Æÿ£¶¶–E`/…½leÌ"ù¯Î;7ãuH7®åÇ¡<ÑΜ9,ÏÆM}ÞÁJB¯­­5ÙÊ÷ÞØðiÄy¾LÔV!‚ ´|´®võè➇™¬°’ÿ3ÕŸ:qÌ™3‡‘÷é~jgΜ9H$®9sæè‰DÂU[[«Ó|üµ’„}*QÈÿâ¹çžÃܹI’ ­_žtu.ôFav°ŠXÍVWJÊ·þ&ÄýGP7æf@0H~‹‹Ís©ÚÆFtz$#ù_QàÊDþ§˜7ucþsê¨Ò@}0ˆH€›çyM¶÷$D(¦9Šà›AFú§ß@Éÿô·…‰´`›oæ…ÉœïàÀCy¨ÂQü1$3òÿXéZ4û•”s=cÖ•Å0ð$p÷ö·ñð㣣ƒ½Ûb±˜+ØåÑF$""Jàƒª>àL$®ÎÎΜWÌDQ„¦il}‚ßÏãèÑ£¦ß|ä„|ÊÆo³gèÎÔ(è¥@µ³ÿÐ àÛ.˜¢SŸJûŸ*XdZâ;•öµÇÞGÍ—&fÌ[Jû,×pxɨŒyKipp‚…XìÐX3íÿð¬J`¨ËfÜÑþùÿD±ãžä£a?þáIÿ¼h@¡ö#‚ÀÆü’‚¢„¸âg+AtÿùuLSbè°B”¹A,¸þ<É ëÌvä~žôÏ‹RAe¬æˆÿp–<YúTÙ`Û¦ßDà>5¦ùaJþöƒ¤}¿H$‰ýýŒ¡ÎY}v‚ê±<”øÿi?€~àS$×@ò±¿ØømL$±ÿ(â¦7ȜמÀ¯'ˆ£%·é÷´á$ï¯óú’‚á¹Ú¯Žû½ Dþ#!û÷(*Nj.„N²D$ä~ôâí$ý'x4³?¿ú§ƒ zK}5’ˆUCsäÔοf#þ7ÛÜgw]Ÿ¾+XÅò)K"‘pÕÕõé]]Up_€ªŠz]E…â?ÆúC·¤¥ª¢î¾(€®®*ÔÕQÁQ9õkhùê½ËXBä×¢òY‡Ò“î3õÉù2DŒ€B¬‘ …Ây¯C±c3Ó•)ªÈL ï5Gn½ÑýÍ'r»ÿò~^kŽÔgÈï¿ïž`N ²†¼T…ÒÂ}^¼Û®Ð0>¬`G;™žã¾F/P-aÈ&â¼Ö£"¾;÷ŒôëÑvöG|¨á¦óDÈZ('û|ƒÿ­Îß…Úç¯%áËþ(Þ1öçJþ/Ö>;O‚+kߨkèp‰h40…Ú§0yШój4•ôm%ÀjŸ@}«€×_‘}šù?‰Í¼MÒSÿ°Om”¯|œÌç\}5IxæŒ7­‹¾”–üïTûR‰hL÷£Ôö)V¯þûM‰þ~R„ß.ԾĞbì;'íÿö‚ r¶ûÞîVȾpIêßÓb¤¯\¢å:a_ ý3z'„QÀ«éˆr¥½þ0Ä ë©$§ì+²“;¢øƒ( ï¾Éäù—)êe1ö©€õ9 ‹jDlUÈ=ÀÏËÉ90úVCÝÿj 0úqãÇ“ñ iÞ7Ý{ó¯èÿ_ˆD>ö‹R°-s[]ÁúŒb`ŸûŒ/~ðƒ¤ì£ð‰ÐÙÙ™÷ý牭¦o2Ö;°µ¾ÅýYj½!%?;GíF`ç‘KÿËJÀv¢ýWV.̃øo†#ÿ¿^þv O4Ϫ%Üàú–.¶ýD3!Іšr¼öéu–¼ÞTÁ%J°+òù—©ýO›6 ÕÕÕèííµ%ù—¢ýt A—ˆãoç5TàÑoã‘Ñ£q|8Y‡°ý­äÿB¯ÿÉû4 »Cļ^/¤ê(Ôpr!±ÙƒIò¿•èo%ÿsÿï¿ÿBúç@jQQ|€Œ"Ö¿víZÔV1ÇjÉ‘ö÷ööÿcÚVDÑ–äO÷ñéNØgäkš±-y€T'û_’ä‚WÔ€süÀÇ!bV²·Óý_²® A¾Õ塞Œù¶?¢Û \ˆn?>¨Íá;ßþÇW–‡1âC-…ÈO·³}[óçÓÿ°«¨I„¿]äI“ðíK¸$åx6 ¹ ªº©=zýE¹ «ÐŽ@g4½/ XÉò¦ƒ÷ŸŠ½TÃÈwDTUU¡¢¢"E” ‘H0A>'í+²²?Š“š #^NÿyÈþ(”ÍüÄg¼ÿïDß÷;w‘°´ÿ~Ï<Óþ\Ú>_†$§–ú¿¼ÆEHüíCïWÆñ/ ÇäR(›Ùœ"@¡ª“ Iû û÷á¿}¹’ÿÕnGvµ lfsÖ¼Ö2äJörË@ÊoºOÎàoYx‡É£U û:bAee"-9 dçþ 688ÈÎM£¦ó‘Õy1š¯ØÈëvàëO^€ä,´þéÈù%Þ¦J488ÈÎMÎçeõ£ä+ÁŸOç÷óçÈ´þÑh ,À–-[úóÎfväú#Gr'\z,%ú·µµ!§ˆTTT°Î@. ­uüy ¼#épÔÜTV&P_ec¸öÆ·]X¹r"V‘ØÝŠlÂ’¬¢‡Í .’Ö÷¤ÓìŽa¶hvÈÚ¡F Öfâ/]Ÿb_ÛÁŸÜ‚Òè‡Ü"v;’‘VÄ?‹ÊBóPäJüçmS§+LM›:Mñå(aìÒ{¸rßcmÊAËâ”#^.X²d n¿ýö’œ»¢¢øìLy!¥°”"»ëŽã>›ýt¢ŸÂ>ì y¡û£éÉ.ùàtÿÏàÔÀJ ,–øŸ--Wû…ÿ²_(ñ?_û…”³³¿ýæ2ç]9LÚ"¦Ý6H¾pÏŸ6ë€Cg«˜îjòêv»MßVäK€æ®_AŽ|ù ¹™ì‹’˜"`—'ɽÿ‘ r%ò;EøÅb®=€>Ëí†3ù=>9ªaƒ×ËÈÿüq[½^}YTÃÝB¾ÇãÑe19TÍÈÿ¼½Z­+b!f €•ôoÙFK­ ¨y~÷¦Žß.è*ºþù¶*”V€HNá4ùŸ>Ss)?ÿΠŽAôw¶ãùcù}Ö|v¤zê|G÷ó}ž„΋Ðãíê–Ÿ/ áÞZ^J¢ÏT7«Ý˜ ëêêLç^½z5º»»Ó ä‚t÷6‘H’ùãñ¸Id ‚ Ï?ÿnzçeç‹ß;šë|ÆêÊu Æ‘é]Šý‰‡±?ñ0VF¦aÓÀ!l°½G/B@‰b3ÿÏ>ÀÛÀϳA9? (øeRÅII× ÕêóA^Wè@Íž‡GUëïù νÞvönû³û8§ñ®Ëx´ÿ‹eöóøg÷…@Φ¥Rõ+6 µ… ®?ºª«`®zѯÆüÏú@9 777[‚Áºé2ÿ¹o8ìÛ „Ùì+]™·\%íÏÉü¿ÿbÙØcUÞò´´,A*5l-G\q5þ'lRUc |ù}è_© NÒ¿øòûðÍìo¯ôíA—ìû °ÄØúxuÏ?…Ú[[›ùßÀ¯öØ‚pÏ_€ÑÖìÁ&Ø2•ÔßIß`ÊÏ,úÛîHæ;cËx¥_§ øNT«ïvÍcï «çâ¯_LBU"hRòŸFªÕw5ÿÛu²×/Înl2“²sŽŠp(d}þ·]ƒ½Ò7³Ì€;ß± ‚x¥ÿÇ3ÃüoÓ?swWžù¾}óúÿÓ°±¾Ÿö{ò?úÓþ’®ÿõzÿ¿páBÓhÏ`†{`?€ülõæûˆì°ûÿèŒÜþ‡¦åûD>ŒÑïï°Ì{"<©ñMê@gÄñ|Xhz1ýB÷¾ÌØä›û\÷-œqÆ8÷Üsó¦•rïËÊÀúÑ2¾5È P §eJÙþÅŒ÷óW¾ƒÑM§!„³ï7ú„nT ß£bSä Xu†‘ŒP¿¡ïtA¿¡h #ÜU\»Ô2¸Á›ÿ#(?®œ2CÁ|g‹\&ô¥€N˜ÁÙ-óy5°ŒëJر£©”dš­«ÉÚ«Ìë<Îõ7ò²3ó{.ZÉ ó·SP€JhjjÂáÇ ¶›õçM÷ÖÎúNÁJÅ©þ7nÄäÉ“q×]w]þرcek[6éí‘¶u”ŒrG"LLL””±Ð ÖæB¡6nÜhfМQÎÆiá Ïj †÷µ¡i˜>Ï·?ñ žT!‘ÕáÍwÌüÏÏ‹@M— 3¿ÃºôÑÑQÇ .ó;R©‰?NzzdÎÁFŽ”×óѧ_À5·Þ‰0Nàlâ?ó¹mŽË–<À‰Gžž„kny?Âپė¼Yw®™Ÿ3þ_~ðrô½ñ£*yzþsÝjËï3]ÖcŸÇ tãÈ‘#fçSÖ¡Ž7ŸŸ£(88c†Ì]è¨SJ€b™;[28»ë5ŒEŒW£š{æužÏßô'|{éøö†SQJœéÎgó;{éøüMÂʹ§¢=XÜüΛÿ_D¼1×ãŠxOD£èÓ43€½ó¿®5’„×ÞÊ(*ÇüÏøûŸ„0 ó¿~øtܹ!Ž[nŠY“ÿÐ`~ð…]¾cÌàŸò6Ðû;H±³Ë꘺ð$lþÛ áütÎT•üw# 3ÿ# ¼ú+ãÆ;ù+c Pˆr;$†i?ó re²™.öG¯€¢r™1Üøeimiæéq¨ö °Ì!,ŒPàQ?p\†=¨¹}QíO¸eØp%†{þ£ZGl±!dv†]˱ãmP6s`\ê"ÂüïÌšH&³ lûßWù¦]Œt:àƒøAº d#ðzÒ64M töŒXôY`!û°îFFÉdî¨Z_’$=?‡v¥ëBEÛÿUEÁµª §»ÆÙ§Û]öÉöLwŸ<÷~%©ÆFFœƒrŒh@—ã$O(€¿ɲ¬+Ÿz.ªÞü_¼éw0•ÐE–¶´`0å]€BÆbÞüÜç$V¾cÇŽ™ïÉØ¸JƒÅðëeÙÖ™ázïÞ½–¬ô¬‚½#ÂòåËÍinZÌìÍÖ[̀ϲðšÌ”Ï—¯Pýìû“­ÃnpwêX122âðÁ®[NpB{p ·²°ý`ßö ¾sH5°ýŸÉdòÖÇ×AÓ4H’¤³òrA(*:œ‚lر•p*W)ØÍÿ€aâ]{ F^ýž9Î-ÀÈ«ßCǹÿ`NWÕ;¡r™pe¢Qè,Ø€ӗݨ¹ Œð2 v^̼bæÿÞWzÑ‘¯\rRÖX`<È_óÑ÷[‚¼¾õžÀôe7êN˜&}>ãIÂ}ÙÇ«m˱ñ¯dïM÷'¶¬“`ϱ •JïˆlfÆ.5æ¬$Iú–-[°gÏ3›–Íd°`Á¤ÓiȲŒ‰‰ D" #“É@Q3°±$IÄÒ¥KÙ±`þäÞÑVK-î¿IŸôEëkšã²åùã¬^ ä32™ Îêõæý„¦i e«þ9“$Àa˜Èd28g’wú==KtÈrîù/ÖnF<â†Ù[Ú!IÂP¬€Cç¬rõ×®]k©?ÿí•fïI2™ V­ZåYýeù=þ‘ièwžo€Ï‚¤iÞéÇe=Ý‘¶[É›o‘†“C¹À^¶¿Õ²¬w#gè‡$ãã–ÿݪŠf`€å½ŸÓ4-°pDÖ»ƒ@,%!ÆjJ½@Rï ·ˆÆw³ÚSÞ¿ìéÔ0?¬`4¡¢{Èû÷¯n8+5þ›V š¦::ÆõþþizWס€¦å2ôÀ¬®CèÏ~záï/úû§é,ðÀ´ŠîµrAœ¿E9}‡²Ã–cï‰Øý«1~Èq§rd×a)‹:š@JûÅæ/H608`èÛcãÈDsßðì”ôÍñ—ñ¢æûü¬,N8~sä¿i–«W&… þ~(æ8óM†‹ÓõûIüuv¿ˆG#èø Üõ]$ú¯‡NBQ`v¼Ïe…·ÿ÷®Cs¡› >~P,æÿJ`æfæw P»¦\˜ùŸ™H‚7ÿ{FâܼcÀÞŽïtï¹@ùYxã|û(Ä5cå'0ò›õëÿ£¦z_»NÅW,Áqï3™ÞÙÆÆ±£Eó*ÞuQΉ¸×;ñ&Sb½³xåv±«k8€e‡gŸŒ¿ ,X9€Ã%%(fþÿ¹ ›œ†™Tñ2‚xÅt9³–×7¿s®àÓy¸- Å“P1Ôø&üõMPQzà ¯`û@Á‡ß÷¿Ѱ‚ø@á,À'ª>39óÐÙ0oOR*öv–é5Žú½—?`~çúýu­¬yªmŸÌüÏÌüN a7`WoþO=þZ>þY¤JT…·^“˜ñ?ÌN…s”Å7?{~ž9L’lï…Ú†ùßcX€Öïðò5⩾ëògd&3ÎnmÙÏöß0öï?MÞó–ø‰=uô K?Èà'}Åпú+!<:Åúü7*gõÛ’¸f,?€ßœtTûSŒþæçL’Ìo ì÷IG«{ÿ[tpô ÌŠ?ÃJÄxþV"˜û£WXzÊX¢@Bøn´\URTà´.à~$U‰„Žp8÷Ú¥¿Zâ÷Ž"?™¬ý~íüñ"§ë¬×Þ3Úïø¿Üé3–@×&_ ‡×^Ãã8G~4ƒ3]âopÂI«ý?fß·™8³°÷l…‚Œbü i>ð_›Œo @þÿ¦ùÀáwýÙæC]˜|ûíêºÕñþªØôJùÑׯÁ×} Ìÿ| Ö×èÍ7ßt P¬Sð¥¥:¾5hø/XgúdiÏ¿ïZ—©–M‘/`Õf£ŸÏü•ßÅè¦ëïAHV}Ï€3ró¾Óeþ×Ûjw=&ˆrq àÖÑ”e]`”ñAËtf‚–®1ÆË;2]'e¶f«y­B™×+ FP¼þ‹³c¬Æzf´e”ìYJÕuÒQ>à@N‹7÷[ƒTfüçËa‡uºxâ‰'°ÿ~ÓðÍÌÌ믿¾ª©T .ÄÎ;ÍqÉdªªZ‚ 0&Ožl777›ç>øÁ¢¯¯‹/Î+#£¡Öœgg’Xcàˤìì` DÁÚݪU«ÐÒb<¥²A"‘HÁ,>ét:0YG2 $mc3{"5ûsØ”Bv½Íü@y&•R;âWkâO§ÓžèN½.Ë5”bâwZ§,Ëz)ÁœÊ'c›þèà4_Àµ} Üù‚eœÁ$\ûÑ·ð‘u÷™¿Y@‚3ŸÛûzøyœÊ­iZ`ùòåŽûÔÞ¡î5U5ÌÿªŠS²o¼Øq“yæ3FF¬“PŸëGG fl'øN0¥ÎÏÊÁÌÿ¿ë?€aþ‰•Ô1aàý{qrt.>ÓŸ04˜+ÇYƒA€« ëöí §:®çÛNnú~¿4i°x€©ýqoŒ"xc™{â˜}c[ß–ÝÅq£“Åš/ÙµÞ¹rIú9“²ä>_14M ]:MßµÔèÌ}ËMQܹÁ(ûÿ_ƒ1Ëvç—7ø×ŸŽÄ³‡0té´’;fž{á<„âÆ54‰wgâžyó¿_PxS~ôß»ÿ_ƃ=ÿ‚IQW¨öO¿Œç(GÈjf¯}üºgÅŸ0ÆÛ3q°{‹ñæ¸àe?ÈÛ|'6̲ž°aSwÕ×ñê”®HE†{yŽ×f‚ ,*œ[9”Í]ˆ¯è‚º¢Ë,OÍÿ²,ëÛ·oÇŠ+,÷$NÜ|ó͸òÊ+}iƒ›7oÆŠ·#ñÃ[ó‚$’I|âkù¦] ?ƒÄ½+‰€,ËzG: %²Ù-gÿ?yÛ•èH#r.ØQ¥æ»ñ?Þ¡šÿ 1°`€¿Æ7X0À_㿽-æýw=ÿK5vxit’$IgˆYP7xC:£ó+ÿ\ÅLü nûï\ÞüùÒétɼXºt©>::ZÔÔÏßûƒA,^¼Ø0BVµD닦KU¿@¶…t»Ùüm`Q0ˆ¸CÐÃEÁ p0—÷•ÒÑ!ÁéµEGGeÏxåÀLÿìºî@–eý#u@ýaùÏû^àÀOBóx.\"¼YÛ>Þ‹õÀêի󒸱y˜¹þ¢‹.r='–cÀgft¶ŒÛ|öó²[½X=Ø:Šóx3<ßÞ%IÒùtÅÖU¬Ln°mTʶ¯¤ V–Bæ~›ùòåf€r¯ÃN8½káë\ͺãqìAez¹Š2 çþ”å›lÆŽÞœaGïììx@Ý3X@ìÚ[ÌeX‚” ±5[žKN²˜ÿ[‘À¾;Næ§ m|€±ÎÓÐ6ôŽiðg†Æ+\'¸LïR3€ÝüÏtª W ét:0’½+ç:411ašÿƒÁ žþy‹ù×®]hnnÆðð0–,Y‚3«ÍìÙ³Ílããã8zô(¦L™b_-µ¾ÿ&}Ò©_éóÇüùó@õü#J¿_–N¸úKÒ¥EôoÒs§Øûfï~ù´]Ò5øsžëÇÆ g‘ï‘$½[ÓUE>è1ôÇR’¾¸ÿ4Qaª2 ‹Ï_à‰~­p0 Wcü¯MÓ±˜¤£´@W—uÚàà q¼g?'Ùƒ uu FP«XìŠËÊ¥+Rø;ÔŠ.ËxöýÈþ}‰ëˆ •ünÌ +µ ¯üw(~<ÿ-Í@’$Ýþ}Î `ëËÃ:´³aS—ÿæøï]æ÷Å²Íøü÷Éì°›¦ùÍñõ›šÕšÿ5ͺêK®±‚ ÷(¦_•Á¿ }Þü<€þȨ‰”pÒ5¾gtU6#ߪ®ªõíep @°BW±ÙÍü_¦>ËzÉ -f̶$b‘<óù@Æ0ˆo»#él‚)S_×ÃÆM©‘}ú-„{'¹êŸ{ ov;›N«Üþné‰iyãçõ ýóëG#–¬»EÍÿUê³@S¥þÏ~ö.¾ø´¼ßk×þ€\æm¿ôK/CWW¿5 ¸úc§áH©§ÄÔß/}·Ì–NÁ6ò²^z Ïh:IÁáQÃd²+;îì÷ÛÆïãÙùÞµí˜*ëŸHâñìïå:‡S{cîÀëý?Ÿëœ 0}¥Œª8÷䟇ãöäÌÿ\ƒøuüóû¿ (¨nÿ úeRÁ¾)¥oZ=è³knYÐ á”qôèÑ¢A`‹µó¼àÔ¾c.7-¡„ ›ýÊl,ë:3T›Ø{ÝïÿþpÀàhÂöèøoùøg-ÿÍ2ØŒÿÊ%]PŸãî ªÕw)c;qš·J}{_ÃÖ¿kE{~@¦À㜣WvýqkÿvC?æñºý³ @Îü<€?Lºïé1k~…šT @ÛŸA`šÿpÍÑ ·åë_ý•A|¸þ½;EÂîÝ»ñÝ‘`íZ¼øâ‹˜;w.¾{×ýØÒÜlý†îÓõwVü K`BEÈþ~Â:£ß×ÿ1k´<®‡úF"L gzWó‚ŠÕî‘~ņnô+~SÁý‡«q¿- Œ%Œé‚>ðË—zýÏ«Öü÷÷âÀ÷â8š:€-3ñøCY‚0óüÞQ\ý/?¶ÿ}•ñ›µ ·¿ß„ÿ÷,·E?Ø'ñMP¢+-Ï>ü³QtUWÙúü¾®:¸¦GíÏxþÒñ_›øË•ºù<Æÿv ¼PçÏ%ßûfa¦ž àªÛÍ Pm"Fà+_CIÏ¿ÌÑuÙvSÂöŸÚÞ#;z,Ûž7ÿ`㊻‘HÌC8¼ÉìªïÿŸ#ð§7°ê #éÆ7ç€ùc Lmï.©®Ne(…O}zVáqe”h\ÃnÐg0ã?38—zÐWp Pæu»ñß Hàù}fü÷¾þùœLþnÆÿCÆØj¸â #øÆ‘ÉdL³ÿ'?ùIÌš5Ëœ^îIŸm‡¾¾>sý“'OÆ]wÝŽæ˜:uª9<00€5kÖ˜FÙ¶+7 ß™0¶áÎ;?›×–ŽÎv†--Z.PÅl ÒÂ5%í 3€Ë4ÇyËPL»ÁÅŠèì´fÅÂæÍ›«îx_ª‰ß­|^uü¯ÄÄÏôelÓ½ŽÁÜ øü²ü¸Gp5®¹åýgûs_~ðrô½ñ£*y:gú_Ô½ú-Ö |`TÅöžíynufÇj¡Îßš¦.üò—Ý;‡Ï '‡¹€‚.•w °—çÅÞ_aFøuÀÁÄts¾ßõŸƒ…)«É¾ó©åàùsüżù#/ÌÁ·7œŠoo8g ‹j³mÚ—ý^±,kþ`üF±¦Ä¬*neµg)¶s¾Á˜Þûl~¦QÞüï¦{ç†8þþ¦ž $ò7SA½¥„¾ áÚ˜ÿšÆLùŸ1:¾| jva8FœtɪQ2f‡ã!ÍBÆÀ/ãH>W8J¥ý!uhb°øñÕîÙË|¦Y(@¡rXÖY,ãJ…lÞ¼‹-2ƒ ãæ›oÆ]wÝ…›o¾|1àó×;£ Q¨0‚Í›7{öìÁ'>ñuaæ†_Æ»^äÌÿaîöiVø<F°#Æ´dÚ êÍøïÝ÷s,ËzSS“™þðáÃ55WÖ¢þš¦bC)½bü×4-°oß>€㿦i!IÒ1`lgɺ2þ3jU·û_ÖªY§×u`†17*ÕãÍÅÈjèÌèÊÚîÒ¥K+î„_®~GlÈSýzá¾¶V%±}Vîy8NžSýZUÅvÛuN–e}õX¿n !íÑ5+Nâê4½+<†‘‘|½®ðâê4߯ NÏÿ=mG÷îEP]ù þyϼµ„g4˜òçÚQçâb°wo^–•[WÞù¹#6oØv3:ðÝÎÝüu¢ù½ØqÁë”bþ/4]–eýÇ?þqIÁJ-““f)u÷bß»d-aÝ[¶lÉ äPN@ÇY<Ž@.k*3ð+Ë7®Ãç!Ä=ú‡#ÀÔÄ+h[¾½½F'õÞGî`5þ³ ñ¸³þõ­÷¦/»Ñ²½}ú¼ýø÷0ÒÛišÿ;{{Í ö †±*†ÎÞ^#ˆ*€­Û€™óùafþß4p=ýQdÂ@0f¼_Åžõ&ËXçiæ2+#ÓLóÿÊÈ4ôfƒ8.È!˲¾hÑ"Œg3îä•Gž IDATsŸÃ÷¿ÿ}Üwß}X½zµ%MÇ0€D¸YîÉÏnO]ì\5»âùçŸGss³iú·›ÿ‡‡‡ÍeŽ=Šd2i~W`AXÆW‹èëé“~­´Ê}þz%Ù8?"žΑ$…¡‹µ }þ[µj•P}#À³bô·KºÖ©š˜ú÷H’Þ;{62ª*D¿mHÒw´Oª‡:É»çs¾ïç!>ÀS-ÿ¢™Ãa`$¬¡#f}FŠF¡z·­ì߆ }ÿ)düŒoCjÙªs$;¡tE Ìýå¤o'ù\ÂȧƾÓÀ¾óýæXbqGlß jVl  *5`²ßÕÂgrÉì™Éøiüïjp2ÿ³:9MÍá¶0¢qo:—€ÀÑü_!¥d³äMè@L™”’=Ú®FÿlKà?áƒZ Ê %Sˬ¦NðƧ߬fÛÆ—ƒßä:Ž˜á—™€Ù°úvX» «‡Š?O e¶ô:ëe!¿«Z‚|Y>ö¸Ä,¥wÇ 33Æ Ì;Ã>IÀ§LðñDÂ8÷dƒ¼®æÌÿ~àIˆ*`æÿñ·s™.íAü:þíû7€{\@\ Ÿ÷?gv³…ÌéѰ‚ø€Eë—3GW“õ¼ü¹Ÿá×5 ”lêöû¯‚&ì I¥†ÑÒ²©”ñÎ=õøhùøg¡Æ‹ñŸ7ý[Ìÿ~ÑÆ7³ÿý†ßÎáPýí!£¯Ô—~ºÌëAÙø¶ì6ÌÏë6­˜ùÿ=3¤¬æÿ{ßB6…1–ž¼kÌüÿh[Ò¢ÍÑ ØvG2 ÍØö,ðàíóO)\tÑEX¿~=vïÞ¹sçb÷îÝÉûîzÂà`ôf°>Ç^fßfð×»Ù?©*ŽAìA;ªÕòïoœ®…^Þz¿âôþÅiÏàÍöÙÀŠNïš¼¼þ›æÿ,SZfZƒ´å´íû"~ï¨'×e§>†“'O6Ç…B!àØN³ {¨rqzÇvæ›*¦TÐu÷KBN;±ïÜŽ)7(8:ûý϶ñáÑ$šæ[»¥˜æÿ~ïï…Ôø& uY×ÙPÐÙ]Ytzµ\pÝ·ã ^rgö® °k×.,X° j=fÞÿÒR¬3^)¿´NÖ¡Äç_X–i]ñ6ÉdÁ`вSÌÿ+þÍœ8cþñ”Ÿà~|Ø4þœùߦQn,ZYVü6E¾`þwšÆ†Ë-ÑXT€Á êŸüä'”o|/W‡8À ×N™×•$(·\µ«?p€¾€»ñ߯r­Zµ €aÔ¿þúëÍÿJÿnëâ‰'ÐÔÔdþ¶ÓÔÔd/^¼}}}–mõÁ~Ðì˜P {Ù‡Æ;¡U«Ð9ÐvöAÕ¶¦ê@*%eusm“µ;~o°}±óÎÏ¢àÝK–rMû¥ (u}öq²,ëÌüÿñæø7Þxà °yóæŠŒwå”W–e}ä¾O£å¼ß›ãR¯œíÕ§°¤žèWjâç—w›VL› ˲¬_ûÑ·ðÈ/på`j'áÚ¾…íÏeÍÿóüËÙW›sm;kP°¨Û0D”³MJí|îx̾˜æÿ—`RY®Ýô$IÒg„_ÇXÄý¡–•ga*ˆÞ©ÆÛ™Ø‘˜e_~çu\ CƒÈ[Îu~C—g9”«¶¦i5’¤¿öV~¶®RÍÿöõÙµíå)5 @ìÒ %€ÝüïÆ-7Eqç†8Â7•÷©XÓ´€4Td»IÐ:53€3Χ~íù@øeÜÙðïD¶³L1ó=O.à,sœ4K1þ‚ïåÖiÉÉh¯Ì{b¸7_ •Àm=ÕDœ+ÆöíVƒÙêÕ«Íÿµ2GÛˈÉz{" …tE &…ÿ q¨ µ&Æ7R©TMŒÿn°@ ¢ôGìÁâÜæ)¶žt:m®‡XDf&c/ÞíšlY¶\5÷Ý£££e•Û@ÉÏÛõ¦_Jöër‘+ HO&Š¢è$UàôÜø.U ü"ý¾t„BúöL‹‚A¬3>w–`œ(‡žž÷`¨êN£?ѦŒhèèÐ3§× Y–õîÝ‹,ãÞš¯£ç¢âïƒìÇeµÏ¿„•BFübËz>Ô4-pÑEå­«Ð3»]¿ös¡`å"ºî•/$Iç;¡ÔKÙŠBïê:ˆF¡+Ê4ÎÀ/¡mè`ˆuÁ\¿,3þ³áBË1s>àôÿ:bßtöãáeÀW»^À×ú߯v½€ÎÞ^tÄb–yØú¦/»Q·›þíØƒ¬tfÞߟxÐ¥ièéšÌøÏàÿ€ èÅØÍÿŒbA:Òéì rëY¿~=fÍš…ææfÀÄÄöïßµk׺ÞôõõaÉ’%˜˜˜0 .X°À?<<Œ5kÖ˜Á‘\€0~˜Çÿ®·óAÔ+üüCú•éKÒ¥º¦m§?$éÚ¢Ü÷£ZëÇÆÇu>y­õÛS’ÞÛâMýk‰¦iî!IïŠùÙ¤¢ŒÿörÅmŸŒFzó¿O@O§f–`÷™Îó–[§ÌDNßJ1þ{ûæUè;”“vÁÀìû\ÜÖS®!ß BÀëÛp 2ýê'^0«Ù÷NÈÙ¸BÓªÕG#PÂIè]§!þ®Åü”×¹¾R}e ðRŸçÝ;Tœô%k|É×»f,×/ÄÉS­¾®¿…@`gô¿…p祿égÄrŽH§ ~¤/µ T£ïEúü¶©TßÍàë×ÿ‡eüÄÄ€œù–7àV»ÿ¿vŠGLâ„Æ®¹.„¯>èœ É ¯Û_¹Á'¼Ðç÷9Ëjߨo˜qÚ¹ýžý핾“á©Üà3^nUÍe:TUàÉM€¢ /‹e™*ôÇ\Ãü]ʼ¦ Ü#};ÿsÿOÅVÃvøL܃7»ò°T£/úþ~½!Û®nÀ;›"øu™ËÏû?±1`ÆÆhظ½'ôìoã|èd¾«$àW½èÃÍÍ~ß}÷ÝдêŸÅ•Ùª¶ýÇt½%k¼Î×ûÃܰ“ »}Þü-ÿ,@‰ªr×`ÞôßÙc| `ËùuÿWªÁ¾Z}'3q¡6Xb3ú¸ê‰>ànî÷³ý'b€¢Ï_˜t½9ž`ì­¹™ÿ+­?¯ÍÑÜ»E€ ³g7ó¿×íO™ÆH¯‘ô FFFLó?ûæ5ÒÛi¾ƒñ«ý«JŠ:€ýÑ+0+þöG¯€¢>aŽ7ç«RŸm•ùaçc®- ¥€Nµ÷ŸápîUN{l³Þìï ‘Èue¨T¿ØýÛ¹ß>¾RýbïWÜ þöñ~ÜƳF|£±üºþoµ[º2;n¦½œÙëòo¼aþ6õ«¨:F(ÂäÉ“Í$ºÇŽCss3‚Á ’É$æœoÌk¿/`¿Yb­r(ôŽ- ™ï÷ùr1øï@Àñýü5Ô5€É·ßŽ;wb!€D{;.\ˆ¡®[¡DW^­þK~ \÷-ü9îž@yïÌÿÄG[ÏÀg?ûlÇ~‰m_Ó´@paLÏì¢ëT\°Î0ñ°ùKÙþ/qË_°.€­3óßãbSä ‡÷àÏ]§áäùßµ˜ÿœ¹~Õ îÿŸ#ð§7,Ëo|sž ±»º¶çdägã Mã©¶ ĉ‰k€R:´óðÆl??V2#<3\;e^¯Öø|ÔŸÜÛóæ«Öø_oõ¿âŠ+Ž9‚»îºË2ýðáÖßlÛ\ýõ8vì˜Y¾r2k9ÕŸ{÷‚'Ÿ|Ò|øaÛ‰DL&1[ëƒâúqzH-:¾?ÿüó€n¸Á2~hhûx+Ì^>!˲>44-§ýÞ2¾å¼ßç…1Üð4€Û4¾<Åæ©†Gžž„kny?ÂsŒß—¼}o<…À¨ŠGžž„3Ù<ó Ó?›'ñ;Xæñ§c)xÙtàÙ_¹cÅ D¼3Ãñ]füw­,8Ìg_g)å*´X&À$ëøRÖí¶Îj;þ² ¹´ÿ5h ¨à´>6OÌöŸ_®XYJÙëp4ä0ÍÇ@n¦|WlÆÿöØxååbn8Ê1þ»•AÓrY°yŠe/a¡*5ÜÛu•°RV ŒÀkÜÎñvüºþÓmx;Qˆ'“(Bz½ÿ%IÒ;5#+;3eײ#¨,ËzSSZZZJ¥pøðáš¶µZÖŸ?)a½¨.ã{%úûöíÓ ¥¥@¾‘Çoý!IÒ1`lo hf€F£Òû;¯Ú&[‹Ê~§Ói3€]‹ýÖ4Í1Šh9°ì{åëÌ„Áã«$ Ÿhýz£KUÑPH¿ûÅ$xÃÿµº§NÅꤊ»Op0_·…ЙÉx~žN§ÓÎYïîþâ]c@ö›X\†žž÷ÔìºÀÌÿ=å@r/‚rߟH°º×2[¥óVº¿¼>ï{ÁîÝ»= àÆñ`$>ÊäÌù̬¯ª‡L#ooÎäÞqî?`äÕï™ÿÙ¼±koAï#w0” 3ê3óÿ£O¿`Nëìíµüþj× ¸æ£ï7ÿF ¶ä‚ ƒôcYó?ƒ™ùY0€.MË3ù3ö'6Çóë(3ÿ¯p63ý÷93ÑöÚÇ #Ù{2v¶uëVÀ²eË,ëØºu+¶nÝŠe˖彟f÷mÃÃF‡ÁÑÑQ,Y²Ä4û³ñ|0ÀøÎ!I’%h»ÿyòÉ'¡( šššÌyššš,ß‚°"úùƒô_}IºIO$6 ¾WŒþvIO,J œ Ñï‘$½;‘ÀpXŒ~,%é½- œT¹>C’$½§SÃü°‚Ñ„Šî¡Ú¼eZÀñsïZ+œ¾ñ”cügcC©Š¿W9$(TÞBºš¦ÚcãúŽì§¬Ð%á²Xpø6Xj,e`Š­+kþ/7Ø@¹TjÀdã0V]@p§ŒsNÙçÜÆU«¯ªÈ3ÿ3ì¦X'cttUWÅúž ¨²þvx³?ƒeÀdX‚x¬Ï›ýovY;tY‚T©_uÆ*ö?[—Û¸’ °UÖ_¤>o.gçÆÚµg™—eßΣÊú+Ñ•øj|pñ›™ÿKÎîçqûgˆ8þù¶ߨÏóÂf™øß^è»óJ5{YÿÃïªh:IÁ“›¬ãUX¼Ò˜î¥¾QŸv$ñOà!ˆÇñšªâ”Dge³“Ž¿mÌÿsÝ0Ї#\&LêLÂý³]§Ç Àé–Ì£óoÅ <8þ#¨}\Içûßn¨‹Fº…ðÇ›TúÜ4$’‡\çŒ{ðJï÷ëA¿Tî¾ûnÓ$Í~ÀÑ£Gñä“Ozª_V–[¯?¼ÙŸq¯í–ÌÀ#ýÔã˜æ7ìÆÇýý$’Æý53¿š†ÎI·E ²÷KÕè³vÌÚ7ÿÛ>Ÿí_U´\p펤`Ãüø<öÞýøñÏ2óØï Øþ.,-i$Û{7H&“yA X‚˜xxüçÚ¸õº§ª€šùòü×£«è(Xxû퀅 âØ­·¢'{­)6Ý‹úAæãå—Gq啹~ =fôuøxÛçñ£¯_“·\5mŸ™ø˜FþRŸ/X§àKKu|kÐÐqi°¢2$Uä™ÿíüã)?Áý°`æŒ%°ø+Ã.K–ƦÈÆ~§a†}œYfÊ@œ˜”t@”“a©Ò‚TÓYvñâÅøä'?i9é{™ñžê_õ߸q#2™ zè!ÀÍ7ߌ]»v™Qx¿ñoàðáÃfà€JÊVÍ>q $‰7ÈÇåÇ}ÑfDY6LçþƒaúçH>—À¦¸Š‘#rM ²,ëÝÝÀ‡o°NøÉw0ÒÓãIdYÖÿxÉÕŽÓÎ|n›Ùé´Ø<Õ–£\œŽjÛ»èúµ¢P=EÕ¥\œÙp½.“ðš™g>S¸“Œƒñ¿Ò2I’¤Û þ•ÿ •Õ¯·Ó0¡²½…:;±Œj®µv]'mÖ©Ši²@üx/ö;ÿë~;t¤Óç÷ÿ±H#rmîü„Ô¶þ’$é½-F’„Z“¶výóÏ?ßÜÞûöí«¹¾ÈöF”‡[0¥Jƒ-]j„[e1D¯Üô¬3ZZZJZ‡h}†,˺ýÆTs,ɲ¬ÿê`ÿçý ÎUU,à„íz xUQÐsäHÍž{Ùp­¯±|»v¡iÑ(H’¤ógé~üÁ‚ð0S?oürøß T X@€H¿¥,¼ÁŸ àD©æF Ð{@ ¹úóf»éŸÿm7þ¯ŒLƒOÓIÅ3i:¨R?à¤$>ä²ôϳwF‡#ÎF˜jôíæÿMümnb2„tüsø§æ¨7»ÆO˜ó/CoÂ_ß4€_oˆÔôøj»ÿ Ý[Û wfùúÍiN&<%™ÐêAéÒ¥˜2eJ¡ÙqË€Î(¥Ïy=ŸÿÃÔÿO“ò ÿvãµS&öJõ[Z–X ý| 5nœÿ6ŽÇóO`¶‚HКõš§kGúp?Kœ †>®–¬ïÖþÌýöé^¶ÖÖ÷¾³í9ý‹PîögÏ:Œmw$ÍgG£¿ÇúEK˜}_|ñEÌ;[¶lÁòåËsïG¸õx­oü³ì^Yñ'\§{qý5ë”­;k=³ã®Ï•>ÿ'’ùA6¡åYÛ ?οÕp¼è—zýw à0ÞÔ/ñúo©ÿXëŸøoL»õVË|‡n¿k¯x¯ã}Ú¹Ÿø:^}ø6Ïö¿ßdþ/:y Jt%Ôø&ìþs›€µ÷BÏE^íÿ)tݽ’$™Azo¸±ïÜnþÖ4 ý_ìÃÑÞÿ|ý áöž Zýɷßn5÷—1½˜~¡¶ÕmbïÞ½xéÁ/åì±­hm9sæ8Jkû¬ öú_°Î¸ÇziZÒóï{¿ ÓüoPðÒºâ÷Á`P?²£ÇÔæÍö…Üh”éþÿ1‚0ó¿~OnLÚÈd2·½ ^RjˆÆá”Rfb›á΋~šVyÆ,§Ìë^~„¤úû_ÿrYµj`ýúõ`Fºþúë1uêT3û•Wû¨,‚}?öO-á³P:M«…~O¬£c't. S@1ÿÿKð¿ÍñÛ23øð èèFzzò2=•K:ÈØVp{—2O­ñ£}×Ú`.Šj®~QhÛ;mk·ùý¸.Õ{çf¤ŸyÃCãˆúbüg°é±¡”aÈ·MçíÙX˜yŸ-[N}Ýt•°b}ÑÆýÉÎÄ:‚evöZ:}yhS™hýZÃî3x3æˆ,c¤˜7S>þ·•h3v£™ÿl±¡”Ž*:‰V«¿oß>}ß¾}Âô‡$I ß÷P':~‰â3ÃjšxòÉ'u ü,z¬ÀùçŸT*evîÜ;ô‹ÖJúS ^dEï9ri ϰ™ðÕò?WŠÈkk:ô\´Ýñ¹šM˨úÙ› Žwè~|Â÷£QèÌào˜û¿g1ùóÓø@l,˜@9Á¦/»Qgÿ}ú¼¾õž€= 3ÿ À–)U—™ÿù òÀ¡@:2ͼÞ1ƒ?€¼ ›Á4ûÒ‹™ÿÝØRæ]ßÐÜÜŒ­[·bçθúÿ3:nlûÆíX¸p!š››±ÿ~×õ¤Óé€$I:ûNÀþ‚™þ€=;¨ÙûUU¡(Še‚ òýüAú'޾$ݤïÛ'P»¤ïÃ>aú=’¤cŸ8ýXJÒQfýyêÙŒ/ŠžN á0 (€r‰‘Œ½vèÀÀ”ùaaÆîû–EËþM¬]6½=6žýÎhŒ]Î}Ïcßù²ÿ3Ï?Íï™–oåâZ6ƒý'÷›û.ZQðQu4³›gÖˆÎãfÀt2&ñq3;{\+úήï”UÎ-;™=ËXV©~)™Vݲ€Ú)WŸ™mí8i±q…‚TºýÝ(d‚qšæµ¾Ý`ZlZ¥úžda¬B¿ê èYŽWýB¬_ÿ§{©¯DWâ«öì¢6˜é×n®F¿Ðv.gx²ýÛÂÈe9-ôÁ ýbutÌz顾'7÷`,#,»K$€µ›Ý×[~4>€8"x@f ‰&n~–o4 !ïëïtåŸûsfd7›~FÿlœÑ?€5€ç_ ò^ìÿ_o(|÷ãøj¼ÿ¹k·“ÉÍ`ÇÆG#]ŽóŒôv¢#6T÷úš¦™Ã^¾³]ºt)ïó?G!¶Ó4¯ô™ù(Íø_­¾Ðû?``G¾ ¹\JÕwjÿÅÌý¥Pnû%ûÑÊ~cºjp 0QŒr·ÿ»KûqÒ9ýwïPÍ NμÖPøþ·- dßwÌ;°|ùrëtõ£ªŠx6À5oôwW­¾iþ·ÁÌÐJ‘²VªÏÛÅžƒ¼Òwzþ/õþÇ^¶Jôÿø·ùEÜÞ¿¸ý.[_ôý‡­ý­E]Q477cbbÍÍÍŽæóÂÙ©´ý+Ñ•@|€œÑß÷^XžG µK¯Žÿ£3TLù¢‚ØwŒŒ÷½7ÜjŒ»AAÏÃ÷@žùßK}%œt}þ À=;]µú=ºŠî€âhî/ez)únmïÞ½˜3gNÞü?úú5¸ ˰w¯1¥¶} ¿þ/­³Ö§Øó¯aú˜Ë±ÿ¥Ô?±;Á'‹ÿú=*7*øÇS~b:ªyó?Ùу©íÝ%­/ÚÂf ÆÊ³'à§Û§UZ¢1¨Ëš^e^?^iÔúWSïõë×# š¼ØöLŠn¿yŠ™”çýSOˆ BÀôÿxÉÕ¸æÖ;Æ©€ËOÝ‹¾?Í~ò<úô 8ó¹mǽ‘‹_æùj©4Ëìñ«'3Û3C=`˜ê3Ï|&ׯOã¶,¼ž¥ã§ïe쟔°ñhÆYP6Ÿ§#6T±¶›.¯Íÿù²xÙ&ÙuFÔy\´¾(øë»=s0t]îDÙN€²Ñ„¥aªdöõT{ŸWÎ3°h}À9èL9°k“Û5«Òs¨,Ëú#ûÓ¸vVmÜÏ4ê=A'ÌÀïdôç°yºº™ÆÿrLÿn°`,@±ùË1ü‚rx£?` À`Ë”¢#˲¾bÅ ³eY°sÓØ0s&.{ì1¬^½Ú¼¾ØßEóæÿ©ýqoŒbüí\€eË–•|mjoo×™™¿”@Ä[¶l1‡'&&N§ƒгAXýüAú¤OúbŸÿùåD¨÷ï}¥àW¹íŠœ¾ÿ0¼4þ³@|çÈØP |Y*5þÓfÆúÐ%\GÔßÿ‚—ýÀÓïŽeà¾w/û9Ÿ'xÙT¾Ý-Á¼Ê†4–(+ ,é×§>3Á” Ó#}ÞZ(€_úS¡¾ÝRi¿õ¦yQÀ0¸e–g0Ó­Ý„kfâöqÿÕ®BŸmÿBÛÝiœgÛ¿ÎÎ?"õKÉ€xø]—s¢Gõ/5㬗úÀ$˹6˜”·›Î¦å£O€ýǿˆýÏ÷ûbç`7c]©”Ú?¬ô/^̆KPÌ$}ôèQ ÷çfÂ.;{…ú-Ÿîq·ãµúÇÃùÇk}{û/%€_íß©ý•kþàéóO¹æ/õíëtJºå¸œí™þ|ã¿úf.3»:šÈp™æ•¾'þqsÿQMýíMŽ£í_Šþ”ƒÆ1ÏýÆy©_J M×ûàã`û;µý«n{Ô0úßö(ÃôoçªÛ5Ì™3'ožr¼¢žƒÁ OÞ±¾¨¼m¸Ñ(›ÝüÏ´§¶w#“ɬµe(H‰e ‡SDÀ‰R::¹-s"Шõ¯¤ÞŒµk×ZÖáeyŠývê¤P¯òODwîO§ÓÛôGou˜Næ êõÜQ¯åò»ùߟÿnÔåà IDATdžù ’Ï% ¶ç(ðª lùØPÊ0ä—±l6ê[E™oÝt•°b :ÀðÑçpÑú"q3a²ñ| €i;‰6¿“ùŸ êMÓ^arZ¯ãÕ:ëU¿žI§Óke™²Ú—m#‚ N4˜Ùß0õÃ,8€}ûøJ™¾ìFÿíJ P)ÌÀô ÷ ÒÙøtdšÎLÿ›™AøeËဩ¦o˜9³¤õ,[¶ +V¬oŒæM+Äš5ktèëë H’¤«ªjšú—/_®kšpº§‘$Iß²e öìÙƒ`0ˆL&ƒçŸ‰D0<BÁìÏo“:8ÿˆÔ?¬ö ¯Ig=ÖçMüh <÷êú[Yý…¢ŸXû_ÄñoׯÙþçÌw€‘aWM8fåµ£Ž& &Tã|uœê;™ÿ=êà‹_übÞ|l|¹™Òõzþg™Ø š°=<þ,&ÿ:=þOD}ÞüÏàÛ?ß¶ýlÿ²í¯(>?ÿˆÔ·Œk Cqj5¾ÿË3ýûYÀÕàÏ/K÷¿Ç¹¾èû ëo>ÿïÛ¿ˆ¾“Éßç“~± €|9çíÏ·}fæÿ—kfº¶}Þð¯Ž&r« ÖÏ¿™L&À øŽÆû"ÛÞ4þ%Ø@¸«üm_møù*-Ñ8ÔeF±Žõú±Ô+µþÇ[·Ž "ÊBÔÀmZ­ËC„wØ;Ÿ1s½Zÿ5M /ûžy&¿,~—¡!ߎšP-ã«)K±jB5õJ0Gœ8Ðu– ˆF¤Q:¥×R¿Ú뉦ie/ºÖA4Ñ(tÃðŸæÍýN¿ùÿÕòúÖ{üÀ Àÿç§±ñöq•ÀLÿvc?fæûüåê¤ÓéÀæÍ›õ·ßŽý·Þ À9ÀŸxì1¬^½Úr-N§ÓY–-ï7oތͳd<²? ¸v– lÞlÎo_÷š5kô¾¾¾$“Isü–-[°k×. #‰```À4T­Y³FO&“رcG&&&Ló0Dss3`xxK–,A___žA…i¤çÒ'}Ò'Ü@Ó´@GlHéÍî~ðù:ÚõüÒu*oÂg$ŸKÏ%º$Œàe?ðåX)ŒÀF2[û²å’×ù“ïxÏÆµ9t²ÏÎ\Cfg9áÊIÿxÒw©‘‰O”¾ž€ÆÝþ¤Oú¤Oú¤Oú¾èÛÌwö@[¬Œv£›¯#6T4xW=ëÛÍÿÌÐÌGž2e &&&ÐÜÜlšœÙ|ƒƒƒæ<• |ÿÑ%ÅÞÿ8±?Áú|û¿ûî»óÚÿºuëºý“~íôÕø&óZÀ àæï¬¾ß”[Îc} ½ý…苾ÿ]ÒoX}ÑmŸ­¿Öõw5Þgי؀9¶-ŒDÿ&«Á>;ßÔönÙÑS–v=•hê:£Ñ?7jý5qü@¦ ‚8qa¦{ØÑ;ÛßÇŽÞÙH>—ðÝøïT¾,¬<µ(ƒ“!¿·³±¡z;[Ìù:bCž–Ç®k‡Ìÿ'N¦ §yjUžZ¢iZ`H’ô¡!Ríïs³ÛU?|ø0ÿ»fˆ®?AAAˆ‚7ò»™û½2û—J1s¿æÀ0û»gfþ5Z,À¢hÍÍÍfDzyóæaÏž=˜7oä™ÿùåžW¯%çÍç¤Ï ùvcþÄÄ„ià¶,à Ð4-Ð××ç¸ øeÛÛÛÉüOAhšè’t èý£åð:ÿ­ ðǀϴX¾m±o]jBõÍøïT g·ã—ù¿PvôßDÙ·P¾,üüå I’nvÜä2êÆÌá‘^£ƒh0Ønt4u™Ï¾Ò'}Ò'}Ò'}Ò'}Ò¯O}fb†" ן 0úœ)aÁ…1ã>Üe>û:Žý¥K—È™™œ¡/^ I’000€Å‹»Îg_G©ú¢÷?é7¶>µÒ¯'}e~¸¨>oü÷Zß¾ÞFÛþµÖ}ý]ÒoL}ÑmŸ•Aäö7MóÜrSÛ»Íá'ï0ÌùS§vàÉ;–¸ÎW‰v=•h èÃ&AADê)½,¢:©‰Ú&õRÂìÆŠÕøOAAAäÃŒÿn¿+¥Ú s…–/ç¹µ½½]ß±cG@’$= 2™ŒùžcÍš5ŽF~¦ŸÉdlY»¶ÛòAA¥R,€×ßgjýý§ž¾ýõñýËmRÊ:Ù<š¦ m‡JÊGú¤Oú¤Oú¤Oú¤Oú¤Oú¤Oú¤Oú¤Oú¤Oú¤"ê‹®»è2ƒAÇù “É M/u¾L&S°þõP‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ˆÆ"P邲,ël8NW¼žã•F¯¿hDoÿF×èú‹Öèú‹Ö'‘4zû]ÿF×otDoÿF×èú‹Ö'ÄÒèû_týE닆êߨíO´~£#zû“>é‹Ô ÕŸêφ±þ­­­fý_~ùeª?QSDmÿzÙïõR‘ˆÞ"õE× ‚ ‚ ‚ ‚ ‚ ‚ ˆY–u=ÙoþñaF¯¿hDoÿF×èú‹Öèú‹Ö'‘4zû]ÿF×otDoÿF×èú‹Ö'ÄÒèû_týE닆êߨíO´~£#zû“>é7òñOõ§ú7rý[[[-õçͨ@£×ŸÑÚÚª³¿ZëŠØþõ²ßë¥"½ Dê‹®;AAAAAAAõIY‘ÃYG—5kÖ࢓Ǡ&T$’I´}á~ôõõ¨]6 8½þ¢½ý]_4¢ë/Zß©,"4iûN#Ne¡Ù¨çÑúŽèíßèú¢]Ñúõ=ÿ6Þþ]Ñú¢¡ú7vû­_OÐóé“~cÿõTÿF<ÿˆ¦ÑëÏŒ¦‘H Îz‰Ä(’ê´.ëÃÀÀ€Úe£‘»žê/šÖÖVý¥¿dþ¾àºoù^wQÛ¿^ö{½”ƒ/K-5y]QÛ@¤¾èºÛËQ+=‚ ‚ ‚ ‚ ‚ ‚ ‚ Jã¤rxöÙgÑÖÖfv~€`0ˆ5kÖx^87dYÖSuƒýÕ2G£×_4¢·£ë‹FtýEë}þ­O|ü]ÿF×otDoÿF×èú‹Ö¯èù·q÷¿èú‹Ö Õ¿±ÛŸhýz€žHŸô󸝇ú7òùG4^ÿgžyííí¦ùZäD"‘š•™ÏÙ_-3`×CýEÒÚÚª·¶¶ê‘H‰Ý lº#¢_èB$1§ù©/jû×Ë~¯‡rˆ<þñÛ@¤¾èº‹Þ÷AAAAAAA¸SVônÖÑèÙgŸÅÄÄššš°wï^LLL4Dšz©wGJX1ë…Ð3’ñ]_4õ²ýUß©,"4uûÓù¯±Û=шõ§ãêßÈúNe©¥¦h}ÑÛ¿ÑõE#ºþ¢õÊ"B³2p6âùÇ©,"4éøÕ¿±ÛŸh}§²ˆÐ¤çÒ'}:ÿÓû—Æ<ÿ×CýEÀÌžÏ<ó 8H§ÒH¥S'|öm^_TýëÖÖVÕÿç÷Þ4!ÿÝ­™ÛÁï èµÞþõ²ßE—CôñÇ—Aô6¡_Ú"÷=AAAAAAA…9¥œ™Óét@–eý;ßù`bbãããX¸p¡9Ýû"ZaoÔooÎËÀÁ:áøE=Ô?õP7ÔÑ„%‰VÐ ã÷ŒNJ'bG$ÑÛ¿Ñõ,£åÓ=z-´E×_´>ÐØç?Ñú Qí¿^häú7òñ4vý]Ÿ!úø§ûÆÔèú‹Ögˆ<þE^zþa4jýE닆êߨíO´>£Q¯?¢·?é“~=ÿ¢¨‡ú7òù‡Ñ¨÷Ÿ¢yùå—­­­úÙ\iŒø‘ \¥ ×™Óý.CÎ|¾%/63¢ú…Yÿ³8‘æ``ÉéèëK™Ó}-@pÙe—á™gžÁ‡þñÛøòMÈ~Á¶ÿô³§c:¦C½n>õàfÜÙw§9ÝOÝïÿû€‰ßþéT ,ðU×­0sæL<û“gqé‡/E*]»ö'òøÄï ‘ú¢ë.zßAAAAAAQ˜²0ZZZJ¥¼.KI\zé¥xöÙgÏÿÿ¸|M~Ž–O÷€u~R @M¨èÉ »#„0`8Ñ;$µ…Ï@Ä¡X³æ~ôõõ°'ê‰F?ÿ‰¤žÚ¿è ˆX€Ž¿F¯##úø­OL="¯?õP‘4zý‰úAÔý? öýg#Sçzþ!ˆÆ†¾‰¡Îÿõ‚ÈûŸ‡šÖâÓ‡××RÒD”ùœç¡áßàÓKþªfzõ„h2üpø‡øÔ’Où-S·0ã¿êáø#Ä@ûž ‚ ‚ ‚ ‚ ‚ ‚ ꛊFÖ‘‰‰ ÀæÍ›=+P!DgàeYߺu+`ll Á`°sçN,Y²ÃÃþšîYýãû-ãL02zF2€îŽpÝ»‘õë!çÂ… óŽ¿Z"jû7úùÑèí¿Q3 2=ÄžD]ê¡þ¢‘úõ°ýƾÿ¬D׿QïD_:ÿ4zýñÇ¿hD?‹|þaˆxÿÉÝþèúÓ˜Ïõ¢ß¨Ï_¢õ¢÷=Ј߿zþgˆnÿõpÿÃS+h=˜Ï ¬Xjµý[ä¤ÒõwÝk¤ã¯µµUðÁ;vì@óûÞصkìc ûY‘ú"µëaßAAAAAAQ˜ŠÌš5 ™LóæÍ3ÇÕ²CŒˆ8²,ëCCS1sf3àÔSWc÷î/fÏžd2‰––ð½3ŽV &Ô¼ñ¬ƒ˜ŸÚ ‘HqˆÎÀùì³Ïš¿ÇÆÆÇ_–2àE=À:77翦¦&ŒŒŒ¨ýùO$¢Û?иë¡þ€øÀˆýüXÏÿµ8ÿÔÃõ§Pýkè „¢ôeYÖ>¶ÍÒ$À•S¦ã»þ@c]ÿêzþƒèã_4"Ï?©‡ºqðlq×?@pý‡‡qpÆ Àŧ†?ÿ9€Æ<ÿŠ8ÿñ÷?Í¿8Ô·ñ¡ø‡‰–zdhõrÿ/úýg#S×zþþ¹øâÓ°qcîüŸÅßg¿îÿšO`œÿàâÄ*ÀèCqtº};ʲ¬§†Ò8˜ýþpñ©—ª‚ס³gã‘£Gѽhz¶o§ëŸÏˆ>ÿ7òù§Îÿ¢¨—û¹E¸J~¥bΜ+±wï^¿eMD±å0ðþ½ˆ¼0¾<§¦õg´¶¶šçÀZpEî¶ý•7#Ù‡9ÄlQ°ú_úáKqàÀÌ™SÛú‹Ú÷­­­úÖ­gaæÌ™€Ë/O=u@niA:•œ9sŸŒð"õíÚk~»}ï뫉6ès/AAAAAAAÏ@c§Ö¯ù ,š¦ùª%˲ÞÝýS\ 8ùäu˜ú—m8|èZZ€Tjªð µ 2ðû_¢õE 2‘,ËúŠ+L]ÀØŠž02Ií c©uPY–õûî»MMM€7Þx€aF ƒÈd27ˆtÔC®FÏ€XÀ˜f­î?ê çŸîÝ‹ð‹I¿@óï›±í¬mÀ…ÀÉçïÁ3'/¥ãX8Þn– >œÜ®?ÍÍÍæþ¯Õ¹×Ÿ7oÒé4B¡ïûDôñ/J_–eýon{ÿ™ý}¡öàÇ“.ǯô‹±?ÐÌŒwœÐ׿zž?Ä úøgˆ2@‰<ÿ¤Y Ìp˜1mfL.~ÏóØ?ö0`>ÀßkÈúÿçW¾bþžqð àšSNÁ§¼šHäfÑYƒó¯Èã_ÄùÏ4ÀÂØþ1 G%âåAt§ý3À2DÞÿód|ƒÑh×}í¿^®?@c?ÿ‰@–e=•JãàA`Æ ãü¿*z2prÉ$HLôôȾ<û±sŸ£ZêïŒwñ‹°ÛeoMø²,ë©î©Ò€fæÍs-€G€† êþ¿Q¿Õ õzþ¯%"ïø Ôvja>ucâ·¿­‰N=Õ¿µµUéÁ/™¿/¸î[B¶}-©§í/‚z­-Ž¿ÖÖVý–/jμúê•€)ч¿»÷^13fžã˶(¤ï†CˆDýÓ·kŸ}ûÙ¦ö}ûaÅtë^ˆZ{ ‚ ‚ ‚ ‚ ‚ ‚ ‚(NÉdYÖׯ_of Ý¿?’É$¦L™bC³ÿ}ÍÂÃ:`ñX’É$–,Y‚ááaß´Ó¿m0À0ÿ«ê+ÙqMÓ¦¡i ¿o ==ïñ£–Žoêh …Ð3½ðª×Äg ±#ºœ}‘Qœ½w¿YçSñmËÀ0ÚÐS£b5šìرcØ»w/ë`‚½{÷âØ±cŒmÁ̱“'OÆêÕ«}/O#¶ >2`5jýEÞØi´óÏÝ?¾ø)ÛÎÊŽxKÅÝ?4uYÁÙ¸O¾ZEÓ¥²/ehii1·ùþýûÍc@’$³º_Ç…,Ëúš5kLãÙÄÄ2™Œ©+V¬ÀæÍ›}oƒ¢3ŠÐÿÕsoâ#.¼Øøý‘Ÿ½_=÷¦9ýª‹\|¦}h6RW]PÓ²5Êý'=ähÔûŸz@Dý÷ßû1럀s³#^Lbÿ½ÿל¾¹å—€YáóÐÒãoYDÔÿ”D¯8GQ¯©*NáŒÿJÀ8ì_W`ûöš–­VÇ¿èóßõmÌÄé8ˆé8 ¾@ßeN ‡e‡ü9ý®ÿœÝõ°í]Ë8†r¶q]š/E±=Óâ¹þ몂éf kþW¼®*æô銊hv¸§—¿F»ÿÏ 0¾]|ñ%H&}(|ð'_:ÿÔßóG-¯¢îZ[[õ;Ößaf ~¨i->ýô§-óøm>å Щt Íï{ JañÇ>æ»¶¥þÃÏâ?þújË<µ0ß¶¶¶ê‰DØ@"1Фº‘Ht8MðöíÿÃáâ}?þË<'r{ýŸýɳ[¬÷:'òñ3WBr#æûäè+˜¹ê9ý›÷؃§áλ%Ïõ#]‡0ÐoÕtåôâ†þ@¿÷úÑÇ! ü]ÃüŸ; ÑÇsÚ›_ßœ´ñûSwÑûž ‚ ‚ ‚ ‚ ‚ ‚ ˆâ”žzê)Çaf@š2e FGG=*š£Ö0œaŽcf¨Ù³g#™Lú’…E–e½£Ã¨_.òÌÿ€aþ€Ž ##ÞucßRuãàÙF§e¾€§cjáP0rDö¥3\=d`ž5kV^¸Z"Zߎh’ßú²,ësM@M¨`]^Õ¬ùŸG +˜³õ߀uÂgˆ@Q+X6 †ÆÔ©S…”K"2pÕk¬F¨¿,ËzjxgÔöþ£åü°a8pu“ ,ã²,ë‹-²t:gÃÁ`Ð }ïˆÏwºçµ~û‰è „µÒ—eYO§„ÙxÛ À4ÿ_xɸ¿LûÐlÀo¥ ooñ­ Ìš5 ©TÊ Æ&úþ³–ÐóG>'òñW¯ˆ¨? À†Ãðo¢8,äµ<ÿe¯k,€éªŠé¼ùÀP0ˆNïÃDÿ"β,ëÝnâDwaÌü¯Gsfƒ™ÊéèîíFìOFfÑÏ?Gº¢˜ÚÇkÙáó²jìœ}:°ÞϸPëóo=\ÿj}þ5³À7ŸdŽ£ç¿Ú ˲ÞÝý$ŸïBèƒý`šÿ³¯» þÜîîÛ|3a›A`5ÿÏ— ë½1í5ÀÃ<²,ëÝ‹È`Àaü7Éw/Š¢gûöšµÃZ¶?‘÷ÿÉ$ Í4‡,øD(ôôø€B–e½ûÝhþ½ñÌ÷‹ u« 5 ç}c}Àl@Fmß}‹Bäó‡¨ëŸèûŸ§žÞeóæÿÇZ3‡[÷¶ú¢ÝÚÚª¿ôÒxýuãøkooÇŽ;rK Ò©”ïh¾þ¼ùæ7sØö~òB?¤-<óÌ38pà~~ÿ$Õ=€¹‘H¾ë‹‚ßþ¼ùÝÌ5‡—ï½²få©uös¾þ¼ùÿë_ÿº9|Ýu×ù¢ÝÚÚªÇãqó»_-¿ÖÖVý®—_À€ƒù8°Ñè‹q×Ë/ãæÖVOÊÒÚÚª¿ôC?æ` ßÐé7/ã‚¿ª^¿µµUùC;úø!Ä?>Ífl~ÝÐfÓ^¾àe´Â›º³2ˆ>÷AAAAAAQœ²hšf1þO™2Åö³Œ,Ëfæ{ÆÅŸ†‹O?êɺa nSAß:a>tMÓ¦YŒÿÌð‰Ä98|è§E«B–e½»#%¬ma ›‰eÀá ‡Bf§8¿2!ÕKf;µÈ€#ZŸ!º¶H}{›WÂFGØþøÚºÇWíFÎÀ”J¥ÐÒÒbvŒvÀ–ªÖ8ÝÚ¿\£À"3 þÍmãÁ7íù+ÀŸw¼àF¤Ó?‚,_uBÖŸÏþɸø´ÓpÞ)§àSþ=G €ííí¾š@ùüó›DŽšÆÀ0ÿ3~On|“åàÛ]v_0öA:öQÙØçö€µÔÝþDžÇNÇìÈÛ¦ñþs®³÷·7œ üÌåüö¿uέ€É7ǶrLŒù£2 tÿ_/ú€Ø ´"ïÿ˜ñfuåÌÿûû_Ìx€ïñ³5ßÿg¯\‰W7m¹á°iüg0Óÿ«‰`›æ5õpü‹<ÿ9ã?ÌèŸnoë} êHMŠ ìùç@WÔü=ûôÜ´­o?Ë_ýz¸ÿúì½xå½÷ÿÞ@AÛ Ihƒh!™DNkuÙ™\ÖúƒÄú-ZNÛh-õ9×)MvÁÇ£mVúµÇcŸB8ôÔÚãW²K´}N•þ«èã1‰=Öò fg‰øãH”LÄJ%‰hµþ óýãž{öžÙÙÉ=3|^ו+»÷lò¹ç×gßïÏXyþäúÛâÊÝ3Q9a&æg—£åÅ$jÀÌŸ®=óZß 08cáú+äø ÿ03€£ìuæÞÛÜæ[ÜÎÁ jKá?7€Û¿sðëÍtHg3€Åp ÿñ&“t€ÂÎ?@¸×¿l¶@^x'šO$“…Ÿ—…¢(f}ªÞs™W‘y0µF…¾W‡Qcn0^ž¿†}ýã„5þ¹»÷ßq7þÝ{a¯q£Ñ¨¹çWÿèh›;×Ä\LA¤óÿâ[8spà÷ |¢î‹-Ç£sŽç²ƒO½,;\Q>ÿùÏãü#æÝpæ0z ô=§´øþþõw` ‘È[]wŠ T+võó[î?‚ÿ‰`ÏÁË.¹Ô!ü1zü{öËÏ¿'ò_ýáÈ‘#¸eáÜßÊÈÏ«~õJ,!¸(üç‚Þ..ó ‡ð?]áh—ù(üG•° ×µLÃåÞ«nsÿd@AAAAAAár\Š¢˜\ìÄ'û>|Øó³õõõhó¡úŒÞ™… `Æ\5ìÊBïtNø¾¶zª¦âšf¾˜?|èë}¡à_Ó^³LäMŠâ"g=ÓrÌÏ:Mäv溭{PYöà¾)*æ>Ñ ˜ \Š¢˜©­=¨,c »§ÌÇÑ'ÖŸ÷aûöíö{±™…ïàzz6¡¯oæOÞõO 4¾—À?߯*³UÎÂKýòcóɼêîüI“ðÎE*>÷[þ©òr4‡P.(ÄI‡eee(ø ß>~Â'€YÙ]~þ¤IX¿s'Çñ´ÿE\kk«ßálñÿú+¹é«z½9“EGÇßaá›W1èõçÕg϶g¯éº-Fã‚óë::p€ùæ;Š¢˜=è;ËÊ?µ»±>“Ï¿aV  ‚)ÿ¼øÏyÁd€Ÿ~üZ~ü©S§:§S§NõÌ;¥¥¥m£EQ³¡¡ìœ;88Ã0 (ŠCøoUB”~ ¸¯@°PE17mêÁŒlü5iÒ|d³9¼?afFUt.x¿ Šò¨ôøŸÆÑÌ Ø»a²£í¾» ?»ôæphç^ìn“Ù¶þ‡·¨ÛþS*#>0ÞndÉ IDAT@¹ÈñG×_ üûñúÊÏ~†#™ Ê £uÚ}¡ˆãÿÝçü wþØSžÊ³ÜÿêŸbäÊÝ3ñÈÑßnü&Ü„°ïLVù±ÈýÀ6¨Òf¢7û*ý{,C»7@pžEÆ¿¾¬ûÙé4Àùƒhq> ámŸÒ4L×uÿ2:òûßMÞײ|jjзéM,A=¾¢øWy9ì °Ùj¶ý¯^¹[ÖnÖ~FëÑüòžtäø_Qs•5ƪ™ ü×_ýðüoî5°Ø‡kÀXÝ}÷Ý¡ÆwŸèÔÑk>Ân;ŸÅ uÀåí>Wß2ähõ̼ðº¶4 ø#F¯ÿ3Ÿ}³Y|n»'zÕn È€0¬ñ`‹ï ÿ¬»ü¤Ðdœmß)¼ÎÜ~ç÷ÑÖ,yðo±Ù\õü'Tu²@¯çŸâõ?ˆça]ÿE1ëë ö1¨ëÞb»M› 44È?õœu¬-±ÞoÌ{jêøÝ¿×Ÿñ'´ç¯!Ž¿E1{^J¡ïPþù&0ׇ\ÈfŸE*47“ƒƒÿˆU¨%ôïþ‚ÜêÓœHg&€éÜ}W‘Ng>>ó‹;pïDÑ“™­ÿœ•8¶Ð߯õ·ÿww$š¿øÅ/°*ôFO.½ôR{¹qÅ+ûöùö¿£Ñ¨¹1~1€c ý¸d¾ER·45ÿøÇ?pV?ÿÿþï'P9÷ fû¸¿yü5«×8¶ÐÿW¿ú®»î:éý¹¿õ̼ö‚6‘ë*Ùw±?xÉ_B/ÁÿþõXòmÿx þ7¤+ ^@üÞ¦Ì+xá°G^˜«nû¶þÀ™{¯ºíwòAAAAAA!…’ùðáÇí/¦M›&½ˆ¢(fªŽU:Õ;³À®lø_ÕTûRuevµ?˜VQQЦi¯aZE…%þ—ƒ¸î"zV/¨„Üðmˆ•oƒ€‹ÿ9\„³ë’Fœÿd29ú&{½Ye™­í7Üp 2™›‘ÉÜŒŽŽŸúŸ÷¡±±ì‰_eee´'àù›Ç¯¯¯G_ß Ì8°pá„]PÍ,zhõ=¾Èê« ­rÎg» xðù“&fô1âÀOÙ´q×â7¥¥H•—² D‚¨ÀTVVfÿxÿ•••(++Ñ#G<þÚ¿>» ßÿ;áKXÞ ££¦ƒíƒ Ϊª*@,CMMïùXQs_}ÞüaËË¿[ŸšÃÊ»ÐÑ1aÑSjýE1ï¶Ä?³Y¼¦ëñ¿žÉà,g˜fF€¤!÷ÚËÅÿˆ¥3*Xþ]þ¹gNd73¸¦šMJ *‹U.2ýLù—ÂegÜ˜Š¿§NŠ©S§zšœ”––ú"þ´8\ü¯( JKK=MYF‹¢(æêÕ« Úyþûã×ø+•Úd¿ïëcùGÓâXÓ°ë‰.\ð~ž™ƒ15åËñ?!ñiûgñ}…·MKoþW͇v?׿'þ.ûØUöë#PfýÀ2èüêúë&Œû'o½ÕÑ6Ò$|¨iø,€~ëê$ç~±©§YÐ-gl±ÛÍÀiÝ šû^Q3IW—ØãŸ »¾€d& µ]EÍŽÔ¬üÚøýQÅìÙ|…ýžßÿ,ÿÜ3X¯n€šÍàÚி½Ù"Âÿ"Ëd`ßÿ͘aïÿ/Mœˆ;$¬±_ë®›Îyv:m¿>sÙ2ll¦F"¾‰ÿÅóŸ›ÐpúÚ€§ßf?©·ý?‚Înú’ Ú´‰ÿ èûÎ~{ßc¿Ý,9ݼêÞçâ{ÎÛo¿ €Ýs_vÙeØ»7?æðküµbÅ G[?»âÅb1Äb1|õ«_õ5~PÛ}þ@¿~ýú!l*“¤ÀQý]|][š@miW¯\„3“¯ùrsÏ¿~ÌÝíÓØ£aÿ˜È¿°Í«]&úúW¯\dä¹ýÎïC=Su~±Ø£-¡êX à ‡)Àh)öü“_ÿoÜÁwàÎÇ;ÿ„uýÓõCö›dPÕŠ“ŠÑ¢(ŠiÔ°{?=§Cߨ;Äÿ ÆU¨q‰%øQFM0y È篎üÏÇߺpàûø› os9ö¿ mçžTê/§ÔóϦWî¿‹F£æÅ73ÓïHgÆþþWÿß;Q±àâ›ß@4 ü>¾{!8ÕJ¸ûœW¢¯œ5 Ju5ŒL÷O”cœ(ÑhÔljjìßÏFþÕJ5*ç>+>¹°çSSB;ÞÜË àD‰F£æ£×3óWó »]|íæÑë»}ßJ]Qж}.Œ@Äÿ·®*Œ¿!]Ü.ø&þO}æ Ço‘Ì+€*0ñ¿$¢Ñ¨™É°<{Õm¿³sïpâÿL&3f΂ ‚ ‚ ‚ ‚ ‚ ‚oL<‘O›6mXñ¿ŸèYª¦:„ÿîåAqøPá—¬2…ÿnìup…X$à¡{Q1¯ÿ<ð `໡¡£ƒO>?Š2Û—>$?óðü§ó¯mÎttüLH|³zü™œS]]moóÞÞ^<üðØ01ªiO¾Ó;³öñX9gdðz|*ÿ·úÇߪïÞËb9üfhlòs_v:k ~ÒªÀµ¸ðãÀWàÏd¸0×ÿhæ?°àEobëSsp4óla @Ìú¤à*Ïÿ1ZÂ\=“šHØÂ8´!ƒ™V´ß›À³~O{z!‡ŸÎ¿ÆûL—d…ÈDrºŠ PÚ„‘Þú©wû79—Ù¢bü­€ç5Þ)++óE|ωÇãŽíì~ïgløÃþ€Ë.»Ì~ßÛÛ‹?üáœæS§NE“wte¡iqôõÍ@6ë<Þæ^Âr?ñ¨ôðlã?„ÿnŽü ˜ó¹³€¿X‹)Ÿó=4€p󯛠ï?&f³x pŒÿøµ \ì€vŸúpço|åvà¯ìõ‹ÙL>h¨uuÀ–!ôa:öëï!’Éow^¹Íô§ú­Hן¡”,H`Æ«abC;ØöçwžÚ@ÊÕ \ÞãO¼*mfQ¿_‘ïkš-þ5A»uúqç{æ²e8ÐÒb¿ ÎN§qðEø/ÂÎ gk[€ÀkÙˆ½þ3êó¢Ì>ÿÁç¿«W.–µÛÙêlAûŒôtOc™Œ…ëÏNëÐ; N#€½ïùµðþº¿¿ßn+ WVVú2þòÆ“î×\ÚØØˆ)S¦àÆo”»7ûªÌ¨p@§ŽÞì#öòrUÞúpîÌ ¶4áxŸ™|Í~}ûwî¾#?®ÈÄlxÍz}hCæX"•±pþðYÇãLŒ^"ÞÖ9èÿ>ÙìÑæ‡ð_¤Øø—ƒï·4aÒ² ¸óñ,®ò÷ù'üõϪV8Œd ÿÝè{u¨5*ô\~œ“øQÂ~¹%ƒÌƒþ{¡>ÕéÐYþ€N­Mq½õUÌõè@÷Œ„/Ï_s9 Ob†µ›sÏ$óˬ×yŽÿ±’Ãà[¸w¢âþ»—g^Ù·/ì.œ²T+Õ¶øßè1ð•{Ö`ÂÿñÂEg¾†íÎ.*ü¿èÌ×<ÛýâsÍ´!üç¬Y]ß/á?§ùùÇ¿fÐüücR…ÿnV¬XuëÖþ»Íá‚ ‚ ‚ ‚ ‚ ‚ ‚‡c(ŠbÖÖÖâðáÃñÿpfµµµ€“QŽGàë‡P~ZE…§è_D™µËW€kšÛ‘ª+CsûRu…ŠÞÞÜ>€ºr ‘ÇÏÿ*æ>ÑŠXŒ ¯‚ sþ6/ÍO~žø{!q¾¢(¦alÅéé¼›Ük ÿùû ‰Oüal…¢\%íøWŬ®®ÆÃ?Œ/ùË`‹ÿ¼ùFii)Þ|óM@ò¹§(Š™ª¯‡.ˆ_ÅsL‹Ç°sï•ïÞ (НçþC»ì×¢1@6—ƒ£½]žRQ3U^Žš>{-¶ø¿frþ³{ßc?©òr40Oœ~‹^9¼¢RÏK)ôb¢¯ù¹ëŸþ&€Ø»w¯= dž{õF9 äMØâ€‰þ`r9›Z¯ëhSäí¾þÛ·o·Ûbî­ü]‘¼ òâˆU?Ï•€÷úï>çg8ú »þø½þÏø,˜ €ØæÅgá]!t¤(Šb®¬³&·¾Ÿ^Hæ_ äÀÊ:kÛåç`Îîóv#Uy&¸”ë¨êñÒ?û{™Ù⯢´´ÔShÀÛýÊƒŠ¢˜ ÿ_|Ç100`·566¢µµUúþM¸ø_4â&2QÅœrú•€oÍ`AŒå›]…F`|Ù®'®„¢<*mý¯šÿ¢§è_¤b^/&Š¢˜ÆÚüävQø8ÅÿëÞ8\k@Y)ïü÷Ê¿•»gâ`ó˜ð6 ¢úë:jPŽ6Å¿ë'½;w®üþƒ‹ øk€]øÝ˜_xŠ¢˜†fÙ îwÚâ°N»È4À0 @nîWŬ?X½½@°×.µ·Ö£a6¡AiDˆÄøWQ3Uf`_¶³ÀLf°/ûI@¹u陥½àu¤ôCh–¼€B‘ÿp†2QÅ|°¬Ìóø€ƒ–(ðCMÃ--¸Fò½ùsDCnðZ2‰³Ói¿–7௧àÿ“·jø¤`¿.Ü#Èü×—<èéîÀÛ÷ëïÁ¯Þëú3óÙgÑŸLàs`Ðù˜{µõY™×¾» —žlük¾}?€%®6¸ô4V‰ýFIÏ@ø³ÀiÀ_÷ôôØF(üs2ŀТ˜ö{w¾å± ¼œ=x´#>ä?fÀ_»©Òþ–½h—{þét¨gªq·~@÷üûa„ÃÁC2à2cQüÏMèj&Ë=öÄø€küWY‰'žxßüæ70C0Xµj•/ã?M;ä)²æí~§ÀÛïü>3yÐòb² ÍOáÿbx‹þE¦«º/&üù'P8þÁIË6ØÏBý~þy]4Šõ;wrýSÅL¥þ·¿(þœÇg*õ47ûð |¯³É/' >£Ö°c ¯<D¯óþü€àB€»ôA ò¯¿›{ {œ5lÔóc¯¾lL>£8ªšHeËÐÜ.ïú—Jý7qnsë«ÆQ¶!R©Û¤îûù÷æ+Ð÷ ëù÷Ç~¼ŸFn‚ ¨@gVªµír·45»gwŸÐßtÏîFQ³»»[êñ<"ÿ{'*R͢Ѩ9geáXc8æ¬|Xû·Ò×_äõzXTΚ0|2}rFÍ?þñ€… ¢£ƒ+ÕöÍÔõŽF£æÆøÅ'ô7ãc‰„~D£Qsϧ¦÷¬Áoo¸lñ¿ƒÇ;±Àìèléû<škV{Ć5«×àÖU·JïËñˆü·8Û3€?¥®ðý‹lüI…o&·®ºÂSô/¢?]á‹ ù{ÁÛ3Ÿ®ðÝàX¬[·ŽÌ‚ ‚ ‚ ‚ ‚ ‚ "DŽiÀSè_Lüï'‰åIdÖ{OòæÂ?ª€»Åÿ^†~Šÿ½ÿ^†~ (Š¹ÉšhÒ‚F‡Õ·I[Ÿšƒ«æ¿èYm}j&XEpŽfþGù|D´ˆïë“ Þ‹âÿ£™lS?…ÿ¢à.(”x~©Z~ÂéªïÞëæË¦ØÿvŸïÙ\~÷FÅ‚œŽ²›Øû›lÍÿ°#ζÅõÏëØ!=:CQSœ„¹k×.Áœ^ˆ"Ô)S¦T)-|âc]¹LZEß¡«1£b [¸˜7á^ü?æ«xL?~$þ¦z!ÿs©!×:–+ªCøäEÿOîë„n´xý鈱×ë«å ô͘Á^|€]—4âÐi{±yéÓ.,\È…ù’…˜å]@LþÀ×…å+¥„±×ÿ¡´™:ð°å kÿÿØ5žœ¼Øž±Ë0/„üý? NÁ¿—Г ÿeŠÿEÒi ™„-üϹ&ûwú0îqc矷€H2ñ¿Áâö~Í€òkÿLŠÁͦ\­ûjP¬Ê`PÕ ƒMjŽÇãÈårö{ñ¿_ìÝ»555¶ðpŠ¿žyæ_Ÿ»žèÂÜKbá?üÀ=wµb×þŒ?Üâ/C?ÄÿÇâK_È«~÷Ÿ9$ñ®ÔÿÏóïoQé–ñ ¯Þ‡é˜ùÍÓoê'­sÏÊ~äÇ?}˜7o9²ÙÞŸ0‡U`* (;åŸ-™ ÎÁf?òׂ§qˆÂÿˆp!2³€@Df`½> #ùÄd«³HÔ_¶×ø÷²Ë.Ãe—]†žž_LO8é‡p˜ ìË~Òü3ZÓ&àÿ%Ø(þ àÏÙ,>%¼ÿPËçß--@¶Ð”E\äÏ ¸€ßâÿÍ‹¿ì4>øP³ÿ¶}/ |ÏZöqú ÿ•»gb¿þæeæ`ç_³ù/[ÍÖíê•‹°eí¶‚öHf3ÒÓ™!€$øõgs¯rËx_^þÎ1÷*k\$Ó`?ò÷ùg ñx„¾ˆm2immEcccÁ=6ý·¶¶âñÇ÷'8س¬ÌùœqîÜü3Ï]»vù:þëס\­pÿmÁ?€\:ƒ~Ý¿€úï䮞©ÚA Š®EóÉÿú+ðê_=þ`ðóï?ÿó?ññ&5UUqøða[ü«W¯ ß X…u¿+¯s¤Ï¶Íeâÿ{ø!þ稉86g³¸þ9à?òÇßÖñ÷ßw5AÏêØ‘ó÷ÖŸ_ÿú,ŸÇ®{¯MœˆRh@ ðÙ¶5¾\ÿD±¿ªVˆÿàŽÃbpá¿Lláùƒ }}ÀŒ}TdqhßÔ,7ªq9vý•ið~Kôl¶åÇ›}mLðÏ9´!ƒCÝŒKÿ ‘8„L¦¢ðõ·~eŸÉÜ{‰¤½L|ûoJ•#®æ¯?3Þø‡¨øì›…Ê6 'îçËdŠÿÇ"ÑhÔüåö}@gMo- €|wln†ØÖà4 |‘ýì}B ˜øn~¢ðÿ•]Ÿ±_Wü<„Þ„Ãpâ~¾Ìñ?€ñ¿—!€_ââ/C?Äÿ@^äϼ üÿËûù2ÿAAAAAAD¸—€È´iÓÿ†in‡™ª+ƒÞY8ÁÜË ¹}À׉/¢øßË ÀŽ%öçËëÊý™£(Š™ÚÚƒ–>hø~ÚeÀ|Vöãóºy5h¿j¶¯&&D}ÚãS_p»ôØG3/€-òw¿D“ù•°ß|óÍaßs¦NêËùùЭøê7ï½Dù•s†ð’¼âC¬þñ·°ê»÷æûaõ!™hB:³Á¿À`"ÿšçu숫Êüät Jî$tEQÌM›Ø¹=cÆY˜1˜4 ˜7M>µŠpúRyÊMYYYàÔñªŒ­ïñ ô¦_EUòj[}Ñ›~•Ï;Ãj~Ò¥¦1An6ÍþVf%Öõ†‡ÀÕ¶\QñôÛ@FWPQÓ0ØD?..ýçy5ÀÀ޶ÍK‡ä'ÆvtpQþ/­ÿs»¼ã¡Ü}¾{nû×SO¬b’Š¢˜ûl>Ù©ãÉN_¹°Dwþtì12ˆÔäÿ®£Îd·³¿m5dÃ0"«ÅLÇ]]­(RÇÉH"ýïi85n:j5µ@øŸü‡$r;²@»Ü$¬(Šyx»98 ëÎHlÞ)L%8.ö?ã¦üë )--õý{åD™pá¿C4(--Euu5z|¬¶wo^â|‡v~‰fUUUöëiÓ˜+‘h s[ˆ•ÖEâq^¡ÛZ^ÌWþ¾ýÎïãöïÜáhó2ð Qüïe n²zÿgŠˆÌ]Ï üzþùä­·æ `ô|ÌAëñדڭ¸x?&·ø¿˜!€, È(PL£æøŸ?õ?Ö?êü£(ŠYWn@‹Ç‘I—!‘ÌaÎö™´(þj-#สƒ;±&´¼Àhû¢guds9,èÍáÏ*3›p¼nÍY&:.l×p}_çÍMD'b^ᯙÀmC€\Žå'ÆèŽEQL.æÊ‘ÓUÄÕ4fì/4­Œ˜óFy#€“Ù »»;‚»¢æÅ7¿á¹ÜËàÉ»>SM€0þ?>¼C‰—í¶[VÜâøL¶ée|‹|©DïÿgÎÊGN€Ù>‚=Ÿš’ox¼•^¼¼øsP½ ŽîîîÈ•÷GÍG¯ïö\îe påýQßÏ?Qüïeà7¢øßË À¸è_ÿ{™È¢»»;’H$ÌL¦ð> ð6H$§dî%‚ ‚ ‚ ‚ ‚ ‚ ˆ“a E1«ó• @\\Ì ¶¶\‘Ú]퀧)@!þ`‹ÿùo·!@~9¤›(ŠbžÛïñû/â‹ó˜Øé÷;_´—WÌË+0ë¶îñÅÀYyZóøÄ×¼dýÈÅ[ä‚÷G3Àñ?À„ý\ô?uêÔ‚åÕÕÕ¾sTÎÂC´Ú¯Çò¯.‰Y•wü ÿypxå™\ÿ¼Žû?£Ú“`ù{÷o?*2ñÛ_}}gÁšk“ŸtlÚ44ø;éÏïjÓ"‰ IÂ*3é×f"®êÈ$„Fk2n"ô¦+Ð,A§~R…þº^ô=þ»‘£eñ}{±yi ß·· Êôæ¥5ŽÏ0Ñ×ÃþF Ü%Fé_kÅÿ¥ôp/õgpnyÂýçy: X“_Û­ý±WØ/¥Ò»ï; ޏ!€(þO&Ù¤àÜùû_QÓH•[Ê1åj+ÞJâÈ–ü¤cSQ1åjÖ—Ã7P. ~Ò1ïÏ”«u Y~P.üç¢w·€9QQ³¡¡Áñÿ ÁˆÂS|ߨØ(µ"6öÞ&•••xóÍ7}©;÷’˜Cìï~ä…ÿAã·øß /CYÂ/Ö:–+ª-úw·O.¯¼×߉Ÿè-Òã+Šb^reÊü°_‹ÇÁ 77bAlš›¤çQð_î±¼L£ïÛȨLøç^"@¡‡4Dñ£—Ò«MŠ¢˜+V¬päþZ%ÀƱdɹ¢C8GUî÷@^øï§øŸ ÿƒû‹¨‘ˆ-¼_s>¥i˜®û{væ²e8ÐâÌ/g§Ó~{O°øË…f‹¿ÌªÒ¾¾ÆŸñ׃õíØ¯¿‡³0}˜ŽýzþFS­«œ¥NÆÕX„‹š/–žÿ¸ð?[u¼˜@_ò "Ð~0$Žv±º-ÊDÑg2®hBÀqßßï/Ò~·aàFIæ555ó%÷{ /ü÷cüUVVVðÞ=öä¿Äÿ"å&+å– `oöó%îp׿°™ñÏ|¢··UUUÇ–xO [¹¿··×n›2e dÁ…ÿ\üï6ðSüïÆKìß9è-’ò¿Åÿ€\a SqöÌ5±—/Èéx¿¥ ;²&Ð.o$¬(Šùlý­@xÍr]*µ.³ƒÂWg«*z6mBuƒœñ¿¢(f}ýðߥÿ§R ÄŒÕo²¹œe·Û4-âûCÉ¿Uã@»„ç¯×ÿ"õ®&ìÈê7€` ¼VS*îÏÆ¥bžá¯y¾ "ïtf™Ù§(úD±?lsPñëÐZM•h45»g{ E÷ìnD•*w ýýF½Ÿ(²EðÑhÔÜÓ½ø ®î${ò']¶)o ðÀ%Û¤šD£Q³»û{èþV'Ø÷¬ÅŸýÑèGÕ‡h4jnŒ_<¢¿Ý¿K€QoƒÇ^_tÿœ½¹¼¶ð^m’ˆF£æšÕkFô·kV¯Á­«n•zþ¹…þc… Åÿn‚ÿÃ/ñ¿·ÐŸ ‚ ‚ ‚ ‚½«Œ¾ IDAT ‚ ‚ ˆ±Ç°Ç‚Ot‹ƒxV)†aDšÛar±{by™õlÆ þòßÍí¾T_€iÁÿ´ŠÂJDÊ,^kô“PÝë-â6pÓÞ/§ 1ÿWÌ«Á¡{Âÿï3/~ºãgùöóoû=ðƒ/ú0ùK/²Â{þËà†QšÿÆ4°p4ó€¼)Ï9==„3›ÿFú1øæ›oÚ&^F\ü?mÚ4_ª¿òb *ç á•KðÊ‹LüÏŒ\ü¯Åãh—8ùŽÃÏï‡6vÙïþ‹Õ°ätìµ~×L.Œ> •ͯ.Ì7q"j}½¶6ù“OÝÿÝÂ@î¤o€‰øCxL?d™ õCžr÷+Ô äô™(‡¡ûsá¿øžÃ…ÿ~\JH‹_bóRfl²y©;¯ý\–È?‹ï»P0 þsñ¿(ºåñ¼ÌYFÆQkrí„83ðZæ‰dá¿a‘´%: €Û¬L>Ã…@«9×]>¹— ÿ¹!@­¦"¾@CnG9k.p~R°¼¢(fï× D ¦¢:„ÿ\ô0~Ä`ïßúšå×òóÏ7oý”ýÌx@ìË‘-¬Ó0òIÏÅpgí±®ˆWN”aN~pôWÃæ¯eãe‚ÀΜh´p‘7þó÷^¢^ þ‰G¥wWÍÑ!ø¿jþ‹ŸͰd`FD¹H1¬=þÉïÓ.’ŸƒÖÞ‚·õ†ËÄk"´atÕxE1§œ~%v=Ñ…¹—Ä& bÄØõæž»ZqÏ]ìº4åô+¡(JÏ?åú­þž3œ6_ È›xãéÉ'Óý€n ½Ä¢8²Í”WYQ³±±ÑÎm¢qîܹöëÇÜ~-ÛüD¼Û,v÷É©\ˆ Â'7Ç#ü¯ÒfŽJôS Ý4má¿hÿÛÿUh“·ÿED±ÿ™Ë–álk`$öã jåúÀ…ÿ\ü/Žõû¬p3êQ¦<Š¢˜›ŒM@ff¢Ôþs±ýŒôtÀ–µÛ [Ç\*’B³Ò,5ÿqá¿ZW½½Ùê,´vô%ÚŸ3¥Rן³À~—Àyg‘ è£þÇN“ýÿýVœKOþë¯yñõ¥§±û™bl.öçÂñ=§˜!Êh1 #²jÕ*óD «V­òål¹ËdÅε>cF¤Mi3ëÖp^ëÜ4›Í¾=~¼Íô)²(ì® ÿ pŠpù{Ñø’4Iãö;¿Û¿sZ^dÂK¾ÿ¯^¹[ÖnÔ–&€f_â/†Sð¿Øã3Óùý¿9Xýóç± rα l#V[üoQ*<ðûXRµ¿eùKZÇ_¬ØÏÖߊ϶­ñM|¯ªÐõCP=ò?&ÝÇëh0 #¢@1ç= ZS˜úë—š2Y ¡å\ï‡û,þ@2¬­öþ쉰÷½¼Àÿr€ÚÂÌDc€ë‘Ãõî·>'ëù—a‘æffÀ›HB&Ãö«¸5í⤑{†å…†¹÷ßÉ$NžW^ÞçÉHúbzÜTY¿{åýËîîîßüàÞ‰Šmàþýä]Ÿµõôùç>õò1>yüpñº:dOÒ!üOW[‡;œ†{°³£³G-çâÿ<Çó½3 èîþ:¢Ñó¤ŠÐ…yF yKÎ5¸ràçx¥ìïQ9ðsàñNÖè£è´(Õ,ï=òÌ2º»»#WÞ5½ž™l?p¶màþ}åýQ_Ï¿?¥®pþ/\ø™=s¬çÂï¾#=þ­«®pþs» ?Ÿ[Ø&ƒÔg®p þ«<>Ô+7fwww$‘H˜™ ûþmݺu¶€ûw"‘5÷AAAAAAÄxç¸ ¦M›æ¨.Îß{U÷ª*Ý5óEÕ„‰P2JކioW̺ºR[üïþçEÿŒææIŸÊEþ^bÞžÍåPçUžr„pñ?Gõin ŠþÅeP·uÚ¯š-yž—ô-ú/ýÀûz~æÁ„ħ1I}ï&w“%²æžPLd'pø‰—ð`¢{¿áÂ?+”Þñ3¾a‘fÀ|®Ï(*ü` ÿ÷¾,®’g¾!V *VmJ$™d“UU~*.*u‹\ý˜ðÍyLXgnÀ¹B˜€[•áŽå¾¼Àßë3°–½™B|Oá?ü‰%p4<+Šˆ#>¥C/á?à¯àÈ0ŒÈÚvÅ\YgØÂÿœ®¢ÖÚä¹Y&úŸ”´—W_#/ÿô~-Ÿ".0â@ĪÌwÆMÌ ÀHJ3|™„Ï…ÿ\ôÏlC‚fŸ.Àná¿_¢N<Gκމ¯ù8[lóªÎ* /á?àèŸcFDQµEà@¡ðŸ‹þ9O<*O„eFDi«6÷Õ÷Øâ·ðß-úo¿jv("° q_Ed™à(ŠbSS¸à}¶ßùþç¸ß;Ž‹I1(’E°^ÂÀGÑ¿›b.>‰þÝ«zì%„”ÿsÜyMýsb±Ž9‚Õ«WcÕªU£Þÿlü¯˜©2£èݧ[ˆzy»üûÿᨲƻ~ã)ü‡ º÷Ã0"׿ƒeeÎøÜÉ#þ‚6™ãï<^ÂÀýû€¢(f*’²Åö\ôäùXëüµ®‘Ì 6a9•Eôöv[øÏ1þ' .ºw·y![½ä4`£`6p©õ~?Øý¾Ø/Ùâkÿ™ÕÕ՞ PôßÚÚzJŽ?‚þÃ}½«-\ }‡_¢ÿcQì¹Oy¹Ä‡Ð¸…ÿ<~HŸ  pÿHŸí<$bF¤¹­ÍLÕ×Ûâ·ðºê—U7Ëó矩òr§è_0`|¿¥ zVǂִæ¤>ÿÅÿnþâ!Š´.MOj·ââ5þ˜ðç°^Ïc5M®øß ·ð_çß·=&ÙùÁ½‰…÷jœ‰üÓ‰ü25nUžlS¨Ñ`Fd±¢˜›[s¶ð–ÈÿzäÔ»Ø1xa»†føcοrH$!ç2 Í=“ô- C]Ü@ØÎb?øó@Ÿ…yÒl¸{'æ×1Š·‚ îâ·'ÛÄâ?€møX€_(þ˜¸ÿ—®÷Åéî~.pY☠¾ýDzð_D¦øÿxØ~àl_ÿwwwä»Ñ¨ùãîn[üïþÛ¢‹¯¿ûŽ41zwwwdöœ¨¹çÅn[üïþ»Eÿ³çÈ1BèîîŽD5»gwçÅÿU®õ:ßF÷øk ²nݺ ÂAAAAAAq5PŬ®få;ÜB±Ú¸\ ÔÐЀM›6I™„eF¤¹fª®Ìžˆ–Xžt˜\ÓÜîÛÄW·èöu.êÜìhÛ^»2Ëÿ‰ë-"d]³‘ÚûG?OÿsÁ?‡¿>VµÓM==h¨®–4 ¯Pd:!ñiÍ|àjûˆôêGL„v•¹Oï±ÛŽf^p.NOáÝäx?1ÀPÄ_^"»ššßÍ68nÑ?$MÒ+>Õø\øÏ+^ÕLö Ë÷²ÂŒ¨ñ¨H1Üâ _yJ|_È!{‚tOP]-ÇÀKäZUU…þ~§À^ÖäoQx•È™3à¢&øÄþúLGŠˆ«º4!4à-x¼xV-Þëït´M.¯úGŸ€XιÝ4ŒÛíLàÏ'à}Lì/Âߟ+7ˆþ‹Å—cÆbW=Ó¬sÀ«Â±¦ˆÒ9¦¢B‘<>­(æ*¡û¼ˆSìs£"¿ò6§VS‘Óa ÿ ¾@³EÿöïIIüý‰âÿ{Á…øNt[ˆøj@¹HNþ1G¶À1ŸYÿû[ôÕÕÕ¾‰íE18…¯âkÞ§Gÿx®–%‚c‰TVVŒ?¼>'·è(þ¬*üÊïýÀ÷¿9-/8ÇŸË>ýéÅ¿ È(+óðvGþùkŸò¹ÂÏN»HNoDÄëàpBÿÉåµXÔ¿zÄ}q‹ÿ½8–Ä‚Ø&47ËÁzjÎAކ㛗‡Ë@¤0 =ø#ùN2/D–Œ[ü°|ÛÓÓãxï&nܸK–,‘²ÿ½,ŽbÉöe?éh›¥½´ÌãÓò©JÎ,hù¤Åw‹þàµd³ÁT=ÞøjÐ&¿ü±W®ûä­šoñ¹øŸÃMÄóÍ-ÄyAþvõI\Ô|±œãß#ÖŒôtì×ßí¿öÄ0ŒÈja¼ÍEönÑ1ñsÍdà¼#¿*Bl~oÏMÄ÷¯šÅûô\Ÿó9ã_·è.»ì2G>ŠçÄÑ`FdݺuæêÕ«100àixäÈÀªU«|¹òýWi‹Þì#mh—þ³ñP›ãœt‹¾¿:P¨ñÂ¥§åEÙ†Yµj•¹zõjG»(ú?÷Üs=M€öÝÀ¾ðiÛÃ-ú€øi`B¡ÒÔ3Utfâÿ«W.²M8g&_|ð€p‹þ`z"è® ¾ªÃѯ[ô/">ƒ•ùüs8ñ?û£gÓ&T7Œlü?Öž¿òçaåW¸îÇDñ³<ã#Ã0"íPÌD’mƒLHhLx®ZB÷ZMtÝ¢‹Ï§â ÕÕòž‡ÕLî·Äþ?yPïjÂý–àÿBhx:›E6—ÂÞP%÷ø7 #Òܬ˜›6±<$~ÝæýËZg‡ñ§€øÐñüÏͤ$ª?6â¾D£Lt:"ªØ¯îªnD•"þîîîŽà®¨yñÍoà[²m" ÿ úooI¾F£QsÎÊGŽýA¦Ï?‡ý~ø9àË#¿‹â.øçð×\ì_Œ_îÙƒ¯Ïž-Q€ÿKKô/ƒh4jnŒ_<¢¿5Ï`c´.IÊö|j ð)§ðÿ•]ŸAåÜçGú/‹h4j®Y½fD«T³óâW¿ú®»î:içß•÷GÍG¯ïÆEg¾ Pøÿƒöù*~VU…ª\ü¯Úª8ÙÒ†a‘_o„™JýÅÑ®t²o„™èŸñäWYI‹áýû‰(þ?–è`"(ù K¹øBÂx…Í|€ ‰O;ÚÞ×àLRßÒšÙ¾ u2°—Ù†(¾óKxÇÑ<ÊÛˆ?ÅóíòÏÃ0ãó*X›{ó“ñĉ×â¤×óf°É7~œÿº~È1éÔkR4àOE4¯jo\üïWÅ7n éå¸B}5W›‰*²Åÿ\UäUA·û¡´™¿…³Ô'ÿO.ÏO[ÔÏ&ÌËØÿÞ&¿D^ŽößWb™8‘oDâ5Û:o6à¶ €kl„§BAüï£Ëÿ‹ˆb.þ÷»£a‘†f˜=ºùï[ë?)?1´z1ÿû5þ·sPâû cyáe€"Šñ½–ËÂL'D±¿³ØkYxéùøÃï±ËƒÍæ%W¦<—/ˆåsSs33Myü†Á¾hÖmÝãhçâq¼Û` ðü:ÿ¼DÿpéÇØEÿYÈ3¤à&©·×½bÂ÷uPÆú{?p¼ çñ ¯3ŠKß|ý‹xœb¢ø?âs'ÜUo ‹"bdŸŠNöôô8®AU 6 #ÒÅ|¼Îyÿ¿ÏZýYÚëvÛ9ÍUäŸÿUÂX׆_}ý‹T ƒˆâ÷5aÿKà†©ÌõÎ<Ä㋱/^ÃD²·ÿŒzFø~ÂM8\èïæ,U’ SÀ+–(þwÄ”´û¹ À݆sÜë5Þv OG#þw³Óçï‡Sô?œù€L È´µµ¢pñ¿˜W­ZÀ¿ñGeeeAÛ‘#GPUU%;Ô1áâÿ*ío‹éUéýÌ$Dù!üæxkÅžAÉ‚›Ü}÷ÝŽv~}Åÿîç“2Åÿ@±gZ‚øÿ¨(„•¿#¼öû+¤½ÿ}Â0ŒÈ‚¶6³'å×pñ¿ðì«úùƒ/» »õüóýf¼º •}qý/¬ï"&ûûü8¶èÎö«È Ìç¯Qðo·-ammÍòÇ]í°Dèz^øŸÌ¹ ý³ßñ„ëù«Dñ¿a‘óÅü­%öÿï»Lè–€šR¡gu\ÿ‹¼,®ò÷ø+ºoíü#/÷p€M®óÞ~Öý¾°Í'9PF#þ?nª|ýEÿ`Ö²Ü<ÿh_¸Ð?Dñÿ±DÿP’‘×·/Ý[ëjÉÇÿÝ·‚Ûn¸Ð?hDñÿ+»>“_ðÉöƒ ýƒÄ-ú€™×>À^´Ž‘dÑÝ݉G£æ/Oÿ¨£ÝKüÿõwß`™˜H¥wwwG¾þõ¨¹çE§)Êý`|&úgp¾¬øÝÝÝ‘( Y¸øÿÿË¿Ø"nÑ?lýÁ—³¯ 6÷AAAAAAQHÑ/E1«««ûÜBŸbBÿ7ß|uvvJ›ˆÂ…Õ=~ñ_ýUçÄÙ“_xl¸ø¡º‚å\øï…Œ¾(ŠbÖ•_‘ÚûåM¼R¥@ô$RLèÏ…QíWÉ¡æõ¬/à þgµå'CË<Äý õßËÏlþ›¢+sÔ×{)m ÙçÞƒ©ÂcŸsMsá9pªÅXe?7|â«£©@5Ü„Ób“¹7H6[ææI;þøDðb+^õ#{Û)àžíÇþßV¾ª`9þ{1Ú>äóßV×’s‘78×úìl©±½ûà-øwÇ–ŸÇvW¤÷ª@¯4÷Kïî‡hÂY\åÏqçŽ =›¯(XÎ…ÿ^Œ4ÿô~Í•àÿÈUšƒ¢° èÇbÚEùýàǾwWÄáâ+‘ÑT mhhpŒ¹ÝÂþbBnL000€ÖÖV©ç »O"­­­m~äßTjSÁr.ü÷BæúÀ&WÕ] /ü÷;þg»Š›;<+ÿËŒí6Àÿ÷up4ñE1©ù{=·à¿˜ÐGæ>ñh³ôã/iEÿ«•Â1 ìøîk HÕ¯ý¿É(<÷8 Já98šüרØ8¬à¿Ø8”S9rDZEjñü9Õ[°œ ÿ½ß£o«¾&?þñãú÷ä­Å«òrñ½ˆùß«^±eõÇæà þÅ~Œ6÷¥"©aÿÅ„þ\˜É ¢AizüoO=Yô35Vì”Û=îö=»ïÃG“V†ÃðË-Â.&ºæÂìWMàFEÎó8ñø÷ƒz=9²ÏÁ7,[²d‰/1Ÿ܀e8Áµ ‚õëÌëpû~ÅözöÄñz%óØsïw/SRñù¬øbz^*.ú«>·P|+sý*cãþáÿâqà×1P`ˆâÂ_î¿êØ=ˆ-ü‡üçŸ<æpãbBÿ×töœââ5kF{,=å}€ÔîÂs ù|ÿ¾ÿr?«:rºZ ú‡Ìó×T]²¹~òi?¢ÑBÁé‰ þõ,’Z:š°çWÿX°Ì-@mÌh4jÎYùˆ£íDÿûÿéË£^ÿh4j>pɶ¢Ë‹ ý‡L¤ÿ':þHÿÖ͉ô#šãÎ1Õ‰ þoßÿm)Û{½ˆÛ$€+<„ÿ2Ž¿5«÷´'*ø¿í¶Û|9ÿ2™LÁ²DÂ)þ÷£¼x,º€¼ðß ýã×>XèÄÊÅ÷~Ä3¶?ˆÜKAAAAAAÄÈö‹:qÒÍhñc"PqG[v?Ž'þXY_7²&á‡{¬ôâ¯øtþ­>Püñ$}+×cÊ?£gPüà÷ÿX8ÿFÛÚÿr8×<Ç?Æ”FßÑVéßʈ/£/ã9ÿ†_fèøÛ?ìø'ûþûÞWVFÓ“}û4¶Œ>œìÇÿÉÿdßþ$‚ß÷2û1^ãÓõwäñÃÞö£íCØñGÓÊ?§Îõo$ñeô#hñ·Ì¾„-ü•Õ±Ð}IÆÂº´§Êñ7Ò¾ø!ÉöÙ0ãŸL±É€ ‚ ‚ ‚ ‚ ‚ ‚ ‚#ðÊdãuÔÉn r2îÿ°ã‡}üÉîÅ¿“àÃŽ?š>œ û$ñe÷ƒâŸ\ûŸò¼ø£é­?aÄ—Ý:þÇïö;þɸÿO¥ëïhúp*lÿ‘Ä—ÙÚÿ´ýO¶ã?ìø²ûAë?~㟌çØñO¥ñOØñGÒ‡ñžÂ^ÿ°ãËìGØ•¨GÒ‡°Å¿²û1ú0Ò¾œÌ•ÐÃ4mdöc,ÁÃîÃÉ”ƒN•ØAAAAAAA'ðÉPaM„ñK€vü°9YöØñÃ>þüêÅ¿û?ìJL#éíÿñ¹ýÃŽöþ;¾ý üCñO–ã?ìø~õƒâS|Š|܉íg?Æóö?‘ø~õƒâSü0âžlñýê­ÿøO×_:þO–øã}û‡½þaÇ÷«a‹A7¾_"԰׬ôáxúr*­ûXÙæa÷#ìóo,ô!Ìøã56AAAAAAA…6'|±øA‰ïÃŽ6aïÿáú0ž¿ ú@ñÇïþ?ÖDDÚÿþ3V×¼Ç{ÿ‡?ˆ>Pþ¡øcõø;~P} øŸâ­Øc¥§úö }«ÛŸâã?ìøa÷!ìõ«ÇßxˆO×_:þÇjüñ¾ýÃ^ÿ°ãÕ‡ ÅßÇ?(jØë?Vúa­ûXÙæa÷#ìóo,ô!Ìøã56AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1¦ˆ„Ý‚ ‚ ˆ°iRaò×ôàÇGã=~<žŸË¿õïñ “ˆÛ}Hdr÷aaI‰¿ch(ø} ÄßBüD<2¹`ûzüóKLLð¡w°ñçºÖ×xÛþaÇyÿ‹ù>Šù>6¹â‡‘Eøñôq8fâŸoÅø<àœoÅßR|žÆíþ9>χaŒ|> c,äóaPypÖ¬YvþÝ·o_¨ãÏ0޹°ã‡}ÿöøÃMÐçØ÷a¿ÜÿB?ÿ2‰üù—ÈŒ»üv|ÊN(ÿßü„7î&‚ ‚ ‚ ‚ ‚ ‚ ‚ N&†Ý‚ ‚ ˆ0iRajñ¸Ð’3ƒA…øåºó}ñãq˜šæh2ƒ4hRaªqGSàÛ¿ôòù÷X7®ö?À&;kÂAÌ '`/,)1kb°Å¿x®Ä rrSI‰YÛ(4´–˜A `ñSÓb®Ö.3¨IÈ¡Ç?¿Ä,}®°-(ñëÜx‰Y«¹[KÌ LØö/Œäþÿø¥ßv¶á'ãfÿ»ól\XRbÖœˆAæÀ‚üžEñsÙ²Fd³Y™‡ÆLüóKÌÚ瀗ìyÀ9ÿüóÆlJÌ Mñ³¥5‚ÖAæA1þx>þ2‰¸Ùظ ]]ÙÀǂˇ_kŒ!ûTWàcA€åæ–º²]äÁY³f™7Üpƒýþž{î1ƒ4HÄKÌÒ.çû ¹D¼Ä„pùM|·}ÿöøÃ«?Ažÿ KJ̯] 4<ì9_?„>¸ûÓÖ´vÓD¼ÄlêÚ™oˆÏ öüË$ÌXL8ÿ20ƒ4(¼ÿ >ÿ•ÖÝ’Qþgù/Ìç_aßzõ'Èñ_AþÏAAAÄÉÁ¢E‹Lضm[ðæ‘scÌ,zWWh÷«a®?ò6ˆmgæ]¯Øoaf¡¹eÁ?¯ 36Åg¼Üø Îi}#ð>„›â3ê?ÊÌcÛÞ þyq˜±)>cw„p;ß ¾x[˜±)>£¥ºÅ€e=ËBéÃxO'%aw€ B&éDÖL'²æ±?)9nSÜL7Åˉ§ãf<^ü•€¹-þøCó‡?üahñ·æ¶׿ 0›BŒØvÓ~Í€Ù<Âõçâ{US¡jªì®ñËuà°Ÿ áâU­€ªVŸ‹ÿ5ý„¿ôòˆÇãˆÇãÇþ⇹ÿüäëXŒý Ÿ|¬i1hócÛ£qñkL‹!V ‚÷Q|¯i²Ù.d³]U =¾ þ>Ààyì' ñ¿¦Yö†ø®ÆD·ÙlpèDñÿüùóñöýoda< IDATÿ×OÆÍþÅ'±˜†l6‹l6håG.¾Ð´ö>ì}.¸Ê‡¢ø?¦ÅÐÙ t¶Wùš ¼Ðƒ”@ÃÅÿ hhh<>ÿŸ öF|há݆}ÿöø#l¸ø¾±–ý„`ñý û »vPpñëy-³p^ˬÀãsñ¿ª±Ÿ á÷_s­Ÿ0â—ÖÝMÓàÁå¿p ûùWØ÷Ÿa#ŠÿÏk™… ±yØ›Øó‚ ‚ ‚ âäcé7—ÚBø ™«æEðañøÕ›B[PK&„¶ N_GXó0ÃŒíŠ?.×Z“­¶}<ÅvÅ—ë5Z¥-FO±]ñÇåúÀW–œo‹ÑÇSlWüq¹þ°#®ÚbôñÛ\®?\Xš´…ð!Ç¥a¯?Aœ,A§ZRE&‰åI„iКhE˜&Ÿ3+~,C˜&_ÜD˜&¨Óàôåj¨@WšÌ`¤¯.`C"US¡ÅãhRƒÝ–aÇŸgM5<@¹ŽÀã×}êï0#McÆAÆW-ïMÔxðë¯ZˆÇã(½|ŸÛÿ0xÅbl"z&ìõŒO×´jÎc“oiÿcZ µLh|MCKK+2¹¡H“ÃŽ.€NKøtÅk€åžõ-Lø”ø_d®lhAhÛþüùho¾nÜîÿXLCkk ™\$ ñ‰¦ÅðëÖ.t EÂ_Ä´6,놡¡‰ÿ‰ÐɆÝ‚Žòòr@CCn¸áÌš5+Ðñç\Ë@ý\¥]–0?@b1æB£i´àã‡}ÿöø#tÙ Xc-ðµ ‚¿ÿk¬ê[Úø+l&k¯`"ئ®ŸoVTKŒžÉ$‚}¤±]>×2" zý¹¥¦i(­»…òß8#ôç_!߆Íy-³psˌОAAAcŸE‹™K¿¹÷ýì>lÛ¶-Ð{ÇÄܘ9Wvé@fWW(÷­‹-2·nÝŠË·4¾þÛjÉèCGƒß±íæéËâx·%|ú0c{Ç_ëV¾5ÙŠÆtcàUèÃŒ]$þ¸Z€U ¯Ñ*±7ûJàUèÃŒ]$þ¸Z€U ÿÊ’óñÛ»¯Bfì"ñÇÕú¬ýޏŠ9=ð*ôaÆ.\­?´T·˜–&ñô`Ëz–Þøö!ìõ'ˆ“ 2 â”!ÈšZRE6­#™Ñ¤›âfby™õi$7„ð$7[­hÌ4"— >þJÀü<€?XôÃ7÷Üsyùå—ã•W^Á÷¾÷½ÀãoÌ/îNâ÷ç§±(„õoÌ T$ cCñÛnž¾\Å»ëõP€6æJXR£XÿÌ¿wÊìÖIÿ}ÓÖnþQ¨ñÓéPÃcÆ ¡Æ{ÿ@ï¦TxÁ'--­áÅÐÚÚjüCnÅ£‹¼&Æ´ÿ ‚pB5^‚‹L&jüß„k ŽÖÖpÇÿ¡ÞÿhM†{ÿ5Þѵ£¡ÆùåM¡Æo ¹xAØùŸò_ˆŒç_AAAAÇâ£é¿†Ý‚ ‚ ‚ ‚SÐ4w‚ ⤦¬¬ Ó¦MCYYYØ]!NB6èˆ9ÇÌ[U³ÊÁ#g²åÁÇ×#94Ä_ ¦¼xÙj;ÀËVx¿ãçrˆ\ùq ªüµi-÷ kýÛ_Ë ¿ÙþMXg@+°Jl9¬@Öòû™\$ãÚ±Û Àô»[ÇÐP]Vµ³™D›Ð‹_ú\(áq¾þüpâç·?«È»+¬(/ôýr|^õWÓÂq_àUokγ~RÞdům .æ¾}û"÷Üsã@oh`Õ˜ï¹çsß¾}¾æßLn(»—, ö¹ÖëD¼Äôûú›É EÖ˜'kµi{€ÿñ‡»ÿ)©ë2‡®?ã0ÎÿŽ¡¡žqŽ9k­Ïøÿ'òµ XÌ‚þDAþ €Ln(‚ø<š–íÀªa7-Û Äçùþ%2‘LÆyÌ«Öñ—ÉÀL$2¾ç÷=×\ûð*ÿýÈÊ·`ç_· …šÿÚÓf&1‘òŸ„ýüK$ìûÏÐÇ],ç‰mA> ‚ ‚ ‚ Æ.‹-2—~s)îûÙ}ضm[ ÷Љ¹1s® ìÒ|å{‹E‹™[·nÅUW]øúl¨%  ~„Y>ÌØ@¸èÃŒMñaV 36Åg„Y>ÌØŸfú0cS|FKu‹yaiO¦±¬gYà}ïñ âd„ ‚8%H'²¦–T‘MëHf´À馸™XžDf}É !<€HÇÍÖD+3È%ƒ¿0?àÖ†P}þž{î1«ªªÐÞÞŽn¸!ðøÛó‹»“øýùi, aý›3 èØB|Ķ›§/Wñîz=” Í€¹ÒÖF€Ô(Ö?/rÎ ñƒ7ÈÇ×#9dÕ84cÀÏÝ&Õ‚롘‚@ܯÀ” €H&tšµµÿE#€x<Ž#ƒqqü…½ÿü$kqòuà&€0ù¸+x¢@Ð&Ùlš¦9&Ÿg³YàÃ.Ów¾?fÅŸÈãOìòW„`Ý ¿&<ƒPô%0Ql0ëÏ„gâÜÿl8úa‰¹;€ø»²Lx2Ws¶áÃ`Öÿ©§žÂüùóù¿r´%ð“q±ÿ»º²ˆÅ4;ïñ¶ òd³,çi‚ø:ûTp"®,ËyÂê£+\þKÄKÌeËTÞŽµøç—˜µ! ÿ&þ¿ñÆðâ'â%f“Àÿë!ˆÿÇóñ—IÄÍÆÆe¡Å_XRb~­Ñe|ð¡÷gý ©¤Älj Çx‹üE#€ M€¼ÅK]ìZlZ†TAˆ`&ø˜øŸÃ‚‰_ôþç­È$â\ÿÄyþÛãA|´ @k'‹iÇµÚ‚Š¿°¤Äl )ýÛç—`´ Àÿ¼-x@4h\Z.@°ù/o iCΓò_„ýü ÿþ3ìñßsËöá¼–Y¸ }Ž6œ?/çAAA1Öùhú¯¸<ìNAAAÄ㘥¥¥öDŒÁÁÁÀ¿|¦øáÆ_¸p¡¿££ƒâÌô%7Ùñnüi(âbþ:q1Aƒô÷÷c`` ì®§n!~&bü&ÀÔCBm‚nêÁÇWa†!whÔp¤ÓÀPĘˆñ›°Î<2ïøöÿP<Ž{"x&€{"tð“ FÁ˜°Éý]¦¦Å˜à^À6ðQ„\ñ}!drC‘Äù%fésLð-r.€—žóW¾ËªY«1Á¿ˆ&T‚ôË€W Ô4Kð/0æ˜è_%JVò'æÇ/ý6žzê)DzùóçcðmE(ǵÿ}¬DÌ+`jš†®.ç"ÿu Eð\‰Ysaˆ¢‡ ò߆¡¡ZKÌÚFKð/† ŠHùg,Å#ÿ‰„‘ÿDv@Øe‰ÿçÖÔÿJ¼@øû¿hü€L€ÂÈ"Ù§œù'èñ_ØùÏm¤ à40µXàÇ¿Ó øøü/©ë2ñ‰VĪbX–êBI]‰9tí©9þ ;¾Û ±È…¯çÇÐPÏ”˜_»Àü _$ìø¢@Ó²˜Ð²Z6:Ph¤ à2h¹ Äü÷#sp0¼ü—О61±L€ìDB‹˜™ÄDÊ>ãõü«õÊ.,ü‘Ïùo˜ûO¿ã‹xÿüŽŸÉ EŸg6uíd‚;ÿùm‚I‹-²¿ÿ£ªæxöü呈½iRÞ!%ìóo¼Ç§üCŒgÂ>ÿÆ{|Ê?ÇÇ¢E‹Ì¥ß\Šû~v_àû)17fÎU]:‚¯|oÁ×?kå8MÌ™jÉèCGßlÝྟ5`[WûþbWÈt¿ïÃ\w€ï÷› §†²þÛÊóÕ¸íªÛÛl¸Äܘ97;„–ôRäB8÷Ã\wÀÚÿ"¡­?À¶ÁON¯†±¥Û¶éïÿ6ÿš>ŠÌ®7BÙÿa­;ÀÖ¿c×ü«ÎúÖ9P]­==h{'ØcP¼ö·½üsé0×®ûúÑPÖ`Û S] £§É€+Ð'æÆÌí*°K?xl ÜuØúï°Æ}aÄç}0Õ´è-Èô„s ~®úylé¹ ÛráŒÁ"%Ð2ÎúÄÉÊ1 à駟ƃ>ˆuëXeÒ …èÏýë¿bb6‹9¿ùM(ñßZ9ˆ£9 ´­4”ø«W¯FWW~ÒúÿâÚÿ-ÿø°ðM x!ü5ÕÐ4`%†ÿ»ø³ª Éÿäí7bÅŸŽâ)K ôƒÐŒ d2@ò ŒM#€… šS.{ ÿôO+Ý? .4§\Þˆº­èèþÄÂ… ÍÆ)XQ·¹âÅãøq.ŠAF"7?Ñû6?ô2¹ÅãæŸU ù÷È„p^$âqSU¤nbCâh7Ó—ÜdÞ÷A,}àŸðnWð_д4ÁÔ4 R’·?;‡cÀã7¦nêP5z$‡¦€DèvüLÛ À›ˆ«qºýÅãïåÒ…hºÀ÷ÿP0ab‰¹Ë×íï_æ "\¿MÜíƒo3ÊË¥uHàG¡ìÿëZ-a¬Ç¿˜ïÜiP¸$˜ü—Ïw…ñƒÁä ëJ5\|¿ó`ç;÷APù˜À¿ð"ÿEr`@ù/ß{ÿûÿŽ€ï"¤b90¨ñŸw nüçƒË"ûöí‹„e8Å E¨c!þеC‘L"n.KuáÃ7ZÐ5˜E6‘õíø?žñGI]—o&Ãõ!¨ø"\”Ÿ=Œ çn*~±>_„‹bµlð"t€„e„ŸBŸ˜É$âf v¢Åüº…–ˆ‡šÿÚÓ¾™ ׇ â‹ð±Pë•]ˆÃn ÆÀÝTüb}*>Ïwîö°ò|ô§0ßi°%œï})~¸ñÿð…mx§-/ Z`3Þã¿5ÿ§x§-/† zþÇÿ¾ËÄ;mÀò­L ´îô–wÍw[r@×E¡ÿ?Üø_½ ï¶ä°hB9ÿÆ{ü#Ÿ_‹w[r˜¾$œùg?_ÿÞýÿÙ{ûà8®óÜó9C®âël„†¨½V… >œÚÒU ƒîF('¾1(€`bfC+!F¶¸2W ¦Ð’ªbkšÊ½Î‡È#WI21Óƒ+;T¢m®×¦Y‚¹VâHènX’ª"áƒ`d¯Å ¹6qqÎþÑsƒ!(‚äÌ9Cöû«B3ÎÓÝï9o>ï›ôÐ7ù)%ù'eü“ž‹{=àOújõç§?Å'=P´ÿ»þŸþÓß㓞‹MŠŽ¢º¬?SsüC¬Œ÷þðñ;U/!Š{¸yÿåRüC Å?ÜPüà Å_=‚¸ñXQ€‘‘ÀÐÐúúú i—iB_ïF•H$088(]ÿ¢üÛÙÙ‰ÑÑQéúÙìÒn²õ¿ûåèºÏóÐÞÞÎeš}Åsªôß6 ¥ú‰—/ûÏkñôëï`íƒq™AmûÀžøØ—>˜P«°Aò‰Ï½­z*F5<î2Ž¡Ã€Š"zz€T*Зÿ)­=8þ@Bz€âñ?“ö¤Æ "jŠ”"Ïp9}Y8ff¥‹,ó½Ö=.·ÀR.~á¸7ŸþÌàu¥:a/¿]óP{ä¨t€KßÍò)­#o‚~¼²E–‹¿áŽã&Üá,,½rë¿\^“™ÿ–Íkóß²yMbþ–«åš –Ó—•ÿ€ @ñk™ùEŠ‘—ÿ€år€¼ü·¬þjyùoYý¢ý¥ópi”}üwIn“|üwIn“œÿŠ¡"jõ-Ûc‘ŽÏúŽü?n†]AîrË [¿˜Òó?sU˜¬° ¶‰úË.ƒdýbJç_Ëp Ð7P€å?Ëd< GŠ þŠùqµùO‚~1c¹k?á§Ï"éGáÜ-¡J 2õ—[™úWºþ&;ÿýëKÀG7ÿ p&tÒ¯ýã/Ç–ÜlÙ²…Ë4‘~ ÿÎKOcí/=&ýù¡?޾ï1ô1Æešàþ-éá?õêø·äßs&tÒ¯ýãÉ=Ørç>éóôýw’ÀÚ»^ž„þPòeôM~Jzþù¤çâGº3žËU˜ÐI¿:ôÿüûÇñ•ÏÈßÿ“~ ÿÒßàû>DCC€ €L|ßgÿ[&ƒ¿ª«­¯½¤!Æb‚"²õ3™ 2™ŒT]ÁØØËlø2¦úŽLð²õû3íxa*¡L?£i˜ºï>%úï<ÿ4ûÇ“CøÕÿ÷Û‚"2IÌé9ΠöÄ謹ÚÛÛyww7†‡‡¥v¡W¥[Mú¢(† }K×¹a® Øžœ‡áH‘µ>Æmߌ‹/¿.½*3$ãঠ8Л®ÜÁ´ æx\Ç…a0uqcù.Q•Òç.`º,#®Dÿ]˜BPà¶|Yúžæ8€Ç‚"¦ èºÜõw½Àü¿wÀÐå®Úó0Ïóð@“¯$þŽça¤'­$þ@ð@´ã8Èfƒ‡ÀMÓ„méÒ–a,—cÓ¯Î?&ˆÆ»öÈòÚ+A:—cÃ@Ö L`­Ý@\¢¾íå˜ãd!LЦ…¥ËÕ‡˜N½f·|ý39æß ¼…À«åM°²ôϜɱüGÀA`‚½÷^à‰úAüá$G ‚,;þþÉpŸkò•Œ?ÇÉâo{‡ƒøgå®?å?Ê”ÿ(ÿ)Ëg(ÿ…9ÿå‹àèѣضmvíÚ…uëÖ…*ÿªÔÏÅrKÆ?LHÿ–í1SÆêÛ{]Eïî,"¹ó_¥¾˜ÿ˜È¢»x Yîü»¾˜{ã¸;¹ñì+r÷?–ͲY®ãÀ0MD£&lÛ MþQ®o­^šÿZ¸ôü—ÄAô²‡Ñk¬‚–ýAhôÇr9¶ñÀâñÏ©ÇåçŸ0ë+Íßû×—‚_¿uô[R¯û–ê*Õ]àâüøq¶%·eÑ9.S>ôúï<ÿ4[ûK-øÙÓRõ‡8g}ßc‹E~[þðGö×Ù¿%ƒ.,JòO‘¾’üS¤¯$ÿ(Ô?~ü8Ûrç¾Eü÷È”½þ;Ï?ÍÖÞõÂb€7ª?Ä9ë›üÔb€æ—¥êÀ=쓞 @Mþ)ÖW‘ŠõUä•úÇg_ùÌ–%&xÒ—Ç;Ï?Í6}þ±%Ed2Ä9[, ÷±b…¼¸÷ÏT/¡Š{¸yÿåª^B!ÿpCñ7õP âÆäŠ}}}…ßãñ84M“z%dpp°ð{gg§týÑÑÑÂïµµµÒõK‘­ïy^á÷XÃ<,]ÞÃ7¥ú þXèôŸ~ý%¯eÇ_úü’×É8] %ˆ°Ÿ{[õ"H¡ZŠ}fÈ7¡SàEœ‡iBY•ãOÄ¿+%¿@&0Õ&0å&€¼ VèC¶ “L°Ìq€ÓZLµ&XUãÏñÿ\R¾ ›òå?Ê”ÿ(ÿQþ£"á3Áª6Áçb9–ÜEölüKŽß-uþ©ÖËåØ “Àð€Vùó?ìú¶—céè¼Ö{«’iùóŠ(Ï*M𶵚™é Hº‘ä‡Ñ‹]Rój}qüÓ«emRc³¾Òü÷]°oíøà‘GUb‚üàU&ü-¹-€_ù•_Q¶þmmmJL€Â¿ý¿þVKTê2ëü'ÇC§/ЍB YLîÌþ:ûÖý€¢ü“ýu6¸ý¨3áo¹sEù'¿þÊòOÞ(Ê?EúJòb}Q@¢€@vþ¹‡ƒ½5¢îøçöâ_¨;þ¹‡ƒ}å3êŽÄú«Ê?¨É?Åú*æ¿j}Q@¢@áµìãŸËæðÀâúÿøãw†®i˜cæ¸ ¨ûsÅŸâOñ§øSü)þR©†øS ÔÇ€ ndVTÀ÷}E<ÏC<—Z@èbrrmmmR‹ýÑÑQLLL`Û¶mR‹}Agg'y&pÑÝÛó<4ùc0L†i&øb}ÿƒ0uœyêôaHÕݵŸ~ý<ýú;8´}3~á3_ÿ4‚îÚûÒç±/}vÞ€Y EÚÛÛyww7†‡‡¥v¡W¥[Múº®Ãó<%ú–®sÃ\°=ô%³öÁÇø¡í›qñå× ùI&É8¸iŽô¦!E¿Š8žÛMÃ1t* ¨€ã==jŠ?í¾„’ø }ÙñÈ¦Ú¦Ú ô“Î03J&Ø{éÛ8íݽL‰ ¶xüi+1Áô©6å?Ê”ÿ¤êSþ£üGEÂh‚Um‚·lÁÁ’ù'³j}a‚W5ÿî/L°ÊLèT@­¾b¼e{ §Ù’ü#³jý±\Žm<d§²HújòO˜õUæ¿ßÛö{ìÔßcçÃ+1Á% 6>>޶¶6%&¸ãdz·Þz ›7+1Á% 6wîÆÇÇ¥nñpß–Ü ­Â4[Ñb@š ¬X?þ6 Qpd•é›Cª¾¸¿ºö—ÃÚ_z ÷ÓXûàcÒâ?Äyðü×÷ú¾Çpð"‡©sé&8Ê?!Ï?wîÃùEuùçÎ}ˆ³_W—òúÊòÏ]/`í]/¨Ë?“ŸBßä§(ÿPþQ’¾ò™-øûßWwüó•ÏlÁ3QuÇ?B_UþÙôùǰéóꎆÀ0uÇ?ÄòPøpBq7Ôy8ÜPüà Å?ÜPüÕC1 ˆ—Õ+ý 0¡§Óiñxâu©A½™ð9´µµA¼–©€‹‡= Rõ5M㣣£èììÄèè(4M“¢/L¾ó:à‚ÎeP úºÎσ©ëp¼À„/]Ÿ¹0aÀa®4}qTÓ4¾À¡í›±€öýoH‰¿(Œƒ»6`XÁûI€Ë2àQ=ÄçÞV½ÒI»`€Çä÷àñà}9úq€›ð`q¸Ü•¯o€O¹A€©¼ \–¾çà0ƒ"0<ÿ~Åɯ'O¥€Í¸ÐÏ·þbüMiíÐuˆcPºþLÚS xÚFPx  € pË–Se,—cx-ÂÀd×"|,—“ƒ\Ža8КyýáOKÒ·½²@ЉåÁûrô-D¸‰,zÍn8päêŸÉ1ëžëµÀûVÞkŸ‘£æLŽŽ{óéÏ.~ág$éÛ9‘ähÉë©ñ²|Jë€išpð8,¯?œ âŸ7ÁÊÒ§üGùòå?Ê”ÿTä¿|Û¶m ÛÒ¥Í?Õú¥óß\•&åÍÿ°ë—ο–á o7ÿ,›Ù6ò×óûܲìPäÕú–í1Ëd<‹Åüg™¯rÛZ-gý­ÕÌ̈FM€q©ùGµþX.ÇÚD¸sw0ÿ‡3‹öróO˜õUæ¿gŸy†à;~xþµ4òf$žþƒËî<óæ›o2¼sófàù×Òxö™gØ#>ÊggfðÈ£JÛþb;ßÙåÀL³À,D¹Œî;Bßj‰rÏÍB7¢ðÜÀ„&[ßɹ0#œœ+M¿¸Èú.€üÝOcÀe_/˜à,Æ0-v`‚ë³¹´9@ù‡òåÊ?”ÚÊ?”(ÿ„*ÿæð€ÚõÔv sìÃwunÀ,@ñ§øSü)þR¡øSüUÇŸb >q£¹Úÿàû>K§ÓH§ÓˆÇãˆÇãÒ:‘ ýÑÑQˆJ¨Òõççç jkk¥ë€(@ª¾íyÌu»ÀFÐZ¦>ãùßÔupæ©ÑGP@¶¾ïûìß¿ÿ ì<ò"mߌ_øÌ¤Æ¿7taEL3( K¿˜öövÞÝÝááa©]èUéV“¾®ëðRÚ‰ÝÔuéØyÑ>˜ò;Ñ¿kSŠÈîïyÁ>ÈcAÓt]îú»ð"ÎÃ4C—¿ýý Âó<<Ðä+"þ]©¸t}€:Áªî«¼ —cp;S'là‰ú…NØZL(é„íŸ<Çqð¹&_Éøó£Aü?—ì–߉”òå?Ê”ÿ(ÿQþSÿEø¿ IDATòE ×ÁwíÚ…uëÖ…*ÿªÔÏÅrKÆ?LHï„mjÃX}{/¢ë£èÝE$#wþ«ÔóYt·4ËïDf}1ÿ.öÆqwrâÙWäî,›e³\ÇašˆFMضšü£\ßZ½4ÿµpéù/‰ƒèe£×X'þ ,ûƒÐè‹ùß«emŠâÔãjòOXõUæ¿gŸy†:|XY'ÜãÇ+í„ûæ›o²Ñ_TÖ ÷ÙgžaâáOÙÛß>e§]Àq&¤wÂú ùMv'Üb}a‚“­f¸]ßþ;ép ÏæÌñ„ NE'\Ê?”(ÿPþ¡üCù‡òå™ÚÕˆE¨ |8¡¸‡ê<n(þá†ân(þê¡ÄÍU¨ "T :Š!ŸøÜÛªA)ÕPÀñ<ØnŽ¡SEEèéQW@åø{×X<”€L`ªM`ÊMyý¤3 ÇŒ’ V• Öº{™R¬ªñçGMØZVîúSþ£üGùòå?ÊT |&XÕ&ø\,Ç’û£ÈžÍâƒIÂñ»¥Î?Õúc¹{ažÐ*þ‡]ßör,Ý€×zÏaU2-þQåùO¥ Þ¶V33½I÷"’ü0z±KjþQ­?–˱€ìTI_Mþ ³¾ÊüG&82Á‘ ŽLpdÂ¥üCù‡òLmÊ?”(ÿPþ sþ sx`qýüñ;C×4̱sÜÔý¹âOñ§øSü)þ©TCü)êc@7«¯õ?æ‹pˆÇã€t:Í…9½Òä‹phkkŒŽŽJÕÀÅÃG©úš¦qQ`ttš¦IÓ·=YÐ9Àt.«#µíyÌÒu.Š8^`—®Ï‚"s¥êû¾Ï´ïƒïphûfì }ÿÒâß›K"0üVð^à²:r···óîîn KíB¯J·šôu]‡çyJô-]熸n0I_.k|ŒÚ¾;¼ˆwžZº~2nšñZV®¹i ð‚hùw=¼/G?p,#—»òõ ð)7(0•7ËÒ÷<0fP&€ç߯8ùõä©°wúyòÖ¿tüMiíˆcPºþLÚS xÜ·D£Á°nÙrrãX.ÇðZ„ ȯEøX.''¹Ãp 5óúÞ–¤o{9d9€ 5 ˃÷åè[ˆpYôšÝpàÈÕ?“cÖ=þÖk ö­¼ Ö>#GÿÌ™"÷æÓß½ÀªÕ~Zâö"IŽ ¿©ñ/SZ,®?5œ âŸ7ÁÊÒ§üGùòå?€òå?ùù/_€À¶mÛäçÎ MþU©Ÿ‹å˜mé¼ww`‚ÏúË‘6þ-Ûc‘ŽÏúNaþE:²<“7ÿUêår “ÞxQÍü»¾íåô Üt¢JæŸeÙ̶ó÷Aòú¶ nYv(òr}k5³-'ñ ’ü0²p`ZºÔüg™Œg±˜,óUn[«C¡?–˱öîÜÌÿáßÌ¢ý€Üüf}•ùïÙgžaøÎ‡ž-üÃg<ÿü—ý0Ú›o¾ÉðÎÍ›€ç_KãÙgža<ú(&8™Ûß>e¢LpÀ,D¹¬òìÓYfµD¹0Áyn`B“­/LpNΕªäMp?ø»ŸÆ.€Ë¼Ûgs6d1›Ã´Ø ®ÏæÒ–òåÊ?”(ÿ´”(ÿPþ Uþ ;/îý3àãwª^ B2÷póþË?¤ø‡Š¸¡ø‡Š¿z(q㹞ÿœ/€t:x<Žx<.µy¾D%ÔÎÎNéúóóó…HµµµÒõ@ Ußö<溋]` #0¨ÊÔg<0ÿ›ºÎ<5úŠÈÖ÷}Ÿýû÷¿G^Ä¡í›ñ Ÿù‚Ôø÷¦ƒ.Ì®0ÍÀ +KŸ ùÄçÞV½UCÚs̱sÜÔý9܇)þŠ?ÅŸâÎøS ÔÇ€ n®«@E¨ "r‹´··óîîn KíB¯J·šôu]‡çyJô-]熸n0ïH_.k|ŒÚ¾_~2«- ’qpÓ'È;²õ/G5p<¶›†cèT@QÇzzÔð0Ïóð@“¯dü½k,ÊŽ?@&0Õ&0Õ&¡Ÿt†á˜ÑЛ`ï½W‘ Öº{™¬òÇÁçš|%ãÏ.𰵬Üõ§üGùòå?Ê”ÿ¨@øL°ªMð–í1SÆêÛ{]Eïî¬Ô"ªõÅüÇDÝ­Pf«¾˜{ã¸;¹ŽŠ„,ÿ©6Á[¶Ç’8ˆ^ö0zUpâ¯H-B Z,—cÙ©,’¾ü㟰ë«Ìd‚#\± Nf –3Á©Ð/6ÁɃÕf‚“½þ”(ÿPþ¡üCù‡òåÊ?2µ«!ÿ„‘÷þ™êE @q7ï¿üCÕ‹@(„ân(þá†â¯ŠAÜ\w€ŠP*@Eä B>ñ¹·U/BUR E¸ ˜®Ë߉ŠER)`3îPV@uŠ‘ž´’ødSmSnÈwÂ6,zMùˆÉ˜`‡“-PÓ [˜`Uš`þ¶w8ˆ?™`)ÿQþ£ü'QŸòå?*N¬j|.–cÉýQdÏfñÁ¿$áøÝRçŸjý±\޽0 OhUcB ³¾íåX:º¯õžÃªdZþü£"ÊóŸJ¼m­ffz’îE$ùaôb—Ôü£Z_˜àÅñÏ©ÇÕ˜ðê¯2ÿ›à†ºåv–šàTè›àTè›àdë›à^ÿOÿ€:Ü/|êQeúNÎU¢,5ÁÉÖ.6Á=÷ºšõ§üCù‡òåÊ?”(ÿPþ‘©-3ÿ„¹<î.ðaŽ}˜ã. îÏáîq3±º\_”/À Ëõõ+ÒåÐÖÖÈd2RõpñðãÑ£Gáû¾T}MÓ¸(0::*MLðt4À<ÉúºÎEÇ“(^¬Ï‚"s¥êû¾Ï´ïƒïphûfì€çŸ–¦ß›K"0üVÐ ¹´··óîîn KíB¯J·šôu]‡çyJô-]熸n0×H_.k|ŒÚ¾;¼ˆwžZº~2nšA^éM£*þÓ.à9Ð4òïzýÝ ¬Zá§%n Âa-…(qûWÃøÓ#ü­,ð¹d7Ç‘ªOùòå?Êå?Êòó_¾€mÛ¶<ÈÏ;šñ¯R?Ë1ÛÒyïîÀŸõ8–#mü[¶Ç"žõÂü‹tdy.&oþ«ÔËå&#¼ñ¢šùv}ÛË1è¸éD•Ì?˲™mçïƒäõmܲìPäåúÖjf[:Oâ$ùadáÀ´t©ùÏ2Ïb1ÿXæ«Ü¶V‡B_ÿ ÿfѦ(N=žEûÉù'Äú*óß³Ï<ÃÞù‡Ö²OgÈ»ö{üøqvçO~\¬/õ>Ñ›o¾ÉÚ~ñ£ü´"ýgŸy†Y-Q~ú'òõíÓY¶åã[80ñªLìÓY¶eËŽ™pê îÐÂ4¯ohÀ–-[¸Ì‡4ûl¬¿¢ø”(ÿPþ¡üCù§HŸò$(ÿPþQ‹{ÿ øøªƒ Å=ܼÿò)þ!†ân(þá†â¯ŠAÜ\%ú¾ï³ÿþ7”™t{ÓAæ”U½&]‚ ®øÜÛª¡êÐUwb·Ý4C3äw¢צ%à=/Øy,(`š€®Ë]× Uôô†.û?í¾„’ø }Ùñ¨¬êN°ª; ý¤3 ÇŒ²;1WY'ìVSM'ìÓÐÝË”tÂ.ZÇãò;qG±¨O°)ÿQþ£ü'UŸòå?5ù/_¢î®]»°nݺÐå_•°á`Éødäéçb¹%ó&¤Î?Õú¥óÿfù¨Ã¬_:ÿâÙWäÎ?ËfÙ¬×q`˜&¢Q¶m…&ÿ¨Ö·lá4[’ÿ,ûyëo­^šZ¸Ôü£Z,—cÙ©,’¾ü㟰ë«Ìöé,k1 /å߃_ª/0ë ÕŠU¤¿¸ a^Ê?áÕW=þ®/–!ÌëOù'¼úªÇ_ØõÅ2ܬëæð@¸»À‡9öaŽ»€º?‡»ó0ÅŸâOñ§øSüÊúÄÍÆêr¡ïûlpp°Ü_{Uú™LF©¾ïûJõ•‰#ßÚS¬¯Õú¾ï3<ÿ´2ýJÿÛÛÛyww7†‡‡¥v¡W¥[Múº®Ãó<%ú–®sÃ\WÍü »þÚㇶoVVX$7ÍÀT}#©ŠNì7áÁ2âp¹ÜNìÅà›LåMà²ô= ‡ZÁ‚ç߯8ùõä©°wúyòÖ_Œ¿)­º®ÃCq JןI{JâP'XÕ`•wÌwÂ6‘E¯Ù r;Wc'l ÂÏHÒ/tÂNr´ù…ß {JëÈwBÈ×ÎñÏ›`©6å?Yú”ÿ(ÿQþ£ü§"ÿå‹pضmààÁƒüܹs¡É¿*õs±s,gqüß> [r'ìHG–ãöaD×GÑ»;‹HG„çbòæ¿J}1ÿÍUYt·æßœ”߉:¬úbþµ §pwr⽯úyûËf¶ü5ÀüþÇ·,;ùG¹¾µš™yÓ{4jŒKÏ–ù*ãè5V!‰W`™ŒÛÖêPèår¬ý@„;wÇ?ÿ™Eû¹ù'Ìú*ó_ß°Ú´H_¾*ãéWÇ2TÃú‡yþ…]_õø »¾êe¨†õóü »¾êñv}ÕËP ë3C]àà Å=ÜPçápCñ7ÿpCñWÅ€ n.Ê^€ ‚ ˆ›‡øÜÛªᆢZЏ<èÄî2qÉ&ôj)`wLø²‹@?Âóϲ·?¹‡hòáú:TèJÅá:r‹PdSmSnÈ›`8yd–Lf5™` 9H ÖZŠôåÆÿwð8>×äÃñ£>þô+ |.Ù Ç‘k¦üGùòå?Ê”ÿ¨@øL°ªMð¹XŽÙ–Î{wgñÁ¿$‘õ8–#mþ©ÖËå&ó—[£h¼(wþ‡]ßör úï}«’i˜ŽÜýPŸÿTšàmk5³-'ñ ’ü0²p`J,B Z_ÿ ÿfѦ(N=.ß„f}Õù ‚ ‚ ‚¸zÂÜP»þ€Ú¤aŽ}˜ã. îÏ ˜…šâ*Š?ÅŸâOñ§ø«Š?Å@} âf„ Qõ´··óîîn KíB¯J·šôu]‡çyJô-]熸.`{r\#ýEÖ>ø?´}3vyï<ÿ´týdÜ4ÇzÓòÌÃå Šw™ÇÐa"¤Ep^m==@*@A××Õ¡0À]ÇU¢T‘ lu8M`ªMBßAŽ…V,M°«VGøi©Û?Ðïîe@’C‰ Öª3aëî8Ž2 å?Ê”ÿ(ÿQþ£üGE€0™`U›àƒ"žõ%óOµ¾0Á725ó?ìúÂk:jöT@±¾b|P„€ñ,Ôå?•úc¹k?á§Ï"éGáÜ-?ÿ„Y_uþ#‚ ‚ ‚ ®Ž¼ñ†«Ð¶Og™…¨mÊõòÛ EÍ6sìÃwÁñãÇÙ–-[BUëPü)þŠ?Å_…6@ñ/,Å@i âf„ QõäÍçÒTé’~€íyÌ‚NúŠxçù§ÙN…ñïMƒ%ê_/ËH»žTý8ÀMx°Œ8\îÊ×/) “åŠxòV¿P •6ã@?´ÄmP ãO¥>°¼ ¶¼eËå²K;ÁŽ‘&¿¬ ,mËÓ_Î`Kœ„¢¶‰,zÍn8päê/c‚•Ér&ØÓ§`Á›ähSêô«Šñ§RŸòå?Ê”ÿÊ”ÿäç¿åŠìÞ½[š¾êñ§Z9¼ÌñŸ‹å˜c9ÊæŸj}Õó?ìúÊçß2Ey Xõú«Ö_Î/sþÛÖjfZº²ü£Z_˜à¨ºüf}Õó ‚ ‚ ‚¸:TtßTCçM•ë¨ÝaŽ}˜ã. ø«Cõú•úª× ø«ÔW½þÅ_¥¾êõ¯†e AAA¬¸žŠ«+äP úý 9è:¸e©ÓàɸZ}ÕñW©¶¥s϶”-C{$Â-=¢.‘·-uú–á¶¥n (׿'Âÿ0¢nû·èn)¿jýðŽ?Ê4þ(ÿ©Ž¿jýðŽ?ÊjÇߺuëøþýûC;þTë«ÿa×W=ÿî¯|þÙõU;´ë¯Z_õü»¾êùv}Õó ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚¸v4Mã7³AAAAAAAAQ…hšÆÅêe!ª Õcã6.~nF½+QmËSŠõQ‹[µªrÙ‚ ‚¨Š'o¤ómy ‚  ýAAD%Ð4ã¶?vœ¥i¿˜b=:¾#‚ ‚ ‚ âFäF|V„ ‚ ‚ ¢\DT/ÀÍLµ.ÄÌ)T_dP}c~ óÊ—ƒ¨4Mãµµµ8qââñ¸ô±q¯Y_ Àh2x]i½o~ï8¾üä^|ó{Ç¡z? Öÿø?ü¿ÿx¢âë_Ê•r¢¦ijñæ»ú(wQµhšÆc±ÅbU‘«–˯Õv &ûظT¯ŽÍUé«^÷rr#ŒõRÄö?räˆ4=)BÄŠ9ÿJ‹cTZ»ÜZ2—ýÃôejÕÏåæUXÆ‹¸ŽS[[Ks„ ˆ¥Úοˆë#ìû?¢2Ô××Ó½ò<š¦q?ò0PÿüÈÃÒÎã#–^ПŸ¯žû·”gn~è8 n^Ü”AsY ÏÑv?UX«S¡Þî4îÔÒpŸOÒøSLW¸Ç_1*ý×óü1‡AAq3°ZõܬÃåÌÈ,\èì—ƒ©^®0¢ièj@ÿÈ ÷}¿b1Ð4755^OMMUTïrË‹ÅÉd”hÄb°]À2\™ÒÄe(¾x%{<”²iÓ,Îú"~wçבN§¥éÞÆÀÿ\7f ©Ô,zzäèf³YD£Q´´´àµÿ‡Æ_þÑÒ÷·1ðŽ®fffðµ¯} ð€¿:0(M_䤚š¤ÓéKò’õQ‹gASS.\¸€Ì|±³1à®>>ùÆPá³Í%¯«‚ZðÔ6[™‰ïp[™‰Ù¶´e¬¦ù}3¢išôýèL}}=€ÙÙÙ›v›išÆ;;;¡ijjj077‡D"Áàû>2™LE1K约iüWÿã=¼Z4^—{Ob¹9‚íÛ·KÓìììÄèè貯e¢býKõ9‚ñññe÷Á7b[Š9XWW¼ä3Õ°žbY†††Û·o/ër-·*ë7t¬o–{H x»‹c`ß÷+“âýÓÖ­[ç"ssse¿. Ö;‹¡®®Ñh´ 788xMZâzãy™ÖH$099)m,kšÆ÷íÛ‡ñññÐÍ:Ÿ¸2†a,û¾ëÞÜ×¼ÄCT°fÍ444`Íš5¡›#A\ç_a¸þ šJîÿèøC-ª®wÎÏÏø¯kÖ¬ÁÉ‘L(ï•—nûUpqV޶ïû¬¶všŸîºëí_Fmí4Н#ŠÏÈYšE4MãcÐó)ÇsÇáè™)û2ÝL¹§ÜóXÆ~µô Ïl”›Òë@åXöJ|'AÈ‚;àÌtiÌJ%0þ¯²¾€‹v©ánG¨bAãO>Âøoíì--`ЊXиS‡0þÿ·øùÒü7€pœ[ÒøSˆ0þw(-B1ŽñWŒx÷žgŸÅ™3[ñ•ÞóÒ¯ñ쮽úç«í9 q. ëÜAAA¬”ˆê¸'»kÖ¬A*\æyBâÆ$t¥×s¹J~ý ë8¨íŸ®ªÕa¬â¨iº¦ª—å^Ž®Æ€G}Tš¶(ÄÂu7n´öš×}—ƒýå=ññq<ôÐCx衇Fñå'÷BfT±þ ë/sû jjj ëú‡ŽÃ . ¡¡µµµÈÜ’Á†³Ñ|Wo¾«¯úæn-x*®óŸvYè9êác#váßT\ç?µ¬Š.³èÒÔÔñC]S.OÜâu5ÿGlßå¶kÞÐÇ-Ëâ–e~/ïR_zÁ¿š©¯¯ç­­­hmmE}}=¿‘–}¥›+3™ 0::Š……d2hš†X,V‘õÖ4ÇüFüê¼·l]ÿÿµ\òÙâ÷T æÎÐІ††Ên~þ0Ýx<ŽÑÑQø¾ÏJ_WZ¿x9T¬é2œ8qsssð<¯ìß}¹}N%÷G±X ÍÍÍØºukÁt¼œ¦êý¡0ïÛ··ÞzkÙ¾S¬—¦i¼Ë÷QüZŒõ;v”Eo%ËR­úJ;”ûØ[¬ogg'b±‰‰Ä’ã\MÓx"‘@]]4M+§ü²Ë‹Å°cÇlݺããã‡ïû¨««C,+ÛœZ‰DbÉ<ܾ};¯+Ï9ž‡?ùîOÐÕècppÍÍÍåXä3>>޶¶6Qd¤jÆs%Ñ44øèòƒŸ°¬÷µàºî’Ÿ°°fͬY³555X³f 4MSzmi%$‰ÂyZõ "×¹“ŠK*οêëëù¦M›°iÓ¦›öúCµP‰ýŸ¦i|þd#öwùØßEDz)º¶%}»GüÂ8Ú·¤Þ#)FU—:MÓ¸y¸ð/êŸÂE@ýSïËXŽuæÿ\XXrA¼–± Åø¾ÏÚû§QÛ1 ÜbBÿ¤ «‡al ] e_¦¦¦&ÔÖÖVeîqRàÉ8¸“ ~’q,{_BÓ4ÞÕXžü)ö£#»g1²{¶b÷#|ßgý#389àŠ¿®„f9)½‹ÅÊrí@Ó4¾¿ËÇÉàGìo„mB„›âîóñ;h¼Jã9˜Xe}òÿ.¾ 4þÔ`­Nqã#ó?‚"ůovhÜ©£àýo€˜ÿ(~}³CãOýG8k„0ÿ]À’×!C4 J3†¯}ík¸çžïHÕ_,(¼¾Úç_wìØQ¸Ç%ó¼Kœ{‹snñ|ݦM›ÐÝÝÖÖVhšÆ‹?G×¼ ‚ ‚ ‚¸«U/ÀõPM]þK §Zð¼áÔ‘ºª«Ù«ÖËÐÙÙ‰ .5•×èj^¸9xùµ54Mã†a ¦¦ûöíÞ={¤U-Ô4Äb2¤®ñ`{ÿŒúN¸2ñ}Ÿõõõñý]>~wç ë:úúú¤nƒÀ$âpÝóÈŒ¼_X¶Jk‹B,iÆÌâÔ©Shâf<*:Ìd³Ù%fµJ#.¼ÎÌÌN:…††̸òÖ_Ôšü1x°°°pÉgìµ™‹gæ3˜™™Akk+fff™Ê v6†WÖ¯Bó]}|ÃÙ‹˜”±Ð+d+3ñ±˜_º-{Žz¼Rq÷¤½Šm禦&Üÿý˜››[òþÔÔ”²ã¢jìÀ7ÀM]‡aH+Љ8~©© ššš Ûµ¸ó´è:H$077‡X,ÆÅß&''¯«¼¸à‚‹s IDAT|i±M…ñ®åB,kss3Ž;ä™|Þ¹ÙæÑÑ|ßG,+¼_ |ßgmšÇü¬Ѧ ÇØ±†`9o·ÎEaæg¸õÖ[ñÞ{ïIÓB___Á|RüZÊB@Ýú—.ë¯¾Š“'O"›ÍÂuݲm‘‡–ëj®i?rä`ûöíe;æy¹¸Ûør455¦¦¦Ê!»".w=¢®®077‡={ö\×öF*H§Ó¼Ë÷aĤ}ŒäÿV__ºº:|⟸æuYÉrÀÐÐв—}ž±·1ðo~ï8ÆÇÇñW9üþã üÕÁ²t(.³uëVÁ1¾8&¹'‘H "›Í"“ÉT,‰ù(ŒÿÀâñ¶ïû…®åÔ/‡¥N®õÝŸ|÷'8}ú4î{üo€Ÿ/lSø¾ÏFGG9´µµ@Õt€¨â ˜zþM/È)Õ¼Þåîty%|ßg®ërÃ0 †5ñ{%–£Zº?Šbhâ|H˜ÿkjj°°°€jê’RJ}}P1›Í†RŸ7©¸Î Ó€ÑjÂI›=éŠÎQç_Âü¿uëV|õ«_ŦM›ðÒK/UB*ÔTjÿ'Ìÿž ´šAÅôýp±{DÍñG5Þ[TrÙ.\¸ d_þ.»mÁ磣£ˆÅbe=O»ZþñŸÞÄ[o½…‡~{‹ýbÓ¿? ˜ ?„3ó¥Åäß×´Ã…¸Wô¸×u±  óó¨­FÄÒþéŠÈ-GñëYû/ðùÿþ@PÀp0`¤¼º¢uþÚµÒãÙd¼§p]ÀÉ?>ÒÓÔvEçOú0M޾{$x¯«ÑÇÈ´CF¦Ës~´»£©žYØ0²{]ûëy%îïø¾Ï:ú5~rÀGG°Ü¥¯Ë­YÄu hnn^rO(¯àš–]Ó‚u7Œ¥1‚ótUûF‚¸KºßÒƒõ=)`eMWË Û Î/ä_¤åK¬}ð1þÎ<¼¨xçßçx±Éÿ¢ýFeåV@2¾XH©Wâö§ñ süY«S¼Øäï>ÿ³JÊ­ˆD"ÁÅõ·]»vU|ûW˸ #ý_4ù»øëŸ‡¯ó?…täMþ+o¯…ñ î€xüÆÆ¤6 *½¯Ù?< u5çMâ9ŠúúzÌÎÎ"N¯è¼ëZϽÅ3”ùgÿ|Ó¦M—æççymmmU=ƒIAA„znØš¦ñÚÚZñ²*n„U‹áT<¬ùJ99Y0þONNbtt‰D¢ô=&ñ«1ê‹íYWW‡‰‰ èîî^V£ø&€Ì¢õõõ¼¡¡¡âÝU# –555(2> ƒ¢ûOþï¼1X,иô˜ÖcÈhÓ‹Ëé7æ1¿±P,@öqY9ÍÏ+A˜î‹Í'GŽ)Se?Ø/{ý‹Ñ4Ÿ8q¢`þ/§ùXœ_ÕÕÕ¡¦¦f‰i ¸ðA%ˆÅbKLÇÅp„IqÍš5R ,Wð@˜¿ËUøIlW1¦ÚÚÚðoÙRø{%·yérãÿrÛøz»¿—ƒbóñøƒ• aþæÎâu/5ÿWr»kcaa™LfÉgÊ©-ö…6®E'B™^Ù5(MÓøo¼Ó§Oã½÷ÞÃüü<cèB#ÓrŽ/Š—á¹çž MèŸ ¶±xh&<[•ë-ŠËÉ*Rp¥kIå>¶Ð4 4.y¯½ZɵÔâýªx訸øÕ… ®ð-j8x𠯫«ÃÜÜ\¡xA˜ô-Ëâ`—ùÄ¢vŠÍÿî„×)O·öË¡âüK˜ÿ/wŒ(•Þÿy.О7‹ýžŠãqoyÓ¦M×lÞ¬â˜ÚÔuôÌ”uÙDq‡ÎÎNQÔAI€L&ƒx<Ž/?¹ùGO()ÐÒÒ‚o~︴"€Ù/õOÁ™ùö~ùv;v ÎÌÁ*¸8|Ä< M;ÌÅ¿@ysiÓþõ˜Ú}çRÿŒùùFäl@ jk§¥ÓÓ¿ìÏèj(Û<È/.B=55%uäiâãwm‡Ñ Þ0€T*ø\O°{$0ÿÛ)`¤#x¿ËóË~Îl•)P¼ïèè×x~}ùr¯Ë¥YНƒŠû›ÅÅ™EA“«ÝóGóù“>\7ˆùî­P€ŠÕÊlüþ®ùË8ûÌ1w8/}Zêu 8=ëAŃ@¿óéÿ …ÿçï^ÇGë¿[‘Â)‹ì`mðUÖpÑ~‰Äÿ…Eóó§+'û!˜fð¯#·ÿ€ÜñgÐÃp((à>ÿ3Lõ)Œ¿Uøk•’ýPÊ}¿g%”Ž;Ëú,WvýKàPP|Еׯxñ``øyPà¯n`.æ- `Ø•½îu9Äñ¼Ìâ'4þŠ8þò]ùŸO7|ñÜ®ŠË/G"‘à088(}û‹Té™4H§×¡¡e{õJűÅu'íÁ4‚{›×{®T__Is½åŒþâ¼ðZï·¶¶¢®® …ûF/½ôZ[[ f&''¡iÚ²Eç “ÉP!‚ ‚ ‚ ”µM¹¦i\ü”ó{—Ó©­­Åš5k*)sYncàÂtYü^Ápºq#€ šüW6b#×+²<„177W(PWW]סë:šššP[[+-çµ¶¶bbbuuu¥Õk•°œù?í^yü^Òé4:;;áû~a›㥗^Âèè(‘Éd FðÉÉIÄb1Äb1LNNöÇÍÍ͈ÅbW‡ÖÖÖ‚ù¬x›–jˆïËÒÜÜ Ë²¸0_TaþËxìØ±%yOùc¾wï^nY/ÞÎõõõ\ü”KO˜+EÌB×`d2ÌÍÍUì¸WÓ4kh@F›Fff †³a±††ÂtŽÌÌLPŒJçˆùøÕÿxOZ.(6?«`ß¾}Sv±ùDtjª4ª×_¬ûéÓ§+bþÅbhnn†(ü!Æ»Xo 0æ—v/ÅFºbs÷þ.-ŽƒÆÆFéç¾ï³íÛ·cûöí8räHa‰åÛ¾}{Y @”šœ>{ü8~ù³ÇÑrðàõ|íŠæÿ™™Ì…Þ.ùQM©ùÿäH°~òëËf+~ð{¹9.Ž!Ž;&ÍüßÐаÄü_¬W íå¶¥(H$ŒJÆ5 ¼÷Þ{€ùùyÔLg`ê:º+þ^Z€ ­­ ãããhkkCgg§²ë•¾®êû>+}@ÆÔ³OH…þÁƒy9 ݨúag9óOÚ“2e ó?D£Q|õ«_Åý÷ß_V‘åîÑ\knÿwl âç/b>‰öwùø‹˜â¿]‹–ïû¬½©É¸Õ4°æ¬šã††ø¾x<^5û4qLm§ X=¬"Çâ:Vcc# þîïr°È‚_0Ó>ùõƒ(½×. Q ’úš¦q?ò0PÿVm{ªðþ±cÇð'ò'K>+>WüoP <1ò}ŸÍÏÏ£×^üºˆ¡nè[= ] …|2ri1,Üb–ý¾¾Ø¢µ˜2žkIÆÁ{z‚ß;ú5¤RÀÉÀðŸJ˶{DCG¿†Ú »G4tí¯GCW=º}ôXA‚ý]qÜÐQ¶sæž`™‹¯GvÏ¢œ×Ôbíû>«íLîAÜÕ_S*eñw £££…ë|âÀàà FGG!®]͵q®iA,wñîèb,89PžóM‚(+·ô`}ÏyÜæü3Ö÷œÇ‰–?–¾zJçf$(øÞR/÷ž$ÄS)ŽO=,]W°œùy•õÏIÉN Ü0uá¦ñW•ãÏÚÙkuJÊøÅ7`vvV†dUŒ»qpÝÔÁÔ<&µ>Æã)¬ýŸ“ª+Ìÿ¹|AìbþÛG€~È9ŸtRà¦yåÏ•T¿Róÿº°X” Â'''—ÍgÅëêê‹Åx%¶» ³³ý££hlDÿôtáýXC233¢+{ð¦ÎñêÌ­RŽÍ4Mã'ºð”MÓ°}ûvrŠbù¾ÏöìÙÃ÷íÛ‡}ûö-1Ÿˆ¹[éåZ¾/ý…þ‘#G077Wvó¿À÷}ÔÔÔLà‚ý]>. ÈM²:ÁçA•ˆuݾ};?räž{î¹Bî/çvã©Ë÷¡%…"1•¦Øü9£¿ŒùõaÜÆÀ¿þüß\bþÿò“{Ë®µ\‘‰|Žáñxsss˜™™‘bþ¯­­…çyKÌÿ"ÍÍÍU¤{½x¸JŒG8rä‰Î~û :.9ÿø_n]„ùæõää$F§5L]àadºò]ïÞ{ï=ÌÏÏc~~¾°ó¬ÛòÃ(œË§QÑn÷ÅÅŒúg Ç®²;ñ Ä1•ØÅœ¬¯GÇì,ºŠòÑÈeÎK¯GÀ%ÚŸ=Åp}=^úpéþxðùÝ#×¶Åæ÷’ÓFcÚû§W‹›o+ù¿Ë™ÿkjj°°°MÓ0==………Ëž‹ªÂÒunÁ5Ù—NJ×ooo瘞ž.œ—ÈD<ü<77ÝŸTë‡Uæ™ç_ÅæÿrvªÅו*¹:'NœXòþÙ³g1??={ö¬xŸT¸×s²ž L8K»èE?û§xd¸ýXúþØ€Ýj;¦¯jÿW|üÑÞ?ÍÇò÷˜dø¾Ï\×åXXXPzìSŠ)®F-èQ` öŠVŠïû,“Éðx<p]W꺿ËÁn[ðùàà öíÛ‡¯?ÿ7øâƒŸç* éç;ßÁ7¿wýö–Šè¹ñ0÷g‹â0²þ)83_–‡Nâo¾þ«øü¿Tx³_ZúõOÁŸ4ípYbäû>™Ö8pIûùUžŸoDmmyÇY)âXÕ÷}Ö?2ÃX= …£joï/|~þ¿?½þBß÷ÙÔÔ¯©©®ëX³fMáy‚JÒÓÔv¦nŒoŒµµµùOÌ.É¥š¦ñŽÛf12­¡gwP4`þd`ïé :Æ‹ó‡ë9(EWìžE×þú²Üß1Ïw½E æÿÚŽÊÞC¾4Mã1?Ø7e27^(¸þ»Ê ¦¹t,”~¯0ÿwôkèj ¶‘Œë"WƒeYê:ÏA÷YUgÐÞyþ骉‡LØ=)6¿ƒ¯ô~ ½ÜŒÙÙ `ˆ¬{Á–®sÃR¦Žùýòïú)8NîßâÚî;^ÏñUÖpÑ~þÄùw`~þ4à¢ý ;*ƒd<0ÿ»®‹®ýõһЪ±XŒ×MÕa¬ JÆ_,ãÚÔ|–6þ¬Õ)níì€ûüÏpñ/þaÉøk¯ìC'aÐSñìÝ»— Óÿàà ´ñ·Ü¸{饗dH/]ŽÝàñFÀÉë_¨Ç,$@ȳöÁÇøïú£ïJÑìøûð×?nÝ»Ñhãã㨵mÁ‰ÂŸþ@å Dñ×uÑ+ñ„Æ_€Šñ‡.ptðó¿È»NíG©üxH$…ëï² ‹Té™4H§×¡¡ek†(ÌÿgÎÜ‚þþvœ8qbÙç´ÓJ ›—qŸ¿«Ñ_r_:£¾¾uuuøÄ'>qÍß/Ìÿ.yÖ¢t]FGG/1ø‹sÒX,&ž“rnx¹g‚ ‚ ‚ ‚PO¤œ_ÖÝâ ¡«²çšššÐÚÚªÄü/0 wÐ`˜…®»Ø¸q#€À˜W®“Ý£´²[©ù¿FÃÔÔTE>/}]Úõ»’úź] ?í5Sˆ5Ìc «¦É ]J;Œ\ù‡d'Û.3ƒ»¶ ÅÄò,gL(—Îü@#NwÝ‚ÚþiÔöOc½ù˘h„e¸øŠñvEt¯aØ+îZéð\©Òb%+õËêRQŠïûì·~ë·pÏ=ïã™gžA<žÂŒ˜£E¨äü—ƒ­i ròDÒA2îôO:æ¨tçûÛøk?þÉ%Ýb„i÷ôÆ*¦ÿ.ÛòkŸ\vûŸ:u *²þš¦qÃ0–­¼*ÌŽwm•W_Y¿ ±÷;kD£QÄãqdnÉ`ÃÙ‹€æ»ú>tœ_éïWCÏQ±‘Šë…ïÜÊV˜LæÁJÿïõ’@ óÅ…  xçææ077‡é¼)xÍ9%˜=ZxHîèÑ£R4—ãzÌÿMMM0 7nD:.TŽŸEgggaN]î¸fvv–ÍÎÎ2ñ cñߊ÷E—£¸«N}}=ž}öYìØ±·Þz+Ž=Š;v`Û¶mhmmEmm-„ލ\\X˜5MC,«è~¡®®ÇŽƒ®ë…qWN4Mã–e:‹.;ÍÍÍpIdaþ¯««C[[[¡‚òu.¯x|%>'–­ìx ±†ŒŽŽbhhûß}…ŸÌÌ †††0š/gÿIN'zaþwþ æW™æ÷â.“¢åÐÐ4óÿXCƒO:¥dý%˜ÿ™Ø7ÏÍÍaaa¡Pqœ¹ÀÙo?!Åü_œOÏ>ñD%¥VŒÿÏ=÷vìØQÖíïû>+6ÿqÀÄøøx9¾~ETK±…å¸?ùõƒð<sssÐ4 Ûâ¾üä^ÔÖÖ¢®®ýö–² ÓY¾»s¡M±ù¿Ò×_‰€àøD<4 º–/G¥?ñ#ÆçåÌÿ+éæúÞ{ï@Á|Ÿ7¥Àñ‚"åêjXÊå Ag¿ññqŒŽŽJí [bþWö`…0áɾ¾ Ö¿Ë¿Ôü9ºüàó׳¬BWl{±ýžó_ÿkáóÅŸÿÿZ—ãRóÿ¥Ëx¹÷Åϵv ¾’ù¸ôÁ$U×ãKYbþŸŸ/œ“ÉÒ/6ÿÏÌÌH×·t¯:=,þ“%[ ½½‹<2õ©j€*ó? îü+â«_ý*î¿ÿþ]g©Ë?‘KÅO%ï áĉ8{ö,~ðƒàÛßþ6¾ýíoÃó<ÌÎή‘¬ä^ÅüÉFÌŸlD*åbÂq±{D+ü´šÆ’ý_ñß&©” ñÿ˱¾²?Ä9nþ÷Â8–¡½â§i2xE>dÝXìœ]N=ß÷Y:Æ}÷ÝWè‚^Îï¿ïr°È‚={öÀ%÷V*É[o½Uøýÿø E*¥ïû>Ór‡!~0û¥Àì_ÿ>ÿÅWqðÉ¥’/ùÌì— å—5¯Šó­^›ãœó¿àt×-ÈÙæççr¹÷µ¥ÇªyC8ìÏjoï_r®Yû/”KþòE@077‡æææBÛJc”Öëy¹ãG'HÙùiîâwuôk豂÷¯÷œÙutô¤«‚÷Ð}ßgý‹]í…ù@á½Ê©¯ aþ7t†î"æ7®ñ}ؼÚEÖ8[h ó¿©ë½.r-ìÝ»—«0ž Ønðú“•}íȧR\šñ¬ ±tÿlø<†^p4úò΋Ïÿç÷Ïc¶cVª½Xÿäþýø×OþïØ´I†ÒÄE›1Kâü×®OcpðÿÄ*ë.\´ß° ù¿§Ç@*˜ÿU‹Å”¿X,V0_ªÅú2ÇŸñ‘ 0íF6ö™}˜ÅÜÜVýᯡih;Œ îó?«ø2Á¾§«««p^6ªÆÀÒuž¼ ÃÉÅOdß°tÿé/¾ ¼Ÿ¥ß¿øs0Wç¸ýì·ÍfqôèQ4ÀÀÿñýó T [†Òâ'²Q=þÚÛÛy×LLÙøkooçŸþà§ÒÇkÚSí¸o¢½P€^˜ÿ¹09ý °wï^ÞÖÖ†ñññŠæ¿Ûxé5‘ÛøŸç«òÅãç‚9ÇÉ‘LYŸAæÿ{þØÔ¯íùÓ•ÐÖÖ†#GŽ,yoß¾}¨¯/Ï|¯©©)ÜsÍ|.Gñ5‘¢ŸB€JùJÑ4öóø…Ï|¡jÎC ‚ ‚ ‚Xdu9¾D<,9p²ý³hí­\×y]×áyž²‡ ó†S~a˜0¸.ÐÙ  %0\6q gå˜ÿ/ ,`Mÿâ‰V©ù¿ÒÕúÆÐßß¾¨ßÕ ­ëw1‹‚®Þ.íÎ\Nó±n&“á¢ÛÊáÇÅIwū핞` Ó]<‡èÊ[n½ùFœuþ-#ï¶emÿ4?qâî=óÖ›¿ŒÓøg´\cç³rÓÜÜ,í@`üYì^Pú7 èÌ ™™™²ŽñàßúõëQWW‡»îº+0 ”0*Eþ",lÿ‡a˯}5ëëTÞ0$r²x}aXÓ Ô¬¿€¯TØü/8}ú4ZZZðÍïÇSO=`I÷õŠ’/PXÿâí?ã:]ÿšš455^Ç[rçµV&ßbÍwõñWÖ¯BìlpStbÉwbBìlÐMã•õ« ÿ¯ù®>>ùÆ€ g/.ù[1ÅŸ[1ó`¨ßÊLô X·ïðK÷1Fñÿ-¢K °Ø!fff¦"¹ÿJüϳ³˜ÐÚÚZó­­­˜˜˜n¼Vó?°t›º®‹¦¦&xž‡t: Ã0°°°pM†>ß÷‘H$ f²ËQ__Ï‹Më<òöíÛ‡[o½ï½÷¶mÛ†çž{–Vô_n™|ßçÅ•€+…x8²C¸ ²°°P0ûñ¿Ðå>OmmmÁü¯ë:n½õÖ¢.J€kê±Ò‡øÄç*aDð}Ÿe´ÿŸ½·nãJÏ=P±³'bƒÌu¼wwjÒ¤<ëˆBƒc{îݱ,R¼¥ÈÇc¾®3å4=ÊVE6 É›8)KCmý±ñX"á¹*Kqpì(±Æ ÒØ³uã¢Ar³qÅ# ã[wçz–D“;¾›±W:ûGã4 ¾HvŸ‰ï¯J%_ïéîƒî>ç¼ÏófYÌÓ­£ÇŽáC‡˜†ù|‘HCCC–øßŽ“• *}7ÿ§3!÷åñûúúÀ?§¦¦À+Q ÿÿ,¨™¦ 6Eˆÿ9E„uχÑÚÚ =8`žl³‰5c'ÛÂ+‹ðߨ¾ˆ)ºô 8bÝØûk6ƒþþ)œ;wýýýއx5UûsñxÜyž³sçN¤R©Í†³àcŒ\.·Føioo¥muóÜÓæ{ê¹VŸH%8€Ïç+?÷;ŠÝè‚ÿ¸ñKùuÉI¸˜ž nÂQ|Mˆ Áìl©©Œ¢(,Ôa «« ³8;”¿»ººþ~ûýÒjeÊLIÅ7¶keeÅÿsÀ<¾XXX°*14ñµ IDAT@ˆ<¿Ë¬Dk†gllŒ‰lC¹ùA9£!üWþúhÈâ’8çØãÚ¿ÛndQésüõ$=nþ6G#F’µƒ ¡¬¿÷ [÷uÆå±âÐZÇ¥˜™dÕÍ®i‹ýóÓió½V æÛÖˆøqqÑÙ·_&•Äÿ"ãWÿ‹Œ_²ý)q•Ï8öíYyR¶·· «vÓŒ4ƒø_ôøk½â:·°1³òkEàúudZõ[_›¯ÌÏÏ[óVœp8Œl6ktÖ:\ü?>n¾w$¹¾ëßH’¿n~¾Òàí]õð€L§W¿[ôý_ß‹D"€Ó§OchhHø¹Å.þhÀÄ80aU?Og2œOòåûüäÉ“]×…nûƒ§mÙ`CCC8wî^}ó{à ss=c‰ÁóØÙ«o^Àž={˜&Ï>û¬«ñíûUQÎ2£¨×R®ŸÅ“Ï<ŽOý&Žÿå¬õ™mp--›ŸqÞ€iOðïp;Z´ÕŸ¼¢(¬Pè€×›µþ.߆¨ ÏáâÿŒnæD“¥k§}ígœdqqÑ2¡æ÷¿ÜhßiÒi 20>Þøg¬1GVa€9Þè* èììDoôêš÷:¿Çtš¢°Ýÿ{{MCMª­¯‹Â.þïÓnÇ”þIÝÏpCÆzk?匛ۛnp™Q ò{ó"‡ÙÞ½{…ÞûWß›‡šWõ›Çoí鱄·*þÖ•ø¯½öËd2«»6ƒ¾ˆ.çÿ˜sÓÑucÛÇÿžv0Œ€±Q÷ó@*ÅŒ|™çð¿¹ýËžòñÿ¶!ÛëißtuØÅÿ±”*íàóùð\(ŒiÁýÏ.¾ŸžžÞÿ*ÅÕÿÑå±ÇŸœœDò«;]ÿ—÷1ñÿ ºº¸ø?™Lâå—_–2ÿö®+ïPT¿³Ç·ÌORá×Àó“”»×Àr¡—ÿ^ÆH¾ ÿócÞ¨æ #wƒ²Ï===ìÅŽá×]{|>ÿËÍODö?{üi—ïÁÊa£ð %óßžGLñ?°,€¤»ýïĉ¬««Ë2¿pk»Û<`Sg€'âA@O[“½¡0â¹üâñ/Âï‡ãÅ ÃðD£=ÖÇíüãT*…ÞÞÞŠù\¿ÿg×ö8“ëU<^ X×nmmµ®çæSNMM¡¯¯ÏÊËéëësd]Ä>÷[:g¥0Ì[þíã8ðâY¼õ»åG?زë0AAÑŒ¬+#¥’ûy¹ø$é|Õy{Ül6+¤ª|-xÕéönSü¿8 {Ù\,vz°[ÅØ2cËðz½ÂÄÿvb±KˆÅ.¾ETý®†¦iøÑÇ¿‡À½Aî5­ê{¢YWÄÿ€Ù/¹ø€•ÐH…•ÍÆå•\ø¿ŽŽ„ÃaìØ±p¼*„7š-ÿÛ·ÿ½ßyÞh;‚_@!֙ЭÒ\y"¢ÌJ@¼Š¢°°ß°ß-„t¾„‚až¡¡!8pðá‡â÷þô?ãOÿö?[íp‡:ÖV½æã Ó§O»²Ìd„~sþ‡–ø@‰øßçóá±:ˆ`=VÅ ÍÍÍY"|7ªÅWÿ' Äãq$ +¾Ïçkèže#ÅA%s¡Zøë?>ˆ±±1tuuYU[ùù©Ö6}øá‡˜™™`ö5»øžÇLf¤3×+ÞñøåÛ|õêUär9ËÀíy»^tÜrø1цòm¯vWÞ>þo$©@‹!c}}¤<®=v£ßÁßÏ?¯Ç±æœØ(ªª¢··wͽëtZ/Šû;Öüã¯M§uë½`¯T]KüŸÉd055UbˆÖ ‰>$þ¿¹·Ÿ_G*­A®c$©`$¹ñëÿüø¸yÚìoRäý‡=¦}låö8ÎïCvñ?º,Q´Y]wu®…ÿ†>ìè¾Q–<-Ëúûû˜kLåUç܈ùØñÎ;ïXÏ=ûì³8þ¼ëñEaFËã€jšHóÇÇ_ø¿qâÄBgg§õܵɣæ‡ÔSEg ÿ ÿ>Áu݃ëæšÿÛûÜblÙ‘ø…Ÿ)±{÷nË…7æ7À44즿x•àB=»è?êRõ~lî¼óNKˆòGôGxë­·0??ïjåšJâŽßùÏܵ†òs1O|Ô4ñt˜%O›ì±âÕ7/àèÑ£8uê”ÕF·L¸ø¿···äyû¿hÀZ– ìÙ׃=ûzð—/¡UU T~· ô¹¨Ÿ…166†“'OÂçóñJL%Ÿ χñþŽmæwØ ¸™ÿnþ÷zyÐÄ`Á–L]€çŽäX#IÖz‚Df#¡×M.—°j€á¦ò.€Ý@ëÍCÜlºQ§Z§èééaJ €D&`câ;6Vüš¦YÔÊá ð@éµ§˜¬Œ‰‰‰†ÚÂmTUe|Ò¿»»{÷îÅ‘#GÖ½ ¼*1o›Óär9är9×ÌF¸ø?Ã0Œuõã|>¯×‹íÛ·ceeÅJâ^/ªª²B¡EQê9|åóø>½Ž`øá…IôÝÖ¦>½îÈo 4Çö¯¶{ ™×<]ÃçªZºè0M>¸Å4CpcŒÖ â~\ìcDíØŠâw4dÀ£iÏjvÅòò2²Ù,~øá’ë@ñü¹©ûPû9­ÙlV¨ùM­þ_4plL¨( ´JıÇÙÉ“'±sçN¤R©u%7B¡P¨ij‡`Å*Õ«c±¢PÚ©f”ÀÅÿ|ß§ŠÆ[O=wÂmñ¿‡W€çâÿ……är9+ñ~÷îÝŽ›ÀTÿ—·cnn»wïÆÉ“'áõz]ÿUÿëØÍ/7¿àÌÎÎÖüΕ•Õï‹Iï 0Mœªxg7 ( Vžòï-šXçŸH$Þ6¿Š8¡UpƒIÅÜÇ2Ú4fbXþž‘¤‚ÿýU2Ø@S-øç“ŠÂ7010’l¼¯j ›Ï#•J!ŸÏ#™5ϡɬ9ïÔ÷s1Q=¸øß_œ³² ÿ”ˆÿý~?î¿ÿ~Äãqésñœ›]ü^›}û¹ÈŸ_ÊÏ=…B/¿ü2qÆŸÍĉ'Øv¿—ËÄÿ×?40u§øñ×Å‹qñâŦ8æ|]†‹î‘N›cò"‰â¼œ[ûäwÞ±L4MCGG‡eJÝHL.þŸN뎬åòÏ$6 —bz¢Ù†¯èj…n]7eÜð{ýááaøý~œ;wýýýUc;QßSñæûè‰Ú×ÕÜŸk0 Ã344ÄÎ;‡S§Nmz ¿^–ØTÐØÇ·ËËËxã7ðÍo~{÷îE¡P°æøŒÒãÓ4ÀÛkÞƒR`ŽcX­óòhȰ>co¿Ó̃ð‡Ýøj‹rã¿Þ¨ÂŠk눅V¿«(²ñ¿Ý¼ØçóÕ5®Äà  Ü âöÚçC@ ògæE!¢iHà•WP">Aµøùtž©Pë}ܵøsâiök.Å`ÜÜZUÅUØ­E¥1¨>®±C£K®W!®5þUS*2.¯½×ŒŸVñ7'žÿM@€èŸ#[ü TÀ‹êÕÄ÷€˜þW3¾€þWäçoýsšIü±PÀäH‚‰ª¾^Ëü$  à@%ìħyö3¤ø[¡ñGòmø3ä]ýsdŸÿÊç_Íþ—C,çþýO¥ø¢û_µø¢ú_yüùGòBDÿÑâÿbD¶8 LkièºY Ñï÷#ÿ"ü~+†èfþ1Ï7Ù»w/z{{±°°€x<>7—¾<†·M—±“Ïç=Š¢0»èŸ¯{4:žSU•uwwCQ´¶¶nz­NQvß©wŸ¼ŸÅíwwà÷á¯_‹®Y—}/uz£a‚ ‚ ‚p‘u|Að‡TÄR^×Äÿ€™`«ª*fggOhßÍ"8åð¶ü«âçgæÑm•ÿ±4|÷ŒŽh´Ghürñ¿ÈEá·ÞzkÍó¢âó¤8}ú4æççqß}÷áwÞÁÐЊ§Õ¶_–C?Ü××g à¸ø?z£îVJáI ©˜‰ñ@EΊDžWÙä¦wÞygIûÜŠiŸ|ëïïZÍ$”Hdñø ®^½êJ"Bµs1çL$'ô´«Éb¼-O=w¡P÷|i—e°çÕW133ãJÂX%ñ*µºâ‰Œ#ŽA×·ÿÕ7/ ­­ Ï<ó öìëÁòòò†àvqþ\ñ.ÜχqìØ1ðþ}îÜ9¬¬¬ —ËULĺ{þšep÷ü5 ø÷ºñ‚ àŽäÄÚ× ð NfØÏØuÞ癳î#üº·¼¼ ¿ß\.‡ÅÅÅ’ý¾ÞIc'øõ| Àöôô°@ €@ÀtÙO_Û”øßŽ};t]_s]ã×¾¾>ø|¾’ÊkEÓª %Ùp`&:t“““ ‡= /8M{{»Õÿ.^¼h=.Û†uÃÛΫ‰†ÑÐ~T… …ÇdUU‘Ïç+&GÔƒ/¤LOOãâÅ‹èîîn¸oû>½Ž…ÛZ UEQØW>_2D•¬e.˜F·@t 3БÏï+ýpƃ„âŽS3ˆÿ¹èµ³³Sø‘Ç-,@Í$¶¬ø?™U€¬iÔ‘ÍfqôèQ¬¬¬`vv­­­%†H›¥DxlÃ/‡ÃX,ŠÿÝ4½±ÓHÿ9&ˆ¯Ô‹ÍÅÿN“T nëøêǀ ^6¿nвPQÜo¯É\µ¶‹ÿ¹Ø¿\üÏI$èìì`þŽEöûZÜìâ÷zÜìÛ¯( óz½Ö<¯F]i<ÞÝÝídèš”W•’%Â9qâóûýÖ¼¯~ù‡ÂÅÿÿúoðO¡ L%Å¿ …Vïÿó»záp/^àîñ¨¶ÆÁ×DΞ=k‰ÿ£I÷„ÿ¼Üè—ß_éº]×ד‹ÿf$©`:½†áé‰fÙ¥XGÅ×d˜Œ±“'O@U^¹\×uôF7vOÊï©'ÆÍ”щq†`ÐÿÇB~ás-vC¯­d=p‰00Çqg™‘_ô€rý, ûqð±.¼Ú‹ƒ5_TOáÚäQë=FËãæg”³Ž~Ùû¾ˆŸºŽ– ˆfQ(tÀëÍÂëÝüüb:ÍÐÒÀ­kKÌ×2ØtààF*{÷î…Ïç³Ìd6\ÌuêÑBÊ€®ããæù³2 ®Ì—Çt#'ŸÏ{FSæÄH¯·(À¿-Ø =­[×6·áëë¡s¼“Š…ÐMº~ü7#þçFÐápxC±uÝì Ü¢M¸ø=Œ ŽKÿWН âÕŠÿkïþ­ãñtuuÁþÿÄÄ^{í5öè£JƒTƒš…î‡Zã_ÏþªØàNqžZñ#ãã,5:Š_{×=båø_v-^9²Å¯@u¼ˆþWK|/¢ÿÕŠ/¢ÿUŠ?ˆ.×â•Ólâÿ|>ï™Nç™Ûý®V|þ7ŸpÓ§ó·ŒpªÅté·V Ùç¿Jó¯"û_­ù_ý¯f|ý¯büQ–!ZüÏá&üï ÿ.~õ^|7 á;É„ñ¿[ùÇo¿ý6|>ž|òÉ5Å âñ¸¥Sáð" ¥Ø^VṺØÅÿ<7c3ð9.ì¿§wŸ¿xo-ÿcÉû’ÿævp“€_þèÒµ:AAA”².Ã0<ÞÞÕªó‹ÓyøCªkâó 3»°A±%sº±[fœVr½ O8_YYw¢–Ñâÿr8 <¶]€àÀ’×D·EÆöÛQ”²Dõ«f²†æ‡%þO;«¿]0“ðÒÿá^ƒ°Äÿ"„ÿvxè믿îzÜJ“o<ÞØ[o½…HdÜSjçâï??VâNziôÕ.’ç¡PðÞG?Å=_Ú…o=mÊöìÙãx¬jâÿg¾ý$–<¿z/»ð÷ï"Çwt­Æ7­òÄ×sçΡ­­ KKK˜¹| {ö9{¬ç><íÙ}ç{Ç6„çòb°*¦è·š¿¹ð|xÍwm¤ z‚,TO¨®)î÷‚ý,4PÙ@`“´··#¬U‰:×ܰ{K€ù UüŸÉdÉdpÉ!ñ9•’}½^¯%ëëë€5â±ÍìûbÎäädCÆ:va‚}@ÄqqZ²°°`íÏzí/?7qþû°›4ß>ŸÓÓÓàFÕè»­…ù>½Ž`Hg€…ÛZðÁ-ÛuT¡­OhP WfÿsÑ«ÌøS[XüÏEÈÙl?ü0VVV¬Ši€Yù{#‚”õ`?ï6‹ø_¯¼òŠëFö¹P‡›@fy­­­® ÿÊâÿo== UUK„ÿ\KD¨uþ‰ÇãÖµÈI!ÆØØ˜iˆ×ÿóýà–ÄzÅÿž£øýT­÷¹eP(,ózñov™mI*¦V°F•ÍÑXJEo>_C´¯¬Kt\äwìØ±MÍ-óûQþ}3O>¹îïè.Š9ìUímâFv6j@³oß>,,,À0 ëܘF#†apÑ5sÜÝ &7»ø½7ûöóßöOOOãòåËk*¾Áëõ€0>6Ü¿?³½ŒJœvñÿüüŸ>Ÿ÷ß?Ëd2RÆ µÆ n "ëÙ¢»ý ^ü¿yçñ_$ÆwÙâW ¶Þí6ÕŠ ¸ßÿêÅw»ÿÕ‹ï6Í(þÜïwõâeæ.µ¥QóñE ûüWmþUT[jÍÿŠèµâ‹è²çÿe‰ÿµ9¨÷|i¦ÎOÄÅ4ATþ±až©©©šc_» €Sëîëü—?W–÷·©vp~ù£àW÷,#€¢Èߊï½w]m'‚ ‚ Bë2àpáe{÷A,Nçáíu¾b„±±1k0Á}ýýý cËf[6Xm¡Q¸à”'•sq§ Áiu×»e,Æ–]ß<ᜋîâñ¸åº‹]B4Ú#Ä™]–øß.¾ošiû Ãðx£Y¡‰IÑœÂ.]2PI‹›N»S¡RG´ð_Qvúôiëïx<.Mü˜Û}àÀWÌYê‰ÿRwR·ÍXìí±óýçÇðýçMƒ“m¨'þçñ~õ^W¶xx~¿Û·o·ÄÿvçÕÖÖVtvv:â¼Z‰••¨˜€›¸5­Xz+¡'þ,Œ÷wl3_üpcñj ü ð NfØÏØ·õŸµn±‘{Rn1 ©˜M3 ïʯåŸep`¿ Ï@‰˜s@©%Õ©¯¯Ï@€mS3x"œQÄÇ×0ÃŒÃñ_řȗ…Äß»w/Ž9‚ýû÷£«« \xËÏA¢Ç@ý1¨Lñ=ànåõFâ»Yy]öø_¶ø¨/@—)¾ÜíÜ÷Ö IDATÄw³ÿ‘ø¿úïO¶ø0Í'ÜlK#æ'¿&1¾ÛÈ>ÿÕš•-þÜïõâ»ÝÿdÏÿ7“øŸ£iâ•?ã$æ;•§Ïó*EA¨Ã@0X“÷ÇÙÉ“'±sçN¤R)akÝÝÝØ½{·eÞ ˜ù ›Úáy€)ú·=o ÿËo™T‚ ‚ ‚¸‘X—€ìªï|ÂÿM1¾íÑV!ƒŽÇ8h& öeNË}àÛÝÜ¢ózâÛÅÿ<^4Úãz|ÞYâÿr8 <~3TÛ~Çä/ÿrÿþ߯VŒciwÄÿµ„ÿ#I© ¹hßu×¥œ;v^ýuWãÔ›|ã¸ÑÿsÜþÛÙ¹s§õ8™LºŸO¼Ú+ô•‹ÿ9nm%ñ??Öº®3MÓÐÚÚêFhf•q¿ßÀ4(&a€%þçb…MÓ€À¨bàûYhw$'Ö¾æ|ñuqqÑ•ï¯Å]»°°ßð±À ØÍ"þçx¯×»!¹“ØÅÿÁ@ƒA ¡Ñ.^¼Ø°¨®ÙX^^¶L Âá0K$ëÚ¿öí^ϱá +>ŸGŽAww7¼*› Vûnka¾O¯#Ò`á¶|pËvÎ *‰ÿyß³‹cB__¢SSÏ•T.jÿËߌâ`õºk¿þŸ?Þ•6Öû…ìþ_7ÚÂÅ6ö÷r¸ª‰ÿq÷û²ÿÀêµ@† A=ñÿðð0ººLåþ'Öaˆ777×p[œ6à±ý¼- .N€oÿþhÎ<ç£Ju?"<·(o;>– !à æÁó{« ׳OVEV%ÏWA:Éòò²•ijoß>ÌÍÍA1¯«X^^.9¿ð>/Ë@vò§ìä¿­²ýöä3ûÇþ|ùc7ÚÁ)¯¶sùòeÇÍ­a+‹ÿEÃï³E×ë­ú>.Â7 ÓH$X8v´ @uá?ßÿCCCŽ»žëŸ–Ò1€€yý+kãf®åíé‰fÙO– |*L)Ë2èïïgo½õ8€BʼVgt 'êÌ‹u€ Š:Ît&@± d‰ oÝa#~þý÷|i{õÍ xöÙg bü6ØÅ4Ãþà&wKQØ-¿úÒé?Ä /¼€§žz ~ûƒ53ZÔS0òpÅ ð“G0ÿço®OdP(àõfÙf®ÅV¿N±Á` (¤:øo‹É4°qùÜÛ¾}ûÐÕÕ………ë|gÎ|íÙ‘vñýjžÄUxoFÜ6؈øŸ÷y»éÏf ¡¹ ’–øŸçTý}¹i0 °»üVq$•É 7@(µºÆâê8$oÛÔ € ®e€m 6±*¼wwôLÃg0" ²ñ_EGä—ˆ¥ÄÄ?xð GUU611á`>Ÿ³³³%‘ã@™cÐFcËŸÊŽï²Å¯€\z£±ÝjÓß-šYüß,ñݬ¼Þ¨ù ÿÜAöüs#ñÝìÄw³ÿÉÞÿÍ&þO¥RÖã3‘4ž@ÐÓ›6^¬D#ùÇŠ¢°Xì€Ï‹kŸÛ¨öú±cǘÏçÃÛo¿íXÜj¨ªÊöïß`Õ˜pxx XXXp´ Qù¶sÁ¿?æ‡öoßCòßÜ~S¯AAÄÍ@CJ1ñÔ0 O<gÅd¿bÅ_…”o¯û‹|bü¹ùæÂù@V†àTQ‡¡ªêñ= Fxo_&ˆ&B‘)þ·‹ï—––D†®ˆh‚f2à(ŠÂNž<‰={öà/ÿrµJ%ÇÉÄ ²ðßžˆ×5@D¡( ;}ú´õwùyÁéXˆÿÝ`=âQØÛÄyá™ã®‰ÿŸzî„%þ¿rå *ŠÿÝÄ.þ_YY)yÍ0 ®ë®&cóÉNÀ¬2ÊMLC Xb…ðga¼¿c`îÃÓ%mÙ}ç+®çYMŠ"´«d¼`㇦ø¿àܱáàrt]ß2°Í&þ_\\”.þçø~û:‚ÌLüÒÓ:zÛòH-©Ž¶MUUV¾ý. @¬¤ºz‰íµhÖ+þ·=Æ‹/¾h½699‰_|Ñ2ßÀªm»Óý¡Vß‹ut@gf³uÆöû‘à‚™Œ0|åó| lnœ&[ü,[|Û ñ›UüÙ¬YýðèÑ£˜…aÂÚ(Ùý_&õÄÿ‘H¤âçEßïÇÐÐЦöU-ñ¿(dÿþe·£–øXd•®‘¶ýâ¿ØPg§L~ñ‹_”ˆL×ß . UŸK!€ #âÐP¹áÍd`‡oG!$¶dML¿?Ç…"M¸hµ¯¯»wïKü_íý²Ld'ÊNþÛjÛ_!ùÌÃç| …‚Ðs7”óz½ÈdVç{ìÝf«‹ÿEa¢Ì¿øš7F°Æü¼\„Ï'‰M÷ËF…ÿNǵwÝë_Î|¿S׿r~ãðíø^þ?Y6ðµ ó²L8À ©üC·Ž1`ÿ¸VÿƒëŒÑͲXÈ¿f¬I&ÕMÚ<`‹Ó@÷As\Äœm׃籲ïýÅk¸ï¾û°gÏž5ñ¹ø£ãSów–Ü_Ã&þ7Z´?@: <úègxé¥xòóµkzéû•ëg?7†áñ~í¯,€–@ÑmA¢(¬Pè€×›ÝðwfUy~_]þ,³ÿós\WWÚÚÚ¬*ÜvñÿË3AW‹é¦¸{½íˆ&s,VlC ºïyÜ0بø?l˜c5¾NáÔœ'ÿŽ‘¤Ù¯z£fJU¹[ýd\5… îÐà¿d2€*F§¦U䃼l dp-0Ÿ_}Kòñ7¡á3tD~ %îÁ’*Nxo³²²b‰ÿ·ÒTöøw«Ç—-~n ñ?Åwÿßæ#²ã»…ìóŸìùçFãËßËŽïÍ(þç9¨íÝæÜˤÑç°#°>ñÿïüÎgR ô½òÊ+ë^Ã^/¼@ _Ÿ ‡Ãðù|˜››sTøoÇþ}Š¢°ûN½k½öûÆðׯEošµ_‚ ‚ ‚¸©k ( ëëëÃÔÔT‰ ¿Ñ÷öVwDs .ôûù:Gwp§º)vVª. #ñ¼¯¯ÜõY´¨¢R|ÑÈÿs¸ðu³‚†ÐL2&WÊáâ÷;vàòåË®ˆßyÛ©–ˆ'š;vfff\‹Qn4@âS¿sçNë¹d2Yã›å/Vs \üÏ¿]üŸËåÖ¼Ïé>1÷áiÏî;‡Øû;¶!<_*æ €mmmس¯§îwí¾sˆÝ= ﯧx'3lül`€¦!Àƒž γ´)ò·S4pZüogyyÙÙ«-‹à.€ÝX ØïøXPfÿWFUUÖÛ–G00Åÿãq¤=ÀÂ?µ·ËlÙÆ1 Ã355Åúúú‡ÑÚÚŠp8ÌSœÄ<‰DIbh¹ ÀzÅÿÝÝÝðù|Ø»w/Ž9‚“'ObûöíXYYÁ¡C‡ðÊ+¯`zz€¹ÈØw[ ó}zÁÎ ·µàƒ[¶pΨVßLÑ¿æñ Z`‡Ä´¢)@@ƃ؃”%æò6ø_Žè–?nfñ?7ÿÑ4‹¬çn“ß·ž¸²ú¿HÑSÝvT€»}LHü/¿õÄÿœ¶Å~=[/N˜,..Zßµ‘øn˜p´€¸¤`œažÞh’¥b¤Óq^‰°)Dx¢¨$„üÃå'­×÷¼ôöÀYá#ÿñ¿ËÍ¡\4ÝHÌ©©)¦( Z[[áóùÍf-C½JÇ\´ €ìäO©É!°lÒ¶?Ö³ÔÛ_ž|æõz166†Ã‡CÓ4áTÀ¼^ˆ®¾¹ÕÅÿ"ák^Õ¨7÷¿™}ÃÏÝ|m£Ñ˜›[ëûª]ÿ®ïy '÷8/üçßµ'©°™&4àü¨x•N›"h'Y:¯ý­ÉAW2(ÝÍøÕLJÄÿ.µa‰Áóío<Êà½~ZbàT Ë åqë¹m‡N™"ÿüQ@;xò™£xé¹xò™+k¿£åq(ÊYf£;uÊM®OLð`&t+vL|^ïªXz£1½_•ÑÿíÛÆçâöíÛ‡®®.+7ååwú_³˜4n˜x½^hþõ‹ÿµ@Qí’Ñ\™—5ÇáæüKÐ*¼Qý˜Wë'©¥BUS·zðûÛ»ö~ ÀAâ{|ì02€ ¨Åx Ÿ1·¢¿Ä’úu)艉 Okk+;yò$}ôѦ Þl±)¾|ñ+@âÿ­_ªø¿ æß(¾¼øã‘cÈ@ÚùOâü+Å—xx˜)Š™âÿ§ž;QUüÀ2àŒßhþ±ažh´Çñ"T|ý;TÍÿàkhnÃóFÝ0óÔ–——a mð6¸›Ïé¼—:{z‡ðù‹gñÖò?º’ ‚ ‚ ¨k{÷î…¢(à•%ÊØÝk^)Š¢°ÅØ2PWšâ æ7Í9»øÉ]þ_}óB‰»?Í©8À…ïv‡7ÑûÝïÞ½R d‹ÿùÄÊÊʆÕ@–ó¥Á µå¢ü™™Œ9>ᘠo^¯·Dü_+/Ö‹eØ'ÅŽ;æJŸà·¸Rdßkfñ(²žK&“xá™ãŽ·©\üÏÏ?¢ÅÿüøÏÏÏchhHDX » çîùkLC .þŸ¹| ~-XòþKü¿cæ><½¾ýVòß‘œ°ü±ZõmüPºögA›)€Ãâÿj"`YB4Ñø¿2kÄÿiÝÿ_¹Ýçè"‘ªª¬|8ñýödûrAÿÔÔ€¾¾>Kø?66Àt>`ŽŒIŠÛ¦§§199‰îînd2LNNâСC '>8}R¯ï%r9£á€‰\ó·Íúhšz€!Q4jÙh»Hü/>>¿ÿìëëÃC=„\.‡þþ~G+L5Ò†FÄÿnÀ»Õ.ÑbxÙý¿¨%þD"•ÞÀ‡nf¼@âùíhTü¿–––077·áÏoÖ`³sn˜†á1«ÿ…Ä×eÐè\J#mhV€Þ|¾þ›¢Dº–ŸÄÌ“Oºr ²_O4Ë.Å:ÐÔ0 ½âþ·Ã¯Ûœzï·ÇL$ :;; æ9F¤ €ìäw™âÿmßûVR^òë¶ï‚íMIL¾,Â»»1==Ë—/£½½]X|¯× kæÿEœëHü/Ϋ’¡?öýýýÜ9æ<îðð0ü~?¶oß 9Œ†«]ÿZfžÄˆ‹ý¡™M2:°\+ŠÿQõÞh3Ôo7‹ @? ?y™wÓH§™YŽNû7K¹ Àât±½Ëqyl¸çK»˜ÝàŽ;~ûƒGƨ– €ý67Êõ³°?÷ä3Wpâ©ßÄñl¯©¦A€‘å,+¤: ë:œZ›\5ÀüŸ¿/à XŒ-£=jžÇ …@×áíug=Tvÿç¦']]]hkkÃÔ v7f3˜ðý+ÆB÷»½N›X·øŸˆ¢‘c^¾oœ``GTpW& #¦^,P‘÷záVñ—êü#[R€ @‰¿Ž%Á›ogllÌ£ª*SU•‰‹‘øëÆ'ñÿÖßËŽ/Süß óo_^|}\cÓi]šø_öü+Å—ÿ¥—^b…BAºøß^€ª\üÏqcm~½ùÇÍ0Oê^°5€‰‹ ¨Š9ÉyŒ‡œtn¬W_þèxÏöx«åÃAAÄF]Ã0<ÇŽcÃÃÃèëëƒw³z´GyÅÛb~£1ÞQ€6Ø·žÆÎ;qåÊ•5&¢P…uvv¢££™Lº® ¾”ÇŸššÞjƒ¦i8|ø°4ñ?§P( P(8.6o„f0 pÓ|€oßÐÐPÕß1OãF0??ï¨ðLjD"P^¯w݉x"Åÿ¼BÐÌÌŒkq†‡‡ÁÜ2¨Ä"þ¿råŠkâÿo==\2ñ*Cü/ëøWãîùkHÜš€¦iÖs3—/áU F¿¢”¼Eñ?€õ‹ÿíØEý^°¢ð¿˜£ãÓiLä3Ž‹ÿ›…»v`%`¿àc̈¦ø Åÿ™ RK*p»˜ª„Nâóù000ÀŠŽÆ`õZj7ÆÂ‚UÍ&3»qÀfàûLUU6== ÀœìÝ»GŽ)yoßm-Ì÷éu@:,ÜÖ‚nÙ`cUvÊYwßËxøà–íØs±<¡ä6]ÄÿââÛ«?rî»ï>är9.®kJñ?Gö9Ñid÷ÿf`=p.ü÷z½ðz½$þ¿ÁÛ!Bü˜Æf›5·¬fÀ_«³¸eÀøvþšý}v\Ȩl°Ù6ØMêµÁÍþK©OÀ<öÅ cágBÐüºÝ\7bÀáïáý¸‘¹.·LFv€ó9ÉŸ<þ©¹É‡öä×‰Ž Ô´8åIyò㥶KPs•/¦¦¦À ãD"çóyªªB+]fõ±í[\ü/ ¾æÕÚÚ EQÐÚj®7ºQáÞ0 }>Ÿ³ÍPrýëuÿúWÍ€¿fŸÛ÷üX]Šu 'šåÏ‚_s×s­uÙ"hnÀÅÿ zƒ¹fáv[¸ ÀïþÖAè:Ð÷à×êÎÉø÷|i»˜f¸ãŽÿ鈳›ÊMÀ˜”ëg­×¶2Eþ×tàø GqáÕ^| ¦ø?Ô|“z Èž…În›ið®¿;è:Z4 šµÄÿÝO\u<¶½ 2ú?ÿ~EQØc´ÄÿÇ^v¿ÿ5ƒ @³à¤ @>Ÿ÷ŒÂ¼¿+¬Sü_Ï0`³lä˜óϤ– Ööm¦ ãêªðí€5&In£¦m»Bž­NН>`ÅÏãV&w$v}Äÿ[/þx$À‚AdŠ_9$þßzñXWW …šEü/cþâË‹_.þ÷ ‘ÆC²ç_)¾Üøåâžó$Šrñ¿®ëBsP›1ÿTÅœÓÁI3Ç4_X{Õu1ã1s>Êœýå~`='"6AAA§®gnn>Ÿš¦A×u) Œ†axÚËÜë£9…Åüùþ^'bÆãqD")&\üã÷û‘Éd¤_ìñ€MÓððà ¯x_ÞŽááa.¼’Ñò D™ p€J¯Û…ÿ€iHàT¿à‰~¿Š¢Xâ ¹ñì1»øß‰1.:ñûý˜Úïn$ñÿctMü¯Úª,är9WŒª!óøsvsñ~QÀ Dü¿¼¼ hÝ¡â?yÍ Ñ Ds „? (šxÇ6àÃM6È&ü×u˜ Siݪ<䆸¿™EènÑÀ‚3ñ‰Äÿ&µÄÿn,«ªÊÊ÷ƒSq ÃðLMM1^Ý<¯õÛ¸„'è/,,8ÑŒlÛÆ`zz‡ÂäädÝmq"þzúžaž„’5EFJ0Ì4 `û¦Ú@âññÃá0r¹üqÀ;ï¼Ã0¬kÛlTü/¢]¢ãÉÿ‹ªzZ3~8Û± ÿŸIü/¿¢Äÿ€9¶q‚J&j # Ã𠱓'OâØ±c›ì‹0`Ø™?~!˜&]ÉäF#ÖnC:GÈXÛÃ0<¢L¢½yÄR*zóy$m†o"ˆöæ¡ÇÅÅ3 ÃÓͲK±Žšï«$þ`þÌVùTõ˜ëy¯Ó&£ë 0Hÿ÷ˆz½M#þÿ~(uB\~yòãÛ½—„Æ/Çž|ƈE_Eoûx$À´ †¿+^·ªø_Ä}°]üßÞÞÖ¼³[Û Ykk+:::„˜ 8ÁäHÎ :/(®E%€¿? ˈˆ¿ÇÍûEQ¬Jê=ÑR±çHRa£Ð·œ €¢(ìR¬Ãÿ§Ó Ñäê½¼Ûmhó€-NÃÿ÷pÀu\½êþþoó˜sƒÓ ûƒ<ྻøÎ ËXoZÔS¸6yÔzrý,>ÓàmFÙ³%fNï“U€\wÿ<þ±õZ÷A!cUYýßœ2ÇA\ü?uÐÓ×uÏó€|¾ÏcÅØ1¸oöQ«-NšÔz]†øŸ³Q§rVìûÆn {¼3ñmf7;2èÍbþ'+>G¦ø`0ƒñqlIñ¿ýø·J¿ËŽÏ!ñ¿Üù7Š//~¹ø¿;¨áÐèÒ–™¥ørã—‹ÿ½^¯Ðs`¹ø[€ªòOy;B‚€¼"^°uUü_þòD>ƒ¢9s»•}¦Yç¨ ‚ ‚ ‚(¥!.ÎÑ4 X^^ÆÕ«W¥-ô•ÿ]no nº}K žï??ƾõô°»ø~zzZ¸à¬Rü«W]^Ñ®ÐMÓ°oß¾¦pýãœD"!E"Û€ÀMó¾}{öì°Vè_þþ~GÅÿ"«þ¬§mö¿OŸ>íÛ·£­­­ä}-ËÎö EQX8†ªªÈd2Â*Ï$þoó€Š Xâÿ‚¹ð+tûe TøÿþŽmÖówÛŒŠ÷"ÖßÑ‚‚sÅóã9èWVMìß±!lÂ3ñÆL€Õ‚&ÆuLä3›ûþ&ç.€ÝX ØïøØe1"ÿóý¾<†KºX¦fÿó „"Åÿ¢0 v€jpñ?ƒ¸}NNNZ×â¾ÛZ˜ïÓë€tX¸­ܲÀæ¯Ãé{üù„’e†ax¹Ã-Û7ÜWe‹Ÿe‹oeÅ7 ÓH$øâ …–——…Üû7«øŸ#J /»ÿ7õà\lSé³›ÙW$þ—ß‘âÀ4uе&@#Â§Ì «™ð×6ú½Ñ$ ™÷à,#;üµÄšåF@fµ v3€±±1¸mЛw¿úp³a–¿fÿsÁW=Ó§pÒ ’øÿÁLmfˆnRIüôÒ%¨œüúEÉÉ"ãWc+%Ÿqñ¿Ö¦ÓÐ/ÿÇã™-'þ— ƒ ·ÍntÊMøµc¿&ºuÿQ­’ºažJ&ü5§âWC¦ ‡‹ÿgB·bOò3W·›‹ï§Q¬2´îXÄ7çáÏèWÜB·yÀ.¦Íî¶?èÁƒç‡°‡‹Ã §M€Òkß6 ¸f»ýå¦ÿP²^Ræ}_Fdz §±› ý†ù¤®ãêUq× ÑýŸ‹ÿÓiàå™Õþ—Nçd0‚ë& ²Mš 'Mª!SüÏi–c.{°Õã»L|³˜ÿÉŒ/Ó|@×X@Ó‘Ñ5 ¿"µ$"<¹xûñoíéÁò¥K˜–ÔÿdÅ—i>000Àî¿ÿ~d2D"$“I«(šaþâˋߌâÿ­4ÿ»ÕãWÿ ¿ï´ŸwE ’ÚŒh€*Kžª¢¢ÊÔ¤+lõcAAA7 æÍ¾®ëlyy~¿‹‹‹R+¡Û)7¸:¢£=Úºéï­fð½¿x ßþÆ£®™ØÅ?¹\NšøŸÇß¿¿pÑ;ÿi®ö¶„ÃaaœjÈ2 e>`._¾Œ}ûöÕ}ïøg\ÙÍ’ˆ§( «g†0??ï¸#§¢(¬¯¯>Ÿ³³³Bû\³‰ÿy¢Ù«o^ÀÎ;­ç¯\¹‚óçÏ»ïPd]]]Ös2Äÿ²Žÿî;‡J„ \¸?÷áiÏî;‡Øû;¶!<FBO€%ðçô+ Äüæy*Ñ\¢ä=»ïbsžn|[lÂ]/&¤uk²upÒV ÒçÕf¢»]üÏ…€qÿ³Ÿ,À÷Û×…ŠÿUUeåûÂéXÜh¬¯¯áp­­­‡Ã vïÞ……†©©©ñ¿aÂŽI½mvÊŒh3}¿g3m‘-~–-¾•/ Ãçó0E)n¶£ÙÅÿ¢Ýÿ›FàNïÿËo‡hñ?¿öËüq3 §ÚPÉÀ¦ª¢s‘`н-##IÅzïFb4Ò†Þh’ b~Á€íÅLéüÐüñã>qÂUÄR*`ׂ;dQ Ã0<=Ñ,»ëX#|äØÅÿ|÷D³BEˆå&EC¯†¥äû)7^!¾]ü+„Åç|qBÅEÝ+<ù•ÇÏÁ¬äÜ,âÎÍt.©†]ü¯O§¡§u nQñ¿¢(L„ñ—ýü%j{¹©®ë7L¿>4ºÍPR)pÿúÇá&hUp æ5/ ™Bç5×Äùãvîþü÷©.ê·› j0};t×…Àöø²L¸øÄ0ÜŽÃÀ¨Kü6Øâ´yoP^e¾_QX,dV¬s»*ùþ ùµ||ÊMຠÀYfLŸPOa[Q|mò(”ëgQHuàºuüˆûǵªßå4í»Ç…ëÚ[t`óiëBtÿçâ» õHRA,ä‡Ì &à÷'SÎ÷w¬×íß[#íqË Äÿœf1 nNd à«™ÿM@Ìp3Æ—%þç÷ÕƒƒÀÄxEŸ_W)€¯[†ùd3Åi>000À|ðAÌÎÎrQ¨ªŠÙÙYá-šaþâË‹ht æ$¿xñ? þ•âË?668|ø°ñ›ì¹ï½`µø›Hñ¤Ó€Ç IDAT¿¬üÓ¦Ä 6 08™©™cZË € ‚ ‚ ˆ­MÃÀjrŒâ'ˆ·quÄY ´rUUáõzñÜ÷^Â3ß~Ò5Òg<~"‘—‹ÿ;::šÆõÏ0 ,..JIÒj·Í Ãðð y^¯^¯Û·o_ó¾þþ~ëýNÇç‰Í’ˆWOü¿´dºqû:.þ×4 >Ÿsss®‹Îì4‹øŸ‹þà©çN «««¢ø2>áh»Ú<`½¡UÁÌÎÎ:§2?` ý­Çðaékv`Õ €ž#šKà\ñ\yú•DÕ÷WÅ&üçèóñďމ|fõ½.ÿ›‰»v`%`¿àc«/“ø-%âaâ‘p! ôõõAQø|>k1lxxŠ¢psË@4}·µ0ß§× é °p[ >¸e;€ÍÝŸ5Cß“-~–-¾m†øÃÃÃ0 š¦!‘HXâQ·ã6³øŸW¾§YÄÿ¢„Oã €sHü/¿²Ž½cz{’¼¬6ØMìãºÍ|'€Šàí¯» Í­¶a@‘ôñãHº ãɤ“ßZ›â6°Pq|)êœÌcÛM*Q^íU†8…÷ù‡zȪ Ó¨ @Eñ&ƒqU̧¢ø_`|ÀëñÇ2’_íñ›Mü¿ ñ¿®±À½AdÞ…%þh:&ÆMÝüüJ±eÿf‰/Ò|€‹ÿß~ûmD"$“IüøÇ?ÆÅ‹·äüÅ—_†ø_öü+Åožø²Åÿ„‹ÿeæŸVjO¨Ã@0šROÜ¿ßë­k@AAÄÖå¦(ØnT¥ë ™ÂÝ»wÃëõ:^uÛß™Âñ¹óà~µËFÛ£iæÂêòò²1ß'2 ¸ùKlçvüZBÙýAõÄÿpàÀ´,Ž‹ÿ;;;Íf…ö7Ùâ»èÿPd>Ÿoð’É$^xæ8gÅIü³{÷në¹……áâYÇ¿Qvß9Äîž¿ º˜ÿîùkHÜš@Ì¿*ÈæÌ$¸ðgaLü׉êÛTt[4…þÅÓ¿•p(Røß ‚`@¬‰ÿ+£ª*ëmËÃÚ7ãq¤=p]ü¯ª*+ß"£ø}7Pb€Ä…ÿ2ŽK%€©O¯oªÍÐ÷d‹Ÿe‹oeÆçý‹ÿ3™ ôâE§XE×µ¶4»ø#†—Ýÿ+µG´‰ÿIü/úØ»‰›ó‚Æïìì`VEo†y-7¨4oc¥3οøy‘#R„__tlÿR¬cÍóåâ™ð¹CŸÏ¯×ÛP%{âÛ~¯W¸øßßï÷KÿWj,ñ½ìø[ÿ¯m“ ,¢:üú#Ë Z›ÊŸ³_#E¶•§¹x@Æü!¿—Of­¹3×â+ŠÂb!?¢É\Qœ®°ÃÀ#‘ÛñWñO0êÂo–¯×T#ò6qxÛœlC-Ú<«&A|gÆ|ìô˜ÖZ«oyPOAÉz­~oŠÿMÜêû–ø_×ÑýDW¯^üdÙ@ǯÙ__k•s ™&ãLøñçñã3-BÖÏíbûú‰Ûãx¾­<¦è}]­Mö}ÑMn¨MÍ(þ/oŸŒcNÜ|TÀg2/˜˜¬Ø²ãËÞ÷ÀþA6þçãÔ,ñF'€­*€4ÿŒØ²ãËÞ÷páÂ6;;‹P(„x<޽{÷âüùóBÅÿvdÏQ|ŠOñ)¾èøv‘¨š1ÿ´) Š9©@1ÿ´,ït `š2 ‚ ‚ ¢*¿"»Nâæ l‰Á“J&˜_ "—Ëáþûïw+ùBgY‰Ò²„îµX^^°¶Ò„¸Áââ¢ÕÑd³fõ’ååå²à†¢(ìôéÓU_?pàç÷ úý~d2¡ý½Íö½¿x €<ñ-Ñ?çùçŸwe2´Íæ×‚%"çææJ&„ŠÿeÿFøµ†2ñÿ܇§KÚ¸ûÎ!öþŽmχÍ%À+E†#X^^F"‘ÀXMzÚÿkAÓ@¤ð¿™Ø*âN3Šÿ9%ûÆ,üS p»ìV¹ßçSSSÒ*ÝV¢’øÿƒ[¶0ê~¶Hü¿5Åÿx衇JÄÿ<~"‘¨jŠåÍ,þìþß øŸÄÿ7“ø?Ÿ`¯ˆÞŒc*§¨´]Ñœ)N²ÜèT*.T˜­¯º[éyQm¨‡ažD"aˆvuu0ïei§èäãrd‹ÿ9²Å÷²ão%HüO4;Ípý«D¥øüYÉ,Çí¶Œ$†d¶jÛD´Á¬í~|^u½hÀ`TQ€ø'x$r;Y ÞɶÔò6ñù(ŠPcû%Ï3¦ Àwf€‹i†ýAçÃòmQ”³ Ù³¸ë@O4[|U7¢…Ž‘¤K¿S›øŸÿ×…Í„nÅo˜óÇ¿üø¦ `öMÑñÃá0ž~úi<ÿüóBbVª ŸÌæ\Ýl”ï‹T,„Þhr]Ç¿ÙÅÿ@õcdÌÊ¿.72說²P¡`þ¡—šÿ!_£ôéM_¶ø_UUæp € @Çà"ó.„V¿–)@·ÿýÄï²ãËÿ«ªÊŽ9bý-[üÏ‘=ÿEñ)>ŧø¢hó€=õÜ  ¡¨n„üSià™@†Àø¡tŒß'ES€<¶T^*AAAëƒ ëÄ^%Zt‚úV@d‚F£Èl“½zœ,™ñ·"Š¢°·Þz KKKXXX€×ëÅÐÐõº[U<øä[.—*<än£^¯…Bùâb«(ñ?oÃ{ý´êëW®\ÁcàüyŸ‹ÿí¦2 ÒÄÿ¢£ì¾sˆÝ=­ªð¿ü½p÷ü5$nM ‰  “É #üYU ¼æ5¾Äq•#x‚•_{¼^ïj‹‚¿`aР⾿;;;›NüÏÝ Gz½Hg2Xø§\¹Ýçꑪª¬ÜAö‚˜LEa_ù|åSŸ^ßô>)ÿ­“økÅë­·ðú믯ÿ‹lÐ\c/;nV•ÝÿkÁ·[DåS.Ä Àù¼ÊÃøŸÄÿÄM„¢(ŒDsÎô«J"D‘÷Jü:PUêz(ŠÂÂá0|>¼^/fgg‘H$jî/>Öä$àÉŽOl=Hü_¹]nÝóÃ^ÝžWw«º¸(ŠÂ ©dt 'Ú<ÂÍ›^ ¢IStæÝïõJóÇI¯W¸ùžÌø²÷}yrçûy7-Tü/{Pÿ3i†þ÷â‹/6…øŸ b«ÀÅÿ€ØTÍžÊÇVM±.îÅšµOþAAQ_‘Ý€ ý»‹ôÁud¶É^=NV™ñ·"†ax8ÀÊŸs+Ÿ|koo—:ù–Ëå077BÅï€y^¿çK»JL®\¹8þ¼ë.¨~¿ßzüãÿ9=-üZ#ûø×‚ ú'þë„®ÿóËËˉÿmÈþs Ãð(ŠÂ ¼2ÄŸ‡?VÀ0ð^|õo7Ú [ü¬îï«W¯Z‹nC5òù¼GUU6š*PÛIœ"ƒnÙܶ‚…ÜVü›¯p[þ[Ý÷d‹Ÿe‹oeÇýõ×ñõ¯“““¢Ch®s]% Ãð$…!™ÅÿÀêv‹h“Ȫ‘v–±ŠìñìøÄÖA–øŸÓlâ‚Ø,Š¢°K1ÿ‹bµê:À8Ü@Æ1ˆÏ´@ÓEG]×~ç ÍúÛ­Xº^y ÃðŒ$6 ÝA üÿžhÖ±9…jßc†çkŠÂfB·â7äóðö*N„\WÛÌ>é¯ÿfbOMM ŸOáó8ÉlÀÖ¾ž¯Îi5>î(§ÙÅÿ€3ÛI¤€y«ºÀØÍŸ#cߥÛïpªä9ÑPÿÛÚýïÈ‘#%ÏAb!þoæüS>¶jŠv‘ØŸ ‚ ‚ ˆ @ ‚ ˆ- Ÿ€ÄVæ´yÀ¾õô0~üã€ñ»½-¯¾yÀªðp7q«ÍÖ2“ãs¹œ”í·WTlŠIN\ü?÷áéuµ‹îîùkHÜš„? ãýÛêwYÝâ“­•*mîõ‘ñH€Éÿ•¡j˜¥”ÿ&ší|¹QdW€§øÍ{ n&‡Åð|¿7Ã;!Ù¿Ùíh–í'n.nÆ~Å+ST•ºQèþ† j“0â yÏÓ4ÿÐ|ðªâ0Òä†ÍÚ¯ovšižl+Ü{Ôëçü7ûÕ—¿?,îw«( ëììÄô™42º&͈ƒÎîÓÌ×ê¾MÍ(L©„}=¿ÙŽÑüÈþ óø²ú®Ìø²÷½½ ²ãËjC³l?õ?ºvAˆ¢Íæ×‚BsPeçAAAlh E±Å‘Óæµð$Kü/³-Í´ý7vxÇ6ë7ØÊ4S"'AA8‰ìû_‚ âÆ®AÄV„®qã ( »ëÀtZG,¥ M¶ß  A7:$À•í{Ú2¡}O±uió€É*@EsAAAî@ƒ-‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ˆ âAAAAAAAAÄMή]»XýwAAAAAAAAAAAAAADEQ˜ý_µ÷¬çy‚ ˆFhäücŸÈ¶m–]»v1ö™AAAAAAAAAAAAAA ¡( Kƒ‰¬þ+Ù*ŠÂ.\¸`=oÿßþüH£âcQmhäù›‰fØÿÍÜ‘8½Ýªª2UUk~WùþV…ݬùŒ¢(lxx˜½öÚk®7Žû®]»{¬ðe AAAAAAAAAAAAAA„$Zd7`³è™Êϯ¬¬0…²çγLøó7"Š¢°P‡û¿Jâc·ÛpÉo`&t+fB·–‘gB·‚¿&JŒ.Rß û¿¼=<çd¼f1P…R )—bŽm÷þýûQËÀëõ" á †/àcE©ú}™L•Ô&ØèqoÄàÀxøŸÚ¿†ÿ7µ™AAAAAAAAAAAAAA¥i ­¾ŠH§KŸuk°…BÁzlýÛŸ¿Ñðz½ˆ” M¡x%—Ü$…SïÒ†<=åI¸ùA(»õó„6pâì¢Ðü®,+·œä„4î´ç\*iÍ÷’Pkg á"rdk%NnP*ψ”$8àyþ˜ýÎάfÏZ)¼_çìÑþøÎ|fgggW¶ÞŸ¯s‘Mz”^œÒVpJ[qî?ín€¾>ÛB73z!eCÊ¨ÌøžÏ%‘H«€´ZêjM%®x®od󃃓1Ïõ˜¢u¼N]×C¥R O>ù$öïß_· @6ï=†áœrÉ(Òj ¦i†ºþ*¯u"­:Mj½ß"‘ˆuà 7`ii©æúC¿}dÿïw.Á‰'p¥>€ÅÅÅ®l;ÕvîFo€ä„‹óùšc2ª8®žé<­– .UÂȦi†ÆÇÇ­±±1v8W^okFn9Û¼Û㬧€³’Õ´”»¾ÚÕ²!dó° Ã@.w—¤w9ûN†­Ña ð gù]%ÃQ¹Üa¤Ó»¬n… ¥x,†B±ˆx,u©»!øÛ #¸-~°«5êê¹ÙyŸ¹Û¹KÀsÉ(²y¦iú.کɃSÆäÁ)Äc±Æ t‰lü iÃÐ ÿÝt]°„˜™™ÁîÝ»­ò}BX†a ™ÍCÍ$ÌÚçª{\ûû:!mÄPÝ„À0 „Ãa¨™€Êk/ !<ï·H$bíß¿÷ß?J¥’|~5]ø 7ãõøü‘Ÿ7ܶ϶9s'Nœ¨»þ‹ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆjûµi ƒ¼‰yD¬ê ª;xžVKÎÌçù\(϶]=~||Ü€‰‰ ìݻ׳žV…ÃaŒŽ$1ypʹï‡B] [×¢(4-|ë/€ý=€J?È ýº† ¿·>ð½«$p‰zùÜ0¶J§ašfhWIX9Ÿe‚6:2ìloÐap?·Åâö°³r_7ö¿/þ¯’H«NS Ã0ü†BîëÑ‘æƒ÷îYéƒÚ?†a@‰Ûøn¼îº®‡æææ¬-[¶8M Ã@Æ4ñNO™¦þÿŠ®ã‘rs‘X,†‰ò:öíÛX#†™™ÏíK/½€}ΔçB)Ÿ3‘HÛM"‘ˆ533ƒÏ}îs˜ŸŸoþ€x¼|`y´î¸ëæß½ç¾FM¬¡Ý»€MˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆjØ´ÑØÛlÞ@¡X¨‘HÄrÏ~‰D,!„‡À«;ø*„°ªgËök Ðé¶Æc1ŒŽ #‹!Ùo:Ûå:w‹®ë¡d6E±€ý= š=ýÐÐr©‚Ü­ A+hP3 „Ãa¤/ ¯Û‡£vÀY¾§´ç1Ó4C~Ëtƒ»)€@÷ƒ›®ë¡÷~ö³¸-~˜¬rîA~n.°ý¿NÏÍð&ÿøQ(ñaLüð™[>Ó¤§ìP¾¹ézD" n‡iš¡DZµò9{_ÛÍ:„³¿@]Zük-¨Mp„Ãa„€‘7NKöý5ŽÑvèºúÚ×¾f…ÃaÌÌÌ`÷îÝØ³gb÷Þ‹É}û°gÏ!FQ,a><uI ŸKB+hÈæض:tȹ>11½{÷"­–œû²ÉÊëÌF033UUqèС¦Ãÿ‹‹‹¡ÏcÀºüüEÀ=¹ˆëþÎn°¸¸ài pÏ_^îùé~\ޝD›Ù"""""""""""""""""""""""""""¢W­Mí,$„°’ý&Ü— f×u=”?V´"œFòR(ØA×êÙ¯åÌ×…‚î&w Y]‡Ã¸aØv_k7³š±ºº (•JP3 dadçæ[¿ÝÀpž¯¬‰D¬H$b…Ãaì* hÍyv•Ž%7ãáÄ ÎŒõÝ ·!Ñ£#­–H«ž04$ztëUåhùg>Áà>ß tÿ;zn¶"[@&ö4Ÿ0MB!0<çåòvø?ŸÏãk_û Ãh©ÞââbèÑóÅ>yÅqÜó—‹°d¸ÿž¿\tÆ ó¸îïunßó—‹ÎøŸ*¡Í0:2ì¹tN#÷°›¤Õ’gÆw)л>×u=”Ìæ¡Ä× èvÐ|td™„Â]»Ñ¼¾ ?gÊo Ò@»å£Pâ 2‰p  ÜM´‚%®@Í$‡Â:G+¯Ãjn «¹5À•ùó=Í‚|=äºdÀ?—Œ:÷±0:2h[>¯èºsŸÁžÞ¬ßìz 7Ó´Ÿïøø÷Ùòn¸áÌÍÍA_»èy"°&‘HÄ’ë‘¡þjù\J\q—·]ÛÚÔ,ôõ¶døÿèÑ£Îåâ‹/vÆõõõÞöíÛ‡ãÇ;M`~~%UGIÕqèÐ!äOEœ÷ ç=Ô6È&Åb»wïF8ö4áMÓ0>>ŽtB¯³¶Úd€cóŽÍ[N#y‘·eðÿæß=®û»GÇæ‹µ_êH4ÒÖ6½ZœÛÉÂñXl] >º®‡¦tø†gØ¡ÖlÒ„V”Xå±êÛݰSŸ¶Vˆ„Ãì¶W°-kàÙkÛ ÝÖ‰D¬ïâ¤b!™Cfp‡Qi ÜõU{`( ØYèí&vCƒ ´uKnÆEñŸâ…7yîWâ Ô8œ0´\‡®ëmÁålèÙ¼wVs÷±§. 'ø¯4„Ãa'(ßIÝÁ}:&ÏŒ šÃWt—¢Ò`R܆ƒ 8÷ÜlE¶<à4—Ð Zù¹G€C‡°sçN,//#YÄþýû±oß>èúß–—}¾œél„V&FZ5< â1ïM6ˆPâ r®ûÒj)ð¿ûuïëë³×¯iPÇ÷Œï¤ÜºóN&†WüØÇð•¯|333ؽ{·óx4Áž={pèÐ!gÕLÂ9ö;Ù÷k/:t%Õ>ÏDËÛ!ÃÿÇǾ}ûœð>g"‘V«¯ÁââbÖåç/âØüú—ì´›|þ»ùÂGTJ|òŠãø¬ÅÅEçÎ3g:<‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ^6µ»`§áÖfèºr_êÍå+ÁëtBG7fžW3 l»Ï®Šz¿7ìŸI„ǃª)ë>ø­¿ð<¶K@4E2›(J “ž;äþÏæ Oø¾Géõ„ÿOi+¸2> ™Í{Bá™DØ™½Õ×E.#ƒØR<ó„ÿó§"‡+é´Zê¸á@$±J™A`ÞûØo•&tѬÝtA6è%® ›7 ¯] (©:æçç1??™™;ü¿v5€o•/6Óü"„î}^(=û]þL«%$Òªs^:üïÞg»û¾çŸËËËxðÁñ±} j&ÑQ=5“@&†šI@Í$œ&'ð±} «««˜™™håÓàÔÔ8ËI¾öò½·gÏD“ÞóŒ ÿìcC¢G‡V~[ í×]\\ =úÂü.Ò'¯8ŽO^qo髼Ì~ `Ó¦¶?nˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ^5ÎmwÁlÞ@&v‚±ê’l£êÑŠ€[`ÀQÔ¡Äì&ZP {»ò¹$iµå™°ïLܾÛä º#Ÿouõ5kª™ïvîÅ IDAT´[> à«ø£ý=ÔìMOOO{ƆÃahåÇ2ƒƒÈÎÍYßk‘ëô ðŸÒVÖËæaÉý!gD—?³y4ÜFYǨv7ž°Ñ• t³®»k—2ƒÕnÇž+¯ú:á=ÖÀóØwñî.í5“@2û€Jð\ÎF¯ë@€žÀ©ûÒ³èyhsâu!„•KF››ì7¡. ¤Õ’s_'áÿê×ÞïuÕÊ;Á0ì`üÜÜê½O[U}¬%tùHúЇØç˜dÖ>þÂa»Á…lT`ãFG (Ü*ï›J÷1°ººê„ÿï92›4‘QE[ç¾ÅÅÅuË Xð›ÏYø—ÿÂï¼Ë`ûÂ#ãòóØÍ¾{ìââbè ¯~ÃË­nÑ«F[ ’ý&ò§ì ­œ<ÙÄ5i±ÔVд² @u#]×CyD,õ@êÔ !o9P €«ò§ d 93Ýgó€Ž`¶ú{$³•¦†a —JaziÉ3,;7‡ïâ¤bsÁ”î”;üœÌæí}onY§BAó ýÛÍjÍ´Ôìó€üf+;Ô0 ÜcšxÀ=È4ñîòþ³‚`öÏÍ–8s7týw‘Í/zŽ/%® ™Í#б{÷îòøöÏS ÞÛÌM×Cˆ»Ûz_Ê@{.u…û‹ˆÇb¾ãƒØç~¯½;øîl›¢8Mžxâ‰N˰Yy¬ºÉðIµßך'üïn<áéËÆlK6K¾öJ\A²‡°ë{ŽTΉ²)J7ýŸÿVJø–½Û}a˜_Ä%;CøäÇ:ó;ø<¬Ÿýxü€‚sBïèþÆý'Õr!„˜öLÓS=; P^²gJ‡ÃÐõ&RuÐÕià°C¸­Î ï!Ëå³y?Ññ†œ€™3±kº‰ì}@ÁÌ>/Éà¿;Hoï' Ú-Þ”¯5$P§´½åŸõÉç ÃÕfF¯ÄÖ®%wð:ˆãOÿ›Ýÿ·í<Ì@¤ÓÒÓüÝrý§ `j&Qþ©CQ€hòèkW¯oàlxkµ…V.…V°Ãç•ðE¡h7M@.ýÕó8*Ú›i¾ùšêº’ 9$þ¯¯Æ!qXŽ3?Õ¯wÆ4án·Mú¿¾î& ]G?€l‡û#Ñ£#›Ï#“°›®¸›@äòçÛ–NÔ|¤. èáÊ~×]åg¹¸¸ÂÀ€…ùE@L>õß/Àoÿö´'–ñ×x ²g`=V|ê¬|FýgÒr=9 奃ÐÎÁôI#›4‘ÍGI„¡ÆH¤Õ ·€ìV ;É|å_MTu¯|ÔçØîdFxw_䄵v£þ週/@e¶tä;àû—…V.•ÂôÒRýý8lšØ%¦—*ñä?úÐß#Ä ô ì1ì']Õqe@´ŸVÙµÆ:òy†!›NØM)çéD­ýiâWø1€ßð€kÌíÁ:{„–YuŸlÀ ÿ•Yèõµ«Sï²÷<ÑQ}IÏÉlÞyï!,uI@]*ÁÈ@éDyŸHYOó¿×ayyËËËH$¾M‚”1íWBaØ{ðÏ5Ù¤‰\>â¼€} ªK€Ý„БèÑ‘?q ÈF’<Jª}üÇãöýîæ(É~êRpÍμ l:Ç‚“ú·,¼ìjÏà4ð?{°€ó^û:¼é7.ÀOÿãD›ADDDDDDDDDDDDDDDDDDDDDDDDDDDôŠÓt¤Ïç’Hf³ˆ%t(SaõW¢ÊN¾KÂá0vîÜ (‹X^^Æðð0àСC0ÍêØ´wÙzûq{«ƒÈ¡“l»g¤’;ü_-Õßl©„ µÞ=7ç”»éáÄ €g'{ë§´§1@7†dù¸‹'*3ÐKA‡oø¿ÚÕònŸ dÿ››®_gÏÆ¿!Ùo:Ç¥aN§€žòØSﲯŸZ¨¬Óü]ño-í­ ù¾§å¾–¿¿ —âyô½õ â±þñ[Oàh‡³Þµ›?Œ(‡ÝŸv[.™Í[j&5n7‹h¥é„[° +²IZÑ„º$Ï%‘H«ÐŠ@:¡Ûû¿L†ÿU!4MdLÙ÷GþTz\G¨Øv_¹@¹Éȳ×êØv_鄎h¹G¡Ðn¥æX§ŽMÏÚ×ÏÆÖþÝxnâq€Ó§O;ãCðyؾN¿°†Mçlêîý'ÖT!„•Ï%¡4'à^¼{±áQ äò‘u³RwS__Ÿçg3Z eך~íÆÖšA†ÿ¥T?—›L/-¡T*!38ˆ“ŠÌŠ¢@Ó´@ðR$±N¼€‹â?Å oÂ)m=J/.Šÿ§º;»/wø?«4² € ÿKWøqùúò‘¾;8ˆ7+怤iBm7ôÝs³=º+¼‰,Â0þ € ˜ûË=;\ןh¹¬Ÿ´ZÔpÙe—9Az¹Ÿ—¿¿>ÈÝ÷Ö3À÷Ÿ¤ €ŸÁÁAÀèAûv4º„þþ~À’ÝÂiÄ‘-‡ø%þà4¼çùx"­¢Àúv͉D"V:¡#£ ˜ƒvøË¸N³z\‡ÜÁ²æê…¡Ä*×5oŒŽ„6¿ùóþØt~ëäk ùDv|°ù‡3ëÆËFþ;XÀÅÀ£GœûˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÈ«å©˜Ój 0÷–,rùò§"P3 (qZAC"­¢Á_Éú_^^v®ïÙ³‘HÄêV]·-„s é@H·ï"t\Ï´pvÂÿ«««]­WÍ/ü¿ÇðÎÀ~(¬wõuBXrúx,æy¬P,®»/H”ÊðÿÑ.Ôgî¶Ãÿ=;‰,"YtËç’Èç’È%£ì&ZÑÕÜâÔB¥q€«@»ò¹$ð›?þ{ì1!Ö½®GÏ{#Žž÷FÝßÿÕÊÿut]eó²y÷‘G3„V¦ü>Kš&2ªpö;Py¯«K†aÀ0 O”|.‰¬€Œiúî»z Ãð„ö·¨4p¶qÎ>†%æ ùkEï%h/žózüVÿÛ‘h´ÁhÛââbH^‚ß""""""""""""""""""""""""""""¢W†s›dšf(‘V-y€•úF¾Z€VМ0l6ï33y@"‘ˆµsçNç¶ ÿ///{št‹ÂÊ%£P" ³ÀiµdÏÊ 83sgóÔL‰´Ø è¦i†ÒÓÓëÄŠ¢¢Ñ(²ssÀ\98¬i7aáÿSÚ €^ÏcWæÏÇ!m=Joùñ³KÎH_-ÙoB]ê|&zÓ4C×¹ܪ\9 žÐu¼ÛµÿU!ÚÚÿBËÜt=€r‹}¿aëÂ߀>—üñçqã?Þìm°îyü.„ø·¦÷G"­ÂPŠ8£ñ›ø@Íq¦i†Ô%»1Ã?~ë ô½õ ðýçqTt¾ïkYZZB©d7#éïï÷ü`µüì×!›4¡Myï—MN»Šl ¥Õr®±Î¶È&MdÔæö‡S¿X>†ç*ÍÔLÌæ!a¸ và?¨÷à ý륒s{h÷n°ò'"""""""""""""""""""""""""""jϦfš¦ª•³mþ0Ü–ùèëëÃòò2–——1??ùùyç1Ù ›dX†ÿå> ‡ÃÈ$žÐo7ÈàûõÐ4 òbvã|.‰ÜK´<ãx=2üQü§èQìðÿ)m{Œˆ3ÃzÒë<~(¬#‰V_™KiÕ€»gžO«¥®ÍBoäR0r)åлÃ0PÊ ÂÈ¥o}Æwúv‡÷u}úÚÕÎmϱ·ézçñ¸Ý=;‚xª#ß3Z›”‰%§©A¡XÄò÷7áèyotÆ–› ï­gº¶ÿý躚›› l}B+Ÿ³Ãÿ²@¿ëq%®ø†ÿ cšH«¥uç~ÚÏ5>.„ÖÄÄĺ¿ûÜ“Ìæ‘èÑ=o¹ò^(ga· X_|±s[/7a?‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¨3綺@evêQ$³@Fï5¬Å´*ꯠ ‘HÄÚ¹s'€J·ååeôõõ¡¯¯‡êhöïF”¸‚DZ­;ûVÐÏ%‘H«Ì¶-„°¾ŸJá$,h·|8מƒÞ½n!„u¡ÂIÅ‚r×Wt{µÜÁ}]×Còö•ùóqH[°žð¿®ë¡+óëáò8 Ò^ñ¨Kö¬èiµä™ ½¼ß¸›tBa¥ÆMà ðœV¹¿zÿ?§oV€É3#˜ÆtKëÏçLÄGwÛ~Ù *Ì/=gî¶·¡Ü ‘¾ùœ‰Büó(Ö×pÊ›Þ/ü ð/ßÞÓ@*‹è{+ìÇE03Î7cii ýýN\¿íó@¡(À9¨Â>Ÿ)Š7ÔŸµÏsZAƒWœc1cšP†áûº¸ !¬£GbüO ÄàÛÀ/ü/·OýPð§ë– Z$uÿÇȦl@DDDDDDDDDDDDDDDDDDDDDDDDDDDÔ™–@ñîIįŸŠE¨Kia ‡0ÄRÐÛÀþvØ~~®p¯Ó [„VuØM×õP6 ù< Ã`‡r>È6¸ôÒKcebbÂóØ5×\ Ò ]åp?ôR LJ+äï4 """""""""""""""""""""""""""¢öµÕ`éòi»à$QžY\ÑjÎNß©C‡Õ|l~~óóóÖs÷ ÃpÀ2üë~¼š{¬;¤Ül3€êu?œxœðy8F8öŒ1 c]H½z=Í„¡u]eó°2‰02‰ðº £udó=z£2›©µ½†a8ãä9kß¾}M¿Þ͘™©ùØñãÇqüøñ J½*Õ †ú…vsI;Z[(¡.‰š÷¹µôuׇÃáþ¹rðV×õPõžqî1Ù¤‰\¾Ü®µM~ÁÚ={ö8×———×€ÝAl¿±R3!ÜzAd·êú™°îÜ.T…Ôý‚âµ¶Å/ðíW³–p8 Ù4 ­ÖŸ©¼™ãÂïÌ璀ɃSžã­Öý­ÔÞÈýïê—áïûï¿@sáóp8Œ;w:3ÐÀ¡C‡|Ç6{¸×íÖÌ1QK;¯õ¹À¯~£1Í„îiö½Ðèu¨ÞÿÕÛQë|R«¾|}Z­ÛŒëŠó_ïÜ~ä…Ÿcqq1Ôê""""""""""""""""""""""""""""ª¯¥íj¶ @3ÁãFá×zcšÝžFàZÁãZã:m‚P_]wmùx½ÐoP¯µ¬Õéþr›Z­Ûjý ö?Ð\ø»Ùày³Zm„v_{w°ð÷7Ó  ›ïÅj­žÚi@ѨžŸN<òÂÏÀ·¸Ç±Qkê†3; ·´í´f3:mFPk}µÆ·»j­³z}AÕmæù6[;ˆíi¦F7÷}­õvkÿ»ùÁ› ÿ±ÍìïV– *p_no¦ ‡{L§ÇB­íò[w'û°ÙšÕëjÔ<¥Ð5ðÖ‡ÿ[CDDDDDDDDDDDDDDDDDDDDDDDDDDDDµ1 ID¿¶š Ýw«ÑÙÆ€,Ñ«œ»¡ÎF4Ña}Ögý«ßɶ½í¬ÏúYßoýÕÍçªëøÝ×I-ùœê­Ó]³VýfÆ4zA=·FXŸõ7²~uMyçÀ³£‹yšzƋŚÏÃ=¶Þ¸Ö<]ÕTôí5ÖÛì¸M»ÞÑÿWÓì¸Wˆf‹VŽŸÖ¼òŽ‹ÞÞ^ë…nÆ /üuH^ß¼ùN†êííµVVVBçŸÿYëüó?_ýêW0 #$—€•••®Ïjt?ë³~7·E^5~þ³þ+¿¾<ÏËë@å¼î~ÏÕ;çËÇNŸ> ù{«{¹•••P­åÕ—ã6oÞŒfêW?ÿFõÝ^ ߟ_)6ú½'×Ùκ6Ⳋˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¨)BK^XŸõYÿ•Uß^ï×ÖèÖv!¬ÃØÐúŸùÌg6´>6øùïÚµkCëg±±ÏXÙØúcccZßý´ºl3¯]3õ§Ûª/—ë´¾<´ºl3çŽfêË÷`«Ë6óÞm¦¾<µºl3ç®fêË÷`«Ë6óÞ­·¼ßm!„592b¹o¼~ÄS£Ö}µÖí¾¿z\*•²äOy½ÖvÉÇ«¯û­Ï}½Ö¶X–æ[Ïïþ ±>ëod}w=!„5õ?FÛ:Éå:=Ö{¯Ö[Öï<ÐNýFËwã;H!³Üëuº«¯××™§-ïórº½×këÀ$¼ëuº«®××<&^yÇ„Šï»—N[Õ¯ÏB©ægF£úÙP¨­úr¹Fõkí¿×|èÿn¸ÿºñ=§Í|ÿúϼ Î{ÿË_nï½_^.ˆmبóQ«6môѯŸúÃÖg}ÖßøúÈ™-Ló‹ëÂKg³~6inhý±±± ­onðóWeCëgÌ}þÉþ­?<<ÜÕú¦ùE˜æcž°¡|LˆÊ 7Ý:d“&Ž%77¬ß­óÀØØ&&&ÖïÖyÀLš0sfãýߥç¯( †††ÖïÖy cš¸Çlüü»uHö›È%£ ëwë<0<<ì[õêyBX÷”÷{õý–sß¾§êµk¥¾ÙoÀì7:ª/×ÑNý‰‰ LLLtT_®£úCCC꨾\G;õ×n4±vcg¯¿\G;õsÉ(rÉhGõå:š­/ß?©Ó)Ï÷oyÒÓÓ·s©Ôºe`zó´ç~÷úÜër©õZ avv³³³ëÎÃîÛòq9^.ëÞ.÷ý³³³ugÈÓ´BK÷õY#ë !¬d2‚ñ»®ÅÑÇzîo´œ¼~ôñ£¿ëZ$“‘¶Îò»×êêj[õWWW144ä|7k¥>PùcaaaÝ÷÷õZã:/Cù¨}þ_XX@¢TB!³ ±˜U}Ýo\ç[ðöi>æ¬WˆË`¹Ÿ¶ª¯ûëÐ(Bfά¬7-ì÷$¬êë¾ãº@aíß¿œ~ÝÕDmùZËõæ£ÑºÇ„{\¼X `ì׺ò¼«{L¸Çoï¼~ùµvÖ›3ëîqEÍú½½½ÖK<Žž…“xá…[œû5Mô,œÄ¿§v\è¹eå$zìËÊÊIÝ`£Ïÿ¬ÿê®/„°Vs&’ý&Œxïo´œ¼~`ÄþwÕ\{¿ýï;ïÄ·?ó¼ã¼óÚªÿŽóÎ÷?óüï;ïl«þí·ßUUñÌ3Ï´Uÿ™gžªª¸ýöÛÛªýÛ>Ž;ÞóE”ŒmÕ/'pÇ{¾ˆëßöñ¶êŸÞû ¼ü¹/áå¥ö꿼t/îK8½÷mÕ?þÉ~ð7àÅïÛªÿâ÷ŠøÁ?܀㟌5UÿßÇ?—ypæ=1ä^zªª¢tÍ›/=ò8μ'†ž…“ìÏÚw/'/]ó&¨ªŠÜKàÌ{b ?3ªëgÖÖY[soµ>gÍÔ÷ó‹÷}¿Ê|ªá¿¿ýâ}8kÿ „°ž~ú隯i£Ç;­-/æÁÚç5÷ã­î!„uß}÷á¾ûî[w£åÜ·å:ÚÙB«úøouÜÇÿÙ8.ˆˆˆˆˆˆˆˆˆˆˆˆˆØ€ˆÖi6Ø×­?zh6Ø×íú‚}Ý®ß(Ø×íú‚}Ý®ß(Ø×íú‚}Ý®ß(Ø×Í?:ªWÓ}Ûr[š­ï oD}wHx#ê»CÂQßÞˆúîðFÔw‡„7¢¾;$T};àq“ë¶ýþÎçsNÃ8ìÙ– Ϧi†2ªpnË÷w½úAžLÓ ;·åû»^ý Ϧi†„ëùË÷wÝýàyÀ4Í {•0i½úAžLÓ eEåùË÷w½úAžLÓ ©K•úòý]¯~çÓ4CSSSÎmùþ®W?ˆó€Â:²fâ-!à)Y!œ°Wu½êåäãòµ{ À[BÀ‘µæBëÅÜOpŽ@³uíÔâ2@[À9 ðbî'-Õ_XXÀ¶mÛP*•0>>ÞVýññq”J%lÛ¶­¥`¤Â*çÃêê*4Mk«¾¦iX]]…ÂùÙl}ó  +X«€PÛ{ý…*`­V¨÷‡â¾ë9r-âñ Å"Ô¥öê«K…bñxÆ‘k›úÃíÔér©”òzê´òÏ¥ìÛ€ðÏ¥RHOO;aÿêñÕMÜËÖ"úr[Ý}w°_;ü/¹¯×jà×PÂoÈÚÇž,Bžkäcù|Çž,®ÛŒfƲ>ëod}÷X3nbtôF}ü(TUwîwo“ßrîÇUUÇÑÇbtôF˜ñÖÎÛ·oG¿ó ïoöØaÝÕÕUô÷÷cûöí-íÉ4ÍÐŽ;œÏ°ZßAªÇµZÇl ×›(•(•Ïçœë†q² €{\M*Ïë2qYù¸´¯ÛÏßnàdg½i‘výòuÃ8 ÙÀ=.è&BØ¡þ}ûö­û<®>&ÜエíõïÛ·Ï ÿË×¾ú˜p :üo?¯Ç<¯}õ1átøß¾}Nø_¾öÕÇ„{\½ð¿$Ãýáð›a]¦°Ï¿ssYX—)èY8‰pøÍ˜›Ë:ç_9öÔŽ ÑÛ{!VVVêÖ ‡Ã¿öçÖu×wÍ&Mü Ð‹#ÀÖ´pîoåówkZàÀðƒB¯óÿXÍÖÏ¥R0/¸ï8ï<¼ãÖ[ÛªÿŽ[oÅ;Î;æ —Zãa\ IDATßx¬^ý믿ïÿûñÌ3Ïà¶Ûnk«þm·Ý†gžyïÿûqýõ×·Tÿò ¯Æ»ûv¡dœÀÝÏ|¹­úw?óe”Œxwß.\~áÕ-ÕÿůÁy° //Àæ‰/µUó„Ý<à¼?Ø…_|ðš–êKnÆòû¯Å‹ß+ââ/TŽùV¾^ü…"^ü^Ëï¿ÖÓDÕÍݦ²ž^ä^zƒß{#>Xz/Òç^À×yÞÄ™÷Äœ þ¦¯ÿ¬¬œt–“@úÜ+ðÁÒ{1ø½7–Cнàų̀U?³¶†÷Yöæf·lqêçó¹ºõåãîåÞgYȬ­ùÖ¯õ˜¦zÝÿügç¶lPïßßÜÍ‚úüëÈüs³ñ 6ÇÛûÕ@?ñ©O}ª­ÿùÔ§>…ÅÅEô÷÷Ã0Zk*„þ¯>þ…Ö‘çë7=p?¾þøåDDDDDDDDDDDDôë ˆ¨®zÁ>ùGžÝü£‡zÁ¾³Q¿^°ïlÔ¯ì;õëûÎFýzÁ¾³Q¿^°ïlÔ¯ìëVýZpSý‡6Õ!ávfÜí¤~uHx5·vVëW‡„z衳Z¿:$|f¡õÙ¦:©_Nµð‡¦AÔ¯ ·6 ¢~uHøp®ÿ¬Ö¯ ïß¿¿ hV”E‰¯{´›ç˜Á .Šÿ´nýn8AÞzõ»u€7~uëwë<À ׫߭ó'H^¯~·Îœ q½úÝ:”×p8\·~ç!„•1í?Öý¡¼³“†½üË[ 95ª/gÓ}YƒsÎi›²Ã^* LÕ<û쳈F£õ†7Fñì³Ï¨4phT_Q”òöšØºukGõ·nÝ ³üz63 ´Â2“öø„:+ÐV{=@¥‘Y£úÉ~»~¡`!‹uT?‹¡P°KÊF^õÆOož†öM@û& |Øþ9½yÊ ´oééiäzrHN9×Ý˺Jééi(¶V7ÏÙ/¬ŸK¥œÀþ®ò¹MÞvß?44„]B —J9ãäºÜcåý~MäïÛ·oÇöíÛc·Ü‡cO1~—ÝÇz8/ÇÈíkT_Žm¶~½&r¦ù˜3›w£úrl³õ–ªý}H®#išH–߯ê˱ÍÖÏç’ ëAžÿÕ—c›­_ïû\GÆ4‘iòù˱ÍÖoöû€vø¿Úø]×6Z´áøfšÈ÷aµT¹H³üÆÑðÿR=.¨ï>ÕMêÕ?MêÕ?MêÖïR!‡úå6ð3õ»þo¦~7ÃÿMÕo2ü¿²²’a~s s½þ[ÿjÇž,âÎÏ¥`]¦àÎÏ¥pìÉ"ný+ûû¿¿úÕ¯êÖ‡ÃVÚþ¦îù?›4‘M6wþ—c›=ÿ×›…]®ãÃÃøðÀpSõåØfëmHmXÿôGoÂéÞÔT}9¶ÙúÖ·ïoüý'nB~ö5üþSÛlýzŸ}rÇ’›q,¹¹©úrl³õs=µƒÓÕcå1è&·«Y~ã›i D¥i˜ÛÿúÆ7Zªï7¾™&BØáÿjÅbÑgtm~ã›i „þ¯vðh©¾ßøfša‡ÿ«YÓ¶Tßo|3Mäû Úþᆖêû¯Õ@6€éY8‰3ï‰áÅÜOðýá¯^÷Þ¨¼žoøHuˆþ$zN:ëËñrùï/æ~â„ó_zäqôööZ~õ3kkë¶½ú¾Zõk—÷ùÕoä¥ï=×”‰ZÿþVÝ,`ÓwŠ]øwøå<Ÿ÷´¸à{ª–¯³þ;´´„–·Ñm``KKK€;éó3Ç-ŽÿWÚ1ADDDDDDDDDDDD¿^Ø€ˆ|Uû :”(¯ÿ,e> xu°¯^}#ü,àÕÁ¾zõŸ¼:ØW¯þ™…àg¯öÕ«?<<ø,àÕÁ¾zõ¬? xu°¯^}ãȵÏ^ì«WÿðaÃù“ù#;$|Žb7 9ÛÛ C›«¥Ù–‚"CÂ}}}M…ýç 7¶ š oÙ²¥©°aÐÜ!áf¦A“!áØ»ãM… ƒ&CÂáp8°Ùf<ŸÿÚ‚ç±\n34­à³Tpç÷çÿ ojª~ç÷ç¿ ò6ªäyÀýùÿü?{«¹ÿ<¸?ÿe¸Qý ÏîÏÿV­¥Vý ÏîÏ$nT?Èó€ûóß0Œ¦êuxKÈÞ—p¿­:GÁºsNË´{=mضmJ¥RGåÝCZ%„ÀêêjGõÝ;ZeE«³ò°Víõ´#¡Ðb褚»qG=BK†ó§7Û}ä((È¥R@BÃôærà?aŸÝ×'&&Ø!y]ù0œfÈÛëQ> §† Hš¦r‡ÿÝv ]Bà°ibvv³³³˜˜˜pþ‡MÓ ý6MOýÙÙY¸ƒD²Y€|ÌÝ8lhh~¡ã£Å䄆T*…É G?ºnÌöíÛQ+Ü/‘M-äçAõï/òwG¿ús3ÆÆÆ07cøÖB­p¿¬%Ãв)Mu}ùo~õ‡?ò ¼˜û †?ò ßú¦ùj…û`]¿}î–M‘ªëçsI'ø_]ÿèG&a<œÃÑLúÖOš&j…ûe­\ÒÍúý~*„ΗÁÿêú+?¹ XùÉE¾õÇÆÆj6;’µä1é÷ï#Bëp´ü¯®¿ú‘Iüè—&Vk<ÿŒiâpÔÿsVÖº§¼îvþ}@Uí&—üNkÍHäx¹|»ä÷¯-åÙL›%ÇWÿûMjÿpv4[¿‹YÁ4h¯¾Ý €fíÖŸ„T37M+ —k-ÛŒf_¯nÕoöõêZý&_¯ ê‡Ãa˘4œà¿Ûð&1òøA“F?ˆá7L®cî1aL¾áþp8l…ÃaëÑòï.†sŸ#„Î÷ ]}ü(^~|FÞÄËûŸÿ³IµÂýî`9ßÿÂçËàuý''߈|JÓ“oô­ÿáaÔ ÷ËZc±OÆbŸö­o}û~'ø_]ÿ¦ÒØô"n*]à[ÿôGoB­p¿¬õò_¼|çü¿äsðkzsôñ£¾wßøÆ70|¯ÿþ7ã&jÍJ.kÉf82Ì_]ÿØ—6ûæ>~‰ÇïÇnFâñû}ëKnƱ/ù›e­[ʺnéɵüù¿5m¿Þ6úÓfñŒ—Ë·ë·Þ xûý¯--'ÇËåÛuÛm·"‘Ö~‘“ãåòíºû™/¢o|KKËÉñrùvmžøàœ [«/ÇËåÛuñìß/º¸¥åäx¹|-+++¡ÞÞ =zZàæåë¹:ºÀ믬œ„\¶gá¤çq9^.ï^oÏÂIœ{Åÿ…•••_}·lù{ìû,ï[¶V}IŽÏú|ovׯ½g¼Áþÿé~Ïcµ¾{¹›üâ}èÚÿ<õÔSxúé§×­_a=ýôÓxê©NÿõλN!„eÞh¼Ñõ9ñÀ<¸þ³Wa™Mà;•ûä²Ížûûû±¸¸ØÑv/..¢¿¿¿ååš9þkiæø'""""""""""""ê–¶øýGÞÙ ²>ë³~÷ëWB€ö;¸ÿèA{6bxùàÎÙQž/¸° Î`¥nýg'{±mtÇ’› Ë  Õªÿè£âòË/ÇÄÄD `'X.[«þóÿlÿÌœhX†e©Výååeôõõahh(а Ê?g©Uÿ‡–6»Ç53`PõÕ%á„‘jÕ?øåyŒ||'rÉh `”ÌZõ ¯µÿÀdll¬f ¦UšVð4õªÿðÉ/$Ä9 Ùú~!á ÎÍÖ÷ qhzÿû„„ƒ84[ß/$Ä9 Ùú~!á ÎÍÖ÷ qh¶¾;$<0ð'øä]o ì`‹CˆËà®=2ò4íSΈZÍ‚8ìF/.QO7¬ß­ó@4ÅÞ½{ÖïÖyq@¤EãýߥóÀÖ­[1;;Û°~·Îïphüü»uˆÇbH«¥†õ»uB`||¼aýNÎBØ30K?´ìýîV}>r/ëw^z'š-„°gà–^Ö(;:ªe‡½ž2Ù ¬V}wöÙgŸE´j¶ÙVëG£Ñ¦ÏBT‚Òö¶šØºukGõ·nÝÚô{Qa™®VHBÞò-×mµ×ã<§:ç"!„•ì¯Ô/,ÄcÞÐm«õã±XSïEÓ4CÓ›§‘:B.•‚öÍò È+оY ükßn|ë¤óXMy;Å” ì1Ú7í~³{VÏ–ìõv`´* ½ËÕØá°Oxz´Ü z¬là®=;;‹h4ê\;ØìØ9Îíh4ŠcÇÎq¸ÇËuºÿýAÏŠ¢`ëÖ­åm÷Éqò¼Õ××ç\;Ø¿¶v±s»¯¯kk;Üãåy¯º~*•B*•–-[œúò>wý7L‡qÎÈçbßÿ¦¦¾éÜ>gd¦¦¾é4 pÃtØ·¾ÙoÀì7pŽlV^´×[¾Ï]?‘V1:9ì\;Ø©cÎíÑÉa`ê˜Ó(À=>‘V}ëç’Qä’Q(qÊN{æJyŸ»þUW]…+¯¼Ò¹ö¹jÛ¶=Îí+¯¼Û¶íq¸Ç_uÕU¾õ'&&011á4Dì&²€¬¿«$0ƒsìÏŠþ©cÎíÁÐ?uÌià¿«$|ëßcÚMÝMhä}~ç!왊@‰4ܳ"À±'‹¾G!ì å±'++¹l"‘†(ç¾zç@ùþ:q⦧§±}ûvOsŽVÎrÙééiœ8q¹¯ï#¦i†vìØQ÷;ˆ{Ü‚ç÷–N¾Å‹ÅP>E£úîq H”JÎ òòz{[ðöi>Ö°¾{œýü/ƒœA^^o«ü(BfÎl\ß5naa"-œäåõfÊU¿*³Ú{?§4íSy¨|Ý>.ýƵ¢úõJ”JάöùhñbÑYw­úÕãZã}½„¸ •çÿ€·7¬_=®%U¯—H‹Jýœ Œ¢qýªqõ† †a Zΰƒý¡¹sÛ´š 9ÜããöçŸ;Ü/ƒÿþg¨²)ò>9Î4ÍÐÖ´ÀpΰoWp̹=s¸ÇËuõq+g‰¿(¾‚Må¯jî™ãeýf“¸bÛsì`ÿkžL8·¯Ø6„×<™p¸Çß0›ô­?û4ÆbŸÆoÿÆlö÷(yŸ»~èO®Áyï½Â¹v°ÿžÞ:·Ï{︧÷ƒN£÷øÐŸ\ã[ÿå;¿€—ïü6]Ô‡s.²?å}žï‰4 ÙIçØŸSSú1çv!;‰)ý˜óYèŸH¤}ëßu-ÆïºÃ÷VGÈûÜõ/ùÄiཨ\ʯÓ>üȹ÷ûð£J£×øK>qÚ·þ-=9ÜÒ“ƒ{Îfy_­Ïy|eTKÔÓÈ&½Í)Zùü•Ë^¢žvþºÞ¿G !,ùûAzz¿÷g†\*åù¡•úrÙßû³?s~ȹ¾ûúÕ¿þúëwß}7b±®¿þzÈûZ­/—Åb¸ûî»ûêÕ¿ü«ž|#ÿr5.¿Ð¾´S_.;ò/WãÑ“8÷Õ«ÿ‹rxûuÿt?B©?Â/>x ä}­Ö—ˆR„וä¿øà5uëËãûõ4‰´s¾’ÎO½­î÷ÏóSosî“Ë&i\¢žvîs/ÛÛÛk½ôÈãì°ò™³?Ö|ýIœY0`sõ²@å½^ýúÏþ<ê,k‡÷{­êú™µ5vpÿ÷…@fm͹vNÞˆ|>ç[?ŸÏaçäÎX¹ìï á4Ȭ­yêû½ÕÎýoïÂyÙ;þû›_³€n5¸é¦›ðÔSOáÛßþ¶sÞBXßþö·ñÔSOᦛÖ7”i‡v˜¿:øx­}ÝüsÓ³ 柗Ãÿ¯­r#€ƒëÿ½BaÝqÇÎí¥¥% xÆ´úï?XZZrnßqÇu_ !„Õìñï· ÍÿÝ8ˆˆˆˆˆˆˆˆˆˆˆˆˆ€pþ#Z^òù\PÛÅú¬Ïú¿Võí¿Äsÿ±W>ŸC8¼«þ»Ìi? øîòŸqÕª‰zÚiüs“AˆZõ÷îÝë4 þ¹•ÿ²æþO § ü,à2ŒT«þìì¬Ó&øç&Ãhµê_'„Ó~pFªU?­–œ&@0Á?7Q°Ô¬Y·Ü/þð÷á+Ûï$<9yšVpÎ3ù|šVÀäägLå½ãë{j¥þnôâ¢xk³4Y?¶=Ûoõ¯¼÷7¢¾;äµõ߉ög›¢~<kj¶ánÕB ;@‚Uiþ“H¤!·#>íöþ<ànþÓ¨~7Îîæ?êwã<ànþÓpÿwá<ànþÓ¨~7Îîæ?êwã<ànþÓ¨~7Îîæ?êuðÛ‡Õç#÷ïÕç¥zëiÆ9>Ùêvêû­§~ïávê·{.ð{µS¿Ý÷¢å3ác;õýÖÓ ¿÷P;õ›y/ !¬Ôé¦7Û!åÅ øËÿN1‚(·Aù00ÅÎÂ$Ò§Ò˜˜˜@±|~p_ß)F0ovŠvø&==Ý0 )ý»„p‚;Û}ÆÉ`ÿ­»¶xBþîñ³³³8lš8lšNPhhÈó»üý­T*9Ÿup-ïþ)ɱ³³³ÎóI¥RÎï}²!Œ¦iβò¶¦iž} ›,//cyyÙ©›žÆß~Ùnªó·_G¬¼/8cËÍÑB€ý;· ÷›¦šžžÆôô´Ó @Þž®z d€—.à僕æEœp¿ü)ɱo˜;ëz1÷'ÜošfH,…!–•åÛb)¼®~"­brt “£Sž:2Ü/Jrl"­:ë2Î9á~ù;iZ-9ËÊÛiµ´®þUW]…‡~?ü°§Ž ÷ËŸ’{ÕUW9ëZXXpÂýòßDöîÝë,+oïÝ»w]ý]%¹"0W5a© ÷ËŸ’»«$œuY«„ûå¿ \'~‹½¬¼}u߃¢ P=+² öß;‰cO=³‹rØñØ“E'ìXÝ ŸÏ9M9qↇ‡=ÁÿµrªÙsàš+4µ}ûv ;M:ÑÜïBkaa¡ÖÃMq÷ýê× |'J%tZßÜ÷þµßB\Öy}Wpß·~À·H‹¶êïß¿¿î¿™¦J§O;Çb"‘^߀©û÷ïG¢ê³H’êÕo¿ÙC¥¾ÝÀÝè¡þóo³Ùƒ»~­ÙÃËêÖo²ÙCoo¯eÏ!<Fh.„М÷0J§¼?%96<Fè1»ËVÚ4p¿a¡ËÃa\#Wþn"o_Ã0 ÏùkZ`ªLUB2Ü_=“º»5]9—yÓ ¸Êÿ¸D=í,+o_¢ž^÷ùsÃl<;‹Gžõ~Ï‘á~ùS’co˜M:ëʧ4'Üošfh¼ø7/þ³¬¼=^ü›uõCr ~õ¯àWÿúˆw?—Ãýò§$džþäg]›¾StÂý¦i†Î¹õ“8çÖO:ËÊÛçÜúÉõß?iÄ3£ˆgF=uÔø¨ç§$Ç&ig]fÜt>MÓ ÝrÆn¹ÏùÜ“·Çn¹o]ýK>qøWØî—?å±—|¢òZæ\á~Ó4CwJã®Si¤OÙÿf.oßu*]÷3+£ ù5OðÿÙI»©d³Ÿ¿r<`ÿ_”‘_sš4’žž†qø°'øÿô~ÔR}9°ï0v~—häî»ï†ažà«®ë-Õ—ã;k†Ó ‘GO>€|JóÿKÏÿ°¥úr<`‡þó)ÍiÐÈëþé~lúNÑüùdkõåxÀýoúNÑiÐÈ%êiäó9OðàÇGð ÎO½ ßíù'OýïöüÎO½ GðŒg<`‡þóùœÓÀí…nÆ©¢gá$àቄ€aȽô¼õ³øúðÇ=¯ÿÃ?ž,?ÿ^œyO Bô"ŸÏááOz^ÿ¯ÞúYä^z†a ‘x¸üOR²^u}Àÿ1MOðßÝDfçäXK®yê¯%×<á÷øÌÚŽ˜¦ÓÀ]¿/}ï Í}÷=÷¿½ ¯ùà5¾ë Šiš¡çž{7Ýtnºé&Ì0 ™Ã¹ï¹çžë¨“›À/ÄÊ—r°_öõ×ÚM̃&Ì?7ûÄòùîµ®eY^_ýýýëîkçßüÖSOkÇ¿wZ9þ‰ˆˆˆˆˆˆˆˆˆˆˆˆº¡éò?ºämùG#¦ùE˜ý~–2 ow£Ãu­úÙ¤‰ÕÜŒ¼=ÓRÐÁßFõÇÆÆ011aÏ8T¾}6ë›IfÎÄ™ûùümT_Q¤R) CÞ>›õ3¦‰ÃQ?ú¥ýüƒþ6ªŸì7q8×ãȵ·Ïfýááaìß¿·»Sÿ2˜æñ³”ý^àùã¯n“³±yûr¶ëïÝ»cccXXXpþ ölÖi3i¿Ïí™ÎnýÙÙY(Š‚ááa Ÿõú× ŒiâÈš}9ÛõÓj É~Æ‘ka¹ö¬×Çðð°3ƒb­úA€UUÇääÄã¯ÅÏRâñ×bròTU÷]ðÌü tÞDÖ/LŽÂÈ›(LŽÖ¬?ƒÏÌß@çM@dý™™ÇÂÂffþ½fýR©ä™íè¼ ˆ³ÿ'GqfÁD¼ÎóGÁ;ó7ÐyY?žÆðð0ÒééšõWWW=³ 7‘õóñQüè—&òñÚÏÿ)xg›:o"ëOŽŽÂ8r-&Gk×/‹žÙ†Î›€Èú÷Ýw¸ï¾5뛦 Ã0€‹â¥òlsA}žMhrò’I;ÑiŸ{üfÔþ< ÿpºº~õlV@wÎããã¾õÝ3ÙJÝ8ˆÏßÌù<¯.œ4Mó­_$ºsÈ ÿçï7“oWÎKþõÝ3)KÝ8Èku}¿ãªó€ÂÊT½f?´ì}éÞÇîó±üëptýyY{öåf_ ;°ñ˜gÜËmÁ3[våûÈïág)/æ~Rþ^ò{ëê›ý -ØëñìŸõç,!„%g¶–ž}öY”J%Ï{Üý}ࡇÂÂÂzè¡uß „°g¿nö\ „=[ºw;M¬®®zÞcîÏcù;w*•Z÷¹,„°†††š~/ !,3éÒkX»qýëŸuþÍÁÌ­ÿ^"„°Ön4a­ÚëñœžF¿§ €»Ž<ÆýÎ4<<ŒÙÙYS)|ù—ö}_þ%PL¥0;;ëüþY]||}}}ž&îZ©r ªQýŸ¥ŒšáO!.sþý£ºþkÒàu#/zšx‚nýFSõó¹$Ô;T!Ï%×Ýošf(|e#{G=MܵrÉhSõzè!ç;Oµññq<ôÐC¾õwìØË/¿ÜÓÀ]KþÞÚ°FÔt>ó«e…Àáèú$ÿöÞ?>ªêN†H„EÉÓR b’™”­ÑªÌ n -?B †EW?í Z(…®“!Ÿ–Z±qÒ즭ͷlÆ|JUpÃdìâR¨2Ó~íªYC0…íKf&jmpiˆ?ZM7Ή®‹`á~þ8÷}æÜ;w’F÷Ÿû¼^yMî½çžgîó>çÞ9Ïóæœ;—0ÌuÀ` ríÑÛ‘?cLSÿ55aÄn É,Ç$ìgI†à#b¹ýG«ÑÝ‘YŽƒD¥Ø1øH6Crì¶4î„PÒ*¨‚ÿX,ǃeË–aÙ²e²]S ܸ1fè6nŒb`:–ûz<9†„!À¹ŒGÔwêqÔÔ„õL÷ÖuÑ»²ªª*Ý$ôÜÇ@jFø|ü”-~,þn—+o¹±¡f„Ïwü"[üXübÜa]nL¨áóñëÙâÇäð¼åTP»innÆ–-[°eË–¼å¶lÙ’ó}hÛù\ën— cñS¹|üt¿LöZs~xL~*—ÿø×µæ>6¿^./?Ý/40‹!3Ñ ØÏõŒåð>ÙÏ2QcÿwÁÒÏ"“É8"Œá)‡Ã`  ýfÄ~ê:+ŒDx^±tS‚a$bÿ5 å¡aƒ €ëIP;^ÿóPm»Å,·í>ÃCµ‰œõœsGMÜ‹•« &*W£çž ñk>†âï·ÜVüàýÐÍsÎgz0õó‹ &*×™{jV“sýus+~êU•«ýG«'Äßû@±¥X¿õ>Pœ³žsî¿Æ,À` rÝuI$/?cLSÿΚ¬À,„B„BiB©¾“îõ#Ó=Š^qλé§1,÷]YpÖdÅÇVï£cš*øw._ŽE«V¡>B}(„ÃO>iàOu¦ð›]»9p¿Ùµ ©Î”ÿð“OÊ}­Zçòå²îˆ>>6ó«‚§Ó‰M›6aë֭غu+¶mÛfàß³ç¤ÓidÈÁ8R IDAT2¤ÓiìÙóŠÛ¶mrßM›6ÁéÌhmذÁ’_ü׼XsÕz´,lAËÂìyùaëúçÐyƒ0 è¼á—h]ÿœÏËË}×\µ5ñìóõ’Ën¶äWÿgz0mízÌhjÁŒ¦¼¿ÛÈ¿èßB‹ÿ¦<›†ÿ7,zà·þ÷w?,÷¶v½ÌXC+~Uð_SFiÝ:Œ„ZÅß¾]€ðÛaÂQÂQØõ³S¸.{ka×ÏN>ñ‰O„“b%{˜iˆ?oÔãåû*;½oÚîÜ—=œÛ¯3Æ´ÖÖVú;v {÷îÍyÿóÜs§‘L&‘ÉdL&ñÜs§sÞÿìݻǎÃÀÀ€¡ÞÖÖVËóBñÿ?Œ96lذaÆ 6lذaÆ 6lذaÆ 6lLÈ@L¦¸ßzw1a_Lœ½£à&æÉ꺠žáílÊL·˜8Th+­£ÌàD__ÚÛÛ n`5A_®Ó3ƒ¿óp¶ƒ%XÁM¬ ´ŽÖGGG ‘J¥ n`%P¡u×ë?F¿R¼ñ¾˜8\h+­ÛX/ÎKú¹$2‡V#1À>ŒìßšyÒ;­«¨2™ :::¤¡Ð?0¿È ¨~\&ÁÎX<…Œ™nŽ’„†&ËŒU!ã@__Ÿ!# Mf«þBƳ}3ïÉ.s}ä˜ç¿€Ç áñdgšd¬ú r¬T¦ëÐdþ±ê/dÈZÎÙÄcÕ_È8ÐÑÑa8ÿÔåÔ_@0ç÷#û–ìãá]‡Xì[0 Ÿù»ÍÏáE¯ìãƒ>¼è…y,|8™¿Q^þ%TWWª««Q^þ%˜ÇÀ‡“ù›û9bè•í~æ=@ ½0|(™¿½^//‘}¼ÛíÆàà%0€'ówçpÇze½pÇza Næo¿›é^ÙÇo¬÷é^˜ÇÀ‡“ù[´ßÙÇWTT€±KÓ3×OzþT~ŠdúÓEHÙɤI AmáâÕK¦?;|/øŸÆpŽ @!ãÕKBš¯}íŸ üf0PØ8@õ’éÏÞ{z üH"× €q€ê%Ó‡cß,P ¨^2ýÙôñøÍu °q@ÞºéÏFß¿Y  6P½dú3~Öx "qós²qà3ú<¥‰sh>—j<þ´âña—ÕýŸÒr9rà­’qãdhÓëOÞ*)] 燋íFQ}н§äú¢ú*Äb»¡šyEÓëOádh ‡Ã —Ë%Ÿåwî܉%K–ä´eu|ê7-@ý†hG>Dl¦Ìn/. ½7£sävöWŠ Ý===2Sw,Ã3® °zÀV/Åÿ©7SH½™’j›åœ;H¤ˆ  í&á?Éñ{zzN§…áb8!È€ §§ÇPFíœ#£««+'f“ÝŸƒJæe:6Uœ<88(ËšëJ§Óp»Ýç$2¦weee(++ÃÐÐÜ–ÖEQiE544$ËšŸq^|ñE”••YšÓŒÅ/ÞoT¡¨¾ g:³ÁbŠ[Îtöɲâg–‡b—µ9R~þh¡hÑPV|H÷€z/DC1Y¶;â7ðÔ{B¨oÁϾŒ1mß¾}¨®®Fuu5žyæ¹bšÛžyæYvß¾}Šçòîƒ1¦p‰wy×{€ýY Ù§¨}Ëþ4dÙ.ãqRß5™gÿØm!+惌ïÚ+3'ÛD ¡m±ÛB˜ǰ¯º=Ù•û6ÞµWn VÌ—eÍp¹\())‘m-£§§===X¶lÑ{{‹àñx }€ÇãAoo‘ÜwÙ²er߸Ï*++QRR’·²‚y Læ$>KÜ_UU%·›ë›Hè=>q?ñw+Ç{nÂp!ôÿø­ÅýÙãÏÆŽs†ëBïqùóˆû%¿"˜Kn››ÑÜÜlYN5  ñhcc£A´>Ùk @š˜ù­LòñOöZ‹ã?lÉoeÿø'w­H€~ “€¼ü0vh‹¼ÈD3Юנ]¯Á±?;æšL>À±ß!Ëf¢|ðÁrÛ¥Ù—Ì9œNç„ãÿH„#è‚> –Ìn£w}ê;¿X²ìˆéù7ÊCÃçôîŸ1¦=T›ÀÒòZ,-¯Å¯NtÉmkç Ÿð«]²ìCµ ÏÃ/ìÀŠÊUX;oâï^cšöèc˜ú…¥˜ú…¥øà׿’ÛNýÃ'|ðë_ɲڣxÞßó¯˜úùÅ8ýõ;ÎmüÑ‘†5¾¦lÿäÐM°è€ì“mÙLÈj}ÁG¢–&7cñ÷>P |âï×Ùmô;*ŽÆ¯!Ëö>`|ÿó<€Y¾xIî÷©´¸§è^›Ÿ8hTC4ª!m‚ÞI¯À,”‡²ï™V`–áÝt(äû’™ø½ZðX¡ìškð·>ÈàóëÖ¡3Eg4ŠzýǯH Ÿc­Z…+çdŸK­ZŸcÜ·>’û~~Ý:¹ïßú|(»æKþ•+W¢¢¢BþÎåñx°yóflÞ¼[·n Äû]´›6m’ï%`Ó¦M¸è¢¥rß­[·Ê}éw‹ 6 ¢¢+W®´ä¯¹|\ÏÔÿûÍh}¶­Ï¶¢ea !Þ~j=\3çÊ}×\µÃÏ]#÷mYØ"÷­ÿ÷›å¾®‹ç¢æòe–üÅ‹—¡hÎ\€#ðwx¯­ïµµbF“à?yÓ-ØuêZL[»E—eù§­]]§®•ûÎhj‘û:'÷-š3Å‹­ùKëÖá¢9WÉ{ýò¯=„Òh J£- tD7±XŒ+ð^ü¨Üw1®0l µÊ}/ÿÚCDºhÎU(­ËþŽ;cÆ?id³råJ¼û“aÉïñxðW§Pzô8F?©álGw7óúww‹w•£ŸÔPzô8þªó”¼þ½þb¼û“aÃõWù dÐVR‚§<åpH!¿*ö×®ÏmÞ´}¥¦É}Ûôq²j00Pü˜òlSžMãwþ@öýÛ_^z!Çà‚«¯Å…Бćÿß{bÌåB Ç0Å¿Â÷½l.oeÀ2oÞ<Ì›7°}ûvÔÖÖbÞ¼yò·'@ˆ÷¯¾úk¨««3¬¯««ÃÕW ª‰€ÛíÆ¼yóP[[‹íÛ·çpXáâþ·aÆ 6lذaÆ 6lذaÆ 6lذa£×€„þBØoüᎱ;€”p¦Gj.Žë.ÿÞuæj& ú7%XS‚!¦gx‹%58kôìKb‘п½½=‡¿½½]N–DU•`°Püܯ ûÍç?Áš,•¦T‰ãW…Â…à÷z½H¥R9ü©TJ:¬ È,Sê³…àoâBØoæocLNÞŸæLÓ³P‡GBÿÄ@.b€aG§˜µ£3çb1Ñ—ƒ…⃈Åb9ü±X Ç ÇùãÇ£¡¡PÙ±¦`ü„‹ãNœI‰OÑΓãîSH8kΦpÖ08k˜ÌÈòQ¡ªª CCCrR­*’ø(@m{Jÿ´§±X £££ˆÅbˆÅbùHù—0ù¹¸„áw);à\¼éç’p.Þ çâ½H¦óÌâûÐÐЀL&ƒ††444ädv%Bœ“fÀiø´Fnæo`r& æò¥áç¬2“31—¯««3|ZÁ*Û/09syµíç…Eæo`r& æò$ ¡O+Xe&gb.¿|>­`•m˜œ(‡?<`ø´‚U¶a`r& æò$°cdæï—€KvÌ’ë'kB¢8s¶[Ú ÑË:·ÚÆ c ÿU4ã ôú‹Ñë/–YÕ6^¨8ÀÓHt£¢ºún)Ȧ,¹j/T`Œi$üWóõ‚GDæm¦¿¡(иÓl61:ú)ÔÖÖ¢¶¶©”ûªm¼Pq€1¦‘ð_Åͱ^ìá{x6K°ÚÆ c ÿUøà@ÄïBÄïBb@ð«m¼Pq€1‘EžŒ¦$4oll”Ï[j?Ÿ8@¢ýÏ +Ú ¯os¦eÚ®^³§´lã3hÞ*)Ú/öž’1ˆZò=ƒZ¦íï2Ò àdh@ÖY4Îc‰ö].—í—••Iѵwó8€–iû¾}û¤AÀÎ;eãƒh¿´´TŠöKJJdærjoæ~˜–i{ âÐt:-ëϘƒDûŽRHÑ>œŠÙ˜oT¡šº,ãQ„t‰ögëTͬ@¢}ŸÇ#EûžÏùp "Þ'P{3÷ôLÛDÜÒ  ~CTÖ9–1çÜ/Ž#µœ5),`õx"õá€7£sP¾ ÕƒN4qŽ&α<)Ĩ-^zCšáØøiqÞK½ˆë×i·5?)àid —¸Nÿ{[/×ßßžžðöv„taˆsðövôôô ¿_HÿßVö½D¯Æmª ‰ÿå ÄÂTÅóþþ~)0VË«b{U”¬‚ŒÌýõ3CCCòOýž*?}o†òjlËw“1@Àd¾@ãœ3}òOp–ñätêB½ì")æUËLòŒHcw&‡¿;âG4“€ü'ôcI÷X‚1i –WM|Akƒ 20Öøÿ™gž‘€¯P<£kBæ¦ åU€|âr20&‘øòý5õ'¯è§”Ì=Ê«&ù fÈÀl¤âùß>ë>{Á€ Š" ÿï£c.›Ë“øÿºÏ^‡çû¼åwAii©Á€@Æggç˜Ëæò$þ/--ð»›|c`“Ðûnµ¼¹ó;˾¾¾ ƒHè}.ü5ïäº].øÒiùúúú¤0|lq¸zŸÛñ/‚"^\iàÏ ÃLJëBïsâçÆ>á@F~†+âpƘfÎ6Ÿ/S¶ºLϤæç¢w­é:Ô ²ÝûÒiG·E,1_ãñøÇ7×±E0ÿ•Õ¸`¾Æãÿ8&úu`afäÁÁ-2Ý›¯ñ¸üã˜8N-ÍÀ±ß!ÿ€‰ƒýÜ4Îû9ÿ’øNjùL4#ÅþÍšŠŒf2cÿÇ’€x^§çû³ºöœÌ½Ê«&+0 V c³a ‰ÿu¢KþBð¿û˜è‹OpqÏí>“FjyÕà“]fÉOÆž{røµGÿþ•ü„à¿øAa´zæUÑÿ?x¿4PË«&EeÖƒl28sï}¹ãîˆ4«¡~‹û8XRœÿٳŠe–d²_TË«&ùÌma Ðþ£Õ9ü½ Q?ýAˆ%I8¯é~Pó§³FJyÕ <7Ü5†1ÀŽz`c§Ñ€wÙsÙ\žÄÿ;®š:/ðÁ€Ð5Ž/~zÓMc.›Ë“øÿå>ÀUS§Zò=zW\q…Á€°yófãñ™b³yÙ\žÄÿW\qŽ= + fúárVL­Ï3„§]:æ²¹<‰ÿ]ÎJ fúa…3ý(rWLïµëÛX»dÌesyÿ¹+qfÀšÿÔKi\xµÇ`@(¶–\<æ²¹<‰ÿ/¼ÚƒS/e»š1ãÇx»JĬ£Gâ­§÷ãÝŸ Ëëß]¯àä¯g£ôèqL©b2Cz¾ë_%Ê=Ž“¿žûîz€¸þïþdo=½ßpýU~f±þSãPäî˜6æ²¹üdÄÿ$üWñ3÷Z|ÐÔ‚šZ0ý)ñ¢õäÊeLùËK/àÔãåÔ§–9_pÎo½õ  ^49Nâÿ6ˆ—\o½õ–åø­ ð|=ÛÁäwëá*|äw`;øzŒí¹(A¢ýyóæIѾÛíFRÇÒÒ"îiŸÏgØ–i{2™”sP¶oß.ëo^ÊÿÄýoÆ 6lذaÆ 6lذaÆ 6lذaÃF!1®€¼‚~2„€*"ÁO!~ôÌ'èW' 5%˜A,D‚ŸBðçô«“dÛÛÛ õHðSþ|‚~2Ää{U,Ä xüù~8%c@ˆÔIh4Ñ»üùýê$á6ÆðÆûܰ­Püùýd ñ*"ÁO!øo½õ^Ëõd M mƒ±E?ù öíf$˜¡÷»yÞ1‚ÏãÉ]MjßnF,3ôïÁ`0›Fóá݇²“‘c“îƒHX›5ý!ˆ yªHN,6¡™þÈüG$Ð$ëÂÅØéD’Òt 1£q Çô‡ ‹$dæO…ŽêØR½I@¦Š43 ̦?2ÿÙÃ9Ö(1¢Ðq€ ½Èô‡@æ?¿ áDVTè8@÷™þHkî£&(~’8Ÿ>W:Äÿd`s‘ÙšÙ €Ê‘àr¥©^svf1~8Œéõ§Pì=…éõB¸_T/û'C(ö ᬊ ×È5àn!þ?@‘WÔÀP¿‡¨ÿ^²d ÊÊʰd‰˜È_]]òòrìܹeee9c~Šf3€ŽŽ”••açÎ(//—ñ@­_½Ô–••¡¤¤D¸Ýn0ÆN§QRR’3æ¦öh6¨­­EII Òé4c²=ªõ«cr?hNˆOðé‚ýýbýèFãõ§xd¤nÔÅÿûõý}¢Nµ~õ™„úÏúM àùœõ›ÏÜ>Ÿõ¢ð|Η3æ¦öh6ˆø]¢ž Qø|ÙÕúóÉÉ`ã§£XŒâïÄ‚d X=. ½!…ÿ€ƒ´1†(c˜ŸLÂÏ9üœ£*|•¬o«u°z &%Œxך™Åy¨­­ÅÎ嵎2†ç!ÄK×éåüœc~2‰K¨áKù= —§}£ŠøŸÐÕÕιƒsîèêê’b@ôU´LÙëHØÝßßoy÷÷÷˺ÌÇTYY©·oîèïï·4àœ;b±˜¡)++“Ë×èÙJ©]tuuÉÿiÙÊ‘Ž—ø»ºº,M8王ãNÃ8¦¨¾J.Oºå:@@éZ¾8î´ä§8#2¤/²4àœ;j )ö€P4(—;ÓQ¹&ô?-ׄ–ü~=ÎrÎ Æ,M8玺º:C?R]]-—IAq¬½½Ý0ÆiooG]]%?Å9ι£½½ÝÒ€sîX>È cýë=Y3™MÓ²ë±þzEPÒÆ–æšsÙ~†sîhc,¯ cLóû+ mÄük<…6"X1ßPW²M/&³¢—„Oˆûÿ>š½$Ú´É6£/X1ßP¿ß_‘ÓPÌw»Ý9FË–-C í² ^Lѯ‘³³Sò÷÷÷#`Ù2c–Ù’’Cý}/Ccß×ìÁy__ŸáZŽ%î'3ªª*ˆö0±w“á'Q8‰ûÍPͪªªÐír¡fpвì䎑\¶2PÍÄñ‹ç&벓à×û`)î7C1¨ªª’Ï ,Ì”w8ÜAåǺ†ÙìöL 0›477ã«›ÿ·uöz ÐuPùó‰öU“€šÁA‚Ÿ®ƒñø­EûªIc‹ ï_ѾjÀ¬ ü™LÆá 9 bízM.S–eúd?g†ÌËìç ΙL&'þþ˜sa0É8îdÌÒ€sî( 3û¾ rYO|Ž ®ùkJ0ù?-—†­ã?½#äœ;šÌÒ€sË/Åþ°´¼V.¯¿v£\úŸ–oïò[ò¯”ü»Å,M8çÇ­·H±?LýÂR¹W¶Ÿ˜Y†Ï•-‡ë⹆ý[¶ ó†_âàë¿”ü‰N16O=ºTò|ý—è¼á—hYhÀ».žk¨Ã› ü§¾‰©Ë–cÊåe˜ºl9Šæùg4µ@‹ÿ¦ëâî6x¬ÏAk—Hþé?-þo˜Ñdä/š3×Pÿé†oøÿð-†V­Æ±Ë?…¡U«qÑœ« û„Zñê¿ÜŽðÛáìñëãχg¯ÿÛa¼ú/·c$d4 ¸hÎU†úÿð-cÚð𰃱YP¯ÿEýƒòú¿üWL½qF®¨@:–í2ßõŸŸ8t:‘+*0õÆix%ø¯òú_Ô?˜sý‰¿it+5Mþ™±RÓÐ4:Š’D‰ä'ÑùÝ1Mò—$Jd]VuÐ_Óèè¸ãß³ =ò“þ„È>hjÁTÅèáäÊ1ã­_À^põµø ©¥ ¿Y€Oÿõá¥Êÿ+UŽOÿõ\üÏÓ¤ß `!À7 GS ‘o‰²‘oަ”ÿoäÀB½¼¾/_ŸûìÕÚÚŠÚÚZ¸ÝnùŽ¢®®n·Û·o‡ÛíÆÞ½{ ßÉéïýÌf{÷î5ìGïçÔú[[[s¾ÃÿÔý~WƆ 6lذaÆ 6lذaÆ 6lذaÆ #.È·!;ACLDÑMÞ+›}!DjÞ­ÏèaBàÉþIüBØë A ä÷»¹Æ’@¦›ÃYÃdùBñ“ØR[Hþ@ …€ƒÊäB³8ó|ù¹Ÿc&¤ Pòs—B@$…0xJ“å ÅOÂ^](ùN§ HÁšY|¾üMœ)”ü!] ØÄEö°7¦qÌ™ÆdùBñ“°WJþ¹œK!àŽÎ2‡Bp.Þ ³ø|ùƒÁ ’ó:q*ò&XøRÃýGB@ +F ƒ¸wV%î†ÌÞ7é‰òÔÅÿgR" 8÷f€‰©½ûòÔâÞ²Y&úˆŸÄÿgS”†K0ù³Á‘ð?_柘…`äÏ( ³Ió“øhhuuuØ·oŸR{Ï—ùÎåraß¾}¨««›4¿jì1¥ŠafÇ;$$áþÓ³÷p°ªÉ?‰ÿGGGǤÚ{ii©e¥¥¥ˆÇã“æW3Ê..a84Êñ;½6ääËü÷}ÿÅlòÇOâÿôsI,à@Ĥž„Ú»ÏcæÂçñ`c½ËÓæ'ñ&“M& µF þ}[Ö³}¿þŒåšyp~?Š€œ¾r¸ùŠê«dMÀ'²a¦úoxê0[4îw`,×̃–­L>Úü\oûFyh'¢³ cfárߟñj¸Ü÷gôâ㘟ÿ P…:0£±±Q¶ý%K–ààÁƒ 3þž8qåååŸ'Äo6óPÇfp?—mæJöo_vyæ›@ $1Š u `†×ë•mŸb$™q˜ ± ‰…'Äo6óh☖mëæmÔöç:²Ù¿?£,“ègÍb-U¨c3ün.Û~ý¦èÜvdÆádRƒÏç@.„ƒâ7gó£eózZGm¿ù†p´>Ÿ~»Œ13œN§¿ŽÇOßáÝ@gR@‘,oΆ˜íÿɤPq€1¦eº9Φ²›Ì¦?dÐæÏ‚*X‰îe9`µÿ§ç€BÅƘ¦öù€ï«ãz(ý¿|(P {pTÉše «ý?=*0Æ4t„ IDATµÏta¹R’Lš”ç€BÅƘ–9´éç’rY€L&~wÖ¤Pq€1¦utt “ÉŠÞ-ž+dBÎ'´1¦A‰­$ÚMÿ›Îš8"Ì>‘}yZ1÷èFæýT#@”¥ãÖűeã ‰nOv^ˆ¢ú*œì~Þ™Ïü0Šê«PŒS ìÝŒ-wg0½þ”ÜïLJìÝH {~øÕódE¯Duu5<(…« £ÊžÝÞÞŽŽŽÙö«««qâÄ )ü'á D³**•2ð“èzhhn·CCC(++“†ªÑF ÀÀÀR©jkkeÛs»ÝàœKá:Íd—J¥Œç?Á4Žìõ×®ŸŽ4 ùôO÷³ÙX3z†á¤0%Ý(Œä~ÇCýÙãc ãõO 0 ²¢¢ÎBØÐ¹í6Ö{ѹíˆ4' F"nìèL!1Àñ»dÛÛXïE2©é ^©?1`-cŒi‘K"8Â;a~t©÷ C&÷õõá‰'þ„px¹a;™ôE^ ˜$£ ¡x8׬øÕ ÷‘@@Š}!äWኦ€×°ü¶²l. p@iã*?ýßß߯ÙgÙÊÊJ·9稬¬”dÕ0@­kÔ”iQ߇L4@Üߪ¹íOýsjkk üªáŒj`:ƒAõ7º €dMÌûÓ¸ä]dôõ‡Q”ºÅÞS8ºÐ`xd4>R®eª€[Ù&Æ;jœ›uá\þ„Þ/‘tËÏ9RG’ð.ð!uD˜;1€j ò'ciÔg½bh2Ðà ¡3E8ÎÙŸâ Å¶ÆÆF{†††r O­ø¥‰ ÕAïM©~svYÚ¿M?þëõXÔÄ9^ñŸî^©Ê5ü´âÿUº¥¾7¤~ÎlÄ9w$ǵØñ¬hŽ„üó¯Ì×B²- îâHGMJf;®üIŽG¢2Còük<²<ô¾˜Fã]{a®ßܨm‡„üdÐÓÓƒeË–É6¸ÀW §%2õõXN£¿¿•••())‘åÑÞâñ8Ìõ÷ @càƒŸûœåó×Áƒ188(ï ¨›3Öç«Û,h …ß$Øÿ0øU3€\ü^å-úÐøU3€èÂoì(üŠ Þ/577)FÒËHQ9Åæ^xÁPN}V?óÃÂét¢¹¹Ù²¿3Õý¡ñ×47ËûÊ—Nç|ÿøs2¸ò£ç7ƒG¹¨?ÿ¬Y³´áá×qIßë`‹Äø!s½Þÿ}Éô ú%.TÃUüŸ6e^þ1ç¸S˜àN§?æ<';3ÝMúsyЗ}ßw6LñgS¹†ßæýñ^@•>«¿Šú9B¡aÀbÿÝÇDiø¯Ä >ˆræÂ >ˆµó‚Ò@5 Pùÿô_¯ŽM߇L4@˜ ´§¿—³?{ð~ 4]àúëw`ê«C(º¼ g^Âé¯ß!TÕÿÌÐqLý|6øé¯ßöàýbüñàýÚû¦g-Î?K‰ÜÇ1{öŸðÇ?~³gÿIúu!¿j ò1ßèû €Æ}ÁG¢`ÈÝŸÞËô~A¼ëéõCe€6d4|T Tþ€á— /^Á/&k¸$"Í´ÔýKÃLkóg óšÂBÈ_® ù£Q ¡ÐŸÑMÜ{Á6êï›6g!Š”|Urèåž+PŒÒ0ƒ¹~µÿ¿êH ·“ÿÊ9sÑ(êC¡ìsA}_Y%<þ8:Ÿ|áx‘@WΙ#ËÀ¢U«pÕºu0ׯò÷»ßÕŽ?.·“Ÿ„°›7oÆÖ­[±aÃñ,{çlÚ”„±yÛ6ìܹ6l@EE…,›6m‚Çã¹~•çÑmÚ໯Éí$äwÍ£¹Ög[Ѳ°K.»_ÿ%n¾êf¬¹êGï­¿ÂÍ/?Œƒ¯ÿK.»®™seyXóÎzÔÿûÍ0×oxîx@;ùFv»ò_&øßkkÅŒ¦¼wÓ-˜þøc˜¶îL[»EvtÄ}»ÆôÇÃÉ›nÁŒËæÊòpfízþæúUþOÝ—ÖzßxYnÿTâ4^ý—ÛqìòOJ£-8jÕÛ@pE°Wà=Åz×!tâ(Âo‡Ñë/ƱË?…Òh‹4xµî¸ükÁ\?çÜ1cÆ?iSž]ï.ôàÂæÅx%ø¯øtì«øîß•×+¶¢äOŒVhèîæ¨©Éý»»9***DùOjÀÖìõ7ׯò·-ôÊø´­Ä(äÊáÿŽ¢-Q‚)Á4Ä A ÷¸iƒø_–Ä>%%9õõ~ʳiúšZp¡²L&Yy#¦?õN®¼\}-à›nÁ)Ý(â‚«¯•ËÞt N`m­çü[àX¸Î<ŸÖ}ùÂñ 2L1,wr!â§Sò¾ò?a!€gL3­O›ÊOx'ôPÄ9w´´´úo|ãÄ3~]]|/²wï^¬^½­­­RØŸL&±oß>´´´`ïÞ½òA]]¤ðûöí²þ–––œ÷ßýîwµÿ‰ûÿÜ®Ž 6lذaÆ 6lذaÆ 6lذaÆ ccJ¾ V?N©Ù¼_ìûFvƒšõÓ»Hí:ï/fůfónö(YŽ•¬ŸAŸ±äùk[ñ«™ûÔ Kªø·ººÏ<ó̇ÂoÈæíW6(âß™÷ï|ç +~5kÔ‚ äz5ë§ÛíÆÀÀ€yׂð«™#+ëÕŒ`+Mb“Bò«™¿Ì’ªY?7Ö{±£Ó:sòdùëÿ|£¿ÅÍ[ä®â+ÿ§w§ßrÛ¹€D€ïLâ~lÀ‰lð;@"¿á|2“gÖHdââçL7G¦›Äÿ½þb”†Käd«¦“"¿¬ðOÿW`ÊCØâÕ¤xø\øûúúÐ××gÿwtt€2æÑÄ[ù™….—K €HÀu.ügûxŽøŸG„чÌž`RägþÑz +>þ`0ˆ`0hÿ×ÖÖ"KÑ_*•’"?³ð¯´´T H<|.ü‡FyŽøçX\¤è¯1)ò3 ÿh=<}N÷ß¡ÕÈZmÿGü.,HÑ_b€I‘_ŽðÏã‘™GI<|.üèèè0ˆÿÑÜÜ,E±X Œ14ßpn¸¡KŠðÓo7âÞ[oŽ·U¢9ü1´_Eä0‰Z&ÂïÓËRûí_|¯;Lb`Eà HŠ1€¾ŽÚQ}Õ„c™y¨~I L–Ô²BàûqbpÐçë¨ý—‡†'¨?W/t_“ÐO-K_@`({°*¤Ì¿á§þ\¶o,!b€ZÖÐî“b  Š~]ü;Áã'!/µo +ì"¡¡Z–Z€S¦IU€H™‡'ÂOB^Uð󊮕 ¡©ZVm÷¿C6{5 Plæé‰ð“—Ú7)&¡¡Z–¾€Söâ¬1›yx"ü$ä¥ö @Šc±˜A ¬ |Óðà×ÿ±Ù˜þоR„ÝÜ,…ucM|4ˆÿõ~_fßN ¡m2úUä:Μ ~ÿS¿?÷Þ«Éc~â4æÞüs  ˆŸ„7ÔŸíÛ·pâÄ 444 yÅ?äþ"¿YüOËïû™ù¬ÖYñÓø‡>U¨çŒLÕvÉc"S²™ËjÿÅq§áÓX>ûÄÓ¸;£–èqÉ[%LÜ™\.«uü5á„áS…_¹cZÄïB(Dg‡¸ß}A|A"~W—Õ:+~ZЧ Ó8Tëèè†)@öˆš%ž`µÎŠù 3|ªh2ÿ]Üo~°‡ó.ó:] (êJ2twG|$ _S¾¦b·‰Oó¯ñ ÷ÅtŽèQ-ïk !øHÝ݃xÒ*ªæÁ`ét===èééÇãAOO‡ú€´)>ªå{zzN§  æã=¨cà%Ï=‡—zžCÙ#È10çÜÑÐЀöövlذA>“°\·«ç™Þ©UUU+<-éñh”~<þn— å¯Qúo•¿Û0†ÿ½ü^£Œðãÿá ó«cãñ+ïQ¢Ð…FáÇåð‰ó‡™5„ƒólæy5›¼zÍHxNÛ–.]Š®®.Äu!i,c•ÆFÜ×òC)>§ñ+ÝWæû­Ûå‚¿zÍÆãïv¹0?ÝWtŸQÝœ¶äW¯ÙøÇx\~º¯è>“ünͯ\³qù#||~ý¾¢ûŒêvÌšu.XúYƒŸà 9 Ÿ*8?’-çtj3¼ Há¥GÓàÑ4ÔŸeTèëÆÿ¥úy( çÆÕ”1¦õú‹ô!ç7€^qNü·ZgÅ{—ßð©bí¼¬!#cLkô܃¥åµxºÿIÀ'/º Ÿ¼è24zîÉá²ZgÅï¸õçŠÓ_¿ÃÀæÞû0õ KñÁoŠÊ*PTV3÷Þ—ÃeµÎrüQ6|ÊûŒç¿ýG«@ãÄný`ûVçpY­³âŸÿÍÓ†Oê{`Ƙv—.î'™}¹þw×%‘.ó:Ý €xÇœéÅÓF4ª!Õ°³ÃWyèÏ8ý¸4£$¨å£Q Oc™îQƒy…UÿO†_áx™pøÉ'Ñ¢3Å¢U«Ð5Ž3®œ3¿ã ~òIÃzµ|g4ŠÃO>‰ÌPë·â§çÔ;w"“É`Û¶mؼy36oÞŒM›6aóæÍžŠŠ ?~Û¶m3¬WËoÞ¼Û¶mC&“Z¿ÿÁ× @ˆó»)ìyùa´>ÛŠÖg[±æªõh}Ö˜ÕÞ5s.ßy {^~ذ^-ßúl+ö¼ü0º)¨õ[ñO×EÛÓ SžMãýÝã½¶V¼×ÖŠik×ã½6#Ñesqæõ×ðþn#¿Zþ½¶V¼¿ûaLy6 µ~+~ÕÜ¢»;‚‘}»PmuëPm1òÄbFà ÂQÃzµ|i´#ûv¡»;b0Ï þ3~Œ·«.ÔgÓ_°;>ýO_°™Lû¯~Õy ¥Gã…÷‘J9P;wµºþ¥ÑYH¥xáýA”=Ž¿ê<…ýW¿ƒL&c¨ʳiÌš5KSùÛt³«¶’ÒÇöO9Ò0Æ ê ]¯Á±ß2HüoÞ÷ç†ú‰_Ý—Æ(fñ?-Ÿzü1LmkÅû›*ÅþU胀ÿxAüs€“+o”×çι㭷ÞÂóia°ëg§ðÖ[oMº^Ƙ6zûhN¬dõ l‡Òÿ.4í·ƒ ñÿBïÃXÖTží``õÆíº €\Þ¾};¶oߎÚÚZ àØ±c9ßu¬y&ÇŽ“⪋`ÿ«ß᣼ÿmñ¿ 6lذaÆ 6lذaÆ 6lذaÆy Hí2ˆüËf߆kª¶‚ÇBØ£”U α¤fùûÝ[Òà³F‚Õ²ªaÀùà™gž‘Y±1«§§Ç ¬ªªBcc£¡¬jp>xç{BÌCà>$ŒÁ)UB¬–å:þƒÈßétâÈ‘#`,ƒ×ë5”µšä=<¥Áµ+Ä9Á(œ3M‚Õ²M'ƒ)ƒÈ.çØK‚ÎÅ{áwsCYÕ0à|p÷#ý¨ìX#—††† Á††ƒAüôÛ¨\/ &‹3»²âwŒ-Bw„ë“ï|z_”éx«ï:!ø«¯ûwîÒ…Ãçþ£w4 )þ‰Œb~â4öìÙƒÆÆF¬À,´ù9æ'NKáßå¾?#ès <4ŒòÐ0¢QQ‡Õ¤«‰`çÎRü¿oß>444 ÓÍ1…ËåBcc#¤ð¯¼¼ÕÕÕX²d‰Ad%ü™ÈÌcJ•žÉ=̲çß§·ñ0“bœ™7f…3oû¿ó=káÍDN§¥ø? ««Kò—––Âëõ¢««K ÿcp»Ý(++3¬„G‰Ç—0h‰ÿ3m| crÒÿ\GVø§ Ь„gAý†¨ÿˆ¸N Êëïóxàws„ƒRøçó9°±Þ+ÄGŠi<áQ>¤Ói)þß²e ÚÛÛAÆŒ1ƒA´··# ’K^Ä™{ŸÅ½·ÞŠßù¼8ÑÑ‚»¿Óþô#¼È9ýCŸ”®ô÷Eõë ëv¯CÛ—æÞubÙ Cû+¨ü4©SíïõDFrÝÏÊŘCmûdþô9ðjòãRìKí¬ òÓDzµ¿§Œ•´.ðΗÀÐöÍ™IìKí¬`8ÿº¸_íïéúÜ¡fÿÖÛ¾úÞC, ö?V PùIT¥ö÷”‘˜ÖU—ˆ‰¤jÛ7g&±/µÿ±b€ÊOâ~µ¿ß¤g•!£Ÿ×ôy×jÛ7gžŒí¬ ò“¸_íï)#1­»Ý× †¶oÎq@þ“Øßó9ŸÎ•ûΦ¸Ý×k0 9Ÿ8 ö=$ò!Á ¨˜v¿MûGƒQH!â€ÙTLè\®aÂ|§1¼R%Lq>{ýÅòÐøËlÄf®?^££™¨– 8uáÎ"œÖ3s‹ó·H¬pâdç…(ª¯’âÿ±ê7ÃlêA&$jmhh@¯¿íííRœQ¯¿ ²íS›«~3̦dàv»144„®®.ôú‹‘J¥¤A Dý½þbtuuɶGmn¬úÍp˜7ë&ðŽ4P²C\g–`S¦›2•ì`p¤Ey)þ«~̦d°±Þ‹ÎmGN ¢×_ŒÄ“€õ÷ú‹…9‡Þö¨ÍU¿ Ƙ /Y4½k#¾Âo‡Q=èDçÈ@Äšç_°€Ì°G}}N ’Qx×Þµ@àt@~š8çÊr8G8—Bþë< RáÛáuàþÙ³÷Ïž^ŒÁÏ9*õò´oH¯2€ÖÖÖ¢¶¶6¯ ‰ýûûûåwª­­•ÆépG0‰ÊÊJYOii)FFFä½YZZ ·Û ·Û-M_H„œï^$1) LȬ$ ÊL€±X ÝŽ»—Ç ÇA‚h.ÞûȾ§¬¬LöktlÔv¬øIìÏØ"¼ñ÷Ý@F79Œ‹ãNtG8’Ñ+ÁùaÉO†IHõ CD¯0!™^JŽ«HXZäµ ×ùIìŸ` Ý!<ìŽøåõ­ 'ÐáEÅý@ü^Ÿ©d ÉX¾ ^Ÿõ !Ô7„¤iHx}Ö_€sî ±{{»íÛ·OšÖÕÕ¡;±âcÿ`xÇIfGƒƒƒSÄ%K–H2½/-//ÏËObÿ6ÆpÀ%Æ\\šþ-ïj¢Æw|ªaj 8×iFï çæô~FÔÔ„ YŽç_cŒ,ÉÐûbó¯ñ v[ÈPÖ\ž%™¥€r,Äb1ÙV€Üûµ¿¿_¶3Çc(k.ßßßoi a8‹1ðXætÎûúúd&z@¼W3ÐSª0ÝJü¯ ÿ'ÂOññø©N3·Ë¥dƒ7 ÿ'vü‹&ÄOuæÿaÈlð&áÿ„øuAô¸üz9ü.³Á“ €*4'Ñ>ÕCèõòxá…äXÕª¡vNŸ–F¾tÚA&f~Õ`,þ ƒ¦|üª€(y¥ƒLr?k0öñ/‚ù_5‚ƒLrøÑû˜üâø¼üª€ŽááaÇðð°2™ŒƒÄþìç ™¨è·2Ñ ØÏ¶l9 gȉúR·W‚ó#RÈOÍ´Ã.Ĥ¿ƒúsÌzü%a¦œs‰ý› #úû°‘—¦¿¥a†-[¶àìü6üÆw¹o¯&gái 놀Ãòwz¯H¿^î¶¢çÜAbÿÝÇbx¨VôÅÕ&°ûX kçq{—ÝŽõߎµó²¿±üõǪðÿÙ‡?ý×ëøäE—á¯?V…•«°¢r=÷È:©l>~û?x?´G… T{ô1?x?Ný8n½ÝŽC—߃Ó_¿CòO¹¼ g_™¡ã(*«À”ËË0õó‹1õó‹qæÞûdT6?õUd„@ØpGMMXŒüâ·Hâ>Eì¶á“þÈ€úI³iŽÊ/Eÿ‰Óè}@\·ÞŠÅ²¿ó¿y?ø;Ž'NŒfAˆÿO@ÿg)w]"Žão‹c3ÚGæÂYS"ï@ˆýU4%ND?ŽòП±³ eÍå› Îëñf^þåË¥`báx¿ã \9g­Ze(k.ŽÇá\nmV–—ßé4<¿ªï#ñl|üøqTTT`Ó¦M9Ϻjù;w怌‡š¸W ö!öWqðõ_bð×àš9k®Zo(k.ðõ_¢&žgÀgz¤`bÓ g^ E—ÍÅ´µë eÍå§?þÎ.Ìÿìi…šš°ìÀ±Ë?eØ~;Œ+ð^ü(ã „ß6Ž/Õòó§óŽ?ÉæíªËÄwý‚0•s:_°_ù¾Û†ŠŠ ìÙs'¸Hüïú?pÑìÙs'***ðÕØ6l|å;_°T^ªÿíªËpö«ŸÃOX̘ì0ÿ $QÇ~´ë5¹¬B-ßVR‚Å&S=âŒÂ³øÿ”éºâýß;ÎoK€“+oÄÔ¶V)ô?õøc˜ñ÷È}/¼é¼÷ÿ}OþMꉂ À¯óϧu_Îcˆ90Æ4¾‘£ä¡Ãw3¼§Ü‘5Pÿ DþϘ¦Ô™§|¾cŸ7oža™LêêêÐÕÕ…Õ«WãÎ;¡¥¥Å0Ϥ¥¥wÞy«W¯FWWêêê¤ø¬ú­ðQÝÿ6lذaÆ 6lذaÆ 6lذaÆ 6l|¸ ß!“E„˜GöñÝ‹}ßÐ'ÄŠ2ï2`Š LŒ12|})ìoÒa5{fa~â´.Dv ÓÍ &æ “á'1VuuµöÓ„ªeË–¡¡¡AfÁ¢ vd fœ,?eêœyb@‰Àübâ•9ÛÇÁsæàÉðÓ¤mr[w»ÝRð¿`ÁtuuɉÝ$F'5£ádù)Ã×JGÖ Mß¾BBeÞxŸcËš´±ó?~ÊÔ¹±Þ+…ý‰°•|#èA81(³yf­6˜¨ 'ËO“ߣw¶#à+ÿ§±QoYYÚÛÛåùŽŽi@"ŸóçÜÁâN À€ÈúÍœhós$•Ä‹×TýÀmá]d¤`ðL*[h2âιÃY#&v5%D¶—Òp ñ /Èr©´`ÍO0dBYÁàÓÉì¿Éˆÿ9玪ª* Èfý®««ÃHdTf#Dfð@ €††ôõõIÁà3Ï<#ËLFüÏ9w°*¦1@˜}DDû6Ÿ×'á…ÎÞÈ € “ÿëB ÈfýŽÇã9üƒƒƒp:R¬A‚A5;ÃdÄÿœsÇb}b_ÄþÅ,÷ø3—5L¨€ “ÿsÎÎÅ{5€!@ÄïÂòð@Îõÿm ˜ !¤Œ¥°£sâYGóñ744ÈYLhnnƩț˜Îÿˆi¿Úà?e†æåËèˆuàë×Ü€¥_9€Ÿ~;›1ŸàOå¢þ¾¨^LL=ÓÙ§·Ûû58¿M‰;pMÕoñbßgM5%EY]ð«b¬@üm~Žr]ì": Mzÿ®foós4µ·ÃF9uOc+’³¤àWÅX1€ø±dÉÀÁƒ¥àEÍÞØØˆÒp;¬@“ð­ÄcÅyþý\ŠêÞyBo·~Ž™jY2=òq ÂTQxYÁ¯Š±bñ{½^yLCCCH¥Rðz½†là^¯M‰œÎÁA#e*¶Žˆ¿‰s)ÌyMïÛ8Ç+žlÆé&.Ž&ˆ\7 IDAT?ó”Ò߀f->+¿ßÍQ¿i sÛ$ünnÈîw‹ ès9ÇgMsJE¦b¥øp¬@üÁ`PžÓÁÁAÄb1ƒAC6ð`0ˆ9±Špy'¦ázdË ù†ð;Ÿß> ²F„?ðŸ@Â4aèuØ š%¡ƒ²ÏÇpÞq€„ÿþ;k„¨ór_v"5Mˆ½öZ=ûÒ ÑÿŸO îÿªª*ttt„j †ïˆ?À &œK á¿Sªx$€¬ÐCž8ŽóŠê8È Çb±‰+å6Oÿ3 Å~*Î%ðߌÅ% {”xˆñ¾ÊÿVLôÿçHøO Q±sñ^Dü.ø#špB\Wyý“¢ÿ?Ÿ8 šÎYá?=[ªçé™rJ½†ÎN!a-P óFÂIR’©§D¶C&ã1Lë`.ŒY˜ÕúÆ„"œ%!íÉÎ …˜¿s`Yžbï)œNe'<Óz¤úP\ï6dá6sÇx,S…«$d=xð –,Y"ÇóÄ£fW×J9õ…‘‘”––‚‰{###2¾Ðxšx¨?6󌌾›¹¾± ‘¾V8ŽëËi!æ×’F21ók#<ú~È­o,$Óiø<ø|$“’é4:·Aý¦úxšIêÍüÉtõ›BèÜ&²ÓšëëHí"kXŒ¢zP´;þÙ8ó6Ä3ÇÛʾÀòåp8@³«ˆp!<Úøézéî„wm*'' ˜ººº ŽÇÑÎ9ž‡òÀ%Êÿ„Jýú÷Qñ¼EùvÎÑKA¿nØ’wÃøåÕŒÉc¡²²R úésÙ²e–"ÿÑÑÑœv–¯|ee¥%Ÿy \WW'EäÔh LÛ)Ó|__\.WÎvµŒU¼!ñÿGÁß­ŒSÍâÿæø+5Åÿ D¹ÿtñ?A½6ÍÍÍCFzB Àµ×^‹ææfÄãqY¦¹¹Y>¯Ž?.ÿooo7d¹onnÖˆÓ—N;²‚| Fº˜ü5ÍÍHz<š¸®tpþ{ÉßܼèCçon^Áy¥!8x”gùÃþñ7‡›Á£\3߀0 ÿ!§–‰fà 9Áù47/Àþ6Å”ì¡ì¿”}™>/Uê\"Þ_8È,`,¨÷bi˜i#ñÎÅïï~n½õV¼ôÒK5ó«ú3ÿЍòì¯÷MzÖësínïòkÕ&p{—W—ø°ûX ‘‡ÕÏ[ÿñŸ}XQ¹ O÷?‰•«ðð ;ä¶ÝÇb“Üz‹væÑÇà¸õœ¼éLð~cÿ§(ÙϾ:„©Ÿ_ ˜úùÅxÏ¿â}[ñƒ÷OnüQÖº»#¨© #™LÂçóåíÍâwíÿüo2­÷!úïõ‹w@7ÍÉòߨd—VNÇ,Ç¿¿x;C¡QK‘ÿ‰èdzϞ㔧߳Ç=Ÿõ¡¥Èÿ÷o¼ÃO>)×Už ÀÆÃ† äØ>·nÝj)ò7gÀ«<鎇%—Ý,ýôÙ‚K‘ÿà;¯aÏËËuc•_rÙÍâ?yÓ-RÐ/…ýM-–"ÿ3¯¿†÷w?Œéúº±ÊŸÔ³À‡^±|×IŸÝ! à½øQÌ\C8*×UžLPŒ8­ýåW¯ã¼Ž³ ®ÿv¡ºxñ{b~E¡®¯¿×Ü3Œî?ºP†Kú^Ç”¥?ÉဦÑQ)þ§Ï•œ£­¤DþþÚõûÝ ý©¼Š&å} ñ“ðߌ³ =ø ©*×lj[+åý_7pfèŠÊÊ ûþå%ñû4 ÿUJüOqìŸøžOŸÂu`×ÏNaÝ—?ˆW/“â99û$` STŒÏš¶oäbnÀ7r£9€R~¬ïtìØ1Ì›7O¾C8vì˜4ý#S¬7ß|@vN Ö;v ô¾@N}ã᣺ÿmذaÆ 6lذaÆ 6lذaÆ 6lØø0×€ñs}² p¢löm€kª¶ãžÃbb+ÖɬX5a}ŸüÈ™@!~‘, —HÁõ–ô0zý³0?ÁôÂYðgϬY³¦`üf?M‚€žž)ºîèè@UU•nBÐ^0~ñsýø§T±ì$R‡Åº)UzV¬ðØ.ë糈?KAÊ‘#Gä­n·[fe« § Æ/Eüº¨xq‰˜ ‡ DÁkÃõà˜3­ðÇ/Eü☖‡0WçßK#¢›l„ ‘ E¡øIÄ‚ó..aòþ#1*Mìkhh@ä/¿B8¶´`ü¢1iÕ,þó…~¯Ç€ÏêÛÁ™Î](ª_'24iÅ,þ«úålIKñ_b@d÷ é€ g™ÅþáôôôÄ;wîĆ r&ížhÒ®Yü焉ÿ’Y“«¬Á“…*Qùï=À‘#G¤ø/•J!NÃãñ„Qç ÊÜ—#þ ‰ ŠÿÈ$Ä*kðdA™Íâ¿Î¨Ûci)þ{m@d,íÜ™d0C}Ñ}w½‚oýèÓ¸+óŸ2ˆÿÒé4þ)xûÎpÎ$žñ &GÞ¡ñN±\T¿Ðç²'ÞõfÀœà†?/ö}Vÿ Q ï< x× ±Iô+SUÃß”`}ñPhÐû¿Òp 2Ý¥á9‰Òëâ_‘ý›¡³ôýS¼¹¢ß˜…&'ÃYñ···Ë;G¬HòëêêäõP h P]]²²²sÎüKü,Á4êëgÞ@OÚ3¥ŠálŸèãA“H+ Ì?ôìß\ìƒ\Ñ/|ÈÁŸJ¥äñ{”l¹ñxÁ`ñx\þ¸\. JQVmm-Ün7JJJÎ9ó0ñ·1¦Q_¿Ré½–2¼!jÒÏy×0!¦}Î9ó´ÎŸ`tÁnçÎlóËÃÈòayx~‘tŸõ ñ¯ßËe¹õ^‘ñÛ"ópb`lñ'®Ð~õü777£££ÍÍÍr‚?‰(û÷Ù m¿úgüÍ Í8ZÿÁ„MÀ éªßüoÀËŸÿg\w¢¯¯³g‹6/*4ù{cì÷’‹ÔfC!!þïëëéï]‹Ò0Å7Ñ~ÉèË'îÇÓ.Xøþ÷¿/?)‹æÁƒs²o’L|æÏ088X°8@mvæ=¢½÷õõaö³E›GV¶*Ï¿BÜP 8@mÖãñ ‹¡¯¯ßúÖ·7M"'þgF)XØ£·Ù51ÎíëëCïìÙX\’;‰>™æÆ„ ¼Pqàê«ÅÍòÒK!8ïE__žøÞ*,³ÈÓõ(9Étº`q §§@ÖX®¯¯;wî”Y? gû8Jþ„ÿópÎ T±>ÁdÆ"&¦ç7e¡íŸÑÈ@fŽ U¬H3¢“‚±E²~Σ(u¡4àü0š´}xgF™x«p&%ê+ògP ä§WÅú€0þ²f@Äoe ÔDÛÛÛe=T׉'òf¼V¡ŠõÈ gdÆCüùLyÄö”¬‡ê¢ŒèãAë|ºˆ? ”(×—û9𤠙ÑöÑR­269ŽëõŽÃ¯ŠõÑŽ€¬ÕoeÊ£òû¶Ïç€ÏçÂÿ¤¦yŒß§váb§4²ÏmzöK”ò”Q®•và†fLAÙ{g X=HCÀî è0c=cÀ·Q¯×¯/WÂ(hJ0†K8—&QÓõUË'3„}ŠÓ]]]Úxï 8祜õú°#(X>_c>ô÷÷Ë÷EùÄÿcñŒÅ‹Å4u|úÌhw/ý’qtuu!#Hñ¿z¼çÃÏâNž1öIF¯$}WÂú½Èì<àïÌHñ?Äÿ“å¯ 'ÄùשһŸ@HˆþGÿ $&a€§ò×ÕÕiœsG<×`¤ü‡Xñ±ÐKüÐøC´··ËñO>ñÿdù—2sîˆêÇÏc@ u­úñ·1&ûÿ|âÿsâõq+æ#‘Á°÷ÅtÎöÞÓ˜1„DÔ øWËûýˆï=zTVV¢¤¤D¶)Õì…¶S@Ï ªà_-OýÅxøþ÷¿/Ç{ê0f¡WÍ1üYè­„ÿÂhÐúZL”¿Ûå’uO„_þ× –'wü‡Ï‰_þ‹X L‚?ÂÏ_þ³03( kC×G5°Ê>OëõõƘf6žU÷mnn†×ëÅ¿øEK~º6t}T#€ñø»].Ôè¦y“å§kC×G5ÿøÅoaçů_º>ªÀ¸üúoAçÃo…L&ãp†œšï/Ð`ÁÆ~tÜ.ÌD:n¯DÃCý`l–88˜ÉäˆÿïdÌ`*p.àœ;JÃâ¾L ˆøí™ÿ½·Ž£¸Ó…Ÿ±A†°jÐ"ƒÑ—— ÂkfÌ 8WŽ‘bbÎfÆ6æ’øIÖÍä1Z‡€¯-'8°+Kbƒ™É.X ÖÞX<#ˆÄ‘F’'F «dÈ ä~ÿ¨þUWõ´¤™‘îû¾ýœ£3šþ¨gº«ëWÕÝõˆéþ½uøÖ·ÅóX¿¿ ø—:<}¨ M]â†{<ñ¶ülÕ­büñâóüŸüû±óRq“¿ ü;÷#çŸ6aæ½w㓇•â‰ÿ³å¯¬ œsO ãŸ> ëã a˜SwÏsh{$UüÏâS;ÿeßõ_õÿÀµùxiT<¿4JïGñÈñ0î¹ 2®ø?ÞÆ GUÈ3ß»ô·\(ÏŽƒý-ù(¬y×·äÁAMð¯n?áhs0L˜‘P_ °àÞ{MYðèQ\qñÅÀ7"h‚uû?Œwrl˜k×®EQQ~üãÐÍDh½š€6æS·ðÁSöŸ K/¹ÅçÏÖw…¸6yâHÊúä‰#(ž=k| 4Á¿ºýÚË¿‡ä‡úþ“áäÍ·bæÅóÓü3ÀØŽh÷¯'o¾çüáf^2çÜþ-œ4Á¿ºýhí÷1v43þ=Áœwñüõ£byÙáßkë#Dð¹Ðåøsô]”‡.Gä‚ÂÇÃr½ºýïïöᣣyòó/Á`éŒ[·þ¯­ù)®z`ï þË Êg³¬ëç Žó¿«Äkåb»Óßü6òŸÔù $Ö'ÿ+½ùŽGàùµGšŒG³Þ…©Û×3ö=ýÍomâý. õ?÷£púZº»»ñ×O=‹Ó׊±õÙæ>ôüoöð?âÓ}{1³ cý8yÃM8·qN™e¨eÎZ¸xeê/gcÆe—]&íwÜ6 ¿ýí)Üq›eˆi®Ÿôþžðñç?Û. ¼ë•Ô8Až52™”âšü¡f€ÀÀÀ€ÌŽ·cÇjb¿ººº¬ù·ÄÿNç}â8XŒá„)ÌQµ–| Ç?44$ÅÿNüÉdÉd^¯‰D`Œib?¿ßŸ5ÿ~Xâ'þaó²’ØLûÕóì?ÞÕ%…}NõÿVBüÍã±^†V)Þ`IöüœsÙ÷tr‘]ô~ÇšÜ922‚‘‘„B!´µµ!°ã*4|õ«šà«ªª*-~êë!Þý04,2v—ˆxÏKÌï|“ÃÞqSôKæÀ‡øDz“©¯„ x¸C´é¡ˆ˜À5Y•œ2)½ŠAÌðÒüãzä£*àÁõÈ734¥ÇOçzË–-èîîFSS“Ì>²}ûv455I$V3ÿ^wÝuR ›.?õó'îbOâÀúÎ2I™§XšLôO?™‚પ*$ i: …H$¤ €Š¡¡!äææj™‡KJJ——7iæa•ŸúùW `çˆhÓÅâx;‹ÅwUœG ìÒjæéÌ80iæi…Ÿúùêµ-Þ¹±^†Îˆ˜<Ö)A¬—I*ñ®.ø® h™‡×UûðùÌÌÃéñS?ßÕÕ…ææf´µµÉ¬}7nLÉòG¨ùif.­Å—â§°åºC`Œ¡¨¨H”ŽÇy~Ô‹_úg)þç|—ÿ+嵮 Gc#°LX®*}Ë¡ÄÌâçÜã­d¨©±Äÿ{‚98uÿ"”™YûчÖÕÕaÑ¢EÒ(ápZ3¦˜ ?ùÉO¤ø¿¹¹;vì@mm­äŠŒ`(2‚~CšÀ8Ýd8瞥 ³°Äÿ<Â1÷¥¹B2Áù‡Óœê ã]s>ŸOŠÿ—/_Ž»ï¾[N:ñ;O¦q€sî)ÏeXã±Äÿ[9Çž¹s±†M|üÃ)¥e8çoùsØ·¯FŠÿ#Áb¼tÿÇ’Öÿ[Y 3œsOmm-–-[&Åÿuuuزe‹&œœñFNEŽá,žÄy/…“¨/›8À3vŽXëæyLÁ¾íœªí§"É´Ou½zžíeíI 1ÆŒCVmÎô‹LÚ9~ñ‡Dw ÿùQ¯ö©­OtË}Ï­>%ÌLˆ1M*?õñPXXˆ¥K—¢  ò:Wùir²*Ì£õ °téRMü¿}ûvGþ’‘1†‚‚äææ"77W¶•ŸîÕ{AZOm077ÚX0 9ò«¢@£0|Êw/` éåÖ= }ªë!e_Ÿ(À#ÎõO},To1|×à»& Ûvý™ÆªA­§6è»&€êï-6Åÿ‘’qÇÂÑœ(ü·[߇aùE42&û]zAâ¿ß/'šÀÛgÏFÌ4 ¸.éÅî@ B£!Éq¨ºÇôL1…Gý€ÿWÊ™h{2l¤ÏtŸ¨Ûy½^ôôôÈû°x\\o”]|ddDž‡\[Æl¡ò“ÑŒŸL8ç²ïIÇô"S~ñ,c‰ÆÄ-Qo¢'[M!†¿4µ°)òÏãBì¯ò¿Ë("ÞÖ…ÖfÑ?ª|ŽåM…Ÿžs¨üd‚ˆØ§Ž}¦›ŸîóU~2Dߣöýé‚1fƒE¨**CUQÚV× ¦f::"Dc@ÏâKËèS]OË::"¨©Y'²"›eƒEŽ1Ðï÷˸]\\Œ’’yïEq^åwêh=- …B())Aqq±,Ûþ´Œî+úúú´ûÕ¿ýÛ¿ECCƒÖ¦ã>ŸQ™LbãÆ²ž2å§}hYGq1&âï(.F «Ëü  Æ–@ÿ­~Ó?~Ë,@ÿ® ùÅ5u…àoÁÂLð›õ”1¿¹äð‰ù#¨™Ô“ 4ñ>ç»ÁØbyF÷bœ‹û.7âòñÓãĪ^+ôœß¾}ò 1Tïý§›anOjC"ù·ï½=¸ý2qŽÿôÑðjÈÈþùó.™vþ“7ߊœÚ¤õcGcô;æsÛ>|ò›€™EÎN?ƒÅõþ·gs4&¯z¶m«…ù}N'ÿž 0ƒÖÇ_£Ò(ºw …p0ÆŒ¡ˆýWij¥ÃñüêU«VÉ}ìYÚÕõ´lO0‡ãùHtA–=4Î=ЇÆ×|-@ÁUWÏ™ƒß<%L4¿tÇôþŸ–ѧºž–ýæ©§ÀçÌAÁUWɲ<ü°#ÿƒ>ˆ¢¢"á†nÀ7Þ¨CÚùi™jVJëiYWWn¼ñFÜpà ²ì|БíåßCñùóP|þf^É?88èÉÏ¿Œåƒêÿ7~†=øk÷ÎëIbç žUýï<Áq^OÆß½…=øk¼ñÆÏdýŸ¾Ö‡šþÁ£òÛ…ú7všãz2PùIð¯ ÿi=m¿“sÙêGF$?çÜsúZ>÷£¤øÿ“úõøë§žÅÙ&|þ76Ð;>Ý'ÞMŸ2Í ÎZ¸ŸûÑ8ká"¹.[¨c³9s„ÅÎ{ï½øÂfißiýD㹩‚úW¶™Kœwþ-¶™ië'c̈+/uKJJ¤‘lII‰4:8vìc¹MÀxÖ‹nZèÐ!¹/•CˆÇãŽÏÔø÷—¸þÏT¸páÂ… .\¸páÂ… .\¸páÂ… .\¸øÿ7Ò 3Æ ^2,'ÓŸõ¢`îj¼Óý]l®Ù° 2œ}¶‡Éøé, „BÁŽ_>ž)“_-Z„5kÖœ1þí۷ˌߥ¥¥…BX¶lB'n ²C{+ÏÜñ“0…BÍæ»Ó3}þC¡œÔÝÖ֯׋ŋãºÜè_„_©”ç2ÔpŽrGÌùmgš¿3Rß5â…³·ü9Ìãß­òá΀Èîu¦ëãÆðz…ॶ¶Vf»«ÿ«>¾ËÀÅçL/?½¨&ñjDö_»pàÏšâàfV‹ì›$ÞÉ6 ñ“øJ_X‹W1˜"Œõ qðõf Ó Ç/ML˜ ¿{¶ýþY$“É`4E]]Š‹‹±téR Èl¢êDêløµó1ŸMÈâ¦88`šÀ²,Û…ÿÃ"û¯]8<< ¿ß¼¼<`ddDŠÎ²ÍÂèÄÿ^˜èo¶˜â`Êd XbUL˜ ¿Zÿ­-BÌga¢O ø|¨þÞbt½—ÙLU1a6üG?çñ·'ð«‡~ÎyŠ2µ3ÆÐðÕ¯ž8°h= „祗IdÛ¤|}+/ÙÀƒëÚž§íï²D/f»‡¿4£À3ÔI6d0A^8uuuÈë¿Ï±íï æàÒÀû Ûý¥÷3ŠŒ1Cø“!ÀöíÛ±bÅ EFÐøÁß;¶ýææf)ö£v¯fN'0Æ UàO†§»9f”Šø¶pnûžÒî)K/^ ! B¡¢Ñ(ƒ±d…cÛ_¾|¹]Q»W…§éÄÆ˜¡ üÉ ³Xý49x›sۧ쟀ÕîÕŒÖéÄÆ˜¡ üÉ 3R‚Šp/†"#X×j8¶ýH°XŠ ©Ý«Ó‰Œ1C°O†”ÉoÆ]øö–fǶ?ã.üýü ¤I“×ë•ÿO”‰•âLww7æÞôy‘ÍÖÌø£ÆÞxÜœø_sW•>žRN¶q@å¿è¥‹‘Εüjß¿wï^,Z´¥/¬ÅÆ®TA¶q@åÀŠ+$¿ûO'<˜á7°í÷ÏʬíözÈ&¨ü_À\1¾ŸèüÐÒ:S9YÆ•Ÿ2‘NÄÿpg»wïNáÏ6¨ü\<å¹ÿ{5ÀÎÔÃÏ:¨üzé&T„{'¬ÿÖoKôgTþ^xAФcÆ©È122" øìüÔ«”ѧØùy«Íâ׿º˜sýSŒ9ñ¤aÊù§qÌWô¢Yujýï\©mS½Vˆ˜ífòú3ïŻތ£? ô› IDAT"ÜëÈOýxë]ˆä-.…?4‚ÿv ñ4à¿]dÓ¤ë·ÑóBTß9€Òðy~i‚¹ÑÚŠÏÍÀÛgÏÆkÅø.é•bþÅñìæ­#4B4'*µ}U ÷Vä¢2,‚| çšñas\Ý@û«ÛÓoG£‹ÿÕsä÷û‘L&1<<Œ[é`còòòÐÓÓ#EË†H$d< …Bàœgô;h¿ÞÞ^$‰þp´yyyhoo—íŽø©¨ã ÎyJ;˜ŒŸ— ‰§ÀØ])üš'ÀØP,MQÆXÚxêT䘌[™ðG‚Åx¼­ GKá_[|â~Mˆ†»ÅƒÁDìy§K þÕõ,adQjjÖÉå••áÔ¤ôööÊ1~OO#¿½pâ'cŽÜÜ\MCíÁ~ŽÔ1°} Ê2¯f¡§>“¶---•&zãÕ9‰Àíü2¼²nªüºø› Dà©Ç¿Ë<7K´2§vüŠø›`ŠÀSøÍë\]7eþqÄßôŒ€&0§ ò4®_´h‘\¦ŠÐÕmÕëÆ^ÎDõ?]üêuc/g¢úŸ¾ã·®›Ôã¿þ§_¹nRø3ÿ¼^¯ÁGwÿ 0¶ÿð ý Lí=æñ.FØf4vƒa`©¸ÿðx½^ƒÖGÓÌ&cÌØÌÁÆ®AÄzYÊqïù—ÿ ¿OèFS×ý’¿#”@?OâÎö`Füc?ŠÑßìÀ¹/>ŸÂ¿d×ZÌœw)rþif¼!îÆ‹þ÷ôá̼÷nÉ?ã.Œ€gÕ­ñ7=²Ë–Ö!¤ð³ŠÌ_7_<èëÚV× îžç$?­gñÌÎÿž{r€Ã£(‹~]ç¸)‡}_䂈¶nÀ#ÇÃ’ŸÖ‡‡µ8Eb¸40ˆ6ó½j½rt÷ÝwãÑG úÚš÷Ñßr¡ìsÕõ€%­ ˆë`Å3HììØ1ü»)Š +?jÿþ›§žÂ_ŒƒGJÁ¿½ÿ§±ÿ×pS ƒ;—bPøòË/Ë,Öjfkµü®®.¡¯¯OÞcÚùéÞ·¨¨7Þx£\îóùRøIìot"ùáÀŽ?XËÕò[¿úŠgÏCòÄ)ø·ó/½D,/>®)¨Ë«uK ?‰ýà“×;1vTðŸkйíåÑ_bæ%ó0ö‡#Rðoç?yó­€™ÏÃÙË,~Oèë)üêø³àåçðÑÑtƒ µü7/x޾‹Ï….—&v~º¦Ï»xn´î±ÆŸöú¿iÿßË èNüéÔ?e@éÊMZÿ;•~ã#9µü‘àŒ¯ðüÚ#Mìüª©€jPÎRŸAbÌ´€ŒÓ×ú&|þw^Ç#8õ’u]Î;¸ŸÔ¯Ç,³ÞÉ`ÖÍ·ÊÿUctÁ3.ºè"¬Zµ 7Üü$®¯àENލߋ.ºHŠÿiù« ¯¼øMlÛ¶ ï½÷Þ„œç\~Žññ×?bþ ÞðuhðM€ý\¼ïTŸÑh9ÿžPƒqËfŒjR xüqñnaýúõrÙ~°^x®F<GII z{{°qãÛxÿýñÓŸ–Ëí7lØøîw¿«•íõ¦ÞwÖ׿ .\¸páÂ… .\¸páÂ… .\¸páÂ… Ó³ÒÙHŠÝBÔkËl¥Š3ÎHr8žÄ!Å=Ut¦øëêêÐßßþþ~-£íåð™âçA(b‰óï÷ûÁ9Ù´ÿâüõœãˆù}ží4ÿ%øƒ%ñ¸x|·–QøËÔUU†‡‡1<<,M$µà? <ýü4ÙË:¿Îâñ[E†ð±Ö8fVß!cO ƒõzl^zoݺ€Õ¾÷Þ…þ»OÛ†&!ÔÇZ€š…~3+fÀƒ¼0ËŠßšP(vM~à,þ 3„'“I¬]»V†˜â¬øSÏ?À€ìppœˆ‹Ì¿+NßÄÁJ³;~;ÿxâ2CøÐÐ|>Ÿ4 1ÄÓÂÏá, 3„ï7„ðŒbÅÎŽr6=õ?žø ë° ñµ]hÝRß5b} àAE¸7+þ£sœ³Iìö…»üØÆëÀd†ðý?ο3Ç× ¢îó@ãÆFCCäübÒÓ]†˜¤,Nxc£>&DvšTñ¿…8fÒØÀo€ü¥V:ÕIøëcb2&et­««C^¸ [·nÅ‘¾æ˜ùÙ¿jLíz¡P‹Ç—Þ”L1ñ755ÍÍÍòŠŒ oÅ wpl|õ!Gá% ²_.]º¤8`3LÄÏbfF^ózo rÔ— ÑKÀÁøC"Àlïö1Âì›VßÀ9÷$ cùòå2ópc£Þý„£©âÂÐÐŒw$L!ØÇ ñ7šbÊ$Ý䨈‰ãï¨qÎü Syæÿö1‚ýûDü±^!¶¢ÌÃÂ|¢ÃÕ5Ι¿ª¿'þk€®7­€xÛNümmmR¤§"ÇОƒÈ§ÿñ?á®>üW->t¡ù¿þK®³¹K†1wn7+ÕÄ×€"<X@*¨ÿ7ÏDVq`(2‚Ã÷/B^Lÿ–ðŸÄÿÏÞtYcub¶q`ûöíZÖSšü X?IüoojÖlãÀén޹/Í•ýqÏ?„é×:e_U¤–m…B¸û0s<~2R¡NàÌ6ìáØ3w®&Ösâ' ª86Û8Ð)ÁK÷ߨ‰%êŸ €TQø³7nÄ–-[¤@Ÿ1fD>ý³½ñófâ~çI<ðŒ õúË$ òCdLÞ+s2¥ÈP©,Æì²âqg©eÊÒÒ ÄzG±s„ãˆ!Ê¡ýé;•¯ŽÅH{²¦×2 1c‡0 f"3ý@YÔ+ùë£^|ˆaœõjü††¥ñí²u–Un¢h9ž#ù»»»±eË#™LÊÌÕ4–/..Faa!ÊV¬ü+V¬¦@*ÿöíÛÑßß/…xuuuR˜Gå›Y{%UUººº——‡¡¡!äåå°ÆÒyyy`Œ¡,UŽ?ª™ò?‰«Ití÷û100 ËBUUÚÚÚ$?oåÀ¯O` ™Ÿ0ï%‚\|/ÊÂVýׇÅ} ëõÏ#ž>QŽÜ¿K)wà­¬Úªÿá+Q½¶ŸhWs2u¬×2Ô <( ÷Z×_¸ "Ü«ñwFJÄ}zW—Ü¿õ±Ý²ÜxW†wÖÀ[þœ sÎ=Q5¢Q r{‰§Å' oªªª0£© -6ñ? j{{{5qíÕŸœâÿ "@‡X¶»²‰§ä EüO¢|Rü_Á  #De8&ãÛðΕ𖠱q ch2…þdP@ëíâÿNγÿÓ9J$Åû³º¶Ë¼°„Ǧ8?ë¬wœsO4•æTñ¿óÎ;r9c òšŸ ?ëõ›ùE¯,’y À_Šs«OáÃÄ0XÔ;%þp,iP¿fçÿ"º+«öY†*ªkkàÄQŽM‰¿¶¶VŠÔíü…Ö8GŒ‘"=ÿ˜ ÿÆŒîð,BüO#W껨Ïq*›ÄWúT•Iá?)h¬**ÃÕ_¼e÷<'Å-u÷<‡¦G ÅÿÁ޲CÓ#+ñö[o£­oÜ¿­oÚ”òã-¨¬ Ë …ÐÕÕ•2^êééÁüùó‘››‹¼¼<”ÅÚ%TéT~ºw‘ûŒŒhå÷<†Dãvñ?eš'Á¹ŠææfÇåª8Ýi½T~UÄ=ÝüqŸÏHÛßqOÿñ4RDàv~EÄ=íü-0œDરœþ'PEF§MMM)Û(ûœsçÜÓÐÐ`lܸѱL@ÔÅtóW64 £¸ÅŨ4Åôãñ‹º˜îãcOÎw¡¡aÉÄü-˜~þpx„ƒG8“ÿäâýÅÿoaú¦$ÞxÂúw޲ØgxÅãA˜sD¼SëÿÊb̚ì}ûöiëý>Èç‚--Ör2 yáì³îrÎ=M]÷ sÅ'lÏ€^T†}ï‰~ãç{7ËåŸ?ï\?ÿFüÍ_•âÎöàÔÆ÷ÞmÀ–Úû¿™ó.ÅØ‘À·>i-/(ÂÙ_*ÇØ¶çÁVÝ:%þº{ž3âñ:Gþu±ùèÙÜ£ed„ø¿êÙ °øÔÎÙ#ÌØ„#ÿM׿ÂË·•å…òD.ˆ Œð¸ý?=o® @ÿñc£*¬k}ôQ,X°@Yl{`‰ÿ,X€G}ÁŽÍÕ¢Ú_˜ Xåï æ£,fÝýæ©§°ëå—ñµ@@ ÿ!þ„BøZ €Ÿ|‚²ûî“ýÿ—yê))þ§þÛCaÁÙgãßãq¹?•Iå›ûIþ®®.<öØcRÐJزe Ö®]‹¢¢"\~ùå( %¿ÏçCWW—¿,ûヒ¾¾>¹__ŸV¾¹Ÿäoýê Øzàç(>žþBü¿ô’[P|þ<{ç£,v—ä¯þÕ-hýê RüOü®Ý„äp’‘û'?<‚¤R¾¹Ÿä7¢¿ÄÇOÿ3/ž'…ÿ€ÿŸ¼ùV̼xf–ÌGÙ¿/ù=¡¯c,úK)þ'þ±üÆz{0vôˆÜìèŒ)åŸý%Xèë’¿£#‚¼–õ8ïâøèè|dò“¡Å‡|ä£,v³ä¿æøÍx3ô¢ÿÿ›¼ˆA â·BY,Œ=Á|tôòZÈò;:"Úø³«« ¿^x§6îD__¾ÿÑV Õ ¢2ƦTÿå[¶ £f7µü=~Öׇ¢¢"Ìj(G×>½þwr®‰þ ¹¹Ù`€sQ»BòçÆr1‚)þ'þ‘‘ƒN8…ÆÜ%Ò@-'O}8ã.üõSÏJþxÏÿÎëx cã~åwžwÐz"ùé¾½Ò€> ³n¾§7¤çD°‹ÿ¯6ý+++‘ŸŸ_üâRüÿo|ƒƒƒØ¹s§¹Ý“„ €qßÿó§sð1>žð7¨â\ àç@ƒ/5Õ©F¼yñ|ÄzGÅvÐðul³~ÎIüÿøãã²Ë.áC‡pÙe—âÿ 6à²Ë.CII .ŒaõêvÄãq¬^ÝŽmÛ°o_ñx½½½8tèÜ¿½½]–{èÐ!šCa¨÷7ŸåõŸæeàÂ… .\¸páÂ… .\¸páÂ… .\¸páÂŤ˜Ð€3ar¦šˆ'®L–ø0$&ºNÇ‹­ñøIpM apSS†;8¼•Ù =Óå'q Fyá\mrÿ™â·C=ÿ§»³ú¦ËŸ›« ¨T~U\p¦øíPù§"ôM—ßwMjPëßœ€Fùí"žÜ?‰Ïá\477£¶¶vZ_,Óù¥¹]WíJÿ²`,ê5M”Œ&f&q–EÝPû&£~ü5m}¬×ÊúÞJS”¢L¬7'‰dÃOõKqg 5Uü¯fæ*--E]]6ž²reÃo?ÿv‹‹v/¿— áÍ e† eòœþHGªøßžµÚï÷kBÊd:ü±6}}‹-ë_¹)†ƒèpT„­LÌ×ÜðKÛ@=ç2#³Zn#¬,°¢¯›cÌbÀ©êcM”"Ç ³Âºø?Ç ˆêü•ao ŽÿF1 c(Oì¹må"¬ó—––Êìo………(((@mm­&þ§¶«ñ¯X‘¯> ‘–½\2x ~&WUU1†ÜÜ\´··kâj;úñGSøÕ{s¿ßD"‘R.ec—ç¿ZÔ?oåÀ0`xV­‹ÿáM­ÿJ§ú÷ óäbLb+1ýü{ËŸ3†Ö-‹xÓß5„Ë“šøŸî¹õë¯7…_là LìåÆÊŸKÁÓ„ØPÃ9Ž75!Æ^+FiØ ¡“𿤤F«èðÞ>{6®þä®þäÂÇÈ„„¡žÖ¹Ôÿi¬ÕÞÞŽåË—£‚1trŽ ›è_11Æ@bèÓ€@ÛGB!øýÆ„Ù܇˜Ûöì¯ð„©™öz½ZÆrÀŽwŽ3áO$Žü¯uŠO¿ß/…’NûO•Ÿ±»ùÑFÛl’ÙˆÇDa!_™~0æÈŸ0ùçqŽ˜r-ÄbI„caå÷O?:ò¿úø …B)÷AêþSåoçø;Ìã¯1ûœLø9çžÊʰÁÀІ ÄÿWù<'E/•a&Åÿ.E/b;6ìѲ"“)€š•Î+ÌŸ?_îkÿ“y’ÊO÷*¿j²4þ|Yi ÐÓÓã©/L'6¨æíËKKKe¥¥¥†m|œÂèêòÄ}>ƒÊ¢,íª8ŸQiÞKØùUˆlùéª4·¡ëÊÚâ Añ:õø-ˆì_\W KÌsAו‰,Ìœùˆ¬ùÍëª!,¶‘×U €øÆð¸fËœïÆØâñöOˈpÖµbs5pY`™ÔcTëÿ¿tÇ)¿Ë.þ¿dž¸‹Vûÿ«ýÿ%óæáÀ‘#øšYTi €hTã÷™ý,=«RÅÿdr¦òÓ³•_5C[»v­,€4زe‹Æ_ý«[Äñ_r‹Ü×.þ¿hvA ?‰ÿU~ÚŽÊ£rHS€xA¿}Ý8¢ýìâÿ—¦ò“ø_å§í`–Gå¦xñy¿²R˜Sì ûÚÅÿ޾ Têü$þWùÿ}ù¡Ëã 2€Ž ã Ä©õpjÖ1œ[õGü û)f”²i©ÿÊÊ-8Ý=ˆ³ø÷pò?çbÖYsöéÏèT½ò\Ë.þ/¾ó= Åt~ÿ«üÅw¾‡äFFvi&T®ú j2ØŸÿ5Œ}Œû_ù•\ÞÁý˜ñ†õbêÜk}ø³²ÿç~$À’ÀŒ7ºÀ®Í\ü}ÃÍOjß;::°`Á)˜„1Γ“£í·mÛ¬´8œDú¾©ÝØ5¿Ãf‰®AÊ}Ø76‚ùüÇ4–ÏSV®\©‰ÿ險¨¸^x®¼òmlÜ(ì^æÌ9ûöA»ö6lØ€õë×§”»~ýú”g0ŸåõïÂ… .\¸páÂ… .\¸páÂ… .\¸páÂÅta\1Ax—òÝš~Ô‹‚¹«åºumqUéãžÕö²ÉEYe1†ëƒ"ƒ§·Rdv#ÜÖ¿ m/§ƒß.ªlnnFaa!JKKA™° :û¼þúë¢ÚþSåçÊD“HgßÌ(µ&”Àº€˜öºuZø)`MNgŒ¡­­M›ÈõÚH»wï†*Ë™þ­Šˆg cØÊ9æy€ò\kò;ÌkvÚ ˜þH°X~Ç’øDOoùs˜§ð?/Ããm]ÓÎOÙo+¥×ëEmm­vý…·ˆ¬ÔÑi¼þTB|E“þÞéþ®ÙÞ-ñŸÌò›x ›„˜o2Ë]Sú‹-ÂÞ½{¥°Á—o¶wKüG“3Ú↙±ÜštUcSâŸá7p:á‘Ë–-3Û»%þ#Aàk¯½&…?Tªà'ØÏ?‚&vñ߉ûðÆ<~6Åã·ó/^¼Ølï–øi½½½RxDBUp4üå0Û;Rů(³z³6²é­ÿïV™í–ø²ünnM Xbe/ÄÿSáß0°Ì4ùÀMÂXÙIüGbì¾¾>2a‘¢Ì¶¶¶ŒùÕÉ’šƒ9$°‹~àü¨×lë»Ä1ÖÚ !Æ¢¬™Õw½™˜~Õ¤ÿßÄz»èÂßúesêoÉÇ«ÄõŸ$Δ_3€0ãœ]ô ˆ‰õMMMhnnF2™LÉüK“ 3å×ο9ÑÖÞî1.`1&&yÇ/A=ýR<%~3£­]ô ˆë,‘HÈ ”öÌÃ4Yj*ü}æÜj{»ĸ Ñ'ìR2O“xJõoÂ.ú„ð7ÖË #ÞÕ•’yX{3â· €©›µ‹~2ÂUÎ9öü8ÿÎ|_7ˆºÏMK ŽüœS†Û]°c" §8`š€e8çž¼°•áMÅD@NqÀ4Ë(pÎ=+V¬0ìç˜ØÈ)'“8À9÷°RfÀar½ýü §8` ü3Š$BSÇüãñ«@Nq€úŸLâMVÇüãñ«@NqÀøg8瞊p¯6æ—çs §8 ¸ÄI©c~(8X…s6 þ/ÜåDZ÷ÄHµ\?q€~C9c†ý\γE)uÂoc˺±OøçöÛ$ å¹Îã )4 Ï19†ÑÄ,Ðtå™¶ÙÅéòÏôCÞ“Œ&f™âÿ9ò“PQ5÷(,,ÌŠ¿°°Pšd    @E:ñ·µµêX€&æÌ„Ÿ1&3¢ŒŒ 77wÜq <ÿÕÌ ±>Á(Ò·M—ß(0d~@¦ð{ËŸ3Ô±4 î·³á<ˆ›sò»ÞŒÃwM^á?1f„F…Xß;°8ÞõyÌ©9 ˜Ú"šäÝÛ+Œ‹ |na ÑáǺ/TcóokàŸãGô¸^&aùòåR¸Nâ¿oožFGÄê;"AT†ch1MHüOÛXÛ[â20y úÌä¾À>#Áý{½^ùlÈnÅ3Ts¦˜˜_œ;¿ß¯ÝwÚ÷wêߦƒŸD¤œoÒž{Ø÷ç|Î=ütéÏã\>›²T1ÆŒ Cÿ:-ü¢ÿP($ŸMÙ ÒìÏ´¦•ß<ÔÎå³A»Ac̨çNòWãÌPŸ­ÀÕ_¼ZûN1H}ΧƠ«¿x5Úúöhû²øÄ1°§§'¥äååeÅŸ——§õ%fù> ï·ÙEü€.<g ,Ç$úW·µ媂i«ÆYðË,ðNÛÚ…ó$Ö¦ÿÕeÙòSøñøµæhеéuYÖüføqŸÁp’ÛÅÿ@ª@]ÍV¯B5°—g‰ûíüvñ¦üªÐßéº"¸?õøw¥¬ÏìøU¡¿Óueò›âþ~›ø?c~Uèït]eêÙ’¼ã+õ^0SôÏùnp.ž 3›€×ëÅO9DZ,ù)þïÛ·O[.²‹¸,áÚsWûþôN`*ü¶aÂQrZ˜ÀÂ\q‚öÄSö¿ý2ý^9~§þ/bÌqòæ[¥ØøÜŸOÙô;wáœ3ÀÏ™•9nn°](Œ¥ö­ÓÁÿâQ†Cñ÷Ŕْ3þö‚ˆcÙŸêc©×ȺV}[Þ®Zµ Û¶mêU«¤ðÖ¾Ÿß§ï;Þ»(ZŽFˆòn|ò‰ö=Ýþß¾ŸYþ„ü[¶l1T¸üò˳â¿üòËÑ××§í« ÿøwàc©bÅ^}<”.±w>’ÑöU…ÿNüìÅç“¶¬í3K²ãŸY2cGuþsá¿YLŸ÷ùÈÏŠ?ùø­¼ (‹N|üá9Æ7×®ðl00ŸŽúÿvÓ<6iý72fÔÛÆ¬°Ý1¥Ë/ö;¥íÛ˜›;.?»Ög ~½}UÊó¿ûï_üÿ¹×úðIýz|ºo/N½ø<>Ý·g-\„O÷핆é¼9Ç  IDATP K^yñ›š @ee%òóŵqå•Wbÿþý€9sæ`çÎP÷V ãƒsîa›™Á×é±/Å0åIhb~2d¿ßêUCP¹_ÍøÜ€_ Ëg*€.è€ÎÎ÷pÅÂôaõêvìß/~ïÁƒú5SRR‚C‡°Œ½^ï¸ãÐÏúúwáÂ… .\¸páÂ… .\¸páÂ… .\¸páb:àh ^Ln‚¦±²ÿ2ö¬ù],kí÷‹ ø­Ý`lIÆNç4QçU@Švô»Öäë%£øÞß’¡Èû˜á7Ðß’²Xæ™Îh¢ª*Ú±ƒ&·Ú'¹îرÛ·oGAAvìØ‘U6vƘÁƒ|¢Óoeÿµ­;ñ0Ûx `d:Uùý~¿&Ú±ƒ&wÛ³­  !77O2'þzS¼C¢;hro‹mùRtÄÖd‘éŽ1fK¸&Ú±_4¹:KÒN€ÖÇv£3Rß5´>¶áX2+þªª*pÎÁ„x9eûuGHš&½^/’É$ššš2æ·£RÉô›q…bú¡ Ñ õ‚¥ ðSå_³f ¶nÝ*¿?ƒ»Ð€MÒ€p8~!®Ìx™ hªüÞJ]dJÜ,{FšúûûµxA™ð¦ýüÇuŠ áÄKÐ⛦ã·ó#‡¤ s®Å 5óãtòÇ”·Y&„#†/(àt×ÿØÀ'MäïŠJ¼°ú¨©òWT0 ›ã,.®«GnîyþYM¨ˆ˜¬Æ ÊÄ^?g“3ªÅo8”Æ/Ä^ó:sŠÃÃÃÖLÒdÂ`?—ª @º~(¥”ç¦7×ÿCÍUFq%Sþ1E¤s~Ô DÓãW…Š€Ó«&éò÷÷÷ËÿW¬X!ËŸŒ¿­­Í°-ÓLÒåWïé^1­ó_­×¿§O7H—ßÓ™º˜2ܦÃï-NãÇ Í ]þxÜ*¦"Ü  wR~ÿíB ãïˆ`we "ÂÑ(H4ýRäßå¶4I=‘H  ¡ÿ-ë^ðµâa\—ôâµbÑ7îæ­ðß$žN9º9‰ÒíÏQ:9‡¹&‡~¿ÖÇ øýü×ÌÐLKüßú¸êïÎ@âÍÓÖqù <Ü9"MñÜ&Sñ(JyîPcðûý())çííí2i&™æ~4Fqz¦4?ëÙùC¡ À9G[[›4 ³(@AÈÎiF§Ã*r ³ÂsRøyÉ0έ>…ÑÄ,sÌ# OE,©#í7³ºÀ)->¥Ë?üZÞëôì¶õ1a8U][ƒÄî8*Ã1Ìã\ôM¯Yb7Ú¯¦Eô׉xf?€1fИÆÎOcœ¬X±t8e¿îºëèñ1]~ßÛù©€rÅCÐ~dþsD—µHpÎ=,®ÇÀ·ßz[3PcÐp 7½ýÖÛÖï§{zz4~z›)¿ÚÆzzzÒâwÂxuo‡jt¤šÐvÔÇ:ý»@›2ÄO_š(üd6x[)WØ~“È?~2°ó›"q½»@ÛÌ?%~Ó …߉7448Ö‰ÿU¡y__ŠŠtW {zsŸ´ž;w£ÒÜ_­#ÀÿgÃ_ÙЀ¸Ïg¨&NüœïBCÃù¿~üK²æohX!ú·Lù# áù¿ÆoŠÿ³â7€·pC5pâO^¯×¸à8þ‹ mùWê½à£»Q|Û ±à‹Áùn0¶|£SnGûQxƒaÀYŠí ƘAÆ~*¶mÛ†=ÁÖ âtÈ ãU»1 íWeÞOŽçEº`Œ¡*£º#Y8ÊPç{×Ï¿ý<‰;ÛƒX˜À¾‘8:BVKû}¹Pýîݰ#þotáôµº¢¼>Æ0öð£8ûKå;<€sWÝ*³Ž«ÂTÚïìÿñeñýðffÈÏÜzï¨ð7=²UÏŠ7qd4“rû~m«kP.#þ½¿ÌÁ¢¯ëuöâQ†=÷äÀS@Ù÷G±'(ÄÿEì>.Æ?Ô‹ëoŽ,pÎ=õ1½ÿß\­›¨ÂÛ5kÖhÂ[Õ`s5Ðf>³H÷]çÜŽF5þgŸ­‰ùÓíÿœ}6è A8ƒ{À-[¶hüï¾û®&‚M—ÿÝwß•ÿoÙ²%mþxAãO÷h&éò'‡{äÿ;þðBÚüìÅç5þ±ÞÍ ]þ±^‹ŸÌ8Òá/³]ƒÔLÒåT®ò²ØhÚüŸuý7ÚEç8 Õ ]~±Ÿ@cnî¤üœskÜ0éó¿Y7Ý‚S/½à(þ€S/>Yotáìk}@ýz̺ùVÌ2M%ÎnÜ€Ó¯¼4éy g¯v2\_¡ ~ò“oØ$HÝçÀÈÉÉÁO~¢¤ ¾Žƒm¶ê€‹ƒý\ß$æW Uc)†¯f0!/ç2"xŸPQq.¼PXØ\y%“sæœÕH5 #štÆ£ŸõõïÂ… .\¸páÂ… .\¸páÂ… .\¸páÂÅTàh@HÍ`µ<± »¿˜DÆzu1cKŒæ ñAó³Í¨­ÍþÇÕÇê1 _—ÅF±bO¸4ð> /¬;º—ŘÑ|Ý3¨­¬Esó& –ý°O6&a_ss³¬X±B㯭­5š››±bÅŠ”ÌŒ™‚Ř&òea¨"ë¯vþÃÌhž-Îÿ³ÍͨEöÇoÏ F¾åË—KQBÔ–Q¢½½Ý ñIsssÊÄöLÐhËàEÂ>m¯-«äÆ4þ©\€±^†Xotý…cIDPŒH°XŠ*º° KÍ×5£¢ÜäŸÂõG^ ûêêêd–={¶¥¦¦&ýø3„ÝñÿÃõª/÷×µ”ÿÌ]™íP)8߯–¤•é`<~šôGâ?¸­“ü?Xbeû,ñ?ì æ ,6:%~šDK“? :ûù(’B?šYÕÃTøO›¢^íü+¢8P²ýš!p°0›? ùTþ×F,a‡×ë•B?@ŸtN–©ðÓ¤•žÒ,j¸%ôt³­œc ›Úñ“O­ÿ'âeÖoá\fû Åÿ #KN‰Ÿ®¡³x'ÿs.¼cOâ;ÃÈõ¡PH ý]øE‚™©ðÛ³-© ±¯³Ä1Ö·|Rü¥R¼w~tbáñDüj»·ƒÄ¾ˆ›í^qƒ¹4ð¾{+³.¥Ã¯Ö»$öíïïG2™ÔÚ~aaᤙÓáŸèü¦é 2}+§ŸÆ@êaºøIìË9ÇÐÐÖöc“fž*?` yöCÏ8­ŠVÇË<ÿDõObßx\døŽ¯µŒ‚OZ™‡'ã· €¡ ÉHì;<< Î9º”ØC"<¯×‹ÚÚÚ´ùíÛMvþ{´Xa°¯Ÿ¨ýÔ8è± Ó8`_?QýÔ8@‹™ÆlÎ? Ä@‹™ÆløÕ8@‹™Æl_ô©± Ó8Mý«q€ 2)×ÀÀ²?™_n2Džåô}Ô8`–!cA¦q€ÖÛãßÉ&üÚ œŽ)þ“­³0+ þ“­³4Àéâß±cÿŽ;4Àéâ'³§Éø4Àéâ÷˜]Ëdüž.Ý0`ºø[Ûëc»5ÀLøÃÑ(B£!„‡¸ÇQÅü»¹P©Ò‰ŒD+ þ |n`NÍQt㎙}ÐbVÝ­ðßž@4 „FÍ é,jtG 4,&ñ/_¾\Šô+C"!Äû¿ß@"áA"aÀï‡4C­íož–¦â7z´raÞ«¥kÎH†S´Ä®1yŽå"ÿ“yEoo/TóÎyFfPd>ðÎ;ï¤ÅOââ€jÀ9Oyn5?/jº1‹9ó&f)Û ñÿhbrü§p²u ˜Œ&f¥<7Œ?,Fµ¯`Ì‘?±Ûj $þOìŽÃ¿8€Öæ¨æ‰Ýq„cÉŒø›››¥ˆÁ‰_5£#ñ¿“9m›É˜”1flå¯˜ßøUØÅÿª9a s PÜizd%êîÑŠ--›LƒZZ6k†@ú1ˆøLAHÔ2oo¯f ÿD°‹Ð·oߎþþ~ÔÖÖÊg`ª±]/ªáÉT~K¶ü•ɤ–~¼lðgŠŸ I>^6ø3Æo’Üž ÞIøOÿ«÷_Ҁ͜‡B!,Z´H Û³ÑO†@W—G­2|øKñWxôú†1þx´ú0 þbüiÀëõ|t7øÂçx²{2»ø?ùÌlߦ›,÷%iÇÄ=Á´˜ã©… ÊuÛ¶‰ÌƧ•ç"$þ?fø¡™ƒÒ¶ãe¿Î÷~¾WÄ¿zaú!õsëš%ñ?O¢ãÕž—¡šôó$šºîψìáG1ºõIäÀ¹ÿ;lõ¿$þ;<€™—à“ßìÄÙŠyÀØá̼÷îŒøu‘*¿ »ø¿mu ªÐ¢™ÔÝ“Ù3±=÷äÀxšÊ·Ö½xT|Öᧈÿ!¾“ }Ý1aŸ1YÿÏŽÃlåfʋеu/¿ürZü/¿ürJÖìLù7\» ëßÐç¼9Йÿ›ša@6ücÿø3Ìüá÷µuŸ¼Þ‰œ4ø?y½S3 ȆÿÍ ^Ä5ÇoÖÖý9$Æt“ñÿ9”‡ÏÙÊý[ýŒDn®nŽ”|b6rs'çO>1;¥ÜlŸ§óü¢§ûöâÓ}{q. …ÿ€0aI÷~ûÕN{î¸Íº¯$1ÿ¦M›pÑEáoþæoùùù¸òÊ+±ÿ~ bΜ9øÝï~‡M›6ᆛn¸ùIlÛ6+•Èι‡mf_ÇÁ×qàcsÅ9ÊF¦˜Ÿ |GÃ0¦ JCƼx>®÷m_ÛlÎYÉÀ€Îºœî…:;ßÃW3ÿÀÁƒ#r;õùŒZf:ø¬¯.\¸páÂ… .\¸páÂ… .\¸páÂ… .¦‚q KÍÒÉ3zèÜwß-xö‡Û¤ÈX͚ɹ•EÓžM3ÔÇR'h2ÆŒg ïÂmý›ýÌåwÊÒÉ3(Ó*M¼;Sülœã胇pß_݇–ÏžQ~§ ÚŒ1㪫®Â;#eË–QþF‡ ºŒ1cïCaÑ}÷áà3göøc½Îüþ-þªÿ_qhöÏ(¿“XJ})N‚žé䧉޷¿¾JËìÍýè Ãú_Uú8‘ €0It›åÜ%·£O{fá‰øWýõj-³÷Pä}ä…Åä}úoìBš¤uià}!„ˆ´}Ú3 OÄOÙìhòúöíÛ‘gfñ$¡ÿ믋Œ$j(,,”“o›ššävô™N]ÍÒÕreó­/53ÈÐßœxG“êfßd‰YÌ2 O{fá‰ø»ºº´ÌÞ¡Põæq’Ð÷n!È!Ñ™šy>‘HÈí–g 6!þ+n³Ž_NÞ73èЧ¹ž2`ÎóX"µFÅ€>í™…'â_uÅh™½;#%È ‹É÷$ô¼MÌð;Â,Á/eõ2¹}Ú3 OÄ虽7n܈†k}˜à;¦ÐŸtý‘бƒ èÓžYx"~jÿHt£>¶Jf²Z4ËlF”v€ê>A‚_ôf6ùKmÿ‡ã¢¬© [·nU¶zPŒy¨Ý_|Íüƒ¿@æüÔþûûû‘W[«ekF¢Ñ\ùÚ}qq±f fâË”ŸÚÿ‰—€ú0ÓÎÿfõʤ#ÙîõÓ/ÎAivÇOíŸsŽúX»ÆFŸVÿÔîóòò4üfÃOíÿˆ¬‰éÇ@›tLíþJèæ@ú™§íüÔþãqyá¤Vÿ{[<ÈS’°R»ø|šù ~ÓÉô‹{— ³l;Äüµµµiñ×ÖÖbûöí(,,ÔÆÙ‚Äüíííé{;B¡cgYw‰ùs7§Wÿ›Å½‡Q`êôRÌŽ%ÓâÇ’è ”ˆö˜šœÏŒ1# !ñ4à¿ÀÓ¦ÁY‡`–˜h1«އ¥W5HŒ1†«?Yp_J<ˆÅñi°˜U‹íŸ"s"HK š#è¥á†*öíäz¬± ùÕåLñ¿õLìÛ@c2(^<`ŒóçÏÇȈ˜`ïõzë¿‘&Ü«Y÷ËfddDš!@º`ŒË—/—ñÌï÷#ïÔ¶)(( ‹ÐaLc7§!C€Lø9ß%Ç6œoB<®«έ>@˜”¨K'³€D7NÖ³,C€ øƒœ#nÞoÎã[~V[k¨F©8˜ÂOâýé௭5cÉxÂÿ¤ò›âýiágµ†jà2[!a9Ýã„Ì~&Âo* £Ñ(¢Ñ¨&:'1:çÜ“®ñ¤jÌP™Lb:ø;Š‹Q™L:^S©õOõ!ÄÿÓsü»Ìk'õšJ©ªSü?-ü¦ù«4pâK^¯×à|·üÎùnЏõ@ñmbÜ“|f6X޵*ùŒ)Äüo!Þ$_ª –<{b0ÆŒÆ Ç«æ÷` ×D×PX#îõû[òXÏÇóSÌAÉ@Ýn2þÛ/«ÂŸ>’ê…¹$Ú6×Ï¿ðjÏËÚòß}Ðß}Ð?}ôi@†é‚1fŒ~ç.` pòæ[oѶ9ûKå€O~³3•å§àôጠôal 9€4˜‰ôÀ3x€Kñ<GGD7Óº¶Õ5¨‹[¦9m«k´õêru»Éø÷sÑåaO¸ÿ }8|;õåô4¸ßü³/wâ –˜ãL3‡©ëÌáN^˜¡1ÈqìâJÎÂÛÛ/ÿ ò ÁŽu­¢œtÁ3¶=$îëL³+8ðÉ'€÷Þ‹H(„å†ÈfïÔÿü·`Á½÷bÛCÉý2áÅÄÃÕW^yE.'1ëüc¬]»ßÿhë¸ü畯ÁücÄb1\~ùåèëëˈõÂÜ»ãðër9‰ù·¼û–^r |¯ŒË?xêly÷1l¸vнó‘üðHFücÿø3ÀèÎ×eÎyóç4ÿ 'o¾ ³þ}\þ§®øÎmþ™0(™±£™ñ¿yÁ‹€°²‡çCŒ7¿~üND.ˆ`¹oý¸üá øúñ;ñæ/"ùøm7áÿ7Ôÿș˫÷˜¢&rsÙ…ß²qùŸèzÝÜߩ´ùàôüïD⇘}Ó?­§Œ³n¾Ušœµp>Ýg÷ñJº÷Û]tî¸M|_µj¶mÛ†÷Þ{¯¼x—4€ßýîw€cÇŽÉ>Ñi¼ÿÊ‹ßÄ{ïmÊüù ÿ[¾Ž 1¿Góå‰hº9n‰á×å9DØ'MÓ€ =[X¹r%.¹d+**.\xá9¸òJ†ýû9ÞÿcÌ™sŽߊ•+W"£¤¤‡Êèp?ëëß… .\¸páÂ… .\¸páÂ… .\¸páÂ…‹©ÂÑ`¼—tœsOSS“ÁXjku±±ÓþÙ &ão€XígƯ~ÿ,øjñÙ{{ûgÇÏPû×ÿÿG¯¿Õ«‚1/ æ®Æ;­ß Oc» ”iàbUÁÜÕxçÜv(IŸ¥mNˆœtBè_» ÞZ1ªÁ{´Å 49êc e1š¸'fK86W§ùªmš×ž`~Z&€˜X …°l™˜hòÚk¯É ‚$¦"„B!¬]»6¥ »øÇnÔ0VŸX VÊD3Á‰û9XŒAÍ<À1û)‡‚l“äÍ ¡“ò?ÿüóhoo‡×ëÅâÅ‹a‡ßïG"‘HÉJçõzñ•¯|%¥»øÈ¹LÊ?{õj”3†ÎaÎëÃ+PÏ9Ã[vÓαơD»x+çi™œx­ ÞÚ$æqŽïV‰¦¶¹5`‰öKÑpŽŸ·øSÊQÅÀ úÒ2H&“hjjB(’–¾¾>TUU¡­­MNê&Ðda;¸MHd^¿ãò“ЃÚ?póUpѼ«s¨††µ¬ß÷.°¨W˜øKÁz½ZÀ‰ø©ýb²' gAëÿ·û,¼•”åK©¶÷=Áx+… È¥÷‘fióÖÄzc«Y`jU…Ä6”åÐÛ{ss³ÌÈWXXˆ+V¤ÍOí` _Õó¿®@€ƒ•2œîVêXÙ†GÄzá˜}ÀJÓ?~jÿ€eÞ¡òG:Šàõ “‰ªª*9áLmïË—/G[[–/_Æ¢ÑhÚüÔþ˼CåïkjÀQnËò©¶÷­\¬ßÊ…µœ¥üÔþ˼C­ÿE5æÃ[þ†w®D×›âÇ©í=,†·ü9D‚Å<¨÷¦ÍOí°Ì;Hp"шPÈ{¨Y¿ uuu¨­­E]]¼^/Òâ·/û04Œó£ÞÁÕº61I³`îj‡8¨ãùf`l &„8ñwpx+™Öþà¶~1I8XÂSâ ÇŠe±ÑŒù)ã¦= Ttö3DìµÇ@jkk3æ?ÝÍ1£”¥ž3wŠ@ŠøŸÄ ™òSŸcçmDˆQ¼^oJôX@q ½½=c~ÊÚ›"ø~bŒ`‹@ªøßìû3¿þv®„·ü¹”ú"^&~O€ („cÉŒùéº9‹'qò?çÂ;&&ÿ>4,D¡P(%z, 8ÐÔÔ4!¿œsO#cÆ•f %<×&Úƒ—y[ê„ß#†³‰[º²%O K€zD½Y÷›q…5á¸Í 0ˆû“±‰÷²çojj2Š‹‹¥ ÀØCás}^ü>É?Thf*|Òœ¨¿¿ßÑD0þD"aäååI€_WTà×fh ¢SòÇ’WŠ* f##ó,ëNü,ÆŒ‘<.Mê«€zŠ­q(qÆ\V0ÓœÇÓä:˜fÂëeF nH€^¿eüæ‡uý%Ìeð0E;ñ¸áhâ7O[ÿGs¢ð#T&°»£U øwj€¤â†B!$ DB!)ª/øói¼Í€Åñlþm Ö}AŸvóV 2!Ä{ðKñ?'ݵ··K°]ÈO&NèäÊ}}ïä÷VäjF‹Ó1£í©?ëéé×ëE¤£±ú>T†–/_ŽÞÞ^GáÁäææÊõ½½½i]—Ä_UU%ûÖöövøý~Ä’ˆ„:Qfr½ý~€äU QFÓæÿ04 ´’±áü?ì½{|Õ6ü(,IÏ8»Ð·@éÈ)mC¡D‡[K ‘“–Û÷F‚Ú~ic›ì›ý²7WªiZº)~¥ºÝ6mc;Ýl»S+})—$M,‡K x¶q|û¾‡Ñ›ù¦k~õ¾û_= ˜þïëðîu7bõáåxâòE9¨÷Ý÷~ý8Žê´°ÚGÎűWÆqÒ¹‚qü½_?Ž“¾ú®ù1ß®"fáè>(£³ŠjãƒK;Ñ>Ôo2Í4áÿàÒNã8 ‹ÿÿùg®ùwýp:ð+mßÜäì ߺŒÃCG|ã»~8]þ¿Rx3 •ˆ"oð€ïŒÚ¾ÿãá|ZÛEÐÆœ&ŠazýÀî7o3„·½»€ÿîÍ4Àíû?‰ÂÿkD­“':<ŒDÑ$æßá» JÆûß§ï£ñ©“OÆÍ.Úº„ùòå†ðU,_¾7n„ ¦­øÁe€Kß7ø§ï£ñÛßþ7ntÍ?ÿì á¿ÿôs€³oÀc¯ýþÓÏ1LàžZ ¸ÿiðoÓ÷ÑÈÊûðØk¿pÍÿîu7kü'uÞ½îFœòàý8rÖ9† |âð5€uÒFƒµ¾ÆÑýûpʃ÷»¿ÿÍ Cøÿ ÌB¢9èÁ(hÞ`˜ÀŽÑµùû¯ï£ñÞBÔ¦¬;ñ7úþON>¼ð&'Ÿ@SÓ嘜”ÃŽðoÐîQÕ´rÃ#(Ä»hjr×d×öödÇ. ôÿÍ”¿ øóùàƒ—0íIóXŸUüÿ^l Nޝ-ÙÿFÄÿ4î»ï>Óöâë€3Ï<øÃ@ÂÚ}{ç6]£Eñqwsªrõ=Ý óö_(C=Üm³Pãø_ôó «È¢ñX³fzÞyç&YZñùç/ÆóÏkÜsæ<­ÖhÞØ¿?Ö¬YSÖ·O#Ë?ƒ°5('±q½Àø?ã¯ÿÐÐsXºt€Õà¸!}’éjãx__–.½Ð˜Ô®Í«ÏOn%à¸ü9ÚªWe8nuÑI¿¹jâXŠX’Crÿôõõ!F‰îûúúpÉÎÕÔŠ¿gà}^3Ð& Ñ«Tï OÇv¼…xˆ¹0 “g‡‡‡Ñ××g]Q0½â/ùK›XÏÉf³%EØ04sKÃKÁ%9@Ò'ù&Íé_zh©iÅ_ò—ž@ÌQéW Šf"P”ÿÆoÄÄÄ„!ö'“Œiþûï¿ß$ª iszuÌ… bbb‚˜å?44„ØÒ¥ˆsúu¾¸…æÒ¥¦É_Ú NmoÒWÔMŠòϼª áÌRCìß×ׇ¤%ÿíì5­øKþjæorž?öCÊdˆ‰@Q~¿ßo/ Ÿ5ÿ³Ù¬iÅ_ò—.sä|@+ÏŠ¢³íø‰àãzuQËOÕïbIz³¶ê7ÿ*-²^Hà¸Õ†è_IkÏ<Ò” ¾2ñ~Þ1í„¿šð·¿˜›ÔÅ»&Óƒ¼ñâ0‘˜ÄGÄÿ$í™'¢ÿ]ømÒ¯L$´ R³Š`Ðæ*{öìÁÆÉô³L¦ùÙÈÄ|²Úooo¯!ú'÷)›ÍbÛ¶m€«¯¾º$?MÐ{è›ùÕÿbôsMÂSâߙׇ$í™'¢Ú3HfêanŽ»ô···#“É`ÇŽX¸p!bIÚôC»—DüK¯6LVžä8Îxæ'&&èÕëJóë‚Þ­ºPg“¢`U—‘  Å¿dµé8%ú'Ïüó* ðEž}:ýòã7¡c¹&”J„ý˜¥„):?ÿŽ&ò« '÷s†è?í™—2ÀhBS°.ˆîwÅß×ׇL&ƒÞÞ^í1§Ç ­"D$DüÛÓÓžç¡(  Ñ?yæE1Vìîî¶åç8N•åQüUgGÓ”pm`” ŒXR7Qž0Îùôœõ…‰ „nF]`¤ï }¡ áG:ˆci¦UKûp ÿ L$þ³¢Úó¿+œW!(|› _m; ÂÿûßÿŒãÜsÏÅøø8{ì1lÛ¶ ³®¾ä¾<òHá„SºM@ê²mgDø›~o6’9ôöìÆtC%AMÊLЛÚ¤. Ûv&@„ÿ«_½“““†pr||‘H1]xB„(066+è6© ȶ á~š9ý¯êÏîI³!XûS›€ÔdÛÎÈ(Ï ó”„À¥"2OIøÑF-˜ÕTÅÄÖ./N· H]@@¶íL€ÿ}÷í…,ËÆ»=›Íj"žË˜àQ† v«XÓmRíRíO+žp޾-àõme°0¬LmÛ 2+BzV¯Ðçš0‚˜˜A9E¤÷˜Ä¸•"›Í¤n€‰ÞYÖɤLLLÙl~¿VŽ’Ù¶q¥ÏóêÝ Šç)U=©ÞÐCÊd ŠZ½ð›4p‰^E¤ ?ü&ŸfÂá®(Šâæ4“"ÜAâÖÒ÷Á[„Ò¸ûm|P„!ø§W±§MÍ( ("Þ‡‚ˆ#r$‚èÁ("G"æ´¶Xñ?îÑþ¨^oŽÂù[ÿô~¤9ãÿ‡´É˜ÇHœè2´oß>S˜P”C04•9bhbERçÓ·â«©ŒÕx.¤¯”L?sÄ ÐÞ¿DK›¸ÿS£“Œ}f!g(Êiß>{¨ó4ƒà¢‘ˆ^#¦©0.Åÿ©Di)ó’ã»PT{¿sæ=­üUQ¤šƒšD½«ÜŠÿ·mÛf´eÏ…¢úúú s†´õÉ·`®—ÜŠÿ‰°ŸÈTã6éߤäÍH˜NÅhëí~ú]TLüOc0·Ë´=ï’yÚ7—Ä¢ÈÛlw¤æv™‘ÅÒKžú™#Û“““˜5k–a0{¶&FÛ°K,¸}ÜNT,ÅÚÀW[ÚÀ+W®4ú%ÈsFƒ6¿¡MtS„ˆ¿½æOùý3Ÿ¨DÿØc!´r¥E®‰¿½OÿÎ÷)Ê‹&þ•+-&ºøÛsþ„t§ô+þ•"pŽãTzåy«A y® ˆ!¨Ý õÄ`÷îÝhoo‡ Èår+W^ ž_`{ÿi~úÞ…vì€Çü¶÷ßœþü½Û±ãrùí￉Ÿºw;¢Þ§¿˜ Ïó*ö7ã^>ZMa¾¶™‡rdÌ0 aEÿ.ÜÜŠæ%£Úö;ù0nÅÿ ¯HyÑ+ÝŸÝÝÝØž®›¼e„!+¸k}ƒÚ6mèVü¿aa¿ûcþ½}Ï^óO(Ê¡+ð-À„¹°I«“CÃAlX¨}¤ÓænÅÿê}÷ãØ+㘦ï›þïë ø~ç8ª›0ï^w#à”ËÀ}ÚŠÔDüÀµøŸöyñ?Íßû½› á? #éŠHQ÷ 9Àµø×§Ô'nÞøYÃ7à°ëŸóæ$ÌÂæ z0Š„¾}€:ÏIüÓùZ\wé·|ÞÖ?+‰ 51 °ý“ãéLþ¼Rà8N½åÂOž}éwÆþŸëæ[$ ç~úÓÆwFBÖ}¾Ž‚kÑÇ·X‹ð_|ñÅ`ÅÐÛ¹\Ÿüä' A,1¼þÝÿ±àZôq·«_s§~⃟üAÉgíìŸ^…ŸŸùº!Àü³5³ƒmOý¿×¢gÿôªkþ·Ï¿ÓÛŸç'ÛG_'µÌ6 È3¶úðò‚k‘ãÓõóÜò“²Jð&LÛgà À„õöà ú8}Rü¾ÿšøŸÆaËö)”!€vå†Â> ú¸ùÅùey³~Ë›ö~ð~Ìx2ƒY—i}ïïÅÖä=ô‹‚ë̸îF~P«sOÙú)<Ùæâk]õ¿ýá0ýæ™gâæ›oÆÖŸÞû|ñ–3 ÂXÃÿôÞÃØúà—pó͆‘€+nbP°ÿ6 EîKyÇëñÿOòÿsw»7!€½{÷tÿýÓ ¿3÷îÝë–¢áåŸÁ+0gjÆÊ/ú =Yµ€¬PL¯NLŠ·ß~¶.ø+¾º©nPtX%ü³ÜŽX‘Õ&É5É.¯ù]í“\“^ÍKþÛÜ® þJå¿fà9ÿÎ;‹ ;È5ɤU¯ùOºýö¢«Í’kêžóø?·]m”\3Ü¢”\•´~"þ-ÅOŒŠ…Ó >ŽÏ©i%L §ç'Kƒ"úýôœõxvÏ%úQ´0¯T=Ñ×ׇÉKç”ðË)³@ƒ|ÑoOæ-µ9[¦Õ¿”¬'ˆpŸ<§„Ÿž `%>Úà‘G1„‚ôê—@éz¢¯¯Kw.5žSÂo]å{ÚœBƒCô›D^´gÎþ’õD__6lØ`<§tÙ¡AL±ý޵È*°¥ê‰¾¾>Œë 4¿u•ï+š >ˆè÷qä…ªôêŸ@ñU© ÿÎï.5žS£ü=~“),ÅÏŒmbðAD¿ë3†PQ L+‚—ª'ˆøŸ<§„Ÿ“f³ºèêêÂøø8šššÈ5M8ëóÏqœšJ% ŠŸ1DnŠòNꘃ£{@ mèCãÜ/ÅøCšÐÅn¤.Xg{]þYýkŒIÞ»ÂÓñÑ稕ý ¤N%&¯HcÔôŠn4è:€ð¿üòL#Oûúú0þ|ÓʶVA$Áðð°!v;pà€QÐlt`äºÓ0ð!&‡‚ñìré'¢4R?s¸$Å!ýœMú¿óQCd¹páBC€DžÝ´ƒ’”ˆÎ‰EQ£. bL+è:€ðÿAì4 |ˆ‰½²¯UHЩ(è§Ä~äœ8Ç!f³*4¹–•?Ý߯øhÏsÇß·bàGcƳKúÐ8GQð*Ça4¡MR•$Õ¨ ˆÅ º üÛ·ÿÑôn'ï òìÒõ- RþˆÉ‡,ËF]`' #×r#ˆ) . éô™ë\'ÂMäïC%&eZ»ç CüRÐÜæpîÒ{tQneüä>š¹á-œ¥Û•ðƒAcågŽãL+À:!‰e†<‡çXO_ÙMÌcNP |ú¼gu¢x{£¸EÐr¢èÂèþg£‰–¼1—þºá'+pRA ”6Ä4é{€á隀xúp'}.ò?5Âo…!úÞª…!ž>\ðÖML¦)@^øžˆD áÿ(U¯™ÄÿÔ9ÖëÐÇH»Â²‰D°ÿ~C@lÿ“0Š¢ïGZühõ‰C6›5®Qê€Ñ†!åØ*þ'aE1 hñ? ½cHý7>>n\à ÿáÄ›xw`efT¸ŠóáÄ›8’ž¡·‘ÌâíÿÕÆ7ÓÑ=TÛª4¿¼3¾~C¸oÿ“0é1É0 Åÿð*ÇýƒÆ5Üð¡p±¶Ïž={0>>nÐâ¦6ÑÎ;k¸á'ïbï~ò¾ßJþtRé§Û[Õü5œ °ˆXÑ*tTDíÂ\À¼Kæi«KÎõ N>ó›gè&Réo~òì‚Ù³gmùY³f™ž%;Ìž=~¿ßd°oß¾’üÖ60ணòn"ï?;£ú[zΜ9PÅGÄßµàOùý¦°d…y¯‰Ìÿ wyMøi4-ý—›øå  ÿ|pQ®6ü sû“¼¿ ~]dÎqœª­V¯­owßhq:£®µû. õ>Çq¦sH|oºi6B¡¨éþÓüv÷­üôý7§¿ð¾Õ&ýùûoâ·¹o5á×ï? ‰þI"þ'Â}«øŸ„€ì†™FCü¯ÿO‡á¸Ö¢ÂÓû/¥”üö—S Ž¥ó"kZü@ïп¤ü5ܼR‘4¶ï{Øî[Åÿ$Ì%kÐâxnR2 =°Ã¸†þiOfðÞ¯7„ûVñ? sô•q¼§Ðâ@"«ºÀ{¿zÔ¸†þRâÆt>%þÌô5Üðï~`:ÔǼ¢ýoÿaÆaÐâØA ¡ŸðóƒQG~Úàg/šÓ+h×oëm@0àÜE§3Àݺ6Ÿ”½Rï_bpïsÏšŽ%"\#jxá½÷0þì³&³1+‘Îýô§ñ©“O ™DK˜^ÑاŸ6 k—/_AÐ:“?ùÉObë֭ظq£#ÿòå˱xñbüö·ÚJö¹\®ä*Ø´ÀK~ÁtlþÙ7ÀºfAèçg#õÊ#xìµBñ5>ô‘+‘•óæ½ö‹’üoŸ¯õtœö¢ÙºðÝënÄIgiü'µÌÆ‘ÇÁ)ºÈÛï^w#¦_q%ŽRæ§êÁ´f(déK çÐáey¾¯µs]ô?®]»çw ¥¥¢Xhxf…$I†9ãÞ½{±fÍW\,ÿ ^ J100¸- …É€óÄ.ëùnÃ2~ÆÏøëÇo5 Mü~?–.½w94ƒ€ CCÏÛw9ÎýðRCøÿé9¿<»ç’‚íñ7†l'@ã¿dçjÌMA__.Ù©‰‘sÕ:c{nòÂ-Š!ü'+Ä…Ûv¢°Rü€&º¶ ± V®\‰H$bÿ‰0‰iém»UHKæÿ¡¥àôU7—ZªåÿÌ!c›‹ê+Oá?Y|D(ܶ¤”â¿ÿþû±cÇôõõáþûµ 7Þx£±½cÇð"\F‰ù¬°fá Õ€‚XMÍä£c¹V“û9Èß„!šÌ€X@˜L¬&ÄÄjhå‡äÿàà`±Œ¬F @~Åk;bRÊ(¦(ˆªÚä^bœ´IQ°Xužð»ÕÄ2=Ïãœ6á7á –m@Äÿªúë M`Û"C•2ÎŽÅ€¾Â¶^–Gáó} lRïvw<¿À0[êëëÃÍ7ŸçÈß}{±råJ#¼,¢§ç—e›ñ*õðüÃ8káÂ…øÙÏ¢Žü7Ý”0„Ðét²<ŠPè«e›ñ¿: ßkÝ8lò6Çþ·óýŸöµ šîæŒð²< _G°l"þ4.bò’ûÑ10èÈ?ÐÑŽh2k„—åQtˆAצ[‘#ú*ºÓ …ûÃÓó¢k8²MÄÿV³b$`÷î§û´ ùŸýô¾bçZÏ'í ëÿĸJQÜxã¦zèã€VÇ»$ƒÁ’"dÂO O€-?mˆ299‰¦¦&“¸ßĨ€¤µÿ—݈#é¸çÊûlùÉq8šÖLIhq¿”¹¤ á¿ù㇓ðòÌ«lùÉqHKiÅ IÜo‡DØi0ƒ¤ ã«ùóçc||Ü[ùÉq@3:úèG?j÷ÛÁj¨VŒÿü[´¶ü‹÷Ùò“ã€fôsŽÏ,î·mæFüO o::V’Éœa´ Ø`ªƒŠ…—åQøÚ‚Ž&Vñ?Í }€ÖŽš={6öíÛú½`å· /Ë£hmítexÓ¶Þ;+H"¯7?Yež¬_ÿôk«Ì“àëÎO#©b°†!¦SVtww›ëä]ô¹Ï}®Àd€Üûzó[ï}ýÓo¾÷uç·ˆÿûûûñµ‘Ù€ÿݶ¦kÒÇ {ïLøo9dˆû ÞAQãý÷±¥8–†gÚ×ÿä8¼"ˆo™Äýv ÍAK½>öÈ<P²xïÆ?Úò“ãð»?îÁÇÿzŽIÜo‡®À·ðû?¿†{ö–6^ý_Ÿ¾G_ÇÝò›¶üä8{eÓ>r®IÜo‡£ßùŽŽç0ýßוä_úc½_ñ+öùOŽ(i@Ðû½› ÓœRü—~x5Ôqà7'¯³å'ÇãÎð+{ƒ‚nNà47âúý{l@뻘å ó艄‚iiÛ÷¯]xYEGбüYÅÿ4ÿëƒZaÿÔW¿j|G¼ðïà¬ö -¿]xYÅ@g¿£ €UüJóÿèGZÞ7¾ñ cõëý×Åßÿýå¶üváeyÿôO÷8Š`­âšÿŸ.Ó„þû#Ì?û<öÚ/°ü“{ò[~»ð²<Š.ø‘£ €UüOóŸÖý`zßñîu7â”ïÇ‘•ÿÞî¹Þ–ß.¼,â_Zïh`ÿÓü·h÷×\DsуQ<мWìlùíÂËò(Z$G€©pÿiñ?Í?mZ“¾_Ääähjº““Ž›´å· ¯íÿ@I@3UyûÛZì)[´'38üàý89¾Öø[qì²€±ý^l ˜L¬&uáE†A€µƒˆõóyÀçÍý‡²< ž_@ýŸS*<9î¶/†ã8UPÀu˜ëwkHoë9tx:l1Þµk×bÕªËÀó °víZ¬Y³?ûÙϰpá_;öÿìØñGÜtÓMFxYÅúõO5htùg`````````````````````````````````ð d"”uùÝyç¦mà'*ð•Sì÷é9+ÕOÏY©ÚñTÂw;Ô»Ûáš¿=µ=ÏøÉÏ-GG‡ÚÑÑá?Ú¡¢Œô#!ïÒ¿`ÁuÁ‚®ùAPAðŒ?¨q¸OP£ð.ýtyró»P/ð¿««Kíêꪺüq§ªjºàYÞ²e‹š?ö¢iAUû‹óûô0Žå/šê +¿õY28síg˜¶öûÔ\ûj®ý c ãô˵Ÿaª3¬üÖg™æ·n?õÔSêÐÐ:44dì#aœ~CCC¦:£ ÿ‹¤ý0mÏ|*úµÙGÂ8æ?Lu†•ßú,Óü‘HÄ´ÝÑÑ¡F"5‰ûH§_$1ÕV~ë³LóoLÛÏù nö#û¶”¨ ¶èõEöé·>Ë4{À´îªýíµ¿=`ì#aœ~ýíÛw¹®õY¦ùI™!ÛwÝu—Q–ȾRï"kaW‘øHR¿qžª¦M×!ÇìÂZÃÓaÝ‚ñ3þzñs§vœÚQð¬}ýûèðýjGGÑkØKóÓõ&Ù¦ëSk8ú˜õ¯SXú8 CþZë úýDþ'u6©“èw}Í ¨CCCª(ŠêÐÐPA]o—ÿnøI»¥GG‡:44¤F"uhh¨h{»~UWüªêÐÐ ¼¨ýÕÏ«–Ÿ¼[Jñ÷·Ô¡¡!µP‡††Œóªå·ò:ñ“v9‡„«–Ÿ¼ÛKñoÑÓ×ÿn)ÒÞ6îõMdWŸ«ƒÜ„/Vqgú&ª7?rÚÀôq§6ðo¼aü†††Œmk\¤@¾mU/~) âðbÝùµo!TÛ¾nüý(ø¼ë®»Ô»îºKíèè0¶ïºë.ãzäûQUÓ¦oI:Nä8Ù¦ÓB¾œî=ùíî}Ó_xÿëʯßžçÕx<®òý¯~^±zÇMýO¾íKÕÿ¹ö3Ô¡¡!õîv­þ'çUËçUë\ãíðó IDATñßyÕ:uhhH]5¯K{êçUËúÀºâ?}à?Õ¡¡!õÔÛ¿© çUË?øãNWüƒ?îÔÚ=!-ÿÉyUßÿµîîÿZ¿:44¤~Eÿ»Ö_ºýßyycßÿwÅü†ò/Z´¨¡ü—œý™†òŸ|ùgÊßï/þ=û~¿ÿ>ß‹ ã'œªšVgÜòÓ5èöÖiñï™¶›÷dÕÓâßSO‹ÏØGÂ8ýN‹OqË k>þñ›öÛ…QÕ:†)¾XË›‚ÿ‡ û/α†wë=­uÿO#Ë?CÝ`ØC~åœ_î9ŒŸñ3þÚñ['°Yךè&IýªYÔÿ“’?¯ùiQ?Ù.öóšŸ_ÓÆ N?ÏóŸõ·£äÏk~ZÔO¶‹ý¼æ§EýqJäïôóšŸõ“íb?¯ùiQ?Ù.ösSg04/ùß.žÅ—âbüŒ¿‘üv׳ïÛ]“~íΧÿZÅÿvü¥ÒI³Šþ­a­†,å¤ßú?ÇÙ…»óÎ;UQÃÔƒŸ¤»QüDPÚ(þvý×(~º-Ôþxéç8®ÀÍîºVG9áK={VS´zò[û–u›ÞçÔ¶µûÑ×'âoG `üœø­Çi~²ß ?yVÍéQ¥ Íìø­ÇÍé/e„FA›øûa2ô²å·7ñ—2+RŠ…ç¸¼¡ŒS9(̧ÂëÛ+vÏè{].¿µ,YYË}úó÷ºüô›ËRá1s9°å§îuÙü–²Tp špŸ¾vÿ[h“:\<W}¾}ŽaœÊ]©ÿ9Î}ýO¾ñõþY5¯«¡ü§Þþ͆ò“÷i£ø¿¢ ªÝ¾ÿi'þZ¾ÿi€FðÓØFðÓà§ Áßïw¾v=ø}ÿi€FðWÛö¥Eýd»ØÏ)>•Ô•^‡¯Å5+‰}ïjÙÿÓèòÏÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀP1JM,Žž iýßéÇø?ãŸ:ü¥Pî9^OxeüŒ¿Þü¥ž;·ç[ŸËjãeÇQéñjøÜÖEŒŸñOu~7ájY5š¿Tøró½\B~]¨]ìÙv:NŽÑÿ[…1 4"Öv>–ßv:—{QuþY ‹³ ±v‘cƶӹäý¿õWܶcÝ–'¥î—Õ$À®X9¡¯owLC©ûe6 °†+^Nò×·?ç{F7ñ[Â-'Ôõm¹-æwöƒ€ba*ÅûõýÃøËßè÷/ãgüŒjòWRç”ú•“†Æ~ûÔ+ 'APɯ^|NüvÇÞOüNûTˆC£ù§:jõ,VzM¯âr¢ó300L ¸y¦ÙsÏÀÀÀÀÀÀð~…ULÅÄU µG)ó÷ïT‰Ç‰žþ©ÂÏÀÀÀÀÀÀÀÀÀÀÀÀÀp" ØÜ7†©‡iŽ€[xÝáàö:¢(:†«e'H© ïǘz¤çxœ(ê”/.4¿5O«Yñ€>§ØóW*v×õúþ³Õêbbìzð:=‹NÇÞüNûTˆC£ù§"Ès å 岋}¤ÓbcQUQÕ]1[²—q²‚ã8µ¯¯ííí¶“Êá>^:$AP“ÉÚÚÚ\Ç™ît)6NO”Z¸p!nXš8îVŒðûý¦8ײü¹•Ÿçy#~ǩተ©DØU^“çME5qrÄø¿}<àhP,VT§b åIQÖÁøM[~Ü•«r1U::eYFì7 öÕ2^1>/p–eÙ–;ÆçjEoJŸ¿u¿W5—N{¨¹vi€Xˆ/ÿ!Þö\/&ËVÃÿ~©ˆð¿VàùÊò³Òó?ƒN¼åî÷*.Åa½æ#×®F|?+Õ¢Ú<8^ùn/ââõ·C-ÁqœšJ„‘ûnQXy­1ý-ïNñ,U/é›Êh´èÞ+NúÌù8é3ç×<>S-ê©’î©—Fˆ°-<'qx)ù¥,cÕ^Û)mµä-7ŽŒG£ø‰ÐÚ ‰æÚŒ«UË[ÉØb-âQO^»1³RfÚµˆ‡—h4?TBûžnTýã–¿VïŠã)Þoüõæ¦ûs“±’±œi,ÌMZÍw˜ü^¡ÑqaüµáAmkkC2«ª<ת¿¡ã,S+â-Õ†(u¼Úöwµü^ ‘qhtúkÍ_Nùmt^ŸW­ò£ÞyP ¾jÚ W¨gAP/\³µäÜ7:L-ãBþZó Ví®bûJg`````````````˜ ˜ò‚ ‰|iT*xAíééAOOOÁ1Zì/Š¢*I?Á®ÀæfZ!I’¯VqrB&“qLƒ[n2¨5Õ;$ÈA4:ŒŽŽ «’´øÛI|~â-$ž0wZo¹––c»å¯œøé‡__nÂï÷û!Ë2dY®{Úc!¡æBÍ¥Óîv°¢œA žçɱ_4npµâ/÷ÚS$ Váf0ˆÌ`Ðs>žçAV³w[~V¬Xá©ÿDæg`òï]zÒ›ýµˆá,fª V<¹w[…@‚  ¿W­Zå Ãû ^}û• q½ãÿó§¥4¤LÉý\Cø‹¡‘üµâ®æÛ¤ùAÞov}N¦(ÕNÕ®QíùV‚½øÛ "þ'¸aiáÄA7ð:þå"—ËùFFF‰DLe¡VåÏ-œøÉ$»Éûv$É×>+ƒyÔDÿ3š[ñSµSûV¦À€ÃM¬p'ë}¶»ïDü@ÿàŽmĶmÛ°mÛ6Çk¿_ Ë2b¼iúßëŽM7ï–øõÂHé ^F¡$Ö¯_olŸ½v b6õąk¶"›ÍæÿÛSuåÎÆšOi†*ÅEßdRé°/&^°[ÑÁ /ü>‡p\»ç·þ—½YR¸Zò“ r}/Å(õX <´ðŸˆþ)#ÂAŒ‘Ëå<›€™Ëå|ÝÝÝðûýX¿~=î½÷Þ‚¶'ý»÷Þ{±~ýzøý~twwW—Ÿ€ n~øÚ7–¸ö[»Ú_)ŠÕk¤ Ç„ã‚Ɉ¤œë”‹FŠïs¹œ\ýúõày¯ÿEÁëQÀó¼©=RËç¾Ñâotº«‰K¹ßcÅP‰×KTË_m}PK~7q;ó¿Ò¾BR^iQÏñ˜þ㛣V21®^ù±{÷n£î#¿õë×c÷îݶñòJøG_³^eßË8x/D÷^´ÅEñ»,`ÄçÔžf,þ"àè¯_Äá­?­©°ÖænËK½Meº0ãÂqõWËIêC¯ÌPýË¿Û3ﻯÚË(füSKÞrÑèx¸å¿PÛÛÛÑ××çIÙTÅ"IcTŨ2ŠDs¢.âo'Þzš]–“~/ßýåæûÜkµ¡}2v}l]»:V’‡ã8µ¯¯ííí¸(ˆw£î£ù5q‘&¦€yóæaçw—ܬÆ^mÛ§R~/ÿªÍÆß8îj Hc!Ḁ´ÐËSḷâÿj¿Ã*å¼ÿ«&.Œ¿4JÝ«F§Ÿ œq7 V;¬Zð‹‡SþW¯LknêŠZÆ¡Vù_I&Æ¥æ?z…zé1Ž/”ýÕl7) ^=ßÄ$ø¥Q퇵$I>QüŽìÁ—W¿‡ÉoÝŠÉoÝŠö?†]1àœ8UEQ|Š¢ø¢É¬1¸‰DLün¸Ëc]5BEõ?ÒRÙ"x^EµS*ÿ|7(&þ&âÿïÔ&JIxïLŒbÇŽøÅPÔQ$c—þ]±†›öfµ*náÄ_îdbðÙ´â;óŽáŽ–¬û|ûöí+Y¿¸Íƒbq²®b·Š ¹Ç­Ç­ÿ@ÿOŸ+‡ã¤~M<~é§ßE[w|[ñÕß«ôˆD"èêêr¼÷±ÞD[w#=ÚºsF|j…\.ç‹Ëšà{gèmÌùÅr@\ðÚškŒpqY¨‰/—ËùH^ûý~üyÓ*øý~ð<ÇþéRȲÖAÍó¼çü¹\Η:¨¥=â1 ©ˆ…x¤ èH/Rk“vÒ ŸŒåðÛuÚßxJÆ=_!ñ”\/pÕð{ ò<Ù @ìö{Åiþ[Eÿäç57ÁïÞ½Ïó .ðd²L¯‰`<ˆÝ»w{*~?ÑùN¸1¹üòËMKí/çÚtØdL«oœÂ‡ãV¬XíÛ·#‘²ŸEê­jMW¦Šø>—Ëù–-[†U«Vá…ßçÓ»™ÏaÕªUX¶lYM߿̃Fñׂ·Òvq5qñR1>>n+Ä÷Š¢&üÇ©~¿Jó»Y çxÌÿJ'ÿÚ•Ûr„àµ@#ùöFÅ)—Ëùz{{±jÕ*dcÍÈÆš±3ô6V­Z…ÞÞÞºµw+I«Wß«‰C5ðBtﵦ=™7Þ#ñ©%*Í·â£RjãQ)¼àóJ„ÕhWÂY 3”yóæÙn{;ãŸzð–ƒZÇ£Ô7B¹ü™Li“T7à8NME41ÚÁAíà fE$šµß:ð’¾ïz Üô{õîwËKÆ­àãnj_æõc¦D#L1®be¥Q÷*ð“U×Ã- R b `Úï¯Ú>åò{iüWi¼Æ‰ÌßnzÜ+›ËÇS2²¹fõ÷«„Ÿã¼[÷xÎ /ÚÞõH1šFç¿ÜŒC”ƒRX^óYQʨqpƒZÅÁMúk‡©”ÿŠ¢øˆàº`ýƒèìh7?@:£ýMx]Í÷·µ¤ÞüV4"¦w=ù8ò:.‚ ¨Õ´ÁiSû´@PÌì·ƒWíÿrùkÑþ¯4޾©—FÄ!—Ëùž[»€&þG‡„ØÃY<·v1Ð!iû<·vqÍÛ^£²$GßÈÏ÷~ôG0·ýnŒÊÞ/ ñøž6¿oTÐ~ °€ZìiŸCû-Z¼è°Çqêÿ3§‰™0000000000000à¯Ê=áUλÎ$7eóæÍÓ„Ž¿Œcþçcxì—qã¸Û5âüÀQ ¥›¨À“8uÖcÿÜL+ ´ù¼yó°páB0…õº € ñÕÃÀ‚ò¸Ë1 bÿ/ëD:% û€/Å¢«°Û]§S’ý:¦ö(ëZ¥ÐóýGðÎĨ)APCÿÎÿÀ–Ç6â;JŠÀwÆ ¢UçOpRÇÌÍ´zçJËå|6lP»ººÐÛÛ[·ògòLÖšÿCQ´··cppдŸã8µX8ŽS+ÙõÐ1Ì]—¸Z+§s¯¤ Ãi&ùN¶þŸ>WPëºî+6ðN¿þC€¶îäçW2Ø222R1»Ø´i–-[¦Zë±øõB[·yà“ÄGU–eOÄðôµ¬¸*uZÉsjÉŸÍfkÊ_Œ›L¾p:Ç«òV,á¸}ù³K¿õ™-‡ßéX1~²]‹ÚЂâ)ÙSñ?}­h(‡Ì`#ÂAý &ú§Mj-|íííUyžG2² ÓE°^–=ÆÏp¢€ˆîRŸÀx¦µ‰wP³,Dú©~„ã0ž8í'ç ‚ ÆB¼1XŽWW_ƒA$ci„ã°aƺL@ÓÅ÷*Ïóâû%u~î^ø}¯?·g]xàôûö¢ó¼ó¯ñ·y£ó Qü^ò¸SÛ­žqq ºÝ¤Ò¨<Ïã©6M„÷š$!LqÓὈ‹—ü---eç}=ù[ZZN›Wky?å¿ü¤-T/~4?™øt@zWÕ©þk÷T‰S6Ö >ºr¢s“G0ê äúôIO…üot¦=™ÕútÜŠîir"¡­b>22R² H¾/í»,`2€Ã[ê*>^Àm>\¨ŸooG ÀÊ•+KöK–€T¯P _<¬ –t—.7ý–õN»óæÍÃK‘ˆ±sqN±2]+N/Áó<>1<Œ—"¼&iB㘢 ÎqàyŠâàÙzßëÅ[ õŒ‡Þnª'Ëá¿PWµß¼Ìå ž¼BÃA<óÌ38ôÝ“§ï=ÑyQ/.=%y§J4ŠÞ¼y·(èìÐþŠ$0ö…ï¶JÛ>^ñW:îáe¼Ä‰Ìßè´§ûÓˆi}Ã5çÐQç×+å×ÚÒÞàT—Fð—û â5¹pcVÔèüj7ád€U¯qbù߈±—zÇÁMù«e¼Îÿj¾9)± ­"ÒcÚwYm½˜a[%°ö(Šâ«'¿ȃ©À]o~»޼ŽK)7ÇÄBÎóhxÙþ¯„ßëö%q8žøÜÔ•õN{£â`7÷nà3°ˆÿ­fd~ÃÆ—€“ï°ØtŽ×u=-;EÿüüÄï´ÎÆ®Á°^ÎIsšïh Ó(ñ?zÒ lŒÞŠå‰{û´óà=ç:õëZ¯“Ëå|áp‰DiŒŒŒØvÞUQˆø›À*þ'ã¤Ïœ“>s>mu 78:°»cØCû‹×W¿IúIÙé¯ìV¤Ë@-á”V/øV%™œœ,ê lCkk+xž/ËñžpS"2¯çWM€t¨°¼Ú¡‘âò¿u߀ÚÞÞŽ¾¾¾Š\AAP9Ž3]7öÀ›hëÎa¤G@[w|[® ¬ êŠ+°ÿþŠÒ¦(Н··]t:„M›6A–e£žoëÎâڀĥ§§}}}èéé©Ê •M$Â~ÄB|AçîÎÐÛˆQn°dßÎÐÛHøÄøœ'üÁ`~¿¿àÙ÷ûýÏÎéà–;ÔœsL{,Ä#d™tAÂÑ«×år9_ê )“Tb`=- 1{.—óq§.Y²íííX²d ÚtÁA2–+ˆWkk+èsÊI?Íhe:’ÓÒ¸™Ïa³å^ÛñÇøœQ&"¹üÊÓñ”l\¿ZÔÚZ5{¡‡Xìm$RFtÑ?ùÙÕ?ž;@Q)ë¡h¡hi)h2‹hVô­¥æDçg` Fn÷WI)Áxv?l²¹à$˲ÑÉår¾DJ(øfªD|Opú}{Ñ™«ÿ$¸F®„Ùè×fôñ’ÕàkÝ[I>”³·Û Õõ¾õâ+¶ ") (‹Š¢øhök’dˆ°‹Ý3bŠZON¯à¶?ÝÚ_\ ìúŸ½[M\J…ó2û÷ïÇŠ+*·Uíù¾T«ˆ»R²FÄ×ð§óþd:æÈ8I ™„nÇËó|Áø ãvl±¬åß.$\-Ê¿›ôïÛ·Á”ˆi«Íuc0¤™†N[À´ÕSÅ ÝŸ|dµåUíã^¸ý#é¨6OH^”â¯U@¯¦¼´L}ùÉýµ­‡Í?âP)¿å¯~/ÐHnzåuÀÜÏ[׫á÷zÜã9/Êù©¿è4ؼy3Vµ Úÿµà'ýni$„Ãñ¢×±³‡ð"êÉGóÚå=ãà„zå{©òWË8xÿÕ|sZãE¶g^Ù¸ªk¯íqkœ*i[û@*å÷ŒC£Ó_ 9í.}#tuu•ì¿«&/ÊYË?bvŸŒå ±o,Ä›Ìîk…Fó7"^ó¹Y(ìs®E\*A=ãÀqœzáš­Hý¶>ýREqA]Àç°À2Æ ñXÙ:­`_,ÄcŸ«jNšõ\rM',à çZúGecé ÆÒÞšY¡(Šïþçß|yÉ%höùê6/ajõ=fnòMˆ4!^ÀÛ‰„ïÏ‚€ýÁü¾Sg-À;£]«§§Á`°hÇÁàù/ã‰Ñ¢+µÍž=ccc¦ø´¶¶âK¯'!¾7¯ý€(j+é4íÆÉÏtšÂ¤JAÇEss³kI’|ý¢ˆ7  ÿïùB÷|!€[>üGZ2Œ-}‰ÿû(R‘4R‘´)½’$ù®hâp±xìÉ0¸Ø|9X8ùĮܨ wÅp¸+VЉK0¼séµ8Ü÷  ÿ¼ó_\§_¿„£{ðåÕïAüÁ%p Ú_üvÆ #’þ]áé˜HLb"1YóI§Ç©›s›ÑÝݾ¾>c?)›s›9RZ(_ *F¸EA"ì·-ÿdN¹×EQm`p"€ÃÇðÕg¦áŽýæA+"Šà8N]¸p!‚A­bøö·¿m{M¦T|Ȫ)ÇÖepl]×- àù‹d<Ø”ñý©‹0÷Úi† =±IQ.^d\‡”AîØFÓD¨ró¢œódYFì7MÿÛ[îÀ?©ëi!=Aüú™ã0¢9Ð’°dûÙgŸE6›­¸Sšçy,[¶ 3gÎDss36mÚ„•+WšÂŒôÆF6›E6›Eww7ü‘Â:Ñ AP~Mxb'^¯ë׸*uâ²€+ïÛ[pþÂàX< åüŒrnE__²Ù,xžÇ3ÏX.‘°dÉS{¥VÏA#Ä÷¤íËó<Îú‡×ÿ¢à¥9ÀKsÌ+@Öëùo¤A#ù«á­T„^‹¸¸Çqê¦"+šÎüîw‡n¾Ù1Ì&¥r¶×üå®þÒ(~îý’ÿÕ ‘é/…F Ñ-‚·C­ã¤(ŠˆÞ×–ç IDATH¯â`ú-,ÈÚ _¼þ9a*ä¹q¨¦h”èÞ*‚€\{)~uǪ‚°†®Ä®½@¾Í˶P¹ù@VàÞ¼y3~ÙÛ[Ö$íbaë}?qÿú,eYF¹qñª6x±k9 ‘+1Euº–]¸Z à9ŽSeåâ¢á¬Æ«ÕšŸ>ûö$^À±_!Ù–r ›lKëuÙwê ·ÂËôçr9_6›Å³Ï>‹žžð<Øošúû­ ÇFì7MVÞÿîŽãÔT$ @[‰=4¬õ1'šž×Û·oÇ3Ï<ƒíÛ·C–e8ñʲ\–ÀÍØb)p§NÞ¦@µ¶¨S<xbݞƾ}ûðüE2Ò)í™I§Rxí…ݾJVËtÿÓ ‚ƒžžlß¾ÝÕ}`„%fRÕЬÏ_)~¯ž?;¬ÈLõsÕ[€Öþ©‡rù½@VÊï%÷3¯ÔÆúH?ïܯÜUò/¿Ã*á¼ÉkÛÏ).nÚk^Àm^Tó â%(f@S*ÿ+1 qÛF°¶±Æ!ìÂV‚zóØå?y—‹C½ ¸j7å¯Ô½¨¦ð*ÿ+ùæt2ÖàfÌ¡šö·S]U­ÐÈ84:ýnø+mwÙ-pTm\hTj`…—f÷Ç##âP/>ºÏ¹Ñq)†ZÅAuþ¿=…ÅÂöxÇÍ­ˆÿ­Ï­]Œ_|ÿ Ç_ü $ž0ÏEuºV©x‚ ¸)‡/4ûýYךššðÎsn›•Áj¢ýJç^ÒbÿP,‰xJƨ,àkÉÂwé×’û1*ksC±¤é:d»5XýÂ?¥ú6^{ý>Û2Çšš<ãd````````````8¾ñWnq§’Άp\@2¦­(J„0©„@A(ª‰ª™x"‚ÚÚÚŠSg-@ê—q ˜Cg:‡~]ä ¹úgá› *‡`0ˆE‹9ÆKEuW` Gö@¿;í?755arr~¿ccc´‰i×ää$öíÛ§V3àFç$i&¢¨m§3Ãeáû‰Ò³fÍ*‹S’$DQ½å AQŸþWW4鎼’ä#âÿà-§£?݂ߤs€ãLé}ê´Ýxjé—·þWó?å¼òD2tthœ###¦|xçÒkqÝüåq20¿ÑËy|ûÛßFÏ÷1½s鵦kýõ‹¦UÜÜ Ý@ž4Ò/8}˜Çlq6$=ý»ÂÓññ¿qÛ€ª§_)H¿Wà8NUF!ù%@>úÑvìØ@{öîÞ? ˆü¶#ˆêµh*FZJC 41´O4•5炞çËâ×ÊÔAíãÌÃÚgi“J‰DŒÿI¹ž7ož.€¾_ÿú×Mñ™5k‚Á Òé´cg™$I>¢ 2¿pôæ>ü2®Úª)A=œV§<¬…kÞ`7p &m¢$ˆAøÛ²ïE[[FFœï!éXL<~é§ßE[wÒ€‘|}Hþã›7ヹ¸[H•oË¡­UsÉ]±bE>^ݹ‚m¾-yD@&“ÁæÍ›±}ûv|÷»ßÅØØXÅïÀ²e˰iÓ&|ìcæM›°lÙ2Hc@& lY¿«V­ÂúõëqÍ÷¯A@;R4Ñ@l$ä€Áõ}A%«¸ï OÇܤV¿f3€ `Gú-œýòËÆJï/¿ürÑëÅøâ(_–eGñ:ÆË/¿lL¸+ÅOŒ!Üð ‚ †šsŽ‚})“ÁÙ/¿l¸ÏãÖëÕnŸUPnuÏ%ûèÕú€Î~ÙpÜ-•þd,‡p¼piwüš@¹üB»60¯_£ÀM8žBYõ)OÉÈ&sH§pFࢬòè%?tuuaÆ ®ó£QüúJ8jWWz{{ß7ù_)•þbЅ誜h))D÷µâÎår¾îîn•·º»»]¿+™NpšxìÅ qNk9q m0íïà¸Ë]?ô7箽Á`ŸK=b óhèJ¤ù™X¹õ§ E^½÷õ먳fÍ"e²,ãz xè)Cø}ô×/>{Çzã\"ÔµšF– ºɲì*È9«<^™©Þ÷£Q÷__Qý³ ÖÀúÁŒúgA@9q¡Ó ÷§V%½\Aÿ(HÊ¥Ûà€Öçy===¸ÿþû]›¢r§n߾ݴÏi’»M8Ó3®‹ðÔd2V¶ˆÿѼÀärÇ=O ÓäM6oÞŒ”>‘?,ËÕ¹)¿—Ç?‹d[ Î0öÛñ¼‘>ŒðH<ÏŒAp¼ÿAP“z;š|‹‡—é'Çqؾ};-Z¤÷»Ï°åO?ý®±K"½ïb¤§úw`® ÂkXÀ-@ =*ÞŒÿÆ|1,Z´===ÆxW1Þ‰‰ 8pÝÝÝH4'çãFº‹-–ÿ«ûP]ÄNñ 㠉梣å%\é™°>—Üö3)ÊûŠô7Ø3øV %çãy^ †B† À´ÕÖe43kˆªAȯ˜˜N§ÑÝÝ]2ýK–,1î?Ú¹sgÅùói÷®Ûòü¹É¦rP)èooùñ›0ð£1ùñ‘DØh2[“¾Ç©ÅøkÙ¥ȃJî@VZþªå¯š´Ü¤¾'×LÆr8ôÈy¸²k/-Z„®®»°ëLJP3B>¬•»šï0:nù½J? £ „{Áó{KÅ…þö¨ú™´Ë¿RyA‡õꤜ{AΩ–“ŒÅ[`Ñ¢EÅù F{Xg¹jÿ·µµíƒd2†p8n:nm/Z´Èy"%˜ÚäÖö¸,‚ËãŸ-ÊG‡ý”'ïY–MÊH<~¿Eã …{Ñ+¼ë ïzåæbq Ç?€êÆ?ÊP<¬å¯š|ˆ&³ç¹ßœv°öùyŸñ°bÎÊUMû›®wJñ;½ƒª…زÜ<¨^ä½ùTÔî'}Ð}}}¶ïN/ò‚þ–tkºÒOõS nÈš;%Ô,ÿ­pâ¯%¬å¿ÖyP‹<'ß²¥æÛô97üþ׳ ‚ ^¸f«£`ëÓ/áé.\ó[ÀÿþIÇk]¸f+°v±j·ÏÍýZÀçÐ `l‡f0* hkkC|d+[ÿ þö»“ƒ·¡oì˜q 7wOhßG øFËœ{IxGS2ÆÒø³YC»E³–ãcé Áà¦Ãº‰Ï÷?׬b–¶¸Ø?þ|§üÿ?ßéã8N½õòãÔiÀÀ¯²mEQ|kî¹Wýáßu:\áDDI"„ ÇeDC9ȲŒgŽÎÅI»6 šÌêóIH’&xK%BHKé²nVТw‚Î\^ˆ×/¦Akœ³Éüaíã›Lž)"þ·ƒ(Šªßï7DþMº»ž“ciSSfÏž}ûö^ ЀtHîÏO‚Z¿»­­£Ì‚CÀý «(Šê¤%@ŸsõÑI,ø«Ý>g1@§Þ±ާˆøVMEÒHßû'“‰¹¾Ýä“p8z‚‰3  û¯»][íMÂ{š Ìâïyóæa`šzxëOËÎsb1ïétN8ÎÖ¼À.ý^Â$þóÅpË-·`Û¶m¸úê«MßÁ8XÝDG;~"þ'd³MHDüHK2‚báx Ár^¨§(Œ¼¡b<辆؟ä­ÍØØZ[[ €@ €ÁÁAGnQUé«/LÃtAÿóåÎó«Ú}ÀÁ$(X‡;Vëñ[§_Q̇«ÄvÆ Biz^üúÐÄø2%þA­fà_l5ÿO—éë?¼«Vi«¯­_¿®Cü?88ˆ‘‘´u窚|Hâ ¶*† À5×\ãÛ²e‹ºlÙ2" Ö

‹Cúéw1Ò# •ÈPLc?•€ŽmT,äÙ#ó¢ªÿ´+¤\‹)'Ê6Ó¤¹ óë2óŸçáÙBùq- ý»à¯ŠBÞ™@zLŸ–äà(è\uØg}ÿTÚþtÓY›å÷/±åçyÙ¬fþÍó…óF«õÛ?¹ŸsŒCìamŽÍÖ§_r%r-mü5düß?0hËnQÐÙ‘_Œ+OyÖö°š_8¥¼sHÙ¯¦Ýe'Ò¯$.Õ¶Ãì8ƒ—vÈ›Ý|'ÎjÚÿvm'~§>ðja-ÿ©ƒ|ÙyP¬uNüú9ò™ÃÖóÖ>®Râ»>gò·–i·C5eÐ&M®@‹ÿ·>ýž[»±‡³ˆ=œEüoýx°v1Û¤î+¸Îš­xN»øâOhu£‹4kß4…s _~ùe|å+_Aߌ•¸ Ð7v _ùÊW0::Z¾5@+P–¡5¨ÍQ!óG;:@Þ¹d›þGeÁö¸ÿt£²`\W3(Ž|ô Øiû¿¢(¾{ž€º1z+.½ì2ÀòÄ=¦{½ìSç`òП°1z+–'î©©1 Ãñ¢äC<( eo¸E15a?¢ÝÝ«ÏÓáË… h«Þ[±?´¤mNp@ZëVüOV~'b`Zx h‚~"þ/†ÉÉI£bà÷û±cÇW/ è|xgbT_Ù\2ú@€.þçy¡æ&["8Ä8a º‚q=bˆà¦äUxú/ÀÈè$líFð–Ó'³H™ ‚bЈñ?Á'Wk¢ëý‡oIÞË`TNw맯{8 Iáoyl#¶<¶pÍüåÆ~'T*þ§1xþ˘ŒL"Ñô(>ÒïCÜa1kú½„Uü/fEc› ‘Œ•R)ó?Ãc¿,¡Ü,ƒŸÿÓéÔÅÚʰH¥ þÖÖV½¬VI’|¡J’ä#Ï yîfÍšŽã099‰¦¦&D" S" /‰§­ hzŽÍU›†(Šj:$!pÖ4L[üùkrÙÚÚª=[¿¼¹É4nhÞ ˃AþDü/w˜ê7ƒ°v´dÀ:{àMcЯ­;iLÁ÷ôô`åÊ•Æ`€[I‡mÝ9lèÙ` ¼Jc€MthÂ{‚íÛ·#™LbóæÍÆ`¥Õ€äe±:È@ÔX¶l¶lÙ¢Ò&Öô-ùÿÙ{ÿè8ª+]ôkûfÈà€«¤ $á‡]-È0üluËĆdLË& $Q›™!/3–4ž¥5™™­î'’Y3+±VõUÖ››û¼¢Hò$+ vµH ƒÝe'$á9 î¶M—Ô%™s­*›ØäÚõþ8µOª®ê®ên'›þþéîêªÚçœ:uêÔ>ûûv_}"ÂB*Šbee€#‹›ÈÌKH'L`ºŒì@7Sf³çžŸX€(ØäðJ´^‘?ˆDÀ-@E¶ˆT/èWQ+Õ¡ÃÏñÎëa‘_  íÞm­Ýó'Nœ@¯àK*V­Z…'Nxo ù¬Ž´ª ÕÁÈÿ³¶ó¿Û^›dŸªÁöqÈÿ̓®Éǵ‚ƒR ¾*ÐÙ”ŒÛÄ\ Ú‡L`EUöa˜ÕQ,^UR)¨ifë2€Ù (Cƒ hvÖ“¨P©Xb!årúЇCƒ(KȦ¢·Áïºý6~·àô7¿mÎ8Fã ÀžOtLªÃ½]ûìET÷ÜÞÞÔ'½¤ÿ¢=åE__Òê,òYoØ<¸¯¯³³³üñ¦‰­>Ï„Fá%¥»ÌÈmÐŒýF®ÁèèhKQíî÷¿ÌÁQÞ?iVzŠý–å÷Ô®ûSþë®Që›M¹Å‡ÆÆÆÔM\àÀ0 [ DÁž={çþ@ô÷0ï|7“²×ºìgRºk® ´FøØOI?q'ÒêCe!t>›²×_jûºëµà$Ø´i÷×²ß 2Ù'?°ÃØIØÍ`“]¶mÛiuW }Ú'Šß8-¾»z…(ð{Âo‚Ú^D3ý°çBjÊמw¾ñË,ËΫ¨déºK&“ÖÀb7(®¦ž-‘x/®›dþ%Òw(¾epÖG„2³õ¢†¯¿_¶mÛ†´º+pý‡L²5 ;.©¡g?àîÞñЯ {öìáÂÍ»¶ý£¾súÁûì˜/ bÏÅR™<k“=Îúà~þÔº·êb *{¿øæO ›=…L¦Ú~6ËoTö~Ã÷ùDÀ û~± /õ2rìn/€ð™®ƒ@ý¿Xt’Ö$ºü|µíD7\ûeRÍ?ÿ‚Ä/¶oß^ellŒ‹±4;ïÒu=ÖßßoÙ¾6Ë4ÍX#e zþyc£Ö?~Çh•Ø}-›ÍÌÿ ÃÀñœËtÂWlÿÅì‚kŸÎÌÊPu¬¿þo†oêµ{ø9½£º¯=¿ý¼±†$£9»a(Ü>çF®غµG#}ž=Q}0Š¢X4~Á%r·Xm÷nkV? `á.xxæ™gËå±¹\³³³XXXÀÂ]:V? `N.s"X(Šb1b¿ã½EÖqÀ¨Np4WbÏÛêíÑíF…iš±Oåî·¾p÷Ÿâý^ˆ¯eîæÿågf0ñÿžÆÿÓý+¼¾â½ç´m´ÑFm´ÑFm´ÑFm¼}( ’ÿŸ>³ù,[aNy“/x¦»L¬þØävíÂÈÈž>¬[~¸©FbgÄw?L*l‘…?øa0‚ÇUîl£¬½ä˜ ƒZâ'Np"rP ?)û8‰6n܈ó;oÁ‡F°÷¯Z¤"%þT‡Ž¡A ­ÎáƒfíÖÓÓƒxšî¾À[×ù•L&­¯–Šx Àˆ$aË7oÞY»|Dö$Ñ À)íypÿ:‚õ§Öà) ˜´W4Â8âEò?áÌŸÅ·øüÙ½_DúÉcÈßèleYÆ›7]Óù?™LZ‡»çpfê9HÒèž1ÿLàüOý[ ‘üOÈÆ²èïïç©öB+'ØÂ- ÀÉÿ^Ђ(e*æ÷!æB™ƒ@ýÃ4ÍX©Tâ}žÍ$°{jݺu<œî;€-œDRøŸÈá‰ÇUN.‹±$’4&6Çq~ç-øà‡Ù½ÇÉÿ°ëø¸ÊhqKk€¥m@Ç.;HÀ PV>äº$2DxQVîÕ]*èSÇþŒ#ŽŽb˸‰âœÙtö‚H®óbß¾}Ð4 »ví‚—¼8‹©NF£ÚeJzô_lò¾¯ÀÈÈÖ¬Yƒ#GŽàèÑ£œÌ[@´ ð?B?o)`ºìÊø%béTCAVv·ÃÆÄEP( Š¾û‘ý½û˲\E6J$‘ƒ1‹B`ib±\†¶¤@Ó 0!†z¢^S8d™-Æôööºž§°¸¸I’øö'NT‘Br£öÅŒ+$H»£q`óqqÀK¦ g¦C³5]zpàíÞ:&’vA4ÿlõP,^H¥€dòçöV–ÝKUWðý²ÙS({!—cûd2‘­\¢S6òÙÒÃÃ0 Z.ízîäluå\\Gfzš_Î3+‹Rè¹èïºýÚ¸Ø^ 8ÇÅž…î ýÞ®öÞ¿VÿÿmŸ`ã•ø›àˆ0ˆÏ?Ñ“D²Œ,ºùšH–ù¸ nʤܶH!  y 7‰ÂXE·fVhÜý,{öªïU\YƒÈ÷D¸¸ûÙîpm„@o/¼äÿë—ÀÏß0Y9à&ÍÎï΋ IDATÎâ'¿Ð_°ýf¯nN@lƒ“'Oâ /Ü'Ož¬:®ü¶ì·Ò®$I‘ÀàˆÏMEQ¬Ÿü‚ÝW×BŽ\–¨ýÐü-ö;Q„€ÈhÔÿ–––0<<ì:î2áØ0$ìVÛœŒ2o'û“²Ì k¿¿¿ß5ï‰ YÓüÕŸÊà½þtþzö †nPç&û^Œ¨ö[! Ú÷Ñ½×¿ÕøMÙöˆ  min½õVìÞ½ûœ”IQë`ê6x2ïŒô¶d—‹²íQ@(Õ¡ÑÀã „iÿF}^aàíÿ~eغu+ßß4͘4#[¯Hú€_czŠ‘ÿ/˜‘}}¤Dþ÷bbbÛ·o÷%Ý“ðæó*㎟»Ñ, D¾Î¤tä<$Ø_öo±ì³ Xþ½`Ç.ÎÎÎÂ0 œ?–cÿÝt p葺ö¼ðÿ×k‡Ç{Ì7ø? áÏ G”‘z—Êì3Ýe"?/ù–ƒ²Ò¾ó[L‡p?ˆœÉ'›ø–q3#þöâ[l?j‹3SyN¯¿_?I’022‚ñññ@/µQˆýpH%"‚Hà€[5L&x/ñü€õ££\ô£–M€ ýð@ƒb("ù_€iÞ€«ff ÅãÐÊe¨’Ä…7Îþ½ô&Þ—8Ïå~‚«2׺ìj[Jx_â<ü{‰e |¥Xt÷àæEZ¯;Ü~‡9 é+ÏpÕôtKë/I’522Y–]kW^y%^xálݺ•ù×eO?ý4®Z·ÎeŸùûÙýG÷-ìÅ ^‘£ 0!=‘‚fÀ7⨲ŒYÝóþ­ôAÕ lÛ¶ ‹‹‹0M3²¿™@ÄmÂÂÂV¯^ÍŸ34¾Ò˜¼zõj,,,T'ß«qâ:î™#B$ÿ{±qãF\ýõ.ñÙs…ç¦áê‹8Ñ?hŸ 5‰Fá½T× ¾~ôèQÌÍ͹hy[ ,èe™¿çÎ}pòäÉ*qëmÛ¶³ëàŒŽŽB¾ùh9f/•a¢¸"ñ‹Fæ>€ã Ö é:®8Ýk¶¯hRQ 5A¼QKü&jˆu¢ÍÅ£^ƒV £ÚØÜð /ä}`¾–ŘHÊÑ@âî'9ùÖ]\.Œ)Uï!aHý„` Û¶mî]»|·‹ÈÒ @ƒæ»”`À " ‹s]€Íwµ&üžµtýýP”ŸU#’ÿæÖ_Ä6«T*®Å“¼¯¯¯i²ØÄØIð3Ùw 4.@-®ƒÑš—iš5û¢¯Mƒ±hÞ Üùl ©íÛ¹ÐÆ ’ÿGGG!¥¼’ø$ø$Òêq¬<˜€‘üŸšIàÍœ“ù—ÙÿEý# Ö½ €-Ç`‰™çzëH)À¨ÎIè"hì)Œ)ü~ôžÓ0ŒÐ"ÈeP™‰ˆp÷=A8@ÑDüìÓ:ÍEý®=ùÃü ŠÁÔ{ïÅ€híïzçôÌ¢>{Åg!¾Å„¼!-—F*“çïþÞãZáË¥ãîØ‹Kï,?è²/Ë2R—~Üu\>›B*“çïwQ0€ÚsŸ×·7ȼ ¯o1ð‘<|ÀÉv„(× §UßOé.wû{“oÑq­h?ñ‹‘‘—ý‰‰ þž'λ è@jÆïîW–‰‰ ȶ»ÊBÿûù༿ë]ƒZâkã!}ûž§‘ù?=¯P LÂåÉ×ðRñÝ8˜:… ‚ØþÁÔ)¼T|7ÿƒ¶Z®ùù­þáÛ@¬ÜÿýÆœÞQ{ü³íù‰ÍÌŒHðÆxEMç烆‡ÙÈõoQú íO>JŽÕè}G$ú^Ø¿÷©çñÌç7ã¢@=Q~ï  º®CD$I‚¦iH¥RÐ4 sssœü¯ë:@FÚÈpNH®†Ø?W*〡à€fà!þÓ+*Ð ˜¦ûìýßµ`Ç=†Ó§b:–áÿ¸õVXïøž+ÆUgß…¯eîÆ§r÷7-|ÞFm´ÑFm´ÑFm´ÑÆÛ"Ö-?Œ§Ï¬Éð®þؤ¿y/ÿ¿sá^ –Þ…3k·áé3k±Ñ3¢ûe½‰„óĉZ'ÿÓ¾Œ°ËmÃkŠØy$‰Üã*òY‰3XÕ‰·r(9ø)à¤þóì ?8oó=œüýæH¶)ò?áÌÔsH&?‰bÑŒ©’dÝeo?ž;Î sh³ù‹ªêÿbv ½$É:`@±ƒENž? H šœÍ3ç§¡u!žVíû ¹ô/Ìœæ“SLaØK(è>$Á&Ü7äÛ²T*Y‰DÇGWWLÓÄñãÇ!Ë,c‘ÿ‰4†0MðôM«§¼.¢ ÕKYùô¥5ŠL`Bö^1X{û2»‹Hþ×dÍEX€9È …‚%*Њàô]îÕ¹ÀÃÆ¼‰¿ï=§¶T-D£ëzLÕ`eá[hñW ":qâ'ûùŸ@¢ "ê‘MÃØÏʺ«ˆcž> _de >ø Ô "8k7¶˜ÏÎõ`j%âi¥Jš-r.±¨ º®Ç4M±R)I þ3‹—ðmÅâE‚€‰lö4ÍH§hšÙñ´èïE¦ÒÚà×¶}/.¶^™ú<.üœ‡`Έé?ûÙ\{¿ÿýb/¸·Š ±õ•WñWÓ^‚;³?2rkïññûZdŸ¿8ùªkkrèbŸó_l'_µÿk]½@póÿ•iûú€eÿ×Z‚R±Û5@ZŵͻoTèºËiÕY‹‹‹Ñÿúë¯ÀÏi»bÐh”°lG`¯ò × ‡ýö#ßlžBdm~\BX"ùßâ,ø§ÐXSׄoØ€à6uµA¶£j£ä“ß°}1û†íÛ·óà¢FíŠäÕZöMóIHÒ<ó‰Øw~ò —4P–zýP Ôúþ /Ûß àe Ø&e™‘Ø ƒ à$$À°ÉnØ|ÂÄËö™¯Î³'ò\ÙWÁH™ýýýØ©ëo+û;uÝ%ò'×±/Ë2vîÜé"l¼4 êø8v›æo¤þDÌß¿þüÆþÍ+¹ ÙWíó®/²˜ ‚Ÿ}„'£k+\öE":mgûµFx¯U¶ÅȰåÚ´i“K„G|w”$É"zP™D2z”h«“—¡’â6vbbòöíœô.fÿ5rŒ©'gæ[ð¥ýí6qÙøNðÉ öŽ«K •AûÈâ¥Þ ž½ùk“ÿ—ßt àÍ›®Á¨Ýîôüò#ÝÓÛ·oç¤{€ (ãjãdÀE¾Î'u¤U‡»nó¾~Ì?Deo ç9½þv(x$´›Ø€“Q²V;ˆ$TA˜ÿ:¬mo9ÞÉÿ2TEp¢lpA"AçkvL c¯8ÇæÂtý›?à×áÐ#˜µ3°“Ïǯ,Dþ¡@tZh¤ýwÿ#$ºmI®"Á‹ýOE=ÔÛ‹WU!ƒ›}Õöí.›.´ÞµÚ¢:ó- \Í÷Ù¸q#Rû÷v½Å÷¯õ…õöòò%€à›.¤Õ²¸=sžËýWg®$ Ïå~€ ¤ ©*¿È+Å"ò² ü)pi2‰Áqàû«*X‰àg‰0ÐñÔ–ëí1‹êÙÊúSàùÂ7ïEg7ðžåÌ_;W,áe°Àû‰‰o`ûöíÆ¿u€@þ7 pÞ½ ÛÔ¾í@àÓ…”C¦O]Šƒ©W°Aëì>‹>…¯ÆÆÆP©T`š&<×¶”X6úÙ×É&ˆãÔ¾aÃà8ÀEWdYFIÓ8qÝK<÷ A’$ëÄ_™€-`Ñ­ëý¸¸X%@í8Ïþl,[³ĺ‹u€aEÁÎiWˆ‘?7} Ê٧΀Mä/¨õªí[B6–…:«ºü.´DâËDþç4ü_¯þ"n=ü¸<ùp˜ÿÓŸâ‹Ùx?µð?ño0¯ÿG„ØþØçm øßÓªÂÉ£££HÙ™h‰x¾zõj[ UèªÒðÜG´ŸO2û;uCºŽIEqÙ²ß-UI‚fûáˆü !2X=ñY–}Û€lÌ(®=(ŠbõööFâpüµ¯‘ÿ©ÿ5›u;Jà¢s·Ý†ƒ½³öZvìhØ6#?± аEDÛ½£:7ü>Ô;ÞÀi¯T„X¯ðp> ¤ñ¡x<γÐÓzô¶mÛx Ìö팈GÈgS\ RÅÁÖ>bٔЃìû‘‰³£-)M•@ €ª¶…ù…øŽì½gçææ\D´¾¾>—}Š›Àû~"™@©Xr‘hà P„Zuæß^û^ò?мµ7é=cMÓôµï+@c D…_æf:ÍÇ\ä;B Q£ ,ðBÀº´ôu& à>kèÖaëŽwãé_!ZDé©ÿ@öá_º2¾¡XtE@ÉJšz%ˆß„ø!ŸÕ‘¶}¢aõêÕ¸õÖ[ωŒˆ ö'ò?½sŠëqÔ—IÔ 9Ø@@zÌž?Ù6Y ÉÉÿÓã~þ°û_$á7‚D2|H ?ˆJå¬ÙSÈdØ:8ýæûoÝÅŸA6)œÛ+€ÔŸû|äÏã;0ÊÈù,ö3Bý‹ÅiW_;ÿqµ¿D’ϦP,NÛ> ““ÿÉ'äÝh¾ýÅy!cdd©Ì8÷=xç]ô~Öh¿×u=ÖßßoÙk|”ÊHUïøHÙkbâ¸+ÎÅӪ“`(;|P,”wÞ'Â{ßûÙ´khþïûoP¼˜| pyò5 8nmþ-h9‹ÖÌü¿^ÿ§¹ 7þ¹™ù¿$IÎua×YçzGõªBs¨ÝS ’$YÔG¢$ òÁdR:r¶ð¢( ÖY|ÖÕ=*¢ôAQ±R©ð{MË™H«J¨ç¤¢(õEâ¿(h"n'1qA×õ>¿Ùò?í÷Ìç7úE±D²<êuÝ=Ï׳: j\pг:bÂnºÎâïn‘uNÜ¿EÖq þÒ±í&þâþÄítNq›Xÿvü£÷œv}ªìÿó‡:,t®Áß=x0öÏß`á8{÷ø»ï-öÛï½ïÛÖîþS˜Kâ­n½û¿`ÿ}÷á­7ñúë×ÞFm´ÑFm´ÑFm´ÑÆï|D¾R±„3k·q§B© $Àœ$”FïÀªf G™·ÑX‘hë…¶¤ø):Z==l‘,ŸÕ±óÈ$ߟ'QÊP,cÉdÒè{gg'ÿN$ÿÞWY°OùjÖäô¼âŠ+|ÏÆ!g—×êéq2º‹Ç½˜]À2;¾'œssèñm?øá,žx¼~H±XŒ!éd(—e¥—ŸöÜÐúmbõž×Qzã)$₤FYÚó:2ÿéCÀ»Åd²vÖsq±M,ë£O|ÍEê—öÞg·ùœùá³X~Ó58ÿÐ#8_–ñ'ÿ¸vïñí~¦nëÕ?™ü¤«þLë¸Ë&Ï1'ìKÅ‹ðÀô1Œ$cUõ'¡€V ãÌëZú¥Mä}O‚ÿîE/úûû°Eµ¡¡äÔ<B³Ï7jŸ<‰¼K¤_ZPÕ÷µ%Xb}(úF¦QÓ¾0M3F"óóóèììä÷`ªC‡´ªß›Ôþ´¿µîAñÞÜã‘KM»ãˆ xÇ—Ö+â?I á}ÎXàÎ~©ŒÃœEÁ÷‘ág…¬g›6mr‘ñïxߣ<ÃÞÎ;QÄmÜâQ3q%{Øb¢ØŠ¢X•<;g<½‹+ðïÛ·/¼ð‚K¥Ö(((FÌtî…—ø/ÀƒDdY†SF§ütZ@/ñ_´K `©\Æ Äº¹@.î8Úu]©¶˜„Â"‘H¸d¼ö ~Ä¿cjíçE²»Û0dÛøïµ$àÝî·¿ª!Ô¾QÀ‰¨uDpüì†áº¦1_pD¼kYYG¦"q!ÑV­²ÔÊÄsX†S+ñqA \ÂBÙ­ããøþ ó7R"ág}‚êÙñc[WJ<³ñ¡ÞÞ@û[·nåû‰ö‰üošOâféÆ*ûa!’ÑwïÞ yëVND§úW²:-ܸs®mÓ8ÒÛÛ‹ùùùPYyé}¿T²ƒ'³X(¾Œ Ú .RGd{#×yûvß2‰QŒ×õé`¶<Ðnbb·ø}§¡¨„#?„o~XxE`hµw%ÛØÞ[·nu_—̼%Ë2ŒDHt ®ÆOÿ4rÝEòöÿì&Ý“]òÍÖC˜9„:9Å>3)9KD$"Šþ±°eñÚ5 Ø{Ÿ‹Ü~ŒäD8У££.òXxÅ~DŸË£9‰Û<"¥2óûf=åPÓ&ÿ_ü|ô/'ëá‰pÂ#."1Þn71ã±'f¤ÌãDþ÷ÖȰQ„¸ÅH§G™?Ù4MŒŒŒ`ÜS Ò¥@ôF®!¨ÿ‰" ²,#U©p8à(ªHþ¯E"žnôc=†Ô­·’Ä3‘Šh¯‹üyLöÐc!'¿=gÿ¾Úõ{ÿþý¼ÎâwÐO܉õöÖâ%ÂAQëPo/¶ÙÖ¯‹H†ËÿøHîQÜž¹ Úç½€ˆOSÒ€•¯c+̸ì%þ{ý 5ë¯ë±õ…‚„¯¿z’ ÌÙþä^£££Ø¹s'ÿFA©ò¿";6£0ˆðÔL®Oðþµ—0ЧôaÏž=XXXp‘<Äë•|8¤mÕR]í~ðàAlذ'OžäÙáÅg¿®ë1UQ­¬ào Kú÷¢×,’eÏo8Äs/]Oê ÙÀ‰ÿt¼Xÿç¦áê‹ø'm¡Z*²±,²±lU;6T ἄ£Gâúë¯Ç‘#G¸/‰€FuðñÅÔëè>Ø¿?ÿÏïþKR€–Ùœ¾&f{$"ý'Š_’ /¡ Œ%Ø'‰Ð÷ë„ÿ¼BiUá÷­M ýì­%~S« ü (ŠEë†Ñ×_VÐ5 šH€,[›u±–ýíÛ··$ë®è:Šd(Z£¥µ^úOl/;ƒr䀛ìLЄ{IüO\³ ø­A$ž§U‹‡{ůDûôŸ‡Däñ¼Þ¹u³H4æSYD fÖ_jˆÇÇÇáM ¶Åââ"÷]ÒuH$@ Æ>¦ir.­Åçü×?³)êì¬KøE´¿¸¸X-@#ÿô¡PàYšÅë'öiY–«Äà–lß* `ÙÜ…‹°A[³ I:»É²Œ³ Ü!{<÷:3e<l‡hˤåGþŸù=–aEM™H&™ƒ0›ŸÇ–·¶ 0W¨€ˆ rÈÕäö[Á»tF²J$€?NP€+-bn¾ö[ašf¬R©X€°—ïÀÂä)Àü:¶yò¥’h@w·AF˜À{Þ?`Uÿ‹1 i1A€ÑÄEHZnû´}´›;T®oŸÞÛ²pë´êz÷+:ûÐø"nóžð"Áб´­‘ %×±ÂóÖïü~e3ÏßMª@žÞ2nâ’7ùž20`û^ã§Òu\k/Zÿä9Ï_]½O-ÔjÃ0011K¶owµÁÄÄŸã_û^ÙŽN@Ïvt@ FÖ û€›ôZ+è7JN¯ðB½zgê¼÷ásùàÕXà/>ýkàÓÇ }äñ“_踿£ƒødæçy¶¹zmµš¦Û*I–HØÞl¿ + ˆœö°=ϋй@âFþ(=õ|Þ[S ÷ê.ò¿xýa“÷ÏËãõ ÁÔ— ÛdYv@(ð[ÌüIè´¿Aý~‹}mÿþýÜGK¢¨©Ý7|-Ô"žšHb@5ºþPo/?·$I²ÌeŸr6t\ÍHÿKϱïöoY–9 ×û]YùôwB„p£‚ÈÿÞí7ª"§§ *¼™Ê© hÜ}~Ë–†È÷ÞsÒ÷ :‹ßé˜(äÇzŸ#r¯Žááa×øG‰ i{ýB¡¨¿ìOþkz/--qTºË„¶¤0ÂZ,ËÉìQ²¯Ó1A„íþþ~lÛ¶ [‡ ï »Q‰ß’$Yf¯0•ÁHÿ†ýÝžŠ2¡õžªï¼IR!ú{¿ë>íµA[`ÄÿaEÁNŸý©þµÎñúû 1ø óÓzÐDǰv aœÃûÏëƒg™GášR–Sšõ÷÷C–å*ß;Å-x¿G±O˜Tì´ Dü˜¯hRQ Ü>!Ÿ-‡²)"ŒøÍêÕ«}ÛÏÔšM9kD˜ú>äö1.Ò Ùvõ?q¬lTø¶‘>`†k¾Ò(‚lÆNü„½FKs1ʾ\}ýuF ²ÛÄÏ$< ¸çþ4ßçۂćJÅ_{ uŒ(s">r”u$º°LJç󰜦p±‘ü/–2FÛ¤Ðú)€äío@J«ñzPY‚Ä·–ÅU½ó§?Àú×®]»\ èZø  ¢ÜõD¨Åù÷¶m,1LOOOË‚ ’²H€†ì‹ \4>å¨Q4BKëô\×»Nž<‰ŽŽ<èäg޲§(ŠõËìÿŠÿ€Mþ/¸HK„WK)¨Ö¥uêY/îÄKz÷>K+3&m±÷ÊŒäÓu=F¤ïLJw­Ÿ†'Š®6ê•¡®ýÚ+õìnò/Åk´*Î)™¬ÎúìùºÃyßö&âhæuG ظ)˲ëÙ#s½Ï&áÕÅq¼jLº_RÃ"›½ƒƒaŸ@êR&0òjøAȲl“Å+Ðri>þÿ 8D2ó§ÖÕÀÂÍ}6ßpö>õ<'ÿS6l"ÎR›eRŽðDØùOPûç4ç¹V,NógßÐ óýP»RûgóØâ I’,†`ÿWÞy©ô¾µfÍšªy×Y·Qèºëïï·w‚#Y–«ÞûÖ¬Yƒ#Gœ8¼]vÆvq.”Ï–O+ȤÞM5Dáƒæ^Qm6:ÿšûSÜ)à&þÓï Ú ÈòЦçÿaçþäâo­žÿÓñ…1Ù5æÀ(‰ÏИãóJ$Ë.ñ¯F’ÀU•ÉÇçLóÑ(^ÿV½{ˆ¨T*ü^¤÷Z¤9¸ØÉ2òìYR?–ÕFö;Ì—½÷©çÏo®úŸÆ;B-1€È‚ BG; U?KW?ÀÈÿûöíüË¿ü :::¸@#çô‚Ú~®Tf5ÎGû¡Ùõ?I’¬¯eî|*w¿EbéÃé$ñ«Pª<Ï?ßÿîæ÷å0?ÿCt}2ƒ5}Ùžl¦m´ÑFm´ÑFm´ÑFm¼ÍQSàé3kh5_b¾y/ÿNŽ‹3k·áé3ÀrD Ò-eïééfǤU¦n*»ˆ‹™ô™ÊH–,Ë-É,:‰I‰0™L2ò±kõÐ1 TÂBñe¤_î:Æ4ÍØ‹/¾hÑâ@TèºÃãªoÃ'¤Þ­N–rEQ,Zü°‘Qº®Ç b0ÉËv`Ȟ׉þ x¶ òPð&.úðæÞû¸–E±h¡÷G%à™"[œ$1†óñΗeN mº®Ç&ÅEŸiP—öxî€x©øn¬Í¿…ÃéßÃKÅwãpÚqÐvf¤Èê‹^â?$+I¨Š #Ïè@rjD¥ ðÁ³ktúxUçˆ/ñ`ÄDU3ðÁgñÄã*Òvgï`/_Ü'}#ÓP¿ð'ØY*Uõ ÙÓLÓŒMOOóë˜KÇyÖöZu¿¤tá¿Å±Ìµa‰¼0‡w﨎ñ1·-e¶÷ãä^(D¿ÿ“=,ð—lÇ|ß¾}8~ü8†‡‡a_Œ¥ r¯ÞJÙÆ¼íPp6‰ ³ŒÂã¦ò?À”"a_´¿”p“¼[ÀPÉéoAáÖŒÌ-+‘H T*¹ldY®"ò1ŒÊêïyê!ÙÝ ”Ë,¨fžÄ dhUNtE°yn² ˆ×ÿŠ+®@¥RÁÜWØ*UÏ_%ÑÙÙé 0M3–ÉW¬Eæ Ÿ/ùß0 ä § €êÄ®6c½d‹0 ­´ªö‚¥€À®ÇþÄ€`BoT8"n‹— ›ý9Tu`‚ù_ÓL;û6û4& –AüýÝï~ A—²ýœ"ò»x\£ bàSýééix··Ê¾÷<~öÏ]ý/¶6®x ÿ¤=ɉÿW¾ÿøÑ!ì(8mذÇwˆªð«W¯æBQí¯Þºÿ¯ø‡+Pú?Ùà^ÄFº»»qâÄ þ¬÷f)$‰ 4‘²øü2៳®ý¾¹ÇùïcýgQ,þ¯¾“Là›{–aÿ©‹# ùß;Sà¿}þ'q€Á§'±qûç '˜Àƒ?­m_$ì‹Û¼ÿ{ÅI¼Éý< ½Æy ô¾R,b!çQÓ¯–Óä“ìX À¡ïv`UݱˆH×êÒ’ë^*Î1Ô-#Œ|/’ÿy;ÙÄ‹,‘·…¬íõÄ$ ¶ Œô?o'!ñyï €ŸTW–¸Fá×d“ȇÀ‰çôoƒk‚‰ÈçÂ>e $Ò«iš¨T*L€`):Ô/g½zg ƒ×;3?ÏIàAý-èßhaH?)ÿ¯Ià~û=‡ÊnšfL–åh×áû¡iš1Uè{-›nã•bª0Ç”e™g¤…Bbò+쎎Âк §æ‘™Ÿw÷íl_ÄU6‰›eÂaYȈ6ðô\ÕŸì§ "ñPo/®š™áÿO* Ì÷¤¢X¢`‘׈À–®c?U©ˆš/œð˜~ò€_㫸¯ÃÀ™©ç\YÖÀÈèµìoÐVà ^5 5I°œd ž9’ådð0 `Â7þðý€üX3òå×RÔu=¦Œ3¿¹—ˆÞèX"õûÈÿâ(§æ-5m"·kWñbbßúÖ·\I˜ÜýȦÜ}* 6ßpð¹½xæó›ñÄ߯Àž¯ÏøìÛ*᛹R=‰n—à“MÓœyÞÉ{0ÐüÁЍšlJ¶‰úáëßc;~ f+ÎܧZDàÜÇ?À_ô}_ý‘5œf³TyÞõù³×JHô ã.§N¹Žýï=„¿ùòdä8Ä6Úh£6Úh£6Úh£6þ÷€¯€³˜·Ë¥b(’à6|f+ŒÏKÜéNäÿuË£T,fz¬/q–²h?ñ¸j« êH$œLÏ^“ð\âÎ'?ŽwžÃÜÀe@é2ôLÇ\Xžýû÷[âï(¶t]I’d‰6°aå ÿÎwÀÊ@ 2Õd:O»ÞãE± —©èììDéå§ØŸ{nàû•Þx xW#bÀ²6 …ºíô+EA<͈©ïüÔõ_þÆ‹Zæèë?©(èììÄÓÌ~¢ðÓÇIbŸî¸/ßÍEœ _ÑË•¬0‡Ïäù“è}µrŠ]{5m"§)è•e ƒg!9}üæææÐûj/ J¡!â¥Z žœr/æôÚ™è{¡PÀ•Çqå±EÀÓï¸çbË333®>@Ê™­°K" S»±:ù}A$…ân(Nc\wDÆx‘!~i’ŸNZu•Øí1°0ÆÚ‹Ã#üÁEìûþá/ûÜE—Å€—-ž¦é1Ç Y–ÇÑÕÕų~M±2vw³LàÝÝݘŸŸGWW 6!áÅ@¨úeÌÅY_î3¤»ØõW}Ú~Áþc¢}K fe¹¸‰L¥u™ D!†¼Í3swKBÐÂ/|Ù*H€¾‹NI •’LþÀ)hZ}2Ž7ˆŒæžDl¤,¦²,We: $‰‰@±0wQû„dÆÆÆøýX.—]‚ÍØg‹™ð­¡Pàcþ¹¨?ë±ý§.¶ö¯¿W°¹Ë?bêÑ"ùŸà·Í»8|èÐCX¿þÎäwfSsû'N°à‘üOðÛæµ?8x¦¦Ž@¾¿ØúÊÀ«®-«®:ËEœOFøñÍ=Ëð±þ³ø×?¾ù÷l¿ý§h‘>¼ýÉîWëîUŒ1¿߶©uCxð§dÿâPö£ŒÙ|\±Q+Ð6ê³€Ÿ'ø‰žaÀè݇HH ,†2¸ßï!°SœQ ´€lnæBÜõ%6á’w“oEÌ{~w ߯¾×&à°çÏó2{~E½Am 1£££¤:úÞhϯ}zöÙÀI¯¦iò±úço˜À/ôÈö½ ú‰$o½E±*ù&Ì~ï&w?[µïu€ÄÿÂ^ƒfúáu`s9šëq"‘-ôæ ø‹ûÒñt¾°ˆjÛ¶mSã0´.LN–ÍKèïïÇN]Ç߯öwê:Ϭ"fÂqg…•e,øœ§TVlÆÇÇ‘5M¨R¸¹h£×¿ñù-[jf÷{ØbÇy‰ÿ$ld·iò}É~^–qé—†±¾PÀ_|ç§Èßx EóňdôZõ÷Û·Yˆç3 Ú؎±±±*Û{öìÁÂÂÏÊÛ ?={S0°Vˆ%¥±K,C«‚ÁÄlö"ˆë%ÀÒx·Á#ZW›»a¯½¿½O®+°~"0•lR§°Pd\äS2ÍcUí-–Á4ÍØÚ¼ð,±_ ó7^„×â¨þß(YÁ#ÀÈæ’Á½ÁÖbÀs2 Ì^‹«-)8½þv.jÐ P;ÍÄv;ß1ð#¶°vbD(ª/CûÑñøÿAX~Ó55_âTùyù®¿a€ü5íþbTÑ×¹ÿ~ñ^œ›5Ûþaû_(*:ìl´!IàôÜ$ñœ¼,# gÝ- Z<àd€o Hè¶ã°ž—ˆwâ\”H*¯N9>ùÊàâé`Ÿ›,˸jf¹tÜUEQ¬|¯Æ‰áïKœçÊzJ¿KšÕR!˲EkfñGOâð#gQ¹­‚ø£'! J(O™è~ôd ùN ë ë >ÞVò:ä”äÊ@,öl^âk=.ò}ˆyÍáæŠ¥*á.°ÔeÚöØÚÍ 3)'» ù¿žƒˆ<Û²Àä‰ÿTî@ÿ#dj‹¾AQXöÌr¹ìòýóóÛ¿iý®?P=^ÒU#ˆÙ/á–]Ϛ׿ ¹DÂÖ³’×QšrØ+ƒC|MÇû^}0Åæ—'™øøÓÇXx¡þÍ"ß˹’¦AUTkll ñô(ƒ¸htfgg-n!‡×_–e`®µStxÛ?›—ø½I÷0•à}¹%ëÂaæ@^ÑK :£oXx¯ç°¢ ¥ë˜ Ùßýö§2°6“‘ÊÔ'_†¿ jƒÅç—¹Ÿ‹QÉo"Dš®ë±xšÝ'\ä"@þ¦à­?ÀÚyyÀþQ„·ëA½ã={Ùºnaì=.±w úú7‚FçþnòYt"~"™¨™%Ú™—MWÍÑü p ˆ4(€ÄH–“ÿ©.aH ÃÀr"RÚ{“l²žžŒ»ŽßW\G#òS£Ùhß;¨D ihý |‚x½{‡‡-ǹÀJ&“Ö´ú78¯£(ý+~ðÒ¦ßÕ$|cOˆ<ž[<™ÞADÔ¿Ï'–-°‚žc²yÉ’5ÿóGàòàÃ\j#ïZ’p#]wÚîwÝ[9Î’I ¹:‰8Ä:n†VÍ ÅgPûù“óøájëAð+w<Þ‡löÔøƒÈf‰èèŽ/ Z.úvî£~$Ž—zÈg>Ï~_ŽÖϼH«Rl¾ ÈçHÜ Ëÿ5²y ZŽ ’©L>²8ʼ‹îËVˆÑPàÈ‹ÑÑQôôôàúë¯ÇÑ£G177Çc AsñFÑŒÍFæÿÞ~s…ºYÙ¾ßJ€j¬°+UÇDÿ72÷Z3ÿgkþ: )UB¹õƺ×éw*#ñ8€Z6ýPÏcFMŸ³X—fÅÇ$|ŸLFÞàþ—‘‘=z”÷IÞ>(ÆTøA×õ>¿ÙÂçö°Éÿp‹À¢þ0Îú\/ÃeööCQ&›òA¨šáòóêºEQ i*• 2™ ô¬àŸXÙd2LMMq:Fœ/ÞRãѬëzì‹^*zl§ øÇE/Ÿ­>þ²eÀËg[ÿhšfìS¹û­¿èû:ÞxÃé$ñ«Pª<Ï? ‰8»fÐQkwÁ§ðµÌÝøTîþ¶@m´ÑFm´ÑFm´ÑÆï |‰dOŸY hÁÎmY–122‚凙3|ùá]Hû(&GHœõ:6ȉ֊ ‡âç3O#þÝÏuc~=‹ I&«‰½ÍÉùCÄ?/ÈA74ho(ë.€FlúÎÕÙÙé¾ñT«NßRßù)¾½ã3üwïPÓgÜ0üêOdª$!kšx`úîpré8-jÖtI’dmyk ñž’•$Šq{ë—@áâÒnê[7 ¡Ç&ý÷ô€“ÿ(6‘ìîF"™¨Z@yâqg’·¿-ôööb^ȸHYƒýÐJ€ àIàȧ”.Ú/­°sÐí Þoné´Î~©ŒäM¢”*bí—Ê¡Dtžááa+H–b¼ø° €‘þEô޲߹1G„â›6aß¾}|¿ÙÙÙ¦Ÿ¢Â¸Hþ`êDþ'çn©Äx©ŒÅ9¸‚“I !l¹ö—Žacâ"nŸÈÿñæö#ß/%€¥rÉn`ºŒT‚Ãâ9Ã@ œ(yVˆØªjl‰hß{® Ûü±–²2Ü¡1R’ˆø1e µø³¹eNpEQ,/ù¿\.ó,ßpâÄ .P.—Ý™p=™«ëA’$ë@ÜDŒ¦FÒC‹Çã¾äѾiš||hÔÎDú÷â›{–¹Äh›CúÂÿ«Qovà÷1L—.¶4n_„aÈäíûÜ#(bÁQÀHû v"„ Üò;ŸÌFç‚Vpÿ5 N@œ ?qüqP=öÒ8OvZ1ç$â?‘ˆÃpNßÄ~W~¨×$ßø¡Ù6ðž KÑH˜¢}Ã0 åL¤2’Ë> >éÕ˜™íèž-Õµ%'‘`üê rʨ"Gi÷—z+¸¶ÀÊ.˜‘][çºJ’dí6M\f[GÜWŠEN(Òu=¶k×. ÕûÜ'ÒÛe1ç<—¸Î4±U &_5cß4͘œš· ZÎD±hb«ý<üþ ómgëJv¬ê“ Çkß/€xÎ~o§¾»9vnëï%^¥ö½ÛDâ?Àü+föß*IÖn{_;FÜEæ#D ‚Éèaú+3ÐáGGGùµõf…i4.µÎåíaÄ( B°wíÚåïýÊÚ âþÚ‹¶‚·BÙðóM­N^ÆEÄö÷»ÿ©ÿÓÿÞóK’dùßï"‹™âÍÀLDðVø¬^!'?¬—üæ‡ÏâüC„¾'8鯑rŒ;ø6±¨?À–-[x¦ÊóÆUî—«e[×õ˜4š±` EÒ¾…„˜eYv½ÚQ}O ß]!ÈðæË*yæ‡ÏBÁ#Ì÷ f¤ Ê1ÿÌG~ן(Û§G3ø÷÷¾WŒÀ0 WD‘ü/’ è=úôúÛy}£\û øõ??QT€ 5Êrt¸wÿˆh×_üNca-vÿÞàÞØq5#½ua¿—žƒ¢ü »Çz{{±jÕ*Äãq\xá…¸òÊ+/8h±{èÎØ êHûÞí†a ¤i¸=spò‰wz& ¤Õà"G~ä,V~Er¾%Tîùÿö…¦~ehîu¯ß%Ýe‚ÖN´¥hD Ó4c£££ÖØØ—Qú—¿ö}‘Ó—ÿ›Æ½C½½|îFx ]g™èQP‘µçM¥b‰ëÿ©[o…š6± aȧ]ÇÿÑ÷&Â0 ”Ëe—ï`>ž£Gp„rT cF$I–™ôˆ»ÊŒüOÄÑöúGª¢ ¥Ü$àÂÏü ´´ò /àäÉ“¨T*X\\ĆBCºŽ»p.O¾ÆÄȧÏÍšx"Åî-òoúÐzzzš¾t`l ·þG¾}je|ݱã×|#áï04rJ‚a˜*²7€Ád´aÑOþw/P$}ךƒÑ硵ìç% 2€)û$§Ø6ø¼ÿ5ê +~S« ‚ž‹Q‘H–‘OºÉSõéVn( àˆñ’ŸÓJŸd{||j¶ ¨ IDAT#;v`ù½÷b¯½¶×.üò—1::ú§Öõ7fؼ‚Ö4¹YýëŸÊïç'¼eîïµÙ éNÌOk_â|W$Õšú•¡2$€@$ÀG€äì×ȼ'¿Ö] C¤$á+oBﯪ®¶ §ß»ï'Z CÀnN€Ú·D ‰¸þ•V5äóŽËû?ã}}}uçâÝÝÝ ]Y–adÞ´H+™LZÓÇ»ñô¯€éÎILïÆôª2°Øi‹Î{+¯3~lgs›Ä obr'ËÀ,ƙ̌H¾½°àâ=a1­* pyëÔϽeèééÁþýûyÐÝíß¾}; ÃÀެ¬‹¶&ügöÛsBQ/¼ëVT. ù'â µi?¿8ö§‘IÁ%á}öP[Õ{þ„ÿÔÁ°µ.dy…dÈdÈ¿Víg»âŠ+°\áO:¶eÔÀÂÏ}./8"ó†aà‚ÙÕÎjµ?{²Ï‘‘×qîØ&ðœÊä- 1بó®V‰éº“S/·¢(%8¢±Í0 þ œ››ùÚh»ß9IdhUÏIï¾As¯¨6é{”ù-ûƒÝƒSÎþ™ÛfþQçþ@óóY–‘ʰYVgƒ·Y%ä˜ãíã$‹âƒ ^dqf:Ðht û@©Ì_ÿÎæ¥ªwÐz}b+êù ñùͬ¯ØB„ìwX|‡ú‘8t}§çÈã,~ŒeØŒ³t}¨)€[dÝåçÉÿƒƒƒX¸«ZÌ@Ïêt‰âi·ÈÕÇTƒD€ª¡nüãY`ó2g[ÿhšf쫳?²Dò?þIÄ?Èëû˜…vI+JÒFm´ÑFm´ÑFm´ÑÆÛŒ¡Y€Æƒsˆ„ßýîw9ñvÝòÃ(.ÅÐf FN;æhsØœCÂËw«_´ë!™LZDöïììÀQD¬\¹2P ª="ŸÒâ' *¯Þ/ÑM‹»6INˆj3 þ¯O}«“—y2Ÿ¿Œòá+P ›f³AáåôúÛñíŸÁŸÝûEŒü_įñè_;§öàÌŽe«V­Â•W^‰^x‹‹‹¸â«_E±XŒ©’deQ³£qò?˜ @ÁbdRgõbÿþý ÈÆ²ÈH™†åÄ…ãdw74Í@¯æ%ÿ“ƒûÊc‹˜ Õ&óÄãqWˆ܈ó7,’I–s·Xü:–^3S÷!6ô;0`–^µåß1 üó³HHhI@‚¡ˆˆO$|¹W ÎBPm3ä—m$àU÷œE!rЮ[·011 qª·¨öK‹®000ÀØ ”!p„’=ì{Tâ¿®ë1Š••u›°ÏÈßùy €ùɇ°m™ù I*™Œ„¿¤pò¿2¯wá4ì˜dŸ‚ÂBèHuÔwœŒ x³MXÚmš-{6‹ä€ý ’$ñ{]’$.ÐÕÕå Ì ñ¼aÚTÈÿ“’ä!ÓÄRÂÿ޵û µ¿ºÄ21G…+ö¦ðÌ_4æ¯ó?Òv5mÚÄÐÖf" âÁn[Å1Vø¾Õ ŽÅâ%p“£‚jKeX¯¦ÍªàÏf° 4ï¥à£\œ/S‘8¹žÛ)(™ÄH Ýe6ÝþS“ù`s?çªþn8Äñ{ïýï. Î{ãñxÕ<˜Ð¸€Û~±;¨ç²Hö›ð›_DÒ¿HþwˆÿÍ“îÃI¹áÿ[Cú!Ë2~ÀÝ”…¯Ñù=+ü2—DˆˆÖŠ,(Þ±×ïÞSÓâ½WýÜ #I’•ö´]ÜÙÃçù¹Ìúœ??þü_£Õ5õÚà\?p/éuii‰g¼nÆ~˜ œ^T×[a™KxÖÎÈô&I’õúÓ×<‡g¯>ýS|õKî}È@ >'"L? ‚$IÖ÷O˜<ëØÞ!C’$Yn!pê)B<Ïæøþ 7{E[mŸü!†Ææñô^Л¶OÎçÚþ«™p¼öEÑ¥2°ö/ù k²sŸëöÏi²¦ Õ~þ^53 ¶ý›íý(ð®C•$~"Jײ¿•æŸö={ &qy²6ýšÛkÔ'¥ÿŸ È©y¨i&€â%þ¹.,_ƆÆ9w‘!¶G6/…£ƒ Ú R w ºþÖ·¾…/|á \ ð\ú|D„íûÞàK93°x©·‚¸j‹ÀÕí¶ ®M3&I7Öíó.Ò¸E¾Ù Ì€ã˨•]žêFÏ/n£›Ÿ’kYœ—û‘`ßÉòÌñgZHœþK×Êå2¦§§9ñpãÆ˜››ã$zm€(¨E@Iuèv›  Xœæÿç<¢\Tw_!€X~Ó58 @¶ÅXŸ318á7ƒß3È+\ÐHèZžèÞö~èâø#–ŸCT¨…(ýïPo/Ö ÈiQÔ4óµbܺ术!1"ÿv6\&IéÈœ«’×±Éî9ð™…eÉÿ‰TŠ«i;•UEµt]I_aã¡$I ÔÿLӌɲl­/8&§Ê(•œyòóŸ{gRºKl!ìØ³jÕ*†ÿ;PýÞ%ú¿ý…ü/‚²§OÓ˜©T0“aï3ô¶)íÞ¿ï$>õÌ]ÈÇ öýx<Îû?m§ýZ!B,Âݲóþí…÷úgóö­ú7Œ/…úÑV­¥gS®ó†-êU«€ÃÑË.§X54CƒÝHØì¹t•#ê|Ÿûà…ç*Í?Åyßܧí+ŠbQìÃu¦‰œMNÉÂÄ<MQÎñº'û¤gàØØ˜o¼vß糌CÏŨ”" &‘,sR:àO.à×ð¿vQ–ˆêúaÕªU •Á¯ñ-&’=&7ü>JO1.­u†¹þµî/QYQ«¯¯/pîñÑ~B‹EÍH&À²Ø;çTÓ¦58Äžƒ­žF@ª+@b¯á …Ÿü†ÈØg™èØ;ÊìÉö|gbb‚ß{ÃÃÃ"Z__'ÀG='8ý¾J¼@86¡nÔεM¯P¤"ùÿ³Ÿý,ðû T*!‘H ‘H`zzÚW<çBëé_‘þíïèd¿§{„øÅ9FÈL|Ÿ•âLfF$Ä·˜öØÆZ{65É:‰KŸK®0eØ¿¿« âÚW"‘ÀÄĶoßÎÉÙS ap5óËišZF\·¬'“³ølØ{@º‹ýÅï„d’ùtß:±Eγ‡>£<jóÜ÷+ÆÁh;?í•ûºôÄ7•½ßþ=5ü kþÕŒFu[°Ošûüñçöbó WaïSNöåïüè*\^ˆ·lþCíŸO©LÞRÓ&ήý2ÿß;®øÅö4âߎ:˜@¹\n™ø‘_¹ `0©»Äüæá@ð\œî©œPLs­2„ûײ٠¼sÿƒ©S€Ë“ X˜tKN³ä2ªqîæÿõæþ@sóŠõë,‡ÞQÝ5ߢÍy£¢–F }Îù¬n'ZASäÀ‰uH$mÑk¡ %ÍÏcß¾}‘ú`”H !€?öã:\(Ý 0ÍÝ ‰ŸÈúT=MÓpìØ1 BÏêˆù„ÓÅtG`Ïž=\@û8"þ’þ'!€0€ÿxasñÿü¡ k€ãGðwß[Šýó‡:¬¿ûÞ?^$ÿ‹Û¼82ËÖô ãæ¯} 8ú p×a‹ÑFm´ÑFm´ÑFm´ÑÆÿ†üD¸¥Ï®®.¤UèbFcêÚ>Þµ%…^¨1©°àª®p‚Ö-‘ÿø’ÿ;;;ÿ?öÞ?JŽê¾ü4$€an͙Āè{Cd“…î‚c¿H=CÀ±õxmùàCV-1Y'Þd3é>ã—÷6Îñ¼îL^üüâÍ µ6œÇ±Lè–ƒ[’™iaã5! îë^Lw#ÖTÉØðµT}«oU×ïªîÁýœ3gúGu}¿÷Ö­[ß{ï÷ó¹`Œ¡Ýn;Š•?“ê–ÜQ>ù¿Þf¨·Û>XѾ»·8p€ü‰«ô«€;¯Ò?½ÊåÑÁS_¼ñ=Æûóßñ6¼û]wè'ÿ_¼PæÃ“Þ½pÿý÷»~¯(J¢Ì˜Šê)  €Åz¨w|ß™Ë{­çZÈ\žAq½hq€Þ.C}EK0I¥P ˜hê„,·¸Õ\]E6F±ÞÁÌLO\ Õj‹ž¼À @"$ºç€~òÿôô4–——Òšßpÿ¾ùßÙìGL}@b•¾÷¹ðÄùWV´>arrÇ·U µ’ÿ‰D/¯ÛE—ìÀñ•~JzIåµE(R†Ÿ,ôÊÝDÇmòK«Õ*$IB*Ÿ4%à:t˜ìšÈÿ”ė錾ÀÒÒÜVuåz›a¯%DNä/\_gÖ%”¤®q¾€ù/ÆÂ¿ë‚È>%Aìkµ ­k¿£ÏœH²n¶ëIO"çÐÂí®z'+ùŸîqzmÅ$›6mÂÌÌ jµšI Ÿß Eß1±ïŒ1õXJÁN ùŸع"Úp¼þüq$°s=‰c©.vtÂ“Žˆ|Yo3ÝÞS(çm¸ÛëOqGjχù6} äCžˆz­åúü ¢à[öI Æ%”@ Pšð”>шÊîk.Ÿ¸´ æË ýžÓÛvªw½‹í3Jòáÿ¢Ø§äó|¹aJ>ß³W«·äs Þò÷C#”[…œ¤¯ bß*àÇ>3øEkÕLì÷BœÄ 8ùÄF2(%@ðmž'¨Ñð­¿ ÕÿèÏ8Æ?ý}oï9O» Ò˜¬µªcñ½¾Å½ž@o3?œÊ/õVp+Üêàú:¿ûJüÏÚ!¢QQ I’AzzÄWBk¡ìûÝý¡Tg¾ËmCïkDþ§Ý™ÿîÓÚn2g•‡ñ¬&©’$ÏAÚmÌ®Ìä_˜v¨(Jâ: ›'—õ󲌺žDsÖ`”,á™fÓØ¹½ÌH ÃÞ¹‰ÙíØ“ý$hÇ@'Ï() ŽÀ¿ý}ÉÞîrd++$ S’„R½cXíÜî‡_þï~†êÛ¾‹ó÷h÷Xðdt¯ö¯ð/ t~¿¶i,˜Ír]6ú?j{qÛö‚õz8£ð›L&Õ«³WâA<ëë=b™qN=»KO´˜à©ÿkïÞ׺•ÛMÆ©ýõ!ÌØ“ÈÿV Íƒ’Á‹xŠ€ ó®ëÖç¬ öbŸäo‚$I鿥_Öv1?«“r¬ó0< @#ÿhb•3´]œ¿¼{o Û^°’ÿ[«ÀÞ=Úëb®‹ŠE`áÅßcpBèv»‰$¾¤¾¨¿çÉó$fPY,Ï;òS\à}9ÿo3„è:Ú%¢ŠBpkäÓî¤AIàÝn7qãÊŠI°Œ1¦=¶µÿ³õ5`l«±»-Åœ—ÖÛ OÌÌàÆ•tê]ìÙÛ#A+çÝ|ù ç cjc¦eÚå4ÃíìÅƒŽ±Š=Ñ  ;0@Y¿Ú\ŒÖÙ=z·Ür‹i Žúá'ôµMèHé•ß§]EQ»víR<Œ/ü‡wè_ääcýT>ið G}&îÉÖ±"çPÌu‘+öæA¯¯¿‚r¸›cÿÑ5.5€²TîÛY—ÀǶtL,÷€]×!ëŸëÝ?èú7f´ë•«e`Hz̃kóžæc¤S冶Þgº]| É­z ÀfÓï¯Ê>ï5/‹UЮ†È¯ä,´ù^ùg3ü:P 6Ø»_¸øMíóO~ò,..¢1ÓB®–éóÚ½‰oÞÈd³(ë}oq¡úþûï7 aH§~!Ë2ÚnCo>hufÑEÕÐí¢Qp9ˆø Orª"‘ÿAÁ“ÑМɮ"_Nڈ¾Àv¼àED¥ò …>"ܵ‡c×®]‘ób’IM}ïGß&òvR[+%‘x»ß^#Ȳì)¾ø;ÜbÿÞµÖìðäq"£këB]S¿;È8Ô€ƒ’Ž$z~”Óš#AQ”Äââ¢Jbš¯zâÇ{ á»N½kÑŠ¹.*zû×î­[ÍV(BšU„zl§vЃý Д™ÎÊ!üú‰Í.--™rhc~}dii yެÆ0XÍf3äœÍfÕâÏjx Þâ™{Bq½ŸšïmÆÐ©iÏÙÖ£?íÛd‚¾LÍwmEüôA½5Ð$JS½Iø0\·àávOð½;Oþz»ÛÁžÚ´ý…³o|FnLK$nTCx Wdh­-<ÚmØ8¾¨ ÃÑÕ¨“ɤú}ç¡]–¶O»qÛ}þ™nM!P"ëm†F%½rÅz_â—‘€[Ѷ%Ëë“€íd¿±žD‘»•H àÉs˜ŸŸ×ž¿ºQí;%Ÿ7›öÉçƒ(¿;zBŸüäâãÿ¯¼â¶ßlBÍf¯D³ù4šÍ§=âî§/y^'ÿ†xïe¿ùþzpö­Éo´ðÌ'ã·Z­Ø€¬¶#ô?}èv»‰2 âm½g)%˜?û’fïÍ1,¬ž2ýîÙ—¼¹ÞK‚Óï=#æ=ïÄïƒÄD‚  ôOO¼ è»Ùpž}IÁÛ1ÙGÀiìàΑóUϾ¤à¿À®˜Q7øðævïùóÙ·eP^_ô°³O D8"¾Rß—}¯8x–›Hâ+úî›R®­öc@EQ¬&©Ö¦ÁØMPö?¬‰Çq׸ÞÖÛÚEÌHºzϯvè"aSÜFäkEQL&Õ+²YÔ›Mäê²Qïå¼bøQo34R®Èf••Þ³Œ;§ù;.ûõ$ê’f…³Ï'×ùµ/˲–h“kC–eH’„G¦¦ðL³‰œWÒ>ÿ•ÿÙ,ö4›È7´˜ì["7[h­·}B#ðdýkï»}"´«œ_ûÖÏè5‘ŸÍö½î·Ï‹kÔk7á…Ù¸¯H\#½ß>½?‘ÿ ®Î^ 4‚õy~mÿ§Ö¨É2rE³mM˜$^Û^°»v°£ I’ŒÄút:mœ‹Æ¼ƒrí­mŸ÷Ý ~D`EI¸µ/|—u±lÜ Ù¡P(Ø’0íˆqÄ~vÄž^²sï3ž« ¢öêšã²,S=yÞï$ÀH<äQ1==mJº\ZZ‚”›µ%ÿ¬è„ü8`Dþ`Jo6«† €6諒.Õ$^üÀüO â=¼ètú¯Mk¾ë7.~äK&?^¼ñ=8ÿoÃ…‹e›Dô$êm³/†´=úiDîçÛ%k}ao î·~¬â5ün¯C#@¯¯™ß“ Àú”±;ùnÔe­|TV"¿?25…T~EM+ÆïäWà k»›:ƒ ;„i—Ôok5d2Ú\ûç>§a{‚F~bf×Ôj½òÄ[ßúVã5µ5êר]ʲƒõDÙ”À‚Nèv»‰üJ®þq¦…|9‡ÆLà a·p 3È߀F€7æ ”ÕòÀâþž°BÃÚT%îsI«{kûçËO$u wÝü ìê(•OâÉÒSøŠƒŽÌ}ÕSé=€8@qí(\J”úŽq" 5fZÈÍf"­ñ÷`Ž¡¨~iÜC÷#ùT/uQ¬Õ¸±ApXçàI @__<ˆy/Þ>e&Ð#ÿÓÞOhF°ƒøGmã­§NÐÖ„ëíàñ‘Ñ€þÍ­í{öß…­‹ DT¾ü’$áGúçÖvìnD\"`ò;pÏ,*‘Q]‹ð²,Ëð{Äw˜®µñÊ úø'žø3€àC€äÌmHn .€Äƒõxò?ODËf ¨ga?ñð8‰P‡#`‡ vkœD¿ ­Yú¢¸Éÿ¼Æ8°Z­ö‰®®®ÒÜÄа(ׄDüæžÐóffQAó¸FîoT £­ió}õI&|] 6î~ +Àeõ!Êú§ÿè÷°Ý:,ЛóàçAA"ðÝï~7° cLåÇ••F²O€¾§>`ïž¾²‡®zP[ ëMDÜì$ €A‘qy䮸€Fþ§÷$Ð9r¯ö}é”u­°VØÅ>G} ýúãñÛýˆ!&þá×ô­qk~B1„­Â¿Æ½ã¦OAâ.Š}fggc?"?ä:ÃLJ2mpd—xÅâ~ê&HìïÇfPØÅþÓ™Íø×—[Ú$÷¦3ÑEìà'ö¢ÇÿÔß’hÀ<`üXã] ž˜× ns0üÆC÷ß?Ž?®—7ò¿¢(‰Z§£ò6© >öØcHÝ|sߨzcP(}¹ƒòo§ðMãˆüO¯5€þ9/â#zŸc7ÏÛ-õò™¾©57–6Žò½Äÿ™Ô5&€óWÍ ¦×íü¨Iàÿ¬Áúú:`±ð~¼õÝðÙX}87àk‹KƘJ»|Ón¼­V µZÍ ãMLL`ffv ®AAÉn-m'67ìív1,Q€•7­»‰ÒNÄоQ«EQL»g³ÙH~5Ö{eñô1ƒè¯(J¢TgÆâÆòò2^<} /ž>†‹Çwôý6.d³YµðÄðV¤/D.·Œ1õÂ[o7v"òÿá‡îÆŸ?´ß ÿó»]xëí±´EÙlV­_ÿ=| °Ùø³bo·k”_OžOøgŒ©3¯ôÉœÈÿv(ç-Y-×EY-#s¹®œî""`gŸް#ÿ{‘o§¦¦ÐXObË5¯úöݯo™Lããã&ò¿¢(8yò¤©"d2™ØÛœ¿çvýU?­÷ìþ5œ¿GK h6ÿ›é^²øÔív+ IПü h¡ü'?9.¯$#‘ÿ»Ýnâøqme—D¦æ»¦ºe³³³Fb8Ÿ”©%–Ew«Â<  ¤f´öI>ÌÎ΢Z­j$©.¦æ»Æ‰aÐívÛ—`{ã”å$Jœúë‰üùwc¦? ·(C(I]”å$è|a”§)q0•J!•JiÄ$Y¶µoM~$≱OÏ`@›/å$䯴ºÝŘéèï+òŠç³Û ²,›îgþ™k={Ûí¶q\Ðx„1¦ãvzo¬'Mû€F¨ì¯?}G¨äS¦çð±”âÛŸn·›õÝ^5r¹y1A’$Èú&’$ªí™¬Ë6±`Œ©Ÿévñ…ŒF²­T.0þ-ùùïv1†/d€Ït»‘û_žXh$÷z[?X…I ÀzL¨·ê¥•¼a£Øa(v’É^²ÜöéÚõžh'ˆ£GâèÑ£ øoÐå·Ç›8òÿÀ$Àƒ>û^ˆÝþô%Ï£Ù|Ú°¯½6ƒ>Û¾©Ø iä~3z„ÿ$–r¦/yÀ›2!¢ÿgšýjëM(d~00ûýÉoŠñìçÁ—N§±sçÎÈã2kÿÓ¨(Æ[ð0 IDAT`îøïâè>ü>üJcc$©Gô†¹ïåÉçϾ¤àÙ—œ‰^eÍ;,ÛEÜ|Èûðíëêd(fú}˜جuÀÃóù36fü>,ììg³ñ†ÞÇi_ßý·}â0Z«=âªõÜnå´kð©µÞs×k ȯ‰Šqº§ÜOטokƒh‡€Fü¶î¼n-ç_dö@’$TIÓ{§òÑ9eß­¬aìÀ¾}½ë?Å•M’$<133Pûnåzížâª{>9’˜†Qÿüûb.þ99"?ÛÙs³O¤jŒÝ„7֤Љ‰’$aÿžŒÉ>½Œ1•ï»W¸×{÷js<ƒ²íëõpòÁ*FT +U^ÇöÆ%xà ò?auuÕ4æ]XXÈ|·k¶í+Š’xcM²m§ôˆ7tOäÆzIò/hB¹.– ò?%Í[“¦½à&VA„ 7uôèQ#Y–È?qí@l%ÿg³ÎÄÊÖjO œ×„lºÝn‚þ¼lÑq?ò%£­ç·¾¶Š28!HE¾Úù@È—“&ÔÅ þßö±q1×5ÊïÇfÔö÷ÄÌ ™šÂ#:qŠ ‚¶?‚•€—ÉdÏ÷Æú|b:‰¡¤ÓéÀñ¾&Ð{ƒý—VAwÀ3\¦ø#SSh¤Rúú”vNå¼;ÏÅ©š'?µ¶–ç‰ÿ™\.ÔxÇ Zg£oeYƇ>ô!c‡±£GâàÁƒ€kjæ9†^ùƒÅŠ¢$¶mÛ†Û>qWÞv·}â0¶ÿɽ˜ŸŸ7" }gF¾þðmÌ}óúµ à=lj2¹œ#aÍÍn~%‡üJeµŒxÀµýø8 tûÏ:$l;œŠ¯k»¬ŒULï•)ÿs¿äωüx²ô¾×¼ ß‚&4¾V=e{ïÅÛ'ÐAEÁµ0ÏmÒûœkõ¿¸¶"Ȥ{ê[ø>Æ­3ùÇ*´û7 ]Y–±°°`´?«ý8ˆXÝn7A±\†[T¤v7;;k*ÿÒÒæçç±åÞ{qíáÃØ¶m[è6Hþù¿·Ëvï5‘sks ÙI@š²ý5Rå%»¼ ¸üçF7dƒ¼n…5&ì›Bc}ÍüÇ}®œw‡&ÓfÆ ­ÉZLÚjÅZ͈?±¾æ»?V%±¸¸húŒÄVî"Üy*ìn´~Ú=OPå¨÷î)„Ž¿­>PœÚ5þ'4*yÛ5ЍàÉÿdÇî˜mÛ¶ë…ü3# ü`ù96ìÆù_G£¢ SÓDLâ–ïíà§âÁ¯ò„>ë¨u}¼Q ?÷mÅää$&'' ¬ë°ÔÿÓúùA1ñþ§Ž†`”M–eTZÎÕƒ! \ꢮ“"ã*;{Ì,*ÈÜðƒˆk·gO0ÆÔÖÁÝHÝúAtŽÜkþí»âv”J?1|à0Þò俱Ïk’éu£’×D~í |oJÿP{¦¸U’$”óJŸ¸ªõu£’G©ÎIkóqÆŸ€wÜů ócÁ(íÞÎZ§ƒB¡`‡ñÆâ~bÿ¸mZíÓýwºrWeŸ7òˬyfWeŸÇUÙç5€ˆûñÆÿJÞ|óÍxàP~ßåXYHöž~bÞ°p›ƒ¡öOX^^F½Ô5}‡/üš°µ .,, ¼ &“IõWÿìM ôå~õÏŽ@–e0¶Ëôh¢(<Þõ× ™ÜÊ6ÅÿkœÇЬï‡576 ù?™Lª;$sþãÉ9ÿñ¸e@²3=ÿÑ žüŸI]ÙŸÇ /\‚Í7ÝŽõõu£ÍUïÇm·Ýóf0ç B­ÊÖj5c`ÙjµºóöÞn×v ÝŽoÍÑÙlV=}ú´Aþ?}ú4€!ñÌ™3Æg Gâˆ"`MØ»x|–——qŠðäÿw¿ë¼û]w ‹ŸÇá‡îÆÙo|g¿ñ¼÷ã…÷~ü¯ðîwÝ÷~ü¯â0Û"ÿÚ„+ í¾Aø@a3æöiÕ½³ÙŒU!syêm Lº_˜\í@äÿÊX%trt6Æ·ý`_«ÕŒ‰~I’à§ÈOK€âÁ“ÿc`ŒaÓ¦MP§OŸÆéÓ§Mâ$û”Pâ”|>¨ò;C#š÷Èÿ„žÀÇ?þ_Á¿€çö¼ñÔµsôHø=ûDøo6Ÿÿî*ø%Ékâ=ÚþµÕnO$ žòi„þù¿Úz“éµÕ~O$`0"@àh ´M Óüwq'ßÑN·<ÜúmWìø0>û¶ Þþ‹æ¾—>çQ™˜Ðv_™”9€qÜ/¾ÿ{‚Û´êÛÿÖű”¾3°>-)áão+¬uÐívoÿÅøž?N~ÒîS”7(ûn»?¸•;*é‚Hÿü¸^’$”ê ˘æÍ1“/Š¢$Þ|‘¹Í‡m‡v‚Ýn7qãÊ ò²Œ:w>>¾«Kò²ŒWVúâ¾ BxaíOIrNdûþù»¢—köÝÊŸëtLbÝn7!Iæçç±ýOî5%-ñäƒaÔ?}NI²<‚&ÿÚÎë×¾õ~âÅ5ÂìDIdôs?±µÿ`î'ØÞ¸©òz¬;ÞΤRàmË• H’)׆ܘ€Tl̶¨žùúÜÅ(‚‚ÆáL;ýZAŸ BÁïµ·}7úÜ®¾ýúÕjÕ ÷oÛ¶Í6®#Ò=½ñ0“Í7m¿×øœÎ~ã;xy®düɲlzþ•óþb úîw¿kú|qqÑ(#%ýóäŸJ£Gþ!â@ÜàÉÿ^„_7¡/Ð}wñ#_Â…‹e\¸¨@­ÂSüuñ[¿~Aó˜$FÀ ü0æ?­$ ‹*±Çÿ~ÚO‚§áô?@‹{ì1ÛÍÝv9§~pii)~1”±­¸ëw?@#ôó¹NÏ4›ÆßVÖõµÀíƒv5µÂTN$¨ÆL+ÖòçŠ T u]—æbÆÆÆ°´´„……\S«ášZ;ü@ýýÍÎÎóP hsv󯀖¬\ÌuQÌEß4æÀ,döüJ®þq%Ñß Ô÷ùߊ‘µ ¸KïV”)ÅôW\/¢ÕhÔFg¿¼¼*û¼‰ØOØj#<ÎÿÐÄŠ£–Ÿ®•¥¬–Aâ LãoY–ûÊeþŸîØ©ŒU«e«e°°°€¥¥%Œ™ˆÿ¥DI;Îe—ê° 9®mÛ¶Ù # bÞ‹@Ï/ Gò¿MÿßFOÐò%Â\÷ â7Aê€È?QÖ€ D¶áí˲Œz©;Ðk°°°àHDôçƒn¿P(`vv6òî·<ˆôT|ç…¶$L"DÅƘJ»‰z‰E^qõ)ù°|¹~Gl>¾#Aœ¨9Aü „@¢{þˆÚ;7*ycF$LÀLL§u rC6ˆxaŒ€=8jmÖþvå*@“O… ±Ã¡C‡×"ù *ù”©.*ùæççÛµ–¢(‰Ú\ÿº q:5f2›–}0Êy­/ŠÚ÷à²>óËùè@„ååå@>4* æççqï½àðá_%Ce/çµ\Úˆƒòzøœ »ú«ì’$™ÈÿÙIô=27¼@ôÜ+ìÈÿ¹+n7‰ÐëÔ­ ‰ØùàFþû|ùŸ¯±=‰Xá'þqÊgz$ÿ\±î8çC"ƒ‚]ÜÅ“¡i$.ñ#+$IÂÒÒ’gN¾ÄŽÂ&â€ûTƒà¿{o»÷jÕºÜ:e#>˜ûIà(ŽØˆÿw»ÝD*Ÿ46ñ!€……H’dÊs${qżVØÍÁp-»,G¹œ0ì6(Ë2n½áyô ãï¡?¾Ñ1ÿï¡?¾Ñtì­7\iüÏÿn‡ÔÅ©kä½:ù@± OBXas/'3io­‡\r?u˜éØÉL´üG+EI|¦®=è‰üÏãñCŸl¾évüáßîÃK?=Ý÷ûøsÁÎü\Ü'Ìd28vìXܧ5ÒÝn7Ñ@owâAƒÈ»©T ãããÑŸ°ºU›Œ!1€ññqÓNÄ$F™1¦ÞöA-ùæÅÓþëT'ªƒðW¯Ù îCõšÝH?^@æ"‡ES t¹ Vò?hâgx÷»îÞÕ;öðCw¯ÏÇÛpößÁ…·ÞväžXëá¾ê)Ìeùÿ.É8QËôÈÿÙ,Žc8óÊŒñ¿v÷·­çZ(ïRPª³@õAä? Ü+úŽWv8ùÄyXX\Àüü| ûVò?‘zÏœ9ÓGþU8ñ ºWã¸´ëø²8ÏVÁGþoÐÿzÇ5u€„n ä{©ÎÔ™E/¨×zÉ¥49N 2q,V¾þ2Zþtu•?6*¨¯§Å‚¬žGÍ‹8ù‘šQ²“ŠáwTÐÂËõõW\ëTPOä/ˆl“%5¶Z-Oût¿Ä…¬Nº ¤S7Ûõ6S­Ia@äÅfGd7¡:¾ÝncbbÂx&û±wôèQ|ó¿Y’2YíŸ+2TR»D†¿,€æßÇÑ£à–[nñÝ'‘à¬f¬‹¨šZ±¾û‡N‰”„I÷`öY4›o4ŠéœŠ¢ \Nª¹œv¯e³Ï¢Ñ° ˆÜe²¹Ý©ëµbùê(¦ûìWò)upžhT(L&‘+ÎIBqÙôv§Ÿ·XïÉ'ŸûÜç°´´¤%†ÌÏõÎ@ìk°#—›?ûä'ÿÐ üó¸bÏŸá™ýìÿâ@íg³W„wVߤ øGÔoþlú’ç±ü7¢=}÷ƒHí¾Gê7VÈüÕÖàíóè%¿™ž›+ùÊ1$ß™ûŸ^¢S¥‘ìëòem‡\:VŠÐÿt»ÝÄÛIA}¥±1|vl åõ~r¥¢(‰b»­‚øðwZ(êí ¶@ä”,ÏÆ†c[{Ÿ]³à¢Þ÷m‰a¾ž;Aê€?¾46†€òú:Ê¿þù3%Ix;½Ñícl ¹bÛöù—}EQÛ¶mS< ¸ò6àG?úfggmÛoí6¦$ o–eH’ªÜvÄkhå1ÚXy}ŠÍ¹EI¼™1•Ä´C·¶!˲AlãIî:9\}dj  7T¿çb?™LªµNÇ8.Ìùi¼177‡TJKÜm6µ¶F»± Ò¾×÷tÞZ§cj_dßÚ;“¢Ø÷{ýÎãÇ>cLU±  7vóª'ûüÆnŠ4 Ë2äÊ€1Ñ^#ˆCí”®D' HÅøQEIÔ:€­íT~]•$ WgÇb·íºv>ÍÏÏ«KK÷âÒK/ õ¡a“Acj¡P0ˆ($¸Eà“á2™ xàÜ|óÍjÜ"A®}”6fm§ôß­¾ãöÐy/¼õvãýÅ `äSÜwöß1³/¼õöX‰<ˆ|Mó¹±.0Öû¾~ä\³Ï/ÎAk­U:;;ë«xë[ߊУiï½8_ ‘ÆÆ4ã4ãÉ?RnÓÓÓQŠ @kÿ½¸Vkûͦý®’Ú÷U=q·Šl¶(æ³Cn¬k즑å>rOi¨pÈLç ‘aýÏÇé$µ’×@$B@èù!ãÂ[oÇùú;šû/Õï‰UÏ«ýåÚðôœ'ffpM­ºý¹Žú8§y="èÑñ< Ú¯-Oèäë:A¸Ûˆì~ghî{¹¢¿öH¤&"=9‘Ÿˆe=¾1ÓB®–‰\þT>‰'f¦ôb šküЇ>¤bnnŠ¢ W­hs/ä3%çÓýå4ÿEó¯Àj¼»!&âYY-;Ï?®äÔR¢ÔÛ1~¥l|Æn\í?Œí>èäÇö?¥ ¸R4v©·ûý] YQ|·"vÐZãZõ”íq÷UOá…ÍÆñt܉Âf\¡ïwƒí<ŠªcùC€ÆP\/¢P(€é‚Dªäý û ´ÊçÄCF›ŸŸ7æ¿ø¹-ëx+®y/Œ1õ3Ý.¾…ùÿZ˜Iÿ°|^R”Y|×½Oü¦>kÄxAêàäçaé@øg’Fèèý¹¡ Õê‘@mþèÑ£X__GNߥýСC¡çì°²D%/Áh+2¹om³÷]tð¸Nâ+t|¬1Ìñ'‘ÿéÜÚóNA6­Å ™ô*êþ2ö(ðê£Æú Z›Ðú ¹bÇ X_C¹à/W%1??¯.Ý«¡iGy@#z¶š-ëSÛo5[¨—rÈ—{1RÔqÅß^í~×®]Èë}Äw¯5c/И7“͆¾¦Ù+7FÖÈÂÜ:a&›\¯Çÿó~x­EÚ­C†õ#¬Ö÷[/Çûòë.€}^I©ÎÔ2Óoìb¤(ÈIŒ@#·Û­æŠZLPÎ+±ùpüxíN>”êZÛ£Øß·FEAN¿?£å¨k÷ž±PõÏSK_|ÎW^‰Ì,*¨ÍÅ{ù?ȱ­ƒ»‘Ùu ìbŸ«VR[²9¯ ²bŸ&þ©4’(绽s7’d[²ïûxá'îôø£!ßÅ=îð‡¾ÄŽÂ&1¦>Yz ßk^†i}èk…3é»ù b÷‰ýxâŠw3ÙU“ ]Iòe õR7Ö˜× šó-å$#k˜×Ÿ0Ê6xë Ù¼x“ä™ÿ÷ÐߨVŽ÷Zh}vùÈA Næâ››ÌøÏ<Ô‰'ÿÑŒ1õ£ù¬AþÿÉl|÷ —ž}öYüûÏ~Š¢$þ¢þðÀ68÷H Ýn÷‘EI´Z-c°é¶;ƒ$“¹B?M;`=Ò)Cúsw§ÓÁ¦M›‰…ô9‰¤×´ÉƒöíXÈà^xú_µÄ{>&d³YµðÄT¯Ù»Ò÷¡õ¹~‰Û‰è¥G‘¹è´>÷öü^ûÿ®ôã¬^gŸ¨èÉdR}ñÆ÷Ðúãnæ¾÷»î0Ï¿?üÐÝFRêÅï¨óE?!ÍfÕúõßÓÈÿûúloò•OÀ™Û÷<÷ªØÙlâP€]`z‰^ûÀXôÎè§ ui~⟈ÿyEZ€qÉõ5€Ìå´žkõ^܃ƧöÛ& ÑØ„-[¶è©ÏoÛ¶M³Y«£”ðšŸPÐètŒDÇÆzÿ"Ä–k^Åæ>Šƒµ/a×®]¾&§“ɤšJijtOñ¤`ëÎßV1€ññqÀôô4–——CMˆõÈÿÎî¿°¥ 4C$`ìqG0ùÄ©p[Éò¤=ù?…ú}œ$í¿ß‰ÿU?ÉN­‹,·éZûïw×öêÀ.ÕÊ?ÂÖE\DþAŠÁ Œ1Ôle™LÆ úÓqŠ¢â;ôÝÌÌ jµšgùOœ8ìþ[àÀï£ØqNRwûÎë7ÇR Îîþ[ÍV@<xé¸zV{fD½î|f6û¬æBãÛcé{þ·Ql2Y=á¾èœH£(J¢Xï¨|R\°ÚŸŸŸW …Òé´ñ,¤„T:6.äËI4*9“}·äó¢¾3{#²Áw“·#ÿÓ¾ù?nØ ØÃê<„|;a€AÚï%¿u »ÅÐ\±·ø™É®’~X˜ûýC{¬ávɇϾ¤ÿ¦'à8ì2O"Ͼä,h±™¨ ¿[GÖ2°¢¤(ØÑapòa@« 4öù' ©‡¿£Å[†¶K}˜kÀ“^Àj?_– (öm+.û»ví2Ý?N׎·ûaoÖ‰?qPcê·ÿ­ø8Á«,nøÏ›69î@±«Ý6véÜìg2¤ÓiT«Á標™™Á–-[pàÀÚ5Ô ' åÚê ìA¡PÀêê*:63Þþ âý|ý½ìÇQ'úävÝ~ÿ¤d®Ætûñ²èhg›ÄeÛ v>)Š’°ï¢Ö=‘ümŽùСC}óKKKŽ$Á80¬kïVWÃðžûëBª„—ôªÙ‘{Tžtþ;ÞÙæ8/0ÆÔééiÐÌúûßÿþ¾cèÚnÛ¶Mw™Ÿaù õ#÷àâ…Šù7Š6”IþÕñØcÿŠmÛ¶¹Æ@†ÐáÆ[òÕ×…·ÞŽ\ñƒüÓ€1¦jd†~â¿u'¸f³j×÷Y=8€bÒlZ#÷Ó.«€™œLŸ‘@TÁ;üùõ{ëa°ÆW|;4)Žø·Wû˵;&|˜öÇïÀKÏ:¾ïã?·‹5‚öƒ½ñdžŸVd³Úw4þ`¯ÞÝÚÜã£[qWá¾Ý*@Db"ž ÈOôyq]ä@Íü['±€  9؃ŽÇð¢7°{÷nx©~ÿ‡¾Œ9`å˜ãÎv0’öcœû5Hg+e_ÇÕ‘C®– -ú3’ö¯‡~Æßl%ø<ð]ÉþÝZü!a^h|­z [uÁqú¼¬¯y•믿?¡'êSÚý”_É9ŽmyQÔ8ÀS%IÂää¤!öÍͼüÍբǂ²,£QQÐjJh5Ó}s_ñTk0™ì*ä˜vÞåA+Pm·Ù|ÏG{×êÿãp¿©·¬uhk¾@oÐ-׼лwïÂc'žðŒ¿xŒúðã ºÿ©ýÙ‘@Ãìøíf{e÷+¾Â§ð}üiÿäãÓü„‚z;Þø“1-†± 9£ß‘çÅúÝhTòhd3Hå0 @âÇÐDú'¸Ïi×ÓL6ãº^~D¨‰ü\ɧ @m†­Í€Öÿxx­EÆéÇFÀâc§2—êLu¾ŠT>‰F¥kòÁm ´T­õèsN4®oTþ¬Ï“XQ‹Kã¸ÿ¨^‡YÿÉdRšïB¾ùFMË”†öþ§¦ïâ òã™{Lÿy4ž¹¹#0}§€§ðd›s3Ùl²>ß5þÑžýy4›U4›U]üÁ2ïÁ˜jµWŸÏS륮cìAÇ :þ¼ã Aø2 ›VÙ¹u »÷šO;ÙŒåÖ),·NaÚ¸ðªìó€¸,6?í?®øßZç²ÜÁÍ7ßlð9ªùùyÔK¯­6·}<>õïÆTø£¯­'>õ»ÛUœ~¿ôùû®ãÿÛ~o<ñ\š~7žyöU/þýg¿j#®¿€€€€€€€€€€€€OJÆ …@'b9%hìÞ½;VðQ'ÿoÚ´ ããã8sæŒç®ÂgΜ1ˆÿ ü¶œnŸv¾Z]Õ2›¼v´]Ï·lÙkv6›UÓУ(‘ÿ Ö]¢à¶ÅÏàäÉ“îXÐjµŒ‰çÓ§O¤~Ý~ßñ$`˜™™1LüÂLþÏâü=[qvÎäBS'þk8ç_÷"B#µ“&ª¹,N»6„A:FíøOÜÏ[û£_7ý6N?Vÿ¾÷^’:Žä%I’Ðþû^¢JT?Òé4v›rNükwçZãuÒé´#Ù%È9ÂÚ¯u‚'ô…ùŠ¢$jµšÑ¯Q»æûn²–mffÆ$à×%ð½ÅƘZ¬íàŽô~»ýfG‡©Ð‡‚<‡î{rŽkîI5d[‹â#¢=ùäG<}¨Õ®5lËr<¶‹µ`IDAs>EQÕjµà¤]ûxí§R)Ç2¹%Ÿó;Á„ÃaHøæßÞ¤þœßÌÿÙÝ9¬ç9—ì›aˆØì>aúî»`‡Ÿ>ïûâêþ¯?àìzìêøÞ›¸~?Ä3×içFh öÚîòN4 «4^() 2+ÂÔA:"¡ùg°Õ¾[ò\öÙZ3ë¯Ü…À‡ÙÝ@s võ‘N§NÛ>‰ÌMLL`ee€9¹XQ”D*¿®ÒóýµV~aÿܱ?ê²ÛÁÉ'I’°sçN¤ÓiÛjüÂ.Ö¦ÏÞ ìˆ×€ýnGvB£€Œ_ù| ÜjµÐÒwϤlÿ“{}χðB@^»óõÊ—qñB ²C…%€[‘ŸPÐZÕbG"ü·V«¦Ï€àdU‚Ê‘®¬É§ŠÒÛu<;À¶ÿ+Ÿ¯á_~w/Ï•|·Ã_ù|-”ôgío7ï¶ýñó~tO“¯h޼Õj™| ÒþüŽ?Ü„ ¬eïõÓw«Ô~ýøÄ“ˆT^\/šˆþ&ß9‚¢Aü­E¤Óiìò1Kd!"(OMM!•J¡Óqž¯ök5Àt‡õbÿ¸æáïÛt—ïyèb{a; âlÿ’$ùš;ñjÿdÇi-–1¦Rùû¾[a(q>yùrGàÿ€NúßÅ@Dn}K’$Pv«ÕÂõõW´ïë¯ÄòüÅõzåbŒc3Yvî$IŠÕ~O„ù2ÙU[^ð©ÝãqŠn0ÆÔ’Þwð+¼$uݲÎYR\‹`*~ô¯ïëXê wÌÏkÿ¶@Áê“6Â5 ò¤òIXŸn$P·D€bÙ£ˆ¯ B€âOZî]ü™I+¦85(Ü*$&'§ûHˆøï€z)‡b­Z 0çW “xn…F~(B3ù¿^2ÛõäAk£ ^ê:~ç!À¥Æ%Ä»|&øõ;"öÓÆ#ÙI 6×{þÓ¦3‹JŸ@@´îÐ#õ箸]#û_q;2»XŽ>`üÆN$À qÄ>€6F ¾7Žø‡ß$›-¸öûšøƒÉväØÇOìAö{Ò—Q—Ÿ[nõÆ‚$@ŸÓæ"ÅŽ6.<Ë ¿vâhÿqÇÿ|+Šbô­¼À 1êë¿|øûnÊo\Ï÷䦈¿ Ÿ‡ݶüÑ×ÖkÕ#ý?h:梟žÅ%/¼€SÿxAúe¼ žÅ›_>‰W_ý|º-Dœá*À/ž˜O ò#Ú@â#ÖßF…Õ/"Vœ~­ƒ¸}•}?mÍí¨b@äƒ}§ÌZ­?CØ};Uå¸ë Ž{Ñ«ýÓ±qAüø§í°õWûó²ïtÎaÙçAÏÛ¨€9ùv ëÇߤړÈýì2ÿ&õ¹=ïÃåû¿èðýàíßUøɧý$–ò&uú’ç±üÞ®ßÉ·0Äû$ª­QÚ·‡UÔ$ì1a1ìþ'ˆ];ûA‰v±?b:8tèãŽ'(ó>(Š’(3¦‰!h0êçϨìºÜqø•ÄÍ)ù†žEÖq»ÝÜCÔ9˜aØït:è8Kd2©¾VË¿‘íóvÂØêÃ(Ë¿êÞͯa]I’°°°€ûï¿ËË˶Ï/}Î9Ö$¨Pÿ£ðÿ%¤Ïa———×(¢u·ˆÂåc R©¨û‰H&“j˜Ý‡_ž+¹}í=Ÿë ¡P0­ÅP’­;Öë(çµ]ÀI œWP °˜ÝÎãõ¶sÌ¡ùÐ#`ÅžN§]ÔÁ+š!ñ‡0±ÏFjv"RnÄ{ÞfµZ Üúx­fj¾þƒúc›€>Ò¿Ý\S±i‡ s°“““زe :ÕtŸ}¯ëª(J¢Õj©ü@Ü> k¥ý“èPëïÖþIÌðnüü_ØöoŒ×u”‰ôïpI’Œq¿>çئh.Êõgw¡§±Õ¿—¸^Üãðt:¢Ñÿ8?Oxñɸį l!ø×mŽáÅ/øãƒÖ»_ñGñ Kج«õmsÔ×€oKNç•e™LÆXC‹:вûl³ „rÛ>‡Öƒ‹žÇµ8î?Û>´Ã pZ`*¤‹É§lî @ïÞ½­–v·jDþ`HÉvx Ü÷$Ã[”cAN"ÔÇ$~D"ª·÷¨üð+€E"ƒÀ ²¦3¨õ?ç¥þ×*À 2ßo¹áÃ(ëŸ'ù=¢‡kWD Þ²e ªsÕ¾ï£À‰äè˽#2»ª¶Çx!JìC>Ð=Wü£=û} oYlÇ¿±‡f0±×(}uù¯7Æ}:É¿¯pGèÂ’\ü}ý ¾ @0ñ·xÚ<ñ¯ëÕ£5Î äËID!y»aÔ×T>0ÆÔýû÷ãÑG5ñª§Ÿ~Ú÷o/»ì2\yå•´¶³gÏžPãÿd2©V*•X|(‹ž¿¡üV(Š’ø«/ŸPk¿λàçqàØ¿øWüîÛ7ãÆ_Ëâc >ÝŽ6×" ðÚ…«_‹zôùòò²ê• äJfÌu{J»dÒôtl#™´=†>ó3ø·þžv_ݪ« ¯¥51€5ŸÙD/×&c¾}¼ê¹À kdí­O°înCß;‰€8õ…n‰æN¶¬kð×Z}åûAþ·^~Øù¶¾´.6’ýaÛ¶Ú·óazzÇ÷err@oQ‹ìS{±ÿuý;ùbç‡S<Õnâ¶gý¢ý+ö'''d5‘Ú@NDr7‚y¤ŽüŸ}ÿäÿÞy5ò=þ÷þ„üÛÛhöÍ$ »wk»qÜÿýŽÇ}nÔ‡ÝÿXm:Ù Ó÷:×nÂhäƒ[½$I²ó’$ù^TFu ¼ìºÜÃðÅ«ºù°sç]üm{23 û~ÛÃkµüð¤Ý9ùÖ>й‡Yÿ£¾öNàÇèQ®‡¿xñHÞ˲ I’Œï …:¸¯³b#´}ëo£úJôçó=¶?sf­Y– â5ý6è\[ÈM¼“êCCˆL&“ª•ü399éI€6ÕC¡€jµ))$ÄÌ×ÓýSª÷æRH­^°ÛyÜi÷)Ƙ:ˆÇíDw¼®ýøø¸áÅ>~ú¿Ðþ¬c^üòøñã¾æ_ßÿþ÷;Îy:ü²»¯—––Lc¿óÀ¼¸u^×Ïü“íãÇ{[K:Ù·Ö¹×Z——QæÁ'''ûæ½|‰÷Óó Î1Ø(Æ_vc^¿íßͶ¼„ÉI|ˆóÃÑš&ë¹÷öÏ?Ó§§§×ÔþÝÚ>Ð?îw³é䮟Ï~Û?oŸï{ÝÚA˜µ'ìž=T玓 ¿àŸý|ûãýçEHü!L¼á&~cµo÷ìszö½úöë× ®AØñWPû4JBAI ƒ(»Ûº—Š¢$ìbk»Óϧ’]ŠOçççco¦Ói¬b«««¶„2ò·ÞÖ °=¤ð‡Œ$™H‚ ZÿMÇG\º}ÎQÝŠ“'O[vhã·º?!'¡fŒ©q’ŸÃˆ€Ç)@ÏÃïïGеþž"€eg/̘ßΟA—9NÆÇÇ (»ÍLmŸ| ã£ú0ÊúçŸnÏÂÉ“'x/JÿÏß¼ð§—ý(>D}È×8â'qÕ0óN6Âä€Åiß͇aú$Ê-öâÿýÄþ@<ñÿFhÿÖvO6­y¡Öñ±ÝKØþgXíßï8`˜>ðe¯T*ÌÄ÷ ¹oô»n¸û÷ïG±X <þ÷ãÇnÞ€÷¡R©>ÄeÛ aËïÏ]~9Þÿž÷âRéAüßGþŸÿö)¼í‚Ã}Çñ÷ØC~ðm'à?džM| ФŠ¬»ŠÓñ)n×öN§Ówœù“v;´ÉŸãÇûJhµ›˜tƒ€¸$ù`-³ßòÙÕUÝ| ˆaØŸÑÛ]Íe—ލD|7H‚›‚›‚,ÿž®uœm€ÑpòÅ®Ž÷D`&ý;õ¼ÀYÓqAIPvýà\7´ Á*âÖÿøµeEXÛ€=ùÐ~𾄩oÞߨ×a#Ù¶m«}7¼ü û[’$[û²,£’O¡ÜCÙw*k\÷¡Õ7?ì®A»A}pBÔ2»Ù  ¢ý½Ví¿½•hîgwú¨¦}¯ó¹ù†gßî9 8Gøþϩϵ"èxlýÕ¦›]k_k}9=w~cN/œžÁ~®Ã ê jß3*û£.wœ¾ÐgaÚ¡—/V8ÅbNˆJBöÏMû²,£œWPi$}ßÅ\¥:ó<¯_ûaw!qû~õ?êko§ø ŒOAŃرö^öì0ª¶Ï#®úöÓþý0Ý@¢{€IxÏtL½^Âþý-¬¬¬øî¬;/ósáNמž@ˆY­Vµ¾>ø²YçâùzM&“ªµæççûÆmn„ÓRNê›?¥½ó.ìnçáýpJîµúN¯qýùûÀ­=:ÅþKYc_üwv¿‚÷ÁÃjvåŽ:ïi?Ýî?;ò?µ;»²»ùáUvÀyþƒÚ?o;.»A(‡=>jûA}ˆsþq˜ëvö­>ð°Þ‹AüX^^6ú<7xÛtþB¡à»üqŒ?íÊôZD¹nöýö?Nöí|3÷îǶÓsÇoìcm vý uS’$×g%­{ëß"øÖsF­¿c°A]ƒ0˜q·¨ë.Qêž¾÷3÷æÇ¶Ÿµ6þáÕþž='OžÄéÓ§ R³µ¼„T*e"W«Õ¾]¢ýÞ|ÜÇ×àï9dCÂ>ƒH€É*åÞv:Æìì¬mœê•ûCä[À,á·üV?éwaH°Vû^ñ¿¼é8§ºŸššÂž=äóet»ÝİÖ!ìâ_§þ7¬=«M;X¯>ÈÏœs9¯ Tgr€‚ø@»ÀªÕªíqƒ²ï×?öQÿ^öíb?±—Õ¶]ÛãáÕ÷Yc`/û~|ðûüû@ðø'ŽüO¯ØƒÇ òOƒØ÷ãÃ0|qêƒaÓOü&ö'ÛqÅÿÃnÿaëÝkÛOÌkçCP?x¬¿õ{ÿ Û·{ïw~çwŒÏŸ~úéHùW^y¥ñù?üÃ?øöÁOžœ>·Úßåw|(}9þ§K.Æýß\Çógœ~Î?ÿ|ãõÙ³g…€€€€€€€€€€€€ÀëbPè•lé° Ä™lË‹Ø~ƒïä¿ã•~ˆ_~7 Ýk7ú0“n¶ý$:á¾ýøÀ#ÎòJxÀ ¿‹_öïׇ mÀéØ ;†Ñøñƒ‡Û§ü.¾¸Ù²"¬mÀ;Ñݯn¾Øµ7Y/û~&½p.Ù3ÉîǶ_ûV[nH?¿wJ~c?ˆ<‚$¢Zm¹%à†±Ô«?<Üü[f;;vVû{-Ù+A02ü(í¿>ÊéçYì•î…Öÿ±éE¼j7¨}«M+ýìáí;áÃØ¥ýQ—;N_üú†ŒÊ¿·Çù9&,„ýs×>ÿL rðó8çrùÏeÛ£öÉnNÈJìpû> ³íÂ/ ›€ „ñÅz¼ pNÀw#¿Zýñ"b;ÍMS;±«DD°K‚Æõ÷#`G€²žß¯~“?ÿóv~¹ù`=Þ/ >›VÖóGƒúáäoÛïüZ\vyŒ²üÁ~PâœÆúàÖ\Üüð»µý黢¶7_¢øGýG­‡(}°Ûuöê{ƒø`ç‡[΀WÌÔ~˜:²?¨kàÇö¨íŸ‹¶½ÈØ~}Šò ðã‘à¬âßAì»ùàå‹íùï•{aG< {lÐØ?û^ý`Ô5;¼à›{1£Ús‚uükE¬1Û³Ài >øÁ¹`õïeßJÂôÛãŒ?2öqóÁOü3èñÛQìo$_¢ÄÝQlúÿÖ=®øíßÍf{<¢Þ{Q|!ÄÑöÕŒ:ÿϯ/^ý¨[½›íT~78­u {íO@@@@@@@@@@@@àÜÆ(F „M´ B‚ö“€éu|·Ïõ‰€¨×ã\BP¾µ¼^¿÷£ü:JûQý kÇ »…¨ ¶â¾½ü±› kÓ-ëg£(¯ÝçAE;â¶ïåCШQØuÙ£œoÔöGíàâ§óº%; -øÁ Ú`XòÙëѾ€áõØÿxÙµ;çFˆü §…Už÷òa×TöG]îê‹€€€€Àk ~àÜÆ½q$@ÚùG ä7þ‰Cˆ2¬TܬAüÆõ“[c`>¶w»öA Ösø% ¢ýî±›Qâ½QÍrÜCÔLœ±÷¨í‡9§¸þ¢üNçFûs;>èüg>ØÍf”ùV;ü”9ê\¯õ9:ª:õ5¥ýh;(i6,ÁÅKè)hÞX§_€Q?ÿí4þ‚_‹ 1eÜëî„ ^>sX¤¸µ£ ~;Cü^ƒ¨÷¡Û÷aÚA{@Ø­}·þǯh]Ôçî(쇉}øßYæ<êñ\ö£Æ¿£òe#”ßoìog?Ž~í?™Lª¯×6·Q|ð1îwü-cÌñ»seíùõ^~s ։Ѹ“l‡¨b@qˆ œ‹ýß`ÀS)–ä_ û¾°ÿÚ·/ ðÚEÔØBü^ü^ĦÁ æ,F QÿçÎîK¨ôgýî› ˆ±Ý9 šOóJApÞ¨8aŒÄ„œ[2Î0ì»a£ÛgŒ©©Å ý3ÆT¥Ò{?hûƒ†_ûAüó{ì(ËÔökaÂ|ÔmmH&“êÔÔ”mè§>Ü~ï×¾ÓwqÞs~Õ^œIÃ(»]_>,ÛaÎëö ãOØóÅU~·óœk×`> AË¥ÿÕ5Þè 2+ʧMŸ+ʧ‡Bö å¼Y‰¾œW†jnnÎôùÜÜÜPí+–ò+C.&“1}žÉd†j¿dÙ‰ ¤ ·üù ³ýüÄpí Óç…BA­"ƒ1¦>öØc‘ÏóØc…šsfŒ©ò+‘íË?¬„¶ŸøTdûù‡O…/ÃyÇ-¿áæücjåéèõ_y:\ýÁ0c_»¹×¸lû³¤~0(ûNsWò?êúDù_¯sU¯Œ:Þö…ýQÙ?»/¡Ž7þx€na³ú«*ÄNäç8øÝäŸV@@@@@@@@@@@@@@À~.ÈÁv“ ü„„(© Û톞„Šb?nŒÚatöíH8Pª3Õɇd2©iûÉdR­×KÈçË}¿ c?Nœ+öW3«õÈÿéÐ `ƒ^[Ët®”ŸÈ:Ùt™l¹bÝÓ¿r^A©Î"ÛÂÚö*SX_¬Ÿ ¢ü£nkvþX?‹ÛJD¼îºë+++Fè§>Ü~ï×¾[ßÛ¨äÍfÕöžkTòh6«}~…AT{ne¶/~m¼0#ƒÕ$UQ”cLU”‡ÁØMC­÷¨eÓ÷òçk5[h®®¢Þîo˜å·ë3‡íCœv£>Üâ?ßGA˜ò‡íÿFuÃ`XׄΣ(h‚±çÓîÍé¢Y0v“Õž“ýù ðN¡Tg&û¥ºöL¼›q} ÌþÒÒ:MöÕ¹¹9¤R)ÌÎÎ̾RQ€&À,ågu] °âàÊ?==Ó§O£Õj™ì·Z-5“É`||ËË˳PQð-ef.™i¢×ØÅWþJ>EÏ$“ýz»÷¬+Ö;³?77EQP­VMö«Õªª‹`qq1vûNþðx½Ì} þŸ¹Â >Ä1ÿ8,Ûƒ(Ü•ýQ—{Ô¾l”òzþuT¶7ŠÂþàì3ÆÔ£GÖÖÖ°uëÖPókkkøñŒ£Gâ–[nñ}Ƙ*7&²| ’´#”}Y>œmBnL@ʵÙ?ïŸV8&ËØ!I¡ì“eܵö3œ÷O«`¿žd¿QÑæøäV ýB1\ùXß‹FEA®èœÊSßû 6~P~Û¥í¡ì?(?ˆã?>Ž÷>˜Ç?n÷7ÿJ¾oމÅ80Æ•cÈfÓ€fs<Þ|áÞb,¶¶lÙ2rFaß:ïIŸÑÜ'ÍÊ>aTõ?ˆò‡ƒ87ÀS—––Œ÷³³³C÷(ÏÌx`Ì—}ùë0ÞKï¼oøöëÙß|Þ"ªýÆLËxŸ«e†nÿàÁƒøÚ×¾¨V«±ÛÿfêwoF²zÊ8/ýÇ‹›PyX6Ž¿IÂÙ}gÔó2*ÙS«ë\œcÅkSŽë1®p„oZLϤ{ŸµVa”Ü~K$´ýû[ÉxqØ£öEØ}" ¶4þ2¯ËÅ–”„ÉëïÂØç‚}HÍ(XPùúË€}Ÿ:5fœÃÍG'¦_û£.?o¿ÞfVGb;NŒºÞí|±"n6R™y¬„×]wüq¬¬¬ hß×ív+++*geeÅ·]¯¾WO´E£’G6[@~µŠz»·8SÎ+<9–ˆÇ¡ê'ª=·² Û— ¶Îî_à {´dP8ÏV †¡Õ{eÂ÷½Üs'²q’"FáÃF*;0|R|èò×j‚õ£¬ë d…a]ƘªLÈ@kMÿ1‡ã>EyX Èlk'Í8Ù?]9ƒï5/G‹Ráæ¼&pUöyŒÇ”|Dd¨§žz °¸¸h{Üââ"–––°´´„«¯¾:áÉËþ«k ~ô%ý½CùYAÉ*P* .}À¶ÆWþ™™(Š÷´Z-ÛãZ­¦§§1== ÆjµZlö¿~FÁÓúXföå/3†ƒŠ‚ƒŠ‚+À;=Æ8Aì«L ÙÔ g’õ6C6­‰d³ ì(ú'œyÙ_XX€,k‰MÕjÕö¸jµŠ¹¹9ÌÍÍA’$ÌÏÏ$6&¢ ³ûÆ6mîãtåŒé³ï5/ÃõCŸkTÌc€f3¾g^2™Të¥8vø¾Ÿ0Þü¢c0ÆŒsæËHBXÖ$KX}¤éØÞcjç‹Ó€Ôû–=m'“Iµ>ÕàœÀhMt€V£"‚%À1¦TÌm@&øÜljü¦ÏÖ[§°£3š9`ùAóÑ­ãÍ’Ì b.‡‹¾¶Ìçºó~(–> ÑØ]Ù哌àÙV oÿÓ?êüÏÚښ鳓'OÆóø±Ï'º a¦¡ÙŸ››3}vòäÉØb?ö§§§MŸéÂL"Vàu »±x\s0’$¡T:„l6f³÷ ºñº,y¼‰Û>XÁC_)@$[’$܇QÙ·Î{½¹Ïa•”õ?ˆòǹþ% °1À TÀW¿úUÀÌÌ jµÚÐ91múÊ”¶¿ ³“}š—Þ÷7ûå<Œ\„¡Ø×çåžÕ×È©rø¡ìÓœx«¡]€ÊXE VŽ·OäÿÕUm¼‘ÉdÐjµbµÿ«*¨žB·°Y½zï)¼ÚJ`¼¸ òóåý8üÏÀÅ Œ‹€³ûÎôÆT{ÕØrm͇ ¤$‚Gk_™lP¨sgø€LZ#Zóïëm÷ß ­X¬¡R™|GÞ(ö³zb\“$a}‰ ¯eû~È@£,« ìÝüÒ{¾ÿøK¿„?ÿþ÷ñý/ýöí`áGÄI c?(¬äx;²ü íû—ýÔŒ‚Õ °ïÆ7 ü¾Ë¥/>‡½m&Ý:5÷¤8+ 3ˆýAï}š0&rÎ0m£®w`ø¤üPf`xåN&“*‘¸xò?Áo}Àoþæobnn‹‹‹‘û]EQ¹b]€}ûµÂïÝSÀ^î˜f³jz.ñ»5ot{£ö…žûŒÝeÿÃÈçàï>­í¾ÍØMC­‡¨eŽÒ÷Òs‡Î5êv0ª¶8ê{`ÔQÊ´ÿu]SÂŽ×ù†uM´Ø÷Ó8?œÅV°¶D;rö«}~” çg¥õi0ö±ÈÄ‹r^Áyà*<ñâ&û;pºrçeÔØˆsssÆ®€·Ür‹§ý£GbË–-F›‹j_É+¸À¥ïÎÛÊ<í¿º¦ÅøJ^‹¡ü™L›6i 6µZÍÓþÌÌ 6mÚd$ÿDµ_R Ôøêx IDAT¿É»ü_?£•¿¤(‘ ¹$´—¾1  ‰Ŷ§ýc• ¤oÌ"?ÑŠ,ÈÇS+ÿãk¸TúÀüü¼§ý……H’„ÊÿøŠìßÅ.ÈeGþE95p'ò?   ZÀ‰üÄC4#Œ7¿ˆÓÙ÷¹øÐOþ¼ë@;î’Ð~9‘ÿàXeÂUô‚ŽóƒV£L.çèƒùè%<º Ø‘ÿxú7»vä8–R†*àDþìwbŽË¦-ùZ¢ç°DœÈÿpæNe "Näøö_þåPDœÈÿïôÖ¾ù@,1—ûväÀüÕ¾ù@l1W˜ãüØôžö…ý¸À àå'”ȱx©tåòNÓ{¦ÏÞõ[%|áÞb¯ èÃôaØöæ=óÜç0Ê?ŠúTù±þ% 0:X‰ÿv˜™ÑrNIˆ/´øoeJûŽ„aß:'̓6ì !€AØÿö_þ%˜Ãôv#•ÂåwÞ‰·ÿéŸ̾u>œGeL›§%!€AØ/ ŽÇd2I›„â²UöyH9-G„ˆÿ<ÞýkÚÿà ZùIÐÄ¢Š0ÆÔJ>eÐ)_Rÿ6Ê©l`m3™É,ZÇ›Úÿ¦sû$h„š| ‚Å0Ô>%±gÓid²™X“3Ï¥ººÃfÜöý‚WWWñ•ÅEõ[€£¿£®ÿ­[·¢±Oÿ_ñ>~£Û'‚«i»—j kƒ±›lï™ZþNÕ|ýeÐÎ-|¬¨MLwàï>°’0ýÚüاë8 ۃ¨ë}¤ü8ËœL&C‘á‡UnI’Œ_à·>dYvMj ng!öëÏÆ3È«ßØÈöFå =kÎß³PøØÏÐøí_üÞ—ÿ;þ[¡ìõöMˆÛ¶¢”9jßËŸo#´ƒQù0ʲšO>áÊ´ÿ‹³®ƒˆhîÇÇaˆ‘(ʧ{´Ö´Zö™.Æç­5 ³U÷3¼‘ÿ Ñ÷Oûßk^†«3Z}R®•èõÔSO™ì8Ùê©§Œë…F侤…^öô%M,ˆ&@ä‚¢“^½ì+ŠbD!¤äO«f;NöŸV5± !—æMͦêË~³©"}£öYâcL- ø?Þr ¾ñ?ÿ/øÊW|Ù—e7Ü0‹wüç—ñÑ' ¨V«!]ñT âÿ¨ÐtHø‹Ë­Sºº˜û ‚ˆÿ~ÐÚGóCÉðŽqBè§™üÚn=×Bë³-àãtâÿ¨ð-ïC"þoPl4LñÔ âÿ(@ÄÿQ‚ˆï£ÿG…Q—Ÿˆÿqcmm 'Ož4ο¶¶†­[·qcL•j¿É™éûµµ5üøÇ?¶žÃ—}Y>´öï®3ÄÙ—åcÀÙ¦vÀQ8ÉÇdSÿÒÅçÏkWà˜,c‡$²L–q×ÚÏ´sèçÜás*ÿ°‚Öÿ³­Á^È?ÜéŠÁÊÿà ðø^ã{ù‡H¿à˜ü ü þˉ%<üÝ&ðVíývi{ ûÊâøkç€q_öí0ó x×o•h‡ud³iüÍýÆw—¾á·b±qõÕW܇aÚ·›÷ü»Oÿ<®ZÑvUäç>‹Å›ø]îRþa×ÿ Ë?¨õ/áÂN¾úÕ¯ÚOBb)´Â8LÉ’ ‰Äaߎøß›k6ƒ_KŒC¨—Ä8²¯4KöêDp ùwâò;ï4Žfæ/ñDó.C ûvħ9q‹H.­OñøÚ×¾†ÕÕUÛãùµD?k‚ßL@ýUÕ>÷õ쾄:^ÜdKüo¾¼ßôž„ð`‡ÿY{9^,FàÉÿf⿆m?û !(àÒö"•<¤íETò©Q»# °q^ƒKu†\±Èë(Õ‡«ôÖ~½ÍÐ\]U)ñ\ª‹kµP(`iiÉ÷'qÚ §IÔaÙwƒ¢(‰:cØ·hTd2Úÿ}{:ÌîËôvÿ^˜‘vB‰9òï?öEIH’„òû.7îù½ü©Å8G{AíÇY^;FeÿõjÛ [·nÅ^„>Ä]æd2©&“ÉÈýÿ Ë}õÕWcqqV‘‚ õÑív‹‹‹žIaÀÛºô75¢äö¹µýþ\´7l_´DÍ›ðÆš„7Ö´DñRé±ËÓk’¶CÔˆêa£ÔÿFðãõv (¦¨·êm†ÌdÖøŽ'Å×Û½øcP~Ðk?åÒÿE­k"ÿ3ÆT?cEQ‹‹‹XXXð5Fú5ÑIýûöÝ…F£*cLm4*Ø·ï.Óqqãªìó¾ìÓqqƒÚ—ýA7c¾ìÓqqƒHý^ö¯PïŸÍ&|Ù§ãâÂ~ãûh^ÔÛ™Ò˾$Ih^¤ý.N8@±ÈfýóÍÆkE9ÛüŠýÓ•3€ñâ&\_p}ýãõ‰ü‘í;´eµñs®ÈŒù–R½÷ºœWlíwLg6#³·WÚÕVó¡¨2{ ˜Îlöë‚­mJ¸”ÞyvÛ€ŶñúXeÂÖöÞ?Ø‹ÉlÆú±#2—g°çÃýdE>é1WË ¸®S\/¯+c•¶ƒº(É.ÆPÖûº2÷º¤Ø·(`Œ©'òšÂõõW°££ÙÚÑaÆëc©xÚž_äµdRi{Ñ4I¯•|¬uÀSÏû'mNôÕ_OãÅyíZ¿8_4^_¼ýºûñƒ’žY‘aÓ]ZÝoº«÷úÌÑ®ƒ[Û“ðÿ³÷þÁq\eºð3 $lrƒ»-¼KˆÝ£ÁˆírM‘Frœd T4C%ÜËW\,)ºT²[Ï ‚o¡øVL[[,)¸(’¼ð;0#W%‚‘f¤8?Œ!ê–Þ¢i+›_k°»˜Ý8YÓßgÞ3§{z~ìܽýTuÍLO÷yÎ9}úô9o¿Ï{¹§WïØ¸zÇþý©;W´HØ 0ÛǶmÛÛ¶mãß÷íÛ·¢ÏrzÆØØ`llŒO$+ÊOA¡ÆÆÆÉd™L†Çã+Êß×ט…QT_†Á¿«ªÚ4¿$Iξ}ûjcåm«*Û¬|í~¯VÛ`iw®¿•÷>‰iS?³üçý|±&¾ÊjŠ­òçµêÇH’ä||>¶büŸoî¹@÷ýîÝ»±{÷îªiÄ:+ç£Ùû¶íP2Ùƒk7D0=]à69€‰®S©il¼~¸?¹¢6˜s™‡•â÷³{^‘ ûÚ>å?‡m0@€ À¹Åðð0ßjl™L¦}+À'%¾Õ<6'ñ­]üòGÄ·Z ;};ƒÓË==¸<³—gvÔ<öòÌD \½cGÛø£•oµ@6òä‰öͦ¦¦øV d£2 £.þK¶»ßUœ™9´Ñ¾ä™o„‡~á¿e»“Ü^|\;‰VÄÿ /.bbrªLü¿ü4s)×ba×ö9›ø.òlqÒ{°7ƒøÿ\”?@€ @€P? Fõû½Òh†_XÑòœçå\ó×#¬_Iþz`Ûvègcc˜žžÆç6ုQé\Õ¿$IN̶14ÁVÁ3 ö94ÄÚäülšf(K#›M!K»„°+ÅOçIÒœ™<‚Øcˆ`+­Ùöáÿ•/­|Öâ§<ö¦±tRR¢ „ã­åñ‡òÜíŸ3úÙ DÐÎ2+ŠâŒŽŽbtt´©¼œr+ŠâôööVü¿•úèííE=„j}o%lÞ¼ÙõÙTLÔË×LYE;ËNmȶà»÷¾pð°Žü-ïƒ,Ëeml%꽜+Þ7c>þOºo†à „FË_oÿ×.Z!€úãFVa“ë\%’°ׄ/¸×½Ó`¯lÖÄÄÄ}èˆÍC;`¡#6‰‰ûÍš®ãJü÷6<6‘$ÉñÎghÅoâ×baXó´XØÅï]¼’(·? ½GuñãÈ‘#wñÓq„fi’$9¶§ü¯ü.þ5Z_²æ°F‹»øé8‚ÝdùÅ;À. _‰?‘H`ß¾}H$.~:ŽÐŒ M’$'åI矋)>ÆS;w"v_ÿö05#È•$ɉuºùuÝqñWjt¡š ©?­®òïR¸b–e¹ø+Õ¿eYÀ“ì<mœ™|O<ñžxâ ¾ßß.ŠªxN¿Ô—¿«¢+ŠâdS&²)³â³B×áËoT0-Õ“¦:ô¡UuwèúæaÖ§(h@‡þ`½ÔU±xP÷å^ð .JA6¾J¼‘Ï#þº¿˜ÖÈçý¯ÁË­8UÅù¶iâÛfåëõkø·¥–Ù«ã„qÌ—·Rí*ŠâÌGÿˆùè›ûT‚±àßÚdÖ‹·íÏùržyü7+Æé‡éý @QÇL™0kôŠ¢8…éi¦§+÷‚aør?¤7~5‹ååeß+…B¡àË¿¼¼|Vø+•ii¥{†ãÇûòŸ›á¯gt.êÿl•?@€ Àÿ>ð·(¨7m@ú{Eÿ­¯Åσäü·•æ§@¢Ðß+ú_QþžÈ==ˆ \è/n+ÍOD¡¿Wô¿’ü@ú{Eÿð+SÇBæÀeÀÄÿÉU  Žk'] ‘¿wmEüO‚þȦM|#øÔˆ µôØ$à?Äöpi\m+íÿiÛvH : ÉlᬽËÝ{¾Ú‚  @€ À› 0KŽ$y-VÑéW‰Ð4-ŽÉI¹\®i!Z3ü@{„9dì ÇÄJy¡cÚípêE½uñÀùüÀ&LOOãgccm35{-êÁ¯iš¡tÞÂç6q1¤X¯•øýŽ]©ë‘ÊJ®ÕðüЌӛ×Jy¯‡¿0ÁÓ¼·ðjÜÂÀoÞƒü-ïCþ–÷á¿ÝõÎ\ï ÐnþfáÇO²TTÆäxɉ^Ò2íi¯Tùë5¢žËúÿÎÍ„+QdSQ×ýw®‚ œë{íl•{Æ 8tèPÍã©C‡aÆ uñ×Û÷Š çP»‚ÐTj{ò5S ±•ÂÚYvz?¸—dd¤Óý€éé‚o¾Ú]ïõâ\ñ¾óñê58×Á)#ý_«\^ˆâÿZý 9ò4»ŠêŠ^u= #6yü#^Œ°ß/FÖcÿˆŽØ¼ë¸vãŠÈï°ˆÿ„¸s…QAˆ¯@ǵëÖ­Œ£»{ÿ½nÝ:twï­LKûÛ·ÿû\£ÅñX¤ ×u±ò_×¥â±HÖhq×qí†T\á:‘H`ݺ~„ì¾Ãá0Ö­ëL ãÚwg,ùpCF—G"€Ë# !ä‹ùy÷ ¹D",áZíŽk~ ü³Ò¼®Vý˲ŒÁ?cç­òù<6oÞŒóßÊ¿ŸMç‘߯---qF"¨‹¿m®iš¡îüÅuh bâ=¹µb¼âÿîüÅm ‚E|›®TåÅÿýéuq›¦J;iÀàIV @¼j4º"mà×5þ'Π¾6Ð.×jõ²ºxÛ£V^Ô®Êí`¥8_ûXï9é{¼ùp”ú®Ȭ?íªª™K|ïRÕsVïyïíØ¼y3Ö®]Ë¿ŸMP¹Ãáð9}­]»öœòwtt´…_’$gß¾}eû?ŽS§NáÈ‘#¼¦æ98\•S¼(I’œ#GŽàÔ©S8~üxYz•æ6leùÎòŒfâ}Ëš«›ß²æ˜àÿpy+ßY‘ÿ¼Ÿ—¿ÄÙz÷ys–U7ÿœeá¾#o`oèù²ôÎûùbEþ¼V>¿4 ‡‡`ýA«¿üЀÃC¾¢ü¼æ?ž$Éùø|¹HþÀït,œZÀ¼5_7ÿ¼5…S 8ð»òÏÇçc5綬-Ø.§ý‘‘œœ¿û÷ï¯vjU4Œ‹ Ë2’Éèú¢Klý{w¸?ÙPð¾fÞÇÑ*ôÕò°’Žð+Åïµ{úÙ>Eqšám/~ïðÁ¹,?;æÜ^ÿ @€g’$9ããã ­Ò6‘H #gï‚Z}‹ü¶fƒ¶Jü$ަàÉíä·ýh«Ä?§ubNëäïiÛÊ?7Ú*ñ[Z–ÇÓ+Pÿù¸Ú*ñŠ]€C± ðÂkí/ÿîÝ»100P5 4µ½¾¾¾†ù*_èêŠÈïáèp:’« °øFAàü!'D‚~{Ò†=iãOGXùÉv`åm~\+âÿ¼ãïý&ì'q¿(þýÆç`è&&§øÿ­ØüòRɆs6è’$9ÊœÚþÓ🊦 • @>ÌbÚôÎõlC’$çÃ_ÜÚÞèà~ö>: @€ @€¼ùP1è3ÖiC-{”»“uSɰ#Šã½éÔ³¯Zá_ ¡7s>¸¶ý!X–…jyZi¹†¯ ½žºÿüÀ&¤óLÓ ýhÚÚȵh×u  £££˜™™ÁÌÌLÍú·,‹;::ZsUéF (Š#Ë2Ä•°i£•°eYvµïfE˜ÙlÊõÙ,=`"­-Üù²©( {÷%’´²,c%øëE=å·, y-Æó¨íS9[y°Rõ/B’$gLT‹}ÈÙàÿÓÆïøî?Ü•Ð*w¥2Õ‚Ú©úÿJŠòÏe}×ÂJ–;âðáÃeû[©Ã‡#Ö¿¾×›â‘»“®vBuÒê3PL³¾ZeñÂë(êìdÙÅçØOk×$®¿1ÅÓ^ îj8×ûÍ–jÏs]Íð6û ¨„³€ •zo´ÿk÷5.­ðV P ¬B'¢ׄæze0ŽÀ¶ïÅñl7àÂä×çñl7lû^À8Rvªmß[÷\P’$Ç/ÿÏé—"³‘Ì2‡x¿UÒ1Ïé—–›ŽÕï|!I’CbjGE"‘Àð0[sÛ¶m®Ïááa$ ßUpÅ+ëá·}ÊÿÊ;fãåd-ÎûèóådvÌÆ+?.OÓn°üªª–í·mªªbll x=ÐçØØTU…m—ç]UÕ†øS>iü³¤lÑ»þWe2®Ïh¡€”mãŸ}XR h¢ù½ºî ÖY½ýÅ:mèz9M#Î?’$9ü÷êû.~ÅV@¨Zÿ°, øUñ¼"ª9mÕ“I’œWãß722âóýv€mk»#’$IÎq­´º±ÿj••÷Pì‚–ìNÍ •Eçùñ“=†úo¼éÖƒýAô©—ñ â*¶~yèóÔ(þŸmRNe±ýTUcÜœÖY&þ_hrUx#Ÿ‡ºFåAòñR:¾×` ˃¶Zk© >àùMií¶«·’¯RÓê=@iŠ]P•—F'saÞf¯½_~¬y­j^ÈA2¯ÅZ®:_æúqžÿ‘¿\4ºr+‘tµ|„Š à䮾6Ïä„{åo~ÿÍÍUå¾¹ç©;Û^”‡#GJc;YZ*ûNÁHäÝn‡W ²ø×­ZOã­vó‹ãBßû¿“5€x<¾"üäX]‰Õ*æMã­Fù©þHôO¿½PU÷ŠêÕq×®]ë P)M–pñ!Yýóß-ðCt¨&äÞ¯(‰þéw+ü¹÷+®`•ÒõsìÞ'Ñ?ýn†?SK+, !@¥4àîl,I¢ÿ»7ã±ÛòH0Ý0úƒi§•š0648]Ÿjø<‚¢(΃GM®Èÿ/í£/½{(Ú½|F>_Õ¾}Ùÿl_ÀWn÷Þ½û÷ïÇââ"«Ú—üÞÿÕƒ:™—9ŽçÌDÈ93r:’« G%hØ»'ýô$¾úÈ$.ÕБ\…Žä*б”ÎÛ?RJ“ÿ¡K»©Œ¡$þ7t†n¸„ÿ‘M›Ù´ ·Ý±otL»ÁïǘÍmÌÕö¯$‰‰ÿ½8U4+]øóËÛÎIóÙ§^2yp‹h2‹d¶ÀßÇž­y¯$1ñ¿ofö­h¨9ß @€ ÀÊá-~;%IrffføoZ]%••€¬èø-qÑûODº,Ë-åú=UU±yóæŠež™™¡~qEî5µMÊÇJ•›Ëå\ϬVêÃ4ÍP.—sî¹çžºù½}¯EQœÂô4ÿ-÷ô`Ï tÑ'X+„ûû›ª“Éq·£òëׯ/ã#a–-[*‹±ÿ9p=H·8ô xê%“Ÿó®·Ieyyá5x‰]›«›èƒÄþÚ4Í~–v®¿1…/lĵ"H&{H$¸Pä&ý×N˜)Vn)Y^f[³aÆ’®ìÜÞ*Eq²©RÝG}òÁDz¬îcéöõƒ^|ðË?<ò7×–åáúoüêk7µ•“Ú§ÝkCÊù•½äKçÛ^vêû-˂܄5¯ÁX`/=EQ<€¶¬2ìåû?‚X~ =ý•áÛ&kkŸ–Êëz·m¶Ï+åí]’$G‹…ËÆ^õŠÿmÛmÞ¼Ùyâ‰'|ç’~ym×5¡þŽÁgÙjõ3ÀÒ]•P?ãˆ@ìG«ñ3±ãe˜A¹#Ë@$„T¶2ý@$„ç|²½—ak ؘ­>/­ E¡¹ˆîîîª}kww·o€p8ŒñññšóA—³•O9ÞþU_þxûWáÀŽØ’µËO"3¿Õ[;;;aTY¸³³Óר££}}}˜­ÉO"[¿¸o Õžâ7…àà`÷ì§kØEèÞüÙîT‘M.•íÿ÷ Àœ„€d¶P“ŸžáT¯î:Üð3(>ýEQX'Â뇧Kc††ì^áÿ™É7Šy;à~`òû°q/HüO ÿ%é®–íP¢øŸ‚{Š]€Æ1ž`¢gÿŽk'ÑQ£­WÂÐ +Žc¼Â½xO¦c6ŒE&êƒ1èœh’õ÷Z^A2j"_‡`}uw^qR²‰>õ2ô©—!Yx¸ ÿPìÌÇ`LLA —Äÿ"DñÚR~.{…ÿ$èŸÓ:± EgÌ’ø_„(þ×òq›¦J+i§÷_z¡®Q¡®Q‘9Á}ÅJÔVk0^60ù qĹøŸ@ÿg¤LÃíà¶{…ÿÔ/¥lK`Áb¶ ïÚÕô¶I[¬Wø¢(⟠ÛÐÌ€.‰ÿ tÎÆ,k{ý–‚iÙD«Åÿ4Æ §ÈÉñ h±°ku$ñÿZý^%>Qøÿ¶ýÌf~Ѩ†3ÿø¿ Üô.þ'œ÷óEHÿySÛìß”z.‡ŠUyòNθCtÈÓèx©Ø¬û‘‚£Ÿ2}Ÿë"‡†îïç¼â\ú…â³÷©;ñ®crbZ<ÎÅÿknrOO[êÀ+ü_^^ÀDþGÅ#<‚ññq.þ'Ðÿ­ÚÀ½Â—% ,//s‡x¯ã;ýŸÉ4~ÿ{ùEá?•?cii óóóPU•‹ÿ ô¿a-ó‹Â—©ªŠ“'O¢P(àÊ+¯äâýÿì³Ï¶ÜˆóÈ‘#X¿~=䨄¼V >¬Å£?Fü·‡' €eÍA–{ªò[Öœ[ðßì =¹s–…Y®Ê?gY.Á;`€Š!X˜€üŽdõòÿACø=iлÃð{Ò(T™_éÀê IDAT3TÃmáÛx:·…oü5n¹»*ÿ¼5_v^êWõßA«üÙ¶JeKA¹$ÉÆÔÔŸOçµt} FñQ‘]’àÝ'"Öi#»Tÿ3™l·ŽŒàÁ£&Æl‰d>q;{>pc¶ „€[×)ôÞÍ×þ"¾ÏßåÕ› ̶uëV$=yeÙûÞ³­6 ={öðïóóóeü}}}øë¿þk~ÌwÜÑPúÞëQÉöYœG—ñ='ĺ=p=ìɤ’mضàüÁõ2r]íàlÔÿJ•?@€X ˆï4Ú9ç®—SœÕ²/Ÿ­<í<œKî7Îv=ß«q«hoÝæ-–A´{<üðîãâÅUæ3™ ?žl­ÀU‡‚íÛ¼Òî-ÎÇríz@ßEÛóÄ·Üþ .•uówEÔ–‚ˆüùpWEîÅ Ìkîd¿Ÿï„®Þ±ÃÅÿNµµ .~!à­áyy ­fcÿ$’.þcÿµø ûzËüb êEÏû0š †áâ—$©é WD~Ïí¸ð`â¸ùÃì÷C£¬üɤ+W/æÃ“¶2u,ô«œ:õ-&Öƒ —‰ú#›6q{÷Ĥ;¸`d“ç…P›ßxO´ð>vïÞ øô§?]uÿJÁ¶íÙÃÚ8U9¦dÛMEqu:šxô´®*]aò¹ºúÏWÎÿˆ`Ûvè_ßæ ñ€ @€à͉ó¼;Eqb6¶nÝ Ã0\ŽL阼ƒ5¯!¯Å\+-†­[·ú®ÂKâ³ÉI£.ñ¿¢(N:fcbrʵrE5~]ŸÂÄäÒ1é˜Ý–•‘Ýâ7ªåezzš;¥¢Í¯ÒLç---aûöíØºuk]ütí&Æo…_‹…¡ÅÂqA«ñ/..bdd¤¥ë@猌ðmûöíuñoß¾###Å“O>‰B¡Ð’(KQ˜3ú ãfc˜ Û˜ ÛÈJßh߬q 'ŒcHÉ¥ÕP¨ý×+þ÷æUü}Ý×¿Ž§ãq<»øißu_ÿ:,Ëj8 *‰ŸÎ\K22Òy‹xEqÌ^ÿ¦8415Zk47?í;41Ó ˜½í]\Q'•ñ«¯Ý„Wã^[.~Ú'ËòŠˆÿ§S«±xPÇÄ·&0§ubNët_ÿ⾉oM`ñ ŽéÔêºË/I’óèI›9Ò ³m `B·X:C± p(v‹ŸöÅÒìEI**—µY–›*{*”‚‘Ïcò´Õl¹ißä4ùª¡Zß«(Šs õ^Òß cBÂKú;qD{ rwy-†TVÂí)×ÿR5•5¢"/½Ü²e –——±oß>ß¾}û°¼¼Œ-[¶”ÝóÕÊ"‚„n%ñ+=¨ì#¦‰¥ÓÀž×€¥ÓÀ£'mW^=i»þ1[¿MÓ =pßÚ5‰H„½X\^^F<wqÇãq,//c×®]øÄíí[ “ž;JZAÈd‘÷ä6B& ¤ß>·]yHFMè:Ýé:ÿˆùHÇl×ÿÉhûúA‚$IŽeYøÕ×nÂO~q{Þ yx5ná'¿¸ ¿úÚMmå'9]ؽ]€ýASèÐÄ|ôm{œ|h'šƒ(Ê¢Àd^Ñ1íæöëÿÄò·³ÿØËæÏ+ ~ &ä¹R¶_ƒ -˪•G;ƒ²¥€Ù” Q¤*^“¼fƒŽ©Tâê%¶}PYõ3"P”¯àŠ\˜÷ƒ¶}dzÝèˆÍãîÇO£#6ãÙnÞwž?¸g&I0)¦@]ZO\=Bü}(v®ˆüóoÅeÐò Â1놘òPì$³æ”± ƒ‚-ðqÝÐ1`N0[q"¬Ê¯ˆüž¯Œ]‰_²uww#c×®]زe ®¿þzàøãããX^^vý€ë¯¿<ò&üïîîfùZ·ãããUùmÍÆÛÿŠU×ۿʪOÉ+èØ¢ðý¶fãådk´8~{HÇ-Ž—“î¬õö¿‚DŠé÷Ûš]•¿¯¯¯°ÙÙÙ‰ŽŽ LOOs]__ÆÆÆH$pôèQŒ†1×®]ËÑ:::¸0N’$ӯȿ۶ñîârSˆ ÷'·®Søþݶh¡€|8Œ·è:òá0¢…H¤ûn!ÀŠéÐþÝvõòk±0"Åör砊ȦMÈŸP¾uƒ_èÞÞ¼í ~¡ “ßZ`Õ¿iî,}ŒDBÐbáªü‰D‚ÏQE$I¸u‚p?Fn¼x}{ëŸDŠ#7Þˆ\Äÿ¼'I’xÐY–]+#×zN+ŠÂl?`Âÿ³<_†gž¹’tWñÓ+>¿Àí°í{›î‡Å>á9ýR.þ€Ù×qÉŸAOAÂ%?|=ÎnÏé—ºîõzø¨?Õ_êWu®ý©¬„ÄýÏ »Ä>)Ø ŽûåH¤µ1 =ã ³¯ã†>ƒdA >u ŠÇ›Ù &æ'A?ô$—Ð`åîN<ƒOPŒ9Í+‡oÚjÍå™<‘Ä=‡ïAæ‚ î9|’'ÜŽ€ÆËÔ5*â¯Çë®sEQœo›¦+øˆDÜŸ–$$žyÙâgÚ³2ñ€N°à^sEQ-ÌxOçõ„žâõ¦ëÞSpóÒ±âõ_­^Ö´]€î¡¼ƒ± sñ?ÀÆ7$~ˆd¶€?t=ÀÐ ¨Z,Ü·¢(Î…7±qÃÛöç¸øþu$‰Ç¾òyœþé÷ñØW>q_÷·íÏá¢ÑÊ+d5Jƒæ8$þ€U÷Ixæïž”cŸ«îs_:Vt¢vàè§ü¯Ö{A°ã]yŒpõޏáž{ÌdpÃ=÷àê;\i½`xjçΖë@Q.¾_^^v9˜oÛ¶ ªªbxxªªbÛ¶m®s=ÊÇ<­Ø‚ÈѽP(¸‚2áž{îA&“Á=÷ÜS˜iyyk×®E<^ÿýïÇOŽÎÞòg2ŒÃ0 Œ#“ɸÎ]ZZBgg'TUm‰ÿÊ+¯ÀDøâ»(Ã0°gÏ<ûì³Ø³gOY`¦“'ObÕªU¸òÊ+ëæ?uêç?~¼ì7_$äµXÙêïëׯçù\»v­+ý®ˆ3: …û‡'Ë~ËrOM~Yî)‰ÿÕIw0ú]÷y¹÷³ñÒÞÐóe¿{<öc?þYæâÿÜûW0ú]‡‡ ~ŽySFùoùî¾Î·üÂ1jW¤”ÀÒ:<„JX8µ€»7²×~§»Ò€n¹»&¿x Kiݽq §*òhtï|YÝtÚ·p¨~‚Ñö0::Š[×)øPˆ½—xàþ$ÿHÿÓ±Í<óý~{íÜÏq¶ë½§7×ߘÂwÜ'NàĉØ<„øûúúpÍ5×ðÿï¸ã\cëï@ülŸ…BÏuÄòÇãq ŒŒŒp»ŒmÛ¡K22Î\Øcøow½ñŸØ¾ÞŒõßJùW @€Å™y ´gÙéiûä'?ÉmÖd_>yðnäBvǕ΃˜D"ÚÚa÷h%/+ÍíÇC¿_xÍÆ ¯ÙÜοÒy Ÿ«Òþ»Zò¹ò¶ízÇÅ`|‹ÇãÍùÀi6h«voé½t2[@vIBv‰-FÔ ¿õè§@[= W€Ù¥{’KÜ )þ¹9Xssx>¾WEîÄÅCåÁm×Üy'ìâ´ø©;ñÔÎ9™œÌàªLO7Yÿù¸Úêùžìm/¼Ö\ù@aÿþýÏQU• ¶7;;Ûp_|f"ät$WA;`ñ­(ÀE£.*%¾Ù“ååoDüO~¿Z, }q‘‹ÿY0o&þ7t¶H”ˆJâÿå§™«ùæ7^iªo¢~åænƧ?ýinw©´%!öq~âÿË/ßÝvÿ#Ñ0 ùŒ.ÆYÿÄòû‰ÿ¿úÞïóï @€àM„·ˆ?Eq¢«Mæø-ˆÏÈÉ?»ä#([e‘V»˜xD×§ Wb6M3äu¨&@¤<ÌáÅXdFÎTVªÈO+’‰+‘EW›È£ùUPËÄÿ'6«Ã>ï³È.}¯b^dYæâP§` GCyë¬P( ££ƒ¯jŸ]BE~2\¶º žx9ŠÎÇäp_Ÿ ºT —ŠÊ¼IØ<00€©©©ªü»víÂÌÌ þþïÿ HEå¦ó@œÙŠc:Ø'­¾GNÇ´ŸŽOÇX[¯e#y0&JÖE˲ ÅÂ.QèÓñ87¶‹hfå1¶¢Ìö]–eGíŠ 5Î[pñ~#‚«Ôž6t\¥F°F‹ãÏ"*þ­h¦ýà ."œSÚº½Øyú’Œìz  eñ¿ŸP~A7ÐQy„守Š9­›®¸Vû£ÕYæúŒ²¶m‡>*¸lpO865‰®’\«ý0'sæÜ~(v6f_/;ö¦˜8‡ÕE݆XY–}E}$&Pרü»¶ZƒrQí§ïxg½¬ÕA÷T½÷Ÿ{«e±ÀõFf&Á-3ºç‘ŒšˆD vE¾-G²çÓGÑã'‹«ž¯SMEyÕ Ä¾»··Ê„N½½½+¾Ò ‰Ò~ &æVuäÇpáUy!‡ÂFò~.êCì{E¼hœÆ_¨â/Ô ùwÀ-<÷¿hœnˆW|î¥g ·=yÅ&08<`¢¬ß¯T‚mÛ!)#;¯Z°'`à®7€»Žá»÷¾•;ŠÊ²ìl×_w ¿tÀƒ“ˆy÷o×јaƒ°m;ôÀý,ê¶·oöÖƒeYøÂöAÀ÷'[ó—ožçŽ/P¹þ)ßÍF†ÀÇ·4&¦±®˜q¿ßêoõÂï9 I’“ŽÙˆDêj‹‘È@Y5rÊ™-3ë,•óÎÇø*À³Æ1xŸ½>Š¢8§)¼mgÿ [quTã¢øh2Ë^À ÿŸN¤ Œ¥Û6îñëÿwùÛÑÿ1h”?÷Dø]ã⼬î{¬Þ ¶m‡6oÞì<ñÄؼysÙ9b@ jób@Œh2ËbÐÿɨÉç¤^.šë‘ÈjQį®N°ºÍå¬ )2, Øq÷FÜýøi¼Y ³€¢ÜkÉ‚|BæMÏ\]Œ#®tíÉ{]ŽRÄŸŽÙXWÔ¦¬S™ˆÿŠÈïüÅèííE8–+¶á‹¼ŽÁá! :뛲tç/†•}]è ¤Žâ9ýR<`z i°¹’—?‘Hp‘ÿÚµkñÈ#ð`½½½Ø²e ¿‡&ô_^^æÇã½Ø?ïÙ³Gu¥KÏm/¿ÄÿEÿÛÿ @ºXÿ[XùY† Û‡ðÛC:®ëR‘EJZ•düEþã_5KéÓµu’OùUUåb¯U«Vayy™;VöööbzzÚU¾îîn=zá0s8YXX(+gg'lÛv¥«ª* Ã(ãO âñÓïÞÞ^ܚ˕ҷ,¶‹®ãòH(x@‘ÿÁ£¦+w‡Ø.-•—?Öis‘ÿ¦kÉo-°`yƾuÖ•¾·ý¥ó¬¬Y>ÁÛß‘tÝq¥«/."»TÎ?00€w|b¸b#öŒjà\½½½÷÷W­ÿ]»vÁ²,ŒQù§ÙѲ,Œ$ßÉÞñÜìÒ ª¨ó?ãþ‹ÈŸmù²gÜýÂ÷Û|¥¯³ Íq®ˆüÞ%þ¯ÅÂ8ÆÏ;„KqÂ8†žByúµÊï P/?õ·tn6e"–nÜ9É4ÍPŠÃäÏõzóà ¤-¥©C_r ÿëáöÚ´|sܦi†rJÎÁËàóêzó`¼\rÊSרÈ9µƒ®úÁ  ^~1B'ÊϪ }Âü¾^^²ÐyóÑËп¸nN¿ûP‹…¡FT¨]—ø¿V^DÇH¿ùC-¼ñ¥»]Âÿz8iüùÚÇzqÑ(û-ýôûuÝû~e·{m„:™p_ÿ×ʇ³„:Kç˜)Jƒ}€7@½Üé:nŽDð.UÅS;wâ!]GRX%Ž—­Î1+sɽ ÀÇGÍâ†np ÿëáóKcfÑÝÝÝpù—–J=@gggÅü׃p8ìþ×ÃòäIþ}ÕªUϯQ¸¿e [AÛÒ˜­]Nfטq#™-¸ößqÇ8pà€KüßOÀ„û³i\ÿƒ€èß\ëâ§ýü͵ì\¯ø¿ ì =¹¹õ úÃaXŽhOÖ'¯vñ‹ûWÝ܃éBÁ%þo†¨`AŒd“#†D‡‡]ü´x˜ øýœÓ›Áä¸ÛvFA¢É¬‹¿´_j+?ì>z Šû³K¼ûZÕ§,Ë|2bš°ò6vî·®SZ²?(Šâ²&±Ò3¢ø›'xí¿ôþ[ ›øµ"xägLò±} ë—(èÛ5×\ÃíJ$¡sZE%Ûg<çAW¨ü@ñ=¡6‡d²Çe7Éßò><×[ÀÀoÞƒì–rñÿ›µþ-?hÚÖËì¿­Ú` @I’Ëbê^zéÏñâ‹?F>¯!míc-Îx<ÎWC¿á†ððÃógZKsò@ã^ŠÁ9Ù»7ïúÓ+“¯H\ 466¶b×Á›€†çûîko°k‘ë…×J<ï*r¿ðšý¯ûÁ‚tŠöý•ȃ×ߊÙÈï÷?¡ض涺¾ÔÞ½ðÛÍ[å—’%;PÁt'åÜí\ M6~ض’?ú#ÎOA&¾åï¿á ¼+ ?ú£æø{zJüBÎ5wÞ tàiý>¬¹óβÀ›t<È=î`…õòG3*ç§ FÛ©7è­4à]›y-þ©©)ÎO¾´âÂW"¼A'wïÞÍçSSS>gTÆùCNèÌÄI§cKiŽCAôÓ“xèåçxƒ¿ŠA’ÅtÎL„œó‡W_ð«œzƒˆÂ†nðÿËOŸ‡å§™¿ôÚ«ÜûÛÛ¶CR–'¨µ¿^_ƒVñûLãããø~…ÿ»¿{{[9Ôˆ cAG**ãÖâ­@þ94'.ìM!|[} ŒµýîËÇžoüýî˸c|Çþ!Ðþ @€ @€o&ð¢ø_¨( G¾m{öìÀŒ«…BÑdiŠD"Á°‡‹9©0‰)_ÁE=ÈŸP ÂíqHQNE!Џê;_ò'¸³y!Ž(þ`ÛÂßýÝG]uAÆÂéé馨·¦W€µ°°I’033ƒ­[·¢¿¿ÑdÉÈØ××Çý¦§§¹pÐÐ —h¼¸„oE°ºœF?‰lÛvñ‹åoGñ|½è"./ÿòò2¦§§133ƒ©©)är9ˆ U„c ²)!Á¿º‚cº3—3 P[„Y ‘ÕëHüŠDàõÔ§{°’¼’aÔo?q²òOâ¿`ÿ÷g#û0Y<¾5!4¡’0í–? |ø ~"Ç-ËjëË/I’œb $Qrî€M׺£²zÿé(ÀÓñ8®-¶[¨Yý9¥¾µÔÿÜŠ|üå+ÁXнm»‡£Él]†qꋘp.¯AF]Ç‹âÿÜ;›ø!m)HÉ& bµG$ OFM¤²­E D\ßýž´ñÑUÿÔ®²)4ýì¡¶¾-Í©i57€½¥ýì¡Ò}F‚{UU±uëÖºÅ(¢ø`«ÉzÅ ^Ç»Zí]ÿ{ñ[Ȳ¬²à õÖ‡®O!••¯`¼Ù€$ÔÄrQd‘瀽ø_xŠâÿX.Z–V-¸ŸˆýÞ‘#l…i¯c¾± »DèpR€ØoŽ!ËûME1¤±œ N6E8–Gö>ÜY:–4<Áûxêç‰_åÓÛÿ…oKóò7Úÿù=çÄU€ED"HcÊUÏ´"¸ß£ÕÕAÄ4Úƒ‰ïrlA+sþ [לü r¹[°}ûv.2îˆÍãîÇO㛹w?~±yÏvïG±´‚ó¢{¡äÃxn°€3“ßÊQ¾JŠmÛ!V‡¥qÄЉÿˆî\ÎÅO«¯Óµ¢:ùSQW¦™#¿8õÅÿ"ÿØØ˜ë^ùìg? <èœÈ?>>ÎÛÞòò2(òŽŽr!Ô÷¾÷=ž®(þwÕVrl¡üoÿ*û4S&riwù×hqüöŽ÷mŒà·‡t¬Ñâx9™qñ_˜êEÇ–pÀÄ+[â’*”ß0 Wù7^ºººóÔ?­>¿nÝ:×*ô"?ßßßïr Åÿ"Z’â„›ŠG|Û4ñy>Æ[tÿ‰à-ºŽ|8ŒhÁ}ý³²Œ[Á‚üT(™Ÿs mÛ¡ì’äà³¥†2ù=&¸JEn²ýõ§O ð`…tEñ¿È?55å ˜øë1DžF¶MNV‘·™úCao ‹O!ñçÀÐÿ÷l]âEQœçz ܱ‘ݳì~”$öœ!¡ }JÒeÂ1wÁ¶o˜æW (_©:&~6upxÂásQü/y£•î½üÞcáR@—aÇxº†X6®LWИ‚úMêGÉéÐËO«yÏ©D *¨§€æÅÿŠ¢8…û°xPÇ‚n ••0§±èC=É%_îžä?hMüO¨€½yHžHòÕ2d ‚Óû/½È)¹†Ç"ô¼'9/•.-ù·´$!UìòÂ÷¨i"_çXHQg>úGœ0ŽA,H˜ W¸*øóöÇPs+¨Ox®(ŠSØ›ÀDŸd;Åÿ¢è“ÆÞ¼” CÉZgREQœ“Íñ€S§ú}¾Â9|z9ÿu$é:æ¢Qàµõâm.Ägø¸õ/ÝÍ8nîqåCQÇLÖy&Þ'?¹WÝ'q'÷U÷ù_ñ Ò%h$þ¨ØÜaÖr:ör_½c_‰Œ¾¿KUqs1½›#<¤ëbϵpÕk¡(ŠsàÀ,//ãèÑ£ƾ}ûÛ¶móÍömÛø1âñÅ1TÀGGGQ(°¼¼ŒL&#Š|ùÅ€ˆâñ,€Uc÷¿¢(ÎöíÛ±¼¼Œ¥¥%†áZiÏŸVÞØ8§³“õÅwD ówuuáøñã8yò$ž}öY¾Ò9^{ù ÃàLjÇwttTå—$ÉÙ·oŸKðO6…ãÇcëÖ­tÿBNføJ—‹}À¡Ø8ª?€Å\©¨Œ-[¶ðwg”&Ø·o¶mÛÆí°’$9V¾ÓWðOûä(»¡ù›kYÀÛ¸…h’Íí^[øÉ/€K2ì·]‚õø_`å;!G—\üçý|{Qü÷þ»i)ÀæÛë“Wóú¢IV¿ù¸ÓˆfTäµbé|™ø?÷~…ï;ïç‹þó&^³}ÿ´„õÃÃÃ|µOzÿ–H$P(066Æí'é¼ÅlèÅ÷%êç&€ÃC0 f7‰&%ÿÇçc8ð;xp÷Æa|ó“ˆÁ7eYF4YZu‘žl.••*òß½q §pàw:>>Ãÿê®Ï”æ‡è<Öi#»$Õÿ øþ®W eY>q»†k7DN÷cii ½½½Hd2HDKÉÄ{{¹ý!•šF:Ýïkߥ•ã½ö_Ó4Cá¡ã•÷¢e¶CÓ4C’$9Þ<¥`rtŸŠ6Tjšàu•³EqR©iD"›x¹$!øí5×\€½—”$ û÷ïgï^Ý笈ísíÚµ\ðä °‰lâAdY†¦.ê4Òé0p×oËÒ³Ö+ågÐ@Áj¡ÒŠ…gCDðüÀðŸ;þFà'þ€ßý®½Â?/lÛeŠÁìÆÇÇ]âÿ³JâÿAüŸ,¬œø\̇Ÿø/Q ´¢Á€Êï‚ÏÄ`ç ^ñ«Â[ñ\1@¥cé:xƒP€¨Fó#+¨Åï `÷ÚrRKü¥`þó5‘ß, cóÑ–ø…`eرÃÍ/ €§vîÄÕ;v´Ä/¨t,ñ{ƒh«5$O$[âƒÔâ'ñ?½ë£@ßðSú-¨Åï pѨ†I¢#¹ ”&¸dûeÀ”p]ò5P&ðá'þ'ÜvÇî»kè"›J>ˆ”ïªóÉ“XV ò"OÄÛÈdV.‹2§ñßÃÃø4®ñï—_¾»-<¢OÙ D¿îd¶Ð6ÛF I’óá/î㿇‡‡qÝ{¾Æ¿õ½ß9«ù  @€ @€T‡+4#‰ÿE9ZdYÆèè(wt!'l ¸êEÑ1œ”^a_5ð<›ŠBË+ÜqEoxùEgc¯ø_L×ËS-´"d {Š[(n.÷ IDAT O>ù¤+/ËËËÜB4Èø<•몋ññqìÞ½O<ñvïÞÝ»wc||‰D¹\SSS˜™™ÁôôtY]ˆB82ÀyEôí9¼xùÛï*È«¿ééi¾2£—yy ˜™™A6›å­¿¼dSQö¦K+p†Jÿù­Pæ üVS¯’$9bûW!˦¢¸6ÇÖoñx×Ó~ºÕˆ -F^‹A‹…aÍk°æµ†ëîÉXZÁPr*ü7ŸÀ ?À$ EÌÍÖ»Ô'¥¢2®È1õO~q•ë˜+rá–_>VªûÂÞ´¼‚¡ÌÞÕtÃ%þ'~½¼Þ}†n •Y± ­j×áþwç/†iš¡X:ðmiîÀ.¢Ò½*Iw€˜³'‰> {SȽ3çZYЕÙxÙàâº_Z¹îâ}—¶è(9÷üÄÿ…½)&LŒÙ_Vö¦*:øÁ{í&Æ‡Ê íú¿„04ºÖɨ‰B¡À’ésii …BɨéËå­÷FÅÿQüOèkCÞð”ïJùPÅ™™™©(þ‡Ãèêê—¾ô%tuu!ó¶*ŽGªÕà®{Y–á—n#íR’$‡^Š ±~0Å‹FIñîïç}ëúäÕxÑ8ÍÅÿâ=Õ,h²;î¸@¹àýŽ;î€eY¥ñ—ÐﲩhÕö_©ÿɦ¢¼ÿ¡gÀë÷•Žñ ÿ&þŸíõí¹âsÎ[¹\²,#™ìÁ·v±çÔõ7–ú!º–õpñ HÂsgݘ˜Èëì±îGJÍúo´ÿó«ÅÂȦ¢ÈŸP\ca¯¸ÎXt‹ÿ›©ûjÏñ>¤g0žÅWäÂû¥f Šÿù¾ÎòçØ¬qŒ þÚõ ØØç¢ƒ?æ¢~Ây?_Äy?_äÂ+QüÑÁÃ;~m‘È&Ƈ ëS°,«fÿ¾-ÞÞ^hy¥¡þ‚ Pð˲0¡°J÷ ÿ'”Rûò«gïÓï~-ضÚ¼y3žx≢@Ɔ•·‹ÎwVÙ½0aG^³¹Õ£Úx¼€ÿ>3ù}œ™ü>$i ,Ë®]»\s “k\Ÿ»ci©Ÿðbd=O§Tåâ‘_\Ñcb‚m³¯ûò“øD x@ü…½)>î«%þùIXßûÞ÷ð½ï}ÃÃþü$‚£O‘ÿÀÜfPKü/òKBù_ù[¶IIÉ—?Ût}Šüÿwa×u©<‚Ÿø_äWôX\\Äââ"fgg}ùi…q¥âß³gŒXKü/ò§qÉO¶}Zò/ÿUEÞUÂ*8ÄÿØ¿ˆË‹‚ÉZâ‘?»Tâüì?;ÁV·m¡ýÕÿ‹üSSSú‡~øÃŽŽ¿Ž¨k©þŽ?üaCÿ¨Kü_ 羕'!“÷Ó rм½®ôŸÓ/\ù=ë_™^ÇçzLÌ_?wþb\™^ç & òøAOˆc‰ü áQ^‹ŸÎ¡4Ziš¡´¥`cöuÜZw6f_oJü_ b°¿ZÜ=É¥–ÅÿÓ4C¹wæ<‘tÝ«§ Ð|] P â³~©¸åyEqÍëá÷hb ÍZ¼iK©h/¨<ðZÑ~fè·¥ùÜ_ÓÖu Šö¢Vì°¯}¬·!Î ÇÒXusJEç¿mõÀŒ®@[Å JZáóq ^+Š®@Ñ8K¥`µð‚ðü}H×ñ®#Ë!Ëá]j©þꩃë¾þu„ûûñ®ãæH„Ÿÿ‚Ñ|0X °[o轈øþ¤Ð3­^~š‹ùn–Ÿ¡ U…üuóŸÇƉ†àðÿ rTò-ÿøøx™2›Šò¹7½ˆ¥.þ¹Dܽ‘#üNÇ©ÉÛBWWWÛ TB:_ªã'Ÿ|\m‘Äÿù|ž;‰4[ÿ^ˆÂ·Xš9{Ad>A‹…›2‚yÅm~ŽÈ^<_ôÞ÷€“›we×Z˜Ÿ€¡Üè°ò+¹r!ÕÓ†%g1g;À%†l$§¼ˆ‘dEx_F5‹ju°¾FË—_þÓTþzÚ½$IÎXÑçØÔ$ööâr#„tÞâõW«ü³‚Þ4Íiš!ñºL¬SI”PVO×§xÙsïÌ!÷Îò>œ„ÿô=’Q³é ”j³¢c¿ôÀº>%¬V]¹ŒÕ01>„‰ñ!$£&bé<t˜¦ºuãòŠŸo]§К+¿W„) ýœ†SY©ŒKQØJ>ô}ff¦añ¿$IÎnÁ¹àâV üyÜd>LÓ  ÌÎ΢{U³³³(XtcÀÆÒy˜‘’òÚ¯>Ì»VãCˆDX Ÿt«Õ…$¹€CµQ]ã¢XŽ  :Ðͨ®ÿÝëÌy9tÞª˜gضÍïwo¿O¨üöàÕ¸…ïÞûVDò[L|ä¸úÊÀž£JyøKU×3`r|ÙT´-A`T¬Ðÿü,/lt•ñÕ¸Û>P÷3Y¼æâøÃ­Ô¿˜G¯ø^ þ”Äu^ˆb= ôüi´îk=bé<¯ãJÏ\¿~©^~9WpäQæ`A á;Ÿ4¦ Þ ^1Õ™ÇÃÅÿ4þkeÌKã€9˜x»”¬’¨§··6l@o/}5ÚÿÑs§Ò‹zÒrѳR=· ºGßóÊ{aåmÈQ‰m²ŒtÌn8 Fao y-VÇõ(•C’îBGl§µ—°¹ðÌÌ þ”¿ï;­½ŒãÙn—sÎÝŸÆ7?r!^Nýå+eéVÃV”ÄŽ©¬[øBüé¼Å÷åµ’Ù‚‹Ÿ‚oP =oºÕ ŠÌÆÆÆ0>>ÎW²%þ‘‘¾oß¾}vñ“0`Ïž=|.&¦[B5IY k´8bóš‹ÿt:Ç÷Åæ5¼œÌ¸ø{HÇû6FÝ›‚Bcõ:›§(23 ‰D‚;˜ÿ®]»ø¾ññqŒ¹ø)h"­àëM·D‘mZ’‡¹ãñÇ,‹ï{:G´à¾þoÑuü{$‚ƒ½½<ˆ‡˜n5ˆÎ>Ù¥ÖÛ=¼ND• ƒ |Gú¿ðÑURËõOâ^ˆšµÇŠ¢8óÑ?â„q :€d¡ñº§¼Òx0%›.ÛH%˜¦¢ñm:oAüÞÊ}˜Ìê¶*Šâœ|ho۟ÙǃÓ?ý~Ù1Üûü1 ~÷–Å4Í ý]ø½Ù²Óu @fĬ8~ñ®#ÕÛË…ÿͶ=nËåx0ñ{µûSQçÀX^^ÆÑ£G]AfÉÃðð0ŸŸŽŽ6dƒ§±Ãòò22BŸFø3™ ·É÷öÖÿ+Šâlß¾ ; Ÿ  õð†Áçå^TÅéêêÂñãÇqòäI<ûì³Mñ?ûì³<@GGGÝübqžåµe“ÍG„x /ŠÿkAŽ.A~G²ÜþG—Êlo\ ¸D‹…ùù²ÜÃҌ։C @b}ÑKƒ`ÄÀt¾(þ¯…h²8Ï{GѤ„hRªX~¯ðG,?ÿM+Ñ5÷ƒ„úÞt¼üÞùf5~J³YP€8Õ3ŒÎk±ºÄÿÕ(ŠâÌÍY˜›³ð‰Û5hÚDá·®/"îçÇS»¦þPIøNý™ªª¾`Åù$ßpÑO__ŸKtJçˆÿð=Æ‹JÿwIƒX°'ù”L¢ˆIùÉOòï¢ØJA|û‰ÿµb[]ñŒá7XIˆï%Cfy0ø³ ÿ‹ŸÙ+ÁÙ._«F ÎÃIôï·…Ä@Íò‹ï/Hôo{‚¿U‚ Yþ.aNI¢þׂ Yþw ¦knÖܞ±?_¾ï>¼|[âi½´JÄS;w"nÎ’pì¿–Þ_’蟄ÿµ Ž¡›åß‘蟄ÿ°ÿþŠçŠcˆF8Ïrx_ûö”ö“蟄ÿ•ààOFõ×¶m‡’Ù‚Kä¯/.òß^ñ¿ ÝàçˆçÖI* þOÞÉÆÖÞ²C`éÑÿT¯´Ÿ@çQzugÂ'O’$9ÊœÚ*áŸ_Þ,MU¨]î‹°:V»"<@£¾½€Êÿá/îm• Õ÷ž;@€ @€pöðñÇàðŒ‹FMÓ ÑËúùùytww#ãÛßþ6V¯^ÍÛèØ<‹&B(®zÄfXzlY/ÀJÂs1Æ"{QšŒšˆDL¹– âùB’$Ç>ï³¥«×3Ñÿ‰#ì{ñ·,˘€²ï  ¬ª&›ôG­UãiY–A¢J Yá˜â»úw# sýÚ^Þ®®.ÌÎκ¢£Eè—ÁªøµrÂUÅYXXp¿}ûvìÚµ 3330 cccÜÁ¨UÇÊ ‰-Ë‚mÛ!EQ%M‰×ô&®ú¥¡¼ ›Š"šÌ:µ¢ RýQ=ˆ×€òõ¼®ãòHoññB£ãÒy8È Ê¹â÷zœÓ™€Žø[¬—§ W©¬ž6tx#nºþŠ¢8Šé;õ#Ñd¶m‡dYvÎL¾óßêëÙ LÓ E“YG‹1Á’·îV–Ýà/e<ý$³–£¡xå«{>Û¶JË;fÛøÐÔ$>ºŠ½p£­Ó±²,;³Æ1ô©—UÀNy©ÇømšfHîN:‰D¸è`ØhyÆË_Uë—&\KcªeU¸W#–ø}°ûzjyâõÑòŠ»Ý»“uGf7M3¤åß¶_ ¿,]tÔtÒ`ÂÈZ×Þ Û’S–eG\iG„—+‰)v}Š—¤ñ£X^^f+ŸeVòašfH’$ghxÀ"&0c÷ŸâÿWª€Ðò ¨ïɦ¢Ðõ) O •MÖ¬ ?4—\ì‡_4Nã@ê1lI_ ¸(¢"šÌÖlÈS•ú] $nó-{¥~p ·½`«_oqaNußÅz\’q¯ô+Keÿ¥|¨˜â/…FìóZ¬X‡yÞµc…„¥¥%tvvúÖÝ7ýýa\c ©Ô4þ»± g&@’¶ÔäÇ Þñ³ÄVÇW} T«ÿzúŸjmÏ› îUvÅ<¤Ðø8¸Ús Rû¡gð™É7ÅÝ/µo‡:Ý¿Oà›b!å$Þ4û ˆ/V/:øcÀéü¥ëþW:¯H’äȲ̟¥±tž;›SL–ååå²`j‰D²,ò,>|¹\޽êíÿHÈŸÊ–V\[Á÷מc)zÖZVZ,ÌÄÀù´‹‡žÝõ>‡$Ir¬<+ìää ]@"c[8çó>nO,þóß\˜âÿ<¦¾I’¶ð}±y¼Yo~äB¤ÁÆ$[·n->ÏÞ»Sÿ„ “kÊVæø ýîFé<6S¨Þˆcöulìç¾ä=ü[‘M±þÙËÏçÅó¶â2ÌàO·¿(vǺuë¸ó•—Ïž=ضm[?Ùè×;Û¶CÃÃÃKj$þ÷ò' _þD"ášÛ¶Êd2|.×(HüïåÇã¾ü´¸Èo†ÓÙÙÙ?‰ÿ½üªªúò«ªÊÿÄÿì³Ï:$ЪüSýyÇk¢~cöuh±Ë11Éæ·©è&lÌZå‹ù±@§N*K‹”ጎpì¬b`«Éñ |–Æ`Æ‚Îl¯Æ-Üòá§ùÜû’Œ Y–]|²?ºÁá!l>_ð£ßwä äÖ+èý'6Úz8r9ò·¼â;ˆfTäãþB½ˆfŠö`!ØI8ŒèO~ëÿS@€2B,­ÀšOÕ,ÿØØÒXoll ²,óóÄë&ÎùÔÏM‡‡à‹.œZÀ݇ñÍCãžsK˜g+,¦²Ò1‘H)@*+ÕÅ÷Æa,œr¿ÃjºÎÚ`$2€H¤´¯^ñ¿;­ÅbZ̰tð°ÎEßèᇮ|‰äKÎñâœ_UÕºlÑÕò@¶¯jy0M3”N÷;pý).`¯œ HüOϲ‘‘‘Šýéìì,·/=pÒë¢ û·lÛ1n†ŠS’ì–ËðjÜâ6PHþvØ7[ýû¡Zù)€Ÿ¥G~VÚŸLöT´ÿ‘èpÛè½v__fgg¹ `é*í÷Úºéw"‘À“O>‰ÙÙY×{`ý@òDÉþFâ~mµ†ä‰¤‹'9’ôÝ_>laÁžDIÿOy‹a 4vOÙ6Ò’TÆSi%þGOÚø©¤%ÉÅO¢vlÉGâ~`‹‡gK…ý•ù;bóXšº’´ÅÅoóÆL¦T~÷Çã62™òrVÚ_‰_Ó.€aC&ã.¿Ø7g—Jü$îuÚÈ.ýÿì½tG/ú™˜ÄÙâj„¼È3‚MËÆÖ´ƬCì‘ó̲kxшç]Þµ¥(7¼pÞYeÝ=8÷®˜‰öpà†E‘äKÎc_’ÍŒó³NL¤±ƒCLž‘X´ÎÍX¬I‚»ÛÄœàôû£ú[]]ÓÝÓóC{ï|ÎÑÑtuU}»úGuuÕ÷óùVÛñK÷³Oßéù·}"ýp ¹ùG?…ó|«ÊŽ_ºŸýd6‹ïú)Ø#ßrûAHÓÙLÝ#r¿™4ÁòÕíôK÷³oN™À,ÀòÊý'[eÁ+;Æãq!*ÛñK÷³OcäR©ä²O¤Ø" ß¹ÿ@ÌÄ–²»[FG=Ӄ쟸 ϱ¥ìn?‘þ ÷§ÿ!rÿÀ¹,roQû™”Ozpÿ·ø…·!ÇRÊóïÌPÊ¢›Dîç"w(vîðI¯õüÿ|n®¹uHmËLLLà=ï‰ThBr3`ŒY"Úùðð°xG #Ì·N«°.ÿ*&&&ðÁƒwØ¿À¯ÆkÏw6 ú®&ñ׉‰ ”Ëeñû±ÇßÍK~0ê±õ™`³¬é{Ë·~ÓŒ¼“1ëç¿5=ÉÿŒubbb7ß|“ôûUñÜ.EÛåuu €xTx‰'6y]D^£">n>l6œðp-lI-ûÚ¦E:‰LÞ=éYÎKÀ¶h)ç{œ^W¿Lc"üÿâ) ã«qþC'±ü«qéÿsoÎÙ^«Éÿä –)d\éé„fû¢MÚÆ–f݉ÚO„ÿ9†Ï¼²ë4‘•ØS¯õë¸tŸk“ÿÛh£6Úh£6Úh£6Úhã÷oòÛá娱cÇ¡2¼{÷î*Åa( ¤šp˜©q=î+È ¥Õ-.øDICbgæÝÛ=Ò¾µø~•°E\Aþ§¶y¼–iÃ0°ì¿ü¾açþíÕÌü·¿ÀI÷äð$‹ùŸ&ŽÒà¤ÅtB³'P › —ñ=¨@Pê…ß}PÎsµ˜Í­¬]»ëÖ­ÀûÃ0„£ õcõôÅâté‚âFz‰ ©m¥€£££–×~¦iF´¯OÓ¸AoqNÜOÅât]‚Œ1‹ˆ©DÙ‚[Œ Zé}ü}v×Wâ½WçùÿsOœÇ*pñ#U %‘³…(*•}`ù¸ ñ9ôàªÄCˆ>†Je9+Wõ=ÑhÔ*?L|§ý]äçl!Šƒ‰_c]ÞÔƒtBÃæp0щ“Àº|ußGoàСCX³fš‘IQaì)›³ì뎱±1LLL`xxØÓþ.ï잚ğ­ãûGJ‚üÿÌÑðí¯¤+`©¾oŸ€åé>D3³¨¤+0u,åÝþûï¿:$b‘Ïé}Æ>}›I„êÖ¯_OdOûßÿüçð(*«u$ðö;IäMµ¿ÁÃþ×+$ «ä5 I_¯TpŸiâw_+ï¿tBC*_vÝ|¢z/Ê——ôüŸ}øÆ?Ô[uþwî܉‘‘Œ7=öàdÿ7G“—-I½aǪàB«ê­KuÂà@¶1Bk+AÄ V#쵪—Ôß*!",–Rü®·fñ‡cKsÝë…<>ƒ°¢£aêú—»îªËöR QR«Ð(©¿UxCí·šèB$}"–...zŠ6†Q%ò@DâòªS®÷ܹsÞbPÇ(·¼ËÏ¥¡½ÍíÔ}aê5€ñ}±÷d\óï¥bÉ% Û"ᶇÏWöýkENbT¾ŒäáSÈoìt•%çûäáSHmì„,|KäÿÙ÷òzï™Í% êNg`ûóh 7©¾Oøú@k/òúcü¯ìßdžà哸¹"ðNЀï£àþš°Ÿý·,Rä>ÿô½™þq™?ÍxÚ§zœ;Âm5 "~¦ó …lRÐñ :Ñ k‘ÿ+•J¤¿?&¾ß}×™w2 IÓD7œé~"`«óoiÓDæ}Wk‘ÑhÔ +»e‹fñ±%C̵OÍïw ®ü œ~‡}Ïy ¸Aóß2q\Ågw¢Xœƒ| ­‚,ôâ% ¬ægŒYA¨¿ç?AíW#ÌüŸLúWÓeMÓÄ:s­t»¼Ei×^{­ïýâGTJI¹D.h„ZéƒÈvd±ž º„dȤ5]¸Bjg­t»¼Ei¸…dȤ5]дCÂN­t»¼Eiݻλ„dȤ5]¯s­t»¼Eiñx§Kh@†LúWÓeÙN­t»¼Eiñ^ÿ5™ô¯¦Ë"²ZéÀù–Eiyýû\B2˜Q‘å™K@¶S+Ý.o‰´>¸„døõJ¥’K@¶S+Ý.oQZww·ïš•LúWÓe€§$;µÒíò¥]­O¹„dȤ5]Ф~¦V:äïÎeÑõ¥_º„dȤ5]д_KÏypº]Þ¢´î]ïw 4¾¶x/¾x%NF.Ø‹¼ò¼w«àõîºá†ðØc¹Þ3ôûôéÓ$J±$$tƘ%Ï{ ‹¹¸ááadc~%—ÃÃÃâ{xxxø¢|›F*ÀŠ{&&&°ãé›Åï›ÿ¿¥@€w^΀ËAsúœ÷.½Ë[yýcÖËŽ'áß$ý¦g±µ÷œiš‘ññq‹ž+"ÿ“áááÀ±\®‘c#O"úù_øK¤‚Ç–r¹FíoI-XDô'ò?Õ¥mzжïýþË5j_Kå,"úù_Øß²¥ºýé_.רýuyfÑŸÈÿTW"<ÿr¹Fíçr9‹ˆþDþ§º¦§§íËå±:{+{˜ úùÿt– ]®ÜXí)C.Geü “ÿIİT,ÒRù2’Ýœè¯÷zýýÈÿ‹Ç/NÀ: €#kF8éßpÒ#+A¥$ù…|œ=uø»•ãhŒ1‹æÚñ”“~þCÎÜÕkÿ''ü{Q´ä¿@ï´®®.dvï!4ôÎ Œ1«ëÚ/àÄBÁræ.·=dû@µ‰ÿm´ÑFm´ÑFm´ÑFm´ñ{7rÔYÇá…H+2©DÓ4ì¶'·*+A%á79j|¦Ë0 ä &ŽÁ!óèÔÎätÐ1PñºêÌZþ¿ãpÆŽPmÏuÅ{¹Ò*9'±×ï ‰vB æ¢Œ¦iøUC™™™ Ž_ÿú×…3¼º†™)®s•J%’Ê–&¶£Ñ¨e ÃpDP-€p‡!ŠbÚ,_½ÆÆÆKŽŠë@ÿo¿ývŒann{öìá‹®rÔ­‰ÈäD׋H¤ò–išÃ02˜¸ûÅ}èŽíDæŠÂ\/¶’Q0…Cœ×õX †–ã÷¿N!–‰"ŸN ¾^/"YX˜¦)ç˜Õ sYÆz>›)d„xcÜ Qn¿‹]b†!"þ”‡Jèϸ¯¿Œz'fMÓŒŒ„ ¨¦l‡÷õ¯Ë”'Ô{ÈEþo{î²4MÃdnÊéƒ èàùòÜÉ¡<Á‹_ë¹ Û¦Vá)7- âTýÎäÄÕ$ÒH}ÚïY'Š=4<‰ØMäÓÄã@,Y_ôeÙ«œJ‘ ÉÔËéŽDèØÊ¥ë>}ÉÿfŸ)xjH7`ÂD´ÈmE£Q+‡-LP¿zÐñ†DŽ;ÿ”+¢K®ÌL àKÕïóh{µ ú†a`„9ÏâvÑ8Ï¢¦iÂà0ð¦{ä€Z/ÈaK=œÜË{¼æD0Û÷ È¡‚øz]¼ÿIÜ¡t¤(D ¸áf[ã ¿{ÆÃš¦aj¨"ƒÃ‹ìÔB˜{*Ì;¸Ñw€¥øÉÉÏ¿eW·fè2JÛ#Ýà~”wh#ωPy]‡ Oü—¸àQN_¨÷ýÏ.Hd÷ ¦qð,çª( ¸÷Þ{1;ëx5V*Ï€±N}¯Ùþ/Ï<ÆùÈQFM'’ú§B__ŸëXƒ L4ÍŠ¯×Q,NCÛÌ5-Z— †,’£ë»|ßÉŸ{â<®8é\ “¹ «T*_ * YþŒF?†Ÿõ@NÃU8è6ï TS"¾ØÂ5ío.¼Fá´D¹*þà»ôò+|íÓ;ÈJ'NœÀŽ;8DêZöGGG1??žžž*gHŠÈî"ú_½Ž·ÿûGJ(Ø"(•DÑíf¢8=_ÁK=Ž኿ƒˆætœårY8•ÊÑFƒì9r„GDÌÇÉž@Dÿßé:Vƒ ¼%íçe¨RÁd´vûoFñø‰ 6•ËUAiþ¨ÆÛ.èþKtTP8SÛ~¦`Àxü“Ð6=XuÿézÈÃAç?ýïÿ„ÌÛ?QÓþŠ?ß‚ôa©ZÕùû¸0å8ÃËŽË/ ¼y@ü²£’Yjz#`ŒYä¸õ.ýßñ³âÛ=ó‘ˆvT¸–8óïþ= G¼U!÷½69­eȲÓñi}{•ðAÄËÆL¤<r4%Ƙp¾ìÝ cîIï ‹f’&ÒB+‚1Ç2žHøF;*½äÃÀ«ȱœ¥¦7jÿ>û›ðýpÄáTȯ¶¤i"oÏ ©¯!cÌ"çòŽx§ë—!_‘f®{cEç–EQTÈã½l2…^úß¾ê²yÉøƒõÛôáòïydªåýTutÍ&ÁÐV”;¿{A³·*cL8¿3¯Š4FxX꘲HårMÙ>tèëæç¹è¯,ˆ¤Bæ#±#5=,äˆvŒ1á/CTÈÇ500€\Ž?ÿ~Ç„ƒ±+cLD½j¿Ln"ŠšrI V®\éM pö¬ãàüîw¿Ï?ÿ¼¥¦Á‹°O()Ú‚ŽIAª§ñÞ'¨¢rçΫ²¡¢œïp‰þÉ‘¿Ê¶@áÂÔkØ'äwm,ÓE¾X¬ßþαßöïr¾Ã×>‰Býçb˸µçRäA¤ÿ„«<ísæÿ .â¿°áƒ|ºâßþçÒRΔ÷=¸våçøO.„ •=ÆçUƒò‘µì‘sG B%úÓ6¿çÂ?§¹ùo"Š×÷4ÍýËrGòÜëèðƒ¤ó†üO¶ŒÇ ™Ðþd¢°ÇÐìZÛ“ÇŠžë½Ö½ƒêh5äöþí—Qk^÷÷ñüû¡‘öŸ‡È%·[%`~ï{ßà&ù¥ËÛDþWÅ걿ìï–¨óK—·‰ü¯Š ÔcÿW·ÝH¢µÒåm"ÿ«bõØ¿í¶ëÁ˜›ä”.où_¨Çþ±c·`.’Pº¼MäUl ûGÿ·#“üƒÒåmz¨bõØÿÒǸIþAéò6‘ÿU±º®ÿÑÛÀÀ\$ÿ t×¶ýù¤Š Ôcÿ¡‡øû] òK—·i¬Š Ôcÿ»ùuV…ðüÒåm"ÿ«buÝÿÿ×2à-n’Pº¼MäUl ¾çÿÍösþ5„I—·‰üï'6à… ñãÀ”,þ~'€çžƒ¯Ðm= »¸á†B•Q¿-¨ŽV‡dNú=SjýŒ×1Ð÷°<ÇK¿Å÷ïRˆ Èn•~÷Õ.ÓÌuaŒY?ÿ­‰w^Î`twC³ûú<¤{jš,€ëü~@Ì{·zõc=F×U¬ïRß122"¾ i|èQ®îó.Ï}¡ 浪ìg“1A~¦÷«G¹†ìÓüóäÝ“È$¹¯©jÿ@¶[ÌA§í÷›G¹†ìŸà‚›?/•prà.¬ÎÝYeßÈàökíûü{”kÈ>Í}— d;²HIUÙ?š¼ ÿÀïÅw^ÎÛ_UÎê×þ®]»ð‘|_ùÊWh^«ÊþÀÀ€ðM¤ñ½G¹ºì_˜ŒX+S+=l xžÝÿp,‹ßŒ¦°2µ§³g¹@@j^Ÿ7ñ«'ìcäíWË­L¥ìzÏZˆ,×1¨ä¯ùjÚTýó ù. ƒˆÿaÀÏ£‰) ø»eãøë #°Ns!€ÅÅEŒt`|aÐ ¶I ÀZàùΞÇãùH@`„`üÄ8LärÁï%¹¿ëøŸ “Iÿ¿^KÿOâÍ6/~ùV{Öµzõ}niI¸}ûvìÝ»k×®Å׿þuüd¤¹ˆV|oËíÿÌ+ÜW@&ýÿìyÌÀoâ,Þõ›ß>_úãoà ÏÞ¶äïà6Úh£6Úh£6Úh£6Úh#o’7TÂt4µúûû…Š%-\•Ëe<ýôÓøÄ'¸C6‘®å ¯(´^݃×ã½TÔ™IšÖà'ݧŽ'bÚCA¼Þ( |RïîÄŽNþï°g{ÎÌ#}–_µoˆ ʆ©I~¾‡ÂG«1 øÛ¿åó_—?Ãíi¶ãïÄÄ„˜ˆ¼ýöÛðs‘ÌDÑßß/ð^QÓkÈûâœ,ªA¾­ àS=i”@v.:}ú4n¿ýv¬_¿ÞµØºgϯªê‚ ÚÕ™GTˆ™Ø¿ '&;±G« ¨qGÀ~Ã!¹ÊQc›>…X «n½?ŸŽEÄÈ ³³ Eú­š¦¡Ò§!:4~é¹³9EóûÅ}½ë9&zVË9†ÉÛÏ£ô$^”ÞûR›xtgÓ<…íß\ÀÇ ¼

…h4j%:*ˆ'¸Sçä$¿ºLN™(À¹Öö=céºãšÌpçÛzAu×–×tÞoÿŸœòt¼Kš& öûƒ_Ãh¨ã 'ï¹ÃÖ­¦gDž5F‘¨TÐmGVÒ0ñ~ß6MŒâÄ'ù˜€ÈÙ†a@©·e š¦!ßW@|ˆ?‡ÓïÀ ¥óHÎ&°TÊ̸þúëñ"€ýûE¤æ;v´ì¹s~4MÃh¥‚¿5ñ›{ÏWð”| l²ûïľg€ó÷¢t¤ˆÏÜñiäsÜñN%g7‚x<ŽÍ›7cìQ``` èîî¶ ÆaNÆ7уÏì{0ý¾çÇ?ÜF"pËèOÉýÚÙ[MX ÀÙnÑ[ßïúAÓ4$:*4Q*9ý`¼"º9E±W#Ø·œ\þ ¶sû~x Þ4|ì+DZï‡×Àœz ÑèÕ–a´NŒ€@Ä" ˜ìÄÁįqZO¢49Œýü““ÆRÀ0 à‘oqá‹ÿû¿#6Îη¨~Ó4‘žaHçÉIŽaëVàÆoô-ó|úŽMZè7¢v_p‡8Þ0ý_¥R‰d Q Àø»'¨¯Vßï^‘½ÇÆÆ°{÷n|âŸE,²Yë|T*•H즌•͢R©DLÅÉ8¬ †®ïĵ|æc1¬ð:€Lâw¥òEä4¨‰ožD‡›„ @D=|kNÃùìK¸óÃËñ¹'ÎcU¶ `Â[Ð\×À0 _â }ãrQ„²¯%T¢5CÜ9†;Œ°*û7zG`Û¹s'NzдpíïééÁþýû]d±ë¯¿œ»mÛ¶*ûë6ÿ># ZØígy„lÿ%= ɃY\½NÇ3G‹(`–“ÿ¼>o‚õT·Ÿ„¸Dc1îôR*•B·zz®èõDórL4 öå/;']ú=Táí§qWû›V0Àït‹ ÌÎ òÿãgMlbÕí÷»ÿÜ~~¡ŽûoÓƒU÷ßàg×d-©…Ðç¿¿Ÿß©é@ ùü¥6jUç4õ6L½Œa £££ãeƒ¶Óz®ÚQxÙà¥â7&ø‹ºf¿˜/,Þ¥ÿ»øý³âÛ}IÑK]Òõ+ýEW–§õíâ÷Êâ^i¼ú,ÿöLç¬Ú×»Á9sO]Äÿ‹…x™›+ 5 þƒÿK„ß©…÷K¿‚ÚÿÛÿÃÌnsQ©TùÕª}q'òô™Ò)´žZ²ÀeéH±æwÞà0¿§Ôo ¯ýÍçøˆœ¿ýˆã]~ù÷f]Äÿ‹ ‡|,®Šu-%Þ)Íñþ¼Trÿ[ ¯xA&v/..Ö$øÕå"}3» “|-¦ÁŸêªçùß¼y3ïȨjûkü©.?á/PŸþùª}+W:§§OŸ®Ið§ºüÈ÷¦iF¶mÛfíß¿? ŸMÆ„Èm¦` ­ñ±_©}$Ò¿j{Û¶m®o%Ó4#ZbÁ2 ÝA­©õ‚û>g¬ÈÙóD(”ò¸ óŽ9‘ŸµÄB•}ö¡^ë’Ì9ýyÇ©YŽdODþÔ™”°Ÿ°íÓ¾R±$úC/âÿëê­²ŸHq¡¡|šŸÓ¸ºdvlHÚ`ž" ržrÞ]V¾J4FÓ4#ßÙœ·þò`Ò!è¿HÿØ9‡Dà'p‡w·}9ZV&þgsý"äòú¥É9“4‘Hå]óô­—%íoíÉh}}}èêêB,ÃØ£üYž˜ˆ‰>hrvVˆ&3Q!Ôüð&Ê0 C´³TâcÐLÒ´×nf(ÈB(~_2‡wƘEßã0fkBʇd?è¸þ#œ‘"Ç-#‹ad„ß]]]ؽ{wCó°õ\3•ä_+ ¯i¨ö걯’ük¥dâ3öU’­t‚LüoƾJò¯•N‰ÿÍØWIþµÒ 2ñ¿û*É¿V:A^'mƾJò¯•N‰ÿM]ÿ¤w;ýÒ 2ñ¿û*É¿V:AK7c_%ù×J'ÈÄÿ¦îÿsÞýŒ_:A&þ7÷ü­®t‚Lü¯eÆ[óóó¸òÊEú‹/^‰_ô.óÜsWxÖQ/ဈb¿°°àú¾"´îîn0ÆéTýn‘ßE333  o†:׬•W…„ƒ ~ ·êTXQ¾þK¿üÅ©.Z7#ègÿ>Óäù7ÀßÙ&רÉ.‰ßÃ=Þ á ªG&ñèÙP×Qäõ¦zÊÙ—Iü³ÏB£\?½·W£ë)d_&ñhü­ŠÌ®×ãb>ºžrAöOÜ…ãÅ{°Jç*Ç‹÷ßÃ?¹óNW=ïˆCˆ ´k®Á­€\.ȾLâ'Ð87…”«žSÿ©SˆÔS.È>ù>å+_éôž/•J®zäþ¸žr*¬"¬×K¨äÿ‡È÷Sdú•©H®ø0„@­r^"„R±TEðÂâñKp~…]z…kŒ™MÆ_¨žó«uî‰À¿Yl½ú|,‡÷0!°’å\ã'8~ºH–ypöìYXBÅ=ðêgOž¼°ú÷‰´å?à‚~¤W¹Õ÷ùæ©‹‹‹.€÷wýýý˜žžnI_«¦}áÙÛp"¿À+\ Y øXô,×Fm´ÑFm´ÑFm´ÑFm¼ax“š G72 ½½œâ+“ÿc±˜P³ ò¨"*‚"@é* ;Ò•D'2z2S°€Š œéiÉAä€ àYÏlœxaÂ(˜ìEÜö–NÚ„MÓÄ¡LÓŒŒ '“G,à£öÙ, Å~ô#üzŒŽŽ¢œ¯ Trn²6ñ=ÐÄ9l”F‚LYp»JüOv›bºp¦±h ~÷#ax:}âŸÀu×]À™üOfö¸êmæxÙ>›ŒapxÚætðÉæŽx'¶‚/€-ñMF4µòš†ÕR8¾ßé:Vé:NÞsÏE±_éÓpM\Ç+öbÛ“F²ßqln†lȳb&æÄãÿBP ½—/¬ô–€r®û~ÈÛú±>ìýL7 ¶ôíO%8ÙŸ¢önÐÑ»AÇäÝ“0 &¢Å5>Œý´VáŽòv$ÄÓúvÄu`fr†Ñ:â#cÌ¢E#‡èÀ\Ï=õÁäüÅó1‹Ó à DÖsˆäüHÇ Û¾X0 Ÿåçå'ë¬èz7Cþ ê ’o¼·:òæä04È\ŠÔ™Hå¡iÞQ«›‘>(úãØ£‹‘¾0Aθ v”Zþ̆?¦iFÈQ¶c-šªä9 å·ÁI&8d„³·š`÷ð…NµÞºîƒh4jåû ¸*¾/߸Rÿ®Ô< ¶G+®‘i׬YãŠÔÜÕÕ…C‡-y¿¯Ëh¥‚D€›ùܽœ E¼órÓÇ™àÂÔ<‚¢QÕ²‹ÅÐÝÝ]u<.ã]½ ùœ4´lЀ9uŒm u¨×,Z™‚!úóŸ¬p"L° ¸hç_ˆ‚ô:}‚®Û!SîãZ’wlÿæö~¦ËlžÂ¾^ƒ}ð8öáT¦xúFúAù™'DºÝ‘GUÂQirñ¡]@¦àùü×Û6y šNhÈàú®9å’(s¥ìIGŠ—ðU£â ÔWÑ1“9wíÑ*èˆwVE‚>6iaíPÄÖazÀ®ë묻ÿÓõ]0†uh›S5ûÚZ¨T*‘ÑÑQ+‹a÷îÝX¹r%n¸áÌÎÎÖÝ'ÆãSÈÇdÆ[hƒÕJ% ŸæUQ¸bqÚŽŒè0Øháûg}e;ò·SØùÏØF!rCü[¨‚˜DB&ÿÎóÙ—ðÕ/Ç]_=ŠU…›¸ˆÀÔ<€"'/8"(Bì*_Áä$p#:ñ(N¹þ¯Ë¿Z—}"_Q)•¨àÄ$¯ohÈí–í>|÷Þ{¯ˆ0+ÿ®Ë>‘ÿ:„ÑÑQìܹ‡B¹\Ƨ?ýiOû§Wð«/xž~°«Ë>‘ÿwOMâ|f–‹ü3¯ïŠ/ÁÓ~?æææ„ƒ¥üff¦.ûD>?xð vïÞX,†ÅÅEœ>}ZÌ•¨ö÷ž¨àËyÞäÿp»=® cŸÈÿ/Ýs’†¡Jÿf×Gó U÷ßÞ­üô¤pb“ÿ§òå¦î¿DGSwAqnS÷X¨²ŸÞWƈÁc/÷tâåݧð=ƘŸhôüLüsOaäJ`üz Àh Ñ…©×\DuŸ7Ûÿý….L½&w9MAî÷‡}±„T¾­<w±°Òþî%i¼UBsO]DuŸŒõöüÔÅ()ã¹ø*{ž/@@-Ó ~¢l“@\Ðg¸ZÆgJ§\DuŸ ºBo„€*p(ϵ†-ã…Ë¿7ë"ú«ûd,ûðûࢠÐ8\lÛ7ÀÅø¹BHÿs{޽ÕBD(ôÛ'cÍš5(P‹¤¯‚Æ^~ûdÐqÙ¨‡|Ou…mw7¿‚„êm?½üöÉX±‚{  ûÃä§çšÆ4†a e0©„!Dä¼õÚtA"ì ħ i[`š§Äø„Ä÷ö~¦ÚÛ:a€Ò`uÙ:A„ýpÄKRùò;‘íÈ šÒ0Ÿ]ŽÎ>Œ”=×"‹ÈÄÿzà¡;ø_MB{[ âÞ{”“Ð{ì1h‰Œ_fQúCÕ…ë„LØ'|nÝ06k›mZž69 ²&&§€Ô¥pÐ8ˆ¯ OXj2IS|ïúAó ,ôü'cÌò#ÿË}Éc=VÄÂF“ IDAT¡vϾ¿¿?†|º‚xˆ%k d62WCk­^¨T*|7Så?>>îŠ:ûôÓOãÚk¯ûdܽ{ ‡¾›ié\|=öëÅïÓù÷B4µè>¤{Þ“±ïZ9K¢Ä2fff066†ÑÑQìÚµ ÓÓÓâ?¥{ ‘ÿƒì«¤þÔ™TMû^BAäÿ û*©?ÃXMû^BAäÿ û*©Ÿ±5í{ ‘ÿƒì«¤þ\®vû½„‚ÈÿAöÕ¾<¿PÛ¾WÿDþ²¯’úÏ?ò­šö½„‚ÈÿAöUR?Ë×n¿—@ù?ȾJê/•J5í{ ‘ÿƒì«¤þ-åÚí÷"ÿÙWIý¹·Ô‚ÈÿAöUR?cw„xþ«…Â’ÿeâ?\ùÒ?/Ù;-WâEüã³Ïrö+¯^à»dò¹\ÆþýûñÁå?h›kGžö"þ{¾)LÓ“úT¿|€#F@%þ«smŸg‹íÂi}»Ø/ϽsÀÑ]—‰íuuFW‰ÿ^ß®‹‹‹¸á†\ãQùÓ4M×8i||¼¡cDîPç?TR%‰ØäÿP×áç¿õ¶ÿ‘Ë9ñŸpŸiVͱ5JÄgŒYÎZ½[ävÙà§°lðRiÜ=ïmšÎ}ÀXgÃB2ùxxØ3Z/ù¢Ô[ÎÏ>]{–ò~ÎÔzŠssü«Îr~ö‰Ä¯mz^,fµž#ÅÒy†zËùÚ?pÈ•;ïtg¸óΪz~Q®Éå Ê•Ë@ùN \ÎÏ>‘ø9oaµžÎ8…w^ÎPo9?ûD⟞žUiòÀ%õ–€G`½ug'Ö ‚Lþ€üæTUs_6dEƒpò?d¡Ë©Ç”Ê—«Æ›AX<~‰kûº×¸€Œl2&Äh Z+Èôô4Ðg3%ùö 0˜I“‹˜ãˆø»eã”jY\\Ä.LÇrˆ˜:=%ò³Y†니Ðÿö>®!òÿ™Û¼ç¶Þ~,‹å?X-ʵ•J]]]ؾ};Ž;†µk×bqq±%äÿZ BÿŸ½ç¿'ÿøæxÏ·þÙ{þ+‘•¢\m´ÑFm´ÑFm´ÑFm´ñÆBP´s¢v†áŠ4?77'œ×ÇéŒö‡‚C¶ˆÉnù…æ#˰Iþ ÎÌ=`¯ß ŠIN@äx³ÿ~àÇq]GÆ;¨œý8¢+¾Ý”#ˆìŒ'“ÿcIdz\×w!¯ùÒ!þáIˆ¦iF4M³’™Ò}Ž#êäÔJ%=Åù&ŸS‰Š8ŽzìS^¿û@ƒÎEKŽŠE«Äð°XسgOÓ82!L¦ ž 9-{»Œ·.ò?€“Å"VÛQ§ë<½NGÏzíùŽ—ŠB€íIã•b /¥ª#VÕÓ4#峘]Í䀉ô^¾;ôä+6ùŸáåC5ˆ|¸lðR÷bC‹!“ÿ¾àBB½tž¾„^P.ò?ø¢ëÖx'V÷â´¾[ãž‘óêÁ%Goƒ¼h$«J§óLD{Q‰øÉn[R Z%~ ;ÌËÎ0²íÒœp~ôíûÕ6µ ñ\'<7FþWßÁñ^ûœÃtëüC¼h"ÑQAŽc%E¶ ™ ‚ìôIPI òÝíçÔMï¥zÏ×õ‹t; ëÝàŽdiÓÄâIž1t›&• ˆ¢¢» ­^ ‘ÉÿðB鼸Rÿ®Š/‡‘3Z*6@ä€ H ««K¤_ ÈäÀyÎsax#Ì©Ãø&zð™}Ϧß÷œã„Ç»&2ùàN2$ÐÕÕ…îîn—£Õ…©ya‹å4ëåA£¡÷C4µ*zÅEt‰ÀŽ~µ 0­ ®Zó8ˆü8}`±Èd'\ŠœN¿ëµå×gF£Q«Ry?ûá¥`LÃËpEöá¼5§ -{dÒQ¤.ÖWªÌp´¸ií2Åêç?¨=AP w¿ñ/®Ç_¯×ŒøªB}.*•g\ €“=×å_ÅQ¼ÝE”ÛRf8Z¼ {´ úñEµÞ¯Î°¨Ù×Fk;õÜ‹œóŽ9R÷ýÈߋњ÷r±8 ]ße“ü«14Ì :Yéš±…œfq‘’ ¥,‹¦ ÈÿªϤX7Þx£ý½ã|‹ÝõÕ£x½p~ÖWJÀ²8ðÖÜF wGUôI è{C…SØUŠà’ø)Ü8éÿëµOD¥r¾‚×íúÒ †tžö{zz„ããš5kÄ÷&‘ÿëµOäÿÇ‹þyxxãããžöY³€×¿dÁ÷ý ù¿^ûDþ?}¸rI¹$ÅŸöOOO[ÜÁ¤2"ÿ×kŸÈçýýý8{ö,V¬X™™”J%Oû›lg½ÇÏšø#Úi»ÞÖmŸÈÿ{OTD¤†[V0dàÝ~mÓƒÀ0uïzèOF8únòÃ÷ßÞ­âû(µ©Œü¦=í§6jÖ%`xvbÆ:ÚýX¹,Èÿžÿ±±1ì7 hÏj¸dË0RÐûÃJ¥‰F¯¶0 T$À‹ü/ãfT;Cš‘èlÌB´5"P*ù_FG¼sÉE‚8¶jTÚ¥‚—C2ak¼³i€J¥éÏÀf„íSÉÿ2‚Æ­D‘?¾*^%`šf$9›hx¨"ˆÈßjÓ4#·Gk¿»i?¢ €ižrû {›´b.‚ˆüq=^%`šf¨±x¥R‰DÇ3ÖòñLUߣ’ÿe,ûðû.š€Jþwíë^Z•ü/ãÏu½e"•J%²cÇá¼._‡ "ûš5kªDLÓŒlܸ±®ç¯R©DvïÞíi?ˆÈ/GÀ“펎Ömvv¶îöwwwWWLÓm©Ç>«\.WÙ"Õ¯X±¢JÀ4ÍÈ‘#GjÚ7M3²mÛ61–Å>Œ¡aÈÆL  % ›ÂÖøeØ,u͇s¢\OOO°åe_K,X¼~‰Äw„Tò¿,T$æ¾/]eäz4mK }ö¡^ úþÕyÐI”€›ü_(ˆßñDÂ5·¢ö‘³ïb‹-âäg?‘â×Y&ñÇÿÊè©äY¤B¬r•‘ëÑÞ– ´ÿÍy €‹Äÿ¹u‰D%ÿ{ Ñ9wÄUF®g³¶Ù×~Xø±Jsœ´å%|'·±[òû¼««KÏÕó><<Œ‘‘ôõõ 1Øb‘(É[1ö Ab:ï“Snò–®ÛذVÇgwزE³ ›=€Tj FFFªÈ÷´1f8` XœÃ¡ï¶êH8ÂØ_*¼çŸ “ÿw¿J"~‚5õ‚Þ7^䀓1Gp†þSúÌÌŒ§@½äC/òû©3)O€zí{‘ÿÃØ§yÃfí{‘ÿÃØç"¿Õ"õÚ÷"ÿ‡±ŸË1O€zí{‘ÿÃØ—ý0š±ïEþcÿü#ßò¨ûú{ÿÃØgyæ)P¯}/òû¥RÉS ^û^äÿ0ö·”™§@Ý÷¿ù?ŒýÜ[Rž"õ?ÿÕäÿ0ö»ÃS nâ?€|F&4:_®|ñE. €¾ÏNœ8¸kÖ¬b~B\hd ®ï§’Ï÷n<ÇéÓ§C ŒQ>YÀë€jâ¿ß|ùœ¨0ìñ)•ÛïÄÑ$¨%àGü÷õ3ðÉ#ÿyŒ@bãããã“*â¿2Ý&æ8¢ä†Cö—ahÁ䕸ÿ½ßVçù €Ï^ÎEh¿'ð;õÈv ’ý ruÙßâÌ0Æ,#; HþöÊÕcŸüTÏÑäe‚äd?¨\=ö‰ÀOõ ’ý r~öÿÔBÓ§€iàÂ$_ùKmäó%§³g±2µ¯Ï›‚ä+S+@äA匂‰“ªûuÓ4#ù§MòR%û‡A*_F6ƒ.üÆ!?c³Yû¿Ç\Æ`˜`ry` 3˜À`%MDVÂ%@ðE‘·åëú‡cÎ8fù7V‹ßgn;‰w|€ÿ>'­EÊX½ú>û×- ¡P¹ééi+j‹Àùÿرc5JÖgƒ~ËíïºöË"Oâ•â÷7ÿà,®üèZÀ¥{¼çÝ¿ôÇß|áÙÛšjm´ÑFm´ÑFm´ÑFm´ÑÞ$oÈN^ê×~ €V€ŽAÀՑ作`Zà̼{›ÎÌÃìø4`Ü‹¼Á„½ýû÷‹¬ÉLùt©\ΉÊaÎÃx=\dÓ4#ããã–¬^üÜsÏá–[ªÕ$cÉ(ÆÆÆðIoNŠOˆsV/ùŸ ®íÈ…æD[·mÛ&ÈÀ€s=?•`"•¨Ô=é,ƒˆº ïû€œ‹Êy·Wj!›DbxX(±¶B” À£ÑM^†û–/ÐmB֜–òÒ8ÁäÿßIaÁO‹Xm§pM.·dö‰üÿz(qûÇKE\c§­ÊH5gŸ&Îc&æâ@j'Ú"ûŠ ÿìƒÇ±wŠÓÒˆ|È#`9mÉÚOäÿÞ ºpø§ÿ½tÈ[R "òu«#±ùÿ´¾(ñ…†™Ò)l_=нX@† Z8òC:ÏLä~À¯žzÅ!Â{O˶ëQ,ncÖ¸iN|~Êâ¤-ºÞ@sלú½D‡»OË/0Ä{¶f Q¤`Î-°—»Á×Äe'Ðdr9$mb(‰Ò4rí Œ1‹Ñ£Å(å|(Nf“Ñ(†*€DPi* x-ùÿJýx¡Ä©^(ÀEæ³ÿ‚žÔŸ´Ì6‘ü»ººÉ€þwuuÑ{yÉú=Dþï^ϯç UŸýÄCiì±ØéÃΘᒞpퟞž¶víÚ…³gϺ",…µOBÐ××'Èÿµ"5x D€³ê³ÿd_6ØÂƒ{OðöoZÁ\6‚ìk›´ŒÇ?‰¹'‹Ðõ¯Ï¾|ÿíIwò¿¦ÿýì[0 šæ|ó7rþGFFD=ÃÃáÇr¤âpâíºcÌ:åÎÍ^äÿ hé­cÌ*ØŽ°^ÜZ™·´Çlk‹Ï|ý)š’ù_~ÿ/äHH^äÿÒK%ÄWC³÷ 9{‘ÿeq VØ—Ï=9Ž{‘ÿI|ób€1f¹# ×ø¡Tt ƒz¡Nò3cÖ%?à{/òÿ…'~Še~_˜*›‚ Í‹üOcò¥²MÑļÈÿ‹øs}iîù:)Ä‹ˆ@b|aêjÔ~­HˆµˆÍÚ§µ¯ö“ßRÚ'âŠá…ÆW­°OóÎçÎçôܹs€G}×]w²1[:159…­ñN  âDñÛ0 û÷ïÇÊ•+E9µžZc Ƙå"ñ_p÷7D¾ç¿Iw hoÓ`üR"_)õ„±Ïük˜íáã©{ö=ƒäÇ®†%µ ÿWÅ—£d¿ŽH³€¹¸˜ Mì{·¾—ï=ó¯…o¿Lâ?6$å`â|Æb1q?hddZbFÁ)ã®§ö7cÌ’IüGÎqåñš!Æ L¤þ(…ì¿9ç_­§‘ù!‘°ÁsrjCƒ»Á´8¶zI'd¾÷ Ñ(ú$!pÈår2¡ °{÷n†BÖÄ–-4MÃP¥‚ klý¯ä¹ÿZk­„®÷ ¢=õKD¾ÿ_Á>ábž•ü/?û€ó^¢> ÉÏ~Ä¥Á‡ˆhôzzºªìµ×^‹§Ÿ~º.û^ä}9=5òµ¯–]ÏqÄœBøÿ ”ž h¿Zö£à‘3°~Ä¥OOoôµ¯–íÞu ÓËë²ïEÞ—Óƒ®¿Z6ïD)¤(ñŸ@éAöÕ²õóùÿ ”d_-û—׿ß9NœÌøO ô ûUeûZœÙøO ô ûjY/Q¬Zö½Èûrú–ûjÙ«õ)!ôïª €ûî» H†ÁWŒ‚i“.xæ%Ÿc÷†>6MÓð+ðÅóÿý=ïÀ‰í×]wÈC×hxx…lÉLADŸÊ ô÷÷cÏž=aÌyÂ0 d’&R¹âqîdÿýŽàÁ¶mÛD^rҦ߉TÞEXm鄆LÁ¨ sM„SÙd ™&Ú®‚¢¯ë@ Ó}G¼h2 »Ÿý¼Mˆø]€ÓëïtðY4kÖ~¥OD?ð}­±?çjÊ4ÙÝ[ÊàÎ~øØãPë›h4j¥<:¦ø¾…–ÿéþ:=•× §õí@>ß›2Áa½w)¬hš†ül’ŽóœÈv PiAçÏÏö±h{OT°÷DOY|¢UHç™èKUäÓ $Rù%@ðrç&¢Ý³³³Ø¹sgU¹C• À‰£Í@%dXˆóa/Ä-U4Âh4jåûøxäJý¾ù‚öÕkD~‚ý[ý¨Ö±ŒV*@„ýý@û.LÍÌ!ß¿Á˜5\&ö§Ó{°.µÙ˜“¿Ùç¿Ö±g Qìñ¹­yÿ» ¦ëò¯¢MbOÿ·.•Ç¥:"uX$lÇý°}íï²…(ò×Ä4ÃE᥾ ^0 áÑÇeÈb<ò·ÇKéÅUÅy¼noñ áûÓ4#ZÂv¬)˜"úyûùtÂ}˜ˆÿToXû==="R=öï¿ÿ~WÜZQOýì³DZ¥û‰‡Òøþ·óã%=õ·zzÚ¸J=öÇÆÆ\$="þ×kàBŸ5q{4Úþ“}}8©0µ7­¨€cšfDÛô ¿ÿÿ$4íLÃ÷ÿ…ºÚ?<<,"A5sþ‰øOõ†±_rŸ|3ˆ´2é¿#Þ¹ä"*Ô¨·C@…Lúßï\?¨ßÄC@…Lú¯Š‡h%dÒ7‰´2é_ÇÅP!“þãz<”@³IÿË>ü¾‹& Bþ.§qöR‰¨Iÿ®ëK*à™ô¿fÍšP"­„;Œ@+!“þ‰àTK •Iÿ+V¬%Pd¡Ut€Þ3kô%΄8Qü6ÖèÇQ|ë¶ms BûÕˆcSÀZé7-±Ó<…eðŸÿsßÇ$§RO<9 ̯v~?|¯¨WKIüRÅUñå@8û0'#?¥ž(•€8†ÄoH¤À3ê§œ.óŸÔzÂàðsEà=ÒoßÙì̵úu74÷BeTÕÓ* r±;•Ü™H呱—â!ÿÔwzP„yŠvŸJmA"Åù ¦_h `)×*•J$“é¤)™¤ ifff033MÓ ë½(ùÅ0M3Òß«9×Ð ‚ì_ \ŒóïzÆýÞ9~}C-ÈB3*iŸ"~œPô›Êªyå~ªT*Ú'ò¾JÚßRvÚt fâ@Ìiô[ˆ(yŸ)âj} 0˜‚1fy_%íçÞâô)ç²8—iô›Êªy¿ð6t}é—øB9Üÿ8Ï¿›´¯’é™§m÷óïλ0ý»¾¯±;<‰ß###¸÷Þ{«ÿ~Ç:<<,ÿñ™+ª„ÙÔzä`.'p&&&0<W¶YÑ,γ~þ[ßû-ð=8ä}õ<hÝí'¶HÀûí?*“4M1ö–Çñ²@Ðw»}À~®d"ô¢¹$@s߶ظ«Gà±íõ A~vïÞ;w ‘Àýly•¡ëÞ(YV®‹û ö˜EJ'r³_hô[L®«?s{Òq!6p« 2$Ðh &¹®XfåtŽcרçßÈ–!q€kZpþ7ÞŒƒÿ©?ÿ‡Sx§Dþ*Câï¼¼ùöÏÎ΢¯¯ÏÕwÒœ„_˜™™©Ëþ²!«Šœ¿rc8\9e‚ :k¤*H0€1X$ÀÝí¯Eþ÷ƒÉß rß^+¯§À‚=žŒÓ¬Ó@.ÏpöÖvqò›&®ù°šlÍÂ|,‡¿¾àôa®ûßlo«äøÍ¨=Îãã€_¯=J À9ªÿ^Ü»w/¶oߎµk×â–[n©YG£¶ˆØÿ.{[%ÿÀâÓŸç?®ý2à›8J  ™ö·ÑFm´ÑFm´ÑFm´ÑFÁS€k‘K†Wšœ_^ÜhÅ&:*ÂÁ˜ÈÿT7Ÿ„5¡÷r€xïœÌQm9{ xý)ŒAÓ4ttt¸ˆÿ|2XC"U†QP&æÎÌ#³Ë¬ŠHéÓ4#£££ÖÄàŠ+®Àu×]'ö…l¥b ©|Y8·Ü!U޾ )ò?G:Ï#R–J¼rtÇýû÷ãÌ™3¸å–[Hå]"Ùd ©|¹©‰ˆë  P@¦`1:>û?c–L>ˆëqù|Ë&š À.éÌØä„\ ÛÎøö¢lKÕ. ÃÀj)ËK÷Ü8Y,bµ®óÿàÇø}«í_wìä‘uޗЏ&®óÿ૲@ª9û¦iFXÊ}Ë9‘ñ8ö~†/|\˜z Ë/Å…©×°<ÒËš‰öìÃ0\Žþ“wóö€˜{7è8íÆ–ÔBËíóÈS%[©È3¥SØŠ½8­oÇÑäež*ëõ€Ždei™¤‰lA«JO%*ö9©,ɹl¢’¦5ݹQ0ƬqÓз¯‰¢R©D¶G£ÖÞ| Â$Fj,°†AáL™dñõ: Y ™) ms1 Ù$âëud’ÓÈZÃû/èIýIS¶–yé IDAT Ãp‘ :À!!Ძ« û÷ïǶmÛ–LeÙ0 qïÀý¶ÂSðÿó\àñ³&6±ò;:ÒLŸl†ËáóàÁƒGPrØ¢{1×¢÷Ÿanr‹=ü£Ñ“8@«ï5õ8â g{Òö%?rÔuÞ/‡g6‚hôj¤¦x)Þÿkš†|:!=‡Õï…f@ý@¤8à„xÈf@×{ññ›³È|7ã*wöV+îi^”…"ÍÓ ?s•J%ÒŸµ'Ýõºã˜ÑìyçÎp§Àg¸óL¿Qý>X—ç^Frÿׯô¶cN]ÇÔh_„¥p„§k¢ë»ðã¬T*‘d¦`åÓ è:†HפžH Àrš[t+g8Ÿ} éÔ*‘ Bñ}ÙÃ2‹áuùtÉLoÍi }P-Á, ‚î%$Û7f…èÙçtÛïéé±4©ýAöççç±qãF—ýžžž¦ì³fAjò`éÍŽƒ©lÿoŒøûX¿Ëþ%=͵zzÚÕ~{nÃÓþþýûÅ·1Ùç©ë LÓŒlbÌ¢^4gô]çiÿ_îº ¾üe—ýzÉÿ²mÐ6=úú{Þ›lÊþððpSçxx¸ÅŽ&(ÿUÜ,ö7âìX  Ý+":àž)Z’9cøE”çéšã Í»Ìøœ"hΔN!3]ŽÆÍ‚¾…ý¾‰ilp¤XZ²1Xé¥’ë¿ (½TÂÀ«ȱÖÎ-(ÿUÈߊIÓD¾ߟ_“ÿ«Ð¥ý­¾î*hž±äs@©X¢yЦåÂ?uýWABžø)–4˜lÓ hî'®% u™}&Ølë®Ãö¸ÍÃEﻀ„.‘@ªÅs Ä÷¶,t$ƒ¾ÕOœ8ÑòµÀ‰vìù„[úL ïl¿¨¦ô¾°°@kB-µöìY×$pöìY¼ûÝïÆóÏ?_—}Ó4#Û¶m³Tÿ¶mÛ„³ùý㘲?Àé=´Þ"DÌÙ¶m[¨±[°ŒB5aÙà¥â·<ÿ À5÷­%4ûAt „³Ï>Ôk=ôƒê—|<áL@üsöa@I¬Ç$pU|9 %$>Ô‹KìòDüýC½¡í'RÌ*d«Ûe‘ Š*?<‘•—ÂÚÿÎæ¼…ƒÕûd¡#yþ… æ^6çñ—ùZ˜, ÐÌs@d5ràŸÖ(á!mˆd±×ßœÑç3™~ArÓ4 Å✘9¤Ì¿4:â;e ×Ô9ƒ»wOaÃZ½Ê~±8‡'}˵ aí_ \Œóð¹O¯gpÄph>˜ú¯(¿aDþ§m"û«ÿƒò†EùŸ¶‰ì¯þÊAäÚ&²¿ú?(oXp²®7ùŸ¶Mó0‡`èEþUó†EùŸ¶‰ì¯þÊÚ~ùŸ¶‰ì¯þÊAäÚ&²¿ú?(ohÿi›Èaêÿ ¼aDþ§m"û«ÿƒò†EùŸ¶‰ì¯þÊAäÚ&²¿ú?(oX‘ÿi[}îýŸ'¯LÓŒŒ‡&¥1Æ<Éÿ2é_­‡ê'LLLˆoCµîZö½òÑ{Fª‹îS:ÎTÙ›”W9TžSëÉP=¶h@6fºæhLÓŒ¡;ì1x‘ÿå÷¯×5q½Û©~³“ÿåˆÒ^uˆ2Ef™ºô\iöŸ!öW•ñ"Äš&•J›&îFõûÓÏ~^ª#mšø €ûL·(õ¨BÝõŽÉ½®#ÀA)7 §­w¸ÊIâB ô›æþ>4 £J\CÝV!ïC>­e?•7 ‹d¤ò¤„á½ÆÌ÷³–Ùß’rÛß’¢w•·}¾¿uöµ”[ CÝV!ïo…ýuy—;m%9Mƺü«b_+ì«%ê¶ y+ì_ÒÃ\WšÎý<äü¿¯äk¯¾q„qáÆø\òÈšLcÖi`Êtúj¿€;l–aªÏ,`ñì¢ËŽg~ÉvÇ7ª ü2ù_†ðûÿêÕ÷…*[èÙÕÕåº/d0æÕ1ÿ$ðê$´Dí¾^nÿg^YÁš$ÈäBÍÄ%þø¡Ê¶ÑFm´ÑFm´ÑFm´ÑF¾´H07ÇW#ƒ²d5l-q|#Et½·æW^õ‚³i{ Èp1:: ¨œý8Ït Êß‹B6‰‚G,Y€K¸£·NÅÉG‘H… ""ý¼ˆõ©|ÙÊH'øäP\#‘j>‘bBí6•/»„&&&`)~N²Éw‚Í—}ëkªƒiš‘T¾lÉ"­‚¬ÎNNöDúW!"ò•_m©ýã¶Òìïl'W"ý«xS±ÈóÔ˜˜®×þ*[é÷lçf"ý«x¥X²ó4o_žÌäÄ'ú‘þUìûá5N$¤1f‘Òrï~þeÒ¿Œ¹'‹vžÖ)‘0Æ,r>=­oàD>T±²ÈEo. tñ¿žòGŠ%ìßÿä’“ßù€K  á“¡áILN ![ˆºú»d¦`¥ÓÐõ]-9ñÝÉݺx°IX‰JEˆxå_@ýcƸó¯îè¼ ¢WÀf\çCwÎu2S€ë|ô™â ¬ 5C½sÃÛ|ö_W꿉ôïÆ‹Åwˆ<ÍØ#Grr€”Iÿ2–: ³#œàH¤ ç<2=ÿ!p΃ê¨EhåyBàÀ?²|¤âäi5ˆè 8ÑçTGAB±èD¢k5¨_Òõ]â9”E˜¨_žD:Ÿjy¿Däÿø €'@&Óëÿ·46¬Õñ팪ç¿Õ ò?—@+@Ïü† É´Rù"»ÃÝÿU¾(ö'3_t÷":þX*¨ß»)é¤Ê¯ ʕŽ-·­~§e²A~ÆãŸÀ¿ÿ— *é?w™3É‘;“CaÀ&¦K"™­„:”Ê+Îwaì'h-Ô3šRˆ47â'ŒÑJ¨¤ÿ”<Ç™/ƒÈ¥#­»TÒ¿‹hóÙöòïÍb)¡Ž¥]ó³€i÷‘ÖLƒ¸ ’þS²N.ã:þózB}× õ»[£€ùùyþäüf¡Ö«:OLL@UDÊVAýÞ– O¥RÉEÊX ¨¤ÿçŸÞµMdK5f½ 9M&ÿÞó¯'Š\ù¶mÛVUg=öµÄ‚Ë~˜ùoyî[K¸¯U½öÙ‡z]öéÝBâ—ñD¢ê=C"˜ÈqÂ3ö)7é„î-ŠðÝÕÕUuŸ•Ëe±?‘ G¦ñ³ÿÍy—ý0ó/òÜËw6»'`%ã|ý¯XœVlU Ð1ú 4…±—Iš(I¦• òŒá³;q÷î)ún‰ŠÔÁ›fÕü‹t))/66¬Õ=‰öO+ÚíÿŸÛþÅEhÜÏþÂÂBÍ> Y¡P¾oé™Üºu+®½öZÀÓO?˜W%†ú½êÌvd±žq¢ðs*0¯,(PˆèUgÚ4ñQ;õ+8ï#ka@ä¯:Mó0ºwñu—…éŸH„Äê¼² @= B¿W&â¶/@©t*0o©ÁïêÛ½êLv›U1|í7ø> ï ¯:—ôSøËë¹èØwý40¯,(PˆÐïyý“¦ˆòŠÙà¼hð³H%JËuÆãq—ØUP^?±¬Z 9¯:ÄL\­óçú™â``^YP ¡ßóþ?—E×—~ XüÂÛóÊ‚õ è™6ͯ¡{§=×~þÃÍH„!¼³øáù?ʼn'P.—= È~õбÉÄ"‡:Àð УA¶tiÓ„Ö[=÷ⵞ*_µ²{Øc ¨äUx'L=2–Í6(€`ó0#ݨ)2îM¢çcâ kÐ>œ÷. í¼ŽÕ—WêI›f•€ûtºÈúÁír àxP^Ùž—}‚ajRè‡Û¶ß¶ÿ¿Šý°¤øVØ [–ìæc9ì:ÃÓ§§§ƒŠÂëý CmçÉ“·¸HüDàÛ?þ›ï?õ8Œ‚ -aÿ~ü“Ð6=€‰ô0¢+'ìI"ñ?lûƒÿÿ3̵ÑFm´ÑFm´ÑFm´ÑÆ4T 0Æ,r$#òo/_iTEÔI™‰‰‰º¯kÁ²Iÿ檢Z˜¦É/0+ÞkŠ|€Ä€G¸#}d Q¬_¿Œ10ư{7w.ÄäÓ ¤re”J\<ÀDîÙõh]ÒòdE•ò#õ/%>–Œ¢M¸ì“êòŽ;,ÃÈÈLÓDjzºåä"ó´RÔ ˆüO—mpèJ% >X% 4éŽN¦ƒ‘›:K8>0 Èþ«œ,±š<ÑìmHéoj¡>‘ÿ‰ìoŧxûã@ €^êûޗЏ&®ã•&Éãªý— áìøíÁ÷¢T¾=”â€>ôªØwaê5,¼û~x ÞÚBû²Ý.À‘bIDû£m9½•$"ÿ“³éàÐ4J%`Í·ï?9*âÖxgî,ËŸkYà`½—”¦¤ó ªí–ÔdÝe|sæç_@OOÏæ¨išPŠÿ]ßx:††'[J2¨"ÿÓûȪq7Ü‚o¾?zöY\wÝu¡Tˆ ÃDdÀM´ŽtC8ñÐùp‘4÷ùPËêÀ2LhZãN¨DþwÈþï°ž<´¡_,¾£SÂÞþýûéàƒ—n@©|0\ú+à¹+pE#\³fÍ’9ÞùŸÈþïâðj 8:äμð|éVgu.~C3ìÌ=$HdM@mƒKë%å‡HØPî&Ï7÷ºu2Øäõb{"P €`´üº{÷îÕ­wuuåøÐÒÒ"S*Ôç„2 ŸõPÈÿÆ<»ºº´o7”u  è Ë¢(æØ§³,Y>A ŠbÙö¢GŽɱ?22"S€úúzÌÌÌ`Ù²e8räHÑöYbÛÿº¿ÖúYu¶ÕmG¿Ö_*Xûlÿ÷oðiµŸ[ŸÞØ÷í¤ýx@dÈþ ñ_ðéÅÕè6Úæ¤ýîîn]ŸŽ™È#ÝF뉓ö õ¿°ÛhßK¹ö!T¥-c$û› °>šµÏìÙ“îÌíÃ¥Xý×^ìý÷\á7ôý/ÆãÅ! vF„µÖðz•¿÷ßõÛÙøÏeûÕD1×> <£Ö®]k)€SJÿŸU}ýÌg>“Cì7K[ˆ|RªýU¤#‡Øo–– 8mÿK®\b¿YZã¬ÆNÙon?•Cì5KKEœ¶/‹rˆýfi©0€ãöMhÌÒ²1NÚÿ»ë¯Ê!ö›¥Õ‰•9hë‘Cì7=ÿ± Õ?j³´…Ù¥Úÿ”7’Cì7K»Îa»ûK~ðN±ß´þ_R™ûOsû56¯ÿ»Œ›LmØ!;îØ±¿xã(€£9âovÀÚ0Žc+%;pª½ÕOz’B­6‹´™·i¿K&i}¯/$ˆnÛ(4û¶ÙqìóØxÞK!¼Ú!ÿ›Áœx_º„Q@0ÍÏxžÌí²ß ƒPE “ï0ó‰Mc%2QH|ÂŽ/Ü>·¾Ù·ãS©ÆRù›Hê¬TÅÌÞÄÄäz "eÇyH’ä"1F¸E=Þòw§½û©YÙå#ñÓÚ…噉KîAïW:á¾î øºNeÿsfÃ÷‡aw ²YüùHüÆ´vq¶÷ýppppppppppppppœ­Èrg¶±‚ÛíÖÔöEQÔçÄË>YÛ qW®Â²ì‡P²¶/M-Ò8¨'÷ ©© „ìÜ©|mÌ.ÿ‰‰ÃDF•Á·ß~;DQ™Dé”zDî1Q)·:ëÔ²®`Ú'Ž,“F‹É¾ ššš@ã2‚Æïíí•%î@ I’pàÀGWV¶ËMk­…ì/€Û§ïTËÄ%ˆ"àR…¨€SƒïY\îõâÓô£—:È…Š\îõâ? íÿ|Ú¡Á¯¯ ˆ0_Ž'!ŠÀ7Ð?ˆ MàÒP:cÿÏ.ˆ‚…ýDDøœ(ãLä´6òd u;ZþY"zÏܶ¿bädŽòA‘7lØ:¿ÚW¿úÕœ4”øÿÙÏ~†:¥Ÿ)‹ù¸Ü#IX»m[Qƒ`Äð«Ò Á×d|>°ägš%$|J¾Na±°-Á«•õvLÅ pL<¥ý ½Š–àÕ%ÝþfþjÌ×꺿¢œþ«ý8zô¨&PÌlßÅàš ÙßÔ—„rªÛ¢P€çf$\Wù‡B#ý›–Ã(Dˆˆ×Dœ >|¸–veõ¾»*­]¨ÀÌ äÁܘíÞ{ÝFEBköžSÇžÑßt@ ý¶ÎºfFüÔýÔ±dn·[G-týŸM˜˜˜Àþý+°z5;x-w[¾û;øF’nÆþý+øó×ó¶àÒ<“+ßýí•øö §¬” Á+˜ 2PttuVT˜aéÒ¥y÷_ýõ­g_X% žg:¯Û;:ñÆÁÊÅ_hfÁµk׿Ìì$.÷zÖñ_ºeKE§`¯uý«fùSâ]îö\ò? öñDÝòÉŽŒnfÞREÉúY˜‘ÿ©}EàÞL,Ô¶—ÚA aFX‘Ë$I™µ7’tU°–ÇÂŒžõA`EðJ!ƒB4B? 3ò?µMEXÀrÚa”|i„ùŸú@EØÙ™K ¡Ÿ…ùŸÚ§"ìÐübE(éÖˆ|ç]X¤Šo*pB€¢úu¾˜ÿ©/T€½#@Ñý,ÌÈÿÔ&¹¶UþàÅ$.Ü“}>”+@H–ЯÛnBþ×üPEX1´RD!¡Ÿ…ùŸÚ¦"dúÊ ‚\F˜‘ÿ©T€m•*ÀŠ1³0#ÿSûT€%A–ú.L ˜F˜‘ÿ©}*ÀÆ_ªí—2ÂŒüOíS€©©)m{©"Fd‰/Á”òKïS…ú^À¼ŽùøXÔ­t­F€¶Q*Ý÷ ‚Ï_TU¼Tû½èóIŒÇ5€x@„/*8nÉ’%93®²³Rrpww7œß¢ÿp¶ï…^÷§—.ÅÃw®Ö¶› Ð~ùÏܶ=±D¬rš’/ ´ÒP.ÉŸ…IßVÞ>`¡½¢¯%çÌ®ýµk×jB7T ŽŠ”r`ÉùˆûvIýÆof…| NbþÛIç¤ý~Bò÷ÙtNÚ'ä.ŒíSÿ[÷ Yƒñ¡û·¯õ'™ÿ…Ó9i_!ëKÌÿÂ霴ê™Gñ¿q«ößN:'퓤ƕ¸Ï¦sÒ>û2ß7K»ß3‹µ¿.E0Ší¿tNÚ^Dà{!í¿tNÚW®ÿûµÿvÒ9e?¹PÈÿG–Fü7ƒ‘ühfd=ú¾c¬—vò/Ƈ~B䞤„Lâ _ùÆ4"N"S¤î•M«í4Vú^™øo–!Dž˜˜Ð¾¿Z‘NË!àãq¿“vY!U  ?æe¶H–¤IH’=ìqwA¸ÀÍ dQIcAÍÊ%_9Ñ}ÆãØíÜ>·Ïí×ÁX þæÂé€l?Læ2Ëw¿´û|/”¦ø‚Ýüœ†$I.·~— #cü;«ÊUû¡ŠÊ˜»ñspppppppppppppp”†I’\GîëëüêW¿8p gæ5·Û-766P¹@oooNºRÑÚÚŠ$º‘L&ó:‹gŠ­mmÍÉÇbãDÔCáv+3ϤR)lÞ¼9GAØ Ú 6lÐÒ—ÓaòñµJØ!WLLLKÖ¡µµˆ•÷±ŠDJªÊùìÓ™úzè!Àúõëé€}¹ÔúPŒ} ¶üo¿ýö²g_¢nt½½½Éd©T étZÛ—‰Kh…B”¡xrH‹€%ýí:•à^¯NÀ)Ø?Jü@‰ÐcSÔ ûŽ»€jeÙgI˜’ÄÚcã9öé¾Q/t" ª&>‰(ñOaRpWœýL&KxY7½g“n¤H˜ÎVîXjZ×¶jÂ+ìqJùlÌÙ^ ÈÚnÄ’I°VЬ!­ò‹¾°±•ƒCÝÝøE2© p°øÇµê}w¨4#îÞvɤùMÄ×Ul93â? 2#2ïÚµKó…=Çý„ÈPµûÆTês½áBˆl·q„ h1'M¡õHiåÞ#yë »wßí³¼þéÿrŸã¤±hÀt®ý(Akk7 =‡òA’$ׯePÆØ:pÿ#‹ä‘³½œxö¹•:è-²ç$ÁhªìsBqä_ïÆµÉdÞ&}ôÿôáÎÖV¬å"ßù ¨D›€â'?ù‰öf…[n¹¥böÿóî_ UÀþßݳÿË_þ²`üßýîw+fÿþÇ‘4Ì8fÄ7Ÿx¢bök]ÿªUþìà—3‘G™íw™¦1âcQ7ýqvï}lÞ/‡³fØáùì7ë1:iQ\)öÃŒhKHÈgß$ˆ‡ô³Ñcߘ¿ÎÞMƒ6ËÀŒ)d9qHwœtñÿ,; ŠH•϶ûº'yîïµ>z\©ñGÏ´ÖEMÓá‹ ˆDˆ‹ºãJ©¿f¶³¤À|öÛÁ°$i³Óã ÙgóaˆüvÏûÊØ¬20]=¶˜óžÏ—È`¶c)Ó4F¸×‘ÙÒÄ[éqù|aó›ÿßjÛY2N>›^ÛŠ^Lbþ ¯éŽ+6~ f¡&ÈWÀ$B’6 4=®Øë/fÊ=j¯î»×­CftTcœÒãJ½þöîÝ«mgûAòùÐÒÒ‚±±1MŒ†WÊõ·{÷nm{Ôftuuapp0g¦ÄRìïÚµKÛÎLòÙ@ww·6C*=®ûì»Þ‘#GlÙÁ† 033£;®”û€$)â"”ôOßAé÷(Ex¤„¬«êa1fòÚ'Q·LIÿFû$ê–O2˜×1_pмÒ'rú½¨}*8#ø|š€“$ET‚®íSÁ JvZ€Ìªÿ…Úß_~ß [ŸUÁºGÛÆ ܶu?b7jßÈ6Ò—|“ühvã„IßÃ/~qwÞö·UÿK?!2íÓqâÝßìûû ¢R°*6þsÙ~5ËßêÚ§}Ÿì¾îîn€òõÿQb‰q†`;é Å`7!Df‰ÿùìç(Ç>KüÏg?Ÿ@@9öYâ>ûvI‰ÅÚg‰ÿùìç(Ç>µÎ§Q IDATûžÏ~>€rì³ïùìç(Ç>KüÏ{þm›ŠµÏ¶qóÙ/F ûl?O>ûùʱÏÿóÖÿ<åØg¯ëj^ÿfÇBä;v@Qäÿj’ãA(™ü_,$Irõ"#d’z”BÏRAHV„.ù?_Ÿ fdd¤l’¨–o‚ÈÒz ò¸"úΊŽ›_)åUH4 ŸôHz$å›|›…hg>Ÿ€ûu>æ³›Ms—šÆ\,× öò.Lþ-µþqûÜþùl¿ Ïk ¿¨•éq±ü±ZÅYh¿Û¥W HRvŒèVçæ ‡ÔÙ tvJpûŠ¿÷;è2G¡½è{<­³eóæÍZ‚‰‰ 8p çã¹ÛíF&“ÛíÆªU«4Ò5<ùä“Ú>ŠX¬‘ˆˆ;wš °öY&&&055…T*¥óÁ8SjSS“Žü=44”3ˆE…©`‡Çã‘ÍÊ(L"¢å@óåÉ'ŸÌIg§ 2™ (žl¢~XµÝÚÚŠ®®.ÓYeÍ쳋n·f"vã7úI³Ó¹DËÁʾÕ,¹l}²„ÖÞÞ^]ºR hhmmů~õ+ËøXÐX=Üãs£?ž±mÛxL9öÀùdŸ–={¯8›ã·{ï#DÌh6Ëa>û«V­ÂW¿úU$“I<ù䓎 À”c›ÞC2™ ¬brʇB¾Ìe[@áÉíííUóÅ Õ.|÷ëjßʵWʳ§R¾œ¶Ëµ[L»3_újÆÏ>Œm­j^‡¥\ÿ,Ê}TûþSKûNÛ*E­¿~–cÇI{Ü>·Ïí×Ö~¡öp©°{Ï;ßí×Ú‡ó=þZÚ¯uܵöe®Äϯ¿óóúãöÍA‘Ù~°BP§Ñrûç¾}«:¯P°cÇŽÒ¿ë—YûÛì[p­û€¹ýs×¾:hv۟ŶSºßpûÜ>·Ïísûµ±_ÈŽµ"ËÕʯZصCŒÍw,ˆ§ï ­—àbf·¦b•¬Å’…Ëyï5ëô7=»ïúµªÓÜ>·.Û¯Ìb,æ6Ç^* ÅO÷ÇCŒs~õÒâàààààààààààààà8`*`«î…ÈØf°C~wÚ‡L&ƒ¿É’gÇ~> ùb„±°–ö uBRÁ;(”Ö¬CÊLüÀIûÆr)†ˆèE1Ì(¬Ò•"`'_»öË!„oöY&­7gsüìµ`wð¹ñ3Ÿý|ûK%Þ9aÛnìåúP(2¨õµfô£Ö¾Ôª<ò=‹ËõÅ®?NÅ^¬ÝJúRÎ} VuÀŽ]'ï?V÷àrýì—A9>X¥«å¹/å0îÕ¬û•(k3”+†RȾ¥–I±åQ®=nŸÛçöçŽýR9–2ȉ۟›>œïñ×Ò~­ã®µ/s%~~ýŸ×·Ÿ›_{{»¶mhÈ|–k«4Ü>·_Žm§Pì3ÈívÕþ6¦-FôÛˆR¾9Ùÿbì+Å~&“©j‡SýnFÛåØ/Ç'ë Nˆààààà0Ã\%ý›¡RýsÍf90#±;¿q[5Êã\µ[-qnŸÛçö9æìôûH’ä"„ÈñAP× Ì†!ŠÊþDeOzÄÁÁÁÁÁÁÁÁÁÁÁÁÁÁqnÀ’ˆmüpnÕ‘`쬠„¡R]°„}3ØU£5úCós»Ý¶ìúPÈrˆ§f>å³o&PÉÁïN©—(&/§>Pä;fùD/¬Ž«†}§/öóá«aŸÍÓj_¥ìÛ"¡yV»ÞS[¬}»¾–‚|ÏöžRîý·Öך*w1ö­ò­öµWª/vý©uìsÅ—ZÙ¶k—m+W»îãG©¾º¹íªbÎY©¶Ki{9µîÕ¬ûsé~SÕ8'ÅÖaZ&¥Úãö¹}nîØçàààààà8a÷›Ž“ß~¸}n¿Ö(öÝÙ*½“ø|~TªÿГ¶Ê/_ü¥–ƒU¥û *Qþs¥rpppppppppppppT N Aò÷`޲@‘Ù¥Öþpppppppœàí¼æj}¸}nŸÛçö¹}nÿ|´ÏÁÁÁÁÁÁÁÁÁÁÁQü½åüŹ0&ÁãñÈvE©‹IËÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ¡!DN·/Ò–ŽœÕÜ9888888ª:`oûöí9íˆjæË'lTi?¨ÍD¸½æåPMx½^™]ÌöUÛ'Bˆ<¯C¶,ójÔ9!ÔÔ~"lÝ®¯ŽýÜë šöåßwÖ6þŽñšÚߎڞÿtû¢Úžÿd¸¦öÆR5µ_ÿ²(ÖÔþ±cÇjjÛ¶m5µjfŸƒƒƒƒƒƒƒƒƒã\ƒYÚj[!Áu»ÛŠñÍÌ^5„ß˱mÕ|6£e]‰úRl~•ð¡]€noÍÛwXJ¾Åäe‡Ÿ¯{<yÛ¶m‰ývÓqppppppppppppppppppppppppppœ{øH­à8ûA‘úëðc×$aDqào–'²$I.§íåÛï´½ZÛå>ÔÖn­m×Ú—ó9vnnù2â?ï•öæ+I’‹"£­­ Ú~v´µµ9Þ¶0óëT踶>+.‰º5_N…Žƒ/Õ|Ï—ýo'Í?òÃŒALˆ9ùÄC~€/3-6/ÛÇ#§Ói-ocÝ(Æ.%ô' —×ë•ëëë133£ÛÏîc·•G¹È–ó$Y”s.è`L¶¬*aÿ ¿+cåµ·Kñ•Úï÷Kè)Ó~)p2þr솚±.8^³ój!ˆ`ÍÎ$¡ŸÔ°ü›$¬KÕ®þ«÷êšÿö…€ÞòÎ9ög¶H Öîü¿zクúî»kfÇŽظqcÍÎww7‹ŸØ¼–©}A ŠbÕËŸƒƒ£º¨ô»Å\‚Ýû`¹ÇÌUÔ:þZÛ¯5Î÷ø98ÎB䓌ֿH·IÒ>²F·mllL;îàÁƒôý¡VÇó/Æ·¦€ï* qHE‰®¿Ï°ÏÑ{O9¶iºwß}W[¯Ô÷±BùÚí¶“G<䇘Œ¥i‡Bd)$‰®¾4$Ëó™/n³cÍlTÒŠØ8´]ùPJù{<9ëßß/[õBä~¿¯H$ÓšN§]½½½òÖ­[qçwÊétÚe¬O‡î¯X_ÇY ú¼°z6Ú_iÔÚ~¥1×Ë¿Òàñ+àñ—¶Ÿƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ£HpÇ ‹*nƒ"ÇãÍŠ=ˆÚv‚¶îö•?ÐÂhN2¦ûÏDNØBîªØ XêÃThÆtÿ›‰…˜'±.U¹¹ÙÁ’éþD“@lÜYØAfhL<qÁ ÄNmgžû{ÓýÉý Hˆè‰U~@´VÑt¿C<."J¢Ž €aÉü|¿`@¬ ƒÁ©/6l0Ý?55…™™9r¤"¾°$C3L‹“H©ƒ¬ýÌ®é~ñ@‰ÄPUëá/šªºpÏNœyá5guÌm —ŽǕäq€ì¬üý/3:jºÿ¢ˆí‰‚Qg®?£]vÐ'‹‰‰ =z]]]}ppÐt*•ÂÄÄ¢%Än$õkÄÿÞÞ^ÐõÞÞ^yxx ˜žž.3¢âpÑŽáýçë¶I’ä¢ä*`5H‘аféXR?dÁX þælÝ«/€¸ÿÃ_5B°¿ ‰dÒ¶“ÙU#ÉŸ¦s»ÝHõ4 ©Ú`ÄÑ& LÐHÆ6Ë Pˆü,©ßHþ§ët_cc#¦¦¦ …S1ÐAÔt]’&-ÓBä7×§žM–@mCÌÝé&«gR±ðx)$šëP8nz,ûí¦URUô 鯯 ¼­6 Â¥”?CþG!¯¾Ð ÄÌ}سg¶nÝŠ¶¶6yppɤbhhHÞºu+öìÙS^N@†Bd¤¿µÊ£VàñÏ-ßeYá*ÐW+Ë2\.WÍ|>tèV¬X1WÊÌIÈÛ¶mÃÍ7ßœ7Ñ™° ó:ås2~5¶ü‰dÀåš3׌“eY„Ë•ÿúkmCWÕ“ñ‹² Á•?,5͹?GMW`.Ì8Ë1·A‘úëðc×$,‚(*d(Ùœ£\² ú?—€:/ ‚1³-Z:*7›Š°(†g$þ+„³<ïWsNÀŠøÿfb¡izJ†qRÀŠøŸH˜§§DÅr…¬ˆÿ‰§MÓ‡ÔØ a[ÿ“û̓¦$¸J°­ˆÿb0€’…¬ˆÿ¯X¤÷«é*!`Eü·"€.[¶ °"þO‹æ¤O'ë kßHüÔ®‰ÿîÙiš~Á—nUŽ+CÀŠøïJ›§—Ö+霰"þÿQ4È…ÊõW®€ñŸüÉ‚’ó°"þ§RæÃøj쥬\¹R#û/Y²DÛNãÆòåË@'`_‰YžÞ~1.úÂ1‹qÙºÚLEò?Ûf¡ä»Xü• @Lˆ¼K!äo$’Ö3±Äþf© €‘À¿2–Kò§éÜn7R± ¿à✼®ðžÈiŸx<Ù˜—­­­H&“˜™™+@ëëëÑܬ­§¦¦ð$à…W€D"¡åéõzev½ mB¶-HÈ"Ëú~&rð8`8"b)€©b†-畱ÙûV¢ VH$”¨…@Û‚l°'FªöNHÛ„l[Ð,þJ¶ Ùöàºà¸¥}«vc© mA¶ œ–ÿ+®±‘޶ Ù6a?©Þù§í1¶¶.U¾}ñ@ªÂm±í0_0fiߪ½V*hŒm{ýWoùçß.h{Œm‡Õ?X½óOÛblìê»ï®š}Ú&cÛb7n´´oÕf+´=ƶÃkómذ!¯È}cÓˆ¢Èû98ÎA°ï3”ü___ööv 3"ÆeÙ¸í¼WZ¥·;K°UžÕš¾Öñ×Ú¾UžçKù[åY­ø98ÎGÐë“5"ûà-û^ûðý€$í!kd@y—øÿ^ øÌmûuÿi^’´óø÷eóºj „¬aÒw}ì¾Ø­üvˆí&h HøÚ}+h4EÅ^IÛï¾û.ht½\”B/g&zjOÁ›„˜::“ˆ„[!x“š(g9ÏœT” :Ÿ;¥íëÜ4$¤¢JÞvâ&„ÈM I!&¯ðVŵiÖ_î”l|ô˜bËÅXF•.ÿDðƒè÷g·³ù¥ÓiדO>) appPÞK&“hooG[[Ün7ØþÞj|áàà0…B\g³˜n@n×óŽ©_.ú1MµžšýK.¹¤ö+ cùæ-ÿÖV ™<·âoÕ‹/wñ££­Ã1Ô<{NÅ/ʺ-ϿܙÂ9?GÍ`*Ph¶]$¤’¨ülÃsf³Ã²„\òl¼|B!DŽÇ³3lŠ„Ù0P׉Ü Ô< è˜}‘º‹Ð//"xT PrÛ–ô$ȃ… qFâ?À¾¶YúÌ ”KB7ÿ,éËŠ„ è…ÊõÁHü²Ä/1ÏxV ”„f3kRÂ×HžØYv©2ŒÄ Kâ:°V·` ØN‘1ŒÄ Kü[û 3{”‘ød‰^ãyŽe…œ$¢AI'ì,ÑF°Bå°Íf¦×]>JW¹uÚ7ÿ,™,‘²<¶õÐHü²´3/¼fy,+PìÌðfmJ:“óTFV ÜûŸ‘ød‰gÛ­TP (åþg$þY"ÙÑ£G-e…ÊÝHü²¤³|¤6VÀ®Ôþ³yS1Jþ?|ø0ÚÚÚ´}ì¬Nì:P~ÛT’$ ^*Ÿ ÇûÏ/Ô §pJÛ€©‹‚m;|,êÆ‚à¥š=–Dݦåâ ÆÀʺˆê³&‘L¢³£]ûïo–à¾î‰¬êóÒT¦¼‚–¶ô×am8šx ©Ø'ÑäWˆû’$¹Ün%æµñ‹‘Édtâ–äÿ<‚Édo6PŸÒÝÛgZÛqÅxT#ÿcffÂ2H+”ôïõzeºè…œ„•”yÚÜë¸T|Ø‘Kü·‚Ñ#Ädþ6EžÛ^U`%U-Cèÿ,¬þsBB•øS¹Gþ6…•Tµïݧ$Cj»*?‰¡Bx°SýçÜù·]ª¬˜ª+ñ¥j¡BÿÞ½{·o%ÀT.Xò>B>qŽs„¹½½étCCCš€1»~6`‰R,‰:ÊŠ¼íÄŒìÕž¾Öñ×Ú~>ì¤uÒÞù?Çù°ß¡ˆ™·ßuß?WìT„<ýJ_EøéãèÄûh…BÀ·7Í/¼ú"ôßx) Ý“FøÎ‹Ð)(~¶ŠÐúö¡RmO§ËŸ" '…úí@Ñh4']:vBä®®.¼ôÒKáÜ®®.m?MK‘C !ÔÊ9á‹ \€ƒÃƶk)׉<¾ý;¡í!H’d$<Úòqøv@ó¦ûJ%D#ñ?Õ{াgÙ¤¼´¿öo€¡«êΉøEYÆ?=òmÃ¿Ž§o»R—(Ñ1o¬ƒ®i$:€+Ü¡Š÷Žs°+Ú£)$áã_>þ(LGvQ!y%H^I;®šŽ×4N«¥ÖþU ”K—|±:Mþg üD©»< qV©Œ¸U€"€Ù°²@]§¶Â'mÛ=ÈàLäQu9­-ó:æ«Ë­nVsHÒý%†£äÿ—Ã2^Ëx3±P[®ðžÀÞøëN„EÚ¬½fm’Êò!’ŽáˆBú¢‹×«,€Ðª,Vð7ç%3Šá!ˆá!4&žÖ–)ï˜òÞ¡³„EØ'öP ±Sòøga„FrB[ZW{ѺڋÎÿÙ‰U^«¼‚e>ýþÒËõ%y<„Èã!ˆñ¸¶>ŸßB¸T€p©µ/Ù€-_(ùÿ×~ …äE—kÔå¿hV+ø%gbß°aR©R©¦¦¦´¥±±hjjB}}=êëë-óY¶lYÉúë0"NbDœÄ4³Ðknƒ°H•±F)uÚÏì !<؉ð`'Ä mVy!¬ò¢³+ ¯·^o»e>NÕà ^LbþŠù?ü).ܳS[>øâz|ðÅõ8ýÝocÞç¯Â¼Ï_e™Ï‚/ÝjÛüWgt‘=ÊàjV+HëË»ÿeFG ‡ ‡ñGQÔ–O>!èèìÄ&¯›òL› Ø»þX»cccØ»w/öîÝ‹‰‰ mY²d –,Y‚믿K—.ÅÒ¥K-ó,+öÁÁAìÞ½»wïÖ®ÃT*…¦¦&455áoÿöo5¬°»$I®¶¶6-ÆÞÞ^ôööêÒPò¿ñlxxXggxx}}}eÅOO2˜`AðRmpJ!ó2ÚBÛ§BÇQ'dg0’$ɵ x©îx3{!Bþ&ø‚1ˆ ÁXJ`À«Jè ýN‰{P?ÅÊØ,2™ ÖÆs û™Lnß82™ F›$°ÇRbºÙlìkãÃŒˆžH$\333ʬ¢É!|âŽÇ´}Ÿ¸ã1ù_’$HË$È‚Œ÷ZÈ‚ i™–ô@{&°ÛÊQÔ8¬î9 B©¾MšÖ7e`÷ò¢mz<ÝlŽT ª1X¯ §ÅI¬ŒÍ€®m®‰.$Þ*ʦЪ´éŒ`… |A¢‰ˆI '¦ ŠuâYcVÊŒiP#ñ³ðx<2[–¥Ú§¢PîëžÐD $D¬ *”ùÑP³©}Ú^´+_Y!(_TЄŸÄã"‚ÓA@¨!Tvù7Ciã™Ù§ÂPm„h"ãú‰rþ{,Ú}N•?cZ›Õº!Ö¥ûå¼ëPx½íèì çlgŘÜkƒšøR"1¤‰®ÄC~óó¯¶Óì ßù§L^Ûª .yá5üW¯rþ?Úg~þ**ÆD‚D_’Çú•òŸÙR~ù狟 1¹×­Ó„—¶'¸úÞ{oEíSA¦––M€éèѣظq#`ÇŽ¦öi[­°bL]]]šÁÄÄÝÝÝ=ÿTŒmddD#ÿÎÌÌ@TGì ‚ÀÉç!r__ŸFþ€¾¾> éú^Ø÷—¿ ¦¦³ö^`6ûºq»Uÿ¿ñÇj»Œß¬þç;Þê¿ÝóQËøkmÿ|/ÿ¹?Çù…œ»‹ºÕ¾%àŠMˆõøëñ€¶EKK‹ö^ÙÒÒ¢ÛGÓÓ<¨˜µAÈš¢û%Irå;¦ÐþrPŠmI’\½½½èîî ¼õöö:&Pà ø‚]ˆ„[Œ¥4‚¸•¥Ú’$Éåö™ÍUÒ{Iù«â AeO¿GW÷HèD ÅMó²õ’ù©T4ëo%|p•*šw4Eww7Þ}÷]tww#æÍï¹ 7Ü l{{{ñÜŒ¹àSËOí?¬”p(ÇY·BÜ—¯±SK¾_7}ò$v?‰í?[†ñíß*`§ý+oÿÆ~þø—;>‡—÷•-µë€§zo°ãƒüTï øž }ó+ë9ùzê(¾'\Œp{+TA[ñïÛ·²,cpp{÷îÅÛo¿]Ž.ؾ};Ž;VÈùСCèèÐ>€•¿ÛíÆž={ÐÑÑxª @5ßd¨ä×úÇ5òÿS½7Pò?›kÅŠؾ};E`ßårQ!¹ ~»î¹çmÒ€X,†OüÕ *P û•€ •üÕ×oÆ»÷܃™™–ü¯+o'†òð¡ÎV,Ü"C%ΟÕñŸ »ð—÷Èùù_¿ ?þ‡ P×HÐÛX¸Pu(ÎêøeYÄÂ…¾yðA|VŠaL}˜Žk|¨‹cûÞG°}ï#ºê“hmV˧ÚÎ;*ù_peOõ¿Ž§ÿ¯+cý4ã[8sòSp¹ VïþcÆþ6޹ŽÐ?ìï%›àÝï©ÒÖ™H^u`x¢rÊë,ìÊ*aOÌI333”˜Vô`·¹J¼ø±k‚°¢8‰@ˆFõçZ''ÿÇãÍu”\é…8›€0«ˆ .KºŒàQ î"M³aE ™#"ªä¶Äå@cþÙ#%Ir‘¨[¦“@²¢Ÿ‰ é[ßïÒåU0X ƒÙz>ЬÏÓ"Ð ,RI`æ±PRL¹>ø‚ìµ–-1©ÅòÍ/ÍÅnLÎÎÂÉÄ(aƒ°H#€™!XFì’$¹Ü×=¡ÙîGv¦É «¼‚Fþ2%ÕbÛÌ_TA'¡?žÝ'>.B¸4K3C´.;ƒ„_$Irµ1÷V?SñÇ¡ÃòÍ#ÎÆ>22¢ù²lÙ2mßÌÌ êëësf cqäÈ‘²|‘$ɵ2F´zjbnâ$¼Ðiáä œ:Hq¯ 2õpHÛ—H Áëm×Hhfpº’k[eJi^@ï±æ¿ðæ}þ*œyá5œ±ÈÄY IDAT8þÔ3í‹2óz¶.J̽ã é_·þ2Dv:sÿs¯[gn"‘À&¯W#¢™!-îúcÓ¶´´hv)ñ PgK—.Õhf ³Ák×èCWW—æý8@"È7 n´ÈØÕÁš2 ÷)ÚÚÚÐÖÖ†ááa444`zzmmmºÁƒmmmr__úúú4á*$PJü”ìM¢n…ÌS˜/Å©Ðq\ô…cxÿùÅ:¢?r'ìÑò£ÿ/ÅC™Pò …¿YB0–Kx€pÄúz§ÏLš˜sÄ쀒©%IrQ9D`—ï=¬{dJú§0Š­ŒÍª¢Àº‘Ýn7vùÞĤb hò›ÏFŸH$\”¬ÿ§á;ÀƒžÆÁo^ Gcc£ÒÎv­ð.«$Ñœg]O$޶ÅÏDNêêI²FÝsF’?­Gg"§U‘€ÜAÜ,Ô™O\ô¿Yy) ³X—"8(dÛyT˜Æ+Ñ…|H$”:Ï}Ÿ£·»Ø8Ð*im<Ú¬4OPž¯„ìsvDœ4ƒòx<2Dìï›Ö½bܯ@OŒ`Ô›}ÎÒ¶! *@)Ç#ÇÖ+tý;}¦¾Ò¼Ñº(ZO<.æ*¯@iûÅHîù§Ãc„ GI Û>4‹i«J¼“©ß¥Byç!¦F›$íü'_ˆ©ˆè÷Kè‰åÆ/Èžÿ8sþi›Œ  Ç‚Çã‘g¶+$wϦu¦euážø/(mª~>¤µ­Î¨í°Rò,.µˆì$˜i–´v–<ž_ˆÉ<œzòI@ÓæÍ¦¾þQ%›£Qlòzµ6Övµ=V®ý}ûöÖ¬YcjŸ¶yººº°cÇ­­EÛe,¨h@¾vR±H¥A J í,Ú&3‹©¯¯ÐÛÛ›÷üS’ÿÔÔDQ4m;Q¦#GŽ@í=‹¾“qpœË &ÏÄóét:GÀ(Ò&Š@T½?U Våïôy¡3¦mf³ïÁ´½ÅöÁEI4ÇRßAk9¼Uü’t¿¶~õÕxõÕw˜4w9¿•}3#¬¾o°}Ðfï,çRù³ý ôy˾û9r䜈Ÿƒcîàç2ðÍŠ>óéõ.Iûððýóõ)"âýŸ‚ÛíF:vµ´´ÈñP»ŽðOÿ{½íð©}£GŽùSðúܼÞ\ŸÂÃ÷g¤}%‘ÿ)!r`@B´[O¶V·U´mTŠmI’\òàà ºººù6¯’ÁeJüfQ.¼]_0+„ @ŒMmík¤u¯) ¡s?€¥'&Dô÷_ ·;;³¼Ý¸=Ü#Ðã!x¤{ÒèÜ´ÞבÿÙØœöÁi”RþétÚå÷÷˱Xüþ~˾XZO‡‡‡100P0†—*‚ IµÿÆ¥ “ÑöBäPƒB5 ½ ø·ÐvM,ôl}aÛµðÿ|·_k,\¸P‹ÿĉNÆ/?þ4}ò$\J'Ëòï;ñÖ‘ ¬½ôjì:.`Í=Ë1þ£ÃÊÌë߸OF „èÚÉ’:ÖB%é£å§¶W~ªEÛÞ¼é>¹D¿\7õ=+?Õ›7ù©Þðzê(~ ¾‡íhùÀŸ?¶ó—_ŽÎ¡…xªW!ŸßÔ÷,û.ÿ±cÇpÙe—áškžÁ÷¾®ûo7âÌ»oC–årf¤wmÚ´IÞ¿?Ž;†Å‹›ÆèÐ!Üwß}ˆD"0Ùoò¡C‡ÇñÅ/~{öìAW×TDî¸ãŽœø+ÔáOmQ„k¯üT ^cÌò€††À%—\BÉ÷l^UÁ’%Kàv»ñÓÿûGø‡K.©º}¡•ÿ° |ØÝ¦‰ ŒÙ¨&˜ß3ŽÓýÍø±,Ð:6Îêø¬vÍë!8Óo.Tîú8í©þøá7.ð>›×Ùù \øä³a,8`ðþ^¦eó˜.~xï¯Åü“1¯³ Úù¿ñá×õ{2&©œ¹ ‰yª]tèFΉø !ò7n¹ðøcHÍÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ17ð Kþ§ƒ»Oþ/&…:¦úã?(, y¥ŠŠdY‘H€»!â‰ÿ²ƒ°p»5‚OE„ª-|@Ñ—œ„K‘l¹¢Ñ\(ù¿Ô•ƈˆ@ùhAÉýDˆ g똳ÙÙEEeÔ-éI<8¥t.Ö?Xx€ž w—a&£ÏwA¿ß™óÀæ³.¥/—QñŸ%üWʇظñ|ë ‚%ü—ë{l0e´«=èpììñ=1½mV@Ýï¨í|¾DIT_ÇõiY©¾Ðk·G’´™])ü†Š#Õ‹ýÈ‘#ºØÙ°ê~Ç}ÉWu‚È­ƒ£M֥ʌ”¿êÉÀÕ¬‡ä™Gu¾°‚€žð_Ž/:›; ³¡î=,á¿›ù|F£yŸ¿,á¿\èu¸cÇm†Y VÐþ˵k•OÔ;+ îwÄJþ§dÿááa´µµY¦'„Èô* ÐÖÖ&ÓcåRÚ#uÂ)œDu8•³oAðR¼¯Š°x?t\!ø/UÒ8:®‰Ê \ùìIûÂê ùUV(Hj„B”‰¾`LKãmmÕò¤„n6ov€ÿº‘‘šÕöÑò:~ K““X “Q®1#Ñü ï ,ë_Š 3±AX„ƒ°2–ÁÒ¤$'q´u€‹‘”Ôðà…§1ù»qS¡—÷Zx—ÞK:€å<ß*àGÆ133£ Ð|¼^¯ÌŠ Î‰Ì똟Wô%ÿŸ d“YÜ(<œêi@S¿¹@‚®ðžb¹¤KÇ#Û]0"N»Bqô¥ÑÙ b.@áõˆÙñ´2˜òÞÄ ;ИxZIë0ZW{a%‰d$ÿo-Ä`w–.Á糬¥ N»ÂÜ™Nã¿€…Å56ó}¥ˆ´Å AXöžU.Òé´Ëß—c=>tv…tšŠP«¬/#ùßß·}þ/ܳӖ¿|q=€ ­ü”´ÎBö8ž%€,É¿>a!ÈX.ìöÍ÷Fòÿ׿þõ¢…X ¡©©©p"(ýUvÓÚfD¥ÈÆ|ÙõZ²ý‘Ÿð윤VMÌ•òjK†(e–óJùQ‰÷~*ÌÖ××§‰x<ÊÍ?ªƒ(N"ªÎÎúÒK/᳟ý¬öë4Øw9ãÿróÎ7{¹1Jþ|> Ž!N«ãíœ#—Ù ð…fŸ2æmVVV(&~JþýÚ/áj<£Èw¼¹û”üO5ŒB´çzùÓ÷[ú 6¾#ŸñspÌM|Ó¥ˆÐÿ΃’ÿçu´àcj?‘§=>7ROõ é¦~íZJ$†µc%¦B.Äíª 0ÑÒ¥žêAd0 Ë(yžìÈ@Šì!kŠn+P>„žËö‹6”m•`m+¿1ÿ«#@ÀÂI2~!x<žÜûæG’èèL"n…Ûí†ÛíÖÒä{Ï4Ë‹ï“@TR½ßÏ©{’$¹ìÄmVÿˆÚwœ Ih…„T4÷]ÎIœ„Ç£ߺÝîl7SþÆ4lùËÛ〦£üÒK/á†nÀæÍ›144¤+ÿPC‚χŬéÿ`_ÏóDE UŒÇDð¬ D™ŒÈ WÛþ† ###5±Ï~ë:ß°páBùÌÞßæ]ÿ9'³–ßüåÃ'Ë'ÿë0ÿÔ«øðÏI ýOàø´ˆ±Yûþ—Ç_oÄM}Ïjé$I%Í¿¼O‘Ø}jK6ŸSïœÁ‚¿˜W®;ùDä§zoÀïŸ}¡\ò¿†wNœÀob"yßþ¯§.ÇéÃÿ~íS8}ø?¨JüÇŽü_†]ÿö À=÷> œy÷m\vÙexûí·Ëuɵzõj+ùرcøþ÷¿_.ù€B ²ã;;; I{@Á<¸ãŽ;Ê1Q2 œçÔqe¢JþWëY|®Õ«WˇÂÄĦ§§•Œ²Â VÇ9W4•鸂™™<òÈ#8tèV¬XQ ûNB€mÛ¶a÷îÝ_·˜ššBB!ÿ›–'D9Ü/àz·ˆ½!#¼8+ãO„ƒªë¾öEˆ÷OB•È6ËOß—ü§ðÍ/_†Ÿÿæm$“Ѝ¨ œñß'‹¤¦+ÙJþgAŬÿŒ`€ãí¯îînÐf§1 twwc``€ý_”ìà¦å˳3©S*@IþÆãW®\©þÙíêL•ZÞ4Q+?N…e•:áT™ŸÅûÏ/Î ÂÁKe¨"TT€Dݹ3«ˆÿ€Bþ§¿t°#½ÆõBæ¼Â½P;h’½GhÏ1FؤA¨ÃÚøÅÈd”Ù¶éà»+¼'ty.ë_ •¼®”çuRTŠÜÓֳѳ¤ýKÚ¶ÂuÿX I@ÛV`øN466bjj 333¸8)"±J–G8 \œÑÚºÉd,Ñß,oºnW€ÞËO²qIê,jì:°\ý? Biä;ðxàR ÐÄhÛ ÐÇ¿{÷n[¶R©êëëé»–ö,¥ßE|\[¶l™FH¤ï_N Œškƒ«ŒDʾ¾>­½30𻪓á«MÀ¯åù0Æ d…YhuµåñÞ…/þ¦vÎÅó@íôööÊíííðx<èííE ÈŠ °{àkù›pß×¾VQX"²“åÀæÅÖ%Bˆ˜Õ‹Þ >_ŽXS`6 õËëk1}Cfi !2+ÂIÛ\l¯£™`S1å“/~ú]…âõk¿„+_|Æpüý9ß]Љ?Ÿ}³^ôÑëÍLº«Dù0åÿ9ÕÓß1©º+XþFÑSúNÌB}6W,~i}6~Úæ“™ Hv–?ÇÜø¹¬¨â_åhV®·52¢Ùë…’º#ƒaôøÜÆ‚qO @,†L\Ƈ¢ 2|>E ”’”{|nDúü€DÝ2Hñ×$%8G»•÷¾(²ÄÿT” Õ§-•äL ÓF5kªmv[¹¶íúW*¼T{ÝÝÝÚûÝwÞ A‚û:€ O¢?îÁÖ­[(âu¦eàñxä¾¾>@oo¯¶]’$W*JdR îѸ4â&„Èë_È)äÖ?§}ò !Ø!DîùMv‡àwNùc†4ºg`,Ö£ýúýý–¶Ün7Þúõ&Ät?½6hüCCCؼy³ÎW{p:D1áUôõõ!©~_ðE³ïL¥Ž‹)çør I’keLßXÍw!I’\###2ÛRmûTܺökaʼn'\ ¯ÿœ&(¢t_µý±Â[G²c´þbb%ÞYò+ü[j%>ãú%Æ<ÿ-WZOxçDöÛÚ_,\ˆ×ßÕŸjqÌ·¿^s&2Àâ÷Ͼ€Ëïøð­°ÉQ¥á¥qùòàø‰ÃxñиÖ}ÿæ/¿ßÐ¥Mì߇÷fÿœ“ÇÁƒ—]v™#>-Y²Ät Ý÷¿ÿ}V ,üéO ô¹B I’öûòË/C2Î ã,d*&Ѽé>Œýü‹ª?‡ÆòåËÑØØˆK.¹.— Û·oGCCV¯^ÍŠ&Tõõõ$ +V¬@GG$I¢“Ì™ëܲ×ëE}}=n¾ùfttt ±±„ˉ£Ìp½[z€Og€ß«ÿ•Œ³"~ÍßN ݾ¾vûÿå_~ðÍ/_ßôG$Ô[’*„0çãoO†ñüßq hO†ñ_8 ,8à ·Xáƒ/®Ç_¦[šÐ0¦Ô›é–¦³"þ~ 4¸pãÿózI™P€`Ô‡D‡ÒÁä4×,~Úîù—‡þ»÷îѶQ1€Ç{ì¬Óâàààààààààààààà8p >PU×]ÍÊ€º ¼ûoÊ¢²/GQ(ñÚšüŸ0,YHÒýꀴâ™”HšJ¥r–úúzÔ××cÕªUhll´œ P>è–C¥¿ÚÛÛuäò¢[(–-[†eË–iÇ•j—…Jô]$U?6N ‹Pê}>è¯Ãˆ„Ešp€XGCÍHà-xÓ"’¢€ˆ¸qÄ:eð}BœM@œM³j¯p]':p«Bú‡rŒ(*Äÿ-éI²20 }ØÒ˜„èÊ%Ú•V.“º_ú¿³Ü°„öcx5A‘ûýʹ¯EÇ'µyÐ_W•2ô€BöªÕ¬FT¨NùBä©vçÛ ” BÅ΃‘kÜV+2%DVÓ¾)ù_ÝFñѾãç‚"ÏlÉýhn¶­Z $ŠWï½·"upãÆ¦ƒåè¶;vTíDÉÿ¬ €ÓõoåÊ•ºõåË—£¡A¯ÞCÛ7T4 ¡¡A(B111¡µ—è€)c>f$ɵ x)èÂÆGÅX¼ÿüb¼ÿübKÿè¶:áfÅ–6Ù6%W»¯{BK#¬¾@#ÿAïT( S>Éÿl^fy°DòaVÆf‘N§]’$¹„$\fÂBËú—"kÀÑÄ[”çñºÁÊØ¬&ÚÓ ,ÂA]Ž8€Þlà/ûmý/û¼ÙÈI— Gð“ÿWD2¬ ØIfff´Y³%Ú…òî±Okãe ýË!Iûp&2¦#ÿ³ iQ¨l[1ßµº6nHˆˆXšœ%ÿ¿™X@)ÏÑ& /‡eùŸâ ¿Ip“Ü< N»Bq6£&%öY²ÐªmÂ=ùŸ¢ß/Áß,•}_"„È!Fx¢1ñ4`ƒ°¡& bxHGþ§ˆ‡üˆ‡üšýµñ‹sÒã%ÿSBÿ*¯€~¿„ðÏÂ:ò? –üŠ{lŸƒŽoÑ/÷k¶ãQ#ÿS²™p©€Àl‘ÇC:ò?E< –\öétÚöx4R«ø ³Í/Iø5ôäŠaI°”=ÿa'']°ï:Óª˜› éDœÔ‘ÿ)Êy'H§Ó.\%íC#öÐý^o»rþ;uä,ù¿˜óú»ßÆ‚ìù¿àŤFþ¿pÏNÀ¼Ï_…_ºóøSùŸ‚CË`Á@N; „/ÚÎr¥•í®f…ô¸žüO1³ERDJ8øÂ¬ÙÏŒŽjäÿ?ªÂ^›¼^„DÂaùŸâÕ{ïE((Éþõ×_¯ýëšý±±1üOÛK—.Åàà öîÝ«#ÿ³`Éÿ½½½%“Xò?@¸dÉìÞ½[Gþ§Äàà ÿC=”“&èsSm²¢—õõõX¶lR©”ŽüO±aÃm)§/жs­ŒùöUK–,aÅ>ç œìÿc‘ï|T»üÛÛÛuý¯¬@¥ÀÆ×èÊ8K’®Üû8[ÖlyBä÷.DÅË^’$×ÐÐz{{ eûaI{ïðnq¦Õ „ùH8Èà”ßÎ4Ë?ß~c{Ëj[1yÓXý§ ÜkÓ¶U1yëëÕWÿ…­mÅäYLZãû†Õ¶bíSf”üß¼ û¿Ô¼ŠõÕø¼µÚVLžÆ4…|ÖÈÿž\Áðbóâà8{@ß5^“•Å9°ýº€ò.ÚWúÌ:º:ù‘Éd@Åø>]ºßaIB&“A<äGGW' ?žÑ½{mØ!DÞå{ýuZ_L`@R‰ÿD ûwùÞ+é:÷x<òúÞ4Ö÷¦5²3!DN=½™çþ´ÆÌ6ÝŸzzƒ©í™]7ëN!òÖtÃ’„­iåeX!ƒ?· £Si÷°iʹßQò? ¼OÞyçJj]'2q ™¸QTáwÞy§öÎÙÝÝ3ó|!Ø­{TÕ,î“LYõÏ)Þ\oŸh—G¾þŸ÷ã¾û#xæwÀ3¿Sg35”?mÿ}÷Gpý?ïו?%ýç#ÿ¹â¹F_bë㈭k×ÿ“O>©-pý?ïMãv»!I’kMÿð«_ý 8&žB©ßŒéûM<äýî_Íg9kŸÝFï9•ö…‹Ãncû9ªaŸ¢¤ß¿†‡‡«f¿¯¯íííëc°ÂÂ… å… Êÿ>9©Ûvfïïpfïï4!€rÀ÷K„<¾ý;ÚÊ„âÒ+ÑwÐÿ£gqóO ý[a¬¹%gp×M}Ï⦾gÑ9”DçP¯¤^ÖÄ^C9çjÞ)óùË/Dzßÿ¡pÂüÐÈçÇ’oઋßBâÕ70~ä#H&­£ââ{øî/Þ ñÿÝM~Ü|óÍÚÂÞ <ˆ·ß~ÇŽÊŒÿ²Ë.Óf·7‚÷Ë€|èÐ!Äãq¤ÓièŸJ¥‰DFµ_TŽÈªÕ%¶.R¨çǬ eµ|155…©©)üéO‚,ËØ´iV¯^]IŸ@þÑ~ Œ¸ô±cǪQfN•H$0::ŠmÛ¶éÄàê«·åFnÒï]À_ÉÊ‚³$~êïïM¼UG$˜ÆÿpÁþ绺‰0àíTœ%ñµvbrK÷©ƒ_êPåç!âÖd;\æñ/~ W|¥a,…é–&L·4gIüOßv%ž¾íJˆÓ2}Nß9¤Š˜Æÿt)ñ¿äRv‹È …7r-¼‘k’ÿÿå¡Ñ‘ÿ¿qË-`ÈÿÛӼߋƒƒƒƒƒƒƒƒƒƒƒƒƒƒ£VИ@’$¹ê$¨èô¸š•ßtð7” ØáR—JBP9 `›ºf#¬)E Š!•*À~\dÉl”ðŸlIê¬@±vÍ@?ÌÛýhÜ—œ„(N"1Š6äGoåü÷â“ðîoAD\ïþˆuc bT1q6¡’þß–´bÛ*P)RÁÈ^ÞtfûÙ9C¾®J»š¢€r}¬ ŽWM€%ÿW=’õ€ë|ûªI’\¢(:&Àý×¥HNm’@ý¯Km½\»FÔYe5’;ÆI’\¾`LG€¬ˆ‰ €å †ü_ÿ`î9°ÂÌ–ê×E* I’ëê»ï®˜(À¹ ÚÎ9|øpÎ@åË—ƒx¢¤þ¶¶6-KøïííÕ@!ÿ[ ü0‚Ö±“ !ò©Ðqœ ÇÉ@¬8€™ Ðô§BÇd…ê„S`ó5³ (¤jº¸¯{âþá¾î „üMù›´c¼­­Ú±¾` âþu~Ðý,„Õä¤c1-NêåF1ƒµqe6ù7 5B:Ý®ÌVŸ Pfì™ÕÄì\»+%…ì9>>®é¶ææfÔ×׃! G.NŠp‰.#J›˜ÝÖŽ•?ÇnËÖ3›-1<LÉý„,bÈÿ}ÿ dn=·¾ý9¯c>ê¿Æ¼Žù¦vvùÞD kÐÍòä'8Úº(§¬)z: ú´¡½KÏ!}v;؈~¿¤›i“ŠP¡ ÑÀ÷“Y‘€Rm{<™’ûGÄIü#j¼tøCü4-ûœœòÞˆ]¾÷lûCëüh¨Éý Ð(¤~Ú,ðt‚‰² :À—Q–%þ³ÛÅãÊöh]T·®íÇj96H³G’ÀÎDÅbê@­qCzšv˜™éæétñåß$aZœÔÕqz&èù7L‹iqRk‹9<ä×ý4qzþé:›¾Xx<yfû¨Fò #þ³Ûϼðµ±Ê IDATàÔ3êÖ)hZz< Ì(rª»Çvù{<™’ûåq¦ÿÙ_ÉN¢[g÷S‘€b쥞|R#ùÐÿÙíÛÕ›QP¨­³û©H@1ö÷íÛ§›Š%þ³Û= èêêÒ­SìØ±ÃŽÉ¼ u·»»[Ÿ¤ ¾¨ƒ"sf´¢i©p455áöÛoÏ[’$¹Ž9@/ @÷ì¤ÛÙ´,èÒ©©)85@ÞãñÈ,)Èãñh×v¾¼l³3ãÝw³ƒ»»»«B§`í˜ý¯´ì½µåÏ–}{{;fff´Â¬€ÓçÀØþ•B>q!A?!"¤Hö=³ÒeΖë_óœ­Æû&+ú*Š“gªmA›‚¯åâg‹ºñ³œÉ/ßûX¹0æ•ïg€g¯k¿aæÀkçrôKúúh6£¼j­í›¥5–ÿ€¡ü›ã§ôÇœ¥åo–Ö¿´^¿ìÑ· è„ŸŠ‰Ÿƒcîƒ~cf©Àk20ëø³7N»‚±"ƒa«û¯@y'o ªÂ–Ázø™wta•‘Á0‚±”#3Ъb{Æ÷ðÀ€„À@öž@÷¨ïߥôýŸ»Ho;ÔŒðÏÂ9}0FÛtøgaŒ†šËîó2ÂãñÈ=ªèá+`ž»&dpºÿ×PÎS9¾ hËúõëáv»aØ:…å ¸Ýn¬_¿^—Ö ˜Õ=­Ô$nºÏÉúWŠ‹º‘Éäö±Ç#Çz”‡[Ëß\‡±ß>Xå”ÿõÿ¼0öÛçÐò7×b=J_—1þBåáBnŸ½Çã‘{\=ãqDiuoóæÍèëëÃæÍ›¿ùí§y<1G+Û׳dÉ8p¾¨ÁçÓúí–ýæù‘H ¡'FÐï—Ðï·ÿ­Üo€Ô>íÛeÅHì|[(×¾qÚ¯###·O…(©ÐµñX¥…çúúúÐ×ׇt:¡¡!Ðò¨Æû&%þÿûä$Ö¿®\“”øó®ÿNœ8QNü®+þÇ¿;à©‚Ó ®Æ[ï½ƒéæ¥xög±uôC@!/²KŽì²uôC$QëSïœqÌ¿›úž¥ö4ÛßýŘ¾øBGòçÄ Ì_~9Þ˜ý3N¬ÃމYjÏvüwÜqR©Þ}÷]M¸ý²Ë.+Û··ß~›6m¢ö4Û‘H—\rIÙùÓä‹ß)È [tĘœ{ ×âÅ‹5~ú½ôðáÃeí¯äµîºçž{ð™Ï|F#ÍÀ#ø^}5§îQ¸:a~Î΄µägMüŒÏ:¨_äMã¿­_‚»>w’„lõ;{âŸúPÄõߥ>»JÆ£­C˜–Íã?vG§i†í¯ic*ΚøEYƃc§sv>}Û•€Åùÿ×ÁNœ¹@yæQA$åãþSË»Z }í߸å|ëöoá[· ?ö˜¶ÿñdzMþÿÆ-·ð±`5n*P:`§þA²SYäqh âꀟ '”Å’°OÒ+&X J$mjRÈVÆÁÏtp3E±3‹ÚøM~C´Eú²éËšššÐ:ÖŠÖ1kb»“"€ù̶,…´ªø)bãÅÕ‡-éI´ø3¬0ö IQ@R ÖiÄQÌÿ)ÙÿÁ)gHÿY!ŠêÃH‚§ëµF¿_BO,ÿ¹-f€@) CJø§ëÕDµHÿ,(ù?8mM¼v=†Á¬ýŒ27‹|ûª:øß)€|äJø¯%¨ €Ù¾rEÌîñ”ìoµnæÃõ‹5m –üOEÌhû¥š „ÿJ`ÇŽZ½Þ¸q£¶^c@’¤ÿŸ½oŽ£¸ÓýÆÆ/[5²-ŒyÈ3²q0†µÕc/¯€Äq²ÀLäæ! ån–Ý{bF+eO–s#Gƒ“MÈf’²›ÀëÍ `¤‘ÍÃqÜ=rãËš‘ÀØF²4-–}ÿ¨©šêžž™ž—!÷ÎwNŸ™®®®_UuOOuÕïû~¶7rBT&ç12ÿÐÐ'Ý ÅÉÕ(//ç!u„byÛÚÚ¸S”x&''ˆ|ÉÀHÿ%óŽ ”H'xô!çÝÀ8éÿ¼ã¼ë„XÉlúÜN>~bpW©¨õò{axaøÜNî §È j½H€Ê®3PdŠ@ZŸuŒüÏþG™£Ý »v»áÖr,î\ Núgäõ[‚` ±ý'³rÓýOɲlccëááaÔ `jj ÃÃqv©ªªº¨¯Ê¤‚²²2Y±¬¬ ënú2î_6 ënú2Œ811‘@jLJþ§‚ z'Fþ‹0 ™~ÿàå…8…Æ€#ÝoqÇUÖ—»ÆMÏaÿ?Æÿ!ÑA›]KQXÀ "‘ˆ-8éH ö‹`äöÉ ž“.*g:ÔKÉEµùÛkh?˜+?‡¹òs´Ö¦µ#¾×°­Ó­bÀW…ê5æÂrŒüÍ>D1€=²’QôwL @$þ‹`äöÉÀĘ£¯gÚcÚ¾T¶#‘ˆ-èp$ûuõ‹÷†q;‡9Á³Hy©`V?ŸSÅ€SÕ‰‘ˆHvýÙŒÀð B™´ßt$ûE$»þâ9²Ü›õõgb"ñ_#ÿ³O&ÀÎÚ2©i³È® ŒüÏ>D1€Tç§x;‰###ÿ³OQ `+{…J&l¼ÀÈÿì“AA[[[Úëovz<¬_¿žÏAÁÈÿ~CûY}ÙÜц R™NH&ÀÀ޳O–Ÿml®,›¹(ÞÓÔ½S‡ºwêà™ö€í³ïì'žÃ¾çûý8]y…x·B°·ò\ËG=!ÚMÿº Æílô¿Õ²òmSUUÛÛª4Ú¼—@u«P}*E‚@!¯…ø¼sJÅÎ)„à’s ܱú?—)!šÏGçe ’TÁ‰ÿ¬^Ró!ÔÔH͇òišÛgmê$UUQ°y§|´—ͯšÙ€ÊöʤçE˜Ìηú{H׳¿ÕtµVú&]û;:’_Ó}ûŽ™Ṳ́ýéì/úBGRûfï*…êÿÕ&%˜¥eR&¾ý·ß~{ÒsÍþ£ Õ~³q]º±^¾×¡ m£h¿h?WÙØœ^ˆ§ç_@UUN‚¶Ûí¦yØÏÏn·sòu®ã ‡Ã¡µÚéû» ñwkŸS…=á[ØO¸Ø¤Œ¸LB«ÝºàC÷?€¼‡~÷ÖRÛ«\ŸWét›ØŽ .rIüÜ|‰ˆdð*Äç8ܪš@gbLÈ_FÏÔn4Ek­Ïa £®®Ž·×Ò±O]]Ÿ'eyCcï‚VÞIÌî=UKh7[Ïçý—K‚>7ŸËJöû1C­—à×\©Kc€öÿ|OâØ/®¹îN‡e;"4˜Oº~î•Ϥ†ìœRÑÛÛ‹––ôööbσÓ='!-tùW­Z…jQ(Ø/Y^7çBk½Ôz ó]VÀÊÈöýÐ]Âí‹ëûV……YÙÚ¯¯¯Goo/z{{Ñ××Ç÷õõY&ÿg#‚ÈìoÚ´ Ë–-òeËÐÐÐÀ744”üÏì766r1íÞÞäs¢ùÆüùóµùóçk§wìÆ§+*ðéŠ Ì¼i5?>ó¦Õù ÿsŒ³¨é™>«5Úð–oÂyÙq8/;ŽýÓªOÉøÖ§?u}JIÜ=ïoP1R¡~×qxË7±÷U£d\¿ñ•TâS– @‹‹ñãïáäÐ!œ:éÀéc§2,*ö¬fk·GŽadð¬Ú¯iÐ0ÿüË¿àÀ¬üŒÊ >|¿øÅ/°wï^àQßÏ4š¦(Ðᣛu¢|c*ò?ƒmáÂ…¨¬¬äþ^x!ˆ dÓ÷Vakoo!„÷ªª\@¸6Gÿ €¶yófNþ€ñ÷5Ì<Ÿàµ×>ŸŠüÏ`k†‚iá¶)!Àë÷k8Ýmc¤úuûY=_¿_Ãì¯Å×îŽÿd,ùŸÁvÿ?Àácoó„…ó.ÒCEbBëökš‚BÓ Œ¥+ãëO' ãñê_iÚo&ð´í_ŸfBëö+šfJþßÿ›©Èÿ ¶ÿÓ¥o¿‚(´æ0X¹8Kí'„’öï¹÷^HøÜõÚE-‹(¢ˆ"Š(¢ˆ"Š(¢ˆ"Š(¢ˆ?ø C2§A& ™Àæà¦ßÅÍXV¦ŽyÆs¨SÅ]±£²acÈÞÑ;•mEQF±jÕ*îÈÌE"ᨬ¬LGLÊ—}æˆZâ‹î‡yš¢w> .ÄŠ›‘ü£)”$nÙN¹pÿ~$NjRfŒÅvÍÖÿ{Ë‘ÅÂÍ7oÆAR)Hï';b:#©êX!ŒË#ës³Enq!ülD¼g‹øf샪ª¶lþ’ ªª­Æ›Š"•?B4Fúg($ù?¡Ÿ99uÂEØ9¢h@¡@Ñ$IâûŠ$”/ ‘ü6A%ö&ÛO…lE!ZégîCégîÓÙÿý6ý}gÜ€ó7da$U]¦îWMÓÌÈÿ…!DÛ÷ðÃXþàƒ:»û~X×ÖtûVÁÿÙàlŠB£Ôæ "™Ÿarr“““Ió3ç$#D11_ºH|Œ°?ÛOPª~UŽ{®×ieá„ï(Ž{¢(õ.À//'ý‹‚ÓJ)߬ÀU]Í7& ÀHÿÑ_Dtçuç)²ÂÄ"a&ÀÊ1öC¹T[‚ˆÿ/wãr×8n ^€p #2{]îG4Õ‘×YPúÐ^¡'“ñ #^-¤·x_E\˜ššBãÊ3ºô-;~ŠÇöŸÄ–?Õ•ËûE–S>7hä¦ç“JH!ä:“ñàŽÏBUUÛl¿¥Þ ¤ÂôÞ;ÓdÙ&&•1 ºK8ñùr×8Þ”çëÆz“J¢UM˜èòˆ¢OÙÓ°ÍLÀŒh&ºq¡ø^P[ž¹ó³èxèIÞ}&í÷Úß‹B€GŒJe‹ýžé¿Ó­b•KBõB»dˆã<‘àÏÐ 0Žs!ÿàÄ娢#—™Íü%~x'ãb;ÞI/”`Rm-¤<Ó.ô(z”´×$™€Ùˆ7@Äñâ0ôB©àp8ø{%#ýûœ*\ Ï’IeLw?›IþyÃD—§&L0©Œ¡\ª€ ЕËlYi¿™€™(@k€$ˆ´äBþÀ‰ÿ§_y“úÙ¾'¶>QlI<'™€@*8-âŠÿþD’¿fr~QtIÌqeG~`Äÿ-²¬#õ‹ß¼~?D&Q µ®.+ûŒH?22’@ê7¢¥¥ƱšUò¿ÃáкººÐÕÕFú÷x<¨¬¬„ÓéD8ÖEt4$ðûý yD!€LÁHÏlIœKJ& ¾ƒ‰çe&¸#âV <ÓK¹Y¾V5FÔ.ùÙ¬L3BI¾É×"1ÔH°g‘Å­ô›þužÿÍ'tK Óÿ©ÚC’ÌSä».9—$6Óc"ì÷“Ïy@ñš3âÿ[ð–lRUøÔ*4&T`Œ¾:x<ô=„ÿ½ÞÄyI6«˜ŒÓr±-ö+KŽÿöÄ>ϵߓ]»ÑŽQT¶WšŽÁ*Û+a|¶B¼6Úû¨"À³üfyÚÛ/EGÇ!S²?CGÇ¡¬ÚoÅþÈ3íXô…Ž”Âd‹¾Ðñÿlÿ?û쳸ýöÛSþ§Þ~ûíñíOBˆÖÕÕ•PF²ô|£hÿÿWûÓ0­Rj‡‰ÐMŸ^8­ªŠ¹Þ2¾ÃOòug4‘Èì0àTi4z»>g"ÑMNrn:¸VÑ~zž/˜xþ*—„_·-®;2°¹—|¢ÖKà5¼zŠš'öZ· áÏ+ÃÜÌgÂçvBrIV¹h­E8ÆÍ7ß Çû?çïŠÃÃÇôÖò¼ù?Ìï={mœxÏÏû/Û:H«\\’©€U}n8ÝüóI*°ÿ7;Ðwû?‡ïÕ¨N`Ù'oÄ?Ÿ¼N·­µvD£‰bÁ™‚¢­Zµ ×]w®ÙtîØ„o Ñ_„o'žÙ4 pͦkpÝuT˜¶²²RwŽÕ÷¶¦Ï~_ÆÏBCô7ðÉæw I~¯¯¯G}}=$|²y•BÚß´i_Ã2~ $ã‚ÙollDc#¥m? Fü?½c7$|²yÍ|‘ÿ tŽ ê¡íån N4L¹B´á-ß#ÿ3¬#ÏCCn ÈW;W®\º W.]Æ ÝÌ^ì¹fiKGþ€YK.5ŠXÚžn»•ƒcãã85»×Üz=.zï(®ødöígÏÏ’Ù•¨¬¬ÄÅ_ Ð4 ‡Ψý‡ÆÖ­[uâñføÞ÷¾gH»8pŒü7ß|3€äsS€ŽøÿÇ}O&ÿàïjf©É³Ú0::Ê}GGG¹€‰@ÞÛÑÑѻݎíÛ·óþSU?øÁŒBpâÿöíÛ9ùÿ“Wÿ-fžOÐÿ|`ùò-@šþgËþF€¡VÍLàãñÿMy~ùbm³Ô~£À‘gL…>.àÄÿïè¤ fo Æ_~»Ç4]¤i?p«é§m‡Ì„>.ÐÿEòÿØîø‚á’&þ¿ši_mÞÃ÷~kÓ ÎñjÍa3!€‚âÉ'žàŸO>ñî¹÷^ìzíGœü¤ŸËbBEQDEQDEQDEQDÎ2sÈ1F|S}‚ž7qÒÛê"Ur'Ïød¢ª>b8ÊÈÿfÔkH×~¦ú-’NX”³d˜;w.êÉÒÌú#U˜6srÅTâ“E‡«Þ_вPÎ"¬N|Ñ5ÖÕqçNM¾+ÑýÀ0ádµ\Èÿ .\W$¹³%HZ5[ˆ“ÿ›Ð/ºõDÐ÷¿Ÿß*¨óÜ'o™]'vœæÉã+[7KVó-Äx´¯9˓υjÚ©Ë´’'Ÿˆ h¾*Ôx‡ófW$ÿ‹$¯B#Fè×ZU‚ó5K3ËsÖ*ƒ¢(ü~SE“$ Š¢èúÞ,í/ µÞ€îÙÃö­žô¹Që Xr.ýÌ}€™×_…Rܲõñ¤ä#TUµ¡ÍËóç g›ìoªªÚ–?ø ¶ïá‡-íç æÄ½víZí…^ÀÚµkSî›Ïê•k=Ìÿ7n̹lUUmmmmsrjkkãl+++1wî\ÝX‹Û´i“.2 K+//çÑ#ÒÿÅ:ïÍøýIßQ”z¾£8Ž( Äá]$þÀÔ㎟³ývÀO…J¤€>p¯R,Š•HàwW©œXm¿ñç\À~ãÏu¤3ÉÿÉúá–à·–ÃÙ'Ž_î²%ä9Ø:‚7åùt!6­‰Ÿsºç$®Ùu î¾ûnÜyç¦b™ 5@ ŠþwºÕ”âKÉÚ‘­hÀÊÀ4˜¿@׌°éžóf~VÑ×ׇúúzîÿS__ŸðŒ·bŸ‰dІ†ÝÚÖ¦M›8ñߪý\ÐÛÛ‹ÆÆFôöÒù…ÆÆF¨Û68;Äæ™7­Æé»1ó¦Õ(ùß(h:þ|-O"¶ÆovkO·ÜŠ;š›ñæ3Ÿæ.[\™æÔãP¦é?cø­Ù€Y¶«Q1ÿ­œ*4oþü„4‘Ø­lúš¥rN;ªußÃÓm·â«îÌ£0Û¾õßohßùÛ¥¸cËèn¬6µo†cããºý‹qéǬ%K0wè€÷,•c› ­½á*9rGŽÁÅ_Œ#GŽ ÿË컘nö}á…صkÖ¬Y$iOOÖÔÔ„… âÑGÅm·Ý†?ÿùÏ€ /¼0éwFügˆF£X±b^zé%TWWC6­Í¦ÿ%Œøèï¿~ñEôÒáAªßŠíŠ+®Ð>Ìÿ;æÎ«û~äÈüùφ¦i°ÙlÉþÛ²ý=ÚÚÛÛµŽŽ”øo\óýéO 8pஸâŠ|ÛOS{Œø_^Fx®¸ºå˜Â$Êpú}§NÑçå¾}ëÒÕÍ AûÕÀÿLñvN©Øõ˜¯·UU”ü¿æ¯ÿkþšûŸ|≴cü'ŸxâcçÃVDEQDEQDEQDEüÿs²=Q0ÀÌùM;þ£¸38éÏœ´—ÎáÉÌ%¹„<`(÷ž–ŽˆoÑ™‘‰<»Ý§Ó‰ƒbñâÅ(++KˆF €c0#¤&k»¸x ÇW_N'WwŸúwóˆ0Ì1ûàÁƒ“ÿÄ…Ó>ÁÑ•‘ÿ5%NJsƒ^s¾_¥²ïY/Nº" dí÷lj“Ê®ˆ’Þãë þÕÕ2$ 4«!4%m3#ÿ'Û§ÎlZ¾Hÿf`dÿL² M~WUÕÖH½°o%O6vÓ XÉ“ !ŒÜŸöw”o€’ÿ“9OŠ"ù„™€•óŒùs%B,“HDÂ?øK#ð›#„F4ƒªª¶Zo éñd˜yýUøðSuÀ§êpþõWHOþ? „hS÷g÷<Éå$„äDäß÷ðÃXþàƒ?Œ„þµk×ò{€‘þÓí³g#©µ´´äå¹Äÿ…ˆ¸Å˜ #úЉTVV¢¡¡âqFþ7"™ÃT²q!†Å„J½ P à¸'о£üüi¥˜ú¡%Ò JôçÇ(J½ ldF¶¶ßøsž&¹¤ÄÔ±ÕvFþO‡;£„åé~ À<}o·†;£êì«”#(‡ÓM©cáôr©+Ó°q!U³­ Xûí1òÿ%®&œr¹pŽgå IDAT,£[îAóŒøTt)++ÃÃÕ’‚nHhîo‹m¤p8Z$ò<ߟÙ4 %Ò L7•þ8ÙŸëLÏ'ä:êê·6ÈŒD"¶Å,Z—èä5Ꮊâ½ÉúÚL@DM˜`1²s‚E¬ü ‰Dt¿qQà+èqR5P[AÖćFÍ+ÐgBøfdo3"8‹Óko«=¥»—‹ Ûçü|ï_°ÕÄ´ÿÙxÖŒn,7e†$PŽ*¨C'þ£ˆ1²¿™€™ý~G¿Ö¯õýÀEûnµ~ ×?öÛ3``ufBµ‘~}Ä<±ü[‚Ý›ÔÏÝ¡kƒhßÊõÏíDì·%”‹ õëcl¡¯ÿéW^Çûk>ÇIü¬/gÄŽ3²¿™;Ç΄Ö|³¾óC 6–K‡Ã¡E\Ø@çx…ùT ý*Tت€ˆ+‡ÅßÿYFk]'íïFö7Áޝs¹Xy–쌌`Æ œøo´/Œ£R–“ÉýÕÖÖÆï¯~A¬Àìþgd3!VgQ`ûöí ѳ0§”sYéà/ñsáRm­. šÔú%´ª*¾qnü #‚³ë1gΜ’E!ç\!Ú÷1b†‘øÏ ˽)Õ CH[›âÜ+é÷QÅ%Ãv÷DuâXù‚Ø÷eee˜šš2„*Ä5нçD@ÿJŒ"€Y[ŒäÿC1E†f:ïRÐ÷t#™7ÙñB^ƒõë×Ãn§÷—ÝnOȦlQÄ Y‰ž*Û+¡tèçùEò¿©Þ›“ioÇ¢Ž ··›Ž¥*°ôýœ!›©ÉL ½ý‘Ñ_L$ÿ[±aFvOg?0Là~¦‹¾Ðå}Dò6öÍòÓ+ÚÛ1ÖÑÝííX¤–cìÿƒâÙgŸåD"ùߊlÚß¾·‹Ø’Ü€+:€™·ß*TUµmܸQët«úh4ZYîÅÔ¶»°ÑD€8ß`öUu 3›h¤ÇÓ='q×]à"Ñgþ$I|mpbb?ùÉOt‚¸…¶ïñ¨ðùèû´¢Œaûö»à÷Ÿ½þߤªØ³ô–à®»°1ößGÑ6©*ò2þ£äÿ GA­ŸŠlÜH÷÷ûö+'€í@‹¿%&P"Øü™pÏ)ç¾QUÕf·Û~GÃÂñlÊu8Z][òýôÙ^G‰÷umtÆD:£.*Šé1Ò?ËS×FóØë"ºò\«€þ æï‚®UúïÒêó€¶|ðÖFà :ðTl¼Ú%ëÄ}ÁxžÖçŽBÙ *\«ÿzúŸàÛyÞ“ßô9õ*¹N·vô¹!­r! ÀÝé@ ›½«b" ­ÂttÞ#2¸²‡ú/0âº"+œø_‰ èp¤|óÂWé\&íç\Èÿ Æ{‰£Rlæy²-?_uˆD"6wgP‚h­µSA]A€A_H&¼ÀDÜtîhÿovbYLÀ–Ç(>Фïã©ÄØÍÔ¶»P²õèè(*++Q]]ÆÆF<õÔS¸û߉èÎÿ“"ÃáXŠ»ï¦ûO=õTÊöY#ÿ‹(6ÿËÄXÝÓ•e ùŸÙ_é­/¦u\/U >öþ¹2Þ¾4Á*ù_l?›ÿp:œ Ü××—Ö~___ÆöùÿOž“šÑÐP&¾½bÅ 0¡ì†††´ö³ù]2ò¿þúÓcLH~ýs}0òÿÀ±q|úß»›V}èúô*p9ÿ¦ÕiÛoI$ Û^Ôù¬aÅuW#üà¼ì8p‚¿qð¨ Éó˜e»:Óf&Å•K—éöY$wv,ÙÛìœý?ûG,ûÒ€4Ôoý÷Zwc5‡ÞÀø’÷pj6]»¼8…«àœÂÜC±±Y˜µäRÌŸ}ÊÏY#³OaaõRd¬Ü9shù1âÿÖ­[188ˆ•+Wrb?û4~Åää$Q^^ŽÍ›7§"ÿóö÷ôôh{÷îÕ‰m¬X±"éIv»Ñh{÷îEYYìv;`Ÿh%ú›‘ÿ÷¾ú‡„{¶ïî·Bþg°-\¸P;pà&&&011¡[KåB‡ÆÅ_œX@œ˜›ÍïßÖÞÞ®=ú裈D"üš­ûŽŽŽâ¯þê¯ ±yófH’” ȰpáÂ\ì›A(Ñß Û·oLNDYYÔÑQLžO@NNA=ŸàÒK7Y!ÿ3p€ÿŠ$Ü¥IXcSðúýNw›'äµýÉì1òÿn 0“·Hþgà"Ï›h Ê2àrJ0- . ×ö‡´VBà lºÏ¦éߌü?f‰üÏRàÜ—úñá§êð´í_Ÿ6-@Èkû•$n$þqò?Czò?Ã;¶ÿè^¥u;»ñÛºjH  ¾'Á v* h‹÷ÿ.åöü@Ç.O>ñ„¶sJÅeðÖ Ä#î¹÷ÞlÍQDEQDEQDEQDEçéjŒ M’$N¼^¼x1¾â„l1ú0‹~711‘•ØŠMBˆVë—ô$έ1Ò?C­Ÿ¾÷u‚NáüLÛš ¢€˜ªª¶††ÝØ” bóæÛþ½Oê‡ôÙ㉒AUWx1_U(Êã$úÌY¡èÓ yo¨â’<“ÿ}ßÛÛËçHx$l‘™Ïk ‹V.Mu©æ"Ñd%ŒüFüb2*d2Òžx-­—3­OªrÅþô¿¶ëˆþ,M¼ÿR Íö3ÿÃþ¢ŽŒ´·ëÆ`Æs“E€·Ú~BЀõ&Dÿõ±õ—ÌÛŸ‰ýÀ0ÑÖ#Q€Œ¥Íþ>¡ßëè@E{;Ö°ÿ™˜³Ñßøß[èöÛ &`ÿ¶ÒþLÑ ºÀEpÒ rå„Tà8¢8‹*Cg”œSéñ<±ó\«¬Š$”eiõyºýî€h?-ϤŸ{d«\æk<,Oççp±iõyÿ©ÍÈßñ1ë˜Ù´ ðSò<J _åBOW7:ï̈ީ®A22¸Y$úH$bsÞ÷ï rPj/6ïÂÜ,1œÍ…2´ª*¼0ìÁ(œn‡öâ‹/æLþ×c3â~R× @¡A‹K·Næp8´ÖZ;'ÿ‹sæìž`Mß™ÍñÁ~2ñ&hÅP›ûådþ§Z˹؅H¶{Hþ€Ÿç­ð¹H_Ð={ö`Ïž=_{U¥þF”T °9]qþ+ß`s~Fûf"®…ðw`sFûN“wn1HG>í744hòx𠿈 >š‘kdfhhhÈh¼ÅÞ³í'·¬Gã-4(`†ÞÞÞ¬Çxããã¶ù7­ÖŽ£fÞ|àÛß#þpzÇî´åÍ¿iµfA€“ÿ`Qå1l;zÕ§d„óçÏÇ,o½w ÎCÞš?(]¨>%c—²« Œ—á×@–Dèe_ú¶ÿgÿ@Oþ7"Õ11ÏÓm·âŽ /j)ê£}[ºãÇß‹'„†1¯â$ÆË89t³–\Š“C‡0¯â$&.ýÏ7UæÀÄô8z «—âbœƒæ^ËÄW#lëÖ­ÓÉ|ëÖ­ü€(ºùë_úA*.çd@/þþî»ïâÝwß@ ÜwÝuWÊö{<N6gþ²²2.Àæ9Ùw‡Ã¡#ÿOMMaïÞ½X±bV¬X¯ýëÙ¶Ÿ×‰ÿÑ@Rñ‡?¾±?AàÐ;g²2»f1!€¬Únô›dä†H$‚H$‚Pl­[[`ÂW\qEÖöh›7oF8æDP”n!Ëßòo6Û*8NJþŸU†ÓïçïÿqG”Ž{KbMj¿fL fQ?&sûYyŒè³¿V!|}éC°w µ…yþåË“ˆžš…ó¨èÄ‘gâÇ{;^áX5cB9·_Ó †mÐÐ5(céJºLÈþ' £´€Š°ç¾Ô¯ÛÚvÈ4ˆ äÜ~Fü7#ú]¶I´hå\@AèXY뎋z‰"¬¾RÏ3¤#úïzíG€¶¢7æö/ž|≳â?WDEQDEQDEQDEa†ä²¾1B4ÕŸ]´EGo·÷Ejô ë>•z Db”–'CdK ÂŸ\Œ§ Ç©@K![8/µcT:â¿™ó•€U«hˆƒ={R{B0â?9ùŸ-N²…Gõ³*œˆ/L†Ã…‰üÅлæ¶X7¹‘|’;oa©£ @.Ý…ËàŠ(xÌQÁó1(¶z¢@“øþ÷¿ŸPf7©†‚8®)ÿÉpÒL`,ý )@Ñœ*.wÙ0 h¨ ŸÂq®ˆ‘bΪó±(z þsB „äDäðU¡Æ;œ‘ðI2ˆÄþd‚Vòd3R¿ŒlßH;+÷!D[¼x1æÎËÈ*y±Ë~›8ÙRL#i~lÉÖf`"â¾1!D;Cþî1V&#“”R!Aïžëiœå'cD3!€ón8l8k!¦•R”Hz6#úŸðå"F±+0’ÿñ‘ÿø˘/ºó‹–l8m[í{€RŽp N7P.Ñè;Nƒî „ØÐVÃSvJú(ñ¼\ªÀ 0d^ˆâ– áfºÏÆÕâÿq*ažsdoÇ>àg‚S@Ç㽃3à—áaH¨†„"áÁ˜zÌoÅSSSÈ„ü?ÛoÿÅ÷%†}ÖÎëÀ"RY‰2efD &Ì@ûüìêJ? ãü™Ì ´ÞbûóçøLÁÐòìëaµžÒj_BáÅŽÌÀFÅ鯄 ùîÖífc®³—‹:½?¢ë?óú«ç_om –ïþgÑ_§ªÔüy×Àz=©ß*¹?ßö-Z0Ž¿ÎØxŽEƒK‡|_ÿ²²2‰ódf˜˜˜0δ.þâ—,E¸3þWš¥e #±°aÃí¸Äc.!Dùtߛиùü_(oõ }ù€¦ª@QOšïß>Þ†ŠKÎ%y#¢›õ}o/%~Ö××ëæ] y H°¢œ—G¼%ÔÀHþï&ÖÐÙBü=í9>€¶)öžÉµµµÈÏûgºs !šgڃюQøø ¥ý.- t(ðÀ?IýÞŸLÄÀʳ*@ÜííXÔÑáv}x4‘üŸÎvª:$=qaæöv`ùòMØ·ï`ùòyho?àÐgDæí·jß]¥bä™vtºã%¥j@y¦î*¤]kÈ¥ÿׂííëèÀnCÿ‹äÿt¶séÿÅ‹ãÙgŸ…$I:"ʳÏ>kiž3—ö“~‚v´s¢¿‘üŸÎv>Äy‚>7æÜ¼{qËúèÄgUà¸'Š?~sWô,Â#¸â ýc¡Q__ï|ç;\„ª¥¥å¬Šø|%hjCs3ÐÝ êYØ9¥âÜ7W\%`ÓW Ð1Ç&UMGÉJ0ˆ GA­Ÿ^ãý¾}øóÍïÊLÌùæi¡DDä—üÏ0løÌ‘HÄÖ¿œeÄŸ½C04ò(c åúÍËêïOþ>ÒýcJd¶×EпAoW´½GŽßçâw]¹ý­¿ ”:_ì½±ªjÖ#DcÄÿ™¾òÀIà1?»á§[ÑÓÕž®n\UU^±ïÅïIÉàI"Ñ›õ {FŠ«þ8TÑv+`¯%¼,ìQò?%#žî1d8›H_3ñY+`äñÜh4 ø½°Ûíè}íüߎ²b6â‘HÄÖÒÒ¢uÆ´¾Ù¸–Ù5[‹žTÆpù®`Vby«\¢zGæk¬n$û÷Ùx¬¹‰Î‰â<ù¨Cºõü¾˜ÔLíÏ•Ÿ:hB&HGôg~77ß|3€8Q¹¯¯//öÓýIùË_þ2`pp“‘7mÚ”±€F²¿qŸµ÷SŸú?ž‹€éˆþŒ ù«–&@Ý#¹ _;%S€<âØø8æÅÊ´Bú7žkä GÇq-€£ãCX°d Ž Æáˆô.V¨À±¡C˜UveSô9øÆô)œ:éàçÁ)@¹ ˜Ìa¤ñÅã׿ôç\È×xGFF022‚sf‡S'Ï@­iÓýðî»ïâœYçáüóâÆp8œðiÚþ‰ „ÃaTWWs€ÑÑQÝú£˜>55Å÷Åyν{÷òç@Ð4EAøèfNø7#ø!æùãûqéE3€}™‰\xá…äëïCCÔÇ’íOLL`bbsçÎå¿{ö½²²CCCÐ4-k»ÝŽßýîw¨¬¬!¿ûÝïø1vÄk€ç…BˆF£8pà@®"ÚæÍ›uÄÿP(„êêj|òê¿Åøû!:1€²²2„ÃaÌ\^rLaר ³r-aGTÂMv…O…Ï?ÔªaZ¥B9Šh§»mxý~ ³¿VÙ_ƒ%‚¿˜'Ø;Òž!~ùò$þæz¿ýìù#€‹.šcšwá¼Kð³çàKŸ½Gž¡‚š–³€ÒBø>4¼1H}v_Þ“üÛŒü‰BVÁþ»Øw«ù™0@ãëÓ¹ŠhЦ™ÿÇvÇßv*VW%=–tÙ¨_ϵý! VÒ‘ýÍ 7Ók¤hZN"ªªÚnæ«v½ö#¬ùë¿@Éþmÿô 'ù‹ä1mxØ^$ÿQDEQDEQDEQD)f¤:¨#ÿËtcä6¿UKÓI?ñ¨>•o ød„™M³@ þCIÈÿfõ~€Lõ›f-§r\$„hv»G4(Y(ùßétò<Ì!šÙ1Úcjìé‡Zâ›h7ÕdR__úúúÒwÁOVœüßoK}©ªj{¿Í‹ó7øÒG8‹‘ôQK·©ûULݯšþ“Ù*{Œ`ê~}Oݯµ€æˆ× ŸÇ“@H#„hû~Ë|° ¿Åáß4míڵرcvìØ‘U„ZFºHe[$dä Bˆf$ÿñ¨@ÜÙ‘9°|åååºsŒå²h½F¨ªj+õ.À“¯ÐqÃy7Æy7Æ ßQœðMzïÞ¡] œüÞ ‡y ¥Þ˜í·£D:‘ `¬ƒWp•C!ùßñA<'[D£Q, = Fº©¸Ò¤2†Aw j“ÊÊ¥ ¬h¶qò9@Ç&—»Æu€˜ƒd9 Ûj߃ÝnÇ »‹šÇx3ȲlkžáÂÛrÞy¬ oË=ð-¦ŽEGö\ŸššÂƒ~‚"Á7P…¹sçò¨F¸\.-³ÿƒ!f—?ÇyC†¾¯”ýC‘È9?£ !ZÔW•´œIeL·­hNüYO*¹‰Q¥‚ÒoÍ&Ãu%”˜f}êݧŒé6æøy¶°GVt[ó7šÏª}娢ۚîñžUûÃ†í¶³jOIðÍ,:XAí˽º­¹¥;ýIyÄéW^×m'¿õy+[³àã ë7Ôšç)¶È²nkjNüým‘³wÀJæˆÊ¶›nº©`¶Ì0::ªÛòàpšØüÛÄèx„‘­Ì=¥ƒø?l|?I÷’‹ÝTõhUU´µµq!”B£Eb¦±ÝþpÆ­íÄÈßúôNBpɹù!|aìû·?TÑ×ׇ·?T z D%da,‰oÄ[˜vqRùŸ¡ó@áÄ-¬bãÆØ°aƒ.MáÈÌ"–‹Xñ½Ä(œfiéÊI–×컯Á?@ˆnci,_ºò¬ÖÅ,gL2Mˤý™œ·ò«&œc–Vˆþgÿõ„è6–v6úÿ?•Ä1YZ!ÚÏÖþøZ_lciùh¿Õz^{íµp¹qíµ×æ¥ìlìÏlšõ‘ÚŸ;wîGf=$©è‘ÌØþµ×^‹ËlеŸ:I¾þ‹Klª:ï$}·×[®½öZ,”J ý_&IqUAþ/Ùsß+C÷ "‘ˆ-‰Ø¢ý°¥±<ÑhÞ0AgÔ¦ ºèŒ:à ÚJYFÛéòF£Q´|Aš›j‰F9o Sv*{ ôYufûíøÊ'üìR4¿ò?ÑZkGO}Ÿï Fî¥h4Š!:葯 ˆy?t£pwêÉàVHùîØýÜíp ®®ëׯGWW6¼Ø /v «« ëׯG]]º>7îîtÀ[Á­·ÞšÎDÆ äò4ùKÐä¾6Qˆ:8 5H. Ñm>¾ùÜNþnûýÑsž†kþy+æ{|¸é_wqQãýg…€j<7&í£Ñ(Ö‚;£Ì4”þoˆ?œð0ž—)TUµÝXŽŠs¹J(.„)knjäóaJ(7ò¿Ñ¾8'ܧŒaÂõyÝ>@Éÿsåç0W~}ÊXNä£}1°F8Ö k‹ä6‡s"ÿ«ªjû„ßÏÏgö}åÊ•º}€’ÿ9ùãÆhhhÈÆ|BûÅÜ£££p8º}€’ÿYtn16·ÕÌ›FÚIç¾Ôþ+º}€’ÿëþáäÿ“ßþf޴ڲ͇ÿ½¯†Œ_†E•ÇP½Æ…Ưvã÷/¾‚ïüú×øÏã…Æ0:ú&ÆÇÇxs—¢ú 8‚S(É;ù߈cãã:R?ÛèГ‚ IDATâ—/bûî~ܱáE¬¸îjÝ9F1q3ìÞoCÕ)úÜX0 ®t.ÂCÊ{ØzøCŒlš òŽŽá  l*‚ßMcë™ 1W=—.<‡Þ9ÃE.Æ99‘ÿàÈ‘#8sÎ…€mÛ¶áÝwß@ŸÞxçcû¿ ½‚íÛ·Ã}çmü÷1g% ‹¿Ÿd`"ZŒÔ¿bÅ øý~øý~ôõõ! abb‚…BÓ97~žX§|@$ÿ‹Ÿ"R Bܼº.c›£££ºuuö999‰ÉÉI¾ÎÊÖåEþÑÑQÝz}6ûN5M³ç »¸@kˆD²t85 cÖôŽOSòYYB¡'ÿ«ªŠªª/‚ºøÁ|Ag—ãïk˜ñç·SŸÍ¡äN•fb,}–äQ‹mö×2¿ð)Â,¡%‹5à¦ÏCt*î/a/+ÅEÍÁ;ï¼ËÅDüìù#°—•â—/S²øÂy—dnÔ+¡áA:·âZÜ)¥  (ÝãÂ'$Ê3,|ô I™‰°4+B¹`l÷pÁ_L3#ÿŸÑVå¯A¿µi¦›x,_0ŽÝv½ö£ò¿£ @EQDEQDEQDEQÄGsÒæsð9àÝûó£ªOñÆœ¼jlrÎCÀ»ë•¢‹ò4ÚÔémŠ-îê‰ÿC±c×AU‹ÂÎÀÎMFþg`“Û™D.›ššBYY$I‚¢( ª×VTUµ2Õý‘1È ¨RÐ; (3Æ áR~¼' 4ÙhHˆFâ „Ì×A²Fì^ÌIýüMy~Ö®r©Ë89#îñhJ„ͪ3A§[Ek€–!e©ükÄ »$eÄ`3PQ¢¥‹ ™’ÿèt«Xå’°GVx¿ÂÚŠ @&È5Š^L@âL@ÜA9“zäBäÏ6òdªú 8USò¿1-ŸQjUUµÕzZÐçÎ[™™‚¢¿Á§Ûgu˵lm˜J5kê`™üoUUmä±XÝêè5ÐwRε®@œàϰE–±N8.û(ÀÚÙÒÒ¢Ó2ÅÆSFïcH' &''uûK–PÇÚ‘‘îLÇœŒypÇ'±’µ_UUñ.ОôÅ=×_Чm‡pÞ ‡øŽî¹~ ÑcŒüÏõ3¸âúÚ¥xg0­”b¶ßŽã:æ›í-gûÍÁY¿Æ ýúñ‹ø›¯õx¾ ÏZ¯ùàZÙu†çûÁ ¡ØU½3x¶Õ¾‡•„õ¢:oÊócþøøn†¤áŒ’XìH÷[XÃ"Ñ(Á¢f•—‘Î)ïA{ þ×Àþµ¦IÁbb‚ÿ'Ì;²5u8aÏY–m`ßSafS, ¶Å¯ÍqO$v]O÷œL<'–ÿƒ—¦3‘„-¬â‚ ¾)ìíÖ8ÉÿMYï`fFþ×¥wæV— OEwOœäoäÕš‘ÿÅô`ö9‘?vßRûnôu÷&DwJ8§ „hÑ_D÷¿us’h—¾ Iþ'„hA‚ž'}œä¯‘Å”üÏ¢*þq’¿1Âb!Éÿ„Ðq|Ÿ'ùß‹ Iþ'„hÑm>tw5s’¿²Çpý Hþ'„h3^ áôw~ÈIþFGŸ|’ÿ9‘¿?n_õ©@0~Ìfô¯3!ÿëÒsàáB´èÀzº»9ÉÿmC´S3ò¿˜ÞÙŸ½c!DÛ¿?vìØÁIþFçæB’ÿ™xÑöíÛ9É_tFPPò?!D«¯¯G8æ$ãÿ­Ó$}®äã»…1B±¸Ÿ.zq!ðsÊ®.üÍ—ïÊåï5-Ò û¡Ðõ äK¤ÍÒò…oœ \r.A}}=.éëÃÛP z Œ" DÎ<‚w®PUÕÖ@ˆÖ¬&: vÇæVòù>þq‚ø^)FGeûìØÆ3žï`Úwf})-pi奨ûÕ½@M;öÕcXQ¹3Ì„’¾°òÌžQfÇŒv’ÕÕ­ªioG+⇫ ··Ã æ÷f|‡Ï´ýË—ÏCeå<Üu×^´·Ówà»îÚ‹ÊÊX¾8tHo']ûÍꕲÿ«Ë*+±7Ú„hú‰EXQY‰Õ@,èmÁú£ªííØivÇj¿ÚìnoÇFë Üÿeee¸ºøÁ¶|E¢‚“?Ø6€««¡›'-TûÕ:í{Ûa»?.îd«Ú÷¶uéϬý™€­MHÕT|Ë]t÷ÐO€ ñu‹ll¤³¯ª¯Xôœ„ŠWžýô=r]Áì³ùð‰‰ ,^¼áp˜‹–³Ïƒ̾ÓIEdúÖ1¸\€36×ÎpÍ)û­ªŠ«¼Jöߊ8éŸ}ßMóöÎô(8¬œ€¯Ü‡_ù¶pQöéER ÔçòVÐ êT݇–k´÷dç;­Õ @¹T‚Plng[í{˜TTÈ:£zû™ÔÅJ^ö?ÿßCN„Ãa|íkô]Ìï÷[5“³g’ä’8a߬^v»µ‘nSUø\TäºÄ–.®C¦‘èÙ='ÿWVVÂétêÞýÄwB†ðÓ­ç´F I€Óû}Á ª`fÓ}°¹NbfÓ,œVOØ U½ ÇÒ¼Ùù¨ê È $—”0Çèç}¶îþ>³úøÌêOà{ôäðÉ ®»ï‘ãc~»Ý޶H_ñM%ÍdüÍï#˜s² ¾Î~<åŠçðU¡Æ;œõóØxž‘èoKËVø5}#Ñß–fE@6ûF¢¿,Í8?“/ûF¢¿,ÍHvÞ»w/6mÚ„†††Œý(Ä}#Ñß––+ùŸ‘ÿŒD#Xšq~ôÜ—úñáŽÝ˜ÓjÍX¦ÛÎh7¯®† !Þœ‡ê5ôÀCÊ{€45ýЮ*1yÎíX¥à˜|)¤^¯>a>¹ Jì‘çÆø¿Î­'wÏ‹‰ ܱáEt7Æk˜ÀÂ{ñ‹}Hí½—>R]{Ûž#§µÕË(Ñp`ÏJBÿ pÝ'gàœY¼1 ”’¸ôØ$R€oã\Ë—âØÐ!Ì*;#³rrÄûœÄ©“ÀétbΜ9X·n:::ø0û­ŽŽ¢§§‡Ÿ{ñÅ ˆKÙ~UU¹P¸ªªÜ#¡GX‹éfÇ™À…^˜}]=žy¦ 6Û*~°|ùìßœ{î·QVVÆ}?@–eÔÔÔp±€²²2|ø¡®LKýÏ ’ý›¡ RBºñ8;öç¸8hÖ턆AÜß É ÿiŽ[ntê.ºh'û_tÑ|¥SÅcÿpJÎ-å„ÿèÔ ØËJa/+Åý?üßýò üòåID§N ~QFvMëñ}PBÿµ«4.ô67£1Ô—÷(¸a•¤û<Ï%aPjFcw7N@F)\xôÜǵÌÚÏ þþz3>Ún<ÎŽmäÄû¬ÛÿØþ“éòq˜‘ÿ`†=˸ý 3ÿ#„æSÍèvš¯³žžBs¸_E<ÀšÜœÓýÏAÑî¹÷^ìzîÛü?žŠì_UÅð°ý¬¯MQDEQDEQDEQDE0̰’éÝûè&Bõ©4êQ€À‰;„«>•=†Hü\"§'߉ŽaLÕ ªcIÉÿbË#žËĬ.¾‡ÃaÓív;6nܘq™Æû8ù”£ öîÝ ·Û ii·Û½{÷B9ª$”¬¬T÷ŒA\ÄÊG£Ý›¥¥+ÇX+íß·ïoÿòåó°|ù<Þþ}ûŽ%”¬,³ßŽ¥þ!ÞÿÕ±yjÖÿÒY¡úÿ¤I_›¥¢ÿëð‡8០ü!DËNVV.íôæÄ¶š¥Yi¿8Íáphv»R5]‡€À0áÛ—ªé³€“­M3ÐgϰõB®ãÛ–dé9SûeeeycZ—ã£/è@Ý;uXm£óºgvõ@ZÑ„_~ùüI‘ Òÿ¢þËŠìo6œ}qÐÖÛOEöÏÇ| qÄ#ٟ͇äjÓ¦M|ßøž“Šh,£åd¿±1>×i 0’Šì___ŸsûçÏŸ¯Þ±›ïŸüö·tÇSE=žõÐwLÏIíïjfàXå oÎÃw¿¸ˆ¦Ú§ÛnÅð–oâ©^à°í÷P”1œùÍJ¾wBwc5®»WƲGÿHÉÿUë¾ä@<`[ö¥àÊ¥Ëx‚Hþ?‚S86>9ÂÂ{ñã3Øÿ³ÄÓm·òüT„€âïjfI–¬ýk+Kpè3X0 ®t.â¾-]€îÆj ¾ø ðêoèZç¡wΠ”ÌÀßÕÌÀCá÷prèf-¹§f—âG?ù=&µÜÚ¿nÝ:œ:ùÈùÔU‘‘ÿú‡165ÅÉÿ[¶lÁ£±w±#GŽpaV»ÝÎÎKÙþššLMM‚O}êSüyZSSƒ¦¦&¨ªŠƒBQþ»Ÿšš‚Ëå‚ßïçäUU­d…í»“ßïO·ÝŠ;6¼¨K»cËø»šÞòM Mû5^¸Š˜3¢ÿºuë°eËNøÉÿååå\dabb‚ díÀ€öövÝsU$ÿ‘Ì_ó§?ýi¦öMÁHþ~ø.ýÃâäÿ¸ï§†~l`ðìÛ·ŽCšþ—»éï´ú¹$‘üo†îêì×82EWŠÀ>½ ""AÛ$SîvÊö+ ÐÔüÓ/Îàwè=e/+ÅW:Uüg+AtêÞyç]\tÑ.:žß·—•fÝ>o ʸ~»'þ3îýn3'ý_»J£"pµMÆ'º›ÐÛÜŒßî±Áx¼ºhªF÷ñî´í¯j ᯖµàð×õ‚Ö"ùß ‡¿þLn µ€m?܇ç¾r%öíú añÜW®Ôíõ4㢻ÿŠfáþop+šÃúö÷ÌŽ“ÿ¯íñmæЭ¤.Ò—&nJ~ûŽ—LÓS‰QDEQDEQDEQDE|8'ÙN`—IÂ1Õ§ê"º•=F0u¿ [ÐBÄ«?_\ ²â¤‘I!ý¤r,úzÚ|f#™¥SñŽF£¦Î.âyF'¬dHwè.ÁÊÁâÂÙØ–ª—‹n’œžüoD,Ú=ÜU*”uÈÅ!ke€F"fmOG"däÿz©‰qsÃ*—„N(h ¤&¿×x‡µNwüæÏ¤ÿ€ä„Fî'„hži¤ÚZxžôÀOü9;š‰QGª@É\ÃsIUU[g,xÎÕBþTB%™ F"Ñ/^̉üŒä¯(ŠiÙ,¢™ ¶db»&L´§š2»×Ê¥ ø0¯Iô£‰6ãç#?2o²zÖzš‘,'SŸÌnég¨jÙú¸.‚Øùâ÷$Ë3óú«PŠû@¶>®;ž bD}S§gS÷« eÖ—™¶]W§4ÿË"Áßë×ÿ³!ÿ3²—1ZýÚµkÊ2K³RV>PYY Ç¿?÷玬®mmm¼ìM›6att•••Üñ`tt+W®„˜§¡¡_7æ4e5êI‰tÓ ]8þàå…(õÒOúŽâ¼ôyY¾éž¶Ò¥ÏöÓ1áqOÓ4j|VQ)Í ìú¿ì½|TÕÿÿº  UÉ™ðË¥œhAëJfXKmELH‹ÙnëJÒOüÑvÑÌ€ÛVé– ~·Û]I3 -ÕµâL¬¶UŒ;ñGûh…­ø‹¹V…*&C¬K$s£õ÷ûÇ÷sÍÜù•8ÏÇcÉÜsî}ŸsÏ9çõ:ÚÀþÚ4#ºWÆgy{ve¡eó;Ó×`uê½ÂÚûÏëñ)˜á?ˆ1>õ^ô¯)GE½6 Ø ÿA“%ÌðÄkþƒ)áùTœ<€½mÐpO²Þ I¨ï÷û å¦Á$BÒß×_¯lÀ¼Ï\Œ©VâÀó}Ø`FŸfÊá÷ûU·âÿD"!y½ŸT±H¤Î#ÍÄáÆ"õÛ"æÁ;$ŽFwal`ŽFÓQEÙÆ.*è¹§x”dw%ŽÉ½Ø1ž3ü±3¢â‚ dIK—E‘fµj"ˆBG¢Æï~¿¶,°¦ññësŒŸH$¤K»½*º» ÷_9bœmêÿË#íð›,i¥ ò߯ÁU ýˆüwÁo-i¥ z¯ñ¹ê«©AôÞ0W‡,i¥à7¦ïŸN-ûŠMZ)0ò-÷ME—|µ©¿¥&²Ñ8 Å·ÀÈÆ ‚+#–´R0îæŸ¾pÉŒ»ùg8rÓ–´BH$’÷R׬’H¿ÿtó©ÞÔ²k¡(Šä-Òý'1^c÷ùD-i|üŠeËŠÿÉ'Ÿ4|Ÿ9s&ž|òI,Z´È’V üqÃ÷ŠŠ }öGsZ)0·…Mš4 ýýý–)yŠýÎiÞ^±~gæƒà~´˜”ªf!)_çᬿ u´ƒRbWG¾î'ê>X½z5š››ÑÒÒb:µ´´ ¹¹«W¯.Hè8 ¯iYŒÅÔ†u X¿n½nÀ´þ‚õ´¶x§{”ÓvL<œÖ©„öìÙ¹n°v-àèºu˜9s&ø!øv÷%Þ¸ÂézÉVÆnP×®½k×>‹óΛ ˜3çYgC3jέþf²ÅïìcjýCkÑöÐZÝ€¬­qûvæbïÿ %à/3gâw7¯ÃÔÔþÿÝÍëpÁÌ™ø·åRíÿVÆÔR3P’ýÎÉø`ktZìúK•ÚùwsrÖB«ÿÍgjçŸT `kaõ7ãõzÕÎ55¶3 oܸC5¢ìÒ =Ö¨§‡j4Ç)¿¿ õ­ÝE™‘Úëõª¯/é¸ßúÔÇô"€5úÒ=H$~Æ.*ê³Èëõª ,0¼kññI$Ë2|>|>&Mš„®®®‚ÊáõzÕ5kÞÕûôx3¿7âñDZxq¼QO÷xH&‹û,öz½êo÷&°™[Æ×Ÿhe JQg 9Õ¸²‰Ä+qý€7nÄìÇÿ{¿¤^Áåînt.Ñ~M÷MÀE­ŸD"qXÆå$á9}¶yŸÛò?´>Å@i>?´>¹ž `'Vo¶y‚1¦®^½Zo~üñÇ Âj‹ÎçœcL3ùl?wš^ž Üð îºÅ>¯Ý1Š{׿ÖíõbÉ’%†ôX,föÞyçH&“è+ð\‚ÇãA0‘Ю‡"\‡¼ð^£#õ·Qàki7jDË`>o½^¯zÊ’5ºÀÿ² ?…õ·¤<Éಠ?üôY<ù…E¹ï1ÆÔž°ñL"ñ¿ï,ÐÌ0gø%È;£€ïsø”Ï7cÆßâÛã2zÂ>T‡úŠz?¦ç±¹×Þ¶ØðF°<Ô&XjœDïÔ&RjvìØa»|çÎ¸à‚ J?‘°wõ¤ûs©Y²Û>þ©OlÅ—,±Mst[Ï1µýÊËQ?#àHçGð`ó4AÿÕëR4ª‰íeôã¯>íÿ]‡}˜7WFÅ'ÞÉ· Yy±'>TŽa:NÇ‹ì}´Ëp Ð Tͨ¬[O¢oLž2·µky2lZÚ2pXýït¼ypæVœƒ+ZÅÍÿræé¶÷€Ôõî1¦<Œ<Û‡1c€wq³ÏÆ‘=o@ª*îÛÈߎL  MEÑ×eãnùùõò×ÕÕ©<òÖ­[‡éÓ§ƒí×_}Öú÷ôô¨$ô÷x¾ÃƒðÃF̹râ;Hm×vÿÇ#À/ccp[ý1Ì$òïµ1ᑃ>2ŽF$Œ ª9Õ?µvØtmõöf6€MY´:A `ûöíúÿú¬£f1)¿-ZçСCCÛ}ÌéNëfZ3,g¿gº Í ™‹9 Î"Q9Aâ'~$€,€*Cÿ˜!÷x§JîðN5üßÞ—N{%á 4M ¤Úç­^«CUJøÿ“Ÿü$cÙÝ¢Í:С×±9í—F(Ê-y9 3¦‰écvÁçQE"‘<  ÒÉGüŸ` ¹WuE¢špÝ­x]¹¨¬¢ IDATQ‰fç`˜§Px¾Ž;êÇ»Ú^—|Àq @>ô>Çö¸;G Ú¹ì?;HðÏ/ÓÅÿ¦`uC€g­Dz6“5Š‚5Šâj ™s:EÑf’ä;[ÄÿôÙfÍšúä{ýéÂ~Ó,v³,Ú@8>oJD›kh=¾Ý¬ÞDw¸^¿‡¶Ö+ð-ðÛÎ>[ˆøìçÎÕg”%ñÿ{Í!¼×Òóýܹøà’%8rÓ ñÿ{ÍÖsöc-aW&7™žuew8ïKƘª,Q za; ­cj¸¡ôaŒ©/ýøÇxéÇ?ξ2ÒÏãpC>îóÙÎF›)6 öÏ9ç}&Ù-[¶Øæ›9s¦ãl³”‡f¨ÍwVZƘÚÐÐ€ŠŠ ƒû¾y"Œh1)1îüÌ'ÍÍͰù©¼¼Üq---ËB@'„ÎÒgp'ñÿ‡á7W¨gî}:Ý9OB;> ¿‰ñ¾3ÖPE uöëÏÊp}…þ4q?ÿÓ2ýóË€ô½êÆo/\_‘q_ðô{* Ê0¿ó0æw6ÌúuLÖ.Ó½ñ¿ ¿³—vŸnØÎëñ)úz{#éw:šµÞí¹aD144”ücJ›za%V|0S/´>2› d"‘HH‰„&~}§A{±‡²©A¦0ˆþí¾Ê9½€¨Œ½‘¿–Ó10‹þLøºäZídüíF ³èßÉ€âç—/³ùHbo³è¿&Œ15ùÔW ËèýÏ,ú/… cLín0¾oÒ,³fÑ)Lcê&Åxüéç˜Yô_ »ß<¤?1‹þKaÀS“÷+ |6‹þKaÀSÇõõõ¨DªÍ­¾;wîDŸÍ¶¶å¦ë¶s­¿™D"!Õ·v#ÜíE¸Ûk˜}˜DÿC5ê¿K;û˜ž·¾µ»(3_óð}Žkpu8Œ58 êw4÷I¾|ku5~Z]­©YKm¿ÒyÑÕÕUð{A"‘Z[OÇÖ­^lÝêE?מM¢ÿÇoÔúólïvK+'¬ú4÷—dRÅ}?yÙtEïß×7ûñÐÿÊÝÚ Ð`õ[kP¿µµ~‰ò~”Büÿi.­iñùš"÷¿Pì5£à’Ÿ…›ú8–%½ðC3ðz½%{?âM~r1ü±3ë§6¾£Ñ]`ì"ÜuË8t^4G£»ðNCÒ°/3 ¸ÇÁü,okkCw¸Þ¶¾ÉÇÂè\S¨ 1]üoÞF¾˜…÷Ôš¦CàkfùÅ7 e¸ìÂO”ž+|_ó¿Ö×K}¾•ܷѨ ùÅ(NóûðNCÕ¡>=ÿ¿ÏuŸµøç/`4ä!謄LÏ»v¿ù‡Kf`ýÚµ{tuu•ÌÀ|ýïܹӒ窫®²˜(Š"‘9v!ñi2ÂΡ½½½d&G~p“áû©OXgC»èB‹ ÀÁƒ¥±‹.ÄÁƒ3Š×¬ýª>Š£j¡Ò"“ø?© %R4ª‰U(Ÿ¡‹V›®àÍÝ“ ¡|…"}ö†»@ŸÙý¶žch—Êï’XXâbIó¾¾s?96•uëqÁEÚ“*ÒTd™ù+çi"þÅ.Á-â¿—ŽÇGgNÐÅÿ|ý»Þ=†-‡±ã] ë]­oò¦û_ÜzçŸ`#rÍ«þ+W®ÄGGÞ×ÙmmmˆF£ˆF£hÓÄÿ†ú×ÕÕáÒK/EGG$I¢E‹pʸÓ²ÖŸü—\r PUU¥‹ÿùú+Šþ€ò™ó»Ê¥ª²Œ‡l¶d ãøÍê1h—µóà7/iéó›—·/µË@ë¿ë¦ü~PUUÅæÍ›iK€µO½®®†¿ H÷ÉâŒ3ÎlÞ¼™Œô:šë¾oß>\yå•èÑÚû%–{h<Ïø€¿ÿû¿·T|ýúõxõÕW3Å7¤utt ñ__Ðvš´@ïg^ºô -Çà†ÌŸCCCðWü/}•0¸ÿú:::Ìe0‹ÿmÏ›Þ^çOUêyë‹XŸõ/¯Pq4"¹®ÿш„—WX³ÌOu±TUe.‹Òm=ÇðËØÄ#–2˜Åÿ ‰ù÷ïž² éú'2×ͺcº @rH!G”ˆ«ú«ªŒ¹Ñ€i˜°]³9ûŸh*ðq @´è—µ¿üÀv¿ÿ8VF÷s~”K©:E{\ÄÞŽ \2Öß$þw¸o<šáóÀi;XÖzPzM/v]YUñŸwÿÙ¾*—õbÿ–[±ÿ>íÓ×^…¾ö¥©¿Ž/~ÒþûnÅeWÝÙx/8ñô£ €ýnÒLÆo¹ý(È}þÝð7pʘf82.jŽéú·cL½úšklÅüÏ>s+úú<–¥šaÀH÷™@ @ 8¹q4°ªÓ`p)Àd²l癆V(Püоm§¸ÚÏ´ýþØÀ8›ÎÞl¤MÜt+Š"ñƒ·oß®’ɤ>ÀЮܔÆ2 1“I@®Ìœ9ÓЗM ›IøÏ‹ÿc±üù˜;)& Gxô¿ 9Õ \<&ЉtÌ8ÒB(~¹,õê¢bÖ¬YáÜGÜG.й¨ *¸ŒÝÿ›<26ÕðÝlkÜž”øø‚ „ ‚’~<æw¶„÷T(˜á?š±<ßó†XÒÇîdŒ©õ• ü~ ¾Ò~ Kk½VŽúJEÿä2(ƒ؇ü_ÖEÕN&æ¼@z @—|¡ÌHP]µ0-¨&1? ¤ÈÅ!ŸkXøgóËoÊúÀ3ßY¾¼LE‘:C4A×o  ¸ãÅÿŒ1µ>5óN='{ÖAKÅ‚bÏš5 “&M²½ÑÀG@3¨¨¨@EEÊÊÊr6 óÉoZžIÐ?(@nww˜üŠ¢H4ë·¿¿I?g3™¸Á,ì'ñ?N¸ù×8úôËwóÏ0îæŸéæü¹2ᲯáƒK–èµ|ÉEà/Uæn@âÿ:¿``PþŸ÷½ïá¼ï}/ç{jߟ“  ‰ÿgΜ‰E‹ÄÿK—.ÕE'¼°ŸGQiéҥزe ¶lÙ‚E‹aæÌ™¶yÝ@âó@žX,¦ú‰Åbv«ÐÞ=ŠeÐÒÒ¢ÿmnnÖç™P̲a'æ'ñÿÕŸÓ^“ï}úËpXžmVxEš: ïÿït˺d"@ù²Å×Í#êӃ⽽¨¯Têì×ÿr\FM¨¡Î~„:ÓƒÏè{}¥bkúáóûàó cx¼^¯Jƒv½^¯JƒeË}Sád<ôXÍ»áÿëñ)ãS1Ƨrþe~çaT÷³ÔLaŠk'섈žïçÁçûô<”/Wxñ?awœíP”m–º9^Ù¯¯Hž>†c 3ü â~7†2fƒƘš Wæ|?$ñ?/î·{‡7“뻞s|MüÏ‹ûÍ@í0öäŸÄÿ¼¸Ÿ7¸r"ßg®9>‰ÿyq¿ÙìÍŽB  (>‰ÿyq§‹™mŠaÅ‹ÿùA¾ÃzüSâ^Ü?œÇŸÄÿ¼¸ÿÃͿκ.™6_ÿs?1ØÖìõÏ׀ɟÄÿ¼¸?”áƒÈõË)>‰ÿyq¦Šˆ| —ÌñIüÏ‹û3½sÅxïâÅÿü3ÖnÖ+3ùš®/d2)$Ãm@à&Îh)ÇpBmT#]ŽRBbºø?ÓòRA÷µÅXŒpyáò0ÿa±!­Ðíg2¹èd {×®EÛœ9úò¶9s°wíZtÚ˜tòÆÅ*<ôÐlœ}ö&œ}ö&<ôÐlCZ)¡—®~­õ Zë\ºúÕ¢Å϶ÿW3†©k×âInÿ?9g¦®]‹Õøÿ7nܨÏôNï ÃQ¶•aíε˜³6]ÿ9kç`íε`[KS2qJ$z™üþ&øýMÒ"ÄúJÅ’?Ÿxn0öKRã¶TÚ¼R…Õ™4i&Mš ÝBï]Åè;ä±Ûÿ>ßTøR"KÿW¤ú^‚ÁÒÏÀü IûiñqÅï¿R5»9ûVýé¾ ˜îÓ„)Ô.×~/&¯èÈÅ5†¬Âs·i…RÝÏPѠضA5´)ð,I¸jŸ*ǃX,†¶¶6[Q¿výòŠ¢HgÆ<ãÆ.Êhê™m?ç{cêšT» õ§mݺáú øøÑ®‡ÇãA[[›^y{¾~„ë+,û£Ø†ÙÆbä>Vct—!™Lf2]Kº1”f9ÝõÜSØü¼&˜ZôÓg‹²¿{šÍõ9/kÄ’ýÚ _Mãzÿø{áVOŽí¿õ%Ú ýåÞ´É?ÿ¡4 »1“›ø;êÇÛ ý©oßü¡49õý;ů­­µú÷÷÷ƒÌéù¥ÈjÌä&þ¦M›l…þ;wîÔïü‡Òëo¥|â755Ùö£  ««Ëò¡4›M™2E=úäó¶BÿSŸØŠ#?¸Éò¡4@3 Ññ? ~Æ[šøÿüΚ{•uñ?OJx¾‘¦*l»G1°À_Ü×N…gñ`óHÈÏÅ·–kÞ×ÓBd2˜‰¹çèfo‡ÿhÿŲġåM>àæÿ÷IšÀ` *Š‚SÆèèèÀºuë,ñÍåZ¸p¡þeúôéXvÅ—±xñ⬱jkkqùå—ãúë¯×cgóëñ«««u“|æ¢Ä„ªjcWtñ?í;ÞØ »~µÊ\ÇÖOýÕ Úe`ç¶afóæÍ¨««3ä]¸p!ùåvttt¨ûÛß0{¶Ö@}óuuuxî¹çtÕ*Æ7ÞH"~=>µu§þ:Æ_½z5ü~íÚ³3^‰F£›ø*‰òuñJÈ_VV†ýû¿€;®å«ÈL±\/½T‡>ø¡¥NÜ`;Ñø0‹ÿ¥`jJùÔ_Çúßµ&óùv¾j40™–‘øÿü,×/Ó¶\M©Ä¦t e0~…u{jÜ(þ }ÿîc˜6m"Vüìýtœ¤µþn‚Þ¿jÉüA£ €ªÂ"ÀWUYÿ[ÕÇŸ×DìÇÿBÆ?,PqÑlãh°¦ÞTŸ”µ<i‡/ˆ¨øà_ƒ¼Š„N{‘zr3‹ÿ¥}×kýŽ©¿ŽÇv ³ùü༠ƒ €É H‰þÁ‰ÿ»|®e;—Þxžþÿ—²›þ¥g ¡\ɇ´²§¶£×iÿ}·Úš Ü6–Äÿ鼿ÜÄÑk«Ý;Õ¦þo?§Pý÷ÐL^¨zÓ4˜ØØÂSqç/ôï$î¿úšk×¹úšk2¦ @ @  7Ž<ü`p^Ô_Ò>„âÏ­Cúht—mGæseÂe_ÃØÏë&lNdøK Xf"Ë…GâqüŸ,#‰„ÿF³Í,àã>Ÿ£ØìÿdYŸ­Ö Š¢H+W®ÄÞ½{ñä“Oê¢3ÿóy÷îÝk; ‡L–.]ªocïÞ½X¹reÞ×äÀÀ€að“öœéB´††TTTÊÓßßïZxï&> ÍjBlÚ´ ÍÍévìØÁÁA= š"³>¯†ßÄ; Iý/qõçÆàAé C^2 à;‰ÃIð_è ì¸ÉJŸþ¡Î~ƒI€—ABi~¹ùœŒDÛ‰¶[¶ h‚ÿþ5åx¬æ]íÿNíÿeI¯þÞaæõø\Ú}:ú;Ë9m°72ÇdM¸ÀÖ<€ŒÜìºó÷qós ¿¿3úbØõÜSxâ–»±ë¹§0£/»PÒ G£» (ÛpfÌ£:˜è·ÈÑè.ÛÁÿŒ1õÃð›yÍLÅ‹ÿÝä½ hÜ¥Œ15Ù]‰½ñ¿8¬•^üï&o0=_.ðâ7y}Á¦ìs€ÿ»ÉüVqg‚çÅÿnò®5þo²g1äýJQ£ÛÏð•)o±gþâÅÿnòWº?_ÜÀ‹ÿÝä=rÓE«¿Xæ¼ÎcÓó‚ÿ»É÷úãÅÿnò.Z´¨¨ñyñ¿›¼n¹æ‚ÝÀ÷LyK5ó@ °çDÿN¿©Š-xu‚ÞÝE‘öìÙƒÐ`¡ÁöìÙc™í<_²ÕƒÚç*‘6ç¬Döv·bìsýßxã*¼ñÆUE­.ñ©=v¸÷ÿjÆp¡<¯jŸ %ØŠÿsÙ®Ìõ§¶Îá®?ÛÊ Uj¦ßewhÿgëO)öõ·ëí¥šm˜'‘HH3¶Vèu<=’2y€Ù†¼|¾bÆß¾}»¾ÝC‡áСC¬í!Ã,€œúmæ79å¶¶ž^’úù¯¾Ý¿¨Ú(…èýWÜ5ôu 8—ûhì“?Ä>Y›aÒ^»ÔmÜ^~$“IC¿ ý.ïP‰ôìó@ñEßКô¢¢APÑ Àãñ ºŸ¡º_›q>¾zZkÒ›}ƒRÌû‰¡/:5Ö@ëã»Èp; 8Çúvøî‹šDÉd•AD7FPßÚšDõŠ‚zEÑþoíFtc>¿Éd5‰„¾>nH¨iH÷ƒò&„©´ý~˜O;çh,cL]ôÓg—]ø)ÐÍxSbóóÖó ÿ‰d2iè¾ïíïëñ)|øaü}¼ŸZ'\Fu¨Ï°íq[¶lÉö^ÿNâ~¾ßÑ ™2s|÷;SZ¦ô\ã75¥Û“IÜOƈvÔÖÖfLÏ5>™PÐÅý›6mr\gÓ¦MÓsOæÛtq?¿OÌ455eLÏ…)S¦¨8nÿ%qÿÑ'Ÿw\çè“ÏgLwSÿ§„ˆ»;›fóLž2Å7¸#EØ–TY·ÞUÆ#{Þ0ˆÆÇÍ>ÛÕzØÙó†¾bÂÃGGÞ׿çbú“B’$w¯ Œ1šÍž~O¹ZohhHÏË6¸å¡›ñ`óøÌ¢}À}•uëñ`óвzR¹¾ÿ¨6s?ií£œ?>yäÀ$ŒæLK^Rcc#&NœˆŽŽÌIãÍž=›_WZ¸p!$IÂÖ§^ÂsÏ=gÙÈÌ™3ITŸë3[jkkÃâÅ‹á÷ûÑØØˆË/¿Ü’'bΜ9øêW¿jÙH㿾”¯ÒŽý`zßR¿scãN¬]»Vÿ/{7“)D&T¿ßª*ëÖxˆáOÚÖr®ÿòV߬ÕÖ÷_Äøî ªš À 1 ’433/¯Pñ'IË“ÿê6?¢mûOðÍZ†å­Š% Ô?¥ÚMÌÈ˜Š¸ÖÕcHÝ¿ÿílÛ”‚Áµõ}> ö›šq­«ªZÙƒA ÑÌÌÌFÐÔÔàÃ_P7|9Íïà ۵jÏ âS‘ÖGÚÑ^e«Ûò¢ê7¡¨ŸŠ|Ù6蘭mEù®~Ký] í‰1;ðÏ(ßÕ¾ö*œ¶c%Ï༠¼PÊwõ[ƳÀÞýg|ù®Ý¼ø_Òï¹S/¬DûçÆcv ‚óž†ßþ›AØoá­·l«_¾k·mÂØcU¸6¸°«æ.%)ú‘fpmp;™pìú!EÏ Â'}×·#2.û Ƙzõ5× åGÿŒgŸ¹Uÿ“!-SE¿ßWV&ñì3·âÙgnµlëD6Ä@ @0ºÉj`ÿ«UÚ\ u’—Ýam,çVí“$æw3£†&º¶#¿YØíc¤q†cÀa®˜MÊþµLÿd‚DÝD—_û䊢g7Ïš©Œ7˜~4‚£O¿Œ©¯¿?ÁÅc´“Ms«RÃ.>…^Iò¢IíX…ÿl+3|ÜÓÁ ô2Îhcg@yx£€‚éëÓLƒòT÷3WçÛëñ)Ár)‘{Ó3¿˜áÅò‘¨–Ïn7LŠÿÖVD¦D—|“⿵”#ßk´÷Ù¸eì[ë,È0£r¡ÈoÊúÌ2<¾³|€Øø˜^®Øø˜.þ§åùÄÎ6 šäDùyÀ|bºahhHôè•ûµ×^Ó;ïr…Dý€f`g"á,&™Ì&øü™bÓ¹E³[e‚Äýk:™>–Ÿ¡ÖÉ ™„ývy3¥}úeÛÙòÅIàO“)-Û€d»õivÙGâq„b1Ûz“ø¿Î<êÕ´ÿÓvÜ–aåÊ• YüOé…ýTf~;ù>ƒHä?00€WúÛÐЀ™3b±˜.ÚåPw§2€Ÿþ§òlÚ´ÉÖd€@QÅß´i“ãµ§(Š4!tÆû>Äay‚!íÞ§á UsÚç÷a¼ïC‹QÀ„ÐYùVÑRŽPg¿.Òç“ÌyˆPg?丌p}øåÝází\­7öžÚÍàžH$¤ŠÖAœü„.è?§÷’ɤáú¦w’×ãé™DöFþDe=?Œñ©ãSu@›•~Gýxý¯âñ¸d÷ÿÐÐÊÊÊ,æ.e½í˜ÑÃŒ¾˜žFë•••Áï÷»6`y§!i0£ÙýÌ!?ƒØØÀ<(Ê6½ã÷†$ÞºòZÓã YÄÿN³«™Eÿ%‹ ”[ÊßV,â»s°ŠþƒüÍžÒñë-â§ÙßÍ¢_°© Yàcjò©¯ZÄÿN³¿›EÿÁo tÍS»d‹øßÎä €Eô¸:„†ÃùÏÎS7)ŠEüßé0Î,úÿ €úDN³~9³è¿6GÃ%»øÉÇÂñ¿ãñ7‰þƒ+#ÿ1ÏôZÄÿnþµm~³èÿÈM7bÂe_+(¾V,âÇßÍfýK³A“ÛøÉž‹øŸÞÏ̘Eÿ`ÐјÉmü]»vYÄÿôîeÆ,ú_´h6nÜXPü7ZÄÿ1‡ú›Eÿ‹/FCõ·›õŽÀ›1‹þ+**ôÙhó‰/ŽNÔëŸ1¦ÖÕÕé¿‹êêê¤áª+ÅùçW_ÅEÁEÁ?k3Û ÛþÉút|Šsê+¯âBIÿŸúÊɳÿ)Î+Ë_ÅÐ C+¼²|øêoÒ;ùp™Ðïùtyè·ÇlC¾RÆç†²œ¿Ùo>0ÆÔp8Ý~C†à|sh©ëÿÔPºßçªÔoÒâ™üJÕDÿôá9¬26»Â/éKjbZó¬ÜÔI–¿ céYᩞffâEß!‘HHÉdþ@|;ÜêE"‘Ðï?‰DBJnõ"¾]ËŸL&Kv”³èŸo/Ët ìŽE®ÇÚÜävãöøÿ}©þFÞ ›Úd+ƒ¶ëTÛîp~¿Çµþ-­fl`\ji£éoš£Ñ#\¾â0e ñÿ®çžÂ®çžBà} ¾§%üæü¹èð¥÷õ®çž2üÝü¼uvÓ|àû–×t2„˵¶@ºÏ\èpuýþ¹Oéyøm,ðûðÇ»b×®]®ÎꇌDÛ!÷¦Û~éÙKËø>²úJr¯µ¯?µÊ‘vtÉô¶?ŠOËøøá ]òK»a¾ñkkkñøã£¿¿_oû q;-ããÏš5 ýýý–v“|ãoÚ´ wß}7vîÜ©‹ÿÉ€–ññW¯^;wbçÎE‰ßÔÔ„'žxºøŸ h¿¶¶–~¹|âO™2E=úäóøÒÆ(N}b«.þ'CZvðàAéàÁƒšXý‡7ãÔ'¶Zú›§L™¢N™2%¯çoÕGú ÕëõêS6銖Gù¼øÓ]Ÿ)Êû0cL•7]gXlïLâKSÙòŽküsbþŒõ¿­ç˜¾î¸ÙgãÁæ/ rŒ1Õ<Ïõ×_¸¨ÿ)ãNË9žY¼Ï}ÏXÿx<®çeŒáöÛoÜ×_º¢åQ\Ñò(Úµ×y‰_—ÄÿDžâ=ŽÍúÒôéÓQWWgÙîÄ1ÿçj»uuu˜8Q›q}Μ98ãŒ3øuUÚî’‹ÏÃÂ… -ñÛÚÚòÕëëS;´ €?R;º!>7ðŸÒT8vÆÇ±âš?iâþŠÿ-¨œñxÜn}iy«b+¼w»Ý” _+£É å}!ÝÖs ç§ÌÌñiùm=Ç(-ÝwœÿyŠÿõ8©ÞZCü`ðÅ0lwÚï¾cý IDAT´‰®¶ ¦Ÿù>ð÷dBäI×?Õêც1þŸƒQMÔß©—A-—€÷ã2® ³‡ìãTçL \™¤ló¯Õ —}Í` ‹6¿o‰àïf¿?`\M•ÀSDz×#›ÐŸÄ»Žåb7¤DþÄü8µ7È^BgR‚;}Æ7y{ ·êf½wS®Î>Í0‚`—:û˜ hñNyâ„ú™ŠTxñÙ ÔÏôÎÿL"l·q×t2µZãýšNçí™ Š¢(RŒÅԆà ߔ ¢/¹»[øS^»uíÒŠU¶NÆÔzE›¥„ü—ò>˜ô«³fÍÂÐÐ+A?­“oÙÒçŸuýAù€åÉ’)†]þldî›Åý4–Ê¡ÃiS€\÷A1î_ü}Œ ÚÞV¦*©{‰ÀŸòä[þ”xßÕúÄã¨+ÂvìÖÍ–¾råʬÛ.Æõ˜2ÈË<ØÇÍ:¹–Hˆ¢˜ C”ħüz›6mÂUW]eûÌWEb¡³T„ß¼ƒ$Î yðaøMÜûô1ô}ircC&„ξ|¡³ŠRgz¾ÊÅ ùCý*  „“ã2Býuö#\_¡›ÔW*¨ uêÛŒ÷öZðÕ„: û!‘HHõZ§ïc5ïâh¢ýê~ûw¤ù‡Æ¥Ý$“LöŸÃuÄóF€v,÷MÍIŒN~¿ß¯ÒLwCCCñ?ž Oã×#ÞL€‡Þ_Íâ^ÜoN3sfLëô}'„ݦ¯KBLõ¦øfñ?/ü·3à™*ÓóõD”û¦2쮄§¦Ïñ}—oÿóÂ;cžšÓó!ª ³ÏùÛ9¾QüÏ¿ûÙãw¦ò5!iGÈáüÍß,þç…ßvÆ<ž‹ÿ'•/ ‚5yÔß$þçßíŒxHÐ}µ Ü ÄX,çøfñ?/ü·3à!AÆ&E~c9Å7‹ÿùãog À£Ý—€õSÈïø›Äÿ†ãoc Àã¹4”ÊÌëø›Åÿ¼ðß΀çØg5%Ô‘gz1Ûüëœã›Åÿüïh;cÃ6R׿V @ÛšÇþ7‰ÿyá¿1§ºZÏ—Z7çøfñ?/ü·3à™7ožžoãÆX¹reÎñÍâ^øog ÀCeݸq#­›s|³øŸþÛðÐ@q©½öÚk®ã ‚ãŸLíªÇ3ô[Ìñ÷c‰ë­?ŸEÚ³gÚJâ×Ô ð$´)eÛïHÖ¤ã›÷ÿUe©wÝ“dÿ›ëO†ß{>?<õçáE†~S^F§…±Gÿol`œÁ$z8àÛ8&MšdYVjxógŸoªcŸa©à ˆ?!)ÚÐz³èßÞœyºoöÉfÙÞ¯Ô´¹€{HxNž·¡8 ËÀe>ío$Ãlï•0î›á„ Žgìî]ÙŽAwª9 Ðã¾&@iw6[´+£Çã1œý­Üºk¾&g³öL¤…÷Ú$ ¾Y|©úûƒÔïÝÁýmÔî…Eš»Øeðx<‘§¿9.ä#š ÌScÜX²{.p¾V†ÿ·[7 ˜÷™‹±è§ÏâÉï,,ø9HíNáò°Þïû¥ÿø0ý?öiýw}Ѩ |ø³ÇX¤ïMÕ¡>ÐNèñ¿üY[Óälñ 2ÒmÂü˜'ƒX"×w­-ÏÔö—jû¥6A>¾“Ah¾ñ©-ƒ C Ý&ÂÇw2HÌ7þUW]eøN†tC>>-+Vüövã;é}ÃÇ7ï¯Bã]t!ø·*ÝÐ xa?-sbÊ”)*™˜ñz½j"‘à©Ðùúdl»Ç7wOÂ-Âëõêùù̉D½§øÈØW±À/òåjˆCë™Åïæt3‰D‚Ä÷xë nÀmÈ›ª«d³Ì ø€Cì}üÀw:ÆÍ>7ÝÿŠsý•ôºGö¼TœcÈWHýÿú׿:¦›I$X·n`k×fC]È SýYúÙ©Ú9]]]¡¡!ÄãñŒÇŸÙ<³s¨¿%ŽcJü/Pç~r€G³lJãñç·¢ï‘n½.€·‹ã°\UU÷ß¿«X0{¶n‚&MŸ>]ÝúÔKxä‘GÈX SlÛøøÉO~â:>7ÔØØ¨644 ¡¡o?Ï%~ê¸ÿ¾ú>¥«ñþÏÃ͸Rxi_7Ö­[‡µk׿µÿã ‘—“çÄC H‰óýA¨ø„>f,§úÓÝŸæ«\Œ¬l¬âšà>¯úË2ÐÔä.ÈÐúüH>Ô»ÖLÄˬH?ÆrªÿÔ;fÁ¿ë_™ƒ*0(DZ^•ñ]ɧ×ß$üÏ_­lêEßõßw“~¶ƒ©mõµW©Óo`úíì»^ï¯Ì©þ_¾K{¯ýí¿é‚ÿœ~eÿöçW£éåÃh?w|~ç þÈõî‚“’?Z©~ceö þìÏxÎ&п÷ž{Üã®<&NÄöp@ @ Çî  3ÕúS€€ðPƘZvƒ²Dk´›xK:Ÿ[ñ¿Qx ]ô¤…ÿ|\>¶&ҾŲŽQ»Ò^x€×^{ ¯½öfÍšeÈãF8ëãfSÌuPO¾û‘Ä¢Néï5§g¸ü}Kzðÿß͈ƒZã^Ô¾Ÿ¬ è\¤ÿíÒ²?—¼n  …)º¹¶Üæµ[×,Â6›—Otº¦Óy{ºI@½‚íq9/u¶øf!ŒÅThÚTÄÆ;Ϭ=,Çž ÏyfŽ›« ¿b\ó÷P?SÃÚó-›ÙD®ùi:·âñv˹¥§g÷g;‡‡þ¾^¬ë2›À¿ØÇÜ.=‹©á†<#ä0Ë}©—jÛnc‘п¡¡ˆqûa8ÊÇuöþÀÌ™3sèh†ßDß—Qù»r}ù„ÐYø0ü¦¾Ì,ü'Š}ÿ'Ñ? þyÂõ¨ u"\_îp=jBuöëiñÞôˆ;ñ¿4HåÒn¯šLZÍžE‘æ[ï)†ò“%Œ ¨ØÐÞ#çwFOEJˆŽÜf¢ÏDYY™>àþ€6žOs ?³ üyá?`o  (0€¢àfÔŒt€˜Ñ Þ)þ¡°VføW›4Ú‚¶ÎAÉ6)T†Cá!Œ‰z`o•q–t»øÝaí9Eó€N;c€`Ê%€!­&Ä &´ÜéØó3;ʦAžéøVc†ï 6ÒjB7ñ“O}U«Jàokg ü–öð[ACšçâÿ1˜¸ªƒ6P‡þ¼ð°7@ûm¸:dH«‰ù &nâoJ Œ&¿yº1ÀWRë|…[ÐŒx7ñwÔk3K’Àß|üíŒjS“œÕú¦Òæw6˜¸‰Ÿ|LÛ$ð·c€`J\1¤y. LÜÄóŒvß&?/üìÆÜt#àÈM7ÒŽ}¶Ê`à&¾’ºþé¢2èÙ(5©uj`L 1ƒ €›ø$Ú'È4ã½1@ ¨íó@0hHóTWLÜħÙÕHàÏ ÿ{cZgÑ¢E†´yóæLÜÄ'Ñ> 2™êog @F‹/6¤­\¹Ò`à&>‰öIàoÐng @³.UTTÒººº &Ùâ ‚Ñ ³yŽó¢>ýDí([{Ïp”f€§ïuuuö¿Gºþ#8¹÷?0rõ§ßˆ¼QQ©&Ô©Ö§¦½®¯ÌÍt.×ø|ÍÎbUÁ6€¢lc•,>ÿFýy]]]ªÏçCYYfÍšU2Ó%ƘG$¢ýÎêOµg‡BLM½¢¢BA¦k¹ÆjHÁæÔ™Öš2 ¾˜›}¢ µ$&‡UƦbWø%ü.ü 4‚R™Ä¼GŸ¡;\FS¡‰–Çseàr3 Á¹­9®è"ô>¤Åç¥Û''ÙŽ€‚Žß_f¼—3ÆÔïu¼†Þ^g㵚Õ1TUUéۢ孌©©YMóz>¨ññŽõVãZ{&Ä? M|¯ ðSí¡E9ÿF¢ Š¢Hžšô3­©© ½½½èïïG"‘0¤ñf¤X~²@„êPŸÞ𥧿„óÎÇÌ™3uƒAb×®]ø—øN¿Áç T¤îCƒ!ý˜W‡úT`©^7»˜Ùžáæö°\ps ²Å7 wül÷RÇ7 w|³!@±ãób~;̆¹à$üŒbî-[àõ‡¾ˆƒÂ”ѺîQ´¦óeŒQõQꟂÎ@Žø|ê«ÎÀëõº‚óeI$è{仨¹íE\Ñò¨.ϲ>®h1 Äm  "x>¦Yð[Ï1Àó. ¿’¹þI`Üì³ñ¼ö¿‹<ú4lþ‚nšoýUUEKK Ö®]‹ŽŽ}–ùLõ§ÙÚ 2x¾ç‘¬õF£Á¿¢(èIµ#g;þŠ¢ èÛ¸ýöÛqýõ×çT3©c)‘AÁí¿ÖUª|yl¶+ÝÖsL]õ\¢Ù³gÑ®ù8Q~JK$Ò’‹ÏS_}õÕ¼ã÷÷÷#®9¹ŠO}þŸÆ'äKÏŽóÁ ·ÿ9²î nPyÇ€TW¾«úßÖ¥èi‰DB BV#ð¿Iû£×ŸbÀEý{{sŒÛ‘Kýéw)Õy«¢Þµ†po"Àóù>´Wi³ÅSýÛïÐû˜²ÿh¯úÊŠ<œ· h׿y©íõ}HOK$Ò¾ëƒêôÛͲ³ñ\÷Fì¿ïV ßó_~C=ð|òe£4÷õŸfHK$Ò/7ÕkƒÛ—»Àü›+×u@ @ F#®/cªâ76¢±¸ýlð†A‚~kË;‹ mtɶþÉÐX“Ï>dL›ÑðÒb¡xTkT%1P©öa>È>ÖÆ?î :ŠÿÍžbÕƒŸ‡ÿ^ʘnÊs"Ç7ïó᎟©¥ŒŸ©ÞÃß 'Cüá8ÿ²k§ô“aÿ†øbÿã Çó1¦¶´´èß›››±iÓ&ý;/úonn=Òš››¯ÛÃoêß'„β­S¾÷^7ëÛmÏ\†p½6Ò:ÔÙoøŸŒè=®³!e -þ—ã²¾N)®ñéÙ¸Éàœèì LÍÛÀï÷[ö¯Yüï”ΧÅãñœ;zíÄÿ´¼ìƆ~æÅ™1 ë°ˆro'þçÓ{ã»´|âÛ‰ÿù4ÀÞ8À.-¿øVñ?ŸØØ¥åßNüϧöÆviyÕßFüϧöÆviùÄ·ÿói€½q€]Z>ñíÄÿ|`o`—–×ñ·ÿói€½q€]Z>ñíÄÿ|`o`—–×@ñ¿! °5°KËkÿÛˆÿù4ÀÞ8À.-Ÿøvâ> °7°KË'¾øŸOììÒò‰o'þçÓ{ã»´“¡N 8QÈWÜ+®óâ“iÍáš}ýdædßÿ#Qÿ‘¾ÿˆø"þh‰o"SZ²;-B'jBÅ3¦fŒ©æØ|º×ëU+**PUU…ööö’ôµÙÅw—1ÍP¹£n7ÇÈ~ÈØµµ;éJ èõzÕeË–¡ªª ?ü0¶oßn™Úãñ`Á‚¸üòËÑÛÛ‹x g¡¡Ū÷H– öð\ÊäfÿÛÁÇðz½jgçÔ×·f<.Nç©›úS;õs ⪫®*Êùž‰‘"⟘ñ³™™„ýn±SÓàõ~,§íк^¯‰DÛîñãÍÝ“t¼)¯åùiÞ ÷i}~ûù”˼®Þ)o.q¼^/J?¨H äSÿŽŽ@ccãñWÿDß Cøù/ÿ'kýyHlË(Ðö¿rвz`Þ×7d,c"‘@“XóŸßEeÝzÛºó1ùõTUÅý÷߯ïûL1öíÛرcêêê å}ä‘GôeÙêÌoóÕW_ÅÊ•+ÑÓÓ“5~GGNwîØøß†ü‰D ˆÅbYã›Ë’H$€òUÀàÃöP¾ ëþm2`íÚµYˆòUèŒ.Bý²¯ä´ÿã ÑðÙbh"ẁϟH$AÈyÕ¿š¿½ª* pñi(;ã 4Þ|0kÙªª€hðí¯=§úË2ÐÔä®þ‘ˆ6^59`©ÿþe ¾÷±¼êÿ©HFÇ?P…¦Z_^{U0ûñTa}¤ß•|9Õ¿²©}íß`}v˜cÌh}[š€ñ~1ýöö]Ì«þÓ®ü6ŽtÜŠ²sÒÛ›vå·ñ™š•˜za%ÚÏŸµlÓ®ü66oº>IÊ©þ×·ã÷®?§×·~Ùàë†ú_ÜŽ_DäT@ @ ‚‰¬ "ùºòBå2Ð"ŸõOôÁY<¹³ až´T"ê|Q–Ø»»Zf/tYîRÏd“­"¾ˆ/â‹ø"¾ˆ2Æw*‡“ÁÀ¦M›l…ÿ4{ðËÝÆ,%¹GðùyÃ~2àMø|vËs‰ïTn3vf Œ¥g÷·`5(++³þÇãqÉÎ0€ÿÛ•ÙÿóÂ~>m¼ïC–'à̘'c^;ÌÇÑÿW›fD·ËÀUÞ\â“øßü[À.Wys‹¯‰ÿÍ3ÂÛåà*o.ñIüŸm,^ìïv¶,WõO‰ÿya¿S>®òæŸÄÿ¼°ß)Wys‰OâÿlÇ”ûõø§ÄÿY?'ö/æñ'ñ?/ìwÊÀUÞ\â“ø?“¡žžp•7—ø$þç…ýNù¸Ê›K|ÿóÂ~§|\åÍ%>‰ÿcYêÄ‹ý³åÍ%>‰ÿya¿S>®òòñ]e£‚BÛé Wܶ ñi"¾ˆ"ÄÏGˆ\¬2Œ´Ý.>O¶¸Å0p*G®bp·Œ1Õãñ`Ù²eú²x cs^*[¡çA1ê](ù–!—r™¯ãbíÇ7^¯W Õ$lÏÓl׀ݾïÞ{Ì"ôBq¬;ÝìDðvë¡\®â!m7¯ø'SýíêþÍê1¸­ç˜a¹Ðv®ÿÚ Ã'UU±yófƒ˜ßM=íÊɘãrëâïÛ·ÿôOÿ„x<^püêêj‹‰€ÛýOvÛå—e-[ù*tüü,f Nû¿ã¦)hÛ|0«øÝÃT&ZVUeÑ»­?­k·]~Y¶²UU߬eXÞª¸ª$2Õ"æÏÃ\¦bÔ* Úk»]~YÖ²ÕMßX œê?;±ˆù³Æ0•)½ì –í¸­ÿ´+¿ý÷Ýj»Ýr º1@¶²e30Öÿ=\ü½EÌŸ-F¹ ªÖrò™ê/@ @p¢’·€›ÎÅBfƒ-$®@Ãí>ÌUøVŠ™c Ál¯øß°"ŠE|_ÄñE|_Ä/}<·dÀ[Š8N;~}¥’Q€]èû_±(Æ{¤YäoøSºð߉áÚ…¨‰ø"¾ˆ/â‹ø"þ‰_ ŒnFz†H@ Ndr‚S>R"t³ÅM|§<4Kzk½‚p·ûY K%²ÏDO±=%Í®üNù“ÉdAï_£Á„`¸ËÀ÷bìóòl¦dTaÞV¾×¿B%·Âñ\f`.æöJ¨qÊkå< eõ*°ˆ÷sÁΈ ›ßœ?×xªªâ¯ý+°páœÈň¿å·ÿå½cxøá‡‹Å\ €-e(_…uÿ6“χ෿w\íÿŽ›¦€­‘€Ûú“pÿ´SÆ¡ñæƒÇUý#‘©`k$àúøªÐ´"ñ~®åImß± Å®ÿì@lÜÖ򥧮gjVbê…•h?w|aõ÷^–Ký§ÁëýXÞñ® jYvF£å¹!@ @0ˆ†€‘Ði7k¬ÛünQ@ ½ŒñYÖY‘Kø>1û SùKÿx{sšõ-[>;ŠaÄ!â‹ø"¾ˆ/â‹ø'C|@ àd!!x±Eà#-BÏ$ªãã{½^5™LÚ–“/‘KYJ!çÍ¿‡Fúø–2 t™ÎgÀ^@•í:°[O £;!pj¹m~7³ygË_ȺNùÊ~<Å?Ù÷¿¨¿¶L³ÝŸðõ÷HÇhoƒªžÇu|@ @ ‚ Ñ"@ @ @ @ A‘ðx<Qc2™ÖqzÇküR”Ûãñ¨]Ë^@ô®.|±â-ÀŒK®Dô®.<0ñ¦¢Æ@ @  XŒé wcêp͘=ã Åæx?ŸÅ5Ybß ¥A\[@pbRêwÏÑøn›iÆš“¹î„Ø#‡Ø÷`4Rì÷”‘~ïéø¹r¢íÿ\õ?¹¯—bÆéºäƒ8ÿEýGóöŽ—Øùr"í@‚óŸRÆ€#o]„#o]¤/Ž2ðÛݽ{7vïÞ=bñ7\¼.Þà*~¶õò)¿nô®.–×·v|káõ'ît-{wN¾1§m @ @ @0@ p‰“a¸Å Œ1õÏ 74ŒHç8cL ‡Ç£¡AñÎy 0ÆÔÖúã÷|fŒ©/¼ðÂH£¤”Z`¶£~üq{ü¥ží£Q€x¼ÀS{•âÚyq²ßGsýcêÐ C+”¢—“¶·FQ°F=ïçB€|r¹î£q Áh‚1¦ÖÖÖí=e¤Û¥´¶þžQóÞ•b·50ÆÔðGOWõ§÷ðbm¯;\\Õ?\ÑëÅçóhüY³f%>cLݲeËqsì­ÌÅü8Ò÷ß\aŒ©gŸ½©¨õÿXËÈ]O¹ÂS›ššŠZÿ‘êdŒ©cžé=nö= •ù¥ÿ¸¨ûõêÕ#²xwò–ÝHÞ²Û°¼Øï·º’x±}<Þ·,&vÆÅ„âOŸ>,&vÆ¥ˆ¿üwËÀ"æwø;­—ËÞ¾Ù²}ýÀŒK®Ä+ÞBô®.\÷ÖÏ,ëóçmK @ @ ‚á$/sGÌpwÌœ¨ñGz€÷HÇF3Ú@(áú Ã5ﴼرÍÛ~û»ßÅÄÅ‹³æ+UüÅ‹ŸÆâÅÃ_ 8Câÿîîî‘.JÉ`Œ©---A¶g—žÑ²‡»4˜ÿŒÔ@ÀѰÿ`8¡û^O¸£ÙD¤Ô¿½Â=Ñ$DâŸIÊPváð’ÝÅ0ÏS“Ý …‡ÐÊ ^QFüyèõzÕ––,Y²^¯Wõz½'äû¨]¨¾K–,AKKËI)Â>YŽÿH#Î?@0Úî6 ÑOhädÚÿvˆúŸÜ×ÄpÅéz:!ÎQÿ“¡þ£qß'öþ'q9n €nÀÅ1˜\ëÁ§._€¹Ì¶ d 0Ô±À3Ÿx|Ù)þ§›cß¾}¶ñÉàÎö;Kÿ®/Ýe_øŸyµe½î{–õòá‰7„ûåµøCÿdÈëžÄÁmÇëO܇?ôOÖӓɤd®Ç²·oƲ·oÆo*¸<@ @ @ äJF»ŽÆŒîöŒÙ»Í£“Æ)>?ë5cLm¨° oKŸwgŒ©õ•ÖÁÎùÆW”[FtÆÑ6ÓàêÑØÙ(Œ¿Š‰—®v½¼0ÆÔ?74€¿ï@[ã<¶¾1k¾bćǣ¡ÁxŸ›³vjÌšOpâs¢<3ä^€žïÇs=F’Rï·––ÛOCî{-½@³ýˆã¯ÁS¿úŒäà·Y³f>¥.cšøßÌp›0ÆÔ6E}ާ󒮣žp%îˆÊ#] N„çø‰Äñv,ŠY^ÆÒðêPãûÙhÙ/Œi³¾Ò̯¥¨è”K  xýÓfZ¡ ÿÙVMœ?´BÁ) ž¦ç+$xjÚ‚*Ö(Z¬Î”ÀEA1gzÌ•‡~Š¢`É’%´óÒüMçh.P¹wÔ‡ùK–,¢(xøá‡G¸¤#‡ùø755Y>Çëñih¿Ù]S€8ÿÁè‚Þýè{¡÷Z·;\oXFÏàR£ÿvïI–…Ã=Ã?WÌæ`ÉîÊâìÿÙ°,üÑ…¶ ­0¾ +áÂÞ?iÝäcaÃ2þ|M„˳”w7ÈÃúþÅ‹ ·GW|s›(•'Ÿø´Þ®]» ˶lÙR¤ÒóoÁMJqÎÿCá!òáºÿæÊÙgo2Ôÿ†dQê?æ™^òµ„3¬5rÐó–¾ófÑùlÏéùK¿AJ‰þìMŸ½ü±m˜ûE’==EÙÿ7n4,kjj*Bi³Ã‹ËÏ~ïÀÏB€£sÏ2ð¯a IDATyyS€\Eñ$$7y›¾Œþ7”5n¼—8ï%ÎÕãå*ÈçóîÞ½»w§ æÎ‹¹sçêñOùÜuc€ëš®­³yÓÝE‰¿áâ ØpñCúª§Véñyÿªwî üÈó#C^óÿ¹@Çà‹oéËjøýÿè]]øCÿd–×"°¼ÖR¸sòx`âMºøßlP Ã@ @ @ 2!eJdLû˲ EQ$»e$Êyíµ×óä[8Æ4±(3l›– ˆõ÷Ûæ)4~k½‚5̰mZFÔW*èì³Ï“k|Ƙª(·˜–ÝÕ%—øAÅØÁI ¸ŽøÁh…1Íì€åz·[^̸/¼ðdYÆÊ•+ q¾Ûå;Þã F7Œ1uJƒqPÐÁXè¸<þt-ûª´ïüsp÷ tðRÊýA×^ww7š››GdßS½“IOá÷A»ýØÐÐà˜ÿ‚ .ÀÎ;+ཎsÕTÀüÎÆôÑzüK‰ÿ ãÚí¾îWÀâÅÎe+ýÎØ¸q#~ò“Ÿ€áwG±ã544àßý~ܲgÚÛÛhƒÜà¼ï}oØÞÇÛRïãgthû¿MQ°š•nÿrþš×í WîˆÊ%y72]]]â˜å€ù¸Û¢¯ííí£þXð¡P¨@þû‚¿—Ð}€n@˪C}#ú¾hâ‹ŠŠ tuuáPxc|š¾Ðö'úŸ‘- rɰ?‹•% ¤J ìf¨ïÐ ew¤ÍèßÝ–‘êM‚ÿVNðßÊ’Ý ŽÉ&…ʰFQÐÍ`8öÍ6ÞÒÒ‚;ï¼×]w~øa\~ùåhnnF’°@,çÓè­½°øí $r1¿ÿz<´´´èu¦}ÐÜÜ H$Ã{óuŸëñ/å½{$ê?eàE6æßߣéüÂüÛ fΜ zûawÏ4ÿv&áá¤øo ùæw.Ù»ÿ„ÿñ¸Qt UÊß!ŒiFƒí¯§¦Ï°ÜÕþO ÿåûÞ1äî÷m·)êM¥…²·c›ëOÂy{ܯ&Ô9jë.7öCøjj51Ÿay©®ŸÏ§²R;cÜx…RÆŸ5k–aYYY@–æ›æøæcOÂÿÃzK—.•ÇÐê°Æ4váÓ©¿W±ÜÏþ¿ŸbÈWªûo¡0ÆÔ³ÏÞdX¶û³š`øÌ˜Ç°ÜMýIl~ê[ ùÞk}{vâp¯W»Òï"—çoËÿà¹a.ÞêJâ¯ÓpvàJÝ(ÀsÃ\ƒø;ŸøGÞº@ÚàÈ[á½q›qäùcøëÀ4Ìh8ˆqƒŸÅ‘ç>†²Æí–üÙâ{<•Ê>£á .ðŸ>}ºþ?Ý`÷îݘ;7]_ZgÛÓÛp]ÓuºåÏ5> ü—ÿn9¤ÿ)Aÿ†‹7`ÕS«`·Ž9›øNeêZö‚Aø]Ë^@ô®.ÐÅý´Œ¾Ó2óº<ËÞ¾L¼)¯² @ @ @àÇhꌡm¾ÙÜÉ=44„×^{Í’NëäÓYCñÃ)Á/ø›D`r<Ž×Id^§øvÍàr¯&ü5§Ó:ù˜Ðÿ¼c7 ›èˆþçÍ"Ã4ÈZ Ȇ¹³x¸ÎKˆò×;`5)EL m0`WÿRàÐfzÌßœ¯ñ£^ü¿'z*`vàÇ¿ Ý€0 ì°›!„Þrٹ̜Á‹ÿ‰RR2“LjõŽF§"*lcLmii1,3â2ÓÒÒR°ŦãOF„YeG25y¿¬½¿¯þ-½Ž;4/þ7,³a5àÅÿæ®@ñM赑ãq\y*pß@ÄïÇóM²m|ó±áüg°téR}ßmÙ²€&þF籜ãhÙêˆûó¸ï¿Å€êO&o¼q•~ Ï>{þø­t]ÿO½ï5‡ôm¬E»¦hÙh®?oºF455¡uÖz×õo«¶c~òÓ“­Ü|ì)ŸïñϦ;Ɉ–Æ}¤÷?o’LçßK?þ1þN ºÞÿ­oÝŒ¶¶6}Û«W¯}Y© ìýc¾1Ý’×É(Ì€¸ìÈexoëa]àÿ޸̀qƒŸ)Æ`ð±#šéǸÉÛ\ ðèÂ}@ÿóÛãþ<´Ž]~@3pÃÅ ˯¹éFÿ«Þ¹×gÙWóµg- þùm¹1àÍ̘Åý™„ýwN¾×½õ3Ãz€Ñ(àõ'îÃú'ëË„€@ @ @ J…m´ÙÉ~hhHw’'6<ÖƒU—VcÃc=XîóÒÍùeYÎy8/ò—ãqøü~CžP,†pCB±** éæü¡aü D€&Þ³Ò@E~Æ`»ü… NOμ%õ}xLÌñÉ`´˜Œ”\ÄÙøæN~‚:ûK]³1QŠ渼ñ€Ù…ÌNJeD@â~¶U‹ßÐ`¬,–ª*Ïh¸Gä‹Ñ€åø­Çp@{¢§‚±hϪãÍÀIÜNBpÂü`‡Ük]æ«ÊÍ€1¦¾ð كqð¥D“À߉hTËSü¿sçN}ù\u]2 ruÖŒùø› ˆÓ¤¯¦ùd¢²%½¹jêqg`6`qíßÓ£Àß© 0.€ÚÚZ°%1ÄVkeàŠiÀ‹ÿXÌ$øYn†Û`uj@k²[Á{Ÿ>~jq÷?/þ¿ÃæŽF|èµ.6`^Ïl”D¸‚ºÍ+(»Ù+MÄ2R&v&|£í\àÏÓp…‚ZßTÌï<\”YàÍ3šÑoœRÎ*+Œ1Õ,¢ï´,×¶'?Èg8ƒÎš5 èêê2kºV£ÌmùÌõçþÿÍð÷ßÁÔý·ºÈ÷ßb¡™oiãDÎ;o2Í€ ˆß-üÇú_4ÿ¿ yßkéâÿ£O¿ øpó¯GmýéY;sæLZ™y¬Àõʯëÿ(òÒ8 ݯWls}Ší[õœ!íØg«tñÿ©Ol Ѹï㸭ºÔ=ç¼ï}O7 Žl¿ÉqÿßwÎ †¼mmmºø``€µO¦Ø(dYv=;‘YÜêóû!Çãúÿ@ZnhÐÓÌyˆ”Q€ëøfq/‰÷è -Jh­Wô4s"5¨1¯™‘¨ƒÌ\Æáêéøf̳,²,Ë,‘ß, ììžY*uCˆ%Æølë0ÇO 4H/¿¡äñyALo¯QeˉbJvnò÷³È—)•$¾¢(Rg_úÞH÷:‚–çjv’ ~v8¶•©$üöóRËc1f¸gŒÄ}¢âA4÷ÿ³÷öÑQwºð3ØBT2Xq0æC"Ycã4cûeíe â„Ýx&k“eKB×¹‡ÜÅ7ŸŽ®:8±9~½BVrœ'3d_ç:€ÏH,kìÓI°qŽ¥Á"Xñbã)Ù Á`{Þ?ª=Õ=Ýó=ÙíçMWWÕ¯ªºªºº»žçǶMÞ\w±ƒÈÿ2ĵߘx¥;)PŒûE©Gìîs€5= Þ> ¡9‚#4’¾=ˆüóÍöÞˆo‘!(»8¹¶c,AÄ"ø;AQ’sŠqÍ­dþlk|Bö×ÿ´5ŠŽnñOsºþç1䯀'1ÁXì¯bNáœ{XÔìíwÛ D£Nƒû8X´´ó£¼©¾gÀ,POØDî_òÀRŸc&œsO«Ô'_;Çqú xµ«8-œ£µHkqÆX"PY‰æ&Nªµ!î7g`ÿÙð/#ÛòóÎòI|Þøï _~Ž6Â훉Ðb®.nuÑCaÅ•CWx‹;½K Âáœ{zzz âh²=Ħfl>©Ïâ´þS”‰/HC¹’ÿQçòZ–ˆ¨UˆèKK"ÿˤ"þÛ L†‡‡1<<Œºº:¬aEŒ7tϲd¼VTõ½ý •5‘ÿeÒ?ÿí„J "y ÈE²ølÂÆ7𼄂ˆ¸ÑÁäy€ÈÖ0?çMà}‚Çmmm‰lÈÇœsÏæAp6•“sîiiiItvvZZZ2>ëD*9jb¢Í­$l w/÷¹ÿQÿlë^œžc¨­˜D7Ò¥•Ú·à{G>×_šË³î§ÙÔŸ«LI]we[ÿ|ú_|  åµ#F¾ÅèÙ’ÿ‰ë.\¸pa§¹b1ñ‚Üzoª««Ã<ß¶iæùÞ°õˆ oÞŠ³SwöçMÝÖ`Æ…5ü•)ŒâSÚlÇ=DÂ’ä~"ôÏ™“¬ÿœ9s06&DÞ ÇSÂäôùÚ'l:° , Ï4$ëx\û$íÏ 4 ÷Î^L½e zïTÑ{gö¶ïzû!œÜ¿·W&wÎ| òÿ¼wãvìÀ¼w£ u¸å‰¿Á¡{îÞ°cÚ¦†:œÜ¿ݽúÚ¦KúwáÂ… .\¸páÂ… .\¸páÂ… ‡OT2±šý@’ £i-ZdSœááaƒ”m—ŽÒf"¾Éä™äJ¤~%D ²Ò8¦8ÁX väXY 9ÖJþ—?ü©sˆÁ_ÅcYÜŽ,‹äëÁPVvO†mœPoÍý® ö¸Få >VUeöê12">ùgêc…Ú'⿯ڬòÕ é¥ôð+{ø¨®5ÛöKé}ÝÜ}–³Q=Niú¥•üÿÕ¯~Ÿù¥P>ÿ¿ŸÝþð‡¨Ö¯I)² ¿üßÿÛ4Gàðz+ (ç!“ÿwmÚ…?<-ì_µnÖ>²Mú‡Ð`AU§AÓN‚…–%—2Ëž7óoûúúðéÿõ£ t“M8»Ø@°Wº§§Œ{™öFPl(*Ä®Õ#|©½@Xí#ÚL”éAõ­­­µ=ï$ ãðáÃ)a9yð!ò?ÿe‚6(ôzç#P ûvå)F>Cþiø?Ú\c¹yКloèäñ7êO†ùB@" °hiçwÙÛ2[ì ¼?Pt¯äÔÎý>k7Ç0ÆñH¯i–<ð€íy ¸×‰1–xíÇŒç’agovœZ‹´7š=E#ÓR.º_õiq^^–þ\ê Ã,µ}ÙFcc#ø^±“­›0‹=Þ²)üÄ ïÿËü{c³Hv2z9€âÌ¿™àTÿ¹sûYö ÀHÏï,é6\ÿ­ù¢)Ï ~€Ù+½&¢þô>láB1îß¿ßt>\«³‡æ&a3ïàdÁùˆ¼YmÏh7ÏgÏ´ˆ{ïêã'˜ò±-œÚÿØ÷¿¸RŸ»»ºLç•`vóoÚû¯Å!ÌÊ•+$EVdÁ¹¶LBožì§|i>øñ˜ñŸ@„ë9ú]¾qq΄oÙþœÐ"Œ®ü8àlÿy`Íf\XcÄ=;u7˜Â¬¹Ø·ð?n|î ü¿-Éÿøñã¦0JWHÝà‘ýÎ]z-¦_7ÒÐpêqôνX*úÙ¦›D¼å$ iØôÎO0Š“®,G_I\~ëkí{ÿŽgc³ ò>ý–Ï¿sXçüÕŸSÎÉi½_ÿ{T6¬B¨ê›x66ÛpE\¸páÂ… .\¸páÂ… .\¸páÂÅDàR»@"ð—••a||ÜÖæ}÷݇––tvvâ?øéœœNÎ+[ßëóA‹FM$~ÂÌ•+ ûû,€ätr^YÛ× üÞjñÛkó­lÕS†ý½¯7Û—ÒÉy ‚l¹ŒmLçÚ‰Ü4ÙÅš9G—nw"ìùŸ6ZƒAøõÿ!ÆL 5M+zyˆüOÄÿëÇÚ2ñn×ø¸_9˜ÑÃs¾öùjnÿ¿þqü?ú-à×ï^ûuûƒë/‘}¾DügìVcóÉðð08Šãr¿,¦}Âàà ~ò“Ÿàªo}ïë{]>ƒ5øÃO–â _ø‚!P*hƒÀ·ŸKµÿ̾y眢Žs[ûÑ(¾õ«_aÎssàÑç–µÕk1ö«1|ëÓŸÎižË+W>¥or¤ãî0öäþï7çHB'k1öäæ|qŽ!°rås˜9SC0Øb—mÑAhCæ?ÿó?ÛzÌ&ŸöövÔ××£1ô\&Âuâ‘ë‰8¼Ò=Ÿl: ÿö“Éÿpã7¿ƒÁà„Üwd"ÁiÓdátäyL[[ÚÚÚ ež¹ßŠ”0hkk˹Ýr!ÿãš=z7Þx#n¼ñF£ÒÁÚFºx@ÁýƒˆQöˆ÷ŠI¿<’4y‰n©ó!aÈ?MxŽÓï‘NÂs­dÒ?ÿí„&vÄ9¬Ðw~ŽòZ†ˆZ…ˆ´Ú.l"@‚4€Ø\. ?¤†… ‚r¾mø“ŠòZê{û!Wµ¼–¥„M8çÖÏèOz%’ìiä#ôgO–Ç·Õs£Õ‹#…Éñ&{ÈË|f2qÚJÔ– (5ú9 “ÏE*¹q^­ä†DcM,ý¼XÉÿô,æÌ£M(Lר««K9¤ÞØÔ' œsOOO‰d¼&\×Ös"Y^ £ÿôÛzÈ­þéú­í ¼¶Å&Ÿ"zÿT« Rfymúu c,1 úQ«„&µÿå+Þ5Ñïß󵙩~ný'·þ“m¿Ô6‹)Ž7Qö­ï•@„Ø•+W"•••6Α7m;û2—âQº:oºjos£Aü'Ðû%+–†²¯o:û_óúð°&¾£þ¬¹É þh½o…¢Ô|½©ý‰èïzïÐÜì5DnòyÐHÁíï~ ´s‡ò?ÿ ê{ûmˤ°E«¿,®eàƒ"Q CÀS …×ßç…mÚÔÒlÿ ªýÛ¸Z%T´úÑß šþ¾»éŸCÀ{…Á·‚YÕ?“}Ù1‚èáêÕ« €ÊÊJhšVûôÌéÚgáõz €E‹e5ÿ¤»öK—.5Ò­[·.Å÷ž={lËsÇwe®—EáÒhïë £Ðþ™·oéóï̓øO(Æüëª?ýðáþ¨j¼ÎX²d6N*¼þ—Üv-ÞîE‚üoõJo%©hSŠVzßå„'ĸbÅ C€Dy žÿ¤}<ÍMñŸ`÷}6gyýÓÙ>·bµÑÞÏ´4Ä”çÍ÷bûÛꢎ?"ú;á5}Îijn6DÖú|P‚ÙÍ¿éÚ`þüù¦õÿ ­­­¶eÚ²eKÎm@^åç6©øÈ·îßu‚?`/ðþâ+ðÇ ˆGƒüŸ/ ¯öu>8¼Sn2·ÿÏNÝÖ`êl±ÿ†þçŠx<î)//OýåË—ãøñã˜3gŽGþMbsæÌÁØØ˜!@ÿ µ?/ð8zïìEÃ3 Fœ†S§ÄïÞ¹÷ãÜ¥×¢á™ôÞÙkýíòMg÷äþ¸üÖ¿Ì[q7nÇt÷†ñDâÛU}ÓtžÈÿpë§?‚+Z?‚©3¯Æ¹g_6¥Ý9óQ`Ó£ù¿©¡·ï÷½ùhŠÐ+àÂ… .\¸páÂ… .\¸páÂ… .JC€ÖN„ ©.?<<ŒüàX´h~ðƒè`îÑ4-aýPNyÓÇiÛ;äáÚ‰ð5iÆbÀ–-TVbß–-†GU%4¼d(/-…@q …Ñωð$I¡<¼þ*`ïÃë Rmî5Ù×óÒŇBëÆßt°SÝfl£þ1¸^"[§’®‹±ÙÊÎ~cèãõ’€,PLûr>väÿÿE9sŽ`0ˆ@ `ÄÑ4­¨öíÈÿo]óÀÚ—>Ž] ã·½÷ëq„@1íÛ‘ÿ›…'Žîž.<~ýã¸ÿ·÷£º¶Ú(ª}òCCƒñá}xøV]ÀgôËbØ—188ˆûî»Ïñü}÷݇íÛ·Ë\ ´A`Õמr<¿êkO¥ˆÕ~4Š•»`ekkŠJ¡XÿoëºcÀS÷:×ÿ©èÈ IDAT{ŸÂú'ÖƒøÔ×?@¤+5do¡P6D}}íííy‘‰p 248z6p#ïÉØlë„ÉöJœ‚L¸1¨¸< ¢F±÷’2ù_ö?£]ŧ‹ZZgû´&°ÂiÓ(}:ò:dC€Ï&M[[›!˸hj: EIÇñxj”—³‚ÇçÜ ¾m%÷ÛáèÑ£¦cŠ(D€ˆQ탧t‹@}£ñËá‰å/ «Ï¡Tˆô¹_™ü¿êkBpj2I¯>ŸD:?á¯Th”ö€ó˜s¼\a%ÿkš–qï]ñHÄØW ,hN¶ÿÙŸ?ι'4Âèu !€lÐÔœZïˆêÍ[€æ¯¥¡óº¯¶ŸÆr›{°ùŒó¢ˆÈäÿ§îcûø„‰Èäÿ`PÌÁ/™A¾ç±U¥²’=üU‚Þáç9Ý{KιG‰±puÞ ƒôO›Á—†Ît4¢{Œ ÐÖ0`>)0ò ª(5)DxKXÁå“ÅHˆ T£Œ ¢VáHT›ÏÑuuuXÂJØ6,i#8ç…­Hà£âXö2J„#åÒPßÛ/Î}tbžc ;ÂÙ6fêrœlÆçÜS^Ë›9Çf$Iý2Ùß*@áÒï¿ "¤œsOKKKHõ¾Ò¿á_Q²doÁr˜’A ”êY˜ÞEŸ9sÆ£õ…Íš5Ë”ÆJÐ ‡Ã¶miå‹)T‚vßÀ R$D¿…æ42ñ˜Â²®¦þW^ÛbKø—AL™¨)‡•B<±mŸî…]ÆXB÷Ti +e]ó±IcÊÎC° ·þ“[ÿɶ_*›Ù¶ÿÅb_&ÞVV U[+¡0466ϲ٦£xmmm‚\m!ü§Ãßg³¢¿ÄÂÚiˆç”ìïy²ýH$žBøOŸO|£ŠF¡ª!ÌJíßáç‚È‚2ƒ9t!!JS@û´Â:xïþ@ÛñÔ÷öC;wA–ýùj.ˆüHÞó=9¼{ã*G›’ýã{ÕÂ:xoÒ¿·‰b@õC‹jPB±¼ë8€÷ qὺ€­f#në„€†Ú6‘>—qKöËËËñOß–s 9Ù>$ÿË{)²…×ëÍɾ|í_z饜Ê,Ï{öìÁÐÐÚÚÚòµ?ç‘ÿ:ýÿïì“Ø¢sÔ0ÿžQÇSÿé0Ï÷àdôr ù§á-í4jrœów÷%Kfþ²ì’dÿl0Ë¿mmâ^>õŸòü `!ü§Ã¹«Ó÷÷cF»Š÷Ÿ{l÷“ ïP¿Z¸PL€´ç è߀äÿµþÓÁçïé¢ÑзÃ\ö‚˜î½ñx á?ú‹öY}ü¦ÿÇÆÆŒß@þ²ýG>@ï\äÿÞ;{ˆc£þº@^…!›lr°Ã³±ÙÀ÷þóVÜ“ûwˆcù`œ?vò –Ì»2%7^™’‚ˆ…Q·óf#,|×at÷†ÑÔPg wáÂ… .\¸páÂ… .\¸páÂ… .ЉKå"ÿÓ&¯×k:–?  §I€Ò0å•éÃ5‘ÿ‰è¯¦cÙ~0³µ¯è{H@ÎK‹¦ßÈ@ä"úwø¹éX¶Oõ¬öIõ›H r^vDÂL˜;·§NÕƒ±: ; Æ6Ú¦aŒ%(]¡ ²—Nø—ÑÅRIdŸÒ A$e êGé6pƒA“„bl‚#û¡`ë¾³Ë1îÜußÅÓßX+"ŠlŸõ3 b»¾älÿ»s¿‹µ?^+<ïÛ¾Þÿä>gýÏØ­¦8ÅÞ„¸jÕ*lß¾ ,À¾\õ-±!âßú#FGG±}ûv¬Zµ*ïM†™°¡É‹m¯Ç‚/ØÚßûðzlhò"”ƒçÜ\ðŸߨ'ìÝ6†9Šìc·attûö­Çw|MB ¥à\x{ä«Å¸ïòW`Ÿnÿ3ß¾)ìæÛIû]þ (QA†bý¥!åX…I-Z„euuu( 㯭­-/ûª*{ô¨€À† ‚|™-¡¥Ô`Œ%^ÖïqWë÷¸‹?óvã²èP§“ÅT²j;ùùŸæ" 8ï\@}*‰ìIˆrÚt}ÇI˜È– @® »ÝÝÂëx<žêqœÎɈÇO£»»ŠRù€!ø ¬q© ©×¿;¯´ÙÎ2ùBSþ*‘×d‰D£âzo8q‰(À¢©ó{±çFι‡ž5*ûUŠëlïs¬0ûßðù°ä"žK_íí_ñ“ÓØqheÅmwFíÎ~erßÍgTó³â‹Û©–—¥Þƒw'`"®ñ. “ÿ`ýëŸÞï'@@&ÿ‚ø!€R‹È"x¥YÍæ‡Í!&o¬½¨„ùVˆJ~'Btcc#ÈùY]]ÊkÃÃ.¨jÛ(µ5¶aùÖ¿FIDT/: þI¸ þwø…0W‡ÓÍ 0Ý*+‡ òq86Å6Ä1sµclÀ–ÈþÉú¯H„ÇÑRÏG|5‡ö„ÿKOe ƒCœ¬D:ôz[Éþ~.@d»8¡{.ù’Ò[†•ôŸ-+¦¿o¬¬.Ž@±êž®½‰¨ $‰Nv‚´²8A¨««KñdŸÎ¦Ó9»¸¥$ßÊ ýÆë±áÜÛ‘eQ®ò¬ë/‡Ûõ?+é?[æ‘hÒs1D&¢ÿUWWcÖ¬YŽ¢:²] {ûí·MùZËU( µÉK‘*Ó»Q·þ“[ÿɶo‡‰lÿ‹Á>cÌïL! Éic±˜A:“a ãœ{²Ý”ãÉïþê¼k©ïàš ù–. Ç•¾…æmÿk^Ÿ ó[ð°Å×¼‚ èóUbrÜuëŻߧŸÊþÝ/•9‘è6î#@R€îAG¢š! ÃVhû{§ßíÜ¡”øÚ¹CðN¿EĹûc†X€·#ÐØÜœ}ýõoÍÒ:@?ŸX( 8¬,a×ßç…M;ZTƒWokïM>C,@Ž›KÿÌ×_û) ½®ç¥óþ½µµ†€öºfȰ†e[«ýŽþþ”ñ_UUeˆ{ü“}yÿÄðð0³­‡‡‡m…æ¬aÙØwºöK—.5¼wËÂÒ¥K˜çD9. öôôääø€Ú?ÚÝòþé:$EFØIRYà íÿ—y+ð–Íüû–v—éóï<߆XÀ[yο€Y\‘wÇŽ½ X¢Ÿÿ˲O"ÇŽ½iȰ†ZÿKn»ï?÷bJü÷Ÿ{—Üv-³·z9n!ó„óâøÂ… ½£££†@€ kXÁó_5l÷ïÈC|¾FC,@Ž›íõw²-·«Œéûû Á…þÅ ±9îç>/~ÿâç«sqU”¹[véû¦Öêç¯ôz €]Ѩ! ÃVHûß>ûßð,þÑÔî~u+Þò]ïÝø=bÎ¥¹ZŽ›­@$y¡/߸ñ­ÇSÈþüx So™ƒy›;ñ‘oý þ¬§“EÊ7æO€'ûSgÄToúüÿŽ`^à Aðß]‹©· `ê[ŸÄ‡ç@Š ÀøS7¡lý‘‚ì/^¼ÇÇå¸'ƒI²(ÂÔ[ü8ø«.ü•Hc³½g;îktvÒ‘ýMïü÷T} ~AdAðï{?¦Þò8zç&’‚"Î#û'lzç§9 t÷†ÌFSƒx—ûÄÀ‰ÿhZñ{t÷†ñÝ×îÅ…·?Àë[þŒ/ì^‹s·ŸÃºç×¥¤Ý¹óAÜõöCâ÷Ì$‰ÿ'÷ïÀíúÒà®·BîÏ«­\¸páÂ… .\¸páÂ… .\¸páÂ…‹t˜$?8CÓ4pÎ=œs¼YÆúá„âØ…Óok^ÃÃÃðz½)¤6úàŒÅ èD?ιG‘È8ùØ·æŒÅ ¶ö;ü¡fx’ãœ{ˆ¼Ÿ¯}k^¡A^°#õY!Ç™;·OK’¯çÎí3þä4Dþ·Ë'Èéúôh2á¿sãÏjß–}ròz½ðz½1†ÇÀc Ę.÷¹BíZí‡FžþÆZô~yvÿ'.{éøì¥c×ø¢÷ËË ò©ì³~†µ?^‹e?\†_¿{=º{ºÐÝÓ…_¿{=–ýp™Aþ/™}]€ó­ƾ}û°oß>ä°Õ ÿÛ>6Õ<øàƒÅs÷üÏÝókŒŽŽâÁ4Å)ª—‰Ú½_^–b¿÷ËËLqJòô£ û/\õ^¸êŒŽŽâG?ZfŠS,P¿ëðsøp•Éþ /à†³}®B ÀKJþ¯««ƒüWYY‰ºº:¬* Â[ ÃKl¶s­µ¾ŠrÖ¿„¾Ÿq|Çø†Üó-hŽ%ò¿öÙÏNF1rÂÒÐy„ÿpy@ÍØvtž<¿ù×çl›‚‡pIi ­ƒ6øtø¹‰ÔaYÿyaýË%ŸÃ‡ãðáÃÈIƒúy9Cww…éÏnœ”—345†ªN+Ú ƒÿ@Àè7Å@ûài´UW`È?mR®¿Õ^D­2‘síP칉sî)ÛÆ°áÄiø|bc£ù?)þÜÈ9÷Ð&ØÆ*À ÛÚlÉÏ~0Ä’06¬Ú1–ˆG"xMÓ°ä&Œ|Ì9÷\9¡â'§± Y´¿ù¿˜íŸO÷WqDÔ*!–”ƒ€€ ιg–RùoyÃî„ úç80.êI¢rÚ&âbó_±ÚƒEXTŒAO†e^)ÖÁ C0(Öb^oªøJ1íkƒâo„ /Jvãm"@ÏÎÞêÂE%& Cþi8½åµ…­9çžž±¡˜®Acc#¬a“u]Þ*ÑGQj ª¨jŠRcüZÿe7ù¼èð øQT›¼LO&Âá°A´‡Ã8£Ž#> ú(=›¹EÆX">ÀqF‡ré @àO*Êk¶ÿËÔ÷ö‚Ö8õ\"ÿ‚üÏWs”mc(ÛÆœãäÐ6ëdÿ-Í có6¡ƒ1t0fØÅÉ}}}Ƴ•S""Êñd"¢|Þ)= ƒ:A^Û«•j%7þÓ‘ÿcƒ€cÆoÀüÎN­L/ò;¯Ù ­»5žÓy">0ˆODvÒ4-­ˆ¬, pæÌã €Œï¤&êúgZ_ù€!äIÀ²mÌømYÀs"ù®È\‚/¢V!¢V™ÿéÈÿG¢jtñK"mÊïÐ#jUÚþ1 ú'µÿÑýö†n@Àæ;ì¨By&£³³3å|¦þ” vu€ÎÎNÄãqIqù¼5@ €n¸===içá¿ÆúÓ=v2êOïŠUÿ\í“0Çd¶|¯ ëykÙ¶>ö¹Z¼þOñeò1‘mÝ‹¾ž ±J»oŸaÿàûâÿºõÙ½û•ÉÿÅÄdµÿ`¯È®#Б]ý ò*á¸LZÿÓ?ždÓÿ¬äÿb"òÿdØ·:O˜Hûžöäµ½±±1ë}2ù¿˜˜¬þïËaþ•Éÿ¯tO/f1&­þ{Æ…@®ó¤Ïõ2&«þQ-ûë_ô¶¿A¬a>÷ùþ¬ÇŸLþ/& iÿ»_M:?¹äë_7{¼|6¾þõVÇübMMø|cEÚ÷"Ž—o\ŒÙuå˜{ö7À£Š)ÎÉŽ»ð—¯\‡/?ùßšG>ˆÇãJ?»®WÿÃM‚ü/áÂeÏã£K?³ýç1õ–)¶q ±O¿× —ÞöŒ™ëwë§ÿÿü•p𹃘zËÛ8…Ú¿þÊÐÚ² ?QÑ{g¯)NéÇÑpêq]`Šmœl±s惘·ânã¸nçͨÛy3Ýû{º÷÷¸×ó˜NÚÓˆsrÿlöµaúuÓñló³¸õÓÁ­Ÿþ^<}_ؽợ©¡u;o6Òt÷†ÑÔPï×ÿÞ¯ÿ=Nîß‘Wy]¸páÂ… .\¸páÂ… .\¸páÂ…‹lp)ý â´|R']缈ÒÉùÑo§ü‰ä'§Q‚Á¼ì[Õ¶é·S~DÖ·æ³9”û*Jgg?›ü¬$~¡ònÞ´xêT=æÎíéSõ¶"5þl),7o0VÿÀDô€zÆÐÇ9êC3çh拤øË¥4õ”·³…ܽ^/È/ƒÉÍ¥$Cè"âú}y>§‡÷"éµÔöY¿°¿ ËLçh³pÉí³º÷¬­ˆJ»ÑIœ¢ÔdMÓÐÚÚjþW­Z…½{÷bÕªUزe î»/?õñlA$Ìm:ៈnš¼¨QFrð ‚A†—|C'ÜMøºñ4áê`Þ@ñmÒ|ñ ûª:Í ü{½дÓðz!¸Ù+â”’ü Å+ „‡Sɶù”Ã. ‹²¢÷qx|bs=Û6±^¸c Ý“à½^ƒõhooG¶Þe²±QŠ:- G_ß\|å—§2Ú—ëxôèÑb%k$ç{qóVÞjçMI䕨.ŸBÊ!®É‡ôßï¦)¯ˆó¯ÿúMÔÖ֚Π蓲%ÿSyÃŒ¢œÏ¹ìùÀŽØL¿³!÷SŸ Ú¬)s-‡¸þb#n[uÚÈ÷ |W¡©[+Úõ7­5 (€$±Æ_ÅI«Òø)É8ŽF+@íá|¾tý¤gHçð¹gHõ›r;‘§*Zgf"ÑoY@>WìkðjW*JÔþéÆ!¢V¡Zçè9‘Áˆø_ˆ‡v»täœcGB CDÐEkÆE¼äw_ãœ{X4Ùã8:Ïècp–X °héÆ çÜ &í«ê4D»OC|> àííwø9¬Ï ÙÚìééI46¶¢ŠoÁ0i$ó‹œs÷‡!–†á‘sièü›6S”ЦuE©1y†/º@"¢zÑA0¨U8Õ°9$Ä0ìÞÝL4êêê°>„•TQ½-²‹œsOy-K¨ïí‡j9§\ºê{ûuAvqJzÿÀÁá©‚AøgýÌ —mcBüMŠ“Ëµ¡¹ÛÏ9:ÃfÎ1!ò˜¼¹ÿå8ù®µêëëD¢´zA—ó”ɯµJÈ _’·u«gb»òØy”ÁKD*9jt2¿, ÄÔÊÔg˜CžÍœç*«E^J,µ/Êž„­e¡ßN$Lj + Óº~ ö­¯¯·]kñ‰HþvžMé|YYê*B ¾H0+pô¨ äwýõgî¼®¿Õ£%ŧ1D$¾ÚþYÓÉëoÙ¶ä8¤c@d™’ýü#HªP^+ "‹ÐükÅïÀ€xn¡s7ù¼pZÉž„­e¡ßéHÈå«”‚úsîÙ²eK¢½½eee&ϵ”]óÚ–½ï·pžòY{Êe·þkô|iŽÏ˶HpbáÂ…9=÷_Ìõ¯««3ò­««C8ž´ú·´´óà<'äRÿ\ì—×¶@ŒSaŸÆl)Û_Œµé·RÔöÏdŸ«Ü¨—>¯Í~:ò¿UXXöüMï¢å8fç8W„m'ãf'`%ÿ‚Ì@ú $Éý}œç†-q Å-¦c,1kÖ,„Ã⣠‘‚'‚@ö}ÕÕPBb“‡ê¯Dh$6¡öå øã8Ð?±õ_²d¶.>]ˆ¢ôöõMy•••زe ! išAüoii)Y9ºW«—ùÒ Ê ˆnÝË|FP¾üç%³ÿY €_Bìà;ñ›ˆÿvB*EƒOÀàÃUP‚‚dèÕ ÿÍÞ«Œ F)y?ˆÅbÆ'+JeÛØTÕ 0,@bk”!ÑëEð£Â3m@.†Ë*´ß cç܃ ’ød“ŠWº·‚±ŽéÚÛÛQ__ŸU9j”´··ã!\‚³¥ìÏi o@N’ºÓ{$žÙyAÄWk8ÿþœÓ០÷‘lÉÉŒ±D<ž»–îŠÐ=§½½=+Aˆ`0hüΗˆmýÓxä<î&/Ú¢(ù“êÝáç¶›› ÎN¾´ƒÏw8‘á|‰l@cÀSµ_LçƒÎ§3B¾nq@F(¯©1[Ï;åSL,h>³?q>_Ìö—ë@¤öj/ÐÔœ¾ÿÉ"ÅB <:K@:ìNÀˆ“/!ŸÆàøŽèBorCý‰‰ƒd_U§!=­ßc2#É4Û<تÂó)œ *!‚ âwh$•äWêµB!Uó 2Ð3îèè(êêêÐÓÓcëa~²ë¯ªl ÔÖµ,á'dvM¦K%¸b…µþôRYYi¼ È¢ùÌ; [‘PßÛíÜ!?ª ð'ÕXóH€âLÆZ™¯æð@¼ÅÆ«òóàÇ9÷„äõcˆp| y0K„?ç†(@¡ kJÄB" ©°­­-)ô“ù•Ò’ˆS¾ÏDþw"û˨Ôï±A Ko§æAn„Ë !“:/0䟆¥6"¥)„½~To+ HŠu•——H¶/űkƒññq¡ÉŽèOñ¬ðz½)"ߘÜc›Cù\ÿ\È¿”¶±±@zAĈ$湚Ûý)žãxŠ@1!‹¯d‚LΤ9ºZ ‘Ðû_(–ðy©?¥íÙüú•§­­-ÑÙÙ‰ÖÖVlÙ²%$=ÞËc^þO¿é|‡ŸÃçkÔÓ„r`ˆè"Q©Ü‘@¬‚PõommEeeeÎïD‹Uÿ!ÿ4œñ}6¯úÓÚæÌ™3&¿üŸ~[χÃá’ÔŸú“<æåÿô›Îù\O““€ýø€˜ d¿üŸ~ÓyY¬­¼6ûgÆX"¾Wµ#Qc®§0úO¿å±å«”‚ÚŸ1–àªèËž0þåÿôÛzž)¹÷;ò¿L²%ÌŸ?ûöíËXJ;::š‘øêTžÕYÑ_pþ‘¡uõÀÛÜh¤!is`Œ%"‘8¢QÑoCäË ÿ£«?kn2Ò(m:;ò?=çɨö]]™ï?”vP3„1roÿ€mÇ;`¬¿Ó¡»wM µF¥M'`Gþgý,E(±€ùÕ®}ùõ´ž¹ Qyâ{UhG‘S Å ú+Ó¦éîìBSK³‘†`¤M#`GþN "pÞ¬hí­­E÷O3KžQZm` µAoÆþn%ÿÇãqcí@¨ªªB*)× J;22‚@ €`ã͉ü/£¬¬,íy+ÆÇÇi]œÓüÿÒK/Ú¶¶¶ŒÂ»O?ý4Ö­[—"nEi3‰Ø‘ÿCŒÁoÙ‹p€§³¨¥ýòÛÀKœQÇq2z9€Ó¨‰1ÓºËG»¸±ù =M”6€ùŸ±à|«)¯¿,ûFz~—EùEÚ¿ðGÌòïB«r®ÿ”ç1}?Þðîî'ñ¡5_L›fêCâ܃_I!¨SÚt"väÿp8lZë‚пÿþŒå§´'NœÈK î¿ÑhñÌîÏð>£«»ÍMF¥ÍV€1–ˆÄãX}ü¦8Û¦`F{ú9ïÎÎnô·4aõqóÇJ›IOfß° IDATÀŽü¯ƒ kB¸ÒëEwWWÚ²Èi_Ó4Ä#”×ÔäÜþˆÅbõ4as,ˆ€/}š}÷îÃÊ'V¦8ƒèҼ蹬Ø€¬¾Û ÿ#ü þò•ëpáÐøãèÇ1·IULäÿ/?Ô7…ìÀŒÕÓ0®ÛŸ§þ±»Ö°¦+†]"ó?~sæÌ1êO„ÿP0dˆ”Âþ·¥{oÃ©Ç ûóI¿Sú\ìÕí¼9%ì®·$íW6ˆ!‡VÜc'_Ã’yWq§ÎœbJëÝ í{;ÌFø®Ã8¹æÝU‡îÞ0ð½Ǽwãäþx6fÞ§çÂ… .\¸páÂ… .\¸páÂ… .\ —Nv\$a%ÿ¡H’úOªç[SÔßOªÇ’%}Žé²°’ÿHçˆÔ_Ïš97Ž)Nc†(€]ºbЏøï"ÂIïúæHIq}óuÑûmR€ÁÄ'ÙS9‰Ä|åË^ûWƒ )ðr €«u²+…åãá'[û55bce <ÒD_] TÞ§åMÁr™Ši#p.¼ûJ³ÉÞ´¡ýei3Æû÷VãsHn´ùÅÏW§&œdp.¼·Ò†æl6áÒF³o?÷2.¹íÚ )g¶°óî.ÃW]  ÌKˆ¶8|ø0€T26(T‚ÈÿÝÝ©^A3A&ÿçã}ή,Dþ—ÉýL׿À‡=ëPÝÙnvDÉbÁJ¾ôÙ€÷Òžïì)cÙƒ1–ˆG"x-ÃF[ëù%<`ÊÃ.M¡cáìméÏ—ºý›šµŒã Ôà\x‰N'@qÖŒsçX®>LcpVú¸¥ƒ2©ß—a3¤·ºpólUka”D<£ ·›CÌvÜå;æœÆð_5ˆÜ¦uõèÞ6K3.8çžp8œ°ßV¬X+VàÄ ±é·§§gBꯪBøÄ§{üü$Ÿ‡¡âk^¥¸ä‚¨†Õu2RòúÓuX¹r%zzÌ›½-Z”" P̶üI…òÑÀ~CøD\@ýÉ/a|Ç¥'€2Eضü…°d±?ç(¯ÄÿÍ.ý½’AÉ·þ}}}xûí·ÑÒÒb" ò%ÿÖ*!‰-“0 ‘£@FŸDô·# rÎ=]Œ%Tp¨•J,u]ÖN£Î[aÌoKCçA$Ä¥áß¶Þ–óµJÈö¤³³3gÎ4‰ÁÉä§ááaCôFNG¤';R¦¢55ø œ9CÞŸE2]ÿ|É¿mmmñ@ AŠêO¤}ÖÏlëObŸv¤@'Pž¹c‰ø@µÔ¹5ˆèOB2HÄ'âscÒ¢¼º ú‘ó !gÝÿìÀ9÷´´´$úúúÐ××gŠ/÷}´éðÛ‡me×þª>þ ª$˜a€-1­¯O| ¨¯¯ÏkΧþD<¦ùö4Ëú{½^œ9sÆ£¹ÂfÍ2/¾­ïÒÖ߉ Ië0y¼Ëa¹ÀÓÙ— ÿ2õÇyìÉaÙ¼—%â›Lâ¥ëMa²§oÀ< ù¶?Í…‰Ç&Ïc€N‚– j¿gpÐ$.K÷òøÝÓÓcܬD3:^¹r¥£@m! rØâ}Z>®UBòO3”3ýW!Dò‘ûÖÌoù¸¦¦ª1ÂÞ*¦ÿ*n½ÄÙF"ÑmÜG€$‘ŸÀÊkGŒùÕúNL{ÑÜìÅæ¼ÿ"r¿vî)\>® z¡b¿F‚]†pW¯Šêg µæÓ†¼ß'FOÀ”äýß*”<µ2sÔs‘û5K»ËÇå« ¨~#ŒDÒ“bé<Î//´Ÿ ò>Á ò¿®Á{…µA/Ð…^·”ãu šþIÉû=qG¿!$$‰ü4þƒÁ ! à4þW¯^·}MÓRæ+ÆX‚æ!™üoc( aDî2…ËÇ×\s öìÙc„Ñú‹þ/Z´+W®Lk'ÚÝmv#"ÿ€*Àô¬gát¼@†×ÔyáÆfNF/Ç[–ùW>ž¥”aÈŸ «Ñç]úpÂ+ÝÓÁØF㘈üÇŽ½‰%KfãLh! ïó ã%ª¯Ã™4ÀÜÿþs/šÂåãþ¶hW°ww?iú¿gÍqG™ów½ç&!E"òŽŽbþüùhkkƒ,†)ƒŽW¬X‘"ÆX ¹ßú /‹çýd½+O¾3"¹âÜoWkÊËA¢ € ÿËÿ÷´«¸ã7éd»5AÞ'‘W4е>Êkj Q€]Qó:`W4еšš›My +W rÿ«ä¯Ý¢¯‰#---hmm5úÍÃô¿1Є_ÝèÅY˜…4ÓaÚ7oÔM?Áìº/#¾õ7À£ÉsS¾4_½á»ØyÇb”µ<ñÎ{A¤}+ò%Æ_x‡ã¯g`êš)˜qá&̸`>¿íñÙØ0u·ŠbŸâ–——'ˆì?õ?ÆÆ~ƒ±1sÜCÿz/æÌ™ƒP0Tû›lÂ?ø³ëÊñÈr½wZì_ÿny¦½sïÏÛ~ø®Ãèî £©¡u;oÆÎ™"‰àò^Ãk{pèÞߣ»7Œ“ûw`€y·âÅÓi5Ï3+þa`ÞŠ»q;v »7Œ3v>Š» Dº{Ãf£©¡–×Ç.\¸páÂ… .\¸páÂ… .\¸páÂEQà \„ »K–Ì6>üZñõ¯‹ÍªO=Õ‰õëÍ„9œW¶ ÿrý÷r›8o?õZZZÐÙÙ‰£ë×›ÎÉé伊 &m`Eòçââ†ucô–-[R¬›rJiŸ¼ÝËa$0ö¯Ö½£Ëa$0öå|J‰” ±XÌ ”ÔPH”îR`Œ%dâÿ/5 ÊȬ$ãbµÇ+ÝÓñÉ&*Eñ¨Jés%ÿ¿»ûI̸-uc1c,1£]ŧjêý¿òe*7ÙÌ6¯ºÀ B#ùß­äÿBÉü2²)“Lþ—Éü ì2Nñ ±A¿s¹þ÷jJdGvȲçÌLbÅò>n…îÀ+-ŠéÞ éîñU…É/Èä™Ðo‡tçã‘HJ˜žgÞýbÇ9àîéé㔢ýc‰\É`@iz¬"ñ®Ý&6íØ.6ä./@Ää½öÄÄAoú½›&d"šþ5Ã_%ȵVO[Vo‘„ܼ͡ÃÓ|/Ùì@ä6os#´®¨•uÞ , /Iߟ?¾i“3‘Ë2ñL §åZ"ú;<}þ¬¹ 5ÁR=uÜäóâHT3]c»9É.ŒDr­¿±P†¼=cÑ¢E¨¬¬,ù‹sîQØŠ‘ý½ÓovîRÑÔP ïŽýåÒ¤ €úÞþ”|¶"¯ú;y÷¯$½ñ :ÑÂ[¹‰¨\„1À9÷„ôòt0!0A Ù¬{xܬB6sûòv°ôãŸs¯OIïï"Õ*mPý9“åcmP2µ‹üXIÄ=•Õ@lPþ›97ˆÿr¾JL‰­ˆ ŠôVpÎ=JŒ%!èóŸ•Ô«“ø An—Z%”â}`xk¶iƒñq{zVRÔððpHŠm,Z´eee¦ø+yØÙ\òdš+ù×JþO'b%ôÊ,B¬_ïÏ«yÒÓo•9>ÁJžÍƒÒÒ¦ÆF8‰æb"gaS.c2b»f$"§$°©ðêçe"r.$äòUJ^ýÏ®LÔ/¬ãÞºöp­ÃrY»bœöcÕÜ‘JŽ0^è3°Sý­^Æ@DdšS²Íò¸&ØeY ®®Î Ì«þÖqo]{9ÖóçÏ/Ⱦ•ô?˜%¿“Þعt ¯×&ÕÃ7`B£°ö§¹ÐcóØi7—É¢\å9]ò>Läkšááá„,:ã´¾³ Óº$²¿ÝÀ.Ì.޵.JŒ%TtC 4e &²ÿ6k{»0»8)ù•ÄÁ€jòMíOäkšÍ!–×ý²@€ ëóßæC„(@> ²¿AÞ—«afÇZ— SèUÑÑÐÍÁÍÉú«Ó ò ¼Ÿ%dÑY @†UˆõëëòŒ%µ‘ý‰¼/Ã.Ì.NJÿ Ūß,TMןÈÿ©mLÎ'¿È2ä8F¼×dÐÏ%ûDþ· y! Ȱ®5âñxVß#IôÆŽü_(rÌ’Ad»oÙ|hkk³GT1j"ÿ[Ó…t8éØÖ¦ßòü’Äò‘ýklæZ»0»8ÖºÔÄX"b™c‰ËªAþO€Ø˜à|«|lkOŽCñŽÛŠ%Kj"ûy_†]˜]œ”ºì~2±gÍmç"ÿ§ÓYÄ/ÈýÖ÷5$/ˆìo'x›®Ý³~h„%Åý—ÈþDÞ—af'%ï6%±§]ÅçÐ_ü|µiüÅÕ€AþO™³ƒÁ„*}ƒv"÷Ëqäxk3–Ö±X £££¶b*51ÄÄöwñ${2å»Ý÷á`0˜øU» ´)¿7úK{¿ (߸ñ­Çòÿ?Cx÷(^½Z_ßëç¬(ß¸Ø ¦ç*0cወ÷Wb €³SwcÆ…58ÛX3€Öà½3Ç1£Ix±¿ðæ­¶yL}0oûsæÌÁœ9sŒßccc8øÜAø~Œéß?n_ÿÅ‹ó«?µÿ·õ{릛ðÈòG€! §Gï½x@¯Þü8¬õ6ØdkŸˆÿ'÷ïÀí•"ì®·ÂΙu`ˆ\~ëkí{;p죗bɼ+8ç~wÚKÿŽy+îÆÉý;ðl̼çnçÌÑ´â0óWÝΛ³m.\¸páÂ… .\¸páÂ… .\¸pá"'¸ c‰¹sû ÿpêT½w#Ö¯ß `+Ö¯?/}4®OÌÛgJCy‰|ûÔÛ~ôbŒ%ú8w$üB}Ð7¯_fGׯG—þѾ^ÏCåu†·¶‚ˆqŒ±D 0}Ü ƒVtÏãvöU¥is‹ØÔR %›ûã¸iS0Û&ÂØ¶â’ìÏÛ‡S§dÏ:ÔïìûV1Á9÷lÙ²%¡o"c,ÑÚÚjˆlÙ²¥¤eà\x5§>@ä8ÈÆËR¡ö¯/¸:4â$pu‰ÇçÜ£(,‰pÔÔ«ª: 55Ì8w1óK‰(À¢Å!¹¤³Eäÿ$ñ¿tÄJ±gcâ•î­B0„ä8)ÇA%ñÉ&¯toc ò|=þ|¼›aƒÙƒxG³É¬Hȶìt( %ÿOÄ8ŒÇ“÷{ ˜»9Çdk«\IÄó Jg™ôŸ‰HV ïãÙÂR)‡ž‘âÙ·’øËkjÒž—ñš®+½^ûþ÷ È„«oA$ _lëÖ²"0Nd€ãܑܿ4tC÷Uàí§ÓÆËƒ-³ñþ_Š1Hd2_S4í4‚AgûÞêÂ̓ǭ‹ª?kÒø|‚x)H¸œæÌ¬=ðaˆ®ÙÞÈkv­*Ú'q¤lIg°p¡`D U'ŸfUÿË*¾æ„.ŸO0‰ìŸ "‘8jjÊ‹:ÇÉÄÑL8P­ï%OÖ:a5«ú‘H÷ìdœ9sÆ8sæŒ!ü¡iZAõ''N˜ÖTN ‘ZsYxmP3¯iœ@´æ)ZTƒ×çE­‚ê¯L;iüiG¢†`D¡ë`ò|^¶-UèD†ç„y­BÂ'Åü&‹Å B¡ 1áŸH¯@ú9ˆÄ—T¿!¶CH'$Ez wd?‰§¬ùÓ IÁ°‡µÒ(ã‰jˆ¨¢ÿÙ Ó¤#üǪP^›YÌh›õv:A )¾¥;”MurFb$Ù¯e‘B:Â?Ýûìêß«¦ÜcÓ ’HOæ;h¯kP¯«å-Q†4„ÿ€†Ú · QãX,&ßWRΧ#üÓ÷éBìËd~§¹ÆIèJHkŸ®ýK/½dë]ÝIöìÙÊ\‘<1‚¤È[‡Í³`:Â?í=²ëÿgÔqœŒ^n:—NHοoaÝc‡äŽä^éÿ³ü{Ъ¬ë?åùAÀÆÛ¼“ ÌhcSxd/>FGG Aµ×ÙéÿíííhkkËéþk]ç§’4ù®û{o<ŽÕÇÍkÌt‚€~½ ®Q©°+űøq:Â<AyMMÖíßÙÙ™2—’ €“Hkk+çwu2Æþç=`,;ÑR"¡ß»àkxâÕ‡SÎÿvý{òµOНÔÚŠ©x}ëq\qòE¼ûƒ»²²iµ]¾:õñÙØpÿ›)q˜µØ6mÇÉ—›ç]ƒ oÞŠ³ýçQ¶þHNöAÞD"8ô¯÷â–ÿùDÊy™(OߢÏ>ê» ÇÇÁçâ¾Æûr¶OmžGÝhyæ:®ýàÅù?6D6½óSS;b?0á»ãàßuÁ?òmº÷÷@,Œ+Z?‚©3¯Æ¹g_ƼwûwàÙ_ý;g>@Ü^)òf£©AÌE;w>h²Iñ]¸páÂ… .\¸páÂ… .\¸páÂ…‹RaÊdÀEDþ?uªÞøÀ+sÎ=ôÇØFÐ}Pãœ{(.ÿåãcÇR?É ò=cÆfkùX¶ßÅèO¶Oq‰ø/(z‹¹pƒ¬L,1”P½,¹ñx2ìËÛ'þWMªýÿа#ÿÓÜ[J»toy¥{:^鞎˪é1–°þYó°¦á|+œâÊhkkC}}½£—EÆXbF»Š£GÚzwø¯ ùÞ›í_!¶ÊËššN›þVÄãÝÝÆ_SÓi¨ê4dºÎù”§­­ 7Þx#@Ñ󿘡“f$½øe"’cã¿]9XT”#‘fw"ª{.Apòü#Ã;àC]]]Îöåù©¼¦Wz½xMÓLVXÏËKx åHŠäZ>ι§U_“ï8çoÇ9àµsÅoÿ¿v, Ç~µ+¯´œsOÙ6†–YÉ1˜IüÇw¢xcP+‡¯©Âð$›Žüä¿ õb„Ü—<éÊõõùövói‹°vaí4fE‰YùÎÙ¡Î[‘ô”]"8‰2È›^.\ˆ'NàĉÍ‹ˆö°ÅÃZÑè ¢ÑAC€ÎY!‹”ÍÍÞ´Çò=¯Ú+HrƒšÏç~‹ÅŒ ÇV1 '’=‡666…üoïô[lÃeÒ‘÷î ²’NXʇ”ÑÉw'Ìä::g‡²mÌ (•›9·%~‚B¸‚øÿ;=<yíÜáçèðs´µµä¦Lä_Ù;m®äµ’£&Æ Ï½vbk:I?%­õO­äˆz“@Ùó—纥¡óiÉ…D PýhkkÚ1æúLÂ9÷ c||^¯7ãs'yOuj3MÓ‡¼ÒÙ¥<ÑØØˆ¶¶6ã™4ùW&¦äBþ·+ëgé/SýIÔ©þeÛ˜Â׿D6.¯1Ä,ò²’/íÊ&‰®äÞÿ$‚¡L&¬UBiÉ…DXŒïU1Kã6×þÇK ¨~l1cLÓšÂÉuºuF.kXš¸Nç”C‚üOÇJŒ!R™ß³Õiè<–†Î€±¢c+ÒÍ ¹’ÇÇÇs>§iΜ9c 5Mƒ¦iy= IÑ¥žžcLӚʎ|¤'åº#1ŽeÄ ;ӚƎü ¤îÏe ”vŒ9œ«UB‚ ¬ÁZ%„Z%„ø^5çöwZ_¤;W¶k:.ÛÆñ9KûN4t/’ëB"Êß¾ä4DT6Ö‘t?q*¹ÕŸBö§yL.“üŸ7hœ)6Þ§)¾“€c,‰Ä ò¿LöDÌ^Ï­öU5b<3ÀAÄz|'§{…üŒÖó$ŒáÔþñ*#Ï#Q ƒš‹T¥oÿ€fÿe²ÿ@ÀÜïSꯋlÑZ;øQçú; 8 ÑZH®ËiíT®r#OZÇs•§Œ±D|¯jÿe²|¯jŠkµ; ú¡E5c~ҭ霂ÓìßésÎ=Ái‚\ª½® !€ËÔ´õ§ëœi@×Ö©þñxÜÑ~<.ú?p²пÝ(ÀÈÈ@^ï¯å¼‡‡‡MBNö©|”†ÖÑNë_ÆX⥗^2ÈÿwÜq‡Aö饗lËCÿ÷ìÙƒ¡¡!ƒüßÖÖ–qµCÈáY…sî!Ò/=Ï‘€SýÉAˆ1Œ@< öqŽ>ž¾ÿŸQÇ ò¿Lö?£š×vóï[Úiƒü_“fþu÷rXÓ0¶€Ø#rìØ› GNõŸåßkäyìØ›øð Ä,ÿ^ÌòïM[ÿ)ÏbÊóƒ)d"˜;ÕF»Š÷Ÿ{Ñ ÿ¿»ûIǺ8 8=#Éïþé} Ý_êOÏkáp£££8qâÚÛÛÑÞÞžÕý×JöÏtÿ%Á/Zç;=ïsÎ=vŒ±D$7Èÿ2Ù?Oï¥ëEäÿ³mÎ÷'@øçlÜ¿+5 8Þuqd%Ä®h¯iâ‘â‘HÚöïìì4Èÿ£££êv;;;Ó¶Akk«é]§Ó÷aι‡òÌá¿©E|ëqLùR*áÝŠµO…¶b*v}ñF¼3ó |ò?žÆëó®ÍË.y¬ŸÕ|3.¬ÁÙ©»mãíO>—}ÿÌqlžw 6Ï»gûÏ›Îåc»¦¦—ÜÜ‚±±1[Â?|î ñûÝ×OâSŸ àSŸ àDì„é\!xdù#hx¦ÁþäPrvíè—ðâüãÅù?áCÎÏ4'÷ï0~Ï[q7n¯|ݽaøG¾m„75ÔaêÌ)¨xí5¼qðJœÜ¿ÏÆÌŽzvÎ|Pè¨Ûy3êvÞŒð]‡á»¶âñ¸‡ÚÖ… .\¸páÂ… .\¸páÂ… .\¸(6.ì¸HzUêqê”ü1<«;x^¶øX,>°Y½´3ØyjgŒ%ÈÃZ—”w½ž¯ýzéƒ>©ï“!›ã¼‘—•Rl¼—áõy›M,Åöüè„ÄB/ì¶µsµ ¬Äèàøß®ÁÇl¾¡¾ˆƒ‹ëùÑ úHÜÒÒbô­––– ó:ÏKÄ|åËnØ/_þó µ¯¸ZúÀ­ƒj?¢V¡¦fİ_3}îbc,1¾gôþ[l(##†ý\ÒåºáÝ|,6½Ò½Õï“M怀ØìùJ÷t|²éœˆÜηJiÎPñJ÷t0¶1­F†§ÚÈ"—íA¼£eN—ç_3&«ÝÝÂûgm-å55ŽçˆÄoç'Sž´1.äRÿVÆÐš³…¿^pÎ=Œ%À9Œs,wx¶hooG}}=PV˜gê#Q ˜•<¶»´F(´AÀ'ñ¬íì«ê4hrc¾JÐ7ÜÞOÓyNάÀç=.\\¼à*PRò?a3çxô»Ù "@­ ÖTDüßb†§?éÖ\™Èÿ€A̳'­s¼ZÉä~+Èó7ÙµKŸ T9/aí4ê¼)áKCç1¤Ëù§Dá\Þ‹YË:<¨QFŒñ— $Væ4V „bPý•¶c ° ñf%ÊåÖÏÀWsxªìÏÛ‰Œoà% €ù—AKK {ì1ãšÊd´ááac®£ûľ}û âðc=†êêê”oô]ã‚øíýË {Ôž² €éîõ†_B ÝÎÎN¼½e}Îõ"ûçÏÿ_üÑop"þË‚vö¯¿þ<ÞPtvvâûÞNÉ»XÏe«žBKK ö4ü¿î€\]( Ñ €×èêÒtáà††ÐÙùjšö?ý]²þD$—lëßÿ(wˆúïû‚¹þÅÄSÿ¨×ÿ«{pǶÔú³~–ààð )€}ÌŒ/|õ4 Ze IDAT¼š¦þ¿~w~Û{¿aˆÿ² €]ý/\ßE ‰þ·wKÉê¿ò‰•hiiÁ=}÷Ðå7•'È‚ ¼.êL×®û§ªø©†{"÷ segÞß ÛÛÛÑÒÒ‚‡zwÜ‘Úþ$G"ýýýÆøß±cV®\™·}úöùØc9Ú§¸òš™Þ‰îÙ³¯¾j¾þtí‰øO âÿèè(†††LÄ~kÙe‘¬bÁnÞXõ”Þÿ÷ìA‡MýCŒ%üúžÚ»ð4’ /¼€ÎWûÿá 0íþeÄú†ˆÿ² €Óü{‡>ÿ~*ù7[<õÔ4´´´ §gî°éÿŒmL;¶Kà=¿Î޽‰^ø^]•Úÿ©þ Æÿë{ ïëá²gy°«ÿ/–^;ÚÄü÷•g^0•9ßùß.Ý?üÃ?ן„˜äò„Ãá‰óPÜ¿¿Aß´i!Çûoï—S￲ €]ýohx›õë¿÷áÜ®¿qïýõ¯ñ¹¡ßbºNÄYÀÎö®ñÿ4Úþ_⥻÷ÀL1wáú{î1Âä2)Á`Ö")ÐÝÕ…]Ñ(âú{îIÛþ ,À~ô##o"þË‚vm°jÕ*Üq‡hÿ}ûö™Êl׺*å­üÚàƒ¾zÃwñ°Cœ?Ì.ÇëóæcÁËÏãÕ«ÿ¯üݺüŒÙ`Æ…58ÛÛŸ¯:Äùøì3Ò 0ÄãqOyy¹‘ÛØØ>w‡þõ^Ç4ºb^qŒÛ ÷Î^`Háë?À‹æÕÔP‡îÞ0ð½Ǽw§ûCUß Èüwõ>„Û+ßÔÏÏFSƒ˜gvî|ДçΙæc¨Ûys¥uáÂ… .\¸páÂ… .\¸páÂ… .²ƒ+p‘ÀLÖÇõ9Æ¡tv@ò«·Qßçœ{ò!ëÛ¥³ ä ι§§§'ԉϺªw‚6\”œsO­J¨þJ(¡˜a_ Å©ÔØÒØgÊH‚6ü’}¶%Æ7h #8ee?Xž…$¨¿-~¾§Jj]Ø·~<žHrçÜc%üO´}+á¢í[7Š—Ú¾¼œ¼lÊ-P¬råBÀ,¦ý_j>+mhV«’;b?›a£ó/5 ÊHö V¢=„VA'5?9ÝAá!6[ÈÓˆŒÀ dh¾¿ñÆSò8zô¨qÈÚp‘à«®0ˆÐHî÷NÆXâðáÃ%*Yöe’Ä~ •ìc>?q k=Y×6#–ùðqD1”˜†¥¡Ò_c ;2Z6„³lóàH>â>î±qü¬‹¤T²Oú¬$ ò‚E÷±X ÃÃÃÏVXIüéý¯iZÎ"2¨<¯í|åtsûoÑ7¸Þ=)Øqh-ÂÆ{ü™LäJ £øœsÏ,EüvòJ–+Z,äîã¶ý¿TA¾¦ä\ÌK^2f0X<û4îò!ò‚QE‰²#ÝYì Þêܼïʰ’\eâ+àä8æµéÅ€éÌ6::Š… ÇóçÏÏÙû,ákÿ?{ïGqçù¿Ç€aIbUÛÁ›‚Јäës¼ÄV&{¬±7f‘ 3¼›$Åß ËAG’ûî^–h5 á¸DXrà6»†e.䲋³ÒÈ6¹°ò´ä$ŽãÛ ‚8°»Û†ä Ð÷GwõT÷tÏôÌtÏÈøóz=šé®êOUwuõ©÷»¹[É[ËøLŸb¾ìbÊÅ:q½9—È+èî/ÉUÍ~+â¼® kyˆiø2.ü >»h¹eÊëÏ@FÜú.Ÿw…k>?8xúLqá‰i,a^BÁÍÏĹlÀïßÛ=òÕB5â_ ú¾Ç9 Þ¹^÷º‰ÿTÚ¦£šçìÀn¸ ý÷½§Ë-p5hšQEç"^'nËD¼LÄ}è%\ª†jÄ¿€ÿ¾·øþN+¹ÇJï»x™T[ÿJíÏMÜïÄkvrq©ßÇ¡"dn’Ïb°ÊMq¡¿›QˆŸ:»=‡ðsšø÷yQ æ"nðú/˧ês™—Õ­¨µþü|g>®ï Ž;Vµç4;;ëjöQ~¯ìfRM|5׎)Å~ÎùŸ—Ü( ÚønûŸipc?ðsP9¯Ê€Ã-¾ÕŸ™Æ~à}!ŸùœÕ`HéfFÃáb³­[·–ô“÷ß?n½õV§àßÊÀ&‚MÍÈVÑಯï6n,)×ðð°M¸ËÏA·>Üm”Æ/nW4øÖæË°1Sº]gü—3)[üëoJã‰GR¾Ÿ½ž3û² ÃëŒÏåöÿG·ìǯ´ÿ-ëž+Ö-ëcÿ¿»X/Ñ`óÿ¾ ™•ëŸy·½þ@}f¼ÖòqüÇÊõßÇ~\yÏ•EÁÿ’bý7ŽûiÅz‰†—mù:õÑþLst¿íÏï~È,ÎàZ\[±þ›'6ã¡Î‡,Á¿)¸7¶±±8£´—ßkÿ«ÂLÜåâ?üðøù曂+_¹ø~ß±TŠÏã‚×øÂgÛ6¸!Àôô4`Íš5®ås{þMm?L‚ Š ËÖù¨ÿ–ýûñà•WZ‚ÿuBý³Uö¿§C€S>ûßÎ*û_?ûÂø~€áŠõß¿ÿøòÊÿ‹…ã_,³Ÿó_4xâÖ›°ñÉoU¬ÿO~ËVþjúÿrÇll Ÿüä'+ÖÿöÛoǽ÷Þk þ%I²êÆïϪ¹þrC€-ÿ}?²>Ž9ã=·óÝóÚ+<¾æ2ltÙ¦3ö¯ûK¯=^±+Qò’É`øÚÊýïe›7ãŸzÈü/ú?dJûß²íO0ؼy32™Låë¯CüýÊiŽW \üþÁWTüÅw{cÿOÜ3OlI3Ú1¼~¾abö.í~Å–y¦÷ÿ·~ô[øõ¿s]Ös Ð_Û‡ýõø)`Cñûùë—¤©%þ/=§ ³Öò³ÖÇëé½c¤bº—3)\L#ŸŸÂÄ„ŠÎN)ús1à=»ÈŽ zzd+O½´¶¶–Ì*æ(ÎÍÍ¡«« £££Ô?—T <ü*C\”|­¼™Öȃ9to‰[yêEo«œÎš¹·Ñ]É6Ówi~b~Ï2†D쮬<ÕÆ Cüë'n¥4nâ~I’lÂ$/œÂÊjge\“=e•Áï,ã–¸B謻o3&¡î•LÜbx¥ Cü[mÙª­E“€ õ÷ÏMÜߨö×H2Û½ƒÛ37÷à÷#üÜ©¥pâ<ç¹ñG¦Y†Ñ÷ô¢ @µ,ËÇúÌÏ}‘ òrkFrn*â¤3'Îóš?ë]zé¥Öõ¶¥¥Å5½hP-⽟iV„›{ðû1§9ÏWm™RŒómrrk×–ÎÉxsk£n&ÕÂÏ;÷òß;Ò‰¨Í¤CL/žµâìר¸ñ][¯ï7ÚÝÓ‹&å঺\pX®ÿEjNÁšo§Á­-¯Ø¹‰ßœ‚Äݱü–©ÜorN!Ÿ› ›ÝKà7>Ç„–Ìäþ·Î‡låý_±þ¦!Àf#à§LüzÇÓ“ƒèËô•=õÖŸŸ'Á¿gÞòíÏ`÷÷XA´¿ f±ùÛ€]ðoËfûã÷D~ÎÿJXµÄçø‰ïçÜß½»rÛw4sĶo>ÛÚ‚cÿ—­ßúgÍû¤ìiÒÿ"“Ò/H¦L*öǧsþmy}÷œ[Ýg¶¸ÿ/›×o,~?æüÛòú¯¿qü=º¿ªŽ?c̪g5ç|œ~bêÆq<þèú’óOJet5„” ¦ÿ³ŽcÆ_ÿëglÞ¼Ù5Vµí¯OÓ j=îÎõ|î’;q÷g óñEŸýÞþ¿,1ytÕ»pÍÿzÿô™Õx—v ï9ù’ïXn¤ÎAò2?\—žŒã·~ô[ÀeîéŸ^„{MâŽî`fûëðÁŽá—?x‰dÙLo¼ô¼%òwòË_¿…ßü¯ >üGÁLÊ2֪⧭ÿ8®`Ë/¾Ž/úOeÓÿôø­ø>kä©€—°ÿ™Ïý<¿ïa×ô"¢¸ì†I+ü¥«ݲÙ÷þ.¾æf<¿ïaÜòÊ× I’N&AAAAAD˜Àiÿa®ÚÁ“ï”øÎ²ˆŸ-ô,À 4#¾hÐŒø¢!AÔKÐZÚeØZÏ QäÿDzl‰ú9+\Ëð4ß©0Ì/Œ1c`’>ËS1ÝmÜ…InùýâTvðàA¬^½«W¯vpvþ@ÚLúë ÄÍô§éôâ’ï©`b™úûûõ¬^m ÄYæûkì^eÊp Á‰æ)0é˳ïðõ¼axr"æ>[©Øgr´Xíý SXÁgaŽF£®¢ ñšÁ1Å"5ͨNL”ˆü* .”e¨%†€!üçéÜ–WÃ…ç1à¼â÷‡_n>¸ùuÍXç@4 à ™Fµ¶‡‰i«Aÿ¼Åÿ`½·0ôišÍ ˆs·}«|y Å™w}O®(ó…™3`é´û,ÍAõ¿\Ää&„*—‡ £>}é#Å7àâ~çìÚâ÷x*‹ÁDqYvÆŸ9š¦i‘Té騆1eä刧²H›šCçÌ×cÊ<6à;{º‡X*,¸¸ß9»´ø½¿¿ß6[õØØ˜s0úÝJwÊ1tvJÖ=ÜÝŠýúv·’Çþ¡§Ž{°àâþŽY ÅïRÜ¿ñe}YÿÇÿÙgŸÕ/½ôRëZ3::j™‰×ñûµ×^ëú\ܯ¼þŒm¹ø=ž‘‘Æ>kYæÝ)ßõgãL×ÖkÐg€H;ÀRÅ™wu‡XŸ"ô8€ñúêå.îwÊ‘Åq à˲̿9b­â_qû}Y¦W#þÍý¤—$ €atÖßßÙÙÙ²ucÌèÓÜ„º•X“=e«[ª`”‘o/Õ°A¸.‰‚a.Å^(ŠSUñºÕÖÖ¦óºð%Bü™Õ*þ·=::ªW+þmy€Y³6ºþhévWJÄSY{ûËŒö¢Y<ï‚.º6žÇJÏ¿û°ZÄí;ÅÿÎóšßÇÔK<‡õçÂ~㜟·b7²þNñ¿S8ÉE•µÆÏ{gý¹°¿µµÕõü¢þåÎ.ì¿<&cŠÕV¹ÿçÓ(@Ó´H<• ´b|§ø¿ÄœÕüM¤ÞX<^5yÅÙh9\˜–æÆ¬æL¶š¦EÜÌXÜ„lâv+¸TûÜçl;•â—ÛF¹2¹íËÒ™®ë{nݸqcI ±>^åLú2}5ÕßZëá×(Ém}¹öç¶Ý…ÐþÊ•)ìóo¡´?‘zúòrõwÆçÛßñ,„¶_aU5õ÷Úö;µýó÷8/gR¶vÞÌþßm;<þâ²Jõ¯ç¸zõ3ÍŒí•>¬ö§¦þWJeÖþòm2:1ckWƒU¼€Ÿ-“mßï¼÷›¸ûöÏy¦ÿ[†¹—f-ñÿ«KÞ‡Åñ»~ÃYH’¤ÀE;˶üÙƒH®_‹_ÛÍÙø÷‡ÚcøŸ7º‹ËZn:Pu|Λÿ¾íûů|¼þ¯ðôž¶-¿ÿqê/ð³?JZËn麥æøN>²ô~CÜ?íøaJø¾aN½­Åe·¿ú÷%ÛQU5Â÷±›°ÿ†“wagô?ã–W¾†NÞeûsn8yx~žðÕ§ß+¼½²ÖJëŒCAAAAAAC§)Íá7;¾“f—…â7>¾³ 6ºMRüðã!­‡ °µr$™tù‹ëˆÂÑ@ ¸øÿç#畬ûP·]Ôï4Eÿàb71¶Û2·4ÕÖŸ›p¼®%bšréê‹ý3ï.=nËÜÒT[nÀá3Š–¤]ooÿlܸ?²Ããbÿ¬ËõÌm™[¿÷±¹tùüh‰¨’¯wÿÙ¿ûÝ–$Iz4ÅÎ;‚p76ðîÿ×Sfž—÷‘\üÏEÃâ¶×døÓ‰ÅÈ¥ˆ§²%×#q`¾hàUζ¶6vî܉h4ŠB¡È1`Œé˜µ®mÎãï&þ BìÃë/š8ãsª¿W<7ªmNñ í/[ÐÝDÈâ¶¹9—N@Ý“†´.Uñ~ÈÏz7ƒ§Pf0¡Y÷-Õö¿;Ó{¦4¤;Šç­—'U`¾DSÕį´~M–éÜ܃ãŒ?XŒ1eÞ*_5ñùõWœÙ«þŠ¢4¼þnÎøÜ€©¦û/s{n3BkšéLÍèiû³™3>7@ªåþ'•-èi€÷Ù®ÛçpƒŽ ÷?g:7WãïY½â·†€Û±çëðüneóòt~ßK[mÎa²šJÙëï\ïF%SÀf´¿…rþ5³ýÅ{_ósÝñ+åçtuuY÷»¢@9£'n÷Ënyy:±í3Ætn(%–›Ï TnoqfõZhfû9“2Þ§dRÛ¿—©6OãÌ# ÿy~·w:ÍèÿÒñ÷zÞâk^真óÔÙ52ö§n4Üt½g)•šNBJUî¹ß‰”rïEá?ÏÏ?û­ ßÖ‰ÏkxÿÅ;¿ü7vDB öö7XŒã±¢35cÛî]˱#÷.ÀqÿáZSþOŸ1LÇ}Ö˜ñ^4nûw®y¸à¥oâ¹ÿÞJSËÌïÑÖW‘¼ì*CÈ]€a°ýØÏð´ûöó4ÕÆçõoëøžþÁÓH$ C=ÑÀ°Ÿ§©5>ûoùÅ×KÒ¸ û½ÒxÅwö@÷– yp Xb|~ì1C¼?vÃ$FC÷– %y[òeŒÝ0‰ ­Åç"÷Ûò‰õª¥-AAAAA„\ ‚vÖ#º£øÞñÅNü¿×î§küzÊ×(~óâ7Ûx‚â77~-Ð Ë\‹¶Úøâ@t{;z”_T%æw¦ ¢þŒÝfûþó‘ûëáXž°î6ás岈õO&“ùްî d2$“Iÿ‚->ŸýÑËä% ¦8@QUUË਋@(þ»x!ÖHÓÐûþïe Cšfû‹Ô+ü™R€s¬Ûç»e<0â^ß gêéÓ4KÜï&èç묷M3Äþ4ÃHé‰i䌟É0˜‡,/G:½¸DEŠc¦úZl»Ýk¹ …ÿ\œþéK÷ Ô* <üøsA®H9C ¸~Æ”yL'ìW‘r‚.xªâðúsAªH9CÀÝ„¡VîVòH§¾+•ê,Y_Nð?1¡¢³Sª«þj®SŽ.§œ!`ß#M½ «í»íïr×óü©«þ¹¤åáWmëÊ@úÍ}Fº×Ÿ©&¤+úL±Os3<+'ø×ÒXÊûQ9xýwi~âXWÎúLƒœj,G3½†ØÑ]0É—9Å¿nókÿV‚‹¿°sçNÜrË-øö·¿O~ò“èïï×3Ásƒ’jÅÿšÆg7ú?.ä÷bMöTÙ}¶&Ëtd³˜N,v5Åß+º ¡8’$a``ÀªóÎ;­ç;U ®DczWWúûûmåv«‹Süëvü«ÿŠõç&Jî1ª¿_ªm¼/®Vüï"B.Ûþ¸Ùm;æzÈzšP”Ãy|y_áu2<<Œ{n`¬ïííÅÐÐPU3ššy††tTÃ’ÞGJfÅÜÁ“€ªfø¬·ú‹â~'ÃÃÃøØãOªP_ýeY†,˸å–[JêÏŸEÃq{aÖ_<¿ cÊ|÷366æ«þnhšÙºu«Î÷…_÷»ÅÿðÉ»æGµîÿÔÐr1¹t?_²®dÿ§²xŸõ¼óäñ‡††p¢Ý0xø£¥íŸß{¸=‹U_ì{ÝDÀ"•D|b^ñ73·m9áâS¯m»Åá8óx ™ÅµÜ“]SO<â~ßé†òtâþ½þ¦4žúÞ Äë„X6Q -–߉$Iè[_*ft’Êdôj…ØnB~Ƙ.¸!¬/½tÉkk)¦ógzqÅgúTÊþüYjPù«3†H³Ú_³Ï¿f·?1>7|ñºÿáiÊáÇH@ÄËøJ4pCXïz/ìÌë,ªª/1€àŸ+µ7Ï_˵!´Ë°ŒDœB~¯õȤlíßm[ÕVÿ,Œãï„‹ïýœçƒãã%Ï>b™{™+•Ç^·¡r[Ü3–ôŒí&ü/÷ìÍMÌÏ%mÆ)ä/³ÞÖþܶU-\üßòï‘2—ÿSÇôÒ4ÔBCä¿&{ ÈÎØê7XŒu¹w•´?'\x›Û?‹{ë¹!€SØÏóµl5„ÿ*€wiÇliü Æÿ«‡.€Øúߎ¾äe2~=~ªDØÏóýæ•«À0 0©5þwÒÿµd=7p ûy¾Ÿýìg€§ðtÝñÇZUüÔ±ž8…ý<ß½¿×H8]|ì_UÕˆ-žSÜ¿ÄXþü¾‡­uÏï{ŸˆËo8y[büw¾÷?ãâkn¶L[òe|bß+V¬Ç–|Ù–ž ‚ ‚ ‚ ‚ ‚  ¢s4ÿñ¤Ü€¡jÖù…â{Çw–z'ƯT6·ò4K„NñßÇÙFÃ.ÅoL|¾­ 6 P(”@Ò™7Eœ¢œjgêãñO|Þ¹:°€)ŒõÊïÀòA Õß@ÓÎÅKÝl}ÿŽ¢ Gù…­nhÚ¹žiª”«i÷áC݆Òôç#畈\LWLS® nõÿÆ7þÂú~ðàAË ÀOý?ð¯àËx D¦Î™A*a3mHD‘ÊÅÉÕ¶;˜œœÄڵřšiºQ Ƙ®ªöóadd9R)wQP­1øgSðb­[ûF,Ÿšn‡Ðl—âöíÅ},w”¦¯µÏÜοHß¿YßžÐÏùÇóêyÓ8¥†þ/™¼Úú.^ üÄçy …ž}öÙšÎÃCÛ·ãBa íQEÁøë¿€²ƒÈ¸a@á±ÇlyEc€J" M;¿:¯¸ÿ~–€Ÿúó¼¿n˜ÔÓ‚œÁÕOÜïŸÐðñûu” ;Ýàâ^wĿẬíÔ[fƘ.^÷#±Ò4N  ÷cLO&…>ÀœyYDþg2µÅçÇ‹œ2™§\Û››)P*”æFÕœ¹´1ÓSìÏ Dq-…yœz¸Œ3\s6ÈË-¡«“Ï‚},öÇÖl©â2À[ èw``@©ØŸˆâR±,ü˜qꙡš±âÌqp§C*ÕYó‚dwÊ1Äbèì4ú=qtvJUÕ_ÍÂQ§ØŸˆ3ÛŠeáÂ8Nµ³ß:Ë!>gD£Q×}~饗"¢µµÕ9ˆË€Ò+ÅÍ%ƒJ% IDAT:8ÅþÜ€/+i‹oî³ ÿyšZ믭ú»vûl»Öÿõ"í€Þ°”Ù× Ëcy5õßeöõN±?7àËœeéÓ4›ð?[ÅuÏK4è¼.—ÿŠÆ^@ýïå$IÂå—_Ηa||}ÒlIz§@×ï³—ˆ8Ó·› ïëœë¼öe¹º;Ëá&r* X¿~=4³8pÀº«çzë÷ø—ÿŠÆ^b©rå,¹\_zÏÓ–o ¥þ~(×þRñÒöç<jiü^€u}I'¢crɺZÚ_¥2‰â~A\íšßm]µÏ@~¶ÏïQÜLüÄô[À.î_“=zý½¶#.ç}„›I€Ÿ˜Õ”E÷ŽŽ^?ñ¹¸¿35³ Ú??ÝLüĬ7>7Kq3 ¨'¾Û,Ã~Ä¡<¯[ZQ èöŠ[>¿âG¯r8óˆ1ªÝ7å ågƒæø¹Ö–›»¡îàøxY6« ðLz ÿÝÒ:qþ‹±.Î/ÞCy ÿËQÉ@Œ±Û_³Î?·ø^e¨¦,~ÛŸWür"ÅÃ|Ô-¿¢(eï½Ê üE#ÈJ¸™B–þ‹eàŸ+™<”£s1¿s›"jÿ⻎—ðßÉÉ´kZÑ@ –}Vÿßìã來­MçÂÿZ !Dœù+•­­­MçÂQ¸ïù»áÌ_Íýó‹x ÿ¨é¤kZÑ@ –öçüÂ/ÕÑq1øï^ú¼Ýò!ì¹ájüÿçŸÀ¢Ï~pÇGÿ wßþ9#ímÿÎ&,—$Içâk™Ã$ <~zà#^÷ZCÈaÿÊoÛ œñóÊU6á¿Ó$Ào|.üÿð%ñôžF"iÜçïëÿ>ü…~ËÀÿg?û™Møï4 ð¬Õx§ÁÅþ[~ñuÀ3—½m3pÆ¿÷ã÷Ú„ÿN“¯˜\Üÿ‰¨!Ø¿øš›1òà˜%Ö¿áä]€î-pÁUGÊWŸÂ÷ ïE÷– x~ßø啯YÛäÆ^‚ÿj ‚ ‚ ‚ ‚ ‚ ¢|ÄäˆbO?ËiüŒâŸÙñý”ËMˆ\ïö)þÂï&8wûVY(~¸ñ›-m¦Ö»¿- E3?pÀzŒ¸ ËÀ /ñ¿ŸX~êÏÍîÂY%龌·J–qÀzüÀÓÓ‰¨mY~jª*"cLŸœœ´-Ëårèïï_"w/ø±ã&\ü·ŸEQ$§Æ~aŒéjº¸2ì7TÀÏå_ðœµ2¿]r>ðv,8ᢴzÅÿñüûB?ðþÒÏùç'¾x-ð¿^ø=ÿ½Êphûvëó…>fÝ9* ÒÅÿÎrø©¿hànPkÿçâÀ#Jà³»ÅíÓ4\gF¸L÷Íå¢Îeziýý—ÝûôcTÿ>òŽ/8Éd‚é4í\ôö~ÆúÎÍÄr¸ÁÏë&–,7|xx—\r ü•Öòžnc`¹SüïÌ»{÷nlܸÃÃÃØs÷Mpaß¶[\§à_ÙQô~Ù×÷ã¹çžÃÖ­[}݃òúß{ï½Öòk®¹JÄÿåêÿío;€¯\»¤bý‚ÿOï±Ökóe5ÕÿG Ç¿Çèwâÿrõ?±ç¦@ ¾øÅ/V¬¿Sð¿wï^kýý÷ß_Sýú?¶–wo‰@‰ø¿\ý÷þéÉ@ ù•Û¿Sð\qýþ;jkÿ^Y<þ×›ÿâÿrõßsÓMU8·å\æWÜ_‰ ®mmmúÀÀöîÝ‹ñqCPiV»ZÄ·~©dÄ»G7WZ¿~=®½öZô÷÷W5Ão­eð+î¯D½Ç¡õ¯ÄBk•Lêyá†(L–$©bÝý–Áo9ĘåDÒÕ”ãt­¿³<µ–£ÙõovüjÊFû;âW#dñ–ËWfviÏò”2W3±s›’$áêOböJBPqFèJ·X~Ëå‡rÂPg¬jü^Ûq£R|QÀïï—Ë{˜”3¨$Àµò4¸ý5ãü«¥ ÕP­09èø²,»š8ã!à÷¢Úóޫ͸!-¨ªZ×»¯wJû÷c °Ðúÿfg¼ DêÁoûÿÔ㾄ÿAÇËPëöª5¨¥ý=Ö·KÍßÖÊqþ@/>ßÀ0®ô“‹ÏwŽîD[´ ‡ Ñÿ¢Ï~¿/߇·[>„Þ+áÇ×µ–ûyÞ‰‰ Äb1d3Y|æ—+°ø/~·jñ;›/Þw<0{@ÑÀ)ìãwvvbçèN$Þ½£Ä$ šø³…¢©ßÇ✋.F[ÇÇ,ñ¥øJLª‰ÿãë²Ö}déý`ÿWŠÿêûJL¼âÞpò®ŠâþNÞ…OD_ü%ã·È—Ÿ¾Ïï{ß+¼×ù; Ã<à±%_&Ñ?AAAAAÑB'RÏdŠæÆ¯¥,a “(þé?¬rPüpã7[Úll¹2ÔÊsPÌw©û¬ µ ‚åFÞyìâÿ Ú@ЄiŽÁM¸ø¿šx|Ü€‹ÿÃ*sXõ÷˜a*¨ís.þ:N­X&æL#Ï ”ª/_©ð׫²øÖο5eЩtF|Ñ Àn¢¯²4»þN¬6mκÍÅÿÕlÃ/î×›sKý~à†ÆvÝÏ•ÊåoÎ9جø~îD3?pÀJ÷?bìááá’Y<†[þû~lܸ±d›b^·í8ãºá¶ülw÷îÝøñ2Ê' þ½¶#–Åoý¹!Àí·ß¾ ëÿ™‡ Áº(ø÷ÚŽX¿õç†ݲ0ÿ­·Þ À.ø÷ÚŽX¿õ熛ÿ÷e ²þWÞcQðïµ±,¾ÏÓ`ËþàØ×Þ0®—\^¯ðÚkûµ•ÌAˆÅú×»B}4²þÕòNn~cK’Ôpã'mmmºñ7¬ ú‡Uÿfǯ†0öÿB‰ïþLL ê>¤V3ƒz~äæ ¢ÀÓ'I•˜SùNX¼¬4k´v­ÇÌÏvê¹ß Ú8'ˆkŸŸm•Û^­û#ìó¯šíÝþjï'¿—€Ÿ8~cym§ž:óþ£Ü 뀱ßyÚzÅßÕ¤§··í†Ýÿ7óøóøå ÄsÝ톓jEîå >u£a¶öø£ëíV–Z·×ˆö7XŒGGçRt §°ðo<„_÷Wßþ$IÒwŽî´Äí§!ÀÔª_¢³³³DìÍóŠâwÀÿlï•âsC€üòÁ²ñyž ãsC€¶h[SâsC€ËžØh|nPIÜ?vÃ$FÃ'¢¯àâkn¶Öðøóm“AAAAAÑ(B7hä±ÿ¿žr„!>¤øÍ‰_mÂøRüðâ7[ÙìønQ¦#É$VT)–®'n³ûž°ÊR ^ÖD»V÷Lì§øŸ#«0û d2¹ Äÿ^¾éÄâ:Äÿ"åEÀþ¨Vxl§Ùç_£ã/4!ØBÙÿõôiÕÆ ›êÊßìs°qñ±ÿ«½÷ròòY¾ƒ,G½uw+“—¹šøTª?Õ?üúW*‡ßüD ßìò4z¿…U÷Óåø/„c¿Ê –ÅOºf—“ ˆ3ƒ „à^÷Jµ¾Gê€S\WŽ0û]±n^BÑTï ƒ1×J­ÇÉ«MTjK•ÊPn›ÍjµÄ 3vÐí/(cº,ËEQ|ÅofÛ÷S7Ä~(ŒñÔþÝ·vÿßìã_é\*ž[l.ôw",ôg™Ó±ýñÛC4î%Hç³Ì»Íöî¤Ñ7ÅoN|I’ôJâ~7 à뺷llxl­kÅof|H(¯6ð~—âSü35þ™\w‚X4ûhv|4ÿ9ˆâS|Šß¼ø °ßÓžïÃh ©5ZïŒwâóô<€6š¹P lœ^_Ó´cLÏ¥è¿ã›øÔÍ«‘ŸšÌY„Öo#;ìtAÅ/W¦0cAAAAAAA៳›]‚ ¿4]øäÁÒô´£d)Óà`à5ø‘1¦§Q¤²…@GúdÆÓÕœ)^Z¶ k2ÆôÉÉI¬]»Ös{ÍZ.f¹ýRn{üs¹<Œ1ýðáÀ÷¿ø"¤ÎÎ`ê. Êcº–6G^æ– î8óÏ•ê¯æŒøŠÄS?<< Ø»w/2™LÃãkÚ<`Õªq›‰/š§”ë/cº:18ª(Xµm[Ãëþ@º¸ ?µà…ÁÂÓ_Mª¶eïÉHÖ:¾,Ìؼæ¬\¹²¡ñù9È‘:;?^l[–Jjhü\®Ý¶,Ÿih|~ àlݺµañ!A×ÇSŠŒ|^G~t Y.<ˆháŠ%è_½ó«€¹¹9ÌÌÌ P(@ÕÕ†ÅÇ ù9`À+ÓW9jfE9lbéA0öPÃâÿ“ÙýýÀ €x¡ÇÇ €üÔæŽ,‹¿z»¡ñ“ë“€cÇŽmOU†ðã‹mOé S o{MOÍæLïQ|ï#Çd@<•mèscLO&“hmm 5<¾–Ѐ˜ù= ÷ÕÄŸH·£ÃØýâ3 Ÿ~sä›ßˆgä†Ç¿úžý¸îŠÀ¦JôªŠø¹tòåFÖ5ö=e£”{?y&ÀÓµõØø™kÀûdHe n{"j¼óì,4×ìw``Dkk+æææš¦1Ø»P1ž¶^+~7þ‘ JÅVz`ùúöcL_û›“\Üo=×Üó9(yÅJ׺âm[žD»†¹#‹0YE[­æýgziñýg ôþ“ ‚ ‚ ‚ ‚ ‚ ‚ ‚ š qZÀ€¹Ñßßê¬'åàâÿ”9­“@?M¼Dþ|°Yñ†‡‡±dÉÀ¦MåEÆÓ‰ÅX#ÁkÀ{•c÷îÝÓT2¿õsî—J>|ÓÓÓžû› Oßÿâ‹8ª(¶m+9ßêš}èx·¡ª_¯ènKüoŠîXž•ÆáF5 TµÝõ{ ¦çû]Q€|è˖Ư§þÉd333PÅ3þðð0öîÝËÓ?ñô<柙ÁSw\é_Óæ±jÕ8z¿øÅmÆá\`ßëÀŸzô—\x|TQpv>U™LIœ¥u˜®ä’ ”\ÎsP+cL_ô/SÀ¾q¼õƒŸâ'¿lû'<\üÿÖÈoÌïËÜã¬îsÄu·«~é»i]  î1e¿ø¾?×…ŸŸƒ°jÛ6À¡íÛʲ¸.”øéôbäó²ÙY@"шŎŠëB‰ŸËµCQ^P4à†²üAa]ð}¿ †ÀchhÐÛÛ ˆF£âº@ãó¾M×0¥ÈÖòX, ¨„Ðć<~ï½–øÚÛ 3†B¡€Ym6ôøÚ yÂ1š4hÀBßUMá)'´¥›ýÞÐãïR5üDXnYah~Ҁ㟾!jÍ~ ˜˜#‹Ãú 8v¬¨â眪ª¡‰ommOé(®ˆv˜jXÛkV|‚h6gzÿ+–Cÿ+y‰v ٙƈCâÿ¹¹9ȲìùÜF|Qü< Å´ºŸÕÄÅÿS † g¹ø¢ø_yøU$_O#Ã#uŠÿŸ<ç||êÆq<þèú†ÅÅÿÊ|Ã÷¿(þW½½½›`8Ív+m»ÙâøH;€ñpclذccc$zn"«W¯6 ·Lcá3ôʹA…Š–N|¾ô7nÀÓ‹¦õÀÅýæõñT¹t¢$]v†Yéx¾É™êb]tÑ.:´Œ-÷|ÿÉß‘*/)È,.}ÿJï? ‚ ‚ ‚ ‚ ‚ ‚ ‚ ¢ñ,jvˆÓ ¯ؽ–Dpñ¿ëßÀÀšÞëˆ×IE C€µ>¥Ûg¸>Käï‡ÿ€ªª8yò$CÜVËqN,µ=ø1“ ë7==5kÖ`×®]%ÛuŠÿWyˆÿ>ìšßŠÈ20.…ü¶}‰ÿw»æ¯&|.×îZ?âUmwÍ™´··C–e×ø~ÄÿÉdÒ5¿柙Áò+Úqõ=û]ã‹âÆÜÅÿ‰§ç]óûaßëÀ5ççÒ_:Åÿ+<Äÿ/œëžßJ.9GziÚµþ‹þe çUÿç’ŠkþZpö‰æLïÄ.þÄü4í>à¬îsÀüÿˆ¹<Øø\ü¯ÈC9`¨sé”y¼ø¾?`˜(ò®Åë/žƒgçøG’IœÏãBSr¡,ãì|G’ÉÀãsñ¿¢LCQ¦ѨE™F,v€a (ÓˆFƒ½oÅÿùü…–Ñ@"ц|þBÈò&ùü…–)Añß>¬á¦³nÂÜÜœ%‚O&“˜››C4jÌþF177‡dÀû_Ó´ˆÑY_\Ö!+èÓèRHåœåñ¿t÷—ÐÒÒ‚––¬^½«W¯FGG–-[†X{,ôøèÆÌ?~¨[z|¥P¼ìÈòJÈòJXjÄÈí¡Çÿ}AÜò;æ¡þNŽÏcEñ¬£±ŽK(Óˆø™ñŒµ¬½½íííˆF£$ m¬-”ø®mOž2þØöi:ÿ b{U#A·þš@ÓïÎôú;8Óû_‘T¶€Ä`J^Á`Nµˆ"“É`çΘ››Ãøø8E©œ)@X–¡m° Èm¹6°|cëß™šA4qS pÃàñÀgü®DêìkCyøU ^ðIdÞjhü§î¸ƒÅ“çœÿÕuxüÑõ•3H<•EôSƒPä‘Ì5|ÿoݺ¿÷{¿EQÐßßoß><< þ¿\ŸÂÓÝÞÓ6¢gŒéÚHøï¨9]]]MÿÁ cLW¿#b±RÙB lMÓ"†¥òrLDµŠucß´µµéÐßßïº>“ɸ.¯Ƙ®­× !¿dü¡­× ­× "Ë]¾–0Ö±<3ò¨0¾×¹/æŽ,ÂÜ‘EÈÎ0$Ú5$Ú5(yrLF¬£hÄ•ND-“ž§ZZU«Æ¡ió®ç±ñÿEírÍOAAAAAAADxT=JàL€×Z·wâ>Ñ4-â.|gÎø@Ç~a¢iZDüãF >õïȳ¢8 '—NÔu®L'CÍi8–>céèïïlj=7aß¾}¶t⟚Óð¶bì`5Wÿ`;g™6fù;vì>|ZœÓµîMÓ"›6m²LD3 ?âÿºQÁz¥¨Â,Šø}‰ÿëDÓ´H<>c…O§Ûê_IüD|EQ,I’lñ+‰ÿƒˆÿÔWZ&$Ó¶ø•Äÿõr\GäO#E€´ â÷#þ¯MÓ"©ã)Ë y*i«%ñÐðþ5—N@ÝŒ¡@µñ'´ LhÈ%•¦Ä×ÚUhí*^Mª ²ïeì6Ûç÷d eÖ{2’m]XÄSYÛç•+WV®\i[+„A÷+2H©³Ó¶., fûœJ¤R§lëÂ"›µ}ŽÇ)÷âñÛº 9[+à¯ì`=d2lݺ€! ZÀ¸«ˆ@EDî3„ÿSŠŒ)EF>¯#ÖeºT@‹{?æŒ?´smmm˜Åìì¬Í!Ö =>ƒ¡ùÌú/Á{Ít­á×ÒG Ë+¡(‡ÍÙ¨óÀñÕFºÈí¡Çï“€ë"À/aüÍø˜™ìwpüG †ø??5…ü”að1¹qñ'¦&ÐÞÞŽ™™ÌÌÌàĉX¶l µ_<öÙ)¬c€Òaü5ºí5 þÒô}öxáÜ&èIÐ1`XòSÔd(VÜ\n÷îÝÍyö” ï\ŽƒË¡äДú'“I$“É…#¸<Óû_t" UU!Çd¨ªŠt"V(W’É$TUEkk+TU Üì¨ZB3f¡Ž™âÐDãÈ0‘n‡ªªèøéöÊ™$ýæ>ãøßüãø¿¹¯¡ñ¯¾g?TUÅuW¬€ªª¸úžý ŸK'Œú_ƒªª›­Ubxx؈/çßððpà1TUµþ …‚§Á.?%I’eÖÊÿvíÚ…ÀËæ$2´<ü{9MÓ"ccc–ñZ£ðk¢0rÿFÉ/#ˆz·ÉûxÞïK’„ÖÖV+MWW’É$ü짪P6n¼KøñcÀ¯¾ëžìWg¬Ìô¦ @½pc3¸u øÚOÝÓýÉßMáÖ¢/š-ŸŒßu— &÷ÙÞVÿAAAAAAAÑ<ª68ÝàA q«3ß¶×€“ öÉ‚ôZ†3¡|Í:ö„.ò°"Šû_4htَ눤"vÑ*_~ €µ>Uã¬ÔÍ$H‘%.޽Œ·•–¥Z0š×1h¨f¬(䯮]»°k×.kÙóù Jʦ1€§~ëçÜ/~à&Îx¢øß¬:6€¢ €#¾(þ÷E“rg|Qüï+¼òBÍñ3:Åÿ~(j›Ž›8ã‹â?þá÷kŠÏMœñEñ¿~RSô¢ €3¾(þ÷ƒòRý³Qjš‰§²Ø12 å@Þ2hÔ=—¦i‘NÖ‰çï@dD³LŸÍH€ò-¼¥À2;¾ÓdF\þjRÅ[#¿ðˆe‚aÜÞM»ÏQþûj2Ê(ÿðáÃxÿKß…r x*kŧ²%”\:a¥ *¾› ‡¦i‘™ Ž8XG’ÉšŒ:ÊÅO§#Ÿ¿Š2BYñ †hÔ.ÀŠF5+MPñs¹v(Ê Èç/D6;kÅÏfg‘H´Ù¶“H´Yi‚ŠÿFú%H÷jøƒƒ 2ÂþÏd2%¸d2i¥©&~YTÃÔ t}ÜXÔ!}]~t ùQC0jˆŒ{ñ …£Büo|õ€¶6c¿ 뺗ŸÉ‡ƒæ2sâg¼bþÀB/GͳOXzÐøýÞÐãÿØ<ݸÁÙÍ?øIŽÿŽ ³ > æã¯Qñ»Ý€övCxyìØ1;v 0«Í_ˆ½bЈ½B6_ƒÛ^#âógçûu`æ¢ @Þ¡UDÐ œü®`Ð !¼¦i‘7⡇ÂÜÜœõ|Ù°wn*"=}óرcù¼`ÐÀúg2LMMáĉ– @Sß9žéý¯€“-Ñ:µLXEkk«uÏ“L&}?F –è_KhþßMD‡ kÿO¤Û‘Ï7ö´o~%úO¿¹ÊëÏ44þuW¬°DÿWß³ï}浆Ɨ/YÏ\¹tJ¾þgþªâ˲%ú®ùO9æææ I¢Ñ($I‚$I%iøû)'“““ÀÜÜúûûkzñÓ×3Ætm¤±æ|›ÒÔ{½bŒé]]]èííÅð𰧃úý‹EЙš Eœ­iZdMö–ÊË1XìYÞ‚0íá×ûÞÞ^ÀFGpï·F\ÓþåýCøÂ¨±.0#†ßdÿã^Ô™7Œõ6JOß0Æôµ¿9‰¹#‹,1¿ßø­+ÞÆÜ‘EXû›“Unà,‡(þ÷Ç#~CAAAAAAAgד¹ÑBgQìÛ¨˜.ç±ùÀœ¶¶6¨ªŠ¡¡!Ûºf”1ÈýSi[Œ1}Æ ó`ÒÈò„‰Û±ŸˆjX*/Çű—±,ÅB9öÍhGÍÜÏ•0Mt¶Y…ø2ž¦ E+Ë`²Ì0,qÖB,¿J^AOwvŒŒBŽÉumkYª€Qÿ¾,Óí²3 À•FU)u–,Y‚ÞÞ^Hñ!L'€Kzæñ¶Átb1ÖdY€kÀs3f_|íµ×ÐÚÚŠ¹¹9¼öÚk8|ø0V®\YöœtpWë1-7xÏ­~Nsû~ ¦/Yµm›§)Êää$¦§§ë Q–7En†ãÝ€O“‚ZéË2ÏúÑPÃCQÏøBpQ³[ü«ïÙùgÂÏEÅnB°}ö½jx¼ñä·¼¿9P6(4M‹dg˜Ž‘QôP÷¤ÒºTC®ÑšLøhË IDAT¦E2,£@ÏHrÝFãŽgä†Ågì6]S€·ð¼š4ú–‘B¯i󀳺ÏËHûM«œÚ<Î2ó3¶¼æòñãüâûþ°âõ†Ç§²ºº'ÍüÒºTÍñm߸P–!uvúŠ¿"“Ñy¾CÛ·c…y¨%>ÓÇbG‘JU¾n™&º‘ïhÍâ{N:½ ËD<>ã+~6;«ó|éôb¤RµÇ炇h4Š­[·Zñ¿öÅ#P^?l)ŸÉd,¡Doo/†††‚=?$èL7̘Ôq SJñ~/Ÿ×ëê° ˜Î£Ü\´`üáoØO'Nœ@GG‡uí ;¾6hq4‚5ã#{.ÜøíQÕœušcÎ>m Pîÿ÷5 /W¿I³OϽËð“|A_jüô ¥‚ÓÉÀÜ‘ÆÄO&’Ð4§áHÔj“ï!öû“8¢OjhÛkdüã:"G Cn5Màƒo÷~Çõ€êç…Š#ÖI˜&N~ļ÷ jÿzÀûuؼy3¸áÜÊ•+óŽFEd Ðw옰Jθ/’ã«ÿ³Ï>«@GGººº£££Gu¦÷¿ü~S’$À|Þé‹w ;¼Ù+þÐÐ. ’ׯ_§y^˜ñYŠ™õ7–ÍÆgí÷!Ç—â3º$I4ã?Ö·È6.~<#ëÒ0à ïåo#Ó˜ð†QßU’.I~l.»ì¿< <Ú¸øÒº”ÙþŒí‹ÙƵÿµk×ÚÚ¿ø><¨üÚ³zõjH’„B¡€ô÷÷ëü7$ ªªbnnÈårhmmŦM›jÿ›Ï1•ß[f´×VÏZÙ»woÅ4UÕ¡üXÛž 9#÷@,Ö˜Ëáqe³-Åÿ’$•ÜW·ÆŸgçææ˜w×Ë–¾ÌÌÌXy‡††ª¾W`ŒéÚzÓ€xœaèonÄšv O-@d™]|ÍÉ€·0 äriLÿh ½_|Úz Úz l¼¶wï\øŸaPÕ HR'Ðäb2vŒŒZébøøL(ÀJ—Xa”2à×±™ÅÏ÷Ÿ]´ ‡­AAAAAAADcñ4ð#7Eš À½„Ï¢ÈÚ¹¬šíÔŠSÞÖÖ†x<ŽŸÿüç¡ÄtÆs#¬}áÜ×â÷ 6àÏþìϰoß>ìÚµ û·‹±±1Ý+O5œ.Ç~©¼Ü؆³Z‚ï&uñ3ÃHÐǰ‹þ½ÌˆïÅq‘Tú§tàñt.N8®#rMzëDÄk ÉÀMäÏû~g:sÖáªËï–>;Ã0Xl;Ç–¥ú1˜Ð0ÅzÁ˜1‘¯>ÖdO!(<þóϯ½VœaÌË pˆËÌúÞ!fŒóÒ%ËÝŸò¬Ÿ˜NÜ/—ôÌYV²-?>|ïñE×3Æô]»vÖ¬)N{4==ƒbhhÈJçÜ^U1u-mŠíÄö$è7ˆ²`<¡(€ O±ÒqÑh­jÑŠšÓ (€8ù<Ÿ Ú5¼òR©SV:çöªmÃÃÃØ»w¯MØÏÓe30Ÿ0¾ Ë(#ˆøš6U«ÆqèÐ+Ö2ƘÎgß[~E1þü338üÃïãåL*øo·0ˆ³Žs–F ÿ¹åkÎ+¦ß÷:ðÛ#Åto·ÿ¢ZÕ¢±Eÿ2…óöã­üÔZÆÓÓKsSŽÇ­å|–¬Ì⌕ι½zúv倱Ô=i> |C…Ps¦½\·‚Ȉ†NÖÙÐøo™§õ«Io)› ÞÀ¸Ï[®kÚ}xkä&¼Ú­Z†•8«ûœâÿÕ0\\’K' _ËtÆOÞß÷‡ÂÿTÍñWmÛ¦I&q€:1©³ÓWü Í>éB¹v3 .¦F5kN&~òÆbG­ÿÙÅPš¦ER)n&ðr¹vÄã3¾âËò…ÿµ¼çâ6>»-|@ìµ·€ xÉܢѨí`HС"¢Iš®£DüÀÿÅël`ÏCBüG¾ñˆMüÏïÑÄëc˜ñ1ˆRñ?`  ÃŽ/GõRñ)Pœ}:äø?Ö`Ÿ>aþçâÓ°ãç»lâÿ‡¿;Ñm7;v lm2ÐøBìƒÝ¥â{ am¯)ñMžÑ˜³Ÿ¾p®!øº&Ò #È&€apò»ú#„`3V;|ø0æææ°qãÆ†Ý)ŠaJnùürôôÍ7¬þâ9×ÕÕ…'N€ TC¯ÿÖÿò|•ògûŒg%¯ •-¸¿Ûª%Ï-·ÜÀ¸ȘÆpŒ?Ûg¾”ÈÌ4ldüBv)`JçÌßaÆÏ®7ÄïÊï"uö5 ß÷Æ5÷ÉgŽà©;®lüþ¼ø³xÃãÿó?ÿ³_Q°uëÖÀâsœ&ÑhÔönixxØú~ð Ñÿ­^½Úz'ZøŸ›½x Þ­ºh@hyÀýü MÓ"cccú¥—^Š®®.ŒŽŽz–›#”KçUU-qŸ0Ætõû7bäþ®}@-æÂ^y4M‹¬É2}" ¨é$¤T¦ÄBl#Õâ&üç×}Q? IV{Œ÷ó\€¯ª¸üòüèG?c¬>#Aü/Ë1 ýÍèýâ£Ðg€ýê¿bíÚµ˜œœÄ‡¿ôa#ÆßÜYŽ™Ÿa™ÔÃÜ‘E€ñZ ¹\ñx ;FFÑûH1þÐMÀË¥mù¸@=pSSå%ûûn’¹jÕ¸µœ‹ÿ»ÍJçÜÞBúm‹ ‚ ‚ ‚ ‚ ‚ ‚ ‚ Þ)x”€'Ú5\ÿ•Â/žø/¸þ+…'þ¿ßGvÆ> º˜§Z* X—7[t-Šÿߺ׳ÄcÊ?ó™]ººº°iÓ&lذ!X<ÞérìEñ4ÓÂ-Û€>ë©“|þBës6;ŠPv3ˆ5j ¸5c¡ WD€I} ØfX ³¬•¨ òkN7ƒ1_-Ocúű—ñ¶Á²T ß~Åm%€çp¡)È,1X¹r%pýõ×[yV®\ H'¢He U Þ¥iØÔoˆ8÷¨{¬u€4–¥RPs¥õãæÏç/À%ò|]õucÕ¶mŒšüüÏ3–øŸÃg­ŒýQOŸÍòÌ7 ʰTÎYÿLñ¿5[oºØ†YJ˜™±úÌ6”N/†¢¼àž‹ÿ9j®_гºêÏg8ä»ð @Éà[>+lݺµ¾ýoì¼ ™Æá~¬ÿ.þçð¢FþåuÅ_‘É`Ñ ÛtCè?yÝž†‹ÿ¹ð_˜°ÖI`¨ýø¿ñä·ÉSIk@¬ò÷öÀÅÿœEÿRƾýï;j2bÊÎ0‚è±€|y |¼o-¦+ÕÄϰŒ­?ïéÞÍ01bìÛNVy–øzâ3v›® »ù-|gÉ€f*ÙŒ‚ÙÓmº¦Á2°s4 0Òð{´ûp–m÷Yëk‰Oeõ\– €?öü¸3Æô\:aKS«¿"“Ñ– €È›±ŽX‘) Ž˜‚uΑdÒZ_KüBéÆt† €ˆ,S Eq‹a°ÜJjÖúZâ÷¬EÃh  Ùì¬ß0 (’H××?“ÉØL`Åf/½ \4 »aÿ'û?™LZë«_‚Š$èº9Ö¿CV0¥Èx`D8)MO€Ñ,Ah`ç¤ÿ‘o3 òÙÖ÷ìÙS’tbj"´ø4¿ÇPjJÄQZ|9jtò¼Ò¡.ÝYšV¿7´ø?6oe>1D¨÷ ¢SÎØâ·C‹Ÿ4Da=Ý]Pò ø`IÒ0ãw'ºÏš¦áÀ%IgµÙ`ã›±W ±WÈ1C„_˜*MbÛkV|ë™Z/>?ßúÐ~.°Ï4¸ÆÃT/TD ˜Ïôæù~À’?, Ïh‡^aòg­Í›7£µµ»wïlܸ1¼÷*"S0êŸÏó{ùåˆÅæ±cиÞöô͇ZÿgŸ}ÖvÿÙÑÑ––ðk^`×9/Πþ—1¦ó÷Î÷Î÷:ü=˜WŒ[n[åâó{ç=Œ3¾ó]ƒ[|¯m•‹¯%4°¬ðß#>K•΂íŒïµ­rñ'ÒíèLÍXÿ½âKñ™’¼Îø^Û*?ýæ>¤Ø5ÖÏãŸ1oúÎöŽïµ­rñ¯¾g?žºãJë¿WüÔURÅú{m«\|þìä|†*ÙÿëR%yñ½¶U.>x;ÅïÎøk×®­ßk[~¯?­­­Œwì’$AUUOá¿XŽZ©4ë= DÚŒÛ×"|wRnÑh{÷îõÌÇŸÙ$I²™×Ôƒªª–À^4†¹ÿb±--·ãýŸïö'æáŸyÞ¥òrLíÀlFõŠÿ{{{177gþ·¶¶âĉ` ð<ˆ;ï¼ÓÀß}÷ÝÖzÀ86¼-jšÆ’É$Z[[ë2Xîýâ£Ögþ.V^÷~ñQܲ¥»êzîm”‹ø']¼Ýâ‹´®xÛfà7f9ø»MM»€ñ,~蘢(þçä’ÅòÅ3rÓ³%‚ ‚ ‚ ‚ ‚ ‚ ‚ ˆw"ž7x¬£›6mB:ŦM›ôAýÀïGüì•®^‚jøÐ‡>ª ¯ÿÌ—7BüïUžÑÑQk†– 6`ll,„YXþ±_$ë¡›”#Œ6 iÆ ¨\Ø/ξê&öw ^‹i ÑV>!¸8* #çö¸€h #¾ˆ!ÂRÁ‚¦i‘þþ~}xxØ}À£äb,òÌ{\Ø/~æ"ŽhOe­ý.R«¡Á²T Ñ®¡/ËÀ Ó0:j”‹ Þ×dO*€íµ×ÂÿcÇŽY ;f™pÆÊ•+KDšœÞÞ^tÿÞ— ÷ȈÇý ÀÎåÚ!CAï?÷– rÿÇ­—[÷@’ÖáXÚ)Å ñÿs; A†h~ToT"Î6éV>8“7øþxûÿѶìý/¾©³‚`ØcP#Süož Ù©¢Ð?b¶ §ð_Ð(hiÏÖW6~¹ð†øßh[™Œ·©þïØa_¦(@¾8›±Y–-ѹÁ¶|ïÎ;mËöîÝ[Q1ÿŒwü ’iœ|í§Š‚x7ŠÂÿGlËŒ£6•¿ïu¯5À6½8áìh¤(ô_tÂØßNáÿ¿ @˜ÀQEÁªmÛj¾'Jž* mb.ü?箯YË~ó/S8oß8ПªÊ ²3Ŷ6ry ÊcæQ%¯X#@ð×6_¬k÷Ÿ¤1öw>šGi¤ 5¾8°øUù3xË29 Oƒ±«B»¶¿5ò³,Ëñj·j}wòžŒM›cË¡á¾Àâ¿ÿ¥ï0'‡¶¾;Y¹r%Ô=iHëRpÔÃQ³C\µm›u¹!uvâÐöíXµmœ†õÀͤ²ÙY¤ÓGmæR"©Ô).¼G4XxËì%•:…\®Ýúî$ŸA:½Ø*GPðþþÂóŽÝwÏç/Àw\Òmݺ½½Æ=ƒÓ .Lñÿ”b¿÷‹ut(Þfg Á^Äø|㑳›övãÅ¿^*ŠJ| šìYXn`^XÞ¼÷!þY ʈãó¸12¢²·Bª¿sæiXó+c†ÉiSˆ:yÎ0=œúç Ñ¿ŸárîHøñ»Ý%B®¨ÙɈ÷c·?S|DÉ;—4 í53þRÓPïqáªþµsSüÿŒ¤¤Ìtðçn¡é-ùp’_‚ónð˜™.àgrëþ+S¼ÿúË¿üKË|nzzÚ2 B¸ÿ1ë?%˜ÄbóÈçgME™GwɆ[ÿgŸ}ÖZvíµ×Z¢@MÓø;ÈðÞíœaý¯“‘6ÿ#kôm\Ì/ÇdìEO·ñþ7žÊ"—N@É+Ö:Ñ Øm[•hmmµ›.æommÅž={°nÝ:† ŽòuŠ¢ØÌjÛªHÌ܇1ØDµZBXfÞ^³³Þ+ðu,/<ß»l«20‘nG‡p»ÅÅü20²CGw±y)>5׎)Ö:ÑhÁm[•o~Òïƒ|ó{€L1~úMcÙȃ9to‰0D¹¤åáW­uV|¾uÛV%®»bpÏ~\wÅ <%ÔÿjsÙäËcíŸ3m§®’~ZœϱÖ=þèz+¾Û¶*Öß4X“//4.æ—/adxº·ö0žÉÔ=i(òÖ:qÿ»m«b|YÆðð0d¹xиÐú’K.Áž={H ‹ E±Ö‰"g·mU‹ÓL’$Kü†ðŸã5ë=`ž#Z`¶ßÉ€ê…ïNÊ áâ=_WWFGGmåF¡P¨KÏoÓ4ÍÚó}òéìÃÈýÏë®åVUÕÚ~êÜÕÕeËã¶Æ”yĨé$þaɵV] …‚íÝpµï¸¸`Ÿ÷Õ\¼ïF%vÎÈ@M·C*3 cLWÓí†ØD–Ñÿ{ÿïýó4¼fÌ4zù»/·>ONNbÙÚµNáXú„UGgÝ/é™Çs;–c:¬)#|Ûÿ¦M›\Dxÿ/ˆª” ÿùr8cFiWDƒ‹õŠ!ô/‡)þ×0+¾(/ŒëÏ…œåàâÿ\ZC>ôeMá¹CøÏ—󸉝(JÅ»|`q2™ÄÌÌŒ5Ö)ü÷ [.þSw\‰ ’érÉ-ñÿEí¡C¯XƒAÂq¨¦3F¹éåB/øÓ.µ;±ÁÅÿ‡¶oÇÙù;ôž={ÐÚÚŠuëÖY&¢ø0LÖ­[‡¡¡!Ým[¾àb~Óó„1¦kiClŒ ñ¿i`ÿ@ %40nœêØ–¸˜J)ÆWsíÙ¡£CŽ »'b™ˆâˆÅ"P{Ú!Ågt·mù‹ù•‡_Î6RÁȃ9Ȉ£{KÜ2Åÿ Ÿwº“ âYwÛ–¸˜ÿÉgŽXõO?­bò¿å+€µ³LDñ?¼rÅ»‘þs©«$Ým[¾êoŠù¹ÉcLW÷¤12¼òå1toí±LDñ?`]¨[{ ­3 ñœÛòßóów7üäž={ Ë2Ö­[‡l6‹D"aÿ/[¶ Ñh»wïÆÆu¾-Y–}¿rC4¡á&’a ÿEÜf½·âdH;€ñòÂw§HßO}+áPÜç¶•¹Ü~oëêêÂÔÔc˜ššÂÉ=‹Eð¯KîÄðºbÝùnR5;;‹Jˆfmmm–ùî÷ÁÒ=·ajǦ:[¬²ˆåËïg¿ó~ÜÌÇËؾýÓØùàæ_ºØJ/ àù3ògt#xôѾÀ¸oçf<ŽÓT·™hš‰ÇSºªN@’Jq³3 ª:EÉcúGS^›k½¹-Ë0™ÃãqJމØÖ~ñ‹M@Kþ^7½4 å%ÅzêþÛLRÿÞü_þÕ:AAAAAAAAUâÛÀ)ÈNY³ùƒ5šyÝm ‚[ ?3Á-ÈžE[[Q ÄöýÖÃOÞ ¼Ö…³ŽýqeKååË2€à"q!.ä¯v[b~eW'Ÿ˜¨)~­ˆF»wïÆC=ÔÐøõpòäI\rÉÿeïí£ã¨î<ïoóbœ Ø·-ð„Ø½´“õãø‰­®¶ÀqN V[ó– »“î haó )ÎÌ.;¹|4Ïì’™‰ŽM˜ìD#5Ç>‰`è†=dÙà©‚'Œc»ªÛ£ãÜ-kF‰ÕW@&¶ƒ©ç[÷ö­êêIÝJf¹ßsêtÕ­—_Ýz¯êûùþšXcË÷îåÆ1 ´½Ð/›8̸–Øß4LÑØÛË€0àà·[½½½èþý¿€Ö£!. ¿»E)õý}ÖŸvA˜hA{½¤vp­ÉÚð²dП÷sØG6{á&/ þ~Ñô‡ØµkWQCs¸‚'+‘ªÇ%¿^˜'&%æðÿ×¾ ¬ÿÊ'Bp>6+X[k4i…º7õ0 CÞ.Hz×`׌ÑÑQÌÌÌ ¯¯¯ìºQ‰ˆõ‚ÿoüÙÏ£eñá¢}à‡…qì¯ÐPÙ´3]•‚ÿ N“Ü@ƒ{ÅgY‘Xfg/“GxsVô{Áÿ¦ v[ïý®í͇½âkš†\.W±Ñ°œÙ þ饗‘ën–ŒË£‡1õãWðóDùÌPï¼÷†è÷‚ÿ·llj¿°—ëÌU˜ÎÖw-à½ÂÙÉ·N)øÿ¬iâ*{lJ$pÅ|aÿóé¼êïnÈZ¼àÿ•“ã¸ü#¶dø_^È5P^GÞϳr°@†llC®šAð^ñà ©nüo´åB0Z D/E‘ ‰šÇ—×ẄïFó€Æà˜S€¶0§@écÊ_H,¯gFö;†~ëÝî<.üÅ&k-;þ‚Ÿ‡KÅç Þ¼y³555…ß~¾ÈÀ¿K·R±Âz²fñ7%Žøþöv‹Ÿgn€-ûöY'£QlJ$jŸ™†uXÜTÊmLN[--¹Ü éJÅg&…áp8+în]g&‹1(?áÞþþB†ÉÆFvà&ƒƒƒ–=\øXZßnXÖxá~’65ñLñÄófÍÀGiY·ÿ‡Û­|ïbüÌÌŒãY+1ž¨k|쇅i…›Àž]ê?é³®ì.<â_™™§ÖßÕ5þ§í,Ô\g,`Nš>îG]ã‡öÇ-c KŒ7 S›êü >>hõÞß+ÆÏÏÏ‹,ä`dšÅwǦûGØó1׈µ¬ÇÞrÇç’A~Ù `ÃEàÌ5@ þ?b7ùØïZÀ³µ2ߟ%þO«Þp‡ ÿ˯À¬ _êùkóæÍ˜šš蓮L­­­Èd2ŽûÁRã—ª¿ÌÔ,B!ÿ›æ,4ý›4ê[ÿx<Ž®®.¬^½óóó v¦`J)6nÜèið¸P}¯¿„+i0?pð`p?ÿùw P0(¦çÃò|F: -¤A iˆ¡¼A!ÄŠF£Žo,üÜÏÁnÄô|Xž/›Í¢±±Ï BˆE#´óÃþ¦À·7C€ÿ …éù°<ß´=>ÄL„HƉX@ÀüÀÁ€Áýüç&¡OLχåù ƒ™5`"@{ÊØû“æÐ9r €Áýüç&ÚÊ›Äô|XžÏÄhC»û:Äžœ„Nn-ÿ–G ˜ø÷sðŸ›üâ¦kÅôÌ àZç|GÞn›æÑÃxùÁeã§bóÌLmdˆ™ j!M€ÿÜ@ ibz>,Ïg&´í¡¢wµRñ‡††ÐÔÔ$ÊŽ=Šd2)à~þs€––ÿóᆆpÀ\.MÓ iZ1@_…ØáðáOвûî»™LÆñ½°–÷}D§Yï÷îÝkÑv~=¹õ)ÀæÔÆö¯ IDATÒKï ÉFïŽ_ „ÿÆ7¾! ø{_Wþ­t¡ñbC/ýѧ&1òmà§«¾êø.@ðõ¨väºóíÉëïø6¹ë1|Ò¼ lœÇ?® Šb¯u^è1÷¯A±Šàp+Ðà Ë{¶–•i(eP)~5Ö"þ7Íâ©Ù9> à©¢o¶e×Áþ7S)˜o³ïîo©|ø·cAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIé7­ª €åÀ+e€âã55º2MFr .ŸŸ€ Yè:pèÛ f@<·ìLÝžË^ .CæpÒÎnÁABˆ•ðÏš&Ê*™ÔrßB¬ŽŽÑè’CuɼUÅxžu•µbû°²7AÈκíûö±Î÷ü úêší{¯ù–Ë‚Dýýýèïï™äjµOC¡³fûʆ´Š¶«WüZÄ€mÛ¶áÀàÙH¼^ñ×ø`M‚Á ?¶ËÖY¼ ?,žiôà‰€›¡î~„ÁÿÜ@îçãÝr˜, A>!Ä’³Ç”2€T¬ a=)®r¶µC‡áæ«ÿ €Íd¼¿LärŠ(ö' "T '³µàÝrƒÿ<Ãçµ×^똎‡B>ƳxýÀ³Â@¯o¥ºSJ}ò4îóükßâ_éAÀ­+Y¯;ך…ßÃÏE½ù¶àÃ¥ÔÚÚŠÖÖV466ŠŒ^nxälÙ·]]]žãÁÿÜ$¡â>×4Ïhv{›ÐIä@£-¥—ã†ÿçº5#@¾rY|5 д Ð4 ,™6ȈPìOD£¥—ã†ÿS©ÂálÅúŒ—4à™ÜÜ™e¹áÿjе7°ö¦foþ^~p‡ç4”>ò¸æ¶{K.Ç ÿßÂÝWŒÏç_î)1%‡‹{J§e/‚ÿ'Ü &+3Ÿ3P!¥AŸó6A¸æ¶{‘xá D/E=Ç(‚ÿckbÐç––p>{ó¬ƒDfM¾©‡äø©¨ ßÛ–F [á߆­ôj´„ëÝhžÿƒÿÀ|rg’ 0Ð=Ÿ÷ëPÖàÏëw¹ýï2`©¿œ € ˜,(>¥xÀp‰ç]y¸œ À& °ZHüŽŽ;v *Æ/g ?W.$>M ®{´Wür&üw¡ñ%3™Šñ÷îÝ+™8Á¶Ä"¶¿—ÓûaYã ú—ů7F:® ™­  ;þ¾÷ƒ"s%ù4º;б±±ºÅÇ0€q×Dü6œ Ĩ_ý¯ŒX :•5w?û]ó8àûsr°nñ_§ :•µ†¯€®<¬¡ ¤;¾1ÐU”Ez9¿Þû{À?À²‹Ì áÔ©S5‰_tìk€l椀}¯Ï§0@ÆëW÷åŽï%þ®¼ÆëÌ5 üØ{5|ÛÚꘋ¿?ûa­zÃÿ}%Á¿õ|MŸšš×ÂL&8xð ¶mÛV¿êo¦ø ц‡™!@½$׿««Kœ‹²L§Óú¬e<šë/¥Ô§'slsßT,"®¹¦aBOæà÷7#q$³±HPþÜ ¬'ÍË<ëå_6<’³BÏÌÌ ‘HÀï÷# ‘H¼ÆÆFa 088ÙD€—UŸ$‰Åa(@’~¿ÓÉiö}Á6 D€蒉€]Vmüv=+êŸO¶/»ih׳ö»¿z2‡‰X@þÜÀÎB6àeÕÆ×É­ln3u· óÉwæ“ïB¿êVø7ø@âZ±•“0/0ÀŸ„bOLxàªÊñ_~p‡õ²={5ŽœÄõ^8r/?¸Ã®Ï>½·ü÷‚I3 QøýíÈç™áõà7€Þ‡ž®øÝ?Ö­T*&L ™%àÐ~æµ4zzÚ;þß²ø½=Av(òåˆúðå„ÃÞß"·lp=Nœ˜!kÝ£À6÷|”>VrÛ¹áJÙòêõ^ ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤´@ %ˆ‹C¡µÊ:*Çá˜Üâ ©ñ”ëïÿúúúêÚø ,¹ɪÞùêWÑÖÖ&à7øg»Þns>,ëwMþìâ [Y2L"ghòš¦±8Ø_%ð뮑N;@Èz‰Ççð?ÿÍ·MhÓD½ã øŸƒÿ"ý.ï_œ\žÏËòóÇu ? &¶9†ÿsE^Er§wƒjY.–Šñyàßf$b*ñÌ.É X*éÖ•Ì(ãs”¢³Ì!Ç÷··‹sæEó½@±nee㞥uff¦¤™˜_×/›Þ¦RxvÆŠñ¹ Õö~_’ã‡ÃYpˆD &ò<4ñ—¾–8Âk@(DÖ+oÿ½{÷ @Éì¶ù…?\ñ‘—!»bRXpŒh! Áø>:‚kñt|ÔOëY‹w¯Büb577czzZ7ÔW¿øžæA3È£®ñß%ŸpMñ&Q×<^×øk(Î\pŽû€WÀ@Ô9Ô·þå 2u¹ãd³ÙB&òÇ/{ÒÒ€üA _ߺÿ¦âËâÏmþçàÿQÀÿ£µ è–ýÞ àþ¨1ø?]¿ð|»røŸƒ˜ÇàÿñãÇë·vý9üÏÁÀÿÅ?~U¯?‡ÿ9 È3.óþºÄý]åyÂzÒJÅ"0Òi ¤ò ”ú(¥HæÙZHsÀÿÃ#qøýÍHåNÇù2Š–[müÁÁA«··Ùlããã"~"‘°8ä/Ãÿ/¾ø"ü~?ÆÇÇÅ1ÁáÿÅÄ':±hŒ}ghN5cšNû(¥ ybш ùKð?’ ö§ k/cÑñýᬕO`ÀæDýõdÞâ¿ ÿ [ðûýøâÀö‡ý|‹ŽNhVênæ`à†:mo¢[±÷ä/Ãÿ#Rðoðcÿ»ìçËXt|}§ßнšÇÑ#^ÿëÛDýŸ}z·u ‡ü%øÿè· øý~¼þ×·áúŽ_Æ¢ãûwéÌlÏ0H9¶*¶=ä€ÿG††á÷ûHaØäËXtü¶¶6ëèÑ£Èårâ,J)ø7ꦦ&üŸÉd„9Àý÷ßÏ—± øne2> ÌÌ;vh~Šï|ç—‹YÔ‚Å×Y6:B¤7˜¾ðÝ+~%ž—‰u³Mäõ_ˆ!Voo/òù¼¢÷ûý"¥ÜóF¾ ñ0hÚ»w¯g=º²ƒ¬¡¡!p|Ÿ|dã<öšë æ3s,k066fÉÿ-røü‡ylÝú{Žé¼ýÝ“kü‡yp€/}é5±^ccc5{.Õ4 /Ù¿øïvaéO¶U)óÛ¿Ü<€€ÿËÅq ËøñÑi¾á>&¾áz‰[ƒù¶)¾“¦¢&ÌT €þ/ž·¾FaJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFUmP)#»Xß½|@Ìz¸Êcœ³e€ 6\„å6С[±TŒío£¬ €—.ÿè ǰcä{1`… \±ëAþEf&À3rñk4W2KÄ<µz&!„X|½}#Îkö1ÍþómVëøïFÙ¹p¹ècߨĴ,8¾—ºçüÞ@ÿ]ž*ZçÈ«³˜=R‡‡‹g|/ _Û*:.!Vµ,”Rß:ÛXêÖ•@¥.±ý¼€þ÷C¡¢sb½@1yÀJg¹Wüxñ',š šH‰g/ ?:[ô|K±h>Zd@S*¾?L¬TŒ2ÿ›Åþ¤÷öwýû¯ÿ€ëÙ3¼V„K6¥)ßKîé|»alœ¦±íoš]x:^xÖ°oWûý´j£©jãßþn·žú;Çššš§OŸÏõ„tGؽ}$9Róøè…/Ú#w³_°ägûuœšµ¯?’>‹?¿^Ù}50ó‘5fòý9‹¿«yüúaýÀPùóçäžruÙû?^‡ýÚ·†¿È¾÷ðìÒ¦a:î}]¶/eŸ¯I|bßœ–ê/› øöï0==í#5ª¿?œ-ª>@Ú¾Îpøº{|H±øz²6õ'4 ×tº?5a>É,18üÝÆøø¦§§} ¢×$¾¾Ó_TÿØ«y¼pä$€ümÿ)„ÇXýŸ}zwm¶ÿ.½xûÛ&|üÝ{{0¨éöokk+ŠèÐ!œ>} þohh@8Æàà ¦§§Åy³”øn>l"“ù¥ÃT»¦÷™’æ¿Ìà_Ì‚Œ—67«Åz•á¹6n܈––¼ôÒKhii© d.CÿÜH$N;Þ{7Ò„B>üã©iƒAär9øý~èïÝ»wÉë!ïcüÏçóhiiA:Æm-ÒÃ#ˆç ûA6Chnnu±ßÝËšðï[·nž}ÿˆ™™<¶nÝ* ¸dþ%É€RŠ­[·bü‡¯á§'ÿ[·nÅk¯½V“ýbÙ>À¾ðo|–`ð“¥|j$J©¯÷¡§­Áo8Ë9´ßûÐÓˆEZ 'sèéîÂ;/ Z/ þBÁ ’ÙÚ~ýzzƒßøRìŸy-Þ‡ž.¹ (¥>BÖZ'NÌÚÃ…oiÕÊmÊÌØ7aþ<³~ý¨=ÖÛäRIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIiáªÊÀÝÈGOæD #F2Kê€3qèbBÎf`:ÆIk €ärÄiÌš4„ñªo¨ã‰.uPJ}› ëèW¿Š¶¶6ø»$—[öíÓðò³¦ÉZè&²ÉZL=Jm¯…êW=Yû·å•µŽqÅz„ì´áíê¶ïË©u'ÈúÃÛqp@T¼ð»÷Ú0k"³¨Ôµîn\÷ÄÞ½·æˆÔHZ³f Ý¿þú ¼þ^ò‡Bg†±æh»˜Gë|ÜÑPN†ÿ½ ©jãg2´¶¶ _Îx'›ìÙ³Ç_†ÿÝ å+éwÞASS†††ðÞ]wá&_ä—3NJóÜês抜„sž…˜Œ°$êøt‰ÆeÆÚëmà€ÿ)#FOw—Èðæ@džæº¯'ŽkB!üþõ§ñëOÿ ®~ý€cübωŸ¾ÿ°.΂¿³Æ€P;^^Ç={öX‡Âùóç…¿ÖsøŸCÿ¡«š‘Nã¢YXo ÐhwÏž=¯ îiåº?àN{ºI8 òmPª¾­ÉK·¿lÀÅ3M¯Ó4œ5MœxälÙ·OŒwsõ÷÷€0à Ï\é)a`góQ€Æìý; Ð1 '…{XhÀ¦ñöÛ;ƒƒÿ&rý¹ —¼m CÀ™…0®a®Xlþ— /L4nìƒB¦g€þš¦‰çEÃr9‹ÇÆqð¿œI€lÀEÈZœ81+sڙΥy¼³EÝeÀ:7à࿈–%Lì«èó´i ð·3‹yÜÃ\1 €Ðí#ždü¼ñÂc„ Àš˜(ûà3A\ø§4V‚þ×Üv/.¾ð„ïæŠ^²¤ YD–¬ÅˆC¦a èºtwõ”˜«vâð¿Ñb@ ‡E¹Ûè Îð¿9…+»7Kc6ãòHñ>Xˆ¼ 0d7ÐO)õ‘„ßz·;Ï@0ˆsA<ÈF• 0J°8âË@?7 ˜ššÂo3*1‹€[L²Q@%J©¯Ó~æü+p˜¸~J©ÏßÞnå'&Äû†}.ŠøëVñÜÊ㟽ÀŽ¡u®gdJYÀŽŽl߾ǎ$7ÐO)õé:±b±Âs%7{ãË” 9ƒ°=®(> g-š 4p˜¸~ù^ÁM^"‘f$“Ó"¾l €¾|”+ŠÖ™ @( Àiàú)eFUzôGwa.4‹‰/íí…úËF€ƾ—ùÃåßQŠÆåá í[Ö8ÿ¹ÂÃ]h0¾ ` ì_"êÿ®¯Üe~á0NŸ>-Š?ÿùÏ ”Ý‘nŒ$GjÏÀÂ0ÿ¹|¡ –R`Ö¾þ𯰮ŒXâz˜‹°M>8ŒêûsÀÿw5»Ö/%ÝCÁžGb÷ó;{Wˆ×aÿ÷<“¶Œ.‡™üÂßKºZ€x®öñG’#Vïý½98‰¿+´Û1‘žXt|Ï}¿Ö½]8z¬0jS¸[ôŸ4 Ÿf ~ªÇÞ2Æ/%ÿ±€»¥ï!wøÏB(Àÿ@’ÒwŠeˆÔ ðÚÚõ,òÒw‹zÇ×î¾NÀÿæ“ïB¿êVñŽ»ño»i“€ÿ_8r/?¸±Wóç«U|m{HÀÿæ1a= nÒ·,ñ5MÀÿ§OŸÆž={pôèÑŠó-4v__ŸÅ¿åpÀÿîiëi@±èn*.hV ã…ÿëÛ½\9Ö©S§ßü7n܈S§N-i]8ô8ßaù6οò%Œ|û ÃB<7ãæ†¡ù|¾"l_­ø{77ÈçóðûýÂ`c E@>…_O&tIñx¼ªoÐccc–תüùgÛ¶mH¥R˜nïÅ©x\r? îåÕþ_y™ô>ÄŒÏeÓrâ&à^N5Ûžµ¥…ÿO ]×S ð^Š:ŒQÝÃ…e=†õë &ü?q‚¹ç‘˜&())))))))))))))))))))))))))))))1U4øMà”RŸ s¸Ç°GK‹ÍåZZ(ü+HÕY+­_À¶LOO Ç­|)±ä8«þöo‹ Ë« ï‡B¢ŒÇÚ²o_ÙíU+¹ùÔcù„ì,[>žÒWã Ù J_Åí·³F&õØ÷™ƒ;yöñó±y4èKÏøäŽÙIˆeWœ’uÝ6Ü¿’`ÝJ‚³°§±Ë¯{bD˜T+^ϵsÏ"õƒêÄú8b±ä…Î":‹ç&„!€9z¿cYÏM`ÓϘE%9¶³ sˆ¸¿¿_€üÛ¶mömÛpðàAa ›ÀÁƒ°c8aôRZヅy¶Oì`YÜ9DCäo³»o[C€I×^ÿ¶]“6ߪ8ßÈ>óÁfW+ɵø7†À½2ظ!>!ë‚Ò¨®q8opÆ3¼y*™ÃB°Rökø2€‹ÛvÔµ]¸® …pþüyl˜žvÆ£µ๸ ÀÔÔ”htÈ$¾÷Þ{hkkÃDŒ5¶…|0 ‹u6€ô^s3¦§ ãúûû±gÏžªâóØ2úÀ×ÜÜlazÏ€+àÙ lœÍã ÍB“6‹Óà Öhê)ôW«ÎÎNô÷÷sÕs{{‘) 7 à˜ojjJœË¢ž%W`·Éþ нq’$ !×5±…lœû¥Æ’sÝò~·ý[æø‡³ˆÅV [!þ¢it‚ˆ3¾œ S×/!c`h>áÃá@\*¾išðûý¢Á­—‰d£€Áhð—M¢ÑhQy¹ø/?¸7Dc¸!¿[o½Õ à1GÙ–-׋ŒO?Oè ¢ƒž98ýòƒ;*Æ¿ÇÇþ˜ô–˜f˾}8i›pÉ™Èu_ÁàÌ5hæ;j¹ì°úœŽ(¢%·À¿ô鏿6'õuåg?…Ë?b©b+À÷¬`ð?ÿõ9½býe¹3jÛCžßù5:©'´üjâ§¢¦€ÿ­n a1,âƒa|{Õ2þ»Ñ¼€ÿ¯Ôh› f\š½/²,:¾—_Þ?õãWŠÊ˜îð”£äÝhÁ€µŽó T|·‹;¿¹ã{²9€—Œo›”ŠÿŠGà<÷¸ds€-ûöAC+9>7(ß6(®¿Ö ÓtÖ-[!Ì’ÉiÈ^*˜åŽX¦Gàip%›èú%È¥âs€Rñù&–ËVÿ ÀÀ;?r&#püàà d…HÄboRžÓpø±ÔÊqÆ÷–¼_‰H]âÓõÅ~²’Ö!þ»¥&’2Q“uª©ý/_Ւ˰ÿµPáÙÇ4Lñì É,açÁ2²Q˜iš5;þª‰}Ò´/ þ HÂΆ¾Œu¯gü5>Xg®)Àÿk€;Ïÿ@ IDAT Ã\ÿÑŽô¬=\îùnAòÃZõFþ_u€;$3.Î>óëk !Eï¡E÷±ûî»»ö5ü&ç‡e¦ ð(4k¿ç8ß)¹!@Ï~û>PÃúwuu øõêÕX½zµÃ„‚¶È©S§Ôö›ä‡ýúë%ÿÌx% "l¿{,‡8ü0S»h4ŠÁA·!pÅá€F˜YaÞï뵇ÿÀ0,LÄð‡K¿[Ô<¾ ÿ€yáb+'Nhæª8ü×y·?¿¿4BÙuþŠéuþ-šùüLÓ@æµtUà½Wl¹L6Ö‰EZ<ï³m¿~ÇÑôêU€/·Úu d-(}¬¤¹+PøF*Kû˜ómÓ^Æ8qâ1Âàÿø¿vÁ룤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤T^W,f&J©OOæÖ“HfIÝþÌç {äÎk|.GËÖÃ]&7ªÅúðáæf7[<ÍB%7h¢”ú6%زoŸ£nrY©mRj›ÕR]uLûUí¾'d§ ý¶\V}?g:Av×j{B,±¾·ß޳(˦j‹CTëlðŸÇåÃîn!°a,¶æèýøÿСCxežB×/ øß0Öõ§ÞzÏM`๠¤ÞzB˜Æ:hZkUñûûûqèÐ!üÏã÷õõ øÿøñãEý™LÄÁƒ‘Éd„IÀñãÇEñrZン€IïÝu«¿8LÃùРû ðÿQ÷±ôÿm‹õ·Ião®fè~„Aÿ¼sÈ€€ûbà?‡ÿc(˜’1@Hš·JQJ}É,‘NÃH§a¦gÖ“Ø@)6Ø 9”ѦÔ~R#ø.†Èî#Ãÿ² À¦ð=…óSî_¨Þ{ï=\¼÷Þ{øß0 —“P¨PÍd– ŸÏ‹s8YQ¢/§¾¾>ŒR*–“Ïç‘”ÒæÈÆ“˜ @ƒ¾˜>|`úÐÔ3‹¦žY|`úª6?à°Éèè¨c7oÞì˜Î þ»§áãÝõîìì,ôÃÂ\70® €ŸúXÃzYEà?à˜††(ˆEœ&ƒÿóð•‚SØv • 8À9“2€"ðß= ï6‡³eëO±¢Ñ(4Ms€ÿ{÷îuLçÿÝÓðñ¦‹ö4M³büÈ«³¸åÑÃðŸ7Úä¢ô1÷¬Žiøx·yÀËî(ŸÃ^ßµ ¦+WÌSøÛÛÓ¹ÁŽiNF£ø`5ËàºÇÇÀ°Rp!ĺâŸÒøþ˜üÿà3Î{‡üwOÃÇ»Íô9}IÏò6øá/šÖ“ëIüðMâš,7®µ¬nß…o„b_û>ÜxîFñk´0Z LЉºÅ¿R.›¬ƒ9åÙÑÀÒnRqC4&ùG^e÷~LóáR*ÀÿOµ¸åÑØ=’ÅËîçA©y¹IJ¿ˆÏ³;òkêÔÔTÙøþ7ðïÒ1::ŠL&ƒÎÎNq.ß¾ÏôØ÷€jØçeH%‹ÃÿW¶ìÛ‡QÊàÿNBÐIÊ?“ò†þ~¿_ÄçïüºXé݃Ãÿ¦™A29ŽŽT‚7i‰ byvÍ!¶! .%ÿÆ:ÿ§€i‚„³ ö} Ô¼aû^6)lnp´?ÉÆña¸ŠæpÍáã¿eþŸ™™Áàà R1ÿ‡u‚°¾°wù=ÊÇÚñCÓâÐ4–R†ÿvÏ®Õ{—;þŽÛعÙÔÔ„¦¦&(‚aëßö9d 蜧žñ/'Ùn»²ûj\Ù}µ=•Ìm]=ãô#¬üÖ•…gP7vXÏø¡ýqh!MápÀÿõŽ?ø8ƒL9ˆ 8áÿZÆwÇ~¢omÛ-´mg‹ð}cÿ6Äw+`d/ÏÿÍ×ñ¹ÕŸ[Mðüß|GìwîÉZti• þ¿ó<Ð<ÐŒswœ¿0ÀºúÅçàÿÌÌ ^|ñEìÙ³{öìÁ‹/¾ˆL&ƒL&Sd‚XK…B³0Œµ0Œµø(î¸ã¸ø5ÍY˜æ,†f6·qð~~ãããxøá‡Å/¥”RD=Þ –¢ûõ×K2üÏûµ†X¤~ý!lþçýˆF£Ëßÿóþ3XŽø2üÏûƒ˜ ÀrÄ—àÞ¯Ý}bïO.K|þçý·Ý´ ·ý¥iøÒ@ÓÓ…ãrüåX¾ ÜfÿG333¸ï QÇô‹‰ãµ½ !V,Ò"¦‘¿?@<Çôô4ê-ÿË“þ›h¡Žz/öHJ©oll ƒƒƒˆÇãâ›@WWúúúÐ×ׇx<.:þÍsll ñxƒƒƒ‹‚ÿ«Z·ÝÔÙy|^Òò+l³H€::þ_ÈrÜâfŸ±51øï6v‰^*~Æ’§áãÝæÌX ¾ÿI+)))))))))))))))))))))))))))))}µ(.¹AJ½ÄHÞ•j

=íì²y‹ÐvW™Äa„öŒ`¸–²üår:ºBÚF¼ÓBš#ç ä0þ{Í͸&*µ¸Eé'€ïÔ©S¸YnvñÏ<îRxY”R_[[›.ÚÚÚD†­v= =™0ÿa„e Mf "ŠX¤E4ÎÈyèСª„B¬C‡¡¿¿¡J1jÿ& Ásþ³m¡JnÒ 3(‰o‡}uÕð?À@þÖÖVô÷÷;~{;ÖI๗ €,>žg®xäÇãš@Ó€— @’’!F¥F—Â`®›e]æð ñúûýYhHe€?¬ȇ´— €,>>Ÿ0ð²ôÉã' "^Îåe ‹F£Èf³þ¯?¹s-ÖÞÀ јàë­NlÙr½ö2ÅÇó¬ç• ç5>¶ÿ7\d`KÌe°eß>¼/í/YÜàÌ5ì¹§Ô5ׯÿŸ â­»qÍm÷:þéÓqåg?%†½LdÑ({6NEM˜©”€ÿËÎT¥þyýŽl—ƒƒƒXç_×bÑUéÆs7î¹çñ›hN”›eÑ¢”ú®K¸ s ¿\ù)²S¹‡£R·ì2WáϹ©TÀÿ'“Óó€* `ò)ŠTŒ Ð`°ÿð00<\–Ãÿêÿû8üGñ‘Ìv 9àÿD"!Ì8ø¿ëPÑ´yøBûã0Í.˜&Û®áá.|©k-¾ÔÅàÏ<Äý|©×<¯øw}å.ÌÍÍann«V­ÂüÁˆçþÕ«W£÷þ޺Ʒ†_šuà vaÔ5>ü+pyä×ö5îsú²ïùÿ·®ño÷³{êä`ƒe_€uÐUçýÚF8ÐÓÝ…P0ˆmòÖÕRßø#É1¸zõjƒAñ|Öl¯I|¯Ø'÷à‰ö88Œ¿I a“’iÖE‚u­ûrÆ/¥3ÿóEÏ?ÿÁêÊSçî8عs§ømN›ÖKsssEõoll\¶øwÜÁ¾©Èõ_¾ú?üðÃEñ;VfŽÅ«äõ7é7×_ÿ³n®¿ýëäëoÜϺZ^½ÔÓÝÓ0‹Œ´†äþð¢Á×jµk×.a‚!466âþûï¯{|DÀ¾·¹BÀôþéºÇïîñ!m5 —\Sÿø†ùä»EFÚÝ×!¹;U÷ømÿ)„Žœ,2¸í¦MØÿ?sõ¯ÿޘnj"#m{¹g÷×=~$ÁéÓ§ü°ã¿©© O>ùdý—êuŸ—ÿó±ì×1+ L‡œÅë þ—[/®[¶„Ëå@üÖj½!ÖD,€TÁ!‡á,0J©ãݹVÊçó ” øß]ÿm-šBwâ‹ùfd"+–| r3è®®.pST˜ŸŸGWW—è¢Ñ¨ÃôÇ=ÏRLzz™×Ò0Mùüû Þõxgž"A>?Ó4y-Þ‡ž^Ò¹Á×}x$Žá‘‚é×á]ã¦ÊοXá„-FôRÔðës:´Cþ¥Ä¿®_?Š'v ø¿ÚõQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRª^e Êà±H Œt‘@!K±<]=²UÓ€@†à—»Ü:•Zv½âVàe¹·W-×§„_X¶}ÿÛ`‘zë … Ö<Óž[Ãóöçð?Ñ/ÃÿЪFnã\©ø°?‡ÿˆ~þO»²D–Ó{«qµáË&¾lM÷-`ÿCê—áÿWœg(·aå1d›Hà?7 0†œÓ›=Œ*ˆRêKf BÁ zº»ÍðHa=‰ ” øžÿ@CC.F…‹W(D,Ò"Œx|À€_¬(¥>žeq"pt±H‹0àà7HfÙ:õõõaÏž=U5€ã1ù±Ÿ$D@ÿ²îDþ¥g/:nL²øŸƒ£ðÜsÏáÎ;ï&²ÖUÏÝ’áÿ’×$?,Ìu3X` e·màÖB9þ÷Ãò2¾ „Xù|ù<¸FFΠ»{b±E‹[¨¯… ÿ—ª?!Ä’²f³YÞÙüd€j$ÃÿåâG^ òäcqë÷á†h¬hy² @5’áÿRñ×ø`¹8s ~òp·màÖû Ü2ü¿Æ‹ È♯RQv¿úo¾‰+?û)OÈ_6(§ß}ï³à€ÿsO¦”úü»thÛCèö2µ9~ü8ôd¦a"‹Ô  ”ú V7o„b_û>þ»uÇî€Ñb`‚NÔB¸R.K·`nxÂÝo à 俜ÆÔ_‡)ÀËî@ÿ‚œ`.Ó쑬XF¥ø^,ü—M:;;è/ëÆ·Ÿ/*Ëd2˜œœ¬*þº•·®z$þ˦„Ð_ÖYÓ,*›¼”¯}!~<Gcc£Ã€Ã}2Ø066&@YüYTÖÌÌLE@Ç'þ i 1ÉÀÿeSÎ Ð_–iž)*ƒi™H•Šïæ)˜pð_6ëCCCx§ëÿÀ7:‰öƒÇÐ~ðr¹œPäðK}“ß)¬ñÒÓù»‚ðwA,RÓ÷a9þOü´òôuŒ¿êB¹Õ̺åŒeÄ´«Ý2Æÿå¯xº¡Ì“e=ã[Õ§¯cü¯õëË_ŽÝ51ŒsoœÃá£m»…¶ílñ¼¬Ö±Óñç,ø6\×Ù‹ì[@©çŸ^BpÄ&Q0”Z²òð½ó)`ÕÀ;ÏÍÍ>^2þ7¿ùMPJFkþüé¾þŠã]ºþ.×9øË_9cqÕ3¾¬°ž„‘N;๿ÞD6›uÀÏr½EtLà ÿËýu–?œ…a8á¹¿Þ '4˜Ž8๿ÞÒwúqý‘÷ð¿Ü_oùwé0 ÓÿËýõV[[r¹víÚ…†††e?þ—[”R'Âȸ·‰p½ÌJý÷E)õ:uJ çr¹… W©gö¯Aú°/Ì9ÖK^—x<ŽÁÁAnPCrn,à^¦{Wê£8m<‡ÿ\jÈŠšŸŸwüf³n3Ff̵B¬ù/S”4à²}`=áÿ]ôs!ÄJÅ"ÂdæäxöÉã0\ÿc¹‡ûý¿ñ‡woC$@Ñöëwª6^¿~ë×F¾ƒö1Íò—MÊ©û{ìz,ÃÿõüoVIIIIIIIIIIIIIIIIIIIIIIIIIIIIIéì²ný&ðÅLWø]ŽÅãõ÷÷ctt£££u‹ëŽÉUmœ¥¬O¥íë­·.iþRú×°ï3‘8›ÇùØ|]ãòØËaA)õéú%ðŽ«¥…Š`0¿ ôsð`¦ò¯{|.çÝpÇïëëï¸6nÜ(:€Áü2ÐÏÁ€™È¿îñåçÍYðé>þëÒë¬B0˜_úÛ¤þo¹~ÝãÏVÈD Tî~0lnÃýr'Kæý¡íe£T%#†i˜0 –åžÃí2tÏu³ÆºS§Ná'¨PÇŠbE…¬ëz2‡H€‚—qóX¤ÅÀ§b‘’&5Õj"Æ kðD‘…ž,Àv‘à??ÿZ“—pèСÇO{{ÉùO<âtªØ²oŸ¸/…Æ¢SSSÞ׌0Rq®Øo™P-n|)‰†œõ%MI°<Ræº=á¿? Óòùtý’§ @X/ ⌿?I’âó:çóÏú' d³YD£Q˜¦‰l6‹Ý»w;L‰ÒYÖ5—1ƒišŽ2³“ܹ³G²ˆ¼:‹Ÿ'tO€·Þê,ŸÒÇÄ<€[=, ³˜‘Wg=ão¸ÈŽÝ3×°k¯ÛàŠyŠ-ûö•Œ2êl¬º)‘À¨t®p ìÌ5ÞpX8¡ÁL¥[ÃÅžÀå½á0ð2åñ…'[SØv¼Î©¨¹d8ippJ±Ÿ²líJEFX~½®·Z&&°ÛîZ&&÷ÜsÌ·M-u„0LfRBécŽcŽ ¿ÊÆÛÓT«J2øyu³GŠœ³å<à)Ññs`êǯˆe”2à(gÀ"? MMM ƒ$·ÂzRdÆæf£££˜œœ™ûJÅ—ïuø/¶ àÿÏ^ ˜¼à› \e¢ãçà+Ò2JÅçýìsÀ þwuuaffÆ3~.Gij©ifËtttàØ±cb¥âÓ|4o_Cì{µïû2øOóQvŸòP29-  c’Éiv2 Ë(?Ÿ¢È§ìí= ôôî)2øŸOQGøÐ{—zï24¿‰Äµ:fffD—H$ŠQFa‹¹öÈï>ÔWü\Ñ`|¿¨,iõÑÚzÄ÷:ºººêßþ{\îènºlõ÷ºÞQúزÅÁcéº|õ÷ºßEËŸƒH²4M«I|¯Ø333ØqÛÀÑc¾¢2­ï¹·œñ½Tîùç( ~õTxz=vžf/Ü;wîd`pÔrõ?~üxÉçƒZªTý 0ÍÙ s×/~.—¥ {÷­¤Jç¿þ:Î:_åXüú+—Õòú+¯eà?™%âÌËë!B˜Qðlš¦xàåõŠOù{¾üƒÎùˆ×œµ‹Ï¿EÉÀ¿žÌ!mßyy½âÇÞŸdq$à?q­óÉwåõŠÏ¿)ÈÀÿ³OïÆ GN:Êë?c;Xþõdæ1ÃQ^¯øCCÌÝ•ÃÿÉdƒƒƒ8}ú4‰Ôñü Š›ð®Ü!õ€ï+Å;uêxWËøüÚÍ¿9†…ýáÂ7A~}—«5Ì®V’ @Q,>Í~ÿ4Æìû>ÿ­Ç³‡ýËÁÿòø¥ŠF˜ @8¬›pø¼ÿ‡Ã:ƒÿ#µ}‘Å¡þ;s²øo|·)q%½õV'NœØ Jg‘X‘€ù¶é0ð2åŸX‘¥…ç@~,¬_?Z—ãBIIIIIIIIIIIIIIIIIIIIIIIIIIIIIé첕‘TjìW/\ΆTÆ>•D±ä ]þ† îŒï•¦«uüé馯Bÿö}&²­IÈ7è«q>6_·}ÿ›0€ˆÅVAÿ\¦™¦µ4­Õ‘q•ÿrsÓÌ :[”‘µ’úûû‹ ®t: Ý¸) âøñã"#ÿåæétÛ¶mó̘WN1«úçú1€›íþ›Á€ƒ£öðQiþÛ&•W%üFœð?òð!_€êes·ºm[ž¿ûïi+)™%üçÃp†ÝŸ!±HË‚-F¡`Ð݇‚AüYWgA$@a¤ÓúEZDFºT,"2c×ú\Õ“9GÝås•RêÛ³gÏ‚î…^óÈýw‚Áÿµ_vgggIxdjj £££E&Ê^§gêììDgg/ ¯òãz·Y®Ä\7h*Pd@ {Ø# /v›¬“–áµ|^ÿp8[2|>@*(2à`¥Wbúp8‹p¸Ð@5Ÿx.ŸÇçà¿—¢Ñ(4M+20í¢yLÓãù2¼–Ïã¿üàŽ’psäÕYÜòèá"=[¶\_4ÏËîÀËîp,ÃkùÜåJÂÅg®Fi± À&{{¼ï±îñ±N^†×òyýõ9½x¤­+?û)Ïò‹/§;–™Šš0SKË¡½½½yKò²zë»ßý®þåø¼lydà©§V€¿K!ï*`p€öH/?¸ïFó¸<òk{î§Äry@t²W)ŒJ,ü]#“É ³³SSS¸ñíç@À'3àlÀÂUÊ€eÝJ"Ìc† )i0yÝ{ò8k_[®’ÒËoJ$D7êâ½à/cff]]]+i033ƒ±±1Äb+Šž7fÀ;>¯¬®®.oߟL4e°~)Ó g‘J`šgÀñ|›LN‹Îa@c‹æ½ Xüa hRû“¤¤ €i2#š¡¡!|á¾»°i¥†·¡aýÏG0“Þ¥bÅÛ?ŸZxVBñì!çhZšÆž­Æ°^teç_¤¼ââŸÀ'>ñ ì=”wËÕ¬cHÝ2Å¿Rc“!uË?p ëvàÝrÅ×¶‡ mg÷|þ~âΆYÏø„ûš˜ÍfEWëøîy“»t¬¼û ˆEðçèÃÛzoë ¬¼û 2¤$‘+;-â¿Þù:ˆE°ó‹!ÿõÎ×1ì®y|·~ÓÏ?¯¾úªÎåøá:| óÒ‡½þ¿‰øîóÿº„+þtˆE`Z>²„ìÄŠ?ݳ¹ðNT4â¯[Iðú?±ßÄ! ¬lø‹A$]ßjyj!Md%æð?/7 a=Y—«±±Ü€Ãÿ¼|ffƒƒƒu pgRúþ`D/'/UA­`HÉá^ž68[×øÚÝ×›pøŸ—›O¾‹pB«küÛnÚ$Þ«8üÏË_8rúN}ë¿=nÀá^n3àߥ×5~SS†††ð?À ‡LÓD[[[}ÿeR9sg¯úÕë?®j֫ܺÕb½(¥>=™&ûæìk)q*­ƒW J©OÏî7cæ,ô2&ϵP¹çí…þ×Sèn ¢‡uøýö÷oþ®g{úýí‡uÌ™²ûCøû—ƒÿåñÕˆï+BÖ–œFûXñ÷}€þ¥Æ²Ö±ÌõëGqâÄîª×KIIIIIIIIIIIIIIIIIIIIIIIIIIIIII©:•5¨¤ze-ÕxD¿«ÉrQ«FA¥€ó¼ ÝåGBÌ_jÜjêÈ»r1ëÑ §¹Ù‹º\šþµìû£Gâ7ˆ_wÜåhŒVJ©O×/9@ª\ÎÙ ˜W¡ÐYG™ b¹ÅMª‰ß××9£Î©S§ÓpÀÛ¶m޲t™FOÁ*áô9 >Ýœuu²8àßæ*û1Jëæ2ã„ü°žúÎS0޽ŸgPa:‰ m›øßæ}Ò®¶ïŸ¿–ÍÛûù§ŠÆUÃHòã©¿¿SSS"«}2KD6{ÿG‘u@ù‘ÀÂ!³Jë °x<–Ë€bSšP0ˆP0Ó01<w*¹ñ%àl`Çë =뾘k¯{Bˆ¡TÀÿ ®|Î5o)ˆºÚxÜÜF†õ3™ Z[[1::* lþ›Ÿ˜€¿½]˜lÙ·O¸U*{³ln Øï20M@Ó˜ €ÝèžÿÒIa@ Â25{4Z,ñÈ"×?[]¿ä©T@À˜ü7£Ä·. IDATëD˜ìOaPÞ†FËÅ÷ûýEfÙl@@4ôfËb¿ÑhT@Ÿ¼œT+9þ Ñ~žÐ°þì‘,ÖÞÀ-€ ÿ]¿~o½Õ)Ìy@¸5õãW<ãs€°è.3€É À­+™ ‡þùï‰GÁ–}ûÄñ¸)‘ÀÙ ßõ¸«¢þÑKQö»uáVÖ€õÊÏ~JLó;ý ¿ü£70S€Øš˜c—ùöŸ™)¥>ÿ.Úöz†»÷½ŸØ¿Û¶mƒ|¬u¸pBƒÕMð³ÿÌsš¯;‡Àav¼ësµ… (¥¾ë~\©Á†­÷ú½{÷`÷Þ3k¡†+@uÅð?“×1Ï 0¸y@)Œ…°¸á®°žÄÔÔ”0 àËëììD<ËðZ¾ˆOHÉ{ÇÙ ,Û°þçâçœ ýw‚NB„yÀÙ ´¬ÿ½ÔÕÕ…ŽŽŽ"øŸ+—#b®±±1Œ ó€®®.Ïå‹ðálIš²{ þçJ&§Å4\$œem@óÑò4:)m@“¢â>344„\.‡oþå×ñÍ¿ü:¾ßÝÍö‹= ¿'ñûT>EK.¿œøó 5Ά}»Óì‚i²g­žgÒèy&?ð1 [Oæ 's VmLŠxüŸù)à“7}o¾ù&Þ|óMÀàãƒ||P¼ÆãqÄãñšÇ_Å.ïxçSÀ;ϳ²;;œÈTZãøWFØ írÒ‡Ë&p™ïKÿ³!{zÛ„¤Æñù+6üÑÙ‹¬€¸ŸuüÈO‚$©}ý­‰a€¯½æ1CŸÄs¬ã&\ü]¥Öñ¿þÕ¯þâoÿ”R‘i|"=‰ô„0aâÆKµŠ/$?#ÛzÉÏ`ØÏç ÆP$‘óœ¶âÏ9²ÑQ­ãÏYðm¸È 'þ£¥Ÿìý¡ûœÏ“KV¾w>Å ?>þüÇ='ùÚ¹s˜Ø/ÛÏ ¦õ§”ú6oÞŒÆÆFüÉáÃ%ëÏÁè¾¾¾Ú~ïËç…PhÏ?¿Ís’¯;¿ŸÕDþfQñ Ä«W¯ÆÃ?\2~CCv߯ €è2aäš°M2Ûåïdþ?®ý9X">òåï q?êv à°2ë=µPõï›K‡ýMÓtÄoll\–øö7\ ký’Ï;Äa÷{^py6¿€ý×:ß󴻯[–øööéÝŽø·Ý´iYâsØß½ý¹!QÝãÛ߀Üf ùÞ³’ÿ›X´éØ"çYJìróÖâ[îbÄMx÷ÛdòÀMxW«uã†nÙlÖñͳT@|]½zu-V¡H4Ä̇€ÿE«” Z tôêUôÏ;÷xnx¼P9͆`¿[Z8Ì~?¦‰iø;ÿ¶™X‘¥³Žq=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%¥ÚjIËÕà«ð»–rCçòzôõõÁŸÍbffþl¶¨Ñm5P~­UÏíãÁONNůW]›ö}kòÚÚÚ0g΢­­ ­ÉKuÙ÷¿)·ÉB,¶ÂsºááY„BgKf`Í冇gó´´T†ÃÝñe¨MÖ°mÛ6øï68pà€cž7VŒ?gÁÇ;€©^ú˜ € þ»¾åšg¬ñÁ¹D?,øa~á0îúÊ]H'Y¦§tÒ9`p¿Ã `ކáîexIÌã?~¦¦¦055xî¹çpèÐ!p3€L&ƒþþ~œ!ÖÐ Á×J|}2‘è ®E_Й¡& : ’Y‚á‘8†GâƒÐBšÈ ª…4ôtw-ºœ—’Yâ0"¸Üz?ú‚k‘‰¬@­®û|9£6ü?óïˆqJ‹²ý-U¢!½ Kr8µµµýýýŽLìþövðcÆ¡«¿¿™L¦2œ²Ûøc…é*ç&±`ÔGA}xÆ4óQQ^¤Í¿ß, F„ÃYhÚ^‚<Ãá¬0ˆÅV¨` e>@>p”ËŠÅVÀ4]¿T¶þ¦i¢¥…¹\ÎQÎM¸AW"‘@4E4u”ËÒ4M4¤-ÿåw`óÍŸà„õ9½ö¦nˆÆY.ßz«‘Wgíìæ-`¦³G²øy¢<~àˆÕ9W97¤›ã#¸bžâŠyŠO÷tãìг ånÅ,6%8LŸÓE6+ô{é_útüN¬ðç¦úÏ—½…™JÙc—öóÖs‰¦¯31  éë_ÇsÿåvÇ4õ|æ µ ãkçØÞ¹×þ}xãÃËŸX«kµsñaJ[Tü…`\—ðKs4'w®ÅËî€`,Ä€eóæÍ¢œC°°yófôõõ±8 4`‘ã÷PŠa—?÷z(F/p•Qˆ¿n%þ™T’ÛÅm033ƒÆÆFttt@×/‰rùÙ3cll ŠÌŸÆ Ú÷2 ‰Ž Ùˆ€øÌD(2XHüÅþ$ñ ¦€sú÷Àb$Þ|Ô6è¹7Îáð Îãš—}ßbÇõÑš¼Éñ=Š7ß|³l|ŒÔ#þSï<²ñyÖÇzÄ7šÇe³B|ÔoûŸ½@‘½X>>?+ê?ÿb æ1£l|nÊUø½½½ ”–¯¿mØT«ø^ëó’?ê€ý·íNÚà÷vrͺ}²bkbØ_ ‡ñb »'o'ÝuÏuîöÛ‹Ÿnw>ÿ½c×Pñ.=ÿ|ü^—1€¿~ñgffŠêÿýïß1M=Ÿÿ|ÝÅõÿ·ÿvùê?ÅÿÂ¾à˜¦^õ'„X-Ôûoëñ!aßÈÖhö7Š:Á÷„+iqÀþÝ=>‘>òÕ5>7ýuû¯åw•râÏ;nØÿÅ_\–øÂ@ÓÍz'ÝÖGiû™Ð û /Ë_ 0Ÿ|@1ì?r µ,ñ_8r@1ìô[U8›Ö@ü}Ë û /KüÓ§O(þ¶›LÖþ\쳋{¾åü鈴Ýó,çx²Üÿÿ”2¿®æ·jëPÍt^ÿKy­ÛRþä¦?óóó‹™óóó¿uV’uÞîÉÃa:[ª˜ùëYlÔ‚ø½væäþ?zõª’Àþ“°èÿaY à.¿ŒY©>§#¶&VøsSBÖ"¶&&–Aéc8qb7yà·Ê¼BIIIIIIIIIIIIIIIIIIIIIIIIIIIIIé]Uí„^>Üþxƒß¦?ø—².ÕÀ×}}}V¹†.õŒ¿\òjˆÇ¬äþß–c Þû¾=Gê¶ï£ZÆãu*d[E.W¾UßÒB‘³3ÁärÄÒ4ØF ßßßãÇ`p9ññ7nÄ©S§@)õ:uÊ ƒEF•Ä‚˜µËÎzm]iÏóñë,Ö?gÁ,XÅF^ÚqÛÏ~®Ã/åM÷51p4¶÷ZF÷#€q¬Bp[SSSxî¹çÐÚÚŠÖÖVQγèÞyçø¯w|žÌ‰ìsÀד9DbxÑ×Bˆu>Æÿ5è«‘‰¬@kò’ˆÅá¾ü¸ ¶ƒ ú÷t³,µòpR¯¾±,¥Ô×®g­‰X†Á6³á:Ž’Y‚C‡aÏž=€ oö÷÷£µµ{öìYÒ68tè2™ :íeöõõ‰X °|Àvÿ­+Œ¹˜†¯„«³³Sd›€ÑÑQLNNŠìÓ²ø°Wfi~Þr¹ cŠ”ÇÿÏÞÛ‡9QÞûÿ切U'@)õi™ìꡨß› RÄ#°dሞªß’ô§íUK²¬¶ýzº&nû;êù¶kâ¶^§ÕŸKÚþì)zLð[±‚6ˆS&ëÍ&,ù€œ!@t|Ñ#æ£j½Z;|D™1yø)LöØ‘H&1ü~ .K;ÓõjñL@ã;£â^ˆ¿»îwpØB¸¯í>XÎõªËjG«uüó£V¼çÎBwjR†e¿«[¯Üøê±Í7À˜÷Ð.ÕQ½ =bsõó)¥`Ðk/oÀ²víZÕ€ÅÚáÓ­G¯ÃZs-¥°,ç8¬•$„ ?_èü=€$å½¼ó¹]|¶ùõm­$a»²bñ7oÞŒE‹©B~ãü––X­VÄbôá‡ÄóxÈ}Þh AY´hFFFF˜s¦rÂ}Ñ8€W€Àç£×;Etž%×aÎj~ŽKñV@ÉvŠÄwú8"Üou~WHð÷÷ëÖËÆIý[æõJE²RÏ u9ÍóåÈÈæ,™ƒƒ®Ü9Ÿùd^hi¾è &ï`&ñýqÎiâĉ˜³dzVô4,>–æ–QÊg‘mÔ:~6w¿9¦<ë?Ö°øÍ£ÔüƒÜóÏSýzÅÌžJFÙÿÇ®.x 8–.º÷"ÀD¾q‘þ¼ ëÕ@ˆMŸf̘¡šðY­VX}{÷îÕ='Ðpéz59þ”ò N@Œ‚(÷Ýw,^Eø¯¹ì«mt½–?‰Àãñ@’$|ï{ßÜn"üwäĸÚ6¢zµCN¦éêïI¾Øãªu”Â8UpîpX`u¦T€z"I’ÅKË®dRmW¡äÚ\jkHhŒFeAÐÑÑ¡Këè註 €$I.ÆÉRFŒûÛ…º›Ð¶¨ Ëo—þ°övYên I’ÅÇÍ—Ý¿ Â{»þaÇ{»“˜|®¾ñwÜ5GžüµA\ó½ÿšï8ên I’Åé‹ÉA—ow—.ÍÛÝUwI’,ÝÝÝrOOéñ_Kí7 ú»Ðµ´˜È»š¶ÏR·S¯ï/Æo;FcRóSi>èzfå3à×"f¦U•Ä¢Ë5ë; Y{h9¨×úÎ Mô$bP;÷ÅÒ21.ß§?‘Lb÷¸òâçöýÑò{ÿÙ1nnôb4 pŸ ï$9C€ï07‡e0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒQ%˜ À}±´L;ûUx#ø´—³Ð¾,VîÏÊ1Pïò5«þ8Ž“©ðŸŠ¨ Ÿ¦zsŠVüŸÛt&£•‹ã8™ ÿµâc|­9E+þm;…˜hL…ÿZñ?˜™P´âÿѶ£B;É›Œšç}0÷{4ƒ€Bë&† ê$“îé§ŸÆ-·Ü¢þ€;î¸Ã²k×.™NÇRœNðtÙu¢ø^ûå?Ð+Þy´’$Y&ùr ©øŸŒ´7ÀÛðX7ŽèL‡ N;}±šœWThKÿßpà $ŸŠi‰¹ZÒ 7Ü«eÛ4VLm9Æq:3€ZA…¨Û·o‡ÇãÉWR1 Õ,vïÞ­3èëëC&“A$)¯>±XB f0ð8âÍ)ï;EóùQ&ë—!H‰+BÐpX„×+ Õw*Íf[Õ0ÚQ¡ãñV]ø`p2ºÿk9ãÅ$>¸Ö®.sæuWª&–|C7M Ê-¿Y§j*ü¦Æ+t¤/툠ÆmÔª>@L¨# SÉ´vTàzÆ??j8@’¨ €CYvnÕñ‹`¼þÒóU`§ Åo–‹_û/Wî/k%‰œƒ§ ý)tZ=ßÎÎ¥K[ª‡Ñ`Ñ¢EÂæÍ›U¡?…NkE”¡¡¡¢Ó…âSN¹¦ñ¾bÕÐPáI4£`©4ŠØßé#õJH$ˆxŸ ý)tÚ,|"Q|º8Ž“!–N ‰@þsçz9®%auºk]œÌjgþ!W̾~³!/~&“Á?¸Cî_Ó_—øÒ•`R~d óâ¨Oü˜°É&Ïý ÌYòÍܤõ›u‰Þ9þ¿ãùåOðkæE¬õ)¿eaO^üD2‰®ušøéúÄÿÁO~€ž=ùåO¥tó¶$·Ô4¾I’,Ó£QyŸÛéÑ|£‘/PÍêd‘Б&‚ÿŽ´5/ý´# ÷˜* úž­åÒã,ä™ Æzà+PÓU™˜¼»RùA @xåÿº"Û¨PoöüC ~úúú3gÎ{ß4ÛFÅÇ¡IùE÷ëUÐT{.¤=­qùé;è¢E‹6y6i·QËóP’$K{Œ“µ†„Z.süˆ]X«p¦ñ©!áB_þ3§qdøzPHì_®¹b¥ûwttèÞƒëF!±¿ F?²ºPHìïí² Õ_Pìï½Ý “ÛRÍ)$ö¿æ;<õdýãû{»»à‹j•¬.—ËTìßÑÑ~ƒ1X%Ô—3š{-ßù»Ø¶ŒñËÉÏh …–/uívK1  c™Ë‰U(åæƒã8™¶RÓÓR®íGÕ®ÓœïõõÄ•‘}gãªÛmã£â-q·gTеR÷ wnz|Î@ :>ú©ÿ^Î`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 F3Õ€ Àó1+Û§µÌÕŽ^òiãÓ¾ï9Ž“°uëƒèè¸[·>ˆX,£ë Ž@Dý¢H„gé4§ûO;]pÁÏmÅbÝ%‰ÿ°mÛ6,X°Û¶mC4Õŧß÷îÝ‹¤"<§#¿Ñÿê¨ÉV"TX°`n;…˜hüÿ<þ¶Þv:ž ÿŸ2ˆÿ©ø`7€—”õÞ±èÿSñÂçžxP¶õÔ²ÛŠ P5FT¼Ö ´«5 „ïΟWPø¯Q€[n¹EþS#€öövyÏž=º´ˆ @Äg¾XZºì’ˆ¥8´ÇN€v?$ÂåI¾òÏí>ÏmçBݶͶÛåõ@Lˆy&µ‚Šþ©W+¾½á†òޱR;Bš-§]Vka&@„™1ŽÃ-50 ×2­XtþüùE×Y¾|¹næýû÷cddýýýªxµd²°À aMQ½£6"àR†¡Œ%‰Rà‰‰@¸ä¾ºjùÃá\gS¯·ø±ãt¦àv“ºFɱ!ŠoÁç;x¼Úm•ßnÏ «™L&Õ­fˆ¢¨«ÿT*¥ þ©ø¿Üø/ÅÔy_vv]gÇ]sòF¼ý¥çñרóÚí¶Fƒ§hÅÂײÎ×-€GÙÅ ð– ü Àƒb"0šðX -?ïDÜÀÙÛU3€³·âÍïÄÙÛÕå& 'þ?óº+qîuAh·UÆè´ü×’¢ñ þ¿à¿–PŒ×_z3¾|=vÄ-å`À_£¾²ž‹›mÀBï/σœƒFÉË;IªðŸšçÓí< Ä•g€BE~CCC˜5kVžÈÏãñ¨Âmšv>ÝÎÐÐPÙ(’b€É-@ʺUå=§1€ÑÎW·#œ/UVüxÔ"¡- šŸl\ÊÐø8Óùt;‰à•^ÿy¢+äI‰õÈ,~Ý!L…uËg–S&í:å _F‹?õíEh©]ë’:Ñ?„–ÚáhÛŠþ:ÆÏ$¦K~Ý¡<Á/)?ÀãPÝâ‹^‚_¬Wê–€ŸCðׯü'W äTð‹ðôß$>ñ‹u‹¯=þºÖéÍ hýGÒõ«ÿjÛŠ úŽR~ B²6õ_(OÙ VŸþF4=Å>7™¯¤×§-" ‹ i«îž¬šD­5m÷¡Ï‚fi…ÿ5…¾‹˜QHð_CŠ=ÿü×”"å/(ø¯!ÅÊ_Hð_oh[Ä$Ÿ^äOÛ<&ù.,Ø.Q+¨ €vÞB_ [‚­°:Ë{ƨ3±¿˜h€ø^ÁLìofU7ÌÄþ ÿSÌÄþÉÆU¿©Ø_|ü½-¥«ÇLì¿ñå} s±¿8Ô¸ÀLì?<<ܰøÅhæwz^sËý72V±e«5 ­Æø Ò|Pñ<þ ¬Ö…¢(B;ÏH6»]]!D"uùlv œÎ»+2à8N–\ùÄa$‡.ÁºžÉ:=p']6$’I´L? ì;†Ýã.u½Ü: ë”ù]’îs*ær&Ÿb<®šˆñ8Is:s¿§ ÀÁœ€0U€€œ1ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0Œú0jw-&ϧPÙ>Íef>­ûžvìzî¹çÔÆo¿}b±Œ. ¢~j Š·!Ö ‹ m‹¦™Õ•Ù:ßúÖ·Uz™jã[­VÕ ™LâÀ£ÆÿÖ·¾U4>lxqn¼v`nŸ6 OýõSƒ€—n» ïF–.´-šVÐ@élï}Ð\Ø_Lì¯ÅTøŒ*þ—$É2cÆ ¹¯¯OÿŒŒÀ(þ7cÞÆ"ûôÚIgx::í(_íèGÚ÷t”=:ϸN(QGÆÈ(¡D0[ž‘¢íp?00€ úqAG »»®V ßÝÝÝEË0Zìb#/iÀÖÛnÃrŽÃÀÀ\pÛm8öD.ÕŽ4®›jÓ(2êôÈÈúúúÐÛÛk:³V˜Z3‘IL#ðŠêðÉ5Â+*ôDìOM´ý ;Gï|hV~*ä'¿sâN«5÷[‰Ð?ŸSMDñ-u§3ãH‰¥Ä7Š}©Ø!ªéuO…þV«‘HD­­à¿”Q³ÌâS!?ìÐüŽÍ¢þ>ôr ¯¿ô<>ïâ¯QŸj é\+Œ.„™È+¢9zµ5AG€Ȩã Ö§1ø“fù¯—pŒV~l>P§œÛÄ©ý;N)ËOXò ò¤N½ðš~;Phºr×gñK_žã8Y{ Ïørq ŠwÍщü½†v[¥Æo– _ŽÇrŽC—bâ8lÿªàŸŠÿË?44¤Î›5kVÑu6oÞ¬=e³YŒŒŒ¨‚*þ/7¾î2ŠwçLA ³Î—RïKœ/¥ŠÿËŸÐh‰è(Ë…pú8\¤þý1¢UðOÅÿåRè¼á×2}Žä×’©{´mT¿k]Ò4~׺¤,Lžê¿Ùåü¢i|Á/ÊT„ÿiŽÿY©ÿBy²ú¢2ìs»1]1´ã8Nþ‚ X}es«-›þ§­8íHuð$ÒïU³~ÅhLùªZ¿Bšýüõ™/¿Éö&ùH^¨!=µí8·[UáÿB_ öÚyšÂó¼œÍf!&Ä·¬XÖ1IÅÿr˜Ä£âÉ!A X¼¸§.ŸÍn¥S(Û€Šÿ½á|Ö…¸æ$ÿ_sò6ým¨`ü°×_,kNžÝã.@öo[°øs³F50mÿŸkgމtr|® :81ˆðo‚êòîn²ÞA²¨xP$ÓãK-9ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0ŒJøD‹– Fõ”Ó©L+ª×þ®„J:w×#~9âUÔoø] :q‚¦ƒ}!€šcÒ9Ÿã8ÕÀ(þ§ÿ£Òñh‡øÃÁ£PVGøFwl¬4_===þ??ÄRzzzÔ‘¸´¿Ë_jùÍâ¹ñå´ÿ8/þ'¦þ+˜TŠáØovù?ëñ+xUŠQÖìò3šG¥û^+îÿkÔ§aÍ´T+®Ð²víZÕl…°D"ôõõ©óê_#î)&!ƒ@=ãkÅýÙlV«UýOçÕ3¾VÜÏùˆ ýOçÕ3¾VÜïúŸÎ+%~ÉX!Ÿ Xp¦_Öß? ͯ5VÈò K§˜ßt~âÖËßìøŸéúWà8NÎÝ:±!c»zÅ»E8£DqJÐt{¶a|Úá8N¦íÍ:³ñVX䃞ƒt^­óÁó¼ó;!&Èàà ÄÕt³´ZŠ yž—W¬X¡>ï¶´´`Íš5jºYZ­ãgüÕX€ðjºYZ­ã§c‘Tž7í`sQÓÍÒj?Ö‡øø{aÙùp :Õt³´ZÇ÷?›ÆÆ—÷–ÌžŽÀM65Ý,­æõÿ”âÙÉÂ,l_ ¨éfiµŽÿøãcxxSL” IDAT0mÚ4,[¶LM7K«EüZ´‹T2úz¡í”›Ÿj®ƒ•ĪÔüµªÝ'õ2¨•øßˆQð?¥.ofm¶lv‹Á` ߀@;­]Þ˜VjÝ7;~½aï ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`ÔöžÁ`¥’ÎAÍîðVËø•ˆS+y°BèÅÏTHxË-·¨£½æÂB g0ÕŽN?Ú6ë¹N9"ÿÑbšQMG¼j ꑟjc¨ÏùP†H«Ùåÿ¬Ç¯‡1@9׿f—ŸÑšÝšÅgñ›¿dèý8kb^Õñ3‹Ïâ¦ã+4Rl\jüfç‰Áh$Í>Þëqòø/™=_Þ‡wÍÉ‹?ï¡]jºÑ  ÚøTà/Ìr@JÀé‹åÅ]jºÑ  ÚøTà/DQDwww^üL›6 ÃÃÃy¥Æ7b|/)÷½¥mM•Š–kqm®4F­ÊÉG±e«i.§½¼^å¬åÃõ6 hvüb°öOƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0Æ>ìC<ƒÁ`|Æ©fd¥rÖË¿9ºT-ù¤æ›Á`0Æ2ÍîÍâ³øÍŒÏ`0 㳃™9›ÍÂjµªÿµBbžçecº‘r„Ç,>‹Ïâ7/>ƒñY¤c)>ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0ŒO5¥¡ž jS»ZRѨŽÍŠßìr³<4?~#FÝ©$v#÷¿¶sf6›€¼™Ÿ†|ðªq'?TÂFXbÞR–~ÀÕ–sœnÙbÛªžçåžž´´´è挌 ¿¿¿¡ìžž8NÝüýû÷cÕªUUçƒçy9ËÀæâó¶5„×ͺñ¯]m²-¿$éÒ/UÖ¹¾ÊJ<ÏË+V¬@KK ¾ðöÓȵäÝi_­t“烊ÿmëWóqª}EÍbd2‹Í¥š¨÷xž—ø‡qÆ·WëWØÛ¥[®4úz¤ÿkëý‚ŽžºÄ+”‡ÿñofO‡ð‚WÍÃÆ9kqç6$~½Î­ø´ñþªó¡íÜ{À?ŒÓ¢E—FÅÿâ/ȵ…cÐÄy¾à‚ Lê½@ãöÿ’“ p“͇% ËC=Ï*þí\6mæÎ øý=÷`Îà 08X“<C+À漤°¤ °é´2JUÕë§ÚѸê•W:¢e½ã4£lÍÊ í$KqpØG3sæLìÝ»ƒƒƒcVX^ gzg@ ïÇÍUçIÒNœé¡ŠF>i†ô¼5áÐùcmŸiG©D"òüùók²ÝO‚§F_´C68}1¬Î²ñ|•»/–V×Ñt†®Ëµ˜^+º»»100—^éûO¹ñϘÁáôëùïA®æê¿8Ž“³Y Vk}ë¢(#ó@Åÿ_GfP€CJÚ”šÖ±p€÷‹ŒVvJµÏÀq©q£`³iö1Èâ7öü;ºRR ·ŒiôYœ[]ü-ö~SJ\­; šä!à’ &QTÄZ@Å„šµª‡Jhflã«_Ä»³?‡É/ÿ ïÒæ=´ “_þžz²³!ï‚ͬ‹l6‹ãÁƒ˜ø’:mölx5 ÿƒÇ»ÝŽîîîªóRH”§M«å»3ë¸y©¥ÇqrPjÅ‹ˆ]²XD]ÚóG%ì’ø¸”ún­ÄR ƒ«1 ¨×þ(Åx´YÇÇqr6NÿŠð_E;ßê,,ÇÃá8„Db |¾ÊóWi”zo©U¼¼åj¼?-Z„–––¼ï ÇÉ###ؼysYqÉûÒX­ óÎ_³ùÍ$¸3 ß\kA#œOZñ·ÙuÓæ–دڃ®+V ôÆ$ƒíHûR°m8Ih…]f þß,øØáÀUwß}n7>v8p± àQÄ>ëE¾TJwH’dqúb´Ì2  ÂMËOužçÕcÞãñ ‰ ¯¯O×(#­ð_H§/† ËÁ!@˜å€8”@ä»x4Î+?çKÉÔ`´òKÓ6àÌk®ÅM_Þ‡)³[qèåžE\ÔŠyí³/eqj÷‹ 3Ð ÿ ìiÛl…]0ÞœH`K°‰„ _,¿üÚý_Q~m©ð6„Bz#€z‰Àm©ðõêv¬\¹GoÐ(ñ¹ 2þä™JgPÇò«ÂÿŸÁÍß™¨7h`ù©ðÂ!QoЀ|Pá?Dцjÿ®¦]\’$ ·òñû΂eê8œ;U#ò}¨ö¿òCP£-îûX7m4 žÄ„û>®ùµ©££tF¤KyÖ4‚Nb€Ë/¿ÛN^ŽK†766 ƒÁ`0 ƒÁ`0 ƒÁ`ŒBÙ’$Y¬>õÃ)ë„_¯Ÿ’$Y®ºûn€êrïS:Û—S;Ò@„†•äW’$Koo¯ ä\ñ7oÞ\V^ªA’$‹Ï·P€[n Þ~{yCâÏž}º»»ï&#^?ùdÉ$°ysmœ—µ"¦Nùe ò³uÕ$I²ÄæN‘'8<ˆJW@›^“ŒæÎí âþaßøë†Æ§7¨à%š®ïùžÏ•Ð:ø÷lV«UM£¡ÞùHBê8pý…å’$Y–sœì—$\ àWðKʪÎüR öC“PÖK³þ+d~Mê&“ÉXúûûå˜ß púb ×"‚n ™LƲjÕªšåC{Þð>ú®Œ7Sò–=Ca»< 'þħ©ùª¬DåÓŒëp­ë½Ò<K+ÊC-“8FÛ™LƲlÙ2ù÷÷ܸêî»ñêƒâ¬D‚Ô Úé”ó’ëÛ×x´{9]IæÑiU‰ÂëÇ(5£l÷ÓP'c)f½ò¢»‚çy¹§§V«µ$ñ³إĕ$ÉÂE­ò{Þ,\ß=à$"a"þ??jÕ]cÜn7¢ÑhÕû®Võ1š…ÆÙÕÙ Xà”unWJ5eä8NîëëÃÈÈHÅBf ˜m{´ÑO?MðMfMjNgª®ñ-ZNc¾xá…êÒ#‘H]ãïqÇfäŽoW.TX|«*±£²Æ<‹ µ†\@ýÛM¨ @@ñ Ô;ͬ‡fïƒwgNý=ùå¿È wÜ5§¢ø•ŽÐ]Ϻ(ô\KçÄE‰×çS8gן¬*º½d2Y4½¨ ΙÞq8>‰3 iï¹³8>YSCœfoµÈK- ØæhDÿ»dò¼ûüQ2´û§ty8vŒ4S:])õÚ¥6ëX…€./ùp+ß1»¼£  ŽC°ÿ_!]ª{7htT¶7ôööêFû®6ÔpȽûÑo‘H¤hžŠ!Љ²æ7“àNr>kßyvÜ5çc¤Yãsf:Ê‹¦÷i¥ÏÁà"i7’ßiÍ9UOó=mÞ|©|© ôƒ˜ª¿ƒ­­$ÍdÝRÚóµÓô›Ú¢E‹Ôß”ÞÞ^ÓõQþh:h€Ò÷ÄK+¿cpÛlj{qÝrËÏ ß ëwo7Lžïè›îŽ»æà|“õ²ÿci –K[è£û;… Ë¦öÉ1®[˼m0ÜxÔi[ÄøÊˆóTøOP§ÍöíÛͧëX~*ü§¿¨Ó&ͧëQ~¢‰hÑéZÃó¼üÈ#`ÕªUºï…æ—ƒ$Iî>N–\ïâœ+'ãÃ×ÈÉ%1ÿÎ1°Lù ˆ„¦q1N–\Î9x–ºþ‡¯½ .V›þ/4Ÿ3fÌà¹çžô÷÷«iµˆ1Züö'#Æ!ol»›;EŽؽ{7ŒÛk–7¦ÿƒÁ`0 ƒÁ`0 ƒÁ`0¥R¶´µµaµ§]Ž]XÙƒD¼£B-„1mmmxÖžë ²ÏíÆMÉdÁ˜ÅH$“¨¦#L[[,X N{<lÛ¶­¢¼)¥®ÚÚÚpÕ¬œ÷-·ñêP¤®õ‰Äüç~S¾ûî´µ=àD¥›TÑŠþ;å—!oàÐyc¾ @[[^ó¼ ®wÕ¾ˆ÷—•žçåt,›K¿~3ÄÏÓ­ŸÉd,6_¶ø»¢<³òOš4Éô:|øðáší³¸û/èÀåǶªe¿ £ˆ÷Ömÿ:OVóGˆ/-˜žçåƒ~2ZIJä+غÙ]ò> ç€Y~þùX°m^}ðAÀ¶ €ÁÁšçAÛžóæ:aM¸/›¡Ž¼;áþ½pE.BŒãȈìv$©.qxž—ûúú˜wÞ£h;‹Ö¡­^ymVœfÇlv^¬V«ÚYߌf °+‰kµZ\u.ðÂù΃çµÿFl®5¯n´º‘¯bp' ™Lâ¿úûåWߑΟ™ˆO:ÿ­‹¸Ù+ 08¨›_Kš)º/”èT R©Òét] ŒâwJç_HùÁºÖA£ëØ,~ç_:!Lâ½V#­QÕÑÓgÿ÷¶Ý–·ü÷ÿó?!Š"¢ÝÝEQá|±t]:b¯X±‚ ‹å¥ @ź<ñ?I]üÓ¶ÊK{ãÇä=¨{°»nñµ”4 |U¡}æà8N¾ä’µy˸Ý?#¢BE¤ènTè(•ÕŒvªÍC¡Q.~ø ðpþP#]uŠAÅÿ7EÍ/PÚ3[!$I²D¹¨Œ÷ݪ€p f¸OºeE·Hê"©øˆVßéVÛŸDø7A]ÞÀ}Âg `„ŠÿEªøß¸¸Ô Aþ¢˜n|ìȉßÏJ$0]cèC·gM•.ˆ7î*ðÒ222‚ßþö··ñÜsÏá†n¨ÜðJÂ’oä-Óþɤæ‹hg,ˆÇƒp:}5‰OÍM´>|CCC·¡ŒZ“øÔèEˇNXY©M½ {\o¢=V;#0 ':Ô"…%h͹êÇq²QèO‰¥ˆÈ— }뙇fÔƒzmkâ>ÐÞ¨Ð_åIb0ï¡]ùi%l7t!‘ˆ@L±Té¦{@}뢳³ƒƒæÏµS_Âig8ŸÂûÿ¯äU;ëÖás™ $“w™r9Ó;Ný}*L0ïyÉûêùQ+ÀÕFˆÑˆ:.õ™¾Vy©Æ€ã8ùù£$Tè¯IÅóG%<TÊ3ÿ5¶%k[-~½÷G1!y³®=’$Yü1N–:%x”O!ˆDË âCA½n&S°p¡Áà'*©6ºªGõL&“7OkPnžŒB-G½öü!©{fã8NŽÇƒØó‡êÍSjVøÿi€Žˆns+fƒÊó®]‘ŽrHGÉqfsKÀ7Ï@×+zc ’¯¶ƒSÄ×tÝt´ö"pŽãä`k+¨âþ}n7>v8p± àQĆP(g bp³RŽõJ›„/•’é7³ò/Z´@®Mtdd›7oÖÌŸ?---A&“QwºîæÍ›ëR~£ÙcÐeƒà Ìr@J c’î¶ÙTIÚ$M§e)ØZ°üÒ´ €3¯¹pj÷‹à†o$F¤ipów&bÊìVz9…g_šNž;”4à†o¬ÏþW ÿ©¸K°•bŽw'‡døbi5=è²Áá Ù †™¾XÚtÿ—Œ òÛþ°:Ù•%RÄÿ4í’€·v"pdQin[½šÿ#[È»®g!é‡$ÆÁÕá¹ ò£ßT4ŠÎiÚ?¹£¦å¿ù‡äÛíúŸ!ÂÿcsIÚ;7ÿðXÿ£/5¤ü _®-$,)÷&Åû¦9‚‘ºåÅívçÚ•QƒJšFë{ddTìOç=òÈ#ªP-øðµw‘ÿ9˜ Ä>ƤÝwfr^Þòoô(í¾±nœsådX¦Ž^Ëm§Ö´µµáá‡V§Ÿ{î9Üyç5éVjÿ·¡Õ¹XÙ¸„Y+uïÿ¦ÿøã«Ó»wïÆ²eËÖÿ‹Á`0 ƒÁ`0 ƒÁ`0ŒÑ(ÛÀápÈCaÄ¡œ>òU.è²ø8äD"‘7bLú)?@JÀˆ—-dp8òÓ^/@:ö’˜n7<Ä /æhÄR• ¤‡|ûí·ç}øVF,;/Zxž—çýƒsf’ÎÌÀÒ¼ºr8²Ç®½ <ý„@:È߇ã^Óú÷û×víMÿ¨HHÒÖÖ†S§n /÷ÈÈ|´µ¥«ŸkEÿ…p8rûc/âµNc‚o*Àͽ`#’“—ÀáÈ?þj Íßvü ô’úŸ°äxëŠká¨rÿ—µ§bBT?ô»m6Øq¨°ü<ÏË+V¬PG´€ÞÞ^Ýq"I’Å—æd\ôY­Ø»w¯n---¤ó_:¿#Vx Ñ3׬Y£Û>Çq2é–X€·dÅÀ¶mÛWšä_E5ýRe½%`£òÙÏ/IT12Ã#´™$aÏcæÌ™Xµf “ôG1]®Ö¼ÙIö÷{.´Áétbñâ~5}Sýýýy˃Šú¼™ø¼’rH]Æ(¨nǬI´«âïŽ=ħ™ ¯µÕ~|¥Æ°2²E®Ãê²®@¼š§rÿ€øW‹çÔ›zÓåjɦM›Ôß‹/Æä[záº)·oýß³›.§eY’Xbü"ô:Ê=<u¸Z¥‚àÓ±‰Èh6×Ì›7sz{ÁAÀÎ;M—«ÆÎðÇÉ÷^t‡,˜ä»‡ƒG±ò""À®•ø¼qŒÐÎÁÇÉ´ÓÙhbÊFåµuÒ¬ýЬ¼L›6 ½½½£šÆDˆç` F m4u5®ÿ}@"q1âqÉ4.—xxº2'÷l¡í/I’¥¿¿¿ªŽáµ¤—:ZæœÁAø1s”ë_5”Z÷1?¹¾‹ ;ñlÁ2RñAOO0üx<ÝhÁÕäÉf³!­tòM¥RhmmUGdO§MܧʤØ~£‚Š0Uéa|°~&ZófšP´eôFµ2*õ¥Õgû|ë/ý³¿‰F@yæc… Ï¶4–Ú¼ÔÚ°¡Ùñ À}Ø‘{OÐÖ¿(í°à´X^8Ž“ƒÁ-ðùÊiÛ8ûì{Õt»ÝŽpø¼úê4\uÕ°nÝk¯]¯^;#ßœºJÄN[²Y,´Ze€ˆ;Så®+­wÙ°ää€wå¿_ÑeþÚÆš™ë_+þ—¤Cšå¦È’t¨âQ&bV@rfNÐd·Û!Ä .oN¸ÛEµþW&¿†ÐùCÓ çxt-ÚvJØ+(ʽÒpÏÜ㯊¿%I²XS©’M8Ž“©@ÈËQìv;ZZZÀq\Þ¨÷GUëàÎ;ï,[hIãÿ0»?²’s`Â’oàÒ7^ÔÅy‰ÐbêCßÑ­{óç>Ê탕ð[‚È,,Ï€ã8YñSAt÷U›Í†I“&\Ÿ.»nݺŠLŒõï¶Ù<ã 5Ýn·ãùi@~œ¾D¿²#g àÚsÞù(‹«hû¡BD*4ÌJ­#"¢Æ©5 IDAT/«—®Ž®”À­®øK+î§y8õè·qæ¿ yˆ‘<{®6fõÐrׯ´âÿfí*þ§â~ÿ’ ÿ†·oüW_Iûê×ñÔ“u¶Qu‘J¥°bÅ ¬Y³F×®ýÄE‰×qή?ãCçS8gןñþû«tm€«œVâÙšˆ.8Ž“ßsë…þ*Qà=wï¹³ª¯ÚXõ¬ãrÞ y J­ð芈y„øpýÑŠû³ï!þ¢ ãW'V·C°Nö©ùóq)õ¾ÛÛÛ+÷ôô ½½e·Q4³ÆÂõ "ø°Iì˜7U4®Ûí†Ï¥Ï!p»ÝˆFË)·ÑuPm<*Ô·Z­:Èd2¨¤­‡n“~k y:ÐÓ¶þ­$Ošï•ˆ {þåIôÿèÿé×Ðó/OÊý?ýöü!‰žy²œÍTE¡6ŽãäàNrýõ͵b’k+®šs^Ýõ!Ç:´8yå­m©ŒïCÕžs´//þ×ûIú«ía º®X\A¼88_ øæH¾Ú;ÄššPñÿÍ‚€øî¾ûÜn|¡‹¸€¼#Š8KóýÝhp³ àfAPM¨qw¡òÅÿa?¨çTKK‹ºl$Áüùó‘Éd*>þ‹•ŸŠù‡€¨/ Ëo7)¿8” &Ø z£e=!gÀùR0šhËoÿk„ý€g_šŽ›°Sf·âöÙ'ñK玛¿3Ͼ46ÔÔ€~‡q8,° €/¦ˆÿç(¦w'ÐúÀi‚ ë9ÕÀlÿ—„"þß2¼×§a鲉rÈJΛ¼ô°zu;V®$¢ÿÈ–=Døm#ì^MMöÔ×@ÿoß¾]?? KQÙíp@~z Xÿó#¸ù;ä{ ŽÍÕ•ýÏÉ7κ›(âÿpÈàꙆ%lKÊ^Ž|ƒÎK¯!n·[6š.Ð<Ðú0M¯í}&“ÉXz{{e«Õ úL›Éd°jÕ*d³YÕ|“._îó…äʵs»ð‹ž$b~|œk2Ù¢¶Ý×2uäƒ'qîÂ/âƒ-&ùpIàj`„þGÏ<ó FFFpà 7 Ïõ·Þz+`Òÿ‰çy™~—Á²eË ¶KÓ¾"Ã!Ò®ÙÏoÃv8r¬ýM€ÕIîÇ—„í ê¸ÕI¾Në:Tu?Úÿ Æ5×\X»v-î¿ÿ~Ü{o~ÿ;ƒÁ`0 ƒÁ`0 ƒÁ`0šAÉÚNKÖŸ. ‘ÛÚÚL?ö‹Cäã´ö#m¹1¯ºûn}L¥K¡˜Z´£ &’Iè{•Ÿãè¹ôÃx)yÄï//¦×Æ÷ùêÒÞ~{yÑø»ö&4Û.F”;“ÉXùÙrçÄ,7J´ÌVE%tÙØÜ)˜ Y7*YHÛä6>|¸$·çJÄÆôÞdƒÿÙ4ð‚^øBGŸíííÅAÿÁ¾¤ž-¿½^QüJÏŸ3ƒ ÉGüB$’I8ìvÄRz'ÏórzÝ:Ø–.Å:ÿD]uâoiiÁܹs±Î?Qí µ4p»:;1§À(våBÏ%:½:xT1Ì87ŸÇêÐ_XaU„c@å÷Ú‘V‡,yqb>rÝT:¹Ö¬£ýoìÌ2òÚŒ:iFÌfä…çy™ ØG£33ƒÊHó"À a~¹£*ÒQ'0¿f8âqÒI*‘¸Ç;ˆÇÏÓͧÛr:98îÜìz‰ÄÅp>ûßøåÏÆî,N…_ÇÍÕ= hÅ-åRKAº$I–ÿêï—ÿÆóð{ìx$’”_1tû ðGðû{îÁY‰1PŒUÔ=ö» Ô½_óDü/8’@œ×ͧp'÷ôô@’$H’­TÐ($b£Âf³a°*¶/„*~× 1ø…Aõœ«µøšRª @=â“w´Asu`f`Ìc¥ï#bB„(’ÎÜQåÙK°áPî–äpX°PyöwÛlÅÂ&±˜{þÄî—v#^Æ3 -5–¢yéééщ‚[ZZЭäE3ZvÍžÿñmAÞû9°äù¯·×4¾qî=®ñyËlÂ!X4}½­;“j&v¢ä˜Šh@Nüïñ„‰tá£îÇ‹ŠšŠÿµ¢­üâ;þPDúå ÿȉÿ{e ¾yõF"þŸ=]7æ³/MÇ—^ܘ·­;Ÿ\RvüByRDýà¸)82ãNü?ñõ·ÕeÌ ÓÊ2Uuú¥âÿP"„.Gì{=À^Ã~Öˆþ¡©ÿg$ɲã®9jÙ7®ý7\`ÕªUxdÃ#¸å/6Xÿ÷d³Y<õdgÅñ;K_¦QÇ£R÷ò¤I“¨`þõ¸™ïN | p>…ç|Qÿ€½ò0ˆƒð]Ÿ­É¾ â*î§ð³¼ |v8…· óJ=ëXk†kl¿,–€¼£Šý"º”¼tED$ ä¥6ãù'I’åz.—œÆx pó4ëWfî ÃÊ[‘ÍfáãRºú {èîî®èx­~ñ.pY¸ºc¾qJ³¯ÿÇÉî~‰”µ@ì£È7H¢yF£rOOŽ;†žžô÷÷šG³ý_MŒvo1Ëwµu>þ|;v <Ï«‚ÇžçGm0»_I’d‰D"jžîöt &GK{–bÖ¶m°&çÀæÍ›+>v¿´‘ÈopNègð|;çŸ+ÙLEðÕâü³+ßP¨øŸpÑÜÍ™šÚÕyÔ4€æµVÆoª˜_“öŽ’Ï³ æû7kAèzå@G³¦â*ò×bö\ŸÉdTÓš÷Z•ŸŠùµoŸ…ú•äŠoÓ¬W:§v“F*þ§†Î-CMÓÕyÔ4€æ½fû_óëš‚Oò' /Y&›f½:CMñÈ* Ë&V/F·Aö,$ç×êÕí9ñÿXC1 “n‡›ŒJ_ƒòã" ^ÿó#9ñÿXC1€ÒèåìÛ’õ3#(uت7‚КþhÏãžž|ó®;ðØC⾇û‘œ»PýîN¿›–c|Èqœ|ü¾³pîÔ/ªóäƒ'ñákïâLƉÕç º’´ûbõ9žT—³L‡î•¤Ý÷„’F×;wan{ǯ< î¾Ê¯GÚþG3fÌÐ¥õ÷“A( õ?¢÷“­[·Ž'ººCÓ8o¿=vˆåÞe¨1b[›ù³Û4e{Õø’ûi{`ѶªZôÿc0 ƒÁ`0 ƒÁ`0 £Œj@´ÓÊèÆ³¼d·ä>Àä#ldTf Y›V4æïï¹pK8ŒW|dXó±{=€H2 ¿"\ ŽÚø^nIš*vüå/© 1µÁGFFN§©à*þ êçF=]ˆDº nöçÖ¹ç÷ˆ²Þ*Ùl{¥ÒŒr¿ø¹!\{ã,Õ€æC[v×Nò1ç7/œV—ùúÇĵìï¿¿ òËägë„(ÔLÀ˜VJ=8ŸýoÀžo^«æÁq¸[Ÿzá5àñÁœ$ëáw5ùDãÓ‘µï4IuïמW¢H:S‘n¨‚QFa>M÷ûOúSM<Ñô7@„²tbÙb°œã°VÓ©þWƒüµ‚ÿ·d`‰,Âj]ˆlv 6Z]Ú¥íöËçy™\ˬˆÀíj%mddÙl3gÎT—¿Zɳ–Z˜Pñ¿¤cÕ~\~ùåˆÇs#ݧáUMŒj@„¤„~8ôõ)Äsâ ¿ÃO:¦LÏ ÁvyK—.U—Y·n¶:ßGGü<œ-8àF[ wþ)Û-ùü+$$(v=ÒR‰ ÿG:üûYâ ‚Cc½ÿý,A5˜4iRÕ&<ÏËý’ú#KЪܮ³cãËû°D1A=—%_Eñ¸ýjL | <ŸºZ©u_Í9`~'y(¥Óg,ÅÉ{~ÒëÖ©ÝÀ.äò0<<ŒyóæéÒŒ¢ª5Èd2–ÁÁAyÅŠjgxX“hWÍÚc'D;€,6mÚ€\{{{ËŽËqœL;Òû®ŸP NÁçƒt´¯MG3Úy¥Ü‘+‘×fÕ ½ï.縆Ä,–]ùC2|é¹¼ˆäfWM^fΜY–`-ÀAgfbÅÂó<æ¼ì:ô¸óàt’ÿZÔg5'‡ã`×ùH$.F,–Á{–qTøpÈ)twwËÏ=÷n¸á†Š÷a­é¯d2Ä!û=vâÙ‚F»:;±>¬¿àM°J锤!«®¿“ü/}Ðé€ êÈy===Èf³¦Š ¡… bÃ+V`ddD­s:¨nÄ9*tïüK§©Ø_p:¢rß§â 5(E¨_.ÂT8H„öfù®wü¢ù šhòHÍÊÍVÌUç ÞpD}ö{=¹<ùëQ´Bù&ÆgÊ‘‘„B]j^ººB—­ÆmîÉ$qúÜ{Ð÷¸PQ7WŸ&JpúHçó=®ñª1xEàtØ,xŸ×­» ‡`Q®#›ÅCº ë¬Y I’,>ßBùxð Nˆp-ºðâ‹÷ãá‡âÎ;sõû=œÆ«]öãÕW¿«ÛÆÍ¿$#…/™=¾¹V(†%_Ó%I²,´Zå-Ù,Š_ÖÆ»€ûÕ><ö ôÿÛ¯ö!õPwÞIÄK„$ LU·‘¸îj80-S1(û¾¢Ž~-QQÿN%e?$‰ü&ósí;Z3€J‘$É墲ûŸû/=•@(‘«ÿ.GUüÏó<2™ }Ž}7Њý\]W›V nò“?¥L±4KÃmˉۣéÜ´à@ÌlªA¾n{¾”®üÒ´ à†oTÅûTñÿM_Þ‡g_šºŒ„ €õ»‰Im±¦Et]í¶ª!è"B~Rf2o¡/¥¦Q|±´:M¾‘YTãö´û¿Rº²¢©ýÆ®.ò#à­fó*+W’o«W·ëÒ°D°G5h4ÑDÔ´üôý·V#Ñßübð»þç†ï,iX`›«4š°”4-¿·‹´ú„ƒù¦ˆ5¥€Àßíp¢éÊëŸ!ⱇÜwgÞyTC9íîûÇïËMøÚ»8çÊɰL§üËOâƒïnRÛ}ÏýÙb]šeê8œƒÉª €vû•@¿¥ìÜIޱ¯|å+xýuòÞG…ý÷ÿö·¿5íûSŠð_‹V¨OãouspמI f´TØO×Y³ð9Ésb0žûV á¡þ_ Æ‘A öïß{ï½WmXµj3`0 ƒÁ`0 ƒÁ`0 FÓ(jÀó¼œ~Êq(¡ŠýW{Úaíð™.¯&ÇüN³°}5 !²”€ttK(bÿgívL¿ûnÓå÷¹ÉÇžõ b˜üý˜v:K$“u0C^¨ø”ŠL,XPpä‡tŠÁÒ¥KÁó<úûûKîG:8®Ò‰;üþuص7¡Šý¯šåQGÈ3rËmAo#ñûK0ïü˜3Ó@`©::1Z>]nš/Rö—Õy~ÿ:ˆ\ ñ2}Õ Äæ’޽4ëFÜrC㟣w^†¼CçDè@5è”õiÅòHG¯¸GvüŠÌ¼ÝƒJb†å=;³¸G§^x Ç{ü¸qÞ·¿éïªÇüNˆ oÊK"IÜŸHÀyà€éò~E@Ÿ¶ÛáH'ˆRèt´'ãü¾¾>¤ÓiUPrë­·¢¿¿V«Umº»»áVÎÃ[o½Uû¯X±6› ½½½2‹ בk9ÇÉ~ À¥`£ 8.IBLñ‹bB÷\’„å¿$a‰xEΉ‘\ù¦~§UéDu¤ûW@ŒVõ÷ã‘GÁÞ½{±fÍ<¢ù܈ÖÀ(Ì3‹«M§âÿ·§IrñâÅX±b&ßÒ‹U7ÙðfgZ'þ§íB&™LÆÒ¡|,õ[3ÀŸsi9ñþ4š?’°· §E ÎøöjmÞuBüËÅVèÍh<›ËÜÀ¬üÚàZ<í§á+p=ÒvŠ1 Mϳ¸fâøýçS~,^¼===p:X¼x1œOùUñ?ÅhPlÿ›åá ÿ¦åEQémƒß¿K®³#p“ ›6mRÅÿ™Ì}øEèu|»k–%_ÁV‹¢øEèu@!jqÐuýK2¹{4ÿIŠ@:66×2ìܹ;vì@oo/Ò±‰yâÿ•ÑCw›ÐQÛz{{Ñ××§v†÷ÅÒØãËÅ›‰Ï£=–ÆÀÀ/^¬v8¥£O•—çy¹³7ƒÐ#€céDïëÉãî— ¾\zG{ãÈsfËÅÿ’$Y|±´¬t@ËëÈR¯¼6ªNF‹©=¦]’dº¿+YŽHÙ¼üœ!/\Õåw:øÉO~R0¯T€=ÈA,3"r&t~¹eÓ’x˜v–LãÆãar×ùˆÐŸÎÏ•ˆÿ‰‹1Ũ†Šÿ‹=˜]ïÍ0æ«^‚ôL&c Ä!÷õõ©¦/×\s ¬V+ÎJ$0‡ ðäÝ'08ˆl6‹Ý»wÈtvvŽjJQ畬iñ,Ò± Dp´Foúå‚*b­„BÆ+Z:;;‘2tp¦÷ÁJÌWÔ¸†Ñî"þw €Xgb<® Þ"rW–/z/m<-FÁ}-Ñ>›¨ùPŒtÄõ“´.ă¥r'»m6„C¢NÐO;@“éügÿ Ë¦ ÿ©‘…Òi¼jC"ö ×¥Ky¸Ýn2S¼Ð³5ëTm¦t¥„ W~’\¬qkÅñ5â9ñ¿Ðˆ!"þ§âZŠVô¯ ä1Œ’QGº÷MÁai'8n..¹d-~ø Î>û^À‡‰qÕU¹ëÙwNÅÆqçÞyôë€ø€Ï·°b˜÷Ð.ì¸kæ=´KþÏž;¸Ë†šu´—]_Ûˆ]î|’¼·-´–o Ö—«ë‰¯ëGØ<2ãC™ñ!€ýšy—Wm ^³`¼œ:+äL"ð°ïõ@{Fw}ìÀC_|%r àÏÓ›[¦Tñ¿–´×‹¥á0þßDÏz½€Ü£nJ&±:¡\’ æ7“ÚÛ‰á+_ù ©ƒgž€ŠM —ur˜°äøÓO_Ã¥oÑ)ߺâZL}èZu‹þåJ$íä]gÖ,"À"=Ÿd]X‘ U,JMè3 ¼Qìv»Ú>@G„£ïîT4T® µ³÷=ÂÛx t ’gƒûéÓx@Ì_]oÃë=„ð+çÀ+*Ã1®ìú§ð*žOݺƒ®×Äu¹¿öAäí-ÃHïDZ¬ƒQ‹p3d6e˜2eŠÚ÷x?{'@‰ï‚X†›ýeðó3bŸ³V˜± ü>/‹HöP÷|0ý®i%Oè²?†*‹eY± °]æ<¨.*·¦"h}S‰[°±ö[SIè£$Âá°“Ëåò·¼ ‡Ú,þî#µÛ <ï¡ÒƒÚ£åùÊã?Ôø/óÌl}?ä}xŸ»/Ïǘïòñ×[ÿ`Ô"o@×û@Ü¢k 0¥2\ù»c¨w‹ãõüyÉÿÉMlÃÖ¬YC0dïÞ½CVÆŒ>r[µqW’ÿ›››UXwÿhÌÏÀÙ© o‡9;ÄæKîü—ïÞħ#¥o{r- ëþÔm˘ֲ‡£éE*Ì´–=\:_¬MÜõ’+\Vÿõ?ê­†ròÿZÈÇM±Ç÷’ñ 7ð%þ}Ïn~qܱ@Þ0ÐRØIA ×b¥=¥ü¹4™¦"ô—ûCÛßPád¼¼aЄI!5zQXMÓœä¬Y¬0 E⮵U}Ó¸ôæ›+Èýòÿ RÊNââTÊ—ž„|Èoù^2¿eY>²9±ß+Ä-ã͘1cDsþjûA†QL¶„Ôw¥H,]AîÿC€ÿý%¿ ÆÒ_z§Í»áÍV1ðyÉüüêbÞÛÿ˜"ô—û?ÿý}*œŒwÚ¼+±ÙŽ6¸|lýß"(cƒÝÉYJ;¨ ÷ÇÒ’„ Œ½Û½¯s9Ç—ÞH±½³Sÿ¡’€] Ð2—Ýpã…»îšËÚµýtïg7ýî{`.0¶qf8ìÝ»·Dì¯R–)gá…þcF‚m?8&DÞXP5OB îƒWtuš‚ø/ó.+KW(ï´aÐÕ92§/õ¢–è‚· „qÆ"¾ išc3fÌ(‰Kº°m;°aÃgÓ¦MX–E>ŸÇ4ÍŠµG>Ÿ§©©I ò+è mÔ»¥´§8çt~¿ûU´´†µÑ2CìûFm´vËo9kñÇà×BDñG1éºî<úè£Âÿ½÷ÞËŒ3X°`===*ÌPó"˲^â>â¿—èßÇ‚îw¨o"Ö IDAT¿raÙbV´Gg§pP1Ø9EÙÉ$³z]ù—CÚ ’ÿ 8yï½Ì›WÝþ+ùh‘ O^x;wÒñÎÌ1Ù5Ð@ 4Ð@ 4Ð@ 4Ð@ 4Ð@ 4ÐÀh¡ª%ù©ßÍa²IÔ9€¶¯´«p^Ès’Äì¨ùAê_ ñIŸÛÜßåá° ç«P.Ç#·Ü¢Dd½ZYŠÅÚBj‘O¥åÁƒ•¾—ðÂø×ªâ¡Ú²,i@\XbòäÍ„?û2ÿ<¡ˆÿ¹GÎ#üÙ—™yHªs àe8/ä¹ÏÿyœÜ#çù„jáYo€Çþ¤+—7ãl×0—ƒ³½ô‘gâò/rí_»Ç~‘Çþ¤ù÷Eyg³ ç{Ö۷¼D&!Èÿ’ô?T½½eÔu݉<ð<ßzX0Þûå¯9í3Ÿdùçod»°wà½_þ€/|ýߨþð=*¬Äö‡ïaùÏ«@#i/ù\ï¬kš8¯;ÏV×ð|Yò¦A¦½ô±µÐT²d“Bõz¡onnfΜ9ôôô(coIè—×’!›ùî·ö}sËÍ-JiHeð'Ÿ|²B @¶í@¢Là²*á"‘˜úÝZv­<üHÉÿÕà¶!íe÷zOOíeÄçN]Wä8/Ê Õå}"Éþ]¯…à¶eê^9op/Ï\æ'øPTÓIO-===įõ“ãÞÍ$ˆ?P7.O–yÇ·¿~;‰kB*Ý䣮ä5¥µö¥óÏä{ø×ÿè÷‘ÿ%dœØ!¢öÔmËøÔ­;xªL p4øÚ¢Ål›õWL1Ïå=w^ñqÎå¥ýˆn¸ß³{ì™xÐäî%R¡V›¼gCB‹IÁ€~Ú/ZM'=ä“B éÒþÚEGˆwÃaH¥ùÿ\ÃàÓä¹ÖV.vÏKl3Í rÿX ç•RÄË+Óí~¿€@ww7º®ûD4Æ#l€ëÝ^Ú ˜}9% éÝ2M¯ÀØñÞ~!¸¦ .Çž¹]¸8;tžcú³¸†çx€"g§‚\óéçØ¶\Š ÿŠü?1 §rìNÎbql@‘ûAüK" † a'ù_â®»† ÷z:î¢þãIþ—ØöƒcC—åPý?(ò½ ù¿Rº\¹^¡®b±X·˜´¶m´´_àÌO~ÒïúÂùö}7ú}øœùÉøËU'ù¿ÚÞ³$ÿƒ õ/Z´ˆ3føˆþ7ÞxcÕ±^ž»÷Þ{Ù³gO`(Ä"ííjÑù¿³ÚÛa°s:ÅléÀR¦ûD$f¶¬N!mÑÙ‰O žúGxÞ%ÿ‹ùå…^HÇ;3•Àö /ˆk?eý郔ïË®?}FiÿÕ@ 4Ð@ 4Ð@ 4Ð@ 4Ð@ 4Ð@cÁ‡Àõ´ûã¸:º.átméÄŠ„Ü’È’.S„~#ì74Md‹¤]ƒðjdØj›ãÛs9VP"úÏÏdØçMÛ%}”+Ü'2VDQa»+ å1ÓëµË›·×Ó´4úÝ»w¯ÏDoo¯2þ‘¹Ü›J__Ÿ:'?zó°,‹ÞÞÞaÅ„W—ÑÿáŸ'€RHBÿ¾'â¾xâ|Ü—F=}ðǬ÷•¿+±×œíå¥þ:uõO˜øàÕµ+—7Ãr®×½a¥€@?é_¦™ \¡>ÂÈ=Ùk>áüì»ÿÌiŸù¤"úOêH°Ý“ÖYûî`ûßôåqÖ¾û‰ýv¾õp?ûî?sVYÛ¾½cx/(Ò¦äÀ&²E¢‚ÿKyÀ¤S׉º3Å"Ñ`P‘aäÇX]™&×X‘ÿß¼¯ÿ/öuüµ:Æc4Õ××§â{ÓªÕDF‹Ñÿ%QJ¢'Ò¬¦Ý²X·n›]÷rÏç^Hy<^ž¹Œó…_II"â‰'¸üòË+Â~(ç©Û–q(ZàüLÉØ#D/t×ú·?†pÒKY½÷ÁW-ŽÜP|‚ØïõBb¬ˆ-¹$) ëºsàU‹3np(W›"ÓòŠ å­ÊÛ?²}sù< Ë|ÕX$ãËëïýXï5(”ç«}Üþl³?6Xºt)“âQé3yÎÌ¡»á¥ã±cÇ|i–ççŪüÓü'‚0º*ÿ´"ï׬»a¸Ù!6mÚ„išÊc®o„aôv>S3jÏg@öI<$‘­l{/¼dÿBo/¯˜&Êå”lj\ÎôƧ²`Á i!/{¼d\)´/e~fä^™‹Å"É–šï,]ºÔ' ½ T¤#A–ð2‹²Ã¿º®;{"'X´I÷Ó·vØW#Kóñ“ñ2›töDNÔÌCi CܯÕÂHÂ[] ‚0x‰G‚$6Qµ¬±ÏMbëÖ­\xá…ê¾ñl‹E:::†4–eI†l–ǽM†«ÛVÛV÷´4¯“÷~òo:O/©¹Þr‹E2£¬ÿ.Ó&V½vÙ6l`åÊ•’à‚ $ô’QZÜšJa½aÊÅb…ø@-èºîD"Ì? LV8ñm‡¹`ÅLöDN¸í:öí °‰ÇOÍNö]ÏåÎõ‘ÿa|¼CÊö0 ƒBâ-IÁ’{vµÖ$¤/Z’bOâB¡Åb±nR€œzǓիW+q­Ï~ï{ì‹FñÑ«W¯Æ¶mV¯^­Hó?ùÉO( 5ï5%Ldˆ{K‰¿¥-B-:›-‹Í–Å:]Ç4ñˆIÇ-ÈŠ0—êú°}®iš# †‡kc÷ýW¾"¼Ñ• ¯”Ï ”PÅXÅW D|÷’ÿeÞrü_ºTÌë*„Æ!ßá`” GÞµÊâäÿM›6qíµ×ªóýýýD®7ȶšc.Ëpóä‘¢žµ$Ûƒ0,Ìd*E¢Ñú­"œÞ¬ëº ÃF@‘òGš®û¸äï…8š<δØ)ú[&2-7÷y¹À4ãO9äÙö9>‚!\ÃÒåÞ.m®ÞHDÎì|»½D\×4ÍI¥RœwÞV¼»>gœñM¶}ù‡ÀE^m·ð#ãüÇg&[äíäaþƒ_‹-õøÚN1Μ OŸñšëW~àûvü“"øÈã¿ã+—q§‘'ÜÖÄâ`ä£E³aq08ê2hÚtŽÍ‚Çf{Éþ'Õ±¸vxA…©?Ñß­§Zñ_Âø ˜Eƒ&Jã@þònîOÂÄxnFÄ3kÜû÷«Î&wPˆTš'DøÔÄTÝõ×4ÍÉÚbÖe0ØôRE˜˜|:žn/œ ùË¢¸CÈXßûÞ{pÍš5\uÕUêÚC=„¦i|ñ‹bOJ®¯ºê*fΜÉÕW_Í–-[øð‡?\—àÍpùOZö·pQ‰€ògwwÓ5¯îÿÛ»ÄØf8`„‰,Ž¡ïNr}S˜ïG÷ ÈüMÓÄ0 B¡Ò^C¡P`ïÞ½jçèQñ\Ìš5‹)S¦ÐÝÝÍ’%‚˜¸k×®1å?7}ŠbÖ¦#tM<óÿ½„/t_Kzî!–¸ãÐ÷7žûSf¶œ`ä[· ‰È‘´¿\‡íêìf‰!ÆÑbñ¹>È`»Kß¼y3Ëÿ}9Mn“Lˉ]ë]æú[¦W]” œ WŽææff̘eY‹EáòXŠí›·ûÊÐ:µD[¹r¥¼ë^ûÔc ~ÆÞ Åb‘¦¬h‡Í5ÚጽU~€bFÇŠ[è™ò«#o€žÐ©&0THòÿxy×uÝY¹r%¿¹äËt½&æ£]¯…Øvï%í¿bÕ³*Þ§nÝÁEÏÞ]×5´Ì²Iøß•Á`–D–XDÌŠEmØû\²lö‡¦iÎúõë ƒ¾¹µ\¿_ýõôôô }"'Êò 7—„êž5ÞâÏœgгת-ä=$EÔ$ùÿüLHnñq(Zà=w®aYϣ럱€W€Õ%S,‡mã¥K—ª½Z÷yví »þ×uÝ F-Õ–’x”ë«ýÜÁÐý]¯Û|Áß;&ˆ2LeŸc°yó·Uö-ÿ_|)Ðë$Iÿýgl^œ]ú•¤}y}¸þ(_+½áÊ£išjµyR/Õ½žç-—ë&™Õ Šù^=U÷A’ÿA’ùÕ•whÅ.%ŒÚŸZ!0œð£¥ñ·Ôÿƒƒƒêz×}ÕËQ(}á$ê?ÏçOŠ”åÁ† †„B!õS–;—+¯bQSåÏaØ£‚¶råJnÄãžm?Ê™î¯D­}qþQ ç9wÓˆÅ'¤·[)* %"¿<'ìkŽ£éELkÙÃ}'y?{ñ B(àÖ,»âb’•pÀ²+.†[wÀmËFý^þÚ¢Ådm›W7^#õ>¼ñ²¶MdÑâÒÓQ@þÑ(¤üÏKÞ0±È˜[·ý¢Õ´pã/ÿ°:?Q]¹‹ »ùfuþÜrEDmoçÓd…ŒS&°­Î6ñ~ëÚµk—ïštÕŽä<üû–c©ªP +IAÍáªáKߨLR)PB½·„$üƒ ý{qÚ¼+¹æÓâ‚€^L¿büJ?üOóÕh;¦þOˆy]MO¬^ÿ&u[ -ây!¾™‰ó»Ã³ ÚC¦S“üÂy9.&bã-°vm?kׂÑBõü ºé¯]¶ñ@@ŠÔõ¿óŸïÆ_`Å?LžeÛw.©YB >ðúw…òCÖ?ûA˜À0õkmmãÆ(Eä÷j¸÷Þ{¸úê«+¾1HR|5ñ#Ã00M³®1 šÀh1òÿ£–æ áÕ{E‹)¢ÿªU«T@ÉhÑ¢E¾ôzzzÔ9éøc4k]9”„Z™_BúÛÓþwQ2«ÓÞnùÒ µì¿®Ì€çûµüî#!E½çäùø®:ý®Ì-Ëcýéƒ,]ºt\Åâh h h h h hÀ Ÿ|°ÙW2"ÞÇ¥1~"[$FhÞ0€ïÒÛhŒø¹å>”Ë)ò"“‘¤=fŸKò÷žˆG£*ž 7?“Qä¿m ïGmiD)?ˆKRs¹×ð{‚A4õ~H—¤)™þH”ñ%ùÿĉuLž¼™‡^ò<ôù?$! PÂäÉ›É=Rw>H¯ÙÞzËò{ëã[o]רó8ÎvñÙ\’ùû“>U÷+übÅug»ÆÄå_$¸ Wð®\Þì Xn«ÿµ°ýá{˜¼½>¿üµ"ÿŸµï~Þ^gRG©­ãøÖÃ]¾s¿ŸÿüËwoRÿe<™¾Ls(¨çÏ}Œ2Å"ÍÍÍdúJn•2EëŒG™¼\ -©xFGƒÕ«W+Ïc†a )ÿ†a(£¨žžš››•Õœ9sÆ”g5bq2d3¿öÍ¥Â+áÓÀÇ=ÿGëE”Ôj·ö*Ägir“ȉÂý‡$ÿƒà‰'xâ‰'à‰'Ô׺Îà¶·øP4Nˆ.ÞŸá–„4¾òŠ …¿yŽp(÷§xÕâÏL¡¬ –~R¾%ŠLõ|yó('=Eþ—¨&`Ûv –.8®·uÍ×&ee}n[¶lá§ÿ²ÃÕ«iv綾úMó°~ýw‡èo™È.óKŒéãÖ&£Åe -òRo?èºîÈû¥ÞgPÓ4'²YÝ~¼¢ë©ÿ¦¢ç¦Gæ UÓ4§Õž…$‚‚ìßÔÔDoo/å&RåOwÒ%ðÅ´º ŸÂáWÔ±$ÿ³ïluNµëü7Rûærç¶ï9ù¿^ض˜7ož³ÿ~æÍ›WQni6kÖ,åííÞ¦Ë8gW¥–$¤ÿø>1.H¯ôòùª§|qk*˻ڕx™„˜ßÑ¡H0+W®T„ƒžžvîÜÉ¿ýÛ¿Ñ××§¼2ÖºçŒpi%Éÿ^ƒÙ…g¸áÊ:ÝÌ5á%ie“6f®‰XºP³Ï.\XO'/¬b€ås\CgÓ4ù? 1k–¸ÿ2UÞ#yXÚÓÑ,K—VŠˆr•„ÌìØæÙ–e2zÆG¼7—:Cÿ[2þ9„!ùG_‹’Ñ3ãâqÆM›®æ"Éänb±Å\yå6 £Óì$ŸÏóÖ[ßâÒKùþ5¾&ây€¿o›ÍÄäa&ÅÎ!6ò"(ضHq‘³»Xdq0È¿º˜ý0¯.ylÏ^¹ŒgwºK}óÛ¯sçvøûÛ›øÙŽ$-[Ti4ÿc³ÏsIþG*Dɦ>s&ÇfŸTB%A€’˜B­|4MsZO q9ù_áË&í]ít¶‰öozb &°ñ ’Ä_ ~ïÿÉ·1â:ò?¸ã€6 ž×èošÈÌðµ¬ìîRaš›ÃÜ•sħ®6ñ<ÐÔÄ»á0ß|ó¸ˆþhš¦“ÇgÅŠlÛ¶|>ÏUW]…mÛ|ík_óŹçž{”°½øƒæ|£¸›ï³âOÞ¢¯Ý ¹S½½tÑ•œóý+ùÂ×ÿ €®Nw–j4Â軓X‹c|gŒù/Y²D‘šššÈçó B¡Gåºë®óÅ‘kmo¼±ä/Û¿½« Ãø)Ìãÿ{ã´ß³ ø‹_йcg›Ø+l›Îï?c’¼¡‰ë¯¿~DùëºîăB@e‰1]­Aú[&27¥¡ƒ–«jµéèè`Ë–-*Laˆ>ñž{RGy‹i=¡²ýó\ôìÝðý}<üOóUûêÖ<øú€®¼óìÝüæ’/½C¦í…œûd“k0ó~™]×CmïÍ‚dL'±H´ØÄ‡h EGò½Óàò²Hòÿàÿù:ÓšàœÓÄXÚ—3y 0ó°eËñ•¯|…ŽŽŸ@|ÛaÌÇO ’º»ö ºBIÏo¢üå´¬çéß$ì÷ºÞÈD6ûH! ‚ï ëŸÉB:@ìF"æÍ›W³wîÜI6›õÅO„=º¹­6©õÁ`ƒ—¬¿%†`Óu݉[S¹Œ©À1âÖTæL.s º€_· jƒAÖ"DÂ6™Mºxõæ]ÈI´Xàò‘•´8mô®Ñ‰¬L”„c‹ö¯¶üÜ}5ë]ض„Î;:Y™"Ñ:P>þ£y†Øî½÷^V­ZU³ |ðAV­Z5bMÓœb±¨ÞÕ^R¨k#}þ’!›XAá6lØ0äL¸Lï†Ã<âñâ+±ÏC¸ÛVÇ+Pñ*»ËI§ Œ¥A¦’_-ž—_ñ_7×9¹Gć¦'J•¾úÕs€^ö=áo )~Ábçqâĺ!Û¿ñÑãC‘h½ïzgô+œèòÇñŸu‡ß ²-"ÔyœÇþ¤OÕ=™V¹h@&pEEüŸ}÷Ÿùö×oWÄ}/ñ_bùço„ÏߨˆüßzX¤¿½¾Ôþåñ~?ÿ/Ô¹zˆÿÕ Éý7/ž‹#C’i½‚Ñ`°f¸zðä“O¢O½$ãb±H:Æ^,à/zŒ>¤7¸ò4FÛ¶ Ms.³m– Ü®Íèêd_[;FW'¯…Û}×–à%šÆÖ29×Ó}¸©É÷<ÈóåákÁ²¬ÀÒ¥KUùÑþàÁƒŠÈïMç9SŒ½aé+å+ÏËð D $ ÐÑÑáë˲{v ϺÿÙ¹QÅ)øKeÈ»uljjRÄRïyoºžtFí¼<ÿzŸáÚÞ Û¶—Þ|³“hÿ½ï{I~õõÎ!Õ“†O’ø?Ú2èºî¼ '7—%¼Ì.ÎS$þC®x…L·œ*½cz ëwbINŒ‰lm®ôÄ}(w‚]œG±è©et'çr}%’W1£cYV Z Œ#B-¢îõ’Î¥§¯ÇÙ&=nwô·L¬Ù&Þ²=‚4Íá Ʋ¼&“øm‘`0ÈùáA– Æ£DVzÚ(g6R»M6¢i7Qo»×‚¼¯/󜛅ðÄØ¹¹4¶3:Ë"­iyÂèúÁÛ&ý-éôtqÛÀöžX”Õ²“‰-%¢@z ½:ûûØ›¯®ëN±XD’ÿ =á3oÚ´‰– ˆ[Sñ5£S‚OQk*.'”¤=‹˜$óyPñþÿ¦"üÇã'`ßÙärç‰À¢,ì^ŒrÁŠ™Äã'\â?d³¶û.ÌÅÑ’ÿkÁ;/–äÿ3fFÉìje)î?KOâ’ BúÖ­[}vï•b±8¤ø…„$ÿKx½ Jy,ÓîëëcçÎtww“qÔ¶u ÍÄ5ŒÒ¼1ä3×D<ë²°Ù²8ðª0¾JÇ-—ø/æ3›-‹uº8/lçò$iò‰…x1O¼O/_ÎÓˆ9ˆµ\ù˜ (²¥D¡Pð÷S&3¢ç_×u±Þ+ð %Ã/ù¿e]d\E8 Æ9†*‡‰(â¿w=¶páBZÖ•DÈ ò}ôµÒ9£¬ ¼åé‘‘”_pèw¿û ŒÚ6mÚDdƒA¶ÕuÈ{#U(8©BåuïÜßt­ü|Þδú¼ /ßtçÄ™ŒN±Xò,å+‹ûŒ™¦I¡ #Ɉåi5ÿ)ž÷ª7zÅ:HKkd‚Á1ç’˜c jÄÓâ]TÂ.󫻬v—`Ýîü+cJ0¢‘MŠñ*¾_ÄÜcºšƒHò¿mÛT*å<öØ ž½²“;×ä¹ãŽÃ80“_~€ÓÚf3Ñx›Î_O¤ûTIÐȶ‡'Áת¿$ÿK’À·?½;ßî\Ƽv¸æÓϱãq7¿ÀŽÇrçMsý‚‘«µ(¿{åŽÍ¾ÐgŽÍ>©D@ˆóç¹u˜^W»§´”è¼­¾kJànƒ\('D>”Ãp¶÷'É#W`¬:ó„?ž1Y¤™ÒR#joعiÍ)†!ÖÙÆ`î§´ôŸÏÊ\Ž,Ë‹1@î^¾’ pé@þ—÷à”)S¸üòËY±b{÷îEÓ4î¹GìƒA‚Á ‹-âꫯ®¨Çhò—ä™ÿ¤ßAóâ}ík8íqxe^;œü=w·3÷Ý÷ÁèÄZ—ü%‰ß¶í€išÀ¬Y³”À´iÓÔÞ©æ ¯L™2eÌÄ™¿lÿWÞ²97•‚\#„_Æì4¸Åx™·Ýð]î¼d Bü¢œèS/E%Ê·y ý-9ŽÐ’èt:2쉜àhxÓrþæ]摚{'ՠ뺳~ýzÙ–ˆ½4ïþJoo/’À+÷¤@«D__ŸÚÃp÷âTZ .¤££cDóMÓIÕ]Rñ„Çò¼½7CGGBµƒwºPA|ñ¼Çµ7üÇZJÌç.¿ür|ðA®¾újÚ-Ë­¿È[ vê:’(¨ÍWz Þ»w/rjåÊ•t½V"/>uÛ2>ÿý}tܶ èà)9R¢··—OÝúed|oZ .ÒC¼„ÑéR¹‚Q kœ6à_W'Zlº¶¯-$ù\á…fñ_’råq>zlèöiô¹{k2ß`ÔbÆ lÞ¼¹$ĵÁ¢˜Ñ+æ<£Òšù1zöº!ó«F=³ó}N™ð^×;ØÜަM'8 ˆ–õ<ö è oIJ6¢ëŸà!0„èA5XI‹¶ãÙ¤cYÙl–­[·R@´±$e³Yõ|zãÖªÛ¦M›êb”}.!ûQJGÖßÞû†`›0Á1ÔñeŽÁÓ“ÄLmƒ®°Ÿ )>×ÑAÜr‰i‹„~Œmƒâ¯ž+/C5xIþµÎO˜-Þ/ÑhÔ×Ñh”T*Å„Ùï?cóâì ‡Ã¾õ§÷¼W@Ó4§µÃ†ýâÿ›1›9>ò¿lWÙÖåíóäT,9mÞ›U)xR¯'hï½dæ¡óŽNv'EŸ¬ô¼{¤øiç˜îÖï¡6‹9ÖèIÇåã/A¼jí'<àŠrlÚ´‰™3gúâ5aQLÕïùzýúõjþôá—HÔrÿä7ÞP$µž¿¦¬ÛW5POYä®<ž1c†Ú³‘H´Øôô_àÛÏŸ6mšº~ôèQB¡À}O›6MŠ 9žÙ9‹S¦XÓàqdlÛVˆT¯ß—°Çè@XøìëŠK矩Èÿå8š^D0¬§š0õXqCêKüˆò’ኆÞ/Î ¼ œQ;îPÐbØÉYh±ù_¢In’™•ÏWþÀ\%`'g €”&ÒK ŒÈ ¼Üs\a\œJ‘œ5K_zóÍŠÜ/ ãq…[‡ØÀ€"ÿ×Bww·™ò’ÿ%¼ßóËIý–e)òÿš5kT9_Mý CÌá¥d,] K+b¼DªP(-Ë ª"U((ò-œ òfk‘³SAù_B’þ·í¯$õ?ð«‹•HÀ›­EÞÛÿÚàrÞl-ÂàèêX ÙRÇÁÈ€"÷Kˆ:UÙ‡$õ–äÿÛGü­wÝ5FàŒr;¢ñĶ>Ð]£PýG¤rµÇ·jð~ß‘ãˆwøÁƒijj¢P(Èï¼ñÆxÃËoîò¼ ×ÔÔ¤Ò’swlUù õ×Òšóö'ßá¬Åƒ´ÿ›kk'ÜÕI®­Ïþòë¾kg-þÎáwÐÒooôù÷á䯋–®nÿ"÷°$¼Ä‰o¼‘o¼±ÂžK T‹'ÅzzzêúîiYV ™Õ¹ô89YÊt–FN0³Ý¿-×à €’@2«™ÿµƒš¹L9áðÿ%:Þ™Iäç‘—â/… «ÅÛ¼y³:× þ7Ð@ 4Ð@ 4Ð@ 4Ð@ 4Ð@ 4ð‡Â‡ÀOX•~¯÷R(‘ÿk‘°AK"«â•§;>û½ï©c/yO’`j‘ùW H‚*ÏLÉóaÂï9³ê÷¼¯œ^Ò)ø È€Ú¤ö3fH¯÷2/•®WL`¸!’À_ž¿$ÿK¢9Ÿ}™‡žðÄ[7lûkšæd“-Dbi6lØ@Ð%Ž{ûàQo) ío£ÎãþrÈëW.oVä~oZRÀKü/'àêÜï$®¹Ÿ³Üs’Àïmÿ0§+Ò-2ÿiŸù$“:<íÏýª¼bÃõ¿×ëv»eÑ©‹Zò¹«å]Ñ0ijÛnYt™,Št>†z$¤×[@ÑŽ?î 3gÎõñÏ+á¨çC mÛë5ÍÙjÛüâ¸Íç´’Áa„1Ý_iz›Ö4~qÜæ%®wI@×—‰Zlµmâ¶Mè¬a!ǸKmô’9Óž2³¥{1)zÒÿø7Ãëžžå=¥<ž¦Ý¤¼Kþ¦Í-G#1JE ¢ëºó©[wÐõðÚs<ÕÓCüÚ 5óiÇüm ëº³/wþà# Ij??ü:Kr°‹óH$&W”¥X,V%¤zÍcé‚CK}¤à€—¸R,)¦„ç7—Lù™mÛ*%¼ ‘óHd‹êý0RÒùpªMdYåñXpAb¦{¤»Äÿ0ÒÛëðmr;±ôMÔÛî^hî;G üÔýõšÜ™mTä ®!Þ(û¡Ü3¼¦iN2ds~8À¡ÜŸ’(êí\«þàyÿ ;‰,îX[º.É亮;¡PˆiÓ¦ño|ƒææfŽ=*Þõ6ŠÈïnäóyåEÂKB ïçÚÜë-ú1Ÿt ‡_!Ñ?Á_âPîO…@b& Îï‰ø‰Zc%þÙ¶˜7ož³ÿ~æÍ›çÈñEŽoÒ \ýVåŸæÞø³d—%BúOÿe9†à¤)Œ—úMó°~ýwkŠHOŒ^Ä­©$::hnnfΜ9@ÉøÉÿétšÞÞ^ù_’1ªÝ]Má<ñˆ { þ{ß‚¯Z\šÐ‘÷Ñf9MÄÉûDŒpžˆgLIßÔ?Ú-«b̕䯎ìŸr#æzà%àƒKÂwÉ÷Ò Kz„©ôQ$|Žx_ 2¯èÃÆ;:¸ôc¢ÿ%)BŠP>åDzlذA=ûîs2Ö$+ ÝyG‘tŒZ¬[·Î' j)­SõìuÀáø³üYî™ò$}ÐuÝ9–“íÐõO¸û'Ïsšyº'ÌF,ëvl::6¢ëtt”„;ý·˜Ë¯&“ q(ZÀ²ž÷¥ufçûè‰KjÎÛ<[Ù½½½ÊÃ8‚²\ûÉýN˲èíí%µˆ‡®)~Ÿ÷ºîXŽü/ŸÁè†R?É~ÍlÒKç©¿¿SëÝùW—Ö¦ +Àv™ã'½v‰™:qk*+tØ6(ד ýqkª VxÂÉóÛásSÜ=!{Am ê —ËÂá°óâìa_•}¶Øï8ú¨EjvJ…™0[#•Jñþ36Óèg‹ð/¶½è pÁà%ÿƒÜ+-Å÷ÈYbÉt‰ÞªýÛ<£f<-ò™c®ˆ€|;IoíC¸%¼÷aö˜N×W—Ðy‡+v) sôåDy̼'ÅOžæ´ÚR•¢Þâlüõ’êW­Z¥È^›6mâ“«þš}Ž¡Èÿ«V­ÂŠ[Jø¥‰êe(.$®îß(„*߀«žçß–ˆöìü-ÿõ_B|lýúõUŸ? 7Cf$ƒZ”ÏÝzè!åØ;›£§?ÌÑ£G™6mšèëëcÚ´iê7 ©k…BaH1tyœfNb¢ñ6§ÌI’ô/HÅ]ÏTˆhÚ‚!Ó“Çõ̽k'Iâ?{Ëþ±ÀŽÇŸãhzQE¼i-‚ô÷Ôm˘ù±/Nâš‘ïÁÖÂÀÛB`ï•·l¾€ üÿûžÝ|mÑb~öènÎ=CcŸcP)G<44Ms$9\Šb4¹kz9‡«&ª¡yÕ¡V¾4ö‹ Ú&L c \{Éÿmoç@8ÌöÎΪ$þØÀ@Õ¸òš—üïÖÕñí5»õ/Ô<¾Ú|Þû=jÉ’%,\¸3f°wï^–,Yâ»>RxÉÿm_iÇçèê4«’øS…BÕ¸òš—ürÇÆjõ—"Z*ˆ·“dÿrÒ? HÿöÌí¬ø‡©L¿âî¾ýJl¶£¥ê™ôV‡—üß4?L1 ]NUy›È¸òš—ü_Þÿã‚ÎËq±ÿ DÖ®ígíZ0ZpþXÞåk"„sç?ß |p"+þa*ð,Û¾sÉÿÈúçbbä%ÐÚ*DôG" ÷ÙäXç}ÿË÷>QÕ+W²aä(¡aJèyݺuëv97ð¦éT¶\5çípê®3ÑÖ–®‰ýNñûKqNËhœºëLœÃï0iã»*¾/ÑÁæ·`ƒ–)–ezzz|a½N' ´6‘óIô/Ç¢E‹Ä<ÐWžn½H*Ñwþ’ü_kˆio÷¯A…˜Àа\çÞs’À_nÿuÕéC“ù/¼ðBßÏ›®WL`¼¾Ç7Ð@ 4Ð@ 4Ð@ 4Ð@ 4Ð@ 4Ð@5(‰àz6¤Cו|q§ã‘ªa¼ÄåzÓ•xä–[D¡r9æ»$~¯(À¾h´j¼ùeV^òÃîp\ê)§ôø•„' ¯1f½éÖ[–D¢”ççÿ<^-ÿÜï/½Þü#±4‰›÷çÞ)ãÑÝÝí¸ÞJU¸²ÞÕâeô+œr¿üïl×|¢ÎvèòÇ}"2áÊTOyׄ˜äKWßü|›˜Ô1ºö/‡|¾Ìœ©HÓÞgKµª”Ñ%muê:ñHÃ%ž•?—µPM¬A×uG~‚Á ï~ðbýúõ>Åðjb#Åõšßèæãxz‚Á|ÄïÇ=­+ %ÊŸùëËÈCÁðz­v@ƒÁ ôªÆÍ÷•>꺼€ŠgFÞÿ^#¬ZdIð^³f 7ßW:¿d‰0—ÂË®¸X©š¯"M€ †£Ê\Ísº×h(ò¹4ðÓuÝYbLWÞ™½÷“Ì«†j7Ièò|n™%h)Ùc%3Ü… *Ã÷rA‹Ñä;).ÞA—xlìVALÖ3•¤Åñÿe¤¦ÿö|ƒ^³FÔ½Ú=8ZÔz¶ Šö|Ú5>~É­ØüHéúñëÅpmPHû ²yv'!—sHd‹ì‹F™ŸÉð®—%6Œu¨eY  ¯H";y\^Iò- „TIÊ–ÜÏ÷ 7~Á‹rHr}¬ì|òoc>nÑÞ/ŒÃs}~cD¯€DKB'±|ÆùÃÁ¶í@¹q®l“bQÑM‹'WmYÖØç& ¬’‡™‡™ù]:::|ã³mÛi1Íqù­¾9\µ²×&«ël÷‘b¼ûAþ¶ÍFK`0HÉœ9sÐ4 ˲Ð4ÍGX‘s°ù™ ûÚ¢¼³½mh£LIú7sM>ñ7]×§Ë(‰àC‰€•ȉӄ)ŠŒ–b.¸n£Ób±Èi5®­^½ºbÌ•d8Yîb±¨Æ ×Däw%pÈB:š¥e]Dy|‘eXºt)›7oV¿>þ8ï½ä¯ø’$ÿCI˜iýúõ´tˆüM÷k6É|´>ñ›šíà¶A¶Õ$’2„Gæ34Eþ—ÿ³­&f6;¦<¥x„jk€ÙF¸Ý ßÕF8€tiÍ#¥V&Jý½é;»H§«¯—Ëë*3™Òü··W3uõÜ_uÕUü÷ÿ†ß^÷]6mú¹ê)<áS-ýÑæßo噂ÆÙÿS^5¸ ½‰Î®5ÌÕ›(P`Qßb F•94MsŽ&3Ø98E<­ÑÏDÖ„_§?ì@NÌYÞïÉöã0—3ÛŒh‹6ÄFGÀ¶m;‹-v’ÉÝü#ŸäJóÈçáŒ3¾Éš5¥ñlÇég©uÍÃÿ4€dr7±Øb„a»ýš6}Ä^èƒÎîb‘Ü3ð÷·‹ó—P€Ï4ñCWð ו‡Ï4©x±âÞÝ],²8•¡½˜aê3/«s’ø‚ð/Èþ•†¨SŸy™c³ iÓGäyüD­§Z1&ƒù7î›j¢…mÛï;ß(îfk>G³kXŸ>þ›Çx¯s >ãFŒÙâm ö7Š»ùNpñ˜òßµk—2Ž÷Ä ß^ îY÷ɽ"ר}LùËöÿß?½•%¼LgWžæµaò&°fÍ¡RàùoÒ´‚¹.ñÿ•·lÎAßëºîXI Š‚ô™È€DQg %¡©£á¾xÓrÛé_†·’V±~¤eYé-Þ ïžÅÂ… }ûP[, |¯£¯¯oHñÍb±ˆÝUÚÓ±“6M¦ß ´ž}, ÿo-Œò=Gç–…þ}y•GFwôŒhË »üNN݉ZÐ)¶m¾ò•¯8[·nåÁäꫯ&^&  )Q…”ÆœV›'©ôÀ=–]q1‰ÛzY½º´Žêñì§,\¸°bEŠ@I,@î¿U¦Ó;âwð¡¶R_RšZ£{IË]ÆÚè¦èø º¢ ¼9  'ËbÛv ££ÃY¿þ»˜ÿçë4WÑ‘{Žr Bý÷Þ«æÀ^QZ]× ‘óó+«Sæ$àEÅë4཮wÐõO€Ž$ô%Ò¿ÈK›Ë¯VçÞëz‡ÓÚNç.1®ë7ýJ¨çþ¸ Ý{QN–"ÞgP´‰M[3äÜ{û@ -XøøúO’Ð%dÿÖÓßà >ƒÃÞr½/‰ü Ö’ì¿Bá˜+*w ){Pú/ÃË x:Ÿ˜ƒzUñ(‰¼8ûEÞÆæ_‚Ó‰¶Š1&5;…ÝeóáÏÀ„Ùš £ÍÖT˜L,ƒÕe©0\pJ¿¯0±iš#z?MÚø.ð®ú8çt&ßw g-‚É÷]CàœÓÕõ‰kOVÔËû_Û¨9lü'ýÛŠ|êY—.XP’BPåXµjÕˆÓ­·,‹²“Á(¤«‹†Ztßÿzó¯×þKZwÉo@½s¡*¾ó6ˆþ 4Ð@ 4Ð@ 4Ð@ 4Ð@ 4Ð@ ü1ð¡áƒ”Pø±0¢7ûr5 ÅÒkߨ ”óè,¨žg4J¢ìš×«ýx){½/Ö"Z677×E4 âq‘ç¾'rD‰É“7sâĺª×jA¶O<­9›æŠúýÕ6å~d—Þ¡6Áôƒª·  \áÄã½ô²ï‰™Ÿ_AÔyÜ.¸ÂGþ/Oc<Êyày¶?|"ú':xÍ ?ÿ/8kßýã‘"¾HøEª?cÑ`ŒÇhÇÌ™~"î¨ÕNÒNþ …‚è/ÑÓÓ£îƒrãæº P¿8^2¸*'ø{±Õ5*|Hhõ˜’dÖÜÜ\áÉ¥¯¯oÌÏ€eYn[V2Xö{°~ýzv<þO¹e©/Ï^ÊžºmYÕþ°,+jñKŸ~²“ÑuÝ‘¤fùQÛ+<°fßøÜkø*Ó(¿Êó Ö¯_O¢£ƒÈÔÊÀÙcº 8žPF¼ÑJñ =SdóæÍ¬[·®¦‡£ñÀáø³lØpIU!–ÞÞ^-I±gWëV†mƒ+fêl´xÉc"Éÿ­®a¦W`<¡ëºSèí%´r%…ôTòž!R’ÿ¹åá¦vI›I/!P†ð‚üÿ:=¹¹$²Õ ó^ôä$‰¨Ì›Íç&‘ü˜ŸTDïþ–‰ÌM—Œy%ù\Šc¬÷sAB'·0 îy“Fè®g÷ rŠ—ˆ?T:±Ï‰·a5Þ}îûÌk:yíöšùTo“›ðÆÙÅy O;ñC’š¥Éܬ²ÿ@y?ÐbÛ¤]²‘ìÀõX?t?CÞŽÝõ(o¶9jL §×Ó}õö®çž¨²ÃÝ­€a—Hú&‚Ð_. ãƒÙµk—ò%ÓËèÂH,ê Èt¼ÂÞðÙ2OÕê|Ìõd}L%p¤<Ș iÂÛ5@WWf.hmmõ| …‚¯=þ³Sx·<Ù.^Š“´Ú쇃®ëNÜF~ÛºDEžö/Ÿ_Ì™3‡žžvî܉ištttTxM)_SyaYV ‘eض—ÏÄÓo ŸN<ÄÌI1€ú o½ƒ¼1Äõb±XSxÄ3eš¦3kÖ(\Áz}-ŠqŽ¡Hør B`éÒˆÊ_þzÉ÷2 )&PÏûE×u'úZ¥ØWxkýúõj°páBŸw/ÆBÄ÷–E¶A$e°ÿ~~˜ÍbüøÇüèG?â†nà‡×]ÇÖ3ˆ\om5G-~ Éÿ’ÈOºAR,@Åñ¤ÐŸ fù…Ùÿ«ýd³öD,(­yz{-r¹éõŸE‹Q(TœÞ^‹•+õŠñóƒÊOónfôQå_  ‡¹1A¨íoìîžNGˆÓ˜Gðæm]ŽzyƒŬM02òw’$ÀÇbÓ™ü(y˜Sæ$ÞË=Ã¥—ÒÞ~† ßP?[,E8Ù>M›>j!‚ÅÁ óùïïãΛ.†_æÙñé;Žr âô³ø«qƒ£s‚éα٥wœ_ `(òÿyJ±ðA9ŒŸ€Y4hÂÀ8r!ñ>éžÚ .GdÍÁ&ŒÉ(Â?Ò¿)ù_ÿ¥Mv—áª-äó4Ù䦒àÂG× ÒÁ¹a‡à¢’|–܈Ûö˜E¶lÙB±XdÆŒضÍO<¡Â}ó›ß¬ˆ{ýõ×›@w²…þM ³-Ç9ßÿ;í*\ó—º)ß øNpñ¸‰ÈÿÁ`Py´õî|ëm™¿lZB0ñMÖü°¿øå+¼kbR8ÏýŸÂQÝ_jvoÇÅXõ£±çŸ(ŠùÄ.óK 1¦NËm«(O‘ ¤÷c-d5ÁLï\®££C½ó«y.',VK§‚Á ¶‡Ü¨Ên–ˆÈµ„!%ÎØ[]ˆ—L}ï˲µÂzÅ ¤ÀÖ*DbÛ¶…”æÌi­N2®===ŠÄïm9Ç’b3={·/^ù3P-á`Ûv K;‰¸{¥¨ÃKôW´-žÖé:—ë¦+¼†œÓ«Åãë3 ®>¢}}9³‚p,×3-³lŒ&›dVW„XĢň¨Fþ?{ݰmpçMÈ|«ëyuNþAùÀ'pz(Zà+ª˜çT›—§“©]÷¶*¤kIæØ¼y3Pý™ó"×ù4¹âå>Ðpä+iÑ”­$þ{ï=IB»ƒü/‡ÿ§¹$P»¿E¿¥Ökêþ©˲ ½ú˜¡ëº#EæDÅ.c*ó]1Ð}Ž¡Èÿ2žJË] nІ=Ì= IúápØyqö‹h@´5ª„µZ[[Iµ‰9ÅûÏØL˜­¡QèˆF£*Ì\P•ø?T”ÿ÷¶?@›á2ò<]j_Û¶ÅŒî̉Z<©‹çJ|;z‡»™Í›oîÕHÙå÷¡eYЊ]¥u ¥}4‰ì±’ø¡Þ%ú=èæý^Ùò7 Ö`jü ’ü/ãè‰R”€Le¨9þT{½]ЇÖy­ ·¾5ë_mܽk¸zú…jŠ$ýæ,÷ßl-2‘·KžÈíGÑRA²"ßpû¯}"Þ4¤˜(x÷|rØöíhÚM5çòÛ¸ãgÖ_ÞØ±ºtþ™Øw’i-{8š^D0äæœKâšø1GÓ‹°m; ùž”bËþ±ÀSC5À0mÓ@‘ý“ö,>§‰g^ŠŒTô©¤€æ!N7¹z­$pÀ ïîçÌ¥éÒ~:ÓˆýüBJSkâ¡Ù¼{ì’¼(ò¿wO¯pH±¶™•äÛ‘’ÿ%ª‰xŸ=Iê/â°, ]×}awíÚÅW%½ÞúKò> ÈÿÞïáòXT?DªP JõGLþ—"g{DÞÛÿ˜:–¤þ~å†wÏ?ð«‹¹æÓÏqäñàbQ¯Áå¼9¯¨êXWÿ{Ëì’ÿ½ßºäq8 ‰¨c.W95ÿ@Èÿ’hÂy9^r~ðA’ÿ%îºk.fº_ý7Z܃_Ù>(È<\üÿ|§ºôA’ÿ%¶ýà+¾ñléÿw.¤úçb%Â?(ùßÍ¿5ìÙoù_B~/"ù|ž¦¦&µ¦>~ü8ׯL ÜlÙ²EýÈd2J,3ùàÔ]%Ñœr‚¿oo¦|'ý[´ôcÿòÿ³÷öQRT÷ÚèÓñ+J$èûJª’è9L÷@'„nˆ`‚ÜÐçž×u 3-¾“xâͤ›‰QOTè>““õšp#ÓMâëÉA¯ÝãRT0L7ˆQ$:]MðM`ºfˆ¹1P…%­ûÇ®½{Wuõw÷à9«žµzu}ì½{ïúÚµë÷<¿={ˆ ÐøøxÑŸbÍš5¶¾AÍÀ.aœ:ZDô§ûÄ2­ñ= þ_}gŽ™ˆþ¼'õqàÀ8pàÀ8pàÀN'jpLu§">FF¦ ¤äFÈÿÛlˆ*_Ú°°×ïÇ^¿™±@4."ÿGºº+cJÀX½zu“`[Eþ€h”Ø\øå~ÙÑ0ûì œ<Ù[3ùß úÓ—fÎ~™Xá#/ÐÝÝ=!íyÃgvÍÃÂ/Gà×_€¾M€kqˆÑ· %ÉÿÍDæZñ/‚È“yüó3…ß>÷*ÎÝûDÓÈÿvS©èFÄWˆ€N!Ë@ZUÍä™þ7öa–:ýÒ(kÖ¬Áš5kLiöïßß²ó€}B³àÉÿÍ€¢(®@4cºwôõõAQ”’ärËý nòu%’n__vœ}5^º‹úKõ7# Ž²‘'óË·î;ÃSèw@2vöyGFFðʨ´…´’©ŒjÛY ´ýÕÚ~ž4× nÇŽ8xð`ɼÔI¸¯¯Ïd³Y$I?y ×ç^–&14,J³x)q€P”;YT´zaw PÒPQ°’#û„ð¿‘wS“HP3Ä(ùÿ²Œ½~?Ü´é>ÈÈÿþêõb/€ùÆø¡Yu QZ¦fÿ€9k× N­Ë–-C*¢˜´ª%ÿ$b=„SSŠíü=CjæXìg?MÛL"t>Z%uʯƾßïÇ£>  8B%©W¾¤‹©®FN+ä0ç›?CYG˜bò´Ô¡UnAå>¹¥RSmÁGñÔøµ¿ ˆ3}±Í‚Ãu€Ýå;iˆ:¨euü„Ür¿}®kB9dÿîwH-0Gñ­xN¨gu9ÀÒQBXELk/rè ÄQK.óyÒ’™\ž¶)³T¿ðX’§‘'Ev~˜—ki©=4Ms‰>r,D‘8syDÉdÁ`9€ñu„[ŠêB×ÇllÈ9`æÿqÊ^+{<¶‚g4ò }ŒŒ€>›ø(\THÀ*"`g«RßS"eɾ·”c¨ªªbR‰}ô[¿~½­ð ½žúúú*’vÊY¤u!„ÿ@¿7nÄÆè%ïÀt\Pð1ÏE†ç÷ }aef‚•ü/‘™mÂû÷ÐÐPÑ~9“!y[€¹sçbýúõ¸ï¾û0{öl¼øâ‹Èd2èêêjº­¡ÈTd³:2±D_ªh,àF4£šÆÙ¬ÎÈ2¼St%òÿй¶tº˜èè7@4ú“T ¤3“ö%IÒý~!ƒ³»zµùùZ­ýwÌülò¼És'nÒê¶oz?T3dØaŒk\ "=q.1ÇÅÂóqlp:ûñ@%Lê9HĘðEúûA==DÜç•Wn×{ ›}àõÞ€…?Þ‹'s9&{þ‚pø"F¤o”ò©þŒð­"b±lýOó>‰Ñ“þo¿•¼gþ8Ør_ôÎ&"¯a:;x1Bþ¿Ô$ @Òa€ã³ ûŽÏ>Z“€ zð}îýâ|°Ê¸—d<„ø û8™JLMà+wߎ'nû! Ÿ,´¡Êæ2hšæŠ ‚ÅhAuÉ Äì LÆÃ‰£xƒ»®¯åœ¬3š™ñ–Œ¨P[X»úÀÚµkõõë׳gŠ l¼¼jÕ*À£>Šà±Çƒ(ŠèêêjX€”æ÷…SúÀ¿~¡xV~’(ñtÞDˆg#›²l]Uw¢#GÖï—4; ºß_ c…ù*D822ÂÄ †‡‡›"¾J˧òz W@v… Xૉ뀚sKç}—0¡’‹Ï®þ¸K’¤+…E@VÓ©Ò˜ÿ6¨–z¦cZv+ËK·i·d)FòŒ sv€o*Šâ’Â’ã+…Éû šÇÙ»Ó8µÈu.¥ˆø_M{êIK¯§§žzЉD4Í$Ì&‚þNXC®˜4  G!'J „Eë2­=^ºk9®úÁv ݵœ‘ͯúÁvCË©At-®áŽâ?@„vämýÛÓFFîÑÁDj94Msõ÷÷ëë×ÿ òÏoF§·|=c‰½‹ÈražáHä5ü÷,D£ÿÕÿB_IÒgqÕ¶›ÄJ%IÒ/вÓÍ÷—P”ßñ H•˱B’$ÝÝ‚ó{{{ÙØ@鑊N¸ƒ!pÛQ aŸRÒ š§ˆÄ_°ÇÎ=Jÿ?}V²¸u™'Vƒr„l À`ëMª@„¼^/!üÏ›ööv$“Ihq üpÆlÐðös@²'ÉDFGG1kÖ,VN­¶­àÛÞ£Óú‘ëMΕΣR!¿‚_<>—Ä%Üø$™Ó`•:yˆÕQBp¢°³Í @\blS ¡G€R…D¹ýoãGŒÄ}žqü?wý7È9 ×ÁJÆ—ÂRMÏ ^4´ÔõGEЯ°9ºZQMÝìî»kæd™@½Ï`Àó'Eýò1*kÚòä:/EÖÉüi5"å~(>?ß %Îß˾CÙ•Å XWSn%¾tJö £lMóï³Q—æd8• @çs©ämHÔÜwÕ<„Â6™<³òS!Æ­pµy2‰×ƒäýëòdH&³YÚ‘ýyÑS~ˆðÔF5í§"LBvskãããgóÁÖüåÚO©m…ÙŸÿa—¿Üñ¯kÔwƒüoGú©r!O£„tÃnbç>t/!‚›6Ía»åÔ>"@ëGÿ›M„çÛÏ‘ÿíHÿŒˆÞÄöãíÀ„€½õ'ÇÙî•·½FDNCû³án[?•¸–+¤kV=øvåƒA½$é¿~˜6mŽ;ÆîoS¦L1í·~Ÿä×ù´4?-¯^èGÈ;Îû›Î±àÉÿ­Ä‚ >ø |ðAÓ¾]»vaóæÍ-#ÿÀâ ™\̇ ßÁ(É;i«Èÿ@Áÿ«oÇDžÌãê3 ¬Doo¯CþwàÀ8pàÀ8pàÀ Ô$„ÎÝ_‹£•‰ðÄ¿j¡(Š+šNEÀ£„¾ù6 bˆ¦ÓLÀŽ,Ó çSÔ l`` (òöÈÈsÊlU4¬H„”®Æyçm4í;y²—‰<ó«hQÞjÀGûE©Q 5 r #êU  àÐÝÝÝ’vK’¤S¿Å HÿjüXÅö?ÿÉ|qE焈Pè̵ŸÅíϽjÚwîÞ'ð—>Òÿg Ô×ÿªª‚?›}Š‚Œ$™®/¿…ñ–V $˜hF…OQLeÔ‘–‚|Úßßo{þó¢›7o®›‡Q>ã""+gJøõXqÔ÷•ùøJcÝp39Y‚ ÛE +…RŽKãããŒ\NïQ””ΣØ­!˜´p-^ºÖmr¸çë100€í/¼nÐB³M£UK’¤ŠŒá#ÙÅlZ±ËwG1Ȩ×4­;PŸÃŸõÚ–fÚ¥ýLíR¦5_³çÖ:ˆÓ„äOëp$ò{¹(_#u°;ÿx$%óÇvzÀßH¢±¾¯VÁ¡‹=1ç¯^/®?úq9ü-r8ŒO3b>¥@–‰“f,#a—ï¤á°Pùg?K¼o•´Nåq,v‚í[Š7æÒ'2 sÂÄÌ̪ìÒãê÷û¡iV­Z…cÇŽaÍš5èïïgçO5c)ZW;Шe4’z%œ:‹™Õö _PUµläV×@ÞíòJn¹”Möܪ:þÔiwR–øVG˜ ß“ÄÐ-޵ŸýÍuñLG8_á’‡•0.‚®ª*sèìèè0E7¡H$¦¾nƵ§ª*×F"tÇe…«–Ôh¾´Þ¢(š… ,÷Úšv/¾š;®$â,yØo;Þ¢×€X…Z0€­qQ úúõëáô›œŸè³§··ëׯG.—ÃÐÐ+â!)ÌN$­hé¸iÑ) »O;¹±TPò˜ÓëØ®žŒ§išk``@ï»çLúþ÷±]–»€í:pÁψ€È‹/¾È„­¬Â+¢(Âï÷c||£££Èçóu ùßô3¿œÉ€^°®[Ç”„Ÿ¾°ºçàað°#üÛÙmvíÏeø’d=“É0ò?½¯g‚2¨¶Í¼=ú“Íêðz YÑ 2±bõ©@4ƒˆO$"V–¥¥ÈÿÙ,%ÍOÆ÷˜ƒá¢¿¿ŸE²n· £ ÂTVÁFýöÕ¨ wÌìN·}½Ø1²ZûvàEQ21rÍÏñºp8ûi|$Æ*›{І‡Ø<¨8  >2ÎdÏ_ðTIr/¾âùíð|+„D"ÄÈÿßüK\Ìrü[oüÀ8K¸ˆÝoš14i9¿·Ÿy.–Ï»òßÂèòô­‡9ÌÃ$ê_x9›A¾&÷ÖÉxê7p|ö¥ Dÿ¶÷„ G]* Óëª#óBñBÞrSÉ3ÿñîÇXº¯`ž¸í‡ÅyO‘’u‰/Ø$(±;ßÓÄeÜdÜ6dˆ›¼.xr=;âŒø4Fþ·BQ¬\¹wÜqÿ<þøãlÿ?þã?âþûïg"pÍžƒ¼mçYøïÿ÷ç0)”`äÿ9<ñÙ/cd€ìâZbttBÞ ÜðäØE‹1!¢fÛñÇz ‰Ä%€PGŒ¡ñ—ÏÁˆ-SôÕqÜÇOþÈø3¬ lÜÖ*ÜcI$:ÉïÆ|v$ÈZˆ˜¥@ç8Z5ÇLQî9ùn?yÛQ3†šÌ\ÒßpV3”¸*àšk®ÁSO=  NE*¤â°†ÛŽLñq,+aÑ´ÌaãÆˆ¿é.">ÒõjË©„ÿ'Oˆü„üogŽ“ù—xÑùXÿ|o[[ö¼«tz=Eûéw«½R¨–üËç]Ž u2‡Ï–¥yº¢(.u.I»qØŸ‡”v3‚ÿat»\9¥lûû }HIõ~ŽÌ¿vîÍl¿Ø_8çhx²·ÈBAÎÄÂR@çSy»Š¢¸ÒëÉL¹ú©ª ¤ }m}kt~¿¨ªŠ¨épÓ•ã-©OÞ_²d ` =¤ÿ?: áŒÙÁ`‘¯ê‰´Z ´ÿc0“ çqÛ5Ms©iIWUkEûììT:ÿæÆ½hkkÃøø8"©kJÚ¶{o&æ» ï—¼D©:T"€‹¢ŒÙÏ…skíÜ›K^jZÒ³PO ln¬cÒ÷ÝcM¹¨ÿþ"‚î5¦B³ÞÏÁzš¶‡Í ZÉÿѦ:/P ìDkDQÄòy—sb7À+{ß3¥ÿÞ?ÍÏ-¶ÞÏjñƒ¦i®°0ªS1pAȲ!P¯ø©º+qq¸ˆ -„GájÈÅ<èøü>ä^™!<Š|²ø–ßf%þÅ$n;Ð9mJÜ·ù)x²?ÅëÁ þêõâÙ,¶Ê²) Oþ¦m­¦ý‰DK—.Eww7$I‚¢(H$Œàσßf'PMû)QŸ’Ù­D~ žìÏ—ïñz geȲ9 %ÿ áQ¸·½üŠ ªjÿùIÚÌmx'¨âÚ/¼Ž's9ÎOŠÆVÙç·Y‰ÿÕ¶ŸJÜ·ù)¬ýAÓvx€œLæÏø4•ŽYðDn7ô7âq¶ b…¡(I…Bª >mõFÊÀ(/}:¸é&"–½iÓÈ)²ì Àl»™äs®ÜŸ}÷gH°ŒE‹±eÀ ÿ·¨ýp/ЩÀÊoÓ­?9Ž•·½F–ï¾bBÚŸ “k;>(£'äaË€Aþovû-öƒÞ à…žÌ&ô’û#àÛ\ƒ}Aô¥K—²ylú?22‚'N°±¥¢(®Í›7ëV±g^<çĉ¬ ¾¼iÓ¦axx¸ªçýŽø&NÁuÑ™Ð|€ ×77§½hÝÙ8rË;8çsŸ"õÉœØø¿P¡€z±g9÷,XP4Ͻyóf& pýõ×7d§vùˆª¨; ™„°³ ]¥wÒzAý¿–-û,6nÜþKOoo/ûTIðÍ8pàÀ8pàÀ8h5ªú" I’ž$Ùp´¤÷<Š÷×Ûê0òìºuŒÀñû‹H,Ï®[ÇÂ"û›Fºäa%—Râ)ë~4ÜÎ~$2„½¿%m=ï¼8yÒ¬4lÝ/I½uÙçœNX»ûûû‰@» ðAß*`DþjÉ1`"ù³ÿ?q Ú7Í&àúžü¶=s?àÃù_Á¹{Ÿ0¥á÷¿;ÿ+ðD]öAКf"XQò¿lÈü¢ˆ´ÅѨh?€¢0Bc;€h•$H’$éëׯgÎÞ€ýùo— œ ¢(²ˆã4òøVN`åL²þcýe#ANf¹)‰ÍL‘®}}}&¥>Òš¢(„¬Æ¥±ëŸf€w´/W»–£³³ÓTz¯xǽÃÙO#"*ˆªæèx‡"cŒ”̪!êx-¨¶ýåîÓõ€~Ø¥ äjwÙ²e&*ÐL‰¼†÷BãçÆ:%ÿÓ:HÑ+ô#¯1ª¢€f@’$¿ÿž@R*Ž’Èø«º‚ “çKé:䇆Läþ½ Â?åê°×ïÇü&Ž hvÀL~ævùNb3P ù_Q×⌤#s4Mq•²3-<Çb'p‰÷->ú<»¯S¢m©è’vv%IÒ¯¾új<úè£,‚CÕu/UWŠ‘¬ )²á IDAT9\÷Ãm#¢òähM»×bçTÓ'!èξ(Σ‘¯ªiŠ-(ñŸv”8l>¥T%~Â"|þK‰øt¿JM~qï™”üÏœ€«:'ˆósM@ï–‘L Ì¡‰î—$IïììdŽçàA·wwwc||###MÒc Àp'dÖãòÑ9ꇢ(®t:­ûEy›þP”;ñÍÐìrEAÎs¾I쵌ÃVöx€¸Ìˆu4úÕŽ;pìØ1ôöö¢³³Ž)L bÔ!¸VH’¤‡ Q%zÞ/âöÆ ädlõ2ê_Ö êP7wî\ˆ¢X$¼n#ZX3ÉÿT`Ù2Ÿi;}ö÷öö"åϘùµá­iÓRZDz̓ñMõ:"öä{ð¿iÍ«åÚŸ Êðõ{àñxðÈ#í²ÜùŸ%þ!2ŸàE¢&‚€­ËYÙ4'ñ‰,BZ4£2ñ„ZêÓñeãþ’NKX³†œ_ýýýE¢hô(–(¶e5j_W x ˆ‘³Rª#"Æ¥)öyÐg/LÄfYBìï†Ë ùkB¤k7êPU rœä­EøÃŠ÷å³ðaü.Zj—3fl¼òÊLdoüàõÞ€C‡A çûÁê¦i®$.Ó5Ms=së|ýPÿå¸ö ¯³w«ÑçñÆ],O3lSò?!øÏ!ýSÂ?p©maº^K]è8 ø~‘ÿÀ#ÊÈBF÷xd•ÜžˆmcûSèÈ'<ç5.P ¹\Ž‘ÿGâ…9¨€ ÙÄAô-[¶ ««ËSÜ?™÷yôÑGqèÐ!Í'¿ ‚ ß¦îÄÝâ(Û³–ÿÀ‘[¼G„:;½†ýæߨƒüðð0òù<{ÆN›6Í{ŒŒŒ€ˆ"5 À÷ÿºìd|Å xâï.Fü€ÏP ¢7³¢(""*XꙌcÞ•ÜÊö¥">LËn۬!ªJ°¾w5›ˆ900€Õ«W3±Yt¼ÝhÑ!I’~bÛNœ»;S‹üˆëÖ¹Ès&¶GÂ???­„€¦á:€ˆÒøÂ䘻ƒö£vò?E5é{{{qÕ¶3â9½÷GžÌ#z­»êrJAÓ4—Ð#èÑ€†ˆMI’tßTž ^o7 sò©ˆÙlrȯm\Ó4WWW—¾eË6/¼)ŠâR“‚îj@Ð℞æÍI´ê¾k»:›§q²àÅQIúÏËær " s¡%û¤HÀÅã–åó.gϽ3|ॻ–#òdyN»r›"@A¾tÖ{¬å‘¬‰ÍÏçæ“„ä(ü™@è2‹Øßï7#÷ !( %¢ÌÇPžF—³r±Û*ðWo± .Fú‡…øÏ·…’¿©ŸFµí§Ä~ãû>°Šù޳oo<ñ¿šök±vtÈr‘°‚UÀc#J€‘þeY. ¢”üŸ{e‹Ôo¹ö c+€1`ë‹Û<ÏĦÏk7•qô…Q<ù"Èÿ«i©ão€KäŒaZ6«#›-¨æøÛ P¿‰Ü·tJöç—W„B˜í)äËÃÅGk¯Î } ™<±sä!þSÐeC€ÕÓ¨? -ÿîM‘H$ŠÞíùr:::ÐÖÖ†îîn$‰ŠcQñæ†SÐ|À¶)^Ò: on8Ŷ]¸îl²n|xïÕ?Añþ RÖìÿBÉÿï½ú§rfm!I’¾gÏöoÍš5ì;1…Íþ¦ú_íòÄÌ™¿Ãü® Ä2NŽešïÿÕwæàºÑÛkö¿#âdÿF²¿eïb8pàÀ8pàÀ8pàÀA%Ô, LIƉ­•“LèGŽÓ…ì³3&Ü&%u¥†‡™€§Ì Ìëí®PBsàZ¡™EtBþ§Ûà‹î@ö7w,ìÁí÷”'Þ±°·?W?Ù dýb÷yâ/?öïßßrvŽÒ¿¶I÷wê+-i·Ø8ÆÕ£…:»”»þ«I3¸êÛ1b8e\ë®ËùJ’$=ŸR068—xß©[t Ï>Ѝ*±ýŠ¢¸EqÍŠJ¢"”MIÆ~U¥ª¾mEÿ[#û–O’m6(áôçƒJ¦ùùà|34»lšFaw-6žâ`^ ê!µ6 ‹g?aÌ@8•ïÈu,v³¢3¨”^õyoMWÊδ0±˜£Ï×ëü¨( qÀr¡DãZÀ×ÈCEŒÁL¸ôÒb¢Z)Èÿæã\Ü'÷ðbZx%Þ®¼B´,»ýLx‡C;`"@Óg2M7Í D…ãÑ4DQ[ >‚פžÙHуTù¿¨ýòQS„3Ó9ᙎpþýªíĹ3ç°t©fŠäDïáô¾F÷ £»»X»v­©ùdhh¨á{¾ z aZXð>h`ŠãòQ,É $¤RJÓ è=¡z¢æëø›¡Ùxäá¹ú¬‡|=;®$ËŒïMV§Y+EqE%èè1+ã!|"›e"Qé8QB¼á#¬Zµ sçÎüK6˜Ê­­åäṲ̈FÉØ: `Ë) ‹Î.>»à¨h×p]“Ç¥š¦AŸ{îÁ¤ïÛuàÊmD@„’@€âëlÍš5GÚ"³ÈG ó\äa"@A Ðë3m€¨.l\IQWZJë<™Ÿ¯¿'ìÓ|Ú·¶Ÿâ—¿ü%þáþ·Þz+ººº1QŸhûÎc7AÓòℵ<{£Q* d&Ч "Κ5k°k×®¢¼y‹Ã9ï é÷+&?=-í"ÁV²?öuºÍ‹á>%‡™(\c_W~XªÉ~9‚ « cƒÓ±yPG(Ä{€Í2©nO€ÇXîÆz¦Ã—"ÏŸFîÇÆ?`ÑëAÐc±¸YîžßŽ/~q+Î>Û~°8Ùó¼ƒò$«ZÁxTÙÀÍ÷×~áuŒþ˜ûy ¦³ñA3ŸA”È|öQ£/ö¥!bïËçÀH«k9îd¹|AЃï’ Oþ— ~µäÚWÜ(#aã$-Ÿ’“ çì“\YMÐ4Í5'%èj,ˆ/0–} ÇŸÜA”&nòºpèС–“Ï2FV'NœÀÓO?m[×fÛ§äÿL¦ûö{qÛN`å'O¡ó¦bBP+Éÿà÷û1jŒ&‚xÎ÷ÿOiøwt@ü*àõ"— çáçŒÿúÎEQ\RXÒáW ú MÆ{’$é„ü?Ǽ+1-kž–ð„º±[Í”(œ/pV ¨+@D Mä¬^½CCCM>µBUUœ»;;ö:ùÿìÝi¬[ä‘ñ‰4mz$IÒ}Š‚vÞÇvîÔ ¯‡Z\C¾GÀùT‹`W=°æ—$I߸q# ·w9V¯^ËV¯ÆÐ]Ë‹êÉçmD„7’"Ä0ž,V ¡¢ˆˆ ƒñB=ÝÈTq>ÚO§ó1ô¼¥ïòªª"ЮAÎÑ÷/¢Wà##o­¢Wiižn·,‚þNPâÿ†ã`RÏ™F®o`ù¼3!ã-®œ;‘–æÙ–YÊ.Ò’n}]èëëC[[.½ôÒ¢¹¿L&ŸÏ,fÚÓàë 5á<œˆãýŸ¡¥@‰ÿåÈ[v¨$O°k ßÀÈ÷¯SAáú§çí‡ñH%à:Ÿ߃w,"vç!=÷£ ¡o…Û›eó五I],v[*=sæLŒcll Ÿ0ß%ãS žyæ¨j=_WÚÚÚ€}•Ó•;ߨÇ`°¹‚‡k€ç~g½7Àz ªyM®XçSí`%ÿÇö¨ˆ^ë.‘þüüsðÊÞ÷p†ï¶mZ`Zl[ŸfœŸ‚ è1­/Œ²çdXmÊ{ž¸8ÌÈÒ<ñœ€Èȇ„‹Tæ.("–[NåJ,çŽ uÞTI{e»X{{Iâ?ßåÞ•ÚÏ Øü«A©ö áQä!”ϰ¼VÝî’ÄzÜÜA ù³·Q©ýÂØ €†mx&¹Â¶ŒóK¶€kGlj «1¿­Úão‚ºAüǶÁA¬…ðî¢E¸ìË—QA¶!ÿ[£¯·"=±¿{ Y¾é¦ÂÃ~ÿ«ßãw.æMs¨ ¨µ.nèñ»wïÆ¢E‹àóùpÙ—/£‚lBþŸ öo½û y •ßž n;~ÿ«ß£ï¹±õ'Ç© I_Gû â?âƒ2zB\pu.ûòeT€í@ÈÿMn0ÔBòzƒ¸!™Ä 7!ûSP€d2i¶Uƒ}MÓ\‰DBïîî6eY†(ŠH§ÓðûÉ»- 8q‚|k›2e Û>44„'N°o²,3Qæ\.‡ŽŽ$‰Šóvþ/ïí)&îq€³MÛÎùܧLi)ñßÜàrÖËÃnþ{"ÁiL8žþàRÌÛ^9 ªóqàÀ8pàÀ8pàÀZ…3*%$IøDÄï+̼G3$²-ÿsDþ¡ŽùŸh‘·H’¤Gü~lãH~Q#Ò/ÿ£ê’ñûë¶Y®.¶ÀùCÉŸM©‹$IúyçmÄOz„m;y²·È~4JT©©@ÀyçmlȾ]»EQ„¦i®Ô¨€HJ€œ#ŽH¼3L³ÚMëà×_(¹?íš× ó×,}›@DôšÖÿïÎÿ ¿ç»$€s÷>QÔÿ™k? L àÝù_©Ù¾ zÄBBÌHü¢hR]O«*|ŠÂ~!EAÀð>¦d¿(bP*BFAȉµD!£çÀ£>j"þÛÿ”4ºÿ~–¶ÞsAE[t3Ù8)IØhD˜ äÿ¢`åLÒÎ_£>¨(EÎÖÔqxP¨.Buº¦Q-h¤5;òÎÀÀ$£¿ÛÚÚš~ôõõaÇÙW#z­›E¶·F%Ž<™ÇÀÀ–*h=ꉆæHXœ!l£ÿ0K=Óq(2€D¸¶¶o©‡¤¡Øå;‰C‘1&&ÐÈó€:¿Se¹ã°hÑ"FBmä8H’¤ïرƒ9Óˆ_vv—-[ƧÛÚÚÐ×××´ûÏ‘Èk¸>GÎÞŸ€$Ýi[‡‹¢WàœÁ¯ UE¹³á:H’¤—º­Žî¥®ÃZê-¾6%IÒ÷úýxspÐDüŸŸNÕÁmDgøD6ËÒîmÒ¸ÀzïäIùq$™ž‚C‘1ìò¬‰^D‡i4º$§ËÔµ¿¿‹¿û®ûá6|æºm¸î‡Û0wîÜêj&6 ‚YT§@þ'д{Aûd_`2fEgbqæ<(ÊÕ4£$^æ–Û-ûšëqˆ ÄÙ°–>¤˜Ô3ç'Ev¬?ŒD<Šú9/4íœÐ4Í5<<Œd2‰ááá¢ë¯³³‰DßKŽ"¦µ#¦‘žÇ£> lûðð0s]½zuS®;ï·^G,6€„9©÷q‰÷-Î~š‘ÿc±Éðzÿب™"(Šâ D%¢…{y–Þ‰Gö£¯¯Á`~>xï…ŠÙÿ#Yr¸î‡„À^iìADŽ#*ǶžAlËØ'»½~?öúýˆe$¤" ò)òëïïÇëÁ ^±víZttt°(±µž‡’$é!EA— >H-™—¾ à§Fº=Ôt BÍãËjÀáxb’(ŠPU•Ö¬YS”· Ñìé’áåL†E»§"tÍÇö$IºÿM?#ß[ëDv¨×é^Qmo©ògÏžX{¼iäEQ\ÑŒjD2#§Q4£"­’?ÇÀ¿÷ðï>´¼ZíÓ!Ë“ŸÛíf¯Bø§ç%ÿûý~&œ³k×.–‡/‡/¿ûŠWâ-HY c_'ëûâ°ªø¨QÒGú(XžZìÛA]U5ˆ>=[DŸÀÆúkB.|$»ðQÜ…¸EsRïCÓ4W£„o+ù?^‚o"„×¾¸OÙìÈfÀÅ7ÿßüK–÷}ù,|ÿ L鵃’ÿ—ˆ"¶¿ð:~v ‰„Ù~«í·º1iGæ?ÜœëÝ Ú¤ ŠöóäÿBž£˜zà L=ð4íhÕ÷eJþ—Oýô'‘ex2 fÑ}¼ÝÇ»ñx÷cøÊÝ·›êËòœ,a¨F°úÇeÄBqÌô^Ï ž—¼ð¼d³Uøío I’°råJ¬Zµ «V­Âã?ŽÇ¼¥v3™vø|£yAÇÝKþ‚‘#›²ٔŜžÇÈÈÄxGŽŽ¢½½èììDgg'úúú@ßÑ[¥xàñ<†ÔœÃHÍ9Œ‘‘,FªlY9ù™ìy¦cNê}LËnŰ!¦Âï£äˆXÿGµP…ÍÿÐíw^ U8eüyòÿ©E~œ½;Íöÿ¥/ÒÔ~àÉÿ€½8ê¤QBðšC4,…ø›n&¶044ĶoáuØE†l¾pªè}ÁÓDR‹8mÝGÏGßÔÚÏGMÓ\sçÎ5½·/þîCèïïG4@ú×€N L ¨^¼±¬c“rÇqRÏ™„éW¼eÚ.IwâªHÕŒw¬sÙ™ÃëêêÂÁƒ‹=ÛÚژؚÝ<Ÿ/LÞÍ›u¶òxÿg©C<wñD&â?…ko·ÎÒTF9áQJüHyò?PøþI Eû2‡c³ ÂÓ<…Ýyȃ'ÿóuöt´öØóä„üý7ŒÈëÍÜÕ4ÍÕÕÕ…×ÝÃÙO³í÷Üóؽ¨î|Ë'=Õ}ç©§ûÈfÍ¿jýqZz’±r­ó4gøÁKw-g÷Öåó.Ç+{ßÃ÷þiN…œÍ…¦i®0Gþ§Û-×N! 0²4°D P¥¾b7ûQdbÓz,à6‘²íòTOþ§ùìÚb 寥ý¼@l%TÓ~wPƒÆE¸w5ö«<ùŸæ£Ç‰¶%Ÿ ÅÚ!Øéki?¨vü9ò=Ç߃ü¿mpü· â²/_xwÑ"̈ö0a>_QYÀíòr6nºi6mšO8ÿüß.û2!ÿÀ¦Ms !€u+ƒü¿{÷næÿ²{÷nÖ~ŸÏ‡›t3°«[Ù6T‹ í_ùí©Øú“ãØz÷ø»IHû·þä8}T ÆögÃ݈ÊÌï$>(³ö_pu¼±°«[Ù6T`0¨'³ÉÁ?KÈÿpC’lO&“.&à†Þˆ}C€­Ë²lÃO™2~¿‰D'Nœ@2™Ä”)SØz"‘€ßïg‚Š¢¸4MsÉœzm5ä€|ÛP¼ Þ}ä?Ld~)+áÈ-ï ä2ï{á:"ðÞž?±ôŠ·Øÿå½WÉ>!]ý¸H’$}Íš5¸ÿþûÙ¶Í›7U, ã *°fÍš¦ù?„} v 0ïËHEö©Ÿ ûš3£Â×¥qõ™Ä¤··ØÿŽúQ€ó¿sàÀ8pàÀ8pàÀ÷*#ÿ[Ó*Šâ’¢¦ôïðDMöGQ f$ ©ˆ^d¹@þ·"¤(ˆf`JYDuž-CÀ êôÅG·Ü¿ÙóóæÍEy TÝ’$é[ÇüÛökÂqÈBþ§äÌ¢ W’°uLaûŒJ¡—ˆõ UQÝkEgg'ö KTyï¹úŽi©9ï£ÔnúBûg_ZJë8b—«>ð}` Èd ʶˀö¯×Kš6äŠÕÑãè¿m)æü ¹ˆ(">ó}%šQÍï=ÄDýc ë»Ì®]»ÏçY4(ºÞü~?6oÞlÊ·xñb–¯Vˆû”ó`ÕG‰¨âSàBü¯#ûŸéa‰å€±v…嫚¦¹D‘<˦…]ÍhðÈŽ8 — ç¸Y÷_þY/Ñÿ;‚ŸËgáü¤ˆŸ>¿^ï€?þ 8tè¨HÀ‡ñ@ÅšQZ‡%¢¨ï4„(~x?‰†9úcr\G?™Ç º`ˆ4õT¨ÃÓúÔç˜ÈÿÇgñG*p|¶™¬\¾lÍ•’:N‡êää$ÛNÊ4CÿÈ!ÈM%Ó‰DÝãäú ¾DRH²ö'…¤Î—S+¨Ýˆ¦ÁB¼)o¢8ž\Fâ‡!Ô8îª9Mß²e Þ~ûm¨ª EQ ( ž~šˆí=úè£8tèŒHõM­ƒ¦i®»Å%:Ôvf1`Pá¶ý6:OžñÐ!H;cP–„›nxxX_ºt)Û–¶„̪ªXºt)†‡‡›nŸöÿn³ûGô„rõt q†¡aÛyIÃý¯(ŠKŠJì™/I’ óÞZÊqæ¤Þ,Μ‡]>2ïmr4f~>¶Ü<GDƒs¯vA?ãù6èÖ¹FüçA÷ÑíÒ@´ázXÉÿW¢ fºd‰€LLC4 !@Ÿ°Í¾P@üM7.{í¦}‘'óˆ^ëÆKw-~°«WCCCMé;!DJF¦H ðtˆr‘ƒÇ2Â>¥®èàôzã·ÅnèÈÁ…Ž"AB£z ]CÄ'BGŽÖ¥®ã I’~Õ¶w-×UU‰¢þoÆÞ‡ü².`P”;1ÉH±|Þå¸Pii^Ýß>xô÷÷cË–-ÈX =õööbãÆèëëÃÀÀ€NI?µ¶·\]&âxÜë===z2™d‚{å–ëA)áQõ=–‘¨ˆ¤ÝÚ¾©…¶[çp>Œ„êÇB‚ èÑ€†Ð·BÈíÍšæ(Bß að§ƒd{ úÝJþokkÃØØÛòù½l}áÂ…xê©§pÍ5×Ô}ÿµÎ‘Xçä˜èH¥ó­Y×âé¾AЩ£ _QÓî… ÜR²ÏéùÇ QTÓ7‚ è±=…/fgøÁ+{ßÃòyÀ¿ü¯}¦´ÿò¿öM˜@3ﱂ èê®â÷ ÂÓéE, §AЭÑÕkÇKŒ¯¾pа9b¶N£ÂóDp~>£XëO ¸Y{Ö† .ëpºÛŸO º$³ëZ¬ô«e‡\_û­Ä wP>¿~Üpò+„EûOçñ/º– ò?jÔà S_öåËØØp’;W3"¿—-Û zS¢¿Q'V¿öéн¤°_Nž@u3Èÿ<( Ý®ý|€Œ‰n?%úu*ÝÝ Hý.(Ì­¼í5l½ûŠªÚŸ ›¿Ä5㊴i?˜¢Yíƒfâ´¥¼”èï†n=6Ú§„ýRÏQ1eʈ¢ˆ¡¡!Óº¾ªÎŠÎ¬šX·8s^Mé+átj·R¹Ë–-kª]”ü/Iw–MwQôŠ–ÕÁz-ž0¡Ÿ †¦i®%Fä˜Vî'ÊN)ÔJ(WW:>h¬ ^hÚ½0Û)&ÿÓÈVfd¹í¥£e ‚ ¸g/ÿ£ "4â8/ÔãV¡výGÿO×91<<Œ fniT:Î"œÐ()é8øÀ©A­åšR×löbd2EqM “(+Kòq¼šO¢¢x½l†©²xäa?<sˆXJHçÏ÷þþ~,þîC¦HšsçέëØE”© BˆJEÇÜÀwE-«ª=wÖ®]‹®®.x<ž"ò?ŸvóæÍ,ò:í“Fí[ß5Ò¦ ?}aº(ÝO¥ÈúÕB’$Ýÿ&!ÔU*Ö¯™ }`m—œÉ0ѺLá¹Èÿ›þ¦DÀI¥"xñ7/"ˆšÈÿÑŒJˆÿ©H£&ªlD1>>Î~££õÞù+C·­+üjp@¢f4ˆ>Ù,pÌ{¡‰€½Ô3=2ÐÓ¢)"Bè<г‘S÷ ýV7²ÙÍ>€‹oþ% ^‚XlgÓÉÿ†–ˆ">õŸ1}^;Úou£ýV7æ?L®Ñ%¢ˆªZ×;v)ÐöO=pûŸ=ÇgÏ`ë…´ÓÙ¸K¦ƒþªéMÓ\ÉÉI$''QqÜ6YÆãÝ¡ûx7ºwã+wß Â…àûAÂ!€6Bþh2Z;|ðÀãeâè(þw<Ž›¼.Üäu¡³'qq@ýó•@#Ô®]»ýýýßùÎw°jÕ*¬Zµ ?þ8 «« [¶liz (KÂP–¶~õû?ÂȦ,ù"†²$ ig¬%ö‡‡‡Aªª¢¯¯èììdQ臇‡±téÒ–ØïêêBWW#Ý{þ÷kèþÅ«HÍ9ŒCt¶Ñþ·>óBò×b³[T·¸%¢”ÜσœÕžhBE8é¯ÕóNôÊcªjÒÔ‹+-ëˆNy½D€ŠŠ´<ð[bc0:çÆGo5")ZLc¤S+èùXj5àïÛv‘úíÈÿ4}jT@6WŸè(û_>ïr°ÿ‰ Ãþ<åNÓ6yÅ[ Õ ÷-¦¡««‹mãÇz´ùý­ÂDïjêðë¥ë jíØ:Öº:P’ÿèè([æ·'“IŒŽ¶fn$’ Dhqû{K¹ãct¬¹~”ü?b|íôšçr{³}+d—µéàfJS š¦¹æÎ‹×ÝY–ñÐC“™Ø@Èÿ,m™s¾ñ9G{DR–.]ZòïîîFgggK®l¶øÇÏg€Òc~nªVò?Oö?–Z\±®Ó»Z2oâ÷ "œÊ³ÿZæ±éœOܶƒ§Ó O§—¥ãˢ˙X€¥+Z†Ý|[©ºjšæâÛ¿¯@Üþ¸´_‹µ£ãóûÐñù}%J1ÒÇÈ|´;X|?.×þ|RøôÿãÖþÓuüí°mp°@üÌ$lnyE(„!›çGTo%Ý7Ý´7ÝÄ'%ê—Ø¹Ï$P-vïÞ] þ—)Ñ¢EX´hQq-nÿÊoOÅÊos¢À%ꇷ˜„ªE|P.ÿË”ßò 'd“°4 ´?™MÿMeû‚Þ ‚Þ`ÓìÛ];Fp¤Ói&þJ·Óe¿ßt:mz7,WfµxoÏŸÌë¯þ‰ý ª(H#?!]»ÿ P<ÿ=Ñ,»j9žþ zñn8pàÀ8pàÀ8pààtãÕ$¢äÿh¦<¡GQ—ûkQ=ñ5\1Jþ– |ð6¿´aƒ¾×ï/•¤aðÄÓJuÐW¯®x[”üò¤½ú0o?]­/ürsH§«Ý$òä<Ý¿âÛ}•ÒëÛ|qE'ÒMrúð¹Wqûs·àܽOTì‡ÌµŸÕÑÁ {pûs·”Jjô"'ì÷SòZUáã¢Ù[áS¢™¢™@”8 ˆYUFgâ‰ÿÕœýýýúš5k*[<Ù8)I* TÖ–QòPQ°R’°Ñ¦(ñ¨=zˆÕ¹ºùJ’$½Ò]=õ°³»–ë´/ݵ@e²¼]9Kð¦ÿò(þ}6U¥‚-ÌŠÎÄ.ßIÀÿuˆþ·ÚÅåpºŽƒ•Ô_ÉnoooSìò¸(zÀùÕWªÃ®aâ!5Éßz-Vº¬”$Ýî:l<ñ~c÷êÕú³ëÖ5µ&µ=ðDÿòд= QÙªIOŸ›íÚzX»¶*;MC´Ñh'Š¢¸AÐ=hL ´Aþ·K ûHõiQ„¦ÕGÈAÅ&#ûSr£ä;»Ñ•’îó‘ç{ d2ZK¢nÐþhoogQù|Þ¶^š¦¹Ö®]kr@kìjoeÑtQé8¢\ä]Ž\Aôm=/©•=„“ɺ oñAn°Ô{+Ðñ¦Ç›ZàüNÉ*FRooogÿÖ(ÅÍy×H³ó+-¥u!¤w ž„ßèyHíU[žµ~Í_« Ž˜Óz.òþ8Bú§–º¤">¬Žfàó ˜û…¹˜ º ™L90âÿ¾ýÄIµÔ{O£àóù<Ün7FGGÙyFAÉÿn·ýýýhÆ;`&þKY ŠW!ΜÖË̸­(^ˆøzSÌŠ×4—è+D¢œu¸d#Ú’‡DÇ6DZöÜ£QUŸ¹ðzg¶Þø&õ¨˜ìù Âá‹Z*CÅ&íhCòáé˜1ƒD^þ­wá53KÈ}¾iu0ÈüúñÙGÙ6Bê߃ã³/ÅÔoàøì÷ŠˆþõÔÁ. zðýb'ë;¿óCäfNâ1òç9OH ɺÏMÓ\QAУtÆ] áÜ |dTâÉõ@6–}BkŹèòÀÀ€>00€Y³f±ýëׯ‡(Š„<Ú" º,ú˜Ž}³È¸wd“Ò΂@«í ‚ ÷÷÷›"ß-]º˜˜ö±=*†ÿ øJüز…ÌU5³ÿ£ªwPAN´˜)*aNª 9)Š"4UDBHЦ›K€§ÉEÁøø¸íœAP°F.oÚ@ýŒçs€¬s)8{w§ùqönóøêŸŸ‰3¡ÔS‹üx·?ܰmUUMBkYöSÍ|÷’$I߸q#âoºqÙk¿ÀÐÐ"Oæ½Ö­ósn¸k9I‡±z5044Ô’wÌñâó1’*ì·ž™ÎGAtÇh;MäÛJ i=dY®ë8È+ÞOÿ„[ðNP’¥çÔ?Œÿ÷ä‘Nb\½ý?00wP3õ1Oô·öq+8&òx—«CL›Š+üú„Œ•3‹ëðò WêÄ4 z¼vÂY%hšæJ&“:ß›2e r¹høþ‡JÚjm»QªêÿZ®úMF²2äpS›â¥U¶<@*UrõPU3gÎdëÏ<ó ÞþÆØµ966†™3gbll xê©§pÍ5×ÔuÝÓñÅé:ç­È—0kÖ4´µµaéÒ¥)ªÓøø8ÚÚÚ0kÖ,dŽ+]Xž]LçÑò½ˆÜÒÔw/žü_MÚïýÓœšò4k?Uê7;Äh(DN¯”ž·N呉à § îŠA\fÌT™*»)ä‘,‹ÏÛA§6¨Mk*¶‘'ºÜÚŸ{e„ð(òÜ$-Ó½ímäWŒB‹µ#oˆâÖÒþ|R`ÿ×öOôñ·¢ˆüÏÃBªÞ68h/”&pׂ2e˜ˆý´^6é;÷˜ ºûRùŸ‡¥ý»wï¶(Q—šQ¦ ±¿Lû‰ÀžªM‘ÿyXÚ”íJÕ¥ ”%ÿÛ¤µ¨Ã~¹ëHUUtww0 ÀÑwïÕ«WcõêÕH$J8ñT(ß žø_í¼¯´N‘[>°1LˆÿµÖ‚ÎoÞ¼¹âw÷ è>ø`­&Ê‚’ÿc™Ê¾‹3’žo²ÖÁƒ1ÑÛ[Ùÿ.sígõ¾;ðô—b6·"8pàÀ8pàÀ8pàÀA•¨(àþZ´æBÑLåDeð¥ jÎ3¿d ¾hÒÍ$×Åû™_Õ~̬8Ýí¦Ð· p­ÐvÍ+›ŽŠ€Šз ð¯x¡b¾JÈ\ûYœ[cž³¢ˆD«Ê'„T12GnAñµ”ʬDH2ÖråÔà —w˜á£¯Ô‚Í›7וbåÌúºzmXÏõÿ%I2 ™ÈY¹¨_í`? D3 9K’¤‰¼ÆÖgÈà¯é(‹<ƃ·Ãç)zEÕõ Ä>@æ<à¿)-T"Ÿ/Îa ÿ[sœòN×q$I÷=RRyvDÆ_¢•Ÿ1|È|-Z÷ñ—$Iß±c[—e¹ªk’ÏË–-«¹´ßß@c›ÈY¨¢ïàÂÁn¶ ¿:ŽÁU?ØŽëöøÂw~ókÕ=ëÿç'¾TXù—pÕ¾æ°ïàc…ÖGŒÊ²ÿ±v, Ví,JÉÿÖÈït^hç¾ûîÃÚµkÿS‹PЖWºòJ¸‚Õ ¯÷€ }®8.ï EÓe³7¹ö àr„tQMcšIH·‹2Fõ׃%œáj9Õ 'ÀLùgyO(ÇDªZMÓª2¢}ÜÙÙ Um.‚‚ï{EQ\8×ìÙ ò}+Ó×R®$IE÷i^ðH_X^¨Çô}'“ѼȶSÂ?%þ¿ø›BÓ¸° êGõ¾ÿ¿€U!¡¾vÌ|¸ù¤MÓ\¾0yN‹@(ŒõL'öâGÑ×€s?‚: A˜®kqf¾øæ3ðÇŸýàü¤$ësp­𦹒¸L_øã½€ÑNõ DÐm­°)Ó'<ª&OþON.8ÅǦÆÿݷ㫉ë€w ÿ¨>lXÀn»¸8¬Ï2 6uÄ‘Œ¨P_t³Z!‚.íŒÁ÷ÿ<ýôÓ ÷‹V×ÚÿÿþõUÌùþ°ï†/ Äÿ‰°OAÇÃù|###ìy;íߘ ˜9Û…ÎN/–Î9Œ®ðûMµO˜БÔt±º¦i¢’.úä<€T'¬ÿ't ë\Å¢~§ùÍËz!íÏç |±£îk_=bf]il³ÎeŽ‚þGQx»­…ÝÜÛDàtœÈ™¸@åúya‰)¯\ã‹?؟LJñƒ Hÿ¢(bá^ÇKé;¡ªä¹ÿNŠãÿÆÒpùj>÷>N×üÇ¡.´=˜Š8€èLû:¬”$=¢ó]2Tµ5ÏaMÓ\:$ tww#‘HÀãñØÎÍ4 Öÿž*ûß×ÜþïôzÛ[,„éé(,âì¡o…0øÓÁšÄ+Aý©§ž@ˆý0sæL¼dìŸï’ñª%%Á× ÚçZ\#}=ýÏ\Z§Õ«Wã駟ƱcÇlë@§"q‡ª«N¥Hì^ w8›%¢(šv¯i;/P!žÖ!¶G-"òK-¶Mo%ýïŸæà_° H-núÜg½m*‡FË£äoy¤p­ò$ð`öìÙÈÄ*—EÉß4µ~òH–ÍkE©v~œÚOÉÿ¥ÚŸ{e:¶íC~Eí¢/ÿÚ:Ž) Š"@‰ÔnèoDâlÿ6ƒ™;#ÚSHC#¯7ƒü΃/3—'½ÛjÊœV‚'`¤ËÕÀ>½{ÉC v½A3Ý ýgßýÛ¿{÷nÀÍ?ºyÂÛ¿õî+t\@æÁVÞVøÖ¿õî+Xûá^@Ò¼½ .“=BàÚŸ ¾ëÆÉØÃK´¦ý6åƒA6FE’Éd!M«úß@.g/ŒËåÐÑÑa»¯V\¸îl Îyß‹î=Ÿ[#Ëÿ,¨ýܹþúëkÎS ÄŸ¤¶¾pš7÷¹ö³¨Õ›Ñ4Â8pàÀ8pàÀ8˜hTÈ?<’­šxYoÏ®[‡Od³Ø ˜"^6’‡j%$X£/µ*O)D"CØûÛ,²ÏÎÀÉ“ÕE—®'§³Ý’$é~økE½ùJÁ÷äï°í™ûñás¯âܽO´$O6 xº-a&ø‹ Df9+C–´ZÙÑIEÝš'Ê•Ñ4xº‰ÍJX¿~=âà½ÿþªéúõëY ö(ô[Lj£ñt}<)I„4 •î&[Ç–FÞF<älí̶zòT ùÓúKw-¯x/ãóüµ›|D9EQªø°D¡ÃÀÀ@S×§ë8<;R{õä)‡Z¨ëÍc[N}XOÞ@»†Ô¨ÙÉþëC#yy‚ ïŒµãpöÞ¯˜Ù?|¬í4ͪ« ºši‡è³:õy!Ä…·Ã¬àíÐt„0Hx^l ÉP³ˆ¾Q ‘KO{W­ZUT&u.Ÿ;w.€b»¶µØõoàÅßÿsçÎmÈiõtŸ‡úŸòå£û%—¾éèè€Z&JUvÝÀ9\ˆö𦹖äÍ÷ˆdòÊ‚]µ1»•0Ñ„ô¿z½ ´Ò˓ɲ㙿z½øD5ƒ» øÞÃ}¶}o_˜xb8û¾ITìºêrà 7°(K•„Éèø£­­ ÃÃÃuÙ«é ÓŒôþ_„ •Öq¤4Á?-¥ëz×€¡ÈT@6«s/Ú¦£ÄÿLFƒ_‘VU E¦"›Õ™EºAþýg×®]Èçóe§bÔQúD£'• )1B¢kïSrÐGI$(!-@ók,òS¹¼4@ò6ôÞ3-,è17‰J¿´g:21²,úšO{/tˆ x½7¶ÞøáaÁ„“n5Ms=së|}ÆŒ-xã.„ üO½ðç–ڤ˭L*ÿ)ñŸÚAOL5îó1 ûâø,Ÿ,.#9¹üóª^hšæ:tè®îŠAîˆÃ¢h]$`+&…xÚX>tè&ôœJà3âïM†xHhÉ5W ‚ è³f͉'pìØ± #þóì»ê!ý?çPkíç<€Tf*:ç*NNÕ ~ÌSN€q`` e÷Jþ?{wÚôOñø¤<ï²LÄ£þùEB:U§%ÿóW4Oò‡e;¿ÿåZ UÞ^2‡þŒþçDùÿÞÞ^¦k5&ê|äI-‰D¢ì5¦išK–eFʬ‡#‚®ª*Þ šIýïU"ò#ŠX>ïrlU~IúlÑ;ÕùI2fz§G…GC±Oç5ÿq¬Ë|—Œrdœ4ÿÚ³‚'ZQòGG[n™]_…þoiJî—×ðMqó|ê÷¢­­ ãããøOµAΑ{n3D(ùllŒmÃÌ™3‹ÒÒ4tÿøøx½fMø8œóV¸Ýn;v¬äþ«¯¾ºáöó$w:ηNéDR‚‘¶X€¢VjËJþç‰ÿvÂ< ÄBº&‹Ø½óÐöMÄûÔn,àfQÙíöÏž=±€»â÷º?pÛ’¿)ÄÅaÄî²QÜ'Ín¸ ¢lûó+.€;¨!Ÿœ¸w;ü—<þy¸BnYçÿ0òÿŒh"P®Œ¦Ö©B™›6HþrªX€ÿ¯ÆNIÿÀÈÿ7ÿèf(u¾B]ëF™2·þä8#ù¯¼íµbþ¿ ;qwNçÿ0ò¿7Fæ}z„2cûFÛÏ‹ pƒ:#û»Qú~ß"ò?wÚÍåvtt4MàÍ §ú‘ðÞž?Õ4ïûæ†S,@æ}¹GìÙ³ãããØµkWÕ¢¶õä)…]¾“˜:ŠÁA VAˆº‘<¥à{òwè;s dó­ÈãÀ8pàÀ8pàÀ4%$IÒ)‘¿^x¼D #šAU$PI’tJä¯+ÀïG4f6ù¨…’$U]Jh¯\$Œº"0S"½ð~é dŸÝIê­ÚþǡݔÄïZA¾véÛøW¼€´k^}ù¤yuÕƒùïX؃۟+M:,…I÷9¼ @Â%íkšæŠ¤ ç¡ðÁŸFàn„€ëñE¤QpT ‚ŽTÁ¶]>I’tJ`ió7ïV<’$é”Ào*`· ‚ OÉ*¯ù¢rãV2[å‰õä©„÷Bã Î.”(U&WÙå©õܹwØát‡Ä¦ÁšK¨'OÙòê ÑÖ“ÇÅ}TÛ¢zòÊ9Ý*Åyýo½ñE€;êÏåFòÚáo‘Ãa|ºªt›1•ˆ³§ÛN3Ьºæ¸Çœ(Š(yŸ8ÑñvJ=·h:j§àD»€=Q4mnô˜ìöÄX»v-[¶³kµIÅ"š†Å=Ô4!ŽšúYÖ”Aª•ŒÍ;6UдÍp†*g×z,ši·&š~Ã÷$m9œ®c˜ß×6nÜÀ<¦°‹BOAÓµµµaË–- ¤,nÓ))Þÿ¦¿râÿ í-GF¬µLI’tJà§ð‹"ÒL@Ð,Éû—ªªHªªñÌ `< òîS×»_¹÷*`·€©.‹›¢&V=÷@ üv`Π6ÛI Û\cR õ½•B4 Aà2q¾pý‘¦ÊŒ¦ë0cÆœ:œ}ö§…øo­Ðe"ëLÚQôÓz0õÀ8>{azKú=)$MAôàŸcÀÿÏÞû‡¹QÝ÷¿oñÓ µ}„ˆ¿ü0µ¥5„úÒØ–d÷rMÀf¸Kš'|K|¤÷i‚vMžö’{o6Ú¸m~µÝ¬Ø´ýò öî:Ím ´HNIn¾°±Vë5?\RvF^º²’ìÛ!‹F6P›€çþ1sFgF#iôkw Ÿ×óì#ÍÌ™ó9sæÌ™3Úy¿Ï4^? ù5󸆛ˆy4³LVdÿvõ³­Œ¤ÁS/½ýð ×¾ú¯uÏôÚ¬øó)üçñ»ººhゼSÊfÇû|À¹sH_p6$ÞYÐ>`>èëëÙNÕ’Ö Œ1õ‚ÕîC\ôfK'’Ïú´û¬.úç}?'ŸêÕÌÞÜžEœÐ˜LL ¤(hÓ·e„Oþ½_Q0ؤقzè!8pÀ‘f-iÖq57@­•ÆÞ\ŒÏÓûý~ìÚµ ;wît4gŒ©§ÃZïücY£¿Þÿå7%ë.ìù#“aÀÒ¸ÛdÀ׿ßûŠ\쯟K(šOÔ›§ñèBÁSCÚøž‹ÿ~`Ýçž7þ·vôèQtww›ö›™9£GbÕªUèO¬mZyV¯^mŽÅ€˜ÀM.«W¯6„ÿGŽ1¾¡»»{QÔçùÿ½Ó*hç‚;ìúI¾-âÿØA­ïåQø”1ø¢¶Ï—¿¸Á´-ºÙm2ÏIyœ”·ÒúùlwÑD©XÑDÉ6^Žh"[µoŠ&Ì&§vi:¢‰²±Šf6^lãeãf ÄÚΟÙ[5ÞwçßN€…kå` ÇúGðä°öÎÞ¼Ü2Áuµ2ŽâißÀþ#*-·éÓaÞ%ûdáú·¿ ÀÃ_z ÏB¿@ÇßfË0„ÿøÑ_ýNËŽ?ÕÌh¢Œ k¿ûŒ(éy;~.þ‡Ãj\Š›ËÚÄgë³õ9èèÑ£%Ï;õüîÌüvÔò»ï‡6_ þß}½^¯Ê…üõÂûÞ³gO]ñ¹¿^z{ ‡Xª¾ãçBþÉß\‡•øyÍñ¯»î:<ôÐCø“?qþþAAAAAA4ƒ€J/x5’¶YÔÓšÞ‰¹Ueivž Qÿ­Œ»ŽÝ.ßo<=RWœˆÿìouT{1f1œ;ø‹QÃÌþE(EQ\n·»áòðcJôwëdIÖg#µO+’zÃkÚ#£HÕùXx­ÿ?ð!}ÝJùðîø £rx½_Çkýÿa,çz¯÷ë5•ƒ¿äP õìcÇBžWÇúuÏNÉ8;X:‘m½çMûŽbÞñÚDh<ß}ûöëdYÆÎ;•aïÞ½¦}õuŽÅg€¹ÞÚê°© â9PÅ•È05àWŒ|?öOácBš™Ÿ>ã¸ýk뿎ýÅS¦u?úÜ×k¾8ý³_B:›†Û-+ v»ÝèŠt1l}ÂüùŠÓ šQVEQ\íÑŒj]׬8fÛfµ=Z\ÏS“ÉdYqv @6›-;n´Æäy2èæÍxã´)Ò IDATµ¦ão÷ÙúM@*½ødÝn¥^ñÇBÆ­F«éÕÊÄSwíÚ…tZS8yËãñ"{ï½÷ÝwŸ£—ð[U÷\d©ÓI9úúúLeࢪ¼EðÍóv»ÝØ»w/¶oßnì×××g2ipjW+ÕDñï7æó8s¹œ+•2·?±=5kìïÞ¿—3viuY ÈxkŸƒœ”£?ÁÔ˜OA4ËͶVˆ[ÌûuÍš5ó.¼.‡XEQ\q\?/¢'­lVtKÄÿbërœEs0{ÉlÅô­DQW˨k°ÛuÓÐf‰~+ÅdOýサÁÅ?™L.hüx6;¯ñû¦úN§‘­ðœÕ>Ü®ÍDêãîJ\ÖqV%3Örc²F XíH>ëÓ¾\Côï¶þEqy½^ÕçóÁï÷ÃÝ1jÚVkLEQ\ƒ‚È/‰hç@KX’º!7¨k>ôÐCù•×〱ÎÎXXäÕßù¶owþ›K­4»=¥Ç²}ûv㹦¦¦àv»«ŽãÝn7¦¦¦°qãFcÿíÛ·› Ä1¸Uȹ4®ë…æu:œ7Öçóyx½5¾ó}¸q€¢WÜÞè}QQWwwwÙþ7Ê2*ÀÝ`llÌdÐ(‹éúã´)CP2@%#[eÿnóÉLo¬í¸ž}"ƈnv—Mg+þGQèÏñ„ö—nû¢°oⶺÆçb9­õRO=5“XȇÀÆ b!=÷õÂ}[´ä«sµíŒ15¿?†‘]ÃF,Q0¾Ì×ñûž<üÃ9àÆC@øœÉ0`!ù@œÔcýÚ{ .þç&»wo€œÐú˜@Îf»¯Ô‡¿ô0,¼øŸ#˜üè¼Oý¹öÿþýÕï´äø¥hDühÂ@¯w e±«= æßŸùÿ"¬Ï;<ŸfŒKæëwß…~ÿg1ÆßzñÏmåÿÕâ×k@AAAAArPý‡ìÐ` ýÚ?9œüè.OI ¦LÀrÿ )—ßMããèïìtó"IÂMããx¾³8 £¸ŸSá‘{÷îÅÆ—%—ËBk »rTËóéŸ â²Ërÿùi Oÿd·þ~QˆZOüfw­±9ã®ßCç'þ ã®ß«š^LÛ©þ›mœzÊpéР޾铎ÒÀ“O— âMŠ?˜Ê£Ó]Ãõ§‹uù5Ûhü={öÔÔ²Ù,öìÙƒ{ï½·$ŽÓëþÄëEXù¹Z\þÏÏ_¨Ú~Y^š®ô‚X¹¼eIûG·”Nƒ¿ôåôŸŽ|_'ñ«•c¥ü€Ÿ,1f0wZc_}&ôjåàùò™‹âuí$îÔÔ”i_šÄçVZ}Êåõì”¶ï˲d¼òç4.ß·R\'eàB3ñÇÇ.;+Cµzê«{kåÊÁó³{¹|æ§ÏßëiÿÖ< \@õ—3xºíÛ·Ãï÷ãèÑ£Èf³ã{<øý~D"ìÝ»×±à×ëõªÍˆ#ÒŠ—b›U'bÙø .€¹4Z'Öã¯öbžõØžx≆cÖK+ê¨,Æó¶ðýË °k,†¸Õê@¤Ù‚ôjuaâóz(W¾|>ošùÕ©B«ë¾^Dá~-,Ôì«ñ3)×–«=óˆm‘ý%I-yîáû7bü·gÏø|¾ªéIJÔò T-ßÕ{‘ Ööt(—Æêǽ8r§óç ZQÅÍÎï¬©Š¢¸fggíÌ¢ó]®7Öþ'ÊxⵌÅtxYöƒó&_èã§ø­_ëØ»‘g€f¾ôn5 púx9EquDKvâýW_V’zhhLÄ®NÎA©- ó¾¸™õ?ò+_ÙôÍ0!›ö4>†žšš2=‹”C|î·ÂEý†)€ŽÝó+û€2“ “¡€ÏÎ|·Î:nêØj¾Ï÷b,ƒ]»àçK–ep#®rmˆ90²ŠÔòÛ““ß]œbßsísk5`¨¥ÿíÖ¬û;†ÅuýYËíÈ!Œ@NšÖÛ F0ˆÑºfž™?#±Êz.þçÂ~+Ü8€<³ €•rýo³˜ïq©&Ä6>[ÅÈ®aK¬ÅÁ|?þAýû ,ñ?ð9ÿY¸Vö¨Öuó[t(®kEœ/|û ‹òøáÛ¬ÀþJXׂ8ÁØè‚<Ÿ—x¹\Î%Þß< UzÞ©çݸòÁ¥È_¯š(ŽÕ×~ƒ+\Š×î?Ý”2ÀÝwßmüŽíäYùèÑ£¸ûî»ñØc•Ĩçý#_È‹h‡³ß¿`uïIøB^dÅßB‰¿mÛ6ÃøÛIü¾‹`Û¶mØ·oŸ!ÿwú¾AAAAAA4ƒ’—Ÿæ‹j³è´:®•….ÇBÆ_ŒÇÞ©Eÿ U†VBñæúc‹XËÁEDR:Ôåg|)G¢¿Ã?[gN¯E~Q§f⡉Ÿ¿^s9^ëÿÃÀ:{z¥sÀM<Ž=êèE^+âÌuvÿ@wÚÏ×y°Æ½´_3’yY–àw6{±HÇú €³ƒãeãŠXËÀ étº®²÷íÛg˜ìܹ³b*Õ;€ºê€aT騏ÝnSÛ×ÊøõºÊð±¿x @Ñ@¼œôƒ¢¡Óóàdë‹&­Œã(³ Xë¥YeËÆSC úÌxÙ¹™uâ´ß]ÈóЪz´ë‹×o¹—dÜ+‰ÁPÏK8­ŠkG­c’FÊUîl¹8™}³RZkYjÿ×{ŒNÚ\9*½˜nÍ«–´Äâa¡Ÿ{ªÖ²,t|âüĉÈíƒÕÑ(޽«¥¯4šÏþ¿Ö{`³ê¡S„ùнêßJ«ÛcµvPîyîŸmæø{¾ftæåjäÙ¿™¿¿´â|‹çÐÉ,ÃÖç¹f—A¤RyšÑœ¶;»ß€æ¶…ZûŸfÆï;üøZõ[X=×Ãb¹þìÊÀŸ@,Uýwðjéûs×|÷¿µP®l 9ö·–©Ue™¯8µBÇÿÁ>~‚x?ã享÷Ú\,¿û.ôïðôøAAAAAÑLêþG@£? ×³³cÚ±PÇ¿â/ô9Xèº_ eø Æ¯7n3b7ZŽÅÒ5RŽ…Ú· uÃù_È2Ô’O3þ‰Þèõ¼˜úñÅùjÂØZÎ]¹²VŠÓÌ šQ§åÊj5àßë9®JuÒhŸ_ϱ9_o9ìÒW:þZgÞZ(öb~ó¶ÕªrU3¨¶µØµˆ!œÆu’¶Õ³½ç?‹eì¿ʲÐñ ‚ >h4ò P‹§.kYæó¾Ã¡‘ò7r.·/gÖúìWKìry.Ôï_Íh‹}LîTXãD´êä¹Ë»ßyœÖq3Mçê9ßÖçÈJõW‹a]+ÊPZ„ɵÄpò»“x|Íúß™Ó}ís­Æªüö[Oÿ[)ŸÅrý‰y×ZžZËt>ô»œV÷¿AñAf±üîûA}ÿh±Ä'‚ ‚ ‚ ‚ ‚ ˆf@?BAŽà/z-ÔË\ ߎù,Ób<~`ñ–‹ ‚8iĸ‚îGA4ëX—ƾÄy¿'R%‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚8¹`¡ @A,~cêÀÀºººjš©™ñ….Áñ3ʂķƒ1¦† †Z_&Ƙ‡±fÍšEsü€V.eD2²xÎ AÑzcªõ¯™ùšÀ¶ZÞŒ1• qšYžóêqD+à}I¿¢”lëW”yík>ÈýQ'4#j7AAAAAAAAAAAñ~„1¦>üðÃjOOÏ‚Ocj.²B}k ð…1¦JÃuw¤uecŒ©===j{{û¢;~@+ß²P_|ç‡ ¢výV¥¾Ìëõªü¯µ%[¼0ÆÔHª<Påá€:ñ«‘@ã÷ÝìF ‡ÃÆ=1¦ªª\6oq;cLmoo7òh¦)A#Û«í[MØË3Ú\µt¯¾ú*Ý‹ ¢Aø5ÔAØ÷mŒ1uPãúöV^wÚóÔሟ®ïÖs¾×¯ŠhcþyþAAAAAAAAAAÄ– ºA‹‘zg´mÖL¸ ß¿:Òì,ß7¤eÿBaÁq¥ºAµÁSO‡ó&·6›üA[Q·×ëU÷íÛþçÔàý(ØÜÑ0-ý~„Ú”º•1¦öõõaݺu˜››ƒ,ËPÅUKŠ¢¸dYÆÜÜÖ­[‡¾¾¾†ëž1¦æóeó©¶½ZÞ©X±¯lÝ1ÆÔP›‚þ7ú;܈…|Uc½/ÛAÌŒ1õ™‚‚Eq¼Ïˆ¢à™Býý_¥²ð<—m}Ënë+YO(Îr/þÕ“ÇùLñ¸S@®-§}s [*‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ¢!È€ Gˆ³ÝгßÚ­?ŸãsAE__úúúêÊ#‰ ‰Ô%Îàûtuu¡«««®ø|ßfŠC6]x‡[j2Pãg”˜MR±$itÞb?~À\çfœzn¡JBÑïÌ€›ð~õžµ%鏸_¤€÷íÑ Ú£@0èB0X“VßcL 4CÇÃãñ˜¶Ë².²·þåóeÉ”ÞãñàðáÊ÷ͺ ×bdI†”N#‘aÓ‚‚Hé4Ün÷<•Ž >X0ÆÔ~]øƒ È:Ø'«§€~¥y&Ús†‚XȺëzìÿö]¾~1÷mó€Iì/ËÚÊp8Œžž¾½ÑüÏ´²vèAAAAAAAAAAÄû†‹ºA,~¼^¯:wP›=λ¹øÝ”f³9M.—«_ f?»w/À·}»ñ]D\ïÛ¾½®ø\ø¡P044Tsy#‘ˆiyttTu2‹-þÀ–-[Éd²æø|_N2™t¿Š¢¸:¢ u`àa`záp_Qˆ}8‰þ„&õy¥ n–$©ˆ&´{`¨­ñ|×­[‡ýû÷›ÖutD‘JŇ«V­ÂÑ£GhæQSú¹¹9ÜvÛmF‡¸Ýí%‚P;‚Záâëù÷z½jÇå9ôöÇ•½=`d)˜ÇÚŒ1uffƨ—™™¬]»ö¼jS±ˆâxY¿Ú³g+ŠâÔ÷yY5› 6©?_¶õU,[&#”¾ ½=€,ùô˶þ3–-“Ä}†hÖ~²U}ÏW€íÛ½ðz©©)š@<WkŒ¯¶··cbbB<†ZóX8R0x½^äPú» AAAAAAAAAAqþpÁB€ ÎGzöíù„‹ÿ_Æ ¼Œ°ŠÿO=œþ@.VLsäÎ\ÓfÄåâÿ_^u~yÕU°ŠÿË2~5<Œg¿ò#Íó5Ç·ÿ7 7ˆD"Ugh´ÿ7 ϧ«««á"EqíܹëׯÇúõ뱚P27%'ñ7$ÞÁÉÏ®À3Àg–hÓ<Æ”6?Ó¼Ù6ËÁSC R±$i’4Š‘aÙ$þo%º ÚÚÚÐÖVTXy™Ý˜÷yʈ‚s3 N=W¼öEñ?AD+xÑ•ÿÙ-׊&¶?ˆÓáŠÔ|Ÿ»ÿ7¸°g­n`î_ÿüÏÿ7YS,'iΫٜÓÃÀD¬ Á  y¥~å?cL ðx<€Ã‡ߢ(>#“É`ÕªU4€L&ƒh4nJ‡6¾7zŸìèˆB–%Œall 333Æw;‚z¨$ ¦ŒOþ ˆÖrƒ ð Ë|,lýÀ‡¢ø¿Ù Ýu=ö[ÿ@ ˜6­_„¨}}}‡ÃPUpÓUøk.®\.‡7+¹@-´··÷Ÿööv uen>ºðß›ñÂëõ›ñ.ly‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ˆ¦pÑB€¨þÂ9Íè¸00ÆÔÂå)xݼy3pPû~ê9ûíli|np\–[Ÿ‹ÿe›üÂ÷ ˆD"u¼/íOOOןï»~ýzlÙ²¨;/Ý@€‡y00ÆŒY[Ù/i&Lc8º3£' #€ãg\Ó¢Ù“¹ø?Œ@’F‘–ý`+üoõñë3Y³ g2Z[“e¹eǯŒh3¢.»Y»ö]šþȶlUˆb+EQ\ÖåVÄ\LeXèã§øÔþ"ö[K4ñÝ5KŠ}Í‹E½eyqù­3Š —q>C¯v ›UÄõ÷ŸÄoûpëï÷i–ÆÝÜn7}Vè§2ˆ[¿Oÿd°iÓ&šY‘8»]¼jeêèèÀÎ;+¦Y ÏŒ1u"Ö†öhÆX‹øJ+örκuë ñ¾Y–!Ë2úúú044@»ÿ•˧ðö¾oßëöãÿøhßûÞ÷LéšÐBÐïGo0Y’ÑßáF@ÿžJå4Œ1uffo¾ù¦Q¶7ß|cccèîînéØŒ Þ0ÆÔ~Å܇½¬YaûËúØŽI:²YÐÓ¨f€~EÁ`ƒÏ%Š¢¸­Ï „!Ë#%í$‘aFšzóoj__Òé4<î¼3Œxœßdߟ1ós‰×ëE.—SÆ÷x<Èf³ƒðx}縱üƒÇ;UEyPØ~Sc¿è‚Úviqùš% â½í–xÜto½F–qüŒb˜dÎS« õ¸°[Qâï¼èÌâí¹;S0hôin·[õz½*cvá7bjj @Ùl/1hdÖy+Œ1u`` ªI@+áÇ#I*^xálÚ´Éø µE©Ìá5ÉS<!Ø?|ø0æææLéEqɲ¬êf7Æz¾ÌcñòÍÍÍ}}}8|ø°#£q\m7ÆÂÐÐfff°víZ#ë¾vËõËå\ƒ)¨‰ 0˜Ê£¿Ã @û¾oß>lÚ´©äx¸ønn«V­ª74q`׿,†çÓ÷ 7¸`Ìÿ.Šÿ9úï1ðÁ,þo&VÃ@0m˜Ôz®«Õ4ˆ1.- P]˰?õ0Ï¢yEïfnnÎtÿ™››ÃÆ‘Ë-~!=“Ü^·±œÏç+¤&‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ Î.XèÔcLÿÞoñæ«(Šk1ú÷×cõã^p5¿zâû¶oÇu§O#»w¯!þ€wƒAÓçóXöíoã¦ññšâ3ÆÔ¾¾>„B!Óút:t:]»vul­kqý®]»099‰ÉÉIS>‘H‘H¤âõÚÕÕ…-[¶˜Ög2d2Ó¾•âG"c‘-[¶ «««©íDQ—¢(®;w"Œð²4=Nµø÷0†µ‘øÌŸY"ãQ¥y׃Up  DüÏËÑŒxµÀãÆãq´éBìåË—cÍš5M=~.þ±Šÿ[QÖû _‚fC ®û|M¿G9-CЯu€¼/nF¬ù<ú裸üò˱aÃ\~ùå´YÉׯ_·Û¾¾¾¦¿5¯”χ•Á ®Ü±+õþ6 ªøT €€ª"ÖÖÖÒø\ü/ŠÂàwõÏ~¥yu‡Õd2 þWKû÷ÍêÁz<¼/Ò«¿XýþÛÊöÇÅÿù×”îó½šZQlZì]PoYÎpÍ’âÿ[ÅÌ€&Óß²œáEª–‹ÿ/ìY‹¥q7–ÆÝ˜ššÂ‡=íF¯×«rÑ?çí¹ SxçÂòf?µô°«GƘú /8ͦ%0ÆÔ‰Xòûcˆ&²H¥Rµ)H¥R4ñ¿hJQO;B2™4DþÖ77‡™™0ÆÔ™™CôOœÿXûSk_ÀÿÂá°ñæe î´¬‹)Ïjñì~7yYÄQÿ©/}Éø¾ìŸÿÙøžÕÓZéoà™ÄëõÇžO…12,A–ü†ø?*Ž{«=c×ò^'j__Ô7LNNâÜo]ƒ+–½ÝÂpŸâŸ×ëÅÔÔTÙò{>ïOy¿ªz½^¸Ýn¸Ýnû ólÄ@AAAAAAAAAA4‹ºNà/NOºÍ3¯mE¼dfEñ%ëf yž…æÃÙîÒ™¯Ï$WuÖLEQ\·0¦æ•6¸-3^s±Ü-¬9³ÔÏçñÏ7¼¼Nf=7S<þs3 ØÚù;~Æ´™~ù̪bŒDF'FÏ€íõzÕ¹ƒÅî¼›5±€¸¼Q¯yÇÇ5ñ?¨s@®#oJðwù¥*Ï<èõzÕì޽ƲoûvÄuðño}˼ãø8žïì“$$Ün„ô9ÂËð! ê̇‰D>afgÆJ *‰9–/_ŽB¡`,ŽŽ"‰T iâÀ¦˜mÂ,ÛNâ·µµ™ 8Pb,Ð Ä2¼ðÞäXüÊö£t†ÌV ÆŸ=‰$4ñeö¿FàV²›1”(þ_v³}ºVÔØ/[Åײd>¿²¬‰°eYadzYc?æà^ZKÁƒ§$MžÈâÿÞžˆ^¶4ÖP¬±¹øÕªU8zô¨‘ÎívãèÑ£†(š Q=~k|.þ7ÄE’dJ{L’4CIB¬­ ÑL¦éñEñæ¬9íÏ ™ü Å™x‰ÏÅÿbüzÛ7ˆÇã ×Á`HA0XŒ HÅÿ½=€vj”¦·?Qüwúg¦´ßžÁç{×â»Ã3º Àý Åæâ8~F)ÿ‹íÐDysssÆLð|¿[–3¼XPÔ©åEoZY7«ˆû2·Û­†Pݸq£.öŸÂ½÷Þ‹={öè{Oc…[¿ÐÙÙ‰ññqcœQk?J¥ÐÑÑ;wb"ÖIRMdMyìܹsAî=Œ15¿?†‘]Ãðo&bmhîÀعÓ$üç× ÇcSnœa5Ý€þ„¹-ñ>¾ôÀ€'% ÝÝ݆èÿ¶ÛnCww7^zà<©÷]Ñx¼ä¸jÚhccc€±±1tww(}F—>|S €×~=X»‰þÈ’ )­«ï¾ûnÅ{¯ñ:yóÍ7k )R®íÚƒZeûùÁ`Œ©kÖ¬ÁòåË ““¹¹9Ȳ¬šá‰ÇãA2™4ÆüÁ‰ ¬€žȲìèùÖI9¬ëx~â¶®®.¬[·ÎHsøða$“ɆÆ_]]]&×£G"™L–\îiE,#& ™À0mÜÆFFF^¯·âÎpMLL¨íííðù|Èê¦oÙl^¯¹\NÅ"ìcòù|‰ø?ŸÏCéTHüOAAAAAAAAAñ> f€Jb–VÌ ” ÿ9|=7°¦ÝŠxC‚èrÂw_Ï…ðÖ´lwm/{+Šâ,Š÷m÷µ«Ñ€M>ó}üµ”ÉŽzcv(¶eµþ‹Ëü“XÓ²µÍ9~.@Œ&²Ö™ßËôû‘Èdë.ƒ]ÚË/¿¼lz.ø± ê=~»ô+­SΗ! oMÍŒ_õÖ}2™lÊX–ç‘L&kÂÛ¥wx ð‰Œ¹ ¶¿z¨'6ÿ?c?欞Ç5MìÖsÑ¿öYäÞ{ï5Ž=ŠKÞ“ñÎ…¼sa€f˜P«WQ×Î;Õ߻𻘈¸˜~kß?#•J9ɪépñzJWòOQèÏ‘Òiƒ.H’Š`Ð…ÊMù æ\ä<R k“Û#ñ}0¢ ?Á ñ³H À_þ2^zà|"„$¢üîînÄÂa“ø?#ÏL/=ð@Mû¥°á“àÐÏaùîâ˜lùnVöª^¯WÝÛ_ìû·Ñ*$õ†â6Ø~÷Ý8xð IðÏÍt£§×¢ ߉~ÞvãŸÆ¾[ò "¦¶×Û¨ÐÓÓc»qdd¤$¾˜VØ~^ ^Eñ?Pœyœ_#ápo¼v sssè¸åƒ¢(hkkC¾­ ³##PÅd:f}樧ÕLÖ­[‡Ã‡Ãc €uý×H&“5÷âóíªU«pýÐfäÂaãZ»ñãwàíÓyd§ŸVÀ·þV|x©6þyûtÿyºd¦«³kDQpƒ.àçBþ,´Ïô\Ün7nˆÇñr8l†/¤Ý_ú;܈&²¸õoŸÇSÿö2f~ú nýÛçñâ_Þ^Õ讉¨€f>5::Š‹.R°n]; …–/_Ž×O}¸eq{zz ( æææ ‘>´··C–eär¹FL011« @‹¨fT×¹$ñÓ¨f.S‹QÍùŸ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ˆE‚#ñ%iQtieC¢y³Ÿ3ÆT;áÿG¾į¿%áú_Ž sxouOEƒ€zMcªhC Á0åÕfûÝáIWÈ×cpKQÄoTøv«0ÊÍ2ÈÇÂÈ#w4®æ•ÒÙ­ÇÅãTKgw\»ÿïìø›DÚ€‘s€+WÙ  &âñŸ½V>]ôÊšÛŸ¢(.¶›©JL‹šg½µ ÿàÀUilù¥CK‡Ñwº@©Aç܌Ұ €Uüo'¶`ÚÞˆ ˆÿóœú1°ì“²±îô9¬~Ü‹£Gâ/Ö?f™•×å)Šþù§S¸øŸ¿&0Ö=ßÙ‰›ÆÇ«Æ_ c–«karrÒáèâ}À²­}€ô#lý§6m*1eEûP(Œï|vcøMßsÀ]w¡ïÕW‘°‰ÏÅ­€1¦ `ß¡/Ò(¦]EáUÚø®i[ar(t VÖÙ×õö««æWë>²$—”AÒBøgÐæº¯u Pn›uösΩS§êʯÖô•éK+õ±ÍŒŸ9k¿þgö«kŽ_-íB·?IÒþL±ÓæÏ€Ím§YupwÚ¾¦¿;¼Ô·Oç|>´t9®j[_Õ€?ë÷ëâÀ,Ø¿ÀS*]­]sù|¾\VÈçóø”ž®7—ð.<år¦¼¹a@9ÃA1¿§ÿ¯›OÇ‹ëÝq¤bÚµÐÍãÖ¿}ðâ_Þ®}Ž–-c“1„ÿ€voP]Ëpxú Á 5±Ãá°av'W€Õ €:11p8\«@í‚þP…Ô‰ŠýOÙx$þo†#~üïâ*\„ÞÑtI]GìëÒ6d„sãO+^zé%ñÅí"BZ:ÿAAAAAAAAAñ>¡¢€8Û´xº ‰w~: fοP««%lQ|Y’5ÑWW  ÃM¬¢ÿož)~ï=£ ¿wƒÃ=8~FÁÛKd\³„Áþ¢û ³ß.¦«V¶‘s$žª‡Q7¼•Dÿ"<Ý¥Ñ+kjŠ¢¸X´(øgk«ßé^]ï¨h&¬& åL¸øŸSNüo·­Üñ;ž1t±ã)7°ìfÍ@õ9G޹S ‰Ë†à¿SWÍèÂÄZ^Û½[û²c‡aðn0ˆgƒA<«Ç{¾³0),s1ê•;và]+õü*‰Tù \@NUÎû÷ï7‰ NMÁ`ò®»Œuv¢l.Ú÷ûýM˜&1Mëׯ7å•N§1;;k,_cL 9›±7-û  qã›jåÌíŒDˆb±B¡¿ßo´µxܹ cLUFj›­Ø•.š­­ƒ@0`+Â*‹°÷ò$›âGY„Ú´º úý†@4‘mYðÙœ­,[¶¬¢ @³x7´5 WZIÛ¥ö&¿‹Ê&õ‡UH&“Æ:§íïÇ›Òï †H  ú̶ýõ'j×Âcþßµ5ø|ïÚŠ&NùXá?§\û÷x<%&<nP+\ð?55` Ëå\^¯×T6Þwuu!㎻̳ӋXÇÖåΓ>ö‡$©†¹S¨íz$2eÏmÓEȼ¬ùý1ÀÈ®aCüŸÈ0%’4l¤—ÒiŒŒ#=5¢—Wû¶(b!ŸabPn ®[»v-RÃúg¬¸>SЕ 87ÐÖkãÁ4êIý‚IdŠckòåDF;æjûóò¡»»»ÄÀ÷ä)ú±žwgm÷S.ìøE‘Î6 ÿEÚüZª`ÿ‹¢ÿ©c“Æ÷+·â#W0cûÆ•[MÛÍ$à›ßý¨Â÷ªñEñ¿(ú¸>ŸÏÓòe«@—· èbaý»c¾Ó} þtìÕò]4LÞkɾ[|ºná%ÞÛ177‡®®.$“IÃôBØ™LÆôœÂ¿‹BüZ¨Å„ ¯?ß0ưì¯ÿ€öÜäÔ„€1¦F"CøŸÉdà÷ûqN¿¶ …¤W…/uÞ>7‰þ­|h©3å¹¢(®AÆTmív½„/«Ú÷a‰~íºã}ŒM”¯ 4èŰ×ËM`pƒK3àØ‰ÿ9‘HŒ1¸ÝnÃl@Q (Š‚U«VattÔ(ÃGÂZÇ8óÓgýn ¦òÈår¦ü½^¯:00@3±n¯•÷yÜ$¯ø,¼û.3LèD»&`<ÍÍÍ™ž‰«Qɼ¡.ªÁPÔöövæqÉÄÄÏÏ6ýDBox½EcÃ\PïëCpbÐJj_ˆål–}¾â‹éM1=Ç^Ɖ“ÛŠýO¤_ÁÅ×­Äo~~ Wû?j¬çiu#Gæ7Öø7Þø$þËù[ã:²û/YR´+¯9žV7 ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚xPրϲleuð‘~ˆÕ½×B–ex¤%iŠFµ cê¤;l,_ÿKMLòêU=¸®3þŠö{«{ ñ¿˜ÆÊ¤;Œ­¨M)Îh?åÕ^œß˜Ånï ';F¼}ÿˆ!ú½2îqiÏèûô÷juðÕ%7 ¸†™g´¦ à– /ŸÛ¤MûÍ¿€+Cü/¦iÆñórØ ÿ?sóøþsçðßo¾~ƒï?w®$ ßE¯¬©ý]°–áÜŒnCK5Sßé^ ]ln_\ü/¦±rnF[[<~^¿Ëw›E¡6‰Œ9ø¿7˜Æ°äGo0 WØ=Wú22OMdKŒô8•+BÿšÀ×*-åbÕ¯m7–õ÷ä]im»‘ǹ €!þ×9nQ÷òx\Ê—¹u¥®”|74öq*Rå¢ýÉÉIÛõà‘~„dúZÓv«ø?NC–eÓ~NX¿~=r¹\‰pbÍš5†à!™¾’%OkúB¡€ééiàcêÀÀ6]x’ô(­æâØC¡K°ïÐàÒ®‘}8 H£˜võ``` añ~´â‘“H"€ïŸ¢,€áPè¬x䤑^ü~è³+›p±mZÖ®?P4T#FџЮŸ°nÁM ¿F³§ð™Q­ñsÍÛƒÕ|Bü®‹ß;ÊÅÿ†i‡¥{Yv³Ö°­ø½‚›@ÛÖp81¡qº=e±‹ØXìOÈ"¨‹ÛAMŒÇEØ­ˆï·Û½ ñíö?ßâÛ ÿk…ï[¯€ÝñƒšÑ€A¢(ü ÓPQŸÏõÿ¢ j9+§ˆû¿xVQ¹±€St¤jY68zô(V­ZeŒ;<m{±šDÙŠ÷†®®.$’I WAjXA   k‡{cHÅ´u¡6ñxÜ[…ÚŠi¹8öí-[ðá°õK_Âä·¿mä_éºæÏJåöç†CCCÀ­³ŸXß“æ3¯Üžy¿-’Ïç‘‚HçŒëÜŠUüŸzËD¶mÛ†Ç{ @Qü_£ˆ¿~])õÛ!¦™:6‰+·¢{Ûå4€zQÅѬÛbnâÔÇý|ÌT/ßé.þòµÀeø†ü–úîKpãõ7UÜ›èF …Dq¡P0ž)¬Ûx}Ù]_•„÷v4bBpøðaÓ5V‹ A¡P05ð}»ºº°jÕ*¿2¥ÏN??~GY#€«ÚÖ™éªÇÎMúõ>• öowŸZíEÂíFh°h¾qƒh&¡›ŸIKiâí{ï½{öìAo.‡§„8•Äÿœýû÷—ݶeË@ì v¼OýÛË€wÇÑßáF ˜F?üLAm‚ÈßúúúN§‘ï·àÖÇÜ,B4%+ ´gîf”E ‡Ã`Œ•âÙ¡(ŠIL_k,qabbíííÖþÈîÚ6Äÿ…BÁd*ȟĴƾ®  CûžCÞŒVn¯¤}ú|>L„&j7HØO y¨€ý ÷Âìöbž*ï'£ÏtZÚ²ñESÎÈȈm|±žë1~ŽøcÓ¿ ˽˜{çç€ ö?¥—^Áÿw ð‡§ß2Ö}déeÖ<«Ö{0„¤ª´ïŸÀ’%AãzÍ– מØ6­io¼ñI2 ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ˆ÷ ¶NÄ?²,C’€mÒˆFNÅ—Vñ¿8Û«~ý-³€WLs"7‚«½=¦õï­îql`'þ7f{õÁàIæ}Ä4ÙÑ®´iýOºf¼Xÿ\ØoåªýŒ·Ü(à«K€|L«Kw4®òEkÿèúz€À=Øñ7æòˆi0§ ¿…õ®\í&NÚ_9ñ¿ˆhàD`;´tØ$êßxÅlù¥ùEh1Í©›MøznJL‹šEŠ¢¸MðÏEûÕpåUÓ>—Åj ç_¶ är9—w³WÅA§ ™xuACn.gœ[Øóø¹3g…÷ìÑ—Qù¯~Ü <äbZ:uð¦¼egÌår.ßöíjvï^`Ǽ¶{7Bù<ð­o!ávãÊÚœîIöŒãùÎNc:ä={öhË(šÜ4>ŒãÙ¯|IŽIBùÒÙ¢ˆ(`t´häÁ_ÞŸ››ƒ,ËBŸöbm@4“ÖiÂÇǃl6‹ÉÉILNNâK_úÒé4Òé4ìàb¾õë×ã?(ΔÊãg³YÌÎÎ"Ö¦‰£™Œ6) cÅu³³X³fiŸL&ƒL&ƒOúÓ8pà€I4X+ÓÓÓ¸@ÅþBØøðëf.ø)@*Ö["«‰ ÚÚ€ }©XÑDCÂp.ê?`ÿ‹ñgF5SX ô~pË`fô$Ž/Ñ Qªõ¢ø_D’FuqãYíº û|Â>ÕkõÂEý…BÁ¿Øõ[<   2™LU;ñ?ÿÎMN=§pEq±ÝZìÂÅ´_#W[ñ¬V q_Vå¼;‰Ïþeãëc€ ßD&ÛôøÕö9uÊ,8ïøVc•ùŽo Õ?«bßæ4~¹ö—L&¹Iuj`wü‚-¼ú~ ‘™ÿúÿîðŒi¹Þø/º Þ²\ÔFV̬âfqß[–3¼X¨Û ,|vu»øœZ…ÿŒ1u"¦ÝϹ°^Š¡´v<|L V?n  T¼ïMÄÚàߨƒôÔˆñ™žÒÆúíÑ¢ù€µüþ=Fô2 Iªa‚’È0ä÷Ç Í< 2Éd!EAïp±MKÐ;  W÷†Œ ;‡/Á†„6&[Ý Û°À;€M›6á¥À¦M›ӅൈàíöçÄB>tww£¯¯CCCűu§vžýØðÉ pèÇç f´û£šØxõk·™Xȇ@0€Ð` HçLi6êu ¤ Ó.þ×LjRº`µˆÿÕïD?_¿®C%ñÿÔ±IÜ~ŵMÃ×q3þ½{ÛåÛ÷F¥¶¨öôôcÔJâÿl6 ¿ßo›†¯Å·ÙlVVV»xÔϯ¦gÞÁúµÚØþõ“Єýž“pà¤Ö8¯XñÓvqÝ×ß„Éûo­Ë`ùòåhkkƒ¢(¦sǿ˲Œ®®.c™”k[295!8|ø0¦¦¦ê2!PÅUnŒ:55¥žøÏãÃKÝxûtÞøô­¿/=ûC\Õ¶Zª Ðù¶zðÁ<‚çF+ƒA`|ÜXÿr8l˜ô+ Yñ¥ž¡7g¾f}¨Žhâ O :¢íˆ…'·³Ø?õo/ãöß»0óSÍRëwýÓ@ª(|÷z½êÀÀ¶mÛVõ¾VCøhæv…B €Š‚cÞ@‰!]bî¹¹9ãYØñùVÿçóy¾ÍÑ,ìíííF»æŸ¢ €×ëEÎ|~Uàâ¦ëE*Žíã§Š_c€Å&›Í¢í¢ €˜—Ê÷dr¹ÚÛÛ ¸øé´Žøq"ý N¤_)Ùh5èMé¿Єïsì?«„¨ßNøÏAܦ( âñ¸Ê_ø}„±Ú¤N¤_1ŽíDúüÕû(N¤_ÁûO\ù‘ëð~Ž+¡›ççÇð—â´tW,.à'Ò\±ä,ðÒ+Xwée¸ÚÿÑšË ž7¯×[rþÄz˜››+¹GÔjöCAAAAAAAAAÄùC‰€8Ó2¬îÕf¹>2ü S:´Âÿ—KÓ,~¡·vÁ_íÅýb‘ÌYmÝÕú²S;dØÝ»€&@ÅýbÓ>’¬­ëÒ–Šàc*/½}ÿîÑS?ª;"+ŒtÏûˆi8ß< wÃŒ!¯´9=T{$ ²©¸(ŠûÅ4"#çôuºh¼–ãçÂ}øï7_ øâsgñ¡ŸÔ•`ÿ‹iZÁ©ÃXlkVcžF¤ït¯É0ŒlÅ|FU.$âB¯Þ ÖƆ%?z;Ó€®kØ=ç7ÄÿbšrTÿ—à.6è\.çò¦¼j®£xÂÜi7ðeQüŸËå\^¯W××C.—s…5±{·±Ž‹ý­Ë¢ø_Œo¨VcrÒ,lââÿdúZ}MQ]L_‹.ÿ/kkCTæpÒé4üþòç¥VñÿK¼£a >ó¤,# ¤(HÌ΢'žŸ™±Dc<G @Ò$ðÀˆ< ¸zL3ÏóÙ;ýN”/âBÐ%fé¡Ð%Xñhñ¾y¸À=ŒáQEÁ–%ÀÉÏ®ïÔ;žÍÂoÑ}ƒ bý ¡^,"4«€¶Äã—…›ŒxüápØTï\0«BÔrþ¹ˆùnÑ FdÙÍ€2¢€õ˶|·YhQo؉…žÑ0ä)CÜ2®XONMˆìâwDj*ÂÈ®aSzI0ôúý%}l³âwww«ccc&ѱ÷Ýw_Kâß«/‡Ã¸¨J?ÚÑ¢ú¿…1õ™‚b2„²Ã:Ãn-ñcªˆ²í/™L:—oLMÅ ››Ÿ!þ4ñ¢þã¯ÿwªŸ¾sw§íl§Äýï¯;>ÿ?SÐúËtÁþ[PÔkâq„Ãáªí_–e?£à²3Ú¾/žUTu›Ø‘ÏçYeífn©÷ Šîù¬ó€Ößý~ì)¶Ã >¾°öE€f ªšø7öÀ}[ùý1Œì6Äúùý1ѲcV÷mQu"ÖV4+°‰âÿZë¢?ÁŒŒSÁblà ÈòIH8‰T Ø'AY[?> >0~éÀ$Þ÷x«*Øíë6ò!ª‹ÿ9ÿô‡ÿ„@ €þýõ¦}^ùÜ«e÷ßW‡1¦fÐoÜ[R±dIF 0Äü©741kЪ Œm@ш&ÑßÍ›7ã±Ç3¶uwwW=NÄÿÖ´•Mn»óû>SÑÀ‰øßš¶¢ À_ø&ððW«‰_ÕϯnøÚSxù·0‹û/–òbß¾}ضmžïìÄMããˆårF^N¬ÁÄ6·#˜ªLdžÈ0š ‡×ëU¹Ø¿ñ¿é5«ðŸŸó+.¹¯¿ó®© ”›•¼NÔp8 ÆXÅ™Üy½‰¢ƵR‹ø?cjjÊd$h¢lÑ€§çÛ¸éP¼F|>ŸQ'<½µ.*:´wÆ~L‘Ífö„éõ€ÊîÖ¾0ŸÏ›ÊÉË377ŸÏ‡`0ˆÙÙÙJc2CÌoåðÙ·Ÿ~ ’.r¿øº•†PþðÙ·°îRÍàØ¯ÎᎾd{Ü•(ÿ§Ói£mùý~£_âm­§Gûý+c étº&ã—?i¿¿l{ _ÁÅ×­Äá³oáué~?¸žŸ>ükþ>©Õ×]‡É¿‚ß>þV.~}Vû»bIñ!å…+.Ŧ´–×pÄÞÑtÅ{° ’ƒs¦ë'›Íc¾žŸËJ}?O| 7Þø$^zé5›ÑAAAAAAAAA±¸(1YÝ{­!:ô`VïÀé‡eÓHÐD«ïûKÈS½ðHš`ýPèlHTŸ}yÒ6‰û_½ª'r#¸µgJøõ·´—ïEq?OW{‹/Œ¾·ºW¸ðȈ±\É€1¦v(&qÿÆÜ("²ÞcO"¨‹QDq?O£]EñËOèÒ…Úú²S< ‰Xïq™ V¯E¯Y€&¦qCÓ‡Qå3z IDATóuÏ@› õí%2®Yb/<·¿(î͘z6;z°ão´ºÅý< Ó ñ®œ¶]õ—k9~@öK(Š+>­®4 ÿíÒˆëxÚ³±×À¢WVmçf“¸Ÿ‹ø‡ÿ°¯Ø-¿ô›Ö/ûdñ;`û[—ÏÍ8Ÿy]ÿ›Lò¥"1M¯’Æ0óëxÛJÕÈår.ïf¯Šƒ9œCÞ”·d`ÕrÎíþ^¯WÍÅr€®›ð¦¼U¹\ÎåÛ¾]ÍîÝ ìØÄîÝYÄ@QпRŸñÍNàïõzÕg¿ò¼¦„òùŠñ}>‰„ñ¢9áÚú‚u—ÿ̦Ec³ò—³3™ ‰ü~?ÒéòÓ¤¯Zµ 0Äÿâì¥"Á@ ÄqD–¹èÉçó!›Í¢P(`zz«V­ª* aŒ©‘HÄ$ªØ¹s§± Ðf»œžž6í·Ç÷3ìÃIÈ2ƒ,ËhkëÁ¹÷ÖH8¢òÇÏ(šx_gƒ.âçñU$G®Åg–È8 ‹ÿ¹AÊ=Œ³AóýÊõÿâ2õ§e?üíœIÒ(‚Áˆh`Êc0TŒ“–ýˆg³uΈe hk+¶5.‚á嵊ÿ³X`vvÖ˜©•ïg-“õØ­b~‘SÏi‚ €i»2R¬ƒe7lmm³W‰)~žÂ>_‰øÚI¾µ¤“%¹dëD†!Ô¦ ‘aHdZ_4èîî6ÖßwŸ&(ݵkW‰ø¿Ùñ¹ À ‚«C¯ÿ”ÏW"þov|nÀgˆ`̼Ëgám…ø0«M$Q­ýéæ/j</ÑW‹_-$¡¤Ï1·¿Êõ×H|ÑàÍw»_ßþ`‰ø¿žøÏˆ"ý·–h÷þãgpQÈŸ=€!þçû]v.ž×‹¥d Ñ\éóùðÄO˜D±—¼'c\7 ª5_EQ\íÑŒÊEÿÚyÕÎy,䃔N—ˆì¹)€uFíæC\¬o½/T"téŸü ¿?†ôÔˆ#ñ?cLíëëÃáÇ‘H&^©áâ½d¸H0­­ï è톇‹ŸÜ ­«« îövä'&p\oÑxÜ0fêëëÃÐÐPÙû’¢(.w{»jÝ_4bµ{êDЕ×q"‹»þå.à_—~ËVõ[óõ¦0”Þ[­&šè_»ß„µ©¡E3+‘ ß ´úof0˜úa®Zµ k×®­vÔ¯~þÓ&áÿÆ•[+pq?ÿüÈ OM?a›vãÊ­8}ð»Ø¸r+n2üiì»%³X‡ÃaÓX—_ËÁǹü“ >íðù|˜úÉÿŸÏ‡ÿ½}m|øNôóÀ‹‰;°~í%¦<¶Ü,1¸bÅoLâ:¾þ;ÝÀŸŽ½S“ðr||>Ÿ¯D€ÏM³!”,ËM1œY &VÞ>­ÅÍN? ßú[õK._U’îíÓy\}Í*dÍ'¶0ÆÔ]DÍûœwƒA\$IH¸Ý¥€ÁP7ÄãHù|H¥ÓÔg^Åÿ¢aÀ˪–'T`DQÐSáˆ1†¹¹9ÄÂày©Ø„ñ¸Ç…Þ3?}Æô èc  Cê<²‰|!/¼^¯ÊËåð~¤Åû‡ ÿ¹™6- ð%3”s‘r.—êÏ7sssÈf³Ív¬Û<fggEa¼ã2|ïÿãÆ«´gÞ|>oäÍf /ßn½xÿ¥ïS© .¤ôß9¼åMMMÁ /<¤…Û¢&´¶Ág½¦¾3§äÀT­þÝ~­ü«rwdòßí˵Ÿ‰¹ðŸ#½ôб>(,óuÜ ûOeà;šMø±ð>]l[Vñ¡P@&“)1N€hÿŸ#6øWU_þ¤ýünx ?‹oÄÅ×­ÄO¤#¸b‰&è—^zÁ?Šßüü~ûà0Þ^zK_CþÛqéñ7pÀºŸü­t¸*° o-Ù‡ËÎl³5ÏàÇ)¶1'üþxæLÕ¤AAAAAAAAAAœ˜ ølÊV$ Ø&,sÑ?øó4yª·d'&€YÜ DüÅýQø/ÂÅÿp"7R6ˆ(îP"þŠâ~Ž(üálˆ$ýeÓq¸àÕÊÏìˆëZø‹i8¿Pµå{\š‘ÀW—ùXùˆ(îJÅÿ@QÜo,—™TS^dVçʧã0ÆÔ³±×JÖÿ¹søÐÇOêJ¥ž†cÝ83Ìâ~ TüÏÅýVá¿bžµ¢f€ÞPZswJþ< ǕӗËëx+b2&=tyJ…þâ²ÝvŽñ¿Ÿ›ˆ­ae0X"ô—í¶s*‰ÿEq ©»ví²UT–e ]‚dúZD3tù/A—ÿH¦¯ÕÍ4aºÖw¶!ªÏŒ)rôèQø|>ŒŽŽÚÎ0L&ÕH$b+¢™E¬­ ’,#Á˜&ø  ɲf šÉ ÖÖÈ2³³†@ƒ“Édà÷û+ÎÐi7 hS†&vâا ñÄØ=©X/¼·;wît, ?pØòH1¿CŸ]a˜ ]‚ÐoßÔÅÿvy¬ÕÓ(¹1ÆTQ¼_‰r&ƒ!i¹v±e5¸°# `­â«8@\ÏÓ@<^¼0ÆTQ´ï„r&ʈ—~‹[úhé\5š¾X±ŠP£‰¬ÉЄ £¸[Lߨ Î.v**ÆÖg[á|Ÿf‰ñ¬eèîîÆØØ˜±|äÈE#€f¿]üâq¼,̈ÍûÛŽÔ¿]|q†xxJßÊšŸ ÿ“ɤ±®Zûãiù¾V#€Z°{‚!+½V;¢¬dŸVµ¿<Þ‰OßY|wxFOwIúZË ÿàEÔk–˜1qÝ€Ãû?.†Ó¿xVQyžÖ¼› 7üI&“¸ã®ðž\}§ (ŠâJdJë±w4­ÊÃì1çôûKLø:¾ÞÁì³€ôÔH¥Í&c*ùK’jôƒùý1#/MsçœuëÖ!™L"ÁÐ[lë ýúÞé_ôIìô¯€,ŸDo¯v nCqýc«××á_þ2bz{Y·n]Me±î/Ö³ Ú§ ¿ñ]4ñ}ñÀÿÅ pèÇç S»k"—˹ܷEUÞ¯ø>=hÚ&¦åf’¤"tõ+I*&bm† @¢¿ýq÷Ýwcß¾}ŽŽµ’Øßޱ}oÛ4ñ?çöõÿµÄÀj*pÅW`ò{CØúÇf‘q­³…Kú½GëÚ™l‰ùÞ¾nUÙø“ßÂk¯¿Žÿ¸ú“pMÿ¤lÜ-7ñÒ«Ï›Dþ•ÐÒ¼ãä Ó'@à‹³^[Y³f fgg["þ‡ ˆ¢(®ìôÓ*þg§ŸÆUmë¿ÌL†^ê[¶ 'ŽÅ¿ÿëç/ ÿopŸZíEÂíÆE’„c’„A„>RБÈñ>ŸÇ1IÂJ@3 ð£#9SŒ*LjÆÛxQü·(Žå_íÑL }é5ÌDøi©Qüÿÿ³÷þÑqTgž÷·~8ð‚nã`?J2뼉'˜îÆ»H¶—À™0¯‘˜ÅäÒ’™Cvv4RL6ÞXHQf΄pl·Df7'1$ç ³³ ƒ%ñ+øõŽÝ-Cbs‚±ÔæåGb¹K0f@$Ü÷ê§úVuýìîêð|ΩÓÝU·îsï­{oUWÕ÷yš¦a×®]eë‹b~@*•2¨beê#ÙÒÿð°ýÁþ !0>>^–À^_:&…BÁÓ÷ ìcŧ6]4§ƒÜ©N˜NñöïßïšÏ•W^i:/Pêæíù|h+­Ô¦Ë=ÌÎÎB›-­Ï·MÑ€:ç @t®ÖkhäUËNwÝxîéî‚wrðÆÐÕ¸üô3qy¸/wÒîxÅÑ~gg§Eø¿dÉÌÌÌXæBrr§:¸öÚkñÔSOann---†SÇ‘GH$N$Ð54äèøå[éÏã”·ßÃCWãüË.Ãû/¿†ÿ³é=K=ÿ9{ÿ)u) 8:ðk‡ÔŠåÈ| /¼w/ìrº“°bÅ/¾ÔÔŠÔÜ,¦ûÐçÇò}ïÄŠc8xð†Pކa†a†a†a†a†a†a†a†a†YXœb_¡Šûf^E†¸âÒÔM8š} €ñ¢7 ü) Šé`Iv)Ö˜M7{!„OÅ ‘…*î¿lmÊ"þß÷¯á*·ºøùª¢Ay*Þk1R&Ûd¼«Šû·kK-âY Ï›¢I Ö=@ùt1RÓ ÄÜ’^ŠKS£·+gÖ‡ÿ”0õá¦c€W¥!ˆ½ÿ]à›w‹ájýUqºÅ*þ]z?YÑdûÕ_÷í9ãíÚO~á l™¢~UàOiThÛmW-²üvC!?xQ‰\]êžjÿ¿ý g6eœõÆç[ŠáƒuϨت¸?“M KŸÚ€LÖ(‡*ð7ÓÈcûöÙ Š}VGAÐ4MÎîÉã­{Cíf:yPœ}ð€<òÐ&4Dˆ išœÙµ ¹t:”ýײÙ2'&“À¦MݾíÆËõ®öÕ¬)ª%½dng÷ÔÅ–O |p¨Ñ1íù;Ab{ÀÙ(òÙâ¤BŸåc{ffÆ"Öq9A"ξ¾>sÝ“Ow຦äóyôõõaÕ' ›ýs f8Uùº| Oà8¦ÑŠÑ™Ö2aÐw–,ÁuM#øÉL«iÃ# ¦H°¿Ç¼8|×,–þè8|Å8Ÿì¾ÀŸmqOÅÿ4÷e”öØ(v÷,eöUñþˆrœŒï $’%Q™Ý €}ÿή$²Ùa$’@ïhxA.Õ_º’lzzÚ\oÎJ‚ ÔÔïêvµþ1E/GBEú>·ÉõKÛbw æCâ"È9Ï »˜Y!Uñ53J*E`WÓzõ±Jl«âÀˆËæLág­l{•AÿÀ¥—^Š£GbÛ¶m¸ãŽ;jZ'ûªø(9]™hnF[ Ûß;]¸ô¥˜á W×Ñ/DÍìwttHWÒÿvïÞMcXVâÀ©îªMB½¶¬GÿSÅÿp{×gñƒÌ‹ÐõïAˆ»kV†_Ä ¯n2æ"rŠuába™R”êd2‰\.gI{u“À/æJNjEªå•WpÉ%—à©§ q³“ã•jœ18ì#ÓÊqßÔ™D6+-"/üÒð¿µÇ8§¨â~'Ôí´*üµé“O>‰%K–˜×]£ŠãuëÖáòË/ǃƒhoú¦Ž#‰’ã¹Ü”ñ_óŠÑytwéã­­8øï`Å_ÿ5Ö­[gæ?;;‹îîn ºöO]×cñÖVIûO´ ›•H% Á}2•D SH˜Î`Ú[tŒN LýÝãFÿ•ku3Ï íT¬KâÓͨsºU«V…êƒ$è¿ÿ?ÁõëÏñMOÿ+q-Îý”À—Vþ1Þü­î˜Çý?ø‰º«c™èšwdd©TÊ×>]W777CD"a ©íyxØ]û§Ýæ{oòLsÃ}¹“xênC\~ÍU¥¼>µô}Üõø|Yú»ŸÇ÷¯7¾“ƒ€{“g’øÕõ8!äºuë°{÷n¬[·ÎtÚ5==m^ÃѵƒŸý˯ðâÿ~™ñ~ó^P{¿†ž¶¼Y®0¨B•ÖÖVSl­F»Ÿ5÷9'Üu!.Ø œÈØSøïV&óº®#›R]!¬9'fÚ²´ …‚é€Äÿ~£¶"AÛÂH7s.*ˆ’m7´¬f¦5÷+:JÐcæ5s t]—×,Mk“q‹xrîwNǧ¢x»€¬"ŠW!'fºL©®a_»4ç0Åü4©sÑÜÜ ãÏéôô´¹¾©©ÉÌ£ðûÿ7ž5‹sÏÿŒ£ýl&ÿ•ý4Íåñßå<þÝÁ—ðÿü»¢Ïªë§¿WVÏÇ7­p¯GÓ\Þ’×ã{˯ÃHü¯:ÒJ>Ÿ·ôGº¾!š››«rÀ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0ÌÂÃt „ÚO³ˆûà¦X'ÎKÂÿ%?AÂÿFDèõXŠí§9F_&ñÿù!¼v®!(ÝøÇÆ‹ö" ŒyÿWÿv¯J˜û©¿÷~ª½iˆQ^;·¯9䣊ßÓ»j)Š©ÛŒ:e³K!§—ïX$#ÈåPÚOùÝ¥O¡sÚx9u¨eÊI#l)ÇëïêxúÝ’¸(ÿ%‘+QÿÍ ›^~ý]Šòö§úËYÅw…;‹Nr y ÿÛAºý÷JQèu@zBÈ÷~c÷åâÀ_ДÄÿ*ï ü¢çü²ú“øÿ­*:@°ý¿ýiÿo·{ ÿÏú ë~êï·dñÝ\ú Mù¸pS~Ê÷(ÿ%?AÂÿ@—>…ŒHPÕU¡iš€Ù=ySÀ«MhÈçó1MÓ¤L7Ö@¾­ôR¾¹n ßÝÏçó1m&±'·ÆôÚ„aÃIäDögvíÂëEec{¡`Úÿ]*d³h/¾Ø>ª¼Oë~^LC6šo¾YÎìÚ…ßÀŒÈèjß‹ÙÔ—±ÿˆ±$M¥¬K¼ ‰Ñi÷̃¤ñƒÎ³©/c(÷¼¹þšk®Á¸€çŸ‹¤ñ=‰ÐŸh.Í‘ªø( [vCðŽŽLöCìo’6†ðÿ¶Å9ܶø8ž~×pp¢Îw›3]×cm‘¬íŒx¼$ïçTZ6[t˜mÆ}Ü©!¤“ÀŸDöõªàaffK–,±ˆÿ£þGŽq¬¿®ë1±Ý½m‚:\UZX „u`ÓüHbGUˆMÇ®(–º®ÇT!r%Žì¶'ÚÑÖc(,UGjyhn­Æ¶Wüq\½¡,TÜqÇ@NjR'û¿êèÀgŠ¢&Õ@[±ý‹N"³ÿ윅«Žú‹ã½è &Ç÷îݨEÿÛ½{wh!¼Û±?pàÚz6cb@7´õж͛7GÚÿ6Ü2ŽŸ<º :ân 'U—Äÿ$æJâÕ©Žè|“L&qaÑ €é 'Äàà :::,N~žùg#z{>Ÿ‘€Z8c Ñ¿ú Q黆‰VuÐ5lD›JâÿtΕG!Öu=ÖÚ3-u]‘°â×õ˜ÛÕôªø?›•hoFç]fz˜hAâÊN´öôÀ]×cƒƒƒº»KQÙwïÞm:¸üòËÍõ›KÍÿ—4R)ãéè´¡´»üò˱{÷n¬øë¿6ƒƒƒË´6+‘JÅ€Q£=S CôŸJÅLñ?ŒNsQâk‹€¯½8ðO0¯‰kÙWhoF*ÃÍý'ÐÛG.›CÿDÁrëáB’H_ÿÀãOœptðø'ËFÂâ›·o"ú—$ÒWÅÿ€IÜÉ €a܉€ uÎð°_¶M‰T ±k¿÷Œ$'ïU„ý§â¾ÜI(û '§áSKß7ÓúA×ÉôÛ.¸wÿך…â„À š§>yV“)úÿtËJüzÚø¿Ò¼ò‹hùÌçñÆë¯àŒ³â8øóǰâ 7áàÏ+›‡UÇ:?“@3€Ÿ€!âÿ]*…_e³øÌÈâfFóhn7þï’øŸâ=š æ~ǯd)ÏN‹ÈvvkëiµüþYQüßýÞþênã^Å/ÆsÏh¯ñ¿¼½_ÃhoÉ$ÐÜÌù<ÆÇää¤ëÿ„7~r!.Øð:NxþËòµ+mc5P¹t]—Šà?©.кPÑ΋å·8Ñu] ÛJ׫Â|'ÕŒ Ó®ëˆÇã¦M»]/ô˜îtƒ0vBÂíHÉ«–À*þîÈ{¸jÙéøí»†€áâ)O¿S´ûÔŠåøÆ?¼dn{ὓxì ñý>C|ïÕ.2•J™"ÿææf´´´`hhêzšÿ;;;¡ë:„hii\{íµ4Ï‹þõuÜÿÿdÕv°ßT×°<'f{*s2 Åýo–û æš47' ±ƒo0…*æ·‹ûƒ`wD599‰ÖÖVÓ ÀÉ“w†Êa†a†a†a†a†a†a†a†a†a˜…Ç)€Uti÷«âÿÙÔqSè?K¹‹9Ï+¾³oOßÉ À>æÛÄÿ°ã§Ö n{»]òÇguâUÛk¬ößäÀ ¯ÛÅÿÐ5aÿgÛJQÉSði]Ë~Sž^!da ïÜ=d÷o²‰ÿœ¹ß}§$~ÿ«3ÊEîÄÕ'täLàþwo.vv`ø“ø†v{o‹ÙÞy¶ÿ†‡èŸ ñ?_ñ¿*ìÿûïy+®z¿,?ÀÙ ói‰ÿ`ÓßX£™n¿'SÚ¶¥ oý“Õ¬ýwY{8 FVÅý]k§,âÿìÔ†•îœö ´jèôÊŽ­›MÓ¤)ü¾äóù‰ùÍßšæþúÿZE'X h=VA‚¦i’„ÿ¯Û‘‹}ó±þ¦MøÍöíÇqþ¦MøÂ” "t]ÇÔÔ”EÀN/T“øvO]ìhCM£¾ˆmÄ»1;;‹¹¹9‹€›^ܾbtäA$ë’ŸšFúväÈ,[¶¬,b¼!„ìëëÃþÈãÚëvšÛ(Ò11:ÓêøÛIüOŸªØÆIøBç¡¥?:Žã_YŠÅß+%Yz·:_Œ§ß-ýº%§(Nâ?ûömNëÝœ0Ø3€„¯ÿOOO£¥¥Å"úŸ²Ep¶‹Ãèx;‰ÿýêÞÏ Pr`ùm[Æ €Sš\رc6nÜX–~ÇŽøÇÿößåS‘ílÎÓökÕÆ¶×¾G5Îß‹EYú×ßÕñ?æS©ýÿ14„cc®m€µ¿Û~?“ÞÇÿ—7ÜPûnû4²ÿ]rÉ%8qÂYtë¶­Öýï™16æ^ÿnømÍÊð윎3‹¢ý“‹óüôô´gÿÿ#å÷™ïûþâ=½rI¢ñxÜÓyDzª¸SÚ „±dWNæ2Æÿ¯lVÚ…ý&ôœ¤ 3­êy"~]£PœÎªøŸòí¹Î*ôO\éÿ¿ËÉþàà TVñ>ôMý Uÿ_榎CõŒÕÝÝ'Ÿ|ÒrM288ªO¶·èH%†øßl¶Ô½Œ¶˜hAë ¥k­&T7U&NÑÇÉ @Ïè Ú[tKY:ïèBn˜˜0÷BÈÉd³Ò~ýoÿÛÄúÜÅþNŽTÎý”À]?>Cüï$vû;9PB`hhÈϾê>òûן†§Ÿ£r”ÿïTw=n8£øþõÀoŸŠ{“g’cÏòPxÞÛ¯õ˜ÿj-¼·G¡oii±”AÿìH£Ö躛yþùé–•æ:rðooÏá×_Á^‚7^…ÄÿŽå¤uWç¶gçt|¦¸m ŸÇêñqŒf³8Ó&ü Àêñqó‰ÿ×®]‹k¯½333xøá‡¯e³æäô™Ì<;›úá>¨íßÖÓŠŽIôŒ´"‘H`×®]øâßîÅ‹ÿûY|ö?.Ï>û¯FÏš8¾ø·{qÊÚ^¼9bÌùl@íýEÇ|!Þ¹à–G­Î±uïG¸–œ<%>G¢( òù¼¥¨Ôïj>¶ßžÇíÔË.Â?gâ¹#†^u¼gŠå/:o^;fÜg#ñ?€Øc-ùnUü¯Ìá¦3r:’J¥ÌÿÅêåÁÁAˆeÕ“³ãr\¡–YunàÅcÓ’Óƒ»ŸÇ½É×L 7­0íP™Ì²©ÇyÅŠ±@‚}7Gäbrr+VŒ0hšFvÂxc†a†a†a†a†a†a†a†a†a&$1UüÿŽãâ¢^ñ³é’þÅaC|ù¥l¹\Î"º¸¸츌WÓÎi6 Q]õT#¢§—øVÿvÈ"ò"ð'zÞ·Š ,QJ×" /ñ?`D[W5®Aþ„/§’øz»†pàLCàž¹õS¥r…tQ·=¬è©ÒÅu†=µÍÓîË1ÜìœftZ” 4M“GoÉõ{À8[b~µ£ýg÷äñÖ½€6Q.* ñ½=Íìž<Þ~Ð*ŽM—>ª•í¿wíZœ×Õ…×s9üfûv3Šâx0³kré4Ú‹/·;Ù·§™Ùµ Ç2#c‘S²Y¬/‹ŽšN§-’ɤEàBs¥ÝÀºÄ«Ø=u1z¦§-iiÊ«¥¥###®â÷d2iq°lÙ2‹ÈG!ZZÊy Ä IDAT¤’Ids9Œ*óªBÒþ”WSS“«`‡ÄÿÏ?oDÑ\¹r%âñ8’É$V­Z5*ýÃÍ¿Ä8ŽÑ™VlذÁÌcóæÍ–<ÃF½&ñ?ÿÊRü»Ô›˜¾ö%¬_¿m ´§ß5ÄþW÷SÏS†„Êí»í§nëhn¶8p"•Jãìk»±~ýzô´•&ˆ©\#33®íOâhiiASS¾õýAÜÿ.m5,ÌÍÍ™ˆ¹¹9‹ðÁ.ž«EýÕõ4GåŽìœ}ý×ÃX¿~=ò¥6ˆMó`¥QáÕßjDv§²×»í‰v‹Ã(m»•áñÇÇõ×__·2Øíÿª£Ÿ©¢ÏUkÿÙ9W79;ü¨%š¦ÉÍßX‡îÿú¨e½Sÿü›[Ð÷íݵÜ™”÷?m=Ñ×Ý« nÇO][—2ü"i?Öѽñ윎ÏËè„MBÙÝÝW^yã¶k5 à2“vòûøR÷-¦ U!„,<9€¡m†¬T*†íC93â=L´˜Âÿøu=(<9€xÑ1@¥ç¢d2‰%K–˜Nq ý4̦Ž·—œ®-É.Å£ó /¼ðfgg-–Ãî µgÚt `';5…ÑiÃPrÒàt½íd‹æ?'A$øŒky{yú'Œkß]½ç µÇzM:9ÐbY‡¢EüsXçˆê8€™ö›·oÀþמ²çé†L¥Rªø?æ°ÎÕqPºþéèèÀÌÌŒ=Ïjß¿þ4üö¸!ü'±?­³‹ÿmëcêþʺ2„rݺuؽ{·ùazzÚì¿$ú]²dI$âÿ…R†°åýtËJ¼{â%ásóÊ/šfžÆÓ €=?À8À¯$УiÇqQ*…Õã〞¶<Šÿq¿úÕ¯bppt^ÁÁï|ð…À?Í›×)AÚKý/J$ ã‹»Ïüåj|ño÷žùËÕ`Fˆ§ë‚x<Ž®|ý¢²kíÈ7~r!.Øð:Pìï¶ßõ@f3@ª fl¿«B!©r>‰­kaË ”"Å œ{îr¼ùfyty=Vür“ñ¢ëÆpÎâø«3™¢~À*ì¿ûäø¥m]øo·m‰]¬ÿȸ’ÆV^}­î.þo+§Áêoè;‰ÿàï¿wª)ê·ï÷gw¿?÷e—s€²úo/ÿí¥þÒ¤´‰_ÝÄÿäÀÉ!€]ø¯–@)’kq½“øÒC%Q?`ö?¼Öh{u—sµþš¦ÉGyë/Y·,¾=¿ÀTIüo²Èè¤6¡™£qv±î­ç ÇÄ’5Þ¾ÅØ+ ™ùò#¸õÖ[e>Ÿiš&÷ìÙƒó~ýkËdp €ó7m²YSüOœ¿iö=¬7íÏìÚxÝ&Žo¾ùfì]kˆO)î÷»T {¾õ-¬Y³Fª>Up¡ëz,—ËY¢ø’ø¿gÚÚÉ×%N+k_u:ÎÓÓÞÞ2ÔHŸº®ÇŽ9b±OâÿQ[”{§8¨êþdß)’(åÝ×ׇë| ‹pS±N<ÿüóÐuwÜqGYú'P:'äóyü¹þC<ãèëÛj:¨FüKtÿ< Ü©­`ÿ‰«Qr îsà+KM'aE/^é© ûÛuLå !?áä ›Æ@ÿDÙz#m#3–¼eâfÔÕEï–e˜™™Á’%K,û¨‚ØZÕŸê®éæø`ùîä à­ç€õ=ëËÖË„1—Šíá#b›e)î§F2®A„íP¶ÛzFëfÛ­ ×_}]Ë`·ÿ™‘‘†Ú¿Úe=Jñÿ—'0ø7°ˆûÕþ§¦Ûü  ïÛ»e-”÷¿èëîW†Ÿ<º¶neø¼Dìsº¼ºI˜âÌ«GFJß‹ë£ÿ…Ú©ìÓ¶®Hðïæ€Ö“Ø¿kxÊÓ@PHŸÍÊ2a{kÏ´zÊö) Û×[íSêú^xÐ7uÉâ:Õ]nê8^xÁt`ϳÔ€ÂÙ©)‹è^m×lVšíTkt]N[ØËÓÛVšÄÿÖ È%|„úNë%»“€X1/I΂â#Ôwµos+æe Ik€]¼Ovì i–ñ®Ççå½ÉS-ÛÖYP…÷€!°Ÿšš2xÝ–| MêB P(à¶ä[øq®¶s®_zu½z© ½ºŽþ:{ÜÊk´ƒá´L×uÜÙº?ΙçŸÁ¿½½K.¸pðç‘Ïòª×tn`8”ÇÞµk±z|F{óH&æö‡?ü0¾úÕ¯šû\Xœœìƒ0<<Œt: aø1< “¯Î›B:¼‰“eéIôOŸ÷&ÏĬø7<4õP@ì¾ÜIùí?YŽìÁò¶ôƒ„þ+VŒ/¾³³³žûàŸÄþÞÈ©Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 —Eº®Ç6 EQ©›øŸ¸x¸´¨ìÏ–„·çg’8?“´8 ÕP.ðð£çý¼vn§¹¨¼*ËÓz‰ÿ+AŒ µL™‹ŠMw 1.<Å뱫›„!Nÿ¿ýðq|÷°ïÔ³ñÝw>Àwßù_Š_Š·(Ç ~©|¿ûä¸û䦳ÿ«v€ðí/Æä4ÌEÅ.|Sÿ³Fâ8kÄ­¸‰ÿ‰ùÜ鿢òãçJþìî÷ñgw¿oqª |ý›¶ Äò0Õ1¥uþ«=f$U7ñ¿¹n¦´¨¨ÇãáµÆ¢: Œh¡jÄVµþGÅ’5.}Ôhó½ï5¿†Àÿ­çŠ?ÖoÝ[,Ë,,Q¿/}TÃÞ‹÷šßµ Gµì{àÀ4ß|³aqÑ7šßCàOâþߥRøƒÀ'—.M8?ÿú×Íï«ÇDZèÆÍï_xà8p ¼r¹TÑžc¢â6?Q‡šOÎ>A¸ FÕ¬¥}ñx¡ û`ÿþýˆÇãH&“øº| i¼h?:ÓŠÑ#"ýÔÔ”¹_>ŸG__Ÿ¯ ÜYŒrø-ÂݳÊçÓï–œ¼8|ÚË1TKIü_®tŸÊ%,KØí^9r!0Yìë333–OÀAc‡ééittt„²á‡“øßNlʺ„ÝÕ¡E£а½PÊðqµŸÉl7¿;ÙwJWkÝö.Ãç%bÏÎéæ5ìBÿNíá&l€Tý$êwH£¥k¸l¢uZ]×cñëz¸Òøßå©~r …'Pxrñëz09ÐR±M‚Äü»wïF¯®csb)Öc)R) « H¥€õXŠÍ‰¥èÕuSÀlwP)$æ§:Ó5tvjÊ\˜zFg,ûÕµ í-ºåšÞ UüïvÜœðq `GM{ü‰ØÿÚSøæí€r±| |œxÚÏf³˜™™¡ë¡Šì«Åÿ4¾CÔï”T~ÿú²kP_ûº®Ç¨ß&“IÌÎΚÂûvãœ(Þ;¹æ¢Ú \ƒ–aGQTKeh¯¡È¶Z¨=¨lÔ^¿ž~ï¼]@óÊ/0œ„qB¢Þ+Y[t"÷Z6k:”kï×ÐÜnüG9øï`ïÚµDGG¾ðÀhG¡Pí ­W×Ñ^ýbxxí-:’©) ´7#㙿\gþr5âñ8rÙ’©)´·èe‘鋪îÿ6¤Ã‚ 6¼Ž7~r!øŸ~;íWkb©. ›1í8­«Ä¶ü}&†OtIÌÌA×õ²%ŸÏ£P(`ff­­­ªý(¤¦i¸rùefŸ€ Êý¾øÓE¡Êtߌ9×™˜¬s N½ì"r2{îÈ{xìu {ð%Ü›<3”M¢©©Iÿ›(ëLû6±,›Íbrr³³³5›÷ÿàÜOã·ÇO%ñ Åyÿ¾ÜI»£ƒ˜Ãb´ :bˆ99Rðƒü0Dü8xð¼ûî}¾öˆK^ö| »}Õ<ôÐCXSt°ç[ßÂ"«ÇÇñЗ¿ 8pàîÇÞµk±èƱú€ñq<ôÐC–¼ìùºµ‡×v»Ï +Èßo»Ý @­ì“0¢Úé5Ç@ÎÑY9hÑ11F[Ïhh !±Øá üïWÎ!Nö7 a8¥>Ž×Ö(*5‰rHØï$þ·¯ïPDgªðŸÊî´?‰«ðŸPEÿNõ?rä–-[†ééiS8Wmý…RÒMA? ÷ÝÎꜨ:HQ…ÿ@cDË S-ííýpôçóùX{{ÿ‚¢TP…ÿ^ë¢D×uLOOIç8W†p ÀAÌïˆ*Bî6Ó›ùͧÔú!dâÊNC@s™Ã€ ÌÎΚßgffLÇD£3­eiUG9ê~ÕšB*e½& R£­kÿ?IíStm?:-Êœ‚@kO©Ÿz•¹(ö§Ÿ±ÇŸ8!ÇOÊì)y*ëþמR .‚Øâ5‹i?›ÍÊlÑ»C5ögffTG®öÝ 11Ò¶*tÇ÷¯? w=nÖ ë½O§v„2™LZ„÷BIí‰ëW'Ð3:r ?Îíú¿=¬Ý© v‡7¡tÍÝ[ÜÖ/DMÊ@6ݶݖ| L±ÿ@{O–Æý@{i®Ñu=FNfž&ôüSL/ãñ8Úû5ŒÆãh/ìÎã°z|\Žf³¸(•B¡ØÃ¶ûÄ€ŽLИþ%M*‘ÀÄD£¶ûiq]@.[ÚGÝ?7 Ldt´õþOTÑuŒèŸÓþ¡Ëaü“èßÁ @ Š¢?¨N²P( —Ë!•J¡©©‰ÔÆáA Mk( ( `ˆÿ Î;¼û‹Oâ„4„ë÷åNÊí_û$6ýÝ¿*˽É3q_Μ×b„|ì µ^½Æ˜O¨y·©©)й@×uO‡wSSSªÓ€ÀöíÛÁÑÁÌ}¹“ò¦ž»ËoÿÉrüæÍ—-ëÂØwÿ›öˆûM'•Úg†a†a†a†a†a†a†a†a†afáay±0ˆð;ö—Åíjù2x¥„}9»öì<;§ãê¦p"’gçŒö?ë«K ÌÀBmÿZÙy»ÃúV´Ý@ÐúGQo¯2ÔÊž]dwàVU„ï†]Ôt»]äï$¤ bß.êº=ˆ}?„ò@ûiØ=e¸7é)Š´ŸØ=u1z¦§#8 !ä@K ²E±= AZŠQ^ §UÛw-ºmSéoבJ¥ÑÖ3jÙ¯^ö_WÇñ¯,5ç¼jÚ‚l‘€‘™O¼Õžo‚Ö?™L¢¥¥ÅPTZShQtà'þ¯vÀ,d4M“›¿±W\žðÿÛ÷íŦÐ÷íÝg˜…‰¦iòæ›oF"‘ÀOúSìß¿ßÜævœÁZ%ýÀ2׊òÿQȤ¦Øß¾ÝžV¡êëƒÂ“Ú–ñ*&­Ó¾ÉdK–,\~ùåôݯ»»/¼ðà €*fƒB¶·èH% ç?©TÌÔ{]¿O´ ›5]vj £Óþ×d$ôÒžêo‡÷Ðô›ÊVðëÕ‡T¨?‘ã·ý„¢Ž´+µObÑ*í»â!hWÓÎ/H?P¯³¨OÐçmÉ·ðãÜÙP·°¬¯Ô¶[vèº)öß(zuÝtÈEëXÖWZ¿ëK¿úÛÛ‹lp¶â[¦ƒßùNÉf±z|¼l¾×4Mþüë_Ç)Ù,>S¡€þv£OéÃ(klj¹lýGÛ£½yä² ³ÎD¯®C¤‹ßG+úoXíõ~¤‚/|ÿ•–Ëo?©ÎñxœDÜam–l·_Hü¯ÇŠsOé6—=_ EÑ?m—¶ßîöйžøöŸ,Ç7þá%ÇkÄ=ËXûnóó¾été©—pßÌI àº¯¼iðØA粺\sÉ{“gâ…÷NⱃŽå’@Â} 5MC>Ÿe?`Þ Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã,PªzÛíÑÏX­"2‡Ý§–BÃzÙBH¿ê?êíÿqï ©þNâ|Uˆà·½Zêm¿ÖÎít£Bø $“IlذÁü½yóæH¸±C×ñÙôRó÷£óÏ¿$È`:¨Qö…eË–!Q,ÀÈÈHEöô¡RÝÉ€JØ¹Ç vÀ,dÂ8`ñÿG û5ÅÍ7ßl~ßµk—%­×±®F|Jû;­J„ì…¦i²P(@õEŽŽ‚¦µCâÿ‰‰ï oE%_·n}´ñxkÙ9¨P˜Ä-· `÷îÝfúBammÚ ‰ÿ‡²9Äã­hoÑ1:-0ÐތΡaWûCiôŒÎ˜é …It¦’¾N4M“½mqGNÇÛ¶mxò»ÿ£ÓÛ¶m¼õä ξ®wÜq€è…éaœÔÛ~ª(cÝÿƒ4ú~G­Ë°Ê!„étSSS˜™™qá777#‘H`xx¸jÇgö¹¥RÛny~¨åÿßFÔÛ­üá„ðm†ð@IüLT_‘€0ã,ÈüåÝ(ìÃÇé’j›œx¥sÚOqŒàé ÇÏþŠc8xð†ðöK|˜æ†a†a†a†a†a†a†a†a†a†aŠÔõ%íZ¾Œ4m/=×Ã~%‘C?.íï׿>õÿ¸Ðh~#퇵­F M&“¦}xx8´íjíïÐu\³ØXábQ±ýŽæfó·]ü_­¾ÚH¨NùÑ>Ë–-CSS —˲g·=·©$°‹ÿÝòk´s†‰Uîç H:æÃƒ“c!"è1®Ö€=¯Jö«…}MÓä®Þs¸²CÛ2H¥bØ>”s·»¥8¡v011€¶¶@¡0‰x¼ÕÜNÛè¼§¦µ§WÓ­k½í;9p;ÖÝÝÝ´|oo1Î×—þ_[ÌmD£®;£r|µ}†QÑ4MÞ|óÍH$øéOŠýû÷£P(XÒÄãq\y啸ã?þcLMMa×®]5¹h¤m¦aH´_DV¢"˜ø¿”JNÌÏ4°i8X ÁñF#츗¦¦­ÈF5Nq¢¶Ï0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0ÌÂ%’^^ŒòeÃFG9k´};·ö·Ãõ¯oý?êxDàõGý|”ö+ur¤¬ûnyÕ*’m-Ô»ýƒä´üÃ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 ~!a†)£R¸}¿(^|¯‡ýjòªV@_Mµ¬¿=¿z;`†aƒ*þ‰úi?Uðï”.(aEü•Šþe_=Ouà¶øÜË0îÐx :w¹¥/ _37Â6ó‘ÂéœÀýa†a†a†a†a†a†a†a†a†aæC ¿ Ê0 Ã0 Ã0 ˆCŠÀîs1ã÷çêöŸjXø¥Ø0 ÓüŸŽa†a†a†a˜)µvÈ4†Z;7fæÃI¶sÚœ RC-±lç´L µÔq>˜Wæ¢ÓbÆïÓx>b†a†a†a†a†a†aÆ).Ã0•`ø\_ÆñÙ (Ñí:êo?Óœ1íwÍtÕÝ~>½Ô´¯ ¯»ý-[¶˜öï¹çžºÛO¥R¦ýl6Û€—.ûò‡}ü²žã0Ö[²/û‹õBÊþúÙ·¿LsFÖsÚÇ_>½TÖsÚû*•’OÔÈèa£™³ýÚ ¾ ¬ëz¬~/yÂ!Ö˜ktýb t=z'$üN×e·Öõº9°·=l²ýhíÓ 2–ÂØ“o˜²µ¶ß¨r,”zõ,ÏBª{£ËÒhû(ÃB¨³J£Ëóqm.GãÛ Qöí"ÄzÛ_(ehT9Y÷F PÃÚ®§è9êvYˆÂß…X&¦!„ܱc6nÜø‘pÐèón£BÈmÛ¶áì³Ï\vÙeXµjUCŽiãî=.üú¡½MjÝF~ÓÈ{à åú¯Öé3$üoIZÖµ$Q­€`}v¾xÿ©¹F×ç¥K¡ëÖçÀQFqìØ1³ÿwÞyúú0 Ã0 Ã0 Ã0 Ã0 eÇ? IDATÃ0 Ã0 Ã4ˆy)„0«9zÆ‹}UŒ\F¬ö-Îê@¦9c±¯Š‘ëA>½Ôb_}¦lÙ²Åb_uPR©”ž*†Žžyé4þê5Çé4þê5c½±^«}ú­:ˆŠLsF:¿zÃ|z©tõ‡©TJ:õÿúƒ'ÔææRšêgÿö®ýæÒûÙÎis©§}µ ÛÓ餱!ÌÏh­’þöEV†aeîw³?\‡ó€B>|XŽÉ;wÖõø³ýhìSžêg-ì‡É7lY?Jíÿa(ÇB©w#ʳêÞè²4Ú~#ʰê¼Êóqmÿ[9¬÷*êk;lž^¿£¶µ-íK=ì/”24ª¬»BîܹSŽÉ±±±š]˵Mý=è5÷Ö­[-i¢*kز-´ü£.S£ÆçG™ mJièø|ØBærccc™zÜï²ÚVÛ°Þ¶·nÝZ6ÿÖs¦r½÷æz¦’ôD!û™K‹sÙYúÊ':e ñêõˆöLûd3 ˜K=ç–¨®Ýÿ¨MÕ>3kßRŸ7¸ArP‰}Üeµƃö¾=ïk¿ä H~eðø]Qj˜`ˆÿÕ>§:`†a†a†a†a†a†aË¢F€a˜0žæ·mÛ†¾¾>¤Óé¢'úú8äF!,ö7 º9Vû¢S ^N2ÍÙs¢Çb¿çDêå Ÿ^*¯·Ø¿btõr°eË988h±?88ˆz9H¥RòÈ‘#H§Óèèè@2™Ä‘#GPñ³1ö„XŠþví-Æ"ÄRó3ÊqHco£û…0?£‡±^ȦíMÛ­ö›¶ ó3J'4özNôXì÷œè1?£‡4ö®·Ø¿btÞüŒrRß?räˆÅþ‘#GÌOvB¹nÝ:ttt`åÊ•æÒÑÑuëÖEþœB^tÑl¸e«‹ÌeÃ-ã¸è¢u±?pÎ&:r¸ yº¹Ltä0pÎ@]^BÈöýí:®ë>Œ›îÃuµýí:F§EÄQI!ÖÀÛþŸ‹¤ Àì.Îõnöui òœûöí³¬ëëë«Û £l?ûº®ÇV­Z…}ûöaÕªU®c)¬ý ùå£Úþµ(ǶmÛ"z-„z7¢< ©î.K½ûÝB(C£Û|¡•§ÞöBŸ[èåpjº^hoÆÄ@{MÊE!äÛ3!„Ôõ=®¬FƒÂ“–ßíÍõ0»àÊШr4¦Böõõ•­ß·o_]þwÛû;à>ßRYóù|ÙºZ—5lÙZþ•¦LQÌ¿öüìÿ°Ú´ÛÙ·ovìØá9ï !äŽ;…B°cGô÷É¢B!''u˺zŒzö·ë¸-ùnK¾!„¤Ï(m«lÞ¼›7o6¯_¿«V­ª—ùP÷í×/ö맼äo$BÙ«ëX›0~Oíº^VÖOt~ÖLÿvG¿zÑ7_ý+º¥ æï·æå3º¿­ÚŸèÈYìSÝÛu›0—v]G¯CDE­¯‚Ô½ܤ”g‡®ã1e[¶sZ¶$=ïOtäj©øþâ—•ìÏ߯ã—Õ­Æó_ï9à8€ÓbÁò³¤ÿ‡¡Öù†øùòå–çÿË—/;`†a†a†a†a†a†a† …á}ž"ÎlݺUnÙ²EvttX<ÏG…iÜÅ~äNF¼íGí€"»ÙÚ E¹p³µ€-[¶xÚÚ E:ß²e‹ìîî–²££C¶¶¶J!¢Ž€>oFyØž†%úÜö4"4ö¼ìG-þ÷³µøßÏ~Ôâ?ûQ‹ÿýì³ø?Z„²³³Snݺµléìì¬KÔÛ»öËL&W¶ÜÞµ¿.ö³ÓòÌke Eæ‰Ò>•ú»¦irllLjšæ…«¶’ÁìФ ÃÅs€ŸýሯÃè…p»ýz Ø~íí !EÕ«Ä~мƒ–ó£Øþ ½ ¥Þ(ÏBª{£ËÒhû(ÃB¨óB*Ïǵý?lå ué$d&¨I9£hºn¦(±B¸GŒ Sw¯ß•–SNed6“–B™Í¤kÖ®¦24ªª»½ÏÕs쇱-„ÝÝÝrçβ»»ÛÜNë·nÝZÓòFÝ.l÷Z”)ŠùWÍ{llÌѦÓú«M»ú©>‡p;OìܹS a<3P‡±WÛTŽÚïA]ÆBÞÙºÈrÏyllLyæQ„æq¦2Ô«Ï©ezïQ½~¡ïtÿÐ-ï0éiŸF_{ö£¼ª×réCó2}hÞ¬‹Wy…(EH§ïjõ¨ŸÁ!¤a>Û9-鹓š& È\¢|I£>c"Šk  uwÚ§–çù4 ÇPÞžj™Ô1˜K@ŽÉ\¢ôl’ÒUbwÁès²ÓXî‚­ÏÎ[ì»ÏF:ÿüÊËàÕÿ+©S-ó;vì˜9ç:=ÿg' Ã0 Ã0 Ã0 Ã0 Ã0 Ã0gQå»ÎËÒRÆŠ ëyÜΤ¹4€LsFÒÒûùôRIK#ìoÙ²EÒÒû©TJÒRoÛÝpþèOÿ3üùŸãkÿ÷=haûlÿccÿè=÷à[ß„ÂÿŸ#hžœ¬›ídèX¿~=#*M凞Yˆ¥ˆú|èe£ˆú|èe¿i»@”Nüì÷œèAÔçC/ûÕDŸ©…ý#GŽ žç£F½€ØûBÙÑÑ•+W€‰Š>W®\‰ŽŽŽÈ^BÈ ·ŒcU¸dïéiµ|®J,†[Æ#µ?Ñ‘ÃÉÓŸíYaù¼ y:ê1hÇŽfT·B¡€‰öz˜eû.ö¢c²ý—}]×c«V­ÂªU«|#›†±/„±‘òV#åUÊG±ýkQŠxY/{µ¨·¦iŸ3êyji«š:׺,µ°u¿[eˆâøXúþB°_Ëã]ËvoDßw*‡SûÓ¹vtZDj»š6( ÇÖà÷C/¢}Ïq´ï9P£â†±/Dtu™ìB[Ï(&ÚÑÖ3ŠÕOU›eÅe(<9а24ªjÿ¾¾>³Ïõûj'Ûnóí5×\Ð4ÍŒžN§¡iâñ¸ã>µšýʶ󯄠eŠjþµ—E½V>ٛĪU«,÷?Õ¨ðvÔcäôÛŽ]ìKãÇoŸz݇lÄ5ߊæ,÷œï¼óNôŽ Ü–|«¢ói%s®ë±Í›7cÛ¶mæº}ûöaãÆ5¹Ÿ¿{otíÀ¼–ùýЋb¹½šô´.™L‚–z߃ïÕu ¬MmЫëf¹t}>ÑùYüÙÝïcâÆå˜¸q9Ò‡.ÃÛ¼ÝQp¼¦ˆVz¡z¡ï¼ ˆ s;¥âŒBœ3xqà ^8ˆÜÄzNô˜Û…²]×±)aìÓ:#,Ÿ›@»^]„õ Ôò(HÝö©Uÿ£v½ Àù àæ‚†› 6%€ºŽºŽöbÿ"ìç›jîSß;ã2à»:¡5CkìÄüý:æï×A}Sµï5„Í/Lÿ'¼Þª$¿ 4úù?Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 SsæËÛ÷Û»öGj?Û9-ßȼfÚ´§=QØWËAx(EBо’þöEV†aåàf¸Nÿ…Tûa£ê±ýpvª±_i¹ÔóKµö£ˆÒ÷q9þ ­QØÓ4MÒUyjQÎZÔ½šºÖº,j™a!µA½ìÙ=ú~T|Ú¿‘å¨Ô~%åBÔ4u­Ž=]3¢Sšcéø¤Í»FÂõ³/DøˆºnåS÷¢}UNed&(k×ZÿYehT9JÝ)ß;wš¨>\·9Wíï^cŽÊ¸uëVÙÝÝmޛغu«Yv§ýjuŠâ\uþõ(S­ç_5_ê‹jdÞ(Û§6í¶ÕO/ÛB©: ÷;Fj^BÙÝÝí›?«zÌÔïb½¨Û5—Û=ç;[…²_íµ—BªyPäíJòªÔ¾ß½GõzÆéZÆ~6=íÓÚÚ*{Ëg=ÏE¹d1Z{?JÑÚi»B¦Í›×^ôÝéÜ,„5ZºÙGd§<ãA˜‘Ë£z#„ñ܈îo“}º§íœ–ôü)]¬3ÕÃþ]m‡Z¶wT×@aê®îÓÚÚ*3ÍËg-®ó¨=Çlí,„0Ÿ/xÁlçtÅs‹BBÏp¨/Zû켯}zþ,¿’í ý_ÝÇë¨Jò ±cÇÏ»ôüïØ±c ½&c†a†a†a†a†a†a€SÂï2/HÇ%„X ]Ÿ—Ài‘{âäFa¦±QŒéº¼ˆ>À¤è´Úúˆ.ѽýLsF’gv‚"wÍtEn?Ÿ^*¯·¬#¯ûÚðñÈíoÙ²EZÖ bË–-òž{î‰Ü~*•’Gޱ¬£ÈËÙl6bû§Åt}^nܸÛ¶mÃÌÌ Ö­[‡Ý»wC×#êñwÓu¹qãÆ2û;t‘¿ÄôgûúލÇ_×LW,Óœq´?p΢ÚðñX>½T^á`ÿ@ûiˆzüÝsÏ=±-[¶8Ö¿»»Q¿l6K¥Rrppét¯¼ò ’É$r¹–-[†èÇŸÁƱoß>¼üòËf@Ôe zÙ¯Ëô°?·I‡ìoœýzŒA/ûõƒ^öë5„’ƽíSÖ#“Fô™Ôä$²­­HMN­­Èåru±Ï4]×c½£Æ‹kJÝ­õÏÅtýì5"s•Ûßàs‘•! Ću]v GûƒºŽt=þ±Û¯7uûB¹oß>¬ZµÊq^ó³ï·¿º®Ç6nÜX+û‘ŒÍúñJ½Ë…=Šd¹yóf™ÏçCõ•(ÇAX[^hš&•zVSŒªËb‡D9aÚ¾Rûµ?W[†FØs;þQöý¨ù(´=Ë´ï !ÍU<þam;ÕI×õ˜k$(ˆäÝÇñÄO`ÕªU€³Fâ€p¾¶w³oØÙƒOÀˆ¨ ß³FÔ s(Þc’°lÙ2äögCÛ2fšeË–áÈ‘#RI4û@èú÷ ÄÝÒøþË ëÿBü‹TÒ×´ €ù·¿(j×uÇr´ë:F‹iŠé«²9pÎzÐ# c¾ÃÑfÇ|FĈ4ÓÛž‘ÔŠZœ·+%èx+ ÈçóÆ@³ŽžÍ›‘N§ÇñôÓO»î·ÏC•ävœ‡Ý¯VuÖ4-t{«\vÙe5)ÇB· Xÿ—¾üòËØ¶mî¸ã×ÿ—º®Ç¥_:!„ìëëC>Ÿ/ÛÇ‘N§1</{G÷ŸÊç€Òóß`ù)¶ôÚÇ侮ùå¼ó΋;vL._¾¼ìùÿK/½„óÎ;Ÿ½1 Ã0 Ã0 Ã0 Ã0 Ã0 Ã|¸°zq·/õŠ@î¶Ô+¹kýëÜm©Wr·¥^ÈÝ–zE w[ê}ÙƒåQ0¢{A»ýÈÇ1âl?ê±GдÛzì4íö£{A»ý¨ÇAcÐn¿žc¯QãO=ÿ5büÅzÝíÇz£·¯žÿ1þÔó_#ÆŸzþiLÿ7^£ˆnߣ¶OQÆŠ‘Æ€ºDABÈÎN#Š E£({´>*Ûdÿö®ý’>3™œåw=ìSФþŽÚ¾½,‡–ÙLÚŒÀS»ÜIëgùvgûîé½ó³2\œË‡]æôaÀѾWz¯ü*ì\¢×Û>å_úoÞ>í[MdB!ŒˆOvᢟ}MÓ\£Ö‚úñ_¨åˆÂž¦irçÎrçΡ£CÖkµåE5õ¬uYª-W¥öjÔÞSÝ£îûQòQhÿz–#¨}º–¤|ÝòS!j:¨mkù¤3"áRÞ^~Ýì«ù¨¤®’þg3ió\røða³]S©Tdÿ…rÅŠ1 ¬÷,°^®XQýu—W»)ÝÊ‘.þ?¯E[ÐÿËÎ3:=mvžÑéÿP!JѾëñ[µ4⼥謙b]¿Hæµ:Eq.¨$u>;ÖÃνÕοÕDF§úÑÿ-š3£ì—°i·& <[¿ã³sçNË=½­[·Ê­[·šcÞ¾£Ú¾Þ×|j=ƒ¶¹j#§{ aË@ßÕ%l~Õ@ÇÀëÞ#••æ¿ëŽ é…ˆþþ·ßÜGÛr #J{¿Ãyžê ³ÀmPŒNî©<Êg0”'=gÊvN›ßÕ4tí“.F©WGyí $Ú¼¯»Ð‰Lør©;¥kmm•™æŒÌvNËÖÖV3mµý®-³ÓRÓ4™íœ¶\kR:ºÆ£úÓÌvN;Ú¦õnÛUûg< ÌÇâ¼c¤çÀvûögÀÁó+¥÷ëÿaÞ ’_XŽ;æ8öŽ;ÖûŸ Ã0 Ã0 Ã0 Ã0 Ã0 Ã0Œ/ôËIÐ8o>è<¹–O§`þù•C°œcʃV'ûnû¸åç ‰Å#ÞöÝöqÍÏ2: 鬛}·}Üòs‚¢;=L§‡ïnöÝöqËÏ ; ŠI|ìfßm·üœ !¥“ ’^MÃúП¾»íã–Ÿ3~ãŃ;wî”[¶lQ^8uOñBcÐnß+½W~eø—gû^é=ó³á7^h Úí{¥÷ÊÏŽßx¡1h·ï•Þ+?;~ã…Æ Ý¾Wz¯üìøƒÝÝݲ££Ã|éÄ+½W~å~/ÏÏJÐñg·_«ñGB~7A?9 ôɾWz¯üìvûõöö¯Õø Úÿí/ Ö®ÿ{#ÄGÛ€×ËBBz1¸µµÕüîæ ÈË”aì“ð?“ÉÉ+ÆÌïnjmŸ„ÿod^“™æŒùÝMxÖ~}¼^€«$?+ô‚jéÓi»»}çôîùY!q¿úé´ÝmqKï–_%„mÿZµýÆö¿Ò>ê ¾ê¾Aì{í!„Eágßž¾Ö|ÔûßB-GTö*ŸÕsÔ¢îµ ×ò8„-W5öjÔÃ^-4z²ÛŒZüæd§ã/ʾ¯æEâ)#_g!X˜rQ;Am«e·×É>G«âÓ©añ¾Ÿ}úž>TºWCß+í£Bÿ;éÿ7•>S©T¤èJ¢ËJr`/°^?4ÓUs®óA !d¿rßÛ^Ž4J¢@'q`¥eÊ4gL'v›gt: Öj…×üõœëÕ߽ƻ%^â šóPÔsM¹Î­{Ù©fî­dþ­Öù‚},øëj‰Ê¦ß±RÛØ.‚÷kû (?º§'DÉq†Óþj½Ëçâhë´Ïyå¦\Ôæê=ç0ùVãÀ<Ÿ+ç*õƒ°eq+C­Ž:ÀI/„q B÷¿é»ýw5Ç[=gÛÏÝ~󞽜òòƒg<™O/•š¦É|z©§€Z?ƒ¢äÈ–Ž]OýPu~@ßÝÔr"]rP6ç´A"]ÙõVкS#Á¿Óïjêiw(l®@¿Ý»Èß)?ïÌí•>¶»÷}çôîù• þ?Ne€²þæ¨ ùÙ!!¿› ŸØŸÿ{¥÷Êa†a†a†a†a†a†‰¯‡UÞ¾œ€ø”n9<Ìòó|M‹Ó>Nù92RòÓ§}›oýöqÌÏzت~Ú·ù-Nû8åç=XW?íÛü§}œòs‚ÄÅê§}›ßâ´S~NÐËê§}=|ýE –OÚæ´S~Î4îá3à?^ÂxŸ’_~ãÅg º¥¯ÅøS·{Aò³ã7^üÆ [úZŒ?u{±$?;~ãEƒN‹[zÁƉûÕO§ín‹[z·üì|ÜÇ_ãû¿7B"z釾Û}½öí BSÈï$è§õ$þ×4Ítà•Þ-?'û$äwôÓzÿkšf:ðJï–Ÿ“}·ïÔí$þ§ˆAnüòs+ƒ—`S!™„¹8ý“Ÿ•CÒ9=‰ö9Ú+·oMéÛÓ“hŸ¶ûÙ·§w˯„fôK5ßJ^Ä^ˆöƒô¿0öÃõ?÷²Tb¿›AÊâg?ÊȨÕþ6h½Û¡–öœêZ‰½^ã u¯¥ð½ÖÇ=LÙªµï&‚ÿ¨÷}¯6®´ï«×»ô½’ú×¢ý;Ïè4ŹQ´¿‘çzIâçFŒ?ªw&˺L÷}5oUðEb0Uo/G˜þ(Dm„wÃÔÉíÚÉq}llLöÛDæý(?š¦™ûøEŸ ZwÕ -õÿ«‚f!„\±bÌ\Jc£$þW„©-^"h5ÝXÑŸ*L²—j#ãR}…°: Eÿ—Ú£vt2ŒV€êdÛ>Þ÷D©Ý£˜#+-[Pªª»2ש}ÅÍN5soµóoµç&už¬gTøZÚT¯Ñýþw;Ùökûí>ÂX! ±ÿÎ;eww·TÇ9pË{çΖ²E]ÿZßwð›#Ôñã´øÕ­Zñ?EW8½ eÙ²e‹«&¿c@ç4û9ÎÉÑS~~ÇA½§í4©Ûí×þµr  ÛÕ2Ð:UoO¯žëÝòòÂ陉º_ÔÏ`èFý´ÏÿTÿþ¢°Ú©î^ù;îåS˜å«Bü¯æÝÈþGÏìc†Dû´Ý~ÍiÿmOï–_9óŽéU'îê|cŸ‡½Ò;çWN#ß"q¿úé´ÝmqKï–Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 )ÎâFûÃ,ÿ—¼Ó»=ür{¸¥F0óðË/¿2\ÄÅjñ@õ÷Iï&Bv7ªŒƒØ÷Kï&‚t{°®zÏbß/½Ûx7q±A<ˆ}¿ôn"d7q¥A™Ö¥mŸøåWŽ1^Ê#‰XÇ“ÿK@åéó³bÖÇ–Þ>žüì;¥wʯŒ—¨¶ñä[‡ôŽùÙ ñbOoO~öÒ;åg‡Æ‹=½}<ùÙwJ/öôöñägß)½S~vh¼Ð‹vôiO[¶l1_–B˜ßÉž=½[~å{ùÃ_üYÙË4^ìéíãÉϾ=½[~vH¤oOO¢}Ún”ßXœ~ÛÓ»åg‡Æ‹=½}<ùÕßžÞ-?;ö¨2ôiO~/ÚÓ»åg‡ú«=½½?gš3æâôÛžÞ-¿ ØÏ_ªèßÉ@­ØíGõš%q¿úIy©Û·nÝ*é%~MÓÌunéòs²Oâ~õSÍÖg29‹}Zç–Þ)?'û$îW?Õühý™×,öi[z§üüŽEurZøða‰4d"“‡6Ç?Òp}q×)?g @)½UÌÜ~ù~ÖõÎhŸÒÛÅüAí;í§®¯õ|Oã±Ò±²}ëùºzûnù)‡úrXûöý«åãrüaßK˜PÏrDmÏ­žaEèõµª»Ÿ¼ÞÇÝn3HûWkßÍFµ}?Ìâ—¿jÇm‰âøWÓ÷³™rQj˜ºÖ¢ýÉ@ç¯ó‚ „!ê%ñ?‰škÕþÕŒ½0ít|‘5}h^¦Í; P+½©Ö€ÝVÛT'ª“¨ÖϦÛñö;4ï‰À´~¢¸öÐ4ͼ~ϤÊ Cè¯:(‰ÿÃ9°·›šê¨–ÃtÀ ,ê}‘j„oÆXù¡Ä9ÿŰ[t@‚ÞíiXàœÿ"VådÇÞ.Ù Lñ?9¨õõݦ׹'ðx(ºTËVí5X­®C«Éßi®Sû¯›½JçÞjçßZ8PïÇD1Õæ:®œÖû]óU{îÂxN`wà&þ¯u;xÕ?—ƒÌåŠã9‰Lé»W½Í}ØtËÃëž{Ðk¯J!\Ï%TÞ0Né^­ßÜëwÜ>|ØR.·ö rï‘®-ì÷±i½×v·mAÚØ©$hïWÚÚ.üW¿÷;|§ýìyyÙú æŒa.N¿+}#DIܯ~ªçµÞê¸WÛÅ)½S~•!üTz¾]ýÏt\3v1¿:ÇŠcŽ®9Õ1è´ŸºÞës[7ñ¿:9ŸœŸÿÛ—z¼E"}ûózí«ÛÕzÒw¯ôNù1 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0uaÞúP1¤øßo¿ +}ðå·_ÐäfyCŠÿýö œ–°â¿5b†0 IDATý‚F@¦%¬øßo¿ Èi +þ÷Û/hrZ¼ÄüNQüö ¼ŸrѰ“˜8ˆ}7rÐñg–×6Ž×ßa¿0ãÒ;‰‰ƒØw!n/¾µïöLÐñGéíã(¨}§ýÂŒ?÷ÛÇ‘*üWÓÙ·9ífü•^Ø²Ž£àâÏòýÂŒ?JoGAí;ídü‘hŸÒÛÅü¦}üPóÅïäà‡¦}§ýÔõnÐx1_v·£ õwÚ/Ìø£ôöqô@§ý‚Œ?ꯔÞÞÉ>½ð~øðaSüßyF§ißi¿`ýߊÂWèOKN„–Ê¢~MHü¿uëVK™Ôõ^NüÊ$„$þÏdrf¤Ã+Æ,뽜±DüÿFæ5‹ u½—€ Ç„ú«ý¥Yµ !,/;ªs€u¾µîëÿ’pI¬oì[EüÁí[÷-Ùwv ŠõUÁ¾]ÄÔ¾}_²_‰ûùÞ)Ÿýº ¬ eP_(t²_‹¨“N/ÔWS·<ƒ–ÅžoPûQ‹ ökeËnWµáe?Ê(àQÚ"P ²˜×zàõ®…ƒ"6û ¡ÂÖ¿Ò¶:æüò&×áÇëT€¤ÞAƒÝ^•Ú÷ÁWÓ÷Õ(¬$6¢±[·n5Äyå­ÚpÊKͧ–ÇŸÒÔ²ïW•ºšö§ÿ$´Ô €ÂUÔ\«ö¯×Ø *òBÈô¡y©F¯§ôAç#·ˆÀ™t¢ba4‰øÂ^ÿ(’Ú>}h¾êë³JçýJ¯O„0þߺ9u¥%•JÕÜž¦i±½Õ9Åø¡ÃRr–¦ž^"h!„c9(2s¿Ã¢Fm®¤î$èW倔YX@üÿì½tÇ}'ø9Ëø|1QC*°_,›n"c›ŠI̘ŠÃÛ ‚ä½u’µÖšq$&Ï/‰ïɧ·‰'ƒƒü6‰×D0Á&yºð(¡»{Úâ3 ÇÞKh¯@ÐVrËh΀¤e*&LbLYòJÌ‚S.^‡9©ïžoOuMÿžþ‘õy¯ßôTW×÷[Õõ­®®ªÏ·ä¸½: 9ÇJƒÄÑÿ!™^ï?² î€tìå=ŻȭóÊ;ÕM;y^ö¶í¢ýíÅ €(ŸÆºƒÜQˤôü~w‹m”ï>Æ:„ÿš@dv‹/ö=ÖcÉß&ÿ¨A?yò¤.:×õwh4ì‰é²ì(nŠ ~ƒ[ß×I'‘üVvïxÙÁ€|î倀òë5ö(ÎùÊŽ Â=Ú“°Ý±ïáv=H™Û‘ùÅïe'ÿeG^úøƒÁg ÂÿÒÒ’IþÇg{Ÿƒ¡çëEþó3!…»9è¥}@­›ø/œƒ„‘fýÉú"a_&ñË6(:ãÉ÷RÝpvp£ëÝ.:7>þk½·ónòï É5PDÚ'ýe2¿øÞµkƒÝîÃÁîÉDa+èát¯×ÈòdUЉ/¯{½v ·è:=(ùßë^¯ÈÅCÜÙ7èát¯×ÈâÑ,õëAÉÿ^÷zí@.‡Öƒ’ÿ½îõÚ\<òù¼ç¢O§Ãé^¯ÈÓš|&[Óm(¨|ù^s–‡ýYò/ØPàüK÷šù÷°?1mц‚Ê—ï¥8^ö'¦-ÚPPùò½ÇËþÄ´E *_¾—âxÙßÑ£G-„}™ÄOiÐÿ'NXìÜé^ZÔçeÖ` Nþ´ÞkµËnˆd}‘°/“øýÊ—ïíÒN¾HÖ û2‰ßÈÓÂyÇ€O¾—ä;9Éú"a_&ñûÍ¿|¯h—nö'Êm(è@ù^yašSýå‹uX”?ü®aó\t Æ“ï%ù~œPÚ2©?ˆñº—<'ùI.@cÌJò'¾NíV.—»®9Ýëæ€1+ÉŸûr¸|ÝíšSšNòE’?-œ“ÃåënלÒôûüÅ:OïMÓŒJw»ØáH¼×Úvyá¢í}ÑÉ·'ÿ¦„¶%ùaÈÿ"ùK$G|ñœäÝíÍ bú^ò{YˆO²ä´Ãäß.N˜<‹¿~åË÷…- ~äG%‹ Ö'?òÅúTŽø+_ëµþ¹¥O°#*Øìd‡µÃ(òm'+(ƒâÉõ¨—ü‡µƒ mžŸ¼{Ù†90L¾ýèâDBt#ÿõ"Ÿî÷C‚S÷3¾ñr8§çpNǰÞuøu@i•rÒg£–ÓµœI•‰˜Q<§xaë~˜6¨—ò'õá+‘8`ÌJþȢüã´=ºß«îSžëP{éƒÈÏŸ±ð¢êÿˆÂÔ‹4ú?Œß¶Nßtˆ×£t iš9&@Äf#í¾Ž0} ª$Wü¦Ðk=ˆäçu„)êË™Äþöï±tàIóýã™÷†„‘ßÎ;€ÎÉ@ýŸ ï'ÙŒ…#ÿ‹º†}õú=æÕïò*wjçdynï= ÛöFÑþÒ;"¨»¶(lûš¶L»6Ý©Üíú Q½ûĺâdGne¦,k|kð•“äÛ¾Çé½K×Ýê}¯7£èûÚé%’ÿEg¢}:9Ñ4M×ë]Úýê@i9½‰ï³¥%«`ñ=i—Žß|Ëý §£$Èö'Rîtˆ¤"»SÐó‘w¸§p9ÌO™ƒÁg;éŠÄxAç`³’üÅy™ü/^w»æ”¦ßçAz¡sÜW´EKÙ ×{qà·þ‰ß{QÕ?ËÜOxÙ 3ùŸÐù>‰gü×?ùŸ±äÖ@Y_œÛíµ×t™Ä/Ç‘Û`§{)Žr                        (º ûâA“[a¯ûÝ9.ù~w -ÿ>w K¾ßã’ïwò¸äûÝ<.ù~w g,ùÉgÀjqÈb±ä?€ýÅ!?ˆýÅ!?ˆýÅ!?ˆý‰„"ïÓ"I»8´pRŒ/Ç bñ?ýÛ_ò½ìû®òÛ„ ’/:ð’ïDþ'ˆöGþƒØ_ ½ìO¬ÿNò‡ß5l’ý—––,¼äû%ÿ{ÿý:ãyÉåûÝ&ꌄ}"í;Ó±wïÞ.â¿Û½^z0fö‰´ïtNÇöí'»ˆÿn÷ú‘O»æaßÚ@­‹øïvoz@úÐâ1ªÛdÿândòÂHÀºóXP¹Iÿ¢^þE½[þEÝ‹üO˜ô)qc@ùSí¶H”Oi+â{œþ;-´‹Fž|Èé{Éû â&ßòw/ù@¯õÏ^NùNáQÀü(eõ’ÿ m¿i0Šúï–¾ ‘° DÙ¢]ôb‡Qå[¶Ñ°Œ(ó/æ!hýL#ï"I0l¾½tñ"!:é+ûy-wºß«Â>û£GFæàèÑ£& “˜v$̵Z÷é;"LF¾¦iÒ¿è —wŸHþŽQ–T¶¶îº_4ë+íÀ.æ5HÄNçZiÐqÒA¾öý+ö4M³ì(O»Ì‡éÑ··“ü’4†Ùk¿„±Žú•ljóù¼åzT4MÓk¥A“üo~ø$ÿu@ùÔJƒæ–üß‹“¸+9°:Ž6ù?¬³ ±,Dò¿è €žCÔmPw›lÆzs@ú‡y…퇊eàÖïò•wn힟¶—1¦£ÐÝþtåYˆ¤ý%y~\:ìþ{¥bÞe™Q}ŠåéôÎs“¦ìô°³#¹œíÊ>Ì÷‘v»ò/’ø…ó¥¥¥.¢/½wN|/=HfØ1÷®vïáú¾¢>"áŸÞ!¢ÑöD¼–o!ndÛõXZZ²è&¾ã¢ûǯ÷îÝk–©8þM…ÉqÂîÆN:i]¶Cq×{Ñ ÉË$ˆ\?s0øl‡ì¿´´dqÐëŒøœ)OvçtL ›øïvo˜ú`Ú}›Øt Iކ¤ë!ˆ2½ê}㉢¨â|“ žlÛàI¬_éÿ¦4ýå¾{ó£þwÂOœ8aÖÉ“'Ošó̧»  yRw¤¹Šû]íhDóÿŠü¯                        :“\⤒]¸|ˆ“_vá~¤Ûy­Ö4Í—'lŠ#˧p_Ùv·äß&¼+ÿí8]ùo‡û/.œåÛ…ËÅ‘åS¸ù¢×|Q¾]¸|PY>…û‘/î.Ê· —Š#˧p?òÅ“EùváòAqdùîG~š“Ï€ÕþDùb¸“|ÑþDùaíÏ’!Ü1ÿ‚ýYòÒþDùb¸“|ÑþDùaíO”/†;ÉíO”ÖþDùb¸“|ÑþDùaíïĉæÎ|bx¹\6u9|ø°¹·hG5õŠÂþóKþŒÇþüÊïÕþ2£ÐÉ@—|s¡õ cña›ø/:ÈŒv˧4ýÈw²?¿ùËþó·°Wûë¹,ŸÈÿµš¾´´dÿE§TÿEù~ë?cÝD~z‡‹E37r9®—|§…cI-€¤x"ÙŸÈûÔöˆ¤:ľ‰Ó½~ž?ÅÉþDÞ—Ãeò¿×½Aä‹dË®<’¯8b¸ùNúй¼ÒÒÒ’ù_Ü•L¾7. º_ԃɷÞFú”ð½Cç~åË÷†/g˜._ »ø™î•É]òn7ù@÷"ì°¤§:ä%ßíÞ  ö,Œ|§{£€ùQÈp"Rø-ÿ D ¹žˆ‡±Ü­þ‹‹`Ÿ~ë H\¨KĨí0Ê|‹áõZxFùÓ KI:ïQ?÷0º8‘ÿdbž| C€ [ŒßQ98|ø°/fZuŸÇvÏ@$(‡mƒ¼äÓ7…‹ã#â7 9óε’{‰ÐÜqÐ)ãzåï•ïÚ t''â7cغßÉ“AF•mÍ)¾ß>P­4èèD–+“9‚Ê–õfŒYˆÿAë¥!îF+ˉ€”ÿ^ú?dODê'‚?}gR99Å “Gš¦™ä{#Æ‹a¢Môî@|þ" Ú°¥Ž#*gƘ…|%…„q ?/ÃÝ€5M3Éý](¼ýk¹Ç!m¯² ÿ¥Ì÷9ëÅéµ úîq{ÿôê€Ê,h_Ä«?ì§ Â¤Oá†n+ÇK¶Ÿ¶—1ƒÜ/:J•uÊŒÂt¤ýµ+s1Ì.žü~—ûïQòÅ2’ó+Ÿ‡ýî·“åöN±Ë¯/LÙÛÉrsঋ|ø‘%Ö+™ô/†‹¿–{ …¥ë~óf̽×vÏN'ò¿èh—t¥~XçÅ>AØ~€\®2©}iiÉü/÷=ü>w?òåCìs0ƺú$rœ°»±Ûåƒ1f!¾Ë„x*ç u_†Û ‘ÿßõ¿s0Düô:Cz‹yŸ»œg¯8a!ˆº˜öVþ‚#"MÓãôRÓ®òœ‚— ž„Õ €xo¸¸!<7q®³.:˜wŠãwî—æ¨×^{M'G¢í‰áNóÿG¶= ÷ "‚÷ä—u’7šÉ/‚8Ñ%.4sšsŠã›x,C ûc¦3¡êäÀ)Ž_â± q­¼°ÖN¾S¿ÄGâB×f©_¯ ¢k¬x8Åñ;é.C\èvøðasq¥“§8~‰Ç2D²?‘*‰ˆl'ß)Žⱌt&Ÿ ~ìO”Ÿ†ýYòŸ‚ý‰òÓ°?Q~ö'ÊOÊþˆìOiÓy¹\ŽÕþ BþŒÞþ‚ÈÂþÄ……E„¢¿)¿ý¸aîJ"ßF¾lCAò‡ý1æ`ö'×aƘ…èOòé?µ?bü0õŸ1ÖEܧp1MñºHþ·‹c—ž›|»c¢ü$ 1fùE±Xtu ::ï Rþ¢üß9k!ðoß~ÒÕÀöíůâ½aå‹;ñPss ÚxoùnzÉ»‘™ín íqQïø/êþäwâ‡%ÿ¦“À/:p“/Æï•üt8è¿LÒ—¯}”–ؾuÞ£Ýú8Éã9¥EyxÉ 7»|¯gD¾[=ò’-ï6D>…‹éøÕèÖŽ ý8í0Š|‹òè Â\t¯ùï½”µÜW ê Êçö9Èä?™pæ$Ÿ®‰÷…q‚´ Ž=™§]˜v`v*ó0Ï_Ì¿œ¥/üížìD,häUþôAijšf!ýËNÂôœÈÿÀ³NuÊÿ€Eù{å›È€qÖýNþ/º–›ß¶ȮÝÎØvr‰ë¤{˜v×OžÜÀ˜õûÛI~/;­ÚÉ$B?Ù”ø­Y+ êõZÉ ãøùÖõB7™ÝÎ@·}„q@ù•ë€|ˆäÝWe¢f”Wrv –¯FD;n÷Q˜_"¾ù¿”s  æì ¨AÞ»~ß=^ïŸ(ÈÿôLÜÞC¢\ùË©?ì¥W˜ôå6Nv ÆóʳS;ŘAþ'r¿«NB¼ í¯XîÔöŠÎdìÊÈ­-ûl^2ý”Kþ_2t¿MÄþM/ï>7™¢=‰ej§‹X'Nœ0û¯{?é.§/--é¨Ao4 Ÿ*÷“@— …É"¢Ì¨ú^òƵíÆÀéèÕ €¬ƒHl'gÞk‹°›ƒ‰þf}lÿ'gb|:›Wy·ž¹“Ñ9U}Q²g” c¨}¨_cÎ}‹qjÑÖÉ4êÍ#ˆß’¢ ž´±AÑù\xò?œ·[×Vˆæ­m¼5nØù_ Ý5PDögÌ ðÏÍÍésssº.Îÿ;ÅQÄ…d‘q¿L“W'Úÿïcýޱ9¿f‰k`‡ gÐÄÕWÛÿ? à cŽñ§9·Ä€OxæÑD>Õþ¿`ÃÎòùqn‰ (†—OäÅÆ« @î½9T®WãW7T-q`dy$´|š8Ÿk\ìÏõcçì Çøç ë,q@›ºZ>‘‡/\¸øèG?ŠÉÉIÇøårÙ}ôÑÐò‰<¹²²ظq#._¾ìË–-–¸P¯×Ã×?ûG6›Å¡C‡ðøã£Õjall,1ûs’Ÿ”ý9æ?!ûs’Ÿ”ý9ÉOÊþœä'e¥R Œ1LNN¢\.ƒsŽ©©©Øí±GÀ l–aaa¿òÍ_Áb}l–™áœ?Ö¾7zû›eÌS~sÑØ‘÷õºñŸÕü1ö°uëœ0Ê¥Îó†üLÞ¸GŸˆÎþfÖÍxæ¿x£ û«,å;Ë ù±u+®Àx.^0ò…ýÉõ¿Õj¡x£ˆ™u3XXXÀ7ÿ§o¢ñj3ëfÌðl6 \ýgŒéû÷ïï Ÿ››ç<ÃÓ·lÙ‚Ç4–——»Þ‘rš”žü\.וf£Ñ0åg³YOù­VË&§Ié9&"è#æaÓ¦MÐ4Í1~«ÕÂ… 077g†ù‘ãGþwLãîÝýØ5x›cü…Å·ðü™kxù僑˯n¨"74„ŸÊý¸cü4þùyKµù~ôZXXÀ®]»b•gÅE±Ýæ¿nùg|$6¦½,|Éò'9G©—>— cº(‡lQ–oôyø½ßI¾_ýƒèÔ«ü8p³Ê§g òç]úù?ò½Òp‚¦iúòl0T1¾wÆÆÆlm"j;ì5ߢ­‘ÞóUŽ\(hh6›žzD‘?yuC6Ï)ï·ûŸ1:ËКç¾òe¾{}Dä¨ 5Q×Ðjµ0==ƒz¶ÿ/›Íš÷ˆíÙÆØÏ_<ú/ç‡wt¥û§;o‘¸× Ƙ^.—ñ½¿x¹Aàcy£ïx¶Þ@cØù›G166fÆòù‹ùÏ1L8ÞÚyÔ’ÿ-[¶ ¯¯«««f?[|v×Exåß«ü‹7ŠÈ½7g~w@6›ÅhfºÆ?•ëßínçšðTû÷¶Ž¿göñ9¿»þ{aËß+ßÕŽý¹~Ì5®¡²lô¿Är¯pT–z©ûÝåà]We=ÜÞÕÂ*³ËŽß^t^8s ;ÿú Œ¡pæfw÷w¥¦Ýõ“'·{ œc3`~sËòåë½¾è{tuuÐ××X]]ÅÊÊ F‡²ÈåsxhêœåÅõûéMÓt’Q˜˜G³ù{ z~ÇÓøö·ÿ+:¶AxÀÆØó¡úàœŸc»Í{©üXÊxšs¼Ðþ/b³æõ<4MÓgG‡Ð¨7ËwÚŽF½‰ùF3£h¼ÚÀ©÷œBsµ=ºu}°á¼qßW±ïµ}Ƚ7‡ }Â|6b:rt¶EƘ>Qà–°Æ¢ñ›4~«óžyæ™N½ÛÌ‘4âÍ^aûÞõûîñzçóW¶âÍúzß9Áë=äÔpÔMì?¸•[¿Ë)}º÷ñÇÇ¡C‡ºdS:þßAÝió}™Í€~`§:íE')Žh?ní¯ MÓôgžyÀìhCf–•O6›µÔC±ÜpàÀ´Z-ßßnåDr8à)“®Û–a€çà¤#ûû Zö]÷¶ßírÿVé2==óç6I§\^^Æää¤ï>ÐêC}ǘ¥þó*«õμÞ“¯õ2îN:И¶Ÿ9§2øþW?aô½^äØí¯ï+ʱY8¿ ÀÚföÿèYŒ¶ï™h÷ F9Ç¿ZZ2íÞsÒΓ{ôÿ¦~ `ŒESÝÇ¿{í“0ÆôÓLJÚïÃc‹Æ3¢²²ìæ`ø¯q°?3êÛŽÿ¸?ü.Àþ¬åŒø¼G9Çtòm¹,€ÞÇàyÍvM?4íŠfösò³S–kט“Œæy¤]ÿj5=74„¡™Nz² ÎæDôöø¤.¯¢>@럀ΜhïòÓ\Eä}qNÛ¶m¸ví¾üå/›óÿŸúÔ§ÐßßK—.uÍÿ¿ç=ïIlLZAAAAAAAAAAAAAAAAAAAAAAAA!¬;‹Ë‡è);J¯ã7Ï×äåúd×]°ì,Þ•ÿè뀘v!äÅå£6PÓh˜»sE-_ÞY\>š¥~ýÍZ&²ÝgdÈ;‹ËÇáÇõ£GF²ó’äÅåƒv"øQË·³?ò:Ÿ–ý‰òÓ°?KþS°?Q~ö'ÊOÃþDùiØŸ¨Oö'îBÓ±ÁäìO–«ý Á²‘mþgŒÝG’²?Y~Òö'ËÓþìê¿,?ŠúÏ3mX¶e’Q,mqDºÒ¡ÃK7Ƙ¹KŒ¼[ cî;ÐPþÅ2 tzÙýˆòP.—õ£GÚq¶Œ»>þæÈY½VkØtmûöèw_£÷[}øŠþƒÚ˶] ³ãk`]jýæÁÓ‡‡¡Ãü—lÚðÕáaó`ŒéÃÈéÃÈ™ÿ‹±è0ÕnÛi7JÚ©VÜ¥’1¦O…ØñÇ b;#¶7òŽoâ9~X¹nלä‡I/ŒnAåG‰›]¾WÝ *¿×ºØ«ü0ßcKKK¦mûÕ#*;ô+OŽw¬Sn¯» ‡É¯ù ÒæE™÷(óVÚu–v1w<õÓþ‹ñi7ô ;p†-ƒÃ‡ë9œÓs8§¿cX7¿;°Rº‡îÚ…¹”ƒå{7ºÏ³ôcž'Œ-¸Éwbwwi¬ Ôôáw [Ž åï¼»¹±ë7éÖ)ÿ'Íïî^Êß-ßÍR¿ùýgÝ÷‹0ï@§]°‹¦½”.ÞÐ=ªkš¦—.ÞÐß1¬ëâ®ØI¼ÿdýëì ì&_ŒÓ‹>¢‰ßµô¿^+™õË)N¯»ívï\oØcÆ÷`Ç.d{±at°k×Ä–iœé¤ÍNÍN‡—dµÒ yhšfiS蹊;£SÕj¶éø±AÆ:ßSâwôN”ëø=¶ òîq{ÿÔIŸ/ì{XÖ¼tã¸õ»ìòîÖ¾Q^–ÉÌŒvÆ@Ýtã‰edz±ìv3·É7íDOåæG~r¾ä0/™^i„©›nuA·»7HÙwÝ;hÝq\”¹´´d £±ÀÇë'Nœ0š«"×.Ìé½GõÍéÞ y¶{—Êù·‹Ókß—Þ3â1Ñžû wØ&---™¶1!¼“œêB¯å"e—Ëe½\.Ç6ï%˧y»×åñƺw_ïµOBÏGÜõžÎéÙD—c+Òœƒ¡ú%æW>èÚ„¾Ž_™(¡s µö±ê'Êùð´ë_}øŠÎ3¿?©M=|ø°N×êÃWôúð•˜êà¶îOvÉï\£uÑ#Í5Psssúk¯½f‘wãFg>üµ×^Óoܸ¡ÏÍÍÅÞ*((((((((((((((((((((((((8Ãy;Ñ.ž¯»wg2<_w¼bß‹'|ò|=-í^¯É+ö'“'þöîãüx·|~œƒ 3¼þŸ€õ¿|Ú}¼º¡Úu­º¡ŠÊõ êuŒüp$ù´ûø¹Âº®kç ë°sö^ªÿ$ÉÄ"Ÿv/—Ë]×Êå2&''Ñjµ°gÏžXäÓîã[¶l麶eËs·µ7Æ´„ÕþÊå²¹ëzö'ÊOÃþ,ùOÁþDùiØŸ(? ûå§a[¶lÁää$¶lÙ’šýíڵ˴?1^RöGòÅwb\ö—É}ÇVê–Oa™EÃÉÙɧ°¤íäSXœögWÿiGPñÔkýçœgæææ,¿rÚåEÄòò²y~ùòes÷—ýû÷[âíß¿ßu*ç£=é;ÖÝþÈ:õc–{‚BÓ4}y¶‰V«…ééiÀØØpðàAKrÎ34¿ovíÚ凾Äwš‡Ò ˆ$êï~÷»Ós“Iñe"vÐz B,wùßÁvбT#¯•åήâ”/± ĺzþüyÛtP.—}¿åòmíôiC¹ÎÑ=QŒuˆïÛjuyìÚµ ¿š{¿š{Õê:ËNç½¶{Œ1]~oop€ÚÇ›ûhnºv0†èí@cÛW¯^SŒ#¼ú4†âo¯åòÐ pjÑØíþ¡ö¸ã±E`ß ðt¶[0í9˜+fÃ)›¦äØ¢qÊ!24…Ck—âÑŠ#ÞÒªôyûÿaô'''-×óó½$ï÷}ô[ùÀ‰X¤¦¹ê£ý(¶mÛ†K—..]º„þþ~\ºt —.]¶mÛbÿWPPPPPPPPPPPPPPPPPPPPPPPPð‡Æä—#ñL~É'Á^¿šˆtØ:€×7ùvŽ ö®Z"òíÀµdœÛ9€gŸ}6ùN‹«íÈ‘Ñ"Ég;}Ô”Ÿ†ý=zgG¾ˆ¤ìÏiñARö÷À÷³•Ÿ”ýdùIÙˆÿeÉàóoØÛŽ'#_ÙŸ8ê¿ß…¤^²È‰ˆ¿^éú•ŸÖ4¶Ž€ÎbÔ¸aç*•½‰È·s®lOD>T*7Ðhtœ¯ˆçIà§gfðoŽwÈ9âyeh‹QáÖ¸»ÂŽàTÇÅð^ú{Áü8¡äÇ'Ÿê›øÛ‹|?éEÒåÏ9ÏpÎ3Cf OÚýæ{¨ÂL{• ô–ÿ°ò´y@´yï5ß½èBä"ð<üðÃ&ÚKþ|•›h9 ð[ ˜œœÄ¿:ü5Køÿý/¿ÖEN ‚³õ‹À'¿pD¢sÓ#ŽºOé>¯×3 xa^9Éo¼Ú°•ßxµÆü|ÇÀ{­‘Š7Šžz0ÆtÎï–B0‰ÿùÿ)ËÕŽF8éÙkùËùžk÷-ƒÔýV«wâ±¢nû:ß\gðŽácvw?fwNµˆü—l7ˆ¤@"øyɧx£œGJFÛ¸q#6n܈••&:$£••óZ”hµ òº?<àp dbæ¼¦ÙÆÛìpÍf3ÓjuÈÿWf»#¢ýIÉÇŸw43jÚ ¹Œ1½°ÙšÏÜ`‡ø_¯ÛcQ½£kQµA^ïQ¶Œ¨¿»‚öEÄk~QéwÉ×8ç™ÊìrW"üå+_Á¾}ÝÎ$¼ÀӉȯ_ñ¯Å]}(xD˜²Ù¬ùÜúñŒ1œP9OOO›2iGæññq“°O}Y.•?Å›žž6e‹}(/™¢Ã1J;LÝäœgÄr§´Äº566y½§²`)± ¨¾¶ZÖ¶ZtJ Ùl¶']ÆÆÆðÆ[Íÿo¼±o¼±5Ò÷®ÝûV9ܼ«x»Fñ¢j÷dˆóôN¡ú4ß&û޶u.pnžÇ‰¹¹9‹S–^Œ……Ýx6›µØ¢—CÝ Ø»ÌpVò¿xžÒžƒ±såòí£KuáZ‚H²þåoΈë^rCC–u0Õ U ÍÄéˆw]ƺîé~Ë:(Î6bˆi¯€mÛ¶Yþ'=ÿ¯                        `EéN~}ÈŒrn™è'ÀÈö'ãR ˆŒLúÿÓ.侯ÈF–G22é_žü¬\¯t-¼ ÚÔµŒLúÿÓ.äûcÚ‰õÑGÍȤñ?íBþÑ~4ùõz=#“þÅÿ´ yÔ‹@;Pö§ìOÙŸeÉÙŸ>ÌêCVûÿ¯>ÄÑwŒ!Ó¤[ÝþÒ¯ÿö¹’.â0"ýû!ÿE Ð8癩©)”J%°ö.+Œ1‹jÿœõÎyæË_Ú‡;î˜ÆÝmRÎÝ»û-N>õéSøò—öáSŸ>‹ü¡™ªªæî;¹¡!‹€ùbC39Ì“#Á‹33 ¹¶Íårý(£%ý¸Êç›1îà ÃF›ó…áŠ|3Û àbì:6sÌ^aȵßæ°2c˜"“/’§É~æçç-;ÒBlŠùßü¨e*ùÉÊwsF~”;#¦Yþ¢ý%m‡~ó%ùÙN‡ ùïUV6OÖ/J„Éw”º!S$ÿ9É "Pâ¥ø) C²Úqü‡Ñ¡,4m €A6,‹xùåƒØ¾ˆ˜O¡Cüª+½^ô ¡")´\.£X,â c¸«vçeG y,gfÝ ª…[âq`3ëfz”hz]Щý­%×»‰B›€º™›çaàçÝãfsq¾ƒäôíÚ»61ˆ*¯~W¼kš¦c``÷Þ{/8çØ·o4MÓÉ1€d„ˆœ¸é$“†9ŽIùóUëØ†¸+<‘ÐÅ]á5MÓ—g›˜¯rß$qñ»AÜá^$ÿ»ÉÇÝè^J'ŠºIåNi‘œùˆû"†Úc^$W.ÙÁE;ÂS¹=ÿüQìÝ˰°°€½{ru€W£}ç99n©Tnà…™N_L<’x¿Y8W¤_*sz6âFíüGF©TÂÔÔ”ù¬¯^½JãñÉäœgÈÉ„8î.žÛÿG5þÁÓé‹„ÿYÆL2<…Ç4ç`8ç™YÆ0ʹ¥.ŠN œc–±.gI‘@ƒIüG€ì¸)\Ë·ãGŒ´ë_m ¦W®WИŸ7çÈ €x^¹^éEŒ žÔ{À p~­=ß{¿0÷KçÄ"=Í9à÷¼ç=™K—.YÂÄÿ—.]¶mÛb›ÿWPPPPPPPPPPPPPPPPPPPPPPPPð‡Òü: èmòMt½Ð>ŸÎ²˜¼¯Ï@gÃíˆlìr5hò€e’Óéܽ»ß<:Nâ?_l€ßý ñæ‚;::Nâ& T*7Ðh\ÃÌ 3ÿ°„Å#ý#ÎÏà§gfðoŽ70î€þ°„‰\‡™ä£³ E`ö ý` +‘ï)þÅ‹ÿâG /ùqCÉWòÓ”ïW¨íp­ä›§>AÛ¼$‘´."áÊM¾/NÈ:,,,`ll Ÿ;ñ|îÄwð…“?¼ã,çÆN³¿ð¹øäNâýŸ<‰O~á¤Iöå%ñücº¡ßOX]]E.— MLbŒéÕ UÛ¸Eyt]Œ—{oÎ<‚áá <%ý:•ÿSíïðÞˆXŒ1]&Érår'gÕ޹Æ5œ+¬‹•uÀ9ψäƒì¸ÛÖ~’hDÂYùQWVVÌsùWü/ÆëxG`%ÿÛÙNop"„ÊÉÿv$N¿ 6Ç ´Û»Ý®ï„Æ« T7T?ÿÜ`ç0ÓZ´þºÕ»Æ¢á ¨\¿ïžµÐÿ!Ú¢] Ì;Øoúnh6›æ®ñO<ñàž{î1¯yÝÏÓÈü~uÒ¯ôî€úS¢&‚±ll ­V  … ƒ :==ȃS_ÎM¦ß4ÂÂé¹Çe T+®Þd§²ÍÉÉÉ®à———±¼¼ŒV«…±±±ž¿Çä÷°J4c^nï[øÕÜëøóÆzÜU4œÎÜU¼¿š{³í9‡^Þ·vŽfd‡3ô~iµZ]$kùÝÓ«ó;pn8±Ý´igæææÀƒh[ˆ} rPå—û;N–ˆüOá§½Ëñ¿¦9Cõs‚1lF'ïW`-rKŽˆºþšC¼‘tý«\¯˜†É!1…“ ¾±gÆç×Úçý¦³9#¼ã>.ùiοöÚkú¶mÛtÈþnç éÀ·€´'¿2†é¶÷u:Ã'ÃWc”φ™±ãø)á\gà 8Ÿ|šäl¼Ú0ÏÅðÊõ ¯†ÛáÖvÎÞÀ¹Â:Ì5®™çbøÎÙ˜k\‹M>í®{áÂËN»t>99‰ .Ä&ÿòåËØ²e VVVÌs1üòåËXYY¹i'Ÿ•ý)ûSöwëÚ_ß1†Õ‡8ôzç\ ï;ƠוýݬõßâNˆ}}}æÿË—/'¢GR Ð8çjç®^½ŠÉÉI”J%ÖöDZóO[þ—¿´Ÿúô)À—¿´wÜ1mžñ?.pÎ3C39ÛÅwN‹ïâcL_XXÀÌŒu‘9ˆuÆvcaa3̺ĘœÄ‰)@/3c÷·Ù+Öü“€¤‘d{£ä+ùJ¾=’Öc­ä›¤>k)ïië’¶|;:„C‡áàÁƒ¡ôãœgè~:ÜäÅ ¹Ÿ-ƒ¾ÄøOì—‡EãÕ†IâϽ7×å  Õju…7^mX(Þ(:’ÃÄÏ B³x@äL7ð¢Ú}®qÍ<·ÛU´:`íïÏ5®™ñöçú-÷lj¨¿u‚¤·-ˆ½l;2yÜD@ÑÞÈŽd{² ·³S¿0lÁ_j6·¢01‰ùšÍ­]q_~ù ¶oÿ_`ç £W'n„Pѳ٬¹ó¨¼S3Î €ìHDF6›EevÙl¶ë>·¶Ê Œ1½°ÙÈkcÑz˜i/NZ­(®| 0~Åû‚ÀÏ»g-¼síà¤[Tú†Íûòò2|ðAœ={ccc¾Èÿ]¨È›ŠÌ÷qð}Öº _éÄÍl¶¦Ñ äüÓùüü¼é$b×®]˜ŸŸ·\æ™g =x°Ë^ÂèàGæÍ§} ÏŸI†h44“3Ú円ИŸÇ|±F{ñw ÙÆÇÇ-áãã㘙‰o÷)Ép~ŽòÙp~ÀGbÑ¡d&9w”?{…a’s”€ØÊ€AÛaaa!Öo•|%ÿV—Ÿ–k%ßiè³–òž¶.iË÷£Ð;QRÞ¹6<3Æô\Î <ˆýêË—/»ê#÷‰ —ËÖÓi'î™u3]òs•“xý÷‘š@½öË£üŸïºÃpÊî¹0Æt"‰ßv•eæZîâ.Á„s…u7U[œ”l‘|.’ g™û3ˆš¸ººj±=úömµZزe Z­V—“ ùžpèù›Íß³%ÿw“yeg½;ÂCä—wmB Û¯v¤x£è+Íê†jOõ’Èü¹A Ÿï¾nç & áêßw]KºïEpk €Þu‹"ýf³™i6›"þû%ÿ3Ætrr*øÙ)çöÇÔéT²Îøä]ᇆ†Íf¡išþÌ3ÏàÀ€Ö|t*ídÆ ¯ºÄk výIÊ3IÑÉŽ;pÏ=÷àž{îÁŽ;P(B;£"8å¿^NŸîèîõ¾ýóÆzK|7‡›Qïùÿ«R89a‰Nh¦#ÔÅmìqjj*ò+ç<Óí«ƒ¸v_'œj¿ e²ÿ±o‚ í9À°±~‘“Œ0NŽ|£ +±¿ @k?ë<7œ1i6q"v¤_ÿ8ç™ÜЪª]N‡í¾UãÜoqúÞ¹öXì²Óšæœg¶mÛfþ§ùr                          °6àÛîäÉÿ$Œ ׃Œá.Þ¯î€â’¿þ÷^à¸íà ëߨ0Â’?òÃo±—íÅÈG@¤H¿‹áz•ÿàHÕŽ•><8’MÈË»aÅ%Ïž=Ø¿?ÆÆÆ°gÏ)yÿþý‰È߸q#²Ù,._¾Œ7š‹­{ÝYů|eÊþ”ý)ûKËþ0 ð<7ìn §<¯ì/ ùiÖÒÁŽ`D¸|ùrì ÀÒZ€FmœÜþmÚ´ û÷ï·ìøî¸cÚü%gô{ÇÓ±; v´ø.74dþV7Tu /8{º’o€AÏKÏšbǽZÉWòoeùié±Vò†>k)ïië’¶ü4tH#ÏŒ1}¾Êm‰Ä[¶l›>[¶l1ÃÄÝÉç«þÉP$ŸH¸"·x£Ø%?7lu= òn¸Ò)ÿ»…xЃä—@ù¶#U¸k¹‹ß€tÿ\ãZ(=ܦ &!›žq¼ÀÝŸ°×g@vÔ×ׇjñ´åZµxÚtˆ×+ñŸ1¦wÆ’dÿ]ñ9¿/¿|õÚ3BhïÄ'B(àìà c©uþÝ Znsz…Øvõúü‰ü/¶?€Pï6wê9 h,ö^ïœìM”Ö®«që–VÞ©ê6˜ï³o,:íëÔ»4¢ÔS$…sÎ3ÙlÀøø8ˆüOŽ ü:@"“Îã&à;•;¬-Ø‘ñE¹ccc8tè:„ƒF¦×ÖonENr¶ûüóG±wooŽ/ý¼o§§§-áÓÓÓøóÆúHÞ·ô®Ù ãÝòI›ã ò?9ø¡_÷še ŒYÞM›Û÷"vHöØ`8º•ÇÁ“ _O0fKöh09'iÎÁPŸh”sÓýŽ&á4`bÊzibÊ·Ä‹iÔ?Bc~ÞtD<4“3ç%DáñâÈé;cýæÜ/cÄ.9Í9`šÿŸ™™A?öìÙr 033«läÀ@z“_€1¡ÿÉöùAÆ0Ê9îlwþ‰¯ÿ. ’yDäÙdä×ÞUƒH‚,Þ(bä‡#˜Y—ÌÜ5â|u€ãÁ‘ŒíîWqàÙgŸ…HBÞ¿?öìÙƒ¹¹¹DäÓîÃDÂÌf³Ø¸qc×dx|Pö§ìOÙŸ²¿tìÇÑ Ïs``ueI ýúo`uuµk§Ñ¸Éÿ"’^€Æ9ÏÌÍÍáêÕ«&áŸÚ?±·œóÌË/Äóg®™„ÿ/iŸéàå—Æ.¿r½b.¾#'É/¾SX H{´’¯äßÊòÓÒc­äÛI~œú¬¥¼§­KÚòÓÐ!)yŒ1½Õâxh*o‹ƒ|Üh4Ì~7É·ûßh4ºî}h*VË› Eòÿëa ¡?÷Þ*×+æ·–˜ÿl–!7 _ÁðŸï:‡Ý®ØŒ1}¢Àq¬ô Ž•žA½Ö}èºAþÏf;ßY$Ÿ±çÛßß"AúäGøÊ¯œïF ØŸë8øÛŸëÇÎÙæ7ɵû¿söF×½éáiÚ`\²éÔFÐEæ›`Ì–ø'ÿ·#ÖFzDþ—Ià¹a«€° "fnm'ÝNÂèñõ¯=ŸÈG¹a`¤æì$ÀM¦Ÿ6G„SXåz¥+ãÿzØñùSû“4ˆþ#Ã6ÇqXÚŸÙ+R½»Â0:ËvFÎ µãÑØ¾}¥Ý÷"Ä­[éû%¾S=ÌÏ¡g6ÎNÙ)ësg§ìÃúŽ1Ëý²Œ@Ê;€Hñ@6›…¦iúøø8ÆÇÇ‘ËåLò?Åï•ü/ÊLË”ÓsOÒ¼œÐñœó QÉnä­ÿ{Í7cLo½èý¾½óÎ;Àö¿ãûöÅ`íÞ]íCÆÁ¶$Û®L)lBŠKnVCÜ•••Äd:‘ýì‹iÍÁPýÚ ˜„ÿÙö`ØKìh“ÿ÷Ie½oPrÒ¨@‡ø/¶4G‘hîW–ŸÄy²».*ùJ¾’ÿö×c­ä; }ÖRÞÓÖ%mùièFž©e—v}ÜÒ‹C¾×á$Ëéˆ;¿Qå;*=¼t £G­4Øs¿8 [Hû0Æôc%èõt½nüŠiìÝ»W¿¿÷îÝk¹.ÞwÌf|ÒIf½fÜCcJN¶R.—cÑÒî¹çôçž{NŸÕÃë9¹É,—Ë®÷y¥´ý¡ûâ¶ý°²“@ܺ¥•÷ í¢jå45MÓOœ8a4gÙ¤Ñÿs*w?ò©=J·w…XÓ IDAT^t‰R&cLo4‰}ßÖk¥Øû<â¸ÉÇüœ®÷"ÓM4ÆíÞEò5·¸QÖAÊë 7„y9,Žg ‚ä¦=Cý£‰æàcz 0˵«/V‚¥Dóàtˆ÷ÙÍÑ#ÍúçG¾Xo6ùN:éÌSšäìnn.QÛSPPPPPPPPPPPPPPPPPPPPPPPPp‡ç®4r˜Ÿ]ì⇒¯ä+ùJ¾’¯ä+ùJ¾’Ÿ¬|¿:8íÐ…iÊO»üoEùN‹G[­°k×.ó7›Íú¾."øÎxuÆvw¥ÏùhÚ/¢Ùü+8]>Òó@S€^f¬+ýIÎ1®ik6át½äñ皦éTÆË_¼å„J¾’+ËOKµ’ï4ôYKyO[—´å§¡ÃZÈóZÒçV-ÿ›AƘ^- `b¾J·´Ë Iùvß2Ùl÷Ýwñ•¯|gÏž5¯}ìcý÷Þ‹ÅÅE<ýôÓhµZ]iúù’¿©ä뚦éqë°–ô+3ªzçUç€øê}š²ÓÖm-æ½Wzmítq߈£lÒjÿý”»—|Ƙ>Qà¨Îk=} 8É ¢K¹”ÞolÅÞ½¬«ÜOŸ6v|¦kQ–û|µªÌÚ>ï׿9i^ëµleøÓ‹rÜo­=FA¢jrMÓô§³Mswù}ƒÀ}-ͼnw-Šzx+Ž;Éû ÷¿~?´‰Nù7G›8±þD¤ý®´ëß­.ßI‡¤êÚ¶§                        ?ætÁiBÇ.<©‰W%_ÉWò•|%_ÉWò•|%?>ùAtp[(•DÄ!?íò¿UåÓ¢Qy1n6›5ÖÚ-ªÖ4M—¯;¥íûEÀ¿ˆfóŒIêÉÿÆ=n×»ÓsÓÃNþ8€ÉfÓ$õ‹ä×4ÇëZ{— ^äÝ‹œ .‚vJKÉWò•|w$­ÇZÉwú¬¥¼§­KÚòÓÐa-äYDÚúܪå3ëA„ V«MÓt'=Ò.ƒ´åïñþûî»°¸¸h!ŸÀÙ³g±iÓ&3ÞÓO?íKŽ“\‚¬Þ®zô(Ó¼7 {z«wvñ“’톸ËÅ©ÿ•fÞãʳßö7Œ.Nã~Ê>¬L'¤iNò[­FgeEpÒ… ëàGæéÓörÞýî¥Ðåî?¯³¶²‡*³=Û_Ø1?º'Šq¿^ôˆRò{8!9ìØ¯Ó3$‚ÿ¾AàÔ"°w™AÌæÞe†QpóúÓƒMÜg3ö ø/‹[u \¼Ï©ª=­Yâkï[4ã…íƒÚé@H¢þy¥‘¤iËO³þ¥m{ á›Gð8&”|%_ÉWò•|%_ÉWò•|%_É¿uä' »…°Íæ_µÉþôk],_﾿7"ÂX³‰qM3eùòõ¨åÓ®ƒô+Ë—¯+ùJ¾’N~Zz¬•|§¡ÏZÊ{Úº¤-? ÖBž×’>·jùߌzˆ;‚úé›§]iÉw"À9¥%ÊõŠnúÑ¡ÕjõôM–†QÉìÅùŽ[“å÷ZïíˆðrºI¾œô²ÓÍΡ‹“n~ˆÈI–»¢® AÛß^tñ*›°í`Zí¯W¹G)¿W]ÂÔý^d¦UîI¶=aûNQÈ¿U±VëCÚcÐi:a‘TTaí ÍúŸ¶í)((((((((((((((((((((((((ÜÄÐ4M§#m]n5ñ® p³áf­ÿŒ1ýfȇ‚‚‚B\¸YÛ7Èýl±ÿmwÍ. z¿Üìeu+`­<ôõHCþZjüÊR¿µ”ÿ[~Úì ;†E‰$ÒòÎRï8…·3n–6,ìÜÀZÈZïS’‘vþý@Ô3.]ÃÖ!5/¢îÿÓ½iÚœ‚ÂZÁÛ¥ýWHqÕUÿÜ êÇÚ@RcoiÝDNÜ2dyiÖ}]oèò·—®7R¯ i—Ë͆µþ ›Ä÷¿B:ؾ!ƒžŸiTéØáöÛo×ÅߤáwÝEœèïï×ûûû•íEÕ¦)((((((((((((((D‰ÛÒV ÜÈHiét«€1¦Ÿæ§-“^va Á¡þÖ>nÖúÏÓ§§§ÓVã¦Dš6}3¾ÕÄïÚAšÏ Ù7kûïԖص)n×£Œ8?ƒ7Š-p~¦ç²rs@p+ LUýdŒéü8œ^ÔmvX=¢Bòcúþýû»Ú9,)]r¹œ§\ê[F¡_ö÷fë#DÝÞùI‡1¦¿ò#ŽW~Ô©çvålw] búE¶K½§z3Ê9cG3?õœv>å<ÖþIZ}`'yiØY>Ÿ×éð×íúÛ±­XëßAatóºÇoh÷¼ýÔ“0z¦]þQ˦6¬°Ù» K*ÿ^rä뚦éûöí 5þAù/—Ë©äŸ1¦·Zöý»ð¨‘vþý€1¦?þøãxüñÇQ*•P*•"/MÓô|0p {ŸWšI÷ý÷63Ê÷¯_D=þbØÔfË/…›×çÓûÆ‘ö{FÄZzÿ)D jÿy~í¼ÿº‘æ7`)½5ÏQÊ!rÙTÿªªk¶þÉï¾(¿-ü"M» S÷zÕ•d•ËePßOµ=ÑÂÏ3õkÿ¢M„(—Ëæ7ˆ[<§kâýqi£h«cú·ÿðñb1±>©þ­SŽ®7ôlv/äo¯lv/d'â}Q`||ܵ.ŒG)Îk¡ï×ÜçZŸSMâûßK~šÏ?ιo»q§¨eøÁ æL¿xÏoñp,ºÝ~ûíú¯ÿú¯[~{MS»ÿ;Ҧiú‰'tMÓt·ö1ô÷÷ëºv/>tí^$á m›K ôýó[>æo…òPPPPPPPPPPPPPPPè oKÐjµ°<Ûì KràúV"ÐB+'Є}‚*Ý4`ŒéÕê:œ>ÍQ­®ó]Žo÷ò~;ÙÎÍZÿ3ZÏ>û¬ùÿíô\Ö2cz±XLEvÐEðké¹;éÁÓ' ­ÇJuóÕh箥2Xë`ŒéóUŽjaÀ 4Êr%»J’øšDû¿–ëßèPÖlKZ­–åõ½G‡²Ž÷¿cøÃøGþ ïþpOzhš¦9rGŽÁ3Ï<ƒ#Gެù+~á׎ü†G©ü8,›1¦6sL8æ«…ÐvÒ«½"MùŒ„{'$ÑŠù—u±Ë?ýýõ×-ÿÃÊöÛþ2­Ã‘´¡išþÌ3Ï€Ž^Ú;¿ ǜڙìÿÊ8Þ÷N†•êj×õ¨Á˜;é? ¹Œ1}šsLsn s#_Ú]§4¢. ²½b±hq¶=rÚ\ês3Æt^åö7Ç„|>¯7†ê ÃðMqHkuìÅí™Þèç ë k©£÷}µ0àû}o|OP- ˜äsñº“ãW9»çÏçõ·[왨CϤX,š Eì%í°úüü?×E\ ô íÒ7Þ±þ„Õ‹ùj…îzA×' ܼ¾oß>ìØ±aˆlä•ÿ¨‰&F=Px\H+ÿn`ÌXü¹\ƒƒƒ ›uþžú>§òKªï'·—ù|^/•^r|·®–@‡×ûwçÎ7#i{ãiÍýÙ@kž#;ÄÌEÙi€êÅêC«¥ïŒ ξwˆƒ(#~§õÞOB>Ïsð}öÎßÄöß³€(‘vù‡Ñ#J}ïB7!Ê®_eù0Ö!¼ŠˆË`´é⸖Sýóã, Ð{ñòåË ƒþ'é€1¦ÿÍ*ÇdÄã ~ë°ßð(õzüñÇQ.—100xý“ °µúîy;ÁëûÛÉþíæ`óù¼^º:hÚKõŸ}9Œb¬CÜ/ ( ¶qD]êÝïåH (´ƒaǘä4¾ý‡ˆ«×ñÓ33‰õI3?SËèßÑEò?ÐýíENôoèú·FôÌÏÔ"Ósž³uÀ˜A†ë©LìÒu‹»°°€ééiË÷q’ˆ“ü?>>nŽhšÖåì+í>WRßÿv²~Çc0Û~=Ñçïw< ÌsbŒéo[]óhnïü8óþƒ9|ÿÇïÿ¸•ØïvœüÛçpòoŸC\ä?÷W,õûî»'Ožtm{þÇ«¸ÿ;#–u÷g$¶9àþþ~úÿ¡k÷b¡öþ?gq Çvy²ûºÙð[œã÷þþöã,@AAAAAAAAAAAAAAáÖÄÛ΀I@šçh4€ÙÑ&fG›ʆ^¬wza3‡x$=ø—X§$Îyf/Û }˜uÅ«ÔQ¹^Iu¡ÔÛùü5 ~´†|þšcq ÐÎûøÛq0­ÅÓAq³×ÿ©©)Sÿ‰B²„Ž››6mJ\&‘ÿƒ.‚÷ûÜãö@NžÝÅIÆ ò)ß1±ÈDæÀkŒ_¤±L’Û½õ÷,aý/”»ÂåøAÉ@~dîsŸÃ½÷Þë*; 9„¸Ûÿ¨ê_X±él6kö»½úÞ”7¿ˆÙÝýxóø‹–p§{ì®Óï~÷» JZNœäÆÑ/ŒE/v‡'j¹«qðãA¾FáI,¾IS´åsÎ3FŒu·?+++˜››‹µÿÉÓ·lÙ‚\.‡-[¶t]£pñ[dzz@ÇaÈôôtèò ÚþFåp$mЂ/a‰`´¸Ïk·$Æ "?¼ë?ï|,úo6VúÀ9ϼïVÂTþ±ú*ŠlÉ<§ºàæÀhaýû3À &Xpòç<3Á^ðþ ð7«ÁóﶨÚú+W®˜G$dѾDÒ¦i³ú«$G’#‚·~æaGøÃvþÒmf¸=YÑ{ì…à4ö%Äo »ô¿ß~Ư%6þé·Ÿ8{…¡¾¸ˆF½á;íF½úâ"f¯0Ûë­V ÏíÛgùo§‡ü¼ßzlçþò-ßzØ1¦éff°ºº ˜™™I}‹1«3€^À9ψπˆóó¢•ìðDt%Ùb¾ZÀPeÏ—,ÎhL ^ŸŒÎ2L8fffpþüyìØ±#”\ÎyfrrÒüO‹üÝò/’åÃä_¼ïÜ…E,³æ«8wa±+®ß´ƒè’Fþý€ÚEz6FÛ ›ÍâÁôE"¦8>ø`à¶Ø©½Oªï'’ý‰°_*½„©© ^¯g丫ƒ%üøßÞa²™ôŸÏ¿b†‡‹cü…sžÉf¯¹Ðhà{ÃßG«µßþ>Vª«aÔŒŒNVª«è;fä›Ùi.øn}£jù_- ¤¡†'4MÓggG{v#B|&i8_bŒ™v—ó!Îy†Õ;ïªsní¿è, Îò òoÍsÌWyäN€ÃèA‡“QŽþÿû9Çû¹áTÓîõ<ÞȰñ{¼ Ÿ3~…ð¨À9ÏT®WÌÿDlr«¢³€8êƒHüŸ(tÖ}\¾|ÙükîÇ.Oï¼´„áí„3J`„sÛCŒµÜrÙ˜cÀ¯l{w¾þ †r Ð;¼¾¿ìß»~(]4ÏãÿÔÊ ­ˆÏÙŽøOqZóÜìoäò9϶—ÒŠÒ @˜v0ÈÓšÃ]à ò¿Û·W6»¸+â—A`,ñyaaÁ–´€¸Iú_ùÊWÀ9ǾöX[u€wi|$ýý/Ë&Ò?6œï@bNüŽÐXe˜zùæñ!Ú‚ÝüµÃIö¿É€xÙ_<’›çN[~{µ)ŸùÌgO>ù$Ëõþ¯•ñË¿µ¥R pß}÷á—k ~4u¹g]dô÷÷ëoüÛ—ð¡k÷Zˆþpáž—°´ôqK\Š÷Æ¿} Q8pún—ç@n&pÎ3,䜸}ÿˆÎÒœ‡PPPPPPPPPPPPPPPX[X“ü `4&4@aBÃÄ|Ë)j,ŸF†K‰,À¥Á0»Ý°ìƒB\ˆfça“sžšÉa¾ØÀi~§ùiT7Tßöäç(–k.b«÷#{{õz¿%\ŒG‹Î¼»M„®UôJŽ“Œ,ãf«ÿŒ$­«W¯ÚzW÷ƒ$Ëß’ÒÇK-Ô›œœŒ¥n¸Éo6›™S§Nõ´ÞNžøëÞ mÉüÿÖñxLÍkŒòù¼~nðl×Bç° Ã¢ZPU:!£³gòþ­øÆ¿»€±ˆ¸[¤ˆ0d ;ÙÅbû÷ï:tO<ñÉLTÞÏÝú@q·ÿ½Ö¿°Ð4MiyÙò·ÿKÓìÿêŸÙÛªc‘òî6x7ŠÅ¢c\¯>èŽ;ððÃ[ŽÉÉI4›ÍÄß¿š¦éGޱmíÂýÀ­Ó—7výºíß«]èƒóÌ¢qðãž 3ôó&€æÝ®&§ÇÛY>çÿùÏ›çãòÍØäP9]û5ã;4;d¼‹è?€.gf,’ë<ÿ÷½3ž÷Ø÷Ï`ù_dK¦C€°`Œé£í…ìß×»¤ëF´èF>Z­Ó]»3ßÕNFìÔGλÜÞO ¼€'^0ÿ_¹r@ôÎôxµ½°¿ÂL§'}ǘ££“¸‰ävŠ¡ÉúÑdýX^éÇåËÖÅo;é6ÔÇúLCuˆ;Áû{!ÐŒˆ¸Æ\œ¾4MÓÏÖa|ñšyŒ —¢ï(û©§žÂ™3gðÔSO9ÖQjÂôcé±!9ß)ñžã ,77à?|¯Ù5æJõ~êô[æ±øÊ[ÈÍçÍ8•055eùOÎâ†]»S=c¼WþŸGúâ"òíïî\.ßuÝÎYÀéêæÈù¿v| µãS.a¾Z0h,`8àœgN:…l6Û³s°ååe|ðƒàœ™,ÿõ¯ÝwþÍgY0¿«Ë¿ý%œ»°ˆÉ?ú4cúä}ç.,¢üÛ_`”±_g ŒNmÂ>¸ó‡2Ïs¹œÙNvÙf/h6›™±±1 àÈ‘#xê©§lmާžz GŽÁÀÀÆÆÆ:µ÷@2}¿zý}(•^B©ôFFnC.÷~‰¿Cäïÿ_~ù yüýL¥ëý›Ï¿‚;ß´„‘c^œD9þbôÝ6äÿZ?>xüýøÞð÷ñÁ‘k¸mxo52–¸at–å›bø±¦nö¿Ø)£­]}(Ç{N ¶—~׈ü_©Ì`x8Ø €]ÛÊÓWª«ø^­/Õ¹†äÿ+ÕUÛùº^ž“üññqœ?ÞÛß±c‡ãθ‘Ô€öëÝ©ý—ðBïõÒ)ÿäü¿Ñ0üvärö}ð¸ÉÐôÐh”Pk@ô‚»éNu¸ZÀÿU+ááRk>`ôŲC  _;ù 4d‡†bt··¾¬½Þ©þÉ΢þ&òa3ÇDãÊKøäNâ>wŽÙ+ [¶lér–¨ÿ6)!üõÖ­x Ïxaä9]#¢?¹ÿéZÐ4ƒàСCøÔ`b¾…Êì2:)¹ûV‡Ý÷7ýª0|wý¾öÚI/éh4J(Lh]qëõz¦´q»~ø÷ú~|ÃÇPº:h8ظèj'DØo4&Á°¶ý¹¼ÑŽærS8^D£."ªx¿“C0Úcòƒï´Û·¤É~~¿½2?S‹¼äœgÆÆÆ,}êõüþñC|&ìÚµ ŒYÊ…àÔˆ 2I¢À»Ž õƒÖ’Œcee÷Þ{/8çÇDKCe™™Gƒ©9Hêû_k“ÿ˜¤xîdÏtžËŽâ÷¿8.`·1›Ú7¿ˆÂ™k(œ1œ•ˆÎ0,í°Kÿ;*¼ë¿‡üÿ]ÿ øÙŸý8~ög?î|sĸýöÛõr¹¬ÿÜ»o`ýúõ€õë×ãçÞ}årY¿ýöÛCkìÚµ Ï>û,öìÙƒÏ|æ3صk—k›vÿ×ʸzõ*ÃñÅý_+ãþ¯•È÷Ä®‘G°P{ ŸÃ‡®Ýk†oÝú¶ní8]øÐµ{Íx»F‰Trr¶VÇâÂ2­}îôý#; 8Ùã7€‚‚‚‚‚‚‚‚‚‚‚‚‚‚Â̓5é02»Mê-Ïd¥Â„‘¸”$ò¹aŒ —¿tÞ;r„ r¾£"`º 3Æôù¢1©¦3èà ùå<ªªo˧^Ë,*Rl±XD¥rÓÓÓ¨Tn8äj5wïã5ìk´x4(ù‡{ï½¹\›7oÆÆ±ÿ~3<*8õ´ÿAë/õ/.4›Í 9Ùšmâï3~'æ[øó_4û ó­.â‘–Ëå2^ýu”ËeÌÌ̸æÏÏÂ…ÙÑ!óˆ~ß?çÏŸ‘ýé8räΟþ] “˜E]DòÿÜÜœ…ü/þwÒ;,A‚oÚw:X{'Fºî–Fa³'Ÿ/a¨2X—(ôèiËõ oÆc¦ó‡8ûŸbý#¢?´ÈÒÎÿþ‡ÑÃOûk,ÝÝ^˜´óÕ`Ï&ª²Œú™ŒÿÉ7=}õƘ.“û_ùÇÆJúÿÌX ö¾w2¼ï "Z<§”ÎûÞÉLç½êVdKø³ÿu=îû?a†ÿÚôæTÂïÏ/HaCC4uœà8=ÀñʸyÞhÔ14T±Ä¡Nx9Å_4ž…è`ffÆó½™¦ûõÕ‡¸¹3-cLçí¬È$xñ[«^¯gn{dƒï» ?uú-ܱ}ê¿SÇÎ_º ·=2hY€îwìE„Ÿðzç<355…©©)G§Z€áx4Iòÿ™3g̺¹iÓ&_NÂÀéÞŸ:…í:à_~P³\#òÿÎ_º wlßÿЗÁÙ"¾ÈñËñÖc‹xë±E4†ê¡¿…¦¦¦ð7«F_]]ÅÌÌŒùŸœpÄƘþóüäCDÞy½z(ˆÄþzÝZ\Õêº.‡'@ÇYÀàÇó(lŽf"çärïG£¦£QÓ12rJ¥—LGò}´£µ¼u½^ÏLM}ùü+8vLœ ¼‚©©„&JÆ6þÞþvùÞð÷ñüß›ç· šr{%9øMƒl”þÌ>Vß1£ß½R]5Ãh×õ°z…Á ¹ UfÑúFC•Y|ü ÿD“µ*ÿ•êª-±vÎÞÀîÀñÚ 6VúðRý'»Òïêø1¦“ƒ?»{gffÓëxǹ'@퓜†x˜úa!öKͪSûOÎ2žW/Ißr¹ìøª04êƒ8^Dvˆ¡ÑèNC¼?JûÉÿ§¹W±Oâg œ1w¨òJ.ïìø3J>|X€çøöi⫟ø„á¶Ý¿ ëQA$ös‰\îTÿÈY@ñÌÉæ S"ùst–¡°™ãòåˑͱÈxç¥%<ˆÎsæœgÊŒ¡Ì¬„c9^P¸?‹äÿ2cò¿ø?ÊñgÂÀÀ:ÔÕ¿‹º¿§`ÀîYišfî|þðà ó¶÷3ÆôË—/ãÍQÿÏàãøáðþù>æIþ'ˆÄy롊A´>4‚ãµATf—1Té´«Ô~Ú¥e—'/]œ0==m¶Å­V ãããŽqÃŒ1Éàœg¶ÿÎïàÿËß¿ß)Qå›-ÎÂåÄú·FºÒ úíe—F õBneî~‰Ï"äg?==Ý•¦Lš „…I¿:¯at–YÑ€WÚÍf3Cß»ðÄOàìÙ³æ÷,õc8癡åeä0Øå —¼ùE’ßÿÎy†±GÀX‡ÔLÄÿÚ¿ÿV,2ÝðùÏÞÑ c†3IOðóÞ¥úúF±…7Š-”.Þ‰ù_܆ù_܆ßxäŸðŽáwÙõ¿ÉKXxµ]o3Ù€x=Jy^øï¯œÐqfN¿.£ï§Ù·¬={öàÙgŸÅ“O>é‡sž9tè:„/~ñ‹Œw…ŵnäÂ=/ai©ãláïú¿‚ŸÇßâçñ·ø»þ¯8Æ‹´ÖCoJq·w"±_ž†s…á,àƒ~K9PPPPPPPPPPPPPPP€‡·2Ñûpƒ ´ÈÔØ1”uít{Y/ƒdÆŽaùüêFd= IDAT+]á²®¤gçð!Òñÿ«iÐ4Mó0;:„V«eNe³ÙHl›æ™i¿^¿ñÈ?¡tñNœ<‹sƒgÍ]ˆÝî%²?¥qnð,v.~,Ôbi™ôO»ˆ»¹…Åäý[ñw¿éˆ†ún‡¨làСCxâ‰'°yóf0w¢ðÿŸ½÷o£ºÓÅ_JS(ÉŒfÙ&m2râRJ"“¦°Iˆå¤@K¶O-Qðe¡ÔrÈ6ÜÜrëJ5ÝöÛ¸RÝe—[ß&–³°]Ö@-wKÚšX&B³Ä'”²I,Ù@°g ¤ ¡dîg>G3£ÑOËì·÷ê}=šgΙgæ|Î9Ÿ÷ýT…l R¾ÿÍ·œs(ù ½SNßa$Ûàh¯™dΜ9èêêÊ{}ÅØ  ½xç·ÂIp~ɘãü‹mÒé´««« [¶lA*\ƒT¸ûNaË–-èêê*™ävÂ2dÿõë×c÷îݯOLL伞RÏŽ£ÈöB›€¨VU«Cgg'T­Q­Žï›ÉH„ÿÕçñ_]¾ýýýøêW¿Ê׿÷½ïåurœ.ˆüO•ŽŸÖÖ4x½^„5F„¦}K–,á×O{ÚÛ™(L{{{E"õúþR„¦DTCO(5B]¡w¿˜±ú†[f.¨ªŠ+VðõókËʇä%©¼‰E¨Z?cY_0;sí"fŸóþó0‚٬mÎJ;MÜôý7Г~‰¯›—ûµú²…NÌë/éÀe¦uÊ3!oÂàp±aÎ]|aÛÍévüK¶ÚQì·¡½¾©-ȉïfTÒnÐ4Í5w»`!¡™IiDþ§mS·if0¤#,ò½ìñXHð܆þZ#ÇÏâÚ¯×~¸nƒ'‹ü_Ž8‘èðè>‚6¯b8?gÄœmCñ'…]UU,ŸìñÀl•ck”ƒ+®¸0>>ŽO®Ú2cå8ãîkjB*]ƒ(¤Ò5Ø9–é{;v Þ„ŒY[­Q/ÓÙÇiÖVöü½ ¹lj0Äý_mçü^¯_Y×h¿™Î¸¸}\ÝœÏw¬²ü׬¼<œY®$d#Y¨êw:lk{ Šò·¡¨H‡öo¿¹?T("Û þ@F@ô 87­sûKœ¾°f)×—)=<_ÔïÆ¾VOÁc*}>3Q†™¸?«MǬ¶ìì‰ìß¶yß¶xÓɬtt|>!§ò‰¸¿víZ¬]»6+ÍÁƒqü´ÆßÏã§5,[¶,+ŸOH (ˆ€0(äýþ€“X@©"fâ¾ßïwŒÜLCæûï =ÈÏ'$0( ³ô6ÈÇ ¿ƒ¥ô‹ŠÜúÞÛÿõÈ#X0[Àòÿ f ˜*ƒÌZ †ä!ìÞ½» ýá$0"vòç{‘ô‰úzì€5ºÓ²=]9È7þLdÿ.MC»1÷BëÇräW©û/Š"VÏúYþHa[Enw¶€V•…Yx$öÁ+{óŠ/« ¾P¼¨¼é»oÿÞŒŒ`ddDè}‚£˜+ñL0€Ž3ƒÚ{},§_ iš«¥¥$ˆ°mÛ¶œcÛåŒ1å+—D”X ÛXÃg(5Ï\p}¢Çe'ð—Ú÷rÊcº˜uào0ëÀß â×ør¹(‡øìôì[ZZ²ž'͹ù¿@1(…¤¯išË,PJÝH¥RhmmåeÚ÷“ ¨ˆÀLõÿ+ûóíùçßâïÿþïg¬<;Ì÷Ä<°a誊@  ù?Oe‰aæ›ïºö‹¸°Ÿe‡Ã‡ö‹„+ø=P O`ÿNöw)8|øpκóÒûÙ/Ñâ,ðÉOG8A?|8ÿ{8oÞ<}Þ¼y9ëߟ]ôgXR·sæÌ±üÿÙE–•vîÅ×éo­Þ‰¹_§Ï½ø:ýƒK¯Õi»SÞ?ùÉO qóÍ7¼³ÆLŠ_êë÷¡¾>#:ûñ“Ÿs\¶§›h |¡¸åWŽ˜|}}½^___¶?„yÙ.LTì·¯Ôq 7€-Bþþw.±€ª@UTQEUTQEUTQEUT‘S€8œTè9•d g²eË–á7Þà®äÀ§§ù2ðضm[ÉQÅ‹}ðFùŸ_†¢¸àõ¾÷c,DÀÊEÄ*fòå– Ç2(OŽÎoüðžþÍú7XI˜æAüJ3gèìì,›@F„PáB˜·B)¹¦t “dÅ —â…¬x‘˜”J*¯4üdÆ•N7oÞŒÇ{¬¤÷õ½"#Ó±‚ ¬ÿÓ)fpØéË—¶©©©¨ëµ¨kš†`0˜; K‰÷¿˜IS4™Ul˜‰óqþåó2‡íxDæJ£”묔¼‘È–ÿ‚XõfÙe¥â5Hí\ŸµÝîx•Ú¹©xMÅÌÈå|j&íŸ_ ù> ù>‰[·¾ƒwc‡!Ë7t|~7v˜ Ÿ_Š[·¾"ñ;‘ö 9ÁžÓv ’I«’8c¹"–HŒ«˜¦’dæ(Œåä]LÙD4;w.mcç`lϹ¤Ô:ád•úý—$Iomm­hdЙt~V’(I" étÚ%I’~è•4½’ÆñÓ'[âát–èTGš¥¥ãÊ}sÙ PSSƒîînôÄ€ßÞûeËqÓµ5ËmRá½êAÀ;íOa@L8¢øó1—?11ÁÉÿëׯÇܹsùz¾ö¦\g3¡9XŠ¢ˆwü%lûñ—ÐÕÕ…m?þ†uœø8w{þ÷Þëd™9L—z.•Š Z ûÓ ôÝ¥2¾x]ƒH¥RllÄšKe~ýÇŽ³Üê׸Ýî‚ýš|°¿Nß_J'I’NĺM›P2ùß|îNï¾ ú“SL!œÃÁ¢RäÊÛììöû‰!<ñ«€Ê‹[išæ"âÿÿyòþñÓÖk=«¸0ûv‰gc.œÿT&Ÿ“Âÿy|Ý,P rµs¢Øè¸\è¸|PÕ!D 'šØÎÔœWD¸¸Á‚Ù?ƞΜOÄpà)…åJRqŒþ^i›À,@Ä}4ó#ýfârà­0‰øŸüZ®q+™‘Ò˜ó)eìEEîøk¿÷3"…z½^|ï{ßÃc=†¾¾>$GF,6P®:_ùµPú?ÿðgqã7–u=Å@½;FŸ¦¡ÛÔ¯^58Á‹ç\ wø¥´ßN&qìØ1<·LÅs.Öf=çRðò¡ƒH~9Ï•J@5ßש©)LMM¡¿¿ýýýŽÂ;Á`Á`òAÐ×ܽô‹>­fýÌû í’ ÉÁ¼\I$ çjEIÂç !‘ˆBQ’…Îd½+²ÇYžy‘¢Íäè|(v Ì ©st.æúÝnwÉc-d«PÿˌƔ`ù'PZ³m£>y= Ñ4ÍÕ"h¬žËŽ¥õ¡´¶x¦¯Ÿ I’ûúY©Ÿ…Ÿ—¦i.UUùXå† 00ÀœÔi»ýœ$IÒ)ÏxØWV= rŒ#²’TЧxTç\e—*¨iš‹Ä¬í˜IÛO–e=|‘¯÷@Æ-·|@þo¦½m] by0ˆ½ °ïG ¶¿¥€î¯“ý?{{¬g>^L~³Œy¼ÝXÈIÝgc#PÕ:LD§ æC~˺ZÇÛÈ ‚?Nð7Û`do™·Í$4í“0âJ(ì-më1¥YiJsÏŒœÇLÎ=ù€#ñŸðQù5ËØsÔïÆÙ<ð”W!"ÿp$þ–-[†ßÝ“±=ÿå&Oδæ¼Ê0>Eù¾ÿüÝ”9ÝB$PŽÄ‚׋¬ûŸ”×Lˆ¨G¡ 'ñWîÌ%€JïÖ’%K Š"" þˆd±ÿ+v¸óÎ;]íííhiiÁ¶mÛ ª*{looÇwÞ9#†_c’õ?†ä!. a ‘ôéúH X³È@>Q!Ê»R"3Õÿ¯œ®«\A¾rÑÔÔ„'~Áï'2ªp?òŽmÀÔm'ÿ—šwÆ–÷Þó>À¾ƒI$>ó1ˆ¢hÉÓlƒ²¿‹)÷ÒÎ+0‚] —8€Dþ¿tÁ‡sÞŸyóæéßøÆ7ðÁ~N"Ÿºð Ž9Š¿;oßú_{±´~)¾õ¿öâïÎÁÑ#Gñ© ÏXÒO½ð ן܈·VïÄÔ ßÇ[GQû}ؽ{7Ž=ê((b}¿â¿›ÿs¬ÁoøúÇO~OàS–ŸY` ~ƒßÍÿ9Nž(OiiR­œ¸ŠˆH“–ÿÿ{Ê»ÙÅDfV \ÂôL’‘iЖDE Õ³ðH©aùDW’$éÇÂc8C*•ƱðXÁ÷}Ñ¢E˦w·«« ½½½€ÞÞ^ôööœ°.ùþçݯ钧*u>…°E’,ÿAôýû÷cÅŠ3 ³Ôë,× ÞLI$4„w¾Špø >ŸŸO@Âpz%ž¹œdr’?*=2¡$Iz*nˆšœa§ä «$]‚¶Qš™pzŸé=M&“Ü‘°’ŽŠ!ÿ'“I—,ߌwc‡qëÖw¸€@ðù¥8àæBæs ¼Eô{ýãÞ¬sK&“® ûEœÓv –ÿä7\Làœ¶K°|¤aZŽjö:MQ öUöüíÎAöôÓ±?$IÒî0BñJýþSĽgŸ}©Tª"¶a¾úW)г”$IïH§1ú6ðÀi`ômkº9W?"!’PqUûC–}æc:ÒV€—¶F +²A[[[ÑÚÚŠ††N£®–j›¼—ׯ$(ÃIN0&зL–e.‚µbÅ îôOc–K–,q/¡<íÑê‹yî…@bÔöe³×t¿dõ;â×0w´ÿ=³ýzz΢2öýhaÖ¾Ó§¿mÛ’‰@í ‡9ñ¯ù6{Gïå%ƒ/bùòwËn‰\dÛÿÓùÆ,Þt‹7ÄXÏü ñ_qá£òkx1ù!œ`V[~¢5‘ÿEŸÀû ªZ( TµªZ‡³±Àë‰8åCöÀˆþjBÃDtŠÛ_²¶iM3é]ËV,\ØgüŸ̹ª¡xŠÿÂ3д•X¸°‚°uFÆK™{N§Ó.¿?‚h4€XLÁàà`QýNþWŒŸ µ!&>*® ñ(˜´ÍÓñùì ÂþÁƒqðàÁ¬ýD8ó…â¼|'¢ùø|‚… $ÛGA€­yÒäÒê&öIÔÕÑ:6ßÑAüØ||>A; +µ?Éd¯ã¹o+vTó9)>kÛHMZ‰Q~§ƒŽŽ}x¦š (®þ5&¹(0aºmÀæS–,YÂɦDþôG0cäÿŒ   ÂÐ˶ùºã¹¾ÝK ù8æpìtï»aÊýù" ¹D’ìe!w&Þÿ*2þÿy¯§RçF6mô{ÑÒÒøÏ…ð¹š‡¤òÈ>#ÍÒ¿ÙŒóc+ðöä0z'<Ž{²æ2ÛÛÛáv»ÇùXùŸ=þøãèèèàFø÷õÜ´mbiÌû:::ðøã[ò0çMi§{_æëÔÝÝmé¼ ¾ (±”X ;c ¢ZnÛÒ úo7é®Oôäüv麢»ÝÍhhØ„B}/·»nw3t]Ñu]q<‡rDÌ}:{ŸŸÖ©ŸVê³µŸW¬Xýû÷#ñ™YöÛáôìé[sNÛ%¸uë;H|æcH|æc>¿oT¼PQ‰oQ±$}ó5–"@e”rN!C¤pÓ4¢NÏTÿº`ÏõhÚJ`23–Äù&—ÍÈ8—ªªbpp­­­Æï'†0w´ZLÃÈñ³€ÖAö>”;ÿMu÷Â~‘H3`` Å÷Sλ­«vdÚÕDù×?©£(‚Y &Îf–?ùÉUøä'We]‘ÿ'uä­×·ÜrK–€Ì¼yóô@ `=¯6àè‘£@›õxJ7÷âëô¹_§O½ð}ܺõŸ_ŠsÚþo­Þ‰wc‡ ]bNdæ£TìÚµ hnnæã󕬃óçÏ×?~òsøøÉÏq"üÃw³åGÛ‰üÿñ“ŸÃlÒçÏŸ_öùÌol„×ëåíN(žÊôùD±è1°úúz= b÷®]8räHÑßµ\6”Ù&5‹¤;k&þoÛ¶ ›7o.ilänÁ¹ÿÝíðMHÛŽ¿cßã*ª¨¢Š*ª¨¢Š*ª¨¢Š*ª¨âO9r©Ð¢~7Q?Qÿ´@í$IûDDýn´´´`rrK—.E__TU…’ô@ŽÝÝÝØ¿lx6O{å„}ÓŸð!òÿsêÀœ¾ýš†P?~0T82ÈtË~ÜwÊQÛ‡{€Ç}§*2NŽcs¦Ø`RÏ$Ç+h2*¸ÍÍÍØ°aEAGG*÷ÿ {KƒjƒÒ$âé„Ó5”&Ñ”®A“±lN_LÞN¹™,¯xÜl XþDž¯ø`¢¦i.šxË7Xù^’‘%IÒ£5QDk¢èèè°¢äªÿ###LxÄ8®ÔçKt…Î'ä˼ïgcì‘„|ùÁ§ãdw".åþ—yÐLš*vpÜþ^{>¥Þ{9=’„C¯¤ÑN£G’°)Æ&cy&`¿å\çtœàUUE<ìËÚŸÊÚ–ˆúû,„”DBƒ,/«l·’ÿRñœU\8ÀlåØÑ'@UUˆ¾Qþ£¨æ_Y'` W½yIø>ª·uqžÅ&8à.Êá™D«€À—î¡íܧ¸ƒ‘ÿ½³W"tîZ„Î] ÚnÏóK÷Æ,bÓ%ÿS9ê“×#ö£aKÔÂb£¥—ó; 1>>MÓ¸­G΀æº?|"ÿË)CÚPÉßÿ]»vaÏž=®ù¿˜ú7¼Íu­†ÆJðŒ©„ž‹CÂS™¨0 ÏèìsÓ9·ææfŒc||ÐÐÐÀ ÿ´ÞÐÐUUÑÕÕ…®®.Ç÷?ß· œö‡ išK ±:6–| “ÊI4¦¦…É~¼¢(˜˜˜Àúõë1::ÊïÇøø8úûû¹€’Ùñ±œë1ƒÞ§ææfPt¶ææf¤ B^CCCQíª,á ÅË>—JG¹(¥üb"R[¦×ë…×ë…ûó‹Sÿ`÷îÝ|YNÂýùè¸Jݺ¶ÚÚZ444 ¶¶µµµœèX[[;cŽW‰¨†dðšø7ÅØßГ PY‘s!òÿeº—G˜²E*QV Àèè(Ün7È×›Ú€usû¡Mݧûnßæõz±aÆ¼í‘ :9´Ì¿ÿ$ ƒìí`„ÓÓ[uË2¥Y0[Àòø™,çʧ”{uÿ×ç€ýf|à/Op¥±o/Š’„ªaõ\%ÙLÂTÕ!( {ÿ"‚€!7»®!w†¬IÇ"¦Ìæã‹AM•\Mß‚©ºt%–9gƒÐ888·ÛÑÑÑŠˆ˜ßeAtŠ4;,áj‹Á+{!ÇôK$Z!4½vO–e݉¤-˲NÜ É‘ôÄzù=°ÿuÃì;Ñ8 /:ˆ¿<‹Y[=ð&dG8Ÿ8‘ù~tÝPolÍUUuüþUŠ„à‚›Ú‚¸wË*LNN¢¦¦†×‘mÛ¶¡¯¯û÷ïG__DQ„(ŠhmmESST_Šj&ÏÓu‰¢ˆññqÌ;~à–&ñïûº³îÏLÃ-MÂ-MæŒxätÉdÒ•ïÙ—ÚO|¨±_Y׈‡+lÍÝû}ZEôikîÞ—µ}ZÅ5+/Æ5+/Æš»÷€e¹R {qøða>|·ÞúcÌù`Ï'{<åÊk0™ë—¸.oƒÌ÷)+W‰Úó*T^0D0„ËÕ óý§±(Ëy‰*ÀLüÏy1ßõ› N"¹`·ÓíerÄÇ"‹ëBð…âYQˆ+e §Ói^¨¥c×gÏû¦ÐÊ$îºë.ÝüŸ \µù9î}4@4ȪÉÆ¬ú7$e‘·JµqNó5$0ò'ÙåæW‚ è$4FË#ü?ò•G°]¶Kl9hœF—a÷‘8Y%EzÇ!ûŸ0¶ŸXb:oóÿtÇÁ)  QÅÃ>>÷0ªT*eš²¿Çç´]ÂÏ­Ü{’ëØ¾ ý{n𦹖ÇÏdÙþö¼œü…Ê9"ô›±téR,ü«ïBUUxg¯Dÿ¸‰€å7ÙÏ8ì¯]=x{rûß‚µ#è]4R´ý·gÏþl»»»¹Ï—×Û qõO!ún«Ñþööv¤R)ìÙ³'+¿ŽŽtvvN›°O÷}ÅŠhiiáÁi =¿R° ü3Z—ÇbØØæÅÆ6oÉuÒ‘”YÜwÃínF8<€K‚¸àvÿú^—6±æÓaàB¸¬ fqBbvPìq_Æ×@–ƒ9øÏÃã¾S%]»ø,Š"V¬XÁëš}l(ß³gâ+™@DÒ€ ûE\Ø/B®¨˜8ÖL*¾T }}}¥¸=°õrúÐ IDATÿ½’Æ¡WÒ¸WI"l:ÕÁ{•$Ì⥕°Ãˆüšƒ@Í%ÀÈÿ„ ÷fLÕ Íú⌟$I×bTUÅŽ;ÐÙÙ‰ááaô2Sž³àýïgñΊ<>ÈŸY˜ë®¹~þhGŒ¿×Ô¯Q” Îlb_«ÇXß_ €\¨Å~NÛpâ¿=M±äø§ú'¼üòËX¸p!æÍ›Ç¯eÑ¢E8ånÀ±Ñcؾøz|{öZÀ·g¯ÅöÅ×ãØè1œr7`Ñ¢E âÿ[«w"øüRüã=ç¢÷/Ä­[ßÁ»±ÃXÚöÞ}÷]Çòóõ×$‰‰EÙØBoo/š››ù~ÚW‰:Häÿ'ð)ìï¹´ ðÝŒG¾òz@o‚Ù ð1ߥ'ð)|üäç°¿ç¾\ª€} Ì©ŸÑÐЀ”1öc¿ÞúúzݼüýÎ··dò?-Û ÿo¸o¸ÇOkøÎië~;áßLü/ÖN0§É9þ d‰¸ÌŒbUTQEUTQEUTQEUTñ§Šœ@¶ ½Ù ‡&¥}¡8'ªMÇù†ÀgT‹ÒcKK Ž=ŠåË—³Aæx =’/?ü·ûD¼üðߢGò ’Pù`XWW'Ç›#Ô–{NDþ€Ë¦•[i$I÷×iX—¸»±Oz* àH< +]cØ'b]â>AZîó ã:::øÏLlIþÒ2á‚  µµ•O´U2îL€T”ðȽ…ŽQU•G¶#ì&‹É[Gv]-·¼™9Þ>¯Ï„€¹&ÄS;×g¥u"#«O^ÔÎõe‘‘‰ ^çá\õŸ@Ç„]á¢ßÁB¢+”]XYlùERÞ÷+Ÿ€¦i®––,[¶ ]]]y'&É©u×®]|R“`¿ÿ”f×®]E¿Wf&[(žÊI,Îû^8Ô‡RÞÃbËéN§³Òîß¿+V¬¨H$û=/ö¾Ûïy¹Nð«?þH‚·=Øw!"‘ ‰\`yŸÂ>JR?’@ôÉ·!I’Îëåª7áóOV&R²ÝÉjId1«4 Eë &êØdI‚-EÙ¯’Eäx@ÿNhïq!:w/~04…Þ¿8š3²,ë<™ˆ:?š‚ëòû±?nÊù^Ò¹˜ë› zô{XŨœ¢OÊ€]ÂbÆâ$¼2H’¤¿þÂÿ–yÞÃÃÖ!üo)¼þÝ´ð rJι/×÷``»víBoo/1¨¨C@1õ¯\˜íä°O„Û/áÌöÌþgtq51)aË–-ü¹Ór‡í[xf;àöO:rjj ƒƒƒÄÄÄ„ÅÁ³©© —_~9.¿ürÌY¹½½hooG{{;Þº~ýzƒÁœå”Úþ8½öü¦û8EU§(À˜ššâŽØæèÀÓu¾¤ó&²»dˆÛtöÉÀÀßä'à{óN|ÏÎã½(ŸlŒb£ æ+—"!ÕÕÕeíü·~}¶=LǸÝ¸„ÛíÆÄƇ‡111‰‰ Ì›‰~˜K`êñJ.×Lþ·£XûûOfò?Áív£®®É$,°?·k>FSºÆòœ%IÒSñŒÜ®]»Š"ÿgmT2N_„³Ì¿ÿ$'÷ŸÿsŠ9yÓ|œ¼i>O—‹ü¿`vn’¸¹Ï§iš«_«ÇMß¾eIwÿ×çàì§<|ÙŒY¿ÁûC¡_«/éûçó… (I ¹5 ¹5?­ñeEIrǸø°õ¿Ôã Þ73R©A@bRB<œ†F­««³DxŸ®€$Iº™D©E5ÌÝ.ðh³z¬ JRA²-cSÒþrÛY–u"ù/ÿì,Ë6Úî\ƧÐUìhbÑÉCñT!F·i>øåYNþÎå|î4öB÷ƒPŸÖxDôÿ\øNÇOk 4fá„é’¨Dö{b’µ5“““–t;¿ÜÀ£R9§«« ýýý\°¦ì€b}"î7ÞxåÄ/ñÀàꫯæû*‰Ët/Ré$Lm«/ƪÁAìkjâN¾Kðvg\J×`çXÚ’Àîc¾gdˆnfGoÚFB7$¬CÑeÍ?;J£rŸ¸cBWˆ]!â‰;Ve­Óò£Ï¼€‘ÿåK2ùy½e» ¢~7¢~7'$™‰G©T cccYù™ÓØËID5.¤gÓ#a™Œg>–aNo&ÉAgcûQøˆ«x²’ :ÿÍèíýhÚÓд§+rýfÐ\“yþ]2ç[Š]û¸ØÜ¶mÛ²êO7*ðñÁ-[¶L[PÓYŽü3iû±üùß ²,ë˃A¼ý©—oêeìõö`ÿ6Cé“qn“õûOä{Þ…¾ÁNAÿÄß>j8Éeÿ¯¹{>ñ·->«išKG¯‹7Ä,¯ŽVùÆzæc–—Ú*À‹É`"DðwÌÐPÕ:œàll³¼:Ï ŠÂó*t^s· Ù7€ì+³ØÙc”®R¤";ÈAØ Ax ö!.ìCKK 'ÿ ÂVhÚ=Æ5¬¬˜@¹sÏñ8«—mm^455åÌ_}":…YmÖ,Æzæc¬g>ï?Íìzów Oñíë/ÑqfÌjÓ1ÊÙ¬_¿k×®µlÅèè(·¢1-{ù´`v gÆÚµk£¦çºdû˜15µëׯÇúõë¹Íãõz3yª4)49»#, ´ßo×ÁÈÈÿ¶îß¿û÷ïϺ~Ú°ï4g†ßïÏÛ;Ùéfû]’$ìN$!Šˆ_C8.àÉ)ÍB@Ëu½ÅB]‹j¡ê¥Ãi¤ÃiôºyZ wƒC.Åá®»îÒ»ºº,ÿNû`óæÍèêêââ“ùÒçÊ/AЉøo†¹þ…&Y:ZåϨ1Ùh A0§ÉY–õcÇŽYþöŒüé Åy=Ì—>W~Å ^ÌþŒðaМøçxéák¡Œ0{े¯Å‰>ÁE`öA+ ‹Õ‚Óøó1Óÿ ãŸD• ÿÓ7‘D}óÁ)Í9m—@Óž¶lÓ´§ñf@-¹]" ;ˆ|ýBDF`.VÀˆú³ÒSŸbyüLÙ÷_ýpô±{­ï ÿ´´´>ûwóðÙ¿›Px“§3k%í œøïdÿ¹Ýn¤R)>Žå5ž˜˜àíÚøø8¶lÙÂü9ÎÛ5¡AMhP6ï¾eË.ŠÜÞÞÎçC(/ó¡ÿAô¾¾>>@ex½^ôõõå}~¹Æ˜Ê…¹Ýz¶­ ;c vÆÆšO‡±ï ë{Ý~ûEr÷½’¿^ˆ .èæÇ¹ÝÍ–|qY›u=Èî4û´åCØ'b7b]âøëбŸÓé´‹übHT“6éÙ‡5Í"ÎÖ4þìé›™øÌǸ/Ƚ÷¼‹œÞÉbƧ#^Bå†ã"þÊ –D 1Ü7ÞxÃ1M±ùåëÿ_úçFßféþÛlfw檃ût/öéÞ‚õ¥XÈÿ„šK€ÉeøZc?ÖÍíG<ÌæÄA&Ëì^ ¦nc"xà …$xÌÂÈñ³<Íùµ|´ÔüÍí}:v=ñ«àöÖL˜{Ñ'dÙß¾ÑÇ~Ó‰:~²ýü?°ßÄYà¥÷³eBí,à‘ßXÅO'2·‡ŽŸ(šü·ÜrKÖ¶×_Ýuß}÷á¡¡!œr7àízëë«?þ)N¹ðì³Ïâ¾ûîÃÔ ¿pͽøëpƒ‰5ס³Ún,m{ 'Ÿ|o}¤d! ´}{hz``€§N*ƒ•‚#GVáÙ«^ÌlðÝŒÿ|'®½ûìpâZfƒ’<{Õ‹8r¤ü±è6oÑ@¦Íöš Z¸U„}"Ÿw¦ý‡ûŽ ¾¾^¯¯¯×zè!|½ãë%“ÿ©Oo'üÀ7g³-›÷Óÿfâ?S~¡ñç»ñá;Lcº)é¬Ü¬iª¨¢Š*ª¨¢Š*ª¨¢Š*ª¨¢Šÿ·pn1‰!_EôI6Ùx'噉Hlÿ«­¶iŠ ®/]ºÔUt||---èëëã"---YKŠºhÑ¢¬¼Ã>‘ôrINäÿ:dHwá¦&Du rª¼çß4lëñ2"¸ + sÌ8ëq2W¢|VØæD ÿ ûƒðõÚ L²I7MÓ8 î‡?ü!†‡‡v…‘"eßûRQ‰Éç|y´:ttt ¹¹ÍÍÍ€ "eœ²Ãé ‚ÕÉŽŽ„Ó5ððK¥ÕAº–RË£¸•½Dˆ\ €ÞO³ÀRç•]ž¦i®+VèÆ¤¢"ú¬×1²/‰p š#“œŒlä`DE¿áŒìK¢92‰è“o#²‘‘‘%IÒy Éò,̤ªª"ƒ°a[ííí`>Ä0ÉÞě؄9H èúÿàB:Hz8èA$¡:ÚšIÑþH"k°ß\Öœ9ÅEà ƒèííu,œ°Q…&ÍsÝÿ ˜#ÓÙÙ‰ŽŽŽ¼÷€MÄ_gEQÌz/rç€Uoòú+oû`9 àS¹{O[ r Lا½’Æ¥Rþrò!ç=òÞw§{>88¨õ«_-XæÙå?â™rAÐÃ;_EdãE™D«Þp_M&Ðà•½™(kû.;.S/eù8‰Ìq¥ öÁíOpñ5a°Ï“üëÑ cÕÖöyžÝdœß°=»iÁLÂöG9Óyúû±[Ø -ö4´ CFƒ^Œósï_ÅT` ¿6Â;{%”ÓÏ”t.fò?ô\ù¿÷Þó>À3Œwc‡!Ë7u.UUav€Wÿê“×ý‘9†}"BñT&¦¡e‘xDþ€ÿñÔÛ¸HÑÛÛË¿µ#ýîÞ½¢(²4‘[ìRß?³ø !ì #2Ékÿˆ¢È"Å〪ª,:ZY›¤Øúg9Å2lx8 DB|{Ø”Ùn&X°Åg¶3ªx8 %éA$Ý,ÄS Èþ "öñkÕ4-Ë™›¿àÙgŸÍ—gÎ}¥¶?ðÀ,ÄÕW_ 1D׬Þ?öØcÀIsùPjý¨­­ÅÄÄDI$3{›–«,I’ô†É NCUUìÝ»ý“ýx¤ûlÙ²ÝÝݸöï¯E &CR¡þÀl\AtYŠ—\÷+u¥”YnùÒ¨„]»vAQìØ±ƒÛß@éï<‘ÿÍÄÿ¦¦&ø#ƒHDýð…úsKŽ9ýýÖ4ægŸï|r -™ßÝ©©)twwóëÿÖ·¾eIïv»‰0Yöý·“ÿe™ "~­hûÛ ©D;¬Ðwà9—‚G‹p§(õ{b'ÿ×ÕÕñåÁÁAè†Þ‰jü~bç×6âÌæ6ÀpÖ"'µXò?‘óÌ@ËǯÔ,ÎVvœÿ@~æóï?‰³…ìýEj1‚ æìÞÁƒÖÿðëãþ¯[ÓÏúÍ>€Æ>Sç×sp“pýZ= A=¬i¸Æ¬ž+ !³†îvùçâÃÀN7†=Ö4`v&°¦q²f¡ãŸœÒð¨DrÔ {?μNmakk+ü‘ðÕ¤!ˬ^˜ÅBˆüÐßß_Ö€·Aæ„K!$@E¨ª _(ŽDÔÏm}"cÑ8˜ù¢dYÖ#þ{0 /] Å/veœ¥]~Óú(‹ ÑL®šNü—Óñ¦d2é’!—dï$IÒ;ÒiŒº˜³ÒþìiœRUUŒ¾Ùß‘N£S’tUU !ö4á ž'EúÅ’ž/‡š¨ƒèkÁ¶mÛ¸ÃmGGàb¶ÈØØï«Ié—¥^4Øul\œ±•ÜŸp1¶+®¸<ðgU†“ðGèH§Ñ^ñ1'`l¬uçæK§ù¾rAd7"ùß_ÝNê7ÛZ@€ ßÐq#2;*z<ÔÕÕ¡¿¿?¯- ‚}:ÓÆ¹`ÚöÄ«,DXÚ÷û^À5+/ƣϼÀ÷?qǪiõ9.¹ä>|—\ÂqdÏQƒ¢ù 3Å_§á¶6¯£€ìñ@ö¡xª¤úaE×m6l¡8¶mÛ†ŽŽNH,f¬©PW\ÍÆ(êVrd²Çƒ¨ßÍ›7s‚J{{;Ö­[çH€7ݯ,‘1_HДE¨¾«·Ï^Ðä")¶xº¸Àû.æ2ýš†¸ñ>FA‡ÑÎõ±¾yÁçpa¿ˆ7*f¨ÕQýL¡iOcóæ+¦uýN Á$ÁÛ WŠ$T¨jÜQÈ- Âê…(f¢ÃÒññ°JR±æ‰à˜A„R"+IIÉtdd$K°Ôy'êsÌ‘_^Æìx;ù¨œíÇòOº`´‘²,ëçœý7¼;ë3€Ó§¿Íÿ6“óŸÊ"®ú{þ›—ÿgÏþ–cÞÅÜ3$IÒ}5i$¾{ šôgŽÀ×o³ë û? ÁàwY4Ú¦¦&ŒŽŽ"•Jegšg^L~‹cA¬m!'ÿT~ÿóbúJgcì!±<<ˆµé@hÛ4 á,ä=Ê›ˆ¿s· PÎ*.Ô†ËvZ¶W¾í%xe/`ˆ!ze/|¡Nô¿ôÒ>,4ôº§¢åÒ}PUZTƒ‘çž§nÓ0-ëøýÄãaÄb Š‚9seÀž[ÌЧiè3‰ôiö|¼Sô ˜ˆ¾fz8se‰ äÂÞ½{-"—uuu|î©««‹ ÿÑ8@ Àøø8ïó÷ööÂ. ·wïÞ,qB qV*;`c,¨­­Åúõë9`$Hp€Èlua°pÇ㲦 ܦ]±b'äù j__Ž=Ê ©Ô&›û"ñx'ˆ¤O¾ô×]wéwÞy§Ë¼éҥس ѺÿNéò+æúCý>D „úÙûNõ¯1Ùˆ!yˆ×¿Æ4Z…âSëß<„õXÝ»w;Ö?"éa“þe9Ó&;v Ñšhæü&CÖõc¡¬ô¹ò+æú&Ćúz@ô~éÁœiüÒƒ¸7@HOÔ×ã 4]¥ŽU.«çÇ %t(ƒPLY‹-²œ¦R) ùH¸æ>bÂxç„~Q³M…ëIï 7–‰ò]ê˜Ü .6¾¯NíþÅýý0Ò”ÝkšæZgãž¾ówÒ©l£¤S€úEÓ±Q 'æï彿–“Þ3N(oÃ{ã…Px“ÏW’ šL&]Qt½'½={ö€EØ¡©© ƒƒƒFßlp¦‡‘OEMMMY"{öìÇãáyN‚ èôÍ£üØóbËK—.¥w}Æl1ó¹úÁøú¹É$.—eœ›Lðbu,VT?—µÁín°›“ó‰üOHþz!NÚ‚‡Tsö½z{CE\ÐÍ·ÛEX9L`Àåò¼?\¸>Á5Qù$!gÏ=^Æn0CtS[rR)ºïåtÈɼž=ÙzÆ»ÊöÙž½ªª8zô(íñf›JcŽÏ„Æ-r½÷Æþ¬í3]Ïœ`þ¥FÌFß¶mÞpüè ùR¥ù8õÿÃ> »FUs×ÁÕ½½Eæ—}£ø:àtòÿä2“›÷UF€h"c ®¬» X³'ŒŸÌeó ªªâÆoäý{Dh¿ÓG:v©†tR!6ŠÜ3÷?ƒƒƒXóé0~0Tv½4DôCÇOà—Ÿý,ŸªÅˆýöù¨‰³À¿ÿ»u[í,à~øâ¿X4ùÞ¼yú7¾ñ ,Y²¯¿þº €Þ÷úëh™7Oýõ×]¯¿þºëãóæé× AÂS¸ì²ÕøõsÏáJW áÙyóèXL½ð ½ÿÉGðæê‡Q‡^_D mø ÉyË–-ãË4ÿÓÙÙ‰T*yÞ|_<Îæº=FFFÐÛÛ‹¨áï§Dö|R9ïA}=O^¾›‹²A‘Ød=®˜ÇÞ”¤‚ÚÚ%|Ÿ¿ŽÙ{)°~¨·‘ÍC—Ÿµô{MýC=„/|á e‘ÿ¯»¢1kßuÆÿ/ž¶ŠÎs¶5݂ق#ÑŸú±Å¼ÅŒ?o‰§p‡aß¡ih„³€@·¦aËQ{QEUTQEUTQEUTQEUüס(Qá«I#²QBSGš“Șã•gþ€ÁN Q¿ˆHB-Ùá~Û¶mxø›×r§cðÿ¥ üuphooDzeËpðàANü0’KwFv:¯>Mãÿ昌‚ÀIJ V NÛù0CþgEŒŒÀ·û^†ÛŸ!WÌ1Ž9›©†óšŽð=Š"9T䊢úì³ÏbxxØâoJ@IGR+¹&ÔF…Bp†_W(ˆâEy2è<¨.˜e¨PT0UU‘ªwô!§Àr`vz´ß?"â°ëÈ®÷MMMY“ÄåB=úäÛìý ŸB$b´'pø”Q&HhkŸO@2)@Æqðg´ï¬º’ æˆSJRá“Á€3ìQ7³>pRÐvŠ÷“ºòD4C‰Ì1_–oÖ“±ŸdôS ˲~À ç Âþ-3©ÚÿÁPNSÆ|>¢(ZÈÿäˆãºü>üã­mDüdrÊ.ô<¶$TlJ§q™Q–¸ú§HD5ã>^òy˜Ö÷gÑ¢E$ ét:oùd{utt »»›“3htODýð6Èp>óM"§(AÈuönLMMAÓ4,Z´(¯}GQørÙ<---\he||µµµçuÑDüÇܹs-u´˜Éÿv¬_¿—_~yÅíî\(öÛP‰( fò¿6ÁX’I`xx Œ,¶æÓaàW^¾?"!äKÛú ¹qò¦ù€5lù:ŒÎåùOǯÌÜïóŸbÿ¿ÿ[þý•à2HH@õ–þ|îÿú|à/GÐ|Íù:Üôý7,ëfØ÷Ýÿõ9¸éûG¸@®÷ÏLŽ$D€‹ `vÆÑœ°`¶À¿óáÓÖ}ùŽ7ÈÿŽçC‘{ÝþL[i^÷Ê^ÄeÀÙî Ëv÷1‹”‹Ø¶¾Ì¢äŠº­ƒ͈|Ñþh4Rdå€úH:‹o>Äú»¿G,Ä"÷SLú×GY"ÝhÚå´œeß–C>$´&ç˜CbGGÅÒ¥KÑÒÒ‚'§´Œ8€‘¾Óo´éÓ !ØûAvttt@E‹Àú §?VXü"W™é4È]²#Î »Ç¾^@S*&ðœK !!I€Aô€º´µÎ¤ˆž›Ê¾O—é^Å×MzoÌ¢´Íãaã­###ÜñÒü6D7²Ž§1EQrÞ›ÐÎËž0þ×ܽf‘‚| _r1’‡3‚pÍÓ*‰”,Bsøða‹¨–Ý™‘ìðöövtuuÁ_§A6îMÛí ˆýˆÙ€²ÇYv!™Ô!Ë.DáF(ž*JŒˆ`w"˜ûB•÷PŸ¼>3~XÈù8ñÛ_Ç*íí휴¸fÍ<ñ{jn·‹/ÆØØ/^ÌIð”9âÝ—DT⚆Ç>‚ÝI­±´mÒÙ¶M'ëaß¶VdÌc}„Ûb:bI/>Šœ½†õ 1Ú6à¬Rø6‚ ÛÉþZ“ÑgýoÓŠ%X—û»`³;r8| R§Íct¥‘sîyîvÖï ›æž¹à³ ¹æõ&¢S˜åÕ-äl¨ Í5 d¾=Ô×ÙkÊ+õ3ÒB(…~ðúcÎ{":…ZÁ“"] ‚`!ÿ“ÍÑßßïX¾92²½üP?¼^/FGGQWWgÉÛ Nç¬'vA$ºÖ¯˜Ò˜£++ŠÂÈÿF5qÕeluˆ`dýS¥|hÜ‹Ú3ùŸWººº¯ßL>Ϻþ®.ƒAn§™ó6l~ýf;]‹=àÖw€­'qï=ïãvº(Šzg ÷nÒ9ùy 2"[Ô/ íÐÙãB¿U—¥d˜ÉÿvHI¶‘ú‚|œ4ÁÁK\%Ò>E=^±bÚÛÛa&óÓý^±b€Ì\-ÓºYÀ)¿Bç"‚ $ ÑSXHà€ÆšFNÄ’‡ @@£ð5 i?@#˜P€ €Kݧ|¨iÅŠHDýX±b–,Y3™?õcÎUWá‡Ë~ïE^ìß¿{>ÍHÊÊ« öÌ pʯØg¢iš«]ô.cìà·CÀ3‰0¾o®ûö à[\÷íÇ[7܀ߺ€ÕL— í9Ær•UÌøs `“¦YˆÿKŒ²ìùÑr9Äú™ÇsÍß9 ›ü±$à¶é|$>ó1¼Ø”Bðù¥ˆ_1=òÿ &²£æýÓð…8‰ŸÏßðk‰Z/ŽÈД޾ßéz¨œbÎ'v¯aë¾ösD>ô9D_ÛËßyH.@äÿþ²À ý!Áò~å+‡l5¯×k£VU•ûý‘FGGÑÔÔÄûØä#B‚O¸XtCCR©FFF¸8‰Éuttp[ Xÿ3HˆféÒ¥\àãèÑ£üÞþieÂ1¯çòQ8ôƒàÜdJ,o[&B÷ÎI™Òæ:]Wt"û'½ôí8uj {óžûtãÔ©-¬ê”ïtCþË—¹(@.»Ýiöm ų۵Ç}§° y`ã¥Ó!€Ù÷žò={ØÜ‰ªªÜÆ€[l ££CwÈGþ·×³™È÷Ýèî 0­x™Û„ÛS²Ýÿ˜øüê¹ùEmÂéKpœiÁLþ·¡'$&%ne3†Kœ.ð§ˆßÖÅ?• ª*6lØÀElhh€!$8íóÐ4Íõ°!`ö{£þ部ªŠÛ[Ù·h:"pé‚ãÐñ¨ÅìœG~³µ³VaâlvÚO\eDš7Ä&ί¼ÂÈÿ¥à–[nÁ÷¾÷=˶/¿þ:þ·I`§ è5 µµµX6ûp¢6€17¸çäÇÍ›7Oÿ§~•ðÂ,,¹ø:ôÆ®d¢bypð «s’$éf‚ÿW¾òœøåH&Ùœhûâv‹à(Šhmm…(ŠðGºÐÚÚ Ø±cÚÛÛ¡ª*vìØQt}8yò¤ ó®¯9 ì|àoÿ;þH"‹ÌR,ò;Ý»ÁDÖE$ìžåJ_ù*_܆†\~ùå2J¥$¾@äîg"ÿ‡]ᢣ ç‰DØ£™·óó—}8N»6lØ ‘‡@ùf2¾Æ$ƒ¸³³þŽ„Ó5œˆ?(Mf¢’ƒq(¼âéø¥Âup:å5¥kà5ÊŒju £Y¤”ÒþÎèì¼æNœ$@çkÞ^º9½@,Ö%™MaÒä“ß/A–C¾ýM4oÂ5hv #§v®ÇȾ$š#“e‘‘¯>ðÿ±(=o£Wý~¸žÕ¥ØØëxðÁóÀòØ#û}< i¹õ?Wô÷Y^ÇÂc¸-Èž/[ŽqŠþ€%óDäO ‡O"‘ øD|dã åþÇãL|Μ9œ8Fxã7x4Y»R?ƒÓäw(žÒ£~7Gä:§H$ó^tlì@8| ¡Ï£Ð9˜Éÿcÿz'j=ÀEç°¶h8©à%0gÜÎÎÑÑѰ¦q'5¡oÔÐ"°HA‡^IãÒ2&‹9w{½7;Aø|âñtÙü’$é>Ÿì; #0íh|&`‰„f¼w ËÇáó N!ù£‹áT¯rÿ 3çˆQŒÇËDɤµ×˜t6®ø¹Ë S«§´‹7áXxŒ/׆ØDMÆþÁ6YDQŸ~Ú{¢$AÓ4Ã‰ìæ‚0ˆ ŸLj®~¡_œaõ.úǽ kù{x+ œ§ljÆ»ðk?çy)§ŸÎSÐ^¿‘÷•FÞùÏÁî@`"b6„ît›ÒiôH|†?ˆ(ŠØds"‚€„Aþ6¢ÈsA‹r@¤ÁÁAüÕïÇÿ0ˆþÜ ÈFþ'û£œ p³í“t³ ¸ˆáõÚó††Ë+Eÿîêꂯ&Ç»Ë,b56´·ßU’@xç«|9´š±ìíõoËo?€¥‹lÌØ+DúÀ#Y99rØLÖ÷„¢%ÒµïK3g;ƒìOäÂèÛÌAcãbÉò¬™HUiÏÞnûMòî”DÌÑÒˆLäüŸDr¡Øö0ìƒðOdo8à?“Æw‰b(½9Ï\å›ÓK&v"Z;[ á°çyI¢_´><Ì÷„ááa~½wàõ°(i¢(æ%kK’¤···Ó3Ò)Ÿ´‰ì700PÔyÐ5LG€œ/ˆüOï½SùÔgذaZ[[qðàAîÄ.Šb–Ãy¡réXrÞÀ£R;«$¤~ƾS±m=Ü)În‹ÚòιœðóÙ<Û¶=ˆÍ›7£¶¶–_WW—žœ˜˜àÆö’Ñé\Q“Ÿz ?p¯C3>>>ž%`¶¿)^©öwF8%Cг¿S׸¡Û~œù:Ju66Gn¤gnކèõdHa„,"€-Ë’è>(#ú«âá4¼^Àíw¶CÉéå$æ[Ö9‰'»é?sBFDźO…†ß_É–ŸÖ°À¸ òÜMÓ\ý¨×ßš…#²Éÿ´LÛÿðk«ƒ¥xô-Üx7}ÿ ô£>o¹AЉ`i&ZâeįA–_ˆ‘ÿpª¯áxîãé?×y¤Ói—ÛÏDŽ"Cþ7·ƒJRACC:::ðÀàÆ­ä+{1É%;â™E·$IÒ›:Òˆ­­C(”Тuh›¥ ¶ˆ‡ƒÜi½”²€ ƒ®áúfEÈ0Éü_ œú¼‚ è!{ñíiœw[fŸS<8³†8§¾P\E oð³a‚ÏÿGÉ$zš¦¹Dߨñküù⿦݃¶ÅWg]G©h…Ï#K+]Ùzõñ(ÄuÌð7;„>çRЪgDJ)S’$=•®AŒ5ýxÎ¥`ãb‰Ûž€5Ê#=z»ÄÅÆÅvŽ¥±s,ç öåSÊù¼—A_s÷> yÿÑg^Àý¡+DäÛo‡yß5+/Æ(®-¢öÈÿDºyì±Ç066†±±1lÞ¼jBC¬Çƒ×žk&ú{V1ÅÛÚ˜ ‘L꜔Nû⣅ÉI’$é!_›6÷@NrÀÆgè÷ìÙ÷§~†ûó„|i„ã‚n®Ÿ”g®ºÀ… çKŠÖ!™Ô‘LêÅS8|øî»ï>Œýk&—™è¾hÑ"¤R)¬[ÇaÇÆÆ°f ‹ƒµhÑ".š`¿~§þGcJÀqB3¶÷ÚÜ΂ 3¢ÌHF|!È &°ˆ.,jµ=:$•ÍÉÿ^à]ÐêT@9 (Lœððáøï¾ûpç +zýN° Ÿxd$¢€/Ô›%DÜÛÛ›å(ë$œ2P_ƎĤd4‹Ö _€÷í߄Ĥ„Oš²™ Û/ˆðïÎú ÞøÃ¯0çŸÆùO1u0Éü_8ùßçãö¼p%š¾ó >ñÍGÑüÝk0@³Äú~!OÓ4>.”(P‰‚v?E•[ûÆÚ^B«ü#{½X¼IA¬ÇƒVùO/Š£˜ˆNaV[¦CÒ&+–åXÒ‹X›ŽVùÆÚ€¶M'qVqñcD1·8kçÈþfÌÝnˆ"Ûf…•ÆOAÓVšRTŽìo†=:LÝÆÆÌsÏS·iØ6DbÙsÏãe`BÆD@ô6È2ô½§µ¶È, °œDZLs‘4Ç• v!Ç|åSû—«üPÜ+0E>ä °™ï?‘ÿç΋©©)|QÓMÃîÝ»™ Chœ4‘ ÌDÿZ¶oÈm"4“­^ hª!éÜþ;ÍÉäº~áÊyýb‡NQŒ€ÿù“H|æcˆ‡}Øäüƒ"èñ°K" „û*f}"‚Ô,üeÆÙß~K6^D„Å,Û«ÐxXVݧáO[Ÿ‡ú€ \,™È’¥€HþäKaßn&ûA~Ä]wÝeµ7 _ ÈuÍ@ä/Ú  †@ MÓ õï—ÑÆg‡þš‹àDMÓ (>ضFákF!À„w‚‰V˜ž‰™äo†y;Ÿˆ#€B“!`­‰ò´Dö÷…â ¾,î ‰õP`¨› ŠºKö²× P³ñLýAàHF@„h™k2Bý •=çÜÕÕ•õý7ûãa6†BónâêŸò~àèè(R©âaŸ%mmm-öìÙƒ«®º*oÙ…üh¹»»›÷r ¡lذ!çøýí·¿+fb­Ûíæ~Mæþá¡ü϶µÁÛÖ†—áblürYÆÆ6/”X ׯb¸ÝÈçÒ¯}­`ÿ_þË—‘ü5#è@ò× ù2¬Z&ˆ¢·7äØ÷Z¸ÐÚvPÔ/±çW^@3Âq6& 0Ÿ¸œé*ä÷'lÏ«å¹ÀÁÕó9g#´2›DþøOLþØÔ¯ßí®ÿǼÆÉÿs6*.ÿ;ßù_>zôhhëi§Ù»øÙÑ£ø"Ø\ç p¬íΫ!MMMxå•WløÎÑ£¸@€ßÅw`>»3ôÞ³o¿>t^ïz+p¥=ÿ¿zbmȱk×.ÈìÌÌ .ºè"d°\Mž›Žù!Öwað›ƒHçØ»¡ùVñ]Õ{S$pú§°êµ¯àÊ+¯ÄC=„sŸqmÐ+¯¼À¹˜=ýk˜¬‰üOvÀüĹ9á°{© ðÅ;øE ¢ªØú `÷M/b­ ¬ÙºÚ~ñÅôù&''ÑÒÒÂǺ®£¥¥%P`¢$ð—µñ$]þ±F¹ò…ýÏÿnÿàe¡{‰þM`‘³4:2ÀDàüw“eá5ŒꨣŽ:ꨣŽ:ꨣŽ:ꨣŽÿ=QVÀ%1OC6C¼?‡ö>½,À!ÜÁœÊ£ýŠ'ðÉQb¶Å ÎrÎÀJTA"², ÎO—è@á٤ᑪM4RÈŽ?ø4ád Õõ®¼öÛxl²LýÇoUˆâ'>éZj4xŠÝ)?j±€ýþü,´&&&¸a(&B/äÉþ»ví ÌöR­ƒKœ¼ì²Ël€ás ëÅi‰|> …f" ª EdÙ”+/O$AQY¢m#ð¸2WE}ø­-I.áß}«ø¥ÞA¥  7åQ$ú%ìožƒlÖ@:}'cý¯ßÁHr%¶dd"ÿ–ŠŒ<4½€ÛF‰Zûöíód¨0 #Ù]ÿéoÛ¶ –e!Ádr¹99§mkI5ñ}h±*5}/²,Ûâ1\!…( )øD|*5 ÿ³üèG¢«©@+¾¸ÏBó?übü}øAÓå{3V[|Ò=™|ƒŽqb:]‹ïwÁ‚&&&011¿ø2 Ö^þsF,Êf&%úÑU1æLHÐÉ‘ÿ …# ?óÙ¬QQ œø_Jà§– ^úÞEá‚ ­­­[–„¦Äm´Okk«‡|ÿøÌ :;Ëgž'Ù_´egff8©¿’ëóÇ×Ã0x€‹¿|ò?eYX ø‰ÿþl†¬ –áÉØGãããü=Örm~›p3"­ 444ðß+VðÀ fáÏ|Jä]ÈNb~Ñ#j >Z=k!X–ºD’lÊú'¢±»p"£3–""wÐØ*-ûlll Ù¤;'Ü îä;X¨=ôâÕïÙœø?gbg¿¾ØKî'b‘€ï¿÷<ÏÀ• ,@Fí(Cþyôul¹â½žýÅÿé¸O^L(à{_:Ÿüú‹eEà<¸¤Êýa 8âüÇã'áX”FÇ›-´M¹„þx³'Á7ÆqÖf‹OZÎ+U°ḂDl5.Ëyýiº¦;þ¬1´¶¶âÚk¯uÿQœp8ŒB¡Àש>UŠ Ì[jTNCÚ0Ua¥½,”¡*´(û@ýB9•"Ú'îÈã_;üƒó±oƒÇ ‰ŒÜ£)¬qp³Œ:û›Bã°PË:Qè‰"|M Ù»  › úƒ{Fþ§„žŽ3BsüeTûŒÈöˆF Nüg™5K@V«ÁÝÐ(n Ý˜óñ4Â1»2žÊÁ4M–5¤ãB0Ê…!F¾œ Ý*î¹iPQ3˜UÎY&ÐþWVõW„eY¡ááa[UÝw‰D<ý)Àù"N–ûææfO€&m úÞú-Ë ¼i½}0èÏo<ƒôÓn¿¸H.ú8Q'.ùÑg_ÀÁ›Öóÿ®¸ð¤Ÿ6i{YR ÿ—tC™ÛEäuÑ( iàhÓ5èííEb`i„ÑuC+†¾9†ë»TNü¬º®sû£JÈÿ„h´ƒ»º¦)qb¹|L~_“B{{;Ò££eÖ644àË_þ2Z[[ÉföŒ=ý—Yï´5šhÔ{©ãããŽß{'¦ÿeâÍzzz°k×.lذĦM›8ñ½±±÷Þ{/?¾ù2€쇒–…X‚ κ-¤œëW£yèZÚpÑN6þV×wós'²¤$ WÌ[8K(½ˆøFþÀˆÿª7cÝÿÎرãLXÖKvÿ®3üDF}Œ½FŽòŽ)ÄL¡â±É˜ÌûÎJ|Ôÿ‘_‹Î#¶£´Ol¥ÁÉÿ$è¹^çÕÌÁ¼§¡ 9gÌ#Úx*ܶ޶;ç³kû‰`¾(Ø¿ûµë{!1€w¾g ´„.œþ=àÙ¦G°Ec¹´…XBåÏÿÿ¾[”-øÁ~€ééi k®Ã5:ÕX -†»S…=ä<®é®—ñ~‡ü?=¸ MŽð‘ÿ—©6ä˜Ó P04ΜsE˜ø ªÏB트¬:”o-Ë Iw1{ F‰|Þ!ûKŽÀŠ»˜í³”AÝþo¾/ùÿí…˜–篷¸«À—WÜ%!-ËsÏ´NãèRX¦Úǘ»¢z¢í¦¶F¡ie[ÁT6.g"°U’˜/nLóÐé]=¬_“â>D’$attæãéËÏd2èèèðo24]Aù$¨*”í!þîß²,À&'ÍÀ~ìGÛ\TU…>ªÃj·jfvùþð~—øßØ‚¿>ˆü‡Ñ××WÑýÓü¿è_£€…ï¿/pn,ÈǦk:'–pRé•9|èžGqÎg>PtÂ#÷ü ?½ò >‹x*¯û>Á3{ P4…ýˆp6 ‹`ÄY˜¦‰\:¾`ÂŽ;B;wî´I´ÔOø_·n*%?ŠÙ€Å}Ø8¥˜üï'þ€êÌT«9zÌ;sþf÷2dð} ã¯Ð¦µ!½2ľ6oÞŒ6éfì·nƒˆÿ€œ{}®˜CtDžv ÿìþcNýjÿO÷Û9tè|ä_—e™gd/>O---5‰ãÀµo1bÿ“óžuÿ†\ŠKVH }ÓTânKüo©ð<•B’$»³³“·m°g, aú,{¨xìíÄ*Eþÿ_Ñ(þ@Óøohßs2¹V’$Û)§ìý³1#þ©ŸHÿÑî!@Ú̶ E=ÿû„<Äñ\ÚÂÚDeuCשÿÙÕ˜yí>̼÷>àõ4H½ïj´¿œ~ÀlÚ¯Öw~÷Ýw/Øö‹ó@$$Fã?~Ý$`Ðã‚###èïª¸ì²Ë}áåâ ÉÇP;$„ÒÒÒ"’ÀËú<$Iâ~‡H$I’¸pcm §§Ç>|Ûm€?Ð4¼¯ éHHS$¾í6O—ßv[E"~h?výJÏL°ó]õ & âÌ3w#úg¯à “\<®ZÇÀ¹¶§–Ï#Þ O;o¶x\œÇO%Ç—J feß}ܲ•$ÏöJaYV¨¯¯Ï‰ö’$Ùb¬þéÞMÓ¤x8ÏÿåˆýºÏM*Š ”kûûúú<‰E„cyÜMÚÆ-äAIBwÞB¸Š)à…ÆÿSlúŸ‹ˆH[ÍXb¾J P;Rˆü?wÄY_ãY÷Û_1>F¿%QTH„WÅÞð‘¤{œƒ_ÛïIp°±OÓýŠG@?°ñ”:ÇR²¬655…ÆÆFP¹,ËH$ÚpÕ'X[¾á#I~ïÕˆMþöÖ "ô()¸äÿ¯GT|)_Ý»ÿô§?[o½5ð¿Ï=ŠíÎò?øâ~ö|ÏÜï}Îgžy&n˜àäÿW]…³;CðúK? ­8çöüÐ×bíVfff`9>ÆÞ^ìÛ·ñ”‚DÌ@4 <¾Ölt¯gþ š>°c¶íÜÉû¸mÛ¶A–e<ð¹Ï¡÷[ßÂÀÀ@Uí W ˜=?[‡ð/â\|`ölÌžŽšÈÿ"tMGnŽù®x_aÁt¢í,Ù[ÎÎ&c°Kõw¿û¶~ƒ%⨆üOcà––`Ë–Š®Y×¹xDzÑÐÑQvÞ»Zÿ³àgáeg>rû”„;- —8Fþ'â˜`¡Nþ¯£Ž:ꨣŽ:ꨣŽ:ꨣŽÿ^(+à‡ß‘Ú1`A¢­Þ}üÄ@QH Ç©)† IDATÜD´,˘*74}l'8ÑÖ/°};sÍù_Ì\[+$'+²OQªf0aþtG™ R££HÀ(¼vqþºîxJr,Ð5'dpÌNIfù2e1Ø$E*ø3ºV1øŠHËb\¿(΀+*fW}e`YVh``ÀÞŸn†ùäÇ€9ÌŽÿz¦3(U ß$ ×J[ÍÐ'<uT†i’zff†–ôõõ¡ÝX‰.qg?Ú@»±£Jùɨ¤±²âòöìÙãQáUæçx€ ˆBÕÑù?ס#–a"lýHú0à5ý7À 'Ó㈜$Ü×ÿ#¼¿^0ðÐë…(^…¦\Ê­çcšŽÖ¨Š‘äJî0%*#--žŒì‡¨®K"þe ˜°U ĺkš&ŸÔ¼™Q+ Æô‹$4šøŠ÷õñ ’q2»Ü5$“oð€­XŒˆö,Û¼ûì,8p\`ff™LÆyF'chz¯“‘péL¾x-þ§gAÂÛbÈzt,M|ʲŒÛäq®i"‘a³²,c»“}pñ…j¯Í4MøHϜ„24v •Á@úÉßàèÃlÙOüë3¡É—î[éÜî·çÝ^ ’$Ùá0FM“YÓĽiš0sÍcSü;£ç¤i6~¿s';‰#˜pÞs,èïwÏhbâ Šà'ÿß?<‹ÉÁ/CÛo Û÷ÏrB|%÷êG`pØIN Ó[ÀèY)'óÆ…Ðßzêr|#Ë,#'ÿŸ” p+U®;1û4ÏOïš½öž)“û ¢àN‡xCÄ€‘ÿIƒDˆÙ¤+bT (ø”ˆÛDúO>RÀç“?ãÛDûCüv(y-##ûja )%e̾¤^‘ü¿}ûv. R üXÄCy$ú%—¼Ës\ò¡_bðNÀÈ‚¹Ïhõ«.ñgüÃCìýž’ Î@»Ð3zÖù’¯üc}ÎûÚFE ’ˆð,å¥@õP–eô÷÷C×uô¥r¼íy<öFT1™œÀúEª'ãããòÿø8 â÷“ºªÅˆl`eÌ>šÖ^ÀovíÚ…6‡óàW?ÊIË$ñò¸Žé<ÐÛ»³âŒð@pfP"_Ó²ªªœh]Ëä.‰mPP¹Ht߸q#6nÜÈ ú@i’>ý’(Ò¦<>S:sÁ0ŒÐÈÈH‘½$Ž7*½ñA â6@™™™Á¾}û ˲§ü‘‘‘"òÿÄÄD è@8¦¬§5eǯ›Èþ²,{–MÓäuŸÈÿø/‰,Ô¶Qà‰PˆB´L¿"Ž;VQæ;1Kaã=Ï–Õ"Â;{Gâ2Áˆœ4óvà’Þ ï‹…ZŠüÿ^ÃÀ·Ä˜7_w*Öûít#žª,óµeY¡3$É6Uï}¬úÞ,#ñ;B9æÜór`<~š0ëPþúbàŒålŸW/¶ŠÆã'a«€€ d€cûI/râ?ÀÈýk5h;#ö³í#VLþaË/.tûÏÜ–9çˆð»œÙÇ* j³úÑ<~šºÁAà2¬bP’Tt¼(Ž´²É4½hÑç&Cþ,“AAô«‘ˆ±°R"NßPqÛÓÕÓ͉–b6@Óa»œR„DUDµaØ=ŒIDz^J•Oäÿñ‡O š‹â•3òXvc„×o"þ—ÃÎÆk€Æk°Çسà¾~H’dHr¢q.‡¦ #íôÜ{<¥ ÐgxrÞBó»Ü€Ô~Ež¡®éž÷–ÈÿüO{¸çŽw&~?tÄ#´16“™/Jvíq€‰$°s'šÞ‹/b=ÿÿ©o}}}}UÙwClvŸW*.ÔïÏ zšÎ)°,+Ôïüßg¸0œg«Ül\åÚ~Ö·¬,ù_ÖÈ€×Jd ÓäÄŽZl}˲Bº®óû#¢¿Ÿ¼OöãÔÔ  }óù<š››¹6<< jӲ͂l¼ `Äþjqð¦õ\àŠ Ï¾ñ Þ´¾ˆ”räÈ~ Ù/kÖ¬Á®]»<äòGETGðO‹ -1¿@]7´zˆÿ@åä1T:§8öÍå[<×éG{{;¥E¡P€®ëì;É2’¦ŸüO¾dÀ ¼”/¹éxØ|IöÙTø‰|ØçP¥þzÆ â;PžüNÿo+Höþ5ŒüßíΤâV‘"ÀÆ[]70;¨ë†Vt}(‰Ê:AŸþ:&I’ý«·_!â?#>í!ÿ“œxÿç¯ù ž;òá%½QŒÎ?— ’€Ą̈ñTŽõ‚Ð*ë?W%…<÷&š¦ YV<€T‘©×JBˆ­dåýDG‘íwçwbûöí4®áïµÛ¯ü"ï|ÏÞÃÆ›^ô®zúš¢c¼èÄÇß_k‘¼óO"˜0*3Ÿ×~À22ÎÍÍñvɲ܂øh ÉP’‘ÿ$CI¤”`FvJB6SŒØ¯Ï:äÿ³]Çô ë7uÏ2òÎrIüBš\NþpBg¯cºëetuÏò}e™µÊï‡4ÊŽ9¡‡Ð`„«Ýz[Ç7"\ñŒ[ I7âÜsÿO>ü;ÿ^ 7;æÒA’$Ûj·€)øìˆèÀ–Sq éœ8÷Lp**›Û¾‘\×t~lìzÓ4ýr\8Km2{P ¦/uùd£ÔR>‘m DlÆæÍ›=äšã²Éüšcxà\b¨ÙKü‚Éÿ‹½š©õù“ðí;ºÖàž;€Ï<òs È&V!çÔ§¡]®óÓ¯]Ÿ*ÅþÎIE¾v¿n€õ%$F@ÄðÂIÈ›%™¨~‘ÿ 3püÀj²À‡¢ (0b4ï_[_C"<ÆíÛ·ó¬Ôë֭î]»pê©§r"äñãDZnÝ:¾ÏöíÛ=IÚ^ŠüŸîp¿K"þ'21¤W¦=äªïtØ_ûYl‚¿¿ ßS›t³‡ø‰¹ÒÊI`Sñþpò¿úG*¾ø£/âÀG@ÿ¥{~Ó4ÑÒÒ‚x*ç¹"ÕBþajÈÜŒæw—8~–'çáÿÕ·X}9cùÒ“{‚ìÆI¸ÄÿIÝ–…Aw®æ¿Œ\DBp¹€±7}o ½-Ë muÿDÚ_ iЇ† vu•ÜÇ/àœÁç#>k"öû¡k:Ìá<ä.o›VJ€Ã¥ÊjWER?]Ó_üãiÐ?—ÄèY)Œž•‚JóŽ‹€H,-×öS Å!‘- -¬ñþI$ÿ— óÇÿ˜ŽoÄL( pȉªªÜG@äoÿ·ãˆ¨Ø–e…‚ü…Bñ8 ?è|4„„ð½I’dŸ{óÍn!’d2ØmYP»ºð\W^èêÂ9™Œ§Ï …Ômëv8ìΣh?¾“/¿ñÆv¾Lä~œàKÛßxc;þEÇ|ò\ @ܧPA(¤–·6üÇG*Æ¿QYìø+IË |÷IËâI,Ë ‘ˆD-í!íýbEDøõô8"lÌYJ@¬{4¯"ú`,Ë mݺÕE&ÄòÒa ª3DˆÓa ‰‚ÄDÊ„\VB/7þ'AQxrÚµ¿®lR’ç@NczÿCR„$I¶µì:¶R‚üWçcÅö—±Lœw¡*ƒHà‘è¥.aÜ'ƒ'¿Ò¬æ~! X †a„FGGmjSÅø£B¡À¯ñàR)à›w³Fò3Uâ÷öãØ  a ò–­/xÏ›.ùÿåw߯áþ¾óïmÛûùÏãòÿñ?øúN; ?;z”‰8Û~¸ò4|tî(Ο˜@àäÿçO; G|Ðs¯ó/ükhÅ9°ç_øWÏvÓ4‘Ïç!Iòù<›‹w„Þ"‘:;;122‚tNA6jàæ¶ â)Ý7ßÇ;ð±o›¯ïùìg±ap÷Ÿâü.fOÿV½öϳ§ ˜ý.6L|wQä?Dج8æRLüª¿"òÿä$“¶¢~>Aq$ƒ! u9p]™2kñ?ÓÙ'€`ÿ³ó{)¼Ä Nþ¯£Ž:ꨣŽ:ꨣŽ:ꨣŽÿŽ()àÏþ FUW…×Gú§m¿\g{5ø I(Ê>H„?"cˆ™¶oߎlÒp“k€2—->#˜?w“˜ûßѲQ5HŽ2¶÷ Û0’$È â?{Yçâ¼ËÞcù3Èy'O‚‹fQ\(.¹ü"U]D ´%¦`>ådï¶DuYî*Áe—]†DŒe.N+¹ÓM#Øû¢ÅŒð€K¸o7VòuçðC’$;g5Csþ­¦¼  ô£ ›@iw„è<¢0Àb˨8¢fägÝÅ¿û&Ñ5,DþaF(u¥b'Û[‘“-¤¸Ð¬U4!DíÃX™ö¥V2rÄ,PþÌzDÄAßP¹Ig\ãÏ|üøqN0õg™ÜsB6C8žC!kà%pòM÷, &ä|Á‹b&6 T ˲Bþìô†a„R)Å6ÍË.™( îˆø¯ð~¦iâ;œf?ÞúF ­;K^ƒ$IöÀÀz{wBÿ—Š£w¿g#œÜix¬­œ¾Á!;TJüQɵ’ÿ¤R'#;Ñ諈FTª|<Ç3§ðE‘ø/î"ö?¢†»ì=e-õ-S(@–e7sG.Ç&Jrnï[xh3ð[ D‘cSHÇYFÂGmà §Ôü3ÚSUOzùŸHýÄy:–žç"ãñ“œýfÑÐÐ \Š~Žµá£¼½jÿOö˃mNÒ¡¿¤—?|è ò9ˆÁïð™Ü8‹ÜŸÿ ³©4™gqOd ü}ÀUÂyÄ:î¼gø˜x@¥I¸–eqr#·?þ< $ÆÉÿdPÙ£££v{{{Y²i¥ˆ¢H†“HÙ,†šÚÇ{ ÇŽãä 2« ÷dûŠ0²“x(ýäo¸@Ç€ýYïþ]=ÝÈ&YЗ,ËÈ©]ÀS, ¢óߎìEÁäÿ…`š&z€£–† 64`ì.fµ^E€^º§¯Kd vN&ÊhÈ–X…?¶lÙ‚|>‘‘PPÈ®„3Ùä*Ípf¼çå·…ˆðLäÿ'žx,}9VPÿNÁ6MéxmÙÆU—ø¿Ö!³22ˆW”pÉÿ‹ÄC“Ë"Ùš–iº–ìÂ"ÄÀEQìN´ûyqÀÓîÙ°iEɬ`_Euμ¸­Öë((X ˆüOŠT¾Ÿü$üጯ4 ³#tce|§:&¶5"$6¹µk×rá ú}â‰'ʶ…$®V‰ÍC÷ÕÐÐÀ$æççy} z³Q+Ê>å¶«‚Ž]4 .æ#Þýã/ES`Âĺ‰Ëë¸ ñÑXÕý2Ù‚â5[–ºD’ì'ç-œg«HCG* ¨¢–oÐOüXVéææfŒŽŽâu…eÿ ¤KðYb‰26^$I²¥çX~GH¯¾åø}±³ãro0ø¯/FÉÌœ9&q€÷<å Ó]«Šp`YV(ƒÕ¶HÚ'"?LöBÆZͯsäÑ×qâO#üüåŽ;,“gÒ²€åîö¤C¼œÊÏ¢/² º> ³È¥Ç4 ª3ò~ÙÇo•$ì®Àq³™Èg@"|®q7e!÷‹G,C»‘Ê™P  ›48)´è,â)x©GÌ>€©iZ(zcÔ¦ž2ÿê Dá%þy"Ú;/؉p8ÌÇÉÇŽÃøø8î¹çžšHþv”îAÓ†y ©ßïð¬íúI‰öIdM·Ýs‚¶²­‚ H ×GI’lÓ4¡F™!åøÒ2 f®ÉìÂ~¯jû?Ã08‘_¼' #pAß±àï’ÿ¯l*ï{e2¦FØs.EQìnÃࢫçY–g¬AÂD‘e¹æ,obÛ&’÷׿Bý]ss3æçç‹ÆÞâ:÷wvvò Y_>A’$›ÿ>ûÿ%âÿÁ›˜¨Cúi“o÷‰®aËoZ óÀÎñoZ﹎[n¹…ÿ®Y³GŽÁÁƒqùå^Çýéfäu&¸w´é4‚ÙI½½½H8~©ë»TDÖG‹ÈÿÑHÙ©òí‘$I¶,˼Ÿ‹§r\ЄšÏ™™™¢ŒÎ½½½Ü6š˜˜Àèè(Ÿ{дat÷ "™M”¬ƒú»ÖŸþ´ò%÷ãÈ‘#xøïþ¼È·¼{÷nŒcbbÓÿ²VYf\µÐãˆmÚ´©(ë=P>ƒi)X–j+0[b‚ç‡YÆS@@7ëŸ(@”‘ÿÝgŸ­ èóܧ> 8|ñ·qJFÆ‘#Gpúé&¤)§m”ŠïÇŽ3œéˆÜ±¤÷ïOäÿ.<àˆû2‚Š#YÙ;†«¸`âÜ3WlòAPFd" ¶··ózY‹,ù[[áÉ* ÐöÛ¾};'ŠÐ=ÆìûY ëK½í<$'n<„iíe4uϺŠiíeÄÇß¿h’#Èûò¨ŒX‚ Ȳ̉ÿÛ¶mól"þˆú1‰LŒÙ_?\Tÿ,kè::þ mZÚBmHÙ)¤W¦‘Ø—63Û\EWùt?àuAgÒý·´´xü{‰¹°Ž‘?õ ˜àrzeø%™Ì ¥¥…ßKKË’ô‰–e…ÎÌÜlŽèÜr' ²#DI⯾eáŒEúýû”n§¾¶À­ó´L"‹õ?®·”&àÍ!1ÜDVø«{[–:'“!NÞÿ_Qæ øMÃvwãU¡Ï'ò¿¸O)TCþ…­T•=z]ñe@(ÊÉÿâ>ZNd2¡¬R°,+KdítܵщüOëÏ®žÀo´¯àK׃Ýg!ŸCê}W³?ß\œašfɶß4MÄ-‹'\ܸ?˜´,$²È9“Ç< ž­{Û¶mñ~_?–pç¬Äx ]׳Àoݺ---¼ 8tè?–ÚÀÛöÓsÓuÝ&áž={p饗BçÑu»víÂ9==€0¦“$É&‘+¶ ™ ‰Ðº(P(ŒðmÉ$[~fBóˆœ|²W0€Ž)u.*3ðb”râ’NWêËJ’,éB¹"ª‚$IvÜy_)I*ùîã–…¸e!+I5û¡–³±x*ÀY¤"¿øKËô*n!íD,‘…(¨ìŸ[¡¶]ìÓw3ÑךpM‡-$úúÐßßïlgÇQŒnË*"ÿJºóÉ#f~ø—˜ ± ø©]Qûð°ÀÔo¼bUÒÇ4>^ç‚ø¨AÂOü€¹ °íéœÂ£ö.6îW”¹€•ñ ÃáG©¢1œx¼÷}Z’D29‚ÏêÞÿVÛO4,c¿çžáŠøÉÿ€üÿÁÚæÝ?ýéOãÖ[o-ÚÞÝÔ„Áéi|à´Ó€ŒÜ$=õC?<í4|ôèQná?Úi%Ëñ“ÿÖŽ‘ÌÌÌ ®¾šõ­¢ ÿHr%u<õÒ‘ÐVûOã}Ç‹ÍÄ5;;ª=ö>ÈÖßÝ£âÝgãÐàX×}#àk˜8ÀÁ >… Ví±«pç¿bÈF½‚Ÿ¯+ŠÇ‡øz¡è«¢øº8Æ÷!ÿÿää$ôZZ[þŽ[Ð.¯Ôÿü]Ë‚FþY> ×ÿ¼}J–…6M(&ÿWï}®£Ž:ꨣŽ:ꨣŽ:ꨣŽ:þÿ€’¦i"‘H-Ù,'Ș£ 4ˆ¶2!Mð5Šê­Œøåg —«:0IÏkÿ†e±êììD$áD—¾¾>Nþ×4Ç)‹bò?ØüaµBÌx ™©)¤;:Èd@“•~E°¬Gâ)ðì¹ÉÈšNP½ëü½ 'á1#Øu'³lDŒµ¨–|Gȶ3盞Ë!¥¤ìþþ~„ã}œ„À×ßßOÄ-pƒ¸£),Ì'?Ž—–ÿ-€Oà”KïÃþô'–L@QX€Ÿ®3‡zÖX‰˜4…´ÕŒ”šÅ:T* <íË P:PUyA耄£ç¬èzr9ä:tÄ2,øÿHú0^¿ô×€þœúÅß#Ý' ¢rò¿UBVEÉlFÉìÒ“‘eY¦ØŸi&ÆbŸLS#ìZ YrLâAÌôý\ ¢Àˆ~ô(€£èjº_Üg¹Äoûˆë[¶lÁðð0ÏBOåx0,‰$b«q<Ú wú¼<‰ß²ÉG“ìÅÀ|18‡²e2RÅd7,äÌ'(­ûÉ銢إ¾…Ê(CÁ 29© Ívßd³G Æ²ºöÁ.¦®Í3³:džÊå;—;ÉäH&߀¦)Ýð þLÓD"8q%÷'œ©o×òyž¼±NJYð YY¶½ÙÞ, êHf%˜O~Ü!ÿCƒ¶“õ.¸àH… ®?;à’ÿEüB{Ž¥ÿ§G `YgÞµuº¶Ñ?eANÿé\ßoU.ÀqRõÒ.bðcüi—øE kì;&š¿íÚ®(ˆ9䜜³týd²oFF,!Á²*{V"ù߀/’ÿ)KÏbaF(¥¤ìd˜MíF QþK"ñ Æ¿ì²Ëøq$®Q‰ˆU%  †¢íϾ‰Ž7ùºæ›ç§LWé¸Î xª¯íª%@O–et¶†€æÃ¦~<ÝgÃÝm[CÀ•‘>•3m²e)$—¶O)E¶$üA}ÙÈÈH‘ðGsss‘à ­744xˆÀk×®Åí·ßŽ/|á f@¯¦ÿY+d°¦Ébñ½ÕZ!–K„2UU=ÖiYª$ÓF% À @ ¾¦ ê'ÊeZ¨Lÿ6z¦ÃÃ, ¦ç¿±~ÓþÕ¢±±Š¢h„ ˆ’—üOö!(#n5 Û±½½oåõ‹lÌ û“ ÇÇÇ=äÿññqÁY ü¨ÄæñŸG\"^‘Rª…cË3œøïŸÌJ,3fõ&h ‚‚Ažœ÷ÚÄAÜö·˜r)¸*ˆèAHÄ îóQ+ìÄPˆ‹.ñÿŒå®})I’ýê[ÎÈJxÕÙç=o²ßÙO®œ¶ñÕ·,œ±Ü+Xõ½Y@8_2Öj,û·<'îwH/î÷æOÇ÷¾¼ûÏ^Ö+ÞëùÞÙ›?>HÿïJüQÉò$GÐáeaÛË%ì³ÌËÉ·Ü÷ýf èîÝ_`ÖsÎRÇ?9oá’2ý/ù€€ù‚Šß/é7S8Ùijjª¢ºS”í2“=xEQì‘â817KmÙOEâE(üÀúº»ï¾Ë€¼zÇj@fõ$Še5ݯa!yS¦1¯ˆ^ž´>õ—ü/¢Á»–ÈŽpØÍ€çdÂÁJ&xfæš!ÇØ;ÀνرãL¼ôÒK8 ÀËü[·n­º-Z¨í`™×*;¾R¬ßÆ"˜¦‰)¸bcäsk6cd‰«bP½hOQ?@}ø•úÞ(»®Ø?:¾ë¢ïß²¬ÐÁ›ÖÛõƒFâ"·c£}6|ãÏ>oZ¢óû¼i½'Üš5kì#GX`óš5k°k×.ÐßßY–¹àiš¼zî¹çðÜsÏ© ‘ÿ-Ë %21;ÝÁn.‘‰!½2‡/~‰¹„ ÂÈÚÔw:̯ý,©@2”ôœ¯Mkb*ö[·¡ mØÝÏ…1Û´6ì[HÀ¦i!»9vìdYFÆÌ ã·ŒúuèÐ!øÈ¾¿þK& Ë2Ž;ÆIBK%ˆû¢.Y!aÀ²¸0/àŠ,üþçAI²»-Ë#xA˃’Tt\µõŽÆ"4S[‡qìØ±"Qu‘ø$ÆYÍØ[$ÿ‹¤þWu½ˆä/î£ Aíê*:ŽÎW ˆðÏû°P¡è0´Á.Ï~â>æprW—»-åóµÕ¶lŽÎÝ_–eóGØ”cÂþ…n ]‰Eu>Ê¡xN§lÛ¶ –e!ŸÏóLº4¯mæ,ô]æÎûç×D;|õ â䘄T܉µ,öŒ2½SV`QäCÌOÿSÿMÛE¬[·.°ŽŠâÎóóó¼$мex§o¬··7P #óv˜ž+{.Åþ‘/Šˆâ©{~>’Ƹí®öcFü:Ÿx.cá’YW€6í9>ÒEÕÑfqË |÷$R±ØH4Šk¢9e¥Ä<È'—Š{·‰ëzž (øßýîÝ»qüøqôôôp!O™NÝÒáúˆôßßßx=ƒ‚@Å $Ù»zwAøNí½Û ‰áÜ?fvÍCÓšví¿à%ý/*ösîö»r˜>Ýó1üQÊ3GçÿcñZ’ôì’ͲóIv¼Ùâï1· F€lÖD8® ¹r%Rssû/(5¿@óáñ§g}ŠõÔŸ¹ñwÈf.âÿWò\æl„þñË;쿽u'6mÚÀ\a€c'¼ä—ò:æìêßç;ßñ¬=z4ôýïß>óÌ3±õ´Óp×ÍMÎ?MøÖÍR¾öÝþG^ÀÆèáá›"àî«®žz G­ªü={öàüóÏGcc#ÿ¾FFF`š&È ƒÝ@ï‹l^”ÅÂîó$!ø›ûîÃ?}âøØ·¿=Ÿý,.ݹvìXtlÂÏVíÁf¯öl;ˆ?Åü_w twQåT"ØA6ŸßVk™¥æÇýÂõ“““6Àúz a`ÚŸÚGêÓÿò¢¶"ÁH rÿówŸõˆ@°ÿÀ¥ÈrPpófÔQGuÔQGuÔQGuÔQGÿ½( fã$2i*Ç&LÓtOMè]Ì)!÷’“š9—üÄ/q[5 à 2¤ "ÿL×)ÚY²Ö²ëð^W% Íp3N^G¿_€Hµ8€“ííPUFî¨WÁ÷²·§âÌAœ›["XU2ç]Àµ¶¶z2fah)!NF¯[·æ“‡¼nwŒ.Ñ„H†´Wæ6š‘¦`î»$'7ÕÉH$Â'ØD9hÔ™Ÿ ¼UAuqàT¹”2çÙ§šòDûâI©'…,ë·v«ƒÎ2-Ì%°wp$}kÖ‹\‡î\ç*–¥¤–þÁšÊg¼ì=”"„™O~œ¯çŸaîb@X28Ö§$,Ë õõõÙèïÇåã·ðíCÓ{;w¾âQW#þ3¸“¦ibHc³o]ÑÊ/„Màž¹à~“Éi,ë² ° ²ã@š¸‹?®RøƒL‚ž}P]¼ù~ª‹ÃÎ$ÃÉEç&Òt)"l{{;öìÙ€MÄûË&‡¸àZê»v®c§#˜ðå€å?gd"¹dF#÷° ˜oCÿ§ÏfÄ¥{)d Ü|?›h§ïÝO¯ö;¬äÚ©L‘ Iß?ïƒS ›Œ‹xæ.y5èž+¹6±^‰“ôZ@{T+Dò»ÒJ¾ä~ˆ¤`úöÙÒñ\©›ßjcS5MÂù¿–LnK z îuÙ¿Ò¿Aï^æ9ùÌ_wMÓä"CCNœ“3yF©ë¯¥–$É3¹”À'(ŠbS¦+?9¹aÄpˆÐ¹-È& ÉòñO®Š"V¥ê¢eY¡x*g»ö¶éýF¤œG@v¯?0e@¿ÏD¶€øç‚Ø#À=w¼p3áTl›*Šbsò¿@ôop¡s†©ß°ÿ¾ àïßrÉÂbT¢ðÙ™€Wøƒ‚™DòÿÔÔ¦¦¦x€ˆ6oÞŒÛo¿pûí·£±±qA›´Òþ'èÚï¾ûnÞN‰Ú=4}l'*j“üÁ—´NAqAjýûVlAÙ'–A€çþ{{{aFEv=eZpÇ ADº7âøñã<àØoG˜¦ÉŸÙ`6`2(”'ûaFhddÄnmmÅÆÑÙÙ‰‘‘Ïü=‰ŒŒŒ@–e  ··×S7)O–å²ß~I8A¤T¯LŸ“ßþ¤zOAþDþâ‰'HÈ ì5ý»ÍC‚¢…xµ‚œD¨äBñ´b?ñ?ÞlŽÇ¿z[¯ˆÏL’$ûQ¸"<Ò=Áÿµ’þ‰0° 1£Ji.?¬"ÒYºß‡Ã0M³âöݲ¬PC‚û_#ÿcéy4$VpRÿË%KÏáÚûÐä#¿£Û ÂËKg#–$Éî^Ä÷¾t*Þõ§Œ°_Šü?òèëx7^g蘌Åñ>ùõãÎ}åÅY!NÐÇ~‡ÀC$~€‘»úó³è‹¬‚®Ï¢»›Ù"—ÁÝžú-RÇ?9o¡’P4qÜ»ô¼û ÁI¬/DL.8Â:¨@€NðA6ð±è,'ýóõœÂú˘DU¤RsÙ7+±Ã4M Eµ‰€!(EávÄÃy|ô;„V:Í1€Ž]¨œr(w¦i¢W’ø¸ïʸÂÚ½Ú>Úª¦°,+”)ø»ÈšÞ~,ŸC¼ÙòdEqöÙgWZTÅ €d‘xVƒÞ_U ‘žèw­Ÿ÷c"‹ /ಘ2%I²ÓO»õéÑg_àËW\x&°áÏà«×í ñžkÃ7žáû>úì 8xÓú¢rÄõ5kÖØpäÈÌÌÌàòË/÷ÿ‰øŸ×U¾ ¸¶øÌÌ Î²X]Œ~s ÑhѨʈÿšh4 ‚hHd %¿IbÍÝ=ƒÐÇ4¤0ŒÇçÁE—Där9Ü{~±¡aü’´ŠÛØÉ,Â0J‰P&Ýÿ<ühKLyÈïD|çË Â¤ß³`a``€“Þ‰ø>==¦¦&¨9ð]’$;£àú£‚mÙnW`è†VtÝÐ ý™A¨Q ª…Ë>s û?ý/þÒ”\ÑýŸ¿æ'Âï'Þ¶û'`ãñð5)ˆcJ1ã_¥dß ðñªCT%ÿ–+`–à!lx„÷*´Aý)»Áoû†ø/õOý~ÙŸÎû&ûýÓé‡pà¯T ,ªÿå¾—Ñ’ÁB×4¨*«ç±Ë/G‡ô"þó«Çð‡ϲþÂÿ´3æêbì2Ï>ˆ¨HäÿéÁUড³°¹‹ÉDÝ­±o`ƱLµ¬î6?žögƒF ¶[޹¶oµõßJ[•c‰4LŽhÀ"33ûý„ï>–u!$éÙšÊõd?Ÿbë+î’ ŽýM§?n`Å]RQt¿1ËTFÐßV8[´ýœüŸ‘ÛÐü–d'-‹‹=^]ná›oÁ3ßkæ™.Uç fؼ¢ ûð¸PWŠÑØØˆ'žx¢ˆü/ÚôD$Û¾{èímÄã?î!ö‰„ÙB¡€ùùyLLL‰g®ÀÚÿ[n¹Å#þ3½å©O¶Ð$ѵñ1†X²Å¾G‡ø‹-ïÇ~ ½t= ‡ÃÈf³ÈçóX±bÏê-ú$I²ûûûyLÀ£ÿ :t6r¹úúúøy;†††NÎçóÈf³E’ý¨ÔN7MƒÂ8 쌂LaÿþØ·o2¹3 ¸·¢rHpë_ÆÉ–Nä"þ¿Ù½Ì _Y–‘˜K`³µ’$Aé€ÅâV$IÂþè~lÆfìÛ·¯¢öhrr’“:---ÈL2Oe~N¬csᙓ2hiiÁ±cÇXæpÃ`ó!K ˲B—H’ýJÇm83s3z%æ[83s3ÿo©Æ.¥üÏDôïæaEò-þgþïSillÄØØø7Gcïp8ŒÉÉÉ¢2k{‹Ð‡†p…®ãUÇì'øÓ>„?Ð4.P $I²ƒ¾æp±A×– þâ>üZ4CBŽ oMÏ@’$[Lfá¸#¬¤½lñÉÿ"(kPQÐÞÞŽÆÆF„Ãaô?ÆêÉ®]až5ypt”·Á~;=ŸÏs})Pü,³ø‘C½1,ÿ,'yÑorr»wïÆÖ­[ù´®ªª‡(ŽëËÜ{H×Y~óæÍ¼Î“À¥—^ZïCóañxœ Û„Ãa>/”eI{ø½Ós=|Ûm8÷æ›K×…çY]ö“õ“I6÷“JmÁÉ'ßÉ·¿ñÆv.pðG^¡-°ÀO»mû§Ýv¥""âÍŒì$ú Û›¯£ï)ríójAïÌѬ$•|÷I§¿ ãjùÞüÄÿúBœ"ÄçDþ·,+´uëV`cs4Ÿëëã"ðŽ»? H‡8Ë¢oE$ÿK’d“` J¨žñ¿“T‡aú˜VDú'TêdïìB¶²r #ÿ¯œpŠ8EyÑSÇE!P?3ö º.Ší$¯ˆäÊ•ü715USÜC5 ¶Äë–ç÷4ÞѵÀï¸hH쑟ãWŽÈdµñðøãcÓ¦Møá¿=ÃE~øo3øÐ¥ë‹Èÿßÿ`¥i–N;í4›ˆúŸþô§që­·z¶;ÿÙï}ï{qýmÓÀ ༹£øÚwcøçG^ÀUŸgõ㮑 üómQä^»Mžzꩪ®Ã0Œišö_ÿõ_sáÞ¾¾>GÄÔ;/:ßÑ/ùËSPPWƒÑ¼…¹bÓDÈùµáÎ Ô’œ‡0;;ËÞת=öºnàÚ¿ øàõ84xáãÀ¯ÇÏVíÁºnàÐà8å+{j*Ç?å÷ÍÏÏ{ú×¥òMNNVä—¡}&''m‘ü/Ú-W]uúúúpÍ5×p!€Wß²pF@Ÿ°ÿù»–ʼnÿ:¼IÄüþçoH–.ñßÕàNËÂö%#ÔQGuÔQGuÔQGuÔQGÿßG àfãäAL¹\Q6N‚èTÉ™‹q@Ži:ô$aóf«,ùkº¹(óÒîÝ»¸Ä÷µk×âÞ{ïÅô¿ìðû²0) ذa€âqá«…eY¡D¶`w;ëþ!¾ W~®ëCîè+ÚA× ­P£yÄåɇV³‰ÓO?IZ³àýïØq&Î_ó ?væµûøòÛqÿŠ¢Ø…’ÐÇØ'c²'À¿ø?Ôüý‹ãդϸEü€±•F U-åìžÛ•ÜÞ+aû-y»[ ÑhÔŽ‰àÀ_½‚Î}?óM¯Xí|¤sQ"4Î%ÂÙG¦P@&Á|ë¹´…Xb568íDz»š^ÄÐô^Èò-çúöƒÍÆ^S¶i6:³qH´–°Ï'Î{·¶ÚP€»ºBX¦:¶‘ªr¥J"I,¶/ž¿ÞŠ»$AXäix±éHá|•¤gÑÑÑLf+Î=w7>Šb€¥Ý“ÿ²S†ñy>>ñú\Äoh¡rHÍÌYEïp3úÉÿÏ|ù»³³³HTp‰ ~ò¿H>jnnæ> ˲B“““¶8 ý#‘öíÛX;::pðàAùzþz‡Œîÿm@h›kCAÈ)èñy™‚xC`‹·ྠùŽ]»vÚÐâóÉÿ333>"SŠ™Äí° g¥ót†­óžoúl“Z, ýKh{† a¹€æŽ÷Jú„ižZ ?’$ÙÖ²ëØÊÊ»qþùçóù4ú¥Ì›ø¶7"“;`YOWEôêèèÀÃ?ŒÌœ—ü¸ÄÿwžÀ_ìÿÚ´6ŒÁõ=Šõ¯MkbN%:\rv¥óbˆ)°¬Ü”í“~)#8À¾Q8ûÅœù‘Å$¨ÍBÖÛ¥&ÿùŸ, ½’„½½ÜÿŒáa¾}1þçR¿y€ ¯tÃàbpƒNÖcz?~TZ¾Hî'"?‘ÿýÛÕ®.¾ ÀCø¯–ü/‚ÈýºrˆüE‡¡ vñÿÍá<ä.w©ÌP”ýç\¯®G¡ªÕñãüÏët•U²×t6Ôþr]Ÿ‰ñ؆·º®—$ÿ‹~±àÒK/õ+…ÉNÇ‹ãf‚ ¶ÝëÖ­³ɱ;%~]ýýý8ûì³yøC‡€'óo©ºX ôÌ÷íÛgLàùA¡ýø”SøòáÛnï7n„®ëÐuûýTUÅðð08€+Vxæ…v[«—N½(õ]†>4²Úm€mëv8¼Éäž™`Ç|òxãí|ÿáðضn‡BjH$üÓo-"äëtã߀ñøIx ³Ž¯™m7; 8œBjt­=êaJ’|÷IËBܲj€‰F;‘‹2¢¿Ÿø[Žü/f†§uBùŸ@Û{zzЉþþþ¢ýIP;¶ŠÄµIF¬[¥ÈþÕô Áãׯ\x ‰ð5ÞY™%±Áˆü0A¼ˆvg^ÎOþ'‘1ÃXÍ·YË®ƒ$Ý»¨þÏOþ¿êií´Óì‹/¾O=õ” 0âö¹çž‹Ã‡óí$ I^ýuœ7wI_ùTŸ»-ŠÎMã¼¹£øñ2Nýýï¿’[ „eY¡íÛ·»Brù_ŒiCl¥Éd8©À>­/Ë2l°ùýï|çÛVˆðð‚Oy¶ò•=®`@ Çï œdï'ÿ;ýÞ’ûÀh ÝÒÒUUAâ<¥@cT€}¯kÖ¬à èºÎÄÐKˆÁþçï:ýÿUÿàežyWÿYCM€'ÅâgŠë¨£Ž:ꨣŽ:ꨣŽ:ꨣŽÿÝ(@Î Y–m1›Š˜3·08è @€d¶öÉ>Êœ):6ƒ²X C–e„ã wPçóy¤FFÂCþß²e FFFjvœú3Píwœ4™©)táZ&€MÓd¹,Ùç“ ød”žtÌ‚&¨±„ijrѳè6ŒŠ¯Å“×'$@Yñј/®gõ¨\`dddIñ²,c°ÓF[b ûÓ;‰µf$³ö§›ÙÌЂ‚ñiòŠ(°‘ˆ?ûöíCgg'"‘ˆgÂcóæÍhll¤ ´U×Ãÿêò‚ñ,k)ùO %˨ÈuèHÌ%ø9°õ\‡yT†,ÿ À0~k'-y`x<®@¾ä~Ìq*bLcmT-ddRÄÞ½{7ðàuÜ“ºsç+@®CG,£zÚ(Ø»w/ðSFvW£Q6éˆê&¢˜£þä’ÿ““ÿꫯ.úO|çœødms6i žZ\`Rµu1~2]祗^Š={öàî»ïÀ²Œ”»ÖJ®¥Òk9à·nÝŠÝ»ˆ¿úQ1ˆ Nå¿=ß_ñµ÷ôôTüýW_Ñ^@4z 4í ®®¯k:'ÿ§Ó'xÙ2þÕ¢§§$:”ÌNáÚk¯à|kÚ.¿œï›KÇÑ–Èbÿ Šˆ È—Ü_ñD£e±¬Õ$l ¾··{2µÄÇßÏ—#÷2BJþ xÀ C’$ûW&†?xÿ~6pãÏqÏÁûš¦‰)WÁCÊwt௉첄äQ`™É%IÂèè(Ò9Ågt`Óæ ß×Qú„U‚ˆÝzHÍ¥ŠDÈîE¨DøE¬ªý樋­\8ÃJl¥‚Ÿ»$I6‘ÿ« ºÉÿÍïò ø±Û¶:"~’#ÙQÙ§rEB~áËïˆþå’à2èèèà‰ËFQ2ûy­ýøŒÄñO)èy`íß|»"á™ ¬„ €7b`` ´qãF›îÏŸe†¶U„i,ó=-Óý‰A¾ô-,Á_ñŒ« >ˆ*@߆aÀ0 (L”ÃÃn”ŸôO ì ´\KùÔþÐ}¦GF€!Ž µµccc\pˆÄ àÔSOÅÙgŸuU1¹øÈè(ƒµ·`Ñ\{÷îÅå—_ÎÇMÉø IDATà€èňlÞ¼·ß~;àöÛo'[ âìÌþ-móøƒÐ‡†ÑÝÕ `¸fá9þì>€ë {íoÚÆÇŸ~€¥¨Ÿå28•ûf+…HØ ×p8 ]×ù»Uæ0šS Ãh?1#­T;ö!€]!4ÄVàÕ·,4,$:¡ïyXõîY¼ @v‚4Çã'amþ ‘ð/Ó!½XDüßrÅ{ßûœßSŸ¼Ž#c­.y>™—8ïîÉy g ÿ‰äB_dËz—ã Ú*d§˜èÁY!l»Õ Ê9+~Þ­+$¤Ê\O¥ƒaÕˆ(za‚„¨>-”õ²E±˜`%”Ô²IMª›ášºg‘ñ`$cL ÿ® €²²b4µ‹ÈQÂ8ÃŽyY=ÿ¶ŠÀµËÙ/ÙB†€>ÃXRâ¡TV@1 ”®éP£*AÆ‚KIe伂å@vÛ†o0¢ëžƒGŸ}W\xàÑg_<î«×±ÿE!€ÅÖƒˆ#2—×Ù}mú˜‡ÔÉdpäȾ¾fÍà:—„>t¯+ûÓ@[b*0’è›$É–e™“"Gd+U–•[$jN Ú¸ ;¤à>ç\³¤U¶h/SÕÞ?e¼gª Óÿ²ƒg^Xð¥ùäÇùº|É€çøë®cD:òÝ86\Õ>˲Bƒ’d‹¾~BÎ1ɺ-Ë“5›- ‘-Ç•ÀÿŒüÿþÿÌk÷ñìn0ðÿ²÷¶anTgÚà-2 †|ª›ñ²`Æ–ÞŽI@R›5!æ£åÎ LìX혞Ì\dÝÝx—¹Èi$&o&k‰Þ|m˜iZí ×¼“Æ y6LðЭvŒ1x‰UÂ30~ì–ì`2¼w×1b¼Áµ?N=¥S¥*©ôÑí$—î?*UªsªêÔùxÎsßψ•tجû'¨ ˆ»zÍ i))'RÚíTòÚY=vûÏmì· ò?Gòÿ!àŽ¥Kñ•g6, c œÁ”ÁýDbW˜ë\/Ü¿ ½ìMü÷¯Íâ…ûW‘öR‡å·` _÷t}ιO‰ò·)}òÇÜ7ðzPÈI¬ˆ[=­úpÖ@Š2™íܬ¾øÄ=˜x’[ÈÁóMÓÈ:×ýrÈ"õ ÈÐg1¿æÒ¶±?§ ˆ"NÜÃÁ¯}ú´ZJž` ñ<‡b›‹ÒxäÆEÀk'Åö®“â¿1æ·ä«åŵh ça‡Ü§Òú¦ÄOc‹eË–™c"ÂóKþ…BÁ$,bŒR ?üayÔFÝ0oR}»y®Û2ŸÐ4 ²8Òøø8¸4ÿ6U·‹å`óBùšªª" ¡½½ÝRêC.¿üróyU$QB7T"èç^\ê´Û$& _¯ùŸ1¦‹bÜ)­=Ä3Bè’ð"± ¶äKB¤ 3Ã!ÿÝ+ ‡MÃÿ­¦²Syd! ú»§tÍ€ÉåÆ-ë>2Ô Õºù_†lw¡uµØð0²¶1¨ÆlÏ×ÉÖ ûªÔ+ ã6ÿ'q>5§ZÄëB[gi{îÐÖ vú ¬YSò/ µgY”k>Aä¸c}™m1Ü ÕÓÓƒóÚ»Ïl‹U¸Rýðûýz @GG‡Eè|Ù²eعs§)²ÏØgô÷ !ó1þØ€žz©&³þœuqçθí:qì'/ïŲeËLòÿ[†Ò>*;¿R~Ç÷íÙ³Gøá‡ñÌ3ÏàðáÀ‡~›6m‘ÿ |ŽCö¹è"kãŽ/Þ¼oô…?²x…ÝVÔYÈÿ;Oô"Oãùã›ñóÜwñäñ’ߦiÐ}>hš†›6oÆÿ½~=îúÛ¿…¢(øi-…pÁ’%KôÿtìNAøÿä=ÀAø¿a¿øm„ôo‡üˆñõìì,ìû›{›uèÐ!„B!³•uèx%‘hd¬N5šr~+„*öç§É·æ5~—¿?á·-€0Y -´ÐB -´ÐB -´ÐB -´ð›GB¥hœñŒpv’õ+¡«££ÛpÁ™ûÒ;€•+WšN?D€¬Ê´ù|Û·o@‹=„³*Ml¯¹,NF™yÉñ4£i–è²jõ €ÑÑQlܸ±&cË J )#ÊEIi˜ž9Ë1ô?Q 3Âï1r ¦œ±Ð^KÜl¯ŠÈÆì³ê…ßï× Ïö ëËÒ‚‰CvøíŽ•îRÛ½Êê§›bä’¯¡(ŠÞÕÕ…ññqdyºc38räˆiOrc¿Q7úûûë£Xèü¬øWèyÅâ¿!ÆJŽq£££¸ü§+q𦟬Ëj6kŠD\:ŸIüἈÈdäîØ ´Ýëß›3Éÿ’‘íÂ#²£‰Ö‘‘ñMdâEÄÒi$¢ÜðŠ„²yózh)R‡wà/±Ê<¾çoþÖŒþ l1›Hï²@4QŠ€Ó rÕÅäîÑÝ- c±SÖº˜<±Øè>ýæÀO8a‹Å¢IÖsŠìÛHYìJ¬™Œ+×êã¨>ÃÜ„Ñæ÷5éû£ºàTvñ|ËŸ9ÄbÎù{u‚?ëÕÿ ö0=Œ1=¹ûC`oÉá Rd™z„7ªA‰Ì˜$ßh"k8|ø°I|IFf?ÐŒü)âýºÅ»LâÁÓãÇ04æÃÏs¿o‚hÇ|€œ±-ÿOKEaïÎ×Dþ'‚ø÷¿«áiñ—ðÞ€–VÊÞcJý.õ¸¯IÇæC€…| ”?ž ^…» D¦ê_qCfF*%ô„EB›ÚMÓ0ͧÑͺ=‹XyE¤­h!¾dòk(hüÏ‘ÑÊöhA¾‘ïAŽ24áB"§wBµ÷¢iZEá[$áí í˜A‚–‰â•î½Þþ‡Hq4’Iy2hñÞ‹ðL5çKúeŒé·Ýv›n»í6Ÿ|žÝá²V—ý&Ù044丿YIü€x7ãã㮤ÿžžì۷ϼ‡f´ÿ4:räˆ)‰ä¾oß>ó9ôôô8ÖzËAÑbé4B!ÑÞ=ù¤ó7@‚@yÔUºV-¨4æ‘Û6@lGb$¢•…H¼¢Z[—ÉhÈh 4çÍÌ0“ü”Æçr™uÊ·G5Ûm8%=§ ‚‡|¬Þ÷M¤m7’Exw:.Ÿ[/áÛ Ç¾´Èbûy{€·¯wm9ïWâ÷ísEšóÔ0ÿ¬ß cL·“ÿ‰øOøÒ#ïâïq1Îýì/‹ñ¥GÞu¼^µ6£è/•³ßÿ§;ÿó˜üïõjQšvÿ~¿_G¤FÇ2„eYÍ2W üqBÏÄ#f;)"ÖLÿËÎù‘ÈjeDh»`I„.€ƒæ†Íh‹“Y¿9iôZàåÀíX…£Ø¥¸î(núAóˆ§fýäÜY¶Xü:Òì d{UDd{³ˆ¤CHÞ|` –ñ$}Ei®’Í"¡')ÑT$ä"€å©Kq:•QÛ™‚Dþ—Aä&ù>œ«Èðö}ú ,6*_‡óyÕ ¾Ík¡(o"!‰ì›Ð4Hdó>¬X1×_?Aø'â}äÿJðuO~z6b#b‘b™ø|W8dÚ}õ€¯á`Sµ‹¸AܸÈ9ÛþfåO$7;’û’8ç¾t:­÷ôô”#â? žv'ÿbía||| 4£þiñK‚µô$ ¸ÛS±³z…Lþ€C€)p­¸¬Â¹µ€Hÿnßn<èŽ;'0¦ƒ´žSë³æÜ:xè›Ç±YZ‹„ýoddIJ=44„tö¸Hж|î%x±=Sý µ…ÊŽñŸ„ wò?${³ˆ¥#èééAw®ÓüQñžFw®¡ÈÒH»>ù['\“Ë ¥? r„oÚ¾ì²Ë€¢ø`fÐ|(‰4Ê×[Hò?ý:ÙŸeX½ög'ȶÌ@ `Š,М¯Qê¥Iþ7@„þÿqpÐBþÀm2 Û>—p»ñ«¦R–ýN"‘?‰Ü éò¿ú`àÛ¥.-õî2Ô'~µqaLUUB!½fƘžüõ.q'ß‹€úä{À[%ß 4‹5T×I Oþ³~¿uÛÌ'†,L [·n…¦iÈ&9”›cPÅô£âœû4MÓeB|-…B&©Ÿ¾õl6‹ááa38 õOrÚZÁÓ_ôQü^.‡_‡ÃøýPi ë?\ªùñ_ ’mv8û{"¢>ôu]ÕµøøÇÃ÷¾÷Ÿé~ùË{Q(”ü굸á?ÇMq€ü1k¡ëªŽ×¬õß ¨Ë£¹ž{ZÓ(Šb‰õ‰elþq Z6…Xš!ÎyÍþo2d»S”sds}÷æÅ¹D ‹~éŸ~½úY:­WcLψ6ãd€C…õ"$ "o®ÅÅ òyÍÄ™˜ÿés§Óip~-{¥ü |ÞÜð¶»ÁØu·‹œs_<Ã,cóf§ÀuÍùŽõI<³­±¶Ø™ü( ,[¶ –öæ£Ô€íNZÑßЀêú#Œ~'y6ŽAQ¾ùðCøê¦Íøê¦Í¸ùæ›-äÿ×ßþ¸Ø$ÿ?˜Wqz1ƒ¦q¤RK‹Uw?~Ü·iÓ&}ÅŠØ¿?®¾új|ç;ßq--}®ðWšÅã†ñ7ÇgOÿ_ÿÎa<•¸¯k|&ÀÓíÁ’Y?"Å4ÆÒÀòÍÀ†ÂU¸y¹8¦iEÁ¯Ï9DzVá¶]Ž;æÃ’êe„ÿ%?Ô›IþwB¡P˜çܧªªnøËŽW³ßW °çå¶ßÍþLW£‘ËCžìÏOã1ÎQ€pÍ-¿$ÐÈZu -´ÐB -´ÐB -´ÐB -´ðÛƒŠŠÞé33ãì|\8ç¾7ZŒ;2¹=›äPsAÄ2ÇHÓÉh¡p‘³¯Õ6 dÜï°lÛ6À(‡Õù«”fçúõøÙ›obåÊ•žÐiÁ¾ˆMr“øo,Mâq%Ô»÷Å‘ÐË#à’1Ñ)n²-‰Äöæ(ƒh±ÖŒ sØE ‚•5ÂQ-ÑŸ½Âï÷ë]]]˜œœD–wXbc*Šb A(Š‚†;“˜?>^‘4û›_9þÕfh=H‘µ—ÿt¥ù«¡?cs1(SF¾S@±­}MuP˜o22çÜ·råJ}bbïª*¶m;7Þg‹0 LLL ­­ L‚"}äLØÌ:(G—µe¢ãèè¨å³Èr]tzþr]ĪwœSö^*9hQ9‡‡‡«.ÚÕRZy‚¬õ¿Ôà$Fç¯\¹? DiÞ}÷]³ÿ™œœ„¢(¸ñ$Ç®“’@S¾?¸–Ýñ™ïý„$`Í¿y*ô— ›å(‹¾H,£'£ƒ ]*C8\¿ð† w¢sHF¦²»\?îºë.€él3œAšùÝ­ë/:HÔ14öØ àæÉM•`F`;BhѵPñ·®iƒûû=‹Ðâ¬MóA(µ§^²hA0ÆtªßÏ äxµØˆ*!GëlB è2È$ãwâÿ çÄ.‡Éwˆþ'À9±‹ðdòS ÑwA ïɶ¤%â ÚùŒõ4Èaº0îán8‰XÕS5MC(‹ˆ EJûi  Ââc¿—zòï“Î"Ò›^Ñ>ŸèûPì>Á±ºÁEFþ Ç»ðÇÆË@¸P8d Ø·oEñ\jé€).™õCQ€Ô@²‰¹²ö}9j¸ã?©*<ÓŒ(ân¨Ç Óï÷ëDn·ÊeHŽçMoÿ8ç>*Çðð0¶lÙ‚˜D²WÅ$àKhZ9ü~¿^ȈŠö‡DHœ–-[V&BШýѲª*¾GªÿO>ù$vìØ¹¹9ôõõ!N£··½½½G?˜p|ÎøuËÇ<äˆFQÇR;”Ìú!#_»cL—Û6nNl–(ØÙ,BRTžd[±¹R£Ü ;<ùõb†Ý'Á»'oŠrL¨‡¬MíýµFŸ¢èrçíN;ø°|p½ø=o`hòˆýçûeýýà\M ÅüêEAð·“ÿ·?÷>ÖÞz¾ ü?r¾E( —½‰4®°Ì_½VÛH¸oé°ˆ —`6,"O…Bùú|K™9e9°z1ó”¿ 'A";¹Áé;‘ë“QÏjª§‚Ô/êÖòÁcPU =W¤}0ŠÖs¡ãõ9\;¡.ä›)EÉÔg=ŸÇ âÇä¡Fr#Ü”(Ä@é»ï8GŒƒˆðÀÜwí¼ŒüBá+±Ÿsî‹e §áfƒÈÿ¡®0r9a_ ßPWÙ$êŽ.è»À'¡áƒÎiñ¦žˆé•àVƘ~÷öšÿ‰àÿÜ+oXÈþô?l(ËûH( û~! Ô"`«%Ò?Pé9¨¾°…üONÀGŽÁáÇ%€ þ¼ á½>W…[]@ƃmVŒSKþ¶+E¥v§»ÀðªÔ´Üœý8vF–`»J" [¥ç:@ß‘œžHï@‰ÿÅÍ›ñÔCYœ/ó{s® #¿7‡\N7œ0…î†nÀòåËÍH•###5ñåq‡Œx†aBªYÍ9Çãw«‘î-‡Zí$çtÿ½}K‘ž8j!ÿ¤ ‰_¨ðÞ€†•†ïßï÷ë…ˆ›Ñi»EQ÷ÅKó©„«x cLŸMžƒ9š@U ÂÉÞ'‹@Î ]ùÿ¬R)S¡e%ÒçjƘΓ¾¢q³)Aü­ˆ, GJÄíúq€¯{HGäH¿´¿qù_&ïÙEèO‰5@| ‡’ónƒÿyî÷±¡p•Å_Ë—.+Û7¿wRüšã““B`‚sôcM«ªŠ a+^p N˜Å‰',ëœòø]Ž2ºsçNV!¢’0CZ·ŸKäd7á"@´ÿöÈÙDúJõ©.Ÿó[Èÿ'NœÀâÅ‹qâÄ pÎ-"¾@Ÿ|í"Š=r®cäóyËó—#ªËY£–íR—_~9&&&Ð××§ÛÏ¥k’Hv# jϵ>àÑp­±o„s Õ1ödŒéò·íDþ÷؈¹R#hÛ ÌmÛs°yó3&Á_&û;mƒ¿T:¿m+pÚ[–œs_ VÒ‘þ’@W¯•Éÿ*Ra*Ràœ›"èºÙP#)tãÄæ"@ºú\œú!¿ÛÃaó’ÉþNÛk¥ó!ƒºa¾H;¿)öç€CÄi'1Cz¶WÁ˜ïï¡P( §§ö¶Ì 2ù_M¥pÔ ÿ ŠXã—„BHDÿÛÂaü^.g’ú—fz;ž°ÔHwt`G+äOcGUõAýØOD=×oÙ§æT“ÔP8Ï9u"ŒÀ"ÿÂyÀõ><Ø÷L¥Çá|­“%’«ú}`S t×'€'¯µ¤©D“ߗü ‚è/ÆÖ#eçk;“P÷å‰e‰1“ü/NyTƒ,¼cG$Áðð°é‡Eÿeœ8qÂ5:°S^Dþ—1sÓ¿ásŸûöj*…€1ÃÖ¾ï¼óNìܹ³³³fWM`O†ïSc> ò<¾{÷‹òä^\j’ÿ}¾PiŒà˜VˆØÓV»/úh"k ;åþp4ÿ"Ðõjµ 9 Á¼¼ûù€©Z!¡€fBÚvƒŠ<² E Ñû^Èù?‰ž™p ÿéÝ kÖ¬ÁÔÔ3(⫈@m:ÈŽ8¯½Û$þONN–=ÛÉÉI4Îkïnèâ\ïxýõ×qõÕW¾ò•¯`Ó¦MUÏY ൬íõ=ÆŠ+jÊÛ‹íË©è2D/ºÂ! ;‡Bw7ÚÛÛF1üöCØ‚›°uëVlذ=õWPŠ¢ °m›¦ i¸ióflݺµáµi ÿÍ&ÿûý~½½½ÝœS.^¼Ø5­1^lHìSþoÊqùÕEœò°§q²?Ë#Ê! x°? €› Vð–¸—1|Ë%ÿZh¡…Zh¡…Zh¡…Zháwžcº—hœ‚„Ô˜£½|žßï×3ñ"Ô\ù¢½ýúd`QsA$£@$FFh­éÆ"ÿ[R¾ú¿#ôÍ¿!…oÂøó¶mž"@1ÆôD”C-qwå‚DLÂɨpB“…fggÅó×4D~Ä# ârVÞI‘¾"0C½`*!HpS%"œdÜcLW%ç¸P$-›CSp•Pw ˆï@龚—“““èåÖ€„ÎbTåœ#ꇞ)¶™F»^Þ4j ³Ðù•ðw:@†ír5‹C"Äï/ÔMò?‘nDÔ.Egåf@&#+«ŸÖ§“ˆgšCFæœûÈ‘÷FÄÿ-[¶@Q´µµYˆÿɶ$ÐDb1hÙúà8‘ß7oÂC•¢ ½õ‚@H ±² í …CˆlÜ8oÆÝÉÉID£~o˜û‰—ÕÅÄí~=¹ûÄVcÛ¶Q¨ªŠ îx}ua)‹ßïׇ‡‡1ºMrW®\ EQÀ]vÝÐ××gùo‹À~¿þú¿±Ëp ŒsŽ3´+Š{ٓɳ]ŸyüÙwL1Cø¢áçMJܹ„¾7{ºb±èKÜî×#F­hÈfyS“3qáÈMd~AÜD$š#GŽ˜NÜ¿ßï×wF~‰?ÿ‡¹ïéqAJÔ±®_ˆŒ p ƒÆæ!¨IþZTZ -*w¼¡}µŠâ][TÛmdEQÎ-äÿ; Ädg,ä ÑtLJ5kÖ Nã®ükøcŸ¦ifìtì"`ÝT3³D¸FÉ-BoŸËaXçô ·?¾w_ IDAT÷>¾t+°ý³ÖãÿàøÒ­¥ÿÛŸ{¿zñbKš^ö¦H÷È»€4®ðD‚•ó'arKþ˜yû²Ÿ®š?€• È×ôr8. ®bj¾<ò9}ffDÉ ».1 @Œ{‹ñ6ƒü/°3òK[‚v³ácÄ—3÷íŒü7g­‘YŠ‘"+â ÿg?zªþî8ë9N‰øòâ—¢d‚ö"”S³E:Ω|læC`¸XÄ–&Í,䀜÷H˵ T ‚èïšgWÂ-­y rÝŒí×" ØÓ7Óùz||¡PÈB £h…ããã:×ã^®Ï9÷½pÿ*óûyA:&oË"ßxBØ>^¸•¹ÿÖk¯Äs¯¼o<ñ¾v÷•ÈÕh~³——Hÿ•@¤ÿÇ€¥í ‡}¦sbí¢¬Û¬7ÿ]“9…l2Škbåõ,àšXÓæ”h½q~m°—Hï•@N—¹œ…ÊåóÈÝ-˜£Ë—/7Å:;;ëðÞsÆ‹¸±Ã'g'ÿ¿¥bl’x@s'­çþ‰ôÿ‘ÙDåðQ*04åþ µ´‚æÞÉh@¬¥ˆG”Ò\TsªsóX¦Ðð|<دÖ5ök&Âá°þÿ}Ð…®Îñ»Tà@ÅGgýv©GqcHˆjp¿ŽrŽ4®vu Ñ©ˆ¹¦àÑ©ˆ)P N}ÂY!£ÙUUœV}8k „?çMÁÏÃcKL ÿ •+½oE¡R‹:aÏñÇ ÷Û Âòc8q7÷±)ïbÄÂ>ð]@±x¢FøÕbñвˆ—GöaÅŠ ¼þúÿAþ·‹x`ÌåòÎ;ïsÞ»råJL';°/§"3ÃÄX·C_†‚À=èŽÍTH¨D2#áÓ A3'q¢]'KÇ9ç¾D™WÙ7ÉÓÑÑQFæ§v–ò?tè~ÙeµE¢´×/"Dú§5•ÙÙÙùžYÉÿµ~´v>11 dG#[ŒŒƒšÇ‰ìYoÄg'øý~½×hw*‰}5[Ì×ìóˆþ ž)‰€ð5é©™ªý_ÃÁ¦ª·GâÛ7üm[ÍýDòÿçþgLNNZ¢oñ¿§§ü¬»Ëóæ/Á¾–àZN["ýW‘þ§ñ( ;× ¢Ë0ÆLq€X:âIxÊ)‘üggg¡i転ý‡‚¢(ˆ:|ï I­gÚþÌ3Û*»Ý‚la$ ¤®²¥¯Åöñ,mØÈÿ3·’Ë™¤~ÀJþ¿Vûq;ägО%è â“ü©¿ðY¶”Æ2ùÿöRxͶOÞ¶ÿ½¬0ÆôÞ÷Kc¯/Gú~©ïgzR¬C†îú„)x?‰4«/ò´l{³ƒSSS"À‹!6Md…ØÄz‹º/‡PWɨj¯ÖﯞrÉD"$Ê ïßž^þ­'òÿïårø§”Ž{ýŸSxÄSpŽÕú‚áˆÃõµ7ú¿ –}»¹—–¥ñ}j¬ií™Ýÿ-R,šãN@Ì»ˆü­iŒaÇŽhoo7ýáE1Óe“Q(‘Œ¥=®ÕÿΑ…`ì6¨(çÈ0V–¾02‘_K6àh7mÁò=Å3âyÖƘž  "d¹ ’ŽX!R( +‰´Ä BtÐŽf÷w 9ÿ· ­ÿñ·Ï0ttt ¶†±§1ª£0€!"ÀϺŒ=Ñðà¼ön<³ÍÙ¯’^w¬O:Úü~¿Ný°,Äe‡|¬ñ;8ç¾XLŒ 4-Eaúiwß}7V\r1¾ºi3vî܉ùdXaˆÄ:;Á]Ó8ºº„hSµ|/¼ðBýá‡ƦM›Lâÿ¦M›pýõ×cÏž=:\ýõøÇý#:ýkó¼Ã3Ü—!ÚãÝ>{ú×xqŽÓ=˜×8~üxÍïæºäãº61‡L¼ˆÐ?¡~¹"Bw7n¾D¤´±uëV ™¤9ÎÈÈHY€‚zÑlÂ%,^¼¸lh8ˆ]Ô%4à”?•=õ#‘ðVçÃá·‘Í6–¿Œpøm@6ûqË~áËÊÒår—4œ'cÂÛ+2ñ¢ á´ÖÛÛ‹™™ …ºÈ8~ó] qrvº~‘æéñc,çEòy„ÞÆ¯Ü`Ù¶#öN€²“þåï•1¦?V,â5”Æ%n:›…“@Ñ·{zz°sR8Äž»È’F>ÖL„ b@ÙͺÝÇŸˆéÓ|Ó˜®˜¶ÐX3Un÷3õ‘ýœ@×&I%â9»¾bsšù°òy^ GV´;¸ Dbióêyö^¿[j›µd€6s–2Ž Ñ@DP_YAüÆ a¸^Ⓠ¿ß¯ ¡X,:’Þñ ¶oß®“3°¦¶}Œ1}Ë–-(‹ðûýfdšïN}˜ÏrœéçˆúÑÛ+Âÿ¤Óióž’Æ–-[044ÎyÃäù\¿_zÛÛÛÑÞÞ"'Ç%♢(˜E{{;.»ì2d¥È{Í‘ÿÝ„4¢±™Ü柡 ðÌ×nÃÏ~ö&V®\éÉùpvbJ0¦£¯qHôõ6Ç ;‰¼Öw ˆ>$,ñjÉ«’ƒ³|, ™²ÉbÍóýöØb¼}’㜣¨|pniû’E š6 ¨!(†·Ï5D꜖3Æt“¼« ïÿêÅ‹±ý¹_`í­ç€Iê„^Dÿ¿ð“ô¿ý¹÷/°ˆÔ "ó÷1aKYσH𪠴ç–àsA C=†>ƒ|y©x­F r‚Mf½õåùVŽDA´1ÍŸüÂWE,A{n Kât qc,’Sp$Šó£¿¤ÿµÃBþ ¢¿ "¸é3€"Íç âÇä¡Ï4G€¢oà ù¿¢‹qyž< Üe¿®õyw«¯ä%ˆ¥Å»ƒžDG½@Ó4„Ãýæÿ±QAŽÈåÆ÷#—}pÌ"Ë4e¼OÄ9Ùv);cÓ~ÙùZ>·‘7c:‰ ±ߩo¥1•ªªƒ¦€á,\SzƘ.“ùà¹WÞ0‰ý„ÜAü'Ð6‰Ð5ž{å ¼pÿªºÇݱ1ËËAvƒ^¾|¹) ÷ADüG b¤blz ‚À/Hük5?Ñ¢…rMF|gÙd¡®0Ñq¬µ‘¥9?Æ–Ô]'ûúúpà€ƒŠÂæÍ&B¹œhÂÁ I&â»(K}cø¸dä¶‘fõ–­¿¡ÿ¯ÁÚÙÓU‚ëý‘q†:•Ò…Aâ±Þ?æNÑÿÅbÑøã„N‚‘Í@(B\ȸ­?Å2=i;¯‘9¹ÌI÷LýqÝ®ápX?yò¯ñáõ‚à¿ËÖ­¼¸€Ø‘æ;·/ÅWž=Šs^^Š×Up¿Jm½¼¾ÐVò¿ÁbÑ©â¾8⾸E¬:"E‚µ“€8ç>%ÂtMÄ€.Ó©<Î éøüîI:Àç¤ÆDÚ鿼n7“üOd6UÞ×9ísJS{YJDþbñëp"òÛÇÖ4Þ‰ÿvÈk®òú"d2” ?qSh±l(”h¤æ<‚üoÚ9OŠöô*Û¹´o×I6Ù^'òp›ÉDA"ð%[6Á) )í“Iñt 9/dD‹gàIkÿïPDÑR÷˜˜¶"hñŸÊS)¯¼$®A~@ÿåû’…ìû{5z¶±·dJýEéZò:Üí¤Ì}…óLò?‰xÚów¼!¾±ü¦¾oø{ÿÍ K Ÿ¼¶!§o0R,"Ã6Æ‘C"«• @%²ˆG„—–ÄïF¿?²«œ8qÂÒo:tÈŒ:oÇÏ~ö3¬\¹²Ìvc ½fmâ^¿hÓ³ywK¿$N€šJáÓ©V<ð@Íy¹Èÿ¿üå½(¶Ãç ™ÏPÿ—A¯¥P(lG °7üç¸ëuÜàæÿfˆÈ›k€CøpPà!v?»?Wÿ77!˜ cUß½]ô©Öupι/Ëè†=Í*Œaˆˆñ® ÿ7³OQQÅ ¥ñ]6@&Ÿwd?Æóæ‘ iÐî\V®34ÿ'òئoÊùµæ¯]Ísè¯o @íW|0;óÚ»qÇú$žÙV_;l‡¦i–9ÇÎ;”æ4?Y¶lz{{k²{ºÁ8_O¥–@ÓŽAQV\r1ætø¾ùðCÈœߊK.Ö±˜AÓ8R©%ò5*âøñã¾M›6éÇ÷íÚµK§}DÜ¿ð «Ú[®C©M€Ã‡cùòå5Üm9ì~­š¦áÑé^ÌÎÎ"ùi±>˜ýÃi <4äðüñÍ(¼ý##X³f ®¾újhš†#GŽ`ëÖ­ˆEŠ–¹s3Ь1¨ìäþù²ÉóCY€ŽÙÓSÞûׯG/€´ß?oÄú?e ÿêâÃ÷-iÛÍþ¼‚ø4_¥…Zh¡…Zh¡…Zh¡…Zøí€'ÎE4N{Ô=2ÈØ£qŽŒŒ4ÍKw#Ù+Œ]¡p¨bÀ2‰òƹõz¡;ÿT$´†u '´±Â)Çã•Ë¡~€—;µ>}hHr\(w@Û¸qc J8®Ž›,±êG™¡Pt•èTÄÕ//Ž7&áj÷:@wlÓIÕÝ™ã«Ån-{áò«DÖ?¥3¶’¯›‘tÙ^ÕE GÐf‰îdda0o™1¦+Š‚®®.0ÆÀÃ֭©¥¹+³&‹Hºþ·Á9÷ÑwM U-µ$|*Ìß·g‡ÛówJ Ç…DâãM#£×S–dòìŠÇ«Áîð×hºZP*ûÛžžy³qèПYúçÜ—™±öóé´xÁ`šæàIU#ĆèëkÔœŠxDA8ìÃÚDs¢À?=~ Ö<¹?MdN™‹ýëú—`]ÿ’¦‹„Ãa=x ˆ|gýol…zò÷…Y„] õ´ œ2¢CŸ|Eì3Ò寮íT³È6ïp8.;JÐwÐ Açxtº œsLNN–‰PÛƒ¦iMYì2Þ§ë;¿‘XUUEÌÜ^¸v÷ n:¸F¿+|ãOCé(€Ì`ù9Dˆ›Ð>Ÿ ËaQý‹Â^œh\Hý²$ü1/ýºÙhKÑ’úîz+")y¼¨]K~¿i ±%rúºà‚ °k×.ŒÿVÝG#X³fë1»Ɔ ÐÛÛ Î9öíÛ ½1Æô®®. ÌÎÎ:‰¿€N¼DÝA"§#Dü'Ñ;{t/¸ã?±*¡Zùȵ^ƒi3"l$–p¸äì‰ ‡¿d¶z;ïä`‹kžï+&Èÿ_NTvÇa¨‚ôO òÿiÕv»ƒ"]½õω´¿ý¹÷M9Ýß?xe[ˆÀ»Hó+.»ReÐû½Šs“` ãAˆY&=Wnì“ñ–.ÆŠµ^³IŽhÂ_&â@¢£à¦?"Ù]ȹ+cÈ&9Âái³Œ* ßÛû˜Ý ÇZ¿“Ø¢ÜI"¥ÿþ¬³xšk–ùßD@Gyä[‰ü8Ÿ‡>@ŸkŽ@‡Aþw‰ QšÝ'8V78æeŒéÁ`±4½¸Êß{{»ÙnÊQ訓Âù:Ô%°dÒ¿ ŠÀç’¼ȯ˜,|NdUUµÌÑ!Äô÷÷›ŽÿäèJùLOO—]—Ò“3,¥Ÿž®>û;™Ÿ¶oøÖ^‹(¤}ôŸ¶¿v÷•È9ó¶«æO8pà:;;‘W­ß79ööö¢³³°ôdÑeõÓÅÆ=GܱcV­Úfî+¿ÆîÃàÆ1Œ"™õ¤ThâëˆE„ …–É@D¯¦ó·aÇŽ¸å–[ª:üÛ÷i»×AYý4^}õUËþýû÷.åÊê§!Û¤k”ðÎÎN3|-ó Y„í9c_‚‰H{Åq :&ÚùÝ'8ÞÒ…ø.õ‰~Hê{Kb6ör8Ýÿ{½>‘V\ïÙÅëq$­à½^ Yº…Ò³èì세æy 9ÚþØ£b§9r$]§[ ‘Jd2†4§ö²^øý~݉à~&@äÂÞï-®Ä~'À.õ(àºÂ³@øéŸ¸‹T¿–û€PÄ uL%\ûEJ—A‘tQÎ+’€@Ó:LÒÿY¶¡L*'v „¥ nÿ›M˜”a’2“¼, {%A8q°{¸“ªå+ÚÏ'QNâ¿ €•ì"ˆ0}Èq„?gì­Ÿü?99i!öÒüʾölYÄúO(Ô uJzW5šÇTU-ö¡cWA´2ˆ|÷J"œ£Ïq˜ÈèÕlZòÜÙž¿}”æz½½BìtffÆ£ÈùZ‡2£lÛáÔþ÷÷÷c||¼¬þQ½Rããã–q !zñ㌈¸žÚÿJÏÙ²eèë볤Ÿ˜˜ H`bb}}}u=70Æôã]Ÿþ—sqêª$>êäÿ”•(Laµ^_ŽØ6Py•ˆxèñ _cغï_|¥s³sB g=Û%2ã]Ërøzþ˜ÛP"ïÏmcŸN‹¿7Þx#˜6¹ááaôôô˜Âìô{|î%Ë5ÂzöÛ®Â(Nõ/Ù›E,Á¯ϲìïíýñL±tÉÞ,T”ØDþ€X:â©þUê‡äùD{{;ñRäo%Js”ù ¼ÐL‚á·ÁþLä·ïWe¡ùG¡P ¹‡§gK§ËHúnHöZE¦í² ]»®Éœ2åóçl’cÖ`&Ù00ðíÚs$ÐI¿ÏàÀxi¼ïFþ¯ƘÞû¾´ -ºê“ï™ÇBw}ÂD0ˆ‹C’Ús"Þ¡„€l¶l ¨Ø8u_Î<§‘ïÊrÏx¹`Îe—]†•+WB¶Y@6›Åðð0ä>–úÅjÂ;œsߊÐßèí…šJ9ÿå9Þ˜tÿÔûL¤R àר¾Oùt]Õµ€Db­kZý_uß§Æ| ë:¼ðOÖ¹Z °º®ê>_È'§·£²ÿÃøø8z{{±lÙ23ø†ý=*Š¢Ë"˜êò“ë¡QÎ+¾û¨´æ( PTßq‚°³•Û²âëXÁ©MD9Ô<< 0Æôl y ñttÇÁ¡!ŒÙ<ŠɀíÜ7ƘžDy¹êí¯rþ_šc<@^‹ÿ©íMKí8ÿ£œÓÓÐÉÎg|»hëæ˜Û÷Œ¹±çëƒAäó"ïZü ¼Ú+1¦Ó<ƒlÌ2é_†“8W#8t輇(‰€sÌé(»÷ÓùÿÁ{Žáôbï}ÞñãÇ}°gÏs›~ð˜´}B`5¬"BnÏ0hwqDþmÖô‡zóMD6nD Tz¿‘ëF&>hbÊ|SSSˆEŠè ‡€Ú°Õ|ŒAeøý~½««ËUXk>à$`l[ÚVEQ°eË|áîõøÑ¶mØ¿~=̓tÀ{ ;*ÙŸí+nû_/öçO2V—ý¹…Zh¡…Zh¡…Zh¡…ZøÝ'@° n ÖEz D Ã<ÑÓ†²v#Fá[ú¯(îı \Z ¬7–Ý Å)ãW2Úpä|@„’÷ÍY«Be%ÃçÜ7TÀÁÊ#ïʽNÝ(ýÈȈ™'#_+Á˜Nþ¹µ¼“§?î9rBlfÀ’ÿ| ¤ŒÊ\¶í›º¹ô< sÓ¦»ÅÂA0„6^!vaóóFÒ—Éþ‡Î1ܯ÷wz3D*‘‘í†íFÉÈŠ¢ €1†©)A(®D.U¥©õŸÚMÓ0::jÞ·ªªecÊoÆ ¦ ß̈¼nÏß Í&ƒŸ©²ì’Xª(›«»»”Oß»gú™WêìߥmVû  µ¾*Ü’pØgžÓ( ¼X,úÆ$•éDÆY| ÁEÁ5‡´øÛ„Ãaµ¨3àþ~¨†ó-‘úóßo^Ú*ío„ôD h€Õ)[vH±;mÄ9oŠFIý~t§‰•;4pÎ}“““æ"u3ˆ÷„`0ˆ EÓ¨2Ìx »”¶‘H¬~¿_¯£Ý‡¬ŒÞH»Õ> ª â¿)w4ÏŽqœ‚8”Ä®½GÀî«×NÖ­•×ÕÕ…eË–aûöí5çÕèùÛÛEEQ°víZƒA‹hØB£‘E_9Âi¥¨ò¼c>@"2ì÷4Ÿå8ÓÏañâÅf (Šãü×.„±fÍ“HÜ,!ŒÅ‹WtÊ 9m¸9ÉNÿIÉ͉œÆßvÄ3 Ȉë4Ë ¢™Îäp&ÊYÚåI—È~:T“Aã°:E©ªª«ª÷èœsß%Rÿ²B€Ù,»O:SÁàÆ1©þYÏ]µj~ñ‹èììt%ŸiÚ4ðZ ù½9W…‘ß›Cê{û0ì@·1þ2ÏyꡇÊÊ/GaÊÌ0Ëó¢íX¦àIˆýÔ£'lßC$Æ0ÁKâ”fÐë­fB°öEnäM›Æï ñ‘ |,AèOièëSÊî?=q´¼à¡N@=`\ó>pþ’yˆ¶ûLMmbáDDIu_jNE"[½nþ!n¦àé7¡d¾Ò»ÆuY{’ÃØ¯©Éÿ^w7†€½/ÕüO8ç奂øOåüv¨êXÐü£(  ieëOìïºÝþžõû‘‘ÚC'¢Ì@ÓDúÓ)‘ÏYAœÕüOB”~>©c:E]·“ýí‚ä¸N¿'îá–1›ª]„*©ïïïG>Ÿ7óécLŸ0l$PktìСCŽùÓ:ºªªeù§Ói½··×ŸTs¸åAíÿ<ñ;qâŽ9"Ä ðD<®¼]’£°«ªj’˜Ûn¹+>ÿ¾>÷çß×§OLL˜cYˆÈkÕÀÓßëÕðÿóøù§wã|År|˘?Ïý>Ã!—¡4?¨aiX%Hgâ}&£äòydfX©-°‘¬eâ¿]ÄŸõ#/óIç±µª¹G¾ðàAä™_z^»víÒe€žžÜxãævI˜ã3:‰pl@î‘oÃÍNõ/5¨CE ! @E ÓüQCÌB›åú$Ïw¤ë˜õ/6«©þîýœ~vvV—EEA{{»¹MiÒ{i$ð‚íþÊj•Üö7võùWÑ/ù]9ß BÖÊ•+Aä\™`Ûò¶7à›ßü&E¡ø¢£ IDATæn*ùÉПìíų ¸¥­¥<2ùßúßJr|5z6:û—à»OéÂÇÊÎõ’ò×»€E¥ÿ¡»>áZ6õÉ÷,êI±N©e9ÑÚÄ·*Á+•ÝÞÏ7øD´G]]a³/„ý[^Ï‹D"Æ¡C‡ÿ‡B!˹ÕÀ9÷]™Në` Ä»°¡ý›ïc ©Já\Ù`îx\¬¥íÝŸCîÅ¥øå/ïP"þ;‘ùãñífzeç¸Ý·ÿ7"_Wº'»ÿA­þoôî|•…`è]Sµÿ· ÀŒ šÎ¡(Þl‚²?“ý=Ëä~;da:îÔ7ØŸq2À)à46ˆ°q£)ä‘BÙ@‘‚5 Q!/Ö2²†píÁ¡!Ï,NXèùH2Ëk1½ô|Þ|¿Œ½RQä¦4~?x¼ÿùºÇN¶`7ÌÎÎbv6mž×ˆ/‘ÿi^16vàωñb,Ým#²jå«%oÎ…¸òƒ÷œ IÀâWLï@&ÿÏé§0¶¤¦{¯Dú'<Aú€—Žöô¯ñâÏbùòåàœãúë¯Çž={t/×¶ƒD£~\üù_àÈ‘#8ÿüó±iÓ&|ÿÞi\pÓ›@&ƒb6l0ƒiš†x†a:lˆ5HþwÚ7cPg;õ«8v{{;Š gÚEç ÃÃÃØøÚÝëñ…EÀŠááªÁi*¡ªý9&¾¯û¥u|'W¸fÙŸ[h¡…Zh¡…Zh¡…Zh¡…ß-¸ ÈΨND$ûqX»V¨;DãÔ5M«‹j7|:àeÔ Ëͱ(EèŠ…è› ²ŸlôÉÂH[“ª0XÆ ¡•äéy¹Ý»l”‘Ÿ-) ËFU»£°Œ®®.sÛÉ ¸–gOưj2ì 0ªNÊFEm÷:Œ}Oè]“!SYý´>ìÕM-ç·±«‘çñÛŸ3NéŒ-Áäëøqò'„“ïÐÐSljñɶ$bXa¸?[zö²@ý" MF. ( fÛ6^…ÔÝŒ<嶈Ú^@´nÂ$ãããèéé1ÿ7nÜjsk%…мIc¿uqaËr¦ïy¡ò—ß;Õ™ZûJçFB©Tÿì×-dÚ”"VË›ÒC>hÙ¢s õ}š¦I‹( b™BYÃÓã‘Ò¸!–»F„ˆ¼‡u"ý˰GZfŒéò¢©>ËçÔ[;Áiª™Q8eXE Ü½Éi!ºâ½SÞ/ ÛõŽ?©®i÷ÆêçܧDJõ†"(Éסèyvhû8Χ`8]y Û \WW—é@X+Î>^t?ºµöò9rı¬U˜áL-Ø a×®]® ðõ¦m¤ÕžÝ|”ãL?‡G×_õ2Ñ/G•ûÿL´ÇCÓJó†þ'b/ ñŠLþ€íϽX{ëùØþÜû&¡¿Hà\¼oîëeoz Ñ£« ¢&„îªå'âæUN  õÂâ‹r Î9²~¿¾ÆèûÒ«ø•9Ãz!)lñ‚b±èó'`:n‹E®†^Œ‹ñø¾¨ãGOù,Ûô€e9~CÀ¢A"ŸþÍ—7T¢¥ÿîÈ[6CÙr²²W(‘z®õ§wGÒrª*D'8iìc ¹?qs6Û·oºººL;íÚµkË‘j±„BDþw¸Ï,7=ýÈåÆM€l2ŠH,Ss[hoÏFGGñÃþÐro7R_¥¹g3Eú#c:sî{áþUæõ^p÷öâÖk¯D¸øÆo˜ieò¿]4€ŽÛÓVzŒ1=›Mâ©§ÞÄÆB¼ptt7Üp>Œ;wbhh###æÜV@l÷öö¢³³;vì(»¶“­Â¸–ký8räöVA"ùßW–®É“±%RºõØ»÷ ×qÝj ß¼¿dTÇÀŸw!—Û‡ÇS*¢¢–… `ô…i:ÙQv휃h®q-G&mSò€×tëÜ›"?î>ÁŸ8XÉÿ2.õY¯á”o6›„Ï·Œ‰6ˆ«/ácB@ý¯àø.»Ïzÿ–]¼GÒ x‡S›TîíÎùwÁØ}Uۿ߯“#½……=bÃòåØºukMD$Ƙ.¯yyuj—ÇŸ$ÆÚè8Ìk¹ímh3Ú¼ë ÏŠOýK±êÏ…ðî 敟^'9M«À⼻ͼù‡sîI[†Ýþin$ E™Ñg“'pÖ)%©8­úpÖ@ÐP”™²óš ªwË—/Ǫo­2•œ¨ry^¾}/n¹åŒŽŽbýÿ³¾¦|5Ãçû€»P"ñß%µÃ¯8œ÷Š[0ô?ƒj?–É.µD¬¶öì”Æ.€ì¶–[ nå£ù]?‚Á Åâ]-×jvþi‚©×ü©ý_·.iÚ{zz°lÙ2pÎ133cŠîɤrÍ;SÅŒÎk‡“`%qÖºŸ¿$Xëý׃ØêsüùV,}¢7\yøo:5›/ÜíJ@rr´‹ÿ‚ø6ê6úì×ËÌâxDA"«™m=úˆìöìÉ¦ËØg*>'Ùß$cMNNšß¤ÕŽúÝ-o§úÇ{8ºÙ˜Æ£–úçdA"Žõ¯;×]¾¯­1”G&¯ÔÙ!“ýiì)? û}Öx¡\‰‡ F]vÂBÙŸˆÿÊt#1f㳆‰Ä9G `|õ«_­ºd'6‚X:¤C]tÊÏKþ¯FÏÆ5.~'\“9…W£gcì® 1>æ)‚Ügºþe¢¿ãqƒü?ð7ƒP" µtÃÕˆàl;„|Þ}üJ7-ð‰šïÏ!–î6 ýòùò»²“)=؉Hè:·Ï¡.Èy»ÕÕ>ÆðFo/~étÍ>Pº®êÀZ“Èïš®¡Ÿó„Ë—n@ °…Âvc®×£2úý~]žÏ“ŒBöíÛWQÔ©6 5 މ¶ÅIÆË»· À ŽÁ{]S¾¶¹ß/¶^§ö'Vp¶I¬_¿Þ¼?{;¬"€YÊ8Æ®»#ëqÁÐ6l, T!°ãLÌÿåuB¯D2θØP2Œ™é¦4ͱž1ö„Nï¦Ú}Û÷9Ù‚ÅœËú]Øîƒ`O[«]À$ý;Ú§¡ª@J0È::: á¦úHdò?° ‹—û1>ÞŽññ?@2ùs ”„ˆøßÕ%ìü§Ÿø6ëÁù±šEd\xá…úõ×_oŽÕÿ‡û/ÃW/ÇSÿø.ZºW^Ä0›{ï…/š‹fý/~ç0Ù/êÉЛ1Û—¿þñ/ðeCœµ³³Ó’îÀ!°uëVDÚ€h Ä\xddĬoݱ™¦úÃ.ät¡l`ööÜiì¨( Ò~?P,âêmÛ€ááºïµûó·êR³ìÏ-´ÐB -´ÐB -´ÐB -´ÐÂï.,NÆG¯D$ DF"ƒ¥ìÔ_Í!ˬ½œ²#¬|n5"Pnr*]¿¹Ÿó#[¶·6Èï`íÚµ–È'ä+‹)ÈåT¥ª°ßï®ÈíÅøì–ŽàðìË ÕµD!“ÿ+«Ÿ†¬PLÇI!“ŽÍ‡À|bëà™#àºASù‹h³%AŸ…êì÷´=Þ†¼´ö’ÈŠ<ÝÈ/Š"œßâÅ»s²¦Mã9_«#â¿Ið…j°—Cþ¿ÆÁF%;[Ù—Ü®ëŽu&§á~ô—F¿GÛáy r;Uñß^¿gggF9ƒDêë0Äò‚§ˉý®éÃá~À=㯚BZ^àÔF½¼ADæ¼ (9B’`G Ζ‘ÙÑës·}œæ]^#ÌìÛ·¯)â3v(мZ(P,ÍcZv¡ 1€qƒôW›Ó£SÛF÷/Ï9+A€rsU²ï£¨º@‰PêÔ·õ÷‹ºvâÄ ÌÌÌX„«TUõä);—ËÄ~ Dî`’ÿ˶¥ôÝ÷Óš†¯Ý}%ºïw˱”o$ÓàÀxâ‰'P(°qãF8 ¢¹ËÛv3*‘N $ G)ÇM€sî»å–[ Ç÷Ú n䯖è·Ü‚²ýN÷¯í^‡»ÇËç[]€¶{ð=1§Öv¯sÌWؤ… ZžŸG;823 Ñk["È|y‹&Í­?y— ìþë“ÛÊæ~òq@ˆÒ\jÜ ‘ûÇl¢«>K¾W·ûg x¯WÃG©ÿ ‡O¤?ƒ÷4|”„À÷z¿¿#iÑv±œ¿$]Wˆpþ]Ûáª"Ô<ÿ&ü÷¥¥ˆóÇ/°Õ5=Á~Žïw,{¥kÔ;÷—Ï©eþOù7sìçužé”Çìì,ÚÛÿ ^ü5!p]áYà/€—·ã‹ý—²ëÔÓÿÚëÁBÚüñýÙÉÿ,ä·²6rß#‹82£µ ì½/n™º¥¬ÏÅ-ÔØ¡¼’MC†šrcÏ#ŸwµµQ£<–26B˜ÏüåþÆx³³³˜œœ4¯'oÛA‚ØétÚqHÛvâc{{{E;Îôó§sYZÑ_H—ò‘ÇÂí1¦§0¨|jyØ÷1Æt"ÿ 2³Œå´$B(ˆe4óX²†9˜—g$ ÁšyŸ‡½lN%NyRýKöf¬ 䀨\ÄRÿ’½Îž±´08Ûë_²-‰Ø\̦'L‡§‘Ì%]EªÝ? êÊãZŸ©çþ½ÂÍFíô¿YXHûsµµk×ùgNŒoiZF‚Ã$HaŠJ4ÁþR)½œ6æ È⥠öëey®±3R=äMæ”Ø°‘k©‡Dôÿü7/¬˜.õý,ÆþßA“ j'Š6CìØï÷ëk×®5Å_ …ras@ô-Á`ýýýؾ}»9߯õû“ÅPœÄ8cúÄÄ„ã¹èëëÓÉGûUUÕ+Vp*ƒ=O¯ß£šJáÓá0^ôQÀЍÙꦛ>¥Òêò¥ûaÄõLü§±X °Öñ¼ýû{ÎÓ>®«ä Ì¡šÿA5`{÷B0õ¼ûcz"Vº¾Ó¹^Þm­B®2¼¶=µô-±ByyJó²Ùm^×"rþï6þrKçö\Ö( ÒšV6ö¬•ôO¨Ç,ÛƒÁ ¶lÙbñÅ­%0€w;°P·ýð4r9 ]£pz®ÛÀØ}(¹¯X,ÇÏF*µ"ÄŒmk@ a_€õ–ëÖ;{ýõ×ï=‰w.â¸hé"±}ô\´t.ºˆ™¢ï= #/óü믿{öìÑ?î)¹œœs_gg§ë; cd£ý²a™››s½f=˜ï1¨ÅfŒ©+ÙÀöíÛgµ9¤©ÅF¨öÓ÷—öû‘ö¼6ã–×™¶?·ÐB -´ÐB -´ÐB -´ÐB ¿Ûpu¼!Ø•œ**‘ón8NN°„#GŽxv¥ëtuuYHv"[Y€r·{öjø©ÅÐâ%²_%¦x!`µ¿ƒf<{7¸E2n–ûœ¤öçQé}Tzve"ÊÏ0KÔËfægϳ,ô;°‹aæãYTªÿ2 ±Ò7ï–g¥|Ý`ÞQ‘¹§3¹ó_÷+a>¿C¹ ý½/ä}zÉß© NX¨þÇ-o'4’·\á@W(S‚ö û÷ZÏ78_]õŽC4M3ñ¨R°“žå:KõNN›ŒÌç[-_§úï¥ýu*C­õ~¾ÇŸnã`ù:µ´ùr½“ÏõòνÞ;]ßž§=_EQïŸÞ¿¥Êkþ^žE­ßöwPí»«v}·gã%o'4C¼ªšãƒ[»KÄwûûwƒVç{§öß©lvQ{dR§<ìײ?¯í~5¸•ÁþމÀæ6â™§s¼Ô1Y@&û7·¶WÓ¦±eË?Y¢¼“3·¦Mã©§Þ´l/_¾‡|ñ‹Wà©§„àJ%ѲÑÑQ3‚·™ªªÕA ±ïî ²DÖ“ïŸ"4Ñv8ìC.'^Ù@j©Q* ð%£3*Sf†™ý‰%è¿|üê‡Bcf™d¢°l‡àïnÛ†#ë×cÙ¶m¸`ýzô±ò6Íéþ}¾×¥hß&¡âØ"0ös¡N@Ǻ~Rìƒ pƒÈéî+k'ìéŸþyÂéTí±Å˜Mž0®”Håo©^¸ûäcÇ Ñ¿TƒW#âÙÛa{û[m\à'µØ_ÜÒ{íÿçgzþã4öдiD"XÆðôÓ1¬['ˆÖ•H¼===f[ ªVbå™~þ^ÐèX÷YÉÞÈs H¥1H-÷î•Wi­Ä«ÈÃBտ—ÇæªÏÉêþ½ –zÑÌ<çÛþ\ Íøæ µx½V£ßk-ùËçg“âÛ*‰û•Äe²?DbîDÏFÞù…9­ç¹ÁžÖmÌ^O¹ˆ8û³Ÿý °råʲq¨ý˜›O-â7^!·Cœ#40¸Ò¤¨Åö·Ps¯jåpB%€jhDº‘wï^ßy³Û¸Zò­'m­càÌÔÁFÆ_^ìónóªZòñj‡h¦àBõÃŒ1=™<ÇÌõ#ûuÚ|B|jNþËöÿòµDÙ8R©%ˆÅNÕ\¦ /¼P€+Dà#²yýùÑò²·1œþù€åË—›¢2¼ 8áL…æs z¦m`µ‚Æ&^…4ª]ëLÙŸ)w -´ÐB -´ÐB -´ÐB -´ðÛºœ+‘w¼ž'ÃIÀ ^aÝœhíûëDOðâÄÙè˜Û±ZÔÊë!UB£$Là7‹€á„ZŸG½„X§(ÊÕÎîo"’ŒÜ(¹–<å|«ÁK›2íŽ]À ͪûn˜ïï°Ö÷_o>öüì8Óù;a!ûN„·ë53_'Ø3ñý¹]Ó ÕÔªq¼ª–Ƌí[ݬ÷;¨§ýmf;3ßD$;¢þÕsïNí}¥óÝî¡Ù8ó¹îÅ™w¾+]«Qâg3P þL”c¡ÊЈМ1h=B|Õœ/ÝÒ{éÇç£ý­äø›6j¤îýÿì½{t×}ïû%+?–-Nh§Š-F¥ÕäHAYi[âKf›8alÂMÕvÝöˆ’•>î¹+â’’žs³œðX‹êñºÇM“ºÑ]qØÓ²¨¤©éP$M)q, /1NeV"YQc1C (Úµ…¼lü6fð äxÖâÂ<öÞ_̃8ßßÏ\ÃL®7§dúü Dð‘Û—_y(+©‚”iŒåÞ´·”)2ÕàŸí†Fó¶Lí yw¡H}Nùž‘ÆHÚ¶l¦ÿ¬cäøÝK–e¾œÉt˜OûÔ÷}.æó\çÀlíVú;#°ô¹škÛÅX* èrŽÝL®7€çsÓþb1ËǸÔXÙžÃJÞ¯K}w[MÌÚæ&©óšy_j¢Úöò*]]]èèèXR;Wó¿9Qè÷_!ŽÿÙ½{ cÅ¥L¤Þ|™ú‘iH&0/§¶ëèèÀo}ùËxJ’2¶Yã÷xÈüÿÂ0þŸ%?ÕüOë;@¡®=å]¯Æµ_¾7÷/¶5?óyD¡ÿÿaN`·‡cº`·‡ù5\lÄ€½Q=®öÍÓ…úýo±>K±XB†LóðJ¯2if"Û5\>}2±œÏÿ|ú.Ö¿Xú…˜ÿ`Ã@ €Zr‰.Bªù?ŸcXÍøg£×!Ù’lë{_6 ñ|rýí¡çß¡òCK>¯åšÿóåF&ŠY-CèjÿþL,•Xù÷Obµû[ÿ®¶þRç{®×V‹ýg9úùþ?h©Ä+¹ŠLÞ[·nå™Là‹íÏçyú÷ÐÅ4o†ÿ¿¤RŒûVëµ7s³ýïÈç¼Y*YX®mÌóüM¼þÊ6w.çýp#?tèVX–a5ÆûЇ>´@Æ~˜››ËhäOmGI–cú_Éÿb ñ[üRÏ-Óö•¼VÅþ ,_ ‘‹Æ)öïÏ@ @ ~³¹é~XÎM @ñ2çþ&RèqbN ³±ÿ*–÷f¤±Èwœ¥þ‰}³þã/•ÔÜãÜÏF¡žK.7¤󘋭/™¯r™ûV:ç-v ’빿Ü* âú§pŸ}ÙÚ磻Ükþ÷cÜ‹EΠW`\)d"ŽÕzÅÖ7w#çŸ\“ðeK^°˜ 'ß›0?èóo¦ó)ߤ+ý®Q¨âÞo±ÏÄrLü«j¥FäÕH”ÙäÚ?_óL¡n~&óáræÿ÷Ã÷ÿ|’¿Rû\«¯eê3’ïË…¼!r%Ÿc+I ±Ø5¶ÙdºØ¼cN²+½<Ÿs0WãçÍvü…z.¹ž¿7Óñó|¹ÿ óûo!>k—;Ç®ÔD^èkðù›ªá1Óz>ï©ßr™‡s¹(D¥<Áêp³Íÿ77ê:d¥ßßnÄo¡«‘d„Æ}?œ«uütVRD$ŸïŸï‡ïžÅâfù½o%‰l ý|2—t®eû(u*ùžƒ+ùNŸk[37Ãÿ?nn†×þfgµ¾ ã|¿_¥~o-„þü ÎL¾¿¿®öXúЇ,qXÌПÚv©öfRïùZêšf¹×B7ûêêêø¸,#£Q–­\UËŠ2ƒ’’:,,ø ªåP”T\º Ó®¢²òQhš†p˜Uls¹\x¨¢gáÇÌ´å|g®CUU455aaÁÇuJJêP^¡á»ÿx?¸L^°ª7Æ1­+¨UL^°YÖ×Ù¡ª*¿~”eͲŒ|–>±X UUU¨U®Cû_yuUUU|ûü¼?qüRâø ÄbNØí¨ªdY/-õ@×uKõ;Y–1?ï·ô¡}v{„ë˜÷‹ø7þíííˆÇã°Ùl|?}'2 ’$Áf³!Ãáp@Ó4àË©ýh;õ5÷!h›ÃáÀÄĪÊb¥ë:dY†¢(ÐuÏyôz‡Ãá´j´= ªª n·›÷!\.Ÿ‹‚Á ×1Ãâãq¥6æ×;S?ÚžÚ׌¹ïŽ;Dü‹ógU1˜-ª~±)+++öS‚¢ n†+.âÿÅýÿƒùº³|Ðãÿ~ºQY @ @ @ @ Ü\¬)öø ÓÚÚj1D9r»wﶬ›yòÉ'¹aÅlF‰Çã0 #­=Ëxº®cpp»wï„B!‹þðð0š››-ëf̆¥Lú©íXÆÓu@€› Sõ'™Za IDAT''Q]]mY7³sçÎEõSÛ°Œ§ë:¦§§Q]] ¸ï¾ûDüEü?°ñŸœœÄ3Ï2á#åþªªª4ceª~sssZ²€Ý¯ª*êêê ë:Ë&~’Sê>®_nÕ§*fÈüïóùxŒÈèJÆs2•×mӰišÅ8¿t8PéxÑè1nJ'Cùëw8Pz_Ãá¨0EQP^¡afºápŠ2ƒp8ŒpøÂƘBÒxN¦òêIƒ¹Ù8N¬³5âZ|ºn5¥OÙL«J"6|°Ûí¨ULël{õÆ8t]‡®ÛPUÅ̳d<'S¹¢$ æfã8QZêIÍ­¦t@F,æD,ƒ,{L%^ßÎÚÇ‹I>]×!ITUås‡¢(¼½Ïçƒ,˰Ùle™o§ù~v÷ïâÞ ?ÍfƒªªÜðþ½¹Ûñ±„>ÕˆSWWgIð`nc6•OMMñ󨼽ªªŠ/óy HÄž™Óm6›ˆ‘ãß×ׇòòrÌÌÌ ¼¼---8{ö,.^¼ˆššÌÍÍñåM›6áüù󘛛¬]»–'R0ï3÷ݺu+†††øø333صkΞ= xí§¯YŽ»Íۿ߈SqÂãñXö_¹rW®\Áúõëqåʰ,§¶€þŒQ#÷Ý(ýû·CYYfggQVV†]»vahhÑhµµµØºu«¥ïùóçù²ùuØ{¡¥¥%M¿¯¯?;;‹}ûöahhF…¾Ð/ª¾ÚFQYY™6Í14÷lŸ››ƒ®ëõ»»»3jÜ Ç …,UËöíÛ‡¾¾>hš†ššÌÌÌðå––>—@yy¹%N´ÏÜw×®]èîî¶TO;xð úúúããã–ïk]]]èììD$ÛíF,ãËûöíãcì{}–™÷™ûÌÇ«¯¯·T¬LíGúf³ÙðÜÛÛ›“>UJŽÇãèïïçãUUUå¤OÆÌééi‹áù‡?üaNú;wîäúgΜáã¥Vú̦/â/âÿA‰¿Ã0,Æ6¢ÐÛ²!ô…~1ôÛÛÛÐU×…p8ŒÑ½£À³¬R2=l>ö¾!=™ÿ].ð,0ºw”¯‡Ãá´$.—‹' ÀÛ,¹f€Þò¨ªŠ@£IVç‹?n@š‘,údªT~¾®ªjZEQxÒ¼íÔÔOFÒ¿ÐUUñD_Rßh2 —°ùE–eø|>«¾ˆx"ýÔ$TÅ:UÿÚÛ§12b ©©‰Ñg¦ë°Înw8Ž¡²òQÀØØ(ëU¨Ÿ™®*NcÆá@½ÃÁcÎÆppclIIÅÇÍî×´c¦Jð#¨Y…øu6p㸢(¨Þ8‚u¶F¬³!‘Ä€d>ŸÖ#^Õ^–e‹ùœÚ› îóó~¨ª”¨ï‡ÝÎ*ÄËrÒ8Ϊ€ûQZê,#ñº²óÌçìÑÀÉ«ÚSåy2ŸS{³Á]Ä¿¸ñþùç!Ë2¯4°Ïé—^z‰Ï›·oßž#Æ«ÍÌ€866Æç$ Uñ8¦LIOl67ÃÙívtuuñJ튢p÷·¾õ-€?ìG<Î’&ìÞ½†aàÛ?ƒÎŒåñ8Ün7úûûQ[[˵N­ù0>;?Ã0ð =aPw¹\\¿Þq7º^ø6]ÃèºÎ…DŒ?fJ¤Dmh®ÉTIÞf³¡üõ fd™›êeY¶\'ɲ,â_äøô£`5â’¡õĉ\›>¿É| … i7–ÀÑ£G±eËÞöܹsh¾blÙ²…k„B!8'`ttÚ¥K¬&z³ážŒöëׯÇË?~j„]¯+N…C}èÑãñ ÍÛøâ_þ%v<¸·#“1õ+++°ë#úNa6› Ç›6mâ˧N²qiœL}víÚ€]g¹ÝnìµB_èßúcccÍ9›6mâ˧Nâß×EɨO HöíÛ—¦€›ç‹yüôFÇ0c¿¦i8~ü8n‘û D*¡Pããã< <ýôÓØ¾};o;>>äcÓg(át²ykbb‚·±ÛíˆD"¼Ÿ®ë|N§ù> ò9Ô÷È‘#p»Ý¼-ÅÓ<ÿÓñÓ…Àét.4&ŽyÄé\I@ @ @ @ @ ¬&¥Å~‚$fsîþýû±{÷nKµïÝ»wãðáÃÜLAº®ãÈ‘#Ø¿?¯Vi¯t¾{÷n˰ªªrcF&}¯×‹ææf‹~ss3úûû³êóJɤOæÂææf‹Id)ýmÛ¶¡ººÚ¢_]]3gÎdÕŸœœÄ¶mÛ,úT鼺ºï½÷^Îú"þ"þ¤øOLL¤™¤©r-Ýà¿Òm‹!ô…~±ôÍï2ˆ‘?•®º.nôt»Ý‡Ã¼­› ‹a6—¦ê›«&›é-ïá&z·Û UU-úÜ”Ÿ4¾9™§³é÷/ôóñ©J4õ¡õ|ôg¦hl”LF¤r„ÃaD£Çà;s/—”ÔáÚÛ§ÏU ­¯¯ÇC|<ýêU8D£ÇKÓXXðAQfP__‡ÃÁì >Lë >q)Γḻ,Oë ¯T_½1ηÙdh¥¸]‹àZ|„›Ï+dÕ㨫«ƒ¢(XgkÀ îÌnpc¬ªJˆÅbܘN˱˜“WªWv¾TUUY µ3vÍÏû1?ï7Ó#Pƒ·/-eS»="â_äø×××cóæÍ0 #ãõ@jÒ"³ZÓ4Øl6†Áç›Í†p8 Ã0©`íèB’$h𯝯ÇÇáõzÑÔÔ]×ù<@íEÁž¶=ÉD d>ó_Çñ±7ÿ•'¡k%2>xýð{˜ÁŽZóa„Ãa^ÍþÈ‘#¨ªªBUUb±XZB"Y–áqy,Ætö©ü‘öQÒY–¹Aÿ—¿3oÑ·Ùlü8ézMÄ¿¸ñ§ýeeeiŸÿdpݲe 7ù¯]»GŹsçøœenwîÜ9Kâ€Í ,‡kÐ3Â+NŽ x¿ß¿ßo1ÜôÀãñà¹çžƒSqBq*Ü|?:: ÇÃû¼üã—Q#ðûý|¼øÆ7¸iÿ[Gâ¥Sã7…þÌÌ ìv;$IâúçÏŸçUÂV)¼¯¯›6m‰'PYY ‡Ã‘˜Ï+ …ÐÒÒÂÍÇ¡P¡Pˆ144„ÞÞ^~îôöör®ÐúÅÔF£PÅ¢öìY Y ÿÝÝÝØºu+Ž=ŠÊÊJ(ŠÂÍÿccchiiÁÙ³g177‡S§N!dÕ?~üøMsü³³³Üto†æÊíÛ·óçV^^ާŸ~ãããܼonGIÌlÞ¼™?WÒ 16Ó÷53ôycNš`·ÛqäȃA>ÿ›ÛƒÁŒŸcôG4F!Ùûl;4Fàt: :ðo’$5.æ„|Å 5IÒ&õºh¥¨ªÊÿŠùZR @ @ @ @ >h”444õ¦¼TÓŦØ7¥Þ”·ÿ~†ÁÍÌf¢,Ë8rä75§räÈ<ùä“Ü ¬ë:ù˜´¾^¯†ap3sªþðð075§2<<Œööv‹>U8&ý¥nÂܶm ÃàfæTýÉÉInjNerr;wî´èOOOó1i}1DüEü?hñÏÏÕæÈ‘#5ž« вÅsµ™œœ â_ìøÓûÜív£«® {Fö7ó÷÷÷Ãè1ÐðlF÷Ž¢áÙ†¬&óûutï( Ã×Á¯sÂá0F÷ŽbÏÈ„Ãa477s#oyÚT/p3ýðð0â¨ñ ÐèGíˆ'«ÉÞ|3~ ‘™ÿÚgöð$ªª"ÐèG›ê…ªª˜ššBmm-7ò÷/ô£a¦Á¢`4púˆx"pú9éG<Ììã-ñZÌ£O 3 PUIÓU“¯¬|o>W¯_‡¢Ìðjñ ¾Äå¸ÍÜùÀ€·NŸÆô†«–1Tµ<í¹Õ××ãÚÛ§±îŽ066E™ÁåKIәũ:¼®ë¨Þçë2;¶É 6^±›Ž‰öÑ“liúuuu¸g•ì}>ª7Æñæô ßOfqª‹Å (_·Û# =)­b7í£1TUJÓ¯ªªÂü<«d?55E1P[[³êñ?ú—·àÏ¿ñ«¢Åÿ‰F;ž‰-þm.a)cü=ž=°ÙlØX=‹ “e¼2|$$I–jñçÎãftÚGóÊ–-[péçßÃÌ43ÅQ?"óJ÷3ª;N<ÿüóeM;í8ùÃN­ù0þì#·AÓ4®AÛèºÂ¬¯ë:âñ8vìØÑxìa6wÔÖÖòç§ü°U:¹\–e8;v ²,£¦æ×…~‹Ÿù{!m3Î šWEA,6ŠXÌ™x’•á `Þ&ñmô<\.—ˆã_lSÞìì¬e ód¦…âT FT(NmÞ6øý~DÔœ ;VZöx<¸rå ž{î9444`ttàcFÔÚ¼m‹>Ÿ­_VVfY?þ<4Mãfâ'NÀn·s“î®]»044Ä+ɪàæ>555…B8xð 3òjèÙúB¿˜úgÏž…®ëÜÌ?00À“a)Š‚}ûöahhÑh•••À—IÿèÑ£¨¯¯ÇØØºººø˜ï‡ãÿ aFI¾}Èà‰DJœNçÂÆ½,@ÛS#8ÐÁ¡'"‘HÞcÿ&@Fsl%IZ0Ú H’eûjüÿ®)jkk-ÛHß¼}5þÿ@FJŠDÛHß¼}5þÿ@ÿS0_Åb1®oÞžk²>3ªªâSÏ7â÷ïMžÞ/¿±€=2’÷xˉ¿®ëYõS¯Osk9dÓÏ—ê!@ @ @ @ VΚb?:­­­€ÁÁA<ùä“oˆ#3/ÀÌ¢™Lд-µŠ^¥2µ¿®ë¸tévƒd{{û’úÍÍÍMдm)}s³þôô4vîܹ¤~uuuF4m[JßÜ_×u|ò“Ÿ â/âÿÁŒÿôô47‚ 2‚ 2‚ ÿâÆŸLûÁ`¨KÿÍû€¤¡ß¼Ýår¡§±‡úSix¶qWÜÒ§áÙôìíAC8i´çúIã½y4ô›·+Š‚¥ŸúS©ñÀP KŸÚûQ«z,Û}>àÉ®O†þTýÑòQnèOÅéwBW¬•£~'F=£pªN‹aÜå*+eçuP|()©Ã}o¿hbÙáp`dä”F wˆFA½^¨å¨¯¯gë ó9™×Ét°*õ>uŒ??³a\–u¶ÆD¥yÕã˜ÖÔ Žk‰jòÌè:œ¨BϪÍëº ºnC]]€n>'ó:™Î ŸÏǗ͆q»(-õ$*ͳÊô±˜² ^Mž¦†s9Q^B,ÆŒ%v»Ÿ›ÏɼN¦sÂ\‰rµãÿ·-wã…¡Ѧ:êoxü?·¡¯©çð‡ pu7<þµ%Àô»Àö{ \Ϊ|ë{âiUi].¿& Ó8^I—*Ë3ÃúXç@Ú5€aÜðMtºøÙÝ¿‹½ù¯x¶›½7èG¯MBiÜÀÌfÀ³Æƒ{¡"¾Ö Y–±yóf†Á5dYÆÏîþ]hš´p±yÌn·óJöªªÂVéD]]N­ù0Ükßáy2WŽ$¼3jÀyÒwÎ'¯ OIÈôNú6› ñx¥¥Èrº©'‹6öúP[ê[¨ø—†¾ˆu•_O‹¿{¡cqïªÇÿ?‚+=þÛlAü‹êXõø¯{sñÛÓã¿ùÎÆ/KYãß××صkΞ=‹‹/¢¦¦sssغu+úúú0;;‹²²2ÔÔÔ@Ó48=z]]]ÜÜ …xEhjOcÀÚµk±iÓ&tvvÂápà£ý(.^¼ˆwþã@›· W®\Á•+W,¯¿âT,~¿ýˆ¨ÉÏC2ì¿üã—¡8DÔï³~ýz>î@ÿ€ÅÄOKÿ½_½Ø·o¯nÆn·[’ ¡¥¥}}}˜™I&OiiiÁÐÐB¡ìv;¯jžJ__71G£Q¾]è ý›AnnÎÒž®ƒé‘ô»»»-ýIÿÔ©SPÑh”÷Y»v-Ÿ»»»-IŠ}üd>xð úúú ijjj033ƒ]»v¡³³“'s©©©áÉž~úi óq‚Á ÿl¤ö4&ž  ½½N§“îÒçhoo/:;;‰Dàv»‹ÅpðàA´··ó9ßívóï&GŽA @ww7TUÅÄÄŸÿ©=IqÜ·oš››áp8àt:‰DÐÕÕ•£Åp: ‰ç<’HXÆÈSù€Ó £?HÒ‚a%´­ì«€ƒo_ }2ú@`€%A¢m¤OÛW2úÀÔÀªªªø6Ò§í«ýàÉCÌú´=_TUEÓMð~Þ…Àqà©GNò}MO4ታMN>urY‰–B×u4=Ñ„ÚÏcIý|äJ®ú@ @ @ @ @°ÚˆEÆ|£Z<çUwïÞÇó*è.— áp˜W0Ïd=räZ[[-mÉTM&‚nHΦßÜÜŒþþ~^™Æ¤êJ™L£ÃÃè­­µ´%SõRúÓÓÓýêêjœ9s†WA§1©‚y&Óèää$***,mÉTïñ‹ø‹øâÏ<ó `llÌ2^j2‚ÔýÙÈw¼ŽŽŽœÚ›“‹‘ïx=öXNíß{|ôóOÄ¿¸ñ§jÉ£{GÑð,3å§šù¥=Œƒ¯Ó{,£!l5ô›«g«pÜðlF÷ŽBÚ#ajŠ~ÔŽXMù„í›â'õɸ©ª*jU«¡Ÿ¿NÙ_³Ú~ئ$n؉x"púõ¥“Œ¦ÌúN5iè’i9[b€ˆ'‚i¦7°mdàÀ·‡Ãa %Ìçå%TV> €Øë떱Ɉ^Yù(îúð%ààÚÛ§yuîúúzÞ6´S*º®#”0Ÿ³*ó >q)7ôOë êê¬ýÌ•æm¶‹˜©„QHšÑ3™ØkáFu@æÆ~¶ß‰ª*k?s¥ù YÅ´îIÕ°Û­•)W+þzß0ó?DïÚ‰™„iùFÄ¿Á6ÀŽ×Ôs€ð ÓªzÃâ_³À’uL¿Ë¶]ºˆézZü'&&,UáÝn7œN'3혌ÞdئŠñf¨ =nß¾ëâñ8$IâÆksÅúX,†;^ùgÄã) K°àp8øµ%KèïïGUUUÚuÝnÇ»±| £Àæÿ‰‰ ìõS²,CUUÜ áÄqjš†@ `© o6ô+HÎ_4GåòÔÜÜÌç]×a·Ûy%sÅzjSˆøþ£‡ðÂЗ1÷òø» f.<üG³x敯jü?Þ¶¯…à;2ÿ»ôc€'íW­jüÛ\Þñcü²ÄãÏ;þÄ>¡OÆø“`FY8qâ„%¶t^ѲټvâÄ ¾ŒŸÔ–Æ …B–¤ æe§âäËW®\á¦úþnªECC"j{ß·yÛÒb@Æ|§âÄèè(8ÀMýf³>¾^lýÊÊJËù …0;;‹¾¾>lÚ´‰WÿÜç>‡S§Na×®]ÀÍ1úÁĉ'xõq€UI7™Éü,ô…~±õ‰¹¹9~½ÞÝÝ­[·âìÙ³@[[ZZZ0Ã~6ýÚÚZ ð%sss³ÿÍtüdĘI_Ó4?~œ·‹D"|?-›¯?ηE"‘´9ååå…B·ŒI`Ÿe‘H„ÿư¹š>7h™®-–8’~ÛÈ4ÿÛívƒA‹~¦$‰ù²÷ÙvÔú{áñ´ —ïóxÚq½84â\x?Wø–$«Q?u=cû„Ñ0™ýÛfÿ; HÈÕüOß˳­gjŸªHn#ý\Íÿô½<Ûz¦ö©úSSiú¹šÿS¯uR×3µOÕÇÒô—cþ˜Éýº<µu„_«'Ÿ:‰ÚϳýMO4!ÜŸž q¥˜õéZ5›~°7¸ÈH+×O%U_$@ @ @ @ «Hp@ffª I7¶µ¶¶âðáÖ¶[™Yå]c·I¥|;­wšnžÀ«p¦šVÑÚÚ ifNÕ¯­­E?€¤‘ñOjgÕÿN `1=fÓ7ßÌIfæTýŠŠ œ9s¸ñù #¡Ü&%Ç£õÓÓɶ‹éOOO£¢¢@~ñ_ŠÁUŽÿRV9þK1==½êñ?Ø*íüØ{ Xç?ÀÞ…:ÿwïÞ¿þë¿ÀŒãôÌ•ps5ž¹Ž×ÚÚŠ·Þz‹WáëèèÈØ>Wã9‘ëxµµµxë­·ðÝï~3ŽgjŸ«ñœÈu¼ŠŠ |ö³ŸÍ;þû÷ïϨKï•ÕŽ¿×ëͨOï•ÕŽÿ¶mÛ2êÓ{%ŸøÓ{etï(€¥çYi„Û™·Q²£Ç@`ÏÒsw ‘™%—:×mß”0…©ôv)fJÜÀÔ7³Œ™,Jˆ‡™pÌæýLH'%ÄËxüæ¾”,Àh2€Eî…õúu Q1ž()©Ãô_š¹<õ%ªÇ—£âÒiLo¸Êèfƒ?¡i¢QT•Ž?ŒúúGqßÛoã,üЯ^…®Ðu›¥™ÍÍæòu6àZ\Mrme² EaA4ü UUQ!k˜¼`°С(¨ŠÇJÏc±yÄb’EŸÌæfs¹,óó‘Äk,Án×a·G ËÌj6øº®c~~ª:@³´gño(xüÿô¾qã? ¨ €zý†Å¿Á6Åÿð/*ÉÍ‚Ÿÿ° èlä´ø;;0:àÌï#I’àp8x%O3dJ§Êô±X 8wîßG˜«Økš†ññqèºÎ“!Ð8š¦áÛ?Ÿe^l(Š—Ë›Í†é¹*Ølý|Ì@ Y–QWWÇMëýýýÜ”g6™ß>Ÿªª"bDà©òð6æêð™÷m6~ùï$Ï+2D™MëSSSðù|if)sÂ¥©©)f+1°cÇòãÿ•‡.á…¡–:¼†?hycÿÿ¸´_yè¾öâì¸Ü =‹{ ¯Ãkê9\•0…+[€€jŠÿx•úU;vüÛlAü‹ê(HüË#˜~¸|»Xð£â6¶â¯Ûh,`dÆÉõ7ßÁøe‰ÇÿâÅ‹i†Lók‹Å ( b±b±ß€o3?ív;_?zô(–pÚì5²Ûíøíßþmnª¬†|2áçC&cþúõëÓ ømÞ6:tNÅYTýõY­[·`±+//Gy9û<èîîÆ¦M›° á¹É Àb>¦v¨¬¬úB¿¨údê×uÝ’€’ȹR|&}Jl’M¿˜ÇOŸyfRô›7o†ap:Ð4oæÛÌÆI’øúÓO? €%%À·§™õ s²Bó²ÃáàÉR·¥ŽEëôÛ’Ûí¶lƒyU Ÿœ¯^H®Uø¶·³G‰eàw~ö ¯Ìç<îòô³S]:Y„dæ—˜é?u=[{2šÌl¾\ÈÌ`¿“¥®gk_(}2óO 0Óêz¶ö…Ò'3?À¯=ÍëÙÚJ?UUáý¼‹›ÿ³ñ£GFðÄÙ&œ|J]´]¾èºŽÚσ›ÿ—Ö×ózçé/FR¿ Ò@ @ @ @ @FICCCN7®©†ƒ¹v1 SÉþýû¹s÷îÝÐu›É¿´£,£ÙØÌ»»éÔ¼½s™ðZ[[!Ë2¿v÷îÝiÔ½^/7p677C×unòksËÒÿN€Ýt\[[ Y–¹Ñº¹¹9­’å¶mÛ¸³ººº®ssæý·ÍÎV}$ô“ÛNO³•ŠŠ ȲÌÖÕÕÕiÔ‹ÿJYiüWÊJã¿RVóùOç4% èüû»—fÓô yþÓ9M‰0RõÂé7Ýòü§sša$õÙã«¿J×Ï%þÄ3Ï<ƒ‰‰ ^05Nù’ïxT½–Ú§Æ)_òï±Ç³´Ï§\Éw¼Lñ"ê©s)>\ø“á?_ýþþþ‚ÄŸ ÿùêŸ9s&§ø34 IDAT··³*Ž]u]Ø3²6›ÕL×(==ö0}¯× ›ÍÆûÐñF_GÚ8d²L zË{ЦzÓŽ‘’ (ý°}“íknn†$I¼KlãhŸÙ“6Ž$I0 #m,è_èGÃLCÚót4Z> é$ëCsõR 4ð–xÓÆ¡JÜ4V[›“›È£QV±ZMÒePYù(¢ÑcPÕrÜ¿f î|àD£Ç,ýJJê°°àãmGF (Š‚úúzžð¢nÛ¬»ãhš†p8 UUQ½1ΫÉ_‹³›û'/°×¿z#{Ý×Ùq->‚É ,‘Š¢(¸±ô#Ó:µ}åÕyØívÔÕÕñ*Þ¤¥ª*t]OY“ÕäÉ®ªRâøÙë^ZêÁü¼ª*qCîü¼ßÒLëæ¶¸y…Æ+-õpmÿ߶܆^Ä¡gQâÿ¹ •xM=‡ïÊŠÿÚ`úݤ驸Ó{O×u¸\.þ^7CæpØX= ß« i¦tÃ0øýÔäæÿ?˜¯I–Ò7' ö¹è§&0ÿÿÁ|ݺ”¾9 Oƒ~jò€\MúéRp»¯áþpÆýªªâ‰³MxjëI4=Ñ„wêðó5c[3¹þÿgSO n÷• Ø̸_×õ4ýó{BKŽ›ëÿ>õ|#n÷•àäSÙ³¦êÿè‘Å“XÑü @ @ @ @ >ج)öO>ù$âñ87>›Mšf£óå7M•¥ÞÌReêÍyTÜÆL[%tÜHýä“Oò Yft{{;âñ87>›„Ìè\º,ý?©ÅweÜØÞÞÎõÍ&è;w"sã³Ù¤i6:_~Ó¬“Yo"¡Ïúžž–xUú;wr}³ z±ø‚•Ä¿¬$þ…`%ñO=ÿÿì÷ÊðíŸÌZÏÅßþIºùXYüSÏÿí÷¿,eÔOVúµRÈó_µT²¾¨¥™õ‹?ÅÁœ€aµÙ¿?7#þô§?å&s³z5ñz½}2™S†ÕfÛ¶m\ÿcûXÎñ7ÃɨHÛRÍñ™ŒŒÄrã_(ýåÆ¿Púæøoذó óMéáp.— áp á@{{;‚Á Ün7žm@ÏÞìÙÃchô,)€UšÝ;Š=#{,cy—ÑÜܼès7›ikU¦0¯×ËõkG<hìG›êåsJüqƒ%˜~ Ñ6Õk5æ&îû¯­­µTÔ¬7Å›û8U'bˆ¡¹¹>Ÿ²,ÃéwbÔ3І™†¤y£É`IdV :≠a¦‚UUEç[îú¼VAžLäd=Úl68N^•×éLš²5MÃɲ¶4Œ¡¾¾Þbú§J·u÷—àê/6ßDZ}ûvD"nÌo’Ø£¢(†¦i¨©©ÁÌÌ víÚ…ÎÎNnh>xð`Öþ”è »»Û’ôÆœ|sxx8m?}/Ù·o:;;‰Dàv»‹ÅpðàAþ[‹Ãá@oooÖþ_øÂ2Æl¥æ{ ß z!_#~¡ôiŒßùé$J¶`Ñç@&~i@Z¦s0ó¸Ìߥ)a­?|Øïï¦Užß~§ßGfã6A&þÀû­,}JP}2ñO Lå¬O  ¡ÏMüÈYŸÞ_…Ð_ UUá½×…§9™S€“OdføÄ{l¥èºŽß¿·O=r2-9ábú?Jù]c%~.pý‚( @ @ @ @ AfJ—n"XmÈ€HF¼ÖÖV¬ò9Àª‹S…ñoÿd–ÿ=üi)ã¶Û¤RÞž Ô­­­Ð4-aTÓÕ§›*Û\Fšþøe‰ÿ‘~ê6³>UJ¯­­ÍY¿¢¢«|Îô“ÎÕR‰ÿ=üéÌÛn“’íÉ@]QQ‘³>Å¿,'þ…d9ñ/$ˉ¶óŸSÏÿÅ(äùO©çÿbòü§ÇÔó1‹?°¸a:õõõ–¿|‡ÃÐu=aÚ]ž~UU•åïFëßzë­–¿ÕÖ§ý†a¤µÍÇü.ô­ú6›÷ŒìÀªD›Ÿ÷͸\.nÂ7·#l6‚Á ï‡áv»ÓÆ’$‰sÛT/ßf®ž­f¸‘^Q”4}sI’ y?UUáv»ÓÆ’e²,C×ufÚOlËEŸªHgÒ—e>ŸÏ¢_WW—6ÖëwÜhôJý,F—îBII7£/,°êÞõõõ()©C4z Ñè1Ü¿†å®"s:qçð}ðÖéÓ¼B=ÀL¼Š2ýêUf>·Ù¸ù\×uLë ÿ«UTÈì˜êêê0­³Êó×â#ÜX@•éÍq1›TUåãÓ:ÜSÍçÌÄïäv{v;3"WUU!sb~Þùy?7~PezsÜͦ]×ùø´Nw]× ÿ†^„^ùõ¢ÅŸ*¡+þT =ŸøkšI’ø£$IˆD"ˆÇã|Ùlêß¼y3ÆÆÆ066†‰‰ hšÆçÃ0 n~ûÕ»›-ó!Í“±X ñxÁ`§Ö|áp˜ëkšUU!I&&&`>»ö¸Ýn455¡×B {/Nž<‰`0‹‰i,UU‡qÿ' “e\ÿ{s·C’$Øl6|ûçïòkºö!Ȥo~âñ8dYFUU†.Îà×»155]×á”’±µÙlˆÅbüZÊ<7˜“¼˜ãÿÜëŸÂ$Œü.£+çøÅ½xaèEÞWÓ4¼1øŸÌÿÄs¯ Ͻþ©´øÿ··>‰'ŒüwéÇrŽÿ¿¨¼¦žã}ƒÁ 3ý ó?ñßÞú$%ž´ø«R*Fþ{Þñçÿñ˦ßï«ë:¿N’æB•*IšÛÍ×¢sssX»v-.^¼ˆ'NX>K2íw8…X…×µk×Nœ8‘kÕUJ¤Úll 'NœÀŒñëׯGD@q*8tè Í¡C‡ðò_FDeó =Þ úD4…Ãá@gggÁõ;;; …F1;;ËÍÀB_è[Ÿæ†h4 EQÐÑÑQpýŽŽœ:u Ñhø£™Ôãooo_v,:;;ÑÞÞnYÏtü³³ìw“™™”——CÓ4?~–ñR÷“y`†~8~ü8ÆÇÇ-ý(‘NjÿÁÁA?~œ›òÉ̉D088˜öEê~úþ€_o ¦éÓüŸÚllÌ’dÀL.æû¹ÞOáw~ö æz?µTÓ¼Íü¹´ÿŸNò¿¥ø·ÿT…sÈ:&™ÿ˾Ê*ÆÓÀ*Ç—}5{I’2ŽKc”}Ü”nN`†Ìÿùèó„‰äš¹ègû]•Ìÿùèó„SS9ëgûŠÌÿùèSzÿä¢oþ^RTU…÷Ÿ\i×j7 ]×Ñ>äÎø{æâ‰³MEÓ@ @ @ @ lÖ,ÝDP,È@a6Ô°ô“ï.îéüRüó¯ØúÉÇÕ:ÿéæY³zµ!ñÐÏMßl~7÷‘e™›ßSMž‹™à…¾œf8%þÛíN{ìªëž…¥=ú©R2û:|–1:lèÚËÆp¹\èiìI;>2ìgÒï-ïF¬íÉÐoPž4éOMM¡}feŒvizÙŠ¢`@é·è“Y– ý©ý ý€ßÚž ýº®[ô¼%^Ë^Ù‹~O?àcú£å£|,2«¸xõúu( Óye%«R½°àƒ¦i(¯Ð03]‡p8 סD¡âÒ]Pq÷¯Yƒé Wù®’:hš†ðõë¨OT­OV²×¼•È“ç#Ä×Ù¡ªÌ„NdTt¾$·$Ìêl¿‚i]M¾±ÎÆÌêºnC… ®i·Gò¤Š ⥥è:kCdTb|-Û¹YíwЋŠËÈ2Ý%ØíàšKÅ_Ž~9apþþáí…¬ñ¿·õE`ÿ]ú±„Áy ×ähÖøÃsP“çg¡âÏ;~fp^ð#`GÖøß&•oÎç iR#ÓÝæÍ›¹ŸªÁÇãq8LLLÀívóùRÓ4¼¹íÿÎ<-[¶àܹs$ [¶0S8ââñ8 #Y½Þn·CÓ4fŠ¿ðÀfÃÉ“¬ÂåÛŸø >ëfóÑ÷^ø l6\.úûûámöBÚÊôƒÁ ®üE;ð­^ìØ±/½ô Ë<1ɱcǰ9÷]ššÇñgîÛðÒk"2S‘Q‹½v ß/Ë2¦¦¦à©òåÉ×úíO|xåŸy[»ÝΓŒAÌn·§Ul%4MÃ×´ øJËCxaèEK"„ÅâŸ|o°1XÌ/áÁ‡,æJ 011‘5þý6;¼Ê¼¦žÃ©5Î)þ·†XÌÿ;vìŒQ–ÀlþO$¸ã•ÎN4–G0ýn2QÂRñçï S[¼kÌ[ÌÿtíÒâo6ñ=z°eËÄb18Þ.u&Ìq5MƒÝnçcd?›yN n"‘:;;qðàÁœûtvvrãýR‰¾¼¼O?ý4`ûöíÐ4 N§“·KÝŸ ú¼¤ç-I#Óøô°ÏÃ#GŽÜnfê5Ïÿ©û3Aßcè¹àcd¹Æáñ½“ðx>lr¯ø1¾wÛŸ­^´Ïä|õBuédF|¾T—N–,œÃBìÖ‡wMW«/,ÚçßþS5€ÌÉ Ã(‘¤ª8Ol¿“Åyü­`š ÖaðŠóãoù¾‡³¾K™ÿv½`5õKªZUU…©©UÕ_,I¥Ýn°ªúË1ÿÓuŸ¢(xjëIKâ>UUñÄÙ&<µõ$$2µ_æßyžÚzÒ’ØM×õ¬ú™Ú¯óøD6ýlí@ @ @ @  ˆ7‡κ/ÕLq¬sCZ›LÛR«/f«výýýY÷¥êÿÏÇÓÛdÚ–ªŸ­Rœ9s†/OOO§è'Ðð_þ ÝØ™iÛm)~ÒééiËØæåÅâ_(–ÿB±ÜøŠåÆ©óÿÛ?™ÍIµÎÿñ˹ÇWëüWKsÓÏŠËxt#¾™ñ †‡‡Ó¶™_ƒÕfr2y#~.ñ7ðeÚ‡-ûS×SÉ7þ…ÖÏ7þ…Ö7ÇŸ #?bhÍ“ 1©›Ú×år±1ë’ýžmÀèÞQ˘”°€ô-IÊ-M!IEቸϞnØ7÷å•2“ýkG<4ú-cÒÍö>ŸÏ²N3æø«ªÊ÷“¾¹¯¢(lÌdág8ýND<Ì TYù(JJ˜É¿Òd§eª@ÏŒ<è Ç”CQfPRR‡é >n0¿31¾ËåBy…ýêUåˆF%ž_¹E3c­r¢Òü: Òµø_&S?33(˜‰¼zcœW©W ®Âã“LÀ*Üà•êIS×u”–z`·3#zi) Òü¼Ÿ/“©ŸÅ\†ÝÎLäŠbð*õ²LÁ•}ÌÉ$ÌÏûÇÏ>+H3‹-ÿj€D•ó/Ö–àÉ!_ZüGzBxcð!蕟*xüÃk$ Qåüs*qjZüÛÛ×þ{pUÞ^ðø_º@¢Êym °GÒâÿ‡ KtùvzÍr¿Ífã&9ª>ÎLì&³¾,Ë,‘Ç›ÿŠà…8Ün7ã@ÂÈc³ÙÐÞÞÎç¨þ“ýpJN¼ó—{Z¦çªàv³9q4Þµ_Bss3|>Ÿ«OždÆœcÇŽA–eȲÌ*Ï› çTyžôkkk¡ª*dY†?쇴 ¡ôÿ/ Ò‰_þûFÈ2#…ª2ãÕÔÔ7‡OMMÁn·#Àn·[â\€œâï2º°·xcøóoü .3 ?ûü2RÙÿOeKÆûLøXñ¿K?†{?øÿz$%ÿxIµµ'ÒôŸ‰-‘Äyºtü7ßÁ=w³óþù `«~ùï¿#Žm¶`šþ@XÊ2¶nÚ´)­™ÅögÚ—j˜]¬¿ÇãIÛFçM¡8pàÀM«Ÿ6ÙsNj»5ï-Úf1s¦×&UŸª™÷öö.ª“­ÝJõó¡¹¹9í÷Fêg¢ÐúR˾wÿÞÿŒÿ¯ÿÿÅwe7T?_Óߺuë²ôG±ëìÆKïêêʺ/ÛÜDçp{{;OÐÜܜр‰DÐÛÛËÍÿ¹žÿÔ®¥¥…o£s×|gÚŸi_긹ô€}ûöñeú­Äü›I¦ý™öeÓX¬ÿû…sXû=,±OìòåEÛç‚9 ñ}$?ÇË¾Ê éæmÙ ªó–4ÿæ$…Ö_ÌüO˜“Z1ó?aNPhýå˜ÿ 2·g3ÿ“Ùÿ‰³M–~+5ÿ§êg3ÿ“Ù?U¿PæÿLæþÔí™ô@ @ @ @ `µ nöï߀,4MÑ#Gp°ÕzS1UýþÒÍîæmZâɸü¥eø»—fñä“O&M‹HšO½^¯Exx˜ßà]ý6—°„ööv‹>݈»mÛ6‹þää$¨°êÜ&xøþÒãgÞöð§“ÕÒÉ8}ÿ-^ý•„;wZôÉ)þ«A>ñ_ ò‰ÿjOüÍçç ÁÖ³œ¹²Üóÿ;2¶žQ?÷ÊñË=ÿOOKl=Óù_ŠœÉÿÝ»wóýùœ÷ccc¹ §°{÷n^¥ýÒ¥K|{>çýJÌQÍÍÍõó9ïß{oqÃÓbTWWsýO~ò“|{¶ø›+Ö§.´ªÙ/VÝ0ßøZ?ßøZßz?¸\.̼LïèiìAó –þ©}R1÷‡Ãif3dâ§æÍ—`@éGíˆgÑ>©˜û«ªšfö7C†Ûlú£å£pú‹öYJŸÌþ™ sxIIeù¾·ßÆëwÜ‘¨?c­WV>šhÃŒê×Þ>uw<€koŸÆÂÂU¬»ãQè8–±À ( pùR2•ä™Q|ZWPƒ8¦l6L^°ñŠôøú:[c¢ ‹™Ö¯ÅGP!ƒ/gê°Ä2ðætöDey»½N±˜tj«ªÄ+Ò›×KK=‰6¬!™Öççý°ÛÁ—3õXb»=·øC©þ:36÷´REó»áT õk!Ëë¹ñÇFàj¼ ãøœg à·°Cƒ Çç/YõW!þP \.ñ`›-ˆßPëb¯GH–±Í¦Yôó0ä†sI’`³Ù Iìšbbb‚÷×uï ¾¾»wïæ&ÅsçÎ!=†’’:”Wh˜™v`óf7þ;ØívD"ƒA<òÈ#øáí;ð½/ݧÄÞß²,CQH’„ïÍÝýä?'âƒQb@Z`”(7€[¾ð7ø‡¯ÿ¯ôÛßw?}u/;n·¿þñ>x½¿†aeolü=<ú‘Û iFúñŸ÷w ÏY…+_Þ iAJÄÄn1››z©úŠ¢ÀÛäå‰|>~~µëÖ±¤ ±˜UUÉ„4WÅãq¨?jëð³»×ÿsÒ|¥å!`¨zå׳ƿMaóùƒá¿x<’ŒOõýÀÞ+ÀæÍ›sŠ{Í@} ÿ*küÿʸèó߃)©_úÚ#<þ{÷ÞeчŸ™ßþÄg–Œ¿jw¢±<‚͈àÚÝ Yãÿ¹°mïóP¥4¶%ãÿG›­¤ô]Lx©ñ?ûÿt]ÇÌÌ víÚ…³gÏÖ®]‹M›6¡»»PVV†šš^ezÓ¦M8þ<4MÃØØO&pþüyÌÍÍñ1¨}(J? á3Ÿù ü~ö>]¿~=®\¹Ç“õúòСCPœ Ú¼m8·0-%¹_€_¹rW®\ADeŸ‡mÞ6öå¡oæ×¡Ýø­šÜ¯Ù³éŸ?ž·Ñ4 üÇœ—ùºrï½À@xÉD¤sêÔ)ISnª~KKKF}MÓÐÑѻ݇ÃÙÙYÞŽ'&&,•à ©Ÿ ^¯—'`ZMýŽŽ>o¹%P»Çÿ~Ô7Ï ¹è“ñ?àw'ÖÙçÂR‰hn¢yu±ã7ÓÛÛ‹ææfìs$•X,ƯÆÇdz~Ëtü}}}ü}tðàAôõõÊËËÑÒÒ‚ŽŽì3´¦¦Ñh•••hiiÁÐТÑ(áp8ÐÛÛ‹¡¡!ÌÌÌð1¨}(J? ñçoO`@zûöíãÇíp8àv»ù÷Ž}ûö¡»»ªªbll ²,cxxÝÝÝüµ³Ûí¼}0L? fLÌP]:Yât:†Â·eŒã¡'€%8¨ýD)€v?ÊØv9T—N–Àä|õB¦ý±[,ßÖJq À”£PxÅz³i½ì«Àì¯JŸ‹ùŸ $…ÔÏÅüOP€Bêçbþ'( @!õWbþ7›ûÉìŸjþOmWHÌæ~2û§šÿSÛ³>‘))€H @ @ @ @ n4"ÀMÍ•‹S+æŠçÇ:7àû?0,Ûþ´„Û¤Rn¼0CæÈÔê8ùè›+žÿÏÇ™ùß¼ía @úÖÊ焹âùùßÿAjt·IÉ$‹é“=“þjÏñô‹êù×9¸|ã6}"ý¥*^ßzþŸž–ò2ûç¢OñχÖÖÖE÷SR…¥0›¤óa©ºs­î·\ýŠŠŠE÷çÓ|ô͆w³¹Ú ½¶6›-cÕz¡ŸY¿¿¿^¯—úi{Oc(ìžzNõ÷÷£¶¶–·mx¶£{G!í‘x{Úïr¹0Šdê#í‘`ôÞ3ŒææfnT¡ãPú© |špxxUUU¼míˆF?lß”x{Ú¯( 0‘YÛ7%Ä7øf€Wu6ë–¬`{šŠª7S[§ß‰ˆ'é¤ÄÛ›Í7$P餣ÉÈXuþÚÛ§ñúÌÄG•æi;ÞîÅéi,,øPRR‡……«ð©cP”¨j9JJ4T\º %.ŽzTV2s•Y§¤¤ëlM<³dÕy`„û©Òü:†ro7¬ë¨€/Q‰ðù|¨ÞÈÌæ²¬P ËÀ:[êêèØ“:Óº‚ÒR¦c·ûMæp?ÈØO•æe C¹ÄÛéºÎÍÎv;{Ý…™Íív€3aF¯BUµOêÄbμâÿ_¿²ÿãk?Ľ­/âÁ‡Ðúµ¯HšœÇÆÆpô/oÁŸ7¼a IDATcuââøu|îókÏeÀŸO˜­&gŸÏ‡'+ÕÎ ÿŸÄæñ{öR~}K•ÎéZwjj m.ªvž[üÜܼ°ä”˜Äáp@Ó4H’Ä–PÛ±±1nP'SàÕOü#6¾þ-”úrM¶lÙ€U6 N§’$áù矇ËuÞ&/ó{s·C¹þ †é:äº:ø|>þ™Ðàn`&îÿý¿pðV]´©© ·ÜÄ•¿xŸÅë=~ܲ§ápÜn7?McF¾[¾ð7x±« ë=¬w%“›˜çnUUyt»Ý;XEf§ä$ 46Šy›Õdõ[ÍùÂOð®?»;]gæ$ó¸6› 5õ ÂV©Âý裖ø?óŠ Ý¼0ôe8–øå!–lâ…!`oðØceÆyüÉüÿÆàC¸·õE>æ~ñ0 #·øÆ€ú÷¸Z÷¨%þ^…Íï©çðqï‡pà€ »=ÆãßÞ~WòýàIVž’ð`<·ø‡â2jnóoŽ¢ªÊc‰c9›Ç§ßî¹»4qMàñ'óêµ³*5d¿®²,sÓ(óÉÜüàƒòuMÓøg œ8q±X [¶láíçææ,cP{ú KÝ$÷/ÿøe,Fªù?_®\¹‚õë×7áç£oæ×¡Ýü1×$Ùôš›£(+Ëï{N¨íV¾L‰–¢²²’¿ÞùêkšÃ0,çˆs¹î[©þbP"¹¥™B¿«« ÝÝÝx饗r2ÿRßëõâ·lÙ²oxf¤-/¼€]»vÝ}è2 üñíÀ?¾ÃÖ;¤ ?å¨OÆÿž;’éHÿ °kÙC°&2' ¹©²²ÑhÔ²o©ãæfx34‡†æææœ’è™vveee|2æ`‰†B¡"‘"‘O¨Ç‡¦iؾ};"6ŸÌÌÌXÆ ö4?§î£Ä8”4ƒŒù¤ßÚÚÊ“ôhš]×ùuÏàà t]‡ÛíæãÓ¼@cP{ú™º/N§sá {§<@íÞvžíÅS1'"‘H íç7¹±öcO/s2õçCuédÉÂ9,Ìôo¿‡]ç"ñ»Ì>ã¯V_Èk¬’-Èú\2ö%‰%+½úÆ3™~ß¡÷e>úùÿÍd2ìÓ÷ï|ôó1þ›Édا÷f>ú+1þ›IMjþOe©ýù’š ÕüŸM¿¿cgÒÏÆRû@ @ @ @  Pˆ7TYÒ\ÝØl ÈfÆÏ2¦Þwsê'÷gK°šú«Ð_Þù÷¥e¸M*]q€åê·¹ Ü&•®8 ÀrÏÿûoaI-NO¯ìMM_’¤eâ—Uí¥cú‹ëg26Ùl6Ë>ZO]þ ëgKƪO*³ˆ údêO%Õ,”ÚŽöHý‰Äd“L;f£¿mŠôÉÔŸJjRÛ””qÿÔÔlH$ÀTÆ1ÍÏ•O O¦þTR“¤¶£ý@RB?†XÚ˜Ñè±Dux¶~ׇ/aì¯ÃåÒ°°àKìóp`fÚ ÌûP‚Eñq³ù \.|˜ÞT:àZ4^e%I|¸×Õáq´]„ÏÇ ü²šØÇÌä¬J½ŽkñL^°!‹A×í¨Þ¨bZWUããe23‡%MíàãÕÕ!‘4@Å›Ó3‰êðÉ6¯¼Ê äv{$±/@F,æÃü¼ŸU¦‹±ý”0˜a×Î Yd6ÀÇ«ª¢Š÷‘eÄŸa68ÓòQ°D«fÂ6œiù‰„3jUãogF3óõ-·¹’&¶\ãǹ¹Ÿ’˜à†¸íÛ·ãܹs°ÙlÜx§iÖîú{üÿì½t[Õ™ïý± ’èÈj€É„È:rÓÀÀ$–mH{[¶c-LCs/´]kVc§™r»Þw– wVo;^0¦ÃÛNÓ8éð®R¸S;$”Hpì$@[¶üc˜† ±Ž¬4ÍYGIÊöûÇÖÞ:’%Yò„N÷çéœýã«ó蜭#[ßçYýÞb±ƒƒƒ†ÁÙ§î§/FÄÒH'‰ÇãØ¶M PëîKs®æ–óos}4Jâ$VILÖ¯_OçógùÄõQep …B\ö÷ÛøZì‘H„öövÊÊÊx·ù:²ÊJèƒàPpÂ:YQQÁå–ŵõõ¸\Géê²1MS$°,uo"×™œÄãñ¨¶h4Ê¥ÿýëÜrþm,ËR&õs/ü„!ÀíóALÌ‘®/Íàe•,òXãÿýWoH$hÅï‚>q¹\<ùægøÒµ¯pÇÚÛ½¬^½šX,Æ—®}…kš÷ªDN^س—ƒñä}c>ñQcÂÖN>kÂ+ÿ~;Ÿ¸>J°ÈOÅx/7˜+㪠xÅx/ ÇU" 'oXü4˜Lš“Oüû‹*E€÷zY²çûñP>ÞË¢Dad™¸¦|¼—yfæ¤o#çR?WÒã?::ªª¹<ñÄ@2q…sœ4ªÊsÃëõ¦T{aæuÎ!ûËù2Íÿä“OPSSCww2Y“éšÿA˜îÃVŸéKÙŸ>Àë?\É1À%å;ø°#ŸØpP%Êp¶¢ÿì³ÏP^^®ªrÂX°þ ‹ öÙïýdåñÒÒÒiéÿÍ=ûiyñn6ßøcµï›?«žtÜLég¢¡¡x<žÓŒ?›úù0SúííílðÛ ï‚¶ÞqZZZ2VRŸ-ýX—Ÿw?$öÚ¸÷ëlìòã®Íý.›¾\ª««Ù¿ƱÒôIãú¶L ˜˜¨L®ƒÓ9~§±×¹ö¹Ýne‚ÏF¦ãÅb”––20 ÖÇföÕ«W§Œ5 CiHŸÏ§žË$6%%%)sÈþ«W¯¦³³sÂü¶->ä}ÊŽ"™I àŒ¥ÀëõFÕ÷6¹ç²   æœ*ü[qnóÿÁMGx´Ë—³Ït˜Ìüÿ‰³Õ`ýiþ`gð—?š’ü´ÏsÌæ®ÏÁÿ~aj‰2éÈÄ_H.Ôõ– u½ecddD½…ÄßivOÇóNÞ1ÕøÏ”þTã_¨þ‚ 2Î㌿ÝfÓØÕ¨æI7p544¤è»\.Z«„ÙÉiäwöKÍmµm4v £RmØm¶ÿªÍ«^™PÓ+xJÓ- *€o/iÇî0ò;û9±m›³ –hï øWm5Þ^cS3Z£"¤¿7Ϊ£2qBû¸ˆ‘ÓÈŸ©:©Ó]ÒMÍh Ýtc¯±“ã7¤öï94ŽeYÜ4gWܼž¢¢ã㣪r|(JTß ˜˜æ(¥¥ëÙoíÇïqT´ï¡¨¨Šáá,:v%ÖùLST>ïÉøzûû/!‹áñxXàªMT’s&Þ…iÖFYàªeù².޼åfù²8 \µy«G=_à‚3q+aXï„á<u±|™8o¥A=#o¹aì*.®LT’·ëÅã©$‹Q\\‰iö&Ìé6ÅÅ•ÄbCê¹Çcc2)@/ ç"Y€4©‡3êgŠ`¼›à0<¼öªduó·Á%›&ŒaÏ^@ò‹¿ÿ|„P¼‹†òRUݼxÎ:ÆÎO\ÇÞ°X傯ŒÅéû6ÇæöR["“QsÎ\Á'~¿ý6^¯—ûW–%’9Èõä'¿=Ç—?;ŸH$ŠËåâ'¿=Ç5ñ8ï6?À·0†×ÕÕ±bÅ Uíw÷îÝe²ûç•|-v Û¶ùÉoÏq}B»¨¨ §O­«ÑhT%.qš¦¤A]&GˆF£œ{á't"ÌQeee˜¦©‚ôôô¤$ øÍ²OqËù·ÕçƒeYêœøôÍ™ãÏ'Ꮅâ\ÿÍîäý¦Lv±­Æb/ ï…=-ýŒŠÿC‰d›Úö²ç‰oÿšZ·0úWç†ÞC¢ó8*ÙÅí§xÞÚÇãa®k,xßÿyÿ†D2Œêáò/|§àø—ûaÑ™~sssÊv¡†ÁâŠôþF<’Ý„½yóæ¼ôóeëë_II03­/ijj妒Ͼÿ™ÐojjšÔhŸ«ÏLQE#;··ÑÆÄdÙ˜ ýÃ?¾æVòô{Aîýz#O¿'öoœ[Éá¿Íu_ù]Áú2^¹b›núŸJŸégg§ú~ÐÔÔTðøLúécåüòqíÚµYç“cßYœýûÓçMÿž#IOF–-fÛ·oOé›Þß¹?}ÞlßA}>ßøš5k8åõ²råJNwþó·YÒßÏý÷ß?‡Õ'Àü†W2Îqvûg¨øJ%Á÷G²¾þ|(ZIÑøãî%Éä>±ãâ ›ùÿg«U¿Çaî]¸ßNÍ—KÏ0Œq€l¦}Y…ÞÞ`³ðÛðܱí4¤Ë9d?£#ÿ$ò}ÉfÚÏGßùÞÚl‚ù'ÈtÿY¨¾39Ÿ½Áf¨#ÿ$é ¦¢ï¼Ç´7ØÐQøgº˲”©=ÝÜ/ïåœÌt€h4:Aß™ ,—þL%H×Ï…N Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh.:ÀG€7ª²y<vìØÁó–0ï|ÖLVõZrU1}=§9g)#F¶çNä¾ï|ç;)ÆÉ‡~æ=§~ggç¬èË*yR_þ€wùòå)úGŽáyë’„þ‡}èë‘&,š™Ÿ§ê#pÛm·¥è¿øâ‹@æøÏ…Ä6($þ³A!ñÏuþM•™:ÿa!Sa¦Îÿ©’-þ[¶lÁ¶í¼Îû™0ïoܸQ=ß±cõõõÍÏ™˜ ó¾Ó¬ÜÙÙɪU«°m;¯ó~&’d,_¾\=?räȤñwž€2»{<õ~Êöô¾™(4þSÕO7;J ÿTõßÿýŒó9ãÿ™žÏÐZÛJSO¡PˆúúzÚÛÛ•I¿¯¯OTÔF\3}}}P%ÆÊ¾Ò,Ç …Búúú)æ€Æ®FÚjÛÔvÃh#ÛÍ6F±,‹ºº::;;•I¿¯¯OýˆÞ0 ¡_›Œcgg§Š§mÛX–•¢ï4ÿl°êé0“Fµú¢zÚKÚ©§˲DµÅ`P™ô{zz”¾Çã¡§§EÍe_i®ˆF£X–EUU===TUU¥˜ÿjFkè.I­r,â+bü±HÓ4¹âæ›9óîË|,§¼¢Züþýû1ÍQ"‘–U@iéz®}÷]~7g‡Õ凇w²èØ•:â¦9Wrèüy,Ϋdr|uu5Ç}ÇÃHÔÂDñb·Ûišœ‰w!+Ï/òXôô“¿eYD£¢óW-eñ8–ÇÑ· ª ÎÄ»†ó( £*A€_UUÅÉ‘ö„±Ûó’õx<Œõ>U-~hH˜ü£Ñ(±˜¸Ñ‘æÝn7–ee06Ö›0œÇãc@L%ã…)åÜñŒ‹Ïˆ‡×^$ ÐÒü/«ž¿°g/›Úö²i0GWÐOG¨dÚñ_åçáç—–ŠÆ„Z™ÿUÏß°¸¡n¨üo´ŸÂÞæÈ Äʼns=a_’÷²Òü/«žœ÷Kæè¥ïƒ•Gü‰F£D" ÃP‰@dEz€ÁA¡%ûx½^\.>Ÿ˜;‰ðÌ3ϨuJV>·m»«"ÃÊ• àr¹°m[™é÷íÛGØã3|Â4¹XCåZr °ý…!Ün7”••0MS™þC¡­­­jX·nÿç×'¹åüÛ\ûL;TWÓ××Ç-=‰Jó ÌRv‘1n¨JÆòsCVïu~ޏI<2ýKãº49UUUFUü.õŸ ªJU¸— &dl3Åÿû¯Þ ÆïmdÛ¶¶”sDr€±·W‹Åè‹4 …ð‰{Ňn?–¼&ÖÁU¯ÿîx™0Wõ/¥¡áXʹpƒ¹’?ªþ‘H„7C.±'Ì× åcÉk¢òcSŠ‘8OMÞËsDr€ºº:,Ëb0*+ÍŠÏÞÚ’pòš˜$þ‡æìٳ̟?_%’x饗ؼy3---x½^>þñOhaúܺu+·Ür‹jöÙgq»ÝlÞ¼™×_£Gª*Û%%%ŒŽŽrçwÒÛÛKدÙgú¨¬¬$VsúÒ±Œm ?˜ø=øÄ‰œ8q€Å‹³xñbñ¶æ¡ã_ ðúWrïßž‰&Ã|ÚséïÙ³‡ááa@TÏeúM§¼ã}b› tÓ5ŒûWÖ¾‡NÙ–É ÕÿæÏªù›{våýgJëý—òñkF¨} ùG†––b±˜ú.7›ú‘HD爤"™ö͆þt™‰øÿ‘÷j‚¯Škîé÷àÞËÄcðÕ1**®fëýÇØüƒfEº¤¯sSÑoµmš ƒÖÖVÔy'÷O¦ïÄ©?:*3•””0<õÔSD"µþÊÏ™ææf¶nÝšb|–‰|vïÞ­¾ßÈ$Géí@Êw uëÖeloii!«ïFòs>=éC8.Ú·oßxmI˜á]ðí:ÁO<ÁŽ;æÿp8\ôh—o|µcÜÙퟡ·W¼••ŸÉù>ÌWY†3I€Dÿ!?ó¿½!‘œ­#i⇄‘QiÞYq~á·aõx,iFw²ðÛ¢r}>I‚Á Ò v¤þgºúù$R:C©ŸŸÓÕÏ' @,S:t¤¶MWªIœæÓ4'˜Û|}MÖ±3‘Àiþ÷x"dû‘Úkñ€2‹¨¾~†a …0éž0&›_Vz”¦ßý+'Ñ?šA?s"€©èÏ$Zfοï¿ÝÍ<£˜–ÝöÓ¯«›¨ÿÓàäIfêü_¾Ü©”y¼<’ûÇÿ¹ôeeñ\8Mãù+™@º¡;ýlƳ‘+™ÀTô¦ñ|È•L PýÁÁAV¬X1aœsÛY Íãñ(sÆLè sŸ» ýL´©ê/X°€3gΤŸÍüŸ>NšDãñ8~¿?åºhìj?)¦~¿ßÛ {S7¡P»ÍÆÕ#®Ïtó¿L …”97 A-Ôl«!HP˜tKD ¤¡U²Áª“S¿išÐÁÚ^,Ë"þUcTÄ.Ýü/“HCŒìƒ ]• 1$bQ"b’®_3Z£ô¥©ß4Mè…pe˲°×ØxŠû¬c}t«spþüùªR+—ûLa+¬Œø“Q¨ù„ñâÅœ8q‚_þâ—)mùê?ý—ó™ïº…O\'ÖÂëXÍ¿þ,gã/©>Ùî½ré—––2::ªŒÀù°õþKp׆èß0—òŽìæ'‘HDž ÕßÖ(Œ¡-/Þ-’;ÜøcZ^¼˜üûßtõ7ÿàb]H´!˹*ÇϤ>d6øç2ýÏ´>ˆÄW;·‹¤(žâ"¢cã<õÔSÜwß}³ª?w,À¿Gþ•¯nï‡D’Œm²q{?Ï}ìm掀CSÒž°¿PºµSD8‘ë\$™È.Ÿãojjbßà îžšššhnn¦¥¥…ÖÖVöÕÕÑàõ效"ýøGGG)))¡¿¿Ÿƒª*NÂa±.¥·Ëu¹ººšþþ~víÚ¥Ú ÃP÷#%%%D"Õ°zõj ùý²¯¯ƒFÕ8çk–úÎvù¿nÝ:úúúؽ{wÆv·ÛM8Ví îe²QTѨ¾ :?'&ãÑ.°]%x´Ë§ÊøÊ„;~\üåã;¼•Ò?v<õþ@2™ñ’æÿ…ßÛvÚzz×cU}þô_%·Oÿ<‡Ø/ÇB”NÒ”noÈ@šÿgS?WiþŸMý\I¤ù6õ§’ ÝôŸ¾Éà¾æÁ5üò7ã¼ò…®i™ÿ ¦ÿôíÉôgâïÚé¦ÿBô5F£Ñh4F£Ñh4F£Ñh4F£Ñh4f¶Ð >HC™|îÄiÎpâõzE•PO=Ñh”k?—Ƥë¾ðúü)¦ UÁ˜TÃñï·¾'¡4¡OBÿAúüHJ"€t}YÍ;—þL2•ãÿϬŸOüó9ÿò©\ŸI_2]ý|*×Ïž¾'¯Êõ™ôeüe2 žŒaQebŽÞ”øG ÂcÑ<à½^ñxj”‘s067õ=0 ƒV®\I8ƶmV¬X¡*ä:ûIÓÝ3Ï<ƒßïW‰|¾ð…/»ðù|†¨ä>00 Ú€ƒ»×ëUs½4çj®O$ ¹ÅŽÐcY¬Y³FÝwH~³ìS¬uý ãçÄöíaeïŽvÓ´¦‰HÄ£L.—‹044DCC€š+ ñ¯Wý wý×W(*ª"”0›¦I<'‹¥˜Ò%¦irêß—±Èó3^=4¦Lêá¢05f ñ¸H ÇZ–E,S†/9—4ž‹„ñ¼ãßÒò×47Km_³n/¿Ù};Ï<óLÖøwX5l0»¹fÝ^âv¾»wé”ãÿ?_úoü¯[þ1yâT‡Þ%´îkÍÿΡ…"iEåqêvÌ)ÇÿMnUßñæÅœ³ÇèwgÿPÌ`õ›yF1µ„éÂ7!þ ÌùO<ñ Ì–±X,%ö2Vò}’í™Ìl^¯Wµ§›Xåu ÇISiØ ã3}Xak˜t&3ÿw´w°¡~Ķŋóä“OPSS£öª?U²éËŠÝŒI¾6¿ž/ IDATÄOŽðÀºbÊ;&O€"@yyyAúÛ·o§¡¡Mmâü6 Ø|ãh¾mßü™¸+ðNb‚žª¾$ ëªà…“ÿ‹Ó§OÓÜÜœ³ÿLë···«ç[·nåÀ)ûêëëgUÞ_æÇü4$ohçl‚óÛîÈ+ ÀtõOœº‘F'[Û±ié;“Ö¤“ËÜŸÎu®º:y?›ïñ·¶¶RWWÇÆÕy×ÜÜLSSƒƒƒy™ÿ3II ?þ8 Lù‘H$åuø|bm:xð`J{¦õÕçó©v9ΉsœL*àv»ÕßpÀ„ït²¿Ll&Û3™{½^¯j—}8Ǻ֥spÓ*+¨øJ¥úÂô_›86&†`RRŒÿsïÊÚïgÅ9”Éøï~ÿ¹”ù&K`Ûv‘ÑaŒK㹬2×c©Fr£Ãà9ú”áÜèׄ­Æ9M髯fu›ìI***v™mýlIÊÊÊêšuýlIÜn7t0ëú³‘Àiò·,‹Š»á‘§oþ—L– ýo©R&“ÚæJŽÔ×h4F£Ñh4F£Ñh4F£Ñh4F£Ñh4šÙD'ø°{÷îŒûŠÓ‰D"ÂLawseZeÆò¯ü¯×K¸º‰ÿèûžÚÿðÃgœ+½ÙlégûòÈȈ2#®”+Ó~“]þ•ú÷ð}?Sû_|ñÅMI¶øÏ4…Ʀ)4þ3M¡ñÏçý/ä½›ó¿÷n6ÎÿBÞ·lñì±Çòžc&HÏœ– Aú{öÚk¯]Pýô÷¬ÐøKSÃT“uL7þÓÕŸnü§«ïŒ¿4îÊhŸNºù? ÑH#mµmñú¸ÚïLž$@öIŸÛ4M(É­ï4ß[–Åêé0ÛqýÈÀ®³Õ~g²€ô$²iܧeôO'ÝüoY5ÔÐ]Ò±Ï ZUûÉÒ“dÒ¨*aâ÷RTTÅððÎDezQ ut¤Š^8óîËô¼vžêêj†‡w:Æ¡ú¾óöR,kˆ›æÌRsõ°èØ•œJ˜‰B¡–µ?aD•áMF¢&Е¨Lg‘eN?û«ªªT…zYI~ù2±NÇãçÈ[6'eÌòeVbn8w{æ}_¢"¼'ñ¼7Q™ÞÆíF™ÓÇÆÄþ²²2U¡^V’7Ma‰šX–0H;ǘ¦Ð‘ƒíååæiþòÍÏ$âÉÿmç«›Š¸cíí¼°GTN?vì6Цiþ%â_œ5þÛ£Å4”qƒ¹’7¬^‹'+¾N%þÒüß_T)â?Íÿ˜ÛMmI˜Eó`äœÐü~—YþàÁƒ)ÕáATŒÔ>—K˜Ì«VÍ¡¸7Â)¯¿ßÏÁƒU?Æ:¯×«Lír=’¦nguÝ[ÃïgçÎTUUáñxèëëã7Ë>Å-ç“ú×¼õ+Þ5߯ë­Å¬oå\[/ñÊJ*çT²sçÎýH$Âo–}Цuë¤}_;•~‘Ü$rî…ŸÐåv‹µSVV†Çã! RVV¦Œýé ,ËÂã‰óþùrL³›úlÎú|øÆ}êóD«âñ8¦iâñx°,‹ÞP/>çÆ$?òÿ—®}…ßì¾kÖíMy]O|íR¶ücöø‡Â¶5¶rÇZxèöc|wïÒ)Åÿ]ñ è]"Œÿ¶Uxd’ø¿Ñ¾“Ì%Ô›1Ú-÷”âoÚÝœƒ”„n nè˜$þœI0jKÂtúRâpÝuב‹|*‹O6G®öLfýläcþÏfâ_¼xñ´õ§C6ýÍ›7<×Öû/%~r„ØùbÝŸù?Û{0ýæÛv±õõ¯ˆñ7þ˜¿¹g?›Ú2WwžIýÚ ÙdÓ¦ÿ‰û¾Â’VMW?Ÿûô\}¦«?ïŽ/ðaÛÚŽnæŽ;r'˜®þW~xˆ®G—²«ùcÜÝr*¥mWóÇxgDôÉÆLžN^ýuõüôeyé·¶¶NYpp––@ÜG f4ãçÒw²víZõ/d¬4ÿÇæÞ…{ÉÜL4ø;·ÝK–à^²dÂ~€¢•åcþw’n&—Uæå~HMp×cž£Oµ¯¾"uÛÆVft£Ã “ù¿P}g²€Bõ3™ÿ Õw& (T?“ù¿P}g²€Bõ 5ÿK¤é_šú3%°,‹Ï[üûaOw¬×ÏTâ_QÎó?•Ç¡w 'güû¢·‚u€LqýL)þ%ÍÿóŒbÎÙcê¾ [ü£>V ’a)ññÅ9zô(÷Ýw‡æìÙ³€¨–-«E?ñÄ´¶¶òÔSOqúôi.\˜³ÿu×]—Ò  7ÄwÓ§žzŠ’’FGG¹óÎ;éíL‹/æÄ‰TVV’‹ç2ïïØ)Ìÿ<ð@Æv©¶Ä#ÿùêßû·gyú/çg}]÷þíÙœ¯;›þáÇUŸH$’Ó¬ IóÿƒÙï13qøða"‘ÃÃÃ@Ò”›¯þöíÛijjR‰9@˜ÿ[^¼;‘ÈÃH1VÏ´>À#lbç‹Å9ÕUA0Ì»*üLèO‡™Ð?ùôÔ“ÅÍ„~í<²ÁfWóíÌ€óE7𞽓žÙô¥_®!¹ôû^†ïš4ýŸþ»ìú¯¿þ:ÑhtÊÇ_WWGgg'n·[}_s»Ýjm“íÙÈtüO=õ‘H„ææföìÙÃè¨HäTRRÂðð0¥¥¥<þøãtvvÒÒÒB,Ãívçì¿víÚ”¶uÍnß¾–––”ׇپ};[·nUûÜn·úüرcÁ`††µÆçê¿yóæ”6™ Ä÷܆† ÃÀ¶í ë…Ïç_³fúN÷¥/}‰'Ÿ|’üàÜÿýãáp¸èÈØòqÑ{9ð ÿÆ+Ìo€GñM0üû‰$…&p¿ÿœxbæ_ðÎò·TÛ;$Ÿâ}ñ:6÷.µ/_ó¿aãö†ä¹-+ÉC~ÆýLÈDÎíl}ƒÁ ¹ô'3îgB& pngchh(§þdÆýLÈDÎílÄb±œúS1îËD)ÛÓÀiê—÷äÒÜõwû î‚}ì›ñjê—ÃtêWÜÒŸ™È¦¯Ñh4F£Ñh4F£Ñh4F£Ñh4F£Ñh4³Nð@C¡úáÚŠ+Â,¹J.Ò öéF gŸs¶¨N(«;Ǻ\.lÛžðã¸ÙЗU»¦®ÿ!K®’s§üçeø·ìs.ñJYíÜ96]_©3éÏ…ÿ‚~®ø§Ÿß;ÝP“ ¤ž|ùèÏd‚€©èÏd‚€©èãÖ…tæ7ÿ7nͤb*úü6]£ùý€|ƒß&~FLGÿ¦Kmº¸$/ý›.Í$Ä©ï4ùC2)‡ÑhÐÝÖMcW#íííÊ< ÍýÝ›º1 5¦¢¢‚šm5’dCVjušìA\?2~µ— V=Ê< ÍõÁÚ^\?2Ô˜²²2*º*'$Ȇ¼žÒûHÓŒ±Ï ¼&LÍh Á`P™ä¼áÊ0Æ>Cq»Ýøz}Êè?™¾³:ç7ßLå»ïòæå—Âë÷CÕMEÀ1Þy{)£#^L³‡ÒÒõjÜÈÒw(*ªRÛãã=)Õìå¾HD˜ÜÅñJSûÎÄØ¦iR÷0dº3QmÊË?Žœ‘¨Éòe \µJOV¯Oß–Õìå>g¤©}ù²®ÄØÑÄuàA\ž„‘\VµsÆb>L3œ0ž dõúômYÍ^îs^^ÒÔnš½jìdñÿðµmʼü䛟¹àñŸg *órw)óº\.ñxœw£ÝT„\!âñ86øùÙ˨¨}].·†‡à翇iš¼4çjÊÊ„hhˆžžžÄñ&ƒ_¿¦¯×K__??{wý×Wèïq2M“x<Î¥—÷"¹‚4÷Kƒ»eY¸\.¢Ñ(ןüµš×ÙîFÄD®£Îu¦Ò_™2Ï"•wü¯YצæùÍîÛS’úhÆ$RÇgú” ¿ý¡¡!îýÛ2àù¼^g¾ú€2/\˜ûÞqªæ'¥¥¥Ê\¨~kk+---´¼x7n7l}ý+@ ÃÈmþŸ }iþt÷BÝ bëý‹€òÒ®þL1ý¯läÇÛ2'"+*ú€çó85§{üv<ØñšcÏk@þçcº¾4þg«.?SÌŸ?Ÿh4Jii©2áK&;þ††|>455ÑÚÚªe²ÍÕ«W+s|.œÇ‰D‡ÅZ0::JII ýýýY}^öF£Äbn·¸ÆÆz±,Ó´‰V&ú %âj`š½Wª¾eebœhæsËsŠ÷ÄÀ4Å>Y}^öÅbX–9iüJ˜ÿÿüï?À4/|üÊ…Q÷‘®ØE‰m‰xÝ¡™ÿàà †a000€×ëUF~‰4Õ¹ÝnlÛVæ;Y™^Ö âñ¸êç4B¿xÙ­ÜöÞeº“:ÒD·oŸ¨–yàÀ~³ìSü™Cÿçg/ãš·~E àërƒçßVãâñxâý³ðx<\ïŠâ”™ÝåïãS¾2¾;ÅŽ;ˆÇãD£Qü~?ñ¾_ÑÏ% ¥Ts@™õ=‡x<®Úå\òXåçˆËå"+ý½êO¸åüÛ*á‰ì'¸Xàš<þÒàÿÍo6ð?>ù†J°åòØ÷§Ý~Œ~û® ñ{o5ðÜ”ã/ þÐݽ€×JðHWŒk…VCùCFÍ„øÿQì Óz___Áñÿb^‹ Ãd9½êû]GÈH$ü‰,£fBüçžBÉ„7Îø;M£óçÏç‰'ž’ b±˜2”E"Ün÷¤ýÓÛ`b 9À“O>)âZSCww7“±¡~CÖ¶læ@ü}¦/e!ú2ÙO®öldÓöY‘\¢¼¼œþþþ¬ã§kþ饗a@žŠ¾¤¹¹YU.TEòÙÔwšÿlþAþæÿ™:~€­[·ràÀ@|?šì»ÎLèŸ{á'üóð•MLH°lY)Ï?¿ûî»oÖô§K6}¹NTWW³vƒ5À_–ûÜï"{ò±©CC>ŸOãéÒðßÜÜLKK‹“ž “~8ÆçëAII ?þ8 Ìù‘H„H$Š+T_Ã0&íŸÞ&_¿D®ÅÒü/·Ýn·J4&|?•sOÖ?½Í9˜0_âõ¯Y³†û·'ý89õÇ‹™ûáòŒmé<ýôÓÜ{ï½ö?ýôÓÜ{s&aàwn϶mƸ8wŸC˜Ï³™÷Ódšç®ÇržI“TTTì’®ŸÍ¼Ÿž0 ÓÔ:&ÿN3œ¬`ÇU{pÊQ…Ö9ÎívóÿðÊè-‘ßIÊÊÊÔu/_w PUuMÓÄï÷¨5Ͷm¢Ñ¨2zÆÆøùòOógóßS ä8—ËÅÎ;S4Èc’Ïåëpÿåë’ú@JûÇ߉ðáª['$ ÉäëÏiþÿîÞ¥)ñèöc|wïRÏð·¸#‘(ã»{—¦ÄííÇxaÏ^úŠ Ž¿4ÿoï/N‰Cùí–[½þ¹¡Ü`ŠDí–;%þð†5À›ÜZpü…ùõ¹/ã_[¦kÔ§â¿ä½^ÍCõuÆß»|Œ‘s0ø;ß„øÏvÕíÉ8}:¿äb§/cÇ9øËâb:Ú;2ö±ÂVVóÿG•B*Î?²Áž²ù6غu+±X,/óÿ&œæ'ù$˜ æÝñe>·àKœºi>îž—‰UÝÌKùÉ ¢ÿ‡DKK @AçxKK ápxBÍDlÛ.’æw[Òü_šeý©qøó±üÄ=1Áü/yú駦¹¹™\I2qdly^«ÿÄ¿ˆï¸…&0 CÍŸùÿô_¡eÂg»³’}¶ùœÿpÞ äcþOׯ¨¨Hiwêg›Ïùÿgòœ|Ìÿéúeee)íNýló9ÿÿà¼ËÇüŸ®¯¾dÐÏ6Ÿü>•/Îécsµe£Ðÿÿ8¤'®ÌÕ–k¾BÉeô/4 @¡k€F£Ñh4F£Ñh4F£Ñh4F£Ñh4F£ÑHæ\ì 7¦mvìØ! £(F&Ò ÷éÏ9ÌøßùÎwÔî\.?ü0 LNýÎÎÎYÑohhHÑ—?P^¾|yŠþ‘#G„ÑsT:³ë§þÓŸ ýdÿÛn»-EÿÅ_2Ç6($þ³A!ñŸ ‰>ç_¡Ìôù_(3}þJ¦ø¯[·ǃa<öØc3¦•‹-[¶ðØc±qãFúûû•þ…2°ÈŠ™uuu)ú¯½öÚÑ_µj¯½öË—/çÚk¯4þß;pšæu†XSG3vQÈu÷{²Û GÈà‹§ Òïe7ŠÿCÜL"!ƤúÉ1ÙpÆÿÈ‘#TTTè ÐZÕJSO}}}Õ_V»–fKI(R†L¿ß¯¶A\_r¿4&Ô××ÓVÛFÍ6Q¥Yî/++#0`{I £ômÛVÆM'–e)}Ó4Õ6óªÜ/ uuut˜íTtUÔ~·ÛM]QíãíÔÕÓÓÓCUU•Ò‘†ÞLúUUUôôô¤lƒXÇä~iL¨¨¨ »¤_ªª*Ün7 .†òÒÒõȤW^}ŒwÞ†ž×ÎS[kPZZ²_ÊM³‡ýûCX–xmÉ“#‰PZº^m‹êóâý{óòËÕþ®Zõ(Ùå:J<GÞrñÉ›â,pU¥ì—†òåË,zz¢Äb2I@ÒÌ âU«¶—/‹3¦„!—Ku-.®TÒ#²Èc1E™Êe±ßi834$ªÌ§#*§V:Žß&›hÉÿÛܯE|gÏIJKÿšêÒ ÿJ†ÀUʳdžYàYO•çÂÆÉ©^(‚à8_&Úf#þÒ@¾r¥0oÇb±”ª¸+W®$«˜Ú¶ÍêÕ«U5Þ3ï¾ÌèˆW| à c.—‹S†‘RéÖ™TÀív«õB>Æãñ”õÇår©ñ===ìÛ·7288ˆaôÒÆ‡¿ØLÝgÅü/͹šëÉ<?Ÿs5ןü5¡“¢Ýãñ ‰ÇãÜzë­Ê¨#×iÔwî—÷,CCCÄb1êêê”a^&b X\.ÑhT™Ì?L¬‹gR—Ë5iüA˜÷]F“е«öÀCkoç‡ÁˆˆùyaÏ_pÇÚÛ Œ·Ñg4ªøw/PÔ8¥ø3ÞËÖ¦¹^Åÿ³f„7,¨7W²MÅÿ¼Ñ÷=n0Wr-À¼UÅ?dý¸uJñg<ÌÈ91NÆk°ïÁ IDATõ›‘sâÞ88ñ7kàd7‹æÁŠ+ âSñïÊÿ­[·²páBÊËËUÜŸ}öYš››9|ø0gÏž`þüùªýºë®ãðáÃD"†‡‡Y¸p!§OŸfóæÍ¼þúë=z”òòrΞ=Ë7Þ¨ªÅþóŸO™ã©§žâÎ;路·—°%®1Ÿé£²2yÝJ~P ‰xê7Lhχ'NpâÄ /^ÌâÅ‹òÒŸ ²éïÙ³‡ááa@T_»vmÆñÓ5ÿ>|8eûºë®+H?Í›7_TýB™)ýB{¦õϽðžá'bãg‰ÿ÷ÂéO•‚¾s=ËG*É-²ÉtüMMM¸ÝnÊË˦´´”]»v±}ûvöìÙÃ訸§+))Qík×®U¯Ù²,µ¦·¶¶ªµ¶¼¼œÑÑQî»ï>•àî»ïN™£¥¥…ƒâõz ê;ÆîÝ»éììT >@|nÈöÍ›7³uëV,Ëš\Nj•¤¡¡H$ºuëRæhhh µµ5c¬žÊ`µ_øö~N_]qÌZÿ9ZZZ¸å/O?ý4û÷ïç·¾À?}÷¯©®®N$Ìžô=ÌÄòâ#E=€lŸ*ÙLúiî¿ë1‡±a6·±1:ŒqÛ¶‹ŒcÜÆæ9ú&´åš?›I_"ÍýÙôƒAñº#Hº¾lËE6“¾Dšû³éu ‰ïÔCôe[.²™ô%ÒÜŸMŸŽÄLÐWmÓÄ4ͬÙVh€BðxÞÃð0XÖP‚iŽRTT…iö&ÕÕNSލJ?<Ü“0ª“R­Þ²J¸iΕ`¾CWWÒœº|Y<Or¿eY,òXœ‰Ã‘·lÀ•0”›,_fqä-·J|°À`]œ‰[ £:)ÕêE5z1öÕCÉëÉ4ʼnûê!·;y=Cs˜“#`Yc@²Ú¼i†±¬d…Iñ1âÁíîel,œ0ª3¡Z½Û-ÆfŠÿ—®½ €?ÿû¨Zuáã_ã*à‘®Ë—]øø/9%¶;B"γÆœµFHƒ}$Áår©ç†aðÌ3Ϩ¤)¾ÿ§Øv„X,ÆþýûÕÚ²råJb±˜ú¼p& †¹ƒªDÀår©ÊìûöíK1‡¿4çj.Gܧ´¶¶âv»¹åö)‹ÖÓyâÿ×ÓÖÑFM F™Ëãñ8—ïû',`ýúõD"þõª?¡>  ±sçN¥'MúRS&&‘ft·Û­dyÿw.½b±!âñ8½¡^|†O½æx<®î×***Ôý4¹ƒAª««sÆÿ…ὄŒ¦”øw„jØ`vó䛟áÃ÷ídü­úö.塵·3ööÌÄ®k€w<ëSâÿÓ`Œ/VœæÕ9›(‹v'ãß7F nêÍ•ü#0#ñ¹Ž_V™ÿƒÇaõ›×ÿc3—^Þ£âßý[ð>jK˜WåÉ-b±XŠIíìٳ̟?Ÿþþþ íÏ>û,±XŒ•+W200 >SæÏŸ¯Ú%ÎÄÎ9œ‰1|¦°VFüÙàĉ,^¼˜'NðË_ü2¥íbë—––2::ª ¿³‰LÜ õµþGIxxxÊæì|ëY$™ðw„‹uüòó)§%¾ÑÑQJJJèïïçàÁƒ)í»ví"‰°zõj<ÈŠ+‘( ‰°k×.5O8Æçó©1rŽp8¬¾ûE"¢ÑhÊ÷[¹V÷õõqðàÁ”öÝ»wFÕwù¹åv» ‡Ã)'’šrŒœÃ¹þ{½^²§ÌKòw‹sóóÏsÿý÷«êÝ>ŸOò›››SÌÿ%ÛÚp½‘;ú–JÐÜÜ<­ÊßË‹’ h%³ZI\šÿ~›¤ùÜaöϔԾI“ L†4ÿ;õfÿLIœú“™ÿ'CšÿúN³¦$NýÉÌÿ“!ÍÿN}§Ù?S§þL˜ÿ%¹Œý2 Àl’ëoÕ2 ÀÅäbëk4F£Ñh4F£Ñh4F£Ñh4F£Ñh4š? t€ÎŠ‹éFHi˜H7Á{½^lÛ&î©'bÒ=©Ž¬J ©?¢ûýÖ÷$ô¬/ÍÔ¹ôg’©ÿfý|âŸþþ¯[·nÊIfâü“Ø‹¥¿hÑ¢)'ÈÿôדŽ3›|ô³Åõb?À÷œ¦yÁ7n]È÷d¶*|ãÖ…ªïLëw„ ¾Xqš ~›ŽPæJ°ü6Pœµ}2ý\çõ¡ nÆæ¦Km}yþ›.µUßB…Btoê¦f[ ùýv&pâ÷ûéëëS$ª˜ÇãñŒc»DRšm5ª¯eYk{©èªÌªï4á;1M“¾¾>õH¢è¹mÛÇl°DRŠ®JÕײ,ºKºñõ ólOOOAú===ê‘Dñâh4šqLͨH*àëñA%T­š£ªÐ廊¨ ¿FÆ{ðU±àr/Ññ,:v%§¼^@IJ´t=gÞ}™è;â=¸öÝwy^FG¼Œ÷PTTÅøxÕÕÕ ï$ ñ±Hë| ~¿Ÿ+¼^NE",_¶SU¡?ïb$jâñˆjï`²ÀUˆý‰#dåú.@œ»eñ8ýô05•âÅcUUgâ]ŽdÂä+â¦Ù«ªÐËjæn7¸ÝaÀGqqn·Ø/†õââJÜî^ YÙ19>¬ËÊÊûŸXÌPÕÑ£Q¨[›ÿ‡×^Å {ö¤¿ÿÂÇÿóKKyà 4ÇÀã¹ðñ¯(‚‘spl®ˆëlÇàØoSœLÒ!Í%‹",¸üf"‘ˆ2ÙÉ{ýû÷S]]­Æ|á _ â¼^/^¯—x<αßþœxÜ«Œì²-‰ÐoÅíkßKs®æH*ÒùüY.ùôV \Ó÷+kÖIÐÿ÷â&k©¯¯ççg/£ic‘HÇ£ÖĪª*¢Ñ¨ÐˆÖðg~C­‹ÿzÕŸàyëWÄbÝ€/åØäº!®–e9’,ˆÏªÞÐV*ý•”••ár¹Tòë•Ç㡬¬Œh4J,Ö­ÞCy¿%#Wü‡¯¼ ãrcBüCèËÿï¿zÿã“Ïñdì3ÓŽÿ¯½TbLˆÿ;@{–øwÇ=ÔÐM°¨rÚñ?6W¾Oÿq`0KüûñPnwÓ_T9iüMÓ$‹áõz‰Åb)ýùóçóÄO¨÷C¶ªÿéÓ§Y¹r%§O§Þó8çI“¼ÅcØ ã3Åk³Â©Ÿo3ÉâÅ‹yòÉ'¨©©Qû/¶¾¬Ê ©¦ØÙ@&f(//×úZ?£¾¬(1ôÓïogçzæL˜t1ã¿bÅ lÛÆçó‰DR ú%%%<þøã€H`#ÛÕ?‹±zõê ï—sžô1r[Þ+€X›e2§™ÇŽ€øUUUj¼s¿SQQ¡æ•4ºS ã ÌåÃÃ;ÕóH$B(RfrQU~T‘]]vÂT*ÚœæiçÜ’ááô÷_’ba.?ïRÏ-Ë"*3¹¨*Ÿ`6õÐn·;¥MŽwÎ-‘s9 ã Ìåcc½ê¹0ÐÆ”™\T•·'˜Í-KÜã8ÛäxçÜ’±±^*+Sã_A¿8_)¿(ñ÷Ÿ7m¡9ÆE‰ÿÒ÷EÛ±¹\ø×Ô$«ËËd?À„ç²Ún,#‰(C´Óh'“ÎGÉ>‰0V ¾ÿ§ª’=ˆD!/͹škÞú¦iªïC0Ý˪ô444ð“ßžãú“¿&æûúú)¯Ùårñ“ßžãË< MÞéîæÒF(³“k $ï¥aß©ï|>44¤>‡dbYI^Þ'eKfYóÃa. ˆøËêöëׯŸ•øîêçøç·ïº(ñ/³ÅgÌQsQâo&ô-£&gügËè›/鉜L׸'šÒ¸ ¡¿paöïåǯõ?zúrýC=þŠþÒœîóùÆ7nÜÈð·¾dN0 |þùç¹ÿþû ‡Ã)¦vŸÏ—ñïè?÷}VêSûÒÇþ> “NS¿lKߟùþÿA&úοIȶôýùïÿd©ï¼6e[úþ|È÷ÿ2 €Ôwšúe[úþ|¸Øfý?ôÿÿü>®F£Ñh4F£Ñh4F£Ñh4F£Ñh4æ£NðH°eË i4Ù±c‡ª6Y[ž0fžQÌ9{Lí%™ øòyËn›-[¶`Û¶:fiŒ®¯¯OÑïììT?$œ)ýŸR__Ÿ¢/Ñ«V­JÑ?rägΜIè˜A_˜ûç¥yú3%Ï_1XµjUо4FgŠ? ªxI“Kº9&[Õöô Dr¾BâPWW7#úr¾Bâ°|ùòÑ—óÿ|Îÿ¸¿>/ý©Ä?Ÿó?_ý©Ä?Ÿó?î_•—~®øoܸQÅçûßÿ>¶-.¢¾¾>µ6ïß¿ o#ºŒëdómܸ‘cÇŽ©ø455eì/ ùþ¸[Æu²ùêêê8v옊Ï=÷Ü“±ÿûï Wh¾Fty^O6ßòåËùô§?­ããäÈ***èÞÔMͶeþ—&~ç>çñÉX¤“ÈýécœÉ@$(++#XÛKEW¥2ßK¿sŸD&&ŒSz‰ýécœÉ@$p»Ý„+Ãøz})úÝ%Ý)û$Nsqú8‰ÜŸ>Æ™\ f4#§©Ü²D¥x¯×Ëð°¨@ÅÍ¢Rýï^~™S‰ ÚgÂç>Ë*á¦9sRú˾–U’òšÆñ#o%+ÅŸ‰‹ ôÒ,!Ç8Í΄Î}rgÙ÷È[®¬Ó8nYÉJñ²²|úç­sw& pî“ó8û˾–•j˜1ÍQ*è'HùE‹¿ÿ¼MhŽqÑâ¿ô}aþ¿Pñ¯««cÅŠD"µV†mÛª:o<Çëõªç²Ÿì+±m[Mßïœ×0 õ^ìØ±ƒ5kÖ …T\åýÝš5k°ÿöÞ=NŠêNÿWõuî3 àp¦x…¹¨QQ@/‰Ñ0c..jc²»&qIÖݨY4®kŒ®£‰Æ|I¢F@@Qèá*D¦»™á:÷ûô­ºê÷Gõ©©ªî@‘Ñý¼^ýª®:ç|ž>ÏôTwu}žÏéè0Š‹ˆç¢ ô&tvvçóùI˜Ë…þâÜR^^À’%KL«Äë1íPûwMóßÌn„²?ÇÍqÍÅ|>ß'¦ÿÏ®h`ùŠ×x³sÁI×ÿæé*;‚[X,=éú_6,DsTo[w 0­þþóŸimm¥¶¶–Ÿþô§¼ÿþûìÝ»—éÓ§ÓÓÓÃoèÿ«¢ ôÏRñ~úÓŸòüóÏÓÕÕE~~>7ÜpCJ Ñߣµµ•¶¶6¾øÅ/²y³þÿ8zôh:DU•þ?|¢ ¸‚'Ô?ûæ/˜o9>üùùù|ðÁFßúúz®¼òÊO„ÿƒ> ¾¾ž}ûöðÝï~×8žáÏð þ¯}íkŸH€øÅ9!77÷ÿûï¿Okkë§Jqîôûý,^¼˜çŸžúúz¦OŸN[[ëÖ­0Ú@/($>/^Ìý÷ßoœ×ÅùØCô7Çèêê2ÎáííílÛ¶U«Vqÿý÷ …¨¨¨ ½½Ýàm€qL¿ùæ›B<âõ-F{{;<øàƒ†·¬¬L›3gŽQ,®´´”iÓ¦±uëV¦M›Öüo´¿ÅgÙð[XX¨AÑ{ÛñšÿáØ @ÿï é~‡0_“Žçþƒø?J÷iþÎ{<8žûæïgéÚŽ×ü™C}ÿç³|>È ƒ 2È ƒ 2È ƒ 2È ƒ 2È ƒ 2È ƒ 2È ƒ 2È ƒ 2È ƒ †Ρ~ô€aŒ¸lX(ižï7Û›·•§££#Å üéäO¤ùÍÛÁ/Œ¢éø…ùú[æ×=Ðót&ë㙿0ÿŸþË/¿œU«V¿0ÿŸ~a´=ýöþæûcáÿ(úŸHþ¢ÿÑÞÿÂü,üƒéÿÔSOñè£ýÆp;fÏž èÆò£™ÐŪóÇOßüãÚß0;C’·XuþXâ ãûõ×_?h·[_º¹¹ù¨&t±êü±ÄÛ³g{öìÉè?„ú‹× XÌÿ@€Kº9]ûE?ñ¼ãÉŽ´ã.ýÝ¥F1Î<tó?$—Y ²Á`Ê nÆPóJžuuut~Gç·¨|£Ê( ÆÙW-xBçÆ{œ²`™…ßlüloo§cÎÀüe›ËŒ"f£Ùð]¸ºßü6F4Œ¤¥´Mkcx}=-¥Õ@ ¹j¼n”m)-¥yßR&L˜Ç{Š‚/ÙÖÝ·ž¶æ~#:èó æ1¢a$A£ÿ¾}5ŒhɺÒï0¿þ¯Q Ó¿ÝŒ ï·&W·šÌó .£µµ•)“;~súÓ)XôqDÿîN}µúý“¿Î¸7­†é_GGR§2 =¹j¼Õd.ËU´··ãóuýæt³÷£¿ŸGôWÕPò˜àkÇç³êßÐ0©´tÈôßÔY‘|>4úoë-ƒ^NšþÂ^ZZj¬\ïpo§´ôbÃp,æta 7+Ôoݺ•9s‹h:2Þx="®'΋ӦMÃçóÑÑÑAyy¹ñ½ ®p s¸Å0œ×ÕÕYÌOÅÅņ9]ÄõûýÜ|óͬ]»–ºžš÷t_×+=^.IÆÍ.¾Ÿï ^zi \wÝu–âæ ÅÅú¹OÎÍæ'³\ µµ•ÊÊJ‚Á óç—Q[ë0æ.LFñ¾j¦L~‘wßÓcUWW¢ú?·»”¯„å+^gvÁZKï;©úo*}°#¸•«}õôLþ÷“ª-ÅL÷l¦9 3ÇvRÿ)EÿÜÜ\öîÝkÄÉÍÍàå—_ÆŽÜÜ\jkk ƒiÍnõõõic”––¯_Ä0›:…ñ~Ã;ŒX„{"0iÒ$V¬Xað”ùÊ þ§0ŒÁùùùÀ±{:TVVZ¾ûL˜0¶¶¶ †?-{{ûIåÆsŸO‚?77—ÖÖV&L˜`˜ð†JÿaÆçMóþ_ÿú×”8Æ £¶¶–mÛ¶YŠ? „B¡´1ÊÊÊŒÏ*cݺuÌœ9S/>ê?‰}QÄÎŒ¢¢"ü~¿¥ böÂÐoŽá÷û©¨¨°Œ…BÒêÕ«5¤fØ …BÒ`E>ëfßÁ þÅü¼ìâDþ¿ „Á þ'ªXÇ`ÌàÿQÌÿdAdAdAdAdAdAdAdAdA|v‘)ð)€ßïúW~’æcŽÛl/Ɖç´lçùôó“ä?.zcœx.LÓÇË/ŒAf˜Wðl•Uó¾ùX†ÿľÿþÿÍO’@úÆûí·LbCºÄ|;Ž'Àƒ>xÌ}í&êàÅ_<æ¾¢hʼnŠý‡ZÐÍøKXÛÍX²dàqöcÅ.x¢UèìFý£ARHwYê1cÿ2k×ÂÕ…l!}¡‚£a `-n0Êu£y à<§“ftSÏ„ ó’Fójöí[ŠÏ’Tm˜Ï‡××óž2 €`ðMfÏžg)þàóµ!IÕhZ 9_ÌÌ}OÐRZO«á@&C¹Ž~ƒQg²°ÁeÀICùL™Œñ\˜×÷|X]CuõeÔÔÔñ„É}D±^$aDëŸhÆÇ”É46c2”÷k¤::’¯¥Š¢"a4ߌχñ\˜×ƒAñYPÇĉU–¿»0¹…,+Ú ÎŒþC«}}½±âlYY¡lÛ»Í_^^NAAeee†qY˜æêëë),,¤  ÀXi·éÈ9)ßßÇW¿6‘š÷4Ö­[Ggg'[¶l¡¨¨ˆêêjÝØW¿€Õ5« -&NœˆÏçãœsÎáÍ7ߤ¢¢Â0ÔÕÔÔ0gÎ|>~¿Ÿºº:jÞ«0ø/1ñïÿp ã&‡òóŸëxðÁ)**²˜ÛuþU?a8÷ù|ÔÔÔàóù S¿Xyµ¸¸˜`0H{{;µµýßoÌ+Œv…_‡ý×3þ&Þx£ƒU«V±`Á‚OTÿGß= ÏÒ_Ë迆‰P¬›ÓZ‡@ÿZ© ¼Iý[SõÚ§ûœ(**²¬lûÌ3Ïífj}}=EEE)¦T1VümÍ1Äq€çž{€K/½”5kÖðIAüË|e–ãCÍ/ %LŸ>ÚÚÚOŒÿ­·Þtr†?Ãÿiáç„Ù³gX4ì“äÊùïÛ·P(d)ýßÌç·~Øh/+ë?‡„B! -ÇÌ1B¡Ñ&bˆãíííÔ××§¬Ä-¾šÍþ¢`oæ±3Ç0ÏAÄÇíø¸&ýϺÉ?ƒ 2È ƒ 2È ƒ 2È ƒ 2È ƒ 2È ƒ 2È ƒ 2È ƒ 2È ƒ 2È ƒ 2øôC ƒZww7š¦áp8eMÓPUY–I$$ dYF’$$I²ôq8(Šp\ããñ8+V¬à‚ .àTæÿío{JϨù3ú-ÿÆOÒ©.ƒ 2ÈàÓ…—_~ù#‰š¦¡i’$}¤óïW¿úÕ!åá…¸ùæ›Óê³xñb£ØŒèã÷û)//'æ\ÀX­Û\ˆÀ×¼êçâÅ‹-< ,HË¿dɃ_ôñûýø|¾¤9Ýg)º"VìN×Ì/ŠF\~ùåiùW­Zeð‹>„+ø…AªµµÕ0ᦋ[SSCuuµ ««ËÂwÇwXözè¡”6»þÂTµpáBk×®MÓ<s\3.\hÙ7›¾D›]ÿ¥K—0oÞ<‚Á Qè&Ý8ÁoŽkƼyó,û"¶¹Í®¿˜ï¬Y³ƒ)Æ2ó8¡¿ˆ+Vüͼÿ‡æýŸN'3ÓßüºãŽ;Nºþf o¹å–“®¿Ù¬¾`Á‚“®æýâÎÿ‡JË?zôhã¹èóÜsÏá+ó í7ÞȆw6 ¹óÎ;-1Ìãn¼ñÆ”¸/-y)-ÿüóSú¬}k¥ãÇSßÐ`lg]2“`(H}C?öXÚØkßZǬKf¦Ä=^þ§Ÿyš™3g«˜¯[·Ž›¾}ÁPuëÖ±bÅŠ´±Ÿ~æinúöM–¸™ó¿Ž¡zÿß}÷ÝFû?þñ<Þ¬)¯!~›Ã‡ÇPæÓ‹ …‚AÊ|¾”­¹-7çìØábïÞ½\>w®¥ 7çüõ¯û˜4i’Á£%ÞÆ7é›Öù¯\ÉDßê‚%FœU+W2iÒ$öîÝklËs1¦®®ŽïÝv›1NÄîý#¯¯ê±¬\ž—¤dÌ\ ÿÞ½{ÉËR»]åÊ+¯4Ž™ùW¬XÁĉ-üb 2àÈÁ•ÔnWY´hQFÿ!Ô¿¬D/Üõ/óf#9%\Nª¦K$P¢ ÿÛ:º{ºÉËÉã fãtÉ„öbxQ!]]›ªJO8Lg{/mØ…¦iÈ™ï~y&NUCIÀá#‡3n (*þm- ©* ñÏs«Òò?÷ƺ{zÈËÍåÛWT›ø èêꢠ €ÿëÛ þ¯Ï©LËÿ‡7¶úu*ÀWΛ”–ÿÕÍz’ó¿îó“pºd‚Áƒ'ù òÉÍÏU¥«·—Îö.Þ;ÐIþ/T—üdÜøq ¨üm³~Ž|ôºÏ¡ÊUÑå Ë›E"‘ ;#ÚÃãq[”M¸±Õž'].MÁíq“P⸼n$%AXMàÄË-•/:Ù IDATD(,ɧ±© O\#×À. xhŠJ_w×òw¶µ)ÿ”I3úgôÏèŸÑÿ“ãW SÓòÞ³o² ,YkZUÁëEg²žz4š­´× %õ˜S†ˆ йn=NLÕãÊ2¸ç•)È…íu=§4ÿ­WèÅ|iq­ŸßãEƒ»œe\ÜûÂýuÆ¢8.Zœ„äB–åä8‡ç×ó?ÙAB…¸‘H¯×ƒË?þÊY–×}Ï77Íßã„„ ¿üöùÿ]¿ß”äát:qh ÉiãW¸ÿ–‹¸÷>» Eƒ¸ ‘H ¯×Ë÷|ã| ÿO_cè¯%ùþçû—ü?üþ{OÔÆïHò'’üüë•FÜ»žXC"©¿àw;áï\ ¤þþüÛ×ë-úßvEQ¯ß,¯O«ÿ¿|A/.ö¿¯…phqnÿâdKÌß­¬OÑÿÖ9Öba‹þòEÿåt£íW/}Vÿ»¯?€û^܉CSø÷¯N³ÄüŸ¿}¢ÿ¿]{:éð‹gk,úßój£íç¨I«ÿý7ÀOŸ~‡¦ð˾ÐóÞ?Õ¤èÿ³¯éqÿpãÜ“&Û« ÷FÈÊñcÍmîIý×*±½u–61¶`Ú™–cAð47¶RZ6ŽúÐ~:;º)(Ì`äÈdåx©í7ž Ô‡öSZ6Žpo„¦¦fcìÙÓO7ú‹ãæç‚ç@KÓ¦Œg랆”×XVRDAa[÷4϶îi`Ú”ñtvt:Òÿ{ƒˆUVRd7?·ãµˆLvŽL8¬•íAAjÈEI$ejBÆãñP¤Ò´}9äæå’•Í‘ÆÃÈ.¬34²³³éíí%“““ƒ,Ëôl“‘%¹SdY¦££©! ×Dý~\,¤Ñ| sˆùûÈÎp²²ARƒsþ0Ú>ïQøUrrœð‡‘d\UdY"ÒÈ’ 2úgô?eõÏ;”͘1 ƒÇ±H76—#=P==0y¢—µöwgpf~N'ÄÂ^·F5Ü^h@~>$$=V~¸ÝÐÍdé_YàÉ‚ƒï÷ÿ?õóæ¹%œ~?Œ9-¿Ì‘FÕÄ;ka7Éù ~8†QÃ>݇úw§)·NàâÄnËçÓOIL¹u {~·‡[ê_Pò?¾ÛØ®wL5Æ64äñúªcü”[§1E× õjýËßUñ|Ëñ×Wõ ^­"/“¹âò\ôqZI¶±]îê2Æ6é3~wqELÑ_ĵðûô1_ô8,Ç—íÖP}*rPæê©’qlúÙ2µÛU¦Ÿ-³¥G¿¨ÌuZ¸E\sÙnÍ0îˆùßÖkÕåÿÖIÆü¿;S³©ÍÁùÃÆö±Í»©Í‘2Sôq¡¿@ýPñ‹ß?I^2|½×BÏŸ¶$ÛÖÃ×+IÆó‡õoÿ”Ó?vSÔ…L.î)úq`0xJç¿5ÿGÉž6Íz}ú½½“5ÿk®¹&…ÿå—_>iüßÿþ÷Søó›ßdôÿ êÿúë¯ý÷Èì0ßË}V¬XÁ•W^ilêokî/ú‰óïE]”–ÿwÞ1ž‹>ï¼ó]t‘±¨¿=®¹¿è'~;2߇4Ã|/_ô‹~ˆí@ýíqÍýíýŽGÿßXÆõ—]mlÍxñeäÇå”1æqö¸—\r é Šæ›û¼¸v-×Ïšel-ük×R"Ë)cÌã#gð£èï¯ÿŠÒÉÆÖ ý‡–ù›ãšû‹¸3.š @SK“Ñ/;+Û37'—ž^ýûZ_¸‘ÃGmâ¸h3ÏÍÉ¥©¥‰ì¬lrsrÓÎOŒojjìçË˳ôÉÎÊ6b÷tw3räi)œ¢Í<>;+›¦¦FróòRæd/ƦCn^ž¥ÝüúŽuœ}N‡é¿;UVV¹1f|ÜüsÜÁò*++)//Oáÿ¸ù?渃åÿTVV¦,L ?ÿÇ7]þÏÜ D•ž˜JXÕ¸àº,üû×½JcW…Y&ι.­þ­ïü•¾¸Ì¸Y×êõû’  1íKßJ™ÿ¯þÕ#£uw$~óü£[WNÈV^F0$¯-¨N^JLºtÞQø5zbVáó×ZóÀ¼õw»Âf¹)¿ìÚ´ú{÷½GDs@YÁ`q´YøKªæ¦è¿ûïKP=pøfýÚeêFýóè‚ ^µð¯Q¿C`s˜òª,.•ŸH«ÿæ<=ß°ª{@€ÚŠ7˜ ÓŽóq‡OŠýUMåFÿ-ü¿çwÉ×·Ìxmvý—|øCÊ«²¨ìúo‚Á »¾ÍèÍý×ñGãoÙfxU-USY°åþ7µïÏgKÿ—Vÿ5Á;^•Å9m÷  [Ëpµ––Ía8÷h·¤è¿DzÞßÈ>ގדEo~¿½ÃÂ?韮$žH°‰w÷¤Õ¿ðÒJrsó9ðÊZÓoYÀèQ£P…¦æf¤d®‹yþŽÏë¿whšjáïzÓš»ú7®1ø#ëw¤Õ䕟'77ŸàK+ ƒœ{Û ~åÝÝ)üÞ‹ÏJËßòú& ÿ´…ó þ®7¶¤Õ¿ô˳ÉÍÍg׳/ ¹äG -ü}omKÑ?ÿ2ýbúo¿ïÃý×üw…~d῵ý&T´ZÚìú?>m1ûüÅ< ™@ ÀʯX12óÿßè‹´š¹¾·Õš‡úõ¯¿h³ëþ›,;ÔÁ†Ü/ ÙtÓ–´1ÍüO³~þ|m5/÷þü7™PÑÊ>1?íšmèhæÿ]Ù6–êàÕè%ƒAöþxûüúyßqýO$ÿgqþCý÷Ïüÿ8þúù£ªªqÖ4í#ŸÿKKK‡”ßñ#VEETVV²eË,XÒ&.‚ì?œ‰1fˆ‹a_°`AÊeÐÿ#VEEÆÝ—_~yJ›¸±ó‹1ƒñ_~ùå)?–‰÷b0¤ººšÖÖVcõëÊÊÊ”6ÁoÿáL¬œm†¸ø©©©1âƒÁ”L»Æ³fÍbíÚµÆ{>þvˆ1ƒÍ bvŘyóæ ¨¿fžø*`×X¬‚;kÖ¬õ·CŒLQ,ÀþwʼÿOîûÿ£êÿÐC±hÑ"Ã}çw…&N†þO>ù$?ûÙÏ þ{ï½×øþdè¿dÉn¿ývƒÿÑGåÒK/=iúgÞÿŸÌù_˜ø…¡Ñ¢EÜy缴䥔6sQ0Æ@ªùÿ¹çžtS|ºbÂÄ/ ýß»í6ì1-Z”Òf. ŠÆÁýæÿµo­3^cºbÂÄ/ ýâF¿à7·Í4EcŒ™_˜ÿŸ~æiƒݺulذÁŸyÿŸÜ÷?èÆs€Ï}îêR å£F‘b0,æóÜœÐÓû9£ÏÌ™s€u†áÚlV×Ç~ŽI“\€n<3ƒ†i]ôÝ\no³ΡßÌ.9f{a>_µre2Þ &Nì7‹t÷ù(ÁjHg"ü'NLÆèÓÝçúÿ¶©fù¹LìۛшõWzÚÐX¤‡½M½dçR,G™ÿù),yw ¯ø<±XœÖÃíŒ]B,cXa!ímŒq{e—æ&øòSøËÆ=hšF¶Û…ªh8´ŸqÆÐxð0 nýÂ…´¶¶²dÃVþp7{›ûÈÎ+d˜áŠ3Çðú΃\á™D£ýüÑX”¢ÂBšÚÛð$ùIþ9gaÕŽƒhòÿÓÅgÑÖÖÊòíû-ü‘¾.ö6÷‘›_DaΓÍ{aÎÔÑD"Qz¶3~ì("Ñà hjoÇëÍꟿ¦R=6‹ša}þj\cÿÁJËÆqäÀA ‰+ÏK[[1D'^‡ "*-ÌžH ‡{©.]í}¨ Ó‹«¿ UUQ”8yY¢ •„êBQâ¸Ý$M/<à$~ÿºŸ¾B¿&J¨Mè¦õ¼,}‘(·Ä³kvÇ~ñäü]²J$¦n\²ÊOŸ\Ïý·\Ì¿?¹1ɯ—í&ª¨$T'Š¢àv»ûùe‰Gÿú·YOôV4ˆ*ºi=/ÛM8Ãá–ø¿W7¡(ŠÑ/¦êƧ¬Ò›äwÊ*?|xüë•ÜþðjIþül7¿ÃíúùõÜëÜuãýóWtÓz~¶›ÞH ¿þkˆ+qnûÒ–¿ƒC³êÿèß?äö/Næ‘¿‡Ô_@èÿÒÆ:æ_ПøœNÿ—kê‰Çã–~¬úÿ÷ [ù÷¯Nãþv¨¿…_–øãÛùæeg÷ó§Ñÿùu (Š¥Ÿà7ëÿóßoà—ÿ|!wÿþ½õ·ó?öÊF‹®éôrY q%KoJ1óÛýã:·î$+Ç›Öü/ÆÙǧ3ó‹"âySS3¥eãŒþ¢Ý>N˜ù…ù0 ÿ¢H€ˆ9räcüÈ‘#8ÐRo˜ùEñÔójþŒþ§²þOƒÖ6ˆD  ²²ôÂIÁ`4Ñ í½ò €nhÞ\Ɉª-Të#»8ÂinÝÌSÀåUÑ?s<®äwÈQœPP -|¾l”ú¾ããoms%RÕfŒåÄñÇ¡ ×Ì¯ÚøéŸÿ륌¸¢žÊa] §uT~¨û˜úW\žËëiÌÿ€Q€2ëø+.ÏM1Ø›‹ܲ°;¥X€€Ù¨?ýl™Úe¤˜ÿ£ã¬ã…9?]ÌÆ#}Æk´ 8䒨ݮrõT‰C. Ѓ2ÓÏ–9ýmf_ª†vó¿0þ§{f£¼˜¿Ý|&|r¬UÈÒÅ6›ö¾;S¾îí¡åß²5U³QbÔ¥1ÿëüú>9ÖñËlE° =Þ¦62ù·Ÿ±üç_üâ–¢Íâà<ð‰Îÿ©§žJËíµº9íûßÿþ'Ê¿jÕª´ü?ønܺæšk2ú†ôO‡tÆ~»ù_K×w°˜"/ÀüÜŽtÆ~»ù_K×w°˜Âøo~nG:c¿Ýü/Ž¥ë;XLq¿?]Ž€€Ù¨ßåRÉË)æ`À"bLº˜/¾±L{åÕ)ÅŒ¾&£þU¥D–SÌÿÀ€EĘt1_Læ;Šç%iæo6ꋹØÍÿÀ€EÒÍß\4 b¢þ\(g6é›Mýfó¿=½=äæäZƘúfô…ûŒ~¢Ð€¹ˆ`1é›c 3;+Û2ÆnÔ7^kw·ÑO00¿Ñß|l ˜¹yyiÇ †Á ˜̘1¿ßÏe—]ÆgœÁk¯½Æ…êÅ=g̘Ák¯½vLù?sæÌáðáÜyæ™<ûì³<ûì³<òÈ#–~@€ââb#§ç’K.Áï÷sÍ5×P^^Î+¯¼ÂÅë•¢.¹ä^yå•cÊÿ™;w®ÁöÙgó‡?üÇ{Œ‡~ØÒOxDŽÏ¬Y³¨©©áöÛogôèÑ,]ºÔÈ1œ5kK—.=¦üŸ«®ºÊÈC›6m‹/æW¿ú<ð.¯5 ^5†O¤äX5ç…®½Œ8wö€ùWž„‡éßM+= ïÁ]HšjÿßÖœÿT~ÉÕ²ãÛ-üö+Á?¼zÖ€ùWÃT§…¿{˜á]û4ô Ð4ü¾‹¯" ÚøSó¯g— w…(œ>cÀü+Ÿ¬ó'’üûÆDgGrþúu‹=ÿÊwÁ¥ƒAÜ0zsÀ÷/"üÄ.ΰi\¸…òª'©ê^Dgò=š’> öÉ>DÙåéþ˨­xƒòª ‡ª|àOUù"Šœ6V½F9»9T5•ð~:&[5ž¬¦}Ú“œ~ú³ttVQ< 2é»>ã©F€CUSÓòWúþ›"gÍU¯1œÝ´TM…'ü´ú¬ço¢»êiÎi»—VÓÿ†YQ<€äšZeïO'ôwõ¸Ø’ªÿ¥¾¯$ˆÓ©—Š„ÃŒ7ž6ý_üñ}|ýá{h{ý=@ÿé—VâÉòï¿Ú'—ýCëB*)ïÿ$Ïù?¸ÑÂß`{ÿé_îáÛ¿½#¯¾mœìúçóþ÷{ž™?Z8(¿/É3㎛,üÿ°½Çßz'ßûýÿzq•Áo׳-üoýú)®üùíþ”÷’ÇnÀ·Ÿcn ÃïØÆò—üÓ ä¹HJ>÷/³"ûüÅP”:ÿûæ-z±¬Åì瘯'ðÂD?€ÿbüó… _Òcœÿt¥Q`Ÿ¿äTþ¯uÌO[,À~Ž™S“ÇjàÖÐ9Àþ‹2˜µBáUÝçϤ'°úRëç±]ÿ¹­³“ùŸ¶*N1ȱXŒ¾¾>£ªyWWÑh”žžÂá0Ñh”H¤ÿGíH$B8¦··—xüðÃcÒÿþý–/ð[·n`õêÕøý~V¯^ÍÂ… ™?¾a°æ[¿ßOkk«a¨íèè0â,\¸ÐgŽ'â 5¿0–ø.›s™ñ¼³«“‰“¬?}’úŸHþÏâü‡úïŸùÿ;qü±XŒ¦¦&vîÜI  ¦¦†mÛ¶±e˶oßÎŽ;ؾ};;wîdÇŽlÛ¶­[·²uëV¶mÛÆ¶mÛØ¾};|ðÁ1ß³g]]]Æù(ùÁºJ­¸À1³;::(((   ÀÒ&* Ù÷£°Œ@yy¹qÑd®žÖUjÅŽ¿°°ÂÂBK›¨@f߇Ԋ®>ŸÏ¸h2W/ë*µâG\¨þââbŠ‹‹-m"†}0Œsf~qÑdç¿ãŽ;¸ãŽ; ×®]›bŒLÿYÉÀ͚βý(>˜þâEÌÁï÷§ð¦¿øÒ<'û’ƒé?oÞ<æÍ›gĨ¯¯·è ªiii ¿8v,úgÞÿCûþ?^ý…ù Ì§gß,Z´ˆ§žzê¤è/ÌÿfþŸýìg,Y²ä¤è/ÌÿfþÛo¿5kÖœýzÿ¿úê«ìß¿Ÿ]»váõz1ãd¼ÿ׬YCѰ8¡P‡Ãº’ÉÉxÿ÷õíbøp•‘#KbøÑô7GÌaԸ𢠹ð¢ -mÂü/ƈ} å&½¯Ìg 0€~“¼Ùà/Œúæñ¾2Ÿ¥M˜ÿű«n ”Žo 0°ó ƒ¿0êÛùÍmÂü/ƈ}H­h?sæL£h€¹pÿûÿÐá#x<^zûœ~ú:| é¤ÿ›ÈÎÎ!qæ™gÑØØ„,;NÚù¿©¹…ü‚BªÆ´é45·àr¹?Òù¿µu5Þ¬x³fð<Ÿbݘ.`n3÷íéýœÅœ¾nÝ:Ê|>Î:+nŒ[³q]¬:ï›ôM´ÄÛ†A[ÅA7“‹qf¹Ù ^,±ì[éýöI“&YV«Î—Œ™K^vÐ'¶ ÌäqÌ}_wŸ/Ÿ>qâD¦Ÿ-ãÄÖÌŸÑhõ¸û²‹ðôDQe‰ÆÖN¦ŽÆáÇqÉ’ÓAWgY9^<^7%ãÆÐÔØ´´w2rX1‡Av@KS #GŒ@FbþùSPU UÑPÐuÚH”XŒœÜF+¢µµ±ãG·Ÿwv?[—‰_Fr:èLò{³Lü@k{'#Іü­&þ+΃ªª&þ(±(Ù¹ùŒVD[[cÇ—€ßø\©ÁßÔÚÉcŠ9xð.YBNÎ?'/›¬l/£JÇÑxø°1ÿÆqèða}þÍ-Œ>Y“9ot–>ÿ¸Î_2r±H„ìœF +¤µ­1ãJeû»É?܉â”éM¸(£Èv:pxÝ(a ‡[I!áuáq:Aƒ8N¼’Œäqx4âáÙNÍÒ§»½¥O#ª©äxñ8tõÄñÊ UeĨü †?ßáÿXüÈÒ©Ë/<~Ð ê2ýÆvYN5¹k’õ¸¤‚Gq•)KëÕÍïíNI7»‹UݽNÝ]˜%sZ‘žt’\ôâ”ç¿÷…Hè«Î÷Åâx½¤D”¸¦›Ç;::2N§L^–‡žHI9Çãt‹E‘%pË £†»iéÔøï?oôÂ9’¦QœçaÔp7ñxœXL/@u×ï7!£¯úŽ)x½n¤DŒ¸š†?iâ–TUÓI,Óù F»hîÔøÅâõ:rþ9^'’¦1,×ͨbŠ¢ê~ø›5)üØøå$~¶›4C¦Ÿ¿¥þíõäö˜‰U£8ÉWâÄ¢úü³¼žÇ^× ¦öÅâüèÚÉýAõÿõËzR³YÿÇ_³:ëÓÿW/}ÀƒùÐçÿ7L³èoáO£ÿ>¯ßÓ1ëÿë­÷yÓÿç¨ážgk þn¹Ð¢?0¨þ?yrƒ…¿¥îyzC :ýÝÉû–œŸ•ã5 ûæãfó¾Ûv¯Ólæ÷F,mæñöq€aðÆý‚Â<ð?räôîæ}1Fìö'Swvt[ÚÄëÅ ¿8@SS³nà‹¹_öËJŠ Ó~gG·aÞcÄ~:ˆ6ñzŒbôi§»»›h4Š$éç$aäb|žI1FTy(¶ŒS £>ô¯NXLüÂÔ_¹ßiÙŒßÍãÄVÄÇ®ž*ñEþM¾v»ŠêS £>€êS×·šøk·«L?[FÊ–ýt˜~¶Ì!—Äô³eà /ú~w¦Æm½ú?à¦6[Æ)†QÞ>³‰^˜êÅüíÆ}3̦}Cjþ¯WÂ×{IÆ€ºqýF}.6Çéo¦þ‰û­û °ò÷oEŒó‡qJç5ÿñä?ÿò—¿4Ìçâ¾­ß»í6¾wÛmüä'?ùDæÿÇ?þÑ0ŸÆÿÛßþöá_»v­a>ŒÿÕW_ÍèÿÒ¬÷êíF};Ìmö¾ƒ0 °0øíF};Ìmö¾ƒ0 °0ß«·õí0·ÙûV À\4À^8À¬™Ý¨o‡¹ÍÞ×^8À>Nlí…„¹Rú)ü¦6{_{áû8±µ0kf7êÛan³÷µ°Ût…„Aߌ¾pŸÅü/ŒøÂÄßÓÛc´‹ñvÃþÈá#9|$M-M4µ4Ʊ/ úfôtw[b ó¼0ñ÷…ûŒv1ÞnØ9ò4FŽ<¦¦Fšš ã¿Ø7æŸÆoæLw¬§»{PC¿8.^“(`{óÍ7SQQAEE@€;_ßÏk¯½@4åí·ßfÞ¼yìܹÓh üð‡?4“û`ÍÿY½z56l`ÆŒlذòòryäKþÈ ƒÜu×]øý~^yå"‘o½õ×_=Û·o7Ú‚Á ÿú¯ÿŠßïgîܹÆ>XßÓ+W®dýúõ\rÉ%¬_¿ŸÏÇÃ?lÉÿù=Á`ÿøÿ ¦¦†¥K—ük×®åÆodëÖ­F[0ä'?ù 555\uÕUÆ>Xó–/_Κ5k˜5k–‘£øÀàóùè‹jL¸ì:¦^}=’¤çPI ZòŸ\iÐüÃèØ3‰«š%§*2æ <^·W¿V(ÿÊÎ Óò–ØV8¸¦ZòŸZò'àp¨¸Ü:ÿ@ùW}QÒK¯eÊU $=¦ëPÈ’årHƒæÕ"âªfá¯S Aãt¨ºü«ð»¸T~‚ý?Áqîj4eZ IDAT+Þ°ÌÿP•oPý‹¶ÞÂÔïXôŸî×ý9á'v ªø ’ÿ‡8ν€`0H$rê úm½…ð~ËüÏxj1¿wPýyÂÏléÿX°åä[kÑ¿Ež>¨þy›o¿×Â_öÄçõÁOøÕ?ŽÐ²â]´Íu„#aþð›–ù;ÎAõ¯}r YÞ,‹þù#}á°c ý£á‡_]OìÝÝ„#a‚Á 3´0…0ýßìy²¼Y–ù¯ûõSþô†#Ô/}ƒž·¶üWþüv‹þN§sPýßúõS)ü+~ùh ÿ@ù·w…~Ä]¡š®üÊ›–ù÷ý¾ePýçþe¶eô"ûüý¾¦Áò?¿·õf¾·õfcN›nÚ’Â?˜þ_Ý:Á²z3ÿ`ùŸ_[7Ÿ¯­›Ï>¿~þ_}i·Eÿ=Oµ ªÿœ5yøÜVþ9kôÏÙe‡:Žªÿ© 9‘HEÅ4‡Ã,ËH’„Ç£W¶p88TU%£iš‘d.Vƒ=žñ’$q*ókšvJϨùÓé_[[›bl<þíÛ·““㤰Ðkp”ùïÝ»—ºº:êêêÆJ²Gã¸Ý*ÝÝJJr?2ÿ¡C‡8|ø0GŽ¡±±‘–––cÔ¿C‡ºéîVˆDâǬ¿ãÆõ—ž?>sæÌ±¬¶=gÎ^zé%ü~¿ñ¡ ­­­¬^½šùóçÓÙÙI}}=ÆJßsæÌ¡¹¹Ùˆo7ãÿþýû?Sü÷ÝwŸÑ§³«€º½uÜwß}Ÿ¸þ'šÿ³6ÿ¡þûgþÿN,"‘@–e¢Ñ(ÑhÔ¨X+\.=IM|¦™?³@?÷‚~.çåÁÆ{½^¼^¯ñù0Ôü TÆíV—m¢¯¹¦ØíGƒˆo.Ü bÕÅÒÀl27WÀûÇza!â‹Ê—ÕÕÕÇÌ_]]mæÌûÇË<ú?ôÐCCªÿSO=5¤ú/]ºô¤è¿eË–,Y–-[(,,dñâÅÆÃÜ&¶ö㢲ëâÅ‹äLÿÍ›7³dÉ6oÖ™Ÿ|òIãan[ûñÍ›7ÓÑÑÁ“O>yÔù§Ó? ±fÍB!½Bß’%KŒ‡¹MlíÇC¡,Y²ä#é?ØùG@T£[¡é'}þŒÿdœN4¿Yÿ#Gް|ùröïßÏ«¯¾Ê®]»RÆ¥;ÿ,_¾œsÎñ‘—ùùùÇÄŸNÿ®®.Ö­[GKK‹åýgFºóϺuë˜4©„PðÓ+Æ×üÍúkšÆûï¿O8æ½÷Þ³|_°ó›Ï?;io÷ µ¢$Ò'A Ä¿á=Y\ùäoÇsÏ=gÜ€¦QÀ^à¨üÉøb+Œü€aÒ·cí[ë ã¾0ý‹¢ö"Gƒˆ/ø…‘0Lúv<ýÌÓ†q_˜þEQ{€£AÄ?–ó†d<†%on5жövFÀôŠJ£(À±àxÎ?²ì0E&þvUUµQàXp<ç—Ëm<ÿ˜Ñ£ioogÌèÑ\pÁ…FQ€c嫯 ˜ÍáÂh.V¨ý}™nútû‘ðÛ)ñ̓ÔK,f÷ËçάFo±B½#ŒÛ—Ïk¬HoÞí}G¨ ¦[c@ÇÞ½{-ærÁ[WWgá+Ô‹1öèÚÏ˦ķógôZýQ5z{£x5 &Nƒì€Š ÃiëNVq— âÐô•Sò ŠÀËÈ1¥ié"š?–¶¨“ÓÆŒæ`c##ŠŠÑdPTÖH IIÐ$MÂép Hàv¹Øßpmþö$¿dçÏ/Bréü­Ý)üà ‡¡É0ó« Ðd\ ÿÐ4º»Ãÿ¤ÏKòÓÞÝaTÐ7óç&ç_2®ŒÆÖnbãh‹:5v,›^4ìèówº8°ÿjW˜XT¦Pu_#F9q¸aöxdÉH‰Nt÷uâR„{{ Ç@Ê)!îÈ£Gñòf£›@W ÙAKO/nMFu¾Îvö GcÄQ$ÕA–ÇMT‚ܬlweø3üþ Z~Õ#ëŒâ´uu¢Å4‘0 ­mD"Ù4öF©o略Ëÿ@7±(Á¦fâíQêZ”ÃßeâkD¢a´uæÐŽÑÐÑÇÖn'µ‡zèŒE 5·ïˆ8Aü‰Þ8š¬ÐÖÝ Äâ1ŽtõHÐW9ÜcgØËΦ(Ý …†¶vèQÙ×®D§ûÍîîäs‘CªI©Ç2Œ+‘Éõè&ø,7 /”8Ò¢k(šÕüîqJŒ!QX ëîÒ舨§%ùSÀO’_F I&~à÷$ù{¡ÞCv&ùõ"0ÙMÑÊ6~7rƒ¯—Oáü‡š?£ÿ©¬¿æ†q“ ˜: |§Cá(Èã'ŸFqÉpÂÝpø ì6™ÿJo­dóͺÿƒ¦lâèßãò Áí‡T'lnΦ¢¦‚Šš v5fÓÒ‘d9õDZòo1™ÿ*Mü›÷1 ÿúz þšð»˜:ÕΟGqI¶Îß »Mæ¿”×¯Ó |Ð40ÿæf¿b<ãWŒgWc*¿f£¾¹€ÀzÇÔ”>í éâ›úæ"Ë]])}Ú?DüC®þU𮞪?O·Š=Àߣ ÃÜ~õT‰Úíª1FìTÀŽtñÍFy³ _à±-¥Ï@ûGCºøCÏß¿µHâO9©}Ú?:?§tþñPókþùý÷ßÏKK^2Ì׃ÝãýÞm·ñŸÿùŸ'tþúÓŸŽ‹ÿ™gž9¡üëׯ?.þ5kÖdôÿŒèo†Ù”´"æ>í öøfSþÑŠ˜û ´4Øã›MùG+`î3ÐþÑ`o6å­€¹Ï@ûGƒ=¾Ù”´"æ>í•ßßlÊ?ZsŸösü¦–¦³:S¾8f6ßÛ‹¤ƒ( ž›· òífÿt¦útz{€´üÉBâ¹ykw¼8ZÑ&Úí[‘ÿ#VI^´hååå\xá…ÜsÏ=@ÿ"rÂä_QQÁ#_¬W~ºÿþûÝÈ “EE?ü0¬\¹ÒØísçÎåK_ú’QPà[ßúVJþOkk+ÕÕÕzŽ™Ïgä>øàƒ€näomm5LþÕÕÕ<ðÀTWW³|ùrc_´ \uÕUÌ›7Ï((zÑ…`0ˆÓ©ú+8¨¨¨ Ë%[ò¯ L×i»ÿþÿÒæj¤æ?kŽlr¼¿'N§fèoæ7ç?ÙùÓåjZjþs8.#ki.2“óú+HTWW“å’äßóÚ’´ù‡©ùÏm]1¢}ÖßðíüåUY†þÔ`Úü7aâظñš´ú¾QÚüsǹçÂç^`è?uã²´ùoá'úÍпçwiõwœ{AÚüó jí ó^••’ÿ6nã2kþÛûö7µï¦ÕÜÆeióχWe Ê_<|¸¡ss3ääæXôÏ2-¦åqFZýKÇŽKÑ?;+‹ì¬ùÅÇú›ùÍó7óçÍž–VÁožÿÑøÅü…þÍÍÍTWWÊ_|Źiõ/;.EÿcᇣçžþXÿï#¿*ûuZýÜ8ñQó?§,n´ßŸÿfZýÜ8ü#û/NeÈn·Û¸8r8$ "ý¦œÛ­WJw¹\8¢Ñ(N§‡Ã¡ß(v»ýãït:>§*¿$I§ôü‡šß®ÿ®]» ##è•_Eaç΃òïܹ“Ü\‘ˆB"¡Ÿ>}úqÏß¾}–(ÆŒÉã´Ó¼ÆŠ’ñ‡B!Ün™HDCU5ìdòäÉÇÍßÜÜlð•Åðn† “inn”_–»inVPUUq:Œ=ú˜ôonnfõêÕÆÅßï7Œ·/½ô………cµmóªÝöcƇ›Ù” X*Ø477gø?ÿÝwßÍyçžÇ”)zeêóÎ=n¸»ï¾;à üý3ü'Žßív#Ëú ËxÿùÒ~ûùgÕªUHRŒÆÆ^@¦Ö€²²²ãÖÿý÷ßôŠÇgœQÈØqN¦MaðtþijÚÆöímttDÐ4p:dFŒq\ú ÿsÏ=g,7ÚÍ&Ð øÊ|–-¶p€Á ¦½/ ükßZgo6ó›Mþ"Véøñ–-¶p€@}CCÚ"ÂÀÿô3O[øÍf~³É_ðÏœ9Ó²…~c:¬[·.m‘€Î?§Ÿ~³gë7Â> @[»žPDVTD41¢½dÔè´…Ž÷üsæ™g1cÆÅþö$$¡¨¨ˆH$bÿüäü÷Ö…,óÇbœVRB$Å)©„{z!¡ÑÔ¦ówt¤™O'Êòôù»œxFä²£´€†1Dã í=a¢Š—ËI"®Ò‰#{eœ'Ím]ÈšçðÓPUÉë&/?—ÃŘùHŠQ•°¦Ð§¸i땉Çú$ gBBUÈY. ÝÈÈÎÉÊðgø3üþ´üZB#æoŽ›Þ¸BcC;-íŒ.›L¯#‚äq1aÜx\²â%î#Qh•{ÉÊŽŸ~‡Îß§$hÚßAK{£|“èuDÝ.ÊÆ•êüq/ÑH˜xT¡]î%+[9!üa¸³]Ä4h=ØM[g7£Ê&ü¥¦ùÇcQ”h‚6¹—¬œcãwʺ¡]QôB‹¼ýFxÐÍëb«˜Ž)*4·ªŒ(–ÉrëcöQ‰¨Iãš ZB7 K¨Œ¦'q´vB_†’ÐP’FúS™@Õ Ž"ËPàp¼ß”ãqQXXˆÇ}1Ý0îÐâ$ThiMpÚn‡J$®²¿1ATÕP”8Šª_G¹$¿¸Pçon‹ KH²³Ÿ_…¾¾X?ÌÄïÕW?ñ8!%ù*4·*œ6ÂÛ¡Ž«44*:\!¡%ùe»’äw°ñKIþ¾ø{ãYù•$¿[Ьóèüvýûz=ß¿¢”ÿ}­¿èbŽGÿíãW•ªÿo—‡Rô°ëmuiZýýåîüÊéÜ÷âNËüîšú ú/zigŠþiùÛn˜yzZýñl ÿõj~úô{)ü¿üVõ úÿâï¥èß«þ·\]mèo7ä§3ø‹6û1q¼sëNì°÷±ÇpOšh)º!ßlÜÝ´?rä‹ñ¿>´ß(•ãe{í455[Š˜ûˆ±v®úÐþC¾Ù¸ºi¿¬¤Èbü·ý·îi t¤ÝRDÀÜGŒµsmÝÓ€äÓpN‚ø˜>rsòèí飳³‡è‡"º‰üÃe¬Ž™=%Óé$ŽeÑ×FžÐ‹cB/2ñh —ÓI~nY/ª¢çÂ(JŒ®Înâ{$Z[[innF J(qåSÀO’_Mò'èì ýÐaâ×p:e¿C?gNPpLˆ%ùIò»’ü*‘Iþh’¿‹ææn” (qõS0ÿ¡æÏè*ëÂîÝ( ôô@K´·Ã¾@#‰¸·åÜ)ç÷úª'(½µªt~¨-M‚D$—n„?Ъ›ÿýÕý¿-—”@a.Dz@Jð‘ù·T=A¥‰×Rø?ÜÏ1òÇÓðw÷ó§©á¹åŠ'¨¼µªô"¡¶Tþ­ºù¿áʆùò¸8±›õŽ©\œØm?¾›=¿ÛÃzÇTðo6î ³¿yŒhŸrë””×ÝÐg)" Ðx¤«âù,wuqU¼¿€öi%ÙÈËd–»º þ¹0€0û›ÇˆvóÊõæ6se»5¾èqð÷h‚ÊÜ~ÇÉô³eä Ìߣ –íÖ¿Ôãþ!—Äô³e¹$*sF!Ñ®úRùk·«léQRŠljsp[¯Äc9·õö'¼Ÿ?,¼Læ±Í0Ì›óÂlo#ÚÓÍS›ÃbâÿôðÃ×{uƒÿ×{ûŸ? X¯Ì…„Ùß<Æh·Þz7ÚÌENåüã¡æ?–üó{E‹YîÙÚïÝt¿õDÌÿé§ŸRþ7Þxããÿ$õþùç‡Tÿ·ß~{Hõ¯¯¯?&ý„qßnÊ÷âV¬Xa´™û¤3û›ÛíñDû8aÜ·›ò…™ÿwÞ1ÚÌ}Ò™ýÍíöx"Ž}œ0îÛï× 3¿X”P<··Ûc¥{nŽc'Œû¯\½Ü8æ}X2Ìü/¾±Ì0ì›ûéÌþæv“ÿ+W/ç•«—§ŒÆý§ËûMù½ ûÍþ/®]köÍÆýtfs »Éÿéòµ<]žZ$@÷ß¾¢A²Þ[³ 3¿¿þCðo6î§3û›cØ‹¼}Å~Þ¾bÿ€Ezz{ÈÍÉÐü/ÚÌ…Ä8{Á`6ÿ›!  dþmæBbœ½€À ü&ó¿0¿†ÆO{aþ÷ûýFnγÏ>Kyy9¿úÕ¯,}yä~÷/«™1co<¤oéRøöR}ÿ±5<òÈ#|ãß0òxV¯^Ík¯½Æ¾ð#ÿgÆ )üÂt*òØÿð‡?àóùø¯ÿú/KŸ‡~˜?ÿ|—\r ›ži¢ë…xüö×õý?næá‡æ[ßú–Á¿råJ^yå¾ô¥/ù?ëׯ·ð×ÔÔ‹è ,^¬›MþóŸ[ú<ðÀ,h³fÍbÏßb´.YÂs?Ý ï¿âàæ›o6ø—/_ÎÒ¥K™7ož‘ÿ³fÍ”˜fÌíü/- iÝ+Œºh®ñÊËËQe‰Ý+—耸”6ÿy¬kSóŸã ­½V| àðÛ5þÆéøK.¼ÜèïóùRøÓå?W^–šÿWhîŽZøƒÁ ݵ«Œü'Á_SSÃy×̧ù­W~Þìþ=«^¢¦¦†ÖxúügGYUjþs\¡±3’Â/‡ÞK›ÿy©ü7^üÎ[-ú;Î=ƒ¯4ÿüšµ·¦è/Kï3Aµæ_üù³úMÒIƒ¾ßïç‚ ^eúN?ýYËü³¾SÁïù~¿Ÿ©—¥Õÿ+×sþù_ _4æß"O7ô_ Ý»ï~‰É“Ÿ¶ðó –Ô|kÐüóÉ“Ÿ>æüó?¼Éà]2ʘ¿´¹­j"VZôß¾sY3ÎÂï÷“—›ŸVÿe÷þ&E‡ËÁرãÌôª¾óUC3¿òînœŸŸÊîgÿn™ÿö;ÈŸ]að§Óÿoÿ{gfEuæÿOUÝýö¾A³w7 ((6¨qC5QÍ¢&“¨É¨ÈDcŒQè$1 j4AÇqp :¸g"&?G£¸ Ò%‘¥AÙiºhzï{o÷ÝkùýQ÷T×]Eqßç©§ªÎyÏû½çÛÕuo:ß÷üâ÷YüçÂojjâô_•Õÿ5kÖyçC|gŸHýøe_ùkÖ¬I÷óÿÇÛ~“Åÿ`ø³çÍÍyýßÞ|+÷Výžë7ÌIã?v³Á/ÿýwÔ××»ÙÈÉÿýò7³øßUŸ­Qjllä‘©åœÿyý†9<2õ1¾[wYZÿ·Ü`ðÀS‹©¯¯gË FNþï“Åÿ¢W^mMŸƒÜÔÔÄg¾sþç¡s¸§àmæ6Ÿ˜†¿íñ.æ¿°”5kÖ°íñ®œüÏm>1‹ÿLlQ÷‡ª‡œ$àÿºÉ†aàt:‘åñ®ÈȦ(fÆ4]×QÅ*s:¨ªj ¼„ˆìPÚÛ³°­øÂïhíÿ‘ÆÏÅ¿,ËŒY„a”—çS\ìÅ0 >ú補øõõõûI$LŸÏmõKà××שÿ†a0|x~Ê+üÄã:Á`”òr9ñ·oßN^ž M“Ðu¯×“ÕÿíÛ·¿´ÔKQ‘“H$I"n&(,”iooω¿oß>z{¸ôz]ìßߟ†¿wïÞAù///§¶¶ÖÊàg‹ìh™øâÚÌ…¿fÍš¬#1&l¨ü¯´ fÛùüñdz|…Íš5+‹ÿY³fYmìŸë`üÛEŠöþ‹Ìž¹ú_[[›ÅmmmZ6Сòoÿ¿¶ã ^rá;6‹ÿ±cÇfqiïßÁVž? Ÿèú?øŸäú?ø‡ãú_¸p!+W®dáÂ…ÖË»ûî»yóæqß}÷Yþ+W®´6ópÜ/^ÌÚµkY¼x±õònþüù,X°€ùóç[þk×®µ6ópÜ–.]Jss3K—.eÊs…ïo¼‘‡~˜o¼Ñòonn¶6s¨ü ¿±cÍLÒUU¥›u–-[–óþ_WWǨQ%„à ‚Á~Û$_ÑW‘yø`üwww3~| ã'” &iعŸ Ѝ««Ëyÿ_½z5¥¥^âq…úrâ¿ùæ›Câ¿««‹‘#}$ ã„‚*;:5ÊÍêÕ«sÞÿ7oÞÌÞ½æ ?yyN6oî´üÖ¬Yc½lŒ!\æ™g¬ ûƒÕ=óÌ3V¹¨ËÜÛÍžP W\x¿ò:ÆŽ“öB?³nå;uV¹¨ËÜÛÍžP W\ì/yb 3gÎLðgÖ-yb‰U.ê2÷v³'ÈrßÜnÃ+GXb€ÊÊJ븧·×ªs§2ÔÚ}…µîo#‹gáìþãóù9r”%¶ÏÄïííµê<)üÞøííÖJއrÿ)(,b츪´˜#GŒÈ‰/²ìæÂïèì"©jY8âú÷xϲ„ÛÍMMsÌ÷ÒæÍMMÔ–0Ý.F··³ïøÚ—v.êëêê¬ãMÃ-Áö›o¼¤œ•&ðnhh`ŠªZBuI9Ë*~™{a¢M¦0ÝÞVˆËE¹ýÜÞFÕÅŠòöb’K&þI'Èi=ìõ¢Í§Íÿ^£ñêëop|ü?Žÿ7Ïð±©éCÆE—þ¯9Q§-¡ ïz='ÿ`(œ[l IDATï`(°wO†ªÐÕÛƒWÁééìB7$üªÂ¤a#qÉ. ´¿½y?ºªSSêEQÂd·_‘ᎣÈ2á@‰hœ˜¦ÓÞÕŽOÒÔ¸M—P“I0 á`~w 5aâ÷vucdã·u ïjCS jJ½Èj„@0˜/ôƈi:]ø†‰oˆþ;$öìêÄH*tõöšý×ezºº00ñ«…Kv!ÉÚoâëªÎ„r?Š&  ¸ø‹ twE‘èëé"ŽšøÝíh±$;wîÆ@!™TÑ´$åy º["õ¡Gœ$%ƒX(š#™$—©ˆº§:ÈSòp£Œi ‘Œiœ:LÆëDq)8 |”Wéh!*K}Œ,ÉGÖ%q•H2L"¡§+FgwÑHô ü/ð¿Àÿÿ€øÑ„Â$¥€šòB|?’Ü>ŽK¸ikï¤L R“o 8 Ýy;¥”â.†•xþ±J>5e…ø>dEb¸ÓϤ¤›ýí”I!j d§B¡+c¦”R2ÊÍðÈ?Áð¦úïCR$†9}L²ú¢:_GvȺó8fr %#Ý /ñ_à=ð9 ;cÞdB‡¼”À] ™š†$i„“ÐÙcª:àHµQup;!©‚"+´÷ìï4Ð5sµÀî¨ïhÇH$’¸µ8½QPÕI{‘Ô³K\EI½ÛÕtT5N(š¤;`Xbêx2iá x8GB¢3h°¯=®ëÄã1‚ ™ÔÐ=‰„Š[EK¤ðÆÆ£©Uàã*ÈŠ)„3t M‹ÓSéÈ)ü„ª¢IK܉$ ‰® Ak{]Ó‰Çã2j¾¬%ßaÃWµ8!¯ à;RøBÜŽ$ ðuƒx,N(­ÿüCnþnþÚÄœüÏùrÕ ü?ð?;²øzù¾nUNþMüìþÜù©9ùÿÉ7'Êÿ‚ç6dñÿŸÿ³ë/™œ“ÿáß{Í9ù¿óÊSåÿöÅïgñÿûçÞç¶ïžŠ¦¥ õ ;ÓÿÑpÌ:"»¿ý|0‘¿ÝÇ_ÄÛÝlNVïèèdwóë|lÕh‚>:::-‘EE¹õ™D‚»¿ðuBð/’DÃ1Ëÿ£õ[Șàöë\ˆö›Ûz-‘Õðb‚>«ÜÞ~ê±c,_Q'ÿ"‰@0Ðgù‹}AAÅÅÅ”——« à?^¢lš“¢eœ5QtÃ@môÚdàÜ_‚ßçÇívãžÄçóÒ¿Ù‰¢¸H&u"Û\AÂáÝë“ÄÜTTTPr’—Òé^¤ñIb›%´Ftÿ±ÎϾ'…ŸO¬2„ÿx(›&gà;sàkø|.ú7ƒ¢H$“‘m¤ð“)|)|i¼Al3h€þc•ÏAÿ4þüÍü{òÌïÊÎnS¿q—}ý>’šB4'Ü[Út®fÞo§?jÞo×þ ™–ŒC8jŠê­üþ‹Í]ýÉõÔ®©å[}Xôa²ð?Ø ¤á¯mJ`¤ð×¥ð§}Lü·×q@ü»`_?$5lý‡Î×Çšø_Iá¿~hø-´0æµ1ück:>%ì· üíÇ»ªF¥•‹ºw•IY¾ÂÆ5ïÍŠ5®y¯ÕÈöÛþöãu£Õ´rQ·ÌÊò6m#­(m`@°Ÿ)ðÏ<¶ úפ[uëúÕ,_ar“œ•@n’­6@–°Þ.°·ÛûÿŪ[ä7²|sõ_ÔOÛã°Ú|>ðsï3wŽN/uÏú³}…ß“ÞF”‰6Góüã#?Øüó{_ýêWüêW¿LÁõ`+®fŸ¤ÿÏ>û,O<ñO<ñÄÁ÷ÝwY±b…%ü´ð?Mþ#Êÿ'Á?ü_ÌSÌöHÀo/?P»ÁÚä:ÎöHÀo/?P»ÁÚä:ÎöHÀo/?P»ÁÚä:~þ­Wñ<(YÂ}»€_{”ð<(YÇ/]´,+!€ˆ#|2-3®ðy~åJÂ×÷í~q¾ÖÜÄñ’šì„"Žðɴ̸§~÷Âs½–pß.àÇá¹^Âs½Öñß¾²'+!€ˆ#|2-3nx®7K¸ŸçϳöbËUd%È´Ž®Ž´-Wy¦p_ÄIì‰ìu@V€,üŽö´-Wy¦p_ÄIìB}{ÝPLÄÎÄÈ,³ÏË©­­åŒ3Ìq¾«®ºŠÆÆFk~á¼y󨯯筇›xzÍ]|müMüuçCü²°™]_Oðo-ZÁÓOˆ˜Ï:ë,¾úÕ¯òÐCY8ƒÍÿ©©©aFjѤüà455ñÀpûí·ÓØØÈ?žèàÑw~Æ·O¸ç?º—e!®8#À·O¸GWþÿxj-O>ù$`ŠTÏ>ûl.¹ä|ðA g°ù?¥¥¥Ìžm.x2gΚšš¬Å…~ùË_ÒÝÝͶ,\vWŸ¶€%ŸÏý¥páÔ}\}Ú¾rÛ^jæ±Ç³bÏš5‹K/½”ûï¿?  ?¦¥ñïudÏÿìK@Ÿ êþ­x•„U.üö¾ó?iGaí1xåĬùŸ‘'²ï½-|;ÿ^GöüK¯·o§Ð7Pn qׯHã1?sþggáxë—gá¯Y³æ€øŽÞÝ”¹³ðÙµv|ƒpyUÖüÏF9F£™äv—\}Ðù·ÚêÍl=ýLÖªÑø£3³ø~ûsò¯§P¼áº,þ ×?Î˳þ@ëôIiüÛÏÅgNÔ{˜´êUb±»ÒÊ­¹±;nÊÙ€â ×eñRýÉüõœ§L‡ÚXÿ{~4;{þí£õpÊé4³ÈJ`Ç_ÑtË øùk¯Îâßá˜Ïв¿Ð°³aHóŸÝ^çßy=V¹¨›qÓ?gµ¨VÉó·-ÈâÿùÛîæ¤k¿eáeþ³Ûëᢻn²ðíý?÷¶¹9û_9¬’gòË,þŸýÉ]œzý?eáhþ³ÛëáÒûþ5'þ×~ñ“Añ›û³,þ›;™·\ ˜"};ÿöóLN_zoEZ¹¨{dêcY¾Âæ6Ÿ˜Åÿ—ÿrŽÕfW}iÿösñ™«Sù7ë6®µŽíý¿§àíœý¿hDÏtLÍâÿKK¦ñÇ™/¤aÀàüÏtCµ 6¶63Óÿ‡ªÅÿ·­£³ø?oE>o|ëí,®ŽF“½^¯•% @×ukWUU­ mbU¼d2i­ö*êÅCÜ¡´w:)Áðø_à~ðͶ¥¥>b±ɤA~‡ÒR}ôkÖ¬aÆ ȲÌêÕ«9²„x\EQdE¦­-ȉ'ž˜†/˲us;8>$“*±hœX,I"¡P‚ü…x¼“-[¶ÐÐЀ,ËlÞ¼™ŠŠ|b1-•A¼^'555Yø[¶l9¤þÇb b1]s é¸Ý*ºd÷îÝ´¶¶"Ë2»w令ȅ¦aetôxœ >< ¿%%¸ÈÄSÀ(~ƒA)Ñ–X…»¦¦†îînk/Ä·bån±‰2»¯XY8 ÒÝÝ&|_ _àùòå|°úž|pµµµlÛ¶ÚÚZž|pÏ=÷ÜøÿÇÿþ_à^|qÿURoŒu]'‰F ‡ÃÄb1"‘¡Pˆp8líE}"‘  F‰D"„Ãaúûû …BôõõY«8+!€áÛïÿvüX,F2™DÓ4KÜ/&¥išf}ÿ†ËåJó‚MÓ¬r¿ßœ´ `ݺuVLÈ~˜:ÂD³ÆÆÆ¬­uëÖY1×­[—ö°$L ¶ÁÀ`´?óabéÒ¥iç"ƒXSSSÖ€VæàxÚ`I|!\;ùä“A i.üLA§]×Û͚ۛ5– Tˆ•W®\ɬTfÚƒ‰Ðíüg úíè•+WæäÖ¬Yi"éLN&·÷?SÐ___Ÿ3Wÿík!ìß½{7cÇŽ=düLAÿîÝ»ÓbæÂ;v¬å“ëú&î7bëîîæïÿ;ªª¦•oÙ²…ÆÆFËGXaQÑǺþ'þǹþ?m|ûõ°ûO(â¾ûî³¶×^{Í”¿ï¾û¨««KK 6Y–Ëý'0þ|k{ï½÷,Ñÿüùó©««KK 6û“Þ7Þx£µmܸÑýßxãÔÕÕ¥%›ˆ=TþEàXLeØ0Ñh’` NY¹¤–-[ƲeËØ¼y3555lÞ¼™ÊJ--ûq¹œ¸\vìh#‹¥ÝÿC¡/¿üòAù/--¥§§‡XL¥£½;…Ÿ µ5„ªvÐݽÕ67S]]Mss3EE--¸\.œN(*ò£iZÚý¿¯¯Ïz™} þËÊÊèêê&KÒÙÑC$‘0ìk‹·ÒÓ³•Õ«WÓÙÙIuu5x<1ÚÚº,vQ‘‡Ã‘vÿïïïçƒ>H÷ó?oÞ<«|01ÿ¼yórfáÏå?oÞ<+¦h—+9€ðydÑ"«l01ÿ#‹±»¥…±c̉ÙbŸËÿ‘E‹¬˜¢]®äÂÇþ2~01ÿk¯½F]]3gΰö¹ü3'Ø“dÆ„Ü÷ŸL1}ÊGXIq±å·ÿ~+ ÀþÖVö·¶ZÇ=½½‡|ÿÉÓoÞ¼9í¼8…ß›Â÷Øð{zzèé鱎Å=`0ü\÷ŸLüÌÏoÇß×Új%ˆE£Ä¢Që8¾¸þóvì°„úöäv1ù²öWñxÏ"Ï¿Ý*+È ?q=Š8••û8æ˜ïqñ×G¥‰Õí&®!!.Ÿ0aBN1ùGÒßÙÙ4Üò¾™~öºñÕmHÊY̘áK‹gúÁ€¸Ünvÿ|_}‘ê4?;þøñã³â‹6ã«Ûrâ‹ÄŸÿÿyÆ/.Ϋ¯›Ù¬_ÙwaV?Mþožáãk£ªÙÔd¾œX¾wBN?øtø?Û¿ƒZI¥-a>×mO¦g|üÀÿ¬ÚŒÃ€ªÑ#ißÛŠÏ-ÑàLÄqÉ2ŠnðÀËu8T Ð#1JŠKtƒPg7]ûÉÏ÷¡ë è|m+¯¬ØC–øË{›éöî "ë€dnÝŒ=€[²ð{mø²aðØÊuiøÅÅÅHºA_—‰_P0€ÿ×÷öòîê6ŠÄò[è öî Š¿~oŠnP=vm-ûÒðÝ’Œ¢Ã ë-|-£$…ê졽c……yhȺÎ{›ÃllˆãeÖîé§'ØC¸/„¤ƒ$KHtµµ1fì(tÝ ¬Ð[3(t;p$ Ê dPd|ý!ò¥á8ž˜Š;–ÄÐ%’]½H†¬ê¸ã:.Ÿ„ßï$™§ªQØgüv‰ª2?t§Až×…¢‚¤HH2乜¸ÜÊø_àÿþð»Ûz(+,¡µ¹É0èèêdD^1½ t’ªA\Šiè rŒžS’Ð~ó“áGMüò¢Rö56™øŒÈ+!òu4Õ .Gˆìì`ønƒñ•…¸dù°à»£*=m=”–šý× :»º¨ôJ6ü(á ocFãq8ˆŸÐÁá0EËý‰¬ŸèåyФ(†‚ÄUƒáen™Ôjë`h¦ Þé”È÷I /“ˆÆ ÂI‡ þ|‡ ²ÌQð뫦›I$7‰Dº=5DÍüï˜ã>Ù@Rd7:‰%(ô'ð8d ÿWWNç×WM஫¦S”¯ÒNU  ¼~-Çã1g³,üá ’$%—õžZŒ·ë)MÓ½×| ¿b&PŸ¤0/‰Ç!“Ò9ñ»¹3XøCsçý?œAqF$ID5ûïË“ÑÕ9›çÑ[/0Eã’‹ø øýØœ”éKá;7F ¿ÀŸÀkÃä§ðè­æxØ¢[/ ¨@¥Ï†ïÍ“Pmø·~}" ®¿h"¿ÿŸ9ù·[&ÿ/¬ÚÉO¾ZeñË%¹õëf²€Ÿ~}bNþ|i‡åóËïM%iÀ­—OåWÏmÈÙÿ4ü þŸzë#îüöd«ÿ?ÿ§©üò{f²€ùß›š“ÿ»ÿ{ƒåsÿug4à®>ƒŸ-~Høvþ½´Š{®>ÕÂÿíµgpÿuæ$â{¯;#'ÿ·?þ¾å¹ü^[2KoFbK»oáÔÉ$vâš0ÞÚƒ)òwMomvñ**ÊSÀo߃) õBL/Äýå–ï 'Çîæ=Œ­M4clÕh**ÊùhýÆVÆë÷d}þ ÍçǪáæ8‚ü‹½0Q/Lˆû«†§µÙ°­…©ÇŽ!ècê±c¨^l•å[Ÿ?3nÏš>:::èïï7ßíÉ'¾ÃI45粌¢T‡ñLL.mÃãõਉáñxð£¡&U U#¿g$~Ÿ]Õð´— ‡qU™+^Æb1b[4”]nJKóq##!ü(ú9ÀÑÑÑ›Âe;…o&«0FGQª“x&„K»mø®>ªA~Ï~a ?‘¯PZêÅ} HH?Ò>ý?Òøÿ{øß³­ŸæÍA51:ßõZýo[é¢ãϧÎÿ§ƒ?tþ›6ö²cCŽš­+d‹ÿ=oJì{KþXüGãàñ@(5úè\;εÓhìu‰D]1*í¾•KøÏtX;v÷ø04@…M >jçÔRÿX=£ŠSŸ”¾4&UƒËEþ?6‚±vÆÚilܧåÄÏ%üø[÷bá¯þ âH†„ÿQ£)ôï|},½‰Ä]Q’ŽŸCøÏtxý°»[ÿaÌ7ÆÐòb £ÄWH|€×ß4X»ªFY‚ýL1ÿ¶?lK;3¦ÏòËô¿þf¿óõ7ûÓ’×¼×J(` éG«–`bø«V­¢®®îˆáNþožÙÀÓO?}Äø¿yfuuuGŒÿ›gšÂ®ƒáfþÖ|Ÿ¡ˆÿíó†jþÖ|Ÿ¡ˆÿíɆjþÃÀûáˆÿíó!sYARÎ*³‹õ\?J‰õSbÿK^½ÐJ`ß _á_”yþ­W³âÙm¸œoëÔ,1}„ØÿêÆYV"û^ø ÿá²Ìó+WfÅ;Xÿíb}€Êÿ0Ç%…Øÿ¬×G[‰ì{á+ü ’2õ»wdų[ž?вŠ4!~fb€H4’v.,S¤ ËL`QQ1,M$Ÿ™ ¿¯/g¢L‘þñ3(F¦h_”}˲çÿ<ýôÓœqÆi"þ’ó×[‹Vðôš»¸êä»xzÍ]¼qÓM”ý.~YØl•ÿöÅ{9÷Üs­Ø=ô%þv ù?O>ù$3f̰Dü£F™Ï oüû }çgüËÙ÷óè;?ã¯?ü!£¾}; ÊBVù=ù5_|±ûÁ´Äÿ¹ð3çÿ<öØcÌž=;mÎ÷1ÇÀ²W°pÙ Ürá".»?ÿð‡Ô\u3÷—b•/xáç\qÅVìûï¿ßÿ ó$’H­æÿ”¾w' >sLÑ>ßÈïP)U’’@ÁüΰÏŽšBǪ×-uÏ\­;(ö8Ñ÷6äœÿ«<ÿþ xÜJÛÎ,|û|¥bŸÌH¿Âp¯¯ËügŸÜSXE÷ fâçšÙSXðPùn¼=æw¨Ü¶‹­®Ê,üaE^jÊüT•ø)Ì÷dá7é%ô­g øþf|Í{ä¶æœøÍR9¥N´Õ›Y_û–ù·šºç®,þ•SŽ§Úø5Ó½DÝœÅÿtÇMü¹ðÜÆîb}í[´N¯6“äàÿøÇÏeóµo}´žõµk,üã?+«ÿñÓöýÒ69гú?Ýqë ϱ|××®a­ú­Ó'±V}(gÿü,6_û7x´žæSÖÐ7} Už–ÊéÖ~ôªW³ð«¸¥çp{Êz3YÀôI4³('~Õê“hþ—¿ãÏËcÆ­×pþ7°~ñÒ,þËÊʈE#ô÷÷‘_—Åÿ?žOÍw¾bùÿø‰ãÇOü½gÜôýœüÿùöû¹ä7·àÏËcöíæ˜ÊEwý„Õ‹žËê.|{ÿÿp“®ºØò¿åÙEÜòì"zfÞzmÎþÿ÷­wséoÿ^_ýõÍ\zßí¼óûÇÿ¡ü˜Ú¹ß¶üçÿe óÿ²„Þ@€ ~~cNü%7ÌçʇÌ_BÀþ‡ª™Û|bÿv¿qìüù/çðÀS‹-Ÿ—Þ[a% øCÕ‡9ùÿò_α|þ4u—µÿΆqYýÉ—ìI˜ìýÿΆqÌa@S·q-u×Z1sõÿKK¦±dÝZ^m ð“Iæo“ŸLÚÃy+òÿ¼ùÜl›_½±µ™­æÄK»rß&ün§©;šMzî¹çŒmÛ¶YÙ×dY¶²£é©·BÈ%˲•qPUUdY¶˜%I:¤öº®³fÍf̘ÁÑŠ¿nÝ:yä‘£¶ÿG?ÿ~ø¡µªrQ‘7õ"FÃívâñ8p8::ÂèºÎȑńà úû#€„Ïç"N2yòä4üõë×#Ë2'tÒAû¿sçN4Mcذ<úûcÖ‹ ·[Áívàt*ø|^öì饢ŸÂ77|>…DB¢ªª* ¿¡¡I’˜8qâAñÛÚÚ(/w«ôõ%H&IÕɸ݇„ßïE’ ¢Q•HD'7ùV™Q£òH$üiø"aÀˆ#²ø¯¨¨`êÔ©–€V¬Ž-LˆhívÅ4óeC¬WÇS<ðð,Ο]WæÙe—QXX˜¶‚¯À+//?d|ñàRSS“öÅ*Î3ý„_[[Kiié!ჹRyfy.¿O ÿî»ïæÜóÎåÔSNåƒÕðÖò·¸óÎ;ÿãð8ñÿ7ö¨×_(¢  àˆ]CÁ?ÚÿÿæÍ›ÇºuëØ±crj 2™LÇI$$æª5"[-`‹½¦iH’dmâ¾+I^¯—’’ŠŠŠðx<ÖË¢¼¼<6lØÀW\‘†/I’%òÉ[Ĺ=³´ÀH$ÖK)Ñ^|ŸÏ‡Çã±êt]OÃß·Ïÿˆ,av!}¦Aë3ëD¼Å´·9ZñÅ5÷…+(0«dþýý~?+W®¤½½¿ÿýï–ÿi§Æ¦M›˜1c¯¾úªU>vìX¼^/Û¶mã´ÓNcذaÌš5‹ /ºˆ2’W;ÐõFþÊ·sgÛ;~ àå—_þDø_|1g͘ÁÆ>:d|»…BæïÍ–šY ›š›˜7ož%þ¬¤B}Ùå—æoçOúÿ/ê–ü× Á‚–ø°’ü«¯¹Új¸ð|àA ÿᇶÄÿ€•@àßüÓ›?¾˜È0zt1Á`4õ¢Ø‰ÓiPT”ÏæÍ¦sòätt„èï'()É£³3ŒßïO»ÿ‰˜~¿m–ÊAð'L(¥§§Ÿ`Ð|‘æõ*8:ÅÅøý^6nl£ºº8…¯‘L&).vÑßo|büI“Šéë‹ÑÓ%’zçåp€Ã‘¤¨ÈG^ž§S!ˆÐÑGÓÌß n·“)SJÙ¹36dü/îÿGÖrÝÿkk§åôÅbiB{l¿ cÑhZ],³ŽEy}}zÁþÿ§L9áSÁ߸1ý><þ±ÇN"—}RümÛ¶fá_tÑEÖ¹„ïni!ýïYiÂòíÛŸcÿ~s6éU¥kt»µ"}w÷rúÃÇ‹þcŽùÛ·?‡Ç{±è߬6£&`µ¶†®®Þ}wà¥vš¨»ºMí2Cû;›†[çBäo¯eös{› &0EUùH2¿SÅDQ˜Ô¢s»åû𬉅ãÇOó±‹Ô3÷öÉ—CˆÙ‡üòaçß.ü‡tñÿgÁ¿]øéâÿÏ‚»ðVÖ²cþEôõ…‰ü‚üÔ¿•d.#*Ë A\Õ …B”—#I ë†¥ “Ñ Cä瀄)Ì12Hù†¬èÈ’„ªJH@(ÔG^žè …@’ÈÏÏ7Ÿ-1WzE‘)…À7žet¡> ˜øŠ²DA~~ê¹UG’%´¤Ù®/Ô‡ßïGúûÌßxùù ›ä³ú Q^j뿔꿤 ÉÏ+Ä d]àË&¾­ÿ’š*§ðC,¹b:Q]ÇïPÀ¡‹k8|2nÅ…¶¯ £¼Ãåduc/è_š8 —S¢¯?‰ä3û[ìè%šÐèÈŠŽ¿ßÀŒ©,À(r£hQ"á$¥•½xóìoÎGV \]]ÝGÿþ¶#Š?fÌØ/øÿ‚ÿ/ø?þ;{È÷HQ™“&—󵌨öÒÑ–dü¨$Ñ„Jã'ÃGÆ)ésE)›X‰‘ïBÖâ4­ïá¸35|yÒÇâÿƒ=xAŠ*œ4¥Œ¬é`DµŸŽ¶ãG%‰%Tw¸62FqŸ‹D Ÿ|7²£±¾‡ãÎÐðæñ±øÿ`g/%ùä˜Ì‰Ç—±z]'•U>:Û“ÔŒLKj4nw2ldÌêéÄJÈs!ëqš7ô2ñÔ8¿‘†_öëDÔl¡¯Ãa®fKéZ Ïm&(+’èìÖ‰kæJã àT@5L!½KŸG¢¤Àüžkë2ˆ& œP$ ÍU7PuÕÈQÿ»«ÍUŽÖñß#ÿÅøÃ‘µ'¯<ÖîgšígÖåòÏ,³Ÿ?Žáóùðú=ìnÞc‰ý…È_üE]GG'åxý¢áôsnÅ IDATX–o4K;ßݼ'ëØŽ ôQVVFaQ>¶µX¢|!òQ×ÜÖKÕðb ‹ò ú²|ƒ¾´ó ÛZ²Ž31Þ÷æáñzèî ¢LHšÏ { …"ÈŠDQa‰™L{T/>ŸD"ÚèIÂáPP` Å);ÉËå2ÅÄͼ5B[b8 &4\ÇÛíFUUâ; ô¤ú9ÁïC™`&ü÷¸…È ¦ðûñùœ$IÔF×AðèÍS!…O ߑ‡Q••Ÿ“þiüÏ7ÿ»“üóe$ânž[¸Koñóç…æê?¼×‰¬ÄYô³ï’²ÑVþ?}üóߺ3rHø•ÕÎ!ñ_SàC‘`ÓnSü¿{ú£–È¿|ú:þéô/ñß«þ‘U°{Ý:ÖÎÃô?<kaúc0i”FO_œöà@€Ic"lm8ŸP!ßcþæë5"(¬ÞjŠÿ×MÔùKÓ×q͹çð_o½U¦¸%ÚD7=}qš÷$˜v,¬Û6p~b%6|Rý7Åÿë¾ò¨%ò/ÿÊîþgÔ™ø»Y{ç7˜~÷‹°¾ò"L=}ÐH0i lm8ŸP8€ÿQ·ù7;vî±@¶ÐßnÇÎ=vÐúÌ:ï@1ímô‹Ìà™Bs»ééƒÖgÖ‰xŠio#Äø™Bÿ4[‚€ƒÕ‰xŠ©Wëw§}ÞϺÿ}ì;¢øü5u2#µ7§ë€Ï`õ™u3lÇhóÜÜçŽÚùÇGß>ÿùî»ï¶ÄÖ™ÉÝíev[ùN]VYsS¯½öwÞyç!õÿ™gž9¬øW^yå!á¿óÎ;‡ÿì³Ï>¢ü/ºÖàÁº \vÙeG„ê©§þ~eeåùïû„¢ÞOjzæÀ×gl_Œ¿ÝvÖ™¦pUó+Ê*¬cŸ×Gž?/­^”Ù“ŸLë÷§Õe&°ÇÂüŠŠaÖq^~¾•\ ³Ìž `°‘h$­.3€=Žæçå秉ôEb€Ì²\>YýïëK«Ëÿçå糿ÕÊ5þ*æŠãÛo¿{ï½—½d1¿}é:ö.^Ì/ ›)ÿú]tþÏ]”ÿ±Šß¾tÿzÉb¤ãš¹ë®»¸ë®»>öøïOúSxàëø¿ø¿þõ¯¹ãsϋײå÷¿gAYˆQß¾½Ïß˸—ÆpÏ‹×rÇ7Ç1¥…;{î¹çcãßxã<üðÃÖño~ó~þóŸ3ÿ[KXð—«Yõ›ßp)Ô\u3O?Èä#Yð—«™ÿ­%¸§îã¶Ûnãw¿ûÝñ¿6i8.E$ ]7ç·†N‡¡aè ’ªŽ$Ë膎šÐ‘]2n‡NTó2¬¸€ý=}x}Š M×Q% â*>ƒÝ¡—„ψSe˜ï+œŠKÒÐtH膉ï1tƒ„aà‘AÇCà+2º®£& d§„SÒè K”æßåQ(õB\“Q-…ï44’I„n ¥ð1 âºß¥`HN TÍÞßa¨´vÅ(Í÷_ÅãSUâ%a((©é›. 0N7¿ç[§W3bm»äj´Õ¦Ð_9åø´úDJb1No¢qmå”㘴*=ÁÍÖÓÏD[½Ùj¿K®NóõýÇÏ8}=»ä“Rõ¯¦ê/B[½ å”Ó§¯OáObÄÚ­ì’OB[½*õùÒëõžÔç[Ÿú|§§Åø|f|Ž9ž²Tû®é“ Õ¾L_O×Ú¨%þÑ~ÏéÁêUpÊé¦oêó ¿Ìz¿líVÓ7õùñPŠS¡¢´‚<=ÁžÔÜ9‰ÃGP—Çî½-8NBý}Äâ1úB}ø¼^òòÌ{{¿y÷çù©(+'‹ÒÑÝM_(û·Õ—N>ظi#:ÑHì¨Æ¿eÕoþLmW–1®Ö\¼nW}©UžiB¿«~`ÑÇL_»Ï¸ÚnËw\m7±›´úÈ™m}×dã ¿\–‰ŸËWà/zÅœvш"†?ÓEÛ•e¼Ú f™ù’·ñB0ïÕ‘ÿê¢ÚÅ 1…½Új~o\³BÍòÍåwш""ÿÕÅÊ ÌD‹7-SïàQ`ŽdÒÌ´®(Š5¨àt:-Ñ™¦i8NTUÅ0 $I²Ä\Š¢X~‡Ú^dÈ;šñ5M;ªû¤ñsñ?eÊ6n܈aƒ1òó]hš„®D£IdY£¤Ä‡¦ëô÷'R˜RêAÚ°ð~}}=Š¢0yòdKy þWWWÓÔÔDgg„Š ?šn®,b®Ìœ$WI&uòòœô÷'H&ÍI¥_×4üíÛ·£( ãÆ~EEèºNq±‡@ †$))|#µt]×Ðus•¿‰NKK£GYøûöíCQÊË˳ð5M£³³ÓÃ^vÙe¼ð‚)²:ï¼óÒÄ·—VrŠý3-Ö«[ ž]WÀ /¼Sè»|ùò!ã_vÙe9ÅÆ™&2󫯯? ¾]4| |!z> &J>øvþÿc…Î 7Ü`µ;f¢™­¨¨(ëïôið___?(~æßépõÿ¿ø¯¼òÊAñí~CÁ?Ü×_®•F?ËëO  ÿhÿÿ÷_û 0}¡Pˆx<þ±‰Å€·ÏçCUUt]·„úº®§ÝÿíøbP8‘H˜+Mx<Ö½LA¡¦iÖ=Þét"˲•Q×ív[‰„ø_Ó´´ï_0gÎë3ƒA Óú (,,´²B^~ùå–Ÿ¨_j:ßvÛmY|ˆØbo%,×$Gûà”À8ÿüó³¯Þ|óM«Íu×]—…/b‹½=–°îînJKKÓÚ‰ÍKKK-ŒiÓ¦Y~¢~m•`{Ÿ2c‹ý›o¾I(â–[n`áÂ…\{íµƒòÿøã[eÂO´É¬¬¸ö8‚ÿÌX¢ý¥—^:(ÿþóŸ­2á'ÚdÖÛãÚãþ3c‰ö³fÍ”ÿ•+²ø ?Ñ&³Þ×Gðo÷ÍuýÿñÌkî´ÓN#//MÓˆF£œ}öÙôôôpÚif¶H—Ë…Çã! qÚi§eñ'âÊõÿÔSO6|ÿP®Qw8ðEü\×ÿ`üÛmáÂ…Üwß}–¨_d&·¯œ.êí>óæÍK»}ÜûÏâÅ‹™?¾%êŸ?>óçÏgÁ‚–ÏüùóÒ|,Xvú¸÷Ÿ¥K—rã7Z¢þo¼1mp^”i>?üpZ߆Êÿûï¿oWUÐ ãp(¸\NvîÜÉÈ‘TW× ë2OÑh I‚žžýV;Áû²efæï /¼pÈüoذU…éÓ«ikЊàpH¸\.ZZZ"L9¡ CW¨¬,"5°õ÷·æwšà]ü›9sæù7×ø˜2ÅG{{„¾¾²l ™÷ïßG0˜¤¬¼E)cøð±s7~Øßï·ú´zõjN9å”Aïÿ­©ÕâÞï}Î8s`e8Q×6˜É0„_®z{ÌÌØï¿÷~V,aMÍMY/ûÅD€Ìÿ·Ì‰öz{ÌÌØ"Ççß~ýÇbqÜv‘;Oý}Ýëëë‘d™)“'CA’$ÅpÆãlÚ´ C7W9ýŒô¿!ÀñÇÇã>àõŸH$ÓEö \_‡-[¶ É2ÆÇãõ"I±hÝ0عs§…?mZvƒšš\.ç¯ÿ¤ªáózÓÚE¢Q|^/MMMH²ÌÈ‘#ñù|H’D$Á0 öíÛgáüñYø•#Fàt(i×eå><^SÄ-Dû€µ·¯0±ÿH¦¨*¥çžËî–¢ôªê/[u’rã«ÿf‰ÿ_³ŸëoÈŽSU]ÍÆ¦&v6 gçΜt‚l‰ðÛö½aäO`@ênÚk¯í´äæg˜@_Cƒu̾7ÒDÿ\`–_0’,{í5SrõôÃË¿ÿ?X7Áâñ³ä_ˆÿÿ³NâúÔÁùÇvü ñÿ«[ k•’ Æ Îÿ¸aðÓïÎÆ¡8ˆE“$âI|~ÈÐêG’]ȲDk0ŽÃåâÅåïcè:s.:ò2ªªŽèH,zé= CÂ%~6çRäÔ±¢¨ª†ÃÝK¾ÏGO·ŒÏíâ?½…®éÌùÚ)~<žÄŸ/IûC&þ[|„¡ë|{Æd*ʼ¨ªJXC6àé•Á$øá·ÏÏÆwõ’ï÷ÑÓ%áó¸yìÕÐ4ËÏšháÇ¢qòò=)ü0’ì ZƒqÜž*VokA×tΟ2’a>TM¥¯OE2FñÊzSddÈÿô•S³ðeg7…yytuBž×à ïoGKꔸð¸=º#¸œ.\’ R’N¢È™ÒÒœ²D\§¤íéÅ`„?J,#÷ãÔÁçUI¨ ‰"'ýyNC«¸œ’hà”t —ÇS׈E’Ÿsür x÷ÿHãÁÿüË””³» J=*còÜ´ìÚME9è}qjFª´´x…x=Š ¡"’¢Jâ†Dÿ® oœa“ŠÀÑG¸]E)tâŽèÄ£êñ[zdJÝqÆæ9hiø Æ2ñûÂ<‡,ÑW¤[ø}»zQ} ßÙG¸CÅQìÂÕ¯ ß俤¤˜Ö“D"Á˜<{v·P^f`ô'¨‘`Ï}a^¯†C–ë”V’0$úvP} *Ž-@öôïNâ.ó¢Ä£*5µj¨m‚Ç"ª™Æ 8奦SWÀ œ4}T }æ>’0ÅïnÇ€ø½;’bæªq;$ÊK$Úºtº‰ˆÝøwÿ÷FŒ¾®ëx2Š 13<²®ãT$*Êd®œ5€{þô!NE&®A¡[GÕáæohõá¯ëÍ•\!s¢_,aàQ ÊJd:º4â†Ì—OàŽÇÿ‘Žï’qHÍÀV¦0÷«§pç­Â鉫øó¯:ÝÂþ=sU£Þ>ÐtƒXÂÀ­”—(´w©Ä ™»ÿùKÜôï«ghºŽÏeö?ªfãÿôÛæXçOþ}9®~A ÿÞ$O^òÆúƒâÿÛf …xøÕÝüøÂ±üÛ+̓ò?çËã¬øÿ±¬§"3÷ËcyjE3ªלW…Ý^Z×2(ÿs¾<àûÛ¥[0$¸ý²ã¸ûùMƒòÿ“oLÇX£ "»‚ø½^‚åÓì£øD0pàªI 6¹Ñ$gMg£‡$IŠURÑÆiÛà¢h²ŠÇcŠÄüm¥¨»¢D’ ¤ñ Jj‹ØßÚq„ñ{Røà”¡¢¢Ø†µá{h ÆRø® µÉ‘Â×q6*6|ÐÆÆiÛE“;c1ð·ùSø*Òx(©õtD¿àÿsÎÛ 7Û[UUÄÔ‹ pë\|k1zŸ“öö[ÖxqB'?ºc›?lã¹{œ‘ÄaáÿÓÅ?8ÿ{^—SøŒªÊ;~€Ý1ŒÍ¶óܽI|ý üÇ ¹ÅÿiÿεÓ(ŸþJQʧ¯£3UgO0ý«4$¢¤‰ÿ«Ñ“0ed„úÇê¡ê}LñDPãsÂæm¦øHøk§!M›ÑÒôu©:{"€\øvñÿôqyèÉ~N¤ð?¬‡S«°ð›[Lñ?&ðï|},å_ù¥3@gªÎž`úÝ/æèÿ€Øßì¿Î”‘°ñÅ -0Åcâ\w­ÚVÞU&™Çƒ˜]G-üÞU&1CÛ ÚV¶ÙDƒYÌH nµâÿ¯œŸIXæ ™ÇƒØ2æÕ ¿eÎ& ¯“.ðº0™Zˆç|²l™3d Ó/š$ kœt‚̈d:­N³_ëúæÁ¿¿Æ5¦å9™õ¤Ï“ùš;•uÒ@œIƒV§Äº~ÕL P?œi@Xb‘ß0±E¶cá·ÈopCX‚°ÄføßNý=rÄ\ä7¬þI|+¦axÖy<ˆ=k;~ÏúáŠpª}†ÿáÔAŽ˜Ïúw!yõÇŸÿkÿ-ìÎ;ïüÌæÛWèvå•W~fø¹æú}öÙkþ3d‹¬Å»J[Ï:{&.ÎÎeöÅ`†Òÿ£ÿÓäßnG¢ÿÿðÅBâ=ÙPìµ×^´¨jLáæ™gÿ½÷Þ´¨jLáoO<~0«…çj#ê†SøiþÏ>ûì!ã¿óÎ;ƒ¶uC)ü4ÿ™–)°·[.±¦Ð_”Ù÷yþ¼¬Ä]9Åû™ûÌÏ–i™BQfßû¼¾¬~ut´*ÞÌrùg ýE™}Ÿ—ŸŸÕ/q<ØüÞžæÌ™C0¤¹¹™Ûn»½Ä\é¹¹¹™)ñ?—?E9wñ£‹žâ?^5ëo»í6Âáð'š¸wï^.¿ür›6mâºë®ãŽo˜óv7mÚÄ=)ñ¿ã»Ï1ŠÛ¹âŒE<û¾YÝu×ÑÕÕõ‰ænß¾óÏ?ŸîînV­ZÅå—_Îüo™‹ ­ZµÊÿ{¿¿”næÂ©²lëO»wï>èüäªsìWÀG/=ÅØ™_tþóî·_Ä¡h’DÍ—¿Iaa!;ÞXJÍYæœ må_‰DAVÀãR¨>ï[VŒáüï{÷eÐ TUeôlsžpãÛ¡túìAç?÷¬]ŽCM’¨øÒ¹±sùŸwÖ¹&~Ý+Ä·óúðmÐ TM£hº¹z{ÇÚ7pUMÏ9ÿYŒ¦µ8tßuŒé×üö‹Œ8u¦‰ÿÞ "QÕ¯:÷›VŒa©8%)þå–z ÆéMÌ–`ñ£ßgú1ÿÎìÂBê&Øgòÿçú?Xþã†Ù§²Bÿ¦÷ÝÇÃóÛŒ÷_Ž'úèfX½™ëN1ç0#ü O7ùßÊ™ÔL÷òaþªUsÜqOSTTÄ鼜ú O™ü7>z»R‚üË'>DQQ+t/ÓB¿`Wýói ®;e.ú §§ó¿iu15Ó½ƒë9G2ŸÜ–Ö/fv×·Lþ%àdÀxÒœ>V4ÝÿR Ö›~'—²”Ó9±Ç|Ú±ãê´¿Ûå'? Ɠֻµî7S×W7+¸…²é^"Ñ(ÒßvÒHÓÇX±Îºþ…¤\\ÿ']{eå4'i{å= ™ø‹Øù§×wé¹äçåS^^F4§ÿíõiŸ' òÁÚƒAj¾óÂýýD¢QÔ··Ò ¸N›DÇk·®1›W\ÿ§^ÿ= ¿åÿ½MQQÇ_ùu¶<ý2¿{a~ï«Óðïý}+@€IW]láG^ÿv ïìÙýÿÞ¶®±\§˜ÿ?ó–k-üíϽJii)']s9ëþð<'^ó­4üö¿¦'¥èîî&ò·twwS;÷Û„ûûþL¿ú±yþå¿ÿŽëåëLþ‹§óÿÈÔ±®ë7Ì¡°¸{«~ÏõæÀ÷á§§áÝÞ|«§(N]ÿÍ…¿ägõÿáÏt1œ.~:ǼG?ðÔb¾ºÜä_¾làÿ3æ´~·î2ŠŠŠxdêc|·î2¸þHúœ×ë7Ì1ãlF™q6ËE. po3ü™.®®NÝ£—¼´”KÎ<Ñä_L®àÿo½m‰úç6›~÷Œx›¹Í'òò™ðo§áß:gà$ÏŒó~¨”îsº¹˜w¸f…ÊM||«ªªÊXinnþ_•P@öz½Ö€r©ªJ$!™Lâp8Ð4 ‡ÃÛí¶V…ìe"£Ú¡´1Žf|seã·ÿG0þ§L™B<GÓ4ü~7Š"ápÈȲB"¡‰$‰„Äb 4MGQ(Š)®\»v-|ðëÖ­Ke“2Ø´iÓû_]]M"‘ µ5Hžß¢€Ã¡ I ɤA4ª‰¨ÄbºŠâ dYaäÈ|¶mÛÆæÍ›Ù¶m£G ë:»ví2~EEEJü)“—ç@–uEFQœè:$“H€¦™ü;Ž”¸T¡¢ÂƒA»víÂ0z6Ìða.:;;sò/„µB¬wÞyçQ[[›&νbZÈ•ïm×ÙÛ®Ó•8¶—‰òX¯nµSˆ»|ùr®½öZk•ou0üÚÚZKl¼uëV¶nÝÊ+¯¼bÛËìå¢íð…?SÈx(&Ú~üLþ¿>™œÛÌQÏ„€ÊÊʬÍëõ~&ü×ÖÖrë­·òÀpÎ9çX[®¿ÓÁø?Ü×_¦‰Õ‹Ôõw0ü£ýÿÏëõZß⥮ë$ ’ɤ5P.üBx/Ï…¿ªªæJ šfÕišfÅs <×ýߎ/„ü¢½×ëeìØ±L˜0c=–ššjjj¨ªª¢ªªŠ)S¦0aªªª˜8q"&L`ܸqTVVRRR‚¢(hš†,˸\®,üË/¿ÜzÀ ­Mü ­ã9sæ¤%¬b°G š‰z³±±ÑÚ ;ÿüóÓV+óAEl¢}SS“u|ùå—Ó”þÔ××[¬b K šÙñMMMÖ^Ø´iÓ¬aÝÝÝÖ¶fÍ _ŸþùVŒ5kÖX¬Bt'ÍD½ˆÙÔÔdí…]{íµCæ_Ýo¹å‹ÃY³fYb~ûÿ‰ýº_¸pá ü_zé¥Cæß~¯}¨­­µÄüvÁ½8®¯¯çñÇ”ÿY³f ™ÿ±cÇZ±EŒ±cÇZb~ÁýxÍš5üùÏ”ÿÁ®a{÷îeñâŬ]»–wÞy‡Å‹ÓÓÓÓO>ÉâÅ‹Y¼x1Ë–-cûöíÖùž={b¥¸=Ôëÿpãêõ¸ñ•± ñÿìÙ³-‘?`‹möìÙVÝáÂ…‹± ñÿìÙ³-‘¿À‰D½0»ÿâÅ‹?ÿbâÿÙ³g["/ˆzav1È(üŸqÆÖwŸ¦†ñz„Ã}´·w'>| --í„ÃqÚÚ:¬ïµ1cÌÿÏ‘#GòÒK/±lÙ2«o/½ôÒùŸ:u*‰D‚M›ZÑÔ0B8ÜO{{á°JIÉ(ö´tk´·wãtºe¨¬ÎäÉåTTTðæ›oRWWÇð”ŠóÍ7ß2ÿ555Äb1òò$Tµ·"‘~::ºPU()IG{?†]]]–`»¸¸”š?gŸ=†wß}—ht'aŽ;.Ÿwß}7'ÿ/,}ÁðÛ÷b{æ™g󅻸þ[[[­ð¢^Äõ"Ö3Ϧžy&±8.§“î®.üyyè>“N>ÕëcúÉ'[IDûx,FOoï®ÿX,fm¢}oo/í(SOœJ_Ãï§5ÂYZŠÓéäØcŽEq8˜r VÒÑ>‹ÑÛÛ;¤ë?ZÛ¾T"‰ÞÞ^ÚÚÚPŽ=æXúûú1üyì †ð”•ãt83f ŠÃÁ„‰­¤¢}$¥··7ëúBóÌcaBà-öB|.ÎëêêˆEÿfµï~ë-öïi‰È››š¬Uìí±¦LI2gÎ$å¬,ysS“µ½ù†¹’}CC` ¿«ª«­ó†† ÍÄ—”³hhh`gÓpëZ}ó7¬X Ö~|u\pMpNÖŠóv܆††4ñ¹(S¸X±LñÿV;{ ±?é™ñãÇ6þ6«Áÿ¿²ïÂÏœÿ¯Vî³ÄÿË÷NøÌùÑújNñÿÁøÿÑ%gЊ¢'Er8è$ˆ£D£1B==hªŠGŠáÕÀÁ—C(¤/d°§¥ ‡á$šÐ¸á›g#apÛ?O°¯`B£½m/š±Hœ¶6ýû’ô÷öšÊ>IâÊY'¤á+ô‡ã„ƒ¢‘(¡žt5™†ÿƒ¯œL_0dá;qIh\yÞTæ~õ4¡tüh8F[»Æþ½ úH=kmê(‚pZÿCý1ú{ÄÃÝ]hªŠWŠãÒú‘0øÆièKõ¿eW'.ÉM4¡ñÕéã€ïœ9‰Þ``B£­uš‘þ(ímûöÄ §ð‘$üyN"ýj$‰ÃéÀ©@4©©èšNEaÉh”iʘ=u 1 —„Çéd‹ñÿÙ{óð8ª3oû®¥÷níò&Û²d°Y^KÀö€ã°ÌoX¾IBV0 ™|ù2ðf’w² $À0L&€‰Cp’H2 kÀØf'¶…lI–dkmI½¯µ|TŸRõ¢ æò\—®®íœ[ç×¥nUÕó{ÙT€ìhžáxwÀ‹KÒ©öÊD’Iº9T9OV3/Ï¥c¯‹€,ƒªâ zÞç|>àã?Òü¿êÿAÓ_•M›¯å 2)}Cýœ}¼ÊiÇU#™:oöù {ÙsÐCw§ÞˆerinU©Ö=„¼*û{èOfI»¸2nú†I¥ÙÓ•#¾'25¾fI»épöq §Wƒdj¼Õïg4ìcÏA]>ú¢ ºfÒ¼P¥Zwò*6?ëƒÁb9 IDATN¡¤]6oWŽøžèù å|„#Ü}œÂ©ÇZã«ÏGdØÇžÝüôFdô¼É¼Åâ{,~_„tª‘½Ý ß0À”¬ェõµÈY3„úðy%f5HD¢04b¢˜&ª Ù¼u|2™øUPeËäP˜˜‚™µ5~™Æ:‰HÄ$£YFùŒÆžÿÝ_ýÝ4Pð(V†aÈhš¬eñz$jBá°UèïÇ¿ SÏ“Ó ŸÏ’Ñd²y¸õ×`Ó–×1 “TÒ*¢ÛP !7T4¢ƒD&OÁÓÄõ^@7 T<ê?^à+Z¯G¢¶J'‰n(¾nÄ3bü¿¦Jc(l9Ö¾uÏfL]#«A^Ë‘-ð¯ÿ±UÜø¶¶`©ä²Y›_ÔˆDtY wÿ¯wÚúÃÄúÿô +ayÓÓ]¶þ·>ôŸ9«…l6<ÑiÿOüûí]¶þ_ø›ùeú‹¸ñ×mýüJúßù»W¸ëoØúï?wqõßG6ÿú߯Ûýþrë¶þ_ùÛ%eú‹øç/Ûú þxú“õþÞú_Ûmýÿ÷½ÏóOÿa²y¸qÓËv¿÷<²ÝÖÿÿ?+Êôw†{ñ"Ûlï^¼ˆè®×Ëö·î4ù Ó¿èk*fÌh¤¹eÑHœÁÁ!|/¯¾ò†mÖ†ýÁÁ!ÛÄßÜ2¯hY˜ü…éß[  ²—Åv°LüÂÀßÙ?JuMˆ]{»m³¾0ìw ûbݹ,LþÂô/Ú9 tŠ ´Ìªµ·ƒeüò-Q’w-D£QdE†®û>Jý2·‹Ü~/jk†ªª*–ùP[3ÔÕÕ¡¶¦IïUI&“Ð]M¾#€¢Èx<žÂy%[ÅÄM`a¿ßÛí~ð)ðݸûƒ Œ:ø~ ørûÔVªª@oPWBmÕ ü4tûÉw(Ögº…G–qðÁï—ß'ã?Òü÷·þ½›=|êŸqå óØóºÊ_Ú²dä.žø½Éö}¼ºÃOâN¿°oµDÏ}UgW“ö½cýß}þÄúw=.;øø‘~ŒÓ/Œà­¦Àœ]Mª_žTÿÎ?; þ“®w}NwÝm”Ö|츺Dù»WŽ-—Dû°Ë mC+©"KàVü¤Kj¹ŒŒ€ì~›¿³„¿³Àì¸ÛQàþî•EÅîñZOÖæ¯Z6kR~g<~Q÷±R~Waüðø°sg!%üÆsÆ–ËÆ̇îßuÆoàV—?‘á »;d¿.è´ŠJ­¿Â´·/è<È3Ê{;À1Wc›ÿ»»Cö~g_"&2ü ô§ì×å=ªÝFl_Þ£ò¨+VÔ—qža›ÿúSö~g_"N:A¶ þ"z]’ýóÈkL¯¼jX†}¬‚¯¼Z˜¬¢CfgB³û0ZBQxdU$ ×eµ¯"&2ܼ4¢Ø¯bü_ZmÚÛ—÷¨ü8`õeœgØæû—F{¿³¯÷ "ÿuìØë¢ž±6bû¢ž‚™ßÙ×™cæÿ—FÆö;ûñvóo¼ñF~ýà¯íñþÆoä;ßùλž¼iÓ¦ŠüM›6ñ³Ÿýì]çoÛ¶­"Û¶mlÞ¼yZùÏÎÙç+EkK«ý Eû+µ™Lÿ¶®·ìW±¼hÑ¢¢í¥}9ûtî¯ÔFÄŒ†Ìh˜Q´M˜úÉDÅý©tÊþ Ž»Oô!ú ‚ef̘Ɍ3‹¶ S*ª¸?Û?ƒƒãî}ˆ>ý>YaÐ/Ý&úª´¿”7Q”áÌÿY»v-çŸ>gœqÑh”3Î8ƒ¶¶6Î?ÿ|ÚÛÛ9¢¡§‹ >.ý9,±ò¾U=vÿ3²víZÚÚÚX»v-Ñh”ÓO?}ÂüŸuëÖqÁ°jÕ*"‘«V­¢­­ .¸€ŽŽN8á»Ý™gž €ú‰_¢g] ÝÐ0V ,‰°nÝ:ÚÚÚX·n‘H„3ÏŸÇ4‹ù–Ñb±,±hžš7##FF2D£9jkeLs˜¾¾¾"¾0k‰êX¢:—0û]Üj}9eFÇLå[ÖØ?ëN“*nóÖÊe&ôeË–ÑÕÕe¹“ò/¹Äú"ÆW€%K–Ð××7á«h#¸ãñEŒÇŸÊÌã“Å;áO¤ÿï_çˆè¿lÙ2Òét‘Þ¥ë¢Í;ÿáÐÿ_þå_ëøÇ;ïJÑÀ˜ ÿÝÿm·Ý6mþýïO˜úe‘ùˆõ=%¾³DÕZgÑQÍÖú^2ìjÏÎ뢱Oü˜¦I.—+*6àä‹öªª"Ëò„ߟ¢ð‹¸Á.Ú;¿ ð?ë+ñ«««íªˆâB¨ºººè&U{{»ý^ŠX¸p!mmmEï³Muu5mmmv»ööv»„³¯šš»*Ÿ¸ª©©)ºIÔÑÑAkkIuâÖÖ2¾³MMM mmmv;a`/í«¾¾Þ®J)Ήúúú)ñ·oßÎÊ•++òëëëÙ¾}{åÊ•e}9õ¦ý#¥¿0í)ý…iÿHéï<ÿEÌ;—õë׳|ùrV­ZÅúõë©««ã³Ÿý,ëׯgýúõœ{î¹uÔQöú¼yóÆú/§˜îù¸ùÓ=ÿß þtôoooçÞ{ïµL®X±¢hÖn» í4¿ƒ5øæÍ›‹¶½ÏŸ|Ð6ý¯Y³¦lƃñø7ÜpCÿí|þlÞ¼Ù6ý_xá…ÜyçSâßyçùÓÑ_¼‡{÷’HÄñùýèºix½~úû©ªªEÓ¬ïÀp8‚µsÌL–,™I0hpô1M,XPC,£¿¿Ÿ?üáSÒ¿¡¡¯W%™LàóÐu0M˘„Šªë:„Ã1cÌŸbÁ‚*d9A,f0c†›Ù³­ÿƒ6oÞ<%ý}>»v ãñ¨$ ¼¾âD­`0H8¶O€ÑуƒIz{SÌžíeûö·ˆÆzzâÔÔd8æ/¿ürÿôœÎé9Ý6ì‹mÎ ûbæzg´¶´²iÓ&.¿üò2½ècÓ¦MvÿŽÎûXgeÿÖ–Ö¢u±Í9ówWwwÑC~°üoÙ¶•5«VÛÇ:Û´¶´²eÛVšçÏ·fýîî¶Û&â;gרºu+«W¯.â¯^½š?ÛÈç?÷yûXg›Ö–V6þl#«W¯fëÖ­lݺÕ>Vlƒâó?“± ¯—‘ѱYéFFGilh@óùPUu1sæLÂáaš››q»Ü¸\.b±8ªª¢ù|øýúúú¨«­µû˜={6ÉTzÜó?—³Œ^¯—Qtt”††EÅðûÑ~jæ6ø p»ÜálÃï·’j¿¶À-ð³Ùܸç^³fdðû|•ùªŠ`üÔÌ›ÇÐÐ ,Àåva gs˜Š¢ 9ÔÛ[Äoš3Ý0˾Ë+E§ã»\ÌÜÖ,õ-­­öö¾¾&û¸ú³ÏæxM+j÷替´—Åk8<ÈðSOÑÒÚjo›Y¾µÈà½ÏžåÛì¿xñbþôÄ|tÝ:Û¸î<®¥µ•?=ñ‹/ÆÔŸeß¾}|tݺ¢cœ ѧ“Y‰òwØÇŠí"¡R´ bÈßa/;û:Üú?òø$ßrÄô½ã/ð{ÄôïÏ)¼™_8-ýÝ^Á D:M6"¯éøý>FQ¼¾¦"1:2BM „žÍ€dݬ¯¯¥«§‡ÆY³0Tƒ¡Ak&[—ŒiªŒŒ„©©©$’‰3ëf224LMC-Zá°Çgñãé™tŠœ®áø‰$bxýþè(5þ‹_WWSÆ dZSéQàW[üT2nñÃ#T×× À{ýªªÄ’IÒÉyM' IDñúü KDFG©12c㯫¯¥³«‹³gpkü’äfxxˆêšZ{ü³f3:4ÆÇ4Ñ%ŸW&mèHFžd&‹ª*È5õ30]2’z:ФšV¢¨bϦÉè:šÇ…F6™ASL¤€‹Èh†êêº&¡ -¦cæ 4Õ “×Ègrïs~ý|üGšÿWý?húwIÅPª= á­É#Ip¨=O6ã`F¥1h2§IGÑ5²š‰©È´ÎÐ8Сw§‘}.Œa}4Ö4œ¢eîl´¤NcUˆÅ'7‘ÊŽÇ"š‰£Öøè­Æ'øûódã1z2*ƒ9s5›oÈ­ 9ºÚ5bî4²Ï> Á Ÿ†šB³ªh™ç௜=.¿/6JRKãmNÔà«Õd‰CíÙøØøg7i(Faü²LKcŽžNÝæ# úh¨©'8SŒ_£±*È¢•³Iå,¾, Ó1¶1=WxÖtK}2 5Ö3–×D•M¢YËünš&nL\ªÄ¬™ ×:6•‚`ê«­Yèkª¬×HÆ2Ïç lö™¯ª2ª*£ëé¼K]’Ñ´<—DÀ+òi¸\.‚ëÞx,.²Ù,A¯Ó—"QÒíÿ«²Y UÍÑXç"Ÿ7O&çf8‘Ãëv!&9|M3Hç \2èX&€KÂï•©ò[÷×~<*Ùl–€×m_‘¨­2|—+Gc­J,~¯F&çf$™ÇãVÉåüT~À+òk¸TÁ‚™Ðæg²üš*½ˆ¯¨Ykü küÙœ‡ád¯[µßc§þÿúpçÛÒ&ÖÊõáÿ¼þ¶ôüñô‡rý+ñÿyãËoK{üãè/ÆïÔß¹}û©>ñ8{ÙðÚû„Á¿ôøÒ}΢ÎöÎ}•^…Qÿ„“–V¡®ÅGY×z¢8€0ì‹"b]ìÇ “uMÈnïü}Ä1¢€€/àµú¢@4§e–uÏ@†}Q@¬‹}â8aò!ú¿8F¨® ‘m—H½iÛ'•J¢ª"ŸÏãõº©ª‘|ÃÅp›Žišø~†a022bͤ%™¼MÓzÖÆü(èU%ŸÏ“Üë&·Ï‡®äryô}n’É$ýýýï>%|/ù<>ø02’dx8Ž,S—`~ÊÁ§ÀW |}$“ýý±÷Áø4ÿý«¸Ûú<M°ôŒ.šŽJÌ™ôíûÑtžh´–º–/mkäõ= jp&[ŸÐ= rü¹1êOœÏÁ?yß¶þï |ýûÚ3%| üSKøn^ßj°¾Œßùˆ<¡þ‹šR¬Ø`™ý›w|Ñþìêº{'÷lXÆW2Ä•Üs•õœÕiüßqÕØÌ•v,Ú ¨¥ÅåRÈår%s³CuµU é„Űbƒeö_îàï,ðu®DwðwN‘?ÃÍ”ø‹šàc¿³ÌþËwò»¸çwóà"¸ˆ{¾1¿À3þïøÆEåüù@7‘¡.—5YÎx|gÓ>›ô»»CÌŸ_l0š??^¶ÝÙ¦´X®Ô—aÚ‡b“þ@Š™³ŠgX9Ë_¶ÝÙ¦´X.m3'o2'oÒë’lÓþœ¼YdÒåUÃ6÷‹8é™Gö˜œ·D*:ÎÙï#{L»Ý+¯vá€Ò¾DÓ<›ä_Q8¥N/:ö”:½l»³Mi;±\©¯÷ _˜ö­ã‹—O©+>ö”ºòíÎ6¥íÄri›éæÿÞtÓM|ç;ß± ˆ—Æ9çœÃ9çœÃ­·Þú®äÿâ¿àg?ûÙ¤ü_ÿú×ï ÿ™gžaóæÍ“ò_~ùå)ó¡|öu âs]{[úLV„ó÷ÿÞ÷¾Ç~ðƒ#ÆÿùÏί~õ«#Æß²e‹m¸~¯ø+N•X±ì ®Y½ïˆè/ø üêˆè/øŸXòܤú¥ÆýR£º(0žÙ¿´X®ÔW¥(5î— EÆ3û—¶Ë•úª¥ÆýR£º(0žÙ¿´X®ÔW¥(5î_vöyE†­ËÎ>ÏÞ^©³s¹´Í¸üãþekÖtÌvÙš5ööJmœíœË¥mÆ‹Rãþ²æ£H^å³·-k>ÊÞ^©³s¹´M¥ÆÿñÖ…™_ôE †I$eRéTYEi¿¥ëÂÌ_jȰ‹8 $âñ²>&Šñ ˆÏìï,:Pjô¯x€3ÿGLdõì³Ïrúé§ÛúÝqÇ|õ«_åþûïàɃwóé•ß.îèÒŸÛ‹O¼›»ÿ¿'¹ùæ›ùêW¿Ê“O>I{{;¯¿þº(ŒÎüŸ°ŒÌÛ¶mãÌ3Ï䡇àöÛoçšk®á¾ûîà¡·nç‹«n)«Ÿø¥½üÐ[·ó«ÿóßÿþ÷¹æškxâ‰'èèèàÕW_µóÿD®°3ÿGL&³eËÎ:ë,[[n¹…ë®»Ž ¬°ÿs×\{î‹ø¾Ïq#«”ïì¬jÌâ‚Èi°žŠþ[¶l™–þ×^{mQ×^{-[¶l±õ¿÷Þ{§¥[[Û´ô¿âŠ+ŠúëBqcqªúwuuMKÿ‹/¾¸¨‹/¾˜®®.[ÿ-% *éïë‹/¾ÈSO=ÅÓO[7(žyæ^xáêêêxñÅÙ¶mo¾ù&£££¼øâ‹¿ §{þ¿[ü©žÿ‡›?Ýóßù]ýõ¬Y³Æ.±uëÖ2ƒûæÍ›íïÀk¯½¶¨XÀ­·Þ:mýwìØaï¿á†X±b+V¬˜ýúõEÅî¹çžiëßÙ9VMøÎ;拉¥…–––)ñ/½ôÒ¢b>øàÛúü‰Åb|ä#Ç ÖŠ i¦ ÙlŽD"NCC=š–+hÃíö3:š¦¯/ÊoÀ4½ìbt4Ç>ÔÂðð0UUUSþüÇãƒU~­0ca6›#S__O.gñãñ8nwˆÑÑ,}}qÞxã¦äàÁQFGs˜¦ŸúzP(4åÏÿD"AUU5UU $âcÙb™L†D"ACCƒ}›H$ƒÄã04¤±o_¯·ápëyU   Ëôþ¹çmÓ¿0î ³þå—_?„þ¹çí}Ï?÷|‘±_Di—_~yQAç±b½«»Û6î ³þšU«bs¿˜`ͪÕttvûE”ö±fÕꢂÎcëÖ­¶q_˜õ?ÿ¹ÏÅæþŽÎ{_GgG‘±_DiŸÿÜç‹ 8çÿÈè(¯—¾¾>fÏžm›öç651˜N£ª*.—UT)‘HÒܼ÷ÛC<‘dÆŒ¨ªŠª¨ôDFijj² Ìž=Û.0Þù?::Š×Á¦ý¦¹s‰Åâ~ªêB× ‰Í `&n·‡d¯(*ºÏÏàà MsçÚF~Á¯­­÷üÅïóq¨·—¦9slÓþ¼yóˆÅb~?ªêBÓtÉ$---躧„oøý ô0oÞ<›ß4gŽ] ôüáœ!ÞiŸ=û½OÌRï4¥—®'Ž:ª¨¯ï V¯^moˤŸ¥¯¯‰× Äö}ûöÙÆqaÿèºu,jí· áû;fÙ³ÈtÝ:û÷r»?ºn]Q­‹?cÖ…!]˜Öáœ!Þir›¥¾ÔHî\w¶Ý·oŸ=˽ØÖè ^yÕ(K©¤ÿùMò“/è\·fß„úÏ»ðq{ùpê¿vî>®9ÓÏù³M¨¿²¼×æNývµ³*ðsz™PwíØõÚtô—U™ØhŸÇCßÀþ*‡º»ijj"‘ˆ0köLæÌ™M4:Z¨ÙT–¡ÁAæ/˜K&‘BÁ`h`”ÚÆHH¤Ry-ÂQÍMD£Q LêgÌ °Æ™µä³²n"I «2Ñ‘~—þU~?:Æñ3©,á¡!æ/˜K:žDÁ <¡¦a”òcå|-§ø²*Žðùè$Xàà.æÎ›G"evÓlššæ‹’Ó-~:‘&<4Ä‚Öù¤b küƒ£Ô64"I_Îpô‚¹Dc1 LgÍ¢·¿—†™5èyÃâªÇEl8‹ªC,™ÄTÐÓiTÕ…?¨b !.7$³&’.‘Ëd„<©ÜŠ—ðP’SŽ«c¶_Aõ¸ÐM“d.‡äOÀ¤¿{%kà•å¿ò§ÉeÇnö¼¶‡7v¿ÉP/û÷îÿ€ñ±çµ>ÞØ=ÀPŠý{Ãï:{;ûöí-zÿÇûžý´½°ójеw IDAT˜}ûúKø•õoߦí…ö·Ï÷«Ô‚(ŠJë"ƒÞ^¬÷ß]2ó‚F^íP9a. e$UgûÝ,œíÇ­xðV5bø=4ø\(.Ý4Éhy$¸}ynÉX¬"ßP©÷Q•ÖE:½}_uCç…y #/ñZ»Ê‡æB8#ѨæyvÐKël?.Ń·ª3à¥Á¯¢¸T‹Ÿwò÷“ŠÇÇ?€"«´,4èë“ìóÿ@—¼@#¯u¨œÐd2œ‘iTó<7à¡e¶Ï¨Óï£Þ§"«*†i’ÖòH. ·OâÕç;È&SxÅ3ÎÂ÷¶WµLð†a-Ïjò&½˜ ÅL¢PÙÔ‘Uë;?k€Tð~ƒJ˜¤ “œ‡#&‘”Aؤ¦ Tµ`~{ö:ŸÂódÅÌ“7e2™,!Ÿ‡šFM­·ÇœÏ1œ°î¿K†žÏâõ{0 ƒœš‘Çå²’3Iˆ%s¸=n‡sÄ2&Ѥ¯;‡×ëB—dŠž|Ú|¼!“ÉäùÝÔVéÔÖº­™‚µ<#qÓ>Þ(å›c&’tÒ$–Êáv»ÉKD.¼îŠŽŒ<_+ð«ünjª4jk=xÜd-oßÉ×|—j?2‰%³xÜ›Kºñ¸³x'äWÖÿ’ÓM¨?ëÿÀ3ÝEúÿøñ..9m‘­ÿ—ÎiŠüÊúæì&ÔŠõßøØž"ýøÛ7øÌÙ'ØúíãÇ˯¤ÿ—/8mBý_èçowéÿíû·óå N³õÿÖ§?l£…¿Ôä/b¼íÎ}ÎBÎãÝ‹UÜç|fütÒº588dýEq3ó “¿Ø'Œüâ8ñ –ñ¿¹eédÆfˆ¢½0ãG#VRwgÿ¨môÅ`ÌÌ/LþbŸ0ò‹ãÄ+XÆÿ™o¯»övÛíY!?+Ž{¡ŽÔœ&›Ë¢ðÑên|>†a0::J.—³&¿è ¢wúÐ;}„†H¥R†ÏãÆçó ñEj‰£kËæÉ¤³0?EíI~f|¸†€¿ Lå}ÂÏã^h"5›¾Zààó¹ ü„ƒïBï”Ñ;BC5>¾ÏÑ&R‹æàë0ß ö$3>"àwÉ´Çßí ÿ­8ýoÅé{3Fï‘÷Tÿ¡|?±ƒ:±ƒ:ÑÈÜ{ªÒCmòÃä]Ñ¿goŠïüÔÏ-i´ßÍ­×¹=´^eÍ'žÁÔÄCäŒ4ý‡ü$2)θè+Öª7Ø÷†Š†åh};ú¿·ürý;^‹ø-ÇG ü™|ôR5ŸxS (âà ³bíÈ8üÊúW aþ¿‘åp÷ ¸{7²Ü6á³ÃúYqå†±å Øæûæ‡ðx ¯?‹!ƒ&)d³Å ÉGíâ¢æÿŸ°ùîÈw¯à'ÓàŸrÌÌwÈ·Ìÿ?a9ò+o,ð ElæE¿³—?ö;lóÿ óCxè¦ÀgJ|aà/5ëh™;¡¹¿týL}OQgê{ì>æÏ󌲤⸅¿Ô¬¿sž6¡¹¿týÜ|UQçæ«ì>fÎòó¨+VÔW¯K²Mÿ¸/Ìúç-‘0Z"s¯kl_oaÚL§±ÿo=JQëQ0Z » À΄VqüÂ@_j–ß9O›Ð\_ºþå¤TÔÇ—“’ÝÇ)u:?TþÃ;òü±W§Yÿ¼‰Íý¥ëŸJ÷ñ©äX§ÔÁ/cí¦“ýíoÛží~¢himåœsÎáÆo<¬ùß7nœÓ¦M‡•ÿÔSOM‹¿mÛ¶)ñ¡Üd c¦lçlë"DQuñcÏoÄï/f¶¿ù曹ñÆßs¾˜Ùþæ›ofÓ¦Mï9_ÌlóÍ7³mÛ¶÷ŒÏ±–‘ïË÷JGDÿJü÷RÿJüñôw†0ðW2ëOdîŸh]´›¬?3ðW2ëOdîŸh]´›¬?3ðW2ëOdîŸh]´›¬?3ð—šõ½·K/;û<:ïÑ¢‚eüBÎW©Y?yl\8¾¹¢uÑçekÖ°qaqA€ÒþR³~ò*Ï~¬§ìØRó¥uÑç²æ£xöc=EÀ2íÂè/Žg8õÂð?ÞþŠýVž´ÆŒþâ8aðw†ÓX/ ÿãí¯ÔïxfþÒ}Nsÿx1žÉ¢~a,ÿçôÓOçÙgŸ¥­­Í6ë‹üã;<´žµs¯âþíßf×-‚?{ZáÁÏðÒwÿP´ßÙn*ù‡gžy&Û¶m£­­Í6ë þí·ßÀM¿»‚ Žº†»¶]Ç_~ø[´_}ýõf´_}’—¿÷Ë¢ýÎvSÉ?<묳زe Û·o·Íú"ÿù–[¬‚7üöóüý‰ßàÖG¿Ìk·ÞGúç—’ûË\Ò?¿”?ßð“¢ýÎvï$ÿ¹z°ÝÎVU©,ÿÙ‹aç?×ùUÎø_Ÿ,êã„ó/cv´ÝÖÿÐ3Àë2 ªŠô/ÿ¹z°ÝÎ?VU©,ÿÙ‹aç—ò;::8áüËhŠwÚúÇvmÁ£¸O‘þãå?×tñKóŸ½ààK|ä¢K‹ú8þ¼Kiɲõ—ºÚp™:Z¡ òdú¿²ì© óÏ•“µõ? ·ò®+êcýÉ?gôÄ{lýS}7 fúÉôeÙv{üéSæ”鯜|ZQþ÷ú“^Ô‡“ßÚÚÊok(âO¦çɯØü°|Ryþy ÿÒ•÷õq©¹žøŠ¶þ›?úKŒWìb“éÁ÷Æfœohh(ÓßçóØú‚AÒϾVÔ‡´c?'­¿ÔÖÿ¤+.!ñ¡ãŽ›’þÿàëöøÊô÷ù<öøÁ ±§ÛŠúÐ^ÜÃÉ_þ¤­ÿ‡¯þd2ý/¿ã»EüRýKùáÇ_*ê#µí/¬úÚ¶þ«¯½¢ˆ?™þO|üi[ÿmõ“ú/¾Þùµ¢>î®ýO|üi[ÿÛ~~OÅÏÿñôéó;íñh«ŸÔqõ®+‹ú¸Eþ_ü׉lýµº¸xÝdú?yV|Zþ‹ŽýMQÿûž<+nëÿÄÇŸæí„0þ_}õÕ€•cÜÒÚZV ¥µõÿš"ª¦ix½^» ¡Ó& \b¦o·Ûmo7M·ÛM.g=è4 cZíE±«~Pùâ†ÏTø"œ3齑ªj·wÆáÿÿD¾Sÿ;wZ³ç9Œ‰³fI&52™<ù¼nßH3Mk&HUuaš:^¯‡l6‡,+c¤i›(Å*àñ¸Q…ã?ž|>_6þ½{÷Ú|Y–™3'Hm­‹T*O&c`&.Wñø¬ñj¸Ý `Æj`š¦©;ôÓñxTÂá,‹/®È?x𠪪2s¦ Ir“Éd!™Ä6…Š›'Bñû ƒ§èÓycSþ].ˆF æÌ™cóu]ghÈz ÿë_W®h ÖìóNú÷/–Si[©iÝil+‰ø .|[äÒ6o—ØUrÞI¼]þ_õ?<ñ^ÿpñáÈžï‡÷ÿÝÿñÇÇã± ó"JüÎ}bY|¨…™Ägª( úëÎÏgUUíÏÿR¾øÌÇUúþt¹\躎ax½^ûû ´ €,Ëöï¤(ŠÝ^ðEˆ ¡‘XGΨ®®fáÂ…EB0ö~;ÛVš©¾tÆ ˆ¾XGΨ©©¡µµµèBÆ*9ÛVš©¾_œ[Âü,Ö³L‹ëâBH¬ ¾³m¥™êKךUÒ¿4Jõ1‘þÎX³fM™ ~"ýK£Téï q3Òé_¥ú—ò+éïŒææfºººŠ¶•êoš&‰Dšy*0öÄ\UU|>Ÿýw&öy<\.@ÀNDñvÎÿ÷š_ª?pØøÓ=ÿ·lÙ2éCvÀ6Á—šá3¢QD`¼ñ;õß±cßüæ7ß6ßù7#úEÆã;õïììä+_ùÊÛæ;ÿfD?¢ˆ€`”êÿÐC‹Åؽ۪æÚÓÓÃÑG×Ó×!Ÿ—Ȧ¬ÓuYV Cäóy²ÙÕÕâq…X,F&£¦H§u\®^o€ÁÁ0 kæöJãÿÓŸþD<· Ìšóæùèí i._U¸ÝnB¡P¡^œ@ Y¶ŠäóLæÐu«P@0bpp˜††y¼þúguVEþ3ÏQb€( Ä«³móüù¶ñß΂Î6âfÞTùÎâWâÕÙvõêÕ¶ñߥ³2+C°¯¯€lá=Ìe³(µµ(Š‚¢¨¨ª›P¨ ŸÏúÜK¥RTͨÂãöH$÷HÔ×ÕÙ†~½}ýÌ™]l@ÎåòE|qe³YÁ šÏ‹ª¨¸\.ªBUÖƒ]Óz˜ZUU…Ûíµø.yÍú_4—ËQW?00È̙ŋó…2Ò‡z-#u* É …Ð}>TEÅD¢ªºŸ/€a˜¤Òiª««ÇøªJ.—CQ²™,uuuvAƒCaf4VÎþtÎ<_)2égñúΰÍçvQ‡ÎŽŽ²óL˜Ð3ég¦‚ÆMööRx¢h½ô÷YÔÚOKë:{ŸÓè-–m…ñ|Qk?`½ç•Ìç"Jg¥/ kúÅE³Ø;gœ/ ñ»…ü¶y=žjeÑ¢ÊI ¥ãÝíùxüß9ïcëøÉt¾ûh¹þÿñz~ÿ1>¤°zqqïTÿ¾s¡ãQŽkýלéç;ÊôÿÚ5ôsxò` ‹sXõ7|Œþ3Ë­³*ðm¦J©þ_Zm’5y3¿°¬¿Éô×tC2Èd3’LÇþ.BU~’±ÙŒN6•Åã÷Z˪Œi‚Û禡¡3š$14ŒgѼ^}‡z1tƒt*A<™¡:“ ~F=£ÃÌ™ßär:y-CuU5& é:¦d.á'¢q²L*ƒ×ï+â{|nê0¢ ’C#x üþÞ^ à ŠOf¨š"ß Réº$³ÿ­„ªýÄ#1²it"/è ¤ßðRoÖ£ÆI à ñy]ôêC× ’‰±D†ªTŒúÆ:†ûÃÌmž ¦I.§“LŨž[)A6—C—5 Å$/« %™3¯ôp‚¬fð»‘}n $¯J&m`Ê:ªË…w4‰”5HzBÔÖø‰ Z÷z}. äil1|nª³ŸL:!‘È1«i6^ÉM<'?Âü#=þiòEsÌ"ÔÑ$¯ôñæ[í,:ú˜÷DÿÃÎÛão(ðÓ¼ùÖ0‹Žžõ®ñE8ßgäMÉ~ÿEˆ6ýßUþ‘ t8IÓR//¿0ÄÒc‚Ä2YfyÝD32^Î`DÁ”LNn2Ù~N¥mT¨ »0=:CýiôتB9rá¾ÅMDö÷2sV#=àWaþñ͸%Él¢LÿÑá4MÇúxùù!–. Ëä˜å5‰ge<ƒÁ˜ ø]§SDjÃ`xT†ÒÑ.ª‚9rC‹ßÞǬYt÷tâW`þ ðH*ñtùø£#yæ,ñ±ýÅ0KŽËæ™é1 |Á˜«À7Ø~@âÔ`Òâ»1\:áÁ4z¬‹P0G.ìÆ·hÑŽ~fά§ç`~ÅdþñóqI*ñd—µ~Hæ,ó;X3ÓÃØÌõјIÖ$™ æÎ9XÈÛ3©›…S"‚<õÕ–ù=‘31€ŒfŽ€¦d@Ð/ÑP#1û`ó‡"PíTÎ ©zI²î¿ÇPï2I$%bŽ¢M3z=`¤ry\.¦]7k˜Ô„`8b3U²¹,x<ŒÆLtr¹,uÕÖ5»aøyÁÏ!Ë~êj ’)‰XÜ$UàÏ©rhÀ ÓPU7èØÏÉs†Imœi]‡áv33ÑuÈçrÔVfm6 ª_/ðë üh|lü¥|—êÆÔ!¯Yät«ØB7£1l~]oýŽŒ¯¿Ç„úƒ­ÿm¿‹¼ð¨)ëppx|ýÉõ[ÿ~¹‹o~òÄ)ë/øãé/Îÿ‰õÇÖÿë÷<Ï÷×[÷pJÃY t¹Ò«Ø_ÚGnßþ²bÎcí…©_˜ùÁ2ò7·Ì³—Åvaèwšþ…±_ôÕÜ2®Îž¢b¢/Qh@ôc¦mêf~°Œü'3ß^®® Aÿ¨mèwšþ…±¬Â'3Ÿ]{»‹Šˆ¾D¡ÑÏÖªuUuV!\Y’ .·;O>áBÃ@]˜ ¾~Ô[÷{2o)d³92Úê ɤußÃhN’ɸÈåröó8 ŸÏGV£Óù!Ë–L&¡Ó‹4?z„ùIêªü~¦„O¯Q__UÂÏ“É@mµI2™BUÁhÎÉÈärF!?0(ðÓ’ƒŸ‡N é”ì´Æ.ÜmPëÉf5âJ”½/u3giÍ{¢û+–yÖŸó‘Íjè¡<ݯ†©Yà~Oôï{³`ÞX¦fÏLïOážqøôéVøî}Uøê»¸ýºVPj³Ì_¤óÊ–V†4d5”7QôÖü]'=(f¾ƒtvˆúù)úw/fî2/ÛQ5{êú¿·ürýÚ?Âí×ÕƒšrðgÚ|Šøn?Bý|èß=Óæ×ϧ¢þy7,œ‘bÅ?;ØIóUËmóÿ:6ðÄU…°»W°þ*¸ç*û#õWZÏ æ{€W»ã€\pÌ1-¼úênúÒ~û˜óN«!•’'É'àøV;ØÉòÿ',g%Ø^àÉÓà¿´wÌTtÆ1Çðê«»i;æ’³çJEmþ–ÿqºX~U³mþ_ÉïØþÿƬÿÜó ÿ"ëóÝiþ¿Öø;éKc?Êp¸KMØ€]D½tY„$I|÷»ß-Ê¡¸ù曹þúëùæ7¿Y6þwƒß}÷UäúÓŸ~OøO?ýtEþêÕ«ßuý>|õO˜þñß ý'â—ê_•Œù•¢’‘¿R[g€©0*ó+E%#¥¶Î"SaTz&[)*ù+µu˜ ã§±fg}ûµR#¿]à<‰‡x÷cV«h+ŒÿÿP¿e É+€vì׊üB.—( \ÙÂÂmÖÍKÑVÿ+2Š}c€eÌO^åƒÇ±_+…0ò‹ÂI|™¹_ô-¶OÕÌ …*pn+í«R›h4Êý÷ßo¯ŸqÆ´µµÙ9¶Ÿþô§¹ÿþû¹ùæ›Y¾üA>½ò*¶ü|ë[À·à[Põä6þ÷÷ðÇýwpÿýw°páB¾úÕ¯rÇwTܹ̿s§½-‰pß}÷Ùë«V­¢­­H$Âðð0Ÿýìg¹ï¾û¸í¶Û8öØŸòÅU×°¥û§xnº ¸ å&˜ñèS\vÑ×yàÕïsß}·ÓÚÚÊ5×\Ãí·ß>)xx˜ 6ØëkÖ¬aûöív.á•W^Ɇ ¸óÎ;Y¸ð_¹öÜo°ùÀªo» ¸ ÷mÐüÐc|þÔØøâ7Ù°áZ[[¹îºë¸å–[ÞQþsuЇÈèlô«eùÏR!ß´½½LL£ªBþsuvì|Ï4Kíà[ '4Ä™1Qþs)¿4ÿYð;::ÈÄ4BòŸçÈcךáªfêÃûÈfhvè/´q®Sô1ìà—æ?» …˜;::Ðb&¾ ùÏK^(\r´ë5ÌŽu3’ûþHÿ¡±ÿg{W´RÝV¬ÿ‚;lý—dž#zl…üóÇÞë“ÚÎf÷O1gÇX¿é¿ ê gµë¿àÄWìñ÷^±„ÈÓåúXvµ6%¯,ÛÎc¬ß‰ôo¨;nÞ Pj±þbGGᆓWÈ?_ñ%»–»N¥ó‹/Ò°cÏ”ôoȤíã´¼VvþŸºàr^(èß”MWÌÿ?iÅXq ß|ý|êöo±{Ï›SÒ?]Â/=ÿW-øÛ ãoɦ+æÿŸ|êXÑÃÿüÚ÷øÜ¿ßPÄŸHÿR~éùÿ± mý—fÓóÿW­úÝÇÆ/ÿ3WÿôÖ"þDúhó¤~¦úkÅú0¬ýb9*—ëŸù7 õ¡.øÈY<ÁÓÖÿ@»&×ßÉß{o˜šõÅú¨óŸ¨ª'+×ÖkaëFpÊÆå¼ôù±ÏþÉô§j츇ï Si±þ?~X±ù´Tö_Ìê ÃëÓvñ°ïŸ0摟ÜÚ26A”˜ÌyýÝÒÚJKk+<ü°ÙÙÙ9ùL×G(dÃ0Èd2hšVdÎì™Å…9L˜º„ÙZÜ´x;íÅÍ¿ò§Æoj²’W»»»m¾3DûÞBõܹs+ß糪ÅSÎx|‘8î÷û+ßž]!“™/n(¸Ýîiñ à¶ÖG]]€úú ¡—DR#ÎRÁÔnñ%I.˜$õ‚)_Ã2ýöÍaþ7 Geh(ÁñÇ?.æL?Á B(ä&r3<œ$™ÔH§5$ɺ¨7,E±•.—Œah€iŽ™F{ÌB(䥵µu\~m­ŠË­§ ‡“ gI&%òy­ÈÈ/L⊢XEt]·o^*ŠRÄW‰PÈËÌ™3ËøÖƒûK.¹„K.¹„+®¸‚µk×ð©åÅ•‚…¡ü‰Ì¢ŸÒm`™Ö3£c7Ã/nµ¾”®¸â .¹ä»²ÙDüR“ÎtMÈΩ/¹ä’Š|çþRþÚµk‹ÌŸõõõÍ SÙ&XÓáÿUÿw_ÿw:~ñ·>YÄb±weü¥F¦éò?èï¿H<Ÿ­PüžŠB2ÂÄ/ÂiØßyb¿øþ…YJ ˆ¶âó¿”ï,6ÏçÇýþßã}K’D.—›_j"w¾g@ÙŒè@Y›Ò(5¥—žGÎ(5‘‹*b"JgD¯Ô¦4JMáñKMä¥üÒÑ+µ™Œ_z³Ë“éï½÷ÚÆåñÚ”F©þ¥fgL¦ÿo~ó›Šfé錢“é¿eËš››'l3¿ÔìïŒñô7 ƒÞÞ^B¡k×®µêëë9õÔSY»v-ªªÚÛ—.]ÊÂ… Ë>³¢‘ÈÛ:ÿß+þDú.þtÏÿ5kÖpýõ×–qÿæ›o.;‡K¿÷œë¢?g×^{mE~%ýW¬XÁ 7ÜXÆýo~ó›ìرcÊ|ÑŸ³õë×WäWÒ¿¥¥…;ï¼°Œû_ùÊWlcütøÎ>.½ôÒŠ|§þ-­õwÜššjhl 1Πë2ƒƒCvÑ5ðLÉÑh¬ð]£ ª2ª*£(2²,Ç‘eY–I§Ì›7‹öö0Ç{l_è¿ti3gùhi™Am­›F g0 ápq\.G¼ðGUÇ~Ä×vÜñp'3o^#A»B%ý[ZTUÁà Æ¾}ý8 —ËK8.j#Œÿã…s_"‘`æÌƒöÿZÎ&~“õ§Û¦£³c܇ûbéÃ}gTz¸?6]ÝÝeûKûrž»“õ§ÛfëÖ­eûQúùSW[[´ßçó380€,+(…û†i’J§ðù|ø¼><^îBÕå"Y ŠL$)2ß—FéçOm)ßïgp`Ð*@ ª¨ª Ã0H¥Óx}^|>^·ÇËåÂ¥ºˆGãh^/²¬‰F'ä—~þ”òýýý(Š2VäQÓI‹ñû¼x½¾Ûêr‹ÅÑ|>dE&‰™ÿ+…3aª¥äû¿³£ƒ¾¾&{],W(`xøÉ2cùìÙ‡Šú«ÀìÙ‡l¹ç¬î`¼†qç ô•ÂÔŸ-Ú·oß>µö—™ÎµöLéLÈì±Çlã8Œ%YŽÇù;Êø!GÑ Nâ81cÓdú?|è\¾ôS…y>Ά{vqÝš}\·Æb<üÇâ ‘wCÿ'.æögR(Ë{¹ð/ǦŸåüÙ‡øÚ5ÅªÞ ýßÌ/d[ò(ܵ§ÔéÌé}„9½Ö¸×Î-~¦«"‘e4ž o*HŠŠßBŠäpý¨~7þPþ¾~2i[Òñ4áaS&™5ˆgt0tŒ¼$K F°Œ^á0³šê‘Écj&~OO,C&“Á4!žÈ0šH¢ ¾»ÀPýn¡P~ŠáaÔJ|Ibx4jñ³å|ŸÇ_ÄÅÒDIÇøƒH£Öø]~Áê*zõY|—¦I2šdx`Å”IåtâS7Ð5I–"I…ñ†™3·ÁâçÅøÓ߀T¤@´áFv{‰ ¦‘;ç4âkàöù‘‰ŒhTÜ30’ZBÇc¨ ÅóŠæ0óyòé<Þ]R‘%HÅä’9 9ŽB#mP_ÝHÕÁQ"‘™„ùWþtù…üYŠ• ½ÿͽP¾\à÷¿kü%ÇYÿ·wì~Ó~ÿ!ÞÿþƒV¢Û¬Ö…ÿÃøMþÀ$üx_ÿöù#»±êï–734VÃ`¿ÂpB‰¢³hfн=&äñ5? IDAT'ÎÈГ•H ƒR›c´+‚/$“Pu´CéºöîëÈdiÖQ¬ÅŽ3Ð?@2ªUàÃÀëYõwKˆ«LûÂy $i,œ™doÁ‰?YàGº"x ·Ž6èb0=½ûðj:’™±øUµø†bôõUæÇG$w÷rÆùÇXã¯2êWÇÆ/i´ÎH²·ÛäÄÆ sÉ ¹&K¤;‚7(‘péèƒn†Ò#t¿¹¯®Æ_Ku¨ßPœ¾Þ>Ñ<^²ZaVzÙºŽô«.—T0ñ𤠿wI±LòCêš16‹½VøzÏjP]ÈÉuÓÝ2xUËð®ÊA¯µ |àù.É ™É“7A’ÀëqáS%T—DU" ‰X"c™¯ ¬ð°Ž©çÑÍ1¾îø÷Ê綌غf™²ƒ^E¢¶JB‘$‰ÚBR‹K6He4ò…ñ{½*>EÂ¥JT… üx–TÞ?Àаš†n@aT{ü>fóµ¼FÀëÆ£HÔUI(²„ßc-¨²A²„ïu𣠉hfppˆÁÁ!|¯]H@„0ý‹‚Îí¢¨À®½ÝEæýh$no‹Fâ6Óiæïìµé쥳”êš]H@„0ý‹‚Îí¢¨@¾ÝÍÈ®‘×4¤ž5'¸¨««Ãår‘ÏçÑ´,ªª‹Å$ý–D.Ÿ¡a™Ÿ¹§U£7§­‚Ý~òù<©=Þ#“ßïAk÷R[Û@Íñ*îE† ©T–X,‰ÞáC^¨¿ø²ƒï*áSȱ¢ÀøY–ù˜{š¿À¹ÛM>Oùý µ+ÔÖVøfŸ#K£w(È Íi_„ÿ¢Ö½¥Þ7"ï‰þ¥ü9K­â䑹÷Dÿ1¾¥Íëš 7ÈaѤÇzvüÌcu÷”ôïùÅút˜¾\à§ü›_3.¿®Œ?Ü-UÖ? ª4æÎíº{'ë¯lãìä ®dSÆUÖó§õ,·îÙ°Œæ«–3´c9´ÁÐŽåe?O¼ÜI Pl€ÙßÑËÎIÂÔñwø_b'Û¹’•¾1ùUË1 |sÇò²ŸßmÙ=¾äàw±þ¢îÿ"Vò;‹ÿ üßÍgùUÍ =Þ Ý0ôxsÙ5~¥„aç.ñXÉiúÆ~Ï(KXÐyÒ˜¨P€s_wwh\³¿§q_ûE<ꊱ¼G-m2a¡ç¾þÔ¸fs°ÌúÎ{“âž°ˆ ¹ãÿgïÌÃ㨮¼ýVõÞÚWK¶%[ò†1c 2˜Mfß&ìN2HÀØ3!LBâ$oB’,„@0† $lH€Œ Æ6B‚$/x‘,É’µ«¥Þ—ªúþ¨¾ÕUÝ­Å`ã|çyú¹Ýu—·ïQ©ª«êüΕGí“næº-ÛÔÅþÂÌ¢{!¬öpŽ–uþ£ õÍuï ØFÿ??õ^û…=£ öGë3ZÝ;)±6-þ÷Þ{ïå‡?ü¡ñ{$3?oL~ðQâŸzê)~ó›ßX„y'Ó¦M¼þúëcÆØ}TþHcš“»dË—/瑇¶!Cìïõx„ƸibógË÷,Ÿ5É@ºü~#AÀx„üÙÚ˜Ç2oÏÍË1þó/ù €±øÙoû[n¸á@‰=ï¶Ô1mÓ«›Œ÷E yðÁ¸ì²Ë2Äÿé6Rüç /¼èñÏCCCüæ7¿áK_úÏ<ó ÿôåÔßîµ—_3Þ—ž9Ì<Àå—_ž!þO·‘â?Ÿ}öYceè•+WrË-·úï²ã®L=‹\óBêx;¡>Èý÷ßÀ5×\“!þO·±âŸw¿þmÞTüP(¤eô©t;Œ÷9N[Fü³³ý}†S·NVd mÌøç6¼œÁOï“ÎO?.òµàYù¾8Ú˜ñÏûß\O³3õ·…2ûXù™ñÏ5Ò þ„õ˜;U $ÆöCÞrж¦bWcM™}Èiß9Íÿ;–¼–Ñ&Ö¤'Ëÿùß±ðÃ6eôé¬K‰ËcMîŒùo™ÿ.³ßÎÌdÓY7{Lÿ¯/}޼†›,ÛÒûô™øUo¿”Áoù׿f°y´‰¾ºÙcúÂe YwïÃÆçöŽöŒ>ƒ¾Ô}oÿp Ãÿ§íFÊÓbO{úúGCcú¿êªz^úÁ/,üô>éüôù×ß±dDþXþŸyÝÅ<»üÇ~zŸ±øÿ¶ùcùÿçÿýËZRÉæn]šÑ§â©T|ðÔùýþ_{õë¿y„åÿ»V¯âó[§Ÿ‹ŸšŸÑÇÌs6¿ÿü#òÇòÿ7Ö¯çüõ©sè©OÍÏèsózëýtþ×g·È?\kin¦¥¹™ ›6rÓ—obÑÙõY¯¿³-õh²ôºÝîäJÝ#c¸,ˆà×¼²`dT»Ý~Øý…}’ùæúñô7›dˆÄÝÝÝÓGzþfJDb€x<þ±òƒÁ €‘@Ó´Ãæ‹ú÷Þ{É“ I$”äÊÄ ª¦–UJ’$bHMÓH$T$Ɇ¢¨€.Dp:H’†ÓiÃåràõ:õñ²Îß¾}¨ª>¦ÈªjR2á@Jl)nZ¤V\V›Í¨8vTUhçtÊx<6JJs8t(ÈîÝ»³ò»ººPD\ÃfÓûkš5‘€È$*¶©ªj¬â,4˜WyþµÛ¡¤ÄE__Œööö ÿ +((ÀçóYÄzf¹Ù6,4^.”2¶AæêóÂÄŠÒé"Ýlüô“ñ‘°Ãá÷÷÷[VSMÿ|8Û> ÿSÿ[ÿ‹ù?ñÄb¦ÙíÃÌÿç?ÿù˜ó:üOÂß_ˆî…Xßœ™Ö,Ä7ŸËÌÛÍIÄù/[f[‘¨Å|þ0—f¾G$ÈvþÔ4Íò=G:‹ú‘ø«V­bÚ´iìß¿ß(Aÿ{ˆGÆKôÔ…~zFIQŠ1Í&ú¬\¹ŸÏǺu먭­¥¹¹Ù(A¿ñ%øûöí3^ ¯ © Áõ¢cšMôYµj>ŸÆÆÆ¬ü’’ãÆÕàà ñ2ÏO´-E½(Gã¯[·ŸÏÇã?žÕÿ?þ¸!zÞ°aƒñuf_.Z´ÈR/ÊÑü/ìÙgŸÍ:ÿgŸ}Öø_ljj2^¢Î<—ùóç[êE9Úü…mذ!+Æ †p¿µµÕx™ç'ÚN™2ÅR/ÊñðGÚÿUU¥¥¥Åø[~X+(,´|ïþ´øãÝÿ£ÊûÿHþÿæ7¿iˆÿ…‰¿ûš5kX³f Ë—/7^b¤þ?/¾øâ ñÿxý¿téRCü/L$ؼy3›7oæž{î1^b¤Ž?gœqF†ø¼þ_¼x±!þ&®9·oßÎöíÛy衇Œ—Ø©ãÏܹs3ÄÿÙüßÞÞNe¥;‡@ ˆ,ëA…E¨*ôõõÓÛÛKoo/𦱠Т28èCU5º»{),,dpp»ÝN 0„×ë@QbTWWÐÓ£?xÚ±cGVÿ÷õõÑÙÙÛå%|…Ũªü(^ºøÓï÷£ªÐÝÝOaa Áà0v;„BÃ8‹¨ª*¡zJ!Û¶õÐÒÒ’Õÿáp˜C‡ºq»s“ó»ÃMi©¾Jy45^Êp)„þ}}}”––õ¢ ”–æR]íaï^?½½½þ¿vñµÔÖÔB}óêõ ?@7ïç×.¾ÖÒF”æ„b»s´¶"‹¿9›¿9Ãÿ#?l¼Ì}ÓÛŠzQšÇ©­X@õE°(ëëëÿmñÿ-øémE½(ÍcŽÔV).*b ù¿ãr»©¬¬D’%ºººéîÖ_v‡ƒ½{öàr;‰DÃxs<ø†|ÔLJ__v›žžndYÆ7è£8-•?ýø388HQQ‘ñ¿ë|IbÐçcÐçcÈ7„Ýa§­½ —ÛI4Áëõ084HÍÔ©ølv;¾á!dÙÆÐâbkD™?ýø“Î÷z\n—>¯‡ÁjkjP ì6»ôäó Q\\’•/öÿ)ÕÕÆjðæUá§TWS__Oee5µµÔ××3wnܨƒ”p}ãÆT&á}}© m1æ¬Y×I Ì*nÏ™@j•vQ ›1c†!7¿&Ú ‘yº‰1%Û™–ã…ík®°pÍ|Qš2ó¼Í\s]úï_1¦¾âüôŒ>þPíaùÿ»ß»€ª+ôezPO0ÓþüEƘ_95õ}´ÿŸAŠk[ 'Y½ü2=1—Ò˜z@ûÏ“S¿÷Ž´ÿE`§³H¿þ›Ö]bƒšá÷ùRâ°üÿÄËoQ^RÂ` N~Õl£NUU¦¢¤‚œÒüÛvžÿûn~¿~;HðØËoº#Ãä”åq¨³“É“§ð|ã>ŠÆ ݪhtu÷SVVL,– ŽawHlÛ× ŠÆƒÏm ð³úÍí”3ˆ“Wuƒ1/™ø¯î<Àú]üùï@‚ÿÙ¼#É÷[øë÷t“P4^¿UÑèîé§´´ÈÂß¾ï(O®k æÕ÷RV\Œ/'òqø¢2NUEÆNeÙDrJC4t ÑÔâÍ}C Á+;:ˆIÝQßq°ƒêê©4õÆI([:C¨ ôù—šæïLÍÿ߇?àÇå”ñÈ2RN%Ñ '"•Ï$7¡0Ü@ ¨”ÏîcF]?›JÐh.™ ¤(uS~üDP5\Ά€ÝÜ•DTÃJàrJüý~Ü92ý`P#‘Wìú”¸ü¤YøIû”ôø†¹`o‹þ~Ölý˜íiÃåL‰Hþ÷óû“ü²$øˆñûÔB¦ðÁÖ$‚ &LfáùaN¬ Qî(29’—N$¹¹L˜æ &WL¦Ç&ÓÑE’©(AnN>“&”R>µ’––6&N*cÝ»}Øü1\N7…¥žL¾&ø;uþt? /sbEˆr4ß„='‡ Óu~UÅdzì2{%Šp &ÈËÉgò„RʧTp ¥ÊIe¬û{òp —Õ¯2¥ Ÿ=ïí"JP>ÍÏi燘[¤Ì®Perd‡$ {nŽ>UÓço—éHò)Œ“—œYÕh§¢²”WúÑ|a6'%ú³ÓI¨žë”¨(•˜P$+Ø’â_U§¬U ¤€]†Éå2vì’FWŸ†’ÌÛ?¤‹é Ý²ÞÆºTì2”[ƒ!>ÉüåŸ;‰„¤‹-½NN)AY‘Dy‘L0ê$ÓøÎ¿Ôq÷uÜ}}߸æ$ hJœŠ%ÅãrróEúýâ›/šÏš§$ÇEE©„Ý{U45NqÄõ‹NÀçóñÃ//$.é‹ xœvœ’BY±Dy‘@ÄA(®ñÃ[Îâ§_9‹Ÿ,; €»n\HXMIPY*£&bxÝn»Jô¾íª3ôƒF‚â\'•%2¶$%AI¡Ä²ËNÅçóñ³¯žO"ƒåE6B'Á¸ÆÏ¿~1¿úÖÅ’ÑþÆóN´øßÌþö7|&«ÿ¿÷/§rëå øÁM§sß²Ó !ÿw¿ø‹ÿ¿ûø[üçÍ ö·^¾Ðâÿ?å³™ÅûÙ„üb»'Çm÷ÓÛ ¿sÆt†¶¾oýT óä¸$æ÷€!êŸRSÅŒ™µ´¶´Â~±½¼¼ÌøO©©bÛ–L©©2’˜“˜Ka…yFó{ÀõÏ;®ššŠ"¶în3„ýéÛÅgÑF$HO"`N (@u·Ë‹4%H$¡ãíaÚ7¡´ä ª ñýv·)„?°¡Lô£( Á`ááa#.#!µy±9ì8ÝN%ÂQ=Qh0DUU}ÅÑý.䃹0%œŒ_úGà'’üxߎªB|? nƒð LŒ£( †%ù$ùr’oOòE%±ß‰|Ð SœNûaÏ_˜yþÂ>ÿþøýŸâ§üŸâ4ÿ÷·É|á;ƒÜôC…ú/ìeÞÙ*'œÝKÛMoäÒ¾§€­¯ÎD³D±«SUš6ÔPTšKwï ±¸‚íѶcŠ*Qâô &ÿ×F÷ÿ±ãëþïÚ¯ð…ï¨ÜôC•ú/4'ù1Úö¸LüÉI~" _5ñk²ð3ý¯%Àç ’néI²¥0_Êî¬Ópõ6, µîQKÙ°öõ)0h‚éen$ÕMõT(*cT¾9 À–Œ:Y’¯%ùIn£‰¿­ÍoðOœRœ…¯eŽ–`DþEÉù¿¢'‰o¼èQKùʽÉùWmbþP]¥ó{\¢ºÚO[[žQ‚.üÂýWÖŒè} %ôŸÚr5“zQŠ1Í&úì^±›ã–Ç+ëL¨ðÒÝ2JÐ…ÿB8¾e›j¼Ìã‹¶bEyQ/J1¦ÙDù%õR}Ì“O”-%èÂÿ‘„ûé¹YÎÚVŒ™­¯èó«zRÕwlF ºð~¤ùÿj£îÑv¤ù‹1Í&úˆùkþÓºèÿT ºð_÷÷µ¤^O7бôrz»ÞVÔ‹RŒiå'ß¼œ•=þ÷î»ïæG?ú÷Ýw÷Ýw«W­fõªÕŒf­mmFp¾Ù>Lüñ“O>ÉÓO?}Ìøëׯç7Þ8ê|S&¬¹E6ˆUGcþ uõªÕÜwß}ìÝ»×x¦y÷Ýwsß}÷Âk³@"Ûü4ÿÉ'Ÿ<¦üõë׋´üosþÛ1ÿÿ/|Y– ¾¹„ñ üGk#êÍcfë#úæRlÉÆÓ&}ìô¾Â„@ß\Ší#ÙxÚ¤ÞWØš5køÜy—òÌk/qùK—â}³ˆßùUÉx‰>émD;s)Äÿé Ìm6mÚÄç-â™ ºP_ˆ÷Í"þi¿–—è“ÞF´3—BüŸžÀÜfß¾}ÌŸ2“¦Ö=œùJ•!Þ7‹ø+5^f¦'õ¢âÿô„æ6„Ð_îG2‘ YýfBýÜœ\zúzèIÆD˜ž0Á‚û‘LŒðûGüžBtïõxéé馧§ÛÒ×Ì3¾ÏÜô±EŸ±ÚšÇMïðûÇŒnjj2bŸ¿öµ¯±|ùrV­Ze$Øôê&Î>ÿl# ÀòåËillä†nàÁüÈñÏû÷ï7bŸïºë.n¿ývÖ­[g$xíå×8ï’óŒ$·ß~;ûöíãK_ú<ðÀGŽîïï7bŸï¿ÿ~n»í6dk^XÃÅ—_l$¸í¶Ûä–[náþûï3þ¹eóÚ¬þï|ã\Û(õºÑ:öáíÝÏD'v‡B¨ñ5‹/;‹¦ u9±8ÊÁŒúiÓ¦a“@¨×DIƒŠ<7ÞÊîÿÖ×)èß›•nZo™ËH|1¦]’ ¾è#øÿözV¾ÜÚȤh¥^¶îä¶RîÁîPˆoÛd«-oŽž*‡©«ÅÊ—Á.eã;iÈ[žÕÿ yËiHè‰,²eþkl™ÿ³ßÞÌŽ×[|yrÓyìXò ‰Ùµð †N^bñ¬ f¿½ÙÒ üèž+|&ëüŸ+|ÆÂß±äMb;u!Ï>c™ËœÇÏdËüw ¡$òËü•¿¿Íþ¯žké3UÝBøÑ&Þ+¾++}és´ð0¥êZx˜–ý+-8n~{{ò!gRp”þ¾ªªÊhSSSsÄç/D÷yyyÆ*‡æ÷999F›‚‚‚#ÎÂÇC8Îxïr¹Œ6999ãöÿ_þò*+óˆÇ㺨^•£Äã ‰„B$5¾“ᯀ'„ù‡Œ$¥˜šv»Í¨ ‹Å8å”SPU•;wrâ‰'Zæ¿aÃJKÝÄãñ¤_ÏÔ«$*ñxÜàŠÒ¼ÿɲ~“OI.`³Ùep8d Ý´´ 0{ölTU¥µµ•iÓ¦¥ù;ÃÃQâñv» U•…ô9jšF,3þBôoæ›…«æÌŠ6›Fa‘ƒŽƒª««QU•¾¾>*** ÿWVVÒÛÛkˆ-KJJèïï§©©ÉX^ÑÝE2»UCdðãÅC¬}[ËØ¶c¿DdP5„è‘A•g› -€­[·ŽÈÛÄEÔþýûÙµk³gÏæõ×_çœsÎ1JÑ^|Þµk—]v™qÂ6m«W¯Îà¿úê«YùeeeTUU‚fû0ÛÌsÿSÿ§ü?qâD#+Ÿh¸Û²ù<ó+ðx-??ÿCÍÿhòÿùû­ÿ¿ã?ž={ö°{÷nãø™H$fppp8Œªª†0ß, ¯tQ}êøkÃét2aÂ&Mš„×ëÅív£( ^¯—­[·ò¹Ï}.ƒo¯  €ŠŠŠŒó§8ÄãqÜn·ñ½Íço}¥æ!¢Ñ(.—Ë’4Ið»º2…KÂ|>…iÞjæ1Çÿ“À7ð|j¿åççÕñ¯]¼˜ÕÉ„0þýÏçóeÝ~¸våUW±áõ×ÿ̳Îbû¶m‡Íæ¾ûî³$ظq#kÖ¬±$H7!=@}}½e¤þæcÍÿ®»î²$ظq#›7o¶$H7ój gœqõõõ+(Œ×ÿ·Ýv›% ÀÆÙ¾}»%)@º=ôÐCÆû¹sçR__oÙ– 9á„  ‡ÃA$’Àç á÷‡[ò|£÷•e)™|F_í×ãq`wÈh*€†ªŠÄc2ƒŽ}?ÊÉÉɘ³™_[›¢èüpDaÈbx8‚,;Í$ ì ù[çƒÝ.áv;¨ª.`Û{½£ò§M³ÑÛNÍ?ªàLÆwÆÜn¨ªÊeïÞÀˆüOÿÇÖı`þüu‘hGQ1‡‡Ã‰ÓåÂírãñxðäxðºœØl6b‰¡P”H8L8! LjÅã$â lá$F"Ün7MM–}aîܳòsssÑrrt¾Ó…ÛíÆíqãõzð¸]ÉÄN Bá‘p„p8L4!ÓW$“CA=!`ûömþqÇÍ…Ÿ‹ÓéÀátáv{ð¸ÝxsK–ÌãСITVv0kÖuäîãÅçRS[K$ü¦¥NÜä+Ê uee¥íÌœI$ü&nÏ™DÂo0kÖuÆ|>øàw:4‰úúzZÛÚˆ„ߤó`3ûš+˜^Û…d;“ÊÊÞxC0-VŽuB¼-¶‹ ó óæ>’íLƒ¯)o²¯¹ÂšO¯í¢»+dJúCµL¯íâ•u¦OŸn¬/ê@>0j–ú" I63ÍqF IDAT?è׃F²ñeý£ÎW“|ÃÓX’$Tôó´ÎNãç"¡ÏG•ì(±»~Nôüäó—Å!IMÒ?H’„DНé£%ç¯'Õ¿þ»¥pˆ²?44̯®_ˆ×e'$˼Uto߯ìª<âH”xð÷¢ÆÂ”T–ÇÑ4 9 O §Ó…Ë5L\ƒþ.Eu JQœ6RLCò¸+n§D ÆÖ¾§M÷ Kú ±==cÊïè<¦üÉ“g{ÓNŽŸ7ËàomÔ_M©©:êþ?ÒüÃõÿö¦Î$‚‰/ÄwyGÍÿ­mz‚NžÃû[vèßaîLvn×Wϙښþª?›8uÒ÷ÿÑâ×ÿ­mÁ$ïoéHòËÙ¹½'É/ é¯CI~·öÿÞ¿ýÚJ®„{¹ ¿Î6În9Ay…D÷‰ãçåÑÛ?ÀÄò ”'ØÓÞCea ݽ>T)N´7Bnq…¥¹ìhéÀå°ã–Ù2¤rîIù#úßߨ­”­üv'Î|;n›Byt·HÌ99Ÿž¾~ ¿¢°†ž$?Ö!§8‡ÂïtØqKlR9çÄüýߺe+5•2®x¿ÀGNPV!Ñs@böI¹ÆüKŠâì=ØË„ü©ôö%ùQrм”ä°ó@gjþÃ*gÍNù¿ðNýþ´S·3µ2} á˜F ¢!ÙõÕ첆,KÄúùOUÁ%ƒ$C$‘ÏwjØ$Œ±z4‚1 KׇƒŒkt ?Ñü;??‘ì“pÿ÷Xó?½ÿplí÷?¼,C/ÄûBÜ?´õ}<9îÇHO ,ŒàÉq[’¤÷³wtF ¡?è¿cÌBÿm[v2cf­¥Myy™%9¤„ý¢nÈç§ 0Ï/[¿ ?ÌÏoýÁ*â]°_SQdicþln—^g/[¿Ÿ'Ú)**bxxÇ¡R6Y&Žàt:py$N;ñ ìv;^¯ŸÏ‡¢(¸Ýn"û!Jà¥ÏÝEÁÞ]L,%êâö¸‘d} p8õ{ЉD‚xeÿ1æû)*Êax8ˆãP‘‰Åé´›øaìv)É¢(úýMÞYzÂMÓ“*Ø»s’üncD~ågrkþ¶éû΄¹Æü»Cú H“æuÿ÷ìKÆ`M’ ¾ý~EQë¨û?Щ_÷ÚŠRþW’º ׄîÿƒ„¸î{Ÿ :Q•2öm…ÂâB|‘¨žeý³' {ƒhÈêòcתp¸ýÌœë`ÏîVâ¡ ØsZˆ‡&˜Â‰óÜl9Hèƒ~ò*ÆöÿÇÏ·ú¿åý¡$¿U)0ñ[©ž 럭…x¨{Nñ—ÄÀŽ3ñ‹«ÈàÏÌ© Ià=ìÐp‹qØâ±•ó¹wÅ2XÖÀ…¬Äl¡7l ‘&tÁþ”eÖ{Ø­ÉDØuË0øåvUàÉ…‚"tüm{2ø+V,C]ÖÀ)ãà/Hã7fáOÍwÈß7à•+MŒ?U³âÞe¨w6p Jã_iå_ÙÆ‚eSÒøúõàEwb$(·ë¿[gûÈ¿Ž[v»Wì±þØy̱ÆW/U‘_:²¿ÏÌcŽ5¾Z«"7a¾iLµV¥¨¿hä¶Ãüý¿YDöqðùó(ÏBêI3yFi!¯Çk´I¯§§›òò #ó“âýtQº˜>} ÑOômÒÇ øý–±Ò-]ä/ÆJ·ô1Fj“¾Ýïy£±î¿^wÝuüò—¿4>õ«_åw¿û݈íÓÇü¨÷?ûÙÏòßÿý߯ço¼‘_|ñcã×××ó§?¥®Ë®¼òÊ1µ éükN®AB¡i¨¢!4EÂ&CŽKFÕ\ Ä5ÐTÂÔùzrÿÈ72“RºŒ6¢íÜHD¾¡+ݧÕu}©e,Qg6³(¾â©¾qñG21–øŽ#ñGâÆmfþK>.XHè‰>¼7—fm7ýñ>)k…Éjjj´ã?žúúúúþ¾éË7qÇ·î ¥¥eLƱ2»$IÄb1EÁårãD"aõ ñY<ÇétÂ`—Ë¥Ý&E^ãí/ÄbŸòÇÏ7þhvû˜ïÓEÙŸ¾Hp8üD"A[Ûv»›ÍFEe.v‡lˆúÅŠË6›Œ$iÉÌÕ*‰„’\ñ>N"¡ýõ晴“ãFÓ‚œxâ‰ÿ„N°$‹$ EQ8tÈŸì¯QRâÂn|}5eÑ_Uu¦¦épœN{’¯'¡e›!ñz<è§¶¶Öè_SS“Áom É&Nô E±ÛTU&KBñ]ŃÞD"á¯Þ ’ˆùëbO=ÝQ&L˜`ðËËË-üÞ^ýjºp6ÝÌ+Êÿxñ¥îÂ…2”Þ%«Ä‹oΜ³k×.*++-¥Çã±|>Òü#e–ÿ©ÿŒ}þÍ7ßÌþýûˆÿÃðo¿ývšššŽþ÷þýçÌ™C,#‘H`·Ûc¬93.`œÇÒÏk€qŽ2‹ïõd4©1D¢3Ç|þÛEVbs²lçÏxí„­\™ !ÓÍ<6ÑñâÅÆM!‘S˜yålȼ!eþ®æU®³õ‚æôþ\pýýýFâ ´mLÑN˜ù»^pÁYù汌þÃÃÃ,Y²ÄðÑã?néo^½\øòg?ûYÇÜÎlbÌ%Kô¬Œéã\sÍ5†ž}öYKè)_fÃÜÎlbÌk®¹ c|€E‹>«¼›¿›0áËlc˜Û™MŒ¹hÑ"€ŒñGÛÿ” Þþ¤L0`üûaaaÆ>ýa÷Á€Ìý,ÿ744°~ýzãÜ×ÐÐ0ê\Íõßÿ¾ž‰R$uuuu|ó›ß—ÿ7lØ`á§ï?évî¹çfðE"ÑwÑ¢E,]ºtÌãÀóÏ?oá?ÿüó‡Í‰Dß+®¸‚Å‹þá…ˆÅôëˆÝ»[˜sÂÜn³fÍ'ŽÆQUH$bääxÐ4x\eïÞ½ú9QÕ˜6mš¦"=»ÝNiiNg'—_~ù¨ûÿºuëÐ4'‰DŒÖÖjkóq¹íœTs<áp‚d¾¿äõ¾Ó`´´´èÂB ªªj0Ÿ²m6(-Í¡½}/ùË£îÿo¼ñnwª!/?Ž:ÂíÉ“§lH‰—…uttï'Mš”ñ·ÈË“èí så•çzü_½j5§Ÿq:om~‹k_kÔwvvZÆ{kó[œ~ÆéÆûÑÚšû˜WÄ{sR ñ°¾¹¥Ù²=}Õ‹ôqFkkî#‚ÀºzÀÇÅ߸q£±¹ø?YìÅñ'¿ h$ÂŽ;Œ¾§/<ÅëÁápàpèû]AA!^¯oއÝ;w ÛlØ4SN©#Òð‘H˜X4J,' £(D’7ŸE&Ú æ[Ž?ÅÅ%D"Ëïì à°ÛQ“ ~ޝ×CKóþdb'¹sçZù±(±XœØ@?v»Hò†ºØgÏ>Îrü©¨¨$sÈ´Í™3'ÉÏM&ŽR)**ÆãuãÍñÒÕqPçk0}f‘Î÷ãâñ‘¾>‡q£ßëÑW]­®®2޵zV×Z}ßhs²wï^æ&L9ï:Üž¶T]²í”êzàwÀŒ”8ݣ׋UåE)„ænÏ™¸=gRY© Ó…@ôÕåkj/¤¥¹™7ÞÂ~Év&\h½á\S[KKs3Ókߦâts»Ú©ö-ÍÍhÊ›H¶3‘lg&û¥V¶=Q @ çÐiü¡Z.¾x†Q'¾ëÞ½{9ùD«8]¬p3’mSýº:ÖR1éB`'³C >ÿω¾Ì޶3ùö¢½´?UW¼ê —‘n/½²–9¬e‡ç«GÌÿÚŽ_"Í©å²Ê”F/¶hö+‘Êà¿ßüçOiÆW˜ÿ寠ΘÁÄΗˆ ‚³HâÄ/,eÛÿ<–ÁïŠÙ˜åØ:é¢qùÿ¶ÅèLj<þá ¿yé¯èwZ5¾óå+±IN·L4'‹áñºu?ðÀ3ëõsž&ñ¹ˆx\Áæ°£¢ ÇUž‘h-QD4M¿>•4ðæ¹øéïÖqý…ŸIñ‡‚<÷æûº`¸õêóÒøQ<^Áâ心¦¡iKþùôìüHM)&ŽÅ‹åŸ?3‹aÿ0y9 ùülx¿S¿n–à‹çÕYøÑH„œ\¯Áöí=hhšÄµgŸ@<–É…ƒHj áP4 §sšÁæØ]N†¢aœ^¶žL*“ $l²Âð€ŠÓé&·<—á¾» Ùq§†M•ÐdñH‚D؃œãÅቑãñ Š-” §²M  u— %N'+„ûc”UF?å&_˜lâ sx >å%¾àkJêG¶$§žý$%\§2·¤ä!?8þÐGæ+1áDœ˜ÍmPOhªF((Œê“-/•ñûa(¢ñÝÅs¹óÉw°¡ârÚ(ÎÓø·Ïþ“1æ3›÷p¨_%*毀Ë.Wuþ–¤Ú~ÿÉw˜\&Ó; ÏßåÉÏÓŸ „B2Áˆ~#aB© @c(¬ñŸ_þ'¾þËõþ_HÝ¿ùõÚ-t%ù6›FBÑpÛeb*h*<øï©¶·ÿr½ÎLòí)~8$ÈÂÿùWÏexx˜_­i1üÅ)VÝŠµ­þ_v¡µ Àï´Žèÿ+N™Âʵ¸å©}úÜûÆü¯«?ÞR÷ó?íÌðÿíWŸ1ÆOžÛ9¢ÿ¯«?ž_üQ¿®ÿúUs2úÞýÛ¿ü¥—žb©»çéw3ü×OÉã¿}wDÿ/½ôî}êïÜyý©–~£‰ÿEYÄŸ­Þœ,Àl¢Ÿ9@z¿¸&ÓÓÓKyy™Ñ'Œ0¥¦ÊH PP˜‡'ÇMyyž7­-íÆçžž^#Ñ@º ñÿ¶-;)(Ì3ú‹~­-í8ì.Zº©©(2ú ùüÌ;®Ú’  0šd¹uw›ñ¹¥kÐH4ÍÒÅÿæ~[w·ŠÛ‘óTâ1'ƒ¡^\.yyD¢!Šæé‹1¨ª‚×®'J …¢H’g‰Ä±K…¸1 ‹—õRT\D0Äçàp8ðÌ âpDõ{—-8árIúB{Ü í²c>I¾ÁÐ .äåå‰FÓø^_¿¿‰€]ʃŸÀላ«ÅeâG`ƒÐaÎ_˜Íæ4æz°¢Œý¨û‚™|-ôø‡çÿ€ÁOù_In“‘>’ÿ»;BÌ:+B bÀ_Ä¡ž6®ù| a•×^²3pÈ‹Lå ØQåýHr¡ø!ÞošˆÛ;—Û…¿Õ³[i EÙÞ´—)§R±`"ÍÛ™xÉÈþ?6ü”ÿbÖYj’ŸÃ¡ž!®ù¼=ɇC²…¯É}Hr€P¼›÷›*p{'àr»ôO£jv+í¡(»›ö2ÑÄŸr¹fñÛA Š]HÎ0ÓÊêVê÷G…ÿ¹e+¸zÅ2ÖRËôçW­ÀÒ¤ )ó™.Ö_JcF€†ºÿø‰†‡‡)-­¤¿¿ŸÀ¶ýîT‰º•š…¿bÙ –­XF#u¨Iþ–QøéIÌüºé%™ü®0^œ¦•ÃEÉ[z"ÀŠ;W°ìÞ$ÿN3ÿOI~µÎÿS5KiÍHðʽz}þaJK èï"0¤‹ðÏRRñ*=n^º$3ü ›ž,×,ÞÏÖÎÜ^0Þ@gŠþê¥*—ÄSIè_Yg]Õõ¢ rI·—úÂ0fqz¶væö‚ñ2úð<Ù_­UYkgb\£Ó!YË\:;åN‡ÄĸƟ£úoIsrs;³u:$ äê×ʵV5ú«ÿ¢rk0Õ÷W­ãü[}¦_ÎÑ2柭¹½`< Öù_zŒùg©|1˜jû´õñ/_Ìüwâéœä›7Fogn/Oƒž Ù_ú’5þWX¶@{€_?ùk@®ëêÞÂÄ3Àˆ[oüñ'•©g£âY©0³øº¥9“úsLñÛ²mÓ¦MÆûôºt;œ¶#õ?Öþ7 ùÍZ†Â!¼/``Ì>¹9¹F›P8D(¬_Ÿ¦'€Lá¼™g;)Ô…Ccöñz¼¿ݧ'Ͳ øGÛn®‰‘­ïG‰Ζ¼$=úhÆ?‹˜"³¥Ç,ÍøgqÞ0ÛH1£#Å¿ù£*SθÐðÑÐæç‰«MBUTª/ºq6¾ÜòçUD£*qdQ Ý6Ž¿ô ßEôiÙð<g\@߯Wˆ¨ 0‰£DUªO¿ÀðQãZŠŠ]–ph*Õ\kð…/‡ïóùèk|Üyº_z6­ÍàOüÌ9†¢{Þ&šä˪BÕùWS•æË­YM4ª*…n˜}Iöø÷þþ~- (5ŸÁÄÞZoáåZ®ZƹIÿïàz£ïþ†0KOý¶þaaÊÿOÍ¿Ÿ© ÖsûÒS“‰(„¼"yiT7kˆgþÏÍú¿0Ï<úï8uŽ‘ `Z‡Ãÿʧâó=ȪG¿ÆSýsåG-¾,\XÈÛoÖø~Óê¶°¿!ÌÂ…ÖÄ yd½OcþwX<óAð=ÈsMÏXæW:c ' ÜCÉiºÿ×7þu>¥ :ÿéWzãS ¿ïg”4–°JÒã~Ìâÿŧü´ß@#zðŒÉÿëKŸãܾ«ØÃMF]_C®áõHIÿŸùµ/““«_ˇÂa¤ýÓÇ>ÃÿZ~®q»]ôöõ—›Gïš¿°ñÍí? 1íóòþoôØßiŸ¿È¿ßcÍ_I$÷ÿs¿µÌÂOüU¿oqˆ]Æþo?mv¿óEýbôÕ×­úŸÏÇìþ™¦Çôãêì>›Áoÿãë„’ûÿeÿçë~h“¾Ú|+©ýß{öIüϾÀK¯¼c»¿¿ŸùËóÖƒúþ9Ùç2ø_Ùz‹~ü‘‡øvÓ©xªÏôßýï©sÀÐÖ! Š ø1újôšJ˜ú€~\ûnËðï@K²q‘þ~hhˆGXÉý[õãÏ·Õ?¦ú&ôÿ²ñZýø3ìãGù¯|ñÝ _nÔýÿí¦?êâzRc˜ÛÆÿŸo£ß?°šïm<€Ó:ßÜwYËIÆñç³®Mܼ>aðÿec*Ƹÿ9Ýÿ?Ê=ƒongX.¼ØÒÏŠ›ßcY‹þ7û¬KÿÍvéÄÃKl.âwçú{¤ë$“m6›±ª·Èb!ÄÀ±X MÓŒ¬’$%ÅÇš±¸X1öpûÛlz0ѧüñó…™…}æ‡R¢?ð)ÿ0øuuuœp FsgÇ0ÃCQ<n· Ç è«O˜E‡-y²•P•p2È]ß7l¨ª7ÿ¸ãŽ£¦¦†‰õÄz{Ã{q{d\.§ÓaÌY’ädЩCdTU#±&?Ð4e\󯪪¢¼¼œüü|º»#äæ:(*vãvkØíšñ÷ûºø.b !Lb|UKŒÉ/+ÓüŸþùÌŸ?Ÿùóçsþùç°¶mkÛ¦YÄç“'ÈìØ/ÑØ ±c¿”ñ^¼vjõ4žÃN­žZ=Ï6ëü%K–píµ×ríµ×²dÉ’Qùííí´··[D³gÏföìÙ\vÙeYß›_æ~«W¯ÎÊ–ÿaMŒ#Våáò?õÿ‘ñ¿YõQæ___oüù°öQæ4øÿÿþ‡3qþ …„™³â—.øÛÄñWœ#…Ø_$ÍIYÄñ[Œ/êÒùâøœHŒ|þýLjço}Å> §Ó9"R7¥öïßoÜô7²šššô3É‹OsÑV”CCCF½(Í7¿D›t7¥š››Hb̦¦&|>Ÿqñiæ‹¶¢ôù||óÍ/Ñ&ÝÄM©ææf,X`óÝwߥ¿¿ß¸ø|÷Ýw~¢­(ûûûzQšo~‰6fûæ7¿iê÷ïߟ!¤Íÿ¢­(³ùß,þ7·5‚úæææ !ýhþmE™Íÿfñ¿¹­ù³F777B}a£ù_´e6ÿ›Åÿæ¶fiÿ¿å–[X°`‹/fñâÅÆgQgÞÿÅgQ/ʹÿ/]º”¥K—RWWgðÅgQ·xñb ºÅ‹õ¢,+-ý‡ÞÿGò¿°ºº:–/_Κ5kX³f uuuã~­Y³†åË—&ÅöôdÙü/lÑ¢EÜsÏ=lÞ¼™Í›7³hÑ¢q¿6oÞÌ=÷ÜÃ=÷ÜcŒ%Äÿcù_ØW\ÁC=ÄöíÛÙ¾};W\qŸ_Û·o硇⡇2Æâ³]~ùå\rÉ%TUUQSSÃŽ÷»ñxÊ(-óM‹ãv»Œ¿ŸÝ.1mZ-ÕÕS’×_1úûèÃfÓÏOcíÿ\põõõ”––2iÒ$š›‡9íŸNHò‡I$bÄb1œN§eÿ¢û &¡iú Q?0ÐÍN§sÌýÿ¬³ÎâÔSOÅãñÐ×ë bBóçO£´Ôßß—Uëâÿ¾¾TfLñwe$1êûúú°ÙuÁõhûgg§!êoni6„ì«W­æ­ÍoñÔSOñÖæ· ñÿSO=•µ-`´,íÌÁ,µ5µÔÖÔéW¯ZmÔ·¶µÛï»ï>š[šÙ°i#Í-ÍÆ8"Ûfz[Áõæv怂)ÕÕL©®æ+·ÞšÁ߸qcÿ×OþÚÂ7ÓÛ ¾¨7·3ÿf¿¡Í¬Åñg`p9stÀü C‡—ËEgg'ŠªH(̘5‹x"ÁŒ™³HÄ‚Á;:Ð4ÎC‡ý·[$šºáÍòÐN™6m€ñ=:Óù‡:Q“É««§G¨ªžB"¡ SüNïv»- ³=4ûïàà •É{ â{ttt‡…B¸=nvDUU”D‚ÒòrB‘(%¥e(q¿ßO{ûA4M3’cx<]|›´ô̾B¨©à’3fPrÞyô÷¿špÒÒ¬'”8th5µµÆÊôécˆ2wÏ Ãí9Óè?kÖuÔθ‘½ºê›½{÷2cÆ ¦OŸÎŒ3Д7Y·v--ÍÍ´47SS[˺µkÙ»w¯±’¼y…ù–æfÖ­] `”{÷îµ´+Ùïk®@²IŤ 3øÂò¼ÍF0ñyË6•‹/¾8Müe,QêâsÝÄû-ÛTü¡Ú1ý?'ªg¸ÿö"}¼ª+^Ñ'ÅÿíÏ_Dûóñè¿JT]ñ ÿú¨~Í$ú}Tÿk;ôqæ$Øè×òBü¯4NDiœÈ{«{±-èä¤kõëYÑï£ú_> Ïwb§ž¹ÛY¤_÷ ñlP#6¨ÑÖ-ã,’¨ž îLöËÿ69A¡Ç…MUùXrÉg@UùÚÕç!KÐÑÞFÄ$¡Ä(*uÐÙ~ˆæamñ<¾òÙÓAÓXöÙÓñ„‘û|´6 ‰ÑÒÑF0`Çíq‹†P 4%A4B•ü HXùÃ>>wÆlÐT¾|Á©?< žˆQTê´ð¯«?MÓøBý‰:¿w0“ïõ‹Ñ”(q¢ñ`¿8ÇcÌÿü9 i\uê,d ÚÛZ ù Nâ IDAT‰Å#””»8ØÚið/=i2hÏ«ÂÛ†žZö·ÄØß~€`ÀŽ7ÇK$0æŽL| §-B¡¬âJD)tʸP äÇ »M" ££8=vŠ+⨉W;¼œ„”PQâq”î ¤s¿o˜/€O ÑsÈ 6 »G‰DÐbadgœ„-Fgw7šÛö)ÿ0ùÂÌ|aŸò_˜I=ï‘„‚ýï/ìSþ‡çŸ:ljI0pÈ…Ý&ÓÞ »w) ¨ô‡4J‹5Þo•9äšÆ¤E¨‰…¥¥äµ1AV‚Da‚j„~'¥%…Þƒ;(3§¦Ù®ŒÎ?Á‰Vìrc“%¶I|°Kå`P¥?¥…*;Zíty¦3qz1ª¢PXRB^Ûd•P HÄ" DèwPZ\Hçи‚³k¦";FçŸr¼-¢0ØíF–$:’üŽ FJŠv´Ù9äšÎ¤E(‰ùÅÅÉù«„A¢05Âà€“’âBù÷à JW=Ù¡Zø² Ä¿QŸOCÖtú.•xB·«šŒ,C<¡ÇVh”x!Dúí]* 4Üv‰Âdœ_ yùºÀ¾¢T¢Ï§1ÐPÑWLþ¤ó% TI&‡x<Î/þ´ €ÿa;{5‚á(2ºøÜf“ †£HIþCÒƒƒ~øû÷PTèèVÇ"¸ìn—~/=–ðæhØeÅý>•¡¾2èó׉'ô„î÷>­RÝõÄ;ìU …bÈèâs»]N~ÖùÿõôÛ,_ù6 v'Å¢i|¯W5ø}>_PCMã'OÄùÞ =éÿw={U‚¡* EÃn— &ùß_ñ*_ýÅ«(‚â²I¸\ú1+‘ñŒÂxm+ÿvqáÿ_¯?€Ù²ù_دף~ñ—–ýÅ)SxþÝVƒŸ>þOþ´“;®>ÁðÿC/î°Ôgó¿°G^|€{ŸyDÿ_W<¿Û¸Óà§ÿƒ§ßå?nøŒáÿÿúŸ¿[çŸÅÿÆwÿŸ¿ð½_ÿmDÿ/½ô{é]ƒŸ>~º™ÅùÂÒEûá`$#qÀÐÖ÷$ÎÓ- Ìâ|s²çŒéôôè ôôôb~sY^^Æ”š*Z[ô•wÂÁC>¿ñYض-;™RSeð¦ÔTIf̬5Þ›“L©©2þ-]ƒ†˜ß\ÖTYDüC>=ˆ[|¶uwóŽÓï3æ1ï¸j#©@ME‘ñÞœ,`ÞqÕ¸\N"á§“I§åPt’ƒHy?.—þÌ, ú ÊÀV?@€P(DlŸž Ûívãž™ÀVÆçóùÀFOO@§Ó‰Íf£²²’üüüdÒîÊ^†õ¸‚ùö¾ÍÄwQt’Hù0.—-Éú ÆÀÖ@P(AlŸ¾Š¶ÛmKòã&þ@ÔÄ/&??§“4>jþÂÌóöqøÿÈóÏÿ)~ÊÿVþ‡÷Í%ðÁn4»Ÿ¶ŽNŠŠ¦²k«Jë¾8šâå½· èíë –èÙÓCiÑ4b±i2¹¹yŸ@oÏ0’Z@"–C(FƯ˜æÆíLÝÿdžŸòÿÌË|ð†ŒfÑÖ¤¨¨ÈÄwfðKŠJ“ü‰?Ð3 I>Á0˜ø¥S¥ ÿ——STT„ªÚ5¦•‡¨*Q·–ÞÒDz€ç–­à9yŽFhd)óYÊ|ÃpÝÚØh¼–¥ƒN'‡®®.‚Á]Ýá þÜ©0k2þŠe+X±l+idåüÆÆFã5.~¾›¢¢|T‚A˜VUÅz"€¥W¶éü;W°âÎt~5K©æ1ÚÒø­Æ  áÎ+Óøvºº†¡Ëg)» A[[ž!ä"ý¶6«˜ÈüY´5‹ÿE½(ÍâÀòà’x¾!èïî B~!ïŒÌŸE[³ø_Ô‹Ò,þ<³ý³ËFc@?†ˆ„²€!Òi—ž@ˆÿ_Ú•š«h+ÊN‡dÔ‹Ò,þ,ïn J† þ›!¤ógÀfioþ,ÚšÅ÷¢^”fñ½àý#ñ¿L úß0 ùÏJm³òM}XKs½(ÍâÁ3›9þ÷î»ï1‘6èÏÍøæ•½Ås=П#¬Y³†;ï¼ó°âŸ|òÉ#Ê¿þúë‹¿~ýú#Ê?ûì³ÇÍÿö·¿m$Eomk3^âÙ“x‰8ˆñšÇlÙøŸÿüç)áÂ…Ç”ÿ©ÿÿͶfÍã¹¼(ÓYÙDçægù¢þp¾£°Í›7B~QšEþéŸÓÛšëÓûÇDâsH ÊÍ"óôÏémÍõéýÆcϼöR†OŸyí¥Œ6²ù_Ô§÷ÃCÈ/ÊgÒ\1Nok®Oï7kjÝ“áÓ¦Ö=m„eó¿¨Oï7’åæŒœ¸ t1ýH‚À"îOí‹þ##’ ŒúýòòFí›ÅýÙö¢o¶qDR#a£%Ë'þù'?ù ¡gŸåKŽ—ùå­/îdlÕ®Z~yëË|Éñ2¡gŸ=jñÏ=öÃø·x_å×ßÚˆò¾žðLy ¿þÖFnñ¾ÊðþpÔâŸW­ZEÿªUÜZ¸‰g~ð.±÷&{o2Ïüà]n-ÜDÿªUãŽÿ<ñÒż·ñÃÿUg\ÄU`"‘5þ9!²Æ‰ç\LžÛɤ3.1|›ܺéyj]aðfÖ_D ªŽÄÉ‘uþ¶Mkù—,¸4H¨´¬ñÏ‚?wÑEä¹L<ýb÷éüþ¦õ”.8ÏàÏ8ûB î%ײó­õß5s! ó㲜5þVçÃì3Ï%Ï-Qþ™s ߦÇß*°×ÔüšÓϵðoæÛ4ä-7ü?gÎS¼o/Â9_çgó¬ :ëj©óßg”#ùÿÅE+tñÒÄûÎ:ýÿæ\ùQó¿cÌñÌ“õ³qÒý¯¿‹g>HgÝl£O6ÿÿùœÿfÁðü«}ŸcöÛ/q@>™iuΑ~Å{ÅwüskMnú’ülþ¯zû%úä“9·ögôÕÍÖûŒàÿõüÎÿÌœùkÚíE0?Bi©aùç.0üÿæƒO’Ÿ›Gii©1lñÿ¹¹ùìøÍ Ä [_=¢ÿÏüÚ—Ùÿ‡µÿ^1Þ{=^ÝEéŧó_ÿ“ülñÿ¹¹ùlyl5±„Âßù݈þ?÷[ËØõÛ?Ì]¿}ÑÂmzª«Î1øùá/,ü‘âÏssóyûÁßK(lüÙã#úÿ²ÿóušV¤’º4­xÆÂÿnË<2o¥áÿûå«0[6ÿhÒ—¢­ßgóÿ#óVZÄù¢Oè‰>£ïïëWóÿÞð9ü‘ô¢­ßgóÿïëW[ÄùoåZùß>‡5ïü£ÖDJ£Åÿ Qÿ…Ïéß#›ÿWÔ¤Äÿ€1þ_OÅQÇDÜòx¯¿ëëëyä‘GhiiÉž™òÄd±Z+€×ë%‰b0±múJ²ŠòÿØ{ó09ª3Í÷K.U•™•Y{•T[–„Ù-„„ñ‚‘,lyÚí1à¹3¶i=¶šñÂІ‹} m7íë¦Û`¡ž6××6=í¶‘K€ÁDI`Ä"©²ö-k¯Ê=c™?"OdäV¥k7|ÏSω8ç;çÍófTDFÄ÷~G'›Íæ22'l¡Ùjúkšf¯þvÅ+í/~Gî‹äe»»»I$¶A¬¦ÞÝÝýºÌß—ËŒ"~ÄÕÖÖ’H$¨Ê­ª&ˆµµµ¯ ¾X=N¼«©©!‘Hàr¹€¼@²¦¦æ„ù?í´Óذaº®3::ïZ’›£ü®ëVÁLÚÂ1 —ËZY–%t]C×µUÏ¿««‹õë×34´€”K:€TØß0 ›ët:ƒ®[ÇŸX™Y’L C³ç¸ü†† #„K5‘$I¦¤¿è#²7ŠvçÊК¦¡kyAj%þV___¡KØCC=¶\ü-ô\F:üg¼hn)ñÑÜR"Â&.¤Î‹ÕJøÃÃÃ%uóóó¶H¡œ½øííí¼+·Rò‰ÌÿþOÌ^+þËÍÿDíœÿ«Åv¢ßÿ«Å#æï<ÿŠÌ´âë4q‰Ĺӹ-ËrI€b[îü/ð‚kG¥ó·®ëö6”^¿ Ã(Cü9ñÅ©……zzz ’68ëÄÍOOOý½õõõ1??_ðmãÆôööÚ¥¨&¶E›ø-3??O8¶[׉›Ÿp8l÷D"Y1#‘HY|ç˜bÛ~@“{ 533S‚ï¬7?ápؾ¹øÎh›7oæ™gž±ËJø¢m9þwîÜY–!b¾'¿c9þ/½ôÒ²ü‹ÿmá{"ü‹1–ãëÖ­eùïìì,ëDøc¼sü¿5ÿ/~ñ‹Üpà ìܹ“­[·òÅ/~Ñ>f/¾øbn»í¶’?ñ"Êé/Ê;wÚcÿW_}5·ÞzkIR°^øÝtÓM%âE`qg1ÆJü_~ùå|ï{ßcÛ¶mtwwsùå—ÓÝÝ ÀgœÁµ×^[òwÆÖŠxNQnÛ¶Ík9þÛÛÛ©©±"Rž;4L0TK<¾„Ûífvv†ªª¦¦¬Ï‹-’Ige]7Y\\¤¾¾ŽÅŘšŠ«;þ¨©©áðáYL#K0°ñgffðùü6gKKK¤ÓY\.·½___Ï õ6þjŽÿªª*ŽÕøU #M0ä#‹ÙâŸÏg‹üc±Ùl¶à¾¸¡¡ééiˆNNUÄü qÿ¿{‚pwØÎZ)’ˆ:!þw‡¹÷Þ{Ù±cG‰o¤?ÂŽ;ìvg¿(+¦×Gú#tvtØÔ„(_Ô ñgGûÝÏÖó·”ø ±õü-v»3 €°â`'þ–-[Ø¿Á˜¢Nˆÿ·lÙÂîÜÍ•Ÿ½²Äwÿþý\ùÙ+ívgaÎmÈÿéTŠºPˆÙ¹9»-•JÑRSÃÌÌ,n·›‘Ñjk  “IggzzS‡L6ÃÔ”0?::JsK3ccc¸ÓifgóQ[büâã?•J …˜sâ'“„‚Ab¸ÝnFGG ü±q¦gf1MÈf2LMM[øcþÌÀ¦i2çÀŸ+ÂÇ"™,ÁO$CAbãx½^F†‡   ‘Ne`zz ‰L6ËÔÔ4ÍÍÍ ÓÚÚJ4ÒišœŠñ’Åjð"skkë(¯¼ò#bñw¬¦"Døý‘ghZÙä¢]”õ\Pà׉$¤èDXž ?aýúõ=z”uá {ÕxQ'ÄÿåÄöÝá°½ÿ‘ /äᇲKÑßÙÇ9äWƒ¾g)㯎вæÂ‚þξëÖ­+›@ø÷+þÌΠ…åø?ìùÛ/ºÛ÷­Ï‹ÿÉ ÿnß·žÃž/ðÑÿ°k¯»–í]ÈŸßä´ôßQÁœ–þ;Î83ÃW¶]5ÿU—pzøÝ®:ÏÿC^øp¸ê<¤Ó¾À·ïòü‹Ÿäôð»y÷e˜‡ÿŽõë×Ó•ÜÀG[GWÍ¿Ñu-n±¶í¶øò€±¶í]±wd=U—ÐâÖéh6ì$Î$Åü§S) Ó$•HRëJO#«’ ™TšP(ÄÄÄЬ284LK»×ì kj«ˆF§YX\¤Êãe1àb8£}M+£C#´4¯!:6Éø„DÿhÙ%d075˜LŽŽÛIC Ó$ORë÷“ÊÌ (?E(brrU±ð›Ûklü©) ¿Ú›ÃOÇËãM!©&&sS³6>¦I2‘À0M±¸5ÿÌ ²’ ©„uþ›œœÆ¥ºé¤¥½uz ‡?ÃÂÂ"5UÕ,\Œ¤bt®mcd`ˆ¶Öv&G'Jç?mÍ|xÓ4@2Ñ C3Ð’iêš5ê[Ud¯„ ›Äb’±4±d KŒâœÓUG*•%¡(& ¯­a²¡¯ Z2ƒ©©¸qÑ{Ha`&‰R-cJ:dt  2©Ø;ø«ÄæÄöþë‡ß{Ö÷ÒK@¹~Ûe¤RY:r×¾ß. äΡïúwŠ_ŸÃÍá8‡_—ßÏá7¿*|uMm] ÐÒ”FÒtj)SÇߥ&cÒ\™ŒNJ7™›žfª© cM—Õ*šŒ •—˜èJ5µ~ž?rScYü¬§¾ Öt騲LsSÊÂ÷§PL “†/cÐ\ ™ŒFJ3˜›™aº©zü/9ÙåñÓúuMÐÖiá75¦t@Áü šk ÑHë& ³³L7Ua´ùm|S“QQx刉&UQÛáçpß1̬Yˆ@J3‰hY“¥ŒuýÑ ÐYÎ%r5 ºJ¢«EÆç–ÐŒ\g,!·”{Ü æ'ø|0¿õµ09gK™¹1-ßÛß4 L ™Õ™^PH%sk²š¬ºÐõŒõl=•ÆïsÓÈRí’He,á©,[É t=‹ÛíÁëÉàö¸É¤3T×ÀÌ\–¦Lbt ›µÚ†a`ÉŒÎÔ‚L:i½?•TÈh’ªÚøZ*ƒß碩V£Æ%‘ÊhEøn·¯×Zå1“ÉPS³s!?L/˜,Ƴ耖Íà'2bþ+ã7Öf©vçñYFÊá{¸\áÇ0^ñæðã9ü‹ÉUÏßi_ØÁÿƒ_™ÿ•ñOœÿþ=°á#ÍD'ëÐÕN~óxœü¸ž{þYåЀ‘˜„æ©ã•ÃM}ÑêÒ9ãŒ%6¾["53OMÕ˼û47Z|”êô:\YÓÔ „ª©îhdaT]vþo6þ‘_dsøµèjGsïëùQô8ðO:Í 9|²:8ð§ÌþÛÚÚì•$ý~¯ýý "üJ›ØÈŸÓ›â(8DØt—Ü|à.84°@2™¤®®¿ßKWgè ÅòÅñð)ÅÏ%¨ŒßÁM ñs‘ ÿV¢Ð¿!æ¯QWW…ß]-žßŽŽ¥ÿõ— ꆆütt,ÑÕ?bï‹DÎvg)ê>€=†Óš[ª þ—du“ š[ª9{Xµ÷…PÝÙî,E½Ó°ÇsIvyÖ™2ŸÏw¶Oµë„øÿ¬3eäˆõCÿàóFØjûÛO±’ˆRÔ Ûb §[§ì?— êžšU8·N·?ûS³JÁüE»³õNçüßZøEÿxaÝS³Öþºáü¾Hàlw–¶…Ûb güÑj¬;¶“{¯.lµñÇo7üâøç›o¾Ùa;ßY Ñu±¨Y¼Ë-Y‹ŠMŒýµ¯}[o½µdþŸþô§ßüÝ»wóÃþ°ëÖ­oþo~óöïßÿÿoþvñÅ—`8ëD‚€J"g{%¿å|à(î;ëD‚€J"g{%¿å¬[·®D¸ï¬ *‰üí•ü–KðÉ ¶—÷u?ýÍ%ûNs¶Wò[.AÀ'·n-î;ë~ºo_É~¾£½’ßr 6vžT"ÜwÖõ)Ùwš³½’_¥¾ÑéhÉçñÕøìË õ««ªijh¢©¡ _XùÉOÒÛÛË~ô#Â_ø›ÿ¶õŒ!>õþy\æSïŸG=cˆÍÛÏO¹ñÆó"ЛŸâcûp|ñŸ"ùˆ¿Ýó—Ù±cÏ<ó ÿðÿÀÆ/™óïžÄ³a”K6ŒòØ5-\²aφQο{’G€[n¹ÅŽñÙó—í…¿ÊŶy”þe Ü:´÷ËÆß*më¨UúúúðJæ²ñ·’YèV$ô¶õ4U{˜ŸŸ§Í£ð/Kn]"°á#eão~$Á+™ËÆßJ”Æÿ9ñgffhó(üË€K—0»ßS6þÖlê¢V•lüåâo%³<~º©›¦j Œm ð¯œsÉïfÓÒmeù?«÷’ß?L__™ÞåãÏ…Ÿ“ÿSžü§íºÀ>îÇ6RÀÿ)O>@¦×ËÙ‹ß*Ëÿ&õ:’ßï%‰ü~ï²ügz½eã/ÏêÝl÷Ó›N)þ~/ïž½µ,ÿªšOÀ÷{—Î}ÎüsÞG÷÷ßkÿ¢\MŒÒXßÈâ#Ï–åÿàÝ÷¡k}}}´µ´.Ë¿¦gKøolläàÝ÷¡¸”²ç?ýëß—åÿé;„®iD"ÚZZ—å_Ó³%óolläé;„âRÊžþðÏ[–ÿG¿½«9þ+á?úí](.¥,ÿ;è­ç¿úê²ü A{__½õ«Žÿo¹wšë?´Þú²ü üÿ¼ÿ²²üÿ§C]lo ‰Dè­_uüÿÖ_k\yö&zëËò/ð/üÙ‡ÊòÿáGüø«ÿïÙ£ñÝ\úñX¿ô¥/© n¥ûoç¢goeSEf@Œ'2÷‚%:óx` üæõ‹d" €Ó×™À¹/ü+%pŽ!þNsŠúE2‘ÀéëLàÜþ•’8ñ…Àßù¿íõ‹d" €Ó×™À¹/ü+%Ç¿×ëal|‚ºPˆñ±¼Ðxff†æžFGGijn"ÒÔÜL*¦Ê[E2‘$•J14<„ßçgdxÝÐIúúhmme||ÜS"ÿûQÿn·‹ÉÉ(¡P¨ aÀÌì,íí팎ÒÔØÄT4JSS“?E*™bxxŸÏÇÈð0†ná¯iifxh¸ß0t{[ÿ.U!:5M(b<™´Ûggfèèìdxd8ßÜL:Æëõ’LZóÂç«ahhC×amk ƒƒƒ¬ikcÔÁ©Ÿ+Ä á~gÇû8)'êïè Ûq9ÛžøÞ[[Gqæ½xå•VÒNK¼o‰ûœ8¼Pä_,æ/v»Çé¿.·D¨ÞÇ\l75™ ™¬.aJRÙ%—ÊØÑ,Íkë© dI ÄåV¨ó{IÄ2øL‰)I&•ÈபÆ4S¨r .Ù©+à×…”Ê’ÈfÀÔßÁ_%¾0#‡ì%+ê¬SOg*«½ ñ£9üµ¯;¾Ó Ç÷?丶.%²oCüÙ× ¿¶ÅM߈D•"12*ÓØ ’ΚñâÒ êƒ.Þsn€Lz E• T»I%³¬­o"21AÈd~iž–?ñ¹8-Mk˜œž`i,ì’^S&™ÍVÄŒjxe“h¬WIi‡G«pi:õ!ï9·–tz Å%S[í!™ÌÒV×@ÿä$Áš 1'~“Ó“,%ÀÆ—*â‚*ƒ“U²Ä¨˜¿fòb¿.¨rÎ9 _• T{H'³´…èF VײŸ§¹ÎG|!AsC+ÑÙ(Kã $êä* S·ñ‹cÿ5Ó܉Wš>7˜ºL•[BV$ês+Û+2¤5èj‘™6Èh ff°ý¦çM4Íd$j ê @Uóã¿Ýñ SÓ3jZUµÞ—æ^Qâ–²¸U/º™Áí÷àóf-¥ Y,_ b‰4·‹x…ªª,,–âÿË#/aæðŸ}Íñ³œRŒ?§Ñ¢pþvæð¹úãCeVÀÿêÇmñ¿°?ýoèT’Ì/€ªZ??¨¿ÄcÊ)tõÐѱäc?ʉú;:–»,öûÝkéêa {-”ü »$`k‘³‡Uš[ªáù¼€«œ¨¿¹¥X´Ëb?±ÿl»ÆÙÃj®,] -kÒæQøeLCŽÈ%Iœ¢~ÑvÖ™2ÏÆò%`·?ð|~ßÈ#lpðùŠÓçóq‰;kLÎV9·Nç ƒÿr¢úsëtž»,öûÎùSFpÿVÁÿTþ¿K”nëÏ·•õŸ[ÇÈ—Å~bÿX»5æ±v Â6ÎøÓ•L¼ÓïUD¾°â„Ì«?~»á—‹þêW¿Ê7¾ñ? `¿[-‡]I„]üùŠñwìØa µß üóÏ?ÿ Çÿ7Ÿ§ ÷‹ë*•åú®”, œ ÷‹ë*•åú®”, œ ÷‹ë*•åú®”, œ á>®ŠEý¿Ø¾‡±½Ä×éç½Câäý¼wHüôúRÁ ~N¸Ï£–Ô‰rwÏ>>ÉÖ_§_|'ì&ïß ?ÝU9R˜îãàªXÔÿøEÃl|ð¤_§_üš*'₩ŠÞ»ŽT‚µ-:]Vè/DüN±±ø¿¸¿hO$$’‰‚þÑè䲂{áëøû‹ÿ‹û‹öØÒ±¥¥‚þå„ûŸ?络ßrmÅÉbKK%ño×]wW\q÷Ýw÷ß?}}}칋ññq®»î:¾ûÝïÒÓÓ׿üe¸óî»áÇݼsõ‡?l‹=o»í6n¸án»í6ö~ø.¾ûÝÛ¸âŠ+ Ä Pÿvýõ×óùÏž{Ÿþô§D"~qäÆÇǹþúë¹ãŽ;‡Ã\}õÕÌÏÏó“ûîƒÝp줓¸Ü!`þæ7¿É7ÞÈ7¿ùM~qäî¸ã›|æ3Ÿ)cBiüÛW¾òn¼ñFþöoÿ–{ï½—H$Â}ƒ±±1¾ò•¯pûí·‡¹üòË™™™±â_ïž$ÒÝÍ6þ׿þun¹å¾þõ¯óãCßàöÛ¿ÎUW]U‚_[[KíE—2÷Ä/é¯ZCOOщçI`=ë¨{dì'õô°4cÅö–‹¿õŒþ‘tûxF^ÀÉz@p%ýÜ ‘Ï—mm-8ÆY;/ãþ¿EOO>_€Æ¦†eEUèééalb¼âñÿÿïÿÅÿóñÏpÖÕ—sðîûl̶æVN ¯g4DûýK¼çsÿ…é¯‡Ãø•øWT…p8\€_Ìÿ_ýêGÜüÑÿÂ9Ÿÿ/<}çÊâ÷×דxô9¶|q'»?ÿ—eñËñ_Œ_Žÿo?òs¾´í?rþ—vòè·w•Åz~˜û¿ÄßüÓ_ó±l³bûçh¹w>½Lü¿ñ===tmø-ô—çÿ¡Oü– ö!îê~Žk Oûtmœ!x(Èç]ÅMÿ|7Wž½‰p8Ìc‡ø³G4øØrñÿÖÿׯgáPyþŸºòYÎÝ}6?Ù0À:”Ç »óøõ‹õüå⇸þ‘û¸¶»;‡ÿ([­Á‡–‹ÿÎ.+ñ¿wÛ~ÄŸ+óçŸ-…y7ËrIÌoÿõ·V¼ÿþÒ—¿D¿T2Ð[Ìd!Ør ´R)+ ¸o¹\.E!NçÆ n··Ûmﯶ¿x‰úvÆ—$iÕøNsâ;íõœÿ¿'ürü44d úþ¹D|^lâFc×®]¶8pïÞ½«ÆwŠà¾¸‰:|aåðgff FοåêÊ™¨_ ~¹ù;ííÄÿ{ßûÞ®+Õ•³Jü¿ó?^ñý«™ÿrÇß«Áÿ·òý¯æÿ¯R]9|·Û] ú/„°°Ï±âÅ8׊>Î?À¾N¸\.LÓ´}Å‹ Y–íkf9|‘Z$(wþŸÉãñ,{ýÖ4;~”Ãïííµ³ mܸ±ä•ðqÞüôõõ±°°@mm-Á`° {šHöàI sn;Ç $6nÜXò€Hø8o>œ+ŸƒÁ‚ìiß)RæÜöÌ3ÏØÇÆæÍ›ËâßüD";aE0,Èž¶yóæUáŸ(ÿB´¼)ü Ñ>ð¦ðïLlðfðÿÎñÿæÿ`=\?pà·Ýv[Ù}xýø¸é¦›Ø·o7ÝtSÙýÕ̵ü\{íµüË¿ü ×^{mÙýÕàóÿ¯ÿú¯tvÖgÐu“ÙÙY ‹¶_\—dY%Î Ö’NÇikmA–üþZ²Y@ `cÿ<ò§ŸÞÆìŒF"‘A×av¶Püoá[ö.—‹L&ƒßï'‘X¢­µY–ðûýd³›6¯]ÿøÃèé 13£[>ÅâÿX,F*•Âëõâr¹H¥Rv}CƒõàÒçó‘ÍÂi§Õ-‹ï½÷òÄïžàÞ{ïeÇŽâ|§O±˜ß)êâwOØû;vì°°Êø ±}±è?ÒaߣûÙzþ–‚jNŸb1¿SÔéØû[ÏßPÖO 8ìþÇÝDú#ìþÇÝ\ùÙ+ ÄùNŸb1¿SÔéÏ‹½¯üì•eý¶lÙRPBáñßÚÚZ°Z=€ašŒŽR[`*:…?à#:9Éb®‰ÉüÂ<¾š&£466¢k:@-†arü6® § |qü·¶¶2W„o£££4z½LMMá÷ûˆF£y|Ód~~Žêšj&£“466¢i:^+p9¬µÇ •ÁwÿkÚÚJð Óddd„F—ééþä$óóóÖï]ÓdvnŽššj¢ÑIš››Ð4¯7‡ŸŸ9|ñÐ6•|Üð¿òÊ ŽƒrIÄ1e‰É)hû¢_SP'ïû÷ïÏ Ë­Uè?r¡%7õÇ ôÅâ§ÈÞÔ/X½þ#^`' X¿~=Ç"-ubÿèÑ£öXþêüþêHAÀÆrâÿâÕ븢¢NˆÏ;¶*þ…øÿ¿Þ£pû¾õeùÿãóÖÛѾý¢ yàÁ‡xàÁ‡8ìù«â_ˆÿïx,Á¯Æ×,Ë¿HpzøÝ¼yŽ"Ï1PuÉ«â_ˆÿŸd‹ÿ+ñ?Ö¶€·ÎDFa"£`t]TÂÿ‘c#H’‰¦é´´·2>4¤AÃL754†GF©õû™_œÃëñ29%™IãòxðûüÄâ uAf&&éìlÁ킺º:Y¢³¹újª¢à¯öc&5\ºâ–8rl0ø 6¾GÊãü~æ—æñz<9ün¯¿ÏÇRA{kŠt4Á@dœ¥™©¥©¬ÎäL-‘$Ÿ¦Êc%ŽRU bstÖUS·6„ßUMU•º,þü¸ÌÁ&ÚF“ÔÈÒ5êR¬«‹ÓÞ’"3™ ¿?‡o$S¤2ÑÙ)´D’xbšj¯…ïrÉ›§«®†úöW5Õ+â+œQÛ@ÛH‚kþ )zêb´·$ÉD LŸI ™&©Å©¬ÆÔÜ4z"I<9C•Gbv~—*#% æï-—Lk5zoNŸ!„ÙªjÕÅ2På–h¬Ë‹ßg­•ì5&¦ 4 ünг É´Ø<5kùÅ2ɉŸe9/.7 ÞöøÙt0ð(àv{ˆ§­w—ŠYÌ Í n[|>5—!–Ô1$™`0H6k¬v‘NeQÝR+ñúìF:“ÀX\ààcÌDæ‰FYɰ0iBrâs iLæð‡^Ž!Ë&'m¨+à_×uÖŸÔFWWuuͼk]~Ey€ÎkΦ¬mÊý›~P¦NˆïX›®±üzê­Ed|¾\¢¡ðÏ~ñÏh÷•â·—Á/]Ì£ë¢ÿ]Zg‹ÿsø}Õò³æ¾«Yö¿ÓÊ%I^¾ë傾VJÊâmaB°ø‹}Š“ˆ¤òrA_+)%eñ¶°^2sYÇýöS¤ñ¿ÓÇ)þ?ø¼ÁÙ>•gsIÆ\’]¿ýk¬³Î” ÊâmaB0è‹}ŠEøB´/æïlûβxû­ƒ£½pßéSœ@$ à±Â¾çÖå÷eñ¶0güéJ&Þå‰wNño¹UøVüvïþ—ù—ÜrË-+~ž±[n¹…¯~õ«v¬B9üO}êS|ö³Ÿ}]ð?ûÙϲcÇ®¸âŠŠøüàÙ¶mÛë‚¿mÛ6Î?ÿ|¶lÙR‘ÿuëÖñ¹Ï—l½Z;þ_OüãáÿõÄ/æß)̯$Ø_Iüïì{ñÅ—ÝuÅææWì¯$þwöýÀ>Pv_Ô›ó=c%ÁþJâgßuëÖ•ÝuÅöÓßä…ùBÀ_\ÿ‹í{òâÿ.)Ø/îûÉ ¬÷žN?ï’½]€ïXœHø‹ëw÷äÅÿWöm-Ø/îûÉ­[ üâ;±·Ö;˜æ qýã Ûâÿól/Ø/î»±ó$€?€ø5Uö¶ÓbñÑéhAç ±¾¯Æg‹ÿ…‰ºrmÅc-W—H&ˆF' ?SNœ/üª«ªK ˆºrmÅc-W'°–ëëóûK ˆºrm«±âø·ï~÷»ìÝ»—~ô£€_ …lñqügöÃ.ÿ¹wï^»¼âŠ+xâ‰'Êâ;ãßî¸ãzè!>ö±–˜? ÙâÿâøOã¢‹ÊÆ>ôÐCvù™Ï|Æ^ØÇiÅño·ß~;{öìáÒK/,1(²ÅÿÅñŸlÛV6þsÏž=vyÕUWÙ‹e•ãd.mÇfðâqé>Åñ·'w!¯ìû5#‰TÅø[I²J—"Ûu9m?¦œç_àG"b ·Rˆ_ÿºþáÈþI¤*ÆßJ˜„Ãa\ªl×ã þGæÒvüçÌR—œ].þ¶ûÜùÝ#Œ$2ão¥\¹¾à?Ó›¿=åÉß1 çcËñéÂ5ð[I~*ñ/KOÓÓÓƒÛª²ùO¿×J†'KOÛü¿ †lþÓï¡Ë8¸,ÿg/~‹ƒµb@>kÅøçª?/¬“¥§íRðßþ䫊~÷ì­ü±þ#4+ò/KO[˜EøíO>P0ÿ……¼^ÍÿÌÔG }Ëñß÷“‡8ý3JÀç¯ÈÿS,þ øŸš±žé§Ò)›‰DÊâÏÿ¥þ’W_NÀç¯ÈÿS¬ù |1'¾àßëõäÿ"ürü÷Þuï¿îÓ|þŠü¾Íÿ’Íׯ¼wä_Ô”ãÿvù?ò7ÿt7°²þ¢åÞé‚:1ö@o½Íÿ©wJ6ÿÛÛ‚LìhX–ÿ¿\ü»a%uXéøOÜ3]PçÄüŸ¼³Áæ{[ê?Ëã—ãÿšþwsÇo­óy%þ»6Zõ/ï*ÿÀXù…ƒ+Y. ÿ÷T¾ÿ~ñÅÿMˆÿTÓ´^–f³Y4MÃívÛ+z«ªJ&“Á0 E±ÀâEAuu5©TÊÎ2¸šþÉÜ*_og|!¸[ þºuël‘µªª6þÚµkßù×ÕÕ•ÅÞü@ ðšáóßÛÛ‹ªªÔ×× i²¬ I`¢(2šF. ¶I6«ár¹Ñu·Û…iȲõ@ÃpHÔ×WÛ«p®4ÿ#GŽÐÞ"K ëØ/ôLÓØ;WhÎfu\.7†a=à3 Y6mÑ¥i‚‰D"ž%:ù ïz×»VÄ¥¹ÙG,–D×åÜœ­•¥¾$Iöƒñ€Q¬m˜·Š¦™¹ï@&ÏRS3‹¢Ô•忱±‘©©).»ì2ÀÊH488X ν°Cˆ²òâ¬TŸ'$sª) 5gà •>à&n2.»ì2æççíýáááñ¢caÁ`°@,戭_ˆËá—Å>^Û¹sgIÝjð…½Ãÿ‰Ùñðÿjç_N°´œ½Öóµøÿž¿ÿrVŒ/®S’$ÙçY§™¦uþu&0 îÉWœY¥ýE±“ˆþ€$¦ßù"J\Ë]?3™ü*ªn·Ã0J®¿"!ŒóšQŒ_|ãâ4ç÷)¶7A¢h+—)Mø9WÁ>Ï>ûlɋӜ7ãbÛy"úˆ¶r™Ò„_1~8l­ô-|D‚ŠÕà‹>¢­8Sšh«¯¯/X…Û¹Ò·óÿæ;ßù[©W⿸MâIŠÛ¶nÝj¯¦îü¬»ví*øVšq›à×™$ ¸M|O"[s¬û￟ÎÎÎ’qpp°ëÖ­%m„Ãaß9þß"ÇÿñòÖ5¯Ü bq-|=ù?üדÿÕà‹~ÇËÿž=Ö ½îîz2X,Ž¢È†N,¶„¢È,-Ũ­ 07·@0Â0Lâñ%\.…¶¶ ýÌÏ/ (2 .öìÙÃ%—\²"ÿû÷ïçÔS›¥¥Å—÷„K¹—A" ÀÜÜ¡P½]§(ÐÖÖàÀ_DV 5§?b ÁWâÿé§Ÿ¦«+ÀøøuuÕÄÙ´c±˜] ±¿×ë-hkhl`a>Ÿ, ™ŒÑÜ|¤"ÿN¡þ½÷Þkã9·[Ä_,êw¶‰1*% ( …úûÝoéÜlÁu±¨ßÙ&ƨ”, x (êïþÇÝö˜ÎmÈÛÅ¢~g›£R²€â1~ýë_/{þÉ\©ÓÓÓ(ŠÊT4JCC#¬]»†L:ÅÄÄ8¦aÐÔÔd‰U¦¦§hªªbfv–ÖÖVZ[[/ÌÖ»ÒùGˆñ Ã`zz½ªš©©)˜œœ`Íš5¤Ó)&&'lüááa¼–X?0[ÿxÎ?6¾®[øÕ…ø.W;étšÉ‰q ॥™ÁÁA¼¦¦òøkÚÚXÓÖÆèØPxü áxkk |AFW±íLp†¦‘jÏ·' þ"áƒøþ…O*ù8` ·×…±W¡æ¡;EÿÎ$Å~å’Q¸Óoýzk%zI9/'$/l?QürIDàG1¾¿:rÜüŸ–þ;À×/ÿ·³>Ç¿õR¹ÿUðߕܼÛþìÇÃÿ¯<\Rvþ«á_xÜù¾ÇÃ?ë·ŽY†ÿ¦ºZ¢ÓS45·Z‰=] ††$3?1ªJ˜&LEgpyæfg¨¯o`&:EkK+Èó³s¸}^ÖŸ|2ýÇ^¡¶6Äâì<¾êjæpÕT±fm+Ã#¸$“±ÁZ:ڈЪejfzEüi–úúzf¢Ó6þÂì|~ divU5s‹ ¸|eðÛÛ˜¢±ÎÂoniãÓšƒ IDAT³Ó¹ ,ü…‰(.—œ›ÿ,n¯lÏ6:…·m ’$1?7Ûçá]§žBß+/Q[biv_u5ó‹‹xü5´w´1Ô?Œ “Ñ! b/)Í$cJ¸\.\.7 ˜„de1CU•‚a@2®St‘Íè貆”°Äú(‹iÜÁZ|Aæ'GXŒiT{ÝTù½ÄÒ Yƒz?ƒ>ÜKKdâ_*YfÞTü‹o*þjùomkAU\HŠ:Ô5ˆ¿ü¿Öø«å¿µÍûšâ¯†ÿŽ®6²Uq¡'Òö÷¿¾g=¾– h®×•ÿ×5üwtUWÀoÎùü÷ŸÊ·~’_ª$µÿy|kþ·|jõãCöü¿õÓHe,¿›ÿ/« àë?²|ŠñoúÔfn¾ç‰üåø/Æ¿ýš÷ó?v=aãß¼û6þ·vZm_¹û ßiBôïé‹ýbá~%¿âñ„9Åø"1À¡¨®Îo‹$BœØûƒýöp_ˆû“q+)Î`ÿpA?‘4À™@X4:Egw;Ýí<ðEòËÁˆ$¶8bÎÞ?ôò-Üâþ…yë™à¡—‡ ú‰¤ݹm‘@´m8¹ƒ A?‡^Bï¯F<÷º  ØïÜê6((еøÂüów†–\Rô’Å4M;æ$•J! ×J(xg?(ð ?`‰úÃVù`|‘ pþ*±˜µ‚-úï†Ç”SèbÄös&ÛÎ$t¶ t¯…þ‘|’€Ž—l?ÑЕó)/úo‡=®EÎ&ÿ9ÉĶ3 í…mÖŠóŽ$-ÛO´œ=¬ZÉžÙÂ}ÂðË´ŽLþǺ3€Øv& \Øf„ xIÎ' 8SµýŒ°ÁÁç-9’÷±E÷5wÖ˜œíÀ;ÅøbÛ)§F+h{¶]ƒa5/Ò'ï'ÚÄüÏ­Ó9ˆôÀωþk,AÿºüÒmgj ÛŽµÃŽ$äýDÀºœÏ±þÂøÓµîp¸lš¢(«Š?~»áWŠ?¿õÖ[Oø³8Mˆ ÅƒCC|ýë_çk_ûÚ²ñß?üá_|!Bvâÿýwrå•W.‹¿Ú˜ÆÕâ_pÁùÿùÏαcÇŽkÅôÁ_‰ÿ¼®ø+ñF_w|'ÿÅB~§'eqŸ•’,7F±ßiÅIDYÜg¥dËQ,äwZqQ÷Y)YÀrc8Eÿg}Á*zý¶XKˆýI„‰þÞ;$~A¾½ØïÛ÷ÀöœÛá׿.ýƒ%Ôg·Uþt×>kl±¿3 €Ÿëß »É·ûíîÙG¼Çòù$[áÑG Dÿ` õù»4ñkªè½ëˆµ¶Øß™@˜è¿¦ŠÇÉ·û=~Ñ0q,Ÿž¹ï£ºª_Ïü s û£ÓQššJ|Š­xœ¦†¦Ÿêªê‚$>¿¿¤NøÙøÑIšššË&Xn즦æÒÏè÷—ˆþ+Õ ‹--•õYiì•’,ÿ#’\qÅöö‰ÄÞpà ìÝ»×ö;Þø‘ à3ŸùŒ½}"ñŸ7Þx#=ôPA,îñÄÿˆdW]u•½}"ñŸ;vì`Ïž=v]¹øCE2xþŸ@ëI¨fMWVŒ¿mªñ0ÈØmUcGèu|§=çý)}}}Èeè¶zFn]GOO s}4å>«"¼ðëû y5nÝTWŒø¢MàÛüoºH$B ­Q›‰ †“[ׇ‰-ôS×aùz$ƒ—þ„:¨ ¸1PŽß]€ïöóÌ3ü“ßG$¡NiÖÆ7»‡Ãh©1›«SR¿ãIþ¯7§½büùÛ¦o—Õv@û.ô^—ÿÿè±ü“¯æà9¿Þ ¨=¸‹žž˜ç°NðÎû¸ûiؤöb˜ç0¶éB»–Ÿ¿±áà>;E$ç'ðí$áo‰DHéåà9Ï@ïf?ó¬yŽí;ü¾í ?¢›gHžÛSD¾¿~Ý9Lo:ÅöëçNxæóvû´z{1€¾þÈŠüŸ¨ªj·½ÿºOóÄwÿ)ÿýüä!úúúøpW7ùêçyøwðÀ×­D&‡_zÑþ¬gÅb„.Ü\€¿büy_´mùÒNö{Wþÿÿ‡¿´å]ÝlÿÚ_ðÀ×þ€¹éÛ„ÃáüÅXŒæÿð~xæ™ãÆþÅ7_˯ÿê{yü»î³t]Ý\zÛÜÃ7øñÿÊÆ\ õÜrï_ó±l#u½ÉÄŽúúW§¿xè¿åŸåÏ?Ÿã*úúú¨yújzâ\˜[§õŸ}ÈJ`_€htE‘ñù<47×[+Ý÷;†ªÊ$’‹øünRé8m˜f†ºº óó ¤RzÁøÂŠùß¿?'Ÿ\Ïðð$™ŒÎÀ@¿??¿ˆ¢@U•D0ègii‰††zûÈdñù•üP¨–…ù%R)õëkK~+óÿôÓOÓÑQM4:O6 cc£9|Ÿ-lqCC££ÖŠÔét—RÉi:»Z€€å—JÁÌL‚tú•²ü;Eù7ÜpCAîÛÛb¿’o9Ñ?Àe—_Vòý‹:§(àïï¼³ ììè°·Å~%ßr¢ççsš¨sŠò’„P_˜Sü_ì[Nô¿¾ó!a2ž©÷>û,­­­Ô…BŒŒŒ &S躆ß ¤¡¡Žßÿþ÷d2Èf3 ÑÔØÈtNü?=]úpsbÜ¿ÜùÇ0t{•±Ã‡ÓÚÚJ(bzjÊúÝ™Là÷ûˆF'©¯¯çàÁ^²Ù “6þÚÚZ[ü?StÔ B,wþÉf3¤r!}}}¬ik# Ç-ü„ÀÒØØÀK/½H6›faq‘l6ÃÀÀ íÁ ÓSÓÔjí$[N°þgÅñ/Äã—4o§³£ƒ-[¶à­:îp˜?ùÓµt‡Ã¶€ò"ó-[¶0Ý>iûбÊ%bæ7¿)ø©äãx«Î³Úgšïeýúõ¬_¿Þ^!þƒ¬¶ë„9Åõ붯ӊEúΕ慙úã‹´ØõbUx±½nÝ:Ö…' °ø`­ZïìW ¿œMŒ>ÄR"¼"ÿò§kùèš=lÿ?ìy|å}ÿß3;{J»«cu[²%ß8#›#œ—ËähŠ¡MЀIHÚ&$!4„¦mâ6iš&œÒ@I W áH âN°- ¶Á¶dI–,ëÚ•öÞã÷Çì3šÙ]Ùr~ÓâïËûšgžçyïóÙñìjçù|Ÿ‹Móÿ??µð-×ÿ‚9»yW‡iþø@Ë[®ÿb÷^=æçØPó¥oªþÑhMÕqK jÎàçv_Úô‘ùmÔT‡ùÅK{ðx]èšA¸ºŠh|’æ–&¾ó‹.tMç¡ß¿Ž{*ÇÈîÚ.$›OQ]ÛÀáa0t¼Hdóªn å *<6>ü`‹9ù¾2’Ä7^z…Èü6ª«ÃüvçA?L4>EsK?úm7ºfðøÎ~NMS]Sσgäÿø™í~ ÕÆÿ}$‰»_ßGÝÂyTW…Ø:œÇã•Ñtsü±Ä$-­-üjË^t]gó4îÉ<wíaþâÅdóiªjë>xC×l|sµâ€ÇãÛÍÏnÙ%‘ͨøe/鸎¤^/{Ô’Œ@7ÿ6¯ ¹ÉçuTCC ˜ìœd¤²®šÀ@ï ª©k®Âp˜L$0´Í÷ޤH¾ÑC.¯PS¤¶®…D*mò+¼$2y²ªJ6sh¾¢Ià‘-Œ_×u—„®ÈTèªa û§Ç?ÐÓO *ˆg$Ejw/ªæ¦:¤&ÒB²0þÆ€‡d6OVÕÈe êƒÓú”ió»G†ŒŠeÁq{p˜ßcSÈTA×Í6bÑtY6Ëd¢ÉRó»Qºä;ž¯yT À-Á®4—pýôeË©¨ðR[ëẋÍûS sEyCËãñxù»+–Ómòù,n·M˓ʛæÇŠë¶Ûc·ý¥ù}Òm¨h†yÈ-ÃW¯?€[?t: 55n>ùgæÊmSqsEwCWñx=|åçÓmT5‡¢xÐu•dÞ4ßÏ4þ 9£0~Õ˜Öÿ[Ÿ2W©»ý£k¨¨ôP[ãæ–«/.á{½þífHÑ&¯æpÏ’ÿ¿½À¡¿ˆO¾wz•²Oÿé¢õ·×Ï¿ñ«7¸éý‹f¥ÿß¾§Ý¡¿ˆÏÿÅ ëù­W®˜Q{=ñüŸþk_üàŠYÿ þ.‡þ"þéº3­ç·_æŒúÛë‰çŸ¿ûy¾¶þÌYñ¿zíiØC˜òíû¾½L˜ý= 8êÙ÷í!Œú"DBðŠwYeþ ##£–‰n{«Ãð/êØÍÿþ Ÿ£ž0öôù`÷æßb?ÌÐ×;À‰'Ÿ`ñÃUAz‡£–‰Å’6‡á_Ô±›ÿÃUAG½KÚX±¤  ÄôoßNÆâVý\6‡,ɸÚShÍ1Œ¾ 2o(LlË‘Ûk&ÍÈçóh½7T.3ç`$ T]Eq»I§Ód³YëÞ_e°’pU˜T*E:‘D  ªy*„N¨>QÁ;?ƒ×ãyðU?ƒÑç&ó†d㛋mh½þ"~ÒÆÏÍæÓI*ƒþ"¾ò6ÿ±æ¿ýôHMhì{¶¶ÖQ÷ÓÔ0A[£5™£)"ÒxE'ïE6dbcqü>•Äd”áÁ! =…Ï"“Á+ÉdÌÿ÷oO~©þåøu Ô7ú ™£6ÂÝxÖ“÷‚Ïd”É">RÁßùúÑh”`0ˆ¦Ëlzò}¬Ëº. ó¿ˆ-7|„âPƒóV}Ÿ’ÇüZ™æ@–p8L:FÓ4š››©©©¡½½ý°ü•³äŸ±ð õüHWdçxБìýã7ÞÈ—¾ô¥ù÷Þ{ï›Âãrü{î¹gF~WW×Qçÿö·¿-Ëæÿ7ƒÿàÎÈŸIaþ?Úü™ôæÿ£Í·ë?“ù_Ä%—\R²¸6åÌÿåê3šÿEœuÖY%û‡kSÎü_®pعE"y»}ÿpmÊ™ÿËÕÓ”ïû¦d=<Ÿ0?—<Ÿ0÷ßÿÈZG;»©_Ô åeÇŠ¹åÌÿÅ!ô¿g¾iòù÷˜Ÿ©óï‘I®‡k÷žçhg7õ‹º²l% }›ÿ‹ãé§Ÿ ¦üüÖ£é;æ\Ÿ¦B€³s.@f7õ‹º¡¼l% }›ÿ‹£ø½±›öíÆ{0Íÿ¢N*"•N126âx$’ «{â{ÿÅ ;§8!€ƒ?rЪ“ˆÇIÄ㌌t<Äë*÷úEÛbF±Á¦ÇìuÄë(~”{ýöúÅQü>ØçÞ|óÍÌŸ?Ÿ¿ù›¿±Žÿ1ó?í‹é‰˜ÍüÃ[n¹…ŽŽn½õVëø3ÿóñ¢…`vóÿþïÿžŽŽËüoçÉüÏâ¹vÍ„F>)KØ•!°ÿdò.tÃ@îß>ãüÛæ©ÒšJÞÐ 4ÇŸn^DåXo‰þ. ܲÓ:ðô/ÉdÖk¬H4UÊÔOö’Õ]è†N(Ú3ãüÛCñ‹Ç_Ž}y’¤YušjütÔU°Ð%g¸Ð1h“&fœÛ–:PàCõø>âõíTÅÊò•"¾±o ¾€ÛÒ(ûîý¤Oof‹ú-Ò§7£½ô¯­ÿíŒúoQ¿ÅЪÒw½ÆËæÜžUÊßðrçoKõ?uÆOüŸ¾þ× ­š~ÆFæ¯ò³Eýûä“IßÕÍkëŸQ“¿”ô]ݼܹÙâoQ¿U:þSÏ ÃØèà?ðÆß0´j©U§ÞØHd•ß4ñÜÕMïG_œQÿ^î`lÕR³Þ©/ÐÎôrGÙù·ÙwO'ØÔsc«–ÚæT‡k8ùú+¬:ïû§OϨÿÉ×_A]m=}=V›ç¿õ#ÖÝþùý_ýÃ+„*×ÄК•€ýÿ¿É?õÆ+­:—}íæõ?õÆ+-¾hÓõõ»ùà׿X2þrüÈ%ï.Ë?÷3ÓäW}ëK3êîgÖ[|ÑæÑú6×ÞñÕYñ[ÿì|`úúÓxŸ9WòWÏmÂ÷M‰yãlleFý7¶¿b•=~Ù“€iìü²'Kôßûퟓù”í&pçŠïÓxߘõïÃ÷M‰ß]k²æuŽó“ûfÔÿ'+öYe¢Íé÷¬äw×n-ÿ¾îÚþW?ȼÎñéÿ3ÓîÏî³ø¿YŸQÿ߬™þ,m.Ød÷g÷•ðïxØUÂü²'™×Y:?t¶ÑÛÛ+Ýyç<òðÃ<òðÃìØ±ãù@ºÿþû]»v9̾ù|Þ2øÓ™Xù[UUË–Éd$éˆÚëºÎæÍ›9çœsx§ò·nÝÊwÞùŽÿ±æ ýò“Ÿ`MM!4 Ó¸¦j¨ªi„¬¨ð¦il ’ˆçÉåU$Ì 0>Ÿ„Û­àv»Š£iõõA’Éla…e‰ÉÉ,’$±|ùò’ñ?üðÃ46úÉfutòyàˆ@G× **`íÏgúš‰/þ8+ǯ««£µµÕ±z«ˆ?¦Ì>¦Ùðë?­ss3?ü°C×#-+§ÿlÇÿfd¥ …Bôøÿõ_ÿõ¨ðÿ·¼ÿGëÿ_gg'[·nå7Þ@.ÌÖÊf³Äãqb±™LÆú³'ÐuݪoO¤"Ž™Úï÷ÓÐÐ@SSÁ`ÐJPYYɶm۸ꪫ|‘d@d'«ˆÌÑö¤/"i@6›µ> D¦i"‘Œè[×u_˜c±U…•E±X  lýÃõ3Óñw*jjjVÌãqt"2W¦x§žÿÛøSSS\rÉ%¬^½Úaìݰa]]]<úè£Ö{z4ø±XŒ³Î:‹Õ«W;2õßzë­tuuñÜsÏÕñÇb1–/_ÎêÕ«ùö·¿m•ò“Ÿ¤««‹íÛ·1?™L’Ïç9á„Fr9Ó$§:j^#—Ó$ƒpØO__”eïjd_ï¹¼†[q£(‘H¿ßƒË%±uën·›… ë‰ÆRºA  000 ˜ Êñ. ’Jiär:šf&ÀQUlVC’ öÒÔTI"¡ÒÛ;F>ŠâFQ ñ™|\.·â%M‹¥Ð üH¤’×_ÎÈo™ã"ÒÈå@Ó@ÓAÍO¯TXY ~I•~óF–˜´ƒßo&§s¹$ÅG,–$Ó0t ñÒߟ-á¿þÛ(¾þwv®œ±®,»Èû|äræ÷-¿ß¼ék"q“N*•&ˆiæ/O>¹éÿÿ—/?ñ|Ù%“ËåÌï{¡0’dò=Ù,º¡“J¥ð¸=3òŸ}ö™Cò—,Y:k¾+$ÀÀ™ÿw¿{ÑÁ?óÌ3Y®ªÔþÉŸðúë÷sà@ Ë—ç©­½€¾þ~ÇJôMMƒ,^|¥UwõêÕŒÿ†±±|þ³©¬xíÛÝ,WU¶¾'75 rà@ MMæwÝÅ‹¯´ú&m±"¼0”/è¶V‡·‡(uE;€==eMé¢lAÇ0€£_1YLC¹˜Lxò‰²e.·ßå¢î‚ L}ŠËE;1SLæ´÷{É%—VÿÏg¾ÖýÀuLôÿÔ9æ„‚o>“:&úŸ[a®ððƒWä7]ÿö¦ZÀ`":I0B‘“j £ð!d€$ILMM‚$ ÍÄs2HºfHÄãqÂá` !®KfsI†Dt’P(Œ&ãøv"# á’åÂÿèBÌï"$Ibjr $CȾnHLYü•ÁÁ—HDc„BatYÉümÃ`"fŽ_ð;~Ìk÷ôøu4C&Ÿ*$ù3ǯ˜ÿ$HtÖe31ß¿ÿÅ»Ðõ<}£ir´„BxeÌ×§H.H¥¢Hÿçà IDATÈèyðù¼Èª†æ‘AÕúÜäƒ:•‰Ó•x¼| ¤HgÉçut$¼•."Ãi4Cf¢Ú‹×ç&Ÿ<¦ü‘‰±cÊo_8ÿ¸þÇõ?®ß OE è¶j,iËÒ³O¢¥1Ëþ!ísr y©oÉÐP¦ÂëF øÒ&2>Ü7·„„Ž[r‘Îæ ÷Ó$<Rï8!Å?£þÍÁ Éô$~ÝÏÖ!¥­Yöî“hiÌXüƒC^êZ24TOóý© ãYn·¯àË ©L޼*ø ÒÞ1‚ŠoFý›ƒA²ù$ß¿LsCšÁ~æÍÉrpÐG}Kšúª0¯bñ'²þ’ñ§²937î€ öŽQ!¹-~ð ¯;Ìï² õ•0<>EÂ ›æ÷ª êd PUð) k9ÃüÄRdó‘),®(Ó?¶6E1öS‰Ô;šÿO:øßóûÓÿ5þñߎmüÇÕK,C?8ÍývóÿLq¨zå’ ÷=zpœ¹í­ã¿0óÛÍÿ¼/Œýbkok7ý‹¾€ûØ?–bÅ’6‡ñ_˜óíæaÞÆ~±µ·µ›þE_ÀŒ}lR*qu¤©©©atty÷ü,Š¢N§Éí­$—Íâóûepw˜s:â;tܯÛk&ÝnM,LöQ¶ní+Ë¿øöñk¸€ž   èãŸ"“¡À7¿ãæó ùxý iÌ]rÃËиXrÀ²õ×ÏLÇõKuËP~¸Ð/6©i?3/g蟱Ž¿LýÃõS|\,Èq¬Æ?99yLùâ÷WÎÁ2ô6Î)lËÕ?\?EÇï¿ÿ~kþïí·ßn­Ö]ÅI½í÷dŠc&ãí¾ð…CÎ?¾ÿþû*ÿꫯ>$ÿÙgŸ=ªüsÏ=÷óÏ…þÂ0-B$"3Ùú%—\ÂîÝ»¹ð¢‹J^K1ûã7ÞÈܶ6k ¢[o½uFýÇ÷KþøúЇfÔÿ­à¯^½Ú¡ÿOúSËüþVð‹õñÅßR~±þƒƒƒo)_è?ÌŠÞG;¬ëï1 ¹Ìý¾ãñΉÅKÞUb˜FùúH=`&uÊ!Êìåõ‘zGûâ9Xb˜Fùúú†’:åŽYüB™½¼¾¾¡,£˜U.Š™‡;V.¡@e0xHF"úËŒmIég˜Ï í[ íθ^zÁ:nµ/Ô+noï?Rxýc[Ò|ækøý^$ 6RÏøØ©t¿ßK]¤ŸÏGÀçco_ñ©é.§r*‰Dœ×vºWa¾Usc=Eõëêêhkƒßàõ=o0:jþNŸJ¥ÞÑüï|ú ŽF"öuO/PZlVß×]k™öE=QǾo¯'Lðây9æ›É!êIˆ>2¯õ7¾G+é7õƒ1×EJ^cqÛë6©3ò•GöÂþ…"~v¹\–©Úív[«ÇŠU\UUµV¡f.—ËeÕ;Òöb…öw2_Ó´wôø5ß®¿Ù§ùÆí–Ñ4 — ÂaLqÒI'ñꫯÒÐ"?©2.—ÄØXÊ2^Š×26–¤©©ŠD"…aÔ×W02’œqü&ß4þ»Ý.“¯¸\¡—ññ õõm 쥺ÚO>¯#I2.—y#ah(Ec“IkuèH¤‚xüá?å‡?ü!sçVQS3‡t:G0èal,I>ï&Ÿ7ûÓèúi‹H$²ìر“E‹êxãÑõ_´hétvF~oï$óçŸÊ/~ñ êê* ›Éfs T³kW‚%‹«xíµ¹,€Bgg;‰D–={öJå©ÿ¼¹óH§³d2ªj&ÈN«©¡¡ ÍÍËxæ™g¨®v·Éde˜??@  —ÏQY`ûö'­hdl4E"a000H2™?¤þ>ð gž5½ª\q<ÿÜó\~ÅåŽ6"ŠÛŠúgžu&ÍÍÍ%œçŸ{ÞÑW¹ÿö+`'ÝQÜVÔïhï(Ëééí)éëXòíףĂ ÙÂɰcÇ̪ܲ“OfJ7¬Á‚_/|ïõ½>ÝV†ð­³ºþÈréÊ1™B===(ŠÂòw½‹L6k÷z½æw¾ÂwUQßçóñÚk¯°}û«³ºþ¸Ýž~*`øÀEaႤәÂè ü ~_ÔøýÖß »ví,9ÿ…Ñüõ×ï/¬&oòI€ßðÄãû¬‰&sÛV[ÏÛ;: “Jãó/.´[LSÓ³$ügÓ.´K›ÆsŸÿl`z" 8 ý ¯¡cáô˜{vÿˆ={|üÆm“\¦+,\h>—\gÓÞÑakû#$×ÙÖkìÙý#˰ÞÞar÷îÝC¹i>ol¹ˆKZl¢>Î˯êŽU0ì ¦ËMpcáùÉš« o *=‰ý#ûGÌïùyÕLðfd \˜«ª4ÖË ëä1Íïs û’Í/Nó»O)|/Rq˜ï߉|ßyl¯ B0¯[¢®†ÇÌ„€EâS—HUU·ÿd;—A]ÄШŽ.˸%hŒH5“±e5ó·ô[ÿb¹Åù÷_÷áw›¿ßüç'Yå~¶ ¯RàO€Ï-QW#q`ܘæ»$nýл©ªªâÖü®”/CS­ÌШŽNV5ù·_wºÅ¹ýÁø=&ÿ?|†Uþ÷÷nÅ«@½à{$êª%† |­À¿ýcBUUŸú÷M%| µ2Fuôß%Ë|ë¯×Xœ[ÿc3Œ¦ë|ã`÷9ô_A›U.ô¿î‚yVýï?¾¯¬þï_ÙÆwíµôÿëµs­6ÿöp¯¥ÿÇ.iwðÿõ;úÿõŸ.µÊ…þý§Ë¦ûúùkeõÿà9KøúÏþ`éËåÓ+Íå§°ôÿÌeïrð¿üŸ›úßò—«¬r¡ÿ-Wž:Ý×}/•Õý%+ù‡{oéÿOuŠÕæïîù½¥ÿßè4‡)_óí¦þr&{ýâãÅ}ªïúú:‡)?ÌP__gm…É¿8€¿ÂPbèÓèŸNfÆû¾=a€[™r˜ò'cqÚ«­­0ù‹3EüÃUAŽ–úÁ4úOÆâã¿}ßž0À—t‘Õ3ŒŒŒ#I.t r{x—Ï'£KÕ§xÐu•L&ƒªš÷ÚšN­DQ¢Ñ8únPq < Äû©k«'™ËÀ”Ž,ƒ>ž`<¦ S4ž§“íq—è¿ ç'àƒ vŽØò“Õ·q+soXYjþ/2ÞSX£á•n ðM—uÉõ檛}“($XP!‘Ëåð*€ž¦2µø[û°ø[7neå +KÍÿ3ð_ì&›ióÿéó •fçéæ'V(Eü¬müðØ¿•7Ì-5ÿÿi+Œ¿Ç–p¶`þ?±Ré)ú¦oÓÆoø`zÕõë«”=ã2¿œ£í´Ê¾w·Ä®»XrÃ’’úh;ᆥ%mDœ£íäœõ¥å_è\¹õ×n39ÓÚütBóÇžH ?"£_ª—Ô ¿¾tª¤ˆµù\XZpéRçëùŸ¬©é{½.†Üæ±—_5 üzÇtBS€æ¼ÐÂÅÿth¬¬T¬òGvNë´²R¡y©Á[²’­ŠøØj§žwT˜û7&§_×w»$küÅõHJÜq©^ÒFÄI íìåoþUE¹§ÿ³¢Pž´•mÅ4ðŸSZßäÞS¦`$•Óåöù¿·Ür 7ß|³u¿cõêÕV»Þžz{zhïè(k~?ܪÜ_ùÊW¸å–[fœ|å•WUþ}÷ÝÇ•W^9#ÿì³Ï>ªü§Ÿ~š³Ï>{Æùç"žzº‹óÎ]MOoOIâ{öìqܬûö¸óŽ;«·ßy‡¹Âé—¿üeÖ¬YsÌø÷Þ{/ .õmÆzûóT:UÖˆ_ÜO±ù_°ÄëJÄã‡5ê—‹™ê®Áª ­Çç›ùŸ’n—ù{ì²÷]ãèã¥_þ„ª€‹E^né9øÌ¯Èæe\´­þ€U×®ÿŽÿ¾—¦sÿÌ*ßñ?÷ðêy…Æsßkéß÷Ô/‘$ðÈ2ša0ï¼ËÊòÛ×\né9¹íI²¸$¨[ù'V]»þý]?#¸b ÁBy×Ï ¸u’Syjß½ÖÒbëo‘KFC§v¥óótó¯ * Óx†9ÿY¤¾­ä4n Oû*«nƒMÿ‰î'Ðæ®D)èíþ ~—ÆØÁ$þ•çQSÐ_êÙâ0篑ï‚n¦ÿ$^õQÐ{X#ßeéÿP÷F«þŸ/þw+cß¡ÿð ïcÝä °„ÙÄG-ãÿºÉLýã“°êf&'Msü>ùd®ã†éÁË‚ÿ2kä»,ý÷Þõ7ì+˜ú¯Xô-ˆ}Ë©7ü€¬œú+A?âòFËø ÷RUUÅ ±{Ùºêóà|é» þV’àÉUc¬P>>fžÏopí´^߀1sn½uþðâ‹ïgÑ¢{ jÿàI>˜æÿ5O\iÿ¯¬º•ºº:2Ù ñ©8é_<%Ðdãõd2ivÿׯ-ýÞ3}Ïè7_û®õ\²ÿ£«0µÉH8ÆXµ€d"Ab*ÉSï&359Éü¿¸˜T*eñ§˜þ"W\H&“fǽ¿²ôoý³ÕVGþñ[ÖsÕvþ¾{)c¾h½/Ê»—ZüÇ¿}§uþ/ýÐûü±ÿœ^¸5D®z™Lšmw?h]O]9ýýá¡[¾6]ßvþž{?Òz_çždñùÏß°ôï¼áÏÆô[z?ƒ=nà‡4Þ7Æ?üõg™ÜfêçŠékù§¯¹¶ráúÓk–ÿý}ÿb W‡¹áê2q«M¸7Ìä5“ÜÉ÷¼oûˆcÿsüœÆûÆøô5×ë2õÿñêé9¿×¾ÿ èÂÒ™mæó½ï{æ±Bùç®þ¹ÅÿË®Ë-ýí}‰cöøjèIÎ{TåË—_ÁÿÌl¿±ýëø§Î_c¹¶¶Öz-·>ø€y¬P~éÕOZü‹~v¾¥ÿã—M{ß©!ûý~Ë0ív»‘eUUI¥RC¯iÞR¯×k­ ÓÙËDFÁ#i/úx'ó ÃxGÿXó…þŠ¢`¦O3:šÀ0òÖÊ“ÃÃq:;;ñz½¬X±‚ññ²,!I~¿bµw¹\ȲŒ¦id³YƈÇsø| ^¯Y¯Üø].ƒƒ b1`ÐkÞxÓóH’N8`b"ËâÅ‹ñz½,\¸@@Áôhšüáá †a0r0g9s¹ÃÃSÔÕUà÷»ðùÍÍRS㧲ҋ׺ž4Âa…x\§¥¥¯×KSS~¿ËÒß烉 ƒÒx½n ÌUŸ{z¢LLdˆDüø|>Ÿ·Û]¢]ycÿ‚ . ³³“ÎÎN.¸Àœòt|!÷Ï·V›/ÅÆôâÕé}Õ2›Ÿ`ýúõ\~ùå\~ùå¬_¿þü®®.fââ(6&¯N^lF.æ‹(Ç?q$üãú¿ùñÇŒÿºë®ãºë®;*|‡ÿ§?ýiÇ͈7“ÿNÿÅõ×0 +±$IÂá0‘H„šš"‘uuuÔÖÖZÛÚÚZêëë­ç‘H„H$Bmm-ÕÕÕTWW‡ñûýx½^<ÏŒ×ÁÉc<Š¢XÆ~‘Xp´÷z½V{EQ,s6›EUUr¹ªªâr¹ÊòV®tÞI,N’099Y’üÌ÷7³wï^&''íìå¢ÿ+®¸‚p8Lww7ápØ*/þ1µ˜‹Åè)sÓ­§§‡ªª*zzzˆÅbŽvör+cñ…RUUEww7UUUVyuuµ£ßÍ›7;öÇÇÇgä×ÖÖÒÓÓÃøø¸£½\ô¿råJjkkÙ¼y³uŽ€iJ¿é¦›,£þ›­¿0ï_¿ž»ï¾ÛÒ_”wvvZÇÊñÿõïì4g‰¬[·Ž‡zÈÒ_”Ï;×:v4ôŸ;w®¥óSO=eé/ÊŸÿÇöü?Rý}ôQ6mÚdÞ»ººØ´i“ã†ÒÑÔÿ¹çž+Ë·ßÐ;šúoß¾½,ûöíV#Ñ_üxùÚk£ôôLÐݽ¯WÆãqQWWÁŽô¶š«yUTTÐ×CQdR©‘H%SSSäóyÇ ·ÛÍ‹/oŒ æà÷»hoo/«(bÇŽ z{“ÔÔФƒßÛ;I$±øÕÕ>‰8uuAž¾\.Ç3ÏLŸ#‡W^飱ÑO[[>Ÿ‹–––²ú{½^öíËÐØTAM]ŸÄçêë] e¬ÕÞM¾ù9œH$¨«óñòË#¼òÊSSQô‚)üד¼ñÆ( >ü~—õ=¡Xÿ 6pæYgrß}÷XÛçŸ{žûî»çŸ{Þ2´‹xðééíá̳Τ§·Çª+ÚÛË…Q^˜ÿÅqQþño¤£½ÃÊô/¶=½=<õt—5À6l ¯¿ŸŽvÓ,êŠöör1@˜ïÅqQ~É%—ÐÑÞÁ=?¼ÀÚöôöpÏï¡§·§$ ׆ èê2ûéêê²êŠöörqÓYðÅqQ^|ýy¹Û™˜'›É05o†iHUU•©ÁýTèSƒƒ¤’IöN/óù˜ˆFÉf2457ÓݽuÖן-[œÿÿ3™ Ñ2üÑÑQEatt”d"ÁàþýßçóFÉd2ÔÔÔ°}û«³¾þ¼ðÂóŽýT:=·ÇÍØè(ñxœ‹ðû‰F£¤Òi|~?»ví,{ý©­½€®®.|þ³­•"Ä«íÛÝœSXýÝ>éJ¬>/ÊŠ·"ľ}õù¹mmŽzb5øŽ…×XåOŸ—ƒÃÃLŽF9eN¸`Y+þ€Áþ!*œ»¨šñx%oŠgÑ ry2‰™t†D"‹KÍ“AÇ…„®*(² CRHNeÉk“c1n/“ãø7²nòuM%9'qp’T6‹¡¹@Ð0òr@¦zNè!Ÿwøø5ÿ¸þÿ×õ¯”½Ìoõ²¸ÍM<+Ó7äAB¢¾^#¬’Ä‹/M14:ÆÞ½û™ÛXObʇÛå"Z˜¨¢ë™DŠäD‚L.ÇÁ±z^GšßÃü9·*ij¼ÈHÔÕ©„40$™_šdhdŒ½=¾K±ø†®“N¤HŽÇÉär LÌšïÕdÚ%:š âY™~¿J7Çÿû-q†ÆÆèédncÉIY!6>aê¯k¤¬ñç98EÏé%úÓˆ.âêŸÁü>z‡£¸Ýæ=¶ŠŠ <Ù\–l&ÍÔÔ¹\3¡¶Ë岿™}>sâb&Cu¬ŸOAÍ«¸ÜhšŽÇk.‘x-C"‘À¥¸ ÷ö\xܼ^/• …dÞo>TTxðxd?U†o&q3úܤRé"¾Žk@*ð½6~ºÀ§ÀwøÕo£ñkþÛWÿš90ÿ=2íkÁ/G‰¾|9;LôåLõQaD‘³»:ã}ÛQr}TW¤i^(Qí6Í÷õò­ÿ[ßYÿ†v7K>àeÑûÝÈeør/ør®YN3÷É4¦hYìQÿúú0ŠYV´gYõ}¬G߯­ômÜjšÞ q¬ó#–ùžnXT“bi­i¼é\ixu$Àî‘€Y¯ðØ3ç h†J6›vðÏXærð·nÜÊÖYòWÌ•æeÝâÿn¼²ÿÕ¡dßm¿iì­ûغ±ÏÁÇÚ>Ðf™ÿé‡E5°´0¼me[aü°{³^áaŽ4DþÜ‹/¬äm§eøïï/]­ôPeÅÛâã¨ýzƒg\KKÊO>Qfm>dþ—±UV¼->.~C¾øÂJ~íž*)Óä/ ÿvÃ>PÖ¬æïÓÍyƒ—_ÕrKŽvör'Ÿ(³5¡òÈNÖ0À,¿1)Y†ûßM”&@>TYñ¶ø¸çÇVÜQa””kþ‚vÓ˜/ ÿ¿›(A²¬x[||A!{ÒU+M†½¼xþï¿øE‡I·¯¿ßqïMüFÿè£:³ÃÍ?¾æškŽ)ÿ¼óÎ{ËøÅóÏo»í6n¾ùfæ¶µñÔÓ]Ö=×¾þ~î¼ãëuÙyâõØ|á _ছn²œ‹¶¢½=ìü¿ú«¿šßnh-Ç¿ú꫹üòËùà?xDüóÏ?ÿMáŸ{vÚiœy晇ä ýEÜ`³âÛÊ—ã ±eËëþúáÆÿNåÛç Ú£Üÿ§C•ogj#î÷îÿ«}ÏlÊŠ·3µæÿr}ÙÃ~~Ϧ¬x;Sq¿¿¸|Êíülÿéo)aª¬x[|\ô/ô/.Ö‹ø¶…yfSV¼->.úæÿâòâñw÷½QÂ:TYñ¶ø¸è_è_\.¢²¢LB§¢H¥Í¤^v“¿h726â¨+ ö••ŽÇl ̉xœD<î0ù‹v##ã)ÿþ€ã1›D³yÅíf2þWƒŽGq½ãó?áüO Ò-ËXöþkxãñ;ÆïqË€ìÐ_“e7„òŒúëyÝQžiY†¡IÔœõ^zž|ØÒ_m[Ž!ÁhhóÖ\FßS•åÛõÏäU$t‚>׌úë9ÃQ>šG>§~÷Zúž~ÔÒ?VÝ!ÁnµŠÚU1üÂÿ8ô÷¸%@vè?•H£åsTzäõ×s†£|VE&Ç¿ò<¼8=ÿy5 ­ê zÛõ¬‘ïâ{/]Srþ ­êpè¿ô…çXúÂsì“;fÔÿJµ£¼zÛõ,}á9ÖMÞÀk¯]mé_½ízöÉ'S½íz®ã^xá}eøKú»N=Ã*ŸIÿ¥/<â(?¹ûö~b 'œp/?«ú©¥õ¶ë[µ”à–k9_ú.Hß+=ÿ;3ý蔥:3³>ÿƒ[®µÌÿ›"?³ôn¹–úH„g¾þ¤-{øÀ?Üäl2J°2èп²2„âö 1óùÎëÏËß{€¦Æ&6oü/ßs–¥ÿ_¹ƒúH„M·ß…úâN®øêçËòíúÛù³½þ¼tÇý456ñü·DÛŸoéÿÈ—þúH„‡oû&©§_áª¯ßæÐ_ðíúóg£ÿÓ_¿›¦Æ&~ûÏw±øÊK-ýºùvöu×rÑÏÎç–ÞÏp{û×Kοá«#ý÷uײ¯»–ÆûÆfÔß÷MÉQ~CïIìë®åÓ×\Ï+¾oéÑÏÎg_w-§ß³’oûˆ•\ ˜o×_ðS?›Qÿá«#Žò¿Ø6}ݵüe×åüxõƒ–þ§ß³’}ݵ,ü—yÖ±âóÿ©K”²×ÿ‡ï›Qÿ§.Qål Z:?~Ù“–þ ÿeïôÅJ¬ŠbÞF0aŒÖ4ÍÊŽ'~<Èf³ÖVÓ4r¹Ü·w¹\–Yù8ÿ8ÿXò—/_ÎÊ•+9ùä“9餓e™X,O<žehh’“O>ÙÑ^UU3ò®âvË,[¶Ìú2-ø‡ÎÎNt]gd$ÉþýSH’ĶmÛJø,Y²¤`îobd$K*‘H££)-ZäàÆ‘$MSQ‰yóæ±dÉ‹/Vi^¼x1ýýSÄb*##$Ib÷îÝ%ü††Z[[Ñ´ZÜîZbQH]uu>&'UZZZ|ÇeéàvKD"Z[[Î!aò=--- §©©õSQišV8ààÛCTŠãéøBzªÎg‡±ÚzLοœlÇuôTïX}^„0¥Ô''' ‡Ã%_Åïêê*ù,‹vÕq(5( _˜žÄ±7#þ˜ñ×ÿÍ‹7küoÿírþ½Þÿ£5~]×Ñ4 ¹0P’$B¡õZêêêhll´ D"ššš¬²úúzk¿¡¡ÆÆFš››ill¤¦¦¯×k™ó à —ËYÉŠùÁ``0è0ÿ‹Ä`fí–eÙ2þ‹:⦒¸þ‹öâóZ|~Øùâ=ÑÝÝMgg'ÝÝÝVÖ9û{lÏ)êuvv²wï^ËÐ-¢ø¼Yž¨ßaËl独s===tttÐÓÓÃ…^X–ßÓÓSÂmDÿ"K Ø/Çß¼y3§œr ›7o¶ ­v¾ýÇBQï”SN¡§§‡SN™^é§_œÃb_ÔŸI‘ î¿(»é¦›xê©§JôIf£ÿS…ÂgÒݺu%ãeëׯ§»»»D‘D`6ú‹ÿÿ3é/Øù¢lݺuôõõ•è/’ÌFÿ¾¾¾Cêüü?¶ç9ýíIcÊÅM7Ýd=?ú.S®=“ïÑÐÍšéÕÜÊ…ýõÍVÿ÷½ï}¬]»–µk×ÒØØHmm-/½´›þþ1vµµäüw¹$êëkÉdâ\}õÕ´¶¶–|F¿ï}ïcjjв¼òÊ0n·›_ÿú×%ú¯Y³†Õ«W³zõjöïWsó‡? ÒØè£¯/A$qœÿo¼1‰Ë…Å¿ì²Ë¬Ä;öX³f Ï?ßK,&³{÷Ç4éÚi§qê©§âõœÀ¾}Òé0nO’†##~¿ßqþ‡Ãæê*‘H„tz’µk×â÷û«@–§ojŸvÚi¼üò0K–4±ùx饗Jô«×w´wpß}÷qõÕW[fþ«¯¾šžÞkÕú0¤;ó¬3­z¢Ž}_ô'ÚŠ6vžaü7þÏ;wµeæ?ïÜÕŽUÄMýŽö«ž¨cßý‰¶v®Ø!’[­^½š{~x×~øZËÌ퇯¥««‹Õ«WÓÕÕåà‹z¢Ž}_ô'ÚÚùÅÉ´Ê]^îÞJ6cNlŸˆF©©®f"eٲ雚:p€Æ¦&&¢QšššýŠ6s’Å‘\¶lÙL¦ÀF£TWWF¯µ©±‘CC456-Ãm¼^Óis$ן^xžT:]Âojn¶ê677388Hss3Ñh”Û1;ß%›ß3Ë]ººº,3öë¯ßïXe¥½£ƒH¤ÞQÖ×ßÏ-´wt8ê‰íܶ6/¾ÀQ.VŸýõû-^SÓ »wï¶Œá†ö,O<þ8^tO<þ¸U.êãöžžFkõ Q÷îÝ\xÑEôöôX«Ï‹6 .dOO#íÚ³V¿ :†Ù³gµ ô8Xb„½láÂ…¼üª>ã±Ý»w[¦v{¹( z¼rú_Rk~/úç§:ôÿï_îKôÿT!éÃÃZމþçV˜4†š/=êúK€?\…&Ëät‰Á¡!ZÛæ0<8H.“Bñ(LÅb„ÃUdrã|tÝùH’Œ'àank ƒ#c44×3vp”êHCË£¸Ý¨¹Ápˆ±X”êH’ËÀ®·Ú¦z@¡¶&‚„„?.ÏO'Q< ñØ$¡p™Üyá)ȲTÂ/ï …E©®5ù¾¿¦©ÎâølãØ¿Ÿ¶ymØ?@&•0ù“1Bá0Ùü8—œ:ßÿ¼¹sØp”¦–FÆŽQ[_ç¿Å Éþêšß$R‡K—‰æ4r.…D^&oèæêÝZ—‘Ã[éŧ¸Èå5j5ªçÍ£"¦2RI…Ï…æ  ‘'ŸÈK&1ò)|™D‚t6‡ê”8žHBU*ä*?’ä'1™<Î?Î?Î?Î/Ë÷+*ç¬2·5ÇÀ€ÂxB!æ SQácá ¯B]SÆ280J"Fϧñx½dS)2¹º p¥H ŽŒïSòœuR%m­9ÜŒ'\Ä|!**¼,\*ð)Ô5Nó§R)t5Çç%“J’ÉåÐ Í>2¾+Ïé˼´Íɳ¿›‰Âø^,Ác=ÆGÜ?J¼0~oaüÙlMã—Èy*Kø©‚ù]–![ð8 c{^5¨ð@Ð#™+²Lá.Ù4ÂdTU1‡U‘§W¶/6¿×Lc¼0¿«:ïx>˜ÉŠ$ r*ä²YZ½ gÉå5nðJ*¡ •oþìUjª`2é!žÊàr{Éåòx<^ >&Ü.7y-¢˜÷>k+dòh’›€\Š·À7ºçòËå,~6¯áwƒWÒ¨¸ Wj|ù^se“Ú*‰É„›x:‹¬xÈåTó7wÙ4³™|…¼6}o½¶B&¯ƒ&)T¸Av{ü¬ Ù\Ž9^ögɿĸM~¨Rå–ïþ¶0~‰©¤‡©T¥À÷z<(‡áç ü€‹ïy¥úßùksy»þ?øÍ>~µµŸËÏXP¢ÿϵÞïrúôþ¿t‘cüàÔÿ_üC?­ÿ¿ÿò5þë™]\ó''–èÿÙËN°ñKÇoòMý?sÅŠ¾]ÿ/ýÇïüP¥Êí÷¿ÀÝnåÆ÷ŸQ¢ÿ—>tʬø|éÃg–ùE"Q.öÅó?&ʵ}ÚÍý}½ôõ0·½Õ2ø÷õà¯ðYuE”3÷Û·õõuÖ¾èË" €ÝÜ¿mW?Ûvõ³bI›eðß¶«ŸpUЪ+¢œ¹ß¾mo¬¶öE_öIb±(é×ur{\ä÷(TTðù¼d_w‘ÛíÁ»(C2™$¹C&½«°À„ª‘~’;uÉš®á]âÆ»ØM.«’ÉäÈfT Ý…4PI(FÓ44MG7t4U#•Jã÷ûß&|Êð)ð³$“iŸø®øþŸ·ñø5ÿ‡þÕ-*uç$¨mÍSÕ’!2W¥eNüMç«Ì¹À Òš§ºÅäGZ êæÉošþG?;ýëçI4¯Ñi쀺y:M $æ-u1g¡AÛEíkš: ~žA6£ÒԡмÐ{HývO‚Û U!.~w5çu†9±]v˜ñÅcQdúܹ²Ó2Û+ ìÐù‘Nº¿ßÍÒª'Ô¤õ:WvÒ¹¹“ž) EI¡„ÿgkZ¸ô¬&N_VY–¿¢Mž‘¿u‹¿²VÍ¡,ÿÃi?oã{ã·'E‘ékxÛÊ6ËìoŽßL Ðÿ‹~–VÁ 5Îzm+Ûh{´ž),>@[ÛôçJ¶¶8ýýAÎÑv–”]¿Þ¼¿s޶“}ísÇÚÚâVѯ(·‡Øß×n ÔÐ8m¼:8œ¢¡1ÀÁákó¡’2‘4`m>ÄÖVÕq¬¡1`%ýŠr{ˆý­­æE{"€Gv\ºÔ4ó¯¬4‰hí ißëu¡wèVý—_Õ¹t©d%ýÚÛÓ¿Ø×;Ì?N¯™nó» §×hünÂÅI©¤ìc«Í>nLJlmUÇN¯Ñ,¿èW”ÛCì‹ñ{þô±ßM˜û¿›0“””n¿_•„=­Îc§×L'ýŠr'ßÜîi¥ìüß/~ñ‹–IÖž¬÷1¼Çlæ_sÍ5Ç”Þyç3þ­·ÞÊÍ7ßì0M—3nÿ?öÎ<>Žò¾ÿµ«ûô!K¶ ŒOL0`›#@š4œíœP Є¤Ih$)M!­s4IR‡&¥is‘4iœ@>B Û²Á_ÒJ–lYÖ-­´çìÌïÙgvfv%ˈÔþ¾^zÍÌ3Ï÷yÏóÝÙYÍÌóù>`«Å»”¶HÄ<®GyÄýÀðàƒô/ÄÿÀ>pÒü§Ÿ~Úäßzë­æûèÉðW­ZuÒü-[¶˜ü+VŒ;[¸àCî´ÁŸ ¿®®Ž^x«>ói:¾ó<¡ï~Žù³Â_}õնÌZ×ZVȯ•'–B˜†8ÿ’K.±‰ô­eÖºÖ²B~…|¬<±tÎ ?gΛHßZf­k-+äWÈÇÊË›/¿ÖÜ÷£ßmàæË¯µ‰ù­eÖXŠ2ç²Ð~«‰ms™Ó†8ÿæË.³‰ù­eÖï²(s. í·ñ³Ûb¹¸~®¹¯ùà~×ϵ‰ù­eÖXŠ2ç²Ð~«‰íÅõsMѾS”_UQÅxæê‹6¬‚a¢]ëR$€œhß)ʯªª—ïê‹6¬‚a¢]ëR$ò–ã1&²‰|Å3ã?§tü§ž‹GÐë·õ¿á’«‰©¶øÏ¼äÏPT/õW¬%|ôõ¼ø¿þËï“q寵 _ #)€ÏÌ}ݯ¡&Óæñ(’ËÆŸuñ•ŒÄT[ÿ«/¸’ô¨FÅò÷S;ÚšÿÖÏï¼ýW\’!:Ë&¯.ÚBl$ankéŒ-þÓ/\Ç{ Ѿ8¾ó¯àlW_^ü{¶?‡¦äó½^C”[W0yçȽÄÛmÆÃµì\[ÿ—Fבj¶ŸÿçžkŒK¼ƒÏ0¸ð‰¼øoÒãZvn^üER€äE‡LÞàÂ'ȼú²y<{–_kã/ù'â5ÛúýÐÍÌ{yk›?nã‹ø‹$ÎþÇ3DÏúã&opáÐì3·g¼¼Áÿƒƒ¿¦ïzX¶œ›¶ÿ Ñ¥OåÅ3Kˆ¿«.ÿüoöQ^^ÎŒ—7˜¼èҧؽgOnÂÌö6[ÿÿ| »÷¼i‹ëŸ%:%þâ.–|m^ü+®¾ˆP8”ÿžþŠ‹‹‰Åã&oùÇײ{Ïóxœü¶=Ïî=oÚú¿çßIt$ÊÈÆfV~êö¼ø×¾w…É·ö¿§¿‡’’bñ¸É[ù©ÛóøÖø¿ù½_æñ›ÿÑ‘(}Ͼ»?O^üëo¸|\~yy¹ÿîÏßCÍÓ}f<Ú›Ëmýÿ²|³?v-þ_–¯àïÿæÓóxœüFVÓ³r¦­ÿŒ¬àÛº‹.lÏ‹ÿw>IÍÓ}yýŸµ¸?ïúÿÃ…íì]oç[ãwÛ.øËómü»Û°¡kˆ—oº‰ç×Dóâÿ¥ðFîxAÍ?ÿÉ¿þ?¿¦pžÓÉ”L&ƒ$IÄãq<)âi±.fr•eÙœY]¬»Ýîãö×4 I’8Ã?çñçÏŸoúK’”ç¯i.E&“‘Ͳx<ަièºÎÂ… MÿE‹¡( [·n5ÛÓ4mB~cc£é?wn>_×u· MÓÍ> ¾¦i455Yüç¢( o¾ù¦Y÷Xüêêj\²® Ó¦åóÅãQH§$V~GÇuuu&Ú´iÈ’ÂÁƒm¢SÁÖßßo^ ­3y‚!ÄíììÌdÏœ9“¡¡!†Ëo$ÒßO#yÁÐÀøAèììœ4_¬;ùâFi2æä +Äw ŠŽµ=™²ãá ; nÿïÿþïq—Lÿbö±“éÿõ×_Ï3ÏŸÏüÝp¹\¨ªj èÅu\ü©ªJ&“AQSŒ/~'D;⥨/Ú+Ä÷x<æï„•oýýõ3ãe¢HÂ#øBü/üc±@ ˜7/".ÎÄ ¢N¡óöìÙ477›KñPIdM/„µ®¸y™ˆo½ ±Zcc#ÍÍÍæR´)²¦9}†††Ì,˜V¾ÈL ù0Åߺu«¹ÁDÖ4§8Ï­u[[[Ù´i“)n?™ø[ã\ÈçÎ;ïdýúõ&KôÍ“‰¿°ñâà 7ðÓŸþÔö°2‰°iÓ&êëÁ£'aãÅÿ²Ë.³±àÌùÿN8ÿO4þãÙÛÿñìíŠÿxv2ñ‰mfÏžmÆÊKÅ-¡i¡P‘yþïÞ½›òòr®¹æ3þï}ï{imm¥­ÍLžN§ÿp8L8ÆïodÕ*#Vξ(nCtPTTdžÿ/¼ðååå¬ZµÊŒÿš5kˆD">lÌ@J¥ŽI’èë-¢±qË–åVþ¡Cý̬ŸFF…P(hžÿüãÙµ –-[fÆÿ /dß¾‡0mZˆD"‘ÿH[Ķâëº5 €uŸHPhYÈç¥?¼D¤-b+³fúLñ¿uÝšÀºO$ (´,äi3DÜÖ21ÆX ñ¿uÝšÀºO$ (´,äi3DÏÖ²ñ®?Éd¯ÏünM`µ²ÒRŽ9b.…?™H˜âÿ½þÄbcø²|«ßj¥Yn©ƒŸH$Lñÿ‰^F†‡dgˆ˜ˆ¸«Ë\Š$±xÜÿOtý™??Í®]‘ìçd¾­ƒ®Ê˯6Û„æÂŠ‚ûhh<+o_"þ">ÿ¥yåV!º±ïRæ4~1q{K¤À6“¼!&?'BC@.¹.5“¿9Ý´Eò…뢽Ü,ð5,:?bÙo<·ÖÂñBm…sæzë¾P ØEéBèné¹Âÿ½#ÆgŸãW‡¯¡¡ñíÿ'Wx#òÏj¢©éíÿÊà~ºS.ö¥gÓô6Äi€ôèŠ?@_¬…`©D÷¡NÜn7ºŠWbdd”ÚYå tE–]dtªÊËꢤ¬”áh'u% ¤Ri’©$ýƒCTV×Ò×;€¦É”$t†£#¨!?=Ì©Ÿ¤Ç†QÁ<¾báGGF©­/gàÈQ$)ǯ,+c¨oˆb?‘J204DEu }}ƒ9þÈ0j8ÀaÁÔÑa”`=£–BWGH¹þ»<#Ñ1ƒßÕcˆ0,üÁÞJÊJé`zi#©Tšx"NÿÐUµô÷ ¢épx­8Èáƒ45LGòf¨õ*Œ&4ü3{ñù$úö“qùðû]h*xC2ZÒ7œ¦"3FÚ]ÇH| ‰>9M PFwê(uIäþbÆFcà’ȸ$<é ™Õ¡^ÅMe(€424µ|/§7ÿLüÏÄÿÌWt™2ož† I’”û%TÊñû}¼±»‡óšd’Ñ"$_”´«ÔÅYâÈ`”êÚz^Š2™ú¡ã¿¢Ë”ùŠp7¨¤HQî×Q)ÃðóÆG þh²wUé#=äC‘ Ùùå¥Raþ1úïÒeʼA<³2¤¤e>Íàû}ì~³—sæH¤FCàAUúIyq‰þE©ªIÀ«SÒ ò<²!F—\ kÆ,öŠ n\ŠDYØxNÚ; “É茦A=ª“È€vøz ?.@’ñûÌèdÅï)!€?ÍùR& ²—”šDÒ!r("ƒÏc$,+–•‘1…d2eK¯NRÉå&•JôºqKIb/.@Ò4Yñ¹˜½~$hE^™x"‰äöfù*ÈÒ™’‘à \R–¯H”$ Ãð¨‹T6KBOŸf$w³AŸ‚GJ1¦z,|CØ ªÆ€˜hÚà‡¼2±D )+À7ùªÁo=œ@ÉòeE¢,€ÑÿQ…¤ƒ/É I ?¦zÅ÷ÉÄâV~š{®™Ë×~±Ý`ÜøC~ü…ÉãÄÿÛ¿nã£×4ð­ÿÉ ”–2*Ÿ¾q!ÿð_;Ññ#ÙB¡ø {üíüüþ¯ûÉÜwãyüÓwÚøÝv1Ÿ]ÿ8âF²‰Bñ‡üø‹ÿ…ïý‘/Þv!ŸÿîKXÍ™ Á½?è³ ø­õĶðq. ™³=!Ö"}‘àÀþÅ%!âc SÀo­'¶E€ú†æ1‹6¬ÂÿªªJªª*ÍDUU•4¿yÐú7Ô”š‰ '芚~k=±-,<{&ÃCQ[Vá¿X‰jJ‘ûâȳ4do õ¤S$É…ŽŽ{N ]—Éd2hI’ÑÚ”•—"}ÁÃđࠄ·Ý‡Þ¨£×§‘Ûýh3Æ;C¤“i¢¥ÝÜÒnn7Ȳ„>c§Y–Þ|½Ÿ,_"“Ñ-|ÙÂï!N‚·]Îò5ävÚŒr§ÏÂwäkïˆþO5ÿLüO×ø{¼I¤4(tÄutÜÆìôsÊ ‘ŸÏ‡×`xx€­ÿ¡‚ IDAT`0Ä=Jó“¹wTçTÅÌ6Â7HVÝÝ]Ð|A3< çTÉ$R /ãòÏŸ^ˆäüvþÒYé¬"©Ñü$®£Éý¯ËÇðp‚`ÐÅ=CËÏsïΩš¿ãêø¹è¿†ø÷´£#D{Ãtfµ2·fúCN¬eùwt„ abŸ™=üÞ5Ï`eë펱}†Ê’NÅÜvšUèo5«Èÿhw fLìsM:̯Ý#+[wÇëÛ5äˆÄ {ògf¶&°Ú¢óe6d÷mx]°érK}–)lUÙ‘ͺ¯ ¸lýeÀ•Ç· í!מUdÿÊ€ ‚ê„>÷ŒI<Ô V¶îÔó 1þœNÌí|~NÐo5«Èÿ• 8±Ï­cF’€9FÝñÆÿ~á _à‹_übþœ„}îsŸC×õI?¾í¶ÛøÞ÷¾wJùøÀ&Í_½zõI ý ÙªU«&ÅàÌñ»<òˆ­|t:Çãáá‡Wœ-˲müõ<`ŽIK§{˜;väßzë­&ßú.Œ„ô‚ÿïÿþï“æßzë­“æ¯X±ÂäoÙ²ÅÖîÊ•+MþæÍ›'Í_±bEÿµ×^3ÇÏYínËÌô;&I»[×¹ü'?åþî§¥¥e\¾°’ÿ5;uç¾üž|Ò˜åóºë®3û"üÿùÕÿLÿcñ—.]zRüG¿óè„ñ?¿ªªŠ×^{ ï{æÿ‹¥SàùIœu ùXë6Ѿs[¬øC~gÝB>Ö:€M´ïÜë…þŸÀY·µ`íû¾.ñ£OnÀ÷u 6û|_—ø¿æ}‚þ0¹¶œâáo-ÿŵ¿ÆóûydM `íÝ ?Z¿‰±;Vcߨð›¸CÐ_cùgÏ)þþÖò§foböû?ˆÖÄVÑþØÝ~šßÏØÝ~xÖØ7v·Ÿédñ³† ßÚ§ø_ø[Ë_|w'µß¶Çßš ðò’@N¸/Dýb)„ü€€?`+/ QUQe&pŠûóÑ(E¡PÁz¢LˆúÅRù‹B!ŠB![yÀ ªªÚL PHt?ÞqŒWæL0žèßzL“ÿéÿÙ8{6Û·7³dÉøã?uFFÎŒÿ´ŽÿQ%…ÖÖVÔŽý(3çæõ_qËhŽøÇ²ÿ~f\ùãŸ5ð)Z^ü¥¤Ä, îÒëiÛôßh3çãOºKiD"‘cò­}ü¡¤FãùöøuðÉZ^üCi‰J ¼è*ú¶ÿŽHi#Á¡ƒ£Iú""xêò⯸eR~Jƒ³€ÞÑçÚã? #a­3þ3$? 7^ˆÚ¶­‘2Ê{㸮;—ÖæV‰‡Xä»<¯ÿ³4ã³³ÆRÜ!üsdñ—üó_$X<²‰Ÿ?΢æËiUãÌ^ê'²3ÂŽÅ[YÔ|Aßµl94>ÿZ·Å¹i®=þñwÿo8ãïZ¶ø>‹†7òLÉXÔ|­jœŠ¦D"^¨x†eQ^ü+–úa›ƒŸMBØ·-ÎÇù¯-ý0}ò"úûñß¿.‚¹sŸbÿþÛQ”ÏÑÇmœûùsø'~Ì’»nâ{û\^ÿý~o^ü/~Ï%ÄÊŠª¼ø_uõEø¼>;âY‚Œ¼°ðš%4?ñcV¬^ĹóÎáßýïºçžüëûÆå[û2Ó¿š‘,ßyýyÏ{Wàóúòâ_1büŽõý橸ú"^}ô¬¹jçÎ;‡-‘õÔ_·šùàßäÅ¿ÿ,ÿµÄ,|kügÝp9>¯/ÿüÏò;¶‘×­fËW×óž?»ß×%ZŸiå¹ë7rUóê¼þ-{.Yc‹eÍúào ñIÙ´Ç?ñ/:¾¯K ït\ÿ\Ó|dç‡øŒö3în^À¬ëûi§‚Èίܾw=µ$þÍ0©­/5»úàƒPótï[m‹âûh³ãú¿Êhïÿm¾‘/…7òͳ`!œ}g‘"<ÞðW¼Ê‹ÿùw6C]ƒ­­ËÚU^º1Ë¿d-þ5]}ø¾.ÑÿŒãúŸ}ÖuÕ3«s¬‰ç²;-LVUŸÏ‡¢(¦àLÂS°¥iŠ¢˜3Á3{ÌÙÎ×_ˆÅNg~&“9­û?Õüÿ‚ ( ú}92jò—.]ÊùçŸ_Ðþüù,]º”E‹tÿgÏžMQÐK0èAQrý?ûì³lSü™7oMMM'ͯ©©!”ñû\ŠËäϘ1ƒššš‚þÕÕÕ̘1ƒºº:[ü{{,ýÍÍÍ<ÿüó<ÿüóy7 Büë´ŽŽúûû©x†s¤Íy³Ð ³–­_¿žææf“w¼|ëºà Á°sraÖ2'_X!¾µm€;w²sçN³¬¿¿Òebýxø…úlµÓ=þ]tÑ¤ËÆ‹ÿñößÚ‘HCü9­PÙÉöÿTóÿ”?ÿSñýSU¯×‹,Ë„Ãa¼^ã†C×udYÆí6f¯‘$Éö;çñxL½ßïÇãñ3¹\fvgñòA|>©TÊ–@\ÿ ñ3™Œy ™LÆHz“m×êŸÉdl\a…ü ñ!— R,­+ELñùZ?/!f79ÖÌ™Öraâ¡€•UˆoÍXiM.a½ùonn6f‰› kæLk¹0qSê䋇VæŒÌ–ŒeÖóÏÚ–ÈY^^nr¬™3­åÂÄM©•5Qüׯ_o›ñÜ!æ·Æÿ²Ë.Ë+/ÿM–‡îãÅÿ§?ý)7Üpøñb~kü/^œW^(þÖkÌxñ·&E(!æ·Æ¿¾¾>¯¼PüoAñÿñ^ú9|ؘ8èà' |>Ÿ)ÌüD"Çã.(þ?ÞëOw÷¶·åñwu‹Ç øý&Z]YîV\ÅÿÎëÏèØY446r°£ÃœMB,ñmçU|Þ‰0:v‰ø‹y3Ñ ‘¹U|^[{Øô«Ÿ9“U«V‘ˆ¿hÎ&/fl3Ò[Í*þþísÏ!¹.5g”·ú ‘¹UnˆÒ#fySSs»‰ÆMžsÙ}ø9sÝÉ?pà5Ó®2ëˆv‚¢t1ë’SÀîŒÿ†gsɦ"þoD^3SÿîTîê툿„DyI²ÇMmå9h…ÒŠ Rñ$Š¢0¢ãZöt‚ŽÆÑ£Ý¤ ŠJŠ)-/&:}ãyãöà³±0ïŒÿƒk/ä‰ [ÇÿOý‘/Ý~¡-þ÷?ñ<ý*Ývá„ü¸ãbœK˜~ÀÙƒ!øåNÿD¢á3Ѻ°û#¦¿ªª’¦¹¹gOþ Ï<§À?>–0Åÿ==½¦5Q@OO/þ žž^ÛºÕÚºM!CM©M¼_\2EÿNÿðPÔÿ‹¤bŸði뤸$D[÷ mÝ:‚K‘‘$mÆn·bŽÍðx<¤Óiô™cP'3T|”’’ŠŠŠp»=¸Ý^âñ8žr2šŽr¨˜x,‰«1€ÛíFž#•Jɨ¤R)úúúÞ|=w4ù)ÜnU%ËW²ü4Ô§³üJJ‚ùp»]Y~š@OI–ÈòÕqøz61ÜT÷ªùgâ:Ç?…dt@QÁå’`€PH¦¸,H  NÓÓ3@($ BSUŒyu1ÔÆ‹ÁÝh1ÍO6³lfŒÚª*Î;g MåišŸl¦ù‚fæUz˜Wé!™Ž »ñz9aþ‚Y°d\4Æbðj“¿êlLþ‚n“¿¤¾„%õ%“àC(Åe¤ÓÐÓ“ ’ˆF3Ùþü:XPK¶ÿ0óý3éøyËfBmUç3¦rèøyWwXú¯ Cv¨3gF .ïšÇŠÌó÷Äš £#dŠù­IfµÊ+·šØno˜n–U× .íáštجgò펙b~k€%J^¹ÕĶ˜}àÚy’m)žUnUYR¤˜õ¬Bþ {tSÌ/Dþ×Γ#r^¹0‘@k´‹è - êÜ3–Z…ù¯ ¸L1½U„¿¤SÉ+·šØ¶öêù…—ÿ4û9_ûºó[“ÌéÌ/·óeK6ùÃDãO|ðA¾ð…/pªìxǯ]»–Ûn»mÊø+W®dõêÕoÿXãŸyä~ò㟰nÝ:Ö­[ÇGGyÄ=Þgóàƒž’ñßO?ýtÿé§Ÿ6ùã}6k×®=%ü-[¶äñ·lÙbòÇûlV®\y\ãÏÿê¯þŠ'Ÿ|’Æ/ÙÖÎã’”Ç\’¸ÿû¹ùæ›Çÿœ9sxòÉ'¹¡i.‘DRpCÓ\Sü~ýõ×Ûú¿fÍšãâÿìç?›0þÇâ_pÁ6~SSÓqñ¿ñÍoLÿcñ«««Íø¦ß¹´ŠôŶsÝ)öþã‰ÿó›ßä• !¾sié‹mçºSì/üÇÿÿáÈ+B|çÒ*ÒÛÎu§Ø_ø'þoiiÉ+»ùòkñ}]âæË¯%ñIÝ\ZEú¿¸ö×FbrI¬"Q×)þ·Ú~·ÁL`ò/»Œ±;ep}nié<5;›€\Ò«È_ÔuŠÿmüM›ÌDÂ×Ïeìn?‹ëç|²óCüó÷Ÿ°Å¿½¹ÜŒÿ¬Åý‘Y¸|k¹“o;o";¾°3ñ?uv*úÇwØ„IÖzwÜq‡Mï蟊óoÕªUÜ{ï½yü{ï½—U«VÿOåó«¾Bï÷ûq»ÝH’d é%I"N›×OñÀZÎŽè×ïT*E&“1³OäÇÍ—Vÿ©âCNŒ-2™Y9Œ—ÔAì³ÖíXËõ3Õ;ùâ¦AÜ„X×&n&DÑŽµÜYß9S=`Ë|y2|ÑαøÎ ›owü­¢z'ÿ툿õ{oüëëëÇíÿ™óÿ{þoÚ´‰M›6±nñPÒùÂpݺulÚ´‰õë×›¾V;ÙøoÛ¶mÛ¶ñ¹Ï™:/ ?÷¹Ï±mÛ6~üãOØÿ[[mmm|ìc`þüù¶åÇ>ö1ÚÚÚxá…&䟊ëÏîÝÝìÙs¸`\ߎó¿­m„ƒÙ·wxJÎÿîî4½½£tt¤NúübþB¢~±^È„¸_Ô³5ÿª'Lˆù ‰úÅz!â`QgӖͶm«x¸P=aBÌ_HÔ/Ö ™÷‹:OýÛS¶m«ø¿P=a“9ÿ»t™ÂDB€ÁAÊJKÙѼî#]¼ùænÓ×j'sþ>|Èü&ùƒƒƒ”––²mÛV>Äoì2}­v2çÿÁö6óo<þË/¿ÄÁö6vî°|ëù߉Øþ¬brë,òV›ŸÜÓ‰pÖY·äÍ4/DæVÁºµ­Í›7³oß8rĘ\Ì/f’âí–HMØí´ØÄæ¢B³Å[Û:pàzÆ¿·´´˜3Ä[÷7555ä‹°Õ<çÈk+ˆ°ãu-/þ¿:|Í”ÅàùCMS€}éÙo[üúFûH¥ÒìjiÃçªa``i3ªqé2±Ø(¥ábt<šK4]£·é&rà.4ŒmÈ2CC$£1Px]Ñ$¦WÉøÝÒ>H&‘tH'“ûÝè™4>¿‡Ò0¤ÓiÆ ©,ßkÑÓˆ™å]zv¦ùTŸ[¢$¤Ò;Z:G6f^µ4¯›x"EM…„OðS©,?E±_UÅëwS6Þ™Ž&\¤T´îä«Y¾ŠâVȤRøÜ¥á ½:šªâ–Œþ¸4•€W!‘HS[.ãSr|€T–¯«*>¿›Ò°DZÍõÿX|5•Âë–( «ôæóå,?–HScå'“@~üáÄããÇÿ;rÿ[ûèã‰Ä7þ_ýq.ÉØDñN8þ…ø"þý[nPäÄýNÁ¿u=u …áoÇ™ú;“€‘D@Ô+”(À¹.Dúõ 3òÿÖõƒm¼¾ãMªª*Mñ¿ü÷ôôšëÃCQ³ž3Q€s½ªªÒé Ñ¿0!Üë;÷v°so 5¥¦ø_þÛºmâQÏ™(À¹ÞPSŠË¥ã:ì&y ª¦Ðg‰Ç¼^­Maxx„t‹ŸP(Lh —KÁç àë)e䣣£¤jŒV ¡E<$’Iä†8¡ù2Ó.3ö¦ŒÖîgxx˜D"A,#•N  ’iw¿øà:,“L,æw&°Z!?g¹³~¡„‰ùI¬VÈÏYî¬_(¡ÀDb~g«òs–;ëJ( DúBÄ/–¾¯KüâÚ_ó¾ ×ä±}_—L!¿¨cmG”[M$p&"}!â˱;²Û[íãÆîÄò‹:ÖvD¹¿)×®ØL‘¾ñ‹åØÝ~^|w'—>;#Ÿ·ßò‹:ÖvD¹ÕDRgñö`O`M 0žÅâ1Sè?žøìIÆ؃=!€5)Àx6æ%pŠÿ­Ç6Y Æ÷:ö‰Ê¬Û'3þS×uZZZiœ=›íۛіQžÿýão$ÉxOáäŸnã?‡hnn&ìQòâ?œ(ÿ”qŸÑÚÚŠ"ÉÇÅÒ¶ñWnWƬ—¬[@±K&ä–òøÖþ' ÷_ð#‘’¦ŒÿP,më¿[VÍzƒ%M„$LþÖ­[ {òã?~&­Œ_ϘõÚå*‚ºFÈ ³—úinn&þØî¼øw-m<æùß.7Njügª9÷Y.j¾ײséZÚhòS;¼øw-W°ÿíò"³Ÿ³—ú'uþÏ{yƒYÏç{€®¥ó¨Xê7âöXs^üûÆá ‹D"TXø¶óÙrûùÿX³Y/´ív*–úé[:¡Á¡ã¾þÄ1sŸËí*ÿÙ ¶øûý^³ÞŽ'~LUE]Gäñ'óýüH$‚Ëí*ÿÙ vñ½ßï5ë½úèlüã½þŒÇ·Æ"þ–¯®7ù¾¯ßÿÄ'õIÇ_üÿ2Ñøß×%[ücßí3ë]õÌjŸÔI|R7ùoÞ£O:þ‚<×ÿ½ëûÌz§“¨ IDAT±s–¿uëVžýˆ>éøÇŸèú¯ÿ:wºâ…5O÷Qót§»)étšL&ƒ¢(¤R)Ün7ccc¶›V!èŠÅbø|>sFWY–I&“¦ ûxüu]GÓ4Ng>pZ÷ªù'ÿsÏ=×|À¼íýŸ5kÖ”ò+**NšoµââbTU5ž‹k·È4ãõ_Ä^,>V;xð`Áv„P_´)ê9× ñëëë9xð ¹túXíÌù?µçÿdâ/„ÿB …_ô‰—‘÷Ýwû·{Êâ/„ÿV~¡}"9ÀÃ?Ì]wÝuÊâ/„ÿVþ®]»lKÀLð­o}‹›nºé”Åß¿D"ažÿ"³åÛyþg2óü™-ßÎó_Qóü™-Oôü¿ï¾ûX·n]žøßìvý¾ûî3Ë„PÐÏê/ü¬>Öòï<ú(¹çž<ñ¿0±þG5Ë„PÐÏê/ü¬>ÖrñýuŠÿ…9¿ïb]¼Ì/ägõŸh@@8>¡óŸfqý× ü¼ùæî·õü¸é¦›Ð´ ^¯‡7ÞØõ¶ÿbyå•W’N§pÉ;w4ŸÐùà ³¨è¬ft®1HÄ)&e`Ì"ÖY·°yófs½¿ÿyÏÊóÛ¼y3óU•]ÙÁ@‰ø‹ÔÖ‚øZTtVsD1f†o‰ÔØÄ÷ÎÙÞÁ¨+çbݘ>Æy«¿ð5ÊmÁ\t¾L4f ž9?ˆ5ÒÒÒ’õk$ˆœqÞj¢¾•5-ÔÖ¶ÅÿW‘k¦4þÏ`Jã¿oþ[€lÞͯ­ ä/f$>BeEC¤´!Ef`h]“øÙ+û$$øéïwñ™¼‡ØXœÒâbzú©©›Flh€ ÐÓÝÏŒúîîå‡/¾üâ÷óg4‚&A:Éw~ñ$~¹½“ëVTPä+f$¥¢¼”áÁAúLþº&ñüî.ƒ<·£¿¥ÁÓ3ØOMm±áÁ<þ†‘oaÕÙªÉzãk€Ä‹‘(«‹*)òçøCƒôiC¸—ÉßÞIB’àÕöaþò²ÄÆâ”„‹é ¦nñáTºô2³a&‡Žôðrû’;»,Pšü_6äýs0–LÑ=š$™’ðÌ #Åq¡0æÒtM–ÑRÞP¡@˜Lbd¥Uú{p»e‚e¥È ÷˜JR·R„R”DqùxýhœÀp?õ¥~’c Êx=:²×‹’ÉL)_Öõ©í¿®œ‰ÿ™øŸ¶ñï„’pfB¾îr!©PVQIÍÌ¿Èï6ù¡ŠRŠ‹B»uRq•Êâ**æ'Q]>östt~_rR|T(­¨¤zB¾J±['KQ®¤ü<ƒß6ÿè°J¸h2|â²2*§OÀOüX4Ai Œ’³’¨²È`œ@´0Ù!âwUEΉ߇GtFb:jVüžÈM܈,wÐU»ø=žÒq+ÒŒÙg| =¡°ÄЈáï•8Ãþ~íRþá.Â7‰TŸÇCȯ’JBtTg8ž"£Ã?°ÔdñKùÒwá– -¹‰'Ó„üCü?¨“H'ú½Œ&’¦ßgÿßR¾ûl3#£ø“~_¹{÷÷Â…DJÅçqdH¥2ŒDuFiT ¾öá&ÿk^Áƒÿö nÒ²B"¡Räw›âÿD:I àa,‘2ý¾ø¡|ëg`$jð¼åB¾sïÕ|ü_^°ñC•dJ%…áDšŒ}*7xý±O]Í'¾ýR~IØH~L' <Œ&R¦ß?âjþñégÉŽ¡ýÒ]Æû£¿}Ÿñ¿¿3þ?y¹ÅÿOýyn ¿u]RòãÿÏÿ½Ÿ¿yß\¾ö‹ýfݼg.?y¹ÅŒ¿°ÏÿåÂ,ßÿïÿîu[üÿî–…¦u]rçÇÿáìäþ¿\È?ü×N³î§n^˜mÓÎÿ§;/Îã‡*þâe[ü¿|×ŦuÝÊñ¿ÿ‰—xøÎ‹ùìú—̺Ý~1þâe3þ`ˆè9`¿/OØö4ÍÉ«g5!ö/^xž-A€3 €µ.Àýšæ6ÒÓÓKU•‘ \ˆó­ÇXß0Ãð;MˆýÎ_tÛ:Íöêf}tÔ­ªª¤§§—C}1€¶îA3€ç вð왦€ßiBìO÷ Y¯­{`áÙ3ŠæÕÌ´îO mºŽ¤»È¨ ÔëÈ)åprã¸\¸}>äL€Þý½„ÂA˜™¤´¸Ô0µ¸I’$£ïãb±éV/y”^¾þrÒj W8g6$c ë¤ßЦ˜x4$@›n$ÉñA9š€Ÿ¦´8T€…O–vðS Czdªû?Õü3ñ?ãôx\3$UpË‹âvˆC:­QY^I&“ ´ÔÇÁƒ *k@Q ‘†@P@äîjÃ]â#‘L§ …Bd2Iü>±dŽv"~+:jð'Ê'ˇÊò`–Ÿá`TŽÝÿÚTÔÂ×…d2iü>ˆ%¤Ïþv”³ïÆ&þïè1 C¨/„üÏþ61|Îòýfµ¢½a:³Ú™~Ïþv”w_™í}|/ÊÏÀ&þ?Úc ƳS!ä· êw¼®¡]kl;ý–t*lŸ¡²¤S± õÉ ¸ä v!¾Uü¿ãu ™\€B¦5jý䈌֨å‰ý­mÉŠsý·Šï_p±Ä²»&ì¿Óo¢þs~N”/ú?•| –6²|»˜ŽCÈߒ˽l¬goGœ~`ˆü[fd—mùþüÒ·L~üé½÷Þ‹ÏçãK_ú’­‘@Œ?¢k·ÛM2™4'.9Ùñ¯7Üp>Ÿÿøÿ°ñEr€·š¿lÙ2|>¿ÿýïm|‘àxù0ñøç|Gy„B&ÆýZ“©?òÈ#<ðÀ§lüñÚµkmï|Åúé§¹õÖ[OåÊ•ÇÅß²e +V¬8áñçïÿûùùÏn¶7gΜãâO$Öxï{ß‹®ëãöÉ’%fë·‚¿pá ù•••o)¿¬¬ÌÆwšUüï|×?‘çWÈ&Úoÿ[Çô8…ü“õ+dí·Šÿc½&²ñü Y¡ýžJ¤¾­›"~«˜r <•>Æúx~¢]áNˤ,ûÃiã÷wöS2­·k¦ˆß*懜öS¹ÿ%f?%Óz§ñ»:žŸhWøÕÈ2­–ý5ÙµßNrä£^SÄoóC.A@í·“f™ácùÇóí ¿pZæˆe8-³»UUT™ë=}=¶%ÿXÿ†WÑÆ£4pmíéMdëc¹/àcÍx¿ëãÊï¡··7ÿÿzÿ?±è®›ØñĹêÁ{¨­®%žÝH$Œì‡^¿kú½½½ùßÿGíßÿe÷ÜbòÅ:…Î[à¿>õ,»ç^}ô¼ç¡Oüì¶“úû ó¿jç¯üÔ&_¬ÇêžXù©;ÙòÕõܸî~ƒŸÝ¶òox þÇ«ZWÛâÿÜõMŸç®ßH{s95O÷1ûƒùñ¿ê™Õ×,Èã7}e>ÝNÓWfñüš(º>A'ߨãà$ÿ>àt2éºë®Ó{{{#£˜U˜¸a²Îú*nž$IB×ut]7a“õ×ut:¦iL%ŒôÖBá/ÊD»Â_ìü¼ NÂ_ˆç®»îº)íÿ™øŸ‰ÿTÆ¿©©‰ÞÞ^SìW^^N?ÍÍÍܺÄ©#Äæ…èÖÙåEÝñÊþc{ØÆعsç¸|QæÌÆãÌÐcµB¢lQfmSðŸþy€ ùV£°);^þ™øçâ_WWǯ~õ+[\·¬ÿ­ìÿÆmûJJJÞÖóo2ü?•Ïÿ­úþµµµÐõßzm‡Oäú?}úô)å'¹ÁYÇcCCCæzIIɸuNdßéÄ9ác8c'oápø„üþ¯œ*üBß‘À¤Ð÷(ŸR¾µ¿N+))ÉÛ/Êþ¯ð':žÓáü{«øg®ÿSkg®ÿSË¿á†Y92ÚÚÃ@n¦øùªJߌ£øü—R?s&ýýÏ3:v‰ø‹f½¢à>FÇ΢hÿ~Sh¹„Âjkãó_J"þ"gu ûöýÀÜî:¡%Rc Ä…0râô¦¦&sÆxk=«xÝjN!¸¨g­‹í£Ý1Û,KB`>gÎSp9ñy(1ëY÷[_î:‚XÅêÎ墥ç‰ÿƸ¯4;Cªè’ñüNB<¿Ë=Ë“]’1P^׉FI¨:’®QYVJÖ]3î e—ÄÈH”P(DRÕ@¯"“Ñ2È’Äðð¥e¥hZÆœ¡Õ\±ð%$ô<>ŒDG| t ]Ó‘$ä,?&™6@z9{/*1–° ø­&Dûž&C`a­côüOTLaÿðP”óC|,AOO¯­žHPß` ³&"ÿžž^³žø;ý…‰ý6a¿ì·uç‹ò{;XxöL€q}D½†šR[Îbÿæ¦tɱÝJV:SÂãñØŸ‚ú4´‡ÐÑÐu êÇ:ü A"ž"xŽmARé4n‚ªª ËåBQ2Ó†Ñ4 WW}z¯×‹Çãax÷(²,‘(O½Cø:nE*À× =`á§:”,_%xИ€?Ц«Ë>=׫dù1dªU¿Cú?Õü3ñ?ã® £@ÆÐÓ¡x!‚QR)(- ÓÙ9‚[‚ªª)5†$ƒâMƒ¾Nãÿ©ÒJx½+@cc#áØhI/Ý]IJ¦…p¹¼èºN"‘ ·wŒú£ñ¡bÈôÆNÿ•cq ‘ãàs ¾Bg—Ѝª€”ŠßEnÑãy~c`- ݃PRæ²óGuêk`4¡bØsÈ>VêxL$BþBûOdßdMÐB~ëþÙ7i~cNì?Þþcí+..>qþ)èÿððð”òÅ;ì2‘ì÷ì?ƾ3ãoÿ´Ç?¿ôÒK6öòåËßÖø‹ „„MŸ>ým¿H® LÿÏÄÿO#þb{ªì¤®¿§À¦ºÿgljíÒK ‘¡Uœ_42jõôõØ„ýV½H ’XöÀü‹2k}k’Áµ¶-˜==G ò!—(@$° ò‹B!óxD™µ¾5É€àZÛ̉þǪãL`­oíÓ‘®ÂI%eÎç¯æõ3ûî\Ôy§?ÿjþŸ5V1”N3O:u>‰Cq ¿¤ãwyÐå4ndޤ4j<2È.ÆÜôEcø$U“pišn$–d*:YF%iÜßKàQt|®"dÉE<•FW'Å/ñ+è.7.-ƒ(¤’iTU2ùŠOBÓeÜȺ i¥ßø­óÁ¡8ø%ð»$tYÇ IA% ?IM™—ׇK×гýŠ‹§P1ÞÑ•ø‘ÝÜ€–J‘ˆ¦L~dÙ.\ËÎ5?—y/ jö,¿„YZ„v¹ÑV.LìoÝǵì\fiƸ˜®¥¤š1· í¯Û–KÑüB7®eË™¥íÈîŸGݶ=æ~ùåø6dù×2KÛA»¼ÈVž;>c¿ð·¶Ÿjö™Û­Q£3þ˯¥BÛaˆü—-§"[¿oé€Bí¾öùÏž†ÆÆ“jÃ:[•˜…ÊÙf¡2ÈÍBg r:­íšššl¾8fÆ5§9‡Îßz­ +976`–'öÛo¬}ss™CwÊ̺¢žš+¥2ê †R:¹Ë'®4€ž]iüÓ_´Ï(ßV–»!P¦û˜“Ìo¯Åk0ÕC FÙ,gåm´QJ}g5Êtê¡„­a¢ü•>#ËîExÍ}ºÑ§C’ÊtÝX¯qoDŒöRQf]ýeÚóþîã Ìzãñöß]]d¶×1zV.Uûo>ì«¿œ·.¶ ñï»ï>Ô?.2û_óþ×mœ¯Òù»/ ¢Î…6ÎAi¤oýÝk<ñ¬Êmë¾bֵβZhÆÕkçIlØ“ûZZZˆF£èºŽËå2Ðjš†,æÅƒRñpØZÇår/á¸üÓé4¿ùÍoX¾|ùiÍìï!::Æe«/7ÄgR(ŠÂèè(>ŸmÛ·Säó24:ÆŸ_{ ‰TŠ‘‘a$Åͽ{™Ñ8—ÒÒRR©½Ý‡H¥Ò´EöR=m£££Ìi˜‰×ïCM«:tˆÙ €Ä¾–(ŠB:•"::ÆÅ—¬(È}×.“Í—›|\nZöíezCeee¤R)zŽ"NsøP„êisˆF£ÔϨÅëËç·u´£(n“Á²wÑÛÛ‹® ~¿ÏÏÞýû(òy±få¥$S)†‡†AQhÙ»éÿŸ½7—ë*ïtßµç]ópAÓÑ‘dYž'HÌà ì0e ;7H|!ÝI 7C'Ímwnn¸¤ „›&—„41IH°ã6`[È6¶,KçH:Ò™‡š‡]{î?vU録$2×ZÏsž:µ÷ZëÝë«UU»¾õý¾5²œ?‰ëz,-Nwù}ùîøONN²sd„˜™EQU’‰BÖøÝ;ù¿þ²J.8+û§òýüÂOöóù¯L£)ßó( ü§÷mç _mˆ$’ñÓÚ_3b|ìs|úolLM>+û÷oã»=Ã_½„ç´p›¦ÕäÃ??È—ÿ%D–BÌu^ÿåö%R|ä1>÷UÎÚþÛw_ÌOÝdòÚÔÊ,Ëïûwy¾öo&N«‰¦«Úæ¶ÈY±žƒÇô ;®19ºßbÇ5&3׌`}ö æö®pâtJÇùtCëµï8„Žî·èÙé,;¿ë³º›åΟõ<þ£ß]ÕÔÞüÀU+œH§®/rþD×÷x—et4#çÎgÀ®ZáÄ锎óè:‡z®1×¶o;„–;Ös0ñèwÉýô›.Øÿ<Úÿò›£€Öت@f:¿XÇHJ´jFRÂIš3 ¤Á8ZíTIY—0ã2õ˜ŽbE÷;FØ¢Zò0R~3ÄLÊ”%ïxRqŒÐ¢U ÍÖ²þã35H¦1¨ÑXòmr¼²Ò'ÐHç «Ṳ„ã„d7©4Ly¡4˜D«5p½è>£ØV‘ ¼v7FXǪ`¶p«jJÂMÆ`ºC ÔZ“À^y¿è&cP‹î‹Uê¸55)ãÛ!©•¦i¢.4 ™B¥N³äA** ôj«î8QŸv*µ ø­†nÒ¨G Q›8ÚÞ&:™J0Ð?€ëûLNžd`Ó©D‚Ãã§Ä¦iШÖI$R l@Q%:ÄàÀžç±°¸ˆiêd39E%$dvn¶Û> ƒW4óæáWôøÏ7_Üõ Ì~AuÊAãƒ.‹n€EbH¡2i#„ 5¬u)ªSÉ!•ú´GF~LJ¾íÕI§Û>C°€-N !°\ŸÅ¹¹zR0[pBÐCâB@’‹+h†`fÉ!W0L)ú¥)³—M9§RhD÷ß `WÎLÁ!kÊ”¬HÜ›5%JVtö5ß§<3ƒ18ÈŽ6Ýîýyg1u“,Óã ‡Y&nÈ‘8ÁѦˈ©ÐtBfÛ÷ÿBFã*ã —~Ib>ðû§@†LOMñúíl/ îXAˆ d8¦¡èŽ"É2óÕ&Sg©åÐ#¦Ê" å BR¾  4ƒ€¦ÒñÔ„$Bt š¡DèCŸ!ü/t‰°V{ðCêXAôú ÇÄ*¾EÆÔ΀ÒôYŧ͇ͧÀÄf—lÛú2ÿùæÿÛ?tÑ›¦+ð—ÅSE.ÉB dbªñ‚Ú_’ÒšÀò%|!‚e÷,mדDH€ |$Ôþª*èO›´BŸnþ•üH‰k;8uk…ý_ÿ®;V¬_ŒqàÄŒ?\ü©h½aõºÃòº÷ÜPdÛU&äùÈì¾uëuê>óÑ1Z¿òñ_º£{|9{9î]=ÜöíÜñ!Z0ü†¸õŒù«¹ËëÝ5v„o¾Iá3ã#]þØØØšÄw!öÞžuù«ëÞsC‘æ–øÜ‡Oñ;ëE«Çß)Ïe«»ÆŽ0¢Á1~ã¶ÛO;¦Nù܇Oßç9U÷_ï8½­>xäoð`÷ݾ1ÿƒËúܨ^§îËìvò¶Ûž³îî0ä°Ö=]ŸÇN”W±6›MF¶ogçÎÜûo‘Hq½Òl6Ù·o™tšr¥ÂSO=µáµ6›Mn½åÆÆÆP;[?šÚ¿·¯GyäŒø¥R‘©©é3æ¯æ.¯7<4D,ãÈ‘±.¿Ùlv——á¡!††‡×寮»oß>¦§¦ˆ'§åwÆQ ÖéêîÝ»—D"A½^çøñÕ[ ®¬×)ÕëÔݽ{ײ#kƒœ—×ݲe ¹l–b©ÄÒÒúëPz²Q½NÝîóÓ D:uc¦IÓ²6¬{º>7oÞ|aþ¯ª÷RÎÿÿðî·Q*•˜žž& Cr¹333(J$ÔkµZÔëuòù|÷wI>ŸG×õî΂³³³Ý5ˆÁÁAŠÅ"‹‹‹6öæ IDATضÍàà ñxœ\.‡‚f³É¾ï³wï^šÍæiù–eÑh4NËŸ™™é⟠~~ž ¸øâ‹i6›”ËåŸÍf‘$i Qº»›`?³³³¨ªŠ‚&NŒ“ëÉc&Ì.,â¹vÓ&¡' q0L«UÅu- ÃÀjz¾Bÿ AàR,Û‰’5\×Å0LLÓÄql»ùŠæ»36±¸„ey˜1`K q2çûH’LàK躎xˆ­u‰8‰d‚˜cn~I 1÷†Lß­2x›ƒeYÄãq$I¢þ¤„$d{<$I¢\.#Nš¨£Ñzœs–÷uüØ1Ê¥ÒšãòØcËå(‹ìܹ“b±H.—#—Ëuë­'þ(‹+ŽŽŽR,»«Ëòs£££¨? ŠssM”ü)‘·’—Vü-/‹ªIŸk­H ™ÉÝÿÏ´¼ý›‚ êQÎÉä|ÓNl›R´TR[Trþúý•°+þÏäÒ¦`92H©H¸_õhn{‡âª×=T=”aƒ“hÛ(T I ‰´¨’âÔ¸Ób¥ :Iªbe¿áPYsly©Š ['…Äáßÿ}šDŸ&±à„,8!}ÚJÞ‚³òÃè…ÿœø¥*š$“|*¾Àwe|W¦¦9”ð˜k*Ø?­„]ñÿ‚kÓ|l\¡‹ÛxÏÊ*n[ø­Ir÷¸&É4<—7þí5{‰¡Xÿšþ{õçþ|9^‹‚¹’zºãŠì(ÓÍù5âÇoRõ}ö$»wå#î?t¸ãfPb9ŽNµ¸ó½ßËñÇï’ù‰«ã<øl!²ÃëFçùêãE´ö¶$’¬#Éz÷ÿ3)®&sõ¡ÏñÕiÁ^=`O&†¡*üD&ÇΊ¯mfOæTTØðÛ‚‡‡k‹]ñÿûÃk€×_¦0<ðÞ«.‡_–ŸâB°©ßçjIÅÊû\9¨òÃÙ›¸(qåŠùwQâJrÚä´+€õç_'I€Ú÷wPËSb˜Ôv$òz©2.¹õ»üí.ƒWzl!AÏ Ìm702˜#{…ÇnÞÉEÉäñÿÒŒÏÁo%»âÿ_~]ȵÛà’‘ËÙº9Ã/¼fˆ…Ò<û'N½fû'[Ós\2r9îÒI.¹œ{ŸüWÞò2aßËEíï³×]¿‰KvçWð×+¿•ìŠÿ'þå×)ßÇ%#—säð~†­gX(Í“Ùys·~fçÍyìK+ø¿ò‡ÍwÞÉ—ÿû_qÝÞ>ze~ç} ^éqcÐâ‹x)¯»~SwüÂn"ì&K3>ŸúûyÞúkQ‚}ìcÜÿýܾGðg_¾éû¿Á‚›o>Å¿ùæ›ù³/ßÇí{cK°‡€í×^Çþýûyê©§xê©§˜ššâÙgŸåرc<ýôÓ<û쳌sðàAÆÇÇgllŒ#GŽà?ð_ylQçСCô(3Çðã æN,Q«7‘ÒK3eJå6 –¦ÊÉ&ÓÏXš*³8]¢Z©²8U†t‹ÉãjÕ "Ù`îp™JµB­^£T.AÊê¶_š*S«Õ¨ÖªÔkðœ˜ZÄêLÎ(7dT‹Ù… ³‹E§ÎÌ|Ô9iRµ]ú =PB…jGÜŒLB—Q…D-I©½I“œ"‘ Cb†‚L€ã I!SQ™@(ÈÂ{ðe}üY,ã{È‚³à¤TAoÒ §2a@ÌhKU|$¹ÍBf ?÷2ÿùæÿèÚ_=_ @à‡Q|U‘P%Y’9ÀF%Ó_0û2ø(ÈR”ÜÄd 4YB% ‘Û»¬h24<‰˜©½`öO*¨z›_ )QÆ%YŽ|`º U;À4”®ýƒÄ©5ˆÄu¿ï >t}‘]_äõÿ_Ï"ÈçOeñë®-üÜV‹Ì€…ñßšüà¦7v×:V×}æ£Ñz…w/Üõ2ïªúþÏmµø¹­Wß7É—Åéù7ücý¬ø«ëuJ±Xä+ù<×åJ\—+qí÷¹·´e½õ”w ¨WÅþJc·¾‘Ç}”b±¸¦n'Qûx“\wŠ¿Ñøßß^ð¼éòëKeÖÛ©'ŸÏóY7/Fuݺþø>^/•áÎ_¾£»&µž òù<_‚÷ T€7<öèš×yÝ{… §ÐæïÚµ¦N‡ÿ³…9àÑ;îØÐö>÷o*(ÁuGŽp¯Ø˜¿Hµm]Y'QD‡?Ò®³:IÀŸ^™¤AUUݱƒÑ;°[- Åb7¨"aog÷ªááa Ã`rr’l.·fGëNÝ[o¹ˆæPG¸ ¬©ßá3<<Œçy”ËåÓò!ÚYæløí¼íº.ÕZ|>ß¶¹èÖí0——T*E*•¢X(ÐÓÛËÜܮ뮩ÛjתU4MÛ¯ª*Ýq†ÁÄÄÄŠñ/¯;33ÓÝåeù®0ËÇÑΠš¦uƒH7*ªª277Çæ¶íMÃdrjjCþÒÒš®¯`­Çß´©UUPUõ9ù¥R‰þ¾>\Ï#—Ͳ°°°!¿T*aQPŽmÛò;kõ«“l4ÿÎdþß¼ÍÅNl9oóÿõ›[¸ÉmÀù™ÿ¯lQ¹ç5ÿ¯¼â"ªÕ*===T*lÛÆu]¶mÛÆ¶mÛºAÐýýý\uÕUœžç!ÕMCÄÖM­Œ³R™Ö¨Éüæ{¸ç_lb#‘o£Ùlâ/*Ôju¤Œã88c Aè”ÔdlǦ÷êäóâ—§TªG$~ó=Ü}NüJ¯ Hûˆ,¤ÓÆiøú~iR9Å¿§E|‡ßæûø‹!µš”ñqg,J<”š„턌¾aàœÆÿ®Ö4×ÞÞOÏ›¶2ôùÃÜ#ùxG Ⱦ4ö·;Ë7çØñöMlú‹Ü-¼s䟛ýß”Ùûº›oϱý¯ËüsèàÑ {vößžT)•¡VI݈v/$ ª`PZòˆ™‘ðÝÔ¢È5ZÚCÓÀˆƒëG"wY€í€®€Ô3–² Ù¾¨m `×îöbóüòç݈o$-燫ølÀÏñËÏnþ?Õ°˜¬79V®°àúÌÛÓ“Ùœõ’Ìÿ£å*sÕ“…"%Û¥ØtY8á‘èu^’ù?»Ø¢Pj2·X¡Þ ¨ÕJÇBôþs›ÿgûùÓŸ¸•¸& ½¸Ò‡^ꧤI쿽ï*bj•ÙÄsˆD}˜éÈKbÿ½Û~Œtl15O_v½©mdííLûϾ$ö_þýó[9‹oå=E¡Ùl¾¤ŸÿM­Ìï&[<Øë>Oþ¹ÿ~2p_o€¢šMû%·¿³"ïn7û¿0üçwÿ#ï¾`ÿeû¿³?‡.‡èRHÂ_ z…Z (¸P'¤ºdM…YÛF3Âät…X p¬Ü"§KjH\‹ÖOP— fúhZȤ%#9´€0JGnJÞº|3„ºP(½¬ø^› ™ <ÈéR›o?&-äˆe|zË»pý׺â÷z­†ëzäò9rÙ¹|ž˜at…î¹\¾ëߨתØv‹Áaªõ’,Q¯×Ñ4 M׉–Í¿¾>$Iî&AXZZ|Eó«õh¿\.³eË<Ïò,‰höÎ{Û÷}b±©TŠR©„ªªôöövZ–E­V£^¯cÛ6Š¢ÍfQU•GyÃ0ºI§¦¦hµZÝÄš¯dþ€sœ¦/!$× QBCOMÖŠ"-ÛÃsTSÇp>Š® -å!B ÝPñ'ðÐL• €„®!¡âFBF!#B i8ÍóʯZõóÊô'~ýBüá…øÏ ö¿`ÿ öÚÿMæ½¾Ï#ÿé-ï¹~ãÏ+ã_þ=Îcé&€åI éÔO+Î\gGä™™™³N p¾<þÄç,þÖ÷o`U.•Ö°J¥R7`,—ËuVuê,.ïž%—Ëu­¬Ö)Ë“ tk„þ•EÕ$u0Ú±Î+­É»d¼ÂÚ]¾—×Y]Þú5¿+Ê_.ôï$بŒ·wŸ¯z ¬Éã˜^†]ºÆÂœEÕk "‘¿£ú+þ”H)åT"€÷W©Š +Èïý;I:¥JØMÐÿO‰S’æáP!…´âØF%…ÔM.ÐIÐ)¡õê$˼P’4º¢üåBÿN"€Êý”À_*9jÁ ¡•U$4IFbÅ’„]æÿ©LÕ÷Yrjg$ø_^ÕfpüÈisEv”^=É£K‘ ¼s|uqü&C±þ.ë‹[‡ÑœÍ øæá #ƒ:Ǧm”Dï}m; , é³Ù𩲽§ÅÖL•~±J¼îâ;5BßÁJ'øÓôòGk˜:ĄЫE¶ýEï ´Ê! 6{å™è}9,´ÂÿÕåï' |é°Õø_qEÈgöò›ù;_p÷ÜJñ§ä*‚‹{%. ÒX’ÓMPtž$§]qVó¯è<‰¹LÜ?šxw÷˜ºLøß)*bM€ŸyÝI‚ÞÏö¸j8ÏÀ`Ôf¸G°…D·^³®øûÇ™þé±EÆF»W\» þóG.ç¿=xŒ¿½g–{_)þ]Iv§²ìé¥Ù’ØÊrï“_ëòÓÉhü9=ÜPøtùÛG^ @yü¾.ÿÊ×~§ç²âÿNyüä÷WðEk?ûò}ìŸlOÎqÍÕÑN=W ¦Ù±»wÃñÿÞÿý$³Ÿ®Àÿþûïgî.ãýÿÏ„aȉ–ËŽ˜ŠíÌz¿êylÉ¥ðBAÅDˆð¡åBÝh¸a[Ì,Ó°š@Í ðˆvünâã!u?J¶dH®ï!i¾*S°|ì*6¶/ÃH|/I`jÑCš&!Ë-ü<_`È.; áð¼íJÐÁ $ÄA)‡a€"ƒ¢„´|A‚âzH±áR·Ÿ¿ý…"‘Oë¸á©ñ †ðI„(2´‚ˆï#‘6eª6µ–Oä·®Mçóy>q|èú"½·‹n€ÎÚÃ3ãÿO?ÅïØFÚ‹2çÿêÖµ;ÅqÏ Ån’€g>>§½Ãÿôã¿ùö)F7àwd¢¾Ÿ‹_žñýO4ùìׯ·Z´ÿX1Ëï]²ëªWß7ɽËè÷ÜPä7ß>Ň®/Òˆ)>óš÷rüر5ë.=Æu¹»’_ÿ‹%î»c-½ñÿ¾ û³2¼¿Rà÷ý“ ¼£ ðïêé]ÑÏØØNé&øø/=7»Ãÿ,‚…2pk¡pÚ$ ×n`llŒ?>r„[Ûçÿõ ÆÞáß+#Å"…öãþöñõø#$ãÆ±± Åÿ'N.¬9¦ª*Ï>û,£;vÐ×××Aw„½·Þr ×ïÛÇe—^JÐ^ǨÕëëîf¾oß¾n’€ƒb˜&“““T«ÕçÁ_²w/›6mZ—ßh†aÏÉoÙ6Ï>L<_·ÞjÑr¡Pdtt'¹\Ïóh4N­kìÛ·KöîetÇŽ®ø=&''ןwíÚI>ŸÇ4MÆÇÇÉd2î¾¾zü™LMÓ^“`y„¾¾>`m€åãïœ.v‡?95E<==yæææ6ä§Óéî±ÕüÝ»wÑÓÓ™·âŒù $“I\Ï#™Lvƒ^×ãwÖÜW'h6› l(þ?ÿLæÿk†|fÂ(öù˜ÿ¯°)h[ÏÛü¿®Ï¦ oÎ}þD"õN³,Ë\tÑE °´´D,ëîZ&I­V Û¶±,‹ ˜››CÓ4„ˆtB tTÌÌÌpìØ1’É$²,S«Õ(•JÔëuÇyQø›6mBUU …Âó«Õêsò-Ë:-¿X,bšæþÑ£G×å«yMÓºk2avw«ÕjøR¾A…XJïMÓ“ï#ô4槪øNŒ@*³û¢= ì€ÀÄ÷U@Æj5¨Õ+˜†Ñ½>xž× hO$4õW4ßW,|ßï~J’% H¶Ðû‰! ½DÆÁšõ‘G"q€¦iÌ? ß¿3Þ$Q9Âx3E|k‹'¾[A?ÚO¶Ï@’"ãD ”2.f+„„A€¬(Xjýœùs‹eüiÆ›&‰m6GvãY²ýgÂo´ù´ùa›ï¢÷…ËøÖ¬‡<â“HDë+³XÆ/3Þ”Iló™zÜq†Š‡ IDAT\¿‰$…ˆL€$0[*!²Z|NãÿÉZƒÑì4ìC |î«1’WÕ!qŸ5Л)4U{ÑìÿSõ&—½3RJ¥úDñyðÏÍþ?ÓtÙõî$OUøó»4RWG?*Ýgeôf¬Í?½ý“ŽJ: ‹%H¤£]x+0uh5!‘»½‹½¡BÝ‚J)zîyP÷@Õ#Á» ÄãÐhA³¾I  „ ²ýFnY0?ïâ×ÜóÌ'â×!©ù  ùüÿá´‡~cw½_力…eü†q›¹1ƒù–Ç@¿ÿ¢Íÿñ nôxûûöÜðl@#€x@á° Øtèxñæÿ̘7ÂÞÛo‚ã!ÐâP}j5ŸôðÙÍÿ³ùüéó.åï|'ôGÄÏÿüφ!•J…L&ƒs2F\éÅŠO½höߦíãÍo~3Ÿüä'yÇ;ÞeY,,,`z©ŸŒ9HU;þ¢ÙÿâÌë¸á†øßùÞúÖ·R.—9yò$Bò­ıÍþ«¿ÿÞÑWgñÂäb ‘n!e—ìó_Ó4~6×`ú°ÂôóâŸû÷ﻲ.GÀÜ¢H{HYÿ¬?ÿŸýXoLE®˜çÅþ/ ÿÜíïļ1+ìÿ£jÿ_L!A2Ž íK$”<…º2n šŽL¹é“‰Éô¥|Ý€ztE°E“ðZ å¦O¤ A“CT%$)C=XU»¶ÏÉ*q½¹†ß¯„X/K¾ÔæÓæÃMœ!Ÿeü°ÍWÐo}À ñûüü<ñDœD<ÁÖááâ÷B¥B6“%‹áº.óK4E&™La[ ,Û¦6ï8~R¯ÕH$“Ä £Ðh4˜]X|EóÏcvv–={ö†a÷³@UUZ­ÅŒB”€2“ÉpüøqvïÞM>%"èøB€nò¾ŽO+“É Ë2Ï<ó “““4›MTU%ŸÏ£ë:Žã¼¢ù½Å£lžª!Y¬I*äƒ'ê!;S’¡á4|M © i:R­Ýy¡‚&¢—[ÕÁky˜ºAà‡¶‡ÕrQC›€„®"+P©8$4 ÛèHQœožWþÒlí¼ò¿þàMâ/Ä^°ÿû_°ÿ+ÐþoV¿uáû÷<ò^|s7þÜ,ü9ZéßP¬'g"L_×?7žþCT÷jõ{¨Õï¡Ì=„Üx yñDé1”¹o#-<„[~ ·ôáÒ÷ñâ׬ˆ?צþ½ø*—¬nÎ~£ðoh¥ï ->B˜¼¦nüCtï Œê·P'QæB©ïGž{©~N|Q?‹ÃüC„'þ 7qíŠøsåÄŸ Z? Ô¯^7þÜ(}¥ò½èoæ!‚ÔµÝøóøähÕ‡‘ìHö”ƣȵGPf¿‹Ô8€˜þ¢ö¤¹oÎ}‡pöœØU+âϵ¥Ï£Ö¾…›¿©~¾(« âV£›i5%133Ó>siû|á´ÎÌ䟳ÎÿßËö‘Ž;Æö‘‘Ç7 ~íî|&e½zãã㌎ŽvûZÝ÷zuŒ]‘˜·uħuÄï>?]ÙñÄb÷%+á•Níxoì’iññJJVêÖVëÔµ¥®˜ÿÙÅ&õn,zî”g›(ÃÑ®‰¦ŽÑs.ê1®ÌN>Aoþ"2¹(8Ç›jQ­Ý!"ñþ”ð"ñþÚü+Êdè¯+òŸáÒíkußëÕ]¯<—¸ÿ…ÿœ´¥®˜O\æPÃÎ6{â2 /jÓ2ž HjølÑ]†´åÀfÁlWTâbý{’ƒªÍp¨6ÞäÚÄ"«Ë¡Ú 5{‰¤Þ³âØžä ×õ\Ö=¬y¾¼.@Féƒ ¸åiÜò4÷= Ÿü¹0·‚úÑkø¥à–çéH±d-‰ïÔˆ×]Bßã?”ç×>SÀwjÈZ’FB%^°:Çâu—FB%£ôqµï’Û•å›O–ùœ€›' m5ÐNÌrœ,?¹- {|âÔ{øÿ}R0n F­ÄJ‘û'wüG$hÁ¼oWš¢\竇|ˆü)òÞËá—Þ¨àû>BDžÎN*z„]',Ë‘x×óºmÔ˜ÄõŸç{[ñ¬ÛwÎ?¾b n¯þ_O¼íüðõw;ð?Z×? C^õªW±´´D³^ÁÐ ††ˆ™ âñµzÁ¾ŽNLÒlTÑb ÂFùB…|&@Ñ5ÆÆŽ3¸y;ósS\ÿªçÀQФm#Iǧ޴¨Ôk$R Rñ8š,¡+‚dº‡Wå7­ËÅbÔrfþ¿^`n©L>“B54ÆÆ7æ†Ñåûõ‰TœT"&IèŠD2ÝCÿàVh5kªÎæá!b±81Ó¤V¯3Ø×Ãb¡B³QC‹% EæÚã×Lƒñà oÝÁüÜû®ÿ±.ßqÒét—ïyUâíñërÄOezøŸªðýýŸþ«YûûH¥â¸¾O__¾ï=§ý'OLÒ70Äçþn‰¯üé #" ©&ïšçß}$ÕYvsýC¡ñùO–ùþ~ƒ/ÜU!“LÐÓ›' %úûð<û9íb⛆6ó¥¯7øwvøñ.ÿ=O`Y-ªõêûkF’OýÆ"ßßçË÷¸h’`Ó¦MH²ÌàÐ ­Vë ìœÍÛ¶óÕÿý?·ù±6¿Æ/ÿ^/õf»e­ký“£Ÿ=ˆù½ î?Æ1éß°ã³ûxt™óeÏw#ÁÉ¡WÿÇØãè~‹£þ1÷Ÿº¿ÞDÿË×íÅ9pªÝê"_÷êöù»×=ñ`~à*÷?Î1éýë\ß)çK§ŸC¯¾‚ÇÙ<Þ¾¾ÜhÙõ=@Ï5&KËœ/›Ûí'Ûí{‚ÇYÚo1ùáéYÖ¾§Ýžë^ Nµ[]ºýà*zö?ÎBûú{VÙ÷‚ýÏý¤Dëxi0Žá´h‰HÌ`&e|;ˆÎ/ÿÇÛAütY³Ñt¿b ¥ æ  ãZMÐ%D*Ž»`¶ª¨Š„«¯LÂ$R)¼Ä+‹HúÚûs3)aÍÔ‘hµ:–ì—tA"%ã·ÅÿVÝ'^- Úth`P£µPÝž&nYˆXHhvt/¦&eÜãUH¦‘½-V²Óy°k¨Ôqk>öPµvJ`¡RGÒ"†Z”™ÑªG¢¶À ìôȇá«ÂHŠ˜UÇ5†‘‰¾£ó==ìÝÅ“OÿÅÅEb¦I<§Q¯£›®ç`VË¢Q¯€nN¤D?ëõ*[‡73;7K<‘BdUÆw£ïù‹wïÁ0u*¥ ùžrÙ ÅRùÿÿ¼ó+'m ò"û¾$K!Q›Š„,Ù­&å-„HBR‚€HäZòI©T'Jš"!„ 9¬R>%ü ü!õiä°Je2ò ¤†5¬ftÙ˜L©é“O¨”¬€,Pjú ÷L/¶‰w7å:|(4<2ĦœBË ˜Zl±9¡Ri…¦u¨Øø^´“f+D7A=ò] äUjVÄß$IÌù>ƒªÊBÒgÃ\°+©3VD*0bÊ? ™õ<ú}ÁŽ˜BÝò9R³TU¤)3[óX$ JBÐtB⺠hDü1E ©5@E¦Wó±B‰º’Ó%LUàù!5OÐð¢du ­Ê¨’„ÕrQd / }A($ ]Á¶[¸¾BR•È:s-›„"‘RU¡Pudx™ðÝ6_Ы…X¡hóÅ*~HŸ Í—Ú|EËø¢Íwp}VñE›/^fã?ßüMûû¸´l©û9h(N¨¢jqÇ%”uâZˆÔœèý1%¤äò¼ùŠ&°} $ A—¢Ä ­–¬+$UA\ñ©{™B™”!˜o<ûÇâN(wǯáSn¸x@³i#ë*i]&f¨4¢;I!—И,µ8SOòÅŸ<ÃÊÒ~úïÙqÇOFç?µ¸wM»g>:ÆÄÈùÑC†o¼r¶üÖ¯„"Θÿ)ógᎵüÎñ§+ýb÷°RØÿ̇B.þLÄ¿íÛ¹uù÷ÜPäîxý¿x|êÃëóÏ´Ü5v„Ÿ^õ`D¢xBþçýwsÕÖ]+ê,§+àƒGŽðg«ž¼AÀI`‹€7Üs7?½s׊:ËWžžÿƱ1Xõ`wrXv‡!»ï¾›?[–„àÆ3xmϤìÝ»—½{÷®86~ô(£;vpï7¾±n»[o¹…rû÷Úĉĉ3€Ÿ llŒí„gÂ/—ËëŠï×Ûµ~uéìÆ½¼uŒ?}hýdûg2ÿOž<‰ªªÔj5<ÏcttÓ4©×ëȲÜÔK’D©T"NwðµZ\.×}çççiµZ˜¦I:F–eFFF8qâKKKÎŒß%K«øÖ|¹ÍoÒ¹ñ{S¯ÃÄtôtáA­s;¸Œ¯­Ã¯=¯ñg¯Õ…÷¼ç(ÔÒ|â ¿ý l¹8Auû±ŒŠãX/šýÓ×ªÈ ™ÿÓÓ¸Õ$Ÿ¸Qã·€­{“gÉ?7û'®).ñîwðªÿõ¦8¿ym—¤¨n_"–ñ—ñ7¶¨Áæ]i´l…L\\`x°Ÿâ¼ÏBe‰ÙYè냊* à„ Ð*‚™Ú( ¤2Ñ÷Žír_n‚¬@: ––@‹©D¢øæË‚¯¢eÝUüd›ßd¶}©‡&óï‘8€à=àòåû`â¸Á¶íÑ}~©‹ý”Ú>Wå‰ò\rqãÿO}?J>ôö?ðø‡û`â¸Î¶ííX¶K§N;ò€ÂÈågÃîùô;‘/ø ÞÇaÛvVð;禀M×øg<ÿÏdüÉ©½$€ûî»/~ñ‹xž×ýþøñÿq¾óïtÏ}éK0·ýû/¨ýû‹×p×]wmÈïœûç†cÛ|Aí¿½m2ò…/|aC~ç߆§·ßÿ‚Ú£ï¿Ø;2¼'góð×|t%'3z^’ϨLìöHxüÂχîᨒ ÿÑpyç·}ôv8VÄ?óÏÿç3~q2,¸îù±ÿ Ã?wû‹“Ú2þûÿ(Ú'[&BBpAÀ8EÇA %²1ìÉÉ…õ–K^R‘, áCNR)5}6I2²/‘ªJ€Pî´Üô +)”œ¢âhkù–£Pžü$PyÑøõVH^’ž7y©·7c\.~O¥£_3ÕÊ©d½FƒX,¶")b£Ñ •ÎRhû[ê:‰x‚å¥ÓW£Ñ ¯èó•ÊWUL&C*•²,ÇÁ0 Â0Do'WÕ40ŒÙ×ëu‰™L¦›@³#~ïÄ•vÙ˲ÌÒÒù|žL&Ãüü<[·neçÎØ¶,ËÝJ¯T~ð¤…cKdÔÿÅÞ™ÇÙUÖ÷ÿ}Ö{ÏÝ—Ù·$“LHY ±¢ "( .h‹/Ä¥. ]Amí¯‹m-mµõWq©ÒVŪ€€ *I H˜Ìd&™Ì>wßÎ~~œ{ïÌ$“H‚[x^¯ûºsϳ¼Ïó½Ïœsîó|?ßGÂN@T“)N™¼¶OÁ]ÛAV T-Ðh¥V©àx2j²«ªS3u™¶YéÑtæÊ’J]vÍè —A3  ˆ*Z@Å<"ZˆéÉ"nñ¥ÍÙÿðeÿÏ—íÿ²ý_¶ÿKÓþ/öýç¥Îöøþç¡ÊXyÎ8r€ÃÓ&žQEþW"€›õXñ_b;iGgíÊ3¶L4è"«ÉÌ39›±ETEÀ¬¹¼ÿÊnnºñ÷Ñ =öG¨Ãÿ@÷™¿ëzLìù¿ ˜÷?ú;VmýcdYàðD•95AhøïQ'ç±ñ­G(ÕP´ëûC”KU‚šˆ¢Š¤Â OŽ; ª7‹˜5‡¼çtþà†ß% TÒ¢Vü"]çÜ„ëÂÔÏÿ‰`ì:`Þÿ\+ÝJß¹F¨VäÐD…| AààÍ(€çÀoù8”j„5™uýQò%‹`HBTƒ´%ö==ÍðHU±j.zÏéüþïý.2P;øA”òéØú˜^ïç‡Õñþ%ÿ_^è´¤ Y‰Í ºº‚Ü_-êïêêbbâ)&&O,Êûß’:25ÄþG þÿ¯þBáþÂÏÇK' pt[ ¡8°¨nãï3“WKMá¾>8/_ ‘ßHG‹ù휋>H³-x:”b]uÞ9Bœ/Ûø<pYeøí õÙd^Üß<^/3p±èê&ôDŽÖôZ´ì~&÷<gnd•!ú¯µ›}XCóßb=nÁ°pˆt&A¤X$܇‹óù'Êëñd~‹cžC¯ ½HÇ8Q;Ï7í-;¬Hì-Ï_Ç Ðp9\·s§…•º˜Ÿùãõ2}—°¬qUj€¼k ŠþìR·Ê6Äú«áXS#†ÃiuÕ|»Æ“l*žÛã7ù¿*Àι'›/õ—Œ9vslmÙà×_ÐFãs£n£,€•߀’èæ¯OsÝ—‹„óã\÷eb,!×w–±gHÈmäíÂeÿ:Øó7’c–¸éøÇëÓüÓïµó'_éæÂ­qDÉŸ½ïÑ<äÇ›eƒY°T‹]’Â'ÇŠ3a—¨°ÝͱåˆBŠ$+ÈñøhŽ’¬FHòÅÁ€ánÝ#2úìAî½h÷.÷lZÞ¸Ž¤Ùâ ±íI?0À‚Àžô'ª~Ëý2«"ïj ÷âþUÇ Ð÷‹þCe¿-w²j‰ñ×h»Q¼ü~ù˜ËÙgõ°ùª~ù˜ËžïìÁéï¢5é°ye‡'}!þf¡‡ÝÞ¾‡Î,à»A ¼á¢?¼¿Ìç~,0¢ä??ÔÏ~¨ŸÃoÙ¼e^$ö®Uüðþ'êA>÷cß™ð–÷t4ÿü‹ÿåõv|Àû/¿ø¸ösŸçO~ƒw}hþpöä*,Ñ 0‚ß…ÿüÒM|ø}·¼>ó%ÏýXä´ÏðÊ3aóÙ¿Üý8ÿ1ëWÁÞ!øÜ…¦à£u±ÿÍ7ßLÇ•eçg72õ½^þëî`ÿbs³Ü¾¸›2,ªkɺ`½!Zw]×QUU±, EQpÃ0š“r²,sÚÛ–‘ÙWdç¤Tßáã¹×o”WŸå%䟭 íqø½—Ä(Õ~~j|A¨Õj,_¾œ‡aÆ5ä3E"‰Êyÿ¾ÙÓ»‚ÃG&(•«”«Cè†å(rÇñè_Þ‡ë9”M›ŸýìgD£Q²Ù,…BƒƒOsæ¦Í¬èêD%q]—ìô½+WÉÎ0;—ÁtV®\y,?ç_çº{—353GyßvMEÄuÜ|ëþ‘Ñœ¶ný ù– §§‡‡~˜3Ï\Cn®H(ž¢\ßÕ®§gùÂS”ÊUJåA Ëmöß¶ú—÷âzEÝ䡇"‹‘Íf)‹ìÙõsúV³¢³ 9÷w}™¤¯€ðÜ4³™,3™38kÓ$|"ñs³yþßÿ¹ñf‰X$üíïR•E®ú=¸éÝ5 %—¹­B>—¥««“ÎT5–¤V«‘™™¢cÅJ"±2£cÌdz8kÓ$_¸]"“Ëùçÿ7ýƒLX >Gû»äª:×~,Âõo÷ùÿö]ì\•T:ÀòÎvÔXÃ0ÈÍÍн¬HµÈäL¦Éÿê= ‘D˜B®Ä'ÿÔå£ÿ¤¢HÒs´¿I>§sÝ_·ñîËòJ.·ýPcv:O8R¢¯µ 9Dz,Jù,=˳Ìfü1®}П$ûM°ô{ßä ð¤­ÇŸ@iÔ¯}þi&ê“8£b?Ë݃ˆÂN–»0qV?{w&›“<þqÿ|¹û8gVÏßL×cûêù/h3æî £â¦E,ýÞ8(| ~~KO€4ê×>¿›‰zû£â&–»# ;™ß[?À7Ãçw3÷ÁÍ´<¶9q-õú-.Ìuc;“õI–}õã/®¿;Èœ¸iÑO›÷ ïeû¿¨ö bW· z H¨¾€XÇQ…)j´Cl^øßHR@¨Gy1º‚T!B-ÕРWÃ5ó(^ 3ªQ(Jˆ-a®…YÉ4üþ WÆŒ†(”îj©‚@‰ %aݤ®nYD"„ëýZk+8J/( NÌ n³à‹ðÒaÌ‘"vW”¸¬S6¢¨(b‡(ŠDué FtEa¢„ÕE)U±ˆT(¢IV4D~RÄmõó Q(ãÖû¹-aì9(¢‘p²Ôʵ` … º:NgǃÐÛÛƒ¦¨Öj´ àbÔtŒZ•¹9¿Ï-ˆ"ÉÔŒ³³s´¶¶‹Déêè"  G)”KTÊþ°¤Ht¶w¡iv=ñ8ÕZNYAki%ŸËã]/ó_æ¿hüIJ Õ}U®ýx™ëWä–H@ž[†úOÈ_*]¿ê wOÀÊ{üyú¾ú£éaÏßÉž/æß=áÔ9û·74ùw×—¿Þ:°šúšÏÑk3G÷÷!_¼ФÙÿ݇›õ½9hÎÛæË4ê-L Eã ?/ÅÿT]¼ßX1Z|jp°i‡ÕÿÈóóéSõÀK­R )ñþ°ÆóÇì³õù¶ÆûÂ2ÇKKña^ …šŸ·mÛF¾P`vfæ˜v”úN_ûú×yýE-¯Z¹’¯}ýëÍúà äm/•NÄ?r ¹k”iš„#Uå¾ûïgÛ¶mlÛ¶­ÙV,cûöí¬^=ÀÈ胃NÈ_*­^=@.—¥Pð,•ºàĪ FÑÈ"~.çÿ.[¶¼Éo;2>¾¨o S(:nÿËårSÀ‰Dõ³q¼áÚH2 …ÿT­VÙ¡ñy)þš5«©Õô¦€_Ó‚¬Y³-è;®ds¹æ»¦›m®Yã X(ü?þRâýÎÎNBšÏ¯Öj‹Þ–9^:þsÿÓâ8+º_´ñŸ×ÆHÇ[_´ñŸQŸ¦¥§ýyÿ†_„(ŠØ¶$I˜¦‰eY˜¦ÉÔÔ‘H„T*…(ІA"‘`||œL&C__§P‘M IDATétº¹Þ`š&Õj]׉Çã”ËeÒé4Ñh”'Ÿ|Ã0(•J4Mk®GÍoœÃRüx’'7S`YÏ*LÛcß¾½Œœ7L$œÀõü`ø®³³³†ã8‚Á ¡PØÿ\* …^Ò|µßCVýc™6¦gfñ0 ˜òÿç’¯¬Ö:¸£ª•*âˆvÜÿÝ‹[ýkƽÛ{H¾2gC¥fÞ ³2ã‹ƃ8®pþ̤¿&˜:ÇdxÊhìËÄ÷¶× \`sð(rúÙÊsàŸxüMVyíßÏ_[úWÁÁÆ»§hòÔäÃÔ0…ÎòWúßïó¹þ¤ƒ«Ù¾}{“õÕWóµ¯}«¯¾š‡zˆW¿úÕ¾øxç;ßÉm·Ð;ÞöïMmäöÛoÎüË.»Œ»îj0øyÛMÏ+¹õÖ[Ÿ3ÿÜsÏ…ŸRvÝFEDÔÔþ¿>þ©Ù_‘0 “ðéþu]|Ùþÿ#íA$Wu)¨.šƒ5‘œi Y"gÛ¬Ž€#»$C2yÝG< °à°arz8DÉr‰„!ôðl×™š®MZ «4ðï0ßZ‚oqzX>9>þØkˆß#Ñ(åJùñ{,ždäðhós8ÜØm>µ¶¶2rx´ÙF¹2?—ŽÇµµ0½”ùÉdEQp]Q ƒH’¿Fìºn3ø†eY´´´ðÌ3ϰqãFÊårsc©F@úFjü†×u½ÙŽišlݺ•t:M.—köx©óW·Fx* ]A É2°ÛV‰ÁÔuÞüè§}ÇwlýBK;®å"U¢Ae®Dwk!_æ»?½¨ü'×^OU“ˆ;"® !j ù¿IB¢FíWðßýÌü³Gà+k>pBþõÃÿ¹ˆÿ;ßyB~àWðoš¹c¾±IøTú-'äÿEá‹ø×™o8!NìÿùØ?Ð.Ûñßý·[ä8uó#‹ò6_ðüü‡óç×kŸßÍ0°Þ>±ÿá^¹þ¿½ó†ñºÏÇÿpî€ q¾1Ì*-æ ýùư_ñÙ§›åŸÿçËöqíÿ²ÿ-/û?ÿ/¶ åÄ÷Ÿšá …ddSf6[$‰žðþƒáR“mj¶J¶bÐ*ÚÏëþûßÍÿU÷ßÿn>€Ø†ý°jyœí_þS†ôê¿bü'ÝýΦÿ¹˜·ØÜéqÇ7> @@VPúoà]oìå­uóú‹¯UBpAFÀF”d—chhˆT*Õ,“J¥"›Í.:'ÿ/¬,rtH§}g¼lvñné·uâVAN‹Èi;3ÿCÊÎxØo‘øßι¸º_FÔ|ç«…Ÿå´¿hÙÿ¯:¸–T®…‡º]RSÕ¦ø¿<à¼ÿÈRH9)G Ÿ’°è¸E›|J"+{‹Äÿ³™ý(S¾sM8Ô=”§ýÝÚ5;AKxqTÃ…)Ÿ’˜Ù‹Õ¡Ñ–ñùH‘ó bˆlŠ‚»è8<7Ñ~ ‘¸à¿¦¸à¯PwÑñÉOüá¯lódÓŒé1czÇkSÝáÓ¾ÁFl Ž@Á‰aYA%B¢C\ö‰ÿbQô¿wÝs([:1©î¸/xÌYÞ1ŒF ‰mr×…JÝ–g~éAºCíÍ2­(ûJÌ™%Z‹¯ ÅÿK¥h å˜: Sw¨ñêô¢c?k_A9àréÆ?§$ë„˪éR’ut·Âgßã¿Ï.[8f ÏñØÅúÍgáç‹¶†D9”Bçû»<1G*ûNQàÿñÀy]{‚$:†')9\÷¸ÃíÓ›»d&E‰Ó½ »$…wï©1rÔ¼ÈòØUw‚|í:—î|–ÎDŠžÕ݈a¥ùêên§ÃËr÷”ÿý\„V{¯'¦ž @JÝHÖôw°Éš{š¯”º‘¡ò—Éš{šâ}»þRêÇìzÇ2O.   pË_eË%6BŒéÎqZõ®ÿ÷'ùΣ³llocbÂã¬î8¿|Ì庿ahx±gë…½ Í¿û—uzôŸÝ†`Tñb-ѹ"LG-Â=ûßÿ.Š04lrÞ;þˆœúÃEüòš«É‡Ïdî©'ñK±²¢ÿ¼E|áÙ»I \Øü»ÁGýþE²†ÀŠ—áGžÂlÙøVôŸÇÆ /bpçvÖ¤8-bqxÈáÚ›ÿ‘ô±ã®80&pÉ…I¾·ÝàÌ·ÝÌ…^¸ˆ¿cÇŽæ±;vpÞƒþî8¯¾üL„â‡Ù²µŸ›ÿäßX¶ñu€8à /$S©Tš;Ó+Šý—˲¡¹{}Ã1hÙ³ßaÝy!Rçwcÿû˜hÝrRõ Ã`rr’¾¾¾Sâo˜¾ŸÓ^¤ï ­ˆßüÃáÓ_PþyÆã¬~¥DçqR÷>Ë“BïIó§§§‰‡4âÉ---ìÙ³׳pªURé4{÷îÅÃC<:zú‰D¢¬ìí!ޤ 5b‰±DYC/Ô"tttP,™›¥»­t*A¶Ã¨äéìí'W(TTª¦ÆÇ‰ÄâÇá?‡‡,‹´t.;НþJ~.›¥#]ßq¶Å¨ŽáÏNM…H§ÓìÙó4.NµF*âé½{qñU’­=D¢1ú{zPÃQYE ‰%RÄ“-(øü€¦££ƒB¡@©X$×ù9ÌJξ~²ù<¡ F¥R澇«\úšn.>?É—¿=‚çÚüè™¶¶VžÝ¿¿iÿT[7‚(³¼«“H"}ŒýÊ• çlI³i}•;p™£§½£iÿlfŽ/þ]”¯Ý™'•HR«U¹óGY.:§×½*·ïšÂ² |D¡¥%Íþ:_–E­](J€e]]„ãÉcíÔô¯83Á¦õU~ð Ydÿr©Èç>®ñí{+Ä¢1*•2;­qþ¶çm ðƒŠÔô ?~T%‘L°ÿ™gšö§»†Â,ëìB‹Æ±¿ä¹–ÉÙë#lZ_垟ˆŒ ‘ŠÅšö·LƒÏü¥Êw·DÂ*•2–gÒŸ`i›ßam®·¸¢º%‰yÇÓd^qÓ“%J×…&ÚT·$‰Nä˜8«ŸZ=B£yÇÓ{ÖPÝ’$2:&_¿| sSë›õGÎè§V hÞ±ýò ÌM½¢ž?Ǩ¸ gRæ´Gî¦uìÀ‚ó[MÜ“êç·“Ì+.`zrŽÒuç ‰F³þÄY§-j¿Ø³uÁùÈ­×àŽ_qÅÉ9Š×ƒZ¯š˜cî¬Ó ¡ñŽTÔ×&Çæ_¾JýüCs̉›`R¦÷‘»‰/8ÿbïj4O"—Üô²ý_DûÕžé ü劎 ûÏ2VÐûz wº‚b™Nw%(àDe¢Š‡ b.cËÞ\;è;š»QÉ0£îD/†|±3 D1Ã2bÕ¢Tp&ʱÎtÚ£Xf 7ª ;†íA¸A­ "V D4,áFŒ©59†iÚ8ÝqDÁÃÊH¦åOîL”!ƒ| !š@QE¬°ŒXЃdŠ8±$vÍÄ]–hÖ—;Æ+A4™"n †p£2aEÁІ°±¥¨ŸßÁ5cM¾EL5—A±k(ª5ÒP4DG Í4†®‹Ç©V+ضƒ^Ó±l˶±lÿžЂȒÄìì²(¡( …BH4B(¤%¦§Çwæw\—îÎnßÉ<¨115Åì¬/d‹D#¤âI4-à/Œ¼¤ùÙlö%Ýÿ›ðö±lÏõÐ 6–X¯J9ï"àï 9d"vŶu=I”¨æMŸwÝà GïiÝX‰Š×§·ßpÙmÛHíÜI€¾ð? ¼V€B=ÐiýóBF6›åSƒƒ|C¸np³3îü¼‰ø[êï_z)…âõ²A ³ ÀÏ£¥~¼ñy!£Áù¹£Ð¿bÉd’™ÙY,Ëâõ]„nŒ9BPÓšB¯±±1ŠÅ"Š¢°ÿ~V­\‰nøÑÆR©Î8ƒl.Ç/~ñ zzzèééatt´ ´‘ªÕ*–eÑÓÝMKKK“ß4ŽŽ‹Å)UUutt”žžžf›@€•+WR(ä<@:&N355½$ ½½d"A±¾»mÛ6t½F&ã¯AƒATUEUU‚Áà’|]¯Q­Timm=!¿‘B¡–e5û»ÐFëÖ­Ã4Ïó7à Ͻá4jšf3¿á‰Dš‚`ð,d4¸£££l<óL:::;r˲èëëk:ž6’¢øbT¥±kš  (Êüy‚¿[^­¦cÛ6©dMÓ¨éþZe*™\İ,‹5kV355ÅÊþ~RÉ$333X–uBãû›Ëd0 ƒ`Ð>àÿV˜?禡(JóXHÓ1œ\.wJã“6ÍŠõ1ªI›î‰ÃzôÿÔ úN !tØ´åsÓ/èø_/OеZÅm5è¯0T Òø͹ۚ;”I’Ô¼G¸®ËÜÜÕj•r¹Œ¢(‚ÀØØ“““X–…ëº  ë:†apøðáæ¸mìÛpŒ¶, Çq(—Ë„Ãa˜œœdÙ²eKò=Ï{^|˲š»Ô6>»®{B¾,ËÇí¿,ˈ¢øk狉ZSønÛ6žç5¿']×A0±Ý2m])ºz:) ¦Æ‹ÔŠ*Ŭ@Õ(P,TI&’$’a*µ,¢äN'‘D£V#‰N§QÕ@=¸‚Õ TP.—^Òü¶ž8ÑhMÓ¨(äX_€P§DaXäÿ¼¡…ûtp+6'ÅÔ°U•‰m2¨V8wUˆÉÉ)-á"á"÷Îö0T‘ìqiˆh ´‹8qýi ‰"¡µ Š¢Ÿ?$Ôù6^Å!⤘Ò1+±ÍÕC ~–DÂ:a{g“ U5R½Þsà‹u¾BE)!·@¬O$Ô)‘¯óïû‘Wõùj˜‰øf›Ê!©Î/‘ˆÁ@Øa ìpï¬ÊPU"Ýmá:ßÉ»èOSçCh­DKKËqû/$L¬9{NBŸv‰8)‚¿Ì±â+ùþÝ%ÖµVÇ™={ËbÀ`j·ÀÜ>Å–ø£6‹ äñdoø¤í|~ž3ÞÕÍí÷ÔXß@+g˜õØ[Vƒ&“»`vŸjKüq»M@òx²'tÒöŸç ‹øW§* ¼=Á÷î7Y× X©0=é²· !M&ó˜}ÆBu$nê‚  OtKKÚ?^•±(W}q{¹Å"T ™R^GôTtÃ&¤…qI·t±líéÌeKÈF]7±] ×Qš€¿ã½^ö}$c1e¨T Vó…ò²žj½È|ŽÃ(åDtBAêü5Ìe³ÈF]¯a»œ?½¹õ„ão|Òcãë|Ÿ­Ñ‘ Í`<¥0©”Û]Œ§gXüÖª6zSa†brퟋl|Ë=·IÌÌɬÝ:¥ë0™w8­É¯‹ÿŸ‚)Åvš"üM«t¦d¦~âp埻œö:—‡¾¹i•¯ˆœÒõGH˜äà ße„Ñ‘ºøÿ)È),â÷¯‚d r?×þ¹_çñÿ€ò$ô£òõ'Pêàšk®i>Ó|ík_㡇¢P(°lÙ²¦þꫯfÆ |ö³ŸåöÛoçšk®á;ŸÝN¤Öƒzzá”íÑ{¹êª«NŠÛm·qÕUWqïWNÒ^00wÊöO:ý\qÅ'Å¿õÖ[¹âŠ+øÙ÷öÒ&ôc/Ÿüµ^ÿÇáºeÚ/YŒ“œ›æŽqÊ>Çq°BUôAsVx^÷ßñÿpy…ŽKÛ#£y¾7}ªü“¿þ;ŽÃŸ¬°h¿4†¬pûTöQçèƒRÿë¿ÿ:Žƒ²Ò@.kTÆ=B] Žã¾ öÿõñOÍþÊJ ¹¬Rwu 8Ž÷²ýÿÚÿwä8WDu¡(z„Zž6`0£³B Å"¡I„5Oô¨:"XÉ€BJÀñP<…iÝ"– ‡="à <SòÈ—% Ó#äÈ%ÏM‘p½êo0ßb…¦‡ïþZøòEoǶýßc‘h”r©Ä@}óžÞ>¦&ljœ 9jõ9ÎP0ˆ(J 9J•2ž áÙ&©T½Z¡fÍœ¦åÏÍ%b1A ÃÐ1 Q”0 R¥ú’滂ˆ¦iT«~×u›óŽã`Û6–e‘N§)•JhšF$¡V«áº.Š¢4ƒî7’ªªÍyI’ü`þ’­+ T*\×EÊåòKšŸÌì% ©Š€k©ˆ¶€ézUƒ+w.ÿ|süB~{í£¨™*35ò™ÎCÐ-p壟<¦üýs—òö®û©Ù®`áTLtáPÖñ]¯—í³·ÓÞ÷2—ñæ.É¿ö™/Sþ'å7sEê®ãò«•òqù7fî8¦½ûjoç íw/É¿qæûÇ”ÿ¥ûN. ~ë¸ü»»>q\ÿÃáÅcÚ³ZÏí\Òÿpö+S~r¤Œ´·xJþ‡3wŽÓÞŒ¨ÑæêÇõ?<:å&lìÇ&OÉÿ°ú“cû_ÍJÐÒ¶´ÿáŸ]º¼ÕuJþŸ/ÛÿŵÿËþ·/û?ÿo·ÿƒ÷÷þã!c:– ­ìÑâIÈá$VD]òþ#Šž }¹MÖ©¢xa:ãA$Ç=¥ûï Á?Ñý÷…àÏÕ;‘GoA í´øøÿ½†{¿þwìyâG¼å²KøÖ÷ïÅs=¼€Ì?~êÓœ{ÑxÃëßÀ¥W¼‘®y·}û`9x¢ïˆrP8‹¹i“o}bïùË9ãì ùáîfzìòc»Ðϸq‘ÿ¹Ý~#Ûÿ! ßøçüó__Ã]_ù3ví|ß~Û›øæ×¾ƒàúó Ÿþ×Ïñš×_ÎßøF®|Ë›øã÷¿ÿú¸®ò63;]å®ÙÊ®}+gn{wÿûL|”ÒØO©qã"ÿs«õ†þ;Ê´nþC>ùñ÷p×WÿŒÝ»~Ä;Þ|9_ÿÎ]þDµ(óéÏ|Žó/¾”K/¹Œ7½åJþø}Wñ_»ÃÏW$ðd†ÜMÌNWøÁ§·ñkßÊæÍçs÷]w0=úù©ŸS[q¢#PúÆ_sÓxS3@©¢T -)ô®âðw&¹çÉ_)œÿUiäàÈ)·ñàƒS7™L.)þ_ÑßßÌkˆþï+úûy.ia°€d2É/ùËcÄþEð…LJ††Xµj©Têÿ”J¥Žÿ/l·Q·Ñ–tip‘pa€FZxLÔDMÀÕ½E‚~;ã!§Ef6«F69G69Ǭ¢‘šª6Ëol%5Uåõ߬Ô‚¤¿­¬ì!ÆdÄØüâ}Vö°Ì‹þá¼–(ª%3ÇêÐè²–#÷ÉÊ^³­cú/{”§§šeŘÌáfû7Dú lz<™â1"þ ¡º°¹`©TÄkÖm´õì'~ɲ'“úËrêüà£Å×´T€Âõ:סP·Y\ö°\Ëïc\öןtÏA÷$<,AJÝÐ ÐH«"ïb¨üåæß3æMÑ¿ ‹ý0`©$óä¢`6pD¸ŸÞj…Më:ébLLx¸­.ì5øE¥Êéç×8²+Âõÿþ$zÇÙËáìå4Eÿwð{§;¼jM¿UøŽÉBqŽ]»¼f€ÿ(ÆÅ«0[6ðìw,âß·ç„gï^Ä/¯¹šÑ{?B~h;ù¡íMÑã ?´ït‡µ îs©€G*àÛcß Í7ìDyj³eŸøÒÞüjpgñŒÉg¿±;vp`^·Þã«·U¹â¦à£ý(;vìX$ú_`ÇŽ´Ë5Þúæîf¿±=°=„âßüþT3À€½'~€-¯{ÓÓÓMúÂì"ö†“¥çyÍc+ï`ù{W ÆY*gT}€±±1Ö®]{JüÙ_pÚÕˆQ…ÒÞÏØë_Pþ«¬gé[!"SÝ_`W©ÿ¤ùããã¬9ítö?ý8½ËúÙ²e “G“Ëæ¡³½Y “Ëf)–ËlÜ´‰B¥ÊìôÅbt"‰ëØÈ‚@_o/ããS¤ZZ(‹ ÓÙÕgÈÁ ®eà"%˜™>„i8$âQª–ÃýOÒÕ³l1ÿÐ<¿X(P©Õ8cÆy~áø|]×¥³«ѳ×2—ä.Œ =C[G7[¶labì¹L–áC#t´w hªå2†e²nÝ: •*3S‡)ò´$ë|Q ¯¯#ãS¤[Zð<#GŽÐÙÕ*‚+8–‰‡H4ž`vú°ÏOÆe•ÿúa†·^$sÍ[T¾qg Ďк IDATK×[dÿrµÆÿ&È]?(f) „µ¥Rè_±‚‘C‡¹ìµÄÂy¾}w…TºÏ6p%½VÅ0®¼(Èwï+ ©dŒB©ÂÝ?.sÅù¿s¹À÷¶{T‹E9´ÈþºiñÙ¿”¹ûg…Ü4ÅBh8BµZAV,_Α‰I.yí*bá<ß½ß ‘L!z6žèïêd»pÙk¾¿½Šm9$QJUZ\ò*“·]lsïCrs³<¼ØþŽçò¯?|T!;7A¡'‹c"°|ù2¦ffyýy+ˆ…óÜõ#—X<*‚#¸Ž‹ Ê\ržÀèè5ƒD2ÆÈÈ&Äî6b=`õ¬åÙ)™èÖ™_N _¾¦9yÒï}“d×rfس¦9™ÒȻۚ9ÓrÕ-Écêg¦üçúFýü§w"m}%ýÞêù½õ|2Ƽc'bw/±ž:¿ôË74'Wõgî£Ø³µY¿‘ïŸ_os"gZ>ê–$ö§…­¯¤ÍûZ×rªwŽù“,õÉ”æä @wos"¥X¯ßÈoÖ¯Ÿ³þ;¡»—`ýü§¦dÔ­)ª¿¡zùÔzÙþ/¢ýÛ†g  " ¸º+"Ǭ’Û¨ ¦"„¤YÔ57F-ךù–¢á9@@%\( ¦Ä*¸ˆ…јF’‚بH¢€T¬a¥4jÃ9„X Í›@±_PàÕÅô^¦ˆÒP¼pK‘Q’ ’eúbû‰¦%h#‚˜'Å+ᵄ›Á<9@¸šE³tÜ@+,cg Ga) áåLÜ@æJ¸-a/#$ã²€ qò¨ŽŽŒâFe˜(cÊdǯïšþ3y#™"‚ˆ<®ÂòD䄊h˜˜©çŸ#ââÑÕщaZ‹vè i}½}ƒAŠÅ<¦i¢…4<×£Z«Ò4LËdvn†™¹9Jå§­Y‹*G&&˜šš"“É4Û,‹¤’IdYöY‚ð’æÇ‰—tÿ_lþÜO®ëÄzUô‚M¼WÅ(¸¨Q§ì" "Á¸ŒYœ¯ˆ‚ž$À*y$ûTÊã6‘n™Ò‹X¯  ˜uH/ LÈÈ0ŠN³¾$ Tªz:RäŠUºZTŠ›®´B¹êÖDLÝ#–Q‘ZÅFSrµúÂ}H"“(×\–µ¨Lem:R2FÍ#“‘‚ÍòÖŠ""H¶å¡Û¾¿#,“+UY–J1[­2QÉ6«Â 9Ë%! ä,—NY& ˆÌ6A`º.:kEÚ5™œí²*¬0\µé×d*†K‡&¡80f: DTŠˆ$x˜¶GÅóE‘Q¤`Ût&¢Xx$ÓÈTlA@ lYtTH%"˸¶‡ zL›¼EÛ¡â:®HL©º…ªëyDd© ®ë! "¦í`9"YÛÃÃ#(z”jÖo Ÿ|wß=ŠïRq= W8ŠO/Õù¦íb9.Â>„¢‰ßÀþ¿ØüÎþñXP%qÉþ—u‡DÀ%$8¨ž‰ã Ž‹n 88ž‡,ƒ*¨ºÂ ûçâáa¹`;AÙÂq=t×C—¶ÕôhHÄU‘ˆ" ˆ2† †³€/ºx¶@Åá„|ID ÛLj<jŽ‹,°¤ýuº’-•THE(X¢€éŠ>]£jQ¶OlETÛWI„$¾þ‹ò™!Êg†¸zY+wŒÑz©@~2Ä-ç¼—£S#€q#e³Y.U:¾:Çß¼â½Ü»[æÞÝ2?WÎ`xx˜«—ÕX¾9Ãù_Í#ß}h+.P6/漯F~2Ämç¼·)¶_ø:šõ²Õ[ç¸åœ÷òÔxO÷‘MÍðð0µÞã¢ó*Kòo?0Hë¶¹‘Ñ‘­©gÿ|–Õ›Cô|»Ìön8!¿@ ¡L²ò›oÝpÃ1üþb–uç¥Ø²}Œ×g2Ü· ó§ùDyþÞüB†2‹DûIÉ}ìýó¾˜lmžËç¸*›ihرe™ËsUÖo¿‘ß`| à_3“iŠú¯Êú6jˆöWëBþo-„p{Ë<ÿ>AàìL¦ `g=0À®­ÛøD.ÏÙõgG1^Q?ng³MQÿÙ™ gg2K ù‚ÿƒ«Wspõêfþc@ÿ‚õ°Ã—\Ò,wŸ 4óŽfÄêÇåß:Ÿp8L8¦§§hkkC7 \wñ:øs† Scg¢Ùº°zbr’‰ÉIt]'“ÉÐÓÓC"÷ƒ<Åbd²Ù¦»Å V¯YC,[Äïëímhˆí¾Žæ÷ôô0~ä®ëR(( ‚@&“aÕª:;:–ä÷twÓÑÙA0@Q•zp Á_cÌdH$'ä7žUÃá…B‘X,v _ j´µ·cÛ6‘H„J¥Ò<ïöövÖ¯_ßl¯!_(Úo¯óù<º®£ë:hžËÄÄmmmÍÀº®³gÏÚÚÚ€ù F#hB$nŠú;::èèèhŠö5-H¬îœoÛ `Û6###MþÜÜñx|>@€¢4<ýôÓÄë;iš¶ˆOÄ›çÕ¥§’IRÉä’Bþ†à¿\.7‹r¹Ü¢uõB¡Ð,733ÓÌ;šÑ°nݺSÿ¿•6H½"ë *./èøßš¨Ò¾%Ž«ª2?ÝWyAÇÿY±*±u ‚*BÎá±ÃÂ)ÿJi®9B¡ãããÌÎ΢( ½½½ˆ¢HµZ¥P(P«Õ¨V«È²L2™D’$úúú(•J9rÓ4 …BƒAòù<…BÓ4©Õjär9r¹–e5Ç`¹\fÿþýÍ1ûßÁ7 ]×Éårdë¶ooo§³³ó¸ü™™TU¥··A–ä7,[¶ŒR©ÄØØ–e4?Øæßlkµžç¡ª*ŽãP,ýàzIVI¤b´¶Çè[ÞF,&y5“‰qƒö¶vÖô‰ vEQÕ ÕªçØ„Ãa$I¢Rñƒ4œ×}‡÷—6ߪ¡k_8dYHcQ쌄©R=¤rîª U‰nÒ™~ÜÄ?4T%µF¢xPhšÂ€H›Ž¶ÊæÐý"¹P<(Q=¤ÒÙÀ[n!äe*:¥ÑÊqù•üØ&©Ý4ùé52Åa¡Àçû€h»¶Êfô>Ü GqX¤rH¥«7xßD×tDz@ Ôù&•Qiž¿Ùar—3Ï_+Q¦Àçû€X‡‰¶Êaä‡ÙA°HeT¢«WÅ[n#ä*.bN8nÿA`îI™Ð†2J‹‡©•ù€PåÕ—§ÑÖÄøþʬë Ëä0 Ï€‘‰‹[0.òÔTœ÷.+ó×rcŸ‹\TˆFCÏÙþ‚ 0»GZÄÿ¨óŠ‹£$V…¹ýÞë;ä2%t]Ëãà´ÈÅ­9Â:OMj¼oy…¿–B'àßþ‚3Oˆ„Ï´PZÀÔj|X±Ù|HtEïÝo±®S%7WC·$Ócx .n5;<9)ñþ~›¿@¨ó%¢Ñà"û‡Pi07 – µ2T‹JÑu“îT'ÅjH(„ízd U†OIÄxvð -±U£‚dEËW€r‚A_)¼­&P€t:ýºÿóñû?ÿðO!°à 7êh—ñW¿þÁÿ¦ßDŒÚ(ÕÐûRñ¡,‘µ?Ü(ò‰OûÁ‚Ó?”'Ù)PUç-òE¾E äŸÆ?zùyV#z²EªG'Õî#s@&RóÆåÿèñ__þûŸ©>Í!Õã0±[$Õ){;ÿÿ¿Ëÿ ÍQ"ºD@pü6IË!-¤a’LÛh–DT‘Y CØ1óiS@Ï øM™€ ¦.`Ø"Ç¢Ê#ãWDS@‘Ýg}VF$ž‘È^DĬDÁÍ+ ÉÙ¿`>h–øgå›ç\N:•rg«w  âÓ4Bá(~¿˲I&&O$H§R¨>M+‹Ùs…²¬ Êšæ%JºByÇ¿³ð@ùýèøØ[šäÞË(MU:gÛ¶]6åóx<øý~z{{Y²dIùþ’(Šhš†mÛbø’ ¢$IƒA8@SS©T Ó4EUU±m›\.÷–æGÇ_%óâälš y“pHäÒçn›uﳿh?ƒ4<ƒ?cRPؼ癯ÏÛþWñÁ¥Oƒa㈠JIFVE2éÜœü«v~Þñ:pûmÿƒÛ¾;oûGÆßÍU 7ÌÉO&Òsò?>ðÀ¼ãývô2.ó>TÁÿLï/æmÿTîý\}`NþÓÝ—ÎYØùÔžyÇ+‰Ê§×Nlœ->/E¡P`eËóG\8_Œˆ^œþÞŠúBkóü|pk¨þp1y9ÆGÁh¨¨?dï×V¿rDõŸoçÿÍÍÿÛõ·o×?¿òÿ×ã?Ÿóücl¼é’¢Ì[ø²ËF„ÈæÒ¨¶Xqþ jÍXȶC}.O`Ÿ€ÖÁÑMlÙ" ªGtþ}£øóß(þ6ë¯ÊõçBzïºú+lö66<ö8u)…µ§r÷w¾€„ÁÍ·›sϽG–ð8¢G"Ÿ2é58åô ¹áßË{/¿„‡|„ãOºÿ¿|¶‰”%ñͯ}‚S/ý}ûž‡coœ»þ<½‹÷|èv¶=öE~óë_S·î‹45œÆ·nÿ,‚dqû·¿Ïù]†¨ˆxDA“)¤tö™œuÖÙ|êú«yßïæ¾Ãê•ïàO|Ÿnª'eÊüû—>ÁÉ—á=Ñš>:wýyf'ï½ú«lyòV{è×Ô½ó ,ª;os=‚·ûn.^·Á±Q=î³ßBÒ sÈàŒ³ÎáS×_Í_¿÷Jî»ÿaÖ¬<‡çžøwþ÷©¤ ‰¯ù:N¿üKô¶ÿyÕ'Êõç©÷üeƒ9R©ýsŠôK100@*•"•J´Ýt€††R© s¶îÒþzãÿÅ@àé§Ÿ&>9Y1F©èkúgs™L/+Dj]¦” €9 Z[[)ñ?¸3Ç”þsTUUUÌr³aÃ6oÞ\Ѿd.P2( ÷g”„úÚ2 9&–_j£Tn[2(…©5\Óˆ|»… ív‹V켃w¨NäØ¿º†«îE‡x•D•%”ÅþvÒ¬0XæQ©ö+åWƒêe,kI¨ ÷á$«Ë}¦¼6š¥Ú¯ðÚh1$“bì 9 FϵnNæ2htdú“¤`ÓèÈ4 aA¤ ¡Ü®$þ/3Ý ×± "½ŽEŸ`V0’‚ÍàÍŸšõ7œ/^I[åÙÕ§‹ù§‹ÿ¡Ò`U@bDwX˜1…P1×çAñ‰® @I쯊R… ÀþŒNù5 ÛÔ¨"º`aÛ"¶h—ûL7Xá—3VøÝe!IE¶$|‚LÖ19óž—Ñ­, }uå>czŠTaŒÕQwŸß<¶³ü Æd¡¯®,æ/ÅÌqÀ5¨ñÙ“`LO•ú³ÃeQòðë=&—­öTd þ´ªÛ(‘…\qæBV-ޱ¬­–^*³ñOÅQ‹F†*q\suù÷_>×Î ït¸í‘~üiÇÒ+ÌFvÿˆ-‚À;ë"œßÜH÷¤Å7ú ln>6Ì„”æ=7æÆæFÞ©âÒåU¼Ë3Î Wþßm8¿Áää6wk$Çŵów ‚|ìÀ>›mÅ>÷¸¬^äÕÁu˜P6¨RW—MJâ/Íkx%mar<&ÇÓ8‘ }GÙ  ôr Ž/¯“ƽ˜ƽPl[úY2x¹[`ÝòǯhpÇwâ¼Ü-ðïW¶‘î óø‹»øôWª¹v]ï{ïB.]WÏ»Ö,à‡ UlÿËÝ—,heíZÑÿ—v-QYÿµíŒL— ~óx–ËN¬C¯>žHÛ:„¾me~}ã¿i[ÇùeþñgmãÚumœ{ÚÎ=mUúnºõã*ø‘¶u(»º9ö˜©Ï>xW'Wžå+ßÚÁÈäpÙ0  Ÿ‰:¾ ½úxÖ­[Ç–æ¯>†í¯ ñ×»uëÖ±xôIú“/Œ ´™ùÍžÀ-ÿÜÀÿ±ž]ÿ=¶®‚¿nÝ:v>¿‰÷ÿ½[T)$ÇPV?Ïõï zç:Ʀ "më8°ý)Ž=ó FFF0MUU‘e¹<³’eYX–…®ëeÍ’ÈýXm;uç5±¨Lü7/1Ywâa÷w‡¡¡!ššš^Mä5/ª¼”ÑŸÞÅ`xÅÆ?cÁêÎ !l<õO}tªMGÌokkã(Ä“i Ã@”U¶îÜŠƒB>—A“eê6‘M'Ùµc;X&ÉT†‘‘r™Šæç@Ï~ºzú1¯ÇqÊΧ¶ž'c8ÃUH–ÍÐp?ª¤Ñ××îW_¡nAE!•):ªz¼ìؽAô`üO™ÿê+»pÈdÝâN½Eó‡èë獵Ç6ñ‚³øy[$RUƒŠÀÈè>ŸÁÁ~^Ý»§ÌÏ DQÄë²{ïnÕc[„ü¾2ïžWQ%‘‚n’ˆ'°L@¸ŠÁ¡>ú‡F‘‡P8RÁ·ô<¦¨R][W–™˜#è1:2ÌÞŽvZ–¶aò¬9áÚNz€ó֜οÁ²ÝÙÄDÇ¡¾iéT‚Ÿ=4Ž$8¤ÓYÆÆÆÉås|ÿ«^~t_?ݽýØ–É?¼/íˆ<ú;wæ^7ÿ6?¾%ÄÃOxä©<>þ>v½ú êbèyŽ_y5m'=ÀÙÇ­eÃsiQ&_pg‡\иˆL*Á/M ‹Íˆ'˜–Íw¿(qï¯Gééàÿ\9Žíˆ<ñœXοŽÄ÷¿æãñgݤãÓ¼  ”óoêyŽ]þ~ÚNz€ÓV¬æ÷[T˶Ñd™MdR î<"‰èºI&“E”dþóó÷=ž¤opI–¸ê]ÃØŽÈS/º×–žÅË÷¾¬°ñ‰ÇŸ1ñy4ÆFGØÛÑŽsÙí4Û8,d`m ‹IÓ-¶àôb¾<ŠtÊÊŠåŽèt·Ô§yd |óe.GýáÝåþ]âÙÄ…h¹ÝøikÑÞyÂI4ÛÛèßE\¨/ß ?íô‡Ý›3Íö¶"‹‰Ó-žˆÓß[v¾Ü—×oŒ‘GzË7_ærpÔÞ 'œDu±ÿØÚPì_]?Fö‘ÞòÍ—¹yx3œrÕö6FÅw‘ê§nМvAÅòÒøÕÄ]WÆþ^xyÿº3ÞÎÿ›˜ÿƵuhNAÒ0¢^4lò‚'e „üD}ŠêÅŽù$WÀ_S%Ì“—ÜB~ß„+ü/…¡i8c®ø_srä…¦ àK$ðÙ:f8ˆ”Ìa†|xœ4¹KöàOŽ£r¡(Îx‚a¢þ,²ªáÄ‚øDC P, ãyrbŽåAú@p×Ç«èã…²øßŸpÇE14r2ò!“F5̨¿Ü_ñØc…ðú%ùI4'¾X}0ANô£F·bبx’ãÈ…V(êŠÿƒaÒ€#èCÆ5z¥`ÒºbQPd…X4†êQðxTü~?Í‹š©®Š‘H&ˆ„"8˜–E&“ÁWt"WdC70tÃ4H§ÓLÆ'Ù Û-¸Ÿ1“äi'Ÿ‚ªªìmo'“M“L$ßÒ|á-½ýo6?õÒvÔj›DoI”0RŽã §l‚ Ô H¼'ï>˜ÝëÖ’Y@>i!ˆ¹¸Ap¡BfÀBEò ‹p“#e’O˜(T¿Qî_º]’Hg©Šðª&c:ÕAÛ‚œn“Î;,¨’‘dè-óËÄó¯H4,cè6¦aS° ‘6XP%cèñœM*k +䳩¬…Oƒ¡ “‚¯ˆO™ÈZŒårÔƒ„ƒŽ´Nƒ¢`ÚiÛfÒ´iñÊ(t¤ ÔË2#ŽC Pç•)6ºéÆò-^™œ#ŽÃ„ᚌëãºEXèÌ™d:A Š ¿œ²¸?’(báæÞ«©@Ö›€"Œ¼_ó ccÚ¢$": Rò“Ìäñúdj5Urÿ¯¼¶MµOf"oaÊ"y DQ ,AÚ€Z¯øÈWŠ|gßį©E¾û Ct„|i¾) ³ø«/ø Üþ7›ÿÆå¿!À/H‚ƒ$È‚‰&ƒ$˜€…WÔ1MplÇ-PDÇÁ6lY@Sò–—h(tÈí·d ``9ŠKDSEÂPdš¯„Geˆ6¢ `˜îÌI‚ã¸f ’€*ÚLfÂÀ¡ó/ŠøUË\Á¿-â÷*Ä|2^LÀë¾"A¯‚æ‘© «ˆ²;²iù8؆ËW“Á±¿ÿuíÿk—Øh‹}4.¬Çç—P{ÇèÑýåvîýÿÄEþuõ(š„w0΋ñ7lÿ?aaž`«F,EÖDª& þØ?âý?òÐÛÛËÀÀ@Ù8"‹áóùhjjBÓ4A`dd˲hjj¢­­h4Zþ_/šCøý~jkkÑ4l6K&“A–e‚Á`¹¸ZQjjjÜ'3²ÙìAùQß¾,˘¦IuuuÅöÏÇ/ƒÆÇÇÑu}?N—gØTUQ‘e¹‚_³Ô‹×ëulE‘êêjB¡PÙÌ@“8R’EK«ÔŒ&ñˆQúx´(‘L~Ó‰Só£¨2ÉD]Á6q‡‰‰ 2™,š¦¡(JyÝ£Ñð[šV|ø ‰îB•…Ì#$<$z ì‚+À$ÚÙõZ57]\ÍÖ-ÛÙ— !éONtïóºÇÁº³sLîñ’éQ¸éâêòû²!<Çe\QfÔÆ‰‹(²4/ßÊ—øýì|-Täw°/ëEÖrIÊÝí0V2y9'ÏÄ«éò4~?û²Þ9ø~ÃO¢»€PVÐBHH$z,¬¼TìgçµÈ`_VB6r‰)€î~“Ü‹»úwèŒïVI¦ñãìËJhÇÐ4¹È‡êXÕ¼ÛŸ|ÍÏMW³ñ ­©€ÏçcàUgã^®<ßïŸÈ²²Î5ðÇj³qjäDÙˆá¡+x|î½`â´è‡ÿÄ7]\Í“O[x›Üý±o·Ã “ï{‡ÂýOXUç«Db¹ 5r¾lÄðë+“¨‡äÏŸÿø«j‘_À»ÈÂçSè{Åæ ï=[â¡M†ËŸÈ ÔäMj$«lÄðè_é¨^x`;E¾ƒÓbVäAPA!°upÈ ˆ466²¨¾ÙãN²Qšñß IDATUUCαÉè9z{‡ðƒ4VkVM“1,QðÌZèY/‰ “pÔØ[Åɉr)0s 8`«Æ›Ì§È§È‡°@ ±qa‘¯Mñ홂Ioÿ8¾€TäçÐ40,HfAÏB"áÐÁùÞ†¹÷ÿí}6¼Åล^é,Ð7‘áôÖZνT`û‹&Öˆû¿vö™ÕD¢î5[$jòJg¹ÎÆ‘ðg¸ï»|,P„#ÚÿÛ» ¼ç“KáµNš°8±ÕÃé—Z®¸¤xt¦‡HÔ*ò-^ëÄçÇßw‰Ä4éˆöÿ¾v‹óo%K]€É hi…/-Šû‹ü–3]ñ¿ËwÛÎæCÈ7÷þ?ßñ§Ú87²zõjvìØÁ®]»¸ú꫹òÊ+yä‘GèéqŸ5~þóŸGÝZ8QÙ±c‹/¦§§‡³Ï>›Å‹³sçN²úÐå‘r:÷ßÿQá···“ÈôQþ—‡ÏãG?úÑQá8p€±xçå?ÑcP€YÐÛ%ñŸ¯få)Q:îËrÓÿ†øÝc#ì~e’µ×«\ø~{ïr 5’ã&¡*O­@bkœ©[ÒóíóÿçãïøE–o=`Ócqv=’áÊ[<\þ^ƒÿùþl~|kœ(/ÏËŸÿøïòà …Á­f™ÿ½i~þ„ŸKÏNðƒ»rÜÿŒÂ__dò_?°ÈÄmâ£:‘jµÈÏp ›3G¶ÿlû_üy–÷}ÚÏK?³pt»YáÔ‹Lž¹öönIàLˆ¯ëüûÆð<ÿÏß›æ}ŸöóâOu̼Pæÿî—³ó?º%ƒ31ÿù÷íü¿¹ùÿpSÍðäEtÙ¡§ €,°w,Os@%ªÈˆ‰ ^C¤€@&/×m|¦L@Å#RƒrðûÕAÐÁcŠdóÈ;øL™]ÀR%ÑAR³hŽ€7/Rø‹â[4Ä?;Ÿw¾×½7Vœ©¾¾h˜ÙØ´ˆÑÑQ’ ÷~o®PpïŸÍ!€7MŸ¦•gµ/µ- àuCÇ ôû)òŒ'HÅ Ã&‹&…oU>’Œªªäóy<Oy&ûRݨªªƒA†‡‡ijj"“É”î¥É¥lÛ.O.Uê_Çg2<’$•ïçùýþ²h>—˽¥ù5ã{H¦ò¨Že™ä 6÷õ\ÈÁâgçráI/czDÞ÷ÔMm pEÝ"õ“DëM’qX62ùlnNþÃÃï>èx÷_Ä;VþÓ#ò¡?ÍoVPŠ‹#ÍÉϤÒsò7¦ÞÐñϽ‡“—<‰éYßõãCòÏQ6'ÿ÷'Ý6gýa®söìïÓ£P(”g–?˜ø¼ù¥—Qýáˆè=䘥úÃC‰ÏVØyDõ‡Œ|ÀñQx¾ûÐâóbx«QýçÛùsóÿvýíÛõÏo…ü_µä™9Ï?ŠGňgp"AÌg' ìµêøðz%R–A¢6„é‰È)rºI>+aŠ+yC‘CÑ&›3ŽèüûFñç;ÿ¾QüWZ>âÖU÷üG‘Ø·óin¾ý;lzm)fÒ P Õó,ÿôùÛ9ç„(º-0–4‘d‡dÜÀ%RY‹ìX–]{|íËŸ ãÕg¹ó[ßâ׿ø7v¿¼™¾}@ªúðœõçbßOp‘ö?=ηïø¿í]9–Â_&Õó47~éÎ[[ƒaÙ %°mR KPÈdsÄ“6/wçøâúOйûwü×Ýßç{¿ÄŽÍO"šƒ¯m©ýèœõçJÿA–سãYîøö]<ݽ}´@ &L¼÷÷|ös·rþÉÕt›±xGRHMæ±™t&ÇDJfËk¾üÙ"86í¯ýÿn~uï—Ù±y Ò»ÿy¬æë*êÏ'Úÿ÷M58lõýÀÀÀ¬ßçõ¬ß‘ô}#bIKˬ¢ªéÑÕÙÉ’––ÃãPí§ÍôØ·o_ÅïmÓŠ›ÚÚÚf-Ÿ+JÆ­­­åöÓŽ‹ž\Ñ^[&‘o·0'mä¨ÈÒí•B­ËyxÕ+³•æ¥ö3C[VYq&GEö¯®aéöQ–n%õT,o-ˆ¼¤}}îÏP¬ X3ï6ŠÎj’¾‘ªð¬eËkÜ™°åF ³/OMl9Ëó>ö…fÏnq°h¤Y¿÷aÎÓº2zJ~£ãþÛM78T¼’¶fý>Ÿ¨f¬]Æ©ÌCOAd… ~AYÁ/ˆL ˜] TŠ„“¥Vð0bf-Û“q×;cøe…¸]`OÎb‘çÐùß“ U›wyÐS}Ðå+‚ 埛ÇvpJqöÍc;‘–_ÑþÎkBÜø½q,=L™r\tz¤¢Ý³ €©Ù›,=…¤NbÙ–ƒ( ÜyMÇšú;Kj%²¸9‚?=U48!¥K˜„¢ÅFa’m¹@ƒ÷6Çj§¾H+ìt[h°)uª¬À«Öˆ ÝãÍI¢ÂuÛ,.ÐàþE«ù¹ì±ÈoDíKßCkàšr_/BYüŸÃ™sÿÓŠïs8åv­E£€R”ÆÜ—žj[2˜£“î>ºFhÜ¿éÓ[^á®g>v®Ã• T7H8!×\aÍIS÷ë¸íÞ} 5Q ·ÌÔŸ|ÌÝþU-'pýwrñ…~ò±xíëä¼cfóŸ.ö}zË+4_r‹:?Ë•ÅóÕ¾¤HkÈfQ½ EŸ›î Ÿ¥ù’Ûè~þÇœ×&ÏËOs5Ooúêœü\ÏVµB©ÜïG;Dn½õ[¿ž/ýÓ Ä–×&âäm>úkøgÜvëׯçÖ[oeýúõ|è„©ÿ+'TÍÐCÇÓ3(rÙ s>x ëׯç¥;mþí;íqø«b!NIœ.Š¢+\¶íò µRaXé&Û²ý²ìêÀÓDX¡>ÔÍ®yúŸ0ñvÆ./÷E±ìîi¼þÉc›XrU ˜6dM"+, ÷ÏÛÿó9žÎ9jüuÖNžÓFÈZ–{iŠcNÎÝÿÝ×x4³bß²,&F‡X¼¸…D:M]]‰D‚Oús¤Ói:;;‘‹D"I4å˜Öfîý僬:öÎ\»–ºÅ-Œ÷ò/ŲLž{a3 61<<̪•m8ÂU8ŽƒeYØ–ÎèÎ]ƒ 5 $’)&F‡¨¯o$‘N»Åýñ8ÿø?Wðã““ø}>–,j྇eÕ±ËY{üñ,hvùZC–mòÒËÛËücÚcÏä›úw £iáêZâE~U¬†D*ÏçC×u>ò‘ëI§Ótuu!ÚcCƒH¢ÄŠå­<üØoYuìrŽ;fõKZî£&VƒeYìxeO™ß¼¸Ût„——ù–W¥«·ª¼¡Z‘«®ã_o¿‹ïúO$‘xMO 34fãS'ó?¿ØšL‹V±¢mI9ÿË[[ùÆ¿8|ä 956b[ú‘Å4|eŽ“" Òpì±ŒŽŽ²½ûR<ž_’ɤ±VìßTìß{ÆeTOëß{îÛâµkÜŸ›_ z­—±bߦ9Ö¿zÚú­]woelÚúW¯õ²èíü¿©ùIðK‚bO#äG¿„7(îù)/h†:+C*m2FDÍq¯Ës ÃØÄ?ö@’´ HÈ ^ü‰6¸3³Þ D&+@ BubÝ´Áã p¼ ͯ®‘’ôc¤Pê«Èg,ÒiGtЊAy!iWè ÇðÓऋëÅH#U°óyH&Ђ"V&~ ƒŽáà)¸ýíªj¼þ4à  £0&¸,Bª=NapÓUbÀ“œý=@ J”®¦Œ R‚adi¹H6—ƒ¤’iD`ÅŠc9ûô3ÙßÕE:bËö­8Ø!B µÕ5tûp€ªp u –ÁàÐ Á@ššjrù–á^÷ûj««Éç tvwá?ˤÓoóßæ¿©|Û¶Iõé‚ˆíØ„yHöê¤úMÇ5³rlwÖn€T¿ˆE#«P£Š ʤú]#§TŸA¸ÉC¢·@zÀ‡rÿp“‡É9Ñadsæ ¾Yä H¶C½&UòßÎÿ›šô1-Ó±wÆE(`;&"Švñø#Û–  ª> LÁWVkûÛÆ#Ë®ðÀvg ±0AE’ÑmÓ¦Èw_²E‘óE:,¾eºÝDYtù–ƒiYX‚€)É’+ÀÐd Ý´P P xüÙžâ«¢ÅX\G‘¤ÃÊ¿¡[ˆ–WU\¾àp‡÷*øÈÔ5Ó“wü–û;Ú9ö{ã°g¶à|f4¯'ÿ)§bŒéÑÖÖÆ¹Ï-:::xuÍ8Ú to¹l/pC%ÿ›íí\|§Ë?T6_pù—5L0ôÜ{ˆwx¯‚¥Ðññ©ö—þö·\×ÞÎ w e~GGGùÙKGGGÅø—5DÈþhŒŽ˜mmmtttpéï«(ÝK¾¬a߇ªa NÇÒÁ¦ïðƒÜxò·nîÓŸWÍ\—Ò83×á_ÚÚ¸ùñ©ï'ŸûˆÛî–|€}Ÿâ_×>Å?Ôß~&ãe—ÍÉߨ֯ºÇ¦øOyù®Ëï¹ôÒòxÌóHø¥qfò{ÚÚXôøãíz€u=F<G)ŠÂãñ8/½ô ²råJâñxyÆóù"ÓÑÑQcfø|>žûƒûÝ7›ÍrÑ…ÒÖÖF<‘ îµØt~]]«O8¡¼ühòO=õTjŠE®ñxA‰D¦žm¼ôÒKÄb1ÖžtÝ”ûù|¾òûéVÑß×WÞ†™ìl6ËK/½TþìÔSOeac#““E£ìRAçÞ½{Y¹rêþár?s]ºººfµñù|tuu±dÉ’òg¥¼–¶Û[nîÝ»—E‹½nþØØìï >Ÿ±±1ª««§}*Ëçñjî”Dñ»y6›¥¾¾þ ÌƒñKãÌä' ÂápE»D"Aý‚¯kÿ?¯.Gíò66šª0î·©O=™ÉWldW¯÷¨íÿçT§‰µùÁvÐD…L0M,8÷³TŸÏ‡Ôù}£¶ÿŸ[›'¼Ô¶ƒWò`Dt¢ƒ²³Ù4v6›Å×÷,/õ»ë™û}}=MMMtwwÇñx™|>K2i¾¥ùF“€Ù'` Š(R[[‹]gãüIB8.Áן€›.^͆'ÆØºe;F˜ìsÿ×¶nÙ>ë~ø9oÙ,àëO”>mdá2 ³[!kè­:Uk" Œ¿­Èï`è«v(·n™}½2ô{­l0ÅÒxŒ<¢Èw¿gÔÖFËüÐq9¾þÄ7]ÜPä°aÔ=V÷8EþìúªÁg§Ì¾þD霤Ҵ\Áì6É&B+T­Ñ0äܬíÿ¬§î¨f"15‘„Ø$8iðï­åWûr³Ý/M†–ìfϺ—_œ;ÎÚë–ó¾ 1Þï>wóŸ;dþ×ký|ª=ÆxÜžÁ×ùð5<´/ëò-Ç}l8¼âDøC‘ßù“œõÿ-æ²ë&ësùnþgògçÿóþI>±ÇKaš—Ø«œ4ù‡Ë#<Ø‘œ`9nl]¶ÌFÝkš/Ô9éªïùd–Ñ>÷37ÿ¹Šüç; ›„€æ`K`š+–ŸHKK+---lxòavíÛ…ßï'cgpŒ,‹k«q‡B¡ÀdÚ@óE]³OCD°Á+Èø¢2¡€†bÉØ¤ ( [ I`‰îŸÍ,@^ùKáSäÊå«gð÷á÷‹E~žÅµ¾ü““I ƒ"|Q‰PÀB±DlìyùBÓìýÿÉ=x.\óâ«Ö¹?¾q„gRÊû„ç8ƒæ%•uQW­ ñóI<ÇœÞZË‹ûFð\0ÎöM1N­ Öþÿ‡ÃpÁÔõÌ{Šó<<´±À¶‡¦ÁŽƒæ%•5WïYmt—ØêaÛ¾\`Ò¾ ŽkˆÖþ¿uË$\05æùEþï6Bç,~žó×¹í8Î5 èÜ\}›`ébÿ¬ý®ã=±˜|àå1¯¹Æ­!ºçž{xî¹çÊŸŸ}öÙ³&ºæšk¸çž{8ûì³¹úê«ùÙÏ~Æ>ðî½RvÇaå_˯àòË/?jüË/¿œG…áôŽÃÊ•xçœsÎQã—Æêyñðò_:ÿ5'ÕC›ÜͽûXÚá“ !y%Ž9#†SPÉd2ŒþÉòÕÃ|ðsìÞ1ÄÏn–P²:Ÿ9Ý ¦ÉàËãŠVþÊ_á‹ !yqù'¹&j£{h9a”ÿK%ÿs§˜T{$ðÏÇŸÿü+4çÕ½OˆEþ­K\û÷!dÍæDqt•t:ÃŽ½,:!εÿRÇîÃüìf_Öæ¦“¡ÆÀ?t˜ûÿA¶¿qI„ŸýÝß2øÇ˜Þ-˜ex8Ë«òÒpü(7|¾rû#«\Áu>tòôùG–ÿÆ%~ó±0¸çþ[¿BœÆsÃç+óYšùüÑËÿêw‡ðDmÞý™(vJyÃótùGžÿùùGžla™IQ1³€ €-ÛL¤MVJaCÄ+ $ ш *u²#88^Û˱¨ƒcŠØªƒå8äL‰ èX ¨ŽßÁ–mJ—|üÐ_2Hg܉@ÑH2žšÄ0ŽÒÕÓM:•"I—Û$“ŒÏq¿iæg <þ|ñVæ‹¢ˆišLLLF) ‚P« ‚€mÛ„B!A(õ•žU뺎ã8ecÓR{pòããã466–ÇÕ4 UUËu­ou¾eØ„ªT4F|<‹ª¨¨‡©ËXàšÓ$u®0AlUó Øù¬ñ–ç7¤þðPÑr’Ö~fOƒ:;^Oýááñ·rð§dnqýa¬ùcÆNÒwœC¶ƒ×Wÿy¨x;ÿÞüÏU[Šn±¥¢þvÏg•—Y›ÿ<õ·Þý“Ñ ãš½O_>=ï~ð†¡aÃc–úÛª±i“»Þ¿¡¢þ¶j‘û|+³èïðÿâËù=ÚõÏoçÿèæÞó`0J1.‹U¡ˆß]¾“ï8p—q* þù|žBÁÏ5òóPœ÷úûò¹¤ ’#àdLTEÆÀ:²óßüŸžz€_×ý–ÉåüOÄ^)Ëoë?ñ(ñóˆñD™¿á² OùŸÙR]Áÿ·c¦&ÃýìŽ¦Ãæ‡¤FÏwy× ·ðëï|[–X¿þ“ˆ–…) (zZÜqëç¸øå-ýIrŠ+§£*?½ó&,Q„‚™‹.ÿý9¾ôÃNü«>‹( ¬ŽÙŒNèØòMXz=0U.ö~Ÿ÷_ó%îûïAàSŸ¼«ÌÿÆ¿ßÈmºÉ¯ø)½»3˜™–ãàQrüøÛë±÷¿h\ñ·_æÕ ™Ï}wU+?Ž$ ´c =ÁÿA&p]Eý¹Õw'W~ôvüázDÛàÓ7|GQ0éìsŸê~ã?Öó·xè×?幓˜yLÇAV,~òíÏ L›âò¿ù2íŸýΫDWÞ€$ ´c¸=Nç¶;`Õg·þüÍŽY1Æg5¬ ,`4=4ëóÉébÿ¿$ñ)ŽD”?WßÃÿ*Jc3£$Ø?TÌ×nºQÀ|mf õK1]Ø¿ÛW-¯1]=½ÍþÕ5³ŒòíSÒ´eR…©@I˜ßZ˜ýÏ 7j0Q@tVϹn¥ܱúÜ6s³Ïc£ìÜN¼q kýQöÅçf_å——&Aªë—úŽL/Ö,€ÃéBÿ’ø®8˜¨U@š%Â>Qæ÷Ì‘·ŒiàW<$œ,%Qú\±P Я»79æg‘Ç&¨úñ:&/§²øß/»Ó‚žêY}¦GI°¨˜oœéFs• (DäZžíŒðŽ–©cœ?m`é)òUU¼£e¨(úŸÓÅÿÙ-.¥©b ¿7^Ò\ñëc\wÏHyÙEýtá~)º÷º¹ü«Ûº÷±¶vöŒ\%ñÿœ°Bf‰5 4V´¹äÉN6wõ ¶ð_½»fSîϵÿ•Düóí%ñÿ|1ÝH`¦øÿâ Ýí–N º¡‰žÁ©qºÔ fUË ô ŠÄ–Ïþû^|a€»žLsñ…VU{h^:{ÿûà]<ñ¤»–Ä÷¥xzÓW¸ò ¨ŸÏ#Ë®;©aȲŒ,ˆA=ˆç¸ãA×ÁÀ¶h8!Œ2:»ÿʉß"X•ýËbš×É_(ŽR³¢ÕBÐl›ºãB(³ûŸn¼ˆ`]~³’ º,†6Áѱ‰-—Q^žÝÿb_;¢cÎÉw_8ÌD"Á™gž‰TœÁ#•Já8uuuìÝ»—T*MSS==½œ{îyˆ‚Åøä¶,“Í„½£ñ$—\r …B¡<ƒO?/¾ô+4oIOŒ³êX÷rþYçàñxèêg<笳Î*óK³ÕÖÖÒÞÞN*=>¦‘g">†Ó??žà‚ .Àq‚Á ^¯—i|?ñÄ+W¬BÎ?ë4þ ÒÙ½ŸñI—/Ë2ŽãL&q‡ššÚÛÛI·ÿÀ—ŸÉ$ŸÇQ29¨ßËp|Œ3Ï<ǃÇãAÓ4yá¿Âç"Š~â‰qV·ÿ¼³OwgÈeŸœä¾;Wðï`dd1úhŸ°„3OëÁ¹óq-ZDOÏ@9ÿ…B–ÏÜ$Ž ˆ2=ýÜzÓ2bËž#òZ ÿs«ÅÆç üô‘8ŽÃmßúwÅ*/œäïÞJÿ®&þþFt6ËOn_2ßà¿jSSSSä»ùÏåR¬¿=ŒGP$…¾± ¾ô©Æ2ÿî/¥Øø<<ðT¶móÝþ€¿ºä˜ þµ_’±l‡;ÿ­n~Ž_Ü àqà@_9ÿét’Ï}3ŠãX¨ŠÂD"Ïׯˆ-ÛMäµ¾y㟲áÛ¶øñÏàŠuK+ø~ʽù¢o锕ó5 oºÌue`m /w–oÞH§¬,‹ÐKŸ7¾²9ŠtÊJ¬ÍîòÒçÍ›¶1°vEq¹ë&ê½v Í/»Ÿ7¼¼‡µ+зjH§œQ!0X“Gߪ×oö œéýswoE:å rw»ã—?Ú-à™K@>¶vÕ/ï)ß<á”3àîàÚ5åÏ«_ÞÆØÚônŽºË7—–o«ì¿UƒSΨ¸Á3¶&Ï¢‘ÌÛùóH £½Èipªø ‚™LC1É!ÝtðŒ¸ß«JWŽ9ÙBjxRy A »+ !Ù@MåЃ^´âÏLR†±E\B+ö«âèA–­aˆ~H&/‹ ¦²èÁ…Á$¯}È1€Ø1ˆdB1Ä r¯·ü‰Ù޹zÐWLJ5F…`<…ØAMeЃ~4ÁýNŽ“Ê˜ 2…€ ÁùÁ$Y¯³=¡¹­ã°0€’Êb}(©4FÐGaL†`R h–?/µ#%B0Œ7?')QÅ0‚•×R6ÐÕÝEmM µ55ìze—+Ðr¹Q40Ÿ$Ví^ãáÕ¼8‚Ãd|’‰ÉIþø§ÍÔÔÔpöiîνû:H¦S€ÀÈø©dšÖ%-8@¾›ÿ6ÿMåK’LdÎÖBZ IDAT‘ÆpgM 5ªŒtå‘QEqJØ/¸nûÁ… ‰Þ‚+þoRIõ®á•(nò”û'z\óÛq—•ú'{§fy­ ª„<öŽäòõU2í£¼E-I’X•š4©(Œ§ j<ä²Y‹ú˜Âà¸cÛÄ 1•ö±bÿ”Û?¬ ÄsîºD4‘ñ)þBUÅ ¨t¤uF‡¥^‰Ž´ŽeY¢ˆ$Š´x%:s ŠÂ i– †,‹¥>…ýY÷š¾^–iõ+ì˸æ^‚éö¯†‹Fµ‚À¾Ì´Ù‚EWü- Q%F ‹þÉ,–ã€ãG`̰¨R%BA&³&¦c ¢#c“1Mj< Ž*Ó—. ;õ²M.gP’ºGË€,™L¼å ŠÂ__8ßµœâkE¾…"0ß¡/m¢;Lãó¾ýo6ÿÍÍ¿m:ØÈŠˆn;ä²&¶ã€"bâàWmTE!o:X–‰_e/¦å1õÃÞ~Sö]&`›îqW•2Ÿ2_ÀpÀ/Ûø$‘¼á€e¢Ø` ¶m°,»¼Í¶Iy]dUÀpr9×0ŦÈÇÁ'Ú¨Ø Ór…üLÓ"cÚ‡Á²ËÛ ‡÷lâ`±fñ2ÚC,þê'ÝgŸÜsƒ+ü? ì#á?~Ž{ }‡÷ªÃf—žÇL7˜ïk›â—ÚÏÕöúÖN R6èêì,‹ñ»:;ikkã}Pap¨uÜz ÔC·mQ¡SwÅÿ¥vÓÙ¥u¾*Lß,¶]$Àƃ´köáŠÿK¼Üðqz¦­s[[›àˆLJmqzÑ*M6^v8´ÈÿPÑÙÕUÏ%ñ3PáEæG“ê©§SøÃa—DæÓEÐ3£¯¿–AÀ\m—-k+óA,óK?}>»wï®08T”¶éPH§ÓsˆÚ… ~OOO… À¡â˜c–àÕ¼s”ÂëÕÈåò¼¦¦¦ ѾÏçcppðˆLJm}^ïœ3cz›Á¡!šššŽx\´‘ê5lÓÓarlÆœã¼caY<ºûƒßÄ_çÁ(`Áäð$ޝxfµ=sAIpŽêþ_ï·ðÕxA·Á‚ÔxS3€Ð¬ýÿ¬úÞº¥î½"ÍÇØ¼÷¤êâg%á¿û¼ñÂ<º®ÓÿLP‰Áçó£ªêað­"rþ$ÝíмŒiü’ðß’4]äÎÙ÷tP¨>g:Ÿ"_-ò'QUŠ|`ùú<üºû¡yát~Iøï^.ºXGס÷w25ïÐñùDw;…ÙÛoÈpË’q>ÒçÖù\RÓdžÞFnzW˜Î‘^°bn±Ÿa»Ó®[#}ªWâÛkF‘€Ž×ðÃKñ7'yç*ŸkÞÐÞHÍ"`iá ù7¸µe‚÷FŠüI6ôDùü»ÂôŽŒ€åw½†]6 îÅ+òÝ“'¸k¸Šÿº9Çßœ⫼®yÃÞ(µ‹gògç_÷Àím9>Ø£ù:¨|þò=ÃqKF0Šæ†k@0<î k"ß?CG¾Ý§rç7 þöÄï\¥¹æ ¯A]3°”rþsi“Új0 85.%°sçvöíkgppMÓðûÝ Çq#ð±råJLÓ¤§§Q]³ɽϕMå¨YPÍ`÷UÕ>²¹,ŠÇýΩª0<~/äÒüñaQcË|¦ñad$K À ¾›S—Ù”EÍ‚ƒÝIªª!›cNþ\ûŸk¹Ý]Z…ÀÿôÖZ^d„Â.¥,ðÿùÆ‘ò²æ%y~¾1Y~yš—„èîÒx‘^Ú'¥Cîÿ¥èîòTüOlõ°ì¢,ðhc¡¼¬yI‡6N½‡ÍKÜq¶Q`צIŽ©Ò¹ÿOñ+þ-­¸b‹"¿¥µ(ö/.k^âþ^zùn¿ý›24Õ‰ûÿ\ÇŸ®1ØtûÕW_ ÀsÏ=W¸ßsÏ=åe²,sÏ=÷”߃+ˆ/ŒÝ{l;;™ÿŬø³ð}zó$ÓC뉻h:ßÃù{$z»ý †ÔË0 k« Ü5&#Ц+Âs8dþƯ)Îîgÿk‹%o‘ÿ*Mëá¤>¹‚¯ÁÉÿLŒðóïýù ¾'[à‚ãÓìÛDòû*­grÚ'`óW(òƒêeÒƒ N Ú|= ¢È4þëÏÿ‡{NåäºÿËÞ{ÆÉu–÷ûשÓgvf¶ïjÕeɲ\$!ÛÂV°\ÁÁÓ1!q¡ýé$Á„@„$`ü#† ¦Ä Æ6n²,¹©m‘VÛÛôzúÿÅ™™Ù&K66ù8Ï«™ó”ë<÷œ9í¹¿÷íe,«pæŽWqÓ-÷"þã0/ïòpï/çŸO% »(ŠÏ‹ýŸþñÙÿ#™ ùwÝKîc¼¼ îýå|û·m±+üçÇþ‰”†àåîŸw³ï®ƒl=»‹OüÃ4ÑÈþõü¾{³qK+úôÔsàŸý]~ž»bjW‚®Õ!®þdŽè Ú¿)+!X"ÇaÂÑž.²¼#JÌ#㈶dƒ. –$„ʲ}XH+9Ù"aY, ‹ˆ¶€X‘tÈçEBº„_qïŽäŽðY䑦¼ËÏ= ¾}‚üè ñ–wˆt~¾ò ‰×‰Œµµ1==M63{?0·äs9‚¡^¯Ÿp$ÊøÔÔ¼6ÁPˆ|!O¹Ü¬² <ÊKž_µOMMÑÑÑmÛ躎mÛµ{ê|>O @Ó´Úó¹×ë­e»÷z½µ$GUA½$IضÝð6‰ÔÚ{½^ŠÅâKž*äò²e +2²%Câ¶-âŠÇ¿¶èopî/—®¯–n¿«(Ëu31• #.¢‹JP$PZ˜ÿý5ïâýÿ¹ä¸¯ºoéújùæÆ÷-Î_dþ_nºœ¦¹ä¸ïÜ·t}µ|¶íM‹òaÿÏç3³üÞßM.Y_-í½g*þ‰ÏÖÿpõî ì.-9îáÇŸ]ðƒªèö¸üOÚxÌÌò‰~°ÿØ;ðæÕÇïÿùöqí?Çÿv¡Rõ¿µ‡Õ¬óϧÿ­oÀÛÀˆíÜÎØj×ÿ¶î²éî×%—Aæùõ¿mŸ±×_ÂLó$Í»÷b¯xEC]áMo¡yð÷Ï«ÿóÿÙÿcÿÀÐÂש c[6íÍaÊ¥ÿ¶®ñ‡xwÓ£|kèLüÁo÷>ØPwmð÷|vt+[eeLB³dãø®¿sù?xÙ@ão–ä‹ëñ¼¯í™†ºwíå£û×>;þ"×_—Oç%k»_Þ2ÃÇmÆ ðéºì/ž6Ì;ï>+~0(‘ñHx‰}ätÓæ'O”™zøs˜ºëŸ%j&›Îù(7ÜØOk\%%:ìúŸÏ š¶,AÉYâ‡ßùw®½ñ(aË"£¨¼y[ïÎÑÑà{¿D¹ã}0Çÿ<£^[Qøø'¾Œî•øåo‡zø«8º…%ŠØºÃ†Ÿå3_{Šö/Iü<ò«O☢éúTþì'7qõ_?-q2ŠÊÛ·Çøá#)VúEÞûUJÍ×è 5øŸ—$… SB²LþúS_C7mny´Àø#ÿˆ­›Ø¢„S4Ùpñg¹þ+ûh_AKyà—ŸC°lDlCIægÿý®úÚ!¦NVQyÛö?z$Ū˜Ÿ‡÷~bïÄ“M,èþbyl,ŽûF·Zžf®Òm0Agg'ccó£N7¶]¼þC©ó?›àÕ6‹XÊ1«*È_Èal®X¿Þ¹ln €5kÖÐßßßÐg¡`@­Ýš5kþWEÿÁ3g#o,&)÷Zl\—\°íê'¦áY¨ï:Éì·4: ÉÝ^š*ùÅ·¢Pä¸ßc7ˆüån/-¬`@8Êæ„$Æú;ÐRô@Àý.w{Yßâg¤"ȯŠû— #Ì ÿëë†k6P@Ö¶Û‘„þÕR?ÞÜÒíȵ BUqõB"ìzáu5Àbæ–cµÒ*‘[êJÁ4(T>ïÎÔ‹ÿ{«×ExÓÞ Ö™Óšr‹ßÎyNzÜ6Ø"*\½.Âíýâþgò^¨ ú»‚ïXôøë¯(Õ«m}s2 Ô·PY¼Š÷¿æ¿èé°iîtÑž›‹/ ²RÏqަ强[âu¯°Iœäþ?X¼öJ•™1wŸVê9.¾0Ä»6-çʯ<Å®­óƒ…TÅÿµ}:ü$§¬:×ü¹—ÍB7=³âž›{þYVê9Þµå¦Ý\ãÜÿ‹çÌþŸVê9îýígyצåi}+ð£yüªø!þÛ¶(¼rÛ2š;%œp3¯ÜfÑ~…à/O³¹ÿûÃwoØÄÑñ'HœäúO?Á·¾½¥6pƒüåi6ëÞò%"éÏ×¶ •¬¸UñµÜ~Àa6_»Xƶ톅Æê 2ŸÏW{©V† ‚Àš‘»X}^3ØNÁö AëYÍœõùyhÃ5 ý›KÃ<¸üºZÿjä~I’jÑ:‡¿9óËwDpl ®HÈÑ {K˜Ëø ¿j}]CÿŽò8¿ ^ù¼ñÏã gÉ®×~©’Uh;=À;}ÿÎnè¿\LñÝòËå_r‘ëœH$Ð4b±ˆÇã!•JQ,Y·n½½½$S´tvsôèQV/_†Ç£29=…,JŒ‹´´´"I¹\Ž 6`Yáp˜K/{ ªªräÈÖ¬¹r¹L8fbbY–¹t¿P(Ôø…B¡Ž?IKg7ããã,ëhCõ¨L5ðÛ$‰T*ÅêÕ«á_D¹\& Íò/v³ÆÍÌÌ ë:…B¯×K2™¤X,²víÚÚü[;—‘L&i7£*2SÓS(²Âx¹L¼¥Y–ÉårtwwcY¡PˆK/{3§Æ/•J„Ãa&''‘e™{n }Xaxl#SË(˜ÛñzÒôõ=Äå¦Á8‰o|oˆ¦¦&r¹kVôàñ¨ŒŒ¡• ÆŠ%þöëX·æ ÉëØxrÓPyÅË%.{¥ˆ"Ž28²ŽÕ+¦­ø-ý»: 5EøÕÏvUøÆ’üïß2ƒ?&ŸÏ×ì?>9m¹¥¸º{~E_”ËUù™%ømüøW%"ñV …-±ªý§e…dÖäê·Å—à×Ï_nfùúRŸQþÀösXåü7¶³Ý%VÛ‡¸±ÄX¥^ڶѭߺÁ=³ýª¸qlõQºq™7ϾYå|«R¿§R_É8¿gay}DÅÛ/sû×öooeÿ6ϰ"Z/ݸÇ}9xㆷ_Fk¥ÿÌîÍö^fn,1SÍ8¿m»[¿u3•þܸgáúÊþ×".îYø7îaðõ—üŸý_Dû½j9jÁ¤Í*¸A¢‚³?™Þ %¯E¬H¯3„)å,|N™Ò˜…ÖéŠþ ð1‰ S®ÜîØcôºú€: jØý’(ôeI·*H½iB1Zà „)å!$’éMS0ýˆ@v~P@{,‡ØÂËQˆÄñ9c8„)ål|NžÒ˜Þ¬‰ÿêŽÂλÏ…¾4f«„2U€Ž8ðFËY(äIöê¼^Äñ,„èŒá„Õ Œæ1º‚0š‡P…1…1Ær’`,‡Š@<Ù¢ÚxZêÍÀùsŠ7ÇI¦R 9\_û}>š››‘% E–›©Ä ñæf¦g&)•ÜTŸÏƒ€H!ŸglbÃ092x„b©„x}>ZZZÐLÝ+˜œ˜|Ió3¹ìKzþ/6ÄqHi´®ô’ÑÉ ëxepuËdG*‚uÁÍ‚*# è’jšzÜþŽã4ôw‡È2Ùð2•ÔÑN‰Ü¨M¸[%Y0Ig4ÖµzO”K=A…dÁ$ê—ðzÆ“îówªdõKŒNkÄü2­M"c3:QŸˆ/àa¿JºdÓW™.ÓSÐ4‘’$2aY¤ó:k*Eƒ|Ù¦]’˜Ú%‰€G` èò'm›6Q¤7§Ñ.I¬ðˆôtÚD‘P%À*Gž \ ILXA¿ÌdÑdM@¡7§±Ú/SÔEÁtŸ?Ÿ(!«"NÉ$ 88ä,›\ÑÆ«e:(’Ĩî`:’m#‰:&"’!k˜Œ—dÁÁqlŠ€iºÏè…R™€GÅlЦý'Àw3Ë7òMÁ}½¶0_¨ãƒ$2‡ã%YÐq(UØBÉ$ే¢éü ÌÿÅæ¿¸öUÛÁtp,Ûr°p3* ²ˆG±); S†Šj‹¾Ê„á`ÖqÍ_ÄÆ¶ @ÆÁA•-,GÇA0Á±À6ÝgzU²Éé63E7HBuþS¦ƒ!ÇÅ—E»ÆWD Kl, Æw… ‚, `‘Ì MDÇ®ñK¦ƒ!p\öWeY°*ï!*ïÐê²Êƒ+—^~5`ÁR]W¸cG’ò‡ö­¸hÑu޾¾>W¨ŽÀ¼¯Ön±µ•Wx`W茅áuü=G{Ùÿ^ØÿïÏŽ?A3ÿì{ó’íÎæÏ]O¹µ¯—ƒ½°ÿ >xà"~}÷ÝK¶õïX˜ÿ\‚ ®Ä²ùöûÞǘW•Uÿ{?× ÕÐÒß¼ô²EÛÌå/ôù¹–{.[š¿”¤{®ZUUš››„Êõ¥*ò=óÌ3éëë㢠/dðèÑEÅÅb‘U• ôõí–-[¶`û€ßïY¤Tù«V®dß¾}ÇÅ_,«{ý¸>¯wAþÜŒóÝ]] Öø‡Z²m4›Ç®òy÷a÷È‘#‹¶©ß—ç“ TDý0<<ò¢ð«e|bñàüÅb‘È\/¡ºr<ÇÿË[ËDVx0tƒîÎNÓ3¬éYIZšáM½ü÷Ñ@Cû®€Åwžž·ãÿ¬x`Œ¡D#¦&&YÓ³’9Á놸u´qž>ƒ›ö©ÏÛñ¿½Y#²\Ç!ì ‘N$Y½l%I%Å«úFùq±1FW‡Å-EÓ4QI’j}¿ß_[ÏO§Ó(ŠBSS­­­„ÃaH&“är9"‘±XŒr¹Œ$ID£QFGG …Bˆ¢ÈÀÀ@í}x Àëõ’Ïçk‚-ËB–åãâ÷÷÷“‡äû|>FFFæñeY^”/Ë2Ñh”¶¶6"‘È¢üj»zþáÇéîîÆ4ÝL÷>Ÿááat]'‡Q×Ç¡„A–Ýu±l6‹EŸ_Á-E"ñ!H‚¨+hˆ^“ŽÖ6dÉÃÌt [Ј„½´wµ0xô†.ãóø1t–©N')Kˆ¢ø’ç‹¶lc&Žm Ž†1ºsx½*Š¢’Ë¡§Ü9íŠùï¬d´¯¨/?ûáSˆuR¿õY ƒ¤†¼®}º«O¥°¶àþŽÅŽ¡¥üÜ9ß/ ùÙú8Rþ´—£p0Hò¨Ç²OGçð™Ã÷bt—gù±IÊI•;§Õ9|}>ÿ—cPUj¡€öóu Uƒ!û´ŠÕ…µ6ù|–x±yÞü33¬n–ùÄÖ<Ÿ» ®¿øt&c"—æñb àðÎO¦@·80ª¶a™ïînQxÛÅ1úóãÝ~/ÝD»utÝ@8†ý³]IVÆDþîÌŸ½k†ë/^ËÔ#cLeŠì)†ÀqxÓgò ; qù–€–øÎ¡¡¸Ì;/Š2Ð7Êw+<:^¢Ä– ðçÛ?»¬ÌÊ|æå× ×_ÜÉÌ£SŒ§Òì-*à8¼ýse0&@\¾Oä[ûdü1¸jg”þ~ü¸Á#cy@%Þc¢ë6Bý{ü~r9×ÃF+iµsž¦i“F-ÀŠaµL˜~¿‰išd2&''+×~¿Z @_b|¼„$¥PÉԣðö$ ˆD „`„?!>ô÷^€/×ñ‹ðÕFþ´$eQ7O ŒŽÁÚ5|Ïœãï™} ïü¼Áà‘VîŸbÅÊ0?º' ¸ïª=› Þ¼3 ”y¸´§fЇ+Cõýxy¸¿" kͲw*Ì)Kÿ‡Ÿ€+>oº¢ý~­&¤¿í¨9Âm‚+vºß÷öOÃÞêghèWÇ囚*³J_üøŸx Îÿ|E´ß?+ä¯ ý«üówºWø‡«ŸiìWÇåÃð¤M»¾øù§}f÷Üs¦iróÍ7sÕU®RUèpî¹çÖ¶ƒ+ˆ¯/õýªã,_¾ŽÂDßã‹ÚUñÜzë­~SSp‡ûXÔþ§ðJ¾ûÝïþQø‚ pRÏù<Ó÷›%Ïÿg­Éð˜7ÊðA÷6U˜dË«2ly:Og ‰\â v!™1âÍ㌠¶#{rt¯låæÓX¦ÌÅoÈ™^Án¤¿ÅÁ±,ÁÆ6}þ?kõÂüÓžÊÓ-5‘3^…áì®ã·"{òlíjãûþ¥¯Í8Úûo¢Ô¹þùËÊ2OxU?ià¯TÛáÐÐvžÎìaƒåÜs'9ª¢¨:+Úâü¾Â¿à5YFõ°ó‡C´¬‘ëøçÿ…ì_½ÿ˜;ÿŸô½—ö¡if~ñ{ôl†'ÍÂ]~s_ ¾PeûâDË\XêÆØÏœw #¿"¶ÜÁ±¤gmÿ–¿øýÏ\ûÿzê òï¹OÅÒ9e¤‡¿ÙÀ饸GïàÁÍ=¹}ˆ¶çÉþ]çI§šÈ^Ìà¿`ÛkÏá´öØè`à¡ ä`Wí÷ßti–ÞÇ{žWû×óG¾‹õŸÁƶaöi¥÷‘r°íøÏÞþ]C:å=›ôÓݲŠÕmÓ}À£Ì§>ë}µ_6“"‰RÐ Êå"ÏüwR/5¾Ïçs×ú£G²víZ¼^/¹\®ö žJ¥ƒµ`†UѼÇãAÅZEQ‘$©ö.gdd„™™™Ú» pßí•*~ªª¾äù– âóBɶm‹‚áàñû…[¶~7îþçy¿íñ”½ì¯qP=Y G·1e›rÉÃ\’ÿíµÁ5}ß{Nü×]wÂü„Wó‰Ô¯Ž Y¢ücìõKò—òÿ ‡Ãµ@¡'ZÚ>~ö ûâT¢´?‡â½öŒ÷?L¡©é9ñYw2ìNÈÿóÿìÿâÚ¿ÞÿVÚ6?(vÕ¿¶>3ýBõχÿ­o壪ÿ-ó>+žoÿÛ×_² ýf®ÛLl±¸ÛÏ£ÿóÿÙÿcë²Å¯?Mb+Ž"²€¬€œVBô-”>*ÓÜÅ2µJR±ã¿þ½øüø?–‘QW”_|óã¨À¿|ÙÕž_þwœtÖGÙ3n¢æÊ ðôÃ7pÒyŸà®Ûn@’\©–×S)PÀCD™áÍ÷ ëÖÄ9gsÉøÎ|4‹ï–V½Ò|ÿó–ë¸õ{ŸB•tþù ƶZÏþ¶œ]½¾€D0—¤÷®ë9yûǸëÖÏ`I X&í~ŠòH޼ã#"OsùGc}wˆ?;3ˆäÜø¿ÁÑ,~¸[†•oÅ‹8ßÿ¼í~øý@ò8|ù‹Ŷ å¬³qûÇØ5jàË– âào>Áúó®ç7ÿùI,0Z/ü$Úpž‚ã# LóçÙÅ)ÝAÎyy2ðͯ€=j@ËÕ ¿Q©÷ØûÿØEnÿCg§+ mùÏ~®n¯¶›[Nwžâ‰ÊE»~¬êçcøßZ–rfZ*ˆÀRÂÿÅ2Î,Túûû­›Hà’KfOæ÷ùo°6]qÿÀé-µÏõ¥0 Ü;?¸™²F±ù> N¯¨”Ó[êZ4 ý•ìðkÈ$_¿½ßcãK¤Äzän/æH™¸¿ ýOè÷جoñ#wW„Á¬oñ×ÖRêÅýà ü»™/ü¯–…¶ Šÿ‡×FÕñcnVõz±þB×˾PYLø¿Ô=û-»‚—Ï IDATbÿêö(úÈn€€¬à,`ƒÍôxª/DD,êƒ Ì-Ž!ú¯–ª°?äivÅÿ‹”¹AêÇ¿ïp{CÝßþ?™BPáW…ku¿¯óå|ã¹nÆ—÷Ü”m8ÔyKÏñ‰›»¸èlwÛ=»2ÜñëI¾ôÞ8ï¹É}Iô‰›½¼a»MI”¶Ú›jcTþW¯‹pQi%õY ŽÔꫵy-®øÿ;îsV¿O`ÅI6ozÒ½˜ˆÎéPqìýÙ +ÚJ­;»½GjÛ¾Ypà OÌ?þúó®8ÿ™¼5ïX©~ïÏß„¡&þ_¨¸cÝÄšàU Û˼­6Öç¹çW°þó±1Þµi9;ΑjAêËk¯t·ý´ò^âˆb¥žãʯÌÖöÝ®£ÕÄm§òó±1b‡ÛøùØÿú…Í.3|‰ƒœzþB¥ºý§¿Nšåi}Ǽ¶?¯\ç®Zwó,?8Éßà´J‹Nâç·5ÌÿGßz†¿<ÍæškaË–-•ýl&¾þ"¾õmwÛyW<Á;¿ðÖkÝ[¾4ÿþ¿vŸLÞyå|ÿÇzÊa0*`>Z3?z̪esQUµES–å†Ïº®cš&+Œ£4»ÞødºAqZTBÓ4k}Ο¹¡ÉuìªöE±¶˜/‚›)ó8øk„1ºÏZŽP²p¬ _Qâ Á°ÕÀ½ýc„ˆŒ">ü“=IÚ·6AÙËv#KrT²0Ó³üëb÷#ˆ X‹ó§§§™œœÄ#KŠ%ÂÁ ‡žyšx{“““´µµ±mÛ6¦¦¦'“É02á©9¿­ZÕCww7ÓÓÓh𯸸8í­Í¤R):;»Ÿ˜ ‰F9pàëÖ­CÓ4‚~?XÖ¢üæŽN¦¦¦hooŸÇj†V®œÏ5…å¯]»]×øøT™\¾HS8ÄÁgž¦¥£“ÉÉI:::8묳˜˜˜¨ñ5M«eøiëì §§‡©©)Êå2ãããý^‰ÝÝÝŒŽOF‰Åbìß¿ŸuëÖaAŸ„eñº7„®ë”J‡°í‚€ßï§P(°jÙ)\üŠ£\pŽÄcOùøü¿¤é;rÓ4Ï}²™,l½ÈSûÏãï¿t¡Ð¦iâQ=hºE©áúœIñÀÃlñ”™Ê^ȵŸºšAQ7¡ë:¢( iC8ÎQ\±^©äÔñá±§"|ý?†Ç'kŽz×ØÏÆ åÿ ÿþ~Ó0ñx’Åj 2á€äP%µ#ˆ7W"'º"~©%ˆ×)®S™Ø€\_H¢4V@8e,-LY˜½Wô†DÊ5ñ¿„ñ$²– ETU {0ƒÔÜ„3™ èñ¡È&J¨ ÈãˆN6 ÍMXáY§R=À›ËAH¤<–ƒP?9lÍÝ?©3¹"¾H©"þ÷«BÁ& ÓÆ)[¨ª@ñ`³¹ s2\á{;Ã+bŠŒå ¹ …<a fa•°ˆ1š‡pùŸPÈ£„$Œ\ÆýÞâÅ|‰¼Ï‡0“AòÌ>ûú|‚Á0 0=3M*í>û†ÂA¢‘¡`€åË–!+2O?ó46éLšRIÃçóÐ\ÉÊ^.—‰6E™ž™aàÈì;(–J‚TY%›ËrÚ)§ðô¾g^Òüû~è¸ø?}pwmLÆÝÅ© ;lþwî­‹øœ™–û_8ûßwh°2¢ÊøLÐâã„ù½]2™ ¤Kˆ’ˆã8€€ 8dGÜ{VÛrÅÂÕ Y‚(’5jâÿjÿ̰æŠwEP—{Îȹ­ÓC‚ v_¾äF NZ'#š2…¼;V¢`"ñ B¢`BÑÍ^ñ¤J©’¤+U²pŠQŸˆ×/12UFÝ€ ˆ"^ŸH‡OE× ê“(Mb™±„ë<ŸÉœ¼Zb,'‘-è8Àxå¾®C–7gù-¸&qù“¶SrhE‚^‘ÞœËï/è5‡†€G`5 %Ým—+YtÈ2ý7 ‚išD-Q°É[&ZÁD’E‚¢ˆ$‰h†ÁŠxˆ©tž”劒eY@ÚýeÇf¦ l|²Še˜Äü2¾’C´ˆyÂ^º¡£ª&ò&‘ ¥’n9´D}ìÏäÿøyËB+XH²@P*|óYð€O–+|¡Â§Â—Ð UU*|…oÐõQ:Nû;z÷-gõ ªú^0û·ÇƒH$éÌþ=ñyüññÄ Û_ÑAR K@ÓuVö¨6­MÍ$såç|üɲLº¨ƒ£"‰Šhô‡ÉN§P$Å#`Ø¢2ËW%‹'€Q.Ržëñ¯R4]á”䀌"yHd2x*aRÝüA-$KD,n‚çpü{½*¦$!Ê*Ží Ú&¦éÌ Z¼víZ6‡æüÆõ"î=G{™x{c&Òªø½~Í¢Úgÿû¨FË+@Ÿ[ªüï/Á¿µ¯—UjcýRü;v$™ ¹Æ?VyýÚuóøõå=½½œ?Ç/¥^ü?·Ü±# ;ž=¿:·Ïû_yã+ç Ûë TG[jþ·ö¹í¾ý¾÷³²nÛ—êjÑùwÜÎß. 쯎ûÕÞÞZ€úàÔsÛ½§Ò®ÿý‹)X¨ì¼ýö…ýÕq/¨;&–âWÛ ]zé¼±†‡‡„È~¿ŸÃGŽpöÙg7´«q¯Z¹’–ÖÖ†úªø½>ãPµO5óy=o1r•¿zΚ]=¿»« Umü,ůf>¯òUFFGÙpòÉ‹ÖÇãq|ÞF§“zñÿÜr¼ü`Ð}ÆÛ´iO?ýô¼úúyUÌͼ^¿mãÆäóùÙL˜Ç(>Ÿ;·uk×Ò»@õê¸'´®`)~OO¥RŸÏÇñ”Žöö…ýÕq;::æm[ˆ_m—ÉÌw88Þã¿Ç§Ó¹y=€ßÍ~¬¹™˜g´ ²Òhß·lÈ"pÑ…³ÿ»çzüwwéÙ´Â Êk¸ïà1mÒå4’l4ôyÚ‚ðüÿ+C&m'ÅÝ€Á†`;–Cª˜Âãm\ {ëÉ…cò—/_ŽÏç#‘HËå(—˵Ìö---ÌÌÌJ¥P…|>O¡P  ’N§1 ƒ¡¡! …¡{_˜J¥e™žž¢Ñ(Ï<ó ###øý~ü~?†aàñxˆF£tuuQ*•ä[–µ ?ŸÏ …æñ«ÿÙª`¿§§‡¦¦&öíÛ÷œùétUUÉårµ¹>¾×ë%‹ÑÕÕ… Ná÷ûñx<èºN(ªeˆË¤Eô¢…!iˆ’Žƒ‚Œ$©ÈŠ„a8hš&L` IBQ/©tk@ÇÐ}¬\±¢222F©Tbº˜¥T2ð{ݲª¿¤ù’ha´çPU]×ÑŽ‚8è¿M&2„/Âã1ÉM6úPÜ9ÝÝ`ðXÿÃòKr¹–ea™ºf6o9;ïš¡õÌ&Êå2ù|IäYð-²Ò~´!À`/ñ?¬¸Œø*›·¬]„o ª®PY;ª!Êþ$¾„ЧÃ&3.Îá« AG©ˆÿaå«r9 ËˤÂWؼ¥³ÂUø’(Í›_JâòËâ4õæ(”3|î.øà©i=\yzåùÓt d100ÅÔ¨Hë*›³×†ÐºTFÒ£üxŸò1<>ƒ@›†e¤F‚¬¸DAUÕ%íß—’¸xg„È@‘|9Wá—e…7ž^yÇkº×žþ,“£6m+%¶¯ QXæe"9Í-Ïä¡@õšÛu,à 9`å¥ ñí?¸à2Á#+ |î®>xª‰(I\yšË,§ÂO2™„¶íkB”z,Æ’ny&‡PQ<¡ËpH ©¬ºL¨ã»×«L "!P%…¡‰2ÅâñXIvÏkÕób4%’H$xâ‰^$ ½+Êôt ©-N´)H¹,âñäŸÐhi–0 M3éîqEïÑ&hn†ãO‰CY(“Äc"6’ì«ã;D£ò,ÿÀˆËoö0=ãÕ¯ñ¥ã h‰€)€¦Aw×|¾8çøç€{üým)<›\áÿÙkZlEôïŠúa6«†gÓì}‡ö´‚g“Q'üÏÖ¶WËRçžrÿç{oÓ`“+ü?cÐ*¢WÔßgÖ…ÈuçÜT/ü×f·/ÊŸ=þ©8s¾Íçw÷ÀªÊ­Øù5>eA~ðñó—Ãë®»ŽsÏ=·–Ñhµ×—sÏ=·öùàÜsÏm¾W·/>ÿ:~ùÅà×ÙŸ‚¿ôù§)ò›Þ"Ÿù®_g–¡Á!¾òñ.‰®fã5G(•î¡÷É.4kË)PÌðK,í—‘8òpœxJ!vF ÿ/ÝëeøÖ›D#‘cžÿ/ÕEn?4Ÿ¿9¸šsÿþ0¥Òïè}²m`+^¬ð§XþÎQ.; ÓûHyBfÙæÒ¯Ÿ ¿ñüÿzCàgOg*üaô¨LgW=Tù¾õxÎÿ Ù_ô1<4þ÷ŸÓŒ:”¥”Ì"“¤ÝäÑ&F—S¼}š/\t¶ü†ÛÇŽ?¿†/þî§üL>~û/Å÷üQøóïÌ·ÿ;.[lþM(Ðyÿüï=Gûß‘ 0:Á§®ðÒHão"LÝÏMÁS·=H`½Ã“ˆœû—2}ù8·ô‰ìß§o¿ŒYI£õ\ìóð(L¤ø»×¨ ¶øÈ2$S÷óÃ]pøž½DV¾G¶½Åá=Œr÷aùø‹ÛÿÏä1Æ2|úu©)‡¿ºÑ$™z˜Û>©Ç3Þ}O¦ËáªKÊŸßÿeN¤üò¼@7UJ¦MA7ðx<‡‰¡I¢áŠ,¢ƒÿÿN»šw<ù'ÄÿÁæ“_8ÿ«þ+øðèm'ÄÿZÏUÇä[Kù¾ÌÏÀnaÁ÷ÖϦl¾ oí?qÿ×ù™…~©²z«oí=qÿ×ù™Ùa^ŠïgYš×êÌ<öð‰û.dq¤²öÂ:µ?ŠýƒÿG±ÿqðŸ³ýçøÏ.”i~© õϧÿm4µ—T´1(~lçv˜‡¥´ºLt7Ï«ÿ­8øûy™æc¯¿¤ö¾¢¾$‡24Ãóîÿ<(®"ùÛ›XUÿçÊþ üŠÿ³oÿiÿ~Õÿyÿxì¿ÔõW :X–ëxSù®ò6iøhך¿ÏžCë)1 ¦„n*'|ý­ç}rÿ_[ãZôgO^8AÀ Ûž5©ëo=ÿSû:ø‡ã œoî(,ÈÿðÞŽg?ÿŠÿ¹Óóþšÿ¹uøßÈ=ò9’ºÝôÊñ~£„gý‡9tï<˜W^ýY~ð«qÚzš°S9f ^Ê‚¿Gä¦o^ïîŒéðêwýãÓyöÞu¢$PZ÷ñùþç× {DY€¾o2³ë«Œé6NäÝå‚WFÝøAö=ú‚hZ¼ñÝÿÄ÷~6L{O3f*ÉtÞ]ÿvøî¿¸ Ëáµ×|…‘Éßñ9d´µ›ç®t\=Ë?òM}•qÝðµc¼Fõ¤qàÞÙ{Á7½ûnúé0mË›ÑRIJ—ùÎ×?î6²àµõe†§R<~ç ˆäW|žÿù‹U¤k¯½öÓÕ/õ¢þP(D("Wy˜™[B¡ùŽˆi‚õ|C›¹m—÷….{Ÿxâ„ûF£QŽ>L:•jØV_Ž>xƢǟ[çž;}˜€‚@X=­Ö'«ÿ_e¸AæŽ{õûoCÈÎ8’ã?txúÁÃ}ÌL[”Ê" 6þÐüãøñÇîØ;Iÿ€ÎîÁÙùo¹Ôds§ûÀö½àÓß(±f‡Åf¡›¯Þíéí±v::ðø)ÍÌÞDýôW4ðE&šV$æq¿è½ùTV®ú3šÖI©w±¾r½»å?ã[þiµ»ø«–wÖÆõ7kóóûŸâ_q茉zÂalb‚­ø›ÝExÁ+âH>­ÈÝN±üôW²sçNvîœåkßζ‹W!dg¸ü“¼áÝ_dìî{éXáðwŠìhcœ­[:Àã牡”ËåZ&˲Ø>úm†‚›k/Ë,˲,¶ þ„­¯Ž µxtA³ d!ˆ‚e#æ ö6"Š";Ž~“Í׬&7Xà€sjíÅœã¸YeYfdd„eË–Í㿺üSJëçñ/ÈÜ×ðÅÕ ß†²… Š`9˜y›‡“«E‘+ò·pö;ºH •ÙSZw\üwaÖ5ÿéI6^ âÊ ;ˆº eAÀr° &÷Žu!Š"W{ÿÀéW†H<”ì^”ßÖ%Là÷(ŒŽmnEËg]Ax¹ÄÈÑAÉ ¢ÐÚÚŠ×ëåœsΡ³³“ÖÖVJ¥étš¾ƒûI%¦Ð Y‘8¹tŠP$ŠOõP,ˆ„ ÷‹µ111AbfŒþÞC”KEÒÉ>ÂØ‚ü#’Rã¶oßNgg'---óøf¹€7ØTá7áËÏò ôS(äH'øÔêüÛÐòôr™¡Á# óD"lÛ¶m¿÷à>RÉi0ÊHž¹tšP¸ÂÏ牄# "ogbb‚dbœ¡Á#tuvà˜&ñ¦™\ž›¿ç÷Št´·a™&·Þ1I{ËFV-˱aóA^{A;uíWìôðª ýø½ïnã7㻆q h¼Yp8iýÚZZñz=<þÔ0¿øÍíX‰Vå7Ûä3I~F¹L4$W,òÝüüö±h­\æŽ{³Ä›ÖÕø¯Þç/þê—Ÿ'sÑyJÿ·ÿ4û†±ô2ᦎ©³jõjbMQYæÉãÜý@šóÏîF+Œò»G “œB’ Ù,á Ÿb¹Ì¿}Jäîû,>/…|ž{5ˆWÕøŸæíÑÇ¥;àüs¨ñ?û/Eþðè¦VÂë¢Ktww ‡}ý î{¬Ì¹[ÛÐ £ü~—HbjŒøŽ«hrfïŸÇ¶®¢tã>Ê—ŸDh,E¬S™W¯ïâ–hCý ¸Š´eÃC exˆþžÓhræ÷¯¾D«ö÷Ç-šœ‰ºú3êêg*ý'êønÄÆòå§.Z¯ïñÎë?(žAZè`ÃC·Ó2ÜGÏšœ ¤¸…¿®ÿÌÖ Péï›Áß©àw&˜Ï (t°ì¡Û‰ ÷1ѳ¿3Q«¯õ¯Ûÿúþ ã߸‡âå§â›a冿ã²ÿø {¿Öþ±«Xç 3>8DéÈ“h«Ï{AìŸwöø®y#Ë‰Ôø$ÎØ“Ä:Ú^û“<è6\ûš£%Š© $â5ý›*’i¸ÑÚК|x’e2^'o I ™¢ìÞãh!/N¬Œ¬›(“²àÅ–üÉ ª¦Qò‘1‘=2&¢,à H¤Š Žå`¨’nâ&’¥áXn¢²Âç•ÈN^C–$KC¨ðõP{,‡ÝDÒÊø®ç’ h~?v^ÄÉHºR©×ä0JÐ86…\(RÂÈèX‚‰hé5¾ à32ØyQ-Sa£âÉ$µº· É# Õñu˽Wªò%ˆ„ŽP™Vô`å0C~$Ý`ç¥Aš¢QJÅáp­\¦P*à÷ñx=DBM”Ê% Å"–á>ÛÄ¢Q4Ý@+—Q…U+V¡é:‰™)lÇž þ¢•‘ Ótƒfù}>2™,¦m ™œœA…—4?m:.þÁQ÷¿ô²m4É0]4˜)š,onzAæ?0åUÛØ"ठȑÀ ÂJ¹¥+ƒª^¤€B•¿zBü©G ˜Ò±I”u)x#2ZÆ"¼LÅ‘)g,BÝ fÁ!Ô¥ e,"ËTŒ¼û cÀÁA%Ç!²Ìƒ–±ÐrzÎÆq Ô­à*”3ÇCrÑ!YÐ1 û9LQ P¶ÈèÑp/$6Ⱦ¼ß k>.~¡’ÙCôÇÔ±,“’%½ óD÷:<™ÎQ(ë½ü~/ә⠗Wˆ3<• [( ø …üL$ó'dÿp´,áQ=HØ6˜Ȳ¢ˆ*{žÓñ'X6‚hS64J:ø Q”QD•tÙ¦P¶ñâ ‹ÉÆvDL $YÀ²G|N|ÉÕ#ሠ[>ÉÂ2ƒlÞ@6tp  JØ5¾®šõœŽE =x|LAÆ+˜”K:ZAc:«[¹®aýܵ…÷tÝÇoNÕÖöíåÚL‚Ó º¿†ˆùš:JŒ´6“÷sý#¼÷¬$Ÿ½cvmâŽI>rÿ0òÅ<ð>îšÙV[3æqëù×0Á?ünlÿ¤©Ò6ãD ò§ùQ6ûIûyëòo]^â_÷–æñó§ùùgß›yDÙ´(³Ê­–*¿ZníëåÊd‚æD‚m?ØLSÌ@ÙìçÑvÇzE>sŠÃ[——¸ù¨o^Ÿ_·ëÜÑú ò«‚šêöd2ɵ™D­þ ‡ûø'K¨Í©j‹Ó Ru±Y¯L&¸2™àF„y6«¶»µ¹eÉùWù%\~D€Wöõ5Œ™L&ùjo/« êWŸ^–Hð²D‚»¡¡ÝEuíoi™Ç[ˆ¿ªò;4«ûúÆL&“\Ð×WkS-«*ývâí2 Ô>:45/ˉatvtðè®]†a¬Z¹’h4J àœsÎÁ¶m¼^/’,SÖ4NÙ¸‘5«WsðàÁZŸ3Ï<ªÇ–e¢iÚ1ùÕ}èîžÍàÜÖÖÖ0§ê¼ššš\ÁN¥´¶¶ÒÚÚÊØØXC»îîîZ»£ d´_ˆßÜì®*²B<gxd¤ÒIë BœH$B$aff¦¡]ss¼Önb1ÿBüêz¹¢(„‚A¦¦¦ø ®©‡B!R©Ô¢í4Mc¡2÷7yÓº » IDATÓr÷¼ãÿŠU6'½,ÊŠ“Wá²#"Z`Ú­ñfâþ?xÃ0xÛºg½þŤŘÕ}\ÇÿëVe˜:çÿ—/×Yyj¶ˆ*ÈxDÓ²CTUeõêÕ ¥Ô‚1›¦éf«®8– ‚€ê-ÒÒ¦²~CËzš‰µ †¼ˆ² ™h†Eײ6ÖmXEs[Œ@(@®P P4%•Uk;дÓ3cfA°ŸO¦¬Èå²/i¾¯Ç¦©© Y–)—ËYÁ“<­npn#!"¯Ê³|K˜æõþ %PL ¬ ¸ÿ¥¦f‡tB`Æ¢s§^  !I89à†êß±ÆÏýE"kÜñbužk„æ 2þå:[¤†µW-Ú‡tf|>º.4æñÓûý ü¦¾FS“Y–(—M„¬TÇ70ò*“[´l ,×ñÚ"…¬ ¸7vMaHç`F’è¾È¤\6±m$ÀÔ>µ‘¿r9 Ž7ÊóæN\cËj­W­À÷Ø$¯k-r»ÕÎxÉϾQ}ãÞÉ!RÓ p t´ˆz2Í®¢ÊxÑŠÈ÷ßçáuaÕÑ$??ÜÄ%-#ì~2rLûŸÛlpú •Uoê@Þ›à í%îÔcŒ•TöiìÓðMM‘šÎ‚ãPHA°YäàS9vÆJ*("ÿ}Ä«O†µcY~Öæ’–=é;¦ýw´ØlZ&ÐýÚÞ§‹¼±ÓâŠ*ã%Ñåëø¦s¤¦K`C1&C½%K›ŒEPDn¾^u²Ã†i‹[¹{Bj°¿…€@ƶdÚÚbx="š™Gõ€iÈx½ÞšÆ0 J¥¦i"I6~¯êÃÔMüA/†a¡•‹ˆ"x='Ÿ¼ž‘¡qÊøU/ÛÎ: YPý6%Í “7^d>>ØÖÿÏÞ{‡ÉqVyÛwUuu3=yF£É’eK²28-Àx…]`Íû–`LÜ›waɬMÞ%XÌÚ`/°$³Æacƒ‚%+Ø’f4I“g:ç®øýQÝ=Ý3=£`dø.ö\×\Ý]õ<Ï]uº¦ªú©ó;š‚^œ¼føBß(ðÓhšŽd‚[ |·×QÆ7qÊpöÙ]Œø°õ¥k°IvwžlÄõrÅñ7²ñì4¯x}-m–X×ãàÁ=‘ ñÿÓÇf94”Ç'¤yËe~Öõ8ð‰¦ä$ùƒ2S²×–?(ck2°5è‡j¹à<+ÁÀRÇtFàȃ¯wð²Í:kzà±=z…øß±Ë:ÄzKxßTø;dcã…ÞüÊã?5àûõ°q3tõÀÞ=•âÿ¡c0<‚шµ®«§ðY¶˜ÑbÈRV_b/𫟼Ù<ñÄlß¾M›6±aÃ~øÃ.ªh¿ÿ~Ö®]ËÁƒ¹öÚkÙ°ak×®%óä“O–D+O>ù$tttðä“O’í|~Yÿ×j]<òÈ#g„àÀÂ{–õ£ÐÍ}÷ÝwFø£££ŒyŸXÖÿBÂÁžÃNþãA?’Œ[?²‚ÃûliR9ï\ÄBM„g½hš‚‘5ñù»h룫N¼Þ2‡xl!š6ÅPÒçÒë”xdOw ³ãl—õ¿pðÈsN~°ÃâßòÏ]ƒÊU×8‰ÅÏzÐr ư‰¯§³Œ_Oö€‹€¢ë1}-=ØxâÙÌ2üÅçÿî…_ÿÖX“àßþ©ŽÃû ³Nå¯u×|„9žS95¹º¥ƒ¶ #h*x}B»èJœ+/ÖqÎõà Ø9¸?‰7ÄÄ2þÒþŒÙøÌ~Ü c|ýfkÿÝ~•³'ݘý£(s“˜<¥Í²ûm±õ•Hð7}›hßxM’‡ŸþäNÄÆZ¦ÖÕXnÿû9¾qþÊSæ/öÿÌYà'øúÍ–ÿÝ~•áÚEûÿ›×¯gë+#¬Ø¡TÝÿá>³GOÏÿM÷cþ¬›¡§.ù» Ý+enÿdÝÑÉØ¾Zèn“xùE=ëZ¸rãî~Ô  ᬉ‘šYCà ûiûÿGýc8~ÝÂØ3*/½ÊKG«;?—Eµ·3õ\GV6›¡c]¯{Y?zTSSÈæóhšÊÔÔä_5EûJºººèêêÂívSSSC*•â¹çžÃ0ŒÒÜÇÊ•+KŸ‹q©`ÍŠ¢X*^å÷û9~üxi~Öår100Pz/ËrIg"Š"^¯÷¯š_—8B6ŸÃá–I©™¤B°¹†\,M&£a—l¼¹k?±>ûÁúëñydL‡Œ n¿-—#ÓÔÖ‚Ûé&k*¤Ó™ò_×z?÷Î¼æ”øßèxËIñ“‰Ô ù—×ü”G’JüOz.;)þøúëOØÒíej8µ m±/;ÿOl•‰Nž\òࢹ®ßô§‹?¬ÓÉDª$\ÒÞÒó'‹ÿ¬ð¿PxžfôYg}"Öû2;cþ?IþóÿIòÿ”þ/®¯1£Ä„¥µ„À¿uå¦É¹ZXβ=¹3›çqªë±Š9/mÿ™ð1þ9¸íZ\ÝÈï';¼W÷†ÅÿÅøç¥øgÚÿÅøç¥ø§êÿ«\žðú#8lˆ¢É«ÔïókÛ;–ýþ¿4±Q2H$2²ëo‘IêÛ<ê}ϲü?ßqJü“¹þùçÍ~™?4þó²üëŸðœÿpÍ5ñçúÈ·UM²4U¶ìnÎ>ûBòšÓ!¡u¼œw½éµìÞµƒÃѳ‘"ë;ŒF4IÆK`¤s¤bÏ `bëy?A¯Hÿx–¶³_N]Ï6¢»o!ÛxaÕøscp;’( !€n g÷°vÝd5—CB︄÷üýß°s÷†Vcslèq2΃š×C.& ÿÁ0‘{ÞGÐ+ðìqhY»®æM„÷ÜBÊ{iÕøsF·#š"€n"e÷pÎÚ Ij.'vy ï}Çyúq ² É!pn_7}(ªI.üÓÄÖ}#µ~ÃÇS¬8ûb×]Nä7Ÿ#×ür$E%~ìGŸ^ö =Ãf+ýŸŠMª/ì/ûE8‰{µb¿â8 V^¥¼*Îrv²íŠc/l_¬RrìØ|ºÜò÷½ *!­¼ÒIyûrëíí娱cUÇ+rÏÉÔ“ë×Éa ùlµÖ$M®_ǹJâ9wKRÖ÷4+Z`çªr¡?ýÊM‹äú­×òqÎY©ýÇ"ÖÅÛq`[áäÈ\†³æ+ZOoa¥Çš@ïÍ‹°Úªd}dl+œtÅ{´‹ÔêžؓŽâÅzøRÎ3­m´b‘"ë}ÑLhß|· íH¥¤Õl…ic\Ð*Ö¯0mÜ…¢ÿ…¶Ö+-ªÂó•ØOÔ¹qre¾h”-ÿ¤Mƒ´¦²Æ#q8=ÏîÉýŽAçË8ž!o»¬ñ@ZS± 2J>=/X/Ú¯LÚ´X削v89Yòïʇð9¬ŠIk|KŸŸ¶Ö¯¯h_ž ØwW>ĮЊeåöðÓ1bÚ,¿~PÅ©$ÑOÊ šR™àåÝ9~7Ô¼ˆý¦‹VñðÓ1ëCÌ z“ìóÁV¢dLº’„غ’,­Ï] A­‘ »Æ‰H)~~XgG«ô×>ëÌn€Û}6‹Ô8X*5ºx'¼³¾76ÊÏëôfM޹„Š6âݾÛgGÎúß{Ã&ú—gÆF ŽxYë•8–²²:¹ ÿYëRȱÔ]¬õ^»Ìñ÷ÖŠþKÙ±Ô]¸p!”Ævr7½Þk¹ã·ûПiå¾ñ!z$ðønx… ÏÀ'?`%0ýõ‰ùï÷ºë$®»n#·ß®sßø]ÊÒ eîýUŽë±’|ëÏe¯9ÎîÛ[‘6ï³¾£ÿ’mŸ sõ5¤€C~´‚ÐëŸ?nßp5À=üü>*øçþÝâ ×{•#¾í-\² ¼Gï±ø÷µ"mž${û!~3jrÿa“[o½•‹ }nºé&îØo¸ „DÓ_™3J¾øÕ€óÚ·=Ëý‡ç“|íJ±Ô¦hzÈàÖ[¿È­·ÂwÞÌ¡c&¯}Û³¼²CÀ÷Æ7•ð¢(Z>;[Çï䙎wXv;‚ Ðє¾¶ ²šõ=ÅÍAÀ´‹Û\lþãOQØüw­à—Ñó¢G,™¦iUÏÁª¬YœÔ+çëÈ\™ùúþ¶‚ßÕœ¡î¬ÈYITÌ„Š ˜‚v@‹Wî|ITY÷ºDŸŒ¡˜¥qO–¯š׸vñcåeüîæ4¾BΪÆGBCÐLLA@|M6þ^Ø,謾Ôè±¶<ßi·“ÎfP5ÞUg“ˆÌ¢h~IÀ.xê8zôhE°^,c÷îÝ8ePòyšд<>[C+N§“„ÍNxf”Ð\ŒÞU}¤aD]@UU¼^/3“säÇ~¼È‹üúEüh4Êž={pØ@U*ùn_í<ú8¡PŒÞU«–ä×ÙdR"¨šJßêsˆ‡gQU ›$ ‹àkj¨Ê/í¿¢ÐÒЈ®)øÜœþ .—‹„M&4cñûÊøŠ¢àñx˜›‘W”’ÿÓÙw%È?ÞœÄãp`“ܲ ©®†¯}÷k»J#²œ$q¼‡Ÿ>ÔÇýb6IÁç‡ >7)»“¯Þ¤rç¨ð¿®9 ÍM“H6ѱb7Ù¬€)H–hN„¬¢pÇ<ÜðI`œ’ˆÝáâö{†XÛ-/âßûÐQ4<®8ºšÁçv£9jøÒ?ç¸ñ³R…ÿuM%/`¨ªåÁÄ&Küð—ÓUù<1†®©¸i±‡»¿–/þS–÷}ÎVá]×)YÉN:VìF7pûjÈaMº´î*M¾H[Ï!»ý9&¯?§´¼øZÌxY\_ü¼æ©Êì€,wa»Ã\Èä–n<;ö•DãÖúû ë¯brËZ÷®xÍ2*f·?Åäõ›­/Ž“Ý¾—Éë7-·rûÖàÙñÇBFÄåɶï%tý¦Òçö*ý«õ+¶㪊õ¥v…ŒŽlŠÐõ›X9›>%ÿóØ“þ²bFvÜÅ®ž3îö¨ðo0¸÷ƒ{àz÷›Î¸ÿÇÊ.ï¡-k¨Bƒ£„G¡ïu§ìÿÎçFQ|.ìÉ,Y»†’¤Zü˜“iò'¶|ÅçÂ¥äKâc2M¾ÕSúì.fé-Ë*XWîða¦ ¡™8g­ ìt €âsA:â³Dû(àK„0ÒF ÅçÁ–O¡øÜ8•lIü/€1GiõaO¦Q|žÒ+IÑúd¥Õ‹‘ñeêãa”°š/ÜC9Añ¹!Fõ¹‘“òvb’ ’)Ô€#oí«LU´b?Õ熤ußãÊYí²Këí~äd†ŒË…q$¾LÆQ[}$Ó3œÕÝÇK6ldbzš»wáó{I¥Ød™¹Ð ùlž¶öv2ù,±™55µœ»v=º®±çÙ½DcQb…ŠíÉDŠÚöZ’©$N§“\.‡Ûå*U¨s¸œ´6µ0šÃåt’L§þªùŠ¡œ¿hE¾ôì^NÅyòÈ(g×»ÎøþWãÆUž9>G§ûÌû!ϳ{™Re‡Ò4ž†ÿãcŠu_e˜‚Ab\G­¹ä¸Šaˆ¢Hb\AÕÁ‹ AHMh˜†‰ ˆèºŽ¯M&UxH'Öÿl ÝAìxŽš•NbÇsÚ€I`¥ƒÄ¸B ÝÁdHÁï€bNkÔ"±œI­ÛF>gb:‚ 0QIMHÄr&ñ¼FS$šÕ1MæZ3±J~k‰Pž¶syZëL ­ÁÁTXÅé9–V©7M&M“)M£É™5 šD‘tÞÄ4TA`0£Æ™5Mæ²:‚ÀŒa`* Ý.‰áœÅEë\Ôë‘H)ôy ¤òôz¬å}™ÁŒF»C$§äÁaî¢éäMð9LDÝÄ4uF£iD» Ó0’iœ‚„KHÕ DY Õ)“PTü.3ië{òË6òšJÒ‘ ˜¦sQ40€”fþðUpˆKðMF£9D»°ßD”)ãËe|¼f’4ÌeøœòþÍ0²ºÏíEˤÐòi:‚gÜÿµ5Þ þ\òõ‡yþƒ<ÿAë¹ÂÈÞºŠ~KU›¯ÆoïPÃGÈÜañ§ßaÍg_¾’·}6ÅåW¼¥¢ß#?ÌGJÛ~ÿdŒû'áªÿSB~ñYHÑŠüŸ ôs¼0µæ~§5ÎÖ…üÂOžWWá?Ö;_µ¶È_X©¾|»nGÑ~6Ð_zßm¯Ú¤jÛâÈ'ês"þ{úçǬþ4ªzÛâS§bŸGO“¿m‰å/´m5Ëd2¥ŠÝçws³³Àü÷U__Ï=ÿõ_¬^]ùiçÎ\qùå\qùåÄ ¿ÇŠýN¦òx‘¿jU_‰?1nU9nhl ÇïçÑG]Ä?zô(çw^iÛ£ÑÑh¤Ôo9~±ºzÑŠümm¨ñz[A”ï_À ‰¬wîܹˆ_nE~µJõKmGÑÎ9çœÒûâ}ìRVÞ6•JTŸñW®\Yzïr-€TÞ6›ÍTŸñ[Z–º:ݶKmCs[;Ž~b Žÿµu&+_ÚÎgP_W9 tÜ6ÆÇÆé©YÁÍ—÷ Š:gÛÀ)QÂÜ©ÿÚz^æ„Çwc’Îõ ,ðu0LpI„bê¼÷ü&$Q§mU9SÁåtCüÔŽÿ@°ž­ŽA&ÿ½µÚÖ::h Ìs‚a]W'FÇ©÷5qÃK›Æn/²WF–¬ùŽ¥ŽÿH$‚ªZ•ív;“““Äb1êêêp:455¡( Éd’t:]êëóù¨««C×uV­Z…(ŠÄb1sss„ÃaZ[[±Ûí´··—c¤ÓéRuµ;wRSSS• ÿ$|Y–ñý~?ÉdrI~4­Øÿ|>O*•zAü‰‰ 4M#NÓÒÒB2™d×®]xV›„Ãaìv;N§¯×‹¢(Äb1l6š–FB&WëÄápàj*F7£4z$Yaf*ÂÌtŒT*ƒ?Ð@k‹QÒÐ…Ø2¬èt¬]‰Ãæ"KÅÈ)iÌì_7_¬'"( €€Àz‰áÀºCvãnHã°ÙH$är9¤Iªš\lÚ¼½ÏÌðX™äð£­x5ÑFjÚ:ïþ˕ֽÛç²î%‰4ú [ŠzȾˆ?t¿ è€ Ocf ¾“M›ûØûÌüýÆšh”ÃÔâm²øÉ)ÇIðÅ2¾L`½Ä௠@ìx›6 |&eT5ØÙ´¹•½ÏÌÇO­Q?lÇ׬ ˆ˜´/ÁÏ¢IØztÔÁÅûßqØQdãÕ-„žOpç§u®D8åmÿSÃæ@òäavÄÆ˜?šÁ7:¡Ç ÇÓÐ蠭ƺGØ´y>:¡ÿ›cಂÀÖ+ê˜èÏðã ¶yþáo¾ÏÅ–@ªÀ7˜•ó{A7ùñõ6èrÁxo½LK¡ìæ¦Í}Uø‹ýßœ4qÊÖïµs_!3=¨r÷ZÁ©?Ç?Üocs@³ ¬+0;c² ¸ç]F‡ 9ÜA‰ŸZà·øeþ?N·‡L^%—W© :]`¦R‚Žªª¥$(^¯§ÓI<ÇëõZ‚ßH–¹¹š››I&“DâsÔÕðù|hšÆáácx<>âSIbRž¿?ˆäT˜š¯Tå//É›äò,àSÆ×ðzå?‰×ëfíÚ®2~ƒÅO¤© Êø|öG"Ò‰%`çï#9aj¼..8þAÁ±N¥³+Wú¿zYo#?zt¶ð)Aþ ßôøÁ(«~H)1@ÑòeÞöa#½Ö9¨¸.“É[•J—8þ! ë ³k>YÓÆ^¿|´ø9o‰ê}óPâ[‰Jv^ÿaéµÎAÅu‹ù•Ç?¨þüPݽðÛòoþÐAÊøVb€ò6—~F ?þŠë2ÓdÉó«¢}1Fàšk®á®»æcŒŠÕì‹Õîa^_Þæ{ßû×\s @iÝ ýßðbóø¿ãLó—÷xLÄfƒÙçë™x>Á—&i}iŽsšdBS ÚÏšCÍ×1Ü/3ýħŽâ jDçšPÕqôc͸7Ú0ô!T}-™`ÅK:ß=Š¿E=¡ÿÃc"^fÿd|0Á•¯HÒr~Ž +dBSqÚ;Bóü&ñ?à êDçQÕI¦Ž4ÓÔ#bèè3SìO¤NÀ¯ôÿôŽ„²,Á¶‹“¬¼Pak§Dx6N{§ŠÚ%ñFIà*ÍGüƒ¸×jÄv6 nžbçs-¬m1j"<:7ÍDZœÜø•¼®¸ †ì®ãÈ=aŽG¡qžÖعg€¡ÙŽSä/íÿÈb¤I±ëQpµÛøÀg5x-\ñê¿uÛ8þkñÔ‡à?Ù`šÉxkYįæ"¢ ¢QAÅë0eKÈŽibØ Ä¬HÚ0Ahy‘„a’”u@Bм‚ˆY˜«5%“éÌÐäÕñÊ&†ÝÄm@i'œSð nˆÊ™å·þ…óËͨ%=;K5óI†ãñRU{§s~/—«œCinn¡.`zzŠT¡Øc.—!Zœ¼º¨Ï_#¿˜ìPEü~IÓÝÝM<'‘H0;;K$¡¾¾ž\.‡(Š¥˜R»Ý^JÎ%Ë2ÓÓÓ…¤«Ö½{0dýúõ âp8¨¯¯§µµ•ÎÎNòù<###ÕüÌ(/YCæ÷ª»>_õ8%û¿¶/¹î÷æ{˜õ9P ‘Lnžÿ¡‘ïZ &–ìzÒö¾Ñ•âÿÚýæ5UùŸOýÒjP~šuZ?~ª(æ®ñ+J|˜Ü»cvXbÑø­Oqât¹K[äѧˆT]3Í£jü¡¾ë)à)²»ª7?iËnß» ¿5î![-k5K¼(þpÀ…^G!ÄI>¸«f?¬Þ`pÉøÏÓò¿Ñâ€õgÌkÒ^4ÿ/ÁÑü¿ÿtüRñ·{—Þ”…1Ðg&þù)‚—_•_ŸÃŒ~ Òoþ‡ªüÈñø‹ÿ\´à¶kÿ,ñÏÕø/vüóBþéÄ?gŽÍ_D»Il"Ì -…÷¬ÄL »iCUUb…Æ67ÿ½·ûÇú|qd-ΠM7‘•L"…îðb·«Ø±cd ê øÇ£U¯'ÃÿúØ:>Ø~°*ÿ_ö·ŸqþÇ÷µð¹SUù×íp2Ÿà|œ¸9ú-nºùV¾ÿ»8¡‰8æø·¹øUãw÷ Ûn"„„˜4¹ë‘fã ¼õµíÜýõ‘ìý8W®2øÝîÎ ðÌc_QÂDþœ’@‡Wü+îX QQ1R,Š?÷ …Oú+Üñ‹!Ž›>8| ¯xÍ¿ðØÿ|Ž—ÝÌœiCœLñÝGb ×óoìå®/}ˆô†Ïpé–z:’eK›Ÿýü+¦ªc8$Œ‘ÛøÃ¸€¤©4o» I)ÈPÅŸ‹Ç·ó‰Ï}“í¿ž&4Æœ¸ _û9žüå'Øtчˆ%4¿Ìþ|ú>Â?¾®‘»¾ôa2>ÍË·¬à7{b\Ðc°ç·ŸQÆ”$ô‘oòô´ A×éúÛÏ Ng0EL&Q[O®Ðõ™4Û‰›¬£4ã[øÜÚFMÌ¥˜œ<¸( @ÑÔ„a%ø ¶…¢ÿá¡¡ÒkqÙ©ŒS­}µuÅeK‰÷—²¥‚¤ŠvìØ1úúúèëë«Úv!oÍÎ@I˜_MÀÐùýl IDAT_4ÿÈÏ.¹¾(ð/& +I@19@5KíT‰Eâ4Œ“ žUèhã¹Eí‹âïQJBÛ 'SûŸ¥¡î,ö3œ…õÃü¬7Œ5¡‘ƒñF†ð,‰p×’âýå¬(Þ¯fã‚F;K‹òO‡·ÐNWô_ÍeYÁ†a(%>€Ç¶XÄ_ÿBÿ´¦Òf÷3òtãä0–§uÖx<âⱂ‡M/‰ó}Žú IÌ¿L€¢•÷;œœ\6i@y2€Ülž‚0¿\À¿”½¢/ÄÇ~`ã ×äxy7’þJ56XÕ`¿ôÞ:>ò­ÅcxRÖáœr„7ˆ—–_gšÜ.lsÂí9ö ¼Û<Æ–­ëJm"#1vÌZmmNÞÙÞÁþ½ƒÜ.ƒN!ÊßÎÖ!5ºx· w€•X `û÷j@ÌjOœK”ÖÅù'²jÇ_1y€• à­ôz¯­HPžXÀ…ÀDê\ÿÞ`}w7¼Âä¶Ç®¼ÜËmXûøö¿©;k^ÌšÔ¹·4f­wo¸ý{’Û·ø70[Ú }7rÛãÏ Xvhh?„Îâ¶ÿ9߇[o½VÃ%«aäÁÒùª/òØŽÏrÉ«¾Àñ©±²¥2aE%ßàп'é,´ßÿÓòº´–ø%á’mŸXÄï¼à+QÎ%p1ÖßM7ÝÄ­·ÞZzøÍ®[xÓÿÝRê>2çÿ}?«œ®«ƒÜñ…u4¿þ@©ý‡nº‰÷}ÚJp÷Çj™€Ò:ÀJpXàÖ[oALÓ¨³ì˲LZwÐêËÐ5ù Gë·!Š"¯ì¿î··CJ-bSA7À& xlÝn\éIÖ¼¢±ÛIA³D6›|>ÓéD×çÏŸÕø©”6–s“`·ã%ˆ¢È›#?§ïÊHk%¾Ó0 AÁ”t8ñæÃô^à!ÐႤzZü¤j£½&ÇE±Ãì0{E‘¥?²ò¥NÄ´†©[¢)®cØDL—€¯ÝN@Kѱ |í~„´ KòEQdxè«ûúˆ%’ˆ‘H›S&‰R 29Æét"ápÇÃÐÐÍÍÍ:tˆº€™H˜Î•+%›N‘ËåèZ¹‚hh–¦¦F”œ‚ËíÆérsô¹g9wóK™‹¤éìYÍäè1º::,¾ÝM´ÈÎóý~?‡ƒd2‰Çãabb¢*rjŠ\4B.—£­¹‘hh–ƦF”\~?žRéìYÍÔè1Zšš‰ö?‰`sÚ‰ÅâÔÖÕ31¢¡¡¿ßO:Æãñ …hiiáСC^¦Ãst­ì  ›#—ËQ_ë'𥩱%ŸÇívã*ãgÎžÕ Ð¹rÉTšßêÅ&2%ÿçË7éÜx˜ÌxW[mÌÏÖs’Üý3—Ë‚NkK “S(ù×~ÔG{[ ‘H§ÛM<–  â÷y¸ñS{ØñÐ,{ïß²®÷o~ÿ -õµ$Siþé‹>t5‰Xæÿ±éY>ó~gUþOïS±‹W2´6·0 £æS¼ëã>šêˆE#xü’‰55\N;ýâóÜ÷‹Y>ðv‹ÿöÆi¬©%•Nó‘/×IÎ"Ù¥’ÿg"1>qƒDçÆþEü_=œEËgPò"+ZZˆ%’dâanü¬ŸŸ‡x,Lm°Žt:CÀïCE>õÍ~r÷,ïzÓ…¬ë=ÂÛš“'_z¶¸Üþlq‘Ýþ#[Ͻe(ç_HvûsV»=Yo¼°Ô¿Ûü1ƃ۳‹ú•[vûsÌ­ÞXX¿x‚$»}ooM¦ÅÿóÛ7¿~dëùã>ÿ*²ÛŸ*Û¾m¥þÝæítûÜžÅÓ‡5ÙRè_š@9ÿ*Øþõ[\„öd»q[iò¤Ñ¼zc¡íÙEý*¬°}¥Éœâä Xãnß »ú”ü_´â$YÏWi¢÷­öŒûŸÂO”rÿMÙë<óþÇz@Xáÿ“–EßÁÉøÿ¢:ŒÉ4J«c2Ô`‰$·€6œÂæ1&Ó¤ý›xâqD‡@&À˜LãòId“:Ù6ë³à÷à4gñ'Ö1,ñ¿;ÇŒTþö0&Óä$/¤ÀSØ;,«š:žÀæÑ'SäZ½èà ¿púDr“Ið‰“Ir¾$Á“°ÆI××A8Ž¿Þ†žÈm«%q(ЍÁeNâ4Sd' ëûœL¢ú;raºDÊÄŽ û$Ô¤N¶µ ÉœŽ)dR¨ªßoõ[ @tJco°Ád µÕ‹r(j‰ÿÁw2I2‘äÐÑç˜ ‡01 ÖÖ‰Fq¹$ó÷áP×f§R)²¹,×®çœÕk8pè ¹¬`çv¹m2¡T¯×K]}=~¯—DAŒÒÕÜÌÐÈsssˆ@*“ù«æëëO‰_´£ÇúKüƒS —ÍŸñý¯ÆÜuàÏÊŸ:tì´ù`âo·“S0L£$Ö,Á»a êkV:‰ŽfIN¨øWØIŽ«ˆ’ˆ§E"5¡‘ž´’3Õ¬t23”¥±ËAr\’*¢ ;žC’$ãó•[œ.‘zì„S*. +øÝÊÇIkØl6ÚêdÒ*Ó–:™éˆ†(‰4”<ÌÆ-~[ƒƒ£³9VÕÛÉç «ºfκǟ˜ËÓà³3V+ø>—D+0¥iø\¶B‚3k¿' ›$Ñ絓Èh euzÜ6†²:’(ÒíÉ(&#y‹ÕçuПÌÓë‘­@&oýHåi³ÛÌÌŸ‡v‰¼nÎëØeÍ©ñz1Óiâyz·“˜¢á± Ô8]dò\6‰V·“#3IDC`6§¢›&.UÅ£¨D%‰°"à±ÛiöÙQ]7Hjš,"¢ Í>'ãÙÔ_ßÀ.S…//ÃOUáCT‚°bⱋ ø&š,”ñí§ìÿãY+"â¬Oiÿ‹¦¾þ/¹zþÉùŸ ~ª ÿ…ùSB–$0u Ã|AÇ_À.’`bš IyÁ°Œÿ횈ËnÃ@W_Øñßൃdæ[Á|:qÝJB²”ÿÓyŸÇiè˜/èøo :eÙ)€®Êkèeþ/·öŽöãÜ$ ]ð.z.}ÓwKëÏþzÏó]žÿ ¼ö~+Ø¡øLãò+®àƒ‡¯`xhˆùD¹™lêXE•âë‹l``€Ÿ ô㾸žÎMÖýÜÖÜ_禰Åß´¯‚_´¾¾>>05?Î…LšÍ? 4à«ýýœUäopï¯ìðê'‚<Àq¸>° ¡ÀBþ{{­ä°—<¨ñƾU@峘Š$ÎEÛ;ºÌ`¨pé,Šúo~÷ûJënùÎ7µ+·Ÿüæ~6u¬*mo5ûjÿòüâÓ£K ÿöß¹qžå7¾ÁÊÂòßV™Jþ·î/øbiþÉ øW¢]½êªÒ²•±8¢±X |¡·{)[(êÅb¥u555‹Ú•ÛºuëØ¹sgi{«ÙêÕ«–åEýÁZ«K6WþœÒÄU¸FF¢Ñ…]YÕ×dz…ªòKñOVÀïvYœ©éù0½@ PZžÉfõiinf°pÞZ*CwW‚M !èàRì XßãË¥ç‰Iê£5ôvt2:6q•€Ï’@} –¸”avd`‡Œ«í\0 FæB<üÈ©ÿ¢]¥.`c“¬ÄWùFÉ;"JÝ0L2É;wî<¥ã_´›ý"W­ñòl²¦°ÿýdl3ä“vÚšZ˜EHê`š˜~\ “˜ÊãkÕpÖ´B^GË«ô÷/>§ÿ‰‰ <­­­H’D$Ajkk ¥àfÃ(Ì53_4ÁápÍf ‡Ã‚@>ŸÇf³!Ë2™L†|>O>ŸGQ¬$o™L§ÓI}}=^¯—ÉÉÉ ¾(Š%~0<£|ŸÏ÷'ççr¹%ù†aTåû|¾RbI’¨­­EÓæ¹ùíhŠ}OÏŽ&$§Ï ­ÓKN ³¢­‘x<ÎÜÌ+Ûû¨«ktœ.‘`½‘±#8d'w-vÙƒMt€™#—11 ;>Ÿý¯š¯ë`ëNáœmDi‘ËÙg™h2sà¬Oƒ)‘ K€‹¹²¾Büß¹Ú`ä¨5£‘žµþ׋cì}æYœ³Î#µmâ¸:bØínt]©ÂwTˆæÓ³àjÈ€)‘ ‰¥í+ÿw®‚‘­SjƵ€?ÀƒsÖõ"¸Â¬Â×pÎúQšär*`¯à§fÀݨ€ ™9¡´¾\üßÙ#…ËlrÚ¾€?ɃsÖ²ºvÇÝБÁn·UõP×À!ÁPÖxF˜NA$n•ü+kÐØ³q ¼&w^oÕ„‘4¨:¨&_ Ð垟s9‘ÿƒºŽË.Âh¹ÁAg96Ñ,¸Ý?gÒÔ3q ¼ðãwŠÿx¶Àùâ Ÿ.¶ ¿ÒÿAë7àñ,¶z;íXû â\!¦ÓúrÐ䇙¬6¸çí&¨ ŽçA5@ù·£6º½FÞÿ¦±X§Ë‡Ã&DZI N—D2m=V…|^!àõzE‘ÚÚZ\.ª[ “É‘Ïç‰F˜"är9LÓAh.A É†èqÐÚäbzz¯Ï‹`dXٙà =ú—À7qº¤2¾ŠÓÉ4e|ìËó3&ËY eBQ@?(2Iáõ9Œ+ÛÁ¨8þw‡ã8¶…É”ù Þr™ŸrË”q¬Sq¬SKïç“$JmëTF†­ÿù§Í––kƒd»­êñÿÜt¶ip~ ¼~aÑÑ¢à~Ýüûùäùù6XëF†ËÄÿ…åÕùÖñ?<–€mÖ¿.= þRÉ,¾õvèe|{¿øü°uóÖ·¾µ$p/V½/ZQð~ÑE•Þ/%Ž¿è¢‹J×±{î¹§´|9ÿ·ø×rõÕWÿø–ÿ{š·rñÅŸaþÒþŸÈ󖛣líôÓµ©Ÿš>‰³œs n$¬¹‰Gèz+u-* -Ç™x~ùÐa¦=øÎHe"˜«›mŸ;ÓŒ£ûTlÓÖo!]×—õ‘þ ?] P’8Ë1Çà¾F‚‹xTF×[¨kÑhhcâwkɇ0õó.|—Zü†æF¤ˆÏmÁœKⳫ¨±ñ-ÿ>Ÿâ-7¼¼:/¢& »DâNc2†î¤®U£~ã4Otpoä(¯ýV¾¿1I3èðé´t˜ÜùD7‘tŠYQÅ“,ò“ò¿Ëí§{ýÍW;Ø™œcß· wÝJƆdn¹,ƪ›ë™š`×CkI§Ž²÷±..u˜äMÿ~rµÍMìŠgÈ–'§ûÅOÍÿ/>¿Òÿ.7t¯bõ[ëØ™ 3t7̼ÙËØÌÇ¶Ž²ê™©Ù,»Z]â¿Þ®Î¯3Êø§æÿŸÀ«^jòß?O‚×Îc?O’:"ÁÝ ¬Ù<ÁìcєΓ»DÖl80•ÅPu\^“ãÏm@7Ò(†zÚþÿé>8ÿøþÝ †Wå¿Î"õçYü™Ç ž?öCï:è¥O“_Ýÿ<çl…onQkežy, “Àå ¬ÙTÿü_ÿÿyý_-þ¶?;"./þ+&ºÜ”²~§½ì|\ƒ­Ýˆk\Kˆÿ\ƒN\ÅÇ–—ƒÐjì{Añ·Á7¾ €ôÊê¢ÿr ® ”ÚBàð ŠþKóÿâ§zóö¢øÇÒÅ^OÇÿŽWÏ_ò?Bzonš©P Ñ0¸Æ÷pÍX9yýÕÙí<´hÙj—JåPSyœ;O ñšZ±êõ·ÿ=+v[5\&—üçÏ]œdüëáMËò˯¿Õøÿºa¸rÀÎ¥ù·o[|t|üèÊeù`Å‹éÛùü§¿Ì½»“¼r£ŸÿþãçÑrOþÏç@3ùæ‡Wó¡oŽ’ÎÅpê:ǧnãºË¿Ç}Mçù?Í¡ÍA5%v?ùUDÉà§w‡¿{Ëu˜v AIÓè´©¬X`Ïã”¸Åøsßè-|å«ßâ—¿™ä²ó›¸ã;ŸÄÈküîŸÁÔMîøçrÃgª €bŸúï{ÍO¸ëKpðgŸ`ïªÿ‡nÚû1$àÞÿ¹‡«_÷V$YÀÔÁpÈÔÕzèè¬açïŒEñç¶ä|ùk·ñ«‡xÍzÿ¹s;f^ç÷¿üèð½/¼„÷~f?s9;^ßñ·ð¾×ü„;¿$qèÞÏ Õ½›a²§ßŠ—ºïwò7¯{+¢]€¼ŽéhÓ V¾¤…½¿›?ÿsÛI$¨ ôhmµnÐe¿H«? ´299Y‘ µÕZ6—š†K&øK´b@ÛÉ ÿOv< ”\ ¸üd«â,´roo/½½½ËŠÁe ƒœª%XNô_Ñ·ûà$׿Xü>¸¡ŽÇfJIÊ­˜ `©DEñ?XBþE–¯üx¬X=~ýü²Þ¼H¬½‹y¼™Ê´†g5¸ ýœh™ù`cì,p/¼Šµ •bç1S¯ñ¯0m¬0mËÆLvA²þJ NGü¿°úúɈÿ×z%¥ôRßåúÅÿ` ù[å÷¹²èM‚Âûãy‘FYÅ#ˆIÀJ`õS+’ h’Š£l좀¿\ÌïsÔSÍ'˲ÞûZYãkeWy′[ëç”òdEƉDÿ‚Tyмáû<)µ$ìO{ejjÚÐg”’<ütŒ+^VÃùòûm|ì6ÒÚlIø¿”s ¼£Ȱ­ð¯°±³²æÒŽÙßí/åõÇyÉ[Voäö~+bä¨È>óéecg/J'üb$LDJñž}:Ç\oX#±í°^‘`)«vü•‹úÁúO¤~PÑfþø{kÕ>YÌRÒ€¢ Û}ÜðŠ$ÃÀ•—[wZÕÄ÷÷þÊÚð{9ÆÕ+ºùäÎå¶Ç”ÆØûŒÉ¦Í›6 Lÿr=÷NN¢?ÓÊ{¿€a»«ë\y¹·"1@±/~ì>ÛñY®½¡û¤øwõÏq|Jde‹Áʃk[î)ñS«¯)ñïÛñÙŠÄE»é¦›*^§¹¾bý§ÿ}!Ù…¸oM˜ß6x¼ì^âöïîåºwmâͯë$4y?ºý¿5¹øm·°£"É@±b¥(ІADlâ’MqCÓh3s´öB:7úü2d ,U ሂõ'‰‡¾—ùn©…F' $hlw“œ²ª‘J’„(Š˜¦YªúR?kÖqñúþÑ9Ôñgأˊu.ì^©ˆ¤ˆå±Šr 9®—¸Y¹Ñ vJS×ê yäÔøS¦Ÿ ÏÖñ£Ž ü6¹’æM&vˆPøŸÒÄÕ_E옚Aû¹&mk=èA¨Fm“@r¸:ß0 Z:zyþÈé|ŽºDD;éÉi Ãdüéôt6³¢ëlR©^¯—T*Ušôt»ÝLLM`©ŒFcc¶è9Mg|j†|*Šèô2;xomÙl–‰Ña|µ8¢gõZŽ ³ø¹ˆv¢¡†a²ë™}Kò=555ÌÍMc˜ h"m$ üÙp”|:…ÓdìX¿ÅÏiLŒMP×4^Á/ò1‘Ý>Ò‰)#ųŸ£§³™@kë"~0¤©©‰H/ÚÜüx*k=·»8~|om 6ææÂ„B!ìv;ƒGñøÏ·ò–ÇHgÓÔÕA´+óww­-ÄGºtZ‡Cޱî‚? ŠM„¢1òù<ñÚ4ˆ?'›UP•<‘cÝø¼ÿð¡0ß¿Åǵž!™NRW—_äÿ¾¾nZ[Úªòe¹‹L:E&šAÑDîø‚ë>nC7Mb +Ä|ÊÁ;n:N$$«äsÙÿÿ’å[Ÿ’y×Í1âÉ8u¦Íé®ðÿš³úhmYY•ïºíRšB<‘Bvdùö§¼ÿs2Šª‘澄 ¸õ£7|b†d6Š„šÉ”øïÿ¼›­É–‘½–¨¼\àß³eˆ±ikõ ”ž‚ø»8Y#m=û&Úûf:Í!kù.K¤^§Û7Aëž!:!ØâbÊÖŸ}SŽÖ=‡é4ö•ÄåÖö9‘¶ž_!0ïÙ²qcaûOàTnßÞÒøC{¯£ÓÜg-Ož[« øë ýK“U[χM9f÷^G½¹ÏZ¾Ë©ÙjKëë÷¦¾lûë·¸íuÂÖó+&xê·ì+Û¿“óÿªì_Ñ^ ÿë{ FÅ%ÿƒuí_øœÿÜ[±>´ë)(Ì[ÕiùßéÉ¥¿w<ŽK“ˆyü8}:9Á~ð” 1ŠæòI¥×lAü/x!—jÄiæpù$ÔDg­PF@h¬Á”MìÉ,N3 >‘Ôt—O$%È~?¶:°9œZ Ñ'ÆÉ¥D¿O<ŒèIûëpú’äðo^ø_nÎB§O$:Cª¯»F6ÕŠÓLáò‰ÄÒ^ð£Øß>O(ö¯4Yâ €Ï@QZ‘I!ûEÔDÙ/’dðûÁg '3Ȥ |Pö‰$¦MÄúä9ë¾?ï¯CöY÷Ùlžl.‹Ë颶¦–\.·H@á)T?š››À Íòôž]ôtvUT˜—l.ÇÐÈ©”õð±xgû¿ü“ç-TÆ/šÓåzøÉ?/?•þ“òý+ìL÷gø˜Bm‡‹Ä˜‚o…ŒiÚ˜Ì`ŒVA°„ýXéS¾2‚ ËSp;l¤&trš]q5 ¤§æûc‚aZ‚ù–:™h8O4£[‚ûB[½ƒÉ°BKL›ÓÁ‘™,¬@4k IÓZ·D$­Ašƒ6Z\2“!…ÉB§ßÁtT#ešxDÉf%ÁJ&†åý·¹hžÃÚ¾ci…>¯ci•‡HŸÝN2GJ˜1,þPV§I™ÒuСÛ%Ñ+Ê ¤Ž¥Úd™¡l!É— `—tLÍ,ø˜ ~À!" ›&†‘¼‘Ëá’%z‚v9IÑ2)\²„¢èäô4¦aàtJD2ytS «J€ ‰<‚ ñtŽz· ˆÿã§qÉbœNHÆ@7!«Z¿çXÀ7 |ç"~ç)îÑÂÉùýW ¿ ÇRÆ÷?>ÿ"~ÑÎ`G'•70T½‚¿Ðœ_³¾Ï÷}¯8~ci]_ßgžÿàÀ"{ù³¾¾¾R;ç×ö~¨ŸM 8K ÀÝï°æ|?x¸À-þÄ8¼<áØ¯~b€.Žœ¿0IòYï\‚_Øÿâ¸'âkÞÛ;„ûõüìŽþ’ð½ÜÊÇ(&_€yñ~¹¸àÝßüFÅçrñÿðÐ7¿û}<òðÃÀÒ‰ŠË‹þ(çÅÿŧD-à÷~£’ÿßWñ ë¶«®*ùó«ýý¥dÇÍù×"ãÃUø Åÿåâ~°þË­?þêW³£0ƶEÉŽ B‰±ƒêVÜž=Ï<³hÛí.‰ð ØÇÆÆJÉÊÛÇ^4V5k[a GF+Ë÷Äb±eù Ç.ŠõOÄ_Xý¼³³³*á¸'â÷÷°jU_iN” )¯ì^L¾K'(._˜ “É”ÄÿE‘?…çEáqvÁ=y6—[TY¾È_½zU)@6—-½Gö/â/ÿ—‹ûÁø/·>35ee!iiiY” “Í–Åv ¿Ã¾¾>¢ê8MbGnoÈÆ¡t-—¬Ï!ûœ;|ŒÞžnÔh9g‚¬ƒ O& ü4t:ñvy863J¯¿Žîfº»êOéøªS´»SÔþì½y˜Wyïÿ9UÕÕ{÷ôì»F³hó"[–-ÛàŒó»›\â°$0†—œ°'‚!xŒÁH `¶kBnÀ vÄ"ƒ-cKÖ2»4‹féžžÞ»k½TwM÷L<’°Éï±ßçÑÓš®sêSçšîª:ï÷{J:J š =/¤2zd”Áôå"žÊô­sQ ¦MS¯Jc¯éå9º}-ôln£R:¥óP Þ IDATÙ8A§/A¤¢­àh© µ¿ˆT™™œ¦»« #]ÂSrÎ!¶Á´i肆îñÂ2ÍR˜ÖÎÝ]uÏ€\.‡®ëäóÎ}X4Åï÷c“““nûlÖy¦»eËr¹¥R I’\A<8‚IUUÑ4ùùyt]wç:,Ë"‰¸÷aÍÍÍär¹çœ_)úþmñgªr«ªj]¾eYuÇ/II±,‹l6Ëòò2’$¡iŠ¢/$ š‘dgÎð‰¶ìyq/–ñÓ{ãtu·Šjôô‡(•t?}Œ…¹ áP3±¦ †¬0›Z&?†_ àó($$ÑŒäÍ>¯ùê`šÄ/ F{›Æn›Ý纖iÞíy€cµ¢~pV•¯6¨l¯nSÿ‡Ú4 „$¦Ãd u°Hü¡(P‚§ ©‡2?Éû¯*óã«ø#eþP@-¤Ìw‡Ûõ:|‹Å}*P„aG¤ßÜ+Ê|÷_Û¹¶Ìï¬1¨åÏ–ùÎ~#FßKÖ0ï)‹5‘ö$ñh#›Í¼áŸMÒ|í=AG|/D¼ðbü¶ô3vd–IГJð†;ùÚŸjP0x×ý H¼æÅ1Òs%þ²<Ã0kò¿š„›¾nƒ”ç;ïô:s¾~X…‹<[:;r¢Ì—èIexõ—B|çõ(¼úŸC ^÷¢’óï©Ë·ˆÅ‚¤=i|'b«Îk¿!@ÒùæÛdDÑ.?Isøæ…<ƒ[=²)GLÞSÒùã¯(ÜõZ JpÓ×lÅâµ/Š’Z´ù‹¾“ÿÎhŒBÑÀ#ùñøÀÙBˆ¼^¦I’œÏù¹¹²™¹ŸÙÙY­ôõõ‡ƒx<ÿÍ#ø|>zzý¤ŠqJy$…öövÒÉe,«ˆ?ÑDç|o>uø¥SçûmRÅÌ ¿1B:™Æ²pùÕç ‰×¼,Âä Ÿý É׸òU±?À%ƒ­üì€#jüå¨#äª6¨üüKVDfÞstJ{kÚÕŸ?.ÎýOzyâ%~pΕ·FÀŽèÿ‰ÎÅÏ£UÂÿŠ8¿üóÕÅsçuù+ç?SŽèrÆ?9ý¯ªðƒ#ú/ÿ<>ºÂ[ͯ©n\Ã_ûùü#z¿é¦›¸ùæ›y衇¸óÎ;kì7Ýt“ûseeûjq|åçê¸ì²Ë8vìØÉóŸyvù?üáOžóÙåïÛ·ï¤ùï–šùö'àâÛIÆO`Û­,Féô6P´Ò=XdüÐy$“EXj#?û4R®È#㣘 a&R~[ÒÐ÷Ñö²Î=1Îq@’䓿¿ÂñgIÆg±ífR¿ŒÒíòKŒï=—ä“%ȶ‘Ÿ;„TêÁ°—<^ŠGB˜ËÒð1ì¶úd/úÃ.¦þù8 ëòWò¿YŠñíO¤¸ê“$ql;Júǰ)Ô@±ï]gÁÄ?õôjØ¥f>²x˜z™$çy<üò)8´dpÜH÷—8>»‰Û¿‹OÜ3M§¾h#ù_2ÉV9FçÙƒôw0/Á¾Oÿ’ö2Ø{÷ÙŒOhØ´‘HF±{(šI¾÷g­x>ÿ(9À;1Æ‹^z-Í$9w‹é‰i8…ü?·üµù¿Í²85ÿ+¿¤ýS{ïî)ó›kø_¾ÁKó7jùšd[ cù¿é}ŒÅ. îú°`ùì"Gž>ÎUo‡£‡dî¿Û¾7€b÷ û2<$CÏÌüÛa$["Ð(±ë÷^vÊù¯ð)½Ÿâ@‰±±E^üz˜ÁåÊ|Ó—ÁÞæ!yÄDÏÄÿc P¢pþ+®<åü;ü8á±ÿ V«Åñ…\ó³~3ÙŽ ŠÝƒáË ïð<2ž7О’àƒmWÒüÓjc K¶°°±eÈ•$a¹Ï^…)EA›)Q°l„-È–õ"MAÊDLA¦dsÂ#hó,kÁ’Œ6Ù&‹Io@åxÑd{H`‹ó;M‰ìiðÃÿíø²Ë¯AïÚÛÀ¿W„ìñ{ºlîÍd…ÃÎk0DS4J"•rÞËeÝ6>_€ÅÅE:Z[×çŸüÊÊõ²ìümVžX–…×ëuŸ_tvv2<ŸwkXãñ8ǧ©© Ã0eÙÝ–Ë娼y3sss®)båÉó_Ò àUÐK+×êÏv,ö„ð(^àÃJýás…‹;ëÖ>W1.ê×N5õ='üž‡ï©[ÿù\Å ù¯Ÿÿºõ·gÈ2ϰþv­õ©Ç™ÔßÖ)Q8å8£úç3d¿ÿ“ç¿úûG’½äR³Ì÷„1-5Óª3­PÂlU&›.`<,öøë~ÿÕåŸaüwç*×i§áWÃE¼¹ðîOó¹ïÍóÁ/sîËÿŠ?ûÿºx÷»ßf ~ôïÜëlúó5õç&‚}GJhÍ!¾þå a#dÁÖËoe~©Ä®Ëc‰K.ÿ ¼–Á2»¯¸ d§þ\Qøøí|îë#¼óö v^û>Þqãfn~Ë[Ð :÷}ÿoA²Éu¿oMý¹´¬óè£Îœø¿Þù~„ [/+ó/½d…]ÿóä’Îúî+nÃF(‚’ð 4Gù›ÜÉgÿu˜÷Ü~€s®ýkÞqc?7ßüfL îý·"t+ú&tBnýùï26`P³³M´„ñDžI8^±‰uúTŒ6ãlîßüÌ Ï0*Ekããn[¥¨éTL6"è_Ýfsÿñ~u Ö-2«î3::Êàààš6« ÛN5ªÅügå—Ü÷WýµÂ`%&a”+ ‹Ã¦Ûn½ýV^+âcºˆÒíØ.’ ”hhŒ®é?XrŽéÈbÞmKK€PÞK6PBéö1Šå¶«9ÆnËK)·m(ï]#Þ¯Žn[©Ô¹Ñ#d°WÄüÓÂpÚ­ŠŠ Ào;fÍS2x¦¨ˆÿ‚ЇœáõƒBbA_kp¼œ×íAÙmKÉ$g[Ž€¡Óë]iW9C§Õã]ik[\Ô|n0¿:¶W ùW¿_1x4þTÈ=ӀʶL)îŠÿO¦–¡ØØÈOŽ4!U¥û ¯wŠþòçó,˜ÕùøÛŠüåaL͇, \Ñ_ä§#müäH¿iž[¾¾²_Y »¯oÜéþ÷aoÞ®0ÿ ç¯ý=_Ýb3IþI8bÿï6yÓ5i®>¾ÒïqÙƒfçØ#‚nŸÿ“ÈòÆ_}RbïÎyqµòù:K5~ÖnsοןTÐ?šý:g‡^_÷ü«ì·òúÖ+m&Ô0÷?åþ²¼õJ\aþz.Í2¤W~_¯ììd×+%þå{O0¡†ùáô8@ ÿ×YhA‰‹· š;e^I'ßÞz¥ÍÈrY0xí5!&ï{/j˜—\ýA^rõ™¼ï½®0?tô®5Ç¿ÿ§U‚þ_?f¡]!1±Ü>ßgß×}’,ð’­ðÓ½uù¶Ûnã¶Ûn«æíÖ¿¤¹S®ù-|ø;yÑ%Süñß;·÷¶ùjÇyÜzËJ¿ÏÅF>Š7íSæÒÿaðŸ·Ë5ûÇdà+_ùŠ»B‹×ëÅãñàGG2,úÞ´™ìßa`z„Æ—ö@ÎPœÕ( I3°T„m»±s†S´Q´hhõòâG¿Ã£¯C’$t]GUUg" \ˆµšÄ@2,vüq'¹ÏN°={Œî­ˆ¼åðeS%ì’3™`çLˆxôŸÆÎYP´¡hkVùÙ¸_ý½ó‹&B·¼!FáK‹ì”éØá¢Ø€%¤ J6H‘×1# ‚ž³ý7ˆ¢I´Iá Þ§ø–µ».¿˜ÏÐÒÙÎöhG'Ž21~‰ ßÏ…»w£›%J„düŠ"Œ¶ÒÐÐ@WWÁ`Ñ£‡iŠ6°mÛ62É&,IuƵœ`!µÌYgŸÇ¦T*ÑÑcÛÙg;ų“£¤—D›b 44stâ(3Ó3.ç¹ç¢›%+ ¶ùÙŠ"жjøa€þþ~2É–ä)ó#,,'Ú²ÅBÓ4š¢A¶lÙâð'FY\87 »gGÆ“ˆ'\þömÛÐfqKø8¶0ƒêQ5´"Ër _•eº»»I½Ø’Sð¤§|Ì'æéíÛ„â Q*•ùúúúH&“LMŽñÆ¿Îknd{Ó¶ºù/jÞöÁã”4 ÃìBˆ$%Mç éçß¿”elroýÀ8>ÕL466ÒÝÛçâæOðÖ% k¡T*1|ôÁÀAÏ8¶eqó‡ŠÃA6oê«›Í(ñ®¿E3dL³!ò¦Â?¼·Ÿoýc–±ÉvÞõÑÔ²¹N4¥µ½Ãê-Îóö¤èíí%‰¡iSÇ ÌôŒcY·|DGñ*lmÛZ7ÿ†¥óž¿_Ä´˜æ6„0°‰ð·oïç+[dl²¿ú¤…\6Ñ…B4ÄœUóKqÞñ·iÚÚÛð£”J%–q‚c=Îuð¤ä\c×ø=V``÷8c(\ÜÉìî~ w>ÿæ³è{¬öZ{`·ŸÙ]Žëbm¿û:» w5û>kÜí·²½HáÎýL^t©óÊóú§ßUÇ·Âûñß¼‹¾Çž¨s|E´ý¾šþÍCO/÷ïÞî¸$Þ¼‹æUý›wû‰ï*BUÿøcw…zw{Ùͱ¹|üñòñ×{À¬€ÕwjùçScnþªC}òP]½ÿ'«ü\v¹|Vó_u[åæ½r§‘ÿöË¿Wàïu®¡TE×l|jbÆÂŒ¨ha?Öl¥+„/³âÞd–,TU`„À®z¦PȘ4¶«2&þ°L)öl=Äg1Kþ°D!ã¼j!Ëqeìhħd0¼‚¼,ßÚû÷bÆÂ΋›èaFsk6ƒÔÆ—q®…=Š3_XB [XI A.nâ‘ è+âEâ9¤®(LŽ‚W`•œ«OXF[‘GP@O[Žø?nà ˘a f²è‘ˆc „Ñoª<ÁU6¼=¾r}º¸¸HOO¡`È]i=_(à÷{)JKEŠ¥ZˆÏçe1¾@8ÆëóQ*YJ&9>3I¡àÜ;ùý^B¡0ñxÜ1Rw[u¼À?}~%B¡Ðó€¿òøÛà§§q„mÛÈ’L´×ëŠÿ33Î6¯"îr~u*dg "Ý*ËÇŠH²DjªD¤[EB’À¶±°ðy$B ócy|ªãÖ_é ™†.‹xV§Á/!K2þ B1oÑÑäA+Úij:!!ðú(øüóI¿_ƶlR%›bÞÄës $ÉÔ„%‰¶˜Ì‘ùY¦1¨ z¡ …ŌƉ„ެÚÌê:mB ) a¿B¶h2ðלmUÐBÐ+˜(Z„ý2vÞfÈ-‚^Ûå#V„Aý~™áŒ#TéPü*tè 3šÆX^§­d! "0M‹©œN£W¦A21°±,ÛͤK6¶¥’…ŽD2[¢Á'S2~ȧ²-’ÉAØHBFH˲9‘*¢(Z6&.ê˜ÿíøv¾UæSÅ·ÑdÖ¢Á%G‡Vækdò”½é„–E]~æÇ_‰ùüÊø+OiʳŸO~0ü-òOžÿþJþË‹!PÎ<ÿ&6ºeã±–iaH§þdË @³$–2ú3Ž_õئ…" <¶…§Í÷HeàhØ,fKÏÈ¥2_²Îìüd +™L' kø•áлF˜ÜßÄgý¯©ôכ׸÷ò%^±¯vŽ¡ºÝÐпϳßáPùÂyr¿s½ûŠ}µúzüõbro玑õ†††xç ùl-ÿŽ9­õúz×wüHfdà­Ï8—³š¿z¾ehhˆâŽ}#ÜûF¸gåžYgÅò;Fûkú­ìÿõ+®§2ûU9–?Ú²Æ$ :&ÆÇÝã©ü÷vÛö—/Æ5¸{d˜~u¥ÝÝ#ïÚ׃×_«rðÀ–-®€ÿ'õ»üŠÀÿ3Ãî¡@e–j¸ex˜«üaù½[†‡]¡>8bþÕ±whÈðW·­Çß[þ·ÚT ƒ€D{GŒûòk®a9•r…åAÿj‘78BòGyd½@€‡~ñ w¿•ãZ.ßç­^•¼½XN¥Ø²eˆáá‘“Šð8°†?Q^–³^ß—_s “!”¬á¯R¦§gaÏž=®@2¹äò«û­ìO¬lWÚ®6 ¨7nXøïÙ³Çm[1*Ëf³œuÖY„B!·Ýy;wºB}p Jëñ+þ¥dÒ5¨Ç¯ü·nÝâ øËæ9…B‘ÞÞ^c1~óä“ ô÷ט~¥êþ8qÂð¯6[ͯ6¨ƒ€Š‰@õùÕÈó4^ÜÅ–½ó´èGÐ#  9"{lè´0½8Eª”t¾äÛý¤)B=(YxP96~ }¹Èmíä×C×;ÿ|†L2E`(Hëì š¤YD0äò‹…"Mr˜D&ŽGõ8+>ûœyÙÆN/hác~fŽ\ªÄƒ½ì/ó7rþwy3¤“)|ý>šçfi´f±ý è+ão–£$² gõ1ÝD“M°!Øz®„'$H‘Ok¼ª·‡G»óvõù?00ÀÁƒyüñÇinn&N“Íf]“`€ææfTU%Ç1 ƒ––¼^/?ÿùÏéîîF,ˤÓi–——BÐÔÔ„¢(!Èçó˜¦ÉÂÂøý~|>ßiñu]¯Ë—$i _–eTU]—ßßßÏÓO?½†oY–k²_UUöíÛ·a¾a5|¯×Ë||¡TŒ™-t=$IHŠŒfè–Mzé8m½$’DZ%¸êª=2>ý¯’Ã(„ɧ–H%L|~…]»Îæøñã><†7±…B!GggRƒŠ? ÒÒctt]O“Šž×üüaça^µp½"v¿o±›ûVT‹ý«cò¨DßVk•èßùι®Å Ý7ßMÇu%¼^A.—ƒa©ÃòIø±2Å Zì_ƾ-«Eÿ±2ß™«½o.Fç+´U|NÂWËü#€j± úºV‹þÕ2ß¹¼ï„J×õz™_„aùÃ2RØB×T’ùE¼^™ODyýÕaoøD ™¯½A Þð]•vGwžW7I´†aaÚÛæ ÿ*7œCbldœGfÚä/wæY«ó¿šÛÑ0o|I$ƒW:†Âw^ Xðê»-Püܸ;ÂØè gˆmaÁüŒÃõ]2 sc…?<Ë/NøÙ.·Vñ)óe’ù$^/|üŸ\ÉæµŸs„¹wý‘ –Íý +ܰ;ÂèèxÀŽA[æÿ¾åÔ Ýx~ Ið_'ÃPpÇïäÿød’h£¡Uݰ2˜lôL¯ü*XšÎÒ’*9r ¯'HGs+>µ!LšbQ„¬#I…BÛÒ ÝJã÷ûQ}^Tͤ¹¹ƒD"A6%s|2ñ»åψ@¨YdtƒUü|¿ÄRT™ òu$t«„߯—ùÐÜ%‘H‘M§êüƒo?˜ÒxËBö¾ÍEú6Gø6i.l¥os‘o?¸àn¯ÿ¯|UŒ¾ÍÎuÞä„_Rk@kšÃ ^|‰Z÷ü‡?x ä éû6—èÛ ?Àþ÷m.ñƒK5B{ÎqŒú6—Ê|¯#þ¯]» Z Ž-ÙUÃ_9ÿÁä'–Ûº|çßOp„ÿ}›qÚ¬â÷¿ÊÙæðËâÿ5|X\°Øv]ýÏ"¸«ÙW„슢ðú׿p„ðõ¯½Fè~Ùe—qçwºa•ë†Õ"øM›6PÜv¤~þÛŸ]~CCC\ÌRïþúùïvùBv]Åtó/êæ~&ÏÖË‹HZžLº‘lnœ;›ÑJ6ãà …l"$Øi¢« öÜ(B¡'gYøEʶná£tè¢NRŠÌÿäçuõa^ÚÉ=¨óýW‡_Ê“IÇÈæ&Ùñ²&´’Uæ© Á> ½EÁžCØ1ôÌ îîBéíBñz):ŸèÖIRþóß:Ê«Zûˆ\ÒÉÏ~Y¿’ÿéÉ[/·‹y² A2fŠ7)ÿ!(ø%D1H°4S¡0' ²|)7Ïà×Û¹¶­v¿—Ï ð™?<Æ»Ÿ*ñçßá:ú˜ÚÓÉc`ÓïÛë~ÿVÆ¿ùÉí\²kÙcÇi•¼L=Â&oŒMßÌO·ZÛ!—U°¤1„#¯ŸààþN|/Ý–—̲‡xÛ£(‰^ìaSgít2þøÆò¿ùÉí\ºk™ç„¿6ÿ›'ëÿò;6óÓ¶´Ë·¥8BÊ’×ç9¸¿ß…m`yÉ.{ó=¾^Žì¡³Š¿‘ügóy–21^²­À–×™üä ÁèAÁø÷àìk/£µ=WüNf÷¤}g7;wg9t0Ì“ÿq?RZfû˯Þpþ]þ%:Þ$óãߘ$ÆàØ7aÇËöœ”Ÿxx˜è¶fvœ—ãÈáOþègx²°åêË7œ‡d×µ9|ððSÀƒðã}еg›Ë_“ÿ@úÓóÐd`G±‘Gþó T ú/ÜY7ÿM,a‘ñ˜LfJ[Sº§±ˆ„,¢² ŠEfY•,â²%lÚ|6!Òš ª#–Ïj‚TÖ¢# ‘x Ð%RÂ"$$š™'ÒY¶Ge¬Sà[§É÷y Òâ›[Žø¶GWê‹}¾---¤SIr%çÞ¿"j¯ˆØCá0>_€HÔ¹·I¤R®ø½¡p˜H4ænËes„‚!Bá0Åbžt*ÉÀà–þó•ïñxÜÕî%IB’$gJU±mÇã¾·}ûvÙ»w/²,ÓÒÒÂøø8‡+®¸ŸÏG&“Áëõº‹D™¦c¬¯( Ñh”ùùyTU¥T*!Ëòóž¯xUR¥jà·¯ÕX/ –Ž(…\éyϯ®ÿü/ÖjFž˜”úëÖŽ=v²õµû±ºþú–žµX]ÿùBþŸSü†êoå‹ÎŒq¦õ·¿­8ÓúÛÓ3­~!ÿgÏ”åú•ïyá]-YÃD–LÒK„Öt;¥ˆµ%°ç›†‰Gõpn£¹î÷_]~×ï˜ßóìò‹Â™Ãa³DCO€Gq¦t/ý½ð_?ú(–áˆö¥¹/²cG.hl ½‡‘Ÿ;Z²o~íN>ô¥1Fýiþî}wÄ6¹éÏþŽý*Χ?ý9þ÷»Þ%C±áf„/°¦þ<" |!%EF&W¾æÃ<øg!^Bo@Zþ2»ÎŽñ«Kô_ùaÆ÷~I6¹û[ÿÂ_}þ0#~š÷½Ï@xĨɛÞõIîþÙ ¾xç—xóŸ½[|÷{‘X[n˹%D_Håa¯‚dš¼äÕá?¿óŒž[Pæ¿Ä…}Χºâ½ ï½ ¡‡û!Fý$z§ ŠB“7½ë6¾û³$_¸ó«Üü'ŽY‚ÕògUýùï*Nãÿ‹Ù9fg›Üw:;ë u8ç”ÅÿÀs"þ¯åõŸ’àVLN—W=1u 144ôŒíVÇz&õ¢"ä_OÄ¿zÛÀoœU+†'ëW-þ¯y¿{å‹)p&2ê‰ø+±­%àˆÿQ¯…Òí#”÷®Û¯Ò¶"þohŒÖ0+"þzbþÕÑ#ägl·Zü¿žÉÀéÄF„ýiS9c¥4(œüÕñWâpÎtÄÿ@¯×"gèälkÝ~•¶ñÿ‚^r™ao³+â_Oô¿:¶‡;7$ä¯DÅd :ªÍr!ûZò7(­kúü|¼Ÿ·ó©·­|þÝòugEEY »ý„¬ É‚«¶%xß]>‚YÝmSÿW¢o«ÅwÎòÆH+“†æÚ«ŸÆ¾v_tŸhéqMþm2Á`Á©È,Ø\`êl+8çg*_bïB–ï®=®ö9ÜJ †^ïþ¿"ä¯~¯:fÍšm3€ŠaÀà:âÿJ›Õ曵 wÞÑÌ[¯´9»§û¾|ÁÚb‡æN™]>üήiÀ¾_˜l.ÿÎ6k.Üíˆïã³&ñY“Ÿå‡ÓµŸÓ×^ªé }ŠÉûÞûŒ|€Þ‹¿s§k°¿õø?ÝûQ·8æ·Þz+×o_)l}óµk?cš¶µqãëvóÈ,×4àý©-Šyû›¯ììtÇÿµï î9\[±{ë­·:c”eEqWi¼@Hœý²VúÎakMÐlxb ì<¨,i°P€´Ž]0œÕ"J"£nA“Jk@sÄUœ9eY^—±søUgµÎó®ˆÑ³#àù•Lçõ`ìBÕ`Ù@ÄK5±K&L§R>£ƒahTh –N‰E|Çk`Ç%:¶ºÐlÐA:Tp6ª‘‘ Ì·E§È؆¿A¢-¨¯Ëohláaza`0ÆÅ—\N4ÚÈ—½ˆöŽV<²‡ãs) ƒp D.Å,fI&—‡Ãtww³}Ç6dEbqq‘é9§@î©'öÏäÑt“#Ç™ššbff†d¦€eYÄãq,Ûtø’êòw]p1Ñh#—ì¹p…b™B~-ßëõÒÝÝÍÀ@±–oX9º“Xc ’ìe¦QP$u IDATÌßqÖyD£\pÞNÚ;Z‘e…c³Ir9H0B&•Æ(fI.'±m›îînºº;Q™ùùy¦O”ùû'žÉ¡™6‡rùK)§1ccÒÙÕâñ­›Ÿê¥¨ë4ÇØÜÝIÈ+Ó×ÝÎ-ÉñÔá^λâÑh”PÐÏ­Ÿ `Ú‚t:ÍþÇcrn\¡ÈÈØO>ù$‡¢XÒÐ4•£a4­@Ss+’â]7ÿªâ!•ÉòzioŠ![­ÞóI»†ïU=üõgC”tƒl6ËÁOq"™¢d˜›žaxx˜‰‰ tÃtùÅBŽhC#BR×Í¿$$æãÓ â÷SÌ,ô)|èó~—Ž„‘%Áû>&›+Ïç>ÊR¾€%dæLOO³°°€eãòKÅ<ê.GL>öösP‰qøRçUÝU~h±»ß}-Üù4òEg¡íÇ£³ò:)õ£íwäløLJýëö¯î7»{{y»#Þ—/ºÔ}@ÝU¤Ïz‚±·_]>¾ëËÇWtû­î¯í÷¹ý+¯“Òùhû}lø¶?|Oy{?ñÝÛyåáËE—Â~Ÿó3¬¼JçÃ~=ßCÏÃ÷—Îwû­é_Õ]Eš­'˜zûÕL)1¦.½ž)%漿ÛÊù¯ÄêüÏIþ+QÿJ<ù¯DuþÝ8üK!ðÙ ]QrB!ã‹ "þ°Œö—ÅóŽø_n ag¡.‹ ÊÆ#EáÇHØø–ñ-,“Ó¼øÃ2Ù€óZ û°fsˆˆ#,…}È^ -pÄÿáælËë\—ja§²ðÙY ]1²ÂC¡¥…œP¾°DQõ»ýõ‰4–7Œ‘€¢ê ô´ŽMvÖpV©·!¶ÉGjª23:%Ã&=¥!$À¹.Lñ·—…÷Ýz}åUîmü^¥ìÆïôt«!éVI,„,å Ò%J‹¥¼V‚xV'æ—énõ1×€V´ÉZ³ I*ß+ Áp¼DKÔùÙëtµx‰úœ*⾈—˜_rûWÌ:š<Ì[ÿ„i2]*‘+YÌ™&…²ø¿M’Øö2šsŠèóe1åhNwW+B0šÓÙTX½‚¡JkY¤Ø¥ª´• ’òš³]Á@ÀCZ·Iè&IÍD˜ [É‚dÑ`"o2•7A’°eÓ«b C’MgØKاâµ%Âá0-~/ª¡!ô·FhTU¼²MP´ú$:C‰lɤPÔ Jü7䳊o$êð¡3¬ö ¼6„ÃUüªŒW¦Ì¿•ñ»Q5þJ<ùöù'Ïÿ %ÿõù§—ÉlÐ-›œa0›×OûüóÉ2’cM@Ù_Øl0,›"6sÅÓ?ÿ}’cz" Èå;¹4,]’XÐ8íóß' „T¿L]þêhÿÆÚgªÕs#CCCìø¬#†º÷ò¥5mWG¥}EøŸÿª³ÿ»Gê¯P_¿z¯Ø×8"üSå¿ä>ã¤üÊöz122rR~en¦Ò¶"îžFwÜö½Îþo) éï®õk+BýJTò?44Ä®M[Ü÷ßüùÛO:îÕíëÅ-ÃÃ|fx˜ã¶#Ì®ª¯­ghhˆwoYÙßàí·¯;gVáW·¯WŒpõÈH «]ß]`hhˆ½U¦ ½÷Þ»î~+üêö‰Å…µ+áôôô¸f@€?ð°þ*óÕQi_>ÏL;bÄî®ú•õø«÷W­oÙòÌc[ÍÏçò'åW¶×Ý–ÏŸ”j *âþGyÄw"á|f459guV¨?›ÍºBýzc©°ÁÇT~/õÚ®n_/z{{‘~±@¡P¤P(Ò«¿M p…ý…BáùÕíëEGG5‚þ@cÊ>+Â~pÌ>׋ ¿ºýFbqa°b"Ë€tl Ó·µ…h0 º…GRÝwÐèÞÔî<ïÏèP´À°œgï¦í̘6ž‹3çtþ‡dEt úihó€ú×£`k4µF£á¬% Û™s¨ð-F½ÌO=¥ó?(›(’óÔÖ'n,0ŠIaöqÇD ©µ Š@„f£J ªP&ÙzIÇã¤'×=ÿGGG1 ƒh4ÊÀÀW_}5{öìqƒ*BuMÓXZZbaa¥¥%–——Éår444ޏëœsΡ»»›`0HGG}}}lß¾EQðù|´µµQ,edd„±±±5ü«®ºŠ‹.ºh]þüü<Éd’ååe²Ùl ÿÜsÏuMy+ü;vœ”?66V—/•ï—NÆ_=þzüêñ···×ðÇÇÇ …Bø|>w:Ó4)9ŸÏGo;ªÏdaqK¡ƒx¤ŸßŸdz²l$I!Ÿ/2:2ÎôÔ,éTC·iˆ†ij…çbš&ée›RÞO:i4âóùž÷|¯W%ÜVâc÷ÇùØýqö?þ›²à¿™÷_ÛìŠ÷÷?þ>vÜ1Xt„ý».8o!ÀäQÉÝ^‰JŸëZ¦9qŸ—Ôã&¶mÝ¥àõªDÚµ*þHYð_á'Ëü‘2?V÷î †ÖLãn_á;}®kI2{¯ºŠ/íЫø³eÁ…¯•ù³e¾Z÷î :×LÎàn_á;}®kј¹ÇSæãŽ¿X(²<ëA_K{øçW˜|ï©%ÆŽqÃÅan¸(À¾bð†oÜpIˆ.Œ06>’``h3¨–óiÚÜpI€.Œ8mæÇ;6ÆãñF¯ÄçÎKa ¬É±P$9£ %ƒÄÒ _½Î໌MÎpãž07^àÕÿbóêoÛÜxIÐÿŸ †:ªøpã%n¼0ÂF›ŸeìØ4%øTÁíçgêðeŠ…"KÓ2¥%•XZá+×|÷@ŠÑÉ%nØá†ÝnúW‰›¾+qÃÅÎÏccK ``¨Ñõä&Üp±Ã¾qw„ÑKŒM.ñx\Á§ÂvU|'ÿ­­Äb1,K&—³QgE¥B ¼ÞòÐLßï'r„-†aÖ3$“‹H’E±˜aiy¯×‹ª:ïŠÀÆãñHdQU¿ßÏÜܹœÆÜ|áwÏøˆÅ"Xärœ„~¿LØÇù:²,áñ€Ç‰„Uæ+ÌÍ¥Èå`n÷üó¨*/¾ØGioÓá¾c ¿]`rÂG逇Kkkƒ~9ê\·ON¬ÌyÏÑÝ×Êÿºç¿GUÙuYö*k„ó?(‹òŸ-19á…Ž@u<1º"þw㜪×sVÞ®wþ{T•mWy×´UüŠ)Àø¨#îç€cPãåòÂÉjß®“òY3þâæÃ|ó›ß\#\¯ˆâïºë. Ãࡇ⦛nªis×]Îbñ;¬ˆè/»ì2÷ÿkÇ¿Â_j{œþð‡Ï1%ÿÓá‡Ø·oßsÄ_›ÿͯ€£û|xÂR™i|þ~ç,–—tl;ÈÜÑò¦0í8²º@`Û ¦OCR{PCaˆwûu QŠb™AôÑÕu=_l¼—þ:Nv! e>¹Tñ›ûĆòo+ŽÏÌ‹õáI5ó²®^®}SgŸ·mÍø5MÃ#º …˜‡Ž Û6ÚÌù~Uýásõ꟫X·þð9Šõê?ŸËx!ÿ«¿=Ó8ÓúÛ3çŸYýíÇÖ?Ÿi¼ÿgÈÕ÷Oƒ*áÅ„|2мN!©„,P„ŽY,bk$U_÷ûïùȯԟ›^…m[£|ã_þ2<|Ïß‘ßö¬MoG ûÉßÂ×¾ò!ýÇßqá.gþÒ”$ÞñGYغ Á?…àŸbÚ‹Y¬G¡­IÅRdnyûÇð'¾¬­?·‰>îúò°d™½ßý…­ÿ³ó-ºb¤c·pÇ?Àã?ÿ$W\F’–$ñ–?Åh¬‚A®çV²­%IÌÆ‹de- *2ï¼õs„Æ>^·þÜ–eÎëòñ/L-ËìýÞßßúôÎ[Ð Qhû ¾üïàé{?À¥;;ŠÀoþØ“ŒfÁ.šä»ßK¾ýÝXBbf±HQ1ik±½ ïü«D,mÝúóßEœôô´u’­€úbÝÙÙYÒ‰aÒEÝ]˜}&“€ÿÆêr6b °¹¿¿Æ4`tt´Fü¿Z¨_):«•öÕ}*ûZ½ºNåýzmëÅjþ©Æàø6‡×ä¤û®á+Ý>Œé"‰že6MµAðäŒJ_cºˆÔsÿèÝç´­Òí#4 F¾ˆÒícZ5âÿ õ{„³âÄ´0júÔ3¨´Ö´Ý¿¦õÆÂY‰}c®m'k[-üÏ:AŃ0²R%†ÖéT<(¦K€~Ò¶9CÅCPñ3tgf]Ñÿöpg]¡þzqQó¹Î̺}ÂÞæu *‡L)^Ó¶ZüÌê˜8BýßTDÈ?i^³?!+nûЏ¿²/¾n¥ÏÏFšùû×Åyë?;Œ`VwÅÿ¹‡ $+ô™ãˇWV~ÙLhÂ\pŠÃäVç‚Ô\( xùÂù2Oî7xõS)‚·Ø6;w)œß³ÉmÛˆŸÿð²$g™IŸÉÞ¢#þ¿@òp¨Ìªˆø7³&¾ªŸW‹úW·=;ôú5Fg÷ï¤%fÂ8ìü_ðïÿwå³q—è&>kÒÜYÿܽãOÏåàø“Üðé§áôvX4msæ‰tœWÒ‰Y® ¹Vçþ²lÖ2®Ø5ÿ%[WøNåYý½‹ƒãOÂuŸ¤ï:\Þ‹Ñ´ó7±xeç ÿ‡{?ÊK®þ Ëßþ³ßpéNÐ’ðÖ+á‹?ƒËËûo9?ꌟrñp¤ÙÓ¦ŽóøÚ-Éa$n»íSÜöG¸pý¹4Ÿç¬üc³‚ãó?lrë­·rÛmŽsÓõÛEÍJ+@€b±HÄHc«ØÇ²ˆ&/[À.˜ÎR~‹9X.ÀØ`Ïꈌdzˆž¶eØÇóØº‰Ð%ú¶9ëàƒŒlºÞuû4 Ã}8·šß`eñ*aìé@c¬'Ÿ|’ÁÁA‡?0„eYD£Qwü<±ÿQtC¯›EQ˜[ˆôûêæ?“É ø(h‡Ð “¥åfb E‘Y\\äM¯é# ÁŽ-G‘“@÷,G¹Ÿþb‚¯|gQ—ïñxH$SøÔúùÏd2ø¼—oÙ+Hg3(ŠB.—ãµеŠ_¨âgøÖ̘™™AˆRMþUUe9›Ã#KuóŸÉdPÙåK²‚aš,-%ð( KKK¼æ÷ÛVñóU|‰ÿÏ4^_€ÂO3{óYîÑ~û;Œ_ôjGl¾Û¿f{%*ÛµýŽø¿žƒc¥ÝìÍŽi€|ÑYn»Ã¼¸¼}?³7ïBÛïC¾èRw¥ùÃ\_³½òp¦ßþ㽅—¯vû wùø|LJç»û]wî'~ó®ñxå}vû‡1Òùukúï÷ÁE—ºí¦ÊÇ¿zÿ­ö—X¸è-àÿ)æïckò_‰z¿ƒßvþÍÇFjò[¸s¿kc÷\äªem*õž§‘y´¦Öl"A‚ê"º¯Æt‰¼O`MçÐ:ƒÈ#·¬LVZ³9LU`iŽø?XgÅ@k&G©7„=o""A•BxÊ“”‰ZS++!"ÂÅ$rBà ¶“÷J˜3Y´Î$rÈÍ ø™¥îÄšMa©3îl7g³ˆHÄåš³Yh–±²E%L0]_Ø"ÅsèÍA˜Í@8ê8#š6é¯D)-¡Â_\+6³J6Ä3èŽiá(Þ´c6X¢ ¼Àl½7Ã)ˆDP™E‹tÂL"€|¡Vô2;7ÃŽ­gáQ<ŒMŒã÷új¶ûý^Là —ÍrÎÙçðȯu·UÙ…#aÎÚºL6ÃlY„1<6Âæ¾Í´´´”Ws/ðOƒÔð9rìwÊüøâï”8¾òLçTùánd–4öXœ(âóÈåU§û´ôTÕ³T 皪×ËòqÇXÑ«ò',l`qÂ@•¶m“šÒ¬<ÈŽt«¤Ž—w)Œÿ¦Ä–!…Œª0³hÒÓêg8^",I$²: ~‰¥¼ÈCcÙ¡~)oÒTXÊêxý"–ÅRÎ $†.õÚ ÇK„„ êÌ&  KyI²élR™Mh´Çæç,Ú2¦ÌHÖdkÄÇhNCÁ¬aÐ&s¦‰È[´— »æL“6Ibβù$¬œÎ ˹G,-8æ­ÀhÎé;gšH¶Í`ÐÃhN§ß/³œÕèõËÈ6„ %åD"¦E‹W%cZø=I r¦Nƒ -~ç#¯;~h>añ«¨0 yŽ–Ø™‚cР`ð)Ig‹šNH((™Rþ¿#ߦÅëy¾Q‡_âhÉ9G7Êo8ÅüW"ªÈ.¿ò×ëמýüû|Þ5|~ëüõóqÇ/êðÏ<ÿ I˜(˜²L£j±¨Ÿæù'A½3ÑѺñ/gRHB ˜` …Ö€ÁLîôøªTæÛ KÛ¿P* z@6–G¡3âa"©Öù xÜñË¢þø«cr¼øñ×|ßT‡#‚áлFùìúóÕÑþ8ìÎ*ö߯w‡XÓwr÷\½ìò×ÛïÐÐwŒÀ¡wpÇùù¯®ðï¾o˜e~uÜñ#®£.¤j%ù ÿÞË—¸c߈+6Ygµy€ŸØð{À¶lá3÷³íMÍ|aßúǻ޾†††Ø®iÀF¢ÚPà¯Þüç€c0~’GüëÍ; ñnV Ü€ve–©WÀ?½ÝáÞ~;?qA`›É}÷;¥÷Ý_1‚ªóWâ¾ÅnvUý\1³?ÜèÌé·^QDõG‡Ëæ1mW–jø ? »Æõømýeþ½ê*þ*7(—¯ÖòË~&‡U§}ûK´*¾ÍüÞã‡$ß—£#ÜÅôÑ"ï¿Ö™[Žè9ÞöhT›Ç³Í<þ›4DÜpi?xal|ÜùŒ«\: çßÂ"´Œ•À§š€fpAClÁߎS2HBªÿÔ‘B ÿ¦ûÿ±÷æa–Ôõ½ÿë[Ë©³¯½o³õlÌÀÀ0Ã*‹€ D@4jÐ\7ˆz[âïºd×ø˜ÄD%暸ÞhÄ\YF 3ÌÀ0ÌÖÝÓ=½Ÿ}«:§¶ûGsæôtÏ‚yŸç©§O­¯ªÏ©®Sõ­÷ûóeG9ÄŽ§‹l‰WxËÅý ¹>Ü(x -äϦºWÁáQoþŽBDl‰—À|æ¹Ð’üñ}Õ?fÜþ_E$ž*+ã·xóEI\ÉzÇßäK ~ ºúáИ7ÿ©¢( ¾.|rBE­ Zù_Ý×ÇÔ¬w‰ø±mUõ~º,B‘0…B]wÑ.š?ŒáÚÌóÔë0Ü_§\÷Þg— FGu …‘H„x,ÄÌÌ ®ë’HÑu]×I&“T*ººø}‰ÿF|Ïè¿/Q(8è: ¾ìñ«uêÀ°»¿H$¢5øY\ |‹d2@¥¢ÓÐZÿà†.Úªòį¢Ô¶ƒvE†°Hííl“Ú3*O0Çeoèbù ƒ'Í®Íùc£þV!€æôöùÌEY«ºKþÿ7ù›.²ûñªgÄ¿ÂòÌÿÏàèŸ]Ô8ï ËWÔØÕlömÌÕZ…ZÓÛæ3§0TNÊ_}©ÂÁŸ[ ~Ãü߯V¾–¯8fú?Æo›¶$R±Åןv~eèYŽ#GŽðö·¿o|ã­^î›ÆøöÞîÖ|˲ZFøæôöùGŽa"»sÑÿ;¾ãIH_ÀÝwßÍë_ÿú_+?ŸÏ³ÿèc'å >̲êe<òÈ#\rÉ%¿V¾ëºì:ðЂëO{þGï…W½¶›jFÇíêddO »š‚¼Ž/áÃ.ƒ´"EfÞAHEü›®«Ê¨rÙçÐΣçª8ó÷Œ£ZÃHÕ ¨Yh†¸"ÓÅ·wÌQéX|ýmç¿âšnªé*n<ÅÈÊØz _\Ã.Ô$³ D ˆ­M×MeT9Àì¿åцÇèù8ówE­ #é Øh낼¡ÒÉ·öÌãt˜à.“mWwS«ât nþJª)ptÎŽùx¦ ñD’Ï? }Z‘VÚ|ùmeÔZ€»¾›çÒGøâUqÞ×$jeŒ ðÙ¼a H¡ÞɾýóÄ*'Íÿ¹¯é¦Ð`p52ËY¾ «ÌYD\e߃'¯Ó}¹oßÈ{Û+DJ IDATê`‡À±é]ÓE:+–Ì¿¶p—¢~\ \Bû˘-¡Ô\0TÊuÁ¬-)¤T=5d‰¼bãú]ªL‰ˆÏåé‚Áz%„R“ &#J¶‹ësp]‰eaÂá´øáš‹ñ"øÆió9¾z ¾Ézž„h“¶†4•ììlkÜ0¼¶¼fö¡pˆp$B*£·o€J¥B¦ÑöŽxzf¿ßkË©ÔLVuv2:>æm;Z°xÏïíñÛÊoêP%IÂq¼"U®ë¶z¯w]—Z­†ã8LOOcš&+W®DQLÓdÛ¶m *• >ŸÓ4[fy˲B´Æ›æøJÅ+îÑ\ö·™p±×:™×é×ÂA6¡n”ëùíú—+Ö?þØ’úÃßH´ëORÐ÷×\¼¤þóåŠÿ?ÿKç)ý­ýä^K蟗Švýí¾‹_éÛïÐ_”þ6ûàãŽÓ?gâ·,Éoe?ù8«¶(ì<ïEéo³ãÞFÛõÏ•·Þ´ä¦²ã…cúÛ‹¯¥ÃÙwê/Jÿüß-ÿ'‹—#ÿÙãõÏmñBòßþûc&É ËòQ7½ŽPîÈ\€, l ÚUCSeÞXyjIþW £ A©R¿Ÿ°pÙyXFQtS~Ý‚º 2Kþþ-ÅÿìÈÚEüw(Kw¦ý7ãó3/Žÿ‘'S‹øíÉ/ÉÿðÎî3ç7õç¥[øä'?ŒXùûÔü=$¥:UÇ^¬?/Ãw¾þe>sÇaïU« ãy™ðèßà$Ž]ªâÿ _ø»/rÓ»n¾üŸà‹Ÿÿüàû©®þ¨·`S.>ÌÇ?þ¤Ô;5¨‡j>·H.•ëÜyçwøÄŸ\Óf”ўý,ÕekñËÁ÷pï·?É—¿ú5ÞðÖw!Û&ÿøg·ò•¯|•÷½ï=ýSà˜þÜ,½‹}ìÔVü1Š_")U)Ù,¡?ÿÏïƒ?ýÚ®ã‚msÔ”ñ?ÿôÁ¶ôçz÷sßw>ÅW¾üÏÜø¶wBÍæï?ÿQî¸ã‹¼÷½ïÇàÝ}që_Gœ´€• Ühùm•pm¶êž ,pLMy/`І׸=:2ÊŠ•+˜šJÑ×wbÁÇ—833Ž7õŸÎòÍh7æŸÈ¼¬]Õ^4`)ósüøm4×;›­ø×ÈÎ¬ÇøãÃÊ9( ÿ™½ÁdKô5<²ŽC+ŸÇ¿Æž.Gð{$O3Š™Äω1|‚^ë›ÓŸŸ¯¶¶o5Z†ýöBí1áÚžÿ¸ÏÍh/Ð\ÿøešÓ&\{ÉõNÃr«7õöÏ'‹¥–9“‚Ð4ìŸþJSlæê5ÆOÿæôõ!¹µý¢¶LøO¦÷´Lúgë#}ŸN4ÍÿûJSTÂçWº0ó“­BÍøÓïøù«·\¶:k{ßÕÏGz,Ó*P/a$“|ùæhËüïS¼c~ø`_yüÉ7òá9Be³µ^Óüÿ/ ¼{MŒí^[,Wøa”+«5bABµÆÈ“‡8o¹÷ŸU¨ÖHÚa.߇ØnÀ¦Í [­ È]6lö^ö;¥^dŽð»Õ¶Ï•ïÜä™ÿŸr<£ÂpÜ?¼„Iÿdçßpøf`añ€áðÍ'9ÿn^Th@>Š,ðû nXéçþÆû.sY=˜¼¢&ýpW^0Ø:þ‹7Áe ·eê¿v½à÷nˆ“Z×XxúˆðÉ?zš¯ÿ‡`ßÃÇ ܳÏåúFÏô®ëb>Ÿ ê€OFdë ) Û´´²aîV!;ÞÆÏ•pw Pe\Ýöz°:袀¨`¿ŸU{Æi4Ê5ElÍêž‹ù6²*áæ,„OÂ5\OI/$©¸›i /8Ç…§%oØG€¨xêüjtöi¬{nšÝ§Éù$E‚ ª„¨5º%İŠÝS÷ºÕ.ΞWõ*@IHaâÖ]@X&Õ-³)ãQ{!ßu]4M#é N§I¥RTós¬=kÏ?» ½’# 3:6Å`oŠ|>O"‘À¶Í–à-"kÖŸ…¦i-Qh³èR `~~žt:ã8  ™››cnnŽp¸sߪæY{Ö&ö=» £’' 3vdšþž$ù|žx<Žm[­*ªþpøñóù<D"ü~?óóó$“Id[g݆M<·ç)ôjŽP$ÂÈØ$=I …ñx˱[ǯF“H†ÁðÚuhšFo¡€‚þþ~Ç! 1;;K:Æu]["ÜjµŠª†H$”J%/ÿÅ,_ú´Æ{>QƵ h¡à¢üò9¦Ó¶l ð®7¯g »Â`o™å›÷1ûüz$)‡^­0tî³Tva[3ϭƱ\¶mNð¶8Ø–ÊïØÄç ‰D( ž¯^å‹ÿKáÖOÕ°­2þ@pQþ3i£Å¿éw–1ÛÛòqË'CÞwè÷“Édï<ò9¯®³£ƒ½ûŸkͯê:†aÐ×ÝK¹R&‹³wßÞßj~©R:#~ëûWdÖ¯]Ï÷þ%ËCÒËrüÇóï~Ò+>×%Œßû³^ÛOXϾ þã5Ê“è€Ü˜ŽOñzµ ¨äÇ Ï”a;!„Àq(Lx 4‘~•âDÛ¶‘d ¿*{˸X Ä@AlÐ{¹ï¸Þó‘@0™®£¹½I•£óaI"RñùA¯XtD|dJž)?§;Ä^q½j“«Úô$¦3&éRTX%"I¸®‹:ýLΤB Òêd²U›BÅ$RsYT8Pª!I½ŠBH«ýªÊTCH0ë8tKÓ‚a%ÝfÆqXT8T1™2MúTµ%f@ÖD4–ëô* Ñ Òf¢‘˜±mêIÕIŠ$|U!‘1m:" ”°l‹ˆ¦‚¼n¢». 8QŸ‚µ¼NÝrHùýØØL—êø¤|®¢à"q4!¬¨˜€šMé7ηIªÚq|^ R~ù8¾hãç «¾|ù ¿Y«£l{ürÕûM "©×_òü7£ÉÄ‹7€ßþ.åÞK²|`úĆý¥ø÷_}5ëôçÞK²üýÕ´`þß|õïû9x€7­^sÒãÏ?ý#òºkO‹Ý4ÿÃ1#>@óuöèÈï»Ç{†¹óà~zà_^srþU÷ÜÓ2ÕŸ*0ÿÈû<~Ü{³¡{ï<ƒÿþƒÙÞ(®p¢º÷^Æ_÷ºÓâ·ïgsêžÙ劭yÛ¶mc~nŽ‘QÏÌv2ƒýÕ¯y >¶ô³íR±víÚë6MÈí=’¯Y³Ë´^V~w[ïWkÖ¬¦Z©rtrrI~»ÑÛ¶m<óÌ3'5ÿŸˆ¿mÛ6òù|Ë”?11ÁÙgŸÝšW.—Ù»wïIÅŠŒŽŽžp~{49p¬§Ì@àX/étšÁAÏ$zî¦Mds9ÆÇÇOÊïèè NŸp~{4‹ ´s_7Ö¡­Z¹’ª®3==}R~,;í"Mó?+ÐüÞÚÏÿáåýÄR2¹B µUßZxï†L°†/æÈãG¼ 7V£Ú u°¨ûÀ/¡Æ–ë5žæôÎÿþî$É”ßãËÕÇn=|²ç nò_¹’#¿œ8Ž_óø¦4‰pLfyµÆ¾“ðÛÏÿ¾ž$±¸M±TÆ•>«±í¿Þixïè;€ùݳÔm, \ØÞþ™4‰PDby¥NŽÅç*#—Ëaš&µš÷ü!IŠ¢ÏçñûýÔëuÖ®]‹¢(Ôj5t]gllŒ\.‡,ËÄãqŠÅ"Ï=÷áp˜@ €‚}û¼ö®d2I2™$“É …ƒ cš&SSS øBˆVÏlÇó›=´Ïïêê¢T*½ þää䋿wvvž1ÕªUX–Åtm““GBj„ TUER]]]LŽ—èêNÒ±TafzŠ,±ª'F<Æv£¨>…h4‰•)älªeÛTq¬ Ù´N­V#ÓÐzÁ‚üQйôo5_Oy=÷UöIØ{e’ƒ6¶mQ˜ZØÃ5Àðë}äóyŒýå¹c‚á±ýË×:-ƒÿÐÕ`àÓTô}€ë#ÚSÇvl"g ‚Á ŽcS«©è ù©!Û¶ÈO.6Þ¯¾NkñK³Çöoì€W ið_vXÄõš'àçñùhñ;–m[䎪‹øk®÷“Ï1öCqæØþMzšÿ寕ŽãC¼ÏÄv"gÓÆèsôöûøËFÁ÷ Mqþz™UËW€ ‡‚€Ã3#V¾^Zÿ¾6þ­Ërl] «VxìòÚOO²£¢Ù+È–h…UýÞ| ðyüÙI˜‡øîŸTZü·þy 2[¢þk4Áªëäùïï§Å¿my­«`ÕŠdãø=áß¡éì1S?p~ÌbÕª$‡gA€ëÃ;þ4L( ßþˆÕâ¿ý¯D¶Ä,~9âcøz¥•ÿÙô$ÓSEúú‚¬Z²KµZ ŸŸ§X6Ñ+68¦mS.×(•MPʘ&hŒ=ä2’-âñ8>Ÿ˲PU•l®Ô2År¹ù‚ƒ,WÈç E¡PüoÀÏYô%8ŽŸ§X½â€¦ å²C© (%L/Ý ~ dˆÇµŸ6>˜& ¾N^YÖÉ@QÌEÿÿ Øðzݳ=]E ÍÄŸçî»ïfÿÑ_,Á_œÿgìíȲ x•Ëw]—Gy„]:iþSC2˜ÅØ&#Ü$Áî8¦«Pþe‰î¢ë3ú,ÑH?ª²ŠôüA"³Èf&Ñ^¬å°‹eºdŸÂĉ¬ aÍJ6D˜Û198îú»¿û'³Üp–„pWÆ1m…Ê/æI\~z~Ü'ºªUYIú‰CD.ZOvl ìÁšW) Ë€ìãÓ¸jœÈY!¬ŒDßp˜‰Ýib‹øÇòß³JæÉŸÌò¶! i(Áß ÄyÌVøñ®yÞýª­™9¾Rœçýçõá‹®äwâoÖ­'»kŠn­›RÆG¹î‚ø¯i Îß® açï\âCûÒäŽJ¬{£ÿ„ùúY>õÚ»øÔãsL>û8[×Ï=vó”SdêÆs²ó ôöò¯dðc¬‘‚ÄWn$^ ñµoü½ ŒšÄ¡ÃÓ8Nœ¡ž5CL…˜KÃ)òÿBø‰•IÔBüïÄ_˜ÿ§˜åƒ¯ý&_˜¸fßËð7>ûÔ’ÇO©ÄáÃÓàÄénã—ÇN/ÿë^+!‡¤bqtGafjžò®zÇYÚ9Æ•7]ÈáGðÓïïçš[®äÐ)d¹ו¨H`j~¶ŒÔ™â²ë/dÿãI¦ü§ÿ¥øµ_ØúæŒ=3Å+oØÈä““<ùÃ1úÞñªQU îÓØqPNJŹäêó8¼sœd*xÚùoò“ ¾>5¹/ï`ú@–ó®\Aî™,‡~–£ïç´ñç1 Iì·Alÿ ý%ÎÂwt/[þOÀÙòþ Éÿ™èo—Цé^:ým¦Íä{|ÄbÐwßK«¿u–_vB~r(/œöR韛ÑÔ?'¯¸™}ð’çÿðqóÛùðÒç¿©>ÿLóßþû“+çAö¡E‚Ôg$L[à Ã,!« SM>¼ìé%óð¾ØãüÝÌøA\×@‘B¨’×–Aͯ" sÉß¿Óáÿù9'~×üñ¡½|zÿÚ—”ÿ•W—NÈÿüæYnÿEêŒøíúsQºJ];©þ\J¾“ßû{ØøÚÏxã8P¬`k NôØ; ¿«cöÝÆ?ü?g}i* 3wà:.ßùæüÞ;n‡å·.ÔŸ§ÞqJýyeù'¸ñ-ÈWÀ+Ž0UF4 b¶ëÏÍÈ­ÜöÞwâ ÜN-$°ûs¸’àw~“ßòØËo[ ?¯uüñ)õçNìvnü½?dËk¼È ”$$Û\¤A¯÷¼[o¿·ÿ6ŒXÿž¿Åq4þó{ÿÆßò?°¢·žð»|¹B¾é¦›>i«Lv|D":¥ÒòÆØ±–ÝΰÄlfšR©´`hF4zëÖi(ŠB1SF æYŠÓ¾Îo"v=í]PFGFH$ä½2äs9‰¥«/g²l{>|¸eàO&“d³Ç*Md³Y’Éä‚å›b¨ærÍñd2ÉêÕ«I¥¼t$›Í¶ÆS©Tk{Ím&“I"^dÊ—ÞÍ–•qQR'6+)‰ýƒôEkødöv0¯zv%Z̳3|ë_Êœ¿Í»q ù vNY]¢+áqذ²“õÉ÷ÿ0ç½æ/PŸ£Þ(B±bå¥ÜßOñ›1>-qÎÁºH„¶&HÖ÷rÑù.±ˆw¼IÍåg¸¼ò—CE‰¤æò|©´ˆß¿Üâ–¯ë|ö³ŸeÏ/¶³ìÜ+¸êª«øëÿýl™Y§ÆÈdqùÿ[ß}šÛßs.oº±Ÿ[¯í"}ø^þòãëØ¸.ZôãÏó{oº·\•@ø%úb1î{hšÊ˜K'.‰N‰KúV¾òM …VN×uÙ¦ì!Ú¡]‚jªžøÝ5DÔ@-Ï/ DH ºýžØÎr@؈ˆî B²&ÌZQñ»P˜ —\€,Ë=z”•+W.â_>H*© œT+]ñz²3]DTGm„$@Щ¥6Dz6DªÍEä-˜waÉsv†™ÐªSò¯éãGÛ-îzÈᾟ›|ýÛ!~ø`ïÝ?ÚnòÀce~ü°`ýð2– Ìqéù Û6xè:ªªzÕÀ%™GŸ `;6_ú´ÆÝÛë¬èïnåvfYÕØ²ùÂEüO}®—ûÜó°ÄýY|ûßcÜý³ß¿OæÞŸ;lÿ¥ÁƒOh /ëcÙÀßß÷VŒëÖRß y‘`ýãÑ91Ρ¡M$ù £Ò«ú»ZÓ›‘"îz÷êÆukÑïØ‹qÝZ"S9$ñ$.ýHâIbnêù ¦v–(ݺ…€dá î#æ‘Ä“øu³1?OéÖWjùrk;ÆuçPßé'/zYÿø=tNäÐÐ%$ù£Òï õ¶¦Û¿5ÄÝ™Æþƒ~ÇNŒëÎ!2•^°GëWAÿ ƒßC¬mýâà‚õ«×wì¤zÝ9[?àÊTÏOPÜ™§xë+ð5ö?жÿÕëÎ~ª¢·Å™º„0?";ëŒò?ay9×Gw3ݸŸéùÈÍ/[þÝ)ïþ!7=KnÚ»W·Üü²åŸ½Þ³Z5W škïßrÍ Ï¿X†ÛÂ-ƒ%‚ÙJÅ ì ðå±} ,I!X( Ö<—Ss1ý~¼ç§#ˆ3UÁé"×-„(BÑ4¢*µŠM½#Œ$\\µ‚dIà°u7¡R/[Øý1„íà*pÀç« øüÔ£!œ’„…F¨˜A)VÐýqTÒ"…Ð4B… ¾Ú±¦?ˆBY“]ì™2V$ˆ\7Á.€‘  IDATâÚØEÊzò£2(5×׆š@óY¨>‰Z,“eœŽrÝÄ©ðäEdNDÁnì¿$\\­ŠŒðækè CUƬ©hÅ rµJM‰!Ùi^ÿ†~º»ºqYQÈd²Õ*Žãrñ¶‹˜œ™n™»<ó{¶eS*–@@4ñn\—ÎŽNEÁ2m~µs¹BŽp8‚¦iຘ–E­fx&êÆ=€_Ó~«ùÝ]]gÄŸ¯z"Ì©|…}^±É­Ë»_¶ãÏ7Ì0ó•:‡f¼*þº"/¿‚÷<—¯»Éx†¦aùó'|³nb-bƒµ¢Md@¡<é I’ˆøÐ &ñ!?µ¢,ÉĆ4jEL¦Vr¼À÷ ÿ®ëb–]ê–‹Y²°zŠzÉ¥Z­ÒÛg6¯£HDJºM<"Q7\üA™¹¼‰$âQ…bÅ"W)ëa•@H¡Tµ‰eʺC2¤«Ú$2AŸ„?è"¨.óu‡àÚ¿*‘.Ù†Á`,Ƹaೡ'¨5ºý•šK$ sÄ0BÐPÈÔ-úB*YÓ¡OU‰²¦MÒ'“3ze™Û¦K"²L$àõh™·\Ê®‹j:X®DX’˜¨{½PöÅ£˜8”u›šËEHEÃ&[·‘„À¶l*5  ) Fݤ`YT “ší™z}²D@Qˆû ËÂЗQ0tLÉGÁ´qe™:.5½þæ×NÁwÚø66nߢ`ÙT ›šMƒOß>ޝ.âÇ£ñ3:~E±ê8¦§ö±åÀË–ÿHÐkO û}=w7Gçò/[þã¯ý+  y&œ‘£™_[þ‹HBF•êÔLÐ-A@±0L(×ì3:ÿL»†í‚O–©Ù.BQÈ[âäù7]~Õ¡nƒa Â>—ŠaS2Îìüw…+$4µÁ—e25ç¤ùÏ×p!¿ n WóË+uŠºuF翬JEFSdj® B0W5ðïÿÁÛ–étü¡N¼Wçâï ð‰7E¹FpÛ…YÞù½ w®\Ãñ‘Ízó”kß=xbƒöÁƒÙyäþ¿ó~îO_ÀèÈ•³ä§ƒ¼m™ÎÛ–é¬~—Çÿƒ{‡ùÌF—ò&oÞš`ûêÇ¿óàÎúÒÒü¸:ÍÉ_šdMÄÏwõñ™.êfþƒìX³¦õþ¤ýýÌš@ÝäwéK²W¯^M6›å pÓ—ñ^½Å¿ô?vó@Olrë‚u:W>õ$9ÞœÍ,:þT*Å_Û‚[ r6Kæ§=÷#uo[O]°mÑ2£##äs¹Ö{¯Ì5×pþ“ØšÉ0²f1ÿoÎf…EóÛù_8p€C@ÈnÛ¶€—_¢ôÂêÕ¬jÜïd„`e6KḩTŠŸÁÖL†Œ‹æ·ó¯h+̰Ôr©ŽèïëÃï÷óóGaㆠ¤R)†W­ÂuʕʢõLÓÄuR©ããã‹æ7£Z­²rÅŠÖ{º|¡ÀÄıX £Vc`Àã â÷ûyòÉ_1<¼šP(ÄÀÀ‚…ÆñÂoöx¾?òzÀîíí%°gφ‡WFÀ²,êõ:ªªbš¦×kR#F[’ [ís›Ï;¿ßßâ[¦‰m[=z”b±Ø˜iš†ßïý®Ôëuººº÷Á3w100@½^_4¿ýØ›…êõ:Žã011Ñâ?€g¨WbÝ0ˆÅb‹„Áªª2qô(===è†qÂâÕj•µk× ëFËw<ÿø¨ÕjDÂ^QhÓ²ˆD"Ôj +¡«ªÊÜÜÉD¢qO¿t¥ôjµJooï‚m›7o^tþ߸µ‹dG˜d<ˆ[¯Q/7LhŽ š >§õ Œ)Øp¯Ç{ð› ¸ Û˜¹:‰îÝÉ$RµÂÁœ{Êóÿw6ňÇüD#>0ëXzÃØo/ÅP°|ÇÑÎw0su¢1º:;‘ªÄ)Ïÿ×mŒkD#aÜš…mØÈ’„cÚ8ª…«Ò*H …5òfé_ðY*NÉ"œ Ó×ÝCÀq)Šçÿ²¡nfffÐur¹LµZÅ4MÒé4ccc R¯{ÅÕ†a`Ùl¶5 ÀqœVA[!¹Æµ5•J‡)—Ë |>†aÏç ‡ÃX–ÅÌÌ Õj•J¥‚®ëÔëu2™Ì æÃ±bíü|>J~óø_~(ÂPÒ8®‹ãzϹBtÃÛÛ¶ÙõTžùȧŽ£R¯•¼S±¥’‹béq¦Æu²óUJ¥º‘GRJ9Ê,¶ÑËôôµz-`TBQ-TŸ†$)zé·š/üºWô¢\LÓĿƦoSÈ ‹jZ'uIlµ¨T*Ø£~ä•5Œ K†ƒLOÏÏâ.‡ª^RÑU¤ú¼ ^«ã_S‡X Ÿ&O —‚”å ¸.®ã+ºq¿SÈJ›jÆ ƒäö¾>ákð³ä3OÁ¡ªw.J]¥3à[HH%úÏ ]i£gê„bnƒ_ÃU‘W:èãrƒ_"_‚xU½wÃRwêó4ø6Äl|F€D<ÞàÀµq¿_C’$øDŒ‚ŸL<ÌÞé:{çU¦íN¦k*Óõ_ÿË7\isÕ6_¹/ʆ~¿wŠy×Äç¥n¾þw«!<Š©Ì ¯·¹Á²ùÂ…™2d”žÒ¢üñˆ9™lÌÇÞé{çU¦ìS5ÁT]ở®ð¦ËMÞt¹É±±_#—+ƒ€p“/b|÷sË 4àñE‰7½®ÎŽËç~`ÊQ{Ê‹ò>‚1£ HG$ž›®ñìœË”`ºf3]“øÖÿgqã¥7^êð¥6ôkärºÇ5ø¶Â7ÿ¢ 7˜¥ÂâÆkÞè:|þ)…I] ö­ü2!z{Sô÷õÐÙÙÍÐà–í011ƒ,9HR$™ºiˆÄU…h4ŠÄI$§‚æ—p \YXf „×öåØ&ŽãP*UˆF#„ÃÞ}œÏç™1jæožß]‚ŸF–@’T nº"dÕ% ¢ª±xÉ©¢ùÁuhð],Óá6øŽ¥’E4ª€iºøTPo•oÉÿÿÄò0ý½‚‰ T4Õ°çd”î…=e¶›ýí9{N†¹¨·Nc8w£E¿9£ëOby˜®~™™}T$9ž‘þx™S»Ù~®9(Þ:aÍy‚.'~FןÄò ‰!Èìm4,„8>Þ:aàH<éõg©ã¯Ef¨ñµŠÎ· 4£Ýì>>>Îøø8GŽ¡P(´†t篨å+gœÿ²)“Ä0 ü~ÿióóù|ë>Å0 ÆC?§<Ÿ?ãüçä¢u'„8m~ÓDÓŒçÅCä¦fN+ÿ½eÁ–›úȤ¢(I|5VÀñë¸n³’FU¡ôX ¥ë"'Í¿¿(xõ-½dž;ŒÒ™ÄוGŒP}Ú¥Vò®'•#’äw¡¼C`ÎQµ©lKž,`+:®ÂÌePƒPúU¬Q%qÖñü…ù¯dn¸¹—¿˜¡#fÅš<ËB¾÷œË÷2.yÃä'û§¹z]œ>z”ÿÜ塱»Ž:ü¼`ós]‚éH:ÔC<˜ÉpqþtW Õ¬²úÜäIó_-†ÏíE>Rg6_àp½Hº;Â]gRʹX†ÉÜü©d’óöÌÐg‡è.êL8@¦^瀙çWމŽc…¨3ø0=V#dWY±áäùùù ó_Î: ŸÛKpV,às(J9çâ&ùùibÉ8íÏ/ÉßQÍ:X!*Å ¾ÌÕì*kN3ÿû÷FÓ’„’y45Bùù GvÍÓqÁ*TgX òÜSsdª!²ÙÅœƒ¿³“üìá¢Y4Ÿ«*aZVM Ø*R]Bvõ“ò“]V(½H~D@õ¤|›^I> ¾Ùà‹_ ßyí ¤b1‡ZÏÌÙb Ë2)—JŒ!™J…‰G£$Sž Þ4Mææ½‚GÑX‚Þ®.j5½VòLd\LÛÁ²Lp½^×Ãá0>MCQT\ËÓTç …ßj~,™òÚr]·ÕC}S‡êºÞý€¢(d2†††Zí#ཿo7ºG£Qr¹\£ÀϱBýÍùàµŽŽŽ255EGG’$ýVó{†x,@ݨc¸&fÙG¼¤±|$ƒ‘ ‘­U¹y÷—8ÓøÏék¹yÅOñ».= EõQÌ”Pk~×Á ¡É™§ä¿ìÛgÌ¿'{#oí»ï”üùŒqJþŸ•ï?cþÏŒ·s]ü§äïë{ïýáYOü‚ΣZv.)ñcÒ%ä÷-ÝãòÉbf´ÂÀª}ÄÝú–$S»Ê”o; ý¡\Ãzž¸+#K¿ÈMŸº£ÎãÃ:J²_Eqý9ÿ¼ ãúSë›P‹Ck1ƒ‚j5tÆ|2óD:~ P½þØ@—N­ÿ Íqè‰{÷\§óû{2þg6=%ÿáŽ?âzó˧Í?þ÷÷dü/]¶Xp|<9ô1®*|þ´ùû¿ÆúsJ;Øðj¦…:êrçlÑ‚ Þ¥ rizãÞu ù@î Ðå;&B“B*zÞà[•¯S£H!)¤òØÌO9&×ÇËS|aÁòðÍ$}çõmjõõúæêO“­ïf]ø¼}þeë»npºWý+ûwÏHsíyÝ|úݽ¼ûÚÎíîâ‹wNðã{«L˜eÂå8áhÃàôö ‚ï|FŽMµ*Õ’Ë÷ïßÍë.‰DÔªüêî0ÏŽì¦÷J©¯ÄÕbìÞmÁ¹À—y†W¬ØË íYÒÏì¡ëíÔê¯àßîûa‹ß4ø7ÿ6ãøq€ïß¿›Ë.ì!©yóö>YÄÿÚ¿ŒòÖ}€#O?ÄÅËwàNüˆ¯~î>òÙÏa¯¸’[?u7û«‰Ì²å|ï!lËù½­ãôwqöж+´ zºÂ-ÿ4˧þG W€äŸÿu”ÇÓ‚ß½ ¶vH|àÃçpиJ¥Òªš¹vîÎ®¬ßÍË„´A1P÷z\BÞçÈIPuý:øð t ¨8`Hha™úè Gº/F’$jµÓÓÓ -àŸ_ÝÉ9:¡eøm\ÍA˜äd؈þZƒB¸ÂE„mÈI`D_¡âuÔÐáâV„! ÉÔŽfØ9÷¤üË•QÎéªà¡y=; DÜ€ ½! \ÉEÈÞñ‹ @ä¨ÛCãønDD‚A;«ó”¼ªÅŸå’K.¡V«ÑÝÝM<gxxècÖ ÊåSGg©[ufç2XÈä %º’~d_˜þþ~&''Ñ4ÏhÕÝÝÍÈȽ½½”ó³tuu‘ê覷·—îD …ÞÁå(ŠÂÜìB¤R)êõú¾iÚz…J®Å/Ó•Ô}úûû™™™AQ”EüJaŽ®Î.RKóggfQU•X,F­V£§§‡X,ƪU«p]A¥\¤\Ê199‹i™ÌÍ¥±‘ÉæKt¦ü(Z„æææBàº.===:tèØñwvÑÑÙC__=ÉÂUèZŽ$IÌÍÎáøyÝe~ⱯØ2Èk.–ùÈ'F8kè2~üЦiñƒŸèÔ-‹ùlŽºå’É1M‡÷¿k ç?F¾à±™p¸BÈW@S“\²%Åîç , žì`ÅŠtÅCÈB¢op~¿Ÿ=0ÂUE°lAô±ƒ¬é}>6ƒm;üè§¶ë’+”°]‰B©Š$)¼ë¦³–äKD¸hS”=Ïééì 300@2¬áÚ=}(ŠÂƒNsÙV‹ÞY).=ßâýÞÇÊÎm<º#ëÀýII¦XÑ‘U ½f↸é†åKòmÓÏ–³<½/O,ÂÑÓÓCÔ/SÓk$::q‡_Oàú„ë3ÈJ„>¤#»^ÊB-ÚøF Š ÂB‚(ÈX ²+á¥,˜nÄN’¥:a!ÙÛ¯ ™@M!{V³ ¶BøŠ‰Œ``ì®ç„!ÕZ·ã•j…j½ÊåÛ.åñ'ŸÀ2u†‡†hÙmæææð|ŸL&CÂJ°PZ cAs˶éx.õzD"A­ZeÛÖKhÙ6²"†>§ƒëu8}æ Ó33Ïk~˶/Š_°44¯MVìÜ´Ž]›7>§íϨa×IŸí놹lýØsÊ·ðñk%4¿Íæá[GŸßyàQ<ß' #œšOvAý´¼FDrDÁ­‡xˆ(Œð[ñ„zrT¡5„~ Òcê¢Y€¼è–ß®zª,…²,“×Q0w¦N_6E£íaÈß ÉgUfÊ>Ž ÷s2-'¢ÙÉ‚R3"ŸPÐ ç ZŽí †ó ó5I’püÇÐ%™¹ªK>¡ú`ÈPë@>­bé0YnQH§©zàúÖÊ1Û§ETØhÈTýˆŠ2 Ó Ë2–mOP÷}j¡`“¥p²‹(ZQD+ŠÐ#‰“ŽÇ,Ó, (C¦LV†bÇg×HSQhÈ*à†Ó„ˆhPP"² BA+ŒHk*SA“e/$­ËH‘DF8¡ æÅ犄L($Šõ6? Ñ%Á°&aè2 UBö:ÿøMh²ÈWùŽÖR$È(,òC‘ùΚüáüEÆ_(d¬#™$šfÐåç4þs­6r’’Àíø,ÔÛÏiü§ë-ð<¬( mw˜­4ŸµøK„dd¢A #D¬©“BAR÷Q…À!¥iÔÿa®E Udå]‰Hh2ŠïöøŠ4ÂHAF #ÈZš$hIõÂú¿ª"!áù É!†"èÓ¦.°”åñ׉á”J2©¡ €P$‰BJC—M?$¡ÈÔÿ-SEÈ ž‹% ºÌ`B%aÈ$‰×mÇÿ«3¨¾ƒM›7óÕân~ùÓÞ³§Œr“à÷îdÕù…wÕÎ/Àï Ðûÿ#ÑÔƒüÒãïí͵<1ð~÷Ó¼e}{_’$¾ÚãO:k ðLøKÅÿ«ñwçc¡äØç›üù Wò ‹ÿîœËÒò¦r õ*‹ýÚÎu[¶lé àoú‹•ü㯼‰Ï(³ióæe¢ø\.ǯ«¼«V"'CN†bÍö¯eÐ=Äâÿ¿zï/,«?×ðº[ª• A°§T"äÏŠÕùç3è¶bñÿÑ_ø…^ÛŸªÜ%é%ñ¼ŸÕÿÿç38WüêÕ¯^•Õ^œÓv:fçæ( Tk5¾¿?›7m¢¯¯Ã‡÷VêÏóÈårçàwÅÿ/xÁ °m›É“'™ššb¡ûÁƒ[Æo·ÛÌÏÏ÷îëÆÇŸ©ø5~on°Tê‰h—ò³Ù,“““=€¥%N÷’.Ï­³, Û¶d×W¬àúûyòÉ'W´«^¯÷Øš¦¡iZnûÏgÐÿCl$àû~}¾R¯×™:}šL6ƒª*¨ªÂìììªüótÅÿ¾ïcšæñæçç{&•JeUþù Îÿ×jµUYƒƒñ¼Z·ÿýØz™á¤ÃLûù,Vʤ87Ü–ãU–3A…˜–•°¨9U°Èx‹æÀài9+ÃøÐ:") zjš¯=ÿ¯Öêÿ;Œ†MK,Î'ÉäÓçç; ¨Q|~ ¾MËÄJ˜ÔÚhK1?í.Ụ¹!4M¢<5þ#õeüsûÿ¥Z‰>½N‹ ©\#iP-WP:¥é}¿ÑMÝÐimÂV€ð¤T]ÅU=’z’¡Â š •Óó|ãXÌïöÿ—m¢T*õ y5Mcaaz½Îèè(6l X,â8Nï=†!õzEQ(‹¸®‹,Ë´Z­ÞsHUUÒé4š¦áº. ´Z-6n܈ªª4 *• º®S*Åó’²,Ÿ—¯( ¾ï¯àwE,¶mS.—B ª*©Tê‚ùQõøÅbñ9ã[!ùB]שÕj4Zu‚ Àó;´ZMBâï»ÍV D3)¡É Js¥Y“j}Š ô"?h“ÊÈr,¨×u™Ê¼NµV&•Q²M5I¥,\×Ãn¹yÏk¾RÖñKñ } o°‘$ MÓB ô…˜Cq¢å …6§©‰Ö4 í£ë:#{2ȲŠm·Ñl‹f«…ïtf!¬è¤‚~jSöÓâWŽ„kˆvpü~IZÂYš¦,òƒE~¸„Ÿ òd¸¦€pt]adOY–±mÍÖ—ðÃE~êê²öÿåº*?û‡‚[o1¸õ¯áÖ7¾”[oœáÖçâyWÐsüÓ7L.KS©–™?’ÈÀŸø“¹ ›@ A*‚åQº»ÃÍ$³òyãÿ‘õuÞûû·Ý¬rÛ­¯ä¶×¿Ûn8Ãm7ÌžåkY¾xO’c*•sÓ!É ÜßHð¹?…Ô.°&@ b¾é1õ­?ž3IæÎå/ÿ_O¸¼ówB^SÈë_ûRn}íu¼áe§xÃK›=~¤Â?~ÛbÇX’J¥Á\96x ®ðwÌ%¯ 27‚€´&Ì~þxN&•S–Å?¯&I&“(Š„èºIè fg˜<å¢ U±%•ü@Y–q—jµŽm·ÐUE¤2š¢P.×qœˆD26êS•8G ‘ˆÿB ë:®ë¢ë:Šªÿ?ÊŸe²¡úÑ"_:‡ïcÛ.º Š©ŒŒ¦H”Ë>N‹y_ª"€ˆDBYÂWp‹È¼÷ IDATÝø="‘9ïû¿U8sTí™,Ý€XðŸèô„ÿ›¥aCãòë3Œ(Ïèþ“釡qù'ƒ³&K7ˆÿ‰°'üÑe “m/Ê18®=£û5зA¡òxxÖ`Ÿ³u-È&!“RØôÒ4ùõwÿ9·ýuý ^¦ˆ3¥÷L–n'Ož$›Íö„ÿ“ ÐÊ$vÚ¸™…gÿ’4‰mÍ Tûz&çò«Õjln¶(üìä·©;shÛk´¬égÿÙà5õ9CÏà\~×p·+x»ÿñ}”§›‹TÕ“ÿì®ðÐþ›!4i5ñ@ Ã6BÈæ¨ ‘Ù Z›¾õc[MüÁ³/‡u™Œ2èan(àœ˜'¨k(ÇŠ¼õ%u>wæü÷ÿÏ]Sá¡/øô¿~ Ó*àМ0pª ^–úÝ’¿D›¾7Œ¢_mâ×CÌk²˜?&¡¬ó0wõáX ¨è( E~åeu>3sþûÿÝ»=~êÏ›üô/ŒC óµGûùüIr+„¶² 4_ýrÞ&ˆÚüÿoåÆõ&ûj!¿±=Ëkw ƒ?µ¥}¸§¬“¯ùÖ+#þ~.:oü­Ë<ùU—Öu‡Æ²|3™ç€¬àÚ!^ÇA2øYN=ð“€d2Ã}=F]|oöÇü&Ñî Ë#Ÿï£2·€ÛÔÑœ"ùñð)ûÿsÏ_ÿ䇿Ҥ¼KæÁ~“Q|Ç í:ü4å'~eU~ugÉòHæûpæè4u$§Èà„ü”ý¿ÛþíWo"òufú±ËµÓ§Q"a§yøžmÖ7ÂÖm£¤3&'dìÒKhM„ºG$ŽÓ&ú/:þçòÛ³3H2‹‹ÒdxüÀè„H™¡eü¡K6cOFiÅcΞçây¹‹Žÿö«Ç—ñéŽF!8)æ•ãÁi#Ëè¶QôŒ‰í„d6ŒáÎ/ yñêóÛZ3þoµ4Z¾ ……B^R0B0<‰Œ'Å9ˆ† †LŽ‘Ñdr9…œÒjHø‘ ê‡´%+!P$¸ mèa„)4”€Žâ á äÈ^“_ð$#¤cž!?FÈ‘BmM~€…|üŒ&=küðU·b†aâyõZ¥'\/WÊ? ó}} £i­V‹z­B­^'™J¡(*©DÝ0q:.¾ïÑîtPß÷p]—V«e%ã×kJüÙ©R«=¯ù‘$“Ëåz"øîgÔ®ø]’$‚  P(Ðét‚MÓ–‰ß!“e˲hµZ½Ï/]!}w| âE7ƒ  Ùl"ËÏoþï¾Ñ ²š¡ãÊ‚tÕÖ%nûÁñt˧O½œ7­û:­0"iI(’Œávðm#“A“t‚Në¼üwœúøÓæqþf^7xçyù®]?/ÿ×í;ž6ÿÎæÙ›úâyùwŒüþyóï{ü<„ó—éã¢7í|Fù‡Çî_ÝÜûBJeÚï‰oŸvþáí©Ak”VivÿÎg”ÿ¹"þQßÊmòC‰ÿEð(ñ¿þ³ÿ¥ù·ç– áqì«s3ç´[<ûù·™ÌÊöå*QÙ‘C­(Ëö7¶l%ºÌyVóoó·½j_šü¥Í&¦\¶?̾0Þÿ,ç?˜»zÛö qþósÿ¥ü‘\œÿü\Æ)?!U±_ñ‚gÿ7¿vÞçg€x¼oøÑÿÿ?Ÿ¿ŠŸ6?Ë?ˆ·-ÛÿOò;øñöÇIå’ØnðŒž¿]þÙ¶rîöÙÄ¥OðeóÝËöÿKâ=Ü\ý‹ â?Õó·Ëÿð‹V>‡~ùÞ 7;Á7ú~yÙþ{ú•¦ÿð‚ø2o_ž^þ+Dæšó柫Å{yÅk_ÍË^òr¾~´Ã?üÚ&¾pû¿àº;Ï›Þ.ç{_ûŸ°á}kæŸëå¿‚ü‹ÎŸÞ~€W½æuÜøòWñ'ªÜù?.ã3ÿðešúµçÍ?oû—ñ¯þ>öúÿ¼fþ¹fÿ ÑðžóæŸ+ xÕ­·rã ¯âîÃ6wþ·|ö‹_Æw/;oþ¹/_Á·¾üû„ýïìåŸ×Ž~öGkðþ÷¿ÿÝ?bAþÞùÊÛŸ”›5ô@áîmš­òž<6äšüÁÓL>6Ë“Gxòè'Šïxi• ¹&÷`Çú¾e¦ï¹Áãæ]:7ïÒ¹qgìjögþCN,œ}i÷FƶŽ22:È•J‚÷[ÔÕùB øÊlÄÇæ—é!ëf‡Ð >6u’=÷”ùîc |ÿÑ2ÃF™Ùj™é3ólºl=¯VÓÈqRB0ßFTŠüì†ÍlÏZlÏZ<‘ä[s±¿MD^ÛÕë>;ñÙ <‚‰ÀÊîAa[òJ4‰ºû÷(<ÒÛºûÏ×ÿºÂÿn™–ÞÏý“qŒ>þ;ƒlº$ó_sÄÏß<@kn–Ï}Ýã·æøë¯Ì2r¥Ï:’؈¿ÿLÄž÷dÿ©&÷Þu’¡ü3303›.‘xõÞŸEI^÷òA¶¥RlK¥85#ñ¥}Ý;‹½ùúIEdR—^»ú~ÀíŸúW¾â¿ãv2é^Îdç.¶-ÙüÃ?Ãñþøó·sð{§˜X?B­)¨5™TÄËö -kk2-­àÿüÇçØ»7æÿΛæ¸öÆ­\}ý&~þg²lÕrÓÏ~š}èCìÚû ܾ½|ö/ÿŽÁü4ƒ\÷ò‡hoùe^rëGùÝÍ2È G§::8͵7nÅÿ騱TÔ‹þâW¶ò²=C\~ÍûöO¡ÝÊÜܲ,ãû>»Šßeà >dYL¶!øðVÒ¢ð_½d;¤>"Åû‹ð‡²  2ãp8suo njjŠmÛ¶-ã¿°ý0›_ÒAÊ„I T騭˜aF=dâ÷— B RÁÙ:E #¨(æ\R/=/ÿ•ò$®ÒõøÄŽÉ}€)‹mrlBÇ@Ä©³×†"`@@DQ\€ïúc=þ™3g‚€K/½”T*Å¡C‡°,‹L®Í[/c`hˆd*M"•æòË/g||œ\a„ÑÑQæææ¨Õjœ:ú8S§&iw<öìÙÙ3g‘)g!qÚmÏÃí¸à»´›M&OãØ‰”Ë•eü#GŽ`YùÂ7m£p|_?†•XÁ¯T*Ôj5Μx’ÉÇ.Š?==Åñ'˜›‹üÛ·o'•J155…eYô³nÃCÕ vìØóûF£ÕjQ«Õ˜=uŒ#GžÀv\®¿þzNŸ>MˆL¹8a@Çqp<Žã@àa7š”Ê ?q‚ï>œdÃØF^øŠï2°nŽò±­ õáïá†yõ }üÒ¯aëð‹ø­ß9ÈÍ×åx÷/N3h m?ÆáÃ?ůýþùâ 6Œê¼æÆóEï>P¯WáÊö»í63³Ó|þÎûî•[ÁÛ»NñâKÇØû¢4ïýO1Ñ¿‡ßø­¹éš4ïøù“Ëøø£;¹ýn‡Ñ©Ç¿ÿ1…Jy(Vð;¶ÍÜÜ _Ú×á_0È®à¿åíÇØ³eˆ—]gò®÷>Âúüµ¼ÿ×°wW‚ŸyçÑeü?øè·¸ó[¹ Ç?t"ÅÂü ¡ï­ˆ»ÙbaažÛ¿áR¯Þ€4:@zì{xcÛxbV!µ;OéÀ4Î-—ôO&¢Ï‘ÙÀüÓäGTæïX½¾4ﶬv|}ì’^}õÃû‘w_ÏDôÑÅú)êc»{ƒ%îíû‘FÇI}óœë;±lpqéññõM­Z_š_¼¾øüþ‡ï…Ý×3}sdöSX#*öS=çÅeõ‹ÇwÅæ+êï˜ÂÛ}¶þöý0:ޱxý³³ Úî<öØ·ìDûÖÉÿ0þÇæA×P­:‘ž RŒ>¯Ñ!,X„Ó-R#tæ‘MƒÎ\ ðJn¯žt“9ÍÀóâï*ÖIåHz•дhµAè2^Ã!*$¦›ˆt3šFÑ ÜRU¸¥ ¦PË6¤3˜Ñ4FÒLTM"ª5 IÜc%HeЕ$Ý@w|ô¤LXê0Ý$5œGaÉ4ñm°õÄþ]ñ¿Ê4²n–B= ¥:Ñ`½Ù]GÖ«È©$2ZA#t‚B‚Ë/)cÛ6™LÓ°¨ÕÏ %2™4–i180Èüü‚……³ß7OlæèäQõ&žïãù>ÃC\Ýl»MÇuñ\—¹ùY ùª¦Ò¶dU¦Q =Ï{^ó»B¡çkûäü‡ÇqÒãNÍÇ­Çæ|©Q•N#ÀkDI„©1·’]§SŸrIk™Ø ÀmD$GŒŒL§¶è¾/@n‚³+gyˆN=D/ø$Õ4•ºM.£0Wõhµã× å4!(6ò …VÇ'›–Ñ$ Ë’qÚ!†)‘²dT`¡0”WH[2M; gJTÚq‚@É Q¢ˆ¶"„@“$ê>ƒ‰MO³`Û 'TN:U?þÎ:a*è¡à´0,ËÔƒ€!SF e)4¤!Ó§Çû¦Ü€ S¡O“©x!ƒ’Ä\ólâ…f!=’8ÕñÙ K²‰xupI°ÞP$¨2ŸV¦"ˆñ£' i‡‚¤*¡+ ÏÃö’Š„,AÙÈ™ –*° ¤¦`H ˆ”!¸²€…N|=Žùî¿>øQ¸Èç~DR‹|ùœÃù!²ˆ–ñûó¹íÿQóxñÏe <ßEIÙ£ãA'€ˆ`q(!ôC‚HÂBtÙG–tE9oûMMAŽÂÅs)’ÀA¶áQØAˆH„ª oHø‘D'’€ I‚Èð„’DB"&Ëçå' Sˆ"Ñã{¡ˆ“BCA€@Š,PT‰¤©2”6ˆT 7’@DÄC-‘H¡)¤M™ÀQ¥óÇ?ed,• A„, üP dd]¹ô§¹O½œûÔË{÷çÇÓ××ÇïÝ 7k‚_ù×)¾8±\ä}!ü}ÝÇìO¨ìœTßÁ‰ãÇÙ81Ñ›S¹æÚk{ìûÔË— ÄûúúøÓ‡Úܬ ^¿oj…ÈýBù·zæKÏ_­Tèëë#Üô Êùky`÷u«ò³ê o¾oû·n]Óà«Í±e¦Ì]Óå¿úþ}<øj…OJ|&xϪüÕL§ûúúø` Ø» ü£YZaÐmNfÅÿfi=À‡~n¥øãÄÄš‚ü¾¾>>+›J%ÊÀ¯—K|„•ü®IÀý«”ËeÞY.‘p÷Eˆÿ»üû‰Åx¿ªTâ.±’ß5 XÍ \.óªR‰ðÐÍ7¯Éš™;»Zc·LMM¡ª*‡¦P( kZ,€\R.D€?>6FÿÀåJ…Ù¹9¦¦¦'“É055ÅÄÄIJ•"— Ä»«Ü ñjôO‡?4<ÜW/=½^_4àÌÆŸ‰4mU~"a¡(*®ë®i0??ß'[–…çy¨ªÊàÀ©T’jµJ­V_•¿Zé²³Ù,®ë211±Â k ióóó+ÎÑ­‡X ¡âû.vv–D"ïûlܰ©Ó§Wð»&õz}UþøØª¢‚ͯT*=ÃüÁ^Œ—ž¿k°š€çy   ª*ÅRiE}·èº¾¬ÿ_¬£Ö“2År +e!'e\×…T›Û –4j@z&‹ó‚L6Mb8A»Ô¡Ùh1;Uf!±é¼ýÿù6[B”„ Z«b¥ ƒïy c€ßIJ̘/"ÐB0âz$Èä2¤†“øV£Å™3eV㘭Õÿ¯Ë¶éÛ!'dªµ*ª¡"™q²q`† Ò;¿nêè¦NËn!+2 $U‚(DRd’é$ZŸ†Sqè´;ÌL×øA}9?•Ph·ÛlذË.»Œ7âû>¶m÷ì¦iÒl6±m›\.‡ã8=ñ|Eäóy<Ï#™LÕjµ·šš¿hÑM°!ŸÏ¶mS*•.˜ßn·—ñ5M[•_©Tz+®]ß¶m6nܸ&ß0Œ5ùaÒ××÷´ùZÞ¡Õ¶i·Û††i™x^USY¿~=W¼`ˆ‰MY†UTçÕlà† ËÅHTÐ ‡0j¢ë ý…A|W¡Ý”ð“lŸJ¾`’LH’ ‘HbI‚ $|¼Žý¼æ‡­UUÑ6wpÍ&œJâ.@g>Bn™8Zœ'œ°ð—ôÁ™}2¿uS<¯Ù5¨–E3¾_fuR©®ÙÂm;0¿OÌ-!Ö‚Þ"Ó!ä™››½hþ黥%üØ Z‚¢ϵç.Š?ª*‹|N©¸ Ѿ„'LüÀ'½¦¾&–ðc€jŠ‹}>7¤ÃWÖä;N{Yûj[ÆË(*ñä哺ñ\°¢ð¶_Kò¦ëÆA6©”K´ê­¦ n˜Üúº07€šæA™ÇeêS.wŽèOÿºÄx3"ýRå> Ëü‡ßÎñ»ÇA2¨Tj´ê.­Ô Ûn΃¹>æ‹P¦‰—ÉÏÃWVå/ÿPS0Þë…€âAT1‹ÝT@†Ÿþ@Š7íÉ \±iµ=ZÔ‰×ß”$2ÖšFˆ„:KäÀÌðå!iÿÄ¡9,Sbdd„ ˆØà~ðƒ'p=(„L*CÿØ(ƒ#ClØ0A'ìP¯×éD>ýCyªƒÃзÓF–²¬27W'•Ôèt:ô÷÷÷ž ãããDQĺuëøî½ýhù'±”`9ÿÑ)\7Šù ë<|‹„ê!†¼È÷‘%eÁ\Å'e :ˆþþÕj IŠù>ëÖ­£Ôi\ÐûÀ¶˜«HË„þ$:|<ë1ØlÓ?b\®2äXè†ñ¬ßrNŠrÉ[&ô'òGYÈ6CÒs ]%Ñç%/’a÷Ÿ¤gÒ˜÷— ýIÀ²`4A›ù:Hºñôï?kµ¿9_Ç·•eBÿl6Ë «Ckî8§ŸxˆéEìRí‡ÿÊ™†œ[&ô7 ƒV¿HùäqN?ñ§×Ÿ¢6[ü¡Ä~r†þÌø2¡¿‚VïfúÉãœ~â8'ÇŽSœ:ýŒâ[ 8–3ÐSTNÏQ‘¥TÅÅÐÒ8v‹T²)yšìPÇ6ÂE×%ê'ðå6º!¤>|¯J(øæÊaP&<îï3Îÿ7ùÇš:ú5 *6Mî2rßꈇ1šÂ9l“Ú݇Øt†ìµ œc¢à¢'$÷,àÕÛè’‘êDkøí"JC oñÙ_8—¿<þoöŸ<)xÙµ þË;Í»ß/ø±Â{û<öަ¸û͇®ïc2{†ß~Kƒ»î3H©.&$îúÆß©Ø\wuÀðPš»çkLÓ¡VDBðâËà¾~õ)û»&Hõ%8þ½ÓL\¡*E¦G6‘¢R´êCÖÏpøj“Gï{Œ~™‡ª§ÙúòøŒß&•ñQÕ$m»NP×q:E !(\{aýÿ¹å¯ìÿÍJ´‚ošÉDŠVѦo¨_?ÃÃ;G:¾Œÿ‰Ò,æ¾_סSDÁàuâ‚î?«µáH ŽCt¼J*`9!av!\Òi‰Ó'hÛ6ë®*Û²c ^ÿ³ÿÒÑa¡ë¡LÕ±2¦ AfplWŽôÄZ!MØÉ=+ñoNÅyj¸!ZµƒH€î‚od ùõ“ tl›üvs´R:~Ó:oüß’’9x8D˜’ÀT4)BïÈ$T@‰@††ò„×!ÔBŒ¤„n t_`û0U8e»äd,º#“`{¿-UH.6”ˆ’¯ò›!pÖä'UДˆŽ õgÈÏdõ7¿M8òæ Ê?÷ûo\3ÿ\›ý8÷Þý>ù¿AÄ®5óÏåʽüÂÛÞÀ'î)Ò8^ãï>ö;ø#ÿá‚òÏCk÷²üóÆ#Ÿüà ÿŸ[æ{IKKWì¿Zi4,FFJ«ü/ÇvÏ&uÍ.Äà‡%þøÇüǧd,]%å\#€¥Oç:8ÀæÍ›—‰õ&Ýß—nKK>Ÿ_vìÒ„©#‹«¡tÔŽ='ª½q%'qlW?^¬ß||å\ˆEüî™E€E#€®àiñ+!¡}Vô¿´tÏ»ôï®yÀu¿{†oÛú­UãSH¨L{š§¬0Ò ÇÄI¤²ÀNé+LÖ*Gõ²qêÝq Ç"…q!¯x](þwÿ^b°t?ÄÝr®ø*ŠÐÆ…LˆÓ§.Bf>øŸz¯y´¬à¯&Ú¿r®øzGRî1–žÓ}ŸO—Ç[+Ù‹øG4h…€† J Š„"ü&k•uzHF‰xá'ï`wa窯ë×Sœ±çzwêAÀ‰Æ ÜÀîmçšœ¯t¾QDÖRü¯÷ôñÍ#ƒËû'+IÞsƒÇ]÷U‘dÀmôŒî>ÐFsÏþÿ·AS¹y—Îo~Ú`óøòL/˜à›GÙØ×âWÿ¼ÄÝÚ|ÿàßàÞH‹¦RBEs#†2›;{M_œëð¡Ò,ÓF‰{Ä_wà!¸jDa$ 9AŽmªÚÿTZlè?ûAõcS'ùg¦©ÎÞÀ†ä[WíÛ’WÒpâÃ2#€²{ºd›wî üŸªÿm~’²{/¼€Ù/í¤0²èŠ™. :6VJb(?Ä_e¶wž/ßió‡ÿgŽÖÜ,÷^`k¿à_¾ïrÿ¤`×à£#‚£Ó\5²Ä²L·(hIEFdìFÄ?ü3|í;³áUÀ[·~º÷ò£u‰¼¾(Y?¤{69ºã¾ƒ¥Üþ©OqÿáN>¼—½á÷ÈnÙKñôøÛVy>fRgcÒå¿ñçÎò #rlV`HD²IBsd·ooï¸ì–½Lº¯à¦Ÿý4EûöíãCú{÷îeß?Ë·|÷Þ2¯~ÉYñ?Àƒßû6Wm»„ˆÌá'·þÌCüÕw:¼îu¯c~~ß÷Ñ4ó÷R¸E%¶#·H‰y)A$bf–l‘,V›t –Ö§Ä”DmÁãÑä®Þ$æìì,ãããËø»[¹)B ˆÿ‘\ˆHB$"„,ˆ¤X´€‘ó{†² ’Í>L+‹>äKÎË¿IúoŒsüzl¢,D “ÿb~$-þ.""„¯.¼¢ý f \{:#ËùÃ=tfËavvÇqÈçó‹EªÕ*B*•J/Ñ6yäfff˜:þ^ÇAµ2tZMfJ>|˜íÛ·S.—9uzßuP‰j©L½Ñàȉc´—„eПÏ"‹ˆÇ?JÛñXXXXÆo4(ŠBeñ³Mw¥ C‡1??¿Œï;m¬pŸ¿ IDATÊUŽ9ÂŽ;¨V«LÏ̺®Ò¨ÖhÙ6ÇOMâxÉE¾®Ê9ú8žQ©T–ñã¤4ƒJ¥B¡P V«¡( O<ñ¥RiߣRorüøqvíÚE³Ùdn¡ŒD„eØ&×åä™Óø$-“þ|CW¹g‘ë·ïÄ)™Tk:#;Ž2ùÐUXf‹±ËeúÐe\ºç>ê“#ä6áÁol¥Ñ¾”·üÇ*ßþÞU£ÓjðÀa®äxÓÛOpIß w|£ŽÝ¬¯ËÐHZ:¡ïrß# ®Ý|éEóßùK.ß½ïA„$á4”z)— aÚ(½ö']ßwèL;øF ·U#ÒúI¥¨õØ6a>¨4¹ šÒêñ#+Pšå#5]²£}Dn½×þNÚ"lºXi©î±mgÓÔiÛ6¦•À÷<<ßÇ4uVжã ÕFJeùJ“ëÆÇ1 ƒ…b‘|.G2•¢ãº8ŽÃé™ÓT*U<ßÇ÷Uadx˜ucë¨Õë½U#=Ï{^ó-Ëz^·ÿGÍo?ø(Z!¤6ÕA–d2ët:µ#£àÔüÞd¼¯;éwê±Àß©˜Y»êE~3÷wW$Jªh) ·îÅ«Y­Óqj>éqN= 6×$PLr‰€éb¼ŠåHA£a¤±!@Δb±°Ñr"tê†,˜¯y¤-…ÙE¾.ËDŽ›$M‰vËGÁh¿N½å“Ë(4쀅r‹v"Á¨äs¤ó·$5Ên@^“8éx J1¿ETýˆ±Ø?œêøôi2“í˜o qÚ‹ÇZQÄ„©S$Џý[*%7`ÈT({EÇ#›0 %ãøøjD±!Ž! DH't|„Q@Ë‹7ø4AR ì0Âq|š®@à#i»!!š¦âùņý#æ;„8Nˆ¯†;á"ŸE~D'â~HËói-L  °Èç<|‰¶Â"?D6“ÿÿaü Ó"#膎fèTkU)DµÔÞµ…QH2 „.hLÕ°mx¤¾œ?:œÇ0 ,Ë"‘HP­V ‚Xíû>ù|ž(Šz3žçQ,Æsó[·nÅó<úûûi6›lÚ´ EQhµZ ’L&Ù¸q#ýýýhšF£ÑÀ0 $IB–e’É$¥R©Ç·,‹jµÚ› YÊÏçó½~öTüf³¹&_×udY^“_©Tz«¼uùÀš|ß÷) kò7lØp^¾§—‘dE‘H&“äòyR©øçðð0’`»–Œ$tN«ÒqÇ ¶ï´ÐD§ÝÁé´Q”Ø8ªX\@–†©20*(ôg¨V´šŠ”À¶\ÏAHë?¯ùfd!O´Éf³Ø¶Ô00¶úƒŽVÇ?‘¤= + º®¡äCZ“ /ÙlñàsÕÕ»h»3Ë ;Ûø%_„ölI’ã±P¹ÝnãyAðúh¶êÍoNÊ‹ü#\uõÚny™@òŠ‹á×'<²Ù4¶ÝAj¨Kømüú¾‚’hžèò§¹êêÚÍÆ2€ä%üxEi1î#DD»íáyA /‹¬ˆeí œá¥›¬¡ìZeÜÞï9È/P ©ðOwš\6šãØñ“lÚ<‚ëÏв‰ nõE[  œf™þ¯6opô Šÿ¥47Ôt;g!5 ¶Kõq-ùâ×RìÍrìø,›6pƒ…˜¯«ÜöZg  ˜å؇àõŽvAñ?° ³· {`\V‡Ô}{·{ æÅÏiüßý‚"éÓóâ‰"™ÓóâÅg=þ?æK¼ð}÷t…J1O»QGè“hW;„~ŠÀË£² ßõ \¢6ZbˆÐ×ñ=Ÿf¹„£¡cѹ¿ÅGxÊø¿¼#ó’ÿÝæÀ÷`P¢r_†öÃuøz®p¾Þ!h$šÔìzüZ@p<€!m|°©âg:´>[DŒH$^b>jñµ…_^¿<þ¯ô$~ýïC~âí-„ÿô…$w§É÷¿ç’øÁþûΘ”’üXÿûŽù<~&b@8lÌòDYæÛ¥6ßüd‘I]âCoO°ï> á·Ø¿Ž êÿÙ«;œüvœ3{ü°IyÆ&œvA—¨Ìup&^ËÄC‘û™ÏôcOäx¨~[ÂiÙÌ)#„``koÁBŠZ$×ûÔÿŸ[þÊþŸßísâžØp±ø¤IsÚÆYä»sÚ “°e¢‰!õSœÖS”FMîwðÚí–MûXAßÖí µHo Ÿvüû¬$ŠæQ«´#A£^ôr:ˆN3‚Ð!©þÐâŸ5 =Ài†t§£{^ü,ð/,þ’ÈzìÃÿÌn߉݈âyÁÐAÕ/:þ/7¦C—Œ¯Ho"‘Ó - TÙIÆŽà¤%É#2"´²@rÂÔ¼ˆCsMÖÙPA‹ /RðÚ-¤LÐŒ€È4\hÏI§wM~ŸìÑü¿ì½yœWy÷û=µõÞ=3=›fÓHI–d¼ÈF f ŽA^$,/&&ìHòòœËåÍC cnB°Á˜°Ù&ƃ-alY¶F4ûh¦÷¥ösÿ¨îžž™žÑH6QÏg>]UçÔùÖy¦ºªúÔó{Ž¢R>~—Ô°›ø‘°‡³&ß%f|¦Æg_²9¬œ5?ôÊ7Ó‘î f¨,ˤX.Q*9uê$éâ±8›º»I$‚غ^Öâ屃[·²8?ßÀg²ÂápC _Ÿ•=O­©ÙŠåñpøiÍßÔ×O{{;ñxœ™™™F2OÏóÈçóôôôà8¾ïãûÁ{÷zrGÛ¶1 MÓð}Ùøl"‘ “É4Æ9r¹³³³ô÷÷‡ß÷ŸÖüØâ£(ªäÄB‘¼ô a„ëòêÿ9g²½äÝüÖð÷øÒäÕë×›>À«:ï ×è¬J\WP ëhaƒªë´ä¿ù±O‘ó–kyý¦orÛÂ+×­wÛâ˹&q{K~ɶZò?0ÿ•3òÿ4q5¯H}…;*ÿsÝzwT_Ë•ê—Zòté_¶Œ?܈ø<•J{ÁeTÇÖ·P› wKð.d£ñ‡rjcï+Ô}Wœ±®œš ?ðkgHiõû U–ÏÃÅ—"óõlñ4‘ŽÞFû‰ÿ|Æÿç×ÿ+ãoÛd–œXÒûcËÊ›ËvÝ÷OyümĜŌlj0Ú³‡囪‡–•åó«÷²ñ·‹…öe"ôÌ©|#þ6–ý ²mxYÙSÿüŒÿ1þÝ®ûZÞ<|<ÛEÕ L§ÂKË7sGS€Oe/Gõ%ñˆÎ¯†>ÿñöFÙ?›ÏGUBBÃõ1wцùkÝWò÷Oþ þaƒñ¾Ûüç–ÿ’uü~£ìC‡û6Ì?:òöFü¹\¼žÇÏïû~Û¾5ãÏ«Æs¸ëKÿ}Ï¡¨†pg„Ùõ’'NæüîçsèÇwá·]¶fü¹§_Ì7?ÿ!¯ /¢¸s÷";Ÿÿ¤ãÏÉ<€ì‡þónÜÔekÆŸ»êÅ|ãÖ?epà9ä•ÎüéçŸSüyæè—Îk­y¥¯¯oDgg­Úèë[úp >zòÜDÍu;1v‚-[·œqÛF­˜¶‘zõ@®æ ¶õfSÙˆÕÅÿõ 3`U2€Ø±cÇYµ½¹Ýæå•fõïP9¶õqG;ØSÉ µÿ¯ú§›õ[.oÔÌ£KBãÈà´Ž0XðøéJËDñJ€¶ŽnŤµˆO‚6&—ɳ¹ÒC)ºzŒµìXh¹p¿.þŸ^Ë$µIá®™H nõD+íÑ’Ç…qµ¥ûlm½6êBìº9Ò¡ì:€Â®˜Ú2@Yþšw,bš$ÐtÊ®C·¢$mblüZáÿµÄÿëYÑZXµí…ŸŸS[å¸Î=£=Üzß(¿qÅvuIpÿÁ/†Q ° þéÙŖ˱R0ñ’ç´-kß÷$üb˜?ƒÉ•Ûç¸þsšs‹}ù¢jw„Ï<ô8oeó²}OÐN‚ W…±?ÀgV–­|íˆÇe;àUÃ醸ߛ¯ $Ï/ýHzHÕyÈ_,©"×=ÿªÈeŸU$Udc9Â’ÏÎtþ+}nÙ¶›?ÕIú‚>óÑ9Þñ•ÅÇçÉÊÉF½«Ĺã®`æÊOß+¸ú@¬±ðÍÉ1ž}ùo½|0H"PÎQXàÔLp~žš‘üôAxtìáÆ~©øG>¾öMxõËa$¹t~6óï¹ûO¸òª0üÒp¢i½™ÿʾ¾Uý®ó~ú ¿Œ?þÝþxÖ®;yäþËXxÜkôßžT¡v+¸á†¸ñƸñÆ—­|ûˆäõ¯„OÞ¸·!þ¯ûàÁƒ‚y˜TWÿz{Ž#µïk}ÐLUU\×EH Zû_# &Õ'^Du€z.QËû5 á!ØsàÌ!’ =Û 2Ï*Š‚ã8¸®Û’/¢A£BA6ø¤¨ R4øÈ`]J‰P£ˆÐaŸFº³ˆ$x?sq6ÀW ‘`ÖC©wý7ǃ·¢éϯù¢ÆG‚ô%RB½ tpÀ©Bø?wßó<°cËv …•j‘x(ÂÌÌ žg‘LöÇ¹à‚ 3&ýøÇ?¦&ÝÙᚢёˆÒÛ¹D{ù|žR©D2™¤¯¯ÎÎNfNP¬z ô÷qé³/Ãq$ó3§˜[@©ñæÑt•x(ÂÉ“žgÑÝ݇a\vÙeLLL°sçNL!;M(œ¤h{芠#äÒ»©—x{…B™™„A@[W•ÒŪGÛvnÇó³SãTª6 ÕUÞõ¡1„¨Š¢×â¯`Çôs¸äÊ3úÀelß÷ÿä9¼ÿ#cèÚƒH†¦#ÉExÓ«âLΔùÜM#\wý1¢Ÿè!N“_˜lôÿ‚ ÷P*U©³,,fQ¤DGòÛ<&*ˆ­H™å¯èhÉÿðßÍ‚üeÓB‚ŽX˜X$Ío¾"ºŒŸøû-D"ʹÙÛÎT«6Åü"ù|EúàØ¼ïÏgÐ M8 ìBQ,^ýâTKþÿXÀ¶“+>t$c´µ¥xÃËu&gì¿í‹{2µÌÿ›·mÁ¶}²‹sT*&ÃþÒsóôå[©Þ|˜ñڠɶË#°¢Ü>¸tMÝvy„q`\ÙÊ®ûþcÕ5·yÿq%xƯ×;rÅóØvùùü¡Zù¥µòo×ʯaÛå‡À?ÔÄßEõ惌×U‚ö——Û—I–ŽïÒF»+¯ÎX¸|4íßyy„`A¹”Áûw6ñjÇ_¯7qÅ5t®8þ…ËwÁÍY¨ Êt^aèÿ/÷ϱÿÃ2x€³=;Á-PIÆãI¨ M<˧dùäÅ‘Db*a©‰©˜Bb¤óµ™Ãcµ$J1•pTÃ-ÏGÙŠŽgkÄò9”ÀŒuI˜xå _Ñ žHC5¡I9™&œ(E|KR¶\òJ±XÀèh#,‹Db*P!Ètv"F¨¤@œÚñA±ìH Lϱ||@ Ïá„‚W®ÍDîJœDwV: 'À²bpz޼!Р‘¸ŠSÑc:PTâA÷ Á‹ +™F•0KhºZö°Œœ(àt¶¡ŠžPèêê´LŠ…"1ÓdûÈvÂá0fÕ$“ÏbšU&''ˆÅã„»"”V¼Ø9²Ó´p\‡Ó óT«§OŸæÊü2÷üðzåR‰R¡Œöéïé£#ÕN&Ÿ¥R©<­ùOëþŸo~Æ÷)NÚ¤Cä',òAÀbqÒA)}Ú†ÂäOYH–fJ ꔦ\òɃ┋/}п0aSœr—ퟟÆhŠS²&’I…§æú: ¦lªt\Ç2%é˜ÆbÙ¥¯Ó\‚lÅCUUÂQaúL/ÚlJëÌf\d-@ ¯+„YõƒmRÒߢZv™^°Û;¢*1!­¸ŒÄ Ž•mŠUMšFÙ’lÒ4f\—‘˜ÕàQ¶6û@<¬0_•+;l‹êŒUƒ6¥”l«^c[}ýX9ø­QßÞ«ª( tEuÊ®OxL°XqèLÆ8µP Ué1 JÅ ¡pŸŒ$@éaL×ÁrTú# ‰¸Su©* ÙjdåØ.m1â!…|¶DÎÐH¤ë  ÿñíü"‰¨R㛄Âú ¾^ãKú#b >t¶…jü*9C4ñùoÔÿóÍ??þt5H²¡…hØÇòURñv&3Ú¢*qM¥"Kˆ°Är–£ Ö2ôù2H`( ¨ Ò“Àò¤ ’êšB4ä#ªj RÔ EÁ“E($ ’%1ô(³ùmQ•ˆª#=#ªbù –ªU(øÒÇ“ !T-àkl¯6( ý‹ê>å‚CÑ×H)¤"®)†ªàô?¡xdJ6Ц3uºJ[TAõBà;¤ ¶§¢*Z„˜ªª }‰ ؾ¬%qèªBDõX˜+³èJzÚ躊€3¾·èýü³oìdtt´å;‰ñƒi¾ó‚ ½Ÿ_`omÛÁ“G ,ŸÞ»È]¿sÙ¾gó¾d=þ˜ ÷|KåÝ#c¼ån·%XÅ_ÏV¾¹ò».÷¼TkùÞäûÄtŽwä¸ò».¿^ÛþÕÑ£DßÒ ãÀ/»smþFýpðäÑFÿêëÍËc6ËøÍ­~uô(¿ÎòwJÍ ¡7bsô(ï[Ñ&NÉ ìpS­ìúÚú1¹´~Ó“ä_5:ÊÝMë× úÿ„\Ukëõ²æ}[ñ§çšÐ[Øéùyºº»©T* {³åòyöïßÏéùyÆNœ`ë–- V[*Åý÷ß¿lߺøy#¶ß¶mNŒŸ`ÇŽí¸ŽÛ’¬â¯guác½\!‹®ÚP5M²Ù ;vl§R®095À@?ýK ;Ά¿–íß¿Ÿûï¿Ùzór©TâðáÃìÙ³‡Rié½Àž={8|øð²chN@¶Û¹sO<±ô»äâ qJÕ¬²sçªU“S§N044DµjR­šõS§N=)þ¦M›˜™™i¬o«½³®T«lÚÿÔËëë•juÙ¾­ø+ÏC ×µµ.ÊJ1½„#t¥)‰€¨Óµ \*“ÍfA´÷_@:Ý^‘°“ SèÒÀ­½Zïü’`¦eµ“2mÄŒrK¾'=²Åé®4¾ç7ñwÖø%ðŠL.L¢ùaÜ $'wH5†­'0DG ¯¹$8ÒÅtª¤»Ó8–$P ÑÓO2Ù~ <—©¹I ©ãµà‹ÅF°r&“!‹ÑÛÛ‹iš,,,päȆ‡‡) H)™››#‘H°}ûv„ 5Îu×u‰ÇãlÚ´‰jµJµZEUUz{{k³4‡™˜˜ ³³MÓ˜››[“oYÖ2~¥R9#ßqâñ8}}}Ëø===!…BLNNž‘ßÓÓó ã×û¯ë:sss¤ö€ð$º® Ç)ªD£QTÂLŒÏrüÑB ãSdÛöR‘4§f¨æâ8Ýt VÑRir…ÓY2…mé\×§Z1Y˜±€eY¸^…|±L8FUU,ËÅ‘Oo~8ÆòMæçBÅ÷À>%´Âa_HÚŸmàû.¦iâº>A&’%Bax§Ï‘Z®w\O‚2¬“qЇ|Ö˜†iÖ‹mµÈ¶"|ú\øÆrþQÞÁ“à;ÌÏ‚3ð]Ü“¢OÁp3Ÿ&~¤Æ÷k|Eh[%Ù¶SôXëúÿ¦Ó]¼éÖ,×|½Œ.A(óà‚Ï[„n ˜@!øS"ÌÏC—é2„høqp Ç=fþÎä¥%aÈܰÿ¯›ïäÍÿ–çeßr–ñ·ßéÿå‚Rmâ+ÌÍKÚmè\ÿÇ €õ(Lþà/÷ÿµ3QÞ~‡ÉKïò—ñ‡o‡øõÔú_¬ñÃÌå!]†“:È4à Ñ…/ÀÕj0ä¶ôÿˆ!†D¢©Å\•©¹*©6ÐC ƒ}Z p±å…)ÂaØÜ ªRú” 0k/Â÷*D¢6a4  J¥ Š †‰X;¶mcÛ6! ð«Ä£ÙóÌ·šø‚bN2µ`‘JXè! mülÀï¨ó©ñ+M|šø•ªÕÄÕø²Æ7ÏxýéÍÏ´ïÝ…lÞµôyòÈ£lÞu!›w]Èkx”[î žiŠéާìú“žËÖøƒ5îÒçÉ#lÞ5Èæ]ƒ¼† nù^ðî£Ø~Ê®?ÉI«ÆOÖ¸KŸ'ؼ+Éæ]I^C[¾Ýƒ IDAT$F"Êŗ̃®_¼]pã_·sÃ_ÛüñïëLšqRÝ|þÛS|ä•Ý|£hÂ1„Å‹ÜðˆJØ)ðg/òùë1}Ãçÿ–—ÏóÜ•iÄZ-žl½¬ÅÇ,Ò»îâ,fÑ#bô0{rŠá¡nжIaΧ=Ùù^N#$ ¤ŸWÆ‹løüÿ¯å¯>ÿw¼"à}{‰_:!H¯àSôÀè¡xrŠ®¡nʶ E±ÄbNC‘z¯ô±ž¤ÿ¥º•=/ ³ø˜Áwnû,_¾c×â³×‹?WTA{§A’²¦’vkïÛÏ1þÜ:r?üî—øÊ·N"l“ĺñçª*hëÔéõ«Œ«#¦>©øs÷ñOrïÿÊïœÇ÷‚¼ëÅŸÛEAªK£KV)« Å‚Dúg~¾Mƒ%Á~ý3H9ëûúY©ÿon¯¯…8òl­•Ðÿ)þ¯¬­ ÖZ)þožåæL¶VÝz"€µîÎÖZ®;v¬±¬µ+„w¨ì©d`Gðå­'ØSÉ,ë×ÅþÍ‚ÿ•Éêû6[«mukëH1bûÖÅÿÍ‰Ž…|´0î¤I.“'N¨‘À4‰×^Ç+!räy¼Z•DàXÈo0}™4Ñ‚›ÝJÁ~]¤ÿd’´j¯n“bù[Ü•‚éæÙÒŸ [)úo¶yÇâTÍ7uñs"€¡OÙõ‰i:Ýzˆ²ô bšÞX.KŸn=DLóW% ù FÝbµ‰P'g²D¨s™à¿Õ>­¬eGŠÓúª‘àÓoîàÞQÁM×%ùÁ˜à+?:Z[î%çÎ7Äúu±]ð`vt+9m×®À§ß¬qïhpŒ¾'¹õ¾Qnº.‰P5¤ç6@ êÕp0“Ì[ñÿ»Nãí.!£–Bÿ»WÄ*Þm.O p· ÿ€O¯èïmã‹l!hïÐxðݯ'¨"1¹vYýµÎ¿fáÝV&Äý­ÛkeWˆóʾ>DaW¿<ØöGŸx˜ßzÍ¥ì½Là=ÔÇÕL´LìpÇ]¥eIÄûC›.¦“¥óáœ`¯`h“ßâ ✸ûOøçw×á•ü¡M>ÞC}Ü3ý›ÅþW^õ¡eI®¼êCüÓ-àÿsñ²z·OO¯â¿ô#Üs÷Ÿðén`öëAý{¾~ ½¿ös¾ðí¼î•ÃüûIÉ·kBÿf±?¬Npã7rí 7ð¢}ƒ¤—Æ.yï yîs:xѾA¾öí‡;"¹ñÆrà 7‰DÐuÛ¶Ñu=x p%2Ø…£YÈ#̱ èOZ ´P°§Á] Ê ÔÑ=H%æQ„UBer‹6wî¼á8A< 5ß Ct÷ß>lG‚š øŠgáf³ŽbôCdWÀ·Fv©—™Í:|©ëõg䫞OâÇ€ðnÐ7A¹€°3?H2 UZßߣÁ—z?|RÄö(Š=Š4$syø[ñ„XâK)ÉË ô2Ж&‘J¢…ã<ôÓèíé&“YäôéÓ?~œéÉqR©GŸ8JGºƒÝ^L&“!¡B¶\"K1?uEÓ1Q3;år9 UÉÂB†Žt3ضM2™¤£ÝæäÉIzº;é<3?™d|üä†ùBr¹™¼E¡P Ob»²Á;633ó¤R1F†H´¥ÐÃq~úÀýlêíiðGGG™™'™J1;3KGºƒK/¼˜……RºÂb±@(–bnrÍQ• ©TŠÅÅE²Ù,Ùl˲ÐôåJ0ØœL¦°íÓ ÿ­ðwºƒÏÞ: ,¤ÏGÓzÈç¢j /¼òEËúÑÂÜôÅI—^¶o™ÿµpœº-‹¢jEåºëá+_8Ìk¯Ýƒ¯ÆˆÆ$…b…ªéðª_±ù·Ʊ-“‰Ë·Ò÷àXcðEÝ·cêÛû P.@öÇ0öB߃cÏóû{&²xpõÀËJ[9ð²Ò¦/ßE߃Gâsuß«¶÷=x$hçàòœaÿÆ^“¾pü=W5ö÷¸È^ E:<È®û‡`¯IçƒG˜xÏUpóAØw ÏgZ_ыᚒÈéùÆÀH³™Fê`'¢x' ˆd'ã`¥Ã¤|;Ã(–Ñãmèüü<ñ¸Êœ$ ðÂ.F±B©3…7]B$“(V‘X܇"T"ÄB ËŠ¡XªÍjj¥Òè”ð ݪ`õ·ÃtÂ)ÈæQÚtŸ†ð¿Ó ‹@"®QOW‰DЋ•`ðeº‰à¾è$¢èŠ݀`ës· kUÓdzf†±SÁoú¡þ!@pzaŽD¾’FÉôب8$3}vÄ Š—ùš?îûŒU=ŽW\zU•xX¥lc Š¢ ¤¤Xõ˜²m6i§Eð›a¾v|RJ¶E5Ž=f=AeD,DEJ E ¡òEŒ`:qlÇÃuºN¦\E èK·ãXeÆs t…Œ¿ìP|ÇÃr|tU0Ø£\°)Ù  ãÙ.]_ѨTLüÿ6|£Æ· 5¾hâ³_´àKt;CM|Ïö銈ßùoÔÿóÍ??þG€®y hø(äl©¨xÅj£ÿ®®"5¨øe4Å#a(T-ð\@€íH4×C×|ÇÇWŠ€°®â{>Ò¨„¶òñ…Ì("@S|„Ï÷˜)¸xªV¹Éÿ>•²@1 LÇBS Ö1‰Yç» ¹>º.ðm‰¯ÃaCÃs}ÛGø:Âu‰hA"ÏóTéáû>–m3Y°p|ŸfÃÿ¦åR)9øŠŠ%m M!cy,ñ€¯Õùjm8ÆPð=³ê ]P}AÜP±xRž1éðìƒqÌï¼ ÃË~¸T·Y€Þ¼-ÞQŠ»?¾Ç~w”Ç~w”Ý_Uàœù_mÍŸ}c'³t2Ìâ*~«öÏÄ¿ç¥Zƒ÷ëÛw4¶×èÍöÕÑ£ÜóR{F4®^öþó‚LãØ×㯧¯ñ×û·žµòIsÙ¯7­¯L°’_ñ7Ûß4÷¹…–¶•OšËnjZ_™4`%ÿªï­ZmÛhùÊõºŸÑÒm­ÄØ]ÝÝÀjúÖ-«ß7®Þßy×]¼äÀ^ràwÞuWKÑss@éÙðúû[òëõ[ñ[µ&~4mðê€t:½ªî@£>Âÿýû÷7Ž}=þJqúJ?,ý·²={ö¬[VOPo«9iÀJ~]Äßl;wî`=Z·¬ž  ÞVsÒ€•üºˆ¿ÙZmÛhùÊ+“ÔAð%„ ›ˆuïó[˜œ¨%CV"´÷Ž78Ý¿*´wµ“îÞ F(!Ž=þF6‡Ù5Â#?}‚O=bË¿+Ï¿€„t —X×n°žXÁ“ìÚ\ƒ”jÀ'àÇ’›ƒ1ûpŠcOü„‘ÍFvmã¡Cc|þÔê÷†­øB‚ Z/Zji%™v(äƒäkR@4Þ B 5!±B²#‰im2œbêäÏè5èà‰‡'ùÒt×*¾ªªôõ‰vÇÇÇ)—Ë?~EQ°, Û¶9}ú4Ní½…®ëø¾O¥RAÓ´ZÒâZ2~×¥X,ÇÙ½{7‡baaÅÅEzzzp]—h4ÚØÏ0Œ§”ïyÞšüîîn<ÏÛll EQ0MEQžr¾®ërÀP(D¹\fvvÇqˆF£¸®K.—GW‡0 ¡°†P‚Ù+‘ÙÅ ‡²³ý’*‰x ÇöÁU‡#‹e<×¥\.7f¯ …B¤R)¢Ñ(¶mS*•ð<ïiÍ×= WU‰D"Áùk[²à i’ªª „@Ó4f¾æ¯^ú|ègPKf¾+3Í‘Ž>ŒPÇñq;È!U‹#C7P5•H¦ ·/®ŸúîÐ þÒ3Ç®l–#ííçÀ‡HÄXÁ—h+ø.Sÿn¬à/[í²mŽF(ÔÄ÷PµRqk|jüȺýÿ§„Êçµαí— Úþö¾ óB•׿Ú2À"Ç.àŒJòIutž×îé䯭E„€G-Áv„P5ý¬ýÿÙ¨àsZtÿ“÷gùè¿ù*” ¨Žf0Ç óX™—ï‰ñ‘måÿƒíÆø«ýÿ™ä³Ëø7´ø‹ÿ¡ñ†WÄA)VâøÑö8”T°§\^ûl¿Þá"¶á jüÖþïîN±°§\†g’ꈡ„,„0‚YIEp_Ê– ôö¦)–‰Davº»ap'd³P.B4 ©˜&˜Uð<°ð}Ð4Áâb! àÉ*–岩ï|óuœ_’êPQBB(”Ë~¿Boo„b¹zŽ|X\´j|ð$Xt¬óýï{(Çk.^›ÿädð=û¥Í4„ç_¹ãQ~i3üä$ºýò£°˜a¶Üó¤®?]?±kmbóåü@xþ•;&Vðùè—'`Öd±œxRן¶ÕÛ ÄæËùðü+wVð“|ôË B¡¬žóõçÿŸÿ£àý¡Â “Á}¼ì"ÅgÞãŽ{ÀÌÙ — Þ,Æ­’â·Ñ.D Áë_ÓÁo6±îÊq¸ÉÑQ6àÿ¯|¢ž—rÙüÂÓüê{TM`~ îø.˜·€h˜÷) ƒöaá4Æ?õÚ„/„k?Á­ËÂX΋>é¯Ç_òÿ· .?ƒç}†_TâŸSPu°nƒ~%ËŸþ$¾Àb׃õâ `À¡ƒI.º¤€ïøÀóU>&ýã翦it ,ÝN|'KöPð´“­é*bV–°xò4 =}ÛŒj toUŠrNÏ?ÿ5üµŸz¶,ñ~c5_©ñ©ñ•ÚÆÍ» N>fƒ,п3„Tªg}ýyÆÿ¿xÿç,Ÿ4Ò”¨¾ ¶D1$1E€2ì“s€àÔ|•=¡Â((øšGwH0kkȉññ] "‰º>¾¯÷RU(ù’yWϧŸ YïZü¸"O‚ïF$]Müòš|H£m/ÙQK°œïž?‹Ïy+¬T^{«‹Ø;zz¨Ô’ŒÖmvv†t-Öp¥ÍÕDñ¥r‰Xüרµ Ä®¡6DÔC‘>ÎÂßÚòÞs?\Ç _ôZd×;åÍñçáƒ7"4 ¦ÀÕ"!§oà~šØ¥pîñçÝïç®E¸²óm8ÄWÅŸGû+\UÃõ\DX%Rq‰!Ñ0ÿ ’;®?ëøóómZ«A"€ôºbýæëÕëŠ÷Ö–i´ýT$8¶–¸£¢ÿVûŒŒŒ4‚†VˆŽŽ.ë×ë¯e+ë®ÿד ŒŒŒ¬ª[·ÃÑöìhýe­‹ü[‰ù›¬e‡£lãôºõšüÍBý¶Žt°JÌÈ?>¹jóšVos@j`¶ºàP¨LH é­ëÈ¥¯L½ÞJ›^£­æòzý©­j–×õÙØ×N7×[iÍ3¹7—¯U¥5 øëB}’«ÄüˆüÑôUÛײz›»ë_ šÅúû:/j]1ÑÇ‘âtë²¶+ÑÇ‚¤å¸Þëÿ`¬—;œãÓoî@z.wþ8·l?ÕHPŽë´iÝüù̆ ÿƒ_ “sçõ¤üo}Oråö9n­eNúþãi®Ü>G9®7’¼mÇÒà‘ÚdÓû4Pÿ¶ñE¾Öô½º* ¯Þ¥ÒáÅÙB–K‡ƒkÁmã‹dÔti>«¼ù*‡Æ‘Qu¶¹—%.áÄø"o¹8Ëø #ñë–wõÏúùú«‹üGâ×-«,«·òü;Vú\ƒ³òü{ó³67f»O_Ѓ>ü;sj&îsr)ï]/”\¸õbÔË–õ·¿bï¡>{˜•vð!‰÷P\Nãqð²iÞ5&9Q㯴:ÿöééeüñï~`ÿº[¹}ú£kòOÍ( >ÀÐ&Ÿƒ—M3~ëÀHð–‹}:ûTdSÿg¿~ÿþÀï½á ß>²i{à 7pÍ.ÁPßô_yÓ%üÓ-àÞ{%GXþ½…¾|û8÷Þ+yîs‚þ¿úš‹yôØÃÜpà ø¾ëºhAÊ|‡‡éþú‰wª Žƒ\D„Oƒ/‚Ñ~OA††áÝH4„¥AµJ-ÝÐ B(Q@U ª‚̸¸(ÃX–…ªª!Vñ¦ö“þÖ½¿eÇ‘rž€¯"Aí4„­!ÍBÔùê_hHM@E;¢ÿÌüŸº¤îÌÐñ‰ä8Ò_€P- ²éƒÔûÆ€ŠÐ4„u2ÿRSÁ0¾¢#u‰¬@q„±š_ª”QT±éiäÔÉH‚ ¶Sö`ËÈ¡PˆññqºÚžE._à¹Ïù%È,Ρ …£§¦Ø¹}3§stvu‚™™92žÇÅ_Ì¡C‡Ø¿?™L†ÁÁAÆÇÇ)ææÈ{¡P˜R¥L¯ÚÓ’?¼­Ÿp8¼ŒùÞ4Åbá¬ù¥R‰žžž€Ÿ­ó#”*eÚÛSœ˜žANMÇÙ½m EÇgxë‘H„±±1ºÚžE¾P «£Û¶É,Ρ+‚ÇÇ'صs„©¹ ]Ý= `vfŽlÖ碋.âСCìÛ·×uioog||œ|f|#!—Ë­éÿ¶t'ÿç]‹¼ëÿ¸ÄB:¶ã0ÐÛµ¦ÿ‡‡ÁäÔ W]ÝÃMÿ·ÎÝwLòýï¾_yé_†¾8ʬÄO¤‰uhXÅ4Õ²Çá#G¸ò¿Ì©É@˜‡=þ•ªE$âð‘ǸøÂ‹èhkã‰cOP­ZC;½0Ͻ?úƒƒ ’ˆÇ™_XÀ´Lªf]ÓèNwa§Ú˜_œ§XXz©\©V)• ,.fŸÖü|±ð´îÿùæ&l|_’ Q˜´‘Rƒ!ò6BäOY¤ƒ²â”Cl“Šç{žôRâù^C„<& TU‚$WÅ©ZÂ;$Êò}ŸÔ`ˆÅYñY,9ôuÌ,"¾´Áô¢M:®3½`±©Ó Wõ±L‰n¿Y:¢¾ç!¥`¡ä ( ™Jp<¹ªOW Sñ@Jf³’ö¨JÞ”µÁqŸ¾Nƒ\J¦Ç´ë238^ ø#1ce‡>MãXÙa[Tc®âR6}ÂzÀï­H)˜vþ¬ðç|Ÿ~Ã`Ö ~U=zU•ùZß=Ïc$¦s$ç mŸªo1ŽQq\2¾Â`$„§3yÌçMôˆN$®1[ª3€x’B¡ˆíƒ¦ãúeªøä‰ïKUA(0–µèV%1M#볉¨BÅq\a™ìùæCÕ·HGk|±>à‹&>Ä4µ_<ãÿóì$˜ŽA:ðMgMþ|Å!. p}„¡¢©e„üîö5øH¤ˆÿ…€ªícøØ¢BX÷° )%ѤRpÈV›Úÿ›®Ï`l­þ[Ä8®‰ªûA°$à«àÿP ’UÇà @xI»P°=)}¢ºdfÑ$g9ô¤ÂøŽGÅ– ÆÂ-ùÓ…Àÿ–+¶G<B¥Öÿ:?#ŠÚõÖt|tá†×üjýW¼†hü`z™H}t4ΫÏ}Þþ=í]dü` ü ï ú÷²wðØïŽ2N'Ã{ƒgÃß=ò¶oc÷Çñþc¿;Ê+¾½zö¯Ž%ú–Nz?¿À^XÆÿÎ 2Ìÿr ªÝW<´ŒÏ ‚1ÛOý0à›wCøc‚aþ‘%þ»GÆÖäÿÍÑ£\ðÖN*Ÿ]X&jü`¼9ÚwŠïáÛÓÁ˜ð55~]ä_aè[:¹øxäõ|¼Öÿ—ýp”wŒñÀï,imüº¨ow=!?À˜ [¥eh½¾²¬Þn}½Þÿ!Á²¾¯'ä‚IJiø•Ú£û÷åÒzó2µv›ß`]5:ÊN)—%8“Ðà ±ü·ÂÎZBÏúöR.[ E»uÑ~.Ÿ_&R¯T*¼äÀ:;ƒÿóÂÂ/9p€\íwX[-³.²oÞ6~2PjD£Qî¼ë.öïßÏKàGÿ±ôº.<èï§`€ÓóóŒ8±Œ¿ÿ~’É “«"Ä2~Ýî¿ÿ~^ràÀ²„áã'O’Ëåü;¶¯Éïééaxx˜©ÉÉe`¿P(Ð?0@6¼loïhð÷ïßO¥\¡`’ŽÖù÷ß?;vlgÿþý<òÈRBù:¿.êoNn°ž T*ÇË@Ëõ•eõvëëñ#á?{xiì~=!?°,1@}¹£=˜±&“Í6Ö›—›-YšecÓ¦MD#Ž7%—?“Ђç÷f‹ÖfbªoF"Ë–×jwåùÿXQeß#ʳ«ŒŒ¤ˆFªEDeH IDATàTr߬ڠõŽ ÇžøOF†¢ ¿]Pr¥2(z$ı‰ tw²©}+°¸tükœÿ—ub9„/­20&d,‚f#Ü#lÃ4mP{@ë&O>ÄÈæ4‹™Ó¤;Ò FÈU\ÌR¥Æ#ŒÓß¾•`Öèåü•çÿã%Kw‰^ýý!BF|»”$Ñž¤Z©‚šjôêÔAz¢Ø¾C2™D*QLO 0“ó§H'Ót&k_ÑÃïÚµ‹¹¹92™ …B¶¶6¶nÝJ[[–$Ñ]\\Ä©ýÞÐuL&øÈçó‹EÚÚÚ(•JtwwS,âîp8ÌÐÐP ¨Ìf‰D"ÌÏÏoˆoš&Åbñ¬ø]]]”J%Êå2sss«øápx]~{{;[¶l¡½½½%_Ó´eü\.G©TÚ0?‰àkÁözz("‹¡iñxœJÙDQ@Ó E‡J¥L*Ù@'›-pôÈñà;!]IµR¡Z61M!†kêÙl–b±ˆªª><ù¹\?ãCDÅs!Óð=Ÿê>¾aÞiR.Kü1géÝñÁ‡~ÆÞË.©%€ñ'–Þ}𦢍TÄDœd*EÆ+€çãK\¨Tª¤"&s§Ï‘?ÊÞ˶7Œ7=2=Ÿ|³Æ·(—Á?YÁŸfïe}ãSkñ¿Ú’Ÿ›Ü¸ÿÓI’X„ÊO=NcÛÈVFqjj±lG /Ÿ×ø ¢¬>eþ£“ ¾Ň'ŽM³mû&Ž›abN×4 Nð#]U]…ÅyhO©èº¤½½Uõ)–« ÂÄèùæ;MüÐ >_%“©Š‚ÿ³âŸ†ö$è:´·Gk|TÖ¼þô>ĨÝò0ð𣬶`öùºøêŸòþׂõ[žcV žÓùŸþI¹‰¿:q³Ï¯æOðþׂõ[.²(Òçtþ'd6ñ -øÁìó«ùÞÿº@°~ËÃ9§ëÏ3þ?þ¿Ýöùé—Ëìü–Fh³H¬©(×>»@û/ Œî8Œ=á[˜“Er3“C:Û‡<$¨Àsºßó½|7^|bÃþ¿ÍõùÏo”¹ð{:áÍ6H‰9áMÏ+ÒþnhWDáš”§L2_R˜ìWÙÙï"}È~¿Ànÿi„¯—ÎÄ_îÿ[]Ÿ|×ä’{5B›ƒˆ:kÚà®—Ù´¿Â)±!®‰9ë“ý'˜èSØÙî#=Èß–çö· ¾vHãkÕØŠ/TO’ªñcUIùIó%ƒí ØP¨ò”ñ;êw“ÚŒôekir²•VŸå>‹5ê×÷IÖÚˆ…tLâ±8åR™R¹D¹T&­j¯Y8ÿtåÛ¶¢(ßÉ–eÑßßeYø¾mÛÁ»šh4H]ˆƸ‰ïû¨ªÚ˜ÈJJI(B×uÒé4^x!Åb˲Ðu½‘ÜQJù´ç«¾BÖqÑB!lGA.¡¨Á­—½‡ßxèïZž_½âƒ¡8Šç‘—QÀæ_.z7¿ùóOµ®ÿü·c´Å¡Ôô-”¥|~Mþ?Œ¼‘·û|Ëö>»çÝ«øŸÜ|-ï=ù…Öõ/zíYóÿR})¿ŸûnËönìyí*þ‡cWóGå;Z×ï»jMþšñ‡/~™ïÝײ½çÆ|ŽÔ–ëû§¬’_ñn¤n½7\Á£Mñ‰‰?dAù…n–#µ™²ëñ‡ºß^sÖúȹÄîܳ¶¨|çžUñ‡<²ßµ²×o;ûøÏgü~ýÿLüm`ÏÄ?ÿÿÚÿkݤUB‚P"A¸lc;é^‰Ö6 U#ä-»ÿx%—ª„„K8ÕE%¿¶ÄÕ ¤Ïúþ÷tá7ÇŸ[ÛßO4Ÿ'šÏ¯Š?OŒ„7¾õO°Ÿ_º´ßþ½÷Q(¸\9áóšBÛÈo“yì(Ò¦, ¬žw}üù¶ÖâÏUñç‘'>Æu¿ûqd±Äs/ïäï}ù¼Ã‹vuòßU¼à]Lÿälήžuü¹l{SÓÔÆ5«ÅŸGû+Þô;Ãur<÷Ò!Þõ¶·+8¼øY þñ>Iê‚ÿÅÂáO‚´È§û]Š??ߦbÿÀ ‹%’é 8¢¯oq­}åõ]›Ûh¶®x/zR©Õ_úÖëÿ!À‰¦ÀŒæåsýoÔêBýV"ýú¶•‰ZÍ.Ó\¿¾\߯þÞ¡¢ÿJØSÿ¬ úÝ¬ßØ¿ž ^Öœ UR€æºæQ¯!üof¶óC è(E-ª?Nå’àánóDø›÷±hJP·ÇOWРùdÍûybmA|+‘~}Û€Ôâþf±ÿ`S{õòú>“¸ ÔrnÔ üKéÜ/+gjo^7—¯µ­ÅüPô1¡ÓfÄq]I\1()6»´@Àß¼ï)Kku_vÅTÊ®ÏPÈo$X‹¹ÒVŠÿXø9Ð:@«dÍIŠÖBc¿]‰>Hôñé7wpoS\à‹÷¥øþãpë}£ÄJ‹„í"õ^©F‚XÉÁaŠë?§sÓuApÜ_ü¦Ë÷ßΕÛÿ_öÞ<<®«¾ÿ»Í]#$Ë–÷%qœÕ8NHú@YLCRøåKËúk …”@ZhKCï·ÐåKC[(- ’–%¡”5À²³Ç‰ãØŽ-Y‹%¶™Ñìw¿÷÷ÇI–ä% „6>Ï3ÏÌÜ{ÎyÝóÑÑÜ™s>ïÏg!+í€/Ú:Í Ÿ­¯9¼û–PàËÍ·{ï]:¯Ù°4“À0>}¬ÌÞIhöš°÷Q(óÅ‹3\Ö<öÑkçë¶ÄÿŸ€ïpàñ Þ²-Íæ`=¿an䨶ýüÑc+Ï¿ÁÚg‰ž”êÉ h úÏ¿7¶çßÉâÿV_:0X› ðš×ݵ„›]-óÃÙÜ}Ð便E+Ÿø¾€ï?ÿ·ÝëÿÞ¯Z½šì.™|î’v{Åÿÿþ¥0TíCðîNò¦‹Ö³ss?¯ú“Õœ˜”ÚA+á¼Ü’ò9îp÷A“½ä·Ïoxù‡©Ô`âñY ¿Å%‹ÆqbRZÄÖ–òw>oÞ¾B—Ú×ÿ½o¸ã€ÄÍ7ßÜ>¿ðõïý ^º{-ëú|þêO.á_o–Éç¼ùñ7ÅÿoüÐ ñÆÍñÆÍñæK|^tm¿ÿºûö <ÏCah𯑵{ØúøgÙôu›Èk5³Ü8·˜¨oÓ!.5wÖ›{_A‚@ îƒ`!@ÒAŸÉ`úM¾vþõHÍl-Žã´#wžÌÿYú Î?ø-”{²¯<Œˆ(ßþˆ YA¨1!J脯m>b!é™DH F>Ÿî~íñ[¹ðÈ>äõt)Z5\×Ï--ãåêˆT‘£Ô‹W÷Pƒ€Ú¬K4)c¨ëK5£:va ¤:õ¼K4)aäjÈÙ¤¤OPMb’DOV©ç=D*…_£-ü_|}éHϨ§»>b®FÍò‘ÊeÜH4ÈÌ¥¨Ô£ÈAcÖ…T ¥$èðæÂp‡áï.£îáç]vl¿€¹¹9|=¥oU_{Èhа<ñ8¯xùµtg»yì‰Ç©7…%-qÐÁ'à3W.èèÙÙYfggyÍ+þ~ºïaª•arÃVQTíÿÿYåA€æF $Y"¹F¥|"ÌBn:E¢–s!ßÅüA ‚€Ò “Žu:¥Q“Žõ:å1‹ÔZê„KB Ißóñý]•(5…0 u‡Î¸ÂøŒIWB%äòB’«»$„À¶ • |Ÿ©¢G&*¡Ç$_01k±¦;Ò~6ѨÄÔ\ø[¨3® ¤0 v‡.H£bÍs1™I/竚¬VUb Ö„m¿aC¯$áC†G¯$‘ÐCï@ÍfkBk?× DTf¨ÉX%ËHBàù>=B€¢P3ýö9!ƒIÀÀlI„ÙÊêžëx˜žƒ¢J8¸” Û—@ö1}A±j"«2º ’ÌœéQv@‘J’qM&gùH¦>xBbʱ‰Ûv~Eø00Û8 ?ÀöLŠUYq–|˜r\bØ6è¿ã¶ùÏ¢ý…‚8ëñK5‡˜*#„(\?ÀõAW|¼ Œ–-+> G`YÍcŒ1ÕǶdê¶/¤³·Å"“Qe) …ò]òqÜpüš"h¸¡_™„Ð%ŸrÉf®fá ¨œ­ýK6½’ ÓÃñ‹&?€ˆð0ME†¨¦Ð$lO%T~‹ â»LçMô†vÙ°³À·Y,R¸ñöÜ?_ïJ›´p=Öü<¼ç­7÷/ªÿÎ#ï`xh¨½?²uëV®ýá‡w$þÊÀ1.¸E0²?¼‡éì×1~û¤}Œ/<|5Ü?9ò=2¿|*~«lݺ•[àí ,áÇÞœmˆ½9ËWî8Æ_^nL·ê¶ø7 ¹-1û“Ažûn\Êÿçèë—å_·º¸ˆñcüæfº#äï=¶¬˜ÿSï¸±Ýæï?õ¯Àâcáßf±`ÿäó­ Ë•–˜ÿ#ÇŽ-+æ¼q¾¯<äß÷ŽÛuCÛ,îðÆÅç_|š€G…X$ú_(æ?qíµíã{î C}çºëÚÇ– 8qíµœXpþ¼S4hí›u¤ÓKDêûy„£GÒ¿f šþqfgfP5“ËÈè(ccc¬].Æ·Dð¿ñ²—-Ê6Þ¿f ;vìh ú[×1Õt2måÄ Ž=Joo/ñ™âOÅo•X,Ʊclܰq ¿%ØÚ¯[¢õVÝ¿«+ܧˆ¶Å¾¡@øäR*•–å_qÅ‹ø]]]lÙ²¥-æo …Åb~×]ºf§q=ztIÀ€“Ï·‚ ,WZþóÎÛ¶¬˜?ÚÏ/; öDNœ8±$`@4Å0M¢Ñ(G]àäÒ0ŒEâü…bþ…Nu}«Â`ú“SóÙvÆa¹\n·k4l>Å^õÉóÿG²)Ú Swaë$¹é'ÉOHìÓ‘®Rcx&u·‚¬h Ë ŠÐ&(•Æ)×5Ò VPEÀ‘/Žp¸ë7i4hsWšÿ?™žfãx…t$€µS”­ò'ò(ûèW€€d‚k#ËjÈWƒG‚_SAR@ ù÷Xõ‚%üåæÿ£sslËWž´`m…²5Ca,úX õy Äð=Ìj]f"Eƒ@ÓÌS©• „ŒP*¨Beä&_L£1ä¢5ÿ­Æ$333Äãq2™ ¾ïS.—I&“áï¬tÏóh48ŽÓ~m‰D‚ÙÙYÒé4A0>>N4¥ÑhÏçéììD’Âì­lk‘H¤]§•]íÉoei[‰oYÖ~©T ƒ)m¦mÛ§äOLLœ–¯iÚ"þl¥‚mÛø¾ªª!p]×ÃŒrRÏ ð}‡zÃ@–’©/áùQ<%Š@Á5}Œ†…iÚ¨²F,£»»»=žjµÚÜA€išø¾OµZ}NóRiƒ±qÀ±=„ P·Ø„çyø^@)§ò¾k²ìä1FŽJì|ÞÒϳ—wso®ŸŽçW‘Æ’8–C53ELᨪ ’$ÖÖд$Iœ1nBiò9Æ ü9îȹªvü`>M¾íïÇå&?ÇÈÄJ|›{Ç5:¯¶‘Æô|uY¾ã/åTÞ~M–šöOîHpÜôÉ7¤ü_¬ýo¸&ËýMû¿fG‚ãÆ¼øÿ—aÿ·]“徦ý_³]g 1/þ*ö×"ÂŇÜôòô¨avz]Ó²BQc4ñx?¨K„¿›_™$ˆ% Ç ñÂÓ? ŒCEUUL³JÐÜžÔše5øò´u„0‰¨:†G<.ãÞÙñ }4%ü•æßP¢“ø’úøÃ1‚ÀC ?ɕͼë·_ÈOGŸàD3Wȉ‹ëöSœÿc}eþdy-?;‰?v–ü¥óªâÐäøÃú<ÿ„³€Ÿâ§£•“ø•eøg÷ùsÎþÏ®ýd¸N°ÚÀœˆñ¤ Ÿwööv3ý>RÐä ãGt~ûïl.¹dÉÄ×,\>,ñµ²ÎlQлß'hò¹Gψ¿Ôþ#.Ì®u‘hÚ¿!12 ðÆø\ºCA‘\<ÍÁµààøRYaº}Žc*þ‡Ò¸Êí7ùOÿþ+„„?£³+ƒòñ Œ "#:Á¦€`½ƒ4Å_[Æï¿¿8þ™ÝC¾´€?ƒ£‘š|iDÃ_ûÌÿ9gÿgÞþÂi®¥H ‚ðµõÂȶ ˆ‡{eYOgÂjŠã%¨d¡!É«€šP)•<: ~Ä#Pp›ÑŠe¼¦¨¾ùUÕW| –»"?P$ÄÓä Wã.+ˆùœ!_c²ðŒòÏ´TÊstww·ß§Ò™0âŸ&QI¥3‹„ñÀŠâ÷VË­ï=—ø–ï·}A…4 Ö¬YÓÞ+h Ö$Ij––$) ¾ïy¨ªŠ¢(Ôj5 Ã@®ë sþùçS¯×±,«Ý^$Ií |Ïe¾ˆ@_$Ü“®›E×ùciô•Eõ?qþ[NÍ?ÅøÿiÍoñg_]Ôß[_µ"ÿ£Û~wûþ¢ú“}õ)ùòE+û¦R)*•ÅÁ¯v¾dËû®Ú S7/­_öâ^†žªÿáÏáÇåBwþÿûdÿÃèNã¶ý‹êozžÎÐSô? ¶#‹r^¸×±’ÿ!ÿq|qýmÀ~ñ”ü?ÏÙÿÙµÿ9ÿÛsþÏÿÓí/®[ùþÊø.D’¾%’rÈzuuùûOvµ…THS¯5@x²@‹%qlžÒý÷—Â?Åý÷—Á'?­ÿ¹4úqœm7ñ…ǬQ=¾xב£áò݃s`yŒÕ/{/##68>Ú± Ö}Ã3â=úOè]oâë_=JoW„;ïx(*å¼Ë…qð\ÆÝÊšë>ÀäPß ˆþ?#þçÊá$Øü¾ðнšÎŸ¼!C-ïp_~,ü¡eõËþ’ÜЖGü{Œ®·ÖÿüÙ.òõ×_ÿÖ›H,t(9aþ¼èÿ"V¯VH&“íGµº˜¡#›Z¶m«@µZ}:×ÿ´Ë£=¶ìñá¡!JsslÜ´‰ÒÜâuOEüßê¯õÈ4BŽ?Þv®i••Äÿ­²e˶nÝJWWÅb(Øo=·Ê©Ž· ½+t|èqG\r ‘¢)ºø‹ØÉ‚ó˜‡[Pº‹»ÝÂâ˜îœ=á“-¸…€?øšÏrefÊ âÖI4"$ÏË“ÁD.ô¡9Ê?„ŠJ@§·ø:ó ¿ââW\j1 Ó°È9&d„¢üÑÒèºc·¬ø¿Uú…µB&-$*í°äýÉýT„ß~¤ø¯Þ¸¤ÿå„ú'—'j3v@&µÀ’÷§+GÞÒXöøj]!#«ÔוpYñp–ñ¯‹ø¤•€òIöïÖ$4IF“dâB".+¬Ödá’V^÷åå¢+‡BÛ[þÚ–ÿ¯T†«ÃØ^£Ý×Dcš‰Æ4Ï£;’ä›[;‡ IðÀÏÊÈ•ž]EÖ’HrIžÿ!PO¨ü¯«¶2RL°±«Î{ïÔØ?:Æ=,~|0É›_XbC¦Æ{ïÒ‘+¥Eý˵2÷ÿ´Äƒû=ªŠÉ/#÷DÕùê¡i~çñ2ÃÍ©³ŸnòMdz[/“yÃúÐé«Ü°øöD™#%ƒ#%³”cªT¤¯£“©R‘¯“øê„à!vá+ÓŸž™&ߟ£“ ?žZ~þµÄÿꇷÖlÎÙÑü+Úaf(µù¨Ú˜±£hàMo=HÊ"¬DbˆJžÛ÷ñ{ïeðxè{ÝvÁ¶nÁ@Ó÷÷–7]Ì[_ÙA,)ѨÜË1ò£(£'„ª09 *>åšàëu¾¸×a߈`ð¸Í—2˧>=EFϲ~Ýü<.Z‚-)Ÿ»s9¦Ôظé…üð3ïaô±YéKH½‹×ìJ¶ÛÝË1s Öæ—k‚t2hó/{ÙßÒ±u7½RüFì‹øÆw’ѳlß!¤B'd¡Óçßù#6¿æسg7Ýt>ø`ûý?ó>wËeÄ’GŽ=ÊÇþmšo|9Çw¿?E©>Íà˜ÅªT’GáÛû7ß|3{öìaÏž=t]ô2ªú¯ñÛïÚKŸпû•˜¦‰ëº¨j¸Ù6Øý<&É“øzžêÝ6Õ{¦Ê*鲋|µR€.B*€t­à|ÜBî°ÆFÈS NÀh™5¹3ýGxž‡¦ií  Š¢0>>ÎÚµk—ðŸH^@á`…ؽUJ߀¹aª¤¢×|¢W N“?†ˆU(}‚´@Ýl ´)‚È ì¡·Ã¿x¯;+þÃòZjÇt~Ï q¯ úÀ©²L¬Úå´øò"êÑølÈ—6€Pç´<Þ¨IþNÁ_Í^½"ÇÛéí͆Ѿ"QÝDðÈå&Ù´m;õZü\!)Ìåsttõ‘Ÿ™ é$ˆèÝ]]Ô«UV¯ê¦\š£Ô0e2†ž¤8W¤0;M2ÝAµZ%‹‘N§ÑãIò33te3‹ùGnre~±0C½^G“@×5²]Ôk+óçæŠ” ³Ä)jµÑh´ÍŸ+Èt¤‘„@×cÄÓY´Àc"7É–ó/ Z«Rhò‹³92Ù>Ê¥¥R M ³iuufÂñ¯îe®Td®j!Ë2m~µ<‡¦GÛüŽŽ¢ñ$ŽeÑÙÙaX¨ªFG¶¯mÿ­Ûwà96åj…ïü4‚Ù(ÓÙ½úŒì/Ë2ÿµ?Æ­Ÿðð<£^ãÛlæSw(Üð®îøŒÎÇÿJæÛ?€ÎÎ4¶ã¢©é®Umûo9ÿlÓ¤T.±÷á(Ú™ì™Ûÿ'§¸íS†QǨU¹ï6>wg‚·¼c€;ÿ#ÍGÞãñŸ¨t¤Sx~@DÓIfºÛöߺýõs¥"ßß— Zʓɮ:#ûK’ÄÏwò©O æŠõ*ßùîy|é+Y~ÿúÃ|ùkÝ|øÏ-îøËÙÔWãÄ«.!·¿Jõ†]D%—ÂÏs‹QÏË`Üvó•çQ˜ÊÐÌ'ï\­R¼Ép!§{ìƒë.aS_mIûJÿyíþÿ¸´àü~*ý»›ç‡Ù¼+JáçÃlêËsâU»Éí/Q½áj¢’Õ>¿¸ÿýíù;™ IDAT˜¯¼˜ÂÔZ:‚©“®¯oRaûC÷Ð=6Àະ©/ÏÄKd›í¹m?W^Lcj-±íc«U¢&Ö>t鱦ֽ€l_¾½Ónß¼þÆÏ‡Ãã?&Û—gêU»©ì/Q¹áj4ÉjŸwÕÏÙÿY´ʇXÌÇÌ&°kÞš$²§j‰I˜U=)á'Uü\?ÃqT”ö71A4!ã lP¦æ+&†ž "»%Uø]îx è{Xy=)Q¯ÛÄ2r³ÿ*n$üÍîVMô˜„S5‰jV6…UóðÖ¤‘DOJUŸd—ÒnoÆcX5 ›ÀƒÀ ð´ž ©j¯X£.RD5³f£edü¤5ülߎ 7ÛÈ  lA¤R@± ìHjÄÅ®øÄº”°}®†áÇñ­¿j Ä$¼’Ø8}iìŠC°¶«áâæ¨I™]ÏwÇv]U&@íÌbY&Žë⺱hUV)W+Ô dI"‘H Iù|žDWg'¹ÉI‚ÀÃu=ÎÛ²É陎N¦g¦E—ìîîfÝšµä‹ùç4ßñÎÙÿÙäßû`è`ø¸¾À©z¤×F°ÊŠn–$ûUb³ì‘\£Rpˆv¨X·ž¯çÂýzZÁ*{ ½6‚YöȬ×1Ëб.Bq²Š£I Ë£àX†Çꬆ@Z“°\Јè-¢Pmx¤“2SE—TB Ã)ú餌cA±î’Œ+Të.™¸B4&ãÚ>ņKW‡ÆLÙ¡aût¦UNÌÔâq¢¾OÕóhEÛcK\Eõ )IÔ¸Ä#]“)Ú½Q™!Ã¥+¢¢y2=ºŒáÀ¤çѩɟU²LB—±\Ÿ)Ïcu\å„åR úb #†Í…ÙB‚Àóðü€5É( ßwèÑe<ÛeÊòIG5¬ "It©ð„ +"•$âQJÝFU}’šJo\Æu 3¥dY$%‡L€é ,A@Ê÷že¾ÓäƒçÚ¤vßcÊ‚tTiòÅ>'ñT’šrßnòÃÄ2¦O“[º3çìÿßÔþŽHª./!Ë® kÈ ºb:–£ŠÆ±½Fè¸G€@U*ŽF=OËþv Èè@0Ï* [&©ÊÔ ˆ«:>6BHŠïeÉg¦êSõžžý-? '¡ !Kž K…’…ŽO¹ê‘„ì‡ÎO4E¾Ëè¬AÉöÙp#z×o¿²HGŸÁß|{~ÏàíW¹/¿I’úkxd÷<ø¼ùÇðÐÅb‘·_YDÿpåÁ}ùÝí½L&CinŽb±Èušà ë Þ÷êqÞ~e‘îëÂ5Å”ÞÌ_7ÇÛ¯,¢\#ñß°Þà§êEH’Dášk¼be¾{?Œ÷dù©zÑ’ýš…üÖcëtômþû^=N÷u‹ùê$ÅÎËCg³k®¡xÅ<²;| ^1ÏÃzçÑêÎØŠüu’Ýs|ð€7¬7ض3rßrõ›yðyWðÒG¦³†Lsù΃GvϯO·Æ óûIÅb‘÷ÔæƒsÝü¶ùõÜá¡!ºººø'¸¾\ #‡}¿ç­7òàóÂq¯Dzåá‡iíml.÷Åæ83™L{ì ÷²ŠÅ"¯/H7Û|§0 U§««‹Û¼®X@:ûn¼‘Á+Böh6KyëVÒ DüÙæsAÊ B mÛÆÐ¶mKl»©Xl·ytAp…¶÷ Áå……¦3щk¯¥¼u+å­[æg?Ì–Í›Ñu'Ÿ|Ç ½r·lÞL©\Æ0 ²ÝÝhš†,ËíÇØØŽã°eófÆÆÆèêê¢T.“nfI§ÓT*Ç!›ÍÒßßÏ…;v°eófzzz€PðàÀ¶lÞLWW×"~?¦ib½½½èº¾"¿X,"+ ¦i.qÚZÈo=Ö­]‹®ëmþ…;vÐÓÓ³ˆÇÚÁQÃ,Ï14MCÓ4t]oóûûû©V*¤R©ùñx¬)zÞJ?aî±F£išèºŽm‡ëý­ -aêØØétÓ41M“±±1*•JÛ¶›ìǶ‚ ´ê¨ªÊÈÈýýýík/•Jmªªª´ý-gà–èß0MTUmó[Y¬Oæ¯ZÕ‹ª¨á4çØBþØø8«V­ªª4yUU™™™Á²¬vs yMà43bµJ­VkIXhÛd2Ùn“/,Ô×btf28Íñ•Ëe,ËjgÁ:yþï+€SðØTì ²¯Ní …M‚„+¡l’‘d$A¹:‰ïèìR¼§H¼3†©×Ñu (¡7< {küãÃÊYÍÿýs^1`u>Iõ1—Ê!O¤ˆú2‘a@1I (W&ñƒbÈÿ®1‰ ÃÄrg@)á Ê?…==«ùÿXI"(ds Ψuðå4±@AÛ(#Ë>Š"Úüdg‚Ú,´t?åbºs Ôñ‹.õ}pëÁèŠóßlÌá8¦iÒh4˜››Ãó<úûû±,‹\.Çt3(ˆ®ëA@>ŸoµÅ0ŒöšzGGG[Ä/„`vv–r¹Lww7½½½ S©TˆD"T*r¹Ü¾ëº¬]»öŒùFã¬ùš¦Q­VÉårضeY§åG£Ñg„_­VÛ|?QCQb±²,c†aàyù|IÈ€ h*'≾oS©ÎbZeYŶjµ:®í¢GÂÏLÛ´ (WÊ4 $I¢££ƒT*µÈéݶíç4_²@Ê€,ËP‘­TÕÒñxœÉ憎ÿt®&Q>ÆÈÑÅ~¥‚àòuež8Ú Š…¶5Ü Òu/a`Í„¿XDœvNËÏíUðCñù‘L†Dy‚‘“b • pù:“ƒGÓÕ>¾ÛäK ø.RU"HÄãQ&”h”ƒEâÿ#šF¢\bdâ$~._åqðI­É÷‘e–á;†IÄŒž³ÿ³hÿXNÅ ÂŒõÂY‡t<†¤xÄâ1?ÌjY*6Èdâfx  4Õ:D4Èd •gwwö°aÝùLòôvgH§³íï/¶['žR$ŸjÞy–ù,Ãã÷Äâ‚À–Š.™ŒÀ0ý3ä'ذnsÈÏFI§;q]§Éw‰§Â $O?ÿ…SbC‘ñpÕ>†Ž•è—gèèîáÞ}3”×m °|¥ŸY9‚‘ìdí™ÿ'óƒH–#uúå ÝiîÝW¡±¹‡¹mDz)ªV:I^ÏÈü‚&ßEd|D,ÉÑC6ý²EGw„{÷Y8ç'¨œo#G;(én§NQuŸ‘ÏŸsöÿÕ°aÉÏ„à‡Ò|£bóýbšû&5¾7¦PRb"uj3Ýœ0\е8ãµ3ùü=sûç×™<$Á÷§¹Û°Ù[Móí¼ÆÞq™’£©SífÔp)ÔâLœÿÌí_Xçñ#9à»G£|Ù2Ù[ñÍ’Äã%%J1bRé`Äp(Ôt&ëÖ/dþSV¨g‹¤R)E%( 4M§¡ÕˆÏf1-µ£Ñ0!óÿ™åŸýü§,QÏΑJÅQ™ 4ù&ñÙŽ&_oòÏÙÿWÙþ¯—º² ¢ Ò)"‹ûHº|êu…†!1U³ÑeA‰˜$“ P"– X‡˜£’K ,UÔüÇ‡Š€F až˜t¢¾»"_Õ}ɧüùž¥@“o?#|]ž1~ÿ«Ë Õ?Õz¸¾T«ÕplÇvèìì$¦ëtvvµ×ÇÁ²L 3lç™tGx̲Ð"4U‰xMÓH$“ÄtˆE& ³+Û^k®òU]og°w]Û¶‰Åbär9êõz{Ÿ¿%\·m»DªuL×u\×Å0 dY&‘H033C:FAµZ ý ïûhš†ªªD£Ñö±ç*¿»t„ÆL%“B‘º@¶0ë:ÕbE“ymϽ¼ñÂóúMßå%ú±j*".#É ’ëI' ‹À‘P“&oÜø¯ï»—ßÌ|Wt}“X6E½TÆ |Š¢NJhT…*Y­¡Éò)ù¿™ú:¯Ý²—׬¹—«ÅgOËÿ_}ßãÕwóÒØØÿÒiù²à”ü+wqíêoqMæ«ì4>yþué{ø ý \Åí\->sZþ&^±¢ÿá–ËcÔ \&xíEÈO”1^yÅéÎeýÝ\ÀΩÖª>µ^Åö C˜OÝÿðòs›v鯸w_ŽÊ W•Wð?üÄ#è×_†/m`cß,™Õa@ͧê(„ Úéët1²AW7ýÝCz|ÿÃO<_]Ýp|€® %Œ}#OÙÿóœýŸ]ûŸó¿ Ë9ÿçÿ¹öÿíέxÿ‘U Ëtc1„cƒ¬º ±åï?ZÊBÑR¨X¦ãùD»’OùþûËàŸêþûËàŽþÎiýÏåž+&þ]݉‘ˆ]ûBVox>¯~Q÷|îH² óÊ÷R*yðè‡g~DmÝ»Ÿ1ÿs9{9~áÓÈ™çÓ茳fýUdzŸÏᆰŸ¯ßþ>U"û’÷S,á ÝŠŸß‡»æmϘÿ¹Ÿ¾yì_‰u¾¿X`õº+é<ïZÞpm/߸ýýHš ûâ÷R,ã |Qx#ù–3ò?/þÇy‹O[qaÉ庀V€ƒÀ‫W–ûïZfs3ÿ/Ì‚sr'Ÿ?¹œNüa€­[·²uëÖÓ X© ry#Ë¡Xç¢ãæ1¯-þ?ùæÅÿ­v››]Ôöé–'gÔb‰F$|;¿ý~%ñÿ¶J¿Ž;n¢ôëí×@»? }l<ðX+N/¸o•þ Œà1Öl·Vȧ °Rn;kúÙ–…ÙÖÏ$`ÀÙ”íñP¬_üðYvÚïWÿ/l[wâŠJÝu¨»>ñ¦sT«? }ìlËJâÿ#Õðó¨jÍgˆJF²$#ÙEÇZ¥jåyØÊóÂM/âC«+¹3èMñ¿wÒs=¡rë鹿i~0´Šï ôRrˆ×š CLðî[Îl,ñšƒb¹ç¢ö1oÆà;"ÌÚÞÛ‚×_¼8ÍF/üò)÷Dé$ 35¾w „{iÐÞßûø·^¦²á<, qlj½¼ìük‰ÿöó²%ñ{‹æß`í³+޳H`a­cùœG–ðï#*áó/ϲ0ËÎ=Gæ¥+_ú³lØ,‘ÏytßKW :äñ½G¨ßÃCaþ}Ô¸åM³Ñ®.ê«U>ñ}Á°6Ê ~mþ3xKÊoó7¼|¾î ~ÿïÛ¯7Î|Ž »TæÒìê]ÂÑKþ7‰£w5ùKˆ—˜Ûû7lؼ…Ë^ LQÉó‰ï n^À¿ùæ›Û¯}áݼþU]íñï|Ñoð©OÞÏÍ¿ñæ¸ùæ÷ð™Û[vì­>oºé&žïûm|k¡MQNlÞÄ,ã8š¦á8¿ùègYÿïñ?˜fá@ùV“áÇU^ËKœùûЈÚÉ·ü.Z³_×u ‚E ?C[Ž@Ëñõ\É“'ñÿ¿Ç¾Eÿçmzß8‘Àœ wGÀè9¸ŠkÄ(AsÔÇ¥4÷d_‚¦=ÿ¡È6~Öâ«ï:¸¾/9t¼Îí8¢ ù;aüˆÊÏÏðŠÈ DÀ@çóÒE§ä«ªJ¥Reûó/åðãûé^ÕOÙ²|ŸCຩùÙ ‚Z}‚®Î s¥2s•ÇØ½s7“ùýë·Q«Õ‚€R©D6›åðáÃD":Ý==  rèà¶lÞÈã?N6›eË–-¨ÊIüÞ5”m ß÷ÚüôIülg†|¡ØæÏ.Ãïîî^Ä?1z¢Éß°ˆ¯(*¥r‘í^ÊöÑÝÛOŲ ŸCÀqÒÉù™2‚Ù&b"ÇþÊ®Øu³3“¬iñý íðò£ôôö0=5Íáƒزe# »»›­[·†ö¯Öø÷›;xÛÿ™f},±¬ý˵"€é©3·±XD•%º{V180ÈôäÙîn>{ëöÞ7L#I}Ôë·(É;>gu$º¬ý«•"²ÈÏLž±ý§¦¦|—¾ÞUœ=Á‰‘!Ö¬YÃgoÝ·¾6Øœƒh4|ìý 7þužîuYû—æfQe•âìôÛddÉ÷èmÚàÉÃlÚ²™ÏÞº…ÿ¼óF"ÌíÚ„ÑŒ’hÜvˆ‘Ý;ؼkˆÜ®MlfhÑy{A€ÏÜ®Mí÷ËEp\ØÞÞòîízG®ú5r;as¹Ln×vìý:òî«Ú‘\u¹&›9Bn×vŒfE㶇Ù}›w=Jn×ö%ç__Øox}K# ævm'[.“ßµZQ´ÏïÚÍöËFPܵ,Gæëí¾ª]oìªëÈï4çÏ·ú¿í!ò»¯ #4îÚÎΙú9û?‹öß<8†•ÔñsuD*ŽŸ«c¦âD“&†AÇÀNFñsuH…Ñ[ÅNFŽ@™X3“ÞÂ0nv2Ún/ò>ÑÎ"WD·ÌžÜèn;ǯJL¯„‚zª [s‰ÒÀNÆðr5D*…—«`¦RD“5ìd Ý6Âö¹*¤ÒøUÖw#;ï…ßK’3y¢q9Œ|hùH) 7™@u8ÉLÔ •‚_—œd ªaûHe±°¡u>1æë%SDr3øv€•êÂIú¨„ýKC¢}Œcsø‘$‘l'£47E<‘ a„–€"+‹87l$‚CGF(ÎÍ‹F‘U×ñéÊf™[ý}óÆMËsÌÎÎòÒ½„h4‚a„¿=“©=ÙrÓ“”æJÏi~2žxNÿÙæÄWËxÔrn˜KRkUªã.¾ïÓ±N§tÂÄñŒֵœ‹$$Ê',„3””O¸H²„åFmT)ÿ—N˜ÍhýP:aBTÆ›A¢¢®°*£`Û¡€_Xø¾S™˜µ¨ã°6®0=:u’áQ‰²P  ý1…hTfbÖ"›PéŒÉLäÃñw%T&‹.1™˜$°I’1Á¤Še:Ô­0XW"¦2P³Âc•,3d„üªá2¶M¯#˜iÚ~Èðè•$ºÄ@Íbµª²J–¨…·ÕŠÂñ†Ë*Y¦„`cGŒB©A8Ì6$T[Pv!ÓQª&–í°5®2exíGÈž‡˜>ØÕÈq ðUÛC‘%l!(˜¿ üè)ø”ª…e»l+ ø { Eü|± ¿†$…‚óY ÉUlÁ9ûÿ·¶¿¢„m¾®aIBÁ÷¡ÔpP%˜¨»HhÄd Ï‘Ñ#>¦­–%lá?=ûÛÂWñƒß ž¾ p}J®×Md¢.¾/QæÊ.I!a«OÓþ¦ç¸JøŒ×ñðl—’Ú´\#¦+ôu|d4É#7c|Tu~oÂ|W€þQÁþÑcè]¼f´qÓ¦ö~År{úGï<òŽë5îÈ{s(Ó~ç‘w´·ê~{À·¾2pŒ nŒì_y%n«Lýn–޾~ÅzOÞžçü? ùÿ}=YÜï}7\s«à#ÇŽqþf¹'·8pëéø±7Ÿš|ÛE\«Ìóô»qÓ&v®ßÆþÑÅj¦O½cipÖS•÷¼u±ø¥:­s ÿNºm9¶˜?xãéû;ùzOWï¾—¯³wëV^² „Bý³)ß9Iü¿\9¹ÏV¶úÖ~Ú¦ÛÙÈ[eíÚµŒµŸ—+[·nedttÅzããí,ã#££Kø‡bÇŽK2£Ÿ\o¥ÒÝÓC©TZ±ÞÈÈ6l T*Q*•õûØ\zÉ%ôöö²aÃææ?Mÿ)ù…B‘®®Î6ÿä~=ÊW,Ƽ0;×éø­~OWo¥:FƒóÎ[\¢àLùF38Á©‹X¶Îää$}}}‹Ž•Oš§+“SS§­srŸ§šÿ÷0RV3öÄŒŠjÑv—¦òÑs0ÿ«ËÈòå»êœççÛ™ƒÆLÁ·¦ã@ã)Íÿ{\(ÕJŒMŒÿo¥JWÃ'±« ò8h€áPùI–j9Å¿[œùñMØ2ßÎ'ÆSšÿw „ÄØTÈÿír•ކOôRä"h˜Ÿƒedøîý°É.7CAΖ¹o.ä¯4ÿ³™ŽÐÁ<ò,J¥‰D‚ÞÞ^6nÜÈÀÀår™¹fP™–x]UU\×%“ÉÐh4X¿~=étš ÃÀ÷}FFFèííEUU:::Èf³èºÎää$˜¦IGG™L†X, =OÃo‰÷Ÿ?—Ë‘ËåΈìØ1*•Ê/ŒŸ]%‰ iµZ ˆÇã ŽØD":žçâ{†YÅÇ –qlíyèºN¢#‰¦i4juŒzƒF£a™„Ù¯5<Ï£Z­¶ƒ”D£Q¢Ñç6_6ò„Šå:€€ušªADÁö ÚÂó¯}!„âó…eáûíÅ#G%^~Þ8÷Îöc<Ô ÜïZ¦B4A›Œã8.²lœ’?’óÛÂó¯ýG84\µù ÞoŸ›cä¼|Û÷ÎfhüXkžñ•Hgõ$¾…ýýkDÓ½jÀrâ)PU0ëaP=€zææ \€¹è ¹ñ2B–q]Ñ ¬AààãaŽÇ¯(Ÿ&? ¿¿ŸÁÁq4 |?8 ~Üø„Ì2ü0x€ãAZ>õü/o¨ æ:I&äb³·ˆ‰QÞ°…/äu„~µl HÃÔ,¤ÉŽrŠÿU$•ŽR^S& Îjþ¯Äol]Í—äxcO“êù_Þ` æ’M¾hóí d¾t Äë¨4ù5ü!©ÉwðËM~ƒ €FÃ?«ÏŸsöÿÕ³¿©%°gT :~¿AÐ „ýK³¿ ùùg„öö7"qìY…Âh¿ß!è!~¹ó_š‘©ŒÌßÖ/uþ?sü§6ÿçù¡ýsöÿoiú ¼¤ ×ñå–O±)HW$d[P&ÆHÃ$¡ æ|áÀ ¹T–P-™ BæDÍ£W„IŠˆT}Ÿš,Hˆ¤ŸÀ(Z͵%gy~4âãÒ¯_c¤a“Ðyæø+”z­Þ~]k&iLÍÎÒÝÝM£Ñ ³Ú¯}€É™úzz(,XcJÄ$’Év­’J/þÿ\å …v_-qz½^§Z­¶ƒðõôô´ƒ4¶Dï­ßì­@zA I±XŒR©ÄÐÐW^ye;À¦iÄb1LÓ$BêZ­öœçƒK¼?NaÎ`¸îѧ$:{ã`KD2QlÛ!P4’‰$NÁóáây>**®P©˜yÊ>«6@DUÅñ¨äòO“L¤¨TóLF,9Lß"a£Â³Ê?›ñ'~üÓùniúš·B¹â"œGçÿ‡–õ?lêK„˜¼|3›Å3ãhÞ¶ùŠ_Ãüä)ü¯¸ç±píWéã(Ä¢ó‹ü¯¸z‘ÿaa§IV<=ÿÏsövíÎÿöœÿóÿdû3}šûO‡†mÙøŠF<ž8õýç˜Çª EYA¶Ÿûï/˜Úûï/˜MÊgæ^½F?£¡‹vçŽ?æ¯ÿúݤ.ûKô˜L´Z¡ôøÇ çz|+ü~õŒúŸWß £·w©* ;näýïÿ²ÏûSäž$þt {øVkßoûèAíõ?—¿Gýñ¿¥Ìñ‹ßÏûßÿNºž÷.”žÔ$¬‘Otü>¾@2}FþçÏv‘?øÁ· ºèÇÉE$“ÆŠ r¹«W+$“IZí’ÉäŠõOWªÕå’¿¬òèc-{¼47ÇÆM›–<Ÿ®´2Ÿ´úheÁi•›6µµ2¨tuÍ;» ´´,WZ™ Ìn2Ðtš:U›S•®ßêcnUœgþoî¤høEÇ7Ã×­çã—v·ëö8³j”Õ) ·0/ÒuçüvýÖûÖk)*¢¢]ç…{=:dO…\ÔAsBg9[õˆõ&0 ‹Xob‰ø ¨Ì³ýŠKÅ­SžÄÓ¢(¨Å¬vš£ëMPqëØª‡ù.“´XÜçaá¬h¯Ô1vZHŒ5ÄT„¿R“S–ɽ‹;Xt¬•=ýteÆž¶ø¿þŽåöÄ2(8MÁ¶&%×&.+”\{‰ø ½Àþš$“‘Uâ’FT IÄ…ÔîÏ! äÚddM®ûÏá%ý©æ°½Æ’ãÉH–îÈòŸ5ÃÕá%ml¯±l? ËMµ ¸pýüÿßý?)!WJHr¸qx6’i?ì-Þ{—ÎK.vKðë[¦ùñ¡4¾9ÿ9æÙÕvýÖûÖkIŽ É‘vUÅoq¾ª"ÅÀ¥Ù:·?ZcxÁúÜKtváÖËdÞ°¾Ÿ”ÌRŽ^5EPw9R2x°bQ*öš´ÛÞ3ÐYKúÚ¤„u†]¸Dý‹%óOáq\Â-kµ)Ôo=·Äÿ°xþí@(ìW/~­‚ŸýW„d"9mû»\.vºyâ©…üÛæJ_µ®0¸²Hþ;ƒ . $èÙÒIúÊ%…ï¡4Âbö±Wñ|¨Žìc¯Ò÷îT.øÆ‚¥ìíÒX47NÏ–N¢ –”Df,¯—úºzLÓ$“Í:/ÿßÂü•ÁÊ·týßhþŽgþ‡TšLÌBÚE($ 2Q+1_’ÙT.p‘4P„Ó—•ä"ê[Î ø`ƒ›tĤf¡›Ì  8×UÌÓÈÆœ±Û²P„BÅ|ô é¬ø(\è†É‰˜‰[ƒŒ)‰Ä tç-‰Œ‰KQUª¤â>—F2››$ãRHf,jüŸJ4aÒTë"7H6º"¨¬X¹øv‰´A_Çå8>$îñ@ÚàhÖÂ/%I!8‘ÊⲉQÓÄ#Nó¨ôf ŠB̶AJªJÔ²˜«iTxTú²&Í.N¤ âRâ– s\3745Mæj~·@· Ó08½ÊÇ`Æ&‹M&k¡ ˆ&3Ä2 m¨@Ê‚DÖ¦Î%ðë™Äl"üšŽjÙD,P„³”¸GUQTh‚Œ-‘æV¹Éd¥SÛ"cؘfö æ7ÌXd‘d²äøMbI›´aMÀ/†ñK°À£Š"~rü.2Y;ÇjjeûÿÛß­Ú„”θ’ja™àVµ¿)MLKàÒT!°¤>kö÷»ECØS‚KµÉf,\ÊýQÁ*nMÛ&=ûý:š¦êïV!™0Ñ~Ý­#\.Üš‚™5ˆ%Œ‚ýkÏÓßßÏ ƒ}h— ´Ë†Æ‚ó‚þªª*ªªªF·ÛÛÛÙs¸ í²Rñ?PòΣ¿¿Ÿ¿^ãäû¿"×Þ‘ä߃ô÷÷sM‰¹µèË}DŽ;caã êóü¿hocÎE!ßÑÐßßÏ—süù<óï_òß_Úׇ6·–Úåw{,Mûâ¿™ÿŸÛÚ¨]î·¬ýýýœ÷.çYüDÝçFðWUU±øŒ3ø»Þ7 ºz¦¥T=üº¼ý¡Tü#íŸÏ÷™–w•¼Ëʧ«©©á§Bpi_Á\Ø}Þ»Fä5Zýþ#,`´´ýýý¼;·2ùÓs挚WMM »€EýýÔæÎ‡GM[ÌŸðâ8âÿþþ~*sïLJ‰ûéÁ0 ªªª¨©©)y—ôƒA‚Áàáv2™dQS555%âp„ªy†Á™o{à¬xž_> V‘¯¬¬ÄåvSYYI:·êûD‚öd2É‚ùó©««+ä; Ãàì³Ï.É3¿‚}þûŠŠ <^/¡Üÿ¸t:刟'à?í´Ó…Bã–Õ0 ñw&“ÁÎJõ‡bAN$î”!=–ÃùóAò¢êÑÒ†QÈ·}X‰bþ®®.jkkÐsÁ©óÆãÏ È÷ÉÇↂ=Ú1&ÿÀÀ@]wø ªc#™L‚ôö WÌïñ8y2¹¶5üûÉ´ÿ§÷ ` XÛLÌ?ZÄ_L£wV²?]ÇcGZ÷ÒU¹˜WÒ¶IÑ–Ð ùÏFû%îÆ´©h·É¾ ÑV:+9bÌçÉ^^:ÒÇž˜§°µ'ÝþÙhÿ¯&ÝȨMà€õ:$^6Ç+8”öh%/íãÅ„‡Ö„‡ö¥‡øÇjÿ ókQU•ÆÆF|>š¦‘Ífq»Ý¤R)t]Çív“L& ŠëëëY°`¡P]×Éd2ÔÕÕÑÝÝM,ÃívãñxR‡ñz½˜¦Y¸Þ¶m2™ †a`Û6š¦±páÂIñ[–uRùUU=¥üT&QU˲ˆF£…Ièd8~ŸP0 ‰m9}¶šš**+dÒ€ ŠP1MƒT"I&“FWU*ÁJgÅKÃÀ0Œ?8 #‘È[šßŠ[¹@"P@ Ôj;`‘îÐùí¾$û’•ôzôz‡Þÿ7û£DúDɹ|š}ÉÊQ}¡•v“‰i¸ß‡J“Ôqc\þÔQ-Çï¥×ëlCüi"}”œË§Ù—ôŽF•r“Žª¸ß–ÈñÛE"¹ ®½Ào“:ªæøUzUgâ·ˆÄ(9—O³/9ú¼3¥’ŽªxÎÊB¥Ä•t—íÿÚ_=ªc™Î*÷iÓá7$ŽX]˜øý5tw÷R[]‹6^ŸB_ŸIíÐ4HÇÀ燪jðúan=œ¾ ¿·Š^—ß ,“Lfs2x}YÓDwA·ñó3?øý•twG©­öçø%}Q¨­߃ß[Á@o—ß›ã·ðz=€×Ytà¿ýëÇB(‹(U&î:MÓè;ÅåÒˆ4+yÑyg’¶ëœ |´Z‰iš$^h‹S¸Ò~©á34ª’Þ”†e N35„ B¸4ˆJ@HÜ*dU8³)ÅFJÊ•?”ãWS ©IðSÙYå·Áfþ,~S›!¿M*wÏ›®¾žhQàøTnìe HOPQQËívV­¯®qþ7ãŒkd2iRé4ñDÇCdp(¸a6›¥"§ Éf³¸ÜnêO›‹ßïÇ• š‹ÅÞÒüG::¨¬úì÷ûùÓŸþ„ßïgÑ¢Eø|>:;;Ñ4ÚZgd\UÕÂ!8ã”ùq›®®.ÚÛÛ©¯¯§ªª !–eÆ¥”Ñü±cLjD"oiþ°ÝEÒ0éÈŽKêçW¢Y&šPH#š‚-¶šÏCEUÂN£ªnB¡ ûP¯æÁgÙdM ƒæ¨ÞJ^;‘a0‘¢Úç%›Šb¥L4;ƒª»qÙâ åWMû åÿ͇î)Ï?,Ïÿ,Û¿lÿ²ýß‚öÿë¥Ï—Ÿ¿o ÿ+×Ozþ¹Qy>.ù6„{9©Žïá?ýFDPGÆRô¾þ\g}î¤Î?× I…>€Qyrß½xOÿ"vЇݗ$ò§ocŸ¹á¤Î?'¸+ø>ÒJ ²ã>§K­Ÿ¿}þuSž;ôÓ¯òB›8É:;;K>çÍ›7^òáàGÜ´¨é¤qL\†…ωÄÿ£­ªRŒáçóÇûö9+±_ud4|à(9ÎOfÉç1]œ•<À(´kU ž°ÊYÉ~^õ9A·ž`1'H»V«šXÀ®U)#8Š÷ MT1;Ò„Gˆÿ_?‘D[à)¤‰û2Tà¦"馢f)$q¾ïÊK[à)äé¤C˜ ¡A ½°[ 5çü0œ»dAí¼ø´´SÁh«°†áif*þþ¢ ~M§ÇÈŒÿŸéWI˜F!_($¤MBÚ ›'L¿î.\“0B~uº›×bœ˜Øܵc¦{-Ö9ézܵÄ2½%çV-êbÇzþé3&óCϰ€ª+À8‹àÒóaÇøß¶ñ¿¼oDÚ‰ ºXÙ›Úù¿ÖŒ›vk®=ÇfmÃ"Ô:/W×-Àê©áoï£EÑyé%“­¹Èd{œôÑ?ÿ‘3UyÍ*ï‹ÿˆ³+>;¢my‹:B’æÓ%é<üûâ¥éSÈ׎†|º¾r˜•ï]Dí¼¡¶l5øáµ¡ÉoOþwœ¿Y-¹á'ÍÚyÎ$Ë/nØÃÙ‹ÎáNðÝíçeUÁ“ÿ=tmS6ˆÂù-XÄu(çù‹a5øKŽ/¼øýúïø‡/ŸÀUóæ6_ýÖKþ…øß€#ð¿ðâ;†ñÏóçzIák5¹ù‡·¥¿³{ 6`þ¡YYËßý+D´í]/r&6¯¡pÏ=÷ŽÀ?¿_Œüù|úüñSO=ʼnœØ(?0&Š¢ÜI)±, EqÊôÅÅ¥3é1ySJ‰Òñ줮ϋᥔ†1 ~…ïÈšaü)ezüO?ý4}}}…¨ ù|ó×— `·¢ðÜw¿ œÈm_Ÿ/‡mÛX–ʼn¾>¤eó›;Еt:CuuÒ²‰D{©ª q<ÁÈd0äa¤ê"mÚÄc2QSSCäõÝÔ7,â¹ÿù Šp¬®CÓ4:Áï÷S_w±Á(n¯‡®ãÇÑ].ÚÛÛq{ݤ3¤eóÜóÏ—ðëªF$Å­…è‹ :ü‡Ž—ð¦t&?x…ú†Eì|á¹þ}£ð÷÷õ¡¹b~â0n›tÖáß¹{w À_A$Å¥yI¤ÓD3tt ŒäWkèìhg^Ã"^~eW_UUÚ÷røU­ÀŸHÄÉY~óÌVÜ7†i -›Ý/î×þÒ¶¹òºL)0f`ÿî.Çþ©d¦Äþ/¾Ô:®ý‘põ1L)ÈÌÀþ}½'Ð\.Ò‡2%öo}ù¥qíŸÊdøôº Y›Ù?:!™JrøÐ!ÜwÉàÊññ’‰‹WàаȉÅX¼ÂËþÜõ íØœGçŠE¨ `p¾ß™‹ìøn§ïйbóv`¡}VxÙ³õwNdÅÂ÷g2o×k,´_„^ö ®7”Dh\¼âE ‹Ü8²|Îõ íså;Uñ€ý¢óý°È‰Å¨]á¥77xR›»¾wÅ™»¾v…—Þ¿ƒ¢ò÷®8“Ú]¯Q›+oÑàN¸¡$BcíŠËöƒíŸ|H‹:|9Ñn2ÄH’Ž•~ü£¬è (dû’0'€G¦J”zBXNâ (¤£ Ô9¨>¯# é¸ci'}@%Ñ5 V¥óB2ðãŠ%ðÃ(¤rƒ/)1NH”Öà ÄÉf5Deeá<¹(‹ÞÜõjmˆ€š@ ðàôobNùb*+qŽ0è£3 :q 25Qâè+BØ•¹[ó}˜]1ôLr×+µ!tUeîAgîL°½2N"GSµÂjꚦÑ?謮žL¥8}~#‘ÑP^¯MÓ—¹ÿA…ÞÞÞŠî àöx"·òzM^·‡#G1-GýVæ÷z Ž÷äÒôi:‘ˆÍ`Ò§éD£Õ>•džòÈ_Í­ö9ÿ%k² ö§Ûu‹}: :Š„RGR) ˲p¹ØŸ48’›âr "qÓ²Èf õªÊ‘ÔЀöbŸsýQË‚4Ôç&Ÿæõ1 â)‰ I ðk¯PŠŽÂq˦ZWÈØ@ð{ÈØI¢DT.Å¢BW‰&ËÆDâ’ –P0L‹ž>'”_w¡jÖ BáÏ„Ÿ?9~ð T¤¬Á‚j"~;3Œ_R¡ â†$c9‚h—K SÒÓ—Å’à×U¡¢f²ýÿÂퟵÁ”NÙ`˜*»¤þBH,²ÒMâ×õY³6Ü@ÅYÀ´UTÍ&cñkºÀ¶!kØ(ÒƒzöÏJ°Šêo ·[#™Êì_¡+ØÒá·­Rûçßk|¬¹~å¼SøÓM¥"ÙÑÞgäÅçžûÄ„iGCñû”ææfnmn†ãN¾O¬œ8˜qÿÿ›x¬q"477óÝiðÿ¢½ ßÚÚ ÓŽ‡â÷BÍÍÍ,‡‚¨ÿëßÿöaÿpÈŽ<7Þ=/Ïææfþ ¢þ˾ýmžüâøüÅož&sïÿæW¿â»cˆõ›››Ù {¯uúOpäòË'Ìs*žgCCG¥«»›®în’É$—þÕ_•\3ÖŠñÅ«¥—v4äø|>úè(µ‡±ø§ŸÏG,ã•W^™ÿ‚ùó «ºÏ|>øÃ üùÀã¡X$?Û¿ýíoç•W^“ïÞ¶‚¨ßÁøþ%•r^¶x½ÞIñ74,3€ÏçãøñãQ0,ñš- ÏsªígÄÃÎH¾ý-¡¹:ßþH;¦ÛþwG}ìŽñÏ-埦Òþ÷Ä}ì‰çÛóCùö?~;Éd’ÖÖVæÏŸªª$ ºººÐu]×éëëÃ4M< ƒA²Ù,¦iâr¹ÐuT*E?Š¢P__ÏœÕÚS)’É$ÝÝÝ€3™½··˲X²d mmm“â7 ¯×KCC•••A÷lókšvJùc®…À¦i:•Dbè’0ðúTü"@LI“Ng1 ªxI&’X†M:-ˆº®¡åEõ±(Š¢àv»BÉd0M·Û]XÅî­ÌOX£NÀb½3·’úéUUGUªß“€Cúœ+òë  zÄé ±ð ƒ¯ª¨ŠÀ–ãò×¼7 ‡ôuŒœŸñëU0þB’£¢éru~‰Þ)†ñ[Ô¾/ ‡|ô9Çä×'\àqzB,ú Æà«YT<ït—íÿÚ¿Ê–Vhn0²7œí-»‹x2‰ÔÕùÈfÒÔ–†á¬xo h`±AF?vÆÍÀ@†OAӛ͢i±XŒ]»v¡ë:•••¤R)LÓ,´Ì/leÛ6jîÝs"‘xËó›•2‚ÅsÜdãÙ¾At¯ŽbI\¦’2±l:KµÏjĈ™B3ÙòÇn£ŸwŸ^‡¿Âƒ)bD")tU!P¥#• YË$›I’MÁÛjݤ3i²i¨­ 1ï}Cù{ìão(yþayþgÙþeû—íÿÖ´¿é*?ßHþéÎ?O.ø[”ÃßÄ>Â¥â=ó‹ 9eóÏc þýoì#*Bøæ¯…Á¾S6ÿÜ|øáœõ-]úY_ÂfêóÏË(£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Ê(ã A(’§*óŸ¬|g›? Éï]‡Üõ ò{×!'Ê6ù§“×›ÍþSE™ÿåŸ šššd~›(m8.¤™­º•ùOÿdÒ¼™ë_æëñO&Ÿ™p‡Ãáqûo4ÿTîË›‘ºe™-¼Ñ÷¿ÌÿÖæ/ã­©´©7#“Cñ}~ÏÊ÷®Œ2Ê(£Œ73Æ{¾UQWW'óÛ]–2N:†ßcY´•fÖp%Î;¼—sŸù-²FŽnh(_’Èç´‚’ý$WÎhàaÓ¦Mps€eÀà£Àððj1àà?Vœ%y3×]wÝ´ùxàø€&`%p pàã’°ø9°8$¿ô¥/ÍÈ{t!¤êJ,SnõTpÛ+q{%©¸ Ö/tÏ+*eS)±^ûPÖ˜ oò'èØ¨è€Ÿ­¸¸ˆqË›€‹çñq:–ø4³ÂÿÞÿ7¢»«…ªÆ,éÝšt§/ˆ¼ð¯Ä»¢»P0]µ¨oÿÈóƒÛ6_dK P­®;f…?üá-úñ=«˜̿쎭>¿ï‚Ã/u ,08ñï똷â OÔà:ï½Ïצ:/rË8š{ŽÕö“3☕öWUU5£ö÷cÖmP@…ÍVà ¾6‰D>ÿ¥ý¢y±ï81׺qqÛŒí/Ï]­àÔ×\âË1gôÄòÈo›€/lº~Šh]¿Xèê‰Áâ…öV!¸ »KП¯#áù½â"· •¬/=»wVÚß'¶¡Û Õ°UÀ&……Kø_‚‹æËÁÚ|áìüþ>v%zb?ªáÉÙ \P¨viËz¸(·o=Õ5sþ5kÖÅY6]³m»^×õ …ï‘RVAI)¤”ÿcšæ6!D`J)í_þò—3øþØü·‰ TIa öG-©ž‡€„.àˆ€@• âÃܧ@ÒB¼¢#å=í3n{{öìÑ5MS].Édr+pËåÂå±üÀó@à"˲0 Ãjjjš±ýýn©"¥O:‹üÝò3ÈQG1P~ò. .P’‰Œ¹tà Ÿ@Eâ#Ï/ù rij?GO ÁO€»€8‚¤¸œñÜxãºmÛªeYhš¶¸À¶m,kDÖφq‘UU­M›6ÍÜÿ™¦Še¹Q”yXÖÅØö'¢Ç·ÿRîFQþU}ÛîDU3BÓf\ÿƒ k &×ak.8&ÐsŸUðüÛࢠ³zŒ%¤œÿÓïÙ¡÷ª¦ÚåJsfÊ¿¸à˜ž¥WO–´A Ïïô¸Èoy™c†¬OubVøt* £9ÿ§‚K(xÞˆ]”:ZoÕžÓ>+üe”QFe”q2‡e[[Ûˆ^ÝXç‹'|%#‘Ȥyf‹Å h¹öAàg„àð‡B!yÝu×±iÓ¦Që|²ù‡§ä‘GøÈG>"GKÿfoeþÙCSS“|ê©§ Ç—^zé¨m rå_ÕFGˆÖ¶ªðŽÑët²øüq®¸â ß?•üûWï%Ì °õ^Â̘ۗ`` äx<þeË–An´jÙ²e´¶¶–ð‡B¡‚ …Bòî»ïfãÆcú¬¦¦&¹ñàÁÂñÝðïÝÜÆ’O:÷?¿?ÓúÒÿ|ž IDATo¸dˆÿžgÆç\qá\ýW\Fxד3æÿÎw¾S8¾ñÆOùýŸJû[ݱÂNýWw¬f{xû)µÿ}÷ÝÇW¾ò ß?•õ_ÕÖ9!쪶6v ó©ùüÆËgºÜyß×vW< á9?xŠøóþnÝ/÷r¡Þ>ªï›¨o6þ|Û_÷˽|á[Þ¾dDýC¡|æž—lMŠ:¾ï³Ÿý,/½ô­­­#ø‹1™>ÛTž½ùçw8–===Œ–çD}³ái§ãûâ7­ÃýÜ«„w=9jûûÎw¾3®ž6Éú¾ŸîÝËy7Œ~ÿOfûÏû¾Í«Í÷ÿí¶‡·Ï˜:¾oÝ/÷²àÐ?xªêŸ÷}7·µ±ØéþÒ0\Ð1‘ÏÈ_3™t£áT÷µÇói'£b!k»ùƒt!E”t!½‚ÊiœÞæ¿V}:ú#:ú~¾ª¢Å>É•SCæ„ÿÀ™RÊ÷ŸÎ‘Rj¶m#¥DÊ¡—oBˆ€¢(­(ʧ—Ÿ !~»iӦ׀øu×]7iþ"áx¿â3Bˆ³„8ZÔ1áµm{•”r•”òu)åO€'xà½L#À9O»ü¦Ae""ï‚µŠ¾jpûñ¿ªI4˜YA6šÎù¶E @JZú˜ëÑׯÌ&¦Â›‡|?6•ôr'’µ€#ôW€ 佞ܾÊù@*' ~HnæQñ ¦Åÿ¡J¿eRûcìNiɵŠ&HÓ Ù0o%MË‚t>÷<2ÙŠÈFHýîÇç Å•RбLùP¨á¡;\þ9ўׯœå%/úÝf²ÒLwÞ)-{­¢(t=†R;—Š9nŽüü@ Nìý µK/çœ:ëüW÷Y)ËÎbgzòTñSú¢æÀ=Sâ/þ‡¥”ï>œ%¥Ä¶ÇmÆ^EQV !V¯?B<900°—iø± û%TÚp§„µ¦½Ç ì‘C·_"Aµ°<éó™KÊ’„b>tó¾ð‚è‹Û¦lyîj D p1B[‡ª-¬[†¬\§ @·-Ä`ÇÑó§»$Ê]À!­{å¹nÙ'^ØnNµ ­ëûcQQ™ÍÊ;m›µ¶€ß¿¢bš`×ãx'@J˜)§ýKÀB>tÿá;”¨ˆ~éÙ½ÓjŸØ†_B¥•·?N¼ ð,ÎOpÎR6ƒ‡Z¶qLjn¾pz¿¿¯ÄTJ‹;…ÂZ¡:ç  ºÀ6!zØ9'­!þÜå]ZÏ@ô©®©ó¯Y³F¸Ýn]J9Çãñœ£iÚr˲ZÞóž÷\xöÙg].™L†¼;“Éðúë¯_½sçÎmÀn˲ö˜¦ùÒÕW_}Â4Mc:6,hve‘Þn)OÏ"n¹\SÓ iËåS(RÅBØ©dÒDÍz¯©È_˜ðòµ Î|ò¡Ž×¦-Þ³g_UÕJÛ¶ïB¬B …B¶b!JìèС;¤”Ѧ¦¦)Ûßï–Ò®“Ò¾¬/K™]Š0Áúؤµ.¤ÚGá÷'4TèrÕ@ûÒ»\÷ûÜæړȈ)ýþähXÔas%&_Æ`)­.8¢;¯R ½fQ€y8S~ì/ ˜{Qåýòq¶ Ð#.gÊ¿ÿo¼ÑoÛv¥”òN)åZ€l6[ÒïŠ ö—R>´víÚ;„ÑM›6MÝÿ%“¦YKoï9 ^B6{¿}n?ü7…ö°m†<0… šWñÿ|ö}¼ï}p¹%|FF£/¡i½Âç›rýÿ üEþ`.Nä¥ü.‘;@ÎEíÏ€;Lˆz™žÿé÷ìðGT«2cÛwZB®µ1ÙVÙ‰!,àäbK8þ²B9Ü)‰ÄÂxèáÓþ娊~ªûÓâ<ð#¨îD°¦Y…ÌèØsÍ¢à'!,4%{>ÄRBH„Ë|¨çТ;”A5Z{Nû´øË(£Œ2Ê(ãdc,‘jaŸÑcyLF¸QàCä;šHµxÿdó&R,ì³dFüyÁF4-OÊK¤šßFðOV–çÞµ .Ù°¯_=t¾x²ýh"Õâýáü `óâŸíÛ·e–’´£‰T û£Ô²"¤|úGyÄ)kNÜ[œ~:÷²"°áõ«ý&RÍïYÿÙnÿ£‰T‹÷gbÿÉð&RÍï3†`u¶ê? ç˜H¼¦.‚6Úï£. Ïy ùÛÛÛó~”öööqóžªo2ü®– ûÙËâíKpµd`ûx ãc¸ï·ì´¶¶ÒØØHkkká»Ñÿd¬ Ã}ÀƃÇ pèÁº¼åЃuS¯ô0þâßÀ†KŽû4n¿‰Á» ¸ëIŒÛo‚«žœ±ï˜H<;Û÷ªí¯¥¾:`û‚í´Ô·°}˜Žý›››ó~”æææisçù§Zÿ/ Àñ©|QŒî~vïÞ}R¸ ¾ïö0û?×;FïSž,þ!ß·„÷Ý7âû‰úf3åÏ·ý{×,ÁµîeØ^Ú§…BòëWGøúÕnùùøüÓõ}?úÑøð‡?Lkkë¨}Êáxøá‡G T1Ýà'?­hcùf ýÊ|¾MMMòî»ï`¢ 3ò}÷ßKï£OÂUOŽÚ§Ìßÿñ0ß÷‰%£ßÿ|º“Õþó¾ï“Û?Àºúulgû¨}ÊÉòOÛ÷­YÂã?ŒÞ§ó®J¾œ»¢!÷ù+9v€üXÏxc<“A(’ÏF¶óÉÿú#‘C½TñÛ¯be0ij‘Èt³-£Œ2Ê(£Œ2Ê(£Œ2Ê(£Œ2Þ„U;™-ª}†Iöö$ƒtsà†—ÙVû,ÿÉ.^äU:éà(Qº‰ÒÍ Ýœ “=üžñ}¶ð³š½¼r}„¾GÒ¤ï°°ÎØÌ–1ƒ ǦM›T`>ðQ)å·lÛþf&“iI&“Zww7mmmüñ¤µµ•ÖÖV^|ñE^zé%:::ˆF£Z2™\nÛö7lÛþ6ðI !—ç„xàT ¸Dñn·ûîP(tÖ¼yóXºt)Ë–-cùòå,_¾œ–––’mÙ²e,]º”yóæ …–ºÝî¯ !î.jryO «^Ò‚ª.7 !;]^¹Öj,|A—G¢éÛØ6ènpy@ÚI Œ4H›k¥¤Ó¶¸íŒŸ»‡¯U;!äA'AÖâÇYæW6N 3wìb((@6wÞæZ Émòa¦Ì?ÿÇ‚ýíéÙ„Ýé­õ¯5£ª+PöLj?ý{*b±Ñh´°_YY\±bÅU‹/þÇ9sæ|/ Þîõz/TU5¸fÍš) ¶oXÐ쳑k¤?а~šB~$-YbK|^-Mµ’¥A4 C9]ØTc‰*l·Ë,”»’R½]J®¼îô³ÿzÑ ïT¸öìÙ6 !:}>ßZ·ÛËåBUUE!þ×uMÓR¢( š¦] t*ŠrÛñãǧd¿[zöJ0F~×¶_[jò_¤•ÉxI:ð,në5|©|©xS=¸Ãõ R•7‘öÝ¥n["9þ]Ir³ÄZéwKÏdùåx°Y‰ÁÃDÄwÙ«-å<é†þjÔCP€HiYp¹!1ÚÞ ¯ž‡«–w}SÝŒd¥|‚IóÜxãA)åF)e§išk-˲¬‚Øx"Û¶ ÁYrZ®:mÛ¾ísŸûܤí/¥2™ô20pííëÙú›ïsç××sÙ§Î`Ãý {C`_æb`%ð>°—ÃÞ°aƒÂe—ŸÁw­gëÖïÓÞ~3Ëd*å•RNú7ð Z°QæüOÇ瘀'öI8 ¨ª9¹óR‚”Îï_Àm&Sþ÷{v 䯬°;_÷Ä×qÇ9¡ÂP‚8‚!ì‚þÞºu7šŽ*mRJŠ˜züZKXI%}Û×Nÿç)ó ÒRW×âSÉŠÖ½ÀDÑ ò„°©ôwãó `Ù*j0¶pàZ¡YZeü6cŠÏ¿2Ê(£Œ2Ê8•P9“¾ÛVµ9ûw íc,Fñªt£!˺ûŸJ&|#/ÔzüñÇioogÝ/÷öO¿«%ÃþÕ{Ù¿z/®– ë~9´?þütpÄZàˆ«†OÞklldÙ²e,[¶ŒÆÆF>ûÙÏö‡ó%«î×\s ·ü<ÄÃ?Ì-?qÍ5׌H“©îÝÜÆ¡ëøiÅÐþpþѰcñ755öDz=ä„Z+.cpÅe·ßDü¦u…ýáü£‰&ºÿ{÷î`É’%£~?üþÿtïØ÷4ØLÛ_K} «;V³ºc5-õ-l^ýëÂþpþ“ÑþóB­ûî»ææfÖýroa8ÿtì?ÿ…#ÌZÕÖÆÜ\´?œÿdÔ2ÈsG·…KÎG·…Ç,C[[›Xü¯NúýŸkÃZœ×L£ÓåÿÊW¾8Â»Ž…—óøãøó×455ɵk׎kÇéò7ÜûŽ®{™ûßëvEüÝ»bþvîÜYr~çÎcúÀ¶¶6ñØcðá˜P(IJeˇÃ2/þ?8ÌŸ ŒŠù7<È;,=ÿÎÇömmmâÒÎÜS«"ôïîaïæ¶B½'[÷<ÿ†K²bEéù+Æþ ¶µµ‰Ú«. ÷Ñ'ñlÚÀN³ý}ç;ßá´Ž–œ?­ãƒcúÀá÷ÿ¹ëKïÿTù§ÓþîÕî`¹Ž–K.auÇêióOÇþW\qà3Úf8~öTÖÿ£ÍNú_´·ñéøÙáüc=gÊ=šïÞ§<™ü£ù¾|ßk²}³™ðæû†÷)V¬€–kÑ®†óÏ–ïÞ§„Ò¾YqŸmx¦Ò÷ƒ¡~å'âCÁOön.mù{Ÿï£Å=[¾oxŸ²¸ ãñÏ–ï~ÿ'Ë?[¾oxŸr²ü³åûF ‚r²ê?šïÞ§üK@Þ'݉Œº§™-L·¯=SŒ âd—gÓnÄTÄ÷cñ·µµ‰;¬ZågݺápX惌÷ÜŸMþ«bßàÑÀÍü‡±ºÀÿhàæþp8,÷Îç Ï属Ñ0$¾ê©§ Ûhö‡ÃrýW"|þó*ËÏm`åJ߈º‡ÃaÙûè“ÄoZ@zõûGüŸßŸ.>-”÷½VãàÁƒâì¹CÏE_ª¥E»QZœ`e”q²1¼ ϶Ï/óÿùñO…ãTÛ£Œ‘ˆD"âç¡WG"³v?B¡¾Ý‰pMöšÂ6ðÌâÂyÿìq£££žóÔ§ïpZÇ£Üxããâ™ ä…þvb9WG"<;èlvbyá3 `6QWW'«zª©ê©¦»§‡îžž¡=ó©g>óy½u»èééyÃ:×/ì‘×/ì9i> /è7 £°åþÃÓäÏUTTΧûsÁ²eˤçŒW'›\òWÀËŽJøÌ9Ë8ZT«â`Þ“A(’WBaïwëˆÿ#|òqGü_ûƒ›¨ýÁM°öÿ`eÈk±Z> ” pe”QFe”QFe”QFe”QÆ_FØÌÝÆ:Ó$}kŒžõûØUÿ*/ÒIQÉ¢˜ °$Æb©XDéeÛù-ÿ]ßÁ‘uIMÌ¥›Ù¢OT M›6é@ðYÛ¶ÿ!•J½{``€#Gްwï^>L$!‘H`Ûva%äL&ÃÁƒÙ³gmmmôôôÇϵ,ëµ\S.ï1‘è× !®Ô4mcEEÅëëëÕ… ÒÐÐ@0Äåráñxðz½ø|¾Âæõzñx<„B!X¸p!sçÎ%\¢ªêmBˆ«€¹“ ð®ßéU–É:¯_nÔÝ é »€’¶éý³A6é„À¶r6-0 0Me lg»Áúð/ÝÕñæ!G°qîÜæ4œåv‘¿=w^âHá,Nì ¸‹õòÇLšÿ´wí©²H®Û÷ëÈÆÞ¶,Ô)Ô¾CáØQÅíÆ²-"»ž"öò³H©âÔ‚V‹ð,¤jîYèUaB‹ß ÂFfâ·¦ÉõÚŸLš_©X_¥ú‚ë”#UŸ5t6𧏫ÃðˆÇ‰þþI*õ8§Í ±ÿ¹ÿF9­ ×ñ¾z‰´°°©>m5 ϹÕ>}ýâof&äÏ ô륔WJ)7š¦ùÁx<®öôôÐÝÝÍàà ™L†T*E"‘ ‹¶D"A*•"‰ÐÕÕ•oÿ†q‰”ò6)åUÀÜÉø± WY°.i²ñD …øQ°RCiŒš¶†÷ÈB¼Gâêž‹©B¨á¨/Á‹µÝ·믓»ÿòÜÕ^ ºÿžÀ¼ËåÜs±ƒ ±­$™Ô!2Ù½Xr/®L¢ ÀWl‰7žF1m,MbÉéJ7FuhÞËAü=ð'ï‰Ñº~qU&ú˜Øx¤O¡;!Hƒa¥Iöª¢Ah‘³ùç§¼µÎO!fÊ[õw´,™tûûÄ6ª X—€8?#QÂÉŽjÀ¡í„Ln¦X_¹E©™,ÿÇWæ~ÿN€1Q™›C¨h\èlsA)õ²·ë/­ŸÜý_³f¢ëzu(º¸±±ñöóÏ?ÿ†åË—7TWW“ÁK)Éd2d2‰Éd’x›‹ÉðUŽ)«yÞ { T€[Ñ ì;W`jpZ#è^ÈÆÀ4à° ^¯‡ÁªU˜úW‘\,Ÿ`B~€o¼±JJ¹Î¶íyá^ÜŸGñ±UUK‚3(Š’ p+°þsŸûÜ„ö—R âq/½½+Ø·ïÝrw~ût¶´Cô|àý@Ø üØÂAÏ6àIà·À @@4[þîüÚé<úè—Ù·ïVNœ8—DÂ7™ »¡ÊëlØh  ˆ"Hàø5püR*÷€Ž@¢b! n„õ¯1ùç¿gGUJXëúôÔÆýîtºzéÕÈ c(6ädT`¾‘a¾‘aŽi´LB¶IÚŸ¦¿"r+°þk§ÿó¤ùªPX'5±Ñ’Ѳ½5ØÙ¡2>Oa_J•Áø|ãóI$çÎIgBhUq¼§÷Ü ¬7&ùü+£Œ2Ê(£ŒS‰b¡–º¬ÅÀÓÎþâ —¬Ö9UF1š.,*jµ··Ó±ðr.ÔÛiooç+_ùÊ)áÏ u\-/|ËÙo¸÷3æÏO@ϋ̆¯6Z,Ôjll$ ñÒK/ÑØØÈc=VÂ?UX$?ûÙϸù曉F£Ü|óÍüìg?+™T,R=ô`ý»{Xþ}gÿÒ¡þÉ`ó+ʯ …äߎ!|.j·ß„gûÓXϽŠqûMÔ^uY ÿTEHy,Y²dLÙðûÿÜõnλaôû?UX1Æky¡VK} -—\Â÷ÿíZê[¸W»÷”´ÿ¼P«¹¹™mF3 =Ass3W\qŬØ"þ¼Pë‹Â 2¹3·ÿÑæ“ç¦*À.ƶo|œè¶0Û¾ññqÓ…ÃaÙ¶ª ÞÖP÷Cx‡S§SÅŸß57;÷5O›r«/7åV¬üÁ~ÀDA¦Ã¿õ^þåËÝíæ¦ç2,Þ¾¤À ý~~ËÄmg8Ž¥#ìܹ“céñW< ‡ÃrÙ²eœsÎ9…÷­­­…6UUUESS×]wù€yìXb`ûºå¼óAçs"þ½›ÛØs=,¼¡‡ê–:]=´Êë#<2-Ûç7ýˆ+œÏ‰øW\†úÞ³Ðﺟôê÷ÜõäŒÛßo qZÇùàmãÇÍßÿ:÷ÿ½ß/½ÿ§¢ý¯îXÍõŸÞÀî®Ýì~æ¶/Ø>cþ{žibÅ çs"þ¼ø¼½½ õ¡>Í©ªÿª¶6ξ-á]v„‡|jùIÚ³Í]ð}‹ßÇûáôï72þ¼ïëXx9 =Á6£T||¸$PÅl?T ñÿD"ð<¦ãû<ÛŸ&½úý¨ï= û‚å#ÚßñãÇ'Å Óó}Ï]ïø¾Ýÿâ´'«ýç}_Ë%—°û™g¸þÓØÐ¿aFüÓñ}ÛŒf.ÔÿvçwÞ)«Þ÷ý!çûÎVC#ø‹1›¢­©^#åØÂ‘¼ÐÿŒ‡n(ùüºdÜ ãå9Ü~ûí…ý»ïÛ6“¬&…ñü@1q¹NŠÿ{ŒÅ‡åºun¸A¡¥¥U«ü¬ZågÅŠc§Œÿ?ŒÕüöÈ ìŒÃ£›y4p3™þJÒåÇ}òÁ­ÅNàÇáã>ÅÈ‹ï‹1ü¿W8–+WúX~n/|Ïâ…ïY|þóêˆ ùÿýéÕï'~Ó:ô»îgp…s\ü¿ªü0µà>“ÁˆçÛîÝÐÒ‚ý}--(×ÿ? Œ2¦‚¼Èwø¹g?VÀjë=‹G¥Ïô6ÿ3×ì.á¿&{Í)åÜ)á¬)t>™üGJùoEä=]þá×µ?ÞõcíÏVŸf¦}‰7 FäoŸŸÁ#aøý‹Dþ‡áÛÇ®«ãño¶¶o_Ïü×3çõÌ»ðAn™ÅàÁùú×?Z8Žnû?¿åvï=`Ól"/þv0ÂÕ‘7·µqôñ_ñêæŸru$ÂÊ`Å¿‡þc‹fUð\WW'k{œo•EœÅåœÅåÀðÿuñ÷Û?Åßoÿ?ûÙÏ8U"÷¼Ð?/ú¿~aüÉ­•%ßÍ&ŠÅÿë³qbÎ<Ói+**èêê*9wøðaúúúN™}& ϯòû_ãµ›¢™•¥¸Íûøœ,B¡\‰ppWîÜÊ1~·yñ?Pÿ_ÕÚÅ®ÖV>ó¿ é~¡—íS*Ge”QFe”QFe”QFe”ñæD‰ r3[Tk‰If]”ž¿>ÌŸèæ8& áÆ… Gxhæ®8¬Jœaý8+Äê@?=¼Än:8òÙ$‰u&æ’ñ‚lÚ´IÙ¶½6™L6vwwsäÈÈd2…UxUU% 2oÞ8±î¯>ž®šª¿ wT4©4Ÿç¦J‘tlÝßÍÛÏø?ì½y|užÿÿ¬ª¾;}ä  ä@O $ £ (êè _•Ôç®Ë"˜ûcÕ•eYÇYw\ŽÝýÍŽÇ ÎwÄQgTÔÑQBGGiŽpIHwÒ9úªú|ÿ¨TÓÝé„$;³ß¼ztuÕ§êUŸ£Þõé®Ïëõi!ËaAØJ :‚â,¡xÒ-d•̦ìâ‹™^ÝIE~+Ä€5ÚbUVzŠó_þöùí¹+³e:›¬ÑUöü‘Èj‘;‰u·ßwõT‹`tY×Ïð1ïþoSPÔM–ó0ûßüÚ7Éqµ‘]~ZÅÄó‹É®³RîŽ/Îû~kŸü@@²…³…D£ÑÉ¡Pˆ`0Hww7‘H„ŽŽ---œñ™×\:㌳Ð×ÕÕe˲¼Øb±¬r:X,dYNË ÄãñŒÇ÷Ì>‚X,F4EÓ´•Àâ3™8­Â†Ð¦ "ËÑŽOQÅ.„ÔD–5 ‡T€,<]ÍGB7C5[»[{^õZÆŒ˜Bia5n§Õôšòå!µ¯¨Óû3oaCc:a–sBžÂºe°˜@² ÷4z`uÛ†¸¼€¦ÒBÈn‚®ýкÚŽB´ ¢&h-„Îì)Ä-+L?“ @ø±ªª«âñx/á¿EQÈÎÎîõâËh—@¢Þèiÿg4èî¶T±oßRÞÝ~[ÞQ8î&¡÷°öÛ_m4—•±í†h3&¹Ñ%ú? [¶(¼óÎÿÂï_JKËd:;ý] [Å9°* ½Äed²0‘‰Q˜ÉGÁŽ„„nü¢HD0ryi/)å ‡‘¨ŽÃJï€ @øq³¹sÕW¶CÍA:Þ³œž5« Íhˆb^-Žâ´RRYDÙeùXlæ•À☴re£°XXåUñ,ñ Z¡ŠV¨‚ítàíè* “%K\µŽx!±‘nB“V‹‡M†ñ? ×^{­¸ýöÛ/ÈËü›o¾YTWWgäúö·¿-&L˜ n¾ùæ?©ç7Üpƒ?~¼˜7oÞÿ5yÆùA&‘ª±Þ×lÕa ”?]¤j¬'ÏV}>ùÓEªÆz_³†ß€Þ×÷L"Ucݘ­:ýœn°víZÜn7k×®í5+H&‘ª±ž>[« ` äç÷}%ó§‹Tõ¾f«¨,} K2‰Tõ¾ê "° “HÕXïk¶êsÝþÓEªÆz_³UT6Pþt‘ª±ži¶j8wù7ðƒ=®ªº.å³?(i1õ‰ÓyºüûöíK‰©K¡·éúúz©¦¦†¡˜ †ßRI‰©?ÀúE ©úÁúA›ûÌŸòÙJKKSbêý÷ߟàw»Ý €§žzŠššêëë ýŠ“ÿCëóSbê«Ù§óºwïÞ!™Ô®¿?å³?ÄV.N‰©‹—žuû«]tmÊg°TERbêË{÷^Ðö_UX•S_šþ«³æß²¢>å³?Œ;6%¦&·ÿ ‘ÿ¿Rcê² 1uÛ¶mç…;ûÞÕc@}³˜óÅoľæ}‰™Ç?ùä“Äë3õÍΖ߈}=«·}€ÐÜ@‚îܹ¬ØâåÅ_dÅ/sçÎ=ã9‡ûöìÙ“0dºñÆ30ïovêd Åü¤u×é~å„-Ñ^âΊÿah±Oýð ÌOüë-ßé•ÿd³ª3ò!öM^˜¹þ œ¯öoľ /¬aW£.ÔÉ$Ú ÿPb_É¡·Ø·oYˆ{¾òoľOÐcpÆ™YƒÁ Ôßþt¡W_i;ûbYY›þmaFA¡!ðZÀ²¥¯¤˜dg{¹è_&LÒ±éßRVV6˜Ké…§žÙqÖ‚ûŠÑÎd±råÊ bDЌߙ`ÄЪªQìZ/ص^°p¡Luõ1Ö­ëßxb ðù~wFþO:€ÛkáöZ~{d'‘Ö|Óü^/þ„ùã P{ ÌÇ9ÐÔÔÔg}É„Àï÷K|Ð@uõ$ª«'ðàƒ½‡ß&ê‡_ðæ´óÿN¹˜w~[qVü‰tC0÷É„òòrñù‰z>?‘ï´ uÈU"±nàóõ s¹³1yÆŸújçkÖõd±ÿ`®%ðÁ7Ï ²Ø0üÛæžAp²Ø 0LÎ^‚€Ú0 8$sƒAÉèGœ©¿‘žþLÇ Û·o—fÍš è&µµU}¾ûŸ†Lÿcá Û+ú^ÖƒÔ¹{Ú'ßöŠ`‚7üˆ‘?ù0±ÔÏŸÁÓ\Æ+›8þДÄ2oÞx>útë²uø²þŒ}Ý ý9övKYbß®Ú]P½1%ÝÙp ÿ$`‹×‹ûþ€;v°Åë僶 ZçDrŠžþb¦¦|OþoÞ¼€Å‹³xñbvïÞ}Þg]Oÿÿ2r%›ƒ>6}X—&Ö“Î5¨£ƒ§¢ú°ÈhGG¯ý¹¹¹˜Íf¢Ñ(.—‹ÆÆF²²²ÈÍͽ å3ôW6OÆòYÏ•8*àÉÝ»yr÷îÄÉëƒÑ‹5Œú2¸å¹÷âÿ•4¢|¥o/++£¬¬ õbP¾‚–sl2Œa cÃÆ0†1Œa cÃÆ0þüC¾Ä벆6&NdiˆæïáKŽÓ€¬˜Éuç12¯ˆ"ç(FH£°áÄŽÔë_ ]ÿmÇJ6Œbq¾à3ŽÓðÝ0Ý¥¢^ô¯÷anܸQŠ8-þ/3Í‘H„d1žÉdÂãñàñxðz½¨ªŠÅbé5 o{{; ´µµ•¨ªú0(Ù¸qc&¨¸VQ”…YYYWŽ1ǃÍfÃápàr¹p¹\ ªÉdJá3™L‰t'!Vu»Ýäååár¹®Te0­‡«Æ¿cñ ±$áñXX"Ò© ›PLŠ”á¤K"2é4‹H=‹ŒÔe#¿³œË“!£(’nàXíÚ*‡K[2ëK¥ÏÑÊâwxˆ³ÁãhÐÑec_ƒß~îäÍ:'O™tmaL¿Tôït¥`óC»¦ð»Cv~±ËÎOæ ;!Ì*:Y"ÖÐ'ÿ-ë„Ç~¥iIyuÞãE•£ñ”xq8$bQAG§Âå·Qž/¸êŠv£&ãu…UÓÑc(¾<›[î*'·´œîXŒhG76›ƒ¼ËÆP¬¯-»”Ø(»P•Ôšˆ/Se “¬b•£dŒ@öxrÏ¡’J ™.d:P¢@¡I(´IfÚ­¹Dm…˜'f”I¦\sé K:·ºº:$IKL&Óãv»EQRDÿé0„æ½ëG „ ÓÑÑA$A±*‹-©¯¯ÏXþN«0!´kÑhS5ê€? h]ŒÝAÕe{Hd,Ý„œÜ­È¦Ñ”—vñÛ¢Ü2'Âå—Õqs-ªéó)‚ŽuªÓ*z™‰·0¡q VÐ(OÕÅÿìPZ@ˆÓ ¿./äp(‹µv….Ês"aˆY „“Qh*‚vïb¦hLo‘Ñ„èá‡ö!–hšö¸a4d,™0~üx p82kêEÁb±`2™Vɲ¼dþüù™ã_W—‰@àRêëaÇûsxõ]8&Ð]v>~Fàê8ö½ïñý Ø{ÛmIg’ GžcÍðóÿ ;v|ƒƒÓÖv…‡3¶ÁwÀ€%*<® ›99‘ð `*.!:a'‹GâP,81¡!âHȘg¹h½~­Ó¦Ò‰Ä‰€“€ «¬°ä8}ÇŸVÛûž(bIÀ~ü µn¥•¨$Ñf‰ÉØÇxÈ›dÑÛ}‡œÑË aS°]1’ÒñWpIÅEz¼(B^•w-y±àå>ùÛ¹<À!ËÇ­vTl(rYÎüü³˜{¿ô RPÁŒ#Ú!ÈB‹šVuŸÈ[Ò²gì٫ņñ'Y³f‰ñãÇ‹»îºë‚½`½öÚkÅ„ .˜è¾?\}õÕ" ]®»ï¾[;vŒh4Ê׿þõŒyWU•cÇŽqçwž·²™0a‚˜9sæ{Ù¸\.^~ùå?‰Á³gÏÕÕÕbêÔ©´|f̘qÞïÁ»îºKŒ?^Ìž=û¿µîï¼óÎ~ÝÝtÓMbüøñbüøñâÞ{ïÔµ¦‹TA_W*2§ŒÃ@ýÁ¾#é"U€±± ÑÈùæO©üä‡úö³áƒRMM Ë–-`Ù²eÔÔÔôá§‹T®¼òJJKK3žw0"° ]¤ P·€Œ³µÂàÊÙ²eÌ™3 E|›Œt‘*€2å2b+g<ç`D`õõõÒwÞÉÞ½{¹óÎ;³o'#]¤ ðÉú¾ë0"°ÄuôÓþÒEª€>skaUæôç¸ý§‹TÊnIÜ‹éŒl üé"UÐ×ÿ¢§Û¹Èº¾¿c“Ò¹gø{-}Áب=>mJøVê³k^(þ%K–ÐP¦ÏZµoß>ÖÝqzöôkxàÎ9ÿ¨uãùÑýž²TEüÕÕðŸ[ÜÜýt9Ï=÷Ü€“'OîµôÇ¿uëV¼^ý§Wii)?ýéOüï½÷õõõÔÔÔ°¦"ÈÆ&™ðéÂÞKü³ß÷ÒºK©‡ÖçsW <ƒÆ7 €äü×Öö^úãÏ»ý&lï½ èq6ëGëΪý,y³×Òÿ¨uãùpÁéúŸ7nÜmÿëL먚5 Ðãì=ïÝ|Vüƒ-ÿ[o½51óüرcíÿBåÿ®±>>î9ú/$Xëë=»ï¬žò9×ÜFìó½ï;Ý—¼¡wÚóÅoľ[o½5ñ\3êb }³sûƼ7.Ñ—øÉIðoÞ¼™eË–ÑÞÞβeËØ¼ys¿üC}»wïNô%¯¼òÊDŸÏ'î¿_ïCÍ™3'Q}ñÃÐÌO&n8ݯ l;=0} }³sû<µ¿Nô%•)—õJÛW?;¨±/¹þ?Yß;íùjÿFì{¯ä½D_rÁ}ˇÌ?ÔØ·dÉ’D_Òè‹ …¨±ï}Ÿ/Ñ—ìûŽ9¾L¼^¯ø -ÈŠ`°ÏV‡"þؽ{·4ÿë%€ÿº°×y ±ÿÚußdÙÒWÝ `íºo²ÿºXoÙÒW†$º©¯¯—’ã‹#wæ`O‘€×ëÏ?ÿü€)™Ì ’ŸÉ×1{ölÀ€LÎ’ãÞäÉ“SbVòsµªº.‘ö\‰ÿ!õ7ï@ù3‰ÿûBõ󱿣þpú3!0P·ó(RÝΣüË¿¨¡ç•ýËØ~#žðÅÜ'ýõË ñ¿Û³§‹×0 0–a3€ÁáOQ¸–é™0ÔXß’9 €ômÆ’|Lºø¨e˜|œa¾ÍXÒùÓ·-¿a¾õ¤ýbé´mgËo˜¤o{R„þFšômƒåîK쟼½¯çûúÝp®ÚgÂ`<ø ~Êÿ‰FÉeoˆýÓ—ß?ÁkR—ìŧ—{lú2îíAüË^æùçŸÇÿ?òþ'Óñ‡¦P¾q+ø‚|@ýüŒüɇ¼üòg\;áoYÐÇæÇœ ÊËËÅÛo¿±dggs÷ÓÛ¸ûém<½-€ª~ Hs¶Ï¸Lm;/¾ø"÷ˆî/Þ¼™mkîÔñƒ…ŠþB¬bZòkâÿLÂÿ %nßp(_zõ­Þ“xq²“=yyÔæ½À’¼yy”K.å]é*6õ>RÎÏ­1‚Xx…j‹þ PYY)*++@cc#±XŒ#GŽpäÈrrrþÅÿÉè5ªÒýß"^@7xÝ`”]YÉâÅú ÉëƒÁè&/$}ïË ]ü¯^œº¿º²rØ`ÃÆ0†1Œa cÃÆ0†1ŒaÂj¨®8Ñù!Z¾{”¯8Îb¨ä»òÈ­½ÄJû±Ö¯Øš4ª‡8EGŠ’XBƆ¯\„;+³bÂÓÑÅÁØ!þÈg˜1Ý_Dq‹ûS@kÚµd7hš6¿»»»´¹¹™@ @$AUU$IJˆ>Ýn7‡‚‚¬V+ÍÍÍ´µµ%Ò ~GGÇŽC–å·ÛýY–[€—€6ƒøÇ?þ±ø$Išo·Û'çææâr¹°X,8ìv;&“)q~c–ßLÂ@Y–±Z­ÉÂ?@eF£Ñ‰¡PèA!Ä¡ÿøÇu<òHâW}dvªqñh¤[ªÔ¸L®\†;:‚Æîý`oEÓTÔ8tµš¹ÄzÄeötýžx\%•È“s™sy#øÍ‘7 ÙO`±«H2˜Ì`¶²ÒbÊm ò“¿,Ñ:“¯[ìÀI„G‘©é[9zÒÁþ£qö‘ioiådQ`S±ËqÝ:BBþGÑuŠ&©&vžpð‡£r$.u6àè å•d¡ˆ<)Í'…ÿk·ÇmµñG³Æˆšì fJ‚€ì›Ibä¸.*'Œ&+ÒÄèÒrÌ{ëɪ¬Æ¦Y9Þ(1ç†F”\DÃÇi;ÚF8d¦°bù×^Jgš4±ò²‰.eÆ·Õ'ÿñ%…ìÝ{‘¶æG㱩¸ÑЬri¹‚Ev<ä%ªv"‰N¢Ý:¢ ¢1¾ÚÿGöžè¤³=gã1\Õ]9‰#Ò^”fٓͱú0…> íÔ‘•–‹Æ)¦œ_=ÙõÉÍ þ@ >!Äüx<>¹³³“ÎÎ΄ø? FQUýåy{{;ÅÅÅÑÖÖFww7GMÌšn˜úÌÔ.—k¢Ùl~P’¤C@ .;;;ÑþþCøœ Ç©9Ð#þ¦8hª)†³ ÇOkg5k2h Ý@qt§_Ì‹Ô ´•ÅQåYá{ò‡’¿3õ()Ù²’¬¢›DÎbÖ8ÝZ ²ˆBL@j÷_qÆã<ÚÞ)Õ4tIt÷dS‹ƒ$ƒÖ ²”$él(ê"ï’q”]9X$Ìa% ³Ú¹K"0v„F,.Ó‘V:ByiŽïÉ{¶¦æÞôò‡šz-*(aލ“©ÅKKG Êq"®0˜…~OI¤ˆÿíN.å"fN$oD!t8DGüšÄÊ£ LÛÁ“ïÏH½ÿžý.ÎÖ6Ý{„!tA¿&@’@–ôOª vW!¾Ë'a“Z9äÿ‚n8< äq09A„õóXÌ`2Á©+íV”{|<ù’?•ßjµšÝn÷ä’’’–––Nõz½hšF,KÄr‹Å’¶Ûl6vìØA  //©S§‹ÅRDñõõõX,ŠŠŠˆÅbS4M’$…B¡Ð{è¶%)— !Í‹"- K—ôò•%°x<”OšL{$Ê¡=Ÿ¢µ´ ‰(Bƒ8IXA…°doYå—àíЈœ_êý'´|ˆ­Bkœ¢Š=À—(Z$/Å£K™0!ŽÉÔÁîºÑDº@7qkK·Ñe°;øsJPM&ÜÙ(€Fšyh–)Šzùr°}‰®fOjTäcÇå)øè`UA¶è7-¦fÛÀ—K“TA]] Š"±çsÊ•FŒ𥠸¡+Ñ à€îÈO!'´³èÅÿðÃ;…jšVcˆÿSЧç{r™;N®¹æ:ÄçŸÞ«ì…ȲŒÙl6ŒVÊÂ… Ÿ\¿~}jùÇãy46ÎcÛoîàÕmpLA¿¹÷@ð¥ÛMq—ÀÝÓrFäå!„àĉ‰Ó´Z윲Žclh úƒy?;?ß ’t.ײ²Ž!NH’”Èäv]ïÿ¨5±žm&ÀŽ„ØWQ†õæinl¤åõ·¸ôH6 âh8‘í3®C»üRloþš8FЉþÈÒ—• ì…'Ç‘zÿ·ÚÞwÆMášÃ–c,'‰{À1"GØ läa1)œüÝB{šˆŠÞí?fR¡, ï%Å €õàÒEˆ˜ C‰¬tj&e{îëOÎ<õþ¶C.'𨥚¸YÿÈr!ddS7šjBKò®P”¨n†”)"!wÊàƒX» ¶€,VZJš”övדnw¨³÷‘ÃøsB4ªC455]¾o¼Q466pðàA®»î:ñÁü·¼L¯®®]]ú O†ý|bË–-Ò„ „ªª477÷Úÿ³ŸýLš9s¦hnnNÔ˹Ʒ¿ým±gÏš››¹í¶ÛÄ/ùË?Õ ÿ-ƒD£QFŽyÁ8g̘!N:Eð,gÜ9âqý¡{âÄ n¹åñÖ[o]ðº¿óÎ;ž}û°XúôJÀn·óâ‹/êÇü»ÿ~xW©ªèBUЕ§‹0†‚òоg _²d K±—æ}ºP«LÊ](þQëÆ³ô{yèYCômeÝãuøƒÁ ´víZñüóϳhÑ¢Œ2·nÝÊý÷ßÏž={b¤ŸþTŸÝ>¿?ÑW_ÈÏÏO|fº_f¿ïåå,?7¢ÿ&æuøàýÞüý ^Ó‘>è> 2gÎ6nܘ2p:ïö›èX¼õÃ/ˆ­\ŒòÞ»dýh]B¬š.B ú›evÔºñ¼¼w/“ž®ÿyã2×¢¯þÐ_û[gZÇKÓņÖ$„Z÷¼w3˜.Lû¿õÖ[Yú‹½”z‹±cÇÒƒuwŒc½ù‡Zþýñß5ÖÇ2¿ŸOÐEª ]¨Jþs™ÿ®øùÏÎwÞ)ú FÖ4Rÿü.vÄt£„ä™'Ÿx≄¨4>ŸO¼´tWЯY¾çÇ÷ï>‘$>#ÿÚ`‚Á!óŸ<ô ‹ïžy–,Y"î¿ÿ~6mÚ$’¯áW¿ú›6mJ•——‹»îº‹¶¶6¶mÛÆ¬Y³zñ÷5ƒ¯Á?õCý/—M±²˜Ïð­/ü~¿t÷Óåjxî¹çX»vmÆsx½^1wî\‚Á ;wî$pã7&ö¿óÎ;dgg÷ËÿÊþ q.æÌ™ÃÖ­[…ßï—6nÜ(žzê©^Ç•——'ÄÀ^¯Wl_3†µ»ød£. |7i¦î6o擌ì§ùsjuþÖ]MüfV>×oÓÍî¼óNñóŸÿœ½{÷öq†žAáÛƒÔÖZ¨ÝUá7m§ù¯¯4M IDAT÷lfWZ\ƒÿÆ©ºêÚöÞ»´¼ök|·ß4¨ö·æî ªªëøäðᄉ‚ûï¿¿Ï´ þ)ôúÿp•)Iõ?PþŠ7ÛÙóÁÐÛÿ®5zû¬š5‹¥Û`oÝ ø ‡Xxªnhåï6ŸŸ¿ñÆÜzë­ƒâßpÛó†œ˃züùXÀ«ûüÜåÓã‘®/£¥³‰}Ðóûø]=æ©ct“©„ÁTúãjì3øg˜÷QòÌ34”Ý’x¾8SßÌëõŠùóç)öü= –¥Ÿé±ïÃÑ]VŒ_ÍÁ`PÚ´i“xî¹çØ´iSFþ¡Æ>ƒÏž=Ì™3¯×K0LÜ«^¯WÌ™3‡`0HnÒ1@ åœkî®àémz?n0}?¿ß/ÍÆ'^Îò3ûoO MÔ-趯¾ÙÙÄ>Ðóoýð Z^û5¶÷Þ%<ý†„ÁÔ@p6±ô2˜¼aYú™û6¤Ö¿þÚÿPcèùßð–.¥jÖ,vmÛ¦L¥ýŒì¨±Ïà/9ôo¼ñFâú3qõÇ?ÔØgð‚ó>ºÉÔ?‰>“§ ¬¬ŒO?Ý-$‰„øîƒ6ý9¾\À Vƒ<$1aB»‡8¤¾¿žeKSÅ¥û°ž€€ìl]ôÿÀ÷× Y¶ôVdøÅ¿éßRVöñ ®§¼¼\dÕ×sÔ›êWÛuj;;wîL¤Éô¬êë|O=õTŸ¿}Ó1kÖ¬Œ}ÁW³ë• ‘ÖÃ?]¥¶W AZ3ûöø2¼^¯˜kgp÷ÓåLš4‰Ggnî÷˜{î ±tÚÄ„Ú4'úÌ 0ø,ð7æ_—ýG óÛžw¯¹–q»om/þLf|‹?ŒÀšF¼Ë E&Qjº A:ü~¿ôw_.fÎT™\µ•xÆ tõ2!è‹ÿãçŸç©§ž¢¦¦f@üéíªÇÜGœÉܧ/"ÆÏO¤šÆ"ÿ®)Gwì:-x–«¶g%Â?ì¥äó\>ˆ{gù;„ï|p¥‹øë~W›"ôȾî|“ìë^aûš1¤§ŸøµêĶìë^Ôu¦‹ø7¼°†m÷íJISõ—cØõ¨úË1ðÂÒÓ/¸oybÛ¬ÍUƒæOñ³¥GðŸ„Ï„ñÿÒó93mÿàîÓÛ¼ËWOé"þÐÿɸ×ëåÅ`{½^ƒ¤§¿.é˜{‡ÐNú2š¸öÚÓf£÷–þäc·|=±í£>êÅu®ÛèöíÛ%©fÎôˆmk¶3éÁj@'X[[ûgÓ þ̃zùbÿù\Ôs½þ¿Ê{…'7@àG@†ßºý! J3zÅöµó¨ŸŸÏS5ébÿ—AÖ}äŒõ ÿ+árx„Ó}S€ë_~™×ÎcæÁÁ·Ãòòr±|V=³gÏÆø¬ç™Ì²eËP”«»zž…ËgÕ³fÛОq^¯W¿ÿPê¶ûIʽpï½÷òÉ'Ÿ°oß>¶­¹›YË·€Ç‹ì¬CëœH¦ã‡räçç‹Î& ã—p#Ǹ¼iŸço塇J½Ï§¨}AYS"ïåKÉÛ~1í2êþÞÃë[൴÷%ŽË[üw0jyä±ù~\£gœãlQÝóû±ª:õ‡¤1F!‰‹õ SYY)þM®¾ËÌï_%FUÂG“Zà(Iÿ¿Ù³ý?öì†ï}€'wïæëßý.=ç’MîëùþB0Ȇ Ïdñÿf8W!+/ÖÓpõ`¯dÃÆ0†1Œa cÃÆ0†1ŒaüO à%^—4ÔËâ„ï;ÁW§B8pcuXÉã¥èÊB/<Žõ Êa)~‚(ATbXqà‘rɲe“]Tˆ­ÌN¤³ ûMŒŒåÑ@#~þ@69÷Z±m}‰×?¼‡o€7JÀ%Bˆáp¸´©©‰ÖÖVcæb@à%‹ÿ‹ŠŠÈÉÉ!‹‡±Z­‰?œ ‘¾ÅbI1P¥Ôét~O–åº7~2þ|ã/pƒÅb¹)'''!þ·ÛíØívÌfsBô¯ªjB `pצiZbQU51;µ‘‡H$B$™‰DnBWö%äÓšŠ[@  Ihq™Ñn“s®åÆ­‹1YTÌVšÂ”¼éd[s9¼­“ÙÇBÅívsé%—²¯éKŽD¡iUíÑêK Ë É<&Ï‘&ÀCà ԠBGÈA­‡ëc’MȪŒÓøô€Ì¸l {.úIãp\¾ˆ‘ò~Р«ÛLÝq»F(È3åR•BK ºÑÕ2`å1”ÞüÞáŽu«5Íu]˜+²‘óÀkS NîS)µà^P,'•à„t5mr¬GÉ–‹ÐbvÅNQÑhŽ´ÊHñvÚ?mÄ1ºˆ’i¹ÄeÖÆcÍÇ¥^üÁÃÜBÈ5šs³Ýæ‰w[²,™ºèpÃoŸO~©å–$©Æf³a6Ÿ' ÏEI˜€)ë™ If³™p8L{{;n·I’“e9¥üV¡ ´oÑ=]ˆÏÑä?bŽÑHBÂd61ª¢™¯öŽ$Ò¥›Èñä!m¥½mš ¡öt†bSØö3ýY5]¶9N«øçΈ¤ˆ·PÐø]Òt¾´@· –®žPuá¿b‹"P‘ÍÞæ,Ž·˜F ‘ˆDý#Æ9À+AТßÝ]ÐÔ±\èò‚£k:æøñÿ,ÝBÊýÔ¨ªÚË8Ũ‡tCäßÖÖF_PU“É„Åb1„© !Rã_<®ÐÒr%_í½›Íï(ÏAwô%ÇËÊ85mEï¾ ÇðÕW_‘_RÂþÄÀI µ¸‚ækîÀýDÁQ (þ¨›lyKb¬ïFŽ| ‡ã$œÎ¿nj<èÅíÙÙ@Ì_ùi*IÅ5_ã·ÞÄG¯¿É”#Çq!#YÌ´^?Ф‰tüæ=ªwF‚0‚xϹ Ÿ;<&eˆ?€;.i5¬‚æ&p+Ø&x(«Ýn#&ÉH&f#®*¡¥µ™ìúéïØÌÙ6¼Wãv»ißߎõ³8%§¼8+Ÿ8뉣=Ö!G3ò MªQµ,Ô„ÀÒ‚¦ŽB–³1+`:F8Fë¹k»Ã9H¸1)£!ºPµ ¬—©$È"L¼Ã†É)P;m!äç`Øàχ`0H(êµïºë®ÅÅÅçtvöôx ™0a‚(--åµ×^»`/Ô«««E²Èþg?ûÙá.--åàÁƒ„Ãá A× ?ûÙϤñãÇ å1 ‡îîn^ýõ Ò ñ?è÷ÆÕW_-~ÿûߟîd“‹††fÏž-Þ~ûí :ˆÅH$›Cõ…¤I†ßï—|>Ÿð­ô៦ ÅÒÅÿg#(ÿº;Æ1ã7z‰ÿÏF6~¦ïÍÈ6"°òÿô§?¥²²è-þ?˜öööŒÛ þy>ö¢×ÿ¼ŽÔúŠÖÿyùËiºÑ¤L5ø³~´Ž¶ê›ÈúѺTþ³.ôþxÃ×ô6(IäÜéúŸ7.µþÏFv&ü÷¼w3Ó™ôˆÿ“øÏF6PþuwŒã™gžz·ÿ³ ”­ÏÇ4¿ÞþÒÅÿg#; !¶!81®â¿ãßáù]°{?3Ì#œÉ˜aÞÇBÏ x½_†ÙÀÒiúŸHñÙë÷­uøž_7[Iœ‰YO™|,ëgâ—ëëYæõfä¿¥¨qßZgˆÿñûýÒ¦M›Ä<€ñù«_ýŠŠŠ 2¡­­`0˜˜©7Ö¬YìÞ½›Í›7gäïšôSÆ}k‹ùŒQëÆ'òxñÅY»v-Ë–-ãÞ{ïM9¯Ïç•••ƒA<˜ˆ)ï¼óNJ:#&Œü?ï"Æ}k!þOðB¡tC,d ‚ÞY»‹]u§g¾asªk2P5«ž[¼"9üe‹þ–qßZÇÛÓàúm΄Á‚Q÷='À“[SNû|>±tiÚÚ|víj¢j¢¾ýzO*ÕD¨®îdùòÌõ*ü.ã¾µŽ–×~MÞí7 ªý½´ÔÔQµN¾¥›Ó³†(--eËŠzfõÁoÔÿ”´úÿïùÙó.ŸÑOûhA=Þ5™ù¼ ã¾µNÿ›Ö ŠÿíiA-ȧuWUU}— LØ’™lÇÆ}k!þÇâ¥ÜöüÔ¿`Ƭ¾óÿÿ-[·fyFþ+véñçÕ}~îëë%ÄËÔ7ðz½"Xöæ b_0”ÒE}k¨`áÁ:tß¿ûð׌mf ±/ÿ޵ßbƲÿ„}oÑPv Kn7 aŒÑïLì˘QÅC»v±˜?šbeݺqøÀ_^^.&Mš4¨Øgä+ùfzö³ýp"Olݺ5‘ÿ­[· Hí›Ýÿý„UuµÄrêm~º{âKðöú ­»šÈ©Ê§la¤Møþñ†¯Q_I)“òòr±bEç b_¦ò_êüÇŸ€ðÊÅØÞ{—¬Ú_÷*ÿ¾Úß¶5AÎû€DìËÈßSÿS6Døpn,5PþÐòà b_&þªiµìzئ ¬{oAÿÀø?½Û2¨Ø—‰¿áµUpûß2c¬n€²nÉ­½î¿¾øO­TìËÄ_}wÿ´±.a,õ¾ÏGp€BìMÿ¶X¯Ç¢uß„Ös…èñšÎý×…¬øÁú„ €žþ㜺O”••»e`l¿è_¦‰ÿI˜¬Ö÷:×ëË–¾2$àÿ3ô÷0i×fØ¿™5Íeù¬z&õè=ïâÌ"/Cü?ñu&3ˆ@ À]”óêúzÄBèÚ¾ÏÍl[Óã…¾þE‚§ïY|– Fùßyþ»Ü0B½ß|•}ÝeÇöóó—&Gâ³â·¯ÿ&|“§/Iáß¼ùë”—ÿM/~¿ÿ¯aá+L]濲ÉxnŸÏ'üÓü(º1OõÐ_ê”Hé1–½Ip÷~ªŸ¿ˆ¹¾g{™”——‹@ ¨çúúzéÕW½b’Ttdÿw,^JxºnNõõ'¾â;ÅÖD£O0þ|>Ì+ûïâðáÃ)ü^¯ÞïNæˆñb&”——‹tá?èâyAÏíøÃÓۻ컰=+Ñ5ݱqúÇp_fî&)3²Ÿ!¼!‚îïܽ†ÁŠõÏd&àõzEÇ5&¼ÿÕ÷̺C1$HÿLüZ5u¿«M¬ qàƒo&ö¥§1Ðc0 ü§‹ÿÜ·œ /¬I¬ìúÇIŸú¾ô4¶ÍÝ5`€^âÐÏ[’ÖÑÅÿ‰Oc_ZÁ5Á›¤‹ÿAó´§Åý/ƒ‰}éiHJ;€ôYç“×Ó5Äÿc¬úz² @ÇŸKÓ Ã`îÜ ð裀*Q]½ëÏ:¦õˆÿÓâïAð]üÿ£tÑ’9@y’Îß}œ8´ë0LVÔéóOs+¶|ÁÈŸ|Ⱥl7óæ×M Ü}b3ÞûÞ?Æ;n€ÿüOð/{™íƒ4(//¯®Èagmês°Êø€.ü/--¥¡áªÄ>ÃàÕ9Üõ4ƒzÆâI” ¤†Ä¾ÖcRNñA±½PgÏžrl&ñ¿qžà÷´ @~~¾ÈnÊ¡“h~K1S¸¼i?ùÉOx衇xíµ×zÊ!csÐGdM# þî´€sÐÇwoÈãöõþðÕæzý ƒ€œ?-לn|'’@ÁC¾~M*++d64¨¬¬û÷ïOŸfàŸþ+Jaáiá2F 'ÑÑÑqV&gšÍ~ñMúý«1qõ]æd€!áèŽ ƒÒ^¯x!Lˆþ“M2!þÄ T¯¼Ú‹wó…¼VYHwhjJš×* »áGW‡/˜)ÒùÂܹsÅæÍ›3æ!Ó>cÛܹs@_Çö‡óeðôçÂ?Œa cÃÆ0†1Œa cÃøŸ€@³¨Ä¾ÓFcá)ši'„J ™h4NWg'AÞˆØ'Ûht5âüØIàË EÑ""taµ8°8È­ÈEm"ªªh_ê3çea!7m´q’†B'Y÷IÈ;1”R`BLÕ4íêp8L[[[BX/„H].n·§ÓIcc#^¯«ÕJQQ~¿Ÿ¬¬¬ÄC„oÌ– …èììÄápLBL•$iO¹$Ißq8JNNV«›Í†ÃáHˆÿ%IÂd2qðàÁÄìi6›-!FQ…xÙŒj³¢ÙíhVAUDQ1¡H ™`Ï#* Ì®V¤ÀþGÐâ?§Ça÷_1«*«ÛBmIº™XM7°¸N YÍÙ£)*¬˜høâwd—Çår3rdGO~ް€° ¢Q8ˆÅeFgk”4œ’pd±ú¥9¾E÷lÕó?of«#@= Äòbù\™=‘Q£Í2V“•Ñ#K‰ÇãDOD9n?ŠfRõ‘/LÝfŠÂ%\^rÙ#Šè”e²„@‚°h@IÏõ7Áêi;Xôþ ýþ{ö»˜»Â¬Þs°,¸sFQ~‘î®ïÿ‘®VÔŸ‚h·â+H@(Ð *t·€5G%¾‹)(*äÔÑ:Ü"ÈÈðÕ!°[X}E/ùu~Y–e§ÓyeQQÑ×Ýn·ÔÝÝÍxõÕW)--¥¢¢"ax`6›QU•©S§²ÿ~JJJP³ÙL,#ã÷ûÙ¹s'ØívL&6›æææ¯‡B¡7B¡ÐqzÐÏ•v„T .‹(14z&|AY./6»Y–)//Çl6säó?Ø·4ãhV'žK¯ ðòJìYY:t„CG%†Y2‘dB&+]fëU’Rn˜ºº:3°Úl6§¼\IŸŸIt¨ª*­­­:tˆP(„‚üü|FŽI<§«« »ÝŽªª«ý~ÿ"ŸÏë!p€úC´ã¨ÒQ$Z‰!$ !i $¤ Ô¦Øiçg !Zõu "‘nº#1„¸"ÅKªü’šóHÿÞ*@à Î9*CȤÏE/’²Y7ªnPàu¢‘¦„?®ÆimU9Ød¥¢B‚ƒú nƒ €n'œ´‚#þ þ‡~Ø,„Xm˜÷Hüu‘!ûöíÃf³õÚnÔ èæ+&“Éø¾záÂ…‹Ö¯_ëId¥­mo½;šã úã 8è×Ó~Ùe\ˆÝú…J•ý;‹Ýˆ3¥ ¼Yû/¿êÿ%Õƒ7{Å™Ò Û¯/3ÓÐï¹·__"Δf(°Ûí@f#Ãà¾ûî/¼ðÂ9åöz½hšF{{;ªªrðàA®»î:ñÁœ×—…÷ÜsøòË/‰F£(Š‚Ë墫«ë|R¦àµ×^“ÒÍ.4ìv;ÝÝÝAü߇ÃqÁ¸’ÅÿÅÅźºº¸ñÆÅ;ï¼sÎïƒdó€'NœWÃtÌ›7O|ñ…>Ø+YÜu.a Îöá~ü¼´t»jw±ŸŠ6}°÷™ú¯Fú[o½U¼ñÆ)üCÀ•ßÇ8q€½)üÓ§O´v°3ý%¥ï]NÃ=c·Þzë°™òïv»ÏÈ?îŸØû’Ÿ—ªç$òÿ—ÓüÀ®ÙV.2Íüâ÷û%¦!ššš2H:]þˆ¶'H)ÿ¡`3•¿Ùf?cþ3ÕÿP°Cmø4ÀKÏœæŠv¨üK–,Ï<óLJþ‡"€zþ}jüŠv°üé3qì}Éϸ{t#vïï÷ø±±Ø&øü›DUñ£Úk¨ªÖ kWíéAõéâÿò÷'²4øeÀ0JÑæOÌÈoˆÿ NCü°iÓ&2ÍFLŸŽmÛ¶áñx˜;w.‡‹‚Û3ò§‹¿ƒÁ ôðË@ À-E ~³†ìë—÷üvð`ÿS©eggãõz¹ñÆñz½T‰ÚŒüÉâÿäk0f]~Ð+ÖTYž6“ì™ .>¬®âiv1©z µµ"#²øß€ñýÉ­åâÑÙÇùû·{‹ƒvíjê—W<ø`kÖäS]í§ö_2׺ø?ùúkUfíNÆáÇiøt"ÛÖÔ±«V7‘Hý”?Ó¬ñÉØË•×Éì!HÅuí,üÿ+3ò§‹ÿÊß:€ò_XÛħäS¶Áφ™Ë?]ü?àüøEú!½òÿËEc¹ xyÑjTeäÏ$þ‡Ôý½0ˆØç=ôuá÷ÿ5ëç?«Ÿ·çĤ… ÿ4?å±Ô6Þÿ`bß2¯WLóû©ž?1…lÇn]¢ ¼ñÆLž€]µz웵Ü+öîÕïÿd~£þ§ôQÿýµÿÁÄ>ï¯ðOó³žTþ‹ª(Ó§Óäm0ÿ`bß„-^ñr–ŸÚªTþª¢ÆÝº„7Þxƒ’gžáÞ{ï‡úðâ IDATxþû¨Y.Úªobµóôü/L Lóûiàû¾¿žù?Ðׯz`=oZÈèbûÜ]Èß_Ï&ÂÒWéÿùŸ*ÏtÚ~±{÷nI’Àë%å>Úÿƒõ¬ý×…ìÿÎùÀ÷׳éß²lé+¬HÊÍPgÄ.//7ÜPO2óÿaïÝ㫨î½ÿ÷̾ä²s™„„æ"„ h…ŠÕZ}ªÆZ[{žA=}~§ËÓž×9zj=Rjk{üIí¹Ô"övê )¢BvˆCHˆ!—Émß÷¬ß³gö%;„ØžóüòÉk^;3³f}f­Y³fíÙëóù.ƒòr¸©n‡)þ?\Ôêé‡yEŠÿG#‹5ƒ(,,úw+u±ÿ7¾ÿ fÎ|ò¯Ò¨«×€W”rãúÇÇÙ»ù+Qç8³£•ÙùQyüúÅxîú1è&Åb¤ïtÈO¡d†þþý{¾þÝçq***€ŸÒ’þ+ )tž•·{ívrGx›ße®çÎâÍ&cc£TL±à-h¼¡ ¡ï'ÉàÞ!ÞÔ^/™AõÖ%ìyL¾?þøãìÞ½µàU2z¿m ªR¨ýÅ•F566JÅO?%Rž~Šo?‚ç¾MÖ·ÀÔ;hi Ÿxâ s=??Ÿ¯üð‡lº÷Þ(þ5kÖðòË/GŒE@OüŸøÓм‡21d›æ”HÔ«‚d·Þ×ÈU¥àt†ö…OaÆ“Ä3øïŽX1À«¯¾jî¿í¶Û¢êûÏ!^)ÇXÎ%¶¬‘ëƒw9øÝ—køòÞ¿fë_ÿ¿Üù›*”_3¤~FË+þ7ýõg,ÝΞMWšëFšŒ¥ÛMS€xÇÄ Vüoú!,ê_±£ŒJ_¥¹n¤Y±£ŒÚ¯9‡=n$&CÄÿ;#v†Dýʵ\ ‹üwFl7ŽsÜHLbÅÿû#ö¢þû…µªj®ïØn︑šDîlOŠ¢ˆë®».*í• p2f¸|Ýu×ñöÛoi³Æú¥Ä³cÁŽ;¤åË—‹ÔOýbbÍÿî0„÷{ŠTêëáÝoÁ5¡¡ÄqtAÿqt3€ægB=>¾™ðwÕKay³BÈP`Ì}ГŠ"¶lÙBë}÷ñ$sùÕ<Ò£ÎV§ð‡ë§‚ÜûuWš^¨O¬\˶/_š«°°Ðl---’!þ§ÓÉ®]»X¹r%7¾Lkë{lÞü-víÚeŠÿ DšÄr w.™ÛWsï£{Øþèrz*ß@üäaÔP¤Ã@,e×®]TTTP»éVlØ®³?¡Ï‹X÷,α™ùÈŽzJG}ò© •C´Ñ‰…3ä25Ê€ˆñÍåF·Oªö÷ÚD  ª CìP‹Y¿~=›7äRsî¯XáBs+;Ôbó^ïžSd¦«*è9ëïz*³(úãâ(†ø¿µµuˆ@¿¤¤D´··Ggêú(M‹þ¿Ùívººº ??ŸI“&©Ž"û®Ú¢"j뇾}RQ.˘èÝ—ý<úÿÖБ‘¢þé¹=š›ËOí¬ëÔÓ|:f,& ÷+†è?Ò`wI œ:5$ý/(™…»û?‡lWpÝä"ñ Ÿ¹íw%Š{ìÿ$TVVŠuëÖÄúÇî‹ÜvøðaàòÆd#1îù¬Æºiþ L`˜À&0 L`˜ÀÿyØ“¨¼ë-¨¸à%€®Ûv{<ôôöâ÷ûqrì ’wÕò¾MÆõ þtÄÜT¦]“Ï”›sH/IÅ?è£ÿÈ}'¹àéă—L$b£™Fî":vødà¾@ @ww7>ŸÏ8kš†Õj%-- EQÈÍÍ%ÐÛÛË¡C‡$‰üü| HHHÀn·›‚IŸÏ‡ÏçÃf³aµZéìì4^RÝâ4°T’¤¹‡ƒÄÄD¬V+ X­Ö(ñŸ‚ŒŒ ¬V+@€þþ~SÜß××G{{;­­­œ={¿ß,Ë!0„‰‰‰8$IºŠ£à€KÀ'­võK ôJx]AŸÄà€·ÛKqæl²lSÑlvH›ìç=×[x¼^®ž;/Mû2W "[ap°Ÿ¶6ý%¥ÐÁ¡ë }‰^W¿´j°/B„êÁ‚‡Õ¸€~Hö{™›ÜA…¢²0¹‹Òii() øðS×?°òšSå@s€æÓ§ØwÔËþSi¼×Ôl‘)›—Ïôl-,ø7ZZ=în€UÂñË-éÉ)=q5ÓL*H$=\½`A¢¿ÇOJÐOÞ)X•d<š@™ÉéØÕ?â;ö ùÓsio?Mw[ŽL ÙÓŠÕßšIÑç§1ùšdÒr%RS ì:X˪9©aþdÕbI`µæ=ðõ2mÆ|$m žOÇY&åärÍç—ñ¹ëàïh¥¯£‹ž³<o @Åòî¸k).OÇ>íÃç¶ráà ´ÁsêA2É(¿”¼ùLž^²*{ú‚HðR`®ÏçÃëõâ÷ûq»Ýx<‚Á BRRR˜2e Ó¦M£©©‰3gôkÜÙÙɹsç8wî𦑛›Kvv¶i`µZÍûÀãñ/e£Ú`!ÈêÁnè‚/ý=t½ç§ïc?~UCÁêJAê§-«Éô7èxÛ…¯7ZçzH^ûÀï×/½=$äVIQñëÈÖR¡ÌÀ/ j*V_›?ˆE€E¼>/ý~êÀAM#11iÁ<×_‹ÿÚ Îg*ØzTl]°uõS¼>‚H6šœ@@)BȶRt­«Y~Mcõé‘ xz@¶@ÐþP¬f{*(³¸bîbÔÞ>Î}|ŽSÑÞÞŽ,ËØ“ÒèöÚÀ"A WBuIø‚§hØ­àr³ª0ªü`µ8HšLª”Fvzàã¶£´t4ƒ Ó ™›w5LðK @öËdi“™7}Óó¦Óðqº·-èGð5‚óvLƒUDó[­¬ÆÐF ¿ß‹;e*JÖt4¬¡ë‡À¥êâ+ öt!Z\= Éä]y5YSòIHtÊhädAº<>Võ»Ãü’$Ym6[iQQÑtã0 X8À‘#GHHH@QÒÓÓq8Øl6***$‰ììll6v»¤¤$|>¦Þáp––FZZsæÌ™ž””T*Eˆð%‰ßì«æ KïOò§ 77‡ÃÁéü|¼ zt”$ %EðæINäÌ´ÒÒ˜<9ÃmrÙ@)ì?>ÿH’ŽF‹ «“Ñ­’;úTÜn ™ IéìBÙý&¼}™³f‘vÏ—9ýÅ•ˆåËh=zŒéo½Í´AgÑèD#Ê_ ?öUôçËXu>¦ÿ Jbus‚ Ò ^I¢ß ¾{8{¨s^À}¤‹SÎc¸]ô¸*l@´ Å62¯Ê¡··›¶÷[ñžà’t[ñJò½™$hVúeß*UöFñ !­Ö|)‡À"{I°÷£ Ar’…~•:çQj÷œa ¯YÊ%<°ñ‘âH¥§ÛÅÁƒG9úQkÂHLBxíh}V°€dñ‚¤èI]¸íš3‚ÿxÿ·ûy9xp©ÝÌãÁ/(‚A ºxp©]Dí‹X7ÒEî+ Á¼ÿ‡[ýO\Ì‘tc€xæ—‹ôôt8 }ðÁÒÔ©S±Ûí¨ªÊÂ… ÅwÞ9îå¸÷Þ{ÅG}D0Äb±päÈéÏ)ø60eÊV¬Xñ™”óRp8ôa£a,70 CŒÏ‘âÿ+¯¼’×_]š9SþÜÞÞÎÝwßý™´Øò¹\.æÏŸ/n½õÖ?k[LHH¸t¢Ë@cc£TüVHôW^fF™¬ µàUN?ò±" Y–‡;tÿ¿øÅ!ü—¥ýèG@HÖØxYüWî›5„4"°;î¸c?@ï›÷ˆ¿¡AþØ·w³)älÙ²eqË/Êf<~SôQþ‘`•—±aE /oÌdݺu””Œ^ÓØØ(¥×½1”"¤òò6m²³mÛÐë?þx×$X]¦òÈ )—ÕþöMÛ7„¤"°þ *)ÿÞtYü¡ TQü#Ôtpä;Ÿ|ry÷ß[ÅCÛßÈD`U$?±‰mŸ|2&þP$nvíÚµ=é¡°8­¸òBÜc×Þ0J4SV^FÙ¢rÝÄà­¾úÔ[466Jÿ Ç £nb!ÏÎv¤ü!€¸çPXX(bëñG¡~6 ôööŽ©ü---’ªªRÆMp®£vÓ= cÒ°¢„Åø7ß|s\~#RöXøáâ“•GD=[?MÙ8\wéë±ÉÏ---Òwåñ½;z¢Ê_^¾÷¤òø@åUÙÔÕ…÷]Nû{æ™g¢¶;ëÂÑÄrÚn‹= € ËÔ•‡ãÙþ, ß»³¿ý?ü_ïï›|Œ'AM¸þW¿þ¿[šÍ©ªñ©ÿXþ?<~ø,«Ý÷ØÇÞªáö-5£æœ˜o}´}ŸwS;”ÌÐù#ÎÁ@°Šß*6E—âÄHú¾Íªª Òcø3nÒÅH3gÎä‹_|¸±Yäû½‘ô}kÖ¬Ñ H†)¿Ï™À•ûfx2òhû¾ÊÊJn¾ùfúön¦oïfÊ•“vãz3mkk+ —ä/))aݺu¼¼1sÄc¿'ïQQEÜÚÈ#7¤ðÈ )¼øÈ º[®få[ ™eÙ|òbã%#ùmß÷òË-”•e[ÿ¶ÇŸ&½î ³ü—j£íû6ÝS„³fhû3{ý/Å?Ú¾¯èÕ>,EÃó;Ûì›¶oÄü£íûzzT2/Rÿ'Nœ`ݺu#æmß·§§Ëõs‡åÿW¡÷##‰,ÝÐÐ ed„ï¿÷ž×E÷ÊðšÀà¯þfµ™&#C1.—+¸‹PSêšVU›ŸÏÿ›n°ù©{ÇEüæ­dú¯’~Ó6ÒoÚ†¶ðYêêˆÿ¿k­æ†[6òrF‹yÍ"¯ÝXÅÿ0¼Äž"½káwÿxon.æôïn#·íÉmûGä#sê7ßcõêÕ}ŽŒ‘âÿ‹!ÿ*™º¨ûDv>3;Z)83ô]ɯÿ¶“òò3£â7Åÿƒ±¿dIÕ÷ÿ)¿7$Ù–ëðv²Ý¿Uý3â}ñl¯Þºšøö/?þ8i76RQQZƒ»×nÇ»©Mo÷Œ¨ýü)O?Eâ¾?šÛ[[[Íÿ ñÿW~øCZ[[yoË–(þ5kƒò}ûöñÄO°§gdü‘ˆ'þ«r™@sJ@¸mj5õQ¦®$'ºIÊÊt#€4m<5šÓùo‹sçÎ1iÒ$&MšD›Œ' Ñrìuü,Åÿ±ü±Âi9ÃÆý÷ß`~Æò]gý;uÔ¿SgŠ÷ÏH¼ttK·Ó˜ö!û"3ò j~µ‰š_m2ÅûÆg$NÜxˆ;ʸñ7Ùyœ‘ר°3´"ÿ{†&Ù–¶ eƒÂ¶UÛ†îŒ<ÎÈkØZŒ RKã¤éÛ¶û…’mCù#3ò .ÕgýËkCïµxÛF“çåbÒ¤Iüü炟ÿ\°}ûŽK0F\ªãQÎ ë…æg`j¢>îºêÔ×ëË5ÏÃWÃKi©þèð÷¿Ô† ÀXÏÍèKò·mCYÿxd­ù.´<ø*¿\;ž¹=s%Þu¼Ä»Ž—ø^Ë™Š¶}yÅ›ï£xó},oV⎠±ÿË3Y‘Ë®sšï³Vd¶ðÝï~×<ÆétòÄOðä“w9_#]äñ………bE¦þ»ÀË3ãŽÍE²£m°”í.G,%cÇ-žlÁ~ð¡ êÏTÝüSü¯ –òƒü@„ÒKâ'Gå£ –ê&#¸ÙÙÙ"£# º‘åbþ­¡_¡ÚCF† ÀwÞÉwÞÉÓO?m éÇŠ¯ÿK™ÇšEUAÇ|’ª=BQ±C-¦Ri¤óõN&ÿl2Y¿{•¬¬¶fõð~VVTkNeK•J#ÞMídìè¤ùórŸœMRµÇLcœs{{»9Ÿ¨¤¤DK{{;^¯×4¾·Ùl822HVŽ%+dddDg¬´!þohhF+þ|þ×±QU©­¯ç¯ªª˜üUU·J°¢´”ªj.Ʊ#¤‘.&þŸ.…Åÿ¯ øMN.íÜrý ~’>æµÀ }[,·PU•ŸJ®ªª´_QL€_¡›ædï®{™yBpäÈzÎÍ0Åÿž[ô¹ Ç›~Æ‘#GFXü?#ò³â^“ÊÊJ»\!þïééa¬c²Ð»¼aÏã³~®îï½øsã³æŸÀ&0 L`˜À&0 üßÐÌéZÈRQqÑ@@qôûñx܃AÜ'ÝœßÕIÛ‡m¤LIaÑÍ‹˜z{WÜ>•©Ës°O²qæè9Þ¤·©›Ž³¨¢‡’°“J"ÝtD›$!]q%À‚@ ÀÀÀ@ÀáÙívRSSIOO'//óçÏÓßß$IƒA>ŒÅbaÆŒL›6ŒŒ 222°Ùl}eYÆf³™yóCœ*%I"==I’LÁ¾!¾4–@ @VV³fÍâꫯfÁ‚Ì›7éÓ§ãp8p»Ý¦hÓáp@ 0ó”e™ôôtc"ªù³†×%áuKø}ÞA Ï€„ßœ=ÓN^^sì /LÂÕk%YñÓ›ÙÊÖÿŽÏëãÚéK¸»ôn+ø.× çÎC]ÀlO$:öDÝÀÝ'ÑuV¦ëLÄdXohq£+õzÁ®’4ÐÝÛܤ6æå¥lMÆïösìT¦æV®(¸‚ò²r::zpžÄô³`Ödf¦téá~=è.ÂfZÄb4Bo'’§‹€OcÀ/sæŒFÑlÈ«°°Ø™’›Ïä9œóœådÏ$G2IÊd®. P^,#'¦°¯!ZSÁéYéäΘÆ`ª^żr)WH= Ý^ À`ÄûÉ õ5t6ü®®zÈv˜—IPÊÓ±˜#oÀé¦p$:(Yp5•w]Ãü«Vk6[É…›®)aÅí+èèÖøý³NÚÞéEvÉ$:ÒIœ1Ÿ´y×aq\Aviééy¸Óç21?ò>¬Bàr¹Lã ¯×k GÓÒÒÈÉÉÁçóqæÌ\.!!¤ñ¿ªª\¸póçÏc·ÛM£ ·Û¦ix<"9"ÛŸø­KÜ.zÝôóáûÄŽPm-|@R ‹ÅBÿ§~:Þuጺu±¯¯e ! >Jiçˆ#j"Ä$Ífãu ?v_k@#`³ É2š&pyÜXÞ;ŒôÊëœøè#].²&OÆrõÒ®_Bpù œŸ=gª…&ï9è?‹ð»ÐßÃÊØ% o?èâÞÕyW§D·*ÑÒ÷h¸Á’ ‹þåP°×ÉEóÉ+.¥ñÄIzZê t „þc¸$IX-IÖˆ8 ´äè H²AŽ"è„޾ð»H =JöGÆR(½ÇëáÓVê;ëhíjÁb³2sÚ,JÒJÉpg"¹$&¹³XYFa^š$hî8Áûé xš@ ]89Äu<’ øäc81_E– öž£ãÜi$I"7oŽTkR((;@À‹Ëå"1’' ]´œDöEäLÉdNÚÆ¹sÝh‡;øà‹¸ÿ‚Á`n (KJJ2ûþÜÜ\/^Œ$I¼øâ‹;vŒäädRSS±Ûí¦@[’$³ßONNFQΟ?ÏÁƒùÜç>Çõ×_ÅbA’$((((Ó4-×à÷å/º59σb”œHo¯}s` ß4‚)ZP¢•·‘ãm\± × ›wjßæÔÇ-¸Ü [–9“˜NgbÛTSÒ ñ;ÈéæïÊV«Õ4©1`Í x¸páÇçí·ßæ•W^áü#§OŸŽrbNJJ2cš¦áõz±ÛíQ"2ßÓ”Ïa ª šÕfÑ4ÙüCÿ_úº$Àçòàq»@ è‹–þIëY„ä¤ÈJßCn6¿žABXÁï‚ &'Ca*~šDó)~¿ÆâžPÝÈÏ·09{2þ€l^@Ù ²Á xû@Ê@aòƒAs¬UŽaÿ   £†Y³fÅM{ÝdYF–å¡Âà`p9z»ˆ>?ú£ŽMMM%!!k¯½–ÔÐt±ÈÈÈ`Ñ¢2!%Ū—Ÿ`C—öËÐ× o( ¼É8ÎZlè—Ú øÑ¯´è ÒDÔ®n ví¡ÉYϬٳIøür¤´4zûû™ÜÓËð)‚& '”åmå}8qÞÖ¬^,gõê@Â#ÉØÜàа ߈ü±—SG›ñz½È²LÁµúdØ€¤}rùe3Ð4sGOck 9}="©þ4ÎÙºiµGˆ™$@–¤ÚB×)ˆÕâ!¨¹HHîäšk )*º‚“'OQ»çc|î9!ÐD+S¦vqÃÒ ¦L™ÊáÃÇù´5 «ã*p$Fñ#À’ÔObV‰Y=q¯ápˆ'äï±É\bÓ7ü‚þCS¤¿·W2—ØtãxBþ›Þl3—ØtItvvºPwÛ¶mŸ©3÷믿.ÕÕÕI³fÍ" ÒÜÜ<îâø/ùËâã?0Åÿã™ÿh`ð;::¸îºëþb×Úb±ü¥¨ÿ Cüo±X˜3g¿ýío%€^xAš6m'OžüL¸-‹ù>"mmm,\¸PÜrË-–öØØØÈÂ… žð…Ï”ÏYç¤lQ9eåecÀQ"ÜÔd}Ì“‘:2S”HþH 'ûCMÍmãÅ?ZX<~‰è áCÚë)[TNßÞÍcÀÆò§&IKKSùÇ"€5p)ã„‘ðE Cëßïq‰,ØXþËicÀŽ'ÿX°ãÉ?ìåð¯\¹’æ-8kxä†Ü[œº¸&$¶ÙëŸõi¢¡IÉ„P³¥š ;›/)ü½?èQ–ÌÃñn¯ ×ÕHù €H¡ÖÊ•+Ùµk/>rWdŸŸoöCµµµQŸTU2ýkùuNvn\ÁÎ+xä†TU¥´´”¢"}B®1á4vâiss³9ñïrø Š+28\çäÁª2BAM3šXSg=¬ÝŽ…¿¥¥EúÁï3øÞ=ìܸ‚O^z„ººlÖ®…²²l“'òÓäwvPU¾WÇZþo}ë[Qí¯¬¼žšªRœ¡ÛËgEŠ´@7I‰ÔîWû¿Fé_ÉXôË?lû6ƒããϪ*›R'd^¢þ»\Qÿí[jxmëO±\?÷âå?p”Ûnøß#æ/,,Í;£oÍ;[L󉌌Œ1õ}‘ãEã2nÚe.úÖKñÃØú¾X~#Ú½a.‰ŒŒŒ¨±Y$ooï¨û¾Èñblù¯Ü7‹‘´=êõŠ1õ}‘ãÅ)7RQQaò744\’¸1ÛHÆ~{6]IYéðô‚µÌúêPväØÌ¨ÿ+2ÆÔ÷EŽcëß0—‚áÛŸ¢(æõKß9^ŒwýGʿ鞢1õ}‘ãÅXþ}Óö™×$ücéû"Ç‹±üëÖ­ÿXú¾Èñb,ÿ[ÅÅ#ºÿ"aL´_¼ZÝÏÓ`Ò/Ö²I‚®UÕl’¢ÓñD®Ó¡”†€êˆû>öþ28.ÆUXX(žyæ,X€aBz_ÓUð@ÿ¸ºöð¯‹ÃçÙwïÚµkÔâÿxf………bÑ¢E<Óæ‘"н¨<¾YÀå"Rü_^ZJëñøbµÝ…Ôv²"³…™-C žøñ*@7xê)eÄm/RüŸôPÙ% !$Ô1 ¨>ú……r¯mß°üƳ¹±±QRN…¾ã64™¼I•ñí^ª>€{íö¨c#Ÿ÷ÿ·xGl`ð§<ýÒsÏé*©ÖÖV³Ÿ-,,ä½-[ذ};ûöí‹:¶°°Ðü???€÷¶laOþ;ËHŒã‰ÿ“@²SÓ/W•¢ÕÔ£ÕHº)@UiÈ@GâO%=mD$d¹ªtˆÀÕS GmŠñ—D¤ÿܹsôööšcŒH#ÍxF$'±}ÜxGFUUUJz^ŽZ/ûà]¿³ÑŠEQDÏþ{Má<ÑÆRýž[¾á$Å}?bϦ+)îûË7œDUUÉØ÷ž~c IDAT #¯úwêèÙï°÷¢¢(¢¶Òi ÿã‰þWìÐïñöì]µ—J_%{Wíe‡}ªªJÆþHyÕüjµ•΋ò«›Ô°ð?Žè_Ù ×¹R§pß/îC-W¹ï÷¡ÔéÂfcŒ¼v‚ºix1¢(b«ªšÂÿx¢ÿûCí½ZQh¸ï>Öª* ÷ÝGµ¢ó߯ å7òÚlU/ι>Þ÷ÏŸƊPl!¢¹¹™ |PbÑ¢r.W¼9"û!£ŸÅýnô9ëC×ôÝÕúbþ |Û£oW—ÀW¾-ü/(Š"Š7ëϯ•dó`è«YÎW«ù§ªÈ8*x ºªÛ(¨é0ÇÞUåNö®ÚËòfeXñ$Œïo/oÌdÊ–K𾕕•±k×.6oÞÌO<Óé¤>&*»³Ó8’#^ ñÿ¡C‡¢>3§6 €Ì©ÍbóæÍlݺ•C‡qèþöÍøëÖ­lÞ¼92}ÜüFj` =VF~è D+‡èÌ®£3´s†¬Žrž}öYž}öY*++ÇÝÞ€!úwÿ)j1;Ôb¶lÙbîOØkš½ð÷ix7µÓù`'wÞFgg÷wf° ³Ó40ò«9•-}ý_tóçOßÔEÑÆzII‰hmm¥«« ›ÍFjj*>Ÿöövs‰œSfÀï÷¦àßï÷ã÷û™1c†¹¦ø´õ1œðÿ¯ªªèx®†Žçjð-,¥6¦íÁ€y¡Å@¬ðÿ5ææFÍ_ªíÔEÿösçq}©Õ§€D–W< K¼÷+† Àî’v—”ð@I Ÿ–”ðˆª.òìH®*À3 çç¹ÅNâ>Ž7ý €Ç{ÌL7’ïIìÞ½›Ý»wsøðas©¬¬ëÖ­ãÔ©SCÒÇÛ»Íÿ_Îy;vì¢mèR&—‹ã••ÍÿR&˜À&0 L`˜À&0 „‡âgí|L?^4|H¡¦ÄAÓ¿[jÁFÞ3^Îv¾CÅMÌ»v@€Sͧh|« ÇÉTú»pknd‘°âÆŸ‰ØðáçŽPÆç~ ¼bø_Bk?~¿!„)šOOO7Åÿn·¯×‹Çã¡¿¿Ÿ””}ôW_}5ÙÙÙx<šššHMM¥¿¿ßöY,4M£§§‡ÃaµX,_þâ¯e™ääd]ÈkµšÑ¢B{õZ¿ßÝn7£«÷õõ¡ª*§OŸ6̰Ùl$%%!Ë2>Ÿ/ÊÀà <Ÿ‰UÞ£ÀbèT!4Ú­m´ÒÄLy:åÅ‹8³ç4M^7Òì~¬ N^øˆÿhª¡Ü{ WÍšKrR:-Z} $Õ®üàê—ð JøÜjë°°+!ßTtÕž7ô $3@E†Ÿ.5O.Xz‚S ˜c=LƒlÅëñâHtlÓHBÕƒ‹ˆE#þO óO^ºxO×Áwð7¦Ï N§P˜œLjš Ér–)“eúºÓxçÄÚ>È%û&+)V+WÏ]Àô¹Shê;‡-¯˜ Z¿%'•¢Eçñµu`O¹’íà: ®Spò-Aý4è›æwy®Û£¹‰5/1ÐËù .’®˜‰oÀAÓÉ}¨ÿñ·ýï$fää‘È]KzO*¹³’XÜUƤ…‰´žêagõ{|Å ³¹ l$¦¡Ù°œ$ž„VœIÏá|¤Ò®[™^ûû?…ê*4MÃår¡i>Ÿ¿ßO?iiidff¢ª*}}}hš6lÈ@ `Þ6›éÓ§£ª*ýýýø|>‚Á É!˲Ùþ$ØÓÒK ‘´ä,È—qªÑ×êÅbq`Ÿ£Aj °'&è"V ú›}X$²¯MÆ’ ß7t±'€¤‚f‘–$èbk)¬…¦Pù¥¿aò„$H’$á³[A‚€Õ‚dµ $]Àl»Ð…$·³‹„?æÝ‚iÌ;—´I“Ð22Èœ>¤Ùn, qô,Á{VÉ®È*†Žþø@F¦ØóÉ)Y×ÈÖ$°„¼Z 7Èô¢ù(S 8¢žàù„I ÉsVï#4?I–ÐäCU ¸öá QÿMo¶ñæMÓÂ"ÿ‡C žI÷lo><-Ê `ù›m¶Év†@QQQ”é³D[¨ (ŠBmmí¸–µ'4‰ò/-þx饗¤eË–‰îînúûû™?¾°X,$&&ÒÝÝý™óω£G²téR‘™™Éï~÷»ÿ19ÿ'ÃÿÛívêêê¤Øè¯½öštÍ5×—ËÅ5×\#Þ}÷Ýq¿.v»·ß~[¸õÖ[EGG‡ùÝêìٳ̟?_¤¦¦’™™‰¢(¼ð ŸIÛƒœ9s†ùóç »ÝΔ)SøÃþ0n\ÒS ¨¦¬¼Ìÿ½þ™Üh;a~šhh¢úè|û€×®êù@¿ ÞýyéêQóCÄ “‹ð¾_UÅjjÆ•ßÿÚÚZV¬Xa~PU•eË–ÑÒÒ2„ (aÎŒ«9XwqQ|H¨&^yå Î‡222èéé1? 477ÓÕÕÅç?ÿù¸å°HÉ£.¿!€5&ðB¿Ƨg=Ô¼WMý/ôú_·n?ùÉOøýï¢(B“zã°]š_u˜g=”•†?M~gÕÕz”¦ØòFôËoˆÀ kk+ùùùæ§²*À κ¡ü—Óþ ˜!ð®ý›!í1 e|ùuX‡)ð®þ»”¬Õ«y<ù ˜!ð¶üŽò¥ïýhÌü‘‚X§snBP^‡CâS„£ ] n]ŒvJfðí^Ü[œ89Máé% | þ#ÏéíΜÿ§kéûÎwLþ´)Ia#gÝèø#)---Raa¡èÛ»Ù<§³wÈÄE£ï3İТÐÒÒBooï¨ùAŸ¹bÃN±éž"³ eåeìÙ£s777G¥7ú>C [TTdö“κ¦Qóç°¡Y›ŠT64CYù êêê9\ç4'EתyÞºÖìû¡Ç-+…ú_Ôp¸Î‰„¿’Ù÷pøHxFy]]6N§>¹»¦ª«Â÷ž³ÊËu‘l}}¨ŸCýÛþ©§¬¼^ï߀2çüvþU³ïkmm%ÇÎ]üZV^³Žñãï®çýýš¡v}†DÝ@cÌý–"˜Ñ¢÷“Îæq,]§ª²éÕÿÏ×JrP?ê±ß¢ò2óå“!ÀÞ°sªªJ³¾Z,.v†ñA¤iÀhû>§³ƒ21ºö÷Úùpûƒ6®0 ZFÝ÷•UAM(ýXÚ4?£îû‚Íàdì÷_,ÿhû¾ngβñãmßn´È‰øœæ:æˆá÷]F*¿ÁU¬ˆ×à‹·íRÇŽ'bËžô|ôX0Þyކøßò÷ì¿7j=2ïåN†ïÍÐö €0Ž¢òª§î¢ü†øßò×V:£Ö#ùw(;âò¯Ø¡ßµ_ E7òúšn.€ý"'ÿB~u“½ÙꔸüʆÐuØFæµó¢Å7Åÿ†«ªF­GòW+ñùïmßú®™×þ‹Óic±í|É’%&«¯¯§´Tø;NÊÊÊxâ‰'†äk04ÿBbÑ}ïódn¯§¢¢”ÚM÷PQQ쨧ûL‘”9µYhƒ¥¬_¿žûï¿?긊Šð·Ðõë׳y³nÐ}¦ˆÌ©ÍCòÓK/Z'ÙÙÙ"£#3j[;zÀ¢õ~‹gŸ}–ŽŽ‰ì:ó>êèèsÛKªöˆ¤ÏE[RÊU7GLØ€)ü7î¯õë×°yóf*•FjÖ&êœÕÝ4 ´žy¬Y,XRÊûYY,è ›-ÖœÊ6ïýÈ} RII‰ðù|Q¿£G ÿ ‘¿Íf‹úŒÿ¦èÿrŒ Zü_[_Ï­¡Ü:ž«á5·Júbˆÿ SÀܪòdc–8HpZD þo•ôOÚÛyøI–¾mElì„—¾ò3ÝŠ,¨íDai,ð¤žWÔ~Ðû¶S§N €*Uåk¡9Ù_p\UÙ¯(,Uö?ú(ÿôOÿıþg º¿/wÀÝñÍ™EKCϤÇCÛ–Žh¼t±ñäHǤ#CĹèó›228|ø0§N¢  À4ˆ<ÆØºø?2}LžcÆO~òŽ;Æœ9s††Q@oo/~¿¯×Kss3V«•iÓ¦QPP€ßï'!!Á40¬jÏŸ?oˆ+ïŠàO=B¯ÕjÅn·›SÀ<6‹…þþ~>ýôSŽ;†×ëÅáp˜y$''#˲yœá9"rd’ñ«%ƒ}º0_ ‚”j‚€ÍÑÆ:Nœø„G ·\ÿE2¹\hIb Û‚ÅàLໃàß?~–Ú=¯cµ ,V°XIvî÷€*Ñß-ãê“ì“p÷Ká0Ué,Á$ k&SÐÅú–P ‘ÀŸ9—H!è êáÊÝP÷N»?²°èÑè?:ÕO«¦Þx¼¡%ÊËZ¬€ŒÉºö%îÁ~gw­BÑM ˆ,hwAæ$ys’i:Ó‚°hd^Å'ïDïY‡C!AÉ`_]>uAÎÔ Òr¢…+2$¾Phãó96nO†+sÀ›y%àÈѰƒ¸ôšüÒdû–Pøh;é2Šld®œOâ¼åô÷äð_¿:DÓ…óx$ŠtÊo,Ç1ÕBja&}Ýüæ…zÒ®-gÁÚŤ~¥˜¼¤—d1yA)Ù,©\!“yÇf^Ÿ‚_„Ëo´MÓðûýx<<Š¢œœLkk+½½½qEÁ‘0ÄIS§NÅjµ’””„Ûífpp·Ûm UbÛŸ&XÒp&œHôb)ì'saSæNÂf±Ó{ʃ¿1Ü2Hà’{±X-äææbM´ÑÛè£ëˆ¡ ýmI¤€°ëýJHü‰¥-¢ü’4YK›†[; h Ö@K@Óé1¯²iiØRSÁåæê†°þþþtàOx}>’’’ÈÌÌÄ’–Ê VÄbNEóðáI™†¤Éa~–\H“½à ýÖ㱦‘?ïZŠ®Z€Ë㥯«;>3â½Ø…@ 0¬-1TvMÀ€OBPûÃå×`ÉѸGšç‡ßî§M>MC[=ç/œ'ÑžÄÜÜ«¹¡à&®Ê™M¢=‘nµ‹ãg?¦S\ h ·/zp.ðÕ€lÂü]í,‰üaV’@–Áãê¡óüYü~?yW\I’#Ù)Ó %d›0ÏÏ–“f¤2{Él2§'á–»é¼Ðˆpub#È üp¿Ô;Õþ¯ËÉÉI×4””²²²ÈÎΦ  €»îº‹²²2Þyçžxâ Ž?ŽÇã1ûQI’ÈÊÊ23„ìG Ðø5 ¾ ‹-›Í¦çárÑ¡ƒž£RWû6Ûwìã·Û^eßÞ}¼õÚ[añ?à•$ºì6ú­4‚ìEˆ Èì2RÂ÷#Ê¿Än_I’°X, ðñÇóÆo°uëV^yå<ÈñãÇ9sæ ]]]¦¹‡,ËL:•Å‹sçwrÇw0oÞ<=²U„˜Ý¨7«Õîÿ©²Ö†Ýߥßj’@X‚h!3)ô7R„~³Ð!d R$$˜Phá0º‚T>•Áê4d°%5 X$‚"„ I’øà :†$I(J&}}VÝ,šïÂÑÙgCøAòƒ¤A‚›ç§‚"Ãø.‰í[cŸ÷fÏžÍW\ABB’$!I‰‰‰Ìž=›þþþøõaìa&Ùÿ•qâ408ˆ~ÇF#ý·¿åÄo~Ãàà Y‹#ÿøÇ`³a±X¨\½ë¦Md–—ÓÛÛË©¿%íõZô»^ -@P'Îèœ!$Á; mÀi èlèì\df`! Ð\EzA>ص‹ßþþ÷H™ÙÙ¤~áfN]-“˜•D$Tt3˜$ô!€2%¢ÿˆ%¶pt¿$30L„m‹ ßêà™ó!˜uí\R–å’“›C›JÏ[mÈîèk—¤Yhhú­^4]w?K|r8b›Eö“`3Ì‚Å9’SOpÛm¥äædqòä)~ý›·±Ê×#“À…ÆÇLš|ŽE‹®ÆëõqüãVdK6ÈÉXRÝH ú³YJÑûWÿ™IKzì_2?%vävæWã¦+z{%óÓXb÷Gnïí“ã¦+nz³Íü4–Øý‘Ûoz6~ºÏ×\s˜>}:Û·oÿÌ„»ë®»ÄÂ… Åàà ìß¿Ü9÷îÝ+åççÿÅÅÿöíÛ'c<3ƒÁ ƒƒƒ—"b ¡ÅüùóÅâÅ‹Åm·Ý&¾þõ¯_öäª …!þONN¦®®nØv8s¦þZÁårqóÍ7¦×âµ×^“êêꤙ3g’œU÷÷÷ÓÚÚÊûï¿ÏÂ… ÇýfΜÉÔ©SÍöïóùhmmeþüùâüùóãÆÓØØ(mØÙl qLXD$ºXJ¤¬¬¼Œª‡ÖòÈ )|òÒ#üêo—"Évþþöé\W:ï’õ˺èèpÇO×FñÇÀŽ7¿!슂]L6ü&¿ÑßD Áâ‰À>ÿùÏ£ªªÉÿÊ+¯˜ü}}}üýíÓG1"¶ü†ÖY¯ `(,D `ËÊËøä¥G¸ÿþûùä¥GØýäÝH²Ö-¿!ìr:;¨© óAx¡.ÓÓFÖÿ‹Ü@aa¡‚CÇÖ#å7„]eUðP…î>dˆÀÚ nÕÏ£jªC"°qn†°+ج‹À`èý)o~CØÕíìàçU:lýë"0Á©ªìqç7„]ÁG© ™{ )„l,ü!A¬)B2ÌG̈˜¡è–‘¢šØu÷'I•Iü=¿‰Ì¸ßŒ>ŽˆõØè×—#>7Îåž'k)+/#íF}ò©õ1VÔ¹ÞÛÛKzzú˜ùUU•ž¬í¡lQ¹Az÷îÝfì¸ËD亪GKºìòÔnÒCnÜ©—ÛhïÕ­JWûp“Eåc»þŒº_´ðù%6øtžP暚艞åUáõººlÊË;Ƶý­ )Œ(ØN¨°y®4¤ïÛºÿGZ;7®@Pú¿gÓäßR²\¬ï3Æ„Fß·{÷îQñGBQqèÐ!fì¥oïæõ}ƘÐèûššš¨¨¨"þŽï…uK–v?ywÔ˜ ôþl´c¿Ÿ×8qÖ9£L`ŒóN„*½Qâ£þGÒ÷æFß·c‡~ý×>W/´ýþÝmqÛßHú>Ó Ô÷edŒ¼ý]ªý¤ï3ÌŒ¾OÙ9ºö1þ‘ô}†9€Ñ÷-o¿ò¤ï3ÌŒ¾ÏûÚ/Ç|ÿxþߢŸñªªJëÙÿ?¿–®Uºø}Œø?Þñ—‚ql~ê^zzTþúÿ,Ñ÷$à  :Bèb˜ üõÿYLOÊæ§îºã¡°°P¬_¿~X¢¢"vuþ€ºéáÇquíà†[6R]­®\¹rDeŽ„Ñ CüÙß>|±büL8ë¡àË?àùçŸ5?èuPXX(fv´Òz\¦õ¸Ì¯_Z›ï+fåÊ•Ôv2³£•µUkxâÇ«ÌýOüx•¹¬­Z3äøKñ·´ú€¹©úèáeë¨~j0a´—@ÜsY¹r%QâÿsÞJ³ûÉ»xêþø}X$ÿîÝ»immeß¾}qù#Åÿ§üK\þÖ-¿\Uw»V£›„|«J£ÒjNÉúë¦Îð2jäÈÛ¶=MäblM»çŸ1tûåábc•aÄuc2i„¢(ŠØ¿?û÷ï7ûAEQĺuëX·n]\ŽØ(·ãõbýç¥úÖ‹AQѳÿ^–o8IÆÒíf^†xßÈ?_¼íÆÿ±y-ßp’žý÷y¦(Š"j+ì°ï`ÅŽ2óC¼?VþؼvØwP[éŒË¯nRQê” ŠyŒ!Þ+l^J‚ºih´\EQÄVU¥ZQ¸_ s¿ryü±y-¡UI IDATU+ [/É92xi<È’%KâŠý ,Y²Ä G–o<Ë—/“&Màïþî$‡^ÇáŸ×ÑÕÕŃJüð‡W²bÅr–/_.–/_þ™ôEË–-£»»›ùóçpå•W޹ϪªJ;•°ˆÿÝÕp|Žþùîj¸æyøjbø7‰y@_®:¦Ðî)RYÞ¬ŒYü­÷ÝÀ+?*ƒGÉ{ö?{¶Ú\ª÷;)½_ÿ¢råólii‘6Õ²©¶ÚîBó{èÂÿÚîÂ(#§úúzêCÑÖÏ´úˆìÆq€™_m·Î±©6:?EQ„ú͇Éܾm°Ô|çfÀÿ×nº‡Í›7³uëV:Ä¡Cú7Oãÿ­[·²yófj7݃6XJæÔhßC‡¡ –";êG4®¶PD.SÍõÊG+¢L…:::$c¹T^ƒ{m¢¤-)¥§V¥²²’ÊÊJÖ¯_ÏC=ÄW¾ò6oÞl¦ü?òxCüÐ=§HònjgAg'•Jãô :;ñóFÔ¶K‰õyÙÆÿ‘ë‘ø,Äÿö#õQB|SÜÏPñÿMû"d.0]‚GPæÈ¾âWF$]¸_¥ªT©*””ðåÇå±ÇàÔ3?"¹ª^îàxÓÏxì±ÇxúiÝd©ªò8añÿ?Œ¨ô9¢­æûÄgBŽx³~;‘Kü1i´vJäg ›Îxf.Z´ˆE‹QPP€abgüþi,ƾÈßE#Ó_TU•ž{î9Ž9±cÇÌ}Š¢ˆ5kÖðÿ±÷æáqTg¾ÿ§ª7íêÖêE¶Ôò¾àM’61Æ ‹I$¶ !ÉKÀI†I{r‡2™ÉcÇaÈä&€¹3 Ù„ÅØxÁ6ÄZ¼ï¶Zò"Yk·ÖÞëüþ¨®ênm–,93÷ŽÞçÑÓ¥ZÎ[uêÔ[§ªÎçû®[§>Û-]º”uëÖqòäI>øàƒAÅ—Áø_’¬öAê?†Ó……Qþ÷¶¹ØÛ¦Þ›‚9Eìmsqº°-ƒècŒÚ¨Ú¨Ú¨Ú¨Ú¨Ú¨Úÿ,3j A‚ø¢¸í¤>6ðã¥AÔb訣û´‹ñ¥v‚-]u˜„™4ÓX“}¤ß’†b¸z …®³~…,Òpáî‘ß–D-K®ÉF|>ŸžÍøòå˸Ýn, qqqz6tmàÑhäêÕ«Œ3†ÜÜ\ââ⨮®F¡g=¶X,‘/®éÃ$IÒ3õFŠD.7›ÍtvvrñâEŽ=Š‚)S¦ËñãÇ1™L˜L¦¨2ú+Àh%H²„¢$ ,ñ:c®òéÅ=$%'3qbcYÇk¯½AmîÌ©Lqü1-´]\Œ‰cš4 Y“E`¶„]2No·ÊRº;%D¤ºƒŒÊj䦕ҋEe½Pqö,Í]Ù¹ÙÔ_­ÇðáltÒÖ,c²˜˜3oõõ\©¿Ê¸xfÏ!U9ª¾þ’C…,ˆR—ðû Èðû ûB1_´tëŒÄ²y)̙壮e 6 'áè¥ܶƌ©=Àá=çqìKrbû“8yew$==…ËAi„ÜL°Ýgj!РáHƘð@p“'’fc0Aw} ?.#aú-d޽ yaMxãµcÜ»z³Û“±M#¤.„c»ºIÌío5 ç’RR¨;։ɪ ´w'Å7.‘òÃb¯ê>­åJÐÝg[Р嘘&Mš„$I477ÓÚÚÚg6jýÊ2™™™¤¥¥a2™èèè ¹¹!qqqþ)žÐe´xðŽ­ÃÐ)E`œ)HŒKçÊÉFÚ.x°b0ÍtãIv—‹ÏØÅø[c¹òq'Î^d‹LÚüبâ¥6p[À§žöåd£ø{‹$ã£Iĸ}Ävyð$Äô½»²Œ0™ð[“1) †¶v ŽœDºÚBë²%X­V,j¯âMÌÄD¤ ¤ÍÅ/™°D͆.Í€:/«@;€-%Ì1ã±X,Œ3– '÷ øº£öÉðÓØÔÔ'&íöB›[bl’*0g¢àrSôša BdÔµ_áxÍQÌ3éiéÄZT𨳻“Ó §¨•«ñÆx¢DbP3zÇ jq,FÕúÐ,ÐÇ»| 0‚45^!%} © ãI tb2ÜC&¨@L|ã&ŒÃï÷rµ¾†n×,R èìTãÀŒ\8q>js›Ñh$ b6›INN&!!EQ˜:u*÷ß?uuu¼÷Þ{(ŠÂÆ3fŒºŸ’ĬY³p»Ý¼÷Þ{üæ7¿¡¸¸˜¯ýë˜L&ÚÛÛéîîÆãñ`±Xðù|x<EÑÓËxˆñ Ÿb ‘¡x(éYÛ5k ÆÐÜC »$‰6g[”ð…×`¤5>ž.³UtÂ’”v$)! ’Ú*ÂyŸp:ìÝ»—úúz@E W¸Ñhdܸq$%%‘™™Iff&ÉÉÉ ]dFŸBè¢4°ÞÞÞŽÅÙ‚ÈÂ@Áoñˆõ`êŽe°&0ƒlï½@ yÕiÏdˆi¤g†{‚€$Tø?> ÇA{„*I»—œìËÔ]‰Çç“ñxÌx½j8ª$$ta©wà ÁØÐ5æ80{Á„‹À<žþLë/ôŒµ^¯—yóæ‘­×%¨°ß§Ÿ~JVV7ß|3'Nô–òÐÊÔÌb±ôŒÅñ(ˆZúÜ/S[3Þ|ãûïsòß`Êҥ̘5 I’HIOÇívSûá‡LýÃHî}³P‘{7ªôÊÍ@(Ÿª>CæGÁ÷ÖÐ<3j¦#3V$”âG L›Â¯¾ÊW*Žb‚²æfîà’32«îÂ!ã÷Î$ œ%@ †zÆÛ€dT¡H Jê S¯$Ñh4« óviy¯–„‡INN&1!‘ήN>Ý»—Ü®Þ Ø]²§ÑMÀ§ŠÜÚ1…Kt&Zª+ƒÁKB\#þ@dÛWPD= ‰3¹å–E¼ÿÁG8µüñûX½fÿÛºÀØq3¸é¦)ìÞõñ†æåÎ$ØÄRÈàiˆCøLý_ä~_(¶¬¬¨eÎPÖ÷kίŽ.Kš7x5Ç–˜Ãjb|ôÂŽ®AÎW¢Êzi¯oÐþw.Ë û¢ÇÂú™?½ÇüÓÑe-ÿäòˆƒìË–-x½^rrrxçwFÜGO»ýöÛŹsç0 Ì;÷†eF4»øHضmÛ$€¥K—Šþ„—n„iq{úôé´··ãt:q»Ý¸Ýn.]ºÄ¥K—ÈÏÏ6›ôôt^ýõÿVõ6\[¼x±èîîfÚ´iüáø«›ÿ'%%±oß¾}¾úê«ÒªU«ÄåË—¹zõ*«W¯Z[¹Qöæ›oJk×®.\ÀçóéËû|Í0"þzè!QWWGK‹Úoi —Ë%mØZ-¬Üƒ+çÏ*vø<ÅàlYÑ!°y“u¬²âïb+}±„ù `Љ%=m MçûsÙ§¬V¶¸\zæÑwKK¹íûß××ÓØH8, n€ª),,ĪêäðáÃ:üaÌjµêXeÅÎõÇwè— t0 ÂXnn®¾I·ŸÊ][€ ÎݾD9III<ôüAH û·²iKÏú^òx1‘MyëÂÙà5¶"Tÿ;6¯‰:þ¿¹ÿ[aóf3yy*ì¥B`úz–——¡C`/…ÏeE%[7® ¢âe¶n\ÁšM;•2ìßÊŽÍ.*KU€ÊJ ¢Û•·ORç—†!0‰óŸˆ•Ž . ¹ª@×oˆ’0Õ 0Cn«üÏ‘ó¿8´ÆLJž {©X¸þ5,%/C‡À¶àõ·uq?ÙŒáÖY÷àÏ{þƒõ+n××Ó 0í³t¬¢¨äºükíbͦBËre!V= IÏÀù÷û¼Lxng‡ä_/5ÑÍ"cà–©Sq 2Ûè@f2™øús{ðoÚÁÊ•+0ô¡‰žhær¹Xºt)‡ƒ?ýéOÃÈýÚ¦Ðñï‰Z¦°šè‰fÕÕÕ´´´°råJvïÞ}ÝþuµDü)@a€Ga ­äñ⨠ث7µ{зÃá¾þÜÙüì›hwv „-Žà KK¡²²‘’uðùƒNÅ庾ó­ö§°«2à Båe5.R©  <·§sXâù×@Øü„©QóƒÕô#U¥ó[“oØñk ìºüpñ+ µ²‘yÅr‘`Ú´Wÿ»ÅŸ5?¸ï÷þ¯ŸñØLN›6èú×Ú{E…ÖÞ¨÷Ìò ÖlŠ¾Æµþß.$TØó&SòÚ"þ~ŸWÍV<„s?ÿƒ‰}ë­×\hðyþµþ_ÏØgµZ™7o‡ƒ—_~yHþµã?×® ÈØö§õÿ¨ŒŽ}•¥j¢çÒ’¡ Ÿ Å¿Öÿëû ¹ÿ 5öUß“4äö?XÿZÿo]qtìKÉË`b~r‘ÀfÚõ7¤ãõÿ¶Üö­^óï¹í[<6ÓÄr›mD€«Gÿ¶„ußî=ÿ –°$Ù ß{¬V6~»úaýÛ~õ¿ç Ùïºo—Hª_µÑ×`þM" þGNGšËå’Ö}[;†~ˆù¦ Êi¦=Sjf³Ù 6ïP¿õ„îU¢ âR—ps ˜ÿe[Î]cÔsV¤}ë×%t·üq©%Üv—:¯»e'ååån§e™µÙlÜv×F]˜àZ¦¶?•¶øËÞ|½V_~Д=êEÿ³§+o\Çÿá×@ü׬¤ôejOËœËȦ¿zèéÿ‹x ´·Z¿ÛÓ½j¡÷-%'¡x–šXƒþ5ÓÞËØíÏöë0ÙãäÈ‹êóÏÔâóØCŸü4øßjý.µu0w&)"ö%=m 0¸ç¾¾üoß¾]ì(¬ä ÇKüÓ?…1& þß¾};ÛÙÎŽÂJ~ºûùÂã_· â—‹B erQ ‚ýJ¥úžœ¼)€ókó®‡ÇQÁè}]þþ÷?gÇŽüú×ïé¿ðÂ3Ðð>?¼’ßýîãÐüáee…¾3ŽdÃŽ#ýÝô­oa»p½{÷²dÉî¿ÿ~Þzë-öîÝË®]»xæ™gÀSO=Åý÷ßUÖ[o½ÅóÏ??b´ÕjîGñ^qªƒ'¬o2,¬9/î_—ˆ‚mÉQû£M÷Wžë÷,gEÙЮ¶]_þû+Oƒõ{–cÝp"¬}úﯼ‡úxfû×åÿ!kßþû*/RÜ¢g9=׉´ = -Z´ˆ°ÿþ~·ô5Ôö*„úý¸  Í›Õq—ùùj`\¾|¹hk Sß±#|ï]±b¹Ø¹sçˆ\‘â)))½’®Œ¤ÐÕj[\.¦Ÿbàk¿³rÅãâõ*Xzôº'üLº`úîåôLX_meM• ¬ÃÛ'—Ë%-¯¶Š[dW\t—òÒºYü3%Œ{au»Â"S™¦ï0fßb~_IöïÀšdë Îudß`vÑ×|€mÛ¶éÓ?]†Ñ5ÁÂžÛ TVOs~ˆ­¬ŠÔÊݱy>ýÚk¯±â¡‡tèáBµÖ<5­ý¹­:½ØŠ_EëÚW°þŸö¤o‹„ÿGÒ¬V«pîpQ\Z¤ ¬_¿›Í¦ zÔÖÖâ,LÃVÖ @QN£(­ÉÐë4òwqŒ{²Z”ÎŒ^PæŠ~v˜7ožhiiÁï÷“’’ÀÅ‹£ÖÑàþóçÕ>T"# ÿ¿/à&à›EEügi)«$¸$T ^³ÊÒR&H°94.ë&yH»!Í*¨¯•):`µZÙèr±ÉjÅåÚÏëb^s¹xªžÇÅ]·NæÉ[§s×­“£ =QƵŽy‰ËÅÞ®U ðÇÄ<™ ¿}öY~<óÌ3XÞ}ËXuÕ¾à€ß¡‡ù`I¿{£Bü¿ùÍOÁëå;_â«ËÓâg¯l`Á‚¸zôIUX¶`­N¿³°°P:Ð_SSCNNN¯õZZZú\9O+«¬¬ìº÷ç©§žâí·ßàäɓ̜9Süä'?á¾ûîãùçŸ×—/]º”çŸ~ÄãDƺ"ž.-剋8]XÈô²2±Æå"#$z¡/·«ÿçÛ‹ÀY6¢û0j£6j£6j£6j£6j£6j£6jÿw›.àÄ@MîÞ…Dߨºjü4à¡[9C]³2™Hw¼—Ž/Ô²lå2li)Ô×5Ò’à" +È€mô¢¾PÒ„¼^/ñññ´´´P[[Kvv6III|ú駤¦¦’@{hÀL{{; ´¶¶b±Xðz½ÔÕÕáõzõò´ìÇÝÝÝýf÷Õ }  ì FÂÿ—.]âÈ‘#ƒAf̘ÁM7ÝĹsç0™LX­VRSSBèð¨_öe VAw;ø< €Ñ &3˜ã^j¤3¼]ñ&÷q/&æ°î‘u|²k7;œï£ÄëÅ` ¢UhÕ`ÄÄ Ìñw§„»C¢»|n £IÍîûâA%TH_B%êÿŸ7%qÜ ÷ÌídrF'ïžˉsýA¡09k w§WÑ`5±Í›Ì…š‹+´qæPY~Âưû±“'“2%ÆÃøn_Là¢+{<˜ Sý·šˆOd‚u Y•ÄÓìt`ëC\v:ʘ²ï„´i2îÕ—ZŸ›MZÂ1Î\±ÐÖ0ƒsMàn…Ø™2ã’g•9ú©êß:3Ÿ¶@ƒa1Sêhÿ|'þºÓ4ïO‚‰dã&Ú>Cëžrv¾{ˆøG,,)ÈÅ”hÀêƒñS§óíìN·¹ž8Ÿ `ñáKìDR¾þº­Nb\ÉÈÈŒ Ï".Á‚}R™9C€© ü (± ÷¹Ë¡zŠK…´iôE/¯ua”%(ì>H§4:Ô¯ÒB`ÏÍÆâ¯‚ó­=º2È©ªømàñ@Nbèܨ+jÐ\OP_?!(((`„ zŒõz½8p€îîn‚Á ¤¤¤0{ölŽ?Þg‘ñ72“4º\‡B_ý"ÍÌ^/¿ÉÉaZR’$±|Ù2„x½^dY¦ÙjåhZkÏk 2ª¨€ŒÚ³ ¼¸"|ªÐ¿Öl¨B~T¨ ‰Ì$ëþ–ÎSIøÙ/øÖ•:‚ è@%ÇeZžz’ŒÌ ”UwrÅç#£¼È@*+)ä+rXû%³ú!чD½ÑqÝôo—‚Fšâ¶¥KškÉiJïs]!A«ÁƒORϳE¹h‰È”jê²ì#)¾¾O÷V$,œ>s·ÛMB\7óçç!éQd9HŒ%¯ÏÇá£çHK¸™q)c4z0Ä´"áGe’f]¸æ1ޤE ˆÃˆ¡ˆŒ„=v·UÐÕ­O¿ôÁÈ ÔŒE ì\–%FZÀét’™™É‡~(:th$‹îeÜrË-¢¥¥…øøx>ûì³îó¿£Ýwß}zÆóôôtü~¿.w£L‹Û=?(ŠHA€††::z÷“FÒ´wß}·øàƒþ*דÁ`  ròäI¾úÕ¯Š?þñ7Ô¯ÿ}ˆõmï¿ÿ¾tóÍ7‹îîn.\øëÅÙ7ÞxCU$¡££ƒÁÀÞ½{ohý¼öÚkzù·Ür‹ÐúÎ#i½2õÀ‚MxnÏìÙÃ÷nKÐ3ÙúºÚ¯ñlw-ÿƒ`ÙÓyCü÷À:ö§?ýIqü÷À:¶{÷n=[Þ{ï½Gû®-Ȳ*þµ}Ójþ·½¢¿L¬×òß Pü¢ À>ø\(öõqüÛ7}{xþû`{ðÁ©€zþÏüá{ää«õsè·ääãtnŒë>ý÷Àªû`û;þážÿþXC`ßšÌsܘöß èØ´iáúñãï€tìÁiÓÔÃðß3K•ÛÜ/Vª"(³Îë±Pƒÿu!”Þ§fÈÖÓ¤ÀÉAà`iiTæ÷@ Ó®Q»Ý.´ØÖÖÖ†Ëåb÷îÝz,ÔàÿÈlØÃµžÇ¯Å6—ËEuu5©©©z,Ôàÿ‚‚‚¨Ld×k••·€ÊŠJ6íP:j±Mˆ]ô…b=jð¿&ö~ËŠiõÿýF«p:ÕØVQ¡B°ÅÅáX¨Áÿ¥¥álØÃµžõ¯Å¶¼ü*=ãµ 5ø¿²ŠJ«xnÚð/€žþµØvd¯B°ÚŸ ÇB þïú TU+#qùõò¯Å¶š"‚m­ ÇB þ¿X‘NkÉ©-¶}ùEUìä}ß×c¡ÿÿyÏðοž yÈÞ^&?ªߨÏÉýÚ&‡Ô+ö öû†ØôU¸m`ÿƒ}_.*b}Ùп®Ø°•›Õé¢P_&ÒdìF4ö9iņ­bÇæ—©~³:wAA~”ÿÈØŒhì³Z­bû¦ÕTTþY–tÁ¤ [CÊ‘[aS()£&Pڣ —o¸0dè%¯ _ï›i}µÈã×úu¡¾ßƾpý÷ßþ"cŸºÃýǾ [ûΊ<ÿ‘±Ž}Có>8ÿ‘±àp‰±Ø7ÿ‘±àí?ö„>|X’¤Þ œËå’–„²ïݤÀf‰ÝÞ­V«$—½³ÇÕúʼQRÁmºçúÃõ©¹èË~õ2`‡_þò—<ùä“à/ àóT5.l^³ ¸6ô5Eüåååz[XÊ ½fRt¬­¬‚ùß~-[¶PPP os=¾³§+Ôž–9hRÅ4ìv»øZŠšSwS:ÔÖ(ùzů7G  þï×BB;Vëw#ϧp¬[½ü­¨u`Žu뱿¼%J`¤àÿ^°ÛŸÀáx–’‹Ôç!´ö÷{1w&@X`¨Ï}ý™Ö65Aˆ‚‚øéOÙ¼v­îEYžØQ-Ü5TÿžïªX\Qôÿ1ÿ®Ue%J©:­þšhÀñz“7ÙU€"¡iÂTø¿'ø¯%9q:¬X±‚¼¼¼¨åg2WqÏt÷ÜsN§“'žøQDÜž@dJNNÖŸûZo8~ ”átï^:rr¸ØcYNNO=õ¬Y³†gžy†‹/êY_ÓÒÒHHH ³³“û￟çŸ~¸»3(ñƒ¾2øÆZÿz벿íúš?êÿ¿Ö¿6ÿZPþþýûôÿÇË"áÿöIóq=‚ ´~yn.ùùÑß¿vlÞI%j,úéOaíZ5[ño”‘ššJ~~¾¨¨¨6¬e‡Þ½{·ˆ-/\?s W€$Ò,€ñÕjãŠGu¹OBÕ/Áõ$äF®|@]ÿ¥*À [­VvæºX^=|A”åÕV¹ŒBŠøSW ÿ|[_Þw…ßn…GJ.óî­jR‹í)åŸ)á9 öÁ¯Ëßµú ?ùÉOøÃ¹ð¼Õ«Õû^¤@À`ÊÒLY<6ÓÄ‹k_!å µ¬pðàAÎ;Ç“O> „Áÿ×^{)S¦°páB}m™_ÅšMË£Ö‘ãÕ2×>»“—Nfõ±ªedd[cJ¿Ë ill±¾TQN£Ð€üó^fSó¿°eKXXaýúõÔÖÖöÚNÛF»ŽåUl£“¢U*ä_Z“!µÎÌÕ÷3ådµxõÓ$,Æ–æä®ˆ²4ø¿³³“ììlZZZHMMÕ—kàÿáÇ¥yóæõ7z¦ôžEÂÿøŸ>¢©N IDATYQÁŠ x¿ªŠU’ F7¾\ÊŠ ØQUűˆ=;ê³ÙpÍ‚þ7Y`(š eªh @>}¿óé)R0@ùü¯Ç0—Ë%•Z­¢Èåâw¡ãz8b8áØñ ÓŸ>È#-ä·Ï>Ëü 0þ|î8|¬VŠ\.U4€hø¿·eêµ÷Ç/a }[<êþqçKáýµÙtø¿¥«Ôxõm£67®[ °°Phà?¨NNŽÞ·ÓÚ¦6& ç²žó´² ÅPE¬V«8yò¤ÿkסÿÞ~ûí(q€ÚÚZ–.]ª¯7ÜûÕj§ y:ôÞó‡*°&Ôç~º´”E/·ñ‚£¬Ö½ŽÚ¨Ú¨Ú¨Ú¨Ú¨Ú¨ÚÿÝa =ù{ªÔkÏüÛAldÒDVÚB†”…%%Ó2/‹©­®eï®}˜âˆ=Ÿ„ðÔŒÊ!xÕ@ý`0H{{;6›3gΰÛí|éK_âØ±cÄÄÄœæ$„ àvvvRWWG{{;^¯W/s(ÖW`Y–õŒÒ—.]âèÑ£:üŸŸŸ¯«aj€©ÇãÁl6÷ ]GZRj˜™îPB²Q Áhb½Ô?ÏË-?çKÁÕ̳å·/g³€=ûwS™±áÈñ*g)P‚ðI(A°Ä‚9FÁhVç+5+8í¨I‚åÐ_,jò`§›ÇPYDÂY˜‘½>æÌžÃYÇ‚ ˜Àqµ‰OÇÏdá„Fæ.˜Åî]»©¬!)ÑÄÂqÝj£ŠC=ñ ªØ@Ä)wçd‚º;$¥X¨ÿ´“  Á)HOJⳊq8³$Rí]ãgÁ§{+¸÷æû˜¹ ‰9ÇÞ¡«û~ªk£•÷Ž%±x’Àš‘Âåf#i1`ç¶©IbÆßÈœ?ÞK ©[† oÀŒÁ³ ¥ËA[ý!<i#öB._øÊ.¦'ÃCº%S¬Lg@Ðrr?-.ˆ Îc΢ùØçgñÑ»?ÀàC×™«¸›¯›àgOÙ'xJ¯"ÝLún1þ½ÿ6!Ë2n·›ššŒF#ãÇ'!!)STèÂãñ Ë2S§NÕçuvvRSSƒ$Iú \ XH@÷é·`¹’EÀêÄÒ’•ÀŸÜ‰Ù.“œÀ…c5N˜ÈÍX3 êJÝþNâ'šÈ\ÇÕ=]4Wº‘ÍbJ‚V2‰J;”ûØIÂkFNYtÇGD D€Ö®Ìè!ŽÂ` Å˲7$%‘”žR× ’D,AŒQGR¢•k5Ü`ĉài$Œ ;vÖæÌÙsŒ±Ïdæ¬YÄÄÄ2yîD&3XI àÇçóÃõ›¯‚ÿÃ5PëA€„–™^ %‰þ°N'ñdžP-̽ÐqIø±`2 ®\©Å––IVV—«OÓÝÑAç•ðá‚2H1dfŽ¡££ƒ†ú˘ Ad9\vWD2Ï‘»)I z&]Mh% âñxðûý|å+_Á`0ð /PWWÇ/~ñ }û³gÏrï½÷òï|EQ¸|ù²i»\.:::P…ÎÎN ‰‰‰Q±Ý()BR"™p!!I"j?[%+-R€d@A •›à5iJHÆk6i'+t ¡5$wH\ Óú:Oiii|ík_ã£>¢©©IA8~ü8---Ìž=[‡úkkk©¯¯Ú>ò:?þ<_üâ™={¶.Ò§I€HH}fhODÈ &o šL‚@žžN\œ…vÓbbÛ›€#ê‘ÉsH²&qç]—™2eAïòƒ1´€$¬Ó— èn…ÆS`0©€¿¾H‚j –/wÖáQ¤¸{Î)5½|¯c“@¸€ôžG?ÊК¢(Ȳ:XÈb±0kÖ,ÆS‚¢(9r„ºº:½>%IÂãñpîÜ9nºé&fΜɩS§¢ê{  Á˜eŽÞ?÷~íkX““£Îsww76›[¿øEšgÎäDÙ»Ì|¿^^ÁƒªêãC ÀzÖ¿ˆ¬¨ÂNÔ&ÚLº¾v1ón"%&†O–ÝÊ-o¾KBW7@‚¸º«$¿ò¤<Å•ÖV:/_fZh{+j—BRB{Òyl¡_3‚1í#éÁ1Z«ÇÐoVÐËäÐ_£ÑHêÄt[«˜æßgýY fV}´AE1ÓÑ5†K;]î°˜€„ “\À'ŸœãÌ™ó(ŠÂ¢[ïcò¤T¼~m¢£< gk6•‡öáõù$É„$0f¸ÀqLÒµû…Ò<$qaË ´v^¾µŽö¿¶Žö«¯g¾›ï½¼A9ÙK{}Òcw[‘‚ = SíÿÄøèßÐü¶HN‡ þ÷÷À–rYÚ¹,KðDÄÌz¬¤ýÿDßÐüe\æ“eYzyƒv~ [½zµ8{Vš1cÆ_-Û»ö¡Ól6óÙgŸýüÀ·xñbQ]]Á``êÔ©lÛ¶MZ¾|ù5 Õü~?Co#íãòªU«D}}=‹…Ï?ÿü†›åË—‹¦&º¾rå ÷ß¿xë­·nx[HLLÔ}ž?ž{ï½W¼óÎ;7Ìo¤PQSS·Þz«Ø·oß5ýÙívNœ81hÑ€‘´ÜÜ\Ž9¢B-ûì³Ï¤üü|¡‰U´ €ÕàÅç˜*·nÅùÉf¾þÜس—ÁÂß‘6lËîÝ#î¨lOÿ›×ÌçŽÛ®k`éPXÍÿ—¾ô%ÑØØ¨ÿÏD-Š €Úgý>µ•‡ÿíúê? «ù˜öÀsÂï÷³uã L1±T–W`S³„ÉÿPØ‘nC`GÚÿPØ‘ö?Tv¤ý¸µÌœó&ûx?¿ÕBñ¬ß[²–¿ßçÕ—ÑÝñƒ¡_-îi1q!è±Q‹#iˆ1¸äädìv;»wï&;;‡Ã¡/»Q¦Å¶ÜÜ\¬V+ü1©©©,¥ds¹\äæærøðõƒw‡CÚ´#ü€¨g/•ªOÞ(ÈÏcÁ·‹(úB1åQõëR}YÚ0#b%%äåeŸßÈ‚j,.V³ÏGøôëVœ*KÕLÍEÅU¥EjýçåWé1ñFXÕ†D1saî™óv…ög`Á7epÀ5&î¹AþóIÉË §´¥´‰Ã%‚•BÙ°o”ÿU}PEPÞ}¼ˆ—Núyç_¿Ïû¯©þ¼'$Rñá ËT\«Ø±ÙEey1k6Ùq:½ú(ƒŽ}}½‡À\.× ük±/²Ÿ×3ö½[ZÚg6îk¿Ýn•¹lÚ±ØÑ§ÿû´ ÐÀ€Ç?ØØ§e謹\.éŽÛÄϾ™L^A>¶eôù¡c‘}?¸VßoèuPY^¡÷ÍÖlê»þû>þxh¾[ÿ7*ö úü6öÝ(ÿƒ}ÕC{þ¬ÿAǾ÷‡^ýY_°ÜÞ¶èç§Ó…ÍÖöÞáZ¤ÿâÐ3Ë&ÿµéb—‹’a üw8Ò+¯¼"}ôÑ(èHƒ(l6ò¡'øÿÖÁæðä“Oò“Ÿü„þð‡ÂápH‡»½\he]ϱ:‰7õzYÞ¦5jTFhhq);;[‡ÿ‡c‘ðÏeŸ¬è"'ä9¨)I#‡*jBËÎe¨¢ k6íìquÑþÇnûË[p¬»?ä¿’š’ röýB÷¯Áþ›¾ô¬°£îÂHÁÿ.—K²Ù>vû‡ú=¾zk 5%ëáçë™;ókÔÖ…×…ß x;6ncóšÜë~îô¿æãÐϯê7eòëglg»¾îв<±³Ä9bþ{šÿ ”R 9O¼–ó¹kìÇÑkýÉ›r8ŽƒãõfÛíb s£=s]½z•H(ª§8p@Ÿ^´hN§“‚K‡9?çv4·×?Éö®Ì낲"Áv—Ë%;VD~wÖ¾GÜsÏ=Q}m›¡úÓ¶[²d‰pNš„íÂ…^ÙˆA…5Ðkâĉ½ÖIHH`ëÖÁ =ög=ã©õ„ûQ+KÓ%>qBü›]½2®‚W£6ÈlOû÷ï‹-êúkóÁ_ü üQó—/_.  ?ô•——±vma蛘 tFŽÕ¼^ëÙÛ½{7sæÌÑEž‡súò·¼Ú*væªýÏ…—å> ÖpØU¡ÿm =nq¹˜~’Þi¯s_ʬe¢ðíBîˆÏ$ôÄM~ðϰ¾óD1ß~ñB‰ÿoíCœj8¶mc «øCV¯^Ý{Ù¶mlXá`ó;ökÜÛzÚc3M¼xJ½_¶®}Ida+«báBõÙJø`³Ùøè£tØÿàÁƒQÓwÞy'Nçڨ⡇ÂÛ¶®}€OÁã3íüþ:Ž}÷îÝ”••éYÅ(1€ŒŒŒ¨ëª/¡mmYiM†T”Ó(l+4ÉÊ-Z–q^{í5zè! £ÊxñÅXôôÓL\¶²f”Eê±jÒ‡V«UȪpªŽ[Z½ªh×—óʸOÔÀ~m̨6–9üôßì?f̘^ëÇÞÕæ––²Éje°¢ºš!€o†Ö3R|óU!€U’ºí¦ð·¹Áî“4G ŽJax•›P¡Wé~¬!µÜýŠfRQfƒ}ê;—ÃÇkø‡TXÑ €›PË»§—»Çâh"š€&PEæÀ¿›`á!a~ŸÛ¹\œM÷„ÿµf¦¸\úcNJ×Áÿe/.å¨BcÕŽp?6×nÇåtÒÒ¥Æû¶ÆVÚPÑ’3RHOÖ…®Ç¶oß®·»‘´íÛ·_×vÜŸMmm­þ\¬ýßßò‘2 î×ÀþÑÿ÷·|ÔFmÔFmÔFmÔFmÔFmÔFmÔF-Òz!©2}¿¯T€+™—èÓÎÄKÓ©÷UãÅM¦”MÒ˜TXégæôœ=pמN2œãéÄÍj餱¡œ$^ü}ÂW‘¦‰ÚÚÚHJJ¢­­«W¯’‘‘ÁM7Ý„Ûíf÷îÝdeeÑÜÜÌܹsiii¡®®Ž¶¶6<Oü Aöa‘€ŸÁ` ¹¹™‹/rîÜ9„Ìš5‹ à÷û‘eYãããuHDƒþ4 °/‹· ,>I–ñ{@Q$|nâ7Ç„2h'{IH–Øî,ã/o•s÷âûHê;Vñeã—¸x±¯'4ðBEQ]IMj˜,ª¸@Ð/0™Aÿ„׆JPAýPAàEÐîlç*·Ü¼„“•Uø}~,q¼/~ÅÏçÇÏsÙ•Å¥úH±–8 “U¨)… ¨"š€•I Ùùw36w )'Q÷YmMõx:¤.€’ÒI÷‰ „5JÌ™7…ÙKd nš?Ÿ>Uë®HßÍÉ6/¦´4³Lb&ÇAÃb—kàÈ»‚¤UaÿžÝÿFÎÃÅ´×Ç!ˆÇ:q,­¦ à?vç§Ÿ²½6 [º‡‡û]1­\ºègÊÄTÞ:VÇÙó^ž&VÌ™Á8c6·N_ÄØ '9~®öôyêÇÑÑVCÀÕ¢ )6N\í·=híVkCŠ¢pñâE]#66V[4@¸µµ•C‡1vìØ¨v§‰Y ¶Ý<±®Æöšß9ù<ñ– äø'PsúWÎ6‰‰±àíòg”Hšd&àVhú‹›æ 7& %Û„l›€1@ x ô*_3!˸ã{G S@! "‰@¬$©Ó²L0.V hÚ:¡i$##«Ë]‚ú¦X0õ!ïìÂë/çø•r\Æ1LqãÆGHF,‹*0€uvƒ?tØþÀ@y¾°Ä´Æ’#ObòØ)¸½"@|l“Ó¦àõy8ÜU‰Ë脘èwËVÂY·{ÏÊÌ‚šš°Bg_*Ë ù:iiª#%5…ésò9Rþ)1cÚÙ²e3öésÔvØÔ@kãEb‰±‘$HHcèn‚-‘ˆ„°X,x½^„¸ÝnpÖDwÞy'K–,á—¿ü%»ví¢»»·Ûͯ~õ+bcc©©©Á`0`±XôûGWW—^®¢(˜L&’’’ ò9`@ƒ’zg (&üŠY ‚dÙ€[Š¥]J$(©™-EˆüW[š„›šä4’PO” K Ì! ÂÐgª!„.pæÌŽ;†Ëå" R__O}}=»víbÊ”)Ì™3‡{ɄÉd"ÐÒÒÂÕ«W©¯¯§¡¡§ÓIWWñññýß‹"£$dLÞÞ×_@ò“dá‘o¸pþ;>Φ³ã6‚J›ÍÂÚ:H¶NîûÞ.{Õ?Ènlý"]}dŠKS·»Øã“PíF>ŸŠŠLæÎ¬Ç’›Z‰þ¶’ˆ*ºÐÚ0û¿GÆÝ¸¸8¦OŸÎøñãua‰3gÎàñxúܶ³³“sçÎ1oÞ<ü~?çÎ…%Ò¯!À"ÔÕ÷r%&†ÖGaÊw`6›éììÄßÔÄÅövæÌ™ƒqÕÖbNOÇfµûÈZœ¶óX˺‘½TüÞ\ý³qØYwh #êmZÓ? ýŸ˜Þ|›@Üv+Ën»3iiÜô~‡ÉÕ†E’äL¤ãÑoÐí¨ÁôÞ|©¾‘F‰¨ÒJ¨<7ý‹@Å…˜@來qJX¡€I"åËÙXbÕ˜a6›IHH`áÂ…8w^Föþ®Ö&{ñKªì‰WêÿþÆÐÙnÿVŒÒŽ»Â‰Çðûýäçå1ÞD¼ÁOPPG¼IR"AßtŽŸ8Í… e™qcÇbK@(~‚ÍÉ,N$ü`P®ñéoäLÿaèðÿHXrr¸M«ðÿ_×4ðFþFücßPÍçó1þ|‘ÍÛo¿ý?fÀÙÒ¥KEkk+qqq|þùçÒ¡C‡þªþûz–»ë®»DCC—/_ÆjµÞÐÌïšð„&”j”µk× - ý²øøø¨ÿkjj¸óÎ;ÅG}tCü~ðÁÒÝwß-®\¹@{{;7ß|³H\á¾ûî§OŸÖÛÇØ¯ìÕW_•æÌ™#´±MKIIáêÕþŸ-‡kf·?ËÕ§ÀF‚ØÃ€­A`;ìv~èpôM çIÿZÌ///gõêÕƒ‚Àzø–H‰µ´´°råÊA°#yü»£Õζ)ý°{"ÈHÿÿp›‹Æa$HÖ °?¶³m›cP¬æÿëÏíO-s³fÓŽë†"4,7×ÎÆ¶AA`#YÿfßaÇö»ÚA°#ê?­vÚ©®v €Iÿ÷Ù»l«®;Rþ{f½v¿Êzæ~±’’×Q¬ŽÍ¤q8¼{º‡à‰ó´i-¾[ZJã €ð{ žzÌkkkcÞ¼yzܹÇßSð$77—•+WRUU…Ë墼¼œ‚‚‚ñßW|è ½ªé<Õ‹½¼¢’âK(¯P³‡÷ÌÜ9ÖSð2õ8+*2(*jD›#ê¿WÖkª(-Y@Qi•*Š’§  Ü(ÿ=OŽ 0™*ŽìUˆÿ°÷Æùï™õš"„¥jŠ2˜˜ß¤¯{#ü÷ÌzýeJy÷ñ"Þ¾üb)÷Üö­ëöïr¹¤5›ìý›C‰}N§sÈÔµüGƾ§#ú{=cŸfðúò?”Ø7Tÿ‡C?öþü%ö Õ¿f.¶eú0?Xñ“­†âU;þâwöß7JìjûLý%öÁÈŸÿ¡Ä¾á(±ïFøJìªÿkYO¸ó}¡‚!ÇdØ `³XGúô¹%V«(v¹tøÂB%}¾‘€á"aí÷RèU›zýð‡?dýúõlÙ²EvôW†Õjk&¹¨¬‚­¬¬™¤ÆaMî¾þ³ž)v¸"ýÁÿů7ÃëÍ|ôoyääÃÿpˆ†ìb2)pÿ‡b=áÿˆr…ýå-ð2ˆ’_“Rñw˜;ósúXwDÍn·‹)ê=ïóJ8Z¡Þÿ—íÐÞ ~%¬çr¹¤ ‹mÚu(†Û'º¶ÿ½ü/· Þ¿ÃáfÛÕ8t¼> =)¥žï†_ÛDNÄ©"T†Å"·?^ïÀóÝÐtQ€¾-S¼ðÂ3Qsrssu€ÈßE‹E­wàÀ-ZDù„y¼ýèClïJÒ¹øèõú8“Ï?ÿœ{î £m#w"ýûÿàbN'N쵞6Oó5qâÄ>ß­ w_†ºý`²¹Ú¨õ´kµ«Õ*/^ÌXµjmm*„™œœÌX¼x1û÷ï°Ýõ%h4åçç‹HxçÎQeŠü@íð?ö˜Dnn.k׿òÆe”•©ÂØùùù#&Ì‹6º\l:z”.›Ftô·¼Z­¯¡LßUUðõx=bÈO‚=ô€ºõ;êïòßBÀwFvŸJ»¿K©«”q·—è"÷W/†ÇaÌCßáG‡ŠalÜ:rub·ÛŶ)”WT²alÞ¶­×:V¨÷¶)v´Ú¯Û—$²TA€µ¯ò†ú¾ÝtÛÏGxtV& .äÅ_$))‰… òÚk¯ÑÞÞÎÂ… Y¿~=¿8ÑüÿuÛµÏî䥓YérÿNCÖØØ(‘°5¦¤š«ÀÆ3†ñ”={2òijO°téR€(1€'žPçïÞ½›ýû÷säÈÑS ÀÖ]“ˆH9Y-ZgæJV«Uhß³µþ÷ÿ^ú ·{%|Ânÿ1ìzš‹ŸÀÄeà[ KÕ\2³"ôo¾ü[-Ðs.iàÚÛÐ|ß=QmC÷çÍ›'´Äi# óÖúŠM›z¼ËÖD2ÖñŸ¥¥¬’T!€»¢ß¿±O¢‹h¶·ÍÅ’2ENÖ|·ðór© ÿ'–Ùx-Ôß¼ 9<¶haƒ¡²­V«=/E Pÿ ðO.{{ô´éR«UE¬?v¼ÂíßUÇœžþñ|¦?]Âéë¿>Ì#óæð»Ã‡{Áÿ¥Qñ²AÊ*zZÝÓgÜ}Âÿšõ5/9#%êÿ?î|‰¯.¬oÁ©ì´ïÚwsM¢¦¦†œœœ>×Õ–E~khýÁšÕjëÖ­#;;›Ý»wëïú´ëû¾ûî㡇Ôþõºu뢖§¤¤ô[îPüïms´a¨)…šRþN‚`ŽúÆJØZ¦^{Û\QË+¥ _öjÔFmÔFmÔFmÔFmÔFmÔFmÔþ_2]À¬ã¡}›Œ oþ|Î'§ëSÁ3ÉÉø2=Xî‘™eçðžtèFêœaAdŒ˜‰ÃŒ#n|\¢#FzP@¢ÉdÂívGùõù|477c±XƒƒA222°X,Üu×]z¦ç'Nèèè »»!ƒY–u Ïãñ`45²£ç1jÀi0Ô~í¯¾¾žšš.‡²ªÎœ9“yóæ¡eÛ“$‰¤¤$RSS1›Í˜L&‚Á žMXQ”´ØÛLP‚*ð¯(Ÿ •‚ òŒ‚X!!b­>§×PRû爛@AÞÍLŸ:äÄb3âhhº‚Ñ&3XâÔm F…ŽV%¨ÎMŒxãA%óL¨¤žú‹…¹NC {«ijè`Ïî= `bîDÝ<…·wíÇãõàõz¹pá†8&¦³x6LMk'§Ü@ƒé¯ù ®‹ÌþêÆ.Ž#³k í§’éÝÍ•š:b’è>jÂõ™‘¬ûâhìöðà½3QP¨»jdQþ>:èfúôXÌ&¸t¼“½åí,]: ·+@­`ÞÍFî¿þ´K!1äóáuÉÓÆsñÀÆÌžŽ«Ó„ 1鉸;|øæÌ'ùælÄéC¬,˜ŠûXï}p„¯5º kä2“ÉÄ¥K—hoo'77—ÌÌL@}QÜÞÞNzz:@@/Gû Q×A/¿}Î6ssþX/1“ƒd‰1\>…€WàóùP<*»*%øIž+Zy©=¤iŽ'm¬)SÒ•EvPK¬ÏDŠ.‚DçS6¿I&`2"$0ùøÍ&D¨É>?&gÞ¸8bA$¿ü%@ŒÁˆQ£µ› ,HGm4†øÛ,>3<Ø}•úŠ«4…ö˜ ,]qJ@"è ¯'ÔÑ%HŠW*Ž^”#ü_«þ%(`PŒŒ³d1cü,Ú„‹ƒŽÏ‘e™‰ ™”1…©Óð]ñq²ã²Q&ˆªëÐN8ØïCÕùˆLÔ$+ È`Œøqà%u–%0›uµ§IKË`Ìø‰ddMÆqöt8s·%ŽqãÆÑÕÕÅ¥KLFA$#g±@B jy§ª!%1âø$Éi0HNNÆ`0è1\–eL&Š¢àv»uÐ÷{ßû?þ8‡býúõdddpéÒ%ŒF#qqqƒAþïèèгöjð(þë_xQ Fƒe)Hœ1týÉÍùóçq¹\º©S§8uêV«•3f0uêT, iiidff2wî\ýžã÷ûu?III½|”¸¨ÝÓœ .._ngÜx9“³ùÛIA*¢¹±™+W›ˆ7è°Häª IDAT!‹b‚T+"ÁX0tBì9zé…Xþþ¯|-`6ÀT]R"’%ɝР!¨«wÓå³rû4J´€b?h¥S-;{R/’Ô÷QÇÄÄ`6› ÔvÑÔÔ¤‹IôÜV$IX,}:R@HûÐ>°EX²”€¢]¥á{“?.Žöµk‰]¹I’h>q‚÷Þ|“b÷¿Èœ9sÚÛßÿ>oæåq×ý÷“ÔÓÑúÕÌtØ  m#cXœBꄱtuuqh_%³¿0«ÍFBv*'_!öL¨|AMÁÄ‚,&pñr=åŸa0ìö ÌÏË!ÎâÀßÑ„1­ B"1±™Ý(^SZèmâp¸¥:/_Æ–¥ÂìÚoä²Èßžv½àÿcK̪ÿ®nè 14Ð.1¦£+ú·‡½´×w]þw.Ë _h/O„¦Ÿè±â =~{ØHƒÿwÞygTœ¿¦M˜0˜˜hoo§ººšüü|1yòdþð‡?ü·t¶dÉ‘••Å믿>¢û³víZqêÔ)Ù¿ÿɱáû׊+Dcc#uuªHvv6ï¾ûî Û¯‡~Xœ8qƒÁ@VVµµµÄÅÅÑÝÝÍÙ³gyðÁÅïÿû濬¬Lš3gŽˆ¨¯¯gÉ’%¢¿çÛáZO€îînæÏŸ/fϞͫ¯¾ªëƒ>(ÕÕÕ$%%±oß¾ÿ×Â_Ó®EB`ŽÃÏ‹•C`‡ ÿFB`„\ôÝÿ‘XAAmmmÿe,¨ ÚPØá$K•ƒò ý°ýú¿íú"!0pPQ14öìÙ³’i•U\7œUW;¨,u €nýGB`Ž.îeHìpýGB`Û*Ô €®ÿH¬ü {½þÕÁüªÀ‡ÕL?%'@ü\B:¡6éâY¿Õ·qñïX­ßÀjµŠ5¡Á‘Y°Þ¥üXR§ŸŽ`׸\l!ÁjµŠ;î¸ïÚXùÐØ—ªïݪwÜqÛ·o1ÿZV ~iii¡¥¥… +|Üb§¥¥…ÔÔT}ùäÉ“9þüÈÕÿ¤è¬³¥Qa¯’Ç‹õé¢/ëÛ¬™äbë…‘«ÿÂÂÿJµ]kB(%EPRªN«¿……PV6rþNÕ¿ ¿•—Uú4y¡_ÀY¤fE)ÿ®PÖß`(jÒÔߢg~šn`¦\k\X·Žœ- `k¨þçK@%E°.4}¸D ÕÿÎ\X^=rþ-«Ôxܧê†Þû¿~@y‘ĽÿK}þο~_߯²ê¬ïÿvHþû‚ÕL~Ϫÿ !ö©û=´ø×Ÿÿ¡>ÖPb0"ñÏn· ­O5”Ø )þõlÚív=3ßPbp]ñ¯¿õ‡"~×Ιbb{ÕƒÝn+Wªç(±†ÿ‚ޝ'öCŠù¿žØ )þ äÿzb -þ äÿzb0äø7s¹\Ò&«UlÒfØø«Áÿ‘mÑf³R„l° 6›5 òêuèp8¤W^yE¬_¿[(dRRO>ù$V8(¨„ò¼èõ·lÙ2b€_fµZŦ5aø_³Ê*ô¸4eÊ6¦¤°áÂÊËËÿöÞ<>ŠëN÷þVUï­VWKB„ÑÂ.0 06Ɖ!×x&«Ácç&“É5`g&qÞ;!`f¸“™Ì͘qr'ÎÍkˆÉıãì,“ v0Þ°1Øv¡Úº…¤Þ«êý£ºª»¥fQÓØóÎèù|êÓÕ§Ï©_-§žª®:Ïó»j¼a@±~)¬x¸ðg<ž/?DÙt•²éú÷OÿϤñèØÖÍYoÛÐø%Ì 9CüŠŠ ­Ù›ÌŽ)¬I* ß;º0ëøÙ` ¢‚ÊzæÏŽõÇÒ~“ו˜}.u?§‰žríÚµi¿mذ!ëøÍÍÍBEEEZNü;kÓ»{0%_‚+T‹¸ú vð<ðï¾û. ˜o…øác÷`ýĈì|ŠÀ×òˆª*L€Ç5“=j ¥tÐÆöï¾ËÞOíeÑ¢Elßž<7^ýuSüßö²•"æAq½)ôO50°º¼SûÅCùôV%3öÂÿ 6ðøãƒ¶1m=RÅÿ"ü_øs¾×®Ùغ‘µk×ò³Y?£ûÏ»uáߟëÓepøða¡ººZË$þ¯®®Öõg@yyy ˜ó´¶¶r©¶#ÁîÊJv'Üœ—ÖÔðð%î}:·êÏ–'¢íL饯—‰Ï¥MM#á@a¶†öpʲÍuû“iœùT«ŽLaÇ"ë> )ðO­»>}¤™ù›±nÙài þ»ím"o?š³Ÿ¿öûï£yÆ6Þ~*ÚôwÀO>Ìm²ÌYfO ÀÓ‰elÉhœ¸Güû±À¸Ÿüt]Z oqAFñ?@_g/Þâzû(t{3Ö¹f]4™+//§¥¥…dÙ¥ÒÊî›[MF(©Ïõ†~ñŹãŽ;غu+«V­`îܹ9M "µl¹ä÷GÖÊ2·yeÝ÷)ŒÇr£Å(F1ŠQŒb£Å(F1ŠQ˜H(„S¥LœrŽs¨ÃòCI¶5:Ïwâ¶zpþ7¶:È?ö…"7—ñÎËx7†5bå'‰Ê7X±aa0UÌD@8•âI’¾ZTTDÿ0Åb138·µµF)++C’$A  ât:‰F£¸\.TUe``ÀÌøl±XL±Âøñã !ô )ñC€SUUâñ8Ñh«ÕjŠøÚÚÚhjj¢«« Q™>}:³fÍ2Å•†°oâĉx½^ººô°†è_’$¢Ñ(±XÌ\DLý XÙ7áf%hš* ª ñ?º˜_”4"!ý8HöbD¤gÎY^ŠŸe×û&´Lcþ”›3VÖ3s šžÝN·†ª¨„D@Ãj×%ö™[¯±•›]1lMôŒDJà™•½tõûè Ûˆ"ƒ±Åc)UßcRÅ$Ž;¢?²õ‡[‹æ1µøˆ¾,Ã@З•H™ )ñ5MݧF"7·¾ö&cj§Ð{Ñ‹ÐùãÜ´5æ‰á²¿L¦?$R7í gšÊi÷ŸcLÞX¦Ì±P7§‘f¡‚08–Þñ2­"Ää ]\Ì£©y ½Íq´“A<'o3ã÷¾÷ô>ûøº›Ï¾€ sCím\ì’äR\žR´•›–OÅ7¶7ëá™DTi;}g4¢V WÅÚ¢¥§º£LµO`ÁÌ ,öwR2f,'ww#z&R:½Ž¸¥w_Û®¤õ?Q±X,8Âáð0‘®‘EÚårÑÞÞNQQ‚ à÷ûÓ„F=QEMÓp:ffô¡ýO€}ypóWFpüyl…VŠóœ;؇ÖðÆŠQmg —龜%àòBËapQ™o÷Q<^Ä‚ ëŸmpsÛÄ}ÏÑh¬pÏŽóòQÓdéÃ!ÅUòú"„¼.Bn;¢ªâêqq È1›…ýAÔ¾>¡^ÂñX| XQ5AÅ–ÌÑêcе}ÇÎp³i—{ÄÃ0ÐjLÀsƒ†,'‹£D Ô ¡³éÏÝ6pYÁëаJדÃãs&û¿ûd¸ù’C4°F­ŒoàÆ±sŃ4ô ÃÝhtõ] ¦Ä™Q:“%U¨15®Ò‡`x.~Z6/‹a_òÕû nîNt!É®ó†Q›EãBGr᪪ª›Í† TLÕGÄø»; tಣQ}¢.‡þéñ¤l¿ ì={öìŠêêj¯Ãá@’$ÓÄ@Q¢Ñ¨iêF‰ÇãŒ?ÞägUUMã›Ífò¬¢(¦ Û08wîÜEAÌø6Aí—T›â(šDT±b·D‰ ÜD;aãP`wØÈ÷ÉÜX·WÑ œm»À®=ï3 "8A7•P© FÑQ„äij‰F£û4M»9“ÝívS[[Kmm-§NâäÉ“øý~…BöíÛG}}=“&M2A<N§Ó¼æÄãqTU5¯UÑh4Éÿˆý6u–G±ÅW†­è‡ÆrèƒSÌ[\ʤiNÜ:)nEÑ:/öpêìE¢‘‹Ï@±…ÑõÖ(nP]`éÓEÙÑÅ€˜4àèçÍC¯„ ,d“ \æ¢ì%fõÐðáx¢V8zqˆqÂá(‚#-/‹ùaò«o€ócÐ;ƒª~ ²¹ XÚÍŒ/Šâ>H\ÿRÐÛÛˇ~ÈäÉ“)))¡¢¢‚Ó]:•sEQ¤¨¨ˆ™3gÒÓÓÃÙ³gMóAÌO£OK’”rýÕ2å†OpâP œ4 ,^ŒTW‡Õj¥iÏJŸzŠûº»‡í¢Âh”?ß·@k+g¿üeÊn¾•ðÅ\lÓ(xÓpà±E0ytž(Æ%[#B&ýûKœ¾xû§?Ÿ’bûDAÀW8¿óL«?Ì }(XÐõ=nÞU†Ñ ¢$Ïÿq1ißšýf„aÆi<, (œ5™öPˆc¯¾Ë„F+‡ÂõÔ|úV4¯±sfÓØÙD|P¢ÄCä+n|qVM"&¨‰˜EÉý¯²ˆp3öáã5-ÂÀ@ш~þ×ÔLÃçkC”¸8(W\X„iø{JxãçAëe|I!·ÜTLÅÔc„ÚÏfCA-bAÓ` qâ>Èœ*-MøoûÌe÷É¥à‹þ[ÚòFb` ÿ¾¾ìÞåz½‰E¸]܇K{âÅ«—*ü_òê•]û3áÕ%I“„W–LÐri`d`O} þQBE^xás{î¸ã­££ƒ£Grë­·jeee<óÌ3Û ´… j@ “ÑÉ5£µµõcÿƒ~Oqûí·k===¦ÐÐX§÷ßÿºÆ>~ü8Š¢PYYi^öïß/Ì›7O‹F£?~üº›H’DEEÆ€@ @ÿ0O½œáÅ_>ÿùÏk§O뜩( ï½÷wÝu—öüóÏ ·ß~»väˆ.())a×®]ÿie~ùË_ÖR®7F°¹Àj4À‡Ÿ `s'€…C¤üõºêø£ØÿüØKÅ”ÿ組Ö<‡,?Ȧå¬[¤¶l c_¤èÛ¼ªœu;ZŹùnOFn¹óšÖA–eí‘î[¨«ª™žxúH¦Ëúü¦UÕˆ[›õèÄ®9þÊ•+ñz½´¶¶²k×.}û7ì`ÕªµlݰA¿BßþeË–QVVÆÊ•+Ù¾}û5Ç_¶l²,ÓÐÐ@ccc"Žþ¼AX߯oÿú¥^ÖíhaòäÉÔÔÔPYYyÍ&†ðlþ¼ZžØr§e6­(ÇW¤Ž|eS­9¿iE5ëv´°bR€ûW×R[õ×xʲ¬mÚdcÞ<ó¶oOÄ÷µèñ_ÑEz|}ÿ¯\H˜¥ØX·îÚãïÞ`ËjÝèÄç“Í8zÌJ|K›ÒâûýzýÝ›XšƒøýëÔÜ&Òð¯*òŽDü*=þ–?\D¬Ê`s"~`E€š¯Š¼W@Þtíñ­°Q¾jõý›V”S·Nï÷ðù¼iÛÿJe€šƒphµ¹98þ®ïoâ÷¬fù—$²ó©ÿèF,÷û5Ö'ñíË¿ÂÎgåOŸ Ö]S|¿ßsóÝ#æ> 'üç÷ûY€Î};d}ß_ŠûÖíhaE `šD”ÿô{³ŠañËÊÊFÌ}@NøÏï÷›&O#á> gü—ͽ0âû?ýÞ,~¿Ÿ5kFÎ}þ²â> 'üPóÕ‘sþ¨98rîƒÜðÀÎg1÷9á¿T\.sn.2_§BÓÐ|¾áÙ·}>㿈ºv­)>ðù¶šåC…Ù˜¢þç}ͨ…uK&þOˆ0®Zä•-†Šÿ?wÏ&~ûì:–|ûYòóõþÃçH‚ekòv)€²éà .¿x¯že³>!X:Õ›UØËÆ7Ö¡Ùûô°rãZzv{R=*.—‹¢¢"JJJÌìk†¨ôlº^¯—)S¦0nÜ8<cÆŒÁív›Â;C­iˆ¢~“ÿ]UUMÑi<7 Z[[9zô(H’Ä´iÓ¨ªª0EÖ‚  ( ±XŒ¼¼<3K[ªàÒ`¦[gÆt·‰KâQ›Ãç#ª" © ið‹ ÂA@Ôpä‡qúÂX¼AÎ7rªñ¢¤×GÔ¸.¶µ»4|%*…¥ y> «MCS´ºäAf‰ùè*¨è²âúÔÝ/ÒÖÕOL‹a÷ÚlÞ=ÀÞöÉœo9ˆˆÝe úÃý4ží$¶ébï IÕl„DFf Œßn³.•~¢þ&Z_~‰ÐéÉÏ“p”L ÕãQ°»t]´`ÂÌ›9 ·Wdï;¨«— …‚¼rÎ4ti RÃßÝÇû¯ô‘gC(î¡£>|3Bû‘:/JóÍøVß”%j°•HÓ«D/¼ÇÙ}¯Ò[ÿ¯ÑûÛ˜ØÛ‡µs?þl]ÇÜ´îWðÂî†(.ä ƒ-NzÓ9á¿È¹®.Ô~…´BÄžºŽûqǸÙU¸ª&’?£6¹ÿá]Qq¹\ˆ¢ˆÍfKË2š UUÓŒ†š}^’$³ßØl6$I2c¤ö¿H'Kæ¸2††hñ*›ðÜãçx±æAoü<ƒcϘu¬2ÈóÁ3 "!+á°„(èÝKìØ]ј²ýÚ£Bç8Åñ—®iXc BBdíì âãêc#IN§“H$¢Ÿg‚ˆ$H‰ç°1EA­X»  ýØXì±FqIaìê’X/èâ€þ³±P"½ŒöI’4|. ›AMè&û¿Kæ_&¦5n¥TÈùÕa‘çŽÓi¹€æPÑœ|?GÂïÓÒ{‡ÓIÕ„™TLÂ&é\×c ÷¾H2~_7Kd/¦J7‚p>¯DA‰éIÃ;ÛNð÷ ª*3fÌ@–eA`â  ‡Ãœi=Õ¢!<’Hdîp@¬GÀ"ÁÙödüh4úÚK/½ôšqü¼^/yyyæy Š"Š¢Ð××Gww7=== ˜}»»»·ÛM~~>N§«ÕŠÝnÇétât:±Ùl&ŸÇb1öïßÿz4}ÅÜÿ/ç‹ ‚& V)NH°Ó-úèòÐRžã«€;ßÍ”šé|â®Ïâ;Ñã'°èærýéO3wî\¦NŠ×ëEETUåÔ©SìÚµ‹ßýîwÔ××söìYóz“j  ‡#åü~¡Yf¢I%—¯ mfòÊk ýQ[Å%*„8øá)^Ù5žö¶Æ2û@%4X‚€Š5²’£™~Aµ ÑKsÆåÈ—©ÿÐÍ›ïŒa dÃj·«qÓ(©ðPXšG$"ÑÖ.MÐ/‚ª ZTwíÐTdP-0µÍŒÇ—\*sîÀÀ'Ož¤­­¼¼ø€Ûo¿ýºgåÊ„yóæiÁ`›ÍÆ;3Óýsï½÷j‘HäcÿD£Qzzô$›ÍÆŒ3>’uZ¸p¡F)))á·¿ýmZ¼éÓ§#IŠ¢püøqîºë®ë~üýë_ ãÆ3¿§˜Û]üæ7¿æÌ™ƒÍf3ËNž<ÉìÙ³µžždYfæÌ™»øÿž{îÑ€T³µœâ½÷Þ㦛nÒþôOÿô#ɼ(ÿƒ9Ð\–dóªaÝ"ëùøæ…ÍùÍ«þYÖë87ßM ü—M\müGRE]À¼„vúöíH[1çç­ª6 gHÈEü•+Wš¢®]»vQç=Ɇ ذa§åµæ|÷$»véâ0C›‹øË–-3E]¬šÇï÷ã÷û"0}~ÕܸiÈQSSCB8{Íñ^¡ ZA`Ì«©ÆW´_Ñ:æÏ«5ççÕT›Ùï_]ËÃ+r³ÿ7m²™¢®íÛejµj|>ŸOfþý˜óµZ5Û·ëñ׬M›lÃâ[#ÿXÐcmY]o©Œo©Œ@9¿euµ)HÓ°¹ÙþþuIQ—¼Cf3ÕˆU2b•Ì–¯Šæüfª‘ÙŸj¾*Ò¿.7ñ­°™¢®º&™úÚj ×y)\çeÍÌùúÚjê_k¡Ã÷6ñ]ßßdŠº";ŸâÜ{ر¨˜‹Š™¿E3çÿÁ½‡ÈNÝ„dç3âúþ¦kŠop@hÍsf¹ÆaVL °bRûºs^ã°YǨ-8Tü°V–Óâ¯•å´økâf { IDATÏÈú×Â÷iÛRãoݺ5ãöõ¯…SW’>Sãoß¾=c|£þµp Á}@ÚàçÔøuëNgŒoÔ¿4¸ Ó ñëäŒñú™8p$ñw'ù¯Þ’yÿ¯ÛÑ”1¾QÿZ8Ðà>€†MþŸOßtg~æãŸ¨-hpèØLñ}¾Ìûߨ-hpÀò/%_—¥Ÿ/c|£þµp ÁÙp_.ùïÝ”²ËqŸwÉ-ÿeÃ}¹ä¿l¸/—ü—ͽ_6÷CïÍ þˆûrÉÙp_.ù/îË%ÿeÃ}¹ä¿l¸/ü7t] ñèæüðnStŸ*¬ËE¬Ÿn[sIñ«ñ㓟ü$@@0ÌèŒò¡õA7ézâwù+Ø´»‚ù/ÝæzÂÿ|îžM<ðÀüöÝÉoÿ×|éK_bÙ²e|îžMf\Àÿ/-ÐEikV¯b^â¿8À ¿ÔûQ¶´ yXÆÜ\¬ƒ!þßüÌ-8Hã:k”5{ŸÎyüTìî­Hˆÿ¾«‹ÿÏ…~t«o½aÍ—Þ¾^¡ÓâÏŸ?Ÿ×_Ý4b¼éxçñÇùÕw¾““8ÍÍͬq¦x?]Ä_«ëû‡A¬ÕP 8?¨tLkc 477 Æt¥ø455™Ó•ðôÓ/'Äÿ„ë-þB©Cçš… \WîHLL ÎgŠi¬Kè>åèƒ_t›eC×#ׂQüçFê=Eêü¥ …fÿò—|Ѐ)ø7 >hкìK-+5ÖP$†Jj}}}“a°ti›6èëëãþûþùŸ'qà@ºÈ9Uüo`ûöí‚ dú-¤Þ]ÏsÍ0®k’ù¥ž€º&™…?……?…¦Ÿ@Cƒþ¾á¡§t“:ƒ ¯§)Aep «]Rèä›__Ã7¿¾†¶ôéz¡¶FŸ.‡ƒ W®sµ0ÅÿÇšá&M}bo| €¹À#<’ÖÎú‰ñø±f"hÃÇEdBqq±6«ó³uÎ3…ÿþâ^ôkomtÐèÂ~cR^.7§ÔrÃ0 ¨s^š±€Ôò--Åiýd¥|’çw¦²½¸ÌÜwKÚ×#ƒúd{=}ûõnÄ·ÓÅó#…!ü7Æ8 5ú7L²]¾!Ô_ZSsYѾ!¼7Åÿ ìðùÒÚ@øŸ†‡Ùš> ià6¯ÌrA¯›0@ºâv‹‡†VùÛ+´‘eY»3`Kb;ÛÛD¶=jeÛ£VÞÎ߯k÷?ÀÛùÛØö¨•ö6ý]Ñž¾@÷§NWZGú½ä·ïÛÄ·ï»òª¾Î^sê¼v'²@ ¬x¸‚ƒW³es K×Éæ»N¿ßÏÒu²ù›a Zöϯ¬¼¦{R£mUUUUUæs½Ôç{©¨ªªâŽ;îàŽ;î0Ë2ÝŽ4¾ñ~û÷[¶¤MC1}ûvÖʲùèZãb£Å(F1ŠQŒb£Å(þó ¡4ÓöI=Å0Ô´Ðbµât8ˆD"8úܨÇ:wõðÁî# œäÌï;9°›X&NœˆÛíÆÈ$mˆ##‘yyy†°ú}àPJüš¦Ñ×ׇ¦iÄb1TU¥¿¿Ÿ––z{{±ÛíL:•iÓ¦!ªª¢ªú CÔgL#‘Š¢ ‹Å`ªªJ__ŸÑn‡<†XTÙÚÝ`shØ]º€dÑDx "AhX@S4¬ÎD=‡†Õ&!ËŒ§ìJ\_¦ªê‡ÔfWž†Û«bs‚-u¬ˆ®ÑÕ~ôüðAèî•xí}+ÍÝP2®„y³d&ÜP„(Šìs?±P”¹¥µ•yäåå GøàØûåãï²Ów1îH)1Å™\v01%_2 ¹tãæ~«CF-Œ›*öU"•URv³×jg˜3úAP¹p¦SÇgóÛ?äÑr¬òrÒüã´îïâLÃ9üAèŠypY¬ƒAzÃøæº_WLÏ»m´¿št™õ޸ό/ ygáœ6ÑaG œ'Þøc¢Œw‘ÃÐvf—½€¼É2 „êû3Á…´w¨ØÄ(v×D J©ÿà$ïGóÑ¢ª;ˆo¶•I7•ávÚqX¬¤`‡avaX­i¿'UÂÐÂ8ÎŒ ç‹‹ÅbŠMc±¢(âp80LíÌþç*gqÆpiPœA4IA³¨ ”µ"ßhaü,Ñü^4)žV×VçÚ™6׋o² Ñ% ®ÆÝŒï÷¤Vß* a‰GIæ¨O‡$IH*º°7å«ãbÛ þZ”$.7‘¸Ê`DE±z-Ž„€†5؉ 9H¤aßj,cÖT•i•ó; ElÔôͤÿœ@l ó3FI‹'ج¡„bzBsûmÐ¥žÐYD ãì¥ÌòÎÆ³qüÂ1Ú¬gQìq“ª5›J¯«‡ïÓÞsžü¼|ÆÇjÅ(è`èÆBâõ„_1È…àNhÐE Xœºø?ÚjT7±Z4ε6IdýßY¬ü½=/vbjž" „IC8 =½à̓¢”±J’$uX,–ƒmmm¦ Úétâr¹LA¿až200@4%ÓMf4M£««Ë|êñxp»Ý¸Ýn<‡ÃÃáÀív‰D°X,õ’$™é,çí0(i1ÑJ¯ä% å¡ éÂð‚b3VS9«–g:ùðD3=½=X­V*Ëo`î´2\6üCK^NUQ7ÐÑJŠÍàà ƒƒƒ\ Æ9_ZZÊâÅ‹ùüç?ÏâÅ‹¹ñƹá†Ìkg__ï¼ó/½ômmm¦ùŒa ¢(JšXO€5+–褔UMÔ() ²èÖ.ò=:ÇDÄ0‚CcbÙXŠÇ h"hæEEu‚â1âEµ  ýcÊ¢ÿ°ô¡ËćÀ*á¿h!wPÞ@€#{biµ! ÐiµÓà‡a.œìÄjµ2fÒ\Ó¨ž8Ž vä‰.¬v‘A!€©Úq+É ‹;€äÌœÉC#„ªµ3{ö$fL¯ ©éçÏûQ•r@À㺀ÍÚ„Ý&b±X;¶˜Y3+@èF ÇP#6D÷ ‚5X½ƒÄûÝDýžŒñ2Áý7|у¦Ç.]ÖôX²,#ÿ_ ^¯¦Oux™¨÷I¯G5ËR1ñÿ¥ðê’ út|Â%Ë^=>Á,KE®Åÿ .ÔEaÒ¤I¹\lN‡‰F£H’DQQÑGûÞ{ïÕæÎ«E£Q\.õõõ9ürîÜ9SˆûqàË_þ²Ù¹m6S¦L¡¾¾^xî¹ç®»à|ñâÅZ0Äëõf¸?ýôÓ‚Ñ'EáäÉ“|ñ?þñ‚,x~½ð‹_üB¨¯¯&L˜f0~üxž}öÙÝ”Ã0sr:G&6 B¡­­­Ìž=[K50žIäÿÀÙaG°ÿ1°÷ÕsÅõÀfÊ2{¹ø£ØÿºX7¦¬Ïƒ™HSÖÑœ?Ø`ô÷3¶Ï©âײ|Uñw¤”¥¶Ï@òÑ®]»®*¾a‚2´}6H¿466^U|ÃehûlkÇé«Üÿ§åŒí³Š°Óœß¾ýêâ&(CÛgƒÚÕÉyŸïêâ§ SÛg%åðÉ;®.¾a‚2´}6èMÙuMWß0AÚ>(o1ç#;Ÿºªø† ÊÐöY!Á_Yq_JûlaðW6Ü—Ú>[ü• ÷¥¶ÏeÃ}©í¯©÷f×tï—J¦{3ƒ¿²á¾ÔöÙÂà¯l¸/µ}¶0ø+îKmŸ- þʆûRÛg ƒ¿²á¾ÔöÙ¢ººZK³È²¬=òûÍãìóÉ<òûÓúøÐ6#!Ô_õ?6gÿ§~ÞyçiŸ™„FùO·­¹¦ûàM»+®*kùõ@ Öï1þ {ô×;NËi÷[>wOnŒ.‡²é*eÓUêÿµ[g6‘¾n¨ž Õ“ =žàçk¼Ö^²,kÍÍßبžÆTVV6LüßܬéXµjUÆø#ã¢Ôþþa{3ë[F€Ô7W×àxT0§Æõ-¤¶Ï¥1Ã?üÃæ„àŸLøo “¨,µ<×±2‰Ö®Vô›KqðåLFÿ£ÈRÍ.2õù‡e™‡–ßÉŸ”Üi–ÿIÉ<´üN–‡›p¤ 䯦ÖÕÕióçÏàUÍ)Õ  ²²ÒLtt÷Ý+yî¹í<÷ÜöŒâÿëLÛy½âìHì×µ²Œü6¼R©ÿ/ÚTþ•>Õ=•Þæz¬G]“ÌÔGîáþÄ%¨æK[`Ç~üØf~üØfJß̯~õ,¯T^»ñ«ŠŠ íùõ¨×¯íH¥ß 677 w=ÜkšÅÕÖŒÜ Éû3DüŸø~÷w_Á¾ü+fýØßJûn_þÔÁ¤ûÀPãûPâÿT&€i˜&WƒŒuýWÞC Þÿ€áâÿ‰òKàÍíu8ójròmï&²©ƒÞªJ!´Æ1¢>Z]]­566šâcÌÔåÆMeãÜYZ“ÙEbwe%»FþPu¤&Ë{ÇöÏÖà³åœ>e鿟`Û£VúWú ör›WæÃ¯&ës&©ž”ÿ²«¯âåÞ|’[.~¯=ãkÆøÆ›Oò¶|íÁ·?ñ8y÷_°'&è©Fß¾o«>³nä‹)+Ò×£µûªúÞÊ•+‡­÷•L |>_¦âÁ¸VÝo†¸?ué2¯%¾!îO®GüQŒb£Å(F1ŠQŒb£Å>o,Ã"Ò …Tb#}кÝf×G$ap`€^õý=~zöusögi?ÑÁqŽÐEÜ€ .ر""¢¢ÒË„™ÎL,X^@W¥èžµZ­˜ÙÏ- ‡ƒx\WÝöööÒÔÔDgg'š¦!œ:uŠ3gÎÐÕÕEGG~¿?M”‰DˆÇãc·ÛžMÄ4ð†¦iÇ ‡ÃÄb1¢Ñ(‹Y–)..fÚ´iL™2I’ˆÇã(ŠbfNÍlÄ5Ù‚ F‰F£„ÃaÑ4í8°Ç ‰J8(<Ô…û‚’U7pz4l@P=· €Õ X¬`±jX­^¯‹ÅŠË•‡ˆEâQ]´‹B$, Ä4m˜ù¹ VžDCO×;±`>gºÇñú!+mºøÿÖ¹Å|bÊKªí̘5™ŠÉÜVeãOfFY\`þy¶<Âþ0|äÍ÷ì¼uÊÉkÇezú­úc±0d¡dü¢)ó•‚)5OÚŠ p©büÌ©”ßÐCp°»‚qp–t°ì³ÝL™”GPáíw£¸œ*n{/o¿ä':`aZå°[ñ7wë:Ï`¬“öÆ6"ç{Ñ¢x ¡ÿTˆXLØ‹%㋎RE´{2¯äFòf|žÂ©‹p•Í¡rþl}îì7”1àÈ£pñ­Œ©€èÔ¸ØèG‹…(¯® vQ!ü~.W«}Ý^z{"´:Qµ"½tþ¾³ÇĬNÂ#Û‚ÝÁT)ùÀq›Í†ÝnÇf³ár¹Ìó ©BÿÔ¬Õ†)€Ãt"ãp8°Ûí8ãmZÿTž¼’€f‚¨,Wm1úË›)˜cÅ5IO°M\Âñd&öÉÌ’Š¨oÁíŽ#Ñ8!wSÞçÛ6»k\êö¢ÄD V Òb ñ8‚¢à°;¬4Q@µYPmª-)|ÕÁnÃâó2¨YñǬÄì^T1!Š Dû Mk ™@‰+<)\Aƒ­Äþ—€h»Oѧá´@ž l°Y4$ÎDü!pZÙ–ï uûž,²Ÿ§Ó‰Ýn7Ï!§ÓI^^n·¯×KAAçâñx)Û¯Âÿ±¡þÖ …pÒ#úòPÁÄK’ÄØÒ±ÌYX‹<¾œƒ'ºxåõ^Û{„ý ÒÝÝÝæ`ZÅdf–OÀa5¼uP¬úqÍÎó:ZGáIír+±íC1sæL–-[Æ’%K¸é¦›˜5kãÇÇáp‹ÅL3‡ÃÍfCQ”m±X,õøh‚å„j©@µ¸2ƶÙlL™¤Qw{Œ9³&aí4jæÀ; Á`ˆIcøä­QÊJÅš °€&‚ €­,}Xb‹As@×™›ñ±r‚É€’!ãx× î>¦U†˜3¹ÕX…Ä#Äc (à¸b²Ú´@s7B0ƒx„!Ï.']1>4¾¢iÚ“—Û÷áp˜“'OrêÔ)ªªªLc¢3fP^^N,£±±‘sçΙÿT³ Õˆa›$¥8¦¨êyl¶ßòÉù@ºEG’û-{öPþÖ[xB™ÅKI¡¡äḠ¯ XÞ &ÊZÓ@n[6ÛïдsFûbPŠàÉüDí(úe:„nbÜHxhñzÞ¼åÏ亮¿ŸÈ‹»¾¶‡ó½½””Põ'Ë |æN‚Ÿ¸•è'oC™0‘ADz³@p¶ ៸ >‰–vÛ¾y%ä/*aL]SVQTTÄÙ¶óÙ{ ZE5}°]<¤pþÀyzÏ·Qœ/3cÎ4Êo*eâ'KS7k¡V{/V?ùŠ{Û˜¸œ_ÓÄ'…K¹ÄÕs8]­,XPÁM æ ¡¢iÆ‹O«­ššéTVN&³0Ø'Ög'ÜQD|À­›) ©vìc{‰tÉÛBgKâ™b‚}SÜŸø›Bþ„ÐhÙ°¶€vxäYŸžØp»ðŽwât¿Û¥—õ²ñÎd™Ûe˜ß&÷ß1òN†`ß÷³üxRäŸZ6´-À+K&äô…×Â… µ`0Ș1cxþùç?v¡q*n¾ùfíìٳȲ̡C‡„;v|dë÷…/|AûðÃQÇÃþýû¯×`œa™ï?JÿCg̘A}}½ð /|$ëòÉO~RëëëÃãñðæ›oš1SM|žþy!Õ˜¢µµ•… jFFúë…={ö.Wæû†ë…üü|ShoàèÑ£üÙŸýÙÇþ’ÛX/‡Ãq]–ã7RZZj ¤šttt\¡õ1*€5çG°×.€ŽlŒ `Sb `?2¬,ËÚ¦½~ýËáF6ùʰ:/÷”Ó"?ÃË=åÃ~Û|ä+&÷e#ˆ‘eY;ž0yøÞêáéåžrþ¦¥%cüï­^}M&(²,kßÿþ÷õõL±ÍÐøË–-Ë?‘ÈÎE–eÍÌ×ÔÔDOOOÆø ,È¿§§Çä¾lLPdYÖüÝú€Çƒ °åÍÃê¼ÜSÎúOeÞÿ[ÞÙlöÓ‘fÂ6ã'² <Ø™f€’ÿ¡‡‚™ûßæ$÷e“[–eÍ¿[_»]ì”!þóeÞ~&¹/Y–5õ¨_i‚ü¿ÏÿìšÌñóÿ>É}Ù˜ È²¬õlÒŽ;©^3üVÿåžr^ûTæý_½F0¹/Y–µ{õöÊ[GøÌßü cüèwÊÿ3ó“û²1AIå¿l¸/—ü— ÷å’ÿ²á¾\ò_6Ü— ÿ¥Þ›ùýþk¾÷3ʳA*ÿeÃ}¹ä¿l¸/—ü— ÷å’ÿ²á¾\ò_6Üw­ügàСÃüå7nJuÍSÏ#?¼;íÓ@ þò7qèÐáŒË»dYÖ~ºmÍu†W³***´ç}ͨ…ùú~*Ö-Í}ÆûKÁUXG°ç‚=¯°k×®aY-wíÚeþž Ûµ´@¡­Y½ŠƒõÃwˆ!üÿâ½Õ9‰;tš½O°ù™[øÖ[‘á•×Yçæ»¯« €‰êÉ8Ð…~¦øÍszlcºŽ(++£¢BÏøiˆÿ_ýõËfç(.¾Š,)¨¨¨Ð>loN+S·4$§ƒBš & ˜5®bD1 |BÐ/œ†È?©‚ÿ§Ÿ~™UŸžŒýHÎÁˉ“?j|ª°ùrq³]¯+ñpÝ'…õ?Bt7 Ö˜&©ó‘O™¢ÿ+¡¸¸XKû—PŠ„nláë,À_Ü è&†@mW5t×ÓÙÙ)˜±b…”²øŠë¥ÞRÃã?NSS[{–àkî¾r›ªiʺè`Nw7sº»Y)Ÿd¤ÂÿLÈËË3ðæ|oo/ãÆôwÏÙš ÁpÁ¾!ü¿"þ_.ÀÎD„õ)ïÙRÛóWÃC±<¥öÃ@ss3;³íQ+Ê–£x¶ûåEìé ðŸÃ)u¡ Àߢg¥9Ü–òÌêRçq{›È¶G­øfÚø;Yæïd™Y3mÌšiã®_ý̬·§/\0VûùÏÿÝ Ý FÙ_Ïû ø».ú7¦{‚Ãê_ +W®Ô8 ?‡ª¯§vÞ¼ŒõŒßü~ÿ°²WÓ·®çýàÇ£Å(F1ŠQŒb£Å(Fñ"€€•°þ¼€ÒŽ&$Š,Xñ8óñù|„ÃaúûQÔ ]4ùéë:ÏIŽ#‚ '`ìX‘‰£ÒGn."SÀ&vX±=-"¦¾9‰‚ð¦(ŠÜn7²,ëYì…þþ~Ο?Ï™3gèííåâÅ‹¦øß…'Ož¤½½ÁÁA‚Á ™=’ŸŸÇãAÅ‚ ¼‰.Ë2ЬiÚ/‚Á ~¿_Ïl "Š"“'O¦¦¦†É“'›™¨S1Tôoˆþ á_4eppH$‚ßï7ÖëiÀ|³xöËá˜(²QU ]ä/I J DB *ñ˜@,¢‹‘ÃAhXÒ$Šùù2v«|lš¨Š.úW@QQbãÛ âæ<áÄp³ A (ñö)»Y9ѬP\XÌ¢ÙLr7bPn;KÝLOͶ2¿¬,àpÄ™7¹—UN1;¦ÙÃc¨ö1ØÅ|DÛ8NœÔh}³Ÿ¶#1.vÅi= ù½Þ|;FOl"“æØq9z8Ý'ÓÝ|Âlx ,Ä£ƒ¨¡NµóÒ¿ur¼E&p‹@WsÜ¥Y`ÆïÜ5?æ[¾Ñ=¥¥#„gR%‚g"e3&S6c:žB/NÙXì¡©¡ƒ¾cçÐÂ\ãÜL™UÊ…ö8 ÐÓÙG$¬âr8°y‹°Ø, ø{Ðúû±Y4ÆÚ`°K#¯ ㉟%Ÿ ê}á‹…üü|l6yyyäåå!¥dw6„¥©¤>'š¦¡( ñxÜG»Ýnòóóq8x<ÃT ­ÿ}E8Ù8É{Y®ÀrQÆÚS„µ·ko!R(‹•§gö!Z$l=Eغ‹)ì.¦ª§˜1!7‚5N\R §Õ>Æ^ôБ7°ñ¯&LÝþšòCa GtÑ!†#\Ð4œ‹…˜ÍB(ßIÐë&èÕÅš wÚPÝìr>ÖXŒ¼‚ju¢¢¢hQ´`;¨1uƒ¦ü]ß @õNǺ»Ä¥ÎË?#uÈà*g‘fNæ±Áê÷Xpû Ï®‹ÿbŠ@oPàl€EˆÄÙøÍ='ÌíövbvØ89å8[,Óa7Žp²ëÍâiBÞ°i¦ð_oˆsDh•šiê<Â@ûiZÚs¤ûºi£ß¢ÐŒÎÃÆ_Þž<ÿüWb’ÄÆü|HÍKmu%ÅÿÑ~P£`µh4:F$1¹¯/`À³«Æ@ˆ€Õ c aüè€stN‹FÙøÿ¾“Œ¯(ŠÚßßÿ^ssóZ[[MÃç- v»üü| )**¢¨¨ˆóçÏ›^¯×4EMÓ$ ›Í†ÕjEEü~?ƒï+Šby\z-o)b¾Ö#\ÉýšØÇ^¯—é5sÐ\>ö½×ÆÞw´eäj IDAT¹t¢Å%[ý¼SŒ®v?n»—§V1­t¶ÄÕIGARA`ð3tm55551›Í¶1NõÄUUQ%mÝü£¨¨ˆÙ³gsë­·²hÑ".\Èܹs),,DEÓT$±_6VTT$Ï?A‚åG‚PLE‡Çõx<Ü´ÀAùølŠ“–cgØó¢Æ¯ÛÙûfÿ…>¦LKÍ"‚bASET£`íÛ9µ)>Ûcbòm€@ ?b¼n•Ôó€¾4ù©ˆœÃ}º Ýê…P/ªª@\Æóðþih;ƒ½ ƒªd— À¢Hêc˜ñò“ŸÄTUݘʵ™ iÍÍÍœ>}šòòrfÍšEII ñxœ¦¦&Μ9c^ûSM+Ry9ÁÓ·nÝšÜÿ’ÁëÝÍòOŸa¼èC—Ý'1áäIò{{ÍïûÆCI\T‡ƒcÇBÂÁGîêb|S:ÅŸg`¼ ÿíÓmäçïBMþû*:ÿøÝz@Ôħ §KŠéøôRúW|žC­­\üõï°ýûKDwüšÁ_ÿŽÐ«oQ ÌÃǧðO*GµX‰¡ &¦‹°ñ’çAø±vklãÄH)¸$œs ¨X4éÓ§SXXˆ¢*ô»@×§[T ¢*²CV’»PÔ4œAú6éíc|þXfN©BÓ4B-!ü± §°k6‚bxã—.Üc6ö–÷Ç´°s£¾Ô`ž1õ8ra n–¹¡l¨ÒM(âMðCNW5µ·€èãԉўRâý ò´‚à)O!ðb•6Í9»D0„jSÜORØŸ©ìru²Å/„'^L¾,2æŸØV6¬Î‹×þ’©îÕs‚!æ7¾§~¿T\áóŸÿ¼6wî\- RPPÀ+¯¼2,†!ÿ¨±bÅ mîܹZ8fÚ´iìÙ³ç#}ÉFMÁiaa!{÷î½.ñ¿øÅ/^Õ lI’øýï]Ö!‰˜1>*,^¼Xëíí5y¥mW0¨_ÂRþ¿ùÍo„©S§¦Õ9räóæÍÓ>÷¹Ï]·Á™û÷ïJKK)-jc•{Üu×]ÚÑ£G3þv=M†\ $y®¡óŸgžyFxñÅ…úúzáý÷ßRÍ2ÕϹÀnÚëÿX°Ç³`åJûýïÿcÀú|¾UëïÎN€˜+¬ßŸ¥7GXÿîW«ýx°=›ú>V슽#Šopßš™I#u‹|¬˜”@ܤqàÁX1)ÀºE)™h7Žˆ îÛ¸e‹Y6}ûöañÿ¦¥ øÓ·o7Û¾ËÈ8Ðà¾×_Ý,Û°aðøFFÖT4âoذÁlFÄ÷še~¿Xü ¤q ?u@`SSÓˆ8Ðà¾Õ7­1Ë|Eë†Å_ÿ©€44âûŠ’’6ŒŒ î[“ Ï'‹ÿÐCúý_*šñ}é&(#á@“ûj“e¾¥Ãã?ÿ¾ý©hÆ_šn‚24¸ïâß%ËĪáñÏ®ÑãŸ]3<¾X•n‚24¸ïðædõÂuÞañ_û”¾ÿS9Ј_¸.ù0½÷`çˆ8Ðà¾ûßß6Ëv,*?ú‡Ò8Ј¿cQR즼udD8”ÿ²á¾\ò_6Ü—KþˆûrÉÙp_.øÏXf6÷~×b€2”ÿ²á¾\ò_6Ü—KþˆûrÉÙp_.ù/î»þ3ÖA–eM ñ<èƒè—.=ÍÚ¿~€µýK—žN\¿êl«ÎºkÄ3Úýmë“kÌÿB©ëq©ï—ËRëjp 6íN1ß寸¢1Àõ‚«°ÎÿýÍ0pÖ]sœ¡âÀÿ×74˜¢ã³>‹¬¤WŽÿsSü˜âÿÐã“"ûÄgèñÄ©žœ¶þ¹€.ú~T_vŠø?ôøAÖ|ém]üO€ @àÑœ eYÖ–-[FYYYšø¿¹¹™_}ç;æu:õM6¦_—ƒãÑôîfˆbÕƒP µ‰‹EÂÀ0h\ßb¶ù°ýjÌ2Æj¯­ÒŸ¡âÿ§Ÿ~9m^`¸ lýã‡fÛoØq%Q.EF†ÙÀ•â]M–óë!~z½KCg¿rÅQŒ"G0ú÷w¿û]–/_ÎòåËùîw¿›ö[6*þŸ?÷¼²­^²VVVšââ»ï^ÉsÏéÿ¯úúúÌ©®®îc7_¾^0Ä÷¯T߆†ÜûïÓ§‡žÒ Н‡ð~èzÓú2?úÓ›ù‡¿yßö-ç˜úÈ=L}äݨ ‡œgÜ{ïî½¼¡Í]÷^ö÷Ëáñcú½–!ø7¾ˆì| Ñ­¯ˆ:Xƒ}ùWÌrÃàžGI[æýUVÓ`è2 ‚}Èl0Ô ÕÀÀÐߌߋ‹‹5Ç£W%þ_]Þ™±ÿüê;ߣ©©‰awš¯ž4gxà6´êpCø¿R>É––â¬úCuuµÖøÿ±÷îáQ•÷ÚÿçYkNÉä0 ç… Eªx´­µV+Ú/ÝÕ]ik­µU°vïKûvoÄzøí]¥JlÝ¢ï~‹B+­UkÁJk+*…¢ÖC¥¨œ$„C!‡•L2絞ßkÖdf2™Ì$TžÏuÍ•™uxîuü®•™ußÏ®]NçQ©ßÁÓCœamiÏ( 4 û¸uÌÿ×Ì›Ç?É4æÏ=Ÿo1ŒŒ €¾Úë¹%«}‡¤±sé{ŸKé9!ãq¶†!^R! —“!ϼÜѳ~cÆZüÇRÁÒ@ Uœ €õpõiƒ &³ï+¿ó›É¾÷t ÿÿy]éï;kFRqU'¯·Rñz+|3¿+…†–‚¶Ò† Š^Êôï¼`àáçÙÁr…?¹æ+¶ƒ¾B¡P( …B¡P(>~hWr©ÞõRòøDN¡Š1hh¸uî*¾€½K‡ ËŠ!‰¡­Ä‰áEâÃöBőĉ!B„(ÝDh!ˆrNætJ){\ ÞMj0wî\ ¼/„x¤¤¤¤aÔ¨Q‰†aÇ ‡Ãttt‡Éî)9‹ÑÙÙ‰aØ¿†A$!cš&eeeŒ7¿ßß iÚr`[RÓ!<‹ÅÖ:!¡PˆP(„Ûí¦²²]×{™ÿÓuúò8@°{ îêê"ÓÙÙI[[±Xlð<™=£»èÔ]ܣ렻%.DèvÏêfÒ¼/„íiŒÇ±° ئÑÙª 4]§¢²ÇKyY–)ì—3?à-•x|r‘Ç+3c~Üt¢snHè•44Ö72ºj4gO©âß<‘ ½Ô!¨ mcŒ¶Ý>‚’_4•úãL?±³ÎðQ=¢¯Çˤ “øÂÉU Ú€‹ˆÓKßå•Z¥÷×I#éŽy÷=´ïŠ`µ·à)’>¿¿\Éúõ‚¿ýÁ !boÿ“øá}Ê:YýÜ~Þ~·Ù¶«««Óbÿ>öÆ6Ú÷‘USJyªJzé'qݼ'o"ìÒ‘(Í»÷²ãµ7yóVš4þퟴl~“èáVô>Ü•qÚ"­ÈF+Òˆ´¢D:²Üî×9ØØÊÖíõ<ÐIÉÄJªª]”N`‘oªÈÖ !žB¬uŒú%%%TVVR^^Þ§áHJ™:֜ϖeaYBÊÊÊøýþT›š¦­Bô:þ¼UtzJ¹§?ûŽ+X™ p· ÃôE‘º…§e® ýÐO8œvv™]i½%”G=‹&·ËX±áE X'â‘Õ®¶=x#=ç™0t”û ùK0: ¢¦IÔã&ê³_ˆù½„Ë|è.%šŽ¯íãÂxÍn\]MÐÕÝMˆà„_ ¬^Ìè>uÂX«³ªBÞ#ÒûÏ7%Ã{^ ®^ì”^é™&І½-íapi,ò{zÿ@§÷Ôbו’^Ÿ—–öVÞ;ô.õb¡Š.d¶ù? é–Ë:yÇ|—[^eg×ët¹ëqùÂèìP‹N$·¾®sÏØÑPžÖv¼â!;àÀSn/„ƒ‡9t°‰X§}ÌíÙS®K´¬eréPé·Íÿ; ÝÅ¢’’LýU«VI!Äá®®®?¾÷Þ{¯8p ul;fjŸÏG  ººš@ @EEÛ¶mCJI{{;ååå”——SVV†ÏçÃëõâv»ñx<¸\.ÚÚÚØ±cÇ«]]]«¤”Í«V­Jí ¯&-K÷¾×éý¶å²a Û·/’‡¢Ç_AsW‚WßÞË?·5‘pò.Ìn|ÐÍ›o~@sóa*Ê+™vâTjFVtá2}öGàû_{2ãb‰D:ãñø=Ù×¶l²C Ç`nYn·›Ñ£G3mÚ4Î8ã †žÚ~É›E‰D"cûwG…)à(Iˆ3‘®ôôì(Û·Å8|Ø…ÇãAÇEýÎ=¼²ÞEKÓxú¶¼å敵‚½ øü^ñ(-ÍnÚ RoO#BTâŽ]€°ª^þ„í/@ÌÆDò %æK|2®Þ+Þ…zö¶@¸›®öˆGðxÜ鄎öÅÒë·óÊt𻡢£a„ã'ÖKÀårujšvOÞ}n644ÐÜÜLII RJZ[[Ù³gO*”ÅÙ'ésÿ°HÓ´Ìúçr™”–¾ÃÔŸbÎÅ&cÝ@~³á®SNáÜóÎ#“p¹Ø}ÒIÉ1ÝÀ»Ø·ÏkíÏ5¥ðµ¯JNúÔ*ÊÊÞÁåÊXîñ%€ûÐÁá©S0.½˜À§c®ÿ;‰?ü‰Q›¶ÐŠES<ŠÿH¬ú3‡Vý‰÷Ÿ{žÒ§ŸÁó§g‰îÙCw2 Ûk·½È“£þ|2ZÞ9<á»Ç2ËèîêN=TÐØØÈ¾ pøµ}”r3,!˜‰Ô @HIµ§*&ñ4XÜ´›mÛÿÉŽ×vÐüR3û^ob{wÍ®ÜÒ½(`–÷Ò×}]š½GtjÙ£’D0­ˆÄß'ÛE8š µh“˜Dâ»12Îy_˜É¤)•˜®Ã©9­X f¤O 3ì]=4,WýíEv@ö0ùvþ”ñÁ†<ôrL¤›þSÃ’&ÿï¥ü¥à/t@v@ö°u_—wý‡2 À4MFŒÁ‹/¾˜³Íîîî\ƒ(çž{®Ü¾};ååålÞ¼Y¬\¹ò˜ýÈ7zôhÖ¯_Äô¶Ï§K.¹¤Ï}ÞÖÖÆæÍ›Ø28ÿÿíØ±£Ÿ)‡†Ï|æ3²££ƒ#Fð÷¿ÿ½×z9l:t(cøSO=%N=õÔ S¸¦iNø×ã¹çžÏ=÷Ü=/¹äélÿÒÒRÆëÝÓÇ{ï½Çgœ!Ï=÷Ü!}«Ðça¿ß?dÚNØC.ÒÃÊËí/çÞp ­;8dØëO~”hÝÁ¢ ?3Œ!3ÀÞ±tiQ½À9wîÜ!3À¾øâ‹Ì;·(ý9sæ ™vذaEõB人†Ì;ïÓ׳®î„âô× öúëaݺâöÝ“†ÌË ¨»bRQú“ží2lçÁ¤g;‹6 •öí‡eѼuííCf€}æ§ÿɺö ¨éµ/ÝÐ’sÚ=§^y9}2?|%Z)&½öÕϲÎR¯|œüyéR®( ¦×¾ &ämwÅŠ©W?mR___)'½öMŸ>=ߤ¬Y³&õÊǤI“¸ð ™ôsNæû'¹ñξº ýBê_ÁµŽHý+´öAqõ úWhíƒ#Sÿ ­}0ðúç0{¿ Zÿ ­}pdê_¡µŽLý+´öÁ‘©…Ö>82õ¯ÐÚÅÕ?‡BzâÍ6þÛ†ƒ³L}M;ÿ?~ÏggâøÙ}_GÊÞß°!ëÖ§¾¾^¤ÿ=š9cFþ{±tB­ëøê7‹žKgVu}Êàý¼¹@nó¿Ã[›61sútfUbôî›Ô¼§ONü~ül ·ùß!¼d#%7Ì ¾ò1êëÿ{HBÒÍÿ%7Ì ä†,>ÇÛ³oï¢äᯧîúûŸi úŽù¿¶¶–ÚÚZ>}à Ô××ÓÐÐ@CCçw^ÊüŸ+¨q ÔÖÖÊ­M¶YpÚ˜LÓ£cþ×fH´ké&¬¥›ì€ÀÆ© È ($Àª©á‚Ÿô6@=öØ_¹êª ± Yé¯tr ;>8ÚF§óF(O•âè‘~Ÿ°sçNV¯^ÍêÕ«Ù¹sç€Â}úã÷7ÛÿÛ|ýÞ9™Ã“æÿßÿ~EF0ÀÚºuÇEÀ»í{î'ÿ>óKûuO29pCÀÞÏ· ßü&óNü䥥øàƒÛ¥”Kº»»«[[[§;æþx<ŽßïÇëõâr¹2zõMm»dì`›D‰±XŒ`0H(" ÒÚÚJ(Ú$¥\l¿ñÆ3Vj÷×£ÝSVyë4]šn¯¼Ýå²M·º „&±LA"fÜ– o©½•] I8ÁãñQYYE¢–@J°LÛ©ér¡·„ûÖL1{¹•ÄUtËåÔabVjáÛÏ«3¼ú3Œõwr‚µOg§Ýgo»;_Ç)(“;ÝèàwÇ9£Ö`ŒËC¼3AUijºpwG!ÎBâÜ'þ‹^ú¾û„î‹~/ëø Ó<´Ï¸½±­‹²27%ãÇR2Ì…é…Xx1‡éÜñzG+ž7‘½ Ú߈öÁaÁ.Ü£ÆàŸTK…& QFд5¡zsá¤K|÷-=GôÒo|¸¢Û;iiwâIfw{ävo¡þƒ&Zššè<ÜJ8Zq/Õ3N¢}ß™¬ûû~>h;ÌÎ-‡)ûÔšÿº‡š/‡¨06µ‚NíDÞ}OÝûO:>heDu=ƾQ K#ãî۸Е¡_UU%ÛÛÛ· !–¸Ýîê²²²ééÇ—‚P(D,K;Ò ^¯—X,–2M{<ü~?UUUøý~ÊÊÊ(++ÃívoB,¶WUUeW‹ÝÿûÁ”:¯ÀDr{ööé žC£pu—c¹c˜þn̈•MY“&¤µpóè¦ûþ"šr¸åd+Vl¡Ö}X+‘Ý_¦ªŒ¨Ï‡t¹‰ÑR߀»µ =žÏ÷]Ñrá2Ò²pÇMŒ¶V¢;¶qZÄ-Y§¬D» y¬:àP¶úé?ÿ ûÁsO¬£\šPøúK$‡ZëÝ º: w˱=Þ¨½¼¦ÉÂÎ÷ÝõÚö^ëÿ»óé¾r=u%Ó’æí­íml mãyÝbg¿æg˜t[´ha«“ ÝDhv½@€ ß‚û‚ç÷>ÿnú5Ý\C]y9æh‹ÛcíÕA¸ì¦õ´ {·[R¿ó]F~f2jÒrp^=íprƒô®ÛáB{|FÂÜ÷È;½õ#‘H¼µµõ !ÄBˆsÆŸ2Nkš†ÛíNÕ{MÓØºÕîù :Ç7¦i¦~Œ‡Ã¸\.<È^9pàÀƒ‰DÆSk×ïÞ+¯œvåë iþÄkEî61OŽ[ tìëZ7Û÷æïìeÿÁ0‰toU¾„&°{¯ìäSSºh3"t„âàŽƒ+B¼†Ý!U¯§æ¦OŸÞ]___'¥4……Is¹S/œkaz0ˆƒb¡Çã¹o̘1½Ï?¡5ƒûNÁÄŸë¼s¤x !÷<Ìþ½¥¬[[Cí¤=èúavîÇÁ¦J0·£G÷#Â:õ;O  ÑÞBEu9ïmë¢+âEºЬѸb_D7§½"(­èÝQ‘yQ×iFp'£â?AKœC=ÐÙ÷zW”—S;±“²àÐ!H„íOwƒ· Ê+Hæ/Û¡ÜxW¢A£˜ùãÌÿþïÿvÏ;·û6&ïö×u`YãÆcÇŽ˜¦™ rîrì«…RÊû~õ«_õÞþ.W £GÿŽYLÄ2/ç€zMæpÞöílþÄ'8uýz^š0sv9ƒIì[©.REal \þU¸à‚?SSó^o‹™ÛÿJè~êSÂíQ }™O%AÂ]ÝxW¯772)¡“CX´^,Ft){õ „Û…+!Œ¤ ‹jÀ pß)ô>ÿ«#_è~|ÔïêdL3c›ŒÛ½ ‰b¶ÅpEûøCJ†'bø¥EA(¦ãÙäðþnD— _<Ù ³ÂZxØÝ~ß¼½?ê¥_91ØÝòÎ'ë(7‹«ÿºBÕÄ\®Œÿ„xBâ¡*âÙ“/ôOlºÏ-z¯±¤Ìÿ“~»38¬ñ¿óGP£²<3k°ÆÿBpÌÿ_œºŸ¿mËü¡(ÿ`÷ªÞß4Á`?ÉACHWW3gΔÁ`O<‘ciü;v,GÚøíl_§‚\Ió?ôîc±—_~¹|ú駘Þgœ!C¡PÞm‰Ø52—Ñü±Çßþö·åoû[ðæ›oöš®XÎ=÷\i^ïÑíùè›ßü¦Ü»w/ Œ1‚uëÖ¥Öñý÷ßÏ0èëºÞ¯±Xýwß}· iý²bÅŠ!;>Ò{çÉGyyyê\™3gŽè2,>Ç ï^M†ù+ëáwí§ãú·jôpɼy\!Ù¤›¿òÙ`îšgwÅ>¿³–ƒó°yz@6éfò¬ÿ@Jÿë_íßÒC²I7åÓommMµW(Ó¯ÇÒkÉ0‚e“n|ÍçÃKõ »`.ÿ†%€éÓáá‡û7õè—ö9ÝÃiغ}%éÏ»~l$# ›tóW^âF»½ý…ÓÙUkQñ2B²É0åiºâ'° ‹üvÚL¬¥‚Ó¯'# ›tóW¾íúõ«ïÓ8'½çÒÛ~žMºùË“g\zÛÏyè½^÷â}âÔ¾¾%¸)5<ðÅùlÞ¼Ùþк+ã´@ ë«fpÆgÀËRó°{·¨¾3oé9uÌþÖM\zÛÏY¹ºïû9‡\õ¯Xm{øÐÕ¿èeýˆþPÖ¿è[ÿœ{³¡¼÷ƒÌ”•ôÝ«¯so–«þ dý‡²þ D(ë߀ο!¬ÑÊú7ýÖ¿Bªïóµã˜6Þ~ûí¢´þßÿ}ƒùÿŠë³¶¶VþiO=¯#v˜>}:›6Ù'ïŒ3ظqc¿½ƒ;Ó®[·®(­ÚÚZ9«Ú6O˜j·ýðRû˜Ê6ý;4lÓ˜0ÕâO¼Í„©ðÉæ¨­• L¨¯LZ€NŸ ÀõßJî‘,ÓŠ·wÁé“ _ÿûÔÎùd€œXÔõïÜÜ÷È ÿŽY?í{3 ùGÏ °k×.9y²ý?ÐîÝ»õ;¸B¡P( …B¡P(RWr©õÏìöQò󑌗®9`î¦k_'ž` ‰Pœöp32{¢+¡§x Û,C`!ÉpFr §3–ñ¿)¡ôç:®Wri¦c˜;w®µlÙ²ýÀït]×ÊË˯«©©'¥Lÿ€p8LSSSê½cúO7ÿƒýPô¸q㨬¬Ü¯ëú/'ýsçÎí¥„€—-˪ƒÿœ–*Fñz½x<<O†élã4%‘HF‰ÅbD":;;imm% n1Mó!à%ràv\í8uç~·éòÈ;\.py$±ˆ µüš&Ð] »$ ðølZH¼f¼Dø½0û;‰G!žX¦Ý†wuµ‹Å/Ͼ€ø.ò¸ßËñì¾c¤¿Õ‰'´w,ô¤<˜ØÎŽ—Ø¶V þDŒJcöÑ:hÇ-XÜ…›ÅâÖO$$YóuÑ1åKÿ¼?êñŽàšÛÂãžÀî7£œp¶‹s¿é&ƒý–±+Šÿ“ŸbÌ4±wÒqà="Ý[Mõ'N bÊ<¥‚Ñ#Ýtì‰s Á¼ëŸ/~áß¼}êGwÏëuAôþÎ-OËPýú;ÌhŒPI+l‘ˆGqšBEE-¥ç §+c÷®.öoiEw7 ¹M\ÇIô®^é&v¸ˈƒ„àÎ]wÉPxqË?¿×—~x¨v»Ýÿ^^^~šs|išFii)¡Pˆh4J(Â4Mêëë±,‹X,†®ë”––âõzSKJJR½¢»Ýî-@ÞãïßOØÑ1gç”û“{󎾶S:Þ¦ôPÂÔÑÂ>¤'N°JL‹áÛvâ‘á÷cézj¾py –®!¢1F¼ö&ná¶MÁVâ°σ¼Ø 6¼˜Èµ 7¾¼½ãþo·þe5&ÁƈX¡ƒ»ÌDC½¾o¼ X|ׯí}OœOGù ܯI‹bßíí]mDK#„ü]Hwój#Ú¤KÒ…IÓß,žß÷ùwÓ¯éxàî//CÖXÜÑØÝmwº‘P;5  f…ÑÓ}y.e¶¹½:;À’ÜвxUCnýU«VÉË.»¬£µµu½°AJyN H% 뺎"U{·oßžšß©ýBˆTöz½>|˜ÆÆÆWš››ìììü["‘0V­ZÕë‹î'¶>ÿ×iW¬šîóà»[ÊÈ q™`_s”ŽÍ»ië²h:Å´úÞ‰„¤~¯AK[7‘¨E(ÅN°þ† ¼uÿkOæºþP[[ÛÑÐÐPÔñ—nþw¶ƒ=íIr°x̘19·wT$ü^ùÒ¿¦Þ‚Î9Ò|!÷#eû µ%€ÐüDÃ>¤¹hÃ*AÈ6,KÐt`Áp9žr‡ °´k®èEè‰S^²¼N ¿Ü½~A³IÈÕ¼†ÇZÄnúèˆ2er ¥ñNÄ{û ”L¥¶ ¹ t8FQo'T¿ñ ®x‚—Ålrþ‚µlÙ²Žë®»®àíßÔÔD0¤«««g=’æÿw‹—/_ž»þ•–&d8ü.µµpþù.àÒ|!ãˆ<õnÃàS••ŒÍi”PS—_\ð&Mz€ÊÊ-ÂçËÙmÓÕÐñ(Üt‡…}ú'°p761òù¿âïê¦+¥“n,:°1lAR‚¤:aáIDÙÄB¢!)bpW ,>%׉I¾uè›þéýDÆèº’áFyŠÞÈDŒRiŸNŸ4‰G5,Ó¾µíÖÃΤw‹oÛû£>õ‡Ÿ¶³ã1±¨ó¯+4’x¢˜2H$ÞŽ®Åñ”¶A¦/÷.`±»ë߀ÙÝ;5ÿh’mþ?Úd›ÿG#Àï÷søðaZ[[ ¼üòË"õPô1àùçŸGÚïPSSóÏ>+¶lÙr¤¥úÄù?tĈéuÞ¼y³øÚ×¾&Ÿzê©>u¶lÙ"¾úÕ¯Ê?þñ}Nã˜ÿ‡‚9sæÈmÛ¶áñxxõÕWêêõõõ„Böw&LàÏþsJßYÇóÏ?_:aPkÖ¬o½õÖéwvÚ7"ù Ù±XŒòòò!Óû{€êêê~¦ì¡»{`93†aˆŸ³âÒŸ›¨Ö1}ú ’abꊒ¬¨Ö1}£ë­·öº¨Öù›œ¾ß‡lÒ§koo°~úÃ[iíö‹a¢jø‚ärÞë˜^ Éndþ¸†¤~UïZj€M7}Å#aìo-ûÑŸ5xýtó¬Ón^á´é'Ùúé- Ô똾ŠÑ¶`ðëŸ2Ï.(^åçFZß1€9¦¯BôÓkŸ7mž@ Ï<óÌÔtÙçVJ8óÌ3Y¶lYϼ{.–ì:Øß2d×¾¡ÐwV^™£\úéµo(ôW$×gÍš5铬}+Ò–w0úkÖ¬éµ>ùô{jßЬÿ-+“Ûø‚ÂôÓjßPè/X`ÅŠ×?Uûv‰þ¬Yh H¯}»‡hýuÉõYY˜~ªö-ý3VÚÛ?½½|úNí[9DëÏ­öñ¼rõ£ég׿h;mÁàëß`õ‹©@†Éa(ô[ÿ«_hýKtCr1Œh¯ú7Øõlý¬þ`ëß Ï¿AÖ¿Áê¶þ V¿˜ú×¹Œ}Î2 ÓW¡¼ýöÛÂéùr Ëuö/í¿ÿ2±6çx÷f8;YþD=ÿ2³{!LŸÞc¼vB û¢µµ•ÖÖ©ù Èfæôé¼µ©Ç`Ö—ù?{üÌéÓM°­aP!%7ÌÈ4Ö÷eþÏoÏgh@mm­¬¯ÿïT»á%pý’ÌeË^V‡ð’©ƒgíë‘ÔÖÖ¦Îyg×ß|súøìéSïëëëSáŸsçÎeÙ²e`äÈ‘½ž%Ê¥›þÙ÷€Èiúï“iÛeXK7åœ,_€Öؘ|—nÚ/ÞœÕÃGÏüÿa"»††!¿$ç=ÕP\ œ6²ÛÎ^¦\úéãºJÿØê÷·\¹ÚŠãî­·ÞJþfÒ»×äþ ”+V¬ŽasæÌ™ò­·ÞúØ×œ?$ÍÿÎ÷Gú>ÐÞϯbüj~ñÊÿ³Ù˜ïz7„ó†!üBò³ŸåÎý…ÅÄ_ú!ð(V÷t¼³¯&þ’øÕW@à‘_äÜN¹B Ç´ï„€d„dãÿÓƒÀ6ÿ›ì¦}d›­™ÆÒ=#E K–Ø7Y»w說¡!20'°ƒ¥{Ff´±Â˜Âüùóþï‘û#Ýüïv»ñz½Äãñ>ÍÿÙãËÊÊRÏïʬݻY;}:k7mâ×ÉðS€óæ¥>ÏÎq´¯–¶ù~uVhø@Ìÿ·dŽïïÜÊø]o|òÓ"R៛†‘ À~x›a0µiû2ÿCÏ5¨åºÅ…Jcß'»ûÌôpLÃ0„ó½U±~ðC&Ožœ pÆ«0…B¡P( …B¡Po¸Ò?\É¥‰'xf{ þûFò !¤øÎž®÷ ‡öcJ“°ìĤÇ;ʰ½àΣæ&§ƒäaŒà f0žO¿Aš;w®¹lÙ²àq]×­ŠŠŠk5M›P]]ÍÁƒSáwvv‡±,‹x<ÞËY^^ÎèÑ£ósƒ®ë¿Â6ÿ7Ì;×Ì¥}ã7Ê|°]Jù|,Ã0Œb±Øôh4JUU>Ÿ/e´vz¢NÇY§'àp8L{{;mmm„B¡M¦i>$¥|h¿ñÆûü’eËE±¶ÏüõØW*…ËÃíšf›:½¥¶·ÑSº&‘ÜÐ=v0€ðD¨¼ÇÁ`aÆå±ºDw™ E‰\üÖâ¹#KÓ?¢M.b±[„…[°{ÂMÎwxfò•Àvøê€hÃ6kzÓÆE0g!‹Åíô«¿ã…SÚ†Ÿúôb—i£9x{ÔÚgÔ$ömòQ2ÞEÅHh}?DB–2é³£hî ÓI5B3©¨FEÍ „;CtµY”zÝ4¼ò.±ÖÐÂaO]üÎ2¿ú{—yÛà+‹ÑüÍ{Õ˜ñˆa•X5'ýÔÉt)ÁÕå%¸ó±`%î©3þõ·øª'ràÏoP1æD¤g,±::½Xz ! #m­‹#mwô©_UU%ÛÛÛÛ…Ïx<žÊË˧»\.‚Á ‘HŸÏ— ˜p/*++Ñu¯×‹ËåBÓ4|>ååå”””àv»7 !žÚ«ªªú<þV|rGÛœSciÙoOÈŽù@X:ˆWõêif!¶ù?ïö^ŒÉ3Ïû¦y¯ S_–UUÄü~«غ2òÕSþuµK¸+,¡ÿw§©m–q`OS ¬<æ‡xBÒf$ýÕB€n‚&ŸÅî]ýÍý¯=™÷× &´544|üåêi>‡ù!¶ù?ïöˆß+_´¯êNÀß²)뉆œ¸Ÿ8ÐM´<ˆ7X†ÔÄÊö E3¡˜Ž4L¤0Ñäp\Ñ Ñ§¾"dE@_ß}ºÒÄl"r5/âTÀnÈNag+~o&áý {aä§îRð&×Þ Tï›cþ_/fçï}ý—¿üeÛu×]Wðö/Ðü¿ÛüŸÿüóù"TWodòäÅhq +W ReòÉäÃL“ú긦¾ö5Éü™I“`øð7ñûC¹'¶¹Ú‡Å¥ ûlÁûÞãñ0aÂ^}õÕ!Óß²e‹˜={¶\½zu^}·Ûí¾ êœÉõP〠hJ_éHôüdaÉ~\×_é§=qâD pï½÷°gÏž>çsÆyæ™,]º”›o¾Y&‡µJ_é+}¥ÿaш6 ô?ú0°koz;… Ô×׋{_¨•Pÿ¡Z¥üéºl… ?’šG‹BÍãÙæéß³Û¸ûî»SÓ† ¨ªª"ûwl',oذa)øôéÓ{MÛßrÕ×׋µÔJ6eš·'Lí;ìvf2 àO¼ ˜0Õx@ÒtŸAÒTŸ Ç€¾þ÷=¡§Oî?4 ÀMÆ©åI×Ï&ÈZ†ìpúÎ|ÉËš5k¸è¢‹{ß;ûl“6N@v8@¡ÔÖÖÊ­M½ÛíÓð?cFîáIr™ÿ}"7åóXç/C®Ÿ;–ó—!{LUùÂr¯FIeü<ù ×}Í3”0éfòô¶s-c®^àóÕ•þ‡_?›þŽ»Á¶7H®X±BÌœ9SVVVÅb|¨1 Cüëc¹é,ƒé7ÀwôîÓìcís²ôî:B·ö*9œÿåŽô<éünþ|øÞrß?ÉÍïæÏ﵎ŽñÿЊQIóµa"°úQi†øÝüùòû?û½7)öÛmæ!;à ™!6c“ãzwÌ‘møwpŒÿ@Nó?ØubÉ’%Lœ8‘åË—§†gTÕ·0'°#cÞy›åo\ F=÷É?ýâaÅ rÕ¥Bw²#ÇÄ_VV–ñ¹?¢Ñ(&Làí·ß.HÏ©£³vïN…¯d*üzéR®™7/õ>kæÍãš´áÙ¦ÿž#C~^†!nY™ÿÞ }ÜË€|xÙ0Š^š²…L½ïºý«nçž±¯ûÇBî=N®0¥ô`€bÛq‚r}g¥P( …B¡P( ÅñBÎÞŸà·Ibr„еº¿ÕÈ®Ñïó6­t#±ûÏrcû¼»±¿}3Óš*£‚“9…‰L:è§ìñRJÑqíÌgþOgÙ²e:0˜mYÖw¥”gF"‰---466’Hdvâír¹¨©©aذa¸\.|>š¦mÐ4m9°Øß—ù?|Pª€/!¾ïñxf•––â÷û©¬¬¤´´4—ÁÓ4 …BtttÐÝÝM("‹­“R.Áîy½ýÆoìw.Ú¡4]ÞlYü8ÔˆtÂö”jDÂD”TÏÛÒ$b`I{?˜qiGO iBÔmûj´¨žgåÏàæfL~Œ…½Ã- f/‡Ý³uÚßDr¼+mº`’:qgq=ߎ;}iÀô޹¹¤lÔËÇ~ÍWÎÉçxñÖè´½£{OˆŠ3*Ðüüe'o=‡…ÿØ©Œýì™è“ýï|@¸µqQçÞ¶ºƒ»¿[\Ï»î«çãæá“§üØëõÓÙÒI÷ÌÊ|n:6G‰½ó7Bqi´!Û[©8y¡x5cÎÂ'ÎðÒüj#¡½­hfxÑÞ¿?VK ÒoooORÊï[–5+‘HÇ …B„B!L3÷!¤ë:¥¥¥”––âv»0€uBˆÔñWUUUÐñ7gç”p3ð㾦 k dÿ¤– 2v¿=P³îŒssP÷—"z>–gžWœ)5mt¹f'ª|PâEëâª,%îuáŠ%ð!„”èñ´Õ²LHDÁŠƒ”«AÖú3ÿ§sÿ·ú_ÿŽz¨¬µs‚{“Ën•È(«‹€º»6n/êø+ÿ+ô4ýͺ¨ ž_Üù÷À5qnvðãÖˆ' Ë ‰dé3c \Éå2!˜ÜýXö6ðVÏ ‰u…©{á`áú—]v™æñx*+**Î*))ùjMMÍÅŸúÔ§Æ9’ÒÒҔѿ££ǃÇã!‰ „Àëõ’H$رcÇþ>øàÙ¶¶¶UMMM"‘ˆ‘ÏüŸÎŧ|cX“ë×ÂumŒ`…Œ'F“(è´±ÑMðÄí¿ºµJy7‚wö¿ödA×?€†††~?—Ë•ºº\¶éY½¿1cƼýý^éGšŸ‡Ð¤qžÛÚŠt½DÈÛˆ©I¼]¥h 7¦+N¬,ÂÂr÷la Ã;=>a {Ià¯è/ç3ÿ§#WãÇâóÄY@„óðø!2Ë ¢AÛíO9 ›l‡}xË’Á ÜQ¨l„òÃàŽ¾„ž¨Cðræÿt®»îº~·¿išèºŽ”ËêóÐZÔ-_¾¼ í/¥tw—ÒÑq ßâ½÷.ãùçÇòòË @ê—Š 8÷\øò—pÒI«¨©y‚ÊÊ-øý!!DA ÏOA`,Üì…DZ/åÁä+‚mü&ÿúé¹ Ø9@“ïKa‘ê~JqõçñÑ?íwû7º¼Ô$¢˜ÀA—K€)2™u·íýQQú‡Œ‰ýêW”5ÒÙUƒ&å~;#^ ]˨‹€:w×?…B¡P(ŽŽñÌÁ1a¬\iw'¾aÆ cÅĉS&¡+®¸€›ÓzlƒâŒG}Ã0Xt…Á-+ûï±çã¸þ{öìÍEÏë¯ô?üúÙÚN{É6ذa`ŸÏ»ÉÏ<óL&Nœ˜šÞYÞb–Aé+}¥¯ô?lúÅj”ôkkkå‚YõÔ­­íày<¬ νi ëáù\{¡çú[¬ûx<þ”þ‡GÿÃB½eŽñ~æÌ™©avoÀ}ãLÛßtý™ßs™þ¾öµ¯¥Þ744°aƔѿ/ªªªpêÑe—]À­·Þš1M{{{Æ6©­­•·Ìªâúe›2†­¼Å6„;«X·6·¹|å-õ¤o†¾¦sÈÞ&¹ôá7ò­‡¿3 ýï/ûM²Ýÿ.H?=ÇÎ9Ç—<üõŒÏ‹Ïñf|¾þ[¯Ùí치º+&qßK]ìØ±£àcÙÑwB²9ï¼ó2>ú†2>?™¼þ,[¶¬_ý¾Ìÿ¾Ú¼éÉOYAY­Å¦“M̳ެÑJñá'—qs ôú¡ô­þG‘9sæÈÖÖž`Ö­[÷±^÷¡ úø0i;÷c/¼ðBjØÆS÷Pé׬¾îÝÒç]¶lO=õTÁP@@yœõuåòЊQWÞ(£«í5 @ÇwïFŠýùEAçáÈ‘#%@Us5:¶ù¼/s_8鯠—ùÞÄf¹Â˜Â’%K¸!ëþ%;à»ßý._ùÊWúÔœ?>_üâùÊW¾Â’%KX¿~=+V¬È˜¦˜ãåôÓO—ŽqÚ ˆÇíÇØ&OîH•=}1æÿ\ ¦±®r0;9õj ·Øo‹YîTûÒ–øŸ¤Ú*¶½@@Î3ŒÔxXèû7´@ _6 Î R!…|ø8–5V¡P( …B¡P(Š}þSýÏh&‰€„“ãD®JÿW †½Î+ìf; lã¡L6¡ãâ¦p6ç ­.Üðà} xׅ˸’K 2_:,[¶LÊ©RÊÏßNµ,Ë•mþwHžÀàwBˆ¿Û€àܹs ÖðÁP L¾,„¸J1UÓ´lse/3 ”r›”ò1ày`;Ð}ã7õeÖWê5¿™ 2Ô©Ý©ëòZ $¢Ë‚®vA,*(-—x|`Y bHÄÁJðˆ§„;„FǶKc3Öåÿâ'N%p'’kžn}-À¤'Àé8iÆâàtˆ; 7^¦3úóëý¥¾ŠÊ©_>õN†é×ÖŒOT°íN"ï9åK#il‰RÿÚt½» S Ü%Õã¨6â‘ÃáУ©c×ë_þ'.Ýé/UVY:¶âÎX©¸ÖÑiX·ïIãñ&¿¿ŸpgîòjNÿ÷ÿ i[‚ê)4¿¢b„õH´±é¯ßß±ã™IEé···§Ž?)å—«’ïóMH;F· !RÇ_v ý1gç?P¹Spg`xóµe~»+nïñhqROß`Çïºz¤íýÅïyæy.`0KêâF`:W –Û š}jfr•¤´]éqÇã/7kCb˹‹Fîÿ–½þ²RÞÚ#®%תow:n% c Aš½êBjýïÚ¸}@Ç_ùzü<ÿHž…“Òž?°óïkðwuPéñqgW×¶`tB"rv-ÀÞôÒ„DºÁã)ˆ2î]t<±£xýË.»L¸Ýn0²¬¬ìTŸÏ7ݲ¬³fÍ:¯¶¶¶Ò4ÍToëáp˜ööv8Ðùî»ï¾èóùÞŠÅb›:::¶Í¡P(¶jÕª‚ýY§}OÔ»Oªˆ‹D¥%\³d"z‰æI˜a»Öõ‰´Mÿ%Ñ=Âe¾lGð`ûþמ,"AÀ¦¡¡ÁT !îÔuýZçÚãü=?´ä¸.¥öÿ˜1cŠÞþ~¯t#Íà_ öŸhiqb¾•Xú H¤îlV7zì,Ü‘9t%ÛÞ_€ø“@o쎊‚ÃäjÜXØúšø–ëD4ׂQ¦Ä6ûûì4Ë6üؽÛÑÌ_BÐ(fS”>Àu×]gŸÿRÞiYVêüsjl?õ8µý—/_^|ý‹DíMìÌ7à*°/ýQ 8´Â%Ðñ? ¬þ<>ú§vý‡ïlÕ«® ;}|t<ŠIhrû€•çø¿mï¤Șè*·bÞùI_ûµ£Üöµ¥³{4–åFˆ•eM€DÓz)}÷® …B¡P úzÐ& Ú€f¹³or=°u<èWUUõ2 ü€is IDATOë¯ô•þ‡I¿Ø‡ «ªªúן9Ié+}¥¯ô?ªúC¥ýaÓwîÉœ¿G[¿Ðyަþ`¯½P˜ûúþJÿøÐÿ°2TƇþÚI7q $ ß´…˜¾òä¢ý설÷ÿÔSOõ¹lŽÑÚ̶Ìê1…ç3õ;AW,Êp¤õg^ÿ›>Íÿ¹ôs‘ï¼4ŒàôØÃŸÍõ'?ÚG;7QwÅ$¬Ü]Ô9—Oÿ¢‹.ÊØ·ß¸÷^ê¾þõœÓ®Y³&¯~úñ·ë–=….Ú< ÌH}¶–n*x^è/À¡¿ €ôñ*$àãÄPЇ"OúûÁÔ ôèmúO7÷Ÿ~úé2{[ŸñúißüÌû^ïfø-±ý·UƒÒO úø+ÖøŸÍILqÑä*/¬Åg§FjM¿\|Ÿø‹üþ—gž§c¯¯¸¸ »äâ0¶é¶é4,6¼X´ñ:›ÿ¹ñ“îîÂ;,Ö"dÏúËŒš±þwmÜ>$Ç_ùzÜ<ÿì@ƒ³û˜4C?xþМ\ƒÛhÅÕÖ N`­€³7ÌœNJ^ß½— •ßÿÚ“ƒZ†}ûö¹5Msiš°VÊžã/ËøŸ±ÿÇŒ3èíï÷Ji•åRˆÛÀü6XÙ×Þ$ZôÇ@.‚-XÝÑÂzÏ…\¼ÊHÊÛ@|)rë ù°"–˜Í ¶ÿµ×^ë¶,«èóoùòåƒÚþRJA"¡aY%1Óü"–õu„˜]/n¤Ü„¦­@××!å~4-ŒËe 1ðí°ÜÝàêÚ`m%œíˆ ì±dA~}'\ІÄ34õçñšwÖF¸ºµr{q¤<;µâyŽÿÛöþhHôŸ5Æ»§•´ºj²ü׳·ÉŸ\üÓcòÔÙ?O4þå—_îÞºuk `ûöíãN<ñÄŒÏ}Ÿ6mšçé§Ÿ¾B¡P( …B¡P( …B¡P(Š.Ú±^…B¡P( …B¡P(^€<ÖË 8v¨ý¯P( …B¡P( …B¡ø('Ž™¶iš$ÇΟmšæ1]Ë2ûÕ§ù?{X¾ñ~¿?xŠ]®|æÿìaùÆ?>æõz‹ÖÏgþÏ–oüÖ­[c—_~yJßï÷‘ïlý~¿ ä1¡y„À´¬c)L×_æþö0¯ùß!ß8€°pa7~¿? ¸Ó^yéÏüïo\úøñãÇG½^¯Ûyõ§ßŸùß!߸²²²ô€èå—_îöûýrò7ö :À1û§¿þí³WO½Æ FG¡P( …B¡P( …B¡P( ÅÀT€züøFíÿãµÿoÔþ?¾QûÿøFíÿãµÿoÔþ?þPûûøFí…B¡P( …B¡P( ÅG —»_OöÅírSýc¹þBôTùß!}šÓN;-ãýÂ…Ýüð‡8!±)S¦Ä’m÷¹Â…šÿ/¼ðBú›&}üøñãcÎ+_@¡æÈ4ùgŸü=ã_xá…ØäoìaדùÒ—¾äÉÛpü~¿¼ê Áü/èÌÿ‚ÎõŸÑ)÷BSÆôÔðù_Ðùô8kÐa …B¡P( …B¡P( …B¡P(Æ€ÔCàÇ7jÿߨý|£öÿñÚÿÇ7jÿߨý|£öÿñ‹úàÙW²×ÿãº=ÔþÏÍñ²ÿõz)}¥¯ô•¾ÒWúÇë2(}¥¯ô•¾ÒWú …bôÑ ýq"L@d&eþOÇ1üŸvÚiæÿÅ‹áöÛý¼óÎ;©6û (Æüï½÷¦BÒ‡§ÿMçÑGÍÈP¬ùß1ùç¾ëɉtuupàÀfþg] ¶nÝ»üòË‹N}ðûýÒóÿ³wîqQœ÷þÿr1 ÎrM4"Q£Å@Äܽa¬ˆõdÕ5ÖZâiK,‘ ‘ÆCƒ–„FÎiÉ1j9*­Ñš”K0‰IÄãeWñ‚ ¢"($*°ûûcxfgö*s¡áy¿^¼Ø™yf>ÏÌgØYfŸÏw\€GtÁ“ÁΘé‚W§ ¬w°®ðõ‚7æ ã~õŒ¤E( …B¡P( …B¡P( …BQƒ{*@Ûg  §þÛ‡úÿãÜß;…úÿãÜß;…úÿãÜß;…úÿãÜß;…úÿãÜß;…úÿãÜß;e øO˜7%Ví.ôÈß„TÛûw8—جMjw¡ß0ý·Fí>R}ªOõ©>Õ§úµTŸêS}ªOõ©>…Bé7wwõÄÍf¸»ßóÙ¥WuÿÍ–â|øÿnþ׬i· ÿ qT@þïÒÒR¤¥¥¡´´”Ÿ‡ÔÔTÑoxá…Dë:* ÿ÷†——b^i…ü…óIÐßËË ^^^˜ùAØK-¸º?Šo§E†ùÜgîëi&!þûÜœð‡².,.ìÄ4Áß{>\€âå÷cYÂCÀ˜)ÀC=Ž…q!È™=øNv‰B¡P( …B¡P( …B¡P(ŠÄÜS!¦S¬ýøQ0£¢ÔîB¿a@úÿÅ|µ»ÐoˆþϘ1Cí.ô¢ÿ—ÏP» ý†èK1ýüGˆþ—.š¢vú Ñÿ¤¤$µ»Ðoˆþ\¿X–uê½åaaŒ¾ÐÓ¹$•†TPÿ-üXý'š3fÌPUÞ”XUõ TÕ7FE©ªo:ŪªÏfmRUß`¸ ªþµ §TÕ_öjŽºçÿ»:Uõ‹¢Ô=ÿ×±êêo›`RU?scºjŸø÷ 6EÕcþYªúY~ªêOŠUU?EeÿOt<§ª~ó¹Ùê^ƒ7ÌQU—QÝ÷àÝkÕ½©ª_ºhŠªú-ÅêúùñŒ~w€Bùw¤«³S5mtvv©ª¯æþ;;»ˆ¦gÍš0w´¾0üO°ÿ Ñ:VEDÕbc¹‚¶gÏž>ÈO Ó$ü/œÎÍÍÅÚµk‘››‹ÒÒR>üOBÿ«""ýùÙÇ{Mö÷—„ü/>'šgô€™´áƒƒmh9Q±²oÝEVŸðôô4—$¹áó_»aY¬3&»âó´@þç¹~€·0<x0 œüК€¨Û@˜¢#À¡dW …B¡P( …B¡P( …B¡P”¡Ït¸…ë ðž þ[ þl¨ÿêÿÀ†ú?°¡þl¨ÿ›âÿHõ¯ö'ìy!Õß‚pÛ–ëÔ/þÖÚ¼ÕîA¿àÇî¿P³¤¤DTôMØ7GëJ©¿³¢ó¦Äª¦Ÿ˜˜ˆ‚‚Õô5z½¨è¦ÒúÎãQÑW¥õ™Ì%`³6©¦¯ÕÃ`¸ š~@ð8\»pJ5ý o§cÙ«9ªék^.„ñ]jú zEQêÿ+ëXõôsƶ &Ñ2%õ³’r¹1]Q}ë>0LX6E´Lî>õs¦†#ý³Õô3›Zè§šþÁª:LŠUM?ÉCŠŠþGºîʼnŽçTÓ÷µÍçf«¦¯]¶† sTÓŸ«a°Ë¨Þ{ðœ´ì^›¨š~BBŠŠŠTÓÛZ!*<ª´¾_<#*|«´þ°¯³E…—•ºR(?6:U Àwuu¡³Ke}÷ßdr|ÿ¸§"Z­VþÏËãæ÷þ'Û%÷oF}Ë‘F\\RSSùOÓäuZZ?oË–-6ဠà¿þúë€#F8Ô·.`òokkãçÙ ú¿2øGpøO^ü<²ÝÜÓ|‡úŒðöþ.Üt¹¿œ¬Á?õB˜W¢!ì±4ŽžÀ °À·† tþ° §Á^ªÆÍ6÷y¸"ÄW²!† …B¡P( …B¡P( …B¡PîA}ÝÀò _Šžü›cïKv)[¿îG¯ïÀ¨Ý Õ°þsXí.ô ªÿ Cÿöëÿàæ*µ»Ð/¨þŸipVín¨Î@õ¿Õ­^í.ô ªÿŽàOÉÉu%ú æ¹o­o}LæM‰ÅΊJ¾]_úKÖ'ÛTêïþ³Y›Àd.‘Ô²Mµ°î?ùŸOTž˜˜(»>¹ç&Ô'E4z½ìú䞯PŸ`Æ1²ë“Â#B}R€É\"¿¾ŸÉFŸÐjƒå×ïøÎFŸ'»þ°á6ú¤(À†·ÓåßÿÖ÷asþwм\(»~mçM"}R A/ÿùÿì‚P¬üô[‘>) °’‘_¿mÈtŸ‰ôIQ€…Çä×ÿøX5ˆ.ùMŠd%åH®ow;QqÀ…<ñ{Pw(œaòd?¯\ñ1 Er¦†Ë®ï¤šZDú¤(@& »~ü£8X%ÞRà`Uìú„>|+Ö'EòðÿRH pI¬OŠD2{e×ä»ÖïÁ¤(€ÿ¨=²ë_¢K~“¢Úe»e×/ïÎ. õIQ€¹ù߃‡¶Ùè“¢sÒ d×74°6ú¤(@BB‚ìúä¾£PŸˆÛZ!»>¹ï-Ô'Eüâå÷Ÿ|ï"Ô'E†}-Ë5Bù±áîî®®¾›Êú*—²$F£F4ÿˆÂÿÀ…ÿ HLL´iCÈÏÏGrr2èOMMEnn.JKKù6€ÒÒRÄÅʼn~„ÓgÏZ¾'}ýõ×ñÖ[oõ¸ÿ{MÀs‚ü¼uÈà‚þ*ýIqòZ¸=Bîé³H}hŒ]]OOOó AÎô ·ANd€û§.í×€N3:MßâÓ  îlµÝ\áâ ó÷ß© @§Éîö) …B¡P( …B¡P( …B¡ÈË]—çeÇOìi€¸”(¥s§úÖÓü`XÁ—ó÷ªE¾¼>uKM¨ÿ½ûOcKé¿ð©ojBý¿ÿ¿˜/š/‰ÿÝÛTêïþ“0Œ”þ Ÿº©&ÔÿÞý'ñ¤ô_øÄ5¡þ÷î?*¥ÿÂ'N© õ¿wÿÉ@d)ý>ñLM¨ÿ½ûŸ””$š/…ÿd›jBž@'œgïiÜRs'ÛUêœ ë­ÿæM‰…uPŸaî-üm}Þ8zê¹£i¹°ç¿½§qKÍ¿ƒÿlÖ&Xõ¥òßÑSÏMËMmm­hZ§Ó¡¤¤%%%¢°‰\Á#DÓ+t1ØYQ‰•Šè…‹¦:„ÄÄD$&&*¢ßÈ†Š¦ËCYhôzhôzEôý®ç‰¦“[X8cà<ŽQDå¢i6}'Wt#s‰"ú.âP‚¡±Zm0´Ú`EôMCÆŠ¦¯Õ|ƒ€àq§ˆ~ñGëEÓo®ÿÞNdž·ÓÑÇ ñ¤q Í˅м\¨ˆþõ.ñÛmnD ô ôÊœÿúCâéã3}°’a°’QFß½J/šÞøôT,<挅ǜÑÿªCüäÐñ¿™‹¬¤d%å(sþ€þœh’ þ'& “§H\nˆ¿`—V gj8r¦†+¢ÿÓÅãEÓo=ŽÌ¦d6µ(¢ßî·B4½Ä«êp°ªNýÑu/Цs|rÇä!O!ÿ÷ß*šþäÁIˆtÝ‹H×½Êü ¼!ž4YøÚÿQ{ÑêðjÑtñ–h—í†vÙnÕ>ÍÕ0˜«Qæ=xsy£hÚ°aæ¤`NZ"úÆZñ5àÍõ!!! Šè‡ƈ¦·/ CÜÖ Äm­PD|”¸ ßMcàÏÀ/^ÿëω7k ǰ¯³1ìëlå®Ê¿9&“Š·’œ`6«’vrRwÿ¼3 ƒùÂоþ'!½…ÿ{ƒóóóó‘››‹µk×òáÿ¸¸8ÄÅÅ–,áîõ‘i6áÿµk×"..Nþï a0Ÿ„öÛÚÚD!2oz°>ý•x>Y&dïžfžžžæÇC\ð-ƒ5‹&!|Œp¿'Xo/|u¾_í߆¯þõNŸü'nzv⦟'ºî»pq‡‹“†´ûûÕîì-°lÖÓ" …B¡P( …B¡P( …B¡(Í]°7\NȃÀM§X˜Nqƒa…}’b¸ó8¦Çã¬f@NÈþ£¢`ŒŠ‚Fo#•ÿ½¾Ç㬪ÿ‚pú€öÿ‹ù0~1š§wˆú$‰ÿOïèñ8«é¿0œ>ýŸ1cf̘’’QŸ¤ð¿¤¤¤Ç㬦ÿÂpú@öÿòã¸üx†}-ê“þû:»Ç㬦ÿÂpú@ö¿¥˜EK1 ¿xé?ÿùÅ3=g5ý†Ó²ÿ¥‹¦ tÑÄm­õI ÿã¶VôxœÕô_NÈþ'%%!)) 7nõI ÿ7nÜØãq–{ßím_x‘7 í`sQ¸Úêivööh+qXïç ] Fúw‰ÂÿöþNîfûööc…ÎzžJ ò·×—óSù§q×6}'Ðæ- ÿËá?›¾“­¤ÿÖïsGŽAtt4ÿÿް i;cÆ É¼°ÖÏ®mAF˜_tCX€´7%V6ýûï×àêU# PPP *@ÚȦÿ·ßb‹¿IX€´5FEɦ¿:t5V×­æïw Ãp¤­é+›þÆø'‘T|€/º!,@Ú²Y›d÷ß`¸ƒá‚¨ ik0\]ÿÚ…S¸vᔨ i{íÂ)ÙôÉßÿ²Ws°ìÕQAÒvÙ«9²ékþÌÀø;Æwu0¾«àÏÿwu²é¿yúÞx(EQ,Š¢XQAÒ¶(J¾óŸüý¯cY¬cYQAÒv+¿þ¶ &l›` m·M0ɦÏl,›ÌéÈܘ.*@ÚfnL—ô³€M˜ßeÿ –M˦ˆ ðïAlŠlÇ`H¡7tF¤VƒôÏjDHÛôÏjdÓJ.‚>?Y~È ô m³ýdÓkÝñúÊ×0)"“"BEHÛI¡²éÏe4ØÅ‘¦ …M mSdô?çÚ¿ð,Nt<‡ω ¶':ž“ï=ø=Æå,šÏÍFó¹Ù¢‚¤mó¹Ù²ë6ÌaÃQAþ¼aŽìŸvYì2Úÿ ´Ë(ß{ð;…‡±BƒÝk±{m¢¨ i»{m¢lúyyyHIIAQQŠŠŠDøk`Q‘lú³wàPÆ|þž›° i[ºhŠ|ç߯c,ÏWX€´m)–Ï­y7 Nsøï„HÛËg(vOŒBùwÄdê꽑L8Á ]&5 8©»ÿ\Ñ£Gß&ófÍšàΊÜ)=­ïîîî1bÄ^?6–+´úÖ[o!99©©©HKKCjj*ô_¸p!RSS±páB,\¸DË ¥¥¥HKKC~~¾CýŸýìgUUU¼þüìãÜö¬ŠxyÙ†ü.èoo¾——F-¸///>ü¿ÀÛËa?.üÿþ6W¯qèÐ!$&&J¦O ?ÚÛÖÑëû1;(ˆ/¹ÅÇå¡,4z½dú¤ð¨½m-~3…/Nººn5’[¸"¨Ré³Y›ê£Íë 5 m’Š€Mß &s‰dúÃÇú~&45}ÒæêU# uÐjƒ%Ó¿vá”cýŽïà|ó H›«W¸Vó ‚ÇI¦¿ìÕ‡úÆ"&NÒ&::o®ÿÞN—îüWçP­ïÁ/‚´1þŽ…q ÍË…’éE9>ÿk;Ç`‚{5H›7 @nD ôÒÿëXÇúÏ.ES]H›->>8>Ó+éô·M09Ôo2®#[@ÚlññÁƧ§bá1gÉô37¦;ÔÿøX5r'>Ò†MŠÇøßÌEVRNŸõ…}`Ù‡}@T€ó mXöÏ`ƒÿ ¦ûiðRƒôÏjê¿Vp kþ³¤Í ìÒ äL —L?+ÐÏ¡¾s{²€´Ñç'à­GÑÙÔ"™þ¤ˆP‡úñ6¢ü“ m^_ù²—¸ã`Udú)=øÿ@èøo‚´ÙÅ‘㓃< ý?ÑñœCýK!-øy£+H›ô€gñɃ“éºW2ýæs³êòÝŠÎå‹@Ú—³0YøÚ#Ý5xÇú‡ ~üb6Æå,Š·¤@»l·dú»ŒŽßƒË»­&¤ ù 48§ú IDATW#Ý{ðõƒ‡¶á™˜1 mVèb`Ø0sÒ ¤»9Ô74°˜Á¦ g€¸"íííNíííN»Nšðôúëx:õs<½¼yÿkn°üϦ¯Û±bo'®°€§§§*ï …B¡P( …B¡P( …B¡ DîùÉ„„Õu«Ñâ‚|?.ødÔèK笷ÓÛ—}ÂvÖÚöæÝK¬ûb:ÅbÂÀS]à°/RAôH¡–µžûÚ[?[||0œ©Ã´ºé¿1* ÷×£¹Úr „}‘ ¢G µ¬õ”ôÿR~ζŸÀ´ôZ¾Êÿ/æãHA)œB5ü1öE*xÿ» µ¬õ”ôòäÉ@aa!ßäÿŒ3ÐÚÚŠ°°0þû"DjYë)é¿Ái‚F™¡©)æû1ü¿üxܾš—ÑÿÃa_¤‚¿é. Ô²ÖSÒã1'õ±xrÉY¾Éÿ–b.þÀÉ3–c ì‹T=R@¨e­§¤ÿ‡2森é0|80¯ÿ¥‹¦ Þù~x:Äa_¤‚è‘B-k=%ý_¹r%X–åƒïÍÿ¤¤$„„„àüùó6áÿ¾hÙÓ&z€¸Ð€µžRþ?Æâ¹Yá(® åêr€2oJ,FúwAx‹×7÷º©ú$ìÏ ] Ž”á¹Yá¢>HyþÛÓ%¯oÆæ—üym¢+w!a_nå\Åí#îèŠ,²ÔðŸÍÚ´yÃåüT )ÔØk"n/ƒlúN öy·¸‹ú ·ÿ¤ày0Ñ–Ó†áŠâf‚‚¨­­EXXjk¹ëÑ‘#GøþH©?oJ,ÿCÂþ#ý»àqänFÃãÈ@vm‹,úü€töGPP8êëk€{:»úƨ(¾¸$ û½¾l(†3uhd¹ðã ß~+‹¾éË7%aÿå€ßõ<´x§ðOÀ]ºZ}6k“å=¦;ì6o¬|"ë¾jÂÊ'㟔Eß`¸­6ø°?üLtÑ ©Ëˆ@Îw¹ü¿vá‚ÇöGÇw0  çg`2VVýe¯æ`ÃÛ\Èš„ý‡ DñGëÿ‹—PüÑzòýýßÕAó2wσ„ýÑú>pÀp¿hþl¹-¥~Q‹=·mö¯íƒë]fx»8áz÷ýæék²è¯cY¬ì.´IÂþÏ.…þ5ÐâÚÊõ÷¿m‚ qõ¢IØ¿mÈt¸Wéq+" îUzYõ37¦#+‰;ïHØÿãcÕøª£ O¸ºà«.ÈÄl´Ü‡’JŸôeSÀ0yÝÛçÂÞˆŠô瀨QÜo ó;ÉûÀ0\€œ©Üu†„ý_+¸—Qè¢‡Ë îº üL ¥~V 2›¸ë+ û;iðÓÅãñÏÍ'ñÓÅãQÉE²èOŠÅÁª:àÃþñ6¢Ýo<[ÞA»ß À[ëþ(‹~ ›‚¼nÿIØÿÐ0ºîET‡¾Ñu/æ2òÿÏ!Òu/ðaÿK!-Ø{(&»}‡ý·‡r®ýKýæs³á?jðaÿA¾[7¼ î7Í{ò¼6ÌvÙnàÃþ‡à©Ã«ñeÌjìoh`a¬ÕCc-w ÈË#ï‘Òê—.šÂØ$aÿV·z„Æ ®é0B¹âx³wÈ¢ßRÌò^IØÿLk,ÆGU⤞û š òœ—Ïà “°ÿàæ*ÔŸsBÐ(3êÏqrZónÉõ­û¢»m)D]èV(›–#}ò?¾Ø˜’úFÖ¢¯a”×êþôÝÅÞ”Ô7ìÿ$Ž¿ Ø­ÑhîYÿµ¢4óÖ*Öw!“–?j?~>\¶YýÐAæqãÇcoæ'ªè{Mõ0»ćÿ…äççcß¾}Ø·oð¡~{„ó„Ë ƒÃØ·oL&þò_ÿõ_(**…úãââøBŽ;†mÛ¶ñÓÖëØ+PVV†ÊÊJ8;;óá!¿ßy ;2Fcc#F-¸8·=mmm–ã×ôÎ÷òòBÌ+m`/µàÜö`l¿ÞƇÿÉ4ÚÅm¿ººš÷ÞÓÓÓüË'<‘8c†š€?•~Œ}ÿº ÜB€—ÊjLhooµ€_>ê‚Ä .æí„?}Þ‰Û]€áŠ Ç¯˜áê ¼òŒ ÔuâË‹N¢õ) …B¡P( …B¡P( …B¡ÈƒóÝ®`ï‹¶/],ƒBÉ d)¾†-¬ƒ›N±Hna¡5ŠŸˆNÚ‘×äGªþ5’[XüÁƒì`þ·×g)È÷cð¥ øýÖZ=™Bmû…ð)eJøoŒŠBy(‹ã3}øyJû_ÊbO=÷ô[ëð¿\þO«cà?:”ßoò[MÿÍuF¿˜Ï÷Cÿ¿˜òœ0”-SÑÿœ0´çž‚iþ—ÍÿôZ˜ëŒü~“ßjú_[[+ …(âÿŒ3 ÓéÍÏSÚN‡Û·o€Mø_.ÿ Q[[Ëï7ù­¦ÿ]Õ¿„ð 5Jøùñ ÃãÑb.âç)í¿1<Íßœ›ð¿\þkjŠÑUýK~¿Éo5ý?¶Â'$)áK1÷”%ã7ê}þ;°i \FpˬÃÿrùÿä’³?¶’ßoò[MÿÛ;'Bø„.%ü/]4Û—†áÃÅ ùyJû¿}i†Ž›ð¿\þ/ø°íùý&¿Õô?$$„¦+åRR’’’ÍÏSÚÿ¤¤$0Ý¡,ëð¿\þoܸ!!!ü~“ßJùXBèá…½ûj0Ò_º§H =Ο7%+t1X¡‹A|DŽ”ÝQøßzÛ}é9®›_òGÑ2„c”MøŸü–˃âªPìÝWƒŒ0?ìÝWƒ:.ô ǹæBO~èVüü$Ðæ-Ù¶ùÏfm›¾lúN¸œHÀÊ'ï(üo½í¾ôxzCgÄ`Ÿ'üÐ9›ð?ù-—ÿ]‘Ep‹¾…¤âp‹¾6}'eý'ÔÖÖâ>ÿ`\¹Þ…°°0øúúòË”èÇ‘ ¨Á94)ÃÍè`œ ST?((îîF}} ÊË÷)ªßȆ"rZ|¢0œ©Ãì  Eõý®ça—&_º-Þ)øýÍEõW>ˆwþ6.ç§bÝWMXg¨QT?ÐEw÷Ýç…¦.#šš¾STß4d,ÜÝ;àêçgà|óŠ¢úÅ­Gˆö)œ8¦Gü/^BLœ%¦ÈûÑ à:;׆sE‚_TTÿz—ñ1bò„x»8a‚{µ¢úúC@ŒÉ„AMˆš4ÕÕ)ªï^¥GŒÉ„'ŽÅ­ˆ(¸ŽlQTÿ«Ž.ä½öžE‹'\];ñ!Eõp¡ÿ”€ÉsEp^Ñ>¸ÜˆÂÿ<ú!t ÑcÍ*ëÁOGëÅó˜4ù>üsóIìÉ: ¨~»ß ¸U_BÇ·:x¶¼ƒòOv(ª?ºîEükn!ÎkT‡¾Ïñ¦¢úûoED?Zî…Énßá箊êã  ãç/ £æàM sù"EõŸ:¼_<ø[˜¯6ã˘ը¿XQ}¿ëyðº¡N“Ðâ­FÙÏ@›Ë‘y‚NnÆâiÃñLÌEõµzüdò˜4š°(Lž(áé*"‡›ó¼+"‡›°}©ò׌{ÿÿ{-màEI¶+ìÿ¼)±¢ÐÿHÿ.h/¢áHöî«A8F!#Ìχ±x>ŒÅæ—üù¶+t1üúd»÷RÁúx’éÅ뛎Q¨Á9¾‚£uúŠuA•=58‡pŒBÑ2~?•¢+ä3$sA¯ñOÂåüTI¶+>V'\]DíRÆøßÌ•\ŸlaòÀÿ,ûg!@T\wè_HØàJÞ–er¦†ƒ]Z:#VýÕ¯\B×=RX=«þêvi…,ú™M-xëÑpèó0;óI8iðÏÍ'Eífg>‰· —Eÿ`U²—¸ãõ•¯aÚOæ#þÑFx¶¼#j7í'ó‘½Ä]ý<&9>9ØÅñ ÞÀ¡ :ô}Q»gðr|rdÑtÝ‹Oœ„ô€gñ·á¸Ò‚Én߉Úýmx>yp’,úþ£öÀhda\ÎbÐ{[1Èw+õƒÞÛ £Qž÷`í²Ý(Þ’ãrA'7ãâà|³ZÔ.èäfoI‘E®ÆòÈ`ÌCy—íg ƒQ¾Ï@sÒ `Ø0+t1øüðYmÃâiÃEí>?|† sdÑOHHÀ›ë?BJJ öïßC M˜ø°ÿ~Ù>Äm­Àö¥a8”1CG Õ ý :"€¿&µ¾_<Ã=ÆÂep¦5'õâÿ½]FXîÇJ­?ìëlÃãapšƒæoNbps‚F‰ÿÝlþæ$ÿ}€Ü… )ʽc†ÚÅÔÕ7™Lükë¢þOIÿ#Ä`0`Õ*OäåqáGð?ö8{ÖRÀ;..k×®åƒüd,\¸Ðf]á¼ÜÜ\¾@jj*rss‘ŸŸ²²2þÇ{-‡‚óǼÒöR‹(¼O– Cý$øÿÁA.üÏ^jÁÕýÜuyæmüôŠÍ­=†ÿàü Áhh;‹ÁÛõשööv'ëð?áûï¿wÚz´ /ïéÄŸ¾è{ÝÒö!NHœàß¡îlýÏ:…B¡P( …B¡P( …B¡P(¹¸§/ˆ†1'·°ØgxP7­Z#Ëáûòųp5©ô.,.ð¥ ~¸âðBÈ €]š<%xá{Ýpgк›þ×ö/´</„¼€]šѾKýFáöˆ~r‹¥Á !/à÷7Søý”û‹†aÌå¡,|¢9c&üý6ŽÏôáƒðRùoì®t/,.à?:znŒ5"§q_x(÷DMš«-ƒ¢ñž Ðèõü<)ý?ö¼N”{!j"Dû®„ÿå¡,_€àD¹fñû©ˆÿ9ahî~àÕ‚kQ¶Ì‡ÂKæÿó@T\À\gÄØÈ§pÅàÉ ‘€3'¾€S¨å‰Œ<Æ…4O[ž $¥ÿÛ—†áÉ ‘8sâ Ѿ+âN_€àÉ ‘ð|ØßO%ü×ét¸r{³ýòÓˆŽŽæƒðRù?cÆ 2_^[[‹!C¸/“»<¸'NºÜlܸqCJa»ŸÔQRR"œ'™ÿOÍœ—›­¸qã†hß•ð_§Óñ\n¶ÂÍÍßO%ü7†ÇãöTnPDà†—Ðb.âƒðRùùq.X),.ÐUýK4:s§û_œ¸ú>7¨b¸i \FÿßöÿÀ°¯-O‰–Òÿ¦eëqõý2 7-í»þÃãùWß/ƒÿcãùýTÂÿ›Æ í"çËÌÕ®0~ÃòAx©üo)æþ~…ÅÆ­<¸×•»=±sºŸ r8yÆÒv¬o%À/^žÏŸ®îà´oB´ïJø`Ó¾Aìœvt5XöS ÿ·/ ÃÅë\è?ýïøpñB>/•ÿ¥‹¦€¨¸@{çDDç&UÔ| ˜þ3À‰Fgx:Ä·õ½Í=7nk?OJÿsžwÅ”ðŸáD£³hß•ðûÒ0¾Á”ðŸá»†kü~*á? ÜSé³³³ù ¼Tþ 5!!!ü`Ar}'Ÿ4Ýb7nä_KéRR†F£í»þm–{úX–å÷S.ÿ‰ö¼)±ˆ¨ÃÞ}5ø{­¸Ë½j“}¼›õóa,ž›CÓHÀÅf쬨´i××>‘×dþæ—ü±w_ FDOÇ;…ₜ{Ö}X¼¾™/@°x}³ì} úlÖ&¸œH€[ô-¸§ß/j£¤ÿIÅðÎ߯£+ä3n†×u0™KlÚIíÿ nÑ·ð÷_É™'‰ÖöG؇!…¾ÁBËÿ½rûˆÿ7«­­…¯¯/ÿÿÇŒ3úô?×è“¢#ý»àqäÎ…ñûó¦ÄŠÞäÐ'ÉÃÃÃŽòò}HLLä—‘×ré ï5²¡¢û?ƨ¨>Ýóº}á½Y¿ëy¢û¦SlŸî¹Þ‰>_ô¢Í+ŸÄ:C ÿ·Ïfm½È¡o0\à^ø™è¢ASÓwÐjƒùeäµ\ú×.œâ^t|Ó±p¾yÁãøeäµ\úË^åB®Ã†¢ø£õˆ‰ÓaÃÛéü2òZ.}ã»ÝO¡m}¸ øEh^.ä—‘×réEqçmç\ï2c‚{5ô ¿Œ¼–K]÷gßgp÷Ûêê°²ûsð:–å_Ë¥¿m÷?XÛép¯ÒÃud sæ—‘×régnäίU㫎.äN|YI9ü2òZJ}ë>°lw)*Пp “Ç/#¯¥ìƒP?ý3®Ík—àr# kþ³9SÃùeäµ\úY~ç ~ºx<öd@fS ¿Œ¼–KRD( þÑF´û­@ù';p°ªŽ_F^Ë¥ŸÒíÿ¡`tÝ‹øo"¯Ûó6…-—þ‰Žç—BZ°ÿöPü¼Ñ‘®{ùeäµ\úÍçfWà  sù"øÚÃ/#¯åÒ'A÷‹ƒCðÔáÕ¨¿Úe»ùeäµ\ú»º ”wqŸ´šÌíþx—‘å_Ë¥¿{-÷3xh6—7♘1˜“VÀ/#¯åÒ/*âŠXkõ˜}ïÑ“¾î¶Îf~¡[¡"†1“ÿ=„8cÓ7²¶úF9ý¨¨(›ùz½^¹ý?hgÿ')xüí„Å5Í=é¿V”fþcÂZU eLZþ¨yüøqøpÙfUôC™Ç½™Ÿ¨¢?dÚ`ó #0kÖ,þ~‰Fc¹% ÿ ÃýdzÕ*O ¾-QûU«<±ÿ~`ß¾}€Y³fñÛÙ·oL&bcc1}:÷]ò˜1\ñ–¸¸8”––ò¯ßyç¬X±ø`ÿÚµkÑÔÔ„ÜÜ\~›¥¥¥|´´4>ü_YÉÝŠµ|?YYY gggÌÏ>މs¹¢U ¼¹0?´œ.>‡«û£ÐÖÖ//nœÓÌÚp®¬ç¶óóg~ІÿˆþúàðŸ¼øù1¯´áðŸ¼0|8W(h~öq^GÆÃ¨®®yïééi~ñiO¼ó³!@‹Ù›n£¢Öê÷ôôä¯?ŽŠ·å1({Ñ Qÿo<þqοøÅá^×£P( …B¡P( …B¡P( …Ò7Ýí ä è÷®9йÆ<¬Æj>߬“A¤ùVí XÍ¿-åƒÿOuqý"ë9 Ö‘âËIá—ïZ#‹¹ÆÐâ"Úw©Ã€ý¾çû1ÐSPÊ`—1dìƒG¼'£áF}wÿ[>ß×m ý· bœ[u¿s!|üo®æúeYOÚAÐBÿÏô¾ÎÔááO•÷Zƒã3‡ÿ~Çg °„äñÿ±©+íã×òø¾n[ä¿ ¸/¦ˆµ}iüw Õà‘ÇbëÕòí¤ö¿l™ÆFFâlû Ѿ+æz-Ê–±àÃoQ¶Ìœ÷SöËâûÖV>ŒOð}ݶÐaˆÄOÍœÇÿÀ²¬Ýõ¤ö?::.7[€ýû÷ÛìC_µ„ØÛ^aa!Wtaÿ~DGGÛôSnÿð€Û_Gða|€ïë¶…þ °ñ8ƒpƆÝhZ¶^üÿüàaY¯¦˜_Mjÿ[ÌEh|‚F™¡©IµQÂMM1WtaCZÌEÀWàË9)áÿXßJ¸ŒÆ_Íðø¾n[è¿eåYa+Ñ:Ÿ®îÿÇúV Ö“v¦(€ò x'õ±xrÉYQ%ürÉY¿é.¾ð,à"xµþûÞBû}$Œ¿ƒÀ÷uÛBÿ…x-ÔŠ¦ržwåƒÿžƒ¸~YÖ“ïúÿáâ…ˆnB]Óa,Ý\+j£„ÿ >¬Å‡‹'v_pœ-A\%üÄa|€ïë¶…þ ƒûŽHJJâƒÿ¤ €½õ¤ö?;;F£,Ëbݺu6ûÐW-!ö¶GŠ.¬[·ÙÙÙ¢“r ý`Ƽ³¢#ýcXž€}·ámkHït;›_ò‡¡)ÅUöCÿÂmö¥OÖ}áž0~¦ gñNa¥$:w‚uþ¯oÆ ] VèFòÅäöŸ{·7€'ø6JûCgĺ¯>"kì†þ…ÛìKŸ¬û¦ï„Ëyà‡ÛŸ€ÉY"‰Î`í? ü)Ô€Mß 6}'_Œ@.ÿ…”””ðÿwøúú¢µµÕf=9B/„•ÈóÃY„AaS_k³žœú‰‰‰¸zÕˆòò}¨©©Á´i³lÖ“S_£×c‹fMÆ#ÞÀžúz›¼Pú IDATõäÔwÇ`uÝjüþZ €üÁƒ»¬”>“¹IŰÎPƒu†ëX© ‡õU_N}­6W¯ÑÔôšð‡Ú¬'§~@ð8\½j„3ç›W`òx@Qý o§#::1q:ÄÄép¸´Ðf=YÏÿ— aü ¿ø¸ð>¬ÿ7”S?AÏà‡0Áý,08vk4€kŠé¯dlññÁ¿¶s!çÀÐPà[ñ=X9õsÆx,Fý(§Ÿ•”6)¹ÂϤ: ë;r_&,ûg@_Ú='Äf=9AÎÔpÜÐñÇÿ€¬ú«¬Ÿ³)§~fS ôù Ø“u{²`væ“ÈL.µ‘Sÿ`U^_ùŠ?Ù`¦ýd>VýQ1ý<&»X#>¯{Wð&žÁȃø1´rêGºîEzÀ³øùy?üÀ߆wX¿ɪï?jŒËYt._,½·J¾k—í†q9 Œ_Œúñ‹tr³¢ús5Üg iš@“ƒ1Pð3М´îÿј1x&f >?|Öf=Y¯ HIIÁäÉ““E߃(¡·µ‡2æ Àw ×0tD€ÍzrêûÅ30c1\øße„ízrêû:§9ð,þþ@ó7'eÓn¯)P*üOô™qâ"J…ÿ‰¾Æª€R᢯×ëEE” ÿ}Í$q¥Âÿ¼¾F#*p¯ápqvŒ8;»¨ª¯öþ[c4¡ÑhDáªUžÝ¯ÈüvhµZ  ¾€5¤¸À¾}û°oß>Ìš5‹/`ÍÙ³g1fÌ>üXBýøOKK­KÚ¥¦¦"-- ©©©HNNF~>7‚­²²•••ˆå !áÿÿˆþQ°—ZDáaÈŸ„ÿ ¯LþTf ÿï5Û¯·a·¶_oá]·°#ãaìÈxó³cGÆÃv÷ÐqÕõב¼ó6N\å ½‘àÿÆyƒ0Úße5È*÷4Û ó“¶íííNÆŒ‡3¹jG?s¬I¡P( …B¡P( …B¡P( E2îøK3ëAà€å)ô«CWC¸Lê°…#´FÖ&ôo}Inañ¥ pìŠEWAàÖ}¸Â9C€å)ô/|+ýÓÏïÄÿã3}Ð\]gú#G_ÊCYøň«–§®©íy(çÿ´:ýï~ ýƒÝƒþ”ö¿l™Ð¿YüÏ ƒ¹ÎˆèÄ8^WuÿsÂp…rûOžBO~)ítt4†þIŸ¤î‹N§³yê¥ÚþëtÜ€¬ÂBéŸ|'ÔúOžB¯5ï†p™Rþ·˜‹à2Ú*ôo…}1†Ç£«ú—¸ýÄ!^Wmÿáñ¸Â¹ý'O¡×L°|RÒã7,Nž‰µ ý‹‘£/6Áø±•èj¶)PÛÿ›¸'—‹Èí?y ýÄlË5PIÿ?\¼žƒY…þÅÈÑ—íKÃÐÞ9A¦«¼®Úþo_Ê]ÿ|¨ÜõŸ<…žà•ö?;;çÏŸà¸X€}IJJBHHΟ?ÏëªíRRñq£ODw….ÚÀ‹ü“ç…ýê‹®õ>Ú;§z;7¬Q_ûC^sáðA{k=9éÉ{Ò·‹Í–bRùa¯ ÂOåŸí2²˜«‘ç=ذa6—7Š>ó’ý%ì^›ˆ9i²}0Öê‘'x4³õg€¢¢"$$$È¢o}ïàî ï•.š‚¸­²è[ßû¸{°Âû¯-Å,üâåñßú»€û@xÿÿòãöu¶¬÷¬û¦TŸêK¡ŸQ”nÎNÈQ¼ÿûR´922¼ø‘*úÁºæÈÈHìÉܧо×Tó°KA˜5kҀɓ'óáry!¯W­ò-[µÊ÷èaѲŒŒM8}ú4Ž=**P]]}ߨQ£¾ÅôéÓE}3fŒM…E‘ššŠÜÜ\äçç#99™Ÿ^¹r%jjjDî9rä÷ó³câ\wQ€¿þÃæ///”]hßʀOå¢^^ây{Mâ~]©ªn‰ DDDÜ÷ñÇÿ lçééiè„1þN(>eB— xv´3žãŒAÎ@ü8|^gÂæÃ](?×'''‹xzzš_œè„ó­&”Ö:á½w£0Ÿs›ËNá³3·`¯h…B¡P( …B¡P( …B¡P(ét§ }ɶK“X=iU©Aà {5¬¥.„í Æ®®Zäû1Hnaù·B¤8Z?j"€OÅí”òŸðȰ ÿËå? ÚsÚ}ê½TL«cPÊò¿…Èéÿ™_Ø´SÊÿ鈎Ÿþ'¹ÿÝAûé¾6Ø/: ÓÒkQžãómŠ!Èéÿ7lÚ)åÿ‘#GDƒÐíõWjÿIÐÞ‘®ZB§ÓñÁ!rú?Ü´pÚ-j§”ÿ~N ÜCˆƒÞ¬û+µÿ$hïç”|-Å¥ASS cxÿIОÓî?<¹ä,lÃ:"§ÿ'mÚ)åÿÒÍÛº§”»þ“ ½E»°àÃZl_Æz"§ÿÂ'Ï“vJùŸ‘‘Ñk¥öŸí{ÒVƒ7")) III6ŤðŸl‡¼¾Øì`$€fQ)Ï3{Û²~¶:W¤è‹µÎ¼)±¸Ø >`o­ÛW½Þ°Þ¶µö;…‡1oJ¬Mÿ¥ì“è˜x]GWˆí~¬þ³Y›XöÖº}ÕëÞügræu÷‘CŠ>Y¯Ë0ŒyÆŒ¢ ¿ ­h’’ɯ9 ØçM‰Å;…¶OOãÞ,ë쬨”E¿  @ô'ÔÔÔˆÖILL”EßrG|ïéïÉ,^/‹¾é ¹­µ}ïw–?/ÇIÿ™ƒa3쟛r?^×Eë0™KdÑ7.@;<ضq‹³h­6X}ì·Áu¨h€àq²è/{5Gò#\nl­³áítyÎÿî`¿ ¾/°þ5/Ê¢ÏûmÛ† âþ%ë$èå9ÿ×±,þÔ¶í¿¶×‚ÀÿJ>ó3 cÞ6Á„…_Ø^÷½n”°þ“GŸû­ÿûþÙ„Ñ8)X'+)G’ϼv߃Ø.èoÝ })À¯Íy²ì·æ‰"çCË:9SÃeÑÏ ôÃëÿW# û€©Þ(Z'ERD(26Õø£¨mñÿ ` ü¬ª“E?…MA:Ò&]ÔöJÝ‘ÿy2ù¢ã9D^ÚkÓöÁó~€«eHf¯,úÍçfC£ÙcÓ¶³uKàßÔy®Áæ@ûB¬ÿGþp^´ŽvÙnYôI°ßú3Ð4 _°Î\<ï»×&B»¬À¦í…ï¼DëÌI+çØì·F;B\ 5!!AýÒES÷a¬ïûùÞP˯·µB}î«í}ç±¾•~ð‹—ÇÿËg@c§àñþ@M1¿Î°¯³%-þ×S¿”†êS})¶c2uI±™{ÃÉ ]&Sïíä“Wuÿͽ–ø•‡}ûö‘—Ç¿={Ö¦@ii)âââ°páB 6 —/_lÛfù.(77¥¥¥8{ö,_ ??/^äÛTVò÷¯lô_™ü©Lþ¸`? ù@Ì+Ü4ic] `ûuË´5;2v¨ßÞÞîtªÉÓ|ª‰3gÚ(g,™äŽç"Üø6ž÷aX¨wß5áo‡Á;i6›ñÜÞø~¨'ž‚_Λ|¾Æ:ܾyÛaŸ( …B¡P( …B¡P( …B¡HÇ]gØ…£ß»}ZV½Gy³fͬY³£G¾N–]¼xQÒ¸"Ö?øÏÍÍŶmÛDáÿÔÔT~=B~~>ÿ:<<±±±ˆåîÑŽ1‚׿R¼{¤ Óƒ½ð鯸ÿ^D?$ÔóJØK-v÷ÑËË £\Ào/›e#"Ü1?û8ægTUU]·i®@{{»ÓX'dLwÃsÚûÏ¡ÀÐÀà &?ˆÿ~iÖ§ŒÅú¼°|ò <à„‡œ0.ОÃ<7') ÆÂT‰ºFW<Ìãb·Ï …B¡P( …B¡P( …B¡P¤å®¾}† †1;c€V´gà±õ pG}“z8Ù¶é çqŽŸúªäp¢'ÜgrìÉ@\ÒW9BäµF¯Gy¨x¹Ôšµý·¹·¥–>¹·ª–>¹·¯Æ5BùÑ¡Öcèû‡¼ªpê®°oß>\@òäÉX³¦))@^°j•'Ö¬iç×Y³¦«VyàÚíÐjµ0 ¢m“e“'OÆ_þòíY³fñº••Ü=Óððp\¼x#GŽtØçüü|$''ÛÌß´i–,Y" ü¬ @ll,¯»#ãaÌÏ>Žîx÷Hx{ñÂo/Ìü  çÊZpn{0_$žs¶„ÿÉ2•Ûý˜Ÿ};2v¸Ÿžžžæ’$7 õó\]!@àX úÐP…Ûß»ƒ  ŒuÅ«ó#ó™Ûüºnó‚kß{vã–ëøÕ†Ë8Þp 7;¹âE) …B¡P( …B¡P( …B¡HÂ]ȃÀ…áÿþ>¼§BRèÝër%ú Âð÷¿§BRèÝër%ú Âð¿÷¿‡BRèÝër%ú Âð÷¿§BRèÝër%ú Âð÷¿§BRèÝër%ú Âð÷¿§BRèÝër%ú Âð÷¿§BRèÝër%ú Âð÷¿§B}EøD¹‹Í.¢ùj©éíIzýip½°äµ9DÇÁëºh>õ_=äò_èkII‰ÃÑâ,Ë:•””H~õwVTö¨¿³¢RVýÄÄÄõeÕ×èõ=êkôzYõ™qŽŸ&ʲ¬3Nú÷‘~æ’žõ3—Ȫ¯Õ÷¨¯Õ˪<®Gý€àq²êox;½Gý o§Ë{þ¿\Øóùÿr¡¬ú úžÏÿ½¼çÿJ;× ¡þJ®ÁBý…ÇzÖ_xL^ý¬¤œõ³’rdù ".|–×ó{“'ë1șޣ~ÎÔpYõ3õ3YõVÕõ¨°ªNVý¼^üÏ“ÙÿHfoú‘Ì^YõýGíéQßÔy¯ÁËv÷| ^¶[Vý¹šžßçjä}œ“VУþœ´y¯ =_dÕÛZÑ£~ÜÖ Yõýâ{öß/^^ÿ‡}Ý£þ°¯³Uû?œBùwÃÍÝ]=q³îînjÊ«ºÿf³ÕÕÕ£G¾IÂøöþóòÄEF£Q´N^ž¥À¯ýk»E ¡¡ÁcĈ7­‹Ö­[gê'ERSSùyK–,ABB?œœŒüü|»á!UUU7…ExsA~R`·ðáÿ¶«¬Ív¼¼¼óJØK-¢ùöÂÿwŠÇ ÀÅÃßkœðÃïàäzÞøƒ\ÝáÖéŸzgÎpñK¸Œ‰¾¿œÊŽ^º€£W‘¾«'/wÐð?…B¡P( …B¡P( …B¡P( â|/+ C¿wÍþ|¥Qb¸’º÷‚°/ÂpˆÔ¾·÷ˆ÷d»ó•†ú¯’ÿÅØ¯4ÔuügYÖî|¥¡þ«ãÿþvç+ õ_ÿÇúVÚ¯4Ôuü÷½dw¾ÒPÿÕñÿNæ+õ_~ÿ{:ýé8HtOö«¿îŸu¿„ýö_ ¨ÿý¹ý·~Oq¤'TŸêS}ªOõ©¾úý¡TŸêS}ªOõ©¾Z×@ åÇHWg§jÚ...èììRU_Íýwvv€[ÕÕÕnW¸vÍKÐÕ*O»ÁýU«<±ÿ~¬ZåÉ¿.((èUïèÑ£6ónݺu«¡¡Á *++QScI̯[·k×®Err²Ãmò¯+++QVV†ääd»ë ·MøøãoEDD¸ÀŽŒ‡ñr4ä?·=ïáÂÿ3?hÃÛÐr†[çêþ(l¿ÞXàíÅ·a/µàÜö`~™uø¿¡ê–ãƒãçA ÇèapöÓèÿŒœgßp¸yÁíÖ ¸´]n¾¯<ãÃ}F”UáçÖ™£Lh¿e¦á …B¡P( …B¡P( …B¡Pä® ÐAàý¹ ¡þ÷?¨ÿò@ý·…úßÿ þËõßêÿƒú/Ô[¨ÿý¥ü·ÞÖΊʞšÿ[c}ÌÔ|Âý²öŸT/åö…Ç€É\"—”êPÿ©>Õ§úTŸêS}ªÿïÒªOõ©>Õ§úTŸB¡ôL§Šø®®.tv©¬¯âþ›L|ñƒŽêêjwGíþò—¿`Õ*O¾(Àþýûû÷ïç_Û#/HIÖ¬iǯýk‡ínݺÕÑÐÐàˆ‹¬\¹iiiX¹r¥Ãu›ššDÓ•••HHH°YÏ^øŸðñÇwDDD¸766òAþÿÏÞ½GuhÞÿžnuëŠh.¾È ! qLŒ‘½Sd'²‘Ë83³ÎXΰ;¾ñ†Ùdj6ÙÄY“w*µüg.ûîdVy±“bÆJÚc’É8¶£öÈò ÚÝp‘±ƒ F-0`„iZ×î–ú¼œ>G§[-$@Bfý|ªTÝ}.¿çô¯‘¥Â<¿ãöŸ×Á?´ž» þÙ‹ôŸ¶nưç§ñi)ÿÿôgÎ àͧط˜b_9ÞëWœ!Ï^$“üjßnþá¥fþ!ô*ÿðë¶ïä‡íýì96LÙœõ_™ŠˆˆˆˆˆˆˆˆˆˆüéŠþv>û4Øÿô•ºþ8\½ëÔçÿá¤ÏfèóŸã~}-ÌÍ•Ðç?>ÇýúZ˜›+¡Ï|Žûõµ07WBŸÿø÷ëkan®„>ÿñ9î××ÂÜ\ }þ™ösû_ s#ÓCŸ¿ˆˆˆˆˆˆˆˆ\ þë«nþù§ÿë¬ü½ÕÝ_¹Ã¼óÎ5üíøÁ¬äW6–›kÖÜÉ _ÿé¬äßS`¼>ìd›ßùÎ`ý›šš2Žß¼yó„…ÿºº:¾óþìÏp Æm{ì±Çxùå—8r䈓ŸŸŸï+//OÜ}÷Ý,[¶,#cÉ’%|ùË_æ¹çžã¡‡Æ@µ_—••;7WùÿW¿²Ï ‡Ã†ýÞŸùßýüà`ß_”ðÕ£|e>ÿéŽ^ëîç/^ƒW-qÊÿ`-`ï ¿ÖKøÇ•,Z´ˆž|›ò•cë)ä*ÿÿä‰ÛƽÿlEEEæö?ôóÙß®aÞ’g{ï‰ãÄξOž‘â&oO¼œà•ߤˆ˜¼ËÃ4Mõ÷Â"""""""""""WQÞt ôQøGà×Ê{›ëÔçÿá¡Ïf\+ïMŸÿ̸VÞ›>ÿ™q­¼7}þ3ãZyoúügƵòÞôùÏŒkå½]ëÌþ¼¯•¹‘é¡Ï_DDDDDDDD®©”9ùA3Å00ÍÔlÆÏêû7²þÆp``ÀøÖ·ŠM€E‹ÑÑÑAmm­³¿©©‰C‡MyüÇ{Œo}ëi` c»«üŸïÞÇ“===þòòò„]Ðwù?Î÷¾÷=¾öµ¯ñÐCñõ¯ÝÙ÷ÐCñµ¯}¿üË¿r—þmöØ===ùvùÑ¢Eüä‰ÛxàÉ·ùëýý¬«,à¯÷÷s*=캣„O?ÓO÷iè= áWòÕsŠý¹Jÿ6û˜•+Wæ9rdÂã¯ý“ažè䫟<álÿ_óýIÊJ ~ºÑÇŸ¯Ëã›÷À;gL>ól‚ý]°ˆˆˆˆˆˆˆˆˆˆÈ,ºâ¿¨ÿ?½ô!§Ïÿ£MŸÿG›>ÿ6}þmúü?Úôù´éóÿhÓçÿѦÏ_DDDDDDDD>Ìþü¥'Ìÿzò÷WÿæOט«n_Åÿ÷ð3³’_ý… sÕªUüô¿üÓ¬äÏùB³ïŸ‡reû–/_žøìg?›±@.›7oæ;ßàÏþ þÛƒo}«˜Ç{ÌÙÿôÓOÖ‚®ò¿Hæ/??ßW^^ž¸ûî»3øÞ÷¾—Qþwo/++Ã>/WùßÇ3ò‹‹‹Íã¾ûîóÿ6}þmúü?Úôù´éóÿhÓçþѦÏ_DDDDDDDD>ÌFGGg-Û4S³šŸJ™³œŸšhWòÈ‘#þåË—'ì¾-{1€ŽŽŽœ¼üòË|ö³Ÿp˜Jù '{zzüååå »°o[¶lYFùÿèÑ£Îs»üVÑ?{€‹•ÿ§8¿k×®ä}÷Ýç?xð`â'OÜ–Qæ·øëýý¬«,à«?:—Qþ«èŸ½Àå”ÿíëúçp±éÞVäƒø´w›€™qìTljJ)# IDAT‘™¡¿¬‘kÖùÙ7Ìÿçžš•õoþtyë­ãÙÿëG³’_ý… óc·ÞÊKÿ÷+³’_R_`ö·_,Û¿|ùò8à”ùsyúé§ùÎwøÖ·Š(]¾|y,×±“•ÿÝòóóýåååq`\™?›«Ü_øÊËËsæOTþÏ%½@WæÏæ*÷¾ƒæÌ¿Ôò.ÅÅÖb*û‹ˆˆˆˆˆˆˆˆˆˆ|8åÍöˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ\®Ñ‘‘YË6Í##£³–ŸJ™³úþ§ qäÈÿòåË/¿üò„‹,Z´ˆo}ë$0VJOýs™rù='zzzüååå‰_ýêW.à*ÿÛåþážžžœùS-ÿìÚµ+‘^ ñ“'n›pWùß.÷ßwß}9ó¯´ü*þ‹ˆˆˆˆˆˆˆˆˆˆ|Øé/òEDDDDDDDDDDDDDDDDäšU÷ø¿5/D£€Uˆ7 0Œ±eš&©T Ãðàñ˜¦ XÇ™¦‰iZÛ/å|Ó„‘ÑÌTŠhôBú؆ëŸe™˜¤FSxNó?;ó?¸ä’É$}}}†Áœ9s!~Ôô÷ }n¨öƒi’¿ÿEó¼ùï…ü®ƒQºÞ¹à”ÿíüwŸÌÈ?úB’ãÿhÐóîÀòûÓùdå94È'RT< O©ð0§ŽÅÇÊÿZÛ;w¥0FÁ[Ç“‚ž‚3¿„³£”û0M«€ž·Š |x=Iá÷qÑ÷Ÿ¿,ÁuwæXå¡pÅÃCØ}P\\LÞÒ§_-àä/|ÎûO¼ã'¿g!E…EW4ÿSÉïÜeÍÅÑ’—™?ñügæ§ÒùqW¾UþkÎíùO¼ã%¿§8ñù¿T‘Hļ”c{{{/=ä":::¦œßÑÑ1íù¡PhÊù¡PhÚóEDDDDDDDDDDDDDDDDDDDDDDDDD®–¼Ù¾€k}—v[45rmwöÝí¬ýÄZ§HdÜMÞmçÎNqÜ.£g?Ntn6û»ŒnÉŒ»É»½þF›S·ËèÙ›Í>ÆÎ·‹ä0v‡øl;žÛá”Ìí2zöãDçfsîV¯ùŸµùOœÁëõáñä3:j2dÀ©càãöXǽyÐz\ýƒ±sß<œ2yƒÕ?€_ÊwöÝî:îÀ—F¡«€%ŸÎ£tU!¦Y@,cô¸‡ÄoÆçûõPÆ8SË ¿Þá–û räƒ× ÇÉ?yÔú±Rñ¤5F$o¿v¶‚Hz{䉱}Ç=‘„cÖóªÏâÊï›ðý{½˜}ŒŒŒ022@ž/£'Ÿ¾“&£‹¢¼ÿ†Uþ7ëLŒ6á£àý…ĪNPð‘H Q4š"žƒÇcPPŸÒüO5ß^áÊòÇÏ¿•?4A¾7?Èé×Ó“|ð6x Òù½F]ùþùÖüCŠKhmm5ëëë/ú{F$1Ãá0@à’ÆŸJ~04/šßÑÑ1cùMMMææÍ›/š …f$_DDDDDDDDDDDDDDDDDDDDDDDDDäjñÌö\+vüÉ]Üu—5]îâÿ¿»÷þûWü<õTÕ¬]ÛÿÉ€iÍöµÌ$w¼}w»³Ý.›»±‹ãöåÝÀEËç]wŸ·¹ äîóí²¹ûwqÜ}gyû¼‹•ÏG"wŸ·¹ äî|»lî>Æ.—Ûw”w?-Ÿ·µµeܩަùŸù7ªMò–ArÑ %Ås8uÌäöX%ú7Ž•ïaìµ]¾wo·ÏqŸçÞÃGü ÿÆG"‘ //¢£äååq*çý7 2:ˆ¼âÁ——GiÉ ó HŒ2<<ÌÈH‚Ø…¾)ÍÿTò½}žîWRãò¿8|ù™ó?Ð?Ê… CÄx]ù&yy'ÿä‘!N¿ž¹Ð@÷/HçûÒù)†‡IçÇsÎÿ¥hmm56mÚD$1;::ÆýLlmm5c±˜‡Ù´iÓ%?™`0èäwtt˜---ãòƒÁ ÙÙÙ9#ùMMM&ÀæÍ› …Bfssó¸ü¦¦&sïÞ½f8fóæÍÓš/"""""""""""""""""""""""""r5åÍö\މÊàÑhô¢w…½½•g)úY”ÆûW|¡ËÙ~wQ7ßya„¯þöL%OMöœLÇ\äšç™œã‰lÙ²…­[·ÌÙÈŸivqÚ}÷x» ž½oçÎÛÝÇOvÇz÷~÷s»0î¾{¼]ÏÞ÷úmÛÝÇOvÇz÷~÷s»0î¾{¼]ÏÞ·ã¹ÛÝÇOvÇz÷~÷sÍ[Æ\]Íù/--¥°°‘‘.ø£ðkëGRvÉ>§s&”E}NYÛœq0j’ 4ðøðú¡x…wÜü_gPPàÃëõ022ÄÐo 9VD<5Âüùóéníڵ混·;ÇLV8w?ÙØîã4ÿ³3ÿ‹ªL|+Àï÷ÓýJºÐí*߯nÈüvz3”þv;,ȰÌÈ,íÛ¯Ë V¯„_‚e·æ3XÖ]>†q†û‡œüw_šñüUkæeå¤ó :aZ…rWù¿¢!3"â"ùd.`¿.ƒŠ•Vaýæ2X6]à “ëçÏuÞ<ÇÛ3‡” Få^¯—áá$Ó4¹!¾”J"œyÆæê õžo¯1xë+zþâÅ7›,¼açÏŸ'qØ$Ïë%?ß?áü_Jþ‘¾hþâåSÌ›ÿxÜÄÛ“ŸÎãõÂð0é|0M¸!^Á%"¿dì³J/²P^c-°°Šo†…7ÌÏ‘?6ÿgÿ,‹™¥¥¥FGG‡¹páBêëë‡ÃF$1+**œsjjjœ?p­­­Ô×׳}ûv6mÚ”óø©èìì4«««–––Œüh4jttt˜µµµÎxîŸÙù¹ŽŸŠ½{÷škÖ¬1š››Í… ÒÐà|¡PÈlhÈø¦tòC¡ 455±yóæ‰Ž¹&\´P^wS €¶÷¦V(Ÿé;Æ3vÝì:öGô×Ę~€ÎÒàŒ.½Í^ ×öéÌlþû6|±xÂñícϳ>¯–W½løbñ´/ðw)KJz'¼Ž™`/PQQA$qîÀ~5¯a"ö¼ßþ•~ÿ¼ô`Ée/ òQ´üã…pøÀÀ¸ò=Xü7CV‰>CVAß)æƒUއqùÕ ¾Kïõ022BüˆI*9BAaÿóìUËÿxcɸüw;úÆ•ÿÁZ Â*ógäí×Âɯh°Xö{yé|X\VFAaçz/à]–Ä4M<=¥Äbƒx¼¹óetñyŠŠŠH$ŒËçL׿—­y0ö˜•&F›ÁªGá@Øz^ýi±w‡ñyó0€‘Ä(þA~~þ¸÷©ù]ïÄ&Í_y_É%ä÷á]f•ü==~b±/æÎMç÷STä#‘H2rÌÏ©c x0ý9ì*·¡ü>è [Ïk>›GìÝ|^Òù¤óÇæÿ½ðøßÁZ[[Í;3ÚÚZÀ*þ»·ïÛ·úúúŒób±˜Y[[K86Z[[M{ÿåðƒÁ`F¾ý3ÍÞ¾oß>3Æììì4kkk‰F£F04íý---æúõë/)¿©©É¼óÎ;Y³f½Époß·o›7oÎ3½h€ÑÔÔdÚû›››Í 6h¹æ\t€Ðw/PV\Àʯø§´€}Në‘þôoÓ¾€ûuU¬•áyNþ10û…ðéb¿Ï––>î¸Ãdÿ~ƒ7ß4yüññ 1¸ XÿéQ§üŸ}Üå^Çñþ…ü$UÊ ù&EÆjðÄœE¦#c*×°qãFn'y'ßGEE{Ú^#Ôþ««’?ÙµÝû|?±“ð/_¿¼>ì¼nßÝÎÚO¬eÅŠWtmî1³ÇnßÝÎ#>âlö™gçöÝíÝû/‡{Ìì±;»:Ùºuë‡&_ó?{ùUŸ…“¯ùÇ•ïW7ÖkƶQfd”ómi«Wæ(â/È‘C“æ;ðÁ%ä“•_@2‰+n¨òóñÆß\Äû]£cs| Øt§¿ÒNtå“Î÷¦óSŒ›·H$b666fl«¯¯çÎ;ï$ÎÒp8l´¶¶R[[K¶ÆÆFÜÇÖ××g¼žHGGÇ„ùÑhÔhiiqƈF£Íw[__Ÿñz"¡PÈܰaCƶ††î¼óN£¹¹Ù=† …X³f͸q6lØ€û؆†²ÎùЛp»¼ÿÊî±mS¹»ý©ÂæÓu}Õ_§ÌûÃpq€Þʳ|·±Š»î²¦Êýþíçµµµ4Þ£·ò,»ºg,p¹Ùë×ÏaÁ‚Rçµ½À¶m±Œ±[ZúØ¿ß`ýú9´¼êåÜÙ‹®épÉŠŒÕÜÄ`ìÏÄ’’^ò.e±šo§˜Igòæsã²çõÖ­[ùÕ¯ö8Ä™^Àýgÿ©büö§S¼ó³ÁõÖ©ƒë‹iúÒåݾ»Ý)ÛÅq{qƒËeaÏ7nܘQH¯®ªv޵_Dœâø=Ÿ¬»¢|{ »x~Ï'ë2 éK**Æå·µµ9Åñ‡zøŠòí1ìâùÃ=œQH¯«{šÿÙ›¯Ç;v’]f?h:…{³Ò´Š÷+á̓֗SÂ_uî)Óúrow—ûÓÏ‹‹JÁô~Hóq ÿT¦‹ÿ+!rÐúr—ŸþÊÈw•~^\äÓšÿä}ø—Žb,"žˆ3Ú]¤¸07Baa!©TŠóçÏóÞÑak>¾l-Š`ì7XµÎš£Û`Õ£ÖøçOU}ŒŽ@"ždx(ƒÌ[]Äõw2ÞÿTóÃo}0åü“G†.!?‰©‰±ÄLçç¥óÏPXèOç÷sâ7ƒÖàb-ʰÊ×YŸÝP~_zÚ#&FÕˆ+*RÌ[ÏõwÏqæßÖÑÑaÖ×ׇ €ÖÖVsÓ¦M„Ãa£¶¶–X,f666Fill$‰8ÇoÚ´‰ìÅ¢Ñ(î×ö9-ÐÒÒbÖ××;?ãƒÁ ¹iÓ&¢Ñ¨Q[[KgggF¾}½ÑhÔØ´iÙ‹¸ó£Ñ¨aŸ3ÑBÍÍÍfCC€ÐÔÔdnÞ¼ÀX³f {÷î57lØ@4eÆ „B!çøÍ›7gü3òÃ>G ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÈµbÒ¶øàâ¡ï^`[ãXùüjÞu}"%á|úí“x^þooÑaÂÆ÷W™ïÿ®»<T4Œ =0„.£"Îüùó)**Àcx(¹ò—%ñù|˜¤È[ÚÏ{ÿœÀí?°Î7ï0Lû½›•&o=fɪGál›µ8Jaa!>¿TW¦i222’1ÿSÉÿÓè%çÙ˜Bþ(óçQTT#Ÿtþ'BVVÅ“é ¼°4Ús_ =»€Û¬…δâÊ7Huy\ùÖüƒUöollÌYþ‡±B86êëëimm¥··—`0ˆ½¿±±‘ÖÖV³µµÕØ´iösû˜úúz§¼ï^  Úåþqå+ôG£ÑœùvÁ? šÁ`ÐÉ·ŸÛÇØù--- 455™6l€åÿô!v¡ßhhh  ÑÛÛKss³=„±aÚššÌ¦¦&`óæÍØÏícذaÍÍÍZ@DDDDDDDDDDDDDDDDDDDDDDDDD>ôò&;`Ïž¤o†]xÃBþM?¿ø×a–NX¸¾çxò—Ó{¡¹ô×Äy/|ÒËï]_Tщ(ƒ‹_è y"p€ÆûoO¿¶Êÿ‹®ÿ$?é ›ãÓ~=ë×Ïáܹ--}Üq‡Éþý ÌЛŸ€ý™ï_ÈÑTëJçÌxæñóÝÜ}Ô.F£F 0_ûåÿ¤¶v˜[o½•ï.ªâ›ÁÏH¾ýžS«ñ/¯zxéÁbç:Ü×t9c·ïnϸ#¼}‡ø+á>?ûnó¹ŽußÞ¾Cü•pŸŸ}·ù\ùî;ÂÛwˆ¿îóÝcç¢ùŸÝùOK_»Šôf¥ ÀÄztî`nì¼­XÈàìXñÞåGk¯ã?´Ÿ;~uî›!Ê ÌÏ›œz±€›~g„äA?0rÕ󽘢æs£$z€Tf‘¿’±òþùµÂÃWI•Ï]þj­‡¯¶§ÆåGB@pœ| 7˜$ùùÀH€s˜{›—ßü,ÁmøH&“ŒŒ˜ô¶YåüÛ0¡ØÔ IDAT¶‚ñ¢ÁªGá@ØÄÀš3{.Œnƒ˜Üþ¨Á[Ïð±Ïçqþü‰°ÁÁ8¦i2ÚYHÞÒ$Ƀãóß|>Ê¿yè'?ò2WŸâÎË÷¸ò}̽ÍË¡]Ãܾ¡˜dFFFx?]ä¯xÒµÃëVÉ¿'œžãJÆ>‹nè!½¬¼?óçMaƒÁÁ¦ £^ò–Ži‹˜­­­f  ÒÑÑA4÷ûUºÈo¦'‹™ö ‰˜@`ü’ô¹á°õ¦šŸ.ò;ùãòímæwvvšÇŽ  eäïÝ»7g>V‘ßLÏÞ½{ÇåÛÛÒãN˜¿wï^sÍš5—õs[DDDDDDDDDDDDDDDDDDDDDDDDDd¦]´üÌ'>uï-dåW¬¢æŸºÀ=÷XûËŠ ùÅ¿sá‚É“¿œ ÀÁ¿I8 \n)z*€Yæý!…ç_¦³48íY@À¬­­%/c…ÿ“ï¿Áž=)¾ÛXÅ®îãÎ~»˜îçJ®k¢ììò¿ÛÒÒǘÌ_?=sÌãý ynôßž;×Ùž½m¦?ç-[¶°uëV'Ëž›†µwsWݺqû§3àÞçûxéÁ`úÞ³Çã1_¾àÅíòøÖ­[§<†aÎc*eýY´çl¢B»=~,cÛ¶mNQÜ.ÿÝÎW”ÿG­UC&*´ÛãÛùvQÜ.···_QþÚµk‰ íöø±XŒ+ÿ\®æüçr5ç?—©ÎYŸs¬5Ö]Ü!]ĿÄsÖóÇ—ù¸å®¹üñ÷{ùá—rh϶íIÂ<øáòÇßïÍ|˜«Í±B¿Û0^4¨üŒ‡3{ûé9<8+ùû| göös¶;ö:.éë ë.óç¬ç-ƒ[îòðÕ¦µÙá=)žÞ”Â_}ÑÚžñà6ÆÈÊçu¨þÝ<òÏÌ'¯z‚÷¯'qc/~¿Ÿã¯zÆ}^îò=àðßz §|oVšméÿ,Î摱-°h”|>>‰£qfoÿ¸üC»†g$ÿ¦eùä§(x¿”Ä1ü~èzy\|fùÆx±ò%ð¶ë¤ÒÌmóË!ßïOçRT”‡ç7Ö‡³}ûv6mÚXeüúúúq×ÐÚÚJEE…PSScƒAÇ·}ûv6mÚ”1®- ÐØØHooï%å×ÖÖ:?§#ß.î755±yófÀZ  ¡¡aܸéíöÏ]³¹¹™ 6Œ;®©© €Í›7gŒkknn°ÏÕ"""""""""""""""""""""""""ò¡4é`•úí²ü›§†ØõS?ßù|’¿ügkA€™.†WÅZžáÔèÏHñû®»<ˆÒö^©³½î¦÷}~!»O/¢&vÀYø`¦Šç--}¬_?'çqîB¼ûØ™Zà©X5xb,)éÍÈŸ)@À\ý[÷ð@ù |3øãŒE6nÜHEEsŽã›ÁOûõØ9U1Ê×xø—¯—ÌHÆdüþ±ï?Ã0œÒ»{›ý8888]—§|™QK>âTkT’qw»4ÿ£µ×ñÇß çáñ»|T.IÒ}ÜÇ¡ž$?†¦uÐ}ÜǶ=I§˜oï³Ç±ÇÌÐ —$ËÎqì¥Ô¬äWÜRL²¬“¯1VïNﯴþj­‡¯þ} bðØP¹ºÃ¡Ø= [×Y¯ŸÞ³0€½Ï§›ñbp}•—²»‹™7o±XŒ!à*Û§ßóËd”ïícŒ—2ßgF ?íúJ/†ÇC2™Ä|~+gdd„dÙ9'ÿÈ?&g$¿òcs.’ßǼyÅÄbD~iï”ýmÏ’QþwŽy)kž+É\¸±Ú7aþû]£N¡ûöíÔ××555¦»ì‰DÌÞÞ^jkkH$bÔ×ׇ3Þl$1íò¾]¾wÓÑÑaÚ¥}÷ö@ `nß¾ÆÆF#˜î²¿}^oo/ëׯ7:::œü쟅ãòÝÇ´´´8ùYçšé²¾˜YeB¡ÙÛÛˆ ŒP(d-þc-‘ …L{ñWùß9¦¹¹Ùt- ò¿ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ|håMvÀŸºãËÕ@À\ù?u7 ³åOM¾óù$§ 8™«uåô×Ä:ÕÞ™É):%vc¼×áÏÛÞ+åúÓ‹¨5à›3Tþ·µ´ôqÇ&-¯z9w.Æ‚¥9óìù¸ã“ýû§ÿRŠŒÕï·JðÿÊ–”侎™r÷ªú,ÆÞëºuVÉïµ›) ¬š±ëùíïõsï#Ðô%ø—¯—L÷ð<û̳¬ýÄZÚw·sãýÎö÷Þ{€+VH$˜›^„Áæ.½»8ÛÏ;çdÎÝèüqJKKÙ²e‹s§z{;À ÁxäÑG®8Ë–-ÎÝèÿÇßþí¬äÛw£å•Wœü©Ìÿ•ºÒù¿RW:ÿÓ•Ÿ=ÿƒ‡æ²hy>'Ä1È,ßÿþiƒC{.д6¿fÓ}Ü76èyœ2~ÓýphÏ~~ ˜gâ”»Œ"ü¢ßM2z¤€ ‡¼,»}.Gœ¿ªùËî÷1zÄÃ…CP¾¢žÃCãÊÿŸ8 ‡ö¤Øº¶8ù®I-°õ>ëX€Ýïc-(c¥ônëx[ùç`ôˆ‡ÁC^‰ù]sñ,A~¾ÁÀÀ¤çßο®Òäl÷È´æWý;Ÿ/~‘|Òù^æÜ8Jßiˆ<ášã{Ò§€2œEœò%Vá¿Ûõü6œEÊ>>_’Dò»ò]ùÃpÄX¿+…Ãa£¦¦Æ´Ÿ×××›‘HĬ¨¨0ìR0Ì(ø§ p.ÕÞ‡ »èï.ù»÷“%:ùÑhÔ¨¯¯7;::ÌÚÚZÃ.õƒÁŒ‚z‘g {_45좿ûg²{v>àäFCCƒ™.óv©¿¹¹9£àŸ^$ÀÀµÏpý\ûs䋈ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ|¨x&;à|ÔOÙÐpÎ}v‘«í½R¾9—ß°Z‡ç*’Óy9Åb¿Àõf,cpq€¼¼Îkûý_èâ›Á®Œm3áN¬Bÿ†/³¿Á¶m±qÇØ…øZbìßopîì¤é%9šêb½÷ç$GW–6§tÃúig¿×­k ¬ìFÞyç~u¸“Ðÿþé´gÚózã*ƒ—žõМ™E>ÌÚO¬¬r¸]º~!øí»ÛÙ¹s§SÏÏϧ  €‚‚ çÛcås€êªjª«ªÙ¶m›³¯ºª°ÊáöömÛ¶ÑÙÕÉëo´9åíËÍ·ÏXRQÁ’Š þä?þÇqùmmmãòw<·cZóëêꨫ«ã3ŸùÌ%Ïÿåš®ù¿\Ó5ÿÓ‘Ÿ=ÿùù~†‡†Y´<ß*Qw[¥y£Ûàç§àPO’îã>šÖÁ¶£ÖÏ•C=I~> ße•ïo)÷9EümG“Vù>=à”ïV,^QÈ K½˜¦ÉÜÚ<'Ùíóf<¿âcÅ,¯]@ÕÇç¸ò½  S¾¢Ð*èÇÆÎÝý¾Uîï>[×ÁÓGIçÃîaxìëù-åc <}«üoNùÿúj/+¦l™Ó$ãýûü~ýV1KïõpÓïĹ¡Ú æs^ŒÓÿ¹K—ï Ì/ƒñ}Æ6`lÑ£Í`Õ£Öó3¿,¤´´¿ßO29ÂèoЏ°tÜüÛùo,¡æs^ªVsÛs®8¿ë§æ$ù^W~>Ë~/Å PVãeùïûàõô vùÿuàAàyÆVgÑÞ†òû¬§§^ÒÒü~²ò­ùw«¯¯§££ÃY ‹9¥ýÆÆFápØH‰D2~ Ûç-\¸pÊåw~KK‹³@gg§SÚ·ó£Ñ¨Fp8ì\¯Í>oáÂ…—Rþ ]òwØ»w¯SÚß°a@ÀÞg„ÃaB¡Pö/$N>*ÿ‹ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÈ5,o²*—$9UX0á~w¡Ë.M×Äf¾$^Zú¿È;wfF3öìIñÝÆ*öìé"˜vñmFC]æ¯/užŸ;ëáÑGGyüqœk±ç»¥¥}|ç-ƒŸ><:­×°ÌSÅOFKùFi'÷¿aK^E±|£´Ó¹Ži Ì¡¬ìF"é;—Ûeâ=m¯ÑÑÑÌÜ" -¯g"§}w»óܾ ;àܑ޽­°°0ã\Ã02'ÚÞÙÕ锼ÝÏí×¶%Îâí\÷¶ËÍ?‰°$}§j÷óìüºº:çñv¾{Ûåæ·µµQWW7î9\Úü_®éšÿË5]ó¹.6ÿ%sæ0gº¬}7-ó“L&èïÃcxÈïšË`å…ŒüU_(%•Jñë`ÿç/ÿý’á|ºÞ±¨©Y˜4ÿæ?ð“J¥8úó«Ä_j-`Ûº'ÿ±eVáßÊ·ÝÇV| ’á|N‹[óqsA:ù]Å VP6g‘“o¦wñž,e(1@øŸ¬_nÿ¼y§Œo|ÌÏ›V)¿› v9ÿ­×À¬31Ú Þ}~›–apñ÷ŸÿöOÓ’¿ï™^jV.!¿¡ÄGþÑúYZñ$D2¶ÀóÀ=X‹dåÛ‹ô¼Ü¼ ÿ®ŸÅ7¤ó3çß-]Îw~y ÔÖÖ:¥ýp8lD£Q³µµÕ¬©©¡¾¾°ÊýápØyÝÚÚjÚÏsŒ?¡ôÏ·qùöϽôï?f0ÌÈïèèÈȃ9ó§ðós\þš5kìíF45›ššÌššÒ…~B¡‡×MMMvÙ?×ø""""""""""""""""""""""""""ׄIxe7ü—2uvù}dÁ p~ærîºËCìÂîºk{ö¤f.(‡ì…6|±˜ZblÛãñÇKÅ΋±¿Áúõsxþës€“Ó~-ƒæ›À\^˜;—¸Àñ~ô/dII¯s3½@ùülܸ‘=m¯jÿ•³ýj,@ð/_/™±±í»Ïìܹ3£VA{ãÆlݺ•üüü)—ÞÝϳKìîçî¼×ßhË(‡ƒU¿ç“uüÝΗŸ]bw?wçïxnuuu¼òÊ+ζ¶¶6~èaÚÛÛ/;?»Äî~~)ó¹¦kþ/×tÍÿåºØü]÷>~¿ŸCFßñ×UšœMßÙýúJƒŸ6±Kø·”ûœóÝ¥û²ú$………x<†‡‡ñçû([˜ˆ'M2ç㊊ŠH¥F‰Ç}9ó—|¬ãïPù±b~þîÀ”ò—Þë—¿tÕÜIò£øýdäßPmp¦ÓêAßXíewgæ¢.·”=w—þ­ƒÂBFþ¢›Ýï?ÅœãÊ7r¾ÿÑÑaΟÈ,ÿsÊÄü<\÷9ƒ³û€SV¦y¯U¸7º ÌJš€UÌ7ÎP «ÖÁ[Ï$˜·xjó?::ÌÉ#‰iβhyþ”ætt˜séo§ü ¸<Ÿƒ”+Ÿ{±èÆZ4â`z{ x(…òuгk˜Œ›W߀h4j‹™îò¿›]¾·÷Õ××›­­­Îë@ q^GGGÎB~.v~gg§é.ÿçÊ·÷Ùùöë@ q^KKË%çïÝ»×Ì*ÿgä§ þ@CCƒ …œ×@ ã¼æææ‰ùÐòLvÀàâÀÕ¸ŽË’wî ïϱñ“ÞOr>êgdäö˘ »L7})«Wœ;£¥¥––>§üгpúËÿ¹®cII/Çûòí f4ÓVzê4§NvÊÿé»Ïhù?¸¾€ÆëNÍöbÓiçδïngçÎlܸ1çÝæw¦Ëßäççg<PXXè<ÏÞc…s»ì]:ïìêäõ7Ú¸ç“u9ï6ÿúmW”oi—ÛÝ%÷Ïí ³«“Ïíàá‡Îy·ùÏí¸¢|{LûÎóî;Ð_Êü_®éšÿË5]ó¹.6ÿ`ÝyÝ^Ü!™L’¿l„[ÿ°ˆe¿—ÇÀ`’ù‹­¢ý¡ž¤sŽûyŧ`ɧ ¼^/###Äb1úÞIÑëÃ[9ˆ±¤ŸÂ¢n¸þz N-¤ïBŒÄps45aþš¿U_(e`0ÉâåEÍ_ñå¾â+È'+ßäã%Üü~GYXáa÷ûp¨WþØóÊÏx¨ú¬¯—tþ0}ï@_¬oecI<]:0oæ|ÿöâ Nù0^4\å{צŸŸ·Jø«u}¸ÝðÖ3`Ö™œ?á%òŠgÒù·_˜îü“Gâ~qxÒù·_pÊÿ¯ç(ÿCfá¿ÛzZ~Ÿk zv·Á¹tÿ‚qóokmm57mÚD$1÷íÛÇöíÛéèèÈ8(d”ÿÂá°Q__O$±ã![®…²ƒAsÓ¦Mttt8ù---9óÝ?{£Ñ¨Q__ï\k®ü©ü¬njj27oÞL(2÷íÛGSSÍÍÍãòÝåÿ4£¡¡P(4a>9ù0Ë›í ø0ó¾Á¹%IòŽ˜íK!@À\¿~--}Üq‡É‚¥³v=ç$óLßäNƒŠŠ Þ‰Dxíµ0µ2ᕲç;¸¾˜§>ˆAËÁõÅs:óí»ÃWWUgÍs•Î 2îpÖ]îsms?ÚvÝ΃±»Ã/©¨È(šç*_n¾aÑí<»;|]]]FѶ…’ÜPíÅï÷2::Êðð0FO1Ã^òóýܰ¦„d2ÉùóçñÎG£x=yÄ{ýŒøü>x/9¥|Ž3¿jåœ+Ìdå[s6–oàõz褸¥œt>ÜROŸ+£'áÁùùy®ü¬|“?úNþÉ#qì5Üå{«pï*ß—¥¿¿^³2}Ì`žUÂ?€Éí¼õ Üü…œ?ž÷Û ¸¡Ú‹×“ÇðarÎÿÑç?3Ó•¿úÁœ?žîWRT­œ“ÎçœÿžÃCN~Fù?]øwÊÿeéí/•dꆬEzvÁ-÷sþü§_·>«ì|8íœhmm¥¾¾>cÈH$böööR[[k@f™ßÞ—ÞN$1ëëëimm5ëëë €… 2åwtt˜½½½¬_¿Þ€ÌŸ¿ö>;¿££Ã¬¯¯' š—œ …ì‚¿# ™½½½lذÁÎ5²÷Ùù¡PÈlhh°¸¤|‘“I(: ¦<àÛ‘¬¼ øeß\ÖÔœ¯ —éŸÁ|rè÷¹Ãx™=Î\ȹpoƒ™¹;½í!ïR¾M¯“q¼ß*Ô=7zŒoÏ;S±Žˆë®èW£üïÎ æ7æ—òO ÐèZÀ}-Ùs)×øÈ£°e˧þøã;¥¥™°í;ÚO¥ôž+ÃíþÆûغu+´q£Sÿû·ÎãtåÛnöûܺu+k×®uÊ᯼òŠó8ùk׮͙)ó¹¦kþ/×tÍÿ•äO4ÿ‰x‚‚‚¼Uƒ$††0ŽÏaxd„¤7AqI1‰ù1òòò/•K’tÏ\t$ÏçchhÓ41M(™SBQQƒƒ}ŒÄä,bÄHR¼ÜÄï7É#‘&¿Ï ùÌPþþt¾‰qÜ—•?D^ÞH:º“#Ó´îdoåfåçM˜?8ÔOô½<`óËcã¾iÝLc¿ÝÖ÷Ôê•pàûæçÇJøæ—Áø>p§„Oz!ƒßülˆ›jŠX´ÌKþÒÑœóÿ^8ôÏHþ›ÏŸ£æ¶–­š(„NŒÀƒcù‘PúÉ~ f=­X ‘ç{[¬óžOW tãäÚ5Àâåy”ßœ;ß­¦¦†ÚÚÚŒ‚?@}}½ ÐÚÚêüœéèè0Óû2ÆØ¾};­­­„Ãa.•ŸýóË΃N~KKËŒä¯Y³\€†† ©©ÉÉonn6Óû2Æhjj" ]V¾ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÈ‡É„Ee»Ôüħ.ðཅ¬üŠÒbs 0C1ÊþmÁ”Ž¿@À,óþÂó/ÓYœö¬@ `>ñ© ”νo»€«[>¿T@Àܶ-ÆêÕë×Ï™–k æñþ…NÑÿþ Ø’WÁ<ÓÇ’’^縙þœ7¦ËË;wÏÀþ^hl`°×ä¥K2ŽùíïõSº^z°ä’®q²…ì‚c®‚ûD¥wÃ0xùå—§z õQÏ—™U±¢oõóçÏçìÙ³xN”â['//¡¡!ÇJHÄãÄNyhzºû8Ô“ä–rÛBI-Ï'•Ja–0g޵0Êàà ôc¦Rćðù}x*ø|>’É$¦irÝP Ý‘ð”òOΙ¿ìöyÓŸdþüRΞá9‘ïÊ!q,ŸD\7´„ çýÿ:Ø?öÁT¦»­‡Û`•ò ¨ó^à ‰Ñm`VšÜ^cðÖ3À\`ζa£Íúþ\Ò`^tþõÃ÷g4ÿ–ß/¼èü¿õãØX¾½ö…]þ2½(Àëé}÷Ó×W å5гËu®½- ¼mm®úÔøù?ð¿±XÌÌUþw«©©1írý¦M›Æ_SSc/@EE…ao ƒÔÖÖN8vgg§™«üïÆågoÿ³¹¹™ 6|hÉ–w±O|ê÷Ü­GJ€ÄÔF¬ë3s¦ ÛèazîS=Þ“¿œËSOÁwùß±Î-öLû°ïæÒbTó³‘7ùöܹÀÕ›“[ãIÞÉ÷M~à ‰F£F 0ƒë‹il vªct­?y÷>ßOÑBƒàúâËÎxö™gYû‰Ì»¤¯X±"ã®÷¹mîí»víÊó¦›nrŽ{!øk?±–öÝí<òè#Îö-[¶P]U1æ#>rEùö˜öÝî¶mÛFuU5]lݺõC“?Ñü_‰é˜ÿ+1ó?Óù…ÄSüÿþ9 ÃKjá"òo…‚)ÃdÞ?±Ÿä©"uòzüÄ÷QÜ[Âè€II)x*½›%ô½“$e@¼3áá‡ÿ¿½»‹­ó¾ïþ=çð’’EÑŽcYŽ-K4›ØI–&ì4 P€Ð,ÀÖ @E4Žg Mw™úBH ðo»l—kœ á Kšõ"a1ÓÚ(2-LâÆ³âДDù-¶*Ó´,ñõ<»8/")’¢)ÊñÖÏ žsž—ÿ÷œ%>ÏÍïÿïè›Í½“éz}cù¯¾0sóçóÚkÓ)•²fþÔKkÜÛùåLßy9ÛÏweñí,Éïnæ×›ùó)—Kéè+òFïdvÍîmÿÛï/%g·§T®ä•ñ+ß÷ã_O~òó¹?/RúI)¹9))å§)òñ‡šMøiìûÙ™4šõMøgO”’4V½¿íS3WÕ¿ïŸw´ó_xæÂ–ç?÷——Û—ï} |Uýïø$g;S*WòÒó—®”øß'“Wå§ÑØß“äLr.É]ŸkN0Ý8v®™Ÿ5ÞŸþþ•g£ÛïOÞèLr¥ùÿرc¹õÖ[‹$9þüU ûÍfÿâá‡^s¢€Öþ¡¡¡bzzºèéé)—Z㮦Õü¿2eÃ~ó~_<üðÃkÞû[û‡††Š‰‰‰¢¯¯¯455µn~«ùdddYþ* û¥$E³ù­gR’ ÍqKIÖÍx/Z·[ü©ZÆÆJúàÅõN[fl¬”Ý—gò­/ï¸î·–¥«¦ßÓÿÇí}×ZMý¼c:ñg·rÈjÏ¿¬ä}ï¯oé˜o”æóŸ*÷俢š“Å»ßüŸ$ÏvVsñå·ß­¸Uµ¾o«Éÿ#Ÿ-çàñ·óñ{1Ó/%¯þ¬XvÞ;qäÈ‘øä=z4IÚÛ$ùÞ÷¾—îîîtuu¥««+˶]]]WO’S§NeâôDž~êé<öØcI®4Ÿ=z4>y GŽI’|þðáôíëË“?M’öözò¿ñgßÈÙÉÉLœžÈ|éKI®4?ùÃÑôíëËçN’8p }ûúòø7O’öözóGGG3qz"<ðÀ²üÇ¿ùxúöõåÀ׬ÿfmUý7k«ê=ù©µÚ‘J¥’íÛ·§V«evn6³3—3==¹¹¹)å—ß]È×Z=çæ©›ÓÕÕ‘…ù…TÎU³¸XO­³;óóõ\|v&/^L¥£šr¹œr¹’Zµ–ÎÎÎÜtaWJ¥Ò†òöߦop~²}{-µZyü”ÇJÌIDATIþ¥vþ/¾3—G?w­üz*çJÍüÎ%ù—›ùiæW›ù7¯ùý_ŸIñ‡iüü«"?ùyRú«¤ôãæŸ¶3ûâEòÆ•÷?/ò›%y3ÉÎæþÑRJ£¥Üñ; ¹ã7j¹mo%»ûkëÖÿ…g.ly~ÿ¿¨¥ÿ7{³÷Ã;rÏÇz×­ÿKÏ_J~/Ÿû›Íÿ•äÇÍ¢O7ÆÎÇš¯›ïÏ7&hkNg’;‡“;?Ô•ÛûªùÀ»ÚõŸžž.ÆÇÇsìØ±>ž‘‘‘:t(ÃÃÃΡC‡râĉâĉWågíæÿ¥Jû÷ïÏÉ“'×Íx¯êXïà×~Ôü¨;Ûø€ëÉOMgôå·®÷³­kzú·óþþ]I’}Ó?ÈÅþÙ¼þÚ[›qû`z^Mc™ß÷¾Éóíïlí˜.Lféù£ž‰4º*ßÝæÿ$ùÈì|ž½cû»¹ª©©©Roooñ7_¾©½ï?\˜Î×þMrúØæÿ´V^ïÛ×—£GæðáÃ9zôh¾ñgßÈúb:;;—­p¿ÔÊýK·VZoßZá~åJïwïÙÓÞ>ùÃÑÜÿ©Á<ùÃÑ9r$>úè¦óïÞ³'g''Ûã·r[ï[ÛÛÇ¿ùxüƒyü›_wþàà`FGG388˜'žx¢ßÊ[Z§ÖvµúoÖVÕ³¶ªþ›µ‘úOM½‘ú…zÒ]ÉâB²}{Gê‹õ\þE=õZ-]šINW’$gÎVóܹùÜwWc›$ß¾˜Åúb:ï­¦R©dæÔBëEÊåJJ©¤tî¦ôìÜ™ ‹ÓÉb=õ¢ž,$—.]ÎÎîî¼8õúµóŸÍ ÎÏ*ù3ÍüÙä…V~òܹ侻Ûåù•5òkÍüË«æO½¸¼þo¼¸â“ÒŸ´~CWÿ©ÿÝ{“ïžJcuû7›;Ï$¥”òÓÉ`£ñ~w_GJ•JvîÜ™ ‹ç6Tÿ—žŸÞ²ü{>Ú³Áü+õÿ‡É¹Fãÿ·ÖþwýÉÛ’§^[±³5 @Ò˜à™äýµ%ù¯®š?00ÐbecÿÐÐP‘$“““Åž={V½çNNNçÏŸÏ­·ÞÚÞ×:·9 @1==] dll¬X6ÎÒü•÷õVþj×µŒ]•ß:·9 @111Q äøñãŧ?ýéeãìß¿éÛedž‡‡‹$9qâD1<<¼jþ‰'®Ê_rniÿþýÅÉ“'‹ýû÷gdd¤8tèлúì°YkN°™&ïVƒôèË=›ãZz{{‹$¹§ÿsÓxgfnžÌéžßOV6ämAFÿ=£Ï`òòØÖ ~=òÈÖOTðç;wæÏ3‘äÝoüo9sËD.þòÎ_GôU–Ö ···ø£[zV=öNLœžX¶]¹}ww÷²÷×j†O’§ŸzºÝ|Þwéþ¥ûÎNN.Û®\~3ù§'ÚÍç­q—î_ºotttÙvå ô›Ío5Ÿ·Æ]ºå¾¥Û•õߌ­¬ÿfleý7›¿‘ú—Ë¥”÷ÖSîœËÂ/“ù¹Å”J•)RíŸKQ”×͹¼ërr¶”Î3])úŠwϧ|¦;õ»ÞNùÜŽÌÏÎç­›_Ͷê¶ÌWk©V™Å]S«õ¾Gò‹UòÓÌ/%)ÖÉŸOÎ&gÊÍüzÊgj©ß5—ò¹®%ùÕUóëK¾ÿ‹ßoä”þ$é½c!Û?\N¹\Êââbê§·¥(ó«Ó‹¹u[‘¤”Òh©ÝŒ¿çC•Lþb1¥3¥doR yet!·î©o¸þÏûívþýµUóO?ûÖªù÷~bGNýä­eù/ŒNgϽ7m¸þ“O,6Šú­ä–;“íN3¿HýtWŠb1¯¼0Ÿ[·5‹ÿÌ•ÉöÞWÍ™çæ“gÒ˜/ècÉKÏÌå¶½ëÖÿ¹MÿKµ&*V6á·ÿ‡††®ºnll¬h5ÄïÙ³§400PŒe||üªs×»gµŽ +›÷[ÿ«å?~¼?00°n~V›áaűááábeó~«ñxxøª‹FFFÚùÃÃíIÖÊxOZ¿»q¦¦¦J­Ÿ­»ezú·óÂø¿K)_Ï+‹¿¿,w«2¾õå9û÷ÏØØÿÍÿKë¾Uu¸cnÆ×¿þ¿òíÿùß]ñkÚªú>|8§'røðá$W¯ßÙÙ™®®®tuu¥»»»ýz­ýIÖm>oå´Üÿ©ÁœœÌýŸLrõ ñ›É_¯ù¼•ÓòàÌèèhüƒI–¯¿ÙüõšÏ[9­ÿfleý7c+ë¿­½^oOÜPé(§T*R¿ëíT«YXXȹã¥|í¡äÌÙêª9¿­¥Z­¥ZíÌåË—³íµ÷e±^¤ãŹ|i6•¾ËI’jµšòÞK™››ÉââBææærþüùkæÿâ;—×Í?ý× ×™_¤5oÅ•ü¹T«å,,$gÿG‘G?—œ9»z_ùAR­VšùóÙöZo3[3aü"çÏ¿±ìûàƒ•ÜÞ—Üö©Ùö÷ïêêJ­VËüü|~uz19©qþƒW&&¨V;³kp.}éIÎ$¥ÑRvÞ^äüd}ÃõÿïHßG·eï•UóO?ûÖºùû>ӑ¿»¯;“§.n¸þwÝ[ÍýåÜ~Úõoäwd~~>¯¼0ŸÏîMÎ_jœÿÙ½Y–¿{(éÿ'½Ét’g’›ï(åµ3ë×#ÆÇÇKÌØØX‘4šï‡††rðàÁŒ—Vþ_zl³ùŸo®tÿŸÿôOÛÇþàK_j¿þ¯Ká8°¬ù|+ò8$yâ‰'ÚÇxàöë§Ÿ~ºýz½úoÖVÕ³¶ªþ›µ‘úï¾'©Ö*yu±²üâ3É#ÃÕ$Éc'æóÈp£ñþ»§–6þ/9ï;ûl»öΦ(мõó™Tk•L¼5û®æïûp¥™¿j-yùW+N˜Nþõo5^þ—7^?w.yêµ%ÿ¯-9¿çåïþ§IQ$7O÷¦Z«$ER¿³H©TJ¹\NGGGÎýrñê Ϭ2ØÞµsn»{&]¯ß’ŽJ9ó sYX˜OíždfffYýWËÿÅÏÞºîü½÷•¯‘ߨ#?)•’r¹”ŽŽŽœý»ù«œ^%dÚßþ[I×ë7­’¿˜¢H^}rãÏ`ýýýÅØØXzzzÞñs[»¿¿¿ScôööcccéëëÛÔµKó73F’âäɓٿÿ¦®Mô÷÷ov €w&(ø5j5FÂ?FûèÌK/lýÛ+µtttdño¦^¯§òò¶wΤ³³3µZ-o>{1år)3ï›Ë/ÿþíkøõíèÝpþ¹­ÒhîØÕÕÌ¿˜z=©¼\Mqç|:;;šù—R.'·}bWr®ž¹¹¹T;jyyáÆ=ìî›_õû/ÍŸ¾|Ãòïùhuü"ÕŽR^|õÆý9þÀ?ËUõéÔ;{ëïï/ÆÇÇ7ýKjM°Ù1z{{‹©©©Mç·îw×1F‘ë{nmý‚=û¬ãÿ¶4Ù•n·ØIEND®B`‚angband-3.5.1/lib/user/0000755000175000017500000000000012456456606014164 5ustar chriscchriscangband-3.5.1/lib/user/Makefile0000644000175000017500000000007712456456606015630 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)buildsys.mk PACKAGE = user angband-3.5.1/lib/user/borg.txt0000644000175000017500000016175612456456606015676 0ustar chriscchrisc # This file will allow you to customize your APWBorg along certain themes. # The borg is fairly successful, having won the game several times. # However, some players/observers of borgs would like to see it function # differently. Some would like to see the borg play more aggressively, or # more conservatively. While others would like to value armour class more. # Still others would like to see it collect more speed items. # With the expressions below, you can influence the borg's behavior and # equipment selection choices. The 'borg_worship_' variables will influence # his equipment selection by adding additional bonuses to items which # enhance that attribute. For example: if a borg recieves 2000 pts for # a single point of armour class, an 'ac worshipping' borg would receive # 3000 pts. This bonus would significantly influence equipment choices. # borg_worships_gold explained: # The borg_worships_gold option will greatly impact how the borg treats items # which he finds in the dungeon. With this opion on, he will return to town # whenever he fills up with items then sell those items. This can cause # the borg to lose some artifacts, since he will sell them even if not ID'd. # Generally speaking the borg will not sell an item unless it is at least # psuedo ID'd. The benefit of this option is that the borg will significantly # increase his income at the low clevels. This will increase his survivablity # by allowing him to invest in armour and arrows. With this on, # he will not recall to town to sell stuff but climb the stairs instead. # He will also not recall into the dungeon until dlevel 8 (instead of 5). # This option has no effect after clevel 20. One other downside of this is # that the borg will spend more time in town and may have to evade Vets more. # To modify, simply set it to TRUE or FALSE. # NOTE: THERE MUST BE A SPACE AFTER THE = # option = TRUE is acceptable # option =TRUE is NOT acceptable and will result in a default value. # Worships borg_worships_damage = FALSE borg_worships_speed = FALSE borg_worships_hp = FALSE borg_worships_mana = FALSE borg_worships_ac = FALSE borg_worships_gold = FALSE # use the POWER_ and REQ_ lines below. If false the borg will # use the calcs in the C code. Which is recommended since I hone those # more frequently than I do the dynamic calcs. Most borg users will # have more successful borgs by leaving this option as FALSE. # note: the dynamic calcs are slower than the internal calcs borg_uses_dynamic_calcs = FALSE # Risky # A risky borg is one who is not confined by character level requirements # in order to dive deeper. It is also more likely to stay in a battle than # to teleport out. A risky borg will dive faster but is more likely to die. # A risky borg is not concerned with killing uniques before diving deeper. # # A borg who scums for uniques will set the auto_scum flag in order to generate # more exciting levels and hopefully encounter a unique # # borgs who kill_uniques will wait for uniques to die before diving deeper # into the dungeon. Usually, he will not dive deeper then three uniques. # Example, Unique Monsters who normally reside on levels 12, 15, and 18 are # still alive so the borg will not dive deeper than level 18 until at least one # of those uniques are dead. Setting this to FALSE will allow the borg to dive # deeper, faster, not being held up by the uniques. But, he does run the risk # of finding 3 or 4 uniques on one level. That can be a bit scary. borg_plays_risky = FALSE borg_scums_uniques = TRUE borg_kills_uniques = FALSE # Swap Items # The borg is designed to use Swap Items in the inventory. A swap item # is an equipment item (like a sword or armour item) which posseses a # desireable resistance or trait. If the borg is in danger, then he will # consider exchanging his current item for the swap item. A prime example of # this is at dungeon level 60. He is required to have several resists in # place. If he does not have them then he will not dive deeper. However, # with Swaps enabled he will select an item to cover the open resist then # dive down. Having Swaps enabled allows the borg to dive deeper, faster. # The draw back is the Swap Items take up two inventory slots. borg_uses_swaps = TRUE # Home Storage # The borg has two routines to store items in the home. One is very # effective and will make the best possible choice for adding an item to the # home. Unfortunately, this function is very slow. A much faster routine # will do a fine job at storing items in the home but it is not as # efficient. borg_slow_optimizehome = FALSE # Respawn # If the borg is in continual play mode (as with the screen saver), # he will respawn a randomly generated character at death. This section # allows the user to make certain bias for the type of character generated. # You may select the race and or class and or minimal stats for the Borg. # You may also select the minimal character level needed before the # character dump is created in the game directory. # With regards to race, the borg is programmed to accept the variety of # user defined races which may be in the p_info.txt file. So the values # given in table below are for the default races. But if you are bright # enough to modify the p_info.txt file then you are bright enough to figure # out that race 0 does not necessarily equal Human. It's just the first # race listed in your p_info.txt file. # # RACE:-1 Random Race CLASS: -1 Random Class # 0 Human 0 Warrior # 1 Half Elf 1 Mage # 2 Elf 2 Priest # 3 Hobbit 3 Rogue # 4 Gnome 4 Ranger # 5 Dwarf 5 Paladin # 6 Half Orc # 7 Half Troll # 8 Dunadan # 9 High Elf # 10 Kobold # # With regards to the stats. The minimal stats are rolled by the # borg. CON will be 16, the secondary stat (usually DEX) will be 17, # The primary stat will be 17. These are the maximal values which # can be rolled (racial and class bonuses added after). # If the borg can not reach the stats after 500,000 tries the game # will just assign you a random stat. # # After killing Morgoth, generally, the borg will stop and allow you # to inspect the victory. If you set the respawn_winners then after # killing Morgoth,the borg will generate a new character. A map file # is created so you can see what the final battle looked like. borg_respawn_race = -1 borg_respawn_class = -1 borg_respawn_winners = FALSE # Dumps # This variable will determine the minimal character level at which the borg # will create a character dump file. That file contains some vital information # concerning the status of the borg at the time of his demise. It is placed # in the user directory. # The borg_save_death variable will tell the borg to save the game in the user # directory so that it can be examined more closely. The clevel of the borg # must at least equal the borg_dump_level in order for the game to save. borg_dump_level = 1 borg_save_death = 1 # Auto Stops # The borg is able to stop when it reaches a certain dungeon depth or character # level. He will also stop when he wins the game. If you want him to keep # playing, even after Morgoth is dead, then change the borg_stop_king to FALSE. # Set the other values to the level at which you want the borg to stop. Set # them out of bounds if you do not want him to stop. borg_stop_dlevel = 128 borg_stop_clevel = 51 borg_no_deeper = 127 borg_stop_king = TRUE # Chest Tolerance # The borg is able to search, disarm, and open chests. There is a inherant # risk when dealing with chests. The risk of setting off the trap vs the # benefit of the loot within the chest. The game uses a straight forward # formula for calculating the success of a chest. It is: # randint(100) < the skill of the player minus the dificulty of the chest. # Difficulties run from 1 to 63. I would recommend a tolerance of about 7 # for vanilla chests (since they suck) and about 15 for DrAngband. borg_chest_fail_tolerance = 7 # Speed of the Borg # You can slow the borg down several different ways. One way is to set the # base game delay factor in the options menu. This will slow down the borg # and the visual effects (like missiles shooting, explosions). If using the # screensaver, you will need to load angband.exe load the savefile, make the # modifications, then save and exit. Another way to slow the borg down is # to add more term windows. The more it has to do, the slower it will be. # I recommend using Inventory, Equipment, Messages, Monster Recall, Borg # Status windows. Then you can really see what the borg is up to. Lastly, # to slow the borg down use the following variable. The formula is: # base_game_delay_factor^2 + borg_delay_factor^2. borg_delay_factor = 9 # Money Scumming # This started as more of a joke but it does have a useful purpose. If you # find yourself shopping in the BM and you really want that item and its just # out of your price range, then you can set a dollar amount into this variable # and the borg will run around town killing monsters and collecting items for # cash. Once he has reached his monetary goal, it will unhook and stop moving. # The borg will wait on the level, to build up more towns people, kill them, # buy food when it needs to. But it won't leave the level until the goal # is reached. To disengage the money scum, leave this variable at 0 (zero). # This will also simulate the borg_worships_gold and allow the borg to sell # non-ID'd items which will be dropped in town. The borg will flee from town # from Scary Guys. So keep this in mind with borgs under clevel 6. The borg # will not scum unless he has a perma light source (phial, or some glowing # artifact). The borg will stop if the General Store runs out of food to buy. # It is not recommended for borgs with Regeneration and no Slow # Digestion, since they will spend all their money on food. But if you have a # borg with Satisfy Hunger spell, they can stay in town forever. # NOTE: if a human wants the borg to scum to a particular amount, turn the # borg_self_scum to FALSE or else he will buy his own gear with that money. borg_money_scum_amount = 0 # Borg Scumming # This is a companion to the Money Scum above. The borg will scum town if # a stat potion is in the BM. If the borg finds an item in town that he would # really like to have, then he will stay in town until he can gathered enough # money to buy it. The borg will behave like the borg_money_scum_amount above. # If this is TRUE, then the borg is allowed to scum for items that he wants. # To forbid this behavior (which can take a very long time) set it FALSE. # NOTE: if a human wants the borg to scum to a particular amount, turn the # borg_self_scum to FALSE or else he will buy his own gear with that money. # Also, the borg must be at least clevel 10, with a perma light, # a 65% chance to avoid the pick pocket, and lots of food. borg_self_scum = TRUE # Lunal Borg # The borg will dive deep in the dungeon, even while he is still # low level, bouncing between levels to take nearby down stairs. # Once deep, he will gather items, then recall to town. He will not recall # back down into the dungeon, but walk all the way down again. If you want # a fast win, this is not the option for you. If you want the borg to have # maxed stats early on at the expense of game turns, then give this a try. # The best way to use this is to have a borg that can cast Satisfy Hunger. # This is a one way trip for the borg and he will be getting hungry. # The borg should also have a perma light source (like the phial). Again, # one way trip. He won't be stopping to restock his fuel source. However, # if he has food or fuel, he will use them when appropriate. Having extra # speed will help the borg too. Often he will come down the stairs, and # find himself right next to a monster. Sometimes, that monster can get # the first hit on a borg, killing him instantly. Even +3 speed would help # to avoid this type of instadeath. # # Self Lunal Mode will allow the borg to use the stair scumming in order to # dive deep in the dungeon for his own goals. For example, if the borg has # been down to depth 99, and now has no more potions of healing, he will # only be prepared for depth 45. He will remain shallow in the dungeon, # from depth 1-10 waiting for the shops to cycle. Then he will attempt to # buy a healing potion from the town shops. If none is available, he will # return to the shallow dungeon depths and wait for the shops to cycle. He # will repeat this pattern until he gets a potion of healing. If the borg # is allowed to self-lunal, then it will bounce the stairs down to a depth # where it feels comfortable. In the case above, it will do this until # about depth 40. borg_lunal_mode = FALSE borg_self_lunal = FALSE # Borg Verbose # Verbose is default off. It makes the borg give more reports on his actions # and thoughts. He still gives reports when verbose is FALSE, but when TRUE, # he really chats up a storm. borg_verbose = FALSE # Munchkin Start # Munchink start will have the borg stair-scum at depth 5-6, looking for items # which he will then sell in town. He will continue this process until about # clevel 6 or 7. The advantage is a sizable boost to his early income and # he can find some wands early on to assist with monster killing. borg_munchkin_start = TRUE # Enchant Limit # The borg knows how to enchant his equipment using scrolls and spells. # For ammo, he will stop enchanting about +10 or so. If he has access # to the *enchant* spell, he can go up to +15. But the borg will spend # a lot of time casting and resting in order to get his item up to +15. # The borg has plenty of time, to waste doing this. If you want a fast # win, then choose a lower number like +11. borg_enchant_limit = 12 # WARNING: If you mess with the objects.txt or the monster.txt and change # the locations of things, then you must make those changes in borg.txt # as well as in this borg code. The borg is very concerned about item # index locations. ie: borgs_has[242] is looking for a Potion of Healing. # The borg is concerned over several items, broken swords, and several # monster locations (Tarresque, Sauron, Morgoth). # CHANGE THIS AT YOUR OWN RISK. Changes here can cause VERY STUPID borg # behaviour. If you do change them and your borg acts goofy, do not email me # complaining that your borg keeps dying. Change these values if you know # exactly what you are doing. It is strongly recommended that you keep a # backup copy of a borg.txt. # requirements # format of line # REQ_CLASSaaa_DEPTHbbb_(special value) # NOTE: CLASS999 = all classes # NOTE: CLASS000 = Warrior # NOTE: CLASS001 = Mage # NOTE: CLASS002 = Priests # NOTE: CLASS003 = Rogue # NOTE: CLASS004 = Ranger # NOTE: CLASS005 = Paladin # NOTE: it is possible to do stupid/impossible things, like require the borg # to have 3 Ringils or carry 999 potions of healing to get to level 1. # there are no checks against such stupidity. # special values are: # _ITEMxxx = xxx is the index in k_info- Item in inventory # _WITEMxxx = xxx is the index in k_info- Item being worn # _ARTIFACTxxx = xxx is the index in a_info- Artifact being worn # _FORMULAxxx = formula found on seperate line # the rest do not require numbers. # Too add this to this list, add to array in borg1.c, add to enum in borg1.h # (those must always match) then make sure the value is set in borg4.c borg_notice() # -personal attributes # _STR (0-39. 3 = 0, 15 = 18/00-18/09, 39 = 18/220) # _INT # _WIS # _DEX # _CON # _CHR # _CSTR (3-238+, 18/09 = 27) # _CINT # _CWIS # _CDEX # _CCON # _CCHR # Sustain Stat: # _SSTR # _SINT # _SWIS # _SDEX # _SCON # _SCHR # # _LIGHT = Has Lite # _CURHP = Current HP # _MAXHP = Max HP # _OLDCHP = HP last round # _CURSP = Current Mana # _MAXSP = max Mana # _ADJSP = mana adj due to Int/Wis # _OLDCSP = SP last round # _SFAIL1 = fail rate from array1 # _SFAIL2 = min fail rate # _CLEVEL = cur char level # _MAXCLEVEL = Max char level # _ESP = has telepathy # _CURLITE = Lite Radius # _RECALL = number of 'Recall's # _FOOD = number of foods # _SPEED = base speed (110 = normal speed) # _SDIG = Slow Digest # _FEATH = feather fall # _REG = regen # _SINV = See invis # _INFRA = Infravision # _DIS = Base Disarm # _DEV = Base device use # _SAV = Base Saving throw # _STL = Stealth # _SRCH = Search # _SERCHFREQ = Search Frequency # _THN = To hit (normal) # _THB = To hit (shooting) # _THT = To hit (throwing) # _DIG = Digging # Ignores/Immune # _IFIRE # _IACID # _ICOLD # _IELEC # Resists # _RFIRE # _RCOLD # _RELEC # _RACID # _RPOIS # _RFEAR # _RLITE # _RDARK # _RBLIND # _RCONF # _RSND # _RSHRD # _RNXUS # _RNTHR # _RKAOS # _RDIS # _HLIFE = Hold Life # _FRACT = Free Action # same as without S but includes swap # _SRFIRE # _SRCOLD # _SRELEC # _SRACID # _SRPOIS # _SRFEAR # _SRLITE # _SRDARK # _SRBLIND # _SRCONF # _SRSND # _SRSHRD # _SRNXUS # _SRNTHR # _SRKAOS # _SRDIS # _SHLIFE # _SFRACT # _DEPTH = current depth being tested or Max Depth (for power) # _CDEPTH = current depth borg is on # when the borg is testing, he might see if he is ready for depth 10 while he is on # depth 9 # _MAXDEPTH = recall depth # _KING = ***WINNER*** # Player Status # _ISWEAK # _ISHUNGRY # _ISFULL # _ISGORGED # _ISBLIND # _ISAFRAID # _ISCONFUSED # _ISPOISONED # _ISCUT # _ISSTUN # _ISHEAVYSTUN # _ISIMAGE # _ISSTUDY # _ISSEARCHING # _ISFIXLEV # _ISFIXEXP # _ISFIXSTR # _ISFIXINT # _ISFIXWIS # _ISFIXDEX # _ISFIXCON # _ISFIXCHR # _ISFIXALL # _ARMOR = base AC # _TOHIT = base to hit, does not include weapon # _TODAM = base to damage, does not include weapon # _WTOHIT = weapon to hit # _WTODAM = weapon to damage # _BTOHIT = bow to hit # _BTODAM = bow to damage # _BLOWS = # attacks with current weapon # _SHOTS = # shots with current bow # _WMAXDAM = max damage per round with weapon (normal blow) # Assumes you can enchant to +8 if you are level 25+ # _WBASEDAM = base damage per round with weapon (normal blow) # Assumes you no bonuses for to hit # _BMAXDAM = max damage per round with bow (normal hit) # Assumes you can enchant to +8 if you are level 25+ # _HEAVYWEPON = Weapon is 'heavy' # _HEAVYBOW = bow is 'heavy' # _CRSTELE = random teleport # _CRSAGRV = Aggrevate # weapon attributes # WS = slays # _WSANIMAL # _WSEVIL # _WSUNDEAD # _WSDEMON # _WSORC # _WSTROLL # _WSGIANT # _WSDRAGON # WK = Weapon Kills # _WKDRAGON # _WKDEMON # _WKUNDEAD # _WIMPACT # WB = Weapon Branded With # _WBACID # _WBELEC # _WBFIRE # _WBCOLD # _WBPOIS # inventory amounts # _ATELEPORT # _AESCAPE # _FUEL # _HEAL # _EZHEAL # _ID # _ASPEED # STF = Staff # _ASTFMAGI Amount Staff Charges # _ASTFDEST # _AMISSILES only ones for your current bow count # _ACUREPOIS # _ADETTRAP # _ADETDOOR # _ADETEVIL # _AMAGICMAP # _ALITE # _ARECHARGE # _APFE = Protection from Evil # _AGLYPH = Rune Protection # _ACCW = CCW potions # _ACSW = CSW potions (+ CLW if cut) # _ARESHEAT = Resist Heat potion # _ARESCOLD = Resist Cold potion # _ATELEPORTLVL = Scroll of Teleport Level # _HWORD = Holy Word spell is legal # _ADETONATE = POTIONS TO THROW # _DINV = See Inv spell is legal # Formulas are in (ew) reverse polish notation. # Here is a copy of the formulas as defaults. # If you alter yours and mess them up, look here # to return them to the normal value. #FORMULA000=_CLEVEL 30 >= _ACCW _ACSW + 2 >= || #FORMULA001=_CLEVEL 30 >= _ACCW _ACSW + 3 >= || #FORMULA002=_ATELEPORT _AESCAPE + 2 >= #FORMULA003=_CLEVEL _DEPTH 4 - >= _CLEVEL 19 >= || #FORMULA004=_CLEVEL _DEPTH 5 + >= _CLEVEL 19 >= || #FORMULA005=_CLEVEL _DEPTH >= _CLEVEL 19 >= || #FORMULA006=_CLEVEL 30 >= _ACCW 5 >= || #FORMULA007=_ESP _SINV || _DINV || #FORMULA008=_RCOLD _RELEC + _RACID + 1 >= #FORMULA009=_CLEVEL _DEPTH 5 + >= _CLEVEL 38 > || #FORMULA010=_CLEVEL _DEPTH 8 + >= _CLEVEL 38 > || #FORMULA011=_CLEVEL 38 - 2 * 30 + _DEPTH >= _CLEVEL 45 > || #FORMULA012=_CLEVEL _DEPTH 10 - >= _CLEVEL 43 > || #FORMULA013=_CLEVEL _DEPTH 13 - >= _CLEVEL 46 > || #FORMULA014=_CLEVEL _DEPTH 8 - >= _CLEVEL 41 > || #FORMULA015=_CLEVEL _DEPTH 7 - >= _CLEVEL 40 > || #FORMULA016=_ATELEPORT _AESCAPE + 6 >= #FORMULA017=_CLEVEL 30 >= _ACCW _ACSW + 10 >= || #FORMULA018=_SHLIFE _CLEVEL 50 = || #FORMULA019=_HEAL _EZHEAL || #FORMULA020=_HEAL 1 > _EZHEAL || #FORMULA021=_WMAXDAM 20 * _BLOWS 1 + * # see also formulas 81+ #FORMULA022=_WBASEDAM _BLOWS * 1 * _WSANIMAL * #FORMULA023=_WBASEDAM _BLOWS * 140 * _WSEVIL * #FORMULA024=_WBASEDAM _BLOWS * 150 * _WSUNDEAD * _WKUNDEAD ! * #FORMULA025=_WBASEDAM _BLOWS * 90 * _WSDEMON * _WKDEMON ! * #FORMULA026=_WBASEDAM _BLOWS * 20 * _WSORC * #FORMULA027=_WBASEDAM _BLOWS * 45 * _WSTROLL * #FORMULA028=_WBASEDAM _BLOWS * 180 * _WSDRAGON * _WKDRAGON ! * #FORMULA029=_WBASEDAM _BLOWS * 120 * _WSGIANT * #FORMULA030=_WBASEDAM _BLOWS * 130 * _WBACID * #FORMULA031=_WBASEDAM _BLOWS * 150 * _WBELEC * #FORMULA032=_WBASEDAM _BLOWS * 90 * _WBFIRE * #FORMULA033=_WBASEDAM _BLOWS * 90 * _WBCOLD * #FORMULA034=_WBASEDAM _BLOWS * 250 * _WKDRAGON * # See formulas 81+ #CND035=_STR 9 < #FORMULA036=_SPEED 110 < _SPEED 114 > || _SPEED 110 - * 2500 * #CND037=_MAXHP 500 > #FORMULA038=_MAXHP 500 - 100 * #CND039=_CLEVEL 25 < #CND040=_ESP ! #FORMULA041=_CLEVEL 50 == _HLIFE && 200 * _CLEVEL 50 != _HLIFE && 2000 * + #FORMULA042=_RCOLD _RFIRE && _RACID && _RELEC && 10000 * #FORMULA043=_SSTR _SINT && _SWIS && _SCON && _SDEX && 1000 * #FORMULA044=_SINV _ESP || 100000 * #CND045=_CLEVEL 50 != #CND046=_ARMOR 15 < #CND047=_ARMOR 15 >= _ARMOR 75 < && #CND048=_ARMOR 75 >= #FORMULA049=_RCOLD _RFIRE && _RACID && _RELEC && 100000 * #CND050=_CDEPTH 90 > #CND051=_REG 1 >= #CND052=_ITEM419 0 == #CND056=_CLEVEL 1 == #CND057=_MAXSP 100 > #CND058=_STR 15 > #CND059 _IFIRE ! #CND060 _ICOLD ! #FORMULA061= _AHWORD 1000 >= #CND062=_RCONF ! _CLEVEL 35 < || #CND063=_RCONF ! #FORMULA064=_ADJSP 35000 * #CND065=_RBLIND ! #FORMULA066=_ADJSP 35000 * #CND067=_RPOIS ! #FORMULA068=_WBASEDAM _BLOWS * 90 * _WBPOIS * # #FORMULA071=_ITEM324 _ITEM327 + 3 < _ITEM324 _ITEM327 + * 500 * #FORMULA072=_ITEM324 _ITEM327 + 3 >= 3 * 500 * #FORMULA073=_CDEPTH ! _CURHP 60 >= || #FORMULA074=_CDEPTH ! _CURHP 80 >= || #FORMULA075=_CDEPTH ! _CLEVEL 6 >= || #FORMULA076=_CDEPTH ! _CLEVEL 15 >= || #FORMULA077=_CDEPTH ! _CLEVEL 10 >= || #CND080=_STR 7 > # #Also see formulas 22-34 #FORMULA081=_WBASEDAM _BLOWS * 40 * _WSORC * _WSEVIL ! * #FORMULA082=_WBASEDAM _BLOWS * 45 * _WSTROLL * _WSEVIL ! * #FORMULA083=_WBASEDAM _BLOWS * 20 * _WSANIMAL * _WBELEC ! * #FORMULA085=_WBASEDAM _BLOWS * 175 * _WKUNDEAD * #FORMULA086=_WBASEDAM _BLOWS * 150 * _WKDEMON * #CND087= _CLEVEL 10 <= #FORMULA088= _FUEL 5 >= _LIGHT 1 >= || # #(heal + ez_heal > 30) && (ez_heal > 20) #FORMULA111=_ITEM242 _EZHEAL + 30 > _EZHEAL 20 >= && # things marked depth 99 and greater are ignored if Morgoth is dead REQ_CLASS999_DEPTH001_CURLITE=1 REQ_CLASS999_DEPTH001_FOOD=5 REQ_CLASS999_DEPTH002_CURLITE=2 REQ_CLASS999_DEPTH002_FORMULA088 REQ_CLASS999_DEPTH002_RECALL=1 REQ_CLASS999_DEPTH002_CURHP=30 REQ_CLASS000_DEPTH003_CURHP=50 REQ_CLASS000_DEPTH003_CLEVEL=4 REQ_CLASS001_DEPTH003_CURHP=60 REQ_CLASS001_DEPTH003_CLEVEL=11 REQ_CLASS002_DEPTH003_CURHP=50 REQ_CLASS002_DEPTH003_CLEVEL=9 REQ_CLASS003_DEPTH003_CURHP=50 REQ_CLASS003_DEPTH003_CLEVEL=8 REQ_CLASS004_DEPTH003_CURHP=50 REQ_CLASS004_DEPTH003_CLEVEL=4 REQ_CLASS005_DEPTH003_CURHP=50 REQ_CLASS005_DEPTH003_CLEVEL=4 REQ_CLASS999_DEPTH003_FORMULA000 # this isn't quite what the original code did but no matter, it is commmented # out in the original code. # REQ_CLASS999_DEPTH003_ID=2 REQ_CLASS000_DEPTH005_FORMULA073 REQ_CLASS000_DEPTH005_FORMULA075 REQ_CLASS001_DEPTH005_FORMULA074 REQ_CLASS001_DEPTH005_FORMULA076 REQ_CLASS002_DEPTH005_FORMULA073 REQ_CLASS002_DEPTH005_FORMULA076 REQ_CLASS003_DEPTH005_FORMULA073 REQ_CLASS003_DEPTH005_FORMULA077 REQ_CLASS004_DEPTH005_FORMULA073 REQ_CLASS004_DEPTH005_FORMULA075 REQ_CLASS005_DEPTH005_FORMULA073 REQ_CLASS005_DEPTH005_FORMULA075 # this isn't quite what the original code did but no matter, it is commmented # out in the original code. # REQ_CLASS999_DEPTH005_ID=5 REQ_CLASS999_DEPTH005_RECALL=2 REQ_CLASS999_DEPTH010_FORMULA001 REQ_CLASS999_DEPTH010_FORMULA002 REQ_CLASS000_DEPTH011_FORMULA003 REQ_CLASS001_DEPTH011_FORMULA004 REQ_CLASS002_DEPTH011_FORMULA005 REQ_CLASS003_DEPTH011_FORMULA005 REQ_CLASS004_DEPTH011_FORMULA005 REQ_CLASS005_DEPTH011_FORMULA005 # REQ_CLASS999_DEPTH010_ID=10 REQ_CLASS999_DEPTH010_FORMULA007 REQ_CLASS999_DEPTH020_FORMULA006 REQ_CLASS999_DEPTH020_FRACT=1 REQ_CLASS999_DEPTH021_SRFIRE=1 REQ_CLASS999_DEPTH021_FORMULA008 REQ_CLASS999_DEPTH021_CSTR=7 REQ_CLASS999_DEPTH021_CDEX=7 REQ_CLASS999_DEPTH021_CCON=7 REQ_CLASS001_DEPTH021_CINT=7 REQ_CLASS003_DEPTH021_CINT=7 REQ_CLASS004_DEPTH021_CINT=7 REQ_CLASS002_DEPTH021_CWIS=7 REQ_CLASS005_DEPTH021_CWIS=7 REQ_CLASS000_DEPTH021_FORMULA009 REQ_CLASS001_DEPTH021_FORMULA010 REQ_CLASS001_DEPTH033_FORMULA011 REQ_CLASS003_DEPTH021_FORMULA012 REQ_CLASS002_DEPTH021_FORMULA013 REQ_CLASS004_DEPTH021_FORMULA014 REQ_CLASS005_DEPTH021_FORMULA015 REQ_CLASS999_DEPTH026_FORMULA016 REQ_CLASS999_DEPTH026_FORMULA017 REQ_CLASS999_DEPTH030_ATELEPORT=1 REQ_CLASS999_DEPTH030_SRCOLD=1 REQ_CLASS999_DEPTH030_SRACID=1 REQ_CLASS999_DEPTH030_SRELEC=1 REQ_CLASS999_DEPTH034_CLEVEL=40 REQ_CLASS999_DEPTH035_SRPOIS=1 REQ_CLASS999_DEPTH040_CSTR=16 REQ_CLASS999_DEPTH040_CDEX=16 REQ_CLASS999_DEPTH040_CCON=16 REQ_CLASS001_DEPTH040_CINT=16 REQ_CLASS003_DEPTH040_CINT=16 REQ_CLASS004_DEPTH040_CINT=16 REQ_CLASS002_DEPTH040_CWIS=16 REQ_CLASS005_DEPTH040_CWIS=16 REQ_CLASS999_DEPTH046_SPEED=115 REQ_CLASS999_DEPTH046_RCONF=1 REQ_CLASS999_DEPTH046_CURHP=500 REQ_CLASS999_DEPTH046_CSTR=58 REQ_CLASS999_DEPTH046_CDEX=68 REQ_CLASS001_DEPTH046_CINT=118 REQ_CLASS003_DEPTH046_CINT=115 REQ_CLASS004_DEPTH046_CINT=115 REQ_CLASS002_DEPTH046_CWIS=118 REQ_CLASS005_DEPTH046_CWIS=115 REQ_CLASS999_DEPTH046_FORMULA018 REQ_CLASS999_DEPTH046_FORMULA019 REQ_CLASS999_DEPTH056_FORMULA020 REQ_CLASS999_DEPTH056_SRBLIND=1 #REQ_CLASS999_DEPTH056_SRNTHR=1 REQ_CLASS999_DEPTH056_ESP=1 REQ_CLASS999_DEPTH060_SPEED=120 REQ_CLASS999_DEPTH060_SRKAOS=1 REQ_CLASS999_DEPTH060_SRDIS=1 REQ_CLASS999_DEPTH081_SPEED=130 # p of restore Mana REQ_CLASS001_DEPTH100_ITEM266=10 REQ_CLASS002_DEPTH100_ITEM266=10 REQ_CLASS003_DEPTH100_ITEM266=10 REQ_CLASS004_DEPTH100_ITEM266=10 REQ_CLASS005_DEPTH100_ITEM266=10 # p of Healing REQ_CLASS999_DEPTH100_FORMULA111 # (heal + ez_heal > 30) && (ez_heal > 20) FORMULA111=_ITEM242 _EZHEAL + 30 > _EZHEAL 20 >= && REQ_CLASS999_DEPTH100_EZHEAL=15 # p of speed REQ_CLASS999_DEPTH100_ASPEED=10 #REQ_CLASS999_DEPTH101_KING=1 # Formulas are in (ew) reverse polish notation. # Sorry, it was easiest to process. # I will comment translations above the formulas for # people who are not reverse polish. # ((max_level >= 30) || ((ccw+csw) >= 2)) FORMULA000=_CLEVEL 30 >= _ACCW _ACSW + 2 >= || # ((max_level >= 30) || ((ccw+csw) >= 3)) FORMULA001=_CLEVEL 30 >= _ACCW _ACSW + 3 >= || # amt_teleport + amt_escape >= 2 FORMULA002=_ATELEPORT _AESCAPE + 2 >= # max_level >= depth - 4 || clevel >= 19 FORMULA003=_CLEVEL _DEPTH 4 - >= _CLEVEL 19 >= || # max_level >= depth + 5 || clevel >= 19 FORMULA004=_CLEVEL _DEPTH 5 + >= _CLEVEL 19 >= || # max_level >= depth || clevel >= 19 FORMULA005=_CLEVEL _DEPTH >= _CLEVEL 19 >= || # ((max_level >= 30) || (CCW >= 5)) FORMULA006=_CLEVEL 30 >= _ACCW 5 >= || # see invis or telepathy FORMULA007=_ESP _SINV || _DINV || # one resist (other than fire) FORMULA008=_RCOLD _RELEC + _RACID + 1 >= # max_level >= depth + 5 || max_level > 38 FORMULA009=_CLEVEL _DEPTH 5 + >= _CLEVEL 38 > || # max_level >= depth + 8 || max_level > 38 FORMULA010=_CLEVEL _DEPTH 8 + >= _CLEVEL 38 > || # (max_level-38)*2+30 <= dlevel (or clevel > 45) FORMULA011=_CLEVEL 38 - 2 * 30 + _DEPTH >= _CLEVEL 45 > || # max_level >= depth - 10 || max_level > 43 FORMULA012=_CLEVEL _DEPTH 10 - >= _CLEVEL 43 > || # max_level >= depth - 13 || max_level > 46 FORMULA013=_CLEVEL _DEPTH 13 - >= _CLEVEL 46 > || # max_level >= depth - 8 || max_level >= 41 FORMULA014=_CLEVEL _DEPTH 8 - >= _CLEVEL 41 > || # max_level >= depth - 7 || max_level >= 40 FORMULA015=_CLEVEL _DEPTH 7 - >= _CLEVEL 40 > || # amt_teleport + amt_escape >= 6 FORMULA016=_ATELEPORT _AESCAPE + 6 >= # ((max_level >= 30) || ((ccw+csw) >= 10)) FORMULA017=_CLEVEL 30 >= _ACCW _ACSW + 10 >= || # if below level 50, must have hold life FORMULA018=_SHLIFE _CLEVEL 50 = || # have some heal or ez heal FORMULA019=_HEAL _EZHEAL || # have 2 heal or 1 ez heal FORMULA020=_HEAL 1 > _EZHEAL || # Priests have Holy Word CND061= _AHWORD 1000 >= # HP must be more than x unless we are checking from town (_CDEPTH 0) FORMULA073=_CDEPTH ! _CURHP 60 >= || FORMULA074=_CDEPTH ! _CURHP 80 >= || # player level must be more than x0 unless we are checking from town (_CDEPTH 0) FORMULA075=_CDEPTH ! _CLEVEL 6 >= || FORMULA076=_CDEPTH ! _CLEVEL 15 >= || FORMULA077=_CDEPTH ! _CLEVEL 10 >= || #BI_FUEL >= 5 || BI_LIGHT >= 1 FORMULA088= _FUEL 5 >= _LIGHT 1 >= || # Power calculations # CHANGE THIS AT YOUR OWN RISK. Changes here can cause VERY STUPID borg # behavior. # Stuff left in code: 1) heavy armor gives a sliding loss of power # 2) bad gloves on a mage, -275K # 3) bad weapon on a priest, -75K # 4) special bonus for one item with RNeth RDisn RChaos = 25K # 5) special bonus for one item with RNeth RDisn = 15K # 6) CSW reward (complex) # 7) low level spell books (complex... need to know what you can cast) # 8) state specific things. This includes, enchant weapon scrolls when # weapon needs enchanting, restore stat potions, cures when injured in town, # and extra food when hungry # 9) weight/encumbrance penalty (too complex) # 10) reward for empty slots (to avoid carrying worthless junk) 4K/slot # # POWER_CLASSxxx_DEPTHxxx_CNDxxx_RANGExxxTOxxx_(special value)=xxx EACH # NOTE: CND is optional. It refers to a _FORMULA line later. The formula will be # evalulated and, if it is 0, the power calc is skipped # NOTE: EACH is optional. # NOTE: with range, only amounts in that range will count. # so if range is RANGE006TO007 and you have 12, you get # 2 * the 'power' with 'each' or nothing if not each # Range is ignored for formulas (gives an error) # NOTE: _RANGE000TO999 is a special case. it means 'no range used' # things marked depth 99 and greater are ignored if Morgoth is dead # 20 per damage point * (blows + 1) POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA021 FORMULA021=_WMAXDAM 20 * _BLOWS 1 + * POWER_CLASS999_DEPTH000_RANGE000TO999_TOHIT= 750 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_WTOHIT= 750 EACH # slays and such... yikes! POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA022 POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA083 #Brands rewarded if Kill Brand not there. #SAnimal is rewarded only if weapon is not electric brand. FORMULA022=_WBASEDAM _BLOWS * 1 * _WSANIMAL * FORMULA083=_WBASEDAM _BLOWS * 20 * _WSANIMAL * _WBELEC ! * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA023 FORMULA023=_WBASEDAM _BLOWS * 140 * _WSEVIL * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA024 FORMULA024=_WBASEDAM _BLOWS * 150 * _WSUNDEAD * _WKUNDEAD ! * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA025 FORMULA025=_WBASEDAM _BLOWS * 90 * _WSDEMON * _WKDEMON ! * #SOrc is rewarded more if slay evil is not possesed POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA026 POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA081 FORMULA026=_WBASEDAM _BLOWS * 20 * _WSORC * FORMULA081=_WBASEDAM _BLOWS * 20 * _WSORC * _WSEVIL ! * #STroll is rewarded more if slay evil is not possesed POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA027 POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA082 FORMULA027=_WBASEDAM _BLOWS * 45 * _WSTROLL * FORMULA082=_WBASEDAM _BLOWS * 45 * _WSTROLL * _WSEVIL ! * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA028 FORMULA028=_WBASEDAM _BLOWS * 180 * _WSDRAGON * _WKDRAGON ! * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA029 FORMULA029=_WBASEDAM _BLOWS * 120 * _WSGIANT * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA030 FORMULA030=_WBASEDAM _BLOWS * 130 * _WBACID * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA031 FORMULA031=_WBASEDAM _BLOWS * 150 * _WBELEC * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA032 FORMULA032=_WBASEDAM _BLOWS * 90 * _WBFIRE * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA033 FORMULA033=_WBASEDAM _BLOWS * 90 * _WBCOLD * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA033 FORMULA068=_WBASEDAM _BLOWS * 90 * _WBPOIS * #Kills brands POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA034 FORMULA034=_WBASEDAM _BLOWS * 250 * _WKDRAGON * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA085 FORMULA085=_WBASEDAM _BLOWS * 175 * _WKUNDEAD * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA086 FORMULA086=_WBASEDAM _BLOWS * 150 * _WKDEMON * POWER_CLASS999_DEPTH000_RANGE000TO999_WIMPACT=5000 POWER_CLASS999_DEPTH000_CND080_RANGE000TO999_HEAVYWEPON=-8000 CND080=_STR 7 > POWER_CLASS999_DEPTH000_RANGE000TO999_HEAVYBOW=-500000 # Borg worships num_blow, even on broken swords. # kind 47 is a broken sword usually 1d2 in damage POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM030=-90000 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM047=-90000 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM390=-90000 # slings force you to carry heavy ammo. Penalty for that unles you have lots of str POWER_CLASS999_DEPTH000_CND035_RANGE000TO999_WITEM077= -5000 CND035=_STR 9 < #We want the borg to use whips and daggers at first POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_BLOWS= 45000 EACH CND087= _CLEVEL 10 <= # bow damage POWER_CLASS999_DEPTH000_RANGE000TO999_BMAXDAM= 9 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_TOHIT= 250 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_BTOHIT= 250 EACH #We want low level dudes to really like ranged weaps POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_BMAXDAM= 300 EACH POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_TOHIT= 300 EACH POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_BTOHIT= 300 EACH #We want low level dudes to buy a sling asap POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_WITEM073= 3000 POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_WITEM074= 3000 POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_WITEM075= 3000 POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_WITEM076= 3000 POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_WITEM077= 3000 # Rangers perfer bows POWER_CLASS004_DEPTH000_RANGE000TO999_WITEM073= 30000 POWER_CLASS004_DEPTH000_RANGE000TO999_WITEM074= 30000 # Dragon armor liked for the activation. (AJG: I adjusted this slightly) POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM400=1100 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM401=1100 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM402=1100 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM403=1100 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM404=2750 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM405=3250 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM406=5550 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM407=5650 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM408=5750 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM409=5850 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM410=5950 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM411=5975 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM412=5999 # Light bonuses POWER_CLASS999_DEPTH000_RANGE000TO000_CURLITE=-3000 POWER_CLASS999_DEPTH000_RANGE001TO003_CURLITE=500000 EACH POWER_CLASS999_DEPTH000_RANGE003TO099_CURLITE=580000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT001=8000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT002=10000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT003=12000 # Speed formulas are slightly complex. Note negative for poor speed # 110 is the base speed # (Speed - 110) * 2500 POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA036 FORMULA036=_SPEED 110 < _SPEED 114 > || _SPEED 110 - * 2500 * POWER_CLASS999_DEPTH000_RANGE111TO999_SPEED= 1000 EACH POWER_CLASS999_DEPTH000_RANGE110TO114_SPEED= 55000 POWER_CLASS999_DEPTH000_RANGE115TO119_SPEED= 75000 POWER_CLASS999_DEPTH000_RANGE120TO124_SPEED= 100000 POWER_CLASS999_DEPTH000_RANGE125TO129_SPEED= 125000 POWER_CLASS999_DEPTH000_RANGE130TO134_SPEED= 140000 POWER_CLASS999_DEPTH000_RANGE135TO139_SPEED= 155000 POWER_CLASS999_DEPTH000_RANGE140TO144_SPEED= 165000 POWER_CLASS999_DEPTH000_RANGE145TO149_SPEED= 170000 POWER_CLASS999_DEPTH000_RANGE150TO999_SPEED= 175000 # stat bonuses POWER_CLASS999_DEPTH000_RANGE000TO999_STR= 100 EACH # note: division of bonus based on class POWER_CLASS001_DEPTH000_RANGE000TO999_INT= 200 EACH POWER_CLASS002_DEPTH000_RANGE000TO999_WIS= 200 EACH POWER_CLASS003_DEPTH000_RANGE000TO999_INT= 200 EACH POWER_CLASS004_DEPTH000_RANGE000TO999_INT= 200 EACH POWER_CLASS005_DEPTH000_RANGE000TO999_WIS= 200 EACH # we can't directly give a bonus for mana or your bonus # would adjust as you cast spells. Instead we give a # bonus for 'mana adjustment' based on stats POWER_CLASS001_DEPTH000_RANGE000TO999_ADJSP= 255 EACH POWER_CLASS002_DEPTH000_RANGE000TO999_ADJSP= 250 EACH POWER_CLASS003_DEPTH000_RANGE000TO999_ADJSP= 155 EACH POWER_CLASS004_DEPTH000_RANGE000TO999_ADJSP= 155 EACH POWER_CLASS005_DEPTH000_RANGE000TO999_ADJSP= 150 EACH # The fail rate is based on the table adj_mag_stat[] POWER_CLASS001_DEPTH000_RANGE000TO999_SFAIL1= 5010 EACH POWER_CLASS002_DEPTH000_RANGE000TO999_SFAIL1= 5000 EACH POWER_CLASS003_DEPTH000_RANGE000TO999_SFAIL1= 3010 EACH POWER_CLASS004_DEPTH000_RANGE000TO999_SFAIL1= 3010 EACH POWER_CLASS005_DEPTH000_RANGE000TO999_SFAIL1= 3000 EACH # This is the 'min fail rate' and it is nice if it is 0 # (note range 0 to 0) (I hope this works) POWER_CLASS001_DEPTH000_RANGE000TO002_SFAIL2= 70000 POWER_CLASS002_DEPTH000_RANGE000TO002_SFAIL2= 70000 # Priests with Holy Word legal try to maximize WIS POWER_CLASS002_DEPTH000_CND061_RANGE000TO999_FORMULA064 FORMULA064=_ADJSP 35000 * POWER_CLASS999_DEPTH000_RANGE000TO999_DEX= 120 EACH # like spell points, hit points are 'powered' based on your hp bonus # which is based on your con and adj_con_mhp[] POWER_CLASS999_DEPTH000_RANGE000TO999_CON= 150 EACH # first 500 hp's are more important than the next 500 POWER_CLASS999_DEPTH000_RANGE000TO500_MAXHP= 350 EACH # can't use the range because of the 999 max :-( POWER_CLASS999_DEPTH000_CND037_RANGE000TO999_FORMULA038 CND037=_MAXHP 500 > FORMULA038=_MAXHP 500 - 100 * # charisma is only nice at low levels POWER_CLASS999_DEPTH000_CND039_RANGE000TO999_CHR= 2 EACH CND039=_CLEVEL 25 < # 'minor' skills POWER_CLASS999_DEPTH000_RANGE000TO999_DIS= 2 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_DEV= 25 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_SAV= 25 EACH POWER_CLASS999_DEPTH000_RANGE100TO999_SAV= 10000 POWER_CLASS999_DEPTH000_RANGE000TO999_STL= 2 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_SRCH= 1 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_SERCHFREQ= 1 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_THN= 5 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_THB= 35 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_THT= 2 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_DIG= 2 EACH # other powers POWER_CLASS999_DEPTH000_RANGE000TO999_SDIG= 750 # note: after depth 20 you only get 50 for Feather fall (500-450) POWER_CLASS999_DEPTH000_RANGE000TO999_FEATH= 500 POWER_CLASS999_DEPTH020_RANGE000TO999_FEATH= -450 POWER_CLASS999_DEPTH000_RANGE000TO999_LIGHT= 2000 # 500 for ESP & See inv, 5000 for just see inv (ESP is rewarded later) POWER_CLASS999_DEPTH000_RANGE000TO999_SINV= 500 POWER_CLASS999_DEPTH000_CND040_RANGE000TO999_SINV= 4500 CND040=_ESP ! POWER_CLASS999_DEPTH000_RANGE000TO999_FRACT= 10000 # only 200 pts for Hold Life if you have maxed out your level POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA041 FORMULA041=_CLEVEL 50 == _HLIFE && 200 * _CLEVEL 50 != _HLIFE && 2000 * + POWER_CLASS999_DEPTH000_RANGE000TO999_REG= 2000 POWER_CLASS999_DEPTH000_RANGE000TO999_ESP= 80000 POWER_CLASS999_DEPTH000_RANGE000TO999_ICOLD= 50000 POWER_CLASS999_DEPTH000_RANGE000TO999_IELEC= 25000 POWER_CLASS999_DEPTH000_RANGE000TO999_IFIRE= 70000 POWER_CLASS999_DEPTH000_RANGE000TO999_IACID= 30000 POWER_CLASS999_DEPTH000_RANGE000TO999_RCOLD= 3000 POWER_CLASS999_DEPTH000_RANGE000TO999_RELEC= 4000 POWER_CLASS999_DEPTH000_RANGE000TO999_RACID= 6000 POWER_CLASS999_DEPTH000_RANGE000TO999_RFIRE= 8000 # special bonus for base 4 resists POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA042 FORMULA042=_RCOLD _RFIRE && _RACID && _RELEC && 10000 * POWER_CLASS999_DEPTH000_RANGE000TO999_RPOIS= 20000 POWER_CLASS999_DEPTH000_RANGE000TO999_RSND= 3500 POWER_CLASS999_DEPTH000_RANGE000TO999_RLITE= 800 POWER_CLASS999_DEPTH000_RANGE000TO999_RDARK= 800 POWER_CLASS999_DEPTH000_RANGE000TO999_RKAOS= 5000 # note, this is especially high because some items (CCW) give # extra bonuses if you don't have RCONF, so we need to ensure # you will not do that -instead- of getting RCONF POWER_CLASS999_DEPTH000_RANGE000TO999_RCONF= 80000 # and a little extra for a mage. POWER_CLASS001_DEPTH000_RANGE000TO999_RCONF= 2000 POWER_CLASS999_DEPTH000_RANGE000TO999_RDIS= 5000 POWER_CLASS999_DEPTH000_RANGE000TO999_RSHRD= 100 POWER_CLASS999_DEPTH000_RANGE000TO999_RNXUS= 100 POWER_CLASS999_DEPTH000_RANGE000TO999_RBLIND= 5000 POWER_CLASS999_DEPTH000_RANGE000TO999_RNTHR= 5500 POWER_CLASS999_DEPTH000_RANGE000TO999_RFEAR= 2000 # sustains # note: don't care about SCHR POWER_CLASS999_DEPTH000_RANGE000TO999_SSTR= 50 POWER_CLASS999_DEPTH000_RANGE000TO999_SINT= 50 POWER_CLASS999_DEPTH000_RANGE000TO999_SWIS= 50 POWER_CLASS999_DEPTH000_RANGE000TO999_SCON= 50 POWER_CLASS999_DEPTH000_RANGE000TO999_SDEX= 50 # special bonus for sustain all POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA043 FORMULA043=_SSTR _SINT && _SWIS && _SCON && _SDEX && 1000 * # special rewards for 'must have' (based on requirements above) POWER_CLASS999_DEPTH009_RANGE000TO999_FORMULA044 FORMULA044=_SINV _ESP || 100000 * POWER_CLASS999_DEPTH019_RANGE000TO999_FRACT= 100000 POWER_CLASS999_DEPTH024_RANGE000TO999_RFIRE= 100000 POWER_CLASS999_DEPTH035_RANGE000TO999_RPOIS= 100000 POWER_CLASS999_DEPTH030_RANGE000TO999_RELEC= 100000 POWER_CLASS999_DEPTH030_RANGE000TO999_RACID= 100000 POWER_CLASS999_DEPTH030_RANGE000TO999_RCOLD= 100000 POWER_CLASS999_DEPTH040_RANGE000TO999_RCONF= 100000 POWER_CLASS999_DEPTH045_CND045_RANGE000TO999_HLIFE= 100000 CND045=_CLEVEL 50 != POWER_CLASS999_DEPTH045_RANGE115TO999_SPEED= 100000 # note: Resist nether shows up several times... it is important POWER_CLASS999_DEPTH049_RANGE000TO999_RNTHR= 55000 POWER_CLASS999_DEPTH049_RANGE000TO999_RSND= 100000 POWER_CLASS999_DEPTH054_RANGE000TO999_RBLIND= 100000 POWER_CLASS999_DEPTH054_RANGE000TO999_ESP= 100000 POWER_CLASS999_DEPTH059_RANGE000TO999_RNTHR= 55000 POWER_CLASS999_DEPTH059_RANGE000TO999_RKAOS= 104000 POWER_CLASS999_DEPTH059_RANGE000TO999_RDIS= 90000 # speed above 120 gets a bonus POWER_CLASS999_DEPTH059_RANGE120TO999_SPEED= 100000 # speed above 130 gets a bonus POWER_CLASS999_DEPTH079_RANGE130TO999_SPEED= 100000 POWER_CLASS999_DEPTH079_RANGE000TO999_RNTHR= 15000 POWER_CLASS999_DEPTH079_RANGE000TO999_RDARK= 25000 # Warrior's get an extra bonus for speed about 140 POWER_CLASS000_DEPTH079_RANGE140TO999_SPEED= 100000 # AC Bonuses (dependant on level) POWER_CLASS999_DEPTH000_CND046_RANGE000TO999_ARMOR= 2000 EACH CND046=_ARMOR 15 < POWER_CLASS999_DEPTH000_CND047_RANGE000TO999_ARMOR= 500 EACH CND047=_ARMOR 15 >= _ARMOR 75 < && POWER_CLASS999_DEPTH000_CND048_RANGE000TO999_ARMOR= 100 EACH CND048=_ARMOR 75 >= # cursed items POWER_CLASS999_DEPTH000_RANGE000TO999_CRSTELE= -100000 POWER_CLASS000_DEPTH000_RANGE000TO999_CRSAGRV= -80000 POWER_CLASS001_DEPTH000_RANGE000TO999_CRSAGRV= -8000 POWER_CLASS002_DEPTH000_RANGE000TO999_CRSAGRV= -80000 POWER_CLASS003_DEPTH000_RANGE000TO999_CRSAGRV= -80000 POWER_CLASS004_DEPTH000_RANGE000TO999_CRSAGRV= -80000 POWER_CLASS005_DEPTH000_RANGE000TO999_CRSAGRV= -80000 # Depth 99+, assume going after Morgoth. # note: these are ignored if Morgoth is dead #POWER_CLASS999_DEPTH099_RANGE000TO999_SSTR= 35000 #POWER_CLASS001_DEPTH099_RANGE000TO999_SINT= 45000 #POWER_CLASS003_DEPTH099_RANGE000TO999_SINT= 45000 #POWER_CLASS004_DEPTH099_RANGE000TO999_SINT= 45000 #POWER_CLASS002_DEPTH099_RANGE000TO999_SWIS= 35000 #POWER_CLASS005_DEPTH099_RANGE000TO999_SWIS= 35000 #POWER_CLASS999_DEPTH099_RANGE000TO999_SCON= 55000 #POWER_CLASS999_DEPTH099_RANGE000TO999_SDEX= 15000 #POWER_CLASS999_DEPTH099_RANGE000TO999_WSEVIL= 15000 #POWER_CLASS999_DEPTH099_RANGE000TO999_RNTHR= 15000 #POWER_CLASS999_DEPTH099_RANGE000TO999_RDIS= 15000 #POWER_CLASS999_DEPTH099_RANGE000TO999_RPOIS= 100000 #Pots of Berserk Str for non Priest/Mage POWER_CLASS000_DEPTH099_RANGE000TO999_ITEM258= 2000 EACH POWER_CLASS003_DEPTH099_RANGE000TO999_ITEM258= 2000 EACH POWER_CLASS004_DEPTH099_RANGE000TO999_ITEM258= 2000 EACH POWER_CLASS005_DEPTH099_RANGE000TO999_ITEM258= 2000 EACH # Mass Banishment Scrolls POWER_CLASS999_DEPTH099_RANGE000TO999_AMASSBAN= 2500 EACH # Heal Pots POWER_CLASS005_DEPTH099_RANGE000TO999_ITEM242= 2000 EACH # Res Mana pots POWER_CLASS005_DEPTH099_RANGE000TO999_ITEM266= 2000 EACH #POWER_CLASS999_DEPTH099_RANGE000TO999_FORMULA049 FORMULA049=_RCOLD _RFIRE && _RACID && _RELEC && 100000 * #POWER_CLASS999_DEPTH099_RANGE000TO999_AGLYPH= 2500 EACH # artifact activation bonuses POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT001= 1500 POWER_CLASS001_DEPTH000_RANGE000TO999_ARTIFACT001= 500 POWER_CLASS002_DEPTH000_RANGE000TO999_ARTIFACT001= 500 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT001= 1000 POWER_CLASS004_DEPTH000_RANGE000TO999_ARTIFACT001= 1000 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT001= 1000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT002= 1200 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT001= 2000 POWER_CLASS001_DEPTH000_RANGE000TO999_ARTIFACT003= 2000 POWER_CLASS002_DEPTH000_RANGE000TO999_ARTIFACT003= 1500 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT003= 2000 POWER_CLASS004_DEPTH000_RANGE000TO999_ARTIFACT003= 2000 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT003= 2000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT067= 527 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT068= 518 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT069= 524 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT070= 596 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT072= 554 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT082= 700 # NOTE: Don't do this if you are using random artifacts (ringil speed bonus) # POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT082= 25000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT083= 644 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT093= 620 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT097= 700 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT112= 700 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT115= 644 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT122= 590 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT016= 800 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT053= 507 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT054= 540 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT055= 527 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT056= 518 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT057= 522 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT059= 650 # NOTE: Don't do this if you are using random artifacts (Feanor special bonus) # POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT060= 5000 # Ok so I fudged this one: Dispel Evil (it was a nice formula in the code) # I took a random average POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT005= 650 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT010= 740 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT011= 900 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT012= 1000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT013= 999999 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT108= 1000 POWER_CLASS001_DEPTH000_RANGE000TO999_ARTIFACT108= 500 POWER_CLASS002_DEPTH000_RANGE000TO999_ARTIFACT108= 1000 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT108= 1000 POWER_CLASS004_DEPTH000_RANGE000TO999_ARTIFACT108= 1000 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT108= 1000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT017= 650 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT017= 25000 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT017= 25000 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT017= 25000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT044= 650 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT044= 25000 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT044= 25000 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT044= 25000 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT045= 7500 POWER_CLASS001_DEPTH000_RANGE000TO999_ARTIFACT045= 500 POWER_CLASS002_DEPTH000_RANGE000TO999_ARTIFACT045= 500 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT045= 700 POWER_CLASS004_DEPTH000_RANGE000TO999_ARTIFACT045= 700 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT045= 700 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT046= 600 POWER_CLASS001_DEPTH000_RANGE000TO999_ARTIFACT046= 500 POWER_CLASS002_DEPTH000_RANGE000TO999_ARTIFACT046= 600 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT046= 600 POWER_CLASS004_DEPTH000_RANGE000TO999_ARTIFACT046= 600 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT046= 600 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT061= 700 POWER_CLASS001_DEPTH000_RANGE000TO999_ARTIFACT061= 500 POWER_CLASS002_DEPTH000_RANGE000TO999_ARTIFACT061= 500 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT061= 700 POWER_CLASS004_DEPTH000_RANGE000TO999_ARTIFACT061= 700 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT061= 700 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT126= 800 # NOTE: Don't do this if you are using random artifacts (Cubragol speed) # POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT126= 25000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT031= 500 # Condition 058 is used miltiple times relating to inventory # items. Weak characters need to not be slow. CND058=_STR 15 > # Inventory items POWER_CLASS999_DEPTH000_RANGE001TO006_FUEL= 60000 EACH POWER_CLASS999_DEPTH000_CND058_RANGE007TO008_FUEL= 500 EACH POWER_CLASS999_DEPTH000_RANGE001TO008_FOOD= 50000 EACH POWER_CLASS999_DEPTH000_CND058_RANGE009TO015_FOOD= 200 EACH # Carry extra food if Regen POWER_CLASS999_DEPTH000_CND051_RANGE000TO015_FOOD= 700 EACH CND051=_REG 1 >= _CLEVEL 20 <= && # ID scrolls, but not too many if Low Strength POWER_CLASS999_DEPTH000_RANGE001TO004_ID= 6000 EACH POWER_CLASS999_DEPTH000_CND058_RANGE005TO010_ID= 6000 EACH # This is *ID* POWER_CLASS999_DEPTH000_RANGE001TO003_ITEM177= 10000 EACH POWER_CLASS999_DEPTH000_RANGE005TO010_ITEM177= 2000 EACH POWER_CLASS999_DEPTH000_RANGE001TO005_APFE= 10000 EACH POWER_CLASS999_DEPTH000_RANGE006TO010_APFE= 2000 EACH POWER_CLASS999_DEPTH000_RANGE001TO005_AGLYPH= 10000 EACH POWER_CLASS999_DEPTH000_RANGE006TO010_AGLYPH= 2000 EACH POWER_CLASS999_DEPTH000_RANGE001TO003_RECALL= 50000 EACH POWER_CLASS999_DEPTH000_CND058_RANGE004TO007_RECALL= 5000 EACH # Resist Heat and Cold for Warriors (for now) POWER_CLASS000_DEPTH000_CND059_RANGE001TO004_ARESHEAT= 500 EACH CND059=_IFIRE ! POWER_CLASS000_DEPTH000_CND060_RANGE001TO004_ARESCOLD= 500 EACH CND060=_ICOLD ! # scrolls of phase door POWER_CLASS999_DEPTH000_RANGE000TO004_APHASE= 50000 EACH POWER_CLASS999_DEPTH000_RANGE005TO008_APHASE= 1000 EACH POWER_CLASS999_DEPTH000_CND058_RANGE009TO015_APHASE= 500 EACH POWER_CLASS999_DEPTH000_RANGE001TO002_AESCAPE= 10000 EACH POWER_CLASS999_DEPTH090_CND050_RANGE003TO005_AESCAPE= 30000 CND050=_CDEPTH 90 > POWER_CLASS999_DEPTH000_RANGE001TO005_ATELEPORT= 10000 EACH POWER_CLASS999_DEPTH000_RANGE006TO999_ATELEPORT= 50000 #POWER_CLASS999_DEPTH000_CND058_RANGE006TO010_ATELEPORT= 10000 EACH #POWER_CLASS999_DEPTH000_CND058_RANGE010TO999_ATELEPORT= 100000 #POWER_CLASS999_DEPTH000_RANGE001TO005_ATELEPORTLVL= 10000 EACH # Healing stuff gets complex and is very class dependant POWER_CLASS000_DEPTH000_RANGE001TO020_HEAL= 8000 EACH POWER_CLASS003_DEPTH000_RANGE001TO020_HEAL= 8000 EACH # *HEAL* POWER_CLASS999_DEPTH000_RANGE001TO002_ITEM419= 10000 EACH # first two LIFE give 9000 if you have no *HEAL* POWER_CLASS999_DEPTH000_CND052_RANGE001TO002_ITEM420= 9000 CND052=_ITEM419 0 == # rod of healing POWER_CLASS000_DEPTH000_RANGE001TO002_ITEM374= 20000 EACH POWER_CLASS003_DEPTH000_RANGE001TO002_ITEM374= 20000 EACH POWER_CLASS001_DEPTH000_RANGE001TO020_HEAL= 4000 EACH POWER_CLASS004_DEPTH000_RANGE001TO020_HEAL= 4000 EACH POWER_CLASS005_DEPTH000_RANGE001TO020_HEAL= 4000 EACH POWER_CLASS001_DEPTH000_RANGE001TO002_ITEM419= 9000 EACH POWER_CLASS004_DEPTH000_RANGE001TO002_ITEM419= 9000 EACH POWER_CLASS005_DEPTH000_RANGE001TO002_ITEM419= 9000 EACH # make sure level 1 Priest sell thier healing potion for quick cash POWER_CLASS002_DEPTH000_CND056_RANGE000TO999_ITEM242= -2000 EACH CND056=_CLEVEL 1 == POWER_CLASS002_DEPTH000_RANGE000TO010_ITEM242= 2000 EACH # if your max mana is more than 100, reward up to ten restore manas POWER_CLASS999_DEPTH000_CND057_RANGE001TO010_ITEM266= 4000 EACH CND057=_MAXSP 100 > # and some magi staff charges POWER_CLASS999_DEPTH000_CND057_RANGE001TO100_ASTFMAGI= 4000 EACH POWER_CLASS999_DEPTH000_RANGE001TO005_ACCW= 5000 EACH POWER_CLASS999_DEPTH000_CND058_RANGE006TO010_ACCW= 5000 EACH # next 5 at 500 if you done have resist conf or are below level 35 POWER_CLASS999_DEPTH000_CND062_RANGE011TO015_ACCW= 500 EACH CND062=_RCONF ! _CLEVEL 35 < || # If you don't have RCONF, give reward for collecting cure conf POWER_CLASS999_DEPTH000_CND063_RANGE001TO010_ITEM008= 400 EACH CND063=_RCONF ! # If you don't have RBLIND, give reward for collecting cure blind POWER_CLASS999_DEPTH000_CND065_RANGE001TO005_ITEM006= 300 EACH CND065=_RBLIND ! # If you don't have RPOIS, give reward for collecting cure pois POWER_CLASS999_DEPTH000_CND067_RANGE001TO005_ACUREPOIS= 250 EACH CND067=_RPOIS ! POWER_CLASS999_DEPTH000_RANGE000TO999_ADETTRAP= 4000 POWER_CLASS999_DEPTH000_RANGE000TO999_ADETDOOR= 2000 POWER_CLASS999_DEPTH000_RANGE000TO999_ADETEVIL= 1000 POWER_CLASS999_DEPTH000_RANGE000TO999_AMAGICMAP= 4000 POWER_CLASS999_DEPTH000_RANGE000TO999_ALITE= 1000 # Genocide - only collect when deep POWER_CLASS999_DEPTH100_RANGE001TO010_ITEM207= 10000 EACH POWER_CLASS999_DEPTH100_RANGE011TO020_ITEM207= 2000 EACH # Mass Genocide - only collect when deep POWER_CLASS999_DEPTH100_RANGE001TO010_ITEM200= 10000 EACH POWER_CLASS999_DEPTH100_RANGE011TO020_ITEM200= 2000 EACH POWER_CLASS999_DEPTH000_RANGE001TO005_ARECHARGE= 5000 EACH POWER_CLASS000_DEPTH000_RANGE001TO010_AMISSILES= 1000 EACH POWER_CLASS001_DEPTH000_RANGE001TO010_AMISSILES= 1000 EACH POWER_CLASS002_DEPTH000_RANGE001TO010_AMISSILES= 1000 EACH POWER_CLASS003_DEPTH000_RANGE001TO010_AMISSILES= 1000 EACH POWER_CLASS004_DEPTH000_RANGE001TO020_AMISSILES= 1000 EACH POWER_CLASS005_DEPTH000_RANGE001TO010_AMISSILES= 1000 EACH POWER_CLASS000_DEPTH000_CND058_RANGE011TO040_AMISSILES= 100 EACH POWER_CLASS001_DEPTH000_CND058_RANGE011TO040_AMISSILES= 100 EACH POWER_CLASS002_DEPTH000_CND058_RANGE011TO040_AMISSILES= 100 EACH POWER_CLASS003_DEPTH000_CND058_RANGE011TO040_AMISSILES= 100 EACH POWER_CLASS004_DEPTH000_CND058_RANGE021TO070_AMISSILES= 100 EACH POWER_CLASS005_DEPTH000_CND058_RANGE011TO040_AMISSILES= 100 EACH #too many missiles POWER_CLASS000_DEPTH000_RANGE050TO999_AMISSILES= -1000 EACH POWER_CLASS001_DEPTH000_RANGE050TO999_AMISSILES= -1000 EACH POWER_CLASS002_DEPTH000_RANGE050TO999_AMISSILES= -1000 EACH POWER_CLASS003_DEPTH000_RANGE050TO999_AMISSILES= -1000 EACH POWER_CLASS004_DEPTH000_RANGE075TO999_AMISSILES= -1000 EACH POWER_CLASS005_DEPTH000_RANGE050TO999_AMISSILES= -1000 EACH # Potions of Detonations POWER_CLASS999_DEPTH000_RANGE001TO020_ADETONATE= 2000 EACH # If you have up to 3 staffs of power or holiness you get rewarded. # first gets 2500 POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA070 FORMULA070=_ITEM324 _ITEM327 || 2500 * # all three get 500 POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA071 FORMULA071=_ITEM324 _ITEM327 + 3 < _ITEM324 _ITEM327 + * 500 * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA072 FORMULA072=_ITEM324 _ITEM327 + 3 >= 3 * 500 * # If you have up to 3 staffs of destruction you get rewarded. POWER_CLASS999_DEPTH000_RANGE000TO999_ITEM307= 5000 POWER_CLASS999_DEPTH000_RANGE000TO003_ITEM307= 200 EACH # Wand of Teleport Other (or Spells) POWER_CLASS999_DEPTH000_RANGE000TO999_ATPORTOTHER= 5000 # bonus for Warriors POWER_CLASS000_DEPTH000_RANGE000TO015_ATPORTOTHER= 50000 POWER_CLASS999_DEPTH000_RANGE000TO010_ATPORTOTHER= 1000 EACH POWER_CLASS999_DEPTH000_RANGE010TO999_ATPORTOTHER= 61000 # High Level Spell Books POWER_CLASS001_DEPTH000_RANGE001TO999_ITEM379= 300000 POWER_CLASS003_DEPTH000_RANGE001TO999_ITEM379= 300000 POWER_CLASS004_DEPTH000_RANGE001TO999_ITEM379= 300000 POWER_CLASS002_DEPTH000_RANGE001TO999_ITEM384= 300000 POWER_CLASS005_DEPTH000_RANGE001TO999_ITEM384= 300000 POWER_CLASS001_DEPTH000_RANGE001TO999_ITEM380= 300000 POWER_CLASS003_DEPTH000_RANGE001TO999_ITEM380= 300000 POWER_CLASS004_DEPTH000_RANGE001TO999_ITEM380= 300000 POWER_CLASS002_DEPTH000_RANGE001TO999_ITEM385= 300000 POWER_CLASS005_DEPTH000_RANGE001TO999_ITEM385= 300000 POWER_CLASS001_DEPTH000_RANGE001TO999_ITEM381= 300000 POWER_CLASS003_DEPTH000_RANGE001TO999_ITEM381= 300000 POWER_CLASS004_DEPTH000_RANGE001TO999_ITEM381= 300000 POWER_CLASS002_DEPTH000_RANGE001TO999_ITEM386= 300000 POWER_CLASS005_DEPTH000_RANGE001TO999_ITEM386= 300000 POWER_CLASS001_DEPTH000_RANGE001TO999_ITEM382= 300000 POWER_CLASS003_DEPTH000_RANGE001TO999_ITEM382= 300000 POWER_CLASS004_DEPTH000_RANGE001TO999_ITEM382= 300000 POWER_CLASS002_DEPTH000_RANGE001TO999_ITEM387= 300000 POWER_CLASS005_DEPTH000_RANGE001TO999_ITEM387= 300000 POWER_CLASS001_DEPTH000_RANGE001TO999_ITEM383= 300000 POWER_CLASS003_DEPTH000_RANGE001TO999_ITEM383= 300000 POWER_CLASS004_DEPTH000_RANGE001TO999_ITEM383= 300000 POWER_CLASS002_DEPTH000_RANGE001TO999_ITEM388= 300000 POWER_CLASS005_DEPTH000_RANGE001TO999_ITEM388= 300000 angband-3.5.1/lib/help/0000755000175000017500000000000012456456606014136 5ustar chriscchriscangband-3.5.1/lib/help/general.txt0000644000175000017500000004315512456456606016324 0ustar chriscchrisc=================== General information =================== Using the Online Help ===================== You can press Escape ('ESC') at any time to leave the online help. You can press Space to advance one page, Plus ('+') to advance one half page, or Return to advance one line. If you reach the end, you will jump back to the start. You can press Minus ('-') to back up one half page, Underscore ('_') to back up one page, or Equal ('=') to back up one line. If you reach the start, you will stay there. Advancing by one page is the most efficient method. You can press Hash ('#') [or Percent ('%')] to go to a specific line [or file]. You can press Slash ('/') [or Ampersand ('&')] to search for [or highlight] a string. This is case-insensitive by default, but Pling ('!') toggles it to case-sensitive. Use '#', '0', 'Return', '/', Return to restart a search from the top of the file. Please press Space to view the rest of this file... General Information =================== Angband is basically a complex single player dungeon simulation. A player creates a character, choosing from a variety of races and classes, and then plays that character over a period of days, weeks, even months. The player will begin his adventure on the town level where he may acquire supplies, weapons, armor, and magical devices by buying from various shop owners. Then the player can descend into the Pits of Angband, where he will explore the many levels of the dungeon, gaining experience by killing fierce creatures, collecting powerful objects and valuable treasure, and returning to town occasionally to buy and sell supplies. Eventually, as the player grows more experienced, he may attempt to win the game by defeating Morgoth, the Lord of Darkness, who resides far below the surface. Note that Angband is a very complex game, and it may be difficult to grasp everything at first, especially if you have never played a "roguelike" game before. You should probably browse through all of the "online help files", especially this one, before beginning any serious adventuring... About the game ============== Angband has been maintained by a succession of volunteers since it was written in the early 1990s. The most recent maintainer is Andi Sidwell. Angband will run on a wide variety of systems (including Unix, Macintosh, Windows). It is written in C, and the source code is freely available. Creating a version for a new platform involves writing as few as 100 lines of code and recompiling. See the Official Angband Home Page at http://rephial.org/ for up to date information about the latest version of Angband, including a complete list of recent modifications and a wiki about the game which includes a full user guide. You can post compliments, complaints, suggestions, bug reports, and patches at http://angband.oook.cz, or to the newsgroup 'rec.games.roguelike.angband'. You can also post interesting experiences and ask for help. This version of Angband is under the GNU General Public Licence (GPL) version 2. A copy of this licence is included with the game, in the file copying.txt. If you're interested in the development of the game, the public bug tracker and development road map are at http://trac.rephial.org. The basic help files supplied with this game are more or less up to date, but when in doubt, you should ask the newsgroup or the forum for confirmation. Note that spoiler files are not distributed with the source since they may spoil the game for new players (hence their name). If you want to use them, you can obtain them from various places as with the source and executables. Spoiler files may be placed into the "lib/info" directory, or into a user specified external directory, to allow access via the "online help" system. Remember to tell all your friends about how much you like Angband... A quick demonstration ===================== Angband is, as mentioned above, a very complex game, so you may want to try the following quick demonstration. The following instructions are for demonstration purposes only, and so they are intentionally boring. For this demo, we will assume that you have never played Angband before, that you have not requested any special "sub-windows", that you have not requested any special "graphics" modes, that you have a "numeric keypad" on your computer, and that you are using the default options, including, in particular, the "original" command set. If any of these assumptions are incorrect, you will need to keep in mind that this demo may not work. There are many ways to view this file while playing, in particular, you should be able to view it using the "online help" built into the game. Any time you see the '-more-' prompt, read the message and press space. This takes precedence over any other instructions. At any other prompt, for example, if you accidentally hit a key, you can normally "cancel" the action in progress by pressing escape. When the game starts up, depending on what platform you are using, you may be taken directly to the character creation screen, or you may have to ask to create a new character by using the File menu. In either case, you will be shown the character information screen, and you will be given a series of choices. For this demo, press 'a' four times to elect a "female human warrior" character with the point-based stat allocation system. You will now be presented with a description of your character. Look over the description briefly, there is a lot of information here, and most of it will not make any sense. Press enter three times and your character will be placed into the "town". You should now be looking at the basic dungeon interaction screen. To the left is some information about your character. To the right is an overhead view of the town. Nothing happens in Angband while the game is waiting for you to specify a command, so take a good look at the town. You will see a variety of symbols on the screen. Each symbol normally represents a terrain feature, an object, or a monster. The '@' symbol is special, it represents your character. You can use the '/' command to find out what a given symbol represents. Press "/" then '@' now to verify the meaning of the '@' symbol. The solid blocks (which may be '#' symbols on some systems) around the edge of the town represent the walls that surround the the town. You cannot leave the town above ground, although some games derived from Angband (called "variants") have an overground element. The large rectangles represent stores. The "numeric" symbols represent an "entrance" to a store. The '.' symbols represent the "floor". It is currently daytime, so most of the town should consist of stores and illuminated floor grids. Any "alphabetic" symbols always represent monsters, where the word "monsters" specifies a wide variety of entities, including people, animals, plants, etc. Only a few "races" of monsters normally appear in town, and most of them are harmless (avoid any mercenaries or veterans if you see them). The most common "monsters" in town are small animals (cats and dogs) and townspeople (merchants, mercenaries, miscreants, etc). Now use the 'l' command to "look" around. This will cause the cursor to be moved onto each "interesting" square, one at a time, giving you a description of that square. The cursor always starts on the square containing your character. In this case, you will see a message telling you that your character is standing on a staircase. Keep pressing space until the prompt goes away. Now press 'i', to display your character's "inventory". New characters start out with some objects to help them survive (though there is an option to start with more money instead). Your character will have some food, a potion, some torches, and a scroll. Press 'e' to see what you are wearing. You will find you are wearing armour on your body, wielding a broad sword and lighting the way with a torch. You have many other equipment slots but they are all currently empty. Press 't' to take something off. Note that the equipment listing is reduced to those objects which can actually be taken off. Press 'g' to take off the armour, and then press 'e' again. Note that the armour is no longer shown in the equipment. Press escape. Press 'w' to wield something and observe that the inventory listing is reduced to those objects which can actually be wielded or worn, press 'e' to put the armour back on. Monsters can only move after you use a command which takes "energy" from your character. So far, you have used the 'w' and 't' commands, which take energy, and the 'e', 'i', 'l', and '/' commands, which are "free" commands, and so do not take any energy. In general, the only commands which take energy are the ones which require your character to perform ome action in the world of the game, such as moving around, attacking monsters, and interacting with objects. If there were any monsters near your character while you were experimenting with the 'w' and 't' commands, you may have seen them "move" or even "attack" your character. Although unlikely, it is even possible that your character has already been killed. This is the only way to lose the game. So if you have already lost, simply exit the game and restart this demo. One of the most important things that your character can do is move around. Use the numeric keys on the keypad to make your character move around. The '4', '6', '8', and '2' keys move your character west, east, north, and south, and the '7', '9', '1' and '3' keys move your character diagonally. When your character first moves, observe the '>' symbol that is left behind. This is the "staircase" that she was standing on earlier in the demo - it is the entrance to the dungeon. Attempting to stay away from monsters, try and move your character towards the entrance to the "general store", which is represented as a '1' on the screen. As your character moves around, use the 'l' command to look around. You can press escape at any time to cancel the looking. If you die, start over. One of the hardest things for people to get used to, when playing games of this nature for the first time, is that the character is not the same as the player. The player presses keys, and looks at a computer screen, while the character performs complex actions, and interacts with a virtual world. The player decides what the character should do, and tells her to do it, and the character then performs the actions. These actions may induce some changes in the virtual world. Some of these changes may be apparent to the character, and information about the changes is then made available to the player by a variety of methods, including messages, character state changes, or visual changes to the screen. Some changes may only be apparent to the player. There are also a whole set of things that the player can do that can not even be described in the virtual world inhabited by the character, such as resize windows, read online help files, modify colormaps, or change options. Some of these things may even affect the character in abstract ways, for example, the player can request that from now on all monsters know exactly where the character is at all times. Likewise, there are some things that the character does on a regular basis that the player may not even consider, such as digesting food, or searching for traps while walking down a hallway. To make matters worse, as you get used to the difference between the player and the character, it becomes so "obvious" that you start to ignore it. At that point, you find yourself merging the player and the character in your mind, and you find yourself saying things like "So yesterday, I was at my friend's house, and I stayed up late playing Angband, and I was attacked by some wild dogs, and I got killed by a demon, but I made it to the high score list", in which the pronoun changes back and forth from the real world to the virtual one several times in the same sentence. So, from this point on you may have to separate the player and the character for yourself. So anyway, keep walking towards the entrance to the general store until you actually walk into it. At this point, the screen should change to the store interaction screen. You will see the name of the shop-keeper, and the name of the shop, and a list of objects which are available. If there are more than twelve different objects, you can use the space or arrow keys to scroll the list of objects. The general store is the only tore with a fixed inventory, although the amount of various items may vary. One of the items sold here are flasks of oil. Press 'down' to highlight the line with flasks of oil and press the 'p' key to purchase some. If you are asked how many you want, just hit enter. Any time you are asked a question and there is already something under the cursor, pressing return will accept that choice. Hit enter to accept the price. Many commands work inside the store, for example, use the 'i' command to ee your inventory, with the new flask of oil. Note that your inventory is always kept sorted in a semi-logical order, so the indexes of some of the objects may change as your inventory changes. Purchase a few more flasks of oil, if possible: this time, when asked how many you want, press '3' then return to buy three flasks at once. Flasks of oil are very important for low level characters, because not only can they be used to fuel a lantern (when you find one), but also they can be ignited and thrown at monsters from a distance. So it is often a good idea to have a few extra flasks of oil. Press escape to leave the store. If you want, take time to visit the rest of the stores. One of the buildings, marked with an '8', is your "home", and is not a real store. You can drop things off at home and they will stay there until you return to pick them up. The interface is exactly the same as a store, but there is no payment. Now move to the staircase, represented by the '>' symbol, and press '>', to go down the stairs. At this point, you are in the dungeon. Use the 'l' command to look around. Note that you are standing on a staircase leading back to town. Use the '<' command to take the stairs back to town. You may find that any townspeople that were here before have disappeared and new ones have appeared instead. Now use the '>' command to go back down the stairs into the dungeon. You are now in a different part of the dungeon than you were in before. The dungeon is so huge, once you leave one part of the dungeon, you will never find it again. Now look the screen. Your character may be in a lit room, represented as a large rectangle of illuminated floor grids ('.'), surrounded by walls. If you are not in a lit room, keep going back up to the town and back down into the dungeon until you are. Now look around. You may see some closed doors ('+') or some open doors (''') or some open exits ('.') in the walls which surround the room. If you do not, keep playing the stairway game until you are in such a room. This will keep the demo simple. Now look around using the 'l' command. You may see some monsters and/or some objects in the room with you. You may see some stairs up ('<') or some stairs down ('>'). If you see any monsters, move up next to the monster, using the movement keys, and then try and move into the monster. This will cause you to attack the monster. Keep moving into the monster until you kill the monster, or it runs away, or you die. If you die, start a new game. If the monster runs away, ignore it, or chase it, but do not leave the room. Once all the monsters in the room are dead or gone, walk on top of any objects in the room. Press 'g' to get the object, and it will be added to your inventory. If there are any closed doors ('+') in the room walk up next to them and press 'o' and then the direction key which would move you into the door, which should attempt to "open" the door. Now use the movement keys to explore the dungeon. As you leave the room, you will probably notice that your character cannot see nearly as far as she could in the room. Also, you will notice that as she moves around, the screen keeps displaying some of the grids that your character has seen. Think of this as a kind of "map" superimposed on the world itself, the player can see the entire map, but the character can only see those parts of the world which are actually nearby. If the character gets near the edge of the "map" portion of the screen the entire map will scroll to show a new portion of the world. Only about ten percent of the dungeon level can be seen by the player at one time, but you can use the 'L' command to look at other pieces of the map. Use the '.' key, then a direction, to "run" through the dungeon. Use the 'R' key, then return, to force your character to "rest" until she has recovered from any damage she incurs while attacking monsters. Use the 'M' key to see the entire dungeon level at once, and hit escape when done. If your food rations are still at index 'a' in your inventory, press 'E', 'a' to eat some food. If your oil is still at index 'b' in your inventory, and there is a monster nearby, press 'v', 'b', ''' to throw a flask of oil at the nearest monster. To drop an item from your inventory, press 'd' plus the index of that item. You can use the '^X' key to quit and save the game. You now know enough to play a quick game of Angband. There is a lot more for you to learn, including how to interpret information about your character, how to create different kinds of characters, how to determine which equipment to wield/wear, how to use various kinds of objects, and how to use the more than fifty different commands available to your character. The best resource for learning these things is the online help, which include, among other things, a complete list of all commands available to you, and a list of all the symbols which you may encounter in the dungeon, and information about creating new characters. angband-3.5.1/lib/help/debug.txt0000644000175000017500000001003012456456606015757 0ustar chriscchrisc========================== Debug Command Descriptions ========================== Item Creation ============= Create an object ('c') Provides a menu to let you create any object, and drops it on the floor. Create an artifact ('C') Prompts you for the name of an artifact, then drops that artifact nearby. You must give the name exactly as in 'artifact.txt'. You may optionally give a command-count, in which case this command drops the artifact with that number nearby instead of prompting you for a name. Create a good object ('g') Creates a good object and places it nearby. If you provide a command- count, creates that many good items. Create a very good object ('v') Creates a very good ("excellent") object and places it nearby. If you provide a command-count, creates that many very good items. Play with an object ('o') Lets you modify an object by randomly rerolling it as a normal, good, or excellent object, or lets you modify it directly, tweaking the pval and combat values. Test kind ('V') Requires a command-count. For the tval given by command-count, creates one object of each sval and drops it nearby. Detection / Information ======================= Detect all ('d') Detects all traps, doors, stairs, treasure, and monsters nearby. Identify ('i') Fully identifies an object. Magic Mapping ('m') Maps the nearby dungeon. Self-knowledge ('k') Grants you self-knowledge, as the potion of the same name. Learn about objects ('l') Requires a command-count. Makes you "aware" of all items with level less than or equal to the command-count. Monster recall ('r') Gives you full monster recall on all monsters or on a chosen monster. Wipe recall ('W') Resets monster recall on all monsters or on a chosen monster. Unhide monsters ('u') Reveals all monsters whose distance to the character is at most 255. If given a command-count, uses that distance instead of 255. Wizard-light the level ('w') Lights the entire level, as the Potion of Enlightenment. Create spoilers ('"') Lets you create a spoiler file for objects or monsters. Teleportation ============= Teleport level ('j') Allows you to teleport to any dungeon level instantly. Phase Door ('p') Teleports you up to 10 spaces away. Teleport ('t') Teleports you up to 100 spaces away. Teleport to target ('b') Teleports you to the last space you targeted (or close to it, if the pace is occupied). Character Improvement ===================== Cure all maladies ('a') Removes all curses, restores all stats, xp, hp, and sp, cures all bad effects, and satisfies your hunger. Advance the character ('A') Advances your character to level 50, maxes all stats, and gives you a million gold. Edit character ('e') Lets you specify your base stats, xp, and gold. Increase experience ('x') Doubles your current experience and adds 1. If given a command-count, increases your experience by that much instead. Rerate hitpoints ('h') Rerates your hitpoints. Monsters ======== Summon monster ('n') Prompts you for the name of a monster, then summons that monster nearby. You must give the name exactly as in 'monster.txt'. You may optionally give a command-count, in which case this command summons the monster with that number nearby instead of prompting you for a name. Summon random monster ('s') Summons a random monster next to you. If given a command-count, summons that many monsters instead. Zap monsters ('z') Deletes all monsters in sight. If given a command-count, deletes all monsters whose distance to the character is at most the command-count instead. Miscellaneous ============= Create a trap ('T') Creates a random trap on your square. Quit without saving ('X') Quits the game without saving (prompts first). Undocumented ============ Query the dungeon ('q') ??? Collect stats ('f') ??? Ben hack ('_') ??? angband-3.5.1/lib/help/angband.sty0000644000175000017500000000014112456456606016265 0ustar chriscchrisc\usepackage{microtype} % LaTeX gurus say hyperref should go at the end \usepackage{hyperref} angband-3.5.1/lib/help/birth.txt0000644000175000017500000007307612456456606016024 0ustar chriscchrisc==================== Creating a Character ==================== Angband is a roleplaying game, in which you, the player, control a character in the world of Angband. Perhaps the most important thing you control is the birth of your character, in which you choose or allow to be chosen various attributes that will affect the future life of your character. At the character creation screen you will be prompted to select the sex, race and class of your character. You also have the option to change the 'birth options' at this time. These need to be set at the character creation menu and cannot be altered later in the game. They are discussed with the rest of the options in the "options" help file. Character Characteristics ========================= Each character has three primary attributes: sex, race, and class. These are chosen at the beginning and which will stay fixed for the entire life of that character. The sex of your character is purely for flavour, but the race and class have many effects which are discussed in detail below. Each character has a few secondary attributes: height, weight, social class, and background history. These are randomly determined, but are affected by the sex and race of the character. In general, these attributes are only used to provide flavour to the character, to assist in the role playing, but they do have a few minor effects on the game. For example, background history affects social class, which affects the starting money. (Not a lot, in the case of some races: for instance, Half-Trolls are always going to be the scum of society, even if their father was the Clan Chief.) Each character also has five primary "stats": strength, intelligence, wisdom, dexterity, and constitution; they modify the abilities of the character in a variety of ways. Every stat has a numerical value, ranging from a minimum of 3, up to a normal maximum of 18, and even higher, into the "percentile" range, represented as '18/01' through '18/100': this is the maximum that can be achieved intrinsically, for any given stat. These stats can be modified further by equipment, race and class bonuses up to a maximum of '18/220'. Each character also has several primary "skills": disarming, magic devices, saving throws, stealth, searching ability, searching frequency, fighting skill, and shooting skill, which are derived from the character's race, class, level, stats, and current equipment. These skills have rather obvious effects, but will be described more completely below. Each character may have one or more "racially intrinsic skills", based on the race of the character. These may include special resistances, or abilities such as infravision. Each character has a number of "experience points", which increases as the character defeats monsters and attempts new spells and uses new items. Characters also have a level, which is based on experience. The amount of experience required to gain a new level is dependent on the character race and class. Races and classes with more intrinsic benefits require more experience to gain levels. As the experience rises, so does the level, and as the level rises, certain other abilities and characteristics rise as well. All characters start at 0 experience and at the first level. Each character has some gold, which can be used to buy items from the shops in the town, and which can be obtained not only from selling items to the shops, but also by taking it from dead monsters and by finding it in the dungeon. Each character starts out with some gold, the amount of which is based on the character's social class (higher is better) and stats (less powerful characters start with more gold). Each character also starts out with a few useful items, which may be kept, or sold to a shop-keeper for more gold. However, especially valuable items will never sell for the full price, as each shopkeeper has a maximum that he is prepared to pay for any item. The more generous shopkeepers may buy your items for up to 30,000 gold pieces: but some are really stingy, and will pay no more than 5,000. Each character has an "armour class", abbreviated to AC, representing how well the character can avoid damage. The armour class is affected by dexterity and equipment, so the concept includes both avoiding blows and being able to take blows without being hurt. Armour class on equipment is always denoted in square brackets, usually as a figure of '[X,+Y]' where X is the intrinsic AC of the armour in question, and Y is the magical bonus to armour class provided by that item. Each character has "hit points", or hp, representing how much damage the character can sustain before he dies. How many hit points a character has is determined by race, class, level and constitution, as follows: each race has a basic "hit dice" number - for instance, a Dwarf's basic hit die is 11, while a hobbit's is 7. This is modified by class: for instance, a warrior gets a +9 bonus to the hit die, while a mage gets no bonus and a priest +2, so a dwarven warrior's total hit die will be (11+9)=20 - meaning that he gets between 1 and 20 hit points per level. If he were a priest, his hit dice would be (11+2)=13, and get between 1 and 13 hit points per level. The hobbit mage would get only 1-7 hps per level. (All characters get the maximum at first level: thereafter it is a random roll of 1dX where X is the hit die number, when the character goes up in level.) This is further modified by constitution - a character with high constitution will get a flat bonus of a certain number of hit points per level (recalculated right back to level 1: if you gain an extra hit point per level, and you are 42nd level, you will suddenly be 42 hit points better off.) Each character has spell points, or mana, which limits how many spells (or prayers) a character can cast (or pray). The maximum number of spell points is derived from your class, level, and intelligence (for spells) or wisdom (for prayers), and you can never have more spell points than the maximum. Spell points may be regained by resting, or by magical means. Warriors never have any spell points. If a character gains enough wisdom or intelligence to get more spell points, the result is calculated right back to first level, just as with constitution and hit points. Lastly, each character has a base speed. Speed determines the amount of "energy" your character acquires in the game, and therefore how often you can take actions which use up energy (like moving or attacking). All beginning characters move at normal speed and the only way to increase speed is by magical means and equipment bonuses. Characters who are carrying too much weight will move more slowly. Extra speed is one of the most important boons in the game and therefore one of the rarest and most sought after. Races ===== There are eleven different races that you can choose to play in Angband. Each race has its own adjustments to a character's stats and abilities. Most races also have intrinsic abilities. The bonuses to statistics and the experience penalty will be displayed next to the races as you move to select one. .. _Human: Human The human is the base character. All other races are compared to them. Humans are average at everything and tend to go up levels faster than any other race due to their shorter life spans. No racial adjustments or intrinsics occur to human characters. Humans do not have any infravision. .. _Half-Elf: Half-Elf Half-elves tend to be smarter and faster than a human, but not as wise or strong. Half-elves are slightly better at magic, disarming, saving throws, stealth, archery and searching, but they are not as good at hand-to-hand combat. Half-elves are immune to dexterity draining, and have weak infravision. .. _Elf: Elf Elves are better magicians than humans, but not as good at fighting. They tend to be smarter and faster than humans, though not as wise or strong. Elves are better at searching, disarming, perception, stealth, archery and magic, but they are not as good at hand-to-hand combat. They are resistant to attacks involving bright light, are immune to dexterity draining, and have fair infravision. .. _Hobbit: Hobbit Hobbits, or Halflings, are very good at shooting, throwing, and have good saving throws. They also are very good at searching, disarming, perception, and stealth; so they make excellent rogues, but prefer to be called burglars. They will be much weaker than humans, and not good at melee fighting. Halflings have fair infravision. They have a strong hold on their life force, and are thus resistant to life draining. Hobbits are very partial to mushrooms and can identify them when found. .. _Gnome: Gnome Gnomes are smaller than dwarves but larger than halflings. They, like the halflings, live in the earth in burrow-like homes. Gnomes make excellent mages, and have very good saving throws. They are good at searching, disarming, perception, and stealth. They have lower strength than humans so they are not very good at fighting with hand weapons. Gnomes have good infravision. Gnomes are intrinsically protected against paralysis and some slowing effects. Gnomes are excellent at using wands and staves and can identify them when found. .. _Dwarf: Dwarf Dwarves are the headstrong miners and fighters of legend. Since dungeons are the natural home of a dwarf, they are excellent choices for a warrior or priest - or indeed, that combination of the two, the paladin. Dwarves tend to be stronger and tougher but slower and less intelligent than humans. Because they are so headstrong and are somewhat wise, they resist spells which are cast on them. Dwarves also have excellent infravision. They can never be blinded. Dwarves are excellent at digging, and can sense nearby buried treasure. They have one big drawback, though. Dwarves are loudmouthed and proud, singing in loud voices, arguing with themselves for no good reason, screaming out challenges at imagined foes. In other words, dwarves have a miserable stealth. .. _Half-Orc: Half-Orc Half-Orcs make excellent warriors and decent priests, but are terrible at magic. They are as bad as dwarves at stealth, and horrible at searching, disarming, and perception. Half-Orcs are, let's face it, ugly. They tend to pay more for goods in town. Half-Orcs do make good warriors and rogues, for the simple reason that Half-Orcs tend to have great constitution and lots of hit points. Because of their preference to living underground to on the surface, half-orcs resist darkness attacks. They have fair infravision. .. _Half-Troll: Half-Troll Half-Trolls are incredibly strong, and have more hit points than any other character race. They are also very stupid and slow. They will make great warriors and iffy priests. They are bad at searching, disarming, perception, and stealth. They are so ugly that a Half-Orc grimaces in their presence. Half-trolls always have their strength sustained, and they regenerate quickly like other trolls. Unfortunately, this regeneration also requires them to eat more food than other races. They have fair infravision. .. _Dunadan: Dunadan Dunedain are a race of hardy men from the West. This elder race surpasses human abilities in every field, especially constitution. However, being men of the world, very little is new to them, and levels are very hard to gain... their hardiness ensures that their constitution cannot be reduced. They have no infravision. .. _High-Elf: High-Elf High-Elves are descended from those among the Elves who heard and answered the call from the Valar at the very beginning of time, before the sun and moon were made, and lived in the Blessed Realm for many thousands of years before returning to mortal lands. Because of this, they are far superior in terms of abilities when compared to their lesser Elven kindred. They can also see into the invisible world of ghosts and wraiths. However, they find new experience even harder to come by than Dunedain. Like normal Elves, they resist attacks involving bright light. They have good infravision and can even see cold-blooded invisible creatures. .. _Kobold: Kobold Kobolds are a race of small dog-headed humanoids that dwell underground. They have excellent infravision, and are intrinsically resistant to poisons of all kinds. They have a good dexterity and constitution. However, they are weaker than humans, and also not noted for great intelligence. Furthermore, they are ugly, and not trusted in town. And while their constitution makes them tough, it still cannot prevent the fact that they are not the biggest of creatures, and have few hit points. Classes ======= Once a race has been chosen, you will need to pick a class. The class is the character's occupation and determines stat bonuses, abilities, hit dice, and what spells (if any) the character can learn. .. _Warrior: Warrior A Warrior is a hack-and-slash character, who solves most of his problems by cutting them to pieces, but will occasionally fall back on the help of a magical device. His prime stats are strength, constitution, and dexterity, and he will strike more blows with melee weapons than any other class. A Warrior will be excellent at fighting, shooting and throwing, but bad at most other skills. A warrior has bad stealth and cannot learn any spells. .. _Mage: Mage A Mage must live by his wits. He cannot hope to simply hack his way through the dungeon, and so must therefore use his magic to defeat, deceive, confuse, and escape. A mage is not really complete without an assortment of magical devices to use in addition to his spells. He can master the higher level magical devices far easier than anyone else, and has the excellent saving throws to resist effects of spells cast at him. However, he is incredibly weak, getting few hit dice and suffering strong penalties to strength and constitution. Intelligence is his primary stat and at high levels he can cast many spells without a chance of failure. There is no rule that says a mage cannot become a good fighter, but spells are his true realm and he will get fewer blows with melee weapons than other classes. .. _Priest: Priest A Priest is a character of holy devotion. They explore the dungeon only to destroy the evil that lurks within, and if treasure just happens to fall into their packs, well, so much more to the glory of their temple! Priests receive their spells from a deity, and therefore do not choose which spells they will learn. They are familiar with magical devices, preferring to call them "instruments of God", but are not as good as a mage in their use. Priests have great saving throws, and make decent fighters, but they are not as good at using sharp weapons (swords and polearms) owing to the holy strictures about shedding blood, so they are better off using blunt weapons such as maces. Wisdom is the priest's primary stat and at high enough levels they can cast many prayers without a chance of failure. Priests have poor stealth. .. _Rogue: Rogue A Rogue is a character that prefers to live by his cunning, but is capable of fighting his way out of a tight spot. He is the master of traps and locks, no device being impossible for him to overcome. A rogue has a high stealth allowing him to sneak around many creatures without having to fight, or sneak up and get the first blow. A rogue's perception is higher than any other class, and many times he will notice a trap or secret door before having to search. A rogue is better than warriors or paladins with magical devices, but still cannot rely on their performance. Rogues can also learn a few spells, but not the powerful offensive spells mages can use, and there will always be a chance of failure even with the simplest spells. A rogue's primary stats are dexterity and intelligence. .. _Ranger: Ranger A Ranger is a warrior/mage and a very powerful class. He is a good fighter, and the best of all the classes with missile weapons, especially bows. The ranger learns spells much more slowly than a mage, but is capable of learning all but the most powerful spells. Because a ranger is really a dual class character, more experience is required for him to advance. A ranger has good stealth, good perception, good searching, a good saving throw, and is good with magical devices. His primary stats are strength, intelligence and dexterity. .. _Paladin: Paladin A Paladin is a warrior/priest. He is a very good fighter, second only to the warrior class, but not very good at missile weapons. He receives prayers at a slower pace then the priest, but can use all but the most powerful prayers. Because a paladin is really a dual class character, it requires more experience to advance him. A paladin lacks much in the way of abilities. He is poor at stealth, perception, searching, and magical devices. He has a decent saving throw due to his divine alliance. His primary stats are strength and wisdom. Stats ===== After gender, race and class are selected, you will be able to decide what stat levels your character will have, by allocating a finite number of "points" between the six statistics. These points can be allocated by selection or with a random roller (as described below in the "Stat Rollers" section). Each race/class combination also has a recommended default setting for these statistics. Statistics can be permanently raised by various potions in the dungeon up to 18/100. They can also be temporarily drained by some monster attacks. Strength Strength is important in fighting with weapons and in melee combat. A high strength can improve your chances of hitting as well as the amount of damage done with each hit. Characters with low strengths may receive penalties. Strength raises the amount of weight you can carry before being slowed. It also allows you to get extra blows with heavier weapons. Strength is one of the most important stats in the beginning of the game. Intelligence Intelligence affects the spellcasting abilities of mage-like spellcasters: mages, rangers, and rogues. Intelligence will affect the number of spells you may learn each level as well as the number of spell points you receive. Intelligence is the most important stat for mages. A high intelligence may also improve your chances of successfully casting a spell. You cannot learn spells if your intelligence is 7 or lower. A good intelligence can also help with using magic devices, picking locks, and disarming traps. Wisdom The primary function of wisdom is to determine the ability of a priest or paladin to use prayers, just like intelligence affects spellcasting. Again, high wisdom will increase the number of mana points you have and increase the number of prayers you can learn each level, while improving the chance that a prayer will be successful. A good wisdom increases your saving throw, thereby improving your chances of resisting magical spells cast upon you by monsters. Dexterity Dexterity is a combination of agility and quickness. A high dexterity may allow a character to get multiple blows with lighter weapons. Dexterity also increases a character's chances of hitting with any weapon and of dodging blows from enemies. Dexterity is also useful in picking locks, disarming traps, and protecting yourself from some of the thieves that inhabit the dungeons. Indeed, if the character has a high enough dexterity, thieves will never be successful in stealing from him. Constitution Constitution is a character's ability to resist damage to his body, and to recover from damage received. Therefore a character with a high constitution will receive more hit points and also recover them faster while resting. Constitution is less important in the beginning of the game, but will be the most important stat at the end. Skills ====== Characters possess some different skills which can help them to survive. The starting skill levels of a character are based upon race and class. Skill levels may be adjusted by high or low stats, and may increase with the level of the character. Infravision Infravision is the ability to see heat sources. Since most of the dungeon is cool or cold, infravision will not allow the player to see walls and objects. Infravision will allow a character to see any warm-blooded creatures up to a certain distance. This ability works equally well with or without a light source. However, some of Angband's creatures are cold-blooded, and will not be detected unless lit up by a light source. All non-human races have innate infravision. Humans (including Dunedain) cannot gain infravision unless it is magically enhanced. Infravision does not increase with character level, and is purely dependent on race and on magical equipment. Fighting Fighting is the ability to hit and do damage with weapons or fists. Normally a character gets a single blow from any weapon, but if his dexterity and strength are high enough, he may receive more blows with lighter weapons. Strength and dexterity both modify the ability to hit an opponent. This kill increases with the level of the character. Inspecting a weapon will show you how quickly you can attack with it. Shooting Ability Using ranged missile weapons (and throwing objects) is included in this skill. Different stats apply to different weapons, but this ability may modify the distance an object is thrown/fired, the amount of damage done, and the ability to hit a creature. This skill increases with the level of the character. Saving Throws A Saving Throw is the ability of a character to resist the effects of a spell cast on him by another person/creature. This does not include spells cast on the player by his own stupidity, such as quaffing a nasty potion. This ability increases with the level of the character, but then most high level creatures are better at casting spells, so it tends to even out. A high wisdom also increases this ability. It is possible to get 100% saving throw, making you immune to many attacks. Stealth The ability to move silently about is very useful. Characters with good stealth can usually surprise their opponents, gaining the first blow. Also, creatures may fail to notice a stealthy character entirely, allowing a player to avoid certain fights. This skill is based upon race and class, but can me magically enhanced. Disarming Disarming is the ability to remove traps safely, and also includes picking locks on traps and doors. A successful disarming or lock picking will gain the character a small amount of experience. A trap must be found before it can be disarmed. Dexterity and intelligence both modify the ability to disarm, and this ability increases with the level of the character. Magical Devices Using a magical device such as a wand or staff requires experience and knowledge. Spell users such as mages and priests are therefore much better at using a magical device than say a warrior. This skill is modified by intelligence, and increases with the level of the character. Searching Frequency (Perception) Perception is the ability to notice something without actively seeking it out. This skill is based entirely upon race and class, and will never improve unless magically enhanced. Searching Ability (Searching) To search is to actively look for secret doors, floor traps, and traps on chests. Rogues are the best at searching, but mages, rangers, and priests are also good at it. This skill is based entirely upon race and class, and will never improve unless magically enhanced. Stat Bonus Tables ================= Stats, hit dice, infravision and experience point modifications due to race and class are listed in the following table. To get the total hit dice and XP modifier, add the "race" and "class" numbers: for instance, a Dwarf Priest has a hit die of 11+2=13 (i.e. he will get 1d13 hit points per level, adjusted for constitution) and an XP modifier of 20+20=40%. ================ === === === === === ========= ======== ====== Race STR INT WIS DEX CON HD (base) XP/level Infra ================ === === === === === ========= ======== ====== Human 0 0 0 0 0 10 +0% None Half-Elf 0 +1 -1 +1 -1 10 +10% 20' Elf -1 +2 -1 +1 -1 9 +20% 30' Hobbit -2 +2 +1 +3 +2 7 +10% 40' Gnome -1 +2 0 +2 +1 8 +25% 40' Dwarf +2 -3 +2 -2 +2 11 +20% 50' Half-Orc +2 -1 0 0 +1 10 +10% 30' Half-Troll +4 -4 -2 -4 +3 12 +20% 30' Dunadan +1 +2 +2 +2 +3 10 +80% None High-Elf +1 +3 -1 +3 +1 10 +100% 40' Kobold -1 -1 0 +2 +2 8 +15% 50' ================ === === === === === ========= ======== ====== ================ === === === === === ========== ======== Class STR INT WIS DEX CON HD (bonus) XP/level ================ === === === === === ========== ======== Warrior +3 -2 -2 +2 +2 9 +0% Mage -3 +3 0 +0 -2 0 +30% Priest -1 -3 +3 -1 +1 2 +20% Rogue 0 +1 -3 +3 -1 6 +25% Ranger 0 +2 -2 +1 -1 4 +30% Paladin +1 -3 +1 -1 +2 6 +35% ================ === === === === === ========== ======== Ability Tables ============== ============ ====== ====== ===== ======= ====== ====== ====== ===== Race Disarm Device Save Stealth Search Percep Fight Bows ============ ====== ====== ===== ======= ====== ====== ====== ===== Human 0 0 0 0 0 10 0 0 Half-Elf 2 3 3 1 6 11 -1 5 Elf 5 6 6 2 8 12 -5 15 Hobbit 15 18 18 4 12 15 -10 20 Gnome 10 22 12 3 6 13 -8 12 Dwarf 2 9 9 -1 7 10 15 0 Half-Orc -3 -3 -3 -1 0 7 12 -5 Half-Troll -5 -8 -8 -2 -1 5 20 -10 Dunadan 4 5 5 1 3 13 15 10 High-Elf 4 20 20 2 3 14 10 25 Kobold 10 5 0 3 15 15 -5 10 ============ ====== ====== ===== ======= ====== ====== ====== ===== ========== ======= ======= ======= ======= ====== ====== ======= ======= Class Disarm Device Save Stealth Search Percep Fight Bows ========== ======= ======= ======= ======= ====== ====== ======= ======= Warrior 25(+10) 18(+7) 18(+10) 0(+0) 14(+0) 2(+0) 70(+45) 55(+45) Mage 30(+7) 36(+13) 30(+9) 2(+0) 16(+0) 20(+0) 34(+15) 20(+15) Priest 25(+7) 30(+10) 32(+12) 2(+0) 16(+0) 8(+0) 48(+20) 35(+20) Rogue 45(+15) 32(+10) 28(+10) 3(+1) 32(+0) 24(+0) 60(+40) 66(+30) Ranger 30(+8) 32(+10) 28(+10) 3(+0) 24(+0) 16(+0) 56(+30) 72(+45) Paladin 20(+7) 24(+10) 25(+11) 0(+0) 12(+0) 2(+0) 68(+35) 40(+30) ========== ======= ======= ======= ======= ====== ====== ======= ======= For character classes, there are two figures: the first figure is the base level of the skill, while the second figure (in parentheses) is the bonus that the character gains to this skill every ten levels. So, to find out the total skill value of any character's skills, add the race value to the class value, and then the bonus once for every ten levels that the character has. Please note, however, that these numbers are only good for comparing characters to each other in the absence of other bonuses from high stats (strength bonus to-dam, dex bonus to-hit, wisdom bonus to saving throw, intelligence bonus to magical device usage, etc.) or wearing magical items. Stat rollers ============ There are currently two different ways to determine the starting stats of your character - you can choose which one to use from the birth screen. Point-based The point-based method allows you to "buy" improvements to your basic stats by "spending" points on them. You have a fixed number of points to spend, and making small changes to a stat costs proportionally less than making large changes. Any unspent points are converted into your starting money that you can use to buy equipment at the start of the game. On selecting this option, you will find that the points have already been assigned to default recommended values. These represent an algorithm's opinion for the ideal point spending. However, you are free to reallocate them as you wish. This is the recommended birth method. Standard roller The standard roller simply rolls three six-sided dice for each stat, leaving everything to chance. You can press 'r' to re-roll the dice, or simply accept what luck has offered. Character Name ============== Once you have accepted a character you will asked to provide a name for the character. In general, the actual choice of a name is not important, but do keep in mind that it may have some effect on the game itself. For example, on some machines, the character name determines the filename that will be used to save the character to disk. The character name is used on the high score list. You can play a dynasty of characters. If you use a Roman numeral at the end of your character name (like "Fred I" or "Pimplesnarg XVI"), the game will automatically increment the numeral each time you die (or win!). angband-3.5.1/lib/help/playing.txt0000644000175000017500000004050212456456606016343 0ustar chriscchrisc================ Playing the Game ================ Most of your interaction with Angband will take the form of "commands". Every Angband command consists of an "underlying command" plus a variety of optional or required arguments, such as a repeat count, a direction, or the index of an inventory object. Commands are normally specified by typing a series of keypresses, from which the underlying command is extracted, along with any encoded arguments. You may choose how the standard "keyboard keys" are mapped to the "underlying commands" by choosing one of the two standard "keysets", the "original" keyset or the "roguelike" keyset. The original keyset is very similar to the "underlying" command set, with a few additions (such as the ability to use the numeric "directions" to "walk" or the '5' key to "stay still"). The roguelike keyset provides similar additions, and also allows the use of the 'h'/'j'/'k'/'l'/'y'/'u'/'b'/'n' keys to "walk" (or, in combination with the shift or control keys, to run or alter), which thus requires a variety of key mappings to allow access to the underlying commands used for walking/running/altering. In particular, the "roguelike" keyset includes many more "capital" and "control" keys, as shown below. Note that any keys that are not required for access to the underlying command set may be used by the user to extend the "keyset" which is being used, by defining new "keymaps". To avoid the use of any "keymaps", press backslash ('\\') plus the "underlying command" key. You may enter "control-keys" as a caret ('^') plus the key (so '^' + 'p' yields '^p'). Some commands allow an optional "repeat count", which allows you to tell the game that you wish to do the command multiple times, unless you press a key or are otherwise disturbed. To enter a "repeat count", type '0', followed by the numerical count, followed by the command. You must type 'space' before entering certain commands. Skipping the numerical count yields a count of 99. An option allows certain commands (open, disarm, alter, etc) to auto-repeat. Some commands will prompt for extra information, such as a direction, an inventory or equipment item, a spell, a textual inscription, the symbol of a monster race, a sub-command, a verification, an amount of time, a quantity, a file name, or various other things. Normally you can hit return to choose the "default" response, or escape to cancel the command entirely. Some commands will prompt for a spell or an inventory item. Pressing pace (or '*') will give you a list of choices. Pressing '-' (minus) selects the item on the floor. Pressing a lowercase letter selects the given item. Pressing a capital letter selects the given item after verification. Pressing a numeric digit '#' selects the first item (if any) whose inscription contains '@#' or '@x#', where 'x' is the current "underlying command". You may only specify items which are "legal" for the command. Whenever an item inscription contains '!*' or '!x' (with 'x' as above) you must verify its selection. Some commands will prompt for a direction. You may enter a "compass" direction using any of the "direction keys" shown below. Sometimes, you may specify that you wish to use the current "target", by pressing 't' or '5', or that you wish to select a new target, by pressing '*' (see "Target" below). Original Keyset Directions = = = 7 8 9 4 6 1 2 3 = = = Roguelike Keyset Directions = = = y k u h l b j n = = = Each of the standard keysets provides some short-cuts over the "underlying commands". For example, both keysets allow you to "walk" by simply pressing an "original" direction key (or a "roguelike" direction key if you are using the roguelike keyset), instead of using the "walk" command plus a direction. The roguelike keyset allows you to "run" or "alter" by simply holding the shift or control modifier key down while pressing a "roguelike" direction key, instead of using the "run" or "alter" command plus a direction. Both keysets allow the use of the '5' key to "stand still", which is most convenient when using the original keyset. Original Keyset Command Summary =============================== ====== ============================= ====== ============================ a Aim a wand A Activate an object b Browse a book B Bash a door c Close a door C Character description d Drop an item D Disarm a trap or lock a door e Equipment list E Eat some food f Fire an item F Fuel your lantern/torch g Get objects on floor G Gain new spells/prayers h Fire default ammo at target H (unused) i Inventory list I Observe an item j Jam a door J (unused) k Squelch an item K Toggle squelch l Look around L Locate player on map m Cast a spell M Full dungeon map n Repeat previous command N (unused) o Open a door or chest O (unused) p Cast a spell P (unused) q Quaff a potion Q Quit (commit suicide) r Read a scroll R Rest for a period s Search for traps/doors S Toggle search mode t Take off equipment T Dig a tunnel u Use a staff U Use an item v Throw an item V Version info w Wear/wield equipment W Walk into a trap x (unused) X (unused) y (unused) Y (unused) z Zap a rod Z (unused) ! Interact with system ^A (special - debug command) @ (unused) ^B (unused) # (unused) ^C (special - break) $ (unused) ^D (unused) % (unused) ^E Toggle inven/equip window ^ (special - control key) ^F Repeat level feeling & (unused) ^G Do autopickup |*| Target monster or location ^H (unused) ( Load screen dump ^I (special - tab) ) Dump screen dump ^J (special - linefeed) { Inscribe an object ^K (unused) } Uninscribe an object ^L Center map [ Display visible monster list ^M (special - return) ] Display visible object list ^N (unused) |-| (unused) ^O Show previous message _ Enter store ^P Show previous messages |+| Alter grid ^Q (unused) = Set options ^R Redraw the screen ; Walk (with pickup) ^S Save and dont quit : Take notes ^T (unused) ' Target closest monster ^U (unused) " Enter a user pref command ^V (unused) , Stay still (with pickup) ^W (special - wizard mode) < Go up staircase ^X Save and quit . Run ^Y (unused) > Go down staircase ^Z (special - borg command) \\ (special - bypass keymap) ~ Check knowledge \` (special - escape) ? Help / Identify symbol ====== ============================= ====== ============================ .. |*| replace:: \* .. |-| replace:: \- .. |+| replace:: \+ Roguelike Keyset Command Summary ================================ ====== ============================= ====== ============================ a Zap a rod (Activate) A Activate an object b (walk - south west) B (run - south west) c Close a door C Character description d Drop an item D Disarm a trap or lock a door e Equipment list E Eat some food f Bash a door (force) F Fuel your lantern/torch g Get objects on floor G Gain new spells/prayers h (walk - west) H (run - west) i Inventory list I Observe an item j (walk - south) J (run - south) k (walk - north) K (run - north) l (walk - east) L (run - east) m Cast a spell M Full dungeon map n (walk - south east) N (run - south east) o Open a door or chest O Toggle squelch p Cast a spell P Browse a book q Quaff a potion Q Quit (commit suicide) r Read a scroll R Rest for a period s Search for traps/doors S Jam a door (Spike) t Fire an item T Take off equipment u (walk - north east) U (run - north east) v Throw an item V Version info w Wear/wield equipment W Locate player on map (Where) x Look around X Use an item y (walk - north west) Y (run - north west) z Aim a wand (Zap) Z Use a staff (Zap) ! Interact with system ^A (special - debug command) @ Center map ^B (alter - south west) # Toggle search mode ^C (special - break) $ (unused) ^D Squelch an item % (unused) ^E Toggle inven/equip window ^ (special - control key) ^F Repeat level feeling & (unused) ^G Do autopickup |*| Target monster or location ^H (alter - west) ( Load screen dump ^I (special - tab) ) Dump screen dump ^J alter - south) { Inscribe an object ^K (alter - north) } Uninscribe an object ^L (alter - east) [ Display visible monster list ^M (special - return) ] Display visible object list ^N (alter - south east) |-| Walk into a trap ^O Show previous message _ Enter store ^P Show previous messages |+| Alter grid ^Q (unused) = Set options ^R Redraw the screen ; Walk (with pickup) ^S Save and dont quit : Take notes ^T Dig a tunnel ' Target closest monster ^U (alter - north east) " Enter a user pref command ^V Repeat previous command , Run ^W (special - wizard mode) < Go up staircase ^X Save and quit . Stay still (with pickup) ^Y (alter - north west) > Go down staircase ^Z (special - borg command) \\ (special - bypass keymap) ~ Check knowledge \` (special - escape) ? Help / Identify symbol TAB Fire default ammo at target ====== ============================= ====== ============================ Special Keys ============ Certain special keys may be intercepted by the operating system or the host machine, causing unexpected results. In general, these special keys are control keys, and often, you can disable their special effects. If you are playing on a UNIX or similar system, then 'Ctrl-C' will interrupt Angband. The second and third interrupt will induce a warning bell, and the fourth will induce both a warning bell and a special message, ince the fifth will quit the game, after killing your character. Also, 'Ctrl-Z' will suspend the game, and return you to the original command shell, until you resume the game with the 'fg' command. There is now a compilation option to force the game to prevent the "double 'ctrl-z' escape death trick". The 'Ctrl-\\' and 'Ctrl-D' and 'Ctrl-S' keys should not be intercepted. It is often possible to specify "control-keys" without actually pressing the control key, by typing a caret ('^') followed by the key. This is useful for specifying control-key commands which might be caught by the operating system as explained above. Pressing backslash ('\\') before a command will bypass all keymaps, and the next keypress will be interpreted as an "underlying command" key, unless it is a caret ('^'), in which case the keypress after that will be turned into a control-key and interpreted as a command in the underlying angband keyset. The backslash key is useful for creating actions which are not affected by any keymap definitions that may be in force, for example, the sequence '\\' + '.' + '6' will always mean "run east", even if the '.' key has been mapped to a different underlying command. The '0' and '^' and '\\' keys all have special meaning when entered at the command prompt, and there is no "useful" way to specify any of them as an "underlying command", which is okay, since they would have no effect. For many input requests or queries, the special character 'ESCAPE' will abort the command. The '[y/n]' prompts may be answered with 'y' or 'n', or 'escape'. The '-more-' message prompts may be cleared (after reading the displayed message) by pressing 'ESCAPE', 'SPACE', 'RETURN', 'LINEFEED', or by any keypress, if the 'quick_messages' option is turned on. Command Counts ============== Some commands can be executed a fixed number of times by preceding them with a count. Counted commands will execute until the count expires, until you type any character, or until something significant happens, such as being attacked. Thus, a counted command doesn't work to attack another creature. While the command is being repeated, the number of times left to be repeated will flash by on the line at the bottom of the screen. To give a count to a command, type 0, the repeat count, and then the command. If you want to give a movement command and you are using the original command set (where the movement commands are digits), press space after the count and you will be prompted for the command. Counted commands are very useful for time consuming commands, as they automatically terminate on success, or if you are attacked. You may also terminate any counted command (or resting or running), by typing any character. This character is ignored, but it is safest to use a 'SPACE' or 'ESCAPE' which are always ignored as commands in case you type the command just after the count expires. You can tell Angband to automatically use a repeat count of 99 with commands you normally want to repeat (open, disarm, tunnel, bash, alter, etc) by setting the 'always_repeat' option. Selection of Objects ==================== Many commands will also prompt for a particular object to be used. For example, the command to read a scroll will ask you which of the scrolls that you are carrying that you wish to read. In such cases, the selection is made by typing a letter of the alphabet. The prompt will indicate the possible letters, and will also allow you to type the key '*', which causes all of the available options to be described. The list of choices will also be shown in the Choice window, if you are using a windows environment and windows are turned on. Often you will be able to press '/' to select an object from your equipment instead of your inventory. Pressing 'space' once will have the same effect as '*', and the second time will cancel the command and run the 'i' or 'e' command. The particular object may be selected by an upper case or a lower case letter. If lower case is used, the selection takes place immediately. If upper case is used, then the particular option is described, and you are given the option of confirming or retracting that choice. Upper case selection is thus safer, but requires an extra key stroke. Also see the '!*' and '!x' inscriptions, below. For many commands, you can also use '-' to select an object on the floor where you are standing. This lets you read scrolls or quaff potions, for example, off the dungeon floor without picking them up. If you enter a number between 0 and 9, the first item engraved with '@#' where '#' is the number you entered will be selected. See the section "Using Inscriptions" for more detail. angband-3.5.1/lib/help/version.txt0000644000175000017500000005513412456456606016374 0ustar chriscchrisc=================== Version Information =================== The current version is 3.4. Detailed information about this version and previous versions can be found at http://rephial.org. Also additional information can be found at the angband forums (http://angband.oook.cz) or the newsgroup (rec.games.roguelike.angband). This file was last updated for Angband 3.1.2 and remains here mainly for historical purposes. Angband has an incredibly complex history, and is the result of a lot of work by a lot of people, all of whom have contributed their time and energy for free, being rewarded only by the pleasure of keeping alive one of the best freeware games available anywhere. The version control files, if they existed, would span more than ten years time, and more than six different primary developers. Without such files, we must rely on simpler methods, such as change logs, source file diffs, and word of mouth. Some of this information is summarised in this file. Please be sure to read the copyright information contained in the file 'copying.txt'. Brief Version History ===================== First came "VMS Moria", by Robert Alan Koeneke (1985). Then came "Umoria" (Unix Moria), by James E. Wilson (1989). Details about the history of the various flavors of "Moria", the direct ancestor to Angband, can be found elsewhere, and a note from Robert Alan Koeneke is included in this file. Note that "Moria" has been ported to a variety of platforms, and has its own newsgroup, and its own fans. In 1990, Alex Cutler and Andy Astrand, with the help of other students at the University of Warwick, created Angband 1.0, based on the existing code for Umoria 5.2.1. They wanted to expand the game, keeping or even strengthening the grounding in Tolkien lore, while adding more monsters and items, including unique monsters and artifact items, plus activation, pseudo-sensing, level feelings, and special dungeon rooms. Over time, Sean Marsh, Geoff Hill, Charles Teague, and others, worked on the source, releasing a copy known as "Angband 2.4.frog_knows" at some point, which ran only on Unix systems, but which was ported by various people to various other systems. One of the most significant ports was the "PC Angband 1.4" port, for old DOS machines, which added color and various other significant changes, only some of which ever made it back into the official source. Then Charles Swiger (cs4w+@andrew.cmu.edu) took over, sometime in late 1993, cleaning up the code, fixing a lot of bugs, and bringing together various patches from various people, resulting in several versions of Angband, starting with Angband 2.5.1 (?), and leading up to the release of Angband 2.6.1 (and Angband 2.6.2) in late 1994. Some of the changes during this period were based on suggestions from the "net", and from various related games, including "UMoria 5.5", "PC Angband 1.4", and "FAngband". Angband 2.6.1 was primarily targetted towards Unix/NeXT machines, and it required the use of the low level "curses" commands for all screen manipulation and keypress interaction. Each release had to be ported from scratch to any new platforms, normally by creating visual display code that acted as a "curses" emulator. One such port was "Macintosh Angband 2.6.1", by Keith Randall, which added support for color, and which formed the basis for the first release of Angband 2.7.0. During the last half of 1994, Ben Harrison had been playing with the Angband source, primarily to investigate the possibility of making some kind of automatic player for Angband, like the old "rogue-o-matic" program for the game "Rogue". The difficulty of compiling a version for the Macintosh, and the complexity of the code, prevented this, and so Ben began cleaning up the code in various ways for his personal use. In late 1994, Charles Swiger announced that he was starting a real job and would no longer be able to be the Angband maintainer. This induced some amount of uproar in the Angband community (as represented by the Angband newsgroup), with various people attempting to form "committees" to take over the maintenance of Angband. Since committees have never given us anything but trouble (think "COBOL"), there was very little resistance when, on the first day of 1995, Ben made his code available, calling it "Angband 2.7.0", and by default, taking over as the new maintainer of Angband. Angband 2.7.0 was a very clean (but very buggy) rewrite that, among other things, allowed extremely simple porting to multiple platforms, starting with Unix and Macintosh, and by the time most of the bugs were cleaned up, in Angband 2.7.2, including X11, and various IBM machines. Angband 2.7.4 was released to the "ftp.cis.ksu.edu" site, and quickly gained acceptance, perhaps helped by the OS2 and Windows and Amiga and Linux ports. Angband 2.7.5 and 2.7.6 added important capabilities such as macros and user pref files, and continued to clean up the source. Angband 2.7.8 was released to the major ftp archives as the first "stable" version in a year or so, with new "help files" and "spoiler files" for the "online help", plus a variety of minor tweaks and some new features. After Angband 2.7.8 was released, Ben created a web site to keep track of all the changes made in each version (though a few may have been missed), and acquired the use of a new developement ftp server to supplement the official "mirror" server. This web site is now permanently located at the Official Angband Home Page (http://www.thangorodrim.net/). Unfortunately, the next six versions were numbered Angband 2.7.9v1 to Angband 2.7.9v6, but really each were rather major updates. Angband 2.8.0 and 2.8.1 were released using a more normal version scheme. Angband 2.8.2 and 2.8.3 add a few random features, clean up some code, and provide graphics support and such for a few more platforms. After the release of Angband 2.8.3 Ben's free time was more and more occupied by his work. He released a beta version of Angband 2.8.5, introducing many new features, but couldn't give as much attention to maintaining the game as he wanted to. Meanwhile, an "unofficial" version by Robert Ruehlmann, incorporating three popular patches (the "Easy Patch" by Tim Baker, for opening doors and disarming traps without specifying the direction: Greg Wooledge's "Random Artifacts" patch: and Keldon Jones's "Optional Monster AI Improvement"), named "2.8.3h", was gaining popularity. So in March 2000, Robert Ruehlmann offered to take over Angband and started to fix the remaining bugs in the Angband 2.8.5 beta. The resulting version was to be released as Angband 2.9.0. Further bugfixes and a couple of new features - including many in the realms of user-customizability, with greater control over ego-items, player races and classes, monsters, items and artifacts - have led to the current version. And with the greater amount of user-customizability that is now possible, it was inevitable that SOMEBODY would eventually go and actually do something with it. Jonathan Ellis started customizing the user-editable text files in the 'edit' directory for his own personal use - originally, only by fixing bugs and inconsistencies (less powerful monsters being worth more experience per kill than more powerful ones, dragons doing a decent amount of damage in melee, monsters with two claws and one mouth getting one claw and three bite attacks, and so on). At first, this was all that could really be done with it: adding new monsters and items was impossible, as the limits were fixed. And so only three new monsters made an appearance, each of them replacing an existing monster in the order: and one new artifact - "The Palantir of Westernesse". Gameplay balance could be tweaked somewhat, by changing the level, power and rarity of certain items and monsters: and some changes were made, mostly with the attempt to reduce the notorious "triple whammy" effect of needing poison, confusion and nether resistance (or over 550 hps, if without nether resistance) all at once, straight after passing 2000', forcing excessive scumming before this depth or risking unavoidable instant death: and then having nothing left to do but dive straight to 4000' and scum for speed items, missing out on some of the most interesting depths of the dungeon. This problem, at least, could be addressed, but actual new things were less easy to add... That all changed with Angband 2.9.1, which for the first time moved the limits themselves to a separate user-editable file, and allowed more monsters and items to be created without removing the old ones. At the same time, a patch by Matthias Kurzke was incorporated which allowed the creation of new ego-items. Various new powers, for the player and monsters, were added to the game - but no items or monsters yet had these powers (resist fear, poison brand, lose charisma, summon greater demons, and so on): indeed, arguably it could be said that the game had not even adjusted properly to Ben Harrison's fractional speed system (Angband 2.7.0) or the addition of the other attack forms such as shards, sound, chaos, nexus and so on (even before Ben.) The Official Angband Home Page (http://rephial.org/) serves not only as the most up to date description of Angband, but also lists changes made between versions, and changes planned for upcoming versions, and lists various email addresses and web sites related to Angband. Some of the changes between Angband 2.6.1 and 3.0.6 =================================================== It is very hard to pin down, along the way from 2.6.2 to 3.0.6, exactly what changes were made, and exactly when they were made. Most releases involved so many changes from the previous release as to make "diff files" not very useful, since often the diff files are as long as the code itself. Most of the changes, with the notable exception of the creation of some of the new 'main-xxx.c' files for the various new platforms, and a few other minor exceptions generally noted directly in comments in the source, were written by Ben or Robert, either spontaneously, or, more commonly, as the result of a suggestion or comment by an Angband player. The most important modification was a massive "code level cleanup" for 2.7.x, largely completed in 2.7.8, that made all other modifications much simpler and safer. This cleanup was so massive that in many places the code is no longer recognizable, for example, via "diff -r", often because it was rewritten from scratch. The second most important modification was the design of a generic 'z-term.c' package, which allows Angband to be ported to a new machine with as few as 50 lines of code. Angband 2.9.3 thus runs without modification on many machines, including Macintosh, PowerMac, Unix/X11, Unix/Curses, Amiga, Windows, OS2-386, DOS-386, and even DOS-286. It would be difficult to list all of the changes between Angband 2.6.1 and 3.0.6, because many of them were made in passing during the massive code level cleanup. Many of the changes are invisible to the user, but still provide increased simplicity and efficiency, and decreased code size, or make other more visable changes possible. For example, the new 'project()' code that handles all bolts, beams, and balls, the new 'update_view()' code that simplifies line of sight computation, or the new 'generate()' code that builds new levels in the dungeon. Many changes have been made to increase efficiency, including the new 'process_monsters()' and 'update_monsters()' functions, and the new 'objdes()' and 'light_spot()' routines. The generic 'z-term.c' package yielded efficient screen updates, and enabled the efficient use of color. The most visible (to ordinary players) changes that happened as a result of Ben Harrison's maintainership were: - a far greater degree of user-customizability as shown by the 'info.txt' files - the "fractional" speed system, with +10 in the new scheme equalling +1 in old money - object stacking, the ability to have more than one object in a square: first tried in 2.7.9, completed in 2.8.2. It should also be pointed out at this point that the far cleaner nature of Ben's code as compared to previous versions has given many other people the opportunity to base code for their own Angband variants on it. And so a plethora of new variants have appeared, many of them far more different from Angband now than Angband ever was from Moria, and yet still based on Ben's coding ideals for Angband. For Angband 2.9.0, the first few new visible features were a random artifact generator (originally developed from a variant by Greg Wooledge), an option to improve monster AI (believed to have originally started out life in a patch written by Keldon Jones), and a patch to allow easier handling of opening and closing doors and disarming traps (by Tim Baker). For Angband 2.9.1 has also come such things as the ability to increase the size of the editable textfiles and thus the number of monsters, artifacts, items, ego-items and vaults in the game (many new vaults were written by Chris Weisiger, some by others, and the number of vaults in the game at this time was doubled), and much greater customizability of ego-items has become possible thanks to a patch written by Matthias Kurzke. It is also now possible to add new character races to the game, and to edit the shopkeepers with respect to their greed, tolerance of haggling and reactions to the character based on his race. Angband 2.9.2 adds support for poison branded weapons to the game. Angband 2.9.3 made the character class itself customizable to an extent. A Posting from the Original Author ================================== | From: koeneke@ionet.net (Robert Alan Koeneke) | Newsgroups: rec.games.roguelike.angband,rec.games.roguelike.moria | Subject: Early history of Moria | Date: Wed, 21 Feb 1996 04:20:51 GMT I had some email show up asking about the origin of Moria, and its relation to Rogue. So I thought I would just post some text on the early days of Moria. First of all, yes, I really am the Robert Koeneke who wrote the first Moria. I had a lot of mail accussing me of pulling their leg and such. I just recently connected to Internet (yes, I work for a company in the dark ages where Internet is concerned) and was real surprised to find Moria in the news groups... Angband was an even bigger surprise, since I have never seen it. I probably spoke to its originator though... I have given permission to lots of people through the years to enhance, modify, or whatever as long as they freely distributed the results. I have always been a proponent of sharing games, not selling them. Anyway... Around 1980 or 81 I was enrolled in engineering courses at the University of Oklahoma. The engineering lab ran on a PDP 1170 under an early version of UNIX. I was always good at computers, so it was natural for me to get to know the system administrators. They invited me one night to stay and play some games, an early startrek game, The Colossal Cave Adventure (later just 'Adventure'), and late one night, a new dungeon game called 'Rogue'. So yes, I was exposed to Rogue before Moria was even a gleam in my eye. In fact, Rogue was directly responsible for millions of hours of play time wasted on Moria and its descendents... Soon after playing Rogue (and man, was I HOOKED), I got a job in a different department as a student assistant in computers. I worked on one of the early VAX 11/780's running VMS, and no games were available for it at that time. The engineering lab got a real geek of an administrator who thought the only purpose of a computer was WORK! Imagine... Soooo, no more games, and no more rogue! This was intolerable! So I decided to write my own rogue game, Moria Beta 1.0. I had three languages available on my VMS system. Fortran IV, PASCAL V1.?, and BASIC. Since most of the game was string manipulation, I wrote the first attempt at Moria in VMS BASIC, and it looked a LOT like Rogue, at least what I could remember of it. Then I began getting ideas of how to improve it, how it should work differently, and I pretty much didn't touch it for about a year. Around 1983, two things happened that caused Moria to be born in its recognizable form. I was engaged to be married, and the only cure for THAT is to work so hard you can't think about it; and I was enrolled for fall to take an operating systems class in PASCAL. So, I investigated the new version of VMS PASCAL and found out it had a new feature. Variable length strings! Wow... That summer I finished Moria 1.0 in VMS PASCAL. I learned more about data structures, optimization, and just plain programming that summer then in all of my years in school. I soon drew a crowd of devoted Moria players... All at OU. I asked Jimmey Todd, a good friend of mine, to write a better character generator for the game, and so the skills and history were born. Jimmey helped out on many of the functions in the game as well. This would have been about Moria 2.0 In the following two years, I listened a lot to my players and kept making enhancements to the game to fix problems, to challenge them, and to keep them going. If anyone managed to win, I immediately found out how, and 'enhanced' the game to make it harder. I once vowed it was 'unbeatable', and a week later a friend of mine beat it! His character, 'Iggy', was placed into the game as 'The Evil Iggy', and immortalized... And of course, I went in and plugged up the trick he used to win... Around 1985 I started sending out source to other universities. Just before a OU / Texas football clash, I was asked to send a copy to the Univeristy of Texas... I couldn't resist... I modified it so that the begger on the town level was 'An OU football fan' and they moved at maximum rate. They also multiplied at maximum rate... So the first step you took and woke one up, it crossed the floor increasing to hundreds of them and pounded you into oblivion... I soon received a call and provided instructions on how to 'de-enhance' the game! Around 1986 - 87 I released Moria 4.7, my last official release. I was working on a Moria 5.0 when I left OU to go to work for American Airlines (and yes, I still work there). Moria 5.0 was a complete rewrite, and contained many neat enhancements, features, you name it. It had water, streams, lakes, pools, with water monsters. It had 'mysterious orbs' which could be carried like torches for light but also gave off magical aura's (like protection from fire, or aggrivate monster...). It had new weapons and treasures... I left it with the tudent assistants at OU to be finished, but I guess it soon died on the vine. As far as I know, that source was lost... I gave permission to anyone who asked to work on the game. Several people asked if they could convert it to 'C', and I said fine as long as a complete credit history was maintained, and that it could NEVER be sold, only given. So I guess one or more of them succeeded in their efforts to rewrite it in 'C'. I have since received thousands of letters from all over the world from players telling about their exploits, and from administrators cursing the day I was born... I received mail from behind the iron curtain (while it was still standing) talking about the game on VAX's (which supposedly couldn't be there due to export laws). I used to have a map with pins for every letter I received, but I gave up on that! I am very happy to learn my creation keeps on going... I plan to download it and Angband and play them... Maybe something has been added that will surprise me! That would be nice... I never got to play Moria and be surprised... | Robert Alan Koeneke | koeneke@ionet.net Previous Versions (outdated) ============================ VMS Moria Version 4.8 --------------------- =========== ======== Version 0.1 03/25/83 Version 1.0 05/01/84 Version 2.0 07/10/84 Version 3.0 11/20/84 Version 4.0 01/20/85 =========== ======== Modules: +------+------------------------+-----------+ | V1.0 | Dungeon Generator | RAK | + +------------------------+-----------+ | | Character Generator | RAK & JWT | + +------------------------+-----------+ | | Moria Module | RAK | + +------------------------+-----------+ | | Miscellaneous | RAK & JWT | +------+------------------------+-----------+ | V2.0 | Town Level & Misc | RAK | +------+------------------------+-----------+ | V3.0 | Internal Help & Misc | RAK | +------+------------------------+-----------+ | V4.0 | Source Release Version | RAK | +------+------------------------+-----------+ =============================== ================================ Robert Alan Koeneke Jimmey Wayne Todd Jr. Student/University of Oklahoma Student/University of Oklahoma =============================== ================================ Umoria Version 5.2 (formerly UNIX Moria) ---------------------------------------- ============ ======== Version 4.83 5/14/87 Version 4.85 10/26/87 Version 4.87 5/27/88 Version 5.0 11/2/89 Version 5.2 5/9/90 ============ ======== James E. Wilson, U.C. Berkeley wilson@ernie.Berkeley.EDU ...!ucbvax!ucbernie!wilson Other contributors: ====================== ================================================== \D. G. Kneller MSDOS Moria port Christopher J. Stuart recall, options, inventory, and running code Curtis McCauley Macintosh Moria port Stephen A. Jacobs Atari ST Moria port William Setzer object naming code David J. Grabiner numerous bug reports, and consistency checking Dan Bernstein UNIX hangup signal fix, many bug fixes and many others... ====================== ================================================== | Copyright (c) 1989 James E. Wilson, Robert A. Koeneke | This software may be copied and distributed for educational, research, and not for profit purposes provided that this copyright and statement are included in all such copies. Early Angband credits --------------------- Version 2.0 Alex Cutler, Andy Astrand, Sean Marsh, Geoff Hill, Charles Teague. Version 2.4 05/09/1993 Version 2.5 12/05/1993 Charles Swiger Version 2.6 09/04/1994 Charles Swiger Version 2.7 01/01/1995 Ben Harrison Version 2.8 01/01/1997 Ben Harrison Version 2.9 04/10/2000 Robert Ruehlmann Contributors (incomplete) ========================= Peter Berger, "Prfnoff", Arcum Dagsson, Ed Cogburn, Matthias Kurzke, Ben Harrison, Steven Fuerst, Julian Lighton, Andrew Hill, Werner Baer, Tom Morton, "Cyric the Mad", Chris Kern, Tim Baker, Jurriaan Kalkman, Alexander Wilkins, Mauro Scarpa, John I'anson-Holton, "facade", Dennis van Es, Kenneth A. Strom, Wei-Hwa Huang, Nikodemus, Timo Pietilä, Greg Wooledge, Keldon Jones, Shayne Steele, Dr. Andrew White, Musus Umbra, Jonathan Ellis angband-3.5.1/lib/help/angband.css0000644000175000017500000000040412456456606016240 0ustar chriscchriscbody {padding:1em;} .title {text-align: center;font-size:28pt;} .toc-backref {font-size:22pt;} h2 {font-size:18pt;} tt {font-size:large;color:red;background:#dddddd;} dt {font-weight:bold;} .align-center {display: block; margin-left:auto; margin-right:auto;} angband-3.5.1/lib/help/help.hlp0000644000175000017500000000227012456456606015574 0ustar chriscchriscPlease choose one of the following online help files: (a) General information (general.txt) (b) Creating a character (birth.txt) (c) Exploring the dungeon (dungeon.txt) (d) Attacking monsters (attack.txt) (e) Playing the game (playing.txt) (f) Command descriptions (command.txt) (g) Option descriptions (option.txt) (h) Customising the game (customize.txt) (i) Historic information (version.txt) (j) Spoiler menu (if any) (spoiler.hlp) (k) User menu (if any) (user.hlp) Browser/help commands: # go to line % go to file ? go to last file/main menu SPACE advance 1 page - back up 1 page / search for text RET advance 1 line = back up 1 line & show (highlight) some text + advance 1/2 page _ back up 1/2 page ! toggle case sentitivity .. menu:: [a] general.txt .. menu:: [b] birth.txt .. menu:: [c] dungeon.txt .. menu:: [d] attack.txt .. menu:: [e] playing.txt .. menu:: [f] command.txt .. menu:: [g] option.txt .. menu:: [h] customize.txt .. menu:: [i] version.txt .. menu:: [j] spoiler.hlp .. menu:: [k] user.hlp angband-3.5.1/lib/help/customize.txt0000644000175000017500000003014312456456606016722 0ustar chriscchrisc==================== Customising the game ==================== Angband supports multiple customizations. These can vary from alternative methods for selecting objects, keymaps for different commands, changing the visuals (using graphical tiles), creating subwindows, and saving customizations for use on future characters. Squelch settings ================ Angband allows you to ignore specific items that you don't want to see anymore. These items are 'squelched' and any similar items are hidden from view. There are several ways to squelch an item. The easiest way is to choose the 's' option when destroying an object. Whenever you destroy an object you are forced to confirm the destruction. One of the options is 's'. If you use this option, the object is dropped and then hidden from view. Weapons and armor have quality squelch options. These allow you to specify what types of weapons and armor you are no longer interested in seeing. There is a quality setting for each weapon and armor type. Squelching weapons and armor by destroying the object will prompt you with a question about whether you wish to squelch all of that type of armor with a certain quality setting. These quality settings are described below: bad The weapon/armor has negative AC, to-hit or to-dam. average The weapon/armor has no pluses no minuses. It is non-magical. good The weapon/armor has positive AC, to-hit or to-dam. However it does not have any special abilities, brands, slays, stat-boosts, resistances excellent, with no high resists Weapons will have some slays. Armor will have resistances, but these are limited to rfire, rcold, racid and relec. excellent but not splendid Weapons and armor may have high resists but they do not have any stat boosts or brands. splendid Squelching all splendid items only leaves artifacts unsquelched. Using Inscriptions ================== Inscriptions are notes you can mark on objects using the '{' command. You can use this to give the game comamnds about the object, which are listed below. You can also set up the game to automatically inscribe certain items whenever you find them, using the object knowledge screens, accessed using '~'. Inscribing an item with '!!': This will alert you when the item has finished recharging. Inscribing an item with '=g': This marks an item as 'always pick up'. This is sometimes useful for picking up ammunition after a shootout. Inscribing an item with '!' followed by a command letter or '*': This means "ask me before using this item". '!w' means 'ask me before wielding', '!d' means 'ask me before dropping', and so on. If you inscribe an item with '!*' then the game will confirm any use of an item. Say you inscribed your potion of Speed with '!q'. This would prompt you when you try to drink it to see if you really mean to. Multiple '!q' inscriptions will prompt multiple times. Similarly, using !v!k!d makes it very hard for you to accidentally throw, ignore or put down the item it is inscribed on. Some adventurers use this for Scrolls of Word of Recall so they don't accidentally return to the dungeon too soon. Inscribing an item with '@', followed by a command latter, followed by 0-9: Normally when you select an item from your inventory you must enter the letter that corresponds to the item. Since the order of your inventory changes as items get added and removed, this can get annoying. You can instead assign certain items numbers when using a command so that wherever they are in your backpack, you can use the same keypresses. If you have multiple items inscribed with the same thing, the game will use the first one. For example, if you inscribe a staff of Cure Light Wounds with '@u1', you can refer to it by pressing 1 when 'u'sing it. You could also inscribe a wand of Wonder with '@a1', and when using 'a', 1 would select that wand. Spellcasters should inscribe their books, so that if they lose them they do not cast the wrong spell. If you are mage and the beginner's spellbook is the first in your inventory, casting 'maa' will cast magic missile. But if you lose your spellbook, casting 'maa' will cast the first spell in whatever new book is in the top of your inventory. This can be a waste in the best case scenario and exceedingly dangerous in the worst! By inscribing your spellbooks with '@m1', '@m2', etc., if you lose your first spellbook and attempt to cast magic missile by using 'm1a', you cannot accidentally select the wrong spellbook. Inscribing an item with '^', followed by a command letter: When you wear an item inscribed with '^', the game prompts you before doing that action. You might inscribe '^>' on an item if you want to be reminded to take it off before going down stairs. If the item is in your backpack then the game won't prompt you. Like with '!', you can use '*' for the command letter if you want to game to prompt you every turn whatever you're doing. This can get very annoying! User Pref Files =============== Angband allows you to change various aspects of the game to suit your tastes. You may define keymaps (changing the way Angband maps your keypresses to underlying commands), modify the visuals (allowing you to change the appearance of monsters, objects, or terrain features), change the colors (allowing you to make a given color brighter, darker, or even completely different), or set options (turning them off or on). Angband stores your preferences in files called "user pref files", which contain comments and "user pref commands", which are simple strings describing one aspect of the system about which the user has a preference. There are many ways to load a user pref file, and in fact, some of these files are automatically loaded for you by the game. All of the files are kept in the "lib/user/" directory, though you may have to use one of the command line arguments to redirect this directory, especially on multiuser systems. You may also enter single user pref commands directly, using the special "Enter a user pref command" command, activated by "double quote". You may have to use the "redraw" command ('^R') after changing certain of the aspects of the game, to allow Angband to adapt to your changes. When the game starts up, after you have loaded an old character, or created a new character, some user pref files are loaded automatically. First, the "pref.prf" file is loaded. This file contains some user pref commands which will work on all platforms. Then one of 'font-xxx.prf' (for normal usage) or 'graf-xxx.prf' (for bitmap usage) is loaded. These files contain attr/char changes to allow the monsters, objects, and/or terrain features to look "better" on your system. Then the 'pref-xxx.prf' file is loaded. This file contains pre-defined system specific stuff (keymaps, color definitions, etc). Then, the 'user-xxx.prf' file is loaded. This file contains user-defined system specific stuff. The 'user-xxx.prf' file is used as the "default" user pref file in many places. The 'xxx' is the "system suffix" for your system, taken from the 'main-xxx.c' file which was used to generate your executable. Finally, the 'Race.prf', 'Class.prf', and 'Name.prf' files are loaded, where 'Race', 'Class', and 'Name' are replaced by the actual race, class, and name of the current character. Several options menu items allow you to load existing user pref files, create new user pref files, append information to existing user pref files, and/or interact with various of the user preferences. Subwindows ========== In addition to the main window, you can create additional window displays that have other secondary information on them. You can access the subwindow menu by using '=' then 'w'. You can select what windows to display. You may then need to make the window visible using the "window" pull down menu from the menu bar. There are a variety of subwindow choices and you should experiment to see which ones are the most useful for you. User Pref Files (Keymaps) ========================= The "Interact with keymaps" menu allows you to set up keymaps. Keymaps map a single keypress to a series of keypresses. For example you might map the key F1 to "maa" (the keypresses to cast "Magic Missile" as a spellcaster). This can speed up access to commonly-used features. Keymaps have two parts: the trigger key and the action. These are written where possible just as ordinary characters. However, if modifier keys (shift, control, etc.) are used then they are encoded as special characters within curly braces {}. Possible modifiers are:: K = Keypad (for numbers) M = Meta (Cmd-key on OS X, alt on most other platforms) ^ = Control S = Shift If the only modifier is the control key, the curly braces {} aren't included. For example:: {^S}& = Control-Shift-S ^D = Control-D Special keys, like F1, F2, or Tab, are all written within square brackets []. For example:: ^[F1] = Control-F1 {^S}[Tab] = Control-Shift-Tab Special keys include [Escape]. The game will run keymaps in whatever keyset you use (original or roguelike). So if you write keymaps for roguelike keys and swith to original keys, they may not work as you expect! Keymap actions aren't recursive either, so if you had a keymap whose trigger was F1, including F1 inside the action wouldn't run the keymap action again. When you're running a keymap, you might want to automatically skip any -more- prompts. To do this, include whatever commands you want to skip -more- prompts during with '()'. Keymaps are written in pref files as:: A: C:: The action must always come first, means 'keyset Type', which is either 0 for the original keyset or 1 for the roguelike keyset. For example:: A:maa C:0:[F1] Angband uses a few built-in keymaps. These are for the movement keys (they are mapped to ';' plus the number, e.g. '5' -> ';5'), amongst others. You can see the full list in pref.prf but they shouldn't impact on you in any way. To avoid triggering a keymap, you can use the backslash ('\\') command. User Pref Files (Visuals) ========================= You can use the "Interact with visuals" menu to change various visual information, currently including the choice of what attr/char values are used to represent various monsters, objects, or terrain features. Note that in combination appropriate support in 'main-xxx.c', and with the use of the "use_graphics" flag, you may be able to specify that "graphic bitmaps" hould be used instead of normal "colored characters" for various things. When interactively modifying the attr/char values for monsters, objects, or terrain features, pressing 'n' or 'N' will change which entry you are changing, pressing 'a' or 'A' will rotate through the available attr values, and pressing 'c' or 'C' will rotate though the available char values. Note that attr/char values with the "high bit" set may induce the display of special "graphic" pictures if the "use_graphics" flag is set, and your system supports the "use_graphics" flag. Note that this menu can be abused in various ways, and if you must do so, remember that you are only cheating yourself. Keymaps can be specified in user pref files as lines of the form 'R::/' or 'K::/' or 'F::/' or 'U::/'. User Pref Files (Colors) ======================== The "Interact with colors" menu allows you to change the actual internal values used to display various colors. This command may or may not have any effect on your machine. Advanced machines may allow you to change the actual RGB values used to represent each of the 16 colors used by Angband, and perhaps even allow you to define new colors which are not currently used by Angband. Colors can be specified in user pref files as lines of the form 'V:::::'. User Pref Files (Options) ========================= The "Interact with options" command allows you to turn options on or off. You may turn options off or on using the user pref commands of the form 'X:

=" option. * * Sets any of angband's special directories to . * * The "" can be any legal path for the given system, and should * not end in any special path separator (i.e. "/tmp" or "~/.ang-info"). */ static void change_path(const char *info) { char *info_copy = NULL; char *path = NULL; char *dir = NULL; unsigned int i = 0; char dirpath[512]; if (!info || !info[0]) quit_fmt("Try '-d='.", info); info_copy = string_make(info); path = strtok(info_copy, "="); dir = strtok(NULL, "="); for (i = 0; i < N_ELEMENTS(change_path_values); i++) { if (my_stricmp(path, change_path_values[i].name) == 0) { #ifdef SETGID if (!change_path_values[i].setgid_ok) quit_fmt("Can't redefine path to %s dir on multiuser setup", path); #endif string_free(*change_path_values[i].path); *change_path_values[i].path = string_make(dir); /* the directory may not exist and may need to be created. */ path_build(dirpath, sizeof(dirpath), dir, ""); if (!dir_create(dirpath)) quit_fmt("Cannot create '%s'", dirpath); return; } } quit_fmt("Unrecognised -d paramater %s", path); } #ifdef UNIX /* * Find a default user name from the system. */ static void user_name(char *buf, size_t len, int id) { struct passwd *pw = getpwuid(id); /* Default to PLAYER */ if (!pw || !pw->pw_name || !pw->pw_name[0] ) { my_strcpy(buf, "PLAYER", len); return; } /* Copy and capitalise */ my_strcpy(buf, pw->pw_name, len); my_strcap(buf); } #endif /* UNIX */ /** * List all savefiles this player can access. */ static void list_saves(void) { char fname[256]; ang_dir *d = my_dopen(ANGBAND_DIR_SAVE); #ifdef SETGID char uid[10]; strnfmt(uid, sizeof(uid), "%d.", player_uid); #endif if (!d) quit_fmt("Can't open savefile directory"); printf("Savefiles you can use are:\n"); while (my_dread(d, fname, sizeof fname)) { char path[1024]; const char *desc; #ifdef SETGID /* Check that the savefile name begins with the user'd ID */ if (strncmp(fname, uid, strlen(uid))) continue; #endif path_build(path, sizeof path, ANGBAND_DIR_SAVE, fname); desc = savefile_get_description(path); if (desc) printf(" %-15s %s\n", fname, desc); else printf(" %-15s\n", fname); } my_dclose(d); printf("\nUse angband -u to use savefile .\n"); } #ifndef SETGID /* * Transition non-setgid installs away from using uid.name style savefile * names. */ static void transition_savefile_names(void) { char fname[256]; char uid[10]; ang_dir *d = my_dopen(ANGBAND_DIR_SAVE); if (!d) return; strnfmt(uid, sizeof(uid), "%d.", player_uid); while (my_dread(d, fname, sizeof fname)) { char *newname = fname+strlen(uid); char oldpath[1024]; char newpath[1024]; /* Check that the savefile name begins with the user'd ID */ if (strncmp(fname, uid, strlen(uid)) != 0) continue; /* Sanity check - can't rename "1000." to "" */ if (!newname[0]) continue; /* Move the file */ path_build(oldpath, sizeof oldpath, ANGBAND_DIR_SAVE, fname); path_build(newpath, sizeof newpath, ANGBAND_DIR_SAVE, newname); printf("Moving %s to %s\n", oldpath, newpath); file_move(oldpath, newpath); } my_dclose(d); } #endif /* SETGID */ static bool new_game; /* * Pass the appropriate "Initialisation screen" command to the game, * getting user input if needed. */ static errr get_init_cmd(void) { /* Wait for response */ pause_line(Term); if (new_game) cmd_insert(CMD_NEWGAME); else /* This might be modified to supply the filename in future. */ cmd_insert(CMD_LOADFILE); /* Everything's OK. */ return 0; } /* Command dispatcher for curses, etc builds */ static errr default_get_cmd(cmd_context context, bool wait) { if (context == CMD_INIT) return get_init_cmd(); else return textui_get_cmd(context, wait); } static void debug_opt(const char *arg) { if (streq(arg, "mem-poison-alloc")) mem_flags |= MEM_POISON_ALLOC; else if (streq(arg, "mem-poison-free")) mem_flags |= MEM_POISON_FREE; else { puts("Debug flags:"); puts(" mem-poison-alloc: Poison all memory allocations"); puts(" mem-poison-free: Poison all freed memory"); exit(0); } } /* * Simple "main" function for multiple platforms. * * Note the special "--" option which terminates the processing of * standard options. All non-standard options (if any) are passed * directly to the "init_xxx()" function. */ int main(int argc, char *argv[]) { int i; bool done = FALSE; const char *mstr = NULL; const char *soundstr = NULL; bool args = TRUE; /* Save the "program name" XXX XXX XXX */ argv0 = argv[0]; #ifdef UNIX /* Default permissions on files */ (void)umask(022); /* Get the user id */ player_uid = getuid(); #endif /* UNIX */ #ifdef SETGID /* Save the effective GID for later recall */ player_egid = getegid(); #endif /* UNIX */ /* Drop permissions */ safe_setuid_drop(); /* Get the file paths */ /* paths may be overriden by -d options, so this has to occur *before* processing command line args */ init_stuff(); /* Process the command line arguments */ for (i = 1; args && (i < argc); i++) { const char *arg = argv[i]; /* Require proper options */ if (*arg++ != '-') goto usage; /* Analyze option */ switch (*arg++) { case 'l': list_saves(); exit(0); case 'n': new_game = TRUE; break; case 'w': arg_wizard = TRUE; break; case 'r': arg_rebalance = TRUE; break; case 'g': /* Default graphics tile */ /* in graphics.txt, 2 corresponds to adam bolt's tiles */ arg_graphics = 2; if (*arg) arg_graphics = atoi(arg); break; case 'u': { if (!*arg) goto usage; my_strcpy(op_ptr->full_name, arg, sizeof op_ptr->full_name); /* The difference here is because on setgid we have to be * careful to only let the player have savefiles stored in * the central save directory. Sanitising input using * player_safe_name() removes anything like that. * * But if the player is running with per-user saves, they * can do whatever the hell they want. */ #ifdef SETGID savefile_set_name(player_safe_name(p_ptr, FALSE)); #else savefile_set_name(arg); #endif /* SETGID */ continue; } case 'm': if (!*arg) goto usage; mstr = arg; continue; case 's': if (!*arg) goto usage; soundstr = arg; continue; case 'd': change_path(arg); continue; case 'x': debug_opt(arg); continue; case '-': argv[i] = argv[0]; argc = argc - i; argv = argv + i; args = FALSE; break; default: usage: puts("Usage: angband [options] [-- subopts]"); puts(" -n Start a new character (WARNING: overwrites default savefile without -u)"); puts(" -l Lists all savefiles you can play"); puts(" -w Resurrect dead character (marks savefile)"); puts(" -r Rebalance monsters"); puts(" -g Request graphics mode"); puts(" -x Debug options; see -xhelp"); puts(" -u Use your savefile"); puts(" -d= Override a specific directory with . can be:"); for (i = 0; i < (int)N_ELEMENTS(change_path_values); i++) { #ifdef SETGID if (!change_path_values[i].setgid_ok) continue; #endif printf(" %s (default is %s)\n", change_path_values[i].name, *change_path_values[i].path); } puts(" Multiple -d options are allowed."); puts(" -s Use sound module :"); for (i = 0; i < (int)N_ELEMENTS(sound_modules); i++) printf(" %s %s\n", sound_modules[i].name, sound_modules[i].help); puts(" -m Use module , where can be:"); /* Print the name and help for each available module */ for (i = 0; i < (int)N_ELEMENTS(modules); i++) printf(" %s %s\n", modules[i].name, modules[i].help); /* Actually abort the process */ quit(NULL); } if (*arg) goto usage; } #ifndef SETGID /* Transition from 3.4 to 3.5 - rename savefiles with uid at the beginning */ transition_savefile_names(); #endif /* Hack -- Forget standard args */ if (args) { argc = 1; argv[1] = NULL; } /* Install "quit" hook */ quit_aux = quit_hook; /* If we were told which mode to use, then use it */ if (mstr) ANGBAND_SYS = mstr; if (setlocale(LC_CTYPE, "")) { /* Require UTF-8 */ if (strcmp(nl_langinfo(CODESET), "UTF-8") != 0) quit("Angband requires UTF-8 support"); } /* Try the modules in the order specified by modules[] */ for (i = 0; i < (int)N_ELEMENTS(modules); i++) { /* User requested a specific module? */ if (!mstr || (streq(mstr, modules[i].name))) { ANGBAND_SYS = modules[i].name; if (0 == modules[i].init(argc, argv)) { done = TRUE; break; } } } /* Make sure we have a display! */ if (!done) quit("Unable to prepare any 'display module'!"); #ifdef UNIX /* Get the "user name" as a default player name, unless set with -u switch */ if (!op_ptr->full_name[0]) { user_name(op_ptr->full_name, sizeof(op_ptr->full_name), player_uid); /* Set the savefile to load */ savefile_set_name(player_safe_name(p_ptr, FALSE)); } /* Create any missing directories */ create_needed_dirs(); #endif /* UNIX */ /* Try the modules in the order specified by sound_modules[] */ for (i = 0; i < (int)N_ELEMENTS(sound_modules); i++) if (!soundstr || streq(soundstr, sound_modules[i].name)) if (0 == sound_modules[i].init(argc, argv)) break; /* Catch nasty signals */ signals_init(); /* Set up the command hook */ cmd_get_hook = default_get_cmd; /* Set up the display handlers and things. */ init_display(); /* Play the game */ play_game(); /* Free resources */ cleanup_angband(); /* Quit */ quit(NULL); /* Exit */ return (0); } #endif angband-3.5.1/src/buildid.c0000644000175000017500000000016412456456606015010 0ustar chriscchrisc#include "buildid.h" const char *buildid = VERSION_NAME " " VERSION_STRING; const char *buildver = VERSION_STRING; angband-3.5.1/src/birth.h0000644000175000017500000000075112456456606014513 0ustar chriscchrisc/* birth.h */ #ifndef BIRTH_H #define BIRTH_H extern void player_birth(bool quickstart_allowed); extern void player_init(struct player *p); extern void player_generate(struct player *p, const player_sex *s, const struct player_race *r, const struct player_class *c); extern char *get_history(struct history_chart *h); extern void wield_all(struct player *p); char *find_roman_suffix_start(const char *buf); #endif /* !BIRTH_H */ angband-3.5.1/src/ui-options.h0000644000175000017500000000045712456456606015514 0ustar chriscchrisc#ifndef INCLUDED_UI_OPTIONS_H #define INCLUDED_UI_OPTIONS_H extern void do_cmd_options_birth(void); extern bool squelch_tval(int tval); extern void do_cmd_options_item(const char *title, int row); extern void cleanup_options(void); /* already in cmds.h * extern void do_cmd_options(void); */ #endif angband-3.5.1/src/ui-spell.c0000644000175000017500000002103112456456606015122 0ustar chriscchrisc/* * File: ui-spell.c * Purpose: Spell UI handing * * Copyright (c) 2010 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "cmds.h" #include "object/tvalsval.h" #include "game-cmd.h" #include "spells.h" #include "ui.h" #include "ui-menu.h" /** * Spell menu data struct */ struct spell_menu_data { int spells[PY_MAX_SPELLS]; int n_spells; bool browse; bool (*is_valid)(int spell); bool show_description; int selected_spell; }; /** * Is item oid valid? */ static int spell_menu_valid(menu_type *m, int oid) { struct spell_menu_data *d = menu_priv(m); int *spells = d->spells; return d->is_valid(spells[oid]); } /** * Display a row of the spell menu */ static void spell_menu_display(menu_type *m, int oid, bool cursor, int row, int col, int wid) { struct spell_menu_data *d = menu_priv(m); int spell = d->spells[oid]; const magic_type *s_ptr = &p_ptr->class->spells.info[spell]; char help[30]; char out[80]; int attr; const char *illegible = NULL; const char *comment = NULL; if (s_ptr->slevel >= 99) { illegible = "(illegible)"; attr = TERM_L_DARK; } else if (p_ptr->spell_flags[spell] & PY_SPELL_FORGOTTEN) { comment = " forgotten"; attr = TERM_YELLOW; } else if (p_ptr->spell_flags[spell] & PY_SPELL_LEARNED) { if (p_ptr->spell_flags[spell] & PY_SPELL_WORKED) { /* Get extra info */ get_spell_info(p_ptr->class->spell_book, spell, help, sizeof(help)); comment = help; attr = TERM_WHITE; } else { comment = " untried"; attr = TERM_L_GREEN; } } else if (s_ptr->slevel <= p_ptr->lev) { comment = " unknown"; attr = TERM_L_BLUE; } else { comment = " difficult"; attr = TERM_RED; } /* Dump the spell --(-- */ strnfmt(out, sizeof(out), "%-30s%2d %4d %3d%%%s", get_spell_name(p_ptr->class->spell_book, spell), s_ptr->slevel, s_ptr->smana, spell_chance(spell), comment); c_prt(attr, illegible ? illegible : out, row, col); } /** * Handle an event on a menu row. */ static bool spell_menu_handler(menu_type *m, const ui_event *e, int oid) { struct spell_menu_data *d = menu_priv(m); if (e->type == EVT_SELECT) { d->selected_spell = d->spells[oid]; return d->browse ? TRUE : FALSE; } else if (e->type == EVT_KBRD) { if (e->key.code == '?') { d->show_description = !d->show_description; } } return FALSE; } /** * Show spell long description when browsing */ static void spell_menu_browser(int oid, void *data, const region *loc) { struct spell_menu_data *d = data; int spell = d->spells[oid]; if (d->show_description) { /* Redirect output to the screen */ text_out_hook = text_out_to_screen; text_out_wrap = 0; text_out_indent = loc->col - 1; text_out_pad = 1; Term_gotoxy(loc->col, loc->row + loc->page_rows); text_out("\n%s\n", s_info[(p_ptr->class->spell_book == TV_MAGIC_BOOK) ? spell : spell + PY_MAX_SPELLS].text); /* XXX */ text_out_pad = 0; text_out_indent = 0; } } static const menu_iter spell_menu_iter = { NULL, /* get_tag = NULL, just use lowercase selections */ spell_menu_valid, spell_menu_display, spell_menu_handler, NULL /* no resize hook */ }; /** Create and initialise a spell menu, given an object and a validity hook */ static menu_type *spell_menu_new(const object_type *o_ptr, bool (*is_valid)(int spell)) { menu_type *m = menu_new(MN_SKIN_SCROLL, &spell_menu_iter); struct spell_menu_data *d = mem_alloc(sizeof *d); region loc = { -60, 1, 60, -99 }; /* collect spells from object */ d->n_spells = spell_collect_from_book(o_ptr, d->spells); if (d->n_spells == 0 || !spell_okay_list(is_valid, d->spells, d->n_spells)) { mem_free(m); mem_free(d); return NULL; } /* copy across private data */ d->is_valid = is_valid; d->selected_spell = -1; d->browse = FALSE; d->show_description = FALSE; menu_setpriv(m, d->n_spells, d); /* set flags */ m->header = "Name Lv Mana Fail Info"; m->flags = MN_CASELESS_TAGS; m->selections = lower_case; m->browse_hook = spell_menu_browser; m->cmd_keys = "?"; /* set size */ loc.page_rows = d->n_spells + 1; menu_layout(m, &loc); return m; } /** Clean up a spell menu instance */ static void spell_menu_destroy(menu_type *m) { struct spell_menu_data *d = menu_priv(m); mem_free(d); mem_free(m); } /** * Run the spell menu to select a spell. */ static int spell_menu_select(menu_type *m, const char *noun, const char *verb) { struct spell_menu_data *d = menu_priv(m); char buf[80]; screen_save(); region_erase_bordered(&m->active); /* Format, capitalise and display */ strnfmt(buf, sizeof buf, "%s which %s? ('?' to toggle description)", verb, noun); my_strcap(buf); prt(buf, 0, 0); menu_select(m, 0, TRUE); screen_load(); return d->selected_spell; } /** * Run the spell menu, without selections. */ static void spell_menu_browse(menu_type *m, const char *noun) { struct spell_menu_data *d = menu_priv(m); screen_save(); region_erase_bordered(&m->active); prt(format("Browsing %ss. ('?' to toggle description)", noun), 0, 0); d->browse = TRUE; menu_select(m, 0, TRUE); screen_load(); } /** * Interactively select a spell. * * Returns the spell selected, or -1. */ int get_spell(const object_type *o_ptr, const char *verb, bool (*spell_test)(int spell)) { menu_type *m; const char *noun = (p_ptr->class->spell_book == TV_MAGIC_BOOK ? "spell" : "prayer"); m = spell_menu_new(o_ptr, spell_test); if (m) { int spell = spell_menu_select(m, noun, verb); spell_menu_destroy(m); return spell; } return -1; } /** * Browse a given book. */ void textui_book_browse(const object_type *o_ptr) { menu_type *m; const char *noun = (p_ptr->class->spell_book == TV_MAGIC_BOOK ? "spell" : "prayer"); m = spell_menu_new(o_ptr, spell_okay_to_browse); if (m) { spell_menu_browse(m, noun); spell_menu_destroy(m); } else { msg("You cannot browse that."); } } /** * Browse the given book. */ void textui_spell_browse(void) { int item; item_tester_hook = obj_can_browse; if (!get_item(&item, "Browse which book? ", "You have no books that you can read.", CMD_BROWSE_SPELL, (USE_INVEN | USE_FLOOR | IS_HARMLESS))) return; /* Track the object kind */ track_object(item); handle_stuff(p_ptr); textui_book_browse(object_from_item_idx(item)); } /** * Study a book to gain a new spell */ void textui_obj_study(void) { int item; item_tester_hook = obj_can_study; if (!get_item(&item, "Study which book? ", "You cannot learn any new spells from the books you have.", CMD_STUDY_BOOK, (USE_INVEN | USE_FLOOR))) return; track_object(item); handle_stuff(p_ptr); if (player_has(PF_CHOOSE_SPELLS)) { int spell = get_spell(object_from_item_idx(item), "study", spell_okay_to_study); if (spell >= 0) { cmd_insert(CMD_STUDY_SPELL); cmd_set_arg_choice(cmd_get_top(), 0, spell); } } else { cmd_insert(CMD_STUDY_BOOK); cmd_set_arg_item(cmd_get_top(), 0, item); } } /** * Cast a spell from a book. */ void textui_obj_cast(void) { int item; int spell; const char *verb = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "cast" : "recite"); item_tester_hook = obj_can_cast_from; if (!get_item(&item, "Cast from which book? ", "You have no books that you can read.", CMD_CAST, (USE_INVEN | USE_FLOOR))) return; /* Track the object kind */ track_object(item); /* Ask for a spell */ spell = get_spell(object_from_item_idx(item), verb, spell_okay_to_cast); if (spell >= 0) { cmd_insert(CMD_CAST); cmd_set_arg_choice(cmd_get_top(), 0, spell); } } /* same as above but returns the spell used. two functions to avoid some * compiler warnings initializing commands in cmd0.c */ int textui_obj_cast_ret(void) { int item; int spell; const char *verb = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "cast" : "recite"); item_tester_hook = obj_can_cast_from; if (!get_item(&item, "Cast from which book? ", "You have no books that you can read.", CMD_CAST, (USE_INVEN | USE_FLOOR))) return -1; /* Track the object kind */ track_object(item); /* Ask for a spell */ spell = get_spell(object_from_item_idx(item), verb, spell_okay_to_cast); if (spell >= 0) { cmd_insert(CMD_CAST); cmd_set_arg_choice(cmd_get_top(), 0, spell); } return spell; } angband-3.5.1/src/ui-options.c0000644000175000017500000010306612456456606015507 0ustar chriscchrisc/* * File: ui-options.c * Purpose: Text UI options handling code (everything accessible from '=') * * Copyright (c) 1997-2000 Robert A. Koeneke, James E. Wilson, Ben Harrison * Copyright (c) 2007 Pete Mack * Copyright (c) 2010 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "keymap.h" #include "squelch.h" #include "prefs.h" #include "object/tvalsval.h" #include "ui-menu.h" #include "ui-options.h" #include "files.h" /** * Prompt the user for a filename to save the pref file to. */ static bool get_pref_path(const char *what, int row, char *buf, size_t max) { char ftmp[80]; bool ok; screen_save(); /* Prompt */ prt(format("%s to a pref file", what), row, 0); prt("File: ", row + 2, 0); /* Default filename */ strnfmt(ftmp, sizeof ftmp, "%s.prf", player_safe_name(p_ptr, TRUE)); /* Get a filename */ ok = askfor_aux(ftmp, sizeof ftmp, NULL); screen_load(); /* Build the filename */ if (ok) path_build(buf, max, ANGBAND_DIR_USER, ftmp); return ok; } static void dump_pref_file(void (*dump)(ang_file *), const char *title, int row) { char buf[1024]; /* Get filename from user */ if (!get_pref_path(title, row, buf, sizeof(buf))) return; /* Try to save */ if (prefs_save(buf, dump, title)) msg("Saved %s.", strstr(title, " ") + 1); else msg("Failed to save %s.", strstr(title, " ") + 1); message_flush(); return; } static void do_cmd_pref_file_hack(long row); /*** Options display and setting ***/ /*** Boolean option menu code ***/ /** * Displays an option entry. */ static void option_toggle_display(menu_type *m, int oid, bool cursor, int row, int col, int width) { byte attr = curs_attrs[CURS_KNOWN][cursor != 0]; bool *options = menu_priv(m); c_prt(attr, format("%-45s: %s (%s)", option_desc(oid), options[oid] ? "yes" : "no ", option_name(oid)), row, col); } /** * Handle keypresses for an option entry. */ static bool option_toggle_handle(menu_type *m, const ui_event *event, int oid) { bool next = FALSE; if (event->type == EVT_SELECT) { /* Hack -- birth options can not be toggled after birth */ /* At birth, m->flags == MN_DBL_TAP. After birth, m->flags == MN_NO_TAGS */ if (!(OPT_BIRTH <= oid && oid <= OPT_BIRTH + N_OPTS_BIRTH - 1 && m->flags == MN_NO_TAGS)) { option_set(option_name(oid), !op_ptr->opt[oid]); } } else if (event->type == EVT_KBRD) { if (event->key.code == 'y' || event->key.code == 'Y') { option_set(option_name(oid), TRUE); next = TRUE; } else if (event->key.code == 'n' || event->key.code == 'N') { option_set(option_name(oid), FALSE); next = TRUE; } else if (event->key.code == 't' || event->key.code == 'T') { option_set(option_name(oid), !op_ptr->opt[oid]); } else if (event->key.code == '?') { screen_save(); show_file(format("option.txt#%s", option_name(oid)), NULL, 0, 0); screen_load(); } else { return FALSE; } } else { return FALSE; } if (next) { m->cursor++; m->cursor = (m->cursor + m->filter_count) % m->filter_count; } return TRUE; } /** Toggle option menu display and handling functions */ static const menu_iter option_toggle_iter = { NULL, NULL, option_toggle_display, option_toggle_handle, NULL }; /** * Interact with some options */ static void option_toggle_menu(const char *name, int page) { int i; menu_type *m = menu_new(MN_SKIN_SCROLL, &option_toggle_iter); /* for all menus */ m->prompt = "Set option (y/n/t), '?' for information"; m->cmd_keys = "?YyNnTt"; m->selections = "abcdefghijklmopqrsuvwxz"; m->flags = MN_DBL_TAP; /* We add 10 onto the page amount to indicate we're at birth */ if (page == OPT_PAGE_BIRTH) { m->prompt = "You can only modify these options at character birth. '?' for information"; m->cmd_keys = "?"; m->flags = MN_NO_TAGS; } else if (page == OPT_PAGE_BIRTH + 10) { page -= 10; } /* for this particular menu */ m->title = name; /* Find the number of valid entries */ for (i = 0; i < OPT_PAGE_PER; i++) { if (option_page[page][i] == OPT_NONE) break; } /* Set the data to the player's options */ menu_setpriv(m, OPT_MAX, &op_ptr->opt); menu_set_filter(m, option_page[page], i); menu_layout(m, &SCREEN_REGION); /* Run the menu */ screen_save(); clear_from(0); menu_select(m, 0, FALSE); screen_load(); mem_free(m); } /** * Edit birth options. */ void do_cmd_options_birth(void) { option_toggle_menu("Birth options", OPT_PAGE_BIRTH + 10); } /* * Modify the "window" options */ static void do_cmd_options_win(const char *name, int row) { int i, j, d; int y = 0; int x = 0; ui_event ke; u32b new_flags[ANGBAND_TERM_MAX]; /* Set new flags to the old values */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { new_flags[j] = op_ptr->window_flag[j]; } /* Clear screen */ screen_save(); clear_from(0); /* Interact */ while (1) { /* Prompt */ prt("Window flags ( to move, 't'/Enter to toggle, or ESC)", 0, 0); /* Display the windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { byte a = TERM_WHITE; const char *s = angband_term_name[j]; /* Use color */ if (j == x) a = TERM_L_BLUE; /* Window name, staggered, centered */ Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s); } /* Display the options */ for (i = 0; i < PW_MAX_FLAGS; i++) { byte a = TERM_WHITE; const char *str = window_flag_desc[i]; /* Use color */ if (i == y) a = TERM_L_BLUE; /* Unused option */ if (!str) str = "(Unused option)"; /* Flag name */ Term_putstr(0, i + 5, -1, a, str); /* Display the windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { char c = '.'; a = TERM_WHITE; /* Use color */ if ((i == y) && (j == x)) a = TERM_L_BLUE; /* Active flag */ if (new_flags[j] & (1L << i)) c = 'X'; /* Flag value */ Term_putch(35 + j * 5, i + 5, a, c); } } /* Place Cursor */ Term_gotoxy(35 + x * 5, y + 5); /* Get key */ ke = inkey_ex(); /* Mouse interaction */ if (ke.type == EVT_MOUSE) { int choicey = ke.mouse.y - 5; int choicex = (ke.mouse.x - 35)/5; if (ke.mouse.button == 2) break; if ((choicey >= 0) && (choicey < PW_MAX_FLAGS) && (choicex > 0) && (choicex < ANGBAND_TERM_MAX) && !(ke.mouse.x % 5)) { if ((choicey == y) && (choicex == x)) { /* Toggle flag (off) */ if (new_flags[x] & (1L << y)) new_flags[x] &= ~(1L << y); /* Toggle flag (on) */ else new_flags[x] |= (1L << y); } else { y = choicey; x = (ke.mouse.x - 35)/5; } } } /* Allow escape */ else if (ke.type == EVT_KBRD) { if (ke.key.code == ESCAPE || ke.key.code == 'q') break; /* Toggle */ else if (ke.key.code == '5' || ke.key.code == 't' || ke.key.code == KC_ENTER) { /* Hack -- ignore the main window */ if (x == 0) bell("Cannot set main window flags!"); /* Toggle flag (off) */ else if (new_flags[x] & (1L << y)) new_flags[x] &= ~(1L << y); /* Toggle flag (on) */ else new_flags[x] |= (1L << y); /* Continue */ continue; } /* Extract direction */ d = target_dir(ke.key); /* Move */ if (d != 0) { x = (x + ddx[d] + 8) % ANGBAND_TERM_MAX; y = (y + ddy[d] + 16) % PW_MAX_FLAGS; } } } /* Notice changes */ subwindows_set_flags(new_flags, ANGBAND_TERM_MAX); screen_load(); } /*** Interact with keymaps ***/ /* * Current (or recent) keymap action */ static struct keypress keymap_buffer[KEYMAP_ACTION_MAX]; /* * Ask for, and display, a keymap trigger. * * Returns the trigger input. * * Note that both "flush()" calls are extremely important. This may * no longer be true, since "util.c" is much simpler now. XXX XXX XXX */ static struct keypress keymap_get_trigger(void) { char tmp[80]; struct keypress buf[2] = { { 0 }, { 0 } }; /* Flush */ flush(); /* Get a key */ buf[0] = inkey(); /* Convert to ascii */ keypress_to_text(tmp, sizeof(tmp), buf, FALSE); /* Hack -- display the trigger */ Term_addstr(-1, TERM_WHITE, tmp); /* Flush */ flush(); /* Return trigger */ return buf[0]; } /* * Macro menu action functions */ static void ui_keymap_pref_load(const char *title, int row) { do_cmd_pref_file_hack(16); } static void ui_keymap_pref_append(const char *title, int row) { (void)dump_pref_file(keymap_dump, "Dump keymaps", 13); } static void ui_keymap_query(const char *title, int row) { char tmp[1024]; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; struct keypress c; const struct keypress *act; prt(title, 13, 0); prt("Key: ", 14, 0); /* Get a keymap trigger & mapping */ c = keymap_get_trigger(); act = keymap_find(mode, c); /* Nothing found */ if (!act) { /* Prompt */ prt("No keymap with that trigger. Press any key to continue.", 16, 0); inkey(); } /* Found one */ else { /* Analyze the current action */ keypress_to_text(tmp, sizeof(tmp), act, FALSE); /* Display the current action */ prt("Found: ", 15, 0); Term_addstr(-1, TERM_WHITE, tmp); prt("Press any key to continue.", 17, 0); inkey(); } } static void ui_keymap_create(const char *title, int row) { bool done = FALSE; size_t n = 0; struct keypress c; char tmp[1024]; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; prt(title, 13, 0); prt("Key: ", 14, 0); c = keymap_get_trigger(); if (c.code == '$') { c_prt(TERM_L_RED, "The '$' key is reserved.", 16, 2); prt("Press any key to continue.", 18, 0); inkey(); return; } /* Get an encoded action, with a default response */ while (!done) { struct keypress kp = {EVT_NONE, 0, 0}; int color = TERM_WHITE; if (n == 0) color = TERM_YELLOW; if (n == KEYMAP_ACTION_MAX) color = TERM_L_RED; keypress_to_text(tmp, sizeof(tmp), keymap_buffer, FALSE); c_prt(color, format("Action: %s", tmp), 15, 0); c_prt(TERM_L_BLUE, " Press '$' when finished.", 17, 0); c_prt(TERM_L_BLUE, " Use 'CTRL-U' to reset.", 18, 0); c_prt(TERM_L_BLUE, format("(Maximum keymap length is %d keys.)", KEYMAP_ACTION_MAX), 19, 0); kp = inkey(); if (kp.code == '$') { done = TRUE; continue; } switch (kp.code) { case KC_DELETE: case KC_BACKSPACE: { if (n > 0) { n -= 1; keymap_buffer[n].type = 0; keymap_buffer[n].code = 0; keymap_buffer[n].mods = 0; } break; } case KTRL('U'): { memset(keymap_buffer, 0, sizeof keymap_buffer); n = 0; break; } default: { if (n == KEYMAP_ACTION_MAX) continue; if (n == 0) { memset(keymap_buffer, 0, sizeof keymap_buffer); } keymap_buffer[n++] = kp; break; } } } if (c.code && get_check("Save this keymap? ")) { keymap_add(mode, c, keymap_buffer, TRUE); prt("Keymap added. Press any key to continue.", 17, 0); inkey(); } } static void ui_keymap_remove(const char *title, int row) { struct keypress c; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; prt(title, 13, 0); prt("Key: ", 14, 0); c = keymap_get_trigger(); if (keymap_remove(mode, c)) prt("Removed.", 16, 0); else prt("No keymap to remove!", 16, 0); /* Prompt */ prt("Press any key to continue.", 17, 0); inkey(); } static void keymap_browse_hook(int oid, void *db, const region *loc) { char tmp[1024]; message_flush(); clear_from(13); /* Show current action */ prt("Current action (if any) shown below:", 13, 0); keypress_to_text(tmp, sizeof(tmp), keymap_buffer, FALSE); prt(tmp, 14, 0); } static menu_type *keymap_menu; static menu_action keymap_actions[] = { { 0, 0, "Load a user pref file", ui_keymap_pref_load }, { 0, 0, "Save keymaps to file", ui_keymap_pref_append }, { 0, 0, "Query a keymap", ui_keymap_query }, { 0, 0, "Create a keymap", ui_keymap_create }, { 0, 0, "Remove a keymap", ui_keymap_remove }, }; static void do_cmd_keymaps(const char *title, int row) { region loc = {0, 0, 0, 12}; screen_save(); clear_from(0); if (!keymap_menu) { keymap_menu = menu_new_action(keymap_actions, N_ELEMENTS(keymap_actions)); keymap_menu->title = title; keymap_menu->selections = lower_case; keymap_menu->browse_hook = keymap_browse_hook; } menu_layout(keymap_menu, &loc); menu_select(keymap_menu, 0, FALSE); screen_load(); } /*** Interact with visuals ***/ static void visuals_pref_load(const char *title, int row) { do_cmd_pref_file_hack(15); } #ifdef ALLOW_VISUALS static void visuals_dump_monsters(const char *title, int row) { dump_pref_file(dump_monsters, title, 15); } static void visuals_dump_objects(const char *title, int row) { dump_pref_file(dump_objects, title, 15); } static void visuals_dump_features(const char *title, int row) { dump_pref_file(dump_features, title, 15); } static void visuals_dump_flavors(const char *title, int row) { dump_pref_file(dump_flavors, title, 15); } #endif /* ALLOW_VISUALS */ static void visuals_reset(const char *title, int row) { /* Reset */ reset_visuals(TRUE); /* Message */ prt("", 0, 0); msg("Visual attr/char tables reset."); message_flush(); } static menu_type *visual_menu; static menu_action visual_menu_items [] = { { 0, 0, "Load a user pref file", visuals_pref_load }, #ifdef ALLOW_VISUALS { 0, 0, "Save monster attr/chars", visuals_dump_monsters }, { 0, 0, "Save object attr/chars", visuals_dump_objects }, { 0, 0, "Save feature attr/chars", visuals_dump_features }, { 0, 0, "Save flavor attr/chars", visuals_dump_flavors }, #endif /* ALLOW_VISUALS */ { 0, 0, "Reset visuals", visuals_reset }, }; static void visuals_browse_hook(int oid, void *db, const region *loc) { message_flush(); clear_from(1); } /* * Interact with "visuals" */ static void do_cmd_visuals(const char *title, int row) { screen_save(); clear_from(0); if (!visual_menu) { visual_menu = menu_new_action(visual_menu_items, N_ELEMENTS(visual_menu_items)); visual_menu->title = title; visual_menu->selections = lower_case; visual_menu->browse_hook = visuals_browse_hook; visual_menu->header = "To edit visuals, use the knowledge menu"; } menu_layout(visual_menu, &SCREEN_REGION); menu_select(visual_menu, 0, FALSE); screen_load(); } /*** Interact with colours ***/ #ifdef ALLOW_COLORS static void colors_pref_load(const char *title, int row) { /* Ask for and load a user pref file */ do_cmd_pref_file_hack(8); /* XXX should probably be a cleaner way to tell UI about * colour changes - how about doing this in the pref file * loading code too? */ Term_xtra(TERM_XTRA_REACT, 0); Term_redraw(); } static void colors_pref_dump(const char *title, int row) { dump_pref_file(dump_colors, title, 15); } static void colors_modify(const char *title, int row) { int i; static byte a = 0; /* Prompt */ prt("Command: Modify colors", 8, 0); /* Hack -- query until done */ while (1) { const char *name; char index; struct keypress cx; /* Clear */ clear_from(10); /* Exhibit the normal colors */ for (i = 0; i < BASIC_COLORS; i++) { /* Exhibit this color */ Term_putstr(i*3, 20, -1, a, "##"); /* Exhibit character letter */ Term_putstr(i*3, 21, -1, (byte)i, format(" %c", color_table[i].index_char)); /* Exhibit all colors */ Term_putstr(i*3, 22, -1, (byte)i, format("%2d", i)); } /* Describe the color */ name = ((a < BASIC_COLORS) ? color_table[a].name : "undefined"); index = ((a < BASIC_COLORS) ? color_table[a].index_char : '?'); /* Describe the color */ Term_putstr(5, 10, -1, TERM_WHITE, format("Color = %d, Name = %s, Index = %c", a, name, index)); /* Label the Current values */ Term_putstr(5, 12, -1, TERM_WHITE, format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x", angband_color_table[a][0], angband_color_table[a][1], angband_color_table[a][2], angband_color_table[a][3])); /* Prompt */ Term_putstr(0, 14, -1, TERM_WHITE, "Command (n/N/k/K/r/R/g/G/b/B): "); /* Get a command */ cx = inkey(); /* All done */ if (cx.code == ESCAPE) break; /* Analyze */ if (cx.code == 'n') a = (byte)(a + 1); if (cx.code == 'N') a = (byte)(a - 1); if (cx.code == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1); if (cx.code == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1); if (cx.code == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1); if (cx.code == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1); if (cx.code == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1); if (cx.code == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1); if (cx.code == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1); if (cx.code == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1); /* Hack -- react to changes */ Term_xtra(TERM_XTRA_REACT, 0); /* Hack -- redraw */ Term_redraw(); } } static void colors_browse_hook(int oid, void *db, const region *loc) { message_flush(); clear_from(1); } static menu_type *color_menu; static menu_action color_events [] = { { 0, 0, "Load a user pref file", colors_pref_load }, { 0, 0, "Dump colors", colors_pref_dump }, { 0, 0, "Modify colors", colors_modify } }; /* * Interact with "colors" */ static void do_cmd_colors(const char *title, int row) { screen_save(); clear_from(0); if (!color_menu) { color_menu = menu_new_action(color_events, N_ELEMENTS(color_events)); color_menu->title = title; color_menu->selections = lower_case; color_menu->browse_hook = colors_browse_hook; } menu_layout(color_menu, &SCREEN_REGION); menu_select(color_menu, 0, FALSE); screen_load(); } #endif /*** Non-complex menu actions ***/ static bool askfor_aux_numbers(char *buf, size_t buflen, size_t *curs, size_t *len, struct keypress keypress, bool firsttime) { switch (keypress.code) { case ESCAPE: case KC_ENTER: case ARROW_LEFT: case ARROW_RIGHT: case KC_DELETE: case KC_BACKSPACE: case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return askfor_aux_keypress(buf, buflen, curs, len, keypress, firsttime); } return FALSE; } /* * Set base delay factor */ static void do_cmd_delay(const char *name, int row) { char tmp[4] = ""; int msec = op_ptr->delay_factor; strnfmt(tmp, sizeof(tmp), "%i", op_ptr->delay_factor); screen_save(); /* Prompt */ prt("Command: Base Delay Factor", 20, 0); prt(format("Current base delay factor: %d msec", op_ptr->delay_factor, msec), 22, 0); prt("New base delay factor (0-255): ", 21, 0); /* Ask for a numeric value */ if (askfor_aux(tmp, sizeof(tmp), askfor_aux_numbers)) { u16b val = (u16b) strtoul(tmp, NULL, 0); op_ptr->delay_factor = MIN(val, 255); } screen_load(); } /* * Set hitpoint warning level */ static void do_cmd_hp_warn(const char *name, int row) { bool res; char tmp[4] = ""; byte warn; strnfmt(tmp, sizeof(tmp), "%i", op_ptr->hitpoint_warn); screen_save(); /* Prompt */ prt("Command: Hitpoint Warning", 20, 0); prt(format("Current hitpoint warning: %d (%d%%)", op_ptr->hitpoint_warn, op_ptr->hitpoint_warn * 10), 22, 0); prt("New hitpoint warning (0-9): ", 21, 0); /* Ask the user for a string */ res = askfor_aux(tmp, sizeof(tmp), askfor_aux_numbers); /* Process input */ if (res) { warn = (byte) strtoul(tmp, NULL, 0); /* Reset nonsensical warnings */ if (warn > 9) warn = 0; op_ptr->hitpoint_warn = warn; } screen_load(); } /* * Set "lazy-movement" delay */ static void do_cmd_lazymove_delay(const char *name, int row) { bool res; char tmp[4] = ""; strnfmt(tmp, sizeof(tmp), "%i", lazymove_delay); screen_save(); /* Prompt */ prt("Command: Movement Delay Factor", 20, 0); prt(format("Current movement delay: %d (%d msec)", lazymove_delay, lazymove_delay * 10), 22, 0); prt("New movement delay: ", 21, 0); /* Ask the user for a string */ res = askfor_aux(tmp, sizeof(tmp), askfor_aux_numbers); /* Process input */ if (res) { lazymove_delay = (u16b) strtoul(tmp, NULL, 0); } screen_load(); } /* * Ask for a "user pref file" and process it. * * This function should only be used by standard interaction commands, * in which a standard "Command:" prompt is present on the given row. * * Allow absolute file names? XXX XXX XXX */ static void do_cmd_pref_file_hack(long row) { char ftmp[80]; screen_save(); /* Prompt */ prt("Command: Load a user pref file", row, 0); /* Prompt */ prt("File: ", row + 2, 0); /* Default filename */ strnfmt(ftmp, sizeof ftmp, "%s.prf", player_safe_name(p_ptr, TRUE)); /* Ask for a file (or cancel) */ if (askfor_aux(ftmp, sizeof ftmp, NULL)) { /* Process the given filename */ if (process_pref_file(ftmp, FALSE, TRUE) == FALSE) { /* Mention failure */ prt("", 0, 0); msg("Failed to load '%s'!", ftmp); } else { /* Mention success */ prt("", 0, 0); msg("Loaded '%s'.", ftmp); } } screen_load(); } /* * Write options to a file. */ static void do_dump_options(const char *title, int row) { (void)dump_pref_file(option_dump, "Dump window settings", 20); } static void do_dump_autoinsc(const char *title, int row) { (void)dump_pref_file(dump_autoinscriptions, "Dump autoinscriptions", 20); } /* * Load a pref file. */ static void options_load_pref_file(const char *n, int row) { do_cmd_pref_file_hack(20); } /*** Quality-squelch menu ***/ /* Structure to describe tval/description pairings. */ typedef struct { int tval; const char *desc; } tval_desc; /* Categories for sval-dependent squelch. */ static tval_desc sval_dependent[] = { { TV_STAFF, "Staffs" }, { TV_WAND, "Wands" }, { TV_ROD, "Rods" }, { TV_SCROLL, "Scrolls" }, { TV_POTION, "Potions" }, { TV_RING, "Rings" }, { TV_AMULET, "Amulets" }, { TV_FOOD, "Food" }, { TV_MAGIC_BOOK, "Magic books" }, { TV_PRAYER_BOOK, "Prayer books" }, { TV_LIGHT, "Lights" }, { TV_FLASK, "Flasks of oil" }, /* { TV_DRAG_ARMOR, "Dragon Mail Armor" }, */ { TV_GOLD, "Money" }, }; /* * Determines whether a tval is eligible for sval-squelch. */ bool squelch_tval(int tval) { size_t i; /* Only squelch if the tval's allowed */ for (i = 0; i < N_ELEMENTS(sval_dependent); i++) { if (tval == sval_dependent[i].tval) return TRUE; } return FALSE; } /* * menu struct for differentiating aware from unaware squelch */ typedef struct { object_kind *kind; bool aware; } squelch_choice; /* * Ordering function for squelch choices. * Aware comes before unaware, and then sort alphabetically. */ static int cmp_squelch(const void *a, const void *b) { char bufa[80]; char bufb[80]; const squelch_choice *x = a; const squelch_choice *y = b; if (!x->aware && y->aware) return 1; if (x->aware && !y->aware) return -1; object_kind_name(bufa, sizeof(bufa), x->kind, x->aware); object_kind_name(bufb, sizeof(bufb), y->kind, y->aware); return strcmp(bufa, bufb); } /* * Display an entry in the menu. */ static void quality_display(menu_type *menu, int oid, bool cursor, int row, int col, int width) { /* Note: the order of the values in quality_choices do not align with the squelch_type_t enum order. */ const char *name = quality_choices[oid].name; byte level = squelch_level[oid]; const char *level_name = quality_values[level].name; byte attr = (cursor ? TERM_L_BLUE : TERM_WHITE); c_put_str(attr, format("%-20s : %s", name, level_name), row, col); } /* * Display the quality squelch subtypes. */ static void quality_subdisplay(menu_type *menu, int oid, bool cursor, int row, int col, int width) { const char *name = quality_values[oid].name; byte attr = (cursor ? TERM_L_BLUE : TERM_WHITE); c_put_str(attr, name, row, col); } /* * Handle keypresses. */ static bool quality_action(menu_type *m, const ui_event *event, int oid) { menu_type menu; menu_iter menu_f = { NULL, NULL, quality_subdisplay, NULL, NULL }; region area = { 27, 2, 29, SQUELCH_MAX }; ui_event evt; int count; /* Display at the right point */ area.row += oid; /* Save */ screen_save(); /* Work out how many options we have */ count = SQUELCH_MAX; if ((oid == TYPE_RING) || (oid == TYPE_AMULET)) count = area.page_rows = SQUELCH_BAD + 1; /* Run menu */ menu_init(&menu, MN_SKIN_SCROLL, &menu_f); menu_setpriv(&menu, count, quality_values); /* Stop menus from going off the bottom of the screen */ if (area.row + menu.count > Term->hgt - 1) area.row += Term->hgt - 1 - area.row - menu.count; menu_layout(&menu, &area); window_make(area.col - 2, area.row - 1, area.col + area.width + 2, area.row + area.page_rows); evt = menu_select(&menu, 0, TRUE); /* Set the new value appropriately */ if (evt.type == EVT_SELECT) squelch_level[oid] = menu.cursor; /* Load and finish */ screen_load(); return TRUE; } /* * Display quality squelch menu. */ static void quality_menu(void *unused, const char *also_unused) { menu_type menu; menu_iter menu_f = { NULL, NULL, quality_display, quality_action, NULL }; region area = { 0, 0, 0, 0 }; /* Save screen */ screen_save(); clear_from(0); /* Set up the menu */ menu_init(&menu, MN_SKIN_SCROLL, &menu_f); menu.title = "Quality squelch menu"; menu_setpriv(&menu, TYPE_MAX, quality_values); menu_layout(&menu, &area); /* Select an entry */ menu_select(&menu, 0, FALSE); /* Load screen */ screen_load(); return; } /*** Sval-dependent menu ***/ /* * Display an entry on the sval menu */ static void squelch_sval_menu_display(menu_type *menu, int oid, bool cursor, int row, int col, int width) { char buf[80]; const squelch_choice *choice = menu_priv(menu); object_kind *kind = choice[oid].kind; bool aware = choice[oid].aware; byte attr = curs_attrs[(int)aware][0 != cursor]; /* Acquire the "name" of object "i" */ object_kind_name(buf, sizeof(buf), kind, aware); /* Print it */ c_put_str(attr, format("[ ] %s", buf), row, col); if ((aware && (kind->squelch & SQUELCH_IF_AWARE)) || (!aware && (kind->squelch & SQUELCH_IF_UNAWARE))) c_put_str(TERM_L_RED, "*", row, col + 1); } /* * Deal with events on the sval menu */ static bool squelch_sval_menu_action(menu_type *m, const ui_event *event, int oid) { const squelch_choice *choice = menu_priv(m); if (event->type == EVT_SELECT || (event->type == EVT_KBRD && tolower(event->key.code) == 't')) { object_kind *kind = choice[oid].kind; /* Toggle the appropriate flag */ if (choice[oid].aware) kind->squelch ^= SQUELCH_IF_AWARE; else kind->squelch ^= SQUELCH_IF_UNAWARE; p_ptr->notice |= PN_SQUELCH; return TRUE; } return FALSE; } static const menu_iter squelch_sval_menu = { NULL, NULL, squelch_sval_menu_display, squelch_sval_menu_action, NULL, }; /** * Collect all tvals in the big squelch_choice array */ static int squelch_collect_kind(int tval, squelch_choice **ch) { squelch_choice *choice; int num = 0; int i; /* Create the array, with entries both for aware and unaware squelch */ choice = mem_alloc(2 * z_info->k_max * sizeof *choice); for (i = 1; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; /* Skip empty objects, unseen objects, and incorrect tvals */ if (!k_ptr->name || k_ptr->tval != tval) continue; if (!k_ptr->aware) { /* can unaware squelch anything */ choice[num].kind = k_ptr; choice[num++].aware = FALSE; } if ((k_ptr->everseen && !of_has(k_ptr->flags, OF_INSTA_ART)) || k_ptr->tval == TV_GOLD) { /* Do not display the artifact base kinds in this list */ /* aware squelch requires everseen */ /* do not require awareness for aware squelch, so people can set at game start */ choice[num].kind = k_ptr; choice[num++].aware = TRUE; } } if (num == 0) mem_free(choice); else *ch = choice; return num; } /* * Display list of svals to be squelched. */ static bool sval_menu(int tval, const char *desc) { menu_type *menu; region area = { 1, 2, -1, -1 }; squelch_choice *choices; int n_choices = squelch_collect_kind(tval, &choices); if (!n_choices) return FALSE; /* sort by name in squelch menus except for categories of items that are aware from the start */ switch (tval) { case TV_LIGHT: case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: case TV_DRAG_ARMOR: case TV_GOLD: /* leave sorted by sval */ break; default: /* sort by name */ sort(choices, n_choices, sizeof(*choices), cmp_squelch); } /* Save the screen and clear it */ screen_save(); clear_from(0); /* Help text */ prt(format("Squelch the following %s:", desc), 0, 0); /* Run menu */ menu = menu_new(MN_SKIN_COLUMNS, &squelch_sval_menu); menu_setpriv(menu, n_choices, choices); menu->cmd_keys = "Tt"; menu_layout(menu, &area); menu_set_cursor_x_offset(menu, 1); /* Place cursor in brackets. */ menu_select(menu, 0, FALSE); /* Free memory */ FREE(choices); /* Load screen */ screen_load(); return TRUE; } /* Returns TRUE if there's anything to display a menu of */ static bool seen_tval(int tval) { int i; for (i = 1; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; /* Skip empty objects, unseen objects, and incorrect tvals */ if (!k_ptr->name) continue; if (!k_ptr->everseen) continue; if (k_ptr->tval != tval) continue; return TRUE; } return FALSE; } /* Extra options on the "item options" menu */ static struct { char tag; const char *name; void (*action)(); /* this is a nasty hack */ } extra_item_options[] = { { 'Q', "Quality squelching options", quality_menu }, { '{', "Autoinscription setup", textui_browse_object_knowledge }, }; static char tag_options_item(menu_type *menu, int oid) { size_t line = (size_t) oid; if (line < N_ELEMENTS(sval_dependent)) return I2A(oid); /* Separator - blank line. */ if (line == N_ELEMENTS(sval_dependent)) return 0; line = line - N_ELEMENTS(sval_dependent) - 1; if (line < N_ELEMENTS(extra_item_options)) return extra_item_options[line].tag; return 0; } static int valid_options_item(menu_type *menu, int oid) { size_t line = (size_t) oid; if (line < N_ELEMENTS(sval_dependent)) return 1; /* Separator - blank line. */ if (line == N_ELEMENTS(sval_dependent)) return 0; line = line - N_ELEMENTS(sval_dependent) - 1; if (line < N_ELEMENTS(extra_item_options)) return 1; return 0; } static void display_options_item(menu_type *menu, int oid, bool cursor, int row, int col, int width) { size_t line = (size_t) oid; /* First section of menu - the svals */ if (line < N_ELEMENTS(sval_dependent)) { bool known = seen_tval(sval_dependent[line].tval); byte attr = curs_attrs[known ? CURS_KNOWN: CURS_UNKNOWN][(int)cursor]; c_prt(attr, sval_dependent[line].desc, row, col); } /* Second section - the "extra options" */ else { byte attr = curs_attrs[CURS_KNOWN][(int)cursor]; line = line - N_ELEMENTS(sval_dependent) - 1; if (line < N_ELEMENTS(extra_item_options)) c_prt(attr, extra_item_options[line].name, row, col); } } static bool handle_options_item(menu_type *menu, const ui_event *event, int oid) { if (event->type == EVT_SELECT) { if ((size_t) oid < N_ELEMENTS(sval_dependent)) { sval_menu(sval_dependent[oid].tval, sval_dependent[oid].desc); } else { oid = oid - (int)N_ELEMENTS(sval_dependent) - 1; assert((size_t) oid < N_ELEMENTS(extra_item_options)); extra_item_options[oid].action(); } return TRUE; } return FALSE; } static const menu_iter options_item_iter = { tag_options_item, valid_options_item, display_options_item, handle_options_item, NULL }; /* * Display and handle the main squelching menu. */ void do_cmd_options_item(const char *title, int row) { menu_type menu; menu_init(&menu, MN_SKIN_SCROLL, &options_item_iter); menu_setpriv(&menu, N_ELEMENTS(sval_dependent) + N_ELEMENTS(extra_item_options) + 1, NULL); menu.title = title; menu_layout(&menu, &SCREEN_REGION); screen_save(); clear_from(0); menu_select(&menu, 0, FALSE); screen_load(); p_ptr->notice |= PN_SQUELCH; return; } /*** Main menu definitions and display ***/ static menu_type *option_menu; static menu_action option_actions[] = { { 0, 'a', "User interface options", option_toggle_menu }, { 0, 'b', "Birth (difficulty) options", option_toggle_menu }, { 0, 'c', "Cheat options", option_toggle_menu }, { 0, 'w', "Subwindow setup", do_cmd_options_win }, { 0, 'i', "Item ignoring setup", do_cmd_options_item }, { 0, '{', "Auto-inscription setup", textui_browse_object_knowledge }, { 0 }, { 0, 'd', "Set base delay factor", do_cmd_delay }, { 0, 'h', "Set hitpoint warning", do_cmd_hp_warn }, { 0, 'm', "Set movement delay", do_cmd_lazymove_delay }, { 0 }, { 0, 's', "Save subwindow setup to pref file", do_dump_options }, { 0, 't', "Save autoinscriptions to pref file", do_dump_autoinsc }, { 0 }, { 0, 'l', "Load a user pref file", options_load_pref_file }, { 0, 'k', "Edit keymaps (advanced)", do_cmd_keymaps }, #ifdef ALLOW_COLORS { 0, 'c', "Edit colours (advanced)", do_cmd_colors }, #endif /* ALLOW_COLORS */ { 0, 'v', "Save visuals (advanced)", do_cmd_visuals }, }; /* * Display the options main menu. */ void do_cmd_options(void) { if (!option_menu) { /* Main option menu */ option_menu = menu_new_action(option_actions, N_ELEMENTS(option_actions)); option_menu->title = "Options Menu"; option_menu->flags = MN_CASELESS_TAGS; } screen_save(); clear_from(0); menu_layout(option_menu, &SCREEN_REGION); menu_select(option_menu, 0, FALSE); screen_load(); } void cleanup_options(void) { if (keymap_menu) menu_free(keymap_menu); if (visual_menu) menu_free(visual_menu); if (color_menu) menu_free(color_menu); if (option_menu) menu_free(option_menu); } angband-3.5.1/src/z-form.c0000644000175000017500000004225212456456607014613 0ustar chriscchrisc/* * File: z-form.c * Purpose: Low-level text formatting (snprintf() replacement) * * Copyright (c) 1997 Ben Harrison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" /* * Here is some information about the routines in this file. * * In general, the following routines take a "buffer", a "max length", * a "format string", and some "arguments", and use the format string * and the arguments to create a (terminated) string in the buffer * (using only the first "max length" bytes), and return the "length" * of the resulting string, not including the (mandatory) terminator. * * The format strings allow the basic "sprintf()" format sequences, though * some of them are processed slightly more carefully or portably, as well * as a few "special" sequences, including the "capilitization" sequences of * "%C" and "%S". * * Note that some "limitations" are enforced by the current implementation, * for example, no "format sequence" can exceed 100 characters, including any * "length" restrictions, and the result of combining and "format sequence" * with the relevent "arguments" must not exceed 1000 characters. * * These limitations could be fixed by stealing some of the code from, * say, "vsprintf()" and placing it into my "vstrnfmt()" function. * * Legal format characters: %,b,n,p,c,s,d,i,o,u,X,x,E,e,F,f,G,g,r,v. * * Format("%%") * Append the literal "%". * No legal modifiers. * * Format("%n", size_t *np) * Save the current length into (*np). * No legal modifiers. * * Format("%p", void *v) * Append the pointer "v" (implementation varies). * No legal modifiers. * * Format("%E", double r) * Format("%F", double r) * Format("%G", double r) * Format("%e", double r) * Format("%f", double r) * Format("%g", double r) * Append the double "r", in various formats. * * Format("%ld", long int i) * Append the long integer "i". * * Format("%d", int i) * Append the integer "i". * * Format("%lu", unsigned long int i) * Append the unsigned long integer "i". * * Format("%u", unsigned int i) * Append the unsigned integer "i". * * Format("%lo", unsigned long int i) * Append the unsigned long integer "i", in octal. * * Format("%o", unsigned int i) * Append the unsigned integer "i", in octal. * * Format("%lX", unsigned long int i) * Note -- use all capital letters * Format("%lx", unsigned long int i) * Append the unsigned long integer "i", in hexidecimal. * * Format("%X", unsigned int i) * Note -- use all capital letters * Format("%x", unsigned int i) * Append the unsigned integer "i", in hexidecimal. * * Format("%c", char c) * Append the character "c". * Do not use the "+" or "0" flags. * * Format("%s", const char *s) * Append the string "s". * Do not use the "+" or "0" flags. * Note that a "NULL" value of "s" is converted to the empty string. * * Format("%y", type_union *y). Use any of the above patterns; * z is interpreted as one of c, d, f, or s in the patterns above, * as appropriate for the type of the corresponding argument. * (There is currently no way to render a typeunion in octal or hex.) * * For examples below, assume "int n = 0; int m = 100; char buf[100];", * plus "char *s = NULL;", and unknown values "char *txt; int i;". * * For example: "n = strnfmt(buf, -1, "(Max %d)", i);" will have a * similar effect as "sprintf(buf, "(Max %d)", i); n = strlen(buf);". * * For example: "(void)strnfmt(buf, 16, "%s", txt);" will have a similar * effect as "strncpy(buf, txt, 16); buf[15] = '\0';". * * For example: "if (strnfmt(buf, 16, "%s", txt) < 16) ..." will have * a similar effect as "strcpy(buf, txt)" but with bounds checking. * * For example: "s = buf; s += vstrnfmt(s, -1, ...); ..." will allow * multiple "appends" to "buf" (at the cost of losing the max-length info). * * For example: "s = buf; n = vstrnfmt(s+n, 100-n, ...); ..." will allow * multiple bounded "appends" to "buf", with constant access to "strlen(buf)". * * For example: "format("%-.*s", i, txt)" will produce a string containing * the first "i" characters of "txt", left justified. */ /* * Basic "vararg" format function. * * This function takes a buffer, a max byte count, a format string, and * a va_list of arguments to the format string, and uses the format string * and the arguments to create a string to the buffer. The string is * derived from the format string and the arguments in the manner of the * "sprintf()" function, but with some extra "format" commands. Note that * this function will never use more than the given number of bytes in the * buffer, preventing messy invalid memory references. This function then * returns the total number of non-null bytes written into the buffer. * * Method: Let "str" be the (unlimited) created string, and let "len" be the * smaller of "max-1" and "strlen(str)". We copy the first "len" chars of * "str" into "buf", place "\0" into buf[len], and return "len". * * In English, we do a sprintf() into "buf", a buffer with size "max", * and we return the resulting value of "strlen(buf)", but we allow some * special format commands, and we are more careful than "sprintf()". * * Typically, "max" is in fact the "size" of "buf", and thus represents * the "number" of chars in "buf" which are ALLOWED to be used. An * alternative definition would have required "buf" to hold at least * "max+1" characters, and would have used that extra character only * in the case where "buf" was too short for the result. This would * give an easy test for "overflow", but a less "obvious" semantics. * * Note that if the buffer was "too short" to hold the result, we will * always return "max-1", but we also return "max-1" if the buffer was * "just long enough". We could have returned "max" if the buffer was * too short, not written a null, and forced the programmer to deal with * this special case, but I felt that it is better to at least give a * "usable" result when the buffer was too long instead of either giving * a memory overwrite like "sprintf()" or a non-terminted string like * "strncpy()". Note that "strncpy()" also "null-pads" the result. * * Note that in most cases "just long enough" is probably "too short". * * We should also consider extracting and processing the "width" and other * "flags" by hand, it might be more "accurate", and it would allow us to * remove the limit (1000 chars) on the result of format sequences. * * Also, some sequences, such as "%+d" by hand, do not work on all machines, * and could thus be correctly handled here. * * Error detection in this routine is not very graceful, in particular, * if an error is detected in the format string, we simply "pre-terminate" * the given buffer to a length of zero, and return a "length" of zero. * The contents of "buf", except for "buf[0]", may then be undefined. */ size_t vstrnfmt(char *buf, size_t max, const char *fmt, va_list vp) { const char *s; int i = 0, len = 0; /* The argument is "long" */ bool do_long; /* Bytes used in buffer */ size_t n; /* Bytes used in format sequence */ size_t q; /* Format sequence */ char aux[128]; /* Resulting string */ char tmp[1024]; assert(max); assert(fmt); /* Begin the buffer */ n = 0; /* Begin the format string */ s = fmt; /* Scan the format string */ while (TRUE) { type_union tval = END; /* All done */ if (!*s) break; /* Normal character */ if (*s != '%') { /* Check total length */ if (n == max-1) break; /* Save the character */ buf[n++] = *s++; /* Continue */ continue; } /* Skip the "percent" */ s++; /* Pre-process "%%" */ if (*s == '%') { /* Check total length */ if (n == max-1) break; /* Save the percent */ buf[n++] = '%'; /* Skip the "%" */ s++; /* Continue */ continue; } /* Pre-process "%n" */ if (*s == 'n') { size_t *arg; /* Get the next argument */ arg = va_arg(vp, size_t *); /* Save the current length */ (*arg) = n; /* Skip the "n" */ s++; /* Continue */ continue; } /* Begin the "aux" string */ q = 0; /* Save the "percent" */ aux[q++] = '%'; do_long = FALSE; /* Build the "aux" string */ while (TRUE) { /* Error -- format sequence is not terminated */ if (!*s) { /* Terminate the buffer */ buf[0] = '\0'; /* Return "error" */ return (0); } /* Error -- format sequence may be too long */ if (q > 100) { /* Terminate the buffer */ buf[0] = '\0'; /* Return "error" */ return (0); } /* Handle "alphabetic" chars */ if (isalpha((unsigned char)*s)) { /* Hack -- handle "long" request */ if (*s == 'l') { /* Save the character */ aux[q++] = *s++; /* Note the "long" flag */ do_long = TRUE; } /* Handle normal end of format sequence */ else { /* Save the character */ aux[q++] = *s++; /* Stop processing the format sequence */ break; } } /* Handle "non-alphabetic" chars */ else { /* Hack -- Handle 'star' (for "variable length" argument) */ if (*s == '*') { int arg; /* Get the next argument */ arg = va_arg(vp, int); /* Hack -- append the "length" */ sprintf(aux + q, "%d", arg); /* Hack -- accept the "length" */ while (aux[q]) q++; /* Skip the "*" */ s++; } /* Collect "normal" characters (digits, "-", "+", ".", etc) */ else { /* Save the character */ aux[q++] = *s++; } } } /* Terminate "aux" */ aux[q] = '\0'; /* Clear "tmp" */ tmp[0] = '\0'; /* Parse a type_union */ if (aux[q-1] == 'y') { tval = va_arg(vp, type_union); if (do_long) { /* Error -- illegal type_union argument */ buf[0] = '\0'; /* Return "error" */ return (0); } /* Replace aux terminator with proper printf char */ if (tval.t == T_CHAR) aux[q-1] = 'c'; else if (tval.t == T_INT) aux[q-1] = 'd'; else if (tval.t == T_FLOAT) aux[q-1] = 'f'; else if (tval.t == T_STRING) aux[q-1] = 's'; else { buf[0] = '\0'; return (0); } } /* Process the "format" symbol */ switch (aux[q-1]) { /* Simple Character -- standard format */ case 'c': { int arg; /* Get the next argument */ arg = tval.t == T_END ? va_arg(vp, int) : tval.u.c; /* Format the argument */ sprintf(tmp, aux, arg); /* Done */ break; } /* Signed Integers -- standard format */ case 'd': case 'i': { if (do_long) { long arg; /* Get the next argument */ arg = va_arg(vp, long); /* Format the argument */ sprintf(tmp, aux, arg); } else { int arg; /* Get the next argument */ arg = tval.t == T_END ? va_arg(vp, int) : tval.u.i; /* Format the argument */ sprintf(tmp, aux, arg); } /* Done */ break; } /* Unsigned Integers -- various formats */ case 'u': case 'o': case 'x': case 'X': { if (do_long) { unsigned long arg; /* Get the next argument */ arg = va_arg(vp, unsigned long); /* Format the argument */ sprintf(tmp, aux, arg); } else { unsigned int arg; /* Get the next argument */ arg = va_arg(vp, unsigned int); /* Format the argument */ sprintf(tmp, aux, arg); } /* Done */ break; } /* Floating Point -- various formats */ case 'f': case 'e': case 'E': case 'g': case 'G': { double arg; /* Get the next argument */ arg = tval.t == T_END ? va_arg(vp, double) : tval.u.f; /* Format the argument */ sprintf(tmp, aux, arg); /* Done */ break; } /* Pointer -- implementation varies */ case 'p': { void *arg; /* Get the next argument */ arg = va_arg(vp, void*); /* Format the argument */ sprintf(tmp, aux, arg); /* Done */ break; } /* String */ case 's': { if (do_long) { const wchar_t *arg; char arg2[1024]; /* XXX There is a big bug here: if one * passes "%.0s" to strnfmt, then really we * should not dereference the arg at all. * But it does. See bug #666. */ /* Get the next argument */ arg = va_arg(vp, const wchar_t *); /* Hack -- convert NULL to EMPTY */ if (!arg) arg = L""; /* Format the argument */ /* snprintf should not be used in a snprintf replacement function snprintf(tmp, sizeof(tmp), aux, arg); */ /* Prevent buffer overflows and convert string to char */ /* this really should use a wcstombs type function */ len = wcslen(arg); if (len >= 768) { len = 767; } for (i = 0; i < len; ++i) { arg2[i] = (char)arg[i]; } arg2[len] = '\0'; /* Remove the l from aux, since we no longer have wchar_t as input */ aux[q-2] = 's'; aux[q-1] = '\0'; /* Format the argument */ sprintf(tmp, aux, arg2); /*if (my_strcpy((char*)arg2, (char*)arg, sizeof(arg2)) < 1024) { sprintf(tmp, aux, arg2); }*/ /* Done */ break; } else { const char *arg; char arg2[1024]; /* XXX There is a big bug here: if one * passes "%.0s" to strnfmt, then really we * should not dereference the arg at all. * But it does. See bug #666. */ /* Get the next argument */ arg = tval.t == T_END ? va_arg(vp, const char *) : tval.u.s; /* Hack -- convert NULL to EMPTY */ if (!arg) arg = ""; /* Format the argument */ /* snprintf should not be used in a snprintf replacement function snprintf(tmp, sizeof(tmp), aux, arg); */ /* Prevent buffer overflows */ (void)my_strcpy(arg2, arg, sizeof(arg2)); /* Format the argument */ sprintf(tmp, aux, arg2); /* Done */ break; } } /* Oops */ default: { /* Error -- illegal format char */ buf[0] = '\0'; /* Return "error" */ return (0); } } /* Now append "tmp" to "buf" */ for (q = 0; tmp[q]; q++) { /* Check total length */ if (n == max-1) break; /* Save the character */ buf[n++] = tmp[q]; } } /* Terminate buffer */ buf[n] = '\0'; /* Return length */ return (n); } /* * Add a formatted string to the end of a string */ void strnfcat(char *str, size_t max, size_t *end, const char *fmt, ...) { size_t len; va_list vp; /* Paranoia */ if (*end >= max) return; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Build the string */ len = vstrnfmt(&str[*end], max - *end, fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Change the end value */ *end += len; } static char *format_buf = NULL; static size_t format_len = 0; /* * Do a vstrnfmt (see above) into a (growable) static buffer. * This buffer is usable for very short term formatting of results. */ char *vformat(const char *fmt, va_list vp) { /* Initial allocation */ if (!format_buf) { format_len = 1024; format_buf = mem_zalloc(format_len); format_buf[0] = 0; } /* Null format yields last result */ if (!fmt) return (format_buf); /* Keep going until successful */ while (1) { va_list args; size_t len; /* Build the string */ VA_COPY(args, vp); len = vstrnfmt(format_buf, format_len, fmt, args); va_end(args); /* Success */ if (len < format_len-1) break; /* Grow the buffer */ format_len = format_len * 2; format_buf = mem_realloc(format_buf, format_len); } /* Return the new buffer */ return (format_buf); } void vformat_kill(void) { FREE(format_buf); } /* * Do a vstrnfmt (see above) into a buffer of a given size. */ size_t strnfmt(char *buf, size_t max, const char *fmt, ...) { size_t len; va_list vp; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Do the va_arg fmt to the buffer */ len = vstrnfmt(buf, max, fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Return the number of bytes written */ return (len); } /* * Do a vstrnfmt() into (see above) into a (growable) static buffer. * This buffer is usable for very short term formatting of results. * Note that the buffer is (technically) writable, but only up to * the length of the string contained inside it. */ char *format(const char *fmt, ...) { char *res; va_list vp; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Format the args */ res = vformat(fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Return the result */ return (res); } /* * Vararg interface to plog() */ void plog_fmt(const char *fmt, ...) { char *res; va_list vp; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Format the args */ res = vformat(fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Call plog */ plog(res); } /* * Vararg interface to quit() */ void quit_fmt(const char *fmt, ...) { char *res; va_list vp; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Format */ res = vformat(fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Call quit() */ quit(res); } angband-3.5.1/src/wiz-stats.c0000644000175000017500000023432212456456607015347 0ustar chriscchrisc/* * File: stats.c * Purpose: Statistics collection on dungeon generation * * Copyright (c) 2008 Andi Sidwell * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. */ #include "math.h" #include "angband.h" #include "cave.h" #include "cmds.h" #include "wizard.h" #include "monster/mon-make.h" #include "monster/monster.h" #include "monster/constants.h" #include "object/tvalsval.h" #include "effects.h" #include "generate.h" /* * The stats programs here will provide information on the dungeon, the monsters * in it, and the items that they drop. Statistics are gotten from a given level * by generating a new level, collecting all the items (noting if they were generated * in a vault). Then all non-unique monsters are killed and their stats are tracked. * The items from these monster drops are then collected and analyzed. Lastly, all * unique monsters are killed, and their drops are analyzed. In this way, it is possible * to separate unique drops and normal monster drops. * * There are two options for simulating the entirety of the dungeon. There is a "diving" * option that begins each level with all artifacts and uniques available. and * there is a "level-clearing" option that simulates all 100 levels of the dungeon, removing * artifacts and uniques as they are discovered/killed. "diving" option only catalogues * every 5 levels. * * At the end of the "level-clearing" log file, extra post-processing is done to find the * mean and standard deviation for the level you are likely to first gain an item with * a key resistance or item. * * In addition to these sims there is a shorter sim that tests for dungeon connectivity. */ #ifdef USE_STATS /*** Statsgen ***/ /* Logfile to store results in */ static ang_file *stats_log = NULL; /* this is the size of arrays used to calculate mean and std_dev. * these values will be calculated over the first TRIES_SIZE attempts * or less if TRIES_SIZE is less than tries */ #define TRIES_SIZE 100 #define MAX_LVL 101 /* default for number of tries */ int tries=50; /* the simulation number that we are on */ int iter; /* amount to add each time an item comes up */ static double addval; /* flag for whether we are in clearing mode */ bool clearing = FALSE; /* flag for regenning randart */ bool regen = FALSE; /*** These are items to track for each iteration ***/ /* total number of artifacts found */ static int art_it[TRIES_SIZE]; /* first level we find items with various abilities */ static int fa_it[TRIES_SIZE], si_it[TRIES_SIZE], po_it[TRIES_SIZE], nx_it[TRIES_SIZE]; static int cf_it[TRIES_SIZE], bl_it[TRIES_SIZE], te_it[TRIES_SIZE]; static int mb1_it[TRIES_SIZE], mb2_it[TRIES_SIZE], mb3_it[TRIES_SIZE]; static int mb4_it[TRIES_SIZE], mb5_it[TRIES_SIZE], mb6_it[TRIES_SIZE]; static int mb7_it[TRIES_SIZE], mb8_it[TRIES_SIZE], mb9_it[TRIES_SIZE]; /*** these are variables for all the things we want to collect ***/ /* gold */ static double gold_total[MAX_LVL], gold_floor[MAX_LVL], gold_mon[MAX_LVL], gold_wall[MAX_LVL]; /**** General equipment flags ****/ /* has FA */ static double faeq_total[MAX_LVL], faeq_mon[MAX_LVL], faeq_vault[MAX_LVL]; /* has SI */ static double sieq_total[MAX_LVL], sieq_mon[MAX_LVL], sieq_vault[MAX_LVL]; /* has relem */ static double reeq_total[MAX_LVL], reeq_mon[MAX_LVL], reeq_vault[MAX_LVL]; /* has rbase */ static double rbeq_total[MAX_LVL], rbeq_mon[MAX_LVL], rbeq_vault[MAX_LVL]; /* has rpois */ static double poeq_total[MAX_LVL], poeq_mon[MAX_LVL], poeq_vault[MAX_LVL]; /* has rnexus */ static double nxeq_total[MAX_LVL], nxeq_mon[MAX_LVL], nxeq_vault[MAX_LVL]; /* has rblind */ static double bleq_total[MAX_LVL], bleq_mon[MAX_LVL], bleq_vault[MAX_LVL]; /* has conf */ static double cfeq_total[MAX_LVL], cfeq_mon[MAX_LVL], cfeq_vault[MAX_LVL]; /* has speed */ static double speq_total[MAX_LVL], speq_mon[MAX_LVL], speq_vault[MAX_LVL]; /* has telep */ static double teeq_total[MAX_LVL], teeq_mon[MAX_LVL], teeq_vault[MAX_LVL]; /**** WEAPONS ****/ static double weap_total[MAX_LVL], weap_mon[MAX_LVL], weap_vault[MAX_LVL]; /* bad average good */ static double bdweap_total[MAX_LVL], bdweap_mon[MAX_LVL], bdweap_vault[MAX_LVL]; static double avweap_total[MAX_LVL], avweap_mon[MAX_LVL], avweap_vault[MAX_LVL]; static double gdweap_total[MAX_LVL], gdweap_mon[MAX_LVL], gdweap_vault[MAX_LVL]; /* has slay (not evil) */ static double slweap_total[MAX_LVL], slweap_mon[MAX_LVL], slweap_vault[MAX_LVL]; /* has slay evil */ static double evweap_total[MAX_LVL], evweap_mon[MAX_LVL], evweap_vault[MAX_LVL]; /* has a *slay* (not evil) */ static double klweap_total[MAX_LVL], klweap_mon[MAX_LVL], klweap_vault[MAX_LVL]; /* has brand */ static double brweap_total[MAX_LVL], brweap_mon[MAX_LVL], brweap_vault[MAX_LVL]; /* is westernesse */ static double weweap_total[MAX_LVL], weweap_mon[MAX_LVL], weweap_vault[MAX_LVL]; /* is defender */ static double deweap_total[MAX_LVL], deweap_mon[MAX_LVL], deweap_vault[MAX_LVL]; /* is gondolin */ static double goweap_total[MAX_LVL], goweap_mon[MAX_LVL], goweap_vault[MAX_LVL]; /* is holy avenger */ static double haweap_total[MAX_LVL], haweap_mon[MAX_LVL], haweap_vault[MAX_LVL]; /* has extra blows */ static double xbweap_total[MAX_LVL], xbweap_mon[MAX_LVL], xbweap_vault[MAX_LVL]; /* has telep */ static double teweap_total[MAX_LVL], teweap_mon[MAX_LVL], teweap_vault[MAX_LVL]; /* is top weapon BOC, SOS, MOD */ static double huweap_total[MAX_LVL], huweap_mon[MAX_LVL], huweap_vault[MAX_LVL]; /* is uber */ static double ubweap_total[MAX_LVL], ubweap_mon[MAX_LVL], ubweap_vault[MAX_LVL]; /* is morgul */ static double moweap_total[MAX_LVL], moweap_mon[MAX_LVL], moweap_vault[MAX_LVL]; /**** LAUNCHERS ****/ static double bow_total[MAX_LVL], bow_mon[MAX_LVL], bow_vault[MAX_LVL]; /* bad average good */ static double bdbow_total[MAX_LVL], bdbow_mon[MAX_LVL], bdbow_vault[MAX_LVL]; static double avbow_total[MAX_LVL], avbow_mon[MAX_LVL], avbow_vault[MAX_LVL]; static double gdbow_total[MAX_LVL], gdbow_mon[MAX_LVL], gdbow_vault[MAX_LVL]; /* power > 15 */ static double vgbow_total[MAX_LVL], vgbow_mon[MAX_LVL], vgbow_vault[MAX_LVL]; /* xtra might (longbow, crossbows) */ static double xmbow_total[MAX_LVL], xmbow_mon[MAX_LVL], xmbow_vault[MAX_LVL]; /* xtra shots (longbow crossbows) */ static double xsbow_total[MAX_LVL], xsbow_mon[MAX_LVL], xsbow_vault[MAX_LVL]; /* buckland */ static double bubow_total[MAX_LVL], bubow_mon[MAX_LVL], bubow_vault[MAX_LVL]; /* telep */ static double tebow_total[MAX_LVL], tebow_mon[MAX_LVL], tebow_vault[MAX_LVL]; /* cursed */ static double cubow_total[MAX_LVL], cubow_mon[MAX_LVL], cubow_vault[MAX_LVL]; /**** ARMOR *****/ static double arm_total[MAX_LVL], arm_mon[MAX_LVL], arm_vault[MAX_LVL]; /* bad average good */ static double bdarm_total[MAX_LVL], bdarm_mon[MAX_LVL], bdarm_vault[MAX_LVL]; static double avarm_total[MAX_LVL], avarm_mon[MAX_LVL], avarm_vault[MAX_LVL]; static double gdarm_total[MAX_LVL], gdarm_mon[MAX_LVL], gdarm_vault[MAX_LVL]; /* has str */ static double strarm_total[MAX_LVL], strarm_mon[MAX_LVL], strarm_vault[MAX_LVL]; /* has int */ static double intarm_total[MAX_LVL], intarm_mon[MAX_LVL], intarm_vault[MAX_LVL]; /* has wis */ static double wisarm_total[MAX_LVL], wisarm_mon[MAX_LVL], wisarm_vault[MAX_LVL]; /* has dex */ static double dexarm_total[MAX_LVL], dexarm_mon[MAX_LVL], dexarm_vault[MAX_LVL]; /* has con */ static double conarm_total[MAX_LVL], conarm_mon[MAX_LVL], conarm_vault[MAX_LVL]; /* has curse */ static double cuarm_total[MAX_LVL], cuarm_mon[MAX_LVL], cuarm_vault[MAX_LVL]; /* basic artifact info */ static double art_total[MAX_LVL], art_spec[MAX_LVL], art_norm[MAX_LVL]; /* artifact level info */ static double art_shal[MAX_LVL], art_ave[MAX_LVL], art_ood[MAX_LVL]; /* where normal artifacts come from */ static double art_mon[MAX_LVL], art_uniq[MAX_LVL], art_floor[MAX_LVL], art_vault[MAX_LVL], art_mon_vault[MAX_LVL]; /* consumables info */ /*POTIONS*/ static double pot_total[MAX_LVL], pot_mon[MAX_LVL], pot_vault[MAX_LVL]; /* stat gain */ static double gain_total[MAX_LVL], gain_mon[MAX_LVL], gain_vault[MAX_LVL]; /* healing */ static double bigheal_total[MAX_LVL], bigheal_mon[MAX_LVL], bigheal_vault[MAX_LVL]; /* restore mana */ static double rmana_total[MAX_LVL], rmana_mon[MAX_LVL], rmana_vault[MAX_LVL]; /*SCROLLS*/ /* scroll total */ static double scroll_total[MAX_LVL], scroll_mon[MAX_LVL], scroll_vault[MAX_LVL]; /* endgame scrolls, dest, ban, mass_ban, rune */ static double escroll_total[MAX_LVL], escroll_mon[MAX_LVL], escroll_vault[MAX_LVL]; /* acquirement scrolls */ static double acq_total[MAX_LVL], acq_mon[MAX_LVL], acq_vault[MAX_LVL]; /*RODS*/ /* rod total */ static double rod_total[MAX_LVL], rod_mon[MAX_LVL], rod_vault[MAX_LVL]; /*utility, dtrap, dstairs, dobj, light, illum*/ static double urod_total[MAX_LVL], urod_mon[MAX_LVL], urod_vault[MAX_LVL]; /*tele other*/ static double torod_total[MAX_LVL], torod_mon[MAX_LVL], torod_vault[MAX_LVL]; /*detect all */ static double drod_total[MAX_LVL], drod_mon[MAX_LVL], drod_vault[MAX_LVL]; /*endgame: speed, healing*/ static double erod_total[MAX_LVL], erod_mon[MAX_LVL], erod_vault[MAX_LVL]; /*STAVES*/ /*total*/ static double staff_total[MAX_LVL], staff_mon[MAX_LVL], staff_vault[MAX_LVL]; /* speed */ static double sstaff_total[MAX_LVL], sstaff_mon[MAX_LVL], sstaff_vault[MAX_LVL]; /* destruction */ static double dstaff_total[MAX_LVL], dstaff_mon[MAX_LVL], dstaff_vault[MAX_LVL]; /*dispelling, dispel evil, holiness, power */ static double kstaff_total[MAX_LVL], kstaff_mon[MAX_LVL], kstaff_vault[MAX_LVL]; /*powerful: healing, magi, banishment*/ static double pstaff_total[MAX_LVL], pstaff_mon[MAX_LVL], pstaff_vault[MAX_LVL]; /* WANDS */ /* total */ static double wand_total[MAX_LVL], wand_mon[MAX_LVL], wand_vault[MAX_LVL]; /* tele-other */ static double towand_total[MAX_LVL], towand_mon[MAX_LVL], towand_vault[MAX_LVL]; /* RINGS */ static double ring_total[MAX_LVL], ring_mon[MAX_LVL], ring_vault[MAX_LVL]; /* curse ring */ static double curing_total[MAX_LVL], curing_mon[MAX_LVL], curing_vault[MAX_LVL]; /* speed ring */ static double spring_total[MAX_LVL], spring_mon[MAX_LVL], spring_vault[MAX_LVL]; /* stat rings */ static double string_total[MAX_LVL], string_mon[MAX_LVL], string_vault[MAX_LVL]; /* r pois */ static double poring_total[MAX_LVL], poring_mon[MAX_LVL], poring_vault[MAX_LVL]; /* free action */ static double faring_total[MAX_LVL], faring_mon[MAX_LVL], faring_vault[MAX_LVL]; /* see inv */ static double siring_total[MAX_LVL], siring_mon[MAX_LVL], siring_vault[MAX_LVL]; /* branding rings */ static double brring_total[MAX_LVL], brring_mon[MAX_LVL], brring_vault[MAX_LVL]; /* elven rings */ static double elring_total[MAX_LVL], elring_mon[MAX_LVL], elring_vault[MAX_LVL]; /* the one ring */ static double onering_total[MAX_LVL], onering_mon[MAX_LVL], onering_vault[MAX_LVL]; /* amulets */ static double amu_total[MAX_LVL], amu_mon[MAX_LVL], amu_vault[MAX_LVL]; /* wisdom */ static double wisamu_total[MAX_LVL], wisamu_mon[MAX_LVL], wisamu_vault[MAX_LVL]; /* trickery, weaponmastery, or magi */ static double endamu_total[MAX_LVL], endamu_mon[MAX_LVL], endamu_vault[MAX_LVL]; /* telepathy */ static double teamu_total[MAX_LVL], teamu_mon[MAX_LVL], teamu_vault[MAX_LVL]; /* cursed */ static double cuamu_total[MAX_LVL], cuamu_mon[MAX_LVL], cuamu_vault[MAX_LVL]; /* AMMO */ static double ammo_total[MAX_LVL], ammo_mon[MAX_LVL], ammo_vault[MAX_LVL]; /* bad average good */ static double bdammo_total[MAX_LVL], bdammo_mon[MAX_LVL], bdammo_vault[MAX_LVL]; static double avammo_total[MAX_LVL], avammo_mon[MAX_LVL], avammo_vault[MAX_LVL]; static double gdammo_total[MAX_LVL], gdammo_mon[MAX_LVL], gdammo_vault[MAX_LVL]; /* ego ammo */ static double egammo_total[MAX_LVL], egammo_mon[MAX_LVL], egammo_vault[MAX_LVL]; /* very good ammo, seeker/mithril */ static double vgammo_total[MAX_LVL], vgammo_mon[MAX_LVL], vgammo_vault[MAX_LVL]; /* awesome ammo, seeker/mithril + brand */ static double awammo_total[MAX_LVL], awammo_mon[MAX_LVL], awammo_vault[MAX_LVL]; /* endgame ammo, seeker/mithril + slay evil */ static double evammo_total[MAX_LVL], evammo_mon[MAX_LVL], evammo_vault[MAX_LVL]; /* holy might ammo, seeker/mithril + slay evil */ static double hmammo_total[MAX_LVL], hmammo_mon[MAX_LVL], hmammo_vault[MAX_LVL]; /*** Prayer/spell BOOKS ***/ static double b1_total[MAX_LVL],b1_mon[MAX_LVL],b1_vault[MAX_LVL]; static double b2_total[MAX_LVL],b2_mon[MAX_LVL],b2_vault[MAX_LVL]; static double b3_total[MAX_LVL],b3_mon[MAX_LVL],b3_vault[MAX_LVL]; static double b4_total[MAX_LVL],b4_mon[MAX_LVL],b4_vault[MAX_LVL]; static double b5_total[MAX_LVL],b5_mon[MAX_LVL],b5_vault[MAX_LVL]; static double b6_total[MAX_LVL],b6_mon[MAX_LVL],b6_vault[MAX_LVL]; static double b7_total[MAX_LVL],b7_mon[MAX_LVL],b7_vault[MAX_LVL]; static double b8_total[MAX_LVL],b8_mon[MAX_LVL],b8_vault[MAX_LVL]; static double b9_total[MAX_LVL],b9_mon[MAX_LVL],b9_vault[MAX_LVL]; /* monster info */ static double mon_total[MAX_LVL], mon_ood[MAX_LVL], mon_deadly[MAX_LVL]; /* unique info */ static double uniq_total[MAX_LVL], uniq_ood[MAX_LVL], uniq_deadly[MAX_LVL]; static void init_iter_vals(int k) { art_it[k]=0; fa_it[k]=0, si_it[k]=0, po_it[k]=0, nx_it[k]=0; cf_it[k]=0, bl_it[k]=0, te_it[k]=0; mb1_it[k]=0, mb2_it[k]=0, mb3_it[k]=0; mb4_it[k]=0, mb5_it[k]=0, mb6_it[k]=0; mb7_it[k]=0, mb8_it[k]=0, mb9_it[k]=0; } /* set everything to 0.0 to begin */ static void init_stat_vals(int lvl) { gold_total[lvl] = 0.0; gold_floor[lvl] = 0.0; gold_mon[lvl] = 0.0; gold_wall[lvl] = 0.0; faeq_total[lvl] = 0.0; faeq_mon[lvl] = 0.0; faeq_vault[lvl] = 0.0; reeq_total[lvl] = 0.0; reeq_mon[lvl] = 0.0; reeq_vault[lvl] = 0.0; rbeq_total[lvl] = 0.0; rbeq_mon[lvl] = 0.0; rbeq_vault[lvl] = 0.0; poeq_total[lvl] = 0.0; poeq_mon[lvl] = 0.0; poeq_vault[lvl] = 0.0; nxeq_total[lvl] = 0.0; nxeq_mon[lvl] = 0.0; nxeq_vault[lvl] = 0.0; speq_total[lvl] = 0.0; speq_mon[lvl] = 0.0; speq_vault[lvl] = 0.0; teeq_total[lvl] = 0.0; teeq_mon[lvl] = 0.0; teeq_vault[lvl] = 0.0; bleq_total[lvl] = 0.0; bleq_mon[lvl] = 0.0; bleq_vault[lvl] = 0.0; cfeq_total[lvl] = 0.0; cfeq_mon[lvl] = 0.0; cfeq_vault[lvl] = 0.0; weap_total[lvl] = 0.0; weap_mon[lvl] = 0.0; weap_vault[lvl] = 0.0; bdweap_total[lvl] = 0.0; bdweap_mon[lvl] = 0.0; bdweap_vault[lvl] = 0.0; avweap_total[lvl] = 0.0; avweap_mon[lvl] = 0.0; avweap_vault[lvl] = 0.0; gdweap_total[lvl] = 0.0; gdweap_mon[lvl] = 0.0; gdweap_vault[lvl] = 0.0; slweap_total[lvl] = 0.0; slweap_mon[lvl] = 0.0; slweap_vault[lvl] = 0.0; evweap_total[lvl] = 0.0; evweap_mon[lvl] = 0.0; evweap_vault[lvl] = 0.0; klweap_total[lvl] = 0.0; klweap_mon[lvl] = 0.0; klweap_vault[lvl] = 0.0; brweap_total[lvl] = 0.0; brweap_mon[lvl] = 0.0; brweap_vault[lvl] = 0.0; weweap_total[lvl] = 0.0; weweap_mon[lvl] = 0.0; weweap_vault[lvl] = 0.0; deweap_total[lvl] = 0.0; deweap_mon[lvl] = 0.0; deweap_vault[lvl] = 0.0; goweap_total[lvl] = 0.0; goweap_mon[lvl] = 0.0; goweap_vault[lvl] = 0.0; haweap_total[lvl] = 0.0; haweap_mon[lvl] = 0.0; haweap_vault[lvl] = 0.0; xbweap_total[lvl] = 0.0; xbweap_mon[lvl] = 0.0; xbweap_vault[lvl] = 0.0; teweap_total[lvl] = 0.0; teweap_mon[lvl] = 0.0; teweap_vault[lvl] = 0.0; huweap_total[lvl] = 0.0; huweap_mon[lvl] = 0.0; huweap_vault[lvl] = 0.0; ubweap_total[lvl] = 0.0; ubweap_mon[lvl] = 0.0; ubweap_vault[lvl] = 0.0; moweap_total[lvl] = 0.0; moweap_mon[lvl] = 0.0; moweap_vault[lvl] = 0.0; /*bows*/ bow_total[lvl] = 0.0; bow_mon[lvl] = 0.0; bow_vault[lvl] = 0.0; bdbow_total[lvl] = 0.0; bdbow_mon[lvl] = 0.0; bdbow_vault[lvl] = 0.0; avbow_total[lvl] = 0.0; avbow_mon[lvl] = 0.0; avbow_vault[lvl] = 0.0; gdbow_total[lvl] = 0.0; gdbow_mon[lvl] = 0.0; gdbow_vault[lvl] = 0.0; vgbow_total[lvl] = 0.0; vgbow_mon[lvl] = 0.0; vgbow_vault[lvl] = 0.0; xmbow_total[lvl] = 0.0; xmbow_mon[lvl] = 0.0; xmbow_vault[lvl] = 0.0; xsbow_total[lvl] = 0.0; xsbow_mon[lvl] = 0.0; xsbow_vault[lvl] = 0.0; bubow_total[lvl] = 0.0; bubow_mon[lvl] = 0.0; bubow_vault[lvl] = 0.0; tebow_total[lvl] = 0.0; tebow_mon[lvl] = 0.0; tebow_vault[lvl] = 0.0; cubow_total[lvl] = 0.0; cubow_mon[lvl] = 0.0; cubow_vault[lvl] = 0.0; /* ammo */ ammo_total[lvl] = 0.0; ammo_mon[lvl] = 0.0; ammo_vault[lvl] = 0.0; bdammo_total[lvl] = 0.0; bdammo_mon[lvl] = 0.0; bdammo_vault[lvl] = 0.0; avammo_total[lvl] = 0.0; avammo_mon[lvl] = 0.0; avammo_vault[lvl] = 0.0; gdammo_total[lvl] = 0.0; gdammo_mon[lvl] = 0.0; gdammo_vault[lvl] = 0.0; egammo_total[lvl] = 0.0; egammo_mon[lvl] = 0.0; egammo_vault[lvl] = 0.0; vgammo_total[lvl] = 0.0; vgammo_mon[lvl] = 0.0; vgammo_vault[lvl] = 0.0; awammo_total[lvl] = 0.0; awammo_mon[lvl] = 0.0; awammo_vault[lvl] = 0.0; evammo_total[lvl] = 0.0; evammo_mon[lvl] = 0.0; evammo_vault[lvl] = 0.0; hmammo_total[lvl] = 0.0; hmammo_mon[lvl] = 0.0; hmammo_vault[lvl] = 0.0; /* armor */ arm_total[lvl] = 0.0; arm_mon[lvl] = 0.0; arm_vault[lvl] = 0.0; bdarm_total[lvl] = 0.0; bdarm_mon[lvl] = 0.0; bdarm_vault[lvl] = 0.0; avarm_total[lvl] = 0.0; avarm_mon[lvl] = 0.0; avarm_vault[lvl] = 0.0; gdarm_total[lvl] = 0.0; gdarm_mon[lvl] = 0.0; gdarm_vault[lvl] = 0.0; strarm_total[lvl] = 0.0; strarm_mon[lvl] = 0.0; strarm_vault[lvl] = 0.0; intarm_total[lvl] = 0.0; intarm_mon[lvl] = 0.0; intarm_vault[lvl] = 0.0; wisarm_total[lvl] = 0.0; wisarm_mon[lvl] = 0.0; wisarm_vault[lvl] = 0.0; dexarm_total[lvl] = 0.0; dexarm_mon[lvl] = 0.0; dexarm_vault[lvl] = 0.0; conarm_total[lvl] = 0.0; conarm_mon[lvl] = 0.0; conarm_vault[lvl] = 0.0; cuarm_total[lvl] = 0.0; cuarm_mon[lvl] = 0.0; cuarm_vault[lvl] = 0.0; art_total[lvl] = 0.0; art_spec[lvl] = 0.0; art_norm[lvl] = 0.0; art_shal[lvl] = 0.0; art_ave [lvl] = 0.0; art_ood [lvl] = 0.0; art_mon[lvl] = 0.0; art_uniq[lvl] = 0.0; art_floor[lvl] = 0.0; art_vault[lvl] = 0.0; art_mon_vault[lvl] = 0.0; /* potion */ pot_total[lvl] =0.0; pot_mon[lvl] =0.0; pot_vault[lvl] =0.0; gain_total[lvl] =0.0; gain_mon[lvl] =0.0; gain_vault[lvl] =0.0; rmana_total[lvl] =0.0; rmana_mon[lvl] =0.0; rmana_vault[lvl] =0.0; bigheal_total[lvl] =0.0; bigheal_mon[lvl] =0.0; bigheal_vault[lvl] =0.0; /*scrolls*/ scroll_total[lvl] = 0.0; scroll_mon[lvl] = 0.0; scroll_vault[lvl] = 0.0; escroll_total[lvl] = 0.0; escroll_mon[lvl] = 0.0; escroll_vault[lvl] = 0.0; acq_total[lvl] = 0.0; acq_mon[lvl] = 0.0; acq_vault[lvl] = 0.0; /* rods */ rod_total[lvl] = 0.0; rod_mon[lvl] = 0.0; rod_vault[lvl] = 0.0; urod_total[lvl] = 0.0; urod_mon[lvl] = 0.0; urod_vault[lvl] = 0.0; torod_total[lvl] = 0.0; torod_mon[lvl] = 0.0; torod_vault[lvl] = 0.0; drod_total[lvl] = 0.0; drod_mon[lvl] = 0.0; drod_vault[lvl] = 0.0; erod_total[lvl] = 0.0; erod_mon[lvl] = 0.0; erod_vault[lvl] = 0.0; /* staves */ staff_total[lvl] = 0.0; staff_mon[lvl] = 0.0; staff_vault[lvl] = 0.0; sstaff_total[lvl] = 0.0; sstaff_mon[lvl] = 0.0; sstaff_vault[lvl] = 0.0; dstaff_total[lvl] = 0.0; dstaff_mon[lvl] = 0.0; dstaff_vault[lvl] = 0.0; kstaff_total[lvl] = 0.0; kstaff_mon[lvl] = 0.0; kstaff_vault[lvl] = 0.0; pstaff_total[lvl] = 0.0; pstaff_mon[lvl] = 0.0; pstaff_vault[lvl] = 0.0; /* wands */ wand_total[lvl] = 0.0; wand_mon[lvl] = 0.0; wand_vault[lvl] = 0.0; towand_total[lvl] = 0.0; towand_mon[lvl] = 0.0; towand_vault[lvl] = 0.0; /* rings */ ring_total[lvl] = 0.0; ring_mon[lvl] = 0.0; ring_vault[lvl] = 0.0; curing_total[lvl] = 0.0; curing_mon[lvl] = 0.0; curing_vault[lvl] = 0.0; spring_total[lvl] = 0.0; spring_mon[lvl] = 0.0; spring_vault[lvl] = 0.0; string_total[lvl] = 0.0; string_mon[lvl] = 0.0; string_vault[lvl] = 0.0; faring_total[lvl] = 0.0; faring_mon[lvl] = 0.0; faring_vault[lvl] = 0.0; siring_total[lvl] = 0.0; siring_mon[lvl] = 0.0; siring_vault[lvl] = 0.0; poring_total[lvl] = 0.0; poring_mon[lvl] = 0.0; poring_vault[lvl] = 0.0; brring_total[lvl] = 0.0; brring_mon[lvl] = 0.0; brring_vault[lvl] = 0.0; elring_total[lvl] = 0.0; elring_mon[lvl] = 0.0; elring_vault[lvl] = 0.0; onering_total[lvl] = 0.0; onering_mon[lvl] = 0.0; onering_vault[lvl] = 0.0; /* amulets */ amu_total[lvl] = 0.0; amu_mon[lvl] = 0.0; amu_vault[lvl] = 0.0; wisamu_total[lvl] = 0.0; wisamu_mon[lvl] = 0.0; wisamu_vault[lvl] = 0.0; endamu_total[lvl] = 0.0; endamu_mon[lvl] = 0.0; endamu_vault[lvl] = 0.0; teamu_total[lvl] = 0.0; teamu_mon[lvl] = 0.0; teamu_vault[lvl] = 0.0; cuamu_total[lvl] = 0.0; cuamu_mon[lvl] = 0.0; cuamu_vault[lvl] = 0.0; mon_total[lvl] = 0.0; mon_ood[lvl] = 0.0; mon_deadly[lvl] = 0.0; uniq_total[lvl] = 0.0; uniq_ood[lvl] = 0.0; uniq_deadly[lvl] = 0.0; /* books */ b1_total[lvl] =0.0; b1_mon[lvl] =0.0; b1_vault[lvl] =0.0; b2_total[lvl] =0.0; b2_mon[lvl] =0.0; b2_vault[lvl] =0.0; b3_total[lvl] =0.0; b3_mon[lvl] =0.0; b3_vault[lvl] =0.0; b4_total[lvl] =0.0; b4_mon[lvl] =0.0; b4_vault[lvl] =0.0; b5_total[lvl] =0.0; b5_mon[lvl] =0.0; b5_vault[lvl] =0.0; b6_total[lvl] =0.0; b6_mon[lvl] =0.0; b6_vault[lvl] =0.0; b7_total[lvl] =0.0; b7_mon[lvl] =0.0; b7_vault[lvl] =0.0; b8_total[lvl] =0.0; b8_mon[lvl] =0.0; b8_vault[lvl] =0.0; b9_total[lvl] =0.0; b9_mon[lvl] =0.0; b9_vault[lvl] =0.0; } /* * Record the first level we find something */ static bool first_find(int fl[TRIES_SIZE]) { /* make sure we're not on an iteration above our array limit */ if (iter >= TRIES_SIZE) return FALSE; /* make sure we haven't found it earlier on this iteration */ if (fl[iter] > 0) return FALSE; /* assign the depth to this value */ fl[iter] = p_ptr->depth; /* success */ return TRUE; } /* * Add values to each category of statistics based */ static void add_stats(double total[MAX_LVL], double mondrop[MAX_LVL], double invault[MAX_LVL], bool vault, bool mon, int number) { int lvl; /* get player level */ lvl=p_ptr->depth; /* be careful about bounds */ if ((lvl > 100) || (lvl < 0)) return; /* increase values */ //total += lvl; mondrop +=lvl; invault+=lvl; /* add to the total */ total[lvl] += addval*number; /* add to the total from vaults */ if ((!mon) && (vault)) invault[lvl] += addval * number; /* add to the total from monsters */ if (mon) mondrop[lvl] += addval * number; } /* * This will get data on an object * It gets a lot of stuff, pretty much everything that I * thought was reasonable to get. However, you might have * a much different opinion. Luckily, I tried to make it * trivial to add new items to log. */ static void get_obj_data(const object_type *o_ptr, int y, int x, bool mon, bool uniq) { bool vault = cave_isvault(cave, y, x); bitflag f[OF_SIZE]; int effect; int number = o_ptr->number; static int lvl; artifact_type *a_ptr; double gold_temp=0; assert(o_ptr->kind); /* get player depth */ lvl=p_ptr->depth; /* extract flags */ object_flags(o_ptr,f); /* check for some stuff that we will use regardless of type */ /* originally this was armor, but I decided to generalize it */ /* has free action (hack: don't include Inertia)*/ if (of_has(f,OF_FREE_ACT) && !((o_ptr->tval == TV_AMULET) && (o_ptr->sval==SV_AMULET_INERTIA))){ /* add the stats */ add_stats( faeq_total, faeq_mon, faeq_vault,vault,mon,number); /* record first level */ first_find(fa_it); } /* has see invis */ if (of_has(f,OF_SEE_INVIS)){ add_stats( sieq_total, sieq_mon, sieq_vault,vault,mon,number); first_find(si_it); } /* has at least one basic resist */ if ((of_has(f,OF_RES_ACID)) || (of_has(f,OF_RES_ELEC)) || (of_has(f,OF_RES_COLD)) || (of_has(f,OF_RES_FIRE))){ add_stats( reeq_total, reeq_mon, reeq_vault,vault,mon,number); } /* has rbase */ if ((of_has(f,OF_RES_ACID)) && (of_has(f,OF_RES_ELEC)) && (of_has(f,OF_RES_COLD)) && (of_has(f,OF_RES_FIRE))) add_stats( rbeq_total, rbeq_mon, rbeq_vault,vault,mon,number); /* has resist poison */ if (of_has(f,OF_RES_POIS)){ add_stats( poeq_total, poeq_mon, poeq_vault,vault,mon,number); first_find(po_it); } /* has resist nexus */ if (of_has(f,OF_RES_NEXUS)){ add_stats( nxeq_total, nxeq_mon, nxeq_vault,vault,mon,number); first_find(nx_it); } /* has resist blind */ if (of_has(f,OF_RES_BLIND)){ add_stats( bleq_total, bleq_mon, bleq_vault,vault,mon,number); first_find(bl_it); } /* has resist conf */ if (of_has(f,OF_RES_CONFU)){ add_stats( cfeq_total, cfeq_mon, cfeq_vault,vault,mon,number); first_find(cf_it); } /* has speed */ if (of_has(f,OF_SPEED)) add_stats( speq_total, speq_mon, speq_vault,vault,mon,number); /* has telepathy */ if (of_has(f,OF_TELEPATHY)){ add_stats( teeq_total, teeq_mon, teeq_vault,vault,mon,number); first_find(te_it); } switch(o_ptr->tval){ /* armor */ case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR:{ /* do not include artifacts */ if (o_ptr->artifact) break; /* add to armor total */ add_stats( arm_total, arm_mon, arm_vault,vault,mon,number); /* check if bad, good, or average */ if (o_ptr->to_a < 0) add_stats( bdarm_total, bdarm_mon, bdarm_vault, vault, mon,number); if (o_ptr->to_h == 0) add_stats( avarm_total, avarm_mon, avarm_vault, vault, mon,number); if (o_ptr->to_h > 0) add_stats( gdarm_total, gdarm_mon, gdarm_vault, vault, mon,number); /* has str boost */ if (of_has(f,OF_STR)) add_stats( strarm_total, strarm_mon, strarm_vault,vault,mon,number); /* has dex boost */ if (of_has(f,OF_DEX)) add_stats( dexarm_total, dexarm_mon, dexarm_vault,vault,mon,number); /* has int boost */ if (of_has(f,OF_INT)) add_stats( intarm_total, intarm_mon, intarm_vault,vault,mon,number); if (of_has(f,OF_WIS)) add_stats( wisarm_total, wisarm_mon, wisarm_vault,vault,mon,number); if (of_has(f,OF_CON)) add_stats( conarm_total, conarm_mon, conarm_vault,vault,mon,number); if (of_has(f,OF_LIGHT_CURSE)) add_stats( cuarm_total, cuarm_mon, cuarm_vault,vault,mon,number); break; } /* weapons */ case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD:{ /* do not include artifacts */ if (o_ptr->artifact) break; /* add to weapon total */ add_stats( weap_total, weap_mon, weap_vault, vault, mon,number); /* extract flags */ object_flags(o_ptr,f); /* check if bad, good, or average */ if ((o_ptr->to_h < 0) && (o_ptr->to_d < 0)) add_stats( bdweap_total, bdweap_mon, bdweap_vault, vault, mon,number); if ((o_ptr->to_h == 0) && (o_ptr->to_d == 0)) add_stats( avweap_total, avweap_mon, avweap_vault, vault, mon,number); if ((o_ptr->to_h > 0) && (o_ptr->to_d > 0)) add_stats( gdweap_total, gdweap_mon, gdweap_vault, vault, mon,number); /* slay weapons */ if ((of_has(f,OF_SLAY_DRAGON)) || (of_has(f,OF_SLAY_DEMON)) || (of_has(f,OF_SLAY_TROLL)) || (of_has(f,OF_SLAY_GIANT)) || (of_has(f,OF_SLAY_UNDEAD)) || (of_has(f,OF_SLAY_ANIMAL)) || (of_has(f,OF_SLAY_ORC))) add_stats( slweap_total, slweap_mon, slweap_vault, vault, mon,number); /* slay evil */ if (of_has(f,OF_SLAY_EVIL)) add_stats( evweap_total, evweap_mon, evweap_vault, vault, mon,number); /* kill flag */ if ((of_has(f,OF_KILL_DRAGON)) || (of_has(f,OF_KILL_DEMON)) || (of_has(f,OF_KILL_UNDEAD))) add_stats( klweap_total, klweap_mon, klweap_vault, vault, mon,number); /* branded weapons */ if ((of_has(f,OF_BRAND_ACID)) || (of_has(f,OF_BRAND_ELEC)) || (of_has(f,OF_BRAND_FIRE)) || (of_has(f,OF_BRAND_COLD)) || (of_has(f,OF_BRAND_POIS))) add_stats( brweap_total, brweap_mon, brweap_vault, vault, mon,number); /* determine westernesse by flags */ if ((of_has(f,OF_STR)) && (of_has(f,OF_DEX)) && (of_has(f,OF_CON)) && (of_has(f,OF_FREE_ACT)) && (of_has(f,OF_SEE_INVIS)) && (of_has(f,OF_SLAY_TROLL)) && (of_has(f,OF_SLAY_GIANT)) && (of_has(f,OF_SLAY_ORC))) add_stats( weweap_total, weweap_mon, weweap_vault, vault, mon,number); /* determine defender by flags */ if ((of_has(f,OF_RES_ACID)) && (of_has(f,OF_RES_ELEC)) && (of_has(f,OF_RES_FIRE)) && (of_has(f,OF_RES_COLD)) && (of_has(f,OF_FREE_ACT)) && (of_has(f,OF_SEE_INVIS)) && (of_has(f,OF_FEATHER)) && (of_has(f,OF_STEALTH)) && (of_has(f,OF_REGEN))) add_stats( deweap_total, deweap_mon, deweap_vault, vault, mon,number); /* determine gondolin by flags */ if ((of_has(f,OF_SLAY_DEMON)) && (of_has(f,OF_SLAY_ORC)) && (of_has(f,OF_SLAY_TROLL)) && (of_has(f,OF_SLAY_DRAGON)) && (of_has(f,OF_FREE_ACT)) && (of_has(f,OF_SEE_INVIS)) && (of_has(f,OF_LIGHT)) && (of_has(f,OF_RES_DARK))) add_stats( goweap_total, goweap_mon, goweap_vault, vault, mon,number); /* determine holy avenger by flags */ if ((of_has(f,OF_SLAY_EVIL)) && (of_has(f,OF_SLAY_UNDEAD)) && (of_has(f,OF_SLAY_DEMON)) && (of_has(f,OF_SEE_INVIS)) && (of_has(f,OF_BLESSED)) && (of_has(f,OF_RES_FEAR))) add_stats( haweap_total, haweap_mon, haweap_vault, vault, mon,number); /* extra blows */ if (of_has(f,OF_BLOWS)) add_stats( xbweap_total, xbweap_mon, xbweap_vault, vault, mon,number); /* telepathy */ if (of_has(f,OF_TELEPATHY)) add_stats( teweap_total, teweap_mon, teweap_vault, vault, mon,number); /* is a top of the line weapon */ if (((o_ptr->tval == TV_HAFTED) && (o_ptr->sval == SV_MACE_OF_DISRUPTION)) || ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_SCYTHE_OF_SLICING)) || ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_BLADE_OF_CHAOS))) { add_stats( huweap_total, huweap_mon, huweap_vault, vault, mon,number); /* is uber */ if ((of_has(f,OF_SLAY_EVIL)) || (of_has(f,OF_BLOWS))) add_stats( ubweap_total, ubweap_mon, ubweap_vault, vault, mon,number); } /* is morgul */ if (of_has(f,OF_HEAVY_CURSE)) add_stats( moweap_total, moweap_mon, moweap_vault, vault, mon,number); break; } /* launchers */ case TV_BOW:{ /* do not include artifacts */ if (o_ptr->artifact) break; /* add to launcher total */ add_stats( bow_total, bow_mon, bow_vault, vault, mon,number); /* extract flags */ object_flags(o_ptr,f); /* check if bad, average, good, or very good */ if ((o_ptr->to_h < 0) && (o_ptr->to_d < 0)) add_stats( bdbow_total, bdbow_mon, bdbow_vault, vault, mon,number); if ((o_ptr->to_h == 0) && (o_ptr->to_d == 0)) add_stats( avbow_total, avbow_mon, avbow_vault, vault, mon,number); if ((o_ptr->to_h > 0) && (o_ptr->to_d > 0)) add_stats( gdbow_total, gdbow_mon, gdbow_vault, vault, mon,number); if ((o_ptr->to_h > 15) || (o_ptr->to_d > 15)) add_stats( vgbow_total, vgbow_mon, vgbow_vault, vault, mon,number); /* check long bows and xbows for xtra might and/or shots */ if ((o_ptr->sval == SV_LONG_BOW) || (o_ptr->sval == SV_LIGHT_XBOW) || (o_ptr->sval == SV_HEAVY_XBOW)) { if (of_has(f,OF_SHOTS)) add_stats( xsbow_total, xsbow_mon, xsbow_vault, vault, mon,number); if (of_has(f,OF_MIGHT)) add_stats( xmbow_total, xmbow_mon, xmbow_vault, vault, mon,number); } /* check for buckland */ if ((o_ptr->sval == SV_SLING) && (of_has(f,OF_MIGHT)) && (of_has(f,OF_SHOTS))) add_stats( bubow_total, bubow_mon, bubow_vault, vault, mon,number); /* has telep */ if (of_has(f,OF_TELEPATHY)) add_stats( tebow_total, tebow_mon, tebow_vault, vault, mon,number); /* is cursed */ if (of_has(f,OF_LIGHT_CURSE)) add_stats( cubow_total, cubow_mon, cubow_vault, vault, mon,number); break; } /* potion */ case TV_POTION:{ /* add total amounts */ add_stats( pot_total, pot_mon, pot_vault,vault,mon,number); /* get effects */ effect=object_effect(o_ptr); /*stat gain*/ switch(effect){ case EF_GAIN_STR: case EF_GAIN_INT: case EF_GAIN_WIS: case EF_GAIN_DEX: case EF_GAIN_CON:{ add_stats( gain_total, gain_mon, gain_vault,vault,mon,number); break; } /* Aug */ case EF_GAIN_ALL:{ int k; /*Augmentation counts as 5 stat gain pots */ for (k=1;k<=5;k++) add_stats( gain_total, gain_mon, gain_vault,vault,mon,number); break; } case EF_ENLIGHTENMENT2:{ /* *Enlight* counts as 2 stat pots */ int k; for (k=1;k<=2;k++) add_stats( gain_total, gain_mon, gain_vault,vault,mon,number); break; } case EF_RESTORE_MANA:{ add_stats( rmana_total, rmana_mon, rmana_vault,vault,mon,number); break; } case EF_CURE_NONORLYBIG: case EF_CURE_FULL2:{ add_stats( bigheal_total, bigheal_mon, bigheal_vault,vault,mon,number); break; } } break; } /* scrolls */ case TV_SCROLL:{ /* add total amounts */ add_stats( scroll_total, scroll_mon, scroll_vault,vault,mon,number); /* get effects */ effect=object_effect(o_ptr); /* scroll effects */ switch(effect){ case EF_BANISHMENT: case EF_LOSKILL: case EF_RUNE: case EF_DESTRUCTION2:{ /* add to total */ add_stats( escroll_total, escroll_mon, escroll_vault,vault,mon,number); break; } case EF_ACQUIRE:{ /* add to total */ add_stats( acq_total, acq_mon, acq_vault,vault,mon,number); break; } case EF_ACQUIRE2:{ /* do the effect of 2 acquires */ add_stats( acq_total, acq_mon, acq_vault,vault,mon,number); add_stats( acq_total, acq_mon, acq_vault,vault,mon,number); break; } } break; } /* rods */ case TV_ROD:{ /* add to total */ add_stats( rod_total, rod_mon, rod_vault,vault,mon,number); effect=object_effect(o_ptr); switch(effect){ /* utility */ case EF_DETECT_TRAP: case EF_DETECT_TREASURE: case EF_DETECT_DOORSTAIR: case EF_LIGHT_LINE: case EF_ILLUMINATION:{ add_stats( urod_total, urod_mon, urod_vault,vault,mon,number); break; } /* teleport other */ case EF_TELE_OTHER:{ add_stats( torod_total, torod_mon, torod_vault,vault,mon,number); break; } /* detect all */ case EF_DETECT_ALL:{ add_stats( drod_total, drod_mon, drod_vault,vault,mon,number); break; } /* endgame, speed and healing */ case EF_HASTE: case EF_HEAL3:{ add_stats( erod_total, erod_mon, erod_vault,vault,mon,number); break; } } break; } /* staves */ case TV_STAFF:{ add_stats( staff_total, staff_mon, staff_vault,vault,mon,number); effect=object_effect(o_ptr); switch(effect){ case EF_HASTE:{ add_stats( sstaff_total, sstaff_mon, sstaff_vault,vault,mon,number); break; } case EF_DESTRUCTION2:{ add_stats( dstaff_total, dstaff_mon, dstaff_vault,vault,mon,number); break; } case EF_DISPEL_EVIL60: case EF_DISPEL_ALL: case EF_STAFF_HOLY:{ add_stats( kstaff_total, kstaff_mon, kstaff_vault,vault,mon,number); break; } case EF_CURE_FULL: case EF_BANISHMENT: case EF_STAFF_MAGI:{ add_stats( pstaff_total, pstaff_mon, pstaff_vault,vault,mon,number); break; } } break; } case TV_WAND:{ add_stats( wand_total, wand_mon, wand_vault,vault,mon,number); effect=object_effect(o_ptr); switch(effect){ case EF_TELE_OTHER:{ add_stats( towand_total, towand_mon, towand_vault,vault,mon,number); break; } } break; } case TV_RING:{ add_stats( ring_total, ring_mon, ring_vault,vault,mon,number); /* is it cursed */ if (of_has(o_ptr->flags,OF_LIGHT_CURSE)) add_stats( curing_total, curing_mon, curing_vault,vault,mon,number); switch(o_ptr->sval){ case SV_RING_SPEED:{ add_stats( spring_total, spring_mon, spring_vault,vault,mon,number); break; } case SV_RING_STRENGTH: case SV_RING_INTELLIGENCE: case SV_RING_DEXTERITY: case SV_RING_CONSTITUTION:{ add_stats( string_total, string_mon, string_vault,vault,mon,number); break; } case SV_RING_RESIST_POISON:{ add_stats( poring_total, poring_mon, poring_vault,vault,mon,number); break; } case SV_RING_FREE_ACTION:{ add_stats( faring_total, faring_mon, faring_vault,vault,mon,number); break; } case SV_RING_SEE_INVISIBLE:{ add_stats( siring_total, siring_mon, siring_vault,vault,mon,number); break; } case SV_RING_FLAMES: case SV_RING_ACID: case SV_RING_ICE: case SV_RING_LIGHTNING:{ add_stats( brring_total, brring_mon, brring_vault,vault,mon,number); break; } case SV_RING_NARYA: case SV_RING_NENYA: case SV_RING_VILYA:{ add_stats( elring_total, elring_mon, elring_vault,vault,mon,number); break; } case SV_RING_POWER:{ add_stats( onering_total, onering_mon, onering_vault,vault,mon,number); break; } } break; } case TV_AMULET:{ add_stats( amu_total, amu_mon, amu_vault,vault,mon,number); /* extract flags */ object_flags(o_ptr,f); switch(o_ptr->sval){ /* wisdom */ case SV_AMULET_WISDOM:{ add_stats( wisamu_total, wisamu_mon, wisamu_vault,vault,mon,number); break; } case SV_AMULET_THE_MAGI: case SV_AMULET_TRICKERY: case SV_AMULET_WEAPONMASTERY:{ add_stats( endamu_total, endamu_mon, endamu_vault,vault,mon,number); break; } case SV_AMULET_ESP:{ add_stats( teamu_total, teamu_mon, teamu_vault,vault,mon,number); break; } } /* is cursed */ if (of_has(f,OF_LIGHT_CURSE)) add_stats( cuamu_total, cuamu_mon, cuamu_vault, vault, mon,number); break; } case TV_SHOT: case TV_ARROW: case TV_BOLT:{ add_stats( ammo_total, ammo_mon, ammo_vault,vault,mon,number); /* extract flags */ object_flags(o_ptr,f); /* check if bad, average, good */ if ((o_ptr->to_h < 0) && (o_ptr->to_d < 0)) add_stats( bdammo_total, bdammo_mon, bdammo_vault, vault, mon,number); if ((o_ptr->to_h == 0) && (o_ptr->to_d == 0)) add_stats( avammo_total, avammo_mon, avammo_vault, vault, mon,number); if ((o_ptr->to_h > 0) && (o_ptr->to_d > 0)) add_stats( gdammo_total, gdammo_mon, gdammo_vault, vault, mon,number); if (o_ptr->ego) add_stats( egammo_total, egammo_mon, egammo_vault, vault, mon,number); if ((o_ptr->sval == SV_AMMO_HEAVY) || (o_ptr->sval == SV_AMMO_SILVER)){ /* Mithril and seeker ammo */ add_stats( vgammo_total, vgammo_mon, vgammo_vault, vault, mon,number); /* Ego mithril and seeker ammo */ if (o_ptr->ego) add_stats( awammo_total, awammo_mon, awammo_vault, vault, mon,number); if (of_has(f,OF_SLAY_EVIL)) add_stats( evammo_total, evammo_mon, evammo_vault, vault, mon,number); if ((of_has(f,OF_SLAY_EVIL)) && (of_has(f,OF_SLAY_DEMON))) add_stats( hmammo_total, hmammo_mon, hmammo_vault, vault, mon,number); } break; } /* prayer books and magic books have the same probability only track one of them */ case TV_MAGIC_BOOK:{ switch(o_ptr->sval){ /* svals begin at 0 and end at 8 */ case 0:{ add_stats( b1_total, b1_mon, b1_vault, vault, mon,number); first_find(mb1_it); break; } case 1:{ add_stats( b2_total, b2_mon, b2_vault, vault, mon,number); first_find(mb2_it); break; } case 2:{ add_stats( b3_total, b3_mon, b3_vault, vault, mon,number); first_find(mb3_it); break; } case 3:{ add_stats( b4_total, b4_mon, b4_vault, vault, mon,number); first_find(mb4_it); break; } case 4:{ add_stats( b5_total, b5_mon, b5_vault, vault, mon,number); first_find(mb5_it); break; } case 5:{ add_stats( b6_total, b6_mon, b6_vault, vault, mon,number); first_find(mb6_it); break; } case 6:{ add_stats( b7_total, b7_mon, b7_vault, vault, mon,number); first_find(mb7_it); break; } case 7:{ add_stats( b8_total, b8_mon, b8_vault, vault, mon,number); first_find(mb8_it); break; } case 8:{ add_stats( b9_total, b9_mon, b9_vault, vault, mon,number); first_find(mb9_it); break; } } break; } } /* check to see if we have an artifact */ if (o_ptr->artifact){ /* add to artifact level total */ art_total[lvl] += addval; /* add to the artifact iteration total */ if (iter < TRIES_SIZE) art_it[iter]++; /* Obtain the artifact info */ a_ptr = o_ptr->artifact; //debugging, print out that we found the artifact //msg_format("Found artifact %s",a_ptr->name); /* artifact is shallow */ if (a_ptr->alloc_min < (p_ptr->depth - 20)) art_shal[lvl] += addval; /* artifact is close to the player depth */ if ((a_ptr->alloc_min >= p_ptr->depth - 20) && (a_ptr->alloc_min <= p_ptr->depth )) art_ave[lvl] += addval; /* artifact is out of depth */ if (a_ptr->alloc_min > (p_ptr->depth)) art_ood[lvl] += addval; /* check to see if it's a special artifact */ if ((o_ptr->tval == TV_LIGHT) || (o_ptr->tval == TV_AMULET) || (o_ptr->tval == TV_RING)){ /* increment special artifact counter */ art_spec[lvl] += addval; } else { /* increment normal artifacts */ art_norm[lvl] += addval; /* did it come from a monster? */ if (mon) art_mon[lvl] += addval; /* did it come from a unique? */ if (uniq) art_uniq[lvl] += addval; /* was it in a vault? */ if (vault){ /* did a monster drop it ?*/ if ((mon) || (uniq)) art_mon_vault[lvl] += addval; else art_vault[lvl] += addval; } else { /* was it just lyin' on the floor? */ if ((!uniq) && (!mon)) art_floor[lvl] += addval; } } /* preserve the artifact */ if (!(clearing)) a_ptr->created = FALSE; } /* Get info on gold. */ if (o_ptr->tval == TV_GOLD){ int temp = o_ptr->pval[DEFAULT_PVAL]; gold_temp = temp; gold_total[lvl] += (gold_temp / tries); /*From a monster? */ if ((mon) || (uniq)) gold_mon[lvl] += (gold_temp / tries); else gold_floor[lvl] += (gold_temp / tries); } } /* * A rewrite of monster death that gets rid of some features * That we don't want to deal with. Namely, no notifying the * player and no generation of Morgoth artifacts * * It also replaces drop near with a new function that drops all * the items on the exact square that the monster was on. */ void monster_death_stats(int m_idx) { int y, x; s16b this_o_idx, next_o_idx = 0; monster_type *m_ptr; bool uniq; assert(m_idx > 0); m_ptr = cave_monster(cave, m_idx); /* Check if monster is UNIQUE */ uniq = rf_has(m_ptr->race->flags,RF_UNIQUE); /* Get the location */ y = m_ptr->fy; x = m_ptr->fx; /* Delete any mimicked objects */ if (m_ptr->mimicked_o_idx > 0) delete_object_idx(m_ptr->mimicked_o_idx); /* Drop objects being carried */ for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Line up the next object */ next_o_idx = o_ptr->next_o_idx; /* Paranoia */ o_ptr->held_m_idx = 0; /* Get data */ get_obj_data(o_ptr, y, x, TRUE, uniq); /* delete the object */ delete_object_idx(this_o_idx); } /* Forget objects */ m_ptr->hold_o_idx = 0; } /* This will collect stats on a monster avoiding all * unique monsters. Afterwards it will kill the * monsters. */ static bool stats_monster(monster_type *m_ptr, int i) { static int lvl; /* get player depth */ lvl=p_ptr->depth; /* Increment monster count */ mon_total[lvl] += addval; /* Increment unique count if appropriate */ if (rf_has(m_ptr->race->flags, RF_UNIQUE)){ /* add to total */ uniq_total[lvl] += addval; /* kill the unique if we're in clearing mode */ if (clearing) m_ptr->race->max_num = 0; //debugging print that we killed it //msg_format("Killed %s",r_ptr->name); } /* Is it mostly dangerous (10 levels ood or less?)*/ if ((m_ptr->race->level > p_ptr->depth) && (m_ptr->race->level <= p_ptr->depth+10)){ mon_ood[lvl] += addval; /* Is it a unique */ if (rf_has(m_ptr->race->flags, RF_UNIQUE)) uniq_ood[lvl] += addval; } /* Is it deadly? */ if (m_ptr->race->level > p_ptr->depth + 10){ mon_deadly[lvl] += addval; /* Is it a unique? */ if (rf_has(m_ptr->race->flags, RF_UNIQUE)) uniq_deadly[lvl] += addval; } /* Generate treasure */ monster_death_stats(i); /* remove the monster */ delete_monster_idx(i); /* success */ return TRUE; } /* * Delete a single dungeon object * * This piece of code is identical to delete_object_idx * except that it does not include light_spot to save * time */ static void delete_object_stat(int o_idx) { object_type *j_ptr; /* Excise */ excise_object_idx(o_idx); /* Object */ j_ptr = object_byid(o_idx); /* Wipe the object */ object_wipe(j_ptr); /* Count objects */ o_cnt--; } /* Print heading infor for the file */ static void print_heading(void) { /* PRINT INFO STUFF */ file_putf(stats_log," This is a Monte Carlo simulation, results are arranged by level \n"); file_putf(stats_log," Monsters: OOD means between 1 and 10 levels deep, deadly is more than \n"); file_putf(stats_log," 10 levels deep \n"); file_putf(stats_log," Artifacts: info on artifact location (vault, floor, etc) \n"); file_putf(stats_log," do not include special artifacts, only weapons and armor \n"); file_putf(stats_log," Weapons : Big dice weapons are either BoC, SoS, or Mod. Uber \n"); file_putf(stats_log," weapons, are one of the above with xblows or slay evil\n"); file_putf(stats_log," Launchers: xtra shots and xtra might are only logged for x3 or\n"); file_putf(stats_log," better. Very good has +to hit or + to dam > 15\n"); file_putf(stats_log," Amulets: Endgame amulets are trickery, weaponmaster and magi\n"); file_putf(stats_log," Armor: Low resist armor may have more than one basic resist (acid, \n"); file_putf(stats_log," elec, fire, cold) but not all. \n"); file_putf(stats_log," Books: Prayer and Magic books have the same probability. \n"); file_putf(stats_log," Potions: Aug counts as 5 potions, *enlight* as 2. Healing potions are \n"); file_putf(stats_log," only *Healing* and Life\n"); file_putf(stats_log," Scrolls: Endgame scrolls include *Dest*, Rune, MBan and Ban \n"); file_putf(stats_log," *Acq* counts as two Acq scrolls"); file_putf(stats_log," Rods: Utility rods: d-obj, d-stairs, d-traps, light, illum \n"); file_putf(stats_log," Endgame rods: Speed, Healing \n"); file_putf(stats_log," Staves: Kill staves: dispel evil, power, holiness. \n"); file_putf(stats_log," Power staves: healing, magi, banishment \n"); } /* Print all the stats for each level */ static void print_stats(int lvl) { /* check bounds on lvl */ if ((lvl < 0) || (lvl > 100)) return; /* print level heading */ file_putf(stats_log,"\n"); file_putf(stats_log,"******** LEVEL %d , %d tries********* \n",lvl, tries); file_putf(stats_log,"\n"); /* print monster heading */ file_putf(stats_log," MONSTER INFO \n"); file_putf(stats_log," Total monsters: %f OOD: %f Deadly: %f \n", mon_total[lvl], mon_ood[lvl], mon_deadly[lvl]); file_putf(stats_log," Unique monsters: %f OOD: %f Deadly: %f \n", uniq_total[lvl], uniq_ood[lvl], uniq_deadly[lvl]); /* print artifact heading */ file_putf(stats_log,"\n ARTIFACT INFO \n"); /* basic artifact info */ file_putf(stats_log,"Total artifacts: %f Special artifacts: %f Weapons/armor: %f \n", art_total[lvl], art_spec[lvl], art_norm[lvl]); /* artifact depth info */ file_putf(stats_log,"Shallow: %f Average: %f Ood: %f \n", art_shal[lvl],art_ave[lvl],art_ood[lvl]); /* more advanced info */ file_putf(stats_log,"From vaults: %f From floor (no vault): %f \n", art_vault[lvl],art_floor[lvl]); file_putf(stats_log,"Uniques: %f Monsters: %f Vault denizens: %f \n", art_uniq[lvl], art_mon[lvl], art_mon_vault[lvl]); /* print general equipment stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," Equipment info \n"); file_putf(stats_log," FA total: %f From Monsters: %f In Vaults: %f \n", faeq_total[lvl], faeq_mon[lvl], faeq_vault[lvl]); file_putf(stats_log," SI total: %f From Monsters: %f In Vaults: %f \n", sieq_total[lvl], sieq_mon[lvl], sieq_vault[lvl]); file_putf(stats_log," lo res total: %f From Monsters: %f In Vaults: %f \n", reeq_total[lvl], reeq_mon[lvl], reeq_vault[lvl]); file_putf(stats_log," rbase total: %f From Monsters: %f In Vaults: %f \n", rbeq_total[lvl], rbeq_mon[lvl], rbeq_vault[lvl]); file_putf(stats_log," rpois total: %f From Monsters: %f In Vaults: %f \n", poeq_total[lvl], poeq_mon[lvl], poeq_vault[lvl]); file_putf(stats_log," rnexus total: %f From Monsters: %f In Vaults: %f \n", nxeq_total[lvl], nxeq_mon[lvl], nxeq_vault[lvl]); file_putf(stats_log," rblind total: %f From Monsters: %f In Vaults: %f \n", bleq_total[lvl], bleq_mon[lvl], bleq_vault[lvl]); file_putf(stats_log," rconf total: %f From Monsters: %f In Vaults: %f \n", cfeq_total[lvl], cfeq_mon[lvl], cfeq_vault[lvl]); file_putf(stats_log," speed total: %f From Monsters: %f In Vaults: %f \n", speq_total[lvl], speq_mon[lvl], speq_vault[lvl]); file_putf(stats_log," telep total: %f From Monsters: %f In Vaults: %f \n", teeq_total[lvl], teeq_mon[lvl], teeq_vault[lvl]); /* print weapon stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," WEAPON INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", weap_total[lvl],weap_mon[lvl],weap_vault[lvl]); file_putf(stats_log," Bad: %f From Monsters: %f In Vaults: %f \n", bdweap_total[lvl], bdweap_mon[lvl], bdweap_vault[lvl]); file_putf(stats_log," Average: %f From Monsters: %f In Vaults: %f \n", avweap_total[lvl], avweap_mon[lvl], avweap_vault[lvl]); file_putf(stats_log," Good (great): %f From Monsters: %f In Vaults: %f \n", gdweap_total[lvl], gdweap_mon[lvl], gdweap_vault[lvl]); file_putf(stats_log," Slay(no evil):%f From Monsters: %f In Vaults: %f \n", slweap_total[lvl], slweap_mon[lvl], slweap_vault[lvl]); file_putf(stats_log," Slay evil: %f From Monsters: %f In Vaults: %f \n", evweap_total[lvl], evweap_mon[lvl], evweap_vault[lvl]); file_putf(stats_log," *Slay*: %f From Monsters: %f In Vaults: %f \n", klweap_total[lvl], klweap_mon[lvl], klweap_vault[lvl]); file_putf(stats_log," Branded: %f From Monsters: %f In Vaults: %f \n", brweap_total[lvl], brweap_mon[lvl], brweap_vault[lvl]); file_putf(stats_log," West.: %f From Monsters: %f In Vaults: %f \n", weweap_total[lvl], weweap_mon[lvl], weweap_vault[lvl]); file_putf(stats_log," Defender: %f From Monsters: %f In Vaults: %f \n", deweap_total[lvl], deweap_mon[lvl], deweap_vault[lvl]); file_putf(stats_log," Gondolin: %f From Monsters: %f In Vaults: %f \n", goweap_total[lvl], goweap_mon[lvl], goweap_vault[lvl]); file_putf(stats_log," HA: %f From Monsters: %f In Vaults: %f \n", haweap_total[lvl], haweap_mon[lvl], haweap_vault[lvl]); file_putf(stats_log," Xtra blows: %f From Monsters: %f In Vaults: %f \n", xbweap_total[lvl], xbweap_mon[lvl], xbweap_vault[lvl]); file_putf(stats_log," Telep: %f From Monsters: %f In Vaults: %f \n", teweap_total[lvl], teweap_mon[lvl], teweap_vault[lvl]); file_putf(stats_log," Big dice: %f From Monsters: %f In Vaults: %f \n", huweap_total[lvl], huweap_mon[lvl], huweap_vault[lvl]); file_putf(stats_log," Uber: %f From Monsters: %f In Vaults: %f \n", ubweap_total[lvl], ubweap_mon[lvl], ubweap_vault[lvl]); file_putf(stats_log," Morgul: %f From Monsters: %f In Vaults: %f \n", moweap_total[lvl], moweap_mon[lvl], moweap_vault[lvl]); /* launcher info */ file_putf(stats_log,"\n"); file_putf(stats_log," LAUNCHER INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", bow_total[lvl],bow_mon[lvl],bow_vault[lvl]); file_putf(stats_log," Bad: %f From Monsters: %f In Vaults: %f \n", bdbow_total[lvl], bdbow_mon[lvl], bdbow_vault[lvl]); file_putf(stats_log," Average: %f From Monsters: %f In Vaults: %f \n", avbow_total[lvl], avbow_mon[lvl], avbow_vault[lvl]); file_putf(stats_log," Good (great): %f From Monsters: %f In Vaults: %f \n", gdbow_total[lvl], gdbow_mon[lvl], gdbow_vault[lvl]); file_putf(stats_log," Very good: %f From Monsters: %f In Vaults: %f \n", vgbow_total[lvl], vgbow_mon[lvl], vgbow_vault[lvl]); file_putf(stats_log," Xtra might: %f From Monsters: %f In Vaults: %f \n", xmbow_total[lvl], xmbow_mon[lvl], xmbow_vault[lvl]); file_putf(stats_log," Xtra shots: %f From Monsters: %f In Vaults: %f \n", xsbow_total[lvl], xsbow_mon[lvl], xsbow_vault[lvl]); file_putf(stats_log," Buckland: %f From Monsters: %f In Vaults: %f \n", bubow_total[lvl], bubow_mon[lvl], bubow_vault[lvl]); file_putf(stats_log," Telep: %f From Monsters: %f In Vaults: %f \n", tebow_total[lvl], tebow_mon[lvl], tebow_vault[lvl]); file_putf(stats_log," Cursed: %f From Monsters: %f In Vaults: %f \n", cubow_total[lvl], cubow_mon[lvl], cubow_vault[lvl]); /* print armor heading */ file_putf(stats_log,"\n"); file_putf(stats_log," ARMOR INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", arm_total[lvl],arm_mon[lvl],arm_vault[lvl]); file_putf(stats_log," Bad: %f From Monsters: %f In Vaults: %f \n", bdarm_total[lvl], bdarm_mon[lvl], bdarm_vault[lvl]); file_putf(stats_log," Average: %f From Monsters: %f In Vaults: %f \n", avarm_total[lvl], avarm_mon[lvl], avarm_vault[lvl]); file_putf(stats_log," Good (great): %f From Monsters: %f In Vaults: %f \n", gdarm_total[lvl], gdarm_mon[lvl], gdarm_vault[lvl]); file_putf(stats_log," STR total: %f From Monsters: %f In Vaults: %f \n", strarm_total[lvl], strarm_mon[lvl], strarm_vault[lvl]); file_putf(stats_log," INT total: %f From Monsters: %f In Vaults: %f \n", intarm_total[lvl], intarm_mon[lvl], intarm_vault[lvl]); file_putf(stats_log," WIS total: %f From Monsters: %f In Vaults: %f \n", wisarm_total[lvl], wisarm_mon[lvl], wisarm_vault[lvl]); file_putf(stats_log," DEX total: %f From Monsters: %f In Vaults: %f \n", dexarm_total[lvl], dexarm_mon[lvl], dexarm_vault[lvl]); file_putf(stats_log," CON total: %f From Monsters: %f In Vaults: %f \n", conarm_total[lvl], conarm_mon[lvl], conarm_vault[lvl]); file_putf(stats_log," cursed total: %f From Monsters: %f In Vaults: %f \n", cuarm_total[lvl], cuarm_mon[lvl], cuarm_vault[lvl]); /* ring stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," RING INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", ring_total[lvl], ring_mon[lvl], ring_vault[lvl]); file_putf(stats_log," cursed total: %f From Monsters: %f In Vaults: %f \n", curing_total[lvl], curing_mon[lvl], curing_vault[lvl]); file_putf(stats_log," Speed total: %f From Monsters: %f In Vaults: %f \n", spring_total[lvl], spring_mon[lvl], spring_vault[lvl]); file_putf(stats_log," Stat total: %f From Monsters: %f In Vaults: %f \n", string_total[lvl], string_mon[lvl], string_vault[lvl]); file_putf(stats_log," FA total: %f From Monsters: %f In Vaults: %f \n", faring_total[lvl], faring_mon[lvl], faring_vault[lvl]); file_putf(stats_log," SI total: %f From Monsters: %f In Vaults: %f \n", siring_total[lvl], siring_mon[lvl], siring_vault[lvl]); file_putf(stats_log," rpois total: %f From Monsters: %f In Vaults: %f \n", poring_total[lvl], poring_mon[lvl], poring_vault[lvl]); file_putf(stats_log," brand total: %f From Monsters: %f In Vaults: %f \n", brring_total[lvl], brring_mon[lvl], brring_vault[lvl]); file_putf(stats_log," Elven total: %f From Monsters: %f In Vaults: %f \n", elring_total[lvl], elring_mon[lvl], elring_vault[lvl]); file_putf(stats_log," One total: %f From Monsters: %f In Vaults: %f \n", onering_total[lvl], onering_mon[lvl], onering_vault[lvl]); /* amulet stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," AMULET INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", amu_total[lvl], amu_mon[lvl], amu_vault[lvl]); file_putf(stats_log," Wisdom: %f From Monsters: %f In Vaults: %f \n", wisamu_total[lvl], wisamu_mon[lvl], wisamu_vault[lvl]); file_putf(stats_log," Endgame: %f From Monsters: %f In Vaults: %f \n", endamu_total[lvl], endamu_mon[lvl], endamu_vault[lvl]); file_putf(stats_log," Telep: %f From Monsters: %f In Vaults: %f \n", teamu_total[lvl], teamu_mon[lvl], teamu_vault[lvl]); file_putf(stats_log," Cursed: %f From Monsters: %f In Vaults: %f \n", cuamu_total[lvl], cuamu_mon[lvl], cuamu_vault[lvl]); /* print ammo stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," AMMO INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", ammo_total[lvl],ammo_mon[lvl],ammo_vault[lvl]); file_putf(stats_log," Bad: %f From Monsters: %f In Vaults: %f \n", bdammo_total[lvl], bdammo_mon[lvl], bdammo_vault[lvl]); file_putf(stats_log," Average: %f From Monsters: %f In Vaults: %f \n", avammo_total[lvl], avammo_mon[lvl], avammo_vault[lvl]); file_putf(stats_log," Good (great): %f From Monsters: %f In Vaults: %f \n", gdammo_total[lvl], gdammo_mon[lvl], gdammo_vault[lvl]); file_putf(stats_log," Ego: %f From Monsters: %f In Vaults: %f \n", egammo_total[lvl], egammo_mon[lvl], egammo_vault[lvl]); file_putf(stats_log," Mith/Seek: %f From Monsters: %f In Vaults: %f \n", vgammo_total[lvl], vgammo_mon[lvl], vgammo_vault[lvl]); file_putf(stats_log," M/S ego: %f From Monsters: %f In Vaults: %f \n", awammo_total[lvl], awammo_mon[lvl], awammo_vault[lvl]); file_putf(stats_log," M/S slay evil:%f From Monsters: %f In Vaults: %f \n", evammo_total[lvl], evammo_mon[lvl], evammo_vault[lvl]); file_putf(stats_log," M/S Holy: %f From Monsters: %f In Vaults: %f \n", hmammo_total[lvl], hmammo_mon[lvl], hmammo_vault[lvl]); /*print potion stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," POTION INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", pot_total[lvl], pot_mon[lvl], pot_vault[lvl]); file_putf(stats_log," Stat total: %f From Monsters: %f In Vaults: %f \n", gain_total[lvl], gain_mon[lvl], gain_vault[lvl]); file_putf(stats_log," Rmana total: %f From Monsters: %f In Vaults: %f \n", rmana_total[lvl], rmana_mon[lvl], rmana_vault[lvl]); file_putf(stats_log," *Heal* total: %f From Monsters: %f In Vaults: %f \n", bigheal_total[lvl], bigheal_mon[lvl], bigheal_vault[lvl]); /*print scroll stuff*/ file_putf(stats_log,"\n"); file_putf(stats_log," SCROLL INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", scroll_total[lvl], scroll_mon[lvl], scroll_vault[lvl]); file_putf(stats_log," Endgame: %f From Monsters: %f In Vaults: %f \n", escroll_total[lvl], escroll_mon[lvl], escroll_vault[lvl]); file_putf(stats_log," Acq total: %f From Monsters: %f In Vaults: %f \n", acq_total[lvl], acq_mon[lvl], acq_vault[lvl]); /* print rod stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," ROD INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", rod_total[lvl], rod_mon[lvl], rod_vault[lvl]); file_putf(stats_log," Util total: %f From Monsters: %f In Vaults: %f \n", urod_total[lvl], urod_mon[lvl], urod_vault[lvl]); file_putf(stats_log," TO total: %f From Monsters: %f In Vaults: %f \n", torod_total[lvl], torod_mon[lvl], torod_vault[lvl]); file_putf(stats_log," DAll total: %f From Monsters: %f In Vaults: %f \n", drod_total[lvl], drod_mon[lvl], drod_vault[lvl]); file_putf(stats_log," Endgame: %f From Monsters: %f In Vaults: %f \n", erod_total[lvl], erod_mon[lvl], erod_vault[lvl]); /* print staff stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," STAFF INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", staff_total[lvl], staff_mon[lvl], staff_vault[lvl]); file_putf(stats_log," Speed total: %f From Monsters: %f In Vaults: %f \n", sstaff_total[lvl], sstaff_mon[lvl], sstaff_vault[lvl]); file_putf(stats_log," *Dest* total: %f From Monsters: %f In Vaults: %f \n", dstaff_total[lvl], dstaff_mon[lvl], dstaff_vault[lvl]); file_putf(stats_log," Kill total: %f From Monsters: %f In Vaults: %f \n", kstaff_total[lvl], kstaff_mon[lvl], kstaff_vault[lvl]); file_putf(stats_log," Powerful: %f From Monsters: %f In Vaults: %f \n", pstaff_total[lvl], pstaff_mon[lvl], pstaff_vault[lvl]); /* print wand stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," WAND INFO \n"); file_putf(stats_log," Total: %f From Monsters: %f In Vaults: %f \n", wand_total[lvl], wand_mon[lvl], wand_vault[lvl]); file_putf(stats_log," TO total: %f From Monsters: %f In Vaults: %f \n", towand_total[lvl], towand_mon[lvl], towand_vault[lvl]); /* print book stuff */ file_putf(stats_log,"\n"); file_putf(stats_log," MAGIC/PRAYER BOOK INFO \n"); file_putf(stats_log," MB1: %f From Monsters: %f In Vaults: %f \n", b1_total[lvl], b1_mon[lvl], b1_vault[lvl]); file_putf(stats_log," MB2: %f From Monsters: %f In Vaults: %f \n", b2_total[lvl], b2_mon[lvl], b2_vault[lvl]); file_putf(stats_log," MB3: %f From Monsters: %f In Vaults: %f \n", b3_total[lvl], b3_mon[lvl], b3_vault[lvl]); file_putf(stats_log," MB4: %f From Monsters: %f In Vaults: %f \n", b4_total[lvl], b4_mon[lvl], b4_vault[lvl]); file_putf(stats_log," MB5: %f From Monsters: %f In Vaults: %f \n", b5_total[lvl], b5_mon[lvl], b5_vault[lvl]); file_putf(stats_log," MB6: %f From Monsters: %f In Vaults: %f \n", b6_total[lvl], b6_mon[lvl], b6_vault[lvl]); file_putf(stats_log," MB7: %f From Monsters: %f In Vaults: %f \n", b7_total[lvl], b7_mon[lvl], b7_vault[lvl]); file_putf(stats_log," MB8: %f From Monsters: %f In Vaults: %f \n", b8_total[lvl], b8_mon[lvl], b8_vault[lvl]); file_putf(stats_log," MB9: %f From Monsters: %f In Vaults: %f \n", b9_total[lvl], b9_mon[lvl], b9_vault[lvl]); /* print gold heading */ file_putf(stats_log,"\n"); file_putf(stats_log," MONEY INFO \n"); file_putf(stats_log,"total gold: %f From Monsters %f\n", gold_total[lvl],gold_mon[lvl]); } /* * Compute and print the mean and standard deviation for an array of known size* */ static void mean_and_stdv(int array[TRIES_SIZE]) { int k, maxiter; double tot=0, mean, stdev, temp=0; /* get the maximum iteration value */ maxiter = MIN(tries, TRIES_SIZE); /* sum the array */ for (k = 0; k < maxiter; k++) tot += array[k]; /* compute the mean */ mean = tot / maxiter; /* sum up the squares */ for (k = 0; k < maxiter; k++) temp += (array[k] - mean) * (array[k] - mean); /* compute standard dev */ stdev = sqrt(temp / tries); /* print to file */ file_putf(stats_log," mean: %f std-dev: %f \n",mean,stdev); } /* calculated the probability of finding an item by * a specific level, and print it to the output file */ static void prob_of_find(double stat[MAX_LVL]) { static int lvl,tmpcount; double find = 0.0, tmpfind = 0.0; /* skip town level */ for (lvl = 1; lvl < MAX_LVL ; lvl++){ /* calculate the probability of not finding the stat */ tmpfind=(1 - stat[lvl]); /* maximum probability is 98% */ if (tmpfind < 0.02) tmpfind = 0.02; /* multiply probabilities of not finding */ if (find <= 0) find = tmpfind; else find *= tmpfind; /* increase count to 5 */ tmpcount++; /* print output every 5 levels */ if (tmpcount == 5){ /* print it */ file_putf(stats_log,"%f \t",1-find); /* reset temp counter */ tmpcount=0; } } /* put a new line in prep of next entry */ file_putf(stats_log,"\n"); } /* Left this function unlinked for now */ #if 0 static double total(double stat[MAX_LVL]) { int k; double out=0; for (k = 0; k < MAX_LVL; k++){ out += stat[k]; } return out; } #endif /* post process select items */ static void post_process_stats(void) { double arttot; int k; /* output a title */ file_putf(stats_log,"\n"); file_putf(stats_log,"***** POST PROCESSING *****\n"); file_putf(stats_log,"\n"); file_putf(stats_log,"Item \t5\t\t\t10\t\t\t15\t\t\t20\t\t\t25\t\t\t"); file_putf(stats_log,"30\t\t\t35\t\t\t40\t\t\t45\t\t\t50\t\t\t"); file_putf(stats_log,"55\t\t\t60\t\t\t65\t\t\t70\t\t\t75\t\t\t"); file_putf(stats_log,"80\t\t\t85\t\t\t90\t\t\t95\t\t\t100\n"); file_putf(stats_log,"FA \t"); prob_of_find(faeq_total); mean_and_stdv(fa_it); file_putf(stats_log,"SinV \t"); prob_of_find(sieq_total); mean_and_stdv(si_it); file_putf(stats_log,"RBl \t"); prob_of_find(bleq_total); mean_and_stdv(bl_it); file_putf(stats_log,"RCf \t"); prob_of_find(cfeq_total); mean_and_stdv(cf_it); file_putf(stats_log,"Nexus \t"); prob_of_find(nxeq_total); mean_and_stdv(nx_it); file_putf(stats_log,"Pois \t"); prob_of_find(poeq_total); mean_and_stdv(po_it); file_putf(stats_log,"Tel \t"); prob_of_find(teeq_total); mean_and_stdv(te_it); file_putf(stats_log,"\n"); file_putf(stats_log,"mb1 \t"); prob_of_find(b1_total); mean_and_stdv(mb1_it); file_putf(stats_log,"mb2 \t"); prob_of_find(b2_total); mean_and_stdv(mb2_it); file_putf(stats_log,"mb3 \t"); prob_of_find(b3_total); mean_and_stdv(mb3_it); file_putf(stats_log,"mb4 \t"); prob_of_find(b4_total); mean_and_stdv(mb4_it); file_putf(stats_log,"mb5 \t"); prob_of_find(b5_total); mean_and_stdv(mb5_it); file_putf(stats_log,"mb6 \t"); prob_of_find(b6_total); mean_and_stdv(mb6_it); file_putf(stats_log,"mb7 \t"); prob_of_find(b7_total); mean_and_stdv(mb7_it); file_putf(stats_log,"mb8 \t"); prob_of_find(b8_total); mean_and_stdv(mb8_it); file_putf(stats_log,"mb9 \t"); prob_of_find(b9_total); mean_and_stdv(mb9_it); /* print artifact total */ arttot=0; for (k=0; k < MAX_LVL; k++) arttot += art_total[k]; file_putf(stats_log,"\n"); file_putf(stats_log,"Total number of artifacts found %f \n",arttot); mean_and_stdv(art_it); /* temporary stuff goes here */ /* Dungeon book totals for Eddie file_putf(stats_log,"mb5: %f\n",total(b5_total)); file_putf(stats_log,"mb6: %f\n",total(b6_total)); file_putf(stats_log,"mb7: %f\n",total(b7_total)); file_putf(stats_log,"mb8: %f\n",total(b8_total)); file_putf(stats_log,"mb9: %f\n",total(b9_total)); */ } /* * Scans the dungeon for objects */ static void scan_for_objects(void) { int y, x; for (y = 1; y < cave->height - 1; y++) { for (x = 1; x < cave->width - 1; x++) { const object_type *o_ptr; while ((o_ptr = get_first_object(y, x))) { /* get data on the object */ get_obj_data(o_ptr, y, x, FALSE, FALSE); /* delete the object */ delete_object_stat(cave->o_idx[y][x]); } } } } /* * This will scan the dungeon for monsters and then kill each * and every last one. */ static void scan_for_monsters(void) { int i; /* Go through the monster list */ for (i = 1; i < cave_monster_max(cave); i++){ monster_type *m_ptr = cave_monster(cave, i); /* Skip dead monsters */ if (!m_ptr->race) continue; stats_monster(m_ptr,i); } } /* * This is the entry point for generation statistics. */ static void stats_collect_level(void) { /* Make a dungeon */ cave_generate(cave,p_ptr); /* Scan for objects, these are floor objects */ scan_for_objects(); /* Get stats (and kill) all non-unique monsters */ scan_for_monsters(); } /* * this code will go through the artifact list and * make each artifact uncreated so that our sim player * can find them again! */ static void uncreate_artifacts(void) { int i; /* Loop through artifacts */ for (i = 0; z_info && i < z_info->a_max; i++){ artifact_type *a_ptr = &a_info[i]; /* uncreate */ a_ptr->created = FALSE; } } /* * This will revive all the uniques so the sim player * can kill them again. */ static void revive_uniques(void) { int i; for (i = 1; i < z_info->r_max - 1; i++){ /* get the monster info */ monster_race *r_ptr = &r_info[i]; /* revive the unique monster */ if (rf_has(r_ptr->flags, RF_UNIQUE)) r_ptr->max_num = 1; } } /* * This function loops through the level and does N iterations of * the stat calling function. */ static void diving_stats(void) { int depth; /* iterate through levels */ for (depth = 0; depth < MAX_LVL; depth += 5){ p_ptr->depth = depth; if (p_ptr->depth == 0) p_ptr->depth = 1; /* do many iterations of each level */ for (iter = 0; iter < tries; iter++){ /* get level output */ stats_collect_level(); } /* print the output to the file */ print_stats(depth); /* show the level to check on status */ do_cmd_redraw(); } } static void clearing_stats(void) { int depth; /* do many iterations of the game */ for (iter=0; iter < tries; iter++){ /* move all artifacts to uncreated */ uncreate_artifacts(); /* move all uniques to alive */ revive_uniques(); /* do randart regen */ if ((regen) && (iterdepth = depth; /* get stats */ stats_collect_level(); //debug //msg_format("Finished level %d,depth"); } msg("Iteration %d complete",iter); } /* print to file */ for (depth=0 ; depth < MAX_LVL; depth++) print_stats(depth); /* post processing */ post_process_stats(); /* display the current level */ do_cmd_redraw(); } /* * Prompt the user for params for the stats. * Sim type and number of sims */ static int stats_prompt(void) { static int temp,simtype=1; static char tmp_val[100], yn; static char prompt[50]; /* This is the prompt for no. of tries*/ strnfmt(prompt, sizeof(prompt), "Num of simulations: "); /* This is the default value (50) */ strnfmt(tmp_val, sizeof(tmp_val), "%d", tries); /* Ask for the input */ if (!get_string(prompt,tmp_val,7)) return 0; /* get the new value */ temp = atoi(tmp_val); /* convert */ if (temp < 1) temp = 1; /* save */ tries=temp; /* set 'value to add' for arrays */ addval = 1.0/tries; /* Get info on what type of run to do */ strnfmt(prompt, sizeof(prompt), "Type of Sim: Diving (1) or Clearing (2) "); /* set default */ strnfmt(tmp_val, sizeof(tmp_val), "%d", simtype); /* get the input */ if (!get_string(prompt,tmp_val,4)) return 0; temp=atoi(tmp_val); /* make sure that the type is good */ if ((temp == 1) || (temp == 2)) simtype = temp; else return 0; /* for clearing sim, check for randart regen */ if (temp == 2){ /* Prompt */ strnfmt(prompt, sizeof(prompt), "Regen randarts? (warning SLOW)"); yn = get_char(prompt, "yn", 3, 'n'); if (( yn == 'y') || (yn == 'Y')) regen=TRUE; else regen = FALSE; } return simtype; } /* *This is the call from wiz_stats. The top level function * in this code */ void stats_collect(void) { static int simtype; static bool auto_flag; char buf[1024]; int i; /* prompt the user for sim params */ simtype=stats_prompt(); /* make sure the results are good! */ if (!((simtype == 1) || (simtype == 2))) return; /* are we in diving or clearing mode */ if (simtype == 2) clearing = TRUE; else clearing = FALSE; /*Open log file*/ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "stats.log"); stats_log = file_open(buf, MODE_WRITE, FTYPE_TEXT); /* Logging didn't work */ if (!stats_log){ msg("Error - can't open stats.log for writing."); exit(1); } /* turn on auto-more. This will clear prompts for items * that drop under the player, or that can't fit on the * floor due to too many items. This is a very small amount * of items, even on deeper levels, so it's not worth worrying * too much about. */ auto_flag = FALSE; if (!OPT(auto_more)){ /* remember that we turned off auto_more */ auto_flag = TRUE; /* Turn on auto-more */ option_set(option_name(OPT_auto_more),TRUE); } /* print heading for the file */ print_heading(); /* make sure all stats are 0 */ for (i = 0; i < MAX_LVL; i++) init_stat_vals(i); /* make sure all iter vals are 0 */ for (i = 0; i < TRIES_SIZE; i++) init_iter_vals(i); /* select diving option */ if (!clearing) diving_stats(); /* select clearing option */ if (clearing) clearing_stats(); /* Turn auto-more back off */ if (auto_flag) option_set(option_name(OPT_auto_more),FALSE); /*Close log file */ if (!file_close(stats_log)) { msg("Error - can't close randart.log file."); exit(1); } } #define DIST_MAX 10000 int cave_dist[DUNGEON_HGT][DUNGEON_WID]; void clear_cave_dist(void) { int x,y; for (y = 1; y < DUNGEON_HGT - 1; y++){ for (x = 1; x < DUNGEON_WID - 1; x++){ cave_dist[y][x] = -1; } } } void calc_cave_distances(void) { int dist, i; int oy, ox, ty, tx, d; /* Squares with distance from player of n-1 */ int d_x_old[DIST_MAX]; int d_y_old[DIST_MAX]; int d_old_max; /* Squares with distance from player of n */ int d_x_new[DIST_MAX]; int d_y_new[DIST_MAX]; int d_new_max; /* Set all cave spots to inaccessible */ clear_cave_dist(); /* Get player location */ oy = d_y_old[0] = p_ptr->py; ox = d_x_old[0] = p_ptr->px; d_old_max = 1; /* distance from player starts at 0*/ dist=0; /* Assign the distance value to the first square (player)*/ cave_dist[oy][ox] = dist; do{ d_new_max = 0; dist++; /* Loop over all visited squares of the previous iteration*/ for(i=0 ;i < d_old_max; i++){ /* Get the square we want to look at */ oy = d_y_old[i]; ox = d_x_old[i]; //debug //msg("x: %d y: %d dist: %d %d ",ox,oy,dist-1,i); /* Get all adjacent squares */ for (d = 0; d < 8; d++){ /* Adjacent square location */ ty = oy + ddy_ddd[d]; tx = ox + ddx_ddd[d]; if (!(cave_in_bounds_fully(cave, ty,tx))) continue; /* Have we been here before? */ if (cave_dist[ty][tx] >= 0) continue; /* Is it a wall? */ if (cave_iswall(cave, ty, tx)) continue; /* Add the new location */ d_y_new[d_new_max] = ty; d_x_new[d_new_max] = tx; /* Assign the distance to that spot */ cave_dist[ty][tx] = dist; d_new_max++; //debug //msg("x: %d y: %d dist: %d ",tx,ty,dist); } } /* copy the new distance list to the old one */ for (i=0 ;i 0) || dist == DIST_MAX); } void pit_stats(void) { int tries = 1000; int depth = 0; int hist[z_info->pit_max]; int j, p; int type = 1; char tmp_val[100]; /* Initialize hist */ for (p = 0; p < z_info->pit_max; p++) hist[p] = 0; /* Format default value */ strnfmt(tmp_val, sizeof(tmp_val), "%d", tries); /* Ask for the input - take the first 7 characters*/ if (!get_string("Num of simulations: ", tmp_val, 7)) return; /* get the new value */ tries = atoi(tmp_val); if (tries < 1) tries = 1; /* Format second default value */ strnfmt(tmp_val, sizeof(tmp_val), "%d", type); /* Ask for the input - take the first 7 characters*/ if (!get_string("Pit type: ", tmp_val, 7)) return; /* get the new value */ type = atoi(tmp_val); if (type < 1) type = 1; /* Format second default value */ strnfmt(tmp_val, sizeof(tmp_val), "%d", p_ptr->depth); /* Ask for the input - take the first 7 characters*/ if (!get_string("Depth: ", tmp_val, 7)) return; /* get the new value */ depth = atoi(tmp_val); if (depth < 1) depth = 1; for (j = 0; j < tries; j++){ int i; int pit_idx = 0; int pit_dist = 999; for (i = 0; i < z_info->pit_max; i++){ int offset, dist; pit_profile *pit = &pit_info[i]; if (!pit->name || pit->room_type != type) continue; offset = Rand_normal(pit->ave, 10); dist = ABS(offset - depth); if (dist < pit_dist && one_in_(pit->rarity)){ pit_idx = i; pit_dist = dist; } } hist[pit_idx]++; } for (p = 0; p < z_info->pit_max; p++){ pit_profile *pit = &pit_info[p]; if (pit->name) msg("Type: %s, Number: %d.", pit->name, hist[p]); } return; } /* Gather whether the dungeon has disconnects in it * and whether the player is disconnected from the stairs */ void disconnect_stats(void) { int i,y,x; bool has_dsc, has_dsc_from_stairs; static int temp; static char tmp_val[100]; static char prompt[50]; long dsc_area=0, dsc_from_stairs=0; /* This is the prompt for no. of tries*/ strnfmt(prompt, sizeof(prompt), "Num of simulations: "); /* This is the default value (50) */ strnfmt(tmp_val, sizeof(tmp_val), "%d", tries); /* Ask for the input */ if (!get_string(prompt,tmp_val,7)) return; /* get the new value */ temp = atoi(tmp_val); /* convert */ if (temp < 1) temp = 1; /* save */ tries=temp; for (i = 1; i <= tries; i++){ /* assume no disconnected areas */ has_dsc = FALSE; /* assume you can't get to stairs */ has_dsc_from_stairs = TRUE; /* Make a new cave */ cave_generate(cave,p_ptr); /* Fill the distance array */ calc_cave_distances(); /*Cycle through the dungeon */ for (y = 1; y < cave->height - 1; y++){ for (x = 1; x < cave->width - 1; x++){ /* don't care about walls */ if (cave_iswall(cave, y, x)) continue; /* Can we get there? */ if (cave_dist[y][x] >= 0){ /* Is it a down stairs? */ if (cave_isdownstairs(cave, y, x)) { has_dsc_from_stairs = FALSE; //debug //msg("dist to stairs: %d",cave_dist[y][x]); } continue; } /* Ignore vaults as they are often disconnected */ if (cave_isvault(cave, y, x)) continue; /* We have a disconnected area */ has_dsc = TRUE; } } if (has_dsc_from_stairs) dsc_from_stairs++; if (has_dsc) dsc_area++; msg("Iteration: %d",i); } msg("Total levels with disconnected areas: %ld",dsc_area); msg("Total levels isolated from stairs: %ld",dsc_from_stairs); /* redraw the level */ do_cmd_redraw(); } #else /* USE_STATS */ void stats_collect(void) { msg("Statistics generation not turned on in this build."); } void disconnect_stats(void) { msg("Statistics generation not turned on in this build."); } void pit_stats(void) { msg("Statistics generation not turned on in this build."); } #endif /* USE_STATS */ angband-3.5.1/src/ui-event.c0000644000175000017500000001642412456456606015136 0ustar chriscchrisc/* * File: ui-event.c * Purpose: Utility functions relating to UI events * * Copyright (c) 2011 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "ui-event.h" /** * Map keycodes to their textual equivalent. */ static const struct { keycode_t code; const char *desc; } mappings[] = { { ESCAPE, "Escape" }, { KC_ENTER, "Enter" }, { KC_TAB, "Tab" }, { KC_DELETE, "Delete" }, { KC_BACKSPACE, "Backspace" }, { ARROW_DOWN, "Down" }, { ARROW_LEFT, "Left" }, { ARROW_RIGHT, "Right" }, { ARROW_UP, "Up" }, { KC_F1, "F1" }, { KC_F2, "F2" }, { KC_F3, "F3" }, { KC_F4, "F4" }, { KC_F5, "F5" }, { KC_F6, "F6" }, { KC_F7, "F7" }, { KC_F8, "F8" }, { KC_F9, "F9" }, { KC_F10, "F10" }, { KC_F11, "F11" }, { KC_F12, "F12" }, { KC_F13, "F13" }, { KC_F14, "F14" }, { KC_F15, "F15" }, { KC_HELP, "Help" }, { KC_HOME, "Home" }, { KC_PGUP, "PageUp" }, { KC_END, "End" }, { KC_PGDOWN, "PageDown" }, { KC_INSERT, "Insert" }, { KC_PAUSE, "Pause" }, { KC_BREAK, "Break" }, { KC_BEGIN, "Begin" }, }; /** * Given a string, try and find it in "mappings". */ keycode_t keycode_find_code(const char *str, size_t len) { size_t i; for (i = 0; i < N_ELEMENTS(mappings); i++) { if (strncmp(str, mappings[i].desc, len) == 0) return mappings[i].code; } return 0; } /** * Given a keycode, return its textual mapping. */ const char *keycode_find_desc(keycode_t kc) { size_t i; for (i = 0; i < N_ELEMENTS(mappings); i++) { if (mappings[i].code == kc) return mappings[i].desc; } return NULL; } /* * Convert a hexidecimal-digit into a decimal */ static int dehex(char c) { if (isdigit((unsigned char)c)) return (D2I(c)); if (isalpha((unsigned char)c)) return (A2I(tolower((unsigned char)c)) + 10); return (0); } /** * Convert an encoding of a set of keypresses into actual keypresses. */ void keypress_from_text(struct keypress *buf, size_t len, const char *str) { size_t cur = 0; byte mods = 0; memset(buf, 0, len * sizeof *buf); #define STORE(buffer, pos, mod, cod) \ { \ int p = (pos); \ keycode_t c = (cod); \ byte m = (mod); \ \ if ((m & KC_MOD_CONTROL) && ENCODE_KTRL(c)) { \ m &= ~KC_MOD_CONTROL; \ c = KTRL(c); \ } \ \ buffer[p].mods = m; \ buffer[p].code = c; \ } /* Analyze the "ascii" string */ while (*str && cur < len) { buf[cur].type = EVT_KBRD; if (*str == '\\') { str++; if (*str == '\0') break; switch (*str) { /* Hex-mode */ case 'x': { if (isxdigit((unsigned char)(*(str + 1))) && isxdigit((unsigned char)(*(str + 2)))) { int v1 = dehex(*++str) * 16; int v2 = dehex(*++str); /* store a nice hex digit */ STORE(buf, cur++, mods, v1 + v2); } else { /* invalids get ignored */ STORE(buf, cur++, mods, '?'); } break; } case 'a': STORE(buf, cur++, mods, '\a'); break; case '\\': STORE(buf, cur++, mods, '\\'); break; case '^': STORE(buf, cur++, mods, '^'); break; case '[': STORE(buf, cur++, mods, '['); break; default: STORE(buf, cur++, mods, *str); break; } mods = 0; /* Skip the final char */ str++; } else if (*str == '[') { /* parse non-ascii keycodes */ char *end; keycode_t kc; if (*str++ == 0) return; end = strchr(str, (unsigned char) ']'); if (!end) return; kc = keycode_find_code(str, (size_t) (end - str)); if (!kc) return; STORE(buf, cur++, mods, kc); mods = 0; str = end + 1; } else if (*str == '{') { /* Specify modifier for next character */ str++; if (*str == '\0' || !strchr(str, (unsigned char) '}')) return; /* analyze modifier chars */ while (*str != '}') { switch (*str) { case '^': mods |= KC_MOD_CONTROL; break; case 'S': mods |= KC_MOD_SHIFT; break; case 'A': mods |= KC_MOD_ALT; break; case 'M': mods |= KC_MOD_META; break; case 'K': mods |= KC_MOD_KEYPAD; break; default: return; } str++; } /* skip ending bracket */ str++; } else if (*str == '^') { mods |= KC_MOD_CONTROL; str++; } else { /* everything else */ STORE(buf, cur++, mods, *str++); mods = 0; } } /* Terminate */ cur = MIN(cur, len); buf[cur].type = EVT_NONE; } /* * Convert a string of keypresses into their textual equivalent. */ void keypress_to_text(char *buf, size_t len, const struct keypress *src, bool expand_backslash) { size_t cur = 0; size_t end = 0; while (src[cur].type == EVT_KBRD) { keycode_t i = src[cur].code; int mods = src[cur].mods; const char *desc = keycode_find_desc(i); /* un-ktrl control characters if they don't have a description */ /* this is so that Tab (^I) doesn't get turned into ^I but gets * displayed as [Tab] */ if (i < 0x20 && !desc) { mods |= KC_MOD_CONTROL; i = UN_KTRL(i); } if (mods) { if (mods & KC_MOD_CONTROL && !(mods & ~KC_MOD_CONTROL)) { strnfcat(buf, len, &end, "^"); } else { strnfcat(buf, len, &end, "{"); if (mods & KC_MOD_CONTROL) strnfcat(buf, len, &end, "^"); if (mods & KC_MOD_SHIFT) strnfcat(buf, len, &end, "S"); if (mods & KC_MOD_ALT) strnfcat(buf, len, &end, "A"); if (mods & KC_MOD_META) strnfcat(buf, len, &end, "M"); if (mods & KC_MOD_KEYPAD) strnfcat(buf, len, &end, "K"); strnfcat(buf, len, &end, "}"); } } if (desc) { strnfcat(buf, len, &end, "[%s]", desc); } else { switch (i) { case '\a': strnfcat(buf, len, &end, "\a"); break; case '\\': { if (expand_backslash) strnfcat(buf, len, &end, "\\\\"); else strnfcat(buf, len, &end, "\\"); break; } case '^': strnfcat(buf, len, &end, "\\^"); break; case '[': strnfcat(buf, len, &end, "\\["); break; default: { if (i < 127) strnfcat(buf, len, &end, "%c", i); else strnfcat(buf, len, &end, "\\x%02x", (int)i); break; } } } cur++; } /* Terminate */ buf[end] = '\0'; } /* * Convert a keypress into something readable. */ void keypress_to_readable(char *buf, size_t len, struct keypress src) { size_t end = 0; keycode_t i = src.code; int mods = src.mods; const char *desc = keycode_find_desc(i); /* un-ktrl control characters if they don't have a description */ /* this is so that Tab (^I) doesn't get turned into ^I but gets * displayed as [Tab] */ if (i < 0x20 && !desc) { mods |= KC_MOD_CONTROL; i = UN_KTRL(i); } if (mods) { if (mods & KC_MOD_CONTROL && !(mods & ~KC_MOD_CONTROL) && i != '^') { strnfcat(buf, len, &end, "^"); } else { if (mods & KC_MOD_CONTROL) strnfcat(buf, len, &end, "Control-"); if (mods & KC_MOD_SHIFT) strnfcat(buf, len, &end, "Shift-"); if (mods & KC_MOD_ALT) strnfcat(buf, len, &end, "Alt-"); if (mods & KC_MOD_META) strnfcat(buf, len, &end, "Meta-"); if (mods & KC_MOD_KEYPAD) strnfcat(buf, len, &end, "Keypad-"); } } if (desc) { strnfcat(buf, len, &end, "%s", desc); } else { strnfcat(buf, len, &end, "%c", i); } /* Terminate */ buf[end] = '\0'; } angband-3.5.1/src/Makefile.nmake0000644000175000017500000000157512456456606015771 0ustar chriscchrisc# Windows Angband makefile for NMAKE and MS Visual C # # Debug build: NMAKE /F Makefile.nmake # Release build: NMAKE /F Makefile.nmake RELEASE=1 EXE = Angband.exe default: ..\$(EXE) exe: $(EXE) # tools and config CC = cl LINK = link RC = rc CFLAGS = /DWINDOWS /W3 /GF /GA /nologo LFLAGS = /nologo RCFLAGS = LIBS = Gdi32.lib User32.lib Comdlg32.lib Shell32.lib Winmm.lib !if defined(RELEASE) CFLAGS = $(CFLAGS) /O2 /Os /Gs /I. /I.. !else CFLAGS = $(CFLAGS) /Od /Zi /I. /I.. LFLAGS = $(LFLAGS) /debug !endif # files include Makefile.src OBJS = $(ANGFILES) $(ZFILES) main-win.o win\readdib.o RES = win\angband.res # rules .c.o: $(CC) /c /Fo$@ $(CFLAGS) $? $(RES) : win\angband.rc $(RC) $(RCFLAGS) $** $(EXE) : $(OBJS) $(RES) $(LINK) /out:$@ $(LFLAGS) $** $(LIBS) ..\$(EXE) : $(EXE) copy $** $@ clean: del $(OBJS) $(RES) $(EXE) angband-3.5.1/src/variable.c0000644000175000017500000001347612456456606015173 0ustar chriscchrisc/* * File: variable.c * Purpose: Various global variables * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" /* * Hack -- Link a copyright message into the executable */ const char *copyright = "Copyright (c) 1987-2013 Angband contributors.\n" "\n" "This work is free software; you can redistribute it and/or modify it\n" "under the terms of either:\n" "\n" "a) the GNU General Public License as published by the Free Software\n" " Foundation, version 2, or\n" "\n" "b) the Angband licence:\n" " This software may be copied and distributed for educational, research,\n" " and not for profit purposes provided that this copyright and statement\n" " are included in all such copies. Other copyrights may also apply.\n"; /* * Run-time arguments */ bool arg_wizard; /* Command arg -- Request wizard mode */ bool arg_rebalance; /* Command arg -- Rebalance monsters */ int arg_graphics; /* Command arg -- Request graphics mode */ bool arg_graphics_nice; /* Command arg -- Request nice graphics mode */ #ifdef ALLOW_BORG bool screensaver = FALSE; #endif /* ALLOW_BORG */ /* * Various things */ bool character_generated; /* The character exists */ bool character_dungeon; /* The character has a dungeon */ bool character_saved; /* The character was just saved to a savefile */ s16b character_xtra; /* Depth of the game in startup mode */ u32b seed_randart; /* Hack -- consistent random artifacts */ u32b seed_flavor; /* Hack -- consistent object colors */ u32b seed_town; /* Hack -- consistent town layout */ s32b turn; /* Current game turn */ int use_graphics; /* The "graphics" mode is enabled */ s16b signal_count; /* Hack -- Count interrupts */ bool msg_flag; /* Player has pending message */ u32b inkey_scan; /* See the "inkey()" function */ bool inkey_flag; /* See the "inkey()" function */ s16b o_max = 1; /* Number of allocated objects */ s16b o_cnt = 0; /* Number of live objects */ /* * Buffer to hold the current savefile name */ char savefile[1024]; /* * The array[ANGBAND_TERM_MAX] of window pointers */ term *angband_term[ANGBAND_TERM_MAX]; /* * The array[ANGBAND_TERM_MAX] of window names (modifiable?) * * ToDo: Make the names independent of ANGBAND_TERM_MAX. */ char angband_term_name[ANGBAND_TERM_MAX][16] = { VERSION_NAME, "Term-1", "Term-2", "Term-3", "Term-4", "Term-5", "Term-6", "Term-7" }; /* * Array[z_info->r_max] of monster lore */ monster_lore *l_list; /* * Array[MAX_STORES] of stores */ struct store *stores; /* * Flag to override which store is selected if in a knowledge menu */ int store_knowledge = STORE_NONE; /* * Array[RANDNAME_NUM_TYPES][num_names] of random names */ const char *** name_sections; /* * Specify attr/char pairs for visual special effects for project() */ byte gf_to_attr[GF_MAX][BOLT_MAX]; wchar_t gf_to_char[GF_MAX][BOLT_MAX]; /* * Specify color for inventory item text display (by tval) * Be sure to use "index & 0x7F" to avoid illegal access */ byte tval_to_attr[128]; /*** Player information ***/ /* * The player other record (static) */ static player_other player_other_body; /* * Pointer to the player other record */ player_other *op_ptr = &player_other_body; /* * The player info record (static) */ static player_type player_type_body; /* * Pointer to the player info record */ player_type *p_ptr = &player_type_body; /* * The vault generation arrays */ feature_type *f_info; object_kind *k_info; object_base *kb_info; /* * The artifact arrays */ artifact_type *a_info; /* * The ego-item arrays */ ego_item_type *e_info; /* * The monster race arrays */ monster_race *r_info; monster_base *rb_info; monster_pain *pain_messages; struct player_race *races; struct player_class *classes; struct vault *vaults; struct object_kind *objkinds; struct flavor *flavors; /* * The spell arrays */ spell_type *s_info; /* * The hints array */ struct hint *hints; /* * Array of pit types */ struct pit_profile *pit_info; /* * Hack -- The special Angband "System Suffix" * This variable is used to choose an appropriate "pref-xxx" file */ const char *ANGBAND_SYS = "xxx"; /* * Hack -- The special Angband "Graphics Suffix" * This variable is used to choose an appropriate "graf-xxx" file */ const char *ANGBAND_GRAF = "old"; /* * Various directories. These are no longer necessarily all subdirs of "lib" */ char *ANGBAND_DIR_APEX; char *ANGBAND_DIR_EDIT; char *ANGBAND_DIR_FILE; char *ANGBAND_DIR_HELP; char *ANGBAND_DIR_INFO; char *ANGBAND_DIR_SAVE; char *ANGBAND_DIR_PREF; char *ANGBAND_DIR_USER; char *ANGBAND_DIR_XTRA; /* * Various xtra/ subdirectories. */ char *ANGBAND_DIR_XTRA_FONT; char *ANGBAND_DIR_XTRA_GRAF; char *ANGBAND_DIR_XTRA_SOUND; char *ANGBAND_DIR_XTRA_ICON; /* * Here is a "pseudo-hook" used during calls to "get_item()" and * "show_inven()" and "show_equip()", and the choice window routines. */ byte item_tester_tval; /* * Here is a "hook" used during calls to "get_item()" and * "show_inven()" and "show_equip()", and the choice window routines. */ bool (*item_tester_hook)(const object_type*); /* * Use transparent tiles */ bool use_transparency = FALSE; /* * Sound hook (for playing FX). */ void (*sound_hook)(int sound); /* Delay in centiseconds before moving to allow another keypress */ /* Zero means normal instant movement. */ u16b lazymove_delay = 0; angband-3.5.1/src/main-win.c0000644000175000017500000034635312456456606015130 0ustar chriscchrisc/* * File: main-win.c * Purpose: Pseudo-UI for end-to-end testing. * * Copyright (c) 1997 Ben Harrison, Skirmantas Kligys, Robert Ruehlmann, * and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ /* * This file helps Angband work with Windows computers. * * To use this file, use an appropriate "Makefile" or "Project File", * make sure that "WINDOWS" and/or "WIN32" are defined somewhere, and * make sure to obtain various extra files as described below. * * The Windows version has been tested to compile with Visual C++ 5.0 * and 6.0, Cygwin 1.0, Borland C++ 5.5 command line tools, and lcc-win32. * * * See also "main-dos.c" and "main-ibm.c". * * * The "lib/pref/pref-win.prf" file contains keymaps, macro definitions, * and/or color redefinitions. * * The "lib/pref/font-win.prf" contains attr/char mappings for use with the * normal "*.fon" font files in the "lib/xtra/font/" directory. * * The "lib/pref/graf-win.prf" contains attr/char mappings for use with the * special "*.bmp" bitmap files in the "lib/xtra/graf/" directory, which * are activated by a menu item. * * * Compiling this file, and using the resulting executable, requires * several extra files not distributed with the standard Angband code. * If "USE_GRAPHICS" is defined, then "readdib.h" and "readdib.c" must * be placed into "src/", and the "8x8.bmp" bitmap file must be placed * into "lib/xtra/graf". In any case, some "*.fon" files (including * "8X13.FON" if nothing else) must be placed into "lib/xtra/font/". * If "USE_SOUND" is defined, then some special library (for example, * "winmm.lib") may need to be linked in, and desired "*.WAV" sound * files must be placed into "lib/xtra/sound/". All of these extra * files can be found in the "ext-win" archive. * * * The "Term_xtra_win_clear()" function should probably do a low-level * clear of the current window, and redraw the borders and other things, * if only for efficiency. XXX XXX XXX * * A simpler method is needed for selecting the "tile size" for windows. * XXX XXX XXX * * Special "Windows Help Files" can be placed into "lib/xtra/help/" for * use with the "winhelp.exe" program. These files *may* be available * at the ftp site somewhere, but I have not seen them. XXX XXX XXX * * ToDo: The screensaver mode should implement ScreenSaverConfigureDialog, * DefScreenSaverProc, and ScreenSaverProc. * * Initial framework (and most code) by Ben Harrison (benh@phial.com). * * Original code by Skirmantas Kligys (kligys@scf.usc.edu). * * Additional code by Ross E Becker (beckerr@cis.ohio-state.edu), * and Chris R. Martin (crm7479@tam2000.tamu.edu). * * Additional code by Robert Ruehlmann . */ #include "angband.h" #include "buildid.h" #include "cmds.h" #include "cave.h" #include "dungeon.h" #include "init.h" #include "files.h" #include "grafmode.h" #include "win/win-menu.h" #include "savefile.h" /* savefile_set_name() */ /* Make sure the winver allows the AlphaBlend function */ #if (WINVER < 0x0500) #define WINVER 0x0500 #endif #include #define uint unsigned int #if (defined(WINDOWS) && !defined(USE_SDL)) #define HAS_CLEANUP /* * Use HTML-Help. */ /* #define HTML_HELP */ #ifdef HTML_HELP # define HELP_GENERAL "angband.chm" # define HELP_SPOILERS "angband.chm" #else /* HTML_HELP */ # define HELP_GENERAL "angband.hlp" # define HELP_SPOILERS "spoilers.hlp" #endif /* HTML_HELP */ #ifdef ALLOW_BORG /* * Hack -- allow use of "screen saver" mode */ #define USE_SAVER #endif /* ALLOW_BORG */ /* * This may need to be removed for some compilers XXX XXX XXX */ #define STRICT /* * Exclude parts of WINDOWS.H that are not needed */ #define NOCOMM /* Comm driver APIs and definitions */ #define NOLOGERROR /* LogError() and related definitions */ #define NOPROFILER /* Profiler APIs */ #define NOLFILEIO /* _l* file I/O routines */ #define NOOPENFILE /* OpenFile and related definitions */ #define NORESOURCE /* Resource management */ #define NOATOM /* Atom management */ #define NOLANGUAGE /* Character test routines */ #define NOLSTRING /* lstr* string management routines */ #define NODBCS /* Double-byte character set routines */ #define NOKEYBOARDINFO /* Keyboard driver routines */ #define NOCOLOR /* COLOR_* color values */ #define NODRAWTEXT /* DrawText() and related definitions */ #define NOSCALABLEFONT /* Truetype scalable font support */ #define NOMETAFILE /* Metafile support */ #define NOSYSTEMPARAMSINFO /* SystemParametersInfo() and SPI_* definitions */ #define NODEFERWINDOWPOS /* DeferWindowPos and related definitions */ #define NOKEYSTATES /* MK_* message key state flags */ #define NOWH /* SetWindowsHook and related WH_* definitions */ #define NOCLIPBOARD /* Clipboard APIs and definitions */ #define NOICONS /* IDI_* icon IDs */ #define NOMDI /* MDI support */ #define NOHELP /* Help support */ /* Not defined since it breaks Borland C++ 5.5 */ /* #define NOCTLMGR */ /* Control management and controls */ /* * Exclude parts of WINDOWS.H that are not needed (Win32) */ #define WIN32_LEAN_AND_MEAN /*#define NONLS*/ /* All NLS defines and routines */ #define NOSERVICE /* All Service Controller routines, SERVICE_ equates, etc. */ #define NOKANJI /* Kanji support stuff. */ #define NOMCX /* Modem Configuration Extensions */ /* * Include the "windows" support file */ #include #include #ifndef GetWindowLongPtr #define GetWindowLongPtr GetWindowLong #endif #ifndef SetWindowLongPtr #define SetWindowLongPtr SetWindowLong #endif #ifndef GWLP_USERDATA #define GWLP_USERDATA GWL_USERDATA #endif #ifdef USE_SOUND /* * Exclude parts of MMSYSTEM.H that are not needed */ #define MMNODRV /* Installable driver support */ #define MMNOWAVE /* Waveform support */ #define MMNOMIDI /* MIDI support */ #define MMNOAUX /* Auxiliary audio support */ #define MMNOTIMER /* Timer support */ #define MMNOJOY /* Joystick support */ /*#define MMNOMCI */ /* MCI support */ #define MMNOMMIO /* Multimedia file I/O support */ #define MMNOMMSYSTEM /* General MMSYSTEM functions */ #include #endif /* USE_SOUND */ #include #include /* * Include the support for loading bitmaps */ #ifdef USE_GRAPHICS # include "win/readdib.h" #endif /* USE_GRAPHICS */ #include /* * Hack -- Fake declarations from "dos.h" XXX XXX XXX */ #define INVALID_FILE_NAME (DWORD)0xFFFFFFFF /* * Silliness in WIN32 drawing routine */ #define MoveTo(H,X,Y) MoveToEx(H, X, Y, NULL) /* * Silliness for Windows 95 */ #ifndef WS_EX_TOOLWINDOW # define WS_EX_TOOLWINDOW 0 #endif /* WS_EX_TOOLWINDOW */ /* * Foreground color bits (hard-coded by DOS) */ #define VID_BLACK 0x00 #define VID_BLUE 0x01 #define VID_GREEN 0x02 #define VID_CYAN 0x03 #define VID_RED 0x04 #define VID_MAGENTA 0x05 #define VID_YELLOW 0x06 #define VID_WHITE 0x07 /* * Bright text (hard-coded by DOS) */ #define VID_BRIGHT 0x08 /* * Background color bits (hard-coded by DOS) */ #define VUD_BLACK 0x00 #define VUD_BLUE 0x10 #define VUD_GREEN 0x20 #define VUD_CYAN 0x30 #define VUD_RED 0x40 #define VUD_MAGENTA 0x50 #define VUD_YELLOW 0x60 #define VUD_WHITE 0x70 /* * Blinking text (hard-coded by DOS) */ #define VUD_BRIGHT 0x80 /* * Font settings */ #define DEFAULT_FONT "8X12x.FON" /* * Extra "term" data * * Note the use of "font_want" for the names of the font file requested by * the user, and the use of "font_file" for the currently active font file. * * The "font_file" is uppercased, and takes the form "8X13.FON", while * "font_want" can be in almost any form as long as it could be construed * as attempting to represent the name of a font. */ #include "win/win-term.h" bool use_graphics_nice; /* * An array of term_data's */ static term_data data[MAX_TERM_DATA]; /* * Hack -- global "window creation" pointer */ static term_data *my_td; /* * Default window layout function */ int default_layout_win(term_data *data, int maxterms); /* * game in progress */ bool game_in_progress = FALSE; /* * note when "open"/"new" become valid */ bool initialized = FALSE; /* * screen paletted, i.e. 256 colors */ bool paletted = FALSE; /* * 16 colors screen, don't use RGB() */ bool colors16 = FALSE; static bool low_priority = FALSE; /* * Saved instance handle */ static HINSTANCE hInstance; /* * Yellow brush for the cursor */ static HBRUSH hbrYellow; /* * An icon */ static HICON hIcon; /* * A palette */ static HPALETTE hPal; #ifdef USE_SAVER /* * The screen saver window */ static HWND hwndSaver; static HANDLE screensaverSemaphore; static char saverfilename[1024]; static HMENU main_menu; #define MOUSE_SENS 10 #endif /* USE_SAVER */ static bool screensaver_active = FALSE; #ifdef USE_GRAPHICS /* * Flag set once "graphics" has been initialized */ static bool can_use_graphics = FALSE; /** * Flag set when switching tilesizes */ static bool change_tilesize = FALSE; /* * The global bitmap */ static DIBINIT infGraph; /* * The global bitmap mask */ static DIBINIT infMask; static int overdraw = 0; static int overdrawmax = -1; static int alphablend = 0; static BLENDFUNCTION blendfn; #endif /* USE_GRAPHICS */ #ifdef USE_SOUND /* * Flag set once "sound" has been initialized */ static bool can_use_sound = FALSE; #define SAMPLE_MAX 16 /* * An array of sound file names */ static char *sound_file[MSG_MAX][SAMPLE_MAX]; #endif /* USE_SOUND */ /* * Full path to ANGBAND.INI */ static char *ini_file = NULL; /* * Name of application */ static const char *AppName = VERSION_NAME; /* * Name of sub-window type */ static const char *AngList = "AngList"; /* * The "complex" color values */ static COLORREF win_clr[MAX_COLORS]; /* * The "simple" color values * * See "main-ibm.c" for original table information * * The entries below are taken from the "color bits" defined above. * * Note that many of the choices below suck, but so do crappy monitors. */ static byte win_pal[MAX_COLORS] = { VID_BLACK, /* Dark */ VID_WHITE, /* White */ VID_CYAN, /* Slate XXX */ VID_RED | VID_BRIGHT, /* Orange XXX */ VID_RED, /* Red */ VID_GREEN, /* Green */ VID_BLUE, /* Blue */ VID_YELLOW, /* Umber XXX */ VID_BLACK | VID_BRIGHT, /* Light Dark */ VID_CYAN | VID_BRIGHT, /* Light Slate XXX */ VID_MAGENTA, /* Violet XXX */ VID_YELLOW | VID_BRIGHT, /* Yellow */ VID_MAGENTA | VID_BRIGHT, /* Light Red XXX */ VID_GREEN | VID_BRIGHT, /* Light Green */ VID_BLUE | VID_BRIGHT, /* Light Blue */ VID_YELLOW /* Light Umber XXX */ }; #ifdef SUPPORT_GAMMA static int gamma_correction; #endif /* SUPPORT_GAMMA */ #include "cmds.h" #include "textui.h" static game_command cmd = { CMD_NULL, 0, {{NULL}} }; #if 0 /* * Hack -- given a pathname, point at the filename */ static const char *extract_file_name(const char *s) { const char *p; /* Start at the end */ p = s + strlen(s) - 1; /* Back up to divider */ while ((p >= s) && (*p != ':') && (*p != '\\')) p--; /* Return file name */ return (p+1); } #endif /* 0 */ static void show_win_error(void) { LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); MessageBox(NULL, lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION); LocalFree(lpMsgBuf); } /* * Hack -- given a simple filename, extract the "font size" info * * Return a pointer to a static buffer holding the capitalized base name. */ static char *analyze_font(char *path, int *wp, int *hp) { int wid, hgt; char *s, *p; /* Start at the end */ p = path + strlen(path) - 1; /* Back up to divider */ while ((p >= path) && (*p != ':') && (*p != '\\')) --p; /* Advance to file name */ ++p; /* Capitalize */ for (s = p; *s; ++s) { /* Capitalize (be paranoid) */ if (islower((unsigned char)*s)) *s = toupper((unsigned char)*s); } /* Find first 'X' */ s = strchr(p, 'X'); /* Extract font width */ wid = atoi(p); /* Extract height */ hgt = s ? atoi(s+1) : 0; /* Save results */ (*wp) = wid; (*hp) = hgt; /* Result */ return (p); } /* * Check for existance of a directory */ static bool check_dir(const char *s) { int i; char path[1024]; DWORD attrib; /* Copy it */ my_strcpy(path, s, sizeof(path)); /* Check length */ i = strlen(path); /* Remove trailing backslash */ if (i && (path[i-1] == '\\')) path[--i] = '\0'; /* Examine */ attrib = GetFileAttributes(path); /* Require valid filename */ if (attrib == INVALID_FILE_NAME) return (FALSE); /* Require directory */ if (!(attrib & FILE_ATTRIBUTE_DIRECTORY)) return (FALSE); /* Success */ return (TRUE); } /* * Validate a file */ static void validate_file(const char *s) { /* Verify or fail */ if (!file_exists(s)) quit_fmt("Cannot find required file:\n%s", s); } /* * Validate a directory */ static void validate_dir(const char *s) { /* Verify or fail */ if (!check_dir(s)) { quit_fmt("Cannot find required directory:\n%s", s); } } /* * Get the "size" for a window */ static void term_getsize(term_data *td) { RECT rc; int wid, hgt; /* Paranoia */ if (td->cols < 1) td->cols = 1; if (td->rows < 1) td->rows = 1; if (use_graphics_nice) { if (current_graphics_mode && current_graphics_mode->grafID) { if (current_graphics_mode->file[0]) { char *end; td->tile_wid = strtol(current_graphics_mode->file,&end,10); td->tile_hgt = strtol(end+1,NULL,10); } else { td->tile_wid = current_graphics_mode->cell_width; td->tile_hgt = current_graphics_mode->cell_height; } if ((td->tile_wid == 0) || (td->tile_hgt == 0)) { td->tile_wid = current_graphics_mode->cell_width; td->tile_hgt = current_graphics_mode->cell_height; } if ((td->tile_wid == 0) || (td->tile_hgt == 0)) { td->tile_wid = td->font_wid; td->tile_hgt = td->font_hgt; } } else { /* Reset the tile info */ td->tile_wid = td->font_wid; td->tile_hgt = td->font_hgt; } tile_width = 1; tile_height = 1; if ((td->tile_hgt >= td->font_hgt * 3) && (td->tile_wid >= td->font_wid * 3)) { tile_width = 3; tile_height = 3; td->tile_wid /= 3; td->tile_hgt /= 3; } else if ((td->tile_hgt >= td->font_hgt * 2) && (td->tile_wid >= td->font_wid * 2)) { tile_width = 2; tile_height = 2; td->tile_wid /= 2; td->tile_hgt /= 2; } if (td->tile_wid >= td->font_wid * 2) { tile_width *= 2; td->tile_wid /= 2; } if (td->tile_wid < td->font_wid) td->tile_wid = td->font_wid; if (td->tile_hgt < td->font_hgt) td->tile_hgt = td->font_hgt; } /* Window sizes */ wid = td->cols * td->tile_wid + td->size_ow1 + td->size_ow2; hgt = td->rows * td->tile_hgt + td->size_oh1 + td->size_oh2; /* Client window size */ rc.left = 0; rc.right = rc.left + wid; rc.top = 0; rc.bottom = rc.top + hgt; /* Get total window size (without menu for sub-windows) */ AdjustWindowRectEx(&rc, td->dwStyle, TRUE, td->dwExStyle); /* Total size */ td->size_wid = rc.right - rc.left; td->size_hgt = rc.bottom - rc.top; /* See CreateWindowEx */ if (!td->w) return; /* Extract actual location */ GetWindowRect(td->w, &rc); /* Save the location */ td->pos_x = rc.left; td->pos_y = rc.top; } /* * Write the "prefs" for a single term */ static void save_prefs_aux(term_data *td, const char *sec_name) { char buf[1024]; RECT rc; WINDOWPLACEMENT lpwndpl; /* Paranoia */ if (!td->w) return; /* Visible */ strcpy(buf, td->visible ? "1" : "0"); WritePrivateProfileString(sec_name, "Visible", buf, ini_file); /* Font */ strcpy(buf, td->font_file ? td->font_file : DEFAULT_FONT); WritePrivateProfileString(sec_name, "Font", buf, ini_file); /* Bizarre */ strcpy(buf, td->bizarre ? "1" : "0"); WritePrivateProfileString(sec_name, "Bizarre", buf, ini_file); /* Tile size (x) */ wsprintf(buf, "%d", td->tile_wid); WritePrivateProfileString(sec_name, "TileWid", buf, ini_file); /* Tile size (y) */ wsprintf(buf, "%d", td->tile_hgt); WritePrivateProfileString(sec_name, "TileHgt", buf, ini_file); /* Window size (x) */ wsprintf(buf, "%d", td->cols); WritePrivateProfileString(sec_name, "NumCols", buf, ini_file); /* Window size (y) */ wsprintf(buf, "%d", td->rows); WritePrivateProfileString(sec_name, "NumRows", buf, ini_file); /* Get window placement and dimensions */ lpwndpl.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(td->w, &lpwndpl); /* Acquire position in *normal* mode (not minimized) */ rc = lpwndpl.rcNormalPosition; /* Get information about the placement of the window */ if (lpwndpl.flags & SW_SHOWMAXIMIZED) td->maximized = TRUE; else td->maximized = FALSE; /* Window position (x) */ wsprintf(buf, "%d", rc.left); WritePrivateProfileString(sec_name, "PositionX", buf, ini_file); /* Window position (y) */ wsprintf(buf, "%d", rc.top); WritePrivateProfileString(sec_name, "PositionY", buf, ini_file); /* Maximized */ strcpy(buf, td->maximized ? "1" : "0"); WritePrivateProfileString(sec_name, "Maximized", buf, ini_file); } /* * Write the "prefs" * * We assume that the windows have all been initialized */ static void save_prefs(void) { int i; char buf[128]; /* Save the "arg_graphics" flag */ sprintf(buf, "%d", arg_graphics); WritePrivateProfileString("Angband", "Graphics", buf, ini_file); /* Save the "use_graphics_nice" flag */ strcpy(buf, arg_graphics_nice ? "1" : "0"); WritePrivateProfileString("Angband", "Graphics_Nice", buf, ini_file); /* Save the tile width */ wsprintf(buf, "%d", tile_width); WritePrivateProfileString("Angband", "TileWidth", buf, ini_file); /* Save the tile height */ wsprintf(buf, "%d", tile_height); WritePrivateProfileString("Angband", "TileHeight", buf, ini_file); /* Save window prefs */ for (i = 0; i < MAX_TERM_DATA; i++) { term_data *td = &data[i]; sprintf(buf, "Term-%d", i); save_prefs_aux(td, buf); } } /* * Load the "prefs" for a single term */ static void load_prefs_aux(term_data *td, const char *sec_name) { char tmp[1024]; int wid, hgt; /* Visible */ td->visible = (GetPrivateProfileInt(sec_name, "Visible", td->visible, ini_file) != 0); /* Maximized */ td->maximized = (GetPrivateProfileInt(sec_name, "Maximized", td->maximized, ini_file) != 0); /* Desired font, with default */ GetPrivateProfileString(sec_name, "Font", DEFAULT_FONT, tmp, 127, ini_file); /* Bizarre */ td->bizarre = (GetPrivateProfileInt(sec_name, "Bizarre", TRUE, ini_file) != 0); /* Analyze font, save desired font name */ td->font_want = string_make(analyze_font(tmp, &wid, &hgt)); /* Tile size */ td->tile_wid = GetPrivateProfileInt(sec_name, "TileWid", wid, ini_file); td->tile_hgt = GetPrivateProfileInt(sec_name, "TileHgt", hgt, ini_file); /* Window size */ td->cols = GetPrivateProfileInt(sec_name, "NumCols", td->cols, ini_file); td->rows = GetPrivateProfileInt(sec_name, "NumRows", td->rows, ini_file); /* Window position */ td->pos_x = GetPrivateProfileInt(sec_name, "PositionX", td->pos_x, ini_file); td->pos_y = GetPrivateProfileInt(sec_name, "PositionY", td->pos_y, ini_file); } /* * Load the "prefs" */ static void load_prefs(void) { int i; char buf[1024]; bool first_start; if (file_exists(ini_file)) { first_start = FALSE; } else { first_start = TRUE; } /* Extract the "arg_graphics" flag */ arg_graphics = GetPrivateProfileInt("Angband", "Graphics", GRAPHICS_NONE, ini_file); /* Extract the "arg_graphics_nice" flag */ arg_graphics_nice = GetPrivateProfileInt("Angband", "Graphics_Nice", TRUE, ini_file); /* Extract the tile width */ tile_width = GetPrivateProfileInt("Angband", "TileWidth", FALSE, ini_file); /* Extract the tile height */ tile_height = GetPrivateProfileInt("Angband", "TileHeight", FALSE, ini_file); /* Extract the "arg_wizard" flag */ arg_wizard = (GetPrivateProfileInt("Angband", "Wizard", 0, ini_file) != 0); /* Extract the "arg_rebalance" flag */ arg_rebalance = (GetPrivateProfileInt("Angband", "Rebalance", FALSE, ini_file) != 0); #ifdef SUPPORT_GAMMA /* Extract the gamma correction */ gamma_correction = GetPrivateProfileInt("Angband", "Gamma", 0, ini_file); #endif /* SUPPORT_GAMMA */ /* Load window prefs */ for (i = 0; i < MAX_TERM_DATA; i++) { term_data *td = &data[i]; sprintf(buf, "Term-%d", i); load_prefs_aux(td, buf); } if (first_start) { default_layout_win(data,MAX_TERM_DATA); } /* Paranoia */ if (data[0].cols < 80) data[0].cols = 80; if (data[0].rows < 24) data[0].rows = 24; } #ifdef USE_SOUND /* * XXX XXX XXX - Taken from files.c. * * Extract "tokens" from a buffer * * This function uses "whitespace" as delimiters, and treats any amount of * whitespace as a single delimiter. We will never return any empty tokens. * When given an empty buffer, or a buffer containing only "whitespace", we * will return no tokens. We will never extract more than "num" tokens. * * By running a token through the "text_to_ascii()" function, you can allow * that token to include (encoded) whitespace, using "\s" to encode spaces. * * We save pointers to the tokens in "tokens", and return the number found. */ static s16b tokenize_whitespace(char *buf, s16b num, char **tokens) { int k = 0; char *s = buf; /* Process */ while (k < num) { char *t; /* Skip leading whitespace */ for ( ; *s && isspace((unsigned char)*s); ++s) /* loop */; /* All done */ if (!*s) break; /* Find next whitespace, if any */ for (t = s; *t && !isspace((unsigned char)*t); ++t) /* loop */; /* Nuke and advance (if necessary) */ if (*t) *t++ = '\0'; /* Save the token */ tokens[k++] = s; /* Advance */ s = t; } /* Count */ return (k); } static void load_sound_prefs(void) { int i, j, num; char tmp[1024]; char ini_path[1024]; char wav_path[1024]; char *zz[SAMPLE_MAX]; /* Access the sound.cfg */ path_build(ini_path, sizeof(ini_path), ANGBAND_DIR_XTRA_SOUND, "sound.cfg"); for (i = 0; i < MSG_MAX; i++) { const char *sound_name = message_sound_name(i); /* Ignore empty sound strings */ if (!sound_name[0]) continue; GetPrivateProfileString("Sound", sound_name, "", tmp, sizeof(tmp), ini_path); num = tokenize_whitespace(tmp, SAMPLE_MAX, zz); for (j = 0; j < num; j++) { /* Access the sound */ path_build(wav_path, sizeof(wav_path), ANGBAND_DIR_XTRA_SOUND, zz[j]); /* Save the sound filename, if it exists */ if (file_exists(wav_path)) sound_file[i][j] = string_make(zz[j]); } } } #endif /* USE_SOUND */ /* * Create the new global palette based on the bitmap palette * (if any), and the standard 16 entry palette derived from * "win_clr[]" which is used for the basic 16 Angband colors. * * This function is never called before all windows are ready. * * This function returns FALSE if the new palette could not be * prepared, which should normally be a fatal error. XXX XXX * * Note that only some machines actually use a "palette". */ static int new_palette(void) { #ifdef USE_GRAPHICS HPALETTE hBmPal; #endif /* USE_GRAPHICS */ HPALETTE hNewPal; HDC hdc; int i, nEntries; int pLogPalSize; LPLOGPALETTE pLogPal; LPPALETTEENTRY lppe; term_data *td; /* This makes no sense */ if (!paletted) return (TRUE); /* No bitmap */ lppe = NULL; nEntries = 0; #ifdef USE_GRAPHICS /* Check the bitmap palette */ hBmPal = infGraph.hPalette; /* Use the bitmap */ if (hBmPal) { lppe = mem_alloc(256 * sizeof(PALETTEENTRY)); nEntries = GetPaletteEntries(hBmPal, 0, 255, lppe); if ((nEntries == 0) || (nEntries > 220)) { /* Warn the user */ plog("Please switch to high- or true-color mode."); /* Cleanup */ mem_free(lppe); /* Fail */ return (FALSE); } } #endif /* USE_GRAPHICS */ /* Size of palette */ pLogPalSize = sizeof(LOGPALETTE) + (nEntries + 16) * sizeof(PALETTEENTRY); /* Allocate palette */ pLogPal = (LPLOGPALETTE)mem_alloc(pLogPalSize); /* Version */ pLogPal->palVersion = 0x300; /* Make room for bitmap and normal data */ pLogPal->palNumEntries = nEntries + 16; /* Save the bitmap data */ for (i = 0; i < nEntries; i++) { pLogPal->palPalEntry[i] = lppe[i]; } /* Save the normal data */ for (i = 0; i < BASIC_COLORS; i++) { LPPALETTEENTRY p; /* Access the entry */ p = &(pLogPal->palPalEntry[i+nEntries]); /* Save the colors */ p->peRed = GetRValue(win_clr[i]); p->peGreen = GetGValue(win_clr[i]); p->peBlue = GetBValue(win_clr[i]); #ifdef SUPPORT_GAMMA if (gamma_correction > 0) { p->peRed = gamma_table[p->peRed]; p->peGreen = gamma_table[p->peGreen]; p->peBlue = gamma_table[p->peBlue]; } #endif /* SUPPORT_GAMMA */ /* Save the flags */ p->peFlags = PC_NOCOLLAPSE; } /* Free something */ if (lppe) mem_free(lppe); /* Create a new palette, or fail */ hNewPal = CreatePalette(pLogPal); if (!hNewPal) quit("Cannot create palette!"); /* Free the palette */ mem_free(pLogPal); /* Main window */ td = &data[0]; /* Realize the palette */ hdc = GetDC(td->w); SelectPalette(hdc, hNewPal, 0); i = RealizePalette(hdc); ReleaseDC(td->w, hdc); if (i == 0) quit("Cannot realize palette!"); /* Sub-windows */ for (i = 1; i < MAX_TERM_DATA; i++) { td = &data[i]; hdc = GetDC(td->w); SelectPalette(hdc, hNewPal, 0); ReleaseDC(td->w, hdc); } /* Delete old palette */ if (hPal) DeleteObject(hPal); /* Save new palette */ hPal = hNewPal; /* Success */ return (TRUE); } #ifdef USE_GRAPHICS /* * Initialize graphics */ static bool init_graphics(void) { /* Initialize once */ /* if (can_use_graphics != arg_graphics) */ { char buf[1024]; int wid, hgt; const char *name; graphics_mode *mode = NULL; if (arg_graphics) { mode = get_graphics_mode(arg_graphics); } if (!mode) { mode = get_graphics_mode(1); } if (mode) { if (!mode->pref[0]) { plog_fmt("invalid tile prefname '%s'", mode->menuname); return FALSE; } wid = mode->cell_width; hgt = mode->cell_height; if ((wid < 2) || (hgt < 2)) { plog_fmt("invalid tile dimensions in tileset: '%s'", mode->menuname); return FALSE; } name = mode->file; ANGBAND_GRAF = mode->pref; use_transparency = FALSE; overdraw = mode->overdrawRow; overdrawmax = mode->overdrawMax; alphablend = mode->alphablend; current_graphics_mode = mode; } else { wid = 8; hgt = 8; name = "8x8.png"; ANGBAND_GRAF = "old"; } /* Access the bitmap file */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, name); /* Load the image or quit */ if (alphablend) { /* see if the given file is already pre mulitiplied */ if (strstr(name, "_pre")) { /* if so, just load it */ if (!ReadDIB2_PNG(data[0].w, buf, &infGraph, NULL, FALSE)) { plog_fmt("Cannot read file '%s'", name); return FALSE; } } else { /* if not, see if there is already a premultiplied tileset */ /* the there is load it */ char *ext; char modname[1024]; bool have_space = 0; my_strcpy(modname, buf,1024); ext = strstr(modname,".png"); /* make sure we have enough space to make the desired name */ if (ext && ((ext-buf) < 1019)) { have_space = TRUE; strcpy(ext, "_pre.png"); if (!file_exists(modname)) { /* if the file does not exist, mark that we need to * create it, so clear the extension pointer */ ext = NULL; } else if (file_newer(buf, modname)) { /* if the base file is newer than the premultiplied file, * mark that we need to recreate the premultiplied file. */ ext = NULL; } } if (ext && have_space) { /* at this point we know the file exists, so load it */ if (!ReadDIB2_PNG(data[0].w, modname, &infGraph, NULL, FALSE)) { plog_fmt("Cannot read premultiplied version of file '%s'", name); return FALSE; } } else /* if not, load the base file and premultiply it */ { if (!ReadDIB2_PNG(data[0].w, buf, &infGraph, NULL, TRUE)) { plog_fmt("Cannot read file '%s'", name); return FALSE; } /* save the premultiplied file */ /* saving alpha without a mask is not working yet if (SavePNG(data[0].w, modname, infGraph.hBitmap,infGraph.hPalette, 1, NULL, infGraph.ImageWidth, infGraph.ImageHeight, FALSE) < 0) { plog_fmt("Cannot write premultiplied version of file '%s'", name); }*/ } } } else { if (!ReadDIB2_PNG(data[0].w, buf, &infGraph, &infMask, FALSE)) { plog_fmt("Cannot read file '%s'", name); return FALSE; } } /* Save the new sizes */ infGraph.CellWidth = wid; infGraph.CellHeight = hgt; /* Activate a palette */ if (!new_palette()) { /* Free bitmap XXX XXX XXX */ /* Oops */ plog("Cannot activate palette!"); return (FALSE); } /* Graphics available */ can_use_graphics = arg_graphics; } /* Result */ return (can_use_graphics); } #endif /* USE_GRAPHICS */ #ifdef USE_SOUND /* * Initialize sound */ static bool init_sound(void) { /* Initialize once */ if (!can_use_sound) { /* Load the prefs */ load_sound_prefs(); /* Sound available */ can_use_sound = TRUE; } /* Result */ return (can_use_sound); } #endif /* USE_SOUND */ /* * Resize a window */ static void term_window_resize(const term_data *td) { /* Require window */ if (!td->w) return; /* Resize the window */ SetWindowPos(td->w, 0, 0, 0, td->size_wid, td->size_hgt, SWP_NOMOVE | SWP_NOZORDER); /* Redraw later */ InvalidateRect(td->w, NULL, TRUE); } /* * Remove a font, given its filename. */ static void term_remove_font(const char *name) { char buf[1024]; /* Build path to the file */ my_strcpy(buf, ANGBAND_DIR_XTRA_FONT, sizeof(buf)); my_strcat(buf, "\\", sizeof(buf)); my_strcat(buf, name, sizeof(buf)); /* Remove it */ RemoveFontResource(buf); /* Notify other applications of the change XXX */ PostMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); return; } /* * Force the use of a new "font file" for a term_data * * This function may be called before the "window" is ready * * This function returns zero only if everything succeeds. * * Note that the "font name" must be capitalized!!! */ static errr term_force_font(term_data *td, const char *path) { int i; int wid, hgt; char *base; char buf[1024]; /* Check we have a path */ if (!path) return (1); /* Forget the old font (if needed) */ if (td->font_id) DeleteObject(td->font_id); /* Forget old font */ if (td->font_file) { bool used = FALSE; /* Scan windows */ for (i = 0; i < MAX_TERM_DATA; i++) { /* Check "screen" */ if ((td != &data[i]) && (data[i].font_file) && (streq(data[i].font_file, td->font_file))) { used = TRUE; } } /* Remove unused font resources */ if (!used) term_remove_font(td->font_file); /* Free the old name */ string_free(td->font_file); /* Forget it */ td->font_file = NULL; } /* Local copy */ my_strcpy(buf, path, sizeof(buf)); /* Analyze font path */ base = analyze_font(buf, &wid, &hgt); /* Verify suffix */ if (!suffix(base, ".FON")) return (1); /* Verify file */ if (!file_exists(buf)) return (1); /* Load the new font */ if (!AddFontResourceEx(buf, FR_PRIVATE, 0)) return (1); /* Save new font name */ td->font_file = string_make(base); /* Remove the "suffix" */ base[strlen(base)-4] = '\0'; /* Create the font (using the 'base' of the font file name!) */ td->font_id = CreateFont(hgt, wid, 0, 0, FW_DONTCARE, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH | FF_DONTCARE, base); /* Hack -- Unknown size */ if (!wid || !hgt) { HDC hdcDesktop; HFONT hfOld; TEXTMETRIC tm; /* all this trouble to get the cell size */ hdcDesktop = GetDC(HWND_DESKTOP); hfOld = SelectObject(hdcDesktop, td->font_id); GetTextMetrics(hdcDesktop, &tm); SelectObject(hdcDesktop, hfOld); ReleaseDC(HWND_DESKTOP, hdcDesktop); /* Font size info */ wid = tm.tmAveCharWidth; hgt = tm.tmHeight; } /* Save the size info */ td->font_wid = wid; td->font_hgt = hgt; /* Success */ return (0); } /* * Allow the user to change the font for this window. */ static void term_change_font(term_data *td) { OPENFILENAME ofn; char tmp[1024] = ""; /* Extract a default if possible */ if (td->font_file) strcpy(tmp, td->font_file); /* Ask for a choice */ memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = data[0].w; ofn.lpstrFilter = "Angband Font Files (*.fon)\0*.fon\0"; ofn.nFilterIndex = 1; ofn.lpstrFile = tmp; ofn.nMaxFile = 128; ofn.lpstrInitialDir = ANGBAND_DIR_XTRA_FONT; ofn.Flags = OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; ofn.lpstrDefExt = "fon"; /* Force choice if legal */ if (GetOpenFileName(&ofn)) { /* Force the font */ if (term_force_font(td, tmp)) { /* Access the standard font file */ path_build(tmp, sizeof(tmp), ANGBAND_DIR_XTRA_FONT, DEFAULT_FONT); /* Force the use of that font */ (void)term_force_font(td, tmp); /* Reset the tile info */ td->tile_wid = td->font_wid; td->tile_hgt = td->font_hgt; } /* HACK - Assume bizarre */ td->bizarre = TRUE; /* Reset the tile info */ if (!td->tile_wid || !td->tile_hgt) { td->tile_wid = td->font_wid; td->tile_hgt = td->font_hgt; } /* Analyze the font */ term_getsize(td); /* Resize the window */ term_window_resize(td); } } static void windows_map_aux(void); /* * Hack -- redraw a term_data */ static void term_data_redraw(term_data *td) { if (td->map_active) { /* Redraw the map */ windows_map_aux(); } else { /* Activate the term */ Term_activate(&td->t); /* Redraw the contents */ Term_redraw(); /* Restore the term */ Term_activate(term_screen); } } /* * Hack -- redraw a term_data */ static void term_data_redraw_section(term_data *td, int x1, int y1, int x2, int y2) { /* Activate the term */ Term_activate(&td->t); /* Redraw the area */ Term_redraw_section(x1, y1, x2, y2); /* Restore the term */ Term_activate(term_screen); } /*** Function hooks needed by "Term" ***/ #if 0 /* * Initialize a new Term */ static void Term_init_win(term *t) { /* XXX Unused */ } /* * Nuke an old Term */ static void Term_nuke_win(term *t) { /* XXX Unused */ } #endif /* 0 */ static errr Term_pict_win(int x, int y, int n, const int *ap, const wchar_t *cp, const int *tap, const wchar_t *tcp); static errr Term_pict_win_alpha(int x, int y, int n, const int *ap, const wchar_t *cp, const int *tap, const wchar_t *tcp); /* * React to global changes */ static errr Term_xtra_win_react(void) { int i; /* Get the main window */ term_data *td = &data[0]; /* Simple color */ if (colors16) { /* Save the default colors */ for (i = 0; i < MAX_COLORS; i++) { /* Simply accept the desired colors */ win_pal[i] = angband_color_table[i][0]; } } /* Complex color */ else { COLORREF code; byte rv, gv, bv; bool change = FALSE; /* Save the default colors */ for (i = 0; i < MAX_COLORS; i++) { /* Extract desired values */ rv = angband_color_table[i][1]; gv = angband_color_table[i][2]; bv = angband_color_table[i][3]; #ifdef SUPPORT_GAMMA if (gamma_correction > 0) { rv = gamma_table[rv]; gv = gamma_table[gv]; bv = gamma_table[bv]; } #endif /* SUPPORT_GAMMA */ /* Extract a full color code */ code = PALETTERGB(rv, gv, bv); /* Activate changes */ if (win_clr[i] != code) { /* Note the change */ change = TRUE; /* Apply the desired color */ win_clr[i] = code; } } /* Activate the palette if needed */ if (change) (void)new_palette(); } #ifdef USE_SOUND /* Initialize sound (if needed) */ if (OPT(use_sound) && !init_sound()) { /* Warning */ plog("Cannot initialize sound!"); /* Cannot enable */ OPT(use_sound) = FALSE; } #endif /* USE_SOUND */ #ifdef USE_GRAPHICS /* Handle "arg_graphics_nice" */ if (use_graphics_nice != arg_graphics_nice) { /* Change setting */ use_graphics_nice = arg_graphics_nice; /* HACK - Assume bizarre */ td->bizarre = TRUE; /* Analyze the font */ term_getsize(td); /* Resize the window */ term_window_resize(td); } /* Handle "arg_graphics" */ if (use_graphics != arg_graphics) { /* Switch off transparency */ use_transparency = FALSE; /* Free the bitmap stuff */ FreeDIB(&infGraph); FreeDIB(&infMask); /* Initialize (if needed) */ if (arg_graphics && !init_graphics()) { /* Warning */ plog("Cannot initialize graphics!"); /* Cannot enable */ arg_graphics = GRAPHICS_NONE; } else { if (alphablend || overdraw) { td->t.pict_hook = Term_pict_win_alpha; } else { td->t.pict_hook = Term_pict_win; } } /* make sure the current graphics mode is set */ current_graphics_mode = get_graphics_mode(arg_graphics); /* Change setting */ use_graphics = arg_graphics; if (use_graphics_nice) { /* HACK - Assume bizarre */ td->bizarre = TRUE; /* Analyze the font */ term_getsize(td); /* Resize the window */ term_window_resize(td); } /* Reset visuals */ reset_visuals(TRUE); } /* Handle "change_tilesize" */ if (change_tilesize) { /* Reset visuals */ reset_visuals(TRUE); /* Reset the panel */ verify_panel(); /* Reset the flag */ change_tilesize = FALSE; } #endif /* USE_GRAPHICS */ /* Clean up windows */ for (i = 0; i < MAX_TERM_DATA; i++) { term *old = Term; term_data *td = &data[i]; /* Update resized windows */ if ((td->cols != td->t.wid) || (td->rows != td->t.hgt)) { /* Activate */ Term_activate(&td->t); /* Hack -- Resize the term */ Term_resize(td->cols, td->rows); /* Redraw the contents */ Term_redraw(); /* Restore */ Term_activate(old); } } /* Success */ return (0); } /* * Process at least one event */ static errr Term_xtra_win_event(int v) { MSG msg; /* Wait for an event */ if (v) { int i = 0; while (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { /* Do animation updates (once every ten iterations), then * sleep 0.02s and try again */ if (i == 0) idle_update(); Sleep(20); i = (i + 1) % 10; } TranslateMessage(&msg); DispatchMessage(&msg); } /* Check for an event */ else if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } /* Success */ return 0; } /* * Process all pending events */ static errr Term_xtra_win_flush(void) { MSG msg; /* Process all pending events */ while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } /* Success */ return (0); } /* * Hack -- clear the screen * * Make this more efficient XXX XXX XXX */ static errr Term_xtra_win_clear(void) { term_data *td = (term_data*)(Term->data); HDC hdc; RECT rc; /* Rectangle to erase */ rc.left = td->size_ow1; rc.right = rc.left + td->cols * td->tile_wid; rc.top = td->size_oh1; rc.bottom = rc.top + td->rows * td->tile_hgt; /* Erase it */ hdc = GetDC(td->w); SetBkColor(hdc, RGB(0, 0, 0)); SelectObject(hdc, td->font_id); ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL); ReleaseDC(td->w, hdc); /* Success */ return 0; } /* * Hack -- make a noise */ static errr Term_xtra_win_noise(void) { MessageBeep(MB_ICONASTERISK); return (0); } /* * Hack -- make a sound */ static void Term_xtra_win_sound(int v) { #ifdef USE_SOUND int i; char buf[1024]; MCI_OPEN_PARMS op; MCI_PLAY_PARMS pp; MCIDEVICEID pDevice; #endif /* USE_SOUND */ /* Illegal sound */ if ((v < 0) || (v >= MSG_MAX)) return; #ifdef USE_SOUND /* Count the samples */ for (i = 0; i < SAMPLE_MAX; i++) { if (!sound_file[v][i]) break; } /* No sample */ if (i == 0) return; /* Build the path */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_SOUND, sound_file[v][Rand_simple(i)]); /* Check for file type */ if (streq(buf + strlen(buf) - 3, "mp3")) { op.dwCallback = 0; op.lpstrDeviceType = (char*)MCI_ALL_DEVICE_ID; op.lpstrElementName = buf; op.lpstrAlias = NULL; /* Open command */ mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_WAIT, (DWORD)&op); pDevice = op.wDeviceID; /* Play command */ pp.dwCallback = 0; pp.dwFrom = 0; mciSendCommand(pDevice, MCI_PLAY, MCI_NOTIFY | MCI_FROM, (DWORD)&pp); } else { /* Play the sound, catch errors */ PlaySound(buf, 0, SND_FILENAME | SND_ASYNC); } #else /* USE_SOUND */ /* Oops */ return; #endif /* USE_SOUND */ } /* * Delay for "x" milliseconds */ static int Term_xtra_win_delay(int v) { /* Sleep */ if (v > 0) Sleep(v); /* Success */ return (0); } /* * Do a "special thing" */ static errr Term_xtra_win(int n, int v) { /* Handle a subset of the legal requests */ switch (n) { /* Make a bell sound */ case TERM_XTRA_NOISE: { return (Term_xtra_win_noise()); } /* Process random events */ case TERM_XTRA_BORED: { return (Term_xtra_win_event(0)); } /* Process an event */ case TERM_XTRA_EVENT: { return (Term_xtra_win_event(v)); } /* Flush all events */ case TERM_XTRA_FLUSH: { return (Term_xtra_win_flush()); } /* Clear the screen */ case TERM_XTRA_CLEAR: { return (Term_xtra_win_clear()); } /* React to global changes */ case TERM_XTRA_REACT: { return (Term_xtra_win_react()); } /* Delay for some milliseconds */ case TERM_XTRA_DELAY: { return (Term_xtra_win_delay(v)); } } /* Oops */ return 1; } /* * Low level graphics (Assumes valid input). * * Draw a "cursor" at (x,y), using a "yellow box". */ static errr Term_curs_win(int x, int y) { term_data *td = (term_data*)(Term->data); RECT rc; HDC hdc; int tile_wid, tile_hgt; if (td->map_active) { tile_wid = td->map_tile_wid; tile_hgt = td->map_tile_hgt; } else { tile_wid = td->tile_wid; tile_hgt = td->tile_hgt; } /* Frame the grid */ rc.left = x * tile_wid + td->size_ow1; rc.right = rc.left + tile_wid; rc.top = y * tile_hgt + td->size_oh1; rc.bottom = rc.top + tile_hgt; /* Cursor is done as a yellow "box" */ hdc = GetDC(td->w); FrameRect(hdc, &rc, hbrYellow); ReleaseDC(td->w, hdc); /* Success */ return 0; } /* * Low level graphics (Assumes valid input). * * Draw a "cursor" at (x,y), using a "yellow box". */ static errr Term_bigcurs_win(int x, int y) { term_data *td = (term_data*)(Term->data); RECT rc; HDC hdc; int tile_wid, tile_hgt; if (td->map_active) { /* Normal cursor in map window */ Term_curs_win(x, y); return 0; } else { tile_wid = td->tile_wid; tile_hgt = td->tile_hgt; } /* Frame the grid */ rc.left = x * tile_wid + td->size_ow1; rc.right = rc.left + tile_width * tile_wid; rc.top = y * tile_hgt + td->size_oh1; rc.bottom = rc.top + tile_height * tile_hgt; /* Cursor is done as a yellow "box" */ hdc = GetDC(td->w); FrameRect(hdc, &rc, hbrYellow); ReleaseDC(td->w, hdc); /* Success */ return 0; } /* * Low level graphics (Assumes valid input). * * Erase a "block" of "n" characters starting at (x,y). */ static errr Term_wipe_win(int x, int y, int n) { term_data *td = (term_data*)(Term->data); HDC hdc; RECT rc; /* Rectangle to erase in client coords */ rc.left = x * td->tile_wid + td->size_ow1; rc.right = rc.left + n * td->tile_wid; rc.top = y * td->tile_hgt + td->size_oh1; rc.bottom = rc.top + td->tile_hgt; hdc = GetDC(td->w); SetBkColor(hdc, RGB(0, 0, 0)); SelectObject(hdc, td->font_id); ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL); ReleaseDC(td->w, hdc); /* Success */ return 0; } /* * Low level graphics. Assumes valid input. * * Draw several ("n") chars, with an attr, at a given location. * * All "graphic" data is handled by "Term_pict_win()", below. * * One would think there is a more efficient method for telling a window * what color it should be using to draw with, but perhaps simply changing * it every time is not too inefficient. XXX XXX XXX */ static errr Term_text_win(int x, int y, int n, int a, const wchar_t *s) { term_data *td = (term_data*)(Term->data); RECT rc; HDC hdc; /* Total rectangle */ rc.left = x * td->tile_wid + td->size_ow1; rc.right = rc.left + n * td->tile_wid; rc.top = y * td->tile_hgt + td->size_oh1; rc.bottom = rc.top + td->tile_hgt; /* Acquire DC */ hdc = GetDC(td->w); /* Background color */ SetBkColor(hdc, RGB(0, 0, 0)); /* Foreground color */ if (colors16) { SetTextColor(hdc, PALETTEINDEX(win_pal[a % MAX_COLORS])); } else { if (paletted) SetTextColor(hdc, win_clr[(a % MAX_COLORS) & 0x1F]); else SetTextColor(hdc, win_clr[a % MAX_COLORS]); /* Determine the background colour - from Sil */ switch (a / MAX_COLORS) { case BG_BLACK: /* Default Background */ SetBkColor(hdc, win_clr[0]); break; case BG_SAME: /* Background same as foreground*/ SetBkColor(hdc, win_clr[a % MAX_COLORS]); break; case BG_DARK: /* Highlight Background */ SetBkColor(hdc, win_clr[TERM_SHADE]); break; } } /* Use the font */ SelectObject(hdc, td->font_id); /* Bizarre size */ if (td->bizarre || (td->tile_hgt != td->font_hgt) || (td->tile_wid != td->font_wid)) { int i; /* Erase complete rectangle */ ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL); /* New rectangle */ rc.left += ((td->tile_wid - td->font_wid) / 2); rc.right = rc.left + td->font_wid; rc.top += ((td->tile_hgt - td->font_hgt) / 2); rc.bottom = rc.top + td->font_hgt; /* Dump each character */ for (i = 0; i < n; i++) { /* Dump the text */ ExtTextOutW(hdc, rc.left, rc.top, 0, &rc, s+i, 1, NULL); /* Advance */ rc.left += td->tile_wid; rc.right += td->tile_wid; } } /* Normal size */ else { /* Dump the text */ ExtTextOutW(hdc, rc.left, rc.top, ETO_OPAQUE | ETO_CLIPPED, &rc, s, n, NULL); } /* Release DC */ ReleaseDC(td->w, hdc); /* Success */ return 0; } /* * Low level graphics. Assumes valid input. * * Draw an array of "special" attr/char pairs at the given location. * * We use the "Term_pict_win()" function for "graphic" data, which are * encoded by setting the "high-bits" of both the "attr" and the "char" * data. We use the "attr" to represent the "row" of the main bitmap, * and the "char" to represent the "col" of the main bitmap. The use * of this function is induced by the "higher_pict" flag. * * If "graphics" is not available, we simply "wipe" the given grids. */ static errr Term_pict_win(int x, int y, int n, const int *ap, const wchar_t *cp, const int *tap, const wchar_t *tcp) { term_data *td = (term_data*)(Term->data); #ifdef USE_GRAPHICS int i; int x1, y1, w1, h1; int x2, y2, w2, h2, tw2, th2; int x3, y3; HDC hdcMask; HDC hdc; HDC hdcSrc; HBITMAP hbmSrcOld; /* Erase the grids */ Term_wipe_win(x, y, n); /* Size of bitmap cell */ w1 = infGraph.CellWidth; h1 = infGraph.CellHeight; /* Size of window cell */ if (td->map_active) { w2 = td->map_tile_wid; h2 = td->map_tile_hgt; tw2 = w2; th2 = h2; } else { w2 = td->tile_wid; h2 = td->tile_hgt; /* Large tile mode */ th2 = tile_height * h2; tw2 = tile_width * w2; } /* Location of window cell */ x2 = x * w2 + td->size_ow1; y2 = y * h2 + td->size_oh1; /* Info */ hdc = GetDC(td->w); /* More info */ hdcSrc = CreateCompatibleDC(hdc); hbmSrcOld = SelectObject(hdcSrc, infGraph.hBitmap); if (infMask.hBitmap) { hdcMask = CreateCompatibleDC(hdc); SelectObject(hdcMask, infMask.hBitmap); } else { hdcMask = NULL; } /* Draw attr/char pairs */ for (i = n-1; i >= 0; i--, x2 -= w2) { int a = ap[i]; wchar_t c = cp[i]; /* Extract picture */ int row = (a & 0x7F); int col = (c & 0x7F); /* Location of bitmap cell */ x1 = col * w1; y1 = row * h1; if (hdcMask) { x3 = (tcp[i] & 0x7F) * w1; y3 = (tap[i] & 0x7F) * h1; /* Perfect size */ if ((w1 == tw2) && (h1 == th2)) { /* Copy the terrain picture from the bitmap to the window */ BitBlt(hdc, x2, y2, tw2, th2, hdcSrc, x3, y3, SRCCOPY); /* Only draw if terrain and overlay are different */ if ((x1 != x3) || (y1 != y3)) { /* Mask out the tile */ BitBlt(hdc, x2, y2, tw2, th2, hdcMask, x1, y1, SRCAND); /* Draw the tile */ BitBlt(hdc, x2, y2, tw2, th2, hdcSrc, x1, y1, SRCPAINT); } /* Need to stretch */ } else { /* Set the correct mode for stretching the tiles */ SetStretchBltMode(hdc, COLORONCOLOR); /* Copy the terrain picture from the bitmap to the window */ StretchBlt(hdc, x2, y2, tw2, th2, hdcSrc, x3, y3, w1, h1, SRCCOPY); /* Only draw if terrain and overlay are different */ if ((x1 != x3) || (y1 != y3)) { /* Mask out the tile */ StretchBlt(hdc, x2, y2, tw2, th2, hdcMask, x1, y1, w1, h1, SRCAND); /* Draw the tile */ StretchBlt(hdc, x2, y2, tw2, th2, hdcSrc, x1, y1, w1, h1, SRCPAINT); } } } else { /* Perfect size */ if ((w1 == tw2) && (h1 == th2)) { /* Copy the picture from the bitmap to the window */ BitBlt(hdc, x2, y2, tw2, th2, hdcSrc, x1, y1, SRCCOPY); /* Need to stretch */ } else { /* Set the correct mode for stretching the tiles */ SetStretchBltMode(hdc, COLORONCOLOR); /* Copy the picture from the bitmap to the window */ StretchBlt(hdc, x2, y2, tw2, th2, hdcSrc, x1, y1, w1, h1, SRCCOPY); } } } /* Release */ SelectObject(hdcSrc, hbmSrcOld); DeleteDC(hdcSrc); if (hdcMask) { /* Release */ SelectObject(hdcMask, hbmSrcOld); DeleteDC(hdcMask); } /* Release */ ReleaseDC(td->w, hdc); #else /* USE_GRAPHICS */ /* Just erase this grid */ return (Term_wipe_win(x, y, n)); #endif /* USE_GRAPHICS */ /* Success */ return 0; } /* * Windows cannot naturally handle UTF-8 using the standard locale and * C library routines, such as mbstowcs(). * * We assume external files are in UTF-8, and explicitly convert. * * MultiByteToWideChar returns number of wchars, including terminating L'\0' * mbstowcs requires the count without the terminating L'\0' * dest == NULL corresponds to querying for the size needed, achieved in the * Windows fn by setting the dstlen (last) param to 0. * If n is too small for all the chars in src, the Windows fn fails, but we * require success and a partial conversion. So allocate space for it to * succeed, and do the partial copy into dest. */ size_t Term_mbstowcs_win(wchar_t *dest, const char *src, int n) { int res; int required; wchar_t *tmp; if (dest) { res = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, dest, n); if (res) return (size_t)(res - 1); else { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { required = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, NULL, 0); tmp = malloc(required * sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, tmp, required); memcpy(dest, tmp, n * sizeof(wchar_t)); free(tmp); return n; } else { return (size_t)-1; } } } else { return (size_t)(MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, NULL, 0) - 1); } } #ifndef AC_SRC_ALPHA #define AC_SRC_ALPHA 0x01 #endif static errr Term_pict_win_alpha(int x, int y, int n, const int *ap, const wchar_t *cp, const int *tap, const wchar_t *tcp) { term_data *td = (term_data*)(Term->data); #ifdef USE_GRAPHICS int i; int x1, y1, w1, h1; int x2, y2, w2, h2, tw2, th2; int x3, y3; HDC hdc; HDC hdcSrc; HBITMAP hbmSrcOld; /* Erase the grids */ Term_wipe_win(x, y, n); /* Size of bitmap cell */ w1 = infGraph.CellWidth; h1 = infGraph.CellHeight; /* Size of window cell */ if (td->map_active) { w2 = td->map_tile_wid; h2 = td->map_tile_hgt; tw2 = w2; th2 = h2; } else { w2 = td->tile_wid; h2 = td->tile_hgt; /* Large tile mode */ th2 = tile_height * h2; tw2 = tile_width * w2; } /* Location of window cell */ x2 = x * w2 + td->size_ow1; y2 = y * h2 + td->size_oh1; /* Info */ hdc = GetDC(td->w); /* More info */ hdcSrc = CreateCompatibleDC(hdc); hbmSrcOld = SelectObject(hdcSrc, infGraph.hBitmap); /* Draw attr/char pairs */ for (i = n-1; i >= 0; i--, x2 -= w2) { int a = ap[i]; wchar_t c = cp[i]; /* Extract picture */ int row = (a & 0x7F); int col = (c & 0x7F); int trow = (tap[i] & 0x7F); /* Location of bitmap cell */ x1 = col * w1; y1 = row * h1; x3 = (tcp[i] & 0x7F) * w1; y3 = trow * h1; /* Set the correct mode for stretching the tiles */ SetStretchBltMode(hdc, COLORONCOLOR); /* Perfect size */ if ((w1 == tw2) && (h1 == th2)) { /* Copy the terrain picture from the bitmap to the window */ BitBlt(hdc, x2, y2, tw2, th2, hdcSrc, x3, y3, SRCCOPY); } else { /* Copy the terrain picture from the bitmap to the window */ StretchBlt(hdc, x2, y2, tw2, th2, hdcSrc, x3, y3, w1, h1, SRCCOPY); } if (overdraw && (trow >= overdraw) && (y > 2) && (trow <= overdrawmax)) { AlphaBlend(hdc, x2, y2-th2, tw2, th2, hdcSrc, x3, y3-h1, w1, h1, blendfn); /* tell the core that the top tile is different than what it thinks */ Term_mark(x, y-tile_height); Term_mark(x, y); /* ugg this means that this tile is drawn every frame */ } /* Only draw if terrain and overlay are different */ if ((x1 != x3) || (y1 != y3)) { /* Copy the picture from the bitmap to the window */ if (overdraw && (row >= overdraw) && (y > 2) && (row <= overdrawmax)) { AlphaBlend(hdc, x2, y2-th2, tw2, th2*2, hdcSrc, x1, y1-h1, w1, h1*2, blendfn); /* tell the core that the top tile is different than what it thinks */ Term_mark(x, y-tile_height); Term_mark(x, y); /* ugg this means that this tile is drawn every frame */ /* but it is needed, otherwise the top does not get drawn again when */ /* the user of this tile does not move, but something else does */ } else { AlphaBlend(hdc, x2, y2, tw2, th2, hdcSrc, x1, y1, w1, h1, blendfn); } } } /* Release */ SelectObject(hdcSrc, hbmSrcOld); DeleteDC(hdcSrc); /* Release */ ReleaseDC(td->w, hdc); #else /* USE_GRAPHICS */ /* Just erase this grid */ return (Term_wipe_win(x, y, n)); #endif /* USE_GRAPHICS */ /* Success */ return 0; } static void windows_map_aux(void) { term_data *td = &data[0]; int a; wchar_t c; int x, min_x, max_x; int y, min_y, max_y; int ta; wchar_t tc; td->map_tile_wid = (td->tile_wid * td->cols) / cave->width; td->map_tile_hgt = (td->tile_hgt * td->rows) / cave->height; min_x = 0; min_y = 0; max_x = cave->width; max_y = cave->height; /* Draw the map */ for (x = min_x; x < max_x; x++) { for (y = min_y; y < max_y; y++) { grid_data g; map_info(y, x, &g); grid_data_as_text(&g, &a, &c, &ta, &tc); /* Ignore non-graphics */ if (a & 0x80) { Term_pict_win(x - min_x, y - min_y, 1, &a, &c, &ta, &tc); } } } /* Highlight the player */ Term_curs_win(p_ptr->px - min_x, p_ptr->py - min_y); } /* * MEGA_HACK - Display a graphical map of the dungeon. */ static void windows_map(void) { term_data *td = &data[0]; ui_event ch; /* Only in graphics mode since the fonts can't be scaled */ if (!use_graphics) return; /* Prevent various menu-actions from working */ initialized = FALSE; /* Clear screen */ Term_xtra_win_clear(); td->map_active = TRUE; /* Draw the map */ windows_map_aux(); /* Wait for a keypress, flush key buffer */ Term_inkey(&ch, TRUE, TRUE); Term_flush(); /* Switch off the map display */ td->map_active = FALSE; /* Restore screen */ Term_xtra_win_clear(); Term_redraw(); /* We are ready again */ initialized = TRUE; } /*** Other routines ***/ /* * Create and initialize a "term_data" given a title */ static void term_data_link(term_data *td) { term *t = &td->t; /* Initialize the term */ term_init(t, td->cols, td->rows, td->keys); /* Use a "software" cursor */ t->soft_cursor = TRUE; /* Differentiate between BS/^h, Tab/^i, etc. */ t->complex_input = TRUE; /* Use "Term_pict" for "graphic" data */ t->higher_pict = TRUE; /* Erase with "white space" */ t->attr_blank = TERM_WHITE; t->char_blank = ' '; #if 0 /* Prepare the init/nuke hooks */ t->init_hook = Term_init_win; t->nuke_hook = Term_nuke_win; #endif /* 0 */ /* Prepare the template hooks */ t->xtra_hook = Term_xtra_win; t->curs_hook = Term_curs_win; t->bigcurs_hook = Term_bigcurs_win; t->wipe_hook = Term_wipe_win; t->text_hook = Term_text_win; t->pict_hook = Term_pict_win; t->mbcs_hook = Term_mbstowcs_win; /* Remember where we came from */ t->data = td; } /* * Create the windows * * First, instantiate the "default" values, then read the "ini_file" * to over-ride selected values, then create the windows, and fonts. * * Must use SW_SHOW not SW_SHOWNA, since on 256 color display * must make active to realize the palette. XXX XXX XXX */ static void init_windows(void) { int i; term_data *td; char buf[1024]; MENUITEMINFO mii; HMENU hm; graphics_mode *mode; /* Main window */ td = &data[0]; WIPE(td, term_data); td->s = angband_term_name[0]; td->keys = 1024; td->rows = 24; td->cols = 80; td->visible = TRUE; td->size_ow1 = 2; td->size_ow2 = 2; td->size_oh1 = 2; td->size_oh2 = 2; td->pos_x = 30; td->pos_y = 20; /* Sub windows */ for (i = 1; i < MAX_TERM_DATA; i++) { td = &data[i]; WIPE(td, term_data); td->s = angband_term_name[i]; td->keys = 16; td->rows = 24; td->cols = 80; td->visible = FALSE; td->size_ow1 = 1; td->size_ow2 = 1; td->size_oh1 = 1; td->size_oh2 = 1; td->pos_x = (7 - i) * 30; td->pos_y = (7 - i) * 20; } /* Load prefs */ load_prefs(); /* Main window (need these before term_getsize gets called) */ td = &data[0]; td->dwStyle = (WS_OVERLAPPED | WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION | WS_VISIBLE); if (td->maximized) td->dwStyle |= WS_MAXIMIZE; td->dwExStyle = 0; td->visible = TRUE; /* Sub windows (need these before term_getsize gets called) */ for (i = 1; i < MAX_TERM_DATA; i++) { td = &data[i]; td->dwStyle = (WS_OVERLAPPED | WS_THICKFRAME | WS_SYSMENU | WS_CAPTION); td->dwExStyle = (WS_EX_TOOLWINDOW); } /* All windows */ for (i = 0; i < MAX_TERM_DATA; i++) { td = &data[i]; /* Access the standard font file */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_FONT, td->font_want); /* Activate the chosen font */ if (term_force_font(td, buf)) { /* Access the standard font file */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_FONT, DEFAULT_FONT); /* Force the use of that font */ (void)term_force_font(td, buf); /* Oops */ td->tile_wid = 8; td->tile_hgt = 13; /* HACK - Assume bizarre */ td->bizarre = TRUE; } /* Analyze the font */ term_getsize(td); /* Resize the window */ term_window_resize(td); } /* Sub windows (reverse order) */ for (i = MAX_TERM_DATA - 1; i >= 1; --i) { td = &data[i]; my_td = td; td->w = CreateWindowEx(td->dwExStyle, AngList, td->s, td->dwStyle, td->pos_x, td->pos_y, td->size_wid, td->size_hgt, HWND_DESKTOP, NULL, hInstance, NULL); my_td = NULL; if (!td->w) quit("Failed to create sub-window"); if (td->visible) { td->size_hack = TRUE; ShowWindow(td->w, SW_SHOW); td->size_hack = FALSE; } term_data_link(td); angband_term[i] = &td->t; if (td->visible) { /* Activate the window */ SetActiveWindow(td->w); /* Bring window to top */ SetWindowPos(td->w, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } } /* Main window */ td = &data[0]; /* Main window */ my_td = td; td->w = CreateWindowEx(td->dwExStyle, AppName, td->s, td->dwStyle, td->pos_x, td->pos_y, td->size_wid, td->size_hgt, HWND_DESKTOP, NULL, hInstance, NULL); my_td = NULL; if (!td->w) quit_fmt("Failed to create %s window", VERSION_NAME); term_data_link(td); term_screen = &td->t; /* Activate the main window */ SetActiveWindow(td->w); /* Bring main window back to top */ SetWindowPos(td->w, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); #ifdef SUPPORT_GAMMA if (gamma_correction > 0) build_gamma_table(gamma_correction); #endif /* SUPPORT_GAMMA */ /* New palette XXX XXX XXX */ (void)new_palette(); /* Create a "brush" for drawing the "cursor" */ hbrYellow = CreateSolidBrush(win_clr[TERM_YELLOW]); /* Populate the graphic options sub menu with the graphics modes */ hm = GetMenu(data[0].w); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_TYPE; mii.fType = MFT_STRING; mode = graphics_modes; while (mode) { if (mode->grafID != GRAPHICS_NONE) { mii.wID = mode->grafID + IDM_OPTIONS_GRAPHICS_NONE; mii.dwTypeData = mode->menuname; mii.cch = strlen(mode->menuname); InsertMenuItem(hm,IDM_OPTIONS_GRAPHICS_NICE, FALSE, &mii); } mode = mode->pNext; } //mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_TYPE; mii.fType = MFT_SEPARATOR; mii.wID = 399; mii.dwTypeData = 0; mii.cch = 0; InsertMenuItem(hm,IDM_OPTIONS_GRAPHICS_NICE, FALSE, &mii); /* setup the alpha blending function */ blendfn.BlendOp = AC_SRC_OVER; blendfn.BlendFlags = 0; blendfn.AlphaFormat = AC_SRC_ALPHA; blendfn.SourceConstantAlpha = 255; /* Process pending messages */ (void)Term_xtra_win_flush(); } #ifdef USE_SAVER /* * Stop the screensaver */ static void stop_screensaver(void) { if (screensaver) SendMessage(data[0].w, WM_CLOSE, 0, 0); else SendMessage(data[0].w, WM_COMMAND, IDM_OPTIONS_SAVER, 0); } #endif /* USE_SAVER */ /* * Prepare the menus */ static void setup_menus(void) { size_t i; graphics_mode *mode; HMENU hm = GetMenu(data[0].w); #ifdef USE_SAVER main_menu = hm; #endif /* USE_SAVER */ /* Menu "File", Disable all */ EnableMenuItem(hm, IDM_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_FILE_OPEN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_FILE_SAVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_FILE_EXIT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_WINDOW_OPT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); /* No character available */ if (!character_generated) { /* Menu "File", Item "New" */ EnableMenuItem(hm, IDM_FILE_NEW, MF_BYCOMMAND | MF_ENABLED); /* Menu "File", Item "Open" */ EnableMenuItem(hm, IDM_FILE_OPEN, MF_BYCOMMAND | MF_ENABLED); } /* A character available */ if (game_in_progress && character_generated && inkey_flag) { /* Menu "File", Item "Save" */ EnableMenuItem(hm, IDM_FILE_SAVE, MF_BYCOMMAND | MF_ENABLED); /* Allow accessing the window options */ EnableMenuItem(hm, IDM_WINDOW_OPT, MF_BYCOMMAND | MF_ENABLED); } if (!game_in_progress || !character_generated || inkey_flag) { /* Menu "File", Item "Exit" */ EnableMenuItem(hm, IDM_FILE_EXIT, MF_BYCOMMAND | MF_ENABLED); } /* Menu "Window::Visibility" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_VIS_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); CheckMenuItem(hm, IDM_WINDOW_VIS_0 + i, (data[i].visible ? MF_CHECKED : MF_UNCHECKED)); EnableMenuItem(hm, IDM_WINDOW_VIS_0 + i, MF_BYCOMMAND | MF_ENABLED); } /* Menu "Window::Font" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_FONT_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); if (data[i].visible) { EnableMenuItem(hm, IDM_WINDOW_FONT_0 + i, MF_BYCOMMAND | MF_ENABLED); } } /* Menu "Window::Bizarre Display" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_BIZ_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); CheckMenuItem(hm, IDM_WINDOW_BIZ_0 + i, (data[i].bizarre ? MF_CHECKED : MF_UNCHECKED)); if (data[i].visible) { EnableMenuItem(hm, IDM_WINDOW_BIZ_0 + i, MF_BYCOMMAND | MF_ENABLED); } } /* Menu "Window::Increase Tile Width" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_I_WID_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); if (data[i].visible) { EnableMenuItem(hm, IDM_WINDOW_I_WID_0 + i, MF_BYCOMMAND | MF_ENABLED); } } /* Menu "Window::Decrease Tile Width" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_D_WID_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); if (data[i].visible) { EnableMenuItem(hm, IDM_WINDOW_D_WID_0 + i, MF_BYCOMMAND | MF_ENABLED); } } /* Menu "Window::Increase Tile Height" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_I_HGT_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); if (data[i].visible) { EnableMenuItem(hm, IDM_WINDOW_I_HGT_0 + i, MF_BYCOMMAND | MF_ENABLED); } } /* Menu "Window::Decrease Tile Height" */ for (i = 0; i < MAX_TERM_DATA; i++) { EnableMenuItem(hm, IDM_WINDOW_D_HGT_0 + i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); if (data[i].visible) { EnableMenuItem(hm, IDM_WINDOW_D_HGT_0 + i, MF_BYCOMMAND | MF_ENABLED); } } /* Menu "Options", disable all */ mode = graphics_modes; while (mode) { EnableMenuItem(hm, mode->grafID + IDM_OPTIONS_GRAPHICS_NONE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); mode = mode->pNext; } EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_NICE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); for (i = IDM_OPTIONS_TILE_1x1; i < IDM_OPTIONS_TILE_16x16; i++) { EnableMenuItem(hm, i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); } for (i = IDM_TILE_FONT; i < IDM_TILE_12X13; i++) { EnableMenuItem(hm, i, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); } EnableMenuItem(hm, IDM_TILE_12X20, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_TILE_16X25, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_OPTIONS_SAVER, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hm, IDM_OPTIONS_LOW_PRIORITY, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); /* Menu "Options", Item "Map" */ if (inkey_flag && initialized && (use_graphics != GRAPHICS_NONE)) EnableMenuItem(GetMenu(data[0].w), IDM_OPTIONS_MAP, MF_BYCOMMAND | MF_ENABLED); else EnableMenuItem(GetMenu(data[0].w), IDM_OPTIONS_MAP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); /* Menu "Options", update all */ mode = graphics_modes; while (mode) { CheckMenuItem(hm, mode->grafID + IDM_OPTIONS_GRAPHICS_NONE, (arg_graphics == mode->grafID ? MF_CHECKED : MF_UNCHECKED)); mode = mode->pNext; } CheckMenuItem(hm, IDM_OPTIONS_GRAPHICS_NICE, (arg_graphics_nice ? MF_CHECKED : MF_UNCHECKED)); if ((tile_width == 1) && (tile_height == 1)) CheckMenuItem(hm, IDM_OPTIONS_TILE_1x1, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_1x1, MF_UNCHECKED); if ((tile_width == 2) && (tile_height == 1)) CheckMenuItem(hm, IDM_OPTIONS_TILE_2x1, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_2x1, MF_UNCHECKED); if ((tile_width == 2) && (tile_height == 2)) CheckMenuItem(hm, IDM_OPTIONS_TILE_2x2, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_2x2, MF_UNCHECKED); if ((tile_width == 3) && (tile_height == 1)) CheckMenuItem(hm, IDM_OPTIONS_TILE_3x1, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_3x1, MF_UNCHECKED); if ((tile_width == 3) && (tile_height == 3)) CheckMenuItem(hm, IDM_OPTIONS_TILE_3x3, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_3x3, MF_UNCHECKED); if ((tile_width == 4) && (tile_height == 2)) CheckMenuItem(hm, IDM_OPTIONS_TILE_4x2, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_4x2, MF_UNCHECKED); if ((tile_width == 4) && (tile_height == 4)) CheckMenuItem(hm, IDM_OPTIONS_TILE_4x4, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_4x4, MF_UNCHECKED); if ((tile_width == 6) && (tile_height == 3)) CheckMenuItem(hm, IDM_OPTIONS_TILE_6x3, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_6x3, MF_UNCHECKED); if ((tile_width == 6) && (tile_height == 6)) CheckMenuItem(hm, IDM_OPTIONS_TILE_6x6, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_6x6, MF_UNCHECKED); if ((tile_width == 8) && (tile_height == 4)) CheckMenuItem(hm, IDM_OPTIONS_TILE_8x4, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_8x4, MF_UNCHECKED); if ((tile_width == 8) && (tile_height == 8)) CheckMenuItem(hm, IDM_OPTIONS_TILE_8x8, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_8x8, MF_UNCHECKED); if ((tile_width == 16) && (tile_height == 8)) CheckMenuItem(hm, IDM_OPTIONS_TILE_16x8, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_16x8, MF_UNCHECKED); if ((tile_width == 16) && (tile_height == 16)) CheckMenuItem(hm, IDM_OPTIONS_TILE_16x16, MF_CHECKED); else CheckMenuItem(hm, IDM_OPTIONS_TILE_16x16, MF_UNCHECKED); i = data[0].tile_hgt; if ((data[0].tile_wid == data[0].font_wid) && (i == data[0].font_hgt)) CheckMenuItem(hm, IDM_TILE_FONT, MF_CHECKED); else CheckMenuItem(hm, IDM_TILE_FONT, MF_UNCHECKED); if ((data[0].tile_wid == 8) && (i == 16)) CheckMenuItem(hm, IDM_TILE_08X16, MF_CHECKED); else CheckMenuItem(hm, IDM_TILE_08X16, MF_UNCHECKED); #ifdef USE_SAVER CheckMenuItem(hm, IDM_OPTIONS_SAVER, (hwndSaver ? MF_CHECKED : MF_UNCHECKED)); #endif /* USE_SAVER */ CheckMenuItem(hm, IDM_OPTIONS_LOW_PRIORITY, (low_priority ? MF_CHECKED : MF_UNCHECKED)); #ifdef USE_GRAPHICS if (inkey_flag && initialized) { /* Menu "Options", Item "Graphics" */ mode = graphics_modes; while (mode) { if ((mode->grafID == 0) || (mode->file && mode->file[0])) { EnableMenuItem(hm, mode->grafID + IDM_OPTIONS_GRAPHICS_NONE, MF_ENABLED); } mode = mode->pNext; } EnableMenuItem(hm, IDM_OPTIONS_GRAPHICS_NICE, MF_ENABLED); for (i = IDM_OPTIONS_TILE_1x1; i < IDM_OPTIONS_TILE_16x16; i++) { EnableMenuItem(hm, i, MF_ENABLED); } for (i = IDM_TILE_FONT; i < IDM_TILE_12X13; i++) { EnableMenuItem(hm, i, MF_ENABLED); } EnableMenuItem(hm, IDM_TILE_12X20, MF_ENABLED); EnableMenuItem(hm, IDM_TILE_16X25, MF_ENABLED); } #endif /* USE_GRAPHICS */ #ifdef USE_SAVER /* Menu "Options", Item "ScreenSaver" */ EnableMenuItem(hm, IDM_OPTIONS_SAVER, MF_BYCOMMAND | MF_ENABLED); #endif /* USE_SAVER */ EnableMenuItem(hm, IDM_OPTIONS_LOW_PRIORITY, MF_BYCOMMAND | MF_ENABLED); } /* * Check for double clicked (or dragged) savefile * * Apparently, Windows copies the entire filename into the first * piece of the "command line string". Perhaps we should extract * the "basename" of that filename and append it to the "save" dir. */ static void check_for_save_file(LPSTR cmd_line) { char *s, *p; /* First arg */ s = cmd_line; /* No args */ if (!s || !*s) return; /* Next arg */ p = strchr(s, ' '); /* Tokenize */ if (p) *p = '\0'; /* Extract filename */ my_strcpy(savefile, s, sizeof(savefile)); /* Validate the file */ validate_file(savefile); /* Set the command now so that we skip the "Open File" prompt. */ cmd.command = CMD_LOADFILE; } #ifdef USE_SAVER #ifdef ALLOW_BORG /* * Hook into the inkey() function so that flushing keypresses * doesn't affect us. * * ToDo: Try to implement recording and playing back of games * by saving/reading the keypresses to/from a file. Note that * interrupting certain actions (resting, running, and other * repeated actions) would mess that up, so this would have to * be switched off when recording. */ extern struct keypress (*inkey_hack)(int flush_first); static struct keypress screensaver_inkey_hack_buffer[1024]; static struct keypress screensaver_inkey_hack(int flush_first) { static size_t screensaver_inkey_hack_index = 0; if (screensaver_inkey_hack_index < sizeof(screensaver_inkey_hack_buffer)) return (screensaver_inkey_hack_buffer[screensaver_inkey_hack_index++]); else { struct keypress key = {EVT_KBRD, ESCAPE, 0}; return key; } } #endif /* ALLOW_BORG */ /* * Start the screensaver */ static void start_screensaver(void) { bool file_exist; #ifdef ALLOW_BORG int i, j; struct keypress key = {EVT_KBRD, 0, 0}; #endif /* ALLOW_BORG */ /* Set the name for process_player_name() */ my_strcpy(op_ptr->full_name, saverfilename, sizeof(op_ptr->full_name)); /* Set 'savefile' to a valid name */ savefile_set_name(player_safe_name(p_ptr, FALSE)); /* Does the savefile already exist? */ file_exist = file_exists(savefile); /* Don't try to load a non-existant savefile */ if (!file_exist) savefile[0] = '\0'; /* Game in progress */ game_in_progress = TRUE; Term_fresh(); /* Screensaver mode on */ SendMessage(data[0].w, WM_COMMAND, IDM_OPTIONS_SAVER, 0); /* Low priority */ SendMessage(data[0].w, WM_COMMAND, IDM_OPTIONS_LOW_PRIORITY, 0); #ifdef ALLOW_BORG /* * MegaHack - Try to start the Borg. * * The simulated keypresses will be processed when play_game() * is called. */ inkey_hack = screensaver_inkey_hack; j = 0; /* * If no savefile is present or then go through the steps necessary * to create a random character. If a savefile already is present * then the simulated keypresses will either clean away any [-more-] * prompts (if the character is alive), or create a new random * character. * * Luckily it's possible to send the same keypresses no matter if * the character is alive, dead, or not even yet created. */ key.code = ESCAPE; screensaver_inkey_hack_buffer[j++] = key; /* Gender */ screensaver_inkey_hack_buffer[j++] = key; /* Race */ screensaver_inkey_hack_buffer[j++] = key; /* Class */ key.code = 'n'; screensaver_inkey_hack_buffer[j++] = key; /* Modify options */ key.code = KC_ENTER; screensaver_inkey_hack_buffer[j++] = key; /* Reroll */ if (!file_exist) { /* Savefile name */ int n = strlen(saverfilename); for (i = 0; i < n; i++) { key.code = saverfilename[i]; screensaver_inkey_hack_buffer[j++] = key; } } key.code = KC_ENTER; screensaver_inkey_hack_buffer[j++] = key; /* Return */ key.code = ESCAPE; screensaver_inkey_hack_buffer[j++] = key; /* Character info */ /* * Make sure the "verify_special" options is off, so that we can * get into Borg mode without confirmation. * * Try just marking the savefile correctly. */ p_ptr->noscore |= (NOSCORE_BORG); /* * Make sure the "OPT(cheat_live)" option is set, so that the Borg can * automatically restart. */ key.code = '5'; screensaver_inkey_hack_buffer[j++] = key; /* Cheat options */ /* Cursor down to "cheat live" */ key.code = '2'; for (i = 0; i < OPT_cheat_live - OPT_CHEAT - 1; i++) screensaver_inkey_hack_buffer[j++] = key; key.code = 'y'; screensaver_inkey_hack_buffer[j++] = key; /* Switch on "OPT(cheat_live)" */ key.code = ESCAPE; screensaver_inkey_hack_buffer[j++] = key; /* Leave cheat options */ screensaver_inkey_hack_buffer[j++] = key; /* Leave options */ /* * Now start the Borg! */ key.code = KTRL('Z'); screensaver_inkey_hack_buffer[j++] = key; /* Enter borgmode */ key.code = 'z'; screensaver_inkey_hack_buffer[j++] = key; /* Run Borg */ #endif /* ALLOW_BORG */ /* Play game */ play_game(); } #endif /* USE_SAVER */ /* * Display a help file */ static void display_help(const char *filename) { Term_keypress('?',0); //plog("Use the online help files instead."); } /* * Process a menu command */ static void process_menus(WORD wCmd) { int i; term_data *td; OPENFILENAME ofn; /* Analyze */ switch (wCmd) { /* New game */ case IDM_FILE_NEW: { if (!initialized) { plog("You cannot do that yet..."); } else if (game_in_progress) { plog("You can't start a new game while you're still playing!"); } else { /* We'll return NEWGAME to the game. */ cmd.command = CMD_NEWGAME; } break; } /* Open game */ case IDM_FILE_OPEN: { if (!initialized) { plog("You cannot do that yet..."); } else if (game_in_progress) { plog("You can't open a new game while you're still playing!"); } else { memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = data[0].w; ofn.lpstrFilter = "Save Files (*.)\0*\0"; ofn.nFilterIndex = 1; ofn.lpstrFile = savefile; ofn.nMaxFile = 1024; ofn.lpstrInitialDir = ANGBAND_DIR_SAVE; ofn.Flags = OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; if (GetOpenFileName(&ofn)) { /* Load 'savefile' */ validate_file(savefile); /* We'll return NEWGAME to the game. */ cmd.command = CMD_LOADFILE; } } break; } /* Save game */ case IDM_FILE_SAVE: { if (game_in_progress && character_generated && inkey_flag) { /* Hack -- Forget messages */ msg_flag = FALSE; /* Save the game */ save_game(); } else { /* Paranoia */ plog("You may not do that right now."); } break; } /* Exit */ case IDM_FILE_EXIT: { if (game_in_progress && character_generated) { /* Paranoia */ if (!inkey_flag) { plog("You may not do that right now."); break; } /* Hack -- Forget messages */ msg_flag = FALSE; /* Save the game */ save_game(); } quit(NULL); break; } case IDM_WINDOW_VIS_0: { plog("You are not allowed to do that!"); break; } /* Window visibility */ case IDM_WINDOW_VIS_1: case IDM_WINDOW_VIS_2: case IDM_WINDOW_VIS_3: case IDM_WINDOW_VIS_4: case IDM_WINDOW_VIS_5: case IDM_WINDOW_VIS_6: case IDM_WINDOW_VIS_7: { i = wCmd - IDM_WINDOW_VIS_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; if (!td->visible) { td->visible = TRUE; ShowWindow(td->w, SW_SHOW); term_data_redraw(td); } else { td->visible = FALSE; ShowWindow(td->w, SW_HIDE); } break; } /* Window fonts */ case IDM_WINDOW_FONT_0: case IDM_WINDOW_FONT_1: case IDM_WINDOW_FONT_2: case IDM_WINDOW_FONT_3: case IDM_WINDOW_FONT_4: case IDM_WINDOW_FONT_5: case IDM_WINDOW_FONT_6: case IDM_WINDOW_FONT_7: { if ((use_graphics_nice) && (!inkey_flag || !initialized)) { plog("You may not do that right now."); break; } i = wCmd - IDM_WINDOW_FONT_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; term_change_font(td); if (use_graphics_nice) { /* Hack -- Force redraw */ Term_key_push(KTRL('R')); } break; } /* Bizarre Display */ case IDM_WINDOW_BIZ_0: case IDM_WINDOW_BIZ_1: case IDM_WINDOW_BIZ_2: case IDM_WINDOW_BIZ_3: case IDM_WINDOW_BIZ_4: case IDM_WINDOW_BIZ_5: case IDM_WINDOW_BIZ_6: case IDM_WINDOW_BIZ_7: { i = wCmd - IDM_WINDOW_BIZ_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; td->bizarre = !td->bizarre; term_getsize(td); term_window_resize(td); break; } /* Increase Tile Width */ case IDM_WINDOW_I_WID_0: case IDM_WINDOW_I_WID_1: case IDM_WINDOW_I_WID_2: case IDM_WINDOW_I_WID_3: case IDM_WINDOW_I_WID_4: case IDM_WINDOW_I_WID_5: case IDM_WINDOW_I_WID_6: case IDM_WINDOW_I_WID_7: { i = wCmd - IDM_WINDOW_I_WID_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; td->tile_wid += 1; term_getsize(td); term_window_resize(td); break; } /* Decrease Tile Height */ case IDM_WINDOW_D_WID_0: case IDM_WINDOW_D_WID_1: case IDM_WINDOW_D_WID_2: case IDM_WINDOW_D_WID_3: case IDM_WINDOW_D_WID_4: case IDM_WINDOW_D_WID_5: case IDM_WINDOW_D_WID_6: case IDM_WINDOW_D_WID_7: { i = wCmd - IDM_WINDOW_D_WID_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; td->tile_wid -= 1; term_getsize(td); term_window_resize(td); break; } /* Increase Tile Height */ case IDM_WINDOW_I_HGT_0: case IDM_WINDOW_I_HGT_1: case IDM_WINDOW_I_HGT_2: case IDM_WINDOW_I_HGT_3: case IDM_WINDOW_I_HGT_4: case IDM_WINDOW_I_HGT_5: case IDM_WINDOW_I_HGT_6: case IDM_WINDOW_I_HGT_7: { i = wCmd - IDM_WINDOW_I_HGT_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; td->tile_hgt += 1; term_getsize(td); term_window_resize(td); break; } /* Decrease Tile Height */ case IDM_WINDOW_D_HGT_0: case IDM_WINDOW_D_HGT_1: case IDM_WINDOW_D_HGT_2: case IDM_WINDOW_D_HGT_3: case IDM_WINDOW_D_HGT_4: case IDM_WINDOW_D_HGT_5: case IDM_WINDOW_D_HGT_6: case IDM_WINDOW_D_HGT_7: { i = wCmd - IDM_WINDOW_D_HGT_0; if ((i < 0) || (i >= MAX_TERM_DATA)) break; td = &data[i]; td->tile_hgt -= 1; term_getsize(td); term_window_resize(td); break; } case IDM_WINDOW_OPT: { Term_keypress('=',0); Term_keypress('w',0); break; } case IDM_WINDOW_RESET: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } if (MessageBox(NULL, "This will reset the size and layout of the angband windows\n based on your screen size. Do you want to continue?", VERSION_NAME, MB_YESNO|MB_ICONWARNING) == IDYES) { term *old = Term; int i; RECT rc; (void)default_layout_win(data,MAX_TERM_DATA); for (i=0; i < MAX_TERM_DATA; i++) { /* Activate */ Term_activate(&(data[i].t)); /* Resize the term */ Term_resize(data[i].cols, data[i].rows); } /* Restore */ Term_activate(old); /* Do something to sub-windows */ for (i = MAX_TERM_DATA - 1; i >= 0; i--) { if (!(data[i].w)) continue; /* Client window size */ rc.left = 0; rc.top = 0; rc.right = rc.left + data[i].cols * data[i].tile_wid + data[i].size_ow1 + data[i].size_ow2; rc.bottom = rc.top + data[i].rows * data[i].tile_hgt + data[i].size_oh1 + data[i].size_oh2; /* Get total window size (without menu for sub-windows) */ AdjustWindowRectEx(&rc, data[i].dwStyle, TRUE, data[i].dwExStyle); /* Total size */ data[i].size_wid = rc.right - rc.left; data[i].size_hgt = rc.bottom - rc.top; if (i==0) { SetWindowPos(data[i].w, 0, data[i].pos_x, data[i].pos_y, data[i].size_wid, data[i].size_hgt, 0); } else { SetWindowPos(data[i].w, data[0].w, data[i].pos_x, data[i].pos_y, data[i].size_wid, data[i].size_hgt, 0); } if (data[i].visible) { ShowWindow(data[i].w, SW_SHOW); } else { ShowWindow(data[i].w, SW_HIDE); } /* Redraw later */ InvalidateRect(data[i].w, NULL, TRUE); } /* Focus on main window */ SetFocus(data[0].w); /* React to changes */ Term_xtra_win_react(); /* Hack -- Force redraw */ Term_key_push(KTRL('R')); } break; } case IDM_OPTIONS_GRAPHICS_NICE: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } /* Toggle "arg_graphics_nice" */ arg_graphics_nice = !arg_graphics_nice; /* React to changes */ Term_xtra_win_react(); /* Hack -- Force redraw */ Term_key_push(KTRL('R')); break; } case IDM_OPTIONS_TILE_1x1: case IDM_OPTIONS_TILE_2x1: case IDM_OPTIONS_TILE_2x2: case IDM_OPTIONS_TILE_3x1: case IDM_OPTIONS_TILE_3x3: case IDM_OPTIONS_TILE_4x2: case IDM_OPTIONS_TILE_4x4: case IDM_OPTIONS_TILE_6x3: case IDM_OPTIONS_TILE_6x6: case IDM_OPTIONS_TILE_8x4: case IDM_OPTIONS_TILE_8x8: case IDM_OPTIONS_TILE_16x8: case IDM_OPTIONS_TILE_16x16: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } switch (wCmd) { case IDM_OPTIONS_TILE_1x1: { tile_width = 1; tile_height = 1; break; } case IDM_OPTIONS_TILE_2x1: { tile_width = 2; tile_height = 1; break; } case IDM_OPTIONS_TILE_2x2: { tile_width = 2; tile_height = 2; break; } case IDM_OPTIONS_TILE_3x1: { tile_width = 3; tile_height = 1; break; } case IDM_OPTIONS_TILE_3x3: { tile_width = 3; tile_height = 3; break; } case IDM_OPTIONS_TILE_4x2: { tile_width = 4; tile_height = 2; break; } case IDM_OPTIONS_TILE_4x4: { tile_width = 4; tile_height = 4; break; } case IDM_OPTIONS_TILE_6x3: { tile_width = 6; tile_height = 3; break; } case IDM_OPTIONS_TILE_6x6: { tile_width = 6; tile_height = 6; break; } case IDM_OPTIONS_TILE_8x4: { tile_width = 8; tile_height = 4; break; } case IDM_OPTIONS_TILE_8x8: { tile_width = 8; tile_height = 8; break; } case IDM_OPTIONS_TILE_16x8: { tile_width = 16; tile_height = 8; break; } case IDM_OPTIONS_TILE_16x16: { tile_width = 16; tile_height = 16; break; } } /* Set flag */ change_tilesize = TRUE; /* React to changes */ Term_xtra_win_react(); /* Hack -- Force redraw */ Term_key_push(KTRL('R')); break; } case IDM_TILE_FONT: case IDM_TILE_08X08: case IDM_TILE_16X16: case IDM_TILE_32X32: case IDM_TILE_08X16: case IDM_TILE_10X20: case IDM_TILE_16X32: case IDM_TILE_08X13: case IDM_TILE_10X17: case IDM_TILE_16X25: case IDM_TILE_12X20: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } td = &data[0]; switch (wCmd) { case IDM_TILE_FONT: { td->tile_wid = td->font_wid; td->tile_hgt = td->font_hgt; break; } case IDM_TILE_08X16: { td->tile_wid = 8; td->tile_hgt = 16; break; } case IDM_TILE_08X08: { td->tile_wid = 8; td->tile_hgt = 8; break; } case IDM_TILE_16X16: { td->tile_wid = 16; td->tile_hgt = 16; break; } case IDM_TILE_32X32: { td->tile_wid = 32; td->tile_hgt = 32; break; } case IDM_TILE_10X20: { td->tile_wid = 10; td->tile_hgt = 20; break; } case IDM_TILE_16X32: { td->tile_wid = 16; td->tile_hgt = 32; break; } case IDM_TILE_12X20: { td->tile_wid = 12; td->tile_hgt = 20; break; } case IDM_TILE_16X25: { td->tile_wid = 16; td->tile_hgt = 25; break; } } /* React to changes */ term_getsize(td); term_window_resize(td); break; } #ifdef USE_SAVER case IDM_OPTIONS_SAVER: { if (hwndSaver) { DestroyWindow(hwndSaver); hwndSaver = NULL; screensaver_active = FALSE; /* Switch main menu back on */ SetMenu(data[0].w, main_menu); for (i = MAX_TERM_DATA - 1; i >= 0; --i) { td = &data[i]; if (td->visible) { /* Turn the Windows back to normal */ SetWindowLong(td->w, GWL_STYLE, td->dwStyle); /* Push the window to the top */ SetWindowPos(td->w, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE); } } ShowCursor(TRUE); } else { /* Create a screen saver window */ hwndSaver = CreateWindowEx(WS_EX_TOPMOST, "WindowsScreenSaverClass", "Angband Screensaver", WS_POPUP | WS_MAXIMIZE | WS_VISIBLE, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL); if (hwndSaver) { for (i = MAX_TERM_DATA - 1; i >= 0; --i) { td = &data[i]; if (td->visible) { /* Switch off border and titlebar */ SetWindowLong(td->w, GWL_STYLE, WS_VISIBLE); /* Switch off menu */ SetMenu(td->w, NULL); /* Push the window to the top */ SetWindowPos(td->w, HWND_TOPMOST, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE); } } ShowCursor(FALSE); screensaver_active = TRUE; } else { plog("Failed to create saver window"); } } break; } #endif /* USE_SAVER */ case IDM_OPTIONS_LOW_PRIORITY: { /* Lower or reset the priority of the current process */ if (low_priority) SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS); else SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS); /* Toggle priority */ low_priority = !low_priority; break; } case IDM_OPTIONS_MAP: { /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } windows_map(); break; } case IDM_HELP_GENERAL: { display_help(HELP_GENERAL); break; } case IDM_HELP_SPOILERS: { display_help(HELP_SPOILERS); break; } case IDM_OPTIONS_SCREENSHOT:{ char filename[1024]; char path[1024]; time_t ltime; struct tm *today; int len; BOOL SaveWindow_PNG(HWND hWnd, LPSTR lpFileName); time( <ime ); today = localtime( <ime ); strnfmt(filename, sizeof(filename), "%s", op_ptr->full_name); len = strlen(filename); strftime(filename+len, sizeof(filename)-len, "_%Y%b%d_%H%M%S.png", today); /* Get the system-specific path */ path_build(path, sizeof(path), ANGBAND_DIR_USER, filename); td = &data[0]; if (!SaveWindow_PNG(td->w, path)) { plog("Screenshot Save Failed."); } break; } default: { if ((wCmd >= IDM_OPTIONS_GRAPHICS_NONE) && (wCmd <= IDM_OPTIONS_GRAPHICS_NONE+graphics_mode_high_id)) { int selected_mode = 0; int desired_mode = wCmd - IDM_OPTIONS_GRAPHICS_NONE; /* Paranoia */ if (!inkey_flag || !initialized) { plog("You may not do that right now."); break; } i = 0; do { if (graphics_modes[i].grafID == desired_mode) { selected_mode = desired_mode; break; } } while (graphics_modes[i++].grafID != 0); /* Toggle "arg_graphics" */ if (arg_graphics != selected_mode) { arg_graphics = selected_mode; /* hard code values when switching to text mode */ if ((selected_mode == GRAPHICS_NONE) && !use_graphics_nice) { td = &data[0]; td->tile_wid = td->font_wid; td->tile_hgt = td->font_hgt; tile_width = 1; tile_height = 1; /* React to changes */ term_getsize(td); term_window_resize(td); } /* React to changes */ Term_xtra_win_react(); /* Hack -- Force redraw */ Term_key_push(KTRL('R')); } } break; } } } /* * Redraw a section of a window */ static void handle_wm_paint(HWND hWnd) { int x1, y1, x2, y2; PAINTSTRUCT ps; term_data *td; /* Acquire proper "term_data" info */ td = (term_data *)GetWindowLongPtr(hWnd, GWLP_USERDATA); BeginPaint(hWnd, &ps); if (td->map_active) { /* Redraw the map */ /* ToDo: Only redraw the necessary parts */ windows_map_aux(); } else { /* Get the area that should be updated (rounding up/down) */ /* ToDo: Take the window borders into account */ x1 = (ps.rcPaint.left / td->tile_wid) - 1; x2 = (ps.rcPaint.right / td->tile_wid) + 1; y1 = (ps.rcPaint.top / td->tile_hgt) - 1; y2 = (ps.rcPaint.bottom / td->tile_hgt) + 1; /* Redraw */ if (td) term_data_redraw_section(td, x1, y1, x2, y2); } EndPaint(hWnd, &ps); } int extract_modifiers(keycode_t ch, bool kp) { bool mc = FALSE; bool ms = FALSE; bool ma = FALSE; /* Extract the modifiers */ if (GetKeyState(VK_CONTROL) & 0x8000) mc = TRUE; if (GetKeyState(VK_SHIFT) & 0x8000) ms = TRUE; if (GetKeyState(VK_MENU) & 0x8000) ma = TRUE; return (mc && (kp || MODS_INCLUDE_CONTROL(ch)) ? KC_MOD_CONTROL : 0) | (ms && (kp || MODS_INCLUDE_SHIFT(ch)) ? KC_MOD_SHIFT : 0) | (ma ? KC_MOD_ALT : 0) | (kp ? KC_MOD_KEYPAD : 0); } /* * We ignore the modifier keys (shift, control, alt, num lock, scroll lock), * and the normal keys (escape, tab, return, letters, numbers, etc), but we * catch the keypad keys (with and without numlock set, including keypad 5), * the function keys (including the "menu" key which maps to F10), and the * "pause" key (between scroll lock and numlock). We also catch a few odd * keys which I do not recognize, but which are listed among keys which we * do catch, so they should be harmless to catch. * * return whether the keypress was NOT handled */ static bool handle_keydown(WPARAM wParam, LPARAM lParam) { keycode_t ch = 0; bool kp = FALSE; #ifdef USE_SAVER if (screensaver_active) { stop_screensaver(); return TRUE; } #endif /* USE_SAVER */ /* for VK_ http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx */ switch (wParam) { case VK_F1: ch = KC_F1; break; case VK_F2: ch = KC_F2; break; case VK_F3: ch = KC_F3; break; case VK_F4: ch = KC_F4; break; case VK_F5: ch = KC_F5; break; case VK_F6: ch = KC_F6; break; case VK_F7: ch = KC_F7; break; case VK_F8: ch = KC_F8; break; case VK_F9: ch = KC_F9; break; case VK_F10: ch = KC_F10; break; case VK_F11: ch = KC_F11; break; case VK_F12: ch = KC_F12; break; case VK_F13: ch = KC_F13; break; case VK_F14: ch = KC_F14; break; case VK_F15: ch = KC_F15; break; case VK_INSERT: ch = KC_INSERT; break; case VK_DELETE: ch = KC_DELETE; break; /* Backspace is calling both backspace and delete Removed the backspace call, so it only calls delete */ case VK_BACK: break; /* Tab is registering as ^i; don't read it here*/ case VK_TAB: break; case VK_PRIOR: ch = KC_PGUP; break; case VK_NEXT: ch = KC_PGDOWN; break; case VK_END: ch = KC_END; break; case VK_HOME: ch = KC_HOME; break; case VK_LEFT: ch = ARROW_LEFT; break; case VK_RIGHT: ch = ARROW_RIGHT; break; case VK_UP: ch = ARROW_UP; break; case VK_DOWN: ch = ARROW_DOWN; break; case VK_CLEAR: ch = '5'; kp=TRUE; break; case VK_PAUSE: ch = KC_PAUSE; break; } /* we could fall back on using the scancode */ /* obtained using LOBYTE(HIWORD(lParam)) */ /* see http://source.winehq.org/source/include/dinput.h#L468 */ if (ch) { int mods = extract_modifiers(ch, kp); /* printf("ch=%d mods=%d\n", ch, mods); */ /* fflush(stdout); */ Term_keypress(ch, mods); return FALSE; } return TRUE; } static LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; term_data *td; int i; int xPos, yPos, button, vsc, vk, mods; bool kp = FALSE, extended_key; keycode_t ch; #ifdef USE_SAVER static int iMouse = 0; static WORD xMouse = 0; static WORD yMouse = 0; int dx, dy; #endif /* USE_SAVER */ /* Acquire proper "term_data" info */ td = (term_data *)GetWindowLongPtr(hWnd, GWLP_USERDATA); /* Handle message */ switch (uMsg) { /* XXX XXX XXX */ case WM_NCCREATE: { #ifdef _WIN64 SetWindowLongPtr(hWnd, GWLP_USERDATA, my_td); #else SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG)(my_td)); #endif break; } /* XXX XXX XXX */ case WM_CREATE: { return 0; } case WM_GETMINMAXINFO: { MINMAXINFO FAR *lpmmi; RECT rc; lpmmi = (MINMAXINFO FAR *)lParam; /* this message was sent before WM_NCCREATE */ if (!td) return 1; /* Minimum window size is 80x24 */ rc.left = rc.top = 0; rc.right = rc.left + 80 * td->tile_wid + td->size_ow1 + td->size_ow2; rc.bottom = rc.top + 24 * td->tile_hgt + td->size_oh1 + td->size_oh2 + 1; /* Adjust */ AdjustWindowRectEx(&rc, td->dwStyle, TRUE, td->dwExStyle); /* Save minimum size */ lpmmi->ptMinTrackSize.x = rc.right - rc.left; lpmmi->ptMinTrackSize.y = rc.bottom - rc.top; return 0; } case WM_PAINT: { handle_wm_paint(hWnd); return 0; } case WM_SYSKEYDOWN: case WM_KEYDOWN: { return handle_keydown(wParam, lParam); } case WM_CHAR: { vsc = LOBYTE(HIWORD(lParam)); extended_key = HIBYTE(HIWORD(lParam)) & 0x1; vk = MapVirtualKey(vsc, 1); /* printf("wParam=%d lParam=%d vsc=%d vk=%d kp=%d\n", */ /* wParam, lParam, vsc, vk, extended_key); */ /* fflush(stdout); */ if (!game_in_progress) { /* Handle keyboard shortcuts pre-game */ switch (wParam) { case KTRL('N'): process_menus(IDM_FILE_NEW); break; case KTRL('O'): process_menus(IDM_FILE_OPEN); break; case KTRL('X'): process_menus(IDM_FILE_EXIT); break; default: return TRUE; } return FALSE; } // We don't want to translate some keys to their ascii values // so we have to intercept them here. switch (vk) { case 8: // fix backspace ch = KC_BACKSPACE; break; case 9: // fix tab ch = KC_TAB; break; case 13: // fix enter ch = KC_ENTER; if(extended_key) kp = TRUE; break; case 27: // fix escape ch = ESCAPE; break; default: Term_keypress(wParam, 0); return 0; } mods = extract_modifiers(ch, kp); Term_keypress(ch, mods); return 0; } case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONDOWN: { if (screensaver_active) { #ifdef USE_SAVER stop_screensaver(); #else screensaver_active = FALSE; #endif /* USE_SAVER */ return 0; } else { /* Get the text grid */ xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam); xPos /= td->tile_wid; yPos /= td->tile_hgt; if (uMsg == WM_LBUTTONDOWN) button = 1; else if (uMsg == WM_RBUTTONDOWN) button = 2; else button = 3; /* Extract the modifiers */ /* XXX using the numbers below rather than KC_MOD_CONTROL, KCMOD_SHIFT, * and KC_MOD_ALT, to avoid having to shift them all the time. They * need to be shifted because I don't want to change the function * parameters (which would break the other platforms, which I can't * test), so the mods need to be encoded into the button. */ if (GetKeyState(VK_CONTROL) & 0x8000) button |= 16; if (GetKeyState(VK_SHIFT) & 0x8000) button |= 32; if (GetKeyState(VK_MENU) & 0x8000) button |= 64; Term_mousepress(xPos,yPos,button); } break; } #ifdef USE_SAVER case WM_MOUSEMOVE: { if (!screensaver_active) break; if (iMouse) { dx = LOWORD(lParam) - xMouse; dy = HIWORD(lParam) - yMouse; if (dx < 0) dx = -dx; if (dy < 0) dy = -dy; if ((dx > MOUSE_SENS) || (dy > MOUSE_SENS)) { stop_screensaver(); } } /* Save last location */ iMouse = 1; xMouse = LOWORD(lParam); yMouse = HIWORD(lParam); return 0; } #endif /* USE_SAVER */ case WM_INITMENU: { setup_menus(); return 0; } #ifndef WM_QUERYENDSESSION #define WM_QUERYENDSESSION 0x0011 #endif case WM_QUERYENDSESSION: case WM_QUIT: { if (game_in_progress && character_generated) { if (uMsg == WM_QUERYENDSESSION && !inkey_flag) { plog("Please exit any open menus before closing the game."); return FALSE; } msg_flag = FALSE; save_game(); } quit(NULL); return TRUE; } case WM_CLOSE: { if (game_in_progress && character_generated) { if (!inkey_flag) { plog("Please exit any open menus before closing the game."); return 0; } /* Hack -- Forget messages */ msg_flag = FALSE; save_game(); } quit(NULL); return 0; } case WM_COMMAND: { process_menus(LOWORD(wParam)); return 0; } case WM_SIZE: { /* this message was sent before WM_NCCREATE */ if (!td) return 1; /* it was sent from inside CreateWindowEx */ if (!td->w) return 1; /* was sent from WM_SIZE */ if (td->size_hack) return 1; switch (wParam) { case SIZE_MINIMIZED: { /* Hide sub-windows */ for (i = 1; i < MAX_TERM_DATA; i++) { if (data[i].visible) ShowWindow(data[i].w, SW_HIDE); } return 0; } case SIZE_MAXIMIZED: { /* fall through XXX XXX XXX */ } case SIZE_RESTORED: { int cols = (LOWORD(lParam) - td->size_ow1) / td->tile_wid; int rows = (HIWORD(lParam) - td->size_oh1) / td->tile_hgt; /* New size */ if ((td->cols != cols) || (td->rows != rows)) { /* Save the new size */ td->cols = cols; td->rows = rows; /* Activate */ Term_activate(&td->t); /* Resize the term */ Term_resize(td->cols, td->rows); /* Redraw later */ InvalidateRect(td->w, NULL, TRUE); } td->size_hack = TRUE; /* Show sub-windows */ for (i = 1; i < MAX_TERM_DATA; i++) { if (data[i].visible) ShowWindow(data[i].w, SW_SHOW); } td->size_hack = FALSE; return 0; } } break; } case WM_PALETTECHANGED: { /* Ignore if palette change caused by itself */ if ((HWND)wParam == hWnd) return 0; /* Fall through... */ } case WM_QUERYNEWPALETTE: { if (!paletted) return 0; hdc = GetDC(hWnd); SelectPalette(hdc, hPal, FALSE); i = RealizePalette(hdc); /* if any palette entries changed, repaint the window. */ if (i) InvalidateRect(hWnd, NULL, TRUE); ReleaseDC(hWnd, hdc); return 0; } case WM_ACTIVATE: { if (wParam && !HIWORD(lParam)) { /* Do something to sub-windows */ for (i = MAX_TERM_DATA - 1; i >= 0; i--) { SetWindowPos(data[i].w, hWnd, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); } /* Focus on main window */ SetFocus(hWnd); return 0; } break; } } return DefWindowProc(hWnd, uMsg, wParam, lParam); } static LRESULT FAR PASCAL AngbandListProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { term_data *td; HDC hdc; int i; #ifdef USE_SAVER static int iMouse = 0; static WORD xMouse = 0; static WORD yMouse = 0; int dx, dy; #endif /* USE_SAVER */ /* Acquire proper "term_data" info */ td = (term_data *)GetWindowLongPtr(hWnd, GWLP_USERDATA); /* Process message */ switch (uMsg) { /* XXX XXX XXX */ case WM_NCCREATE: { #ifdef _WIN64 SetWindowLongPtr(hWnd, GWLP_USERDATA, my_td); #else SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG)(my_td)); #endif break; } /* XXX XXX XXX */ case WM_CREATE: { return 0; } case WM_GETMINMAXINFO: { #if 0 MINMAXINFO FAR *lpmmi; RECT rc; /* this message was sent before WM_NCCREATE */ if (!td) return 1; lpmmi = (MINMAXINFO FAR *)lParam; /* Minimum size */ rc.left = rc.top = 0; rc.right = rc.left + 8 * td->tile_wid + td->size_ow1 + td->size_ow2; rc.bottom = rc.top + 2 * td->tile_hgt + td->size_oh1 + td->size_oh2; /* Adjust */ AdjustWindowRectEx(&rc, td->dwStyle, TRUE, td->dwExStyle); /* Save the minimum size */ lpmmi->ptMinTrackSize.x = rc.right - rc.left; lpmmi->ptMinTrackSize.y = rc.bottom - rc.top; /* Maximum window size */ rc.left = rc.top = 0; rc.right = rc.left + 80 * td->tile_wid + td->size_ow1 + td->size_ow2; rc.bottom = rc.top + 24 * td->tile_hgt + td->size_oh1 + td->size_oh2; /* Paranoia */ rc.right += (td->tile_wid - 1); rc.bottom += (td->tile_hgt - 1); /* Adjust */ AdjustWindowRectEx(&rc, td->dwStyle, TRUE, td->dwExStyle); /* Save maximum size */ lpmmi->ptMaxSize.x = rc.right - rc.left; lpmmi->ptMaxSize.y = rc.bottom - rc.top; /* Save the maximum size */ lpmmi->ptMaxTrackSize.x = rc.right - rc.left; lpmmi->ptMaxTrackSize.y = rc.bottom - rc.top; #endif /* 0 */ return 0; } case WM_SIZE: { int cols; int rows; /* this message was sent before WM_NCCREATE */ if (!td) return 1; /* it was sent from inside CreateWindowEx */ if (!td->w) return 1; /* was sent from inside WM_SIZE */ if (td->size_hack) return 1; td->size_hack = TRUE; cols = (LOWORD(lParam) - td->size_ow1) / td->tile_wid; rows = (HIWORD(lParam) - td->size_oh1) / td->tile_hgt; /* New size */ if ((td->cols != cols) || (td->rows != rows)) { /* Save old term */ term *old_term = Term; /* Save the new size */ td->cols = cols; td->rows = rows; /* Activate */ Term_activate(&td->t); /* Resize the term */ Term_resize(td->cols, td->rows); /* Activate */ Term_activate(old_term); /* Redraw later */ InvalidateRect(td->w, NULL, TRUE); /* HACK - Redraw all windows */ if (character_dungeon) do_cmd_redraw(); } td->size_hack = FALSE; return 0; } case WM_PAINT: { handle_wm_paint(hWnd); return 0; } case WM_SYSKEYDOWN: case WM_KEYDOWN: { return handle_keydown(wParam, lParam); break; } case WM_CHAR: { Term_keypress(wParam, 0); return 0; } #ifdef USE_SAVER case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONDOWN: { if (screensaver_active) { stop_screensaver(); return 0; } break; } case WM_MOUSEMOVE: { if (!screensaver_active) break; if (iMouse) { dx = LOWORD(lParam) - xMouse; dy = HIWORD(lParam) - yMouse; if (dx < 0) dx = -dx; if (dy < 0) dy = -dy; if ((dx > MOUSE_SENS) || (dy > MOUSE_SENS)) { stop_screensaver(); } } /* Save last location */ iMouse = 1; xMouse = LOWORD(lParam); yMouse = HIWORD(lParam); return 0; } #endif /* USE_SAVER */ case WM_PALETTECHANGED: { /* ignore if palette change caused by itself */ if ((HWND)wParam == hWnd) return FALSE; /* otherwise, fall through!!! */ } case WM_QUERYNEWPALETTE: { if (!paletted) return 0; hdc = GetDC(hWnd); SelectPalette(hdc, hPal, FALSE); i = RealizePalette(hdc); /* if any palette entries changed, repaint the window. */ if (i) InvalidateRect(hWnd, NULL, TRUE); ReleaseDC(hWnd, hdc); return 0; } case WM_NCLBUTTONDOWN: { #ifdef HTCLOSE if (wParam == HTCLOSE) wParam = HTSYSMENU; #endif /* HTCLOSE */ if (wParam == HTSYSMENU) { if (td->visible) { td->visible = FALSE; ShowWindow(td->w, SW_HIDE); } return 0; } break; } } return DefWindowProc(hWnd, uMsg, wParam, lParam); } #ifdef USE_SAVER LRESULT FAR PASCAL AngbandSaverProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static int iMouse = 0; static WORD xMouse = 0; static WORD yMouse = 0; int dx, dy; /* Process */ switch (uMsg) { /* XXX XXX XXX */ case WM_NCCREATE: { break; } case WM_SETCURSOR: { SetCursor(NULL); return 0; } #if 0 case WM_ACTIVATE: { if (LOWORD(wParam) == WA_INACTIVE) break; /* else fall through */ } #endif /* 0 */ case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_KEYDOWN: { stop_screensaver(); return 0; } case WM_MOUSEMOVE: { if (iMouse) { dx = LOWORD(lParam) - xMouse; dy = HIWORD(lParam) - yMouse; if (dx < 0) dx = -dx; if (dy < 0) dy = -dy; if ((dx > MOUSE_SENS) || (dy > MOUSE_SENS)) { stop_screensaver(); } } /* Save last location */ iMouse = 1; xMouse = LOWORD(lParam); yMouse = HIWORD(lParam); return 0; } case WM_CLOSE: { DestroyWindow(hwndSaver); if (screensaver) SendMessage(data[0].w, WM_CLOSE, 0, 0); hwndSaver = NULL; return 0; } } /* Oops */ return DefWindowProc(hWnd, uMsg, wParam, lParam); } #endif /* USE_SAVER */ /*** Temporary Hooks ***/ /* * Display warning message (see "z-util.c") */ static void hack_plog(const char *str) { /* Give a warning */ if (str) { MessageBox(NULL, str, "Warning", MB_ICONEXCLAMATION | MB_OK); } } /* * Display error message and quit (see "z-util.c") */ static void hack_quit(const char *str) { /* Give a warning */ if (str) { MessageBox(NULL, str, "Error", MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP); } /* Unregister the classes */ UnregisterClass(AppName, hInstance); /* Destroy the icon */ if (hIcon) DestroyIcon(hIcon); #ifdef USE_SAVER if (screensaverSemaphore) CloseHandle(screensaverSemaphore); #endif /* USE_SAVER */ /* Exit */ exit(0); } /*** Various hooks ***/ /* * Display warning message (see "z-util.c") */ static void hook_plog(const char *str) { #ifdef USE_SAVER if (screensaver_active) return; #endif /* USE_SAVER */ /* Warning */ if (str) { MessageBox(data[0].w, str, "Warning", MB_ICONEXCLAMATION | MB_OK); } } /* * Display error message and quit (see "z-util.c") */ static void hook_quit(const char *str) { int i; #ifdef USE_SOUND int j; #endif /* USE_SOUND */ #ifdef USE_SAVER if (!screensaver_active) #endif /* USE_SAVER */ { /* Give a warning */ if (str) { MessageBox(data[0].w, str, "Error", MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP); } /* Save the preferences */ save_prefs(); } /*** Could use 'Term_nuke_win()' XXX XXX XXX */ /* Destroy all windows */ for (i = MAX_TERM_DATA - 1; i >= 0; --i) { /* Remove all fonts from the system, free resources */ if (data[i].font_file) term_remove_font(data[i].font_file); if (data[i].font_id) DeleteObject(data[i].font_id); if (data[i].font_want) string_free(data[i].font_want); /* Kill the window */ if (data[i].w) DestroyWindow(data[i].w); data[i].w = 0; term_nuke(&data[i].t); } #ifdef USE_GRAPHICS /* Free the bitmap stuff */ FreeDIB(&infGraph); FreeDIB(&infMask); #endif /* USE_GRAPHICS */ close_graphics_modes(); #ifdef USE_SOUND /* Free the sound names */ for (i = 0; i < MSG_MAX; i++) { for (j = 0; j < SAMPLE_MAX; j++) { if (!sound_file[i][j]) break; string_free(sound_file[i][j]); } } #endif /* USE_SOUND */ /*** Free some other stuff ***/ DeleteObject(hbrYellow); if (hPal) DeleteObject(hPal); UnregisterClass(AppName, hInstance); if (hIcon) DestroyIcon(hIcon); /* Free strings */ string_free(ini_file); string_free(argv0); #ifdef HAS_CLEANUP cleanup_angband(); #endif /* HAS_CLEANUP */ exit(0); } static errr get_init_cmd() { MSG msg; /* Prompt the user */ prt("[Choose 'New' or 'Open' from the 'File' menu]", 23, 17); Term_fresh(); /* Process messages forever */ while (cmd.command == CMD_NULL && GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } /* Bit of a hack, we'll do this when we leave the INIT context in future. */ game_in_progress = TRUE; /* Push command into the queue. */ cmd_insert_s(&cmd); /* Everything's OK. */ return 0; } /* Command dispatcher for windows build */ static errr win_get_cmd(cmd_context context, bool wait) { if (context == CMD_INIT) return get_init_cmd(); else return textui_get_cmd(context, wait); } /*** Initialize ***/ /* * Init some stuff */ static void init_stuff(void) { int i; char path[1024]; #ifdef USE_SAVER char tmp[1024]; #endif /* USE_SAVER */ /* Get program name with full path */ if (GetModuleFileName(hInstance, path, sizeof(path)) == 0) show_win_error(); /* Paranoia */ path[sizeof(path) - 1] = '\0'; /* Save the "program name" */ argv0 = string_make(path); /* Get the name of the "*.ini" file */ strcpy(path + strlen(path) - 4, ".INI"); #ifdef USE_SAVER /* Try to get the path to the Angband folder */ if (screensaver) { /* Extract the filename of the savefile for the screensaver */ GetPrivateProfileString("Angband", "SaverFile", "", saverfilename, sizeof(saverfilename), path); GetPrivateProfileString("Angband", "AngbandPath", "", tmp, sizeof(tmp), path); sprintf(path, "%sangband.ini", tmp); } #endif /* USE_SAVER */ /* Save the the name of the ini-file */ ini_file = string_make(path); /* Analyze the path */ i = strlen(path); /* Get the path */ for (; i > 0; i--) { if (path[i] == '\\') { /* End of path */ break; } } /* Add "lib" to the path */ strcpy(path + i + 1, "lib\\"); /* Validate the path */ validate_dir(path); /* Init the file paths */ init_file_paths(path, path, path); /* Hack -- Validate the paths */ validate_dir(ANGBAND_DIR_APEX); validate_dir(ANGBAND_DIR_EDIT); validate_dir(ANGBAND_DIR_FILE); validate_dir(ANGBAND_DIR_HELP); validate_dir(ANGBAND_DIR_PREF); validate_dir(ANGBAND_DIR_SAVE); validate_dir(ANGBAND_DIR_USER); validate_dir(ANGBAND_DIR_XTRA); /* Build the filename */ path_build(path, sizeof(path), ANGBAND_DIR_FILE, "news.txt"); /* Hack -- Validate the "news.txt" file */ validate_file(path); /* Build the filename */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_FONT, DEFAULT_FONT); /* Hack -- Validate the basic font */ validate_file(path); #ifdef USE_GRAPHICS /* Validate the "graf" directory */ validate_dir(ANGBAND_DIR_XTRA_GRAF); #endif /* USE_GRAPHICS */ #ifdef USE_SOUND /* Validate the "sound" directory */ validate_dir(ANGBAND_DIR_XTRA_SOUND); #endif /* USE_SOUND */ } int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { int i; WNDCLASS wc; HDC hdc; /* Unused parameter */ (void)nCmdShow; #ifdef USE_SAVER if (lpCmdLine && ((*lpCmdLine == '-') || (*lpCmdLine == '/'))) { lpCmdLine++; switch (*lpCmdLine) { case 's': case 'S': { screensaver = TRUE; /* Only run one screensaver at the time */ screensaverSemaphore = CreateSemaphore(NULL, 0, 1, "AngbandSaverSemaphore"); if (!screensaverSemaphore) exit(0); if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(screensaverSemaphore); exit(0); } break; } case 'P': case 'p': case 'C': case 'c': case 'A': case 'a': { /* * ToDo: implement preview, configuration, and changing * the password (as well as checking it). */ exit(0); } } } #endif /* USE_SAVER */ /* Initialize */ if (hPrevInst == NULL) { wc.style = CS_CLASSDC; wc.lpfnWndProc = AngbandWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 4; /* one long pointer to term_data */ wc.hInstance = hInst; wc.hIcon = hIcon = LoadIcon(hInst, "ANGBAND"); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(BLACK_BRUSH); wc.lpszMenuName = "ANGBAND"; wc.lpszClassName = AppName; if (!RegisterClass(&wc)) exit(1); wc.lpfnWndProc = AngbandListProc; wc.lpszMenuName = NULL; wc.lpszClassName = AngList; if (!RegisterClass(&wc)) exit(2); #ifdef USE_SAVER wc.style = CS_VREDRAW | CS_HREDRAW | CS_SAVEBITS | CS_DBLCLKS; wc.lpfnWndProc = AngbandSaverProc; wc.hCursor = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = "WindowsScreenSaverClass"; if (!RegisterClass(&wc)) exit(3); #endif /* USE_SAVER */ } setlocale(LC_CTYPE, ""); /* Save globally */ hInstance = hInst; /* Temporary hooks */ plog_aux = hack_plog; quit_aux = hack_quit; /* Prepare the filepaths */ init_stuff(); /* Determine if display is 16/256/true color */ hdc = GetDC(NULL); colors16 = (GetDeviceCaps(hdc, BITSPIXEL) == 4); paletted = ((GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) ? TRUE : FALSE); ReleaseDC(NULL, hdc); /* Initialize the colors */ for (i = 0; i < MAX_COLORS; i++) { byte rv, gv, bv; /* Extract desired values */ rv = angband_color_table[i][1]; gv = angband_color_table[i][2]; bv = angband_color_table[i][3]; /* Extract the "complex" code */ win_clr[i] = PALETTERGB(rv, gv, bv); /* Save the "simple" code */ angband_color_table[i][0] = win_pal[i]; } /* load the possible graphics modes */ if (!init_graphics_modes("graphics.txt")) { plog_fmt("Graphics list load failed"); } /* Prepare the windows */ init_windows(); /* Activate hooks */ plog_aux = hook_plog; quit_aux = hook_quit; /* Set the system suffix */ ANGBAND_SYS = "win"; #ifdef USE_SAVER if (screensaver) { /* Start the screensaver */ start_screensaver(); /* Paranoia */ quit(NULL); } #endif /* USE_SAVER */ #ifdef USE_SOUND /* Set the sound hook */ sound_hook = Term_xtra_win_sound; #endif /* USE_SOUND */ /* Did the user double click on a save file? */ check_for_save_file(lpCmdLine); /* Set command hook */ cmd_get_hook = win_get_cmd; /* Set up the display handlers and things. */ init_display(); initialized = TRUE; /* Play the game */ play_game(); /* Paranoia */ quit(NULL); /* Paranoia */ return (0); } #endif /* WINDOWS */ angband-3.5.1/src/z-quark.c0000644000175000017500000000271712456456607014775 0ustar chriscchrisc/* * File: z-quark.c * Purpose: Save memory by storing strings in a global array, ensuring * that each is only allocated once. * * Copyright (c) 1997 Ben Harrison * Copyright (c) 2007 "Elly" * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "z-virt.h" #include "z-quark.h" static char **quarks; static size_t nr_quarks = 1; static size_t alloc_quarks = 0; #define QUARKS_INIT 16 quark_t quark_add(const char *str) { quark_t q; for (q = 1; q < nr_quarks; q++) { if (!strcmp(quarks[q], str)) return q; } if (nr_quarks == alloc_quarks) { alloc_quarks *= 2; quarks = mem_realloc(quarks, alloc_quarks * sizeof(char *)); } q = nr_quarks++; quarks[q] = string_make(str); return q; } const char *quark_str(quark_t q) { return (q >= nr_quarks ? NULL : quarks[q]); } errr quarks_init(void) { alloc_quarks = QUARKS_INIT; quarks = C_ZNEW(alloc_quarks, char *); return 0; } errr quarks_free(void) { size_t i; /* quarks[0] is special */ for (i = 1; i < nr_quarks; i++) string_free(quarks[i]); FREE(quarks); return 0; } angband-3.5.1/src/game-event.c0000644000175000017500000000664712456456606015440 0ustar chriscchrisc/* * File: game-event.c * Purpose: Allows the registering of handlers to be told about game events. * * Copyright (c) 2007 Antony Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include #include "z-virt.h" #include "game-event.h" struct event_handler_entry { struct event_handler_entry *next; game_event_handler *fn; void *user; }; static struct event_handler_entry *event_handlers[N_GAME_EVENTS]; static void game_event_dispatch(game_event_type type, game_event_data *data) { struct event_handler_entry *this = event_handlers[type]; /* * Send the word out to all interested event handlers. */ while (this) { /* Call the handler with the relevant data */ this->fn(type, data, this->user); this = this->next; } } void event_add_handler(game_event_type type, game_event_handler *fn, void *user) { struct event_handler_entry *new; assert(fn != NULL); /* Make a new entry */ new = mem_alloc(sizeof *new); new->fn = fn; new->user = user; /* Add it to the head of the appropriate list */ new->next = event_handlers[type]; event_handlers[type] = new; } void event_remove_handler(game_event_type type, game_event_handler *fn, void *user) { struct event_handler_entry *prev = NULL; struct event_handler_entry *this = event_handlers[type]; /* Look for the entry in the list */ while (this) { /* Check if this is the entry we want to remove */ if (this->fn == fn && this->user == user) { if (!prev) { event_handlers[type] = this->next; } else { prev->next = this->next; } mem_free(this); return; } prev = this; this = this->next; } } void event_remove_all_handlers(void) { int type; struct event_handler_entry *handler, *next; for (type = 0; type < N_GAME_EVENTS; type++) { handler = event_handlers[type]; while (handler) { next = handler->next; mem_free(handler); handler = next; } event_handlers[type] = NULL; } } void event_add_handler_set(game_event_type *type, size_t n_types, game_event_handler *fn, void *user) { size_t i; for (i = 0; i < n_types; i++) event_add_handler(type[i], fn, user); } void event_remove_handler_set(game_event_type *type, size_t n_types, game_event_handler *fn, void *user) { size_t i; for (i = 0; i < n_types; i++) event_remove_handler(type[i], fn, user); } void event_signal(game_event_type type) { game_event_dispatch(type, NULL); } void event_signal_flag(game_event_type type, bool flag) { game_event_data data; data.flag = flag; game_event_dispatch(type, &data); } void event_signal_point(game_event_type type, int x, int y) { game_event_data data; data.point.x = x; data.point.y = y; game_event_dispatch(type, &data); } void event_signal_string(game_event_type type, const char *s) { game_event_data data; data.string = s; game_event_dispatch(type, &data); } void event_signal_birthpoints(int stats[6], int remaining) { game_event_data data; data.birthstats.stats = stats; data.birthstats.remaining = remaining; game_event_dispatch(EVENT_BIRTHPOINTS, &data); } angband-3.5.1/src/textui.h0000644000175000017500000000051312456456606014721 0ustar chriscchrisc #include "game-cmd.h" /* From xtra3.c */ /* Ask the textui core for a game command. */ extern errr textui_get_cmd(cmd_context context, bool wait); /* Set up game event handlers for the textui. */ void init_display(void); /* From cmd0.c */ /* Get a command through the text UI */ void textui_process_command(bool no_request); angband-3.5.1/src/ui-menu.h0000644000175000017500000002232312456456606014761 0ustar chriscchrisc#ifndef INCLUDED_UI_MENU_H #define INCLUDED_UI_MENU_H /*** Constants ***/ /* Colors for interactive menus */ enum { CURS_UNKNOWN = 0, /* Use gray / dark blue for cursor */ CURS_KNOWN = 1 /* Use white / light blue for cursor */ }; /** * Type wrapper for various row styles. */ typedef enum _menu_row_style_t { MN_ROW_STYLE_DISABLED = CURS_UNKNOWN, MN_ROW_STYLE_ENABLED = CURS_KNOWN, } menu_row_style_t; /** * Type wrapper for row validity. */ typedef enum _menu_row_validity_t { MN_ROW_INVALID = 0, MN_ROW_VALID = 1, MN_ROW_HIDDEN = 2, } menu_row_validity_t; /* Cursor colours for different states */ extern const byte curs_attrs[2][2]; /* Standard menu orderings */ extern const char lower_case[]; /* abc..z */ extern const char upper_case[]; /* ABC..Z */ extern const char all_letters[]; /* abc..zABC..Z */ /* Together, these classes define the constant properties of the various menu classes. A menu consists of: - menu_iter, which describes how to handle the type of "list" that's being displayed as a menu - a menu_skin, which describes the layout of the menu on the screen. - various bits and bobs of other data (e.g. the actual list of entries) */ typedef struct menu_type menu_type; /*** Predefined menu "skins" ***/ /** * Types of predefined skins available. */ typedef enum { /* * A simple list of actions with an associated name and id. * Private data: an array of menu_action */ MN_ITER_ACTIONS = 1, /* * A list of strings to be selected from - no associated actions. * Private data: an array of const char * */ MN_ITER_STRINGS = 2 } menu_iter_id; /** * Primitive menu item with bound action. */ typedef struct { int flags; char tag; const char *name; void (*action)(const char *title, int row); } menu_action; /** * Flags for menu_actions. */ #define MN_ACT_GRAYED 0x0001 /* Allows selection but no action */ #define MN_ACT_HIDDEN 0x0002 /* Row is hidden, but may be selected via tag */ /** * Underlying function set for displaying lists in a certain kind of way. */ typedef struct { /* Returns menu item tag (optional) */ char (*get_tag)(menu_type *menu, int oid); /* * Validity checker (optional--all rows are assumed valid if not present) * Return values will be interpreted as: 0 = no, 1 = yes, 2 = hide. */ int (*valid_row)(menu_type *menu, int oid); /* Displays a menu row */ void (*display_row)(menu_type *menu, int oid, bool cursor, int row, int col, int width); /* Handle 'positive' events (selections or cmd_keys) */ /* XXX split out into a select handler and a cmd_key handler */ bool (*row_handler)(menu_type *menu, const ui_event *event, int oid); /* Called when the screen resizes */ void (*resize)(menu_type *m); } menu_iter; /*** Menu skins ***/ /** * Identifiers for the kind of layout to use */ typedef enum { MN_SKIN_SCROLL = 1, /**< Ordinary scrollable single-column list */ MN_SKIN_COLUMNS = 2 /**< Multicolumn view */ } skin_id; /* Class functions for menu layout */ typedef struct { /* Determines the cursor index given a (mouse) location */ int (*get_cursor)(int row, int col, int n, int top, region *loc); /* Displays the current list of visible menu items */ void (*display_list)(menu_type *menu, int cursor, int *top, region *); /* Specifies the relative menu item given the state of the menu */ char (*get_tag)(menu_type *menu, int pos); /* Process a direction */ ui_event (*process_dir)(menu_type *menu, int dir); } menu_skin; /*** Base menu structure ***/ /** * Flags for menu appearance & behaviour */ enum { /* Tags are associated with the view, not the element */ MN_REL_TAGS = 0x01, /* No tags -- movement key and mouse browsing only */ MN_NO_TAGS = 0x02, /* Tags to be generated by the display function */ MN_PVT_TAGS = 0x04, /* Tag selections can be made regardless of the case of the key pressed. * i.e. 'a' activates the line tagged 'A'. */ MN_CASELESS_TAGS = 0x08, /* double tap (or keypress) for selection; single tap is cursor movement */ MN_DBL_TAP = 0x10, /* no select events to be triggered */ MN_NO_ACTION = 0x20 }; /* Base menu type */ struct menu_type { /** Public variables **/ const char *header; const char *title; const char *prompt; /* Keyboard shortcuts for menu selection-- shouldn't overlap cmd_keys */ const char *selections; /* String of characters that when pressed, menu handler should be called */ /* Mustn't overlap with 'selections' or some items may be unselectable */ const char *cmd_keys; /* auxiliary browser help function */ void (*browse_hook)(int oid, void *db, const region *loc); /* Flags specifying the behavior of this menu (from menu_type_flags) */ int flags; /** Private variables **/ /* Stored boundary, set by menu_layout(). This is used to calculate * where the menu should be displayed on display & resize */ region boundary; int filter_count; /* number of rows in current view */ const int *filter_list; /* optional filter (view) of menu objects */ int count; /* number of rows in underlying data set */ void *menu_data; /* the data used to access rows. */ const menu_skin *skin; /* menu display style functions */ const menu_iter *row_funcs; /* menu skin functions */ /* State variables */ int cursor; /* Currently selected row */ int top; /* Position in list for partial display */ region active; /* Subregion actually active for selection */ int cursor_x_offset; /* Adjustment to the default position of the cursor on a line. */ }; /*** Menu API ***/ /** * Allocate and return a new, initialised, menu. */ menu_type *menu_new(skin_id, const menu_iter *iter); menu_type *menu_new_action(menu_action *acts, size_t n); void menu_free(menu_type *m); /** * Initialise a menu, using the skin and iter functions specified. */ void menu_init(menu_type *menu, skin_id skin, const menu_iter *iter); /** * Given a predefined menu kind, return its iter functions. */ const menu_iter *menu_find_iter(menu_iter_id iter_id); /** * Set menu private data and the number of menu items. * * Menu private data is then available from inside menu callbacks using * menu_priv(). */ void menu_setpriv(menu_type *menu, int count, void *data); /** * Return menu private data, set with menu_setpriv(). */ void *menu_priv(menu_type *menu); /* * Set a filter on what items a menu can display. * * Use this if your menu private data has 100 items, but you want to choose * which ones of those to display at any given time, e.g. in an inventory menu. * object_list[] should be an array of indexes to display, and n should be its * length. */ void menu_set_filter(menu_type *menu, const int object_list[], int n); /** * Remove any filters set on a menu by menu_set_filer(). */ void menu_release_filter(menu_type *menu); /** * Ready a menu for display in the region specified. * * XXX not ready for dynamic resizing just yet */ bool menu_layout(menu_type *menu, const region *loc); /** * Display a menu. * If reset_screen is true, it will reset the screen to the previously saved * state before displaying. */ void menu_refresh(menu_type *menu, bool reset_screen); /** * Run a menu. * * 'notify' is a bitwise OR of ui_event_type events that you want to * menu_select to return to you if they're not handled inside the menu loop. * e.g. if you want to handle key events without specifying a menu_iter->handle * function, you can set notify to EVT_KBRD, and any non-navigation keyboard * events will stop the menu loop and return them to you. * * Some events are returned by default, and else are EVT_ESCAPE and EVT_SELECT. * * Event types that can be returned: * EVT_ESCAPE: no selection; go back (by default) * EVT_SELECT: menu->cursor is the selected menu item (by default) * EVT_MOVE: the cursor has moved * EVT_KBRD: unhandled keyboard events * EVT_MOUSE: unhandled mouse events * EVT_RESIZE: resize events * * XXX remove 'notify' * * If popup is TRUE, the screen background is saved before starting the menu, * and restored before each redraw. This allows variably-sized information * at the bottom of the menu. */ ui_event menu_select(menu_type *menu, int notify, bool popup); /** * Set the menu cursor to the next valid row. */ void menu_ensure_cursor_valid(menu_type *m); /* Interal menu stuff that cmd-know needs because it's quite horrible */ bool menu_handle_mouse(menu_type *menu, const ui_event *in, ui_event *out); bool menu_handle_keypress(menu_type *menu, const ui_event *in, ui_event *out); /** * Allow adjustment of the cursor's default x offset. */ void menu_set_cursor_x_offset(menu_type *m, int offset); /*** Dynamic menu handling ***/ menu_type *menu_dynamic_new(void); void menu_dynamic_add(menu_type *m, const char *text, int value); void menu_dynamic_add_valid(menu_type *m, const char *text, int value, menu_row_validity_t valid); void menu_dynamic_add_label(menu_type *m, const char *text, const char label, int value, char *label_list); void menu_dynamic_add_label_valid(menu_type *m, const char *text, const char label, int value, char *label_list, menu_row_validity_t valid); size_t menu_dynamic_longest_entry(menu_type *m); int menu_dynamic_select(menu_type *m); void menu_dynamic_free(menu_type *m); #endif /* INCLUDED_UI_MENU_H */ angband-3.5.1/src/grafmode.c0000644000175000017500000001240212456456606015156 0ustar chriscchrisc/* * File: grafmode.c * Purpose: load a list of possible graphics modes. * * Copyright (c) 2011 Brett Reid * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband license": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "grafmode.h" #include "parser.h" graphics_mode *graphics_modes; graphics_mode *current_graphics_mode = NULL; int graphics_mode_high_id; static enum parser_error parse_graf_n(struct parser *p) { graphics_mode *list = parser_priv(p); graphics_mode *mode = mem_zalloc(sizeof(graphics_mode)); if (!mode) { return PARSE_ERROR_OUT_OF_MEMORY; } mode->pNext = list; mode->grafID = parser_getuint(p, "index"); strncpy(mode->menuname, parser_getstr(p, "menuname"), 32); mode->alphablend = 0; mode->overdrawRow = 0; mode->overdrawMax = 0; strncpy(mode->file, "", 32); strncpy(mode->pref, "none", 32); parser_setpriv(p, mode); return PARSE_ERROR_NONE; } static enum parser_error parse_graf_i(struct parser *p) { graphics_mode *mode = parser_priv(p); if (!mode) { return PARSE_ERROR_INVALID_VALUE; } mode->cell_width = parser_getuint(p, "wid"); mode->cell_height = parser_getuint(p, "hgt"); strncpy(mode->file, parser_getstr(p, "filename"), 32); return PARSE_ERROR_NONE; } static enum parser_error parse_graf_p(struct parser *p) { graphics_mode *mode = parser_priv(p); if (!mode) { return PARSE_ERROR_INVALID_VALUE; } strncpy(mode->pref, parser_getstr(p, "prefname"), 32); return PARSE_ERROR_NONE; } static enum parser_error parse_graf_x(struct parser *p) { graphics_mode *mode = parser_priv(p); if (!mode) { return PARSE_ERROR_INVALID_VALUE; } mode->alphablend = parser_getuint(p, "alpha"); mode->overdrawRow = parser_getuint(p, "row"); mode->overdrawMax = parser_getuint(p, "max"); return PARSE_ERROR_NONE; } static struct parser *init_parse_grafmode(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "V sym version", ignored); parser_reg(p, "N uint index str menuname", parse_graf_n); parser_reg(p, "I uint wid uint hgt str filename", parse_graf_i); parser_reg(p, "P str prefname", parse_graf_p); parser_reg(p, "X uint alpha uint row uint max", parse_graf_x); return p; } static errr finish_parse_grafmode(struct parser *p) { graphics_mode *mode, *n; int max = 0; int count = 0; int i; /* see how many graphics modes we have and what the highest index is */ if (p) { mode = parser_priv(p); while (mode) { if (mode->grafID > max) { max = mode->grafID; } count++; mode = mode->pNext; } } /* copy the loaded modes to the global variable */ if (graphics_modes) { close_graphics_modes(); } graphics_modes = mem_zalloc(sizeof(graphics_mode) * (count+1)); if (p) { mode = parser_priv(p); for (i = count-1; i >= 0; i--, mode = mode->pNext) { memcpy(&(graphics_modes[i]), mode, sizeof(graphics_mode)); graphics_modes[i].pNext = &(graphics_modes[i+1]); } } /* hardcode the no graphics option */ graphics_modes[count].pNext = NULL; graphics_modes[count].grafID = GRAPHICS_NONE; graphics_modes[count].alphablend = 0; graphics_modes[count].overdrawRow = 0; graphics_modes[count].overdrawMax = 0; strncpy(graphics_modes[count].pref, "none", 8); strncpy(graphics_modes[count].file, "", 32); strncpy(graphics_modes[count].menuname, "None", 32); graphics_mode_high_id = max; /* set the default graphics mode to be no graphics */ current_graphics_mode = &(graphics_modes[count]); if (p) { mode = parser_priv(p); while (mode) { n = mode->pNext; mem_free(mode); mode = n; } parser_setpriv(p, NULL); parser_destroy(p); } return PARSE_ERROR_NONE; } static void print_error(const char *name, struct parser *p) { struct parser_state s; parser_getstate(p, &s); msg("Parse error in %s line %d column %d: %s: %s", name, s.line, s.col, s.msg, parser_error_str[s.error]); message_flush(); } bool init_graphics_modes(const char *filename) { char buf[1024]; ang_file *f; struct parser *p; errr e = 0; int line_no = 0; /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, filename); f = file_open(buf, MODE_READ, FTYPE_TEXT); if (!f) { msg("Cannot open '%s'.", buf); finish_parse_grafmode(NULL); } else { char line[1024]; p = init_parse_grafmode(); while (file_getl(f, line, sizeof line)) { line_no++; e = parser_parse(p, line); if (e != PARSE_ERROR_NONE) { print_error(buf, p); break; } } finish_parse_grafmode(p); file_close(f); } /* Result */ return e == PARSE_ERROR_NONE; } void close_graphics_modes(void) { if (graphics_modes) { mem_free(graphics_modes); graphics_modes = NULL; /*graphics_mode *test,*next; test = graphics_modes; while (test) { next = test->pNext; delete(test); test = next; }*/ } } graphics_mode* get_graphics_mode(byte id) { graphics_mode *test = graphics_modes; while (test) { if (test->grafID == id) { return test; } test = test->pNext; } return NULL; } angband-3.5.1/src/main.h0000644000175000017500000000336112456456606014327 0ustar chriscchrisc/* File: main.h */ /* * Copyright (c) 2002 Robert Ruehlmann * * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef INCLUDED_MAIN_H #define INCLUDED_MAIN_H #include "angband.h" extern errr init_sound_sdl(int argc, char **argv); extern errr init_lfb(int argc, char **argv); extern errr init_x11(int argc, char **argv); extern errr init_xpj(int argc, char **argv); extern errr init_gcu(int argc, char **argv); extern errr init_cap(int argc, char **argv); extern errr init_dos(int argc, char **argv); extern errr init_ibm(int argc, char **argv); extern errr init_emx(int argc, char **argv); extern errr init_sla(int argc, char **argv); extern errr init_lsl(int argc, char **argv); extern errr init_ami(int argc, char **argv); extern errr init_vme(int argc, char **argv); extern errr init_vcs(int argc, char **argv); extern errr init_sdl(int argc, char **argv); extern errr init_test(int argc, char **argv); extern errr init_stats(int argc, char **argv); extern const char help_lfb[]; extern const char help_xpj[]; extern const char help_x11[]; extern const char help_vcs[]; extern const char help_gtk[]; extern const char help_gcu[]; extern const char help_cap[]; extern const char help_vme[]; extern const char help_ami[]; extern const char help_lsl[]; extern const char help_sla[]; extern const char help_emx[]; extern const char help_ibm[]; extern const char help_dos[]; extern const char help_sdl[]; extern const char help_test[]; extern const char help_stats[]; struct module { const char *name; const char *help; errr (*init)(int argc, char **argv); }; #endif /* INCLUDED_MAIN_H */ angband-3.5.1/src/Makefile.src0000644000175000017500000000534612456456606015465 0ustar chriscchrisc# # File: Makefile.src # # A makefile which includes the current object files, hopefully includable # across a range of different makefiles, to cut down on maintenance. # VERSION = 3.5.1 COPYRIGHT = (c) 1995-2015 Angband contributors HEADERS = \ angband.h \ birth.h \ cmds.h \ config.h \ defines.h \ effects.h \ externs.h \ game-cmd.h \ game-event.h \ guid.h \ h-basic.h \ init.h \ main.h \ option.h \ parser.h \ types.h \ ui-event.h \ ui.h \ ui-menu.h \ wizard.h \ z-bitflag.h \ z-file.h \ z-form.h \ z-msg.h \ z-quark.h \ z-queue.h \ z-rand.h \ z-set.h \ z-term.h \ z-type.h \ z-util.h \ z-virt.h ZFILES = z-bitflag.o z-file.o z-form.o z-msg.o z-quark.o z-queue.o z-rand.o \ z-set.o z-term.o z-type.o z-util.o z-virt.o z-textblock.o # MAINFILES is defined by autotools (or manually) to be combinations of these BASEMAINFILES = main.o GCUMAINFILES = main-gcu.o OSXMAINFILES = main-crb.o SDLMAINFILES = main-sdl.o SNDSDLFILES = snd-sdl.o TESTMAINFILES = main-test.o WINMAINFILES = \ win/angband.res \ main-win.o \ win/readdib.o \ win/readpng.o \ win/scrnshot.o \ win/win-layout.o X11MAINFILES = main-x11.o ANGFILES = \ attack.o \ birth.o \ cave.o \ cmd-cave.o \ cmd-context.o \ cmd-know.o \ cmd-misc.o \ cmd-obj.o \ cmd-pickup.o \ cmd-process.o \ death.o \ debug.o \ dungeon.o \ effects.o \ files.o \ game-cmd.o \ game-event.o \ generate.o \ grafmode.o \ guid.o \ history.o \ init.o \ keymap.o \ load.o \ monster/mon-init.o \ monster/melee1.o \ monster/melee2.o \ monster/mon-list.o \ monster/mon-lore.o \ monster/mon-make.o \ monster/mon-msg.o \ monster/mon-power.o \ monster/mon-spell.o \ monster/mon-timed.o \ monster/mon-util.o \ object/chest.o \ object/identify.o \ object/obj-desc.o \ object/obj-flag.o \ object/obj-info.o \ object/obj-list.o \ object/obj-make.o \ object/obj-power.o \ object/obj-ui.o \ object/obj-util.o \ object/pval.o \ object/randart.o \ object/slays.o \ option.o \ parser.o \ randname.o \ pathfind.o \ prefs.o \ player/calcs.o \ player/class.o \ player/player.o \ player/race.o \ player/spell.o \ player/timed.o \ player/p-util.o \ quest.o \ score.o \ signals.o \ save.o \ savefile.o \ spells1.o \ spells2.o \ squelch.o \ store.o \ tables.o \ target.o \ trap.o \ ui.o \ ui-birth.o \ ui-event.o \ ui-knowledge.o \ ui-menu.o \ ui-options.o \ ui-spell.o \ util.o \ variable.o \ wiz-spoil.o \ wiz-stats.o \ wizard.o \ x-spell.o \ xtra2.o \ xtra3.o \ borg/borg1.o \ borg/borg2.o \ borg/borg3.o \ borg/borg4.o \ borg/borg5.o \ borg/borg6.o \ borg/borg7.o \ borg/borg8.o \ borg/borg9.o STATSMAINFILES = main-stats.o \ stats/db.o buildid.o: $(ANGFILES) ANGFILES += buildid.o angband-3.5.1/src/death.c0000644000175000017500000002214612456456606014465 0ustar chriscchrisc/* * File: death.c * Purpose: Handle the UI bits that happen after the character dies. * * Copyright (c) 1987 - 2007 Angband contributors * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "death.h" #include "files.h" #include "history.h" #include "savefile.h" #include "ui-menu.h" #include "wizard.h" /* * Hack - save the time of death */ static time_t death_time = (time_t)0; /* * Write formatted string `fmt` on line `y`, centred between points x1 and x2. */ static void put_str_centred(int y, int x1, int x2, const char *fmt, ...) { va_list vp; char *tmp; size_t len; int x; /* Format into the (growable) tmp */ va_start(vp, fmt); tmp = vformat(fmt, vp); va_end(vp); /* Centre now */ len = strlen(tmp); x = x1 + ((x2-x1)/2 - len/2); put_str(tmp, y, x); } /* * Display the tombstone */ static void print_tomb(void) { ang_file *fp; char buf[1024]; int line = 0; Term_clear(); /* Open the death file */ path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "dead.txt"); fp = file_open(buf, MODE_READ, FTYPE_TEXT); if (fp) { while (file_getl(fp, buf, sizeof(buf))) put_str(buf, line++, 0); file_close(fp); } line = 7; put_str_centred(line++, 8, 8+31, "%s", op_ptr->full_name); put_str_centred(line++, 8, 8+31, "the"); if (p_ptr->total_winner) put_str_centred(line++, 8, 8+31, "Magnificent"); else put_str_centred(line++, 8, 8+31, "%s", p_ptr->class->title[(p_ptr->lev - 1) / 5]); line++; put_str_centred(line++, 8, 8+31, "%s", p_ptr->class->name); put_str_centred(line++, 8, 8+31, "Level: %d", (int)p_ptr->lev); put_str_centred(line++, 8, 8+31, "Exp: %d", (int)p_ptr->exp); put_str_centred(line++, 8, 8+31, "AU: %d", (int)p_ptr->au); put_str_centred(line++, 8, 8+31, "Killed on Level %d", p_ptr->depth); put_str_centred(line++, 8, 8+31, "by %s.", p_ptr->died_from); line++; put_str_centred(line++, 8, 8+31, "by %-.24s", ctime(&death_time)); } /* * Know inventory and home items upon death */ static void death_knowledge(void) { struct store *st_ptr = &stores[STORE_HOME]; object_type *o_ptr; int i; for (i = 0; i < ALL_INVEN_TOTAL; i++) { o_ptr = &p_ptr->inventory[i]; if (!o_ptr->kind) continue; object_flavor_aware(o_ptr); object_notice_everything(o_ptr); } for (i = 0; i < st_ptr->stock_num; i++) { o_ptr = &st_ptr->stock[i]; if (!o_ptr->kind) continue; object_flavor_aware(o_ptr); object_notice_everything(o_ptr); } history_unmask_unknown(); /* Hack -- Recalculate bonuses */ p_ptr->update |= (PU_BONUS); handle_stuff(p_ptr); } /* * Display the winner crown */ static void display_winner(void) { char buf[1024]; ang_file *fp; int wid, hgt; int i = 2; int width = 0; path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "crown.txt"); fp = file_open(buf, MODE_READ, FTYPE_TEXT); Term_clear(); Term_get_size(&wid, &hgt); if (fp) { /* Get us the first line of file, which tells us how long the */ /* longest line is */ file_getl(fp, buf, sizeof(buf)); sscanf(buf, "%d", &width); if (!width) width = 25; /* Dump the file to the screen */ while (file_getl(fp, buf, sizeof(buf))) put_str(buf, i++, (wid/2) - (width/2)); file_close(fp); } put_str_centred(i, 0, wid, "All Hail the Mighty %s!", p_ptr->sex->winner); flush(); pause_line(Term); } /* * Menu command: dump character dump to file. */ static void death_file(const char *title, int row) { char buf[1024]; char ftmp[80]; strnfmt(ftmp, sizeof(ftmp), "%s.txt", player_safe_name(p_ptr, FALSE)); if (get_file(ftmp, buf, sizeof buf)) { errr err; /* Dump a character file */ screen_save(); err = file_character(buf, FALSE); screen_load(); /* Check result */ if (err) msg("Character dump failed!"); else msg("Character dump successful."); /* Flush messages */ message_flush(); } } /* * Menu command: view character dump and inventory. */ static void death_info(const char *title, int row) { int i, j, k; object_type *o_ptr; struct store *st_ptr = &stores[STORE_HOME]; screen_save(); /* Display player */ display_player(0); /* Prompt for inventory */ prt("Hit any key to see more information: ", 0, 0); /* Allow abort at this point */ (void)anykey(); /* Show equipment and inventory */ /* Equipment -- if any */ if (p_ptr->equip_cnt) { Term_clear(); show_equip(OLIST_WEIGHT | OLIST_SEMPTY); prt("You are using: -more-", 0, 0); (void)anykey(); } /* Inventory -- if any */ if (p_ptr->inven_cnt) { Term_clear(); show_inven(OLIST_WEIGHT); prt("You are carrying: -more-", 0, 0); (void)anykey(); } /* Home -- if anything there */ if (st_ptr->stock_num) { /* Display contents of the home */ for (k = 0, i = 0; i < st_ptr->stock_num; k++) { /* Clear screen */ Term_clear(); /* Show 12 items */ for (j = 0; (j < 12) && (i < st_ptr->stock_num); j++, i++) { byte attr; char o_name[80]; char tmp_val[80]; /* Get the object */ o_ptr = &st_ptr->stock[i]; /* Print header, clear line */ strnfmt(tmp_val, sizeof(tmp_val), "%c) ", I2A(j)); prt(tmp_val, j+2, 4); /* Get the object description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Get the inventory color */ attr = tval_to_attr[o_ptr->tval % N_ELEMENTS(tval_to_attr)]; /* Display the object */ c_put_str(attr, o_name, j+2, 7); } /* Caption */ prt(format("Your home contains (page %d): -more-", k+1), 0, 0); /* Wait for it */ (void)anykey(); } } screen_load(); } /* * Menu command: peruse pre-death messages. */ static void death_messages(const char *title, int row) { screen_save(); do_cmd_messages(); screen_load(); } /* * Menu command: see top twenty scores. */ static void death_scores(const char *title, int row) { screen_save(); show_scores(); screen_load(); } /* * Menu command: examine items in the inventory. */ static void death_examine(const char *title, int row) { int item; const char *q, *s; /* Get an item */ q = "Examine which item? "; s = "You have nothing to examine."; while (get_item(&item, q, s, 0, (USE_INVEN | USE_EQUIP | IS_HARMLESS))) { char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; object_type *o_ptr = &p_ptr->inventory[item]; tb = object_info(o_ptr, OINFO_FULL); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL | ODESC_CAPITAL); textui_textblock_show(tb, area, header); textblock_free(tb); } } /* * Menu command: view character history. */ static void death_history(const char *title, int row) { history_display(); } /* * Menu command: allow spoiler generation (mainly for randarts). */ static void death_spoilers(const char *title, int row) { do_cmd_spoilers(); } /* Menu command: toggle birth_keep_randarts option. */ static void death_randarts(const char *title, int row) { if (OPT(birth_randarts)) option_set(option_name(OPT_birth_keep_randarts), get_check("Keep randarts for next game? ")); else msg("You are not playing with randarts!"); } /* * Menu structures for the death menu. Note that Quit must always be the * last option, due to a hard-coded check in death_screen */ static menu_action death_actions[] = { { 0, 'i', "Information", death_info }, { 0, 'm', "Messages", death_messages }, { 0, 'f', "File dump", death_file }, { 0, 'v', "View scores", death_scores }, { 0, 'x', "Examine items", death_examine }, { 0, 'h', "History", death_history }, { 0, 's', "Spoilers", death_spoilers }, { 0, 'r', "Keep randarts", death_randarts }, { 0, 'q', "Quit", NULL }, }; /* * Handle character death */ void death_screen(void) { menu_type *death_menu; bool done = FALSE; const region area = { 51, 2, 0, N_ELEMENTS(death_actions) }; /* Retire in the town in a good state */ if (p_ptr->total_winner) { p_ptr->depth = 0; my_strcpy(p_ptr->died_from, "Ripe Old Age", sizeof(p_ptr->died_from)); p_ptr->exp = p_ptr->max_exp; p_ptr->lev = p_ptr->max_lev; p_ptr->au += 10000000L; display_winner(); } /* Get time of death */ (void)time(&death_time); print_tomb(); death_knowledge(); enter_score(&death_time); /* Flush all input and output */ flush(); message_flush(); /* Display and use the death menu */ death_menu = menu_new_action(death_actions, N_ELEMENTS(death_actions)); death_menu->flags = MN_CASELESS_TAGS; menu_layout(death_menu, &area); while (!done) { ui_event e = menu_select(death_menu, EVT_KBRD, FALSE); if (e.type == EVT_KBRD) { if (e.key.code == KTRL('X')) break; } else if (e.type == EVT_SELECT) { done = get_check("Do you want to quit? "); } } menu_free(death_menu); /* Save dead player */ if (!savefile_save(savefile)) { msg("death save failed!"); message_flush(); } } angband-3.5.1/src/angband.man0000644000175000017500000000710212456456606015316 0ustar chriscchrisc.\" Hey, Emacs! This is an -*- nroff -*- source file. .\" Copyright (c) 1997 Manoj Srivastava .\" .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 2 of .\" the License, or (at your option) any later version. .\" .\" The GNU General Public License's references to "object code" .\" and "executables" are to be interpreted as the output of any .\" document formatting or typesetting system, including .\" intermediate and printed output. .\" .\" This manual 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 manual; if not, write to the Free .\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, .\" USA. .\" .\" This manual 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 manual; if not, write to the Free .\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, .\" USA. .\" .\" arch-tag: 393fc0e6-b0d3-42a9-a5d7-265743f99582 .\" $Id: angband.man,v 1.5 2002/01/17 05:30:43 srivasta Exp $ .TH ANGBAND 6 "February 16 1998" "Debian" "Debian GNU/Linux manual" .SH NAME angband \- is a graphical dungeon adventure game in the vein of rogue .SH SYNOPSIS .B angband .I [options] .I [\-\- suboptions] .SH DESCRIPTION This manual page explains the Debian package .B "angband". .B Angband is a single-player, .I graphical dungeon adventure game using textual characters to represent the walls and floors of a dungeon and the inhabitants therein, in the vein of .I rogue, .I hack, .I nethack, and .I moria. .B Angband 3.5.1 is an official stable release incorporating all the changes and improvements added since the last official stable release ( .B Angband 3.4.1). .PP This version of .B Angband has been compiled with .I ncurses and the .I X Windowing system, SDL and GTK front-ends, and hence can be played on a virtual console as well as under .I X. In the latter cases, the game can use multiple windows. .SH OPTIONS .PD 0 .TP 10 .B \-h Print out a usage message. .TP .BR \-n Start a new character .TP .BR \-w Request wizard mode (no high score entry) .TP .BR \-g Request graphics mode .TP .BR \-r Rebalance monsters .TP .BR \-s Show high scores .TP .BR \-u Use your savefile .TP .BR \-m Use core code (e.g. gcu for console mode, x11 or sdl for graphics) .TP .BR \-d= Define a \'lib\' dir sub-path. Valid values of lib are help info user bone save data apex xtra edit file .PD .SH "GETTING STARTED" To start with, you can just say angband \-uTest, and that creates a save file with the file name .I ~/.angband/Angband/save/.Test. The best place to get help is the program itself; help is reached by the command .B ? and presents a menu of choices. .PP Program options can be set using the = command. To see what the various options mean, access the List of Options help menu with the ? command. .SH "SEE ALSO" .BR nethack (6). .SH AUTHOR This manual page was written Manoj Srivastava , for the Debian GNU/Linux system. angband-3.5.1/src/config.h0000644000175000017500000000677512456456606014664 0ustar chriscchrisc#ifndef INCLUDED_CONFIG_H #define INCLUDED_CONFIG_H /*** Some really important things you ought to change ***/ /* * Defines the default paths to the Angband directories, for ports that use * the main.c file. * * "config path" is for per-installation configurable data, like the game's * edit files and system-wide preferences. * * "lib path" is for static data, like sounds, graphics and fonts. * * "data path" is for variable data, like save files and scores. On single- * user systems, this also includes user preferences and dumps (on multi- * user systems these go under the user's home directory). * * The configure script overrides these values. Check the "--prefix=" * option of the configure script. * * These values will be over-ridden by the "ANGBAND_PATH" environment * variable, if that variable is defined and accessible. The final * "slash" is required if the value supplied is in fact a directory. * * Using the value "./lib/" below tells Angband that, by default, * the user will run "angband" from the same directory that contains * the "lib" directory. This is a reasonable (but imperfect) default. * * If at all possible, you should change this value to refer to the * actual location of the folders, for example, "/etc/angband/" * or "/usr/share/angband/", or "/var/games/angband/". In fact, if at all * possible you should use a packaging system which does this for you. * * N.B. The data path is only used if USE_PRIVATE_PATHS is not defined. * The other two are always used. */ #ifndef DEFAULT_CONFIG_PATH # define DEFAULT_CONFIG_PATH "." PATH_SEP "lib" PATH_SEP #endif #ifndef DEFAULT_LIB_PATH # define DEFAULT_LIB_PATH "." PATH_SEP "lib" PATH_SEP #endif #ifndef DEFAULT_DATA_PATH # define DEFAULT_DATA_PATH "." PATH_SEP "lib" PATH_SEP #endif /* * OPTION: Create and use a hidden directory in the users home directory * for storing pref files and character dumps. */ #if defined(UNIX) && !defined(MACH_O_CARBON) && !defined(PRIVATE_USER_PATH) # define PRIVATE_USER_PATH "~/.angband" #endif /* * OPTION: Create and use hidden directories in the users home directory * for storing save files and high-scores */ #ifdef PRIVATE_USER_PATH /* # define USE_PRIVATE_PATHS */ #endif /* PRIVATE_USER_PATH */ /*** Some no-brainer defines ***/ /* Allow the game to make noises correlating to what the player does in-game */ #define USE_SOUND /* Allow the use of graphics rather than only having a text-mode */ #define USE_GRAPHICS /* Compile in support for debug commands */ #define ALLOW_DEBUG /* Compile in support for spoiler generation */ #define ALLOW_SPOILERS /* Allow changing colours at runtime */ #define ALLOW_COLORS /* Allow changing "visuals" at runtime */ #define ALLOW_VISUALS /*** Borg ***/ /* Compile in support for the borg. */ #define ALLOW_BORG /* Allow borgs to yield "high scores"? */ #define SCORE_BORGS /* * Allow the Borg to use graphics. */ #if defined(ALLOW_BORG) && defined(USE_GRAPHICS) # define ALLOW_BORG_GRAPHICS #endif /*** X11 settings ***/ /* * OPTION: Gamma correct colours (with X11) */ #define SUPPORT_GAMMA /* * OPTION: Default font (when using X11). */ #define DEFAULT_X11_FONT "9x15" /* * OPTION: Default fonts (when using X11) */ #define DEFAULT_X11_FONT_0 "10x20" #define DEFAULT_X11_FONT_1 "9x15" #define DEFAULT_X11_FONT_2 "9x15" #define DEFAULT_X11_FONT_3 "5x8" #define DEFAULT_X11_FONT_4 "5x8" #define DEFAULT_X11_FONT_5 "5x8" #define DEFAULT_X11_FONT_6 "5x8" #define DEFAULT_X11_FONT_7 "5x8" #endif /* !INCLUDED_CONFIG_H */ angband-3.5.1/src/randname.h0000644000175000017500000000075112456456606015170 0ustar chriscchrisc#ifndef RANDNAME_H #define RANDNAME_H /* * The different types of name randname.c can generate * which is also the number of sections in names.txt */ typedef enum { RANDNAME_TOLKIEN = 1, RANDNAME_SCROLL, /* End of type marker - not a valid name type */ RANDNAME_NUM_TYPES } randname_type; /* * Make a random name. */ extern size_t randname_make(randname_type name_type, size_t min, size_t max, char *word_buf, size_t buflen, const char ***wordlist); #endif /* RANDNAME_H */ angband-3.5.1/src/quest.c0000644000175000017500000000562112456456606014540 0ustar chriscchrisc/* * File: quest.c * Purpose: All quest-related code * * Copyright (c) 2013 Angband developers * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "quest.h" /* * Array[MAX_Q_IDX] of quests */ quest q_list[MAX_Q_IDX]; /* * Check if the given level is a quest level. */ bool is_quest(int level) { size_t i; /* Town is never a quest */ if (!level) return FALSE; for (i = 0; i < N_ELEMENTS(q_list); i++) if (q_list[i].level == level) return TRUE; return FALSE; } /* * Wipe all quests, add back in Sauron and Morgoth */ void quest_reset(void) { size_t i; for (i = 0; i < N_ELEMENTS(q_list); i++) q_list[i].level = 0; q_list[0].level = 99; q_list[1].level = 100; } /* * Creates magical stairs after finishing a quest monster. */ static void build_quest_stairs(int y, int x) { int ny, nx; /* Stagger around */ while (!cave_valid_bold(y, x) && !cave_iswall(cave, y, x) && !cave_isdoor(cave, y, x)) { /* Pick a location */ scatter(&ny, &nx, y, x, 1, FALSE); /* Stagger */ y = ny; x = nx; } /* Push any objects */ push_object(y, x); /* Explain the staircase */ msg("A magical staircase appears..."); /* Create stairs down */ /* XXX: fake depth = 0 to always produce downstairs */ cave_add_stairs(cave, y, x, 0); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Fully update the flow */ p_ptr->update |= (PU_FORGET_FLOW | PU_UPDATE_FLOW); } /* * Check if this (now dead) monster is a quest monster, and act appropriately */ bool quest_check(const struct monster *m) { size_t i; int total = 0; /* Don't bother with non-questors */ if (!rf_has(m->race->flags, RF_QUESTOR)) return FALSE; /* Mark quests as complete */ for (i = 0; i < N_ELEMENTS(q_list); i++) { /* Note completed quests */ if (q_list[i].level == m->race->level) q_list[i].level = 0; /* Count incomplete quests */ if (q_list[i].level) total++; } /* Build magical stairs */ build_quest_stairs(m->fy, m->fx); /* Nothing left, game over... */ if (total == 0) { p_ptr->total_winner = TRUE; p_ptr->redraw |= (PR_TITLE); msg("*** CONGRATULATIONS ***"); msg("You have won the game!"); msg("You may retire (commit suicide) when you are ready."); } return TRUE; } /* * Initialise/free the quest list. * * This used to dynamically allocate an array of length 4, but * now it just makes sure the existing one is clear. */ void quest_init(void) { memset(q_list, 0, sizeof q_list); return; } void quest_free(void) { return; } angband-3.5.1/src/wizard.c0000644000175000017500000012335412456456607014704 0ustar chriscchrisc/* * File: wizard2.c * Purpose: Debug mode commands * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "cmds.h" #include "files.h" #include "monster/mon-lore.h" #include "monster/mon-make.h" #include "monster/mon-util.h" #include "monster/monster.h" #include "object/tvalsval.h" #include "ui-event.h" #include "ui-menu.h" #include "spells.h" #include "target.h" #include "wizard.h" #include "z-term.h" #ifdef ALLOW_DEBUG static void gf_display(menu_type *m, int type, bool cursor, int row, int col, int wid) { size_t i; byte attr = curs_attrs[CURS_KNOWN][(int)cursor]; const char *gf_name = gf_idx_to_name(type); if (type % 2) c_prt(attr, ".........................", row, col); c_put_str(attr, gf_name, row, col); col += 25; if (tile_height == 1) { for (i = 0; i < BOLT_MAX; i++) { col += big_pad(col, row, gf_to_attr[type][i], gf_to_char[type][i]); } } else { prt("Change tile_height to 1 to see graphics.", row, col); } } static const menu_iter gf_iter = { NULL, /* get_tag */ NULL, /* validity */ gf_display, NULL, /* action */ NULL /* resize */ }; static void wiz_gf_demo(void) { menu_type *m = menu_new(MN_SKIN_SCROLL, &gf_iter); region loc = { 0, 0, 0, 0 }; menu_setpriv(m, GF_MAX, NULL); m->title = "GF_ types display"; menu_layout(m, &loc); screen_save(); clear_from(0); menu_select(m, 0, FALSE); screen_load(); } /* * This is a nice utility function; it determines if a (NULL-terminated) * string consists of only digits (starting with a non-zero digit). */ static s16b get_idx_from_name(char *s) { char *endptr = NULL; long l = strtol(s, &endptr, 10); return *endptr == '\0' ? (s16b)l : 0; } /* * Hack -- quick debugging hook */ static void do_cmd_wiz_hack_ben(void) { int py = p_ptr->py; int px = p_ptr->px; int i, y, x; struct keypress kp; for (i = 0; i < MONSTER_FLOW_DEPTH; ++i) { /* Update map */ for (y = Term->offset_y; y < Term->offset_y + SCREEN_HGT; y++) { for (x = Term->offset_x; x < Term->offset_x + SCREEN_WID; x++) { byte a = TERM_RED; if (!cave_in_bounds_fully(cave, y, x)) continue; /* Display proper cost */ if (cave->cost[y][x] != i) continue; /* Reliability in yellow */ if (cave->when[y][x] == cave->when[py][px]) a = TERM_YELLOW; /* Display player/floors/walls */ if ((y == py) && (x == px)) print_rel(L'@', a, y, x); else if (cave_ispassable(cave, y, x)) print_rel(L'*', a, y, x); else print_rel(L'#', a, y, x); } } /* Prompt */ prt(format("Depth %d: ", i), 0, 0); /* Get key */ kp = inkey(); if (kp.code == ESCAPE) break; /* Redraw map */ prt_map(); } /* Done */ prt("", 0, 0); /* Redraw map */ prt_map(); } /* * Output part of a bitflag set in binary format. */ static void prt_binary(const bitflag *flags, int offset, int row, int col, char ch, int num) { int flag; /* Scan the flags */ for (flag = FLAG_START + offset; flag < FLAG_START + offset + num; flag++) { if (of_has(flags, flag)) Term_putch(col++, row, TERM_BLUE, ch); else Term_putch(col++, row, TERM_WHITE, '-'); } } /** * This ugly piece of code exists to figure out what keycodes the user has * been generating. */ static void do_cmd_keylog(void) { int i; char buf[50]; char buf2[12]; struct keypress keys[2] = {{EVT_NONE, 0}, {EVT_NONE, 0}}; screen_save(); prt("Previous keypresses (top most recent):", 0, 0); for (i = 0; i < KEYLOG_SIZE; i++) { if (i < log_size) { /* find the keypress from our log */ int j = (log_i + i) % KEYLOG_SIZE; struct keypress k = keylog[j]; /* ugh. it would be nice if there was a verion of keypress_to_text * which took only one keypress. */ keys[0] = k; keypress_to_text(buf2, sizeof(buf2), keys, TRUE); /* format this line of output */ strnfmt(buf, sizeof(buf), " %-12s (code=%u mods=%u)", buf2, k.code, k.mods); } else { /* create a blank line of output */ strnfmt(buf, sizeof(buf), "%40s", ""); } prt(buf, i + 1, 0); } prt("Press any key to continue.", KEYLOG_SIZE + 1, 0); inkey(); screen_load(); } /* * Hack -- Teleport to the target */ static void do_cmd_wiz_bamf(void) { s16b x, y; /* Must have a target */ if (!target_okay()) return; /* Teleport to the target */ target_get(&x, &y); teleport_player_to(y, x); } /* * Aux function for "do_cmd_wiz_change()" */ static void do_cmd_wiz_change_aux(void) { int i; int tmp_int; long tmp_long; char tmp_val[160]; char ppp[80]; /* Query the stats */ for (i = 0; i < A_MAX; i++) { /* Prompt */ strnfmt(ppp, sizeof(ppp), "%s (3-118): ", stat_names[i]); /* Default */ strnfmt(tmp_val, sizeof(tmp_val), "%d", p_ptr->stat_max[i]); /* Query */ if (!get_string(ppp, tmp_val, 4)) return; /* Extract */ tmp_int = atoi(tmp_val); /* Verify */ if (tmp_int > 18+100) tmp_int = 18+100; else if (tmp_int < 3) tmp_int = 3; /* Save it */ p_ptr->stat_cur[i] = p_ptr->stat_max[i] = tmp_int; } /* Default */ strnfmt(tmp_val, sizeof(tmp_val), "%ld", (long)(p_ptr->au)); /* Query */ if (!get_string("Gold: ", tmp_val, 10)) return; /* Extract */ tmp_long = atol(tmp_val); /* Verify */ if (tmp_long < 0) tmp_long = 0L; /* Save */ p_ptr->au = tmp_long; /* Default */ strnfmt(tmp_val, sizeof(tmp_val), "%ld", (long)(p_ptr->exp)); /* Query */ if (!get_string("Experience: ", tmp_val, 10)) return; /* Extract */ tmp_long = atol(tmp_val); /* Verify */ if (tmp_long < 0) tmp_long = 0L; if (tmp_long > p_ptr->exp) player_exp_gain(p_ptr, tmp_long - p_ptr->exp); else player_exp_lose(p_ptr, p_ptr->exp - tmp_long, FALSE); } /* * Change various "permanent" player variables. */ static void do_cmd_wiz_change(void) { /* Interact */ do_cmd_wiz_change_aux(); /* Redraw everything */ do_cmd_redraw(); } /* * Wizard routines for creating objects and modifying them * * This has been rewritten to make the whole procedure * of debugging objects much easier and more comfortable. * * Here are the low-level functions * * - wiz_display_item() * display an item's debug-info * - wiz_create_itemtype() * specify tval and sval (type and subtype of object) * - wiz_tweak_item() * specify pval, +AC, +tohit, +todam * Note that the wizard can leave this function anytime, * thus accepting the default-values for the remaining values. * pval comes first now, since it is most important. * - wiz_reroll_item() * apply some magic to the item or turn it into an artifact. * - wiz_roll_item() * Get some statistics about the rarity of an item: * We create a lot of fake items and see if they are of the * same type (tval and sval), then we compare pval and +AC. * If the fake-item is better or equal it is counted. * Note that cursed items that are better or equal (absolute values) * are counted, too. * HINT: This is *very* useful for balancing the game! * - wiz_quantity_item() * change the quantity of an item, but be sane about it. * * And now the high-level functions * - do_cmd_wiz_play() * play with an existing object * - wiz_create_item() * create a new object * * Note -- You do not have to specify "pval" and other item-properties * directly. Just apply magic until you are satisfied with the item. * * Note -- For some items (such as wands, staffs, some rings, etc), you * must apply magic, or you will get "broken" or "uncharged" objects. * * Note -- Redefining artifacts via "do_cmd_wiz_play()" may destroy * the artifact. Be careful. * * Hack -- this function will allow you to create multiple artifacts. * This "feature" may induce crashes or other nasty effects. */ /* * Display an item's properties */ static void wiz_display_item(const object_type *o_ptr, bool all) { int j = 0; bitflag f[OF_SIZE]; char buf[256]; /* Extract the flags */ if (all) object_flags(o_ptr, f); else object_flags_known(o_ptr, f); /* Clear screen */ Term_clear(); /* Describe fully */ object_desc(buf, sizeof(buf), o_ptr, ODESC_PREFIX | ODESC_FULL | ODESC_SPOIL); prt(buf, 2, j); prt(format("combat = (%dd%d) (%+d,%+d) [%d,%+d]", o_ptr->dd, o_ptr->ds, o_ptr->to_h, o_ptr->to_d, o_ptr->ac, o_ptr->to_a), 4, j); prt(format("kind = %-5d tval = %-5d sval = %-5d wgt = %-3d timeout = %-d", o_ptr->kind->kidx, o_ptr->tval, o_ptr->sval, o_ptr->weight, o_ptr->timeout), 5, j); /* CC: multiple pvals not shown, pending #1290 */ prt(format("number = %-3d pval = %-5d name1 = %-4d egoidx = %-4d cost = %ld", o_ptr->number, o_ptr->pval[DEFAULT_PVAL], o_ptr->artifact ? o_ptr->artifact->aidx : 0, o_ptr->ego ? o_ptr->ego->eidx : 0, (long)object_value(o_ptr, 1, FALSE)), 6, j); prt("+------------FLAGS0------------+", 8, j); prt("AFFECT..........SLAY.......BRAND", 9, j); prt(" ae xxxpaefc", 10, j); prt("siwdcc ssidsasmnvudotgddduoclio", 11, j); prt("tnieoh trnipthgiinmrrnrrmniierl", 12, j); prt("rtsxna..lcfgdkttmldncltggndsdced", 13, j); prt_binary(f, 0, 14, j, '*', 32); prt_binary(o_ptr->known_flags, 0, 15, j, '+', 32); prt("+------------FLAGS1------------+", 16, j); prt("SUST........IMM.RESIST.........", 17, j); prt(" afecaefcpfldbc s n ", 18, j); prt("siwdcc cilocliooeialoshnecd", 19, j); prt("tnieoh irelierliatrnnnrethi", 20, j); prt("rtsxna......decddcedsrekdfddxhss", 21, j); prt_binary(f, 32, 22, j, '*', 32); prt_binary(o_ptr->known_flags, 32, 23, j, '+', 32); prt("+------------FLAGS2------------+", 8, j+34); prt("s ts hn tadiiii aiehs hp", 9, j+34); prt("lf eefoo egrgggg bcnaih vr", 10, j+34); prt("we lerlf ilgannnn ltssdo ym", 11, j+34); prt("da reiedu merirrrr eityew ccc", 12, j+34); prt("itlepnele ppanaefc svaktm uuu", 13, j+34); prt("ghigavail aoveclio saanyo rrr", 14, j+34); prt("seteticf craxierl etropd sss", 15, j+34); prt("trenhste tttpdced detwes eee", 16, j+34); prt_binary(f, 64, 17, j + 34, '*', 32); prt_binary(o_ptr->known_flags, 64, 18, j + 34, '+', 32); prt("o_ptr->ident:", 20, j+34); prt(format("sense %c worn %c empty %c known %c", (o_ptr->ident & IDENT_SENSE) ? '+' : ' ', (o_ptr->ident & IDENT_WORN) ? '+' : ' ', (o_ptr->ident & IDENT_EMPTY) ? '+' : ' ', (o_ptr->ident & IDENT_KNOWN) ? '+' : ' '), 21, j+34); prt(format("store %c attack %c defence %c effect %c", (o_ptr->ident & IDENT_STORE) ? '+' : ' ', (o_ptr->ident & IDENT_ATTACK) ? '+' : ' ', (o_ptr->ident & IDENT_DEFENCE) ? '+' : ' ', (o_ptr->ident & IDENT_EFFECT) ? '+' : ' '), 22, j+34); prt(format("indest %c ego %c", (o_ptr->ident & IDENT_INDESTRUCT) ? '+' : ' ', (o_ptr->ident & IDENT_NAME) ? '+' : ' '), 23, j+34); } static const region wiz_create_item_area = { 0, 0, 0, 0 }; /** Object kind selection */ static void wiz_create_item_subdisplay(menu_type *m, int oid, bool cursor, int row, int col, int width) { object_kind **choices = menu_priv(m); char buf[80]; object_kind_name(buf, sizeof buf, choices[oid], TRUE); c_prt(curs_attrs[CURS_KNOWN][0 != cursor], buf, row, col); } static bool wiz_create_item_subaction(menu_type *m, const ui_event *e, int oid) { object_kind **choices = menu_priv(m); object_kind *kind = choices[oid]; object_type *i_ptr; object_type object_type_body; if (e->type != EVT_SELECT) return TRUE; /* Get local object */ i_ptr = &object_type_body; /* Create the item */ object_prep(i_ptr, kind, p_ptr->depth, RANDOMISE); /* Apply magic (no messages, no artifacts) */ apply_magic(i_ptr, p_ptr->depth, FALSE, FALSE, FALSE, FALSE); /* Mark as cheat, and where created */ i_ptr->origin = ORIGIN_CHEAT; i_ptr->origin_depth = p_ptr->depth; if (kind->tval == TV_GOLD) make_gold(i_ptr, p_ptr->depth, kind->sval); /* Drop the object from heaven */ drop_near(cave, i_ptr, 0, p_ptr->py, p_ptr->px, TRUE); return FALSE; } static menu_iter wiz_create_item_submenu = { NULL, NULL, wiz_create_item_subdisplay, wiz_create_item_subaction, NULL }; /** Object base kind selection **/ static void wiz_create_item_display(menu_type *m, int oid, bool cursor, int row, int col, int width) { char buf[80]; object_base_name(buf, sizeof buf, oid, TRUE); c_prt(curs_attrs[CURS_KNOWN][0 != cursor], buf, row, col); } static bool wiz_create_item_action(menu_type *m, const ui_event *e, int oid) { ui_event ret; menu_type *menu; char buf[80]; object_kind *choice[60]; int n_choices; int i; if (e->type != EVT_SELECT) return TRUE; for (n_choices = 0, i = 1; (n_choices < 60) && (i < z_info->k_max); i++) { object_kind *kind = &k_info[i]; if (kind->tval != oid || of_has(kind->flags, OF_INSTA_ART)) continue; choice[n_choices++] = kind; } screen_save(); clear_from(0); menu = menu_new(MN_SKIN_COLUMNS, &wiz_create_item_submenu); menu->selections = all_letters; object_base_name(buf, sizeof buf, oid, TRUE); menu->title = string_make(format("What kind of %s?", buf)); menu_setpriv(menu, n_choices, choice); menu_layout(menu, &wiz_create_item_area); ret = menu_select(menu, 0, FALSE); screen_load(); string_free((char *)menu->title); return (ret.type == EVT_ESCAPE); } static const menu_iter wiz_create_item_menu = { NULL, NULL, wiz_create_item_display, wiz_create_item_action, NULL }; /* * Choose and create an instance of an object kind */ static void wiz_create_item(void) { int tvals[TV_MAX]; size_t i, n; menu_type *menu = menu_new(MN_SKIN_COLUMNS, &wiz_create_item_menu); menu->selections = all_letters; menu->title = "What kind of object?"; /* Make a list of all tvals for the filter */ for (i = 0, n = 0; i < TV_MAX; i++) { if (!kb_info[i].name) continue; tvals[n++] = i; } screen_save(); clear_from(0); menu_setpriv(menu, TV_MAX, kb_info); menu_set_filter(menu, tvals, n); menu_layout(menu, &wiz_create_item_area); menu_select(menu, 0, FALSE); screen_load(); /* Redraw map */ p_ptr->redraw |= (PR_MAP | PR_ITEMLIST); handle_stuff(p_ptr); } /* * Tweak an item */ static void wiz_tweak_item(object_type *o_ptr) { const char *p; char tmp_val[80]; int i, val; /* Hack -- leave artifacts alone */ if (o_ptr->artifact) return; p = "Enter new ego item index: "; strnfmt(tmp_val, sizeof(tmp_val), "0"); if (o_ptr->ego) strnfmt(tmp_val, sizeof(tmp_val), "%d", o_ptr->ego->eidx); if (!get_string(p, tmp_val, 6)) return; val = atoi(tmp_val); if (val) { o_ptr->ego = &e_info[val]; ego_apply_magic(o_ptr, p_ptr->depth); } else o_ptr->ego = 0; wiz_display_item(o_ptr, TRUE); p = "Enter new artifact index: "; strnfmt(tmp_val, sizeof(tmp_val), "0"); if (o_ptr->artifact) strnfmt(tmp_val, sizeof(tmp_val), "%d", o_ptr->artifact->aidx); if (!get_string(p, tmp_val, 6)) return; val = atoi(tmp_val); if (val) { o_ptr->artifact = &a_info[val]; copy_artifact_data(o_ptr, o_ptr->artifact); } else o_ptr->artifact = 0; wiz_display_item(o_ptr, TRUE); #define WIZ_TWEAK(attribute) do {\ p = "Enter new '" #attribute "' setting: ";\ strnfmt(tmp_val, sizeof(tmp_val), "%d", o_ptr->attribute);\ if (!get_string(p, tmp_val, 6)) return;\ o_ptr->attribute = atoi(tmp_val);\ wiz_display_item(o_ptr, TRUE);\ } while (0) for (i = 0; i < MAX_PVALS; i++) { WIZ_TWEAK(pval[i]); if (o_ptr->pval[i]) o_ptr->num_pvals = (i + 1); } WIZ_TWEAK(to_a); WIZ_TWEAK(to_h); WIZ_TWEAK(to_d); } /* * Apply magic to an item or turn it into an artifact. -Bernd- */ static void wiz_reroll_item(object_type *o_ptr) { object_type *i_ptr; object_type object_type_body; struct keypress ch; bool changed = FALSE; /* Hack -- leave artifacts alone */ if (o_ptr->artifact) return; /* Get local object */ i_ptr = &object_type_body; /* Copy the object */ object_copy(i_ptr, o_ptr); /* Main loop. Ask for magification and artifactification */ while (TRUE) { /* Display full item debug information */ wiz_display_item(i_ptr, TRUE); /* Ask wizard what to do. */ if (!get_com("[a]ccept, [n]ormal, [g]ood, [e]xcellent? ", &ch)) break; /* Create/change it! */ if (ch.code == 'A' || ch.code == 'a') { changed = TRUE; break; } /* Apply normal magic, but first clear object */ else if (ch.code == 'n' || ch.code == 'N') { object_prep(i_ptr, o_ptr->kind, p_ptr->depth, RANDOMISE); apply_magic(i_ptr, p_ptr->depth, FALSE, FALSE, FALSE, FALSE); } /* Apply good magic, but first clear object */ else if (ch.code == 'g' || ch.code == 'G') { object_prep(i_ptr, o_ptr->kind, p_ptr->depth, RANDOMISE); apply_magic(i_ptr, p_ptr->depth, FALSE, TRUE, FALSE, FALSE); } /* Apply great magic, but first clear object */ else if (ch.code == 'e' || ch.code == 'E') { object_prep(i_ptr, o_ptr->kind, p_ptr->depth, RANDOMISE); apply_magic(i_ptr, p_ptr->depth, FALSE, TRUE, TRUE, FALSE); } } /* Notice change */ if (changed) { /* Mark as cheat */ i_ptr->origin = ORIGIN_CHEAT; /* Restore the position information */ i_ptr->iy = o_ptr->iy; i_ptr->ix = o_ptr->ix; i_ptr->next_o_idx = o_ptr->next_o_idx; i_ptr->marked = o_ptr->marked; /* Apply changes */ object_copy(o_ptr, i_ptr); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Window stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP ); } } /* * Maximum number of rolls */ #define TEST_ROLL 100000 /* * Try to create an item again. Output some statistics. -Bernd- * * The statistics are correct now. We acquire a clean grid, and then * repeatedly place an object in this grid, copying it into an item * holder, and then deleting the object. We fiddle with the artifact * counter flags to prevent weirdness. We use the items to collect * statistics on item creation relative to the initial item. */ static void wiz_statistics(object_type *o_ptr, int level) { long i, matches, better, worse, other; int j; struct keypress ch; const char *quality; bool good, great, ismatch, isbetter, isworse; object_type *i_ptr; object_type object_type_body; const char *q = "Rolls: %ld, Matches: %ld, Better: %ld, Worse: %ld, Other: %ld"; /* Allow multiple artifacts, because breaking the game is fine here */ if (o_ptr->artifact) o_ptr->artifact->created = FALSE; /* Interact */ while (TRUE) { const char *pmt = "Roll for [n]ormal, [g]ood, or [e]xcellent treasure? "; /* Display item */ wiz_display_item(o_ptr, TRUE); /* Get choices */ if (!get_com(pmt, &ch)) break; if (ch.code == 'n' || ch.code == 'N') { good = FALSE; great = FALSE; quality = "normal"; } else if (ch.code == 'g' || ch.code == 'G') { good = TRUE; great = FALSE; quality = "good"; } else if (ch.code == 'e' || ch.code == 'E') { good = TRUE; great = TRUE; quality = "excellent"; } else { #if 0 /* unused */ good = FALSE; great = FALSE; #endif /* unused */ break; } /* Let us know what we are doing */ msg("Creating a lot of %s items. Base level = %d.", quality, p_ptr->depth); message_flush(); /* Set counters to zero */ matches = better = worse = other = 0; /* Let's rock and roll */ for (i = 0; i <= TEST_ROLL; i++) { /* Output every few rolls */ if ((i < 100) || (i % 100 == 0)) { struct keypress kp; /* Do not wait */ inkey_scan = SCAN_INSTANT; /* Allow interupt */ kp = inkey(); if (kp.type != EVT_NONE) { flush(); break; } /* Dump the stats */ prt(format(q, i, matches, better, worse, other), 0, 0); Term_fresh(); } /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Create an object */ make_object(cave, i_ptr, level, good, great, FALSE, NULL, 0); /* Allow multiple artifacts, because breaking the game is fine here */ if (o_ptr->artifact) o_ptr->artifact->created = FALSE; /* Test for the same tval and sval. */ if ((o_ptr->tval) != (i_ptr->tval)) continue; if ((o_ptr->sval) != (i_ptr->sval)) continue; /* Check pvals */ ismatch = TRUE; for (j = 0; j < MAX_PVALS; j++) if (i_ptr->pval[j] != o_ptr->pval[j]) ismatch = FALSE; isbetter = TRUE; for (j = 0; j < MAX_PVALS; j++) if (i_ptr->pval[j] < o_ptr->pval[j]) isbetter = FALSE; isworse = TRUE; for (j = 0; j < MAX_PVALS; j++) if (i_ptr->pval[j] > o_ptr->pval[j]) isworse = FALSE; /* Check for match */ if (ismatch && (i_ptr->to_a == o_ptr->to_a) && (i_ptr->to_h == o_ptr->to_h) && (i_ptr->to_d == o_ptr->to_d) && (i_ptr->num_pvals == o_ptr->num_pvals)) { matches++; } /* Check for better */ else if (isbetter && (i_ptr->to_a >= o_ptr->to_a) && (i_ptr->to_h >= o_ptr->to_h) && (i_ptr->to_d >= o_ptr->to_d)) { better++; } /* Check for worse */ else if (isworse && (i_ptr->to_a <= o_ptr->to_a) && (i_ptr->to_h <= o_ptr->to_h) && (i_ptr->to_d <= o_ptr->to_d)) { worse++; } /* Assume different */ else { other++; } } /* Final dump */ msg(q, i, matches, better, worse, other); message_flush(); } /* Hack -- Normally only make a single artifact */ if (o_ptr->artifact) o_ptr->artifact->created = TRUE; } /* * Change the quantity of an item */ static void wiz_quantity_item(object_type *o_ptr, bool carried) { int tmp_int; char tmp_val[3]; /* Never duplicate artifacts */ if (o_ptr->artifact) return; /* Default */ strnfmt(tmp_val, sizeof(tmp_val), "%d", o_ptr->number); /* Query */ if (get_string("Quantity: ", tmp_val, 3)) { /* Extract */ tmp_int = atoi(tmp_val); /* Paranoia */ if (tmp_int < 1) tmp_int = 1; if (tmp_int > 99) tmp_int = 99; /* Adjust total weight being carried */ if (carried) { /* Remove the weight of the old number of objects */ p_ptr->total_weight -= (o_ptr->number * o_ptr->weight); /* Add the weight of the new number of objects */ p_ptr->total_weight += (tmp_int * o_ptr->weight); } /* Adjust charges/timeouts for devices */ reduce_charges(o_ptr, (o_ptr->number - tmp_int)); /* Accept modifications */ o_ptr->number = tmp_int; } } /** * Tweak the cursed status of an object. * * \param o_ptr is the object to curse or decurse */ static void wiz_tweak_curse(object_type *o_ptr) { if (cursed_p(o_ptr->flags)) { bitflag f[OF_SIZE]; msg("Resetting existing curses."); create_mask(f, FALSE, OFT_CURSE, OFT_MAX); of_diff(o_ptr->flags, f); } if (get_check("Set light curse? ")) flags_set(o_ptr->flags, OF_SIZE, OF_LIGHT_CURSE, FLAG_END); else if (get_check("Set heavy curse? ")) flags_set(o_ptr->flags, OF_SIZE, OF_LIGHT_CURSE, OF_HEAVY_CURSE, FLAG_END); else if (get_check("Set permanent curse? ")) flags_set(o_ptr->flags, OF_SIZE, OF_LIGHT_CURSE, OF_HEAVY_CURSE, OF_PERMA_CURSE, FLAG_END); } /* * Play with an item. Options include: * - Output statistics (via wiz_roll_item) * - Reroll item (via wiz_reroll_item) * - Change properties (via wiz_tweak_item) * - Change the number of items (via wiz_quantity_item) */ static void do_cmd_wiz_play(void) { int item; object_type *i_ptr; object_type object_type_body; object_type *o_ptr; struct keypress ch; const char *q, *s; bool changed = FALSE; bool all = TRUE; /* Get an item */ q = "Play with which object? "; s = "You have nothing to play with."; if (!get_item(&item, q, s, 0, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return; o_ptr = object_from_item_idx(item); /* Save screen */ screen_save(); /* Get local object */ i_ptr = &object_type_body; /* Copy object */ object_copy(i_ptr, o_ptr); /* The main loop */ while (TRUE) { /* Display the item */ wiz_display_item(i_ptr, all); /* Get choice */ if (!get_com("[a]ccept [s]tatistics [r]eroll [t]weak [c]urse [q]uantity [k]nown? ", &ch)) break; if (ch.code == 'A' || ch.code == 'a') { changed = TRUE; break; } else if (ch.code == 'c' || ch.code == 'C') wiz_tweak_curse(i_ptr); else if (ch.code == 's' || ch.code == 'S') wiz_statistics(i_ptr, p_ptr->depth); else if (ch.code == 'r' || ch.code == 'R') wiz_reroll_item(i_ptr); else if (ch.code == 't' || ch.code == 'T') wiz_tweak_item(i_ptr); else if (ch.code == 'k' || ch.code == 'K') all = !all; else if (ch.code == 'q' || ch.code == 'Q') { bool carried = (item >= 0) ? TRUE : FALSE; wiz_quantity_item(i_ptr, carried); } } /* Load screen */ screen_load(); /* Accept change */ if (changed) { /* Message */ msg("Changes accepted."); /* Change */ object_copy(o_ptr, i_ptr); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); /* Window stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP ); } /* Ignore change */ else { msg("Changes ignored."); } } /* * Create the artifact with the specified number */ static void wiz_create_artifact(int a_idx) { object_type *i_ptr; object_type object_type_body; object_kind *kind; artifact_type *a_ptr = &a_info[a_idx]; /* Ignore "empty" artifacts */ if (!a_ptr->name) return; /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Acquire the "kind" index */ kind = lookup_kind(a_ptr->tval, a_ptr->sval); if (!kind) return; /* Create the artifact */ object_prep(i_ptr, kind, a_ptr->alloc_min, RANDOMISE); /* Save the name */ i_ptr->artifact = a_ptr; /* Extract the fields */ copy_artifact_data(i_ptr, a_ptr); /* Mark that the artifact has been created. */ a_ptr->created = TRUE; /* Mark as cheat */ i_ptr->origin = ORIGIN_CHEAT; /* Drop the artifact from heaven */ drop_near(cave, i_ptr, 0, p_ptr->py, p_ptr->px, TRUE); /* All done */ msg("Allocated."); /* Redraw map */ p_ptr->redraw |= (PR_MAP | PR_ITEMLIST); handle_stuff(p_ptr); } /* * Cure everything instantly */ static void do_cmd_wiz_cure_all(void) { /* Remove curses */ (void)remove_all_curse(); /* Restore stats */ (void)res_stat(A_STR); (void)res_stat(A_INT); (void)res_stat(A_WIS); (void)res_stat(A_CON); (void)res_stat(A_DEX); /* Restore the level */ (void)restore_level(); /* Heal the player */ p_ptr->chp = p_ptr->mhp; p_ptr->chp_frac = 0; /* Restore mana */ p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; /* Cure stuff */ (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); (void)player_clear_timed(p_ptr, TMD_CONFUSED, TRUE); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_clear_timed(p_ptr, TMD_AFRAID, TRUE); (void)player_clear_timed(p_ptr, TMD_PARALYZED, TRUE); (void)player_clear_timed(p_ptr, TMD_IMAGE, TRUE); (void)player_clear_timed(p_ptr, TMD_STUN, TRUE); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); (void)player_clear_timed(p_ptr, TMD_SLOW, TRUE); (void)player_clear_timed(p_ptr, TMD_AMNESIA, TRUE); /* No longer hungry */ player_set_food(p_ptr, PY_FOOD_MAX - 1); /* Redraw everything */ do_cmd_redraw(); /* Give the player some feedback */ msg("You feel *much* better!"); } /* * Go to any level */ static void do_cmd_wiz_jump(void) { int depth; char ppp[80]; char tmp_val[160]; /* Prompt */ strnfmt(ppp, sizeof(ppp), "Jump to level (0-%d): ", MAX_DEPTH-1); /* Default */ strnfmt(tmp_val, sizeof(tmp_val), "%d", p_ptr->depth); /* Ask for a level */ if (!get_string(ppp, tmp_val, 11)) return; /* Extract request */ depth = atoi(tmp_val); /* Paranoia */ if (depth < 0) depth = 0; /* Paranoia */ if (depth > MAX_DEPTH - 1) depth = MAX_DEPTH - 1; /* Accept request */ msg("You jump to dungeon level %d.", depth); /* New depth */ p_ptr->depth = depth; /* Leaving */ p_ptr->leaving = TRUE; } /* * Become aware of a lot of objects */ static void do_cmd_wiz_learn(int lev) { int i; object_type *i_ptr; object_type object_type_body; /* Scan every object */ for (i = 1; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; if (!k_ptr || !k_ptr->name) continue; /* Induce awareness */ if (k_ptr->level <= lev) { /* Get local object */ i_ptr = &object_type_body; /* Prepare object */ object_prep(i_ptr, k_ptr, 0, MAXIMISE); /* Awareness */ object_flavor_aware(i_ptr); } } msg("You now know about many items!"); } /* * Hack -- Rerate Hitpoints */ static void do_cmd_rerate(void) { int min_value, max_value, i, percent; min_value = (PY_MAX_LEVEL * 3 * (p_ptr->hitdie - 1)) / 8; min_value += PY_MAX_LEVEL; max_value = (PY_MAX_LEVEL * 5 * (p_ptr->hitdie - 1)) / 8; max_value += PY_MAX_LEVEL; p_ptr->player_hp[0] = p_ptr->hitdie; /* Rerate */ while (1) { /* Collect values */ for (i = 1; i < PY_MAX_LEVEL; i++) { p_ptr->player_hp[i] = randint1(p_ptr->hitdie); p_ptr->player_hp[i] += p_ptr->player_hp[i - 1]; } /* Legal values */ if ((p_ptr->player_hp[PY_MAX_LEVEL - 1] >= min_value) && (p_ptr->player_hp[PY_MAX_LEVEL - 1] <= max_value)) break; } percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) / (p_ptr->hitdie + ((PY_MAX_LEVEL - 1) * p_ptr->hitdie))); /* Update and redraw hitpoints */ p_ptr->update |= (PU_HP); p_ptr->redraw |= (PR_HP); /* Handle stuff */ handle_stuff(p_ptr); /* Message */ msg("Current Life Rating is %d/100.", percent); } /* * Summon some creatures */ static void do_cmd_wiz_summon(int num) { int py = p_ptr->py; int px = p_ptr->px; int i; for (i = 0; i < num; i++) { (void)summon_specific(py, px, p_ptr->depth, 0, 1); } } /* * Summon a creature of the specified type * * This function is rather dangerous XXX XXX XXX */ static void do_cmd_wiz_named(monster_race *r, bool slp) { int py = p_ptr->py; int px = p_ptr->px; int i, x, y; /* Paranoia */ assert(r); /* Try 10 times */ for (i = 0; i < 10; i++) { int d = 1; /* Pick a location */ scatter(&y, &x, py, px, d, TRUE); /* Require empty grids */ if (!cave_isempty(cave, y, x)) continue; /* Place it (allow groups) */ if (place_new_monster(cave, y, x, r, slp, TRUE, ORIGIN_DROP_WIZARD)) break; } } /* * Hack -- Delete all nearby monsters */ static void do_cmd_wiz_zap(int d) { int i; /* Banish everyone nearby */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Skip dead monsters */ if (!m_ptr->race) continue; /* Skip distant monsters */ if (m_ptr->cdis > d) continue; /* Delete the monster */ delete_monster_idx(i); } /* Update monster list window */ p_ptr->redraw |= PR_MONLIST; } /* * Query the dungeon */ static void do_cmd_wiz_query(void) { int py = p_ptr->py; int px = p_ptr->px; int y, x; struct keypress cmd; u16b mask = 0x00; /* Get a "debug command" */ if (!get_com("Debug Command Query: ", &cmd)) return; /* Extract a flag */ switch (cmd.code) { case '0': mask = (1 << 0); break; case '1': mask = (1 << 1); break; case '2': mask = (1 << 2); break; case '3': mask = (1 << 3); break; case '4': mask = (1 << 4); break; case '5': mask = (1 << 5); break; case '6': mask = (1 << 6); break; case '7': mask = (1 << 7); break; case 'm': mask |= (CAVE_MARK); break; case 'g': mask |= (CAVE_GLOW); break; case 'r': mask |= (CAVE_ROOM); break; case 'i': mask |= (CAVE_VAULT); break; case 's': mask |= (CAVE_SEEN); break; case 'v': mask |= (CAVE_VIEW); break; case 't': mask |= (CAVE_WASSEEN); break; case 'w': mask |= (CAVE_WALL); break; } /* Scan map */ for (y = Term->offset_y; y < Term->offset_y + SCREEN_HGT; y++) { for (x = Term->offset_x; x < Term->offset_x + SCREEN_WID; x++) { byte a = TERM_RED; if (!cave_in_bounds_fully(cave, y, x)) continue; /* Given mask, show only those grids */ if (mask && !(cave->info[y][x] & mask)) continue; /* Given no mask, show unknown grids */ if (!mask && (cave->info[y][x] & (CAVE_MARK))) continue; /* Color */ if (cave_ispassable(cave, y, x)) a = TERM_YELLOW; /* Display player/floors/walls */ if ((y == py) && (x == px)) print_rel(L'@', a, y, x); else if (cave_ispassable(cave, y, x)) print_rel(L'*', a, y, x); else print_rel(L'#', a, y, x); } } Term_redraw(); /* Get keypress */ msg("Press any key."); inkey_ex(); message_flush(); /* Redraw map */ prt_map(); } /* * Create lots of items. */ static void wiz_test_kind(int tval) { int py = p_ptr->py; int px = p_ptr->px; int sval; object_type object_type_body; object_type *i_ptr = &object_type_body; for (sval = 0; sval < 255; sval++) { object_kind *kind = lookup_kind(tval, sval); if (!kind) continue; /* Create the item */ object_prep(i_ptr, kind, p_ptr->depth, RANDOMISE); /* Apply magic (no messages, no artifacts) */ apply_magic(i_ptr, p_ptr->depth, FALSE, FALSE, FALSE, FALSE); /* Mark as cheat, and where created */ i_ptr->origin = ORIGIN_CHEAT; i_ptr->origin_depth = p_ptr->depth; if (tval == TV_GOLD) make_gold(i_ptr, p_ptr->depth, sval); /* Drop the object from heaven */ drop_near(cave, i_ptr, 0, py, px, TRUE); } msg("Done."); } /* * Display the debug commands help file. */ static void do_cmd_wiz_help(void) { char buf[80]; strnfmt(buf, sizeof(buf), "debug.txt"); screen_save(); show_file(buf, NULL, 0, 0); screen_load(); } /* * Advance the player to level 50 with max stats and other bonuses. */ static void do_cmd_wiz_advance(void) { int i; /* Max stats */ for (i = 0; i < A_MAX; i++) p_ptr->stat_cur[i] = p_ptr->stat_max[i] = 118; /* Lots of money */ p_ptr->au = 1000000L; /* Level 50 */ player_exp_gain(p_ptr, PY_MAX_EXP); /* Heal the player */ p_ptr->chp = p_ptr->mhp; p_ptr->chp_frac = 0; /* Restore mana */ p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; /* Get some awesome equipment */ /* Artifacts: 3, 5, 12, ...*/ /* Update stuff */ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); /* Redraw everything */ p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_INVEN | PR_EQUIP | PR_MESSAGE | PR_MONSTER | PR_OBJECT | PR_MONLIST | PR_ITEMLIST); /* Hack -- update */ handle_stuff(p_ptr); } /* * Ask for and parse a "debug command" */ void do_cmd_debug(void) { int py = p_ptr->py; int px = p_ptr->px; struct keypress cmd; /* Get a "debug command" */ if (!get_com("Debug Command: ", &cmd)) return; /* Analyze the command */ switch (cmd.code) { /* Ignore */ case ESCAPE: case ' ': case KC_ENTER: { break; } #ifdef ALLOW_SPOILERS /* Hack -- Generate Spoilers */ case '"': { do_cmd_spoilers(); break; } #endif /* Hack -- Help */ case '?': { do_cmd_wiz_help(); break; } /* Cure all maladies */ case 'a': { do_cmd_wiz_cure_all(); break; } /* Make the player powerful */ case 'A': { do_cmd_wiz_advance(); break; } /* Teleport to target */ case 'b': { do_cmd_wiz_bamf(); break; } /* Create any object */ case 'c': { wiz_create_item(); break; } /* Create an artifact */ case 'C': { char name[80] = ""; int a_idx = -1; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Create which artifact? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if an a_idx was entered */ a_idx = get_idx_from_name(name); /* If not, find the artifact with that name */ if (a_idx < 1) a_idx = lookup_artifact_name(name); /* Did we find a valid artifact? */ if (a_idx != -1 && a_idx < z_info->a_max) wiz_create_artifact(a_idx); else msg("No artifact found."); } /* Reload the screen */ screen_load(); break; } /* Detect everything */ case 'd': { detect_all(TRUE); break; } /* Test for disconnected dungeon */ case 'D': { disconnect_stats(); break; } /* Edit character */ case 'e': { do_cmd_wiz_change(); break; } case 'f': { stats_collect(); break; } /* Good Objects */ case 'g': { int n; screen_save(); n= get_quantity("How many good objects? ", 40); screen_load(); if (n < 1) n = 1; acquirement(py, px, p_ptr->depth, n, FALSE); break; } /* GF demo */ case 'G': { wiz_gf_demo(); break; } /* Hitpoint rerating */ case 'h': { do_cmd_rerate(); break; } /* Hit all monsters in LOS */ case 'H': { dispel_monsters(10000); break; } /* Identify */ case 'i': { (void)ident_spell(); break; } /* Go up or down in the dungeon */ case 'j': { do_cmd_wiz_jump(); break; } /* Learn about objects */ case 'l': { do_cmd_wiz_learn(100); break; } case 'L': do_cmd_keylog(); break; /* Magic Mapping */ case 'm': { map_area(); break; } /* Summon Named Monster */ case 'n': { monster_race *r = NULL; char name[80] = ""; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Summon which monster? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if a r_idx was entered */ int r_idx = get_idx_from_name(name); if (r_idx) r = &r_info[r_idx]; else /* If not, find the monster with that name */ r = lookup_monster(name); p_ptr->redraw |= (PR_MAP | PR_MONLIST); } /* Reload the screen */ screen_load(); if (r) do_cmd_wiz_named(r, TRUE); else msg("No monster found."); break; } /* Object playing routines */ case 'o': { do_cmd_wiz_play(); break; } /* Phase Door */ case 'p': { teleport_player(10); break; } /* Monster pit stats */ case 'P': { pit_stats(); break; } /* Query the dungeon */ case 'q': { do_cmd_wiz_query(); break; } /* Get full recall for a monster */ case 'r': { const monster_race *r_ptr = NULL; struct keypress sym; const char *prompt = "Full recall for [a]ll monsters or [s]pecific monster? "; if (!get_com(prompt, &sym)) return; if (sym.code == 'a' || sym.code == 'A') { int i; for (i = 0; i < z_info->r_max; i++) cheat_monster_lore(&r_info[i], &l_list[i]); msg("Done."); } else if (sym.code == 's' || sym.code == 'S') { char name[80] = ""; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Which monster? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if a r_idx was entered */ int r_idx = get_idx_from_name(name); if (r_idx) r_ptr = &r_info[r_idx]; else /* If not, find the monster with that name */ r_ptr = lookup_monster(name); } /* Reload the screen */ screen_load(); /* Did we find a valid monster? */ if (r_ptr) cheat_monster_lore(r_ptr, get_lore(r_ptr)); else msg("No monster found."); } break; } /* Summon Random Monster(s) */ case 's': { int n; screen_save(); n = get_quantity("How many monsters? ", 40); screen_load(); if (n < 1) n = 1; do_cmd_wiz_summon(n); break; } /* Collect stats (S) */ case 'S': { stats_collect(); break; } /* Teleport */ case 't': { teleport_player(100); break; } /* Create a trap */ case 'T': { if (!cave_isfloor(cave, p_ptr->py, p_ptr->px)) msg("You can't place a trap there!"); else if (p_ptr->depth == 0) msg("You can't place a trap in the town!"); else cave_add_trap(cave, p_ptr->py, p_ptr->px); break; } /* Un-hide all monsters */ case 'u': { detect_monsters_entire_level(); break; } /* Very Good Objects */ case 'v': { int n; screen_save(); n = get_quantity("How many great objects? ", 40); screen_load(); if (n < 1) n = 1; acquirement(py, px, p_ptr->depth, n, TRUE); break; } case 'V': { int n; screen_save(); n = get_quantity("Create all items of what tval? ", 255); screen_load(); if (n) wiz_test_kind(n); break; } /* Wizard Light the Level */ case 'w': { wiz_light(TRUE); break; } /* Wipe recall for a monster */ case 'W': { const monster_race *r_ptr = NULL; s16b r_idx = 0; struct keypress sym; const char *prompt = "Wipe recall for [a]ll monsters or [s]pecific monster? "; if (!get_com(prompt, &sym)) return; if (sym.code == 'a' || sym.code == 'A') { int i; for (i = 0; i < z_info->r_max; i++) wipe_monster_lore(&r_info[i], &l_list[i]); msg("Done."); } else if (sym.code == 's' || sym.code == 'S') { char name[80] = ""; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Which monster? ", 0, 0); /* Get the name */ if (askfor_aux(name, sizeof(name), NULL)) { /* See if a r_idx was entered */ r_idx = get_idx_from_name(name); if (r_idx) r_ptr = &r_info[r_idx]; else /* If not, find the monster with that name */ r_ptr = lookup_monster(name); } /* Reload the screen */ screen_load(); /* Did we find a valid monster? */ if (r_ptr) wipe_monster_lore(r_ptr, get_lore(r_ptr)); else msg("No monster found."); } break; } /* Increase Experience */ case 'x': { int n; screen_save(); n = get_quantity("Gain how much experience? ", 9999); screen_load(); if (n < 1) n = 1; player_exp_gain(p_ptr, n); break; } /* Quit the game, don't save */ case 'X': { if (get_check("Really quit without saving? ")) quit("user choice"); break; } /* Zap Monsters (Banishment) */ case 'z': { int n; screen_save(); n = get_quantity("Zap within what distance? ", MAX_SIGHT); screen_load(); do_cmd_wiz_zap(n); break; } /* Hack */ case '_': { do_cmd_wiz_hack_ben(); break; } /* Oops */ default: { msg("That is not a valid debug command."); break; } } } #endif angband-3.5.1/src/store.h0000644000175000017500000000334612456456606014542 0ustar chriscchrisc#ifndef INCLUDED_STORE_H #define INCLUDED_STORE_H #include "object/obj-flag.h" #include "object/object.h" #include "parser.h" extern bool store_in_store; #define STORE_INVEN_MAX 24 /* Max number of discrete objs in inven */ #define STORE_TURNS 1000 /* Number of turns between turnovers */ #define STORE_SHUFFLE 25 /* 1/Chance (per day) of an owner changing */ /* List of store indices */ enum { STORE_NONE = -1, STORE_GENERAL = 0, STORE_ARMOR = 1, STORE_WEAPON = 2, STORE_TEMPLE = 3, STORE_ALCHEMY = 4, STORE_MAGIC = 5, STORE_B_MARKET = 6, STORE_HOME = 7, MAX_STORES = 8 }; typedef struct owner { unsigned int oidx; struct owner *next; char *name; s32b max_cost; } owner_type; struct store { struct store *next; struct owner *owners; struct owner *owner; unsigned int sidx; const char *name; byte stock_num; /* Stock -- Number of entries */ s16b stock_size; /* Stock -- Total Size of Array */ object_type *stock; /* Stock -- Actual stock items */ /* Always stock these items */ size_t always_size; size_t always_num; object_kind **always_table; /* Select a number of these items to stock */ size_t normal_size; size_t normal_num; object_kind **normal_table; int turnover; int normal_stock_min; int normal_stock_max; }; void store_init(void); void free_stores(void); void store_reset(void); void store_shuffle(struct store *store); void store_maint(struct store *store); s32b price_item(const object_type *o_ptr, bool store_buying, int qty); extern struct owner *store_ownerbyidx(struct store *s, unsigned int idx); struct parser *init_parse_stores(void); extern struct parser *store_parser_new(void); extern struct parser *store_owner_parser_new(struct store *stores); #endif /* INCLUDED_STORE_H */ angband-3.5.1/src/z-file.h0000644000175000017500000001443412456456607014575 0ustar chriscchrisc#ifndef INCLUDED_Z_FILE_H #define INCLUDED_Z_FILE_H #include "h-basic.h" /*** Permissions code ***/ /** * Player's user ID and group ID, respectively. * * Only relevant to POSIX systems that use main.c, and set there. */ extern int player_uid; extern int player_egid; /** * Drop or grab privileges. * * This is used on multiuser systems, where the game wants to gain access to * system-wide files like the scores, raw files, or savefiles. Reading from * these locations is permitted by anyone, but writing to them requires a call * to safe_setuid_grab() before opening the file for writing. * * safe_setuid_drop() should be called immediately after the file has been * opened, to prevent security risks, and restores the game's rights so that it * cannot write to the system-wide files. */ void safe_setuid_grab(void); void safe_setuid_drop(void); /*** Path building code ***/ /** * Concatenates "leaf" onto the end of "base", using system-specific path * separators, and places the result in buf[], truncated to "len" bytes. * * On Unixes, deals with the tilde as representing home directories. */ size_t path_build(char *buf, size_t len, const char *base, const char *leaf); /** * Return the index of the filename in a path, using PATH_SEPC. If no path * separator is found, return 0. */ size_t path_filename_index( const char *path ); /*** File access code ***/ /** Data types **/ /** * An opaque file handle for Angband file handling. */ typedef struct ang_file ang_file; /** * Specifies what kind of access is required to a file. See file_open(). */ typedef enum { MODE_WRITE, MODE_READ, MODE_APPEND } file_mode; /** * Specifies what kind of thing a file is, when writing. See file_open(). */ typedef enum { FTYPE_TEXT = 1, FTYPE_SAVE, FTYPE_RAW, FTYPE_HTML } file_type; /** Utility functions **/ /** * Returns TRUE if `fname` exists (and is a file), FALSE otherwise. */ bool file_exists(const char *fname); /** * Tries to delete `fname`. * * Returns TRUE if successful, FALSE otherwise. */ bool file_delete(const char *fname); /** * Moves the file `fname` to `newname`. * * Returns TRUE if successful, FALSE otherwise. */ bool file_move(const char *fname, const char *newname); /** * Returns TRUE if the file `first` is newer than `second`. */ bool file_newer(const char *first, const char *second); /** File handle creation **/ /** * Open file `buf`, returning a file handler representing that file. * * The file mode specifies what kind of access is required to the file: * - MODE_WRITE will overwrite the current contents of the file * - MODE_READ will allow read-only access to the file * - MODE_APPEND will allow write-only access, but will not overwrite the * current contents of the file. * * The file type is specified to allow systems which don't use file extensions * to set the type of the file appropriately. When reading, pass -1 as ftype; * when writing, use whichever filetype seems most appropriate. * * On any kind of error, this function returns NULL. */ ang_file *file_open(const char *buf, file_mode mode, file_type ftype); /** * Platform hook for file_open. Used to set filetypes. */ extern void (*file_open_hook)(const char *path, file_type ftype); /** * Attempt to close the file handle `f`. * * Returns TRUE if successful, FALSE otherwise. */ bool file_close(ang_file *f); /** File locking **/ /** * Lock or unlock the file represented by `f` for writing. * If the file is not open for writing, this call will fail. * * If `f` is closed, the file is automatically unlocked. */ void file_lock(ang_file *f); void file_unlock(ang_file *f); /** Line-based IO **/ /** * Get a line of text from the file represented by `f`, placing it into `buf` * to a maximum length of `n`. * * This expands tabs, replaces non-printables with '?', and deals with differing * line endings. * * Returns TRUE when data is returned; FALSE otherwise. */ bool file_getl(ang_file *f, char *buf, size_t n); /** * Write the string pointed to by `buf` to the file represented by `f`. * * Returns TRUE if successful, FALSE otherwise. */ bool file_put(ang_file *f, const char *buf); /** * Format (using strnfmt) the given args, and then call file_put(). */ bool file_putf(ang_file *f, const char *fmt, ...); bool file_vputf(ang_file *f, const char *fmt, va_list vp); /** Byte-based IO */ /** * Skip 'bytes' bytes. * \returns TRUE if successful, FALSE otherwise. */ bool file_skip(ang_file *f, int bytes); /** * Reads n bytes from file 'f' into buffer 'buf'. * \returns Number of bytes read; -1 on error */ int file_read(ang_file *f, char *buf, size_t n); /** * Write the first `n` bytes following the pointer `buf` to the file represented * by `f`. Do not mix with calls to file_writec(). * * Returns TRUE if successful, FALSE otherwise. */ bool file_write(ang_file *f, const char *buf, size_t n); /** * Read a byte from the file represented by `f` and place it at the location * specified by 'b'. * * Returns TRUE if successful, FALSE otherwise. */ bool file_readc(ang_file *f, byte *b); /** * Write the byte `b` to the file represented by `f`. * * Returns TRUE if successful, FALSE otherwise. */ bool file_writec(ang_file *f, byte b); /*** Directory code ***/ /** * Return whether or not a directory exists. */ bool dir_exists(const char *dirname); /** * Create's the given directory, creating intermediate directories if * needed and possible. Returns whether or not the directory was created * successfully. */ bool dir_create(const char *dirname); /** * An opaque file handle for Angband directory handling. */ typedef struct ang_dir ang_dir; /** * Opens a directory handle. * * `dirname` must be a system-specific pathname to the directory * you want scanned. * * Returns a valid directory handle on success, NULL otherwise. */ ang_dir *my_dopen(const char *dirname); /** * Reads a directory entry. * * `dir` must point to a directory handle previously returned by my_dopen(). * `fname` must be a pointer to a writeable chunk of memory `len` long. * * Returns TRUE on successful reading, FALSE otherwise. * (FALSE generally indicates that there are no more files to be read.) */ bool my_dread(ang_dir *dir, char *fname, size_t len); /** * Close a directory handle. */ void my_dclose(ang_dir *dir); #endif /* INCLUDED_Z_FILE_H */ angband-3.5.1/src/externs.h0000644000175000017500000001442512456456606015076 0ustar chriscchrisc#ifndef INCLUDED_EXTERNS_H #define INCLUDED_EXTERNS_H #include "monster/constants.h" #include "monster/monster.h" #include "object/object.h" #include "player/player.h" #include "store.h" #include "z-term.h" #include "z-file.h" #include "z-msg.h" #include "spells.h" /* This file was automatically generated. It is now obsolete (it was never a * good idea to begin with; you should include only what you use instead of * including everything everywhere) and is being slowly destroyed. Do not add * new entries to this file. */ #ifdef ALLOW_BORG /* Screensaver variables for the borg. apw */ extern bool screensaver; #endif /* ALLOW_BORG */ /* tables.c */ extern const s16b ddd[9]; extern const s16b ddx[10]; extern const s16b ddy[10]; extern const s16b ddx_ddd[9]; extern const s16b ddy_ddd[9]; extern const byte extract_energy[200]; extern const s32b player_exp[PY_MAX_LEVEL]; extern const player_sex sex_info[MAX_SEXES]; extern const char *stat_names[A_MAX]; extern const char *stat_names_reduced[A_MAX]; extern const char *window_flag_desc[32]; extern const char *inscrip_text[]; /* variable.c */ extern const char *copyright; extern bool arg_wizard; extern bool arg_rebalance; extern int arg_graphics; extern bool arg_graphics_nice; extern bool character_generated; extern bool character_existed; extern bool character_dungeon; extern bool character_saved; extern s16b character_icky; extern s16b character_xtra; extern u32b seed_randart; extern u32b seed_flavor; extern u32b seed_town; extern s32b turn; extern int use_graphics; extern s16b signal_count; extern bool msg_flag; extern u32b inkey_scan; extern bool inkey_flag; extern s16b o_max; extern s16b o_cnt; extern char savefile[1024]; extern term *angband_term[ANGBAND_TERM_MAX]; extern char angband_term_name[ANGBAND_TERM_MAX][16]; extern monster_lore *l_list; extern struct store *stores; extern int store_knowledge; extern const char *** name_sections; extern byte gf_to_attr[GF_MAX][BOLT_MAX]; extern wchar_t gf_to_char[GF_MAX][BOLT_MAX]; extern byte tval_to_attr[128]; extern player_other *op_ptr; extern player_type *p_ptr; extern feature_type *f_info; extern object_base *kb_info; extern object_kind *k_info; extern artifact_type *a_info; extern ego_item_type *e_info; extern monster_base *rb_info; extern monster_race *r_info; extern monster_pain *pain_messages; extern struct player_race *races; extern struct player_class *classes; extern struct flavor *flavors; extern struct vault *vaults; extern struct object_kind *objkinds; extern spell_type *s_info; extern struct hint *hints; extern struct pit_profile *pit_info; extern u16b lazymove_delay; extern const char *ANGBAND_SYS; extern const char *ANGBAND_GRAF; extern char *ANGBAND_DIR_APEX; extern char *ANGBAND_DIR_EDIT; extern char *ANGBAND_DIR_FILE; extern char *ANGBAND_DIR_HELP; extern char *ANGBAND_DIR_INFO; extern char *ANGBAND_DIR_SAVE; extern char *ANGBAND_DIR_PREF; extern char *ANGBAND_DIR_USER; extern char *ANGBAND_DIR_XTRA; extern char *ANGBAND_DIR_XTRA_FONT; extern char *ANGBAND_DIR_XTRA_GRAF; extern char *ANGBAND_DIR_XTRA_SOUND; extern char *ANGBAND_DIR_XTRA_ICON; extern byte item_tester_tval; extern bool (*item_tester_hook)(const object_type *); extern ang_file *text_out_file; extern void (*text_out_hook)(byte a, const char *str); extern int text_out_wrap; extern int text_out_indent; extern int text_out_pad; extern bool use_transparency; extern void (*sound_hook)(int); /* util.c */ extern struct keypress *inkey_next; /* randart.c */ extern errr do_randart(u32b randart_seed, bool full); /* score.c */ extern void enter_score(time_t *death_time); extern void show_scores(void); extern void predict_score(void); /* signals.c */ extern void signals_ignore_tstp(void); extern void signals_handle_tstp(void); extern void signals_init(void); /* store.c */ void do_cmd_store_knowledge(void); /* util.c */ extern void flush(void); extern void flush_fail(void); extern struct keypress inkey(void); extern ui_event inkey_m(void); extern ui_event inkey_ex(void); extern void anykey(void); extern void bell(const char *reason); extern void sound(int val); extern void msg(const char *fmt, ...); extern void msgt(unsigned int type, const char *fmt, ...); extern void message_flush(void); extern void text_out_to_file(byte attr, const char *str); extern void text_out_to_screen(byte a, const char *str); extern void text_out(const char *fmt, ...); extern void text_out_c(byte a, const char *fmt, ...); extern void text_out_e(const char *fmt, ...); extern void clear_from(int row); extern bool askfor_aux_keypress(char *buf, size_t buflen, size_t *curs, size_t *len, struct keypress keypress, bool firsttime); extern bool askfor_aux(char *buf, size_t len, bool (*keypress_h)(char *, size_t, size_t *, size_t *, struct keypress, bool)); extern bool get_string(const char *prompt, char *buf, size_t len); extern s16b get_quantity(const char *prompt, int max); extern char get_char(const char *prompt, const char *options, size_t len, char fallback); extern bool get_check(const char *prompt); extern bool (*get_file)(const char *suggested_name, char *path, size_t len); extern bool get_com(const char *prompt, struct keypress *command); extern bool get_com_ex(const char *prompt, ui_event *command); extern void pause_line(struct term *term); extern bool is_a_vowel(int ch); extern int color_char_to_attr(char c); extern int color_text_to_attr(const char *name); extern const char *attr_to_text(byte a); extern bool char_matches_key(wchar_t c, keycode_t key); #ifdef SUPPORT_GAMMA extern void build_gamma_table(int gamma); extern byte gamma_table[256]; #endif /* SUPPORT_GAMMA */ /* xtra2.c */ bool modify_panel(term *t, int wy, int wx); bool adjust_panel(int y, int x); bool change_panel(int dir); void verify_panel(void); void center_panel(void); int motion_dir(int y1, int x1, int y2, int x2); int target_dir(struct keypress ch); int target_dir_allow(struct keypress ch, bool allow_5); bool get_rep_dir(int *dp, bool allow_5); /* xtra3.c */ byte monster_health_attr(void); void cnv_stat(int val, char *out_val, size_t out_len); void toggle_inven_equip(void); void subwindows_set_flags(u32b *new_flags, size_t n_subwindows); char* random_hint(void); /* wiz-spoil.c */ bool make_fake_artifact(object_type *o_ptr, struct artifact *artifact); /* borg.h */ #ifdef ALLOW_BORG extern void do_cmd_borg(void); #endif /* ALLOW_BORG */ #endif /* !INCLUDED_EXTERNS_H */ angband-3.5.1/src/autoconf.h.in0000644000175000017500000000725412456456610015626 0ustar chriscchrisc/* src/autoconf.h.in. Generated from configure.ac by autoheader. */ /* Path to the game's configuration data */ #undef DEFAULT_CONFIG_PATH /* Path to the game's variable data */ #undef DEFAULT_DATA_PATH /* Path to the game's lib directory */ #undef DEFAULT_LIB_PATH /* Define to 1 if you have the `can_change_color' function. */ #undef HAVE_CAN_CHANGE_COLOR /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR /* Define to 1 if you have the `mvwaddnwstr' function. */ #undef HAVE_MVWADDNWSTR /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the `setegid' function. */ #undef HAVE_SETEGID /* Define to 1 if you have the `setresgid' function. */ #undef HAVE_SETRESGID /* Define to 1 if you have the `stat' function. */ #undef HAVE_STAT /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `use_default_colors' function. */ #undef HAVE_USE_DEFAULT_COLORS /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to 1 if using SDL_mixer sound support and it's found. */ #undef SOUND_SDL /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if using the Curses frontend. */ #undef USE_GCU /* Define to 1 if NCurses is found. */ #undef USE_NCURSES /* Define to use private save and score paths. */ #undef USE_PRIVATE_PATHS /* Define to 1 if using the SDL interface and SDL is found. */ #undef USE_SDL /* Define to 0 to omit the stats frontend */ #undef USE_STATS /* Define to 1 to build the test frontend */ #undef USE_TEST /* Define to 1 if using the Windows interface. */ #undef USE_WIN /* Define to 1 if using the X11 frontend and X11 libraries are found. */ #undef USE_X11 /* Version number of package */ #undef VERSION /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Define to empty if `const' does not conform to ANSI C. */ #undef const angband-3.5.1/src/guid.c0000644000175000017500000000120112456456606014315 0ustar chriscchrisc/* * File: guid.c * Purpose: Entity guids. * * Copyright (c) 2011 elly+angband@leptoquark.net * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "guid.h" int guid_eq(guid a, guid b) { return a == b; } angband-3.5.1/src/randname.c0000644000175000017500000001122412456456606015160 0ustar chriscchrisc/* * File: randname.c * Purpose: Random name generation * * Copyright (c) 2007 Antony Sidwell, Sheldon Simms * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "randname.h" /* Markers for the start and end of words. */ #define S_WORD 26 #define E_WORD S_WORD #define TOTAL 27 typedef unsigned short name_probs[S_WORD+1][S_WORD+1][TOTAL+1]; /* * This function builds probability tables from a list of purely alphabetical * lower-case words, and puts them into the supplied name_probs object. * The array of names should have a NULL entry at the end of the list. * It relies on the ASCII character set (through use of A2I). */ static void build_prob(name_probs probs, const char **learn) { int c_prev, c_cur, c_next; const char *ch; int i; /* Build raw frequencies */ for (i = 0; learn[i] != NULL; i++) { c_prev = c_cur = S_WORD; ch = learn[i]; /* Iterate over the next word */ while (*ch != '\0') { c_next = A2I(tolower((unsigned char)*ch)); probs[c_prev][c_cur][c_next]++; probs[c_prev][c_cur][TOTAL]++; /* Step on */ c_prev = c_cur; c_cur = c_next; ch++; } probs[c_prev][c_cur][E_WORD]++; probs[c_prev][c_cur][TOTAL]++; } } /* * Use W. Sheldon Simms' random name generator algorithm (Markov Chain stylee). * * Generate a random word using the probability tables we built earlier. * Relies on the A2I and I2A macros (and so the ASCII character set) and * is_a_vowel (so the basic 5 English vowels). */ size_t randname_make(randname_type name_type, size_t min, size_t max, char *word_buf, size_t buflen, const char ***sections) { size_t lnum = 0; bool found_word = FALSE; static name_probs lprobs; static randname_type cached_type = RANDNAME_NUM_TYPES; assert(name_type > 0 && name_type < RANDNAME_NUM_TYPES); /* To allow for a terminating character */ assert(buflen > max); /* We cache one set of probabilities, only regenerate when the type changes. It's as good a way as any for now. Frankly, we could probably regenerate every time. */ if (cached_type != name_type) { const char **wordlist = NULL; wordlist = sections[name_type]; (void)WIPE(lprobs, name_probs); build_prob(lprobs, wordlist); cached_type = name_type; } /* Generate the actual word wanted. */ while (!found_word) { char *cp = word_buf; int c_prev = S_WORD; int c_cur = S_WORD; int tries = 0; bool contains_vowel = FALSE; lnum = 0; /* We start the word again if we run out of space or have had to have 10 goes to find a word that satisfies the minimal conditions. */ while (tries < 10 && lnum <= max && !found_word) { /* Pick the next letter based on a simple weighting of which letters can follow the previous two */ int r; int c_next = 0; assert(c_prev >= 0 && c_prev <= S_WORD); assert(c_cur >= 0 && c_cur <= S_WORD); r = randint0(lprobs[c_prev][c_cur][TOTAL]); while (r >= lprobs[c_prev][c_cur][c_next]) { r -= lprobs[c_prev][c_cur][c_next]; c_next++; } assert(c_next <= E_WORD); assert(c_next >= 0); if (c_next == E_WORD) { /* If we've reached the end, we check if we've met the simple conditions, otherwise have another go at choosing a letter for this position. */ if (lnum >= min && contains_vowel) { *cp = '\0'; found_word = TRUE; } else { tries++; } } else { /* Add the letter to the word and move on. */ *cp = I2A(c_next); if (is_a_vowel(*cp)) contains_vowel = TRUE; cp++; lnum++; assert(c_next <= S_WORD); assert(c_next >= 0); c_prev = c_cur; c_cur = c_next; } } } return lnum; } /* * To run standalone tests, #define RANDNAME_TESTING and link with * with just z-rand.c from Angband. */ #ifdef RANDNAME_TESTING #include #include bool is_a_vowel(int ch) { switch (ch) { case 'a': case 'e': case 'i': case 'o': case 'u': return (TRUE); } return (FALSE); } int main(int argc, char *argv[]) { int i; char name[256]; Rand_value = time(NULL); for (i = 0; i < 20; i++) { randname_make(RANDNAME_TOLKIEN, 5, 9, name, 256, name_sections); my_strcap(name); printf("%s\n", name); } return 0; } #endif angband-3.5.1/src/stats/0000755000175000017500000000000012456456606014365 5ustar chriscchriscangband-3.5.1/src/stats/db.h0000644000175000017500000000270312456456606015125 0ustar chriscchrisc/* * File: stats/db.h * Purpose: interface to SQLite3 database manipulation * * Copyright (c) 2011 Robert Au * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, * research, * and not for profit purposes provided that this copyright and * statement * are included in all such copies. Other copyrights may also apply. */ #ifndef STATS_DB_H #define STATS_DB_H #include /* Utility macro for executing and resetting a statement; assumes existence * of an integer err variable */ #define STATS_DB_STEP_RESET(s) \ err = sqlite3_step(s);\ if (err && err != SQLITE_DONE) return err;\ err = sqlite3_reset(s);\ if (err) return err; /* Utility macro for finalizing a statement; assumes existence * of an integer err variable */ #define STATS_DB_FINALIZE(s) \ err = sqlite3_finalize(s);\ if (err) return err; extern bool stats_db_open(void); extern bool stats_db_close(void); extern int stats_db_exec(char *sql_str); extern int stats_db_stmt_prep(sqlite3_stmt **sql_stmt, char *sql_str); extern int stats_db_bind_ints(sqlite3_stmt *sql_stmt, int num_cols, int offset, ...); extern int stats_db_bind_rv(sqlite3_stmt *sql_stmt, int col, random_value rv); #endif /* STATS_DB_H */ angband-3.5.1/src/stats/Makefile0000644000175000017500000000010012456456606016014 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)extra.mk $(MKPATH)buildsys.mk angband-3.5.1/src/stats/db.c0000644000175000017500000001402012456456606015113 0ustar chriscchrisc/* * File: stats/db.c * Purpose: SQLite3 database storage functions * * Copyright (c) 2011 Robert Au * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, * research, * and not for profit purposes provided that this copyright and * statement * are included in all such copies. Other copyrights may also apply. */ #include #include #include #include "angband.h" /* Module state variables */ static sqlite3 *db; static char *ANGBAND_DIR_STATS; static char *db_filename; /* Utility functions */ static bool stats_make_output_dir(void) { size_t size = strlen(ANGBAND_DIR_USER) + strlen(PATH_SEP) + 6; ANGBAND_DIR_STATS = mem_alloc(size * sizeof(char)); path_build(ANGBAND_DIR_STATS, size, ANGBAND_DIR_USER, "stats"); if (dir_create(ANGBAND_DIR_STATS)) { return true; } else { return false; } } /* Interface functions */ /** * Call stats_db_open first to create the database file and set up a * database connection. Returns true on success, false on failure. */ bool stats_db_open(void) { size_t size; char filename_buf[20]; int result; time_t now_time = time(NULL); struct tm *now = localtime(&now_time); if (!stats_make_output_dir()) { return false; } size = strlen(ANGBAND_DIR_STATS) + strlen(PATH_SEP) + 20; db_filename = mem_alloc(size * sizeof(char)); strnfmt(filename_buf, 20, "%4d-%02d-%02dT%02d:%02d.db", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min); path_build(db_filename, size, ANGBAND_DIR_STATS, filename_buf); if (file_exists(db_filename)) { return false; } result = sqlite3_open(db_filename, &db); if (result) { sqlite3_close(db); return false; } return true; } /** * Call stats_close_db to close the database connection and free * module variables. */ bool stats_db_close(void) { sqlite3_close(db); mem_free(ANGBAND_DIR_STATS); mem_free(db_filename); return true; } /** * Evaluate a sqlite3 SQL statement on the previously opened database. * The argument sql_str should contain the SQL statement, encoded as UTF-8. * The return value is zero on success or a sqlite3 error code on failure. * This function is a wrapper around sqlite3_exec and is for statements * that don't expect output. Use stats_db_stmt_prep(), sqlite3_bind_*(), and * sqlite3_step() for more complex statements. */ int stats_db_exec(char *sql_str) { assert(strlen(sql_str) > 0); return sqlite3_exec(db, sql_str, NULL, NULL, NULL); } /** * Prepare a sqlite3 SQL statement for evaluation. sql_stmt should be a * non-NULL, unallocated pointer. The sqlite3 library will allocate memory * appropriately. The caller should later delete this statement with * sqlite3_finalize(). sql_str should contain the SQL statement, encoded * as UTF-8. The function returns 0 on success or a sqlite3 error code on * failure. */ int stats_db_stmt_prep(sqlite3_stmt **sql_stmt, char *sql_str) { assert(strlen(sql_str) > 0); assert(sql_stmt != NULL); return sqlite3_prepare_v2(db, sql_str, strlen(sql_str), sql_stmt, NULL); } /** * Utility function for binding many ints at once. The offset argument * should be the number of columns to skip before starting to bind. * Arguments after num_cols should be a series of ints to be bound to * parameters in sql_stmt, in order. */ int stats_db_bind_ints(sqlite3_stmt *sql_stmt, int num_cols, int offset, ...) { va_list vp; int err = SQLITE_OK; int col; va_start(vp, offset); for (col = offset + 1; col <= offset + num_cols; col++) { u32b value = va_arg(vp, u32b); err = sqlite3_bind_int(sql_stmt, col, value); if (err) return err; } va_end(vp); return err; } /** * Utility function for binding a random_value to a parameter as TEXT. * Note optimization for storing values without randomness. */ int stats_db_bind_rv(sqlite3_stmt *sql_stmt, int col, random_value rv) { char sql_buf[256]; if (rv.dice || rv.sides || rv.m_bonus) { strnfmt(sql_buf, 256, "%d+%dd%dM%d", rv.base, rv.dice, rv.sides, rv.m_bonus); } else { strnfmt(sql_buf, 256, "%d", rv.base); } return sqlite3_bind_text(sql_stmt, col, sql_buf, strlen(sql_buf), SQLITE_STATIC); } /** * I have chosen not to wrap the other sqlite3 core interfaces, since * they do not require access to the database connection object db. * The key functions are * * int sqlite3_bind_(sqlite3_stmt *, int, ...) * Given a previously prepared statement, bind a parameter to a value * of a given type: blob, double, int, int64, null, text, text16, * value, zeroblob. The second argument is the index of the parameter. * * int sqlite3_step(sqlite3_stmt *) * Evaluate the given statement. Returns SQLITE_DONE on successful * execution completion. For statements that return data, returns * SQLITE_ROW if a new row of data is ready for processing. Call the * function multiple times to retrieve all the rows. It may also return * other sqlite3 error codes. * * sqlite3_column_(sqlite3_stmt *, int) * Retrieve information about a column of the current result row of a * query. The second argument is the index of the column. Available * types are blob, double, int, int64, text, text16, and value. * Routines attempt unit conversion where appropriate. Use * sqlite3_column_type() to determine the datatype code of a column, * and sqlite3_column_bytes() or sqlite3_column_bytes16() to determikne * the number of bytes in a blob or string. * * int sqlite3_reset(sqlite3_stmt *) * Reset the given statement to its initial state, so that it may be * re-executed. Does not alter bindings. * * int sqlite3_clear_bindings(sqlite3_stmt *) * Reset all parameters for the given statement to NULL. * * int sqlite3_finalize(sqlite3_stmt *) * Delete the given prepared statement. */ angband-3.5.1/src/stats/structs.h0000644000175000017500000000211412456456606016243 0ustar chriscchrisc/* * File: stats/structs.h * Purpose: data structures for lists not exported in headers elsewhere * * Copyright (c) 2011 Robert Au * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, * research, * and not for profit purposes provided that this copyright and * statement * are included in all such copies. Other copyrights may also apply. */ #ifndef STATS_STRUCTS_H #define STATS_STRUCTS_H #include "effects.h" #include "monster/monster.h" #include "monster/mon-spell.h" #include "object/slays.h" /* * Entries for spell/activation descriptions */ typedef struct { u16b index; /* Effect index */ bool aim; /* Whether the effect requires aiming */ u16b power; /* Power rating for obj-power.c */ const char *desc; /* Effect description */ } info_entry; #endif /* STATS_STRUCTS_H */ angband-3.5.1/src/attack.c0000644000175000017500000004674312456456606014660 0ustar chriscchrisc/* * File: attack.c * Purpose: Attacking (both throwing and melee) code * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "cave.h" #include "cmds.h" #include "monster/mon-make.h" #include "monster/mon-msg.h" #include "monster/mon-timed.h" #include "monster/mon-util.h" #include "monster/monster.h" #include "object/slays.h" #include "object/tvalsval.h" #include "spells.h" #include "target.h" /** * Returns percent chance of an object breaking after throwing or shooting. * * Artifacts will never break. * * Beyond that, each item kind has a percent chance to break (0-100). When the * object hits its target this chance is used. * * When an object misses it also has a chance to break. This is determined by * squaring the normaly breakage probability. So an item that breaks 100% of * the time on hit will also break 100% of the time on a miss, whereas a 50% * hit-breakage chance gives a 25% miss-breakage chance, and a 10% hit breakage * chance gives a 1% miss-breakage chance. */ int breakage_chance(const object_type *o_ptr, bool hit_target) { int perc = o_ptr->kind->base->break_perc; if (o_ptr->artifact) return 0; if (!hit_target) return (perc * perc) / 100; return perc; } /** * Determine if the player "hits" a monster. */ bool test_hit(int chance, int ac, int vis) { int k = randint0(100); /* There is an automatic 12% chance to hit, * and 5% chance to miss. */ if (k < 17) return k < 12; /* Penalize invisible targets */ if (!vis) chance /= 2; /* Starting a bit higher up on the scale */ if (chance < 9) chance = 9; /* Power competes against armor */ return randint0(chance) >= (ac * 2 / 3); } /** * Determine damage for critical hits from shooting. * * Factor in item weight, total plusses, and player level. */ static int critical_shot(int weight, int plus, int dam, u32b *msg_type) { int chance = weight + (p_ptr->state.to_h + plus) * 4 + p_ptr->lev * 2; int power = weight + randint1(500); if (randint1(5000) > chance) { *msg_type = MSG_SHOOT_HIT; return dam; } else if (power < 500) { *msg_type = MSG_HIT_GOOD; return 2 * dam + 5; } else if (power < 1000) { *msg_type = MSG_HIT_GREAT; return 2 * dam + 10; } else { *msg_type = MSG_HIT_SUPERB; return 3 * dam + 15; } } /** * Determine damage for critical hits from melee. * * Factor in weapon weight, total plusses, player level. */ static int critical_norm(int weight, int plus, int dam, u32b *msg_type) { int chance = weight + (p_ptr->state.to_h + plus) * 5 + p_ptr->lev * 3; int power = weight + randint1(650); if (randint1(5000) > chance) { *msg_type = MSG_HIT; return dam; } else if (power < 400) { *msg_type = MSG_HIT_GOOD; return 2 * dam + 5; } else if (power < 700) { *msg_type = MSG_HIT_GREAT; return 2 * dam + 10; } else if (power < 900) { *msg_type = MSG_HIT_SUPERB; return 3 * dam + 15; } else if (power < 1300) { *msg_type = MSG_HIT_HI_GREAT; return 3 * dam + 20; } else { *msg_type = MSG_HIT_HI_SUPERB; return 4 * dam + 20; } } /* A list of the different hit types and their associated special message */ static const struct { u32b msg; const char *text; } melee_hit_types[] = { { MSG_MISS, NULL }, { MSG_HIT, NULL }, { MSG_HIT_GOOD, "It was a good hit!" }, { MSG_HIT_GREAT, "It was a great hit!" }, { MSG_HIT_SUPERB, "It was a superb hit!" }, { MSG_HIT_HI_GREAT, "It was a *GREAT* hit!" }, { MSG_HIT_HI_SUPERB, "It was a *SUPERB* hit!" }, }; /** * Return the player's chance to hit with a particular weapon. */ int py_attack_hit_chance(const object_type *weapon) { int bonus = p_ptr->state.to_h + weapon->to_h; int chance = p_ptr->state.skills[SKILL_TO_HIT_MELEE] + bonus * BTH_PLUS_ADJ; return chance; } /** * Attack the monster at the given location with a single blow. */ static bool py_attack_real(int y, int x, bool *fear) { size_t i; /* Information about the target of the attack */ monster_type *m_ptr = cave_monster_at(cave, y, x); char m_name[80]; bool stop = FALSE; /* The weapon used */ object_type *o_ptr = &p_ptr->inventory[INVEN_WIELD]; /* Information about the attack */ int chance = py_attack_hit_chance(o_ptr); bool do_quake = FALSE; bool success = FALSE; /* Default to punching for one damage */ const char *hit_verb = "punch"; int dmg = 1; u32b msg_type = MSG_HIT; /* Extract monster name (or "it") */ monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_OBJE | MDESC_IND_HID | MDESC_PRO_HID); /* Auto-Recall if possible and visible */ if (m_ptr->ml) monster_race_track(m_ptr->race); /* Track a new monster */ if (m_ptr->ml) health_track(p_ptr, m_ptr); /* Handle player fear (only for invisible monsters) */ if (check_state(p_ptr, OF_AFRAID, p_ptr->state.flags)) { msgt(MSG_AFRAID, "You are too afraid to attack %s!", m_name); return FALSE; } /* Disturb the monster */ mon_clear_timed(m_ptr, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, FALSE); /* See if the player hit */ success = test_hit(chance, m_ptr->race->ac, m_ptr->ml); /* If a miss, skip this hit */ if (!success) { msgt(MSG_MISS, "You miss %s.", m_name); return FALSE; } /* Handle normal weapon */ if (o_ptr->kind) { const struct slay *best_s_ptr = NULL; hit_verb = "hit"; /* Get the best attack from all slays or * brands on all non-launcher equipment */ for (i = INVEN_LEFT; i < INVEN_TOTAL; i++) { struct object *obj = &p_ptr->inventory[i]; if (obj->kind) improve_attack_modifier(obj, m_ptr, &best_s_ptr, TRUE, FALSE); } improve_attack_modifier(o_ptr, m_ptr, &best_s_ptr, TRUE, FALSE); if (best_s_ptr != NULL) hit_verb = best_s_ptr->melee_verb; dmg = damroll(o_ptr->dd, o_ptr->ds); dmg *= (best_s_ptr == NULL) ? 1 : best_s_ptr->mult; dmg += o_ptr->to_d; dmg = critical_norm(o_ptr->weight, o_ptr->to_h, dmg, &msg_type); /* Learn by use for the weapon */ object_notice_attack_plusses(o_ptr); if (check_state(p_ptr, OF_IMPACT, p_ptr->state.flags) && dmg > 50) { do_quake = TRUE; wieldeds_notice_flag(p_ptr, OF_IMPACT); } } /* Learn by use for other equipped items */ wieldeds_notice_on_attack(); /* Apply the player damage bonuses */ dmg += p_ptr->state.to_d; /* No negative damage; change verb if no damage done */ if (dmg <= 0) { dmg = 0; msg_type = MSG_MISS; hit_verb = "fail to harm"; } for (i = 0; i < N_ELEMENTS(melee_hit_types); i++) { const char *dmg_text = ""; if (msg_type != melee_hit_types[i].msg) continue; if (OPT(show_damage)) dmg_text = format(" (%d)", dmg); if (melee_hit_types[i].text) msgt(msg_type, "You %s %s%s. %s", hit_verb, m_name, dmg_text, melee_hit_types[i].text); else msgt(msg_type, "You %s %s%s.", hit_verb, m_name, dmg_text); } /* Confusion attack */ if (p_ptr->confusing) { p_ptr->confusing = FALSE; msg("Your hands stop glowing."); mon_inc_timed(m_ptr, MON_TMD_CONF, (10 + randint0(p_ptr->lev) / 10), MON_TMD_FLG_NOTIFY, FALSE); } /* Damage, check for fear and death */ stop = mon_take_hit(m_ptr, dmg, fear, NULL); if (stop) (*fear) = FALSE; /* Apply earthquake brand */ if (do_quake) { earthquake(p_ptr->py, p_ptr->px, 10); if (cave->m_idx[y][x] == 0) stop = TRUE; } return stop; } /** * Attack the monster at the given location * * We get blows until energy drops below that required for another blow, or * until the target monster dies. Each blow is handled by py_attack_real(). * We don't allow @ to spend more than 100 energy in one go, to avoid slower * monsters getting double moves. */ void py_attack(int y, int x) { int blow_energy = 10000 / p_ptr->state.num_blows; int blows = 0; bool fear = FALSE; monster_type *m_ptr = cave_monster_at(cave, y, x); /* disturb the player */ disturb(p_ptr, 0,0); /* Initialize the energy used */ p_ptr->energy_use = 0; /* Attack until energy runs out or enemy dies. We limit energy use to 100 * to avoid giving monsters a possible double move. */ while (p_ptr->energy >= blow_energy * (blows + 1)) { bool stop = py_attack_real(y, x, &fear); p_ptr->energy_use += blow_energy; if (stop || p_ptr->energy_use + blow_energy > 100) break; blows++; } /* Hack - delay fear messages */ if (fear && m_ptr->ml) { char m_name[80]; /* XXX Don't set monster_desc flags, since add_monster_message does string processing on m_name */ monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_DEFAULT); add_monster_message(m_name, m_ptr, MON_MSG_FLEE_IN_TERROR, TRUE); } } /* A list of the different hit types and their associated special message */ static const struct { u32b msg; const char *text; } ranged_hit_types[] = { { MSG_MISS, NULL }, { MSG_SHOOT_HIT, NULL }, { MSG_HIT_GOOD, "It was a good hit!" }, { MSG_HIT_GREAT, "It was a great hit!" }, { MSG_HIT_SUPERB, "It was a superb hit!" } }; /** * This is a helper function used by do_cmd_throw and do_cmd_fire. * * It abstracts out the projectile path, display code, identify and clean up * logic, while using the 'attack' parameter to do work particular to each * kind of attack. */ static void ranged_helper(int item, int dir, int range, int shots, ranged_attack attack) { /* Get the ammo */ object_type *o_ptr = object_from_item_idx(item); int i, j; byte missile_attr = object_attr(o_ptr); wchar_t missile_char; object_type object_type_body; object_type *i_ptr = &object_type_body; char o_name[80]; int path_n; u16b path_g[256]; int msec = op_ptr->delay_factor; /* Start at the player */ int x = p_ptr->px; int y = p_ptr->py; /* Predict the "target" location */ s16b ty = y + 99 * ddy[dir]; s16b tx = x + 99 * ddx[dir]; bool hit_target = FALSE; missile_char = object_char(o_ptr); /* Check for target validity */ if ((dir == 5) && target_okay()) { int taim; char msg[80]; target_get(&tx, &ty); taim = distance(y, x, ty, tx); if (taim > range) { strnfmt(msg, sizeof(msg), "Target out of range by %d squares. Fire anyway? ", taim - range); if (!get_check(msg)) return; } } /* Sound */ sound(MSG_SHOOT); object_notice_on_firing(o_ptr); /* Describe the object */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_FULL | ODESC_SINGULAR); /* Actually "fire" the object -- Take a partial turn */ p_ptr->energy_use = (100 / shots); /* Calculate the path */ path_n = project_path(path_g, range, y, x, ty, tx, 0); /* Hack -- Handle stuff */ handle_stuff(p_ptr); /* Start at the player */ x = p_ptr->px; y = p_ptr->py; /* Project along the path */ for (i = 0; i < path_n; ++i) { int ny = GRID_Y(path_g[i]); int nx = GRID_X(path_g[i]); /* Hack -- Stop before hitting walls */ if (!cave_ispassable(cave, ny, nx)) break; /* Advance */ x = nx; y = ny; /* Only do visuals if the player can "see" the missile */ if (player_can_see_bold(y, x)) { print_rel(missile_char, missile_attr, y, x); move_cursor_relative(y, x); Term_fresh(); if (p_ptr->redraw) redraw_stuff(p_ptr); Term_xtra(TERM_XTRA_DELAY, msec); cave_light_spot(cave, y, x); Term_fresh(); if (p_ptr->redraw) redraw_stuff(p_ptr); } else { /* Delay anyway for consistency */ Term_xtra(TERM_XTRA_DELAY, msec); } /* Handle monster */ if (cave->m_idx[y][x] > 0) break; } /* Try the attack on the monster at (x, y) if any */ if (cave->m_idx[y][x] > 0) { monster_type *m_ptr = cave_monster_at(cave, y, x); int visible = m_ptr->ml; bool fear = FALSE; char m_name[80]; const char *note_dies = monster_is_unusual(m_ptr->race) ? " is destroyed." : " dies."; struct attack_result result = attack(o_ptr, y, x); int dmg = result.dmg; u32b msg_type = result.msg_type; const char *hit_verb = result.hit_verb; if (result.success) { hit_target = TRUE; object_notice_attack_plusses(o_ptr); /* Learn by use for other equipped items */ wieldeds_notice_to_hit_on_attack(); /* No negative damage; change verb if no damage done */ if (dmg <= 0) { dmg = 0; msg_type = MSG_MISS; hit_verb = "fails to harm"; } if (!visible) { /* Invisible monster */ msgt(MSG_SHOOT_HIT, "The %s finds a mark.", o_name); } else { for (j = 0; j < (int)N_ELEMENTS(ranged_hit_types); j++) { char m_name[80]; const char *dmg_text = ""; if (msg_type != ranged_hit_types[j].msg) continue; if (OPT(show_damage)) dmg_text = format(" (%d)", dmg); monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_OBJE); if (ranged_hit_types[j].text) msgt(msg_type, "Your %s %s %s%s. %s", o_name, hit_verb, m_name, dmg_text, ranged_hit_types[j].text); else msgt(msg_type, "Your %s %s %s%s.", o_name, hit_verb, m_name, dmg_text); } /* Track this monster */ if (m_ptr->ml) monster_race_track(m_ptr->race); if (m_ptr->ml) health_track(p_ptr, m_ptr); } /* Hit the monster, check for death */ if (!mon_take_hit(m_ptr, dmg, &fear, note_dies)) { message_pain(m_ptr, dmg); if (fear && m_ptr->ml) { monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_DEFAULT); add_monster_message(m_name, m_ptr, MON_MSG_FLEE_IN_TERROR, TRUE); } } } } /* Obtain a local object */ object_copy(i_ptr, o_ptr); object_split(i_ptr, o_ptr, 1); /* Drop (or break) near that location */ drop_near(cave, i_ptr, breakage_chance(i_ptr, hit_target), y, x, TRUE); if (item >= 0) { /* The ammo is from the inventory */ inven_item_increase(item, -1); inven_item_describe(item); inven_item_optimize(item); } else { /* The ammo is from the floor */ floor_item_increase(0 - item, -1); floor_item_optimize(0 - item); } } /** * Helper function used with ranged_helper by do_cmd_fire. */ static struct attack_result make_ranged_shot(object_type *o_ptr, int y, int x) { struct attack_result result = {FALSE, 0, 0, "hits"}; object_type *j_ptr = &p_ptr->inventory[INVEN_BOW]; monster_type *m_ptr = cave_monster_at(cave, y, x); int bonus = p_ptr->state.to_h + o_ptr->to_h + j_ptr->to_h; int chance = p_ptr->state.skills[SKILL_TO_HIT_BOW] + bonus * BTH_PLUS_ADJ; int chance2 = chance - distance(p_ptr->py, p_ptr->px, y, x); int multiplier = p_ptr->state.ammo_mult; const struct slay *best_s_ptr = NULL; /* Did we hit it (penalize distance travelled) */ if (!test_hit(chance2, m_ptr->race->ac, m_ptr->ml)) return result; result.success = TRUE; improve_attack_modifier(o_ptr, m_ptr, &best_s_ptr, TRUE, FALSE); improve_attack_modifier(j_ptr, m_ptr, &best_s_ptr, TRUE, FALSE); /* If we have a slay, modify the multiplier appropriately */ if (best_s_ptr != NULL) { result.hit_verb = best_s_ptr->range_verb; multiplier += best_s_ptr->mult; } /* Apply damage: multiplier, slays, criticals, bonuses */ result.dmg = damroll(o_ptr->dd, o_ptr->ds); result.dmg += o_ptr->to_d + j_ptr->to_d; result.dmg *= multiplier; result.dmg = critical_shot(o_ptr->weight, o_ptr->to_h, result.dmg, &result.msg_type); object_notice_attack_plusses(&p_ptr->inventory[INVEN_BOW]); return result; } /** * Helper function used with ranged_helper by do_cmd_throw. */ static struct attack_result make_ranged_throw(object_type *o_ptr, int y, int x) { struct attack_result result = {FALSE, 0, 0, "hits"}; monster_type *m_ptr = cave_monster_at(cave, y, x); int bonus = p_ptr->state.to_h + o_ptr->to_h; int chance = p_ptr->state.skills[SKILL_TO_HIT_THROW] + bonus * BTH_PLUS_ADJ; int chance2 = chance - distance(p_ptr->py, p_ptr->px, y, x); int multiplier = 1; const struct slay *best_s_ptr = NULL; /* If we missed then we're done */ if (!test_hit(chance2, m_ptr->race->ac, m_ptr->ml)) return result; result.success = TRUE; improve_attack_modifier(o_ptr, m_ptr, &best_s_ptr, TRUE, FALSE); /* If we have a slay, modify the multiplier appropriately */ if (best_s_ptr != NULL) { result.hit_verb = best_s_ptr->range_verb; multiplier += best_s_ptr->mult; } /* Apply damage: multiplier, slays, criticals, bonuses */ result.dmg = damroll(o_ptr->dd, o_ptr->ds); result.dmg += o_ptr->to_d; result.dmg *= multiplier; result.dmg = critical_norm(o_ptr->weight, o_ptr->to_h, result.dmg, &result.msg_type); return result; } /** * Fire an object from the quiver, pack or floor at a target. */ void do_cmd_fire(cmd_code code, cmd_arg args[]) { int item = args[0].item; int dir = args[1].direction; int range = MIN(6 + 2 * p_ptr->state.ammo_mult, MAX_RANGE); int shots = p_ptr->state.num_shots; ranged_attack attack = make_ranged_shot; object_type *j_ptr = &p_ptr->inventory[INVEN_BOW]; object_type *o_ptr = object_from_item_idx(item); /* Require a usable launcher */ if (!j_ptr->tval || !p_ptr->state.ammo_tval) { msg("You have nothing to fire with."); return; } /* Check the item being fired is usable by the player. */ if (!item_is_available(item, NULL, USE_EQUIP | USE_INVEN | USE_FLOOR)) { msg("That item is not within your reach."); return; } /* Check the ammo can be used with the launcher */ if (o_ptr->tval != p_ptr->state.ammo_tval) { msg("That ammo cannot be fired by your current weapon."); return; } ranged_helper(item, dir, range, shots, attack); } /** * Throw an object from the quiver, pack or floor. */ void do_cmd_throw(cmd_code code, cmd_arg args[]) { int item = args[0].item; int dir = args[1].direction; int shots = 1; object_type *o_ptr = object_from_item_idx(item); int weight = MAX(o_ptr->weight, 10); int str = adj_str_blow[p_ptr->state.stat_ind[A_STR]]; int range = MIN(((str + 20) * 10) / weight, 10); ranged_attack attack = make_ranged_throw; /* Make sure the player isn't throwing wielded items */ if (item >= INVEN_WIELD && item < QUIVER_START) { msg("You have cannot throw wielded items."); return; } /* Check the item being thrown is usable by the player. */ if (!item_is_available(item, NULL, (USE_EQUIP | USE_INVEN | USE_FLOOR))) { msg("That item is not within your reach."); return; } ranged_helper(item, dir, range, shots, attack); } /** * Front-end 'throw' command. */ void textui_cmd_throw(void) { int item, dir; const char *q, *s; /* Get an item */ q = "Throw which item? "; s = "You have nothing to throw."; if (!get_item(&item, q, s, CMD_THROW, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return; if (item >= INVEN_WIELD && item < QUIVER_START) { msg("You cannot throw wielded items."); return; } /* Get a direction (or cancel) */ if (!get_aim_dir(&dir)) return; cmd_insert(CMD_THROW); cmd_set_arg_item(cmd_get_top(), 0, item); cmd_set_arg_target(cmd_get_top(), 1, dir); } /** * Front-end command which fires at the nearest target with default ammo. */ void textui_cmd_fire_at_nearest(void) { /* the direction '5' means 'use the target' */ int i, dir = 5, item = -1; /* Require a usable launcher */ if (!p_ptr->inventory[INVEN_BOW].tval || !p_ptr->state.ammo_tval) { msg("You have nothing to fire with."); return; } /* Find first eligible ammo in the quiver */ for (i = QUIVER_START; i < QUIVER_END; i++) { if (p_ptr->inventory[i].tval != p_ptr->state.ammo_tval) continue; item = i; break; } /* Require usable ammo */ if (item < 0) { msg("You have no ammunition in the quiver to fire."); return; } /* Require foe */ if (!target_set_closest(TARGET_KILL | TARGET_QUIET)) return; /* Fire! */ cmd_insert(CMD_FIRE); cmd_set_arg_item(cmd_get_top(), 0, item); cmd_set_arg_target(cmd_get_top(), 1, dir); } angband-3.5.1/src/cave.h0000644000175000017500000003000312456456606014312 0ustar chriscchrisc/* cave.h - cave interface */ #ifndef CAVE_H #define CAVE_H #include "defines.h" #include "z-type.h" struct player; struct monster; /*** Constants ***/ /*** Feature Indexes (see "lib/edit/terrain.txt") ***/ /* Nothing */ #define FEAT_NONE 0x00 /* Various */ #define FEAT_FLOOR 0x01 #define FEAT_INVIS 0x02 #define FEAT_GLYPH 0x03 #define FEAT_OPEN 0x04 #define FEAT_BROKEN 0x05 #define FEAT_LESS 0x06 #define FEAT_MORE 0x07 /* Shops */ #define FEAT_SHOP_HEAD 0x08 #define FEAT_SHOP_TAIL 0x0F /* Traps */ #define FEAT_TRAP_HEAD 0x10 #define FEAT_TRAP_TAIL 0x1F /* Doors */ #define FEAT_DOOR_HEAD 0x20 #define FEAT_DOOR_TAIL 0x2F /* Secret door */ #define FEAT_SECRET 0x30 /* Rubble */ #define FEAT_RUBBLE 0x31 /* Mineral seams */ #define FEAT_MAGMA 0x32 #define FEAT_QUARTZ 0x33 #define FEAT_MAGMA_H 0x34 #define FEAT_QUARTZ_H 0x35 #define FEAT_MAGMA_K 0x36 #define FEAT_QUARTZ_K 0x37 /* Walls */ #define FEAT_WALL_EXTRA 0x38 #define FEAT_WALL_INNER 0x39 #define FEAT_WALL_OUTER 0x3A #define FEAT_WALL_SOLID 0x3B #define FEAT_PERM_EXTRA 0x3C #define FEAT_PERM_INNER 0x3D #define FEAT_PERM_OUTER 0x3E #define FEAT_PERM_SOLID 0x3F /* * Special cave grid flags */ #define CAVE_MARK 0x01 /* memorized feature */ #define CAVE_GLOW 0x02 /* self-illuminating */ #define CAVE_VAULT 0x04 /* part of a vault */ #define CAVE_ROOM 0x08 /* part of a room */ #define CAVE_SEEN 0x10 /* seen flag */ #define CAVE_VIEW 0x20 /* view flag */ #define CAVE_WASSEEN 0x40 /* previously seen (during update) */ #define CAVE_WALL 0x80 /* wall flag */ #define CAVE2_DTRAP 0x01 /* trap detected grid */ #define CAVE2_FEEL 0x02 /* hidden points to trigger feelings*/ #define CAVE2_DEDGE 0x04 /* border of trap detected area */ #define CAVE2_VERT 0x08 /* use an alternate visual for this grid */ /* * Terrain flags */ enum { FF_NONE, FF_PWALK, FF_PPASS, FF_MWALK, FF_MPASS, FF_LOOK, FF_DIG, FF_DOOR, FF_EXIT_UP, FF_EXIT_DOWN, FF_PERM, FF_TRAP, FF_SHOP, FF_HIDDEN, FF_BORING, FF_MAX }; #define FF_SIZE FLAG_SIZE(FF_MAX) #define ff_has(f, flag) flag_has_dbg(f, FF_SIZE, flag, #f, #flag) #define ff_next(f, flag) flag_next(f, FF_SIZE, flag) #define ff_is_empty(f) flag_is_empty(f, FF_SIZE) #define ff_is_full(f) flag_is_full(f, FF_SIZE) #define ff_is_inter(f1, f2) flag_is_inter(f1, f2, FF_SIZE) #define ff_is_subset(f1, f2) flag_is_subset(f1, f2, FF_SIZE) #define ff_is_equal(f1, f2) flag_is_equal(f1, f2, FF_SIZE) #define ff_on(f, flag) flag_on_dbg(f, FF_SIZE, flag, #f, #flag) #define ff_off(f, flag) flag_off(f, FF_SIZE, flag) #define ff_wipe(f) flag_wipe(f, FF_SIZE) #define ff_setall(f) flag_setall(f, FF_SIZE) #define ff_negate(f) flag_negate(f, FF_SIZE) #define ff_copy(f1, f2) flag_copy(f1, f2, FF_SIZE) #define ff_union(f1, f2) flag_union(f1, f2, FF_SIZE) #define ff_comp_union(f1, f2) flag_comp_union(f1, f2, FF_SIZE) #define ff_inter(f1, f2) flag_inter(f1, f2, FF_SIZE) #define ff_diff(f1, f2) flag_diff(f1, f2, FF_SIZE) /** * Information about terrain features. * * At the moment this isn't very much, but eventually a primitive flag-based * information system will be used here. */ typedef struct feature { char *name; int fidx; struct feature *next; byte mimic; /**< Feature to mimic */ byte priority; /**< Display priority */ byte locked; /**< How locked is it? */ byte jammed; /**< How jammed is it? */ byte shopnum; /**< Which shop does it take you to? */ byte dig; /**< How hard is it to dig through? */ u32b effect; /**< Effect on entry to grid */ bitflag flags[FF_SIZE]; /**< Terrain flags */ byte d_attr; /**< Default feature attribute */ wchar_t d_char; /**< Default feature character */ byte x_attr[4]; /**< Desired feature attribute (set by user/pref file) */ wchar_t x_char[4]; /**< Desired feature character (set by user/pref file) */ } feature_type; enum grid_light_level { FEAT_LIGHTING_LOS = 0, /* line of sight */ FEAT_LIGHTING_TORCH, /* torchlight */ FEAT_LIGHTING_LIT, /* permanently lit (when not in line of sight) */ FEAT_LIGHTING_DARK, /* dark */ FEAT_LIGHTING_MAX }; typedef struct { u32b m_idx; /* Monster index */ u32b f_idx; /* Feature index */ struct object_kind *first_kind; /* The "kind" of the first item on the grid */ bool multiple_objects; /* Is there more than one item there? */ bool unseen_object; /* Is there an unaware object there? */ bool unseen_money; /* Is there some unaware money there? */ enum grid_light_level lighting; /* Light level */ bool in_view; /* TRUE when the player can currently see the grid. */ bool is_player; bool hallucinate; bool trapborder; } grid_data; /** An array of 256 bytes */ typedef byte byte_256[256]; /** An array of DUNGEON_WID bytes */ typedef byte byte_wid[DUNGEON_WID]; /** An array of DUNGEON_WID s16b's */ typedef s16b s16b_wid[DUNGEON_WID]; struct cave { s32b created_at; int depth; byte feeling; u32b obj_rating; u32b mon_rating; bool good_item; int height; int width; u16b feeling_squares; /* Keep track of how many feeling squares the player has visited */ byte (*info)[256]; byte (*info2)[256]; byte (*feat)[DUNGEON_WID]; byte (*cost)[DUNGEON_WID]; byte (*when)[DUNGEON_WID]; s16b (*m_idx)[DUNGEON_WID]; s16b (*o_idx)[DUNGEON_WID]; struct monster *monsters; int mon_max; int mon_cnt; }; extern int distance(int y1, int x1, int y2, int x2); extern bool los(int y1, int x1, int y2, int x2); extern bool no_light(void); extern bool cave_valid_bold(int y, int x); extern byte get_color(byte a, int attr, int n); extern void map_info(unsigned x, unsigned y, grid_data *g); extern void grid_data_as_text(grid_data *g, int *ap, wchar_t *cp, int *tap, wchar_t *tcp); extern void move_cursor_relative(int y, int x); extern void print_rel(wchar_t c, byte a, int y, int x); extern void prt_map(void); extern void display_map(int *cy, int *cx); extern void do_cmd_view_map(void); extern void forget_view(struct cave *c); extern void update_view(struct cave *c, struct player *p); extern void map_area(void); extern void wiz_light(bool full); extern void wiz_dark(void); extern int project_path(u16b *gp, int range, int y1, int x1, int y2, int x2, int flg); extern bool projectable(int y1, int x1, int y2, int x2, int flg); extern void scatter(int *yp, int *xp, int y, int x, int d, bool need_los); extern void disturb(struct player *p, int stop_search, int unused_flag); extern bool is_quest(int level); extern bool dtrap_edge(int y, int x); /* XXX: temporary while I refactor */ extern struct cave *cave; extern struct cave *cave_new(void); extern void cave_free(struct cave *c); extern struct feature *cave_feat(struct cave *c, int y, int x); extern void cave_set_feat(struct cave *c, int y, int x, int feat); extern void cave_note_spot(struct cave *c, int y, int x); extern void cave_light_spot(struct cave *c, int y, int x); extern void cave_update_flow(struct cave *c); extern void cave_forget_flow(struct cave *c); extern void cave_illuminate(struct cave *c, bool daytime); /** * cave_predicate is a function pointer which tests a given square to * see if the predicate in question is true. */ typedef bool (*cave_predicate)(struct cave *c, int y, int x); /* FEATURE PREDICATES */ extern bool cave_isfloor(struct cave *c, int y, int x); extern bool cave_isrock(struct cave *c, int y, int x); extern bool cave_isperm(struct cave *c, int y, int x); extern bool feat_is_magma(int feat); extern bool cave_ismagma(struct cave *c, int y, int x); extern bool feat_is_quartz(int feat); extern bool cave_isquartz(struct cave *c, int y, int x); extern bool cave_ismineral(struct cave *c, int y, int x); extern bool cave_hassecretvein(struct cave *c, int y, int x); extern bool cave_hasgoldvein(struct cave *c, int y, int x); extern bool feat_is_treasure(int feat); extern bool cave_issecretdoor(struct cave *c, int y, int x); extern bool cave_isopendoor(struct cave *c, int y, int x); extern bool cave_iscloseddoor(struct cave *c, int y, int x); extern bool cave_islockeddoor(struct cave *c, int y, int x); extern bool cave_isbrokendoor(struct cave *c, int y, int x); extern bool cave_isdoor(struct cave *c, int y, int x); extern bool cave_issecrettrap(struct cave *c, int y, int x); extern bool feat_is_known_trap(int feat); extern bool feat_is_wall(int feat); extern bool cave_isknowntrap(struct cave *c, int y, int x); extern bool cave_istrap(struct cave *c, int y, int x); extern bool feature_isshop(int feat); extern bool cave_isstairs(struct cave *c, int y, int x); extern bool cave_isupstairs(struct cave *c, int y, int x); extern bool cave_isdownstairs(struct cave *c, int y, int x); extern bool cave_isshop(struct cave *c, int y, int x); extern bool cave_isglyph(struct cave *c, int y, int x); /* BEHAVIOR PREDICATES */ extern bool cave_isopen(struct cave *c, int y, int x); extern bool cave_isempty(struct cave *c, int y, int x); extern bool cave_canputitem(struct cave *c, int y, int x); extern bool cave_isdiggable(struct cave *c, int y, int x); extern bool feat_ispassable(feature_type *f_ptr); extern bool feat_is_monster_walkable(feature_type *feature); extern bool cave_is_monster_walkable(struct cave *c, int y, int x); extern bool cave_ispassable(struct cave *c, int y, int x); extern bool cave_iswall(struct cave *c, int y, int x); extern bool cave_isstrongwall(struct cave *c, int y, int x); extern bool cave_isvault(struct cave *c, int y, int x); extern bool cave_isroom(struct cave *c, int y, int x); extern bool cave_isrubble(struct cave *c, int y, int x); extern bool cave_isfeel(struct cave *c, int y, int x); extern bool feat_isboring(feature_type *f_ptr); extern bool cave_isboring(struct cave *c, int y, int x); extern bool cave_isview(struct cave *c, int y, int x); extern bool cave_isseen(struct cave *c, int y, int x); extern bool cave_wasseen(struct cave *c, int y, int x); extern bool cave_isglow(struct cave *c, int y, int x); extern bool cave_iswarded(struct cave *c, int y, int x); extern bool cave_canward(struct cave *c, int y, int x); extern bool cave_seemslikewall(struct cave *c, int y, int x); /* interesting to memorize when mapping */ extern bool cave_isinteresting(struct cave *c, int y, int x); /* noticeable when running */ extern bool cave_noticeable(struct cave *c, int y, int x); /* Feature placers */ extern void cave_add_trap(struct cave *c, int y, int x); extern void cave_add_ward(struct cave *c, int y, int x); extern void cave_add_stairs(struct cave *c, int y, int x, int depth); extern void cave_add_door(struct cave *c, int y, int x, bool closed); extern void cave_remove_ward(struct cave *c, int y, int x); extern void cave_generate(struct cave *c, struct player *p); extern bool cave_in_bounds(struct cave *c, int y, int x); extern bool cave_in_bounds_fully(struct cave *c, int y, int x); extern struct monster *cave_monster(struct cave *c, int idx); extern struct monster *cave_monster_at(struct cave *c, int y, int x); extern int cave_monster_max(struct cave *c); extern int cave_monster_count(struct cave *c); void upgrade_mineral(struct cave *c, int y, int x); /* Feature modifiers */ int cave_door_power(struct cave *c, int y, int x); void cave_open_door(struct cave *c, int y, int x); void cave_close_door(struct cave *c, int y, int x); void cave_smash_door(struct cave *c, int y, int x); void cave_lock_door(struct cave *c, int y, int x, int power); void cave_unlock_door(struct cave *c, int y, int x); void cave_destroy_door(struct cave *c, int y, int x); void cave_show_trap(struct cave *c, int y, int x, int type); void cave_destroy_trap(struct cave *c, int y, int x); void cave_tunnel_wall(struct cave *c, int y, int x); void cave_destroy_wall(struct cave *c, int y, int x); void cave_show_vein(struct cave *c, int y, int x); /* destroy this cell, as destruction spell */ void cave_destroy(struct cave *c, int y, int x); void cave_earthquake(struct cave *c, int y, int x); int cave_shopnum(struct cave *c, int y, int x); const char *cave_apparent_name(struct cave *c, struct player *p, int y, int x); void cave_destroy_rubble(struct cave *c, int y, int x); void cave_force_floor(struct cave *c, int y, int x); #endif /* !CAVE_H */ angband-3.5.1/src/game-cmd.c0000644000175000017500000005072512456456606015056 0ustar chriscchrisc/* * File: game-cmd.c * Purpose: Handles the queueing of game commands. * * Copyright (c) 2008-9 Antony Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "cmds.h" #include "game-cmd.h" #include "object/object.h" #include "object/tvalsval.h" #include "spells.h" #include "target.h" errr (*cmd_get_hook)(cmd_context c, bool wait); #define CMD_QUEUE_SIZE 20 #define prev_cmd_idx(idx) ((idx + CMD_QUEUE_SIZE - 1) % CMD_QUEUE_SIZE) static int cmd_head = 0; static int cmd_tail = 0; static game_command cmd_queue[CMD_QUEUE_SIZE]; static bool repeat_prev_allowed = FALSE; static bool repeating = FALSE; /* A simple list of commands and their handling functions. */ struct command_info { cmd_code cmd; const char *verb; enum cmd_arg_type arg_type[CMD_MAX_ARGS]; cmd_handler_fn fn; bool repeat_allowed; int auto_repeat_n; }; static const struct command_info game_cmds[] = { { CMD_LOADFILE, "load a savefile", { arg_NONE }, NULL, FALSE, 0 }, { CMD_NEWGAME, "start a new game", { arg_NONE }, NULL, FALSE, 0 }, { CMD_BIRTH_RESET, "go back to the beginning", { arg_NONE }, NULL, FALSE, 0 }, { CMD_CHOOSE_SEX, "select sex", { arg_CHOICE }, NULL, FALSE, 0 }, { CMD_CHOOSE_RACE, "select race", { arg_CHOICE }, NULL, FALSE, 0 }, { CMD_CHOOSE_CLASS, "select class", { arg_CHOICE }, NULL, FALSE, 0 }, { CMD_FINALIZE_OPTIONS, "finalise options", { arg_CHOICE }, NULL, FALSE }, { CMD_BUY_STAT, "buy points in a stat", { arg_CHOICE }, NULL, FALSE, 0 }, { CMD_SELL_STAT, "sell points in a stat", { arg_CHOICE }, NULL, FALSE, 0 }, { CMD_RESET_STATS, "reset stats", { arg_CHOICE }, NULL, FALSE, 0 }, { CMD_ROLL_STATS, "roll new stats", { arg_NONE }, NULL, FALSE, 0 }, { CMD_PREV_STATS, "use previously rolled stats", { arg_NONE }, NULL, FALSE, 0 }, { CMD_NAME_CHOICE, "choose name", { arg_STRING }, NULL, FALSE, 0 }, { CMD_ACCEPT_CHARACTER, "accept character", { arg_NONE }, NULL, FALSE, 0 }, { CMD_GO_UP, "go up stairs", { arg_NONE }, do_cmd_go_up, FALSE, 0 }, { CMD_GO_DOWN, "go down stairs", { arg_NONE }, do_cmd_go_down, FALSE, 0 }, { CMD_SEARCH, "search", { arg_NONE }, do_cmd_search, TRUE, 10 }, { CMD_TOGGLE_SEARCH, "toggle search mode", { arg_NONE }, do_cmd_toggle_search, FALSE, 0 }, { CMD_WALK, "walk", { arg_DIRECTION }, do_cmd_walk, TRUE, 0 }, { CMD_RUN, "run", { arg_DIRECTION }, do_cmd_run, FALSE, 0 }, { CMD_JUMP, "jump", { arg_DIRECTION }, do_cmd_jump, FALSE, 0 }, { CMD_OPEN, "open", { arg_DIRECTION }, do_cmd_open, TRUE, 99 }, { CMD_CLOSE, "close", { arg_DIRECTION }, do_cmd_close, TRUE, 99 }, { CMD_TUNNEL, "tunnel", { arg_DIRECTION }, do_cmd_tunnel, TRUE, 99 }, { CMD_HOLD, "stay still", { arg_NONE }, do_cmd_hold, TRUE, 0 }, { CMD_DISARM, "disarm", { arg_DIRECTION }, do_cmd_disarm, TRUE, 99 }, { CMD_ALTER, "alter", { arg_DIRECTION }, do_cmd_alter, TRUE, 99 }, { CMD_REST, "rest", { arg_CHOICE }, do_cmd_rest, FALSE, 0 }, { CMD_PATHFIND, "walk", { arg_POINT }, do_cmd_pathfind, FALSE, 0 }, { CMD_PICKUP, "pickup", { arg_ITEM }, do_cmd_pickup, FALSE, 0 }, { CMD_AUTOPICKUP, "autopickup", { arg_NONE }, do_cmd_autopickup, FALSE, 0 }, { CMD_WIELD, "wear or wield", { arg_ITEM, arg_NUMBER }, do_cmd_wield, FALSE, 0 }, { CMD_TAKEOFF, "take off", { arg_ITEM }, do_cmd_takeoff, FALSE, 0 }, { CMD_DROP, "drop", { arg_ITEM, arg_NUMBER }, do_cmd_drop, FALSE, 0 }, { CMD_UNINSCRIBE, "un-inscribe", { arg_ITEM }, do_cmd_uninscribe, FALSE, 0 }, { CMD_EAT, "eat", { arg_ITEM }, do_cmd_use, FALSE, 0 }, { CMD_QUAFF, "quaff", { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_USE_ROD, "zap", { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_USE_STAFF, "use", { arg_ITEM }, do_cmd_use, FALSE, 0 }, { CMD_USE_WAND, "aim", { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_READ_SCROLL, "read", { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_ACTIVATE, "activate", { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_REFILL, "refuel with", { arg_ITEM }, do_cmd_refill, FALSE, 0 }, { CMD_FIRE, "fire", { arg_ITEM, arg_TARGET }, do_cmd_fire, FALSE, 0 }, { CMD_THROW, "throw", { arg_ITEM, arg_TARGET }, do_cmd_throw, FALSE, 0 }, { CMD_DESTROY, "ignore", { arg_ITEM }, do_cmd_destroy, FALSE, 0 }, { CMD_ENTER_STORE, "go into", { arg_NONE }, do_cmd_store, FALSE, 0 }, { CMD_INSCRIBE, "inscribe", { arg_ITEM, arg_STRING }, do_cmd_inscribe, FALSE, 0 }, { CMD_STUDY_SPELL, "study", { arg_CHOICE }, do_cmd_study_spell, FALSE, 0 }, { CMD_STUDY_BOOK, "study", { arg_ITEM }, do_cmd_study_book, FALSE, 0 }, { CMD_CAST, "cast", { arg_CHOICE, arg_TARGET }, do_cmd_cast, FALSE, 0 }, { CMD_SELL, "sell", { arg_ITEM, arg_NUMBER }, do_cmd_sell, FALSE, 0 }, { CMD_STASH, "stash", { arg_ITEM, arg_NUMBER }, do_cmd_stash, FALSE, 0 }, { CMD_BUY, "buy", { arg_CHOICE, arg_NUMBER }, do_cmd_buy, FALSE, 0 }, { CMD_RETRIEVE, "retrieve", { arg_CHOICE, arg_NUMBER }, do_cmd_retrieve, FALSE, 0 }, { CMD_USE_AIMED, "use", { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_USE_UNAIMED, "use", { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_USE_ANY, "use", { arg_ITEM, arg_TARGET }, do_cmd_use, FALSE, 0 }, { CMD_SUICIDE, "commit suicide", { arg_NONE }, do_cmd_suicide, FALSE, 0 }, { CMD_SAVE, "save", { arg_NONE }, do_cmd_save_game, FALSE, 0 }, { CMD_QUIT, "quit", { arg_NONE }, do_cmd_quit, FALSE, 0 }, { CMD_HELP, "help", { arg_NONE }, NULL, FALSE, 0 }, { CMD_REPEAT, "repeat", { arg_NONE }, NULL, FALSE, 0 }, }; /* Item selector type (everything required for get_item()) */ struct item_selector { cmd_code command; const char *type; bool (*filter)(const object_type *o_ptr); int mode; }; /** List of requirements for various commands' objects */ static struct item_selector item_selector[] = { { CMD_INSCRIBE, NULL, NULL, (USE_EQUIP | USE_INVEN | USE_FLOOR | IS_HARMLESS) }, { CMD_UNINSCRIBE, NULL, obj_has_inscrip, (USE_EQUIP | USE_INVEN | USE_FLOOR) }, { CMD_WIELD, NULL, obj_can_wear, (USE_INVEN | USE_FLOOR) }, { CMD_TAKEOFF, NULL, obj_can_takeoff, USE_EQUIP }, { CMD_DROP, NULL, NULL, (USE_EQUIP | USE_INVEN) }, { CMD_THROW, NULL, NULL, (USE_EQUIP | USE_INVEN | USE_FLOOR) }, { CMD_FIRE, NULL, obj_can_fire, (USE_INVEN | USE_EQUIP | USE_FLOOR | QUIVER_TAGS) }, { CMD_USE_STAFF, "staff", obj_is_staff, (USE_INVEN | USE_FLOOR | SHOW_FAIL) }, { CMD_USE_WAND, "wand", obj_is_wand, (USE_INVEN | USE_FLOOR | SHOW_FAIL) }, { CMD_USE_ROD, "rod", obj_is_rod, (USE_INVEN | USE_FLOOR | SHOW_FAIL) }, { CMD_ACTIVATE, NULL, obj_is_activatable, (USE_EQUIP | SHOW_FAIL) }, { CMD_EAT, "food", obj_is_food, (USE_INVEN | USE_FLOOR) }, { CMD_QUAFF, "potion", obj_is_potion, (USE_INVEN | USE_FLOOR) }, { CMD_READ_SCROLL, "scroll", obj_is_scroll, (USE_INVEN | USE_FLOOR) }, { CMD_REFILL, "fuel source", obj_can_refill, (USE_INVEN | USE_FLOOR) }, { CMD_USE_AIMED, NULL, obj_is_used_aimed, (USE_EQUIP |USE_INVEN | USE_FLOOR | SHOW_FAIL | QUIVER_TAGS) }, { CMD_USE_UNAIMED, NULL, obj_is_used_unaimed, (USE_EQUIP |USE_INVEN | USE_FLOOR | SHOW_FAIL) }, { CMD_USE_ANY, NULL, obj_is_useable, (USE_EQUIP |USE_INVEN | USE_FLOOR | SHOW_FAIL | QUIVER_TAGS) }, }; const char *cmd_get_verb(cmd_code cmd) { size_t i; for (i = 0; i < N_ELEMENTS(game_cmds); i++) { if (game_cmds[i].cmd == cmd) return game_cmds[i].verb; } return NULL; } game_command *cmd_get_top(void) { return &cmd_queue[prev_cmd_idx(cmd_head)]; } /* * Insert the given command into the command queue. */ errr cmd_insert_s(game_command *cmd) { /* If queue full, return error */ if (cmd_head + 1 == cmd_tail) return 1; if (cmd_head + 1 == CMD_QUEUE_SIZE && cmd_tail == 0) return 1; /* Insert command into queue. */ if (cmd->command != CMD_REPEAT) { cmd_queue[cmd_head] = *cmd; } else { int cmd_prev = cmd_head - 1; if (!repeat_prev_allowed) return 1; /* If we're repeating a command, we duplicate the previous command in the next command "slot". */ if (cmd_prev < 0) cmd_prev = CMD_QUEUE_SIZE - 1; if (cmd_queue[cmd_prev].command != CMD_NULL) cmd_queue[cmd_head] = cmd_queue[cmd_prev]; } /* Advance point in queue, wrapping around at the end */ cmd_head++; if (cmd_head == CMD_QUEUE_SIZE) cmd_head = 0; return 0; } /* * Get the next game command, with 'wait' indicating whether we * are prepared to wait for a command or require a quick return with * no command. */ errr cmd_get(cmd_context c, game_command **cmd, bool wait) { /* If we're repeating, just pull the last command again. */ if (repeating) { *cmd = &cmd_queue[prev_cmd_idx(cmd_tail)]; return 0; } /* If there are no commands queued, ask the UI for one. */ if (cmd_head == cmd_tail) cmd_get_hook(c, wait); /* If we have a command ready, set it and return success. */ if (cmd_head != cmd_tail) { *cmd = &cmd_queue[cmd_tail++]; if (cmd_tail == CMD_QUEUE_SIZE) cmd_tail = 0; return 0; } /* Failure to get a command. */ return 1; } /* Return the index of the given command in the command array. */ static int cmd_idx(cmd_code code) { size_t i; for (i = 0; i < N_ELEMENTS(game_cmds); i++) { if (game_cmds[i].cmd == code) return i; } return -1; } void cmd_set_arg_choice(game_command *cmd, int n, int choice) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_CHOICE); cmd->arg[n].choice = choice; cmd->arg_type[n] = arg_CHOICE; cmd->arg_present[n] = TRUE; } void cmd_set_arg_string(game_command *cmd, int n, const char *str) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_STRING); cmd->arg[n].string = string_make(str); cmd->arg_type[n] = arg_STRING; cmd->arg_present[n] = TRUE; } void cmd_set_arg_direction(game_command *cmd, int n, int dir) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_DIRECTION); cmd->arg[n].direction = dir; cmd->arg_type[n] = arg_DIRECTION; cmd->arg_present[n] = TRUE; } void cmd_set_arg_target(game_command *cmd, int n, int target) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_TARGET); cmd->arg[n].direction = target; cmd->arg_type[n] = arg_TARGET; cmd->arg_present[n] = TRUE; } void cmd_set_arg_point(game_command *cmd, int n, int x, int y) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_POINT); cmd->arg[n].point.x = x; cmd->arg[n].point.y = y; cmd->arg_type[n] = arg_POINT; cmd->arg_present[n] = TRUE; } void cmd_set_arg_item(game_command *cmd, int n, int item) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_ITEM); cmd->arg[n].item = item; cmd->arg_type[n] = arg_ITEM; cmd->arg_present[n] = TRUE; } void cmd_set_arg_number(game_command *cmd, int n, int num) { int idx = cmd_idx(cmd->command); assert(n <= CMD_MAX_ARGS); assert(game_cmds[idx].arg_type[n] & arg_NUMBER); cmd->arg[n].number = num; cmd->arg_type[n] = arg_NUMBER; cmd->arg_present[n] = TRUE; } /* * Inserts a command in the queue to be carried out, with the given * number of repeats. */ errr cmd_insert_repeated(cmd_code c, int nrepeats) { game_command cmd = { 0 }; if (cmd_idx(c) == -1) return 1; cmd.command = c; cmd.nrepeats = nrepeats; return cmd_insert_s(&cmd); } /* * Inserts a command in the queue to be carried out. */ errr cmd_insert(cmd_code c) { return cmd_insert_repeated(c, 0); } /* * Request a game command from the uI and carry out whatever actions * go along with it. */ void process_command(cmd_context ctx, bool no_request) { game_command *cmd; /* Reset so that when selecting items, we look in the default location */ p_ptr->command_wrk = 0; /* If we've got a command to process, do it. */ if (cmd_get(ctx, &cmd, !no_request) == 0) { int oldrepeats = cmd->nrepeats; int idx = cmd_idx(cmd->command); size_t i; bool allow_5 = FALSE; if (idx == -1) return; for (i = 0; i < N_ELEMENTS(item_selector); i++) { struct item_selector *is = &item_selector[i]; if (is->command != cmd->command) continue; if (!cmd->arg_present[0]) { int item; const char *verb = game_cmds[idx].verb; const char *type = is->type; const char *type2 = is->type; char prompt[1024], none[1024]; char capitalVerb[256]; /* Pluralise correctly or things look weird */ if (!type) { type = "item"; type2 = "items"; } my_strcpy(capitalVerb, verb, sizeof(capitalVerb)); my_strcap(capitalVerb); strnfmt(prompt, sizeof(prompt), "%s which %s?", capitalVerb, type); strnfmt(none, sizeof(none), "You have no %s you can %s.", type2, verb); item_tester_hook = is->filter; if (cmd->command == CMD_USE_ANY) p_ptr->command_wrk = USE_INVEN; if (!get_item(&item, prompt, none, cmd->command, is->mode)) return; cmd_set_arg_item(cmd, 0, item); } } /* XXX avoid dead objects from being re-used on repeat. * this needs to be expanded into a general safety-check * on args */ if ((game_cmds[idx].arg_type[0] == arg_ITEM) && cmd->arg_present[0]) { object_type *o_ptr = object_from_item_idx(cmd->arg[0].item); if (!o_ptr->kind) return; } /* Do some sanity checking on those arguments that might have been declared as "unknown", such as directions and targets. */ switch (cmd->command) { case CMD_INSCRIBE: { char o_name[80]; char tmp[80] = ""; object_type *o_ptr = object_from_item_idx(cmd->arg[0].item); object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); msg("Inscribing %s.", o_name); message_flush(); /* Use old inscription */ if (o_ptr->note) strnfmt(tmp, sizeof(tmp), "%s", quark_str(o_ptr->note)); /* Get a new inscription (possibly empty) */ if (!get_string("Inscription: ", tmp, sizeof(tmp))) return; cmd_set_arg_string(cmd, 1, tmp); break; } case CMD_OPEN: { if (!cmd->arg_present[0] || cmd->arg[0].direction == DIR_UNKNOWN) { int y, x; int n_closed_doors, n_locked_chests; n_closed_doors = count_feats(&y, &x, cave_iscloseddoor, FALSE); n_locked_chests = count_chests(&y, &x, CHEST_OPENABLE); if (n_closed_doors + n_locked_chests == 1) cmd_set_arg_direction(cmd, 0, coords_to_dir(y, x)); } goto get_dir; } case CMD_CLOSE: { if (!cmd->arg_present[0] || cmd->arg[0].direction == DIR_UNKNOWN) { int y, x; /* Count open doors */ if (count_feats(&y, &x, cave_isopendoor, FALSE) == 1) cmd_set_arg_direction(cmd, 0, coords_to_dir(y, x)); } goto get_dir; } case CMD_DISARM: { if (!cmd->arg_present[0] || cmd->arg[0].direction == DIR_UNKNOWN) { int y, x; int n_visible_traps, n_trapped_chests; n_visible_traps = count_feats(&y, &x, cave_isknowntrap, TRUE); n_trapped_chests = count_chests(&y, &x, CHEST_TRAPPED); if (n_visible_traps + n_trapped_chests == 1) cmd_set_arg_direction(cmd, 0, coords_to_dir(y, x)); /* If there are chests to disarm, allow 5 as a direction */ allow_5 = (n_trapped_chests > 0); } goto get_dir; } case CMD_TUNNEL: case CMD_WALK: case CMD_RUN: case CMD_JUMP: case CMD_ALTER: { get_dir: /* Direction hasn't been specified, so we ask for one. */ if (!cmd->arg_present[0] || cmd->arg[0].direction == DIR_UNKNOWN) { int dir; if (!get_rep_dir(&dir, allow_5)) return; cmd_set_arg_direction(cmd, 0, dir); } break; } case CMD_DROP: case CMD_STASH: { if (!cmd->arg_present[1]) { object_type *o_ptr = object_from_item_idx(cmd->arg[0].item); int amt = get_quantity(NULL, o_ptr->number); if (amt <= 0) return; cmd_set_arg_number(cmd, 1, amt); } break; } /* * These take an item number and a "target" as arguments, * though a target isn't always actually needed, so we'll * only prompt for it via callback if the item being used needs it. */ case CMD_USE_WAND: case CMD_USE_ROD: case CMD_QUAFF: case CMD_ACTIVATE: case CMD_READ_SCROLL: case CMD_FIRE: case CMD_THROW: case CMD_USE_ANY: case CMD_USE_AIMED: case CMD_USE_UNAIMED: { bool get_target = FALSE; object_type *o_ptr = object_from_item_idx(cmd->arg[0].choice); /* If we couldn't resolve the item, then abort this */ if (!o_ptr->kind) break; /* Thrown objects always need an aim, others might, depending * on the object */ if (obj_needs_aim(o_ptr) || cmd->command == CMD_THROW) { if (!cmd->arg_present[1]) get_target = TRUE; if (cmd->arg[1].direction == DIR_UNKNOWN) get_target = TRUE; if (cmd->arg[1].direction == DIR_TARGET && !target_okay()) get_target = TRUE; } if (get_target && !get_aim_dir(&cmd->arg[1].direction)) return; player_confuse_dir(p_ptr, &cmd->arg[1].direction, FALSE); cmd->arg_present[1] = TRUE; break; } /* This takes a choice and a direction. */ case CMD_CAST: { bool get_target = FALSE; if (spell_needs_aim(p_ptr->class->spell_book, cmd->arg[0].choice)) { if (!cmd->arg_present[1]) get_target = TRUE; if (cmd->arg[1].direction == DIR_UNKNOWN) get_target = TRUE; if (cmd->arg[1].direction == DIR_TARGET && !target_okay()) get_target = TRUE; } if (get_target && !get_aim_dir(&cmd->arg[1].direction)) return; player_confuse_dir(p_ptr, &cmd->arg[1].direction, FALSE); cmd->arg_present[1] = TRUE; break; } case CMD_WIELD: { object_type *o_ptr = object_from_item_idx(cmd->arg[0].choice); int slot = wield_slot(o_ptr); /* Usually if the slot is taken we'll just replace the item in the slot, * but in some cases we need to ask the user which slot they actually * want to replace */ if (p_ptr->inventory[slot].kind) { if (o_ptr->tval == TV_RING) { const char *q = "Replace which ring? "; const char *s = "Error in obj_wield, please report"; item_tester_hook = obj_is_ring; if (!get_item(&slot, q, s, CMD_WIELD, USE_EQUIP)) return; } if (obj_is_ammo(o_ptr) && !object_similar(&p_ptr->inventory[slot], o_ptr, OSTACK_QUIVER)) { const char *q = "Replace which ammunition? "; const char *s = "Error in obj_wield, please report"; item_tester_hook = obj_is_ammo; if (!get_item(&slot, q, s, CMD_WIELD, USE_EQUIP)) return; } } /* Set relevant slot */ cmd_set_arg_number(cmd, 1, slot); break; } default: { /* I can see the point of the compiler warning, but still... */ break; } } /* Command repetition */ if (game_cmds[idx].repeat_allowed) { /* Auto-repeat only if there isn't already a repeat length. */ if (game_cmds[idx].auto_repeat_n > 0 && cmd->nrepeats == 0) cmd_set_repeat(game_cmds[idx].auto_repeat_n); } else { cmd->nrepeats = 0; repeating = FALSE; } /* * The command gets to unset this if it isn't appropriate for * the user to repeat it. */ repeat_prev_allowed = TRUE; if (game_cmds[idx].fn) game_cmds[idx].fn(cmd->command, cmd->arg); /* If the command hasn't changed nrepeats, count this execution. */ if (cmd->nrepeats > 0 && oldrepeats == cmd_get_nrepeats()) cmd_set_repeat(oldrepeats - 1); } } /* * Remove any pending repeats from the current command. */ void cmd_cancel_repeat(void) { game_command *cmd = &cmd_queue[prev_cmd_idx(cmd_tail)]; if (cmd->nrepeats || repeating) { /* Cancel */ cmd->nrepeats = 0; repeating = FALSE; /* Redraw the state (later) */ p_ptr->redraw |= (PR_STATE); } } /* * Update the number of repeats pending for the current command. */ void cmd_set_repeat(int nrepeats) { game_command *cmd = &cmd_queue[prev_cmd_idx(cmd_tail)]; cmd->nrepeats = nrepeats; if (nrepeats) repeating = TRUE; else repeating = FALSE; /* Redraw the state (later) */ p_ptr->redraw |= (PR_STATE); } /* * Return the number of repeats pending for the current command. */ int cmd_get_nrepeats(void) { game_command *cmd = &cmd_queue[prev_cmd_idx(cmd_tail)]; return cmd->nrepeats; } /* * Do not allow the current command to be repeated by the user using the * "repeat last command" command. */ void cmd_disable_repeat(void) { repeat_prev_allowed = FALSE; } angband-3.5.1/src/ui-birth.c0000644000175000017500000006615112456456606015127 0ustar chriscchrisc/* * File: ui-birth.c * Purpose: Text-based user interface for character creation * * Copyright (c) 1987 - 2007 Angband contributors * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "files.h" #include "game-cmd.h" #include "game-event.h" #include "object/tvalsval.h" #include "ui-birth.h" #include "ui-menu.h" #include "ui-options.h" /* * Overview * ======== * This file implements the user interface side of the birth process * for the classic terminal-based UI of Angband. * * It models birth as a series of steps which must be carried out in * a specified order, with the option of stepping backwards to revisit * past choices. * * It starts when we receive the EVENT_ENTER_BIRTH event from the game, * and ends when we receive the EVENT_LEAVE_BIRTH event. In between, * we will repeatedly be asked to supply a game command, which change * the state of the character being rolled. Once the player is happy * with their character, we send the CMD_ACCEPT_CHARACTER command. */ /* A local-to-this-file global to hold the most important bit of state between calls to the game proper. Probably not strictly necessary, but reduces complexity a bit. */ enum birth_stage { BIRTH_BACK = -1, BIRTH_RESET = 0, BIRTH_QUICKSTART, BIRTH_SEX_CHOICE, BIRTH_RACE_CHOICE, BIRTH_CLASS_CHOICE, BIRTH_ROLLER_CHOICE, BIRTH_POINTBASED, BIRTH_ROLLER, BIRTH_NAME_CHOICE, BIRTH_FINAL_CONFIRM, BIRTH_COMPLETE }; enum birth_questions { BQ_METHOD = 0, BQ_SEX, BQ_RACE, BQ_CLASS, BQ_ROLLER, MAX_BIRTH_QUESTIONS }; enum birth_rollers { BR_POINTBASED = 0, BR_NORMAL, MAX_BIRTH_ROLLERS }; static void point_based_start(void); static bool quickstart_allowed = FALSE; /* ------------------------------------------------------------------------ * Quickstart? screen. * ------------------------------------------------------------------------ */ static enum birth_stage get_quickstart_command(void) { const char *prompt = "['Y' to use this character, 'N' to start afresh, 'C' to change name]"; enum birth_stage next = BIRTH_QUICKSTART; /* Prompt for it */ prt("New character based on previous one:", 0, 0); prt(prompt, Term->hgt - 1, Term->wid / 2 - strlen(prompt) / 2); do { /* Get a key */ struct keypress ke = inkey(); if (ke.code == 'N' || ke.code == 'n') { cmd_insert(CMD_BIRTH_RESET); next = BIRTH_SEX_CHOICE; } else if (ke.code == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } else if (ke.code == 'C' || ke.code == 'c') { next = BIRTH_NAME_CHOICE; } else if (ke.code == 'Y' || ke.code == 'y') { cmd_insert(CMD_ACCEPT_CHARACTER); next = BIRTH_COMPLETE; } } while (next == BIRTH_QUICKSTART); /* Clear prompt */ clear_from(23); return next; } /* ------------------------------------------------------------------------ * The various "menu" bits of the birth process - namely choice of sex, * race, class, and roller type. * ------------------------------------------------------------------------ */ /* The various menus */ static menu_type sex_menu, race_menu, class_menu, roller_menu; /* Locations of the menus, etc. on the screen */ #define HEADER_ROW 1 #define QUESTION_ROW 7 #define TABLE_ROW 9 #define QUESTION_COL 2 #define SEX_COL 2 #define RACE_COL 14 #define RACE_AUX_COL 29 #define CLASS_COL 29 #define CLASS_AUX_COL 43 #define ROLLER_COL 43 #define MENU_ROWS TABLE_ROW + 14 /* upper left column and row, width, and lower column */ static region gender_region = {SEX_COL, TABLE_ROW, 14, MENU_ROWS}; static region race_region = {RACE_COL, TABLE_ROW, 14, MENU_ROWS}; static region class_region = {CLASS_COL, TABLE_ROW, 14, MENU_ROWS}; static region roller_region = {ROLLER_COL, TABLE_ROW, 28, MENU_ROWS}; /* We use different menu "browse functions" to display the help text sometimes supplied with the menu items - currently just the list of bonuses, etc, corresponding to each race and class. */ typedef void (*browse_f) (int oid, void *db, const region *l); /* We have one of these structures for each menu we display - it holds the useful information for the menu - text of the menu items, "help" text, current (or default) selection, and whether random selection is allowed. */ struct birthmenu_data { const char **items; const char *hint; bool allow_random; }; /* A custom "display" function for our menus that simply displays the text from our stored data in a different colour if it's currently selected. */ static void birthmenu_display(menu_type *menu, int oid, bool cursor, int row, int col, int width) { struct birthmenu_data *data = menu->menu_data; byte attr = curs_attrs[CURS_KNOWN][0 != cursor]; c_put_str(attr, data->items[oid], row, col); } /* Our custom menu iterator, only really needed to allow us to override the default handling of "commands" in the standard iterators (hence only defining the display and handler parts). */ static const menu_iter birth_iter = { NULL, NULL, birthmenu_display, NULL, NULL }; static void skill_help(const s16b r_skills[], const s16b c_skills[], int mhp, int exp, int infra) { s16b skills[SKILL_MAX]; unsigned i; for (i = 0; i < SKILL_MAX ; ++i) skills[i] = (r_skills ? r_skills[i] : 0 ) + (c_skills ? c_skills[i] : 0); text_out_e("Hit/Shoot/Throw: %+d/%+d/%+d\n", skills[SKILL_TO_HIT_MELEE], skills[SKILL_TO_HIT_BOW], skills[SKILL_TO_HIT_THROW]); text_out_e("Hit die: %2d XP mod: %d%%\n", mhp, exp); text_out_e("Disarm: %+3d Devices: %+3d\n", skills[SKILL_DISARM], skills[SKILL_DEVICE]); text_out_e("Save: %+3d Stealth: %+3d\n", skills[SKILL_SAVE], skills[SKILL_STEALTH]); if (infra >= 0) text_out_e("Infravision: %d ft\n", infra * 10); text_out_e("Digging: %+d\n", skills[SKILL_DIGGING]); text_out_e("Search: %+d/%d", skills[SKILL_SEARCH], skills[SKILL_SEARCH_FREQUENCY]); if (infra < 0) text_out_e("\n"); } static const char *get_flag_desc(bitflag flag) { switch (flag) { case OF_SUST_STR: return "Sustains strength"; case OF_SUST_DEX: return "Sustains dexterity"; case OF_SUST_CON: return "Sustains constitution"; case OF_RES_POIS: return "Resists poison"; case OF_RES_LIGHT: return "Resists light damage"; case OF_RES_DARK: return "Resists darkness damage"; case OF_RES_BLIND: return "Resists blindness"; case OF_HOLD_LIFE: return "Sustains experience"; case OF_FREE_ACT: return "Resists paralysis"; case OF_REGEN: return "Regenerates quickly"; case OF_SEE_INVIS: return "Sees invisible creatures"; default: return "Undocumented flag"; } } static const char *get_pflag_desc(bitflag flag) { switch (flag) { case PF_EXTRA_SHOT: return "Gains extra shots with bow"; case PF_BRAVERY_30: return "Gains immunity to fear"; case PF_BLESS_WEAPON: return "Prefers blunt/blessed weapons"; case PF_CUMBER_GLOVE: return NULL; case PF_ZERO_FAIL: return "Advanced spellcasting"; case PF_BEAM: return NULL; case PF_CHOOSE_SPELLS: return NULL; case PF_PSEUDO_ID_IMPROV: return NULL; case PF_KNOW_MUSHROOM: return "Identifies mushrooms"; case PF_KNOW_ZAPPER: return "Identifies magic devices"; case PF_SEE_ORE: return "Senses ore/minerals"; default: return "Undocumented pflag"; } } static void race_help(int i, void *db, const region *l) { int j; size_t k; struct player_race *r = player_id2race(i); int len = (A_MAX + 1) / 2; int n_flags = 0; int flag_space = 3; if (!r) return; /* Output to the screen */ text_out_hook = text_out_to_screen; /* Indent output */ text_out_indent = RACE_AUX_COL; Term_gotoxy(RACE_AUX_COL, TABLE_ROW); for (j = 0; j < len; j++) { const char *name = stat_names_reduced[j]; int adj = r->r_adj[j]; text_out_e("%s%+3d", name, adj); if (j*2 + 1 < A_MAX) { name = stat_names_reduced[j + len]; adj = r->r_adj[j + len]; text_out_e(" %s%+3d", name, adj); } text_out("\n"); } text_out_e("\n"); skill_help(r->r_skills, NULL, r->r_mhp, r->r_exp, r->infra); text_out_e("\n"); for (k = 0; k < OF_MAX; k++) { if (n_flags >= flag_space) break; if (!of_has(r->flags, k)) continue; text_out_e("\n%s", get_flag_desc(k)); n_flags++; } for (k = 0; k < PF_MAX; k++) { if (n_flags >= flag_space) break; if (!pf_has(r->pflags, k)) continue; text_out_e("\n%s", get_pflag_desc(k)); n_flags++; } while(n_flags < flag_space) { text_out_e("\n"); n_flags++; } /* Reset text_out() indentation */ text_out_indent = 0; } static void class_help(int i, void *db, const region *l) { int j; size_t k; struct player_class *c = player_id2class(i); const struct player_race *r = p_ptr->race; int len = (A_MAX + 1) / 2; int n_flags = 0; int flag_space = 5; if (!c) return; /* Output to the screen */ text_out_hook = text_out_to_screen; /* Indent output */ text_out_indent = CLASS_AUX_COL; Term_gotoxy(CLASS_AUX_COL, TABLE_ROW); for (j = 0; j < len; j++) { const char *name = stat_names_reduced[j]; int adj = c->c_adj[j] + r->r_adj[j]; text_out_e("%s%+3d", name, adj); if (j*2 + 1 < A_MAX) { name = stat_names_reduced[j + len]; adj = c->c_adj[j + len] + r->r_adj[j + len]; text_out_e(" %s%+3d", name, adj); } text_out("\n"); } text_out_e("\n"); skill_help(r->r_skills, c->c_skills, r->r_mhp + c->c_mhp, r->r_exp + c->c_exp, -1); if (c->spell_book == TV_MAGIC_BOOK) { text_out_e("\nLearns arcane magic"); } else if (c->spell_book == TV_PRAYER_BOOK) { text_out_e("\nLearns divine magic"); } for (k = 0; k < PF_MAX; k++) { const char *s; if (n_flags >= flag_space) break; if (!pf_has(c->pflags, k)) continue; s = get_pflag_desc(k); if (!s) continue; text_out_e("\n%s", s); n_flags++; } while(n_flags < flag_space) { text_out_e("\n"); n_flags++; } /* Reset text_out() indentation */ text_out_indent = 0; } /* Set up one of our menus ready to display choices for a birth question. This is slightly involved. */ static void init_birth_menu(menu_type *menu, int n_choices, int initial_choice, const region *reg, bool allow_random, browse_f aux) { struct birthmenu_data *menu_data; /* Initialise a basic menu */ menu_init(menu, MN_SKIN_SCROLL, &birth_iter); /* A couple of behavioural flags - we want selections letters in lower case and a double tap to act as a selection. */ menu->selections = lower_case; menu->flags = MN_DBL_TAP; /* Copy across the game's suggested initial selection, etc. */ menu->cursor = initial_choice; /* Allocate sufficient space for our own bits of menu information. */ menu_data = mem_alloc(sizeof *menu_data); /* Allocate space for an array of menu item texts and help texts (where applicable) */ menu_data->items = mem_alloc(n_choices * sizeof *menu_data->items); menu_data->allow_random = allow_random; /* Set private data */ menu_setpriv(menu, n_choices, menu_data); /* Set up the "browse" hook to display help text (where applicable). */ menu->browse_hook = aux; /* Lay out the menu appropriately */ menu_layout(menu, reg); } static void setup_menus(void) { int i, n; struct player_class *c; struct player_race *r; const char *roller_choices[MAX_BIRTH_ROLLERS] = { "Point-based", "Standard roller" }; struct birthmenu_data *mdata; /* Sex menu fairly straightforward */ init_birth_menu(&sex_menu, MAX_SEXES, p_ptr->psex, &gender_region, TRUE, NULL); mdata = sex_menu.menu_data; for (i = 0; i < MAX_SEXES; i++) mdata->items[i] = sex_info[i].title; mdata->hint = "Sex does not have any significant gameplay effects."; n = 0; for (r = races; r; r = r->next) n++; /* Race menu more complicated. */ init_birth_menu(&race_menu, n, p_ptr->race ? p_ptr->race->ridx : 0, &race_region, TRUE, race_help); mdata = race_menu.menu_data; for (i = 0, r = races; r; r = r->next, i++) mdata->items[r->ridx] = r->name; mdata->hint = "Race affects stats and skills, and may confer resistances and abilities."; n = 0; for (c = classes; c; c = c->next) n++; /* Class menu similar to race. */ init_birth_menu(&class_menu, n, p_ptr->class ? p_ptr->class->cidx : 0, &class_region, TRUE, class_help); mdata = class_menu.menu_data; for (i = 0, c = classes; c; c = c->next, i++) mdata->items[c->cidx] = c->name; mdata->hint = "Class affects stats, skills, and other character traits."; /* Roller menu straightforward again */ init_birth_menu(&roller_menu, MAX_BIRTH_ROLLERS, 0, &roller_region, FALSE, NULL); mdata = roller_menu.menu_data; for (i = 0; i < MAX_BIRTH_ROLLERS; i++) mdata->items[i] = roller_choices[i]; mdata->hint = "Choose how to generate your intrinsic stats. Point-based is recommended."; } /* Cleans up our stored menu info when we've finished with it. */ static void free_birth_menu(menu_type *menu) { struct birthmenu_data *data = menu->menu_data; if (data) { mem_free(data->items); mem_free(data); } } static void free_birth_menus(void) { /* We don't need these any more. */ free_birth_menu(&sex_menu); free_birth_menu(&race_menu); free_birth_menu(&class_menu); free_birth_menu(&roller_menu); } /* * Clear the previous question */ static void clear_question(void) { int i; for (i = QUESTION_ROW; i < TABLE_ROW; i++) { /* Clear line, position cursor */ Term_erase(0, i, 255); } } #define BIRTH_MENU_HELPTEXT \ "{light blue}Please select your character traits from the menus below:{/}\n\n" \ "Use the {light green}movement keys{/} to scroll the menu, " \ "{light green}Enter{/} to select the current menu item, '{light green}*{/}' " \ "for a random menu item, '{light green}ESC{/}' to step back through the " \ "birth process, '{light green}={/}' for the birth options, '{light green}?{/}' " \ "for help, or '{light green}Ctrl-X{/}' to quit." /* Show the birth instructions on an otherwise blank screen */ static void print_menu_instructions(void) { /* Clear screen */ Term_clear(); /* Output to the screen */ text_out_hook = text_out_to_screen; /* Indent output */ text_out_indent = QUESTION_COL; Term_gotoxy(QUESTION_COL, HEADER_ROW); /* Display some helpful information */ text_out_e(BIRTH_MENU_HELPTEXT); /* Reset text_out() indentation */ text_out_indent = 0; } /* Allow the user to select from the current menu, and return the corresponding command to the game. Some actions are handled entirely by the UI (displaying help text, for instance). */ static enum birth_stage menu_question(enum birth_stage current, menu_type *current_menu, cmd_code choice_command) { struct birthmenu_data *menu_data = menu_priv(current_menu); ui_event cx; enum birth_stage next = BIRTH_RESET; /* Print the question currently being asked. */ clear_question(); Term_putstr(QUESTION_COL, QUESTION_ROW, -1, TERM_YELLOW, menu_data->hint); current_menu->cmd_keys = "?=*\x18"; /* ?, =, *, */ while (next == BIRTH_RESET) { /* Display the menu, wait for a selection of some sort to be made. */ cx = menu_select(current_menu, EVT_KBRD, FALSE); /* As all the menus are displayed in "hierarchical" style, we allow use of "back" (left arrow key or equivalent) to step back in the proces as well as "escape". */ if (cx.type == EVT_ESCAPE) { next = BIRTH_BACK; } else if (cx.type == EVT_SELECT) { if (current == BIRTH_ROLLER_CHOICE) { cmd_insert(CMD_FINALIZE_OPTIONS); if (current_menu->cursor) { /* Do a first roll of the stats */ cmd_insert(CMD_ROLL_STATS); next = current + 2; } else { /* * Make sure we've got a point-based char to play with. * We call point_based_start here to make sure we get * an update on the points totals before trying to * display the screen. The call to CMD_RESET_STATS * forces a rebuying of the stats to give us up-to-date * totals. This is, it should go without saying, a hack. */ point_based_start(); cmd_insert(CMD_RESET_STATS); cmd_set_arg_choice(cmd_get_top(), 0, TRUE); next = current + 1; } } else { cmd_insert(choice_command); cmd_set_arg_choice(cmd_get_top(), 0, current_menu->cursor); next = current + 1; } } else if (cx.type == EVT_KBRD) { /* '*' chooses an option at random from those the game's provided. */ if (cx.key.code == '*' && menu_data->allow_random) { current_menu->cursor = randint0(current_menu->count); cmd_insert(choice_command); cmd_set_arg_choice(cmd_get_top(), 0, current_menu->cursor); menu_refresh(current_menu, FALSE); next = current + 1; } else if (cx.key.code == '=') { do_cmd_options_birth(); next = current; } else if (cx.key.code == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } else if (cx.key.code == '?') { do_cmd_help(); } } } return next; } /* ------------------------------------------------------------------------ * The rolling bit of the roller. * ------------------------------------------------------------------------ */ static enum birth_stage roller_command(bool first_call) { char prompt[80] = ""; size_t promptlen = 0; struct keypress ch; enum birth_stage next = BIRTH_ROLLER; /* Used to keep track of whether we've rolled a character before or not. */ static bool prev_roll = FALSE; /* Display the player - a bit cheaty, but never mind. */ display_player(0); if (first_call) prev_roll = FALSE; /* Prepare a prompt (must squeeze everything in) */ strnfcat(prompt, sizeof (prompt), &promptlen, "['r' to reroll"); if (prev_roll) strnfcat(prompt, sizeof(prompt), &promptlen, ", 'p' for previous roll"); strnfcat(prompt, sizeof (prompt), &promptlen, " or 'Enter' to accept]"); /* Prompt for it */ prt(prompt, Term->hgt - 1, Term->wid / 2 - promptlen / 2); /* Prompt and get a command */ ch = inkey(); if (ch.code == ESCAPE) { next = BIRTH_BACK; } /* 'Enter' accepts the roll */ if (ch.code == KC_ENTER) { next = BIRTH_NAME_CHOICE; } /* Reroll this character */ else if ((ch.code == ' ') || (ch.code == 'r')) { cmd_insert(CMD_ROLL_STATS); prev_roll = TRUE; } /* Previous character */ else if (prev_roll && (ch.code == 'p')) { cmd_insert(CMD_PREV_STATS); } /* Quit */ else if (ch.code == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } /* Help XXX */ else if (ch.code == '?') { do_cmd_help(); } /* Nothing handled directly here */ else { bell("Illegal roller command!"); } return next; } /* ------------------------------------------------------------------------ * Point-based stat allocation. * ------------------------------------------------------------------------ */ /* The locations of the "costs" area on the birth screen. */ #define COSTS_ROW 2 #define COSTS_COL (42 + 32) #define TOTAL_COL (42 + 19) /* This is called whenever a stat changes. We take the easy road, and just redisplay them all using the standard function. */ static void point_based_stats(game_event_type type, game_event_data *data, void *user) { display_player_stat_info(); } /* This is called whenever any of the other miscellaneous stat-dependent things changed. We are hooked into changes in the amount of gold in this case, but redisplay everything because it's easier. */ static void point_based_misc(game_event_type type, game_event_data *data, void *user) { display_player_xtra_info(); } /* This is called whenever the points totals are changed (in birth.c), so that we can update our display of how many points have been spent and are available. */ static void point_based_points(game_event_type type, game_event_data *data, void *user) { int i; int sum = 0; int *stats = data->birthstats.stats; /* Display the costs header */ put_str("Cost", COSTS_ROW - 1, COSTS_COL); /* Display the costs */ for (i = 0; i < A_MAX; i++) { /* Display cost */ put_str(format("%4d", stats[i]), COSTS_ROW + i, COSTS_COL); sum += stats[i]; } put_str(format("Total Cost: %2d/%2d", sum, data->birthstats.remaining + sum), COSTS_ROW + A_MAX, TOTAL_COL); } static void point_based_start(void) { const char *prompt = "[up/down to move, left/right to modify, 'r' to reset, 'Enter' to accept]"; /* Clear */ Term_clear(); /* Display the player */ display_player_xtra_info(); display_player_stat_info(); prt(prompt, Term->hgt - 1, Term->wid / 2 - strlen(prompt) / 2); /* Register handlers for various events - cheat a bit because we redraw the lot at once rather than each bit at a time. */ event_add_handler(EVENT_BIRTHPOINTS, point_based_points, NULL); event_add_handler(EVENT_STATS, point_based_stats, NULL); event_add_handler(EVENT_GOLD, point_based_misc, NULL); } static void point_based_stop(void) { event_remove_handler(EVENT_BIRTHPOINTS, point_based_points, NULL); event_remove_handler(EVENT_STATS, point_based_stats, NULL); event_remove_handler(EVENT_GOLD, point_based_misc, NULL); } static enum birth_stage point_based_command(void) { static int stat = 0; struct keypress ch; enum birth_stage next = BIRTH_POINTBASED; /* point_based_display();*/ /* Place cursor just after cost of current stat */ Term_gotoxy(COSTS_COL + 4, COSTS_ROW + stat); /* Get key */ ch = inkey(); if (ch.code == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } /* Go back a step, or back to the start of this step */ else if (ch.code == ESCAPE) { next = BIRTH_BACK; } else if (ch.code == 'r' || ch.code == 'R') { cmd_insert(CMD_RESET_STATS); cmd_set_arg_choice(cmd_get_top(), 0, FALSE); } /* Done */ else if (ch.code == KC_ENTER) { next = BIRTH_NAME_CHOICE; } else { int dir = target_dir(ch); /* Prev stat, looping round to the bottom when going off the top */ if (dir == 8) stat = (stat + A_MAX - 1) % A_MAX; /* Next stat, looping round to the top when going off the bottom */ if (dir == 2) stat = (stat + 1) % A_MAX; /* Decrease stat (if possible) */ if (dir == 4) { cmd_insert(CMD_SELL_STAT); cmd_set_arg_choice(cmd_get_top(), 0, stat); } /* Increase stat (if possible) */ if (dir == 6) { cmd_insert(CMD_BUY_STAT); cmd_set_arg_choice(cmd_get_top(), 0, stat); } } return next; } /* ------------------------------------------------------------------------ * Asking for the player's chosen name. * ------------------------------------------------------------------------ */ static enum birth_stage get_name_command(void) { enum birth_stage next; char name[32]; if (get_name(name, sizeof(name))) { cmd_insert(CMD_NAME_CHOICE); cmd_set_arg_string(cmd_get_top(), 0, name); next = BIRTH_FINAL_CONFIRM; } else { next = BIRTH_BACK; } return next; } /* ------------------------------------------------------------------------ * Final confirmation of character. * ------------------------------------------------------------------------ */ static enum birth_stage get_confirm_command(void) { const char *prompt = "['ESC' to step back, 'S' to start over, or any other key to continue]"; struct keypress ke; enum birth_stage next; /* Prompt for it */ prt(prompt, Term->hgt - 1, Term->wid / 2 - strlen(prompt) / 2); /* Get a key */ ke = inkey(); /* Start over */ if (ke.code == 'S' || ke.code == 's') { next = BIRTH_RESET; } else if (ke.code == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } else if (ke.code == ESCAPE) { next = BIRTH_BACK; } else { cmd_insert(CMD_ACCEPT_CHARACTER); next = BIRTH_COMPLETE; } /* Clear prompt */ clear_from(23); return next; } /* ------------------------------------------------------------------------ * Things that relate to the world outside this file: receiving game events * and being asked for game commands. * ------------------------------------------------------------------------ */ /* * This is called when we receive a request for a command in the birth * process. * The birth process continues until we send a final character confirmation * command (or quit), so this is effectively called in a loop by the main * game. * * We're imposing a step-based system onto the main game here, so we need * to keep track of where we're up to, where each step moves on to, etc. */ errr get_birth_command(bool wait) { static enum birth_stage current_stage = BIRTH_RESET; static enum birth_stage prev; static enum birth_stage roller = BIRTH_RESET; enum birth_stage next = current_stage; switch (current_stage) { case BIRTH_RESET: { cmd_insert(CMD_BIRTH_RESET); roller = BIRTH_RESET; if (quickstart_allowed) next = BIRTH_QUICKSTART; else next = BIRTH_SEX_CHOICE; break; } case BIRTH_QUICKSTART: { display_player(0); next = get_quickstart_command(); break; } case BIRTH_SEX_CHOICE: case BIRTH_CLASS_CHOICE: case BIRTH_RACE_CHOICE: case BIRTH_ROLLER_CHOICE: { menu_type *menu = &sex_menu; cmd_code command = CMD_CHOOSE_SEX; Term_clear(); print_menu_instructions(); if (current_stage > BIRTH_SEX_CHOICE) { menu_refresh(&sex_menu, FALSE); menu = &race_menu; command = CMD_CHOOSE_RACE; } if (current_stage > BIRTH_RACE_CHOICE) { menu_refresh(&race_menu, FALSE); menu = &class_menu; command = CMD_CHOOSE_CLASS; } if (current_stage > BIRTH_CLASS_CHOICE) { menu_refresh(&class_menu, FALSE); menu = &roller_menu; command = CMD_NULL; } next = menu_question(current_stage, menu, command); if (next == BIRTH_BACK) next = current_stage - 1; /* Make sure that the character gets reset before quickstarting */ if (next == BIRTH_QUICKSTART) next = BIRTH_RESET; break; } case BIRTH_POINTBASED: { roller = BIRTH_POINTBASED; if (prev > BIRTH_POINTBASED) point_based_start(); next = point_based_command(); if (next == BIRTH_BACK) next = BIRTH_ROLLER_CHOICE; if (next != BIRTH_POINTBASED) point_based_stop(); break; } case BIRTH_ROLLER: { roller = BIRTH_ROLLER; next = roller_command(prev < BIRTH_ROLLER); if (next == BIRTH_BACK) next = BIRTH_ROLLER_CHOICE; break; } case BIRTH_NAME_CHOICE: { if (prev < BIRTH_NAME_CHOICE) display_player(0); next = get_name_command(); if (next == BIRTH_BACK) next = roller; break; } case BIRTH_FINAL_CONFIRM: { if (prev < BIRTH_FINAL_CONFIRM) display_player(0); next = get_confirm_command(); if (next == BIRTH_BACK) next = BIRTH_NAME_CHOICE; break; } default: { /* Remove dodgy compiler warning, */ } } prev = current_stage; current_stage = next; return 0; } /* * Called when we enter the birth mode - so we set up handlers, command hooks, * etc, here. */ static void ui_enter_birthscreen(game_event_type type, game_event_data *data, void *user) { /* Set the ugly static global that tells us if quickstart's available. */ quickstart_allowed = data->flag; setup_menus(); } static void ui_leave_birthscreen(game_event_type type, game_event_data *data, void *user) { free_birth_menus(); } void ui_init_birthstate_handlers(void) { event_add_handler(EVENT_ENTER_BIRTH, ui_enter_birthscreen, NULL); event_add_handler(EVENT_LEAVE_BIRTH, ui_leave_birthscreen, NULL); } angband-3.5.1/src/guid.h0000644000175000017500000000020312456456606014323 0ustar chriscchrisc/* guid.h */ #ifndef GUID_H #define GUID_H typedef unsigned int guid; extern int guid_eq(guid a, guid b); #endif /* !GUID_H */ angband-3.5.1/src/tests/0000755000175000017500000000000012456456606014371 5ustar chriscchriscangband-3.5.1/src/tests/monster/0000755000175000017500000000000012456456606016060 5ustar chriscchriscangband-3.5.1/src/tests/monster/suite.mk0000644000175000017500000000005412456456606017541 0ustar chriscchriscTESTPROGS += monster/attack monster/monster angband-3.5.1/src/tests/monster/monster.c0000644000175000017500000000210412456456606017710 0ustar chriscchrisc/* monster/monster * * Tests for monster/monster?.c * * Created by: myshkin * 26 Apr 2011 */ #include "unit-test.h" #include "unit-test-data.h" #include "monster/mon-util.h" NOSETUP NOTEARDOWN /* Regression test for #1409 */ int test_match_monster_bases(void *state) { struct monster_base *base; rb_info = &test_rb_angel; /* Scruffy little dog */ base = test_r_littledog.base; require(match_monster_bases(base, "canine", NULL)); require(match_monster_bases(base, "zephyr hound", "canine", NULL)); require(!match_monster_bases(base, "angel", NULL)); require(!match_monster_bases(base, "lich", "vampire", "wraith", NULL)); /* Human */ base = test_r_human.base; require(!match_monster_bases(base, "canine", NULL)); require(!match_monster_bases(base, "lich", "vampire", "wraith", NULL)); require(match_monster_bases(base, "person", "townsfolk", NULL)); require(match_monster_bases(base, "townsfolk", NULL)); ok; } const char *suite_name = "monster/monster"; struct test tests[] = { { "match_monster_bases", test_match_monster_bases }, { NULL, NULL } }; angband-3.5.1/src/tests/monster/attack.c0000644000175000017500000000554612456456606017505 0ustar chriscchrisc/* monster/attack */ #include "unit-test.h" #include "unit-test-data.h" #include "monster/monster.h" int setup_tests(void **state) { struct monster_race *r = &test_r_human; struct monster *m = mem_zalloc(sizeof *m); m->race = r; r_info = r; *state = m; p_ptr = NULL; rand_fix(100); return 0; } NOTEARDOWN static int mdam(struct monster *m) { return m->race->blow[0].d_dice; } static int take1(struct player *p, struct monster *m, int blow, int eff) { int old, new; m->race->blow[0].effect = eff; m->race->blow[0].method = blow; p->chp = p->mhp; old = p->chp; testfn_make_attack_normal(m, p); new = p->chp; p->chp = p->mhp; return old - new; } static int test_blows(void *state) { struct monster *m = state; struct player *p = &test_player; int delta; flags_set(m->race->flags, RF_SIZE, RF_NEVER_BLOW, FLAG_END); delta = take1(p, m, RBM_HIT, RBE_HURT); flags_clear(m->race->flags, RF_SIZE, RF_NEVER_BLOW, FLAG_END); eq(delta, 0); delta = take1(p, m, RBM_HIT, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_TOUCH, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_PUNCH, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_KICK, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_CLAW, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_BITE, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_STING, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_BUTT, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_CRUSH, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_ENGULF, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_CRAWL, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_DROOL, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_SPIT, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_GAZE, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_WAIL, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_SPORE, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_BEG, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_INSULT, RBE_HURT); eq(delta, mdam(m)); delta = take1(p, m, RBM_MOAN, RBE_HURT); eq(delta, mdam(m)); ok; } static int test_effects(void *state) { struct monster *m = state; struct player *p = &test_player; int delta; require(!p->timed[TMD_POISONED]); delta = take1(p, m, RBM_HIT, RBE_POISON); require(p->timed[TMD_POISONED]); delta = take1(p, m, RBM_HIT, RBE_ACID); require(delta > 0); delta = take1(p, m, RBM_HIT, RBE_ELEC); require(delta > 0); delta = take1(p, m, RBM_HIT, RBE_FIRE); require(delta > 0); delta = take1(p, m, RBM_HIT, RBE_COLD); require(delta > 0); require(!p->timed[TMD_BLIND]); delta = take1(p, m, RBM_HIT, RBE_BLIND); require(p->timed[TMD_BLIND]); ok; } const char *suite_name = "monster/attack"; const struct test tests[] = { { "blows", test_blows }, { "effects", test_effects }, { NULL, NULL }, }; angband-3.5.1/src/tests/unit-test-types.h0000644000175000017500000000035012456456606017636 0ustar chriscchrisc/* unit-test-types.h * * Stub header for testing harness data structures * */ #ifndef UNIT_TEST_TYPES_H #define UNIT_TEST_TYPES_H struct test { const char *name; int (*func)(void *data); }; #endif /* !UNIT_TEST_TYPES_H */ angband-3.5.1/src/tests/z-util/0000755000175000017500000000000012456456606015615 5ustar chriscchriscangband-3.5.1/src/tests/z-util/suite.mk0000644000175000017500000000003112456456606017271 0ustar chriscchriscTESTPROGS += z-util/util angband-3.5.1/src/tests/z-util/util.c0000644000175000017500000000160112456456606016734 0ustar chriscchrisc/* z-quark/quark.c */ #include "unit-test.h" #include "z-quark.h" int setup_tests(void **state) { return 0; } int teardown_tests(void *state) { return 0; } int test_alloc(void *state) { char buffer[64]; /* Check it functions at all */ strcpy(buffer, "1234567890"); utf8_clipto(buffer, 5); require(strcmp(buffer, "12345") == 0); /* Extremely low input */ strcpy(buffer, "Test"); utf8_clipto(buffer, 0); require(buffer[0] == 0); /* Overly high input */ strcpy(buffer, "Test"); utf8_clipto(buffer, 10); require(strcmp(buffer, "Test") == 0); /* Non-ASCII clipping */ strcpy(buffer, "Lómin"); utf8_clipto(buffer, 2); require(strcmp(buffer, "Ló") == 0); strcpy(buffer, "åéïø"); utf8_clipto(buffer, 3); require(strcmp(buffer, "åéï") == 0); ok; } const char *suite_name = "z-util/util"; struct test tests[] = { { "utf8_clipto", test_alloc }, { NULL, NULL } }; angband-3.5.1/src/tests/unit-test.c0000644000175000017500000000237012456456606016473 0ustar chriscchrisc/* unit-test.c * * Framework for unit/regression testing harness */ #include #include #include #include "unit-test-types.h" #include "z-util.h" int verbose = 0; extern const char *suite_name; extern struct test tests[]; extern int setup_tests(void **data); extern int teardown_tests(void **data); int main(int argc, char *argv[]) { void *state; int i; int passed = 0; int total = 0; char *s = getenv("VERBOSE"); if (s && s[0]) { verbose = 1; } else if (argc > 1 && !strncmp(argv[1], "-v", 2)) { verbose = 1; } if (verbose) { printf("%s: starting...\n", suite_name); fflush(stdout); } if (setup_tests(&state)) { printf("ERROR: %s setup failed\n", suite_name); return 1; } for (i = 0; tests[i].name; i++) { if (verbose) printf(" %-16s ", tests[i].name); fflush(stdout); if (tests[i].func(state) == 0) passed++; total++; fflush(stdout); } if (teardown_tests(state)) { printf("ERROR: %s teardown failed\n", suite_name); return 1; } printf("%s finished: %d/%d passed\n", suite_name, passed, total); return 0; } int showpass(void) { if (verbose) printf("\033[01;32mPassed\033[00m\n"); return 0; } int showfail(void) { if (verbose) printf("\033[01;31mFailed\033[00m\n"); return 1; } angband-3.5.1/src/tests/z-quark/0000755000175000017500000000000012456456606015763 5ustar chriscchriscangband-3.5.1/src/tests/z-quark/suite.mk0000644000175000017500000000003312456456606017441 0ustar chriscchriscTESTPROGS += z-quark/quark angband-3.5.1/src/tests/z-quark/quark.c0000644000175000017500000000177412456456606017263 0ustar chriscchrisc/* z-quark/quark.c */ #include "unit-test.h" #include "z-quark.h" int setup_tests(void **state) { quarks_init(); return 0; } int teardown_tests(void *state) { quarks_free(); return 0; } int test_alloc(void *state) { quark_t q1 = quark_add("0-foo"); quark_t q2 = quark_add("0-bar"); quark_t q3 = quark_add("0-baz"); require(quark_str(q1)); require(quark_str(q2)); require(quark_str(q3)); require(!strcmp(quark_str(q1), "0-foo")); require(!strcmp(quark_str(q2), "0-bar")); require(!strcmp(quark_str(q3), "0-baz")); ok; } int test_dedup(void *state) { quark_t q1 = quark_add("1-foo"); quark_t q2 = quark_add("1-foo"); quark_t q3 = quark_add("1-bar"); require(quark_str(q1)); require(quark_str(q2)); require(quark_str(q3)); require(q1 == q2); require(quark_str(q1) == quark_str(q2)); require(q1 != q3); require(quark_str(q1) != quark_str(q3)); ok; } const char *suite_name = "z-quark/quark"; struct test tests[] = { { "alloc", test_alloc }, { "dedup", test_dedup }, { NULL, NULL } }; angband-3.5.1/src/tests/artifact/0000755000175000017500000000000012456456606016166 5ustar chriscchriscangband-3.5.1/src/tests/artifact/suite.mk0000644000175000017500000000003712456456606017650 0ustar chriscchriscTESTPROGS += artifact/randname angband-3.5.1/src/tests/artifact/randname.c0000644000175000017500000000133612456456606020122 0ustar chriscchrisc/* artifact/randname */ #include "unit-test.h" #include "object/obj-flag.h" #include "object/object.h" NOSETUP NOTEARDOWN #define NAMES_TRIES 100 const char *names[] = { "aaaaaa", "bbbbbb", "cccccc", "dddddd", "eeeeee", "ffffff", "gggggg", "hhhhhh", "iiiiii", "jjjjjj", NULL }; const char **p[] = { names, names }; int test_names(void *state) { struct artifact a; char *n; int i; a.aidx = 1; for (i = 0; i < NAMES_TRIES; i++) { n = artifact_gen_name(&a, p); if (strchr(n, '\'')) require(strchr(n, '\'') != strrchr(n, '\'')); else require(strstr(n, "of ")); mem_free(n); } ok; } const char *suite_name = "artifact/randname"; struct test tests[] = { { "names", test_names }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/0000755000175000017500000000000012456456606015503 5ustar chriscchriscangband-3.5.1/src/tests/parse/suite.mk0000644000175000017500000000054112456456606017165 0ustar chriscchriscTESTPROGS += parse/a-info \ parse/c-info \ parse/e-info \ parse/f-info \ parse/flavor \ parse/h-info \ parse/names \ parse/parser \ parse/k-info \ parse/p-info \ parse/r-info \ parse/s-info \ parse/store \ parse/v-info \ parse/z-info angband-3.5.1/src/tests/parse/c-info.c0000644000175000017500000001052112456456606017021 0ustar chriscchrisc/* parse/c-info */ #include "unit-test.h" #include "init.h" #include "object/obj-flag.h" #include "object/object.h" #include "object/tvalsval.h" #include "player/player.h" int setup_tests(void **state) { *state = init_parse_c(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:4:Ranger"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->cidx, 4); require(streq(c->name, "Ranger")); ok; } int test_s0(void *state) { enum parser_error r = parser_parse(state, "S:3:-3:2:-2:1"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->c_adj[A_STR], 3); eq(c->c_adj[A_INT], -3); eq(c->c_adj[A_WIS], 2); eq(c->c_adj[A_DEX], -2); eq(c->c_adj[A_CON], 1); ok; } int test_c0(void *state) { enum parser_error r = parser_parse(state, "C:30:32:28:3:24:16:56:72:72:0"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->c_skills[SKILL_DISARM], 30); eq(c->c_skills[SKILL_DEVICE], 32); eq(c->c_skills[SKILL_SAVE], 28); eq(c->c_skills[SKILL_STEALTH], 3); eq(c->c_skills[SKILL_SEARCH], 24); eq(c->c_skills[SKILL_SEARCH_FREQUENCY], 16); eq(c->c_skills[SKILL_TO_HIT_MELEE], 56); eq(c->c_skills[SKILL_TO_HIT_BOW], 72); eq(c->c_skills[SKILL_TO_HIT_THROW], 72); eq(c->c_skills[SKILL_DIGGING], 0); ok; } int test_x0(void *state) { enum parser_error r = parser_parse(state, "X:8:10:10:0:0:0:30:45:45:0"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->x_skills[SKILL_DISARM], 8); eq(c->x_skills[SKILL_DEVICE], 10); eq(c->x_skills[SKILL_SAVE], 10); eq(c->x_skills[SKILL_STEALTH], 0); eq(c->x_skills[SKILL_SEARCH], 0); eq(c->x_skills[SKILL_SEARCH_FREQUENCY], 0); eq(c->x_skills[SKILL_TO_HIT_MELEE], 30); eq(c->x_skills[SKILL_TO_HIT_BOW], 45); eq(c->x_skills[SKILL_TO_HIT_THROW], 45); eq(c->x_skills[SKILL_DIGGING], 0); ok; } int test_i0(void *state) { enum parser_error r = parser_parse(state, "I:4:30:20000:40"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->c_mhp, 4); eq(c->c_exp, 30); eq(c->sense_base, 20000); eq(c->sense_div, 40); ok; } int test_a0(void *state) { enum parser_error r = parser_parse(state, "A:5:35:4"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->max_attacks, 5); eq(c->min_weight, 35); eq(c->att_multiply, 4); ok; } int test_m0(void *state) { enum parser_error r = parser_parse(state, "M:90:1:3:400"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->spell_book, 90); eq(c->spell_stat, 1); eq(c->spell_first, 3); eq(c->spell_weight, 400); ok; } int test_b0(void *state) { enum parser_error r = parser_parse(state, "B:8:23:25:90:3"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); eq(c->spells.info[8].slevel, 23); eq(c->spells.info[8].smana, 25); eq(c->spells.info[8].sfail, 90); eq(c->spells.info[8].sexp, 3); ok; } int test_t0(void *state) { enum parser_error r0 = parser_parse(state, "T:Runner"); enum parser_error r1 = parser_parse(state, "T:Strider"); struct player_class *c; eq(r0, PARSE_ERROR_NONE); eq(r1, PARSE_ERROR_NONE); c = parser_priv(state); require(c); require(streq(c->title[0], "Runner")); require(streq(c->title[1], "Strider")); ok; } /* Causes segfault: lookup_sval() requires z_info/k_info */ int test_e0(void *state) { enum parser_error r = parser_parse(state, "E:magic book:2:2:5"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); ptreq(c->start_items[0].kind, objkind_get(TV_MAGIC_BOOK, 2)); eq(c->start_items[0].min, 2); eq(c->start_items[0].max, 5); ok; } int test_f0(void *state) { enum parser_error r = parser_parse(state, "F:CUMBER_GLOVE | CHOOSE_SPELLS"); struct player_class *c; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); require(c->pflags); ok; } const char *suite_name = "parse/c-info"; struct test tests[] = { { "n0", test_n0 }, { "s0", test_s0 }, { "c0", test_c0 }, { "x0", test_x0 }, { "i0", test_i0 }, { "a0", test_a0 }, { "m0", test_m0 }, { "b0", test_b0 }, { "t0", test_t0 }, /* { "e0", test_e0 }, */ { "f0", test_f0 }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/z-info.c0000644000175000017500000000233112456456606017050 0ustar chriscchrisc/* parse/z-info */ #include "unit-test.h" #include "unit-test-data.h" #include "init.h" int setup_tests(void **state) { *state = init_parse_z(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_negative(void *state) { errr r = parser_parse(state, "M:F:-1"); eq(r, PARSE_ERROR_INVALID_VALUE); ok; } int test_badmax(void *state) { errr r = parser_parse(state, "M:D:1"); eq(r, PARSE_ERROR_UNDEFINED_DIRECTIVE); ok; } #define TEST_MAX(l,u) \ int test_##l(void *s) { \ maxima *m = parser_priv(s); \ char buf[64]; \ errr r; \ snprintf(buf, sizeof(buf), "M:%c:%d", u, __LINE__); \ r = parser_parse(s, buf); \ eq(m->l, __LINE__); \ eq(r, 0); \ ok; \ } TEST_MAX(f_max, 'F') TEST_MAX(k_max, 'K') TEST_MAX(a_max, 'A') TEST_MAX(e_max, 'E') TEST_MAX(r_max, 'R') TEST_MAX(s_max, 'S') TEST_MAX(o_max, 'O') TEST_MAX(m_max, 'M') const char *suite_name = "parse/z-info"; struct test tests[] = { { "negative", test_negative }, { "badmax", test_badmax }, { "fmax", test_f_max }, { "kmax", test_k_max }, { "amax", test_a_max }, { "emax", test_e_max }, { "rmax", test_r_max }, { "smax", test_s_max }, { "omax", test_o_max }, { "mmax", test_m_max }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/h-info.c0000644000175000017500000000162512456456606017033 0ustar chriscchrisc/* parse/h-info */ #include "unit-test.h" #include "init.h" #include "player/player.h" int setup_tests(void **state) { *state = init_parse_h(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:1:3:5:2"); struct history_chart *c; struct history_entry *e; eq(r, PARSE_ERROR_NONE); c = parser_priv(state); require(c); e = c->entries; require(e); eq(c->idx, 1); ptreq(e->next, NULL); ptreq(e->roll, 5); eq(e->isucc, 3); ok; } int test_d0(void *state) { enum parser_error r = parser_parse(state, "D:hello there"); struct history_chart *h; eq(r, PARSE_ERROR_NONE); h = parser_priv(state); require(h); require(streq(h->entries->text, "hello there")); ok; } const char *suite_name = "parse/h-info"; struct test tests[] = { { "n0", test_n0 }, { "d0", test_d0 }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/names.c0000644000175000017500000000145512456456606016757 0ustar chriscchrisc/* parse/names */ #include "unit-test.h" #include "init.h" int setup_tests(void **state) { *state = init_parse_names(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { errr r = parser_parse(state, "N:1"); eq(r, 0); ok; } int test_d0(void *state) { errr r = parser_parse(state, "D:foo"); eq(r, 0); r = parser_parse(state, "D:bar"); eq(r, 0); ok; } int test_n1(void *state) { errr r = parser_parse(state, "N:2"); eq(r, 0); ok; } int test_d1(void *state) { errr r = parser_parse(state, "D:baz"); eq(r, 0); r = parser_parse(state, "D:quxx"); eq(r, 0); ok; } const char *suite_name = "parse/names"; struct test tests[] = { { "n0", test_n0 }, { "d0", test_d0 }, { "n1", test_n1 }, { "d1", test_d1 }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/e-info.c0000644000175000017500000000651512456456606017033 0ustar chriscchrisc/* parse/e-info */ #include "unit-test.h" #include "unit-test-data.h" #include "object/tvalsval.h" #include "init.h" int setup_tests(void **state) { *state = init_parse_e(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_order(void *state) { enum parser_error r = parser_parse(state, "X:3:4"); eq(r, PARSE_ERROR_MISSING_RECORD_HEADER); ok; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:5:of Resist Lightning"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->eidx, 5); require(streq(e->name, "of Resist Lightning")); ok; } int test_w0(void *state) { enum parser_error r = parser_parse(state, "W:2:4:6:8"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->level, 2); eq(e->rarity, 4); eq(e->cost, 8); return PARSE_ERROR_NONE; } int test_x0(void *state) { enum parser_error r = parser_parse(state, "X:5:1"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->rating, 5); eq(e->xtra, 1); ok; } int test_t0(void *state) { enum parser_error r = parser_parse(state, "T:22:2:13"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->tval[0], 22); eq(e->min_sval[0], 2); eq(e->max_sval[0], 13); ok; } /* Broken: lookup_sval() requires k_info, z_info */ int test_t1(void *state) { enum parser_error r = parser_parse(state, "T:sword:dagger:scimitar"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->tval[1], TV_SWORD); eq(e->min_sval[1], SV_DAGGER); eq(e->max_sval[1], SV_SCIMITAR); ok; } int test_c0(void *state) { enum parser_error r = parser_parse(state, "C:1d2:3d4:5d6"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->to_h.dice, 1); eq(e->to_h.sides, 2); eq(e->to_d.dice, 3); eq(e->to_d.sides, 4); eq(e->to_a.dice, 5); eq(e->to_a.sides, 6); ok; } int test_l0(void *state) { enum parser_error r = parser_parse(state, "L:1+2d3M4:5:STR | INT"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->pval[0].base, 1); eq(e->pval[0].dice, 2); eq(e->pval[0].sides, 3); eq(e->pval[0].m_bonus, 4); eq(e->min_pval[0], 5); require(e->pval_flags[0]); ok; } int test_m0(void *state) { enum parser_error r = parser_parse(state, "M:10:13:4"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); eq(e->min_to_h, 10); eq(e->min_to_d, 13); eq(e->min_to_a, 4); ok; } int test_f0(void *state) { enum parser_error r = parser_parse(state, "F:SEE_INVIS"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); require(e->flags); ok; } int test_d0(void *state) { enum parser_error r = parser_parse(state, "D:foo"); struct ego_item *e; eq(r, PARSE_ERROR_NONE); r = parser_parse(state, "D: bar"); eq(r, PARSE_ERROR_NONE); e = parser_priv(state); require(e); require(streq(e->text, "foo bar")); ok; } const char *suite_name = "parse/e-info"; struct test tests[] = { { "order", test_order }, { "n0", test_n0 }, { "w0", test_w0 }, { "x0", test_x0 }, { "t0", test_t0 }, /* { "t1", test_t1 }, */ { "c0", test_c0 }, { "m0", test_m0 }, { "f0", test_f0 }, { "d0", test_d0 }, { "l0", test_l0 }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/a-info.c0000644000175000017500000000761412456456606017030 0ustar chriscchrisc/* parse/a-info */ #include "unit-test.h" #include "unit-test-data.h" #include "object/tvalsval.h" #include "init.h" int setup_tests(void **state) { *state = init_parse_a(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:3:of Thrain"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); eq(a->aidx, 3); require(streq(a->name, "of Thrain")); ok; } int test_badtval0(void *state) { enum parser_error r = parser_parse(state, "I:badtval:6:3"); eq(r, PARSE_ERROR_UNRECOGNISED_TVAL); ok; } int test_badtval1(void *state) { enum parser_error r = parser_parse(state, "I:-1:6:3"); eq(r, PARSE_ERROR_UNRECOGNISED_TVAL); ok; } /* Causes segfault: lookup_sval() requires z_info/k_info */ int test_badsval(void *state) { errr r = parser_parse(state, "I:light:badsval:3"); eq(r, PARSE_ERROR_UNRECOGNISED_SVAL); ok; } int test_badsval1(void *state) { enum parser_error r = parser_parse(state, "I:light:-2:3"); eq(r, PARSE_ERROR_UNRECOGNISED_SVAL); ok; } int test_i0(void *state) { enum parser_error r = parser_parse(state, "I:light:6"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); eq(a->tval, TV_LIGHT); eq(a->sval, 6); ok; } int test_w0(void *state) { enum parser_error r = parser_parse(state, "W:3:5:8:200"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); eq(a->level, 3); eq(a->weight, 8); eq(a->cost, 200); ok; } int test_a0(void *state) { enum parser_error r = parser_parse(state, "A:3:5"); eq(r, PARSE_ERROR_GENERIC); ok; } int test_a1(void *state) { enum parser_error r = parser_parse(state, "A:3:5 to 300"); eq(r, PARSE_ERROR_OUT_OF_BOUNDS); ok; } int test_a2(void *state) { enum parser_error r = parser_parse(state, "A:3:5 to 10"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); eq(a->alloc_prob, 3); eq(a->alloc_min, 5); eq(a->alloc_max, 10); ok; } int test_p0(void *state) { enum parser_error r = parser_parse(state, "P:3:4d5:8:2:1"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); eq(a->ac, 3); eq(a->dd, 4); eq(a->ds, 5); eq(a->to_h, 8); eq(a->to_d, 2); eq(a->to_a, 1); ok; } int test_f0(void *state) { enum parser_error r = parser_parse(state, "F:SEE_INVIS | HOLD_LIFE"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); require(a->flags); ok; } int test_l0(void *state) { enum parser_error r = parser_parse(state, "L:17:STR | CON"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); eq(a->pval[0], 17); require(a->pval_flags[0]); ok; } int test_e0(void *state) { enum parser_error r = parser_parse(state, "E:DETECT_ALL:20+d30"); struct artifact *a; eq(r, PARSE_ERROR_NONE); a = parser_priv(state); require(a); require(a->effect); eq(a->time.base, 20); eq(a->time.sides, 30); ok; } int test_m0(void *state) { enum parser_error r = parser_parse(state, "M:foo"); struct artifact *a; eq(r, 0); r = parser_parse(state, "M:bar"); eq(r, 0); a = parser_priv(state); require(a); require(streq(a->effect_msg, "foobar")); ok; } int test_d0(void *state) { enum parser_error r = parser_parse(state, "D:baz"); struct artifact *a; eq(r, 0); r = parser_parse(state, "D: quxx"); eq(r, 0); a = parser_priv(state); require(a); require(streq(a->text, "baz quxx")); ok; } const char *suite_name = "parse/a-info"; struct test tests[] = { { "n0", test_n0 }, { "badtval0", test_badtval0 }, { "badtval1", test_badtval1 }, /* { "badsval0", test_badsval0 }, */ { "badsval1", test_badsval1 }, { "i0", test_i0 }, { "w0", test_w0 }, { "a0", test_a0 }, { "a1", test_a1 }, { "a2", test_a2 }, { "p0", test_p0 }, { "f0", test_f0 }, { "e0", test_e0 }, { "m0", test_m0 }, { "d0", test_d0 }, { "l0", test_l0 }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/f-info.c0000644000175000017500000000376512456456606017040 0ustar chriscchrisc/* parse/f-info */ #include "unit-test.h" #include "unit-test-data.h" #include "init.h" int setup_tests(void **state) { *state = init_parse_f(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:3:Test Feature"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); require(streq(f->name, "Test Feature")); eq(f->fidx, 3); eq(f->mimic, 3); ok; } int test_g0(void *state) { enum parser_error r = parser_parse(state, "G:::red"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); eq(f->d_char, L':'); eq(f->d_attr, TERM_RED); ok; } int test_m0(void *state) { enum parser_error r = parser_parse(state, "M:11"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); eq(f->mimic, 11); ok; } int test_p0(void *state) { enum parser_error r = parser_parse(state, "P:2"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); eq(f->priority, 2); ok; } int test_f0(void *state) { enum parser_error r = parser_parse(state, "F:MWALK | LOOK"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); require(f->flags); ok; } int test_x0(void *state) { enum parser_error r = parser_parse(state, "X:3:5:9:2"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); eq(f->locked, 3); /* eq(f->jammed, 5); * as of 85b1ff6, the jammed field is unused */ eq(f->shopnum, 9); eq(f->dig, 2); ok; } int test_e0(void *state) { enum parser_error r = parser_parse(state, "E:TRAP_PIT"); struct feature *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); require(f->effect); ok; } const char *suite_name = "parse/f-info"; struct test tests[] = { { "n0", test_n0 }, { "g0", test_g0 }, { "m0", test_m0 }, { "p0", test_p0 }, { "f0", test_f0 }, { "x0", test_x0 }, { "e0", test_e0 }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/r-info.c0000644000175000017500000000642412456456606017047 0ustar chriscchrisc/* parse/r-info */ #include "unit-test.h" #include "unit-test-data.h" #include "init.h" #include "monster/constants.h" #include "monster/monster.h" #include "externs.h" int setup_tests(void **state) { *state = init_parse_r(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:544:Carcharoth, the Jaws of Thirst"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); eq(mr->ridx, 544); require(streq(mr->name, "Carcharoth, the Jaws of Thirst")); ok; } int test_t0(void *state) { enum parser_error r; struct monster_race *mr; rb_info = &test_rb_townsfolk; r = parser_parse(state, "T:townsfolk"); eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); require(streq(mr->base->name, "townsfolk")); ok; } int test_c0(void *state) { enum parser_error r = parser_parse(state, "C:v"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); eq(mr->d_attr, TERM_VIOLET); ok; } int test_i0(void *state) { enum parser_error r = parser_parse(state, "I:7:500:80:22:3"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); eq(mr->speed, 7); eq(mr->avg_hp, 500); eq(mr->aaf, 80); eq(mr->ac, 22); eq(mr->sleep, 3); ok; } int test_w0(void *state) { enum parser_error r = parser_parse(state, "W:42:11:27:4"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); eq(mr->level, 42); eq(mr->rarity, 11); eq(mr->power, 27); eq(mr->mexp, 4); ok; } int test_b0(void *state) { enum parser_error r = parser_parse(state, "B:CLAW:FIRE:9d12"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); require(mr->blow[0].method); require(mr->blow[0].effect); eq(mr->blow[0].d_dice, 9); eq(mr->blow[0].d_side, 12); ok; } int test_b1(void *state) { enum parser_error r = parser_parse(state, "B:BITE:FIRE:6d8"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); require(mr->blow[1].method); require(mr->blow[1].effect); eq(mr->blow[1].d_dice, 6); eq(mr->blow[1].d_side, 8); ok; } int test_f0(void *state) { enum parser_error r = parser_parse(state, "F:UNIQUE | MALE"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); require(mr->flags); ok; } int test_d0(void *state) { enum parser_error r = parser_parse(state, "D:foo bar "); enum parser_error s = parser_parse(state, "D: baz"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); eq(s, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); require(streq(mr->text, "foo bar baz")); ok; } int test_s0(void *state) { enum parser_error r = parser_parse(state, "S:1_IN_4 | BR_DARK | S_HOUND"); struct monster_race *mr; eq(r, PARSE_ERROR_NONE); mr = parser_priv(state); require(mr); eq(mr->freq_spell, 25); eq(mr->freq_innate, 25); require(mr->spell_flags); ok; } const char *suite_name = "parse/r-info"; struct test tests[] = { { "n0", test_n0 }, { "c0", test_c0 }, { "t0", test_t0 }, { "i0", test_i0 }, { "w0", test_w0 }, { "b0", test_b0 }, { "b1", test_b1 }, { "f0", test_f0 }, { "d0", test_d0 }, { "s0", test_s0 }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/p-info.c0000644000175000017500000000642712456456606017050 0ustar chriscchrisc/* parse/p-info */ #include "unit-test.h" #include "init.h" #include "player/player.h" int setup_tests(void **state) { *state = init_parse_p(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:1:Half-Elf"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->ridx, 1); require(streq(pr->name, "Half-Elf")); ok; } int test_s0(void *state) { enum parser_error r = parser_parse(state, "S:1:-1:2:-2:3"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->r_adj[A_STR], 1); eq(pr->r_adj[A_INT], -1); eq(pr->r_adj[A_WIS], 2); eq(pr->r_adj[A_DEX], -2); eq(pr->r_adj[A_CON], 3); ok; } int test_r0(void *state) { enum parser_error r = parser_parse(state, "R:1:3:5:7:9:2:4:6:8:10"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->r_skills[SKILL_DISARM], 1); eq(pr->r_skills[SKILL_DEVICE], 3); eq(pr->r_skills[SKILL_SAVE], 5); eq(pr->r_skills[SKILL_STEALTH], 7); eq(pr->r_skills[SKILL_SEARCH], 9); eq(pr->r_skills[SKILL_SEARCH_FREQUENCY], 2); eq(pr->r_skills[SKILL_TO_HIT_MELEE], 4); eq(pr->r_skills[SKILL_TO_HIT_BOW], 6); eq(pr->r_skills[SKILL_TO_HIT_THROW], 8); eq(pr->r_skills[SKILL_DIGGING], 10); ok; } int test_x0(void *state) { enum parser_error r = parser_parse(state, "X:10:20:80"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->r_mhp, 10); eq(pr->r_exp, 20); eq(pr->infra, 80); ok; } int test_i0(void *state) { enum parser_error r = parser_parse(state, "I:0:10:3"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); ptreq(pr->history, NULL); eq(pr->b_age, 10); eq(pr->m_age, 3); ok; } int test_h0(void *state) { enum parser_error r = parser_parse(state, "H:10:2:11:3"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->m_b_ht, 10); eq(pr->m_m_ht, 2); eq(pr->f_b_ht, 11); eq(pr->f_m_ht, 3); ok; } int test_w0(void *state) { enum parser_error r = parser_parse(state, "W:80:10:75:7"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->m_b_wt, 80); eq(pr->m_m_wt, 10); eq(pr->f_b_wt, 75); eq(pr->f_m_wt, 7); ok; } int test_f0(void *state) { enum parser_error r = parser_parse(state, "F:SUST_DEX"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); require(pr->flags); ok; } int test_y0(void *state) { enum parser_error r = parser_parse(state, "Y:KNOW_ZAPPER"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); require(pr->pflags); ok; } int test_c0(void *state) { enum parser_error r = parser_parse(state, "C:1|3|5"); struct player_race *pr; eq(r, PARSE_ERROR_NONE); pr = parser_priv(state); require(pr); eq(pr->choice, (1 << 5) | (1 << 3) | (1 << 1)); ok; } const char *suite_name = "parse/p-info"; struct test tests[] = { { "n0", test_n0 }, { "s0", test_s0 }, { "r0", test_r0 }, { "x0", test_x0 }, { "i0", test_i0 }, { "h0", test_h0 }, { "w0", test_w0 }, { "f0", test_f0 }, { "y0", test_y0 }, { "c0", test_c0 }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/flavor.c0000644000175000017500000000161212456456606017140 0ustar chriscchrisc/* parse/flavor.c */ #include "unit-test.h" #include "init.h" #include "object/tvalsval.h" #include "object/obj-flag.h" #include "object/object.h" #include "z-term.h" int setup_tests(void **state) { *state = init_parse_flavor(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_kind0(void *state) { enum parser_error r = parser_parse(state, "kind:light:&"); eq(r, PARSE_ERROR_NONE); ok; } int test_flavor0(void *state) { enum parser_error r = parser_parse(state, "flavor:2:blue:Fishy"); struct flavor *f; eq(r, PARSE_ERROR_NONE); f = parser_priv(state); require(f); eq(f->fidx, 2); eq(f->tval, TV_LIGHT); eq(f->d_char, L'&'); eq(f->d_attr, TERM_BLUE); require(streq(f->text, "Fishy")); ok; } const char *suite_name = "parse/flavor"; struct test tests[] = { { "kind0", test_kind0 }, { "flavor0", test_flavor0 }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/k-info.c0000644000175000017500000000736712456456606017047 0ustar chriscchrisc/* parse/k-info */ #include "unit-test.h" #include "unit-test-data.h" #include "init.h" int setup_tests(void **state) { *state = init_parse_k(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { errr r = parser_parse(state, "N:3:Test Object Kind"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->kidx, 3); require(streq(k->name, "Test Object Kind")); ok; } int test_g0(void *state) { errr r = parser_parse(state, "G:~:red"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->d_char, L'~'); eq(k->d_attr, TERM_RED); ok; } int test_g1(void *state) { errr r = parser_parse(state, "G:!:W"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->d_char, L'!'); eq(k->d_attr, TERM_L_WHITE); ok; } int test_i0(void *state) { errr r = parser_parse(state, "I:4:2"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->tval, 4); eq(k->sval, 2); ok; } int test_i1(void *state) { errr r = parser_parse(state, "I:food:2"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->tval, TV_FOOD); eq(k->sval, 2); ok; } int test_w0(void *state) { errr r = parser_parse(state, "W:10:0:5:120"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->level, 10); eq(k->weight, 5); eq(k->cost, 120); ok; } int test_a0(void *state) { errr r = parser_parse(state, "A:3:4 to 6"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->alloc_prob, 3); eq(k->alloc_min, 4); eq(k->alloc_max, 6); ok; } int test_p0(void *state) { errr r = parser_parse(state, "P:3:4d8:1d4:2d5:7d6"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->ac, 3); eq(k->dd, 4); eq(k->ds, 8); eq(k->to_h.dice, 1); eq(k->to_h.sides, 4); eq(k->to_d.dice, 2); eq(k->to_d.sides, 5); eq(k->to_a.dice, 7); eq(k->to_a.sides, 6); ok; } int test_c0(void *state) { errr r = parser_parse(state, "C:2d8"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->charge.dice, 2); eq(k->charge.sides, 8); ok; } int test_m0(void *state) { errr r = parser_parse(state, "M:4:3d6"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->gen_mult_prob, 4); eq(k->stack_size.dice, 3); eq(k->stack_size.sides, 6); ok; } int test_f0(void *state) { errr r = parser_parse(state, "F:STR"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); require(k->flags); ok; } int test_l0(void *state) { errr r = parser_parse(state, "L:1+2d3M4:STR | INT"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); eq(k->pval[0].base, 1); eq(k->pval[0].dice, 2); eq(k->pval[0].sides, 3); eq(k->pval[0].m_bonus, 4); require(k->pval_flags[0]); ok; } int test_e0(void *state) { errr r = parser_parse(state, "E:POISON:4d5"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); require(k->effect); eq(k->time.dice, 4); eq(k->time.sides, 5); ok; } int test_d0(void *state) { errr r = parser_parse(state, "D:foo bar"); struct object_kind *k; eq(r, 0); k = parser_priv(state); require(k); require(k->text); require(streq(k->text, "foo bar")); r = parser_parse(state, "D: baz"); eq(r, 0); ptreq(k, parser_priv(state)); require(streq(k->text, "foo bar baz")); ok; } const char *suite_name = "parse/k-info"; struct test tests[] = { { "n0", test_n0 }, { "g0", test_g0 }, { "g1", test_g1 }, { "i0", test_i0 }, { "i1", test_i1 }, { "w0", test_w0 }, { "a0", test_a0 }, { "p0", test_p0 }, { "c0", test_c0 }, { "m0", test_m0 }, { "f0", test_f0 }, { "e0", test_e0 }, { "d0", test_d0 }, { "l0", test_l0 }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/v-info.c0000644000175000017500000000222212456456606017043 0ustar chriscchrisc/* parse/v-info */ #include "unit-test.h" #include "init.h" #include "cave.h" #include "generate.h" int setup_tests(void **state) { *state = init_parse_v(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:1:round"); struct vault *v; eq(r, PARSE_ERROR_NONE); v = parser_priv(state); require(v); eq(v->vidx, 1); require(streq(v->name, "round")); ok; } int test_x0(void *state) { enum parser_error r = parser_parse(state, "X:6:5:12:20"); struct vault *v; eq(r, PARSE_ERROR_NONE); v = parser_priv(state); require(v); eq(v->typ, 6); eq(v->rat, 5); eq(v->hgt, 12); eq(v->wid, 20); ok; } int test_d0(void *state) { enum parser_error r0 = parser_parse(state, "D: %% "); enum parser_error r1 = parser_parse(state, "D: % % "); struct vault *v; eq(r0, PARSE_ERROR_NONE); eq(r1, PARSE_ERROR_NONE); v = parser_priv(state); require(v); require(streq(v->text, " %% % % ")); ok; } const char *suite_name = "parse/v-info"; struct test tests[] = { { "n0", test_n0 }, { "x0", test_x0 }, { "d0", test_d0 }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/s-info.c0000644000175000017500000000211512456456606017041 0ustar chriscchrisc/* parse/s-info */ #include "unit-test.h" #include "init.h" #include "object/object.h" int setup_tests(void **state) { *state = init_parse_s(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_n0(void *state) { enum parser_error r = parser_parse(state, "N:1:Detect Monsters"); struct spell *s; eq(r, PARSE_ERROR_NONE); s = parser_priv(state); require(s); eq(s->sidx, 1); require(streq(s->name, "Detect Monsters")); ok; } int test_i0(void *state) { enum parser_error r = parser_parse(state, "I:90:0:1"); struct spell *s; eq(r, PARSE_ERROR_NONE); s = parser_priv(state); require(s); eq(s->tval, 90); eq(s->sval, 0); eq(s->snum, 1); ok; } int test_d0(void *state) { enum parser_error r = parser_parse(state, "D:Teleports you randomly."); struct spell *s; eq(r, PARSE_ERROR_NONE); s = parser_priv(state); require(s); require(streq(s->text, "Teleports you randomly.")); ok; } const char *suite_name = "parse/s-info"; struct test tests[] = { { "n0", test_n0 }, { "i0", test_i0 }, { "d0", test_d0 }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/parser.c0000644000175000017500000002302112456456606017141 0ustar chriscchrisc/* parse/parser */ #include "unit-test.h" #include "parser.h" int setup_tests(void **state) { struct parser *p = parser_new(); if (!p) return 1; *state = p; return 0; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_blank(void *state) { eq(parser_parse(state, ""), PARSE_ERROR_NONE); ok; } int test_spaces(void *state) { eq(parser_parse(state, " "), PARSE_ERROR_NONE); ok; } int test_comment0(void *state) { eq(parser_parse(state, "# foo"), PARSE_ERROR_NONE); ok; } int test_comment1(void *state) { eq(parser_parse(state, " # bar"), PARSE_ERROR_NONE); ok; } int test_priv(void *state) { ptreq(parser_priv(state), 0); parser_setpriv(state, (void*)0x42); ptreq(parser_priv(state), (void*)0x42); ok; } int test_reg0(void *state) { errr r = parser_reg(state, "", ignored); eq(r, -EINVAL); ok; } int test_reg1(void *state) { errr r = parser_reg(state, " ", ignored); eq(r, -EINVAL); ok; } int test_reg2(void *state) { errr r = parser_reg(state, "abc int", ignored); eq(r, -EINVAL); ok; } int test_reg3(void *state) { errr r = parser_reg(state, "abc notype name", ignored); eq(r, -EINVAL); ok; } int test_reg4(void *state) { errr r = parser_reg(state, "abc int a ?int b int c", ignored); eq(r, -EINVAL); ok; } int test_reg5(void *state) { errr r = parser_reg(state, "abc str foo int bar", ignored); eq(r, -EINVAL); ok; } int test_reg_int(void *state) { errr r = parser_reg(state, "test-reg-int int foo", ignored); eq(r, 0); ok; } int test_reg_sym(void *state) { errr r = parser_reg(state, "test-reg-sym sym bar", ignored); eq(r, 0); ok; } int test_reg_str(void *state) { errr r = parser_reg(state, "test-reg-str str baz", ignored); eq(r, 0); ok; } static enum parser_error helper_sym0(struct parser *p) { const char *s = parser_getsym(p, "foo"); int *wasok = parser_priv(p); if (!s || strcmp(s, "bar")) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_sym0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-sym0 sym foo", helper_sym0); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-sym0:bar"); eq(r, PARSE_ERROR_NONE); eq(wasok, 1); ok; } static enum parser_error helper_sym1(struct parser *p) { const char *s = parser_getsym(p, "foo"); const char *t = parser_getsym(p, "baz"); int *wasok = parser_priv(p); if (!s || !t || strcmp(s, "bar") || strcmp(t, "quxx")) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_sym1(void *state) { int wasok = 0; errr r = parser_reg(state, "test-sym1 sym foo sym baz", helper_sym1); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-sym1:bar:quxx"); eq(r, PARSE_ERROR_NONE); eq(wasok, 1); ok; } static enum parser_error helper_int0(struct parser *p) { int s = parser_getint(p, "i0"); int t = parser_getint(p, "i1"); int *wasok = parser_priv(p); *wasok = (s == 42 && t == 81); return PARSE_ERROR_NONE; } int test_int0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-int0 int i0 int i1", helper_int0); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-int0:42:81"); eq(r, PARSE_ERROR_NONE); eq(wasok, 1); ok; } static enum parser_error helper_int1(struct parser *p) { int v = parser_getint(p, "i0"); int *wasok = parser_priv(p); *wasok = (v == -3); return PARSE_ERROR_NONE; } int test_int1(void *state) { int wasok = 0; errr r = parser_reg(state, "test-int1 int i0", helper_int1); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-int1:-3"); eq(r, PARSE_ERROR_NONE); eq(wasok, 1); ok; } static enum parser_error helper_str0(struct parser *p) { const char *s = parser_getstr(p, "s0"); int *wasok = parser_priv(p); if (!s || strcmp(s, "foo:bar:baz quxx...")) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_str0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-str0 str s0", helper_str0); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-str0:foo:bar:baz quxx..."); eq(r, PARSE_ERROR_NONE); eq(wasok, 1); ok; } int test_syntax0(void *state) { struct parser_state s; int v; errr r = parser_reg(state, "test-syntax0 str s0", ignored); eq(r, 0); r = parser_parse(state, "test-syntax0"); eq(r, PARSE_ERROR_MISSING_FIELD); v = parser_getstate(state, &s); require(v); eq(s.line, 5); eq(s.col, 2); ok; } int test_syntax1(void *state) { struct parser_state s; int v; errr r = parser_reg(state, "test-syntax1 int i0", ignored); eq(r, 0); r = parser_parse(state, "test-syntax1:a"); eq(r, PARSE_ERROR_NOT_NUMBER); v = parser_getstate(state, &s); require(v); eq(s.line, 6); eq(s.col, 2); ok; } int test_syntax2(void *state) { struct parser_state s; int v; errr r = parser_reg(state, "test-syntax2 int i0 sym s1", ignored); eq(r, 0); r = parser_parse(state, "test-syntax2::test"); eq(r, PARSE_ERROR_NOT_NUMBER); v = parser_getstate(state, &s); require(v); eq(s.line, 7); eq(s.col, 2); ok; } int test_baddir(void *state) { errr r = parser_parse(state, "test-baddir"); eq(r, PARSE_ERROR_UNDEFINED_DIRECTIVE); ok; } static enum parser_error helper_rand0(struct parser *p) { struct random v = parser_getrand(p, "r0"); int *wasok = parser_priv(p); if (v.dice != 2 || v.sides != 3) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_rand0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-rand0 rand r0", helper_rand0); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-rand0:2d3"); eq(r, 0); eq(wasok, 1); ok; } static enum parser_error helper_rand1(struct parser *p) { struct random v = parser_getrand(p, "r0"); struct random u = parser_getrand(p, "r1"); int *wasok = parser_priv(p); if (v.dice != 2 || v.sides != 3 || u.dice != 4 || u.sides != 5) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_rand1(void *state) { int wasok = 0; errr r = parser_reg(state, "test-rand1 rand r0 rand r1", helper_rand1); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-rand1:2d3:4d5"); eq(r, 0); eq(wasok, 1); ok; } static enum parser_error helper_opt0(struct parser *p) { const char *s0 = parser_getsym(p, "s0"); const char *s1 = parser_hasval(p, "s1") ? parser_getsym(p, "s1") : NULL; int *wasok = parser_priv(p); if (!s0 || strcmp(s0, "foo")) return PARSE_ERROR_GENERIC; if (s1 && !strcmp(s1, "bar")) *wasok = 2; else *wasok = 1; return PARSE_ERROR_NONE; } int test_opt0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-opt0 sym s0 ?sym s1", helper_opt0); eq(r, 0); parser_setpriv(state, &wasok); r = parser_parse(state, "test-opt0:foo"); eq(r, 0); eq(wasok, 1); require(parser_hasval(state, "s0")); require(!parser_hasval(state, "s1")); r = parser_parse(state, "test-opt0:foo:bar"); eq(r, 0); eq(wasok, 2); require(parser_hasval(state, "s0")); require(parser_hasval(state, "s1")); ok; } static enum parser_error helper_uint0(struct parser *p) { unsigned int a = parser_getuint(p, "u0"); int *wasok = parser_priv(p); if (a != 42) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_uint0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-uint0 uint u0", helper_uint0); enum parser_error e; eq(r, 0); parser_setpriv(state, &wasok); e = parser_parse(state, "test-uint0:42"); eq(e, PARSE_ERROR_NONE); eq(wasok, 1); ok; } int test_uint1(void *state) { errr r = parser_reg(state, "test-uint1 uint u0", ignored); enum parser_error e = parser_parse(state, "test-uint1:-2"); eq(r, 0); eq(e, PARSE_ERROR_NOT_NUMBER); ok; } static enum parser_error helper_char0(struct parser *p) { char c = parser_getchar(p, "c"); int *wasok = parser_priv(p); if (c != 'C') return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_char0(void *state) { int wasok = 0; errr r = parser_reg(state, "test-char0 char c", helper_char0); enum parser_error e; eq(r, 0); parser_setpriv(state, &wasok); e = parser_parse(state, "test-char0:C"); eq(e, PARSE_ERROR_NONE); eq(wasok, 1); ok; } static enum parser_error helper_char1(struct parser *p) { char c0 = parser_getchar(p, "c0"); char c1 = parser_getchar(p, "c1"); int i0 = parser_getint(p, "i0"); const char *s = parser_getstr(p, "s"); int *wasok = parser_priv(p); if (c0 != ':' || c1 != ':' || i0 != 34 || !streq(s, "lala")) return PARSE_ERROR_GENERIC; *wasok = 1; return PARSE_ERROR_NONE; } int test_char1(void *state) { int wasok = 0; errr r = parser_reg(state, "test-char1 char c0 int i0 char c1 str s", helper_char1); enum parser_error e; eq(r, 0); parser_setpriv(state, &wasok); e = parser_parse(state, "test-char1:::34:::lala"); eq(e, PARSE_ERROR_NONE); eq(wasok, 1); ok; } const char *suite_name = "parse/parser"; struct test tests[] = { { "priv", test_priv }, { "reg0", test_reg0 }, { "reg1", test_reg1 }, { "reg2", test_reg2 }, { "reg3", test_reg3 }, { "reg4", test_reg4 }, { "reg5", test_reg5 }, { "reg-int", test_reg_int }, { "reg-sym", test_reg_sym }, { "reg-str", test_reg_str }, { "blank", test_blank }, { "spaces", test_spaces }, { "comment0", test_comment0 }, { "comment1", test_comment1 }, { "syntax0", test_syntax0 }, { "syntax1", test_syntax1 }, { "syntax2", test_syntax2 }, { "sym0", test_sym0 }, { "sym1", test_sym1 }, { "int0", test_int0 }, { "int1", test_int1 }, { "str0", test_str0 }, { "rand0", test_rand0 }, { "rand1", test_rand1 }, { "opt0", test_opt0 }, { "uint0", test_uint0 }, { "uint1", test_uint1 }, { "char0", test_char0 }, { "char1", test_char1 }, { "baddir", test_baddir }, { NULL, NULL } }; angband-3.5.1/src/tests/parse/store.c0000644000175000017500000000262212456456606017005 0ustar chriscchrisc/* parse/store */ #include "unit-test.h" #include "store.h" int setup_tests(void **state) { *state = init_parse_stores(); return !*state; } int teardown_tests(void *state) { parser_destroy(state); return 0; } int test_store0(void *state) { enum parser_error r = parser_parse(state, "store:1:foobar"); struct store *s; eq(r, PARSE_ERROR_NONE); s = parser_priv(state); require(s); eq(s->sidx, 0); require(streq(s->name, "foobar")); ok; } int test_slots0(void *state) { enum parser_error r = parser_parse(state, "slots:2:33"); struct store *s; eq(r, PARSE_ERROR_NONE); s = parser_priv(state); require(s); eq(s->normal_stock_min, 2); eq(s->normal_stock_max, 33); ok; } int test_owner0(void *state) { enum parser_error r = parser_parse(state, "owner:5000:Foo"); struct store *s; eq(r, PARSE_ERROR_NONE); s = parser_priv(state); eq(s->owners->max_cost, 5000); require(streq(s->owners->name, "Foo")); ok; } /* Causes segfault: lookup_name() requires z_info/k_info */ int test_i0(void *state) { enum parser_error r = parser_parse(state, "normal:3:5"); struct store *s; eq(r, PARSE_ERROR_NONE); s = parser_priv(state); require(s); require(s->normal_table[0]); require(s->normal_table[1]); ok; } const char *suite_name = "parse/store"; struct test tests[] = { { "store0", test_store0 }, { "slots0", test_slots0 }, { "owner0", test_owner0 }, /* { "i0", test_i0 }, */ { NULL, NULL } }; angband-3.5.1/src/tests/player/0000755000175000017500000000000012456456606015665 5ustar chriscchriscangband-3.5.1/src/tests/player/suite.mk0000644000175000017500000000012512456456606017345 0ustar chriscchriscTESTPROGS += player/birth \ player/history \ player/player angband-3.5.1/src/tests/player/player.c0000644000175000017500000000304212456456606017324 0ustar chriscchrisc/* player/player */ #include "unit-test.h" #include "unit-test-data.h" #include "birth.h" #include "player/player.h" int setup_tests(void **state) { struct player *p = mem_zalloc(sizeof *p); player_init(p); *state = p; return 0; } int teardown_tests(void *state) { mem_free(state); return 0; } int test_stat_inc(void *state) { struct player *p = state; int v; p->stat_cur[A_STR] = 18 + 101; v = player_stat_inc(p, A_STR); require(!v); p->stat_cur[A_STR] = 15; player_stat_inc(p, A_STR); eq(p->stat_cur[A_STR], 16); player_stat_inc(p, A_STR); eq(p->stat_cur[A_STR], 17); player_stat_inc(p, A_STR); eq(p->stat_cur[A_STR], 18); player_stat_inc(p, A_STR); require(p->stat_cur[A_STR] > 18); ok; } int test_stat_dec(void *state) { struct player *p = state; int v; p->stat_cur[A_STR] = 3; p->stat_max[A_STR] = 3; v = player_stat_dec(p, A_STR, TRUE); require(!v); p->stat_cur[A_STR] = 15; p->stat_max[A_STR] = 15; player_stat_dec(p, A_STR, FALSE); eq(p->stat_cur[A_STR], 14); eq(p->stat_max[A_STR], 15); player_stat_dec(p, A_STR, TRUE); eq(p->stat_cur[A_STR], 13); eq(p->stat_max[A_STR], 14); p->stat_cur[A_STR] = 18+13; p->stat_max[A_STR] = 18+13; player_stat_dec(p, A_STR, FALSE); eq(p->stat_cur[A_STR], 18+03); eq(p->stat_max[A_STR], 18+13); p->stat_max[A_STR] = 18+03; player_stat_dec(p, A_STR, TRUE); eq(p->stat_cur[A_STR], 18); eq(p->stat_max[A_STR], 18); ok; } const char *suite_name = "player/player"; struct test tests[] = { { "stat-inc", test_stat_inc }, { "stat-dec", test_stat_dec }, { NULL, NULL } }; angband-3.5.1/src/tests/player/birth.c0000644000175000017500000000115612456456606017144 0ustar chriscchrisc/* player/birth */ #include "unit-test.h" #include "unit-test-data.h" #include "birth.h" int setup_tests(void **state) { struct player *p = mem_alloc(sizeof *p); player_init(p); *state = p; return 0; } int teardown_tests(void *state) { mem_free(state); return 0; } int test_generate0(void *state) { struct player *p = state; player_generate(p, &test_sex, &test_race, &test_class); eq(p->lev, 1); ptreq(p->sex, &test_sex); ptreq(p->race, &test_race); ptreq(p->class, &test_class); ok; } const char *suite_name = "player/birth"; struct test tests[] = { { "generate0", test_generate0 }, { NULL, NULL } }; angband-3.5.1/src/tests/player/history.c0000644000175000017500000000252712456456606017540 0ustar chriscchrisc/* player/history */ #include "player/player.h" #include "birth.h" #include "unit-test.h" NOTEARDOWN static struct history_chart ca; static struct history_chart cb; static struct history_chart cc; static struct history_entry ea0; static struct history_entry ea1; static struct history_entry eb0; static struct history_entry eb1; static struct history_entry ec0; static struct history_entry ec1; int setup_tests(void **state) { ca.entries = &ea0; cb.entries = &eb0; cc.entries = &ec0; ea0.next = &ea1; ea0.succ = &cb; ea0.roll = 50; ea0.text = "A0"; ea1.next = NULL; ea1.succ = &cc; ea1.roll = 100; ea1.text = "A1"; eb0.next = &eb1; eb0.succ = &cc; eb0.roll = 50; eb0.text = "B0"; eb1.next = NULL; eb1.succ = NULL; eb1.roll = 100; eb1.text = "B1"; ec0.next = &ec1; ec0.succ = NULL; ec0.roll = 50; ec0.text = "C0"; ec1.next = NULL; ec1.succ = NULL; ec1.roll = 100; ec1.text = "C1"; return 0; } int test_0(void *state) { int i; for (i = 0; i < 100; i++) { char *h = get_history(&ca); assert(h); eq(h[0], 'A'); require(isdigit(h[1])); require(h[2] == 'B' || h[2] == 'C'); require(isdigit(h[3])); if (h[2] == 'B' && h[4]) { require(h[4] == 'C'); require(isdigit(h[5])); } string_free(h); } ok; } const char *suite_name = "player/history"; struct test tests[] = { { "0", test_0 }, { NULL, NULL }, }; angband-3.5.1/src/tests/run-tests0000755000175000017500000000652412456456606016272 0ustar chriscchrisc#!/usr/bin/perl # # by Erik Osheim use warnings FATAL => 'all'; use strict; use File::Basename qw(dirname basename); use List::Util qw(first max); use Getopt::Long qw(:config bundling no_ignore_case); # some nice global variables my $quiet = 0; my $verbose = $ENV{VERBOSE}; my $usecolor = 1; sub usage { my $prog = basename($0); print < yellow >= 90% > red sub getcolor { my ($pass, $total) = @_; my $perc = $total ? ($pass * 100) / $total : 100; return $pass == $total ? \&green : $perc >= 90 ? \&yellow : \&red; } sub main { GetOptions( 'help|h' => sub { usage(0) }, 'color|c' => sub { $usecolor = 1 }, 'no-color|C' => sub { $usecolor = 0 }, 'verbose|v' => sub { $verbose = 1; $quiet = 0 }, 'quiet|q' => sub { $quiet = 1; $verbose = 0 }, ) || usage(1); my $dir = dirname($0) . '/bin'; my @paths = `find $dir -mindepth 2 -maxdepth 2 -type f -perm -u+x`; my $pass = 0; my $total = 0; my $maxpath = (max map { length($_) } @paths) - 3; my $len = $maxpath + 1 + 7; my $exitcode = 0; print "Running ", scalar(@paths), " suites:\n" unless $quiet; foreach my $path (sort @paths) { chomp $path; # actually run the test program here, getting the lines of output my @lines = $verbose ? `$path -v` : `$path`; if ($? != 0) { print red("$path: Suite died"), "\n"; $exitcode = $?; # We don't know how many tests the suite had, # but at least one failed $total += 1; next; } unless ($lines[-1] =~ m#^([^:]+) finished: (\d+)/(\d+) passed$#) { print red("$path: Malformed output"), "\n"; $exitcode = 1; next; } # tally the results $pass += $2; $total += $3; next if $quiet; # print a one-line summary of what happened my $ns = "$2/$3"; my $pad = $len - length($1) - length($ns); my $color = getcolor($2, $3); if ($verbose) { print ' ', $_ for @lines[0..$#lines - 1]; print ' ', $1, ' finished: ', &$color($ns), " passed\n"; } else { print ' ', $1, ' ' x $pad, &$color($ns), " passed\n"; } } # print a summary of all the test results my $color = getcolor($pass, $total); my $ns = join('', &$color("$pass/$total")); my $ps = join('', &$color(sprintf("%.1f%%", ($total ? ($pass * 100) / $total : 100)))); printf("Total: %s passed (%s)\n", $ns, $ps); if ($exitcode != 0 && $pass != $total) { $exitcode = 2; } exit($exitcode); } main(); angband-3.5.1/src/tests/z-textblock/0000755000175000017500000000000012456456606016637 5ustar chriscchriscangband-3.5.1/src/tests/z-textblock/suite.mk0000644000175000017500000000004312456456606020316 0ustar chriscchriscTESTPROGS += z-textblock/textblock angband-3.5.1/src/tests/z-textblock/textblock.c0000644000175000017500000000303212456456606021000 0ustar chriscchrisc/* z-quark/quark.c */ #include "unit-test.h" #include "z-textblock.h" #include "z-term.h" int setup_tests(void **state) { ok; } int teardown_tests(void *state) { ok; } int test_alloc(void *state) { textblock *tb = textblock_new(); require(tb); textblock_free(tb); ok; } int test_append(void *state) { textblock *tb = textblock_new(); require(!wcscmp(textblock_text(tb), L"")); textblock_append(tb, "Hello"); require(!wcscmp(textblock_text(tb), L"Hello")); textblock_append(tb, "%d", 20); require(!wcscmp(textblock_text(tb), L"Hello20")); ok; } int test_colour(void *state) { textblock *tb = textblock_new(); const char text[] = "two"; const byte attrs[] = { TERM_L_GREEN, TERM_L_GREEN, TERM_L_GREEN }; textblock_append_c(tb, TERM_L_GREEN, text); require(!memcmp(textblock_attrs(tb), attrs, 3)); ok; } int test_length(void *state) { textblock *tb = textblock_new(); const char text[] = "1234567"; const wchar_t test_text[] = L"1234567"; int i; const wchar_t *tb_text; /* Add it 32 times to make sure that appending definitely works */ for (i = 0; i < 32; i++) { textblock_append(tb, text); } /* Now make sure it's all right */ tb_text = textblock_text(tb); for (i = 0; i < 32; i++) { int n = N_ELEMENTS(text) - 1; int offset = i * n; require(!wmemcmp(tb_text + offset, test_text, n)); } ok; } const char *suite_name = "z-textblock/textblock"; struct test tests[] = { { "alloc", test_alloc }, { "append", test_append }, { "colour", test_colour }, { "length", test_length }, { NULL, NULL } }; angband-3.5.1/src/tests/Makefile0000644000175000017500000000125312456456606016032 0ustar chriscchrisc# Makefile for tests - builds unit-test binaries CFLAGS+=-I../ -I. -g LDFLAGS+=-lm -include config all : run SUITES := $(shell find . -maxdepth 1 -mindepth 1 -type d) SUITES := $(filter-out ./bin,$(SUITES)) include $(patsubst %,%/suite.mk,$(SUITES)) TESTOBJS := $(patsubst %,%.o,$(TESTPROGS)) TESTPROGS := $(patsubst %,bin/%,$(TESTPROGS)) TESTOBJS += unit-test.o build : $(TESTPROGS) run : build @./run-tests %.o : %.c @$(CC) $(CFLAGS) -c -o $@ $^ bin/% : %.o ../angband.o unit-test.o @mkdir -p $(shell echo "$$(dirname $@)") @$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LDADD) $(LIBS) @echo " CC $@" clean : $(RM) bin/*/* $(TESTOBJS) .PHONY : all clean .PRECIOUS : %.o angband-3.5.1/src/tests/unit-test-data.h0000644000175000017500000002665312456456606017421 0ustar chriscchrisc/* unit-test-data.h * Predefined data for tests */ #ifndef UNIT_TEST_DATA #define UNIT_TEST_DATA #ifndef TEST_DATA #ifdef __GNUC__ #define TEST_DATA __attribute__ ((unused)) #else #define TEST_DATA #endif #endif /* TEST_DATA */ #include "angband.h" #include "object/tvalsval.h" #include "player/player.h" static struct player_sex TEST_DATA test_sex = { .title = "Test Sex", .winner = "Test Winner", }; static struct object_base TEST_DATA sword_base = { .name = "Test Sword", .tval = TV_SWORD, .next = NULL, .break_perc = 50, }; static struct object_base TEST_DATA light_base = { .name = "Test Light~", .tval = TV_LIGHT, .next = NULL, .break_perc = 50, }; static struct object_base TEST_DATA flask_base = { .name = "Test Flask~", .tval = TV_FLASK, .next = NULL, .break_perc = 100, }; static struct object_base TEST_DATA rod_base = { .name = "Test Rod~", .tval = TV_ROD, .next = NULL, }; static struct artifact TEST_DATA test_artifact_sword = { .name = "Test Artifact", .text = "A test artifact.", .aidx = 0, .next = NULL, .tval = TV_SWORD, .sval = SV_LONG_SWORD, .to_a = 1, .to_h = 2, .to_d = 3, .ac = 5, .dd = 2, .ds = 5, .weight = 16, .cost = 40, }; static struct object_kind TEST_DATA test_longsword = { .name = "Test Longsword", .text = "A test longsword [0].", .base = &sword_base, .kidx = 0, .tval = TV_SWORD, .sval = SV_LONG_SWORD, .pval = { { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, }, .to_h = { .base = 1, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_d = { .base = 1, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_a = { .base = 2, .dice = 0, .sides = 0, .m_bonus = 0, }, .dd = 4, .ds = 6, .weight = 16, .cost = 20, .d_attr = 0, .d_char = L'|', .alloc_prob = 20, .alloc_min = 1, .alloc_max = 10, .level = 0, .effect = 0, .gen_mult_prob = 0, .flavor = NULL, }; static struct object_kind TEST_DATA test_torch = { .name = "Test Torch", .text = "A test torch [1].", .base = &light_base, .kidx = 1, .tval = TV_LIGHT, .sval = SV_LIGHT_TORCH, .pval = { { .base = 5000, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, }, .to_h = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_d = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_a = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .dd = 1, .ds = 1, .weight = 10, .cost = 1, .d_attr = 0, .d_char = L'~', .alloc_prob = 10, .alloc_min = 1, .alloc_max = 10, .level = 0, .effect = 0, .gen_mult_prob = 0, .flavor = NULL, }; static struct object_kind TEST_DATA test_lantern = { .name = "Test Lantern", .text = "A test lantern.", .base = &light_base, .kidx = 1, .tval = TV_LIGHT, .sval = SV_LIGHT_LANTERN, .pval = { { .base = 5000, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, }, .to_h = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_d = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_a = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .dd = 1, .ds = 1, .weight = 10, .cost = 1, .d_attr = 0, .d_char = L'~', .alloc_prob = 10, .alloc_min = 1, .alloc_max = 10, .level = 0, .effect = 0, .gen_mult_prob = 0, .flavor = NULL, }; static struct object_kind TEST_DATA test_flask = { .name = "Test Flask", .text = "A test flask.", .base = &flask_base, .kidx = 1, .tval = TV_FLASK, .sval = 0, .pval = { { .base = 7500, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, }, .to_h = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_d = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_a = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .dd = 1, .ds = 4, .weight = 20, .cost = 3, .d_attr = 11, .d_char = L'!', .alloc_prob = 50, .alloc_min = 1, .alloc_max = 100, .level = 1, .effect = 0, .gen_mult_prob = 0, .flavor = NULL, }; static struct object_kind TEST_DATA test_rod_treasure_location = { .name = "Test Rod of Treasure Location", .text = "A test rod of treasure location.", .base = &rod_base, .kidx = 1, .tval = TV_ROD, .sval = 1, .pval = { { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, }, .to_h = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_d = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_a = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .dd = 0, .ds = 0, .weight = 15, .cost = 1000, .d_attr = 0, .d_char = L'-', .alloc_prob = 30, .alloc_min = 8, .alloc_max = 75, .level = 5, .effect = 0, .gen_mult_prob = 0, .flavor = NULL, }; static struct object_kind TEST_DATA test_gold = { .name = "Test Gold", .text = "Test gold [2].", .kidx = 2, .tval = TV_GOLD, .sval = 0, .pval = { { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, }, .to_h = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_d = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .to_a = { .base = 0, .dice = 0, .sides = 0, .m_bonus = 0, }, .dd = 1, .ds = 1, .weight = 1, .cost = 0, .d_attr = 0, .d_char = L'$', .alloc_prob = 0, .alloc_min = 0, .alloc_max = 0, .level = 0, .effect = 0, .gen_mult_prob = 0, .flavor = NULL, }; static struct player_race TEST_DATA test_race = { .name = "TestRace", .r_adj = { [A_STR] = +2, [A_DEX] = +1, [A_CON] = +3, [A_INT] = -1, [A_WIS] = -2, }, .r_skills = { [SKILL_DISARM] = 0, [SKILL_DEVICE] = 5, [SKILL_SAVE] = 10, [SKILL_STEALTH] = -5, [SKILL_SEARCH] = -10, [SKILL_SEARCH_FREQUENCY] = 10, [SKILL_TO_HIT_MELEE] = 0, [SKILL_TO_HIT_BOW] = 0, [SKILL_TO_HIT_THROW] = 0, [SKILL_DIGGING] = 0, }, .r_mhp = 10, .r_exp = 110, .b_age = 14, .m_age = 6, .m_b_ht = 72, .m_m_ht = 6, .f_b_ht = 66, .f_m_ht = 4, .m_b_wt = 180, .m_m_wt = 25, .f_b_wt = 150, .f_m_wt = 20, .infra = 40, .choice = 0xFF, .history = NULL, }; static struct start_item TEST_DATA start_torch = { .kind = &test_torch, .min = 3, .max = 5, .next = NULL, }; static struct start_item TEST_DATA start_longsword = { .kind = &test_longsword, .min = 1, .max = 1, .next = &start_torch, }; static struct player_class TEST_DATA test_class = { .name = "TestClass", .title = { "TestTitle0", "TestTitle1", "TestTitle2", "TestTitle3", "TestTitle4", "TestTitle5", "TestTitle6", "TestTitle7", "TestTitle8", "TestTitle9", }, .c_adj = { [A_STR] = +1, [A_DEX] = +2, [A_CON] = -1, [A_INT] = -2, [A_WIS] = +3, }, .c_skills = { [SKILL_DISARM] = 25, [SKILL_DEVICE] = 18, [SKILL_SAVE] = 18, [SKILL_STEALTH] = 1, [SKILL_SEARCH] = 14, [SKILL_SEARCH_FREQUENCY] = 2, [SKILL_TO_HIT_MELEE] = 70, [SKILL_TO_HIT_BOW] = 55, [SKILL_TO_HIT_THROW] = 55, [SKILL_DIGGING] = 0, }, .x_skills = { [SKILL_DISARM] = 10, [SKILL_DEVICE] = 7, [SKILL_SAVE] = 10, [SKILL_STEALTH] = 0, [SKILL_SEARCH] = 0, [SKILL_SEARCH_FREQUENCY] = 0, [SKILL_TO_HIT_MELEE] = 45, [SKILL_TO_HIT_BOW] = 45, [SKILL_TO_HIT_THROW] = 45, [SKILL_DIGGING] = 0, }, .c_mhp = 9, .c_exp = 0, .max_attacks = 6, .min_weight = 30, .att_multiply = 5, .spell_book = 0, .spell_stat = 0, .spell_first = 0, .spell_weight = 0, .sense_base = 7000, .sense_div = 40, .start_items = &start_longsword, }; static struct monster_base TEST_DATA test_rb_townsfolk = { .next = NULL, .name = "townsfolk", .text = "Townsfolk", .flags = "\0\0\0\0\0\0\0\0\0\0\0\0", .spell_flags = "\0\0\0\0\0\0\0\0\0\0\0\0", .d_char = 116, .pain = NULL, }; static struct monster_base TEST_DATA test_rb_canine = { .next = &test_rb_townsfolk, .name = "canine", .text = "Canine", .flags = "\0\0\0\0\0\0\0\0\0\0\0\0", .spell_flags = "\0\0\0\0\0\0\0\0\0\0\0\0", .d_char = 100, .pain = NULL, }; static struct monster_base TEST_DATA test_rb_angel = { .next = &test_rb_canine, .name = "angel", .text = "Angel", .flags = "\0\0\0\0\0\0\0\0\0\0\0\0", .spell_flags = "\0\0\0\0\0\0\0\0\0\0\0\0", .d_char = 65, .pain = NULL, }; #define _NOBLOW { .method = RBM_NONE, .effect = RBE_NONE, .d_dice = 0, .d_side = 0 } static struct monster_race TEST_DATA test_r_human = { .next = NULL, .ridx = 0, .name = "Human", .text = "A random test human", .base = &test_rb_townsfolk, .avg_hp = 10, .ac = 12, .sleep = 0, .aaf = 20, .speed = 110, .mexp = 50, .power = 1, .scaled_power = 1, .highest_threat = 5, .freq_innate = 0, .freq_spell = 0, .blow = { { .method = RBM_HIT, .effect = RBE_HURT, .d_dice = 3, .d_side = 1, }, _NOBLOW, _NOBLOW, _NOBLOW, }, .level = 1, .rarity = 1, .d_attr = 0, .d_char = 't', .x_attr = 0, .x_char = 't', .max_num = 100, .cur_num = 0, .drops = NULL, }; static struct monster_race TEST_DATA test_r_littledog = { .next = NULL, .ridx = 0, .name = "Scruffy little dog", .text = "A random test dog", .base = &test_rb_canine, .avg_hp = 10, .ac = 12, .sleep = 0, .aaf = 20, .speed = 110, .mexp = 50, .power = 1, .scaled_power = 1, .highest_threat = 5, .freq_innate = 0, .freq_spell = 0, .blow = { { .method = RBM_HIT, .effect = RBE_HURT, .d_dice = 3, .d_side = 1, }, _NOBLOW, _NOBLOW, _NOBLOW, }, .level = 1, .rarity = 1, .d_attr = 0, .d_char = 't', .x_attr = 0, .x_char = 't', .max_num = 100, .cur_num = 0, .drops = NULL, }; #undef _NOBLOW static struct maxima TEST_DATA test_z_info = { .f_max = 2, .k_max = 2, .a_max = 2, .e_max = 2, .r_max = 2, .mp_max = 2, .s_max = 2, .pit_max = 2, .o_max = 2, .m_max = 2, }; static struct object TEST_DATA test_inven[ALL_INVEN_TOTAL]; static struct player TEST_DATA test_player = { .py = 1, .px = 1, .psex = 0, .sex = &test_sex, .race = &test_race, .class = &test_class, .hitdie = 10, .expfact = 100, .age = 12, .ht = 40, .wt = 80, .au = 500, .max_depth = 10, .depth = 6, .max_lev = 3, .lev = 3, .max_exp = 100, .exp = 80, .mhp = 20, .chp = 14, .msp = 12, .csp = 11, .stat_max = { [A_STR] = 14, [A_DEX] = 12, [A_CON] = 14, [A_WIS] = 10, [A_INT] = 8, }, .stat_cur = { [A_STR] = 14, [A_DEX] = 11, [A_CON] = 14, [A_WIS] = 10, [A_INT] = 8, }, .word_recall = 0, .energy = 100, .food = 5000, .player_hp = { 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 240, 245, 250 }, .history = "no history", .is_dead = 0, .wizard = 0, .inventory = &test_inven[0], }; #endif /* !UNIT_TEST_DATA */ angband-3.5.1/src/tests/pathfind/0000755000175000017500000000000012456456606016166 5ustar chriscchriscangband-3.5.1/src/tests/pathfind/suite.mk0000644000175000017500000000003712456456606017650 0ustar chriscchriscTESTPROGS += pathfind/pathfind angband-3.5.1/src/tests/pathfind/pathfind.c0000644000175000017500000000166412456456606020136 0ustar chriscchrisc/* pathfind/pathfind */ #include "unit-test.h" #include "game-cmd.h" #include "pathfind.h" NOSETUP NOTEARDOWN int test_dir_to(void *state) { eq(pathfind_direction_to(loc(0,0), loc(0,1)), DIR_N); eq(pathfind_direction_to(loc(0,0), loc(1,0)), DIR_E); eq(pathfind_direction_to(loc(0,0), loc(1,1)), DIR_NE); eq(pathfind_direction_to(loc(0,0), loc(0,-1)), DIR_S); eq(pathfind_direction_to(loc(0,0), loc(-1,0)), DIR_W); eq(pathfind_direction_to(loc(0,0), loc(-1,-1)), DIR_SW); eq(pathfind_direction_to(loc(0,0), loc(-1,1)), DIR_NW); eq(pathfind_direction_to(loc(0,0), loc(1,-1)), DIR_SE); eq(pathfind_direction_to(loc(0,0), loc(0,0)), DIR_NONE); eq(pathfind_direction_to(loc(0,0), loc(1,10)), DIR_N); eq(pathfind_direction_to(loc(0,0), loc(8,10)), DIR_NE); eq(pathfind_direction_to(loc(0,0), loc(12,4)), DIR_E); ok; } const char *suite_name = "pathfind/pathfind"; struct test tests[] = { { "dir-to", test_dir_to }, { NULL, NULL }, }; angband-3.5.1/src/tests/z-virt/0000755000175000017500000000000012456456606015624 5ustar chriscchriscangband-3.5.1/src/tests/z-virt/suite.mk0000644000175000017500000000004612456456606017306 0ustar chriscchriscTESTPROGS += z-virt/mem z-virt/string angband-3.5.1/src/tests/z-virt/mem.c0000644000175000017500000000106312456456606016546 0ustar chriscchrisc/* z-virt/mem */ #include "unit-test.h" #include "z-virt.h" NOSETUP NOTEARDOWN int test_alloc(void *state) { void *p1 = mem_alloc(16); void *p2 = mem_alloc(16); require(p1 != p2); memset(p1, 0x1, 16); memset(p2, 0x2, 16); mem_free(p1); mem_free(p2); return 0; } int test_realloc(void *state) { void *p1 = mem_realloc(NULL, 32); void *p2 = mem_realloc(p1, 64); memset(p2, 0x3, 64); mem_free(p2); return 0; } const char *suite_name = "z-virt/mem"; struct test tests[] = { { "alloc", test_alloc }, { "realloc", test_realloc }, { NULL, NULL } }; angband-3.5.1/src/tests/z-virt/string.c0000644000175000017500000000254112456456606017300 0ustar chriscchrisc/* z-virt/string.c */ #include "unit-test.h" #include "z-virt.h" NOSETUP NOTEARDOWN int test_string_make(void *state) { char *s1 = string_make("foo"); require(s1); require(!strcmp(s1, "foo")); string_free(s1); ok; } int test_string_make_null(void *state) { char *s1 = string_make(NULL); require(!s1); ok; } int test_string_free_null(void *state) { string_free(NULL); ok; } int test_string_append(void *state) { char *s1 = string_make("foo"); char *s3 = string_append(s1, "bar"); require(s3); require(!strcmp(s3, "foobar")); string_free(s3); ok; } int test_string_append_null0(void *state) { char *r = string_append(NULL, "foo"); require(r); require(!strcmp(r, "foo")); string_free(r); ok; } int test_string_append_null1(void *state) { char *s = string_make("bar"); char *r = string_append(s, NULL); require(r); require(!strcmp(r, "bar")); string_free(r); ok; } int test_string_append_null2(void *state) { char *r = string_append(NULL, NULL); require(!r); ok; } const char *suite_name = "z-virt/string"; struct test tests[] = { { "make", test_string_make }, { "make-null", test_string_make_null }, { "free-null", test_string_free_null }, { "append", test_string_append }, { "append-null0", test_string_append_null0 }, { "append-null1", test_string_append_null1 }, { "append-null2", test_string_append_null2 }, { NULL, NULL } }; angband-3.5.1/src/tests/command/0000755000175000017500000000000012456456606016007 5ustar chriscchriscangband-3.5.1/src/tests/command/suite.mk0000644000175000017500000000003412456456606017466 0ustar chriscchriscTESTPROGS += command/lookup angband-3.5.1/src/tests/command/lookup.c0000644000175000017500000000325612456456606017472 0ustar chriscchrisc/* command/lookup * * Tests for command lookup * * Created by: myshkin * 1 May 2011 */ #include "unit-test.h" #include "object/obj-flag.h" #include "object/object.h" #include "cmds.h" #include "keymap.h" #include "ui-event.h" #include "z-virt.h" int setup_tests(void **state) { cmd_init(); *state = 0; return 0; } int teardown_tests(void *state) { mem_free(state); return 0; } /* Regression test for #1330 */ int test_cmd_lookup_orig(void *state) { require(cmd_lookup('Z', KEYMAP_MODE_ORIG) == CMD_NULL); require(cmd_lookup('{', KEYMAP_MODE_ORIG) == CMD_INSCRIBE); require(cmd_lookup('u', KEYMAP_MODE_ORIG) == CMD_USE_STAFF); require(cmd_lookup('T', KEYMAP_MODE_ORIG) == CMD_TUNNEL); require(cmd_lookup('g', KEYMAP_MODE_ORIG) == CMD_PICKUP); require(cmd_lookup('G', KEYMAP_MODE_ORIG) == CMD_STUDY_BOOK); require(cmd_lookup(KTRL('S'), KEYMAP_MODE_ORIG) == CMD_SAVE); require(cmd_lookup('+', KEYMAP_MODE_ORIG) == CMD_ALTER); ok; } /* Introduced after commit 8871070 added modes to cmd_lookup() calls */ int test_cmd_lookup_rogue(void *state) { require(cmd_lookup('{', KEYMAP_MODE_ROGUE) == CMD_INSCRIBE); require(cmd_lookup('Z', KEYMAP_MODE_ROGUE) == CMD_USE_STAFF); require(cmd_lookup(KTRL('T'), KEYMAP_MODE_ROGUE) == CMD_TUNNEL); require(cmd_lookup('g', KEYMAP_MODE_ROGUE) == CMD_PICKUP); require(cmd_lookup('G', KEYMAP_MODE_ROGUE) == CMD_STUDY_BOOK); require(cmd_lookup(KTRL('S'), KEYMAP_MODE_ROGUE) == CMD_SAVE); require(cmd_lookup('+', KEYMAP_MODE_ROGUE) == CMD_ALTER); ok; } const char *suite_name = "command/lookup"; struct test tests[] = { { "cmd_lookup_orig", test_cmd_lookup_orig }, { "cmd_lookup_rogue", test_cmd_lookup_rogue }, { NULL, NULL } }; angband-3.5.1/src/tests/object/0000755000175000017500000000000012456456606015637 5ustar chriscchriscangband-3.5.1/src/tests/object/suite.mk0000644000175000017500000000004712456456606017322 0ustar chriscchriscTESTPROGS += object/attack object/util angband-3.5.1/src/tests/object/attack.c0000644000175000017500000000115412456456606017253 0ustar chriscchrisc/* object/attack */ #include "unit-test.h" #include "unit-test-data.h" #include "attack.h" #include "object/object.h" NOSETUP NOTEARDOWN int test_breakage_chance(void *state) { struct object obj; int c; object_prep(&obj, &test_longsword, 1, AVERAGE); c = breakage_chance(&obj, TRUE); eq(c, 50); c = breakage_chance(&obj, FALSE); eq(c, 25); obj.artifact = &test_artifact_sword; c = breakage_chance(&obj, TRUE); eq(c, 0); c = breakage_chance(&obj, FALSE); eq(c, 0); ok; } const char *suite_name = "object/attack"; struct test tests[] = { { "breakage-chance", test_breakage_chance }, { NULL, NULL } }; angband-3.5.1/src/tests/object/util.c0000644000175000017500000000275412456456606016770 0ustar chriscchrisc/* object/util */ #include "unit-test.h" #include "unit-test-data.h" #include "object/object.h" int setup_tests(void **state) { p_ptr->inventory = &test_inven[0]; return 0; } NOTEARDOWN /* Regression test for #1661 */ int test_obj_can_refill(void *state) { struct object obj_torch, obj_lantern, obj_candidate; object_type *light_ptr = &p_ptr->inventory[INVEN_LIGHT]; /* Torches cannot be refilled */ object_prep(&obj_torch, &test_torch, 1, AVERAGE); object_copy(light_ptr, &obj_torch); eq(obj_can_refill(&obj_torch), FALSE); /* Lanterns can be refilled */ object_prep(&obj_lantern, &test_lantern, 1, AVERAGE); object_copy(light_ptr, &obj_lantern); /* Not by torches */ eq(obj_can_refill(&obj_torch), FALSE); /* Lanterns can be refilled by other lanterns */ eq(obj_can_refill(&obj_lantern), TRUE); /* ...but not by empty lanterns */ obj_lantern.timeout = 0; eq(obj_can_refill(&obj_lantern), FALSE); /* Lanterns can be refilled by flasks of oil */ object_prep(&obj_candidate, &test_flask, 1, AVERAGE); eq(obj_can_refill(&obj_candidate), TRUE); /* Lanterns cannot be refilled by charging rods of treasure detection */ object_prep(&obj_candidate, &test_rod_treasure_location, 1, AVERAGE); obj_candidate.timeout = 50; eq(obj_can_refill(&obj_candidate), FALSE); ok; } const char *suite_name = "object/util"; struct test tests[] = { { "obj_can_refill", test_obj_can_refill }, { NULL, NULL } }; angband-3.5.1/src/tests/README0000644000175000017500000000253112456456606015252 0ustar chriscchriscelly/angband unit tests This directory contains the unit tests for the Angband engine. As we refactor the engine to be more modular, the number of tests will grow. A unit test is a C program which links against angband.o and tests the desired functions. To make writing these tests easier, there is a header file (at /src/tests/unit-test.h) which defines a particular main function which runs a set of specified tests in sequence. Using unit-test.h: To use this test template, your test needs to supply four things: static struct test tests[]: A list of all the tests to run, terminated by a test with a null name. static int setup(void **data): A function to set up this suite of tests; may do something like preallocate file handles and such. The `data` argument points to a pointer which is supplied to all unit test functions and the teardown function. static int teardown(void *data): Clean up after the test; close file handles, etc. static const char *suite_name: The test suite name. For examples, see the /src/tests/trivial. Using unit-test-data.h: Since we're testing a game engine, many times we will need dummy races, classes, etc to pass in to functions we'd like to test. Creating these is time-consuming since some of the structures involved are fairly large; unit-test-data.h defines test objects of most types to ease this pain. angband-3.5.1/src/tests/trivial/0000755000175000017500000000000012456456606016043 5ustar chriscchriscangband-3.5.1/src/tests/trivial/suite.mk0000644000175000017500000000003512456456606017523 0ustar chriscchriscTESTPROGS += trivial/trivial angband-3.5.1/src/tests/trivial/trivial.c0000644000175000017500000000046012456456606017661 0ustar chriscchrisc/* trivial/trivial.c */ #include "unit-test.h" NOSETUP NOTEARDOWN int test_empty(void *state) { ok; } int test_require(void *state) { require(1); ok; } const char *suite_name = "trivial/trivial"; struct test tests[] = { { "empty", test_empty }, { "require", test_require }, { NULL, NULL }, }; angband-3.5.1/src/tests/unit-test.h0000644000175000017500000000327612456456606016506 0ustar chriscchrisc/* unit-test.h */ #ifndef UNIT_TEST_H #define UNIT_TEST_H #include "unit-test-types.h" #include "z-util.h" #define TEST extern int verbose; extern int showpass(void); extern int showfail(void); /* Forward declaration, since suite_names may be at the end of the test * file. */ const char *suite_name; #define NOSETUP int setup_tests(void **data) { return 0; } #define NOTEARDOWN int teardown_tests(void *data) { return 0; } #define ok return showpass(); #define eq(x,y) \ if ((x) != (y)) { \ if (verbose) { \ showfail(); \ printf(" %s:%d: requirement '%s' == '%s' failed\n", suite_name, \ __LINE__, #x, #y); \ printf(" %s: 0x%016lld\n", #x, (long long)x); \ printf(" %s: 0x%016lld\n", #y, (long long)y); \ } \ return 1; \ } #define require(x) \ do { \ if (!(x)) { \ if (verbose) \ showfail(); \ printf(" %s:%d: requirement '%s' failed\n", \ suite_name, __LINE__, #x); \ return 1; \ } \ } while (0) #if __WORDSIZE == 64 #define ptreq(x,y) \ if ((x) != (y)) { \ if (verbose) { \ showfail(); \ printf(" %s:%d: requirement '%s' == '%s' failed\n", suite_name, \ __LINE__, #x, #y); \ printf(" %s: 0x%016llx\n", #x, (unsigned long long)(x)); \ printf(" %s: 0x%016llx\n", #y, (unsigned long long)(y)); \ } \ return 1; \ } #else #define ptreq(x,y) \ if ((x) != (y)) { \ if (verbose) { \ showfail(); \ printf(" %s:%d: requirement '%s' == '%s' failed\n", suite_name, \ __LINE__, #x, #y); \ printf(" %s: 0x%08lx\n", #x, (unsigned long)(x)); \ printf(" %s: 0x%08lx\n", #y, (unsigned long)(y)); \ } \ return 1; \ } #endif #endif /* !UNIT_TEST_H */ angband-3.5.1/src/xtra3.c0000644000175000017500000013024312456456607014440 0ustar chriscchrisc/* * File: xtra3.c * Purpose: Handles the setting up updating, and cleaning up of the various * things that are displayed by the game. * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * Copyright (c) 2007 Antony Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "cave.h" #include "files.h" #include "game-event.h" #include "game-cmd.h" #include "grafmode.h" #include "hint.h" #include "monster/mon-lore.h" #include "monster/mon-list.h" #include "monster/mon-util.h" #include "monster/monster.h" #include "object/obj-list.h" #include "object/tvalsval.h" #include "textui.h" #include "ui-birth.h" /* * There are a few functions installed to be triggered by several * of the basic player events. For convenience, these have been grouped * in this list. */ static game_event_type player_events[] = { EVENT_RACE_CLASS, EVENT_PLAYERTITLE, EVENT_EXPERIENCE, EVENT_PLAYERLEVEL, EVENT_GOLD, EVENT_EQUIPMENT, /* For equippy chars */ EVENT_STATS, EVENT_HP, EVENT_MANA, EVENT_AC, EVENT_MONSTERHEALTH, EVENT_PLAYERSPEED, EVENT_DUNGEONLEVEL, }; static game_event_type statusline_events[] = { EVENT_STUDYSTATUS, EVENT_STATUS, EVENT_DETECTIONSTATUS, EVENT_STATE, }; /* * Converts stat num into a six-char (right justified) string */ void cnv_stat(int val, char *out_val, size_t out_len) { /* Above 18 */ if (val > 18) { int bonus = (val - 18); if (bonus >= 220) strnfmt(out_val, out_len, "18/***"); else if (bonus >= 100) strnfmt(out_val, out_len, "18/%03d", bonus); else strnfmt(out_val, out_len, " 18/%02d", bonus); } /* From 3 to 18 */ else { strnfmt(out_val, out_len, " %2d", val); } } /* ------------------------------------------------------------------------ * Sidebar display functions * ------------------------------------------------------------------------ */ /* * Print character info at given row, column in a 13 char field */ static void prt_field(const char *info, int row, int col) { /* Dump 13 spaces to clear */ c_put_str(TERM_WHITE, " ", row, col); /* Dump the info itself */ c_put_str(TERM_L_BLUE, info, row, col); } /* * Print character stat in given row, column */ static void prt_stat(int stat, int row, int col) { char tmp[32]; /* Display "injured" stat */ if (p_ptr->stat_cur[stat] < p_ptr->stat_max[stat]) { put_str(stat_names_reduced[stat], row, col); cnv_stat(p_ptr->state.stat_use[stat], tmp, sizeof(tmp)); c_put_str(TERM_YELLOW, tmp, row, col + 6); } /* Display "healthy" stat */ else { put_str(stat_names[stat], row, col); cnv_stat(p_ptr->state.stat_use[stat], tmp, sizeof(tmp)); c_put_str(TERM_L_GREEN, tmp, row, col + 6); } /* Indicate natural maximum */ if (p_ptr->stat_max[stat] == 18+100) { put_str("!", row, col + 3); } } /* * Prints "title", including "wizard" or "winner" as needed. */ static void prt_title(int row, int col) { const char *p; /* Wizard */ if (p_ptr->wizard) { p = "[=-WIZARD-=]"; } /* Winner */ else if (p_ptr->total_winner || (p_ptr->lev > PY_MAX_LEVEL)) { p = "***WINNER***"; } /* Normal */ else { p = p_ptr->class->title[(p_ptr->lev - 1) / 5]; } prt_field(p, row, col); } /* * Prints level */ static void prt_level(int row, int col) { char tmp[32]; strnfmt(tmp, sizeof(tmp), "%6d", p_ptr->lev); if (p_ptr->lev >= p_ptr->max_lev) { put_str("LEVEL ", row, col); c_put_str(TERM_L_GREEN, tmp, row, col + 6); } else { put_str("Level ", row, col); c_put_str(TERM_YELLOW, tmp, row, col + 6); } } /* * Display the experience */ static void prt_exp(int row, int col) { char out_val[32]; bool lev50 = (p_ptr->lev == 50); long xp = (long)p_ptr->exp; /* Calculate XP for next level */ if (!lev50) xp = (long)(player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp; /* Format XP */ strnfmt(out_val, sizeof(out_val), "%8ld", (long)xp); if (p_ptr->exp >= p_ptr->max_exp) { put_str((lev50 ? "EXP" : "NXT"), row, col); c_put_str(TERM_L_GREEN, out_val, row, col + 4); } else { put_str((lev50 ? "Exp" : "Nxt"), row, col); c_put_str(TERM_YELLOW, out_val, row, col + 4); } } /* * Prints current gold */ static void prt_gold(int row, int col) { char tmp[32]; put_str("AU ", row, col); strnfmt(tmp, sizeof(tmp), "%9ld", (long)p_ptr->au); c_put_str(TERM_L_GREEN, tmp, row, col + 3); } /* * Equippy chars */ static void prt_equippy(int row, int col) { int i; byte a; wchar_t c; object_type *o_ptr; /* No equippy chars in bigtile mode */ if (tile_width > 1 || tile_height > 1) return; /* Dump equippy chars */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { /* Object */ o_ptr = &p_ptr->inventory[i]; if (o_ptr->kind) { c = object_char(o_ptr); a = object_attr(o_ptr); } else { c = ' '; a = TERM_WHITE; } /* Dump */ Term_putch(col + i - INVEN_WIELD, row, a, c); } } /* * Prints current AC */ static void prt_ac(int row, int col) { char tmp[32]; put_str("Cur AC ", row, col); strnfmt(tmp, sizeof(tmp), "%5d", p_ptr->state.dis_ac + p_ptr->state.dis_to_a); c_put_str(TERM_L_GREEN, tmp, row, col + 7); } /* * Prints Cur hit points */ static void prt_hp(int row, int col) { char cur_hp[32], max_hp[32]; byte color = player_hp_attr(p_ptr); put_str("HP ", row, col); strnfmt(max_hp, sizeof(max_hp), "%4d", p_ptr->mhp); strnfmt(cur_hp, sizeof(cur_hp), "%4d", p_ptr->chp); c_put_str(color, cur_hp, row, col + 3); c_put_str(TERM_WHITE, "/", row, col + 7); c_put_str(TERM_L_GREEN, max_hp, row, col + 8); } /* * Prints players max/cur spell points */ static void prt_sp(int row, int col) { char cur_sp[32], max_sp[32]; byte color = player_sp_attr(p_ptr); /* Do not show mana unless we have some */ if (!p_ptr->msp) return; put_str("SP ", row, col); strnfmt(max_sp, sizeof(max_sp), "%4d", p_ptr->msp); strnfmt(cur_sp, sizeof(cur_sp), "%4d", p_ptr->csp); /* Show mana */ c_put_str(color, cur_sp, row, col + 3); c_put_str(TERM_WHITE, "/", row, col + 7); c_put_str(TERM_L_GREEN, max_sp, row, col + 8); } /* * Calculate the monster bar color separately, for ports. */ byte monster_health_attr(void) { struct monster *mon = p_ptr->health_who; byte attr; if (!mon) { /* Not tracking */ attr = TERM_DARK; } else if (!mon->ml || mon->hp < 0 || p_ptr->timed[TMD_IMAGE]) { /* The monster health is "unknown" */ attr = TERM_WHITE; } else { int pct; /* Default to almost dead */ attr = TERM_RED; /* Extract the "percent" of health */ pct = 100L * mon->hp / mon->maxhp; /* Badly wounded */ if (pct >= 10) attr = TERM_L_RED; /* Wounded */ if (pct >= 25) attr = TERM_ORANGE; /* Somewhat Wounded */ if (pct >= 60) attr = TERM_YELLOW; /* Healthy */ if (pct >= 100) attr = TERM_L_GREEN; /* Afraid */ if (mon->m_timed[MON_TMD_FEAR]) attr = TERM_VIOLET; /* Confused */ if (mon->m_timed[MON_TMD_CONF]) attr = TERM_UMBER; /* Stunned */ if (mon->m_timed[MON_TMD_STUN]) attr = TERM_L_BLUE; /* Asleep */ if (mon->m_timed[MON_TMD_SLEEP]) attr = TERM_BLUE; } return attr; } /* * Redraw the "monster health bar" * * The "monster health bar" provides visual feedback on the "health" * of the monster currently being "tracked". There are several ways * to "track" a monster, including targetting it, attacking it, and * affecting it (and nobody else) with a ranged attack. When nothing * is being tracked, we clear the health bar. If the monster being * tracked is not currently visible, a special health bar is shown. */ static void prt_health(int row, int col) { byte attr = monster_health_attr(); struct monster *mon = p_ptr->health_who; /* Not tracking */ if (!mon) { /* Erase the health bar */ Term_erase(col, row, 12); return; } /* Tracking an unseen, hallucinatory, or dead monster */ if (!mon->ml || /* Unseen */ (p_ptr->timed[TMD_IMAGE]) || /* Hallucination */ (mon->hp < 0)) /* Dead (?) */ { /* The monster health is "unknown" */ Term_putstr(col, row, 12, attr, "[----------]"); } /* Tracking a visible monster */ else { /* Extract the "percent" of health */ int pct = 100L * mon->hp / mon->maxhp; /* Convert percent into "health" */ int len = (pct < 10) ? 1 : (pct < 90) ? (pct / 10 + 1) : 10; /* Default to "unknown" */ Term_putstr(col, row, 12, TERM_WHITE, "[----------]"); /* Dump the current "health" (use '*' symbols) */ Term_putstr(col + 1, row, len, attr, "**********"); } } /* * Prints the speed of a character. */ static void prt_speed(int row, int col) { int i = p_ptr->state.speed; byte attr = TERM_WHITE; const char *type = NULL; char buf[32] = ""; /* Hack -- Visually "undo" the Search Mode Slowdown */ if (p_ptr->searching) i += 10; /* Fast */ if (i > 110) { attr = TERM_L_GREEN; type = "Fast"; } /* Slow */ else if (i < 110) { attr = TERM_L_UMBER; type = "Slow"; } if (type) strnfmt(buf, sizeof(buf), "%s (%+d)", type, (i - 110)); /* Display the speed */ c_put_str(attr, format("%-10s", buf), row, col); } /* * Prints depth in stat area */ static void prt_depth(int row, int col) { char depths[32]; if (!p_ptr->depth) { my_strcpy(depths, "Town", sizeof(depths)); } else { strnfmt(depths, sizeof(depths), "%d' (L%d)", p_ptr->depth * 50, p_ptr->depth); } /* Right-Adjust the "depth", and clear old values */ put_str(format("%-13s", depths), row, col); } /* Some simple wrapper functions */ static void prt_str(int row, int col) { prt_stat(A_STR, row, col); } static void prt_dex(int row, int col) { prt_stat(A_DEX, row, col); } static void prt_wis(int row, int col) { prt_stat(A_WIS, row, col); } static void prt_int(int row, int col) { prt_stat(A_INT, row, col); } static void prt_con(int row, int col) { prt_stat(A_CON, row, col); } static void prt_race(int row, int col) { prt_field(p_ptr->race->name, row, col); } static void prt_class(int row, int col) { prt_field(p_ptr->class->name, row, col); } /* * Struct of sidebar handlers. */ static const struct side_handler_t { void (*hook)(int, int); /* int row, int col */ int priority; /* 1 is most important (always displayed) */ game_event_type type; /* PR_* flag this corresponds to */ } side_handlers[] = { { prt_race, 19, EVENT_RACE_CLASS }, { prt_title, 18, EVENT_PLAYERTITLE }, { prt_class, 22, EVENT_RACE_CLASS }, { prt_level, 10, EVENT_PLAYERLEVEL }, { prt_exp, 16, EVENT_EXPERIENCE }, { prt_gold, 11, EVENT_GOLD }, { prt_equippy, 17, EVENT_EQUIPMENT }, { prt_str, 6, EVENT_STATS }, { prt_int, 5, EVENT_STATS }, { prt_wis, 4, EVENT_STATS }, { prt_dex, 3, EVENT_STATS }, { prt_con, 2, EVENT_STATS }, { NULL, 15, 0 }, { prt_ac, 7, EVENT_AC }, { prt_hp, 8, EVENT_HP }, { prt_sp, 9, EVENT_MANA }, { NULL, 21, 0 }, { prt_health, 12, EVENT_MONSTERHEALTH }, { NULL, 20, 0 }, { NULL, 22, 0 }, { prt_speed, 13, EVENT_PLAYERSPEED }, /* Slow (-NN) / Fast (+NN) */ { prt_depth, 14, EVENT_DUNGEONLEVEL }, /* Lev NNN / NNNN ft */ }; /* * This prints the sidebar, using a clever method which means that it will only * print as much as can be displayed on <24-line screens. * * Each row is given a priority; the least important higher numbers and the most * important lower numbers. As the screen gets smaller, the rows start to * disappear in the order of lowest to highest importance. */ static void update_sidebar(game_event_type type, game_event_data *data, void *user) { int x, y, row; int max_priority; size_t i; Term_get_size(&x, &y); /* Keep the top and bottom lines clear. */ max_priority = y - 2; /* Display list entries */ for (i = 0, row = 1; i < N_ELEMENTS(side_handlers); i++) { const struct side_handler_t *hnd = &side_handlers[i]; int priority = hnd->priority; bool from_bottom = FALSE; /* Negative means print from bottom */ if (priority < 0) { priority = -priority; from_bottom = TRUE; } /* If this is high enough priority, display it */ if (priority <= max_priority) { if (hnd->type == type && hnd->hook) { if (from_bottom) hnd->hook(Term->hgt - (N_ELEMENTS(side_handlers) - i), 0); else hnd->hook(row, 0); } /* Increment for next time */ row++; } } } static void hp_colour_change(game_event_type type, game_event_data *data, void *user) { /* * hack: redraw player, since the player's color * now indicates approximate health. Note that * using this command when graphics mode is on * causes the character to be a black square. */ if ((OPT(hp_changes_color)) && (use_graphics == GRAPHICS_NONE)) { cave_light_spot(cave, p_ptr->py, p_ptr->px); } } /* ------------------------------------------------------------------------ * Status line display functions * ------------------------------------------------------------------------ */ /* Simple macro to initialise structs */ #define S(s) s, sizeof(s) /* * Struct to describe different timed effects */ struct state_info { int value; const char *str; size_t len; byte attr; }; /* TMD_CUT descriptions */ static const struct state_info cut_data[] = { { 1000, S("Mortal wound"), TERM_L_RED }, { 200, S("Deep gash"), TERM_RED }, { 100, S("Severe cut"), TERM_RED }, { 50, S("Nasty cut"), TERM_ORANGE }, { 25, S("Bad cut"), TERM_ORANGE }, { 10, S("Light cut"), TERM_YELLOW }, { 0, S("Graze"), TERM_YELLOW }, }; /* TMD_STUN descriptions */ static const struct state_info stun_data[] = { { 100, S("Knocked out"), TERM_RED }, { 50, S("Heavy stun"), TERM_ORANGE }, { 0, S("Stun"), TERM_ORANGE }, }; /* p_ptr->hunger descriptions */ static const struct state_info hunger_data[] = { { PY_FOOD_FAINT, S("Faint"), TERM_RED }, { PY_FOOD_WEAK, S("Weak"), TERM_ORANGE }, { PY_FOOD_ALERT, S("Hungry"), TERM_YELLOW }, { PY_FOOD_FULL, S(""), TERM_L_GREEN }, { PY_FOOD_MAX, S("Full"), TERM_L_GREEN }, }; /* For the various TMD_* effects */ static const struct state_info effects[] = { { TMD_BLIND, S("Blind"), TERM_ORANGE }, { TMD_PARALYZED, S("Paralyzed!"), TERM_RED }, { TMD_CONFUSED, S("Confused"), TERM_ORANGE }, { TMD_AFRAID, S("Afraid"), TERM_ORANGE }, { TMD_TERROR, S("Terror"), TERM_RED }, { TMD_IMAGE, S("Halluc"), TERM_ORANGE }, { TMD_POISONED, S("Poisoned"), TERM_ORANGE }, { TMD_PROTEVIL, S("ProtEvil"), TERM_L_GREEN }, { TMD_SPRINT, S("Sprint"), TERM_L_GREEN }, { TMD_TELEPATHY, S("ESP"), TERM_L_BLUE }, { TMD_INVULN, S("Invuln"), TERM_L_GREEN }, { TMD_HERO, S("Hero"), TERM_L_GREEN }, { TMD_SHERO, S("Berserk"), TERM_L_GREEN }, { TMD_BOLD, S("Bold"), TERM_L_GREEN }, { TMD_STONESKIN, S("Stone"), TERM_L_GREEN }, { TMD_SHIELD, S("Shield"), TERM_L_GREEN }, { TMD_BLESSED, S("Blssd"), TERM_L_GREEN }, { TMD_SINVIS, S("SInvis"), TERM_L_GREEN }, { TMD_SINFRA, S("Infra"), TERM_L_GREEN }, { TMD_OPP_ACID, S("RAcid"), TERM_SLATE }, { TMD_OPP_ELEC, S("RElec"), TERM_BLUE }, { TMD_OPP_FIRE, S("RFire"), TERM_RED }, { TMD_OPP_COLD, S("RCold"), TERM_WHITE }, { TMD_OPP_POIS, S("RPois"), TERM_GREEN }, { TMD_OPP_CONF, S("RConf"), TERM_VIOLET }, { TMD_AMNESIA, S("Amnesiac"), TERM_ORANGE }, }; #define PRINT_STATE(sym, data, index, row, col) \ { \ size_t i; \ \ for (i = 0; i < N_ELEMENTS(data); i++) \ { \ if (index sym data[i].value) \ { \ if (data[i].str[0]) \ { \ c_put_str(data[i].attr, data[i].str, row, col); \ return data[i].len; \ } \ else \ { \ return 0; \ } \ } \ } \ } /* * Print recall status. */ static size_t prt_recall(int row, int col) { if (p_ptr->word_recall) { c_put_str(TERM_WHITE, "Recall", row, col); return sizeof "Recall"; } return 0; } /* * Print cut indicator. */ static size_t prt_cut(int row, int col) { PRINT_STATE(>, cut_data, p_ptr->timed[TMD_CUT], row, col); return 0; } /* * Print stun indicator. */ static size_t prt_stun(int row, int col) { PRINT_STATE(>, stun_data, p_ptr->timed[TMD_STUN], row, col); return 0; } /* * Prints status of hunger */ static size_t prt_hunger(int row, int col) { PRINT_STATE(<=, hunger_data, p_ptr->food, row, col); return 0; } /* * Prints Searching, Resting, or 'count' status * Display is always exactly 10 characters wide (see below) * * This function was a major bottleneck when resting, so a lot of * the text formatting code was optimized in place below. */ static size_t prt_state(int row, int col) { byte attr = TERM_WHITE; char text[16] = ""; /* Resting */ if (player_is_resting(p_ptr)) { int i; int n = player_resting_count(p_ptr); /* Start with "Rest" */ my_strcpy(text, "Rest ", sizeof(text)); /* Extensive (timed) rest */ if (n >= 1000) { i = n / 100; text[9] = '0'; text[8] = '0'; text[7] = I2D(i % 10); if (i >= 10) { i = i / 10; text[6] = I2D(i % 10); if (i >= 10) { text[5] = I2D(i / 10); } } } /* Long (timed) rest */ else if (n >= 100) { i = n; text[9] = I2D(i % 10); i = i / 10; text[8] = I2D(i % 10); text[7] = I2D(i / 10); } /* Medium (timed) rest */ else if (n >= 10) { i = n; text[9] = I2D(i % 10); text[8] = I2D(i / 10); } /* Short (timed) rest */ else if (n > 0) { i = n; text[9] = I2D(i); } /* Rest until healed */ else if (n == REST_ALL_POINTS) { text[5] = text[6] = text[7] = text[8] = text[9] = '*'; } /* Rest until done */ else if (n == REST_COMPLETE) { text[5] = text[6] = text[7] = text[8] = text[9] = '&'; } /* Rest until HP or SP filled */ else if (n == REST_SOME_POINTS) { text[5] = text[6] = text[7] = text[8] = text[9] = '!'; } } /* Repeating */ else if (cmd_get_nrepeats()) { int nrepeats = cmd_get_nrepeats(); if (nrepeats > 999) strnfmt(text, sizeof(text), "Rep. %3d00", nrepeats / 100); else strnfmt(text, sizeof(text), "Repeat %3d", nrepeats); } /* Searching */ else if (p_ptr->searching) { my_strcpy(text, "Searching ", sizeof(text)); } /* Display the info (or blanks) */ c_put_str(attr, text, row, col); return strlen(text); } static const byte obj_feeling_color[] = { /* Colors used to display each obj feeling */ TERM_WHITE, /* "Looks like any other level." */ TERM_L_PURPLE, /* "you sense an item of wondrous power!" */ TERM_L_RED, /* "there are superb treasures here." */ TERM_ORANGE, /* "there are excellent treasures here." */ TERM_YELLOW, /* "there are very good treasures here." */ TERM_YELLOW, /* "there are good treasures here." */ TERM_L_GREEN, /* "there may be something worthwhile here." */ TERM_L_GREEN, /* "there may not be much interesting here." */ TERM_L_GREEN, /* "there aren't many treasures here." */ TERM_L_BLUE, /* "there are only scraps of junk here." */ TERM_L_BLUE /* "there are naught but cobwebs here. */ }; static const byte mon_feeling_color[] = { /* Colors used to display each monster feeling */ TERM_WHITE, /* "You are still uncertain about this place" */ TERM_RED, /* "Omens of death haunt this place" */ TERM_ORANGE, /* "This place seems murderous" */ TERM_ORANGE, /* "This place seems terribly dangerous" */ TERM_YELLOW, /* "You feel anxious about this place" */ TERM_YELLOW, /* "You feel nervous about this place" */ TERM_GREEN, /* "This place does not seem too risky" */ TERM_GREEN, /* "This place seems reasonably safe" */ TERM_BLUE, /* "This seems a tame, sheltered place" */ TERM_BLUE, /* "This seems a quiet, peaceful place" */ }; /* * Prints level feelings at status if they are enabled. */ static size_t prt_level_feeling(int row, int col) { u16b obj_feeling; u16b mon_feeling; char obj_feeling_str[6]; char mon_feeling_str[6]; int new_col; byte obj_feeling_color_print; /* Don't show feelings for cold-hearted characters */ if (OPT(birth_no_feelings)) return 0; /* No useful feeling in town */ if (!p_ptr->depth) return 0; /* Get feelings */ obj_feeling = cave->feeling / 10; mon_feeling = cave->feeling - (10 * obj_feeling); /* * Convert object feeling to a symbol easier to parse * for a human. * 0 -> * "Looks like any other level." * 1 -> $ "you sense an item of wondrous power!" (special feeling) * 2 to 10 are feelings from 2 meaning superb feeling to 10 * meaning naught but cowebs. * It is easier for the player to have poor feelings as a * low number and superb feelings as a higher one. So for * display we reverse this numbers and substract 1. * Thus (2-10) becomes (1-9 reversed) * * But before that check if the player has explored enough * to get a feeling. If not display as ? */ if (cave->feeling_squares < FEELING1) { my_strcpy( obj_feeling_str, "?", sizeof(obj_feeling_str) ); obj_feeling_color_print = TERM_WHITE; } else { obj_feeling_color_print = obj_feeling_color[obj_feeling]; if ( obj_feeling==0 ) { my_strcpy( obj_feeling_str, "*", sizeof(obj_feeling_str) ); } else if ( obj_feeling==1 ) { my_strcpy( obj_feeling_str, "$", sizeof(obj_feeling_str) ); } else { strnfmt( obj_feeling_str, 5, "%d", (unsigned int) (11-obj_feeling) ); } } /* * Convert monster feeling to a symbol easier to parse * for a human. * 0 -> ? . Monster feeling should never be 0, but we check * it just in case. * 1 to 9 are feelings from omens of death to quiet, paceful. * We also reverse this so that what we show is a danger feeling. */ if ( mon_feeling==0 ) { my_strcpy( mon_feeling_str, "?", sizeof(mon_feeling_str) ); } else { strnfmt( mon_feeling_str, 5, "%d", (unsigned int) ( 10-mon_feeling ) ); } /* Display it */ c_put_str( TERM_WHITE, "LF:", row, col); new_col = col + 3; c_put_str( mon_feeling_color[mon_feeling], mon_feeling_str, row, new_col ); new_col += strlen( mon_feeling_str ); c_put_str( TERM_WHITE, "-", row, new_col ); ++new_col; c_put_str( obj_feeling_color_print, obj_feeling_str, row, new_col ); new_col += strlen( obj_feeling_str ) + 1; return new_col - col; } /* * Prints trap detection status */ static size_t prt_dtrap(int row, int col) { byte info = cave->info2[p_ptr->py][p_ptr->px]; /* The player is in a trap-detected grid */ if (info & (CAVE2_DTRAP)) { /* The player is on the border */ if (info & (CAVE2_DEDGE)) c_put_str(TERM_YELLOW, "DTrap", row, col); else c_put_str(TERM_L_GREEN, "DTrap", row, col); return 5; } return 0; } /* * Print how many spells the player can study. */ static size_t prt_study(int row, int col) { char *text; int attr = TERM_WHITE; /* Can the player learn new spells? */ if (p_ptr->new_spells) { /* If the player does not carry a book with spells they can study, the message is displayed in a darker colour */ if (!player_book_has_unlearned_spells(p_ptr)) attr = TERM_L_DARK; /* Print study message */ text = format("Study (%d)", p_ptr->new_spells); c_put_str(attr, text, row, col); return strlen(text) + 1; } return 0; } /* * Print all timed effects. */ static size_t prt_tmd(int row, int col) { size_t i, len = 0; for (i = 0; i < N_ELEMENTS(effects); i++) { if (p_ptr->timed[effects[i].value]) { c_put_str(effects[i].attr, effects[i].str, row, col + len); len += effects[i].len; } } return len; } /** * Print "unignoring" status */ static size_t prt_unignore(int row, int col) { if (p_ptr->unignoring) { const char *str = "Unignoring"; put_str(str, row, col); return strlen(str) + 1; } return 0; } /* Useful typedef */ typedef size_t status_f(int row, int col); static status_f *status_handlers[] = { prt_level_feeling, prt_unignore, prt_recall, prt_state, prt_cut, prt_stun, prt_hunger, prt_study, prt_tmd, prt_dtrap }; /* * Print the status line. */ static void update_statusline(game_event_type type, game_event_data *data, void *user) { int row = Term->hgt - 1; int col = 13; size_t i; /* Clear the remainder of the line */ prt("", row, col); /* Display those which need redrawing */ for (i = 0; i < N_ELEMENTS(status_handlers); i++) col += status_handlers[i](row, col); } /* ------------------------------------------------------------------------ * Map redraw. * ------------------------------------------------------------------------ */ #if 0 static void trace_map_updates(game_event_type type, game_event_data *data, void *user) { if (data->point.x == -1 && data->point.y == -1) { printf("Redraw whole map\n"); } else { printf("Redraw (%i, %i)\n", data->point.x, data->point.y); } } #endif static void update_maps(game_event_type type, game_event_data *data, void *user) { term *t = user; /* This signals a whole-map redraw. */ if (data->point.x == -1 && data->point.y == -1) { prt_map(); } /* Single point to be redrawn */ else { grid_data g; int a, ta; wchar_t c, tc; int ky, kx; int vy, vx; /* Location relative to panel */ ky = data->point.y - t->offset_y; kx = data->point.x - t->offset_x; if (t == angband_term[0]) { /* Verify location */ if ((ky < 0) || (ky >= SCREEN_HGT)) return; /* Verify location */ if ((kx < 0) || (kx >= SCREEN_WID)) return; /* Location in window */ vy = ky + ROW_MAP; vx = kx + COL_MAP; if (tile_width > 1) { vx += (tile_width - 1) * kx; } if (tile_height > 1) { vy += (tile_height - 1) * ky; } } else { if (tile_width > 1) { kx += (tile_width - 1) * kx; } if (tile_height > 1) { ky += (tile_height - 1) * ky; } /* Verify location */ if ((ky < 0) || (ky >= t->hgt)) return; if ((kx < 0) || (kx >= t->wid)) return; /* Location in window */ vy = ky; vx = kx; } /* Redraw the grid spot */ map_info(data->point.y, data->point.x, &g); grid_data_as_text(&g, &a, &c, &ta, &tc); Term_queue_char(t, vx, vy, a, c, ta, tc); #if 0 /* Plot 'spot' updates in light green to make them visible */ Term_queue_char(t, vx, vy, TERM_L_GREEN, c, ta, tc); #endif if ((tile_width > 1) || (tile_height > 1)) { Term_big_queue_char(t, vx, vy, a, c, TERM_WHITE, ' '); } } } /* ------------------------------------------------------------------------ * Subwindow displays * ------------------------------------------------------------------------ */ /* * TRUE when we're supposed to display the equipment in the inventory * window, or vice-versa. */ static bool flip_inven; static void update_inven_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); if (!flip_inven) show_inven(OLIST_WINDOW | OLIST_WEIGHT | OLIST_QUIVER); else show_equip(OLIST_WINDOW | OLIST_WEIGHT); Term_fresh(); /* Restore */ Term_activate(old); } static void update_equip_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); if (!flip_inven) show_equip(OLIST_WINDOW | OLIST_WEIGHT); else show_inven(OLIST_WINDOW | OLIST_WEIGHT | OLIST_QUIVER); Term_fresh(); /* Restore */ Term_activate(old); } /* * Flip "inven" and "equip" in any sub-windows */ void toggle_inven_equip(void) { term *old = Term; int i; /* Change the actual setting */ flip_inven = !flip_inven; /* Redraw any subwindows showing the inventory/equipment lists */ for (i = 0; i < ANGBAND_TERM_MAX; i++) { Term_activate(angband_term[i]); if (op_ptr->window_flag[i] & PW_INVEN) { if (!flip_inven) show_inven(OLIST_WINDOW | OLIST_WEIGHT | OLIST_QUIVER); else show_equip(OLIST_WINDOW | OLIST_WEIGHT); Term_fresh(); } else if (op_ptr->window_flag[i] & PW_EQUIP) { if (!flip_inven) show_equip(OLIST_WINDOW | OLIST_WEIGHT); else show_inven(OLIST_WINDOW | OLIST_WEIGHT | OLIST_QUIVER); Term_fresh(); } } Term_activate(old); } static void update_itemlist_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); clear_from(0); object_list_show_subwindow(Term->hgt, Term->wid); Term_fresh(); /* Restore */ Term_activate(old); } static void update_monlist_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); clear_from(0); monster_list_show_subwindow(Term->hgt, Term->wid); Term_fresh(); /* Restore */ Term_activate(old); } static void update_monster_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); /* Display monster race info */ if (p_ptr->monster_race) lore_show_subwindow(p_ptr->monster_race, get_lore(p_ptr->monster_race)); Term_fresh(); /* Restore */ Term_activate(old); } static void update_object_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); if (p_ptr->object_idx != NO_OBJECT) display_object_idx_recall(p_ptr->object_idx); else if (p_ptr->object_kind) display_object_kind_recall(p_ptr->object_kind); Term_fresh(); /* Restore */ Term_activate(old); } static void update_messages_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; int i; int w, h; int x, y; const char *msg; /* Activate */ Term_activate(inv_term); /* Get size */ Term_get_size(&w, &h); /* Dump messages */ for (i = 0; i < h; i++) { byte color = message_color(i); u16b count = message_count(i); const char *str = message_str(i); if (count == 1) msg = str; else if (count == 0) msg = " "; else msg = format("%s <%dx>", str, count); Term_putstr(0, (h - 1) - i, -1, color, msg); /* Cursor */ Term_locate(&x, &y); /* Clear to end of line */ Term_erase(x, y, 255); } Term_fresh(); /* Restore */ Term_activate(old); } static struct minimap_flags { int win_idx; bool needs_redraw; } minimap_data[ANGBAND_TERM_MAX]; static void update_minimap_subwindow(game_event_type type, game_event_data *data, void *user) { struct minimap_flags *flags = user; if (type == EVENT_END) { term *old = Term; term *t = angband_term[flags->win_idx]; /* Activate */ Term_activate(t); /* If whole-map redraw, clear window first. */ if (flags->needs_redraw) Term_clear(); /* Redraw map */ display_map(NULL, NULL); Term_fresh(); /* Restore */ Term_activate(old); flags->needs_redraw = FALSE; } else if (type == EVENT_DUNGEONLEVEL) { /* XXX map_height and map_width need to be kept in sync with display_map() */ term *t = angband_term[flags->win_idx]; int map_height = t->hgt - 2; int map_width = t->wid - 2; /* Clear the entire term if the new map isn't going to fit the entire thing */ if (cave->height <= map_height || cave->width <= map_width) { flags->needs_redraw = TRUE; } } } /* * Hack -- display player in sub-windows (mode 0) */ static void update_player0_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); /* Display flags */ display_player(0); Term_fresh(); /* Restore */ Term_activate(old); } /* * Hack -- display player in sub-windows (mode 1) */ static void update_player1_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); /* Display flags */ display_player(1); Term_fresh(); /* Restore */ Term_activate(old); } /* * Display the left-hand-side of the main term, in more compact fashion. */ static void update_player_compact_subwindow(game_event_type type, game_event_data *data, void *user) { int row = 0; int col = 0; int i; term *old = Term; term *inv_term = user; /* Activate */ Term_activate(inv_term); /* Race and Class */ prt_field(p_ptr->race->name, row++, col); prt_field(p_ptr->class->name, row++, col); /* Title */ prt_title(row++, col); /* Level/Experience */ prt_level(row++, col); prt_exp(row++, col); /* Gold */ prt_gold(row++, col); /* Equippy chars */ prt_equippy(row++, col); /* All Stats */ for (i = 0; i < A_MAX; i++) prt_stat(i, row++, col); /* Empty row */ row++; /* Armor */ prt_ac(row++, col); /* Hitpoints */ prt_hp(row++, col); /* Spellpoints */ prt_sp(row++, col); /* Monster health */ prt_health(row++, col); Term_fresh(); /* Restore */ Term_activate(old); } static void flush_subwindow(game_event_type type, game_event_data *data, void *user) { term *old = Term; term *t = user; /* Activate */ Term_activate(t); Term_fresh(); /* Restore */ Term_activate(old); } static void subwindow_flag_changed(int win_idx, u32b flag, bool new_state) { void (*register_or_deregister)(game_event_type type, game_event_handler *fn, void *user); void (*set_register_or_deregister)(game_event_type *type, size_t n_events, game_event_handler *fn, void *user); /* Decide whether to register or deregister an evenrt handler */ if (new_state == FALSE) { register_or_deregister = event_remove_handler; set_register_or_deregister = event_remove_handler_set; } else { register_or_deregister = event_add_handler; set_register_or_deregister = event_add_handler_set; } switch (flag) { case PW_INVEN: { register_or_deregister(EVENT_INVENTORY, update_inven_subwindow, angband_term[win_idx]); break; } case PW_EQUIP: { register_or_deregister(EVENT_EQUIPMENT, update_equip_subwindow, angband_term[win_idx]); break; } case PW_PLAYER_0: { set_register_or_deregister(player_events, N_ELEMENTS(player_events), update_player0_subwindow, angband_term[win_idx]); break; } case PW_PLAYER_1: { set_register_or_deregister(player_events, N_ELEMENTS(player_events), update_player1_subwindow, angband_term[win_idx]); break; } case PW_PLAYER_2: { set_register_or_deregister(player_events, N_ELEMENTS(player_events), update_player_compact_subwindow, angband_term[win_idx]); break; } case PW_MAP: { register_or_deregister(EVENT_MAP, update_maps, angband_term[win_idx]); register_or_deregister(EVENT_END, flush_subwindow, angband_term[win_idx]); break; } case PW_MESSAGE: { register_or_deregister(EVENT_MESSAGE, update_messages_subwindow, angband_term[win_idx]); break; } case PW_OVERHEAD: { minimap_data[win_idx].win_idx = win_idx; register_or_deregister(EVENT_MAP, update_minimap_subwindow, &minimap_data[win_idx]); register_or_deregister(EVENT_DUNGEONLEVEL, update_minimap_subwindow, &minimap_data[win_idx]); register_or_deregister(EVENT_END, update_minimap_subwindow, &minimap_data[win_idx]); break; } case PW_MONSTER: { register_or_deregister(EVENT_MONSTERTARGET, update_monster_subwindow, angband_term[win_idx]); break; } case PW_OBJECT: { register_or_deregister(EVENT_OBJECTTARGET, update_object_subwindow, angband_term[win_idx]); break; } case PW_MONLIST: { register_or_deregister(EVENT_MONSTERLIST, update_monlist_subwindow, angband_term[win_idx]); break; } case PW_ITEMLIST: { register_or_deregister(EVENT_ITEMLIST, update_itemlist_subwindow, angband_term[win_idx]); break; } } } /* * Set the flags for one Term, calling "subwindow_flag_changed" with each flag that * has changed setting so that it can do any housekeeping to do with * siaplying hte new thing or no longer displaying the old one. */ static void subwindow_set_flags(int win_idx, u32b new_flags) { term *old = Term; int i; /* Deal with the changed flags by seeing what's changed */ for (i = 0; i < 32; i++) { /* Only process valid flags */ if (window_flag_desc[i]) { if ((new_flags & (1L << i)) != (op_ptr->window_flag[win_idx] & (1L << i))) { subwindow_flag_changed(win_idx, (1L << i), (new_flags & (1L << i)) != 0); } } } /* Store the new flags */ op_ptr->window_flag[win_idx] = new_flags; /* Activate */ Term_activate(angband_term[win_idx]); /* Erase */ Term_clear(); /* Refresh */ Term_fresh(); /* Restore */ Term_activate(old); } /* * Called with an array of the new flags for all the subwindows, in order * to set them to the new values, with a chance to perform housekeeping. */ void subwindows_set_flags(u32b *new_flags, size_t n_subwindows) { size_t j; for (j = 0; j < n_subwindows; j++) { /* Dead window */ if (!angband_term[j]) continue; /* Ignore non-changes */ if (op_ptr->window_flag[j] != new_flags[j]) { subwindow_set_flags(j, new_flags[j]); } } } /* ------------------------------------------------------------------------ * Showing and updating the splash screen. * ------------------------------------------------------------------------ */ /* * Hack -- Explain a broken "lib" folder and quit (see below). */ static void init_angband_aux(const char *why) { quit_fmt("%s\n\n%s", why, "The 'lib' directory is probably missing or broken.\n" "Perhaps the archive was not extracted correctly.\n" "See the 'readme.txt' file for more information."); } /* * Hack -- take notes on line 23 */ static void splashscreen_note(game_event_type type, game_event_data *data, void *user) { Term_erase(0, 23, 255); Term_putstr(20, 23, -1, TERM_WHITE, format("[%s]", data->string)); Term_fresh(); } static void show_splashscreen(game_event_type type, game_event_data *data, void *user) { ang_file *fp; char buf[1024]; /*** Verify the "news" file ***/ path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "news.txt"); if (!file_exists(buf)) { char why[1024]; /* Crash and burn */ strnfmt(why, sizeof(why), "Cannot access the '%s' file!", buf); init_angband_aux(why); } /*** Display the "news" file ***/ Term_clear(); /* Open the News file */ path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "news.txt"); fp = file_open(buf, MODE_READ, FTYPE_TEXT); text_out_hook = text_out_to_screen; /* Dump */ if (fp) { /* Dump the file to the screen */ while (file_getl(fp, buf, sizeof(buf))) { char *version_marker = strstr(buf, "$VERSION"); if (version_marker) { ptrdiff_t pos = version_marker - buf; strnfmt(version_marker, sizeof(buf) - pos, "%-8s", buildver); } text_out_e("%s", buf); text_out("\n"); } file_close(fp); } /* Flush it */ Term_fresh(); } /* ------------------------------------------------------------------------ * Temporary (hopefully) hackish solutions. * ------------------------------------------------------------------------ */ static void check_panel(game_event_type type, game_event_data *data, void *user) { verify_panel(); } static void see_floor_items(game_event_type type, game_event_data *data, void *user) { int py = p_ptr->py; int px = p_ptr->px; size_t floor_num = 0; int floor_list[MAX_FLOOR_STACK + 1]; bool blind = ((p_ptr->timed[TMD_BLIND]) || (no_light())); const char *p = "see"; int can_pickup = 0; size_t i; /* Scan all marked objects in the grid */ floor_num = scan_floor(floor_list, N_ELEMENTS(floor_list), py, px, 0x09); if (floor_num == 0) return; for (i = 0; i < floor_num; i++) can_pickup += inven_carry_okay(object_byid(floor_list[i])); /* One object */ if (floor_num == 1) { /* Get the object */ object_type *o_ptr = object_byid(floor_list[0]); char o_name[80]; if (!can_pickup) p = "have no room for"; else if (blind) p = "feel"; /* Describe the object. Less detail if blind. */ if (blind) object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_BASE); else object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Message */ message_flush(); msg("You %s %s.", p, o_name); } else { ui_event e; if (!can_pickup) p = "have no room for the following objects"; else if (blind) p = "feel something on the floor"; /* Display objects on the floor */ screen_save(); show_floor(floor_list, floor_num, (OLIST_WEIGHT)); prt(format("You %s: ", p), 0, 0); /* Wait for it. Use key as next command. */ e = inkey_ex(); Term_event_push(&e); /* Restore screen */ screen_load(); } /* Update the map to display the items that are felt during blindness. */ if (blind) { for (i = 0; i < floor_num; i++) { /* Since the messages are detailed, we use MARK_SEEN to match description. */ object_type *o_ptr = object_byid(floor_list[i]); o_ptr->marked = MARK_SEEN; } } } /* ------------------------------------------------------------------------ * Initialising * ------------------------------------------------------------------------ */ static void ui_enter_init(game_event_type type, game_event_data *data, void *user) { show_splashscreen(type, data, user); /* Set up our splashscreen handlers */ event_add_handler(EVENT_INITSTATUS, splashscreen_note, NULL); } static void ui_leave_init(game_event_type type, game_event_data *data, void *user) { /* Remove our splashscreen handlers */ event_remove_handler(EVENT_INITSTATUS, splashscreen_note, NULL); } static void ui_enter_game(game_event_type type, game_event_data *data, void *user) { /* Because of the "flexible" sidebar, all these things trigger the same function. */ event_add_handler_set(player_events, N_ELEMENTS(player_events), update_sidebar, NULL); /* The flexible statusbar has similar requirements, so is also trigger by a large set of events. */ event_add_handler_set(statusline_events, N_ELEMENTS(statusline_events), update_statusline, NULL); /* Player HP can optionally change the colour of the '@' now. */ event_add_handler(EVENT_HP, hp_colour_change, NULL); /* Simplest way to keep the map up to date - will do for now */ event_add_handler(EVENT_MAP, update_maps, angband_term[0]); #if 0 event_add_handler(EVENT_MAP, trace_map_updates, angband_term[0]); #endif /* Check if the panel should shift when the player's moved */ event_add_handler(EVENT_PLAYERMOVED, check_panel, NULL); event_add_handler(EVENT_SEEFLOOR, see_floor_items, NULL); } static void ui_leave_game(game_event_type type, game_event_data *data, void *user) { /* Because of the "flexible" sidebar, all these things trigger the same function. */ event_remove_handler_set(player_events, N_ELEMENTS(player_events), update_sidebar, NULL); /* The flexible statusbar has similar requirements, so is also trigger by a large set of events. */ event_remove_handler_set(statusline_events, N_ELEMENTS(statusline_events), update_statusline, NULL); /* Player HP can optionally change the colour of the '@' now. */ event_remove_handler(EVENT_HP, hp_colour_change, NULL); /* Simplest way to keep the map up to date - will do for now */ event_remove_handler(EVENT_MAP, update_maps, angband_term[0]); #if 0 event_remove_handler(EVENT_MAP, trace_map_updates, angband_term[0]); #endif /* Check if the panel should shift when the player's moved */ event_remove_handler(EVENT_PLAYERMOVED, check_panel, NULL); event_remove_handler(EVENT_SEEFLOOR, see_floor_items, NULL); } errr textui_get_cmd(cmd_context context, bool wait) { if (context == CMD_BIRTH) return get_birth_command(wait); else if (context == CMD_GAME) textui_process_command(!wait); /* If we've reached here, we haven't got a command. */ return 1; } void init_display(void) { event_add_handler(EVENT_ENTER_INIT, ui_enter_init, NULL); event_add_handler(EVENT_LEAVE_INIT, ui_leave_init, NULL); event_add_handler(EVENT_ENTER_GAME, ui_enter_game, NULL); event_add_handler(EVENT_LEAVE_GAME, ui_leave_game, NULL); ui_init_birthstate_handlers(); } /* Return a random hint from the global hints list */ char* random_hint(void) { struct hint *v, *r = NULL; int n; for (v = hints, n = 1; v; v = v->next, n++) if (one_in_(n)) r = v; return r->hint; } angband-3.5.1/src/history.h0000644000175000017500000000343212456456606015103 0ustar chriscchrisc/* history.h - player history tracking */ #ifndef HISTORY_H #define HISTORY_H /* Player history table */ struct history_info { u16b type; /* Kind of history item */ s16b dlev; /* Dungeon level when this item was recorded */ s16b clev; /* Character level when this item was recorded */ byte a_idx; /* Artifact this item relates to */ s32b turn; /* Turn this item was recorded on */ char event[80]; /* The text of the item */ }; /* History message types */ #define HISTORY_PLAYER_BIRTH 0x0001 /* Player was born */ #define HISTORY_ARTIFACT_UNKNOWN 0x0002 /* Player found but not IDd an artifact */ #define HISTORY_ARTIFACT_KNOWN 0x0004 /* Player has IDed an artifact */ #define HISTORY_ARTIFACT_LOST 0x0008 /* Player had an artifact and lost it */ #define HISTORY_PLAYER_DEATH 0x0010 /* Player has been slain */ #define HISTORY_SLAY_UNIQUE 0x0020 /* Player has slain a unique monster */ #define HISTORY_USER_INPUT 0x0040 /* User-added note */ #define HISTORY_SAVEFILE_IMPORT 0x0080 /* Added when an older version savefile is imported */ #define HISTORY_GAIN_LEVEL 0x0100 /* Player gained a level */ #define HISTORY_GENERIC 0x0200 /* Anything else not covered here (unused) */ extern struct history_info *history_list; void history_clear(void); size_t history_get_num(void); bool history_add_full(u16b type, struct artifact *artifact, s16b dlev, s16b clev, s32b turn, const char *text); bool history_add(const char *event, u16b type, struct artifact *art); bool history_add_artifact(struct artifact *art, bool known, bool found); void history_unmask_unknown(void); bool history_lose_artifact(struct artifact *art); void history_display(void); void dump_history(ang_file *file); bool history_is_artifact_known(struct artifact *art); #endif /* !HISTORY_H */ angband-3.5.1/src/main-xxx.c0000644000175000017500000005103312456456606015146 0ustar chriscchrisc/* * File: main-xxx.c * Purpose: Outline how to make a new "main-xxx" file. * * Copyright (c) 1997 Ben Harrison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" /* * This file helps Angband work on non-existant computers. * * To use this file, use "Makefile.xxx", which defines USE_XXX. * * * This file is intended to show one way to build a "visual module" * for Angband to allow it to work with a new system. It does not * actually work, but if the code near "XXX XXX XXX" comments were * replaced with functional code, then it probably would. * * See "z-term.c" for info on the concept of the "generic terminal", * and for more comments about what this file must supply. * * There are two basic ways to port Angband to a new system. The * first involves modifying the "main-gcu.c" and/or "main-x11.c" * files to support some version of "curses" and/or "X11" on your * machine, and to compile with the "USE_GCU" and/or "USE_X11" * compilation flags defined. The second involves creating a * new "main-xxx.c" file, based on this sample file (or on any * existing "main-xxx.c" file), and comes in two flavors, based * on whether it contains a "main()" function (as in "main-mac.c" * and "main-win.c") or not (as in "main-gcu.c" or "main-x11.c"). * * If the "main-xxx.c" file includes its own "main()" function, * then you should NOT link in the "main.c" file, and your "main()" * function must process any command line arguments, initialize the * "visual system", and call "play_game()" with appropriate arguments. * * If the "main-xxx.c" file does not include its own "main()" * function, then you must add some code to "main.c" which, if * the appropriate "USE_XXX" compilation flag is defined, will * attempt to call the "init_xxx()" function in the "main-xxx.c" * file, which should initialize the "visual system" and return * zero if it was successful. The "main()" function in "main.c" * will take care of processing command line arguments and then * calling "play_game()" with appropriate arguments. * * Note that the "util.c" file often contains functions which must * be modified in small ways for various platforms, even if you are * able to use the existing "main-gcu.c" and/or "main-x11.c" files, * in particular, the "file handling" functions may not work on all * systems. * * When you complete a port to a new system, you should email any * newly created files, and any changes made to existing files, * including "h-config.h", "config.h", and any of the "Makefile" * files, to "rr9@thangorodrim.net" for inclusion in the next version. * * Always choose a "three letter" naming scheme for "main-xxx.c" * and "Makefile.xxx" and such for consistency and simplicity. * * * Initial framework (and all code) by Ben Harrison (benh@phial.com). */ #ifdef USE_XXX #include "main.h" /* * Extra data to associate with each "window" * * Each "window" is represented by a "term_data" structure, which * contains a "term" structure, which contains a pointer (t->data) * back to the term_data structure. */ typedef struct term_data term_data; struct term_data { term t; /* Other fields if needed XXX XXX XXX */ }; /* * Number of "term_data" structures to support XXX XXX XXX * * You MUST support at least one "term_data" structure, and the * game will currently use up to eight "term_data" structures if * they are available. * * Actually, MAX_TERM_DATA is now defined as eight in 'defines.h'. * * If only one "term_data" structure is supported, then a lot of * the things that would normally go into a "term_data" structure * could be made into global variables instead. */ #define MAX_XXX_TERM 1 /* * An array of "term_data" structures, one for each "sub-window" */ static term_data data[MAX_XXX_TERM]; #if 0 /* * Often, it is helpful to create an array of "color data" containing * a representation of the "angband_color_table" array in some "local" form. * * Often, the "Term_xtra(TERM_XTRA_REACT, 0)" hook is used to initialize * "color_data" from "angband_color_table". XXX XXX XXX */ static local_color_data_type color_data[MAX_COLORS]; #endif /*** Function hooks needed by "Term" ***/ /* * Init a new "term" * * This function should do whatever is necessary to prepare a new "term" * for use by the "z-term.c" package. This may include clearing the window, * preparing the cursor, setting the font/colors, etc. Usually, this * function does nothing, and the "init_xxx()" function does it all. */ static void Term_init_xxx(term *t) { term_data *td = (term_data*)(t->data); /* XXX XXX XXX */ } /* * Nuke an old "term" * * This function is called when an old "term" is no longer needed. It should * do whatever is needed to clean up before the program exits, such as wiping * the screen, restoring the cursor, fixing the font, etc. Often this function * does nothing and lets the operating system clean up when the program quits. */ static void Term_nuke_xxx(term *t) { term_data *td = (term_data*)(t->data); /* XXX XXX XXX */ } /* * Do a "special thing" to the current "term" * * This function must react to a large number of possible arguments, each * corresponding to a different "action request" by the "z-term.c" package, * or by the application itself. * * The "action type" is specified by the first argument, which must be a * constant of the form "TERM_XTRA_*" as given in "z-term.h", and the second * argument specifies the "information" for that argument, if any, and will * vary according to the first argument. * * In general, this function should return zero if the action is successfully * handled, and non-zero if the action is unknown or incorrectly handled. */ static errr Term_xtra_xxx(int n, int v) { term_data *td = (term_data*)(Term->data); /* Analyze */ switch (n) { case TERM_XTRA_EVENT: { /* * Process some pending events XXX XXX XXX * * Wait for at least one event if "v" is non-zero * otherwise, if no events are ready, return at once. * When "keypress" events are encountered, the "ascii" * value corresponding to the key should be sent to the * "Term_keypress()" function. Certain "bizarre" keys, * such as function keys or arrow keys, may send special * sequences of characters, such as control-underscore, * plus letters corresponding to modifier keys, plus an * underscore, plus carriage return, which can be used by * the main program for "macro" triggers. This action * should handle as many events as is efficiently possible * but is only required to handle a single event, and then * only if one is ready or "v" is true. * * This action is required. */ return (0); } case TERM_XTRA_FLUSH: { /* * Flush all pending events XXX XXX XXX * * This action should handle all events waiting on the * queue, optionally discarding all "keypress" events, * since they will be discarded anyway in "z-term.c". * * This action is required, but may not be "essential". */ return (0); } case TERM_XTRA_CLEAR: { /* * Clear the entire window XXX XXX XXX * * This action should clear the entire window, and redraw * any "borders" or other "graphic" aspects of the window. * * This action is required. */ return (0); } case TERM_XTRA_SHAPE: { /* * Set the cursor visibility XXX XXX XXX * * This action should change the visibility of the cursor, * if possible, to the requested value (0=off, 1=on) * * This action is optional, but can improve both the * efficiency (and attractiveness) of the program. */ return (0); } case TERM_XTRA_FROSH: { /* * Flush a row of output XXX XXX XXX * * This action should make sure that row "v" of the "output" * to the window will actually appear on the window. * * This action is optional, assuming that "Term_text_xxx()" * (and similar functions) draw directly to the screen, or * that the "TERM_XTRA_FRESH" entry below takes care of any * necessary flushing issues. */ return (0); } case TERM_XTRA_FRESH: { /* * Flush output XXX XXX XXX * * This action should make sure that all "output" to the * window will actually appear on the window. * * This action is optional, assuming that "Term_text_xxx()" * (and similar functions) draw directly to the screen, or * that the "TERM_XTRA_FROSH" entry above takes care of any * necessary flushing issues. */ return (0); } case TERM_XTRA_NOISE: { /* * Make a noise XXX XXX XXX * * This action should produce a "beep" noise. * * This action is optional, but convenient. */ return (0); } case TERM_XTRA_BORED: { /* * Handle random events when bored XXX XXX XXX * * This action is optional, and normally not important */ return (0); } case TERM_XTRA_REACT: { /* * React to global changes XXX XXX XXX * * For example, this action can be used to react to * changes in the global "angband_color_table[MAX_COLORS][4]" array. * * This action is optional, but can be very useful for * handling "color changes" and the "arg_sound" and/or * "arg_graphics" options. */ return (0); } case TERM_XTRA_ALIVE: { /* * Change the "hard" level XXX XXX XXX * * This action is used if the program changes "aliveness" * by being either "suspended" (v=0) or "resumed" (v=1) * This action is optional, unless the computer uses the * same "physical screen" for multiple programs, in which * case this action should clean up to let other programs * use the screen, or resume from such a cleaned up state. * * This action is currently only used by "main-gcu.c", * on UNIX machines, to allow proper "suspending". */ return (0); } case TERM_XTRA_LEVEL: { /* * Change the "soft" level XXX XXX XXX * * This action is used when the term window changes "activation" * either by becoming "inactive" (v=0) or "active" (v=1) * * This action can be used to do things like activate the proper * font / drawing mode for the newly active term window. This * action should NOT change which window has the "focus", which * window is "raised", or anything like that. * * This action is optional if all the other things which depend * on what term is active handle activation themself, or if only * one "term_data" structure is supported by this file. */ return (0); } case TERM_XTRA_DELAY: { /* * Delay for some milliseconds XXX XXX XXX * * This action is useful for proper "timing" of certain * visual effects, such as breath attacks. * * This action is optional, but may be required by this file, * especially if special "macro sequences" must be supported. */ return (0); } } /* Unknown or Unhandled action */ return (1); } /* * Display the cursor * * This routine should display the cursor at the given location * (x,y) in some manner. On some machines this involves actually * moving the physical cursor, on others it involves drawing a fake * cursor in some form of graphics mode. Note the "soft_cursor" * flag which tells "z-term.c" to treat the "cursor" as a "visual" * thing and not as a "hardware" cursor. * * You may assume "valid" input if the window is properly sized. * * You may use the "Term_what(x, y, &a, &c)" function, if needed, * to determine what attr/char should be "under" the new cursor, * for "inverting" purposes or whatever. */ static errr Term_curs_xxx(int x, int y) { term_data *td = (term_data*)(Term->data); /* XXX XXX XXX */ /* Success */ return (0); } /* * Erase some characters * * This function should erase "n" characters starting at (x,y). * * You may assume "valid" input if the window is properly sized. */ static errr Term_wipe_xxx(int x, int y, int n) { term_data *td = (term_data*)(Term->data); /* XXX XXX XXX */ /* Success */ return (0); } /* * Draw some text on the screen * * This function should actually display an array of characters * starting at the given location, using the given "attribute", * and using the given string of characters, which contains * exactly "n" characters and which is NOT null-terminated. * * You may assume "valid" input if the window is properly sized. * * You must be sure that the string, when written, erases anything * (including any visual cursor) that used to be where the text is * drawn. On many machines this happens automatically, on others, * you must first call "Term_wipe_xxx()" to clear the area. * * In color environments, you should activate the color contained * in "color_data[a & BASIC_COLORS]", if needed, before drawing anything. * * You may ignore the "attribute" if you are only supporting a * monochrome environment, since this routine is normally never * called to display "black" (invisible) text, including the * default "spaces", and all other colors should be drawn in * the "normal" color in a monochrome environment. * * Note that if you have changed the "attr_blank" to something * which is not black, then this function must be able to draw * the resulting "blank" correctly. * * Note that this function must correctly handle "black" text if * the "always_text" flag is set, if this flag is not set, all the * "black" text will be handled by the "Term_wipe_xxx()" hook. */ static errr Term_text_xxx(int x, int y, int n, int a, const char *cp) { term_data *td = (term_data*)(Term->data); /* XXX XXX XXX */ /* Success */ return (0); } /* * Draw some attr/char pairs on the screen * * This routine should display the given "n" attr/char pairs at * the given location (x,y). This function is only used if one * of the flags "always_pict" or "higher_pict" is defined. * * You must be sure that the attr/char pairs, when displayed, will * erase anything (including any visual cursor) that used to be at * the given location. On many machines this is automatic, but on * others, you must first call "Term_wipe_xxx(x, y, 1)". * * With the "higher_pict" flag, this function can be used to allow * the display of "pseudo-graphic" pictures, for example, by using * the attr/char pair as an encoded index into a pixmap of special * "pictures". * * With the "always_pict" flag, this function can be used to force * every attr/char pair to be drawn by this function, which can be * very useful if this file can optimize its own display calls. * * This function is often associated with the "arg_graphics" flag. * * This function is only used if one of the "higher_pict" and/or * "always_pict" flags are set. */ static errr Term_pict_xxx(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp) { term_data *td = (term_data*)(Term->data); /* XXX XXX XXX */ /* Success */ return (0); } /*** Internal Functions ***/ /* * Instantiate a "term_data" structure * * This is one way to prepare the "term_data" structures and to * "link" the various informational pieces together. * * This function assumes that every window should be 80x24 in size * (the standard size) and should be able to queue 256 characters. * Technically, only the "main screen window" needs to queue any * characters, but this method is simple. One way to allow some * variation is to add fields to the "term_data" structure listing * parameters for that window, initialize them in the "init_xxx()" * function, and then use them in the code below. * * Note that "activation" calls the "Term_init_xxx()" hook for * the "term" structure, if needed. */ static void term_data_link(int i) { term_data *td = &data[i]; term *t = &td->t; /* Initialize the term */ term_init(t, 80, 24, 256); /* Choose "soft" or "hard" cursor XXX XXX XXX */ /* A "soft" cursor must be explicitly "drawn" by the program */ /* while a "hard" cursor has some "physical" existance and is */ /* moved whenever text is drawn on the screen. See "z-term.c". */ /* t->soft_cursor = TRUE; */ /* Avoid the "corner" of the window XXX XXX XXX */ /* t->icky_corner = TRUE; */ /* Use "Term_pict()" for all attr/char pairs XXX XXX XXX */ /* See the "Term_pict_xxx()" function above. */ /* t->always_pict = TRUE; */ /* Use "Term_pict()" for some attr/char pairs XXX XXX XXX */ /* See the "Term_pict_xxx()" function above. */ /* t->higher_pict = TRUE; */ /* Use "Term_text()" even for "black" text XXX XXX XXX */ /* See the "Term_text_xxx()" function above. */ /* t->always_text = TRUE; */ /* Ignore the "TERM_XTRA_BORED" action XXX XXX XXX */ /* This may make things slightly more efficient. */ /* t->never_bored = TRUE; */ /* Ignore the "TERM_XTRA_FROSH" action XXX XXX XXX */ /* This may make things slightly more efficient. */ /* t->never_frosh = TRUE; */ /* Erase with "white space" XXX XXX XXX */ /* t->attr_blank = TERM_WHITE; */ /* t->char_blank = ' '; */ /* Prepare the init/nuke hooks */ t->init_hook = Term_init_xxx; t->nuke_hook = Term_nuke_xxx; /* Prepare the template hooks */ t->xtra_hook = Term_xtra_xxx; t->curs_hook = Term_curs_xxx; t->wipe_hook = Term_wipe_xxx; t->text_hook = Term_text_xxx; t->pict_hook = Term_pict_xxx; /* Remember where we came from */ t->data = td; /* Activate it */ Term_activate(t); /* Global pointer */ angband_term[i] = t; } /* * Help message. * 1st line = max 68 chars. * Start next lines with 11 spaces */ const char help_xxx[] = "Describe XXX, subopts -describe suboptions here"; /* * Initialization function */ errr init_xxx(int argc, char **argv) { int i; /* Initialize globals XXX XXX XXX */ /* Initialize "term_data" structures XXX XXX XXX */ /* Initialize the "color_data" array XXX XXX XXX */ /* Create windows (backwards!) */ for (i = MAX_XXX_TERM; i-- > 0; ) { /* Link */ term_data_link(i); } /* Success */ return (0); } #ifdef INTERNAL_MAIN /* * Some special machines need their own "main()" function, which they * can provide here, making sure NOT to compile the "main.c" file. * * These systems usually have some form of "event loop", run forever * as the last step of "main()", which handles things like menus and * window movement, and calls "play_game(FALSE)" to load a game after * initializing "savefile" to a filename, or "play_game(TRUE)" to make * a new game. The event loop would also be triggered by "Term_xtra()" * (the TERM_XTRA_EVENT action), in which case the event loop would not * actually "loop", but would run once and return. */ /* * An event handler XXX XXX XXX * * You may need an event handler, which can be used by both * by the "TERM_XTRA_BORED" and "TERM_XTRA_EVENT" entries in * the "Term_xtra_xxx()" function, and also to wait for the * user to perform whatever user-interface operation is needed * to request the start of a new game or the loading of an old * game, both of which should launch the "play_game()" function. */ static bool CheckEvents(bool wait) { /* XXX XXX XXX */ return (0); } /* * Make a sound. * * This action should produce sound number "v", where the * "name" of that sound is "sound_names[v]". * * This action is optional, and not very important. */ static void xxx_sound(int v) { return; } /* * Init some stuff * * This function is used to keep the "path" variable off the stack. */ static void init_stuff(void) { char path[1024]; /* Prepare the path XXX XXX XXX */ /* This must in some way prepare the "path" variable */ /* so that it points at the "lib" directory. Every */ /* machine handles this in a different way... */ my_strcpy(path, "XXX XXX XXX", sizeof(path)); /* Prepare the filepaths */ init_file_paths(path, path, path); /* Set up sound hook */ sound_hook = xxx_sound; } /* * Main function * * This function must do a lot of stuff. */ int main(int argc, char *argv[]) { /* Initialize the machine itself XXX XXX XXX */ /* Process command line arguments XXX XXX XXX */ /* Initialize the windows */ if (init_xxx(argc, argv) != 0) quit("Oops!"); /* XXX XXX XXX */ ANGBAND_SYS = "xxx"; /* Initialize some stuff */ init_stuff(); /* Initialize */ init_angband(); /* Allow auto-startup XXX XXX XXX */ /* Event loop forever XXX XXX XXX */ while (TRUE) CheckEvents(TRUE); } #endif /* INTERNAL_MAIN */ #endif /* USE_XXX */ angband-3.5.1/src/wiz-spoil.c0000644000175000017500000004000612456456607015331 0ustar chriscchrisc/* * File: wiz-spoil.c * Purpose: Spoiler generation * * Copyright (c) 1997 Ben Harrison, and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "cmds.h" #include "monster/mon-lore.h" #include "monster/monster.h" #include "object/tvalsval.h" #include "ui-menu.h" #include "wizard.h" #include "z-file.h" #ifdef ALLOW_SPOILERS /* * The spoiler file being created */ static ang_file *fh = NULL; /* * Write out `n' of the character `c' to the spoiler file */ static void spoiler_out_n_chars(int n, char c) { while (--n >= 0) file_writec(fh, c); } /* * Write out `n' blank lines to the spoiler file */ static void spoiler_blanklines(int n) { spoiler_out_n_chars(n, '\n'); } /* * Write a line to the spoiler file and then "underline" it with hypens */ static void spoiler_underline(const char *str, char c) { text_out("%s", str); text_out("\n"); spoiler_out_n_chars(strlen(str), c); text_out("\n"); } /* * Item Spoilers by Ben Harrison (benh@phial.com) */ /* * The basic items categorized by type */ static const grouper group_item[] = { { TV_SHOT, "Ammo" }, { TV_ARROW, NULL }, { TV_BOLT, NULL }, { TV_BOW, "Bows" }, { TV_SWORD, "Weapons" }, { TV_POLEARM, NULL }, { TV_HAFTED, NULL }, { TV_DIGGING, NULL }, { TV_SOFT_ARMOR, "Armour (Body)" }, { TV_HARD_ARMOR, NULL }, { TV_DRAG_ARMOR, NULL }, { TV_CLOAK, "Armour (Misc)" }, { TV_SHIELD, NULL }, { TV_HELM, NULL }, { TV_CROWN, NULL }, { TV_GLOVES, NULL }, { TV_BOOTS, NULL }, { TV_AMULET, "Amulets" }, { TV_RING, "Rings" }, { TV_SCROLL, "Scrolls" }, { TV_POTION, "Potions" }, { TV_FOOD, "Food" }, { TV_ROD, "Rods" }, { TV_WAND, "Wands" }, { TV_STAFF, "Staffs" }, { TV_MAGIC_BOOK, "Books (Mage)" }, { TV_PRAYER_BOOK, "Books (Priest)" }, { TV_CHEST, "Chests" }, { TV_LIGHT, "Lights and fuel" }, { TV_FLASK, NULL }, { 0, "" } }; /* * Describe the kind */ static void kind_info(char *buf, size_t buf_len, char *dam, size_t dam_len, char *wgt, size_t wgt_len, int *lev, s32b *val, int k) { object_kind *k_ptr; object_type *i_ptr; object_type object_type_body; int i; /* Get local object */ i_ptr = &object_type_body; /* Prepare a fake item */ object_prep(i_ptr, &k_info[k], 0, MAXIMISE); /* Obtain the "kind" info */ k_ptr = i_ptr->kind; /* Cancel bonuses */ for (i = 0; i < MAX_PVALS; i++) i_ptr->pval[i] = 0; i_ptr->to_a = 0; i_ptr->to_h = 0; i_ptr->to_d = 0; /* Level */ (*lev) = k_ptr->level; /* Make known */ object_notice_everything(i_ptr); /* Value */ (*val) = object_value(i_ptr, 1, FALSE); /* Description (too brief) */ if (buf) object_desc(buf, buf_len, i_ptr, ODESC_BASE | ODESC_SPOIL); /* Weight */ if (wgt) strnfmt(wgt, wgt_len, "%3d.%d", i_ptr->weight / 10, i_ptr->weight % 10); /* Hack */ if (!dam) return; /* Misc info */ dam[0] = '\0'; /* Damage */ switch (i_ptr->tval) { /* Bows */ case TV_BOW: { break; } /* Ammo */ case TV_SHOT: case TV_BOLT: case TV_ARROW: { strnfmt(dam, dam_len, "%dd%d", i_ptr->dd, i_ptr->ds); break; } /* Weapons */ case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_DIGGING: { strnfmt(dam, dam_len, "%dd%d", i_ptr->dd, i_ptr->ds); break; } /* Armour */ case TV_BOOTS: case TV_GLOVES: case TV_CLOAK: case TV_CROWN: case TV_HELM: case TV_SHIELD: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { strnfmt(dam, dam_len, "%d", i_ptr->ac); break; } } } /* * Create a spoiler file for items */ static void spoil_obj_desc(const char *fname) { int i, k, s, t, n = 0; u16b who[200]; char buf[1024]; char wgt[80]; char dam[80]; const char *format = "%-51s %7s%6s%4s%9s\n"; /* Open the file */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); fh = file_open(buf, MODE_WRITE, FTYPE_TEXT); /* Oops */ if (!fh) { msg("Cannot create spoiler file."); return; } /* Header */ file_putf(fh, "Spoiler File -- Basic Items (%s)\n\n\n", buildid); /* More Header */ file_putf(fh, format, "Description", "Dam/AC", "Wgt", "Lev", "Cost"); file_putf(fh, format, "----------------------------------------", "------", "---", "---", "----"); /* List the groups */ for (i = 0; TRUE; i++) { /* Write out the group title */ if (group_item[i].name) { /* Hack -- bubble-sort by cost and then level */ for (s = 0; s < n - 1; s++) { for (t = 0; t < n - 1; t++) { int i1 = t; int i2 = t + 1; int e1; int e2; s32b t1; s32b t2; kind_info(NULL, 0, NULL, 0, NULL, 0, &e1, &t1, who[i1]); kind_info(NULL, 0, NULL, 0, NULL, 0, &e2, &t2, who[i2]); if ((t1 > t2) || ((t1 == t2) && (e1 > e2))) { int tmp = who[i1]; who[i1] = who[i2]; who[i2] = tmp; } } } /* Spoil each item */ for (s = 0; s < n; s++) { int e; s32b v; /* Describe the kind */ kind_info(buf, sizeof(buf), dam, sizeof(dam), wgt, sizeof(wgt), &e, &v, who[s]); /* Dump it */ file_putf(fh, " %-51s%7s%6s%4d%9ld\n", buf, dam, wgt, e, (long)(v)); } /* Start a new set */ n = 0; /* Notice the end */ if (!group_item[i].tval) break; /* Start a new set */ file_putf(fh, "\n\n%s\n\n", group_item[i].name); } /* Get legal item types */ for (k = 1; k < z_info->k_max; k++) { object_kind *k_ptr = &k_info[k]; /* Skip wrong tval's */ if (k_ptr->tval != group_item[i].tval) continue; /* Hack -- Skip instant-artifacts */ if (of_has(k_ptr->flags, OF_INSTA_ART)) continue; /* Save the index */ who[n++] = k; } } /* Check for errors */ if (!file_close(fh)) { msg("Cannot close spoiler file."); return; } /* Message */ msg("Successfully created a spoiler file."); } /* * Artifact Spoilers by: randy@PICARD.tamu.edu (Randy Hutson) * * (Mostly) rewritten in 2002 by Andi Sidwell and Robert Ruehlmann. */ /* * The artifacts categorized by type */ static const grouper group_artifact[] = { { TV_SWORD, "Edged Weapons" }, { TV_POLEARM, "Polearms" }, { TV_HAFTED, "Hafted Weapons" }, { TV_BOW, "Bows" }, { TV_DIGGING, "Diggers" }, { TV_SOFT_ARMOR, "Body Armor" }, { TV_HARD_ARMOR, NULL }, { TV_DRAG_ARMOR, NULL }, { TV_CLOAK, "Cloaks" }, { TV_SHIELD, "Shields" }, { TV_HELM, "Helms/Crowns" }, { TV_CROWN, NULL }, { TV_GLOVES, "Gloves" }, { TV_BOOTS, "Boots" }, { TV_LIGHT, "Light Sources" }, { TV_AMULET, "Amulets" }, { TV_RING, "Rings" }, { 0, NULL } }; /* * Create a fake artifact */ bool make_fake_artifact(object_type *o_ptr, struct artifact *artifact) { object_kind *kind; /* Don't bother with empty artifacts */ if (!artifact->tval) return FALSE; /* Get the "kind" index */ kind = lookup_kind(artifact->tval, artifact->sval); if (!kind) return FALSE; /* Create the artifact */ object_prep(o_ptr, kind, 0, MAXIMISE); /* Save the name */ o_ptr->artifact = artifact; /* Extract the fields */ copy_artifact_data(o_ptr, artifact); /* Success */ o_ptr->ident |= IDENT_FAKE; return (TRUE); } /* * Create a spoiler file for artifacts */ static void spoil_artifact(const char *fname) { int i, j; object_type *i_ptr; object_type object_type_body; char buf[1024]; /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); fh = file_open(buf, MODE_WRITE, FTYPE_TEXT); /* Oops */ if (!fh) { msg("Cannot create spoiler file."); return; } /* Dump to the spoiler file */ text_out_hook = text_out_to_file; text_out_file = fh; /* Dump the header */ spoiler_underline(format("Artifact Spoilers for %s", buildid), '='); text_out("\n Randart seed is %u\n", seed_randart); /* List the artifacts by tval */ for (i = 0; group_artifact[i].tval; i++) { /* Write out the group title */ if (group_artifact[i].name) { spoiler_blanklines(2); spoiler_underline(group_artifact[i].name, '='); spoiler_blanklines(1); } /* Now search through all of the artifacts */ for (j = 1; j < z_info->a_max; ++j) { artifact_type *a_ptr = &a_info[j]; char buf2[80]; /* We only want objects in the current group */ if (a_ptr->tval != group_artifact[i].tval) continue; /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Attempt to "forge" the artifact */ if (!make_fake_artifact(i_ptr, a_ptr)) continue; /* Grab artifact name */ object_desc(buf2, sizeof(buf2), i_ptr, ODESC_PREFIX | ODESC_COMBAT | ODESC_EXTRA | ODESC_SPOIL); /* Print name and underline */ spoiler_underline(buf2, '-'); /* Write out the artifact description to the spoiler file */ object_info_spoil(fh, i_ptr, 80); /* * Determine the minimum and maximum depths an * artifact can appear, its rarity, its weight, and * its power rating. */ text_out("\nMin Level %u, Max Level %u, Generation chance %u, Power %d, %d.%d lbs\n", a_ptr->alloc_min, a_ptr->alloc_max, a_ptr->alloc_prob, object_power(i_ptr, FALSE, NULL, TRUE), (a_ptr->weight / 10), (a_ptr->weight % 10)); if (OPT(birth_randarts)) text_out("%s.\n", a_ptr->text); /* Terminate the entry */ spoiler_blanklines(2); } } /* Check for errors */ if (!file_close(fh)) { msg("Cannot close spoiler file."); return; } /* Message */ msg("Successfully created a spoiler file."); } /* * Create a spoiler file for monsters */ static void spoil_mon_desc(const char *fname) { int i, n = 0; char buf[1024]; char nam[80]; char lev[80]; char rar[80]; char spd[80]; char ac[80]; char hp[80]; char exp[80]; u16b *who; /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); fh = file_open(buf, MODE_WRITE, FTYPE_TEXT); /* Oops */ if (!fh) { msg("Cannot create spoiler file."); return; } /* Dump the header */ file_putf(fh, "Monster Spoilers for %s\n", buildid); file_putf(fh, "------------------------------------------\n\n"); /* Dump the header */ file_putf(fh, "%-40.40s%4s%4s%6s%8s%4s %11.11s\n", "Name", "Lev", "Rar", "Spd", "Hp", "Ac", "Visual Info"); file_putf(fh, "%-40.40s%4s%4s%6s%8s%4s %11.11s\n", "----", "---", "---", "---", "--", "--", "-----------"); /* Allocate the "who" array */ who = C_ZNEW(z_info->r_max, u16b); /* Scan the monsters (except the ghost) */ for (i = 1; i < z_info->r_max - 1; i++) { monster_race *r_ptr = &r_info[i]; /* Use that monster */ if (r_ptr->name) who[n++] = (u16b)i; } /* Sort the array by dungeon depth of monsters */ sort(who, n, sizeof(*who), cmp_monsters); /* Scan again */ for (i = 0; i < n; i++) { monster_race *r_ptr = &r_info[who[i]]; const char *name = r_ptr->name; /* Get the "name" */ if (rf_has(r_ptr->flags, RF_QUESTOR)) { strnfmt(nam, sizeof(nam), "[Q] %s", name); } else if (rf_has(r_ptr->flags, RF_UNIQUE)) { strnfmt(nam, sizeof(nam), "[U] %s", name); } else { strnfmt(nam, sizeof(nam), "The %s", name); } /* Level */ strnfmt(lev, sizeof(lev), "%d", r_ptr->level); /* Rarity */ strnfmt(rar, sizeof(rar), "%d", r_ptr->rarity); /* Speed */ if (r_ptr->speed >= 110) strnfmt(spd, sizeof(spd), "+%d", (r_ptr->speed - 110)); else strnfmt(spd, sizeof(spd), "-%d", (110 - r_ptr->speed)); /* Armor Class */ strnfmt(ac, sizeof(ac), "%d", r_ptr->ac); /* Hitpoints */ strnfmt(hp, sizeof(hp), "%d", r_ptr->avg_hp); /* Experience */ strnfmt(exp, sizeof(exp), "%ld", (long)(r_ptr->mexp)); /* Hack -- use visual instead */ strnfmt(exp, sizeof(exp), "%s '%c'", attr_to_text(r_ptr->d_attr), r_ptr->d_char); /* Dump the info */ file_putf(fh, "%-40.40s%4s%4s%6s%8s%4s %11.11s\n", nam, lev, rar, spd, hp, ac, exp); } /* End it */ file_putf(fh, "\n"); /* Free the "who" array */ FREE(who); /* Check for errors */ if (!file_close(fh)) { msg("Cannot close spoiler file."); return; } /* Worked */ msg("Successfully created a spoiler file."); } /* * Monster spoilers originally by: smchorse@ringer.cs.utsa.edu (Shawn McHorse) */ /* * Create a spoiler file for monsters (-SHAWN-) */ static void spoil_mon_info(const char *fname) { char buf[1024]; int i, n; u16b *who; int count = 0; textblock *tb = NULL; /* Open the file */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); fh = file_open(buf, MODE_WRITE, FTYPE_TEXT); if (!fh) { msg("Cannot create spoiler file."); return; } /* Dump the header */ tb = textblock_new(); textblock_append(tb, "Monster Spoilers for %s\n", buildid); textblock_append(tb, "------------------------------------------\n\n"); textblock_to_file(tb, fh, 0, 75); textblock_free(tb); tb = NULL; /* Allocate the "who" array */ who = C_ZNEW(z_info->r_max, u16b); /* Scan the monsters */ for (i = 1; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; /* Use that monster */ if (r_ptr->name) who[count++] = (u16b)i; } sort(who, count, sizeof(*who), cmp_monsters); /* List all monsters in order. */ for (n = 0; n < count; n++) { int r_idx = who[n]; const monster_race *r_ptr = &r_info[r_idx]; const monster_lore *l_ptr = &l_list[r_idx]; tb = textblock_new(); /* Line 1: prefix, name, color, and symbol */ if (rf_has(r_ptr->flags, RF_QUESTOR)) textblock_append(tb, "[Q] "); else if (rf_has(r_ptr->flags, RF_UNIQUE)) textblock_append(tb, "[U] "); else textblock_append(tb, "The "); /* As of 3.5, race->name and race->text are stored as UTF-8 strings; there is no conversion from the source edit files. */ textblock_append_utf8(tb, r_ptr->name); textblock_append(tb, " ("); /* ---)--- */ textblock_append(tb, attr_to_text(r_ptr->d_attr)); textblock_append(tb, " '%c')\n", r_ptr->d_char); /* Line 2: number, level, rarity, speed, HP, AC, exp */ textblock_append(tb, "=== "); textblock_append(tb, "Num:%d ", r_idx); textblock_append(tb, "Lev:%d ", r_ptr->level); textblock_append(tb, "Rar:%d ", r_ptr->rarity); if (r_ptr->speed >= 110) textblock_append(tb, "Spd:+%d ", (r_ptr->speed - 110)); else textblock_append(tb, "Spd:-%d ", (110 - r_ptr->speed)); textblock_append(tb, "Hp:%d ", r_ptr->avg_hp); textblock_append(tb, "Ac:%d ", r_ptr->ac); textblock_append(tb, "Exp:%ld\n", (long)(r_ptr->mexp)); /* Normal description (with automatic line breaks) */ lore_description(tb, r_ptr, l_ptr, TRUE); textblock_append(tb, "\n"); textblock_to_file(tb, fh, 0, 75); textblock_free(tb); tb = NULL; } /* Free the "who" array */ FREE(who); /* Check for errors */ if (!file_close(fh)) { msg("Cannot close spoiler file."); return; } msg("Successfully created a spoiler file."); } static void spoiler_menu_act(const char *title, int row) { if (row == 0) spoil_obj_desc("obj-desc.spo"); else if (row == 1) spoil_artifact("artifact.spo"); else if (row == 2) spoil_mon_desc("mon-desc.spo"); else if (row == 3) spoil_mon_info("mon-info.spo"); message_flush(); } static menu_type *spoil_menu; static menu_action spoil_actions[] = { { 0, 0, "Brief Object Info (obj-desc.spo)", spoiler_menu_act }, { 0, 0, "Brief Artifact Info (artifact.spo)", spoiler_menu_act }, { 0, 0, "Brief Monster Info (mon-desc.spo)", spoiler_menu_act }, { 0, 0, "Full Monster Info (mon-info.spo)", spoiler_menu_act }, }; /* * Create Spoiler files */ void do_cmd_spoilers(void) { if (!spoil_menu) { spoil_menu = menu_new_action(spoil_actions, N_ELEMENTS(spoil_actions)); spoil_menu->selections = lower_case; spoil_menu->title = "Create spoilers"; } screen_save(); clear_from(0); menu_layout(spoil_menu, &SCREEN_REGION); menu_select(spoil_menu, 0, FALSE); screen_load(); } #endif angband-3.5.1/src/.splintrc0000644000175000017500000000014512456456606015066 0ustar chriscchrisc-I . -weak +top-use -warnposixheaders -macrovarprefixexclude -predboolothers -DUSE_GCU -DUSE_NCURSES angband-3.5.1/src/tables.c0000644000175000017500000001245612456456606014655 0ustar chriscchrisc/* * File: tables.c * Purpose: Finely-tuned constants for the game Angband * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "object/tvalsval.h" /* * Global array for looping through the "keypad directions". */ const s16b ddd[9] = { 2, 8, 6, 4, 3, 1, 9, 7, 5 }; /* * Global arrays for converting "keypad direction" into "offsets". */ const s16b ddx[10] = { 0, -1, 0, 1, -1, 0, 1, -1, 0, 1 }; const s16b ddy[10] = { 0, 1, 1, 1, 0, 0, 0, -1, -1, -1 }; /* * Global arrays for optimizing "ddx[ddd[i]]" and "ddy[ddd[i]]". */ const s16b ddx_ddd[9] = { 0, 0, 1, -1, 1, -1, 1, -1, 0 }; const s16b ddy_ddd[9] = { 1, -1, 0, 0, 1, 1, -1, -1, 0 }; /* * This table allows quick conversion from "speed" to "energy" * The basic function WAS ((S>=110) ? (S-110) : (100 / (120-S))) * Note that table access is *much* quicker than computation. * * Note that the table has been changed at high speeds. From * "Slow (-40)" to "Fast (+30)" is pretty much unchanged, but * at speeds above "Fast (+30)", one approaches an asymptotic * effective limit of 50 energy per turn. This means that it * is relatively easy to reach "Fast (+30)" and get about 40 * energy per turn, but then speed becomes very "expensive", * and you must get all the way to "Fast (+50)" to reach the * point of getting 45 energy per turn. After that point, * furthur increases in speed are more or less pointless, * except to balance out heavy inventory. * * Note that currently the fastest monster is "Fast (+30)". * * It should be possible to lower the energy threshhold from * 100 units to 50 units, though this may interact badly with * the (compiled out) small random energy boost code. It may * also tend to cause more "clumping" at high speeds. */ const byte extract_energy[200] = { /* Slow */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Slow */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Slow */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Slow */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Slow */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* Slow */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* S-50 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* S-40 */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* S-30 */ 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, /* S-20 */ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, /* S-10 */ 5, 5, 5, 5, 6, 6, 7, 7, 8, 9, /* Norm */ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* F+10 */ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, /* F+20 */ 30, 31, 32, 33, 34, 35, 36, 36, 37, 37, /* F+30 */ 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, /* F+40 */ 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, /* F+50 */ 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, /* F+60 */ 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, /* F+70 */ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, /* Fast */ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, }; /* * Base experience levels, may be adjusted up for race and/or class */ const s32b player_exp[PY_MAX_LEVEL] = { 10, 25, 45, 70, 100, 140, 200, 280, 380, 500, 650, 850, 1100, 1400, 1800, 2300, 2900, 3600, 4400, 5400, 6800, 8400, 10200, 12500, 17500, 25000, 35000L, 50000L, 75000L, 100000L, 150000L, 200000L, 275000L, 350000L, 450000L, 550000L, 700000L, 850000L, 1000000L, 1250000L, 1500000L, 1800000L, 2100000L, 2400000L, 2700000L, 3000000L, 3500000L, 4000000L, 4500000L, 5000000L }; /* * Player Sexes * * Title, * Winner */ const player_sex sex_info[MAX_SEXES] = { { "Female", "Queen" }, { "Male", "King" }, { "Neuter", "Regent" } }; /* * Abbreviations of healthy stats */ const char *stat_names[A_MAX] = { "STR: ", "INT: ", "WIS: ", "DEX: ", "CON: " }; /* * Abbreviations of damaged stats */ const char *stat_names_reduced[A_MAX] = { "Str: ", "Int: ", "Wis: ", "Dex: ", "Con: " }; /* * Certain "screens" always use the main screen, including News, Birth, * Dungeon, Tomb-stone, High-scores, Macros, Colors, Visuals, Options. * * Later, special flags may allow sub-windows to "steal" stuff from the * main window, including File dump (help), File dump (artifacts, uniques), * Character screen, Small scale map, Previous Messages, Store screen, etc. */ const char *window_flag_desc[32] = { "Display inven/equip", "Display equip/inven", "Display player (basic)", "Display player (extra)", "Display player (compact)", "Display map view", "Display messages", "Display overhead view", "Display monster recall", "Display object recall", "Display monster list", "Display status", "Display item list", NULL, "Display borg messages", "Display borg status", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; const char *inscrip_text[] = { NULL, "strange", "average", "magical", "splendid", "excellent", "special", "unknown" }; angband-3.5.1/src/birth.c0000644000175000017500000007343612456456606014520 0ustar chriscchrisc/* * File: birth.c * Purpose: Character creation * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "birth.h" #include "cmds.h" #include "files.h" #include "game-event.h" #include "game-cmd.h" #include "history.h" #include "object/inventory.h" #include "object/tvalsval.h" #include "object/object.h" #include "squelch.h" #include "quest.h" #include "ui-menu.h" /* * Overview * ======== * This file contains the game-mechanical part of the birth process. * To follow the code, start at player_birth towards the bottom of * the file - that is the only external entry point to the functions * defined here. * * Player (in the Angband sense of character) birth is modelled as a * a series of commands from the UI to the game to manipulate the * character and corresponding events to inform the UI of the outcomes * of these changes. * * The current aim of this section is that after any birth command * is carried out, the character should be left in a playable state. * In particular, this means that if a savefile is supplied, the * character will be set up according to the "quickstart" rules until * another race or class is chosen, or until the stats are reset by * the UI. * * Once the UI signals that the player is happy with the character, the * game does housekeeping to ensure the character is ready to start the * game (clearing the history log, making sure options are set, etc) * before returning control to the game proper. */ /* These functions are defined at the end of the file */ static int roman_to_int(const char *roman); static int int_to_roman(int n, char *roman, size_t bufsize); /* * Maximum amount of starting equipment, and starting gold */ #define STARTING_GOLD 600 /* * Forward declare */ typedef struct birther /*lovely*/ birther; /*sometimes we think she's a dream*/ /* * A structure to hold "rolled" information, and any * other useful state for the birth process. * * XXX Demand Obama's birth certificate */ struct birther { byte sex; const struct player_race *race; const struct player_class *class; s16b age; s16b wt; s16b ht; s16b sc; s32b au; s16b stat[A_MAX]; char *history; }; /* * Save the currently rolled data into the supplied 'player'. */ static void save_roller_data(birther *player) { int i; /* Save the data */ player->sex = p_ptr->psex; player->race = p_ptr->race; player->class = p_ptr->class; player->age = p_ptr->age; player->wt = p_ptr->wt_birth; player->ht = p_ptr->ht_birth; player->au = p_ptr->au_birth; /* Save the stats */ for (i = 0; i < A_MAX; i++) player->stat[i] = p_ptr->stat_birth[i]; player->history = p_ptr->history; } /* * Load stored player data from 'player' as the currently rolled data, * optionally placing the current data in 'prev_player' (if 'prev_player' * is non-NULL). * * It is perfectly legal to specify the same "birther" for both 'player' * and 'prev_player'. */ static void load_roller_data(birther *player, birther *prev_player) { int i; /* The initialisation is just paranoia - structure assignment is (perhaps) not strictly defined to work with uninitialised parts of structures. */ birther temp; WIPE(&temp, birther); /*** Save the current data if we'll need it later ***/ if (prev_player) save_roller_data(&temp); /*** Load the previous data ***/ /* Load the data */ p_ptr->psex = player->sex; p_ptr->race = player->race; p_ptr->class = player->class; p_ptr->age = player->age; p_ptr->wt = p_ptr->wt_birth = player->wt; p_ptr->ht = p_ptr->ht_birth = player->ht; p_ptr->au_birth = player->au; p_ptr->au = STARTING_GOLD; /* Load the stats */ for (i = 0; i < A_MAX; i++) { p_ptr->stat_max[i] = p_ptr->stat_cur[i] = p_ptr->stat_birth[i] = player->stat[i]; } /* Load the history */ p_ptr->history = player->history; /*** Save the current data if the caller is interested in it. ***/ if (prev_player) *prev_player = temp; } /* * Roll for a characters stats * * For efficiency, we include a chunk of "calc_bonuses()". */ static void get_stats(int stat_use[A_MAX]) { int i, j; int bonus; int dice[18]; /* Roll and verify some stats */ while (TRUE) { /* Roll some dice */ for (j = i = 0; i < 18; i++) { /* Roll the dice */ dice[i] = randint1(3 + i % 3); /* Collect the maximum */ j += dice[i]; } /* Verify totals */ if ((j > 42) && (j < 54)) break; } /* Roll the stats */ for (i = 0; i < A_MAX; i++) { /* Extract 5 + 1d3 + 1d4 + 1d5 */ j = 5 + dice[3*i] + dice[3*i+1] + dice[3*i+2]; /* Save that value */ p_ptr->stat_max[i] = j; /* Obtain a "bonus" for "race" and "class" */ bonus = p_ptr->race->r_adj[i] + p_ptr->class->c_adj[i]; /* Variable stat maxes */ /* Start fully healed */ p_ptr->stat_cur[i] = p_ptr->stat_max[i]; /* Efficiency -- Apply the racial/class bonuses */ stat_use[i] = modify_stat_value(p_ptr->stat_max[i], bonus); p_ptr->stat_birth[i] = p_ptr->stat_max[i]; } } static void roll_hp(void) { int i, j, min_value, max_value; /* Minimum hitpoints at highest level */ min_value = (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 3) / 8; min_value += PY_MAX_LEVEL; /* Maximum hitpoints at highest level */ max_value = (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 5) / 8; max_value += PY_MAX_LEVEL; /* Roll out the hitpoints */ while (TRUE) { /* Roll the hitpoint values */ for (i = 1; i < PY_MAX_LEVEL; i++) { j = randint1(p_ptr->hitdie); p_ptr->player_hp[i] = p_ptr->player_hp[i-1] + j; } /* XXX Could also require acceptable "mid-level" hitpoints */ /* Require "valid" hitpoints at highest level */ if (p_ptr->player_hp[PY_MAX_LEVEL-1] < min_value) continue; if (p_ptr->player_hp[PY_MAX_LEVEL-1] > max_value) continue; /* Acceptable */ break; } } static void get_bonuses(void) { /* Calculate the bonuses and hitpoints */ p_ptr->update |= (PU_BONUS | PU_HP); /* Update stuff */ update_stuff(p_ptr); /* Fully healed */ p_ptr->chp = p_ptr->mhp; /* Fully rested */ p_ptr->csp = p_ptr->msp; } /* * Get the racial history, and social class, using the "history charts". */ char *get_history(struct history_chart *chart) { int roll; struct history_entry *entry; char *res = NULL; while (chart) { roll = randint1(100); for (entry = chart->entries; entry; entry = entry->next) if (roll <= entry->roll) break; assert(entry); res = string_append(res, entry->text); chart = entry->succ; } return res; } /* * Computes character's age, height, and weight */ static void get_ahw(struct player *p) { /* Calculate the age */ p->age = p->race->b_age + randint1(p->race->m_age); /* Calculate the height/weight for males */ if (p->psex == SEX_MALE) { p->ht = p->ht_birth = Rand_normal(p->race->m_b_ht, p->race->m_m_ht); p->wt = p->wt_birth = Rand_normal(p->race->m_b_wt, p->race->m_m_wt); } /* Calculate the height/weight for females */ else if (p->psex == SEX_FEMALE) { p->ht = p->ht_birth = Rand_normal(p->race->f_b_ht, p->race->f_m_ht); p->wt = p->wt_birth = Rand_normal(p->race->f_b_wt, p->race->f_m_wt); } /* For neither, go inbetween */ else { p->ht = p->ht_birth = Rand_normal( (p->race->f_b_ht + p->race->m_b_ht) / 2, (p->race->f_m_ht + p->race->m_m_ht) / 2); p->wt = p->wt_birth = Rand_normal( (p->race->f_b_wt + p->race->m_b_wt) / 2, (p->race->f_m_wt + p->race->m_m_wt) / 2); } } /* * Get the player's starting money */ static void get_money(void) { /* if (OPT(birth_money)) { p_ptr->au_birth = 200; p_ptr->au = 500; } else { */ p_ptr->au = p_ptr->au_birth = STARTING_GOLD; } void player_init(struct player *p) { int i; if (p->inventory) mem_free(p->inventory); /* Wipe the player */ (void)WIPE(p, struct player); /* Start with no artifacts made yet */ for (i = 0; z_info && i < z_info->a_max; i++) { artifact_type *a_ptr = &a_info[i]; a_ptr->created = FALSE; a_ptr->seen = FALSE; } /* Start with no quests */ quest_reset(); for (i = 1; z_info && i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; k_ptr->tried = FALSE; k_ptr->aware = FALSE; } for (i = 1; z_info && i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; monster_lore *l_ptr = &l_list[i]; r_ptr->cur_num = 0; r_ptr->max_num = 100; if (rf_has(r_ptr->flags, RF_UNIQUE)) r_ptr->max_num = 1; l_ptr->pkills = 0; } /* Hack -- no ghosts */ if (z_info) r_info[z_info->r_max-1].max_num = 0; /* Always start with a well fed player (this is surely in the wrong fn) */ p->food = PY_FOOD_FULL - 1; /* None of the spells have been learned yet */ for (i = 0; i < PY_MAX_SPELLS; i++) p->spell_order[i] = 99; p->inventory = C_ZNEW(ALL_INVEN_TOTAL, struct object); /* First turn. */ turn = 1; p_ptr->total_energy = 0; p_ptr->resting_turn = 0; /* XXX default race/class */ p_ptr->race = races; p_ptr->class = classes; } /** * Try to wield everything wieldable in the inventory. */ void wield_all(struct player *p) { object_type *o_ptr; object_type *i_ptr; object_type object_type_body; int slot; int item; int num; bool is_ammo; /* Scan through the slots backwards */ for (item = INVEN_PACK - 1; item >= 0; item--) { o_ptr = &p->inventory[item]; is_ammo = obj_is_ammo(o_ptr); /* Skip non-objects */ if (!o_ptr->kind) continue; /* Make sure we can wield it */ slot = wield_slot(o_ptr); if (slot < INVEN_WIELD) continue; i_ptr = &p->inventory[slot]; if (i_ptr->kind && (!is_ammo || (is_ammo && !object_similar(o_ptr, i_ptr, OSTACK_PACK)))) continue; /* Figure out how much of the item we'll be wielding */ num = is_ammo ? o_ptr->number : 1; /* Get local object */ i_ptr = &object_type_body; object_copy(i_ptr, o_ptr); /* Modify quantity */ i_ptr->number = num; /* Decrease the item (from the pack) */ inven_item_increase(item, -num); inven_item_optimize(item); /* Get the wield slot */ o_ptr = &p->inventory[slot]; /* Wear the new stuff */ object_copy(o_ptr, i_ptr); /* Increase the weight */ p->total_weight += i_ptr->weight * i_ptr->number; /* Increment the equip counter by hand */ p->equip_cnt++; } save_quiver_size(p); return; } /* * Init players with some belongings * * Having an item identifies it and makes the player "aware" of its purpose. */ static void player_outfit(struct player *p) { const struct start_item *si; object_type object_type_body; /* Give the player starting equipment */ for (si = p_ptr->class->start_items; si; si = si->next) { /* Get local object */ struct object *i_ptr = &object_type_body; int num = rand_range(si->min, si->max); /* Without start_kit, only start with 1 food and 1 light */ if (!OPT(birth_start_kit)) { if (si->kind->tval != TV_FOOD && si->kind->tval != TV_LIGHT) continue; num = 1; } /* Prepare the item */ object_prep(i_ptr, si->kind, 0, MINIMISE); i_ptr->number = num; i_ptr->origin = ORIGIN_BIRTH; object_flavor_aware(i_ptr); object_notice_everything(i_ptr); inven_carry(p, i_ptr); si->kind->everseen = TRUE; /* Deduct the cost of the item from starting cash */ p->au -= object_value(i_ptr, i_ptr->number, FALSE); } /* Sanity check */ if (p->au < 0) p->au = 0; /* Now try wielding everything */ wield_all(p); } /* * Cost of each "point" of a stat. */ static const int birth_stat_costs[18 + 1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 4 }; /* It was feasible to get base 17 in 3 stats with the autoroller */ #define MAX_BIRTH_POINTS 20 /* 3 * (1+1+1+1+1+1+2) */ static void recalculate_stats(int *stats, int points_left) { int i; /* Variable stat maxes */ for (i = 0; i < A_MAX; i++) p_ptr->stat_cur[i] = p_ptr->stat_max[i] = p_ptr->stat_birth[i] = stats[i]; /* Gold is inversely proportional to cost */ p_ptr->au_birth = STARTING_GOLD + (50 * points_left); /* Update bonuses, hp, etc. */ get_bonuses(); /* Tell the UI about all this stuff that's changed. */ event_signal(EVENT_GOLD); event_signal(EVENT_AC); event_signal(EVENT_HP); event_signal(EVENT_STATS); } static void reset_stats(int stats[A_MAX], int points_spent[A_MAX], int *points_left, bool update_display) { int i; /* Calculate and signal initial stats and points totals. */ *points_left = MAX_BIRTH_POINTS; for (i = 0; i < A_MAX; i++) { /* Initial stats are all 10 and costs are zero */ stats[i] = 10; points_spent[i] = 0; } /* Use the new "birth stat" values to work out the "other" stat values (i.e. after modifiers) and tell the UI things have changed. */ if (update_display) { recalculate_stats(stats, *points_left); event_signal_birthpoints(points_spent, *points_left); } } static bool buy_stat(int choice, int stats[A_MAX], int points_spent[A_MAX], int *points_left, bool update_display) { /* Must be a valid stat, and have a "base" of below 18 to be adjusted */ if (!(choice >= A_MAX || choice < 0) && (stats[choice] < 18)) { /* Get the cost of buying the extra point (beyond what it has already cost to get this far). */ int stat_cost = birth_stat_costs[stats[choice] + 1]; if (stat_cost <= *points_left) { stats[choice]++; points_spent[choice] += stat_cost; *points_left -= stat_cost; if (update_display) { /* Tell the UI the new points situation. */ event_signal_birthpoints(points_spent, *points_left); /* Recalculate everything that's changed because the stat has changed, and inform the UI. */ recalculate_stats(stats, *points_left); } return TRUE; } } /* Didn't adjust stat. */ return FALSE; } static bool sell_stat(int choice, int stats[A_MAX], int points_spent[A_MAX], int *points_left, bool update_display) { /* Must be a valid stat, and we can't "sell" stats below the base of 10. */ if (!(choice >= A_MAX || choice < 0) && (stats[choice] > 10)) { int stat_cost = birth_stat_costs[stats[choice]]; stats[choice]--; points_spent[choice] -= stat_cost; *points_left += stat_cost; if (update_display) { /* Tell the UI the new points situation. */ event_signal_birthpoints(points_spent, *points_left); /* Recalculate everything that's changed because the stat has changed, and inform the UI. */ recalculate_stats(stats, *points_left); return TRUE; } } /* Didn't adjust stat. */ return FALSE; } /* * This picks some reasonable starting values for stats based on the * current race/class combo, etc. For now I'm disregarding concerns * about role-playing, etc, and using the simple outline from * http://angband.oook.cz/forum/showpost.php?p=17588&postcount=6: * * 0. buy base STR 17 * 1. if possible buy adj DEX of 18/10 * 2. spend up to half remaining points on each of spell-stat and con, * but only up to max base of 16 unless a pure class * [mage or priest or warrior] * 3. If there are any points left, spend as much as possible in order * on DEX and then the non-spell-stat. */ static void generate_stats(int stats[A_MAX], int points_spent[A_MAX], int *points_left) { int step = 0; int maxed[A_MAX] = { 0 }; bool caster = FALSE, warrior = FALSE; /* Determine whether the class is warrior */ if (p_ptr->class->max_attacks > 5) { warrior = TRUE; } /* Determine whether the class is priest/mage */ if (p_ptr->class->max_attacks < 5) { caster = TRUE; } while (*points_left && step >= 0) { switch (step) { /* Buy base STR 17 */ case 0: { if (!maxed[A_STR] && stats[A_STR] < 17) { if (!buy_stat(A_STR, stats, points_spent, points_left, FALSE)) maxed[A_STR] = TRUE; } else { step++; /* If pure caster skip to step 3 */ if (caster){ step = 3; } } break; } /* Try and buy adj DEX of 18/10 */ case 1: { if (!maxed[A_DEX] && p_ptr->state.stat_top[A_DEX] < 18+10){ if (!buy_stat(A_DEX, stats, points_spent, points_left, FALSE)) maxed[A_DEX] = TRUE; } else { step++; } break; } /* If we can't get 18/10 dex, sell it back. */ case 2: { if (p_ptr->state.stat_top[A_DEX] < 18+10){ while (stats[A_DEX] > 10) sell_stat(A_DEX, stats, points_spent, points_left, FALSE); maxed[A_DEX] = FALSE; } step++; } /* * Spend up to half remaining points on each of spell-stat and * con, but only up to max base of 16 unless a pure class * [mage or priest or warrior] */ case 3: { int points_trigger = *points_left / 2; if (warrior) { points_trigger = *points_left; } if (!warrior) { while (!maxed[p_ptr->class->spell_stat] && (caster || stats[p_ptr->class->spell_stat] < 16) && points_spent[p_ptr->class->spell_stat] < points_trigger) { if (!buy_stat(p_ptr->class->spell_stat, stats, points_spent, points_left, FALSE)) { maxed[p_ptr->class->spell_stat] = TRUE; } if (points_spent[p_ptr->class->spell_stat] > points_trigger) { sell_stat(p_ptr->class->spell_stat, stats, points_spent, points_left, FALSE); maxed[p_ptr->class->spell_stat] = TRUE; } } } /* Skip CON for casters because DEX is more important early and is handled in 4 */ while (!maxed[A_CON] && !(caster) && stats[A_CON] < 16 && points_spent[A_CON] < points_trigger) { if (!buy_stat(A_CON, stats, points_spent,points_left, FALSE)) { maxed[A_CON] = TRUE; } if (points_spent[A_CON] > points_trigger) { sell_stat(A_CON, stats, points_spent, points_left, FALSE); maxed[A_CON] = TRUE; } } step++; break; } /* * If there are any points left, spend as much as possible in * order on DEX, and the non-spell-stat. */ case 4:{ int next_stat; if (!maxed[A_DEX]) { next_stat = A_DEX; } else if (!maxed[A_INT] && p_ptr->class->spell_stat != A_INT) { next_stat = A_INT; } else if (!maxed[A_WIS] && p_ptr->class->spell_stat != A_WIS) { next_stat = A_WIS; } else { step++; break; } /* Buy until we can't buy any more. */ while (buy_stat(next_stat, stats, points_spent, points_left, FALSE)); maxed[next_stat] = TRUE; break; } default: { step = -1; break; } } } /* Tell the UI the new points situation. */ event_signal_birthpoints(points_spent, *points_left); /* Recalculate everything that's changed because the stat has changed, and inform the UI. */ recalculate_stats(stats, *points_left); } /* * This fleshes out a full player based on the choices currently made, * and so is called whenever things like race or class are chosen. */ void player_generate(struct player *p, const player_sex *s, const struct player_race *r, const struct player_class *c) { if (!s) s = &sex_info[p->psex]; if (!c) c = p->class; if (!r) r = p->race; p->sex = s; p->class = c; p->race = r; /* Level 1 */ p->max_lev = p->lev = 1; /* Experience factor */ p->expfact = p->race->r_exp + p->class->c_exp; /* Hitdice */ p->hitdie = p->race->r_mhp + p->class->c_mhp; /* Initial hitpoints */ p->mhp = p->hitdie; /* Pre-calculate level 1 hitdice */ p->player_hp[0] = p->hitdie; /* Roll for age/height/weight */ get_ahw(p); p->history = get_history(p->race->history); } /* Reset everything back to how it would be on loading the game. */ static void do_birth_reset(bool use_quickstart, birther *quickstart_prev) { /* If there's quickstart data, we use it to set default character choices. */ if (use_quickstart && quickstart_prev) load_roller_data(quickstart_prev, NULL); player_generate(p_ptr, NULL, NULL, NULL); /* Update stats with bonuses, etc. */ get_bonuses(); } /* * Create a new character. * * Note that we may be called with "junk" leftover in the various * fields, so we must be sure to clear them first. */ void player_birth(bool quickstart_allowed) { int i; game_command blank = { CMD_NULL, 0, {{0}} }; game_command *cmd = ␣ int stats[A_MAX]; int points_spent[A_MAX]; int points_left; char *buf; int success; bool rolled_stats = FALSE; /* * The last character displayed, to allow the user to flick between two. * We rely on prev.age being zero to determine whether there is a stored * character or not, so initialise it here. */ birther prev = { 0 }; /* * If quickstart is allowed, we store the old character in this, * to allow for it to be reloaded if we step back that far in the * birth process. */ birther quickstart_prev = { 0 }; /* * If there's a quickstart character, store it for later use. * If not, default to whatever the first of the choices is. */ if (quickstart_allowed) save_roller_data(&quickstart_prev); else player_generate(p_ptr, &sex_info[p_ptr->psex], player_id2race(0), player_id2class(0)); /* Handle incrementing name suffix */ buf = find_roman_suffix_start(op_ptr->full_name); if (buf) { /* Try to increment the roman suffix */ success = int_to_roman((roman_to_int(buf) + 1), buf, (sizeof(op_ptr->full_name) - (buf - (char *)&op_ptr->full_name))); if (!success) msg("Sorry, could not deal with suffix"); } /* We're ready to start the interactive birth process. */ event_signal_flag(EVENT_ENTER_BIRTH, quickstart_allowed); /* * Loop around until the UI tells us we have an acceptable character. * Note that it is possible to quit from inside this loop. */ while (cmd->command != CMD_ACCEPT_CHARACTER) { /* Grab a command from the queue - we're happy to wait for it. */ if (cmd_get(CMD_BIRTH, &cmd, TRUE) != 0) continue; if (cmd->command == CMD_BIRTH_RESET) { player_init(p_ptr); reset_stats(stats, points_spent, &points_left, FALSE); do_birth_reset(quickstart_allowed, &quickstart_prev); rolled_stats = FALSE; } else if (cmd->command == CMD_CHOOSE_SEX) { p_ptr->psex = cmd->arg[0].choice; player_generate(p_ptr, NULL, NULL, NULL); } else if (cmd->command == CMD_CHOOSE_RACE) { player_generate(p_ptr, NULL, player_id2race(cmd->arg[0].choice), NULL); reset_stats(stats, points_spent, &points_left, FALSE); generate_stats(stats, points_spent, &points_left); rolled_stats = FALSE; } else if (cmd->command == CMD_CHOOSE_CLASS) { player_generate(p_ptr, NULL, NULL, player_id2class(cmd->arg[0].choice)); reset_stats(stats, points_spent, &points_left, FALSE); generate_stats(stats, points_spent, &points_left); rolled_stats = FALSE; } else if (cmd->command == CMD_FINALIZE_OPTIONS) { /* Reset score options from cheat options */ for (i = OPT_CHEAT; i < OPT_CHEAT + N_OPTS_CHEAT; i++) { op_ptr->opt[OPT_SCORE + (i - OPT_CHEAT)] = op_ptr->opt[i]; } } else if (cmd->command == CMD_BUY_STAT) { /* .choice is the stat to buy */ if (!rolled_stats) buy_stat(cmd->arg[0].choice, stats, points_spent, &points_left, TRUE); } else if (cmd->command == CMD_SELL_STAT) { /* .choice is the stat to sell */ if (!rolled_stats) sell_stat(cmd->arg[0].choice, stats, points_spent, &points_left, TRUE); } else if (cmd->command == CMD_RESET_STATS) { /* .choice is whether to regen stats */ reset_stats(stats, points_spent, &points_left, TRUE); if (cmd->arg[0].choice) generate_stats(stats, points_spent, &points_left); rolled_stats = FALSE; } else if (cmd->command == CMD_ROLL_STATS) { save_roller_data(&prev); /* Get a new character */ get_stats(stats); /* Update stats with bonuses, etc. */ get_bonuses(); /* There's no real need to do this here, but it's tradition. */ get_ahw(p_ptr); p_ptr->history = get_history(p_ptr->race->history); event_signal(EVENT_GOLD); event_signal(EVENT_AC); event_signal(EVENT_HP); event_signal(EVENT_STATS); /* Give the UI some dummy info about the points situation. */ points_left = 0; for (i = 0; i < A_MAX; i++) { points_spent[i] = 0; } event_signal_birthpoints(points_spent, points_left); /* Lock out buying and selling of stats based on rolled stats. */ rolled_stats = TRUE; } else if (cmd->command == CMD_PREV_STATS) { /* Only switch to the stored "previous" character if we've actually got one to load. */ if (prev.age) { load_roller_data(&prev, &prev); get_bonuses(); } event_signal(EVENT_GOLD); event_signal(EVENT_AC); event_signal(EVENT_HP); event_signal(EVENT_STATS); } else if (cmd->command == CMD_NAME_CHOICE) { /* Set player name */ my_strcpy(op_ptr->full_name, cmd->arg[0].string, sizeof(op_ptr->full_name)); string_free((void *) cmd->arg[0].string); } /* Various not-specific-to-birth commands. */ else if (cmd->command == CMD_HELP) { char filename[80]; strnfmt(filename, sizeof(filename), "birth.txt"); screen_save(); show_file(filename, NULL, 0, 0); screen_load(); } else if (cmd->command == CMD_QUIT) { quit(NULL); } } roll_hp(); squelch_birth_init(); /* Clear old messages, add new starting message */ history_clear(); history_add("Began the quest to destroy Morgoth.", HISTORY_PLAYER_BIRTH, 0); /* Reset message prompt (i.e. no extraneous -more-s) */ msg_flag = TRUE; /* Note player birth in the message recall */ message_add(" ", MSG_GENERIC); message_add(" ", MSG_GENERIC); message_add("====================", MSG_GENERIC); message_add(" ", MSG_GENERIC); message_add(" ", MSG_GENERIC); /* Give the player some money */ get_money(); /* Outfit the player, if they can sell the stuff */ player_outfit(p_ptr); /* Initialise the stores */ store_reset(); /* Now we're really done.. */ event_signal(EVENT_LEAVE_BIRTH); } /*** Roman numeral functions, for dynastic successions ***/ /* * Find the start of a possible Roman numerals suffix by going back from the * end of the string to a space, then checking that all the remaining chars * are valid Roman numerals. * * Return the start position, or NULL if there isn't a valid suffix. */ char *find_roman_suffix_start(const char *buf) { const char *start = strrchr(buf, ' '); const char *p; if (start) { start++; p = start; while (*p) { if (*p != 'I' && *p != 'V' && *p != 'X' && *p != 'L' && *p != 'C' && *p != 'D' && *p != 'M') { start = NULL; break; } ++p; } } return (char *)start; } /* * Converts an arabic numeral (int) to a roman numeral (char *). * * An arabic numeral is accepted in parameter `n`, and the corresponding * upper-case roman numeral is placed in the parameter `roman`. The * length of the buffer must be passed in the `bufsize` parameter. When * there is insufficient room in the buffer, or a roman numeral does not * exist (e.g. non-positive integers) a value of 0 is returned and the * `roman` buffer will be the empty string. On success, a value of 1 is * returned and the zero-terminated roman numeral is placed in the * parameter `roman`. */ static int int_to_roman(int n, char *roman, size_t bufsize) { /* Roman symbols */ char roman_symbol_labels[13][3] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; int roman_symbol_values[13] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; /* Clear the roman numeral buffer */ roman[0] = '\0'; /* Roman numerals have no zero or negative numbers */ if (n < 1) return 0; /* Build the roman numeral in the buffer */ while (n > 0) { int i = 0; /* Find the largest possible roman symbol */ while (n < roman_symbol_values[i]) i++; /* No room in buffer, so abort */ if (strlen(roman) + strlen(roman_symbol_labels[i]) + 1 > bufsize) break; /* Add the roman symbol to the buffer */ my_strcat(roman, roman_symbol_labels[i], bufsize); /* Decrease the value of the arabic numeral */ n -= roman_symbol_values[i]; } /* Ran out of space and aborted */ if (n > 0) { /* Clean up and return */ roman[0] = '\0'; return 0; } return 1; } /* * Converts a roman numeral (char *) to an arabic numeral (int). * * The null-terminated roman numeral is accepted in the `roman` * parameter and the corresponding integer arabic numeral is returned. * Only upper-case values are considered. When the `roman` parameter * is empty or does not resemble a roman numeral, a value of -1 is * returned. * * XXX This function will parse certain non-sense strings as roman * numerals, such as IVXCCCVIII */ static int roman_to_int(const char *roman) { size_t i; int n = 0; char *p; char roman_token_chr1[] = "MDCLXVI"; const char *roman_token_chr2[] = {0, 0, "DM", 0, "LC", 0, "VX"}; int roman_token_vals[7][3] = {{1000}, {500}, {100, 400, 900}, {50}, {10, 40, 90}, {5}, {1, 4, 9}}; if (strlen(roman) == 0) return -1; /* Check each character for a roman token, and look ahead to the character after this one to check for subtraction */ for (i = 0; i < strlen(roman); i++) { char c1, c2; int c1i, c2i; /* Get the first and second chars of the next roman token */ c1 = roman[i]; c2 = roman[i + 1]; /* Find the index for the first character */ p = strchr(roman_token_chr1, c1); if (p) { c1i = p - roman_token_chr1; } else { return -1; } /* Find the index for the second character */ c2i = 0; if (roman_token_chr2[c1i] && c2) { p = strchr(roman_token_chr2[c1i], c2); if (p) { c2i = (p - roman_token_chr2[c1i]) + 1; /* Two-digit token, so skip a char on the next pass */ i++; } } /* Increase the arabic numeral */ n += roman_token_vals[c1i][c2i]; } return n; } angband-3.5.1/src/wizard.h0000644000175000017500000000042412456456607014701 0ustar chriscchrisc#ifndef INCLUDED_WIZARD_H #define INCLUDED_WIZARD_H /* wizard.c */ extern void do_cmd_debug(void); /* wiz-stats.c */ void stats_collect(void); void disconnect_stats(void); void pit_stats(void); /* wiz-spoil.c */ void do_cmd_spoilers(void); #endif /* !INCLUDED_WIZARD_H */ angband-3.5.1/src/savefile.h0000644000175000017500000000473512456456606015207 0ustar chriscchrisc#ifndef INCLUDED_SAVEFILE_H #define INCLUDED_SAVEFILE_H #define ITEM_VERSION 5 /*** Savefile API ***/ /** * Set the filename of the savefile. */ void savefile_set_name(const char *fname); /** * Save to the given location. Returns TRUE on success, FALSE otherwise. */ bool savefile_save(const char *path); /** * Load the savefile given. Returns TRUE on succcess, FALSE otherwise. */ bool savefile_load(const char *path); /** * Try to get a description for this savefile. */ const char *savefile_get_description(const char *path); /*** Ignore these ***/ /* Utility */ void note(const char *msg); /* Writing bits */ void wr_byte(byte v); void wr_u16b(u16b v); void wr_s16b(s16b v); void wr_u32b(u32b v); void wr_s32b(s32b v); void wr_string(const char *str); void pad_bytes(int n); /* Reading bits */ void rd_byte(byte *ip); void rd_u16b(u16b *ip); void rd_s16b(s16b *ip); void rd_u32b(u32b *ip); void rd_s32b(s32b *ip); void rd_string(char *str, int max); void strip_bytes(int n); /* load.c */ int rd_randomizer(void); int rd_options_2(void); int rd_messages(void); int rd_monster_memory_2(void); int rd_monster_memory_3(void); int rd_object_memory_1(void); int rd_object_memory_2(void); int rd_quests(void); int rd_artifacts(void); int rd_player_2(void); int rd_player_3(void); int rd_squelch(void); int rd_misc(void); int rd_misc_2(void); int rd_player_hp(void); int rd_player_spells(void); int rd_inventory_1(void); int rd_inventory_2(void); int rd_inventory_3(void); int rd_inventory_4(void); int rd_inventory_5(void); int rd_inventory_6(void); int rd_stores_1(void); int rd_stores_2(void); int rd_stores_3(void); int rd_stores_4(void); int rd_stores_5(void); int rd_stores_6(void); int rd_dungeon(void); int rd_objects_1(void); int rd_objects_2(void); int rd_objects_3(void); int rd_objects_4(void); int rd_objects_5(void); int rd_objects_6(void); int rd_monsters_6(void); int rd_monsters_7(void); int rd_history(void); int rd_null(void); /* save.c */ void wr_description(void); void wr_randomizer(void); void wr_options(void); void wr_messages(void); void wr_monster_memory(void); void wr_object_memory(void); void wr_quests(void); void wr_artifacts(void); void wr_player(void); void wr_squelch(void); void wr_misc(void); void wr_player_hp(void); void wr_player_spells(void); void wr_randarts(void); void wr_inventory(void); void wr_stores(void); void wr_dungeon(void); void wr_objects(void); void wr_monsters(void); void wr_ghost(void); void wr_history(void); #endif /* INCLUDED_SAVEFILE_H */ angband-3.5.1/src/z-textblock.h0000644000175000017500000000146312456456607015653 0ustar chriscchrisc#ifndef INCLUDED_Z_TEXTBLOCK_H #define INCLUDED_Z_TEXTBLOCK_H #include "z-file.h" #include "defines.h" /** Opaque text_block type */ typedef struct textblock textblock; textblock *textblock_new(void); void textblock_free(textblock *tb); void textblock_append(textblock *tb, const char *fmt, ...); void textblock_append_c(textblock *tb, byte attr, const char *fmt, ...); void textblock_append_pict(textblock *tb, byte attr, int c); void textblock_append_utf8(textblock *tb, const char *utf8_string); const wchar_t *textblock_text(textblock *tb); const byte *textblock_attrs(textblock *tb); size_t textblock_calculate_lines(textblock *tb, size_t **line_starts, size_t **line_lengths, size_t width); void textblock_to_file(textblock *tb, ang_file *f, int indent, int wrap_at); #endif /* INCLUDED_Z_TEXTBLOCK_H */ angband-3.5.1/src/squelch.h0000644000175000017500000000403312456456606015044 0ustar chriscchrisc#ifndef SQUELCH_H #define SQUELCH_H /* * Used for mapping the values below to names. */ typedef struct { unsigned int enum_val; const char *name; } quality_name_struct; /* * List of kinds of item, for pseudo-id squelch. */ typedef enum { TYPE_WEAPON_POINTY, TYPE_WEAPON_BLUNT, TYPE_WEAPON_GREAT, TYPE_SHOOTER, TYPE_MISSILE_SLING, TYPE_MISSILE_BOW, TYPE_MISSILE_XBOW, TYPE_ARMOR_ROBE, TYPE_ARMOR_BODY, TYPE_ARMOR_DRAGON, TYPE_ARMOR_CLOAK, TYPE_ARMOR_ELVEN_CLOAK, TYPE_ARMOR_SHIELD, TYPE_ARMOR_HEAD, TYPE_ARMOR_HANDS, TYPE_ARMOR_FEET, TYPE_DIGGER, TYPE_RING, TYPE_AMULET, TYPE_LIGHT, TYPE_MAX } squelch_type_t; /* * The different kinds of quality squelch */ enum { SQUELCH_NONE, SQUELCH_BAD, SQUELCH_AVERAGE, SQUELCH_GOOD, SQUELCH_EXCELLENT_NO_HI, SQUELCH_EXCELLENT_NO_SPL, SQUELCH_ALL, SQUELCH_MAX }; /* * Squelch flags */ #define SQUELCH_IF_AWARE 0x01 #define SQUELCH_IF_UNAWARE 0x02 extern quality_name_struct quality_values[SQUELCH_MAX]; extern quality_name_struct quality_choices[TYPE_MAX]; /* squelch.c */ void squelch_init(void); void squelch_birth_init(void); const char *get_autoinscription(object_kind *kind); int apply_autoinscription(object_type *o_ptr); int remove_autoinscription(s16b kind); int add_autoinscription(s16b kind, const char *inscription); void autoinscribe_ground(void); void autoinscribe_pack(void); void kind_squelch_clear(object_kind *k_ptr); bool kind_is_squelched_aware(const object_kind *k_ptr); bool kind_is_squelched_unaware(const object_kind *k_ptr); void kind_squelch_when_aware(object_kind *k_ptr); void kind_squelch_when_unaware(object_kind *k_ptr); bool squelch_item_ok(const object_type *o_ptr); bool object_is_squelched(const object_type *o_ptr); void squelch_drop(void); byte squelch_level_of(const object_type *o_ptr); squelch_type_t squelch_type_of(const object_type *o_ptr); void object_squelch_flavor_of(const object_type *o_ptr); const char *squelch_name_for_type(squelch_type_t type); extern byte squelch_level[]; extern const size_t squelch_size; #endif /* !SQUELCH_H */ angband-3.5.1/src/z-msg.c0000644000175000017500000001062012456456607014430 0ustar chriscchrisc/* * File: z-msg.c * Purpose: Message handling * * Copyright (c) 2007 Elly, Andi Sidwell * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. */ #include "z-virt.h" #include "z-term.h" #include "z-util.h" #include "z-msg.h" typedef struct _message_t { char *str; struct _message_t *newer; struct _message_t *older; u16b type; u16b count; } message_t; typedef struct _msgcolor_t { u16b type; byte color; struct _msgcolor_t *next; } msgcolor_t; typedef struct _msgqueue_t { message_t *head; message_t *tail; msgcolor_t *colors; u32b count; u32b max; } msgqueue_t; static msgqueue_t *messages = NULL; /* Functions operating on the entire list */ errr messages_init(void) { messages = ZNEW(msgqueue_t); messages->max = 2048; return 0; } void messages_free(void) { msgcolor_t *c = messages->colors; msgcolor_t *nextc; message_t *m = messages->head; message_t *nextm; while (m) { nextm = m->older; FREE(m->str); FREE(m); m = nextm; } while (c) { nextc = c->next; FREE(c); c = nextc; } FREE(messages); } u16b messages_num(void) { return messages->count; } /* Functions for individual messages */ void message_add(const char *str, u16b type) { message_t *m; if (messages->head && messages->head->type == type && !strcmp(messages->head->str, str)) { messages->head->count++; return; } m = ZNEW(message_t); m->str = string_make(str); m->type = type; m->count = 1; m->older = messages->head; if (messages->head) messages->head->newer = m; messages->head = m; messages->count++; if (!messages->tail) messages->tail = m; if (messages->count > messages->max) { message_t *old_tail = messages->tail; messages->tail = old_tail->newer; messages->tail->older = NULL; FREE(old_tail->str); FREE(old_tail); messages->count--; } } static message_t *message_get(u16b age) { message_t *m = messages->head; while (m && age--) m = m->older; return m; } const char *message_str(u16b age) { message_t *m = message_get(age); return (m ? m->str : ""); } u16b message_count(u16b age) { message_t *m = message_get(age); return (m ? m->count : 0); } u16b message_type(u16b age) { message_t *m = message_get(age); return (m ? m->type : 0); } byte message_color(u16b age) { message_t *m = message_get(age); return (m ? message_type_color(m->type) : TERM_WHITE); } /* Message-color functions */ void message_color_define(u16b type, byte color) { msgcolor_t *mc; if (!messages->colors) { messages->colors = ZNEW(msgcolor_t); messages->colors->type = type; messages->colors->color = color; } mc = messages->colors; while (mc->next) { if (mc->type == type) { mc->color = color; } mc = mc->next; } mc->next = ZNEW(msgcolor_t); mc->next->type = type; mc->next->color = color; } byte message_type_color(u16b type) { msgcolor_t *mc; byte color = TERM_WHITE; if (messages) { mc = messages->colors; while (mc && mc->type != type) mc = mc->next; if (mc && (mc->color != TERM_DARK)) color = mc->color; } return color; } int message_lookup_by_name(const char *name) { static const char *message_names[] = { #define MSG(x, s) #x, #include "z-msg-list.h" #undef MSG }; size_t i; unsigned int number; if (sscanf(name, "%u", &number) == 1) return (number < MSG_MAX) ? (int)number : -1; for (i = 0; i < N_ELEMENTS(message_names); i++) { if (my_stricmp(name, message_names[i]) == 0) return (int)i; } return -1; } int message_lookup_by_sound_name(const char *name) { static const char *sound_names[] = { #define MSG(x, s) s, #include "z-msg-list.h" #undef MSG }; size_t i; for (i = 0; i < N_ELEMENTS(sound_names); i++) { if (my_stricmp(name, sound_names[i]) == 0) return (int)i; } return MSG_GENERIC; } const char *message_sound_name(int message) { static const char *sound_names[] = { #define MSG(x, s) s, #include "z-msg-list.h" #undef MSG }; if (message < MSG_GENERIC || message >= MSG_MAX) return NULL; return sound_names[message]; } angband-3.5.1/src/z-util.c0000644000175000017500000002020512456456607014617 0ustar chriscchrisc/* * File: z-util.c * Purpose: Low-level string handling and other utilities. * * Copyright (c) 1997-2005 Ben Harrison, Robert Ruehlmann. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include #include "z-util.h" /* * Convenient storage of the program name */ char *argv0 = NULL; /* * Count the number of characters in a UTF-8 encoded string * * Taken from http://canonical.org/~kragen/strlen-utf8.html */ size_t utf8_strlen(char *s) { size_t i = 0, j = 0; while (s[i]) { if ((s[i] & 0xc0) != 0x80) j++; i++; } return j; } /* * Clip a null-terminated UTF-8 string 's' to 'n' unicode characters. * e.g. utf8_clipto("example", 4) will clip after 'm', resulting in 'exam'. */ void utf8_clipto(char *s, size_t n) { size_t i = 0, j = 0; bool terminate_next = FALSE; if (n == 0) { s[i] = 0; return; } while (s[i]) { if ((s[i] & 0xc0) != 0x80) { j++; if (terminate_next) break; if (j == n) terminate_next = TRUE; } i++; } s[i] = 0; } /* * Case insensitive comparison between two strings */ int my_stricmp(const char *s1, const char *s2) { char ch1 = 0; char ch2 = 0; /* Just loop */ while (TRUE) { /* We've reached the end of both strings simultaneously */ if ((*s1 == 0) && (*s2 == 0)) { /* We're still here, so s1 and s2 are equal */ return (0); } ch1 = toupper((unsigned char) *s1); ch2 = toupper((unsigned char) *s2); /* If the characters don't match */ if (ch1 != ch2) { /* return the difference between them */ return ((int)(ch1 - ch2)); } /* Step on through both strings */ s1++; s2++; } } /* * Case insensitive comparison between the first n characters of two strings */ int my_strnicmp(const char *a, const char *b, int n) { const char *s1, *s2; char z1, z2; /* Scan the strings */ for (s1 = a, s2 = b; n > 0; s1++, s2++, n--) { z1 = toupper((unsigned char)*s1); z2 = toupper((unsigned char)*s2); if (z1 < z2) return (-1); if (z1 > z2) return (1); if (!z1) return (0); } return 0; } /* * An ANSI version of strstr() with case insensitivity. * * In the public domain; found at: * http://c.snippets.org/code/stristr.c */ char *my_stristr(const char *string, const char *pattern) { const char *pptr, *sptr; char *start; for (start = (char *)string; *start != 0; start++) { /* find start of pattern in string */ for ( ; ((*start != 0) && (toupper((unsigned char)*start) != toupper((unsigned char)*pattern))); start++) ; if (*start == 0) return NULL; pptr = (const char *)pattern; sptr = (const char *)start; while (toupper((unsigned char)*sptr) == toupper((unsigned char)*pptr)) { sptr++; pptr++; /* if end of pattern then pattern was found */ if (*pptr == 0) return (start); } } return NULL; } /* * The my_strcpy() function copies up to 'bufsize'-1 characters from 'src' * to 'buf' and NUL-terminates the result. The 'buf' and 'src' strings may * not overlap. * * my_strcpy() returns strlen(src). This makes checking for truncation * easy. Example: if (my_strcpy(buf, src, sizeof(buf)) >= sizeof(buf)) ...; * * This function should be equivalent to the strlcpy() function in BSD. */ size_t my_strcpy(char *buf, const char *src, size_t bufsize) { size_t len = strlen(src); size_t ret = len; /* Paranoia */ if (bufsize == 0) return ret; /* Truncate */ if (len >= bufsize) len = bufsize - 1; /* Copy the string and terminate it */ (void)memcpy(buf, src, len); buf[len] = '\0'; /* Return strlen(src) */ return ret; } /* * The my_strcat() tries to append a string to an existing NUL-terminated string. * It never writes more characters into the buffer than indicated by 'bufsize' and * NUL-terminates the buffer. The 'buf' and 'src' strings may not overlap. * * my_strcat() returns strlen(buf) + strlen(src). This makes checking for * truncation easy. Example: * if (my_strcat(buf, src, sizeof(buf)) >= sizeof(buf)) ...; * * This function should be equivalent to the strlcat() function in BSD. */ size_t my_strcat(char *buf, const char *src, size_t bufsize) { size_t dlen = strlen(buf); /* Is there room left in the buffer? */ if (dlen < bufsize - 1) { /* Append as much as possible */ return (dlen + my_strcpy(buf + dlen, src, bufsize - dlen)); } else { /* Return without appending */ return (dlen + strlen(src)); } } /** * Capitalise the first letter of string 'str'. */ void my_strcap(char *buf) { if (buf && buf[0]) buf[0] = toupper((unsigned char) buf[0]); } /* * Determine if string "a" is equal to string "b" */ #undef streq bool streq(const char *a, const char *b) { return (!strcmp(a, b)); } /* * Determine if string "t" is a suffix of string "s" */ bool suffix(const char *s, const char *t) { size_t tlen = strlen(t); size_t slen = strlen(s); /* Check for incompatible lengths */ if (tlen > slen) return (FALSE); /* Compare "t" to the end of "s" */ return (!strcmp(s + slen - tlen, t)); } /* * Determine if string "t" is a prefix of string "s" */ bool prefix(const char *s, const char *t) { /* Scan "t" */ while (*t) { /* Compare content and length */ if (*t++ != *s++) return (FALSE); } /* Matched, we have a prefix */ return (TRUE); } /* * Determine if string "t" is a prefix of string "s" - case insensitive. */ bool prefix_i(const char *s, const char *t) { /* Scan "t" */ while (*t) { if (toupper((unsigned char)*t) != toupper((unsigned char)*s)) return (FALSE); else { t++; s++; } } /* Matched, we have a prefix */ return (TRUE); } /* * rewrite string s in-place "skipping" every occurrence of character c */ void strskip(char *s, const char c){ char *in=s; char *out=s; while(*in){ if(*in!=c){ *out=*in; out++; } in++; } *out=0; } /* * rewrite string s in-place removing escape character c * note that pairs of c will leave one instance of c in out */ void strescape(char *s, const char c){ char *in=s; char *out=s; bool escapenext = FALSE; while(*in){ if(*in!=c || escapenext){ *out=*in; out++; escapenext = FALSE; } else if (*in == c) { escapenext = TRUE; } in++; } *out=0; } /* * returns TRUE if string only contains spaces */ bool contains_only_spaces(const char* s){ char spaces[]=" \t"; while(*s){ if(strchr(spaces,*s)!=NULL) return FALSE; s++; } return TRUE; } /* * Redefinable "plog" action */ void (*plog_aux)(const char *) = NULL; /* * Print (or log) a "warning" message (ala "perror()") * Note the use of the (optional) "plog_aux" hook. */ void plog(const char *str) { /* Use the "alternative" function if possible */ if (plog_aux) (*plog_aux)(str); /* Just do a labeled fprintf to stderr */ else (void)(fprintf(stderr, "%s: %s\n", argv0 ? argv0 : "?", str)); } /* * Redefinable "quit" action */ void (*quit_aux)(const char *) = NULL; /* * Exit (ala "exit()"). If 'str' is NULL, do "exit(EXIT_SUCCESS)". * Otherwise, plog() 'str' and exit with an error code of -1. * But always use 'quit_aux', if set, before anything else. */ void quit(const char *str) { /* Attempt to use the aux function */ if (quit_aux) (*quit_aux)(str); /* Success */ if (!str) exit(EXIT_SUCCESS); /* Send the string to plog() */ plog(str); /* Failure */ exit(EXIT_FAILURE); } /* Arithmetic mean of the first 'size' entries of the array 'nums' */ int mean(int *nums, int size) { int i, total = 0; for(i = 0; i < size; i++) total += nums[i]; return total / size; } /* Variance of the first 'size' entries of the array 'nums' */ int variance(int *nums, int size) { int i, avg, total = 0; avg = mean(nums, size); for(i = 0; i < size; i++) { int delta = nums[i] - avg; total += delta * delta; } return total / size; } void sort(void *base, size_t nmemb, size_t smemb, int (*comp)(const void *, const void *)) { qsort(base, nmemb, smemb, comp); } angband-3.5.1/src/alloc.h0000644000175000017500000000100512456456606014466 0ustar chriscchrisc#ifndef INCLUDED_ALLOC_H #define INCLUDED_ALLOC_H /* * An entry for the object/monster allocation functions * * Pass 1 is determined from allocation information * Pass 2 is determined from allocation restriction * Pass 3 is determined from allocation calculation */ typedef struct alloc_entry { int index; /* The actual index */ int level; /* Base dungeon level */ int prob1; /* Probability, pass 1 */ int prob2; /* Probability, pass 2 */ int prob3; /* Probability, pass 3 */ } alloc_entry; #endif angband-3.5.1/src/history.c0000644000175000017500000002457612456456606015112 0ustar chriscchrisc/* * File: history.c * Purpose: Character auto-history creation, management, and display * * Copyright (c) 2007 J.D. White * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "history.h" /* * Number of slots available at birth in the player history list. Defaults to * 10 and will expand automatically as new history entries are added, up the * the maximum defined value. */ #define HISTORY_BIRTH_SIZE 10 #define HISTORY_MAX 5000 /* The historical list for the character */ struct history_info *history_list; /* Index of first writable entry */ static size_t history_ctr; /* Current size of history list */ static size_t history_size; /* * Initialise an empty history list. */ static void history_init(size_t entries) { history_ctr = 0; history_size = entries; history_list = C_ZNEW(history_size, struct history_info); } /* * Clear any existing history. */ void history_clear(void) { if (!history_list) return; FREE(history_list); history_ctr = 0; history_size = 0; } /* * Set the number of history items. */ static bool history_set_num(size_t num) { struct history_info *new_list; if (num > HISTORY_MAX) num = HISTORY_MAX; if (num < history_size) return FALSE; if (num == history_size) return FALSE; /* Allocate new memory, copy across */ /* XXX Should use mem_realloc() */ new_list = C_ZNEW(num, struct history_info); C_COPY(new_list, history_list, history_ctr, struct history_info); FREE(history_list); history_list = new_list; history_size = num; return TRUE; } /* * Return the number of history entries. */ size_t history_get_num(void) { return history_ctr; } /* * Mark artifact number `id` as known. */ static bool history_know_artifact(struct artifact *artifact) { size_t i = history_ctr; assert(artifact); while (i--) { if (history_list[i].a_idx == artifact->aidx) { history_list[i].type = HISTORY_ARTIFACT_KNOWN; return TRUE; } } return FALSE; } /* * Mark artifact number `id` as lost forever, either due to leaving it on a * level, or due to a store purging its inventory after the player sold it. */ bool history_lose_artifact(struct artifact *artifact) { size_t i = history_ctr; assert(artifact); while (i--) { if (history_list[i].a_idx == artifact->aidx) { history_list[i].type |= HISTORY_ARTIFACT_LOST; return TRUE; } } /* If we lost an artifact that didn't previously have a history, then we missed it */ history_add_artifact(artifact, FALSE, FALSE); return FALSE; } /* * Add an entry with text `event` to the history list, with type `type` * ("HISTORY_xxx" in defines.h), and artifact number `id` (0 for everything * else). * * Return TRUE on success. */ bool history_add_full(u16b type, struct artifact *artifact, s16b dlev, s16b clev, s32b turnno, const char *text) { /* Allocate the history list if needed */ if (!history_list) history_init(HISTORY_BIRTH_SIZE); /* Expand the history list if appropriate */ else if ((history_ctr == history_size) && !history_set_num(history_size + 10)) return FALSE; /* History list exists and is not full. Add an entry at the current counter location. */ history_list[history_ctr].type = type; history_list[history_ctr].dlev = dlev; history_list[history_ctr].clev = clev; history_list[history_ctr].a_idx = artifact ? artifact->aidx : 0; history_list[history_ctr].turn = turnno; my_strcpy(history_list[history_ctr].event, text, sizeof(history_list[history_ctr].event)); history_ctr++; return TRUE; } /* * Add an entry with text `event` to the history list, with type `type` * ("HISTORY_xxx" in defines.h), and artifact number `id` (0 for everything * else). * * Returne TRUE on success. */ bool history_add(const char *event, u16b type, struct artifact *artifact) { return history_add_full(type, artifact, p_ptr->depth, p_ptr->lev, p_ptr->total_energy / 100, event); } /* * Returns TRUE if the artifact denoted by a_idx is KNOWN in the history log. */ bool history_is_artifact_known(struct artifact *artifact) { size_t i = history_ctr; assert(artifact); while (i--) { if (history_list[i].type & HISTORY_ARTIFACT_KNOWN && history_list[i].a_idx == artifact->aidx) return TRUE; } return FALSE; } /* * Returns TRUE if the artifact denoted by a_idx is an active entry in * the history log (i.e. is not marked HISTORY_ARTIFACT_LOST). This permits * proper handling of the case where the player loses an artifact but (in * preserve mode) finds it again later. */ static bool history_is_artifact_logged(struct artifact *artifact) { size_t i = history_ctr; assert(artifact); while (i--) { /* Don't count ARTIFACT_LOST entries; then we can handle * re-finding previously lost artifacts in preserve mode */ if (history_list[i].type & HISTORY_ARTIFACT_LOST) continue; if (history_list[i].a_idx == artifact->aidx) return TRUE; } return FALSE; } /* * Adding artifacts to the history list is trickier than other operations. * This is a wrapper function that gets some of the logic out of places * where it really doesn't belong. Call this to add an artifact to the history * list or make the history entry visible--history_add_artifact will make that * determination depending on what object_is_known returns for the artifact. */ bool history_add_artifact(struct artifact *artifact, bool known, bool found) { object_type object_type_body; object_type *o_ptr = &object_type_body; char o_name[80]; char buf[80]; u16b type; assert(artifact); /* Make fake artifact for description purposes */ object_wipe(o_ptr); make_fake_artifact(o_ptr, artifact); object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_BASE | ODESC_SPOIL); strnfmt(buf, sizeof(buf), (found)?"Found %s":"Missed %s", o_name); /* Known objects gets different treatment */ if (known) { /* Try revealing any existing artifact, otherwise log it */ if (history_is_artifact_logged(artifact)) history_know_artifact(artifact); else history_add(buf, HISTORY_ARTIFACT_KNOWN, artifact); } else { if (!history_is_artifact_logged(artifact)) { type = HISTORY_ARTIFACT_UNKNOWN | (found ? 0 : HISTORY_ARTIFACT_LOST); history_add(buf, type, artifact); } else { return FALSE; } } return TRUE; } /* * Convert all ARTIFACT_UNKNOWN history items to HISTORY_ARTIFACT_KNOWN. * Use only after player retirement/death for the final character dump. */ void history_unmask_unknown(void) { size_t i = history_ctr; while (i--) { if (history_list[i].type & HISTORY_ARTIFACT_UNKNOWN) { history_list[i].type &= ~(HISTORY_ARTIFACT_UNKNOWN); history_list[i].type |= HISTORY_ARTIFACT_KNOWN; } } } /* * Used to determine whether the history entry is visible in the listing or not. * Returns TRUE if the item is masked -- that is, if it is invisible * * All artifacts are now sensed on pickup, so nothing is now invisible. The * KNOWN / UNKNOWN distinction is if we had fully identified it or not */ static bool history_masked(size_t i) { return FALSE; } /* * Finds the index of the last printable (non-masked) item in the history list. */ static size_t last_printable_item(void) { size_t i = history_ctr; while (i--) { if (!history_masked(i)) break; } return i; } static void print_history_header(void) { c_put_str(TERM_WHITE, "[Player history]", 0, 0); c_put_str(TERM_L_BLUE, " Turn Depth Note", 1, 0); } /* Handles all of the display functionality for the history list. */ void history_display(void) { int row, wid, hgt, page_size; char buf[120]; static size_t first_item = 0; size_t max_item = last_printable_item(); size_t i; bool active = TRUE; Term_get_size(&wid, &hgt); /* Five lines provide space for the header and footer */ page_size = hgt - 5; screen_save(); while (active) { struct keypress ch; Term_clear(); /* Print everything to screen */ print_history_header(); row = 0; for (i = first_item; row <= page_size && i < history_ctr; i++) { /* Skip messages about artifacts not yet IDed. */ if (history_masked(i)) continue; strnfmt(buf, sizeof(buf), "%10d%7d\' %s", history_list[i].turn, history_list[i].dlev * 50, history_list[i].event); if (history_list[i].type & HISTORY_ARTIFACT_LOST) my_strcat(buf, " (LOST)", sizeof(buf)); /* Size of header = 3 lines */ prt(buf, row + 2, 0); row++; } prt("[Arrow keys scroll, p/PgUp for previous page, n/PgDn for next page, ESC to exit.]", hgt - 1, 0); ch = inkey(); switch (ch.code) { case 'n': case ' ': case KC_PGDOWN: { size_t scroll_to = first_item + page_size; while (history_masked(scroll_to) && scroll_to < history_ctr - 1) scroll_to++; first_item = (scroll_to < max_item ? scroll_to : max_item); break; } case 'p': case KC_PGUP: { int scroll_to = first_item - page_size; while (history_masked(scroll_to) && scroll_to > 0) scroll_to--; first_item = (scroll_to >= 0 ? scroll_to : 0); break; } case ARROW_DOWN: { size_t scroll_to = first_item + 1; while (history_masked(scroll_to) && scroll_to < history_ctr - 1) scroll_to++; first_item = (scroll_to < max_item ? scroll_to : max_item); break; } case ARROW_UP: { int scroll_to = first_item - 1; while (history_masked(scroll_to) && scroll_to > 0) scroll_to--; first_item = (scroll_to >= 0 ? scroll_to : 0); break; } case ESCAPE: active = FALSE; break; } } screen_load(); return; } /* Dump character history to a file, which we assume is already open. */ void dump_history(ang_file *file) { size_t i; char buf[120]; file_putf(file, "[Player history]\n"); file_putf(file, " Turn Depth Note\n"); for (i = 0; i < (last_printable_item() + 1); i++) { /* Skip not-yet-IDd artifacts */ if (history_masked(i)) continue; strnfmt(buf, sizeof(buf), "%10d%7d\' %s", history_list[i].turn, history_list[i].dlev * 50, history_list[i].event); if (history_list[i].type & HISTORY_ARTIFACT_LOST) my_strcat(buf, " (LOST)", sizeof(buf)); file_putf(file, "%s", buf); file_put(file, "\n"); } return; } angband-3.5.1/src/cmd-cave.c0000644000175000017500000007465512456456606015073 0ustar chriscchrisc/* * File: cmd2.c * Purpose: Chest and door opening/closing, disarming, running, resting, &c. * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "cave.h" #include "cmds.h" #include "dungeon.h" #include "files.h" #include "game-cmd.h" #include "game-event.h" #include "generate.h" #include "monster/mon-timed.h" #include "monster/mon-util.h" #include "monster/monster.h" #include "object/tvalsval.h" #include "pathfind.h" #include "spells.h" #include "squelch.h" #include "trap.h" /* * Go up one level */ void do_cmd_go_up(cmd_code code, cmd_arg args[]) { /* Verify stairs */ if (!cave_isupstairs(cave, p_ptr->py, p_ptr->px)) { msg("I see no up staircase here."); return; } /* Force descend */ if (OPT(birth_force_descend)) { msg("Nothing happens!"); return; } /* Hack -- take a turn */ p_ptr->energy_use = 100; /* Success */ msgt(MSG_STAIRS_UP, "You enter a maze of up staircases."); /* Create a way back */ p_ptr->create_up_stair = FALSE; p_ptr->create_down_stair = TRUE; /* Change level */ dungeon_change_level(p_ptr->depth - 1); } /* * Go down one level */ void do_cmd_go_down(cmd_code code, cmd_arg args[]) { int descend_to = p_ptr->depth + 1; /* Verify stairs */ if (!cave_isdownstairs(cave, p_ptr->py, p_ptr->px)) { msg("I see no down staircase here."); return; } /* Paranoia, no descent from MAX_DEPTH-1 */ if (p_ptr->depth == MAX_DEPTH-1) { msg("The dungeon does not appear to extend deeper"); return; } /* Warn a force_descend player if they're going to a quest level */ if (OPT(birth_force_descend)) { if (is_quest(p_ptr->max_depth + 1) && !get_check("Are you sure you want to descend?")) return; /* Don't overshoot */ descend_to = MIN(p_ptr->max_depth + 1, MAX_DEPTH-1); } /* Hack -- take a turn */ p_ptr->energy_use = 100; /* Success */ msgt(MSG_STAIRS_DOWN, "You enter a maze of down staircases."); /* Create a way back */ p_ptr->create_up_stair = TRUE; p_ptr->create_down_stair = FALSE; /* Change level */ dungeon_change_level(descend_to); } /* * Search for hidden things. Returns true if a search was attempted, returns * false when the player has a 0% chance of finding anything. Prints messages * for negative confirmation when verbose mode is requested. */ bool search(bool verbose) { int py = p_ptr->py; int px = p_ptr->px; int y, x, chance; bool found = FALSE; object_type *o_ptr; /* Start with base search ability */ chance = p_ptr->state.skills[SKILL_SEARCH]; /* Penalize various conditions */ if (p_ptr->timed[TMD_BLIND] || no_light()) chance = chance / 10; if (p_ptr->timed[TMD_CONFUSED] || p_ptr->timed[TMD_IMAGE]) chance = chance / 10; /* Prevent fruitless searches */ if (chance <= 0) { if (verbose) { msg("You can't make out your surroundings well enough to search."); /* Cancel repeat */ disturb(p_ptr, 0, 0); } return FALSE; } /* Search the nearby grids, which are always in bounds */ for (y = (py - 1); y <= (py + 1); y++) { for (x = (px - 1); x <= (px + 1); x++) { /* Sometimes, notice things */ if (randint0(100) < chance) { /* Invisible trap */ if (cave_issecrettrap(cave, y, x)) { found = TRUE; /* Pick a trap */ pick_trap(y, x); /* Message */ msg("You have found a trap."); /* Disturb */ disturb(p_ptr, 0, 0); } /* Secret door */ if (cave_issecretdoor(cave, y, x)) { found = TRUE; /* Message */ msg("You have found a secret door."); /* Pick a door */ place_closed_door(cave, y, x); /* Disturb */ disturb(p_ptr, 0, 0); } /* Scan all objects in the grid */ for (o_ptr = get_first_object(y, x); o_ptr; o_ptr = get_next_object(o_ptr)) { /* Skip if not a trapped chest */ if (!is_trapped_chest(o_ptr)) continue; /* Identify once */ if (!object_is_known(o_ptr)) { found = TRUE; /* Message */ msg("You have discovered a trap on the chest!"); /* Know the trap */ object_notice_everything(o_ptr); /* Notice it */ disturb(p_ptr, 0, 0); } } } } } if (verbose && !found) { if (chance >= 100) msg("There are no secrets here."); else msg("You found nothing."); } return TRUE; } /* * Simple command to "search" for one turn */ void do_cmd_search(cmd_code code, cmd_arg args[]) { /* Only take a turn if attempted */ if (search(TRUE)) p_ptr->energy_use = 100; } /* * Hack -- toggle search mode */ void do_cmd_toggle_search(cmd_code code, cmd_arg args[]) { /* Stop searching */ if (p_ptr->searching) { /* Clear the searching flag */ p_ptr->searching = FALSE; /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Redraw the state */ p_ptr->redraw |= (PR_STATE); } /* Start searching */ else { /* Set the searching flag */ p_ptr->searching = TRUE; /* Update stuff */ p_ptr->update |= (PU_BONUS); /* Redraw stuff */ p_ptr->redraw |= (PR_STATE | PR_SPEED); } } /* * Return the number of doors/traps around (or under) the character. */ int count_feats(int *y, int *x, bool (*test)(struct cave *cave, int y, int x), bool under) { int d; int xx, yy; int count = 0; /* Count how many matches */ /* Check around (and under) the character */ for (d = 0; d < 9; d++) { /* if not searching under player continue */ if ((d == 8) && !under) continue; /* Extract adjacent (legal) location */ yy = p_ptr->py + ddy_ddd[d]; xx = p_ptr->px + ddx_ddd[d]; /* Paranoia */ if (!cave_in_bounds_fully(cave, yy, xx)) continue; /* Must have knowledge */ if (!(cave->info[yy][xx] & (CAVE_MARK))) continue; /* Not looking for this feature */ if (!((*test)(cave, yy, xx))) continue; /* Count it */ ++count; /* Remember the location of the last door found */ *y = yy; *x = xx; } /* All done */ return count; } /* * Extract a "direction" which will move one step from the player location * towards the given "target" location (or "5" if no motion necessary). */ int coords_to_dir(int y, int x) { return (motion_dir(p_ptr->py, p_ptr->px, y, x)); } /* * Determine if a given grid may be "opened" */ static bool do_cmd_open_test(int y, int x) { /* Must have knowledge */ if (!(cave->info[y][x] & (CAVE_MARK))) { msg("You see nothing there."); return FALSE; } if (!cave_iscloseddoor(cave, y, x)) { msgt(MSG_NOTHING_TO_OPEN, "You see nothing there to open."); return FALSE; } /* Okay */ return (TRUE); } /* * Perform the basic "open" command on doors * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ static bool do_cmd_open_aux(int y, int x) { int i, j; bool more = FALSE; /* Verify legality */ if (!do_cmd_open_test(y, x)) return (FALSE); /* Locked door */ if (cave_islockeddoor(cave, y, x)) { /* Disarm factor */ i = p_ptr->state.skills[SKILL_DISARM]; /* Penalize some conditions */ if (p_ptr->timed[TMD_BLIND] || no_light()) i = i / 10; if (p_ptr->timed[TMD_CONFUSED] || p_ptr->timed[TMD_IMAGE]) i = i / 10; /* Extract the lock power */ j = cave_door_power(cave, y, x); /* Extract the difficulty XXX XXX XXX */ j = i - (j * 4); /* Always have a small chance of success */ if (j < 2) j = 2; /* Success */ if (randint0(100) < j) { /* Message */ msgt(MSG_LOCKPICK, "You have picked the lock."); /* Open the door */ cave_open_door(cave, y, x); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Experience */ /* Removed to avoid exploit by repeatedly locking and unlocking door */ /* player_exp_gain(p_ptr, 1); */ } /* Failure */ else { flush(); /* Message */ msgt(MSG_LOCKPICK_FAIL, "You failed to pick the lock."); /* We may keep trying */ more = TRUE; } } /* Closed door */ else { /* Open the door */ cave_open_door(cave, y, x); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Sound */ sound(MSG_OPENDOOR); } /* Result */ return (more); } /* * Open a closed/locked/jammed door or a closed/locked chest. * * Unlocking a locked door/chest is worth one experience point. */ void do_cmd_open(cmd_code code, cmd_arg args[]) { int y, x, dir; s16b o_idx; bool more = FALSE; dir = args[0].direction; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Check for chests */ o_idx = chest_check(y, x, CHEST_OPENABLE); /* Verify legality */ if (!o_idx && !do_cmd_open_test(y, x)) { /* Cancel repeat */ disturb(p_ptr, 0, 0); return; } /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Check for chest */ o_idx = chest_check(y, x, CHEST_OPENABLE); } /* Monster */ if (cave->m_idx[y][x] > 0) { int m_idx = cave->m_idx[y][x]; struct monster *m_ptr = cave_monster(cave, m_idx); /* Mimics surprise the player */ if (is_mimicking(m_ptr)) { become_aware(m_ptr); /* Mimic wakes up */ mon_clear_timed(m_ptr, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, FALSE); } else { /* Message */ msg("There is a monster in the way!"); /* Attack */ py_attack(y, x); } } /* Chest */ else if (o_idx) { /* Open the chest */ more = do_cmd_open_chest(y, x, o_idx); } /* Door */ else { /* Open the door */ more = do_cmd_open_aux(y, x); } /* Cancel repeat unless we may continue */ if (!more) disturb(p_ptr, 0, 0); } /* * Determine if a given grid may be "closed" */ static bool do_cmd_close_test(int y, int x) { /* Must have knowledge */ if (!(cave->info[y][x] & (CAVE_MARK))) { /* Message */ msg("You see nothing there."); /* Nope */ return (FALSE); } /* Require open/broken door */ if (!cave_isopendoor(cave, y, x) && !cave_isbrokendoor(cave, y, x)) { /* Message */ msg("You see nothing there to close."); /* Nope */ return (FALSE); } /* Okay */ return (TRUE); } /* * Perform the basic "close" command * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ static bool do_cmd_close_aux(int y, int x) { bool more = FALSE; /* Verify legality */ if (!do_cmd_close_test(y, x)) return (FALSE); /* Broken door */ if (cave_isbrokendoor(cave, y, x)) { /* Message */ msg("The door appears to be broken."); } /* Open door */ else { /* Close the door */ cave_close_door(cave, y, x); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Sound */ sound(MSG_SHUTDOOR); } /* Result */ return (more); } /* * Close an open door. */ void do_cmd_close(cmd_code code, cmd_arg args[]) { int y, x, dir; bool more = FALSE; dir = args[0].direction; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Verify legality */ if (!do_cmd_close_test(y, x)) { /* Cancel repeat */ disturb(p_ptr, 0, 0); return; } /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; } /* Monster */ if (cave->m_idx[y][x] > 0) { /* Message */ msg("There is a monster in the way!"); /* Attack */ py_attack(y, x); } /* Door */ else { /* Close door */ more = do_cmd_close_aux(y, x); } /* Cancel repeat unless told not to */ if (!more) disturb(p_ptr, 0, 0); } /* * Determine if a given grid may be "tunneled" */ static bool do_cmd_tunnel_test(int y, int x) { /* Must have knowledge */ if (!(cave->info[y][x] & (CAVE_MARK))) { /* Message */ msg("You see nothing there."); /* Nope */ return (FALSE); } /* Must be a wall/door/etc */ if (cave_ispassable(cave, y, x)) { /* Message */ msg("You see nothing there to tunnel."); /* Nope */ return (FALSE); } /* Okay */ return (TRUE); } /* * Tunnel through wall. Assumes valid location. * * Note that it is impossible to "extend" rooms past their * outer walls (which are actually part of the room). * * Attempting to do so will produce floor grids which are not part * of the room, and whose "illumination" status do not change with * the rest of the room. */ static bool twall(int y, int x) { /* Paranoia -- Require a wall or door or some such */ if (cave_ispassable(cave, y, x)) return (FALSE); /* Sound */ sound(MSG_DIG); /* Forget the wall */ cave->info[y][x] &= ~(CAVE_MARK); /* Remove the feature */ cave_tunnel_wall(cave, y, x); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Fully update the flow */ p_ptr->update |= (PU_FORGET_FLOW | PU_UPDATE_FLOW); /* Result */ return (TRUE); } /* * Perform the basic "tunnel" command * * Assumes that no monster is blocking the destination * * Uses "twall" (above) to do all "terrain feature changing". * * Returns TRUE if repeated commands may continue */ static bool do_cmd_tunnel_aux(int y, int x) { bool more = FALSE; /* Verify legality */ if (!do_cmd_tunnel_test(y, x)) return (FALSE); /* Sound XXX XXX XXX */ /* sound(MSG_DIG); */ /* Titanium */ if (cave_isperm(cave, y, x)) { msg("This seems to be permanent rock."); } /* Granite */ else if (cave_isrock(cave, y, x)) { /* Tunnel */ if ((p_ptr->state.skills[SKILL_DIGGING] > 40 + randint0(1600)) && twall(y, x)) { msg("You have finished the tunnel."); } /* Keep trying */ else { /* We may continue tunelling */ msg("You tunnel into the granite wall."); more = TRUE; } } /* Quartz / Magma */ else if (cave_ismagma(cave, y, x) || cave_isquartz(cave, y, x)) { bool okay = FALSE; bool gold = FALSE; bool hard = FALSE; /* Found gold */ if (cave_hasgoldvein(cave, y, x)) gold = TRUE; /* Extract "quartz" flag XXX XXX XXX */ if (cave_isquartz(cave, y, x)) hard = TRUE; /* Quartz */ if (hard) okay = (p_ptr->state.skills[SKILL_DIGGING] > 20 + randint0(800)); /* Magma */ else okay = (p_ptr->state.skills[SKILL_DIGGING] > 10 + randint0(400)); /* Success */ if (okay && twall(y, x)) { /* Found treasure */ if (gold) { /* Place some gold */ place_gold(cave, y, x, p_ptr->depth, ORIGIN_FLOOR); /* Message */ msg("You have found something!"); } /* Found nothing */ else { /* Message */ msg("You have finished the tunnel."); } } /* Failure (quartz) */ else if (hard) { /* Message, continue digging */ msg("You tunnel into the quartz vein."); more = TRUE; } /* Failure (magma) */ else { /* Message, continue digging */ msg("You tunnel into the magma vein."); more = TRUE; } } /* Rubble */ else if (cave_isrubble(cave, y, x)) { /* Remove the rubble */ if ((p_ptr->state.skills[SKILL_DIGGING] > randint0(200)) && twall(y, x)) { /* Message */ msg("You have removed the rubble."); /* Hack -- place an object */ if (randint0(100) < 10) { /* Create a simple object */ place_object(cave, y, x, p_ptr->depth, FALSE, FALSE, ORIGIN_RUBBLE, 0); /* Observe the new object */ if (!squelch_item_ok(object_byid(cave->o_idx[y][x])) && player_can_see_bold(y, x)) msg("You have found something!"); } } else { /* Message, keep digging */ msg("You dig in the rubble."); more = TRUE; } } /* Secret doors */ else if (cave_issecretdoor(cave, y, x)) { /* Tunnel */ if ((p_ptr->state.skills[SKILL_DIGGING] > 30 + randint0(1200)) && twall(y, x)) { msg("You have finished the tunnel."); } /* Keep trying */ else { /* We may continue tunelling */ msg("You tunnel into the granite wall."); more = TRUE; /* Occasional Search XXX XXX */ if (randint0(100) < 25) search(FALSE); } } /* Doors */ else { /* Tunnel */ if ((p_ptr->state.skills[SKILL_DIGGING] > 30 + randint0(1200)) && twall(y, x)) { msg("You have finished the tunnel."); } /* Keep trying */ else { /* We may continue tunelling */ msg("You tunnel into the door."); more = TRUE; } } /* Result */ return (more); } /* * Tunnel through "walls" (including rubble and secret doors) * * Digging is very difficult without a "digger" weapon, but can be * accomplished by strong players using heavy weapons. */ void do_cmd_tunnel(cmd_code code, cmd_arg args[]) { int y, x, dir; bool more = FALSE; dir = args[0].direction; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Oops */ if (!do_cmd_tunnel_test(y, x)) { /* Cancel repeat */ disturb(p_ptr, 0, 0); return; } /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; } /* Monster */ if (cave->m_idx[y][x] > 0) { /* Message */ msg("There is a monster in the way!"); /* Attack */ py_attack(y, x); } /* Walls */ else { /* Tunnel through walls */ more = do_cmd_tunnel_aux(y, x); } /* Cancel repetition unless we can continue */ if (!more) disturb(p_ptr, 0, 0); } /* * Determine if a given grid may be "disarmed" */ static bool do_cmd_disarm_test(int y, int x) { /* Must have knowledge */ if (!(cave->info[y][x] & (CAVE_MARK))) { msg("You see nothing there."); return FALSE; } /* Look for a closed, unlocked door to lock */ if (cave_iscloseddoor(cave, y, x) && !cave_islockeddoor(cave, y, x)) return TRUE; /* Look for a trap */ if (!cave_isknowntrap(cave, y, x)) { msg("You see nothing there to disarm."); return FALSE; } /* Okay */ return TRUE; } /* * Perform the command "lock door" * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ static bool do_cmd_lock_door(int y, int x) { int i, j, power; bool more = FALSE; /* Verify legality */ if (!do_cmd_disarm_test(y, x)) return FALSE; /* Get the "disarm" factor */ i = p_ptr->state.skills[SKILL_DISARM]; /* Penalize some conditions */ if (p_ptr->timed[TMD_BLIND] || no_light()) i = i / 10; if (p_ptr->timed[TMD_CONFUSED] || p_ptr->timed[TMD_IMAGE]) i = i / 10; /* Calculate lock "power" */ power = m_bonus(7, p_ptr->depth); /* Extract the difficulty */ j = i - power; /* Always have a small chance of success */ if (j < 2) j = 2; /* Success */ if (randint0(100) < j) { msg("You lock the door."); cave_lock_door(cave, y, x, power); } /* Failure -- Keep trying */ else if ((i > 5) && (randint1(i) > 5)) { flush(); msg("You failed to lock the door."); /* We may keep trying */ more = TRUE; } /* Failure */ else msg("You failed to lock the door."); /* Result */ return more; } /* * Perform the basic "disarm" command * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ static bool do_cmd_disarm_aux(int y, int x) { int i, j, power; const char *name; bool more = FALSE; /* Verify legality */ if (!do_cmd_disarm_test(y, x)) return (FALSE); /* Get the trap name */ name = f_info[cave->feat[y][x]].name; /* Get the "disarm" factor */ i = p_ptr->state.skills[SKILL_DISARM]; /* Penalize some conditions */ if (p_ptr->timed[TMD_BLIND] || no_light()) i = i / 10; if (p_ptr->timed[TMD_CONFUSED] || p_ptr->timed[TMD_IMAGE]) i = i / 10; /* XXX XXX XXX Variable power? */ /* Extract trap "power" */ power = 5; /* Extract the difficulty */ j = i - power; /* Always have a small chance of success */ if (j < 2) j = 2; /* Success */ if (randint0(100) < j) { /* Message */ msgt(MSG_DISARM, "You have disarmed the %s.", name); /* Reward */ player_exp_gain(p_ptr, power); /* Forget the trap */ cave->info[y][x] &= ~(CAVE_MARK); /* Remove the trap */ cave_destroy_trap(cave, y, x); } /* Failure -- Keep trying */ else if ((i > 5) && (randint1(i) > 5)) { flush(); /* Message */ msg("You failed to disarm the %s.", name); /* We may keep trying */ more = TRUE; } /* Failure -- Set off the trap */ else { /* Message */ msg("You set off the %s!", name); /* Hit the trap */ hit_trap(y, x); } /* Result */ return (more); } /* * Disarms a trap, or a chest */ void do_cmd_disarm(cmd_code code, cmd_arg args[]) { int y, x, dir; s16b o_idx; bool more = FALSE; dir = args[0].direction; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Check for chests */ o_idx = chest_check(y, x, CHEST_TRAPPED); /* Verify legality */ if (!o_idx && !do_cmd_disarm_test(y, x)) { /* Cancel repeat */ disturb(p_ptr, 0, 0); return; } /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Check for chests */ o_idx = chest_check(y, x, CHEST_TRAPPED); } /* Monster */ if (cave->m_idx[y][x] > 0) { msg("There is a monster in the way!"); py_attack(y, x); } /* Chest */ else if (o_idx) more = do_cmd_disarm_chest(y, x, o_idx); /* Door to lock */ else if ( cave_iscloseddoor(cave, y, x) && !cave_islockeddoor(cave, y, x)) more = do_cmd_lock_door(y, x); /* Disarm trap */ else more = do_cmd_disarm_aux(y, x); /* Cancel repeat unless told not to */ if (!more) disturb(p_ptr, 0, 0); } /* * Manipulate an adjacent grid in some way * * Attack monsters, tunnel through walls, disarm traps, open doors. * * This command must always take energy, to prevent free detection * of invisible monsters. * * The "semantics" of this command must be chosen before the player * is confused, and it must be verified against the new grid. */ void do_cmd_alter_aux(int dir) { int y, x; bool more = FALSE; /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; /* Take a turn */ p_ptr->energy_use = 100; /* Apply confusion */ if (player_confuse_dir(p_ptr, &dir, FALSE)) { /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; } /* Attack monsters */ if (cave->m_idx[y][x] > 0) py_attack(y, x); /* Tunnel through walls and rubble */ else if (cave_isdiggable(cave, y, x)) more = do_cmd_tunnel_aux(y, x); /* Open closed doors */ else if (cave_iscloseddoor(cave, y, x)) more = do_cmd_open_aux(y, x); /* Disarm traps */ else if (cave_isknowntrap(cave, y, x)) more = do_cmd_disarm_aux(y, x); /* Oops */ else msg("You spin around."); /* Cancel repetition unless we can continue */ if (!more) disturb(p_ptr, 0, 0); } void do_cmd_alter(cmd_code code, cmd_arg args[]) { do_cmd_alter_aux(args[0].direction); } /* * Determine if a given grid may be "walked" */ static bool do_cmd_walk_test(int y, int x) { int m_idx = cave->m_idx[y][x]; struct monster *m_ptr = cave_monster(cave, m_idx); /* Allow attack on visible monsters if unafraid */ if (m_idx > 0 && m_ptr->ml && !is_mimicking(m_ptr)) { /* Handle player fear */ if (check_state(p_ptr, OF_AFRAID, p_ptr->state.flags)) { /* Extract monster name (or "it") */ char m_name[80]; monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_DEFAULT); /* Message */ msgt(MSG_AFRAID, "You are too afraid to attack %s!", m_name); /* Nope */ return (FALSE); } return (TRUE); } /* If we don't know the grid, allow attempts to walk into it */ if (!(cave->info[y][x] & CAVE_MARK)) return TRUE; /* Require open space */ if (!cave_ispassable(cave, y, x)) { /* Rubble */ if (cave_isrubble(cave, y, x)) msgt(MSG_HITWALL, "There is a pile of rubble in the way!"); /* Door */ else if (cave_iscloseddoor(cave, y, x)) return TRUE; /* Wall */ else msgt(MSG_HITWALL, "There is a wall in the way!"); /* Cancel repeat */ disturb(p_ptr, 0, 0); /* Nope */ return (FALSE); } /* Okay */ return (TRUE); } /* * Walk in the given direction. */ void do_cmd_walk(cmd_code code, cmd_arg args[]) { int x, y; int dir = args[0].direction; /* Apply confusion if necessary */ player_confuse_dir(p_ptr, &dir, FALSE); /* Confused movements use energy no matter what */ if (dir != args[0].direction) p_ptr->energy_use = 100; /* Verify walkability */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; if (!do_cmd_walk_test(y, x)) return; p_ptr->energy_use = 100; move_player(dir, TRUE); } /* * Walk into a trap. */ void do_cmd_jump(cmd_code code, cmd_arg args[]) { int x, y; int dir = args[0].direction; /* Apply confusion if necessary */ player_confuse_dir(p_ptr, &dir, FALSE); /* Verify walkability */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; if (!do_cmd_walk_test(y, x)) return; p_ptr->energy_use = 100; move_player(dir, FALSE); } /* * Start running. * * Note that running while confused is not allowed. */ void do_cmd_run(cmd_code code, cmd_arg args[]) { int x, y; int dir = args[0].direction; if (player_confuse_dir(p_ptr, &dir, TRUE)) { return; } /* Get location */ y = p_ptr->py + ddy[dir]; x = p_ptr->px + ddx[dir]; if (!do_cmd_walk_test(y, x)) return; /* Start run */ run_step(dir); } /* * Start running with pathfinder. * * Note that running while confused is not allowed. */ void do_cmd_pathfind(cmd_code code, cmd_arg args[]) { /* Hack XXX XXX XXX */ int dir = 5; if (player_confuse_dir(p_ptr, &dir, TRUE)) { return; } if (findpath(args[0].point.x, args[0].point.y)) { p_ptr->running = 1000; /* Calculate torch radius */ p_ptr->update |= (PU_TORCH); p_ptr->running_withpathfind = TRUE; run_step(0); } } /* * Stay still. Search. Enter stores. * Pick up treasure if "pickup" is true. */ void do_cmd_hold(cmd_code code, cmd_arg args[]) { /* Take a turn */ p_ptr->energy_use = 100; /* Spontaneous Searching */ if ((p_ptr->state.skills[SKILL_SEARCH_FREQUENCY] >= 50) || one_in_(50 - p_ptr->state.skills[SKILL_SEARCH_FREQUENCY])) { search(FALSE); } /* Continuous Searching */ if (p_ptr->searching) { search(FALSE); } /* Pick things up, not using extra energy */ do_autopickup(); /* Hack -- enter a store if we are on one */ if (cave_isshop(cave, p_ptr->py, p_ptr->px)) { /* Disturb */ disturb(p_ptr, 0, 0); cmd_insert(CMD_ENTER_STORE); /* Free turn XXX XXX XXX */ p_ptr->energy_use = 0; } else { event_signal(EVENT_SEEFLOOR); } } /* * Rest (restores hit points and mana and such) */ void do_cmd_rest(cmd_code code, cmd_arg args[]) { /* * A little sanity checking on the input - only the specified negative * values are valid. */ if (args[0].choice < 0 && !player_resting_is_special(args[0].choice)) return; player_resting_set_count(p_ptr, args[0].choice); /* Take a turn XXX XXX XXX (?) */ p_ptr->energy_use = 100; /* Cancel searching */ p_ptr->searching = FALSE; /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Redraw the state */ p_ptr->redraw |= (PR_STATE); /* Handle stuff */ handle_stuff(p_ptr); /* Refresh XXX XXX XXX */ Term_fresh(); } void textui_cmd_rest(void) { const char *p = "Rest (0-9999, '!' for HP or SP, '*' for HP and SP, '&' as needed): "; char out_val[5] = "& "; /* Ask for duration */ if (!get_string(p, out_val, sizeof(out_val))) return; /* Rest until done */ if (out_val[0] == '&') { cmd_insert(CMD_REST); cmd_set_arg_choice(cmd_get_top(), 0, REST_COMPLETE); } /* Rest a lot */ else if (out_val[0] == '*') { cmd_insert(CMD_REST); cmd_set_arg_choice(cmd_get_top(), 0, REST_ALL_POINTS); } /* Rest until HP or SP filled */ else if (out_val[0] == '!') { cmd_insert(CMD_REST); cmd_set_arg_choice(cmd_get_top(), 0, REST_SOME_POINTS); } /* Rest some */ else { int turns = atoi(out_val); if (turns <= 0) return; if (turns > 9999) turns = 9999; cmd_insert(CMD_REST); cmd_set_arg_choice(cmd_get_top(), 0, turns); } } /* * Array of feeling strings for object feelings. * Keep strings at 36 or less characters to keep the * combined feeling on one row. */ static const char *obj_feeling_text[] = { "Looks like any other level.", "you sense an item of wondrous power!", "there are superb treasures here.", "there are excellent treasures here.", "there are very good treasures here.", "there are good treasures here.", "there may be something worthwhile here.", "there may not be much interesting here.", "there aren't many treasures here.", "there are only scraps of junk here.", "there are naught but cobwebs here." }; /* * Array of feeling strings for monster feelings. * Keep strings at 36 or less characters to keep the * combined feeling on one row. */ static const char *mon_feeling_text[] = { /* first string is just a place holder to * maintain symmetry with obj_feeling. */ "You are still uncertain about this place", "Omens of death haunt this place", "This place seems murderous", "This place seems terribly dangerous", "You feel anxious about this place", "You feel nervous about this place", "This place does not seem too risky", "This place seems reasonably safe", "This seems a tame, sheltered place", "This seems a quiet, peaceful place" }; /* * Display the feeling. Players always get a monster feeling. * Object feelings are delayed until the player has explored some * of the level. */ void display_feeling(bool obj_only) { u16b obj_feeling = cave->feeling / 10; u16b mon_feeling = cave->feeling - (10 * obj_feeling); const char *join; /* Don't show feelings for cold-hearted characters */ if (OPT(birth_no_feelings)) return; /* No useful feeling in town */ if (!p_ptr->depth) { msg("Looks like a typical town."); return; } /* Display only the object feeling when it's first discovered. */ if (obj_only){ msg("You feel that %s", obj_feeling_text[obj_feeling]); return; } /* Players automatically get a monster feeling. */ if (cave->feeling_squares < FEELING1){ msg("%s.", mon_feeling_text[mon_feeling]); return; } /* Verify the feelings */ if (obj_feeling >= N_ELEMENTS(obj_feeling_text)) obj_feeling = N_ELEMENTS(obj_feeling_text) - 1; if (mon_feeling >= N_ELEMENTS(mon_feeling_text)) mon_feeling = N_ELEMENTS(mon_feeling_text) - 1; /* Decide the conjunction */ if ((mon_feeling <= 5 && obj_feeling > 6) || (mon_feeling > 5 && obj_feeling <= 6)) join = ", yet"; else join = ", and"; /* Display the feeling */ msg("%s%s %s", mon_feeling_text[mon_feeling], join, obj_feeling_text[obj_feeling]); } void do_cmd_feeling(void) { display_feeling(FALSE); } angband-3.5.1/src/util.c0000644000175000017500000011670612456456606014363 0ustar chriscchrisc/* * File: util.c * Purpose: Gamma correction, some high-level UI functions, inkey() * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "target.h" #include "files.h" #include "game-event.h" #include "randname.h" static bool inkey_xtra; /* * Flush all pending input. * * Actually, remember the flush, using the "inkey_xtra" flag, and in the * next call to "inkey()", perform the actual flushing, for efficiency, * and correctness of the "inkey()" function. */ void flush(void) { /* Do it later */ inkey_xtra = TRUE; } /* * Helper function called only from "inkey()" */ static ui_event inkey_aux(int scan_cutoff) { int w = 0; ui_event ke; /* Wait for a keypress */ if (scan_cutoff == SCAN_OFF) { (void)(Term_inkey(&ke, TRUE, TRUE)); } else { w = 0; /* Wait only as long as macro activation would wait*/ while (Term_inkey(&ke, FALSE, TRUE) != 0) { /* Increase "wait" */ w++; /* Excessive delay */ if (w >= scan_cutoff) { ui_event empty = EVENT_EMPTY; return empty; } /* Delay */ Term_xtra(TERM_XTRA_DELAY, 10); } } return (ke); } /* * Mega-Hack -- special "inkey_next" pointer. XXX XXX XXX * * This special pointer allows a sequence of keys to be "inserted" into * the stream of keys returned by "inkey()". This key sequence cannot be * bypassed by the Borg. We use it to implement keymaps. */ struct keypress *inkey_next = NULL; /** * See if more propmts will be skipped while in a keymap. */ static bool keymap_auto_more; #ifdef ALLOW_BORG /* * Mega-Hack -- special "inkey_hack" hook. XXX XXX XXX * * This special function hook allows the "Borg" (see elsewhere) to take * control of the "inkey()" function, and substitute in fake keypresses. */ struct keypress (*inkey_hack)(int flush_first) = NULL; #endif /* ALLOW_BORG */ /* * Get a keypress from the user. * * This function recognizes a few "global parameters". These are variables * which, if set to TRUE before calling this function, will have an effect * on this function, and which are always reset to FALSE by this function * before this function returns. Thus they function just like normal * parameters, except that most calls to this function can ignore them. * * If "inkey_xtra" is TRUE, then all pending keypresses will be flushed. * This is set by flush(), which doesn't actually flush anything itself * but uses that flag to trigger delayed flushing. * * If "inkey_scan" is TRUE, then we will immediately return "zero" if no * keypress is available, instead of waiting for a keypress. * * If "inkey_flag" is TRUE, then we are waiting for a command in the main * map interface, and we shouldn't show a cursor. * * If we are waiting for a keypress, and no keypress is ready, then we will * refresh (once) the window which was active when this function was called. * * Note that "back-quote" is automatically converted into "escape" for * convenience on machines with no "escape" key. * * If "angband_term[0]" is not active, we will make it active during this * function, so that the various "main-xxx.c" files can assume that input * is only requested (via "Term_inkey()") when "angband_term[0]" is active. * * Mega-Hack -- This function is used as the entry point for clearing the * "signal_count" variable, and of the "character_saved" variable. * * Mega-Hack -- Note the use of "inkey_hack" to allow the "Borg" to steal * control of the keyboard from the user. */ ui_event inkey_ex(void) { bool cursor_state; ui_event kk; ui_event ke = EVENT_EMPTY; bool done = FALSE; term *old = Term; /* Delayed flush */ if (inkey_xtra) { Term_flush(); inkey_next = NULL; inkey_xtra = FALSE; } /* Hack -- Use the "inkey_next" pointer */ while (inkey_next && inkey_next->code) { /* Get next character, and advance */ ke.key = *inkey_next++; /* Cancel the various "global parameters" */ inkey_flag = FALSE; inkey_scan = 0; /* peek at the key, and see if we want to skip more prompts */ if (ke.key.code == '(') { keymap_auto_more = TRUE; /* since we are not returning this char, make sure the next key below works well */ if (!inkey_next || !inkey_next->code) { ke.type = EVT_NONE; break; } continue; } else if (ke.key.code == ')') { keymap_auto_more = FALSE; /* since we are not returning this char, make sure the next key below works well */ if (!inkey_next || !inkey_next->code) { ke.type = EVT_NONE; break; } continue; } /* Accept result */ return (ke); } /* make sure that the flag to skip more prompts is off */ keymap_auto_more = FALSE; /* Forget pointer */ inkey_next = NULL; #ifdef ALLOW_BORG /* Mega-Hack -- Use the special hook */ if (inkey_hack) { ke.key = (*inkey_hack)(inkey_xtra); if (ke.key.type != EVT_NONE) { /* Cancel the various "global parameters" */ inkey_flag = FALSE; inkey_scan = 0; ke.type = EVT_KBRD; /* Accept result */ return (ke); } } #endif /* ALLOW_BORG */ /* Get the cursor state */ (void)Term_get_cursor(&cursor_state); /* Show the cursor if waiting, except sometimes in "command" mode */ if (!inkey_scan && (!inkey_flag || character_icky || (OPT(show_target) && target_sighted()))) (void)Term_set_cursor(TRUE); /* Hack -- Activate main screen */ Term_activate(term_screen); /* Get a key */ while (ke.type == EVT_NONE) { /* Hack -- Handle "inkey_scan == SCAN_INSTANT */ if (inkey_scan == SCAN_INSTANT && (0 != Term_inkey(&kk, FALSE, FALSE))) break; /* Hack -- Flush output once when no key ready */ if (!done && (0 != Term_inkey(&kk, FALSE, FALSE))) { /* Hack -- activate proper term */ Term_activate(old); /* Flush output */ Term_fresh(); /* Hack -- activate main screen */ Term_activate(term_screen); /* Mega-Hack -- reset saved flag */ character_saved = FALSE; /* Mega-Hack -- reset signal counter */ signal_count = 0; /* Only once */ done = TRUE; } /* Get a key (see above) */ ke = inkey_aux(inkey_scan); if(inkey_scan && ke.type == EVT_NONE) /* The keypress timed out. We need to stop here. */ break; /* Treat back-quote as escape */ if (ke.key.code == '`') ke.key.code = ESCAPE; } /* Hack -- restore the term */ Term_activate(old); /* Restore the cursor */ Term_set_cursor(cursor_state); /* Cancel the various "global parameters" */ inkey_flag = FALSE; inkey_scan = 0; /* Return the keypress */ return (ke); } /* * Get a keypress or mouse click from the user. */ void anykey(void) { ui_event ke = EVENT_EMPTY; /* Only accept a keypress or mouse click */ while (ke.type != EVT_MOUSE && ke.type != EVT_KBRD) ke = inkey_ex(); } /* * Get a "keypress" from the user. */ struct keypress inkey(void) { ui_event ke = EVENT_EMPTY; /* Only accept a keypress */ /*while (ke.type != EVT_ESCAPE && ke.type != EVT_KBRD) ke = inkey_ex();*/ /* Paranoia */ /* if (ke.type == EVT_ESCAPE) { ke.type = EVT_KBRD; ke.key.code = ESCAPE; ke.key.mods = 0; } */ while (ke.type != EVT_ESCAPE && ke.type != EVT_KBRD && ke.type != EVT_MOUSE && ke.type != EVT_BUTTON) ke = inkey_ex(); /* make the event a keypress */ if (ke.type == EVT_ESCAPE) { ke.type = EVT_KBRD; ke.key.code = ESCAPE; ke.key.mods = 0; } else if (ke.type == EVT_MOUSE) { if (ke.mouse.button == 1) { ke.type = EVT_KBRD; ke.key.code = '\n'; ke.key.mods = 0; } else { ke.type = EVT_KBRD; ke.key.code = ESCAPE; ke.key.mods = 0; } } else if (ke.type == EVT_BUTTON) { ke.type = EVT_KBRD; } return ke.key; } /* * Get a "keypress" or a "mousepress" from the user. * on return the event must be either a key press or a mouse press */ ui_event inkey_m(void) { ui_event ke = EVENT_EMPTY; /* Only accept a keypress */ while (ke.type != EVT_ESCAPE && ke.type != EVT_KBRD && ke.type != EVT_MOUSE && ke.type != EVT_BUTTON) ke = inkey_ex(); if (ke.type == EVT_ESCAPE) { ke.type = EVT_KBRD; ke.key.code = ESCAPE; ke.key.mods = 0; } else if (ke.type == EVT_BUTTON) { ke.type = EVT_KBRD; } return ke; } /* * Flush the screen, make a noise */ void bell(const char *reason) { /* Mega-Hack -- Flush the output */ Term_fresh(); /* Hack -- memorize the reason if possible */ if (character_generated && reason) { message_add(reason, MSG_BELL); /* Window stuff */ p_ptr->redraw |= (PR_MESSAGE); redraw_stuff(p_ptr); } /* Flush the input (later!) */ flush(); } /* * Hack -- Make a (relevant?) sound */ void sound(int val) { /* No sound */ if (!OPT(use_sound) || !sound_hook) return; sound_hook(val); } /* * Hack -- flush */ static void msg_flush(int x) { byte a = TERM_L_BLUE; /* Pause for response */ Term_putstr(x, 0, -1, a, "-more-"); if ((!OPT(auto_more)) && !keymap_auto_more) anykey(); /* Clear the line */ Term_erase(0, 0, 255); } static int message_column = 0; /* * Output a message to the top line of the screen. * * Break long messages into multiple pieces (40-72 chars). * * Allow multiple short messages to "share" the top line. * * Prompt the user to make sure he has a chance to read them. * * These messages are memorized for later reference (see above). * * We could do a "Term_fresh()" to provide "flicker" if needed. * * The global "msg_flag" variable can be cleared to tell us to "erase" any * "pending" messages still on the screen, instead of using "msg_flush()". * This should only be done when the user is known to have read the message. * * We must be very careful about using the "msg("%s", )" functions without * explicitly calling the special "msg("%s", NULL)" function, since this may * result in the loss of information if the screen is cleared, or if anything * is displayed on the top line. * * Hack -- Note that "msg("%s", NULL)" will clear the top line even if no * messages are pending. */ static void msg_print_aux(u16b type, const char *msg) { int n; char *t; char buf[1024]; byte color; int w, h; if (!Term) return; /* Obtain the size */ (void)Term_get_size(&w, &h); /* Hack -- Reset */ if (!msg_flag) message_column = 0; /* Message Length */ n = (msg ? strlen(msg) : 0); /* Hack -- flush when requested or needed */ if (message_column && (!msg || ((message_column + n) > (w - 8)))) { /* Flush */ msg_flush(message_column); /* Forget it */ msg_flag = FALSE; /* Reset */ message_column = 0; } /* No message */ if (!msg) return; /* Paranoia */ if (n > 1000) return; /* Memorize the message (if legal) */ if (character_generated && !(p_ptr->is_dead)) message_add(msg, type); /* Window stuff */ p_ptr->redraw |= (PR_MESSAGE); /* Copy it */ my_strcpy(buf, msg, sizeof(buf)); /* Analyze the buffer */ t = buf; /* Get the color of the message */ color = message_type_color(type); /* Split message */ while (n > w - 1) { char oops; int check, split; /* Default split */ split = w - 8; /* Find the rightmost split point */ for (check = (w / 2); check < w - 8; check++) if (t[check] == ' ') split = check; /* Save the split character */ oops = t[split]; /* Split the message */ t[split] = '\0'; /* Display part of the message */ Term_putstr(0, 0, split, color, t); /* Flush it */ msg_flush(split + 1); /* Restore the split character */ t[split] = oops; /* Insert a space */ t[--split] = ' '; /* Prepare to recurse on the rest of "buf" */ t += split; n -= split; } /* Display the tail of the message */ Term_putstr(message_column, 0, n, color, t); /* Remember the message */ msg_flag = TRUE; /* Remember the position */ message_column += n + 1; /* Send refresh event */ event_signal(EVENT_MESSAGE); } /* * Display a formatted message, using "vstrnfmt()" and "msg("%s", )". */ void msg(const char *fmt, ...) { va_list vp; char buf[1024]; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Format the args, save the length */ (void)vstrnfmt(buf, sizeof(buf), fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Display */ msg_print_aux(MSG_GENERIC, buf); } void msgt(unsigned int type, const char *fmt, ...) { va_list vp; char buf[1024]; va_start(vp, fmt); vstrnfmt(buf, sizeof(buf), fmt, vp); va_end(vp); sound(type); msg_print_aux(type, buf); } /* * Print the queued messages. */ void message_flush(void) { /* Hack -- Reset */ if (!msg_flag) message_column = 0; /* Flush when needed */ if (message_column) { /* Print pending messages */ if (Term) msg_flush(message_column); /* Forget it */ msg_flag = FALSE; /* Reset */ message_column = 0; } } /*** text_out() ***/ /* * Function hook to output (colored) text to the screen or to a file. */ void (*text_out_hook)(byte a, const char *str); /* * Hack -- Where to wrap the text when using text_out(). Use the default * value (for example the screen width) when 'text_out_wrap' is 0. */ int text_out_wrap = 0; /* * Hack -- Indentation for the text when using text_out(). */ int text_out_indent = 0; /* * Hack -- Padding after wrapping */ int text_out_pad = 0; /* * Print some (colored) text to the screen at the current cursor position, * automatically "wrapping" existing text (at spaces) when necessary to * avoid placing any text into the last column, and clearing every line * before placing any text in that line. Also, allow "newline" to force * a "wrap" to the next line. Advance the cursor as needed so sequential * calls to this function will work correctly. * * Once this function has been called, the cursor should not be moved * until all the related "text_out()" calls to the window are complete. * * This function will correctly handle any width up to the maximum legal * value of 256, though it works best for a standard 80 character width. */ void text_out_to_screen(byte a, const char *str) { int x, y; int wid, h; int wrap; const wchar_t *s; wchar_t buf[1024]; /* Obtain the size */ (void)Term_get_size(&wid, &h); /* Obtain the cursor */ (void)Term_locate(&x, &y); /* Copy to a rewriteable string */ Term_mbstowcs(buf, str, 1024); /* Use special wrapping boundary? */ if ((text_out_wrap > 0) && (text_out_wrap < wid)) wrap = text_out_wrap; else wrap = wid; /* Process the string */ for (s = buf; *s; s++) { wchar_t ch; /* Force wrap */ if (*s == L'\n') { /* Wrap */ x = text_out_indent; y++; /* Clear line, move cursor */ Term_erase(x, y, 255); x += text_out_pad; Term_gotoxy(x, y); continue; } /* Clean up the char */ ch = (iswprint(*s) ? *s : L' '); /* Wrap words as needed */ if ((x >= wrap - 1) && (ch != L' ')) { int i, n = 0; int av[256]; wchar_t cv[256]; /* Wrap word */ if (x < wrap) { /* Scan existing text */ for (i = wrap - 2; i >= 0; i--) { /* Grab existing attr/char */ Term_what(i, y, &av[i], &cv[i]); /* Break on space */ if (cv[i] == L' ') break; /* Track current word */ n = i; } } /* Special case */ if (n == 0) n = wrap; /* Clear line */ Term_erase(n, y, 255); /* Wrap */ x = text_out_indent; y++; /* Clear line, move cursor */ Term_erase(x, y, 255); x += text_out_pad; Term_gotoxy(x, y); /* Wrap the word (if any) */ for (i = n; i < wrap - 1; i++) { /* Dump */ Term_addch(av[i], cv[i]); /* Advance (no wrap) */ if (++x > wrap) x = wrap; } } /* Dump */ Term_addch(a, ch); /* Advance */ if (++x > wrap) x = wrap; } } /* * Hack - the destination file for text_out_to_file. */ ang_file *text_out_file = NULL; /* * Write text to the given file and apply line-wrapping. * * Hook function for text_out(). Make sure that text_out_file points * to an open text-file. * * Long lines will be wrapped at text_out_wrap, or at column 75 if that * is not set; or at a newline character. Note that punctuation can * sometimes be placed one column beyond the wrap limit. * * You must be careful to end all file output with a newline character * to "flush" the stored line position. */ void text_out_to_file(byte a, const char *str) { const char *s; char buf[1024]; /* Current position on the line */ static int pos = 0; /* Wrap width */ int wrap = (text_out_wrap ? text_out_wrap : 75); /* Unused parameter */ (void)a; /* Copy to a rewriteable string */ my_strcpy(buf, str, 1024); /* Current location within "buf" */ s = buf; /* Process the string */ while (*s) { int n = 0; int len = wrap - pos; int l_space = -1; /* In case we are already past the wrap point (which can happen with * punctuation at the end of the line), make sure we don't overrun. */ if (len < 0) len = 0; /* If we are at the start of the line... */ if (pos == 0) { int i; /* Output the indent */ for (i = 0; i < text_out_indent; i++) { file_writec(text_out_file, ' '); pos++; } } /* Find length of line up to next newline or end-of-string */ while ((n < len) && !((s[n] == '\n') || (s[n] == '\0'))) { /* Mark the most recent space in the string */ if (s[n] == ' ') l_space = n; /* Increment */ n++; } /* If we have encountered no spaces */ if ((l_space == -1) && (n == len)) { /* If we are at the start of a new line */ if (pos == text_out_indent) { len = n; } /* HACK - Output punctuation at the end of the line */ else if ((s[0] == ' ') || (s[0] == ',') || (s[0] == '.')) { len = 1; } else { /* Begin a new line */ file_writec(text_out_file, '\n'); /* Reset */ pos = 0; continue; } } else { /* Wrap at the newline */ if ((s[n] == '\n') || (s[n] == '\0')) len = n; /* Wrap at the last space */ else len = l_space; } /* Write that line to file */ file_write(text_out_file, s, len); pos += len; /* Move 's' past the stuff we've written */ s += len; /* If we are at the end of the string, end */ if (*s == '\0') return; /* Skip newlines */ if (*s == '\n') s++; /* Begin a new line */ file_writec(text_out_file, '\n'); /* Reset */ pos = 0; /* Skip whitespace */ while (*s == ' ') s++; } /* We are done */ return; } /* * Output text to the screen or to a file depending on the selected * text_out hook. */ void text_out(const char *fmt, ...) { char buf[1024]; va_list vp; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Do the va_arg fmt to the buffer */ (void)vstrnfmt(buf, sizeof(buf), fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Output now */ text_out_hook(TERM_WHITE, buf); } /* * Output text to the screen (in color) or to a file depending on the * selected hook. */ void text_out_c(byte a, const char *fmt, ...) { char buf[1024]; va_list vp; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Do the va_arg fmt to the buffer */ (void)vstrnfmt(buf, sizeof(buf), fmt, vp); /* End the Varargs Stuff */ va_end(vp); /* Output now */ text_out_hook(a, buf); } /* * Given a "formatted" chunk of text (i.e. one including tags like {red}{/}) * in 'source', with starting point 'init', this finds the next section of * text and any tag that goes with it, return TRUE if it finds something to * print. * * If it returns TRUE, then it also fills 'text' with a pointer to the start * of the next printable section of text, and 'len' with the length of that * text, and 'end' with a pointer to the start of the next section. This * may differ from "text + len" because of the presence of tags. If a tag * applies to the section of text, it returns a pointer to the start of that * tag in 'tag' and the length in 'taglen'. Otherwise, 'tag' is filled with * NULL. * * See text_out_e for an example of its use. */ static bool next_section(const char *source, size_t init, const char **text, size_t *len, const char **tag, size_t *taglen, const char **end) { const char *next; *tag = NULL; *text = source + init; if (*text[0] == '\0') return FALSE; next = strchr(*text, '{'); while (next) { const char *s = next + 1; while (*s && (isalpha((unsigned char) *s) || isspace((unsigned char) *s))) s++; /* Woo! valid opening tag thing */ if (*s == '}') { const char *close = strstr(s, "{/}"); /* There's a closing thing, so it's valid. */ if (close) { /* If this tag is at the start of the fragment */ if (next == *text) { *tag = *text + 1; *taglen = s - *text - 1; *text = s + 1; *len = close - *text; *end = close + 3; return TRUE; } /* Otherwise return the chunk up to this */ else { *len = next - *text; *end = *text + *len; return TRUE; } } /* No closing thing, therefore all one lump of text. */ else { *len = strlen(*text); *end = *text + *len; return TRUE; } } /* End of the string, that's fine. */ else if (*s == '\0') { *len = strlen(*text); *end = *text + *len; return TRUE; } /* An invalid tag, skip it. */ else { next = next + 1; } next = strchr(next, '{'); } /* Default to the rest of the string */ *len = strlen(*text); *end = *text + *len; return TRUE; } /* * Output text to the screen or to a file depending on the * selected hook. Takes strings with "embedded formatting", * such that something within {red}{/} will be printed in red. * * Note that such formatting will be treated as a "breakpoint" * for the printing, so if used within words may lead to part of the * word being moved to the next line. */ void text_out_e(const char *fmt, ...) { char buf[1024]; char smallbuf[1024]; va_list vp; const char *start, *next, *text, *tag; size_t textlen, taglen = 0; /* Begin the Varargs Stuff */ va_start(vp, fmt); /* Do the va_arg fmt to the buffer */ (void)vstrnfmt(buf, sizeof(buf), fmt, vp); /* End the Varargs Stuff */ va_end(vp); start = buf; while (next_section(start, 0, &text, &textlen, &tag, &taglen, &next)) { int a = -1; memcpy(smallbuf, text, textlen); smallbuf[textlen] = 0; if (tag) { char tagbuffer[16]; /* Colour names are less than 16 characters long. */ assert(taglen < 16); memcpy(tagbuffer, tag, taglen); tagbuffer[taglen] = '\0'; a = color_text_to_attr(tagbuffer); } if (a == -1) a = TERM_WHITE; /* Output now */ text_out_hook(a, smallbuf); start = next; } } /* * Clear part of the screen */ void clear_from(int row) { int y; /* Erase requested rows */ for (y = row; y < Term->hgt; y++) { /* Erase part of the screen */ Term_erase(0, y, 255); } } /* * The default "keypress handling function" for askfor_aux, this takes the * given keypress, input buffer, length, etc, and does the appropriate action * for each keypress, such as moving the cursor left or inserting a character. * * It should return TRUE when editing of the buffer is "complete" (e.g. on * the press of RETURN). */ bool askfor_aux_keypress(char *buf, size_t buflen, size_t *curs, size_t *len, struct keypress keypress, bool firsttime) { switch (keypress.code) { case ESCAPE: { *curs = 0; return TRUE; } case KC_ENTER: { *curs = *len; return TRUE; } case ARROW_LEFT: { if (firsttime) *curs = 0; if (*curs > 0) (*curs)--; break; } case ARROW_RIGHT: { if (firsttime) *curs = *len - 1; if (*curs < *len) (*curs)++; break; } case KC_BACKSPACE: case KC_DELETE: { /* If this is the first time round, backspace means "delete all" */ if (firsttime) { buf[0] = '\0'; *curs = 0; *len = 0; break; } /* Refuse to backspace into oblivion */ if((keypress.code == KC_BACKSPACE && *curs == 0) || (keypress.code == KC_DELETE && *curs >= *len)) break; /* Move the string from k to nul along to the left by 1 */ if(keypress.code == KC_BACKSPACE) memmove(&buf[*curs - 1], &buf[*curs], *len - *curs); else memmove(&buf[*curs], &buf[*curs+1], *len - *curs -1); /* Decrement */ if(keypress.code == KC_BACKSPACE) (*curs)--; (*len)--; /* Terminate */ buf[*len] = '\0'; break; } default: { bool atnull = (buf[*curs] == 0); if (!isprint(keypress.code)) { bell("Illegal edit key!"); break; } /* Clear the buffer if this is the first time round */ if (firsttime) { buf[0] = '\0'; *curs = 0; *len = 0; atnull = 1; } if (atnull) { /* Make sure we have enough room for a new character */ if ((*curs + 1) >= buflen) break; } else { /* Make sure we have enough room to add a new character */ if ((*len + 1) >= buflen) break; /* Move the rest of the buffer along to make room */ memmove(&buf[*curs+1], &buf[*curs], *len - *curs); } /* Insert the character */ buf[(*curs)++] = (char)keypress.code; (*len)++; /* Terminate */ buf[*len] = '\0'; break; } } /* By default, we aren't done. */ return FALSE; } /* * Get some input at the cursor location. * * The buffer is assumed to have been initialized to a default string. * Note that this string is often "empty" (see below). * * The default buffer is displayed in yellow until cleared, which happens * on the first keypress, unless that keypress is Return. * * Normal chars clear the default and append the char. * Backspace clears the default or deletes the final char. * Return accepts the current buffer contents and returns TRUE. * Escape clears the buffer and the window and returns FALSE. * * Note that 'len' refers to the size of the buffer. The maximum length * of the input is 'len-1'. * * 'keypress_h' is a pointer to a function to handle keypresses, altering * the input buffer, cursor position and suchlike as required. See * 'askfor_aux_keypress' (the default handler if you supply NULL for * 'keypress_h') for an example. */ bool askfor_aux(char *buf, size_t len, bool (*keypress_h)(char *, size_t, size_t *, size_t *, struct keypress, bool)) { int y, x; size_t k = 0; /* Cursor position */ size_t nul = 0; /* Position of the null byte in the string */ struct keypress ch = { 0 }; bool done = FALSE; bool firsttime = TRUE; if (keypress_h == NULL) { keypress_h = askfor_aux_keypress; } /* Locate the cursor */ Term_locate(&x, &y); /* Paranoia */ if ((x < 0) || (x >= 80)) x = 0; /* Restrict the length */ if (x + len > 80) len = 80 - x; /* Truncate the default entry */ buf[len-1] = '\0'; /* Get the position of the null byte */ nul = strlen(buf); /* Display the default answer */ Term_erase(x, y, (int)len); Term_putstr(x, y, -1, TERM_YELLOW, buf); /* Process input */ while (!done) { /* Place cursor */ Term_gotoxy(x + k, y); /* Get a key */ ch = inkey(); /* Let the keypress handler deal with the keypress */ done = keypress_h(buf, len, &k, &nul, ch, firsttime); /* Update the entry */ Term_erase(x, y, (int)len); Term_putstr(x, y, -1, TERM_WHITE, buf); /* Not the first time round anymore */ firsttime = FALSE; } /* Done */ return (ch.code != ESCAPE); } /* * A "keypress" handling function for askfor_aux, that handles the special * case of '*' for a new random "name" and passes any other "keypress" * through to the default "editing" handler. */ static bool get_name_keypress(char *buf, size_t buflen, size_t *curs, size_t *len, struct keypress keypress, bool firsttime) { bool result; switch (keypress.code) { case '*': { *len = randname_make(RANDNAME_TOLKIEN, 4, 8, buf, buflen, name_sections); my_strcap(buf); *curs = 0; result = FALSE; break; } default: { result = askfor_aux_keypress(buf, buflen, curs, len, keypress, firsttime); break; } } return result; } /* * Gets a name for the character, reacting to name changes. * * If sf is TRUE, we change the savefile name depending on the character name. * * What a horrible name for a global function. XXX XXX XXX */ bool get_name(char *buf, size_t buflen) { bool res; /* Paranoia XXX XXX XXX */ message_flush(); /* Display prompt */ prt("Enter a name for your character (* for a random name): ", 0, 0); /* Save the player name */ my_strcpy(buf, op_ptr->full_name, buflen); /* Ask the user for a string */ res = askfor_aux(buf, buflen, get_name_keypress); /* Clear prompt */ prt("", 0, 0); /* Revert to the old name if the player doesn't pick a new one. */ if (!res) { my_strcpy(buf, op_ptr->full_name, buflen); } return res; } /* * Prompt for a string from the user. * * The "prompt" should take the form "Prompt: ". * * See "askfor_aux" for some notes about "buf" and "len", and about * the return value of this function. */ bool get_string(const char *prompt, char *buf, size_t len) { bool res; /* Paranoia XXX XXX XXX */ message_flush(); /* Display prompt */ prt(prompt, 0, 0); /* Ask the user for a string */ res = askfor_aux(buf, len, NULL); /* Clear prompt */ prt("", 0, 0); /* Result */ return (res); } /* * Request a "quantity" from the user */ s16b get_quantity(const char *prompt, int max) { int amt = 1; /* Prompt if needed */ if (max != 1) { char tmp[80]; char buf[80]; /* Build a prompt if needed */ if (!prompt) { /* Build a prompt */ strnfmt(tmp, sizeof(tmp), "Quantity (0-%d, *=all): ", max); /* Use that prompt */ prompt = tmp; } /* Build the default */ strnfmt(buf, sizeof(buf), "%d", amt); /* Ask for a quantity */ if (!get_string(prompt, buf, 7)) return (0); /* Extract a number */ amt = atoi(buf); /* A star or letter means "all" */ if ((buf[0] == '*') || isalpha((unsigned char)buf[0])) amt = max; } /* Enforce the maximum */ if (amt > max) amt = max; /* Enforce the minimum */ if (amt < 0) amt = 0; /* Return the result */ return (amt); } /* * Verify something with the user * * The "prompt" should take the form "Query? " * * Note that "[y/n]" is appended to the prompt. */ bool get_check(const char *prompt) { //struct keypress ke; ui_event ke; char buf[80]; /* Paranoia XXX XXX XXX */ message_flush(); /* Hack -- Build a "useful" prompt */ strnfmt(buf, 78, "%.70s[y/n] ", prompt); /* Prompt for it */ prt(buf, 0, 0); ke = inkey_m(); /* Erase the prompt */ prt("", 0, 0); /* Normal negation */ if (ke.type == EVT_MOUSE) { if ((ke.mouse.button != 1) && (ke.mouse.y != 0)) return (FALSE); } else if ((ke.key.code != 'Y') && (ke.key.code != 'y')) return (FALSE); /* Success */ return (TRUE); } /* TODO: refactor get_check() in terms of get_char() */ /* * Ask the user to respond with a character. Options is a constant string, * e.g. "yns"; len is the length of the constant string, and fallback should * be the default answer if the user hits escape or an invalid key. * * Example: get_char("Study? ", "yns", 3, 'n') * This prompts "Study? [yns]" and defaults to 'n'. * */ char get_char(const char *prompt, const char *options, size_t len, char fallback) { struct keypress key; char buf[80]; /* Paranoia XXX XXX XXX */ message_flush(); /* Hack -- Build a "useful" prompt */ strnfmt(buf, 78, "%.70s[%s] ", prompt, options); /* Prompt for it */ prt(buf, 0, 0); /* Get an acceptable answer */ key = inkey(); /* Lowercase answer if necessary */ if (key.code >= 'A' && key.code <= 'Z') key.code += 32; /* See if key is in our options string */ if (!strchr(options, (char)key.code)) key.code = fallback; /* Erase the prompt */ prt("", 0, 0); /* Success */ return key.code; } /** * Text-native way of getting a filename. */ static bool get_file_text(const char *suggested_name, char *path, size_t len) { char buf[160]; /* Get filename */ my_strcpy(buf, suggested_name, sizeof buf); if (!get_string("File name: ", buf, sizeof buf)) return FALSE; /* Make sure it's actually a filename */ if (buf[0] == '\0' || buf[0] == ' ') return FALSE; /* Build the path */ path_build(path, len, ANGBAND_DIR_USER, buf); /* Check if it already exists */ if (file_exists(path) && !get_check("Replace existing file? ")) return FALSE; /* Tell the user where it's saved to. */ msg("Saving as %s.", path); return TRUE; } /** * Get a pathname to save a file to, given the suggested name. Returns the * result in "path". */ bool (*get_file)(const char *suggested_name, char *path, size_t len) = get_file_text; /* * Prompts for a keypress * * The "prompt" should take the form "Command: " * * Returns TRUE unless the character is "Escape" */ bool get_com(const char *prompt, struct keypress *command) { ui_event ke; bool result; result = get_com_ex(prompt, &ke); *command = ke.key; return result; } bool get_com_ex(const char *prompt, ui_event *command) { ui_event ke; /* Paranoia XXX XXX XXX */ message_flush(); /* Display a prompt */ prt(prompt, 0, 0); /* Get a key */ ke = inkey_m(); /* Clear the prompt */ prt("", 0, 0); /* Save the command */ *command = ke; /* Done */ if ((ke.type == EVT_KBRD && ke.key.code != ESCAPE) || (ke.type == EVT_MOUSE)) return TRUE; return FALSE; } /* * Pause for user response * * This function is stupid. XXX XXX XXX */ void pause_line(struct term *term) { prt("", term->hgt - 1, 0); put_str("[Press any key to continue]", term->hgt - 1, 23); (void)anykey(); prt("", term->hgt - 1, 0); } /* * Check a char for "vowel-hood" */ bool is_a_vowel(int ch) { switch (tolower((unsigned char) ch)) { case 'a': case 'e': case 'i': case 'o': case 'u': { return (TRUE); } } return (FALSE); } /* * Accept a color index character; if legal, return the color. -LM- * * Unlike Sangband, we don't translate these colours here. */ /* XXX: having color_{char,text}_to_attr() separately is moronic. */ int color_char_to_attr(char c) { int a; /* Is negative -- spit it right back out */ if (c < 0) return (c); /* Is a space or '\0' -- return black */ if (c == '\0' || c == ' ') return (TERM_DARK); /* Search the color table */ for (a = 0; a < BASIC_COLORS; a++) { /* Look for the index */ if (color_table[a].index_char == c) break; } /* If we don't find the color, we assume white */ if (a == BASIC_COLORS) return (TERM_WHITE); /* Return the color */ return (a); } /* * Converts a string to a terminal color byte. */ int color_text_to_attr(const char *name) { int a; for (a = 0; a < MAX_COLORS; a++) { if (my_stricmp(name, color_table[a].name) == 0) return (a); } /* Default to white */ return (TERM_WHITE); } /* * Extract a textual representation of an attribute */ const char *attr_to_text(byte a) { if (a < BASIC_COLORS) return (color_table[a].name); else return ("Icky"); } /** * Return whether the given display char matches an entered symbol * * Horrible hack. TODO UTF-8 find some way of entering mb chars */ bool char_matches_key(wchar_t c, keycode_t key) { wchar_t keychar[2]; char k[2] = {'\0', '\0'}; k[0] = (char)key; Term_mbstowcs(keychar, k, 1); return (c == keychar[0]); } #ifdef SUPPORT_GAMMA /* * XXX XXX XXX Important note about "colors" XXX XXX XXX * * The "TERM_*" color definitions list the "composition" of each * "Angband color" in terms of "quarters" of each of the three color * components (Red, Green, Blue), for example, TERM_UMBER is defined * as 2/4 Red, 1/4 Green, 0/4 Blue. * * These values are NOT gamma-corrected. On most machines (with the * Macintosh being an important exception), you must "gamma-correct" * the given values, that is, "correct for the intrinsic non-linearity * of the phosphor", by converting the given intensity levels based * on the "gamma" of the target screen, which is usually 1.7 (or 1.5). * * The actual formula for conversion is unknown to me at this time, * but you can use the table below for the most common gamma values. * * So, on most machines, simply convert the values based on the "gamma" * of the target screen, which is usually in the range 1.5 to 1.7, and * usually is closest to 1.7. The converted value for each of the five * different "quarter" values is given below: * * Given Gamma 1.0 Gamma 1.5 Gamma 1.7 Hex 1.7 * ----- ---- ---- ---- --- * 0/4 0.00 0.00 0.00 #00 * 1/4 0.25 0.27 0.28 #47 * 2/4 0.50 0.55 0.56 #8f * 3/4 0.75 0.82 0.84 #d7 * 4/4 1.00 1.00 1.00 #ff */ /* Table of gamma values */ byte gamma_table[256]; /* Table of ln(x / 256) * 256 for x going from 0 -> 255 */ static const s16b gamma_helper[256] = { 0, -1420, -1242, -1138, -1065, -1007, -961, -921, -887, -857, -830, -806, -783, -762, -744, -726, -710, -694, -679, -666, -652, -640, -628, -617, -606, -596, -586, -576, -567, -577, -549, -541, -532, -525, -517, -509, -502, -495, -488, -482, -475, -469, -463, -457, -451, -455, -439, -434, -429, -423, -418, -413, -408, -403, -398, -394, -389, -385, -380, -376, -371, -367, -363, -359, -355, -351, -347, -343, -339, -336, -332, -328, -325, -321, -318, -314, -311, -308, -304, -301, -298, -295, -291, -288, -285, -282, -279, -276, -273, -271, -268, -265, -262, -259, -257, -254, -251, -248, -246, -243, -241, -238, -236, -233, -231, -228, -226, -223, -221, -219, -216, -214, -212, -209, -207, -205, -203, -200, -198, -196, -194, -192, -190, -188, -186, -184, -182, -180, -178, -176, -174, -172, -170, -168, -166, -164, -162, -160, -158, -156, -155, -153, -151, -149, -147, -146, -144, -142, -140, -139, -137, -135, -134, -132, -130, -128, -127, -125, -124, -122, -120, -119, -117, -116, -114, -112, -111, -109, -108, -106, -105, -103, -102, -100, -99, -97, -96, -95, -93, -92, -90, -89, -87, -86, -85, -83, -82, -80, -79, -78, -76, -75, -74, -72, -71, -70, -68, -67, -66, -65, -63, -62, -61, -59, -58, -57, -56, -54, -53, -52, -51, -50, -48, -47, -46, -45, -44, -42, -41, -40, -39, -38, -37, -35, -34, -33, -32, -31, -30, -29, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1 }; /* * Build the gamma table so that floating point isn't needed. * * Note gamma goes from 0->256. The old value of 100 is now 128. */ void build_gamma_table(int gamma) { int i, n; /* * value is the current sum. * diff is the new term to add to the series. */ long value, diff; /* Hack - convergence is bad in these cases. */ gamma_table[0] = 0; gamma_table[255] = 255; for (i = 1; i < 255; i++) { /* * Initialise the Taylor series * * value and diff have been scaled by 256 */ n = 1; value = 256L * 256L; diff = ((long)gamma_helper[i]) * (gamma - 256); while (diff) { value += diff; n++; /* * Use the following identiy to calculate the gamma table. * exp(x) = 1 + x + x^2/2 + x^3/(2*3) + x^4/(2*3*4) +... * * n is the current term number. * * The gamma_helper array contains a table of * ln(x/256) * 256 * This is used because a^b = exp(b*ln(a)) * * In this case: * a is i / 256 * b is gamma. * * Note that everything is scaled by 256 for accuracy, * plus another factor of 256 for the final result to * be from 0-255. Thus gamma_helper[] * gamma must be * divided by 256*256 each itteration, to get back to * the original power series. */ diff = (((diff / 256) * gamma_helper[i]) * (gamma - 256)) / (256 * n); } /* * Store the value in the table so that the * floating point pow function isn't needed. */ gamma_table[i] = (byte)(((long)(value / 256) * i) / 256); } } #endif /* SUPPORT_GAMMA */ angband-3.5.1/src/generate.h0000644000175000017500000001015412456456606015173 0ustar chriscchrisc/* generate.h - dungeon generation interface */ #ifndef GENERATE_H #define GENERATE_H #include "monster/constants.h" #include "monster/monster.h" void ensure_connectedness(struct cave *c); void place_object(struct cave *c, int y, int x, int level, bool good, bool great, byte origin, int tval); void place_gold(struct cave *c, int y, int x, int level, byte origin); void place_secret_door(struct cave *c, int y, int x); void place_closed_door(struct cave *c, int y, int x); void place_random_door(struct cave *c, int y, int x); extern struct room_template *random_room_template(int typ); extern struct vault *random_vault(int typ); struct tunnel_profile { const char *name; int rnd; /* % chance of choosing random direction */ int chg; /* % chance of changing direction */ int con; /* % chance of extra tunneling */ int pen; /* % chance of placing doors at room entrances */ int jct; /* % chance of doors at tunnel junctions */ }; struct streamer_profile { const char *name; int den; /* Density of streamers */ int rng; /* Width of streamers */ int mag; /* Number of magma streamers */ int mc; /* 1/chance of treasure per magma */ int qua; /* Number of quartz streamers */ int qc; /* 1/chance of treasure per quartz */ }; /* * cave_builder is a function pointer which builds a level. */ typedef bool (*cave_builder) (struct cave *c, struct player *p); struct cave_profile { const char *name; cave_builder builder; /* Function used to build the level */ int dun_rooms; /* Number of rooms to attempt */ int dun_unusual; /* Level/chance of unusual room */ int max_rarity; /* Max number of rarity levels used in room generation */ int n_room_profiles; /* Number of room profiles */ struct tunnel_profile tun; /* Used to build tunnels */ struct streamer_profile str; /* Used to build mineral streamers*/ const struct room_profile *room_profiles; /* Used to build rooms */ int cutoff; /* Used to see if we should try this dungeon */ }; /** * room_builder is a function pointer which builds rooms in the cave given * anchor coordinates. */ typedef bool (*room_builder) (struct cave *c, int y0, int x0); /** * This tracks information needed to generate the room, including the room's * name and the function used to build it. */ struct room_profile { const char *name; room_builder builder; /* Function used to build the room */ int height, width; /* Space required in blocks */ int level; /* Minimum dungeon level */ bool pit; /* Whether this room is a pit/nest or not */ int rarity; /* How unusual this room is */ int cutoff; /* Upper limit of 1-100 random roll for room generation */ }; struct pit_color_profile { struct pit_color_profile *next; byte color; }; struct pit_forbidden_monster { struct pit_forbidden_monster *next; monster_race *race; }; typedef struct pit_profile { struct pit_profile *next; int pit_idx; /* Index in pit_info */ const char *name; int room_type; /* Is this a pit or a nest? */ int ave; /* Level where this pit is most common */ int rarity; /* How unusual this pit is */ int obj_rarity; /* How rare objects are in this pit */ bitflag flags[RF_SIZE]; /* Required flags */ bitflag forbidden_flags[RF_SIZE]; bitflag spell_flags[RSF_SIZE]; /* Required spell flags */ bitflag forbidden_spell_flags[RSF_SIZE]; int n_bases; struct monster_base *base[MAX_RVALS]; struct pit_color_profile *colors; struct pit_forbidden_monster *forbidden_monsters; } pit_profile; /* * Information about "vault generation" */ struct vault { struct vault *next; unsigned int vidx; char *name; char *text; byte typ; /* Vault type */ byte rat; /* Vault rating */ byte hgt; /* Vault height */ byte wid; /* Vault width */ }; /* * Information about "room generation" */ typedef struct room_template { struct room_template *next; unsigned int tidx; char *name; char *text; byte typ; /* Room type */ byte rat; /* Room rating */ byte hgt; /* Room height */ byte wid; /* Room width */ byte dor; /* Random door options */ byte tval; /* tval for objects in this room */ } room_template_type; #endif /* !GENERATE_H */ angband-3.5.1/src/ui.h0000644000175000017500000000317212456456606014020 0ustar chriscchrisc/* * Copyright (c) 2007 Pete Mack and others * This code released under the Gnu Public License. See www.fsf.org * for current GPL license details. Addition permission granted to * incorporate modifications in all Angband variants as defined in the * Angband variants FAQ. See rec.games.roguelike.angband for FAQ. */ #ifndef INCLUDED_UI_H #define INCLUDED_UI_H /* ================== GEOMETRY ====================== */ /* Defines a rectangle on the screen that is bound to a Panel or subpanel */ typedef struct region region; struct region { int col; /* x-coordinate of upper right corner */ int row; /* y-coord of upper right coordinate */ int width; /* width of display area. 1 - use system default. */ /* non-positive - rel to right of screen */ int page_rows; /* non-positive value is relative to the bottom of the screen */ }; /* Region that defines the full screen */ static const region SCREEN_REGION = {0, 0, 0, 0}; /* Erase the contents of a region */ void region_erase(const region *loc); /* Erase the contents of a region + 1 char each way */ void region_erase_bordered(const region *loc); /* Given a region with relative values, make them absolute */ region region_calculate(region loc); /* Check whether a (mouse) event is inside a region */ bool region_inside(const region *loc, const ui_event *key); /*** Text ***/ #include "z-textblock.h" void textui_textblock_show(textblock *tb, region orig_area, const char *header); void textui_textblock_place(textblock *tb, region orig_area, const char *header); /*** Misc ***/ void window_make(int origin_x, int origin_y, int end_x, int end_y); #endif /* INCLUDED_UI_H */ angband-3.5.1/src/player/0000755000175000017500000000000012456456606014523 5ustar chriscchriscangband-3.5.1/src/player/race.c0000644000175000017500000000044112456456606015600 0ustar chriscchrisc/* player/race.c * Copyright (c) 2011 elly+angband@leptoquark.net. See COPYING. */ #include "externs.h" #include "player/player.h" struct player_race *player_id2race(guid id) { struct player_race *r; for (r = races; r; r = r->next) if (guid_eq(r->ridx, id)) break; return r; } angband-3.5.1/src/player/spell.c0000644000175000017500000002135312456456606016012 0ustar chriscchrisc/* * File: player/spell.c * Purpose: Spell and prayer casting/praying * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "object/tvalsval.h" #include "game-cmd.h" #include "spells.h" /* * Stat Table (INT/WIS) -- Minimum failure rate (percentage) */ const byte adj_mag_fail[STAT_RANGE] = { 99 /* 3 */, 99 /* 4 */, 99 /* 5 */, 99 /* 6 */, 99 /* 7 */, 50 /* 8 */, 30 /* 9 */, 20 /* 10 */, 15 /* 11 */, 12 /* 12 */, 11 /* 13 */, 10 /* 14 */, 9 /* 15 */, 8 /* 16 */, 7 /* 17 */, 6 /* 18/00-18/09 */, 6 /* 18/10-18/19 */, 5 /* 18/20-18/29 */, 5 /* 18/30-18/39 */, 5 /* 18/40-18/49 */, 4 /* 18/50-18/59 */, 4 /* 18/60-18/69 */, 4 /* 18/70-18/79 */, 4 /* 18/80-18/89 */, 3 /* 18/90-18/99 */, 3 /* 18/100-18/109 */, 2 /* 18/110-18/119 */, 2 /* 18/120-18/129 */, 2 /* 18/130-18/139 */, 2 /* 18/140-18/149 */, 1 /* 18/150-18/159 */, 1 /* 18/160-18/169 */, 1 /* 18/170-18/179 */, 1 /* 18/180-18/189 */, 1 /* 18/190-18/199 */, 0 /* 18/200-18/209 */, 0 /* 18/210-18/219 */, 0 /* 18/220+ */ }; /* * Stat Table (INT/WIS) -- failure rate adjustment */ const int adj_mag_stat[STAT_RANGE] = { -5 /* 3 */, -4 /* 4 */, -3 /* 5 */, -3 /* 6 */, -2 /* 7 */, -1 /* 8 */, 0 /* 9 */, 0 /* 10 */, 0 /* 11 */, 0 /* 12 */, 0 /* 13 */, 1 /* 14 */, 2 /* 15 */, 3 /* 16 */, 4 /* 17 */, 5 /* 18/00-18/09 */, 6 /* 18/10-18/19 */, 7 /* 18/20-18/29 */, 8 /* 18/30-18/39 */, 9 /* 18/40-18/49 */, 10 /* 18/50-18/59 */, 11 /* 18/60-18/69 */, 12 /* 18/70-18/79 */, 15 /* 18/80-18/89 */, 18 /* 18/90-18/99 */, 21 /* 18/100-18/109 */, 24 /* 18/110-18/119 */, 27 /* 18/120-18/129 */, 30 /* 18/130-18/139 */, 33 /* 18/140-18/149 */, 36 /* 18/150-18/159 */, 39 /* 18/160-18/169 */, 42 /* 18/170-18/179 */, 45 /* 18/180-18/189 */, 48 /* 18/190-18/199 */, 51 /* 18/200-18/209 */, 54 /* 18/210-18/219 */, 57 /* 18/220+ */ }; /** * Compare function for sorting spells into book order */ static int cmp_spell(const void *s1, const void *s2) { int spell1 = *(int*)s1 + (p_ptr->class->spell_book == TV_MAGIC_BOOK ? 0 : PY_MAX_SPELLS); int spell2 = *(int*)s2 + (p_ptr->class->spell_book == TV_MAGIC_BOOK ? 0 : PY_MAX_SPELLS); int pos1 = s_info[spell1].snum; int pos2 = s_info[spell2].snum; if (pos1 < pos2) return -1; if (pos1 > pos2) return 1; return 0; } /** * Collect spells from a book into the spells[] array. */ int spell_collect_from_book(const object_type *o_ptr, int *spells) { struct spell *sp; int n_spells = 0; for (sp = o_ptr->kind->spells; sp; sp = sp->next) { spells[n_spells++] = sp->spell_index; } sort(spells, n_spells, sizeof(int), cmp_spell); return n_spells; } /** * Return the number of castable spells in the spellbook 'o_ptr'. */ int spell_book_count_spells(const object_type *o_ptr, bool (*tester)(int spell)) { struct spell *sp; int n_spells = 0; for (sp = o_ptr->kind->spells; sp; sp = sp->next) if (tester(sp->spell_index)) n_spells++; return n_spells; } /** * True if at least one spell in spells[] is OK according to spell_test. */ bool spell_okay_list(bool (*spell_test)(int spell), const int spells[], int n_spells) { int i; bool okay = FALSE; for (i = 0; i < n_spells; i++) { if (spell_test(spells[i])) okay = TRUE; } return okay; } /** * True if the spell is castable. */ bool spell_okay_to_cast(int spell) { return (p_ptr->spell_flags[spell] & PY_SPELL_LEARNED); } /** * True if the spell can be studied. */ bool spell_okay_to_study(int spell) { const magic_type *s_ptr = &p_ptr->class->spells.info[spell]; return (s_ptr->slevel <= p_ptr->lev) && !(p_ptr->spell_flags[spell] & PY_SPELL_LEARNED); } /** * True if the spell is browsable. */ bool spell_okay_to_browse(int spell) { const magic_type *s_ptr = &p_ptr->class->spells.info[spell]; return (s_ptr->slevel < 99); } /* * Returns chance of failure for a spell */ s16b spell_chance(int spell) { int chance, minfail; const magic_type *s_ptr; /* Paranoia -- must be literate */ if (!p_ptr->class->spell_book) return (100); /* Get the spell */ s_ptr = &p_ptr->class->spells.info[spell]; /* Extract the base spell failure rate */ chance = s_ptr->sfail; /* Reduce failure rate by "effective" level adjustment */ chance -= 3 * (p_ptr->lev - s_ptr->slevel); /* Reduce failure rate by INT/WIS adjustment */ chance -= adj_mag_stat[p_ptr->state.stat_ind[p_ptr->class->spell_stat]]; /* Not enough mana to cast */ if (s_ptr->smana > p_ptr->csp) { chance += 5 * (s_ptr->smana - p_ptr->csp); } /* Extract the minimum failure rate */ minfail = adj_mag_fail[p_ptr->state.stat_ind[p_ptr->class->spell_stat]]; /* Non mage/priest characters never get better than 5 percent */ if (!player_has(PF_ZERO_FAIL) && minfail < 5) { minfail = 5; } /* Priest prayer penalty for "edged" weapons (before minfail) */ if (p_ptr->state.icky_wield) { chance += 25; } /* Fear makes spells harder (before minfail) */ /* Note that spells that remove fear have a much lower fail rate than * surrounding spells, to make sure this doesn't cause mega fail */ if (check_state(p_ptr, OF_AFRAID, p_ptr->state.flags)) chance += 20; /* Minimal and maximal failure rate */ if (chance < minfail) chance = minfail; if (chance > 50) chance = 50; /* Stunning makes spells harder (after minfail) */ if (p_ptr->timed[TMD_STUN] > 50) chance += 25; else if (p_ptr->timed[TMD_STUN]) chance += 15; /* Amnesia doubles failure change */ if (p_ptr->timed[TMD_AMNESIA]) chance = 50 + chance / 2; /* Always a 5 percent chance of working */ if (chance > 95) chance = 95; /* Return the chance */ return (chance); } /* Check if the given spell is in the given book. */ bool spell_in_book(int spell, int book) { struct spell *sp; object_type *o_ptr = object_from_item_idx(book); for (sp = o_ptr->kind->spells; sp; sp = sp->next) if (spell == sp->spell_index) return TRUE; return FALSE; } /* * Learn the specified spell. */ void spell_learn(int spell) { int i; const char *p = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer"); /* Learn the spell */ p_ptr->spell_flags[spell] |= PY_SPELL_LEARNED; /* Find the next open entry in "spell_order[]" */ for (i = 0; i < PY_MAX_SPELLS; i++) { /* Stop at the first empty space */ if (p_ptr->spell_order[i] == 99) break; } /* Add the spell to the known list */ p_ptr->spell_order[i] = spell; /* Mention the result */ msgt(MSG_STUDY, "You have learned the %s of %s.", p, get_spell_name(p_ptr->class->spell_book, spell)); /* One less spell available */ p_ptr->new_spells--; /* Message if needed */ if (p_ptr->new_spells) { /* Message */ msg("You can learn %d more %s%s.", p_ptr->new_spells, p, PLURAL(p_ptr->new_spells)); } /* Redraw Study Status */ p_ptr->redraw |= (PR_STUDY | PR_OBJECT); } /* Cas the specified spell */ bool spell_cast(int spell, int dir) { int chance; /* Get the spell */ const magic_type *s_ptr = &p_ptr->class->spells.info[spell]; /* Spell failure chance */ chance = spell_chance(spell); /* Failed spell */ if (randint0(100) < chance) { flush(); msg("You failed to concentrate hard enough!"); } /* Process spell */ else { /* Cast the spell */ if (!cast_spell(p_ptr->class->spell_book, spell, dir)) return FALSE; /* A spell was cast */ sound(MSG_SPELL); if (!(p_ptr->spell_flags[spell] & PY_SPELL_WORKED)) { int e = s_ptr->sexp; /* The spell worked */ p_ptr->spell_flags[spell] |= PY_SPELL_WORKED; /* Gain experience */ player_exp_gain(p_ptr, e * s_ptr->slevel); /* Redraw object recall */ p_ptr->redraw |= (PR_OBJECT); } } /* Sufficient mana */ if (s_ptr->smana <= p_ptr->csp) { /* Use some mana */ p_ptr->csp -= s_ptr->smana; } /* Over-exert the player */ else { int oops = s_ptr->smana - p_ptr->csp; /* No mana left */ p_ptr->csp = 0; p_ptr->csp_frac = 0; /* Message */ msg("You faint from the effort!"); /* Bypass free action */ (void)player_inc_timed(p_ptr, TMD_PARALYZED, randint1(5 * oops + 1), TRUE, FALSE); /* Damage CON (possibly permanently) */ if (randint0(100) < 50) { bool perm = (randint0(100) < 25); /* Message */ msg("You have damaged your health!"); /* Reduce constitution */ player_stat_dec(p_ptr, A_CON, perm); } } /* Redraw mana */ p_ptr->redraw |= (PR_MANA); return TRUE; } angband-3.5.1/src/player/player.c0000644000175000017500000001224412456456606016166 0ustar chriscchrisc/* player/player.c - player implementation * Copyright (c) 2011 elly+angband@leptoquark.net. See COPYING. */ #include "externs.h" /* player_exp */ #include "history.h" /* history_add */ #include "player/player.h" #include "birth.h" /* find_roman_suffix_start */ #include "z-util.h" /* my_strcpy */ void health_track(struct player *p, struct monster *m_ptr) { p->health_who = m_ptr; p->redraw |= PR_HEALTH; } /* * Hack -- track the given monster race */ void monster_race_track(monster_race *race) { /* Save this monster ID */ p_ptr->monster_race = race; /* Window stuff */ p_ptr->redraw |= (PR_MONSTER); } /* * Hack -- track the given object kind */ void track_object(int item) { p_ptr->object_idx = item; p_ptr->object_kind = NULL; p_ptr->redraw |= (PR_OBJECT); } void track_object_kind(struct object_kind *kind) { p_ptr->object_idx = NO_OBJECT; p_ptr->object_kind = kind; p_ptr->redraw |= (PR_OBJECT); } bool tracked_object_is(int item) { return (p_ptr->object_idx == item); } bool player_stat_inc(struct player *p, int stat) { int v = p->stat_cur[stat]; if (v >= 18 + 100) return FALSE; if (v < 18) { p->stat_cur[stat]++; } else if (v < 18 + 90) { int gain = (((18 + 100) - v) / 2 + 3) / 2; if (gain < 1) gain = 1; p->stat_cur[stat] += randint1(gain) + gain / 2; if (p->stat_cur[stat] > 18 + 99) p->stat_cur[stat] = 18 + 99; } else { p->stat_cur[stat] = 18 + 100; } if (p->stat_cur[stat] > p->stat_max[stat]) p->stat_max[stat] = p->stat_cur[stat]; p->update |= PU_BONUS; return TRUE; } bool player_stat_dec(struct player *p, int stat, bool permanent) { int cur, max, res = FALSE; cur = p->stat_cur[stat]; max = p->stat_max[stat]; if (cur > 18+10) cur -= 10; else if (cur > 18) cur = 18; else if (cur > 3) cur -= 1; res = (cur != p->stat_cur[stat]); if (permanent) { if (max > 18+10) max -= 10; else if (max > 18) max = 18; else if (max > 3) max -= 1; res = (max != p->stat_max[stat]); } if (res) { p->stat_cur[stat] = cur; p->stat_max[stat] = max; p->update |= (PU_BONUS); p->redraw |= (PR_STATS); } return res; } static void adjust_level(struct player *p, bool verbose) { if (p->exp < 0) p->exp = 0; if (p->max_exp < 0) p->max_exp = 0; if (p->exp > PY_MAX_EXP) p->exp = PY_MAX_EXP; if (p->max_exp > PY_MAX_EXP) p->max_exp = PY_MAX_EXP; if (p->exp > p->max_exp) p->max_exp = p->exp; p->redraw |= PR_EXP; handle_stuff(p); while ((p->lev > 1) && (p->exp < (player_exp[p->lev-2] * p->expfact / 100L))) p->lev--; while ((p->lev < PY_MAX_LEVEL) && (p->exp >= (player_exp[p->lev-1] * p->expfact / 100L))) { char buf[80]; p->lev++; /* Save the highest level */ if (p->lev > p->max_lev) p->max_lev = p->lev; if (verbose) { /* Log level updates */ strnfmt(buf, sizeof(buf), "Reached level %d", p->lev); history_add(buf, HISTORY_GAIN_LEVEL, 0); /* Message */ msgt(MSG_LEVEL, "Welcome to level %d.", p->lev); } do_res_stat(A_STR); do_res_stat(A_INT); do_res_stat(A_WIS); do_res_stat(A_DEX); do_res_stat(A_CON); } while ((p->max_lev < PY_MAX_LEVEL) && (p->max_exp >= (player_exp[p->max_lev-1] * p->expfact / 100L))) p->max_lev++; p->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); p->redraw |= (PR_LEV | PR_TITLE | PR_EXP | PR_STATS); handle_stuff(p); } void player_exp_gain(struct player *p, s32b amount) { p->exp += amount; if (p->exp < p->max_exp) p->max_exp += amount / 10; adjust_level(p, TRUE); } void player_exp_lose(struct player *p, s32b amount, bool permanent) { if (p->exp < amount) amount = p->exp; p->exp -= amount; if (permanent) p->max_exp -= amount; adjust_level(p, TRUE); } byte player_hp_attr(struct player *p) { byte attr; if (p->chp >= p->mhp) attr = TERM_L_GREEN; else if (p->chp > (p->mhp * op_ptr->hitpoint_warn) / 10) attr = TERM_YELLOW; else attr = TERM_RED; return attr; } byte player_sp_attr(struct player *p) { byte attr; if (p->csp >= p->msp) attr = TERM_L_GREEN; else if (p->csp > (p->msp * op_ptr->hitpoint_warn) / 10) attr = TERM_YELLOW; else attr = TERM_RED; return attr; } bool player_restore_mana(struct player *p, int amt) { int old_csp = p->csp; p->csp += amt; if (p->csp > p->msp) { p->csp = p->msp; } p->redraw |= PR_MANA; msg("You feel some of your energies returning."); return p->csp != old_csp; } /** * Return a version of the player's name safe for use in filesystems. */ const char *player_safe_name(struct player *p, bool strip_suffix) { static char buf[40]; int i; int limit = 0; if (op_ptr->full_name[0]) { char *suffix = find_roman_suffix_start(op_ptr->full_name); if (suffix) limit = suffix - op_ptr->full_name - 1; /* -1 for preceding space */ else limit = strlen(op_ptr->full_name); } for (i = 0; i < limit; i++) { char c = op_ptr->full_name[i]; /* Convert all non-alphanumeric symbols */ if (!isalpha((unsigned char)c) && !isdigit((unsigned char)c)) c = '_'; /* Build "base_name" */ buf[i] = c; } /* Terminate */ buf[i] = '\0'; /* Require a "base" name */ if (!buf[0]) my_strcpy(buf, "PLAYER", sizeof buf); return buf; } angband-3.5.1/src/player/calcs.c0000644000175000017500000014573012456456606015766 0ustar chriscchrisc/* * File: player/calcs.c * Purpose: Player status calculation, signalling ui events based on status * changes. * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "files.h" #include "game-event.h" #include "monster/mon-msg.h" #include "monster/mon-util.h" #include "object/tvalsval.h" #include "object/pval.h" #include "spells.h" #include "squelch.h" /* * Stat Table (INT) -- Magic devices */ const byte adj_int_dev[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 0 /* 5 */, 0 /* 6 */, 0 /* 7 */, 1 /* 8 */, 1 /* 9 */, 1 /* 10 */, 1 /* 11 */, 1 /* 12 */, 1 /* 13 */, 1 /* 14 */, 2 /* 15 */, 2 /* 16 */, 2 /* 17 */, 3 /* 18/00-18/09 */, 3 /* 18/10-18/19 */, 3 /* 18/20-18/29 */, 3 /* 18/30-18/39 */, 3 /* 18/40-18/49 */, 4 /* 18/50-18/59 */, 4 /* 18/60-18/69 */, 5 /* 18/70-18/79 */, 5 /* 18/80-18/89 */, 6 /* 18/90-18/99 */, 6 /* 18/100-18/109 */, 7 /* 18/110-18/119 */, 7 /* 18/120-18/129 */, 8 /* 18/130-18/139 */, 8 /* 18/140-18/149 */, 9 /* 18/150-18/159 */, 9 /* 18/160-18/169 */, 10 /* 18/170-18/179 */, 10 /* 18/180-18/189 */, 11 /* 18/190-18/199 */, 11 /* 18/200-18/209 */, 12 /* 18/210-18/219 */, 13 /* 18/220+ */ }; /* * Stat Table (WIS) -- Saving throw */ const byte adj_wis_sav[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 0 /* 5 */, 0 /* 6 */, 0 /* 7 */, 1 /* 8 */, 1 /* 9 */, 1 /* 10 */, 1 /* 11 */, 1 /* 12 */, 1 /* 13 */, 1 /* 14 */, 2 /* 15 */, 2 /* 16 */, 2 /* 17 */, 3 /* 18/00-18/09 */, 3 /* 18/10-18/19 */, 3 /* 18/20-18/29 */, 3 /* 18/30-18/39 */, 3 /* 18/40-18/49 */, 4 /* 18/50-18/59 */, 4 /* 18/60-18/69 */, 5 /* 18/70-18/79 */, 5 /* 18/80-18/89 */, 6 /* 18/90-18/99 */, 7 /* 18/100-18/109 */, 8 /* 18/110-18/119 */, 9 /* 18/120-18/129 */, 10 /* 18/130-18/139 */, 11 /* 18/140-18/149 */, 12 /* 18/150-18/159 */, 13 /* 18/160-18/169 */, 14 /* 18/170-18/179 */, 15 /* 18/180-18/189 */, 16 /* 18/190-18/199 */, 17 /* 18/200-18/209 */, 18 /* 18/210-18/219 */, 19 /* 18/220+ */ }; /* * Stat Table (DEX) -- disarming */ const byte adj_dex_dis[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 0 /* 5 */, 0 /* 6 */, 0 /* 7 */, 0 /* 8 */, 0 /* 9 */, 0 /* 10 */, 0 /* 11 */, 0 /* 12 */, 1 /* 13 */, 1 /* 14 */, 1 /* 15 */, 2 /* 16 */, 2 /* 17 */, 4 /* 18/00-18/09 */, 4 /* 18/10-18/19 */, 4 /* 18/20-18/29 */, 4 /* 18/30-18/39 */, 5 /* 18/40-18/49 */, 5 /* 18/50-18/59 */, 5 /* 18/60-18/69 */, 6 /* 18/70-18/79 */, 6 /* 18/80-18/89 */, 7 /* 18/90-18/99 */, 8 /* 18/100-18/109 */, 8 /* 18/110-18/119 */, 8 /* 18/120-18/129 */, 8 /* 18/130-18/139 */, 8 /* 18/140-18/149 */, 9 /* 18/150-18/159 */, 9 /* 18/160-18/169 */, 9 /* 18/170-18/179 */, 9 /* 18/180-18/189 */, 9 /* 18/190-18/199 */, 10 /* 18/200-18/209 */, 10 /* 18/210-18/219 */, 10 /* 18/220+ */ }; /* * Stat Table (INT) -- disarming */ const byte adj_int_dis[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 0 /* 5 */, 0 /* 6 */, 0 /* 7 */, 1 /* 8 */, 1 /* 9 */, 1 /* 10 */, 1 /* 11 */, 1 /* 12 */, 1 /* 13 */, 1 /* 14 */, 2 /* 15 */, 2 /* 16 */, 2 /* 17 */, 3 /* 18/00-18/09 */, 3 /* 18/10-18/19 */, 3 /* 18/20-18/29 */, 4 /* 18/30-18/39 */, 4 /* 18/40-18/49 */, 5 /* 18/50-18/59 */, 6 /* 18/60-18/69 */, 7 /* 18/70-18/79 */, 8 /* 18/80-18/89 */, 9 /* 18/90-18/99 */, 10 /* 18/100-18/109 */, 10 /* 18/110-18/119 */, 11 /* 18/120-18/129 */, 12 /* 18/130-18/139 */, 13 /* 18/140-18/149 */, 14 /* 18/150-18/159 */, 15 /* 18/160-18/169 */, 16 /* 18/170-18/179 */, 17 /* 18/180-18/189 */, 18 /* 18/190-18/199 */, 19 /* 18/200-18/209 */, 19 /* 18/210-18/219 */, 19 /* 18/220+ */ }; /* * Stat Table (DEX) -- bonus to ac (plus 128) */ const byte adj_dex_ta[STAT_RANGE] = { 128 + -4 /* 3 */, 128 + -3 /* 4 */, 128 + -2 /* 5 */, 128 + -1 /* 6 */, 128 + 0 /* 7 */, 128 + 0 /* 8 */, 128 + 0 /* 9 */, 128 + 0 /* 10 */, 128 + 0 /* 11 */, 128 + 0 /* 12 */, 128 + 0 /* 13 */, 128 + 0 /* 14 */, 128 + 1 /* 15 */, 128 + 1 /* 16 */, 128 + 1 /* 17 */, 128 + 2 /* 18/00-18/09 */, 128 + 2 /* 18/10-18/19 */, 128 + 2 /* 18/20-18/29 */, 128 + 2 /* 18/30-18/39 */, 128 + 2 /* 18/40-18/49 */, 128 + 3 /* 18/50-18/59 */, 128 + 3 /* 18/60-18/69 */, 128 + 3 /* 18/70-18/79 */, 128 + 4 /* 18/80-18/89 */, 128 + 5 /* 18/90-18/99 */, 128 + 6 /* 18/100-18/109 */, 128 + 7 /* 18/110-18/119 */, 128 + 8 /* 18/120-18/129 */, 128 + 9 /* 18/130-18/139 */, 128 + 9 /* 18/140-18/149 */, 128 + 10 /* 18/150-18/159 */, 128 + 11 /* 18/160-18/169 */, 128 + 12 /* 18/170-18/179 */, 128 + 13 /* 18/180-18/189 */, 128 + 14 /* 18/190-18/199 */, 128 + 15 /* 18/200-18/209 */, 128 + 15 /* 18/210-18/219 */, 128 + 15 /* 18/220+ */ }; /* * Stat Table (STR) -- bonus to dam (plus 128) */ const byte adj_str_td[STAT_RANGE] = { 128 + -2 /* 3 */, 128 + -2 /* 4 */, 128 + -1 /* 5 */, 128 + -1 /* 6 */, 128 + 0 /* 7 */, 128 + 0 /* 8 */, 128 + 0 /* 9 */, 128 + 0 /* 10 */, 128 + 0 /* 11 */, 128 + 0 /* 12 */, 128 + 0 /* 13 */, 128 + 0 /* 14 */, 128 + 0 /* 15 */, 128 + 1 /* 16 */, 128 + 2 /* 17 */, 128 + 2 /* 18/00-18/09 */, 128 + 2 /* 18/10-18/19 */, 128 + 3 /* 18/20-18/29 */, 128 + 3 /* 18/30-18/39 */, 128 + 3 /* 18/40-18/49 */, 128 + 3 /* 18/50-18/59 */, 128 + 3 /* 18/60-18/69 */, 128 + 4 /* 18/70-18/79 */, 128 + 5 /* 18/80-18/89 */, 128 + 5 /* 18/90-18/99 */, 128 + 6 /* 18/100-18/109 */, 128 + 7 /* 18/110-18/119 */, 128 + 8 /* 18/120-18/129 */, 128 + 9 /* 18/130-18/139 */, 128 + 10 /* 18/140-18/149 */, 128 + 11 /* 18/150-18/159 */, 128 + 12 /* 18/160-18/169 */, 128 + 13 /* 18/170-18/179 */, 128 + 14 /* 18/180-18/189 */, 128 + 15 /* 18/190-18/199 */, 128 + 16 /* 18/200-18/209 */, 128 + 18 /* 18/210-18/219 */, 128 + 20 /* 18/220+ */ }; /* * Stat Table (DEX) -- bonus to hit (plus 128) */ const byte adj_dex_th[STAT_RANGE] = { 128 + -3 /* 3 */, 128 + -2 /* 4 */, 128 + -2 /* 5 */, 128 + -1 /* 6 */, 128 + -1 /* 7 */, 128 + 0 /* 8 */, 128 + 0 /* 9 */, 128 + 0 /* 10 */, 128 + 0 /* 11 */, 128 + 0 /* 12 */, 128 + 0 /* 13 */, 128 + 0 /* 14 */, 128 + 0 /* 15 */, 128 + 1 /* 16 */, 128 + 2 /* 17 */, 128 + 3 /* 18/00-18/09 */, 128 + 3 /* 18/10-18/19 */, 128 + 3 /* 18/20-18/29 */, 128 + 3 /* 18/30-18/39 */, 128 + 3 /* 18/40-18/49 */, 128 + 4 /* 18/50-18/59 */, 128 + 4 /* 18/60-18/69 */, 128 + 4 /* 18/70-18/79 */, 128 + 4 /* 18/80-18/89 */, 128 + 5 /* 18/90-18/99 */, 128 + 6 /* 18/100-18/109 */, 128 + 7 /* 18/110-18/119 */, 128 + 8 /* 18/120-18/129 */, 128 + 9 /* 18/130-18/139 */, 128 + 9 /* 18/140-18/149 */, 128 + 10 /* 18/150-18/159 */, 128 + 11 /* 18/160-18/169 */, 128 + 12 /* 18/170-18/179 */, 128 + 13 /* 18/180-18/189 */, 128 + 14 /* 18/190-18/199 */, 128 + 15 /* 18/200-18/209 */, 128 + 15 /* 18/210-18/219 */, 128 + 15 /* 18/220+ */ }; /* * Stat Table (STR) -- bonus to hit (plus 128) */ const byte adj_str_th[STAT_RANGE] = { 128 + -3 /* 3 */, 128 + -2 /* 4 */, 128 + -1 /* 5 */, 128 + -1 /* 6 */, 128 + 0 /* 7 */, 128 + 0 /* 8 */, 128 + 0 /* 9 */, 128 + 0 /* 10 */, 128 + 0 /* 11 */, 128 + 0 /* 12 */, 128 + 0 /* 13 */, 128 + 0 /* 14 */, 128 + 0 /* 15 */, 128 + 0 /* 16 */, 128 + 0 /* 17 */, 128 + 1 /* 18/00-18/09 */, 128 + 1 /* 18/10-18/19 */, 128 + 1 /* 18/20-18/29 */, 128 + 1 /* 18/30-18/39 */, 128 + 1 /* 18/40-18/49 */, 128 + 1 /* 18/50-18/59 */, 128 + 1 /* 18/60-18/69 */, 128 + 2 /* 18/70-18/79 */, 128 + 3 /* 18/80-18/89 */, 128 + 4 /* 18/90-18/99 */, 128 + 5 /* 18/100-18/109 */, 128 + 6 /* 18/110-18/119 */, 128 + 7 /* 18/120-18/129 */, 128 + 8 /* 18/130-18/139 */, 128 + 9 /* 18/140-18/149 */, 128 + 10 /* 18/150-18/159 */, 128 + 11 /* 18/160-18/169 */, 128 + 12 /* 18/170-18/179 */, 128 + 13 /* 18/180-18/189 */, 128 + 14 /* 18/190-18/199 */, 128 + 15 /* 18/200-18/209 */, 128 + 15 /* 18/210-18/219 */, 128 + 15 /* 18/220+ */ }; /* * Stat Table (STR) -- weight limit in deca-pounds */ const byte adj_str_wgt[STAT_RANGE] = { 5 /* 3 */, 6 /* 4 */, 7 /* 5 */, 8 /* 6 */, 9 /* 7 */, 10 /* 8 */, 11 /* 9 */, 12 /* 10 */, 13 /* 11 */, 14 /* 12 */, 15 /* 13 */, 16 /* 14 */, 17 /* 15 */, 18 /* 16 */, 19 /* 17 */, 20 /* 18/00-18/09 */, 22 /* 18/10-18/19 */, 24 /* 18/20-18/29 */, 26 /* 18/30-18/39 */, 28 /* 18/40-18/49 */, 30 /* 18/50-18/59 */, 30 /* 18/60-18/69 */, 30 /* 18/70-18/79 */, 30 /* 18/80-18/89 */, 30 /* 18/90-18/99 */, 30 /* 18/100-18/109 */, 30 /* 18/110-18/119 */, 30 /* 18/120-18/129 */, 30 /* 18/130-18/139 */, 30 /* 18/140-18/149 */, 30 /* 18/150-18/159 */, 30 /* 18/160-18/169 */, 30 /* 18/170-18/179 */, 30 /* 18/180-18/189 */, 30 /* 18/190-18/199 */, 30 /* 18/200-18/209 */, 30 /* 18/210-18/219 */, 30 /* 18/220+ */ }; /* * Stat Table (STR) -- weapon weight limit in pounds */ const byte adj_str_hold[STAT_RANGE] = { 4 /* 3 */, 5 /* 4 */, 6 /* 5 */, 7 /* 6 */, 8 /* 7 */, 10 /* 8 */, 12 /* 9 */, 14 /* 10 */, 16 /* 11 */, 18 /* 12 */, 20 /* 13 */, 22 /* 14 */, 24 /* 15 */, 26 /* 16 */, 28 /* 17 */, 30 /* 18/00-18/09 */, 30 /* 18/10-18/19 */, 35 /* 18/20-18/29 */, 40 /* 18/30-18/39 */, 45 /* 18/40-18/49 */, 50 /* 18/50-18/59 */, 55 /* 18/60-18/69 */, 60 /* 18/70-18/79 */, 65 /* 18/80-18/89 */, 70 /* 18/90-18/99 */, 80 /* 18/100-18/109 */, 80 /* 18/110-18/119 */, 80 /* 18/120-18/129 */, 80 /* 18/130-18/139 */, 80 /* 18/140-18/149 */, 90 /* 18/150-18/159 */, 90 /* 18/160-18/169 */, 90 /* 18/170-18/179 */, 90 /* 18/180-18/189 */, 90 /* 18/190-18/199 */, 100 /* 18/200-18/209 */, 100 /* 18/210-18/219 */, 100 /* 18/220+ */ }; /* * Stat Table (STR) -- digging value */ const byte adj_str_dig[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 1 /* 5 */, 2 /* 6 */, 3 /* 7 */, 4 /* 8 */, 4 /* 9 */, 5 /* 10 */, 5 /* 11 */, 6 /* 12 */, 6 /* 13 */, 7 /* 14 */, 7 /* 15 */, 8 /* 16 */, 8 /* 17 */, 9 /* 18/00-18/09 */, 10 /* 18/10-18/19 */, 12 /* 18/20-18/29 */, 15 /* 18/30-18/39 */, 20 /* 18/40-18/49 */, 25 /* 18/50-18/59 */, 30 /* 18/60-18/69 */, 35 /* 18/70-18/79 */, 40 /* 18/80-18/89 */, 45 /* 18/90-18/99 */, 50 /* 18/100-18/109 */, 55 /* 18/110-18/119 */, 60 /* 18/120-18/129 */, 65 /* 18/130-18/139 */, 70 /* 18/140-18/149 */, 75 /* 18/150-18/159 */, 80 /* 18/160-18/169 */, 85 /* 18/170-18/179 */, 90 /* 18/180-18/189 */, 95 /* 18/190-18/199 */, 100 /* 18/200-18/209 */, 100 /* 18/210-18/219 */, 100 /* 18/220+ */ }; /* * Stat Table (STR) -- help index into the "blow" table */ const byte adj_str_blow[STAT_RANGE] = { 3 /* 3 */, 4 /* 4 */, 5 /* 5 */, 6 /* 6 */, 7 /* 7 */, 8 /* 8 */, 9 /* 9 */, 10 /* 10 */, 11 /* 11 */, 12 /* 12 */, 13 /* 13 */, 14 /* 14 */, 15 /* 15 */, 16 /* 16 */, 17 /* 17 */, 20 /* 18/00-18/09 */, 30 /* 18/10-18/19 */, 40 /* 18/20-18/29 */, 50 /* 18/30-18/39 */, 60 /* 18/40-18/49 */, 70 /* 18/50-18/59 */, 80 /* 18/60-18/69 */, 90 /* 18/70-18/79 */, 100 /* 18/80-18/89 */, 110 /* 18/90-18/99 */, 120 /* 18/100-18/109 */, 130 /* 18/110-18/119 */, 140 /* 18/120-18/129 */, 150 /* 18/130-18/139 */, 160 /* 18/140-18/149 */, 170 /* 18/150-18/159 */, 180 /* 18/160-18/169 */, 190 /* 18/170-18/179 */, 200 /* 18/180-18/189 */, 210 /* 18/190-18/199 */, 220 /* 18/200-18/209 */, 230 /* 18/210-18/219 */, 240 /* 18/220+ */ }; /* * Stat Table (DEX) -- index into the "blow" table */ const byte adj_dex_blow[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 0 /* 5 */, 0 /* 6 */, 0 /* 7 */, 0 /* 8 */, 0 /* 9 */, 1 /* 10 */, 1 /* 11 */, 1 /* 12 */, 1 /* 13 */, 1 /* 14 */, 1 /* 15 */, 1 /* 16 */, 2 /* 17 */, 2 /* 18/00-18/09 */, 2 /* 18/10-18/19 */, 3 /* 18/20-18/29 */, 3 /* 18/30-18/39 */, 4 /* 18/40-18/49 */, 4 /* 18/50-18/59 */, 5 /* 18/60-18/69 */, 5 /* 18/70-18/79 */, 6 /* 18/80-18/89 */, 6 /* 18/90-18/99 */, 7 /* 18/100-18/109 */, 7 /* 18/110-18/119 */, 8 /* 18/120-18/129 */, 8 /* 18/130-18/139 */, 8 /* 18/140-18/149 */, 9 /* 18/150-18/159 */, 9 /* 18/160-18/169 */, 9 /* 18/170-18/179 */, 10 /* 18/180-18/189 */, 10 /* 18/190-18/199 */, 11 /* 18/200-18/209 */, 11 /* 18/210-18/219 */, 11 /* 18/220+ */ }; /* * Stat Table (DEX) -- chance of avoiding "theft" and "falling" */ const byte adj_dex_safe[STAT_RANGE] = { 0 /* 3 */, 1 /* 4 */, 2 /* 5 */, 3 /* 6 */, 4 /* 7 */, 5 /* 8 */, 5 /* 9 */, 6 /* 10 */, 6 /* 11 */, 7 /* 12 */, 7 /* 13 */, 8 /* 14 */, 8 /* 15 */, 9 /* 16 */, 9 /* 17 */, 10 /* 18/00-18/09 */, 10 /* 18/10-18/19 */, 15 /* 18/20-18/29 */, 15 /* 18/30-18/39 */, 20 /* 18/40-18/49 */, 25 /* 18/50-18/59 */, 30 /* 18/60-18/69 */, 35 /* 18/70-18/79 */, 40 /* 18/80-18/89 */, 45 /* 18/90-18/99 */, 50 /* 18/100-18/109 */, 60 /* 18/110-18/119 */, 70 /* 18/120-18/129 */, 80 /* 18/130-18/139 */, 90 /* 18/140-18/149 */, 100 /* 18/150-18/159 */, 100 /* 18/160-18/169 */, 100 /* 18/170-18/179 */, 100 /* 18/180-18/189 */, 100 /* 18/190-18/199 */, 100 /* 18/200-18/209 */, 100 /* 18/210-18/219 */, 100 /* 18/220+ */ }; /* * Stat Table (CON) -- base regeneration rate */ const byte adj_con_fix[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 0 /* 5 */, 0 /* 6 */, 0 /* 7 */, 0 /* 8 */, 0 /* 9 */, 0 /* 10 */, 0 /* 11 */, 0 /* 12 */, 0 /* 13 */, 1 /* 14 */, 1 /* 15 */, 1 /* 16 */, 1 /* 17 */, 2 /* 18/00-18/09 */, 2 /* 18/10-18/19 */, 2 /* 18/20-18/29 */, 2 /* 18/30-18/39 */, 2 /* 18/40-18/49 */, 3 /* 18/50-18/59 */, 3 /* 18/60-18/69 */, 3 /* 18/70-18/79 */, 3 /* 18/80-18/89 */, 3 /* 18/90-18/99 */, 4 /* 18/100-18/109 */, 4 /* 18/110-18/119 */, 5 /* 18/120-18/129 */, 6 /* 18/130-18/139 */, 6 /* 18/140-18/149 */, 7 /* 18/150-18/159 */, 7 /* 18/160-18/169 */, 8 /* 18/170-18/179 */, 8 /* 18/180-18/189 */, 8 /* 18/190-18/199 */, 9 /* 18/200-18/209 */, 9 /* 18/210-18/219 */, 9 /* 18/220+ */ }; /* * Stat Table (CON) -- extra 1/100th hitpoints per level */ const int adj_con_mhp[STAT_RANGE] = { -250 /* 3 */, -150 /* 4 */, -100 /* 5 */, -75 /* 6 */, -50 /* 7 */, -25 /* 8 */, -10 /* 9 */, -5 /* 10 */, 0 /* 11 */, 5 /* 12 */, 10 /* 13 */, 25 /* 14 */, 50 /* 15 */, 75 /* 16 */, 100 /* 17 */, 150 /* 18/00-18/09 */, 175 /* 18/10-18/19 */, 200 /* 18/20-18/29 */, 225 /* 18/30-18/39 */, 250 /* 18/40-18/49 */, 275 /* 18/50-18/59 */, 300 /* 18/60-18/69 */, 350 /* 18/70-18/79 */, 400 /* 18/80-18/89 */, 450 /* 18/90-18/99 */, 500 /* 18/100-18/109 */, 550 /* 18/110-18/119 */, 600 /* 18/120-18/129 */, 650 /* 18/130-18/139 */, 700 /* 18/140-18/149 */, 750 /* 18/150-18/159 */, 800 /* 18/160-18/169 */, 900 /* 18/170-18/179 */, 1000 /* 18/180-18/189 */, 1100 /* 18/190-18/199 */, 1250 /* 18/200-18/209 */, 1250 /* 18/210-18/219 */, 1250 /* 18/220+ */ }; const int adj_mag_study[STAT_RANGE] = { 0 /* 3 */, 0 /* 4 */, 10 /* 5 */, 20 /* 6 */, 30 /* 7 */, 40 /* 8 */, 50 /* 9 */, 60 /* 10 */, 70 /* 11 */, 80 /* 12 */, 85 /* 13 */, 90 /* 14 */, 95 /* 15 */, 100 /* 16 */, 105 /* 17 */, 110 /* 18/00-18/09 */, 115 /* 18/10-18/19 */, 120 /* 18/20-18/29 */, 130 /* 18/30-18/39 */, 140 /* 18/40-18/49 */, 150 /* 18/50-18/59 */, 160 /* 18/60-18/69 */, 170 /* 18/70-18/79 */, 180 /* 18/80-18/89 */, 190 /* 18/90-18/99 */, 200 /* 18/100-18/109 */, 210 /* 18/110-18/119 */, 220 /* 18/120-18/129 */, 230 /* 18/130-18/139 */, 240 /* 18/140-18/149 */, 250 /* 18/150-18/159 */, 250 /* 18/160-18/169 */, 250 /* 18/170-18/179 */, 250 /* 18/180-18/189 */, 250 /* 18/190-18/199 */, 250 /* 18/200-18/209 */, 250 /* 18/210-18/219 */, 250 /* 18/220+ */ }; /* * Stat Table (INT/WIS) -- extra 1/100 mana-points per level */ const int adj_mag_mana[STAT_RANGE] = { 0 /* 3 */, 10 /* 4 */, 20 /* 5 */, 30 /* 6 */, 40 /* 7 */, 50 /* 8 */, 60 /* 9 */, 70 /* 10 */, 80 /* 11 */, 90 /* 12 */, 100 /* 13 */, 110 /* 14 */, 120 /* 15 */, 130 /* 16 */, 140 /* 17 */, 150 /* 18/00-18/09 */, 160 /* 18/10-18/19 */, 170 /* 18/20-18/29 */, 180 /* 18/30-18/39 */, 190 /* 18/40-18/49 */, 200 /* 18/50-18/59 */, 225 /* 18/60-18/69 */, 250 /* 18/70-18/79 */, 300 /* 18/80-18/89 */, 350 /* 18/90-18/99 */, 400 /* 18/100-18/109 */, 450 /* 18/110-18/119 */, 500 /* 18/120-18/129 */, 550 /* 18/130-18/139 */, 600 /* 18/140-18/149 */, 650 /* 18/150-18/159 */, 700 /* 18/160-18/169 */, 750 /* 18/170-18/179 */, 800 /* 18/180-18/189 */, 800 /* 18/190-18/199 */, 800 /* 18/200-18/209 */, 800 /* 18/210-18/219 */, 800 /* 18/220+ */ }; /* * This table is used to help calculate the number of blows the player can * make in a single round of attacks (one player turn) with a normal weapon. * * This number ranges from a single blow/round for weak players to up to six * blows/round for powerful warriors. * * Note that certain artifacts and ego-items give "bonus" blows/round. * * First, from the player class, we extract some values: * * Warrior --> num = 6; mul = 5; div = MAX(30, weapon_weight); * Mage --> num = 4; mul = 2; div = MAX(40, weapon_weight); * Priest --> num = 4; mul = 3; div = MAX(35, weapon_weight); * Rogue --> num = 5; mul = 4; div = MAX(30, weapon_weight); * Ranger --> num = 5; mul = 4; div = MAX(35, weapon_weight); * Paladin --> num = 5; mul = 5; div = MAX(30, weapon_weight); * (all specified in p_class.txt now) * * To get "P", we look up the relevant "adj_str_blow[]" (see above), * multiply it by "mul", and then divide it by "div", rounding down. * * To get "D", we look up the relevant "adj_dex_blow[]" (see above). * * Then we look up the energy cost of each blow using "blows_table[P][D]". * The player gets blows/round equal to 100/this number, up to a maximum of * "num" blows/round, plus any "bonus" blows/round. */ const byte blows_table[12][12] = { /* P */ /* D: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11+ */ /* DEX: 3, 10, 17, /20, /40, /60, /80, /100,/120,/150,/180,/200 */ /* 0 */ { 100, 100, 95, 85, 75, 60, 50, 42, 35, 30, 25, 23 }, /* 1 */ { 100, 95, 85, 75, 60, 50, 42, 35, 30, 25, 23, 21 }, /* 2 */ { 95, 85, 75, 60, 50, 42, 35, 30, 26, 23, 21, 20 }, /* 3 */ { 85, 75, 60, 50, 42, 36, 32, 28, 25, 22, 20, 19 }, /* 4 */ { 75, 60, 50, 42, 36, 33, 28, 25, 23, 21, 19, 18 }, /* 5 */ { 60, 50, 42, 36, 33, 30, 27, 24, 22, 21, 19, 17 }, /* 6 */ { 50, 42, 36, 33, 30, 27, 25, 23, 21, 20, 18, 17 }, /* 7 */ { 42, 36, 33, 30, 28, 26, 24, 22, 20, 19, 18, 17 }, /* 8 */ { 36, 33, 30, 28, 26, 24, 22, 21, 20, 19, 17, 16 }, /* 9 */ { 35, 32, 29, 26, 24, 22, 21, 20, 19, 18, 17, 16 }, /* 10 */ { 34, 30, 27, 25, 23, 22, 21, 20, 19, 18, 17, 16 }, /* 11+ */ { 33, 29, 26, 24, 22, 21, 20, 19, 18, 17, 16, 15 }, /* DEX: 3, 10, 17, /20, /40, /60, /80, /100,/120,/150,/180,/200 */ }; /* * Calculate number of spells player should have, and forget, * or remember, spells until that number is properly reflected. * * Note that this function induces various "status" messages, * which must be bypasses until the character is created. */ static void calc_spells(void) { int i, j, k, levels; int num_allowed, num_known; int percent_spells; const magic_type *s_ptr; s16b old_spells; const char *p = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer"); /* Hack -- must be literate */ if (!p_ptr->class->spell_book) return; /* Hack -- wait for creation */ if (!character_generated) return; /* Hack -- handle "xtra" mode */ if (character_xtra) return; /* Save the new_spells value */ old_spells = p_ptr->new_spells; /* Determine the number of spells allowed */ levels = p_ptr->lev - p_ptr->class->spell_first + 1; /* Hack -- no negative spells */ if (levels < 0) levels = 0; /* Number of 1/100 spells per level */ percent_spells = adj_mag_study[p_ptr->state.stat_ind[p_ptr->class->spell_stat]]; /* Extract total allowed spells (rounded up) */ num_allowed = (((percent_spells * levels) + 50) / 100); /* Assume none known */ num_known = 0; /* Count the number of spells we know */ for (j = 0; j < PY_MAX_SPELLS; j++) { /* Count known spells */ if (p_ptr->spell_flags[j] & PY_SPELL_LEARNED) { num_known++; } } /* See how many spells we must forget or may learn */ p_ptr->new_spells = num_allowed - num_known; /* Forget spells which are too hard */ for (i = PY_MAX_SPELLS - 1; i >= 0; i--) { /* Get the spell */ j = p_ptr->spell_order[i]; /* Skip non-spells */ if (j >= 99) continue; /* Get the spell */ s_ptr = &p_ptr->class->spells.info[j]; /* Skip spells we are allowed to know */ if (s_ptr->slevel <= p_ptr->lev) continue; /* Is it known? */ if (p_ptr->spell_flags[j] & PY_SPELL_LEARNED) { /* Mark as forgotten */ p_ptr->spell_flags[j] |= PY_SPELL_FORGOTTEN; /* No longer known */ p_ptr->spell_flags[j] &= ~PY_SPELL_LEARNED; /* Message */ msg("You have forgotten the %s of %s.", p, get_spell_name(p_ptr->class->spell_book, j)); /* One more can be learned */ p_ptr->new_spells++; } } /* Forget spells if we know too many spells */ for (i = PY_MAX_SPELLS - 1; i >= 0; i--) { /* Stop when possible */ if (p_ptr->new_spells >= 0) break; /* Get the (i+1)th spell learned */ j = p_ptr->spell_order[i]; /* Skip unknown spells */ if (j >= 99) continue; /* Forget it (if learned) */ if (p_ptr->spell_flags[j] & PY_SPELL_LEARNED) { /* Mark as forgotten */ p_ptr->spell_flags[j] |= PY_SPELL_FORGOTTEN; /* No longer known */ p_ptr->spell_flags[j] &= ~PY_SPELL_LEARNED; /* Message */ msg("You have forgotten the %s of %s.", p, get_spell_name(p_ptr->class->spell_book, j)); /* One more can be learned */ p_ptr->new_spells++; } } /* Check for spells to remember */ for (i = 0; i < PY_MAX_SPELLS; i++) { /* None left to remember */ if (p_ptr->new_spells <= 0) break; /* Get the next spell we learned */ j = p_ptr->spell_order[i]; /* Skip unknown spells */ if (j >= 99) break; /* Get the spell */ s_ptr = &p_ptr->class->spells.info[j]; /* Skip spells we cannot remember */ if (s_ptr->slevel > p_ptr->lev) continue; /* First set of spells */ if (p_ptr->spell_flags[j] & PY_SPELL_FORGOTTEN) { /* No longer forgotten */ p_ptr->spell_flags[j] &= ~PY_SPELL_FORGOTTEN; /* Known once more */ p_ptr->spell_flags[j] |= PY_SPELL_LEARNED; /* Message */ msg("You have remembered the %s of %s.", p, get_spell_name(p_ptr->class->spell_book, j)); /* One less can be learned */ p_ptr->new_spells--; } } /* Assume no spells available */ k = 0; /* Count spells that can be learned */ for (j = 0; j < PY_MAX_SPELLS; j++) { /* Get the spell */ s_ptr = &p_ptr->class->spells.info[j]; /* Skip spells we cannot remember or don't exist */ if (s_ptr->slevel > p_ptr->lev || s_ptr->slevel == 0) continue; /* Skip spells we already know */ if (p_ptr->spell_flags[j] & PY_SPELL_LEARNED) { continue; } /* Count it */ k++; } /* Cannot learn more spells than exist */ if (p_ptr->new_spells > k) p_ptr->new_spells = k; /* Spell count changed */ if (old_spells != p_ptr->new_spells) { /* Message if needed */ if (p_ptr->new_spells) { /* Message */ msg("You can learn %d more %s%s.", p_ptr->new_spells, p, (p_ptr->new_spells != 1) ? "s" : ""); } /* Redraw Study Status */ p_ptr->redraw |= (PR_STUDY | PR_OBJECT); } } /* * Calculate maximum mana. You do not need to know any spells. * Note that mana is lowered by heavy (or inappropriate) armor. * * This function induces status messages. */ static void calc_mana(void) { int msp, levels, cur_wgt, max_wgt; object_type *o_ptr; bool old_cumber_glove = p_ptr->cumber_glove; bool old_cumber_armor = p_ptr->cumber_armor; /* Hack -- Must be literate */ if (!p_ptr->class->spell_book) { p_ptr->msp = 0; p_ptr->csp = 0; p_ptr->csp_frac = 0; return; } /* Extract "effective" player level */ levels = (p_ptr->lev - p_ptr->class->spell_first) + 1; if (levels > 0) { msp = 1; msp += adj_mag_mana[p_ptr->state.stat_ind[p_ptr->class->spell_stat]] * levels / 100; } else { levels = 0; msp = 0; } /* Process gloves for those disturbed by them */ if (player_has(PF_CUMBER_GLOVE)) { bitflag f[OF_SIZE]; /* Assume player is not encumbered by gloves */ p_ptr->cumber_glove = FALSE; /* Get the gloves */ o_ptr = &p_ptr->inventory[INVEN_HANDS]; /* Examine the gloves */ object_flags(o_ptr, f); /* Normal gloves hurt mage-type spells */ if (o_ptr->kind && !of_has(f, OF_FREE_ACT) && !of_has(f, OF_SPELLS_OK) && !(of_has(f, OF_DEX) && (o_ptr->pval[which_pval(o_ptr, OF_DEX)] > 0))) { /* Encumbered */ p_ptr->cumber_glove = TRUE; /* Reduce mana */ msp = (3 * msp) / 4; } } /* Assume player not encumbered by armor */ p_ptr->cumber_armor = FALSE; /* Weigh the armor */ cur_wgt = 0; cur_wgt += p_ptr->inventory[INVEN_BODY].weight; cur_wgt += p_ptr->inventory[INVEN_HEAD].weight; cur_wgt += p_ptr->inventory[INVEN_ARM].weight; cur_wgt += p_ptr->inventory[INVEN_OUTER].weight; cur_wgt += p_ptr->inventory[INVEN_HANDS].weight; cur_wgt += p_ptr->inventory[INVEN_FEET].weight; /* Determine the weight allowance */ max_wgt = p_ptr->class->spell_weight; /* Heavy armor penalizes mana */ if (((cur_wgt - max_wgt) / 10) > 0) { /* Encumbered */ p_ptr->cumber_armor = TRUE; /* Reduce mana */ msp -= ((cur_wgt - max_wgt) / 10); } /* Mana can never be negative */ if (msp < 0) msp = 0; /* Maximum mana has changed */ if (p_ptr->msp != msp) { /* Save new limit */ p_ptr->msp = msp; /* Enforce new limit */ if (p_ptr->csp >= msp) { p_ptr->csp = msp; p_ptr->csp_frac = 0; } /* Display mana later */ p_ptr->redraw |= (PR_MANA); } /* Hack -- handle "xtra" mode */ if (character_xtra) return; /* Take note when "glove state" changes */ if (old_cumber_glove != p_ptr->cumber_glove) { /* Message */ if (p_ptr->cumber_glove) { msg("Your covered hands feel unsuitable for spellcasting."); } else { msg("Your hands feel more suitable for spellcasting."); } } /* Take note when "armor state" changes */ if (old_cumber_armor != p_ptr->cumber_armor) { /* Message */ if (p_ptr->cumber_armor) { msg("The weight of your armor encumbers your movement."); } else { msg("You feel able to move more freely."); } } } /* * Calculate the players (maximal) hit points * * Adjust current hitpoints if necessary */ static void calc_hitpoints(void) { long bonus; int mhp; /* Get "1/100th hitpoint bonus per level" value */ bonus = adj_con_mhp[p_ptr->state.stat_ind[A_CON]]; /* Calculate hitpoints */ mhp = p_ptr->player_hp[p_ptr->lev-1] + (bonus * p_ptr->lev / 100); /* Always have at least one hitpoint per level */ if (mhp < p_ptr->lev + 1) mhp = p_ptr->lev + 1; /* New maximum hitpoints */ if (p_ptr->mhp != mhp) { /* Save new limit */ p_ptr->mhp = mhp; /* Enforce new limit */ if (p_ptr->chp >= mhp) { p_ptr->chp = mhp; p_ptr->chp_frac = 0; } /* Display hitpoints (later) */ p_ptr->redraw |= (PR_HP); } } /* * Calculate and set the current light radius. * * The brightest wielded object counts as the light source; radii do not add * up anymore. * * Note that a cursed light source no longer emits light. */ static void calc_torch(void) { int i; s16b old_light = p_ptr->cur_light; s16b new_light = 0; /* Ascertain lightness if in the town */ if (!p_ptr->depth && ((turn % (10L * TOWN_DAWN)) < ((10L * TOWN_DAWN) / 2))) { new_light = 0; if (old_light != new_light) { /* Update the visuals */ p_ptr->cur_light = new_light; p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); } return; } /* Examine all wielded objects, use the brightest */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { bitflag f[OF_SIZE]; int amt = 0; object_type *o_ptr = &p_ptr->inventory[i]; /* Skip empty slots */ if (!o_ptr->kind) continue; /* Extract the flags */ object_flags(o_ptr, f); /* Light radius is now a pval */ if (of_has(f, OF_LIGHT)) amt = o_ptr->pval[which_pval(o_ptr, OF_LIGHT)]; /* Cursed objects emit no light */ if (of_has(f, OF_LIGHT_CURSE)) amt = 0; /* Examine actual lights */ if (o_ptr->tval == TV_LIGHT && !of_has(o_ptr->flags, OF_NO_FUEL) && o_ptr->timeout == 0) /* Lights without fuel provide no light */ amt = 0; /* Alter p_ptr->cur_light if reasonable */ new_light += amt; } /* Limit light */ new_light = MIN(new_light, 5); new_light = MAX(new_light, 0); /* Notice changes in the "light radius" */ if (old_light != new_light) { /* Update the visuals */ p_ptr->cur_light = new_light; p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); } } /* * Calculate the blows a player would get. * * \param o_ptr is the object for which we are calculating blows * \param state is the player state for which we are calculating blows * \param extra_blows is the number of +blows available from this object and * this state * * N.B. state->num_blows is now 100x the number of blows. */ int calc_blows(const object_type *o_ptr, player_state *state, int extra_blows) { int blows; int str_index, dex_index; int div; int blow_energy; /* Enforce a minimum "weight" (tenth pounds) */ div = ((o_ptr->weight < p_ptr->class->min_weight) ? p_ptr->class->min_weight : o_ptr->weight); /* Get the strength vs weight */ str_index = adj_str_blow[state->stat_ind[A_STR]] * p_ptr->class->att_multiply / div; /* Maximal value */ if (str_index > 11) str_index = 11; /* Index by dexterity */ dex_index = MIN(adj_dex_blow[state->stat_ind[A_DEX]], 11); /* Use the blows table to get energy per blow */ blow_energy = blows_table[str_index][dex_index]; blows = MIN((10000 / blow_energy), (100 * p_ptr->class->max_attacks)); /* Require at least one blow */ return MAX(blows + (100 * extra_blows), 100); } /* * Computes current weight limit. */ static int weight_limit(player_state *state) { int i; /* Weight limit based only on strength */ i = adj_str_wgt[state->stat_ind[A_STR]] * 100; /* Return the result */ return (i); } /* * Computes weight remaining before burdened. */ int weight_remaining(void) { int i; /* Weight limit based only on strength */ i = 60 * adj_str_wgt[p_ptr->state.stat_ind[A_STR]] - p_ptr->total_weight - 1; /* Return the result */ return (i); } /* * Calculate the players current "state", taking into account * not only race/class intrinsics, but also objects being worn * and temporary spell effects. * * See also calc_mana() and calc_hitpoints(). * * Take note of the new "speed code", in particular, a very strong * player will start slowing down as soon as he reaches 150 pounds, * but not until he reaches 450 pounds will he be half as fast as * a normal kobold. This both hurts and helps the player, hurts * because in the old days a player could just avoid 300 pounds, * and helps because now carrying 300 pounds is not very painful. * * The "weapon" and "bow" do *not* add to the bonuses to hit or to * damage, since that would affect non-combat things. These values * are actually added in later, at the appropriate place. * * If id_only is true, calc_bonuses() will only use the known * information of objects; thus it returns what the player _knows_ * the character state to be. */ void calc_bonuses(object_type inventory[], player_state *state, bool id_only) { int i, j, hold; int extra_blows = 0; int extra_shots = 0; int extra_might = 0; object_type *o_ptr; bitflag f[OF_SIZE]; bitflag collect_f[OF_SIZE]; /*** Reset ***/ memset(state, 0, sizeof *state); /* Set various defaults */ state->speed = 110; state->num_blows = 100; /*** Extract race/class info ***/ /* Base infravision (purely racial) */ state->see_infra = p_ptr->race->infra; /* Base skills */ for (i = 0; i < SKILL_MAX; i++) state->skills[i] = p_ptr->race->r_skills[i] + p_ptr->class->c_skills[i]; /*** Analyze player ***/ /* Extract the player flags */ player_flags(collect_f); /*** Analyze equipment ***/ /* Scan the equipment */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { o_ptr = &inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; /* Extract the item flags */ if (id_only) object_flags_known(o_ptr, f); else object_flags(o_ptr, f); of_union(collect_f, f); /* Affect stats */ if (of_has(f, OF_STR)) state->stat_add[A_STR] += o_ptr->pval[which_pval(o_ptr, OF_STR)]; if (of_has(f, OF_INT)) state->stat_add[A_INT] += o_ptr->pval[which_pval(o_ptr, OF_INT)]; if (of_has(f, OF_WIS)) state->stat_add[A_WIS] += o_ptr->pval[which_pval(o_ptr, OF_WIS)]; if (of_has(f, OF_DEX)) state->stat_add[A_DEX] += o_ptr->pval[which_pval(o_ptr, OF_DEX)]; if (of_has(f, OF_CON)) state->stat_add[A_CON] += o_ptr->pval[which_pval(o_ptr, OF_CON)]; /* Affect stealth */ if (of_has(f, OF_STEALTH)) state->skills[SKILL_STEALTH] += o_ptr->pval[which_pval(o_ptr, OF_STEALTH)]; /* Affect searching ability (factor of five) */ if (of_has(f, OF_SEARCH)) state->skills[SKILL_SEARCH] += (o_ptr->pval[which_pval(o_ptr, OF_SEARCH)] * 5); /* Affect searching frequency (factor of five) */ if (of_has(f, OF_SEARCH)) state->skills[SKILL_SEARCH_FREQUENCY] += (o_ptr->pval[which_pval(o_ptr, OF_SEARCH)] * 5); /* Affect infravision */ if (of_has(f, OF_INFRA)) state->see_infra += o_ptr->pval[which_pval(o_ptr, OF_INFRA)]; /* Affect digging (factor of 20) */ if (of_has(f, OF_TUNNEL)) state->skills[SKILL_DIGGING] += (o_ptr->pval[which_pval(o_ptr, OF_TUNNEL)] * 20); /* Affect speed */ if (of_has(f, OF_SPEED)) state->speed += o_ptr->pval[which_pval(o_ptr, OF_SPEED)]; /* Affect blows */ if (of_has(f, OF_BLOWS)) extra_blows += o_ptr->pval[which_pval(o_ptr, OF_BLOWS)]; /* Affect shots */ if (of_has(f, OF_SHOTS)) extra_shots += o_ptr->pval[which_pval(o_ptr, OF_SHOTS)]; /* Affect Might */ if (of_has(f, OF_MIGHT)) extra_might += o_ptr->pval[which_pval(o_ptr, OF_MIGHT)]; /* Modify the base armor class */ state->ac += o_ptr->ac; /* The base armor class is always known */ state->dis_ac += o_ptr->ac; /* Apply the bonuses to armor class */ if (!id_only || object_is_known(o_ptr)) state->to_a += o_ptr->to_a; /* Apply the mental bonuses to armor class, if known */ if (object_defence_plusses_are_visible(o_ptr)) state->dis_to_a += o_ptr->to_a; /* Hack -- do not apply "weapon" bonuses */ if (i == INVEN_WIELD) continue; /* Hack -- do not apply "bow" bonuses */ if (i == INVEN_BOW) continue; /* Apply the bonuses to hit/damage */ if (!id_only || object_is_known(o_ptr)) { state->to_h += o_ptr->to_h; state->to_d += o_ptr->to_d; } /* Apply the mental bonuses tp hit/damage, if known */ if (object_attack_plusses_are_visible(o_ptr)) { state->dis_to_h += o_ptr->to_h; state->dis_to_d += o_ptr->to_d; } } /*** Update all flags ***/ for (i = 0; i < OF_MAX; i++) if (of_has(collect_f, i)) of_on(state->flags, i); /*** Handle stats ***/ /* Calculate stats */ for (i = 0; i < A_MAX; i++) { int add, top, use, ind; /* Extract modifier */ add = state->stat_add[i]; /* Modify the stats for race/class */ add += (p_ptr->race->r_adj[i] + p_ptr->class->c_adj[i]); /* Extract the new "stat_top" value for the stat */ top = modify_stat_value(p_ptr->stat_max[i], add); /* Save the new value */ state->stat_top[i] = top; /* Extract the new "stat_use" value for the stat */ use = modify_stat_value(p_ptr->stat_cur[i], add); /* Save the new value */ state->stat_use[i] = use; /* Values: n/a */ if (use <= 3) ind = 0; /* Values: 3, 4, ..., 18 */ else if (use <= 18) ind = (use - 3); /* Ranges: 18/00-18/09, ..., 18/210-18/219 */ else if (use <= 18+219) ind = (15 + (use - 18) / 10); /* Range: 18/220+ */ else ind = (37); assert((0 <= ind) && (ind < STAT_RANGE)); /* Save the new index */ state->stat_ind[i] = ind; } /*** Temporary flags ***/ /* Apply temporary "stun" */ if (p_ptr->timed[TMD_STUN] > 50) { state->to_h -= 20; state->dis_to_h -= 20; state->to_d -= 20; state->dis_to_d -= 20; state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 8 / 10; } else if (p_ptr->timed[TMD_STUN]) { state->to_h -= 5; state->dis_to_h -= 5; state->to_d -= 5; state->dis_to_d -= 5; state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 9 / 10; } /* Invulnerability */ if (p_ptr->timed[TMD_INVULN]) { state->to_a += 100; state->dis_to_a += 100; } /* Temporary blessing */ if (p_ptr->timed[TMD_BLESSED]) { state->to_a += 5; state->dis_to_a += 5; state->to_h += 10; state->dis_to_h += 10; state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 105 / 100; } /* Temporary shield */ if (p_ptr->timed[TMD_SHIELD]) { state->to_a += 50; state->dis_to_a += 50; } /* Temporary stoneskin */ if (p_ptr->timed[TMD_STONESKIN]) { state->to_a += 40; state->dis_to_a += 40; state->speed -= 5; } /* Temporary "Hero" */ if (p_ptr->timed[TMD_HERO]) { state->to_h += 12; state->dis_to_h += 12; state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 105 / 100; } /* Temporary "Berserk" */ if (p_ptr->timed[TMD_SHERO]) { state->to_h += 24; state->dis_to_h += 24; state->to_a -= 10; state->dis_to_a -= 10; state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 9 / 10; } /* Temporary "fast" */ if (p_ptr->timed[TMD_FAST] || p_ptr->timed[TMD_SPRINT]) state->speed += 10; /* Temporary "slow" */ if (p_ptr->timed[TMD_SLOW]) state->speed -= 10; /* Temporary infravision boost */ if (p_ptr->timed[TMD_SINFRA]) state->see_infra += 5; /* Terror - this is necessary because TMD_AFRAID already occupies the * of_ptr->timed slot for OF_AFRAID */ if (p_ptr->timed[TMD_TERROR] > p_ptr->timed[TMD_AFRAID]) p_ptr->timed[TMD_AFRAID] = p_ptr->timed[TMD_TERROR]; if (p_ptr->timed[TMD_TERROR]) state->speed += 10; /* Fear can come from item flags too */ if (check_state(p_ptr, OF_AFRAID, p_ptr->state.flags)) { state->to_h -= 20; state->dis_to_h -= 20; state->to_a += 8; state->dis_to_a += 8; state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 95 / 100; } /* Confusion */ if (p_ptr->timed[TMD_CONFUSED]) state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 75 / 100; /* Amnesia */ if (p_ptr->timed[TMD_AMNESIA]) state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 8 / 10; /* Poison */ if (p_ptr->timed[TMD_POISONED]) state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 95 / 100; /* Hallucination */ if (p_ptr->timed[TMD_IMAGE]) state->skills[SKILL_DEVICE] = state->skills[SKILL_DEVICE] * 8 / 10; /*** Analyze weight ***/ /* Extract the current weight (in tenth pounds) */ j = p_ptr->total_weight; /* Extract the "weight limit" (in tenth pounds) */ i = weight_limit(state); /* Apply "encumbrance" from weight */ if (j > i / 2) state->speed -= ((j - (i / 2)) / (i / 10)); /* Searching slows the player down */ if (p_ptr->searching) state->speed -= 10; /* Sanity check on extreme speeds */ if (state->speed < 0) state->speed = 0; if (state->speed > 199) state->speed = 199; /*** Apply modifier bonuses ***/ /* Actual Modifier Bonuses (Un-inflate stat bonuses) */ state->to_a += ((int)(adj_dex_ta[state->stat_ind[A_DEX]]) - 128); state->to_d += ((int)(adj_str_td[state->stat_ind[A_STR]]) - 128); state->to_h += ((int)(adj_dex_th[state->stat_ind[A_DEX]]) - 128); state->to_h += ((int)(adj_str_th[state->stat_ind[A_STR]]) - 128); /* Displayed Modifier Bonuses (Un-inflate stat bonuses) */ state->dis_to_a += ((int)(adj_dex_ta[state->stat_ind[A_DEX]]) - 128); state->dis_to_d += ((int)(adj_str_td[state->stat_ind[A_STR]]) - 128); state->dis_to_h += ((int)(adj_dex_th[state->stat_ind[A_DEX]]) - 128); state->dis_to_h += ((int)(adj_str_th[state->stat_ind[A_STR]]) - 128); /*** Modify skills ***/ /* Affect Skill -- disarming (DEX and INT) */ state->skills[SKILL_DISARM] += adj_dex_dis[state->stat_ind[A_DEX]]; state->skills[SKILL_DISARM] += adj_int_dis[state->stat_ind[A_INT]]; /* Affect Skill -- magic devices (INT) */ state->skills[SKILL_DEVICE] += adj_int_dev[state->stat_ind[A_INT]]; /* Affect Skill -- saving throw (WIS) */ state->skills[SKILL_SAVE] += adj_wis_sav[state->stat_ind[A_WIS]]; /* Affect Skill -- digging (STR) */ state->skills[SKILL_DIGGING] += adj_str_dig[state->stat_ind[A_STR]]; /* Affect Skills (Level, by Class) */ for (i = 0; i < SKILL_MAX; i++) state->skills[i] += (p_ptr->class->x_skills[i] * p_ptr->lev / 10); /* Limit Skill -- digging from 1 up */ if (state->skills[SKILL_DIGGING] < 1) state->skills[SKILL_DIGGING] = 1; /* Limit Skill -- stealth from 0 to 30 */ if (state->skills[SKILL_STEALTH] > 30) state->skills[SKILL_STEALTH] = 30; if (state->skills[SKILL_STEALTH] < 0) state->skills[SKILL_STEALTH] = 0; /* Apply Skill -- Extract noise from stealth */ state->noise = (1L << (30 - state->skills[SKILL_STEALTH])); /* Obtain the "hold" value */ hold = adj_str_hold[state->stat_ind[A_STR]]; /*** Analyze current bow ***/ /* Examine the "current bow" */ o_ptr = &inventory[INVEN_BOW]; /* Assume not heavy */ state->heavy_shoot = FALSE; /* It is hard to hold a heavy bow */ if (hold < o_ptr->weight / 10) { /* Hard to wield a heavy bow */ state->to_h += 2 * (hold - o_ptr->weight / 10); state->dis_to_h += 2 * (hold - o_ptr->weight / 10); /* Heavy Bow */ state->heavy_shoot = TRUE; } /* Analyze launcher */ if (o_ptr->kind) { /* Get to shoot */ state->num_shots = 1; /* Analyze the launcher */ switch (o_ptr->sval) { /* Sling and ammo */ case SV_SLING: { state->ammo_tval = TV_SHOT; state->ammo_mult = 2; break; } /* Short Bow and Arrow */ case SV_SHORT_BOW: { state->ammo_tval = TV_ARROW; state->ammo_mult = 2; break; } /* Long Bow and Arrow */ case SV_LONG_BOW: { state->ammo_tval = TV_ARROW; state->ammo_mult = 3; break; } /* Light Crossbow and Bolt */ case SV_LIGHT_XBOW: { state->ammo_tval = TV_BOLT; state->ammo_mult = 3; break; } /* Heavy Crossbow and Bolt */ case SV_HEAVY_XBOW: { state->ammo_tval = TV_BOLT; state->ammo_mult = 4; break; } } /* Apply special flags */ if (o_ptr->kind && !state->heavy_shoot) { /* Extra shots */ state->num_shots += extra_shots; /* Extra might */ state->ammo_mult += extra_might; /* Hack -- Rangers love Bows */ if (player_has(PF_EXTRA_SHOT) && (state->ammo_tval == TV_ARROW)) { /* Extra shot at level 20 */ if (p_ptr->lev >= 20) state->num_shots++; /* Extra shot at level 40 */ if (p_ptr->lev >= 40) state->num_shots++; } } /* Require at least one shot */ if (state->num_shots < 1) state->num_shots = 1; } /*** Analyze weapon ***/ /* Examine the "current weapon" */ o_ptr = &inventory[INVEN_WIELD]; /* Assume not heavy */ state->heavy_wield = FALSE; /* It is hard to hold a heavy weapon */ if (hold < o_ptr->weight / 10) { /* Hard to wield a heavy weapon */ state->to_h += 2 * (hold - o_ptr->weight / 10); state->dis_to_h += 2 * (hold - o_ptr->weight / 10); /* Heavy weapon */ state->heavy_wield = TRUE; } /* Non-object means barehanded attacks */ if (!o_ptr->kind) assert(o_ptr->weight == 0); /* Normal weapons */ if (!state->heavy_wield) { /* Calculate number of blows */ state->num_blows = calc_blows(o_ptr, state, extra_blows); /* Boost digging skill by weapon weight */ state->skills[SKILL_DIGGING] += (o_ptr->weight / 10); } /* Assume okay */ state->icky_wield = FALSE; /* Priest weapon penalty for non-blessed edged weapons */ if (player_has(PF_BLESS_WEAPON) && !check_state(p_ptr, OF_BLESSED, p_ptr->state.flags) && ((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM))) { /* Reduce the real bonuses */ state->to_h -= 2; state->to_d -= 2; /* Reduce the mental bonuses */ state->dis_to_h -= 2; state->dis_to_d -= 2; /* Icky weapon */ state->icky_wield = TRUE; } return; } /* * Calculate bonuses, and print various things on changes. */ static void update_bonuses(void) { int i; player_state *state = &p_ptr->state; player_state old = p_ptr->state; /*** Calculate bonuses ***/ calc_bonuses(p_ptr->inventory, &p_ptr->state, FALSE); /*** Notice changes ***/ /* Analyze stats */ for (i = 0; i < A_MAX; i++) { /* Notice changes */ if (state->stat_top[i] != old.stat_top[i]) { /* Redisplay the stats later */ p_ptr->redraw |= (PR_STATS); } /* Notice changes */ if (state->stat_use[i] != old.stat_use[i]) { /* Redisplay the stats later */ p_ptr->redraw |= (PR_STATS); } /* Notice changes */ if (state->stat_ind[i] != old.stat_ind[i]) { /* Change in CON affects Hitpoints */ if (i == A_CON) { p_ptr->update |= (PU_HP); } /* Change in INT may affect Mana/Spells */ else if (i == A_INT) { if (p_ptr->class->spell_stat == A_INT) { p_ptr->update |= (PU_MANA | PU_SPELLS); } } /* Change in WIS may affect Mana/Spells */ else if (i == A_WIS) { if (p_ptr->class->spell_stat == A_WIS) { p_ptr->update |= (PU_MANA | PU_SPELLS); } } } } /* Hack -- Telepathy Change */ if (of_has(state->flags, OF_TELEPATHY) != of_has(old.flags, OF_TELEPATHY)) { /* Update monster visibility */ p_ptr->update |= (PU_MONSTERS); } /* Hack -- See Invis Change */ if (of_has(state->flags, OF_SEE_INVIS) != of_has(old.flags, OF_SEE_INVIS)) { /* Update monster visibility */ p_ptr->update |= (PU_MONSTERS); } /* Redraw speed (if needed) */ if (state->speed != old.speed) { /* Redraw speed */ p_ptr->redraw |= (PR_SPEED); } /* Redraw armor (if needed) */ if ((state->dis_ac != old.dis_ac) || (state->dis_to_a != old.dis_to_a)) { /* Redraw */ p_ptr->redraw |= (PR_ARMOR); } /* Hack -- handle "xtra" mode */ if (character_xtra) return; /* Take note when "heavy bow" changes */ if (old.heavy_shoot != state->heavy_shoot) { /* Message */ if (state->heavy_shoot) msg("You have trouble wielding such a heavy bow."); else if (p_ptr->inventory[INVEN_BOW].kind) msg("You have no trouble wielding your bow."); else msg("You feel relieved to put down your heavy bow."); } /* Take note when "heavy weapon" changes */ if (old.heavy_wield != state->heavy_wield) { /* Message */ if (state->heavy_wield) msg("You have trouble wielding such a heavy weapon."); else if (p_ptr->inventory[INVEN_WIELD].kind) msg("You have no trouble wielding your weapon."); else msg("You feel relieved to put down your heavy weapon."); } /* Take note when "illegal weapon" changes */ if (old.icky_wield != state->icky_wield) { /* Message */ if (state->icky_wield) msg("You do not feel comfortable with your weapon."); else if (p_ptr->inventory[INVEN_WIELD].kind) msg("You feel comfortable with your weapon."); else msg("You feel more comfortable after removing your weapon."); } } /*** Generic "deal with" functions ***/ /* * Handle "p_ptr->notice" */ void notice_stuff(struct player *p) { /* Notice stuff */ if (!p->notice) return; /* Deal with autoinscribe stuff */ if (p->notice & PN_AUTOINSCRIBE) { p->notice &= ~(PN_AUTOINSCRIBE); autoinscribe_pack(); autoinscribe_ground(); } /* Deal with squelch stuff */ if (p->notice & PN_SQUELCH) { p->notice &= ~(PN_SQUELCH); squelch_drop(); } /* Combine the pack */ if (p->notice & PN_COMBINE) { p->notice &= ~(PN_COMBINE); combine_pack(); } /* Reorder the pack */ if (p->notice & PN_REORDER) { p->notice &= ~(PN_REORDER); reorder_pack(); } /* Sort the quiver */ if (p->notice & PN_SORT_QUIVER) { p->notice &= ~(PN_SORT_QUIVER); sort_quiver(); } /* Dump the monster messages */ if (p->notice & PN_MON_MESSAGE) { p->notice &= ~(PN_MON_MESSAGE); /* Make sure this comes after all of the monster messages */ flush_all_monster_messages(); } } /* * Handle "p_ptr->update" */ void update_stuff(struct player *p) { /* Update stuff */ if (!p->update) return; if (p->update & (PU_BONUS)) { p->update &= ~(PU_BONUS); update_bonuses(); } if (p->update & (PU_TORCH)) { p->update &= ~(PU_TORCH); calc_torch(); } if (p->update & (PU_HP)) { p->update &= ~(PU_HP); calc_hitpoints(); } if (p->update & (PU_MANA)) { p->update &= ~(PU_MANA); calc_mana(); } if (p->update & (PU_SPELLS)) { p->update &= ~(PU_SPELLS); calc_spells(); } /* Character is not ready yet, no screen updates */ if (!character_generated) return; /* Character is in "icky" mode, no screen updates */ if (character_icky) return; if (p->update & (PU_FORGET_VIEW)) { p->update &= ~(PU_FORGET_VIEW); forget_view(cave); } if (p->update & (PU_UPDATE_VIEW)) { p->update &= ~(PU_UPDATE_VIEW); update_view(cave, p); } if (p->update & (PU_FORGET_FLOW)) { p->update &= ~(PU_FORGET_FLOW); cave_forget_flow(cave); } if (p->update & (PU_UPDATE_FLOW)) { p->update &= ~(PU_UPDATE_FLOW); cave_update_flow(cave); } if (p->update & (PU_DISTANCE)) { p->update &= ~(PU_DISTANCE); p->update &= ~(PU_MONSTERS); update_monsters(TRUE); } if (p->update & (PU_MONSTERS)) { p->update &= ~(PU_MONSTERS); update_monsters(FALSE); } if (p->update & (PU_PANEL)) { p->update &= ~(PU_PANEL); event_signal(EVENT_PLAYERMOVED); } } struct flag_event_trigger { u32b flag; game_event_type event; }; /* * Events triggered by the various flags. */ static const struct flag_event_trigger redraw_events[] = { { PR_MISC, EVENT_RACE_CLASS }, { PR_TITLE, EVENT_PLAYERTITLE }, { PR_LEV, EVENT_PLAYERLEVEL }, { PR_EXP, EVENT_EXPERIENCE }, { PR_STATS, EVENT_STATS }, { PR_ARMOR, EVENT_AC }, { PR_HP, EVENT_HP }, { PR_MANA, EVENT_MANA }, { PR_GOLD, EVENT_GOLD }, { PR_HEALTH, EVENT_MONSTERHEALTH }, { PR_DEPTH, EVENT_DUNGEONLEVEL }, { PR_SPEED, EVENT_PLAYERSPEED }, { PR_STATE, EVENT_STATE }, { PR_STATUS, EVENT_STATUS }, { PR_STUDY, EVENT_STUDYSTATUS }, { PR_DTRAP, EVENT_DETECTIONSTATUS }, { PR_INVEN, EVENT_INVENTORY }, { PR_EQUIP, EVENT_EQUIPMENT }, { PR_MONLIST, EVENT_MONSTERLIST }, { PR_ITEMLIST, EVENT_ITEMLIST }, { PR_MONSTER, EVENT_MONSTERTARGET }, { PR_OBJECT, EVENT_OBJECTTARGET }, { PR_MESSAGE, EVENT_MESSAGE }, }; /* * Handle "p_ptr->redraw" */ void redraw_stuff(struct player *p) { size_t i; /* Redraw stuff */ if (!p->redraw) return; /* Character is not ready yet, no screen updates */ if (!character_generated) return; /* Character is in "icky" mode, no screen updates */ if (character_icky) return; /* For each listed flag, send the appropriate signal to the UI */ for (i = 0; i < N_ELEMENTS(redraw_events); i++) { const struct flag_event_trigger *hnd = &redraw_events[i]; if (p->redraw & hnd->flag) event_signal(hnd->event); } /* Then the ones that require parameters to be supplied. */ if (p->redraw & PR_MAP) { /* Mark the whole map to be redrawn */ event_signal_point(EVENT_MAP, -1, -1); } p->redraw = 0; /* * Do any plotting, etc. delayed from earlier - this set of updates * is over. */ event_signal(EVENT_END); } /* * Handle "p_ptr->update" and "p_ptr->redraw" */ void handle_stuff(struct player *p) { if (p->update) update_stuff(p); if (p->redraw) redraw_stuff(p); } angband-3.5.1/src/player/p-util.c0000644000175000017500000002152212456456606016103 0ustar chriscchrisc/* player/p-util.c * Copyright (c) 2011 The Angband Developers. See COPYING. */ #include "angband.h" #include "cave.h" #include "object/tvalsval.h" /* * Modify a stat value by a "modifier", return new value * * Stats go up: 3,4,...,17,18,18/10,18/20,...,18/220 * Or even: 18/13, 18/23, 18/33, ..., 18/220 * * Stats go down: 18/220, 18/210,..., 18/10, 18, 17, ..., 3 * Or even: 18/13, 18/03, 18, 17, ..., 3 */ s16b modify_stat_value(int value, int amount) { int i; /* Reward */ if (amount > 0) { /* Apply each point */ for (i = 0; i < amount; i++) { /* One point at a time */ if (value < 18) value++; /* Ten "points" at a time */ else value += 10; } } /* Penalty */ else if (amount < 0) { /* Apply each point */ for (i = 0; i < (0 - amount); i++) { /* Ten points at a time */ if (value >= 18+10) value -= 10; /* Hack -- prevent weirdness */ else if (value > 18) value = 18; /* One point at a time */ else if (value > 3) value--; } } /* Return new value */ return (value); } /** * Return TRUE if the player can cast a spell. * * \param show_msg should be set to TRUE if a failure message should be displayed. */ bool player_can_cast(struct player *p, bool show_msg) { if (!p->class->spell_book) { if (show_msg) msg("You cannot pray or produce magics."); return FALSE; } if (p->timed[TMD_BLIND] || no_light()) { if (show_msg) msg("You cannot see!"); return FALSE; } if (p->timed[TMD_CONFUSED]) { if (show_msg) msg("You are too confused!"); return FALSE; } return TRUE; } /** * Return TRUE if the player can study a spell. * * \param show_msg should be set to TRUE if a failure message should be displayed. */ bool player_can_study(struct player *p, bool show_msg) { if (!player_can_cast(p, show_msg)) return FALSE; if (!p->new_spells) { if (show_msg) { const char *name = ((p->class->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer"); msg("You cannot learn any new %ss!", name); } return FALSE; } return TRUE; } /** * Return TRUE if the player can read scrolls or books. * * \param show_msg should be set to TRUE if a failure message should be displayed. */ bool player_can_read(struct player *p, bool show_msg) { if (p->timed[TMD_BLIND]) { if (show_msg) msg("You can't see anything."); return FALSE; } if (no_light()) { if (show_msg) msg("You have no light to read by."); return FALSE; } if (p->timed[TMD_CONFUSED]) { if (show_msg) msg("You are too confused to read!"); return FALSE; } if (p->timed[TMD_AMNESIA]) { if (show_msg) msg("You can't remember how to read!"); return FALSE; } return TRUE; } /** * Return TRUE if the player can fire something with a launcher. * * \param show_msg should be set to TRUE if a failure message should be displayed. */ bool player_can_fire(struct player *p, bool show_msg) { object_type *o_ptr = &p->inventory[INVEN_BOW]; /* Require a usable launcher */ if (!o_ptr->tval || !p->state.ammo_tval) { if (show_msg) msg("You have nothing to fire with."); return FALSE; } return TRUE; } /** * Return TRUE if the player can refuel their light source. * * \param show_msg should be set to TRUE if a failure message should be displayed. */ bool player_can_refuel(struct player *p, bool show_msg) { object_type *obj = &p->inventory[INVEN_LIGHT]; if (obj->kind && obj->sval == SV_LIGHT_LANTERN) return TRUE; if (show_msg) msg("Your light cannot be refuelled."); return FALSE; } /** * Prerequiste function for command. See struct cmd_info in cmd-process.c. */ bool player_can_cast_prereq(void) { return player_can_cast(p_ptr, TRUE); } /** * Prerequiste function for command. See struct cmd_info in cmd-process.c. */ bool player_can_study_prereq(void) { return player_can_study(p_ptr, TRUE); } /** * Prerequiste function for command. See struct cmd_info in cmd-process.c. */ bool player_can_read_prereq(void) { return player_can_read(p_ptr, TRUE); } /** * Prerequiste function for command. See struct cmd_info in cmd-process.c. */ bool player_can_fire_prereq(void) { return player_can_fire(p_ptr, TRUE); } /** * Prerequiste function for command. See struct cmd_info in cmd-process.c. */ bool player_can_refuel_prereq(void) { return player_can_refuel(p_ptr, TRUE); } /** * Return TRUE if the player has a book in their inventory that has unlearned spells. */ bool player_book_has_unlearned_spells(struct player *p) { int i; int item_list[INVEN_TOTAL]; int item_num; object_type *o_ptr; struct spell *sp; /* Check if the player can learn new spells */ if (!p->new_spells) return FALSE; /* Get the number of books in inventory */ item_tester_hook = obj_can_browse; item_num = scan_items(item_list, N_ELEMENTS(item_list), (USE_INVEN)); /* Check through all available books */ for (i = 0; i < item_num; i++) { o_ptr = object_from_item_idx(i); /* Extract spells */ for (sp = o_ptr->kind->spells; sp; sp = sp->next) /* Check if the player can study it */ if (spell_okay_to_study(sp->spell_index)) /* There is a spell the player can study */ return TRUE; } return FALSE; } /* * Apply confusion, if needed, to a direction * * Display a message and return TRUE if direction changes. */ bool player_confuse_dir(struct player *p, int *dp, bool too) { int dir = *dp; if (p->timed[TMD_CONFUSED]) if ((dir == 5) || (randint0(100) < 75)) /* Random direction */ dir = ddd[randint0(8)]; if (*dp != dir) { if (too) msg("You are too confused."); else msg("You are confused."); *dp = dir; return TRUE; } return FALSE; } /** * Return TRUE if the provided count is one of the conditional REST_ flags. */ bool player_resting_is_special(s16b count) { switch (count) { case REST_COMPLETE: case REST_ALL_POINTS: case REST_SOME_POINTS: return TRUE; } return FALSE; } /** * Return TRUE if the player is resting. */ bool player_is_resting(struct player *p) { return p->resting > 0 || player_resting_is_special(p->resting); } /** * Return the remaining number of resting turns. */ s16b player_resting_count(struct player *p) { return p->resting; } /* * In order to prevent the regeneration bonus from the first few turns, we have to * store the original number of turns the user entered. Otherwise, the first few * turns will have the bonus and the last few will not. */ static s16b player_resting_start_count = 0; /** * Set the number of resting turns. * * \param count is the number of turns to rest or one of the REST_ constants. */ void player_resting_set_count(struct player *p, s16b count) { if (count < 0 && !player_resting_is_special(count)) { /* Ignore if the rest count is negative. */ p->resting = 0; return; } /* Save the rest code */ p->resting = count; /* Truncate overlarge values */ if (p->resting > 9999) p->resting = 9999; /* The first turn is always used, so we need to adjust the count. */ if (p->resting > 0) p->resting--; player_resting_start_count = p->resting; } /** * Cancel current rest. */ void player_resting_cancel(struct player *p) { player_resting_set_count(p, 0); } /** * Return TRUE if the player should get a regeneration bonus for the current rest. */ bool player_resting_can_regenerate(struct player *p) { return (player_resting_start_count - p->resting) >= REST_REQUIRED_FOR_REGEN || player_resting_is_special(p->resting); } /** * Perform one turn of resting. This only handles the bookkeeping of resting itself, * and does not calculate any possible other effects of resting (see process_world() * for regeneration). */ void player_resting_step_turn(struct player *p) { /* Timed rest */ if (p->resting > 0) { /* Reduce rest count */ p->resting--; /* Redraw the state */ p->redraw |= (PR_STATE); } /* Take a turn */ p->energy_use = 100; /* Increment the resting counter */ p->resting_turn++; } /** * Handle the conditions for conditional resting (resting with the REST_ constants). */ void player_resting_complete_special(struct player *p) { /* Complete resting */ if (player_resting_is_special(p->resting)) { /* Basic resting */ if (p->resting == REST_ALL_POINTS) { /* Stop resting */ if ((p->chp == p->mhp) && (p->csp == p->msp)) { disturb(p, 0, 0); } } /* Complete resting */ else if (p->resting == REST_COMPLETE) { /* Stop resting */ if ((p->chp == p->mhp) && (p->csp == p->msp) && !p->timed[TMD_BLIND] && !p->timed[TMD_CONFUSED] && !p->timed[TMD_POISONED] && !p->timed[TMD_AFRAID] && !p->timed[TMD_TERROR] && !p->timed[TMD_STUN] && !p->timed[TMD_CUT] && !p->timed[TMD_SLOW] && !p->timed[TMD_PARALYZED] && !p->timed[TMD_IMAGE] && !p->word_recall) { disturb(p, 0, 0); } } /* Rest until HP or SP are filled */ else if (p->resting == REST_SOME_POINTS) { /* Stop resting */ if ((p->chp == p->mhp) || (p->csp == p->msp)) { disturb(p, 0, 0); } } } } angband-3.5.1/src/player/timed.c0000644000175000017500000003677612456456606016014 0ustar chriscchrisc/* * File: player/timed.c * Purpose: Timed effects handling * * Copyright (c) 1997 Ben Harrison * Copyright (c) 2007 A Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" /* * The "stun" and "cut" statuses need to be handled by special functions of * their own, as they are more complex than the ones handled by the generic * code. */ static bool set_stun(struct player *p, int v); static bool set_cut(struct player *p, int v); typedef struct { const char *on_begin; const char *on_end; const char *on_increase; const char *on_decrease; u32b flag_redraw, flag_update; int msg; int resist; } timed_effect; static timed_effect effects[] = { { "You feel yourself moving faster!", "You feel yourself slow down.", NULL, NULL, 0, PU_BONUS, MSG_SPEED, 0 }, { "You feel yourself moving slower!", "You feel yourself speed up.", NULL, NULL, 0, PU_BONUS, MSG_SLOW, OF_FREE_ACT }, { "You are blind.", "You blink and your eyes clear.", NULL, NULL, PR_MAP, PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS, MSG_BLIND, OF_RES_BLIND }, { "You are paralysed!", "You can move again.", NULL, NULL, 0, 0, MSG_PARALYZED, OF_FREE_ACT }, { "You are confused!", "You are no longer confused.", "You are more confused!", "You feel a little less confused.", 0, 0, MSG_CONFUSED, OF_RES_CONFU }, { "You are terrified!", "You feel bolder now.", "You are more scared!", "You feel a little less scared.", 0, PU_BONUS, MSG_AFRAID, OF_RES_FEAR }, { "You feel drugged!", "You can see clearly again.", "You feel more drugged!", "You feel less drugged.", PR_MAP | PR_MONLIST | PR_ITEMLIST, 0, MSG_DRUGGED, OF_RES_CHAOS }, { "You are poisoned!", "You are no longer poisoned.", "You are more poisoned!", "You are less poisoned.", 0, 0, MSG_POISONED, OF_RES_POIS }, { NULL, NULL, NULL, NULL, 0, 0, 0, 0 }, /* TMD_CUT -- handled seperately */ { NULL, NULL, NULL, NULL, 0, 0, 0, OF_RES_STUN }, /* TMD_STUN -- handled seperately */ { "You feel safe from evil!", "You no longer feel safe from evil.", "You feel even safer from evil!", "You feel less safe from evil.", 0, 0, MSG_PROT_EVIL, 0 }, { "You feel invulnerable!", "You feel vulnerable once more.", NULL, NULL, 0, PU_BONUS, MSG_INVULN, 0 }, { "You feel like a hero!", "You no longer feel heroic.", "You feel more like a hero!", "You feel less heroic.", 0, PU_BONUS, MSG_HERO, 0 }, { "You feel like a killing machine!", "You no longer feel berserk.", "You feel even more berserk!", "You feel less berserk.", 0, PU_BONUS, MSG_BERSERK, 0 }, { "A mystic shield forms around your body!", "Your mystic shield crumbles away.", "The mystic shield strengthens.", "The mystic shield weakens.", 0, PU_BONUS, MSG_SHIELD, 0 }, { "You feel righteous!", "The prayer has expired.", "You feel more righteous!", "You feel less righteous.", 0, PU_BONUS, MSG_BLESSED, 0 }, { "Your eyes feel very sensitive!", "Your eyes no longer feel so sensitive.", "Your eyes feel more sensitive!", "Your eyes feel less sensitive.", 0, (PU_BONUS | PU_MONSTERS), MSG_SEE_INVIS, 0 }, { "Your eyes begin to tingle!", "Your eyes stop tingling.", "Your eyes' tingling intensifies.", "Your eyes tingle less.", 0, (PU_BONUS | PU_MONSTERS), MSG_INFRARED, 0 }, { "You feel resistant to acid!", "You are no longer resistant to acid.", "You feel more resistant to acid!", "You feel less resistant to acid.", PR_STATUS, 0, MSG_RES_ACID, OF_VULN_ACID }, { "You feel resistant to electricity!", "You are no longer resistant to electricity.", "You feel more resistant to electricity!", "You feel less resistant to electricity.", PR_STATUS, 0, MSG_RES_ELEC, OF_VULN_ELEC }, { "You feel resistant to fire!", "You are no longer resistant to fire.", "You feel more resistant to fire!", "You feel less resistant to fire.", PR_STATUS, 0, MSG_RES_FIRE, OF_VULN_FIRE }, { "You feel resistant to cold!", "You are no longer resistant to cold.", "You feel more resistant to cold!", "You feel less resistant to cold.", PR_STATUS, 0, MSG_RES_COLD, OF_VULN_COLD }, { "You feel resistant to poison!", "You are no longer resistant to poison.", "You feel more resistant to poison!", "You feel less resistant to poison.", 0, 0, MSG_RES_POIS, 0 }, { "You feel resistant to confusion!", "You are no longer resistant to confusion.", "You feel more resistant to confusion!", "You feel less resistant to confusion.", PR_STATUS, PU_BONUS, 0, 0 }, { "You feel your memories fade.", "Your memories come flooding back.", NULL, NULL, 0, 0, MSG_GENERIC, 0 }, { "Your mind expands.", "Your horizons are once more limited.", "Your mind expands further.", NULL, 0, PU_BONUS, MSG_GENERIC, 0 }, { "Your skin turns to stone.", "A fleshy shade returns to your skin.", NULL, NULL, 0, PU_BONUS, MSG_GENERIC, 0 }, { "You feel the need to run away, and fast!", "The urge to run dissipates.", NULL, NULL, 0, PU_BONUS, MSG_AFRAID, 0 }, { "You start sprinting.", "You suddenly stop sprinting.", NULL, NULL, 0, PU_BONUS, MSG_SPEED, 0 }, { "You feel bold.", "You no longer feel bold.", "You feel even bolder!", "You feel less bold.", 0, PU_BONUS, MSG_BOLD, 0 }, }; /* * Set a timed event (except timed resists, cutting and stunning). */ bool player_set_timed(struct player *p, int idx, int v, bool notify) { timed_effect *effect; /* Hack -- Force good values */ v = (v > 10000) ? 10000 : (v < 0) ? 0 : v; if ((idx < 0) || (idx > TMD_MAX)) return FALSE; /* No change */ if (p->timed[idx] == v) return FALSE; /* Hack -- call other functions */ if (idx == TMD_STUN) return set_stun(p, v); else if (idx == TMD_CUT) return set_cut(p, v); /* Don't mention effects which already match the player state. */ if (idx == TMD_OPP_ACID && check_state(p, OF_IM_ACID, p->state.flags)) notify = FALSE; else if (idx == TMD_OPP_ELEC && check_state(p, OF_IM_ELEC, p->state.flags)) notify = FALSE; else if (idx == TMD_OPP_FIRE && check_state(p, OF_IM_FIRE, p->state.flags)) notify = FALSE; else if (idx == TMD_OPP_COLD && check_state(p, OF_IM_COLD, p->state.flags)) notify = FALSE; else if (idx == TMD_OPP_CONF && of_has(p->state.flags, OF_RES_CONFU)) notify = FALSE; /* Find the effect */ effect = &effects[idx]; /* Turning off, always mention */ if (v == 0) { msgt(MSG_RECOVER, "%s", effect->on_end); notify = TRUE; } /* Turning on, always mention */ else if (p->timed[idx] == 0) { msgt(effect->msg, "%s", effect->on_begin); notify = TRUE; } else if (notify) { /* Decrementing */ if (p->timed[idx] > v && effect->on_decrease) msgt(effect->msg, "%s", effect->on_decrease); /* Incrementing */ else if (v > p->timed[idx] && effect->on_increase) msgt(effect->msg, "%s", effect->on_increase); } /* Use the value */ p->timed[idx] = v; /* Sort out the sprint effect */ if (idx == TMD_SPRINT && v == 0) player_inc_timed(p, TMD_SLOW, 100, TRUE, FALSE); /* Nothing to notice */ if (!notify) return FALSE; /* Disturb */ disturb(p, 0, 0); /* Update the visuals, as appropriate. */ p->update |= effect->flag_update; p->redraw |= (PR_STATUS | effect->flag_redraw); /* Handle stuff */ handle_stuff(p); /* Result */ return TRUE; } /** * Increase the timed effect `idx` by `v`. Mention this if `notify` is TRUE. * Check for resistance to the effect if `check` is TRUE. */ bool player_inc_timed(struct player *p, int idx, int v, bool notify, bool check) { timed_effect *effect; /* Find the effect */ effect = &effects[idx]; /* Check we have a valid effect */ if ((idx < 0) || (idx > TMD_MAX)) return FALSE; /* Check that @ can be affected by this effect */ if (check) { wieldeds_notice_flag(p, effect->resist); if (check_state(p, effect->resist, p->state.flags)) return FALSE; } /* Paralysis should be non-cumulative */ if (idx == TMD_PARALYZED && p->timed[TMD_PARALYZED] > 0) return FALSE; /* Set v */ v = v + p->timed[idx]; return player_set_timed(p, idx, v, notify); } /** * Decrease the timed effect `idx` by `v`. Mention this if `notify` is TRUE. */ bool player_dec_timed(struct player *p, int idx, int v, bool notify) { /* Check we have a valid effect */ if ((idx < 0) || (idx > TMD_MAX)) return FALSE; /* Set v */ v = p->timed[idx] - v; return player_set_timed(p, idx, v, notify); } /** * Clear the timed effect `idx`. Mention this if `notify` is TRUE. */ bool player_clear_timed(struct player *p, int idx, bool notify) { return player_set_timed(p, idx, 0, notify); } /* * Set "p_ptr->timed[TMD_STUN]", notice observable changes * * Note the special code to only notice "range" changes. */ static bool set_stun(struct player *p, int v) { int old_aux, new_aux; bool notice = FALSE; /* Hack -- Force good values */ v = (v > 10000) ? 10000 : (v < 0) ? 0 : v; /* Knocked out */ if (p->timed[TMD_STUN] > 100) { old_aux = 3; } /* Heavy stun */ else if (p->timed[TMD_STUN] > 50) { old_aux = 2; } /* Stun */ else if (p->timed[TMD_STUN] > 0) { old_aux = 1; } /* None */ else { old_aux = 0; } /* Knocked out */ if (v > 100) { new_aux = 3; } /* Heavy stun */ else if (v > 50) { new_aux = 2; } /* Stun */ else if (v > 0) { new_aux = 1; } /* None */ else { new_aux = 0; } /* Increase cut */ if (new_aux > old_aux) { /* Describe the state */ switch (new_aux) { /* Stun */ case 1: { msgt(MSG_STUN, "You have been stunned."); break; } /* Heavy stun */ case 2: { msgt(MSG_STUN, "You have been heavily stunned."); break; } /* Knocked out */ case 3: { msgt(MSG_STUN, "You have been knocked out."); break; } } /* Notice */ notice = TRUE; } /* Decrease cut */ else if (new_aux < old_aux) { /* Describe the state */ switch (new_aux) { /* None */ case 0: { msgt(MSG_RECOVER, "You are no longer stunned."); disturb(p_ptr, 0, 0); break; } } /* Notice */ notice = TRUE; } /* Use the value */ p->timed[TMD_STUN] = v; /* No change */ if (!notice) return (FALSE); /* Disturb */ disturb(p_ptr, 0, 0); /* Recalculate bonuses */ p->update |= (PU_BONUS); /* Redraw the "stun" */ p->redraw |= (PR_STATUS); /* Handle stuff */ handle_stuff(p_ptr); /* Result */ return (TRUE); } /* * Set "p_ptr->timed[TMD_CUT]", notice observable changes * * Note the special code to only notice "range" changes. */ static bool set_cut(struct player *p, int v) { int old_aux, new_aux; bool notice = FALSE; /* Hack -- Force good values */ v = (v > 10000) ? 10000 : (v < 0) ? 0 : v; /* Mortal wound */ if (p->timed[TMD_CUT] > 1000) { old_aux = 7; } /* Deep gash */ else if (p->timed[TMD_CUT] > 200) { old_aux = 6; } /* Severe cut */ else if (p->timed[TMD_CUT] > 100) { old_aux = 5; } /* Nasty cut */ else if (p->timed[TMD_CUT] > 50) { old_aux = 4; } /* Bad cut */ else if (p->timed[TMD_CUT] > 25) { old_aux = 3; } /* Light cut */ else if (p->timed[TMD_CUT] > 10) { old_aux = 2; } /* Graze */ else if (p->timed[TMD_CUT] > 0) { old_aux = 1; } /* None */ else { old_aux = 0; } /* Mortal wound */ if (v > 1000) { new_aux = 7; } /* Deep gash */ else if (v > 200) { new_aux = 6; } /* Severe cut */ else if (v > 100) { new_aux = 5; } /* Nasty cut */ else if (v > 50) { new_aux = 4; } /* Bad cut */ else if (v > 25) { new_aux = 3; } /* Light cut */ else if (v > 10) { new_aux = 2; } /* Graze */ else if (v > 0) { new_aux = 1; } /* None */ else { new_aux = 0; } /* Increase cut */ if (new_aux > old_aux) { /* Describe the state */ switch (new_aux) { /* Graze */ case 1: { msgt(MSG_CUT, "You have been given a graze."); break; } /* Light cut */ case 2: { msgt(MSG_CUT, "You have been given a light cut."); break; } /* Bad cut */ case 3: { msgt(MSG_CUT, "You have been given a bad cut."); break; } /* Nasty cut */ case 4: { msgt(MSG_CUT, "You have been given a nasty cut."); break; } /* Severe cut */ case 5: { msgt(MSG_CUT, "You have been given a severe cut."); break; } /* Deep gash */ case 6: { msgt(MSG_CUT, "You have been given a deep gash."); break; } /* Mortal wound */ case 7: { msgt(MSG_CUT, "You have been given a mortal wound."); break; } } /* Notice */ notice = TRUE; } /* Decrease cut */ else if (new_aux < old_aux) { /* Describe the state */ switch (new_aux) { /* None */ case 0: { msgt(MSG_RECOVER, "You are no longer bleeding."); disturb(p_ptr, 0, 0); break; } } /* Notice */ notice = TRUE; } /* Use the value */ p->timed[TMD_CUT] = v; /* No change */ if (!notice) return (FALSE); /* Disturb */ disturb(p_ptr, 0, 0); /* Recalculate bonuses */ p->update |= (PU_BONUS); /* Redraw the "cut" */ p->redraw |= (PR_STATUS); /* Handle stuff */ handle_stuff(p_ptr); /* Result */ return (TRUE); } /* * Set "p_ptr->food", notice observable changes * * The "p_ptr->food" variable can get as large as 20000, allowing the * addition of the most "filling" item, Elvish Waybread, which adds * 7500 food units, without overflowing the 32767 maximum limit. * * Perhaps we should disturb the player with various messages, * especially messages about hunger status changes. XXX XXX XXX * * Digestion of food is handled in "dungeon.c", in which, normally, * the player digests about 20 food units per 100 game turns, more * when "fast", more when "regenerating", less with "slow digestion". */ bool player_set_food(struct player *p, int v) { int old_aux, new_aux; bool notice = FALSE; /* Hack -- Force good values */ v = MIN(v, PY_FOOD_MAX); v = MAX(v, 0); /* Current value */ if (p->food < PY_FOOD_FAINT) old_aux = 0; else if (p->food < PY_FOOD_WEAK) old_aux = 1; else if (p->food < PY_FOOD_ALERT) old_aux = 2; else if (p->food < PY_FOOD_FULL) old_aux = 3; else old_aux = 4; /* New value */ if (v < PY_FOOD_FAINT) new_aux = 0; else if (v < PY_FOOD_WEAK) new_aux = 1; else if (v < PY_FOOD_ALERT) new_aux = 2; else if (v < PY_FOOD_FULL) new_aux = 3; else new_aux = 4; /* Food increase */ if (new_aux > old_aux) { switch (new_aux) { case 1: msg("You are still weak."); break; case 2: msg("You are still hungry."); break; case 3: msg("You are no longer hungry."); break; case 4: msg("You are full!"); break; } /* Change */ notice = TRUE; } /* Food decrease */ else if (new_aux < old_aux) { switch (new_aux) { case 0: msgt(MSG_NOTICE, "You are getting faint from hunger!"); break; case 1: msgt(MSG_NOTICE, "You are getting weak from hunger!"); break; case 2: msgt(MSG_HUNGRY, "You are getting hungry."); break; case 3: msgt(MSG_NOTICE, "You are no longer full."); break; } /* Change */ notice = TRUE; } /* Use the value */ p->food = v; /* Nothing to notice */ if (!notice) return (FALSE); /* Disturb */ disturb(p_ptr, 0, 0); /* Recalculate bonuses */ p->update |= (PU_BONUS); /* Redraw hunger */ p->redraw |= (PR_STATUS); /* Handle stuff */ handle_stuff(p_ptr); /* Result */ return (TRUE); } angband-3.5.1/src/player/Makefile0000644000175000017500000000010012456456606016152 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)extra.mk $(MKPATH)buildsys.mk angband-3.5.1/src/player/player.h0000644000175000017500000004723012456456606016176 0ustar chriscchrisc/* player/player.h - player interface */ #ifndef PLAYER_PLAYER_H #define PLAYER_PLAYER_H #include "guid.h" #include "object/obj-flag.h" #include "object/object.h" #include "option.h" /*** Game constants ***/ #define PY_MAX_EXP 99999999L /* Maximum exp */ #define PY_MAX_GOLD 999999999L /* Maximum gold */ #define PY_MAX_LEVEL 50 /* Maximum level */ /* Player "food" values */ #define PY_FOOD_MAX 17000 /* Food value (Bloated) */ #define PY_FOOD_FULL 10000 /* Food value (Normal) */ #define PY_FOOD_ALERT 2000 /* Food value (Hungry) */ #define PY_FOOD_WEAK 1000 /* Food value (Weak) */ #define PY_FOOD_FAINT 500 /* Food value (Fainting) */ #define PY_FOOD_STARVE 100 /* Food value (Starving) */ /* Player regeneration constants */ #define PY_REGEN_NORMAL 197 /* Regen factor*2^16 when full */ #define PY_REGEN_WEAK 98 /* Regen factor*2^16 when weak */ #define PY_REGEN_FAINT 33 /* Regen factor*2^16 when fainting */ #define PY_REGEN_HPBASE 1442 /* Min amount hp regen*2^16 */ #define PY_REGEN_MNBASE 524 /* Min amount mana regen*2^16 */ /* Maximum number of player spells */ #define PY_MAX_SPELLS 64 /* Flags for player.spell_flags[] */ #define PY_SPELL_LEARNED 0x01 /* Spell has been learned */ #define PY_SPELL_WORKED 0x02 /* Spell has been successfully tried */ #define PY_SPELL_FORGOTTEN 0x04 /* Spell has been forgotten */ /** Inventory **/ /* * Maximum number of "normal" pack slots, and the index of the "overflow" * slot, which can hold an item, but only temporarily, since it causes the * pack to "overflow", dropping the "last" item onto the ground. Since this * value is used as an actual slot, it must be less than "INVEN_WIELD" (below). * Note that "INVEN_PACK" is probably hard-coded by its use in savefiles, and * by the fact that the screen can only show 23 items plus a one-line prompt. */ #define INVEN_PACK 23 /* * Like the previous but takes into account the (variably full quiver). */ #define INVEN_MAX_PACK (INVEN_PACK - p_ptr->quiver_slots) /* * Indexes used for various "equipment" slots (hard-coded by savefiles, etc). */ #define INVEN_WIELD 24 #define INVEN_BOW 25 #define INVEN_LEFT 26 #define INVEN_RIGHT 27 #define INVEN_NECK 28 #define INVEN_LIGHT 29 #define INVEN_BODY 30 #define INVEN_OUTER 31 #define INVEN_ARM 32 #define INVEN_HEAD 33 #define INVEN_HANDS 34 #define INVEN_FEET 35 /* * Total number of inventory slots (hard-coded). */ #define INVEN_TOTAL 36 /* Quiver */ #define QUIVER_START 37 #define QUIVER_SIZE 10 #define QUIVER_END 47 #define ALL_INVEN_TOTAL 47 /* Since no item index can have this value, use it to mean * "no object", so that 0 can be a valid index. */ #define NO_OBJECT (ALL_INVEN_TOTAL+1) /** Sexes **/ /* Maximum number of player "sex" types (see "table.c", etc) */ #define MAX_SEXES 3 /* Player sex constants (hard-coded by save-files, arrays, etc) */ #define SEX_FEMALE 0 #define SEX_MALE 1 #define SEX_NEUTER 2 /* * Timed effects */ enum { TMD_FAST = 0, TMD_SLOW, TMD_BLIND, TMD_PARALYZED, TMD_CONFUSED, TMD_AFRAID, TMD_IMAGE, TMD_POISONED, TMD_CUT, TMD_STUN, TMD_PROTEVIL, TMD_INVULN, TMD_HERO, TMD_SHERO, TMD_SHIELD, TMD_BLESSED, TMD_SINVIS, TMD_SINFRA, TMD_OPP_ACID, TMD_OPP_ELEC, TMD_OPP_FIRE, TMD_OPP_COLD, TMD_OPP_POIS, TMD_OPP_CONF, TMD_AMNESIA, TMD_TELEPATHY, TMD_STONESKIN, TMD_TERROR, TMD_SPRINT, TMD_BOLD, TMD_MAX }; /* * Skill indexes */ enum { SKILL_DISARM, /* Skill: Disarming */ SKILL_DEVICE, /* Skill: Magic Devices */ SKILL_SAVE, /* Skill: Saving throw */ SKILL_STEALTH, /* Skill: Stealth factor */ SKILL_SEARCH, /* Skill: Searching ability */ SKILL_SEARCH_FREQUENCY, /* Skill: Searching frequency */ SKILL_TO_HIT_MELEE, /* Skill: To hit (normal) */ SKILL_TO_HIT_BOW, /* Skill: To hit (shooting) */ SKILL_TO_HIT_THROW, /* Skill: To hit (throwing) */ SKILL_DIGGING, /* Skill: Digging */ SKILL_MAX }; /* * Indexes of the various "stats" (hard-coded by savefiles, etc). */ enum { A_STR = 0, A_INT, A_WIS, A_DEX, A_CON, A_MAX }; /* * Player race and class flags */ enum { #define PF(a,b) PF_##a, #include "list-player-flags.h" #undef PF PF_MAX }; #define PF_SIZE FLAG_SIZE(PF_MAX) #define pf_has(f, flag) flag_has_dbg(f, PF_SIZE, flag, #f, #flag) #define pf_next(f, flag) flag_next(f, PF_SIZE, flag) #define pf_is_empty(f) flag_is_empty(f, PF_SIZE) #define pf_is_full(f) flag_is_full(f, PF_SIZE) #define pf_is_inter(f1, f2) flag_is_inter(f1, f2, PF_SIZE) #define pf_is_subset(f1, f2) flag_is_subset(f1, f2, PF_SIZE) #define pf_is_equal(f1, f2) flag_is_equal(f1, f2, PF_SIZE) #define pf_on(f, flag) flag_on_dbg(f, PF_SIZE, flag, #f, #flag) #define pf_off(f, flag) flag_off(f, PF_SIZE, flag) #define pf_wipe(f) flag_wipe(f, PF_SIZE) #define pf_setall(f) flag_setall(f, PF_SIZE) #define pf_negate(f) flag_negate(f, PF_SIZE) #define pf_copy(f1, f2) flag_copy(f1, f2, PF_SIZE) #define pf_union(f1, f2) flag_union(f1, f2, PF_SIZE) #define pf_comp_union(f1, f2) flag_comp_union(f1, f2, PF_SIZE) #define pf_inter(f1, f2) flag_inter(f1, f2, PF_SIZE) #define pf_diff(f1, f2) flag_diff(f1, f2, PF_SIZE) #define player_has(flag) (pf_has(p_ptr->race->pflags, (flag)) || pf_has(p_ptr->class->pflags, (flag))) /* player_type.noscore flags */ #define NOSCORE_WIZARD 0x0002 #define NOSCORE_DEBUG 0x0008 #define NOSCORE_BORG 0x0010 /*** Structures ***/ /* * All the variable state that changes when you put on/take off equipment. */ typedef struct player_state { s16b speed; /* Current speed */ s16b num_blows; /* Number of blows x100 */ s16b num_shots; /* Number of shots */ byte ammo_mult; /* Ammo multiplier */ byte ammo_tval; /* Ammo variety */ s16b stat_add[A_MAX]; /* Equipment stat bonuses */ s16b stat_ind[A_MAX]; /* Indexes into stat tables */ s16b stat_use[A_MAX]; /* Current modified stats */ s16b stat_top[A_MAX]; /* Maximal modified stats */ s16b dis_ac; /* Known base ac */ s16b ac; /* Base ac */ s16b dis_to_a; /* Known bonus to ac */ s16b to_a; /* Bonus to ac */ s16b to_h; /* Bonus to hit */ s16b dis_to_h; /* Known bonus to hit */ s16b to_d; /* Bonus to dam */ s16b dis_to_d; /* Known bonus to dam */ s16b see_infra; /* Infravision range */ s16b skills[SKILL_MAX]; /* Skills */ u32b noise; /* Derived from stealth */ bool heavy_wield; /* Heavy weapon */ bool heavy_shoot; /* Heavy shooter */ bool icky_wield; /* Icky weapon shooter */ bitflag flags[OF_SIZE]; /* Status flags from race and items */ } player_state; /* * Most of the "player" information goes here. * * This stucture gives us a large collection of player variables. * * This entire structure is wiped when a new character is born. * * This structure is more or less laid out so that the information * which must be saved in the savefile precedes all the information * which can be recomputed as needed. */ typedef struct player { s16b py; /* Player location */ s16b px; /* Player location */ byte psex; /* Sex index */ byte oops; /* Unused */ const struct player_sex *sex; const struct player_race *race; const struct player_class *class; byte hitdie; /* Hit dice (sides) */ byte expfact; /* Experience factor */ s16b age; /* Characters age */ s16b ht; /* Height */ s16b wt; /* Weight */ s32b au; /* Current Gold */ s16b max_depth; /* Max depth */ s16b depth; /* Cur depth */ s16b max_lev; /* Max level */ s16b lev; /* Cur level */ s32b max_exp; /* Max experience */ s32b exp; /* Cur experience */ u16b exp_frac; /* Cur exp frac (times 2^16) */ s16b mhp; /* Max hit pts */ s16b chp; /* Cur hit pts */ u16b chp_frac; /* Cur hit frac (times 2^16) */ s16b msp; /* Max mana pts */ s16b csp; /* Cur mana pts */ u16b csp_frac; /* Cur mana frac (times 2^16) */ s16b stat_max[A_MAX]; /* Current "maximal" stat values */ s16b stat_cur[A_MAX]; /* Current "natural" stat values */ s16b timed[TMD_MAX]; /* Timed effects */ s16b word_recall; /* Word of recall counter */ s16b deep_descent; /* Deep Descent counter */ s16b energy; /* Current energy */ s16b food; /* Current nutrition */ byte confusing; /* Glowing hands */ byte searching; /* Currently searching */ byte unignoring; /* Unignoring */ byte spell_flags[PY_MAX_SPELLS]; /* Spell flags */ byte spell_order[PY_MAX_SPELLS]; /* Spell order */ s16b player_hp[PY_MAX_LEVEL]; /* HP Array */ char died_from[80]; /* Cause of death */ char *history; u16b total_winner; /* Total winner */ u16b panic_save; /* Panic save */ u16b noscore; /* Cheating flags */ bool is_dead; /* Player is dead */ bool wizard; /* Player is in wizard mode */ /*** Temporary fields ***/ bool playing; /* True if player is playing */ bool leaving; /* True if player is leaving */ bool autosave; /* True if autosave is pending */ bool create_up_stair; /* Create up stair on next level */ bool create_down_stair; /* Create down stair on next level */ s32b total_weight; /* Total weight being carried */ s16b inven_cnt; /* Number of items in inventory */ s16b equip_cnt; /* Number of items in equipment */ struct monster *health_who; /* Health bar trackee */ struct monster_race *monster_race; /* Monster race trackee */ s16b object_idx; /* Object trackee */ struct object_kind *object_kind; /* Object kind trackee */ s16b energy_use; /* Energy use this turn */ s16b resting; /* Resting counter */ s16b running; /* Running counter */ bool running_withpathfind; /* Are we using the pathfinder ? */ bool running_firststep; /* Is this our first step running? */ s16b run_cur_dir; /* Direction we are running */ s16b run_old_dir; /* Direction we came from */ bool run_unused; /* Unused (padding field) */ bool run_open_area; /* Looking for an open area */ bool run_break_right; /* Looking for a break (right) */ bool run_break_left; /* Looking for a break (left) */ s16b command_wrk; /* Used by the UI to decide whether to start off showing equipment or inventory listings when offering a choice. See obj/obj-ui.c*/ s16b new_spells; /* Number of spells available */ bool cumber_armor; /* Mana draining armor */ bool cumber_glove; /* Mana draining gloves */ s16b cur_light; /* Radius of light (if any) */ u32b notice; /* Bit flags for pending "special" actions to carry out after the current "action", such as reordering inventory, squelching, etc. */ u32b update; /* Bit flags for recalculations needed after this "action", such as HP, or visible area */ u32b redraw; /* Bit flags for things that /have/ changed, and just need to be redrawn by the UI, such as HP, Speed, etc.*/ u32b total_energy; /* Total energy used (including resting) */ u32b resting_turn; /* Number of player turns spent resting */ /* Generation fields (for quick start) */ s32b au_birth; /* Birth gold when option birth_money is false */ s16b stat_birth[A_MAX]; /* Birth "natural" stat values */ s16b ht_birth; /* Birth Height */ s16b wt_birth; /* Birth Weight */ /* Variable and calculatable player state */ player_state state; /* "cached" quiver statistics*/ u16b quiver_size; u16b quiver_slots; u16b quiver_remainder; struct object *inventory; } player_type; /* * Player sex info */ typedef struct player_sex { const char *title; /* Type of sex */ const char *winner; /* Name of winner */ } player_sex; /* * Player racial info */ struct player_race { struct player_race *next; const char *name; unsigned int ridx; s16b r_adj[A_MAX]; /* Racial stat bonuses */ s16b r_skills[SKILL_MAX]; /* racial skills */ byte r_mhp; /* Race hit-dice modifier */ byte r_exp; /* Race experience factor */ byte b_age; /* base age */ byte m_age; /* mod age */ byte m_b_ht; /* base height (males) */ byte m_m_ht; /* mod height (males) */ byte m_b_wt; /* base weight (males) */ byte m_m_wt; /* mod weight (males) */ byte f_b_ht; /* base height (females) */ byte f_m_ht; /* mod height (females) */ byte f_b_wt; /* base weight (females) */ byte f_m_wt; /* mod weight (females) */ byte infra; /* Infra-vision range */ byte choice; /* Legal class choices */ struct history_chart *history; bitflag flags[OF_SIZE]; /* Racial (object) flags */ bitflag pflags[PF_SIZE]; /* Racial (player) flags */ }; /* * Items the player starts with. Used in player_class and specified in * p_class.txt. */ struct start_item { object_kind *kind; byte min; /* Minimum starting amount */ byte max; /* Maximum starting amount */ struct start_item *next; }; /* * A structure to hold class-dependent information on spells. */ typedef struct { byte slevel; /* Required level (to learn) */ byte smana; /* Required mana (to cast) */ byte sfail; /* Minimum chance of failure */ byte sexp; /* Encoded experience bonus */ } magic_type; /* * Information about the player's magic knowledge */ typedef struct { magic_type info[PY_MAX_SPELLS]; /* The available spells */ } player_magic; /* * Player class info */ typedef struct player_class { struct player_class *next; const char *name; unsigned int cidx; const char *title[10]; /* Titles */ s16b c_adj[A_MAX]; /* Class stat modifier */ s16b c_skills[SKILL_MAX]; /* class skills */ s16b x_skills[SKILL_MAX]; /* extra skills */ s16b c_mhp; /* Class hit-dice adjustment */ s16b c_exp; /* Class experience factor */ bitflag pflags[PF_SIZE]; /* Class (player) flags */ u16b max_attacks; /* Maximum possible attacks */ u16b min_weight; /* Minimum weapon weight for calculations */ u16b att_multiply; /* Multiplier for attack calculations */ byte spell_book; /* Tval of spell books (if any) */ u16b spell_stat; /* Stat for spells (if any) */ u16b spell_first; /* Level of first spell */ u16b spell_weight; /* Weight that hurts spells */ u32b sense_base; /* Base pseudo-id value */ u16b sense_div; /* Pseudo-id divisor */ struct start_item *start_items; /* Starting inventory */ player_magic spells; /* Magic spells */ } player_class; /* * Histories are a graph of charts; each chart contains a set of individual * entries for that chart, and each entry contains a text description and a * successor chart to move history generation to. * For example: * chart 1 { * entry { * desc "You are the illegitimate and unacknowledged child"; * next 2; * }; * entry { * desc "You are the illegitimate but acknowledged child"; * next 2; * }; * entry { * desc "You are one of several children"; * next 3; * }; * }; * * History generation works by walking the graph from the starting chart for * each race, picking a random entry (with weighted probability) each time. */ struct history_entry { struct history_entry *next; struct history_chart *succ; int isucc; int roll; char *text; }; struct history_chart { struct history_chart *next; struct history_entry *entries; unsigned int idx; }; /* * Some more player information * This information is retained across player lives * * XXX - options.c should store most of this, and struct player the rest */ typedef struct { char full_name[32]; /* Full name */ bool opt[OPT_MAX]; /* Options */ u32b window_flag[ANGBAND_TERM_MAX]; /* Window flags */ byte hitpoint_warn; /* Hitpoint warning (0 to 9) */ byte delay_factor; /* Delay factor (0 to 9) */ byte name_suffix; /* numeric suffix for player name */ } player_other; /*** Externs ***/ /* * The range of possible indexes into tables based upon stats. * Currently things range from 3 to 18/220 = 40. */ #define STAT_RANGE 38 /* calcs.c */ extern const byte adj_str_blow[STAT_RANGE]; extern const byte adj_dex_safe[STAT_RANGE]; extern const byte adj_con_fix[STAT_RANGE]; extern const byte adj_str_hold[STAT_RANGE]; #ifdef ALLOW_BORG extern const byte adj_int_dev[STAT_RANGE]; extern const byte adj_wis_sav[STAT_RANGE]; extern const byte adj_dex_dis[STAT_RANGE]; extern const byte adj_int_dis[STAT_RANGE]; extern const byte adj_dex_ta[STAT_RANGE]; extern const byte adj_str_td[STAT_RANGE]; extern const byte adj_dex_th[STAT_RANGE]; extern const byte adj_str_th[STAT_RANGE]; extern const byte adj_str_wgt[STAT_RANGE]; extern const byte adj_str_dig[STAT_RANGE]; extern const byte adj_dex_blow[STAT_RANGE]; extern const int adj_con_mhp[STAT_RANGE]; extern const int adj_mag_study[STAT_RANGE]; extern const int adj_mag_mana[STAT_RANGE]; extern const byte blows_table[12][12]; #endif void calc_bonuses(object_type inventory[], player_state *state, bool id_only); int calc_blows(const object_type *o_ptr, player_state *state, int extra_blows); void notice_stuff(struct player *p); void update_stuff(struct player *p); void redraw_stuff(struct player *p); void handle_stuff(struct player *p); int weight_remaining(void); /* class.c */ extern struct player_class *player_id2class(guid id); /* player.c */ /** XXX These do not belong here **/ extern void health_track(struct player *p, struct monster *m_ptr); extern void monster_race_track(struct monster_race *race); extern void track_object(int item); extern void track_object_kind(struct object_kind *kind); extern bool tracked_object_is(int item); extern bool player_stat_inc(struct player *p, int stat); extern bool player_stat_dec(struct player *p, int stat, bool permanent); extern void player_exp_gain(struct player *p, s32b amount); extern void player_exp_lose(struct player *p, s32b amount, bool permanent); extern byte player_hp_attr(struct player *p); extern byte player_sp_attr(struct player *p); extern bool player_restore_mana(struct player *p, int amt); extern const char *player_safe_name(struct player *p, bool strip_suffix); /* race.c */ extern struct player_race *player_id2race(guid id); /* spell.c */ #ifdef ALLOW_BORG extern const byte adj_mag_fail[STAT_RANGE]; extern const int adj_mag_stat[STAT_RANGE]; #endif int spell_collect_from_book(const object_type *o_ptr, int *spells); int spell_book_count_spells(const object_type *o_ptr, bool (*tester)(int spell)); bool spell_okay_list(bool (*spell_test)(int spell), const int spells[], int n_spells); bool spell_okay_to_cast(int spell); bool spell_okay_to_study(int spell); bool spell_okay_to_browse(int spell); bool spell_in_book(int spell, int book); s16b spell_chance(int spell); void spell_learn(int spell); bool spell_cast(int spell, int dir); /* timed.c */ bool player_set_timed(struct player *p, int idx, int v, bool notify); bool player_inc_timed(struct player *p, int idx, int v, bool notify, bool check); bool player_dec_timed(struct player *p, int idx, int v, bool notify); bool player_clear_timed(struct player *p, int idx, bool notify); bool player_set_food(struct player *p, int v); /* util.c */ s16b modify_stat_value(int value, int amount); bool player_can_cast(struct player *p, bool show_msg); bool player_can_study(struct player *p, bool show_msg); bool player_can_read(struct player *p, bool show_msg); bool player_can_fire(struct player *p, bool show_msg); bool player_can_refuel(struct player *p, bool show_msg); bool player_can_cast_prereq(void); bool player_can_study_prereq(void); bool player_can_read_prereq(void); bool player_can_fire_prereq(void); bool player_can_refuel_prereq(void); bool player_book_has_unlearned_spells(struct player *p); bool player_confuse_dir(struct player *p, int *dir, bool too); bool player_resting_is_special(s16b count); bool player_is_resting(struct player *p); s16b player_resting_count(struct player *p); void player_resting_set_count(struct player *p, s16b count); void player_resting_cancel(struct player *p); bool player_resting_can_regenerate(struct player *p); void player_resting_step_turn(struct player *p); void player_resting_complete_special(struct player *p); #endif /* !PLAYER_PLAYER_H */ angband-3.5.1/src/player/class.c0000644000175000017500000000045012456456606015773 0ustar chriscchrisc/* player/class.c * Copyright (c) 2011 elly+angband@leptoquark.net. See COPYING. */ #include "externs.h" #include "player/player.h" struct player_class *player_id2class(guid id) { struct player_class *c; for (c = classes; c; c = c->next) if (guid_eq(c->cidx, id)) break; return c; } angband-3.5.1/src/Makefile.win0000644000175000017500000000530012456456606015461 0ustar chriscchrisc# # Makefile for Windows systems using gmake # # # Try "make" to do a default build, using cygwin. # # Try "make CONSOLE=yes" to use PDCurses, as long as you set # PDCURSES_INCLUDE_DIR and PDCURSES_LIB. # # Other options: # OBJ_DIR=x will place .o files into directory 'x' # MINGW=yes will use the mingw compiler # # Executable name and default target EXE = angband.exe all: ../$(EXE) ifneq (,$(findstring \SYSTEM32,$(PATH))) dos = TRUE endif ifneq (,$(findstring \system32,$(PATH))) dos = TRUE endif ifdef dos CP = copy RM = del BAR = "\" else CP = -cp RM = -rm BAR = "/" endif ifndef MINGW CYGWIN=yes endif # Include list of object files and add system-specific ones include Makefile.inc MAINFILES="$(WINMAINFILES)" ifdef CONSOLE CFLAGS = -DUSE_GCU -DWIN32_CONSOLE_MODE -I$(PDCURSES_INC) LIBS = -s $(PDCURSES_LIB) IOBJS = $(BASEOBJS) main-gcu.o main.o #PDCURSES_INC = ../../pdcurses/include #PDCURSES_LIB = ../../pdcurses/lib/pdcurses.a else CFLAGS = -DWINDOWS -static CFLAGS += -Iwin/include -Lwin/lib LDFLAGS += -Lwin/lib IOBJS = $(BASEOBJS) win/angband.res main-win.o win/readdib.o win/readpng.o win/scrnshot.o win/win-layout.o LIBS = -mwindows -lwinmm -lzlib -llibpng -lmsimg32 endif CC = $(CROSS)gcc WRES = $(CROSS)windres WARNINGS = -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers CFLAGS += $(WARNINGS) -std=c99 -Wdeclaration-after-statement -O2 -I. ifdef BUILD_ID CFLAGS += -DBUILD_ID="$(BUILD_ID)" endif ifdef CYGWIN LIBS += -mno-cygwin -e _mainCRTStartup CFLAGS += -mno-cygwin # Note the additional -DNEAR= flag to cope with the 'NEAR' # keyword used in readdib.c win/readdib.o: win/readdib.c win/readdib.h $(CC) $(CFLAGS) -DNEAR= $(INCDIRS) -c -o $@ $< win/readpng.o: win/readpng.c win/readdib.h $(CC) $(CFLAGS) -DNEAR= $(INCDIRS) -c -o $@ $< endif # Handle cross compiles ifdef CROSS CFLAGS += -DCROSS_COMPILE ifdef MINGW # This is an issue on mingw32 on linux CFLAGS += -D_stdcall= endif endif # Handle object output in a different directory ifdef OBJDIR OBJS = $(patsubst %.o, $(OBJDIR)%.o, $(IOBJS)) mkdirs:; -mkdir -p $(OBJDIR) $(OBJDIR)win $(EXE): mkdirs else OBJS = $(IOBJS) endif # # Targets # ../$(EXE): $(EXE) $(CP) $(EXE) .. $(CP) win$(BAR)dll$(BAR)libpng12.dll .. $(CP) win$(BAR)dll$(BAR)zlib1.dll .. $(EXE): $(OBJS) $(CC) $(CFLAGS) -o $(EXE) $(OBJS) $(LIBS) clean: $(RM) -f $(EXE) $(OBJS) $(RM) -f libpng12.dll $(RM) -f zlib1.dll # # Rules # win/angband.res: win/angband.rc $(WRES) $< -O coff -o $@ $(OBJDIR)%.o: %.c $(INCS) $(CC) $(CFLAGS) -c -o $@ $< angband-3.5.1/src/load.c0000644000175000017500000013654012456456606014323 0ustar chriscchrisc/* * File: load.c * Purpose: Savefile loading functions * * Copyright (c) 1997 Ben Harrison, and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "dungeon.h" #include "history.h" #include "monster/mon-make.h" #include "monster/mon-spell.h" #include "object/tvalsval.h" #include "savefile.h" #include "squelch.h" #include "quest.h" /* Object constants */ byte max_pvals = 0; byte of_size = 0; /* Monster constants */ byte monster_blow_max = 0; byte rf_size = 0; byte rsf_size = 0; /* Shorthand function pointer for rd_item version */ typedef int (*rd_item_t)(object_type *o_ptr); /** * Find an ego item from its index */ static struct ego_item *lookup_ego(int idx) { if (idx > 0 && idx < z_info->e_max) return &e_info[idx]; return NULL; } /* * Read an object, version 6 (variable flags) * * This function no longer attempts to "repair" old savefiles - the info * held in o_ptr is now authoritative. */ static int rd_item_6(object_type *o_ptr) { byte tmp8u; u16b tmp16u; byte ego_idx; byte art_idx; size_t i, j; char buf[128]; byte ver = 1; rd_u16b(&tmp16u); rd_byte(&ver); assert(tmp16u == 0xffff); strip_bytes(2); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); for (i = 0; i < max_pvals; i++) { rd_s16b(&o_ptr->pval[i]); } rd_byte(&o_ptr->num_pvals); /* Pseudo-ID bit */ rd_byte(&tmp8u); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&art_idx); rd_byte(&ego_idx); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&o_ptr->dd); rd_byte(&o_ptr->ds); rd_u16b(&o_ptr->ident); rd_byte(&o_ptr->marked); rd_byte(&o_ptr->origin); rd_byte(&o_ptr->origin_depth); rd_u16b(&o_ptr->origin_xtra); rd_byte(&o_ptr->ignore); for (i = 0; i < of_size; i++) rd_byte(&o_ptr->flags[i]); of_wipe(o_ptr->known_flags); for (i = 0; i < of_size; i++) rd_byte(&o_ptr->known_flags[i]); for (j = 0; j < max_pvals; j++) { for (i = 0; i < of_size; i++) rd_byte(&o_ptr->pval_flags[j][i]); } /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); rd_s16b(&o_ptr->mimicking_m_idx); /* Save the inscription */ rd_string(buf, sizeof(buf)); if (buf[0]) o_ptr->note = quark_add(buf); /* Lookup item kind */ o_ptr->kind = lookup_kind(o_ptr->tval, o_ptr->sval); if (!o_ptr->kind) return 0; o_ptr->ego = lookup_ego(ego_idx); if (art_idx >= z_info->a_max) return -1; if (art_idx > 0) o_ptr->artifact = &a_info[art_idx]; /* Success */ return (0); } /* * Read an object, version 5 (added mimicking_o_idx) * * This function no longer attempts to "repair" old savefiles - the info * held in o_ptr is now authoritative. */ static int rd_item_5(object_type *o_ptr) { byte tmp8u; u16b tmp16u; byte ego_idx; byte art_idx; size_t i, j; char buf[128]; byte ver = 1; rd_u16b(&tmp16u); rd_byte(&ver); assert(tmp16u == 0xffff); strip_bytes(2); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); for (i = 0; i < MAX_PVALS; i++) { rd_s16b(&o_ptr->pval[i]); } rd_byte(&o_ptr->num_pvals); /* Pseudo-ID bit */ rd_byte(&tmp8u); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&art_idx); rd_byte(&ego_idx); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&o_ptr->dd); rd_byte(&o_ptr->ds); rd_u16b(&o_ptr->ident); rd_byte(&o_ptr->marked); rd_byte(&o_ptr->origin); rd_byte(&o_ptr->origin_depth); rd_u16b(&o_ptr->origin_xtra); rd_byte(&o_ptr->ignore); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); of_wipe(o_ptr->known_flags); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->known_flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); for (j = 0; j < MAX_PVALS; j++) { for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->pval_flags[j][i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); } /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); rd_s16b(&o_ptr->mimicking_m_idx); /* Save the inscription */ rd_string(buf, sizeof(buf)); if (buf[0]) o_ptr->note = quark_add(buf); /* Lookup item kind */ o_ptr->kind = lookup_kind(o_ptr->tval, o_ptr->sval); if (!o_ptr->kind) return 0; o_ptr->ego = lookup_ego(ego_idx); if (art_idx >= z_info->a_max) return -1; if (art_idx > 0) o_ptr->artifact = &a_info[art_idx]; /* Success */ return (0); } /* * Read an object, version 4 (added mimicking_o_idx) * * This function no longer attempts to "repair" old savefiles - the info * held in o_ptr is now authoritative. */ static int rd_item_4(object_type *o_ptr) { byte tmp8u; u16b tmp16u; byte ego_idx; byte art_idx; size_t i, j; char buf[128]; byte ver = 1; rd_u16b(&tmp16u); rd_byte(&ver); assert(tmp16u == 0xffff); strip_bytes(2); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); for (i = 0; i < MAX_PVALS; i++) { rd_s16b(&o_ptr->pval[i]); } rd_byte(&o_ptr->num_pvals); /* Pseudo-ID bit */ rd_byte(&tmp8u); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&art_idx); rd_byte(&ego_idx); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&o_ptr->dd); rd_byte(&o_ptr->ds); rd_u16b(&o_ptr->ident); rd_byte(&o_ptr->marked); rd_byte(&o_ptr->origin); rd_byte(&o_ptr->origin_depth); rd_u16b(&o_ptr->origin_xtra); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); of_wipe(o_ptr->known_flags); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->known_flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); for (j = 0; j < MAX_PVALS; j++) { for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->pval_flags[j][i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); } /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); rd_s16b(&o_ptr->mimicking_m_idx); /* Save the inscription */ rd_string(buf, sizeof(buf)); if (buf[0]) o_ptr->note = quark_add(buf); /* Lookup item kind */ o_ptr->kind = lookup_kind(o_ptr->tval, o_ptr->sval); if (!o_ptr->kind) return 0; o_ptr->ego = lookup_ego(ego_idx); if (art_idx >= z_info->a_max) return -1; if (art_idx > 0) o_ptr->artifact = &a_info[art_idx]; /* Success */ return (0); } /* * Read an object, version 3 * * This function attempts to "repair" old savefiles, and to extract * the most up to date values for various object fields. */ static int rd_item_3(object_type *o_ptr) { byte old_dd; byte old_ds; byte tmp8u; u16b tmp16u; byte ego_idx; byte art_idx; size_t i, j; char buf[128]; byte ver = 1; rd_u16b(&tmp16u); rd_byte(&ver); assert(tmp16u == 0xffff); strip_bytes(2); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); for (i = 0; i < MAX_PVALS; i++) { rd_s16b(&o_ptr->pval[i]); } rd_byte(&o_ptr->num_pvals); /* Pseudo-ID bit */ rd_byte(&tmp8u); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&art_idx); rd_byte(&ego_idx); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&old_dd); rd_byte(&old_ds); rd_u16b(&o_ptr->ident); rd_byte(&o_ptr->marked); rd_byte(&o_ptr->origin); rd_byte(&o_ptr->origin_depth); rd_u16b(&o_ptr->origin_xtra); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); of_wipe(o_ptr->known_flags); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->known_flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); for (j = 0; j < MAX_PVALS; j++) { for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->pval_flags[j][i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); } /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); /* Save the inscription */ rd_string(buf, sizeof(buf)); if (buf[0]) o_ptr->note = quark_add(buf); /* Lookup item kind */ o_ptr->kind = lookup_kind(o_ptr->tval, o_ptr->sval); if (!o_ptr->kind) return 0; o_ptr->ego = lookup_ego(ego_idx); if (art_idx >= z_info->a_max) return -1; if (art_idx > 0) o_ptr->artifact = &a_info[art_idx]; /* Repair non "wearable" items */ if (!wearable_p(o_ptr)) { /* Get the correct fields */ if (!randcalc_valid(o_ptr->kind->to_h, o_ptr->to_h)) o_ptr->to_h = randcalc(o_ptr->kind->to_h, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_d, o_ptr->to_d)) o_ptr->to_d = randcalc(o_ptr->kind->to_d, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_a, o_ptr->to_a)) o_ptr->to_a = randcalc(o_ptr->kind->to_a, o_ptr->origin_depth, RANDOMISE); /* Get the correct fields */ o_ptr->ac = o_ptr->kind->ac; o_ptr->dd = o_ptr->kind->dd; o_ptr->ds = o_ptr->kind->ds; /* Get the correct weight */ o_ptr->weight = o_ptr->kind->weight; /* All done */ return (0); } /* Get the standard fields */ o_ptr->ac = o_ptr->kind->ac; o_ptr->dd = o_ptr->kind->dd; o_ptr->ds = o_ptr->kind->ds; /* Get the standard weight */ o_ptr->weight = o_ptr->kind->weight; /* Artifacts */ if (o_ptr->artifact) { /* Get the new artifact "pvals" */ for (i = 0; i < MAX_PVALS; i++) o_ptr->pval[i] = o_ptr->artifact->pval[i]; o_ptr->num_pvals = o_ptr->artifact->num_pvals; /* Get the new artifact fields */ o_ptr->ac = o_ptr->artifact->ac; o_ptr->dd = o_ptr->artifact->dd; o_ptr->ds = o_ptr->artifact->ds; /* Get the new artifact weight */ o_ptr->weight = o_ptr->artifact->weight; } /* Ego items */ if (o_ptr->ego) { /* Hack -- keep some old fields */ if ((o_ptr->dd < old_dd) && (o_ptr->ds == old_ds)) /* Keep old boosted damage dice */ o_ptr->dd = old_dd; ego_min_pvals(o_ptr); } /* Success */ return (0); } /* * Read an object, version 2 - remove after 3.3 * * This function attempts to "repair" old savefiles, and to extract * the most up to date values for various object fields. It also copies flags * and pval_flags properly, now that they are canonical. */ static int rd_item_2(object_type *o_ptr) { byte old_dd; byte old_ds; byte tmp8u; u16b tmp16u; byte ego_idx; byte art_idx; size_t i, j; char buf[128]; byte ver = 1; rd_u16b(&tmp16u); rd_byte(&ver); assert(tmp16u == 0xffff); strip_bytes(2); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); for (i = 0; i < MAX_PVALS; i++) { rd_s16b(&o_ptr->pval[i]); } rd_byte(&o_ptr->num_pvals); /* Pseudo-ID bit */ rd_byte(&tmp8u); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&art_idx); rd_byte(&ego_idx); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&old_dd); rd_byte(&old_ds); rd_u16b(&o_ptr->ident); rd_byte(&o_ptr->marked); rd_byte(&o_ptr->origin); rd_byte(&o_ptr->origin_depth); rd_u16b(&o_ptr->origin_xtra); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); of_wipe(o_ptr->known_flags); for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->known_flags[i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); for (j = 0; j < MAX_PVALS; j++) { for (i = 0; i < OF_BYTES && i < OF_SIZE; i++) rd_byte(&o_ptr->pval_flags[j][i]); if (i < OF_BYTES) strip_bytes(OF_BYTES - i); } /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); /* Save the inscription */ rd_string(buf, sizeof(buf)); if (buf[0]) o_ptr->note = quark_add(buf); /* Lookup item kind */ o_ptr->kind = lookup_kind(o_ptr->tval, o_ptr->sval); if (!o_ptr->kind) return 0; o_ptr->ego = lookup_ego(ego_idx); if (art_idx >= z_info->a_max) return -1; if (art_idx > 0) o_ptr->artifact = &a_info[art_idx]; /* Repair non "wearable" items */ if (!wearable_p(o_ptr)) { /* Get the correct fields */ if (!randcalc_valid(o_ptr->kind->to_h, o_ptr->to_h)) o_ptr->to_h = randcalc(o_ptr->kind->to_h, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_d, o_ptr->to_d)) o_ptr->to_d = randcalc(o_ptr->kind->to_d, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_a, o_ptr->to_a)) o_ptr->to_a = randcalc(o_ptr->kind->to_a, o_ptr->origin_depth, RANDOMISE); } /* Get the standard fields and flags*/ o_ptr->ac = o_ptr->kind->ac; o_ptr->dd = o_ptr->kind->dd; o_ptr->ds = o_ptr->kind->ds; o_ptr->weight = o_ptr->kind->weight; of_union(o_ptr->flags, o_ptr->kind->base->flags); of_union(o_ptr->flags, o_ptr->kind->flags); for (i = 0; i < o_ptr->kind->num_pvals; i++) of_union(o_ptr->pval_flags[i], o_ptr->kind->pval_flags[i]); /* Artifacts */ if (o_ptr->artifact) copy_artifact_data(o_ptr, o_ptr->artifact); /* Ego items */ if (o_ptr->ego) { bitflag pval_mask[OF_SIZE]; of_union(o_ptr->flags, o_ptr->ego->flags); /* Hack -- keep some old fields */ if ((o_ptr->dd < old_dd) && (o_ptr->ds == old_ds)) /* Keep old boosted damage dice */ o_ptr->dd = old_dd; create_mask(pval_mask, FALSE, OFT_PVAL, OFT_STAT, OFT_MAX); /* Hack -- enforce legal pval, and apply pval flags */ for (i = 0; i < MAX_PVALS; i++) { if (of_is_inter(o_ptr->ego->pval_flags[i], pval_mask)) { of_union(o_ptr->pval_flags[i], o_ptr->ego->pval_flags[i]); if (!o_ptr->pval[i]) o_ptr->pval[i] = o_ptr->ego->min_pval[i]; } } } /* Success */ return (0); } /** * Read an object - remove for the version after 3.3 */ static int rd_item_1(object_type *o_ptr) { byte old_dd; byte old_ds; byte tmp8u; u16b tmp16u; byte art_idx; byte ego_idx; size_t i; char buf[128]; byte ver = 1; rd_u16b(&tmp16u); rd_byte(&ver); assert(tmp16u == 0xffff); strip_bytes(2); /* Location */ rd_byte(&o_ptr->iy); rd_byte(&o_ptr->ix); /* Type/Subtype */ rd_byte(&o_ptr->tval); rd_byte(&o_ptr->sval); rd_s16b(&o_ptr->pval[DEFAULT_PVAL]); if (o_ptr->pval[DEFAULT_PVAL]) o_ptr->num_pvals = 1; else o_ptr->num_pvals = 0; /* Pseudo-ID bit */ rd_byte(&tmp8u); rd_byte(&o_ptr->number); rd_s16b(&o_ptr->weight); rd_byte(&art_idx); rd_byte(&ego_idx); rd_s16b(&o_ptr->timeout); rd_s16b(&o_ptr->to_h); rd_s16b(&o_ptr->to_d); rd_s16b(&o_ptr->to_a); rd_s16b(&o_ptr->ac); rd_byte(&old_dd); rd_byte(&old_ds); rd_u16b(&o_ptr->ident); rd_byte(&o_ptr->marked); rd_byte(&o_ptr->origin); rd_byte(&o_ptr->origin_depth); rd_u16b(&o_ptr->origin_xtra); /* Hack - XXX - MarbleDice - Maximum saveable flags = 96 */ for (i = 0; i < 12 && i < OF_SIZE; i++) rd_byte(&o_ptr->flags[i]); if (i < 12) strip_bytes(12 - i); of_wipe(o_ptr->known_flags); /* Hack - XXX - MarbleDice - Maximum saveable flags = 96 */ for (i = 0; i < 12 && i < OF_SIZE; i++) rd_byte(&o_ptr->known_flags[i]); if (i < 12) strip_bytes(12 - i); /* Monster holding object */ rd_s16b(&o_ptr->held_m_idx); rd_string(buf, sizeof(buf)); /* Save the inscription */ if (buf[0]) o_ptr->note = quark_add(buf); o_ptr->kind = lookup_kind(o_ptr->tval, o_ptr->sval); if (!o_ptr->kind) return 0; o_ptr->ego = lookup_ego(ego_idx); if (art_idx >= z_info->a_max) return -1; if (art_idx > 0) o_ptr->artifact = &a_info[art_idx]; /* Repair non "wearable" items */ if (!wearable_p(o_ptr)) { /* Get the correct fields */ if (!randcalc_valid(o_ptr->kind->to_h, o_ptr->to_h)) o_ptr->to_h = randcalc(o_ptr->kind->to_h, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_d, o_ptr->to_d)) o_ptr->to_d = randcalc(o_ptr->kind->to_d, o_ptr->origin_depth, RANDOMISE); if (!randcalc_valid(o_ptr->kind->to_a, o_ptr->to_a)) o_ptr->to_a = randcalc(o_ptr->kind->to_a, o_ptr->origin_depth, RANDOMISE); } /* Get the standard fields and flags*/ o_ptr->ac = o_ptr->kind->ac; o_ptr->dd = o_ptr->kind->dd; o_ptr->ds = o_ptr->kind->ds; o_ptr->weight = o_ptr->kind->weight; of_union(o_ptr->flags, o_ptr->kind->base->flags); of_union(o_ptr->flags, o_ptr->kind->flags); for (i = 0; i < o_ptr->kind->num_pvals; i++) of_union(o_ptr->pval_flags[DEFAULT_PVAL], o_ptr->kind->pval_flags[i]); /* Artifacts */ if (o_ptr->artifact) copy_artifact_data(o_ptr, o_ptr->artifact); /* Ego items */ if (o_ptr->ego) { bitflag pval_mask[OF_SIZE]; of_union(o_ptr->flags, o_ptr->ego->flags); /* Hack -- keep some old fields */ if ((o_ptr->dd < old_dd) && (o_ptr->ds == old_ds)) /* Keep old boosted damage dice */ o_ptr->dd = old_dd; create_mask(pval_mask, FALSE, OFT_PVAL, OFT_STAT, OFT_MAX); /* Hack -- enforce legal pval, and apply pval flags */ for (i = 0; i < MAX_PVALS; i++) { if (of_is_inter(o_ptr->ego->pval_flags[i], pval_mask)) { of_union(o_ptr->pval_flags[DEFAULT_PVAL], o_ptr->ego->pval_flags[i]); if (o_ptr->pval[DEFAULT_PVAL] < o_ptr->ego->min_pval[i]) o_ptr->pval[DEFAULT_PVAL] = o_ptr->ego->min_pval[i]; } } } /* Success */ return (0); } /** * Read RNG state * * There were originally 64 bytes of randomizer saved. Now we only need * 32 + 5 bytes saved, so we'll read an extra 27 bytes at the end which won't * be used. */ int rd_randomizer(void) { int i; u32b noop; /* current value for the simple RNG */ rd_u32b(&Rand_value); /* state index */ rd_u32b(&state_i); /* for safety, make sure state_i < RAND_DEG */ state_i = state_i % RAND_DEG; /* RNG variables */ rd_u32b(&z0); rd_u32b(&z1); rd_u32b(&z2); /* RNG state */ for (i = 0; i < RAND_DEG; i++) rd_u32b(&STATE[i]); /* NULL padding */ for (i = 0; i < 59 - RAND_DEG; i++) rd_u32b(&noop); Rand_quick = FALSE; return 0; } /* * Read options, version 2. */ int rd_options_2(void) { int i, n; byte b; u16b tmp16u; u32b window_flag[ANGBAND_TERM_MAX]; u32b window_mask[ANGBAND_TERM_MAX]; /*** Special info */ /* Read "delay_factor" */ rd_byte(&b); op_ptr->delay_factor = b; /* Read "hitpoint_warn" */ rd_byte(&b); op_ptr->hitpoint_warn = b; /* Read lazy movement delay */ rd_u16b(&tmp16u); lazymove_delay = (tmp16u < 1000) ? tmp16u : 0; /*** Normal Options ***/ while (1) { byte value; char name[20]; rd_string(name, sizeof name); if (!name[0]) break; rd_byte(&value); option_set(name, !!value); } /*** Window Options ***/ for (n = 0; n < ANGBAND_TERM_MAX; n++) rd_u32b(&window_flag[n]); for (n = 0; n < ANGBAND_TERM_MAX; n++) rd_u32b(&window_mask[n]); /* Analyze the options */ for (n = 0; n < ANGBAND_TERM_MAX; n++) { /* Analyze the options */ for (i = 0; i < 32; i++) { /* Process valid flags */ if (window_flag_desc[i]) { /* Blank invalid flags */ if (!(window_mask[n] & (1L << i))) { window_flag[n] &= ~(1L << i); } } } } /* Set up the subwindows */ subwindows_set_flags(window_flag, ANGBAND_TERM_MAX); return 0; } /* * Read the saved messages */ int rd_messages(void) { int i; char buf[128]; u16b tmp16u; s16b num; /* Total */ rd_s16b(&num); /* Read the messages */ for (i = 0; i < num; i++) { /* Read the message */ rd_string(buf, sizeof(buf)); /* Read the message type */ rd_u16b(&tmp16u); /* Save the message */ message_add(buf, tmp16u); } return 0; } /* Read monster memory, version 3 */ int rd_monster_memory_3(void) { int r_idx; u16b tmp16u; /* Monster Memory */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > z_info->r_max) { note(format("Too many (%u) monster races!", tmp16u)); return (-1); } /* Monster flags */ rd_byte(&rf_size); /* Incompatible save files */ if (rf_size > RF_SIZE) { note(format("Too many (%u) monster flags!", rf_size)); return (-1); } /* Monster spell flags */ rd_byte(&rsf_size); /* Incompatible save files */ if (rsf_size > RSF_SIZE) { note(format("Too many (%u) monster spell flags!", rsf_size)); return (-1); } /* Monster blows */ rd_byte(&monster_blow_max); /* Incompatible save files */ if (monster_blow_max > MONSTER_BLOW_MAX) { note(format("Too many (%u) monster blows!", monster_blow_max)); return (-1); } /* Read the available records */ for (r_idx = 0; r_idx < tmp16u; r_idx++) { size_t i; monster_race *r_ptr = &r_info[r_idx]; monster_lore *l_ptr = &l_list[r_idx]; /* Count sights/deaths/kills */ rd_s16b(&l_ptr->sights); rd_s16b(&l_ptr->deaths); rd_s16b(&l_ptr->pkills); rd_s16b(&l_ptr->tkills); /* Count wakes and ignores */ rd_byte(&l_ptr->wake); rd_byte(&l_ptr->ignore); /* Count drops */ rd_byte(&l_ptr->drop_gold); rd_byte(&l_ptr->drop_item); /* Count spells */ rd_byte(&l_ptr->cast_innate); rd_byte(&l_ptr->cast_spell); /* Count blows of each type */ for (i = 0; i < monster_blow_max; i++) rd_byte(&l_ptr->blows[i]); /* Memorize flags */ for (i = 0; i < rf_size; i++) rd_byte(&l_ptr->flags[i]); for (i = 0; i < rsf_size; i++) rd_byte(&l_ptr->spell_flags[i]); /* Read the "Racial" monster limit per level */ rd_byte(&r_ptr->max_num); /* XXX */ strip_bytes(3); /* Repair the spell lore flags */ rsf_inter(l_ptr->spell_flags, r_ptr->spell_flags); } return 0; } /* Read monster memory, version 2 */ int rd_monster_memory_2(void) { int r_idx; u16b tmp16u; /* Monster Memory */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > z_info->r_max) { note(format("Too many (%u) monster races!", tmp16u)); return (-1); } /* Read the available records */ for (r_idx = 0; r_idx < tmp16u; r_idx++) { size_t i; monster_race *r_ptr = &r_info[r_idx]; monster_lore *l_ptr = &l_list[r_idx]; /* Count sights/deaths/kills */ rd_s16b(&l_ptr->sights); rd_s16b(&l_ptr->deaths); rd_s16b(&l_ptr->pkills); rd_s16b(&l_ptr->tkills); /* Count wakes and ignores */ rd_byte(&l_ptr->wake); rd_byte(&l_ptr->ignore); /* Count drops */ rd_byte(&l_ptr->drop_gold); rd_byte(&l_ptr->drop_item); /* Count spells */ rd_byte(&l_ptr->cast_innate); rd_byte(&l_ptr->cast_spell); /* Count blows of each type */ for (i = 0; i < MONSTER_BLOW_MAX; i++) rd_byte(&l_ptr->blows[i]); /* Memorize flags */ for (i = 0; i < RF_BYTES && i < RF_SIZE; i++) rd_byte(&l_ptr->flags[i]); if (i < RF_BYTES) strip_bytes(RF_BYTES - i); for (i = 0; i < RF_BYTES && i < RSF_SIZE; i++) rd_byte(&l_ptr->spell_flags[i]); if (i < RF_BYTES) strip_bytes(RF_BYTES - i); /* Read the "Racial" monster limit per level */ rd_byte(&r_ptr->max_num); /* XXX */ strip_bytes(3); /* Repair the spell lore flags */ rsf_inter(l_ptr->spell_flags, r_ptr->spell_flags); } return 0; } int rd_object_memory_2(void) { int i; u16b tmp16u; /* Object Memory */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > z_info->k_max) { note(format("Too many (%u) object kinds!", tmp16u)); return (-1); } /* Object flags */ rd_byte(&of_size); /* Incompatible save files */ if (of_size > OF_SIZE) { note(format("Too many (%u) object flags!", of_size)); return (-1); } /* Max pvals */ rd_byte(&max_pvals); /* Incompatible save files */ if (max_pvals > MAX_PVALS) { note(format("Too many (%u) pvals allowed!", max_pvals)); return (-1); } /* Read the object memory */ for (i = 0; i < tmp16u; i++) { byte tmp8u; object_kind *k_ptr = &k_info[i]; rd_byte(&tmp8u); k_ptr->aware = (tmp8u & 0x01) ? TRUE : FALSE; k_ptr->tried = (tmp8u & 0x02) ? TRUE : FALSE; k_ptr->everseen = (tmp8u & 0x08) ? TRUE : FALSE; if (tmp8u & 0x04) kind_squelch_when_aware(k_ptr); if (tmp8u & 0x10) kind_squelch_when_unaware(k_ptr); } return 0; } int rd_object_memory_1(void) { int i; u16b tmp16u; /* Object Memory */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > z_info->k_max) { note(format("Too many (%u) object kinds!", tmp16u)); return (-1); } /* Read the object memory */ for (i = 0; i < tmp16u; i++) { byte tmp8u; object_kind *k_ptr = &k_info[i]; rd_byte(&tmp8u); k_ptr->aware = (tmp8u & 0x01) ? TRUE : FALSE; k_ptr->tried = (tmp8u & 0x02) ? TRUE : FALSE; k_ptr->everseen = (tmp8u & 0x08) ? TRUE : FALSE; if (tmp8u & 0x04) kind_squelch_when_aware(k_ptr); if (tmp8u & 0x10) kind_squelch_when_unaware(k_ptr); } return 0; } int rd_quests(void) { int i; u16b tmp16u; /* Load the Quests */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > MAX_Q_IDX) { note(format("Too many (%u) quests!", tmp16u)); return (-1); } /* Load the Quests */ for (i = 0; i < tmp16u; i++) { byte tmp8u; rd_byte(&tmp8u); q_list[i].level = tmp8u; rd_byte(&tmp8u); rd_byte(&tmp8u); rd_byte(&tmp8u); } return 0; } int rd_artifacts(void) { int i; u16b tmp16u; /* Load the Artifacts */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > z_info->a_max) { note(format("Too many (%u) artifacts!", tmp16u)); return (-1); } /* Read the artifact flags */ for (i = 0; i < tmp16u; i++) { byte tmp8u; rd_byte(&tmp8u); a_info[i].created = tmp8u; rd_byte(&tmp8u); a_info[i].seen = tmp8u; rd_byte(&tmp8u); a_info[i].everseen = tmp8u; rd_byte(&tmp8u); } return 0; } /* * Read the "extra" information */ int rd_player_2(void) { int i; byte num; rd_string(op_ptr->full_name, sizeof(op_ptr->full_name)); rd_string(p_ptr->died_from, 80); p_ptr->history = mem_zalloc(250); rd_string(p_ptr->history, 250); /* Player race */ rd_byte(&num); p_ptr->race = player_id2race(num); /* Verify player race */ if (!p_ptr->race) { note(format("Invalid player race (%d).", num)); return -1; } /* Player class */ rd_byte(&num); p_ptr->class = player_id2class(num); if (!p_ptr->class) { note(format("Invalid player class (%d).", num)); return -1; } /* Player gender */ rd_byte(&p_ptr->psex); p_ptr->sex = &sex_info[p_ptr->psex]; /* Numeric name suffix */ rd_byte(&op_ptr->name_suffix); /* Special Race/Class info */ rd_byte(&p_ptr->hitdie); rd_byte(&p_ptr->expfact); /* Age/Height/Weight */ rd_s16b(&p_ptr->age); rd_s16b(&p_ptr->ht); rd_s16b(&p_ptr->wt); /* Read the stat info (ignoring CHR) */ for (i = 0; i < A_MAX; i++) rd_s16b(&p_ptr->stat_max[i]); strip_bytes(2); for (i = 0; i < A_MAX; i++) rd_s16b(&p_ptr->stat_cur[i]); strip_bytes(2); for (i = 0; i < A_MAX; i++) rd_s16b(&p_ptr->stat_birth[i]); strip_bytes(2); rd_s16b(&p_ptr->ht_birth); rd_s16b(&p_ptr->wt_birth); strip_bytes(2); rd_s32b(&p_ptr->au_birth); strip_bytes(4); rd_s32b(&p_ptr->au); rd_s32b(&p_ptr->max_exp); rd_s32b(&p_ptr->exp); rd_u16b(&p_ptr->exp_frac); rd_s16b(&p_ptr->lev); /* Verify player level */ if ((p_ptr->lev < 1) || (p_ptr->lev > PY_MAX_LEVEL)) { note(format("Invalid player level (%d).", p_ptr->lev)); return (-1); } rd_s16b(&p_ptr->mhp); rd_s16b(&p_ptr->chp); rd_u16b(&p_ptr->chp_frac); rd_s16b(&p_ptr->msp); rd_s16b(&p_ptr->csp); rd_u16b(&p_ptr->csp_frac); rd_s16b(&p_ptr->max_lev); rd_s16b(&p_ptr->max_depth); /* Hack -- Repair maximum player level */ if (p_ptr->max_lev < p_ptr->lev) p_ptr->max_lev = p_ptr->lev; /* Hack -- Repair maximum dungeon level */ if (p_ptr->max_depth < 0) p_ptr->max_depth = 1; /* More info */ strip_bytes(9); rd_byte(&p_ptr->unignoring); rd_s16b(&p_ptr->deep_descent); /* Read the flags */ rd_s16b(&p_ptr->food); rd_s16b(&p_ptr->energy); rd_s16b(&p_ptr->word_recall); rd_s16b(&p_ptr->state.see_infra); rd_byte(&p_ptr->confusing); rd_byte(&p_ptr->searching); /* Find the number of timed effects */ rd_byte(&num); if (num <= TMD_MAX) { /* Read all the effects */ for (i = 0; i < num; i++) rd_s16b(&p_ptr->timed[i]); /* Initialize any entries not read */ if (num < TMD_MAX) C_WIPE(p_ptr->timed + num, TMD_MAX - num, s16b); } else { /* Probably in trouble anyway */ for (i = 0; i < TMD_MAX; i++) rd_s16b(&p_ptr->timed[i]); /* Discard unused entries */ strip_bytes(2 * (num - TMD_MAX)); note("Discarded unsupported timed effects"); } /* Total energy used so far */ rd_u32b(&p_ptr->total_energy); /* # of turns spent resting */ rd_u32b(&p_ptr->resting_turn); /* Future use */ strip_bytes(32); return 0; } /* * Read the "extra" information */ int rd_player_3(void) { int i; byte num; byte a_max = 0; rd_string(op_ptr->full_name, sizeof(op_ptr->full_name)); rd_string(p_ptr->died_from, 80); p_ptr->history = mem_zalloc(250); rd_string(p_ptr->history, 250); /* Player race */ rd_byte(&num); p_ptr->race = player_id2race(num); /* Verify player race */ if (!p_ptr->race) { note(format("Invalid player race (%d).", num)); return -1; } /* Player class */ rd_byte(&num); p_ptr->class = player_id2class(num); if (!p_ptr->class) { note(format("Invalid player class (%d).", num)); return -1; } /* Player gender */ rd_byte(&p_ptr->psex); p_ptr->sex = &sex_info[p_ptr->psex]; /* Numeric name suffix */ rd_byte(&op_ptr->name_suffix); /* Special Race/Class info */ rd_byte(&p_ptr->hitdie); rd_byte(&p_ptr->expfact); /* Age/Height/Weight */ rd_s16b(&p_ptr->age); rd_s16b(&p_ptr->ht); rd_s16b(&p_ptr->wt); /* Read the stat info */ rd_byte(&a_max); assert(a_max <= A_MAX); for (i = 0; i < a_max; i++) rd_s16b(&p_ptr->stat_max[i]); for (i = 0; i < a_max; i++) rd_s16b(&p_ptr->stat_cur[i]); for (i = 0; i < a_max; i++) rd_s16b(&p_ptr->stat_birth[i]); rd_s16b(&p_ptr->ht_birth); rd_s16b(&p_ptr->wt_birth); strip_bytes(2); rd_s32b(&p_ptr->au_birth); strip_bytes(4); rd_s32b(&p_ptr->au); rd_s32b(&p_ptr->max_exp); rd_s32b(&p_ptr->exp); rd_u16b(&p_ptr->exp_frac); rd_s16b(&p_ptr->lev); /* Verify player level */ if ((p_ptr->lev < 1) || (p_ptr->lev > PY_MAX_LEVEL)) { note(format("Invalid player level (%d).", p_ptr->lev)); return (-1); } rd_s16b(&p_ptr->mhp); rd_s16b(&p_ptr->chp); rd_u16b(&p_ptr->chp_frac); rd_s16b(&p_ptr->msp); rd_s16b(&p_ptr->csp); rd_u16b(&p_ptr->csp_frac); rd_s16b(&p_ptr->max_lev); rd_s16b(&p_ptr->max_depth); /* Hack -- Repair maximum player level */ if (p_ptr->max_lev < p_ptr->lev) p_ptr->max_lev = p_ptr->lev; /* Hack -- Repair maximum dungeon level */ if (p_ptr->max_depth < 0) p_ptr->max_depth = 1; /* More info */ strip_bytes(9); rd_byte(&p_ptr->unignoring); rd_s16b(&p_ptr->deep_descent); /* Read the flags */ rd_s16b(&p_ptr->food); rd_s16b(&p_ptr->energy); rd_s16b(&p_ptr->word_recall); rd_s16b(&p_ptr->state.see_infra); rd_byte(&p_ptr->confusing); rd_byte(&p_ptr->searching); /* Find the number of timed effects */ rd_byte(&num); if (num <= TMD_MAX) { /* Read all the effects */ for (i = 0; i < num; i++) rd_s16b(&p_ptr->timed[i]); /* Initialize any entries not read */ if (num < TMD_MAX) C_WIPE(p_ptr->timed + num, TMD_MAX - num, s16b); } else { /* Probably in trouble anyway */ for (i = 0; i < TMD_MAX; i++) rd_s16b(&p_ptr->timed[i]); /* Discard unused entries */ strip_bytes(2 * (num - TMD_MAX)); note("Discarded unsupported timed effects"); } /* Total energy used so far */ rd_u32b(&p_ptr->total_energy); /* # of turns spent resting */ rd_u32b(&p_ptr->resting_turn); /* Future use */ strip_bytes(32); return 0; } /* * Read squelch and autoinscription submenu for all known objects */ int rd_squelch(void) { size_t i; byte tmp8u = 24; u16b file_e_max; u16b inscriptions; /* Read how many squelch bytes we have */ rd_byte(&tmp8u); /* Check against current number */ if (tmp8u != squelch_size) { strip_bytes(tmp8u); } else { for (i = 0; i < squelch_size; i++) rd_byte(&squelch_level[i]); } /* Read the number of saved ego-item */ rd_u16b(&file_e_max); for (i = 0; i < file_e_max; i++) { if (i < z_info->e_max) { byte flags; /* Read and extract the flag */ rd_byte(&flags); e_info[i].everseen |= (flags & 0x02); } } /* Read the current number of auto-inscriptions */ rd_u16b(&inscriptions); /* Read the autoinscriptions array */ for (i = 0; i < inscriptions; i++) { char tmp[80]; s16b kidx; struct object_kind *k; rd_s16b(&kidx); k = objkind_byid(kidx); if (!k) quit_fmt("objkind_byid(%d) failed", kidx); rd_string(tmp, sizeof(tmp)); k->note = quark_add(tmp); } return 0; } int rd_misc(void) { byte tmp8u; /* Read the randart version */ strip_bytes(4); /* Read the randart seed */ rd_u32b(&seed_randart); /* Skip the flags */ strip_bytes(12); /* Hack -- the two "special seeds" */ rd_u32b(&seed_flavor); rd_u32b(&seed_town); /* Special stuff */ rd_u16b(&p_ptr->panic_save); rd_u16b(&p_ptr->total_winner); rd_u16b(&p_ptr->noscore); /* Read "death" */ rd_byte(&tmp8u); p_ptr->is_dead = tmp8u; /* Read "feeling" */ rd_byte(&tmp8u); cave->feeling = tmp8u; rd_s32b(&cave->created_at); /* Current turn */ rd_s32b(&turn); return 0; } int rd_misc_2(void) { byte tmp8u; u16b tmp16u; /* Read the randart version */ strip_bytes(4); /* Read the randart seed */ rd_u32b(&seed_randart); /* Skip the flags */ strip_bytes(12); /* Hack -- the two "special seeds" */ rd_u32b(&seed_flavor); rd_u32b(&seed_town); /* Special stuff */ rd_u16b(&p_ptr->panic_save); rd_u16b(&p_ptr->total_winner); rd_u16b(&p_ptr->noscore); /* Read "death" */ rd_byte(&tmp8u); p_ptr->is_dead = tmp8u; /* Read "feeling" */ rd_byte(&tmp8u); cave->feeling = tmp8u; rd_u16b(&tmp16u); cave->feeling_squares = tmp16u; rd_s32b(&cave->created_at); /* Current turn */ rd_s32b(&turn); return 0; } int rd_player_hp(void) { int i; u16b tmp16u; /* Read the player_hp array */ rd_u16b(&tmp16u); /* Incompatible save files */ if (tmp16u > PY_MAX_LEVEL) { note(format("Too many (%u) hitpoint entries!", tmp16u)); return (-1); } /* Read the player_hp array */ for (i = 0; i < tmp16u; i++) rd_s16b(&p_ptr->player_hp[i]); return 0; } int rd_player_spells(void) { int i; u16b tmp16u; int cnt; /* Read the number of spells */ rd_u16b(&tmp16u); if (tmp16u > PY_MAX_SPELLS) { note(format("Too many player spells (%d).", tmp16u)); return (-1); } /* Read the spell flags */ for (i = 0; i < tmp16u; i++) rd_byte(&p_ptr->spell_flags[i]); /* Read the spell order */ for (i = 0, cnt = 0; i < tmp16u; i++, cnt++) rd_byte(&p_ptr->spell_order[cnt]); /* Success */ return (0); } /** * Read the player inventory * * Note that the inventory is re-sorted later by dungeon(). */ static int rd_inventory(rd_item_t rd_item_version) { int slot = 0; object_type *i_ptr; object_type object_type_body; /* Read until done */ while (1) { u16b n; /* Get the next item index */ rd_u16b(&n); /* Nope, we reached the end */ if (n == 0xFFFF) break; /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Read the item */ if ((*rd_item_version)(i_ptr)) { note("Error reading item"); return (-1); } /* Hack -- verify item */ if (!i_ptr->kind) continue; /* Verify slot */ if (n >= ALL_INVEN_TOTAL) return (-1); /* Wield equipment */ if (n >= INVEN_WIELD) { /* Copy object */ object_copy(&p_ptr->inventory[n], i_ptr); /* Add the weight */ p_ptr->total_weight += (i_ptr->number * i_ptr->weight); /* One more item */ p_ptr->equip_cnt++; } /* Warning -- backpack is full */ else if (p_ptr->inven_cnt == INVEN_PACK) { /* Oops */ note("Too many items in the inventory!"); /* Fail */ return (-1); } /* Carry inventory */ else { /* Get a slot */ n = slot++; /* Copy object */ object_copy(&p_ptr->inventory[n], i_ptr); /* Add the weight */ p_ptr->total_weight += (i_ptr->number * i_ptr->weight); /* One more item */ p_ptr->inven_cnt++; } } save_quiver_size(p_ptr); /* Success */ return (0); } /* * Read the player inventory - wrapper functions */ int rd_inventory_6(void) { return rd_inventory(rd_item_6); } int rd_inventory_5(void) { return rd_inventory(rd_item_5); } int rd_inventory_4(void) { return rd_inventory(rd_item_4); } int rd_inventory_3(void) { return rd_inventory(rd_item_3); } int rd_inventory_2(void) { return rd_inventory(rd_item_2); } /* remove post-3.3 */ int rd_inventory_1(void) { return rd_inventory(rd_item_1); } /* remove post-3.3 */ /* Read store contents */ static int rd_stores(rd_item_t rd_item_version) { int i; u16b tmp16u; /* Read the stores */ rd_u16b(&tmp16u); for (i = 0; i < tmp16u; i++) { struct store *st_ptr = &stores[i]; int j; byte own, num; /* XXX */ strip_bytes(6); /* Read the basic info */ rd_byte(&own); rd_byte(&num); /* XXX */ strip_bytes(4); /* XXX: refactor into store.c */ st_ptr->owner = store_ownerbyidx(st_ptr, own); /* Read the items */ for (j = 0; j < num; j++) { object_type *i_ptr; object_type object_type_body; /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Read the item */ if ((*rd_item_version)(i_ptr)) { note("Error reading item"); return (-1); } if (i != STORE_HOME) i_ptr->ident |= IDENT_STORE; /* Accept any valid items */ if (st_ptr->stock_num < STORE_INVEN_MAX && i_ptr->kind) { int k = st_ptr->stock_num++; /* Accept the item */ object_copy(&st_ptr->stock[k], i_ptr); } } } return 0; } /* * Read the stores - wrapper functions */ int rd_stores_6(void) { return rd_stores(rd_item_6); } int rd_stores_5(void) { return rd_stores(rd_item_5); } int rd_stores_4(void) { return rd_stores(rd_item_4); } int rd_stores_3(void) { return rd_stores(rd_item_3); } int rd_stores_2(void) { return rd_stores(rd_item_2); } /* remove post-3.3 */ int rd_stores_1(void) { return rd_stores(rd_item_1); } /* remove post-3.3 */ /* * Read the dungeon * * The monsters/objects must be loaded in the same order * that they were stored, since the actual indexes matter. * * Note that the size of the dungeon is now hard-coded to * DUNGEON_HGT by DUNGEON_WID, and any dungeon with another * size will be silently discarded by this routine. * * Note that dungeon objects, including objects held by monsters, are * placed directly into the dungeon, using "object_copy()", which will * copy "iy", "ix", and "held_m_idx", leaving "next_o_idx" blank for * objects held by monsters, since it is not saved in the savefile. * * After loading the monsters, the objects being held by monsters are * linked directly into those monsters. */ int rd_dungeon(void) { int i, y, x; s16b depth; s16b py, px; s16b ymax, xmax; byte count; byte tmp8u; u16b tmp16u; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /*** Basic info ***/ /* Header info */ rd_s16b(&depth); rd_u16b(&daycount); rd_s16b(&py); rd_s16b(&px); rd_s16b(&ymax); rd_s16b(&xmax); rd_u16b(&tmp16u); rd_u16b(&tmp16u); /* Ignore illegal dungeons */ if ((depth < 0) || (depth >= MAX_DEPTH)) { note(format("Ignoring illegal dungeon depth (%d)", depth)); return (0); } cave->width = xmax; cave->height = ymax; /* Ignore illegal dungeons */ if ((px < 0) || (px >= DUNGEON_WID) || (py < 0) || (py >= DUNGEON_HGT)) { note(format("Ignoring illegal player location (%d,%d).", py, px)); return (1); } /*** Run length decoding ***/ /* Load the dungeon data */ for (x = y = 0; y < DUNGEON_HGT; ) { /* Grab RLE info */ rd_byte(&count); rd_byte(&tmp8u); /* Apply the RLE info */ for (i = count; i > 0; i--) { /* Extract "info" */ cave->info[y][x] = tmp8u; /* Advance/Wrap */ if (++x >= DUNGEON_WID) { /* Wrap */ x = 0; /* Advance/Wrap */ if (++y >= DUNGEON_HGT) break; } } } /* Load the dungeon data */ for (x = y = 0; y < DUNGEON_HGT; ) { /* Grab RLE info */ rd_byte(&count); rd_byte(&tmp8u); /* Apply the RLE info */ for (i = count; i > 0; i--) { /* Extract "info" */ cave->info2[y][x] = tmp8u; /* Advance/Wrap */ if (++x >= DUNGEON_WID) { /* Wrap */ x = 0; /* Advance/Wrap */ if (++y >= DUNGEON_HGT) break; } } } /*** Run length decoding ***/ /* Load the dungeon data */ for (x = y = 0; y < DUNGEON_HGT; ) { /* Grab RLE info */ rd_byte(&count); rd_byte(&tmp8u); /* Apply the RLE info */ for (i = count; i > 0; i--) { /* Extract "feat" */ cave_set_feat(cave, y, x, tmp8u); /* Advance/Wrap */ if (++x >= DUNGEON_WID) { /* Wrap */ x = 0; /* Advance/Wrap */ if (++y >= DUNGEON_HGT) break; } } } /*** Player ***/ /* Load depth */ p_ptr->depth = depth; /* Place player in dungeon */ player_place(cave, p_ptr, py, px); /*** Success ***/ /* The dungeon is ready */ character_dungeon = TRUE; #if 0 /* Regenerate town in old versions */ if (p_ptr->depth == 0) character_dungeon = FALSE; #endif return 0; } /* Read the floor object list */ static int rd_objects(rd_item_t rd_item_version) { int i; u16b limit; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /* Read the item count */ rd_u16b(&limit); /* Verify maximum */ if (limit > z_info->o_max) { note(format("Too many (%d) object entries!", limit)); return (-1); } /* Read the dungeon items */ for (i = 1; i < limit; i++) { object_type *i_ptr; object_type object_type_body; s16b o_idx; object_type *o_ptr; /* Get the object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Read the item */ if ((*rd_item_version)(i_ptr)) { note("Error reading item"); return (-1); } /* Make an object */ o_idx = o_pop(); /* Paranoia */ if (o_idx != i) { note(format("Cannot place object %d!", i)); return (-1); } /* Get the object */ o_ptr = object_byid(o_idx); /* Structure Copy */ object_copy(o_ptr, i_ptr); /* Dungeon floor */ if (!i_ptr->held_m_idx) { int x = i_ptr->ix; int y = i_ptr->iy; /* ToDo: Verify coordinates */ /* Link the object to the pile */ o_ptr->next_o_idx = cave->o_idx[y][x]; /* Link the floor to the object */ cave->o_idx[y][x] = o_idx; } } return 0; } /* * Read the object list - wrapper functions */ int rd_objects_6(void) { return rd_objects(rd_item_6); } int rd_objects_5(void) { return rd_objects(rd_item_5); } int rd_objects_4(void) { return rd_objects(rd_item_4); } int rd_objects_3(void) { return rd_objects(rd_item_3); } int rd_objects_2(void) { return rd_objects(rd_item_2); } /* remove post-3.3 */ int rd_objects_1(void) { return rd_objects(rd_item_1); } /* remove post-3.3 */ /** * Read monsters (added m_ptr->mimicked_o_idx) */ int rd_monsters_7(void) { int i; size_t j; u16b limit; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /* Read the monster count */ rd_u16b(&limit); /* Hack -- verify */ if (limit > z_info->m_max) { note(format("Too many (%d) monster entries!", limit)); return (-1); } /* Read the monsters */ for (i = 1; i < limit; i++) { monster_type *m_ptr; monster_type monster_type_body; s16b r_idx; byte flags; byte tmp8u; /* Get local monster */ m_ptr = &monster_type_body; WIPE(m_ptr, monster_type); /* Read in record */ rd_s16b(&r_idx); m_ptr->race = &r_info[r_idx]; rd_byte(&m_ptr->fy); rd_byte(&m_ptr->fx); rd_s16b(&m_ptr->hp); rd_s16b(&m_ptr->maxhp); rd_byte(&m_ptr->mspeed); rd_byte(&m_ptr->energy); rd_byte(&tmp8u); for (j = 0; j < tmp8u; j++) rd_s16b(&m_ptr->m_timed[j]); /* Read and extract the flag */ rd_byte(&flags); m_ptr->unaware = (flags & 0x01) ? TRUE : FALSE; for (j = 0; j < of_size; j++) rd_byte(&m_ptr->known_pflags[j]); strip_bytes(1); /* Place monster in dungeon */ if (place_monster(m_ptr->fy, m_ptr->fx, m_ptr, 0) != i) { note(format("Cannot place monster %d", i)); return (-1); } } /* Reacquire objects */ for (i = 1; i < o_max; ++i) { object_type *o_ptr; monster_type *m_ptr; /* Get the object */ o_ptr = object_byid(i); /* Check for mimics */ if (o_ptr->mimicking_m_idx) { /* Verify monster index */ if (o_ptr->mimicking_m_idx > z_info->m_max) { note("Invalid monster index"); return (-1); } /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->mimicking_m_idx); /* Link the monster to the object */ m_ptr->mimicked_o_idx = i; } else if (o_ptr->held_m_idx) { /* Verify monster index */ if (o_ptr->held_m_idx > z_info->m_max) { note("Invalid monster index"); return (-1); } /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Link the object to the pile */ o_ptr->next_o_idx = m_ptr->hold_o_idx; /* Link the monster to the object */ m_ptr->hold_o_idx = i; } else continue; } return 0; } /** * Read monsters (added m_ptr->mimicked_o_idx) */ int rd_monsters_6(void) { int i; size_t j; u16b limit; /* Only if the player's alive */ if (p_ptr->is_dead) return 0; /* Read the monster count */ rd_u16b(&limit); /* Hack -- verify */ if (limit > z_info->m_max) { note(format("Too many (%d) monster entries!", limit)); return (-1); } /* Read the monsters */ for (i = 1; i < limit; i++) { monster_type *m_ptr; monster_type monster_type_body; s16b r_idx; byte flags; byte tmp8u; /* Get local monster */ m_ptr = &monster_type_body; WIPE(m_ptr, monster_type); /* Read in record */ rd_s16b(&r_idx); m_ptr->race = &r_info[r_idx]; rd_byte(&m_ptr->fy); rd_byte(&m_ptr->fx); rd_s16b(&m_ptr->hp); rd_s16b(&m_ptr->maxhp); rd_byte(&m_ptr->mspeed); rd_byte(&m_ptr->energy); rd_byte(&tmp8u); for (j = 0; j < tmp8u; j++) rd_s16b(&m_ptr->m_timed[j]); /* Read and extract the flag */ rd_byte(&flags); m_ptr->unaware = (flags & 0x01) ? TRUE : FALSE; for (j = 0; j < OF_BYTES && j < OF_SIZE; j++) rd_byte(&m_ptr->known_pflags[j]); if (j < OF_BYTES) strip_bytes(OF_BYTES - j); strip_bytes(1); /* Place monster in dungeon */ if (place_monster(m_ptr->fy, m_ptr->fx, m_ptr, 0) != i) { note(format("Cannot place monster %d", i)); return (-1); } } /* Reacquire objects */ for (i = 1; i < o_max; ++i) { object_type *o_ptr; monster_type *m_ptr; /* Get the object */ o_ptr = object_byid(i); /* Check for mimics */ if (o_ptr->mimicking_m_idx) { /* Verify monster index */ if (o_ptr->mimicking_m_idx > z_info->m_max) { note("Invalid monster index"); return (-1); } /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->mimicking_m_idx); /* Link the monster to the object */ m_ptr->mimicked_o_idx = i; } else if (o_ptr->held_m_idx) { /* Verify monster index */ if (o_ptr->held_m_idx > z_info->m_max) { note("Invalid monster index"); return (-1); } /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Link the object to the pile */ o_ptr->next_o_idx = m_ptr->hold_o_idx; /* Link the monster to the object */ m_ptr->hold_o_idx = i; } else continue; } return 0; } int rd_history(void) { u32b tmp32u; size_t i; history_clear(); rd_u32b(&tmp32u); for (i = 0; i < tmp32u; i++) { s32b turnno; s16b dlev, clev; u16b type; byte art_name; char text[80]; rd_u16b(&type); rd_s32b(&turnno); rd_s16b(&dlev); rd_s16b(&clev); rd_byte(&art_name); rd_string(text, sizeof(text)); history_add_full(type, &a_info[art_name], dlev, clev, turnno, text); } return 0; } /** * For blocks that don't need loading anymore. */ int rd_null(void) { return 0; } angband-3.5.1/src/cocoa/0000755000175000017500000000000012456456606014313 5ustar chriscchriscangband-3.5.1/src/cocoa/Data.icns0000644000175000017500000043673012456456606016057 0ustar chriscchriscicns=Øis32–…†óòêòI…ô²²¥¦¥­ÍZ„ õÈ·°È´˜àûmƒ ö½¬³½äÃüÁÑ‚ ÷À½ÆÜ¥ûùùÛóò¤€ ùÀýñ‰¡­ÅÉ­}€ úɼþò“½àÚ¨Šè€ûÖÅËÅÜ—€ÿé£ ýÚÉÃÿ3zæ¦Ï«,΀ þ¿¾È{-ÿ…N)Á†I€ þËßÅ6äœBýºÖ+€ ÿÌÑÁ4ÿ&¹ÿ4ÿJq€ ÿØÒÓ,£ÌCi@SRÿ¶“•Ƶ‡¼ASINÕ…†óòêòI…ô²²¥¦¥­ÍZ„ õÈ·°È´˜àûmƒ ö½¬³½äÃüÁÑ‚ ÷À½ÆÜ¥ûùùÛóò¤€ ùÀýñ‰¡­ÅÉ­}€ úɼþò“½àÚ¨Šè€ûÖÅËÅÜ—€ÿé£ ýÚÉÃÿ3zæ¦Ï«,΀ þ¿¾È{-ÿ…N)Á†I€ þËßÅ6äœBýºÖ+€ ÿÌÑÁ4ÿ&¹ÿ4ÿJq€ ÿØÒÓ,£ÌCi@SRÿ¶“•Ƶ‡¼ASINÕ…†óòêòI…ô²²¥¦¥­ÍZ„ õÈ·°È´˜àûmƒ ö½¬³½äÃüÁÑ‚ ÷À½ÆÜ¥ûùùÛóò¤€ ùÀýñ‰¡­ÅÉ­}€ úɼþò“½àÚ¨Šè€ûÖÅËÅÜ—€ÿé£ ýÚÉÃÿ3zæ¦Ï«,΀ þ¿¾È{-ÿ…N)Á†I€ þËßÅ6äœBýºÖ+€ ÿÌÑÁ4ÿ&¹ÿ4ÿJq€ ÿØÒÓ,£ÌCi@SRÿ¶“•Ƶ‡¼ASINÕs8mk€€€€€€‚€ÿÿÿÿÿùþ¤€ÿÿÿÿÿÿÿÿ°€ÿÿÿÿÿÿÿÿÿ¶€ÿÿÿÿÿÿÿÿÿÿŒ€ÿÿÿÿÿÿÿÿÿÿùòå€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ùùùùùùil32 &Ž ˆìëæÈrŒì‡ÛÚÕÎØ‹í¢Ãé®±ª®²©Ä¼£«¶ÁŠîËÔÓÎÏÐÍÎÐÎÕÑËò÷À‰îÎÔÑ¿ÂÇÒÔоÀÊбÿ÷ÀˆïÆÐÉ»¼ÆÊÏȺ»Èɾ±ÿÿøÀ‡ðÙØÖרØÛÖ×ÖÝÞÙɯor‡—†ñż´¯±¾É¶¶®ÈÏǨžƒxxw”`…òÝààßßáÞßàßßàÝÚÒľ¿¿À¦…óÎÅÃÓÕϸÑ×ÍÕÍ»¶ÆÎÊÀ´Üá†ôÛØÙÜßÛÖÞÞØÞÚ×ÕÝÛÛÙÖçò†õÉÞàÍÐÒÏÏ×ÝÌÈÐÏÒÏÎÓÑìö†öºØÓÂÄÇÃÅÐд+šÁÇÄÂÇÆíö†÷€êæêìæèèéèZx˜îìçèçðø2‚øÏÜÓ¶ÖÒ¸¼ËѾ¼{÷mpluw‹Ô VÅ‚ùè€êìééêíéêìœzyñÿÿÙmcÿHƒúÚå߯ÊÒáÏÎÆÈßõN݃ÿ®G„ûæìçÝÝåçààÚÙéDz…ÿk„ ûÙààÞáäìâê€ø eE­ÎÎ×Å£lDƒüÂÏÎÉË×ßÌßúúw jÕέ“¤¹ä&H‚ýòöøöõôðõùû® cûûíA„¡{,&‚þ¹ßæàËÈÁßîû=&ãýÌ57Œ15>‚þñõôôòôñóøÇuþö;5ïþœ€'5‚ÿÌéëÑÖÞëîè…§ÿŸ ¤ÿÿ§¯ ?‚ÿÖíêÝÝæêîç¬ÿpÅþþ]/ÿ9!‚ÿôîéèôõäóô¡ÿ—†ï3ë+JƒÿÚÓÌÆáÜÅâÛ­!-ùþ@..f&"Eƒˆÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ˆìëæÈrŒì‡ÛÚÕÎØ‹í¢Ãé®±ª®²©Ä¼£«¶ÁŠîËÔÓÎÏÐÍÎÐÎÕÑËò÷À‰îÎÔÑ¿ÂÇÒÔоÀÊбÿ÷ÀˆïÆÐÉ»¼ÆÊÏȺ»Èɾ±ÿÿøÀ‡ðÙØÖרØÛÖ×ÖÝÞÙɯor‡—†ñż´¯±¾É¶¶®ÈÏǨžƒxxw”`…òÝààßßáÞßàßßàÝÚÒľ¿¿À¦…óÎÅÃÓÕϸÑ×ÍÕÍ»¶ÆÎÊÀ´Üá†ôÛØÙÜßÛÖÞÞØÞÚ×ÕÝÛÛÙÖçò†õÉÞàÍÐÒÏÏ×ÝÌÈÐÏÒÏÎÓÑìö†öºØÓÂÄÇÃÅÐд+šÁÇÄÂÇÆíö†÷€êæêìæèèéèZx˜îìçèçðø2‚øÏÜÓ¶ÖÒ¸¼ËѾ¼{÷mpluw‹Ô VÅ‚ùè€êìééêíéêìœzyñÿÿÙmcÿHƒúÚå߯ÊÒáÏÎÆÈßõN݃ÿ®G„ûæìçÝÝåçààÚÙéDz…ÿk„ ûÙààÞáäìâê€ø eE­ÎÎ×Å£lDƒüÂÏÎÉË×ßÌßúúw jÕέ“¤¹ä&H‚ýòöøöõôðõùû® cûûíA„¡{,&‚þ¹ßæàËÈÁßîû=&ãýÌ57Œ15>‚þñõôôòôñóøÇuþö;5ïþœ€'5‚ÿÌéëÑÖÞëîè…§ÿŸ ¤ÿÿ§¯ ?‚ÿÖíêÝÝæêîç¬ÿpÅþþ]/ÿ9!‚ÿôîéèôõäóô¡ÿ—†ï3ë+JƒÿÚÓÌÆáÜÅâÛ­!-ùþ@..f&"Eƒˆÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ˆìëæÈrŒì‡ÛÚÕÎØ‹í¢Ãé®±ª®²©Ä¼£«¶ÁŠîËÔÓÎÏÐÍÎÐÎÕÑËò÷À‰îÎÔÑ¿ÂÇÒÔоÀÊбÿ÷ÀˆïÆÐÉ»¼ÆÊÏȺ»Èɾ±ÿÿøÀ‡ðÙØÖרØÛÖ×ÖÝÞÙɯor‡—†ñż´¯±¾É¶¶®ÈÏǨžƒxxw”`…òÝààßßáÞßàßßàÝÚÒľ¿¿À¦…óÎÅÃÓÕϸÑ×ÍÕÍ»¶ÆÎÊÀ´Üá†ôÛØÙÜßÛÖÞÞØÞÚ×ÕÝÛÛÙÖçò†õÉÞàÍÐÒÏÏ×ÝÌÈÐÏÒÏÎÓÑìö†öºØÓÂÄÇÃÅÐд+šÁÇÄÂÇÆíö†÷€êæêìæèèéèZx˜îìçèçðø2‚øÏÜÓ¶ÖÒ¸¼ËѾ¼{÷mpluw‹Ô VÅ‚ùè€êìééêíéêìœzyñÿÿÙmcÿHƒúÚå߯ÊÒáÏÎÆÈßõN݃ÿ®G„ûæìçÝÝåçààÚÙéDz…ÿk„ ûÙààÞáäìâê€ø eE­ÎÎ×Å£lDƒüÂÏÎÉË×ßÌßúúw jÕέ“¤¹ä&H‚ýòöøöõôðõùû® cûûíA„¡{,&‚þ¹ßæàËÈÁßîû=&ãýÌ57Œ15>‚þñõôôòôñóøÇuþö;5ïþœ€'5‚ÿÌéëÑÖÞëîè…§ÿŸ ¤ÿÿ§¯ ?‚ÿÖíêÝÝæêîç¬ÿpÅþþ]/ÿ9!‚ÿôîéèôõäóô¡ÿ—†ï3ë+JƒÿÚÓÌÆáÜÅâÛ­!-ùþ@..f&"Eƒˆÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚l8mk(_ccccccccccco`oÿÿÿÿÿÿÿÿÿÿÿÿÿûÞItÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýYtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýWtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöUtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá$tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúitÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿotÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmatÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬âÿqtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿítÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqŸÿztÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿêtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm'ÿátÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm£ÿltÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÿìtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô&tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿj3y‚‚‚‚‚‚‚‚‚‚‚‚Àÿÿÿÿÿÿÿý@QŒ¡ ‡Qit32v¶ˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç©æååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæå傿åæååæååæååæååæåããáßßÜÚ×ÒÎÊľ°ß¶¸%è‚çæëïéæçæèëçìïèççæíîçíîçîîçîíææäãæäßÞÚÚÜÔËÅ¿±¿ä¯·%èçæëÕ¼ÞêæêäÒççæëοãéæêËÁæèçéÈÀçèÄÆè€çÂÈèæäéÓÖâÞÝÕ°»ÏÆ¿¹ ÏÚ®¶%è€ç@æêל²™äêÝŸ˜çæìÊŸ®¢éíâ©§ëì¼¥¥­ìì¶©¡´ìì°¬ž»ìèÀ‰¹èÝßœ¥Š´ÍÁ”d¸ÚÕ¬µ%è€çAæïµ¼È„ÏíßЦäæî¨Ê¹‰Ûð£Ð±ßìŸÖ¨’äèžÚ¡˜éâžÜšŸéåÚ±·èâϘςœÑÁ±£çÌÖ¨´%è€çBæî¶£¯ªÂíéä¤åç묢²§Òí§¡´¥×ꥤ´£Ý椤µ£äÞ ¥·¦æåñ¸¶êä͘¨šÒÅÆˆ–èÛÎÕ¥³%è€çCæíÄܟÐìçÞ¡ãæî²Þ™Üðª”Ü™áؚæì™¥Óœê钮͡íäì´³êâÛ‚¶³ž×ÇĉŽáæÚÍÕ£²%éèCé㨡¯êêܪž¬ßíÛ¥ ºìëÖ¢Ÿ¿ìëÑ¢ŸÅììÌ¢ŸËììÇ¢ŸÐìêÁŸž¿ææ¶›™ËÔÌ€sÃôâÚÍÕ ±%é‚è)êçÙêéèçäçäççëäÚëèçìâÜìèçëáÝìèçìÞßìçèìÝáìçè€åâåäåÓÙÜÔÎú§ÉøêäÚÍÔŸ°%é„èëè=éèéèèçèëçèèçéêçèèçêëçèèçêêçèèçêêçèèéèèçåäâäßÙÖÐȾ¬ÃüñëãÚÍÕž ¯%êƒéççé çèèééèèéèéé€èç€éçç€éèçè€éèééçè€çæãáßÜØÒȾ®¼ý÷òëãÙÌÕ ®%êƒéïí€éêïì€éëìçíééëëèíèéëïë€é(ëïëééèíéêìéèíèêêçæééâÝÙÓÏÆ²¸ýû÷òëâÙÌÖ ­%ê‚éGêÆ©äêéé­ééê㪣Éíêß§£Îíéå´¸íèêã°ÀîçíÒ¢©ÛëíÍ «Þêè×£ÈâØÖ¼‹£¸úþû÷òëâÙÍÕ ¬%ê€éJèëß®˜ßëëÛ«žçèñ´¸ÄŠäò­¿»éíÏ¡¨îçíÌŸ²ðçëžÓ¡¦ðæ›Ø˜®ïç½”¼æØÔ¦€¸úÿýû÷òëâÙÍÖ «%êƒéHì£Þëèëæ¦åèîªÁ¨›×ð¦Â¦ÛëîÔ¨íèèðϱïêߤĞ¥ì٥œ©êåð´ºæÙÓÖ™›·ùÿþýû÷òëâÚÍÖ ª%ë‚êJìî£æîéíè§îëï¯Õ¥Öò¨“×¢ÝëòÕ«õéèôϵ÷êå—¤Ô¢îà’«Ð¤îæô´ÀìÙÕÙš¢¼øÿÿþýû÷òëãÚÍ× ©%ëê;ëåÅ”¾äíãÀ—Åäñŕžéñ½š¾¢íëÞ²˜ÏéìÜ®žÒé𥬰´ðퟱ«¼ðèÓ£ÒÝÖº‡‰«ú€ÿ þýûöñëãÚÎØ ¨%ëê<ìã¼À¼àîà¼À¼ãëìDZÞíêê³àìíÖº¾ÃéíÓ»¾Åëëå¹»éêì⵿ëéêÆº·Èß×°¢•¦ûÿ€þ ýüúöñêãÛÎØž §%ì‚ë:ìòñòíêíòñòìëëðóíêëëñòíëëîòññëêïòòñëëìòòìëëíòòëêéîîìæÝØÖоú„ÿ ü÷ðèáÙÎÙž ¦%ìƒëêèê€ëéèé€ëéèê€ëèèê€ë éèêëëêèèêëëêèè€ë$êééëêêèåãâÞØÐȼºíñíëìïñöûýÿýöêÜÌÖž ¥%ìƒëìð€ëêïóìêëëðóìëëêñò€ëêíïëòòëòñ€ë%êîíëêêèìçâÞØÔÒĵª›Ž‡}~‡’«ÀÓäëÜÝœ ¤%ìë"êíêÕéìêïÕÀåíêîÒÂçíêîÎÄéìêðáØíëëìÈÉì€ë+ÅÌíëêñÚßíêêîÖÛåÞÜͦ±¼¬Ÿˆjs|wwlYdjgnq}­Íæ¥ £%ìëRíå§”ãìïÕ ´ ëð΢±¥íñÇ¥¬ªïîÕ•©ðéñ¹¬¥·ð𳯡¿ñíÆÀòèíÀŠÂêÞÛ”Ÿ€©´ŸdhRvyUaOs|qMUDs‘Ï¡¢&íìQíæØ¥áíô²ÈÆ‰Ùø«Î½Œàõ§Ôµ‘äïâÇ­ðëì¢ß¥›îç á¢ïëá·¾ôêêÞ±¿ìäÇ™Åw”¾‘o„NmŽoewIlˆfeqJlsj£‰£&íìSëîï¤âíò¶¦´¬Ì÷¯¥¶ªÖ󫥸¨ÛîôÖªñì騨º§è㤨º©ëêø¾¼ôêéö¶¾ìæÄ•˜ž‘Ä•oqrp›xcijn”p`gfoŠkc¡&îƒíRé¡áîô¿ŠäŸÛø¶ãœáö­—áœèíñѨñëò©Ù ðï–²Ò¥óëôº»õëêò³½íåÕ|¹£šÊªb—{¨Wo¡ƒUi‚•‰yŒ5 &î€íVìï䬩àò䪤¹ðïਣ¾ñðÛ¦£ÃñðÒ£ž·ìòÑ¥£ÐññË¥£ÕñïߟÃðí¾žÅèä®—”ÅÇÁŽ}~ª¬ªuz¥§£yry¡ž›—’Œ Ÿ&î‚íTìåèåìíðêÞðíìðéßñíìðçáñíîéæèæíìñãäñìíñâåñìîèççèíìæåããçãáÍÔÓÊÇñ¹¹¶¶´§³´±³°¦°®«©¦¢š¢HŸ&îƒíïîïííìíð€í7ìîðìííìîðìííîïîïííìïïìííìðïìííîïïîíìíììêæåáàÙÕÐÌÈÇ¿¿¾½¿€½ ¼¼¾º¹·µ³°«¯~Ÿ&ïƒîìííîîííîí€îììîìì€îííîìîîíìí€îíìí€îíìííîîììëêèçãáÜÙÖÒÎËÊÉÈÇÆÅÆ€Ç ÅÆÄÄÂÀ¾¼¸¼œ &ïƒîôò€îïñìòîîïõñ€îïõñîîíñðíòíîðõð€îñõïîîíñôïîîíòëîîéèëâäßÚÙÛÙÒÐÏÏÔÔ€Ï ÑÔÍÒÎÌÊÈÇÃɧ &ï‚îSïˬéïîë±¥ÈòííÁµðîî뼸ñíñ੨×òîè´Åóíïå±Éóìïã®ÎóìóÌ¢°æìíž®ßáÞÆ›ËÛÖ×¾˜ÍÙÖØ¦“­ØÔÓÑÏÍÕ° &ð€ïUîñ䲜åðöÀµÑ‰æõÚ­¦ïî󨧧òíöªË¶šòóÑ¢·öíóËžº÷íòÇ›Áöïéß”º÷ߛ܋½ìß°ÉâÝ׫Ìßá¾Ê}ÌßÙÙØÖÞ· &ðƒïRò§ãðö´Ä°Ôôñé«îïîôá©ñîïªÊ¦¢åðöÔ¶õîíùɸöîíùþöòڭİøÎ¯¿™²îäî¨Êèââé¢Îäé³³¬’½çÞßÝÛã½ &ð‚ïSñô§ëòõ»×­Óôóé­öðíöá«ùïñ§œÛ¤èïùÔ¹üííüɼýííüÂÃûðᓵϪùغǮñçóªÕïåçï¥ÚììÀˆÇ¯¾ìããâàé &ðïMðêɘÂèöѕȟëòåÁ›Ìëò仚Ïë÷¹£¿«ôðá²¢×îðÞ«£Ùïðܧ§Üð𜼪Çõì—À¤ÍòèΙ²ÞìåÉ•µßî×ÚÜë€çåîÅ &ñðTòéÁÅÁæòòеßóòâÀÄÃëôß¿ÄÅíñïĺéñóÙÀÃËðóÓÁÂÎñòÐÁÁÐòòå¸ÈòïòáµËñîížÙñéÂÁ½ÝîïÓ°ÔïêëêêçñÇ &ñ‚ð8ñø÷øòððõøóïðóø÷øñïóø÷÷ñðñ÷øòððôøøöðïõøøöððöøøõðïòøöððïò÷õ€ïõõöòíïõõöñîîòõñìíëõÊ &òƒñïîï€ñïîð€ñîîï€ñîîï€ñîîðññðîîðññðîïðññðîîðññðîï€ñðîï€ðîííïððîíî€ðîíîïîìöË &ò‚ñðõùóðñðòõ€ñðöùòññð÷øñ÷øñøø€ñðôôñ ùöðññòùöðñðóùõðñðóùôïðïóùóïðïôøóïðîøÍ &òñðõßÄèôðôîÜññðõ×ÇíóðôÓÉðòñôÐË€ñ.òÍÎòñð÷ããóðòïÈÕôðóíÆÙôðóêÅÛõðôçÄàõðôäÃãôïõáÄæôð€ñîøÍ &ò€ñNðõࣺ îô禟ñðöÓ¦µ©ó÷Ì©°¯õ÷Å«¬µöö¾°©¼÷ôÐ’¿øïö±¶¡Ì÷󭹞Ó÷𨻜Ùöí¦¼œàö裼œæö䣻žìò€ñïùΠ&ó€òUðû½ÄÓŠØùêÙ­ïñú°ÓÁåûªÙ¹”ê÷¦ß°™ïó¥ä¨Ÿòó翽ùóç¥èš­ûà§ç”µþØ­ç¼ÿвãŒÄÿɸ݊ÌÿÁÀ×ŠÔøñòòðúÏ &ó€òUðù¿ª·²Ìùôï«ðò÷´©º¯Üù¯¨½­áõ­­½ªçñ«¬¾«ìñþɼúô⥮¿®øÝ§®½°ýÕ§°»´ÿͦ²º»ÿȦ´¶Àÿ¨µ´ÇúðòòðúÏ 'ô€óUòúÍŠè¨Úøóê©ïòú¼”é¡çý²›ç¡íúª¤ã¢òø¡­ß¤öñúƺúòñ“ÀЯüìŽÊȵþçŠÓÀ¼ÿàˆÚ¸ÄÿÙ‡à±ÌÿÒˆæ«ÖùòóóñûÏ 'ôóLôî°©¸õõ毢±éøå­¨Ã÷öà«§ÈøöÛª§Î÷÷Öª§Õ÷öͤ£ÅôøÊ©¨àö÷΍åõöÀª«êõõºª®îôó¶©±ñô𳪴ôóñûÏ 'ôóLòõòãõôóñëîëòóöîå÷óòöíæ÷óò÷ëç÷óò÷éé÷òôîìííóó÷æí÷òó÷äîöòóöäñöòôõãòõòôôãóõòõòãôôóñûР'ô„óöó,õôõóóòôöòóóòôöòóóòõöòóóòõõòóóôõôôóóòöõòóóòöôò€óöóòóóòöô€óòö‚ó÷ƒóñûР'õƒôóóôòóóôôóóôó€ôòó€ôóôôóôôóòóóôôóôóóôôóòôóòôóòôóôó€ôóôò‚ôòüР'õƒôúøôú÷€ô&ö÷òøôôõû÷ôôó÷õóøóó÷õô÷óô÷úõôôóøóõöôôøúõ€ôøúôùùôùñøõôõøòø‚ôòüР'ö‚õLöѲðöõõ̶õõöÔùôó¾øôøç­­Ýøøâ«¯áøõì¶Ïúóúר´ë÷öæ¯Ùúó÷â°áùô÷Þ¯æøôøÂ§Âöõö¾¨Æøô€õóþÑ 'ö€õUôøê· ë÷øç³¦óôý¾ÁΑñûÝ«¬øóü¯Ð»žøú©×³¥úøÐ¢¿üôó£ã ·üõÉŸÌýóõÆ ×ûõòÀÜùùÛ©å‹ÚÿÒ®à‹ãùôõõóþÑ '÷ƒöRø¬éøõ÷ó¯ñõü³Ë²£ãùúç®÷õö¯Ð«¦íõ®Ï¨ªòõÿϽüøå®Í¤²øóÿÂÉýõôÿ¿ÔûõôþµÚùýɽÀ ÈÿÂüŸÏýôööôÿÑ '÷‚öSøû­òúôùõ±úöü¹˜à¯âùýè±ÿöø¬¢à©ïø¦¦á©ôõÿÏÃÿ÷ì›´Ú®ûóÿÂÐÿôõÿ¿ÛÿôõÿµâþûÔ’ÏÂÃÿÌ’Õ¼ÍþõööôÿÑ '÷öT÷ñÏœÈïùïËŸÎðþÏ̧õøëÀžÕòþ¾¨Ä°úü¶¯¿¶üöä°¨àöú¨º´Åýõਰç÷õݧ·èøôØ¡¼éúê—ͤãþã—ϤéùõööôÿÒ '÷öMøïÆÊÆìúìÆÊÆïø÷ÐºéøøåÄÉÊó÷õÈ¿ï÷÷óÅÁó÷ùÙÅÇÓ÷øí¿ÈööøÓÇÅÛùöÐÈÅÞúôÌÉÄâøù߸ÙúôúÛ¸Þúõ€öôÿÒ '÷‚öK÷þýþøõøþýþ÷ööüþùööùþýý÷ö÷ýþøöö÷ýþøöõûþþüööøþý÷ööüþþûõöüþþúõöýýþúööúþûõöõúþûõöôÿÒ 'øƒ÷õôö€÷õôö€÷õôö÷÷öôôõ€÷õô€÷öôôö÷÷öôôö÷÷öôô€÷öõõö÷÷öõõö÷÷öõõ€÷öõö€÷öõö‚÷õÿÓ 'ø„÷ü€÷öøû÷ ýÿø÷÷öýÿø÷÷öùû÷þþ÷ÿý€÷øÿýöŸ÷õÿÓ 'ùø.÷úøáöù÷ûõâøø÷üÝÍôú÷ûÚÐ÷ù÷ýîåúøøùÓÕùøùøÐØû÷ùöÎÛûŸøöÿÓ 'ùø0úñ°›ðúúî«£ø÷ýÙ«º®úþÒ®µ´ýûá²þöÿô®Âþý¼¸©Êþü·»¥Òþ÷øöÿÓ 'ùø0ùòã­íúùñß²õ÷ÿµ×Æ“ëÿ¯Ý½˜ðûîÒ¶ý÷ø©è¬£úó¨ë¥ªþí©ìž²ý÷øöÿÔ 'ùø/÷úû¬íû÷üõ°õøý¹®¿³áÿ³­Á±æúÿà³ýøõ°°Ã¯ôıû課óúƒøö÷–øöÿÔ 'úƒù.õ©íûøúï­õøÿÀ—î¤ìÿ¶Ÿì¤ôúýܱþ÷þ¥°ã¨üûºÛ¬ÿö—ÄÕ³ÿø‚ùþø÷•ù÷ÿÔ 'ú€ù1øûïµ¥²ëÿ볦µïþê°¬Èýü殫ÍþüÝ«¥ÁøþÛ­«ÚýýÔ­«àýþÏ­«åýøùûÛôüö”ù÷ÿמ(û‚ú.ùñõòøûøñõñùúýõëýúùýóìýúûöòôòúùþïïþùùþîñýùúýìóýùú÷ÿOAóÿõù‘úùôÿÄŸ(ûƒúüûü€ú&üûüúúùûýùúúùûýùúúûüûüúúùüüùúúùýüùúúùýüù‚ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(ûƒúùúø€úùúùúúùùúùúúùùúù€úøù€úùúùù€úùúú÷úúù„úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(û‚ú"ûýøþúúûý÷þúúûüøþúúüüùýùúüÿüúúùýûúýù‚úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (ûƒú)¿¬Îýúø»­Òþûô¶®Ùþûð³¯ÝþúöÂÅÿøþ篳æþùú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û€ú-ùÿÒµâêÿɽۑñÿÁÅÒ•õÿºÍÉšúÿ߬´ÿøÿ­Ü¶©ÿùúöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(ü€û.ùÿÂ˾£×ÿ¼Ìº¥Þÿ¶Î¶§çÿ³Ð³©ìýÿäµÿûø²Ó¬­öüû÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü€û/ùÿ˗ܺÔÿØàµÝÿ»šâ±æÿ´Ÿä¯íýÿä¸ÿúû©ªã¬ùüûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ý€ü0ûÿå›Ô§òÿÜÓ§öÿÔ¡Ñ«ûÿ̥ͯÿýïÀ¤ßúÿ»²ÃºÿûüúÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýü/ûÿݽæÿûþÚ½êÿûýÕ¿îÿüüÑÀñþÿæÉÍÒüýùÊÆøýüüûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ýƒüþÿþ€üÿÿþ€üÿÿý€üÿÿýüüþ€ÿ€üÿÿýü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ýƒüúùú€üúùû€üúùû€üúùûüüûùùú€üúú‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚üûþÿýüüûüÿ€üûýÿüÿÿüÿÿ€üûþþ‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýü"ûÿéÎòþûþøæüüûÿöçýüüÿÞÓúýüþÛÕûýûÿïìþ‚ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ€ý$üÿì«Ã¨úÿó®¦ýüÿí©¬ÿüÿײ¹¸ÿÿÏ´µ¿ÿÿáÂÿûý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þ€ý$ûÿÇËÚ‘âÿôãµúýÿóà·üüÿ³ßÁ›õÿ¯æ¹ ùÿòÑÃÿüý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(ÿ)ýÿÅÍÁ¥ÜÿÿøµûþÿºÐ¸©ëÿ¶Ó¶«ðÿÿå¸ÿþþÿÞÂÿÿô´Õ­µ€ÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(ÿdýÿΙ߽Ùÿÿø¶üþÿ¿ä³êÿ·¢ç±ñÿÿåºÿþþÿÞÄÿÿú¦²ã±ÿþÿè¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(ÿ\þÿçœ×©öÿøÑ¤ÕøÿÖ£Ó­þÿΧбÿÿò¦áþÿð¾­åþÿ´»ÀÅÿÿÒGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(„ÿOà¿çÿÿõÍÑÍøÿÿ×ÁðÿÿþÓÃóÿÿéËÏÕþÿæÌÏ×ÿÿ÷ÈÌüÿÿú/¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(ÿþ™ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(„ÿýüþ€ÿüüý€ÿýüþ€ÿýü€ÿ8þüüýÿÿþüüþÿÿþüüþÿþÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(„ÿþ‡ÿþ‚ÿþþÿþÿÿþÿÿþ‚ÿ-þÿÿþÿÿûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿûèýÿþÿçÒöÿþÿäÓúÿþÿõêÿ ÝØüÿþÿñîÿþÿüÖß‚ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(ƒÿ_øµ ÷ÿÿç­Â­þÿ߯¾³ÿÿ쥱ÿýÿж·ÀÿÿãžÃÿüÿ½­ÐÿþÿÿþþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(ƒÿ<øé²óÿÿÁÓÓ”êÿ¹ÛË—òÿôÛ·ÿþÿ°çº¡ûÿôÓÄÿÿú­î©°ÿþÿÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(„ÿ'ý±ôÿÿųºÝÿ½²Ä·èÿÿêµÿÿþ·¶Æ´óÿÿÝÃÿÿô±¶Ç·þ„ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(„ÿ(ü®òÿÿΕñ«ìÿÄ›ò©ôÿÿè±ÿýÿ²«ìªÿþÿÛÀÿýÿ¢¾à²ÿþ„ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ÿ+þÿõ¹©¶ñÿô·±Åÿÿï´°Ìÿÿæ°©Àùÿ䳯ØÿÿÞ®«ÊÿÿÙ²°äÿþ„ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(ƒÿþ÷ú÷ýÿÿúïÿøð€ÿü÷úø€ÿõò€ÿûøùø€ÿòõŠÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(‰ÿþþÿþ‚ÿþ…ÿþÿÿþ…ÿþÿÿþˆÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(‹ÿþ‚ÿþˆÿþ‡ÿþŒÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(»ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(µÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü±û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(±ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b®cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埱=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç©æååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæå傿åæååæååæååæååæåããáßßÜÚ×ÒÎÊľ°ß¶¸%è‚çæëïéæçæèëçìïèççæíîçíîçîîçîíææäãæäßÞÚÚÜÔËÅ¿±¿ä¯·%èçæëÕ¼ÞêæêäÒççæëοãéæêËÁæèçéÈÀçèÄÆè€çÂÈèæäéÓÖâÞÝÕ°»ÏÆ¿¹ ÏÚ®¶%è€ç@æêל²™äêÝŸ˜çæìÊŸ®¢éíâ©§ëì¼¥¥­ìì¶©¡´ìì°¬ž»ìèÀ‰¹èÝßœ¥Š´ÍÁ”d¸ÚÕ¬µ%è€çAæïµ¼È„ÏíßЦäæî¨Ê¹‰Ûð£Ð±ßìŸÖ¨’äèžÚ¡˜éâžÜšŸéåÚ±·èâϘςœÑÁ±£çÌÖ¨´%è€çBæî¶£¯ªÂíéä¤åç묢²§Òí§¡´¥×ꥤ´£Ý椤µ£äÞ ¥·¦æåñ¸¶êä͘¨šÒÅÆˆ–èÛÎÕ¥³%è€çCæíÄܟÐìçÞ¡ãæî²Þ™Üðª”Ü™áؚæì™¥Óœê钮͡íäì´³êâÛ‚¶³ž×ÇĉŽáæÚÍÕ£²%éèCé㨡¯êêܪž¬ßíÛ¥ ºìëÖ¢Ÿ¿ìëÑ¢ŸÅììÌ¢ŸËììÇ¢ŸÐìêÁŸž¿ææ¶›™ËÔÌ€sÃôâÚÍÕ ±%é‚è)êçÙêéèçäçäççëäÚëèçìâÜìèçëáÝìèçìÞßìçèìÝáìçè€åâåäåÓÙÜÔÎú§ÉøêäÚÍÔŸ°%é„èëè=éèéèèçèëçèèçéêçèèçêëçèèçêêçèèçêêçèèéèèçåäâäßÙÖÐȾ¬ÃüñëãÚÍÕž ¯%êƒéççé çèèééèèéèéé€èç€éçç€éèçè€éèééçè€çæãáßÜØÒȾ®¼ý÷òëãÙÌÕ ®%êƒéïí€éêïì€éëìçíééëëèíèéëïë€é(ëïëééèíéêìéèíèêêçæééâÝÙÓÏÆ²¸ýû÷òëâÙÌÖ ­%ê‚éGêÆ©äêéé­ééê㪣Éíêß§£Îíéå´¸íèêã°ÀîçíÒ¢©ÛëíÍ «Þêè×£ÈâØÖ¼‹£¸úþû÷òëâÙÍÕ ¬%ê€éJèëß®˜ßëëÛ«žçèñ´¸ÄŠäò­¿»éíÏ¡¨îçíÌŸ²ðçëžÓ¡¦ðæ›Ø˜®ïç½”¼æØÔ¦€¸úÿýû÷òëâÙÍÖ «%êƒéHì£Þëèëæ¦åèîªÁ¨›×ð¦Â¦ÛëîÔ¨íèèðϱïêߤĞ¥ì٥œ©êåð´ºæÙÓÖ™›·ùÿþýû÷òëâÚÍÖ ª%ë‚êJìî£æîéíè§îëï¯Õ¥Öò¨“×¢ÝëòÕ«õéèôϵ÷êå—¤Ô¢îà’«Ð¤îæô´ÀìÙÕÙš¢¼øÿÿþýû÷òëãÚÍ× ©%ëê;ëåÅ”¾äíãÀ—Åäñŕžéñ½š¾¢íëÞ²˜ÏéìÜ®žÒé𥬰´ðퟱ«¼ðèÓ£ÒÝÖº‡‰«ú€ÿ þýûöñëãÚÎØ ¨%ëê<ìã¼À¼àîà¼À¼ãëìDZÞíêê³àìíÖº¾ÃéíÓ»¾Åëëå¹»éêì⵿ëéêÆº·Èß×°¢•¦ûÿ€þ ýüúöñêãÛÎØž §%ì‚ë:ìòñòíêíòñòìëëðóíêëëñòíëëîòññëêïòòñëëìòòìëëíòòëêéîîìæÝØÖоú„ÿ ü÷ðèáÙÎÙž ¦%ìƒëêèê€ëéèé€ëéèê€ëèèê€ë éèêëëêèèêëëêèè€ë$êééëêêèåãâÞØÐȼºíñíëìïñöûýÿýöêÜÌÖž ¥%ìƒëìð€ëêïóìêëëðóìëëêñò€ëêíïëòòëòñ€ë%êîíëêêèìçâÞØÔÒĵª›Ž‡}~‡’«ÀÓäëÜÝœ ¤%ìë"êíêÕéìêïÕÀåíêîÒÂçíêîÎÄéìêðáØíëëìÈÉì€ë+ÅÌíëêñÚßíêêîÖÛåÞÜͦ±¼¬Ÿˆjs|wwlYdjgnq}­Íæ¥ £%ìëRíå§”ãìïÕ ´ ëð΢±¥íñÇ¥¬ªïîÕ•©ðéñ¹¬¥·ð𳯡¿ñíÆÀòèíÀŠÂêÞÛ”Ÿ€©´ŸdhRvyUaOs|qMUDs‘Ï¡¢&íìQíæØ¥áíô²ÈÆ‰Ùø«Î½Œàõ§Ôµ‘äïâÇ­ðëì¢ß¥›îç á¢ïëá·¾ôêêÞ±¿ìäÇ™Åw”¾‘o„NmŽoewIlˆfeqJlsj£‰£&íìSëîï¤âíò¶¦´¬Ì÷¯¥¶ªÖ󫥸¨ÛîôÖªñì騨º§è㤨º©ëêø¾¼ôêéö¶¾ìæÄ•˜ž‘Ä•oqrp›xcijn”p`gfoŠkc¡&îƒíRé¡áîô¿ŠäŸÛø¶ãœáö­—áœèíñѨñëò©Ù ðï–²Ò¥óëôº»õëêò³½íåÕ|¹£šÊªb—{¨Wo¡ƒUi‚•‰yŒ5 &î€íVìï䬩àò䪤¹ðïਣ¾ñðÛ¦£ÃñðÒ£ž·ìòÑ¥£ÐññË¥£ÕñïߟÃðí¾žÅèä®—”ÅÇÁŽ}~ª¬ªuz¥§£yry¡ž›—’Œ Ÿ&î‚íTìåèåìíðêÞðíìðéßñíìðçáñíîéæèæíìñãäñìíñâåñìîèççèíìæåããçãáÍÔÓÊÇñ¹¹¶¶´§³´±³°¦°®«©¦¢š¢HŸ&îƒíïîïííìíð€í7ìîðìííìîðìííîïîïííìïïìííìðïìííîïïîíìíììêæåáàÙÕÐÌÈÇ¿¿¾½¿€½ ¼¼¾º¹·µ³°«¯~Ÿ&ïƒîìííîîííîí€îììîìì€îííîìîîíìí€îíìí€îíìííîîììëêèçãáÜÙÖÒÎËÊÉÈÇÆÅÆ€Ç ÅÆÄÄÂÀ¾¼¸¼œ &ïƒîôò€îïñìòîîïõñ€îïõñîîíñðíòíîðõð€îñõïîîíñôïîîíòëîîéèëâäßÚÙÛÙÒÐÏÏÔÔ€Ï ÑÔÍÒÎÌÊÈÇÃɧ &ï‚îSïˬéïîë±¥ÈòííÁµðîî뼸ñíñ੨×òîè´Åóíïå±Éóìïã®ÎóìóÌ¢°æìíž®ßáÞÆ›ËÛÖ×¾˜ÍÙÖØ¦“­ØÔÓÑÏÍÕ° &ð€ïUîñ䲜åðöÀµÑ‰æõÚ­¦ïî󨧧òíöªË¶šòóÑ¢·öíóËžº÷íòÇ›Áöïéß”º÷ߛ܋½ìß°ÉâÝ׫Ìßá¾Ê}ÌßÙÙØÖÞ· &ðƒïRò§ãðö´Ä°Ôôñé«îïîôá©ñîïªÊ¦¢åðöÔ¶õîíùɸöîíùþöòڭİøÎ¯¿™²îäî¨Êèââé¢Îäé³³¬’½çÞßÝÛã½ &ð‚ïSñô§ëòõ»×­Óôóé­öðíöá«ùïñ§œÛ¤èïùÔ¹üííüɼýííüÂÃûðᓵϪùغǮñçóªÕïåçï¥ÚììÀˆÇ¯¾ìããâàé &ðïMðêɘÂèöѕȟëòåÁ›Ìëò仚Ïë÷¹£¿«ôðá²¢×îðÞ«£Ùïðܧ§Üð𜼪Çõì—À¤ÍòèΙ²ÞìåÉ•µßî×ÚÜë€çåîÅ &ñðTòéÁÅÁæòòеßóòâÀÄÃëôß¿ÄÅíñïĺéñóÙÀÃËðóÓÁÂÎñòÐÁÁÐòòå¸ÈòïòáµËñîížÙñéÂÁ½ÝîïÓ°ÔïêëêêçñÇ &ñ‚ð8ñø÷øòððõøóïðóø÷øñïóø÷÷ñðñ÷øòððôøøöðïõøøöððöøøõðïòøöððïò÷õ€ïõõöòíïõõöñîîòõñìíëõÊ &òƒñïîï€ñïîð€ñîîï€ñîîï€ñîîðññðîîðññðîïðññðîîðññðîï€ñðîï€ðîííïððîíî€ðîíîïîìöË &ò‚ñðõùóðñðòõ€ñðöùòññð÷øñ÷øñøø€ñðôôñ ùöðññòùöðñðóùõðñðóùôïðïóùóïðïôøóïðîøÍ &òñðõßÄèôðôîÜññðõ×ÇíóðôÓÉðòñôÐË€ñ.òÍÎòñð÷ããóðòïÈÕôðóíÆÙôðóêÅÛõðôçÄàõðôäÃãôïõáÄæôð€ñîøÍ &ò€ñNðõࣺ îô禟ñðöÓ¦µ©ó÷Ì©°¯õ÷Å«¬µöö¾°©¼÷ôÐ’¿øïö±¶¡Ì÷󭹞Ó÷𨻜Ùöí¦¼œàö裼œæö䣻žìò€ñïùΠ&ó€òUðû½ÄÓŠØùêÙ­ïñú°ÓÁåûªÙ¹”ê÷¦ß°™ïó¥ä¨Ÿòó翽ùóç¥èš­ûà§ç”µþØ­ç¼ÿвãŒÄÿɸ݊ÌÿÁÀ×ŠÔøñòòðúÏ &ó€òUðù¿ª·²Ìùôï«ðò÷´©º¯Üù¯¨½­áõ­­½ªçñ«¬¾«ìñþɼúô⥮¿®øÝ§®½°ýÕ§°»´ÿͦ²º»ÿȦ´¶Àÿ¨µ´ÇúðòòðúÏ 'ô€óUòúÍŠè¨Úøóê©ïòú¼”é¡çý²›ç¡íúª¤ã¢òø¡­ß¤öñúƺúòñ“ÀЯüìŽÊȵþçŠÓÀ¼ÿàˆÚ¸ÄÿÙ‡à±ÌÿÒˆæ«ÖùòóóñûÏ 'ôóLôî°©¸õõ毢±éøå­¨Ã÷öà«§ÈøöÛª§Î÷÷Öª§Õ÷öͤ£ÅôøÊ©¨àö÷΍åõöÀª«êõõºª®îôó¶©±ñô𳪴ôóñûÏ 'ôóLòõòãõôóñëîëòóöîå÷óòöíæ÷óò÷ëç÷óò÷éé÷òôîìííóó÷æí÷òó÷äîöòóöäñöòôõãòõòôôãóõòõòãôôóñûР'ô„óöó,õôõóóòôöòóóòôöòóóòõöòóóòõõòóóôõôôóóòöõòóóòöôò€óöóòóóòöô€óòö‚ó÷ƒóñûР'õƒôóóôòóóôôóóôó€ôòó€ôóôôóôôóòóóôôóôóóôôóòôóòôóòôóôó€ôóôò‚ôòüР'õƒôúøôú÷€ô&ö÷òøôôõû÷ôôó÷õóøóó÷õô÷óô÷úõôôóøóõöôôøúõ€ôøúôùùôùñøõôõøòø‚ôòüР'ö‚õLöѲðöõõ̶õõöÔùôó¾øôøç­­Ýøøâ«¯áøõì¶Ïúóúר´ë÷öæ¯Ùúó÷â°áùô÷Þ¯æøôøÂ§Âöõö¾¨Æøô€õóþÑ 'ö€õUôøê· ë÷øç³¦óôý¾ÁΑñûÝ«¬øóü¯Ð»žøú©×³¥úøÐ¢¿üôó£ã ·üõÉŸÌýóõÆ ×ûõòÀÜùùÛ©å‹ÚÿÒ®à‹ãùôõõóþÑ '÷ƒöRø¬éøõ÷ó¯ñõü³Ë²£ãùúç®÷õö¯Ð«¦íõ®Ï¨ªòõÿϽüøå®Í¤²øóÿÂÉýõôÿ¿ÔûõôþµÚùýɽÀ ÈÿÂüŸÏýôööôÿÑ '÷‚öSøû­òúôùõ±úöü¹˜à¯âùýè±ÿöø¬¢à©ïø¦¦á©ôõÿÏÃÿ÷ì›´Ú®ûóÿÂÐÿôõÿ¿ÛÿôõÿµâþûÔ’ÏÂÃÿÌ’Õ¼ÍþõööôÿÑ '÷öT÷ñÏœÈïùïËŸÎðþÏ̧õøëÀžÕòþ¾¨Ä°úü¶¯¿¶üöä°¨àöú¨º´Åýõਰç÷õݧ·èøôØ¡¼éúê—ͤãþã—ϤéùõööôÿÒ '÷öMøïÆÊÆìúìÆÊÆïø÷ÐºéøøåÄÉÊó÷õÈ¿ï÷÷óÅÁó÷ùÙÅÇÓ÷øí¿ÈööøÓÇÅÛùöÐÈÅÞúôÌÉÄâøù߸ÙúôúÛ¸Þúõ€öôÿÒ '÷‚öK÷þýþøõøþýþ÷ööüþùööùþýý÷ö÷ýþøöö÷ýþøöõûþþüööøþý÷ööüþþûõöüþþúõöýýþúööúþûõöõúþûõöôÿÒ 'øƒ÷õôö€÷õôö€÷õôö÷÷öôôõ€÷õô€÷öôôö÷÷öôôö÷÷öôô€÷öõõö÷÷öõõö÷÷öõõ€÷öõö€÷öõö‚÷õÿÓ 'ø„÷ü€÷öøû÷ ýÿø÷÷öýÿø÷÷öùû÷þþ÷ÿý€÷øÿýöŸ÷õÿÓ 'ùø.÷úøáöù÷ûõâøø÷üÝÍôú÷ûÚÐ÷ù÷ýîåúøøùÓÕùøùøÐØû÷ùöÎÛûŸøöÿÓ 'ùø0úñ°›ðúúî«£ø÷ýÙ«º®úþÒ®µ´ýûá²þöÿô®Âþý¼¸©Êþü·»¥Òþ÷øöÿÓ 'ùø0ùòã­íúùñß²õ÷ÿµ×Æ“ëÿ¯Ý½˜ðûîÒ¶ý÷ø©è¬£úó¨ë¥ªþí©ìž²ý÷øöÿÔ 'ùø/÷úû¬íû÷üõ°õøý¹®¿³áÿ³­Á±æúÿà³ýøõ°°Ã¯ôıû課óúƒøö÷–øöÿÔ 'úƒù.õ©íûøúï­õøÿÀ—î¤ìÿ¶Ÿì¤ôúýܱþ÷þ¥°ã¨üûºÛ¬ÿö—ÄÕ³ÿø‚ùþø÷•ù÷ÿÔ 'ú€ù1øûïµ¥²ëÿ볦µïþê°¬Èýü殫ÍþüÝ«¥ÁøþÛ­«ÚýýÔ­«àýþÏ­«åýøùûÛôüö”ù÷ÿמ(û‚ú.ùñõòøûøñõñùúýõëýúùýóìýúûöòôòúùþïïþùùþîñýùúýìóýùú÷ÿOAóÿõù‘úùôÿÄŸ(ûƒúüûü€ú&üûüúúùûýùúúùûýùúúûüûüúúùüüùúúùýüùúúùýüù‚ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(ûƒúùúø€úùúùúúùùúùúúùùúù€úøù€úùúùù€úùúú÷úúù„úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(û‚ú"ûýøþúúûý÷þúúûüøþúúüüùýùúüÿüúúùýûúýù‚úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (ûƒú)¿¬Îýúø»­Òþûô¶®Ùþûð³¯ÝþúöÂÅÿøþ篳æþùú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û€ú-ùÿÒµâêÿɽۑñÿÁÅÒ•õÿºÍÉšúÿ߬´ÿøÿ­Ü¶©ÿùúöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(ü€û.ùÿÂ˾£×ÿ¼Ìº¥Þÿ¶Î¶§çÿ³Ð³©ìýÿäµÿûø²Ó¬­öüû÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü€û/ùÿ˗ܺÔÿØàµÝÿ»šâ±æÿ´Ÿä¯íýÿä¸ÿúû©ªã¬ùüûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ý€ü0ûÿå›Ô§òÿÜÓ§öÿÔ¡Ñ«ûÿ̥ͯÿýïÀ¤ßúÿ»²ÃºÿûüúÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýü/ûÿݽæÿûþÚ½êÿûýÕ¿îÿüüÑÀñþÿæÉÍÒüýùÊÆøýüüûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ýƒüþÿþ€üÿÿþ€üÿÿý€üÿÿýüüþ€ÿ€üÿÿýü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ýƒüúùú€üúùû€üúùû€üúùûüüûùùú€üúú‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚üûþÿýüüûüÿ€üûýÿüÿÿüÿÿ€üûþþ‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýü"ûÿéÎòþûþøæüüûÿöçýüüÿÞÓúýüþÛÕûýûÿïìþ‚ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ€ý$üÿì«Ã¨úÿó®¦ýüÿí©¬ÿüÿײ¹¸ÿÿÏ´µ¿ÿÿáÂÿûý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þ€ý$ûÿÇËÚ‘âÿôãµúýÿóà·üüÿ³ßÁ›õÿ¯æ¹ ùÿòÑÃÿüý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(ÿ)ýÿÅÍÁ¥ÜÿÿøµûþÿºÐ¸©ëÿ¶Ó¶«ðÿÿå¸ÿþþÿÞÂÿÿô´Õ­µ€ÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(ÿdýÿΙ߽Ùÿÿø¶üþÿ¿ä³êÿ·¢ç±ñÿÿåºÿþþÿÞÄÿÿú¦²ã±ÿþÿè¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(ÿ\þÿçœ×©öÿøÑ¤ÕøÿÖ£Ó­þÿΧбÿÿò¦áþÿð¾­åþÿ´»ÀÅÿÿÒGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(„ÿOà¿çÿÿõÍÑÍøÿÿ×ÁðÿÿþÓÃóÿÿéËÏÕþÿæÌÏ×ÿÿ÷ÈÌüÿÿú/¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(ÿþ™ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(„ÿýüþ€ÿüüý€ÿýüþ€ÿýü€ÿ8þüüýÿÿþüüþÿÿþüüþÿþÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(„ÿþ‡ÿþ‚ÿþþÿþÿÿþÿÿþ‚ÿ-þÿÿþÿÿûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿûèýÿþÿçÒöÿþÿäÓúÿþÿõêÿ ÝØüÿþÿñîÿþÿüÖß‚ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(ƒÿ_øµ ÷ÿÿç­Â­þÿ߯¾³ÿÿ쥱ÿýÿж·ÀÿÿãžÃÿüÿ½­ÐÿþÿÿþþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(ƒÿ<øé²óÿÿÁÓÓ”êÿ¹ÛË—òÿôÛ·ÿþÿ°çº¡ûÿôÓÄÿÿú­î©°ÿþÿÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(„ÿ'ý±ôÿÿųºÝÿ½²Ä·èÿÿêµÿÿþ·¶Æ´óÿÿÝÃÿÿô±¶Ç·þ„ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(„ÿ(ü®òÿÿΕñ«ìÿÄ›ò©ôÿÿè±ÿýÿ²«ìªÿþÿÛÀÿýÿ¢¾à²ÿþ„ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ÿ+þÿõ¹©¶ñÿô·±Åÿÿï´°Ìÿÿæ°©Àùÿ䳯ØÿÿÞ®«ÊÿÿÙ²°äÿþ„ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(ƒÿþ÷ú÷ýÿÿúïÿøð€ÿü÷úø€ÿõò€ÿûøùø€ÿòõŠÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(‰ÿþþÿþ‚ÿþ…ÿþÿÿþ…ÿþÿÿþˆÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(‹ÿþ‚ÿþˆÿþ‡ÿþŒÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(»ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(µÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü±û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(±ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b®cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埱=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç©æååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæå傿åæååæååæååæååæåããáßßÜÚ×ÒÎÊľ°ß¶¸%è‚çæëïéæçæèëçìïèççæíîçíîçîîçîíææäãæäßÞÚÚÜÔËÅ¿±¿ä¯·%èçæëÕ¼ÞêæêäÒççæëοãéæêËÁæèçéÈÀçèÄÆè€çÂÈèæäéÓÖâÞÝÕ°»ÏÆ¿¹ ÏÚ®¶%è€ç@æêל²™äêÝŸ˜çæìÊŸ®¢éíâ©§ëì¼¥¥­ìì¶©¡´ìì°¬ž»ìèÀ‰¹èÝßœ¥Š´ÍÁ”d¸ÚÕ¬µ%è€çAæïµ¼È„ÏíßЦäæî¨Ê¹‰Ûð£Ð±ßìŸÖ¨’äèžÚ¡˜éâžÜšŸéåÚ±·èâϘςœÑÁ±£çÌÖ¨´%è€çBæî¶£¯ªÂíéä¤åç묢²§Òí§¡´¥×ꥤ´£Ý椤µ£äÞ ¥·¦æåñ¸¶êä͘¨šÒÅÆˆ–èÛÎÕ¥³%è€çCæíÄܟÐìçÞ¡ãæî²Þ™Üðª”Ü™áؚæì™¥Óœê钮͡íäì´³êâÛ‚¶³ž×ÇĉŽáæÚÍÕ£²%éèCé㨡¯êêܪž¬ßíÛ¥ ºìëÖ¢Ÿ¿ìëÑ¢ŸÅììÌ¢ŸËììÇ¢ŸÐìêÁŸž¿ææ¶›™ËÔÌ€sÃôâÚÍÕ ±%é‚è)êçÙêéèçäçäççëäÚëèçìâÜìèçëáÝìèçìÞßìçèìÝáìçè€åâåäåÓÙÜÔÎú§ÉøêäÚÍÔŸ°%é„èëè=éèéèèçèëçèèçéêçèèçêëçèèçêêçèèçêêçèèéèèçåäâäßÙÖÐȾ¬ÃüñëãÚÍÕž ¯%êƒéççé çèèééèèéèéé€èç€éçç€éèçè€éèééçè€çæãáßÜØÒȾ®¼ý÷òëãÙÌÕ ®%êƒéïí€éêïì€éëìçíééëëèíèéëïë€é(ëïëééèíéêìéèíèêêçæééâÝÙÓÏÆ²¸ýû÷òëâÙÌÖ ­%ê‚éGêÆ©äêéé­ééê㪣Éíêß§£Îíéå´¸íèêã°ÀîçíÒ¢©ÛëíÍ «Þêè×£ÈâØÖ¼‹£¸úþû÷òëâÙÍÕ ¬%ê€éJèëß®˜ßëëÛ«žçèñ´¸ÄŠäò­¿»éíÏ¡¨îçíÌŸ²ðçëžÓ¡¦ðæ›Ø˜®ïç½”¼æØÔ¦€¸úÿýû÷òëâÙÍÖ «%êƒéHì£Þëèëæ¦åèîªÁ¨›×ð¦Â¦ÛëîÔ¨íèèðϱïêߤĞ¥ì٥œ©êåð´ºæÙÓÖ™›·ùÿþýû÷òëâÚÍÖ ª%ë‚êJìî£æîéíè§îëï¯Õ¥Öò¨“×¢ÝëòÕ«õéèôϵ÷êå—¤Ô¢îà’«Ð¤îæô´ÀìÙÕÙš¢¼øÿÿþýû÷òëãÚÍ× ©%ëê;ëåÅ”¾äíãÀ—Åäñŕžéñ½š¾¢íëÞ²˜ÏéìÜ®žÒé𥬰´ðퟱ«¼ðèÓ£ÒÝÖº‡‰«ú€ÿ þýûöñëãÚÎØ ¨%ëê<ìã¼À¼àîà¼À¼ãëìDZÞíêê³àìíÖº¾ÃéíÓ»¾Åëëå¹»éêì⵿ëéêÆº·Èß×°¢•¦ûÿ€þ ýüúöñêãÛÎØž §%ì‚ë:ìòñòíêíòñòìëëðóíêëëñòíëëîòññëêïòòñëëìòòìëëíòòëêéîîìæÝØÖоú„ÿ ü÷ðèáÙÎÙž ¦%ìƒëêèê€ëéèé€ëéèê€ëèèê€ë éèêëëêèèêëëêèè€ë$êééëêêèåãâÞØÐȼºíñíëìïñöûýÿýöêÜÌÖž ¥%ìƒëìð€ëêïóìêëëðóìëëêñò€ëêíïëòòëòñ€ë%êîíëêêèìçâÞØÔÒĵª›Ž‡}~‡’«ÀÓäëÜÝœ ¤%ìë"êíêÕéìêïÕÀåíêîÒÂçíêîÎÄéìêðáØíëëìÈÉì€ë+ÅÌíëêñÚßíêêîÖÛåÞÜͦ±¼¬Ÿˆjs|wwlYdjgnq}­Íæ¥ £%ìëRíå§”ãìïÕ ´ ëð΢±¥íñÇ¥¬ªïîÕ•©ðéñ¹¬¥·ð𳯡¿ñíÆÀòèíÀŠÂêÞÛ”Ÿ€©´ŸdhRvyUaOs|qMUDs‘Ï¡¢&íìQíæØ¥áíô²ÈÆ‰Ùø«Î½Œàõ§Ôµ‘äïâÇ­ðëì¢ß¥›îç á¢ïëá·¾ôêêÞ±¿ìäÇ™Åw”¾‘o„NmŽoewIlˆfeqJlsj£‰£&íìSëîï¤âíò¶¦´¬Ì÷¯¥¶ªÖ󫥸¨ÛîôÖªñì騨º§è㤨º©ëêø¾¼ôêéö¶¾ìæÄ•˜ž‘Ä•oqrp›xcijn”p`gfoŠkc¡&îƒíRé¡áîô¿ŠäŸÛø¶ãœáö­—áœèíñѨñëò©Ù ðï–²Ò¥óëôº»õëêò³½íåÕ|¹£šÊªb—{¨Wo¡ƒUi‚•‰yŒ5 &î€íVìï䬩àò䪤¹ðïਣ¾ñðÛ¦£ÃñðÒ£ž·ìòÑ¥£ÐññË¥£ÕñïߟÃðí¾žÅèä®—”ÅÇÁŽ}~ª¬ªuz¥§£yry¡ž›—’Œ Ÿ&î‚íTìåèåìíðêÞðíìðéßñíìðçáñíîéæèæíìñãäñìíñâåñìîèççèíìæåããçãáÍÔÓÊÇñ¹¹¶¶´§³´±³°¦°®«©¦¢š¢HŸ&îƒíïîïííìíð€í7ìîðìííìîðìííîïîïííìïïìííìðïìííîïïîíìíììêæåáàÙÕÐÌÈÇ¿¿¾½¿€½ ¼¼¾º¹·µ³°«¯~Ÿ&ïƒîìííîîííîí€îììîìì€îííîìîîíìí€îíìí€îíìííîîììëêèçãáÜÙÖÒÎËÊÉÈÇÆÅÆ€Ç ÅÆÄÄÂÀ¾¼¸¼œ &ïƒîôò€îïñìòîîïõñ€îïõñîîíñðíòíîðõð€îñõïîîíñôïîîíòëîîéèëâäßÚÙÛÙÒÐÏÏÔÔ€Ï ÑÔÍÒÎÌÊÈÇÃɧ &ï‚îSïˬéïîë±¥ÈòííÁµðîî뼸ñíñ੨×òîè´Åóíïå±Éóìïã®ÎóìóÌ¢°æìíž®ßáÞÆ›ËÛÖ×¾˜ÍÙÖØ¦“­ØÔÓÑÏÍÕ° &ð€ïUîñ䲜åðöÀµÑ‰æõÚ­¦ïî󨧧òíöªË¶šòóÑ¢·öíóËžº÷íòÇ›Áöïéß”º÷ߛ܋½ìß°ÉâÝ׫Ìßá¾Ê}ÌßÙÙØÖÞ· &ðƒïRò§ãðö´Ä°Ôôñé«îïîôá©ñîïªÊ¦¢åðöÔ¶õîíùɸöîíùþöòڭİøÎ¯¿™²îäî¨Êèââé¢Îäé³³¬’½çÞßÝÛã½ &ð‚ïSñô§ëòõ»×­Óôóé­öðíöá«ùïñ§œÛ¤èïùÔ¹üííüɼýííüÂÃûðᓵϪùغǮñçóªÕïåçï¥ÚììÀˆÇ¯¾ìããâàé &ðïMðêɘÂèöѕȟëòåÁ›Ìëò仚Ïë÷¹£¿«ôðá²¢×îðÞ«£Ùïðܧ§Üð𜼪Çõì—À¤ÍòèΙ²ÞìåÉ•µßî×ÚÜë€çåîÅ &ñðTòéÁÅÁæòòеßóòâÀÄÃëôß¿ÄÅíñïĺéñóÙÀÃËðóÓÁÂÎñòÐÁÁÐòòå¸ÈòïòáµËñîížÙñéÂÁ½ÝîïÓ°ÔïêëêêçñÇ &ñ‚ð8ñø÷øòððõøóïðóø÷øñïóø÷÷ñðñ÷øòððôøøöðïõøøöððöøøõðïòøöððïò÷õ€ïõõöòíïõõöñîîòõñìíëõÊ &òƒñïîï€ñïîð€ñîîï€ñîîï€ñîîðññðîîðññðîïðññðîîðññðîï€ñðîï€ðîííïððîíî€ðîíîïîìöË &ò‚ñðõùóðñðòõ€ñðöùòññð÷øñ÷øñøø€ñðôôñ ùöðññòùöðñðóùõðñðóùôïðïóùóïðïôøóïðîøÍ &òñðõßÄèôðôîÜññðõ×ÇíóðôÓÉðòñôÐË€ñ.òÍÎòñð÷ããóðòïÈÕôðóíÆÙôðóêÅÛõðôçÄàõðôäÃãôïõáÄæôð€ñîøÍ &ò€ñNðõࣺ îô禟ñðöÓ¦µ©ó÷Ì©°¯õ÷Å«¬µöö¾°©¼÷ôÐ’¿øïö±¶¡Ì÷󭹞Ó÷𨻜Ùöí¦¼œàö裼œæö䣻žìò€ñïùΠ&ó€òUðû½ÄÓŠØùêÙ­ïñú°ÓÁåûªÙ¹”ê÷¦ß°™ïó¥ä¨Ÿòó翽ùóç¥èš­ûà§ç”µþØ­ç¼ÿвãŒÄÿɸ݊ÌÿÁÀ×ŠÔøñòòðúÏ &ó€òUðù¿ª·²Ìùôï«ðò÷´©º¯Üù¯¨½­áõ­­½ªçñ«¬¾«ìñþɼúô⥮¿®øÝ§®½°ýÕ§°»´ÿͦ²º»ÿȦ´¶Àÿ¨µ´ÇúðòòðúÏ 'ô€óUòúÍŠè¨Úøóê©ïòú¼”é¡çý²›ç¡íúª¤ã¢òø¡­ß¤öñúƺúòñ“ÀЯüìŽÊȵþçŠÓÀ¼ÿàˆÚ¸ÄÿÙ‡à±ÌÿÒˆæ«ÖùòóóñûÏ 'ôóLôî°©¸õõ毢±éøå­¨Ã÷öà«§ÈøöÛª§Î÷÷Öª§Õ÷öͤ£ÅôøÊ©¨àö÷΍åõöÀª«êõõºª®îôó¶©±ñô𳪴ôóñûÏ 'ôóLòõòãõôóñëîëòóöîå÷óòöíæ÷óò÷ëç÷óò÷éé÷òôîìííóó÷æí÷òó÷äîöòóöäñöòôõãòõòôôãóõòõòãôôóñûР'ô„óöó,õôõóóòôöòóóòôöòóóòõöòóóòõõòóóôõôôóóòöõòóóòöôò€óöóòóóòöô€óòö‚ó÷ƒóñûР'õƒôóóôòóóôôóóôó€ôòó€ôóôôóôôóòóóôôóôóóôôóòôóòôóòôóôó€ôóôò‚ôòüР'õƒôúøôú÷€ô&ö÷òøôôõû÷ôôó÷õóøóó÷õô÷óô÷úõôôóøóõöôôøúõ€ôøúôùùôùñøõôõøòø‚ôòüР'ö‚õLöѲðöõõ̶õõöÔùôó¾øôøç­­Ýøøâ«¯áøõì¶Ïúóúר´ë÷öæ¯Ùúó÷â°áùô÷Þ¯æøôøÂ§Âöõö¾¨Æøô€õóþÑ 'ö€õUôøê· ë÷øç³¦óôý¾ÁΑñûÝ«¬øóü¯Ð»žøú©×³¥úøÐ¢¿üôó£ã ·üõÉŸÌýóõÆ ×ûõòÀÜùùÛ©å‹ÚÿÒ®à‹ãùôõõóþÑ '÷ƒöRø¬éøõ÷ó¯ñõü³Ë²£ãùúç®÷õö¯Ð«¦íõ®Ï¨ªòõÿϽüøå®Í¤²øóÿÂÉýõôÿ¿ÔûõôþµÚùýɽÀ ÈÿÂüŸÏýôööôÿÑ '÷‚öSøû­òúôùõ±úöü¹˜à¯âùýè±ÿöø¬¢à©ïø¦¦á©ôõÿÏÃÿ÷ì›´Ú®ûóÿÂÐÿôõÿ¿ÛÿôõÿµâþûÔ’ÏÂÃÿÌ’Õ¼ÍþõööôÿÑ '÷öT÷ñÏœÈïùïËŸÎðþÏ̧õøëÀžÕòþ¾¨Ä°úü¶¯¿¶üöä°¨àöú¨º´Åýõਰç÷õݧ·èøôØ¡¼éúê—ͤãþã—ϤéùõööôÿÒ '÷öMøïÆÊÆìúìÆÊÆïø÷ÐºéøøåÄÉÊó÷õÈ¿ï÷÷óÅÁó÷ùÙÅÇÓ÷øí¿ÈööøÓÇÅÛùöÐÈÅÞúôÌÉÄâøù߸ÙúôúÛ¸Þúõ€öôÿÒ '÷‚öK÷þýþøõøþýþ÷ööüþùööùþýý÷ö÷ýþøöö÷ýþøöõûþþüööøþý÷ööüþþûõöüþþúõöýýþúööúþûõöõúþûõöôÿÒ 'øƒ÷õôö€÷õôö€÷õôö÷÷öôôõ€÷õô€÷öôôö÷÷öôôö÷÷öôô€÷öõõö÷÷öõõö÷÷öõõ€÷öõö€÷öõö‚÷õÿÓ 'ø„÷ü€÷öøû÷ ýÿø÷÷öýÿø÷÷öùû÷þþ÷ÿý€÷øÿýöŸ÷õÿÓ 'ùø.÷úøáöù÷ûõâøø÷üÝÍôú÷ûÚÐ÷ù÷ýîåúøøùÓÕùøùøÐØû÷ùöÎÛûŸøöÿÓ 'ùø0úñ°›ðúúî«£ø÷ýÙ«º®úþÒ®µ´ýûá²þöÿô®Âþý¼¸©Êþü·»¥Òþ÷øöÿÓ 'ùø0ùòã­íúùñß²õ÷ÿµ×Æ“ëÿ¯Ý½˜ðûîÒ¶ý÷ø©è¬£úó¨ë¥ªþí©ìž²ý÷øöÿÔ 'ùø/÷úû¬íû÷üõ°õøý¹®¿³áÿ³­Á±æúÿà³ýøõ°°Ã¯ôıû課óúƒøö÷–øöÿÔ 'úƒù.õ©íûøúï­õøÿÀ—î¤ìÿ¶Ÿì¤ôúýܱþ÷þ¥°ã¨üûºÛ¬ÿö—ÄÕ³ÿø‚ùþø÷•ù÷ÿÔ 'ú€ù1øûïµ¥²ëÿ볦µïþê°¬Èýü殫ÍþüÝ«¥ÁøþÛ­«ÚýýÔ­«àýþÏ­«åýøùûÛôüö”ù÷ÿמ(û‚ú.ùñõòøûøñõñùúýõëýúùýóìýúûöòôòúùþïïþùùþîñýùúýìóýùú÷ÿOAóÿõù‘úùôÿÄŸ(ûƒúüûü€ú&üûüúúùûýùúúùûýùúúûüûüúúùüüùúúùýüùúúùýüù‚ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(ûƒúùúø€úùúùúúùùúùúúùùúù€úøù€úùúùù€úùúú÷úúù„úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(û‚ú"ûýøþúúûý÷þúúûüøþúúüüùýùúüÿüúúùýûúýù‚úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (ûƒú)¿¬Îýúø»­Òþûô¶®Ùþûð³¯ÝþúöÂÅÿøþ篳æþùú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û€ú-ùÿÒµâêÿɽۑñÿÁÅÒ•õÿºÍÉšúÿ߬´ÿøÿ­Ü¶©ÿùúöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(ü€û.ùÿÂ˾£×ÿ¼Ìº¥Þÿ¶Î¶§çÿ³Ð³©ìýÿäµÿûø²Ó¬­öüû÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü€û/ùÿ˗ܺÔÿØàµÝÿ»šâ±æÿ´Ÿä¯íýÿä¸ÿúû©ªã¬ùüûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ý€ü0ûÿå›Ô§òÿÜÓ§öÿÔ¡Ñ«ûÿ̥ͯÿýïÀ¤ßúÿ»²ÃºÿûüúÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýü/ûÿݽæÿûþÚ½êÿûýÕ¿îÿüüÑÀñþÿæÉÍÒüýùÊÆøýüüûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ýƒüþÿþ€üÿÿþ€üÿÿý€üÿÿýüüþ€ÿ€üÿÿýü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ýƒüúùú€üúùû€üúùû€üúùûüüûùùú€üúú‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚üûþÿýüüûüÿ€üûýÿüÿÿüÿÿ€üûþþ‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýü"ûÿéÎòþûþøæüüûÿöçýüüÿÞÓúýüþÛÕûýûÿïìþ‚ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ€ý$üÿì«Ã¨úÿó®¦ýüÿí©¬ÿüÿײ¹¸ÿÿÏ´µ¿ÿÿáÂÿûý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þ€ý$ûÿÇËÚ‘âÿôãµúýÿóà·üüÿ³ßÁ›õÿ¯æ¹ ùÿòÑÃÿüý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(ÿ)ýÿÅÍÁ¥ÜÿÿøµûþÿºÐ¸©ëÿ¶Ó¶«ðÿÿå¸ÿþþÿÞÂÿÿô´Õ­µ€ÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(ÿdýÿΙ߽Ùÿÿø¶üþÿ¿ä³êÿ·¢ç±ñÿÿåºÿþþÿÞÄÿÿú¦²ã±ÿþÿè¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(ÿ\þÿçœ×©öÿøÑ¤ÕøÿÖ£Ó­þÿΧбÿÿò¦áþÿð¾­åþÿ´»ÀÅÿÿÒGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(„ÿOà¿çÿÿõÍÑÍøÿÿ×ÁðÿÿþÓÃóÿÿéËÏÕþÿæÌÏ×ÿÿ÷ÈÌüÿÿú/¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(ÿþ™ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(„ÿýüþ€ÿüüý€ÿýüþ€ÿýü€ÿ8þüüýÿÿþüüþÿÿþüüþÿþÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(„ÿþ‡ÿþ‚ÿþþÿþÿÿþÿÿþ‚ÿ-þÿÿþÿÿûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿûèýÿþÿçÒöÿþÿäÓúÿþÿõêÿ ÝØüÿþÿñîÿþÿüÖß‚ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(ƒÿ_øµ ÷ÿÿç­Â­þÿ߯¾³ÿÿ쥱ÿýÿж·ÀÿÿãžÃÿüÿ½­ÐÿþÿÿþþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(ƒÿ<øé²óÿÿÁÓÓ”êÿ¹ÛË—òÿôÛ·ÿþÿ°çº¡ûÿôÓÄÿÿú­î©°ÿþÿÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(„ÿ'ý±ôÿÿųºÝÿ½²Ä·èÿÿêµÿÿþ·¶Æ´óÿÿÝÃÿÿô±¶Ç·þ„ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(„ÿ(ü®òÿÿΕñ«ìÿÄ›ò©ôÿÿè±ÿýÿ²«ìªÿþÿÛÀÿýÿ¢¾à²ÿþ„ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ÿ+þÿõ¹©¶ñÿô·±Åÿÿï´°Ìÿÿæ°©Àùÿ䳯ØÿÿÞ®«ÊÿÿÙ²°äÿþ„ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(ƒÿþ÷ú÷ýÿÿúïÿøð€ÿü÷úø€ÿõò€ÿûøùø€ÿòõŠÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(‰ÿþþÿþ‚ÿþ…ÿþÿÿþ…ÿþÿÿþˆÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(‹ÿþ‚ÿþˆÿþ‡ÿþŒÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(»ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(µÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü±û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(±ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b®cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埱=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽt8mk@+¯®®¯¯¯¯¯¯¯¯°¯¯¯¯¯°°¯¯¯¯°°¯¯¯¯°°°¯¯¯¯°°¯¯¯°°°¯¯¯¯¯¯¯¯­¬‘U  Gÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿä†  NÿûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûûýþÿÕ1Vÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúÿä<  \ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè?  `ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè@  bÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿæ>   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿå=   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿã;   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿâ:   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà9   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÞ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ9  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ3   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÖ+   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÇ    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ©   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿs   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç2   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŒ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÏ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè0   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê6  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê:  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê=  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê>  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêA!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç9"   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷c   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ–   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýW   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé31CE2  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿìšÔøÿÿþè¬B  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿþÿ¬  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýþÿÿÿþûüÿÝ'  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÜ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ°  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿS  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ0  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿo  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ»  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿº  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿj  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû,  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¼  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿK  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ¥  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿÒ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüþþÿþýûüÿÑ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ›   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿëÈïýÿøÜœ3  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé4%46#  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC"  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè>"  cÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿóG  aÿüýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýÿÿÿÿÿÿÿÿÿÿÿÿýÿÉ   _ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿp E¥¬²µ·¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¶ðÿþÿÿÿÿÿÿÿÿÿÿþÿöº·¸·¼øÿÿÿÿÿÿÿÿÿÿÿÿüÿº $,:DKNPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRN^òÿþÿÿÿÿÿÿÿÿÿÿýÿÍJRQRMÖÿýÿÿÿÿÿÿÿÿÿÿýÿß (28=@AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD:fÿÿÿÿÿÿÿÿÿÿÿÿÿüÿš4EBE5¥ÿûþþþþþþþþþþýÿã  $()**********************************************,#Kûýûüüüüüüüüüüûÿ^,*-jÿýÿÿÿÿÿÿÿÿÿÿüÿ¿ Ëÿýÿÿÿÿÿÿÿÿÿþÿì(+ÙïêëëëëëëëëéìÛ< (c]^^^^^^^^^]bM  ic08pª jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ o½ÿ“ÏÁ¦øñÁ&*1Sȉ ÜÊR8¡Át¢Ž´µ‰ s‰?Xµ!áÍQ Fp ¬Å­òx.9ZÔwP Ð×ÛÃTÁ‚~ŒÛɺAÝn·Nç…)îõˆeÌ5¹!—KïjÈš QcI8…°Wv“¬†ÖAÿlÛ³³*‹ÊÝÚjÑVBhÁ6ÎëæX+#dPa©®ÿF=ÊÁ->™%¶‡87 ÀõØ^Ã1I(ì4° ’#vôì7Ù ŒÇxá‹!'-fòÊÂógŸ"BŽñŽcãU\!‰ÏÛëÅpМc™^G¢}ܺS y/0¸LÄûF­ØÚxHM òzo”8sàïǧè…<õUzÇ&­¾|œ]h{-›K ?\Vîr² *;”- ‡Àj<µ'Ñ+HÿRÁªÕ| +`@O™oÔ@ÿ„ tÝ/MBVŠ©ç°Ë–¥ ìkÙƒjeÒ_ÁyÁ,Æ#šHˆCA&ô§) º˜¼¾pÄ"c³nq!'ó J®Sý÷É!y¹„Šw%I ´9uû“õÊ?5v½C‰ê‚pO–‰€%“‚ÁÏ'Çx¶¸)õò†rÇ4ohXû¨˜ÿA”j¾å¤&þ?­jMÎÝž;ªðy5¹fß“žšBºäv›µ>²eH.Â|AÊqq#9Öb«U6ÖˆÈÜ×n@ÒŽ-2xAÆñ‹ ÏÏ«™ùõ9ŸU`ฮw¿Ò’ –3è'=ÿ[L„M7Í»]9dë)8S™´3Šq¶š ´{PI¨ÍåK^*Øh-Ehtoö$÷²T¨¢¹Ä!¿)áדÞí”fÙKÇWMÿ0qKï—…Ô5ï_qÉho~NÆs´´ëõxBú1âuMŽƒèÆ]`UPÔ¼àÔñ'zæ­4\&›~ÖõbÍAÿýÛÎ`ŒÁƱ 4[7;nŒTìµDcS–3ð;sÜ‘ýûF†&fOé5Æ'Ù©‘ë¦w…m±p#ðìC"x†™²`Æx̪ùw[ 5,É_ñ+˜íìŒ+!¿ÄÚæ—?§$`ãëêÞbt دי—o†J:uS N$µ-\†þîõVò9«Áº„c{ál#!d8åjÛÇxäÙ28°Õ–5÷ °… Ümþ#ðØ£ð¿ÓõPóe¢@Èü–â†c…Áº#Âä¼5ß ž)‡gÀ¡Ü/D•V.òs!Ys L½T})8¸?ÓÂ7–!ZNkÛtÐHi%°¡65¼Z™ žÖðݘ´_Û•ò (qYgX–¹võ¸¦òu½ÐÀ¡Ž:KóºL2öïåÍ-ó(I9ªÀ߇ß=B«0ªbÎ?&·ì•UÌis’ó1uõ©Ð<“e®ˆ€cþx릷۷ˆúQ—³•ºÄ÷7«˜á$ RÖ;9óøí…C¶\w¨‡:³T»Jçugÿ EØyÒFv1+‘¼¹¦©ÿ ·¶6‚Zà—ìï ~3m!®^{9=XÑ‚VËDÿdwôDDèâx–z&Óhé´ý“ªƒ‹VNo S¼†+zœ/T´ÿ2-Ÿu `@³÷Ô'6âKˆhoFÁœ¤YyäÔ!ÅhPQ“üù’kaÇDŸ×Ê.<@µíNýöíª»EÖâ:åÏÑuÃ7Ð#“I߈J-·¯pösA%Ú4ü$¬£*Þ w½ž²Ú<Êéô3aßåØ ´˜'H‰B~ê‘WIó„§9šH*¦ Ê” ÞÊT²1"¢R¢tÛ`Dø€,yy¬4âYµ¹fÀºˆ0Ö—2}•õ˜ü.ëmÐUW÷Û¹—Ñg@Gw‹9@ݦ#Èl™ö‚èlr;[b€;èjl7ÉC€¶uEÂå…^@<µÓÿ_ ær¾&04òäµO´}ÉÙ—v”A4=ê•ô#†q«>}%h oØ·Ÿ £÷I™ÂЛ“ÑH€ÝôR¯öf^iˆØ¶u«ÈjÁ"OU%œ- ½@‰µòÿ¸¦!Ø{V·Œûݸ&Ì!<;?ûÅXË4| eJ â7ÇjUAè #ï¹Çˆ´ˆ¿®˜wg¨±¤jè‘‹í sO´Å@3h7ÏS2x0ýq˯LÎR4Õ›H¿†ªbÓŸ¦ma€‚·ž©Ý椔´PŒd+«ŽÄnˆñ=—à‰B»Yï+bñ›Ïõµ¬ -rÅ þ1ž ÊΗ|•E>ó„tÐÐýß"àËÞa ®/¯ùÅ0lÚÚ#€À»cq¾# -aô½À¯‡žé!Ä8G.¤Ýü…‰Jƒ×–`›@x¸šõµ…1‰îCédé,;ùË“x„ñ\±£$¦NbÙ“˜îûk_W°¤*£wܘž#›zŒÁâß)Žz1ªTékŒŠÄ€Ð ºžBÉ*ÃÕL¯£FÀÏKºß¥´¡ëVîûíȹ;¥î^ÐÄÛ&qô…Õ3`v~bŠé!Y3W4Œeé’”æœ!¸ÜígÔéò‰á–¢òµš+|eìq'‚b-2¯Ã…ºÔ‚Ã<ÅpÐÕGcv-åíûŸ§æžã˜Ä*Û) lçàñö-)ZÕ¾†ºf°ð°¤Mrç–zᤶ 7J¡Æ¡ˆï«]=”г¼,DÏZ½+ ›°ŽÒÏ¡Û7­Tj¦Æ…úÚ?óbÑÜ\»ÉXT_ŠÌ‚õÆ‘MqÝíážøŸ Ÿ_ kÑ. íw¬GÔGèãcž¯¡fÒ<ð®N§T¯T±µ 1¾ÛüBÑËââv0ß©Øc ž…›!èöÂÓ ·„Õ÷ëš‹aˆsm¥´Ã‘ù5Ð’¬ì†—«Ëû÷u‘õGNèîÁ DŸ"«•O:  ¾Ïî¶/V˜”9RÂãŸÚÿ#]W¹¼ö¬N/izBŽd;þ ¾@гå $TvÌbQV·mº¸S 6DlÿeÙ ²j_¯Æá웼؈×|ú¸~VU^ó á¥C¾?=Ùªð>AíI(˨– ~7I§)¡-”g—ðþEw[ëvlŒ@€€Çá^Oδ‡áE€%hƒº¯­? aR ¨~-7k ZŽ[éHz¿N’xl“éM2ÄÀ6„í hÔ²§Pj•9å7ú# ´¶^`г.u¶·ºw—ùЋïEY¸’L'b»lÃgƒ®IbÛÄlqÑ]b jõÌËŒÙÚ³,Bìuz6µ€nb ˆ±EûÿIGñ¤;áyTÛ’•¤‰´Ú:¼Zg¹aÈ3û½$?žß¹õix»k 2CZ„ ñeeéâÇÞr¦©‰©H6D¸ìAºKáÜ󾀦¢ q4³©ˆ€oºå›OM#"œÁáƈý :R/(×[ÏCŸ¹áÛXTžƒèoaOŸ@öœüX]áp±ûK´®£ä†’zóEðœ’Gܘ‚-Ýn”ýÐ?(Y?þëÓHt‰ÈWææ.¸-ÎŽëªFá§ÃÙó®Àpø©© É×å +=ßlÎ$ĨT‡6ÍÑöк6!•£ ÙÆSß5áxíË À"æï.=lü`»¬³ÊÙ¨óCå*¬·uK¨Ç)¨¹S-©÷ÂÐPòo€BìÄÉ#4±a…ß,ŒÝÂY#é'W]M gî˜Qªô÷»Áh¾ä¢³«©1ȣУ8fî§òyU“'K–J±g4{CÛzª‹hŠ¡½<\€Ð¦µ$MfôðN©˜Px÷¼šAOÚ°¸ªYd]í´®øÆÇ¹„Û&Ÿ¯-ÓÎg]žJXUÙ\«G»²èQÚ,Ö¬NÊ(0ðê¤×ï¼…â]ÈÅP] ›ïbèã–·˜Èؿˤ=ÄÃÇíµàà§ãР߇ÒQ Ñü+f×z·v K\ Å˃Íû¶rä9â$]oÌÁÅdêØ ÊÆÜ1˜Å{µ íŒ4­µb/÷PÿNX.\ y4X¼‹bãq|dý28€À&é`‚¶uYGbX8ÌÐ1îóZ=¯G£×¢uoLǯ¯&äoî >˜³èœÈ†W¿¾ô.&ðÐo`ö¬®§€}ŸS±‡ÉÕ'0ÍØ¤—Ö!Lmàr ‹ìݶąvDûµgNÙûð‘T^s¾4¸¶KÒRhdñÀ™’ î—s?»ö5²×]¦Ñ7ÂLóXo/]÷}Wþ¦g¬I“PYšûþošº]]Ý0ö±öÝ\Ú]¸B}À-â#L*Áì$V7D~]…¢ÅIˆ,¾z¼ pýé =a Ç~I‚tµS7ïœ=Çf§I`ØÛ§iÐݵ }Xyhyf^1Ø–?3­—aþ‚¦ „W°`.íȼ޽’éÞ#‡pQÚ ¼æÖöl¼2vR+$T—u‘] r«|ýŒÚ©³‰S´ÁÓÚ˜©†q8dt<˜Çg;PÄûI©U­»{¬YÅÀ £µìÍÆH²¼jQôÜåÁàNh˜µhŽ ¦œ›¯[5Ã’ü²ª¨ºò{óŒö’‚6XIèd8–*Î ïóÞÊ^œú*žwñ®17ŒÅ-+Óµ) ÎÚ·–½¥*ÇW è$¬Yãï‰óDnÂCxÊ£ÂÀ÷\À-5B®¶ó†Æ „Vê÷Ô‘¶«È<ŒÍeØüiøÇÛÝüOê\äˆ(í‚ÜeÒs¯ÐÙ(›–õcüµTV¾—Á³¤Aï³T«Â%Ò(@Ž’ÑûyþˆÒÑ!@>=fÐåò‘ÃØy–ùøïpÎ^Å TyðÀû„¬@ý§jouq HšPØ´… ïb–_å¯ Õàÿ:#r÷UùÔqìjÜebUlxOÑ¡fRŒ$šÍE2ª{™àÁ‚ö:E«VO—¶ßó¼r¼b6?5¹IW7åÒ9-HÉ’$úhnÂ)¸ÿzg„ ›|BùÁ*…0X‹[¼pð•ë–'ÒÓ“u¿ð~ô¼’Øé×ð&ÊŠRÚe'VÜ3ƒtÐþ“•*W=Üêvø¾_¥Ieë´wÚɘ+ žY-YøÂÒÈ¡ÌúüHÅ.˜MÿzX:áÀ•ºHxÈÈ¡~D¿ æ.­×9L#gœnm™¼ó‹Z½õ„«·Ç(Ÿµçé0'¾ý7 @ňz8mCSyö…&º{Œ˜Dx±»2Á( ›tË^£b(ZDתì°tªWÛîHLš±ßMÊÃâ1s*›yXçïÕ¢ÏyÃÚïZ–?ñ eŸÑ¡;ûæ§akÂ/—´a¶MŸXhá›YÄJR&aÍý𢢴W´E÷¨ü%u–$mãù0ìrT¦”Â-%[tÍ'ãá73ÿYMÀ®Z{q  óÿ?°ï·ëë?(áÿ!â?ž% if˜_*7Z± —®‹²´/aæçXKA yc¥&ø“²\B>Ô3ÙcÛ#çt[›s0q¯ZÉ›4;HKV„¼G.´¢·±Ð>C@â&J܇ÅKß@øüf×ù/Pxhêg¡ú+°…eÍpó²­›¤Ì$Lõgˆ¤ñã²EP„äØÔ,cèó<ÆÔ¶ô§={lµÏ†:#èv>~ °’ÝAnÀúžÈG‹lWÉFe ÝDl2xÿo’Òø*Cô=2ï×ea OŽÝ´ãÀý£e¬œ›#*&rô ¶¸š„æ3Âò-ͨ^ˆªh¬ZÛy( _'»ûN‚º£·*„ígDP› ¯H±úg Öëuû‘^©V,ç«Ø|-"7š· Ÿ0A½^v­É@bÉ ¥à}’y–m¬ýR`2!1ª9ÈÊô’`‚L&^¾þ«¾!Ûž´ˆ”V)G:öM„C+"Â8¡'†tpŽ(æ`î˜Ô‘¾°0Ù/hŸÁòOCE,àa/“LèF0ÙÑgß .Àʰ+†öîêlÿ.Z¿ +IXÊÿÕŽUW,«už§·z*Y½ßTú) „chfø¿žàeꈌîdžR÷®Š‹FkCÕ‰M©uuj‡ÒŠóôd˜x1Äåxúelæ*!ãLûŽVâ¿/a¤ÒõH~¡¥p0â«÷]\¨ÓÈ=—T®‰'JŒä Ú—Ûàê(´'t^ÒHƘ‘É"nJV‚æÒâÁø¬ôÏ Ý2É!Të× POi}6‘'‘$HªFlÝn£ðóFJ2l2à«üRuÚk1‹…Á‹ìS”NN”13ú5µ™H䨇!ÉFî@Co ™gmöZ†¥V¤Š?/Wrœ'h{Úˆ€¦ÓLæ.œ«(þÛ'Æ$kVŽ+3çú–ŽNPv¶Q¤)oÏ®²·kä¨C´u—›ë͘‡Î¨÷ø­irçÁNgÃÜÖy‡: /?òkp˜æ(õ?W®ñSa±·5Æ{~e×/2¤ñEÙ<°Ò#Hç/1_‰o —™gT-ü.Þ_´…=½d‹M˜Ø"—Ä‚ß"ðB»Î¥pÁN‹¨ä†s¯ð_‚iMòÎ5¦àÅ’CÎ5D?é8ËÕ#oÚ #¤«Šn픫h8FRÛ?åâ)1f¦bëü“ÍÇÛQ¸f·ã(9- ìPKä·t|‰™œÇÏÔa†û‹ËÐÓ?œ±x1ÎÛ|d¹ó ‰.N3PxãÍM९ÇH`CB#ƒ£Y(/¦ÑaPj>Ú^U¤‘*?ÊvTP/ÎpŒ|änÕÈ |ñÉS oÿ`ªoÌ™^ËÙ`ÏR>¼+ÏT‘-6PI›Ò´¿µk4OÆ‘³ÍîF3H~y;…8ÎHº¹} B\ëkÉáAq|Å:ô‡f,LEdúuš¾Vè^Æ3çã–fH.9çÓCê zi&|ß]rk‘ÇRÌ-ÞÜh‹ÍŒ¨ŒwÞê|^)· ™Y,o6¯DñéÝ« \uÂDµ¶µüDnçŽöBˆ:¼žöÜúóþ g­¬Úì£Mh …‚©+i9€ÛˆJ †Ž°ˆÎÓQ˜oÒ€íâüzý᮲±Ö²ŸÛ„¿3Áöš‰°ÔñáûÈ ²o.XO-½þ¦·yG¹8t D¬)V•“ï›t³ÑûΔNh™àÕM>¬ø±”4b¾‚±;}©È(Ò* ƒ:uµêå vû °>]G Ám©ÞåEaÒ$•?Ûë«ôdƒ¨ì¡Øp¨\£„xÂÏUå¡ÚZd2‚Ûee£Ó 3Á¬üÓ\ÿéXü#°ã N5~ä ßÓGÜVÊ©> ÈX5¢ïŽN>,\J"Ö[õ·9_¶pˆESG am›ólMËf½„ JCêó]á$ØuÙ„ˆG¯¬ärÁÿÿ=þw^½ãYœ™âÂt.˜_-1áë€we±ô\RÉPžðcÇžÇù,äÂVˆ…p¥á€-;E,C78è9Ñn×£}Ö¬AÅè)c¤ª$„ÓA[é Z˜Z¶?å\]=ûS“ÊM` D9Á ;vÙã­f¦—œ}0§1)¡ÍF‰@AG‰»Ùb2;{>°PCÏKú!Hi ÝÕ¢9G -£´ÕSd—Ò(Êzö™\-?§,ëkĵ–oê ,:6 ,,yD¬#›@«598á½d!¶Ä"KÝApšB° –H¹ AE‡µ®eÛ# xaÊݽ-aÙYæe`h‡ƒöóuÅÙú Ø‹!¡,&QÍ0/_åæC3÷¦ü¿/ÄÈ»h•í ?‹L:ÔÔ-õiŸ¹>ÛwEN9¿Þ ÖÍÏÿ Ñ,¨›ðëy핊#‡#ÀÕÌUIžÒ¯V÷3(^Ù'# I»„vTVÇÿ÷Èú¼†Èbá q'FQÅBP) pW_£ûr!÷:Àû·’ö÷Äêâ¾¥Ú¯ôÀ Ÿ›«(ï̾“Np&<½L…²}{ý¦éZÇ+qªŸXÕ|Ü]æÉ5N ¡ñ¹eÈ}âw {sæX 1MFb @ÞÉ…¤=tb ›åL™òd‡\´$£ýÒÆ¥]ªï– Æôeîß‚ï^Ò…!^9 îÏ*ûjf™Ú-pÖRÖÖ!Ic½K7H4ŒÊÚ¶6:ßì,ÓäÉ7:a®^ô&:³Pøs¼@C!ˆËÊP>Û‚Ì~·Fþqö•ÀSJ?eÝ”÷71IÛ$wk²Æ¢I þŽÆQ`7's<«ÖåqîÊÔa8‰ ‘ÄÇ?ˆµ!ülóÐÀ6&é”ô7DŒó«jû>œRtŠÁh`¾R»|¥Ÿ ‘pØÿ"ðøÁyqÚYF¶€Á¥¥`»ÚF;çZ5éÓ…ò˜›U”e”MïóU¸šòVÁqœ¤Eâ|7¹{ý™ˆiöÐ:wßåã9ܱs&}>Ø,{„÷Í !K]t|0uº‡E©·N9âhÆõeYÌÜÍÚêØ‘ÿ;©©ï˜ŠÎi€k$?=8F†|W˜­’Y›3$y‡±BÛߊ®{Yæ [ærÉÄ?èÞWcÄ-™º¸ïS>)g9¡Æ°¦ôþãÐ¼Ñ iñÑø>:çqߨ ë.}mvµ3;Ü +uš1è¸E-Â{‘´Lq…Ô3å” RRÆ•ýÔÔüü@Ø­ûZÂ6Å„›t­è"šh] T^tCùU,1íÎd½€[…Øj¬hIµ b<ÏTp‚¨ÙºUGº›¼Mz·Äܲæ¤Õ³Ä*&¡t𒥨,›Ý—˜ Ã9é«* „¼Ä÷Öí«©jY:ä;Rm¢ðN?ëGáó´â«È¨øµ ¼ßÒþDgˆ&ˆék6‚l¨où‹î«ÞòR”JZi<Üä¯nOqÉ©¶Ö'ÀgHó”À£DÙ8u)(åbRŽ‚Ú|µ] øºEa3Ôó|°Åñou ËŽ­õz´" <@áxî÷¥BbžÐÑQ¦ OïÚòî;VÔ¡¢ôH<]†,öÒà%~ôë°ñ­W|XìˆÖE÷H –ÂFùÀÏíÿç±E„KÒo‰¯“ÊmUbþå¥ÝŸ@ïW¢8¬2œÚߢý/U…  í÷{6}I:Ò0}–ˆò‚‚g8u(ÅÊOŽè7ˆDF€µ·7B~«9]¸þzÆï {S^GZÍÒ}Z<3Œ0Îðä"H£ÒÓÖRó=Kßoi¾Öqõ ëq÷´õž¢FZôù†%ð­àÇ+1ÑÇŽ}Õ¥BД²_¯—ÁQœ’'Óòi¼a½G¢¦X\ú}U¦±óKB!=èK»”© ÿ€F‹y* Ùï+'ÓsaH·óèŸm›®jG"’^TÏ€²5G¨(Lx+û›z$³m<ùžyñôàº6;„Õš4ž™ØŒO}Òò‰ê 7§kàÑÇ<‚=ûûT£u•\îV=p¥üï6døŒÕ@HQîµévC?Ÿ-8£œúHš°f¬ l4*Ûý³ô¯:ïõ_Ô|@ac0޲õik…AI=ƒ«ˆðÖç~{¼˨Žwf˜¦ŠÒÀÈD×çãØŒCÚþŠ)³œ‘ó»>ŠÓ¾—;!ÇQ(\X¤¡Ii^k&4 ûÜÛx¯½ùC7ðv·¾ÅE/.›kü01¬Ï%øQWæ¾#öËY•îºÿRfˆ1¾-ˆÖ]»?®·E++¹W>cSï‡G½ë#˜|ÒˆôyKe­cô…$ªtþcquÚòÇþ›Úoõï£(”¯œá¶Ø~J·ýÎé.âà¼&Œ+’Ï4í’ѯ‚Ž7>ºf<ѰŒ ÅfDÓ•Á$ÈHOE7ý¬G¦´û„¡¼ËG—C:A‡–Ø·ØœþÓE-ú„xƒwjΉiãž(t#A!úÚ…‚åQv3 Ý9I)y–wq{fù4Wcp\ãoéõS_Ë9bþ2ÖyEö°?Æ9ÒìÎ2^„@H—tö›ï·æ\™ Š6‚žàæ ”#_õVµt½ŸkÕIXúw¬iŒ‘T´¼x(ƪ>L$„´6êôÚä9¶/qÂ#,6¹)ô…O³…ryüZªø)@÷#²áâž5ß“—·ºwÃ5ÿ.Ö°_ƒd`2”‡ÅH+oò5ˆõÔ(ꟜX£±Z²‘8ÌÚŸo ó%öÎB—ÓþŽã'$IEd5j‰^ñYø«žœ7¢_’yþ€¡‹,0äUòœÈK}öÓÃÚ¦_~=r¥}|”Wƒîâ4hû¤ót’øÈúD‹7s|P¼˜`V r‘ܤ•i˜u!¹è‡Ù}J°W¢ J3Ë™Ó68$û7ì-Ô‘cƒI-ôÀ2ð“Å~ÌÌ Ô’Ê›šNÝΜ³PÓ]U†Îª6Îw™Ø`£<Ž•9ùŸy)z]Ó6ºÊ4[/Ô¶œ%ÿa¡÷°Vå¾ošga•yÅ„à‘ûö#XŠ”‘”\‘Êûaøi]œ¹JC†S„˜> ÞÏ~?¨^3ýÈÙY‘ô+UÔæTÑàîzWŸ†Àh/§îZˆ"•b¼ÜræQøØÅz¯-fiå8Ý¿‡âžvËÙÓšøx€ø8n?CW<€Â`¬¬5Lñ);JjÌ¿ŸÚëž7†~r¯èIê$ÀŸ¥7æ?7Á饬T¿qIðî3Xö+Mà ŽêÉ8®Þy¹Þ*ÿh4xjÛvØ |þvÿýƒ‰¸ð-‹x#…¼P·|¦Qå†íD÷ŽY¹ñ%Ü!î†A"7f4žqRàEñ_A„ä—j¶›y½jÉŽ#“˜oô ’ÀzaJU¡Z`ÓaUBhÚ„«òxô‡ÛйâÏF6CŒ¡Ã Ü›øÝÌ™åÎ5,¯§³+éÉš,/ùý©j')Z©×cR¯ ÀÛð °§*ÞG¦U8Ãê­:$p óË4uß;Ríâ{}5¦hù}ÁÐ8 õl0ƒ³àLO8¯}zóµ&F‡Záö˜§Øþ˜ŸïŸ{—T¹¹ªàÏj}xô甫…`Áã (ÓN¶¡g"Ä%»¿`÷YFß:>þÉgó*ƒ‚x©j<Ê‹€€Çá±QøjÌ~°õ²k`=¼@Ç_=òFý 8!K[cŠÿ~VºÜý¹¾ËŽhü…ËdÕ {˜ûÙÆð­»¹¯¢–Ü_/GªÿW.ñãÖgí¢¡Õí&D.žZý¤?&1wó¡E]Q ­Céà “]d½úò•@BÏòlU¥!j‰áêGWAkuû}¯=¬ñvCTìòòÓ]@ãÖÏuñx¡$§ª©¸œ•œ`(0áojT(%€¾:mvéÙpY´cG|!Æ/\6iD=ADÒXIK¿"‰3ˆR~Û‡•³x^.c³ôŸÛ®D}Wº©µÙ#xØÿCçùäJà8ÇcñÂpóAI”ýNeÞ ¿¤97ÀiSW/G!„ •ÔÉì© +4¨Ÿ†[XjÆ¥E.9<¯ækàBÀ€~¹›P¦Ãwú’¥¤ÑzZÂþ·kú§ÉTü‰l“”«2hUSñsYcñsY²o(•—‰Ö=`œî²F^¿ïs…Öu|qïJb÷YŠ:xçÚÓ–’ŠÝS'&@ª°ö5SL>»gèô{w2±^ÙÓ± ÐMqd;/˜M‹bêz¨o4bú‹7Žy~CŠt¡0VÓ–b-’U…š°‘Â7ç¾^`[GH»œQH>Œ• ÓW{ü!opù6õPáçëïgbŒ4UcfÉ©9/ƒeázÍóâ€Nž²«›.O?žHlܽ¡ÜÞ¢XÜH³"qZ~­nt+\ÝuÝJÑÿ5仯êM£zSü:‰* ›ýÿÓ‹ý}¥wè[N¸Ìp«©Á+ÿ*åƒÞ*'› IWß}è?›Pt¬e¿S0GÕ³w:'VµªÒŒÑN/>®²Þªœ¨¿€xžÜ•˜LЗ…«³2{ÖÊP¨ªârâž(Œ²×UdËx'Aœutß¼|'wÿIäg¢fDÇÞÍþàì›m¶Øþ£€/€—©[)”A}Žõž? ´ƒ?ºhŸ‘ò€Ý•?%°~%-œ¶—í*ÜŽ)Ýl¾Ê· > ‡àsT«µ¦–̓â¬BZ{”‰)1—{LGÑW¡…‚’µ–>ÂKÙu"-èaÝÈCÇÃ" b˜x˜GY.”âîÉÚ±<âÄáù%@C:a­îiÊ_yAçé?;š‰E35WuæÝÝôC${™¸LR€À\±mÇÞñŸXSÐîa9`h ã€9JLx§*nÉé"ÿTëÁaSîŠ1ƒñXˆ˜1‘¨}ÿIÀGàèHU&=__qjÔs þ™l™\RZåöú¾_o©ýöú?ÿ±¾_o¨½öúz_o ðöRÄú½/·Ò*}]Ïÿ­0á#5¾Û®Ík1,©6Vt””X¶òaÝ®m–‚\Ú\Í¿™Eä'ß࣭¿`³ï¾ŸH‰f€L[Ì:LJZÖOË2å¾zž°«y€YmvT>+¸&Ê#Jµ4²zJÕ¶Ó/,§ûϧ'Y]téÛ´ûX(ÏzýO“[FW´¿ÓäàËcrµ´GVrã>pÛž¬K­ÙtÓ:åeíïSÈ©¨~ÌWÖdæÜmÇ%×Ö)»v þ#‹0ðG’"–}!`,ïL% KÌÇIX{fþ¿7c!Јà[óo+Žw"ånœ“Õ©¸ÈŽ›`ÖÚ„Õ{Ù \XÅàŽ$LIaYˆI aÐôÎ šªÈP?èÖ@“5:|IÌÔ³pœeðïê4£ˆþt½Að b<ÿtTáÇϸU«–nDõŠ–ç}Æ£hè˜ ˜Ë*4(}%3†¢ç®3ðËn˜h3sŠ7â;þta‡qaȘ×_%¤TÁ÷3•wÕÏ”§$ ùv²[_ [”§“£þ74„Ówƒ¡åÐ`:nE¾ÕuØ@,—CÅ„í¿_zßè>Bëð%IŒ~õÞ+É"¶\#II‡ O¤ÚOº÷Çநω…ÈMRS0E•oEõ+èGZtŠÚ.ƒï^¡Ò5Ó *¸’† ÇÉ{¿ ¸´FÎ`´°8ª@A$à•Ècw›ð©ŸQ¬T[ó^R>;ºÖ»è-ÕŠjŠ\(2m1a-R9aí­,‡ëÊÜP•õO{t*®HÚÀ3å—W¥~3]8ìfX1òq< ›/(&’žYf0·µ7› ùhç ‘ÜWµáÕªB*êCXàñÄŒj¦-\Ç68®¼óK7:¾‚ã´kd)L÷ƒI O‡sþÿ7ã!A™J+Éו9}ÖrBfIhë3w°³ªÛ¼RÆ,¥!Ž>½n«üG‰ co7-h$ZÒ­SCS´-WÈÿwE…p@û«È øØƒÇ°~Þ˜ý„Æ›üòn÷»˜˜hÅI/žÆìT–ýýË×õæRMP#0~ZbŠûìÖJ†?ÃOX}t„¿©¤0l08Ìfgî×b7À3U±Š ê ’ÓÚÕ9¦F¥reGšI‡Â`«P%ø«øF|âPì_0–¹µ4ÂOÅ@è—ÓÑL•°>.»µª¹%î¤/*ÛÝUX AW–Еž)WüÔñÊú6€zl¯l=^‡õr å<á^NFZšS1ñõJ” ™mNŽž3F€i~•JÍ:ˆgã=]Á©> lå>EºÊåz_“A™@­p‹óUýÒx‰¾‘îÑ×D×õ<ø—WrÔ2Q9$õ{RGÎþþéORe® jÏÃÝuGÊ‚>i48·uܺèWõ•z·t#:{ ¡PO¨v²€3·ô~ù^sŽSŸ3jŒ"—u·Æ6M± ßýØríoÀy…óGìuê—úê¥ÒØ¥•9ƒ‘6Ð.ÏJ vƒg¸VGѺé+âÀÚz¸Ëf¹°žÀíñ;.úõÆ?k0ÿL°¬  G“ÃǾhO¤âq äG”˜hwkw:8»¶C®ûͲîA~[AR Ǽ„mô³Ou M?*h-¢ÝDI©Pǃ0·çrRäåw;,߸áj z…j†}[îâÇô¬2¾_dÆ¡ÿJ`vBͱÍUí†".Rpu²ÝÐbþD–WO°Ué©£x2\_ÕCç`Þ“\wØj¶' èŒ]KߢßÙ³ÿpã+–BAÜâ›Cíu/±éOÀhü#9*™[¹é¡ç3¤‰Ïåz\ÙJb¹Ì¶R£"6ÑvõÇnü¢œ1àw ÈT æ…AW0Zµ mëé󚣦+½¶È$HGk~|ùp)w(û¬“ÂM&wh`S­ûðÔ^î+sñ9‡Óà FÁŽÂûV•éQ(w´†«2÷Æ šŒ²…Þ×²Þ hZØÑD4ê¶®Iå0]ÔD´½ö¥T“+'OªÓò9|V h9½oŒ‹Mùû(¦óªol¢ñ(¦ãyÒ½û²…A1Å¥ü ü»gvËÔI÷’ùCYxrù‘Õ ÊÂIñß mÅ™&(ï²ôÆtgÍÓ!À⤀‰5mAú¸Vü ±¨æƒú å¨Gu;Ù²P—tæÙã«ÍŒÏ"µôÊæ ä½/Æ´Ý0«R+«XÍfè-q¥žûΙÛZ¼zü”ÑÏ5uJ ÃÄV1àB6”×4éy|†>¥†ÄŽtÞÖK0Ÿ_ŒzKƒ™íNô^®=— s`xDèÚ+µþН2š^ÕépÙZ5˜˜ÁÆçh(ü[å2\L„³“xD^8 ꟹi%æ‡äÓWòm¯Þ1”t¾¤œîÞ9÷zÂaÄ©]jH¿õ-uf™¦Æ|e 'Ò½© ß¡ €íŽúÿ‡ v”1éAÂGþ‡ßŠþbµ»Ñ»Ëù5—fk*oιÿ|ižïm'lšJõRÍÑ’'°ûWÏ$Ô+Ew‚5'—ùoÓ´—ƒpiþ°<$P:Ð JYØ¥Fýãhþ‚O¬×ôÙ%6#öÙ[ìµUX—$ÉÄ’xm“"÷dÓ"­kD³¼.üB%mÑ *­[F‚ÊfÀÖßYöâg\cóBÇG`Aü6z}=ùi/ƯóÛNÙ/UphL6#àIðY3.X) 9Íî;G>a±¦(/xj²2‚йw GBí¥¶Æ* ´Ûb‹QÕÎ|ÝÆ”Oy«W^á¿aíLyhwP&M´O­L‘À‘ð7žê¥@ «¹þK;‡ÂYm”Ø0G·vòa±£WÇ»®_´¥ºe§€jà âx–ÄœÌĵŽô ¦R,5 „¬Oa¦{Úv?·²íOZ¢ ÑDäí¦èÆb•&gM §^Æ\¤”Óþ®ÿSùbœEç‘^ZOì³ÿq…DŸˆ-ÄŸ+ŸûmsFE»¨²oMK“úÈL2Q9j [”ºÂv[‡gÊ«îÉ¢YÞúð3ðDè͸†Š¶B;tè©\ðwÌ|î \êW‚¼=¸t¼¯Æ2Lì÷Ã×puw›{›·*¤÷õ½£ FÙœ+ˆ¶E8 R×AÕºáloÕ™`ØØ(Ö­²‡ð™ õH«TE<âz§ PS0àO9°PØ8ª–×§#ý’^eŒ½}Kp'¥ô]ƹxåsíûØòA^ékk¯¯Ù-Îæ½Êñ¤6â®<2Vå¢ úóvü[ê}ÆÉîw ¨´‹åBÚhx¯‡Ö# ??À¸JúHz'4¦.•S<ùõJ©'·"˜ö¤Öú!í1ØÚö&:×Á*¯ /7ýÊÞ´êÿxŽ&ÜÑ;§9âáC/\²îäËÇŠYÖ“IbEe,ï¤OVÒ\ò‘¬ áùÉP™ ë‘A÷/ù®Ñö˜áˆmGQÚ‘<3>:«Ž–ëð£+tñv›/ÊË`1ÞËdqžPÀº¥üŒ¼פ'<Ñ·Â Žkp9á)G¿‚’\!¡Ú‚uáù3{ð¤æ¯+ËYĬs#O™ð ~©T1ÉÄc€ÐÄxø¢ªz³WKWŸOTêòqTï@6å(GÎ킲"£E“!É }°•Ìb\ç"4¦ˆ.ƒŸÔªÞÑp¸+:¨Ý›eä5n•G˜ŒrÉ@²û´EÁ­ Êv)w„(çŸ`u±gq†ôËÔ®lÁ©$:}«ã,\—­;æiÊ?ýôæò¶?X’jw³6,¯JÇÞï(Ùò­`ë–Ú½yG¨?ž…[ü ¥ AÈŸU§zuJguüícÞ+ T y“‰.’*NÜ2!¹Kj††ÕÁô¢É¯#^tÝI"´”v¥[½,~Ù`?+†^Oº¢TkiÖ?1©Æ}Cø£*ûÍL³VØÎp²õmÙ/æuïX'ûÀÏ“¢å>í±’%ë@£ÚÌþd53¡ï¸™H{ʯ˜°£Ÿ÷ä M©LÌvŸÜŽ\ ÂÜÓ‡W{Î!ögè+<ã›]—}Ù*ɨ®B\®ÇrüàØôJW\„s Ww—©Y¸»Ýlt{bŠJ˜dˆ”Ý…“ùÆaç¶Û=pÁ¹rSa>ú?»¢%ÍmˆÌù;fÞà Y|u*_zߺMx±lö¿'ñ´P̽ Þ¥Ü €Ó”š»žý±6Bþô5GéXÈÈÆ_¾®iîPJ©d¿Žè_›‘iÔÓϦiÆã@ÞÅ¿r¸Г/üD=gö×>2qG–’¦}ç¿@ìŒ4Ó%UèPÎGQãñÙÕ=ö©nê‹âíwc¿ÀÞgÏIðí;,Š“x<&Ï%IaÍ:˜Œœº m’h(T(ˆpD¨ᇙTK¸×ù;¥³;2äs !ÔDÂ-††ÿ]tôMþÌåi†@x$ËýžB•ŒÔu]—ÐuÒ»æ–Q[³3µIŸÿa™ì퀛4(>ØÐ ª¹w§»Iß eš À.¡Ž7`ý‡é-çKyÖ䘳A„ƒ¸ŸCIÜîW}öyä3©ašuÃ:ÒË(öiya£HO5>¸zÄ*Ó2Î(‰öíÒù[bÝMÜ f.ßÈMyÛM!ÅÏqµA¾¬aœ‰³¹mÈ¿ €ÍÂ8EB:Y?x«=Á>i>¹ã3:K´S¿™ôUÚÉâd‚¨Ž¾6ƒvÿPx—§$´Â}ƒ¿)d¸|Êš] { ÌŒyÊÅ þØ1+ø£”õ?؉(0œÖªÐo6x~/¼Wv|ã‘ZË1‘¾˜„º)÷é˜BK¡Ôsäÿe¡øÚ^ýÚ‡<û zq/AÝ9yC"Nû]H~uÎ4ï#°?ž"›lk3WuÁ Çâbxɼýþ-Ìß6yQ|„À§A^=ëJŠŒNšT…w&é¯`úµ³æpTu(;ðP‚W±Ç(‹öÉ3ˆyÄés’3÷RºG-¢ñ«}¼ ¦¾çwšb‘mlPof¿¦i|®k «QE:ºüè6(ÿ<ô‡k?\ñ‰ä¤’I$’I$’I#÷­iÇ 3Ïø…êÁý9êpÚº2úV´Æ¼U]óP]è“bÞL^%Wc·t27/€Ð;2zKsÛÙ¸ÅÐ=GÅ‘;šO°Õˆ³ÅU:싟èqªšš+Š*Eð‚¡Œyk‰EÙçƒE!cœ2€èŒ@ªû¿š.X=#÷­>ýÇtà“v“ÓxÙ"´èc|·êÝþËÒI ³¢,} P4å¥ xB„*¢ç£¤J lË¥kF>¯d*OãÝ—;r”a¯» cÄëÎLÑÞH<ûÏNy«òŠ\3*_`Ù´îãÌ®ñ1-ìn³éå>ŒLxö†1UÂænMï\8Ûâ dêšÕnÆ)²l! Š~éÉ Êì4W´œ=1; +Xjt†J!’@—„E²,’9µ@ßÀx2ºÂÙ§ã,GŠmws³i SXnêz.‡TS 2Ökº÷±üIQø'Q×FÆçÒjêr\|ÜŽh8^f!¶7d;Ú·l6ºï¸ÁƼݞ»÷»šì„9/¶áè„úF,ç¦N½Ìs 4ƒKv­*àŽE4— Fî\X>×_ÎÄÌtÄ™T%Ò݃â´ïG b~’ £ëUj Çä™v‚‘eGË¿^S³)>lxÿ"¢·GwùòÁ(5[<‰¹Þ¤f†:íØ'6ž"˜÷ÿjÙ¹¾¥ã¯ÀnÌe 0UÖ­ kg‘ÜÄÏ@'ÚÈþ…Çbÿu*žõåhox ÕöøªÌD’–¦Ññ¹*Ø: /˜ª“½:hóq0ŽêGE²mhÑàm£öãM@] Ùê儃dÜ‹¡÷ ö[!ø‡–¦†î)cm»Ù:yÌnÄ=Jˆ8£‘PñTPxØfk,Ôçö”5þÆKä ˜¨ÿ>/Q†i}7Ç÷Ò©)MT¤BæÑ>â§"ü+ì)š¦éäƒ4ë›DàßA¾Iµ:°¬ÜHÁoý׬Âîâ‡")/f„ë½wäi;Ó: ø€ôË÷ñò´PjvÊæèÁ)©Ü“9t’iºÚ)ѽmØ®Uš¦ñšzšq×´ÓÛ¯Ÿ¤D(uãÉeýÿK˜‡Ò.ø w9Ì×[ö€ *z™ÃEêœac-ÛH²ù«4t| °É€áØÜêº;QûG„[°—üéÛÐqàVÛát ,›]] ôøUe+åÝ·k¯z#€€ðvìCä0ªêBZ‚QTƒ2Q"4ÏÊÚßø¾dËŽ`¤í€D r • ÑàNÄÜj–4J¥ÌDíÛ%AòõôΣÓ=_‰êåÛ'dGqïäßP)só ®þXCïUñ7]1éÔÀp0T ÈÊ—é¶ö·‘©šñüa!,$ÍÎÂô³ù;¢2ÔuC|†ÆÓülxJŸW:Üj´‹EK™£åøúÀ;›í€ÿ&ÃÉŠ´N7jÌ ŽÊ]X‡í©÷Ñ¡ýdùÝ8´`©<ÿZ³˜ÓÖËëw øHʇkŸMþ¥Ô~õíùKEä3]³Mš´øÔ°swÂî6À]‘4$ÕOܹì§r\‰lî,¡qÁ˜{fœ"d*C`Ö¦¤Sᣠ.<)‡ì¼oO±Åæ,íÀf¯xÜÍ–ÒωAŽšÐ÷bu]‚q¾Î%‚õ?´H¿™±þíù"´˜1vKÇ„;ƒ G ƒ¢p| ïŠ õ4%ôqní«ÿ’¨Xrƒc•û!ðw]Ì]õ´GÇìˆ:Ôw- yÁ §¥˜ª?é{³kÔæZ-ºdÜ™U/Ÿ»W˜Œ¼„™À£(m¨Øƒå;zý©ùÓ£•î~HFGÔôCc,ôz{ؼWµ$r@W©›‰¥ùSB]BŽ6–8µâ%h°YOV”©ŸÙ—¤b¬ÑQÍY  cžìæ¡â’¼ˆ›³“/ñÐ ÐIüÉ*ŒáÍšm_«ôlÇLN5dÅ¡¶1ãÈ¿õf4lf«ðø«oúJÛ÷| ·‚€&%Vô…vâVhóG>]yö쪚£:ò@ÍÀñ/ûçÿ1L¿`Ma‹ÔRõŒ$_ý©p9£l„rí¶Ï)gU}è×èfP R½–m¹A{ìI0ø½\¦;#ÒÔ7 ñâÕÙYÅU)ÛRaèÐeÆô’ù4û²}ÃsÙe³iµÚxó3ÂûD¨Çæ •_îùnã9óYçÌ)ÿ5=àÜ/’ðæ"«Êa^±DÌÂ¥Nÿ`ÆSÜôàrÞ„àaö0>¢ßX§¿ÕÐQF˯U=žŒÔº<ÆU4­¸zÕßÔø;M\í0ý,7"€áêNjbÏïõLßj±èìaøeiÒ2ÿYGs³ºau-Ù3 †Óv†WÄ’žÁ©‚1Iž*RWZ‡dQ:17åBSB CÓS·òfŸùNýÅDt± ´r8šÏŒØaàìðt·F’ ˜„®8ϦZ–¯âáY™¬4ó yJ£²)=@€•CûÈz¨¦²|…´×Õ+ÏŽcÄ̽~)×ëä"qð´–Ô”me·Ÿì£©&fèôžŽ¢QIk-4`‹œŒ\øBÚsa ? ‰w¢DšLÍòv¼KT©<¾áLûÏ1ïútL“ÿ,v°=X Ô^;®ƒ1uƒ /EÔTf&VT?•ŒÔ¿Èä«:OJŸC»“ÐG­%ÂÚ±[s©ÂÜ· ®òñèÖŠ6á@A6ŸOêGçœóƒÀŽñ>Je1œ‡[#V²Òqrâуñþ*v’ìúK½?h¹tÆ~FŽ.º”U<ýøeóñÚèàƒZM7ÕÁÖõ¹ÞÎìÏøššÛyëÿ7?z j ò­±£.8sß"J󠻯{Þ¦?‡&¬SùМ‘ˆV©š s 7ãb„D¶Ä@1Tmá ÃPó²ìå#†š{`|GÂ>Êæ»•OaA8±êˆ>ù‘–ò;p´kÉ¢ŒçI”¥õLEÆ›×´Q\~rž/*nG¾¢¶J1L·ø‹)󇧆ÓKï*|¿½˜ÎÍV'e'6ÿGî*N˜±èÇ…üzñŒb½SÐÔý§&y© “%}qŒÝ!€ZEýYc”Š´äɘ-Ç3´6ḄxËÞ2ÏmžI 11Bºÿzƒ¢ÆÄ  —ò¨>­ÕÃý¶%ìÕ¶ÇzDtaò²*¡øférsnq Ž}XÒŸ&4ÝÅ;ÌeóMäh?löÿGí³¼ð'ŸÍË+³×h®нÙºNç¼ -§fĦeÉÉ¿{B?Àn;õ ù³jsüYg‰ö–¹L ¢mÍòa¬QEÞ9AÔ]Ü^‹š&ÙŸbãÛ3k¾ÒÔÑœ,Ñ`Nâ œñÍ÷¸$/cÌrŽ>56ª0/g'æ¸ÃLÙ¾DÚ\3X\ÚP*€T€<1ÂÜAŒ®÷ÜÜάc=¼ž]?)£³ÈdÃ'8RËD(Ž<ÖqÝG#5j bÏïqR\軾ýGNøÙ(FODY@˯IÚÇ(éhR/È äp:®?´¾ß”±hÚ3!o“åPîÒÈ54ØOä…„6¤¥£(¾m£~s¤æ{ˆ)C¦RÖºEð­–Èxé=‘»[¾§.ø(m¿¢éN3>—‘Z’sÜÃTçB)¦ç”ÛìÕÐÙþÌ¡¶_ÛWÀ9pÝžŸÁg.æWZÄ1Xªî³áÝ"W<(þåw9 ܲû6[@1»Ò{%^ŸñPUïÿ-­‚1·„>Ø:jû%}¸—& :X­ýâ_ö«ŽŠT–ÆsŽÞˆûSÝÆ‚Ü€©©²Þ¸bõE2p«b‹Ü‘'æp;,ˆi#Þ¿JÚ°aÇq´^ÓèМ(ˆ“¤xð‰§R†%Û"¶Ù‘€Ú÷àï»cú’ïÀ¸iÏþRw Z·dàÏ>8˜N·W:{Z¢kX³ïìèÅt$§D7XÖž` Sù¡ÓæX6 îóïúü);ćcƒ)îÓêõ.&û’Óý}:½U DÓ—’…|üˆ¥,í8+’w)ßt9å )©B¶ïK¡u% ƒ\l”££NÒ›ƒH`?“AAL+V4E.V :èNø,dÏ´Œ«—ß¿™wœR%[®^ÖgrÊÒHÄs£cL¹]ÿKÿŒDùíY<:8×h»'jD‚±špÓ·UÃθîÂ@¤Â]½ø©’Ué1u2þB,Á{‡“·»³4F8Pk}K6”Zð\QâÂp¥É")Å›Âpo¦hÜ×™A”y¿ ñm’ø/¨ê£5sl<¢ÜJË(óÇP0é}‘ûŽ›W|O /Ü–¡°ÏƒIƒ€Ò]Dq²â^{%6ÚÃåú¹Û+ºú*»Œrcßž#‡¨A¼5BٴͺËr,WÏ:¹ßk¿ÚΣõ¨¬h±›#ÁCÛÑ­Æ? 3É]aŒC‡óî!J"¤¶/×W±Þ+÷©,þx©¥Vó+ÒqYÌì‹|Œ$Ž­_>!á¯î!Ú…‰z‚¤êq«O…b.¿ ÐñÞSj¡tOn²öí<ã5¶¦uTßQ_ÈÝV–#—#$ 1½=lزUúÌ·Yž¥7çj, 6H2ïâŽBl¯#,d¥(y Ü”¬¹Þätirãòbãc·LÞï ëEvΨ˩(é‡xÁþB^×}ÎE"¸˜OUB3æÛ1„·rùÕk†éKäñ{£vÆ£ ™ÉþkÔ$V„KzþÕýäV@Ù=e•A™ó{!â³·°<˜/û©í¡Cß ‡‘o`™9r )ö45´X­¹»ÞV¸‰ExòÖ4eœàÌ€<ÁHóZß·=+yÏø¨ŠL!‡ 'ÏXúÙ=$»,oË££€À;š¸#ý‡­ØÝ¼hO½ˆ3Bfõ?“Hçj^ÑCâGÏ?ƒn+×É[±)E!½XBy¢Gä(…»\cºzµyÛÁwh›‘hÊñ5$=þ}Іwq©÷¾:Ô|™9™V–Ùï‹@Î! v¶ì‰û–ð`ýjØÓÇL¯ ÂÒs*9WS>ß´ lò‡üË>úÁ0hYwìÝÇ"{sðö7’/M ~ñœ©mãmÉhŠlI3MF!uÆ^Ä•­R·+ñk.}Ðúl„"ø03áËÑDÆ`•Å/gGü›õ$£œ’ê–É9ìI® Üò?_ÆY%Ûæ‰Ê½g£ÞÚëۣ®êT 83ÓÊ!o’kÏtêW/H¥`ßÖ”Èx½ø}Æ;ÎôuGk¦Ÿx*Óöš4¯QàÅV¦MGKÑÀS¯%á¶d…ê®'|*›g&ðצQ__ ­qhcße[)xØäÖvWjÆ‚CÖeVÚ $Ï¢G+„­JÚV´óS÷XÚQóCÎ.zœ ‰õгȩ2½t.±Z¤Ò_$œ¡¥tXóÓæwÈRÃdͱЎ̵èì|iùͶeçF§L%ì‘Ú˜”dgy_kÁrs8iSuÚm2õÏÖaÚ(úŒÝB”æÊK‡Þý/‡þƒlÄ’€=b„“»ìÓhjWãNÐÖ‹°DÔºNºnÁÄÈ+Ñέžöó$ˆo Ö5J°VgFóÀ^â4¤Z ~þNóï4±£|Ábµé¥·:ÕUý²¾­îÇÑŠ$Ÿë òïH÷Ëe,:ÀŸÏʈ‘˜ò å Epݤî~Z½µ•ƒAÛEM$2/Ÿ@M–9‹q°ý©ÔC¤›hͽ{cЏÆ@ÀžMO .ö”v<>·ªd2UêØgc`fOºÚ}R=e s/®‚‘œÊò›^òHÃm2ÏHªÆhÅ÷åxG– $`Vä]Þ('…Và5.f|UØ-óÉ:@u>9tˉ8·ÛÄë •\ŒýIéxyõÈ[§wz/_lÄÁ¹ˆiÑ>°ÚlOiËb“‰¦HãDùÔ‚”¶Ð»*0ÔÑP.nR?ålt™äiÍXªà†L{©«{Ãø0˜[_`ÕúAV_¡ØW ƒÉ õòÞ÷wñ‚7C ùþ² ‹•mábX±2‚4¼Rÿ  Ð:ÍR?„zí½1ʯQsÜaY4šÖáûdϵ]ýReÞãsÌo艫iÊ?ãüKLJTø=NPjm¹ý"4òžìœ!ÏIKýZáÁ¼è®þ(‰öóîÔà;ìÆ²/ÀðÚ®Õ”Ì!G<ÃeèQyVø õþ[ƒå25™ÆåôñpJÖ®Ö(+: $ È¿|¡9•ÐJ8eÖwJlRàV÷07Úâˆ\ùÊpAg›ZÅ#ì  Q:´]{…ä‘vèÎ0àÕK“å˜Cæç<ïðÄjå4$ø””fïsY>¡9T{(M#™UÊŽÀñ®’ɈÚáÙbÎñýr´ßý¾˜•Â7p]| /$Ô"ÎC㉆‚7”µ—dÉ(}¬òÝÁ#л~ñ/(ºZ·\é·­öÆ%ßT ÌÔó%¥ƒ7Û{pC,nþö±¹äÙ9ß—øOàù a‹^›ûášP%W=´<–¸ªÑìŸPfˆh¤ójן ¹,›r IŸÐCÞ:¦y‹×ŒsOJÞ-=r[¦½¤@ëKK²ŠQ 3ôùr¥ÃÕÁ€ñëØWàP „,˜4È3B–eu»¦T½nnƒjËÅÑÁÿ0¼ÿyä§ú7¢„šý¦K›7#wbBßžC„½þ%ºð¨YÖvóí…WtÐlEj~!Ë'¤›VÕa~:¯§ó§Ä´Ä\T„6FUœ+·T¿û>Üãy04#r©™@€$Ò4’—õF ™²¡U¡! PÞ70àÁ¦OÊ@úBZVÙ:ËH¶$ –Ñ\òíò¡Ž[^{ JRTå`VNÒPÓóŽLSHB:”š—&.ˆÌŽscB¬‚fin-¬³¶(8‰0×<úz¹+¬ ªw¢Þ^En½ž}qcAb±ååìÔœØô>uøÉmb“H„dO`Q$‡'ã^ ÚÆ‘§äOîfø÷qÚY™Áâ¾ô$5iWƒNFKBkŒ†)éoñ¹ø~®5X:iÞ§ÿ11çÆä°¯¹©Êµö29%ˆà fc›ÕG›—Ta¾jâî‰'½Ý‡çzv%¹‚»(Gjò %«ÑÒ)ÂŽ¾¢¬´âˆOÐÿ$´oñ³æHÛ}6éé¢c,)ØKÓqå‘1üÔ~&Ìœ,›áú±c«’Y1v¯/ÙýfÏÁ þ€N-¿H­“Ê7ÆÏyëW樟5_XÑø*'LTº" Övnw¼ašêkÁk˜þh‡5‚>™ÈíÇð{°!Åo«N÷³xë1ÒzÊLès¿ú%CY‘âc!zÅo*D—ün~¢‹;qýœ=CˆpšÒŒoàAfgÞd“ x££k±ìH”Qön¯Í9SÜå¢b ·„þ'Ý“ôgà/·ˆ;InšÁH±NÝÈ[ý³]’s%öäž\è2G °ä+EEÒwÚ¬RP½"Òñ©êâ&ß?›uO ›bD]ŽJÌqñy+–“ôlÊau”éÁܲKäþÇ”§ïéµ&kÀ[Ýí^£t•ßb ÌtÆÙž>^ªªYŸK¤Yª°k õoö)+è4RèýþJ4•_(ô¬iW+ÎMñ.¾êã˱1ÐSõ f±üh>4µ®“ð”µæx çRsïM®¯°¹¾n2f« +cË X•¹TlŒ/©Ù#À…¨¶®¦}]÷ß =½×¨QQäìD/Äð3í¢óõÊPÀ6ˆÞ ÔQú †áõä[\\æºô¨šFäGYuè"3á€+uÍ»ËÖI£æ[9ÛU6ê,¨V¼[àéy·¿5'Yk s»º|¡3-Œæd;ï/âý\ýOI5Aü=Ûâv‡&¦dˆKÙwÖˆªÃêF³høënH¯æ¤ŒãÔ¸õJoïh &ªq#\/}ý~ æÖL²s¹R{™5cpxΑHîE«]t›«KÔjšc´Ž^µ÷$‡ìå_Üÿ'X‹97”|”ݳh'¹¢_á¿X° "'GÁô ôÓ]ùzÑ¥—sÞ¿u§XH…+VÜÓS›yð<5û{[”ÿAƒ Ól¦‹ëüitÔ´U)+[zÞ9CjÁ‹Ö8Ñg1š{hO“a P/c£á‚®hOà’`v|ã«3ämÙªÌçGr‹®ê~ˆƒ,á¢k½óœ33n"´7FôY>q;ßseÕª>¡Jßã–3¬ –®\_eþõÇ­vEu㥑4™F¨Ð•µHv6ÚU"nϳ 4d"R?u¡Ù™\ò±o¦ Ý9€BÁ3¶Dpw—ƇÈŽ#‘ÝS" éÁyß§¥W!ɳ†7ûpŽ }Z*¬ÐI3_®¾e¦ä7)-;«Á•:?g½œêW,Ìå3¨O\ð÷ù·†tUjÆìÅÔ,\5~´N øKéÌt÷—¤‘/÷‡Vgý fYÔü]Fü.>m|2öå)Ïß$œšëàu,ÆÉú¨6™ê½¿QrW¸‰ðêÓ—ïô_o‰ûH])¶Þy˜ØÓNS¾wª+œ:wó ñZIkwýéñi)Ð ø›Lm šÁ]ê±CJWÛ:þgeï;XVG_‘8ø#ëcV[¹’ó—ôõ¶†Ù7º‹,Có•5wü­¥{R1' nŸCS¿‘X•fÝJñ¾ïûÅag–B”nWá0yÌíažåºCº8“ý—½ý·qmõ l«te[½ÉLod¹Ú¢Mƒ&6ô¯—¸èÞ7ÛåÔOLª1JT=©91×=7Ýöþ=“ˆ °®šr^|~®>E—ݦêå(™ _ú,¯ÚVA(v2úéÂ$mAž¼¥Þ ,°²ÛH¯Üç7üd‹ˆÛÞ‡zdÀRÒ[»©PÆgj¨\0 s‘n¢²SÄOHþhê<ÚÚÏÑNGpáÍ›!µ„,Xv–~®³¿×?Ñ §Í3/ ¹Ñ¶B­_>UE“ÝV.@H¦œ«ÍÑ¡Zý61Ž‘Zª)«ÐMüÏîƒiGÏÙ†˜”U -àY«†/8S¹É“NV`ƒiWX}«÷(s7un9ÌEþð^>"`×é”´èaô´ÜªáS¡hÅÍøl™]íPÚ^†‘KÈ=Hø¨·Žlļy»Ó®+ÙUgE.âóÃ?‚5nÔÔ€ë“×ì«ÊÝúb0þQ¹Œ0ô}³õàçMt@è 3Ú‹ @¿Ì2~ [@;mšÃPcï¼f¾ˆÙ4"Œ\¢{¡Ø|¢N¯,FÍãV͉æFÜïW6xD‚0–a±ìºÄš ™ž†‰úBWhaÛŠYä×Q‹Ô¯ âdr·Yâ>S#²8¼­u<¿P_x_ B·>ýdÞü¥ˆŽ=“wÒß‚›Ç ­Z‚2ʾžËyÑrs!)î0Øœ?Çñ(5œ®Xéô¹çpn7£?NLKs¯É}ÞªŽ@ì¿àr•q{aQ÷ÁF¹ÌjO¤·¦Úv(ì®1{[(JÇ‚›vt›q“±Óù«jòdM™¢s°§"&‹¥ŽiÀ;Í„Ty<öt n¦MÖšgF\ðg†uâÂ)®lR{ïêm+9Ç 4 3D@¼©?„*€€ãö¬~ÛSö§~ÝÇíLý¶õ'þÝ'Â|çÿ6¯Ÿ9ÿm·v;ýý_ÿ%`AÉ3 °˜HŒ¨8̯ùû16‡ÿ„t3$ yÛ ¾X<49)¤—*=<¯§éú~Ÿ§éú~Ÿ§é­ êf¤ zÃßñä)m›Sq,a/ññ ä*°bҘϩýA¤@Ðÿ ƒÂ™l~–õÔòà<›ý&®=L¢Ä¼ ñÞ–´‡OÞ!4þ~Òìü›8/l%¯w~Œü«9 2ù8èÌÞü-Æ6QÕ6 «_G^W“t Ÿ‡ Pk¶š(vÍ]0¥…ÚøE@ØKâ1Ë;åi¼2¸»hÑq—~¦á•=½æËúœ§¸d—]Š‘=¼CbM}oŸà€…¥Õ÷x#K,?Iõ×ËÎç9HȾ“€Ë¥êݨ÷>Å%s^íùû—õµÜ[Ê_Z¢Ê£)Ü`0€}5óm-A<ÎÎ,þ ÚͺÂO™º)#¿ñüÇñü~è:Ÿ°†NDw½Ô㙓[‰Øƒa<š¤n“hÑLˆ½"•q–$³O9ÇøƒÇ-ýom gZ´ã8÷äÆÞ Ž*ˆ‹ˆ÷KëE™k ŸéO>°²&I %Y¢ø©°&f«]½º%(v¨UmºçøV—î¸K Ø3E`ŸXUc>—öš$ÿXf3=ÿ6J¾”;p‘ÌIþèMq͵­6ä±åV‚ÅÚD=ø*W„yï=“Q3ƒ6Ìwh@×j¾‰‰7bç{; |:`Å00ª´ ÉÂeƒÚ'šv †YÕäDáür¹ö‡Ã¾t¡Iª+š8cŸ'Æg+^ã\Ö¹”72?†¤òù\õg±O;S‘'0ªûû‚h ¯‰‚ÊD™ÏOOR©{ úBówc¿þ³Â,]Œü(Ö”›Q‹º# •wËHý²’Á̯µ¸£„vu#ˆó8~Îí¤˜ýN…öÆèâîoQôA]ñ)†„ xLQk7œ_úe©ûKAkq°Z_ØH©œ€hÂyš«¿azmÄvÐfŠ‚ b\knéÖüá7ñÌÓ2±‰±.t»ï„`.æÎŸY#Yƒørna fenÎZg†ü+k›•P¨60©yoÕ`N ©Ö¨Ên4æ!$æÒÜ4|¿U‰.ÇX­F#.z.©)Œ-0Õ Í[ɬ¥½çþ¶¸±«}ïà¿2{_š5 ~cøIŠÊ|XVõ…fùø?Œ÷C@ª6+.cÿGéܯÂA¥˜â0P•íá¡02|* “Vnª¨S‘ÈþäDT4°ÛNñF.~ˆY³t® bž*hˆÕÚ¼dþÿ‰êê¯O¦ãßl¸F—1C9†#ûaKß‚ŸcuÉÚ’äñ@<9 ýÚ 'µ è‘F„Ô>nµ‚r„"‡•'ow¾ ü*v!Kó¬’P~Î'—›±w %—ý4(€Ñ—¨‚7á/¬I=ˆ¤mžŒa¢)°F#gxôMÆõ›R óp²Ô¡Ò&Ò¦mì"GŒVW'k‚£foöEùé ê«SÚ¶sÜ.Å¿á^ÏŒE¼ž~]Äç° “UÿIW;j5f[¤ôs ÖÀŠçh€j:iõ+<§öœrØêsK¨¼ƒƒ"¦1.«}´=F‰Ɇk˜ ƒø’ü½§Ùª«0b£Ãr稅ÍkO‡ààšD2P–[ÛMÕ<Б' §ß}}ÛrWõ®TC_º.Ó0%›tI$h=—ÿq›Œ&ãw¬Wuµ;ÇÞÎñBßŒÞ TØöNaé z¿A>áG·z—dô ¥`†¦%a,EšçžQñNH¬Žx¾Ï½¦#a«Ê‰°2ÿ+zð`˜ôÄhÎÏÚÆüÆó0ðéůš®¤yÒÅ“ÙïgñF‘UÚq’Å’únÄV'™´GfX+‘·{{ê y}ÿ O:zXÌòí%΂‡Þu#ôÂzKNrwUFÞ5±ŽÆ88[ê÷>Å%¡î%ö!f- Ñ”¹ø4Ô*†ƒøuN¥RÏïáïp3Æä­sb­¥?€è¿vRÍ…w˵UÅ#r½…̪©Ë^Õ©óõó6„$j#æÔدӭǪÂñ3[pp«_¹½ÉßæPë7MœWš”öXÇeZÉì™)¹õk+‡´¶s£P|ûn·%C-eCùSŒ¦7:€y” יʡM¦IḼ¯—8†Æ6ZàÊv2“¡q½gMKÈe¯yÙƒŠëø©zËx«ˆÙÒ½ ¼c°7¡š_÷«:²yèÚ÷UF2©l¯wX«§nœ-/OL(N£@æ¹è¥ÉÿÙic09 jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ £ÿ“ÏÂö^ßj(©OX¯[tÕ»e2«D„€)Y´]M™|X/GÑ+ ÷qlOûr@'J!Ñgz?³pȯ6Ó"ã•#¹KyB§Ô#Ød\VЮ¥K§ÉRZµT ¾}á×Ô” ‰àºÉí’&µ‚y¢S'Å>#üñœ“tãÖFh úÁ<­=;F;£>ûYºßù¤ø ¯Gœ[³Ç©ÁCÕ¨ŠQ~6™ÉI@µÐѨ$¿Ë¯¢„*²ÝfÅKér•ã1XÔ£<úÝÔ’ jS:"Awõ:d‹•µ±n>²•˜"@Ä gH$åe*Ë€€ÏÂÇ^›1A (ñ³’÷6–è`˜jÞd\)GVæ‹èfž‘¨¥h77ðõH·4š·˜ £ÑkWŸù—Ú«‘¢m"q9Η~ùód*ü|ÏÇ…˜N½:RŠö·3œ÷‚”˜g»NPdE„o˜ÃÅþØ-OáQMÈ”ç÷ÒA.$BwO<Û^. ¶R´ži[lÄöüû.…*àÄf† Àµ”©cFt1Æ=/sŒiÙ÷¼!À¡4£Me÷U&•úá u¤lŒÏÎÎÂÎÎÒ©7[K”é4 O…y9ñt¾Âõ™¤Š¢p7Ƨf¸¼ÕC?ݸ; bp±Â 0FÉËIÿƒLÇž Þ¢ƒ$ŒÛýqor7\h›cÛ\õ_/m+•«Z)a%)(q"±ó_B‹+¯ÆI‚ä…šú°£û„Lñ ä9„ê"SÎåñeSÏ~:lü‚êôP¼*Ç;z¾U̬¬Ø[眡%âl—pg*™_·¿–ÁN°Ù*æ¤îƒ~¨2Ö ƒÒP„AvaW…šTTî="c³nBèúz:Ûi2Œ”Öüøi—ÌÿrY«Ê{^“Æ|&ð°s+ãùŸJ¯“¼“(ÒPXÆE\„•’ D_?HY™ Ÿ | ’0X($ ¨ôÑó°÷I¸§³ ØýÛ¼‡ÒnÚŒdƒ?ËÁtZg5ªÛ~ÃÜ–›×òß¼Äû¦!{^›¾Xï—'­ÐB‡ sý—½fj5z²üE¿ìsʯ9|5u}ÎMÜCØjÍ{lñ¯Pê…RݘgÆÚ ÿ‚›|—rÆ øRSEQ©Ìö%ÝNMÀ¿IÀGa*†*‰±TO@é_W†Ùe8 4±Pj æE%eÐ&#¬p°/%x#˜`³ÕGÔµ5iŠw'@â}åM©Æ™È&t,÷­ÈíðÆ\ïòêÃòÚ V[cOˆd>9Âÿ>˜š÷nÀÅÑ1k‰Ë 7¤¾S'v/ó\fd-œäµW›’ŸïŒŸ\Ž~‚sHL_ÞXè­½$b͆õí2ù­J‘ýð–?ÖÚî_qÿC+­q/ã,æZ¨­éC€€ÏÍr?~ ­>Vîr² *;”- ‡Àj<µ(®Añÿ%‚ ¯?ZèX*Iž=/J V˜¨ÈÞ«‰4v6Åro^$¬W;*YNŸÃ:èå£^pÏreè(nkb"¹gÏ`ºƒZ< "c³nq!'ó J®Sý÷É!y¹„Šw8tŸ€¡‡£{|émy’-I¤·…ËÛo£pþè…0«2·7GàŒr˜>ýÀy¿/ <Ç*ηºÉ$A”j¾å¤&þC~ÔØ÷>ò„ow~òSòCÉætœï,ñRžZû-Rmë^R¡Pí³Á²ñ0)•wÆå®bwáØ2Š:v¾ÏϬ ùõIŸWฮwm¬i";`n†UPlvæ™ä¨ËGN¹Ö·PéÚ'úJLK}ã:n¯q´ x¨³¢3ó)ij2WÎÅPró“Úm»³J–»íËt³3ž¢ÌpBžÆ|;PmsÓ~@c3^+òüÝ¢lX’žÚ!½–ï¼\tŽƒ]`É’ —âäS‰qIû¬í42Î4™>$’"5Ðö§¬$Âprz7#O‹½(ÛA›Ü¦9:×(µšÁR”Êß/&‰’m¢!ðWã~µCÿL2m˶E9Ãýªvy¹­B‹"i·‰|{O9sû,pÆÒwaµlz¬m{ŒœFØ&f!¯ÍÄx)t‡‰w¾%r±û€³-ñW³n¤œHvC8ž‰‰­êüÊ"ä\e­µ6@K  ý†ò€ÔõnY^ÉÈ…ðôZÌrm2Š[™…ìOµ}òº'Q õäšbjDÞK|†Ïq„š@êˆÄÑ öãe»”ö+=!\ÁÏ‘°²áp&™€ÝbGRY/ÜbžÞµl‘qÞ7áuä¥@?ÏK ¨"lÊ@Nc’»A"¿Kþ(eq§RkûÑÞ/CÙW9§ ™Q£·{Ï&¼àülù)˜®5EÂy›:äU‰3…2¢¿ ­¸á\>ªàMš¯Îï•äB!]<ÔŠ´}KÁª‰DÊ1œZæw›k©4ž\% ä_¥|1Ü©5 @¦e¹ŸZŽÏà×ЪDy¤CKø2tß¿t=u^6cB™¶ï}söð=|3˜%û/Xô—9 ûtI¬‡æEAy;{%OSþr1w«Nòýɾ· $úP˜ƒLZÊ}FçB<õàÏ?'%ÎÌÀ6.œîï;r…¾ˆ,¸âøÖ”ÖB¢‡ÛÙÔumœa’Ê…ÑkÎÒp›§óÖ¿ÖýZÄtXÛ·ˆùo9UíDÐøÄ$U˜# u’©È †3dͰSä­Ûí®ÈÛkOﵪj+d-3¼ž|± 2öb œîjÖÇ?¢˜88$jÖµe4ŽÇ««Ô©! #ª 6îl•kYÛD~ íã J«‰ Ìš5–`&a4þ ®Øˆ ³?ù‘ôÑ+kã`ކ‰îÙõ¡Ãà ñlª];nøáñ0¬‹RÕüL=‰CÖôÒy7*m ‰wI ]xcŒ—&qÝElç½À×­îI{ž9<ŒÅ‘4ù–0c`Õ€FøÓúÇ΃ۘùú ¬ÿBÛOºŠd8i g„ôo]~’qÝ]Å#(Ä !EþB¸Ã=Êy`Yøð{NmJîŠÊFjœ×¹GâõeéÄÊ©“¯Zí 3@ÑâC`í}w¡Ÿ†};%D{ì ¥Äˆ+X M`J3ýJ¼WA4ÌÄVZ}í¿Ðª ê«²¥^IÖ¿ÕL.ðX±_äàC,Å5ï‰ÒÓªGBg•–Çfæë«Ø³¨öh%"ð~¾CºÖ/¦ÌÊï¼no`)u‘dZå2Äœù;©tOÒ¬yñúEO;v“@W1ËwìkW9M@kÄe;ÓšV™sÉáz•¶ßÞ«ï«M'HŠ(× ÐÓðÖW³‡O°‘ê:øx‰tÄÔ›`1AÇæŽªÁܰÃÕÂ2“(S iB°õ›8°Ûk|Ð,Yš² |šš0P¦>.1h€°šUý¦ãôì7)fÇbûŸSë!ß(3!±Z®}jJ¹Itæ}0tÓù^PŸ¿IÇO¦&¯?´$Ót•ki’ĆêÇGïâ€ÉAt ” Ȧ·­Ð&2m¦G_üKEÞ¡ìå†5meÞ5Ç-^± íïæHL¯;eÓRØÓTß½‘A2}³Žz‘H'ÁR(ƒƒ7eåFž 7¨•vwD…/à t׫,(qÿ0øÿgUdŸm÷_a/Ï,K3Føݯ»ïÅ«Ñèʇô8޳0 w1ñ Ù£Gö·Fž‡U”³LÒŒý.Œ®­ªÜ¥9Ú@ ´| wõ)JxK5 ”|jt#YÊs˜ÐÀã5D¢JÒ–ðÀÀãÝRkdÍJÞwñ×M/¦œÿ‰T^¸@kU’8zˆ¿ÑtPÚu„Ôø=H‡‹[¯ $'>S¥Þÿ:D,Hùˆ­yø:pÌÆ‚@iÚB¸ºµt·¯@o»ãúšJüµ‰ûê¨ÝcÂÈÌ àcc[Ûø®ûoÿ2°‘÷ËrdHW Ž˜Η÷Ee®9­e%¦iŸæ‚dó›És75÷‡èy¥"m*Áu¬Ç'*àvÑ^º9 âÇÞhm“$çzŸ\T7àsé´ ñP˜Ãò«5Õ]e¹®œá¯ãvƒi×Ek²'ÊmÙó>mп£³«ï ³æ.Uþrà½Bò²€£‹Æ"!Ë0fqbD¹ Wú·}!°F¥ñ÷ËTÃpûÌÿNÛÖŒë=·CÞ“ÑY•†äªûŒ\¬‡ôF e,ïª$AGi~Öœ‰ Ôë¨&HûŽ‘Ðº3©BâNìø¾o´òÌŽPI$ádw`´oægM‚„²n‚ßÐëœÃ7ût„I>%é16ö¼Öeý¦èd, ÝáþÒÃp7Ø/mäRG:wA{§šü/WhÍõÚo aîE6ê!K–â‚—!¢þ úëâƒN8îŸîHÙŒßsoãp¯Óú6d[öýÑI ŽªOë0X<¶a( R‘îLÐDDÏÏèΟŸÐíŸÐôóI€Hº¼í¸ÁXþ;Hæ‰Ê*ÖÁÁØQäÜ*{¶¢ XÙŒäÊ0ÿnÉ`:_B³wÏ”£bn¢âC9_íµIÂ¥?¢\â©•i½)Ÿç% ð&¯ä\:{$¼û—S8UVþg¬p³Cí2.YÕk„¾­cX;ÊDAdE«m;\8t©Œ6wø’j߈#brH™êŸ7_åfˆäj=[GÚ鉮>®Ø 3=U¨éÔ¤<Ó7»WÕ3,·8´¿[ɹ´¬úŒk¥Ä D¨UÊ[Ì®ÔfíÉ¡F$z\ŽQÞ®´‚8«q°€æŸ ¾Š™4¨:Ë®¦Z}Ê'¶mŠôÝख=2åÚ´ƒå]Qné{²§Ö pm#·Òuô —A Ç3ò»EV\”Cûæ‚€‹qcW[{|±âÎK(¸–†çJk ¶œ9-,µà Ž.3…É/zUKufçÃ>Bìd¸ [Kdï¾ïC3yå’s¦ÅN”Ò(¦\9´óÉ´)&z‰1î]&‰|ëÁ0>FÞ`šyËK<¸U߇PZ“BÒqÞ¦äÛûÃØvùÒxnA%w´çtž_„ìÕ¿ j@f¹‰Š 66’eÉí,Ê,Ð?@ÌXÆ‹éާ!ðìPéù¾˜pk«ºÖg`K5Pì]F¹²a¦oà…%cl¼ÁöÜ\Š Çr¿Ÿ–Ï'¢x›?*;Q*3+•Bªªíß‹|Ú2ÖÚv¦ˆnùÐÚuàþ×Î4ìV=‡Âu7è pÆû»Ú‰|Ì€ÑRÿp•Fk¯>+Ûè1n»ï@¢slL5$ðFóHDÑÄ]?¨“ûü{—ÐHÌF,zƒiZä:§àHë¬ãÿ{ïUsGv]ü(‚.©‘Þ"$>•¤£ßþQ¨m¥£ýûâ_ؤhÓ}‘ž“Ä·hë$ýçp3y×›vâ<²$l¡glòÓ>óŸÚ ô…FaÜ(Ügçdê%pŸk ;-Úªnü'ÇŽ…n(·4*-‘`0Ž sYéëüHjQ‰ %mÕn§a,˜U–üdï"¬-Æ->Ø’¿ÕÑÉÚ©HåµÇçÊOHéÓ ™Y]¯‹¾Kg‡jó†=Ÿ|É7¯%u‚ܤ§ÒêF_àëŽÍx2KZõP0¾ëÿ--7ÿ+¢RØí÷ør^¥Mš]¤êÛúÿ…¼ á?´GÿjÇtŠ‹û–lÅ–äEÒ—ó#¡ÑlA™¸kÕª‹ËD$”úÌé|ØðŸ o»(ƛޔ4Sòk›È\z5*ýI® ·à°¼X‘ÉHž\/—;î½v),” 0¤³ˆ¹i7ž\ŒÑXLc¼és&¡«6fMXb›ö@ßR±ÈT‡¸ú¿o(˜·{ŒòѶ‡»ðŸbt„µëÐiW’W¨‚[|îYrŸø«0–”Xq­˜”í¦˜Ê®gä7²p@${ääA%Ž ;&¨ÞZv»QYvo4¨wèŸþ›z;ט!@êTa¡N•Q€…™•÷÷X—ÐÑtnöé*›#î<|ÛÁWŸŸÉgk&Ò©±?pÇn´§Wc5¸bxkÖÞ×ëS;ÝêlG€n£ú²å¢/¸ÞaDþOÂW?BãY÷!‹í­ìHc]ží,cÃÆåš kã2ñ0ѯƒhÐUR¦WŠÊ³nÁ+Å]êçg"ëݬ‡/G~ðz0ðrŸ5#j“à;j=40&ý¿åèšUû0ù $Vll ™É@ùsv%KllÁh¼}ü”Ë?Q¸U^é•ì züf«‹ÿ†çøÑG;ÏQmñ5l¸þöhÌÃ-bƒû$+2÷uäPNém"–ù>­o1°{/°Çâ¾$/¶­ §ò³•ilãYÄ B°¹ÄE¾LÓì÷m@Ó‹·¼ ·–ÌÂKŒüe²„u7?²dëÖ«È«ÕÛÚɬiJÐÀàâ7›²åšk=JÉ7ä‹„½GYÕ(šû 0bwMM\ŸW²·¾"Ç=r°PzXcv#ηµð‰'j7åˆë 3 Sç”Të’  &´»–ΰÃõö€'‡ü7'ÍR‰«CÕëˆ+ˆUP“߬¹¨ip!tcb yà„¯Šx ˜Ý»¥âW!RB±?¶Ð²a= Ð`ù¦ÛG½ ^Nj‰m%ÓJi”Ä«§Îãݧ°‡Iyƒš‹¤Ë˜˜Q ƒ~<ÿNi|Ôü‹¾¯[ªƒ b:ŠÉÓ°Í1CGÛAOîxñ½ÇñÒ©œ8•îÎTu†´’MyC55S:û ›ˆ¶hj–dzzœÎ&†¹±#4 ª^¾§Ûql~å<Ú&6U¤$•%rµʾ§$•¤»`݆ºEEñV)»J~9ƒåÇò;IÄK¾œ?{·²Iá=›µúkHÌ+­á¶ÏÏ-¡*+D;€$æ^}Í5×@2x¬ÄèÐÕÓC¬;§IWA)ñWà¯ý4d¶{çfe“óðù’FøÍ¬ëüˆŠÏÕz$ÁóÄÖ\ê Æ±eî> ZVÁ9^/9÷"1TÔÙùãOÊ' •ˆz OûžPS–|ÈÐnX(Ì?cÎÅÝXxíÊÖé¸`‹³¹îò“H?8 üi~×-Üb•¯æ–÷5ËÂÞ}²T^¹üf?â =§Œb:$ˆ+ ¾þ;z‰°êä¢J(‹Üîirÿ%‚Üü`ùÿ}¸Æ`Zù*K¤:ÑTèê{Âö'ª€Ò!˜J+M÷„wåÃÛ¬$æûÞf³Tñq§á°6%•Ýî=É TÊ¡ZæåJ‘àcDÖ$X'‹ášz¹·„(TpmáëØ-L’O9¸±†2×ïÁ¼þ ˜µ%¤w}±EVîÉŠ0fºŸÏo=ÍÌn¸5å§QO Cá¦ø©ˆ¾ÕS©M  iš•–ÿ4þÊX.DÙ„¿¾âôo‚xfŒË×åäÛm{Š¡Ë†„ó7$—Œ‹¼´ÎÍ‹ñ|1s–†—&AW”[â&¡vRn²°aRQU÷ŽE™è‹È¨ÒIS•3ïæŠ–ÿ‡r’TÂ+ÿuõB´Ãzú¥¤]šq^M<ŽÍÖu ÷ίa Ìê½mZx•µ£‡låJN;±wØÌÏe3oíJÕg13aÜ5ƒCµÞx:R¿Eƒ,Ÿ" ˜­Jèx²ú ö@xìú‘Õ.õ‘Ëçâv;¾¿Ñkô„,O§×;2ƒ„°î§a§­^69C‘®îQ`‹U|í9¹¾ùÀÙ7rqáï_=_—«:ë ½Rô'›Äu.æÑM{BˆZ’µýsRž‡^:Ñ³É¬Ñæ1¢àéþ·Ô-O­[~– ¸kæQh8L 3Sºª®¾.ü»sþB™n„1!ºzE´G®ý àXæÑU”ÈŸ\W\ó'+ì÷\<ÒÝ+©-n« ™ŠxPÂ3&²žI™¡í/#•ÍãœæUwr Vl –¤e…|öìÄ\oœ=A, Â#Ž ð" Ò{¹¦y»ä/ÖG…£–`.ñXÔ0­ꇅhmÒä¦L›‹ÇN_Q±»SÌ2ÖÔ]”f7«.ªREöéÔÔT˜÷®TÁÒ¨ÈWåLé±ÖÛ×i{múX˜‡Ç…±.»„õ`nå†pž}»£bsái±é~§6è#M¤òp— Ц}-ß`¡îzš“^ýkB‘$ŠË»Ý~t}‡ÁÈj´ÕÊ9Tt^‘Y­«(È éh­¥Wo;¢ëN„ ¾ó@X …ê?b-§Kòôi#e¡ƒÅØâFu¯³h9²¦{G\°ÍÜ…¿'\z ‘¹tç±³°Ní‰5MC†IUY:©ßmˆQ‡ÚbãGûëCz"3x$÷¶–p-)æþ#Aô|"ÏÏÝç/µQd¥‘¼Âuâ G¦8èø3í] çÈP¨}0·jü˜Uç€l„‘K˜MÇ4䆴§SmÎplÉ–œaG€8uÃPXÊ9äÛ»)´<¾AðÆ ('‚…›žïF¦/grz E}%Ž9Ž£^æ³ä©–ÇiÏ3ù5ÖC¼‚i¯ÝínSγ~F…+d­óÑý(Ôà^^ïIôW«º6Cÿt‡¿iNmÆ$=sôòŽS°!s |´C¯Ð+Š"•HÞcC[²°¼Ø©Œ…‘@#4Pʤ8šh·|B$ìgGû!S:–0€#@“ÈéÀWëzA¡«¾K–ÿ$59wÉ1½S@•þW-©†盄±c×éX0À­u¦ÿCü¤H_@VcŠ¥ñƒŒ½Þ’Ô±>;¤¹ß4 “ÏÃSâªAzL²ià†>¬4¬Äù”Ãón]˜¡Uì£s•¨¶‚|i¨´Å#+—s@‘EÉñåÐ ‡þêA–#¨RZ΢ˆß¥Cªßo|Ò1ÔŸcÝÒY$c.ÞUYí_R)¡méÌñýÃÚ¤ÀJÜ­´¿Þ™È‡L)3ƈ ÎG´•«¥«SjV,O ³€ØfðÇ_1¬x3ÖÙDÍÌS_Ã+çSÓ°Äç40ÞÍÿn0fGrxèx¼€5>W5¥PŽylòD¤Ï,ïÒCRîeÀÑlŽ@~xÁ`DM!¨YabŸµ (­Å®Îå˜VzŠI”Hm“apÅ3×=F“nZ_M ‡›Å[ÐÚ…Ëã\k‚¹0˜¥ÆÛ®x¼…•Æ3dºC®Ë¨‚‚ÄÆ !†óÁάŸ¯÷®yoƒ Ê]ÍÁ'ÑðÅÐŽ¨:ÕL\wwÒg}EõììÍÓóGÖ6õG{˜ç2/PËx¢§‹yv&SøbœY='@n†KÜD¤~€Hº­Ê!Ã×ìŽñ/RC#{¾"ˆ·y˜ßù‹½ÈX¿#/»8EÞ ëXpe.)^èÞðf\¸…ÏyyÒrvbäÌÕÒ Œ½?q/Mÿ6)à ² m-‘±WÅÀzÝaVœÖ¨4˜~5’¿D’'œñ/¦‡.ED˜bñ‰0‘ùÿ«›œJXRgŠÇå}YO¡âDÐÍe¡äœh¤c Óc]žª†PÕïm¸Ÿæa)°–@†¯)= ¨_kù rÃzÿƒ»!ðÄ Ÿ:Ÿ¼2ë&R«Äék'Á{ʃÚB3…â«ý"–Þjï'šâäµফÝÝyq ˜ ðqGÐÝÅd¦ar³Ztïêùüµ1LêêÔeuüê‚1vñ µ0)Ùª­½ƒKªÙ—nF%ŽeøÇØ#ÑnÉ|6 þyðÚÌtxÅq(t¶mBZžwCå„–„­O^âFd«ZÖ¶xÈC‰³ö~’€ë–j4­Ògá¨)˜¦¼Ld~Z=X\ô"ü´+ЋªÝXD)“)Ýlk‚lOÀß·!ŒHÀ°¾ât Æ-[òµ˜ì}t{êpóž1Þ“?.åeZ%Z¸·õ¿®“”Í„‰‰ã›³ìµâc7$f*×Ï…jØÈ«dÌãÌ­‡ŸÞ¨ŠhÔI^)Jk°³«ºÜ€õ'âïçÉ¿hã¬-?*-ß{ø®ì•{d£Ù?‡*µÆ fmª% Ûò_A⛊ð@9(K–n#;#{¥©|Ë΂xþ-ÐSõÕ”6‰Ž¶=—š5c?cµãª—6€G]´*ÅÝX±’á÷;€žYu#xßòL¼6MÄ—8ÏÉCð»ÉpTQÐÈ¥ÆÂÍEu~ÇbÃémºó¿å OTiçzÞztÉ¡=Å©²Ë·Þ«DŸ ÙÐA«é|NÈ£ÝsmÁã©îNCú­Û>¶G¾²º5•i)%}ëóq®ý©gï"&`pkq½óçm€ÄNØø;1ïé‡ =ÍéÍlån²AÑ ¦ÊyìTpRdVwR!LÊ;dˆB—o„,·Þ95囀#·rœ.ŠîýfôÑ*é°·R”ÚàN;βÞSÖºóTânn>¬ñµ.>÷"45‡/R%×A€s/—'r¼Üå`÷qñÊÛœ"$×úLíî²8›Ôʈ¬l€!à÷¥¬ 3ÁPZ^èÐúd˜Sûé§ìMI!Fþ²hBó‡!d\iÝ'j°Béc’ê<›`íÇìSu~‰g.§Í¢nhÂK›ðîõ/=®P€ÁLÇWg§ÀŠ‹ycIq»ÍVõË·&Ü´$r¹çÈ ]0Þž# }näŠñm­(X4`îgAGHÀ2Ù · ]GahI ‚ßS)ƒ3cµQpðY,ÇÀéKÃUJê´óD“L²)e‹Ð.íHI©^(mº“lÊéÆ=H@Φ'JÃTdƒýׂµ!ö|›ñ7*3’CsfsàAÝrÀ_ð$ÈôPaït»¦ö³7'wÕùÆùsïrF¼ õÅTK«_þÅ%€Yü;µ|Eú¦E±•~£ŸýUlˆ'}áËH?kè=äv*/‡idü£\e’5rÛ[ú G|HŸ*ò¥+¨ òïÉ)¥„‘<6ù y`Yä7Øò9ƒnåÅ4¡,Û}_†Ãä•Iy0©ÿ¨‡“sÒ5µãZºÄ"ÏR~œ¼Æ/‘l…i£JC¡ÊzQƒ“ì»Úk¹¶™©pب9ò#„4ŒÄµ,Þ׌j›<Ä´C£ÍiZ!¼ôÃ8®'ƒ\‘3GjU3ù¸~K¹ÿJŽPlò!ØÃ,<誜iÜäÆU¯Ÿ½Õ ËeàËÍ2îäÌÁ°]ö·¾.¿`8qÌà†8 "Jà†±ôÊRÆ]4í°ýš%ùÆ>‰XÃö¨Pžïÿ Æ-&k“šíåÓ£0^Ø_£òå3¤×~Ìâð £ùÎÀPpØPÌsF5.¤‘R¶áÛ‹_gÃ^B#Cl᪈;RÀhÆÌÈâÙÒÍÄrJòú%•'á–BøÞ¦%íQ!(à_×L¡y ¯Kƒ}öUÜCf­ç<’°ä·Ž«cä< Hý8F¹ô‘ŒTõ -<›Ò’ 8c~wšma™kËõ(ºƒŒ äÃÓüåïlw$ƒVœ+8*j [Õk¶Îù;÷1µXÁã±ÀZ§ƒý[ÿOŒÒù†÷)æ¢qǦʥë¶éIhØi/JøšÝÓ²+÷ÊΕÛôÈEIô ã?Ϻç€`-âh©·Jôg, 㡇ñö5“ÊS'¤)ud¶÷0õ^ˆ¿]š¬íÙyWVX¦-€¼ÍùœïT޹\(iû‹,‰o-°ZC_\Y¦E2‰®´—m@z_Dw¶†l ÙÅ,qeâ“k=ŽË±Yx Õ fŠØ¤³µ¬s¡ÙýOÇf 9ÆÃ˜¦µ`C‘(´æ£p^¬2|¨=6rùŠêÇYE'8OÓÛ›ŒìÒÀÑC£Ò0h’èK§cxJUÞèìáMJèI²=›Áõ4ÜÀ+¤þr$èCÊMñv;FbÏph§©-¯ÛÿƒÉO—Ê1WÌ~p».Ú š7m&X`ù¦ è™Gù\vã|;Ê42½$ά4©¼‚Ǧ|ÐÀ•aÙAÂ6– 4 5‚a£,6Ü»‡y "™®â “^‡r€€Çá±±øk4? Üõ²k {˜©Ô£åÜÞ<”=ÃŽC;Ä6J°~©ÿaU¹Ñ?™º”…ÔÎù>ÚôÜ—ÒÌ[ÏäúÁ·_=Í}’c’%O¢ ÷ŒZ Y¶ár\‹³Ó'ðÑõb ^sM¦ïgP-é€Ò|ÈÏAkuû¥q…²Ò4[cèýð.µØ÷¡¿ö÷£üº3 Ÿ}LàlÀø4À8w€¨À+·›æýˆÁ¡Ù5?ýBªóW —c[(.¶Am æ¥úW¢©2“¶AÔärCõ¡™ÔU¼ ;öÝP•¢æZ8jJ´R/û½2[Ò8Ð? ôùß=¥%ûÓÄè¿¥+ ²)Cöµý!õH3kÅÇýÓgŒÆw”%]¢t(°ÖÞôˆz¬è–Ç82^Õ™›\ŠóR¬¹ÅF•@?þ‰ÓÎâñ–âY ˆA=þSVÐuDëŠ"æe»ö¢"RŽ·Ì!vX#®ËWðzì€rÞý·’ [w)+„›w´Úb¤›˜¼yòpÇ}„Çw„EÊQÍÖ… ë8u‹Og;QrÐ`]†¨A¼}k“Ñ»;NÏ^ô„o—‘ªåHž]…Óò»ýü`Áª±F£ thºWƒÇe¯PË¡ ¾¤¸ôía7?Çö@ðT•l®Ÿ\½•ÔoOÌÎ ôp½ª¸ËÞT ¿÷cÒ4”EqÊÙY¨­v—KX\@̑ՎT9Í3FyO¤žÎ<2d@ôX¨MI â‰w¾ª 6J€LÝmÌõ>Ý£ˆ 3xyÄkº#Ÿ}ºjsk(}0‚°…'Ïtù kgoÿgA®dò¶Å<‹K±ð¥”9Éê••hÒPãE{’<< ÝÃa—>ãõl;îæ.–I ÙU‚4˜;%2hï©5Ïóž`ÇÓ„µrˆjÅ…R©àMßâ? VùÃyª£x‚˜VöØ]­e/_·XæØ1æ.ÒÄnVìç=øs“™Øi\#-äçŽë}“u=8g°Åmôp(YwøåëBuiAÖªÆ(ÖÙ‡äÅÙEm ï‚ÍlOwZ—ïêÞWÑI™œêh3I6³¥5Ë€n”÷“oT$[6à ·;ù6)¬k‚"nL†cî7Õ¸"Å®ÓÝh73/²¾Baž±V‘1F™h±—\UÎâÏKeå­Ký†™ ø¿ë .¥îìDhÒ¦÷rÑñœà*E‰êeßF-–‚Nƾˆõ¨²BÍ:²iàý`4H`¾S£ñ¨ÈˆyôTeÏÆàhÖôÀ¹¨ÌÛèÇÎú=}RȹÎèV´ W^’¾š$õÉKéPŸÎEgƒ»Ã3Ij±;¯Ç­XyñÓ̽A=ƒ]‹_ÁñxAƒ²TÛãz”ûàÓº™ÆÆÎbüãIN~ZßKøq`§ûs–×{F\¬¨1`à XtÖÝœÇÌ-I6ðCàI¦Æ:†Ö=Ü'‰G//i„é½ú`Úç[kß2+ýaâD›JD\KŽÃw×Wº5½}©Á“-²WÞ»r›j\¶Êëë~lk×_ •/66ÞºòFªwÁn÷/o'(ù<“]Låôx‘á(ÕVñ¸;yIÉïºI­ê‚Ð'˜s57wE<¬?¤gžZ²Mj‡1ų$§ôÛÔ«Yp/Ëwm’ª·ô|‹|Lsb–ª R‹þwv{â­uîëzüŠ™uNæà`ƒn³×åŒPŠe> …žž-gÔ-LÜM:ÌÙ*?> Ù&Ø4í²dUG³ì#¬ ÍÊ3¬/Hl¼¶¹júR)æ÷šæ: ÝPNsÕŸNÚÝh"?¯qßz\ îô/U 5‹ìú˜è}´&%<¨í“â*íƒR–8!´ü ý…¼:ÅP À ÆÛ3öÚ¶EÁ¸°˜ÚÈl3N_ò¤håÇE¬‚ƒe´ÐwÙ.¨ÿ3Ï™VÉçqâ‘?m6›Úqk˜m´ÕX^ƒ!IñwÅdÎÅPZÇÇhe›/gé¥ ¤SZl:p6#i*ëí½¼ 2ß)}¨:ë s­kØîeáã_—ÿ‰ßÄžI—h>zç@Ö‚ ûw8q0–£m®Åº½–yPç¶°ÐÈpú£iYQìk‰¤ÜIgÖN .Yÿ ˜Kà˜°™BŒÃ›‚ÇnØŸÐe X ƒr½m™½Âu§$H°´­æ¿Øk¦t¹f?[F…¸Ãµl<4¿AiOÈD’Ê¿õ@ˆ©Óª˜+¨V«ÅJqÓà 4’^„¢®at®uR'Îò šJÛܹØ3™PG%ÓgóCšæ'.Ä[¥¼¹´X‘f $p{3˜Ó|8õìÙΣ[ÞÈ–üV Æø’syüA`ŠÚ){ë/]˜f‰Ùú(*€¤Ü<R>ôxÍ©mÿ½>Ù‰67òYaEg÷­¯zòÈ„âÇúí©¿p}#:á˜î£—¸…J´|ÿe[Ñ$ª?›*e¥ƒ.(—–Žì2šlƒˆ ªHHäÉ]2î|Y€:Öý¸Ü< 6ü¹ï¡uÝþ°à1¿¯‹«5éÒí™DÍS¿Ç駈`™_Å6¯«õà‚Q2¾v kÛRÂ'ÑŸLÜá•]´)¡û‘¯;àCÀ+-^3¬ÀPüÌwUÚ ¸ÙŒÚr3£ õ¶þà‰‡Äž½Rènïz ¡‚$†êBðzºðé5¶²îç¦ç¹€ ˜NwÈà[ŽÃGæàŒtþ¸ï{Ð0‚êÉKôMº³¯þÓ9£k4–¦Û Uñ¨ì^&¯¹tÆRôÑKÔêݪùÀ/¬”S ûm~”ç´vw„‘?ý°™Ì7îƒô€ÑDYðt%.ÿz0n c„û<ÚõJÌG7 '=*HÞÜå!4Ç+,x>¦ *eBÊC:Wà+©ëM;¹ u ¤M§¿7í°å¥Ÿá,ÿFF5D|Vd&2¯¢˜¥^x*ýX‘ÁÅêÒ^dI"ù¡°`¹-¤ˆŸÇãö3”ɘ²‘%T!Î2R"¥ËbGKÀ<Òêˆú¾8©Þ¨¦ añü‹ÝŠæ@ar:gË® ›ÂL8©©Ø[D¿,5>é˜ Í Ä¢C3-¡Ïßµ|ÛzÞ~‚¬®ø‘‹ô8ÁV×â;QÎ ‡Ö›©á fC˜Š­Ô4¬lã†×JÆÍÚ›÷1çÆÎÚW ½óÃä_Šƒ¨ŸÄXÎÜ\{ØM¢4s ò~áÊ\„q9Eê1N>ø¹úÏ™^¦Šƒ\!íÿh\g·È$B?K†yKßv§!rrSÒÀze*òz]üg"G|3È׈V¹u–x£×¦@Kûí;rÅ›jZÁ.åç¯xÏxgoaK VT2x5 Ü?J¯)Lƒ@vÕ Îts Ù[1™¬å¬ÔÔ2°86TXW×7vÜ®55œo³®/ÏèŸßÑjÎCô<`]꽌µ¶ åœD©Ý¦ÓÐ>ì“ 1¥fãЇrÁ¬ö;¤äíB¬ùŒR‘†4<Œ²Ò–Ì´½^mÛj;éÙøÉ³÷¨ÜDa½ÒÍhi•0Dl¦ŒQŽÕèÕt àô² Û;'ô1ÃuK††ÖÖ¾øÂ%0bŠó5ũHxž{»ä=î—n°ätD¡ÑMù¢w/æšÕ›Tð`»t*u4O3°LuL£î$¿¨• í;eê°äZèLkmJ0!¨Æa‘ APTé² ÎÌ9±?D‹l$º{qî|ð*¯Ùß:Ç­ãRYÜ34ýýE«‹e³sÏ­E¥feük¨-!mJÛ«ü·¤w0· ¢ÚŸká)Ù˜ÁךÊ$ÔË‚£ÿP§MRÊnìÀ¨T4ö‘óŽz²Ü‡?Ûìùq¡.5Þq wëûSÛÓ)ÿ 's î\8%of\.Ñ{JV ؽö¢ÚÐîvºJ6š2Fz‰ºã¿C@)*ÿ7R3Vi:ZµóÄe+ýÏ©ù§HÆëóqþ-ëÌk» ™\ %ò¼m‘Cs^ì“FIIN7ò³z«x˜*‘`Õ‰ÿuÅnœÀþ,Ëgbå°ˆ,5Ê}HÇ,'ï'ÛYÙ8V>ÇTi{ÑeiÅr•Þ"å¯ÍM“4ç4âR¶¢5ÕÞMþ6nß*¡Ùû)ÞG¶»²ß÷}ˆš¢Ë­‘)õ!ѳOÉËôûç¿å1P1•Œ2 J*åyÏÏÙ¯þçþψ›I b‚è]F’ÎiÄݵ´ç·ÿ;˜W £ð&‚pW³ÜSoVƒ?)cksÍ« ’Zõ•9Þð,'E]"ŽQ8"áDO¬/ô'”×$ݦ¸i¿¾t÷>Å%s^œÑÕ.Ü¢¦oÑ—ŠJK°BÄ|Ïå¥_óaKe‰Šólr¿àE;lQU”˜wÍ Q¥Få(}çTž`㽪|Sø,È%7DÇäéz®A¢ÚP…²&UvÄÁ=·@§.-£ Ç_š#5Ö ª ÷7T: ¤]õq^ÜËD¯Õe”˜IÌÿ4¤Vo?Ç>µsÐ4Qæå¯wá­&ðÝcŠMv„H¿÷#§µûO£™Ê‰#Ëì¶fýƒîêÒ}…‡gi¡µt¸µÖ>©àYàñ±¿RŒá6“~#À8ƶµ‘ñ2à°¼ z¦´÷õºÔ&î.‰moÐ ÜèßÔ}¯¸üâˆÚóÓÏ…½È» íQ«C ¶ºîòŒñ£šA2$<™>GCÊV¥æ Öm7 ¼kn­‹=Sz˜À+Y%ý) 3ò/ÛØ‡a-ø«ÍıÕ4CuSKX]J°Ä5ÂÛÚ:d‚ìŽäú;BÖ¡×;µòÿ?ðD擎èÑOÏ”­ê‚7MŽf´¢¥Ne9—OÚ<=é ™žàBn*o¢•uÙôƒºÏ¶Œ\…ûíP>ÇXùöG4—º~2¦SQ±a9£I7ÓqQ×€Ë:+)€Ý*OS4ÝÇÕV'ûK®è°L•}I®((èC¶ž¤Ñ6ä´Óf#ã]Äzòȳ ž¶1¼Bv óhgÙÏðRâM‹s»Ev‘ BŸ«Ù]Rp²Zeù àgxº‘Ìù0/5¯8kR;‘×pvcž3ûòM´ì[f@ âÞkÔ59ÚðƒøuzE±W)¡m«Õ Ï—ñ1Ùðü³_ÐÃûsZßžà P­2HÅ“5b@Èk<$pÿa4ó¡lŽ Âè[ýÖ)Ø\õt’EWŸ¦ãüd[ ÏºŠ¸ýþ>ü«Í.J¾…ì4xiv”D‰æ¦5ÝrnQcczµPÍsÑ‹;ñkª gy4­«Æ’ø~ߠǬ“óþ“©ÿ~ª‡Á1î¨îP×#ÑU±9^;1N)¡y W¸P9Šð½àH[Ô§ÁMÜʺ°¢49nï>~p†C"È•æ>¤ûÃ…HhÀÏŸÑ5‹ñ'¦\|®WKŸaèw‡„»ªƒ+ÌwM§¯a­–§jÞ,ÃHÖºàœ™¨¿›{±f²ˆmhŒ®…rá_pÁ*´=†öݬAáè©tK‡RM*ÛÉ,žz%˰ÿN¨aÈÔÁ¦[],ÜM½_‚ °¬èîÃ3p»ÂeååÐ&&ÜûýŒ‰lw­Ìw[¥õæD­†Ã¶Øs¡ŽÌ&`’?Ô¶>ÄŸK×Ë$-måVå;ĦgsÈÍĺ‡Éì@AZ¨Û÷rI‹œíÙ?>Y‡™ÅçR·¬-UE,Íé‰|Ú oŸ?¸Î ÔÍÀ¯¸·L-i—U —Öª#ìxïØ`®O/ïVL?Õê¤Yò\¸4Œ‘ř̂+ÖJ]ÆXN6<Ø%¡oŽvŸwGé$\H‚eÆ¡Õ/E~ŸèžÃoìZŠ>¹@ÖPÂeØ «SÖÑÞ’÷ia\èã.qD ÐYoÙ„Ã4m†+jL­‡Ä~ÀÊ“DœÏ&ì”Ï$XÛ^RÚ1¯2û°J¥†w¿Šã¡Ø –^‘k8ƒáÏÞÆàjÄ0”@áCÓûM¿¯â;’,º‰ щ{ª™ŒŒcÇgðž­706EâP£ÌЦD{^ˆâ3ë0æÑ.ÆÇ~&Ô¬F5XT)*¯ÇDj5Aæ0r\ÇKªʦ*¼÷Ò‘…úHÞš†ù‹]bTTµþ"zùˆ5¸µGõêÇ-ü>(Šoö5ÝvàBl¤ý×­]Ÿm$ºŸ(ˆmþ+N*â¤!´3%ûc#mµÉ¿´±‡ÁXŠãgd‡vofwPúYg"K9°oFEОa¸¤ƒ$<¡³Y.Ú+ºT‘=v¡‰‹yæã™€poöêë p…Ë4~ÎîÊDãFZ˜¹kß HÏœ>J÷µ„L++kÞ±þ¹4\˜^&ŒƒªÝe¢ùׯãR÷'ñ‡g¥¹”¿dE»²z¶éS7S~úLŠC¢-݇³nÙé|'ò$½Å( Fü¹ÿO!,”àidˆkÑl#þé–ŽJõ_Ž¿ÃadÈG§‡Œ‰@`ì×Û„+m;ß{ÅÈTæS™ÿp'@v©ÅÝR×oôôÙâéUMô[“àëúYÈ‹‡«š?N{¦ËœËX°;_U/Žª$üX£ðÏÓuѹqUö­‰ìyƒ|8”» ÜI¨hÈÕ¢ñQÛ¿…œ@YCÿ` ô†B(6¡aƒM‰ÝöŒš2¬Oj&­x)fž;*n¿N‹DŸ»û‰ºê³IˆSÒ>ïÛ}äÊÑVTOŸ&@2§p²@⃅øØxn ÌI bµ=údiÞ^ňQ£:Ps­q-ªâsKOäÁÂQ7‘”ájÙ²JÂM“79zíwál}®ÆnŒlªK竹ñkð,¥h»ÊbŽ2”A3JxBXV9‘bGØ9æÉ­kÍrd|´ðTaæˆ,Ú•ºúpŽÄÄâÉT-¡? Ø<³Ê»T%²(¶ä³r6l“‡üè—BÆã8%µqŠ¡ç¤¥Â½v4>]£;Lt.¨>è7%{&®ºÜÞrš?bÓ F*ž`õ\iìõð©œ/ˆY#J|LT©!Fž*ÖÎÄï6Ú²æ]ü[Ä2±næVáo}W&B“æ¿§\Lõ›´…X’Yß*Y}<¢`(ŸLr†b,~_H]?¤¡0Cí®õeTjÇGÕ{9Ö#†§£^ej%¦3/ܞĘü‡+ãƒ?$å<ÅÑæ<ÍUÚª+øÁ¦p‰(S¾cPåÜ#ý¶£Æ9ɰ¼ýW &Ì~§_ÌEö¦ã؇¢–t À}XkK7Ÿ[‚2i¦ŒÐ•!R‡’o1ú–|”¬ñRxx°~ëƒëÌþ ‘æOÖ ÀÙäÏ jh $Ÿð²Ì¢çæÀ>/•‚eêî²Ò¼?îm:´2—Xü 6гHïw–*˜"? ½éN + ¸_’B…}Eå¸0ÏI%æüt±:öºª‘Sð¤ @UfùUÉÕrTVv1&ƒ?ò Ü£9–a´èûEz™¼Ð÷Ó6‚í-/`xY8}öN]á=€ðVÕW–ò~Yú,ø«V^õÚá*øÑÅŒ'Êpjk $Â@²'Ï 9žF:}çúv—æÃð˨@γîa,êjÛÜÔß$•ò,%†ì‰Z#ý_8ry‘·@…:X3‚\k·±>SÏzùhðdïóp ¨AÅð-@®½¶\*.³0ÛY/}ù#€tO?Øn1D‡0_Í»h„òÉ Þ<µŠï¡’”R㜣ÿ\Ñr¥Hpÿ c²•dZ˜‡]µ“™¢Ë=Øê÷È|®¥¾Ü;‚Рƒ,|ÚïÈÍ9áK>ÏÊ òf…(k\‡MBôrÝ­(ÿA¯9ï]þâÕ%·yÓÒÌ>êjžsßwc¿þ¶2b“%'îö8“ #O†ö_z ç®á6J{x×qÎôMnÞ"©w1§±nE;Éï5ƒÜWZ¬±{Úebz$$Š£FÜãê#uVí(œ»s¿ ©¸eè|%K]¸KѦzbµ¿©À[ÿP":Xüq¦ŽÁ¸\xÚppUÓøòp¤šäÒC-zB²bŸŽÓ<½úFð€N‘;¨vnDß©”‚ØÔ"ïXi­­Ý:Å[ÂX‰Žuã ó_¼”ÌÔxBõ7už_•ö#N{T¦‰ëóôUŠ,êÓv¶ØØ’œ«w Êg»ïÂ?§Þ i  ?¿s… ,_Z(…äöÖºóú,¼™¡°ô• Ð×ê£Ô=+< Ç!Fé4é6u-JÛÚ¥£KõÚ'3-‹·™^ý\’û[aܦ„ø¾sâz¨=fÞÞ‰ûS´* ù ¯Täÿÿª rä±:ŸsU›ÿXE cÖU¸ÉÊ?ç·Ø«¯®¨-;}1*›Œp¸¬„Ø{Åïùÿ…³@pÑœÞx'pŸÌ0ðQ9è,œW‹Ž„Y-ƒbÆ÷A‰~ X"€ùV„j2h÷ʳÓ¦9TYý¬:qwñ(õVš®ÔTs`O¢@iŸÀ`4Ú&ºjÏÕqåZþÞ‘Z*'ÐjTJ¤,"õ6ÉÕ*(,L 5áœõZÜI \³ßg#¹èÝÙ‚D¨ÅÞú@é¨ó)? Í—n+]óñ5¸ÄJ$uH¼¤Øê®œåw}ÒžŒü•Ý…úwúN ¿i—³ÊG†\ö±ýš¦r-b µË²J /R“»<òÉ>Î`>í¢õIÆd|à‘Xç¡Å ¢;¦ýìm!U7qÛ‹@âAÓ w>Ç„¾Vè7yðÒÃX-®·¥ g§÷2©=ƒöË”¶ÏtqÏð5Ý)BÔÒs`–¹fÀ˜ß×Þ§f‰æ’ýéÃ\O±9ªD1ÏãSÄ—ÿQ(9oE! ΗZ½Qkú?0Ž2 ªKnq|¬ÄnUºŠrõbòK—ÛM¥ ¨…; -ð]™‘f”ßVdQ™Pæ£Ç‡¾ìWd™noJ¹ÞÌí*âÓºŒå L5ìýO:fœ×»%”žp”©¤G%çÞÑx*l/ž:'<“£÷´Î¤ëö“¤¯Ë˜ÝŸ™.ë:ÛàÓƒBÞ–‡sãcçû‚ÁÍü€E0´tT¡ó¸ÚÅ‚7”Cq‹kÒ̩Ư/^UoNãÃíî»L›G1šgAüHæ¸á.½%†oÿM½ï•ýÇ ïS-ÏK¸7 ºòÝÁ[ ›'Äù -6 “‰£ûF¨9ˆíLƒtgú`Y)¯Q“Dß>3ÌmsÙÓéìiù0 I]Œ6B¥±ÔÚR ˆRv+®X9ú²áÙZ«¬qT b‹…¢•‰tÕwýéðúÊÏä—4`lhén ‹[·»¦«Ò²OuÞIºqñeªÀ½B‚Ô¢¦›Þ¤¹è¶ .gíiNý`ùë¯Á¾f ô®j.³Kƒ–íPBmýAœb…>o‚— qÜ{<®;dÁœJqèÈà 7IQwrŠÿ ¼sÕv%i½|–‹xwËØ5, h ŽûíѼy^@ÕçN7¸› _›[§|VÅ\«¤Õåþ]ƒù] Dú [Œ¢ÿd"ñÝ:R=Uý5¶iÜÅò‚½ÆyrYb!uWM÷”o¡f Èötê&Ë­Î/Náià3¾a ó«,»,ïCmìך‹jÝà@€}iEbF×ĸA³ïÓîw´Ê`³P(ÌqG^UKÌ–<ðyòZ6RÛ=}Ñ\}¸|V5Ьû·Ð kaLÔ)†§bðäUÑZl«3*• àßëéúqÿG™: ñD˜DI“M82üGÜû“p\—B2.ó€’£(š£8°6N—€+fåáJk°}¨€ãbJ{Qù\bÆê‘NVÝÏÿIŠ|íTËì»Üͨô¼‡‘6š¯h·$±“d›¡ {”þRÌÝ'ø RüöÐöЖү¢žÈT!àÏÈÏîîMåy Yæ†þ–mQÑë#ráfjRàèK.ew' ýÛÜz9dº#ãçÙÞ¹kc¢CÇßè ëÎ1}šÂ„ DÂFAcÕ,Ìc—× E±eœ [ÃFjÎÍ^Ó­SúÈ; «RWËNú,æ®.8€?Bu”“$¿öf¬í¼}â ®øYÆCi&˜ðj2•ÁÞÏ—Ð5=+­F)¬«NEäÙÚI ;²³%ÿ\×᥼^A:2¯ˆÔ¯;¨i¯2 OfNoQÖë¨iWví,S[«×š@ë°Ëðöžý:*C«D_5U7ñï¶Æf'ß»;ЬÝ•‰%íê¤)Øßxç oÉ@©õšøÉ|p/Íß?–„îUû—–ÃêG|‰I] ö™(å—AZ1÷C@ªž;ªZg‘ˆ¥ òÍxƒ>’·åÕ3óüö¦uà†ÇsÝ>Ö3j¼óô·5ÀJÀ ?Ý2—8h¦Ø¶SðK¬jG-dcËûr”<™>Ê=•χÍϨ’Iûñ þRÞ¾“Lá-»áñOÂ>o|ö£@ÏtQL¡Hðã"!*noOAL ªaÓ:œÖ¸½ßÖ;H ™Ns³%/æ‰oäݽ¡˜ÿ}ö7"°È_õBĺü²øp>oá’ó€‡SHòêÔR4¤‚Í~éä:bÉ|Â-¤tI>.Ú.\Q¸••Kp°GœÏÞ_FŽé“³c-hÓðëæ¢•þÓóÈ0‰Ù”ÓxÑ)SÚ{x]{4ßÿKê²1|/›hó z­·\ZÆmYÀ؇¯sºÏþë%ø,\¶~ÌÕi19QËa¯I æ)²ŽÉÜoÕ„8™ÓæýÛW‚[åøfŠ`ï5ìo(²H̃N^޹oCîy†\Þ!XˆË:xRìô3½Aå©ÕåîÌGê¶)Ó €Ò0“úuü»=ƒDº‚ëOlæü)ÎÖÛ“E[•cŠé×{®S§¾¢AO M†),†[TãB—EcI*,ß0‰Ì×bp¥Ña’+öC+H±ðg®ÈZ^æTÙÿjNÃÖ=ï§<‰dtL³–“°ŠOzo"Ý=¨Îo÷5ÕSlÈ[Û¸œˆcŸÀu}F)³/ñ8Î}nm´{ã;-> ë”ù/\Áhh¦¯ˆÌÒ$?Œ$%„Š3mܤÎyõ‚³W%Ÿ[œF]å|¿ý¾ÐµÅ»Ý`áq ì‘›aý¬²½›I$q35(D7=&{í¤eÙ2>È(>qˆ {çàÖwžíÓÃÿS'â 8V®—Ô•ä¡ju!c¿/Š]MÅtߨÇ3j¤.³ê fΔY]í”Ô4žéÓ[­mþÞ‚ûÉf}èÍté¬Wû÷ÃØˆòž7í/^/ÆzÚa ­S6ß#Xj”£V¹àØén¦B‚ÖéÏa­1ŠÔ6GV¯H¤K©dÙ€nXÑDîÀ$òÓ8&ÏÒ¿ô~>Æ›NdO…6mŒ_ú‹Á¬czOÞ "ºN'úû*ºÿ Ø·QMìòUg7»¡·)¶C‹2%sà@Šø¬…#„ËÔfY ]òztÞÒ°mfN«7;/`žøÄ¤ÒËÔZ„%‘²H°}Q€Uœ:ê›ò_¨±EMÈ ½t]2)€"â¨â÷§uù&° EœÓLúnC|¯í `}O)ða ¸ê³aª­þ5S±l'ÑÈ–V†pözPB(ÕA?Ã;”"Iúmñô+²È…R“…¼Ì­+I>Y`¯-þ |ýlb@7¨†ii·pfÐð@ðXñMã´;²ýöä~·÷£}¥¢mÜ©4#§ü0$F¢ÈI €4ËqœËÚí].ý‰ìî;X[¿<‰ë°•QX«Á«¦1Ó(£kÄT¨3‰ ­¹qm´JïÓhÕ¥=FÃ1 ö=#ç°á©þÂL6>ºÑyµEº7neXÕqSÓ¯a6š¶úœäˆ‰¦(¼÷Úíÿm^/•g-—bçpÈxÜhDÚж¿ Âþ"ÓJæ3ÑŠíð`„ñˆÀâ,§ñäUtíù†µY£Y×î‹©æQ"ŠcTÏì«Öï[;ý–£Ìñâ–Óµ'sƒñ [v[YÄטýz-;ƒ>&·FsÁŸFÄz0±NÖ¸õy@£ý‘ãâ/Ë)BkôÇó1&=^$Ø@.Œø¥³áˆö ÓO—U²meøü€Û\\!s££#-y)¥{ËæÄÕÞYäókÁÙ?.üo7c ŸSIÇjEÝI˜ç  ­H“/Ü68å|J–Å*L—j;ðYù' |„!IÙM”}vKºr„›ÖÙõ8>ªó¡OÑu|F>hñۜ˅-ëQ¹ärù&ûL«=±G^‰„gË—é³Ô\«iš) ñ?KØþ‘@LY!´¬è´ žÚSÊ ­¥[#Ê—R«ôü 墬‹çÁŒ6U ÂÌcsµ¾Iw™™U(ź!RŠò±ÈF;&%Ê9ŨÑLѵsÁk„ EΩ5F gL”aüãK¼™-£o`i_?Mo|°ÐV ¬}GdåÖI2¥D55x`B„׃O>$Ñ '¯um @^1^nŸŽ¸3æì›U³jª·dñTŽ 9OIŒ´=ñC}¾#އ¢øu8çu‡ ìßÛø÷4á]éÀ¶2šþ¬%×4|è—“{ÌûTûyÔËWý÷)–ôô* j ëì ¼ˆëÉÀ "ì ‡:…)Ê¡‰£:7ýkõe¤º§[¬ÁÞædtˆØ·ÑɹБ—GðûÅ}~1éûiQd„+X&ÂV׺.h³½ë.§)~·’Í$­Mž#Mû8ÛlXÓ‡œÍ¥i,[†/ ¹/éW7AR´óÑñdDØEë,àdŒ,¥Â½ø‰¶L¿Ã¡+ŠA…;tÂdî²?$Ä5ƨC\zž=ÿ>šp·©xØLÀ÷û7ÆÜ"z »©XрέÂó¹{æñó}Á6[ÀíÞ›4~ü':ì£|ɨý8ý‹; ¼ÇF~Cœ´s£®%÷L›µ&{a©½EàèÊËzŸÈZý Y€) a. tRKÚŠÐ|ò_Î&T]MN6áûWø‘òx2{PîÕTv†^x;š¯ÞpîªØÛuNÐ,,Aѧ¥ñ4²„_ÿR¨ËÙyáqÕ9{©µ¨÷é~hVUCÆF+°ùP“_¥”3Îo쟽ÍmœÎ‚ ׋œAÆ1בƒt‚ª_#S)ƒP&ƒ!}_èù¥ÒC'Šdýœ$©mwÔ­/Ö'|Qx|j(_¨K°ÝP²%w¬7‹ W4rQk¨ûîdqèôŠß!wO›Ú¬PµŒ»’ vG+xÀòióŠbozAwTÆ1á•î‡þ¨Yvà øML2¿{.ÉÅÛ˜Qà|–ìVãf2Ê#ô% ÌûÜ iö‚ðÕþâò,‡Y>Nwã`ž9õ\GŒ)íU§išžÇký`Í:Qü=£öåþÉ|Ç&;4&Œr›Dƒ ã ú~Š»àXÀÛšÿ_qæK?Ú‹0¡`Sšá$jÌ S÷)úL0×5l‹™r {Ÿ„.Ì\&ƒ‰ôä $DÂÍexãè%Vßp‘Ïž¸_ø8ÙNŸmD}šLÔéåSLú+;}òn&¡6j¬£õÊ€þ¤ ¶ ˜çóQ++±\’G·PÊ¡¹'Ò™¦Û¢ÊhñÆ9Fæ)²;W:SE A`;R4;i j›Ð,³Š)žÂS¾Ý X§ÕØŒ±¬šC}NÑË…}÷Ám•9PíÓ'[ªKOhME@=ê…2,?ÓÇØ_ÛTq,9ÏÑÓ¸žú^Ñ4H™—ÈsCÛ÷F ºE šãpmŠá!^Ô Ìn ÍÙ¬Ô`¤ˆßè{˜<ñ­ *xLJL9Ë2Ž_ai/›=·_º˜cLwIPV^ÆŠ 5ïÿuºbHRÌïæ–vüç†Çf‰ëWLL¨|}Öý’??¸Ïáþ×»Ÿô¢P×`$ ªG(+œÃJÌ;µÃ„Ü]¦7o~%´\=¦®©þ*õØx0 İ¡ª%nÎÀÕðÑ ¤­I"ME —Ѥsë¢îVtGëîï§2Kìç±&½ð?? O»±-µ›ÆšÏNð϶5™f(2~o¥Ÿ¥ü¶¦ÂSÆÞ†òø3áG@Yª’Ý:„jU @±É=\‰x]ã´ŠxZhš` ‹Ð¯•åÔ'3F~¹¼«ƒ”Gl=³´º™UË•oM*G\0´¨®uV Lqá{¿¦èõbIÙ ô„ÉwñÙGŒ<«6ó=¦™œhg'æmsìaRÁ¡ g¤NJË¢OuÀ™}ÐzŠäMuQ8®ôGì6C& •ûo$¨"zs^}DÉÚ¦z£5ãµÉ.ƒkªœˆä!Já¢#@ÜŸxª¾tÎO÷h0•ŒUXû¯ÉñJç€ÖáBVSscÍ›‘~Ëo ãƒF7Õ‰nIxhô‹îxs•'ª8iµ—îwi3Ättžžôš{Žƒœ$^ÁgÊnÄ i•mÌ ÎôŒ_Ò’³SÝ?7 bàê oçÕ[¿.÷:u¥ak’¯Ð–Ê›è<J Ü óî‰ï¢"z¬HŽÐÅ'æM' ûØvtr¢3Ž—ˆ‰<ì¬yTs˜¿±Â Ú  Ú=,Uï„ØmÖ¾#mÿ$¥ÛÙÇ­œá¤™…†ø‹ð/ÓË2b¥ÞÂ’’¾4%PÏÂåÍK:cøc†¡ošoÍ;’¦[S6RÂyˆ&ü6Íà ±6îQóIÕ0 ®LÒu»öZŒëv}hn–ä¡ÊÍ›µ„&Šª¬ƒ±mUÇ&Fó³rê:q´õBÂ'ZßœŸ•“iû±"]!ò)½¥õÿ~ ù´ c1Àòö¥E:¹lY!lc¿ñ<;æÓJråÃNaØ)[•ñF]¿Yäû†]„zQÈ¿bìé8&ÄÒ{Wð’ãªìK9Í3¯+Ó=,X-–LøÒ—é†qò/ô»×ÀVdefèÝÚñ ò„™ÊÅ„'ç cñ+¢¤í"Å)²:‰Å2Œßëü‹Ï ònµñóáÈž°žä_é^ŒÉdPG_ÑZë» dT]„Âô%…8¦¹·ƒÁþ~¯ºNê(gI™¶b]îœù¥…Œ%¸Ý 6§Jíë2ç\- 8ëÔ{…^ vƲ¶ ÛŽ´Æ|Á’awéQŠ {— †sàÝœ(Īãü=½Æ^†Ê}aó‚o.Ìy ±”„¼rY€{qgwÝò`+ˆE¦#5Óšq´Ùçß7­¥Ö¿"•…eŒ¢0P튽‘ü¼d’œ þ¸9›Â$àp¶{.†z#²f=‚+åXBPÙÞ÷¢ŠßóÒªæ[‘œT¢½sõêZ¤j­×RŠÛv®'x•<¡r¦ ûþÍ:Ö²â]¿Ú¹6ŠnŽ‚ojè¿G\óÙü+-Â9[¤>GZqú«JM’ÜDþÐBõºÌ³63g—PÓ¿çn˜þ›o‚ÖÇ­e»uø<ÖL1¨æŒ7m˜ùýnà(›BâÃkò6’R%¹;B8C¢R$åCðÏͲOYêL^»áÚÖ¥Ò!¾ªá^‹Z\ÑVmÃézáΤW†2¨Cãÿ~¿R¤€ó}¥âÙñ¯êÙ&±ç®+çä¨îD~OMÑU:‹<Átqx|½øõ”k9 zÅì彃˜„H{]ÈÇ çƒ5BG€ƒô_¾ô‰²×ê+HÛ4¥Ár'Y=üøK_»ò>2Ö:)“y¢Ï`þàêû÷¥üREÝøFÖ—ÜeaÑ/£„Æ”™ï €ðt§­,H•ÙEŽ¥åCC€b1¸Ê·ŠP`¶2÷ºön£ùZmvëÏZ!öß 'w¡SdZÑcTWeæŒVJÝ‹ŽXL¢Yš³Fd÷gëoüÛVim^“€Á¾Xf ?VX±á&WãsW®ï Š=÷ÿpÌm~³Þ–Cæn¹Ê-¨ó\ ]p[)ˆ÷ð]pÂ\,Ž±í™‘?Åáç0JùZÚŠ„¬QÐxêÝÐjoüæÎÏ}¶` )6dûا.düª±iL)‘ 6Òç€AœªœtžòDM‰mOcs”JîÙú"ÆG–fŸkt”/"“ 5ÌÅØ˜}å>M+ Ÿã0рǓ<üƒxÊõä5oûþ÷¿k©3\e¤Î4SOT/ÑG^jòJ„R$Q(FA%wKÙÖqê#l ‡ÎØY¡ea6,à¹ÙŽþÖ üSãñÅYÕzÛÕÙ8ÿdK¸IAÂ(ªïîuÓèy²8ôù´ÃFˆ»T+}M#Ï0%Õ僴 Lü„z¸Ð.ÂUq˜èòBä¤Ö¡â±÷ç(SÛ¢»4Ü $R0hPˆ·’f[ÐG°å£cbÀ: Üù°åçºú¯çª¶‡ïF%³ø‘Be¬)‚ª…r¯þZYâQ„¨»«4Ë& á¯E5OËݯ&Œ}H9…ÛÍ4<ð¬’ê9\1 ¹ò¯œJš•ÝS[û«4Ésû–nˆh1üY×’cÎÕ>=é'÷mÌH+„+ç%¸ÒÌpAI^oôªÓms)¯9àþ>À»·÷öü4>¾)d!êD<>)LA¹Ñjt÷ U„ZõÜ›?$j5¤/óoó¿îø1"½ºsô°¿!½ ²5ÓÂr,¬>¶iZº½Vdœ£s<ÿBãU}‰&àœÿ#xpƒ²kú¦Ão=ŠF“ÙÚå7SÄ<Â6Ü/*鸿ªÌ>¹Ñ¹Ð€aš¤gm}EM6ðA8D sæZ’¼àLø½:ÊuR]‡ÊγûšÓi,åš]z@튄A]£MyÙ£س“€^“] >°¹›çëùĤöSã?Æ}—¦—2 Fª.¸ =D»ÒdÞuωM¾f UýýI•åÆ"b5œÎk³Z~—Hm rvé}×®ù<ë:áäL—Ûl¨ÐX°úþ;¹¶‚às™j‚ùPIºi÷š í0ƨ²5CÖ›ýR["ä™èÇ/ò%7Àèa—Q"k‹=VunI= n…¢VdïqÐYÎPš’>Z`âîh˜2;d–^;¸Ï“f퉃,#Ûß¼[ºØ„:”b?˜'µ5LCxÃÌßNIx ‹…ÊBò´Š`œj´úLõóÿrÛƒ_td}J™Ü½Ôæ9ð´éÔ¥ ÍG¼Ÿ‡òû‹­Ò<‚é± ¹ÎÛ´"2óLp ID_ëWŸ©‚î‘Ó‚c­ˆ5òŸ‡|©3M €‘„ú§7®Tb­*Þ÷xçÙ:*Qpû€aÊÙh JCÐ:z,«)÷ŧõ°—’aŸ/‡”²|ßÐNTN´ ÐÆbËçÅ“57&©›¢|šã^-=û7e]Ó¶*2M ¬uÔâçg€oy¥ƒ}àwÈ(&Ø4èÈô‰Í/³Ù nÍŸ{ÿ^yˆ‹6G.(üÅ4ºþ5¼Uµu†;Âv†[¯ÞwjÌ=Øo‘~%£±ƒ4òÈ;Nm?<•Ùç}?ŠaÊ…ÑаtØÍ,&gò ŒíÌH1œÀ|ƒK•¶Ï{_t$B}Æfžƒ3¡%Õ®×`ÉÆëw²U&ð(~t?—ÑÕâlDBIð­JÝIøí¤Ö½oèŸjÿ+zsÈô<¹ŒþjÉ“Y/ôG´3'Kñ™Œ7F‰Œq9ʤY±± ·˜Úx„G*™ê&ªùþ³Â3±íÞW4œ;gË5;Ùë;÷¡ –GA›GãšÛx~mí…G')ÒVsZdÐ4 ¢;Ú.+#„‘xvPcµ>’¨¶ÑJp?ö¼Cg*²>¶ySÎÆ$½ï¤Ýû›+xÆ]ñw*T}DO`¦) @ÛøÍô¢ÆN?–«SzYíiÞ¦–£4~Ö)„ÿsfYh³ˆ'Kí¼J«L‰ ìÜk„¾ŽËÁ ”F@¤´¯Và—\“œÞ83MëaGHÖn»¶^½²¥Šo­µFSÏ+ÑÚ]n§ Ú)ˆ^ÔtžPõôÃ~ƒSM —çí¿ ml€þ—OH» „ûÃ(¬¿¨ƒËN”ãYª“ÿ5Ü?: .x¯"¿jÀ»Ý)ÿsÑEIí,:×g±ˆ¨OÅÁ({“ûâ;\ãO®lt3§È¡¤*Ê@‰¿Ë ÏÅM¹µå#ƒðÒ’ðØËLomÀymSBã“Ï/6ªÐÐÎ7ÿ#d°Æ–oEö@À¼©leXeÊfæ´ºÿ€3w“ ú)0ià‘‡²Jéînõ{± ¦NZ/8ÄC}YîÍ”ú–à ¤rU¨°>­ÔòÒë=¼ æ±\Ÿ˜dŽÜªb´®æ×¶—©2³#.:íñY†% ØÛsArÅÁ:±oPEž¥h=²GQp?ÂaƒÚ*Å2og¢$š»øê·± O /kp‘‘jç‚z/½–J`%$†ïXÈ'Yß’è gÖß°ï ÏB¨œT.Y&*ýòË 5£|ðÒƒ8+>£å¯î2K_oh™2ÎË—HùrD7£s“§ºÙäÇõ‡ºSS³cd½!à•’Eç¤Ó¸°¤{}/mKµZ‘ч2nmñ¢Îy¹ŠÐ‡Ž 4ÁIáU­ã>gÞЋŲ0½˜6&jb²å ˜V)èŠz_ÛpÇ2¤&ø4P”}\¿9á~Ñ‹‡ÿdLW¥Ø¹ÑèU<sg=N#dHs bm¢9x"ÿv«u+C[MPOÔÈ÷ã‹ÔNBì¸.d£¦çw`ÀæoWŠNºˆç`í78ý‰.8Ȁ؛ÍÁì·eåÇ ^ ¯ò\?Q”®Vé+g‹H&þ .õÈ LR&ðs%.ÁÄŸú`á­9ƒMÀ=<ía*ÿk[Á“,„’q0uj÷èwXñ`®Í€É)~"–[Ü*Ç E§ÚKxmldr yA+²Ày¤]Z_vÔ¦3á¡®¹Þ ýíœGñÏ9- ‹Ù½ŽFêÇÝ2RüñQZP 6ªôéÕžá g%@'ö_í¦vNUXã°³ÿ*y³4çø/]™÷³Z¦RÈy:UgÆ<Š¥TÆ#¨(®²]É…÷ó%>GW:4;wè&Ÿ G’å²²~±˜yët°§×mBu@§8!£çAÖ •w)¸$\vc¼í"(‘|”ÖÝÆá³’UÕAz áIÍVh@Mœ/GÀç#»`ß2¸<—‘·ö'¾[η¬gïO¾ÌðéÜ\B$”TX‘7}P³:žÑÁ’dtT¥A£Î®›.¥*1÷ EBÝz~ã`hD»ÇjL)Ç»C$@|03@,½"ÂOWÈ‹W®ž'U AIMôNÁ·Xžà7x²öÄKmzã=•ìmyÆe½ÙóÅ*-@å¶Aæ¶53`wN!EOÒM'õÃØ¡Bžìn 'ÿsô›«r`àÁ™Ôªù¨î\¶@´Zš1'UÅPí«Ã´qÙdò/S»6ˆ7ígi¼ÑPSè}ì˜ < “,¥}Ú`^G9œì9µêhlE¬jÇ‘k[X° ó•Lצðæ©é5œ—j¿ËM¼Œ´2Œï‘TÙ:BƹëŒ1G¨ù»"/nìðj0fòîI§ÁGÙ’•?›É>þðCk4t ¯Íí¡÷Œ©}Jž¢Çß;°ÅåO¹ƒÌÌÖ¢ ë>Ýt¾˜žZö•i-íI¹”9§"ï;[ASºÛ y0©i”yBu¯5åg·š…Íç¼A!}€uY摸IudžN!”œÜÓ~bw²7þ¹w™‰'aÄÎó/Ý Üè)ÖÏF¶EÑcÀA¹±yü âÞÓ:U¿Ì.ª¸ççòïõçÛ‹(¸—·zÒ¸ÆEþ++…ØX‚éE`-0t‰ Dk¯?±^ÇÍHÄ¡EË$ݦÓÁc‹\ýåîc¢4¶0‹Gã ld">uín¶«ƒø¿-ò¤3½`ùðÒÈÐ&Å×T({FªuW4zÃæHS`ÐÑY†«Ê‰ñ+™q³×¹¯ïï_|7,oópÒ-iþÆL€¤H¦òzž×îþÀR§ÌÇÓô†-ºQê–Òsé¯2Šf\ÅÒ®Ù¿înÕíµÓ ¡Eðr·ž´À¹Æ@ÏŽ´_ÊååÑæ˜Ó{¤Lºà>f>I¶Æhq’Lä×3GlÞ÷:ó úƒÿPOpaÕHÙneäàc]À$“¨'—~•йyZdŠMZÄQnˆí€€âûQï¶î¾Ôá¥øþ ÂξÔïá¥ØŸQöÙsê)þøuqÒÿ%Îg —:ß9YàñNt$æ³/p첄„Ÿ×N Lü@$½¨ø›BmB ºÈy3Ô¢&7SSp@Ð7#éññâ ˆ¿ 3ÈNF/ÿ`³Å t–*{[£+#±X­w\Ý·±ëÁ¡]Ó9P:Y¿w™ ·¾• §¦ä(ÛxÀ}êÔW?< K}‘`‚¤­ðPy”>Ih¡§„añU®2ÒÀ_¬²,¥)aæsÖ·¸hN¯Œ(häã’" ¿äÓ¶úÇëÌGÃK6ñ.0;Š…DvÌé!våÀWq·uójây[3Ä<ª­¢3{¦íÛA&¾­et*µ·ü¯wRÂ@¡ˆä&Þ)¼âP $! ÜÏFìÖ´nS<ÛõšOZM÷qä²®¡?µƒœ êv$ B00 SX#3v£yï£ùË¥fÓ/›Ð±Š ± ûp,¦àÎ.Ø}]q(R2§¶ÇÒÄ@Êó8Ää*Ǧ"€Ûä\Œ˜ ýJx8ñL4 [sB»ë%Ö¥–:ü³×r`Ÿ¢®Çî|3ÕÄ»¦3“í«rLy±ÌgNÄ÷Gl9øÅÃÀÀ'ÈÅìÓ4‰8Á}ç{aõD°iö±<—Ö̰~=´ÀJ5U¨ÚÁMÆo%vŽÄø`k×}i[¯ÄT]5ýÿJ²ŸÉpÔB±7G@B@%ƒÚ>X:ÁÐ/rÁgn¬¨rñïT{TY´I3Á>òæí)`”ëto¹%F)ëoT*~Á³#[©K(¥›@¢Œ‹¨ˆe¬¹ËJˆ±ÌáÞ•Ær:@ökÚòÒ‰?&n€ÂABU“þ˜¦ÝSæÐGÌ^møX‰ dx ¤¯)Ce A³£Qqý7ûìEªÉ@êûnðõþ £‡­&í¶§2uŸ&¶›ú,[ ›Ëw°e ZŽ‡Ã°ìY<2úU>z¸ ð›(Ye–‚£õœ°òE2F×±þë]šå|y[ì÷bµ0>;-€ug1·ý R¤(…Ö¬J)ƶ‚)LÁØ{7RÇC÷9ØýÓÛÌ׌k|žòÃäœáÜGùSæ/l"äw>ç:H°" t~eàþÛŽ RH2§º¢£^¶Ä{5TÕ<8U3‡Ð.õ"ª€¯‘/Ö‘õ®§[rĆå’ܪ‘ˆÊmd|ì…•¡…û:‹þÍdkq“¼š²–ô:™jbÃîø”FfÃÁfLú™T šá†C¦ò>ßÁâ]cçHÖBÓ9ÇTÐã…QE_ªrW‘”üôëKL´h 1d\ÿ TmË3¾Jz<úãWu–‹¢¤ã“Gôº‘ÛŒ- Dí–DçÙe6¬ˆaúê·ž$%Tj`ð\¢§"†¤çúadüi×Nb¸Ž‡…ñêÃfv×äÆ6í6ZÀÊ..Õê½OPÑ#Ç|µ5L\M›ÑÝL {ÉïX4Ÿ:Î(²“ "?Úu÷¯õdŸISs+ihgº26,‰úêÌFiÑ>ÐÎû¿Ù~šµ%‹jC.Œ©ÂæŽï!B"8T¡ƒõÙ_úoOÜÎÀ,§#u„âí›h÷>Æ›0Yéûûë÷þ1‡zUÑrÓ"­¸ö§÷MÔUÿúB¨J=!ïpådw~éÒNÕ=Xy-WÈÿ(2$ K0 42ÓêVtšõ´Ð Ô]–«zo‰ê)0/ìA{^û( Àyvooâ1Ÿoš6~÷ÃÀ*¹8 ÇD*ÊI*­D «ˆR€”èŒn8MPœü¥Q• þàj[+€ŒÆ ÊõÆåÁLðÛ¸í"ýrD{¦ç¬¡Âgž£ØÍè‡X¹YIœmŽ9 Î×!‚0ÑÈ] Ô‚€ÇÄòý·'íïç~ßFKê¡¿nˆ~ßSïÛêµûz ï·K/·Ñþ‰ŸÃ©¯á`ßo\Ûé}ü:ËåûkßÛÞNý¾ƒÕPßU«}^–÷Õê}[[¯ªë¾¯A^û}¿‡Oß¶¡ý½VPëíë_…ú¨¯ÕÛoû{õý´çê©?W¡ÕõzLþݢߪÊý]Ø·Ð?öôúžÿ+¥?Ûè™ûz{Ÿk\ }`ˆ’"…LO}E~ƒ)2ŽÔ8KÉ8ìO."h¢ñ iʱæx‹M¸‡Â€Š%IۘɛÄBôñH1 g3u\å_Fq¿Üá’º¡Ý<ÙFæôgJ)`*8´¯‚ÿz{ú¨`…[kÂýÁ\p&ò¼nÌ.†šµpmXH^ß›{5 ÀŠL?l±¼óCÉÓy£Û4wvíÅ,øÖWRÓ«Vñ§ÆÆµºÃµ‘|š@ ‚^hýÏò\¢`Èþ¶LzA@é¶q,¯A¬]‡¨(Ù—Ä^ëÇ@O;–Úcî\'Á‰¬žÉ„,\" »W(Zß5Z@(Kv`MÚo‡DÊdê¢Tý 5˜ªƒ.ßÕ¦²J·¾bÅø?2¹ŒÏÀØK‹ÑÉྡྷ ìeTi¸wL’ëŒÿ®†ô÷/Š7…ô6vŒ õ‡Š†Ý) _D©aŒql/ŰÛm¡el4:Éß•7gŸê|£F[^)q÷QOÅ&& ·¨ýý4=”ÜbY÷ ;þrüÆs1iI `áSEä<1ó³ùD7s¸fÞÀÙðñ»fà ц͹‘ÎVäMWñBåÂjŠfû(ã‘í)Ö¹v‡aĘéSýÓrYè´¶jhàà }4Gr‘pz3!ô?·¸qLÚ ÊWªsº.x”«äýãG{ˆz$ ¿F”éN \ì –,oë˜}àòŸÃå„¥óËˆÝ ßgúÉŒÛ÷s¨š2c«”@xŠ#Ôl\¼çž 9—×Aßò8QÚ¢Òûê­àq÷œÃýï©É $òã¢v+˜þjô•Ī6Mã8ÆùÍ:Ïnšø…C,ÆKC ˆÛˆ3)TäUC¯'œ/Öj¤Ú öå黑eXŸD'–Á¤0¾G­v<“’¢#ìyñRj‡l0$9 Žú‘1¾–gz ЬHÜHºFÁ5VD {"hïêªÍywõmÃM™ØÖŸ‡Ç›œR„â¶JgâËÊœŒYz¼ñŒ'A±é÷ÎL\ø†àНl#“ÎÏsvMléN¦¦ßÜ÷è;¬æÏU;%ŽÙpV¹ ’ˆŠäqˆy1€\Š÷‚>ßdnÉïHAšCû|‰¹TNç8Ö¶ù%ÉDëŠ8P:rjcª‘˜Ãní¿¦ºˆéHM|Ä3dwº£WüA/ÀR–ÖwÅý€Ò’»ãóX¥‘¦Rò rY@ˆJ!¯Å<ú™u‘ åżé¤b‡©[‚¸8mÇ;(ow"㦘c¸¤hô1a§Põ)ô«t$wVÆ¥ Râ6[{¥ëK­ªeÛ«`D_˺.!µmÓGÖµ…ä Y2t' a¤EñücšÈ­÷BEâšãþ®à0‹ˆGEÃÐÖMß¡AªáÞj”(,ƒë_í^+aXòXvŸQ“Þñ(¥"f?Ú‹îÈàÉžü­rrÍÌ’$£ŽMãI&!d'B¸Ç>ÁÂÑ¥)Š…àÉ'êlÖF8kOW IT¾Ã.oá5œ—‹ZÅé›h¢O{ÊÏq}$/ˆ»ÐzÃù¼\íhø¤†Y›iŠ”&¡r¸„؆ÕLÍó§¢”ªÁûS¡¶ˆÆ]$”šÃSbN)ú—ëé€e7  >X›|³*3Ô:Â.(Á˜z¹#vZß»ãC×ÅüÃÐÆ"Ãs73‡…ÊIä,Ôì‹Ôåð­ë¿Œ1Ó¬ Ô{ǰ—‚9&~Ζ$>±wŠíU´†þ³Ä”Ð<àfú7x&°$ŠävK ´õ}ñž6:œ4ÐøåöNÑ2­µ”7 _·ŽCŸÞ‚·œr07ÆÒ¼ÀÛ°«€f8G¬h}û+8¹=7ÉUsô„íŒÅkJ‹7MLúnzÀ[(ö=+ØR*Ñ AÙy$: Úê47.;#Xñ]Ö¶¼ô°ÍYG0 qžR6SÌY×,{*ÝT¥†ƒÞì¦"ºü u¢:¥—€ùøxœ;`†¢—&]àMªR TßÜIþB™QíÒ;i-Y@- ì-Íî¼ÿDØ7¼…®!\C3)>S|žèû#–ŽJ{aïñžâ¢$Ö8$ðÑ\–FϦÜg =9s>Ìö0öðòÎß^î«'ä‡]¯ý´B»3µnçóŽKúO2Æwªv.”\éâô~úàXdüQ<^*G]Ö:þÔ¢|˜¾ §AUf…sasmöd#DÏ1G6pó© làsÚß'ùmKùìULh€ßÑDF©H:Õ1õä¼jyš]Òð“…¦‘vV ØŽì#Ó%°æê¿‘ª²"x_É–¿acŒ/ðwxf¸g)-¤Ð=¶@=]¾ÿ-þÖÙ]tþÿ¸»vãȰúWŸ —9‚†ZŽ"4ø(¥ÇÌû~7 Yƒ ssZ¶"u³t)}Ô šh ΄&¬\ ¯ÆØaíò#²«5lôÉÙÄTè©…@ïhD£Y@ù`§£ïÜmµú”›"@BÝ·;7w¾ ¹¹„qµ¯Ÿ‘†Q7>uâË;šúÐÀ2Ä 4ƒ„®J¶ÛÃÑ,Á;« 8Ûw¨ôýóoS²Û†yTúè°À¯¬ ösÆ¢_«zUªÅ¯nxnê=;‡´Ï‚€YzaÂ8XÓ+N,é៣J(Õ†#dö³à'û´¢ºuü¨hÖ€¢”«(y-ƒ:YiO<œ»vÇzìõ¯(3†Â–´ã‡"ÃÞó% þpAÈ/ÄÛþΞŸ¡žÇè;é¦d>xIÔzªñ •O\w± jn~Øþä‚ Ù85ϳlYÖ« „ õI÷>‹±±’ŒŸr]~ÊãPE¼7.ÀhÇ4‘2ìwì)KÒ!?“+æT‰Û(×j_ÔdtR Cò?Š‹´,ZZ¼Ë/¸mÀþœÑóáa @ð|„å3x‚*dQÈ ÕÎÀt&lQ»+°±Vü,' f^¥¸š¾Þ,‡HáÃFA_WtôšÉX£ÓÝ)ó«õ6ñ“L5D”Lê¿Oä<° "XÛ”„W¨_PO÷ôÃÉÑ”}4C\f®¼Z| 扭~àí²î_á Uü}¦Se¼&ûñÈøXXO}Ï{÷þ´;K9nÒpxö–=u&¿Å"À/^Ý\¾§i´¨>ÊŽÛæŸ/¥(¿u6Ÿ[ðÇý“þ7&-±rüs&ûºÕéw.È|Ïÿ p„µÓJÜàJPEHOf@|̵R»×çÐ1j/qô½`¸ˆ Ÿ%M?HTÚ¼kw’©±OÐh¨×ÌN7“ Y»ìäÀW_6ÿ#³¨¼]‹F·3–ã ÔÊ]GÿEÀ™øÉs2û­Îu{ÝJ{dB ¨~/Âh¼Åï…`¸:a+ÁÓ€Ð]¼ø%•5ó.–œ¼F æZ†/>˜s“ \c?Á“šAf€O¥RKôgeÍËsþpº´X‹–ýL¥VCO£ÐÍ—íÕ×eÆE‹çÏYíZxÌÊ7jiÿh_¶%LS Þ.‡Fi¾A¥&#¨@(WhØOd>’bS‡·™…–í*švM¼³ áŽTQ:œ«65ï> ‚?]ÑµŠ¨g ÒROéz+ˆ'ݤ 7!c _®ž£\—ûƒM#•ÛnæÁdìVÅRzÔ §È£>þÔ¢ŸTCªHú °å\ÆžQJ?þoÚÌþESq`aæ×BúsÌÂeúm¶øëûaê Q ‡½ ”ãœ=¸‡õ󆩕œÊ¢ïY./£iù°¢&˜ƒ²ûéÌÔÉjd[.žZ¬mìÙØ É ‚VäÚHç ¥(Ë×r|ëƒä]íN7îÆÀ©²‹‘ ?µ;K„~Fº^å-0Ì¥‰ÿœoäO,8ÇHeÜ(¤Qﳜv·—ß»˜í{_^œæ. Tð oåaÆœIôˆ¿e#”ÉšHÂÞ9™héÜ+3*!“äùzq= lû²& †³k*Ža¼wn,˜± de¨5ì<¶‹“iKÎ3llÜkÈuD|Á1™LPç".0y#Ãs¹¬¬Ãz EPKr öqMb€f ×¹xBÕ¤ …Dý†„ýæ:â®! *IüÅ<²à0ágýY¥œ«æðsÇ׫f–76¨9ljF;YX#ѦoP¹o(+Ñ5†g—ò–+ô°¸þ]ìR7ÐôÅí6h°ßº¡M­—›_`ˆ£„ôHÁÐQ[Êð!ýAÊÅ«Œ¬–&`œN£Öj‹¥\ÙÅ]Z¾µæÙ솮@—½¢,†õÓ Ú¢€à&±F¹HË›Ñp†g2 P ê÷Lt’}úë¥T¹`­ë©GÒ'œúÄs'c"søã®—±Þ xèT+"?”„Œ"PñV-£øÄËÇÈf¬Ú±SOf—[“Õ»òlÛ‚Ü.±àñ5[A6Üš{àUÐÍäICì÷Ìæ©} ¸/º iŽÝ¯ÌÖý$ÖæÖÞ²b¥êîô¤UË žhu‘‡_5ñ]9€Km`t¹û›.øN*>"’쯱kœ¤µ¼®ÓaÇO¯$%ƒÄtõ®õmG$0ÖÅ`§þW$º”†^ô…MVIÀÁ iª$ŒR¹Tì“–ÌÙ¹‡Ü\ºÝÖGB"„/0¿hõMìÔ§±uý.·klž{•Š£5”Øeúš¨„´ÚƒNüyQýµÊ:i{a‰U³“gø¿Ó–7[ÂDưΙ×.Î'=GÍÄOY(¤Hs§•mlÀ’¾’>^Ìvº„õ[{à „4/?v'gaˆEmå&ܹ-zC+¨â½ÿFðSŸ®@‚ª@S ¦Yçñyµ±÷ëèÎcr¹ÚŽòK×=]È]”ö*ÒxŽÍ@ž);)ó!qW[u:s«|8õe‘ðXEÌØ­¡Ã>¼kyô›Þ,@Ex14Œ™ø&iT}ÉðjØš¦€^Z‹ö›ƒÓm³†îÈ5²•⻥»&yJ„ÙM†N1dÀcм1|Oƒ•Î\âc‰ÕMÎfÃtÍrù2“^ 7ãÈ^KØÒôö½ ¯Ê]ø¢˜Ètˆ’À{ɹ·1¥¥J)ŠÏ¿™©ÏZÃ!ŒÏÏ4ƒï:)õaºœ‹‹““_·\1T/°zÃoªƒJ·½ …¾šjúóQâ,“ý=d4ÖªBAöæ Õñš™À¬AÂ~R QÄÃH/ÙÔ~©Eè1ÃV²9Ÿ^Vák5Gñ˜"E¨øúÙÙ(a½÷Ó<·Ó£ŽHõ?‹FtU­‰^X(A¯@•Çeˆ.tX©M(¤Ö"×ø\µu=[EO½€ÀP«ÜÃ=Èø"O8 *˜Š¤+dF_ä€Ý/;O2Á¨wr…n‹‚‡ú(c(P´ é€çW÷ÇÄumúÀ„£‘Ç'!ÇŠRÌ/¢Ž“g’=Çå9©\§è H:Ãû½É&áÑN ü•mz\§:’j¯O‘[V2(»Ç"ä,9Ýæ hÖÃ8äýA‰`õ<þa ;S¡ë‰j,Ö!‹à a£'uñ<ê*B} <žkj f ˜òòT{$…– ]¨!Lœ9u;Zžmÿ5)¡±•ë“çàììï’RÚç%H½ «ØÈ¾c;è÷eü=:‰ÌR—¬_Bn«Îtz{,•¬÷W©ô+)§÷Óy´6cé+B‚¼ð¼þU§âð‚Ú è ®`ÞH,~}P…—¯‹w~à 9£P+M$K|-ÑÞyõa¡Z/îŠ8\*Ü0 ÃÎ 0m­_¨)ÊêºóùÞŠ ‹*-=Ø k÷'ϱÙá­?š¸ï—LÆmw–Ñäs8{V‘±Ë §Ö‚@•UÀlõ\¢ñvý²Ê-òIÇÊRD5ÄÊþdµ»þjpˆon¹šâ4ÑO¬&¹Q½;ŽÃ¡ÃK9QêžKß´¬*f´w¹ŸBµì$A6…$'I±’g:ˆd^ÜÆHÃÌå$ Ô†4OÊ”ú•¶J‰ÖúnrŒ½®ª™wS„DÄ;ÝÍ:Ê(+Ÿâ¼òí²ŸtÒ|œhôÿ'íÑ,]ÕÒö?Øjô´Aèáæi9FÚ¤FÞ±RÅ… bÎJ]Ý%;hY‰Y´‹†çdüðÒÚÅÉ|QÁ€œ …Îy'ñÐ,x&ÄÑ(,4%êXžœ$¦á ™çx ÛUVšº²ø“‚ËÀYïÔ£¶é=¥N…úîW ,0 `}|Ë3ñéµT°á¹Û¼°¯¨®œÀ=Â2(=:íÔðUŒB3ça³µP)Ž™vàˆ¢ˆqÚéG‡zC,1ËgN"pèšZwY9¢ÍÇíÙªx<çOE$™% a^!YÙ¨  ™èÏþ`dz°A'@˜ÎkâŒ5ñ#[uÔ^¯ƒðZåø•¼ÔÿîS(Ã?(išO:è³­†9 o‚£bJy .^°˜ŒL‰ OeÑ‚P *seA`Q—g= ¦‡¾Nzd+»wå?aNyê°µ"ˆÍ]ÙÑ2FUhc5_å>íþ“£‡dmEÌö úT÷ƒ„¶yÛç6?¹u€ÃÐw ¡üÀ¢èÒ…Jö¬ê ÷ì`r ®+YÒ- ??/‰»Ÿ‚f#BôZ¢.n:Ϥ³ ßjÅm¿!BmšG¾˜”fKëÏðbL-íì ut¡êŸâ•|š¦Ù†(4ÄMÓE„TêÁ‡Ñ 1h?§<4† Tëw¯i÷›' ß!šU‘»¬#ã‹x®k»Þ8¢Ý9¯A™/óæ ø–Ìp²jqÉë|+ƒ'bQª‰±Ùe—G­ôú¨‡š×<¦aH¡[ä™5 ˆ(L +NLú˜mØËÂl€w¨9@’{CX(ÆÑ=mkSú’©±O>ðSá0B{2«Ùoê@¡O‘‡ìEùÛ}.aUOšÞîuGó+üúpfYpô ·52ÛL€;¡s“¦üyç>åܼ= pMº[¼YEö؉ ¶Qr…‘ÞxlÜåS!µWk-¾DÉjÂU¿xÅÛãMVä“ùMw~%¬iõØMþÏ’’åká=ÜC¡»K/é… Çr‚Jço•Ð;-ãåÏNì¢.Ë i¬:lÓ·e˰øgÌ9ˆ)Àë}ûë[¼Åºú°aöÄ”‡sOû‡Wè>Qó'É%®ÎPè:'Õl¬dP˜ét†|ïvZ“…ÀoáR4S¹9qžAS<™&6&^ß,ƒ]‡!×c~ânM›{ë|ù*ÚªX(ûî` “ÀAa½ömŒÓ²Ÿ"$ô—‹xé¼¹U¤0rŒêQjÇ~nÛz|€zXUÕZÈ……ˆ±ë ·;q°’ÒæÆ(í_ò¥IÓ Ó^?¬"xÉ1)4gÝwÝÉ/2ÜR4Påéök(’?8 ”„³BÌ=ÓhÊÃtlœÛ¯X›ÅsÙÿ[iKéuçÊ8yÁ¸Ó8¸„+VÎ(ËrhÕ¿:ƒÛ%p¸Q‹Oc/v,ÁpX£B—Ã'  ^£‚:àµj¤`„ì}äó ¾PxB…ÜЋNÝY}¯„ ‰RÑ,O3™-—«[’ú¥ŸÖs“ÜêO„&`Í$[™dÙTWàK¬HU“.‰ðÅøƒÇeÁO§j'ØÐŠÑŒSü{ßs¯/¼­ë .ˆ­ó ìwŒXZ„X þEŒ_å¶¿Oìk§®äWziÇBöçŽ`Â<$¡ÖUà¤ÃùF +Šxf°dîãl!¸’L ,Åmo#Šÿ9þ\@+Žóaî®î»Ã£K¨°«MÖÖT¿£Ïš¦< ­q럛‚PžèÈ™^-YèÆ?LßÄ„ÁÍ&ãCGcĘqZŒ7M6!W¬éÅrH¸Ùh¬€æÐ hû­w§35E>ø‘î×áùqùzTªÚõs˵éöG~çYm0ˆê³YŠÈMOÊiÃ>ÿV ôš†Òmr<Œ?=d’%¨të0KÜH¿S¸l®­»R"­ºÝ¥“1»)œï5"ÿ6ʾkìI”-Lä|T¼²™w%çó6’>!x;F(Ê!оÒ1¸Lw56½?ë¶ôµ0¬[“éÝâUUÆ‚ˆ´7+‘÷ú:ÁV®é Ïþ/‘·_Ù·3¶òÈìD Ç5E 5äþt<õ-þ¤N©Ï:Û£#;¤5aÒw%¥°ÌÈ»÷VS%6­«9XL)¥‡Éu †ŸÓÇ$ÜŸúúq«¬ªLH@}åxÙ%»«²óI’çøŠÿCX8Ê ßPó‚H#v‚è‘·?ØêÌpgæ|ë©Us£’ŠÂ¦(uþ;â|¬· S7\ñ¦Ð˜çópL1oJõ|~»tÁ®¨Ò7”ìÉ[ l':Æ „÷–9¡N¼"ÌŽ¨Ð?¶T·œ®€ò6ÿx£Ø­¬BS/™VD=›Áuª`Ñ’ÿ}“u¢xñØá-Ų¢Îœ‚|9‰NþGÕÅÔ0a“ûz´T¸ÉãfÇ95€üIXâ‰ñè0œ”j–.ë{·»H.oq!ž‡¸J%ðìƒlo1ÖîŸSÉuº¦Å½äܶ<Øc°[´ dMXVü·»ªKŸa°~¥@dß%ˆ¸mŒ»$¨ðD‹ðBqÁTaÍÛ j©äÜÿiI“öšù v¬µÊÞ±3%ª×­ øÏàAKme»ß\ÏÇ': KöÌkª~H„KiM–pñO<<›uÄçÆ|‹óÖ¦ôß÷L_mÛ¡ ¦Nàß ÷µt(¥ÅPâÐ |é©”Á" ‡Š‚°rOå᱃ƒ|ý©7¯þ°§x†ù(­ß V–$щùõ>†[ÀìIh¨êâD˜§J{Ô/漸k®sâÖH ECª{1íåÎ2-‘þéί ȵËèsq€Û<~iä&¹€B¥)¬ÓþŠ …éSYœ‰OûÕ¥Ó¥Â<Ž ˆôa³!B‚ÝÓ¡­ÕvcÑÆ‘…À—óT”Ý{Ñ»ñ¼E-&³ª»[ޱ¬Kå1ñr^=w‘ˆN»ìÝHÖ‘„kÔ«!0 Îgt(3 §·ñêYă©Ì9•Ôqë ~cõ,9r²z& {?o‚Á¯-{ /#ù ³ÒD(¸ËßM0ä\`—uÀŠN`jbùÓ×CŒý¿Œ~Ç5`·•ÕB\…n 2¹a¥h²ÞA·¥7·±'$pßP¢OJ.2N[¤WÒ8€»C™Áç I,ómRÇ‹®”š áHË”‰ÕqXw¤6dXÆÇxù[‘(á®á­•pE´À5Á£¸ ÛjµgŠ»Žú]£è-pÅÙØ¿Ж!;·DiO^$÷èë~…Iº~cäîf"f—þàà³ZÝz±u^åƒÖýÑã xN­#½7iJ…ü”—ÕõU–¶³z½J‘ç!W ú«Ê+b½„ZüXï#i‰¨ÒB8 ”6^YoVþð®ÝQL¤õÌ¡Vɉ„¸Ø!¬ÏÜQ2ßç¸/MHÙÅœGb*Tªð|@p£BáýcŒ¸DaÜŠDe%ÁûûF]Éœ,€•>n0i§ØC\-g§Í@ÐöË. ¢G4—"µõ<#ʼd‰ÊÓªL©Þä:û‡U›êœ(ý9-oÍï<Ž-1Pßp–¢îƒÀK£šzø:GÔü ÷ŸJ5ûªÐKÍ\H,Ä‹Ï@!“c®¹¬Z)ëŒDbèX¶I\m9˜7S˜¤§-RЬˆm„„laë KÖ˜¦S¢AôÚ§™Y¦2ç`uôѨ±9ŸABKE²XÞŸµ ˜ï‚¶uÛ zBÖ¶Ê7Œ~35#ðÅPÝß›&·† W)láV_ NØ]Ü©Zzº åo6@V@›ÊÁ,\á.[R¡o€süÐÈïÓøšßoÃ2q¸«/´³•ž @‚…2ý0á=r(žÔœ¨óMæ/)„Äþ¥—–Å“XÝqPdߥ«WÀÕCÂpc­¯›:¢÷ùå»ÌÕQ?ßt#¸yøÞ–¿ñüeõÚmõveÓ#ÏÁ·¿b¶Ñ¬e6ïKõM>†ù¥Ä/~ÁàJGk)¢4ƒFEÜàÞÞ®bᣘøÊh]‘L, IŽ{SʋܸÏi[ÈÆç9àÔê„gÄF{Ãhtz_K-¬âE÷9dã ™®Ìp…DÝã´žDµ+‚‘Ê7¼57u¼æ”.O£ ]y§Ïwæ~ Ic+Øv÷ÎÒÉE¾Ëî(ÿ,S$ø±æ 4«Â·©næÁ ÓÎD|±¬Bè””‰|ä…2%¬£ÜÖdl~îV"m½zÙ& ÂչСŒÙ×XÄE¼«Ä g{`ݶ´â Kl4Z t.̱ 2Ñ7: …°Š?á$^$‰ÃÁby=¡‹À•e ‹¶Næ ë½äŠ[ðˆ’ÀÁLÝy²î²±Š®ÜÊ(¡‡†w]Š€\±rælnél çT”yÄëià½Xß…¦4+6\|KlY³›ÄkÊ9ã>r’Hب¿0_:ÛQÝåD~žY]±VË›k‡t>Aï@ÈX’%·¢«x=vQO€¿¸¾ØkuoZãvü›þ©ŸÛÏÍgIÓÙœ±Õš<¬ @ððL”yŒ¿PW‡4£-W¨Ï=æŽÄßÏ´Ö,=FÛäÒ* .ÿ^N°V³"3ÚBCïcáE¥717œex‡wJnÑNsIéeTn&dü-ÜJA¡ÓIîÕpúÀÓ±x ~—^—[ñÆK‡÷Š*â§bh3”iˆQ!Éð®È…aÌVAr¡®"™ï,—å÷?U°ÈÐØõ¤®±¯ÿ_ù(ò;çÐ 9n–"öN)÷ rï ´RqÇÈÁAGÔŒÔü]‹Gj¨sË héÃÉÆïÎãhuŒÐÚÙ8ÇÏÖ w±îß—â^€©CIP•Cj¦ª/R•‘ûѾp|]Š™±Ÿ ¦‰(Hî‚ê°.#ùýû"5éÏ+‚q²¶7… Ðh0pOQæiü¶;ìîÁÝg@e ˜mˆxÄ,åCõÿŽ*¥xßÿƒšæCpñ‰!Ê€ùöôµÉ “ªœÄ„Ô•¹Žsº‹rA…˜øK¤ÏÀ UãKž\öïá1‡ìƒÁd¯DU œ¡&;ºåçß=d ÷?…aÝ¡Öj ôîû<8¦¹,«ùò‰¿cÈ•âÜâ§;ÐhÅœE2–Ó;}GÜ…Œ9.é󤫸è;^]JG¬Í9“rxhíàqš•7knå}·“f¸žXØèšP’@E~ƒ”ùñu¾|­ ’òòX›+2e „Œ"&š÷D mÖ˜ô/Ÿ¿Bì¤Ã5ÍøÈ¥ø’F¶cä ƃ/¿0#‡›üš…æya0AUÁÇR» %)¶ÆZ¹çSûÞãj¯wU*7Û4Ø(­ÃÆk˜w¡4åU9Z ÊC _?F‚vôˆ,õN¦ÜRÇÏÍ/žKT@KºâÄ«P[—œHŸg̈XP®pqƒùý®ß?ã=S›r eOÏ"ð¡Òñø³0yw9-^$wÊ”èpÃ^HR ÄÏ…tZX™“î‘Ð,RÊ]áXFœÁô‹Œ‡×-pSÄ"ùŽj°]oïC³EâB„Éý:ñÑÞ×=åÄв O`ËÌ®èÕá0›cr‰ÑÇNC)(¦ :Wˆyà%-4ñâˆÐ Éí„ qÉÛì×pÝô2>vGkÍKß/g˰ Ï—Üå¢;>z4;—æ¨;4ƒ¢uNÄ Õ ÈÒÚãH¢+ÇŸêZÏLVÍÊ „X~›ß±©Ñ„¸ÒůÃÊ?-þì!îô=é‹¢9uªçÂfQçùÈYÏLë¬|´É˲ûúëßÌyw׉VØÒÔÜÆÊV,JŽ=T-3”ô|D! ´¬Dã·îUÆ~N ©È†V|¥âxPž 1¸Uoc.V«Rú]#gxq9=þúûMŒ²«ôw!ÑîAhÅ€ß%FtC„Ò#zN?˜ÕßÍà8H®¿»>‡Ñ½Ð…BJ[DK5|!=Íæä÷¢CeùH¼ù‘Ïq,™E²"«h9fót“ “mO1ObκNŒÕ­ 6R6 %èÅVã4üåÎNŒƒF%²‘¯ä{ÕmRiGõ.HÖ¶]£÷Z°ÊÏ¿ÝÞù᜺Rv:$¦ùô§¥Lñ=üå;]¶4Pp{€?´‡¶¹wÁÂ(€ô…œù­z¡óÌ+3¦Õ'Ò„‘£8d‘Â., $¼oYö1CFNö,°é~?ð]«\¢Þ|<ÉŠÎ’ÐÚx±Ù|¦~çZÖc>élL£Û~rå`I–Qí—&_nÅî=]Æ`"¯ó»±«½š,Kb†¿H_— Ž–t­³Dœ,‹‡1‘e6ªÖ€Æ‰¥|?± €jFÌ£ vÔK”K1µŸŽÍÏOÃ꽋xá°>úZ¦#‡¹g›}‰óxOißKÊ«ÇÊûãq-ã箫 ÖOº¢‚Ïì¡dEuk®ÐÊ“ç\D» 8üØr3|"ç×öþí¥‘èÌ9^7àú8e,¼QÀi] ÝÛöt~w-sN£ì;'ŽZõZ¦ƒçnÆY iˆá5ÕöL¤CA\“³ƒèw”*BRq.€8ë<†È(FNö;›£U:P¬s¢¤mšmíVmC'jØ—S&ƒ”^¨Æ²Eâ)wÖÐÁû¼¡óU·³‚)ø8rÏô©ý‡ûS-½‰î¤qž])¶ŸW+bšž§èÄ}êÑy”1ýÜ& u „Ô ™À?e‰ÍµÖåÝÌÇeê̈lt\uÌ'?¯ÔÜý-•!ýâ³ÜeU±D]P·«tÞ˜%¸lÏyþoì%¤Õ Ñ~ÿlË£„2SÄŠ· @Ø4§PÆxyÌÏ‚åÀ>9Ï#øG‡8í oºS߃$‚\Û]Uêüµå,z½pdœ®/±r^[|CŽ]sβ7²ëEPD<ÒzŸb W·Kóï—ª)0)BÞ x§Ø#qҹѾôèã.·wE”8Èp‚ùÁZ×6ò£›ÁZ©émµ]{4Fõ§Ð’ï)Éø©z¿ù…>´jÀç<ž»ƒý¬»»#Ð ûWé7ϸut F…S´7'K™™P ypA°ù‘"‚ñò;½ÅCoðñ?ÄPð+œˆl‰XóJ*%ÆE•ÅÞ^¬"~…ª)'¹r¦«¾Š{oä¾(‡*8•’»èHt@ÅšB³òÝ¡k,aY¹cæ™ìÛ<ïÒ âg×s} / >6[?6©Ý!ÎA–ÿxÌÒâ­íTèЉ´ ØýçÎÅŽùy°•Ñpˆq±’JÊ&#›ë¡œ9¸Xw1‰ W‰­t©#bÕ‰äU§ð :8I'w‡Hn.š¢ïoáð™}.€]ŠxË$W¬Dˆý¤™ÍrÃns{ GÝЬ í\hÌò¼Ñ AÕt8° µÜ\ø±ÏO.Þé) }yS|záxÎ/{ÆAýþx¸ÓKSPb“¬„ósgÍñ[Å¿œ™&ÁÑGº€¨3™Œ¨f‹€ ?JÀ|, Ù›1 ÈÿI3æ>­!•:1÷œâÆ.é£i짰푞ü’å?ù wÄ£,ïWŸ–Á¥jB%騑¾ÔY}öËM‰ü`HîûîC©ôÀç'Mfúœi+ dŒDžñüT#¡×{g¸X±!æŠH‰=Î!¢~/ YÃÞ²? «ÊU<Ög;1º~‹„]ìü+¹1°¢–d ¤6=‡† ëZ(€Øð+× I;‰f熴¹qÄñÕ4ñÓÈe-n>ž§H1PÎð}!æQëu6u¨ÞÊ+Ô·K­\îæ<îxVWfÞáÞ²­aa”Q†æí€Û·8µV¶Q.äÁ=[Ýý‡ÊWçJ­k¼8°„‰dùÙõkLBÆT†S}¡MKª´û¿ëôpº¦~,ú×úÓq`Û/g° L(Ò&K2KCž›u@4±Çì¾…s+|äI¹h+v::žpÚº§Z8|£ŒtW~†"˜Ñ>ÿWy=bûnå_ã6Q=†ë2ÚQIhš0›ÀÏlŒËVSàŽ•«4ä?[á<„À@Dk_óPLw©ÈRrRµç²QÇ*ßć¸7Á’ѪrªÃòE|ožÁö‰¿w›QíƒíÒ)P]ûzX»xÃåŶS5ëõ‡wWöbÆ3½i)¨åwè@ Ýý6/†¢3Œ¿ ïFw$Ê ©©åLb5ËÈ› jÍÔU!Ê2 +ÇÙ…¿3ÐÄNÐÓËÇV^2ü5wcEÓ¢J'þÓ¾Û–.e·‚Ê”Zº¨ùO´éLüZ}ÑÈÅr<•HŠ&.\5EUj .¿„Bs—.¬¾+™ûŸÄu:gGL«ëS‡ë è|Ô×=Û{0LÞI‹u϶ñÀž£À(úÞ~©W^t Á[AË_ÒƒÙ‰;|£á½Zøñ­ì&˜¾øj/ÑG¸ãseé[Á—´#a·¨ËXtVêE˜­@"ÇÔl¿¾úP “0{“€ã̤12´ÃèŸ1Šñ´Ì;%ò æ?ð¦Ó_3î™/ž}ì甞ýÉüFuöåèžödV êÖÁ+Qo ’š–,±L+ŠÉïˆÆyú#©ŸÀæÇYJžÕ.T^‚w|Xøªɼ°@–ï­þ=×òýp2’ÍôºñìŸ4U¸ ‡ÎšÈa¤¶qÿ+œì‚™"_¹¼½‘í­O›ÆB†wcÄ +,&¯hÅ™ì”s:Qò_Zê\ESZ¢¡jd7²âÀžðT¥ñÝéþƒ§^””ä°‘ÞÄçrÙÜžKC}ÎãC#£”KS8È´¿8)‡ªÚ~®HÃ=¢Ñ Æ“ç§GËˤwÖ-Æê‹ÖA'HŠ= +»#í•MÐ._¼QJdš¶;£•Ýué…SÄúoûÀ¥˜’°zUŽFpÎó!Å$OçùÂe‘°™&4=úV@É•¤x0†å|l9_7À^@M!õ¶£äÉ⌣Öç,³É›º,|Ï~u¹S”î†ãè‰ÐuTàþxÝ×:‘4)¦ÇûFªŽŠlŒ¸®¦³ ¼ ‡’º‚ÛSv'/fÍ•5™M4‡‡‹ÈŠTH…f­0¯FF¼¡‚?TëÏe–ÔÚÌÑ®×N.Ó€ó¦o¾pù„4e”Xö{d®âæ1qœˆ{$4¶uœ£j™S°ÃÂþjôj~O#KWõ¦g,~kQnw¥¤ ˜p£Ç Ð-Ö¤ÖÑ…oŠæ ’Vµ0ÉU’¼ð´Øß«=3‰cOãuÙÆä }¶™¦ß/éBòÇÎÓ0PiÛTtÿ@BMM±EêÜG-F†>춤–á(½UR)EÖ“B ÒÚ0O뀞¾­Sé¦Ûÿ)ðF­BA”–èò°ˆ×uVóóÔWŒOa¨Ï«ïRúp]¦ƒÍ…ôÌ )¤ï¯+(q±RÞ "n*¹s ¨ý“ˆÁïçù8ëtÁ w‹Ïl¼VîØ#,å$çócÌUò;­Ü¤(>ç‡Í–^ ôÝn'Þc"MÔ;akBNtù€þX›ÂæfŶÎÍt±àÂÓT}ˆ¼â‹' 3EY|¤¡!0/f°?‘&¾ÄU ¼É£YÞ4.roãvä”r®ÞµdÒÚ%;È ˆÍöáþ!/Uj# `Œn-ôZIÂ×XŽaѳßšZ–Ñ"8ê¯õq¦ôÊȦ7‚Œ.Ri‚œA›ÄDcþÀ”²2:n~7ÎÈHP{ø¾|øNÂÉßæÁyQ°ý‘VèÊ‹òº¨z®>“ۨ„p˜g€Ämy¬…#À–F=~j9›È ¹ÏåçÕºÀåœØPNYb9°ú›ƒ+°{prF,ž§k™Ppà0&³©z‡é—¬— .¨E;6D÷ÔÐ #Уv€Äˆ"î ÆDM¡%q+‰Êrmk7eBßÖË,¥–ð’TG#SSÐâ“}”H{s‰•Û)Œ‘ŸéYJ¦Û·Z}UûÏÍ2Ý,Ýu¨ÆM¬ìF„Ù!d¡³ƒ‚"(‘Ÿ JCøX¬àðâ„— M@p x¿8fø3UäOêl<òß/à·Ä€ýÁ”ÔºøbýD# MMÙª3¥‘jWD±RÒLÀ“O-Œh§}`>mà^ ÒKxÇÚNÏå‹ðV´,ó銋5†²ö ÌÊlßÇÏF3ÌÄ2,1P*6Ϩ?Ê‘‘PJt«©v2Õ}ÿtÄ™«†ÚwpGMTóòÑi"nm L jÝ-vfñVEÍL«×:IlS£p¡?lë5>¢´èúå°VG£×S!Œ<}GÑlü”ÌŽU )‘£a#ó‡&_èQTvÀ³`TÉ Œµ˜ÿsÁ$®_ƒ~rLîÓe€m"@ †rÐ?Dˆ³|é½ÐçAn.Nñk’¤ z].…ìk ܆³êrÄžØP‰vªÔœÇ:>þü¾:gaÄÍ3šæž\//(%Ûjf)AkW'_ˆÍ(1`Z/+°Mˬõ¾Î5½ˆ+ àä‘[msëX3î3×åŸrÝ Í\{ûÑ z‡‡Sxlƒ³ÞÑø!½ù:È BL¡\ùeïv£ ¬biøÎ_ïÃÁÐâ´lM€Q£aÉ)n†Oݪª×r"Ùd­SOt€,ëkñ‘ùqÖB߃^NüšÖlô~XÀMnIp»ÂM‰:¯(„~Ks=°ìÃdFní)wk ËTæ–•ïØÔsm^@ñsV$;1&%!ôж=X6Ë0ç™Á±Û|W*$sY·7߆¼¤ÅîÞ)1W áfÎjwÏHg›¡þ4khÚ±ec-hþNÀOasª‰¡æûWØs~”ªÔ4±d5³«Ê%Ðal¸–y .“ôÅìØ1ë¿â…#Íê“q8¡}Ƶ㛲Ûh—†¹ù1>N½jªÿK/QÛQ×­¢:œ£ùÛMeGÃ0PÓª±õõz” ç§×ðë*´ÔÔ¿}Y¦z0Šè,óm¡$༲™’ó\¶Á±‹ð‡m ý3Î=Vé>;jMÊ×Þðk–Û7GÈ´».Û׃j„ƒ*Æ`òÀ‘…öÛ@eì>ðNعZô¶- ²+ûë/‚xXðž+.Bˉ8'M÷®‡3o¿ ¨¤âžJÝmæ9x\höý"4¤û"è{RÆåþW²Û —çºa-;A÷ÙÈ#ò7iVÉ4ƒGÍåAmp$Á³Ú9š‰ÇHÒ<˜’j½ Z›…¬fœÇ<²&ümà«( /u¬èZæZvaùªœ„ÜšÁ¥›¶ÑºD™ZK}lˆkÜBÝäu/Ø2#IOkæg@YÊ›ÌúÔÇ/¶ÛØä[èhkr'iЩçÅò‚ žÊO#Hémù-¾É“ ¬d®m"7LÃÖš{Œ¤¸´6¿@Òöj‘̲àÄjHéMŸ<ÕsWOä%¥T…ìRªžeU)†\Žü`ÜH~BØ<„{â†Z¨wîUµ¾pôqÜÐíèa§nÓÚ²¸äY¢qV) ¼ZoÏ_„š5v˜½ËÄŸ™­¬!ñ’É<:@¸e›€“í• ¾²y›#ý,ψ;)êQ=5›nABÚ›¥…‚7EEIUr‘[sŒ§/P8¢wÛ*ÁÎ%³ríW«r„®udœw«ÂÊÖ·ÿ4ŽžsUcã/úh£!ÌKLrþŸÅÅÛßšHøåc¸<°fú¼úÑ ¬y<„ºO¢ßÒפý…œ& pþ[ç|ØÐ¹ªÕ¸æP*¼›5 1Õéï| ºÑ—+‡J?¦U‘Þ³f¹@¡8Â\¾ ׌€$éó)žÒ–Ÿlã—,ò­ä¯Œn'ºÙ;2÷[eÅòîÅn€ªäu†+ˆL€sÍŽ©¤ËŸN-hVl,4˜g ³ÅÙQýŠÏi•ÔŽÔñ ¾t¾{›­­©ï˜¯ûÊó2Ýùì›ZožÐ߈sqL _­ÏÄ>tÀæo"k qâðó½ü@íæš¢ik­c†‹9sêÒÿ©ú%Ÿyawr›xQpá8a—De·=%&Mñ”>Ñ/|‹ý¹ñKà®õqÚcùÀjΟÓÛœ<¹Š7T¤°IÆž 2@€£ÐÊ®OƒüM›œÑ Šè`$nŽgÌÔXmðBEòÔ3°–×G0Oµ‹Âð@(`,m¯‹þ‹¹sÁ¨À ´]´ïGY$«+œÈŸ¡Œû+|ÚÕ2e)Ô']ÑþÓ|—–+ÞÇÏàÖ±,î‘F>˜@+yH6¿,N£çÞX­[A;bL7÷Þ€þâ§$Æ’¬Ô¾gsŠOþŽ‹µÆ»)ýïác"ÿY•3ÆÕoZIïeG}¯Œ¤a±Ì nýϬÞ¯ÑçheU,¤”›œÈ\¨©8©¶G·s.{ù“ ÛŠ-/8Â^†š…{ñÜ`yð&Ï~³KPÖ"œ¿zÎ ¼3¶q´F€°ûÚ‘¹ùŽ^[YmkbO¢È3g«¬¿Àuœ¹7˜AäŒÌ’=ô®em§_};SLÅâÄÚ±Î(0÷߂Լ3’îø¤O´º¸¸»›)æ%È ·´ðîCôÄkT?Ù™+¬¹eP£ò®ìwid5Åy‰¿P(Ç•€ÈäH·4 ‹Œàúd0 1ÌAú2Žf}Âe2öhb9˜=Ó+:’#Ùsi½³íñaýÙn¼ž>pðíçªóÅÊ ,¯Æ\”ržöÉN–Íø‰îÆæ'¦7c²â÷wJ;¹&Ä.t#£ä­gP@Y ö^H~§cñZä¹ {;#KµòTx.µö¾uÓê»ç9‹ ’u97[Ÿ‡Ù7jø²3Mþ¦ˆÝß¡¾Ÿ†;.™Y¨{7Z ”O¥mYí*G¨¹Nt(r' fìK ç¦Ï;|•ª ƒÕØ#¹;Ê$4Vð†Hx6"%Oñ¿ÞúR_• +š§ÁþŸ¥Ô<ÂW7V§eg—UŠeˆ€•RðEæ+3_ ü, N[„x‹¸1î§¿’„ ;B«y6êj>KïuH’Üg">uÌŽ_ÓÈ€’“°œø·¬<Ö˜aANC¤i(šžœ¨’H¾Þ6aÈŠgÅó_ÑÛ‚C+ÂP®Îlp¢›9P"o8Õ¶¡Ý!‘uËÍÜ2WÏ”öùñç!¦o"e¬R+ž X͸v1ÖZ¯×¦ēԼ,s͞޶E¬l“Vò3vFrnÀt‚'¢ñßµåԥ̃ZE Äb³–åïPͽöIu= ¿•9缌<Å(›Ø©\©öFV‚ä?¼véš©½ÈýdÝ~õZý)û…:ð©e‰Ï &sæ°Ün%¸«ä"ãBø²ãýCC}º1Ò—-¸¹3KÅdOF‰Eß¿µžüž3¨G_uRQçÍ*"Œ\ÞŒÞl= ñ@üÎi…¦˜ä)ç›AQJ|*^õ´;ê.„“,îo ë½IOZ¥…x£+hQg ö[[EBþ{Ãpyþ?wù‡KÔ‰CÃŽÊPâ†fY§#ÇAå7÷©¦L±ìÂ)²‚@OÇ¿’¹Z^ˆ]cëZJ›¬9/ûó!Dà{v–׬Âÿ-á¶”…ô¬‹F±–k× õnßµ^›âm“ Ò¥KÌBF>Ú,cW2óôF¿Ã)\,€ó|f4`&l+’ƒÕ¢D Ð*& ö4¦©¢)„¯ÁÔÊ€²É¨ªUtÅ0_Ìë`³|-ÊPÃU~‘zW×iØäïˆtúáœgÜîÔ~¸OбÓy¹€„ªfÖ¿?b‹Dk¯G’“âo½ìÇ[}&ä8XVÖ±ÔP)f†Š;XõW$àÚ†/·ÜTö'ÙlÍ£¦à®´+«ÒRŒ¿œ("Ñc¸LÕ}óõCj]¾;¡òE údÙû#´+lꤑf¿¡C¡ÕZï¨ßòKÓ†¹F„hi±_¹£ÉÄ•)hª LkÒU:®'cKeh;Š5äÂáW_"2£ü§°é]­X9.½‹è…ˆ+R{¤hi6Ȥd1ØuâjîëÐLÐñûyV`±+ jVaÃmNÞñ'jã[X  ô‡4%p(Ëz1ÓÖÐNÏŸUÄwر\58ƒ–¥Ȭ'iÍ0RÛ{Ñ~ÊÄÝÊü§îø¦Èªy> Œg~‘YÅZÄÐc6Ír/îv+¥øzéG½wöh ŸÞeÚï'sQ6C%GDKe†´ ´Ñ9³M©l6@KôxÒuôh 뮵§¶bwÊõ:’AÂêÎK} ©'\Ë/˜TcÔW7<’U†ä023ÎûjÞÉuOIúð/Ó0O¯;%oût®ŸÝ"8ò\õHñe¯GW<»€ùK#U›ÕBºåjÍjF $HëÎëyöþІ¸cr€¹¥Ó” ?PEü^/iõ¿8í™8œ±ˆ`Æ*Sê…sö´Ã"—A{Öˆ"û·G‰\ÂGÑ_X[8·JÆ€^P?ºJCù*6c¢2ƒCRÊ B4@²ôCpá¼²ÔHj]ÂOÕ#¼u(uε³OEÉs.`É‘ïŸju‚¤?г˜ç<™Zc—ÖÜ”êà8nÊü‘2ëc¯eî£?xŽ"~6)xÄX/îï›uši#,ròm¾„ìÏÛ±SŸ»FeÈeÒ=ÙŒ£èðm| åLwê?`S1š©~×@M§’1žºïOUÕSÏG”›Gu§l«Ë7û$Îk´$ כܞö^–U÷ýb§P¹çY;À³u†vkpJY•JÔå± €×–ìfVÔì(ÐG¸HÏË"œd²E\òÞ#†qw]ØX´‰íDáLD’Vÿ°j¦B¢·h °÷Tíd$—%i\¬ŠHû‰}÷o0œ®6 cB#Ø¿wSþ;eBÒoäûÍoÅ÷ÃÕmìBh|AgOx±ßòF¯1ñÅ-‹ªÁ Ÿ™ykK²~ÄMÃG†ÄÙLwJÚL ãÿ‡Hì_îróbÀ™”^hõx'™¤K¶?ë/¡Ü7|¸D”bIˆuQÈ^'ü¥i+²ƒ\‚Œ–J£øÉzZ÷Ƌݮ]ÝÕ†³Ké¹m,•º ¢T+oMé¤\ôÉ4®p»ùáÓ׿¶/ï>ºZVÛæÆrÇð¤ùŸÆŽf6Æ¥)±LqÞ–ü¹3<ºmK#÷>9,aRç‚ X ² %Ì{Æ/f¶¨(Þ9ƒ†’u‰ôq—…=Ò+¶-äã¿‘ª]„œ;l‚fO •3·tP€.0îp–Fê|Nð±¡P,úù9þ£Ùñ„ Ut.mMð9ÊøÂ±õpl~ô1´Ò5uqœ½±þ̹9§1‹’G‰6ÏÝè_¬F^ˆK±IîaGÓv™s4 ·Ñ'8¯„‡( ñ?ýHU¿Hù¢= Ë”A}¥lâSë))­ ÓåÊ*+u¶è«[z/!/"XÕÆÖÞ’¢ó±¹ÑB]>ä?òJŸ÷u¦1Óˆ_M”U]2¬›Ä¼îý̰iîP‘id¦éply‚¥xæZÅôtjï9„ <[â¹É»ý¤·Ërš¶Ò–Ô@~…¦•ÒØ‰F‰ãƒãc8·; žläp ¨®0í^8°sšEL[S@õãxzÛw®[Êî?ö¶¶ê6ðåúÄóÞ.ì!³æ ={HñÙà½0(Žã»³ÌÂÀ+@ðË…n܆3pÂ)éê9øîîp 2³ãöÏy ÇÑò0k‘‚ÿ31 ¾…7)}gpOø¦5Œ3õ*ˆQ5ñt㹋ì1¤5O¥m”5¿Á^p&;ve{Ú¾¬ÇIÆþU$œg’mŠshÇ[LSL­aùÈžøKÜÉøDÉê×rkQÜ´ ô!©Œq€o…±»ýŠôøÜx›·0(K„¨8 Ò±„Y-{³“ˆ¬|s1CbÿF„p™¦|z4•¤ÝaÒNöÂÛ±C¸ÞIÎüþÚÆŒßê;¤)î¦×%z0Š@“ÂÂ%$À™7>ÖÆ¿ÊĆ7Hœks”ÅÎ( ¤EQ(0ÈCWù«¥ûÇŽa…€'ø•9&ô˜‹Fvc2$ñcN?û È»ÃËŠ¿³-…ˆJÕVÆV,õ@ƒEtë\#þ‡MõQð©¶8Oj£úG¹‚K&Žx;ù§(ÈP'©NyàþB$šf¶Sr}}K–&ì²þZü)û¦Hâw³Å‹6Îd®—ʲÚã“j¾/ýé‡Ë,lã¼þz¼ÑÀ0”y®²NÙPÊS¦w_c$"­WEàŽ0ŽÊ±æÉûAä“·,öìIŒ&'5·4eWáÇ9‚|E%¡„ ô±÷ ô ª:/‚E=½ÅO";à$eÕ£0åa·ôl5­n¯áÉ$º¢øDtÌ©’¾K ˜¤UŽž¹$Y@qá¨&쩪•ÌWùm‡Eø‰]§ 3é‘3¢Yí:¡#=žÿ xw®Í‡#S·Ñzäˆ(ˆJ–ˤä9ѨC‡î£'ç–Ø_cd5ÒæìÆ«”-BRb!?I¥b©ÎõB”ÈÊb|ˆìÅN[ÙeÙ¼»w7{ÅÔ ykHן€_Ë©6Àvf~eÖµèòˆL^êÿ? ýNǧI³íÔ×›Ð>šþ")tèÙïÔâ[-—>üÈ 3ÍôY&9IxMâhÅÖHŽ6CöJ}¦×`*µwìZ|ô9¼¾ƒª?·9,ˆ Ä÷l*¯ 0ãó,ª¢6?Yâž¿…]’m?`„ Ј!—‘Žÿ~¯*±Ò2í*¹`ÑOÞÜôƒ¼¡õ(w6÷!?4½ÜjDpe36O#¾Ê\´hb3¥.5•OF@ܾB0ØfÉe¿óª“bÌÄÆÓ%Õ8¡Q K#lo2Ö˜3RÓß«p HQý¢EåÇï’²ï"§|…Ð |û¬hèa e¦›¦_4P>ïjÁ9³e¨ä ÿZ_Î8ý €¡ø3%‘ï—\+™9 ÂóÖK—b¤ÑÇRêj«ßf%nn #Ä·ËÜÑúâ âWÜSd m‡9_æ§G`ˆs[¶bÌæ™@š”õŸ¦_'Ì™ù†õ2LõY.ø)jATF(ª0o>Ew“@ãÇEÊæB³ÊÇý¼w6˜Þ‚ašzÅ}ãþ7>¸ƒÉâÓƒ9ì Âð¹»!{¿ßz:ïµ—­ÒCœpuCî{èÚÏ/o™tþëôö´å&?‡¤áÁ·aÂŒÁ|9]=—•.Ôñ‰lyÏ.ñ6‘ˆ]¼ÍxÕP æZL«Ëºg„O™. :Œ•mv w4©*÷|E«vvXpÆOL£¸R0ÃtùIœJ*ÓŽàÞI]”MOñ¯›°mQ®Cü.cHÕÍÐm}M¤ßð8aRsfüÅó‰¿ÆÝ7òxÐ7¡+ÅJs r5¯kG«$Ú ¯ŸqgÓÕ`þbÊj”4ÁúR®Ҟgy²Bû~ ŸP ÀÐë‹!Ë=¯¡^ób„‰ø3'¦úð:ïžP˜SuN¦¬3ÏÎø÷ˆè¢Wk'Eå¥á—Qþqle ®”;_¡Md“û8;«ÔÄ‘_Ï€ª¼ð*5~‚w ¯YåÅÆH™fåšt€ñ³i Z_%Ž4^…_s-Ö¸ÁÍCÈðd2lÞ;n¡,·®-_”}ªNTtÌN­ ‹_¿”ýw>‘.‹¥o§½Bâ?7ËfÆÅ …#Z'J᎞i„lilF2’¨Øã°{„O¡'Bm´[‡ãÞýÍJµl•ûNƒ3 f `Cã.cåÚ‡K6q:Q½°†M¦ýf À?D¿Þ-Ó€·HäŽÚ )6¢†pŠ8{ÿ‹ ÿKDý#¤:ܨ·¹Š€“wÙâA”ßgºÍp/<>æJÖšÞoIª%Wí-Ák˜ÅPWÒ×kq0ê\̼Ê/DiÀ¿ë¯ôá9çkŒXà[w&pM*ø}»òÍÜé,´˜Ûf$ã”×}vI¢¸î]*0ŠÒ-;3/ÕÃ:W¸Y¡õ\¦ì²#EÂêãâªEä{ÖÅ.ŠptHéÊV=¿%Q\ÄhëèDæ¹dÛs|³†æf(ÍXÒÍó‘O*çbJÁ÷Sr…¬ép’`‘f¼B:ÞÞvÙñc¤ƒŽÀ™ÉÙ&¦Úþ&ù$»Ú”1sf%F H Å(Áy°óËgFíN;%æ¨]Þ‹âq…¥¡Í5#ë]è›Ì“ üŸIcƒÒ鮽…•Ò„|JjIq¹±Ú²ˆM‚¦ëWýêñ²DhkY$H©豈Y)ñªÄ,iA1=(<×þ÷Žû‹u÷œ¨¿yɤJìð?z@9‡ÐÁoxa¡ ÈPõ%zn ²ÊVaO¾c”‡¦Âc#2`&F{M!£×WÝöV])\¬ïÇ d"I\4%»MfxD èc¹£_üóøÉd>E” øCD@ !× "ÔWÉK~²`áêÛ×oÑy‹&¹ÒïêWG±xßqÃ8Œ²‰ÂÀÁ ÃrZ¹‚#¬”.æ”8…,[F4lím*QõšðŠ×&[ç1º ™áÈ(µ8T›^¢è»$LaN|ËP —ˆT’G[îƒ:ÏÒù;žǧ‚p°ð5™Î!T‹ÞPH)\Œ(‚œÛ…¸¡k"Û#Špr|º ‹ç¿ì¥þ—™”D`ÊdéÔêÐz~¡Õ©hFÀšÂÝÐ._ÏÍWE”6#ßÜQ¶ÂGŒ½Ã.[rG}"â*¬g%j‘ÇFθÓ‰ÇnŸ°°ñÝVÊòß.¶Y‡õAÐ’øÂ$¼wž/⸑=ú…„ßð:ÃiË´v¿Á>âLÄ'D‰/Èílð¨ËÚNýV´/zBƒnI$’FÇÓ#Ïg¶¼Þº,Ö#rŠýšÜ¨ n8¡¬ïmj§7æ^sí `ÿ`õ°3÷¬R»êÌ­§ˆÀâò‘û/»’%ûÝ šÃÕÞíÎ]^äH¤?®¹YœŸ‘)>ýõ*ÈH²OüA\é$Œ÷> T?!ùº-F}5ç$G~PæTZd¤\-Fw”.ä å³üÛŠ+[”5¹Äÿ m‰’Ãé}búÕPw’þ= ž’í÷įʻá^^Êá)*Í´Å)M£TÆJÔ†!Æ_DÃÑšímÐøÿq02^#ÒÛ)¹gcœTÕosŽkšJ¤KÈ”Iâ-]fžDâþ0gòÑþ*—;¾ô”˜,v³ò*ìlª¾:ð¨+MU…ËÀdáÐÏì°¸ü¿Væ“>3Ò†‡óJl©ËlhJ†\–A1†ß\ÁªÿI§O>O­4O»#«Ðȶî~¥—΂««\ìKcËŽU—Ï›»”૪DɼÑN¬®ïÊ´ ¼ll_ý1žu …[üdy“HSÎ%º,ì¥eMßÅó‘;zT–\û§’ŒÏÝF ªO È ³‰cè*U²ç³[ÝñÁ¥ñ'9l()Ïc-´ÏšÄ(Ù'-áÜv‹ý¼èùÖâÁá€tC´n±’×û#„¤ë`<¸àœ“G›j€}õÍ‹;gÿeaÃôòyð›v·Kn®!5ôÅ`ôEXµû=3/¨Û;S²òÕÞâ^°ºBÃFfå{ñÁK^L-MYú濫9ƒÅ!ƒêe†®~ÞB¿¼oRâ`å¶•ä­¿…š7iá‘ßð{}¿QõvRQ€æS9pØCrœaè-ÓFào“QK9<‡Íÿ è`â{ݽ7*¶´+‹û 2‰–q…̈v !yAG|‰Åüj¢‹uÌÊ™2±‰„7¯#y@ä¬ên…®µ7»vÛ¹›^.EìÍ” úÿln‚m‰›´º 耓Rˆ |ù&|~ûFgtŸ&õ¯Ûã~‹ïí˜-)ëÂJ0·‘þz;yû>$ÔÏ`¶ XúÊ‘ÑÜG„¹TÅ<Àw}jè-UlÇR¶N]mt€èwâàp3„ ÊŽ²¿Å µ9þ|sÿ);6‚úÕ¹°Îõ¨ŠÉá<ë:2>=,l*SP£k‹…N±l¨ƒ¥ÉT¼0ÒÈðÉÇJºM@»35Åj™þó‰–‰øXÏ,ÇÑAl²±Û8ÿ;›®ª1ójÿ(zÄ/·ž²˜M!Çäõ䨕@á“Ñ΋":çë˜g?¢V¾ÛeLú×k÷ê!ŸÑ=vecÇ)‰xLÄ7J†ýw±±†æ}Dóé’.lIvUï)5T-â â—Ý ®A=.´«7pÜ^Ë‚ w`»íOñ=M¸Íó‚ÿH?¨HÏe^©‡ÊŠô†ˆ)ñ Ñ eMн¼ø-ÁÐúû¹ÀÌOr/0‘Hµr<=&úöôË÷*ð:ûí;icº w£'ð³R+R¬e'ûvÅYÿ,~Vêâ6õXiÁm„-ì÷@Fåõ¤JM!Û‹ ;¼Cn»ñDó¼f2,€/…X+•R:‚•pôn¬¿!bá¯?›à£éYB‹8³^m_ ûB]¨Aý¥-s+¥gÂ9µÃâ _ÚïÒ¬ T·:ø®¬NfÝxüÄþciͬ›wÃsȾüNû°"÷cïN–¬O]Hÿ3ž"’Sq[æ;£ª7Eñ³D×½¨¢!=ÆP UÄs©§Ô»ï™uƒIBn±¶ÇL·o0æÓضæõH@=†™„E –i3§0· ¥¿ãŒM覕R½èÉ@n%ïG¤{ÀÑoî&ét×ÿIê©C.ÉöÆÔž½ûwb)ZÓäñMȤfZ1߇Dõrq„‘¤Íb6‰“Tߌ,¡R†‘ªèØqë2vSWyS¨À¥'(……¥P'bŸý“)$ˆ(¼Ø¹ÅîüœªZÚú¨½¥ÊƒŽgI %Ø=_ZZŽ™°’­‡ö¸7 ¹±Þ¿5*ƒûàà” h±MšqëÎ?ÓYŸÅ"ϵ=JIQW}ÆÔ䱚X³d‹|CÉÅ”{õ7 ƒdë[ÊŠÐ p›¸£YKÉÇå½.}Ò¢òÑì;aÿ%… ’o“Q,8©XŽ+ˆ¿Ü2×Àåæª¹ÐRö„±:¿v÷“DÂQ#íÍa®,%ê—®:éÑ&ÜWŸ…°ßûD,Œ£ ?“g~â ü°•vüõØ{àfðmŠ€=(½º¥LpJù³ðÀ]߯¡™ ¯ëïô …±^2uh­ÅÃïƒfÈâÑèÃÞOn#kÈO*¬¡V>ñNo9{µ…Ïtr-‚ %Ÿ'W~QÜuÞ€œ …z¼˜Ì¨¡(ÜGy?¥Ÿ tÓ \‰q}nã‹^¢ÍN¤ýñUyQŒ7Ï»ù§©ùHÀÎfý$Y0 ¾Jí _×{ •)“¹£¿L·0Qˆ“™fÓàÖjˆƒiž2þĸ«•ë¿–Ú£j¶î²_±Ñ]h‡úz:µ¹‹u fƒ¥Þ)­D“#Ù¼ãuJ;™½ˆÝ­%fþá/ÃBi‰ÈMí6zéë ¸†„Ó •MÓ|Ò"c [ÏÃSJ’^¸7g‰M1"À…Är¸–Õ×È5½q/WçV6I™LÛ^Ž c©æú ük•öµ·{Î0S{œÖ| ìÞ°8¦Ï$°#½f½wz=gµž&B¬d­”àaËÐñƒíá¢ÚK5àó-ð Ýj¼}¥«lóbN³³g±ñÔù´jO©³¿©ƒc¥Òp䥑ªËé"}¡Óu ÷U©&4Âmâq‚¹>½‚p£½ÄL’Gõn«§]±dC²&{6Æ4+C– ¤Ô>Å5›Fu†"-Q`G @§è«°î±Á„#6ƒ|&›ÔrÆXÏ'> 9ÒrÐDÚÙLÊVº7=Œ’;ÁâùÏÈžˆëD>jr¦X©\}V‘%·(,úx~hì˜òª,U~Esª ¥^>ÆÈ2;êŽuÇ hµm[;]‚¯¬‰Õ’K0,²ÃRC1wx׿?IÖmE 0ÖrjÚ¯MÜñ V¯@|ðiìþrC$ÿºï“Ú8¿äS(ïêÕÇÔ»WÌíâž÷Ô CNoÑ5ʘÍ0÷rËñ2Ǽ„‹&Yæk4„ 3„÷}ì0fçïÒ`èÉ]*ÇQ ±!~—Ü‹Óï-:ÌŸÄÔ'« bûðþ|9ÜVÒd€‡BÒ2ʵa7˜ZÑý;Šk’¿·$~d7‹¯ˆh‘\§¤_ß’Å)_ÜMõ¹ºÐ«1G~}m+Tî’M×Õ OÔwk¨`ÅùOkê}`”ð&ËÖì…"ƒé¡^Ûç!R+Î,±ªÁVêôî1–r‹>E G†P¤EÊ/¡3ér›$©"Oþ;üGËbÙŰCôÃ:´Ÿ¤hUè¥1ò‿ä|¸{êöÚ§KSB nŒyG™€¥%5{‰Üz‘¹ÉëOÕ*¬ÝÜtÍÊ׳²}/õ†¤–Ô>‰‹gº© ‚rÛjkVðÈGÿC™ñ]£æém‡ðLmí Ò‘D¹ªÝ,…4Çãb¾ÖðN¶ ÕÇëÂÕô ôŒ5…õ4!h÷¡¬·clÖR¶µ:Hsými8²sZSßHù†pšç • 0•}rþnì°#Q§èü~¸¬{Äÿ-3H—<Ê mp­º€j/-¾qÀ÷͹=¡fŸeÇbš¦æ/ê.áS-rU 4 lÚyIJy¤ÔÊGŠÖÉÓLú8Î{„£¾îøÅ!Ë©¢f­…}Ð…f!m¶¿? §oAÊ’ƒå×0'‹Èk §³l"µþà• \Ì”ÆõØÝ¥}Æe®í-±÷Û–#m=…ÙIjûèØú†Ó·\xô“Š£·mÈ„ú%™ á§„Çë'ÀBßûÝœðD!èo;17sú©4`‚Æ}ÂxöE¨à–›®ùú¸ràj·ÕH/åe‚ CÌ{°3ÜIÊ\¡s9ù!”‡=ü¥iø“kJ€µ+¿\›Àæm2d˜«æ£´Ýec|~û7ÛYÏý©òv³"ÙC5þ°JÞ&Woxýîÿ׃¥IHÞ¤ª´Ã£ós¬ëº0˜ÙJJ T(Ç Cn{ÁUô=x~U©DãrtŠœÆü¡„90qcÞº$ ¸„¨c+UòÚ7ÜhžIû¶Bªñ5m5ýÛ·ÌŠŒ®Ý™ÑnjóH¿’PMçÝû78?EØ{Pjœ™¶'ÖØ*Úò^ÜXõ÷ÿ Zß©N¾vV„ýå™ó4ªÃ^ÕÖv@,[(àùµô(}´Z^¥RI¤ŽØNàßÇcxª=ÀJCê¿×·”µÁ~˜ºw®` Vµ5÷7YÿY×Gžý³íóEe»dî×@—‚6" ¶ç¦‘ÉVd¼”D|:¬ðdÛ¾Å^¢‰¡óxµOuy»LuÐýœÕÇå¥7 tϘ<Éó)Zbä¡£¤äU"/È“Bóòÿ*Ð?ù7Ç]$to¥³xJc|v_Ê]ÌQhÇÔÑnQŒÅNH"ÇÁKÄs`MÏÛ(ŸÒõˆ¤Sõ¾i¼7óÌßR•“ªe‰n›µ cåÄ_zƒÑÒoI!¼5u î4Ùð åŠæ]ö÷§sO4º»ÔNé§»]àMÂôk&ËWr´ÆûÌ Û¸^m­ÜšÂãï.Ì]h1ê;*ݰ¾ÿ$®™ÅÁìïÜÒh8Òàkúâ± )CKÜA³’u`"x9GGÚßfÊGу³ô0Ä!v0še­þúW×}{O !0tü>ÿ"ª‡-`¢ÝEuv#“D¢$ϳr™`“^÷¼þàæ}e©íȤúñ-5ÿU¢ºZÍZE‰Àiº½Ç%ÀçüXˆXЦmµ³ç|Z–µQ Üi§WÑ$(Äës¿%1Ê6#;ÔÇ 8µÆö‰åÑÿGØ©]íÜ").ÚD½Ü§\ßJ¨ÿ#örnmƒKï5E丱HÎãmjÏ9_3-—žo,¼¯ :¦ûØž†ˆ»v&ŽæÍáC23ç;Y`øñƒÂ+¿d¾h§ù3VåèÄç5¹cÐTNRøµ/ƒõŸ»¢`ºï‚áM ‡~B<0Nj9jŠ¢ûÏ(#­=ºR³Óýê7JžñwBŠ.(çT‚òbS+/ÎyçäB€FòœÏBÄmßä.ÎKA‘©öK[]! è´áÕ® R©Øš¨5y@´h(F»™½ ïÛy¤‚–Ýv§_ƒÓãœM9#>º#YØÈú˜Ð(–3Žr𶮢;¤qåE-AQ;YzýæQnNŒ×7>8ƒŒEÕ”Äw zdì–Ͻ‡µ·ÍéR»Þ±bÃ|9ö$Ä4äòÓšr‚~IÄ ”›¥øcÞÐ?§ç¥­ãáû~qüŠÅQqjS “¸BÙöõ_ÆP. vIŸ§L­µÚTR 5±¾È)¥g&ÏÏøÝñe`40­éûåm´@)sè3~ç¹ÞF r—ÉQ/™ 7äèóJ®Kï"0(m=eý÷@&ú ¢²Þv7Rœm©ò°¥!„w‹=á1^jžt‹˜¿r=—œc};ç<1mð# ñ0ëêù•š}Œ>+ëLB‹æ½Fµ:Â+ ¹3h?ꡟü tªØ~Z4Xß«©¨)Oõ‹÷Ö¬$# PfrŒÙÁ¥Ó3'ÈcOuÿGj(:Ï ¥x›":¹¤á³ƒcõpe eÕ ê¾‹>>’–DxÇt xï _«cU,Üt›5Öù?j¼{ØäÉ„!– Õ Üœ92©è ˆœ~”D ¯R‹Àîyñ<˜çÈ›¶ÃAΪÅÊ·7“í])˜ äÃa…ó)¤¤¼×–ý&o¼MyŽ~oÎöj®‰ÍwW qsŒƒ¡Ì  )!ê5¸±nÊÞ&±|úÍ‘£¦—š›Ü´ú$Û¼*ÚZ(ßÑ$ÔÔ•æµjÙM[W˜8—•QÏ9t‡áåkö–"}ñ²ãDB›|F‹4ŠQU>]¿0ŽÞq§î›~',J£õ `‘ä-!/ðg‚§á‘ÖOü+QêCmÒ"Û6rïh@²s]€“Ú™Ri\Ah3 ±á <£Æ—V„+©ýSD…µ„LL’öA&´mIŸ„¨Ws CóÈ‘nÚíž,É&s13]Æçqp$-ÈÍÌ49yfÆø&šìÐM•ƒ‰u Uã3*æ8UxZ™ßþÍòî’ñk†ô1„Ÿz. ÷6)W‘z7ÛùþÎåOím¢b0„¿þ8ô>ï`Ü…’&Ó,³_?%å^²ø½¢˜Ça¶ï8ØÞ·ü°Õ$Î*aSýìDà³(@ ¶Eú>×2¼äž(à a&”Ú=RæÂmD¯q&\™2 w% ¿¤œÜ`Ã0ôM›AIOœräì̤zwÚ~çÃèÚàr®\˜¨¡Ð„ìd]þ²?Ôp:nÂúsF#bþ+BCzáΖM%Ì@w]§“Ødtjö—íÞ¾ãzÌ•Z¬®ü@:y+øp,rfº´ •!ÄÒ»ûTñåÔÓyŸÒ)QUcTŸíõ‹×m›ƒè`d²™"È›°˜ü™š–‰ÇúÅÐì縭 #1q_®Ód·ExÐô šŒJ‹]8ƒP[wƒY3C1ÞRòjŽš" TN}îÎc‹èþHÔkÁ+™“cÇWêRΣ /ó‰µãQuƒxgÈ7vÅSÚ«c=²%<)©öáBAy6ÒMDáHÆ Ê—զĊò»X(I=í}HáúúR@ꢻŽïƒóªu¨è_1->ßȉ¨ÌÛ„RW¼Á¨Á¡(Ž–ŽS ­tvñÆqðZãÔŠÆuð‰àPÉ(p*=J  ówcÖDˆŠ¹‡ñiwˆõâm»ô0(‚ ÊòkID"QD#°h1€d´\8OÉJE.­dÈú)ÆdÍMð¡þô&>ŸUŸréE[²´\,³kyŽ7„!`§€÷€âÃBž³ƒ©dº&‡¬ì ‰‡Ñó£³!¿…W86óÞH#‘±M`«Ýœ¶îºÈOÁïÅKY”ëîï6ë‰Ä^´zÒä¿ÆmÀB‹~﹓«^hn…ŸV’ÐpBøhñVnŸÌ«Œg0ʆa¡XëÁPl—é²4©Â>¬)JÑf¾­ío±<à7¬‡x ÉþŸVxŃ]üÆr |d(:R‚SÌE>ñITv¯|E?“„ÜS’ä_—U‡„v+*0pKÊ½Ñø „i“Ø‘²Oé'\t"º?‡ȹQ'ó#ÄÞLÇIN²Ú@K°U§ACt¯Pï—¤Æçv¡æ¸GYneL³®<“)š‰R•6$‰Äáñ“ô,zèà¼8pÀÈþ¾Ô°ÞoÎ qP¶gtŸ-BB¾ ƒUˆTpOf¡ôc×ÂÜõåó¿wôro´é7›m4ß]¼Tª«˜=ØÆ¼./4CÇ­Švࢶ@p [CËo3@ÐŽãĬbôò­ñ<éºom•U{Mp®á”§¹>ô†Ò¾ópfEêÁíÀ'ÂÜí?¢G?ÁXhËþ-¾x4 ÔA»`2iVƒÓù–צ©·Žd¸7» eÇdâÀÎG÷4±œ¡ Ù0±nÓ:éZPˆw.èõwÂWQ¶²BÙ=9äº3Õ׬Ò~¿ƒÀº sr‹+BW­ ·FÚF‰™«~ËÔ퇷Ì\²äóW±¥ø8ȇt £§}7VÎwÐÙPŒÁ}¨p÷ÊGñ¯ÇLTv¶ñšøTúZ°0Ìé)SÅLí°0Š’#F Í3ªxçxî›yóyçâ°€îûl39cqôK²®r ^N‹pÊHœ çÍÛf ±Lù¹…{_k »v0ñtÂâEEQsj€ÍBÀ(Ît:Üð%áÔ£% nïÍÅÑxð£%sì(P1šÊ™w’XýŽU8¿Y ø0jc¡³Óˆc Öz6 ST:™ØÕЂF•èqÇQï" {ÀçÇÀùj9Û©À,ð«E^Ÿj×÷`i'Û^2@2ˆÝ®lRxuGŒÀÅí\B«.Umv¤Ä—YAH€È2ˆŒþÁº†RGF¡—ZÙ'™üý(Å#•U}Ðzh3« hÁ“TaÉ5Øâésúi퇀Š}ëýÏ;)pŽ9$°šç°¿•´. ŽË$gš×’:²CÅ‘ž|=ºÕDÀØ~ì n¹as¢» “4Ý1ÏhF–«¥ã©9‘¶8ÎÕ¼K­DÜKæJ8¦˜›ëÜ1Žíc†‰þÑ¥ ÈüÁ ß Ç]ƒ .¸¬\i´!’`C¡¸uÑ»*r[8>Ó15“¾/%мẊ"à=g2üUh© FðDRC·ÿML°Bß> Ïd5jÇ3“á?S!þ£Äæe‹•0 O÷LÀÊŠ¤ÑIô¸ó7A7fG©Ë~Ɖ:õ1W-¯Òðlc½°VóŠb‘Š“5ϲDÐÐ|Fˆ¡¶•¬ŸßL¡½F>Äd†…‚h9Š$FþÅËžoúÂkªTSɦ–Éé˜ôˆvY®¼O MÐþó\Ž k3e‚þ,çÀõ=ü\-´ B?s€-=S<óè D°[{xƒ¢¿Ï ÀC—æWü¯YØ ”0î÷H8¨á‚Öúú÷<§âK‘eÖœ“scúª x¶þúˆµÄ@Z?¥_ã(u^LËõdçÐ\}Ê ¸§0 *:þ"[0l%¢®D™fU÷Mj5ò0n¹Ì¤M­¯*3ð)C`èÑ>¹ìR®6aÁ/¹“C(*é CS©1ZÑþ³@šgXPäO‘cÒ“±éÏ–‹šà䶆ïà¡Û¼1Á'x1ËÓ Š²7áß6Š2îaWÛ@¢¸eºÈìVÒ­x€€ñý¬+»ê³ï©ºú†ÛPoÔ4¿¶ËýN/Ú§ûnþ?µOö‘ÿ[zßS˜¾¤Ùk½ú¿QWí¤¿máÂ~wÑÖ{ê²ÿ5Ä_RT¿µÒ~zrú’?mnŸ]Î_ýÍø>@Î~gâáî &RMu ­â×¥QÎB;=ËíaMµU*N¦¬‡©S^¼—i‹É‹%­7/ÌÃXfê¸C¢`UTÅÜ¥y/DÜ‹¼ï,”$¿=©f?Þ,±(E¿5s4¿Ô-ù¡e!ÀèÖ#>±$›#ÊiÈæefÏF0`iàÛÞ••✠Òùô02ÇÌXic ¿ž/Ü6ÉËž•¸F“ß ‡ºSZ¹srO9Îu!U.£ºWU·ž&ûÉÁ´ô3ô1?•wù"±0pF~oÃvbñ‘É0r¯ˆFÞ¢å7Cæ¼ÇߨÁã`£Þ¼dýV¦v(7<>ÀB¤;_Á1A¢ðeþº{z^'ZM^hJÂ>êaX¬P–ßmç¬e5—Rõ¬ðƒ¼ôŸK›–yÌMBÀ¦Eå’ˆÞÃ$©»ó31Ø_ Ø! ]•h5&’P9†¬r-%^b—½-öæÝ&=ôίüiÆ5B½Yì—G¯Š:);𠍼i¦Ä¡ç4[Fƒ¬;½CŠÌóãɆø€·7Ͳ››¢’©±OÿÉgÂBJN JÙÅÝaÓ5~‘¬{yæù\zéý( ð€ŠÄç¾ ݧjp`·0*]¾ÿek.¸T1)+§{4Æ?~$(Ô)¸ÕzÇU %’“à¢À‚zŠR‰…¥‰³¤jÍ»M~Àù-.‘0–„ÒNž÷ëé–’©±OòãÔ3Ë€°ñ7 $!Q%λS“„ƒ³bÇj‰hx¾œ…kÉØ þ Òm*ë™ô؃•B6¤Pìé¶HBëž/éŒB:ÎFG_çšñ›æS” T³¯ˆIÀÏBuóã½Æúªõu¯Žš±öÎÃ<‹´n÷“µGÆò¡Ý9àO§8ÐpÍcf‹˜á§P>ħç^£ßj{‹˜’$?¬ŒVæÆX.½M‰C°Ñƒd¦Ì{ïýŽ»ƒ|z‹ÞÛká˜ÑâåJ£½æJ®ÿO*$+Ä`–‡‡'°;ç7¢ÈX€› øz”"«¹²þÄ1­hW¬svB­õË9€~šË  ÕÀR($ªh²Qñ¿I«‰jrªa†…¬ÒøÙÄ:GæŸ]UK–ÝÀ1+ƒV‡7Ì>Óž q rŸUóºTÙ­ARÑ!ÏèéAºüc aKªgþ=Ò Û§_É\ºSbÙ‘­$ îbCæ\à€Ú”Fl3•¸L”ŠÅé2¼ÇEÍ(!µ*ÙÝ[_œt‰Ó©¥¹ö¢™<5_Ïcá–éj¶áÚ¿u“^vTà–‡^ìãŬ˜‚¢”*BRcâB  :"Ì[å”UñÙ2)iò=šˆQjá,Il4м0°* qªÏ¹…R)ç*¢–ªìBt}Âò¥Ñª–"ȆW0Sz£•¾Ó$xÕ Ñ~÷ø£ßÀ $%úh˜”/$˜Œ ¦Z~µ”ƵðÖKÔëàMÅlmËw¢Ò/ýP#[ ÷® |/h¢˜lNIØ$ÚÉÎD‹¸¾L_)‡áÈqŽh­=ÖiÔ| áÚXq»ÍºL£è±܆‡¤z{²uA±h©yDp¶áÛGþ}G±Ùó|Èp2{€8GÎyXI<îs‚¬~}LR†‰Ñ«+>Vã|›\Z xÓ˜KcBy±åDÙqzw½š¡fd„Ätô›Ýy§þaØm€Ü3–¤jñ{É\Ô$Å Â+fR|VØóŸsæß<¯‡Þ™Ær‹ø£}E’ÜrÍ›¹):ŸµØíÔgeõ¨Y,š‚ÀÎáó'šï]è¹Êèñƒcg®êÏŒ´<éè{+óþ)‡rÜ‚÷Ú~£Höñ¦\ìVõP¯}ø„ànó÷$ÏY ]AÕ«iY¹³O½²Á·+ý¨ý-õ5õT€ñXÇËwÒ`áÇ›€ueÖ:Ë)dA•6ÔòB×z ù:lmžWÈvohÕýŸš ^iaµíŠ!°{„ƒÑ 3LÞ“Íã=¡¸5ŽÙçê¾eÖfêŒ`Êý¦¡> K²fˆGQë Ëþ–ÍLðÖø”v.%æ øe;ÆC€ðáÞ´,oX<ÀTë«3Vºš3 þ|ãëñHzLãɇ!|·›×Û-øsä¤Y5–à(a8â éä4Fõò{Žû|`øEù+ÉèŒä—Myö‚V,7°WñŒhvÓp¥Ciyyx!Sx×Î/ÄÒvŸä ;ÃYo…Ÿ§§pÁ©ƒ.•K]goËLÇ´˜¯{ Ž—D¹hlLñbT¶·Ñ8ØaÅ+^²¡ÝoéÇè4uD/öÓ¡žWÆ|¾ÙŽ#âÛœÃEÜ%¯¢úA˜I]»!TJµ  ´YÌx[1Ñ÷ÏF!ÅŽxs@û„‚±ä¸¶Ñ„ÊW ”·‘³²ê,&ÓM¥©*‰uå¨ÍöD)Gò£ÆÅÏe2E÷º«›q¿Ÿ+õMª<‡€´ÂËÇÍÏsøþ`,o)F¸¥Z¯÷Ø3ØZRv›at±„th§á#çH'ÛÑ£üˆÒºlÖ\*Qt–=zw`}Ùñ+WGÕ@‘ÿÿ¿ ¬ÿýÿÿýÿµ@ÿÿÀ*93l€—•~m7,Hÿÿ¼G*;#",9C@!tÿÿ¹)-? B@B;);.sÿÿÃ'/ .7=5 .c&iÿÿË!80+$;4.xÿÿÊ#4$/$24(:2:,iÿÿ¿/%>2,0;8!79.>ÿÿ¹>%@A529K41@ÿÿÀ64"&+/#;@@ÿÿÈ =LD@D@KI#Yÿÿ×Va]c`_``__cX†ÿÿÀ„AÿÿÀ}p  aiÿÿ¿Æ…ÉÇ‹9½‹9ÿÿ¿Gåÿþþÿé‡>ÿÿ¿ ¬ÿýÿÿýÿµ@ÿÿÀ*93l€—•~m7,Hÿÿ¼G*;#",9C@!tÿÿ¹)-? B@B;);.sÿÿÃ'/ .7=5 .c&iÿÿË!80+$;4.xÿÿÊ#4$/$24(:2:,iÿÿ¿/%>2,0;8!79.>ÿÿ¹>%@A529K41@ÿÿÀ64"&+/#;@@ÿÿÈ =LD@D@KI#Yÿÿ×Va]c`_``__cX†ÿÿÀ„AÿÿÀ}p  aiÿÿ¿Æ…ÉÇ‹9½‹9ÿÿ¿Gåÿþþÿé‡>ÿÿ¿ ¬ÿýÿÿýÿµ@ÿÿÀ*93l€—•~m7,Hÿÿ¼G*;#",9C@!tÿÿ¹)-? B@B;);.sÿÿÃ'/ .7=5 .c&iÿÿË!80+$;4.xÿÿÊ#4$/$24(:2:,iÿÿ¿/%>2,0;8!79.>ÿÿ¹>%@A529K41@ÿÿÀ64"&+/#;@@ÿÿÈ =LD@D@KI#Yÿs8mkh‚cèºD77:Õ’bÿøâõøÔ¿ýåÃÿýýýþÿùI1÷ÿþÿÿÿÿü2Åü¸ÊÐÕµÿ…¬ÿQA£vi[™ÿ5Aÿ}pý¾åÿÿ’”ü5ÿ‡ÿ?æ³ÂÝžö’ï#ÿ{»ê£ÿ)-ü¶¹ózÿK0ýñòí÷òøPçöP<|H u‚):ÚÿÌ‹ˆŸ×Ro½åëÕªEil32 ì€ÿ€€€Š€€ƒÿ—ƒÿ Š ƒÿ " € 1ƒÿ€¶¯>‚€f ƒÿ€'ÿÙ›b,GPE* 9ŽÿWƒÿ_ÿòwU›ÉäíãÇ™T ˆçÿ›ƒÿmcò„ÿñ¡qÉÆƒÿ‚¯ÿÿùùúûúùøÿÿ©N*ƒÿŸÿõùþ‚ÿþúóÿ¨ƒÿ€!€ÿýúù€øùùü€ÿ:ƒÿ S'x­ë†ÿì¸Cƒÿh\TUn”Ÿ ¡©©Œkg;r ƒÿWbfB"€^,Q_ƒÿ/y oN?ODGJDeUkQsy#ƒÿ}]V [^6!;‡b#Œ CZ2dƒÿ2j"v iU0>F gs qƒÿd*i-ZWHg;Kk6^a#_ƒÿo r+w-|l\2[.Zƒÿf,Wl'o!Xs eiƒÿ#TAP m otk xqƒÿ MAO_l‚€f ƒÿ€'ÿÙ›b,GPE* 9ŽÿWƒÿ_ÿòwU›ÉäíãÇ™T ˆçÿ›ƒÿmcò„ÿñ¡qÉÆƒÿ‚¯ÿÿùùúûúùøÿÿ©N*ƒÿŸÿõùþ‚ÿþúóÿ¨ƒÿ€!€ÿýúù€øùùü€ÿ:ƒÿ S'x­ë†ÿì¸Cƒÿh\TUn”Ÿ ¡©©Œkg;r ƒÿWbfB"€^,Q_ƒÿ/y oN?ODGJDeUkQsy#ƒÿ}]V [^6!;‡b#Œ CZ2dƒÿ2j"v iU0>F gs qƒÿd*i-ZWHg;Kk6^a#_ƒÿo r+w-|l\2[.Zƒÿf,Wl'o!Xs eiƒÿ#TAP m otk xqƒÿ MAO_l‚€f ƒÿ€'ÿÙ›b,GPE* 9ŽÿWƒÿ_ÿòwU›ÉäíãÇ™T ˆçÿ›ƒÿmcò„ÿñ¡qÉÆƒÿ‚¯ÿÿùùúûúùøÿÿ©N*ƒÿŸÿõùþ‚ÿþúóÿ¨ƒÿ€!€ÿýúù€øùùü€ÿ:ƒÿ S'x­ë†ÿì¸Cƒÿh\TUn”Ÿ ¡©©Œkg;r ƒÿWbfB"€^,Q_ƒÿ/y oN?ODGJDeUkQsy#ƒÿ}]V [^6!;‡b#Œ CZ2dƒÿ2j"v iU0>F gs qƒÿd*i-ZWHg;Kk6^a#_ƒÿo r+w-|l\2[.Zƒÿf,Wl'o!Xs eiƒÿ#TAP m otk xqƒÿ MAO_líþÿÑW#IX[rzjiO+¤ÿýûI×ÿüÍ3 Nz„XWpi³ÿþÖÿøë0 XÀÿÿÿÿ½ÿÿñ ìüÿWëüÿx eîÿÿ»ÉÿÿúùŸÿý¤^ÿþãHöÿïn!0ÌûúÿM`ÿÿ̤ýÿÜÿÿvwÿþíSÿÿÓÑÿÿQhÿþÒgÿÿ³lÿþ· æÿÿ5¶ýÿ‡ •ÿÿn ¶ÿÿzìÿÿ5Òÿÿsäÿö/<÷üô$ßÿÿRÃýÿ« žÿÿÓ.Îûÿ‘½þÿž~ÿøóqU¡ÿÿúädoÉÿÿÑ~ÿûï,"ãÿþýïÿÿòÿÿþÿÿÿÔ4&öøÿÄKÏÿÿÿè–XÓÿÿÿç§7‹ÿõÿ¹Ee}sO)ayyO ¶ÿøÿÞH $H^¡ÿÿÿÿîħœ› ¬Ìõø8jÁÿÿÿÿÿÿÿÿÿÿÿÿ…$j£Éçøÿÿøç̪}90OaiiaP4it32P=ÿÿÿÿÿÿ÷ÿýþýÿýêýýžÚŸø$3³¿Ã\°¿fÿˆ­X+½  ØÿÅ'«”ÄÁ mÿþñj§¼ÿO¿  Øÿûÿº)£VèÿÆÂ]ÿûüÿõƒ‡€Ž ¡ÿûÿV¡œ½ÿüüýÿãt‚„† ZäÿùÿÁ¥› 4ùÿþþüÿÿñÕ™6€€ #%6¼ÿþüþÿC  ›&~ÿûÿÿýüÿÿýÿ”&cÆàðõöòéÓ³ƒF &P®úÿüýüÿ ¡]™›¼ÿüÿÿþûÿø™.tÅ÷Šÿæ¦P xÊøÿÿþüÿþÿç¡4ÿ†›âÿýþüÿÌ9-žòÿþÿüûüý‚þýüûýÿþÿÛx>ëÿ€ü€ÿüÿZ¢ïÿq›8óÿüÿ‰!ŸùÿþüüþŠÿþüýþÿêy¢ÿüýÿÿûÿ˜£ÖÿþT› IùõTiîÿýüþÿýûþÿÚKiúÿþûÿĤ²ÿýñ0› KF©ÿýüþ”ÿýûÿÿ HóþÿÙ¥ ƒÿøÿÒ›Êÿûþ˜ÿ ýûÿ¼Aúß#¦ QÿýûÿŸ›Õÿû›ÿ þúÿÎM-§ #÷ÿþüÿb™ ÇÿûžÿúÿÇ «Ïÿýþÿí#˜šÿû ÿúÿ¢ª —ÿûÿüÿ´—Gÿý¢ÿüÿX© Vÿüÿÿüÿe–¿ÿü¢ÿýÿÕ¨ òÿþÿþÿç”8ÿþ¤ÿüÿV© Áÿüÿÿüÿ¡”„ÿû¤ÿüÿ§©{ÿû€ÿþÿE‘¿ÿùþ¢ÿþúÿâ ¨ 4ÿÿþÿÿýÿÉ ¬ÿþÿüüþœÿ þüûþþÿÊ ¨Òÿý€ÿüÿlŽ ¯GDªóÿþÿüûýþ”ÿþýûü€ÿùºU ¨Šÿû€ÿþÿäŒ $ÜÚ#kºôÿýûüüý€þ„ÿ€þýüüûýÿ øÆy*@Ÿ ‡‚”:ÿþÿüÿˆ‹ %ð¯€[šÎô…ÿþ‚ýþ…ÿøÖ¤j*ᾃ†‘Óÿý€ÿþÿó&‰Cü€ ItšºÒæòú„ÿ ûóéÖ¿ {P&€ 昀%@QWTF/€†ÿûÿüÿœˆ%óˆ€Bᣠ‚,:BFGFC<. “j€+÷n O Ù÷‚ÿüå´iŽ2ÿÿþ€ÿþÿû2†ð‘€—ÿ„Œ bù¨€Qü7|ßÿþÿÿþý ÿÿþÿñ ,Çÿýÿüÿ©…ΰ€ØÞ-…€…ÞÇ €—¯eæÿþýûýþ‚ÿ þþüüþÿø“oÿüƒÿþ9„ž×€;øª…„„ÖÆ³ÿýüýŠÿþüýÿÝ<Œòÿþÿüÿ®ƒT÷+€Jÿ|…Eeg[/ „Û©+ÜÿûýŽÿþûÿú_Œªÿü‚ÿþÿ;êq€Eÿv„ ‚ÖìáÔÎÚèæ•/êêè€éæñ›óq3éÿû’ÿüýÿk‹Nÿý‚ÿüÿ­ È€ó|„*¦ôÊo, TÂùsÒ7FDDE<ævKô''æÿü”ÿþüÿ_ŠØÿý„ÿ 9<û5€ư„‚û¹4€NùÓhé/ª¹Ðÿü–ÿýÿù>Šÿû‚ÿ üÿ©¾¨€zç„ #ÕçE€€(íðdÜ$øD¡ÿû˜ÿýÿ݉&õÿþÿþÿû1=÷'$óJ„ Kþ¥€Xª±›“MXÿüšÿûÿŠªÿü‚ÿ üÿŸ±­€´¯„oÿm€ èN Úÿý›ÿýÿ@‰Iÿý‚ÿþÿ÷*ñ<?ô&ƒeÿN2¤ÛãäÈI€Aísÿûœÿüÿº‰Ïÿý‚ÿüÿ–}Õ€½¢ƒLþS ¤ý²T/7‡ÿz€ŒÁ Üÿýÿþÿ?‰mÿü‚ÿþÿò&§9ö&‚)ùp"ãÐ,:úK‚Ðw[ÿüÿþþŒÿüÿ¤‰éÿþ‚ÿûÿ‰7(ƒw‚Ôퟂ҃ ï+´ÿüŒÿýÿþþ‹ÿþÿî‰ÿû‚ÿþÿ炃×צï3€g؃ñÿþ‹ÿþüëøÿþ‹ÿüÿ[‰,ùÿþ‚ÿüÿvƒ7÷9ŸÑƒÍk€³šWÿü‹ÿûÿRúþþŠÿüÿ¢Š«ÿü‚ÿýÿÛ {7¿Fø,„¶‘ éL”ÿûŠÿûÿ­kÿüŠÿýÿ؉Cÿþƒÿ úÿi2ÀÿŸ€CñÐ……§¢CîÀÿü‰ÿ üÿÏ ˜/“ÿû‰ÿþÿ÷"ŠÂÿü€ÿ!üýüÿ€ùÿþö(º Lì… ©Ÿ» ßÿýˆÿ ýÿé(ŠÿÇ ¶ÿû‰ÿþÿAŠ(XÿüþûýÿÿÒ^ læÿýüûÿï7±¡† ·ŠÒqðÿþ‡ÿþÿúGgÿùÿ¨ÔÿýˆÿüÿXŠÔÿüÿþÈW\×ÿþüþÿþÿêbÚ çD† Õ`#í)&ýÿþ‡ÿþÿkCùÿþûÿƒ.íÿþ‡ÿûÿn‹'lÿô¯D_Òÿþüýÿþüûúÿ‚£ž6ê… ë+jÖ‚.‰ÿüÿ«-êÿýÿÿüÿhdÿü‡ÿûÿw" ]/kÕÿÿüýÿþûþÿÿþô²ÎhYш jÚ¸‘‚.‰ÿûÿ <øþþÿÿûÿ|Wÿü‡ÿûÿw‹&#„ãÿþüýÿþüÿÿûÉCàFĭ ÈŠ èH‚(þÿþ†ÿþÿÿSYÿýÿûÿšÞÿý‡ÿûÿp‡ H¨ôÿÿüý€ÿþÿåŒ0‚ð7gË…;ô"Eì‚òÿþ‡ÿþÿï2~ÿøÿ¾Áÿýˆÿüÿ[Š*|Õÿÿþüþ€ÿþÿùtï8TØ„ Ü’»‚ âÿýˆÿ üÿØ ÿØŸÿû‰ÿýÿE†  0wÄøÿÿýû€þ€ÿýÿÌ7ÊÜI0ëƒiíØlÅÿü‰ÿ üÿ» ·?zÿû‰ÿþÿú&‡·ÿþÿÿûýÿþûþÿþÿÿþÿý4!î&€ÍoçZ/ûX+ìÆJžÿûŠÿ ûÿ–Sÿýþ‰ÿýÿÞ …wÿøüþÿþüþÿñéÿþÿÿüÿÖg€«€ŒÌ6ôŠ€FëÈÓaÿü‹ÿüÿs9ðÿþŠÿüÿ«†åÿþÿýýÿò–$Úÿýÿþÿõ&™¹€Tæè€nÿ$ó5aõ»#÷ÿþŒÿøÕíÿþ‹ÿüÿe‡$…ÿûüÿü¡"lÿüÿÿûÿŒ>ò êS€ <úž! _ÑñOƒ—òq:Oƒáîi¿ÿüŒÿýÿþþ‹ÿþÿó!‡!ñÿÿÔ?âÿþÿþÿéÔ{€—É.ÆêÛçᇂoÔÝÛ½igÿüŒÿþýþŒÿüÿ°‰$—ÿ“ €ÿûÿÿüÿyaæ ñS#?+ € æÿþÿýÿM‰3kïÿþÿýÿÝÑ€yæ  x€ƒÿûœÿýÿÈ‹ƒ“ÿûÿÿüÿg<ù=€Æ¿‚€ €ûó?‚€ !gåÿþ›ÿüÿPŒ…+øÿþÿýÿЄëÜÀ !¹ö-vö*Võ®kÿûšÿûÿ°˜¤ÿüÿÿýÿV¹ÈÊíR… {ö¾ˆþZ… LÍõm¶ÿû˜ÿýÿë"˜8ÿ=üÿÂÌÆ tðÖ{4 !U¥íáUcõÎg"H“Þî”âÿü–ÿþüÿSš;µÿüÿÿþÿE Åæ"yËçéÙÔäéÛ¤K†×êÝÒÓÛéà³e€:ôÿý”ÿþûÿy›IÿýÿÿýÿÖ<¡ý`€ ?GFG&‚ 'GnsH1 €‚J÷ÿü’ÿýûÿˆŸÅÿüÿÿþþÿ_aû¿+„„„…Cìÿûþÿüýÿ|[ÿü€ÿüÿé¬ú±<„ eAŠ(Îÿýüþ‹ÿüüÿïVŸDÿýÿûÿZ,ªóØ{$ƒ‚S¯åý  …÷ÿþüüþ„ÿ þýûþÿÿ³# jÿûÿúÿluÌíÔ i4‡ ,_”Éèá§G!ðD‹ 'œóÿþÿþü€ûüý€ÿý½G¡ Gÿûÿÿþûÿù1€#g¥ÓçãÏͪ§¨¨§«ÎÏå娱y:¡¹Œq½ï„ÿ÷Ï‹5¢ÎÿûýþÿöZ‚5Sp†Ž”’ކpT8.ô,€ @av{yiJ%¥2äÿÿî¢).ƒŒ »¢‡¨PHbÿ„ƒƒ@é‘€«€9Ïøš$“ &øƒÊ€MÅõ¹S ƒkÄô¼JÒ 4£éç¦Uƒ†j¾óÝ+Ø S§ÿ{4pD&ƒ%Bg›²¿×,Ø"ÎaƒÿÝêâÝÓÈÅÅÈÓÞâêåÖ¥çmXÙÜç5·‡+0O``aa_`S1) oÐã[Ý 4å×P‰ ç>ŽÁÝ [Ôæ&… ®¥+õ0Ü ‰´=ÞŠ GéKÜ®…tˉ 4áTk8eDÙƒ‡ -Lr–»×ðûÿµÙ wÿдnK*†nÿü‚ÿüÿÝ Ø¬ÿüÿùãÐtƒAÿüûûüýþþÿý+××ÿûüûûýÿûÿƒéÿþ‚ÿüÿY‡€º€ˆ"øÿþÿþüÿA„»ÿü‚ÿûÿ‹ƒ‚¶€„Nÿü‚ÿþÿë„ÿû‚ÿüÿ¼€€ARL!´ „ÿû‚ÿüÿ¾…Gÿý‚ÿþÿå€ 7‚Åñÿþÿõ ² 9§ÞéÚ¶}< €¶ÿü‚ÿûÿƒ…ïÿþ„ÿ 3;…Òý€ÿþ€ýÿÛ!°uþÿþÿþÚŽ@ € ßÿý‚ÿýÿI†Ãÿü‚ÿüÿ˜L‘Ùþÿÿþûüþ€ÿþùÿ½±bÿüûýþýüûþÿÿþÝ—I;ÿÿþÿþÿð†‰ÿûƒÿþÿÞé€ÿþûý†ÿûÿT­äÿý„ÿýûþ€ÿé°‰çÿþ‚ÿüÿƇNÿý„ÿýÿÿýûý‰ÿüÿ¸­oÿûˆÿýûýˆÿûÿ‡óÿþ„ÿýþŒÿþÿó¬Ãÿü‹ÿþüûþ„ÿüÿRŠËÿý–ÿüÿP«óÿþ•ÿþÿõ ˆ•ÿû–ÿûÿv«Bÿþ–ÿýÿΈYÿü–ÿûÿ‹«\ÿü–ÿûÿ™‰&ùÿþ•ÿûÿˆ«bÿû–ÿüÿ]‰Óÿû•ýùÿl«Nÿü•ÿþÿû(Š ÿû”ÿþÿù)«!õÿü”ýûÿÕŠXåÕ”Ø×Újšÿý”ÿûÿ£–  ›’*9”76;É“D9–76>ED˜EDýÿýýÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿ÷ÿýþýÿýêýýžÚŸø$3³¿Ã\°¿fÿˆ­X+½  ØÿÅ'«”ÄÁ mÿþñj§¼ÿO¿  Øÿûÿº)£VèÿÆÂ]ÿûüÿõƒ‡€Ž ¡ÿûÿV¡œ½ÿüüýÿãt‚„† ZäÿùÿÁ¥› 4ùÿþþüÿÿñÕ™6€€ #%6¼ÿþüþÿC  ›&~ÿûÿÿýüÿÿýÿ”&cÆàðõöòéÓ³ƒF &P®úÿüýüÿ ¡]™›¼ÿüÿÿþûÿø™.tÅ÷Šÿæ¦P xÊøÿÿþüÿþÿç¡4ÿ†›âÿýþüÿÌ9-žòÿþÿüûüý‚þýüûýÿþÿÛx>ëÿ€ü€ÿüÿZ¢ïÿq›8óÿüÿ‰!ŸùÿþüüþŠÿþüýþÿêy¢ÿüýÿÿûÿ˜£ÖÿþT› IùõTiîÿýüþÿýûþÿÚKiúÿþûÿĤ²ÿýñ0› KF©ÿýüþ”ÿýûÿÿ HóþÿÙ¥ ƒÿøÿÒ›Êÿûþ˜ÿ ýûÿ¼Aúß#¦ QÿýûÿŸ›Õÿû›ÿ þúÿÎM-§ #÷ÿþüÿb™ ÇÿûžÿúÿÇ «Ïÿýþÿí#˜šÿû ÿúÿ¢ª —ÿûÿüÿ´—Gÿý¢ÿüÿX© Vÿüÿÿüÿe–¿ÿü¢ÿýÿÕ¨ òÿþÿþÿç”8ÿþ¤ÿüÿV© Áÿüÿÿüÿ¡”„ÿû¤ÿüÿ§©{ÿû€ÿþÿE‘¿ÿùþ¢ÿþúÿâ ¨ 4ÿÿþÿÿýÿÉ ¬ÿþÿüüþœÿ þüûþþÿÊ ¨Òÿý€ÿüÿlŽ ¯GDªóÿþÿüûýþ”ÿþýûü€ÿùºU ¨Šÿû€ÿþÿäŒ $ÜÚ#kºôÿýûüüý€þ„ÿ€þýüüûýÿ øÆy*@Ÿ ‡‚”:ÿþÿüÿˆ‹ %ð¯€[šÎô…ÿþ‚ýþ…ÿøÖ¤j*ᾃ†‘Óÿý€ÿþÿó&‰Cü€ ItšºÒæòú„ÿ ûóéÖ¿ {P&€ 昀%@QWTF/€†ÿûÿüÿœˆ%óˆ€Bᣠ‚,:BFGFC<. “j€+÷n O Ù÷‚ÿüå´iŽ2ÿÿþ€ÿþÿû2†ð‘€—ÿ„Œ bù¨€Qü7|ßÿþÿÿþý ÿÿþÿñ ,Çÿýÿüÿ©…ΰ€ØÞ-…€…ÞÇ €—¯eæÿþýûýþ‚ÿ þþüüþÿø“oÿüƒÿþ9„ž×€;øª…„„ÖÆ³ÿýüýŠÿþüýÿÝ<Œòÿþÿüÿ®ƒT÷+€Jÿ|…Eeg[/ „Û©+ÜÿûýŽÿþûÿú_Œªÿü‚ÿþÿ;êq€Eÿv„ ‚ÖìáÔÎÚèæ•/êêè€éæñ›óq3éÿû’ÿüýÿk‹Nÿý‚ÿüÿ­ È€ó|„*¦ôÊo, TÂùsÒ7FDDE<ævKô''æÿü”ÿþüÿ_ŠØÿý„ÿ 9<û5€ư„‚û¹4€NùÓhé/ª¹Ðÿü–ÿýÿù>Šÿû‚ÿ üÿ©¾¨€zç„ #ÕçE€€(íðdÜ$øD¡ÿû˜ÿýÿ݉&õÿþÿþÿû1=÷'$óJ„ Kþ¥€Xª±›“MXÿüšÿûÿŠªÿü‚ÿ üÿŸ±­€´¯„oÿm€ èN Úÿý›ÿýÿ@‰Iÿý‚ÿþÿ÷*ñ<?ô&ƒeÿN2¤ÛãäÈI€Aísÿûœÿüÿº‰Ïÿý‚ÿüÿ–}Õ€½¢ƒLþS ¤ý²T/7‡ÿz€ŒÁ Üÿýÿþÿ?‰mÿü‚ÿþÿò&§9ö&‚)ùp"ãÐ,:úK‚Ðw[ÿüÿþþŒÿüÿ¤‰éÿþ‚ÿûÿ‰7(ƒw‚Ôퟂ҃ ï+´ÿüŒÿýÿþþ‹ÿþÿî‰ÿû‚ÿþÿ炃×צï3€g؃ñÿþ‹ÿþüëøÿþ‹ÿüÿ[‰,ùÿþ‚ÿüÿvƒ7÷9ŸÑƒÍk€³šWÿü‹ÿûÿRúþþŠÿüÿ¢Š«ÿü‚ÿýÿÛ {7¿Fø,„¶‘ éL”ÿûŠÿûÿ­kÿüŠÿýÿ؉Cÿþƒÿ úÿi2ÀÿŸ€CñÐ……§¢CîÀÿü‰ÿ üÿÏ ˜/“ÿû‰ÿþÿ÷"ŠÂÿü€ÿ!üýüÿ€ùÿþö(º Lì… ©Ÿ» ßÿýˆÿ ýÿé(ŠÿÇ ¶ÿû‰ÿþÿAŠ(XÿüþûýÿÿÒ^ læÿýüûÿï7±¡† ·ŠÒqðÿþ‡ÿþÿúGgÿùÿ¨ÔÿýˆÿüÿXŠÔÿüÿþÈW\×ÿþüþÿþÿêbÚ çD† Õ`#í)&ýÿþ‡ÿþÿkCùÿþûÿƒ.íÿþ‡ÿûÿn‹'lÿô¯D_Òÿþüýÿþüûúÿ‚£ž6ê… ë+jÖ‚.‰ÿüÿ«-êÿýÿÿüÿhdÿü‡ÿûÿw" ]/kÕÿÿüýÿþûþÿÿþô²ÎhYш jÚ¸‘‚.‰ÿûÿ <øþþÿÿûÿ|Wÿü‡ÿûÿw‹&#„ãÿþüýÿþüÿÿûÉCàFĭ ÈŠ èH‚(þÿþ†ÿþÿÿSYÿýÿûÿšÞÿý‡ÿûÿp‡ H¨ôÿÿüý€ÿþÿåŒ0‚ð7gË…;ô"Eì‚òÿþ‡ÿþÿï2~ÿøÿ¾Áÿýˆÿüÿ[Š*|Õÿÿþüþ€ÿþÿùtï8TØ„ Ü’»‚ âÿýˆÿ üÿØ ÿØŸÿû‰ÿýÿE†  0wÄøÿÿýû€þ€ÿýÿÌ7ÊÜI0ëƒiíØlÅÿü‰ÿ üÿ» ·?zÿû‰ÿþÿú&‡·ÿþÿÿûýÿþûþÿþÿÿþÿý4!î&€ÍoçZ/ûX+ìÆJžÿûŠÿ ûÿ–Sÿýþ‰ÿýÿÞ …wÿøüþÿþüþÿñéÿþÿÿüÿÖg€«€ŒÌ6ôŠ€FëÈÓaÿü‹ÿüÿs9ðÿþŠÿüÿ«†åÿþÿýýÿò–$Úÿýÿþÿõ&™¹€Tæè€nÿ$ó5aõ»#÷ÿþŒÿøÕíÿþ‹ÿüÿe‡$…ÿûüÿü¡"lÿüÿÿûÿŒ>ò êS€ <úž! _ÑñOƒ—òq:Oƒáîi¿ÿüŒÿýÿþþ‹ÿþÿó!‡!ñÿÿÔ?âÿþÿþÿéÔ{€—É.ÆêÛçᇂoÔÝÛ½igÿüŒÿþýþŒÿüÿ°‰$—ÿ“ €ÿûÿÿüÿyaæ ñS#?+ € æÿþÿýÿM‰3kïÿþÿýÿÝÑ€yæ  x€ƒÿûœÿýÿÈ‹ƒ“ÿûÿÿüÿg<ù=€Æ¿‚€ €ûó?‚€ !gåÿþ›ÿüÿPŒ…+øÿþÿýÿЄëÜÀ !¹ö-vö*Võ®kÿûšÿûÿ°˜¤ÿüÿÿýÿV¹ÈÊíR… {ö¾ˆþZ… LÍõm¶ÿû˜ÿýÿë"˜8ÿ=üÿÂÌÆ tðÖ{4 !U¥íáUcõÎg"H“Þî”âÿü–ÿþüÿSš;µÿüÿÿþÿE Åæ"yËçéÙÔäéÛ¤K†×êÝÒÓÛéà³e€:ôÿý”ÿþûÿy›IÿýÿÿýÿÖ<¡ý`€ ?GFG&‚ 'GnsH1 €‚J÷ÿü’ÿýûÿˆŸÅÿüÿÿþþÿ_aû¿+„„„…Cìÿûþÿüýÿ|[ÿü€ÿüÿé¬ú±<„ eAŠ(Îÿýüþ‹ÿüüÿïVŸDÿýÿûÿZ,ªóØ{$ƒ‚S¯åý  …÷ÿþüüþ„ÿ þýûþÿÿ³# jÿûÿúÿluÌíÔ i4‡ ,_”Éèá§G!ðD‹ 'œóÿþÿþü€ûüý€ÿý½G¡ Gÿûÿÿþûÿù1€#g¥ÓçãÏͪ§¨¨§«ÎÏå娱y:¡¹Œq½ï„ÿ÷Ï‹5¢ÎÿûýþÿöZ‚5Sp†Ž”’ކpT8.ô,€ @av{yiJ%¥2äÿÿî¢).ƒŒ »¢‡¨PHbÿ„ƒƒ@é‘€«€9Ïøš$“ &øƒÊ€MÅõ¹S ƒkÄô¼JÒ 4£éç¦Uƒ†j¾óÝ+Ø S§ÿ{4pD&ƒ%Bg›²¿×,Ø"ÎaƒÿÝêâÝÓÈÅÅÈÓÞâêåÖ¥çmXÙÜç5·‡+0O``aa_`S1) oÐã[Ý 4å×P‰ ç>ŽÁÝ [Ôæ&… ®¥+õ0Ü ‰´=ÞŠ GéKÜ®…tˉ 4áTk8eDÙƒ‡ -Lr–»×ðûÿµÙ wÿдnK*†nÿü‚ÿüÿÝ Ø¬ÿüÿùãÐtƒAÿüûûüýþþÿý+××ÿûüûûýÿûÿƒéÿþ‚ÿüÿY‡€º€ˆ"øÿþÿþüÿA„»ÿü‚ÿûÿ‹ƒ‚¶€„Nÿü‚ÿþÿë„ÿû‚ÿüÿ¼€€ARL!´ „ÿû‚ÿüÿ¾…Gÿý‚ÿþÿå€ 7‚Åñÿþÿõ ² 9§ÞéÚ¶}< €¶ÿü‚ÿûÿƒ…ïÿþ„ÿ 3;…Òý€ÿþ€ýÿÛ!°uþÿþÿþÚŽ@ € ßÿý‚ÿýÿI†Ãÿü‚ÿüÿ˜L‘Ùþÿÿþûüþ€ÿþùÿ½±bÿüûýþýüûþÿÿþÝ—I;ÿÿþÿþÿð†‰ÿûƒÿþÿÞé€ÿþûý†ÿûÿT­äÿý„ÿýûþ€ÿé°‰çÿþ‚ÿüÿƇNÿý„ÿýÿÿýûý‰ÿüÿ¸­oÿûˆÿýûýˆÿûÿ‡óÿþ„ÿýþŒÿþÿó¬Ãÿü‹ÿþüûþ„ÿüÿRŠËÿý–ÿüÿP«óÿþ•ÿþÿõ ˆ•ÿû–ÿûÿv«Bÿþ–ÿýÿΈYÿü–ÿûÿ‹«\ÿü–ÿûÿ™‰&ùÿþ•ÿûÿˆ«bÿû–ÿüÿ]‰Óÿû•ýùÿl«Nÿü•ÿþÿû(Š ÿû”ÿþÿù)«!õÿü”ýûÿÕŠXåÕ”Ø×Újšÿý”ÿûÿ£–  ›’*9”76;É“D9–76>ED˜EDýÿýýÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿ÷ÿýþýÿýêýýžÚŸø$3³¿Ã\°¿fÿˆ­X+½  ØÿÅ'«”ÄÁ mÿþñj§¼ÿO¿  Øÿûÿº)£VèÿÆÂ]ÿûüÿõƒ‡€Ž ¡ÿûÿV¡œ½ÿüüýÿãt‚„† ZäÿùÿÁ¥› 4ùÿþþüÿÿñÕ™6€€ #%6¼ÿþüþÿC  ›&~ÿûÿÿýüÿÿýÿ”&cÆàðõöòéÓ³ƒF &P®úÿüýüÿ ¡]™›¼ÿüÿÿþûÿø™.tÅ÷Šÿæ¦P xÊøÿÿþüÿþÿç¡4ÿ†›âÿýþüÿÌ9-žòÿþÿüûüý‚þýüûýÿþÿÛx>ëÿ€ü€ÿüÿZ¢ïÿq›8óÿüÿ‰!ŸùÿþüüþŠÿþüýþÿêy¢ÿüýÿÿûÿ˜£ÖÿþT› IùõTiîÿýüþÿýûþÿÚKiúÿþûÿĤ²ÿýñ0› KF©ÿýüþ”ÿýûÿÿ HóþÿÙ¥ ƒÿøÿÒ›Êÿûþ˜ÿ ýûÿ¼Aúß#¦ QÿýûÿŸ›Õÿû›ÿ þúÿÎM-§ #÷ÿþüÿb™ ÇÿûžÿúÿÇ «Ïÿýþÿí#˜šÿû ÿúÿ¢ª —ÿûÿüÿ´—Gÿý¢ÿüÿX© Vÿüÿÿüÿe–¿ÿü¢ÿýÿÕ¨ òÿþÿþÿç”8ÿþ¤ÿüÿV© Áÿüÿÿüÿ¡”„ÿû¤ÿüÿ§©{ÿû€ÿþÿE‘¿ÿùþ¢ÿþúÿâ ¨ 4ÿÿþÿÿýÿÉ ¬ÿþÿüüþœÿ þüûþþÿÊ ¨Òÿý€ÿüÿlŽ ¯GDªóÿþÿüûýþ”ÿþýûü€ÿùºU ¨Šÿû€ÿþÿäŒ $ÜÚ#kºôÿýûüüý€þ„ÿ€þýüüûýÿ øÆy*@Ÿ ‡‚”:ÿþÿüÿˆ‹ %ð¯€[šÎô…ÿþ‚ýþ…ÿøÖ¤j*ᾃ†‘Óÿý€ÿþÿó&‰Cü€ ItšºÒæòú„ÿ ûóéÖ¿ {P&€ 昀%@QWTF/€†ÿûÿüÿœˆ%óˆ€Bᣠ‚,:BFGFC<. “j€+÷n O Ù÷‚ÿüå´iŽ2ÿÿþ€ÿþÿû2†ð‘€—ÿ„Œ bù¨€Qü7|ßÿþÿÿþý ÿÿþÿñ ,Çÿýÿüÿ©…ΰ€ØÞ-…€…ÞÇ €—¯eæÿþýûýþ‚ÿ þþüüþÿø“oÿüƒÿþ9„ž×€;øª…„„ÖÆ³ÿýüýŠÿþüýÿÝ<Œòÿþÿüÿ®ƒT÷+€Jÿ|…Eeg[/ „Û©+ÜÿûýŽÿþûÿú_Œªÿü‚ÿþÿ;êq€Eÿv„ ‚ÖìáÔÎÚèæ•/êêè€éæñ›óq3éÿû’ÿüýÿk‹Nÿý‚ÿüÿ­ È€ó|„*¦ôÊo, TÂùsÒ7FDDE<ævKô''æÿü”ÿþüÿ_ŠØÿý„ÿ 9<û5€ư„‚û¹4€NùÓhé/ª¹Ðÿü–ÿýÿù>Šÿû‚ÿ üÿ©¾¨€zç„ #ÕçE€€(íðdÜ$øD¡ÿû˜ÿýÿ݉&õÿþÿþÿû1=÷'$óJ„ Kþ¥€Xª±›“MXÿüšÿûÿŠªÿü‚ÿ üÿŸ±­€´¯„oÿm€ èN Úÿý›ÿýÿ@‰Iÿý‚ÿþÿ÷*ñ<?ô&ƒeÿN2¤ÛãäÈI€Aísÿûœÿüÿº‰Ïÿý‚ÿüÿ–}Õ€½¢ƒLþS ¤ý²T/7‡ÿz€ŒÁ Üÿýÿþÿ?‰mÿü‚ÿþÿò&§9ö&‚)ùp"ãÐ,:úK‚Ðw[ÿüÿþþŒÿüÿ¤‰éÿþ‚ÿûÿ‰7(ƒw‚Ôퟂ҃ ï+´ÿüŒÿýÿþþ‹ÿþÿî‰ÿû‚ÿþÿ炃×צï3€g؃ñÿþ‹ÿþüëøÿþ‹ÿüÿ[‰,ùÿþ‚ÿüÿvƒ7÷9ŸÑƒÍk€³šWÿü‹ÿûÿRúþþŠÿüÿ¢Š«ÿü‚ÿýÿÛ {7¿Fø,„¶‘ éL”ÿûŠÿûÿ­kÿüŠÿýÿ؉Cÿþƒÿ úÿi2ÀÿŸ€CñÐ……§¢CîÀÿü‰ÿ üÿÏ ˜/“ÿû‰ÿþÿ÷"ŠÂÿü€ÿ!üýüÿ€ùÿþö(º Lì… ©Ÿ» ßÿýˆÿ ýÿé(ŠÿÇ ¶ÿû‰ÿþÿAŠ(XÿüþûýÿÿÒ^ læÿýüûÿï7±¡† ·ŠÒqðÿþ‡ÿþÿúGgÿùÿ¨ÔÿýˆÿüÿXŠÔÿüÿþÈW\×ÿþüþÿþÿêbÚ çD† Õ`#í)&ýÿþ‡ÿþÿkCùÿþûÿƒ.íÿþ‡ÿûÿn‹'lÿô¯D_Òÿþüýÿþüûúÿ‚£ž6ê… ë+jÖ‚.‰ÿüÿ«-êÿýÿÿüÿhdÿü‡ÿûÿw" ]/kÕÿÿüýÿþûþÿÿþô²ÎhYш jÚ¸‘‚.‰ÿûÿ <øþþÿÿûÿ|Wÿü‡ÿûÿw‹&#„ãÿþüýÿþüÿÿûÉCàFĭ ÈŠ èH‚(þÿþ†ÿþÿÿSYÿýÿûÿšÞÿý‡ÿûÿp‡ H¨ôÿÿüý€ÿþÿåŒ0‚ð7gË…;ô"Eì‚òÿþ‡ÿþÿï2~ÿøÿ¾Áÿýˆÿüÿ[Š*|Õÿÿþüþ€ÿþÿùtï8TØ„ Ü’»‚ âÿýˆÿ üÿØ ÿØŸÿû‰ÿýÿE†  0wÄøÿÿýû€þ€ÿýÿÌ7ÊÜI0ëƒiíØlÅÿü‰ÿ üÿ» ·?zÿû‰ÿþÿú&‡·ÿþÿÿûýÿþûþÿþÿÿþÿý4!î&€ÍoçZ/ûX+ìÆJžÿûŠÿ ûÿ–Sÿýþ‰ÿýÿÞ …wÿøüþÿþüþÿñéÿþÿÿüÿÖg€«€ŒÌ6ôŠ€FëÈÓaÿü‹ÿüÿs9ðÿþŠÿüÿ«†åÿþÿýýÿò–$Úÿýÿþÿõ&™¹€Tæè€nÿ$ó5aõ»#÷ÿþŒÿøÕíÿþ‹ÿüÿe‡$…ÿûüÿü¡"lÿüÿÿûÿŒ>ò êS€ <úž! _ÑñOƒ—òq:Oƒáîi¿ÿüŒÿýÿþþ‹ÿþÿó!‡!ñÿÿÔ?âÿþÿþÿéÔ{€—É.ÆêÛçᇂoÔÝÛ½igÿüŒÿþýþŒÿüÿ°‰$—ÿ“ €ÿûÿÿüÿyaæ ñS#?+ € æÿþÿýÿM‰3kïÿþÿýÿÝÑ€yæ  x€ƒÿûœÿýÿÈ‹ƒ“ÿûÿÿüÿg<ù=€Æ¿‚€ €ûó?‚€ !gåÿþ›ÿüÿPŒ…+øÿþÿýÿЄëÜÀ !¹ö-vö*Võ®kÿûšÿûÿ°˜¤ÿüÿÿýÿV¹ÈÊíR… {ö¾ˆþZ… LÍõm¶ÿû˜ÿýÿë"˜8ÿ=üÿÂÌÆ tðÖ{4 !U¥íáUcõÎg"H“Þî”âÿü–ÿþüÿSš;µÿüÿÿþÿE Åæ"yËçéÙÔäéÛ¤K†×êÝÒÓÛéà³e€:ôÿý”ÿþûÿy›IÿýÿÿýÿÖ<¡ý`€ ?GFG&‚ 'GnsH1 €‚J÷ÿü’ÿýûÿˆŸÅÿüÿÿþþÿ_aû¿+„„„…Cìÿûþÿüýÿ|[ÿü€ÿüÿé¬ú±<„ eAŠ(Îÿýüþ‹ÿüüÿïVŸDÿýÿûÿZ,ªóØ{$ƒ‚S¯åý  …÷ÿþüüþ„ÿ þýûþÿÿ³# jÿûÿúÿluÌíÔ i4‡ ,_”Éèá§G!ðD‹ 'œóÿþÿþü€ûüý€ÿý½G¡ Gÿûÿÿþûÿù1€#g¥ÓçãÏͪ§¨¨§«ÎÏå娱y:¡¹Œq½ï„ÿ÷Ï‹5¢ÎÿûýþÿöZ‚5Sp†Ž”’ކpT8.ô,€ @av{yiJ%¥2äÿÿî¢).ƒŒ »¢‡¨PHbÿ„ƒƒ@é‘€«€9Ïøš$“ &øƒÊ€MÅõ¹S ƒkÄô¼JÒ 4£éç¦Uƒ†j¾óÝ+Ø S§ÿ{4pD&ƒ%Bg›²¿×,Ø"ÎaƒÿÝêâÝÓÈÅÅÈÓÞâêåÖ¥çmXÙÜç5·‡+0O``aa_`S1) oÐã[Ý 4å×P‰ ç>ŽÁÝ [Ôæ&… ®¥+õ0Ü ‰´=ÞŠ GéKÜ®…tˉ 4áTk8eDÙƒ‡ -Lr–»×ðûÿµÙ wÿдnK*†nÿü‚ÿüÿÝ Ø¬ÿüÿùãÐtƒAÿüûûüýþþÿý+××ÿûüûûýÿûÿƒéÿþ‚ÿüÿY‡€º€ˆ"øÿþÿþüÿA„»ÿü‚ÿûÿ‹ƒ‚¶€„Nÿü‚ÿþÿë„ÿû‚ÿüÿ¼€€ARL!´ „ÿû‚ÿüÿ¾…Gÿý‚ÿþÿå€ 7‚Åñÿþÿõ ² 9§ÞéÚ¶}< €¶ÿü‚ÿûÿƒ…ïÿþ„ÿ 3;…Òý€ÿþ€ýÿÛ!°uþÿþÿþÚŽ@ € ßÿý‚ÿýÿI†Ãÿü‚ÿüÿ˜L‘Ùþÿÿþûüþ€ÿþùÿ½±bÿüûýþýüûþÿÿþÝ—I;ÿÿþÿþÿð†‰ÿûƒÿþÿÞé€ÿþûý†ÿûÿT­äÿý„ÿýûþ€ÿé°‰çÿþ‚ÿüÿƇNÿý„ÿýÿÿýûý‰ÿüÿ¸­oÿûˆÿýûýˆÿûÿ‡óÿþ„ÿýþŒÿþÿó¬Ãÿü‹ÿþüûþ„ÿüÿRŠËÿý–ÿüÿP«óÿþ•ÿþÿõ ˆ•ÿû–ÿûÿv«Bÿþ–ÿýÿΈYÿü–ÿûÿ‹«\ÿü–ÿûÿ™‰&ùÿþ•ÿûÿˆ«bÿû–ÿüÿ]‰Óÿû•ýùÿl«Nÿü•ÿþÿû(Š ÿû”ÿþÿù)«!õÿü”ýûÿÕŠXåÕ”Ø×Újšÿý”ÿûÿ£–  ›’*9”76;É“D9–76>ED˜EDýÿýýÿÿÿÿÿÿ÷ÿt8mk@ còd†ÿÿ‰0 8ÿûÿ°”ÿÏÿùÿ×/»ÿÿ|xÿûüÿôa3Ûÿüú+"óÿþýýÿœ _õÿùÿ¿¢ÿüÿþûÿ×:—ÿýüüÿe9ÿþÿÿÿüÿû‡ .Îÿûýþÿç³ÿüÿÿÿýüÿÖMnôÿûÿÿûÿ¾)@ÿþÿÿÿÿþüþÿºJ*¼ÿýýÿÿþÿö(ÿìI¬ÿüÿÿÿÿÿýýÿÿæ¶m&46. †õÿûþÿÿÿûÿœóÿýi/øÿþÿÿÿÿÿÿüýÿþÿìm?vªÑê÷þÿûñà¿‘[&8~æÿýüÿÿÿÿþÿ÷+ÕÿûÿxŠÿûÿÿÿÿÿÿÿÿþüüýÿ¥B ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÉ{(@¨çþÿÿüþÿÿÿÿÿûÿ’ŸÿüüÿyÙÿýÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿþûüýþþþÿþþýüûüÿÿÿ÷·E§ÿÿÿþûþÿÿÿÿÿÿþÿçgÿüþüÿlJÿýÿÿÿÿÿÿÿÿÿÿÿÿýýûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýûþÿúëÿýûþÿÿÿÿÿÿÿÿÿüÿlBÿýÿþýÿRŽÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿüÿÿÿÿÿÿÿÿÿÿÿüÿ¾&úÿþÿýÿò3Äÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿþÿó.âÿýÿÿüÿØ áÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿjÂÿüÿÿÿûÿ«5ïÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿŸ—ÿûÿÿÿÿûÿo9äÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÁ bÿüÿÿÿÿþÿ÷5®ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÐ3ÿÿÿÿÿÿÿüÿÉiÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÅ âÿýÿÿÿÿÿûÿ‚ëÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ;°ÿüÿÿÿÿÿþÿû8’ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ©uÿûÿÿÿÿÿÿüÿÂìÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿü.6ÿÿÿÿÿÿÿÿÿûÿo_ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ‚ÚÿýÿÿÿÿÿÿþÿëÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÁœÿûÿÿÿÿÿÿÿüÿœÈÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿåSÿýÿÿÿÿÿÿÿÿþÿ>ßÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû&íÿþÿÿÿÿÿÿÿüÿ¾{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÙ±ÿüÿÿÿÿÿÿÿÿýÿX ©ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¨ Fh{}pQ, `ÿüÿÿÿÿÿÿÿÿýÿÔÅÿûÿÿÿÿÿÿÿÿüûüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüþÿÿÿÿÿÿÿýÿ…B‘Îõÿÿÿÿÿÿÿúݦ[ðÿþÿÿÿÿÿÿÿÿüÿkÔÿûÿÿÿÿÿÿÿýýÿÿÿÿÿýûüüýþþÿÿÿÿÿÿÿÿÿþþþýüûüÿÿÿþýÿÿÿÿÿÿÿýÿj dÒÿÿÿÿýüûûûûýÿÿþÿ舰ÿüÿÿÿÿÿÿÿÿýÿßÓÿûÿÿÿÿÿÿÿüþÿµu±ßúÿÿÿÿÿÿÿÿýýýýýýýþÿÿÿÿÿÿÿýä¾ñÿüÿÿÿÿÿÿþýüDJÖÿþýûýþÿÿÿÿÿÿÿþýüýþÿðwZÿüÿÿÿÿÿÿÿÿÿüÿz ÃÿûÿÿÿÿÿÿþûÿäW -U§ÅàîúÿÿÿÿÿÿÿÿÿüðãÊ­†\34Óÿûÿÿÿÿÿÿýÿâ ŸÿÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿË.èÿþÿÿÿÿÿÿÿÿþÿå¢ÿûÿÿÿÿÿÿþüÿ­ -:FQWYVPF;0 ­ÿûÿÿÿÿÿÿüÿ·Åÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýûÿô[ ÿüÿÿÿÿÿÿÿÿÿüÿ€oÿûÿÿÿÿÿÿþýþyŸÿüÿÿÿÿÿÿþþÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿuFÿýÿÿÿÿÿÿÿÿÿþÿé1öÿþÿÿÿÿÿýÿ÷V,AF:ªÿüÿÿÿÿÿÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýûÿuÕÿýÿÿÿÿÿÿÿÿÿüÿ€ÂÿüÿÿÿÿÿþÿõG[«ßøÿÿþîÃlÀÉÆÇÇÇÄÔq Ìÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿ^€ÿûÿÿÿÿÿÿÿÿÿþÿçnÿûÿÿÿÿÿÿþÿQ|äÿþÿÿþýÿÿþÿÝLdÿüÿÿÿÿüÿU0ôÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿõ6(øÿþÿÿÿÿÿÿÿÿÿüÿ{èÿþÿÿÿÿÿûÿ€Vßÿþüûýþÿÿÿþüüÿÿe¯ÿùüüüûÿë}ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÏ ±ÿüÿÿÿÿÿÿÿÿÿþÿâŠÿûÿÿÿÿÿüÿ¾¥ÿþüýÿÿÿÿÿÿÿÿÿÿýþûúÿÿÿÿÿüÿ¸Þÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ…Uÿýÿÿÿÿÿÿÿÿÿÿüÿpíÿþÿÿÿÿþÿõ/.Øÿûýÿÿÿÿÿÿþþÿÿÿÿÿþýþÿÿÿÿÿûÿrrÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷, ÚÿýÿÿÿÿÿÿÿÿÿýÿÚ€ÿûÿÿÿÿÿüÿ‚Dïÿûÿÿÿÿÿþüþÿÿüýÿÿÿÿÿÿÿÿÿÿþÿý1`ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¦~ÿûÿÿÿÿÿÿÿÿÿÿüÿcßÿýÿÿÿÿýÿßAõÿüÿÿÿÿÿýþÿüïõÿþþÿÿÿÿÿÿÿÿÿýÿÒÎÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû0%õÿþÿÿÿÿÿÿÿÿÿýÿÄUÿýÿÿÿÿÿüÿp-íÿüÿÿÿÿþüÿæ‚8"_àÿýÿÿÿÿÿÿÿÿûÿ’Kÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ“¦ÿüÿÿÿÿÿÿÿÿÿÿÿùäÿÿÿÿÿÿýÿÜ×ÿüÿÿÿÿþüÿ#ãÿýÿÿÿÿÿÿÿýÿL¦ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿäAÿþÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿüÿ¹©ÿûÿÿÿÿÿýÿu [ÿýÿÿÿÿÿÿþÿëéÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿOÇÿýÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿüÿƒdÿüÿÿÿÿÿüÿ} Þÿýÿÿÿÿÿüÿ´Kÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ–aÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿåéÿþÿÿÿÿüÿ¦«ÿüÿÿÿÿÿûÿp‰ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÎ Ýÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿq–ÿûÿÿÿÿýÿà„ÿûÿÿÿÿþÿý.½ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿòÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿØ (÷ÿþÿÿÿÿüÿ_uÿûÿÿÿÿýÿÐâÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿBðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ`ÿûÿÿÿÿýÿÑwÿûÿÿÿÿûÿŽ$÷ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿe—ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÌ Ýÿýÿÿÿÿûÿt‹ÿûÿÿÿÿýÿJ;ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ„/úÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿOAÿþÿÿÿÿþÿú,±ÿüÿÿÿþÿêHÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ”­ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿº{ÿûÿÿÿÿýÿÕáÿýÿÿÿüÿ²Rÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœ7ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüÿ@­ÿüÿÿÿÿüÿºCÿþÿÿÿÿüÿkSÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿVïÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿûÿ›Ëÿüÿÿÿÿüÿªœÿüÿÿÿþÿú,Jÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ–OšäÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÖÀÀLÕÿýÿÿÿÿüÿ¬#òÿþÿÿÿýÿÎ>ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ‡„¼íÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿò¤Y#Òÿýÿÿÿÿüÿ¾—ÿüÿÿÿÿûÿ‹'÷ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿjxÿûÿýûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÆÆÿüÿÿÿÿýÿÜ  DÿþÿÿÿÿÿýÿEïÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿG7üüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé¤ÿûÿÿÿÿÿþÿ9 ßÿýÿÿÿÿýÿß›ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿö!±ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿArÿûÿÿÿÿÿüÿ£  ÒÿýÿÿÿÿÿüÿÆ™ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÕFÿþÿÿÿÿÿÿÿÿýüÿÿÿÿÿÿÿÿÿÿûÿ‰5ÿÿÿÿÿÿÿÿþÿYGäÿüÿÿÿÿÿÿþÿê;ÊÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŸÃÿüÿÿÿÿÿýüÿÿþÿÿÿÿÿÿÿÿÿýÿØ Ëÿýÿÿÿÿÿþÿ÷r<§üþýÿÿÿÿÿÿÿÿýÿÅG)2^¸üÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿYXÿüÿÿÿÿüþÿχúÿÿÿÿÿÿÿÿÿÿýÿVfÿüÿÿÿÿÿÿþýÿèÎàýÿýýÿÿÿÿÿÿÿÿÿÿþÿÿøüÿÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿìÒÿýÿþüÿél ¿ÿüÿÿÿÿÿÿÿÿýÿÇÔÿýÿÿÿÿÿÿþüÿÿÿþüÿÿÿÿÿþþÿÿÿÿÿÿüýÿÿüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŸgÿüþüÿ¦RÿýÿÿÿÿÿÿÿÿÿüÿdSÿüÿÿÿÿÿÿÿÿþýýÿÿÿÿÿÿýþþþÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿþüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ<ÞÿüûiÏÿýÿÿÿÿÿÿÿÿþÿé!˜ÿúþÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿßçÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿµyÿöOdÿüÿÿÿÿÿÿÿÿÿüÿ¿²ÿûýÿÿÿÿÿÿÿÿÿÿþüüÿÎSÿýüÿÿÿÿÿÿÿÿÿÿÿýüÿÿÏÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ<žU Ûÿýÿÿÿÿÿÿÿÿÿüÿ¢˜ÿÿýûýþþÿþþüûþÿûŒ hýÿüüþþÿÿþþüûþþÿÔISÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ˜vÿüÿÿÿÿÿÿÿÿÿÿûÿMÔÿþÿÿÿÿÿÿÿÿú²4?ÔÿþÿÿþþÿÿÿÿÿÒd ¤ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿßèÿþÿÿÿÿÿÿÿÿÿÿûÿ² Q Õòýÿøä¼}. ]´åûÿÿýëÆŒBÛÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿH‰ÿüÿÿÿÿÿÿÿÿÿÿÿüÿØ;37(/BB28ôÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿv#ôÿþÿÿÿÿÿÿÿÿÿÿÿüÿúOûþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿŽšÿüÿÿÿÿÿÿÿÿÿÿÿÿýüÿê…"D+Sùÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿbÿûÿÿÿÿÿÿÿÿÿÿÿÿÿþüþÿó­T3|Êÿ¥Aèÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿÿxtÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿé¯u@9gŸÖüÿþÿö)»ÿýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿâG\ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿÿÿþðÓ»£’‡‚‚‡’£»ÒîþÿÿÿþûýûÿŒjêÿþüüþÿÿÿÿÿÿÿÿÿþüüþÿû™%÷ÿþÿÿÿÿÿÿýûþÿÿÿÿÿÿÿÿÿÿþüûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüûýþÿÿþÿç†èÿþÿþüûûüüûüýÿþÿöª3¡ÿùÿÿÿþüüÿÿÿüþÿÿÿÿÿÿÿÿÿÿÿÿþýüüûûûûûûüüýþÿÿÿÿÿÿÿÿüÿpa²çþÿÿÿÿÿÿÿÿñÆ|%ÜÿüüüþþÿË€ëÿýûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÔ9c„˜£‹oE!½ÿþÿüÒn —öÿþüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüüÿ];cX/'”íÿþÿûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê0pÈûÿÿÿÿÿýüýþþÿÿÿÿÿÿþþýýüûýÿÿÿÿî²a0vÞÿþÿÿÿÿÿÿþýýýýþÿÿÿÿÿÿþÿüÿŸ ¶ÿûÿØÀãòüÿÿÿÿÿÿüòãÉ«sÆÿúÿ Ýÿúÿa/=FJJF_G:€€€ÏÁ Œp²ÜòŽÎJ-½ò1ú3aÅéQõ$^`€OÏ#´Ãò‚÷³MAÕbNºCÕš“l@|›DÙöÈ*Jí`'¥CðÏÍ?ˆ~à ‹Ø+LŠÿMÂ+±’ XÚöù“«}ç)“Ú”TЬ·ÜeNaf:˲ $u\ô Œ£óºÓWiOxpTZ†§¢Í^»R”—¶c¹¸ Ø­Ð xâñrpî;±oå.(•NsNh†!àb–ÑR`¾ÿtjÚÌ2`ü¡/‚2„+„óSMSÕŽ*c Åh¶Ë5!J&<:Æ[·>2©‡\ÿH)ЭÌÖSÝr(’Ö§2Âf2úºÖÖÐt¾~+Dw+¯LÏÎáŸûÎ.̧þ¾|ÞÆüä,å;Ô÷rhÉéØ\°OÏWŸ8¥ô J ÆÏu~º;¤†Ý믃¥Ñ‰A÷§“œ*bÏsø°D¥6(\wmõ­¿Ôü-¡Aq Zc$_°™ôPŒ?ä ,‹û|V;RJêÆKëPH#bF")ëž–æÖf=W:‰¦©,mº¬ KU“Õã—tx»¤MN³q¼kòÁ9÷R¿×ýQ‹ñδœ<Œ<ñû˧¶DeíßN r5«Uà¶ž~ù¯”ì)|òf'´è¤Q\`ò{Ž›ü¾¤_ymÀ/{'¼4ªüòØŽøDbáßÈÏ¡©ïØiQ˜¶¥n]ÔìoA°Cs½»É4{XDÂÓ5 \òï ¼‡5ºo7­döXËòrÉžYC«ÑÃÀ$_dkÉ‘p—J¡l£ÄOù&\®¬wr¨…ïGwý¥$Ðe=¹PWàê"Û¦$Çr*MØj_eVa CƒDàúÚìÖä<‰‰Á{|,—‚¬BÁªçØÌÊ5&yÁò.ˆlO0)„A¤æäY÷¿/·@¾<àÜbB’? 1ˆžÈ‘¶ üw®«;p }•¥ʼnñ`´oàÈ( ¾˜ÎøÍ”¬îmÝwD$š~7YìNä×ù¨ÔHØ¿83À¾>ÑÑOæÔ!¬–ªÜû¶bI•Î"~ EÉ1ñŽïÃsó±Ã3ŠˆK#»£MŒ(”ùÅïzzùY‰GW‰¨Ãì9Küqõ˰ß]ípXµ  ^`Œ—Ù¡þeK´ ’Ÿ¨ÑV ΂½ó×ÍL{"{\xàVþø…芤'fJ‚z‚bÅÒN¼À›UâÞm†•Ndϰ'öPWpV&Â7=š°Û³ß~¯hlª0¹«e_4O¸ x $å‘o kp%%õï~CÜöS9±I·ûW½]/™€¬qÆ^!Úlht¹f8¨Õ,þ |¥dC8p ù[Û…ˆ0É‘{u-7š™’ø‘1ŠOò{uož¨+¾+…øDÈì.œtoMxÜ }:/ ÿ-‡½ål²nòæ–jø‰/î>Mîb¶œR3x‡RŸr |‹Üt‰:ô†ø)*œwJ4Nº÷4@“¥VxâÖûß)¯/9yþé›L&_/ &Ѻ:ö‡¿P…¨DeëZÞØxEVƒÚc”ÿ~óÕŒ2Çâà ‡K7ÐXì•ö—¹„¡mâ,Ñs+¤€6Ï ²0·ï ;gØñ7£‰»¡.䟊ÄÊŒÄq¢·9w._¥“­6»Mª‡¿œƒ.ÁÊ‹¹ÅPèº/"B"ÉÉZæÛ$ïÌÁˆ\Âã- "ÿt·Ö}-ñœål2±4b"Íë|½$7Ù1u†À æž* #%¾ó\ˆ2nmšY”Ëô¿¼á]¤:‘Zx׆pwÂ=øÄ‚"Ê" ¬sÓ)dÞÏϧ ùõ›ŸOàůÔ4;Ôú}î$°¸ÀK«À½ñn êÞ’àf*¯(V LgÃ+à†‹´ŸX[ÓôDs‹”B­XækÝÃÖá®ä⬽^Øü³ ¤)÷Nú(YÖ5SÚÁmMó!(i·åtVm%QêÖ•FýîãóÉèb>ÄÖìd‰§âæ4꡾²˜ºJãð™¶@‡e×l2ÆÖëY$n nE,w©Š<"ÝÑÆ§æô»6ü¿C$"Re›£&ÛìCwôXæc,«ÍùpÒÀ ÎÍ4Š‚…W/\-óņÌü'ÂÁ_3¦ ‡Qƒå5†aô£„o #¹Øš¿kÿ.u.ý™¸¯0âî'š©ôuú oY[Q®·–…ëÝ;fù‹¬î‹÷8ªÓ:¥`©C³»²7iv%›ìžlJsúDè=§à8¶7ŒgRGiÙÎÐê xZ šà0 ®<" ç¨v›"³`@ ‡hí€[çðL1{*ôó”[Z'ï•IgªK Ó?÷¸ÖuðÀiÇ\{Šy¹Ò0’\ø×jÕ¥ÞúÍXÙö<¯Kç¼ç]X7•h’S ƒ]o­qW ~qB·Q(º{iè{ΧIg4O½¾‹ÞÊbR¹"àæV_XP]É´e:#Ò€Ùë»  ¤ºUü'$⃋gÒø‡…MµjÊ„Š_xZW'„¯méEÖ©Ù„¸*Âb+¦*á1ñN£y&Ñ΀‰'G’r¹|làáôÌ#Ö YꌌŸ?ÕZ; †õ¡:OÊÞýÜW$AˬÕ,ÞP„\š|¼˜EWŒBs•ÇSÔѽ±Ú$?˜¿µ°žžùíÆ ¿• >HÙÖÍ€ð¾fhJ+!v p7lpŠþê#‚ ü=JAkñíõòX¬iQaÂØsÓ2Y—þÜ@¶©÷´ÍHç~/ßÓŒçNBM–gлt†¦¡Ûˆ%U@wè¾3øAŸ¾E*·èíR¹„o,°Ù¥ž"¡OÀšnÁåÆ7ß û1\ Œ»¦ÌiñÆvöbîJ2|§H+o0c¿–¼(²ÑüdJóK lãÍ¿»€3ÏöQç–TOœt»Ì›fV5 j³b¬µÇÄn›j'=“L\pù\”åK ¢K²V@'6Ü¿rî©g÷ò€í9í× äȘDȵÖ-´×ÔÕ_&R{ùCŸN¥AÿUÿe.ó{g[ÞDèW³â"0 ”/€®7ìÃÖ~ßV耛C¬m{ B1/sÎkD}• ïΖ¨^L,ƒH¢L˜†‘™rÛÁ tÇê’ pæ/Ȥ¡O°žïŠ©!òkˆayng< žËF×à~Âܨ»a¡Ðê@<h¨Ý½ã®ì‚QùPD¥p¹™ºð¬ÿtƒ à°Ž"¨ ¢cí·LTNÊøµp,jv’Æn%KÜs‚ÜrT'ÔæÄ×Ëô¦Ó0!DºÖn1Ç©ôÌN'Z Ì;ž<—Ù-#ËÍÙ‡å9Ö =•æUß)Û¸Û’æUS³ŽI¼QÑÖÉ´‡X"ð1è™|:˜èIˆ®þ#¦¾·&½þ£Q‰2*Þ6½‰`8Š¡ˆeM³&éEÆðR÷¾³Pàý X7§ûA÷•¾F-!³ó@:Èßô¼xz«\8Š/}Õk_‚åvöÿq„*؃”‘H³Û,4,!00Ÿ¡äèÝ´?/Ò ößJ+E– ›…ÖÄçCæî™í£¹°9ðô¥¤„—E²Qäºfœöâ¹ig2F‡“oÆÓ9ô˜å Ôž§^uÑ'V­,%¼G„3/`f8÷ÎOT jü|ñ6‚P›«U)ß ÏÞY³ù¯g»³Ë—ãØ%íð›šhÆAË•Ôï $¥)g°ˆíéfâ­#GjX]£Ät¯Kè [5ÚeD[,gj Cs˜öW`£‹z‘¾¢íÕkz®½Ì gîŒÃߺž‹œÌ2ï@ …®ú-0új¢©¸F^qó0H‚Õdí¼%{ ®Ÿ¶$œ$|.6µ3twr·‹–†$Â˜å Æÿ\IˆGèšföw]Èd|û6Ÿ.<ÃÉÿ‘xÓ ´¸FsÁ$y¼]¼ø“˜¢&ǽK ø¾•åÃV—~лÜé¢pÎ6ážÛÜl˜I6ÄOå‡ F_MÏ\M¶EêÇ’4u/ßÖç„Åãn˜i§S2〶Aóå¹:fœ³×€&àenéOQjj´`ŽI6^a`Y¿Ú˜,f’Ø{öY9¼k¡€!)§©­ÆNðÆͬOQÐñku@€+ˆ©x²îúb$#{öõ¡÷›áp=¤KN{ÙË_M¢O¸ì`¬dr‰›Ý1>83?4ÌÓª'çŽÚ·åÜnÃÆ*€€ÏÏ¥ˆü:g‡áÒàÌO ® Žd€ð´*\‰dËnÛ\šö臠í><ð2Þ>[éÙ†_±ÙÊZMΑלžFýëk3CdÂ_Yt³ȾÄÒµÈN•,˜:ÆÛV5·NG¦@ìvµŒû Õ0µÞ:ë­SK£ØM$,Èë9΂ÛÏaGĬ{#˜MrC‰¹¾>÷ÞÊÍõ'1·oÚ;‰€ãL Ûg½‡ó K«räôA·8&“”ÜaO›3„Ùq³cÕÍ?%ª°}ö9¶¹n²yÏ¡¦ç:;5˜àׄ(i2kNÇŽ{÷{á0þôä»Ç…ÃÙò$lD`y0º‹áf þfV¥Û–*“ꤊ$^¬~p3ù>‡.°äϤGÈeZƒRŸC_F¶"æ›ÐŠÞ‰š½H9Ã/{ÐÞhd1ÝX¡©%½48?¼¤`«QP§ÖJÒp™}ߟ¦ñ2c65¥#އç#Ï0ÀPå·âR÷··Ÿv{5fT?ìyQ^€ƒPàÝÕCSÒ` ¿õ/C-³OTNw bÏ:`•œQ1cWçm™RKãQù#Ÿ©—•Bë‚¡Ÿª*!º*#ÆË~Í]U̽é£Á¤‘žíÓ©ÓÕ}·òÝáj‰C”næÇ(EËݼµLnÞ£e¸!IV7G¡ó‚⸡ãL“Š[3™‡ÂqNä|—7•ãÝ ¼Y¾îN[®hèÆEadv¯ÁtDÊzéþž‰Gã‚ÊîœÑ†-~UiDï–ó¢Øj(3›é mìY©×ïˆ9ßÅ‘ZI®O[ö8ÐN¯b–G!ãHJ®J¸ˆ­®Š=»rF›œ7a5usÿ ݲcÜAHàbKÿaƹN à§Dï6S“½Ç©…¼)íŒE[0~f²Ö]Ð[Fç¡ôÛÕ"~PÅm¥7;@&f™[ó-&Æ÷‹ü/ kko“ªn ¢M—"9Ëíÿ@M‡±¬Ž…±Ò ©³+ÑOÚWæ½á¦‘ËêrÓ—C¦±ŸÆVö]¢?%çêÉb8‹70Y͈ºò)nñÇó'˜·Š¯1ƈ {ÿj—âˆ5¤We8Ì·/©‹ëžoä™Îô¯09ÀeÝŸo¬íë ØûAðí0TÆZs¶ø6—œHòº(;ˆ¦4gâN<Ä4’,é|ÇܦK α +îê©f-}­<Òo×Zœÿ7gªÛ(0>J‰´LVE—y|ÓÑy qx}÷èÄ1Ç_òª .S’’^XƧÕEy!<Á™Íñ€@âr+âWfŒ àòfþû°\¢—J&ÁÃú‡¨¦¨ÌEo,$Ä<;™ÂfØÄ–;ûžòýú¿Áèñ•ŽÔŠø1ˆÛüž'¼35?ê}_Žª€¥ ™Ÿ¾@Ä( Fæ¤Ït'AxµšÏù­ª×|.«QG9ðÒØ‚XM-}s`‰±zOFûáÑÙ§DoNÎÛ…UV! a4HïÁ0®ñ·cgâå<ó:ùªZ¬÷‡ôN5æÏ©.Î8Òò·»©v ÂÈîä6»¥¸óoíJZç¿€ÁWäóÝDÍ@ fËK§µ„62x¨Â›Ù÷Ò=2ˆ7oíñöñ$ZÉ÷…\Ĉ;k⬕3%(ÿûX_”­Ì|Ÿ¤*"œ­ ·|ð=Ö·h™8,f²jt#ßW"Tl¦¾ÊclO‚ÿ$°y´aç¡ÌÉqÅ8QTZÿ Ä€»3ûì/pÿ<:³W%–°±ÉÜ[:«Ñ|^PÁ‚”ÓQ墸ø¯ÂR2ƒW³ŠR¿U¶Í_D B%—‚å%a>%ìTŠbpê<72«0»4VÄòÁã ^!QíÔøˆÞsMÛJ#^Å{>}§çUÈôKæ'DU­ëG8È ¶3Ä¢oy¹ûgA§ö)%°ÈwfŒg÷ƒ¿ GLnè÷.×Î;eNk@ÿ=Ø*«²þs`ŸpÉJ6›d)~R5øpßøµ”ã8{/™ÊðãAN+fØô]ƒ#Ëzu½ã±-=Kýôµoàn²iׇìäsDÍvÛmæÍÀ  ³KË£g?¦$moÇÇ#L»²‰²ôGÇrßâ`6…æD(¤HOI¼÷•ôñ\ãW¹aÄŽ 'm±Ê ‹Ær'Qº¹Fõ(ZcÁ³Àº˜¥è èP 'Â…ÐØsøêš‹>ʵi\ÖÁáÞhÁàh;½VÏÏ×¶~~ÒsóõöêsM°Û@tà að¤øÃ׿»;‹ãDäþÈüŸ5 P\Üs§å‰tFs§T¤\ìV šÔA1§å KŸ’‰öˆ9h0’{DŒq"ìgÝêpîr¹t¼Öwê»MžŠê[aåÜhÜÿMÛ]ˆô·°PA¯C ¢Û†7!Kb 8®r-}Ä,MÜ«Ý{yWœ¡\OtÀa•VÉÚO”ßï(rð-¸¬ ÙŸ†°ESºá‘=/wö4½ª8F»ÏöŶKž‹Ìá“s«ó|Ê5­º¨3ãÆ«KƒWcþÄ«n&œvÛ° ?èݵïb#*©ƒÔú¾g ÕÇ«~ø†ZY¸ÍèîNüU¥èBèÐÒÜŸH¤«ÄÐA¦ÏK P«FŒ›gm=?dÆXæD<É¡3°[ƒe'..ïx¶¬º+ެ7ð9Y‰FT¯M›¸bpS-aÒöŽãŒ¯uÕóÛÝðªVY¦ýXb¤n4ê?š-L|Ù)éË‚Å%Ô€õiÔŽ6¨ù(ð“•òfLM9Ñ‚+{¯ÛçW±@þ§6×m¨l=sºG‘BÕÖ]ɩǠ}Ï|χ{ªT<­úÄ¥íPÐ--5¨,IKÚSÇP²Ðmü-uZ¨¬ÅkAGàÆ²øµ³c ò¯÷"ÊÜd®÷“Ð2ûvÊe5§÷´‚òô³nÇ܉_ž*^]×Ø'.RyÀac ›~BÝ4Iæ/<‘³¯Ð|̧H${‡~pA4Тqà§_£à¨ÇRJ˜m“S º]§¨Htl¨ïü§q£ŸÔ_¶‹NÁþgCrq›&( qœŽb˦”ÀþáÁš-kí êÿ.ä¡ðû›˜Ó~®SëßågüK¹8bˆ¡$hÄvy@@v‚·!¹ýZ»â*^1¨v–q7Nï-C—‡ÛkÞ=‚JöÊóËPJèÄpÛxËS Û´p^QçE?÷Ï óIèš553¢ 7´üÁ3ÒÄGÀõw¨¦å\u°-„õ’]ÇDÇ"­ÔA™fZ&0ÁêŒY^¥¿§r“2`eÞÆþz?ú¸dxg±}ÍAÍÕÝò„¨çKB)àà/Ôù{¶Ý õ*ÖÿLã•Pö_¹¯!9¿,¬†kü:¾ ÕµZªšh]öQppæ…ój5ò®°ð”~á1 $am2ö÷ìþ…&OQ1Õ%ÃЦ!!cL1ŠoºˆDjî×™/ÎÂ.ÒZ1ⱪÂO´Î‚Š‚þ–_(ãjJé®îü ´ˆøOV0dÂ|–!Ûèô``Êmͯ—雿=2´è8)ðÕÀH#\eâ² ðe]vÙOÁÃty’/ Þ«|©×½¬gP,ªŸ1È“qÍ=ÛÚxo1ÈÊp}‚àÍ]pž–=´ïc²Sÿ*ÃöʱðŽ3V¬Ìi”’†@øƒñB%hšácy°PuÃ_Ó¸Àl®¢ƒý%ì{û»–ã„þ`y¢¬(ÀýOóšýº¸Kät¢ãÑe TÐÓå5\{µG‘u¯µ÷Ó‡!ÜrÃËCׯm \Ÿ”.ÿuÊç>»]h©§Å(#¬ êë†0NwÚoÓ¼2j=k8¼®Oó¹@Zæ>x;~oöFOhÊ6,Ñî8Ñ›d²y`1»†éò â!™Ôþ^Àè :§rÿ^`%Ü£ƒò˜ãÍhY›xͧ*X€íI \_)žÓù³s©éФØ`ÂBN¿«`Cþ0½ånäÛ»öXòóøt˜-p·ö‰Ê¤;ˆ ô ™U5¤g)H×N¹íª½)£õ‘Å6;ƒvp±`^7܆>6RÄÒ;¸nïZ“Oå}Ä¡è‡f´/R¸œvƒÕЯBñÚ­9k3kßiaéÅ~*£…Q«ï’çÙþò-íÿC[èûÖ¯=á©ÆœùY•^4½èäìÏv.ì[7˜w§Ìé¥~â\$°áŽ¿1Ó3º\PID@úa OÛY¿e–”³H&ˆ™¦§O "À³z•«¶ÂHšK€©Û² 9¯øÝµ6&Oã¶“¯X¹ßæå\}÷ ˜h kˆÔåo!à<­$êÚÍ“=âŵ,ñ„Ò+r2Mô8’Opþt±\½r•*]p29ínØ5n6gíˆqÉKðMµèYU´Ì@2}0=´‰Ä,ÚuÙ¦/Ô É1ÞU\©„«êýÁþ³ÜèPœP,QŒ{”!÷àš8ň-€ˆÃ`óMNûo3‡xõ·<ðéCp¢·>Z܈jKîÐˬ5Ÿ-ö&^Z!®kp® Ò¹Ñ±¨Âvƒ3&ŠNÕ«æl»x ¯p û…±ivÎYû×[  [ȸ•ˆaÅ®%OÄò¢Á¿NbnO…± îJÓjä9'Ò&þ˜;Û0^Á1[0BM”ì–œ*ŸÓÕÛB‚Ȉø«o~=×¹¶Çñs¯0KYŽ!krÒ­8ó µ¯ZÈnQêf›±uçuXÿy”%µRsQiê®×ŒÊÅ+‚þøç)#‡0! ÿBÀ»ÇF€y(8²phèí"Të"bª/Ç*˜f¦â±«;TD1IÿRâÆü µÊP»´ af̬3‘>lûÓe }sÚPhÓ ðX³UEdä2·CÎ7ð0íV5O5Ȧ~E-1#mÐ[jò— Ö4Øx{@I© ¨…‚é 3£DhG¹5ã–U¥:3'¬‹‘-’fÖêü™#M.ÅyøÐôYG*CuÞø€cRÙEãë%*ON3 ‡{Ic!×Þ§|y=;“¯ÖO™¼§\ÍůcüMºŠs´ÖåÃÓf6Æ} œ"‰3{ÞF #õ¦Þ>ÿ‡mCªô¤ºL¾ ¢¿zB“\>ƒ1÷¢1 ¸½¼²'¨KÿМ­çÿwˆ.)FÝ¢ïyñèûÂnÍv#‘C=ÞÆüäH^R­U­óžÛ&–WØ}ãR¬r “y€Ã’6¾ž°¨R8nͧ€ZSïß6¾3î1Óso´\Ë¿©­Ârwù«isóè€\d×^¬{,_Å‹£§ŽYi¿ÿ{ùS¢²ýÐ -k;¿¶èžð€çÝôÜ”·.#.M³ul.ÑÌ…–“áxWJdzX(J¯@ºÎÃj;QøMZÃõ༖g!ç{†6Q—³ )\/^‚=d¶!Ô{–Å7²m†j`—Êq*vòúµ H°ÛM[Ì]½c«º½ï¤uyÂs/ØÑ옚˜Êõ&ʇŠÕÑ­úüpïT)§œÔ»}Õ9³¶ÇŒ``~Ð45‡[›7€¬Q¹LÍ:N7ÑòØ5P¤.­’ÀJO@ÊÒØÕ?©HÆD²PÖâN!¾)#kvv8™ÞHXüjÐö‚¶þqmÿpZpõ7ß™'-\¶Ù¾{›,×E²K’ƒ)ng³½.Œ,{Lþ{"ccæ2ËÂÖ÷IBÍéé9†yž²lxvÑ?Âm€)/Ðé®”YéciÕj¤¢ºê•ý'}w Œ5(‚“9gµ›|ILbA}%’œU­ê9u Í“OÛpÖ0Ác°À_²¦ô6¿ ¶åaéy5 ›M5ÌZTàCg#úLÍ[íàuedÕ§ÆC™³ö¤Ìÿ\ÅnÕÉJ+³XÒwMº$’Ëïõ&t5xOîl½Ç¥ßšL`;/ñÇl”ì¨ópð#»œëì~Ñ3¼Ýõ/N‚Èž„+âå[M¿<6ãIÚ³ÃX˜',–Õì¶¿¼žÊ¬˜Ó±9ÜOŽL7 ßK\Ð×ýŸÅÜ,¬«ãº]—âMá ¡AÔò¶Â'¹N|À/–ë‰Õ–øÌsX\w5ëýûEÝ<ìÝv¯û€€ÏÏÔJ?TXü=A€ñ.]…ÒöŠÿl•¨ÿTd½2NÇÛî+P—pçñb±ÕŹ ùN_ ¯ Ðäa дŽÊÑRС”WÎOîרgïŠÐ™zD;°¿ŒÈ½z²21 lÊoÆoOP­”¨òíÚzŠ!·¼9qÒ¹¿ŸÌ-Vù·Î´Ôa‡ƒÙ©Èúh5%\™ùWÎp˜}Çÿse„Ëë7Ò«Ûûsâ1þf‘•ÆG)™æd³1Ñ©Én‹»Ðåfå×(ô!3_Îuµcì|JÅÆÕ7hÄ(Búš! $Û®Þ£ÁPïña8†ïL#¿¶ÊS±À!LêX˜p]E:‘€xª’‚¶XècŒëg0—ž'?³£C-à‡{^01õ | ¹­žLÓ/ÏKº<¯¯ç#øßÈD©Fl7̮Ҷôþ€¶[SC*T ·ÃR ËÎC;"¢´¥‡hÿ£Ô›·tñ‹ÈªÚÒQG¯¤¡’n]uzmÙ\±–oç¬äŒŒ3œa½tè£ìwvÆô§ž·YkfÐEéÞ;£ß0Mž?ÖuØBEä4|KÿT“wØ^‚t#åÜsùù%æ6#Q¡{ø÷;ÉSidJÇ(%U|ú;‹àß}äñ\B œñŸèŽÍOplìH9Õ=÷Ò$â«?p[}¡(>5’ïæ££ÊOvvyîþ¯FÃÊ-ǃ1ônž Pã¸(†¨yŸªPœ¨Såhi²Ô[G؃Á¿ñŸf1ÿ–BÏ“û+uÿ+“ÑGT)î‹àÁ8¶c°#C(+ ¶pÑzê‹=à–¼zɑ۳ã¬RÏe”4ÑÙx^Æc …¨Î¨ÖþžËǶ iYW|?șΪZâ!_ÕFÝ—ÚÎ`|¹mŒ?Ñ7„L!Ç HT}ØÓÇÏÏÅ‹?lÔ$w@ë‰Cù+_P}`¼+ò]sšo"ÿO–‘Djÿ€qõ"s,¤"%0ÌwUºùžÿ˜^.sWº˜²Ï^e×Ò‘Ÿ{Q@3<ÊQ§›5¸+ê°SAb\»„ £ˆëù‰ì?^Šô[2‡×/¸1mÔÝ2 ½XzIŽœ_²fʇۀþ…¨w[„Ó_KU*zã1Бñ3« ¿1Æ›¸Ž„ʆ—™ëá¢%þ1MÜ€tM%ÖF$l µ‡¾ÿQN›ŒÐQcÙ¦gÕõüѾ^©¶Xß²…û}Ö¾ÊEä4ý4›7ÃøöÐ…Eõ9ùtEþ-}FC¡¿Nàøj.H•„Fú q‘ч—°±Æ\Çržp²&Nˆ4bÐ)¨Å9ú]²?Š=O0©fKþ…) R»6ÜÐBÿØÛ§bå8aAŠ†Ç½4Ң˭ncZÍ Á‡F?m‰&\*ƒÔÂÐg •„ ª€Ä¾9[Š2À(DË^c¼ ! œ¬†V•Æ”–`\Y~¹wÿö{作T‰Iˆ 'f×2³NuQº}öÁ–üKs.€æºÐ²+`Þ£²›7™Þ[|„¼fÆU8”¸tµTô $Á'@vò.qU«9žt/ƒy[&á$ä_$§xæ]rÀ=Z¬öûçPÖp¦(@¾ß´†f/·<½ãdMJHíš"ê÷Ǫ^œ{mÑ7<½«(BD_ ý=²Ÿ\ÊO¦j¤—º’С½ü:Æc› ›¼ÀÝ᫳]…€™«þ–œ™(àèœÜ¨°8ž÷u¼ç’fÑ ýÛ™ kÝ‘Nnâ¤Ð;€!L _¢ÅIŒ:aWY€Jc¬ü67¬ ¬¥86ݱ*™ûïº?“X 4÷|}„"CãÓ044JˆCoá•ùêŠq çrªØ¥Y¶âõ4 `~iùm¡;£¤ò­‰S}­E͹Ô!`Xn42áóh0Ù2T̉ö÷yQ«°ØCÝfÒlìú‡©åZœxò›-ÏÌ´&îƒ@A5sÙ ¾‰Œé…P¬ÜÚÛ¡¹Íþ·i“¢P`–qù‡j„FÊêM7C)‡¿{ÚIhî§lk {by„Ï)h” 8„{øÒú㦠Ø2Áu†Rÿ8•ÄËQ0ÁO‘~ˆ£0Mÿ{ÞÖB7ãn2Á'k1NpXæÜÏš\AصUçºQ‹ÁŸÉ§õþ&¡6u¼A }ï;Öo˜SdcÎû­ô%÷EK"²A-flåK´gñ8§2¿šG/Ë®À8Ct¸gvó‹fV¶gî{q+ÇÒh½µr6,áBþÌ}ëk³É-ÊA,E„;É/S"zNgaõ螫Θ_f犀߱‚”,hl´X¥Ì`I­ý€ìXD†–è½M øõ'³ {¹ábŠ.°"¥ãòÁÊ\F˜´"˜¨ga•c^Qc=Êðâï/û ³œv‡X…bUNˆN¹<¸|ý¼‘ˆIÙ`R_,¥O͵JaJ°¶ÉMê&#G]%}óÑJÇJ`ªƒ“µF™0+ñWFcŒ‚G(—¢`½[¬@gá0ú(UHªa<5bïô(‰ùp¼Æ“¢¥åp§+(ƒ´·JãÜL¤0 ”fÚÙ I”‚ý©Ì"ýøËPþ.]&b[TšPdɇy×Nú ®®»ìF† KÿP>z]÷÷65ÍžÒ%œe&%1üÕª;Ë)"¸›Öh‚2_V¶à“€ˆT$ÇÓÅdáÉ!½+öçP®òMá€FP̋ܥiÒ8 WœV¼OmŽ0a®_¤â õ«D¢Ïª‡"9²ÓÈùå7©lÖNi)/&;[7JÀsùj­Xü5í î—•çÓÍ… …VRíÄ• ”j6åýM†Â‹ßu‡UIó4x —­Â…î6º –ëø1O*6ù3F¬ÅSŽ®²Õ !éuëAf´Ïá§>ÍêÛ+äí3k GL¾‡%Qšö&ypÐt±±–b³p•ÂÓØ1ô]ÔTø=6mÈÖÜHIZ p´¡Ö>7”×ÞK;?å\ ®P0º¹n_I|5 ßéfWºx&ƒ@JœǘÄrȘrQN­Ù¢Ä¤Jí:Éþ…7>1¥ å3d™»+·µ¥ÿ3Ð%4Þ9‹„+'Ê å_Ôótç ÂÜ\þ\®Dn/ï¹uitC·жØ,”í:.¯¹“ª¾ëÊ$v4?NûP§´vߥ]xJ½‰¥Œ˜],qšÕ¸ù«óܳŽ@`ŠËðå•ú>Mû~×­ü´,äGæãŒc W÷œûè~=ýþ¬À?­£ê½4Ym„žTÝry©Ù2Òð¹ƒÏˆßœ^R¢º: ¡l‚j´~âIøÅн‹— @A Ó{Cx §‡K3lÜF{$³aåʲTb:Àoޝ0¨@1P€¥ÉŸŠâ~Œú·[ÀAÑEàÔõàâêåÉ´`R£FîÖ ëRy¤ƒB0zæsbÝOVQ¥ ys!7äݘ:3fÆ·9éJNɶհêaEIä*ˆqöÌ«›ŠŸ­‘ñÑJD'ñ §sD£ºóÀÇfM¦4O±<œ•ÝÙˆrÎ Îy‰r7—x÷„#ŒÙ&ІOê$+B»FâR­M=i4q`=_‰ë¦é€pëÁ9ý»IweþÇ9Äþw~njíϼª“‘ýp}Æ 9˜ï’/¤iA\ZùejoêGÂüOº†-­O¼5‹°S˜Ì•º‘lNȲ(ÅSþ=‰7x©=7§Ö-GJ5¿½µ¹e! Wýƒ)ggVôã•$(%¤0¨­ƒ&è¼û2Ø2«’”iÕ=œ¼¤¦ŸSÎ9´øë†Ú4$ò# ]€‚/{ù—±ôca/(éôG¨8Du®[.Ásxá͆þÙ·®YŒŒÖÛ !-M:Ã(ØSEø2çDk×½ŽÑ%ï&óbCR|e¸ CšØDSîP.ÊUÆE22yÒ¦Ó厃S{÷€Ùª´ê@YÄ@5S·gJ£Þwè-1þ?ù|cÍð×ÙÖ=ëˆÀZñ–»ú©¡-“¡©ò‰<Ì1f´îÁíÃ\µÄ»,’+îCdžnÜÙ!‡ag*"’±Zº'î„ÅUiµ{RNÒqVlˆüœúyjØw&û¶p£ok ÑrB¿×½P\ ˆjD=°Lˆ¬Õ2øWÞs§9Ò+"å6ðÝŒkw]–ý^_19Æ`…Ì|«žZ·¡x-Ê.:Fú#ªÁT@ñ7µÌK¥Ç ¡7ùÏÑ]”Ÿd×êÜ\*áàê{äso\‰9zû‹ì õ–ƒR¸ÜûÖOû^³ËÚ—SôI*›Í5 ’úeô5Šã…DöFÖ¹+¶å[2"ñIÖí(ý îè3–}ÏÒEHÈ…î#] ¶É©é +õHÈpï«êÞN ðèwÞc»'Èè¨Þñ­yѯ<¯®¹ªÕŸÑVýû¿æ8ø¶Ô™VGAÒÜÎW‚‘Äø}ð§”t”bWÜØÅóyt*0X¼J÷6ÕÑ÷ùÞõŒ 5*²ä0Ndo°×¼Yâðº†ÿbr?;›,&àBñRûµýÝÁ.ñ¾MbŒ±&x^ó'Á½¨žoiÈkTvP*Yã§°œæH gÐ3ã"çðïøuù}½¿ÿ]ù}½òÇ/·¾+íí#ÛÝÇíë›öö›ûz­çâÜà¶œ¯ ž÷và ”nˆóìĘ6[¨}¢êTÿƒ»uИ5k…ëبYØŽIIÖq‰Â?d¨¯ lclsÞ‡Ñk*ç-ÿpýÀÖf}ýië¤f¯i<‘Mñó{ã–Sðñ·[>.0ˆèg‡{É“+Í?j Vž-I5ðÑÖrréø‘v,¢P¾òÞ­»Ü—aуBùíê¤\ÁN„á5~¸˜cáa#[UjÕùŠ [ÆN©Òl,…Ê1t½&XT>îÙªšCT0¼C´ÙÕ×®7{f3÷˜ƒµ^X51V&*¿su‰¡:f›¯Ö*èƒå`ë·ü§ps¾#lÒQ¨ CEͧœ'v†]r_ÄdNG|³æÅÔ°“f((Èž6Ó(9_¸Wvž°Òþô!÷A̤jé±³¢Nº>Z˜Ìùë8ùº—pQÑÄ—ÉóëË;Ó„²ÇÑ÷×ðÏ^;±1ßë\aÜÇd©&+Ò²bäbM“¸œš5‘é€wTºutnO]%}%Õ&ŒŽÍ>¦ÌkF{º6AŠËP²[•ûÈqœB jEŠ_= }¯ iÚÆ®|?e‚ÕIþ\:’?—Y‰&űؠ\DOJW LCãIY@jgmu ôLmz‰À…‚fjŸŸ£ëWú}Ú^þ·üžmºëD~«NK;|/ò(nØÅâ~cƒ™¦íg|:\MË»ÕuE;£»ªK‹pSi·g+:UWu@Hœwµ­É1û¡ã^$àHmMÏS¼ç½igcB”âÕc3—Û—ËS89ehÃö}ÑÈýŒ¬½Ò³r=dæm¤›‰w|i` Á_kž®#*tÒøÐ¯ú¦ú²,Ã:Oè<ó<ù5¡ÿhê‡ô†*Ǻz\Aò3 _¤ß/ýAî׸ilãg!™Y "¯Q«GÜÈ¡|“¦—áž9‡³¡U¤Cæƒ+,X‘ÃØc„‹ˆÜô±ÿŠUºþ)µûèÊÈWC5˜²Ûºú  î@õ¢ûK 'H[†¸;M†›‘!?„kh$tk} oòÍÐ{Ág-N"…PoFèêr0pž&±ß9Ú¤{sÅÄn*§ôÆ<\I×ÂÕ„…?÷Ý¢˜ƒ«zyUŸ,†—Ko±j,鬸G ^/Fo¬Ž:½œÓÝAs•‹üÉòÿt Bp8vÂÄéN³™Ð p±­–“‹FúÒãCü²µtåúnkAxØâšN°;`à½bÓ†7ªáG”ND}ÉŸ>C¹vÌuÿVHùö‰Ý•ŠVß¼¹7Þ®øu)3<ÞlmÒ@©×fcˆàÒ͉Æü{¼cíÒ°%µE*°õ’Ä$ç²XÉ“zǦÁÓÈ™MyÃäíhÁm?›Žã±Ørœ Û³—×3ž@bê*™£ýÌ &ã ØÝ@‰—óxA óLÈ÷š` Ä×XÔè¶°©½rh†.‚&ëXú‘‚yôWR¢Ýjù«Ej¤œcÝTýó!Œ%è ›2­" |ô²çh‰އ)[¼X5•Hö÷EìW£oÛ¯®k„_;c?s¤S°Ñú‹ IÛB,–FüU]€#ç€X'ýÝ•ÊÉfzå5œ|æú1ÔË~KM3êžÖ8341ƒìÔœ)øž (ŸÿuíëyOü|Uc?M ò·îEòêæôÔˆÖÒæ•âöäÄ>úå´ÓúVâ1½X$·´<‚é?ü øòá‡,}«’k³» f —²Gh#Сj7;)– ¸ªé#ËöÚèþ$R¿Ù¢´4q“U‰¿å/Ö^Qb¯ÉÙ‚ä?•µí„ìö=§é\~ â¤dºíí0ñ{•ÛO]j‡þ•?®­æHH¨èlÂVÔdÀ-ƒ!Äf‡‘çÆ¸ëMTÑÿ5$­°ÏF 0Û ÷»â }@|,á>\„Gx0Édä뿦 ­¬’Q¢|y÷s;òYç…ƒê:î5Ù<e@1„¤’МâCŠ'Y¼I`ÚôgDB 4¶iêÎÎQßLgPà 0³sØf±Êds›:›j ÀÀGL¢Çâ#å}W ÷égÿ3 4\(T³ < TJ× +ß¹¨bjºFOè%„@j¯­1ý(úµœ.—µU[% d]›¥Þ¶ž»$©ÄZ£îº…T¿¦´Mƒ Ý5¡Ÿ¢~h¶$OžG)¦M¿û*Ùµ27ýëY€Tõs›°MXß©óó÷zëØÔ¦èÀí‰ÎÁÿ1µ‰%w¹S†W“­kx ÷e!ä·Pv³ÚH«cèt3õjÿtÙèÞ@EAÑ™mxz¬€Lào—¿Á¸<†ºHˆr)  2úÄf2V$ÃT£—Ò!j«CÑôÌ7÷>#+·ƒKA¶k§Áî¾×ØnËÜ™ní1 ¦ë¾R#Ê –Bÿ¨@È‹ÃhtÿG—ÈÖ*µÜÿ³í·‘SžîvÓÿi_ÄÓ]!aù}´ô5ìR\ >ÚìUÒ^ê|@¬=°îsx<ÛŸ–òû3 ­š×#ëSçäRg“Z£†q¼ 3\é\´Ÿ5íÆŽ-…“²Þ{°ž|‰MÍ)é©KTÑÚÓb¦ÑûK™¬ ¸ô,™›” ã©s WvØ´ÒÄÎDät€î½GIº×v15w‘§{ùNÙ ã Dú0=5ú(k$³wÝœ˜z`Ô2È6bÖ‡òú¨ô]ÿ_4Êb˜S¿mz~‹î]ºl³abžö2aÄà?Eð·æü§3:Õq<;'Sá]ås®€¡ƒrâÜ0t”q¾©¾û"äPW¨Œ„¯©L ƒ=­3ü,':RCNàá½E·Wtž&-]¾‚ËG³·QÖ:ï±’žÓÈš£ ÎD³+Z¹¢HµÆbNz™=Œ1gkÛÕ†çÜež_ßã«Àñÿ ‘ÚOöž¹¢$ÜŸÕð•H?'~%²&ÍÈnæb-?¥ÓÆ>µ95õG„À5 )¶2wwJA1Øas[rÅ•hÒG#èTì®t I|éæÄĤ'kìƒ<È·|U®êzxçÕ1×\°^$Ãü|—w“|úÿwh%6 ¥DçJåaòª‹„–>íð&ì$A;/Kð{*cÇ]´O”©ÍóèûJ Fy]ž…«Ã;=tãBù$1?ôC^ï]KˆÞé;@{ÒÛcê>œþO{Mi7¦ÏàœŠ-¡ÜüÜ¥ÈRB.'¢ûoš%B?Å_‹½wcƒÒ?¨7Îw3·Í+±RAÑå¼S+/”œ''”6×ÃÕêhªGÉĨž„'DÈMÅèªëƒ`Yß·ÛÒpƒ0g.2Д|®8XßUeÁ놩Å=üÛZìmJÐX-ýÃà÷zeQwø ö:&(WuU}@š­ Ó¨žæNúW=Vyææd+`¸Ö­žù¯Þ?_GVãP®<}Ÿaôÿ+K‘B—†0CI¦³ìlEæÆmÝà åÍ8?@ ¿)m¿Ï| Þ·öüB[]PI`Àæ2ŒÒ%bðÁGØd Dubn"¶Û¢Ñ‡ÇÁf·C¦$ÞTËgämTdÈqUtFJ¿T«H=1ñì¿êªŠ_×±\õ>:@¶kŸÿÿÿEk~Ûå §mXi K† ~e@§q&Üï6”಄†”¹’¢Õ¥¢lw xŠ.”V0ƒt—ÖƒÍÙÆ”ÅLºáÃiÌãôð{‹Ç,'Ý [à|bV_N'rnúÊE¡—h“·%Vt¨ñ}]4—+\8ø#Å«äÁÕ¦ïÃç쬞÷ÌyLHŠBjäè¤s¸ï¢7wµ¥^Æ—Qu$ï¥|lýãú“dÊÈ"ݲ—s©Lö3(È>ù¦Îظ†4ÌÒ…e•†ßŒ¾c›ˆ)P¶5pR51Îã¿ÐY4°ó1Äô˜9ÅKAˆÊð ?ÖSçCÕUÌ{ —¶ýò{ÍF÷ÖCAé7¼S9)‡…[I¦½õNm€ÿÄm¨§¥Y´¡ \%± ‚z7Â1çþê†?ÓyþÃk$>¸‡éUõóòÃ`¿!Î’qHÚAõEÃ/Mè ŠWnÀÞ”Z;M•a#ƒŸøë`\w1´àÕðè•‘eF÷HGˆBž ©ñª„AN}u÷3Û‹F¨ƒkq—ýÊ–™úö<“)©x¤Ú - 6¶ö:XÀnìÉò_*§¶k'©­o(>†Ïx*®Ãa ¢Ø$h`;»®ÎÁþÍŒkV dmà<ÎÞð“ZFy,À¿U‚ߟê>$JkA=Ûájp¸µf·Iµx* {÷)¾y|…™Ñ˜:_Ü M]‰MBÙ7åXhëR4æ¡]2Sx Ý8í𩽨2\ÜÊ_¹d7Óû‡ú‚´C`„tÖuQ¼sð»î©§ötxGÜê^åÍ„ï” ~L¼0|…¹x^ÀSÊP–|1ã#Çû“X])R‹¹3»6ðÁÙj}¼F·ü8(ÙKÌõC.Ôü˜vº»ÝÀ/±Á[àëßþ¹Mo#ÁN±ÇÁÿ;áêÔ|J€â!ó}‘‡W·6uûÌ+ž—Ú¹l|~=5FúNï ,›Ê4­~aD–‡§©ÚÂ^ó0Y©›qþýžJ'Qv†M)¯?j¾QîúÕ²'±‘+å\Ž;Æ4çj‹ÿ“–£KùŠŽ§Ú^ó Ÿ×feôâX¾zƒÜèöë畾7/LDäµnmÝ]ñÑó`"|İ֮ƎÎÔbÖ°äènKiÔz~if×ÌP+¸;©©…$ŸÖh«ÒUZ:û$¾ÅŒ_‡C°aÕýÉ~äéœ,š! À»Š/AÐA†K¥á¿â{pµƒÁ³ˆg/«ë?€®#@¡9£›À+rOÕŠÓ«"…€Ñð½ß sª×îÜ;•n3ӂʪt!ËR¤É¦Hجhƒ ˆ lOú‚¨ü8Ä_Àgþ7x‡„íxS­9OËò±GJÀ°@ÇÌ+øzãz‰*ÅdSd·$÷†&<Å8‘ú}çáZ%‡Ý[\ )Í£ÔZiÊv®‘0épÎáÃ»Ž°¿†%ÁW?"ÈÎØú]ÇHYÉZDÁ¦ »±1 ´=æ,oOÕ²ÅçÕÔsÄ„® ƃÙ}Ðþe @¬ÜJþ ¯ r¢—2àgoËt«¹ƒY½Wº_S¤ôŽJ¬ña{Œ¦”e¨»~ª¦gþ°û=”1oF}+LkP‘^¾žMá­ñ&¶I)S(€J§xÃë$šiK¡G•D*UøØÊvçCÉ€/„8%Jåö L<òc€_".ÑòdFëÙF'5r]j±0 tšàÈçKÒÚ¾ÂqàwÂ4á‚äðŸb ½ˆáÍd+kKvßì,¨Ùºfù~F—ÿA‰ÁúçÀ÷âêç ×ñ p8E:æVB_ ) °—‹KnqÆûi¸Ð3ïx'¾f«hú:uš` –ÙÂãY_°2X(¤é~]¯~•·N¹ßƒx‰ƒ{øÀ­ g¤ÞšÜWг¡û4Ñÿô½v¼ˆÞl£Mðá3¤ÍsaŒ–›¯,ØEoå™ê•’~£cÞ›…(ΖTÕá·vSÌ€%¶°>$Ytþ}žÚÍ}vˆ¸½tÅÞt”,A¬\ÜP¿þ)“ªª©ød˜'È(Õ‰‡/÷‘.Ý$¼~?*‚š`°v}ÓT¥nšHꆈ®íF¢PÊ6ÉÏ y<À RÕ×µsg lÀH'ñ«™Ú\ùµAVnNŸÖT¡àÿH±®Ü|I¤‰‡Žý‡½cS_]}Á1óEÖÄú׿dÒÞ{¨ÐˆÚ;|Ù‚ }ÏÙ×3]ìk«ˆ˜Ê8HTÃöý†4ªèB{ŽLLdjüBÔvè%élº B& Œ*ZÍ‚‚ab ¡§Þzǃ¸‡.ÌÂÍêÕ Ê}7*E®×¨^G«ª…çn»~¶S§lãSÇ2›ïi·ÀÒÛwËÚëXè]„5 (BÒýÁ¿ßv•ó.ӌѲGÚF( ÆšFªà©„†äŸSï—8]áõÜòÞ€… ö ³éeF7êág]\àfwœ-è[×ÊM¤Z«/ѵTžÉÕ‚\øJ£Å¸1Î+×döbÛ0Cº§‹oñ™+Õ”.å\aà¦j³¨ú}{¦/ÅjÕ–-€˜Ñ5xÃ/Ô­iÝd„…ìàïÑÑ5è¶@–öS&ÑtJlŸÏ92ëkÀb$‰—9(èì.&AU7Ȉä×S¸9hÖïmô px¬êN:1 ¨ÇLY8¦Œü§¶EÄì.ˆ#žºæPé•V¼^µ]âóu¦òQRÀÔò„- D¼!B_eÓÏqpl­Ea5*ÊÌ`NÝM­ÆªS&XMY»AQ%q.OÛCûzSË W]°ìr­'­ëÀ¿À @_YÊõZ=ÍùQƒÎ#%Ÿ¹SÔE†=l•¤- Šo \°èbmQÍP¢Í‹}­çÿW èégJ{úeCïöÙ)Ÿ¶ãóó…ŒK%A—ÆâxkxïgÒ6‚M\ÔËiü ·¨™7t}ä1ýŒ.„,î@{ãnA©Wv÷šç‰¾Ç¯Ðu`6¢ˆÈrFW ž“fj"HD<Ù2KªŽ5OTÏr wü"à-ê2éŠèÙÃ|EšŒÈMÍðñE[2ÆB –èvPc/HÇbªhÞT$fÿ©¼É)ʬˆñÕO¢¹¡°¡ò0oH*'Ÿ1V’¼ ç¹¢„ãä2ˆÍ™&©ë.ñ øÊÒûΟJç˜Ö”áïä²I‰ eæýÑ÷"*œÈ-ËÝW]S-%,øpõªöÄ›TEñhÃXʇgz~Â2á³qÎÚh1)ûpÚ§9¡›eëq“òÅ}7NÉ㣇5‡ØwðPÃ>„ir…‘Åæ×KÖÆ¼ú$íôÄ4J3ü9 Ýî§`Ô äMÆ=G÷|DÊÄ€ö÷Å= í*pýÄ·0ù†â2æ¹YT·ŸRS\j‚UK|>­%ZçA~LàæµT~¤»ò߬Õeê¿G1ÿ1:p}oV‘çƒ!f²6ØÜ/èƒmLÛ‡ZÙ^ØÍ²š‰Ê™ÒŠH‚_ÃÛ4É5É2zI~;MØX…ÇAzp¼‰{U sgÊúÂâUʯÆ\éliµ6gâ·¡Rt­ú³ŠÓIEé@ò¾¾¬§Š×^Z“Wv%êrÍxe° çâzkD|d替›"WÔ‚³H»ýê¢êaƒ7—ì}Å{5sIdL8u 6`.†‰ÏìA8E1o¤0' Z¡­Z{×1´™Iš£=x“,¹ÓòÞ0]›mô½½«mQz1lÿN3vñ°(–Û…ûVבFÊ[Î6Å»›+ClÁrŸÖ8ý¶¯föËßçaâÏÖ¾?@rRŠÓó›õ__î‹¥1óà¯ø³ÁT¼t]¢.*W©0^¸PíBfH¦Ö¢õ-+â“’"›cÐÐ{+u.ã¦üÀìæãTàU07lÍ9ìàËþä¯I*–ߨAL5Ë z£Î:ÏåääÓj=0‰,5¸R‡(Êß¹'N£§œHWŦ¼%cÝ€ÖT Z#@àÔz·ê[("®)º±yã|‹Vð`@T·úqOù®®rïç“÷S¼$ƒ_™9Æë¿K÷&Ê5FûM¤T[DFÛÔlú¡´É:\ªAÎáuJÛ[¨Dáò) ‡â—ÃWÄmä¤ÎúçëÚUÚqÄËoŽ3mý PÕÉqml}y%ŽòH9ý¯Æ¿ÉaßR½ç@¨àдih‘Ù«çYzc¡´Èô»sìP=öùü =h;u˜ˆŸ]æù©rðKÖÀ‡Cê×Õ_´©Ø«~Ò Ëæ2”¡\IS±6Íþ}£ös{G`®èYëóÚ®`cÊM*ú£'ãW nBnÕäòD+!“®VNVô,Yq8_i$–”«Ýßà?Hdón' ²‰ˆÍ«ûTæ{ _“»sµþ†H) Å7­¨2¥-ùQà ?]©k<!±‚D."u£údEv1ºJð½ ¯—3M6AIÝXÀhþG\¶H%wÁ+àÑ(@GØá%†ä3ú`»ÎR°`Ãþ»ôÇë…°¡êÙ4‡H€Ã±<úÚyyö‘±³OÏëÉ+yªŒ5Yß_ù¿G8üãíâçoèû²Õ'²„£ý‰÷õIGÓÕ€`°0ÏÁ }³$-%ÔËcNzuË6ÙŒƒJ.î“Zè8k.óéteyÀ£…r>&uÔ V1„|°²1§;RºAëeG4T”ŠXy»]ç¡5GúûÈ*žºÖÒ¿ÇN¸_ºÖa4a’Kˆ6˜Ã¯”¸¹`¶ÈjMÓ¸Îý³u°d?R ×÷Ðxê€:¯= kìD’þ‰B¦Ò(óé9‚Öœì –¤+ü £Â2þ²ãG£Âp§@T‡áêéqƒfÍïY‘²yÐa½™â\']h;Çø×Þ#S]È?®‹`I©ÃÑÛᾂ»U!ú#9€úµ¡(…œ@x6=Ü ˆ‚Ê?Ü>¿Z^/!«EÔxÖ l÷øÌæi=°´¢áW_†!×!¯ Þ·oV7z¦NÍÌŸŠŸßñ©’n½ŒG-.½AZAòðÁ6S OÍ,Ñð\—–rRßK<··°'˜h" PK¦øËíV%3G¬¤ ÌàýŠÇI'þ ³+¡h²;ÀJŒg'òÏžÆ? žódŽºúäN=†Y&ʽ&hIQ†9ð;~ºÒw}O“sO±ÐöåÝ;q…‰¼}´Á3¤`ÿYuõzdLµ8æ;¿ë›3º¢È£¿#A{ÖIŠ2=cF Qí‚Ø·ózWþå•©˜PúÍVᤘ[Ñ" ¬G¶yÔÒ̱Šàªìár é]+xð‹ï@*¢1ž•XÄä1’Ú0qÑãÎïþO#-`Ú|®IÔÕ®“+ÙD=ýˆ9¼ØälR…¾cÄ]š¼žA*œgõ]ºsþÚ^¸çÜòãÊÐ;nï ×SuE‘]A4zµb¶¥ó¸‚SÇ¡.õ!®>ôÇ0Ú&¤Q»½Ê«qt²¬L™¸|ÝÎDWIšðs”;ÔFSTMÎc¾¨l²¾ô½oå+—ÍXü29vª„,Ǿ@º¤­Ãdˆ×oë«2ýí©Ú0t×¡ÝæÕÅâ“Ê)ûMÚJObà•3üñmê:ݜ׺ÆWÆ|= /LŽ¥…ù´ Þ&YX'\£/"×ó †D>KE‘;ÖNN“b€­N[´m€€åööü:>¾Þ»?‡H8ý½þÞŽobß·§ ?o^·¡OÛÕßíèlîaøÂ¯eÇ?;v:qÔŠŒUdJš­ÄŸË\kƒŸ8B n¥5óQõ¼ª‚#XR‘»þò©«±”ð£ÔÊ- p¦{]D&E5ICMu è픹ÖåµK»˜"Ózþîº-—……öÆÈýîцDÎ>úé/ž×ÌJŒM×DUØK±$O-;–àiõBÓx]Ì Œçµ ·á2F±„îÕ¸tžONC'àv-ØñLÊåþ%# Yo=Ö©ùÀìºTóø`õ¿¶d"×£½<»¿¬µ½@£#AyÿGÉ{U89¦œšÍ•Kã®tm¸¯Ö›§…ÿ?%Q—˜OÕú`øøF€nŽû&# N3„À†oôA^eõý[’Ï8>œÒ˜ÛV.¸c)3 ŒºŒÒ7,Åö°K¤ÊØŽº­¬O´°¯_êØi¡½¶„rï°¢7Fö³’<¥ûJºM&y¢ˆØ‰ÃzÅ®%ñ Öƒ’‰ŠðŒ‘²5ÑG¯pr…{÷2¢ý½¡6…ÅžVäÎË[»-Õ‚™n{êü÷X4n¸¤%Dì‘¢É׸ãµ{íÚM° òÝ, !»R›lÝ>QV¡ÕÈ¿äâ­õ fˆœíƒý¶ÖòExÁFó…\ûÿÛ~B\0ÞW§Q<ílîP‘kƒªn½ "áxmÈAÕ à1…Û¬ï¿Sì#›R<t'ÀVªæQïå82ÃêUñ!]ðÛ*‡ûóŸJi…3;Lý–(uç>ãÀüè«w²H¬]¸iÂìc&ÝßÛôø:Úc$~õkMàbP²d#ÍjØŒb桵âÅÄŸzׯßJ•ÆHHünç‚X ½{Íf‰DȦfRH6<´™X6»‰ðÕ‹…rO´u ]ílÅêf&ÜúSÕ>RYçJì[ßÏÿKð;Z=@©A[)^a`– ÆþÅ¥¶ /Ê1;ô±þYwä"ýÕ.ÅÑ{â+ ñEyèeq =I6ºSçëSoÞNl;ù–y²Ô Oˆý]è5¢3ÃêüÑ~L²†‚îÖ!ŽôÙ¹ªw/°U‹û«˜íܪÈ,+Mªj`n4ƒÏ(sëM ¨W§ƒGÊ^lÕ‡ÎЄ¹-Ÿ„³CEÀØV•§T3J±7N§OÌŸ;Âà@sŽó†wMCäÖ‘_4ÓQùðu®žk]åèMê9Ž$96ÆkKX¶ù3£èò-ík!W†éRᔑsE¬nì`K3À (BHiHrT‚ܘZXóˆx6.3?°Å Ú*k,Ñ‚RŽTË\ÚëæU6%‚ïÇ S*(1¸(c¬‘8¬ú­o³‡ï ¥!auW@%¨ù®ã3xEh·¦ íßÕîifk=ø)ëaP•Íâ›çf›É™@©/{²‰°ÍO|›Ë3úŽÓ µÆ~«*Œ•õÂGÙ¯‚ùÓÅZ¤B%õë&˜œ4ZíŒöºhgA•ù±#™…×€gЦ!Ñþ¡…Bwtr:D½g2›(r²-ýþ;qлVfØ´BT–.YÅÄ(]`]Bi—Ÿ?º=œå£¨ûݼŒ£9³°p3*©.x}¼‚Hs‚ÇU‹¦Ú¶a¾PEh´u®,Ô›¦ƒØhúÞç7~ÚÐi ÅpèE4ƒrÕ¤‡žÖ¢X†_å½ç1˜,XýŸp‚ä›U³ç­(¢8û†ö à'V³&‚Z –!CG–XøÅ¤F¶Gõä›6'Ö8°â}Ø™Òïö²¥•9†j*wœU}îàFjÙðmèÂ>ÁýŒèä{T.;ov2$û’´EüŸü íDà‹k_ÉdÄE`TÖ¯ÛOWxã«Öþ+ÙÁh¢¿Âª¾û‰Õ°ñ%(±Þ_5MiöÉéσÊ4t-v¸År(b¾•ØKãð ñHfy¢ÂÆ“ÁaŸ%N¾¦Z›“~8Œôʼnùä„ïþýÄ+—Ð`=\¤¬BùÆ=±"¬°™cì󉽈,~‘FÆ#-póÒmAóHl’w½Øùßl<8õÒàn–´yüÚ_µ´‰u(š–R$‘7Ò² ŒÆ³“ƒ €Ò¹G—6L0oŸuØ“‹&g»ÁV½w{EÇd„ØPx³ìº;= ÇÀ`Út'ï\;ѱíh ¸}xo• #Ð×{ep9Sjähá[qÊþ¹ÔºP_’p;&D’Bßèç©•30`Òl6#xþ!'冾ƒ^„”æëøƒ0ÚƒÙTñàg³mPî¿QÝÂMx@„aÓ<‡”ØŽ—0ÔJ]‡þ75kð¦è·¬²hÊJ„ðb~<ß6glá@½\-A¯jà÷®£ŽŸ}×=€8á´Bœ^sh+Z#ÆöõtÍ~v'º™P~HÛÍã¿øª-èû¡ ◾əï;š¹ø»!e4zâ.l¥H6€‘`­?}-…1 `òÒyÞjà;¼!Ï>;­G/Ø6=‹>×þ–³,g-ocêaô_ŒÅ߃5`D?úAtÚÕf¤ÿyêǃª¨WMC4ªëɧCïsâ²'Y$€7ÙÙpû0  ÊøSœŠZÖIk$ì\ašÑàNˆCŸÃp@Ñ{ä?~:{_Ï¿ð’vDʸyžbߢұ¢Â8ˆµ=-Q¸=E@1èœmùaš^B)K±×ËöÇŒB•oÕlbƒ1ç­8¾U+“#·Y̹リ„¥Ã¾:J[ç9»3–W~Ø’õ”_¬ÊÁ¤Eè„–ù~p;vº÷%ÿpó‹§S±á½›vBc1Ô-ÞHÈN%s¶“&3U£7֌シ §„tiÙóá{;_ýTÀ‰­rÈ5€ÂH†ŸF‹eB=pÇG”ÂÍ¿%hÈUqIî˜r"n Ã0ÍãzŽ7©—›»ÁÇlD›5×d á#ëN™ÔuÉ!’àÆÂîín÷ÌÑ»ó×¼O½œøXfAÀ‡# ÜUƒÈ‚¿Tyð´ÖåÇ5X]ðçôg7ÊÚ ®—?*½ ½LîÞ!³AØß— T,ýS(¢óÉí:ñs³Õ¤ÃÄ;!¬µ|3¼è)–%¸, ÿ/¨søÅš¸y:ÆÇ@™ ¬Öµâ—ÖèZ*”ÌÎçâ>S®n½6áYq£^kï˜ZÔrU)Á &8_û)L_˜ðÐC"ðLT8”ri„jTH'}¼8«ûÚd–0‹þ€Tùù$ù]ÎpHtƒhCðàÍ¥à~á¦rð›M¹bVzP×8éZyã KÄ‚íÏm+w¯ õ˜”™µôJ•ÆÑ9öÅeRHíw örd¨‚ÕnX£ÃIÇ.Wcê…jí¼½‚ &µNsÔüGž5™¥ðcÊ̈üÏ7.`†jEð8Ÿ"‰ú»£ÿ;Óp âRÙ<ˆÄ@K?Ôžwâ­u¾u  ƒÖ9‚Ó¾ˆ¹ÐëN‘<2_ ³`]qcÒ­âÝ'LÛ$‹\A§«£”ñÄmÎë¦ü¢‰Ÿ!Zm-X,Ü` ôPõõÍf %i‚”ÁzÔ°%*g™±a9‡®^µÐ¶æÐ}Üd¯»Äû„n±qQ­÷@ú=¬$²ÂWO(˜:Eð)AôcT¶ùnïðÊ9Ò­äù"óÙñ]›ìwý¹j}ˆ,8¢©  5C€©É£³’g!†(>\:4ÂóYë|÷sâI1û»·L[²Ûá×ø8 âô>Yd‘O«g3Ô«‘qr¿ó^Lú™¯¦•Œ®iÒã'ï¬0&¢½¹Zž-b鈈`À1t÷ŒêžN¥ÈU§YRzeÉÜÿvþ~›7]áqh/X¹ßÉÔÚx íSô£˜ÑÔÑxì¾ð·u©1¸m2©*MC™u OwËÖðŦӘ÷7î#>ù=~lGf@Ó® 3[«Ê•D¯¿É*Ÿø*ÜÄ»¼L¦ËË訠¹¥"ÐłÔ—&(bwA62--Ýîíô 7ë›8ƒL½mAtÜ¥MÞ‡©´èV3ƒ‘Éï–]åCɽm>3;[hçѲ]º6Ô‹¾a†\dï×ïHQU„c´ãè*]«-˜iêÝÁKLÇ`@¶áXéßN!e¾X:þ– 5OiAc‚S\“ÝÜ÷ç|³défâCjIL£@©Œè|áç±6‡kÙO²ça²…zÛºA±)΄e>ñ¢_h³¹ŸnÒŸ>™b¾èY7íú>‰¸0cdדמ +ƒ‰èsã÷=áÃ|Ï-çõ}k ‚g¯ëôjÝ‹TïÊø¹Œ³ÊÝÀ=?Ðoí_Ý-3AÌE,ú2&sðËà44q 7¾”`ŠQg¯S~,Š"ÄŽcÀ…ÿH»‰c(Yú6—R Ù!=ŸÌ·³8šÞ^¯¹‰, Ze¥n)º zëUtŽc<2Ü! –YèÕÖ¾núÓ‚¯Ž-j/Y§z#5J-€° °Û¢,–àdÄU¤Ë­9pÜdUÝ]¿÷r-+Hý§He#a}h½¦Ÿ>8ž y’Þq=BÜ~ɵFЬ·<¡qp¤:| ÎR2˜Aᜩˆ)äJÉ×Qª €à5þÅh|C_ÌGšªo™y WL—Êæß15Þ3–çeË YzÁšÏy…FŽÔã¢W{È`ů«æìúî®K(g¼‡…½,8(1£vôÏJU½ñà:(C¹\i!¹fž }º¿âó÷Ð*:Àέ´œqÁ`†[Ð-ôH–ß96b’’ƒ‹Þ‰”Å—’(D¦8æ…ƒC®èŽ` -W+ciÌ9^˜ô½÷@ƒVíDù“ @ÂøTZLÈ#ʽô,vt­”NÇŸ)ï¸ä¦bO‘Ùp›¤Šî«¡Rhßl4þà êCàf¬¡ÙÇ:ð¤ JËQá‡Q6M Ë~ídì“zËV»ËßüfDûq[të:qjF§NíjΦÿj[ÚšæžÖ'œ 0Z?Q&߆·=‡Ï,L"ÚU>¾þ'(nØ:5ÖüêzË,¼Ô²¶¹È k½?x‹¼Î5›Öd Zk<•Î&5*B톥T8%dhÑ`R“Øð½œ wlQR ‹ÇÍ=½#Íÿ.P½tãÇA¥Pg6”5¬ÿiÙd¶fökÖ‘Ñ#q¢nl[º¢íg3Ӽϔ“¨þ§¬]Éwl¬Gbܯ$Ûá“c"î­>øÂ/&›œxj¬Ö¾GÂkÑýzK•ƒ±…î & ‡@Ãâ‘NsÅ@°“våß%mxœ°Ð‰3 ?Ŭ«ý@©N¾ Äòµ%sûÝDxð**Í„}ôÞ8Cè){x‰‚kuÜzo#׋s¡wò4Æy%Uª¢©3cöh±B_™‡€W¼~^ihõ–#(Øy`“ÀF|kû!š¬Ç¯7ÆÝÄs¤¨÷ël¨žPP/­ ÐE¾H1˵£~§œz†Œmõl²àãT’·xlÙ<áÆ-*õu؉ŽiJDÉñ¤¼ˆž¨ëHµ3aó¹Õyvëúß.lŒ¨‡È¨ iÒÇ«ÑÃ,°Æq¥XP]Öüúås•A&µ\¡,<…}<ѧwWªñ&œ EøÕعJ§ò¹ÕEÁhŠ/Ç`ϵ$_'3)A ܤtõÇ dÇýÓ© ¸Õ½ëö³#âö骰Æõ•xdä}_Öîÿb1¼øA-ÏB!¸u Ìál®êdš)ãYìÜß¼57ŠMŒÿ{»õ])})*ì=–œÍ¬øsì°¹Û'¡ ö»bøð¥o òw” Žàù™n¯EüÚÅfÁ¹9*A„NîIJv£âÚŒo´ùž^(9ÙØÑ\2—]R}Â24êêá䌷3’y; Ý¨"øvX‘J6±ßYÈNI©œ¨DË—îÎ3£«,Õ®OäÏsæLJ‰Ë››$á´ƒËÀÈ äg ³"ìkX4WlVºË=¨°/ôÃã±$Ö»2ôØA’!~Ø…À-õ¯Õ=°Ã£%ü;Ô¼ÿ]|ã§ŽEçÚtãvØ3%Ö9%ß-_&zæ”öòVȧÇÅo[ÿs§]êÄÞOØ:ÆFq÷Ç-L1é4p¼˜—и¤Ù©E”MdÎ’HdE‡Ûä}GóXƒ³÷‹Ø]J£¶Z#>¹Jr}-ýCwŒruÈ-òôVñ/€Óm©Ý›—œCäàÿTHžK ku×›L2Û{ù ÑOZ…çd«'/MÖ5vˆÜÎsšN@aƒ.9+øÒË.[«“w>¸úó#÷÷ᢸa8$8©8ü¾® ñ¸¥ÇÿG›ª1üÆâ»úv-ìú+GKâIŠÖ§"‚Î"ó&âÄBêè*ÁsÖÕ9†ÊŒ’‹d?ú©˜^Fÿ]ç2–´ ®ôâ×K[D£üwœ4Tªû4¿3Д9U_9s-Tzh•1Å€”«ìtP2§¡Xâ{š7XJÈ7¦¹ýý 0EE­9%É–v Š [¥˜žøÁ‹|™BÃ9»Žqœ¬?ÝdŒ‘‘iå² 5G —°yHÚ&àâŸ5tMÜ–°žcªN©áð1AF?ŠÌ" «¥ßhÜLûûû0ƒ2ÍÉGpZXåŠ{áfwÔ¤@£˜\qÛ.G‡“Ò“Ô–ð=v݆ÅùŽ[Q†ÔÙ¢yaÛÊé^Õ5äP$HkMª’´¥Æ}aÕÇg„> ŸG„ðªbÓOÉÌ´Ä¢I.+¯@þ†"d7œ4¿`xW¿"N)—|Æg§=«KS6íL„„¤-óÁ񠯿²¶À¶›¤tóóà?¸ü ³r &¿‚-ÞÓ§n‘Íhjºy›ä™¸ÚFòÉ,šÅ6ØÌ`Üüß}/}ŽbÈ \Ýe à¨Ís8K ~3‰¡c½ç›x™kéÒØ­¥;«…äa¶ë?ŽõU¨ð–Æ5ŸÒ2D¨4Áå‹+®òeÒAñª¼2‡+õ ×ŸG¶þ§dÞ´Œ\lè;j¿x¶®¢Ë?FA@%Ül’‹XÄåz‘ÉfÀâT4a{çñí`÷ÂëÀ}×›SRL\#"ljAXö™BTïýû…Rìè§÷yú½elBK˜hwP•u<éå ]KÃfqâ®ãrÿlñ›-Ö×…ÿ ïSDÔT¹±àÁU — ¹H Av4ÿv…­™‚ß@×ô!ÊÀö1™@ô8± \¥¢,µ+œ?™0ÛÏÔß‘Ÿ­rÅQtZꥎ0•hìˆQÞ¦¦¦gûŒQÆ—ýØB¹1ç«|øCXcå¥öVhÓ(—í³–ÆvUÞ§ßÞwVj»ínTz~–Y¦îÎcê£#èµçO^„þßß÷Êጼ!¤r xß-.nb ¾ã¸øè Ç–Yý¨Žºv >qDÁ85jÝõ‚Õ@žt[.¢ïU5‘{éÄ‚òG±wϼâ YêÍnʺ€$"©ò8§ú!MˆÒA-5ÔÕ¤¬«bHwÐÅH@¸ÖÙÂÓ{¡Uß1 Ñ 'Ô«pç…ÇJpq½r`bÉçÎA•ï" ò¦ÏÇB’žúRöÖC%-÷ígJQÏ®“úH±§½lTµ F8ï­2æ;1¿ðDØÞGá”kJòs´ãH±ï1ÃqBJv¡Õ$JÊęͱÀ¿ÏÊ7ó¤¾ÔBÕv6Ña= pÕÌoäèïâ[êL6ÇX¨j÷0?^^’gÆ'O]ÒÞá %=^9"™§¶Së¸ï “Д÷êÖIÖ§™~ýWL„4¤F+kšT§­rçbB9¡?0ÞÇ’äš×—$ã´ùO8rýñ”¤=/kÑ÷¨\_÷ãÓÈ64”±@ÿz½Vº|œ¤xW ¾Å÷íOÍìˆ/é‰ðÚVº¤¾ ,&–ûfóšÇ"áÒ‚[ñsR_ƒ*W™ñâ’$cX¤÷æ®ôT(-6 aC¬î!~$åŽpP*Ð|òÌÚÃ˃¬€giPÞÌgâÔ’L´q"}y×™rŽvÒ$»<™@ƒ¦NpmzóJ…ÑälìsîKE‘ºæô)vŒÓrg“a~o™êÁWþq啞òçÒÅŽ˜Û#ßÙnsÜwû³Ï…•T¤ˆEÕÈñÇŠňê¼ÜÂÄ©<%Lg% µÃÏߦEŒNyR`µwËaoÉÍÃ&äB®E¢¶¸ Ùœ3«Ø"‡R€âº?ÓЗMs¥‘§¶ÏÃæFàW}•.Þ[]òßÊ—ÛcmÌþº\°‰£·ë‹ÍŽ{Hñg¥“ñÏo‚¶£öqÜ7#y¢›™ÚÍi<ƒa±À9 SÈRA¬èô^.˜'[È›ókJÑb2S”ŽSƒ€»)¶0,iexÿfíçZRô¨¡ò‰ ÐË‚êxx„÷8 /Zw€OS¿Ï4xl [ ÁPK<Û› `©çE™É/;¶R‡|¾d(R] -àVtNmëMІú˜d>X•ü‘Ðþ7“ä•îyßÖ¸IÂþ¶j[Uo±!ê‹k'Ò“F‡S›–¶kð±?XÔ\²p»Œ:³ Aç¿ æ9šQ€¨åÃwræ¾Aû|‰¨2oÉd)ؘùa¹Þ ÃÆ³–üÜFf Í|vCúGQÚfUfl„^ÒŠJ\ˆ*‹Øs€±U¨‚›ó®6ú‚¦hÎ’›s‚‡¿hÝ üõÃñ1ZÃ2ä@j®Y4íìÿb”5¹âael&(ýã8÷oÅìù¨^0à+}¬ÛÀÓð³ËIçÀüÑqb-¨ÏŒM%%,ܦ–ŸZ°LEû‚ÑÇâlîm%ù {+0㊠™è}cêO½1W¿@æB!zÏ »¬p ßŒ7ÅàŽ§{ÝëKÓ,Mö~Z™t}Ö¿dT btœ›"س¸W‹œº8«øOÉÅJqòÃbÁ^nüúy>Ìm™sVvŸ¢…A¦ÿT®Ó·%Úßî,\M R)è¾>d4Òj·æ@—‹ºît/I¿"—2^ ˆõ௿ÐNT-±MlOõQé¡T’Ÿkk>ÕiÆ€´>·Õ!}Ø~J«§ä8Z¢*|°4õó"×›û¬)š¸'Gå5@ç*=‘È;c˜mK ]µ.k:K¶]"Ô÷( 1ãx7¥Ã*%ü½V’÷< ÿÙic09# jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ "’ÿ“ÏÃC@+ÝÌ¥? ån«F‘t H"$ Ô̬M6ZŒA¨x=gOï{Í ÖÀëQm~ư[)ñZÈ#…"_ÄÆûÚü…nj:Rcm2pàÁ³C6 ÆíÑÜM÷^ɯãæQfMº×hãs˜(7‰I÷ãó¿µ&ï$ÁeÖ§§fzºë?ÔôÙm Zæ^/¿± dÏãÌ `x’7bû÷ûzŸâûmñ QmÄj… ³s)Áº«Uaû… &Å<z¬9ô`7ôÖ|¬û¥ËÆz« j|,!¶>¶À8ÿÇr‹|é<( ÏC•”¨m<7xè=½3_¶<.ØÖ ¬KÎé¹Ìê e´¼‘Ÿqºn€€ÏÃE€Þ”;2©'|ªþ"ÈfÅ-v¾áGÁ³P±žÐ5ܨr$Iï ŠÕKí†T •Ú(¡ûý!R_ì•ÓO­ªûã(”»›£<ö*ZE·¹*½`ÝÜÎ ÎçoòZŸ ˜þ³ ´£“k@¨=ezò ?ƒ\¯¦#kð”Ãà2SFá ã €Ó!ýHÓ9,™ÑÉ„Êr\Ùæ¨ÌÙPÅÚâëWvjõ‚¬ÛßjÆ+1½Õyè¾¥?Ç–¾ÃéÊZr5ø Rš¶õ’Š5Egÿ5‰3ˆÚ9!¸ZFrx­Ýwg_NhI–A¾ú©i´¢+P´ä}¨d§[L:„\7b»² >1ijœ3æ`«ÏÎàŸûÔ.̧þ¾|ÞÆüä,å;Ô÷rhÉéØ\°OÏß cåL÷>‚Þë{«µÑÎzöËoS^J q‹®uV“ƒŸ¶WàˆïãàhŒóm™6o‰¡byÖ¬*Œ¹öx«D½ú‡u Êݨ„Dqý#2ÃçF]Q%¥c…ÊÐNzŽIé¿1Ö:%õs¸}¡ëq2’°ë c®!šßòg+ú¹”D´*Æq3ʦî´ÖæKÜæùšã•]Œ>ï'?×±¡áÈì•'iÇZDÅG\~®!8_¨s-È>ÑD–=c¸¨Ž›ü¾¤_ymZ@†{C\þÒɯxòé¥=ÃQë1£IV=G«¹ó<ÿE —MÎtd×U@h_£Ëæ [ëXÃp4ƒÄ†Rr»µó0ö]ìÈ·Ó/zÇ“yïâE¬wÿ$¼wñú2iæ`ß,ãϪÀTÓºô‚Э$¤Õl;¹…Å3ÔN¢¾T;Æñ!ÑaàÅÁR³¬©–¼¢që\:¨ ZÓ“|¯û!2mLäïg…(²í|jÛwl{Üco–Ù˜@"cÙ/ÌÔc©Y!_{ò"]ä ƒáàN¾FpÐ'§ëT&—Óf‡ ƒV{4²ˆ·( ¾˜ÎøÍ”¬îmÝwDý¢"ÀýQ/5^‚~E#*>½¹?gžíVþ‹€U\Õ“¤4îääT”EÿH^Ø‚5ó%ö˜xæ<'ÇeQ—ýbñ1´XçÅ—ÂìïL…Ø©”ºà¢kï_*‘L™ˆ”ÎéªsáïÑQËÎE¬.XÉøA/ayR€€ÏÎåŸÝÔ‹µ]LÙ×?©þ½ ’£Ö¸`ŠÌ‡LGL Vçµ:  §5NS õž çªLDÀwS!©]*á¯ää_¥À¢+ñÔ"Ó9–?}÷‡^\¾ Î0S“y<àãçê^Z²<­~èûI‰xµQ–Çj¦>‡ÝºrM˜_1DÁ.êZâcKgå2ëøa‚qÞé3§ 'çÿkŒ}R=F°X¸òÒ+d| [h$Ø"X£¥%7%[U[1Zs_… ör7g'æÂ¨Ø+èWþöáñOøXYb?ÊkDð¡pƳŒßín‚bÅÒ;CS$¶¡+ƒYdVfDáìáiŸÝò²%bXžéüý(;ºE–Ñš)"èwe¦é Y)ææƒŠ3Þl»>º O0ÙS+ÜÏÑö08­’UÐ$žeŸ„B‰ïvÑÚ« øº'#77u–Zc­Q¡Â¶ì-3Y"bÔ˜ØXÌ®~Ÿ#Ðv³P Ö×xà}%@¬ªÆajn‚ÆÃýUë7ºØè’lÑ-l`s°UÜS혞ÐáïsÂAÆœ˜&dGzC©{3«6gñæ/ŠøÉâ —ŽéÝûÝð À=Pç2·f+í»`Á“… l?n‚ÑÈÞHKéΊ١ ¿cºuøzÒ5øE'Ž šj+J®‡·©²Qý.Œ»fñ¬KÊ’—¯ùòƒŠƒ†oòàÀˆÂ·©Ñ¯I»æ8û¼á,‘'!Þõž\7µQFùÇÖ5œfM'ŽéUŠ„ªH#Òç¬&báýõ¿’§w÷¡&9B…â¸Î{UFIø=¸>ñĸ%­õýŠÐôö²žÎïD–—5¨où§úÜÜAéõ׫5N-;»j¶ÂÃ$ÅlOïÏdA$¥T¨ßµ.'+ò3Ê[Í oÛñ‘áÃË—Îb[Ñ¢:ñÚÏϧ‰ùõ¿ŸRůÔ0Ç3(ÅÁ!U&œAª˜®4“mËwˆÛ¡NC: Me½sª0cÒÀßSlFD›Lƒû¨wc‘¨çÒñ›l“ˆ¤€¯î’ý1O"8èv£™.—‰ä‚‰6s—Ëz-D;m#©O‰Óqve— ›Q 6ƒØnsgÉù{„ÙïÉV{ ûµk GoÕ«iˆ$áÇL¹ÿ.¤ó ¦¶m-×O©Sá$*{¯‘vUåE”Èvúà÷ðúÕî½=} +Štð‚E.íuiÔß#Û=Øj8[%ƒî 靖õL×ZÜ?ƒâÀf[™’ »Š¤òìZUÂô– Ì5C|²¹Ï°éÞ×Ñ”ÈñúP-öÜî§_HÂgy &ïb•™IGN  ù«^çÈÁWÌY{ Àì.Y`ðí³‚KÛ"´½%¨ã‰>÷ý†º±Aù€JÚpìbVMŠ-~e½¹w ãañ ´f"ÚI¹î+&ý9â›Ú5#©[!Wµo†ÔˆQHýèäÓ EŸà~0\É`n\tf»§f›Þ‹²BŽ^ 3 ’f¬XïüÓ)X$|àë”k ðüÖÚ¼a+ŠY©vKÌíö5„ŸÌ¡É_$7ùóN®´dX>Æ.s8ôKbêêU¿vö(ܱú ß `6 ËJµ«®Û¶•4¤9¬Ð3dó,¯ ƒ^‚C`Ű”+®ñù© °Ý‰õgê‚ñD›i.["±_Éd8Èã&ÅØ\¼¦k»9çN޵п¹5Cg[A ¤º~“M ¤Àâ:dáÿ];)YÇÓ¼vø®Z•>¯ d~ #r³¹Þsf­Æð¬ÃÞy¾z<à5]aiâ XJË)úÌd8|l™QúéEÑ•Ò< UWŠÔÿ)]`dh§ÑE<ý¤X'`sC¥žŽ·ÿE°÷?»;÷%/õƺQ.kè‰(³`_0ò ”´4ôÂÆÏ&wxî°,},Ñc¼.óóË6#nÐï#ZÂm¹f"SgË >I'懥d$ÁÞ¦ Ĺ &A¨xc”ÛÅÓsþ‰ýŠä'ÙÙô‡ØoÕ4¦NÔ[•Z¤ëÓÒؤ8T•°$ä€:ÚtjˆÈùãÀìÈtëÌ…%N܈–%.µl:g–‚=NÑ¿ºî0c¡lÄ ì!償;çÐPvô‹Ìfàñß+e_hòEnô~inoFËçãâ^ðŒ˜Â³̧þ]ùÛžl‚-ô×X'X Üã;làé¤÷AWimÄ [ÎNÛÄ‹i£µ2Æ3x8Ÿ"¦ÊE¬Uª§n?iø¨ºµ½ž¹Œ?O­€…hè–€ÄלÌ ‘.es”Ƙý?JžiŸèÿ…y4Ðz#ìCŽ¡‡…v¸µ 6“frMœZb­Jí¿ÿ2ÚmsÄPæ#C‡Ñáæ,ZV„1~¯Œ ¸3B ñCÚñ’(ÓÓê®õ=€U%„³gï‘` µãB£ýmIUó¦lÄïh'ßõýZ~AG€ÆµX¹ÏlAê£+nF8C²~C®Œ`¨›e“`A‹Ùô7n¿œm•Ä” ÍÑ @W‹ˆÉjÂÃûî%ø:z*Ú;gŸÅÏκ|Æ\OçK0§Í«˜7§OÛöI¿ù ÷]Í#ÞY4ž`D-•Ò³a˸ò˜cÖ)0>Ÿ›öœÜà§’¹ûlu„woàÞ>òkSƒŸÅ#ÏF ÛšÖnô͈åpÅ*Ú¹ªWÈŽàšg}_Ÿó“ÑÎ kGdÇç'^_Űf‘`g¬2w-µp`Åàøýª™–f=‹OwŽâí¡7xã0¯kÖz ¨gÆ7;)i=¯¢•˜ãÙËçN«ÏÀ!iók¼·EkoÉ”­gDCØóH,¾ÇŸ²Þ}9®2I‚SEIª FÙdÂù&Í\gˆÁØ9Å*åWHïáD%B«€€ÏÏ¥øü:kϦÌO ® Žd€ð´*\‰dËnÛ\š×æ'¯Óe@m™ƒç¨rè—^îxë…p9œ»£û®£a l¼ýɲÂtƒíð`¼_ß&FÊàBÀÕ×ÙµÚð¼½ dy7OàçI&’qç‹ñýag¾¤mÉ6‹kxÒ©Î Rû£â «,¾Ñû@Ò2ŽTYø™·æ ƒyµ¬X*öÃqÏqwwf¼:÷ðùy3PÎ_Á ÆQÀ¹Y6E««·o¥}ëÚ¢ï¤QP’ff$ô;‡’²AL©b§Á ¼: Ò­®²dbD¡»p·°I*ÜWýIe$¦ X½ ªœQ”F©lßÊþýʘa‘uŽƒUEÂ8¤æuæ%" ºj.šoª ðž6Þkjf0¤V2D­É¹Ó“®­xÞ`éT´ÿP‚ÁD¥ü¸©ÃíŠSj74¦ §Õ»ŸiVÙé÷=½Ï"|ñ3£×«J²&Üç÷ìÆ•Öîª/Ô(¦|È?ë Ó=KÙJ<Ø×Ï‚l²ÆIêžSS7°ú«ž˜6jp¥ §PŒ6(0È3˜‡l¿a9=ïu,ö>P"3Pœ³!/Õšµ®/Gl5Gרm­X<•š5»4ˆ N>{ƒp8ñïÿ=øCoÍ1oÞæzn¸×¨ûËgD:RIgÔ‰r5󃃪*ºåœIs;yY$¿öÜÙLY=I­)$@Hk/Hyû»„¶ü³¬¤š½v­¬`~ÛÁ\UöL„5Ó½¤Åå–ý(„Ù¹»0ÁÌéŸÕ#iþ)À9ßÅ‘ZI®O[ö8ÐN¯b–G!ãHJ®JTD6³:šoÎÿ%QÌ=(àšÓ±ñHœs^ù9ùUï6È ÂRû^€.-¯®À?Q6߬ï.‘±Œ(À•ÝéœÏÞCÙ¯Öp•Á9—M¸5q8À'Õ¥ì&-Óœ€ŠÎ,¡ZçÀ¤ÒÈGðRHéCŽ"z¦í¢~Т¯¯ì&õk…^ÈP¿\XÞâ?GÛÐWfÐáYNM‰¼FJi°î‹“ɼkÈÊÞ¼Ï=þÁæ< OG¸Æ ý×xÇ•HöÞÛ!S?¸  „l &Çãh$½[©x³ˆ¨üWÉŒéÇĸ!…|Ì,|Þ ‡AP‡&^2S6W¿X#ד,¨ƒY[êdúJ[–$ÆãϽ1*î…¯ SL®Š4.oé9Muã⨟eÈ8Õ=#ÝÄ5:¨íçØ}c»]›¤¡µCÀ×NÊR ¥øiýÐ}¤ÂÏPÑZ4tKœ½lx\Õ5Wr©x ÅEh¦„ì£myKØ¿dI›Ab5 8²WRMm\sÓYïoÈ3fRA,,頶Ƽw€ü²B[–J1°vËŸTx—štµT æí£)‚^‰Ûbc¡Ó?*¿Q±ÅÈõjõOp7¶Ê2Ç#x¿8Cj6ó¿ÁcƃE'+y§}þa55Tþá‚ÎÅ3<»Ê.æ’.Ìš­¶Éâ£ßym€áè-$ˆ/±i<£Rg(áÇœ3¡KJíÈÚª`÷içižËܼ À¬3OJ(/*¼aûý[žþ~âlíäÍ£,²0=ºŸ÷ u€,À;FÓ@š×%U'TmwÒ‚à évôñ !Çð£mô¡³SðÄ68ßйäÉâ7—>±õã‚©)W[Šh£žª<Òz(Fbä,ms„8¥ e`Nuf¼/ð&1պܓ˜f/IA¬ärè²ì)þÄôŠbŽ6£ýfÅä¿]èkË”úÇŒ Ìž™U œˆ!;x²(·ûÿa~‡³ÕìÈDùò´ 0]‡"k,æ`…®oó0v™úÂÓø! Î\ÑH›Ä¯£bÏ‚)Ò9žÚx®è$býtR ˆªœÓ;œî¥Î̬8ã® ™Óôé™;¼.nž˜Ç-ÊÂ1@ׄ³ÇÁ­;Ë(Y˜²ª¨ÕDq}éšÂÂ8)?Ü“f:–ž}÷´ÝêêåR«ß0uÆ…QySMj+#ûv^Õãí×äb~«Xkg½<·»KtÁTdf6<Ó+Mb|]1*~–Ã%p£’¿vPR¤#æï4Ká?Ö,'•\_MÞÌâGA–³ e\O€©×ã”q¨1°Çeþ+qUJ¬˜ê>¦iwQùýx @  ’Á®–’w°JÑÛé^Øë…SöߟR+Þ³Ÿ© ]û«ú«60_8¥È3¸?„1¥a-ÏÏØB~~ÙQùûêsFÛ%SãɯÏbµ‹âŒ)åŽ[ý<ÒŒ§ ®ýÄË€YG¿±êËo.ÒùÝ9žiD} v¶$fì·M¹òHµÆX‡}ñÚBüv¬ÆÜÎ(8µß¿b=¨–òª{s¿¥;iý#t½ Ní(z=ñý4Q¨¢2_b”Õ `ðo÷çRÐÕû "•¹éRGÍj$ÞîIZñZ.sCWjSR \['}ûFÖ÷’+èýk¢êÛògÿqÍÏ‹Xø@5*YõÖòˆ®¢CÆÇÙÓM-R¨×xˆµÏônÍÞâèrFÁ²/ÚûEˆ£KKjP¶ u˜Už÷n´‰oË¿g^Û3‘ Ì™>jÔøðL>MžSt¿¶ÚÃ6Û‰·oÉÏšÞ[ùDRu•MUŠò@{îîZÂ¥ Ì.)ˆa* `ÑòGý¢à9˜šD#çw+†ê/ ~e iðų¹#~maÐS”A"ZÛÕ[Ê ŠÜî^ÇlK/ìêœ$h",Y¾­ÜéìK~1¨VºÇ,=‘: ¾Íl\âB—pð/V0?éWÞºB‰k€‹Æ †g¶þ5–þà4xâ–9òP¹ê/8*ŨIè‡ÀŽBvIU“ý_—ú@â#™ ¿‰M¢ô9n £æ;mðÅÐ@×XÎûþÉX]•Ô`ø±—¬ä7JÐíì-6§xmY %Å{°6Cªà±zËÙÖÉ×~ûq²¾=ð$¼å(³ö¶Øô.äÕþtîí|­Ô,¼õ€=um·¬ Ù¨~)n<+â¨ù+8m¡Éi[/x,œ¹~vÅõ¿SfÓÆ^ŒN·q#Äh^š«h±¥ ¿4¡¡³DY¾¿mK4þ&ST¶Ñhv]¢~–ÓkUšÔ]£¤QÛo†8Ø‹àe z~T}«‹"ân1ÏŠÌÑ'š‘Y7Åd¶jc›B˜ß¶ Xé9mc’hVÕìmÊ_ ‡óîyÝ‘¸6ä÷§ ¹×ª’$Úþ2Í´44\Þªy*礨Á ¡Í}O¸îÝub‹ïßg-š±Ä$ÑI¸¤–T”÷-cø_,°ü¡¨Üw??hØÝv˜ z‹B(;RÄlXC1ÎJÊÕÜÎôµRÙ P“I²´Ò¹G舠üR37âÆ ‹Âxq— ú*¿(g ®îl]MeÞL„p*N#–•ÈalqO¯NЄbÏÊ’û¹Z,’~æ¼+G08»ß`ª±@<æ¼è¯a4³Ê‡ùºÕÁ®¦ Ÿq/˜ev×ú[bÖŽœLn -îûul•HSË# ðmP? Ü”ÁadËôÁŸ+†)eø/ÖVRhÂSàŠ¢pÔ´Ïâ™È¦ÙÛm)­3•¶!6!hHÊwK³¾W¢A³ÁLßÌ;ô 12`Dg³#sÛþF¯á<:Šû.1ùƒ[n¹¡85~®ÀµëÔïä¾@Ùd“‡®BqwëÑ,ìì »~³•G̋䂦•¿Û„±B`ÚåÍÉñMqvÚ“þ˜-d±;¼ãDû©9Ø14ôAÜ…Y_‡õW_‹y8o ÁuZîæ!üNòåŒÏ1)Y ë¿X˜“qZ Ù<ÞeKùÍ>û–ÍõTÁ¼©ÿ Ÿj§pÉJ²6ŲøfÉÐzû,_;…°ÏIâˆ^‚Ûäà´n€&RƒøFôéâ¤`y I#JЛÈ;+ŠÍ¬WDŒ?K,SI6fÍQ¹«nËêÅ8D 'ÊEÒ(jbPÔÈ—ê›b)|jÄ%Þ-]Îá—ͳ ÒéÇÅ5aÆ5‚S`Næ|Þ)í®Ï$ñjqyÔîMœ¦«QC×ùïÇÕ.äÑ‹ÁíQË®ÝÓ!å×°¨È2׃)_]óß2Ú³ü:Q ¾PkoÆ1süd½w‹ë%éœ\ÉÎ\vG‘Í),DúÓ,(íàüî€,8 Õ´]ç}0 ÄK)È⊑½ß™ú/_ "êé4{^ó¯²×x×åžZA;IzTqÄÎŒ·¦½TPÂ-Amtx J?EKL&ºƒ!ÿÿGß@:˜ÔÖ£ÒVIg-gê6Æüb®å§Éq•Í8I'yà 5hT“,‚¹–MÒMZzåDZ‹Ç²Ûò›ŠŸ)åÌšt¹Ë?»ÍÊÙa„y‘6™"eØp~[‚˜ô^Ý›ãA¾òzdÝž ñšÝºÈ­˜I8ß’ä`ü&4h&YøÖ¬=ä8‚Dêþ<»QÎ78þôó¡e‡*‚‹–u:xš FqSS&BÖ6Å2wnÚAMïù?”àJ½ßHEü±Ø‹º«m³õØóskÃá2$’m[¯êžÓ/êÉ¿?7¢Éýä#mk4"=žPÈ‚|t°/;˜ÿ\êÔ9r^ÒnÌxývÕfq¸»ê¢» ¡"ðÿ´4¬™”xÚ§Í`½LÕ?öË ÊNË\¯Ü!ÌÇ Å”nà©R[JÁƒ`)Ì0Ùv½Þ,àô¦†vjÑñr"’/£Q½/ï¡A+ÈòÏ‚¸8üZ ®°ÊÙðwâåq4R“K±D.ݰz.@VÓKAì-2¾³#Ñ=M±<ßwùq‘qõ2ûGHS Ú`¦oÓŸ!«p™›žŽa€gËCîwž¡DÝ>Yy棟]Z1 u'ô€þÂgô£§bõ0@-à)»³aIj~w„Í]]¿>U8|"$gWk‹!³E*<´ç÷hÙhލL‘W‘—ž†¤©9b‚s„÷Ad9l)/fÚµ§m¡›SI/]HW ç°ý.C”™F¼ U€Þ€0 ÆÞè}¯_w7ÎP¹d®áë$‰Hñå|°q(N6aÏ=oz02ô»mŸ$M]õòz  ;ù)g€Ž" E^ZôAí‹Z¦m¦ün{µþʻՃ×áÓ´`QÂ<¦, Rìò}.%m|K§k明L/ÇNò/‚ Oé½`¤ÒŒ­ìt u'C@pÄ’'õ2#[ÁA¡zq-õ5óÿ3üI^,ßp¯,²$Çcö˜Ý×ÞD63?[j¡«rɾ ”ͳ6Pæ.…Ù n'®ÊoÌ µSª…æôÖr·K|’ÒW’‰øU›}á€ÂŠüsbrËUÃ3áÂ(á —ˆ®`!˜*°ªby`BY.û떠Å ‡a¨(PíßjóZ –†"„ˆ€×ïèl«ér­e <-WÓ¶š¤<Õ„Ó b·.' ͦ7×Àìñ0ÖËí}“fsY¡e‡­2 –oð~]6užèïô;¢HJ,Õ”öl5ZpJ,?¢=Ë' ]z²%£69æâ[DÓß6e0\S ŸúáS÷0üæzÏ”vXUµ¦‰ìÏk‹hÒ§Ø´åë—ŸFˆ{éû?âÂ:ÎÁúÚ(òE“ý8¯b|ÃTf¦[ÅJÀïõ[=¾ó—¬8žEÜõ…Ë›È›Ž¥˜]74[füu:Û™ð¢K¯Ä™é.ÑÉíHwb¬Ã ¬èËæï1ÄzÞ÷vöY¥¢Ó´ábvÂi!7ݨÝûK(½áI¹ÊkDÌÎsŸ<7× xî±a/¯ ^Þ—Coá {Û“³ù„™˜ŒtÌrFŽû7&Å¥U ¸ŠU<_p™ÐF8L~PµGÜQn£(ºÏÁ­1è£4ý » ø"©í¡&'Ÿ­èÄ/ú©žJ·ô]‚Fß)q!žÜÑÿNÝz…I}<…°ôùÇŒŽ«|;rTô鯠m´Ôê‡ïÖ’+ -bl>ðUDõWÁãDµaÖ1  .Ž“hA9¦1*êö ½"tÚQ±tziÛq3h1~çf!)òV¥ÈÐÊÒèø%£ëƹs,€´sCÑ÷”UËŠ"p½!“±:ULªu/â…&ÂìUq$ˆBçùwþWä|­??蘤û -œV‹òöòXâÛö¶ ¼h,kÂÐ#ø¢Ö# *eó¯Þe¡fû[9ˆ¨ßRh$„ÏOú  ˜eá/¿]‚Ýùá} Ú[õ’먴0„”¾“4yÕ×t§üé½Yzÿ VËNE¤F±obÆ&²Ž¬Bl*b›Eïý3ZPØ$9*ÓÚ•aAoõ<)³[EKư¿¹ŽÞÔÿ4³ýhóü’²OÆQn;qGkOxn“»g>¾@ +MÕôf»úkÈ7W ”ùMƒ†Ú¬òRÔ)Ýo̘Š+ã{дš©3šß‡Õmÿ>Èv}A©SFÇB*X9Qâ¸Î"ô/é¾+^ÌGb*Žù(ņhӓص80ÃßcÄ~%WUc²›)5Ka2 i©hÅ“OÁãþ7•3H·’d€Ñ<±Ÿ¡ïõ^¹à¼íQ‰†Ze:-GïRò`hDÍêg(6äY!y·vÙùÁAýðÈiKYåDçÂ`À7ÐÀ—BU_Ò¾qAø·Ùªý9œ¹—Ò§Úsˆ°nGc¦à¿k†¤¢«@Ù³Û¼Ùî´ŽìÏÊc_Ÿ®µÐ°I}öû¨¾ÜµExÑò †2tš8K¯Ú›Uôx™¸'sMŒ€>ºO? ’sxj[rîLèL©æ›02fÒðoëÍâ¤\íl;ŠzÉ8Ú=ŠâOê€ÏvÖbˆ8»+ôŒºÃ ö¬A< ‹8¯ÐÀìú Z}_~:x­¯²¼rX³ŸˆÜ¡ γ9q9“.†[ÌŽFînFÖ à–ü"‹Y å¦ÃžÑ åáB›NÍž n鸷9n $2R‚¥|ú!!gáõdŒi¹æ}ŒòØÍaô¾"eeϮ뉭P¥rî×7$Ð8¿‰f¹†Ø[ƒja»M:ÈÇžˆr³Xbì$Ë1i†Ýu·Xö †Ýd»üâØaá1î?Í!.zêOr¢bŸÚ;,ÏF±±©ÔbªëZc^5Ê1)´¿ª—°§,ØYþCοÌEâJÀyÅ(Üq+QO#rN6é´Õ¶³`³¥`èíË3#úx®˜.pÑ«)¦6žk±qñßmPrZhì:ŸERˆ¢E=4 /F"Iß3PdôºŸäØ.¬7´ä¹   r¡*ªUˈŒðç´¥²ßõ8zêSÕ`†‘$cæà?Õ¹gŽÿ°­È@N yšæ<).ÝæKØ3YŸ‘µ“7«—ýtX‚ /Û6‘‚€ÐŠDPñ%‰Ób¡!bž€Ÿw“y};<1Æ$YÃ`y!b`â¿lM´N†öv<³T|í A”Φh$ÓEÓðRjŠ?0æ~hàM N¤Œ§üŠÌyŽá±C~ÉR%Œ·H?|æADu¤þçÈVº2©@PѬ•V[9æÌVáÌ)ˉ˜§Cð§P¾Tœ[T³{têÌí÷‡æ­ÿ-Y§¬£™£ÝøÍ%è@?/£¸õÌåêÅ÷÷ÿ0KƒMK³·é»p/äØOý¬ÿT‘üHîÃ쪒Ê@·ˆœK›ÿ†WBp×½à‹IÜUƒu• -±KÜSˆçÃFîΉ €@Åû“gˆ{~× ê¼ÚFŒ»Æ|Õ¾E\T‰€r¯2Þ`gÖví=§ñ6u_ˆ‘3å–iOøšÄÒ®ZúdðØ,¸DD—°<œ2¬w+K$`ºÛL=$-)ðTÈ&hÔÎþµŸþ±8”*©I•dû¢ÿaÞBñ¤37ð䃕s£b~Þ|\pÕo¶_§Ä,Rö?{…¥ð–Û¯ -Y„áãÝ8>5‡p.Õ’(ÙtD‹Ç¨Æf’÷'¶úç胵"œœöuŽ ù·\?5`¶âËé~š4ÝæËŒ¬s„ô‡ÙÛAÒ°IãBÖù áϯ‰5?Ö¨‚Ûywã-ÍÁ6“Ü0ï-|jŸàG\/~ßqÔ჆«vƒjã9RöÆ¡iÇÂf´¿T¨Â¿ÐjðI@/•¡cá>_ ÑlúÁñÃOkgðƒoÅyâoÔ2ìhHÎù{GzË®Äɧõ˜ÞQ¥á[€»Öá»õ§Þ¶Òþ0¨¢uæi 1p~Å\Œ=,?'H·Â¾Æ;"Í3Q“ZP&@vÁf$ŽQÙ¤ÍÚAÆâ—vG8T./èBçUóIVù¶ûÎ71€¿tz¥Élôn½YÚ–)eùµW‘vl˜LƱ¶¯}gßÔ·ýŠwíбkÝ‚tT ÔK—Å{†(«úŸ, ƒxç–² Zw{Ó­g’Ë€ÛI™Ê&²ì„è¯?‘m ÉR–Ø439l®W;7~ªW¦ªb¡¦žXûÐl$q÷7Å|“ç-i(óœãÉ^¶Ñ²´ÜNi­(¹«_fº`c ñítNذˆ\AI_.E×ÐîXãËlä­ÉR> ð 0§ñÆ­h›¨‰IÄÑåÿ;×¶²uŽÅ°®#É¥`Fúöp¨ƒb˜ÂqÍ~ÁínÚ*ZOŽXw–‚”=Rœ ƒdüE¿±­ WV½†· ÷àú5Ê&-y ÔëY6)@e¿„ѵ" 2~Ö‡f :«ò[pdX,(ßR´—î6­ý·ÖWSK‰~$qñjsŽûú„QzúEÃ*A ™“KïLZ/ÉKÓj‘¸Ó¨;n?¯ø(dãïq8î8Ñß3B›?ô Õ¿ô|¬d¼–5€"\ºÅª‘ÕJ ¶¹RÕÞ0>g,JDø³{¤«7ÿF TÐææ’Ó$à ú+’³ÕÁhõ\g”Û:B¦*rË2d7Éð²ÝµþÂKS«ÁýDô£Ë(%}×mmñþ`ø¼è3¨DC¢|·ÈRc2«7Hãé’¥Æ5}W‡N­ÀJëÏF–Ù¼L|»ceE5Úö¸Å`bMÂ: É’=‰ó†ˆŸ…•ÔØ2iÜ@°e3šøí“(i ¡5?i£§Á8yGx–­ËwQÀ,’àÍæúʰCeìÞ|ðŽ DDÎî}d»–ÉÒJ=9ßÁå6Õ²Ø'!UЖö†6HÂÀÏí^«ÁLÛNÈL€u ñä'i ~«W‡“‘ÞËð±”t[øiO&upáÝ™XƒÍ–EÔ0>àå’ßô)-ŠÅíbZ§S«Åƒ;ô)ÚuRÇó0lÚÁ!UH ‹NZÄÐ.sN®EfäæÀåmG5tcäü>¦ KšG±¹yZ–ð~®¤|Ú2’·²¥çêTdA/ßh¯‘Ýâ5•›æ:í]M =P»§!ŽZ“xþv†¼~L@`÷¯Þõ\@¾—3Øó9"«ÜÀô}ÈÇKâ€?(¯t¹¨–—“¯¯dgûÕÖ^ÚFb­ˆ©„Ê C MMk˜N6õѾÿì:äSF¶?jnB€-ÿ,Â<@ˆqT|ŸóKœÌß·‘Tâ4ÌgZµî¦ 0$‰ÿªÛ¬ðzÿbÖƒ€®F¯÷rïZ;k;ɈÜ:Á¦ön²C£y”õóÕÅdA"I>S1CI\°y‚°&DABÿ-0¿f´C2€v@ø½£“~*Œ¡Êy&Œ^ÁO^ùBT4½ÈÁ§M*"uÐ¥ÃWkýÔ{¼œ¬â ³ŠÖŒÅ«rÏ>, ‰c]%Ókp=Éuœ°(¤Ýßì±ÕÂ|mÃÎ×6¬9 "«¢W ºÇ/˜ôtD{È× C¦5ef÷}éUŽ&˜dÉ?ãV êj(Â?…e~®çv¤™õ¹ È수3Õ¢2÷âw8ÃGd Ž“çª&9æ±erfÏuÆîm5ãûc‹^D;§êc^RP—kA¬S N²êF뉅ÔÎuÒ]ä›Gáóu½zô|ßöti5äáþc)EÈbâõÕ¢\^ŸCµç0 “ÿz›áu«ü±×»%¿ÓŠ_vZätèÁ‡ã8Ó`c ×ô~]¾ßÔ (Š^å·éªú b*`™w9ðúzZ‡…Àé:òò¾:2²·E=Q^ZŸ+R}83+¢Ï³P›a ÜdUÉêÂÓêÞ‰²jãluÒâÅe,á®~·º0®°æ“+$(+_ÔXôÔüÊ;"ô—?5w8±;ñ–ƒi Æ õ/Hj¢BFju¹XʬH Â9y#œCU0þÎ}’€nÇsnôèt.eú¿´™;Í„œ_/tfòè,ä^h;AFkÄ®ÇrNÌ:¸úöv çŸ-Ï ÛO˜»Ú»„ÑDüøì ‘„òÚ¾ì6zËšÚ²[u§õ¹7I«Ê ¬‹_ÇñÎó-‘Í6xÖ‚O`½W°ö™™ô½¨ô„yæWðcRÙâ"ju˱k<%êÎ:h$ ÒÖ—$5Ç•°9Ìã_mb+Dv×ZˆhN ØAwp¬J•^ N¯ì9Þþ¨R1 >æ\jM§[3Wp*;ºu¨= ’Ƹb¹q]§c^ÀYRôYšÛ³ÕVØ$éÓe šT ä¡Þ$E{Ýö·y…,¼¦ß+åxð5Šö/rõzÑÞ…㫤çx&Ó‚S÷oü hR+€­ô¬B ž&WÊ©»¢Ñu™­QÒ+ß¶MJýz¡ó >µ êzeÊÛ×¾€˜Rþ¨±?•i¼ØyöçNô×li©]ןa¶`O5´XŽCóëE¶FÉÝå`¤lï[/smø’Ͳ­'½ŽŠs¼6“8¯>¢'ëÜá`½Å}î§–Ù<~.Ø‹™  ÀÅê®7#"/*wÉ6÷x²ä°ä_ù²¦V1ž¨V]Šqv{Ök»’\p£˜¿™Wjb‚\9[YRUš Pl¡¯˜êl¼TŸ dåAƒ¢Ý·Ç¼Þ½Û´¨je´}&x(Õ’à–IgqÎL¡”k{³‰í;E#a)˜YbbÊG‹4·fi:¶úÑmpÿ/ùûÍDÇz­ù8 ¦ôrc¤s$qãdl@ÆÚ=[Cka9CcQ¸t/6³áêÎ…ð]á™ ¨JƒãOãøw­ü; þѾqü=‡i_ÃÐ#øv»áßðì_øw-ü:êÕ‹‘dF¸ÕÒ!º}Çä9ãécïøjSd/­fj†q¤Ê¨­_醽gžÎîÛBˆ_wQÎûæ¯@To«¾s ]ŠPWW>mÉ SÌê°Æ2#°ÂÿTÒgÙìô l}àþ²¢¶À QÖ¾0ÉÏC^³[þư·Äß bØ<ø§r­FOF%ÃÜôùTͲ;¯Å`mö=)ÿ”EifðæÇz}ZåKQ›Hxš3®©Pc¾å•)“É µø „™« zº`s{”®§6€ÁžnHÞS²Hž±úp¢¯ñ·m±FËŒ‚ûst÷w†]Ç*¾P Ÿg§x‚½Ô<–÷µšœ+Bf@VJŠ‘¡¢¾Â¿ N&~5ff¼Å‹FFSÀ5áyBiqñ½?xv¾ŒEÇøõœ¿˜DÑkÀCY¯;jÚe^ŸÐx¦šzQ³3â¼®§.ˆ³çFYV95ܱ‚¥´+«¤«ÏcÃ?(Y3Å.$\’W<¾ߤsÆX3Œ{«Ñ€[°pÿ€Ø£9à99A“.·`‘•NÑeÍk6mõ;( =QSÞ“V‡ò<¾›¸+Š\Íä7> ‰G¥u‡Î"a o¾½&XH½x·°ó=O8ÚÁÉj^Š|4½F»©¶¨ã 'xPýætE,\Òê]+7†óªƒò›e»ÒP¨ÝlS»69äðp8zÿsÒ—[ %> =«Ž“*ŠM1 ×¹ËôVXhÿ»f@«!½"LÅ«t­h+<ê¥è8Æéê\Þtä1\ô¤K@,‘GÔÀo\É“è¯_ãDätxE»û×oº±™ÙØÚ"Ïji‘=YÓ^㺤¾z2æå¤.©"ö:}.„‡k[‹ºK¤B’óë/)ðEb­3\5 Ãò„PÑÞfƒòÑ+\áx5l¸ ï¨$ì“zå_’ûæs¼ùuTˆeyK¯J-´ò#óøÁÛ=öÄ⢄;‚öw‰Ï‚Ýæ¾z³K^ÐAW>žzÞ5Â$+ƒ•œÆx5h­€GÿØ•þ.¶Ó§öøn1Ê­Ì/——x×cPb¶d¹¬¼£¹„fäÎÆü§È À—ôŠÆá&Ô¡4Ö.vZB%ðµÜÞô,Y7ÕÓV,I*Â¥B³a¸k¡5:K›¡ƒ­´Òl$Î}Š-mÃz?Z|}¤¢1,ï|VOcAYƃbäWã÷åhøÔâÎkB:—W½âÍ0ìÆ¾"uÛÄ/(Í3`3ÉvÔ[=Ûù+Îï/žÁ€…–ãƒÐߘ7Ïá9æòÔçVÛeäxŸiErÉÃ:-“µ1ª+xyLFÖé&ètñ¾]”£Ì5ÐGÞ #®#IÁ—ûCm ÍÓÞ³\Þ^b¬„îÿ2h† h[â‘3ÖšQÍŸJsh1 “*š3Ð!ž—»^ïÈ®éBª"º’œfï©d±;øç˜¦Ý0á.Ïr«é|Ú¾Ö¤a·$CÃqðÛl8½h/E[™™#þêy6Íqwêœáו¢cmXÌmë¹ëT¼´x`óöÿsHÄÇO^î2x>ZŽ+uîG˵Jãv¼£Lj5¾Á"g¹*Bðu9ÍD*ä´ªiNþ\XuN„}Å"Ä2ùjÒ_]·ß9ª%2  5 ’½V–Maa·Èn“ƒÃHPu\rÕ—.wèü›§Öˆ«fJO·9¹²'(¡¡ó¦¶ ïé"Œš{Ë€ç§ó³Z›žñÙ ò¥33ÖÒYÏ#UÓD&ía²‰ôζ«°õ\w—Ò6P½||¶hØd °áOш¡÷â§@m.×4Ûöô;_ÓɆàâ¶)ãƒ6{ Ÿøn‹ÿ K_ÿYrCµ”¸sžC—¹â?Ÿdàuv_Ç-›ÀÞ;ůÕS]v¦½RØ=Zl}RÀÇS¦,»eºýËטV¹VÁ8‚lžn¹”äè¾Ê™º‚<î{ð‡ñÂöLåÞ‹Ìiaê[©(sÊ0– ›A¦"ÅZ04Zç·¶7)åYdz¿õ—¾*(|/¿ÿÁWȽA(h2¶ÏÖ_(Ò£œ¦ºµfœ¾ž7v,ŽâšÁ]3 ‹ü/¶/+ÒS#Oëp1':öS+¦ÒÙÃöÊý0ÖWÙ°øð67¢J\…µ‰iƈšÄnVºF¢ªøÇ}Ӡ´L›Ÿ™™Fu\­‘Di[éx‡ÕˆÂ]°&Ç¥ «G =&|GS’JÄfüÀfëK¨-Â÷%#Ä Õ8c`å‡>déÏã{“Pcy­Då΢=»ù6»Å:ž°®î`˜ÎD&váýîôplÛ’º ·Ðáí¯D Ò‹|(ùþxG™Gçæ£7µÖ<ÄÊ1ÀîÆÎÚ»âÂÎTɆêxNuÀZ/oœ>‡9ñä™Ê¦TŒÇ'.™dÖ^žý½t™?À£T¥Í=—RìMÀFgÈ-j˜´±£Ô'è]V¿éœÐ5­Û?ªê”œ )»K„¯ ®{]è*Qß«œÐb›Äu„â .¾1BEjn»v9[÷Á0ô“ö*û…¿‡·"9v´—Þºá².nl%<ÀR¨zÖ6ºaêI¡ê ¶Ú#¿?ç \ÓøüM¬JsN d³«Å£hþþª¾LéIð «²zÊv0*ßü/™WnJ@½aøçÑÂIƒ¨hÂ|&Ò¿Ëø>ú!ñ¼3ØU €h êìO­‰4™2*›àoîËY)é; ¹gFrûrLÑæï`'Ãრ’ð܉ä\øûž¡9ÇSÒª]kx(¾]Ë4 †¡5d’Õ‰–áNÇg #l6QïùÌ/‚2}½ôÄëëW±¢vúu÷|0¿f '1´lPƒõ‚r=Õ¾l âDØ~5P&t ®Ù&iø•ÜPÀYö Zh¨`²‡Âç=Ý·´×¨øŽ¡¡âæ8*ŵ—¹ÖoµC2ôUôÐs#(ÞK½¶UGÌOÂýR¤á:38Cìý±ñž}ÌbIwjp§AԆ왅ÜcyˆÅ D²a4 ð8§ÉÚÒÒËL=õK|R1díâ4~ É’È\PSÍÿjYýð÷aŠ?j¹+ò;f6S;3q¾3¼F<޲ÖèmŒf,ÛÛ²PtcJS6¨ ÇQ`7ÎÛVs8µcà`›ŸŒWF»ü ‡1æåÜN½æNïÞŽØ£}”c+xMŸ·)Ë«:‘Qnëj4J!4^`›7nLC©R û¡PXlñµ‡J+ªü†Ýá ½sb¡'Gˆ]ÞÇ¿›ª ¤0'°è,<Ë ³^«º~yL7£¶E ®©o’Rö ðJH¦=ô-¥^¢à3—ª\]žp¯®æÎÛ>Ú¨ìû° ÎŽÎD'öeÖög«a1«sà,þÂkï`kBpº%û8Í52‘N ¸IÿiEÁ±nx)Žw_Èg‰ÂÜpøéᬫž5c,‚U{Ÿ\ eá™Ðu;Ø1’fç~ADûz8Q­…¶,ã&ÃåÞ¤Éi¹>]ÝU€¤P©È’h!í ÊC–yÉ噇ºpm<—gK¤Ü®–憗Az/dâxól ñSÒàëÒLZÞöyþÖM„ÀÒb¸ £l—fW¸Hk@#ÇðÏ qw,B‡cz“yï¼ñ'夿A˜êí9$“ Ã;b¸™ê6ñÕе u´i½^Õhƒvëñyæ8Êñ0‘¨˜znPö4Žœ©?spfyÉÓP=§õˆ~6ðõqKTè"¾ ö‘ðQ üýC œG’8Þb°®2g‚ëp8ï¨ [½½Išx‹Lq_CàQyõRvb»7Ñú|íöÛûb¸dc•¤ÎÖš ³ûݪ§}qt‹|e"’Æ»mlæoÞ á*4tª2é;MüæБÑ,‹HGUüf8Ã4¶zÜô‰Oò&ék…Ãq'“æÎÙßv͈ƒPѰ›ÌØK A#êcaƒ«´jEa„¨×vj™œ}å§ZäùÛóÄÎ1MEtuߘá”:å Î4™ Dµ)?–p)1ˆ b°ø›g;+EÍÏ¡2ØŸp(½ r#“W½ð{X€ÆŸyFœÖ6ᎄÌýªšÍQi¦ ‹þDß.x… Ñi_ÚÉO«E倹Ðñt*!Sù'‹sBÉW ËÙÑà»AÏ!-¿h…d<\-½ünpýFÞ¤mÿ~”{òe:ÃM»øl]•:ÍK.¨c,@ŒAN²ºE µê=“)ÚÞ’ þ÷@öI<ž2õ-2{¤·ôõœÿVÊ hïQ#ô‡îÔ¿]ùîfsgkr³)DI£Ë5ÇÞ­‚š·ëz¡œ’ôô>Úp¤ô*ŽÐ!QîŸiÀI’÷Üÿ[WU¿¨r(žk ¶Ò^ƒÂãÁT ÌÅMùÒ„ÈÝRF“AŠnö99X vb­•ìóÞ8×…Šâ‡³›¨î?ê‰Ù‹<ÿ,¢ZvŸsäþÖ¢Hrgÿ]FXlóéu|Ñc=Š6¨´.âû"ðxå— [wê]jþÕþfjøË2«A4‚›t©~`£‹Ôéë“}¨s•N_eHýÀ»>‰žäœÒ HÁ¦;÷»lÊŽKDTuþY@µìÉÎ_ î)ÝjþÒ¶]xçˆn”ÙþÐ|$xtgø×3…Ê“Xç~¾ß£•f—Ô6lòÚÉfÞ»Õ.!7ÏÏžÑ^‹§r7½/XFéi–-îJü(fð‘K³»VجEòä\ÕZxvÓ}Å·_PÂùL²5 zÏÒçð$gaÔÁ]OÕ,®m¾wƒ³væ5·i:8Ý¢³BšƒPÎQΓ,ógxîhñÒ³Zˆ_BÊèÎÃÿx$Ô"Æ Þj‡éfÝ6„1êv%_&&h)…"ââaùJ+ÑgµŒ°ð¹à2Mö^zÃ{S¡Ñ‚‰æøã¼s @<û5häÎ@KþÚâHŒù¯‰ÔþdîÙ¥ñ•>oþIG®¬“å—ÿ{â¶4¹×ÆÍcø€Û#®èåCC ht7–Jsó{I/Ð\?軽Ïÿÿÿq ÅüÙ3»‘p¢(sb±°è÷Ä:Éèνuß<É^zþ!ØFû–ï²§7¤“CU„Zy×`*ÿt©À¼æ|PˆïbE?ÎðÝÉÖÁ3È×\‰Ï³Î YJÓNœF<ÕNg)m¥Iº3*ª–%PÿmË Èø#¼éY%ñ¼ïÅ@øÆœþmjÁ 6é=$ñðÓŠRÓcÔ @Ûk kþ%ÿ: GzŸNÍ:±»òô P;½ÓÜÝ’“òµ`;’ÚØJpl¿øšã¸U“·wP¡<é5â½V|x¬èÏ7"ôh|3h"Û¡°é^{5FA«xð»Í`[Á"±v ¬´À{â,E®½äùU¯)x”b,ui«•®D‚ 8±q޽¦ŸkšƒSËdq› -˜ð÷à·Ã¥i‘V4Ä"Â*va@*A¼]HïüKÈ3Æ:ú…£Ä~ Fä"uR «„ƒ<ãQ¥î¾€ Óaç†ü$”ƒÁ¹›œÞ×YÃÏK•^æïк}Ò8'lõÀÕ³£y¦¬b\¼ÖðÝJšfðÀsaæV k9Ž\¥%eMèék”ñE³ôL|E xeŠfn ’VKŸÿh&¿)è n5±0ºFÀ¨ÖqÑ-œë‹‰¿9Á#TÏäöÁ䦵ыh•+¬Ê 4ļ ªx$(%g!³Âú¿¹õ$#QìÓÜØ¡ä?Îr/fÝÁ T€z… ’ôú`2x¬è§ù²—ºªáô˜£ïú U,˜âqÖ‰Nf¶vëM2„å¢/Lj‡9} EÌV…±³ ÙÃWiü>UäxGøžïÈ}HžðA„„•“TKÀ †ˆ»-Í,ÊiÊ`Ÿ UvŽ8ÁT»æšÖ‡Më߬›£ÿf§z?“Vä ¯7_O=™*â~§«_Ä×@=t1_FDÄ9 “žeænYºå½ E•ãèÆÁ, 5×dïi)t ü$IkÆ»é€ËÓþì‚Ú3÷þ5Xµ4AÌ俨ˆKéÕ.¬ÊÅ»¥µºc~6T”òÄËWˆðö¾@HI¢Ÿ·þ8q·l‹qUs5w¹™ØŸüx¨Ñ0Ì#ôïÎl‡P¸–Ûª¥4På°<$!:¹ZqÛE²ê‹BÑô•*7‡OjÞÖ¦ö²>Þ~l’m©ui”“šñGefD ¦S¿ä# ¶üȆï× puŠ;$k¿Ë׈÷ä¨& Ò&T8öä}ô/€S¿E»'´Ib.“Ñ›h‰|$$Ú0 3{ëç<õœ;ȯðœ^™86Ék¥óh|­ 2òGm6æhµz[Á± ªt,–¥¯çA½àékÖ‚MÛO~FŸã»üµ¸ù—â<ÙMó˜‰r5ÊÑ”G›Èœ-n^@ bçç¢ÂZ%ØÜk[ý‚×e¶Kà ‘ æÓHö£ÁÅ È@ˆ¦¼—ëë^[…ZZ5)‘wSµ‘CO ËPÈ0޲(?`¢Úb ¦ÐP:}2î˶?¥â¸ˆD&k Cp› #4·‚>op J&v‘ûìõ Î@‡H¾ìîú v¾qm;§å@ÎlðÄÕÕ˜uRrÿ÷˜Ù(IFnø>kêþR¨ÜóÐñ%(åXXoW‡!öÇÌÌà×A°–KÈzHÉU"ðmù»Z0‹šˆÀ˜òR¿grÓ”@qºö×~ýxbKƒB‰ÓVN¶láâ› IrºpØ]œ`¿l #:²hÏÜT8f”ú£»,BôÓ8o"£1º®šÈ¾ª¢ˆÓŽvÊ—Èž¤Ç!šÜ>0îûE.ß±[¿ÏÊ^ÄÜcÁ`2* ¨öÒš”Ñë}O7Í¿ÛÞ4Þñ'W¸¾¹" \ëôîÓH#ïÇ1ëm‘*d˜èH¢Xÿ"o~nm®Í|ši ¡…óì 0ìù¾» 4«ÀqiýJWVñˆV—;múŒŸ–´Bâ61T‚D;ø½S…Êh‘.d…¸(³ mò:óÜÎÈfoPP.8ÊäÜ1úFš.m9ƒ̣ơ„ÁÉã½ö¶Ì5Æšiýµa.ög§o¡ˆgÃÔ ’ýªÁ5™f5A¦Ëþ‚4¦š×Xd#vKí€é>ª)áÿOOà¥gàõ²ße Ö€Œ—œ’ÄcäÇ&,¬nU ¼Ž8k·FM†ÁY™¶9RߢŒß¶Â*VU¯ ¤ß׺R¬íÝ ¤³€·fÏD%  ]‘|œ}}o bI”‹Ê\t€Ö³†X!ª\ZzlûefBV]©(/Sæ¹bôí®ØsHÜÖ¶æ ~É¡¥QH¬AÃz‚öHÀ[·¼÷LºN„Wöþ°ÕEÿ}ezb©;“Ó?ÀºÏMHkD6I8í`ðF=3´eé‰ÔÚW=Þ÷SCïy-G£†¥°Óâð—ÇËÄ$}3€,ѧ ¾“Ä¢«:d‘”DMÍÜv]*!¶Ô{»Žd ¼€&I²ÕÏÀ‰TMçz?†d§?T|_þ’h٘ۺȑÝ+©ß)ÿr¨'Jƒ1.2ø²@LÁAâ-wÕÆÚFÞÀº:5VnÉë£ Rÿo#Åpâ gô˜¥÷ª#Ò=yCYöÓ½hÕæ8Î!t\ºy„׈´Ÿji‡&(-f |f ªþ,§ÖÞ›@+Å­Rvùbô×S‚°¸ ¹ôíC{8Á÷=™’&Ì^=*“†X äéÿRC,®Dÿ/šÇÿÿ.!eô¦¬½Õh’Oçâ˜ê´Ü?»ìt »ÏŒ«-KVãR¡Ï lwÂ’=ç¼BÏk._e.f[¢_î¾ Â³‰† 3q7@4·|T§Îw×.W‚ªI$’I$’g|ú»ÕÊ“‡ù¸`ÃÐxñå“‚"a÷¦xu‘ÕHiSèt¼¥!оrõ€à¸±¯EÆ’ò€è%݃ú¹"à%¶½Â±ÇÍ“ ”-Á-ñßBy+,ßœ!z2øéèEçi?ÉÓ÷ÿuºFIÏ=Tä1}Ýá®ó5”7Se#SŒ>Æœz!P.Ïäíè÷³d½Å+AV=¸ˆúîá,rŸ”Køl5wÙ43<PQ«p“}TÍòÁ~í, raÜCiE× ƒió4 {«–¤·Yzzy \{ó8­ÿ—úø‘Áœsò• &è4Rô&õãwÃd…Õøh8! µ•+géØ¿’Gn/µª›{í„#+ýéYÆû^E‹ JZ„Õû9„ÎnÏ–­å†¹ˆÂƒ–7©n)Ò´X„á-ÚDÍ‚H: h’?˜}½·n«¾²õÐ1lèlÜ4VÁµd7øb¾×ã¨ì%°CºŠöA%¬ÇpÌçm3x7€£æO§ŠÉí¨¹ýgT®HÌn:‹ÔÀC©¹+i¯[f³º†j]YFS ­é»,àGåúiwåo»ì‹ü YkÖŽ2Õ¡, €ùøKUuÜURê¤ë½*”Â'%°ÐÙš¸GóL; ŠÂ¾®…øÖ¬r,›¸lñ¤£-#œÅwpü8¼ékÞHGª—eó“Vϯ{Á]x‹sÞóä0,'hµiÚ†N_–&!Û/ÒwøóYM,áGçžÍ¦vWh™ÌÖ‰V ›§èëù…€Ó@/£ÊƯëÔ´£ÉÑô«&Å`·3¶’MçVYÉ8Ôªy£Ÿ{ÑõäÃoþu²wUáãrg,ï@“Wu‡ZzGwÛûì DVòÉž„ó_S„ÊýT㼞¥ƨn}ìƒÄûÃE$ŽÐNÓRù3¼–ý¾þäÁæ._c亦¿ïIšíç]å)=¥“T1vg-žÐJ_†g*¾™ëiÂöN·Û+œ=ÆÇåÓЮ¦á¥ú)L!Á-ç5â’f†Ò¾¡o—k2TÒ€µÁmFÊ%¤Î ý”XÙïg•uÏ‘WNwµ-{ö#F܆È"Ã(®v*·iz„>¾ODoù> (Ó2ž¦Ó![NbæÆ&ã€fmße²n žÀà”)Ôy¹¦áÞ{Š9´Øê¤G`wðÑß8Ä‚r·–G’8l$ÚÜO•?­îoÛ£z¹yfعC}_þØüx}ëÙmhu%>diòæHæ¨uÈfÕQ`å!Õ]”G®d"¤ª ÿmÔMI ÅB¡]‚zgø HÚò}GT_á >%zú:WmסWs ,+—sòkuh˜$f:œ;ñDë}»‰qÔKûÞjRÿ'“Ý3‹ÄJ×|þ#‚8 ÄU Çrj ÁkÜ% m…íœ0X×”§c*h¾œØt/ú ‚üó@¥s”‹bqXŽú¥D2”ˆ§OÓx?çe38ãBš×Gȯ"kÿ…>Œˆ(ðÚ`€j‚-úÕm‚Ñ~4¶Mô €\¶ƒ•êìòU$”·çÅG*_Ú®s N(2CøU±9[W–ëØ#¦®@Ž`²’^N< P÷ÐOu°%~Îñ¹Éi×¢é'9³°âå—ç$à†åV8O.†Æ$}xѾð SËx¾·—ÜÏéDZVÒöxUg” KŽ>£-@‚Ÿ·ï͹â‰O¡•#Na9x.6me.ç§ëàMø`xHÏ Y :•y~ÊÙñ1t÷[ç?ŽÅcLÔ¥Ó< A뇩Ø"D-OU «Ž·#šq·iÞbaUŽÆ«6·Ýw€!mNwZ×»#.O×’.R çР½J‹aBÊ.=õ×½;+©Ä[Ö*鎶óu»$°]ì’•¥¦Åô–Ù™d¤#ª`ETKêzÔ»µ®ß¡›…V’[œ‹Ü¯¹É„'`Y“y´‰¡Cq›…‚ò¾ÉÓ±q¤ÓÑ(G|¹9GH×8QAMz &V7ÂìIòð•*¯­Tæßô5ò}­Ðr½¸s4§~34³Ž†zû~!Ûˆ@l+Ü }N ŠýâéÄÂ@øž-ý™[`膮&>„“üïfA>ñ¡-nÅr,çþÔá—•¥_mtV)âNS ‘‘2ï-(%Mý´«¨°“NCèH‰)c—ì‰Ñ˜YÚwß’¡{êÐæGE(ߤ†ª*êR¨5pÆ„aýh¥†Û=ú^“ëà,µ¤Oº> ¨á®¿Dµ¯\ µi†_,dˆçšoúKÈÚ«æ·¶ÞÎ÷¢¹4™â$¿g[ˆG0Ζ\‘em«mQz1 ‘¡8V5²FC8Uy…î¼ f¢>‡“>”†æÞƒŽŠ0 ¤Íön˜Œ=ÎÜvÓ†YØÁxü~jöWÜ€zÆÆk‰Ÿ,Úî5`÷¨pד—ªqÓÂÕÍyS\OÆê—τҥcΠd,c‰n4À#†à’Ãk¾Ší¶ö†Ã¸ÞœÔ—Pžp¯3ß&Òv•;åÿA˜ÑàA|c­–Pù)R;z$?ã¨kzÏL~ü†O6ÓŽ‚rRâ¬Sìs&ðÏ‘×k¸=kt¢œE‘—g;ßöyÉëKE:)8ø1Eš>=wÍ4fص¢2±GyBØœ‡õ/v|KL­qt0ùâÖùt¸Ù ø£qU–øk¡å\K*•¹ô¾c€¬¶ïã¡ÌX¼Šž¤®9ö=^àdNbç´“žÃ—lN¦5§Ó}ßžJ»(´3†²OÕá휠¼ò÷ívìéUê¨ÒB;Î K bNœ|PÞ,ª uíš#ïˆ)ÞdÅÜ´KüN1÷y¹Ù©ù0ÞŠUÆ0¡j]z„nœwnÃf4¬õ{Hr„Mÿ7„Ÿ»´XÞЇ^#»û8¶‰)< €œb„wD»†¨GÏ3 Zù;ål•0uw6‹ô߆0rÇøôlצR/ÙnÉ·®)Ít2Ó ‹Ô´êÌtÂ<<ùðÝ`ˆ–N“ ¡ÀÝ%& hЇÉþ,pslse–ªéïR«bwÊar<–ºFlõBÿt°·*¿ŠÑoº0Cd4Ûíÿpår>©&½—e$&ö\·EþÉGyót"{TRk"â{îÑwo, Ô«Á°“Ià‚dh“¥ŠÈˆØ¹ÏÜÎB2o¹Múîú¿.âvø&Ë^Ðg‰’£y=ÖÁÉ5ó!& ½‘¨B-RÄö&+l|Ÿ¥Wyý|ÈW6Þçɯ°1 ›äÎ\Ìh;™´Ç©CíæF?QP42ëé6cÀ½k¶ÀŸüöÕ‘]mX¿+K sÉDXßó=Áô" = ¡ß~îÚk½ìkaÝÆW°t·?>ötƒTe!~b¿ê% ëYÙBÄrW+áèÌ#Aͪi×%çÍ2ûÁ7šâàöò&fRGçÒ÷0åóct‡Ž|*„/³KîÃÛ±T4ÅÈïâªd‡C–¼Ì˜ ß;¶Ë¦‡,¹£Q1#ÝË[’Ú.kìD’þ‰B¦Ü ÎþŒf«Çõ´0þ–‹7kï[ù'-‚ö3Ÿ¨æéÔA6áo?cXÃsœ¾º«œnå|9¥&¦,Œ‡}ä6Ÿ•èÂeN\jíœN]Ö¬wjòs¹/Bk©Ÿ¨š„ÃJ +×WJ¹ãÞEà Õüç àD[Å#uGÄ´Òh\ü1Jmâ’ÿéãØÅAÕâŸÜuØ3~AP øxˆkö'ÍG+ Ø\$ãZâTjçÕajkÈEþêýbÐ] 8öŸsjS-hñum&ýמ×n8,üt±°oŒ1zý|ÆÄã¢(Ñ™SéxÙ ?†ŠnA)=âEô6›E =ù3~m ¢ã´ôO¨ÂªƒôTº6V¥¦iéžvì«–½v62¦ì¼Î¨pFrªH÷7F”X‰Å¼ìD‡¿’D‹{ƒðœ}`¯’»(+¦@còOAV¹ëöIž³* °ÙL<µ¬ûþZ´µ›%Úª÷ªjžaàÏÈ=¾F{pS˜ „²¤ˆß)Ç $K¦,ÙÑ-¸ω ¸ Øm–7{:b–oPÿN™ÆGÊæ€ißõ»'iåSX;ÞoÇÕ]¥øxîøøóƒ¾¬ábqHÀHq5fv,pUzÀ=.ŽÞJ!ÿ*Ë#æ®ÑDZ}çrÖ˜Ù“4tÚDéž=4NTˆô™‰—‰0oíö´|/¥v¶.LEôZP1A¸>0wœ$9›©¤ÎÇ"¬vÇû%àÊïHþÄ¢¶îÀa|¬Åk€ÖFë»vÈËZ¾4«Z\²7ÕÚgF¶ØÐ\R?Ýß?v•ÛS‘n4[å¿^––|ÖÈVœ›¿ eËvô4Æwk8,9Y$wÖnôÕ Ÿ‡:M°j*) éñ¦aÄ8 |d?ÏíÏû­ï2eÞ¸«{!¨ý¤¸gx;ò’ª\ŒÂîõÀTšHa:T6–°öÏå/…˜rqiNÕƒ0'˜€€ãøv)ü:=þyqü;þ%LJP˜þÿF?îOáÑÀÔžB~â*$t‘ìµ^êöR0“ï/í¼åI3¬>%ÏÅéGÚ¤N šÃÉÂ8DRN9™ Žx£¡…%U9ÚNÕEÄÄÐ"ÝskR)muË—/üL(ÃÈF‹mŸ††©wÅÀ{inMW±sýºùüodÄ¥tac´âd1ìTPñˆ+Ú[¿ñõõÞåE…±,¯Ä?vŒU¿ ‡&àã`@¿žäeȉIu%çabQ:rR`ÂP‚/öáÑ„¤ýyŒÿ6y°¦Åבê±ÏYK9ñÄ ‡Ê’_E÷ªê¯^_1Æf"š¹" vœàÖX´ÊÔÛÜO.=+ƒ•Uü[c0í'äk?ëšFŒ-Ø,⿱ª†X°GÝs¤é¸p'–"*pRľ'6kWÝ…Çzñ…÷ýrKz]Fó]ð†“6˜d¤x¼‘`‚MÜAÃ[®ÑþB0¯ zïð;$:à‚HÌ©^M¹+c¹Ù2µ9JÆp²ö¯±ùcŒ!ñdZä;£¤…ò˜ÒFÖöDG<ß0´6M"G}€óù7æ£Xñžûúƒ_ÍÝêI56ºR1œY,Å5×ã ‡À–hqb ­·>®Çš›ÛåðÅûëä³\'å½(3J7ýbz[1ÖX·FáÛ– È‹ž/<;ˆ®µ×V- ¬²¸fቢ\VŠa<¬xaP¿W€ùuTLYõTÌgSGA#b8YáˇG–”·ÐO¯’÷á´(^k¿ý@Br`\·šI°oÍ€©óh–·߃Hc»P—•¬|ŽÞ+ã½DE”;¹r`Yþyì÷luQ„å9jÀÂÁ¯ä¾ 0'O-vûtæ,p¥½ìDÃïÕTf~'}7à”§nW)Þz`¯ð Z¬®,ªÁ9£òwl&…0;'¼J}ZÚB1—ºøY 4è‘eìÈ0ÉDRîâ¹x<†>D•ݽlÖ?SØ 5T…‹ q™økã^\mƒ–ª°5â¼eKŽÐAádw$ä\!Õ–ºÍ§´«ÔG(ù|ÂÔÔÝ5T.LÚYb®ªŸ1‘Jo\<î ?6wô|³&y®`}y¬Ss°%›Uyhí|µF;IäÉ|,À¤§T(Dê3õQ'º¹RW-›×ZsË*ÖÍfŽò@½nªûY¯§+h822²‰;·á+Š ´Ùtn·Q‘‚·_ÿ#”ˆ³ÿWýlIeÂ…kœ¸´Q´ðŽßcm*U·Ndgì/À`Œ‹À1%HM¸Ç5”„TÔw}˜y\à¯yÀ„ù,×A¯íצ?§ïÊøtîg®ë˜ o‰ÚŒÆÆŽÝ9èó”þNN½?l‚ÆÀ´š¥«Ñ$.áå±¼‡±ƪÞÔ㨲¾i¶+FkŽçÁ½uׇCÜH°l0Å$9û}ï­Fž]8!ÌÌzd@V}”ŽcX%ÊQ¥ê=¬?oAƺmÃÁ…çr1á! 5ö?- ™nþdüG1o‘ n"¯;à䮊hÀ½ È…:r6Z"ðÕŠPߥ>?ß(©ßÒ+ïO„@=i‘õ¸[ }Ò»5 LÕQà9pë[Ç£kJµs.#ܲօbVË-;®oK~ꟓÂê ëbð¾¬%ÖG²ÇÔFŸ´¨œ½¸£¥ëÉ!é”#x!ÈW- É÷c®2Ãå0Ø×¨híÊT& ýQJ»§†ðE¿–i7ÙZÀïðè°@ÄïG.»æ—_>ÞR%•sƒÛ;PV9Œë©öXÔ"î^ÚÌߘŒQ“?e5“3áÝì—Üã»ý ÷îiÀE<ÀhœÅ7ù˜,NÝÖ„w3.9{/õ—£¸©d‡¥2õó—]ßßö ¢/÷vQ0élj<†UÈð×8(¦æ,´ Ò/ ›ô!ò¶<•ðYŠÐé‹P[(*Ò5‹¹yØ/âß‹Ë'é(÷åø­ªùFŽøÍ¨O&Óh ;pÁ‹†+rôJt’À…¨¸W[0¬üÓrf:Z@îÕAÚ°ükUôÁ‡Zè2mü_uÕFˆ÷í÷ dBÛíu 2dH 킵o<$HZGkZ|•‘5£¿#|c§=G®ô«ˆKÅç‰ËhdÖ¹Þòšð5 ‡»`—È?!½îÏ¥;;¾&y1±мÿúY¸4ÛÓ ô:*ƒ×MÞ6À{ÑI¢7ó—Ñp BùZÖ„5V›Á¤S@Ú|"*ŠÑ˜*¥þã—Ȱ_EØLv“òE~줙lŸÜyp5i°ÆàLUX€¥N¶. .I’}+·áH&µÐzÕuv…ZEb<<òB¢âD™_Báñåw-ÖVú!î½{$ˆ@MÀäD~N>ËÜḜœÃeàj oYùÈ]ÁPŸËتëMK(Þiçx¼kX˜•'y£sØFsm«c´¤/ɾØ^*Óv¨p Ý ·sÓ‡\f†ÅæÎª¯ÈLͯ¸×O¦[7÷†IL/ äG(/‚mïÇÇÆ+À5­'ùI*Ôèí*rÙn 2x÷FTÿQ–â"<}Aúp;Kùƒ¤Ù'IL¨¦ ¸h7WîRoc޵[ò¯)€,éþ³-ÖCQaSª®äh˜¥" ‡°«ì1q¤0Î[Þ_NÍ÷øªd/¶¨éQ–#EYß”´ û l¥»jé²îÒº—ŒÐñ†¢€Ã¨„^þE;¦­'Ä0IÔühf]¢;&ujsyZ¿X„<–P·h™¥ ä@yýTŽ3Ñôè"Ä!NBbº686õ‚ @ùd­ëÅÀó.èåp¯õ½ÄÛ2ð³ ¹^Î>NÜÕ„ö–rL‡YaèF!uLå£Nâ¾2µÂ®ü»ä]RǑ߻¶Y¶ÉÐËÂË#¼Ž¥ÿ†T¥Ò:ð0ô5§¯ º‹Ô¯Žýä#rHaï–Ýÿ'å§˹ˆ*RDNIoÃg0ÿR>k—oQ-¬(ßÎ~AàgÆã‰ežøÊ·ÒpmØl1îóñ2„ëÝî'ÜXªŽg'ƒQÄÆŠÇ%j©Q•ѿĒÀèó:ÐQtµ³™‹¥®øXW`Ç-«óëßåV³_–&òå-.ªE±, ú¤«y^G?5›ýÀCÚ–FM‡ ·åX Ù¨‡‘Éåí,œt³œƒíú®òø¾¿~A„æÐÅ4ï52øÍ 0ïŠüã5²ýˆ¹ëÓMw>Þæs„_ÂäÂcH€žÇmxª•º->T燄M5ìþŒ¬Ào´ƒÜ¡-Z §,oή𺑠¨ÛˆáÒbŒ T¼6ékÄ”]).aëÿ1À%ºßºÙ^Nå­O“ÎÞæœ?Ùq².ìÊ5ÔøËœÿ7e‡NÁ%¶’½a-É»rÌŽÄ4Cæob,ƒ)"P3$ŠÉÊÎ ž0\͸=â´â¢ FŒ=Bß®ñF.JÓíqÊ/¶êäËa¹­¢~é†é¯tbŸ¶I & 7Q+’“@[y'zÉ£Àò«ªb]!̹F÷T؈ðe ›MtÝám 9SåÐÕ*ðµvëîéý–QñšIÐÂl÷Ÿòg~še†§$? ‘ëóq›Óª æI1áigná•É·TþË®RGÄ욈îëm’4jr†ÎmP€±ºÔÄæAgUz¦Elþ'WX­fz¹"ÙÊýz¸»Ë”ñ1oâÆšÂÚö6h ág a¦N>¤óI\Õ ‚*¦¹ŸÝ×åky2ÛŸúSVà÷‹²&}ݪ©áæ/›-qÖÿUm²†E»aNCZz›1!zËžßÜêm|ñõCŸ¦µnš*”b~jiËæ)e„`œàôô?>z Íq0¸ÄÎKg²¤&¾Zݧc˜oaÄÉiyÈÅ fÇk¾ì,CzÆ_“ü¤yŠèðs£¯HܱM8~Œ« p´é›¯Û}u*U:É”~‚‚¶a}3ÃZ÷ ¸‘£ê£êv„‹Q%L8~ž6±å†òsŽ­7g¹W½–™'hˆÎ’¬‹b&ùˆ4,b!}}³¤;Éá“—aQŠÔÀ2ÐíçÏŸ±›Å¡Új(u›µ·ÓÛ?aÖv{à­ãKwûX½0®UaÎ7ÿF2.úà”>þô´ZFz¹ìϽø¶v©¾çpÏåãf.}TƒBõI ø­»Ÿ“Í,Ê”kÊô­4 ¹9#?Á“C{þ‚@GLjC‡,µ¸5vµ€xîlƒËŒÁÍfGÛ´z5S‘¬„{gÖ³¾ÐŠqƒµç¿ÿ £‹wà7m«ëú/pN¹¯K‚›Ús•Ø*%“ÕâÔ%Åÿ*Ä/?¿4p¶ó˜1gþÂ~Adv’à¤};oIJƒQd?8®Š±äE›1ty9ú^[Úp;–L‚¢ì€Llâ)—Z·Í«k½Ññ(iÂS¢WrQg¬FkØŸÜœN¬k¶kC£Ëš >»ÜÛúä6 öjã¬É@sÕKvwVäP2!1¸·Æ©iÂÙKÑ7ãäF4z¹oÍ@ÅÙå”Ã*4–DÖe|ÙÏ¥LÌi4Û³#ó9În½F“WŠ`1w~­¦ÛqX:p‹­¥gÔõüì ;§L4Skð™‹þ݇0AUÚ.¹ùÚlì~™muæë·ìe£}LÍÀu T•Î K—³j±ì9Ø¢€>¶Eì"ýåB@tƒ¦©UÇÿÿ¦EßRÝ âÍ|rMñ=èÒPGjiå”·€1Ìè9X›½ìC0Á¯˜÷â”w°ØÀ—GãÐण '¨Ó½@âš÷™z‘©M¯YÉ„K÷»þ*óÂK2qüàó/íýr<ÐU\®{ó^j:qpĪSÔ ï]FÏÖޤ¦æ#ADì€ózÁø”’]It‹0×È:À—ß9â„ÝóΊaº…ؾöíeìu²@Œ’…í}Që¤àÅdÈ„“óR7yA´Â¿j!O5œÈ›LÞf½‡yµõʇ'ptKq’-ŸëPzÞ¼ÒH±öd9Ä5€œQ—ò­¦ÙcëJÃ^]}ªq+CÂì ‚Xú )‡nî›ì7úAƒY*†¢øÚ¶Õ]¹ØÚ)U …‚!{Ù=–›£N=m;¯5C£Ðr3o•Øj`u<œ›ÃŽd»î¸I\•7ù¡Ïµš7n ÄZ ó'ÄöÔ–û¾²ã¯.G¸B1L&Îá¤ió»›-ò´ô3Ê9Õ¬ûÜhn2^N`•$GœÕq²LeàÆG!IKùlAÚX”½ùÕ@µó¾’Ý|qf;ðb|À%–p±ÅI•jþ.Ž(÷縙jÈŠÅ_ˆ}ë=šè²È\nÈH”{ !7 ©#‡#ð­ÏKº¼Õîù9E骨~ 4hö؇>Ç4 SýÄ„NUlù¹e÷¢ËŒ ºæáÂô<­Ü¯ yT °Ý³q™Ìõݨ[&œSaaN~öѳ ]¼±½àªk¹ ý–È–=”Ä4þ™®ab mÉF‘Ž‚3÷8”ùiÿ+Êžr±ÿ%BÛ°ü|xPª;.!‘¶Ÿ‘£†¬F|Í“à«&ß@Yj/i$ð'9¹–—‚`1ÐL΂6A'vy-Áq>²BsÎè[1¬P5q5ôðØ±Œ¸,4ô™ˆŠôµ #Â)Ð/þ’a_eÔ›ŠaÃúÙ pع¾_»DÜvŸ1qÑh6¯wÞ˜½}¢_áEt”Xù¬Ô™_û[ÒLï͈}R‚ |BHþøNyÀ0ƒcY‹[®?_™þ‡ý“¹Ÿ*tÝ8¼hIš56#LàÛ䄪N&îJ %cȽ]÷RVj%ÿxÀQ\0Âl·>øäêhJ¢Ÿ³Ïa)^Ž?ð\Ð!٧ئ _=züs~Ãó…¢QWF…óø¯aü—Ñ)Ô½¦4`¹²ÕøÆÎ¿O[]§[¼4xÂ/zýK¥!lžÓGíãñÅ 5ÓµW^f 'm…û©Á/0g£{ëò¯—¶5›Õ®Oæ)wRàAÔ/”8jÑÀ7—û,2´œC|A¥“5ë¯Q˽Ï8ÜjZâW (*R¸'*¶(P‘씚ï'nwžèxìÿtŽV„àÈ®³#ôŽð눾¶ð0§Îú_Ô±¡•¤áw¸ìâÚISŠ! “EK)Wò.»›Z+ÂÆèÀJpCFšæg[9bèí‹qߨÔÖÖHTØh­+ʤM1’Ÿ Åzvú\¿UîˆÃ2 /±àß_“¸‚½_0œB+:ý¼éUe²}ÿ%Kf6ŒÀ(PAW=Ô‹Bv£k¥îtÞí—ô¢`¹JA]º9/>Â4…ùG›l^g™÷Ę›FòÑÊꈉóe£–£Ï€LXGÑ”û€ƒð™tXʈ¥¶¾’`ÁPj³¸Šadûÿ|D¢Ð¹‹&e¢ühÓ„Ù΀é8-±UŠ„k â²Cü¾5 C9LQV¾_ó]L}ôbVý¥ˆ£òô‚_5*Ø(›ó%¨vÛ—¶ý þ¥úLwÓîNDÌ+n~3ˆž:áòÊ}gŒíLçõ¹Ïøèê„PQö¥À‰J‰VîÊÚ´¸Gî3n”uL/C[ÜüÃSßÌM8sßµR1Æ¿wÃúØ"™N¯âÀØÔ^›lö^„Œ²ši{ªá{ÏüG•O_¯ï@àÀ©½m(¿F¿ ÛˆÔÁÙÈ ÑOöéR5yÅÍ0£Ô‡ #ÊVuú&7çµ¹V›ó ¸L”‡N뺛ŸÐæÔÏ%AÝ_}ðó*J&A'l0ga*ÖÃ8Ú˜k§ Ø£1‹ÈÌ>øÌ+¾3{t"Ûqœ¢_Ôd'¨ÅL‹­†‘L%¨¡¥a¢}QctÎÇŽ4ÃŒó.›±/¾ÊDdÛâæ½…õA5©éW¶+‚NÉùdå² ­ÕdJ;÷ƒƒI ôthͺ Ÿå¬Ú´{f‹·¶<â5(§¦ï!`¨žh¶Ié‡;c% Šžè2Οaá±sYnû08½Ò~I¤-´-ŽÛºF^R3Î`›¤×0Ó§n‘Íh|šéäë_ Üø@g¨ÄÞvõ7~ÄA+z)}£Ì¸2Á̹Å:ÆŸ„ñ®ãt;®(_ÚíêÃØž˜rí©Âì:@ÿoÅŽ,l­àv˜AïÈ&T\°KÙ'з®¸(ÊA®&,MedUõÚç²ê ­ëë¼þÕ©Zè½’Ò딃%eë²G º7ùLa“`a€zÐäŒu÷v0L’s´ºb}QÆ·ýÿ{5-¶ù[U–W"›^Smí£ i¸Ž-Ìul¡Ówã*4cÐðÿaá>Ộý5L^ª^(fÅÓçhyg’'À-¹-#ÙDQIrr¿J蠻ƞüâAÑ$ÿ .çÆ}ó11éS¶¸’ß»ˆÂ×öýxŒ(®[àÜ) ÒÑôj­Lã>ˆÁ˜Ï–jÉÊ %ŸYŠ»6kÒ•¡î{Ê9V¦0°­œ¿ççR1Ìê°¢8•N Yû¢stÉï4öïS_ÿEÁÙùåå¢Lçõ37åÉ›§+,á[ˆ:o·)QX˜~yj*°Ð 蹜6^¼ŠN{ÐKŒVôÃ?5‹ªX ªèÄ‘‰jú­¯¯JûãÑ,q…ϳÖb€¡/†¢¨¯V€Çõd¡"Ë× ¬Øs~ëÍå=Åþ.黈p 8„¿«)YRÕÚÅ"*Æn &ç”·Ùï;9»Ê¢d_RVHƒEOwù-NT«Ý°0 !ÁÑw‡àÜÉ’lX:d„‹[x|'­è¾Ì¥íÀ~=î6ÂÔ¦Œõ~<õ˜;¬€h’07ÀYwØ"¸^ì~ бjk˜ú-4ò1Êêd:Ê‚5â<ê½ON­™•û_öSæ¬}ØÔ]ò»6ÈýFC©±ÞôÛÌI€©Å–¬ÕÝ;*³ú”]·1QAí÷®pƒ¼QÁ³gÈ~Ûçê2B0u™èXdÑǃ Jó„hKì{¡+Jx¼µ¦Êò ©‡´RyK·õ†–b!$Ÿiñ>Ù-Ý?r ¥Ò$Ýá ‡ ðÌn×:Ã……SnÜpûN@”‘¨2°TYæà;åS¹[ü÷Q ö2q7þ«ÎËõTLÒº-šûe¡i£ë©T€¤À6&ââ”´°Éµtðÿ.Ó~Ùï3¸º ÀÑQxuÏg’›-í¬edÉO ^€(s¶æ¦DhkfS¶7•W&šëJB¾á\Ýe8S+x–t¼þÛ ‡±ñ ~bÝ&,CK·,ÒGwÚeNì¸RNýrCY;óDìž[ïJåºð±…^`FhƒUå9'Ýûdt5«ç:f‚^pÉA]Åó~ú¢½Â)*ÿ.|$ÎAgm`›Vzô â\÷Ú£¬É Z$».aêj]D»¾^¿® p®iwY û8• u€VÖÛË;‡šîæ1~zž·ïѯøŽ°‡¹õ.ˆЙä¯oFÆÃqŠÏ8 sƒûŸNÇøɈ@ƒ1ëEò¨mÁÞ;¸Ç $2×ï1[á±ÑC;BÍö¹G×ßÅS@)þ7æ5ó¬ÿÀIYD#Y¸ ZýÜé¶7—·çÏ@ß΃$Iñ>@ä‡;Âêú“uÓ·)•‰ó› Í«éË8N|-aÝÆŒ°Q¦š.sÞ}‹›µŸ„užø §pw¢n—ÔÑÜÓ«ž°# ò÷Eawfº8¢#Ú ©<@Y´y¸¶R‡|¾dJHR4¼Ã˺ürHáöD‚l”o¿á º”~N}ì­AUãÇzº„o{Ñ¥u—)õ›ˆ}ýË €â”[uíÞòf—=`ïŒÃÔ…ÃH€p§t²²8p¼m|CNé½;S‡—Ú¹· KƒÆ©Þ]S²RYVI®çø¾ýËâ·Ñ†!3çPu~£¡äº–+jª]Eä%%ö»I©o_Æ^1•ÊË^ˆŸ´¡Zl«ê*%Uâê¶§»ï¸ð÷nC;ÂrÖehªÀY¤Ò*¡JV ™ãê  Ðä,m ùº5“Ù8m2!4jÎÛöM³Súßß1«Åƪºæ”Ox9–ûÿtŒ…\\”Å:g×èRVøÊ^Ô¨¸¶ØèZT#ÅÎl_îáÕ1YbóÈ =‡6-ñ<‹Zj‰´z¯!VF&»ÛêÎÓØ»k¨sÙu±xØ(ûÑµŠ Y—ZÂHÌÕóž°ÆuâR¼ÃÎOK¤šða Pr‚—fŸJ/•ƒOõÓfšìób æ(äzÝC}îo3ƒ¬ðÒa±2; É{,ªiö:ÔHiÀM=µc­›É&a8Éú€h›jFpß,&x~róÞüVZ_Ö?P¨{r%;åÄZ£(càš-=°†f±7…7ýòÄN²¹7 Ë3Úy­‚çé ._Ë`Ñr¶ýSÑ… ±ý´ä!°y3O§6 ËQ€µSvþs[Òà.‡å²U’ÖŽ°…˜+¸sÑ)ŒÜrxi}šýÖü–¶ƒ±8©æ’#q~¬4¤tçNK`¯ëž3îä\R@Oï^w}>¬Vχvfs­›}]#Cþ —³þl_CAREíX}e×^zöEü Ý2U9›“VçZÙ¥åfk\FѼ&³ Á=gdüâ¨<‰L++ðq ä@l¬ËëŽÍ,ˆËZµ?õ#6ç#·&ù~<7tÌHðé+¶a¾¨±AæÖ‘? ä.d 1²¥ø¤BàýêX{LÃ7¯þÕ5Ÿ® €øeI-7†Ô˜Èèx?-0G͙ݸ£—÷’¤׫‡*Ïþz@`ÝN^#üì€:xždÚìbç·«™?uBÐ:R«Û%\ÙP{çSÇC$ݱ¿Kbpè·<ÑÜŸY-Fk{L–&S|boKX!¬óJê^tr« ÿ,3B0X$q¸³j€5رUéñUú]>Œ€%[3äEÀ±M>=d·¸yf]ý Z)§mu@3ØS¡Œæ!<B£Í§`ùb7§€]>‘µžWs~Žcd¨¯ýF…ÒBq_e6É „Xµc¼XVH£ oûãûÜö•Á³ð´/¯C;É™Á¤üÏðXÖÓìæŽ³®'É÷¬¸£e8èEœ˜»úsï&³ßz©füÛ‹ýTº$°¬ñíC)®ÃÅp#—¡âÕrxPué_¡z&œ³Ò?çkô: íêäÿoú컚Ýk•‚Z›J›E¡¾>xM¾2J9^Ó¿Ýœ&˜•!!nÓµëá¾: føª´@û’GMö”{^ðï¿Ç2T ‚é2`c¹R*·X´[íY0¼¿þ9øgíŸYÞW”®yìÙŸ·D‚G6Ãà‡&hã0îä—Íã©ûªÈj=eؘsbòë³H ¢¬Â¶øÁü ØéhªOÆk‡ÆŒGDéÝ•Îîš§}È‹>½¡Èmb¦ƒÈi(çÈ%syxd+ù6üòE/¡übÉÞïEò$·]ÚÎw)-ç‰Ü¯@ëØ$7·+Ñg€´QÏŸ8ÿÍFÊX¸{ÿ3ExÚVá:ûòÆïÆìŽƒè&Ä)¶‡¤f8ÉàüÛɦ< YºÖ¡Œ²Ä¼¶Hµ¼‘½k˜ˆ£3èÃB Û/íÁq7 à3¬µ+|ø„,²7¶å“å÷ Ÿ…v^öÞ›6®•c‰(–Þf_§¥“œTu ×â¦pÏv$3ÓzÂKF Ý`Ç–®ô.ÐDòÃÜ÷#Y9m·îÒt| /d­¬Ó×ô„b¡ÑÄÀàçèþu!•çò$ÑsO\—!/‘ý•z…óÄ_êØ_ïrŒ„»Y5øv¶\Up˺P¸t7Ëâ±MçO‡'.­1üלB;9ɹx8ÃÈDIuV¦± 3o·¬ˆo¶ñ[múS;ιâ‰8o‘ïv J„b»:{IÇæÙò­úZå÷rÚqéÐ*½°…ë[ß•h×,ˆÛ~o*ýäOø0^ñÄ®À(X°8ÓŸ@¹êáÖWwßH]¡î#–„µêM£-ŽÐGoR¦P|¥rŠÙöÊ›µ\Ü}}„-ÞÍ%0sŽõt¬Ï÷KÃf£/P…¢š‡1XmšGëŽàdÅYñô•¶@97H‹#õþ™ÖÜwÛ ›èïHŠü›EÄ“ƒ@[ÆAö²•$v~8Z|Ÿm´ëÅ@Ê®…[âôË“Þí=⎭Bf RýIñ]¡#ýµin¼z³XåÛl½ª _Ôè~¹•éÛ†0Ö«£GQíì¹–*ù¼´ßYAƒÍ 0;*$Øãk^ ]ÿ!¦·Rœ]’º^` I—öB5•b¸Ü–M:ÈüG`pù)L cd:Jc¿vÿ:j¿˜EüJó‚1[ AKbèJ³Ä–¨´ã’ã0ÂPWCzÍú5­»•'eª”eefÚF»Öè+H_ɵ0Cñ±¬ö‡cÌÑÃàÆ5ØýÜš!Òâ6^·Éò²˜N~ð°Ìj©æU¬ûx,¤|ç¨ÔY"µ1oŸ­ºÓøÐ€Û âÞ— ÏlhuÐa¦çMû…ÛæoºVÀËšñÜÅBƒ~›àXr½Ý9Ÿ¤ÿ†%(XÒ‡,?uè%™¢ªUÈl§[I'†ãéüÅ/R¾Ù¹ÉX¢‰½|¢\¿ó×wèÒ e­r¿ØàUÎ<½_ê•5š‹/Ršq£µ0Å,†ô<Õÿ\Nµ)ÙaË<ÙÚÕ¤Bݤ®ò¹%¹ç$Ó…r¬1‰ì!&í°–<“ àÍ¿×ÉD2tä=è;ªˆ… 37¾u½’¹ÄØ|¿#_jè§>‡>¨ Œö¿M5öÊÈ%ÊxSíüyrÍQHl £â£¯3Lë¼ý¤¾Ôvuã ¸«§Mî90=ï¶Xq‹6'VÁË·Mšy® ãy˜õzÃõì 'ý¤ó’c™ “&ß]Ê£òiÙ—\ð굎RšÉǪdŒ}{ÌùÄj‹À0DŸ"çBEâ?Î+ðÒ[:JDGùÁWÐèq»`è!;Dañ+=DÖ¿88ÒÆ>· J$¨é¹«d0ŽÈÑhÓ’’}¾ÈÝùðŸ Ý] 7 ,·U﯂À%$á—é.u!.4óÚ‘2o¶ñXýƵ’&ù?&‹»ÐÈÈø 7Ó8O!?o ¼7å…ÛêºXBñ£Mµ’Œ/TMJãŒ1GŠXTPÓh:÷Üóˆ&‰<íº‚ç ¬6Åhø‰ Ûç'ÚlFäU-ÄÁêbÞÃÉ!ìr%±cVVn‚&…I¼Ì!]’sW IÕdskLPÒ,¢~ äïSyHf‡˜wIŠÆîœ(ðùš¾1©q7\k¦FQÃÚå´U?Òˆ’×Ydq¶ò¬±â*NïÞûµ´÷!:íüÉIüÁ0ž«l".=SûŒŠX ñ4Ý §$ gNÓÚ˳U÷…ÍþÌá<“]RÖ ]«ƒq áùrB%›FWpUžÓ·çÝõ¶_ßÑÀ¶ØëÚ¦d>V+…¤RùU˜OT«C"3Éñÿ€JmËZ§J¢3Äþ€V&½JÁ‹±íšJ‡và83¿c\"©¡< ‚-/Õ±gª(Éê#”R;r12‰¨°;>¤7ÄÛɤHÑÄðNßìaGLOj+ׯç&*–¡àÞO3þr¦Z'vò‡ù²œ³ . Z¾þT 5®íNûŸÊžyUÐlD»¦$°G8ðìE'WÝ‘Šúïõ»¯Ì9?pÄÁyLx…Nì#°›§¦_$V@ïô¶:H=…Ã#!jeP—ê)¹ö¿ÿTï©DM‹Žþµ?¯I¢² ) Tt3'Ä.¹·ÓI)Ó\¥òY8êèªa¤J ë°5â£OÕV×üQŒ"ÕÂÃ5îÖóKm"%y+õmZbÑ@÷Õ³M¯ ‹K#\倻ƿR”ž{.Ž ÂÎð5“ÄýMn.P•$yŒXú~þSh,&€fKÝ,8È(m1ɤ†ŠBý¿$- ‚=7ýitAA "S2Û³Þ°ò˜fÃcBÁé ò¸Íá°ø/Ζ„Ä@>)„SIƒÑ/ÙH çTn ‰lÕÆ¥íGäګD˜bY0]Jr”k«²"×ͧÔÍú}ÝOnÐÆÃÛ4€××ö§4¹J©f=š ×ƒXwâŸfYÞÎ&ðé¸Â›{Æm€ÊO¤5]Âi²¬Šµo“ `¥#Û:,ûºb/ànã j Ï!z"—íPÁ5£‘±å {9ò…ÿEJU™ ‡ëgžÏGH;Íð®ä@žºð:ÁŒ+Ã&š-}ÏñžKIji¡ë5þªhÃ_0`L›\7RIÞÖ£KŸ7ètÌtH‡”Þ×]©˜òñW‡#Lš¹}ÖA¬â—šò°Ã®º½¹DL‡ŽU”Ô¯]†wú¦¼‚-“4*œH¢2Yûßkô=}­ñœfn¨V&4Éí^F‚íDyÇ$lÓù=ÏújÔžCÌŽ³¤ÞQ\Ѷ\ó¸ t‡×±&>êk"Î3 þšª!i,zí*®AÚIŸÀÒ€A¬=gEµ<±K™wÿ ²ok³ýéwC…hü³§{:Âð²-¥Ó¨ ÚR2ÑE+á•ÇMC?Wºo"Ñ5âˈš6J?-´[ðmÆ+¸ÍOÏõi™x<èQ_Ö ô™w\åj’¹)‰þnîfOAŠ8dY´í¿ã ´Ÿ¯î«-wµéï„4¥2“¢ù­…ª~D»}€óO3²òÍÛFs}J+}‚^ùéñëBÝ9‹H ÁÀÚ³Q%×ÎVǯåK4­²èuá¹y•’£—›5vzƒ% º­™èŽÃœá(ÑT¥ëÂ5(y;¥cL¦©TÔ€Ðë˜ã›ÄÉPÕ숸¹¯èb¹ò#¼>5¢I‚›Ó –!¸Ó}RNðk ütíÜ(N·`%ëWCJgO ﬞ‡;rŸ+$‡&'©hÒX©¾žÞa‚ƒ]q—‹ºk±L1©¯ŸLqp®À^ý°Y¬úHfÃ]°5·vÛ³M—Ƀ9 2“B¼võñ.šÀsšÍÈ#É|¥’bo¶’{"Î@vF´5ïÉ-§4ÑÃ@ý#•G5v­ÓÓewÐCÿ}mÉ)Â-”¢‹ºYvøíÝyÛÃrÄÌäƒMk ‡¥¸T‚A¤XŠ¿Å¥×­‚˜ŠPvÛ{ÁeÆ7Å[ßÔ;Áa륇Ù[4¨Xb4îæ”ǃ,£€n5": «‹“$ú'æÓ9$S]V+¶øÌ?72ÿWÉ–ìô5›vË´ëI ÿ%Áx±Vwg£¥¦ÍÃ7/%‘˜àÚ ÌÒcä/—Aÿl“›+ ´ÄM±d®4Oiv4òƒÈ™`A׺ !«ÈNynV½!¤)£?•;‡±cG²û}E“jœ†Ür^ có îx´Þ•IøÛ£â|l¯?/Ÿúu­ÀàÖ)ßïÊZHá¼ $³pE5¼`6@~ÉàDœ($‡6þ¯jvÁí>=d6»«YTúþêÄã¼}–Ž`Z î"£“í«*%ºn%€\ *Ò¥8¥[‚Õ€ ë@2¢ìnH¿¦Å3ÆÈ"g ®êƒ°•J]íÿ{hUmD²_¡P ÃoOÅôãožÂÒS~kÅ9úñiðGÙr1ˆ÷ÜÀ]yžn`&M¬ìC0 ÍJyÐ)QÛ²G뾌 Í·c®´ÇŸé_/Þ¢$³è&ôåRbv¶ø!üÇ ~ä]{)¿|e”Í®åôó›ïº6y‡/îºl‰éê$Ÿ¥WU³ >eêçÈ¥}|]¤l"´X?1í²ÊŠÿ*“‰Sgƒ'xáîÆ§a×/¾ífW¹@À²úÃmTzséAú äShÄýºˆ“ÓgÆE”é8hoâ܊‹*íWëÖäÛ ëߋǂ[a¯W‘ÿ([€ŒîãÎaŸkѤ?@ÿ€å^Ò·FR•¤3Ð ÆÆâöd§Y¼Ñ|å¦Ná{ÛOÜ$ï a*°ü¢Ÿ§ øO܉a–JmPZŠÓ/TȃS¼2¬ð:ë>>kŠY{rÇ3Ð^”ûh®Hk×So«l“™補çêŒïtéJ,ZÓñùê‘d_U+7ްm'üùMV’ù&È—;wuyvŒòÃz8`ãvË![^¨[n°õ¹µÔM¾(J ' ØÖí/-+POóúµ¿äܨŒ&ø(ž[kjôèݲÆ ÷-JÚDÄ̹*–³YîÆ8ÂZ«Y©ƒkhŽÉE¼ª$æ{I_¨ºRþÌžlH›Œ¦ Î¥dqœZ©h¼^¿|õ Ýt¬‚A>"kéÎ>\\`ƺþé0üÁx§BgDà&œŽ1~©40Ž5‹©ƒ] ©ýc.m©}ä]à×Ï D±ÁAÁD(†z}™Hf¯ñ j"ŒiÕ÷ ›²7Eµµk@WŸ; ëòBä×\üð¢År«§vûq“76Ä}°‰âv»ü€‚¢×Æ;à=°Ã} é_sî„ðÊÕ¥è:¶S¡0¥º0Ù€CT”Ä“ÕWØPߨ÷¹'.½ÊU§ùÊð‡lIb4ÖeˆYY¤­öèÅN©ö8§©újê¤ìÍ´á¿ëžÕ%»l<ˆ½š—c…õ'ÕÁ@ØÁŠð…[¿‚ÜóJÿ)Cyß{Ø™kÿ`áxìÊþèîA…:åòÏ®À W§=Ì^³¾½µmIÆ`Uˆ q®LzdsÍ"à÷Í{PüÄ?âŽh‚T ”ctIYŸ!îÁFÉûà˜#­‹ÖHŒ’Xâ¹2C8³bÕö’ÎÏlÿÆ8iÇý»–•"ŸäÌè’BUP·ñxàu6Žà%û "S0EFrêÀØshÓqLòá¶Ã?|â¦Ì)Døv5oyr@¡»8¥bL³.Sb¨ŸÖ*¤ÑJºÔØÎŽ5ÒtÂúÞ®2©L¿ÆHÚçÞ-³Ò—EÃV–?~ Ó†;u%Å˹GÂ3åÀ›Ž”Ò÷äéSJS*‰M4?µiY,‘ç# Ö ¹Å‰«îr Y8ˆÎ‹²éõ¦o[ƒÐÄxó¼ùk*‘ÎßîTzëó óRò˜ô|îµX°Hý¥¡CËnמ+Mõ¶i.©ª°î5üȉìYò*=Y³a ƒŠ 5}ýõ!óî_ŒàV'eÀSèƒ-n˜³Ž6yT§%0KY?—0`”sEQ7éø-pÑ»Ã脘?D>£9˜0ÐPË¢ÇT_a0õJ]gǤ¤È(;™´nM5¢0Bå-êr/Vê¬ׯrH|,F}+ku‘n·–b2»NîˆïÞ‡×Àʓư§Æ®úìÞûV …ŸÓkïÅŒÏt–ňBsДŒon QvŠÉWY‡FŽ’¾)›ý¾ŠÒÒRäFŒwnÔì×R‡Æ’q8åÂà)ÂgϨ+$,©höÇO[³ 4ç³jDWMc™U8ÏyŒÅȲ[¯jªƒÚ’$ æQFÚ)$}¤ïä—üö}GáåÉþ–áMŒ"Ķ*;ÓŽl}ýB9Ûýe2g¿ç¿_XvJ½7+Tá¿DlÎúU`–¾a+‚Í~;§fQ;ÖŽ’O²YV­ü\Œÿ­î=+wÅÈ-7¶<S¤–XGʼnòjPSa8otú¡%è(û!⃗a7†}h;¦ð¥ 4r{&Eé«ÿHhm>Ÿ:S%ÊýKC€ù H¹£ebè¦ÞC»ßcâW´ä^óô=€yÍ=Wzã³FtUUUUUUUUUUUUUU´˜²A¼Îs™q;â]¯Ë„‰ƒ»íg\|©…3DÊ€u…Ÿ^²~cî¦YT—HݼÀ¡¯ÿÿ~î@~[­ãÀÂB_n»r!Xý&Å}UUUUUUUUUUW÷Ç;®…^²Ó~7Vó¡c=¨”Hß­Þ*ÝÀ\*&´pB¿.œlö ¡¼DXŒY[ Ñãk²Ú¬ÿ(’z-Àˆ¿R%¼]; ßÇܤ.3c21Ãp<®kÉ{=ô#“ã@2Œ‚¹9ìe^ªÿÎ,}/ãèþ…53Æ@©“"A îÀz)&^k%“èÍÇ×J郳ó䞨 CÔº -³ÆýÓ ¾3CÆï«[¡À &üÖû¯³Gp˜~:‡~ÑTóàqN¦P޹[Vª¬¡óW£•ߣRD“—odèÈy‰å5âµç÷m—_h§<-¿/m¾T‘uNõ ~SÊîâ"’ü6’ÔÒ6þ³ª‹çš:­3tô]ä8ÌqŽy:»Lw[R=ì $î±S 3a¥L‘‚+ßÄNàÈýÅÇoÂcßô+\Lî]êDN¯@zÅZ`a¤ a½ˆÎvކbØÄÃã5IÖüoöUj™6íÁ;3‹Þù>ªXÜ%a@§Ø¦¯n­ýe¥Ÿ•„ÀkQâh‹±ibƒõyh(›Óà9Â-qfE˜féFø,Å×3æM–qèCÐ$"× @6y™æ¾Å +£i] Ë ð[â}µH•¼§-b3Î]Ú,2矎3æl<%w˜ÙoCÓÿw‡e–ÄY+œñ¾Î>ªX4d—â—štM/ƒtöð `5†æ¼¥#Œëÿ-NÐ<!Ç{ß!V™¨}bâ£.Fmƒ¹k™Ä…‘hD_‡Æc±‡›™±k“¨©¡ltý6›²çB0Ýqp9ûÒ(p·­’ÍÒ4yƒÀÙ·±w»Í9·zi¨öŠŒÌí¦?½Ý2·Ô2~aíS,c½&åêI°›KËÓ1ø\¤[n2§ü§8×Lƾ ‘Ùô÷haÂWYÌÞ™}ºãÖ=«ýÈœ[{tѲý ¢ìì" ÓîØ<±PRqtˆ%i—÷_ZÈ›Þ/Oá4+Q^‚gè}Ocí|Q9áó† 2n‰1¾N(Ÿ»Z/%ã}“vÞNܰ‡àH±‘VˆÓc}qÆ’@“!Ï÷GœNÂ_õZ×~õ™ëüU‘ùÑzp5´…ïJI÷íë6+Î!ñ1À^ŠM-AÒA¬CYŠ )x³¨•žr¸šp¯O“ó¹Ç©Aùl‚w'Ô¢ýí-8"÷Üâü¤–¯ý=Râ¾m*?²ëË@Ü)]rI#ƒ0àý¯©´ïÓ1qÏðn]\O­w)ú¥®Ô ¤ÿ[¾È•5†G–„X%‡Ö(Æ ÄŒH´ø†à÷è"ß_fMþub:ZQþwDbüÒÖ¨RJB ÏÕ ºãúÐz³Griä‘J;ø ŸÆTUÁ‚y{QQÜE”°‡ lÑì¦ÂôšŸ–A¨‡^÷O¨;Â$ÎÐ!0E-}1À[Ë·ˆ¹[šëÃvªxÁúö»ÌO6ÍȻ홒Xª÷g?6¯ÕCI}í#žÆ*Š/4î;A§U:P”ˆorÛBvÓ øVí[Á HÀaì£2éê ôŠ2³vqº±û¨£«VÖÊ9LHÒ9àZû4¯ÝIrqÄ*ÊDî!‡DõØ åæÀoT:tH} ÄSW£®ÁŒ³>äs8º1Âd¨LNñò‚p4„~ÄYÍâ)*oSxÁÛD%^ZH‘ä¼õ˜ÞQä·m«ú_¢È¢ÿ/d»uÖõx.zæT2ÉÁ~f°jÜŒÛðÜ+/Oì6­”Vp­ÿ§†çs¬Í¢°§ÐÙÜÃ:Œ¯EÄ5ßå€ußñÖË· ‡ýjÍÓstkBmÖ%ÔÆè_fLm UË=ë-7 âHsAåÿw¥vŽ-6Xñ¨üZÃÒI‘zpÍóyMï€eg]!¬¸ÌÀ  ;GHw±ŸyÜé`vµ(‚ò!fÍÕ©îCøÅe56‘ä'WuèI5J‡Ò©>bç#M› O°ì²Ú"¼ãUE6@ÆB·+ÇDp1;ógKÌ\ ¯§€ì4lj~Bï@º»ÒØšR*:A—BdlïЫâÈÌ[Ï?¹‰™€°ß<æP?ì”w Ú{YǤ¿m¡ûeÒhI~“5Ô&º–…M޾ˆ‚F'<\‡Ö´¼wF§€]ª¬µÌJµ´Çž¡Û€W¢À)€óÜlXaÙJ´,Ûóm} 2´„1-ëéú‡ hPœÇ6ç¢ ££h9ÖâdÙ:[ö¬7Ç!òXp”sš“_vÝÓŠmñ̸o™XUÚ›R±V¶ä”y$ʳ¿ ñ…A×ÃKûÆÞм3˜ci`æPqHáKÝÔ4|7Öm’×Oêk•qXgNYÓW’vÁ²NÍj¨‰æ>°°ÂµyÎqØ%,€Bœ K01ýù¢\<ÜY°Pñ›ÿrÙ®aï¦7yOÑunÇ ØB.OðIBúú†Ãó“ºuØk^qÒg¦\…ñ=Ê2¾û!H7’ÝkÏueŽ‘f.Y†¸/¥;?3¬x, †scDAPÙ;Ï3ƒ/u¤’)ïíyÔBœì{E]±…*Ÿñ£Ö|_7Ö_W8ô×tyW 󋪈wŠW?n E÷Sæ¬Ø^I´•1vÝAµÚjí…Ày¾•—/¢þr+ò²ïî¼6äÀS\¼Öè;|sz};ž‹´Ž]Á‹`$ãÂâŽàlæ³Ò«¬òQk~öWÝ>Ôø ®0dpœª>\C£<´z¿*¦Ì·ñû·×òY2äN¨ÞRÿS;‹8…'HÓäBßò÷èÈ™g¸\kéÀyNát4éÐãr•‡8q? ül´Lž½D¿g­iLÜûÆc$iÔxÈàúðÉMÈÖpe òOÖkí¤›Á‡ò½ˆ+Â=eˆbNl•ðÍ7‚ ²ªõÐSŸ`á8 vušÝç2g|…‚…Ôw"ûWDÿ  íZÅ?h½"n bzƒªž ª^þ5f®íäóÆèö°‘åò§võqn—Å8”¾®&áL¦)0ÊÓ^8ÌÕ M»—'T…åB@¸ð•´Ø#pçÛšK!bºâÈFa˜kÁçç‹ÒaØÒ Ç~HÇl]+*ÉBëOo`"j2Jv4êD·QâJÿ,ßèèE‡iN9áEC¢t›kfæ+¯ÔG…8tCó­£üà}k1#)–fÚ¦Šò£”Ú~ŸT-Ö¢#öà-%.Èû%Îó‚bå|Êz'¬^À9]Ë·ÈÙsÑn(ÙxÉ)j êWIhžw$·oý6”ŠBtc3dÔTM-šº5b‚¥Õ†ÖƒÚIYä¾'ÊW­UÌ•¡¥jî!“d ßÞXAdñK€&~MˆR·<þo ØöïeÆù%¥“Ùè¡øQüñ Kd6ŽþU"9šµd¼E.ÔØö…QšçUð[™Ò£6HäÓçõÊÞ›zÒ{ÃÈ'YpÃþj …£ÕÚU¯{¯âÍn&0Iq@B)Ö,C•èZŠá‰ššTPH©øU—øÉ ’ ï2JAÔÛíøÆÚežM³{Aæ8­KÔÂůvg•¹Ì@…§¼Cn2Ë6²®Ó‰/…çÎNœ8²·ü¯MùUâ_½ÔàcöÙ'O☀œA…íé–2“ëkÍCÈLí'‹Ù\]‰¾kquïz“ç_[®"4€[qì#ß„õ~ÓzVئ„¢yè"÷ØRå¼ÞvÅ&Ø6# s¾]sà\åA+QqÉ?'-ÕÖ–à-ñ«°¶?³£Ô: ­XiÊ©ì~•O¶4ô«á3¸ áaáŒ{‹²ñð6:ˆk¤ˆ×ôµ° “XÔçÃÝ$ããþÜè W«äb¼a©í«@j¥§ÊqN6Õwñš )‹$ˆ)œ²VÐ;³PºWÓQU&–SüÁ\–ÍX’ù‹Ý˵!· ÌÛ/ãÙ¬AyuGj…ìÇ^ o‚ñöϯi1–ß5êLßÓ]|E³Êb¿QW­Êl™ßl¼ecÇÀ-ê*rCWIPK'Ó»=;œÚ%™êï ôãæ†6A͘Ïl(.!Zê™ÅŽ.b]îÙzg”ÑîÐHkðÅŒØv§ç㟠ä3l_ÂY:™ôi·|pQøƒ:jÙæ½?ÍM7ên8T0º2‹”Þ¥Z×P¸Æcû.AQ·mî%È<£ÚÅMûõ"•êܯbgåÒ's&3ž¶›0 )À úÐ;ìàÍ!s,ÁžÎ‡EçgŒüJAóÓ |/`vשN™À]kÇÇæX)aÃj²èI¸7`†BÞÏû@w‘^þi0X<|a©Ü£á?&4‘^¤k¢„‹¨Â¤dDøI(ȧ©=¿˜àåõGëãàþsqJRJºND˜Æ˜d¹f€ë¹qÅCi²Î–À©ŽŒ#ý]­|ؾæÊúg¶ SÍç6ñÀ6Lñƒš½IËÞ )Ë(C MŦ èžm9ÅP\Y‹yqÇÑìw'>HJlÀ0S |XèYøX*õ`’•„?6ˆØ醪‚;Á” oûÛõLLÌWŽÏà[¢&ö0†±€«ÏZ¨½åª«€€#µ«q#2þ25¸PJÏ ³ï„ ùC-$°=ÝL0 Ÿ¥®>š`ì5ßaÙ‹´úèŽ ÀšQ-“Ò¥§¡º…çÒÊÏL”ÀX¼RȦOìì’ª_fcÈoàó@°@#Kùù¾E‚i×b_PŽ5szßÙÛò¤Æwr‹tì³åä"ü![1CûD Ò…@ºÐQUˆý€Fd¹òîLj¹O0ä½¹‚׆Ñ!ï/H¨—m±ÚÆ_vtÀgrHYF¬F£êûnÑq¬Ц.ñ7æ_ ÏoûâN[º¼}ôûjöŸiw£ñ>E~s®Á¼žªáÍŸ5#€Uôna+XQ­ lºv$Æ“XZ÷k¯¿ÿ_>*ÍÜ@þQz³DR“J†8ÙÕÅ.z‚óš7L gý ‘†J² !^‡ÖÎVÅÿ!nõ,BuDZkaÐò W?yCM”!fÔÛxãEPè8ì[b¼} ‘†J²Äïô4ÄqÀVw¬!T´uš*.æÊ¨ÆÕy Ø?m¨§%Qõpø:’¬h´ñÌ”äKŽ «ÆoÅÂ³âÆ°ÔºØ8ìØéÌG¶O/#›Ÿ„º ØU’[œ¢­ÈÑÇÔè"Á©í¡ÌBñÚm )%RޝáÖvyÁo­O2eñãf& :ºlÇÔÍÆæ–EóÖ© î8ßå ÿÿü>ëý䆵ַ´ü½ží²°ŽµÈtÌTœN×gHQí&ZºütÍ-çÀ8Ëí%?Œ+%fŸ¿ÿt-×ÍŽf™ÒÎ'[—ª¨ÂÿµåäwúÉøƒ†J€HKÿU~Z>ÉÀ¶ôûgµsHc,ôøÉq±Æ§{ÀEÑÙ:)¡ä ¨˜Ó=©*Fƒ«tÌž¯ÛÊ RáÝZnš)Û±ÀìÜV„'¹Ûر›qƒ§aw ËɈ‘÷Ù_A5[d»ýjLªòd#\í¦@1;Ó_váàÄ/4Èæ ‡dj‹¢¢¿6€¾¤È}ÉÃÃìsƒåìÓ²|¦(»á*v¥ê‡õÿÄ©ÐnJO†Ëöý©k³Ûèõˆ‚ûóL$”BñÉÇ’7>`Vx™3dš‡Ý| ågOWÎk´*€°c;1矩ÕÙÃÊž£ãoªBæa ×vÅmÿÊ^ó7S<ÆÏ„»<‹@hSm7zɯmAݳÄgõ- ·?ïþ®o®¾ª.õâ¿Ï+—þÞTÀç;ŒvE[¤'”,QË£xýdêºXœ_÷§]f% }Ý?ÿÿye|ЂM9+fc'²Sp4½Ø $7£ÌÌ2õ¿U†­­‡§((î G"÷à JG»ôÖB¶íÜŽ«ÿe@tìD_fË ¥fWÁ ×sg.ŠæI€­€”Š”*.T"bϨ›º±Úµaw¦ÍjEÅú3 nêEôÄ„ ¨B÷‰Ò•s1±c½Ñ¹»Ö¯ˆ40 ]×V) †=ý{UÏëy}—©¸>;WðBn”!¸ú5Îr F£°‹êÁêíÿpÌÊ ~Àó|“™nÈ8£{¸b©¹ºK}hôÛÒ9˜†³ÂÁ·ÿÿÿý£I"ÝR…>t¨Ö¹%ÿóµD’ãÝ×Z¬z‘îCˆ>ôΛÆN3’¼Q¨4é}»†"$3fÎ!è»×>Ë>;‡úÈãC A"p‚õwæ¦ÞÅË8¡†G0=nþSÉ"«ƒf¹hÊZÎ8m”Ë…9g!ä¶e„ÛëÆ¶µDD ¨ö =±iN¾Ç 3œåJÊwò4ÜhÁ Ñ\Dg)?€>{,­ÇW¾½hm*NîjKlÈÚgZà ó¸P²VDE@­æz®7¯ƒÓÐo†©LèÖ‚Åý Dd±tAߣ À‡ŠN“ñ¼À>5mbé†Wã+Ô­NÎÜ™½ª}¬J)°ƒãâŸá…#?Cw¢çpÔ™ Öx@3â]YäD·Ìø,$‰›Êè‡k—È«fFèògù¯v,D” µÎ(,n¿¯:¢<×–< eìèìÏ{U‡ôЇZ:êqñÓ%gƒƒÃ¬òZGd¿\77$x¥§"rê<%=¾Ýíç'·²XÌÔÝ/¹”MSK!›i¬E+é’Å+L•WKL8»:ðÂ$›ÉDAñCQþÎzI=z‘c +dd§¶ofµ²IÅê…'÷ƒ£âËs¸"lO:!‚ÑÐQ8E‰wôš#v Jºsa]PÜ(tZœà œÒS«Ê‚»¿NC ­üû5{jËö­@‹=à ¡XÑ]ãP)­LÊ–Ž=s¢ä›¢± nktˆ€R_¹èÉr‘ê•仵E¶g1Ø€¯Ú;Ý?œor\PTͰ½}bŪóAµÍŸWGß ploñÂ-ûŒÐ‡Rå#5 (iý†e:<¼• áiáõ¢Ú!¡ jW§!X?XåWAfŠ;U¹ö€¼Ã†%`ÈO6ì÷]8ã¸KíçHË~1ýRK{¤Ù ÷ÎIÁ^[7ÏÝÿSÙù•×'‚Èâ€Ê4¿Æ$§þ9ÁçI h`ŠÏŽ÷á0ö«Qz-`ʶYµ3È;6(ó#s€ÊêOÒ&=àlKÒ2ÔZ56DoïQñ6i¯hëGqçg(½’Öúê:É/Œ×e£—D­ÁVН¹&xwº‚3á¨p=™2ñÆ’x?ÖkF!7FÊ•­ÿBo䪫N¹³ÇR«Ð`¥Á :3IVû…zô&³o¸gV)7zJNÔj¡ª€«R:‹tv§ÌbâÒ[À8Ùç|WêÏw©¼ ™ŒÓì-a‹·$é¢Cä (ºˆ–mIB:Ï’Ð#Ç[v›âÌÄR­+çï÷s§žBmgßZsf:Ðy¢–³›¦âIÖi-iD]Ôf…£UÈä÷>>5ÿ{Ä¡B©Ä(ºE6M8’ÁYz2)„ù¶ª‡´e¸uo¬ßDæ^ ½n¨„ ¯öÎKD †vÓE¨š¤ªÂæ6¿vC ^4òŸO)³¿ørM㉯®”‡‡·'‰ø.EÔº$øbhžúÃ!€tö¥À_ Ðå 19fvÊÎ÷Weå*†hývÇRÆ¥” ß3>·Ü…ó,s±-,HÎ`µ—¥TkF7,%gÑ—©º'dÄ}aߘÏ\“Èfšÿbo`±6Eú¬I÷Bk«F)à‹ú¹`;ôØyu$"ñ0Ã0’R{mÎ{ç^n°JLÚ/ÑK›ß!ŠLYšB!DµÒÑ…w½ —Ô’:ž—3wS¼¢‘8VHæÚ-¶| ÜÐДcûŸt‡M/FùùéÝ ÎÍ@"l¬.i“jò [F\^"+[°âBÙ¬–e4©-?QŒwWÚ¹Ê _Ø?¤ƒË¸¼¼)ÚH’ª,òp?rË~oÚg`k »Â MawYÉ?¶Å Þ1Ëzrþçç6bšbªð-e;Ê%%ƒ6ÄDU+³.>ÞQ RG‹³ÆX"3q{ ùËõS[)d`5|­¶`5Jå‚"Z×cüçÑ1‘ŽM°þñr<*¦jÙò4Fïk$Ô/FlË5(væTÖâæðO±Ø¹Ñ?~À=§ù1ß­Ê>vÙÈ, *ü€ž‰a 6 EÉ¥¾>qÓo">ð¦ Ñ"C%병2‰8¥”ÿûŸó@7t¹6“]û(‚òHvSÖÓo¹] XMH¢/h£Î­Þî:Û‰`˜Á$¦Zƒf®/Ÿ MT†¢ÊBªT¯svᔿ ¤ôÚ«TœBÒìÖ±âØº@ZßÐÆôk¤EsÍgÃ<¹©1&Èá>,²_´òK6 Õ•ç³µ|”G7»g¤yâI‰«q³èÎ.»BckçHŒÑÿVméÙT wà8b+¹§@L6_Dô«qQÝh—±‹"Xé)<éjŽÛûÔø9ÐüÿNã÷ê† ­}. §Ä£jšÇ˜SÐG¾Ã>]^e'Y¡hªià@Ã"(ç)´ŒeOàÜûBž$¬F2¶$úÆú{˜ |Æÿ`ÄF—±±Ø£'Ï¿©J3Ø÷MòÕÞ½²³þ8ó|ŒVq*Oa;ˆý¦^-ŸDçé´ ‚ÇmuHÏ‹[9m$ÅþãŽl‘H¡Sƒ^óÓ¤ñ=@²×úrnâý†ÍÆwW&—r˜ïF™ƒóÙ]¦i…b‚­•ph^¬Qƒ6‘h†¢³0°SDgÂâã¾òŸï´+!óÌÌNÓqPÿ ZíßaU ìg;ŸÂ÷_ÒÒ_]†©¶™îaV FдÂVl £v\OâîÚI‰Z æŒ1‚è£üÙ3FÄ.ÆÕÿõ:ç‰I·ºwPÆÀ µx"¨ ¥Ua×&ç^q³ÃÕÑ:4!;›î.éåMÉ5¶ÆûYp‘‡å|+N@œ½[ãÝÿ)ú˜„Tå@›:>É|<¾Ct"D•°½aEÞS±¹”œ©± }là7<²e¸&Ÿt‘?fô•æÍ»±Ã"?õ·Â+@4É—¨’ÿK‘ˆÌ¥ŸP…Sk«x§:Gÿ,ÌNe• nL{¤Þ £Š{Þ(Ø©ùþÌðø.Ý¢º¶ÄÍç'x¨Â’&YÅÏ ÚÕxñ $¿ZgDÞª‰pò¢xìW¤vä„mžò¥áI'Þ^¶Ò{|õ&júCÖÚÃoÓ¨ ¢ùŠ\’lrdÕ}MÞž1*àžÎfo ÝŽû~äxÊPúÕ%Û)ÚøÆ #@º”Ý·ŽïóœOùràëX†“}‘ç:R û±g7YÇ…õÒ¼Ô¥¬HºP›§Hƒ—_‡•?DO”ÂMrHÂÖ ùŠ›¹¥Ç—6ôp¦&WqÄf¨±ÙÇì‘Û*^_<nb2ÙâÊóLÈKDO, ×TîA¯ÂÑÃe,Jbß*[;î‡å\—(Úoö±üHüm»`ÛŠz_>²,Ô'1Ë–V Z`b&Ê×JC$"zn+¼SÂÍgö .»ôfõJŸ™®×ërÓõ©{>ŸrMS/1®ÑÒ,RÄË=ã?¬v¡pyñÇØm݉샹Æè3ŠóÉEËM SRÈÎá¿Åå©ÏN¥c,?Šdû@›Ö pŠð®ïÿh¾š]-ËŽ“WoˆÊöC• Ö X÷:uÀÙS¯N$ë¼Ða…!±Æ+óÚå9÷䢃&ãœðÙð$‹ºJ¯.Lhç*Ó´S uس/° Ù2˜€ò”Â[Þ°OS"+£¼Pû×aØ™þ—jsºZèº#Q•ngY9½t× Àd±Ê¾ˆt,îårP=³Þi‰Ïåíc7·ZÄ´®ßV)(.þ¸NxþÄæsi¹šŒÝ¡.ÍÒ6Òïê>aݦ¿¢Ã®öï7ßBŽ`Àr:îžD'¿Ë”EÞ&w}a‘.D'%³û/ÇêK_¥)orHå"<¨l¿5î0Åú0‚_½id9U&‚t¸>›õ‚ší àÒ#>óT'Ÿ/+ÂT— µîiªøãgL²hš¢0+‰B4'zÙÕ ú§T†Ñ±3s-›aÌéGb9¼=q¡¤±…àõ›và‹|¸VMìîØK Ä`IÓo!<&.6dîQp8WµÃ“ôGa Þ¦„:/[úÎ$«àzt÷+ôâüÏ«ÔÿWŸ”a´I1VÔÖz aš%›¬Î±”Q8ÿt½°F…h«¦¯Q)µ²ÄT°›¤8{ ¶6¢»Çótï÷ŠBøÔuFZ«¹¦ LºŠØK¿fx ³8Q±CeJ38sÂÝ£úYqزPI®â4îԚ×hgáy<ÑTàz ÇSÛYj?щqYùÞ4 7XCØ’&MFœTcȼ=ÏÖLy¿Zq yï~ 2f‰·Žbá jº _ùÌM0—st–<Ú`ò8Ò‰ª†ïGÜ0‘’˜ÿP”Ç.™ØžA?)KS­ˆlïXn￘´õ‡þŸ¸ÑmÕ•ò3ÍÒ‰mZ‹Õ˰ý‰¡Eºe¥3qS[±A”Mz›½-í†ñ;«íöA"ŸªÇ¡¼ÓΣ£! ŠNýeÃ-·õqH™T½ÁR Xy¸-wk+;?' Y„"…„˜®Ý$jˆÄ* ÛYúšêqðq¸¬]ßTà8³Ò<†­ˆ§R`§V7tºJ£BÙ²T[Ø¡¸,jþKÍvý33¹zxI|¿}øÙ¥Óó쟧ÚF$²¢$”Ƽz"W íÀëÕ¤‡P!o¾)5»ð –·À `ós?1ÿ_'Ìè: äcŠ;ŸlwBšçÃaY˜é"­ˆ l9ù …@]$T‡?Ϋ¼”…ei#«:í, ˜]øZ^£í·× c‘Jù¸—ÁX-_%e®ÚñËë™ 5Ÿ¨K$y•‡šíR´àÁ8ï"­^è !­âþÌúŸƒÂ§„ûÞt3°¹‚*D=ãlÔ£8i qÀ"ÿO³5¬fÎ À°éÌL­:7 X ­NÀ»CyÕ+yì Ji~:¨Hõ8áÆ2Åž¥Éº×`U=2WT¡|Ñ/9ŽsRæ~ɘ]àweä[¸Z¬ ›Ð6𛺤…ð¿¸ÀÉs‰š2Üh¿éñ­ëcH()þ£·{e*ã.s^ØÕ‚ï³5ˆ®5@š™@rÊÐö³L8sjg>¿Û»ç>¹4OF]ž°Ùß-C¬U êJhhÃ"»ýSdËÈÓ‰š%ÑÀ™vö©jhºhv{´…RßšøF^'Z€yÚ G}Êäˆ[yXJCbÄ0=cc•€ÞB7¢ëtY¦ÆƒèÑ'õHÉÜ•ýõ®Ÿ¼¢{G—ãŽo•w—76á×çD}æÙDw †u(ËîÖhâ;Ör´ßwM?q£ß‡Q£ÞNæ™)a)‡ MéØY}}A½& GIúªY–[“Š›vôRü“<»j--ê”±aâU™tˆ_O0{«ê¨›íÔÆÚ¼./Y!mëj'àYNY4[ßîNö‚l*Iä¸ ó} ¬1mgñûƒ_±vÏ>+Ñ{ÛéÒà¾hGäs?¨±,ÎŽ(W…>è]"%Ì‘‰54‘}œË‚Ù¥»d,Y7‡3œüH×óŠxÿ7O›ìz2,qñS.çH4¿7$xÏÓ%g?‚8D>nÖ¼Áцal’ÇAæÆù éÙÜŸ–ž‚cb½Aráqï% ³So•ŲËmPXßy…v2)áôlÀ€']+ÿ)ó™¥Ïsü{ÂU) )Š»ÄìmEë&uîëjÀÌC§Uù©4-è ~ÜèÕ >¾ÿ"|¤vÉÊÏho'%j*Rÿ*1ÇcQ0iÍ%<óŸÛ– ‘$¾*è›faˆz=ÿIP˜¼}cŒiž©¯c*bç/¿O ôÃÑ¡öZ›õõÑFGňޣrÀ­¶öy»CÈe· QL* Ptœ iÏúb7‡ä°u#Níó¤Úòda“/š<Áá•«“9M¬<g+„2ÿ\KVpiXÆþ"Þ¬÷Ö88׃}<»Ó(`]©ïÕ‰˜‹”p«ðPƒPXMTUšÿCŒeÒ¬Tuð±øŸ~ccngéj['z•ev }bïu'éó½0s¸‚|Q’Í×]c-olÃY"‚…Å]|¸|l=\Ù…ŒZ긂T€¢w’ŽÀ²[rx ˆ&Þ]¬ØÛ®$Ë (é0Uër®‹A¾EôXC¤•gEH?é°˜½û\~òÌ83ε·³3ÙyC>¹^ï$”mä—ªJK»zDi¯T¢nM˜mÆ3«ØsTÕ<¸œ¶¿IM¦ 3dφºdÛJqIOy3äêó_ù5«ŠM´ ëSs8Ë,v1‚¯Ü{ŽÙÊ4·rvò‰|q?ËžâËáB‰À—QîFQæ¯3þz‰º!ÖS‹5¬Ü7Ì]4s’•(ÔnF³¬Wíaký’væŽV#‘Á-÷Øc&²:€Ká ½‹ô91- ºE:ã"|Ibp û¢ š6PLL̯çUYMýß• \âV ϤÓ±j"]s½ß;iöª…¶Î z®¡£zv{0üx®ãHPt¼ˆÃùÍ_ÑA=Fâ‡;æ© ¾E<í}."Ó¡fä«ù9ÎçiêCdKMT:Žpj[3}Yâçå ô;–\1ßb5%Þ´®Ã'Яšd¶Ó;Pú|!ÜM̘ýØ v‹‰ˆ±«=ßc\»øF"çÐyÕ÷OÊFwÍ޳Žåò ÁÀŸñÓ»5\‚WÄuë{â ·X¡£ï~•Öå#ÃÚ˜1Ö‰±ƒ| ÉZ}VB¥ªfpNêÚ]zN±É0'gJsxlÉÇb>*º., kbÏâA(þ) š»Ió¹¿ëœ[ÚÔïPèAí ÍЮ+Åsì.8Г׮ÂãÉEÖŠÿy4:TU+šñ“½¶#©ÉÇj¼‹Tû¨ñ˜6õAÛc £^¸QrÀv¶øcÇ*³UçL °+äÌxÈeÈ$ŸÏkàFûXâŒj¯eWº—'T+‹]°„õIîÒD,À»à¤ú÷Oµ‹]  ¯Í`X›¶)~ÆŸ|ðå÷Þ¸òZ¢PVÇiU|X¯¿_"Å8›4²ÈójTi#œKÕÆp§ŽBÆç! KÎ/£èÁ%•~( 꽃:Üɇô+{Y­ÂŽ˜Ž-BD±+™l®!.Ó¼W¶bS­Qˆ˜ï Þž!¿¡Îål^d\Ñé[ `. q)9c¬ÉÚ­êí·ôdbô¬ìœlü Öñøë?öìfmò^…8=“¶„µ«™âÉæ‚©€ŸðÙƒêÈ@Yüms ß.©g¾(‰ðka“ ï0Dƃ;ET`÷î£8V-‰¤PzYDÑ•Ž„:é¤üg™CÑÛ—ô;h @”q²Ñ÷nàÙl¥¤ }ÁÊÊ_ÛÏmXçA*¶ÒÞhc §t ž› i]踴Hý´øK ˆý†bšËiA—fhÂÁÆ2Íj·Ã¶h3ÿ?¿ª’ÞÙfÌ…MS'R)ç«_,I„38C7ÙDà^X{t‹RÇÖS1Âæu¹‚JwF.4~ÀA¸Oi̶–o ¤œ É–4ýå°ÝD®V3ÎJoñBç´ÉÈ{-Ñ–€§c?ȱ9÷Wßbˆ£ÂcYŘvßäïfäGÄÔ+JÔzËžî>G›kMmT`&x‰5J]KÐÁÖ+J\{_C‰X6Ë$KíÎÔ¬\'øž÷[x†X½rÚ_Ûß‚%,ãÕ]såFaVÉ»C4øh4E$ü`sv†‰#ÕĖ΃{«ˆ]yØ Éñç>t¥ÔÉ:êŇ5Ü 8QhÏ–6*1ÿ@7Úà#ßÀ-N‚Ž‚òÇD ”­¦ìÞ×ÞÓØvG“ÀI†Ä ¦ÕBJøÁËë9é*èã`)Ѳg ašt.bØèÚu6ÚÖ…,dÕ .x`¬7:bi\P Èçb7I]axƆgÍÈ +Dc}›:&I­SfÏÐ!‘‚;™o‹ñ<š–ÂÆùõzu¥u³h4¨1¡×¸4óú†+™’/,Ðð×CNrƒ”na¼¤¦)²9·Ëš:f4`¹}aÅ_ÜCJŠ*Iexï: ™„˜ÉñÅíÀtëœÃÁ †xË¡ÂEçÉ÷$çƒZÓ®³@ã Ä:þœîpòz¦â1{ë+èGgO`Œ?Ϲ¹Sg1ˆÀeЍ6ù‘â ë/¤.ÿ {Ž[3 Ã6f{é8õU:ÿw˜éÔüûÄUcBÒÂÑÝ/>Õ(ÑbV¶Ìn纰@€R,Ĩ•ó]!E“Œmºï%†6Š1 «”:Áfc/mÚ ø¨"3òGÆÁ$¬QP3É™ãCæõ¾$ÚwÓZaýôð'&6£ì¤V2ë:KJÒrè$®Q:“©˜sŒÛ];0¬ Òbµy9d ºã6ë_F ªoCuEÏ©»¼ýaŽ\˜iÚô dìýê:QÞepÇ'‹û1uÄ?–ÑS¦ßŸ¯œf÷¼±S5(‰Å2ë]º/A—AVѰMÍ!µj&tiýQçŠÒžïðÌÓâŽKj6¨ì¾çûëcê=3u­pG{ÒI”¿‡D.Œ÷AþjñÛ4¡ªÆðaxcT”Eé’@Ši]R:€Pâݶº´Åí ¼±L 8“¥z³`Ï\>.4Èßi„âÙCNÜÙz[=˜ˆüæ_ºE±þnÓ0|U>XI¼,C–I›X©—(x³þÝ”;ó{¼´ÇT<2gßwVŽkö2t ‡Åy @ûžûš®(VÏÙÚœ€€ó}º}º¿n®~ÐßáµÛÓ‡íè×öè&ýºûz±ß·¡Û|~Ú—öëíÑ¿ÚÕÇöÚÿ[®?í×ióýº¯ûzªý½ þÝÿ7LogŸíéSöègí«?n´~Ý}ýª\?¶ðýº“þÝcŸ8ïÛ°Ÿ·¦Û¼¿¶ôÿ7K?oT¿íèköÝ_¶Œýºk}WÇíVãMZn÷9³º|hDiG¼Þ€¶‘º¥´8J¯*\Õ¿÷Ê_2ÑúeZù”Å{–o|“ ´Ö¢ºÒÌýWkOy¼n›¨%lPJŒ‘I8$µ¦Ü^¯a¼XbëÅÚäýºøø¼a2^»[Lª )7ÝQkÐ~+¥/¸?‚Bî)ü ÃÖ÷[=ÙjSÌ~y¡Ðòf«§‚÷(¤îº’)…±ÌÍV¦ÑE‹GJsß.ð-Šº·‰B'@φΩê:ð-ŽóŸZ‚Mþ qd-Jîä£é*]Éš×B=ä€FÔ>ÄÓ¼›@&° XvxEjPL¯< M7­-„fFëñ (ÉHüRQÛ`wßþ©LøER¹dˆ$´–R6¶f‰L´xƒ ×%ä%¢+yjGŒ¹Ô ÈIì)õÜ­ò:¼!WºrK`¿øi4žòçNhóÜóÿ{Âp^—o†S*¨SŠÙ‚¡ýÚ'rù!ò‘õܪ»;ªÎ̵O.ý?Tg£Š­Ò¢m ‘›ž¨GCÊ5om#¦‰II¢<:DË(È»¾-ÝŸO‘¹žSb†CÙ|Û$·÷±‘Æ8L^GÑ h¹Ñ+‰ño^û@‡1yÆÞÃ|Úé#eüW`•aò#Ô½šà hXGvK+?\ñ¥(GƘÁÖ&Û/V7Œë#WFö#a"bÓ1 Á«ìcÚUO³·S×îÜc†-ï¸ïÚ†9¬Ä§YÎéF…ªµx+¢ëÏÀä Ç–ü[XQ^Í)‘-!ÇðU¹CQÚõÜ0äleÃLC‡3?›ÑQ•p?Ù Øœ/+î4I“Gó4Àq0d—g¢|v¾'TíÞ¡žŽêÛÍ‹ ê±H¸ìšÈ€½ÁW©Ð4Öªå$ì׃ÃiƒËƒ¤rþ¼øeèõö·ýòM –Ô§Â*†ÓXÌC$Ã¥ì”ÊŒuÁ!4ór°€m¦ï BV¸4”¬›8¶Á«õ+©&jeŠ×ƒÁ9J-xTWK΂< xz]ŒôvSZÿ€?ª‰ÖMB~½rîŽPYÊr¥)½·‹™/¨í‚3¤@k"B&ˆt ²(Ž#ÛÏ–òVàÅð´«| i S±ìmëLˆ*_KîÃ_~+Õ·ë1®©¿mÍÏ,O€ønÆVÇž¼ØülÎy„ØásHøîd…µ©Š×»!ÎØ…ˆa"…|wú5 F ŠvžAÍEIQ’Gfö•ig‹E9]Öò&c ÜWæD†´:ølš ?Ùp{=‹š4Êú¸¢¦s¼«Ìýñöp!#¿•fµÝá6+TSyÎǽÓî (_B_mmj|òH¯)D7ÌäÁxpáÃ)Î>¡Ñé娞âcé+ Oï¶ „ê&®»@Ñ×"¢-”Ý~#`zHy™M=\nh7Á^ç?@²/j@c>)õ>Yo}tû"Õµ™9F¸YÁXUl°ó€ŒõðíËP6¿jª&Èêz™ß²…0Ñ! 'Ÿì~Ûcþ‰…{ Šë×%õ¬„Pæ\a÷Ñô &bª{x=–Ίgœ³¬<¦‰ƒk›a ¹¸™±¡(€âŒ=µd`R“S&" Á\¸£A"À‘Ü™GfÕåâ7óEE5ekcHkÇ~;8â‡d¹òð<¹u(Rìdt™OŠÌ~^ÿ”ïVƒû1e_ÓW'¦õz+`¶v¾}µÁJÕÞ'ü°%™çöˈáó‡€ÂêÃÄÕsêdZϦø=òz°¸]+î…ß•¹¹æ$*¾ÆDêï‚åKo5&~Fª8Å3×@–Ï8=pÄîw+Á‘¬v|ÊÞ.à•x(¢¡‰‘Êì$ šÅÿ/sÌ©†|:ZÎY&š.Ÿ—§Þ¼îžQKóÎke 3wco?yé›sbLý\>ÆÑ²ÿhß³<§²Ø«ª/¥Æ¨rs±µ7Ê¢ L%+„ÛXã&s:Ê" p;¨JÕ­uMÊur"ºP4T´4÷“(üœPÒ'BEžîuF˜7ÎÖù-wgi¥& Ý[Ïr¦]­V££ØÞ°òúH=c¤¾÷ÃØ¢vô_Š ŸÆSêh¹(˵Ë}T~Q X’ˆ«/wï)^G£Ö* skJ£ßM‹zrYiT&þSzKÖ ¢1çÆ9©Æ ³Ô õ ?v"?d:ñckŠÚ!Ž‚yÀÛêfÛÑšsõ¹¬ò‚É?‚Îz@óÕ£i 1êFããk°G*ÁÕûì>ˆeÉŸs.ä,–íJ\‰ŽÊç½–³(êQ7Û8ý¥JÛ&ù]2uð}VI@4°I£"„ì‰mž´ñÕgºRšOP\à~ï(·9å•«Èâ6x”Ž©’ò±åËaËì£[Ê&(ëÍk†ðö•àü r,\ufÐüR×ûªEGD¥¤­Äo}£kÖLÚkúuL²þ¢%<£€øö ¡ش:ÚŒKó4î%ÊÕ(¯Y, ~“›q´ö9)ý½vÐV”4|i=UEÁ|1C'ÓëëÓWùd-(ÛlÜði×¢v|}…(âðD‡FwÚ=„ñ(1’pÐRʤ·[(Ê:öäA}pÇj½;Ê0´€˜›w‹%Ýç­/ÕµFe³† s$ÿb:üÄ[‰cÞ›èÅëY…9-L߯öûq!çø3¯øq‚?™t²l/“Ï] þEx›„…ÑÑZñC`“¼§uÆ£D2° 7Èâ½'Û8L5ÏÈÞìëÍ7FoL’?LŽ~Ûe¦t0ø¬öÅLòÞlÝø5;–'‚®„CXißV¹ô^¯Y›Ee©º“ù* Ò!ɲF¹ê†çæ—?.¨lÝnå «ÒU7Œ¨œ'åR¥6£ÍHþhß©—¹¨7Ã~!{o5Byx¬::ÌÉÿYîæ˜“Œ8Tûø^²r´ÞØîWÝ/P>­ÏREÁâi‚f»ó¼¬M5Jî|hçßX¨j×:J³%¥š„vó*©pF.CE¶H/ÇÇ ¿$Ýù³žhØIx}q•€íôV‹lã+»grWÙˆÁÁ[¢#Éqe¥¤ë‚Y¼e´¬•C}ñO>:ï>t lþŒÚŒÂ¨õª2µpnÇÒPlT¶úDÞ¹Èà¬Gy›Ä® ^ÄR—ÕvOÁ‰öiÚ|°ŒÍŸ¨ŽÄn:”£Bm­e‹Ô'¶Ãh[l<=nÄ‘i+G™…ýqVa…tI:–°2©¨P SjÍ_Q *- %§ã—&A*G×÷ôóéá›è—š‚ÄÁž+ü‹ˆÆ }Ï´Åc‡°~ä þ¬ÚÒ:.y˜ Ç® ‹lÙHkl]nå $XüønËäÍðñ†sñ¸fó;ûtµDéÈy äÿr´´MXÑh3‡§[ÓôR™P¹“B2> k¤¡‹æ0°^¤°ä®„ÕJÙáòg`Å£°¯Jp»I>­Ò2n Œ_¿¥î³ì?Ðâ9€y2–ø ÿ/ù†“ÿ6ÔZZ_ŠÈ<Ȱx°fœîŒûÚê„ÝÀ. ç¹÷êlH@M÷¹uhSîŽÔdW#ðd%”%—°GC%•q“÷9ÎÐú±,%Ì–ú#XÜÁ3ßÞ27Ajcˆ–ž³{`7 ¶$°¾Ò@´ÏuÒ»8w-Øe^&a%I aw÷9ìžš'W CO7· ”•=œƒÁÕÄD<ÊÔéˆá˜æ{تÇa0ð~=>ï¹Êì6T¾ø·tü|o#žf‚Á$å¤öýüŸ:¾VìÚ¤ˆ¯‰v–/ûÎý.Ó+ìÎ'¿ùY -v¥;ž–™MJ…Å1`s}"Iyv;Ë2jF¥ÊA#à“nîW£•›æJiìç©¢œ+úZÉ®ì^èB0Œ€‘˺¦õ*uÓÛ@žøØDù€ÕbÒƒJR¬gRÔa‚òϹló}WÚ°I(ØSã uŒŠ  £Â*á†HGWÔYÿWr r½+91d“"¶cHF`L¢¤°éúdX©–•²ÿC£ö÷_[D¸è >~7 x½S°Ovâ;„Ò °©Ü·æÈ{©]9áØ6W;öŸì19 b¹¯­úU7 ÇäÏe_n_ciÑ,ZÉnp=TwÏ›z ˆæàÅôæFëÉK·l°¬_°¤ÆLЉ òò¾“q`’¹î0‚H­¹±ÿDr0ïôúøX[Õž¥§DVMôºm±,Aö¬/º³Úù–'œjKk½M,£+'Æ¥eߪºðHȆi°æn N Ü¿±üJ„qûÑþBÕˆ.¨Û锨C 7µæŒ/5¢K´U>ÛýÍËÉ>mX玹-SÐ3³æÊnÍ—‚ò¡°[hx«ÒÇPäÉ2ŒNë56_׬A²”Ï'êÉ{YguX6à7aeS-µÄÉÓ3™©˜ 4á+hD¶êÄ¡’H¸]\©a…¼ˆ&¾î4ÍËi,Tlˆ8Êòq$C™üÌ{ãyæUas%žf—4»Lu‡¾•Î Ê ²°s›{ir=O:tï\2ËWq"« Ãq$‡K>ñ®ØÊ*Єö~³2è{‹–¥/]‚4t­£ r»«Íç;\ÎJŸÙÐ ìñÂÿ5£,¶Ilý°†È/=VŒ©Š¸sð|Y©» ½· 2Ô÷Y[ (GØu§]“?a;«|I\tß ÎêÒ÷¡´ËšUö×\¢jEöXüºñ³zÃÅa8I¥öÊKÍpáÞ `dÚ7áÿ§4‘©Î0T L¸†øw H›»PÖéE>$ðàÌW1©é±ë›†í9 E£ûMˆ² ‰)ʲ—s§lŒù·Dº¶­)/‘]yÕ²¦ò?ø—Ä4¶òßYt³@éöH&(\`΄?*½L ·) À3û7cÆ7PÔ½ ÍvÌ…´FƒK禈š/Ù¬¨H”LËì¬îÕh·¯¼9ùßÈ!piÔá¼+3xIªvè“…’ ÙlCø"•}\T–_µèîgqÑîpæ'6Ü(ªêÊÆ?_²l㎌¸`×î•Z1§A¾»ðæ?%[èVl?ƒ`­Âb:(˜;§j9<¬:Ž<3 ú=bœ-~“qùÃ*XÔ– /ê]:ùJ4€¤¸¨|:“$H9ˆ'i’¸/§ dƒ/Í9a™ñ¡·i* î^·.û`–SÏ510å¤çä8gH5ÓúfÉÂn½?0÷s'J†„tÏæ{öy“ AF&úuñ6²àÑ#³OÐRãÖÎGd/¶\ÍÑÂÆ»ŒœÇ¹ø)~‹2 x×”µO\ª„l‹'uÉlþàª-dùøèb¦Ž*é¶ßCU@@žr6ùÜ¿¾ZÐbÕu¼\¢ŽÛ¶™{»PoŠãÓJA›œO åg&q‘­vvìÀAk(a…›Q…zéÓï:ã bÍâÒCþXc¼XÏ44†(V‰÷}¢0øS`M¨É á` |9àçšÉ;ÀÌQY°ÀzU(‘¥LX:àGëùA ¶…h´»y”kLÕà²ÔÖä;/__J`R¾y4 œUÏÊ}êI.6—ÿbž\#TXm"Ö0ZqˆEP©ZšiІ`8è5x9Tí ºÔ1SˆpIH"ÿ|ºe¶çäÝÅëg\±q£—³×oÀD-qL%­çNÏ´ß;’ùÀ¥ÆÍõK |)Ï“­åæØ5ûkŒG’õ±O(–§rU+¹ø.Ã]»¾3Vfp溮øk(GRùôOšeâ`" ·D5#Ë °v¦ (w=÷Bþý¸ÀA°']!ú¿Å°í‡€úAõÉœ&âÜ/úŠø!û«:„­OÜs”Qd÷}t½D/T3§:¸¨øtW3)ڥѣµþÓbÚS5éIMþÑ·=äÆ}¹7qbeHÈ{=R_Ÿ)®<Áá=²fƒ²‹´%ü_.W˜!Tˆ‡• ƪO+Åøÿ=}ù, ÌÌ|Zh?C=L׳cFžâÿu=`üý5t·"5 •)¯1êxÔ´snÁ½tD[/ 4"°$åp÷Àkߘÿ$swÑÖMFM¬˜uBb¦m΂,àNÆÔ :÷ôÑþîYý³0ÍáPFúLóø6©Þº¨RDkèâþ¼:â¶Ö‡ÏÞ€©+Œnßá”ZÕªmÏUÇÿ<>í‚CÛž債®+ ­¦Ò¦)óŽÁ&qè}6ãÊ¡ L’yfPï…<õp†å˜MyWP(5„!›à»")­È Ne7wˆ„‘Ó{ðr§w¾lÂÄ\¢¢'¨¦·`0]Ô²'Ùëdtvå’é\Ðbç¤ßŽ‚=Tb`¡FY&ÇþŠSªëTç}ƒ_cZIb­È’"MÁ–imkÇADùÔ }_Þf=MK©A%-vÎs®yäW„7 |§ô^ß}€~ùˆ_*6⇬oêϸ Y !9)^å¨1Ñ*“=EËö@¶0Ò9–X_à ¹ìçµx1_º¸r¨ M knpÞAT õHÿ òØf.Z-ëÈÀBtêîcé;AåA­Ýh-6*BfÁeŠSÊl?$_sOjDT™0·]vŽ—RT!jG]`O&’|%:g-l=;¯‰Zµ§Ã/?2Åý%WÇá ¯ò3Óf¢é§éô·v…1¦kk/9GŸ›¬ ÀS#=b¨ç×ð$ò}ïL±Ip!Ç Î ú>R¯1„ ¡ £vœ3UÉ‚ß̆½§ïÇ0vVw$Ø—I¦«ÿKô‰p„yWêäi%p®Ëˆ9•a~ `•bçÄO®é@a…Ç70&øq¶Ë+ŽVãx–$g_D‚*w†\ÝnoÃ4=Yz˜c©sŸ¹±AŽ L³ð6ü±Ÿ¯ã‚Øq%D¾{ø™¢9ï°Ù|IO´xsÙ§sNŠÅu^-q)]õ·ÕsÏàÇ(G®ãZü¶ À®ç‚¤mj©¹0ì)p&gGæÐkz{0T–koÁW@úU‹PX×ñ¥·U"„KâeëÉ!ˆ…Ý|ážÚCy>Ã2¨½½š5÷æ’ý‹,³ó‡LþXß}µ„#– GÅÙ}ïº Õ Rdˆ1_Ý}È;‚Öºšâ³ý°*o¨' Ó0èŠk5—-)Á¯"à?tDžJm:Ü&èD=œŒd­†Œ™'Ë»$f™8ï'µ >=zäèrÛ¦Ë v]*ƒf£¸ áuoø‘kú„v‚0Ê{VqGJl‘PÂ,%æTºMQª@ù4Û×cèd—ã£P™³ýCuÿôw¾§Õ’ÞÕTS¡Á äõ!Oã+ƾ‡ ñÃKzO“Pð'o“7ËiVÀ™áº6v¨Ù¯(窵•æK #-þ¡¨«ÍÉñ’ai§NZ‰ZsÂ-°ˆIíÌËÀ/]XypZïA#òû ûk’ VZ'voÏc H%à(çÂ\ˆyØô¢?Ëz` z£Å8êúD¶i€Í9h°!¥“¢:â‡é¸ûÔäèÞ8ßR[UYX2¿YÛIïr²ÎSÝl‡Wü+¢OK”Rî䦭¼!>…tcGdpÉ`Ììç(À¶àÔÏWAP¤`"2L9±šaà:LBﶺâ8à6)ÅÆShzÙ¶Ø Ó W€ûzÝŸ‡Óh ‡}êáÕv¶‚.c³¸¦gŸd [•ŒmZm&C[Î}©¹¥­°‚É'øgäOZ¨SB ùŒPý$gs§r¢ 7ŒTùrÝË¿WD. « s€óâüœ¥!Þ*1¢o‰êj×fë¹›JÄà»3ëH±|pÓ­:ŠÊŽtâÆX-±È4ƒˆ´¸‹Ëuz5=ïk¢Ë3 ÜÙòPîñc¡æÌT )ïüPàZ¦¬â[¶èÁš$…¥¨Yžå +Gß Öûj_wƒ±³gFŠa’ §6@%¥€Ã/WßxyUÇÉäï÷¬¬{ÿ[=Œ‹::Î?­doP  l>õò•¯½ÜOž'ü€’M|\3èàUC–ÛuF‘¢“vŽÒôʯ t÷Ð9ÿM¨°Òtù5ÁE xkþÜ!ž!jô¢—hÑ8YF=\ ½»÷ž½›Á 0ˆæ:›o¸ âlŽ&üXx†uò‰<$L@t›JÛ/({ÕöM¬èlG 6µÇqkÅñ3ÄÄÄF#YÅŠ»•2ÖDÞÿƒ ð˜CÁõûº.Óœ˜?Zqg ºmÕ ¦†îYyÿp¹r¡è nd(ƒ³Ò¥$°–è‡Ì´@n£(­/ÛÚNÐä Nã=–‚A‰°¼mÿ)@|Õ¦òÚ%Ï{jèHÇóÚ!`EÚ¸ Èñ\ӬȃþÁV…AV¿[C$Vƒ34L–Îp‚jÒHF^¨L2 æÀåò°ù¹ò¬•»B_à ülW!ÂBßþ&àÀLðßieC9Ôþž,æß3KJ;Þ¢ˆÉ4†!ž÷7[ã3“µÔ5Kÿ„…‡Ï#Ĩ®†Œ•0F%’¹cðŠø*U>w!önûØ—âNKû1‘œêUŠE%¬ÒÔt¨v|ãõU°HÊŽ­æ0=T4LX¤—¿ªWb7 iYö:^¬hDz8i>Â0=åC¤ƒ¸FRˈOXÚ!üÈÊ,´¢+GéÓÆ1z¥^_¶2N›žæ%RI)L\”yÃjt=–¥ r }ó½ÖÀ’6-ž¾j§{@œxèé©7oTÕyD=¥I|·µÿX' ƒ³çÇÖ•s½ž5ŸØ}žHcãÈx}›ùËnEÍ¥lï{²ÍcëÉædb+CŒŽŠ/–zGgr­”Å/ˆý»:iãH € UÈö8}d  §LáÔÚXŸÿ].)œUzå q'Á)4«Ö§Qš„ lÙÓ››¶N˜DðTL“ë*Í8Ü(³¤E'MOÏÔ ‘]Õ žR%Z´fŒ»÷f9Þ(ÖÄ”>!ÂújïE¥-'*EÇô÷œ{´ÕbΚ‚¼Dkî V`l“§_wï(|éžfh“èÆÌ§<Ÿt}°ìéÏžž¤-uaºé)MÓ¤þ=€šÒiˆøç‰Šj×úuôuñ“² ¦P­«óÅ‚•:…`t ÒˆìNq@~ïvB÷|䄤û‰ø ãT ?›Ä_˜Fqâà,Ž^‡ÑPî·ÊæskÓA{S “´JÌQ¨p‹™¨8Êg©*TTƧ¯„¯(„¤ÐKMÁ’>Ò0‰ùœ®h#€˜Ÿø%ol+f]6v˜Õç'7ˆª=é¬<.Ç¥ò­ÐZÁüÛ ïPN‹xÄ£­ì£™PÅ=>Q9ô\ÒxZ¦óÄz€“ïp«&fñ/'‡Ÿ¯ö»eh`êx½#˜?:R_Lßr]Ç*(ái: b¥QžZ„òÂêÖþí]´eåó,î“ _)|õTYòeQYÑ`–¦ ”_ZħñKS!1,:ýL¶IÄNÞz#ÖŠ3ùkÁ¬O:à0ôò“0ûªÂKÑSÌ«»›O~ºX/Žª|… ¬&Â/H28—ƒDEqü² ç$täÃûªDõk90ãÁÔF&#ALHÛIޤó{}`¿ ÉôKܳuƒaÀͬ§7Ð|Ãn‡#;òº±ÿXìyX`h£äª,'×âÁôñì"¾Äm÷½Œæž#"ШKþ™3e, %þn’¡©âPtV¼c9çòŒ>šàjÝé©å¡D¶­[SËÙÔÁiõZÿsP¹Žj fÒMó­°Ž©Z‡$´Èñ™0½[ëaÀÑ9Ú„6GEä32–¨š<ÀãU’ö{•n ªúæÄdjš½Â @‘e¼é&|bõIXW8’fÍLˆêý]¯ûبõzÀH M@Üv™VhG‹|uêïßo­+º·IEÎVÁµo-óîaY´àL(÷(ó©Úc’#‰Ùöj$ûšÖ98KjQê¢dbÐ1µ&d«ö9þNÓ¾µV¥ý”CW;Bá\¥MN@ÈŸ¡‹“äDz|‘`9ÿÿ~š²æñ5[cÊRr¬œvysT+ÍN¬.î ë0 {³ŒÕåÖ½o†鎽ã1CÇ(¥Nˆ3”ìLšò»<”ò ߆¡DqþgC¾iëÊî=¨f§2Ã]ï¦dª?ïíûà§Ï7W¡#wKáK²Î¯v³R‘"¬$GmGØ7·‹§¯ÞËÿoÕ '¼c„jŠ%ñ¶ä1 Ò¹kÇ,œ°­ç¹¬Š!iÔƒN/ÌÃÙ°*.%ÿj46;Úìòè=cÑA$Ê Ç0S4R¶À9&ëǬûs ŸoÐqF4ª;4¡×ø³…6Oü5ÕÍSdîêÛ¨¢Â”Õcdæ´›”¦ ì«NKºY•ÿh÷»¶˜ç}5®”°^0½ÊžØÇÁ§!/2Q ¸í€c]³–9¥ý…7¹­Ç6I74†*œóß²eõ´XRÿ’ï÷âøï°Àªgo¯ã}R›÷~…o<ºê@ºN¢#jÙY9gà,âð ¼xsµË¯ã;€ûýÍ;eaw[ÃÄÞÄÔn\ãWiîµ/tpõÚ"9@RÁRýµYÿú³9¨HV•F±EM¢)XXoå&ã‚3>×I z|þ¡x®<ÅøX¢tûîüŽÊíLaZÃX/åokxŸóð­ÿwè˱çßurëÕÇX,œ’ÃE:¢d á÷(}ÍéÔà H+I$’I$’I$’I$’I$’I$“7:õÇI£Ý*½ËXY¢8TU } ×FIeÏKÁÙ™ ‡R+ß‚`4ÒÉ…5݇¥ýc ˆ‘ÕV‘F;«Ì7"]Ìró›˜å^†W)󳻯N2ÝÑž¹–Óaû¨‚]¸£ßŽ…7²ÁY‰Ê÷W,@_kÐK£RÞí_$FO ËËÝ›YÔõžpù`4gW1Õ>oÏÏßQ|Ž=ÂAiÚ–s0m!ØS!¢1ÍÛ5b`ÖÆðƒP&í ŠlKùÝ5î©XH]:BëW¸Çã)”¿Âq:ìŽ B‹ v74BœQý{sê³ÁébH[>Ç(3ü¤=͵ Ön¡*«Ñ³k¡@mãxzó›Í.Â\{)©Ê£bÃGÂ4,?È;Õ\šngãûލÔ(m¡‡àØ‹òt ;üÌ{vŒj52÷Mu Ñým0YX­…¨­ »jôƒ3f@[kã-ûA¤£ðô^ÞyH¯å uCŠOO~×ã ün@¬Êc5òNˆÔ¼·Ç_9”‡l.©È*JåÛ LÒevÓ\Žò…’Úšíò/küêtV3kÒV«( ›ŸÑÒŽN‡Ã1A—D&x$D3}mÁä zòAà®A*8%°äÌšÐ9Õ`(HÍZ–‚”ÂÕB<¤³M<°uJGûýáCÕ5žo{Nâ‰Óið[ä‰/hÑȈîWÕI,A ‚¦ž9-úZäóx%“u§˜ ® åþGÃ*¤þØá°¶ ÅYúÒ¿-Já+‡sÓxcðèµ’ -ÓFÕ®…UðÂiãµh’®Š¬ëŒE޴ή­õ„kU0‡ƒ­Ârô6‚ëgF«×8ÓOŒðT§}:/ÄÁ¦…Â[Ÿ§u§Ñu˜Ug<ç´={¶àg´1Üg¹óÆ×é1åÉÐ\"rp»òƒY´jÓ*,Ø>¶×EìMÇe¤P)ø}WÕ]­t{Ã`ž‚K‰^%ä]Ÿ?Wø‹%Ëç/µ™R¾]t$^æè/V£^,š+ÇÌKh?}Ïrlž #•Q‹o^®Ë®ßÈL "FXR3Áøe*ÑÙ!4¼Ÿb­" Ð’b©Ý{’x¬ì)U¹ÎŸ—½Ê·ã[N¥,Õ?:À¡ëyøãüSÝ—yÖî Øj‰®r)w+®’§ îCxãh;ç--Á b;í:waî#ËNËÛ ÀÛVˆÊí$FoÑ_iKÎ@²õ.OM&b` 3üÌ`žW(„ÅÏœûwY8§Cð³ùÉ®-Jü“X‰ŽÉã \e’䆻ofç”lÄ21 ¸º®ë-h0Ö4&(ÉžíêHª)(KÚ·xPæ3–¸¤Yñ­í+Ø HB0UQ«¬øíW[ð€«×KoâfY#V‚£Dfsj|#–pNyÛ 8Àü¬Ni‡z“j‰†Ô`Úw––ÿ(‘  qäÈé¿J9U‚0ákúÿL=ˆé³§E_ö ØIý~~*U§† Tyé #øôÕÃÐc¤[®)m\©¯U 4 +ÄXih=¶®RPaòEVy2Žáñ£•ú|†£à„îÏÌ‚«µ0RëB4ÜÅÞL‘áüãP¥y˜¥/*x +&©œª’ jŸÑ‘f =JJòŽj‡C`öŒmM¬w·ÑLÆÀ¨w´quží§ž@":që3BOdaß–Q1èþ‰ ¤ †nIPJQ—¯öÜÛIeãÄ"—{²:k>E|à1ŒÜê!,­®£^bèÏ­$÷£ZÉx¯´qÞ¥+å®wƒzØîË-Î_~NŒÜ8aå,Ò­ûYI•8.ÖÓ&òðÞ4Ô§kmõ³ù ’m&ßýÓîŽ;ÝápÍüË|ÍkL[ÎNWr£Àÿ®¶T(ƺ°ºÉ­>r´ÅóL‡u-ÚéöÔ? ÙSEŸƒíÃÏdw­÷Z˜l†ÈßbÕŠB³ä.aºû¿Z½pt,võÕ‡¨w¾**V_Ã6xsÿs]ðË4‹ã ¾…¤ô¢n»C’éli+|j+XWÈá¾zÞbê(áK̲y’XíBwt,$A!K¢A†€ðÜñl˜ "vÁâ‡g‚äîÝ)åÎD1÷Ãñ»Íæ{î¾é#êÜXŽŸvTÓ·E´ç·wRíQìÆd0&î»ÕA²ebó¦çIƒºÔ2~ù×äì®°À]öŒ*æ¼›èOh†Àè& Tl[A °Uvc¥›ÍÈ jƒëjË¿Önibß[{ †¯È_·i7Ð8]ÁÿxãðÓ¿ûñéÊ®—>mžÃæúsDìÙÐ}Ýa'V‘ïdlà¿Úb~á™F^èâØÔâ«à\”£0J+6,– WÊ.ʉ/’¾ö~w‡–‚ÃE§ÆŸG l(ÿYq”µüÉÍ%Ðý-¬‘ìX@ºjÚ ± 't;+¬¼¥äà'AJx¾:5m…&âÙ¸§÷¨Ønæ«òTƒHéÎ(2¦¥d©KÐÃaRâ\Â5cÑ’‘œäÍd}Â^Ç`3З7Ždv7ZXX—Ò¯÷\F‘d S0}Ô¥ØH,˜ÚŸãxZâ™9dµ$÷xrã}¶Á¾¸Ò“\Í|Þåß¼2¿D:ÓBÄršqÆäù'§êåXÌ ÷îÍÔdc…ó¥W%füî1a6ñ.Î$2éôüY#ô7.¿¬RïNEƒt–, ï¸õ·¸Üz¯²:‰t⪾ß)r"N' ŽK‘#MK=ü3ARÛ€GT«¾@mÀŒ›ƒiÒhá'ŒëY´÷òó'ªQ:&‡ž×·“4…{uë)äÕ_бøò-’ñØ´e»³É+ë0'0àC_>gÄ-Âþþ»4-D‚¢BrŽUË@ŽénË“-‰¾í.z1徊eƒñí7¼#²™Ð#d`žP>ú¾Bj1Ú‡Q?,¥B…cÈ<<ðÏ ‡ []t'[ÔÎÂÆŒC¬˜D²yí(ˆFÛÕª¯p¡÷‘ÛÍÁËxvŠ ¥Rpÿ"$ïrp{øT¡½¨º‹àù$üBIîë¬4ß3g»'a=ÔÀ|êÛØyçÚX¨™ŠN†1^{¥~ ýà5zŸ/gáU¤NbC1‰œ ­¤»Åç®k…˜´^ ÝcɇÂ<{¹¶è¯#Y]¼hÎuÃÑ%j-º®âZ¨»¹ÜJŒ‘JÓ¯55ææ•¨¯ð"!LŠ7h“*_ï))?—1‘[a’ëb¶ˆï2dœíÍ 9?S3e½B˜Ç¯L"†??@A¹é;³ó‰(fõÑÄ2´ðXñ¡¼„öa|¡·‚8±ãN …%$áRvEp)‹=Í.uØõ£½Ø€ó¶Ëݲ©"?ç¾ÅVo2V9zÉrŠÉ9$®˜É#1™GIÆ_>á#•zm!?nJzHÀšh ße¢Á¢æ@wCЭ¡É ç µY½µñIf+?ø„7»É³h]¦S`›ƒè¿æwk !¦‘c; NèŸÐ.6Ϯҧl¤‰:™©¿ Çç|ò1QþÊPšÞ«8.A\Š´µlÐKV¤ƒ˜ö•îyÙWVãŸ'ŸžîN‰V§4â ¾öOp'&åký}#%¡M{KšƒH¼Â1Ú T¼ÙûŒÄ¿7ewÒOüËî—ñ! Ì¨›ðL_‡Y6}"‹Y#q%q\xLÌü»:2¬Hˆó*Ú瘥Y4™R´xZ~}v9M<ÏvΤtZšf¨¾†"L=’õÔpN@ï÷MJõ[ÕqÄÇ¥a^5¼œìã.i ÓØ‚£¾Ô}C@íø„þ(ñõÈ-’ŠêüLÆQ6¿«K%$·(’f~"¶H¾¯õÚÈÑ?ÿï{Ï4 ÆR?®*ÄÀ»Ž”¢²ï€·ÂG²ßã¨o®ìÞØ\Ùâ$5Ò¦Œ[ÓXÅ£åB¡4·FKX˜ÑPã1Tž¶>‡VG Å=5¢ÀåÂÚ§áŒ!•K²6{»b(Õ_Dz@à±À>øtwuœ’ïaG«ñ¾÷‘†.ødt“Ûåî ã_¤/Xïþƃ yá¤'ð‰õè;H0œËŒpÜU¼‚²|G€GÂÛ!7‹›G»KT(PQñX¡„ÕM5¥i l;"=·42쫼P(óÌ¢4ÍbÚ­2¦¯(|KVN ¬|Ëó&"ØwäÉ€°6ËL_}M¥=séxÆÒ°øtn„ƒÍ\ ¶`£·¾÷y‹AÃ+_zTB4Z~øîž Ô§(CJû%éiͳnQ|äõvÅGkÖ_¥Ã¼°n°g3þ#+|œêtØûàÔœB—?Ó–'IïÐÅÿ_ ’¬øÍ†Ì>Ú2‚QŸ ˆöí³ê°ð|¥X©‚†Ýiä…4‹4Ð lBISç²ò- 2 þ’,z‚Æ´&›^¦B¸%Ñk* ˆ—_H;iò]È0ÌDþVAMÑ`ª¹`¬×‰õy9ªŠªÐKVQ¡UpzЕ˹2>„ÉÝô;˻cR›Ã2é¾±‚ïU#7¡—›S¹eÉR×…ô±„o½û¨‰#í Ïé¹÷-UEm¦¬ú6¶Šøž©&ºš4´œwñk!bÓÅn 5Õ“­’d9NrÕÇ¤Úø·d´<_Î?¸mŒÕ¯rõyt§Èé Å÷sløÇ†Â´æyf5-|®=ñ€Bš'ìRЀ"Ô¼@»ÖdNëmbf<‘ç¿rÁ¾«öíʉ^ØÂ'r΀s¯¢²,@HÉÚ`\ UÊ¢eÖï+û‡Ñ_¬Ä*§8”?gnr*øêKæ³y*ÊFwšÆGx;LÐì,áÑ^Òn‰CܱàÉzï EÜÉ (5Å×ÐC­ņª0HÓø¡¼ŠÑ®Àƒó™8n’%–bñœìCúäZÛalçw‡'_½/8­øöe?ʶlë<8„ÔaÚRni/¤T «í;ÐWJMZÎ:N\jÄŒ[:`n³I«.eÀr1dâ.”8°¾ÙûaŸk·ö~5@¦peyýe …¸¥J_ôxÏ£/3-óÛiQlõ›éÂâaUë®uúpý…r—Þ·’GO׳càê‚Ë7wÒ¥Ðø)œÜû4¬F³Ú[GÍ¥Xƒsñ÷%ž¦Rrw´páÄ/ß]Ü rã =7ݵ4ÿ_&&îæúèY±&NÕœ] âÃjñþQ¬ìæfC)ÎôœþQ_6PçqáIk•>¾iYb'A½íß±£|_2kDÂ=;_† {ý]ÿÙicnV Bðangband-3.5.1/src/cocoa/CommandMenu.plist0000644000175000017500000000255412456456606017601 0ustar chriscchrisc Title Knowledge KeyEquivalent k ShiftModifier OptionModifier AngbandCommand ~ Title List Monsters KeyEquivalent l ShiftModifier OptionModifier AngbandCommand [ Title List Items KeyEquivalent l ShiftModifier OptionModifier AngbandCommand ] Title Inscribe KeyEquivalent i ShiftModifier OptionModifier AngbandCommand { Title Uninscribe KeyEquivalent i ShiftModifier OptionModifier AngbandCommand } angband-3.5.1/src/cocoa/Makefile0000644000175000017500000000014212456456606015750 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)rules.mk include $(MKPATH)objective.mk SUBDIRS = English.lproj angband-3.5.1/src/cocoa/English.lproj/0000755000175000017500000000000012456456606017031 5ustar chriscchriscangband-3.5.1/src/cocoa/English.lproj/MainMenu.nib/0000755000175000017500000000000012456456606021311 5ustar chriscchriscangband-3.5.1/src/cocoa/English.lproj/MainMenu.nib/keyedobjects.nib0000644000175000017500000002136312456456606024463 0ustar chriscchriscbplist00Ô-.X$versionX$objectsY$archiverT$top† ¯ #$*.2LTWXY]bhilpsx|}€…”š›œ¡¢£¦ª«®¯³·¾¿ÀÁÆÍÒÓÔÙàäåæçìóôõöú #$%&+345:ABCGNOPT[_`abfmqrstx‚ƒ‡‘•žŸ£«¬­±¹º»¿ÇÈÉÎÕÖר *+,:ELMNW`abgkors|…†‘”›¤­®¯´½¾ÈÉÊÔÝÞßèéêíôýþ  F‘ÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$'*U$nullÛ VNSRoot]NSConnections\NSOidsValues_NSObjectsValues]NSObjectsKeys_NSAccessibilityOidsValues_NSVisibleWindows_NSAccessibilityOidsKeys_NSAccessibilityConnectorsV$classZNSOidsKeys€€€½€»€€€€¼Ò !"[NSClassName€€]NSApplicationÒ%&'(Z$classnameX$classes^NSCustomObject¢')XNSObjectÒ+,-ZNS.objects €Ò%&/0\NSMutableSet£/1)UNSSetÒ+3K¯456789:;<=>?@ABCDEFGHIJ€€ €€€&€+€0€6€;€A€F€K€O€S€W€]€c€g€k€o€s€w€{€ÔMNOQRSXNSSource]NSDestinationWNSLabel€€ € € Ò U"€ €_AngbandAppDelegateXdelegateÒ%&Z[_NSNibOutletConnector£Z\)^NSNibConnectorÔMNO^QRS€€ € € ÓcdefgWNSTitle[NSMenuItems€€€XGraphicsÒ+jK €Ò%&mn^NSMutableArray£mo)WNSArrayÒ%&qrVNSMenu¢q)ÔMNOQuvS€ €€€ Ócdyzg€€€WCommandÒ+~K €[commandMenuÓMO‚ƒ„€€$€%؆‡ˆ‰Šc‹ŒŽ‘’“]NSMnemonicLocVNSMenu_NSKeyEquivModMaskYNSOnImageZNSKeyEquiv\NSMixedImageÿÿÿ€€#€€€€!Ôdc•g—˜™VNSName€€±€°€³_Bring All to FrontPÓ žŸ ^NSResourceName€€ €WNSImage_NSMenuCheckmarkÒ%&¤¥_NSCustomResource¢¤)Ó žŸ©€€ €"_NSMenuMixedStateÒ%&¬­ZNSMenuItem¢¬)_arrangeInFront:Ò%&°±_NSNibControlConnector£°²)^NSNibConnectorÓMO´µ„€'€*€%؆‡ˆ‰Šc‹ŒŽ»¼“€€#€€)€(€!XMinimizeQm_performMiniaturize:ÔMNOÂÄ„€,€€/€%ׇ†‰Šc‹ÈŒ‘Ë“€#€-€€€.€!Ôdc•gÏÐÑ€€‰€‡€™]About Angband_orderFrontStandardAboutPanel:ÔMNOÕQׄ€1€ €5€%؆‡ˆ‰Šc‹ŒÚŽÝÞ“€2€#€€4€3€!Ócdáâg€€ž€eOpen &QoYopenGame:ÔMNOèQê„€7€ €:€%؆‡ˆ‰Šc‹ŒÚŽðñ“€2€#€€9€8€!SNewQnXnewGame:ÓMO÷ø„€<€@€%؆‡ˆ‰Šc‹ŒûŽþÿ“€=€#€€?€>€!Ócdg€·€¸€\Angband HelpQ?YshowHelp:ÔMNO  „€B€€E€%؆‡ˆ‰Šc‹ŒÈŽ“€-€#€€D€C€!\Hide AngbandQhUhide:ÔMNO„€G€€J€%؆‡ˆ‰Šc‹ŒÈŽ !“€-€#€€I€H€!\Quit AngbandQqZterminate:ÔMNO')„€L€€N€%؆‡ˆ‰Šc‹ŒÈ-1“€-€#€€D€M€![Hide Others_hideOtherApplications:ÔMNO68„€P€€R€%؆‡ˆ‰Šc‹ŒÈŽ‘?“€-€#€€€Q€!XShow All_unhideAllApplications:ÓMODE„€T€V€%؆‡ˆ‰Šc‹ŒŽ‘L“€€#€€€U€!TZoom\performZoom:ÓMOQR„€X€\€%؆‡ˆ‰Šc‹ŒUŽXY“€Y€#€€[€Z€!Ócd\]g€¡€£€YEdit FontQtYeditFont:ÓMOcd„€^€b€%؆‡ˆ‰Šc‹ŒgŽjk“€_€#€€a€`€!Ócdnog€§€©€_Infinite (no animation)Q1_setRefreshRate:ÓMOud„€d€b€%Ù†‡ˆ‰Šyc‹ŒgŽ}~“UNSTag€_€#€€f<€e€!V60 fpsQ2ÓMO„d„€h€b€%Ù†‡ˆ‰Šyc‹ŒgŽ‹Œ“€_€#€€j2€i€!V50 fpsQ3ÓMO’d„€l€b€%Ù†‡ˆ‰Šyc‹Œgޙ𛓀_€#€€n(€m€!V40 fpsQ4ÓMO d„€p€b€%Ù†‡ˆ‰Šyc‹Œgާ¨©“€_€#€€r€q€!V30 fpsQ5ÓMO®d„€t€b€%Ù†‡ˆ‰Šyc‹Œg޵¶·“€_€#€€v€u€!V20 fpsQ6ÓMO¼d„€x€b€%Ù†‡ˆ‰Šyc‹ŒgŽÃÄÅ“€_€#€€z €y€!V10 fpsQ7ÔMNOÊQÌ„€|€ €€%؆‡ˆ‰Šc‹ŒÚŽÒÓ“€2€#€€~€}€!TSaveQsYsaveGame:Ò+Ù ¯0ÚÛÜ‚´àDâÈÂåæç êë'í6ïðÚÕóèÊöû÷ùUû^Qþgcu„’ ®¼uQ€€ƒ€­€€€'€²€T€†€-€,€‹€€’€B€G€Ž€—€L€˜€P€Š€š€2€1€Ÿ€7€|€´€=€<€ €Y€¤€€X€¦€_€^€d€h€l€p€t€x€ª€€ €ºÒ  "€‚€]NSApplicationÔdc•g€€…€„€¹XMainMenuÒ+K§âðùþÜö€†€š€ €¦€ª€­€´€Ú†‡ˆ‰Š c!‹ŒÛŽ‘ÈÐ(“YNSSubmenuXNSAction€ƒ€#€€€-€‡€ˆ€!WAngband^submenuAction:Ò+-K«Âïåêæë '6í€,€Š€‹€Ž€€—€B€L€P€˜€G€Ú†‡ˆ;‰Š<c‹ŒÈŽ?‘?‘“]NSIsSeparator\NSIsDisabled€-€# €€ €€!؆‡ˆ‰Šc‹ŒÈŽIJ“€-€#€€€Œ€!lPreferences &Q,Ú†‡ˆ;‰Š<c‹ŒÈŽ?‘?‘“€-€# €€ €€!Ú†‡ˆ‰Š c!‹ŒÈŽ‘ç]^“€-€#€€€’€€‘€!XServices^submenuAction:Ôdc•gdef€€•€“€–ÒhijYNS.string€”XServicesÒ%&lm_NSMutableString£ln)XNSStringÒ+pK €__NSServicesMenuÚ†‡ˆ;‰Š<c‹ŒÈŽ?‘?‘“€-€# €€ €€!Ú†‡ˆ;‰Š<c‹ŒÈŽ?‘?‘“€-€# €€ €€!\_NSAppleMenuÚ†‡ˆ‰Š c!‹ŒÛŽ‘ÚŒ“€ƒ€#€€€2€›€œ€!TFile^submenuAction:Òhi“€”TFileÒ+•K¤èÕóÊ€7€1€Ÿ€|€Ú†‡ˆ;‰Š<c‹ŒÚŽ?‘?‘“€2€# €€ €€!Ú†‡ˆ‰Š c!‹ŒÛŽ‘U\«“€ƒ€#€€€Y€¡€¢€!XSettings^submenuAction:Ò+°K¢Qû€X€¤€Ú†‡ˆ‰Š c!‹ŒUŽ‘^e»“€Y€#€€€€€¥€!^submenuAction:Û†‡ˆ‰Šy c!‹ŒÛŽ‘ÃgnÆ“€ƒ€#€€–€_€§€¨€!_Animation speed^submenuAction:Ò+ËK§cu„’ ®¼€^€d€h€l€p€t€x€Ù‡†‰Š c!‹ÛŒ‘uÚÛ“€ƒ€#€€€€«€¬€!WCommand^submenuAction:Ú†‡ˆ‰Š c!‹ŒÛޑ忓€ƒ€#€€€€®€¯€!VWindow^submenuAction:Òhi쀔VWindowÒ+îK¤´Dà‚€'€T€²€€Ú†‡ˆ;‰Š<c‹ŒŽ?‘?‘“€€# €€ €€!^_NSWindowsMenuÚ†‡ˆ‰Š c!‹ŒÛŽ‘û“€ƒ€#€€€=€µ€¶€!THelp^submenuAction:Òhi €”THelpÒ+ K¡÷€<€[_NSMainMenuÒ%&o¢o)Ò+ ¯0ÛÜÛâÈÈÈæÈÈÈÈÈÈÈÈÛðÚÚÚÚÛöûÛùUûUÛþgggggggÛ€€€ƒ€­€€€€€ƒ€†€-€-€-€€-€-€-€-€-€-€-€-€ƒ€š€2€2€2€2€ƒ€´€=€ƒ€ €Y€¤€Y€ƒ€¦€_€_€_€_€_€_€_€ƒ€ª€€ºÒ+G ¯HÚÛÜ‚´àDâÈÂåæç êë'í6ïðÚÕóèÊöû÷ùUû^Qþgcu„’ ®¼uQ456789:;<=>?@ABCDEFGHIJ€€€ƒ€­€€€'€²€T€†€-€,€‹€€’€B€G€Ž€—€L€˜€P€Š€š€2€1€Ÿ€7€|€´€=€<€ €Y€¤€€X€¦€_€^€d€h€l€p€t€x€ª€€ €€ €€€&€+€0€6€;€A€F€K€O€S€W€]€c€g€k€o€s€w€{€ºÒ+’ ¯H“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚ€¾€¿€À€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ó€Ô€Õ€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å€æ€ç€è€é€ê€ë€ì€í€î€ï€ð€ñ€ò€ó€ô€õ€ö€÷€ø€ù€ú€û€ü€ý€þ€ÿ€º`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§Ò+%K €Ò+(  €ºÒ%&+,^NSIBObjectData¢+)_NSKeyedArchiverÑ/0]IB.objectdata€"+5:?U[ˆª¼Êæù/6ACEGIKNPSVY[dprt‚‹–Ÿ®³¼ÅÐÑÓÜéðöÿ02468:<>@BDFHJLNPRTVXZ\^`qzˆ’”–˜¡£¥ºÃÌãêù  '3579BKLNWfmu~…Š›Ÿ¡£°²´¶¾ÇÈÊÖãåçé 3=HUZ\acegik|ƒ…‡‰‹ ¡®½¿ÁÃËÝæùþ  $-8=OXpw†“•—™º¼¾ÀÂÄÆÏÑçøúüþ!#%'):<>@BPpƒ…‡‰ª¬®°²´¶ÃÅÇÉÔÖàñóõ÷ù    " $ & * , 5 B D F H i k m o q s u ‚ „ † ˆ • — ¡ ² ´ ¶ ¸ º Û Ý ß á ã å ç ô ö ü     6 8 : < > @ B O Q \ m o q s u – ˜ Ÿ ¡ £ ¥ § ³ Ì Ý ß á ã å       4 A C E G h j l n p r t y † “ • — ™ º ¼ ¾ À Â Ä Æ Ó Õ × Ù ã å ï ü þ  # % ' ) + - / < > @ B \ ^ p }  ƒ ¨ ® ° ² ´ ¶ ¸ º ¼ Ã Å Ò Ô Ö Ø ý ÿ       ! # % ' L N P R T V X Z a c p r t v › Ÿ ¡ £ ¥ § © ° ² ¿ Á à Šê ì î ð ò ô ö ø ÿ9;=?ACEGNPacegiŠŒŽ’”–›§°!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsu~€‚¡£¥§©²»ÊÌÎÐÒÔÖØÚ  "$&.=F]_acegikmoqsuž¬¹»½¾ÀÂÃÅÇèêìîðòô 8:<=?ABDFoqsuwy{}ˆ—¨ª¬®°¹ÃÅÎ×éðù@BDEGIJLNwy{|~€ƒ…’»½¿ÁÃÅÇÉËÐßèêïø  4689;=>@Bkmoqsuwy{„“œ¡£¥§ÐÒÔÖØÚÜÞàï "$&(*,.@OXgikmoqsuwœž ¢¤¦¨ª¬´Ãìîðòôöøúü$-68:<>@ikmnprsuw†¯±³µ·¹»½¿ÄÓÜÞãìïñóÿ y{}ƒ…‡‰‹‘“•—™›Ÿ¡£¥§©«­¯±³µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÕ×ÙÛäwy{}ƒ…‡‰‹‘“•—™›Ÿ¡£¥§©«­¯±³µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÕ×ÙÛÝßáãåçéëíïñóõ÷ùûýÿ ¥§©«­¯±³µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÕ×ÙÛÝßáãåçéëíïñóõ÷ùûýÿ   !#%'),/258;=@CFILORUX[^adgjmpsvy|‚…ˆ‹Ž‘”—𠣦©¬¯²µ¸»¾ÁÄÇÊÍÐÓÖÙÜßâåèëîñô÷úý  !*+-6EJ\ao1qangband-3.5.1/src/cocoa/English.lproj/MainMenu.nib/designable.nib0000644000175000017500000013627412456456606024115 0ustar chriscchrisc 1060 12E55 3084 1187.39 626.00 com.apple.InterfaceBuilder.CocoaPlugin 3084 NSCustomObject NSMenu NSMenuItem com.apple.InterfaceBuilder.CocoaPlugin PluginDependencyRecalculationVersion NSApplication FirstResponder NSApplication MainMenu Angband 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: Angband About Angband 2147483647 YES YES 1048576 2147483647 Preferences… , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services _NSServicesMenu YES YES 1048576 2147483647 Hide Angband h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit Angband q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File New n 1048576 2147483647 Open… o 1048576 2147483647 YES YES 1048576 2147483647 Save s 1048576 2147483647 Settings 1048576 2147483647 submenuAction: Settings Edit Font t 1048576 2147483647 Graphics 1048576 2147483647 submenuAction: Graphics Animation speed 1048576 2147483647 submenuAction: 150 Animation speed Infinite (no animation) 1 1048576 2147483647 60 fps 2 1048576 2147483647 60 50 fps 3 1048576 2147483647 50 40 fps 4 1048576 2147483647 40 30 fps 5 1048576 2147483647 30 20 fps 6 1048576 2147483647 20 10 fps 7 1048576 2147483647 10 Command 2147483647 submenuAction: Command Window 1048576 2147483647 submenuAction: Window Minimize m 1048576 2147483647 Zoom 1048576 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 _NSWindowsMenu Help 1048576 2147483647 submenuAction: Help Angband Help ? 1048576 2147483647 _NSMainMenu AngbandAppDelegate terminate: 139 orderFrontStandardAboutPanel: 142 hideOtherApplications: 146 hide: 152 unhideAllApplications: 153 delegate 266 performMiniaturize: 37 arrangeInFront: 39 showHelp: 122 performZoom: 240 editFont: 278 setRefreshRate: 294 setRefreshRate: 296 setRefreshRate: 297 setRefreshRate: 298 setRefreshRate: 299 setRefreshRate: 300 setRefreshRate: 301 delegate 279 newGame: 271 openGame: 272 saveGame: 343 commandMenu 351 0 -2 File's Owner -1 First Responder 29 MainMenu 19 24 5 23 92 239 56 57 58 129 131 130 134 136 143 144 145 149 150 236 83 81 72 79 82 103 106 111 252 253 256 257 275 284 285 287 288 289 290 291 292 293 265 AngbandAppDelegate -3 Application 342 346 347 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin 351 AngbandAppDelegate NSObject id id id id NSMenuItem editFont: id newGame: id openGame: id saveGame: id setRefreshRate: NSMenuItem NSMenu NSMenu commandMenu NSMenu terminalsMenu NSMenu IBProjectSource ./Classes/AngbandAppDelegate.h 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx YES 3 {11, 11} {10, 3} angband-3.5.1/src/cocoa/English.lproj/Makefile0000644000175000017500000000014112456456606020465 0ustar chriscchriscMKPATH=../../../mk/ include $(MKPATH)rules.mk include $(MKPATH)objective.mk SUBDIRS = main.nib angband-3.5.1/src/cocoa/English.lproj/InfoPlist.strings0000644000175000017500000000040012456456606022345 0ustar chriscchriscþÿ/* Localized versions of Info.plist keys */ CFBundleName = "Angband"; NSHumanReadableCopyright = "© __MyCompanyName__, 2006"; angband-3.5.1/src/cocoa/Angband-Cocoa.xml0000644000175000017500000000457312456456606017422 0ustar chriscchrisc CFBundleDevelopmentRegion English CFBundleExecutable $EXECUTABLE$ CFBundleDisplayName $NAME$ CFBundleName $NAME$ CFBundleIconFile $NAME$_Icons CFBundleIdentifier $BUNDLE_IDENTIFIER$ CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleShortVersionString $VERSION$ CFBundleLongVersionString $VERSION$, Copyright $COPYRIGHT$ NSHumanReadableCopyright Copyright © $COPYRIGHT$ CFBundleGetInfoString $VERSION$, © $COPYRIGHT$ CFBundleSignature A271 CFBundleVersion $BUNDLE_VERSION$ CGDisableCoalescedUpdates NSMainNibFile MainMenu NSPrincipalClass NSApplication CFBundleDocumentTypes CFBundleTypeExtensions * CFBundleTypeIconFile Save CFBundleTypeName $NAME$ saved game CFBundleTypeOSTypes SAVE CFBundleTypeRole Editor CFBundleTypeExtensions * CFBundleTypeIconFile Edit CFBundleTypeName $NAME$ game data CFBundleTypeOSTypes TEXT CFBundleTypeRole Editor CFBundleTypeExtensions * CFBundleTypeIconFile Data CFBundleTypeName $NAME$ game data CFBundleTypeOSTypes DATA CFBundleTypeRole Editor angband-3.5.1/src/cocoa/Edit.icns0000644000175000017500000054317112456456606016071 0ustar chriscchriscicnsÆyis32¢…†ÐÅãóòðòI…»­ÚÞÞÚÕÿ\„ ÁŽ¥ÆÎʹþÿmƒÚ³¸€¾´úÿÿ‚ ÙÈééÜ¥ûùùûóò¤€ ¾´ââñ‰¡­ÅÉ­}€ Å£Éßð㎽àÚ¨Šè€áÂËâçÇ€ÿé£ ËÌöøÿ3zæ¦Ï«,΀ Ã³Üæ{-ÿ…N)Á†I€ Ä ²¶/ãœBýºÖ+€ ä×èì2ÿ&¹ÿ4ÿJq€ ÚÐøÿ,£ÌCi@SR θçÿ¶“•Ƶ‡¼ASINÕ…†ÏÅãóòðòI…¹¬ÛÞÞÚÕÿ\„ ¾¤ÆÎʹþÿmƒ Ù³¸¾¾¼³úÿÿ‚ ÙÈééÜ¥ûùùûóò¤€ ¼´âàñ‰¡­ÅÉ­}€ Å£ÉÝðã½àÚ¨Šè€ßÀËâéÆŽ€ÿé£ ÈÌöøÿ3zæ¦Ï«,΀ À±Ûæ{-ÿ…N)Á†I€ ®³/äœBýºÖ+€ ã×çì2ÿ&¹ÿ4ÿJq€ ×Îøÿ,£ÌCi@SR ͸çÿ¶“•Ƶ‡¼ASINÕ…†ÐÆáóòðòI…»­ÛÞÞÚÕÿ\„ Á¥ÆÎ˹þÿmƒ Úµ¹¿¿¾´úÿÿ‚ ÙÉçéÜ¥ûùùûóò¤€ ½¶ââñ‰¡­ÅÉ­}€ ŤÉßðã½àÚ¨Šè€ßÄËâçÇŽ€ÿé£ ÊÎöøÿ3zæ¦Ï«,΀ ³Þè{-ÿ…N)Á†I€ Ÿ³¸/äœBýºÖ+€ ä×èì2ÿ&¹ÿ4ÿJq€ ÛÐøÿ,£ÌCi@SR θéÿ¶“•Ƶ‡¼ASINÕs8mk€€€€€€‚€ÿÿÿÿÿÿþ¤€ÿÿÿÿÿÿÿÿ®€ÿÿÿÿÿÿÿÿÿ¶€ÿÿÿÿÿÿÿÿÿÿŒ€ÿÿÿÿÿÿÿÿÿÿùòå€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ùùùùùùil32ÎŽ ìì×ÓÏÎÓìëæÌ‚ŒìÛ¹ÁÙ‚ÛÚÕÎØ‹íܺ©Æ„ÜÙÓ¼ÁŠîÞ¾®¾É΂ÞÝÚͶ÷À‰îßÁµ¹Ç̓ßÜдÿ÷ÀˆïáÁ·««°¹ÌÓÕÕÓÏÆ°ÿÿøÀ‡ðâ󵺀· ¶µ³°Áưˆux—† ñäàßàáââäâä€âÛÆ¨›––”`…òæ×ÏÎÉáƒæåá×Ê€ÄÀ¦…óèÐÅÔ†èæãàÞÝÝÜá†ôê´ʇêéé€èçò† õìʹÉÙÚÙÙêìæß…ìö†öîÊ¿ÄÚèäåîîØ1¼€îíö†÷ðË»¾ÀÏèèççæZx–ƒðø2‚øñÜ×ÖÑÓØ×Ü××Å{÷o€‡„‰‹Ô VÅ‚ùóãßÓÜÞñ‚ó £zyñÿÿÙmcÿHƒúõÚÑè†õN݃ÿ®G„û÷ͼÕõ„÷Dz…ÿk„ ûøÒÀÓæèãäð€ø eE­ÎÎ×Å£lDƒüúÔÆÑàèïïøúúw jÕέ“¤¹ä&H‚ýû×ÌÄÅÒáÚàõ¬ cûûíA„¡{,&‚þýÒÀÃÍÂÂþÈ=&ãýÌ57Œ15>‚þþáØÜóööôóÁuþö;5ïþœ€'5‚ÿÿùõõôõ€ÿ §ÿŸ ¤ÿÿ§¯ ?‚ÿÿíåáçì€ÿ‘¬ÿpÇÿÿ]/ÿ9!‚ÿÿÝÌÚýÿ°ÿ—†ï3ë+JƒÿÿÕÅÐñý€ÿß!-ùÿA..f&"EƒÿÿãÜÚÛäþ€ÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ìì×ÓÏÌÓìëæÌ‚ŒìÛÀ·ÁÙ‚ÛÚÕÎØ‹íܸ§Å„ÜÙÓ¼ÁŠîÞ¼®¾ÇЂÞÝÚͶ÷À‰îß¿µ¹Ç̃ßÜдÿ÷Àˆïá¿·©©°¹ÌÓÕÕÓÏİÿÿøÀ‡ðâÀ±³¸·¶¶µ¶³¯¿Ä¯ˆux—†ñäàßàá€äâä€âÛÆ¨›––”`…òæÖÏÎÇáƒæåá×Ê€ÄÀ¦…óèÐÅÔ†èæãàÞÝÝÜá†ôêÀ²Ê‡êéé€èçò† õìÈ¸ÉØÚÙØêìæß…ìö†öîÊÁÂÚèäåîîØ1¼€îíö†÷ðË»¾ÀÏè€çæZx•ƒðø2‚øñÜ×ÕÑÓ××ÚØØÅ{÷o€‡„‰‹Ô VÅ‚ùóâÞÓÞÜñ‚ó £zyñÿÿÙmcÿHƒúõØÐè†õN݃ÿ®G„û÷˼Õõ„÷Dz…ÿk„ ûøÏÀÑäæãäð€ø eE­ÎÎ×Å£lDƒüúÓÄÑÞèíïøúúw jÕέ“¤¹ä&H‚ýû×ÊÂÅÒáÙÞõ¬ cûûíA„¡{,&‚þýϾÃʾÀÀ¾É=&ãýÌ57Œ15>‚þþßÖÜóööôóÂuþö;5ïþœ€'5‚ÿÿùõôôõ€ÿ §ÿŸ ¤ÿÿ§¯ ?‚ÿÿìäßåì€ÿ‘¬ÿpÇÿÿ]/ÿ9!‚ÿÿÜÊÚýÿ°ÿ—†ï3ë+JƒÿÿÓÄÏòÿß!-ùÿA..f&"EƒÿÿâÜÚÛäþ€ÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ìì×ÕÐÌÒìëæÌ‚ŒìÛ¹ƒÛÚÕÎØ‹íܸ©Æ„ÜÙÓ¼ÁŠîÞ¼°¾ÉÒ‚ÞÝÚͶ÷À‰îßÁ¶¹Ç̃ßÜдÿ÷Àˆ ïáÁ¸«­°¹ÌÕÏÆ°ÿÿøÀ‡ðâµµ¼¸¸·¶¸µ°Áưˆux—† ñäàßàáâääâä€âÛÆ¨›––”`…òæÖÏÏÉáƒæåá×Ê€ÄÀ¦…óèÏÆÕ†èæãàÞÝÝÜá†ôêÁ´Ë‡êéé€èçò† õìȹÉÙÚÙÙììæß…ìö†öîÌÂÄÚéäåîîØ1¼€îíö†÷ð˼ÀÁÍèèççæZx•ƒðø2‚øñÜ×ÕÓÓ××Ú××Å{÷o€‡„‰‹Ô VÅ‚ùóãßÕÜÞñ‚ó £zyñÿÿÙmcÿHƒúõØÑé†õN݃ÿ®G„û÷;Öõ„÷Dz…ÿk„ ûøÏÀÓæèãäñ€ø eE­ÎÎ×Å£lDƒüúÔÈÓàèïïùúúw jÕέ“¤¹ä&H‚ýû×ÊÅÅÔãÚàõ¬ cûûíA„¡{,&‚þýϾÅÍÂÂÃÀÊ=&ãýÌ57Œ15>‚þþßÖÞôööôôÂuþö;5ïþœ€'5‚ÿÿù÷ôô÷€ÿ §ÿŸ ¤ÿÿ§¯ ?‚ÿÿíçáåí€ÿ‘¬ÿpÇÿÿ]/ÿ9!‚ÿÿÜÍÜýÿ°ÿ—†ï3ë+JƒÿÿÕÅÐòÿß!-ùÿA..f&"EƒÿÿãÜÚÛçþ€ÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚l8mk(_ccccccccccco`oÿÿÿÿÿÿÿÿÿÿÿÿÿÿîItÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýYtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýWtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöUtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá$tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúitÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿotÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmatÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬âÿqtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿítÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqŸÿztÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿêtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm'ÿátÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm£ÿltÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÿìtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô&tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿj3y‚‚‚‚‚‚‚‚‚‚‚‚Àÿÿÿÿÿÿÿý@QŒ¡ ‡Qit32[ш‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç„æåæååææ‚åç„åæååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæ çìèêëçéììéëìâêìëéæååããâàÞÜÚ×ÓÏÊľ°à¶¸%è‚çèá¬ÀÁÄÅÊ¿ºÉ¯ÀŹÀ¹º¼¿ÑéŽçææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è‚çèâÐÒÄÒÖËËÅ»ËËáÍ³Ê´ÍÆÂëæçææ€äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%èƒçèëëíëêëíéçíìèêèíèíèçææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çèæéèæççæçæççæçæ’çææ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è„ç âåÕéÝÞéæèèæèè—çææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çèä¶·¨§Ìº­«¨§³²ãè–çææåääâáÞÛÙÔÏÉÀµ§ÝçÚÍÕ£²%éƒèæçâåâëìÍÝÍ×ßÈæé—èççååäãáÞÛ×ÑÌù§ÕñâÚÍÕ ±%é‚èéâÀͽÂǾƽåëéëé™èççååäâàÝÙÔÎż©ËøêäÚÍÔŸ°%éƒè çѹÊĪÐÖÏìíèç›èçæåäãáÝÚÖÐǽ«ÃüñëãÚÍÕž ¯%ê‚é èëÚËÓÙÌ×ÐÐÍÌäê›éèèææäâàÜØÒÊ¿®¼ý÷òëãÙÌÕ ®%ê‚é êæÀ¾¿¶¶¹°°±´ãêœéèèæåãáÝÙÓËÁ±¸ýû÷òëâÙÌÖ ­%êƒé èåèåëêçèèçéêéèèçåäâÞÙÔ̲µûþû÷òëâÙÍÕ ¬%ê‚éëÞÅ¿´°±µ³´²Ûìèéé€è˜éèçæäâÞÚÔÍô³úÿýû÷òëâÙÍÖ «%êƒéèãàäÖÒããàáèííêì€íêè–éèçæäãßÚÕÎĵ³ùÿþýû÷òëâÚÍÖ ª%ë‚êëçÄɵ¾Æ¾¹Æ®ÌȪÕʾ³®ÇÛíé”êéèçåäàÛÖÏÅ·´ùÿÿþýû÷òëãÚÍ× ©%ë‚êëçÌÎÑÕËÕÈÈËØÔÂÆÃÑÌÊÖáì•ê ééèæäáÜÖÐǹµù€ÿ þýû÷òëãÚÎØ ¨%ëƒêèÜà×ÓÚÙéàÕÙæòèì€ïíë–ê ééèæäáÜ×ÐȺ¸ùÿ€þ ýüú÷òêãÛÎØž §%ì‚ëìç¹¾·¼À´Ç²¸Ïîìëêëéëì–ë êêéçåâÝØÑɼ»û„ÿ ü÷ðèáÙÎÙž ¦%ìƒëéêëééèçÜãêèçäåëëæïìæ–ë êêéèåâÞØÑʾ»íñíììïñöûþÿýöêÝÌמ ¥%ì‚ëíä¶¿±±½±º¶´°º¯§º¶°·«·èëéêê‘ë!êêéèæãÞÙÒÊÁ¶ªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì„ëããçéêáâçãßáßÝèÞåàÍçðïòððìë"êêéèåãßÚÓ̹­žŽ‚|zxuspkhhly’³Ìæ¥ £%ì‚ëìçÉÏÑÒÕÔÒÍÙÑØ¿ÒÎÒÙÏÒÆÒÕÃÐÐç‚ëêŠë#êêéèæãßÚÕÍÅ»°¢’…~}}{zyywtomvÏ¡¢&í‚ì=íçÇÊÅÉÒÀ˼·È¨½Ê¤³¿¯ÁÇʳ¼¦ØííîïîñïïîîíîïðîïíïîíîìëéæãÞØÒÈ¿µ¨˜†„‚€€€€{pj£‰£&íƒìCëââáÔâëñçÕ¼ÕßáâèÜâìíææîæßéÝìÚÓåÐááâäèÞËÚâßéÓÛèÝãáÝâÖÂÔÉËú¯£™“’‘‘Œ€‹ ŠŠˆ‡†kc¡&î‚íCïæºµ½½³¯ª¶¯°¡¬¸¾¹¼©Ë®˜Ä¡±Ê«³¬­®·±¯±µ¨°²É³¸¬µš¦¸¨­¾¥ª ¬ÎÈÀ¸¯¨¢ Ÿž›€™ ˜——–”‘‰yŒ5 &îƒíSïçèòæêáÔßñãÑèÝòåéßÙà׿×ïèà÷ÞÝóñõòõàÑááüÙ×ôââîÙàìëÞÞåäÒÏÓÌÆÀ¹´¯®«ª©¨§¦¦¥¥¤¢¡ž›—’Œ Ÿ&î‚íCïæ¿¼½ªÌº»¿Á¹ÎºÁ»²¹Á¾¶×ȵÆÁ·µÎ¿Ã·³»·¥½¼½´¥¼Åºµ­ºàîëëèçãàÛÖÐËÆÁ½¹·¶µ´³² ±±¯­«©¦¢š¢HŸ&îƒí@ìÓÙÌÃÒÈݶÇäàÑÙÙÜØÛѾÛßÍÆÓÜ×ß»ÇÉØÓÐäÕÅßÌÖ»ÐÖÆÕ׿ìëêèçåáÝÙÕÐÌÈÅ¿¿¾‚½ ¼¼»º¹·µ³°«¯~Ÿ&ï„îòòïðï€ò€ðóòòñòòñõð€òñðñï€óñïðòôóððôðñòîíììêèçäáÝÙÖÒÏÍÊÉÈ€ÇÆ€Ç ÆÅÅÄÂÀ¾¼¸¼œ &ï„îíí€îííîííîˆíîí€îíîî€íîîíîííîííììêèçäâÞÛÙÖÔÒÐ„Ï ÐÐÏÎÍÌÊÈÇÃɧ &ï³îííììéèçåãàÝÜÚÙØ×ÖÖ„× ÖÖÔÓÑÏÍÕ° &ð„ï îïîîðîíïðíð‚îœïîîííìêéèçåãáàßÞ€ÝÜÝ‚Ü ÝÜÛÚÙØÖÞ· &ðƒïðóðóôëòöñç÷íôôöôôï îîííìëééèçæä€ãƒâá€àßÝÛã½ &ð‚ïñè¯ÅÃÉÌ¿³À®À°¿¿¸ÀËìðœïîî€íìê€éèè€çæ€çæ ååääãâàé &ð‚ïðëÞÜÏÝê»ËÛÙÕß¼ÔÈÄÅëðï€î€íìëë€êˆé€èççåîÅ &ñƒðñôóõóððõôôöóòõöññ ð€ïî„í„ìëêêçñÇ &ñ„ðññòññôï€ðïðïïñ£ðïŒîƒíëõÊ &ò„ñ èìÞçìßòîðñò©ñŽð‚ïîìöË &ò‚ñòíÁ¿·¯¼¯³²¯²Ìõð«ñðîøÍ &òƒñ ïóìîðõéØîÚÕÝôð¾ñîøÍ &ò‚ñ óêÃÏ¿ÃÉÁ¿Êöòóð¿ñïùΠ&óƒò ñÝÄ×϶ÚÜåù÷øö¿òðúÏ &ó‚òñôÞÊØàÍÖÔÐÎÍËÚôñ½òðúÏ 'ô‚óôðÍÂÁÅÃÍɼ¾º·Ô÷ò½óñûÏ 'ôƒó òîóïòòîïñðôùö¿óñûÏ 'ô‚óõèÌÄ»¶¸½¹º¹åõòòóóòóóôóòò²óñûР'ô„ó îìïâÞîïìíñòõöó€ö óðõöôõ÷ööôñ¯óñûР'õ‚ôõðÇ͸ÃʼɱÏ˵ªæË½ÃÅÕͬÏÙ¾±ÉÝøó­ôòüР'õ‚ôõñÚÝáäÙãØÖÛãëÜÒÕ×ÜÙèçÞÔÒÑÝÞ×Ýèöó­ôòüР'öƒõóáæÛ×ßÞðçØÞìûûóøúú÷öùûööúùúùö¯õóþÑ 'ö‚õöñÄÉÄÉËÀÎÍÀÃÚ÷õøõôôõõôôõõô°õóþÑ '÷‚ö÷óóõñöñòçåðìðøííô€öõ¸öôÿÑ '÷‚öøî¿ÃºµÉ;ºÇ­¾½±²ì÷ôõ÷¸öôÿÑ '÷„ö ðéðóæð÷óéðüÞÛ÷€üûô÷·öôÿÒ '÷‚ö÷ñÍÔÖÙËÇÌÎÆÙÏ¿ÙÍÊÇØÌÔö„õö€õö‹õööõõ™öôÿÒ '÷‚ö4÷ñÖØÑØá¯ÍÜÚÑÌÞáËÖѳ¯Ùîú÷øøúûûùúúùøúúùúúùùúüùúúùùøøúûù˜öôÿÒ 'øƒ÷öéêëößÙ÷ïðëèíêíÙ÷êäóèÑ€îéçÜÅæçíïçìåÄÜäÜêÕîçêîè×êÑÐÛù—÷õÿÓ 'ø‚÷ùð¹À½Öü€·*Ü®¯Æº»ª¶Ý˼±×ÇŸÂÂÄ·½ÅÊÆ·²°³Ë»Ä¸²¹®¹½Ôþ»Çñø–÷õÿÓ 'ùƒøùõ€÷/üøøùøúùâöúû÷ÞôùúõÞúíãýüüûúê÷ü÷æûúøúü÷åüðéëüöûýú÷—øöÿÓ 'ù‡ø÷ö÷÷öøø÷úùö÷øûø÷÷øýøúü€÷øøúø÷øûø ÷øûøùúú÷ùø÷÷˜øöÿÓ 'ùƒøùýû€üÿþþøøüÿõýüûýÿþýø÷øø÷†ø÷ƒø÷€ø÷øöÿÔ 'ù‚øùóÄÕÙÞÒÏÖÓÂÄÊÛÅÉÛÕÜÏÖÜœøö÷–øöÿÔ 'ú‚ùûòÓÙÈÛÞÈÍÎÀ¯ÉÎßÄÙÌËÓÏÍú›ùþø÷•ù÷ÿÔ 'úƒùúþüþýýÿþÿúôÿþüÿüýþþÿþ›ùûÛôüö”ù÷ÿמ(û„ú øùúùøù÷øøúøøùøùøùšú÷ÿOAóÿõù‘úùôÿÄŸ(û…úøñùþøÿýþþ¤ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(û‚ú û÷Éȼ»ÈËżįõû—ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(ûƒú øóíñêîìáëèàøû—úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (û‚ú ûôÙçØÞåÚÜÜþýùù”ú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û‚ú ûøÖÁÌdzÅÑßÿýþþ”úöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(üƒû ýòÝïîÙïíææççéú“û÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(üƒûøÍ¾¼Æ³ÈÆ€·µÅ”ûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ýƒü û÷úùüû÷ùùúùúú”ü úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ý‚üþñ×ÒÆÇÈÈÆÇÅíÿúûüûüü€ûüüûƒü ûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ý‚ü ýúîéïÞÙíëéëû€ÿüþ€ÿýýþÿÿýý€ÿþ„ü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ýƒüúÝâÏÖÝÖÕàÊÞ×ÉÂòÞÑ×ÔÜãÎÃÛàêÓÚÊÒÿû‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚üýøÑÔÓÛÑÙËÍËßçÑÂÜÓÒÑâèÑÅÊÒÇÔÚ×ÄÒþƒü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýƒüûõùôíòõüõñòùÿÿôü€ÿ ýþþÿÿýõþÿÿþ…ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ‚ýþøÃɾÃʾ×ϺÂßÿûþüûüüýüýþüüûü…ý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þƒýûûúúüøúèñûöøüýýÿþ’ý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(„ÿ#ýíêðÜôïáäóáðÝÿÿþýÿþÿÿýþÿüÿÿýüÿÿýÿþüþƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(„ÿ#øÉÀº¹¿»ÏÑÊÀ²×ÿþþÿþÿþþÿþþÿþýÿÿþþÿþþÿþƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(…ÿüþôóó€ÿþÿõù—ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(†ÿþÿþÿÿþ™ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(‡ÿþ¡ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(…ÿþþÿÿ‚þÿ…þ’ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(—ÿþ’ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿýâëòòêáÛöðÝðèÞðõíñçÝ”ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(„ÿöÂÒÂÕ־ĵ¯ÄÃÖѾºÄ¾ÀÜÿþ’ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(†ÿþýþÿÿùïëø€ÿýîþþ–ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(…ÿýþÿþýÿþþÿþýþþÿÿþÿþþ˜ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(‡ÿýü„ÿýûÿþÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(„ÿýØÜÌÈáÍÏÛÛØÛÆîÿþÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(„ÿ üääåÖÙíàÉËÕÏÜú¢ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(„ÿ ûð÷æñüöíåíù¤ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(„ÿ úÌÉÀ»¹³ÃÂÈåÿý¤ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(…ÿ üûüðëáüûøùûü§ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(„ÿþÒ¼¾ÉÆÌĸ»»´Ûÿýþþÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü‚ûü÷ÓàÞÒàáÕÙÓÅØÓÒÕÕÛöÿüü–û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(„ÿþüþ÷üü÷üþðúðò÷þýúòóðü•ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b€cd`FL@FPFBOÔÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (û‚ú üòÙåÕàâÛÚÛÿýùù”ú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û‚ú û÷Ó½ÍŬÇÑßÿüþý”úöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(üƒû ýðÛðëÛïìæçææê”û÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü‚û üøÊº¼Å·Èʹ´²Æ”ûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ýƒü ûöúùüû÷ùúúùùúý“ü úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýüûÿð×ÏÂÂÉÅÆÅÂïÿûúüûü‡ûƒü ûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ý‚ü ýùíéîØÚíéèëû€ÿüÿýýþÿÿýý€ÿþ„ü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ý‚ü ýøÛàÑ×ÜÒÙàÏÝÔɾñÜÏÑÓáâËÃÚÞêÒÛÇÓÿû‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚ü ý÷ÐÑÔÚÎØÍËÎÝãѾÙÑÐÌâëÏÃÊÒÄÒÖ×ÃÓÿû‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýƒüúôøóîòôûöïòúÿÿóýÿÿþýþþÿÿüõ€ÿþ…ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ‚ýÿö¿É½ÈɽÕкÂÝÿûþûûüüýüýþüüûü…ý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þƒý ûûúúýøûèóûö÷€ýÿ“ý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(„ÿ#ýíêïÝóîßæôáîßÿþþýÿýÿÿýÿÿýÿÿýýÿÿýÿþüþƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(„ÿ#÷ÅÁ·º¿¹ÎÍÉÀ®Ùÿþþÿþÿþþÿþþÿþýÿÿþþÿþþÿþƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(…ÿýþóòó€ÿþÿóù—ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(†ÿþÿ„þ™ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(‡ÿþ„ÿþ™ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(…ÿþþÿÿ‹þ’ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(—ÿþ’ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿüàëñòèàÛöñÖðéÞðóíñæßÿþ’ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(„ÿôÁн×ѻĴ±À¾ØÌ½µÄ½ÀÞÿþ’ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(†ÿþý€ÿøðéø€ÿüíþþ–ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(…ÿýþÿþþÿþÿÿþýþþÿÿþÿþþ˜ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(‡ÿýü„ÿýüÿþÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(„ÿüÔÛÍÄàÌÍÛØØÚÅñÿþÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(„ÿ ûââæÓÙïÜÆÈÕÏÛû¢ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(„ÿ úñ÷ßðûöìæîù¤ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(„ÿ øÇÆ¿»±³ÂÂÆæÿý¤ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(…ÿ üúüðêáüûøùûü§ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(„ÿþη¾ÄÄÊÁ¹¹º±Ýÿýþžÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü‚ûü÷ÑßÜÒÜÚÖÖÑÄ×ÕÔ××ßøÿýü–û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(„ÿþûüùüýõýþñùïòôþüøóðïü•ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b€cd_DIAGOCEP@PMBB_FEK=O_d”cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埅†€‚–=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç„æåææåææ‚åç„åæååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæçëçëêæéììéëëâêììíììêæååããâàÞÜÚ×ÓÏÊľ°à¶¸%è‚çêܪÂÁÅÆÉ¿¼Ç´Äż¿¹·¼½ÑêæçææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è‚çèáÒÑÃÕÖËÍļÍÎâ̳ȲÎÁÃìæçææ€äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%èƒçèëëíêéëíèèíëèééíéíèèçææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çèæéèæççæçæççæçæ’çææ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è„ç áå×éÛßêæèçåè˜çææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çèᳺ©°É·­±©­·ºæ—çææåääâáÞÛÙÔÏÉÀµ§ÝçÚÍÕ£²%éƒè çæãåãìêËÞÍÚßÊç˜èççååäãáÞÛ×ÑÌù§ÕñâÚÍÕ ±%é‚è êßÀ˸ÄĽÄÀèêéëšèççååäâàÝÙÔÎż©ËøêäÚÍÔŸ°%é‚è éå͸ÌèÔÒÒíìèç›èçæåäãáÝÚÖÐǽ«ÃüñëãÚÍÕž ¯%ê‚é èëÞÊÔ×ÌÖÑÑÊÍæê›éèèææäâàÜØÒÊ¿®¼ý÷òëãÙÌÕ ®%ê‚é êä½¾´¶·°±°¶åêœéèèæåãáÝÙÓËÁ±¸ýû÷òëâÙÌÖ ­%êƒé èåéäìêçèèçéêéèèçåäâÞÙÔ̲µûþû÷òëâÙÍÕ ¬%êéèìÚĺ²ª²²¶¶¯Þêèèé€è˜éèçæäâÞÚÔÍô³úÿýû÷òëâÙÍÖ «%êƒéèáàæÑÒäãàâèííêìííîêè–éèçæäãßÚÕÎĵ³ùÿþýû÷òëâÚÍÖ ª%ë‚êëãÃÈ·¿Æ¾½Å´ÊÆ©ÖɲµÈàìé”êéèçåäàÛÖÏÅ·´ùÿÿþýû÷òëãÚÍ× ©%ë‚êëæÍÐÔÕËÕÉÈÍÕÓÄÅÇÔÌÈÔäë•ê ééèæäáÜÖÐǹµù€ÿ þýû÷òëãÚÎØ ¨%ë‚êëçÛà×ÖÜÙéßÓÚçñèì€ïí—ê ééèæäáÜ×ÐȺ¸ùÿ€þ ýüú÷òêãÛÎØž §%ì‚ëíã¸Á¸Ã¿¹ÈÀ²·Òïì€ëéëì–ë êêéçåâÝØÑɼ»û„ÿ ü÷ðèáÙÎÙž ¦%ìƒëéêêèêççÜåêçæâåìêçïëç–ë êêéèåâÞØÑʾ»íñíììïñöûþÿýöêÝÌמ ¥%ì‚ëí⹿´²¿³»·¯¯¿­¬¿¯²»¥¶êêéêê‘ë!êêéèæãÞÙÒÊÁ¶ªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì„ëãäéçéáâçãàãààèÝçÞÎéðïñðð‘ë"êêéèåãßÚÓ̹­žŽ‚|zxuspkhhly’³Ìæ¥ £%ì‚ëìåËÎÎÕÖÕÏÏÚÍØ¾ÒÏÕÙÐÍÈÒÔÀÑÐéêëêŠë#êêéèæãßÚÕÍÅ»°¢’…~}}{zyywtomvÏ¡¢&í‚ì%îäÅÊÂÐÓÀʹ¹À§Âç¶Ã®½Èdzǵ¨Ýîíîïîòïïîîí‚ïíïîíîììéæãÞØÒÈ¿µ¨˜†„‚€€€€{pj£‰£&íƒìCëââáÔãëñåÓÀ×ßâáèÜäííåçîåàèÜìÚÙâÎâáâãêÛÏÝáàéÏÜèÝäàÝãÓÃÔÉÌú¯£™“’‘‘Œ€‹ ŠŠˆ‡†kc¡&îíDìðⷶ»¶¨­µ¬±£®Á½¹º±Ì­ Ãž»É¨³©®³º¬´³´¨´¸ÏÀ¡³½®±˜­¶¬²¾¤¬¡®ÎÈÀ¸¯¨¢ Ÿž›€™ ˜——–”‘‰yŒ5 &îƒíSïæéóæëÞÕßòàÔçÞóäéÞÛàØåØñæá÷ÚàóòõòôÞÔàåûØÝôåãì×ãëëÝÞåäÑÐÓÌÆÀ¹´¯®«ª©¨§¦¦¥¥¤¢¡ž›—’Œ Ÿ&îíDìïã¼¾·¬Í¹½Á·λö¶¾Á½¼Ýɴǽ¸Ð»Áº¶¼»­Å¾´®¹Å»²±½ãíëëéæãàÛÖÐËÆÁ½¹·¶µ´³² ±±¯­«©¦¢š¢HŸ&î‚íAîëÑÝÃÆÑÈÜ·ËäÞÐÛ×ÝØÛÎÂàßÍÈÕàÙÞ·ÇÍÛÒÒç×ÏÜÌ×µÓÔÃÙØçìëêèçåáÝÙÕÐÌÈÅ¿¿¾‚½ ¼¼»º¹·µ³°«¯~Ÿ&ï„î>óòðñïòòññðñóñòñòòññððôïòðòððñðòóóðîðòôòððôðñòîíììêèçäáÝÙÖÒÏÍÊÉÈ€ÇÆ€Ç ÆÅÅÄÂÀ¾¼¸¼œ &ï„îíí€îíí€î…í îîííîíîííîíîíîî€íîííîííîííììêèçäâÞÛÙÖÔÒÐ„Ï ÐÐÏÎÍÌÊÈÇÃɧ &ï³îííììéèçåãàÝÜÚÙØ×ÖÖ„× ÖÖÔÓÑÏÍÕ° &ð‡ïîðîîïðîð‚îœïîîííìêéèçåãáàßÞ€ÝÜÝ‚Ü ÝÜÛÚÙØÖÞ· &ðƒïðòïôóëôöïëöîôôöôôï îîííìëééèçæä€ãƒâá€àßÝÛã½ &ð‚ïòã®ÆÂËÆ»·Å¶Ä±ÁÀ¸ÁÉíïîî€íìê€éèè€çæ€çæ ååääãâàé &ð‚ïðêßÜÎáæ´ÑÝÙØÝ½×ÄÆÃížï€î€íìëë€êˆé€èççåîÅ &ñƒðñóóõóññõôôõóòõöðò ð€ïî„í„ìëêêçñÇ &ñ„ðòðòññóï‚ðïï¤ðïŒîƒíëõÊ &òƒñ ðçíÛéëâòîððò©ñŽð‚ïîìöË &ò‚ñòê½¾·°¿­¹´­µÎõð«ñðîøÍ &òƒñ ðòêðð÷äÚíÛØßôð¾ñîøÍ &ò‚ñ óçÃκÅÅÃÂÐ÷òòð¿ñïùΠ&óƒò ðÙÃÚδàÜçùö÷õ¿òðúÏ &ó‚òñôâËÚÝÌÕÒÒÐÎÍÞôñ½òðúÏ 'ô‚óôîÎÀÃÂÂÌÉ»Á¾·Ø÷ò½óñûÏ 'ôƒó ñïòíòòíïñïôøõ¿óñûÏ 'ôóòöãËÀ¹¯¸¹½¼¶èõò€óòóóôóò€óô¯óñûР'ô„ó ììñÝÞïïìíñòõöó€ö óðööõõöõöôñ¯óñûР'õ‚ôöíÇÌ»ÅÊÂÁÉ¸ËÆ³°çɾÂÂÙѯÕÔÁ¶¯Ïä÷ó­ôòüР'õ‚ôõðÛßäãÙäØ×ÝàéÛÔÓØÜÙçèàÔÐÒßÜÖâìõ®ôòüР'ö‚õöñßåÛÛáÝðåÖßîûúóùúú÷öùûö÷€úøö¯õóþÑ 'ö‚õ÷íÃÌÄÏÊÄÎË¿ÂÝ÷ö÷ôõôôõõô°õóþÑ '÷‚ö÷óôóòõðóæçðíð÷ëíõ¼öôÿÑ '÷‚öøíººËÍ»ÁÉ®¾Â¯·ðöôõ÷¸öôÿÑ '÷„öñéðòæðöóëðüÞâ÷üûýúó÷·öôÿÒ '÷‚öøîÎÔÔÛÉÉÌÑÉÚÎÃÛÍÊÎÕÆÓøõ€ö€õöõõöö‹õöö€õ˜öôÿÒ '÷‚ö4øïÔÙÏßݯÏàÜÓÍåßÌÖÑ®®Úòú÷ùùúúûùúúøøúùùúúùúúüøúùøùøøúúù˜öôÿÒ 'øƒ÷5õêêíöÝÜøîïçæìëëßöéçõâÐðíîèçÚÃéåðïçëåÍãàÜêÙïèëðäÚäÌÍßúö–÷õÿÓ 'ø÷7öùì¿»ÀÁÕÄ¿¸¸¶Ö§µÉ¾¿¯¹àĶ±Û¿œÈÁ¹ºÃÆÆ·¯¹¹Ì´Ç»´¼­»»ÖÁ¹»Íôø–÷õÿÓ 'ùƒøùõ€÷/üøøùøû÷àøúûõàöøûñÞüêæýüûûùçøüõæûùøúüõçüíèìü÷ûüú÷—øöÿÓ 'ùƒø÷÷ø÷÷ö€÷€øúù÷÷øû€÷ùýøúû€÷øøúø÷øûø÷øû÷€ú÷ø€÷˜øöÿÓ 'ùƒøùýû€üÿþþøøûþöþüûýþþü÷÷øø÷‚ø÷€ø÷ƒø÷øø÷÷øöÿÔ 'ù‚øúïÂÖÙßÐÍ×ÔÆÀÈØËÑ×ÚØÐ×ßú›øö÷–øöÿÔ 'ú‚ùûðÕÙÆáßÇÎÎòÉÎáÈ×ÏÆÔÍÒüøšùþø÷•ù÷ÿÔ 'úƒùú€ýüýÿþÿùõÿþýÿýýÿþÿý›ùûÛôüö”ù÷ÿמ(û„úùùúøøù÷÷ùúøøùøùøøùøùšú÷ÿOAóÿõù‘úùôÿÄŸ(û„ú ùùîúýùÿýýþ¤ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(û‚ú ûóÅǹ¹ÍÈɾÇÈøû—ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(ûƒú øòìòéïèäíèáù˜úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (û‚ú üñÙçÓàâÛÛÝÿýùù”ú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û‚ú ûõÒ¿ÎÆ®ÉÒáÿüþý”úöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(üƒû ýóÜðëÜðíççæèê”û÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü‚ûüöÑ»½Ç¹Ìɹº¸¶Èü“ûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ýƒü ûöúùýû÷úúûùùûý“ü úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýüûÿíØÎÃÂÉÄÉÉÁðÿûúüûüü†ûƒü ûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ý‚üýøìèñ×Ùíìéëüþÿÿü€ÿþýþþÿÿýý€ÿþ„ü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ý‚ü ý÷ÝâÑ×ÞÖÙàÐÚÓÇÆóÜÒÕÑàçÌÂÝßêÔÜÇÔÿû‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚ü ýõÒÖ×ÛÑÚÌÎÐÜäÏÇÚÑÒÐàéÓÉÈÓÅÕØÖÆÓÿû‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýƒüúô÷óïóôúõïòûÿÿôýÿÿþÿÿüõ€ÿþ…ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ‚ýÿôÁÌÀËÊÂ×̹Ââÿûþûûüüýüýþü…ý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þƒýûûúúý÷üèôûö÷ýüýÿ“ý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(„ÿ#üíìîÚöíÞéóãëÞÿþþýÿþÿÿýÿþüÿÿýýÿþþÿþüþƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(‚ÿ%þÿõÅÆ¸¶¿¼ÏÍÌÅ´Ùÿþþÿþÿþþÿþþÿþþÿÿþþÿþþÿþƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(…ÿýÿ€óÿÿþþÿõû—ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(ˆÿ„þ™ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(‡ÿþ¡ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(…ÿþ’ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(—ÿþ’ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿûàëóòéäãöñØðçÞðôíòäßÿþ’ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(‚ÿþÿòÃÓÀÜտý¶Ä½ØÎ»¹Å¿Âßÿþ’ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(†ÿþý€ÿ÷ñëù€ÿüíÿþ–ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(…ÿý€þýþþÿÿþýþ€ÿþÿþþ˜ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(‡ÿýý„ÿüüÿþÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(„ÿúÕÚÏÎßÌÑÝÜÙÙÆóÿþÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(„ÿ ûãáäØÛîÞÈÐÔÏÝü¢ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(„ÿ úðøãóûöëæîú¤ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(„ÿ öÉÉÁ¿·´ÁÄÊêÿý¤ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(…ÿ ýùüïêáüûùùûý§ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(„ÿü׸¿ÂÂËù»¾¶ßÿýþžÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü‚ûüõÓàÜÓÞÛÒÖÑÇÙÔÖÚØÞùÿý—û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(„ÿþûýùýþ÷ýþòôîòóþýøôóõý•ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b€cd^FKAGOFEOAOL@C_FFKBT`d”cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埅„‚—=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽt8mk@+¯®®¯¯¯¯¯¯¯¯°¯¯¯¯¯°°¯¯¯¯°°¯¯¯¯°°°¯¯¯¯°°¯¯¯°°°¯¯¯¯¯¯¯¯­¬‘U  Gÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿä†  NÿûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûûýþÿÕ1Vÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúÿä<  \ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè?  `ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè@  bÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿæ>   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿå=   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿã;   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿâ:   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà9   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÞ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ3   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÖ+   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÇ    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ©   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿs   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç2   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŒ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÏ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè0   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê6  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê:  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê=  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê>  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêA!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç9"   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷c   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ–   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýW   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé31CE2  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿìšÔøÿÿþè¬B  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿþÿ¬  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýþÿÿÿþûüÿÝ'  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÜ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ°  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿS  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ0  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿo  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ»  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿº  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿj  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû,  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¼  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿK  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ¥  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿÒ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüþþÿþýûüÿÑ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ›   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿëÈïýÿøÜœ3  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé4%46#  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC"  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè>"  cÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿóG  aÿüýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýÿÿÿÿÿÿÿÿÿÿÿÿýÿÉ   _ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿp E¥¬²µ·¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¶ðÿþÿÿÿÿÿÿÿÿÿÿþÿöº·¸·¼øÿÿÿÿÿÿÿÿÿÿÿÿüÿº $,:DKNPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRN^òÿþÿÿÿÿÿÿÿÿÿÿýÿÍJRQRMÖÿýÿÿÿÿÿÿÿÿÿÿýÿß (28=@AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD:fÿÿÿÿÿÿÿÿÿÿÿÿÿüÿš4EBE5¥ÿûþþþþþþþþþþýÿã  $()**********************************************,#Kûýûüüüüüüüüüüûÿ^,*-jÿýÿÿÿÿÿÿÿÿÿÿüÿ¿ Ëÿýÿÿÿÿÿÿÿÿÿþÿì(+ÙïêëëëëëëëëéìÛ< (c]^^^^^^^^^]bM  ic08‡ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ †°ÿ“ÏÁ§nË•>/P"ƒ5o®¦µZÅíIÚ²JüÆÃÀ;U{`³Tþ™qåÈ«Óâ)™¨¥f œm1qLÍJ†ßÐA"p;H´ºžÀ|'€Ãh©`¾PæK±ïþÀ|'§9…16Ê[UÏÁ } ºEì&ßÞË´gÎO$~¼XôÖ}Ó{ÀÜžÒ þJZcOLú{’‡šÐüy÷A/0ˆêÍìZøv$à¸K&Ýd ¡ÇàyÌ~g`€Ë» ƒ’p•@Â*@3×Wçç(÷§˜?ƒó¶¥°¶1oÌÌθ\©GxÐ.…cñu ‘êFç!¤‰_Ýy)¥å™8w†Ô‡Á‹IB¿“”°°pÌ゚ćZamoÌsÙl²Ô:&WÉkG¦C‚Xa§ÇðvµEþ8ÛJ–™¿º)'DÇ2,¿#Oc*鎪uEÜÝ<®X>éÔáäv<¡Å¦ö!+IÀ2饀و›øu]šÃ7Ì#Òw™ Ÿ,Ýï ä$%¹ñ\M ö­À.ép§{²°çùÇšlz""–Rü‹©“‚gÉpŒ ý¯^ƒú,ÇàS<~d`€ËÉ@í;&å5ÅðÜÝÕ ©Æ©È­¢¸‰á)Fá| –¦W(– )Ô…R;<ä»Í÷þ(R:θ3I"tÿq‘‡ö·Ïþp¹3 7 †;<‚GBn2,XýÌL–gs6`4wàYÞÓXm86yq¨’÷ÿZpÔqRÏιµί©7[K”é4 P,J}è2³2%裓ž -‚ZÃu6=¯$•=`HeLŒb¨­Õ.¦Hƒ}´‡NÛ¿¡÷CÎ¥üïXrW¹z0#Ÿ*¸h45Ö˹!-G¹Å(Ž»ÌMMwŒ–玙ŽÇH'4ãL5Â]Ïé” Y)’‰FÖ“ç*²¥¥jc™|‹×}¤r…¿ê Qq“ìýLò(ªänB¢Ý‹oŽ·ŸnNéÏü°"c³nBèúzõ¹H)4íVøŠäV«9&ß‹ [¢¤:wŒ×1²%WoI«Ä~Šóè³¹“=4'”(žñEM9N¸‚ñÔ¹Ìé´"[¼Ý•FmÒ{ƒn`1é>Ê¿s)d«b1½Ò„yh¨; ÕÊWÝbì !`Ã<·@DÁ;¢æ~>Eßpà XÜCi«ÛÒxAB‹UNª_Æ~q£Ô—«RéÂ소Èl¸¦å¡—KïjÈš QcI8…°Wv“®_Ô­ïÄ›2¯¶W,„-’]&YgË4Q„qú—Ì$¾©]2I}MåPUŬ+}A0›ÝÃ%C»¹ –›Læ{%ì$ILH”2]„]ד†Ó†%ó~øKkžœgbkù»:ÔGýRR}ÇæI s é\Ä!Sµ„^£€vé1 A/AþÎÞð° Qýk|W¥@޻䳖¥1Ànð»|4À$r§³5ÌÊΗÿ2÷3_¤^I!'GÚÖè2ƒúM•“ak*"þ¯À 7W®·[ i@‡BÒ'$'µ0–ÜW;•n†eŒÇÆq·“CqŸÌñTë®ËE«ÉîÀrëðÃH ÇðWì–LýqªŸKi¾+^|²6|\†¶À´3~Zxÿ~ ´[öšm³Í×€!ìø2SÏ[d)K{iRé¾X· lYŠxÔ<gJšÂ³*8ï£ñ…×/;z¸ÏÍ~?~ `­>Vîr² *;”- ‡Àj<µ'Ñ+HÿRÁªÕ| +`@O™oÔ@ÿ„ tÝ/MBVŠ©ç°Ë–¥ ìkÙƒjeÒ_ÁyÁ,Æ#šHˆCA'¿£þ™l^_8b"c³nq!'ó J®Sý÷É!y¹„Šw%I ´9uû“õÊ?5v½8I1!dsäðTÛÏ„œÞy8€|4Ѱµò†rÇ4p•\Fz8A”j¾å¤&þ?­jMÎÝž;ªðy5¹fß“žšBºäv›µ>²eH.Â|AÊqq#9Öb«U6Ö–žoW…Ei^ ,øG{x¾g‹ÁÏÏ¢ùô‰ŸAàฮw¿Ò’ –3è'=ÿ[L„M7Í»]9dë)8S™´3Šq¶š ´{PI¨ÍåK^*î1œ]5×Í•‰öÛïÃRÞÂJ©_¯¸Õ8ëLð€Ø^ÆŸ|• Ä!gø¬ ög®¦bQü¹š²©~¥@úaž›<-ÕÜs{$4:aMqÕ†é,›vöW<º¥º±ˆÍš´Ÿa(3Ô¶UÂ+c5Ì5CV4)Qý⦠´HV’3Ö˜#nôúßÌ™ÖQpÝd™²‹õÎþ…=Öä®CÈœ)h _–fw¸oö¶ ÐÓøn]³Ê<ô¦ØÏ˜2é¯Ì^i„Øã›í®OLðßJPé&ñ(‡¿©¹ £*!7EŽBnyY—$N'! lÆ)xW™úeçÄ"øTå¸j[`FÀ‡9vÂf‚͉vmoÝ—W‰h #±8iV¡­·¬7ÿr9„f2ÐDM®Y9=äáÎô¶,BX¸=ˆ®vè_lL[%—D€Xr0¢‘qjÆ›«SÎ4}—Àb±` PAåU…n—;¾ïzDÛ>XíÐô BKi}4¹ Ÿ¤ÃÿGì%à/Zæšè?ñ<=Ú ’þ›/…²´¤‘e™òÁJMbbÂoÅ´z0› %˜ü§8¦ÍðÛM}Z%ÇócD Ž¢¸¹lZ ­CËÑLQ‚/-ôK+Û·ˆúQ—³•ºÄ÷7«˜á$ RÖ;9óøí…C¶\w¨‡:³T»Jçugÿ EØyÏÇ» ³•%²kÇxè.Hëªôãdü ™žH µ×Ü»nʆ÷cÀ  D¨÷RŽZ.†mwMh°­û)6nd[ ·»£[ŔƻŒ¦€~B4Ãc’ŧDóB¯Q(õ ÂIzå.ç“:õÊ kêzî¦qÎYžÝ×Ywb8´Æ[%º9™Ï–)`è@¡yz:ÍÉ—Œ›‘•ßü÷ýŸœ°2²¨é{)ì¸.vjs}$³,¦™‚ ò¤­0ÑÕÓ|õUô=.Ò!GŽ–ñ-×þ’N†Äƒ„õXè‰{@•tŠÒ.5ÓÐ\ô\^EÁ¬lÔXVô}­ÜVuî耮m<\Ü|9mRàëj#F=Œ ‡2yïê=*!2#²n†Fû¤ø}Ö¦R´ÂâìG‘Ђuörµ+ô[1h;´>^ÑÒÖ¡œÐíµ9Qú<ͺ#8>ufœ¿î÷F|3ŠnI#+YÇŠ²Ûð3ÌàHm¤X_P«¸@CŠ5à?`UúT·)k¸ú¼òQn圦ÎX æ øÐœ]ÇÈ`ϺPD³¨E/q¨•a½n?v«‰Ó„xZHýð×¾ ­ædC”G?ú3K§P„ˆ‹À•ê£ì5»‰Mf;ÃQ9Q7¾%ÚÖ›@а§a71`÷Gq‡#h/måÃÀ3ç¿%×Aɧ(Œ±¡Ù?øŒjò]¥Øº,½!©NøÐýß"àËÞa ®/¯ùÅ0lÚÚ#€À»cq¾# -aô½À¯‡žé!Ä8G.¤Ýü…‰Jƒ×–`›@x¸šõ¸ÿ6,mðsû'Íõ‘o2—ášAg¡‘ÑyQè‹À¸é÷gve_a)UTŒûdYÉD«Äy'…ðÝB;êh1¾í²ÊÍeH=qëû`½¯D2oƒ³ßwD…¨4<˜ÉÕ÷ž I±ŠÍ ?ŒG—BÏ¿¼¢BÍÛ);ÏÑÊ\w²ôJ øÿ~¢›ìt¼xM´Žéíø¤Œ×W½ÖmÙ+ŽiY RÜíPåœË™ºj)„ÆB ebz~™jÌI²3©ûñ[©›¯Ýde¡ÑŽ!~òk§†Z]ƒº<Ô`íÍ̯ÿ釂”#w³aKˀެ1ý”‹íUáÍš¥ @³žõôƒæ¯£š·?OÍGDØBïÄïŽÅ/´9JÌ9×öüÛvgaZ ’–wE¦z±n]ö\‘Ѝ4¤ ((ýÊÚuVysÞê-T;òs%|“ ¡ëeoÕŠ(¤íŽUE’— :–ÍÞ'Å®|ç«;ª¾Þ<¶>úûøJêþÕÍ­°)Y-§¢ÖŸlu‘ƒä‰gSp6v†'Ó0庚~ßIbÂ/’±¨´ ɃÔ%‘pSª€‘Ù&EégÀ iú¶'Ëu¨‘|¥ ÍÁÀ|–xòÀ>M—xÖÕ¥êál²Æ¶VH­UýäÎÔŒ­µi+Z‰ñZ§ÝY @dsw}“ÄŽ/¨‰ Nô_[is˜íŽõŒ5èÛdf®“X°X‡FÞt«`ój41àÖgš®<â¿E”­=ù„€b…t¸B~~a=`bRÍÏäiÊÅö×uÒ¸È »XGÐÊ  apÝ;'pèž9À>®ä²@>M ˜x5ÚižŽ<š‹Sé`±­Š½ÿVÀ¦P¼›9ŠŽtÚ&SÝŠ¡òp¯ð@ïö]¤H–:gWÏ@’.{âêYWï+ÅAÔ\…Ë÷ð^#¨ñSÏžÓR_e‹5Ö|aH• ·g×¾ \‹åõžÈ[“òi>AºçÑÐÝ©H2Îr¦A¹³(^§2Lù::“ò ñÄÙ4äÄ+†à~¹s>.Óñmê…f0ÒÖ)éuü8²/£Ç¨¾›xÛô¥ÀzCy¸u‡øRÅsü·e=4ÀöX$/\’7´É|Y¡ÉÂ¥òÔF™ðÝ¢l½óvMn:;<7Aœ×ýÁ¬Õl¶b¹Úw æH•ÎÔ(ÌFù†kãÄÖ[ÐÖšM?úèBɲä“pG*.ƂDZ…=ò0DÉÁ¿Gl"Q/2îŽL³@¤ú0/ c}z%Çá]Ïε‡áE%hƒº¯­? aR ¨~-7k ZŽ[éHz¿N’xl“éNÁáËÌ?lN"çâé²UïÊ ¾±ÓY Íj  •¾5åC[mÃ$Q¤M© OŽ5&¬r=°–%q:)«•}Æ-·üFÇÒØj8Šžd#÷pwÅE„br,h­/oíaFHoþÞ³‹0,°:âÇÞr¦©‰©H6D¸ìAºKáÜ󾀦¢ q4³©ˆ€oºå›OM#"œÁáƈý :R 0ÍpõÖóÁБЀ©O#¡ l¡·¾ù' {N~-?Kêþ{®òÿz€ù±"ØjÀŸN"ÁÞW’Hû £#æ2ö1®Ûë§Ui Ëj眷âÀt´‘=#ÿV¢-G蟵)§)öm_]ÛÌm£@õä’~Ûd4„w`´oægM‚‰^7Âß绩RÏ’ÝÞŒeõGr|’Ã-|§À¿ìƘú,ä¤YÕ ªÊÖT"ªðôX£8æcbÓ.G† n»ZŸvN£–˜É¼üð}¾³… »áÚ}*e à a¹-ÂÙˆÈÓ‘ÞÙë!jÿsÞÂ;%y6íΓÏÏØB~~ÉóõÆô¶ñkˆ¦€Â_yG»%nÑ‘Gÿ_lÜî5` ‰…gÅuѦùÙ™ô«Õƒê”šO|©§ñ‰8ÜN©ïé_å§0êÆ+òQ¹Uj榄Î%3%m”û?U4a˜Ë G-&7ÜÀ }꺃ú*-ÊM5’d‡Ô%¾o!$ÍÏø$þ«}U¨4ü¶ýÚý2wþ¤¢_PØÖ®–Ð-;®L]sóá’LL,áxóÏòµéÃQi§ÊÄj ¥`<²-š0ªjë6¯‚éÞG&Ø™)œç’&úF¤yÓ ÕÃuä N.¢ ‡Gÿ3R¼¤¶PéU(˲XƉŒO¾ï@Ẇ~B}ô׫FQßÒ&Y+#ß`“•h |ï{¾øiGKòúõc€](4ÑÉäßß3^ŒH]M Îõ|‹˜NšÇ“3 £p?D®øÑ›hGÊÝ÷_+§“ïñ§•Jgûæû‰°OÙuZ¡iwyÑ…êQ™óé #^¢](Aö§šíÚ%ßu¥úÆ0·«Žý Ò©UrqA÷Ô¯cl@P*Rž «ÌÛ8jÖå…“ K‚ÕÔ5 Ãå]=©nE?á+Ñß‹q)`ߟ§‹t$$à*1Œ\~‹ÛT#Ýc ÍôÌØ[̎Ǹr3E mFb¼(æËK ÓôÊw œáe ÛÄ1h 8¯#^s©™DÊØŒƒÖ¤ ¼lô‰á²²­B&éi„&Q“’zîá¸õDpU;CÄ[Ó”ÓªÒ¢¡JF#QòlÖÁó;î9æ¨úî·²ôº~½œdÊiHÑÙ¼0ÙY+P¯â²Ý«´x‘"(½ß[D¢„®1,ºJôŰ3ÿ*2ÀNÛ¤¬e6YæiÌUmê˜ešx©*Æ÷“)J&(…*½ê±üÙä*>@³ áb1—Ï8›êàa$¾L®§Z]'aî‚ é<ô¼ž]â*5ï£:¯ ö,„÷"v0Í(á"LÒ•Å¥cîOÃDðáøué ¨´rEQ×à‰Ž`F,Í.Çöó$A¶¬+6kв²Uªîç‡`y Bu—t¼æ_?áÄ@Rª]÷Ä5˜ùÂ,%‡ª>“ mtÌ9› íZBB÷¸ïc¹SÀÒТý€äY¾N·ûÑŽÛ• |M‰ý Êu`³@APØ\™ˆ’\¸ç²_D~ h¼¶™ËHntþú7j¸‹UÞãr…þôP PX6?>Ÿ/ÓÃ2®½¯¸‰ë‡ûö]hû"`ã­!gST;ÍUÿ ¯ë}H9Fž$ïT'óP£å‚ç‰lD}[ÚâM3°*ÈcLô5¸­:*Qhv'œA[d ¡1ŽªR½#ǻȳ¿y„fâcìfú϶œ¬c[TbDûÑ'rsä1ê¤-X•~h¨÷:.¤²]7kÚ«öˆÝdVF|9I`ñs —Ĉóσ ýÍ rò9œrКñ“×ÎÈs¿?ǬÇEÌúÏ%bð¾;Ï|ÇYسÙêgÜjL2% ]wh°·®õ‚S²hGþ[š¨ß¸Ô™õWwˆ]í®ÄMºÒÝF<~Ê( Ë“³AÄlqš¤¬>v®«?q[§T‹ìÆÈµ>t;ààNZ·ä4W%W1†‡ß—pJ¼qxöñ¶cÖ‡H,°}øç¾_Ïß±ã/š=õ=«Ù5˜Ló,`]R%¢é±³¨{­Áû=“ÜâWÉIŽ1¾\á¿Ï&މ°UשéåB ÄQîíf˜†šIäHè¸:2ðâ½Ü½¹]|#jKëy²ÆóFJ2l2à«üRuÚk1‹…Á‹ìS”NN”13ú5µ™H䨇!ÉFî@Co ”ÄAöߟæ¿`P‰Í–~>°ÓÐ,ƒàg¦ôûã›.F¹vµ›ý]·¾ÝäòŠ.ÜÇ$¨Ó·£‚É|¦ã;[+7×35§gRÂ×_’¯Q¾í¶[S3ôNàåpQ€ùàŠ'ø¢Å†KÊ”¾Q;²¶ävÌ‹•™îauO å’tpÌØâ‚ð8MªÄÒŽÁzÑÁ_½ö—ÀM’äÿfa’:_¡Y°“àì=#QüpQ¼‚×ONz0êzÓAÄDê^ÅTáæ£¹‚Â~Y£e[7…y¤Ï¸N·¡¿›Ê9fé÷g7¹SÔn,g¼Ú˜ê^Á ï -|ɰ¾JIÓF¤V}1–i^ž“u¤¶¡óͯ—OFÉq‘Bźï5ˆú÷Hç`Á#7´Ì˜². ×Añ[ Û+ÚNz{cB¦ýÒoã„[òúúê7­D:~¯êröagÍØnøLÜ6Nnlã~yë0ÞÎ3ÏÙˆHëÕ0U0& ç„5ùgzèiÜ s“vÿ6ŒÂ½&×…òUži±éhJ;‰¨Îä¸2‘BOž‡ü›4Ë/bA…k"È@ç=œútIæçjªýi«Rsƒn˜ Ûµ»‰zû2ŸÄ°do–)'U0Ú]•[‰þ8íN) )’· ZÀ߀ÿ26{Š÷W#¢¸?ûj3V0yà^*jЕzkR tÔr&5²)3ŠØ+ak¶k‡Pu”pUý¥a¼NµFž»/­Sÿ'ݸ2A÷ðïnîB韘Ì9·eÀV½`‹SMVbDqXÜiXט-µ¹ ÄÊØS~a€^$B×K%@‚“¬„89Öˆá·ð`û?K—U‹6ó*ŒÂ¤þ]æ:£yϰ=·M¿dc^?÷Õ)¹ K¾öY@+¦ÑÑéèF]ÿjÀœˆÑµJ‰@=j=ÌiÅ]bñŒü™Ÿ ÐEõ Ú—€úŒt­<ô"ÒˆU¶ŽàÿééokèÓ~bÌRcÉ[œ2:N¹Ló¡Sç7òǵM#AÍÀúfƒ hu:Ï…Šuÿ+]]¨(Úˆ/b›*¾¹“m©bØe1pClTí0Äñ^4þ®ÓZG†Íòy¯n©âÇêÈZÄ÷Cãôgl°´š=>ó.'à=I b¡ü¶í&úkt]’â/¨×Úm¿LìÕÖ žYíRgŽ¡kVï(­öQ5i®¹º÷Z2\c¡‚ô†Í„;ÿ$úÛwÕLfè
ý… a£UŸñ'²˜£ñoc”•9A¥åa°Xã-¦¨wšÿr:ÍÒãê'n.iÃÄËC<ºóFå㹿ۤ!¨ÞÍýAs6ŠBTÃsEÿ08QaJwnê1Q¾ÜèÜ R|ľÛÂ÷qTÙÚ&­²ö‘wã°É·i¹ª¿ØGÖÍ‹jòa`ðþóÇèuªpWgVQ—_Õ+ öÁYª¬ÅÜf·?#.ä3Nyî°Åì±Ó“XUÂ!΢¥ËâdPÁý„;œ Cvu#¦Ý̂ͪHê^IS  ¾Q«üºKArÐÉ—_ ÄÙ:ùÉ?@O²:pü¡Y½ðW`VnAq{X~™±£- ,êQâáÒYÃCå^ÏûS:§Jy1iÂ.”þ—¨ãg#¹ô#?uÍ£ø³ÞöMY—ºŸ¬k/+×N‰^~TH&ÂkT÷€^hÄÜÔ{ÛJh=‰ƒó€ëãáé4¥zíÿB«vRzP+¤­æ>ñ·TšF<çðên ÊÌ×"ê%âÚðZóóîO—1rÓE55ëõöv6ö‘ZÛ}/¾¿—)9²%ÓÚâ÷Ô¸€]½5/zÏ‘ŸÀg3×É&+|´•ÇÅï T ˜UDAéß5F¡k½Ïç[ªw%‰®œÑwetõ2Z®vf†÷Ó÷ƒÆ‹µ”†‡æOW:X)žpŽÂ¼ö¤Î»Àö•"s^Â#VUnœ±¢çéæ§‘^Æñ“©Dòî;VÔ¡¢ôH<]†,öÒà%~ôë°ñ­W|XìˆÖ}PHP‘Ù’ÇÆ.ö¹ý9h°Ç¹Éa%UÅýûKÔ\'?óG&õp ÙçJBÒ:$Ó­€°,ÿ68 BÇ4KC¥`_m•*ª[MžjVÏ›J€˜2ÃË·_“hY•ˆô RŸËÐíEäVëOM[Ùâà’›3­ ÞæysµÞ>½ã_»ƒâPö †„ò0d™³g›Yܬ›\BõuÃªŠˆï«*Üï‚5T×|Zìžð6É"æýrz·÷àF#çø’WÈn{‘±Ñ,è:­žÙ’ëu8Ýlb±kÅ“6ÐËM5ß‹ëA:X¢ß!CéÎ÷wësXùÃ;8XqjöÒíàN#ÒAS*DKñm` ª(Læ§­+D°[!"õ=s±¹°Ð vÂBs<Äâ4U%ˆv  xJ#þÚKÇWê㢧ŒýÇhqÓ¢ «hŠãž*ž©HuÓn;ÍõyÕmÖµ¨Rb–l\h*LhY>F³ ?·FY±gïß½ˆct>WÛ€*œc†^á0š]Gb°Ÿd3˜H+”£Ö?<«A|œf^„Èõ:•º>{€¥Wep(ÿ"ŠÂ8,Zû™‘#º¬ÒÇlã_ÍÒÐ%œC]¡âóáêÙÛçηÙg|Cš%øwGÝ#R¡|¸=—OˆoX=±/ý÷­¼ƒÅUÓè¸í3zØÑ~z,.’l-=°Ðì­æ÷ë÷y »#uõM¾§3²Yº ^šû¾ y$›w†ã“Z¿X»iWèÍÈôɬt×JVQT²~ˆ ªŽ; >a (f¿:?/êW[;_òÆM ž¢ÿO"áþÍÆa¦TÝ'¢ ´DÞÖsoq“•hå*jiðð‚¢>íÂD2‚k‰´-,›>¡ Õ^ ˆwé¼Ûd[š)‡ÅÞ%õ£@3ÿlZ‘e~>j _‚JÊ2xtú¨ØÎSqæc„öÕÏ*×S&”«WŠsʘ-HMß¿ êì1å¥(Дgeö¬c*ÌIüÇn‡Ësp=9 7… ˆ†EìwiÒ)þó¢!¢…E×£­•–¬DnEdêˆrÔÊLn"7å¾oƒ€¯- 3gf€îK7Œ1@E快˃n¬£„LUøIn›-—Ö֞θoŸó†uéภΡéwkí§õ@f-=›¤XÇœaÀ2Ö:BuN˜*é($†Tô4¿×äaèötb[](#è0 i>>ú—Qeåù å{«þçuPh³T­[k)©4ä9í·„^ÂpÙ\Lâúx”O!½\ÛÕR2¨á»¡dXf«æèjŠVßP+È!`Ûq‹´°˜—aޝ'-`úTk£á7®Ð§Ÿ%ö™4*ô,÷»ž”’Ùå#“q\ô±¯à&vXƒLèê WCÚª B° òÔª,奙^M]5ã‘l·Fοo:JG”g 2 E±2µÈe@ñx'ƒÏFÏ^XFê"K ÿW±!è­B’wr“àbjЧÏÑïˆ'þgo~Ï oÎ'uÜ<–a–2ì¬<›]Bfæ$;¸*\êïæèJ¸ §JÂö-çeu›É"£-†ø½ÇlÚÇÑ~Ûä»òjêû~-ó‘#WÌ9 [ìhæ°'R4bþq´zŠd÷àQ«Úu8ø”©µuOÿ?–¾Û 5>ÎYf‚S ¬·´ ¦Ç‰~U"¥×Ç+¼¦Tÿ ϾvaåÝ\J§‹ríØ €«ª2¼$µ®^ ? ’Ýî#‚™Œ€íòMT0éMÇy±ì¼ñDâòZ¯å h)Ü-÷k¬âY}^¦·2»)ç¿â1–2ö8·#®‹-˜’I•&•Êœ›v¸åÀñöh,7ÒTD“>y¯®z“·¸ž!ª†ïIÞø5ä´ >E #MVï#ÓÔ«!ù´+ù;ð”N5èÐýKÛÝãÓ"0CVùÍæÛ¦Sx¨Þ ïæë|{iñMä,¶£¨¬N‘™)T§Oß=ª‘ù0f¼°ágÇ®vÑk´qÑ·FG¨l;f‘A~aÏ à‰1,‚ÀlE¨ÆðÀÏÊ3&Í¥@w¯B‘„t2ŠÁ%˜´¬fœû(ŒÕŠGaæÃ^P€ø¦XDCTà ö;¥ÝtÊ\y¤#D1QpÎI`œÝ, ÊNd,F m,I*r^Jšéí >ÎîÂÀg~àó7ÕäèQ; äª;þ{?j÷‰‡1#4y-ºq~%¼jÚÀâ3áç’Š *ØC.2¥ÊœÌ²µv¡”}†Œ-ósNaìS%L‡ ³PÂK³Æì ÙÚzJg‚íÅOi £Ÿ±¨”c÷تÞHÈÎ !$묭•@ ñoT÷4]oc<¤©$Ô…fnØ¿õ<þ±vJ ܹ 5ðAïJpyWþ ›‰,CD¼×V ­®¬§}ÐÔ³BFú¶OT?C¿TM\Jñ ¾Ù$Dw3rüúÆØ:Öyt’(&!l£`†}E÷äW¼£<¢z×@Âp4ÀßOøJ²›Í‹+@É—A¾Aõºþþbãˆû‹° ¾Z£;Få%<3ð‚­Æj®²úЇèK~›6 •ôYÓj÷°¦Åßó®)»V!œmD«aÐ>`=ÇŒ€Ëµ±p“ ,'DEqªÏ ÑN7,| Ï<ÍQWd”ƒÙ§[«œ—½Pê'þ«ùÓSLÆ2J¬D§¾”§…~îfÂîãñ¢XÀr6¾"£‘cB,…1EC=­-I EÖ~ ˆ‡a×ÈŠ…4'íøeè+ôµÝ³á ÷•Ÿ³ÇÊØ¢´ _aL©Ž9 {[>i\S†ns¼eŸP‘BPBw‘> ¨OWØ"%iÿ'G>`·çÔœì_Z·j¼E¡X8Ÿ ±†âÆø‡xÀ¶êÍSB?Ê Î6ã)W¬Ö¾-s®N:Jëåûê§Ñ¸¨éL(u¡®cªž;¼ac·f‘M7_n¢ò'UµÙ4Únµ¦£F)IJמmVþ¬]Ïï"YÞK¦ ‹É¾r…õÞh!‘«}Q)Œ:w#¢áV#ãr´*îdŽxã„ -ššoîh÷ÖóÆã\VB6W-­EÕk3¤ß•Ù¯G˜¶Ä“üõœ‘úÎ`´N!:ø¯­‘‘A`BilÌìñsÔ‚Ø­ • ΈéöW%™Œ=PnÜ?Y’Âoj¬äŸÈåcû³…kËúµ‚ƒå­_×±üŠ?<…°‚Y“¶<%óëì-ç(Ù^_.äõ_ÍÇÆØÄ .ýüïšU†«/ÿ5¸©?õp„Eõ®êDcž£]Í„¢˜Œpq@NQ‘ÛH´/(+† Æ‹‚6JóP¸“^9{:ÇD—Üà&¯«Š.I±w퇊 `ÏÄP'¦˜:í~a +%ÁðšQ5ÖR}0otP· úa ­3•å@`ý²•ä—¶š:åsS ( ¡ïu瞈2v^—¶>=~æ´{ÿˆØ2ÙÊ,|ä©Ldƒ«oQ]šQuÇ)¡j(lœµ|ç‹‰ZwÊÝíÿP;Ö–Ö&#Øo|×åqm“âÄ4Œ N§n‰ ¢p!þDO=<û̓}‘gIÓQ Œ,¹Û½ÌÞ ÚaWr*Ê´âAýܤ°é­Æì¢CV¶‰V¸j¢H„Ï!(¾oKÌßjÙIÛÞ‹XÆ¥ìö—çq_ˆÛm ø5%•cãÌS8hîhµ qéÁ ÚŇò À€:ÄÀ%Bþ4ëY‡,$þH$6:ÍíÝ.DÅì ¾i2ÿ÷ZÖ&¤Å2G”Z(Ës‰ë`d¬l±ƒ-Ý{Ö“ÄHw¦-} T|ð³B°DˆÑ W"(ÖgŽßfqa#%•ö™•‘ûp[ö:-ŠÁO¶Jþ¶i¶Ízj7Wë :™ÅöÈŽ‹^ð‚3›Õ楦#ú»zçiö4ÞVŠãÛw)·yÕ’°ÂZ:ˆ/ëÜí|6é¦þç%ÿ&°‹I?+z˜yPYT“65އþÉ´ÞäVŸ»ÕÎ S«||.ËÍ`’?)á'˜Pù$Dêð|3ÙÊžÔD~§†¿–³øñŒÇá±qøjÔ~ õ²k`=¼@Ç_=òFý 8!K[cŠÿ~VºÜý¹¾ËŽhü…ËdÕ {˜ûÙÆð­»¹¯¢–Ü_/GªÿW.ñãÖgí¢¡Õí&D.žZý¤?&1wó¡E]Q ­Céà “]d½úò•@BÏòlU¥!j‰áêGWAkuû}¯=¬ñvCTìòòÓ]@ãÖÏuñx¡$§ª©¸œ•œ`(0áojT(%€¾:mvéÙpY´cG|!Æ/\6iD=ADÒXIK¿"‰3ˆR~Û‡•³x^.c³ôŸÛ®D}Wº©µÙ#xØÿCçùäJà8ÇcñÂpóAI•²(ï_ƒÒ›à4©«—£ÂÊêdŒöT…•šTOÃ-¬5 ãR¢‚Wó5ð!`@?\ͨSa‹‚;ýIRÒh½-a[­CÊ|•OÈ–É9J³&…U?5–?5›&òiYxcÖ Îë Deëþ÷8]gWÇô¦/u˜£§Ž}­9l’ŠÝS'&@ª°ö5SL>»gèô{w2±^ÙÓ± ÐMqd;/˜M‹bêz¨o4bú‹7Žy~CŠt¡0VÓ–b-’U…š°‘[].ð­¢Sk@D¢}*¦®öøBÞ .i_ ð ÐúôO‰Hù.Ÿ~g²hš.‡»¡T#ݳŒø §€Íж 'ŸÏ$6n ¾Pîo Q,n$Y‘8­?V·:®nºî¥hˆÿZòZƒ¦Ñ½)þ@Ä•ÐMþÿJéƒ Åþ¾Ø‰;‹ª§2OlI…Ò _ûUQá™Oî§­›¹Ñ:µ­V”fŽÉ[Ò@œ_¬ÓölÑÕ D¯K¢ªOåöÁÍv8(( rï™GC·-uVL·‚tX¬Gýãá;¿üžFz&dL}áLßîɶÛmê8ð z@!)”A}Žõž? ´ƒ?ºhŸ‘ò€Ý•?%°~%-œ¶—í*ÜŽ)Ýl¾Ê· > ‡àsT«µ¦–̓â¬BZ{”‰)1—{LGÑW¡…‚’µ–>ÂKÙu"-èaÝÈCÇÃ"œ÷¬ÂÄByK 9tßÃfG)?gcíÏ(Ô€X²iÊ_yAçé@èꥺJ=à¢WÐ+Æ}Àܽ†ø¡ÝX6àpÛŽ#¼þ)n™ï´AÒÄOù Dcù´³YZö~À}_áÁÎo#xq“3}+¸9ÑLC¾: ²½Düu §“îíƒ3&%9m¤9®á"åö÷Ó}½_o¢'ðöËíô¾Ýñ¾ßCßáìa‹íî¶ûw:û{ðþ²ÀðÂÔ)O–Ô#3E¢4â.Í«ö¬ §uƒQ’Ÿ é±kÔÓÚ@qVK!s"@ëãú®ž³1 kReêíGhÜØÚø¨ Ÿ ãJ;M‰Ó·J7—§:b*;Íó°¿žççÛì¸_e9CÅHžrŸ•M©Í³! ocþoÚK¶AÒ)H‹€ÿOÊœL½‘£*Nî}´ÓZ=ÈüÔ~µÏ°ŠY j|׌e÷ò 8MýÐàiˆxŸð©âÛ×ø2±ô°‰fëu7i¿áÅKÁ ‚ŠnRü7;³IL¼ ]=/«ÆÇTlhI ‚vÃKýÍç0úÒzê.Üû9nrŒk ëV{x±6œ˜‘ü ;Ê8ž–û³õ¹+‘J!Í6LUQGò$¡b°&‡ð ôó Éö}®ìÆ•Z÷ê[þþÍ‘î§÷ôîµö“˜‚ã bÈ RãðÉB ¯µE4uk˜Ïs¡›ýöÔêæ8Ø ´ÔQàcqgö0T+®Ž·9eŽÖÏ™žMÒ»Ð4[b" û#ÂÀHzÉ1,?¿À¾[É=®ÁXËl!P¬°wx)Šž ®ù·ÍU”(Æ…(|T\‡pMQ`¦7¹q˜åÞo.K»ÑÞã¯ÅÁ›öRÇx\÷Œ]ƶÙ׽ðff í¦oîGôѺP}>6Çæ½Û0ò¹¤n»vΙll¾V˜w·Àï|Û=|š•™!ZaÝΚ8ŸX¨qÙ1IÅ®¶`Ó7„+øƒŠwÉB43> ÐKÅÔ?ëàHg_óµUšo“Þ+_ˆ|ÍóQË ²©¤BæÍ3)U¦NÒ¯Z“Ÿ^âjY¿%}åW@˜I!FL0¸LA…ýE'¨M@Ñ"=š{©n´òj ŒFXÀÅõQéý¨É¡ªßE8¨&WYj­äYZÁ¾‚pѶŒé qã-ïå ùÐk¾ C;¤Æ4Æ6uß«%BâuhEXsûŒfŒ=~¼nHwÅaSž¼¨ïx”'˲h:uÞL­ÅFím3F’f몊'iy\G½ãÄp?-Dk£2<^–ü}¾x‡ q£èCÊ.¡:é<ÙÔøIì^öÚ¢©ÉŠ)w,IÐ@oô}=éÑ] â£cø/„?”àunî¿Ìó¸½öÜ–ê¯;íŠÀf£mg¢ãàï^ƒä·+¤|ÈPÍÂR\±Ö°{öÙ£@­¹øÈV¬ÁÂ8¶‘ÇãKRiP[à Ü®À#!âÍqfk¦¸:S»ˆlæ±’F‡Í2„{±Å7pºv÷Ãàòk³‘wœÜ:a7 wñÞfRTa]²]cWÚ(mÂ_zí;,œlÍ¥ÄMÕµÈNÄúB¥m&øL·ZšÂuêýºÆ&mÊ%!]ƒ0ùD,;ª™ÌX¥½Þè¸ëô@‡Æ‘¯Ò,” MÞEˆ«³h3üc‹Aknù"„èuØðͪ¥N]ºm£©e D‡—æq½òMAœn3©Öô¸àè¡UUåØ Ü\?ÂC¹>ã ùh…Œ«ñ™×!ñ:ŸÞ³YŠGígµÛYå½# ù4O›`ßrXÿ8…2Þ?5âÓµ‘o“ö8wðD7uK^¼oz¨%Uñ€ÇÅ[¥§—Ž÷•¾R?+Ú¯() ~¼þ´‡übô¨Øs &€’¸ñVíÊMÏ@ÅF{ ,MBÍêâ‡Ôi b¡?þ°CŠÒÎÔt˜¤»¢wÄÏà—XX9€zó 7c<†>a?â©„ïÞüt'Ñwˆ%hÏSh’AwÈ{Q]é½UpëÊ ÖÅu^?è‘ø[´µ¿¡þ18¢X p¬á@£%ÎìÊ0›÷pøG1Š"W»:´v­ð’•C«ÛkÁ¾eÅ0>­á6«È(=õf¥üý9L'Š”¢H€t"1„XÙ `n‰"í¡h0‰>qЙ5 t^S FFïB¨øœaºœ5”Ýaj7VçÑ/9ªÆ^p¸PÄxø¢ªz³WK.Ôög„u¾€mÊP:ÒdµªY”<ÛYé ÆÃºfJœäF›¨î¹&Nȧ©PÜ—\TnͲò¶ÚŠüQ‚ =S•¹y`¿è‘Ý «¥Ýc®ÃÚƒè)¡ýÀ#Øz8¯z‡‚Ï ¥Ä‘”ŒOÂ}¨X²¢Ü:Kñ=™¹o{?™Òêa'Oi½ß¸ˆ|æ7/3æ(®&ôk%Z— Ó0x?«7(¸ãÿ'=«Ì oe˜ Áìæú0âë¹²÷tÁÌã^„:…9q¼Øj »u ?Øß ´ÓH¼ŸuDÁM&b?Ç—tŸuŽ)kML³VØÎp²õmÙ/æuïX'ûÀÏ“¢å>í±’%ë@£Û5ô(ùGXÇpÿ )yU'éwõ˜¶!Ù) ¯˜”AêøÌ…|²Í–=£À¬ìQÒ¿$eè°eQ hÿYÍ7k|ù êÂ.ÛˆP!gN´ÓhK¶´Á  ²£ÙPëcm:löa„ÔþŽó©Ë[†é»}¡ƒ²Lf³œ?¿ŸŒI„c4F©ã†J½{>ôâÿp`<\"4£·S\SÉç~­âòw@Ê…—ûYAx"÷wbÍÈ1d‡ÙöLF´™+]«vÛœ;w ‡þfg8@‚›ýçiVwìU9Ñ.]-Ó.¦µè¶Ã‹pÀMò,Sa>ú?»¢%ÍmˆÌù;fÞà Y|u*_zߺMx±lö¿'ñ´P̽ ™´,€”Š"1`Ëäd/ïHïM`uE‰­eûêæžåª–@ øíû=æ£Wˆç»u¬>€e|ªêïàcŪ† ‘#ÔlNyñ“Œ >´­3ï=úda¦™(¯B†r:¡ã–wc¿ü¡»Íކ’—¬éÒF bì§€.gøgÑYyÁ{X7n (ÓI³\tXÎmNeðP:žBË&‘Ë·¨uãÔç+|´æ:è}¦BÛƒ‰þÄÑXøÔî,äˆG¥-Ä;Û‹ÿdŸŒS–6bT}ý5>uR`!áêe¯¯sú oÌÆÕú>Ÿßy®B>…þÉáLü¨¥Ä†îÈE<3a™A«®ÇxÅ{WtÝC«z"Ø-SsµQÅ0÷xììСQ†Bø‚`7|Ö:¬ªí.xF€ß·äΓ/8”õYV‚Ŧw’“(zó!ëÿƒ«ï¤¦&ë\SÒ"«ÓÆ´›¾hæý…Y¿‘‘I…\c'ÑrÝeDät8€E¤EÆHVK«áÂjd”¿%ŽÊÛâŠuÎ|R¸®ì†Z%.@²õ¥ ýÑšÂp½y*¼4ð¡hf´\}–ßcÒ6)àR?Bû ZúÁëÏ]D-ñ=Z'Ç€æ’9ŸÈh²ƒjÄ“tíã‹×ì;`˜›DÍøí€~|0]jTåéÿL_5$>·/§ »i`ÿ4êž@*bC žÀgÓÅÃGÁ‹óËÓÝ>0Š‹F˲7íæþqþùßnyó|.€ýñýû¿%4².zÄx6ê.É`TyR‚ô³¸^}‹8Xl¢,8Héu¾õ¶}hž-Ï9—‡b^× p<ÝË–ïašzÔÚÿ)ÑC Â\iæ”Vhwº#S“.yiJrØk?~^ yýK^[hö?ÿxo[_¬Щ¦´e¬( ­œÒ)üêu§pK Ë öº EFXéÐÿ‡X$c©a’d®Þt%:¸ž‰Nýì OžB*cBpês ß¹A ·ÿãÛ±HÿTÀµÒš‚»D@Ï”J\…ë§<`ž‚ô«´Œ×¨–6ß)'Eò!Îü–V1¦¿7I€öá¾^”Ïêl÷Û5*¨Ûk9°¹Ï&¡¯A†@pI¹ûî¿¿Õ„~¿Ï öòÉåÇȼ­h¥ºåFAÙÒyü S‘¢ÑKrîgƲ°´Ò^Q$É–Vø‚N¯3!U†DR€ÄõŒžöW^±¹Z´ @àº$Ö»Ó¶ ºúí¾Æ1ŒcÆ1Œ`‡5lÞÉRÓXùMÛ7ÅÆk·Ys}Õ3ß)•e¨ëéBÏ“Ÿ-•†ÿMë5ù‡’µ¶g á`?3à L©µ ipä Z\âeϼcþe,Aš3K({䥓&¸ŸW§êiË/ €È¥³'m\×—£´Ê÷–KzúËÛ Þzp½ òµ,Á {ø4¥œ´-•Òy¥âàãóC.Ò’Â’˜c4ÓÖù6ŠiW§XFfz7kš£dŠÝ‡Û.šp{2)ÆC¬}°ŒRrÌ ‹R‰¡¬iÛ€ÁgÕk‘=4 Pó’T¹»!‰RŽe»¨L˜¶.g6÷ôk÷óЧ;š¡ž{éâô!Þˆ1M¹óö’¬|&ˆóŽ× tÃ4±ì0ò²†Hƒy´]€-ÌÝN€Tlš–íðD?"i‹ZM8¸íƒ5Í=}[צu¸¸Ü©ŽêOÒL¡‹•à@ &å•ÞÇÙ\ÜW”YÐ[¯šûXâM'z*«Ÿ:Êæ&èŽeTà¶ ÅÆ5–V»Vœ+ð[Ù—kÄZp¸ rCëÔÆ´Iel°Žºt'~’tñQ~î‘ïᯭ–{O³(Ù¾Òßóö{·»]÷õäÕ-æãR´í™\.Þ°)ùâIçhÄèõW°«‘;×öÞ”ù³W]ŵþ ³ç}mü]Û{¹dÂãÆgó uü Ã,©ZUQ4v ¨»¨Uˆy˜|—/Hh!:êbš@Dµ3Ï4çòU;ÈÅ£øylNÓºÓr;»X”Bâ°]ŽèGÜùõsøÍÆdš%!€¡gtL¼©²Úÿh½A¡-w%/U’A’f‡M8dÈ©_jåT ~1™…éÉ/¡Ò¬£ ý˜–Õ»>ó!Иzöp91Š‘?œJ†&:ÁðßÓy´[Æ ­¬œluiTà.ŠbÛŸ!ýÆbŒCãpë­ÍëxcôŠp¤™[ïã³aP˜’À ©üÐŽ:©‹4u ¿BCµ•é®Ï?¥…°†fo¨e–²`0EݯŽÿqõÛ1_Èú‰æ¡o;3̯K º…nÞÕñ§Æ9ê§WAJf”ta²Ñ®Ë‹ê|Ðh“#¯ ‚&^«2—ƒôðÛU¼_ae»¤Uì”cñ(w³„m;Œˆ²V“½àPÐH5힯B’Ügßd

ó!aûN øÇMÙˆ›å›£îš—¿:ZIÜൠÉ5ix´Ü+þíY1Ô÷H8Aê7ââ‚›p†Œ¢^¦SÀN¶øü¼ÍÉyq•AoøÚCe¤|¸Þ’@©éRÈ„Î\¤É2l6GJ q%ZàÝ÷ú¯¢þþuÚ®úÌ.›-Λè†9{®i¬t‹NšÃS‘uö_È ÑXœü4ï ¦û MŽ›Ë}! (F¶Ø¾º¤S.wH‹È‚A•ÚeèÔcóe!™j1‘NÒ›9M@9WOD㆞¯–š=LÙyåãó¯ŠÙWR=H~éj ÷’bH|ŒÄ$øNרDç\»é‰Ï9¸¼vU#glG͉›56uoʱ9ƒçô•éoŽ&{‡D„"&,Ò{Þ°ÁNº¥ ’<=ÿb5ÝË7” Ú…bƒ~àœ?`áÖªZýnÿa¹› åpü/ãœÙ¥œ4X6&Þר[WZ¤ÓêPý½xPCë+}êþ‹)ë°³vÚŽª¬Ë5~?Z#R.ÆÎú¢“¥7Ì'ì=ÊȺFPš/Ó K »_ÛÿSr“¶ö§ú ÿ Y ãÝ7Ô,ðÏÿ$À¬¾{àÜ/’ðæ"«Êa^±DÌÂ¥Nÿ`ÆSÜôàrÞ„àaö0>¢ßX§¿ÕÐQF˯U=ž!ib†Îã,ªÔ¾£¬Žö.ý¼““V0›ÄÓÏVÃ+É—ÐE d…l\ËPÜÿc*ª)fg²ÒrÁ-u#Þ½6¨ °ySùÀ]ȹ5–šRZ†$È©æóVçCVv"¦1„ç/Ûó”[ô¸‹ýãûbÓÒwÿ>iàåòœ1ìÙwbBºwqÍ_µasôi‡>èG™*¶‹oÓÖNduÖ鼋D¦aVÜ›—NÏeÂ*)¸È8±ºî)S„II¹Ô{uG±ã ‹hm)§sÛå#¢BcÍ‚¾—àú‘CÁÖýÞ=IJ¤þòÏ.]àóÌ΋zÅV Ï!é{µ™<Ó >»Ïbõ$Ñ 嵯€Rs*e_RÕ_ô¡¿šúÿwzA:}•Ó®SÍæ,‚ó˜ ˜°$$‘Üf˦) o˜×![BóN½Æe‘'@nÄBÚ™ïOì(¦J^VÓäëÖáSàÌ3^~[ Êì!ÆÅ…ŽåöøºÁ¢‡‘)6ôW”<Óµ/ò9*ΓҧÐîÇ$ôëC&ãæŠ_÷ßñC€Ùë=×qe%vBÒÑÛíN:¯Í|PgYõGÙ{uè­bˆè€Ð¦PjÛ!\=ÿc¯¥èfxÞ'R—.xÖ®k‚0ÉéÆ „îv3.©€¢¬©Û̓©A|†ÔW´’ øá¡“¯4vÔ®*pªÑ¼gî2.Í"Ï ÕaD&iG#A¸ô&. &:‰ Vcwmxä÷¢ö®iVíš[<ÅöbZ×'*!ÎR8i§¶Ä|#ì®k¹T¨ëo\R}ó#-äxÐZ4Q¢ÌGꘋ‡ 7¯h¢¸üå<^TÝŽ5}El”b™oñÇâQÕkFìýkŒeªð;xžµã/!qw3Y•|3O/k•ÙÀƒõÁq°ž"j’èvÊ §§=ÀÓ†ÏTgêWMÌ­âæMèRövÊ:¾æ»T%%‹t5}¡MàËDÝy»ãˆ‡§>/¶ˆÛäÝi¨y[nHú ¢…–¡ƒè¿tÆù´G]›+æb²j"ÜÌÉ´4?Ëíéä%T•ÚœÿxØí¾wžóà™ revzíÂâQW±» å'ö#– Ù¯ó7R’~ö„yÔÁz›1¦§3 fž9¥®SX;àÑExåQwqx.h›f}ˆ#lͬpDûJ?Ö(í Ž,^YÁcï=&Y¡Œ¦‡¦øÍb¡at[3·Ÿ £BOCž'zvV]2ìÈBÒµ|8íÆ¢Þq‘ßT¿Zµ;Ëzp?kWªö0 ËëŸ ­W~6·±n u)î¨Ç©iž7sÜ‚¾Äteö™è-æ1M¼š=n¦Å~z×Sð=kyöǹsqÏ F2µHŒh@¹·Ë ÔÑ5É´Tè…„6¤¥£(¾m£~s¤æ{ˆ)C¦RÖºEð­–Èxêovón·}N]ðPÛ‘¥óáþ¢ô+7sHðüôA[}^½â$öjæK‡M=8öéE/eªÇø¨Ø m–l6}S%…&ß;lR[9Å‘Œ ˜lrå2#’rËìÙmÇ´ïö´ÅPoÞUÿ%'ÿ2CÕCwœ£(ªÊ,MVË?æd¼ôpvÉ ‰-Éœs™Ý­O_ø®“°¹nûÅ× 4çH†©Yˆ¯RôÔWàäñ'úÅÔLÛµOVÙsjø`|š›ä›ß Õ¿®õ´*ò4LP Kœ¤fÏ;cyÀSÛ‡_Ú:_ðò/äÄŸì2¿OkT@mk}àý®„”è†ëÂSÌÁª41ú|ËÁÞ}ÿ/“¼Hv82ží>¯Râo¹-?×Ó©ÅÂY"iËÉB€¾~DR–v›èÓlÌM‚ó´ákQÖérÜO ·‘T¼#_´TiÚSpi=ô˜ê aZ±¢)r°YÐÇBx>"œ½¤`Õ\¾ø•ü˼â‘*Ýrö³;–V’F#ƒeÊïü¿òˆŸ=«'‡GídíHV2#óê£Ò"0ÖDª¼µg8b_ÏëÏßñ›k–ô憻ønõ3È·!(âmÎ- Ïñ/Æð äëPÖïº;ÿÃóÂ꟱ _#ޔ̊A;]mfQÖj¶”?>Jwל;ó›Mg¥a¦÷+ö2¥ë¤ôfþ^K:.x·™zNsâ&ÆÆ¯Wóã3…pA(ƒNYTëÆ½L'©µ³—é5ß-Ò{ßdÝõ!¦Z¢@±É¼/é|/:_¨*Ÿö ¡½µ^-÷ý•Þ‡jû´3“o²K(ÿ,ÝŒœq)íg@ýÓ G/EáiCÕnÓZú¤dó0tõWß ´ÜÿOšµŠ`çlJÂ Ž¾ Ý+Ÿ ®²ãg~kàpmšÓÕ^'!‰­¢ vœ-Øîà·}Ž™ÚëüË.²?½Sф㬽*å‡ei~Çw"c–¢ªk% œ泉›è½noÃ'EEû4Ú°ëLcÊ3Ð6;x?=E½æ/§ª¾›id›_³¿¡^úç!Û?ɳÝhfñ†ðxçW±ÁÏØ®äÉåsf¢ð]3]¦|έ½hçâSÛðGv‰ÄÐlÙ6Ùí;‘Þ:1ûèíjÓ$Ò†ö„x© gîà*‹ž:ø)6CWBm¸QMÁ£(†¾Ä@Þp™’@޵¢VÈ"ý¾åÞï-”Ü¢½×ÉH„ÔÌå9¾…φÖí€ýõ4;5p[Œ[¯ºµ1¥ Aß’½”(ôî`@K4ˆÃ#·‹´uMy)ÌÚ£RŒ.â:¼ÖdÖp(û€÷ÍÓôJÛÈ>¾õú$kÁÏoý£h|Û,÷7gYÔ¢ûç¯4>¶í´7MžšÕŽ‹ºeì©ÖÉó v>¼¼D5fƒjбÑÂWR±G€›JCãµÐL™[v@?½,j#m'6s*˜9W£É­r-³Î¬ÌàžçGXÀ¸º°†ç„(èIÞŽ‰Š7ï“·¹Ò.×XhOâXØ1ŒÑzR ôŠÏÑÊøMBå ÜB˜oˆMù«õÙøþŒ·›æ§Ì”»cÿ¿ÏåTÊÌ¡Zu»=p)\‡¬–ÊŸÊŒ’Y® ˜SÊ0y¹ºÏó Ái1œ·SuËŽÀØ’…ÊËKþfòç5“»RŸ{QàÛzQJ•ZzÍ.*Ò1nP¸*ªâ•Œæõê ¹8[¯ÁL­<(yNJ„¬Ÿ^z>ÐK2Áÿ½t.±Z¤Ò_$œ¡¥tXóÓæwÈRÃdØ/A€ýš<…m#Ô0.ÉË® í$Ÿ¥†Ôò˜ …ÔaÖÅ~ŒDâžcÝ2—x¶O#¹X%¨À¥æÛïÛ”=W®’¿å¢¬íS2Í&YËõQÄxNÐüîfWg¸âd˜™t{w•vÍ€Kãáñw©m£ÉÞœ)NêaÏ+Uóß7U3;¹‰nd†¢¨–$cï£éÒèÉÓïë߈rÖ¹ ð/]4Fy@1À®TèA®2æJ4å<ƒo(&_ *¿gÌ…‹Wˆ…Oó¼WO&žz¦Ç³&ÏÖØï U8Aú]§T ºé5"w,%Åÿ@ò§Z+P>ˆ)uZ²þ‘„íñ sø—² *ÖõTÌç'o ªõÑ-×S¶>®C顲¯!ý¼äÃݱUÊ]Y|H²ÉEMé|Ð×ùÐé EQœ?½©‰w^xLèûZû¨Á;‡®z¦}E«lƒ2Ò1áY·' <$¼›õj¾mNÍuŸhc[…'o™Ý{î;Rr}³­æãºXÈ®TMXWûd³t'B$àl;\gøiíú¶F+7pyˆy¯·Òß˜ÙÆÚã'5Ô1U]@EÂéSîj®Ò ȱÌ×n¡…·Á~·Íyà&'³¸ù³çDxCàxäZaÞ™Ó25W“Jþ§~‘uü€tPÉ•m8¾Äs8©ã›ºŠÌW—ëŒ84æ×í1×I8 Ä&™ìÝŸ¢%ˆ(Bôñ-ÀvWƒxÈà\qzì£%x]I^[9‚Õ.nÃTëqµ\nû,Ü&ñ&H i-˜ß^‚óƒ(å*ÅkL¥L L$OVÝ4èŠ^ìê­Ýè-‚oÎñ•îréž’®5ÅuÆî§BÅ8ˆ-†—ÚÚùî&fÂó ìÿ)B–rIï¯|9IIþ³ú"¦y³­’#Ü43Àãõ/Øá’¦ˆÌÛ„ÞâÎÓIî)³h]mÊÏ”W~+\ÙJ+×ic®ôCÍdYd7Í 6òÕ¼¡rD²/Ör:° H3‹©#âª/2jëÝr¶áè“ÿ`Ž}!Zeß7,Â_çk–zñžݳñúkæ­ŸUvõ’@kÐОÑvaì£~--Sù „„®À‹Ì$$2sþÓí7P l³\¤“YÙk4²(ó×ÒÇŠºz&ÞS0M¿<Ó×åTº£ä‚´]Ä^HÈh4Vfo}KÂg9ÄŽiš1¬7C‹¼bÇxÊ=rñÅeQ¦©4ét|Þ¨Ý^ELàÈp@&]fg2RÔþ‹Ã1Òñž0ý” ž¤(fA:Ò “•>ªg …¨v³=“ßIâ(¨òC¿Ù9R,Áªô䆸X38’9‰†Z4é) –Ò%ƒ 7ŽÃë“-ó‰­ ƒ>}M`›¶Rã[nš¿júȉ—2ª£QýÕ¤ˆO­Â~ÿN ç!,Må/°'\¥ËO°BXx7ËGµ›Ì%¡ýž]rÉ¿ËÉ:ÆÛ°ºK“wu$”ÚL}¢\&¶¤xQc8"naà6/,˼E@ïmÊ©ÂçC&ÕUcÁùñ³­úæ¹ôEâÖ’(˜£ÄÔ”O£xß¡®æÝÖ¦G TdÒŽ<¤[ÑeðE I–oŸtùŸ Þva»Bµ‡ìsS êO¸`{tV ¢Àv8ŽÞþ"3~zÈ¿¸Æºp8ñm‹æÞŸìO¾HÕN‡óHØÝk=JØz@‰Ñõ¿žÒ½O0ا°8ºù0J\KfeÐwl{6·â“¥ÂÂoùè'#×qΆŷ™¯¬gm£ý2Ç0¡aÙ!DlÉlQ´€d*:EªßüÂåØyÎöyÌŒÍÅxçpg&×»€h¸Lî-ßTDK7¤£ðw7fãDµÛ•[ÜX räìD/Äð3í¢óõÊPÀ6ˆÞ ÔQú †áõä[\\æºô¨šFäGYuè"3á€+uÍ»ËÖI£æ[9ÛU6ê,¨V¼[àéy·¿5'Yk s»º|¡3-Œæd;ï/âý\ýOI5Aü=Ûâv‡&¦dˆKÙwÖˆªÃêF³høënH¯æ¤ŒãÔ¸õJoïh &ªq#[á;×Àܯ@”½MÈ €ž<°eð"É&&•™PÛÉZlnºJsHû­)G³®P£p¨ÖŒ¯©,f‚©®Ó]Ö¼CGPÌ`‘;}o€'A²¤ø´ƒñý9ÊiÖ–Õœ€Áú,Ͳ«D4jàzï‰Ëô×nïf󌌭­Ïæ›x;±ù\Ü„ÕwÝ7”uÎlÁ%È[Y¾`9<ÐRР¡¯)ÿMx§“”}B—•‹§X¶J ¸ â¹ö‚m)Ãto`£âŽ'cÛîlºµGÔ-Kžixy|jm?ÒžµE‚¥ëS«…¬rÝD‚!º¶é²ËIX¥÷¹!;Éx€|/oKvëm¡]ãY›.6×¶õÁ=_̤%´ÛØ|ûâLíuVÔÇ£àÍ£‘Œ /ÿ^0©…<û¦$¹Ž¨¢Sª«‘4œ”½¹ñÈçîq Y@þcöWuc´\7­ˆ­q•Ú!–§ ´ª L—žÐ j~Sëói¥UMLó•,ž[ÕOl2üǶÇcÖeOÅÔgÿap‘óká—°w)N~ù$ÈÖß©f6OÖ@Ñ´ÏUíúˆ”ý[޾ .à3AMé#pTJm„ôÅ`fûáÉZ ”ÅÔW™è—==`ÌXXlŠä·bõ|›B‰m®RšÑù†‡•vóè[u&,]i釄€ïkC„Í>š Þ†7.i+ˆ‹KŽá¸K ÄØo¶ï{ßõAÏ Ýwæ ïó+ëÄÊ v;ó\üÙ‚q€÷#ÿ4êºÀZV}õ*‘Khú,Sd¾áÂéz*ú]”!µYËËïQÑíй—Ž+<ò7öù@õÓ*ŒR•ÏC©ïëž›îûÉÄ"Má^|~®=E'ºCIüóTÁœyÉ:uÚR ”>p¤ÓNù ã³"àžå.ðYe…–Ú@ =…Ov3ÇùÞñH¼«XµuÐ…ä4~ËìÈB—2öiÊæ#KfÑ\%¶‡ÞYxÖ23ß™~%q¹VHßÿk%FÜÖœzäcXÊðJ«÷=nrÝ8Y5 €?MŦgÐáEÄDùIUŽŠ)eç&É‘¿e¬‰@Ú¤É#½G”x?áÒaQíoÜh³vÿLšr³JºÃí_¹C™»«qÎb/÷‚ññ¿L¥§@óqO|ÙaÏ«r…£7á¹®š®x.‘Ýè“MájŸñ»½î›½:⽕ r;žü«v¦¢€~×=ߦ#åû˜ÃGÛ1^t×CÁØÕ×ͨަjÝù‚Âù®~3<-žLý‘í(Që|¢†\ÈCaŽ&nË Ã…¨Ï½‘|Z#Ÿ.ñ<¾†8–÷´x2˼r°çâšÄ ºKb=©MC5·åiÀ܆üÅ@«9mÑnÓ۷јë1㕯a‡ŸyâMÎfÌ»÷8æ\„³­ƒ-–ó¢ä8s‡\a±8âP k9\±ÓésÎàÜoF~œ˜–ç_’úÿ^ªŽ@ì¿àr•q{aQ÷ÁG}ÌÏP}%½6Ó±Geqˆ{Í ¨!•6˜èwŠL>{ù"¢ˆí2àôNvÔäD‘t±Á•íByòß¹(i{ÒdNósÁž׋¦¸P ±Iï¿©´¬ç$ЀT\Íò¤ýÍXe1àüþÿ÷çõ-ùÔ`~Nÿ?#ÉèÊøi0??§;äùýY_"€ÓÇÝ…¦ŸM†ÊJ÷ü‹ãjQ‘•‹Ù^héwÏÑ¥Rèìn’8jJGm{y ²d½Ë -€X®/jÝ"ÔÐ]Sd« ± Í4¦Š€4ð¼Ñ…ÊQqbËñûd9UW.(=ˆ¦L.oV…âŒËtÂ÷qíû0 µ¶|ÑÒ‰<:“ÉŒúllüX±4Ò¨ùVÇ»&1ðèê¶`ýÕÑû ÑqEA§Ö¦DAË73bÅ5O0H›WŠLÒHÖtãj þCh¯¼%γA—¦mã—³Ð&Ò×dPå¯Ç>Þ’2`plâßT–Pp¤}~›_MKÏ5ïIÃjw•+¿(»Äï1]EªíØ›!3Ï׊}wÚ#õ×ðA–A.ñmcïj¡gˆml^-Í Â}z; _ò¶QîW»8å{\E±%]× Zp” Zzü mB¶ÑX¥!ß”¸΢äè&´y­wªÉÈ<‰à_½ ßÒ,[ÒAÖ<:+)»âÀß}É–?ÿc &ˆI§²nW1ÈS¢pH¨"ÿ‚X±;hYÂ\AF¦Óÿ#ùù\Ý3ÒÙΗ`ÞKº'1ö·íÒÆéX·]ªwý¸OEÖ¨“*ñþ§I‡ ÊÚöSR«­Y7ürbóå–{¥ë,ÀöU65’¹OO5aN6òXÉßNDÑ ¤§ò‚’¤K»‹ÛAj<Ô~ñžaTÅ@ oì¯ yË*÷’®Éç e?3J6Jr(]^P_tÞ¨.¤Iôdñ:uV‡H ‘ËGçÃ%fÑzM×àí6„oM6…vñïx0V‚دc(@MIõ&üÂ@àÚ‡±È8AZšc"ò™–‰"ö~ûâð 8Ò ]A»”œ1d(]GKU¸ÿM PÍHÖ“ù;3¸šõlß…·6 ®¼duµìÄâM9­âò_j½;ºÈIl•=~tX¨Mî¡ð5·Û\1ÕIÀ¥r3D°ïrÄêœ#¶2ƒ•¾Åã *CŸ6ÑIÑ]È M—Æ¢ R¼6ÃøQ ºS,Öí…€/9.ôD'¦Õª9)~Èå_a?ä»Ê%+„•Uì=‘^ÀýùÁíBpó^g†©ô³ÆnëúÕúªèÀSV¯Æ ^F6ðH©'€uJµ@+[ªdæ¾[&æ–tM¶ÝJ`,¢ROWÀ °Eýþn«ýáöÁªäí¶´è,ÄP‚(JVöšŒ•ŠÅKˆy{¶­ þb½å›u4\ÛÞ?Õ äìýG…º¼¨ÿ;o…ÿi‚ùøØ'ð4¹0­oLyc©“®Œ5ç«zUØŠh³ÿ1Ó%£²É›yiÕWùÜž ·Ì~|ím4ÝÍ(V½ÆW;¯PýXŒIx&/Ž‹‰ à,ã3ûáqþõf3œ‹ã¼ÌÔ°'')öë}+ä…B°Ü‘j ‰•i&³*_å]èõ¥ª%7 â"‘|ñ?lå}ÖѺˆÐÄ"Ñz1èþx ì4Ó÷Ó!×]e 6…`NfkkeKŒ£ˆá·ûE¾Ì*X*McÛƒ›Š ¬ó,¿wX¿ú#ð8ЍQ¹-H…¶ˆ*¹TGÈ4„¼>MŸGïp> |œºåeÚ{vòy­Éͦ (ë¸?ÀE„ÆÐd$Œ T{<ѹٿny™ïª#‡ï!´Œ_Zú|…Žk#,w2?qÌxí }'v¥FÞ™Eb_έ`¿“5Ð å`¸úAò†±åE@OX?ß^oy_Mð‰Ô⨌uÛ /kœºY€„æ”NÈrú “JˆÖ› @f5ŽGb¶¶Œ¹ª¦qÌÛî^2ƒþY„Bx†OY‰‚)U™iõȼI´9±‹/0\¬åN­K ÞQ\Uh˜s²j2 Úlwc{NF¤ÎÑ-lRć”ªw¢ÿe#›ä‚Ò@[¹@¦¸¼P@¾”k<Ô{9ÎÉ$&\ZVVôQ}s%&ß}ƒÌÛ&*lãFï“+EMÜ¥W%„f´©Áº[.~Nœ|‘âêÿpG¥<Ý•–5Y´˜·Ì¿%ßþ…(J[QUQ”¾x|WK¨¡M ¢°u7¹‚¥,M¬Î®@u£J·Þnõ8> ùµàưR[øÒ“üòÖ¼H{BM5×Z+gP ü[ïç¸+°–™àNZé‘\øþ[·(|cP=úZÚô$C,1ä w°²Òu¯†bª_kŒÒ¨¡|vϘ6)º«-ÂdR^枎ì»ÆÊF×Ò:±ÂFö‘-ä·s‚Ÿ¢}<ÅÂhÿhâSñF¤®Ìl~C¯Z mîzD¿çkq] ƒ®/ìz&QÖ ¦Ê)Øt›ã³ßýÅÌeEÐô*¼«/%81C­•ÿ/ „CÃabñçÂŽmþ‘Úv‘²ñ=!+Båô/ÕàÒØ%¯0£å—yº€¬&ÖÍu˜ÚÏí˜>­¤xjujz³áÇ\Éúy˵&¢,(?5dÑÔÝc9Ž×¤;öÛÒŽÅ®ýïñ°’G„½pŒæB¬—²ƒô8Ã4#ì,ÇãÓAki·¬l}}Ò6Ðeö„ùÌ"®¸>„O Ô× ðóEž¥9ê?¡MúSüÝ1VK¦‹ÈŒüGŠ{r¡äSìCqÃ!d16‘°£ÿa”³~„4™ÿb$‹›<õÜó’ñ…öŠm\‹Ôï°÷dîiŠÔ-¬Î"Ú(íͽD.mÇùH½u˜Ç,Â!†8Vö¿KS¬œŸiY¹li£*»è? Ì LO·ÍB~wJ¤p‹Ò2‚Ç·¥| þ­GS³á"ú+Ô*þ˜òݱ½,¢]V^º÷ªý kÊç±Ü#"ŸžD¯Q¾õej¼ ’ŠLo\SËæHQÎX”}^äažëm­“¡fŸyE·=³?¡P¼,DJÀ~\q¼?‹!Ñ%•e«O­Àæ ¦\ý"·b˜Ò6ÖƒBÅ^ººéÜ-ªߨõÎpÇ oé#oYSMENš¼©A©öÁ~Jß÷3ü,ù˜­R"Ê·AÀTûäkN­õ°*X_öZ&ôÂì_zw¶Zã·µ•nÖæq?À¬†Ï/Ë jÉS+­4÷WÜËMRœ,B‚ÆöŠàuÕ¥øèƒî6•åºq7ò¯C ucåɤœƒo«&h‚²¼¸vÈÞ&O(±4¹PÔƒH7n€,’ylÙÊ@¢´»ÃH]Þ®5s¹r–› †'Ù]y^¼èoèlçF%…’|§Þ–sô»Ë¥Ô“|ßwm›¿µÞá2êfŠìÞmM(‡8ú+×lûgC„¥$‹.;&|ó•¥Ý›ØªÛ܉–}Ø“ P1ò߉CBnö l’¡fÌ£´†êžb"Òy±“gÆÏVo\ˆ%'a{Ö:ÐÀÃ`Ä%¥úP%ÓàäáÈg;œ-¶±pÌkÕLcÌ ëAã°pu­ÀºDíu¼?˜½2ZÛméÞF¯å<-âÿ(Š—˜^i ÐQ VÈ›x16;¥Öüe=e3Úö”‰[,"$¹Šä+ÔnåFêÅ ÷û\a¨=þ*ëô€7Aq꟒ ²⣖â\¼…ÁKt cÀõ‡'9DÔ×®«Ûåä)SZ[®`eC݈ÚCƒÅ #ž¶t; Ê­§k˜FþBÕÒ¼qæ+ÛêÊ€ý;pLÔ‰'Àè0{m7R}[Mï/~vɸhÁ¤ Ÿß£)¼Å¦û`£L5,ÝÕÀçHóðOª(®T÷0ÌóÂR1wúXˆXÖèÅ¿ ¦lò\–æ^#äåAÚaYø>FàÊ$,%Z\Ï.ÇNïýýì¨9y‡Œ¡°†„ƒ€€üÓú¡Ú, –&I†î§^W~øª~•Þ¨Ñ@1 ݘßý_•:åÆEîoSš+¡ŠdëÌÂÕm°¹[3Y["õ*ô¡‡.«†$uun!¦+ó7Êõâ¼c BWâ¢ê×å8Ö®éFâ+À‘/!³kÄ3ÃYŠÙ¹Fõ‚œV£Ú´8–ÔSì›åa«}WÀ%ûì¾ 9äaøV—~‚KS“Ù›‹#ÿMõø#Rô£H<²6Û(ñ4BS=¡=– ÿnºð qÝ @«c tùJŽ«5‡¨~»ùÃ2Ÿ5ÿ¥Ñ"“µêTF}¤ ô«Ieö^zH٘숂í®)ÈŸLÚÚGî 5v›£Œ¤E±â70?[wc%¦Ç…Qd«RþtÜ‚C>[áLëËÓ4m¬|Uθ]S~Š• m.¹8³aW;‘F t-Â{ аkAoÂÏR ò\2‘5ÜX À¥R«‹é£8…~©±MtdñšRZ|íUN¯|hXaå‹ö•¬UÍ7ŠåùÓÍ€H$––º˜€›zµAŒnÒÀm“/Ø{hèy Œ“`!ôVÄÛ•÷”›§§¸"v– èHÕ½Ä šb¼®±†½ïÀ´°ãoèSÛWPw9ýÉ’ñnÓ öJ´÷ʾy;lÛÑUÆÒL}zä)ÎCõÅàž»"ãy#Ûu? ;¤àªu3´ÕÿU2—OAh¤ŠýçQ·éÝÉÓè[6ޤþŽ¿¡±ó—Afñ¾FîÍsÑé¾”ªç•eîâöÉK—Ž÷Ü–(snOöXZÉÊ9`#æ­êü·ð¿oŒ¥6V—&û Tc› M·¯ÜšN‘ockà¬Q¿Ë,à!ñ¯Lõ†!¶ÈŽ´³>}g¿tmdÕ¥2錷Ý?玣åøçOU; ÊÕ]Ö;à´‘†/¶E˜K·_˜\‰{dUÓ[†8#¼Ó¿‘[lžaR`ΗoVB™úöè=\掞ªõÖÉÙB#HV™µôH‘‚ÖïÛ4[:bêò­Ã}Êéi7%κExm˨ä«tv†@¸*¯ÑŠbeÃuÎ/ì±ð΢¡1)ì÷á¢Í[BBb¬ˆ·„s5vÖÌŸ÷ýÔR>|¬Ë ®´Òâ![non ŽªÛОWÊ€[VÛXžy-Xþâí~mI…Í%ª#Úy›™ Q D¿a@éÏeRÔ<ÏìF7Ÿ-˜Çð=85`Õ•&IÞº„.Dåj‡™¾' 9\Rs8úιRÒÖ7V…iV–ÂYàüþ‘¯‘ÏçõAùÓà¾OA—È×óú@¾EŸÓò=üþ«¯‘0á~®AkÖ™åuÀW9ºÞ¾ùÃU7CqD¾¹ô±ÈÚUÐè×U§‚;FhÖ­B†”’<’"%b¡…+SËC©–" „ò¾%lº*£Òøî£ßSœÒÛjrv°Fz­Þ/=4`üÀ©Y02Þîÿéèù@ýÕj.XFO“½~cÞF.Àg3e«Ë²ì[@Í–6@bXñ§ÊÚ®‰ž g¥Ðó­®YŒâñ³D„2I™ )WLXUèÃ¥(±´K̃˜0qî8eW#8E{zyÞ0Ùó^ú¤_ˆT¢´6ì´ÿAPl“þ^ñ/•ˆ ì0Ym~W²ö:éh@}X!ˆ¥=éyíöíb•ÿzàðI~HÉQH)÷á¶ 9C½zÖs«ÌƒÒ^£ƒ!Eû?q¬Ì”VfX·u%Æ0ä’O Ä3AûwTú¸Ëkr»8tDz š«ÀeÝŽ¬Gìœ;0òÇŽ2CÞDA9€:Uö©&Û *êiLª˜§ú¬¦àxÛo;ˆ¬²ÚŠDBlfÝš uad,ÆÚ½‡ 1&¾Õ24fíú+ð 85;WõÇ}²7±¶vöwÜ2¡]?Ç ÉVq§;ä„IÔÉòRx*VF €'ÓW’J”Þ6«üšQS*­¿ÄùQFV,îÔÉc/~tÜ;ÿ`¡–Þ,)Ú³~ÒâŸÓ èÞFÕ‹ÔGùäe\ÆíW˜¥[ jZsV¼HêèÞ¹¼fŠ“9Ÿ&¤1økÆyuØ1V ñ; æp’Fž»yçÿe¢ŽŒ4˜Úª:÷tW4 ·Pœ:*ÌÌýgP˜ÎÀ *80V-¹¬~tbø”5b‰¢¡Š‰®j.5ª5„Zú7€ª6T°ŠÅ€É‘Þ‹Xù¹yBžܔaôÉ̾KáÜÝpÅŠŒcù¨ ËëÜÛò.Ñ'6L˺Å'¾d D¯ç|ŠÕû€ŸfèyV² \ê Ì)ç¥Ð‰íÛz!×î}L²&!¡W3•+Ž6€-œü#Úì¯ Á‡?Ü›éíĨ c‰¤màUâ!ÿ0§Ô¬—)s(~’Ô—9N{JÃëµ®WEÀEW¦Рɰ"ž¥g9K"7P(«Ê@MWN>³É%˜ßް#HcZ>"b©ëi¨.ä"AôÙmz Då¨Á9Õ–Íd­V:@èã¶…êoÒ¶7Éî‰f°6ª? CäÕ¤žþt”å=ZùF;ÜÔÉýl=|þ¶äoäb›OË1“*<\1™¾¶‹.f€ÔIþ‚&WÎËþMž.ò~p_ˆ¡z­]ùË’C:þØüC¢¼ád¶ùr(Ûp¾·4È)#Ty\nUú7¶¬ÙãþêŒÏ)(-O Æ ªÄÍV¬²õH[=|å‚ô[îÛÛ}‰BÀ; š‰IX)L=£.źEë[j”kh^­ ã,D £‡7‹©ûè/lŠÙ vŒ|ÖmƒÿƒkŠB¦¥!àG6 £Š€(8â(i" j(žù¼-'<¹Y6˜¾´ñèÒûû[‰1)àMž÷]~Û”iN³  Í¨4)OZêç’# œ»‰+Ò· › L«#ãC‘áÿn¡²ÝX !4À^òKM kIJŽ ¢gÔ±žØ*ÃJ€Èlä«Ì«ÒåßÀ;ŸL´4þw±„à!'2å_¹þ+(vg+ð<°Õ©?ˆ{G€M-.¨&*_À=Î&+hƒ•m˜câ2S¡Æ?)\©„L,âæsBô”PéÝbÍŠ˜±v¯F¹6 ˆL¦Þ·0Èç5 ¤j”¨Þåf‘þ×ÀÞ}!óhˆùÚý‚ „»-wy-T%SNNŲû995‚SQ°u³ú޹ P¡œT¾"T%î`ÈK¯—ö® Ò|  Ò}ßüþ0Dc·~!ûý³6q"¨…u-Å™ÁüùŽs ðÒkû_%uJƒ¸•í3âeݦ{‡Îz1GY»75 ‹W¢N®;YM‹ ½µ#!KMéªìš7m£ÌäïÓÍ–ÄN…°Wç¨@ á8|z°åö…xê~?™Ûø –'—Sj:× â+»ŒWy™ûâåéÅì7Ùë@]Çdg’³ë­¨’ú0U¨…x[˜‹Tæh #Eí®7õ¿t]‘ƒùÏÜwû­«DÿtŒvQWã—º›µ»Šˆî¢ã#xwþ­‘Uéê…µÌóŠŠp2 ò€q&-L”02 =¸œYS핲@Ê Ý‡#F‹×ñ¡0³’vй“ÒÝÝÁ›ê¶æ"GŽ;0:n‹^™" [Ü.L:ñ`ÑÊô~熪Žg=†EªpÐûùeׂðSÛU[Œ;KP“Ó]b#©¶‰¨¥Û)¸’s”°BN;+cÕV:A<Îs'å8k6Ê‹ ,ùÝŒ{–]äólW1qRvÿ#@˜|6 LyûÛ’:#×;iY޹I„;ÀQ.ʽÉÁ6$åý0Û‹÷[wt¡²éO¢ 1˜ÍŒÒ.·¥/3òwàô f(ËÓb¶o¶—£e(÷ÃÀëŽò.ê¾ß‹¤"O ³Ãóʼn™ThBÔÔ^Ôÿk®gx³w¼ƒp,ƒsê›X·Ê;æaçgß±{é5½l’Dð©4E ó~žª—|ðE+8ÉÓÿ1Ý…£#8È#ºbW^ÌS]žô~Vêg S‘8eQa@ëIÄ÷)4ò8ç‚"[掑râBÑ@*²€õaSuk¡[H*F„ØÉšH¾Ò†Æ•%lÍ}ôñ®2‡EéÂS¤öè“€]lÉ,ø>þ-¾WOe2 ‘“n·é¿)dTÃå‰)Tb,•Ôôt$¢U~¯h‹Ö"މöÞ¯Ô6r6fî‘bž6;Ñ=K×4~ëÚ’èÈÎòàš³<ÞÓ–tð8”ht~"¡>Ñ”.g*Šc¬ü ¢]Æ‘unvŠªgçNöùË:88'oa³É¥ÛÎ…-ªB¢{©“x··Ò¯×ôyïïù+ýo†Ò_‹™D,Ý¿ì)šæC‹`AnÛoi€ù¨åž¿hs`Êß7€ÞD·”í9b%f)m˜<&–Rz[žGyÔýUB‘f"<¿ åkŒú“˜w®ZÇ›ItB?ÄœY ¢éux‚“¢&u­™a^aBüÚ(Öõºc7qy6´íùSƒàeF¹O•îBÙK†–ƒ¥)ëíÒ‘è÷¾dæŽ-lLµÐü†¡?Œ1¨Cˆ¾òBÏF¢FîûéÐëtaMy]é]¶C9“ýX(±ü'¯QâS®‹ô?)`š‹¸­ÌuœŸV‰4Íœ"ŒæidB*ŠÖ >ˆáX2»G¢KMž@MQþÔ`R/ä*é ƒõþk«áåó+ã<䇅ºœ+çVDb´Xïɤ”‹®©曬C@X'é~°r»Ô–¶ø] š½ßRÏì”ûˇ¤¤¼ÿG6ž¾7ÿ1û?Ue­•ÕÚ oôÔ0Ñŷµ'‰4Ù- y‡|ƒ/+ö…ú!F(êÐyAjoôYô¾‘QB]‹²râËö…V“ŒÊV¿@ÞljiŽ9f˜‚L½”…fû†&tö¾‹p¢Þ#ì#kÐhñå».¤Z™Õ „ŽîS1!¤æÙBZà“g\Î  !÷Ó ã”ùm–ÈoÐVýà1Šö›8–ÚƒùžÌ~€•«¢ÍîíáÏã[ö³}®žÕôXþ•þú­û+5’—¢®Ž×¼ ™;ÅÖZŠ)óÐ$»³dႃÄAä?3!ãö¬~ÛOö§~ÝÇíLýµÝõ'þÝ'Â|çÿ6¬Ÿ9ÿm·v;ýý_ÿ%`AÉ3 °˜HŒ¨8̯ùû16‡ÿ„t3$ yÛ ¾X<49)¤—*=<¯§éú~Ÿ§éú~Ÿ§é­ êf¤ zÃßñä)m›Sq,a/ññ ä*°bҘϩýA¤@Ðÿ ƒÂ™l~–õÔòà<›ý&®=L¢Ä¼Ôl޼‡ýáé {Ð|DmLË›')Ÿ¬\bA€rê3åòé †·)l»©+ñe´ìäiæ:‘i!ŸAê.‰½h!•Ó Ý8N~ŠvV_-%¸T¬9Ÿu(d’¢½Ëº|)ù¨AÉk¾Èú;_šTY¯ÄÁ踼:Qп•N\X!iu}ÞäHÿ~5 z”ëåð‘}\´[jûçlx“³n÷>Å%s^íùû—õµÜ[Ê_Z¢Ê£)Ü`0€}5óm-A<ÎÎ,þ ÚͺÂO™º)#¿ñüÇñü~è:Ÿ°†NDw½Ô㙓[‰Øƒa<š¤n“hÑLˆ½"•q–$³O9ÇøƒÇ-ýom gZ´ã8÷äÆÞ Ž*ˆ‹ˆ÷KëE™k ŸéO>°²&I %Y¢ø©°&f«]½º%(v¨UmºçøV—î¸K Ø3E`ŸXUc>—öš$ÿXf3=ÿ6J¾”;p‘ÌIþèMq͵­6ä±åV‚ÅÚD=ø*W„yï=“Q3ƒ6Ìwh@×j¾‰‰7bç{; |:`Å00ª´ ÉÂeƒÚ'šv †YÕäDáür¹ö‡Ã¾t¡Iª+š8cŸ'Æg+^ã\Ö¹”72?†¤òù\õg±O;S‘'0ªûû‚h ¯‰‚ÊD™ÏOOR©{ úBówc¿þ³Â,]Œü(Ö”›Q‹º# •wËHý²’Á̯µ¸£„vu#ˆó8~Îí¤˜ýN…öÆèâîoQôA]ñ)†„ xLQk7œ_úe©ûKAkq°Z_ØH©œ€hÂyš«¿azmÄvÐfŠ‚ b\knéÖüálÁÎ&W‰1‰±.t»§s€­Ù¡ûCö97G°…³Æ‹¹ ïï×Ro§P1{#Ló4áþq_Ž~õ Áow“)±æ#^’¢ì® ¥ÄåÔ•û¯`àKOú RÆ¡ý|éRçcÐ&ê (ÙP ùpªíœ¤¬„)Óà\6 ¤ש y¾ïÙ÷C@ª6+.cÿGéܯÂA¥˜â0P•íá¡02|* “Vnª¨S‘ÈþäDT4°ÛNñF.~ˆY³t® bž*hˆÕÚ¼dþÿ‰êê¯O¦ãßl¸F—1C9†#ûaKß‚ŸcuÉÚ’äñ@<9 ýÚ 'µ è‘F„Ô>nµ‚r„"‡•'ow¾ ü*v!Kó¬’P~Î'—›±w %—ý4(€Ñ—¨‚7á/¬I=ˆ¤mžŒa¢)°F#gxôMÆõ›R óp²Ô¡Ò&Ò¦mì"GŒVW'k‚£foöEùé ê«SÚ¶sÜ.Å¿á^ÏŒE¼ž~]Äç° “UÿIW;j5f[¤ôs ÖÀŠçh€j:iõ+<§öœrØêsK¨¼ƒƒ"¦1.«}´=F‰Ɇk˜ ƒø’ü½§Ùª«0b£Ãr稅ÍkO‡ààšD2P–[ÛMÕ<Б' §ß}}ÛrWõ®TC_º.Ó0%›tI$h=—ÿq›Œ&ãw¬Wuµ;ÇÞÎñBßŒÞ TØöNaé z¿A>áG·z—dô ¥`†¦%a0ÃÖβ*pY¨ø§$VYL‘ûµ(Ju9™Ý.%[êßD,uîGýé&ÏÞ ¯ä^ÔÄ¢LSŸlãôšI$ÿ6¬@‘Å%¡î%ö!f- Ñ”¹ø4Ô*†ƒøuN¥RÏïáïp3Æä­sb­¥?€è¿vRÍ…w˵UÅ#r½…̪©Ë^Õ©óõó6„$j#æÔدӭǪÂñ3[pp«_¹½ÉßæPë7MœWš”öXÇeZÉì™)¹õk+‡´¶s£P|ûn·%C-eCùSŒ¦7:€y” יʡM¦IḼ¯—8†Æ6ZàÊv2“¡q½gMKÈe¯yÙƒŠëø©zËx«ˆÙÒ½ ¼c°7¡š_÷«:²yèÚ÷UF2©l¯wX«§nœ-/OL(N£@æ¹è¥ÉÿÙic09’o jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ ‘‚ÿ“ÏÂñ^ÝoZ¸„ iÊܡ܌m¢“¾( dçïW¼ê¯ Ú»µh©®¥²NÎþ³&)ÇW/žf~p5áezMŽi —Àd4?3$ ]vIŒ|¶¡Ò/ç°N7W–—¯2Øf2½„ŠlÄ¿y‘b¢öÐâ¦;EºÜLlMP÷6l ™×ýÉådä¬L AžÌ ¾×ft_¤K&D@²&M¾üÁÕ·€×~=Gôšwð®bH†½øÃ ÊJa¶êkœWÌݾǕ¼ÏplðŦ”PmT›(°4ál½è.ÒêäVœs±ü9TⵤTŒ5t ¶œh-=À|4`(*Ù‚ ‚F‹+ 0w-ýèºGþIëñ”SÚÝ2um›PÁ´À|4@(€ÿ;¿úØGfI ÉødSõRw_­Úàaàyñ󬎌šÑÏÂÇ^›1A (ñ³’÷6–è`˜jÞd\)GVæ‹èfž‘¨¥h77ðõH·4š·˜ £ÑkWŸù—Ú«‘¢m"q9Η~ùód*ü|ÏÇ…˜N½:RŠö·3œ÷‚”˜g»NPdE„o˜ÃÅþØ-OáQMÈ”ç÷ÒA.$BwO<Û^. ¶R´ži[lÄöüû.…bŽè.Í Aj)R"ÆŒècŒz^çÓ³ì Äà¡4£Me÷U&•úá u¤lŒÏλ´ή©7[K”é4 P,J}è2³2%裓ž -‚ZÃa´VRºP/tD±<Ó+¡…×óã!¥•kvNx Í~©.©«³jg8ÖŽ;ê¸èDP€€¦ŽÔ-ŽX3xÞeVüèaºbÔ«S/É­q¯¡®*ï~~Ù¿^¯”)‚öC×"c³nBèúzõ¹H) Þéá¡Jª [ògQÒù7q·§% x3¢þãíŒ0ß Oñ*.ü?uˆ‰«†õðû+:û^ª5[˜’3ĉ‰udÊtWúJM 9â©:‘à2 hƒÎœp¸–÷îî˜Që¡Sf ëÓ¦}¨í\}pí•\µžË;‹¡Õލã¿ÑÜíòY¾MÌ}‘v¾ªd¥®Þʦt\ÕPäÑŠÃç_ùsr¤i}¦A—KïjÈš QcI8…°Wvˆªè­ÉÛñÀR :EŸC¾•ØýÙªb÷¬y, ôs6ÏL0£.}]xìå§f¦õz«˜F Ëü‘'[R®Il£ÆRJÄðz™òßÜ ÂcÂ-±Æ@ØŽŽÃþ )à¾Aô÷Ï5¦þÜÞÅVpô 55lQ¥ ¤5룢‰¥Åœ‹™óI´H>鱉þL‘=«Þ;H!ºüQ^)¡À>ÃC|4àÐæio­mלŠêt0nñbvù A/Ù劻¡‘Ù!AÇfLMöšÔ¥¶B#¾™ÍZXNº”ò¿C“LYÉe&zÌ~½ö^lù5›eTËp¥¤†XÆt4Ìß$Y½`m·½sÙ5ˆÀ>8¯À (.h€F–™—ìu^×ÜgãpB¹X9RgÒgFI°YÚSÿ„k+'œ£Ã9¡kÿx‘žAýCå¡ër½çÚV°n|¿ ˜˜)Go7|we^,N ò*±‘{ú,Õ:‘÷ñÔÁ9Õë ¶Þ½'T//ÏÍr?~ ­>Vîr² *;”- ‡Àj<µ(®Añÿ%‚ ¯?ZèX*Iž=/J V˜¨ÈÞ«‰4v6Åro^$¬W;*YNŸÃ:è壷«æeè(nkb"¹gÏ`ºƒZ< "c³nq!'ó J®Sý÷É!y¹„Šw8tŸ€¡‡£{|émy’-I¤·…ËÛo£pþè…0«2·7GàŒr˜>ýÀy¿/ <Ç*ηºÉ$A”j¾å¤&þC~ÔØ÷>ò„ow~òSòCÉætœï,ñRžZû-Rmë^R¡Pí³Á²ñ0)•wÆå®bwáØ2Š:v¾ÏÏ¢)ùôŸB ฮwm¬i";`n†UPlvæ™ä¨ËGN¹Ö·PéÚ'úJLK}ã:n¯q´ x¨³¢3ó)ijÎäÇØ[fÄì‹.34ÝÕ)–X‹âÍ‹©¾ÑÐgŽ&YÉvìÿ2£æNþšRÀ%äSS¸°çï?¹š²`‰*X%!tàœD_=³ à ¬ñ®¯‘ Q"¢Î-H³ û'3ÀQ3úa¼ëÎè%Ê÷äžYu×%G²×òK.ÇãÃq› ²röÚï0€½U,>žøWÀßD*Uÿhêÿc'ôItt‰ò»2»×kê#¯FüP‰¢p÷wŒ]æejÀ×3êûI,ΔæŒTaÆ¥ªO`b‚퟽¹Ê7)„аͦ¢w:ÃÆ`Q×Ef‹å¤º#~˜ä)–á*•ä`¹mL[¡+á /ƒ7ô\rTÝ3œ®M6ænê×^VÆ5ßTk“ èÙÎTòY{üÎ2Æ7©–;SêYæKÑÆ ÇJ0R.r)b£‘ršHò%Ÿµ…TÆ 7yÃQìÁÜ}b~·òÁÂH–yêÏ' # -ú¥žÂ¬ý¢ðx™ß<ÈÕK³%ó‚c°ql <Öòïû`‰Ö££­J ‘áz]7UU%ÿ_qU„ˆawxûc›nþ"¸ÕÃ`d‰5öföýØ,‹k€A¸!Ÿýñ¬1ýÝϲP…€cÕ‰BGñíGpÚégx‚Û²azm;ã‘cö‹dâÌß ×aø£ Ô :…|³ÜLg¶¡7ŽÅn­-õ 4ô·ïÃÞd¦ 7A …ü4RMàã c½ÞÂltÍ?[Ê\%é ¬12åaˆ²$T9éÊâ j» FØ>e «~QÀ¸‰êÀ“O£˜oP³â¶l¨"\2T‘AÒ«XÓQ#—IÞUüL5ÅÂÚ¡Ën„À~}npB³–ž’Pº<˶šGü"%ÖðäÕe›«òw:|§"g,\fÆ«ß`Ù >¼Z!ÖMUïr¦.ÁPH¾  Ä»¸Ò Û=(å¬eég24¬ !¶:þ/§4 œ²J-µ˜ŠN yÅ^%£6ÝÐüö9,wUoå1¯èü`ÃGó›{¸Àk Iœ¾žFø®øº{Êc§"û¸KS‚«¶%%䜪’œJ;dí¢/Ÿ&Ë4Ð /çZ§ÎÓÓîÁ1)9Sé@tzµFL°»ñ×ãæî)ij>‡»–Œ–Lá¿l:CQHΞ)Ó&Íugƒâ\ù—¬Â´jøOQ%ÚV•Û}&J¦Ã¤>§rèùþ*8†‚?¬Ÿd¼·Žâz84[‚û“³' ¾5µyNœùx~Íy ÑP_Î ÉŒ·ŽŸŠÕ{_†gOéMSHèBCóÁM¸hÚ«Õé«ñÄò–¹0V&»5ßÙ,.`Î òÇñqŽæÓ.¡wâÔ|ž‡«)þ±­Ô´õìbç)Aqê-hB?õ¯Ô -#”¯»´]ʇ=[VÓBчí‰^­!ÃȵÒ)w‰ /v|e»’B6I‹­NÈî¥ä&$FÔbÚ<óáÏÏ‚öXs¶ñk4-ã¬>*5çmrªeç„6€v¾Óc[ïTV¿ü-;5ëŸíç¯è}¬"/²NuaŽ?ÞÒY­ÃSXðÜâЖá@@aÚƒ…ØM 4º;÷«"ªfks¦!ncúfbäýS4ýbáäÖ¦"ZtšÙ­žÚb¹ê—Dêc2Fu••¹0£¸”ÞæáÉÌßc.)Ýæ±¸/­¤² ÙæxÀ>¦äµÀ>M—…—ß!Šä ·J GX|_&©S({ûóT’Wõz<ÜÚ²o=Tn­ÐdÕ¸¤á{ÆMôòô‘È*W¤ÕS[²ÁLùþ ìaÛåBë±¹žqœÛPêÝaÉîlŠoÆÒq–¤DÏØV…×N§-…àúò¨@.ò¢,Ç¥ÇÎK§Æß©/a³óÛþU-¥[¡¥£þ´ÀàsIÄ=@’[ŒUÈo"¢>w¦/?œ „hÀ@V‡°Ô`,=*Öê£`Ú«K5¹=é‚ú«ýÀ|—8’ÙóèºýÙÌë±) ÍÖÇöÖü×à¡°]ÑD´kÑ¢9ÿ—ûX 5Ûëüï ï^ž ©3MMlÐT1 wš5v*‡•D—,(±± ×¾ôTE9ï×ý ®½èÈ"ý"5j;KoS(¾EûS¹êÒ¶„ÑÄÒŽ³òã(ú;‡€¥û÷¦ßšSsú.0^ùñäQMðQluôì^Ç©^{³?‹³+'âìZuzWœIò¯n¹6ø‡82YóµgD¸ã¿pk€œ<Ú e°î_%z˨XžA/L™"Åôï ²­¶Q\ȶÔøóŒÎ‚¨85y üTr%ÊN$÷Œ¶qðárHe58QÇÃæ•_xD¸f1C…E3dòŽÊ À2áWC’ºWƒ}§u¢¤èÌm-üa&‰fÀÛ¨ •hÀæeäc :¹ÆÚ²Xc2QBɹ ¦÷W™—ëîß”TêÇáYOη‡áD€%h|Âs>×M/¦œÿ‰T^¸@kU’8zˆ¿ÑtPÚu„Ôø=H‡‹[¯ $'>S¥Þÿ:D,Hùˆ­yø:pÌÆ‚@iÚB¸ºµt·¯@o»ãúšJüµ‰ûê¨ÝcÂÈÌ àcc[Ûø®ûoÿ2°‘÷ËrdHf?üýã/îŠË\sZ ÊKL"Ó?Í Éç7’ænþkï$K8'¼ô©*Bj°´W‡îŽpƒâÇÞhm“$çzŸ\T7àsé´ ñP˜Ãò«5Õ]e¹®œá¯ãvƒi×Ek²'ÊmÙó>mп£³«ï ³æ.Uþrà½Bò²€£‹Æ"!Ë0fqbD¹ Wú·}!°F¥ñ÷ËTÃpûÌÿNÛÖŒë=·CÞ“ÑY•†äªûŒ\¬‡ôF e,ïª$AH*^Éq9©×PL‘÷#¡tgR…Ä&Ùñ|Û_Hüûêu$“…’@;w`´oægM‚„²n‚ßÐëœÃ7ût„I>%é16ö¼Öeý¦èd, ÝáþÒÃp7Ø/¹î}tî‚÷O4 ø4^®Ð›^ 7…°÷"›u¥ËqA Ò]ʧŸÂ…>ºø ÀŽ;§û’öc7áÙ'$¼ó™ý¿tRC¨#ª“úÌ-°2(?‘§Ùæ¤ÏÏÙ&~~αùû€óI€Hº¼í¸ÁXþ;Hæ‰Ê*ÖÁÁØQäÜ*{¶¢ XÙŒäÊ0ÿnÉ`:_B³wÏ”£bn¢âC9_íµIÂ¥?¢\â©•i½)Ÿç% ð&¯ä\:{$¼û—S8UVþg¬p³Cí2.YÕk„¾­cX;ÊDAdE«m;\8t©Œ6wø’j߈$®ìJëE&M ~ ¨—èMÚãМ£7KCIŸo£ªAÚ˜t—ed{÷­EÔ±-ä*i³È· 5ã Åso®7¤§ˆ!å–xX·eÚtUÑu¬>ÎÀ~»ÕëKOÿC U¸Rô³æLô…B1¡ßºaþÙùHü߉GE¦ØžA?)AÊ~Ω ;`….6ŠÀ WÐÝ‘|1$ñKaö*e*¨ÈdÛœ+…ó;ß#ÝþÀ…›²7áÔp4ò¾ˆì{—ùHúõ ï³5¿ò‰ cÿ€üGá“k¬>п>Ø;Âø~€¬§sìs¯?ׂ‰&·ßL&¯¸ã­þCì%3%¼Y“ÝÕo…ÌrNìhØ•Ým¬Ð_¾[Ð/ ÂP×’ÇeÊç6P~…˜O0¦¸TWNÎδA¾µŽñ07RñG „Ø»7Cˆf8‘i!ÞÙÓÿ~Äóš°ý‚øQÃÂëÒìg3ÀôíIÀù Ôé s)¼…‡Ëe7?f3¥GHzJ/Qª„öw”ÜìN$`ßÕï«Dq$0ˆÈL/™Ÿ@ù™§Î$ÜÐÃñsÉHI¤ÂíÎ*è6àûXÒ™Ù0åÝ>'b˜óž—8+åˆ}²xÂ’†Cë.Ì:b-êTa¡Ý®Ì]cØn«]¡‘ôÛ*Pн1OaA>ñ–ÝÝ{*ãÿôįŽYðã*C`®‹C~‰©¨GüÚ:,Žf0ø]}NÜ3?õ¡ìµNÉ %[` ]É%¥!W¢ÿ@ óÕI¿@?ªÎÕZù:˜~é‹ R+…Ý@ªÙâÅ ˆª'dWÖuV zíCxGr‹ñçŸóЉ‡»¢æoœXâžpß®…5 ügŸl7Ö¿·IøÅQ‰Ã1pÈGqC´µs•æJàøtŒ(}99«g5ù„$TÈ ¿b¸´5—vs…•“oÏ2Riw?äG‘6©úüñ[íz#F« ~½âÅl*á/QÖuJ&Lòÿ9=dá«ý¥²*˜YÌIy›|²Ÿ/Ub’ņÜ6?+bNMü›8ø2^\ï¶;‹‹a!‚&•|ˆ³Î+>>êRLjšGÇLlÆMÎyæ;7­YJm«tÏŸ“õìè~› )[¬[Ëç—Û㕱:ŽfÃ¥k¢F<£¬˜¸¬T8¨GÝó†%b¹^Š}8_©\Ù³i¿¤®'øÅ„uÀF]ž‘¬mX-`ó¬·í3-×vÐÈ`tq…øþ£;G”v”gD›³!£óÏu50DµNfãàÓMàƒ úÃP{4éÒUÐG ¹/M„;‚[TJ¬w÷+Fð´‘ð¯v8O²W™kÇSßTÇMœËÛ2vxžæ5x¼¤þ‡9 22§iy;#´ÜnH?(9¡½ÁÂNÅÈæÇޖЉAè5Z FƒoÓÝu/2§p{À»‹ FK×Ã/e§Î+¹bòš…6¬ÏaJ(®€•õª-ˆ[Ö®§í ¢FЃÓ'Û„ï¥Ñè4å ýÝ» CêØwÊùÔP;hµªFwtŠxŠk OÉì}sãúœËqÞM Q3hù»óf(oò¾/¿ˆ\¦J`ú aÃgõðOLXÃkH›P…M»”7kÃWõVn á1EÜn½åä ûKíyK6Ŧj6*nj}ª§RT)^fî:a/︽àžMµpgœ4—8«)N&oézÊÜl‹Ô‹¹~žj¬OD)}ó7$—Œ‹¼´ÎÍ‹ñ|1s–†—&AW”[â&¡vRn²°aRQU÷ŽE™è‹È¨ÒIS•3ïæŠ–ÿ‡r’Vþ?nPi'çCJWneû ’HâôQï”l——Tôƒ±ëµöeJèîQæä&䨭(E©ÁÄ,Q¯ÈiHO‰-Ú- _ï‘ÆEwxÍtŒkÿ ÁX¾8Ý=£‘¦<¿K¿O ÞŸ"ÿ<;0´ÐWžO$©Ñî¢J[wÙµ'F“Xûتtà}ñ·)¼énÝâ„k.tx£Â<~­wh Owµºq‘o‹ÿEàT ‡sÐ!Y£“¹b8๖z¿šˆ6A'œ\› U‘Ïgó‰"–àÌÐ-$u‚ªwÕÁã@’x™ãr>¬ 7@ Õü› J¸5cÖ’ò‚%0‰¦˜À(Zšb¿·<”Ý~AüÖä%Ìû•fc.¢»»±ìØpñ5ýâ«—P¬É½™a©í&x*†j;ËMAÙ mQ.¼ÿKTòÇ,mˆ£ÙÇ<ª7<=â£mÄ>ÂÚáH—°Â‘±›› ÇÑ¥J…–Ù©Þà÷”©´øâOÈmrê ÷ºô•¦6ÜûK‘ƒuª4êž‚ÄZá°rrW¦p\=7l‹^/çL› 2Âxc¶+z@±q^¦ö Äu):ÓYû«Ÿ’+AÓŸ&6%+[Ó£mID|i¡}9o¢¹³c:›ÛÝ„$OqvFþ=¼èãgªFå1 ø1l ?}±l¢©ÓV¨$>P&· ñzŒü^n±Äw)‚öBªXæ\äꛨqð¸6†œæJ½ú6} >ƒ@vè^þ¬iÆ¿…ü$»eб;tVÚ ¯…39-bè™èR^8ûS ‰,gMd'öð4È2Å ÷×H!|.šœ"ˆL(›éÏÏäËjç@Ìç‡Ú (tr›dT Hx“âœa€,-õ°ò ]Aq,b“zÿCäíÁ_vL/s0˜ä …ÝZ¼y»S¿´½ÛÒe“O,€­2ðDã̽è Nm“Æê¡Öì´±³b$:(èDta;Ô"x¤ØP¥%ÊM ÔHæ›ÃA÷¼Qm]‰»RÖñ¸oªO¤1Ûñð—É‹<¯e­ÔMþDÅJâ½É JjNA6±¼»>µ[oy…AL‰q „y®aüäÕå]ÁWO’ì1ßÜYN­PM˜Êh1hÁ·(¤»{Ï4X ù­¬OfáBoéé´ó £’¶ùëæóqLLhÙÿ>ÎDœ¢P˜ë§Õ{×<¨ÀæÿÿB;ÿ&1×cÄa¨Àb­,ÖVÒgü%‹§¡fÍçÍÕýºÆEêÜÕ÷ºhÞCȃ¢û\HV\ú ?óa«7í«bÕâî!WA»QÔpc͔ܺŹ}VýwÝEZªàþa·ËÄÆ™}LÎñ Ü¿“sUë òÉAlÌöŒ`@kRœÔ€ $yZ$}b¬xþ®G¯$BbqAî­éZ9<¸<Ó~.ÜàÖ@ÀÉOCÐÍ ™“¤5‰ŠöùÁ· #>dC4zIµÈâ0¡$*Êé¡i¹¥lËëûô²¬'t/WÇê‡UÙ¥¤òÆ }\äs셱˾*ô!F3UŽÎ ÓÞäuÕBÞoœÚ¬öÖ6_kÛ“×–žêø~1öôEqúŠ6 þY‰«í¡”tX‚´SçÚ¾ÕÖVŠC—R%<±~O›òjVÇWeƒ»zØ*Ô“‡f»@ýR.U¸NVA"\tñEÑ“¼}\TèVئi¿aÅ=ÜZ1¡£ätˆR©eÍr€ j¹®Ä ‰U¦=Ð[¼‚Ÿil˜g€gúÈÃOÎôgñbé“ÿGÝ-ªG¡³n/ è/ç>†2òÆ¿&~•ÿO«¶ ’}• µ…½0h7Ã?@ÄK(¹Îï=A8Rde“=€—û¹žŒòî;T%¨BÁKX³·›è¨qÜ[3S$@!áóŽ}ûžsXå¡ÒÉtÊŸ:Ôå=qeÚo—«ËØB°Í%0Po|ѣÚsE8 ­›éØw²Ä~ª™q$nfFŸ/4>é{¡^C‘2é1Î)ÿ} œÙVw†éL¼+§Óš 4âCæ«à©JŠW²úšg=[1Ü’”i7LÃ'õ»sƒxµ}s²VÊY¿LŒ‚áÔ’ß-qÜ´_W”ZŸ˜…°’ÀtxWûè ßhUVøæªÑþç˜ö!Œ[CRÌ‚„ŽWs”'=Ç^ö,m`Ò÷!P§óùóæîË{ÐMV¦ZfÕøØ5O­¡HyŒo¿ö(ÍÑÑÞ³…]©ÕDsjrÄ?GR¢Rð©k.åïô8¨+üÑ«øb'%ȵ‘*#õÈ¿D}}C „‹iÐÉÝi}áá`ã_t#ÊÓNåytú'O›à ¤û;?æÔ÷’&më[•_UÃõ©£Dè]2àã ~ReÄî—ÖìTRèÀĘÇØsHs_%å_ã§z¸Ÿ >e¼P˃Õc1×O•f™ÄÒ,4á9½¢£$¬ÖMçhOÑhüߎà@„šÂfž±òÒã­‡ž²-„ EK[k@Ç(ãì²äJ©B‚xªÛ[rXxg͘¼F€Kãw颸‹ë(¦*j!C›çÝpô”ö×GIÝÿPºð­Ãwè®X&±^!M+Ø®â-†À|¹¹rŒåºöQº fœ úžþ7£³Èj®½!Ñì¼{ L•¯ÈNkJä‰3Ï4k3>ÇSîš%œ¶”mP§ÅìD©Ì,ÊÏó¨ gßÍ®…¤cøª£„Ž{T‹gúÈTD¾¥/ѯ¯¼ö÷úÊXeiž´ù˜=^ dYšgçþÝŸ v—èn|E>!y%ʶ3£€dá/Ó—e EùÀÇ•QÁ8°DUmgßD›¦5Ÿe%:PD<ôja½…91`͹¥°Aª¯p\¹ñ+Œò·°"»M¢þ?¸`’»åb)ñ$›¼+(bŸÇÅpi× C3 CO16³ÊKÏGš÷øó–¾ÆŠ%©'Ÿ(^òE ä,»éZÏêy%0U_ÈgÝ‘z“›¢ :k’NÑö °:ÏyA4¯Õ? %Ç«³>l—v/Au5²tr²¨Z>úâÖpU`¼jOå‡Ï•Jó0‹"B»”´žƒå‘3(ø(©múdìüñ—Ä €– õ·cË˾§þ×ìÌÔMŽLÃð`;¨»ô g 2»TÔš6"”=f=ÙRˆÚ:Æ”·™¥ŽºªAÎ Ü‚š§j?¯”P-#³ž­‚2ç‡άLÎ…#ŒòX2„õÀùû+çì,ÏÝàð`Ó\¢!_éïÂ2{ME)kšcz³zÍ9'¬6)Õ[|ùA°¢ËP+\bp¸çz2Ë[ªɆ¶ú+r<Á ŽÉè2žm—o²ñU¹V_ê5Ö}†éKš»BQL™Mõ£yU˜ý–>Zf™X­1é¨Qß‹°Ï“ôj‰ÄT îKVˆQûõÂK-Û°h¿ÝŒB·W.~ß ~ À*3à·ï-'z‡²úhù»Í4Á}qCy±œgÅäe—Í 7±Ð^¼P¤ˆ§’–ü±ó4{W- ”• tq;\†XŒvvöÛ*š{XÐ×À»pÖ€;ü‡ënTrÌ2JgK•ÛÛŠ«í› €W4æV® ÿ-ùRÏ$âeb’4ìÛƒÿoPÂà±£øŒ\p†‰¤}Ž ~-iœÇO‡ÍßÞ‰.ÑÔ¯ <?ot»]ì.Ϲ·#s|b«ˆ“ô”ÜÑF3ki8£ë›V€ƒ;àÌDÁ¢éO\…í«CnoT'nÙ5 ~[ôX~1^¥0ñäëˆ*£S0NK›©z=,TŒ ÑÉ›‘j-uÚ œâSOJpè´è8k!W8Fìau–šCoÜ7tÃ$®Zó%(óäÚ†`Ñ‹B†>"’ÍÀ]ðÝà˜šÒÁõ›Z*7â‘*ôÚÔ6b Ãuï¾Ûfn7À¸cµh~â#é³r 1}ÿ(–"0¯Ä}Ÿk¯™L/Î ?*ÀËåŠgèÁšÍàÜ¿áÍ ¡‹pmþ&5ÀýqdõÝÅ]a%óÔu@ÓO³ØØòmBë[ƒxMËÿ+)ýú!at×»˜2’$QcŠ&„òH™UöìÄ炤æ÷XõöÒ-„\'‚ÝŒxl%o Ö—–ÑÕÕ²)#f £M°mpéâ Ç)Gß±mè’z<2Øu×’Z¼¶ûCݾpÅÝ>þÀÌ“öpÏz0ÄÚbó)cO`Sé*½¤ÃUŠ«L:×] 4£ø3ˆ×‹Ê!3—-ÄEøM¬Lü(ë¶M²ÁýݲW¼ÚAOĨŠJÇ=kÿJÑ9ev‰RùŽM”µ:¢;ÃGe¥å zGѰ¾DÓXNj¬ho›o`}K ?ö8'©`i+MéˆÝä^?}`£J&/Oî[ÚL³(H|l).Ø­å6‡Ì@ âÔ’?æD=ÊÃZw'¢HâTH'ˆ#a RÅ÷yà0¬5æ—„~A$ @Öå5Ãyzh·,žA²ò­… íEƒ ¤£¨£-‰šÇ¶±àcÝÈ6eZmƒ0ñÞDeê»ø"=<ÐyYÙÒþ7(˜d_OòS>Œ+&Gq&VlƒGîwq7“ðØLªˆÜ81) üqaáàÔÉé/ׯzÛžîÕ–A&’2#£Ã\ÆŠe8¨ù«3¨¬ÎSÕ¿FVžÁk,•TØÝO{À÷¯Â½¾}jؾ)t°üŽóýЬœdøjÝÀ6pïþ^üöÇ ž\*ÈâÌ{&KT¼€¾PB˜€µ‘ø,Ë0¿J\"´M”éHOÖØmÆï{7ñ6 ^$švÄv(„¡ã×eŒÙå TÙ.ž4{×è(€è†ß†Ò's•<-û à›QˆP\J鉑5HµåZ=»:껄®®iâÆHºmXõÂKÉSñ§ZH©7\‡GÑ·ÀùûIçëÌÏÞ ä´,  YX €X* 뮿/ ü¸“zè΂Q ÅÙÝñ¹OR!—oTäŠÿOÖvèÕœñÊp{;QŠ´øÑ/Wj²ÐUl–@eòJí;yH:@°+|ämr{n½þÒû£!kƒ-ÀnÉë’|xŸÈ/ú@‰¦í\ŠÍ6F@ÄîÝÂϰáP vxÌóišìü]/doà{ ÿ@„é‰îÔ¾ý}ÅœZµnŽh3å;ÑŠ¤— y5“‚_Åb<ë’‚ìUï½CÌåÕ¿q 4©¢"³6/çaÅn¸À2!jàGƒ9ÏçxçðRîwzG ‰ Mî}Õk#_òjŒk'äÛ[Æ ÕÔðHÌÃÓû@…{êåcpRݲ…|’({Ê?C»ºh€Ñdv}ß±aST½eõQÆ3°Sm¥¤Ëã÷(d˜µÎÑþnªa¯Ùféî½ lLáôTm`–adÃJ*1B hüª¿ñã´FRÈeÝ¡·„[#%¨:xNbàÆ%½£û‡3ÜÚÂÀá»}3áÕ~›zLBöC‡£ L fC†bã¹p½ÒÖõ#¬M€EjK×ð¾9T£ÄˆÅOÝ“5gò¾Àrw4øçŒ>j‰d†:ãj<¹ã¯!tåAS!5lJñzM«¦‘tjÚP]ë-Òòó˜$@‹VGü³„ýZZÏdÊ“#Î[TÈL|{P< ¯¤í0¸~czalÀ]d$/w'JmêÔÁa"0~)±›%A4T« 'J¦®?ÿ{”ð ³C1`oí­Ê ka¯¯¼ãvç.š#^jª†‚ûÏ%ÎWU¨t ï‰/˜Ò¨ÂlR2ZÎZY¶Åü÷tç»n·VÌ´õ":$I›ó)ÕOèÂ…s@ ë&² ™Ë¾ßÕ¢Tøc„&/ƒ²Âº„p”+ýï nlÀ·MNp·*f £¡Û‹ÓIDx18‚LðFù„Iw{ž°+ŸZˆ;Q·ã’ÔÆÑ®É;Žù`26hö¢5:ð†5¾êá‚pØ.‚ðeò794coÞ06þ½n­ƒ™ çdÛÓ+ªdhJÊKN­[ìÆ d?ûÜݿϢ5¶çœ¢Ðh/¦¿åñ6f™=|ìœeòÅÿ‡H"ƧèC5TÈ‹{ÞGW7ÿ ££ º5§7ü½Ë6Æšâ(¹]zLK"ÉYöc)êic.Ç’™ºÙ581iùYœÿhƒòwB+lx×A8DÑZôƒò‘vÏ¿§ŒÐ@‘y«¸e;~â_…ŠÓÈä„g—o¶œª xɧ]ˆ<V ’_2L¹ˆì9ÔáÃÀ¨Ö¸ýíÑä⊪Á/ˆ‘à¼ùœ×¨v«íúÐÚ|•ô&N=ž0v¶¬‘Õì“'9dí´ë#¼Š S3Ôæƒ¦pŽ8|~¡ãœ×³¤ hí±°nâ™:æ>4`“½¡Ì1;´KDËA$bèx%‰ 35dÏPÆ6…fÿ6 W7m‰\ÒB˜ÇâP~]t±ðlz’Œk!dž|¡(ÙÉ”›Ø`Ò.”Š¥ç/n¸qQïZ§Çá±Qøk4? Øõ²k {˜©Ô£åÜÞ<”=ÃŽCƒ Ðl7Ìù±…œ®÷%R6¢…ùTüðè¡U¬o]`‹[¯žæ¾É1ÉE´s›‚¯QÐi‹ž:=š·Øêʪ>âQ´è.Šó{KóÆÀZוXZÝ~Ä©\al´Øû7¥¸U`r¡õF§LÂè4gMWÎF£!•¬à„éÛÍó~Ä[ÎFAMOÿ(R•¦‚gœ·; Ò!ü ¯ æYÍ&^:‹K¤¢Óò¥H¨fu_JìÈãý·T%Fè‚9–ŽX͈¼¼SÈ@½ˆÀå_,Á?§dA£“Âr²‘¿ÊBk>E¾û\wÚú¤µãc7Ng  w”%]¢t(°ÖÞôˆz¬è–Ç82‘½¥-#7cX×÷ÖÀ­‹ùŠŒÐÚøÆi$9j=ÐÎS žà;)‰+h :Ç¢Ó¾¾\t¼-É)G[掻,×e‚+Œø=v@9o~Û‡IP@Š­»‚”•ÂM»Úm ±RiLv°3A}„Çw„EÊQÍÖ… ë8u‹Og;QrÐ`]†¨A¼}k“Ñ»;NÏ^ô„o—‘ªåHž]…Óò»ýü`Áª±F£ thºWƒÇe¯PË¡ ¾¤¸ôía7?Çö@ðT•feÎm.Éê7§ægz8^Õ\eï*_Îû±éJ"À¸ål¬ÔV»K¥¬. g¼9šM3FyO¤žÎ<2d@ôX¨MI â‰w¾ª 6J€LÝmËÿMwhâ ÇžAqîˆÅçßn‚œÚÊ`_L ¬!IóÝ>BšÙÛÿyÐk™<€í±O0¢Òì|)d¢ƒÕ+*Ѥ¡ÆŠ÷$xy <»†Ã.}ÇêØwÝÌ ],’²«i0vJdÑÞ/R&xϽU€6@_ÄæxÚ݉$ýû¾ œâ^<1|O ñ‘¿Ü“m¶Û7ÈEk6SÉeÄ0R<S”A}Žõžƒe¶ðqæ}0MC46²‰#§Äd—±ŸGÍd!vÍF¹pé#±×à è“2æâû} /·£Oáé‡ü=ޱü=?‡B¿ÃÑoø{9ãøz‚‡£ðöuqÒÄC'˜ÐðøÏ,ÚW33;'|R B˜jðòŽÑ`ïÕ¿ Z¬ý>ÖI¦^O§×P¦Ë¾aé'¾“8“†@œËŠú×jÜÎö¨÷Õ“K­dÈQ¤“\ BèmÞµBòȲw€‡Ï–»Å´Æk‚PñËó9È¿@/.f"­ê˜ûÞà\&_†£RŒ+ÔÈP.,ôÒJ>o7$63JHÿ·êÍ»Q…äXï²—CÇ2ÐZ‚¶Tm2üဵeiÐ#í„—Ÿt\ÍMv_¿|o³g x¼±ÃºÄMÄЪ4Ç¿ Œ¯/Ù¼DÓ¥Å̱'nr”÷:3t™æÉÓuÃYt28’QÏ­ñ›%‘Šöp²Ç‡V$Q­8˜'†Fz'œ6º×²,…Ø0Iîí ©‰ õ7%"IäÇ{2ôŽ¥ÿ>QMÎŽù¤ç-è.ùbôû¯öArœ.0|Ø}½§Ÿ?<šÊèSÒSü1 œïÁêÆsÀS!ã#–À½å^¡ å®ÊmŠ{5c÷˜h9WoÇ4¥klŽx= …<)¤D3 hõ¿§à‹™oã²ëL×ãöÝ;ðh„] H Yﲿ³$ä #EåÀ”þèÕ ®ÛJŠ…âm…u|æã.°º¨E¤å3”ì™/™ýëÞÑí/ä,Ò€­[]س/BŸa ³?G*ðñËúóJkÓ3OåÍ&«ŒúˆÌÕíBfîÄù ìû2Ðþ*ÚϳÎÛé'aÕc}ñÏ<%mxÿk u3ZñîüIÌþˆSs½8§ÞÍSÜ÷)°DÑ£oÉÓßïƒ ¹:V—vqÌ¡ «„írh™ E-xcµå-þ[»Ø¯ÈAÚ¥íלê/³?8E´B¡æªbË?§ôL~ÍÛ㲯ß{Šõ“T¢èä:|õÅLrB½`¯eÍu]‚—ÝÅÈŠŽ4ôömEÛá '¬ãêo •\©*³k{< ¯a„R»?‡…¾NMÚ³9×Åü!–a¢æ7h &X± `µj7“„ã„ó¡Oó¢\9~'Ïo¥˜sá“6ÍP`*Ä’Q®½ÛªM­;JÊ_`¬ñÔr-‹óXÔ‹$<^†×þtýJ\ AÛ<Œˆd=þ >Ì”„¼GÏoQ§/n3Oò£2þ`-þÑ©<øà=/¨MöRŸ´çœùÊ_flÊl–)è1}pÎ^4 ‹uíz ÎÍÅÔ—-Ê05ÚŒáñ 3É™e‰H]´@ìÔÿ8êšUzHn…ü° ¥«·”@1‚rpDtví^Á‰[ËÜã ƒ«^î>p!ã×Å`kf§ÙE‘DöþÛ¥ïá9OëÎLM¹±Ñ) DÞ”ðàDÑ'^ä8‹â=Q, U„ìü f6Ëx÷3¸<#Fëcf X]^œ’Íx?œ?[=Ë#l²æ-WR{àÞÐIulA©eÔj{2˜Õí–¢«Z½¿Má‘bzf—?(~¤Ô…Ù'ð( DME0jßËPáÙb,kË}!÷à»äŒ¾Møà{,UýróòÙïÓT_¬ÊLn'¦ÍHVgTÄ~$ª¾Örb$Wþ«+êBdEÔ§êJ½ñ˵ë\×ípq'A¾U÷™ªçpmãSÛõŒÒÀg€Ž  5zYeGµæsiEa?£f¢/1cˆú¼_?ë0˜Ç—6“„¯gt¯V怖¿vËÀØø ¡KÔhA*yZ“| ¤Å ††”q6Y ^¹syæ Bß­; ñçÕþÔSVX빋yk‹L AOkÙ_ºjÓûšÛœ$n|¢Ó{[š0‹¸  ;Í©¢E;$TRµ° ÎUVÊæè³Åmʆ¹ƒy¶»s_büŒ;ç"`ÇÕ°¸­ùܦáH”€ê'[4Aè$âìåû‡Qعa„æV7ÈÃL ½*lî%«‰a’zÀpî&>¬Ñ‘7Ó&¨b~hÌVxú>^/ºñí0ùƒYhÑ#0x s1ÈJ«q`ßVü© -S$Ø¿k®Òçô¡¨‰0À9í¨Ó­Š†ÙF¡¯é1JÕ/A°jGßÈ)q÷>Å%sRŽgÈõ ­E{ºÐÙ»Él5¬„6R?‘²¼€è»EÈÌTüõîN½Ló^!&¹hÛÝÊЫI/žÛ/{ÀºÜ¿Ñ´G¿ª’¶Ñ&:¤‰ãI¸³óvØGû†2BËHŽ<Ôíl¹sõ㦑ðú*+Ø— 6‘”Ý;ó‡Xƒ˜•ÖítOÙŽëoo¸7Þ^ØÅØ™cÒ(b@yÌ$Š]S¹ä³•Öâ)Mrà^o"Nè«×ÜÉÁp1Dtg{#Lˆ¯?˾ã5xF*¬îc;~jŠ=é]H`1Óßâ\%èIíƒ-ã3'¡ìçäÑSQêVýO† ‹CŽHpL,Ú´½`,”Š:¶Á¶0ý |l,çm³O7þ ©˜­Øÿ"’„6ANp*^ »iɨ;!ÂSs%ÌT„S?ª^mÔ5K¾Z&žÁû“*km-:Ÿï³ÈÑÔ×-åsÐ)LŸ)Ê<ÑœJÝdPÈ»X»LÁÃ;z ©¾¥ÔäÙ V=ÞÍ)¢`ÅÁ9uÇ»²Oœâø¦ÊX:iwÙÕ²ÈöÄ›Gþ…yð ä?ÎAðWP¼þ¿ç0©0©a-aï¦á\?Žq¹jõ Ž÷ˆß®V Twà •mK$%Š&ÒØCÃp±bš3õ@}úX²g«±òmµ_ ,oÎP›Ý´ëfrMÜO™T\zL|Ჩ»#„Š‰ÔˆâKÚ}’œáònÁ—· \[îÛ,‹[M)f¾·")­Ù™öã‰Oî‘k9Äú¾g~Ôõ ‚¯Mêfº¬x‘Qk‰ðK¢3pÇöæ¥õÀ\4CÖ"…F;CÓ”ÆâAúþ s­Ÿ.,~jz iÓà…Y,ùÞý{9Œ­3 “`v‰û‰ƒr&Õ|+È©w}ÖÞÁ¢ÝÛU«,ûN£àx€AÈ5ÀÓE€G„óœ³^«ÅSEšDú+o;„»'¥Œ0†Zá R<e“†PfjéVw6þÔoš “UïØä×*>Âzž²]¼FçÏÇ4Ràûà à‡Úû¥ÜCá–{3"–QB`¢g8çõ«?A¬öR¼®›£¼³?ÿS[Yæ²9Q±'vhÞ °'²¬ÐYoÙ„Ã4m†+jL­‡Ä~ÀÊ“DœÏ&ì”Ï$XÛ^RÚ1¯2û°J¥†w¿Šã¡ØÔã• 0¸3ÏRÿ}ɦ’~8çIî%'ï,:Wc®Q™»2ÏhÔ«tþL次ª¶o‘<ž0' u¯’ è’ª¥Ø×%4 ¹t¥qÄPö¹Ÿ>~Ú1W¡Á‰×û,¿Æ£TË/Bk#Ã[4ÿ=yª>POj áDÚªœ¾Ð/ ˆw‰Èñ‘Ù&†ã¡Â}¨÷‘ϼðä!ÖÆÄöBâ¯Ò²¯Sû!.ƒG¥˜'ö³'3•õHúñJR噿æÚ~^n~‹• PYU9œ¨ý¿YR¤i-±®Bì€ÛYÓ‚ nuÁàtþpÙ¬—m¿‹Ý*Hž»PÄʼnÇ3àßíÕÖá –hä¶t‹4ÐrBŸ™Ð»ýžB‡ƒß~H®_P¢æ$++N¸kÈ”]îÀÙ?%ƒÖŸ þ”ÈC×}ý_ëŒÂ$$Á³(?ú„Ð÷¸Í‚Ï×¼±­ÀÂ!€¾ýǵR&’¡P <°£!ßÝÓ2±ùñLb"ëe÷ý°6¢~±­{öŶmŠz˜{ÅÈTæS™ÿp'@v©ÅÝR×oôôêÓyyå‘w'ѽ[põsO*âάý£¿`†|%'!;ƒ Ö…Ù÷­4TûJ²'\¶Z÷ Rm–þñýLb°Y¾Ã–­/%ˆûÇfssªrÉç›!ËÁ\ÝÔîŸ8ÆÚpêzmšÙOzKx*]f< ³a.—F.km4¤ÎåÃHBB ™*Ér¯< šLÂCK±à"YÛç7Ô—ëtƒ—«áµFh“«%ýŸržgNïæ´:B4ýB‡ -˜÷Nøz Ø fÊQh®ü ­µØÍ•I|õw>-'@ÍøÜŒ¥@ô°U:ªï‹ƒ9‘aß¿Ì}0€¸måŒXîˆ,Ú•ºúpŽ¿\EÅTéÛ› QÆFø$¡AÃä•iòuZÁs¤nsˆððÖ½ÓLßm6më8zÀóy±r…µÂð²o^V˜Ô¾â滸V–Ë7°jÖG -ZP;´¼8 Ô½/Îñ ¯ ù÷ãUtî[ÅÎiù,GÔÀ:_ÂUzM?mèÏ®Äñwá±erd)>kúuÄÁ¿Y±ËHU‰%ñÒ¥—ÓÈÚ&ò‰ôÇ(f Çåô…ÓúJ>Û›a×ÒjÒ›ÙÈö±5@<åa ÄE'…KÂâ$Çä8þ˜vþ7¿ñ6àŽõx>SzÜ,°Œ¥KFækþxبEµF1ÎM„t¿[]~•ÀÙA=î[tæ>Â×H­}°QCŒUÄÂé×¹œ·ƒûïrXöuøŒC¶ùfìöE­…³;­™UxWm5X²eîA»Ëßä«äô­õ –DNXi7ýxå Äö[öaçÝUãuv@„öíug [,°¼ÏÙìPsûòøõ<kêì<ŽI ¡ǃ¿&“=öébuíuU"§áH:€ªÍò«’ªä¨¬ìbL/x؆·3Úÿ-ÁÊz_Ê?ñ~n,­ýÃOD (œŠ•–—S´Ãf8Õ‹æì¢,.•nC;È7“ wÆsë!þ Œ¸6¢§s)“bô¨›2á§³µÿ Eö®K0âk5|…i Œ‚¿Ë‰Yš¬Û/>Ó®!j/túÇŸ³¾©ÇïüÒ,`ô^wÞøÀ“ÛÍäÖ`}ìäfôÒªæÄY·´ #DŒ–¥maÖÔâÎ3&:Àß±ò¾gdÀ,æëÈzÒ³ï¨ò¸‚êhcÀ õ°0Ò ¸ëp"_K`ðNÿ€UB(jp í²áQv™„ØÂÉ{ïÈᔢyþÄh¥±áúÅ㜞ýÜ ¸¨qn„»èd¥¸ç(ÿw4\©R?FçùVE¥huÛN!…ã²ÏF6ÿ@¤iôÃÒ0t…ycÛ´3ÌAí›n#0Ê›k¾„¢îm/G-ÚÒø5ç=ë¿ÜZ¤¶ï:zYõwc¿þ¶2]³ÈéòçSŒÁˆ |Ž´ïw>Z#f-B”Ð~c†à]"Ýv ®’EÊà‚zw7ì_þ­ í'aWM³ÜÚ?æÁ*'<$ÿš¢ó4úé©;bûq‹›ÞA ížxç§NÞVĬZþzmJ8¤°™ç¼iq@aÕ½<ÊxFÐOUt±Ì_}Àûû‘ÊÓyü²)´jŠç+±ó Ýó¸3Lu©£VÖ./<Ý ®yýùð'pÛ¨IŸ‚-¥üÙ›rÊâ(]X†xöû3 “ŒÔé*àü òF¤ŠõET•U‹ðÌ6ÿ4àNÆ>Ød©PÉ]<ú+3ƒ¸Ô5Íç“–3LPYhÏ ÏMòúû¾ašá]g¡4-bs’Ò­ë"M…ŠêC.‘òÅéãÈžeã ¥ë—úx¾}ºˆ2}øq»®A¬Íê©“7ên‘9–èLöÞm Šé±¶M¹G°³ä v{Â#>íD?ÿ;«£@/æÜ!ÿŠ›sñäAEž…¬æRð_‘gU¼[½T˜ÿV‘DµóP¥;õ1b넨XáN¢IR%†4Zâ½$´åßo:Ñ(º¢@ƒñ‹œU”(ii-rZý ÉÁÛAFw£±c¿ƒ3›GÆobЏ!àƒp%|ç§:²>µ…‚œUáñZúÒ=ölÐ3µpg³XêªMÜ,Ñú6}4w4-Å`8Aóäݯ…”៞ÕÅm7¢~™úÛ YdägšÁ™¤/`wt¼Gw±ê9užŠ9"ÁI¶Òÿ/äp‰•sûôŠD¸ƒ3οyçÓ%ÿ3)Wǵfæóä¹bæˆNŽ> ’D¾ÁÔ 09òì®&drƒ—e œ™È(I©õs8NGøDØ…H_`^7·òL% ¯ôûg_Tmû†Õ'µ2Ë|ý~ZnÖþ¨Á`m/ªµç²|e ¨…G&÷Kö,÷D€<‹$y4¢q¢bµ®·˜o$] ,¯Z lå:¯Yö8¨ZhÏ…ž@C&oš[.WË´^öL©+g]ñêÕU4¥ ÐºÇ‰à^¢+ð´”o—ÉïàÛ•&¥ç”î™öt!>ËkAu©ø‰zG±}‡¯iƒØ·Õ,~?“áZê>íLJ%6=z„îÀ&ùS1|i=Šüû¶_çšÉVy 2zÐǾÅqcm1 ˆEAú}¾=êÚTfš6ñ™”ߛඵç?ÌýÎD×Y³Jï8HsÍ"Ioô–»0—QêßV5Ô%|™¿à&W¶³ùç->[³CEQ‰à×$òQÞJí…C¥¶¯Åe³Åhjå|óÎÞòám N˜Í‡)X‰7Gî¤Va\Ú_•®³¬ßk1À%€fæšóË ø†TÓÊA )'’ìi˜XÓj«Ýxvÿwx¾˜×ª}à?·½,«õj[Uëœ¤ðƒ°²È)ZÓŒ*¶0¶yë鍊uFþ0!ŽÂ(1¤¤l‚ãŸâLÒ5ù`;¦4héñ€è8’ŠÂøZBw÷ªâ% „àžÀ /÷C@yÓŸ-ŸCãµ6OõUpl{Ér²bÑI¿(œ¯ •Ft¡â°ƒ%3Ú“kÅ;Ôô=Tˆ•;[¼aŸvòVõŠÓœÃ„§I%ÇŠB¸©f©V%`À2@z£!l”£ª’B Ä›9ÑH­¡YÑ›ïå3Üü¹$³‡`÷;«®ÎÂÆã)‘,-cµÛ·þÕi%TeK-åFzªó=xØø¢ço5‡R³ÛˆÞ­°¤ŸÛÀðV’WkPy—íQE¡ºáT!üûWcúLþ— Vß‚#;÷VØòc®O çVŽÐ,Öég‰Ò0¤ÛØ1J²¥¤²¡”jÙþ7(%ê'óâZD¡{W÷ùړà Uóqâ‰âO—«v“u»YDÏ ‰ZÅQ=‰w²‚ݹÝb•OlÅhÍ«ŸÀz©š+Ɣɓ¡âŠÇ#T¢øŒi‹ŠONdZVµ PÜmõ‘‰”ξ±Ø*Ñvè­ü·Ñ‘©Ë©:rÓ›ì¯]Á#”º‚4|l¸sÌ*Ì[¯ØMJ $ªYg„0µaxkO·MxÚP5œÊÇjñ6ÔDÇ_ ˆTè0… Æ uÀãgÅ‘ebòlgwˆ5˼¬˜Ff^ëÚg)_¬HÔ/†ˆ¡ë“¶WØé%¹ï•c>mþ·=˜hÉá]ö$‡ûˆp^VÜhQ3òs«vˆDMµE³xŸ09h£‹µÄXŸ„_DVby±TQ3µ°=£i¨¬&ðäOßæ&þ;[ògt¢z^ÛPlq¨ò$JÌs†öG­}<& QÂèñÄÁ¯é‚!ñÄXÿÈÿ)ĹÚ|3¹”"C:e&ò+šr¨E:qto)$øÏØL¸v‰…Úçwh8Ï-éØ}J·(g.o6a²fodÔ’ÒͦâvooNuÁÞN±Q\>Øî]‘]¨Í'ÌàâÍù©?g1vUÜÌûSÙ7J7 l(îÍ®Ž,°œyª®ûg¢;\iÓovM@k2B(éÆÝQh€Kª-àá6µ$0Ö®çºú® T¥Åó“<†€•Úv,W¯iíª×qOÌøê@K£Då2‘‘›ðü•þ§x‹ƒ¡6FãìV¡lÃÇ,UÄЈ¼¾ßtë­p}K¾š½üËõV,Ξ!wÒŽ´þ71Ì#‡†áëü ¹ôþqL,Öm{ÔZ;ã8î̳åþÿUŠI`A Oá/\ŸWÈ­hô„-'ä;šKv1?´v^v{‰ÏGYxÖÜrýÜ¡ÒÑr `=· X·ë.NU"g$NþýHÚ„Hçz#˵lK¡ç‰–uD”_3.t]Jµšæ¿îA 'R?s¬Ë.õzFéêÉím4D,Éã1í‹>ƒ» .gàæÑÈ–V†pözPB(ÕA?Ã;”"Iúmñô+²È…R“…¼Ì­+I>Y`¯-þ |ýlb@7¨†ii·pfÐð@ðXñMã´;²ýöä~·÷£}¥¢mÜ©4#§ü0$F¢ÈI €4ËqœËÚí].ý‰ìî;X[¿<‰ë°•QX«Á«¦1Ó(£kÄT¨3‰ ­¹qr÷´b [øÑ®w-¹¾нŸÈ¬)Ä,p¦"]ˆH6@¦ÄåÑ¢Ö::Y±ÝwÝ.f¦ÃšŽOh\4{t× frxì1zT³-4 ɲ¾ÅýŒ?‚´ë³BXFÇ ÒA'¥b¦?ýJª,<‹Só§–/yÑê ®!!]}^§2ÎÇ}¢âÓ¼-°ëÒýj³\aÅÙ5uœA½l£Ö(0gÄÖãÈÎx3à(Ø,‹x1uRîlسôÇä¿Ük*|Gö ±Bò‚yl„ßš¿7p²ÇÝü|r€f kZ‘1¿Ns±€P°bxBä¥5èm0‡m‡xµ@Ûa@®ÉÕ §ká’‚‰Ouüûd9ÇÙi 4‰Ù»;yKÀÍàp‘f)a¹ ·…hA[š|ÔÜ0 nÕŠo;cˆÕ]´Ê;úU2f5[dQI¾‹¬ƒâ1óGŽØ¤æX)o\ê²,¿Î.!Zß…XA–™«?Ï—/Óf5¨¹V(Ó4:RAâL¯¢ÚÄN‹éÅy(êÍŒ^§ÂVb¯Ïeˆ*tÅià,tA©ºÜÖBJ°®”‡A7á’Éq…Ùäý®Ö'ß :-ódÝçìç=7[CŒÐ”‰ò5³R„ Ñ*`@ca* ÇŠ¡c(Dð?b0‡‚äì †Hoq±/å=Ö¶‰ÓôÊ^B>c`Mx9Ï àôÚ`H\?¼å¦›d8ÌÿFÛ6ùÔ-jŽGÙµU[²xªGœ§¤ÆZø‡!¾ß ÇCÑ|:œsº sµÆkŠü~}cG/ët¥°*9¡io…«ÜŒ¤Æ p@XÄ99fe×ÒþÁ•@öZ'¤®Ê ÈŽ±YmÐ…!ä*kûÈTÇš3L䜄õ.¤XP‹FÆœå c‚éŸu[RäK·ƒÍ!Œ®fª@n‹Aó/c ŠHùw\lØ;ÒDI|àBp²CÜnnÇZRµ7íd CäÕÿ!ÊíñËkU­F”ó;kœ}ÔéˆÍŽšHRB_ÛnÒÂðræÄ*piwƒ&z?ÂV 6yý{dz­/¯²?$Ä5ƨC\zž=ÿ>šp·©xØL\Bˆ×ÆÜ"z »lØc¡f¯ š~´cÙ•–6CÙo·zlpøÄ:ï¥ÅÓ» žÆØ;o1цßç-èë‰EýÓ&íIžØjE/cQx:2òÞ§üUmùÐs«‰"NjZÄ•À;l5°äv+uÛ{„ƒÒÎÈ‚,¢œ“Ðv帎ƒBöW‚©ã1+Iˆ,‘Ǧ[‰ÿq¹~“Ú5Æöh âñ*J ó’Õ(8·á¿x!= ½?=|º¤¹d`¦%¡§ÛÙ?{šÛ9¯ 8ƒŒc¯#(8éT¾>F¦S M Bú¿Ñ‡sK¤†OÈû8IRÚïªYYížø¢ðøÔP¿P’½zñA¬ŽÒËÐq\Ð_XÅØ€ÞT²Q$Åo»§Í‚îÔ´H)Ù­ãɧ¿ó?ÙÚabц²„M!zuÓcd;„R0Êýì»'naDSòX°9[˜Ë( Ðf÷š´ý ÐkúîF.{~TÉè$ôcÅŸë¢údÚ)Ê’¶.¡ê¡ -ƒN šÿDÒ/ÄíȘN}ŒC¯Æèžà¼#ÀþX2x“ëT)[ú³_ëIJڶÎE´*×®mán¡j¢= ü™JļÔÓ<Ð0c²r?öÁ‡xÜý Ï¡ò0KÂæ]üç‚O\/ü ì§O¶¢>Í&jtò©¦}¾ù7P›5VR.,EüIAl1Ïæ¢V W1Ð&óPëJËS~éLÓmÑe?ÿ 6rÌSdv®t¦*Š‚ÀvùBQ-ªo@²Î(\¦{ LNûv‰@r„Kɦ2Ó¶t •x7 ÙØïY9PíÓ'[ªKOhME@=ê…2,?ÓÇØ_Û¨\gé¥4«Ž«WG Î7æÒcI•(g°%óµÁþïdä?ùînÌR¡ã9þ%«ªb;×ñ쨜ëý4cÌÓoªgìÀGظ9±„‡MÏLÆÈ›Gj Ñv¿ræD]e3w¢?ÿYÙÍV¿ü¯õávw–ÿXšs¬¤’]e^&(?yýÎrO%öþ›»ƒ},zÍ2PѶ8TöÞì·V®òIâî$(Õd çÁ‡?ï9ºÑŽIrº¼Ùÿ,/ò{%zhÊ:á$3ËÕCÄ}Ò#ø2aà§­ !kß0ŽË Õ.DõiêµÜ;ÀÅÔOâúö\Úë(Á4l¤`}ò«H{xßÿQꘞÿ_BbËw™!ƒ-;æÚÚék3ÌÛ~òßi>.?.¸UjnchéHe(ð;gw:G;Á유ìôÊYRi©«hû …`ü-^ø+I¾5dû‚ö7}ã¥vͬL3¡á©Ìªn ­D«w<Õ`­js%ÃÁ¼œ+JÜBÐÕ–e³!?¢âEOÇê°j¾`CÿAVoéNâW}°²¡w%*7·-_ô¹‰K¨tÿ†›ˆ£ŒEèo´U’æRæQ?ýécÑÙ\ØôÕÙ:ŠØ _¤»ý ‹~¿gx-m[ëÓ÷w‹Äaq^rø4ŽDÈ’iІz‹®„´Ö~í’H†§q~ö¢Q-ª’Üæb¡yZš%sXå8K²ÍD–]‰ýò Õºñì­šüc¦ç¡`T?Œ}:Öáh:~Yg«äàÜê8¶šIdã.&ék œà‹»Ú7üXY«D Ê ýtLjÃ/×ÄÂñãKQåQ¢G%ë¥Í?|ò¾f”c^ˆyj]ç’äµÕg;Éà®óÁ¿wÉ*ìr|ŽiÃ7$WþÌ¥Ÿ„ gý$†•9Í4Âïöи…IÀÎLp™Lë:9['¨Ñ–ô —Jž_'¶Ï-ŠªjŽ¥rwE<Wž&Q癀ó¢PG½ÊÈÁĆ_ò³Òy‰;sã9æ4¡·>2~”†×™ZKØñP5¹‡C>=L41;ÁY¢ÆŽv,’áö@P-ó?…ÙRè Z{lˆ#¾¦:GÈü!Ö«©ð˜¶¿kš«Ù½ã>=“Ž™$µu((# údýŸ¯oÛ7´zõÚÇæzl·ôÛ*Ün¶Ç×ÎGkDR@Ýäõ­DyyYÞºDRÚxsÏ9©«ô8«ùµ½Ú|>”Arÿ)¦~¢sþï‰&êVx{}n»ðH‚°¹ò{‡¹ÊŠ;˜øüÉ!¡ÞÓ?]Á,;†¬0Ö<°\x(ÐWšMéAH!jÕŹ’Nˆ“³ †p9ï+¤¨Å6Åïb’iiÐßýFKþk»©b«¥Ò/ÿ#«²JˆæäO|ø¤¨'ãOáš‚÷ìñ˜Çø’(”çô(ª \ÊMÐòé•Kÿ7]5– G¸@òó) sæÊsÎ7ù#µó ®‘Çæ Ö;uë—¼g ¿DJ‡k8Pû1 x.ÏÛy‚„ Q˜+Ò™ÔÞï“Ñ›¥ë^Î…¤J]ÛN”)ó Kð ÿ~¯’`Ó¦«`ï©E²w©G|JˆNè’HOýý­bPë—DO#¶ZÉvø´Juš)Ò·Xâ~õ@çŠNˆ k 5ÙüJ•AäÅÿ…ÇQ¦¯~·©$ÔjKðÝ(€{ š–/úHUTpµ¨n­aHÝ!×-?QƒàAŸD›¤ð`7£Â@WõödoÄ[‚’T÷&@².ºÒË¿XxÒZðUÏÇf/h¾2](ÑõÒ\Mg‘WðaÒìÁ¬«AHWÔ|wwæOtåÁª®Gž‘É]¸²(Ú0ì+3¶ÚœOÕµN6P¢{«"ËP‹wªN`Ý&¿¡·íçê#»ìô&¾éd[-» †£æ³feT9~Ó §²‘©OÝñžùñû<éU!MzŒ-û8*öÇp^RÉæ°DDéÔÙ¾4ΩÝ-&&ì Kl#N11ì}b´ ¡qé¾—ÃÝÊBWÙy ܺž–6£”¯í€ ð‹YtŠ‚Kí¶úÖa.jŠ=1ä×ZFžÓõx¯‘ªd[TJ‡†÷²(Õ!‡ò"´q(×Áü2ãÛi‰Ð…¶MqŠkvŒ[áä ÕÖÁLÙ V`‹\O´líŸO-Æ%]þˆœí àÈJf}°@?L+Þ„Ç9Ê1`ºß>ÜÅRœÏmÒ+üf—´äŸà+ì@ò…Мr9_qÕ^ dj\ÄTñ;µƒ`C»v}–;±NWç¬2WŸ|ö%Йö«g‹dA¥R" æk|¾¿ØÓ™ÆwþYºôV]Ø|ÔŸÔi:˜ü~¤E[ý¡­ÈžTFyð aoèð¯ôêÆÖ¥ðÁYSÓubê1#A/hÓ4Ç|PGøµ÷«>c¤÷ÕnÕÛôAYüOвÑ~ůáSõ!nó‚D,r„QåèrÄ4¦ÉÌšž<*„I´øÃn…kR#9Ò?Á”ŒèH,`„ê<˜¥—aNtƒÈ0˜"/’‰þæߺÀÇï!Þ‚Æ!ÑcØB~jÅiêÏ”_ÞËÏÍÔf.9‚ók•÷µÙe³ôükoFÞ¶p`“Øqê_¿žE±ÐJ€èR•*L[`‹&“Þšm¤Wö?|þù¾Ð/?üŽ?‹³¢Ä™H­ÔòÒë=¼ æ±\Ÿ˜dŽÜªb´®æ×¶—©2³#.:íñY†% ØÛsArÅÁ7)Ö úÜop¾²\‰-Îó¢ÅQŽ‘®ôñâ 7Bز2ªÛ-!Y`}& ‚¡t‹¼= Fùö †#?žœì‘s ³ÿT AòŸ¢2öÚ?Ô¢&xÞý m¬?PáÝ„#$/ˆ›ÞbW †K-ÝzŠùc±†ìa‹bÈü‘vb–D@f³9¿‹0ßË{4ƒi(ò¡‹ÖÈL“‰Þƒ,¾•ßì d²¹k©ÿqÞ ¨Gê"ÙþÃfØ!>…Á/ÀÏp <·œ$rN&­Qð>ýë,  2J_ˆ¥–Åw ±Â‡ÍXöRIxm¼äÍÌê÷Õh¯(C[&¼·*ËDfCõ J=~s­[ãÿ;UÄ$ÆkŪëQYq3”ÚßÇüÝ«@] ¨t¯¶×°²‹½@òq> Ò,ýèMÍèçPˆu+ò…6Äï/ï^šï·ô¤|–L¬] A9g˰Mùï5,ª†é><ß½ÿc!ÿ>ØaAcÅ)ÿ<ÿv• ù8¹¢Hê×yÚDQ"ø))à º2'Ãg$«ª‚õA“š2¬Ð‚ô¿œŽî<š£šmÑžÍý‰ï’ ‰2Yà5Tn¥ öÆPsçb5`JDÜ!õBÒ4ãâr «‰…6(²R(Í-“˜GЕá•y~ê´åþ[Ԥʑ*–6ˆŸ9HtYLyÖüïØU³*(,ù­Z,ÐÒM̃•- ô·ÉÅ8Ö%CCOç¨Ò”"Q¶v7›S,²»écs =ÿ ”“‹ú‹i-7€;œøæè Õ¤µ8ÝDïrå²¢ÔÒ67oðX5ˆvŽ;+Ççrt’><Úßedåsåÿj¤Bø‹'h­;kš^<Šº¶Úõ4V`ÅšºV°åµ‹Ï9TÍzojž“YÉv«öÂni*ëP=Œ¢Ï[tˆYA|—ÿE<ô[õ4à&ÆÎòŒàÞðö;˜‡mê!ÀµkPpA`®Ï*ƒ\ÍWp9] eÎÏ¡g«í¶RØ@B«7â!‰f‚­—0дȇæi¿!Ëî »qÝÞ ɼ¡:‰×šò³ÛÍBæóÞ ¾À:¬‚óHÜ$ºãÃ'ÊNniˆ?1;Ò›ß\»Ì€Ä“°âgyŒ_ž¬yk³s(P8Zó‡6ÈQAH}çð5íÄÞŽúƒ‚4ÿ~Ôi”ÖÃеuöçÚR­•Œ"¨¾@EaÅp» ](¬¦‚‘!(uçö,˜‰EÀ£F|ÄZ,_fçK´3Š^U˜iÄÆnf²òRñ‘,4Å蟻‹×Š`°NŸTÞTT­ó"µ ‰d!XâL;¦Nñ@gA_N¤^Pß»)Ÿ]DÎ:0ãmø»oª1»vx,t"å•îÛ7°6î^üÜÊ {Ìy=MKð›ä²£è­¨1:‚µ„×J8ÒÚN}5æBK- ?¡>£SBß3‰4Ñ‹]17Š@.åo=h)sŒ!Ÿ;2GÂD6•4ä;î‘2ë€ùøßµŒÐã$™É®fŽÙ½îuæ/’ÿtÜuDR6[™y8˜×pI$ê åߥt.^V™"“V±ZvµÑK&àý]Jþ¤¯ÕØ?ê.ÀüþŽ¿;ÏÏéêùa}]oßR?ííú‹ÀòJu:ŸØÖç Ö'‰_[%_{#–ÌÁ‹ñgj¨Ù™Î‘'Òn7Â?GAÚA‹, ÇðQ/6ÙîÒ01iq£Ï}À]ˆ)7jWâ&Žãþ˜¡BøÂ4B½!âFåB¦ë#!¶lj….TYÞÄQ(!‡±Ò›MÑeö«0/Þ‰vEt…¯-ùä}†K5ßþíòH/ù§´ˆÉ*¿(˜~rlưQis+vBÉe.ÉÏë¿Æ<í”æì”WÛš£&a•ˆƒyD-ÙšFxK H +\!f¬éhš˜–ßpþ=mžZR©ý^H`’¦|‰ôÏCWÃDa/:‚º&—ØËwž«Ã cù¦AüKبo²Œ µ®£ÍÞñVD€E2šBNC̽Ÿâ&kÓF£ñÀÖ=1?ÊèôiÏÕÔ‚åø§“]ž}çtfªëZoÒŸ \éH åÄ0Ìø=Èó‹Ì>Ø×@ðçóVu°9ÚH’šRScÔ¾æ<ñ\84œÄo.v!ÔåfÇx÷QZ—1Ž]õ¶aÔù=l[i+¬ÆëÝá+[Ò°ò2óK ·ÄF\vŸcÀMtÕ• ~ÃU^û<~ÖÜ>v„ô.©P¿(t¸2øñ±°¦šÅÔsœjzêAEjòµ»Î^·Ò8žóRé³?±…Z:z˜³¢øxÈËBhVß[ñ;oðVÏ¿D—Õþ™*vDOçªZoOGÊ= ïïêÛÖM5hÑè~ÅžúÁ¨#C부ኒÊÇs×ü×)ùôiÂ͘¥þ!øŽ‹éìÝ+Ë(Ä‚@3$/Í(Þ_GÜî)Â\@Bƒê\¤œØß~U^Nt»V˜I¸«^ —¨µââ¨x^ØãR“Ú!EÐOæÍ¹lþ›©¾àê5ÊŽeHS”0š`DÌOÈ)œ÷8†DC¤÷l‘ÔcƒÞAàj…‡”% ™´nX–YÍc9Á=}ëf«Xh³ ­ÏÐåE´½,ªÞk'¢ oHÁ4&]×âËyåÑ4ZþSô)6zÃGlR¬bñ±Úæ„b§{’E5÷´9U„ûqˆá/Â×"ýN¼kñ&žÍàà¬áV!ƒÁJŸDHˆlq¥PÓú¡Î‚SûÖAðÕ«sbÖ1"`Õs_¦\Cc¨cªj?ü³¬§á”“¼]¬ÿEí²SÞœƒU’U†›å—=@hæÙ 6é8Öí")]T³ŒŸJn³—å¾p}þZš^Ǩ<.»Üá*-½F¸ˆØsâIUYÁ´ÎvÐ'Œ«–Ÿ†üGÖñqaŠlóÌ+<¹©•…E. ùqbÚô}Žš¢bl£V×Ú«XsÁ®ty¤>Rsh£ýzh€Y÷£¤àS–qÚÍ%@ Pë¢oÐd+IÄäc.ö=>N,¸ï^۳ͦRTš˜tòÓQæfêáôë·ME¡¤!hñ¤½^ž×Š Í6( Ò>è"©žl2ÄÂ]ird†A‚äÃÍqœ3¬"{7öžC4š6RžÖ22-yI&¼Y”“"¦<0\NM¡‘¶Á;@ûð${xÉwÈ„åV<ê30Gó‰48fÒ´›t6GÜ|x¨³é,ô¤ l^îÝUL·ý4 wñ.»^Õ¼wK·x$‡ž˜‘ö’ðäØ*³q k*œX¼6«uøŠTùœÌJjåuµ«i†h+…pÃYøº ˆ¸ˆ«¿ä7¬µ¡Š‡Q‚Mоy¾ü2¼“+sIõ,óÚ:µòi- úG½uôš¨°'¬ÿWLãéš™ÀÌ&q{Rya!v ûg˜êê¯Àbë+f)Ì Öš¶4Z3qSÖ“äÕFÏ'è ª¦Kõ,æt@sÂÀáð•÷&ô(?h×F[ƒ/ôœµ¯ÁrФ‚‘bkñMеeé÷±;æê8ÂhÈça7ú•üo)!*‹Ù¥íîèï•V³¢ ýTõ½7 ÌR]—~¨ š†ã±«³Àx“% …@ètrFrÚ4›‚Ñ„ÌHÖ¢Ë ³akKRU±AU²@Md{ž&’QCvaÖ‚侄sH.ü1`Óïµ6¾TýáÍéF¼»OÔ뢸à¥mTvÊÜ…}#1ˆÿ1RI²Eñ=”ñ¢Ž§Í#—OŒI,­ÁCîö¯kÕŽ#«ß‚èÄÏ[IJ%jføgn½ü:‘Û³ !JŸI—ÚXî(˜ ;—™M’6aÄ `Óô´”P” ¦ì ² ”%‰eJ'ºÇÞ½ß1|DËÇWՎ٤ĵ‹ß‚7D[Q0ŸãÇê_ÑÔ·J™·¾”m9E~{‰_“µ±; Â߬uü6W–ëy¿Ñd—zì -3?K†9Ï’øGr‚(”èyºÖû×ìuöÉþQ:qî/Ê$;«iª= ˈÝäO8KOàÛ"…-*.‰‰~ˆ=\—Ž?]¬Å p ÕÄJ‹žYŽ}Þ±ç·ݲÔËm·áøã/‹6ÄÇÕO¯…!^Ô÷|æ` Å_öJd.Zb×/½9ÉvK‘Øñf1Èfüœ:€ñ› >ˆF¶ ¯Ý£ý'¿}ôžp¡_e˜[qdk?²¾ÎôT5am´™íÐ%SÞKiNšäƒh= ¦Y‰±¹´ 42GV³;>iØxHýA™´ðT0~ ¤íÛÓIÇN¯Qøˆ>€ëáa·hfÒöêÉ–RGùæKšÕÝŒC=hIÅ^Óˆ~ÞM›S;³èp2ÂqÚ…†°ßóÞ±úº5ÜÔýºŽÉþý2Š Í±¥!2‹ÞgÇÁ:ˆ™²ÕÜdÄÞªbÐÁ 9—Ìñ1=ø'?ÿc¶'P¿”å~ò•Á·a†#é²O*ÕÊ2 í+>™íþùp鉇´¿#ËŽÍÑ;`cz[!~XWvjº­4PI½?á«¿ÛC'ç.?UB QpÁê}4(ŽÆ>b tÔÿ0îUØ ü K2ã'~:´ÓÏ­v ¸ÐÏ@gœPãF|$5ÕFÚb„ ¤á¡¹cšVÙdã{7—ÀmUɉ¶•qùš5éï²IÑ+£ì¤ª #é´LÔ’¶SE¨?<æN5Pý¨!,äRÍ×Df÷TØÇEá¼ýôÉPù¾U•,`ýõE|3û#m©Hûsb†þãÕ„W•4Rç 0íî$ñ†? ¯4¶P|ø*uµµuf PE9ÚzJYÜÐ3àêчæ‡Â|¾º£3¶­ä+iÍÇ߬ÙË¢4÷‘GÜvüæúC«Òb 37ÓIHÇ¡hb·(†‡.&ä² !”ön…õüÔ‹!,ý8 JÒøYs¨¾ ÓÞŒùìò" •‹/vNáF­Ú„þѤcQÂÀZÖêÓI'oÚKÎnžè-XÛT‚SÃû'ôšÐUíèl/Þ³wÝ©¤Î¡çÙ|ÜbÑnî~ÀÓ3’RKÙ#xwô?¤ yë£B-òqn«  ø›°é9¹‘$Åñ4åU7Ž^„nñzy/ ”žR+(D3ÅUÚ€D2)Lñª7yƒQ4 e%bÞ÷  ³_‘Œõ/~DuÍðF(s%y5~TöcÄqR¤,73Kb¿@/1yöÀ ö>XËÉŠ,žå9!;øéŒ³ÂÜRl— Uùöì(c´Ãì<@–ã_<æI®EšXƒò-»ÁÜã›}¾¡¡ty*Á2Þ°è5FK°›J§˜gˉ’Àªíæ£fk•|RsF ài ^$Õ6ãÑæK+ é=^%¿)n&¹`€$ŸèV‡ùDí~á ðpg³ÊÿMÓ— º87›¹ãŽ@)‡Ó Ë/²¬ö¯ q50ðì¡æZà׋—צ¢:Æ:àßK ‚1(ÒtÕ *¾Û&ÞÄ” Ò¿†×$à¿áHNdÀ)ÃáKwAùD·4žJ>û{.Ή-GÒºdfã‹Äõ/'&âð”–\¬RÅORãÚÀÜ—òDÒƒ)SqYdðn/S¤šQÒ•ž5sÎëˆI­sŸ"*ç©«{ûç±ÐªB”"爾ÎÔ¼¸&šS—‹ òP‰ˆÆj8Yj‰®/ù¤*ôH‡ÁÎ{ÚÙç T>ªjí™SS¤‚LwŽ›†)¡áw=³?w¼ªéÏŒ>kËͪã±l1Õ®ŸÊ€õx¯©Jãuì—rt}m3,Mü?Á7|WC²r¨i xÈh9™íäh‘¿0zòUÚÉ“ç®,¡4uÈ7,Kœi¸ïÈÊ¢ÃW®}]gÙéï@-±Ñ¤ú…~)èö‚äbøÒðæØ&•[¼…uÏžÈ+e}]6‹RjŸá¬º§ÛÆDcï ¹XYÐóüÖˆMÚƒv X¾9†`å7ˆ…ûaYÜȽ¼•†çÌ->™ï“·Â?£m³»–A}$»Õ(ÇÀ—Sö'öM‹÷€8fv„ðß°•r7Î_,¼9àAxÿYbyRAp W0›M‚Ü®äyJOŠPÀ ažmÆÕ`Îr+ò%Å…±xís¼¯ð)b\æ|+¯j¢CRi”ë Tîò¡yçÁmªÄøE~š1r€$¾Ãs‚·¢òÝ?^hÖ›Ç ëš*€…|ëœÁÇã2C—13Þ*ó›OÔÂ¥ÛãA-òyP|]ŒBNÏÕ<©]¸Ö™$ä±¥øãØq® BYc:»Âð ´â“ÝÏ€±§UíÖ6,®&+ñˆ…[¹ÿ:aÊþùh}µ‘Ø(åÞ'¨Zb<¹}k ¿ÌǨvªéCå"+éÀòO9¬5ëƒÇ1l°­ êЫ´eÙâæÀk»?VKpˉfZ/8Q£ª¦®yGo3½òcì>˜l£ðI?Ïß©o•Å~Íè Á‹Ó˜JSÝâb6ýgDŽ¢á:“þÌ™·Ï¬–Õ˜‚ôãö Âñîxp/j6EùÌ•ÈmäÁBo’Q¿Çº^yËCq R‡s(sè:¦…à[Ó6éèù%ʺl%;è¶L& ã©â›¤ö!TîEUƒN)T¾i6myñ4 ƒžYîuVwß«â/´3T'ñu ¯~ÁâH øhð!¶@•;~‡DYT‰,ßþ‚£Y£?ñìQ~$Ù*•“qD#•¤?°ÞèúàF®âÛ§ýe=WþÏsÌD•ÂCOá;PÜ£·aÀDÆ(Æ/’Y2çNµm‚o+SüFEBÝäd^JK´«;´×¸kÒ/S[ëç‹Ãü¥.ºqn6&8"E´Qö>îU©”R÷–GÔã•-£F×´˜¤_æÔeÿ¢QÌOg%®³š`"›uñéia!{æ² miGb('ScæÿJ… }JÐŽlëÉL wÖ#u`p%´Ò£vbžYÖ=öŒ´N Ä@–àWúœµóÇð{ᢧÆŒhÜ3BŠX‘Qêµ+õ–2_Ê…i×>‰ó6}/ó¢F·ÝÝy‰b6ž²¤mô¶ÌiEaÎù)j3&'ÿiªxÒ\ÌÓMêfÇ “ÑØ°d‘¾í×6¾©d…g9ËqcXte„W=^ ßv—£Ñ‘$ºKº°#XÓJ³Ü€£âù2Úg§×t›¦G_ÜMk'' • G¢A3þ†šôO×·Þíó²°ÿmägÔsÕ7Áâc夥4 K»+¯.•0,ÿ!ÆÚ/ÏÜVVDÅ¿vncúåñ–™vÊöc`ÖæÊDû5H{%JndG¨#noŽ«ô|Iö°8 \*9°êTT(wÔjŠC¬<™Bå¶¿(Ðh¢\â‹d±gÍô¨r·¦”þÁ›I®ªÀb"Kè2‹hg«·€·ôîñ· \:¦Üœ¨‡â_Ù§!flá ±+BÎÝÅé~&]'cÀD+Ú à>¨’¦HÆ ýÕ¤ÂÀÅaä%ù ÒâÄÞ¨ñfÎÀm Ž+¬^„K>œ¦n> Œ§p.I ©”]F°¬¡†å Çþl\?Wþ± ÝÆ¡{rèÒ£â{þv6N/iÀ€Ò6FF'oºÎÚÿOY°–Ç6ÍðÍê1«'_2ù’ŠVøÐs ØñÅ,»Rm¿Ñ¹…Vmƒ•cÒ€æQ¤É êÞ²Í#ÛNßHsÐ-.¥P¡Þ)-ý…ÊNKe§•ÀçAÕóxA¾‘3ÀEÑ .”&çr_æÅ–îú³…l² ëfª]).ŠPCG4o× YyÐÄœ2&;¾7Àºc€£ 6+Þé†Ò&F ,K_¡ÔÓ.øÁ›óË¢rÁ›Ä ª=/é˜ý‹ÿ.A Uql:rÆñ¤æX6ܢѯ¢¯L7ë’’ç(U±€$m|¸½¹®ÿo»!ÍÐÊØáÊã>eÌÌ)¿Ë®e†À1ñmy±v\`Ö `ï¨`¾·«÷&ì’&Ýá­c5ä÷¥Ù[݉¯ëCÈç™Î®d·N<ËHæÑ³U±7BöW¥Îv¦ „n±Œ©Ï©¥Ž‡‰)¤1ö~Q›®ª4rîñøÇþú : 1€t¸axÍò¦É›Šß-8 c_pn=žB˜¶Þ­PXº¹‹Éß¼Bž*–çÀ#Kü\Nÿ8×®lÅxœ×¡bF’k„äVV8Št7T©¿sŠâßÿe°Øspèmn®'ŒX#¦ÎÈ *{ø©ߌ&?‡” ¦š3LŸ´¹ùh(¸þ“ïpö=dS¡zݨ)åËÌQ“ß@Ш.d)(s×i=ýFì˜ØÃ­,*dâïö˜¦•/«æÕ D•ýÕ¢h[®5È~ÝŘ—«²º;ZLöÁ4m´|qÝœÁåØœ1e×H¥;\ï¢Ll1¼hÚ¹š¨Qåú¡•äz5“Å8c|‡ÌœD_;ˆRR±UÓcÙ¾#J€™·Õ˜£µÕ•XÁ¯)ñ4Éém[XjF•iM°•¡¼ÚE [Á•þ#~'³¥«§ÜêFÿNpFÓ¦ž†8LÕMzÅÇ‘n]U˜Ùû„ÀÛÈÊ3÷O<Ÿ`š»Kn^¬‘%KÉ™lÔÊË„9fåýGÜläð5ç4ca¶9^F=e ú’iî\ÒЯŒ”@Í/ U7˜-À½ÿ Ø|ž2§× 5%µJ+ùk‚fLBUÕ‰TºÉõð;ÉRŸž}' :/ÐR<ëòhÞ†ëâ0l·1â¿ÿfÙÊYk¬ê8âÈ)~tZ]$8 ‘:tÏr“(H·ó–â$ϳÐýi™Ï& ޼+&ÝVÌãR,¿ù¥(p³';ù݆¾Y‘œCŒƒºß×~zJŠÿS§þx<®Ü#ùïÿDL[Ld"Àô†pÜÝнælW“¶¾R³ù—‹Å–sÒÞ4>…ôž‰ŽfóùƒûóÐÃLò ™8Ð4Xä»À[ʪԿÝz›A#!Z”ßíèõÌ‹äõÖn$ùô–ý¸p¤®7Þþ×øæ{hëÅ|€þ¦Ö ²"ÿ\Ä÷¶ttXT|¯ïú‡úìÞrGoQ S•ÿ/}žrh/òHöæ*ÿ6M¼b2R” ;?‹N÷0œÃ¼ÀÊ‚ƒ[Sw?þ߬cGz¾å®ÏYß.jc\›ˆn‰Oh醨ÌÍu×£h>šG°#ón±pUãµL0©¨}Û^çLZF^ùŸωP|.ï’öP²î¨0búC{^c`«!  ›wˆ€Ü ÑT‘tꢠ·a|RglNmÿ?BkÕC7e˜ðG«*1ÇCM·Ýt…ì”I¬jY¿ýœ-Ä=ôXè éx}Zmy[±ü¯„ÌPgù¹Æ·j[ì|]!@ú"“5"½.OG;íMÏÄÍp-5nÈ/ž|Ȱ­ŽîN"À•£É?}â–Vµê y[v;ljÊöCDf!Ø^Òkj¿Ö¡•ƒ>58m×Åœ£ØOÈ x´ø(5ájäoCþ¿8‹Ñšè!£ ½#nPšä^B¿Á;ᨮ~KnC¶«_%Y=je9ËÝNØÑ&\ucº(ó«8ÿkf_°Ì’Öò¬gnûkᨎ½(ƒÿTfp LœÈ.¶ã¬×7/6Ù–NàO‘x«>œµ\+‚°„ÂßÚ!p/ÈöÎïíÛÑlyW4ÏulLl—ãRÖÿLP­>UK`S¡›l¤”ÓS–å=F½"Ï võ4@¹ ¥« äJéùßMý§ÆÌ¸šÄHtJ¶ÈfN6º®˜¢’u ,fäÍç凿¾¡†bú _ÖmD<¨ª&˜w03ï½ÔΠHÕÓò±4‹²{ÔÆx–¾z6̺Þó×~ÝŽFF|¯+®ÜV\·í²Ükgß·ÿ=ž^#˜ËSÏ%Êa&„‚öV…é‹'Šv|¶Û:y‘Ä$œôXJI¼'Rà!ìI¹í§}ãGnÇ,TäuŽØiµ!¢1õ x“›e)­~„ó}MiÈùÔNýiÕZ (Ç Lʧ¯ô¬8ÇØç~£šA=­ñA[\.GÊÆð5‚¦X'CŒ(y=Cò„tÕŽMžûáD_Àh%¥Ð}>WýÃåŒÔ1|ª‰ªªöÉ ŠÖ™¹5 z8Èš"î%=ÞÊax½TFLu€ ·*õë¥}$Éá-j:ù}÷0 'z߆Lî8cçw®ÏW·{ìî¶z©áׯõ —´©¸áö‘ÞŸ»Ýè5N:Ò²Þ±Yöì=ÔTCóÞ¸ê ß+fÓm Ä1X#œŸ~`##gæëÓŸRÏÊ{qmiܺzíM¦l9]ß $|¥xì°ºÒœm¾ÊÝìª$|hO´„|MB8 ŠÇZŠÝ¸Ÿ‘uR²Ì)ˆ ©Š-ßõ;ÔòmRÎËkúç5'e‹Ä_lÓ—ãÕ6íywºËà&ŒŽ¼¾HM2Í¡A/ÍaumxJ£¨Bý˜‹(fß¼’ØðJ‡b˜c WÊÃð(ÍtÇÙÞ-FEÒdH^‚ÚxÝÅ*\î•_ŒÐy–_ˆ†Ì˜Ê rz?ŸŠ›Q;ü*Œ©uíþ¼ÔÆj¦Ss Èò>áFÃ1¸Ä–UW¯¯É·”æ¤Úz“ÞC:ÃØ»¸™ìãjgh4 +Ö¨Ë9¶be0!ÂMÏé$'¸é`gAI2AC{çë³l$™Ñ×ëSò‘ ì3ÖöýF”Æp‡•¶ÉÞ”N€¹]0ˆÍ¿óõšú¸ç-·%O É×>)6F†­0—Íh‹’«mu‹€¤¶&#I}f Ôæ·Ð×UŠ•¯ÃÅ€Tß1÷ûrÞ3¤ÈXz‘]„•¼>±zÝÀ8ÿN²¸°•¡‡é\¹ï‹Ñm3gU½¥* ÇnQEH¯=tëX¹éþ\÷n Íw½†jܧq¼ŒrúØŽÓ”¹.†Y4}1FŠ#“!ãÆyoI‚œx¯a—'iXïªhwBA.Bk¥¤ÂSX`D&>ä¯ (Pg-5-Õúyëj¶RßIkvn­˜ìû‡úØŽÞßÈVü,mËôLZEóuÎ]ËjzÞɬÚõgUWAØ;pýtúþ$ò8s rÒÏ Ð;ä§$#NÁgf•û1èrÓ*¶VH|1‚÷%Wu´#Š*:†xTÏ­LyˆÙ=ýyêi ËwcRÈçgHþ´39…I°»QSó |šŠG®¯ŒaòEÿ¨ 1¾m%8§¢ˆäž–Û¼».¬{ŒZï\,­Q Î4|îÔâûQï¶ë¾Ôá¥øþ Â˾Ôïá¥ØŸQöÙ3ê)þøuqÒÿ%Îg —:ß9YàñNt$æ³/p첄„Ÿ×N Lü@$½¨ø›BmB ºÈy3Ô¢&7SSp@Ð7#éññâ ˆ¿ 3ÈNF/ÿ`³Å t–*{[£+#±X®;%ÚUÌO®½L^ô÷ßžS´Š„1Z# N¢"y©(Ž˜CÏyLÁM¹ÈÕ)GPŸ»Ù™y”>Ih<¸Ãâ«\š`Qî;sÐÅŸ˜ZI§ëƒ œrDA—ü™uŸþH4Ýø]^¸Û´ÁK!Trð‚Ëkô,Þž/×°$¨;\v>Z윧~Y*¡Ü@6­ÐÆ÷<¬|¥©â°Oˆ ˆì/Є4ÝrKâhˆ·Z¸šG|ƒûEœ6G‰´½µV´ç9Kt*µ·ü¯wRÂ@¡ˆä&Þ)¼âP $! ÜÏFìÖ´nS<ÛõšOZM÷qä²®¡?µƒœ êv$ B00 SX#3v£yï£ùË¥fÓ/›Ð±Š ± ûp,¦àÎ.Ø}]q(R2§¶ÇÒÄ@Êó8Ää*Ǧ"€Ûä\Œ˜ ýJx8ñL4 [sB»ë%Ö¥–:ü³×r`Ÿ¢®Çî|3ÕÄ»¦3“í«rLy±ÌgNÄ÷Gl9øÅÃÀÀ'ÈÅìÓ4‰8Á}ç{aõD°iö±<—Ö̰~=´ÀJ5U¨ÚÁMÆo%vŽÄø`k×}i[¯ÄT]5ýÿJ²ŸÉpÔB±7G@B@%ƒÚ>X:ÁÐ/rÁgn¬¨rñïT{TY´I3Á>òæí)`”ëto¹%F)ëoT*~Á³#[©K(¥›@¢Œ‹¨ˆe¬¹ËJˆ±ÌáÞ•Ær:@ökÚòÒ‰?&n€ÂABU“þ˜¦ÝSæÐGÌ^møX‰ dx ¤¯)Ce A³£Qqý7ûìEªÉ@êûnðõþ £‡­&í¶§2uŸ&¶›ú,[ ›Ëw°e ZŽ‡Ã°ìY<2úU>z¸ ð›(Ye–‚£õœ°òE2F×±þë]šå|y[ì÷bµ0>;-€ug1·ý R¤(…Ö¬J)ƶ‚)LÁØ{7RÇC÷9ØýÓÛÌ׌k|žòÃäœáÜGùSæ/l"äw>ç:H°" t~eàþÛŽ RH2§º¢£^¶Ä{5TÕ<8U3‡Ð.õ"ª€¯‘/Ö‘õ®§[rĆå’ܪ‘ˆÊmd|ì…•¡…û:‹þÍdkq“¼š²–ô:™jbÃîø”FfÃÁfLú™T šá†C¦ò>ßÁâ]cçHÖBÓ9ÇTÐã…QE_ªrW‘”üôëKL´h 1d\ÿ TmË3¾Jz<úãWu–‹¢¤ã“Gôº‘ÛŒ- Dí–DçÙe6¬ˆaúê·ž$%Tj`ð\¢§"†¤çú< ¦Ó®œ\…¦gCÂÀñW¼‹¹q{‡þzýl·Ö çÑÚÃ*c¼ n ݃ïF)9ƒ{Î`Êz'DÈæ¢Ïfïç?ZÎo¤<^&mõ¶k-C <›pÌ쮀@îÜ©¾iÛmP~.ñ¬ý¶V»fë·©ïxš@ÿ)öR”³ å+cŒ19^ô6X§±“²·U< 7µf÷>Æ›0Yéûûë÷þ1‡zUÑrÓ"­¸ö§÷MÔUÿúB¨J=!ïpådw~éÒNÕ=Xy-WÈÿ(2$ K0 42ÓêVtšõ´Ð Ô]–«zo‰ê)0/ìA{^û( Àyvooâ1Ÿoš6~÷ÃÀ*¹8 ÇD*ÊI*­D «ˆR€”èŒn8MPœü¥Q• þàj[+€ŒÆ ÊõÆåÁLðÛ¸í"ýrD{¦ç¬¡Âgž£ØÍè‡X¹YIœmŽ9 Î×!‚0ÑÈ] Ô‚€ÇÄó}»‰ü;×ÕÓÕõ6€ÿCÓcöìOíµûíèŸø{ÃÑ{øu5ü6øvI}¾ßì¾o·`ï·´ûz`ŸU)}»mü=7?†ÚOªºÿCw‡¯g}¾çïá¨ÿaØßðôÕ¾Þµøßn¹_o`ûöô½ûhá¶¿ÃÒköìí©ÿpÝ_áë}¿o ×íéûtæûzØý¾ƒ·§°Å¸kC¦H]©Ï0q¨Ö"ë¾ö—H û®ã¶ïJèÓ­Ö}%ÈCû÷Ý‹¦Ýâ¢p;vV«öøou,ý)þ2 ÎrƒÔOŠ?½;¥ûÜ FÎC9!œr‘:Ð…¾þ~Áú£nG¯G·¼îÐÀ ‰,’”‘•¥=%ó† ‹™™½Ï‡’^Ö$4“ð>Ódìì„;-í ã:«úó+]±^–k£¢­É+;®E‡€\dÀò¬Ê¿3Éü[Ì a5™;_vtXDÈ’›'ÅûÝèjÊOHe“¯ÿYƒä3gí\¬ìÄn`!€­`7§–$źì>’ÐQýØýÇVeÙÑ'OùÕ£ý¢m©™ Js¸$€éÏÚù¾õÊQ™ ñ(—«¡ªÁ¢ü:ñ ¿FšMb¦6—AñZÄ•ù¬ˆ•†”`læôÖ`—ý¿J .å}¯ö[+Ä“ÚÔ|3»«Ü&uÊzOª-.…|?¥óÆl[u%,ÆôÖ X4N·‰ý?ûëé.d—POpâÜIÌÌ{°›'KBrÜ¿O¦é.L¿ÁN˜ŠÉ8ËL¡8÷ÃÔ7}ç„m£¶ ÏÃJtŒ±ð{0M7¤ôä0½,ª›BV˜>b_êû*¿¬ø °4³T¡XÏÐ%&|Ÿ§³­EÑ,ðT/sâ1àè½õš¢ 'kÔwº‰«Û·Ù熴•RÌõ|uÒ}H‚D!²Ò-NâfªÞjäâêh%óÿtÒ@B±ŠY5kYH™MŠ`‹ŽIÙ‘b >3køf«¦]ôÚ°°þ©9ðx\ß1SÛHO™ô$)MŒ8ü"™®ë‹å¬ì=#"à²ý –oà÷ü.‡Ÿ~âãÖY°<‰FÎæ&'T Gñ¦Ag¸êåDâg@ì‡/‹73hþ•Õ`VcìÓi6sÊ~qY‚hçKÜ‘36tf gQ¼ÁÀžæÄÚ0}¾U²Ó  bŠ!¯÷ndýLG) À•ÆÞx-$ž Cz’ÕÆØJ L¤£ƒë%¹ *MRÿ«ÃW_—ô™Ùî‹ç ´ì)ÄBb¶ç(V0iíîó3bÄ].rø]3“ú§Ñ¸Ï9ýï4#YææÓ§z4ŽQÀ`öw˜dI CP2¥,œ-¶—¬Ê"y½Ç&÷¾fÞ§vå§`£§î¡àìpQ„…È¡gƒsÑ®½ÙÙ1ýÉx ©ýˆx`c%'—žo—.h`ü2uˆ}M%Š'Æõàð–,ÚÓóaóÁ¯A’5“Omä%ˆ;a+#Íÿ&ÕöˆL;]5¾)Å»uìWÆ“cΛêÃà4peÑ/wïç{zO_bV§}ßÙN5¢‚=¹œ6”lÆ3‚ c\ôJ ÜžOÑÕsËtÂò&¿Kl e<¦:òW𝽂Mò=:(ãgZEƒÎÇòþ.aœÚ•g3/Ð †ÆàÁ£›å45ÙÏl5{ËYSmö:‡…:fëg%äœÕVØWðP×D3>ê¡ ¦ŠÜÀéŠL/Á0kÌJús›½¦lŸ+; §±¹'›?†Y¡ ‹?KG d$ù²€ä<£a#÷^òó ŽŽT«»[€  é±&ïѹ•¶“˜v1x¡¤…f·<^q¬@ z g¿¾Âøw¯.·ðZ†öCX†•¿Ý§+ssZ¶"uÞÌ q¶½"¼âœ’ mÚScu-õôÑ›öÌE{*âÚˆÅÔ[MäO[µ±²©ÒmùÆ&æ:â$,Šöê8Hv tÛÍÍWågò¸X4&[Rccø¤[¥kÙ ¦f¦Ìc¾¤4©\\1ò·kUž4¥Ñvp3Ëâ|{žÌe£’b”TSÖ ›Ûr½“-n·ˆM²mTü0¨ˆ[D¥[Á¡a‹Éñ–²Ó÷ò€CZùõ2‹ÕfÆ'(t¸( 2ÝÞLr]~Êò¸fÈÆ{^@Qoƒ+éÿPõ®}=MÅ'¼€¸â(ã ‘™Òô ŸØáçÆ-ÌmÅÔÿ|¦ÿ P§£Çáp•$‹Ã)>§¯ Ýimå°~*òý=‰—é˪ÕF5‡zÝ,˜&ó çÛsžl™lf>¡Sƒ·ùQ¥TŸrÎ ;é:ÚŸlbÖ\:8“(åÀ1† ›)~LÞ•[(©;oæÙÓäÊå^˜c¨½‚ì¶ õcëÛ8xy«T–©lóF ÉéÂ#ÌPÞ*ô¶j„Æý>q¢õýÁ:4ޝ‹Xþƒ†½^Æò ­/ƒ¹ ÓUy šÁ#ød w|ÿ'þ²Á™q! á³å8péäÍ'ìÉöÍ ˜nŽqûÛ4}cøIªÊ\ý0¬%–Eo€šêƒ?kÌdü©…8¨Y "È@†hT®.©Ë8…‰PP"ô$Ûq#_`ED»…jZ•®Hÿuúƒ»#uu\ÿ3ªï³ Ùíõ{PÝíîŒÆ<·^ú½Â½Üx]Ò"NH!#²­ªV¢bá'ò×w9<¿,“œÍrÚy|B1ü‘/é_ù]¥r’‘}cÿ!µ~ß…=©Ã⎠òo4«%ñ÷TeS›¥éS@”µö=ujÇöLÛ)+»:çó_8ªhö“€"-Ûà„¦ ºkƲóìó+psúa©zW PK„}Økh -öšßÀ•£F¹ÖÕwê‘¥]O2X’6?zAà¦]…£¥‡Eà«3þí.»{2¿y“:¶UÈû—½úfnIZÆÖvgHµ1÷;Ù%à2ÇlÝÏe9B•3þÖ »ìÞ? B Q?LœU£Np}ìgŽ"ÐCÀ ÝZ®¹»)úüèòÍÞœR¼&á<¼Iž{p˜‰§¼Â,¾²Ó¬ädo”õòI®ÀxÕæX—–£p0 ¬ÖŠkv%uaXÙ<²%õ#7ÔÝî¿ôCŽ/joò =O³,@?’i¢‚ú'‘œÈ—¥…—‘Ó×§‚›IúŒnݸÏÇìŒó°VØn“!çÅjÈ“ÀO+‚ᬭeî¨Hž`%ŒZ}‚Ð9•æN»•ÝáÔ²“žš¥Ú}Í&手ãÐâ}B¤÷Ý« 4ŒzËê,/|U¿OêíÞÚ_= ãA~µÆB,~ÛñSs’2^7ÛT]™¾ŽGø¢oß’¬¬ˆ‹JóÙ{‰)' °Œ¥ü€+·á/äB¡úTóÏîí›ÙÎ2„©OuÌkÜ0Eaˆ 1`ßWd-ÁÎzDp•ùL"#þ!•3ÿoxÇçJWˆgbZoœ…„³:øÕbÙ·—öcjû‰=¼âÄ Ÿ G(ËÍÆÈµ8$!È­„­ ñ¤ød¥¢B[Oˆ#KÑ!ï&bŠVøZVh sàä3jÇŸTÏ¿28‚ì §w*›]2EFp6Ou¸û™ àÒAãkOï0<éŽý§NXçNQLòz:ÊÅ…_‹„¿ïâgù-Ä6QØ“tð%ÐHs/§ßásX´þë·êb MÛlìÎA¥Ò²;½5ÐÈ1îl¢#æÉú“ˆC}á ž¶‚ö%È5Ê÷3gP)2F¯^äÕ_‰†Â“Â`WÁ,Ö8U?ÆÎM5ËÙÇÌ*Ft¥¸æá…\ö whÆ@¡o˜¸’Æ,Ei£YÅØ$ü+Áoþ¼eÜžL.˜`™ª~S®ÅO;¸Xß%ƒ|ô «HqsÔKPßqLôf¾ô¼çqbYW×ÌqÌRŽjüÀëzÝð'TyÍë/ùCôý›'|hÝHøÐ´žC‹)Åà|q³}xêÀ²)i: vZ¢‘uC—ã.’yÝ6„oç™fªÊaFòx³é]B„â/eJ]öløòMfÍ¡‰s´O›)_ÔêD©+³‚·7 ¶TO7rMé2)Ü%m*rr(¦¢0ŸӊHz‰Fûë©ÿL€<›à¾cz8ƒ6TÀ&<ä^ÁIFnh·Û^ Ô;]‚—ø6ö¶6ԫ<Èöëªü ^¥ÆÅ ŸÝB%z4‘JlvÙÌÓnn’Ì% Ý£nÉ;¨{›­HµjC¾°l¸»ïm¢/ êsz`|†òO{Ž´ÐÉ‘Äy÷ÑMÔÒ/oË"ÜœŸÏ£«<ò%Ë”CÝ{ÊÅûµ9ÛÍ ¬¯ŸõÝ$W¢Ë ‡>£‚ÔŒ_&êÚÅ ñã¾ßÿlüXÞ±myÓ0ÚðagŠ~œzBs¹aÞŽÇS§OzxߡÙî§m!/3Ü++#5c‘lÝ9®„ìL¶p@y._öcLù´8‘"²£…ÔùµÈ—?Øöt˜Åm•è!F_µž °ýBgÒvA*v#å‰8Ósi&XËR’»ÔÕôBgÁ<$˜`pÍ;ø=’WƒU8\Y)øÛ®qz?š2/ˆ$ޢ޼‚LVkƒÝ„ïPßðAôUîfê~žQ¹y!JÚG¤R*üÊ·ÿsNóùm°UBäNðÇ}¢© ÒKg9|Oöj5Å÷‘’©5O5ýnCã‡â„uÛ`Ó͘RöeRÇA3•ª*•°ù¶ê (.ZåÛ0PcF° 9àwV.QÕÉn“µHr⃜ܰ`ªÈ„`Ú.Îë‹f5LžQšäOLçͯ$7…ï9ÇýÜjûË’Å~=EF}ƒMgÕPAà?xÁû„[Çó^NÜkŒ¾$À±D±SEWeEÇ™²ÓÕh¸±ùçû³ÖŸú`©/#LœèŽù”¨[¤ë~_[©é’I¶¾q‡<2è@¡Zü"¥ÀsO¨ÆKKlKè÷ó€]ÆŸ£–B^<¶än.Ðäeú…Œ ¹MHÈSצËÄÒ@~ÙÝâoMdhf¯FW@Š¢Ör¼.¢Wˆ=зƒÛ!2G‡n¨ÀS‚’Š}T’Àû»h3oŒ¿(£&‰!´%;n梳Ƶ’¹Å‰·wRÉvþó§ì%Ín1ÆøýÈžêþŠ?ËÌ‹ÖhìþHÅÆZͬfÉ´ÃÂÉØE p>}ö—ÉpÛÞ23ñu[ 4”‘è\‘-C! ´Cÿ\Ó0&­0²r&ô§å’q%‘ƒ#º±.ki¿‚"«ušô¦ùAìx‰5 :ÌCö†Ã‰Cm8^$4’×*=“²¼‹pA¥œZ-“„TÞÞºb;˜{½hßu$äy@®ð¡Ð¾« G½àö.AW€Ìÿ_†roý4¢jÆ–Ž6%‹ãž§Æ]F®]p¢»îtDco=½XlSÈä}  ÓoÎ䬩£¸ã’Å~î•éYL-L‹`ª÷ÏŽv—<(V¡ž1ö§øø¦D`v~&Á·JŸQ2À‰1¢Kc݃tÉ9XNm™¯îX±€†20±ÍLI–¤Oå‘þ”“ù˜cçjn¸òd/:Z½BÆôûŠ"àV’Ò¿ïZ#ãŠx¶»—ëæÏH‰}Vô>ìÜL%1¶ù+áxxà*SÑÞµI++œˆ¦|FÀ&™#l{Cß~v—*`è&’ ƒW¡t{"UG”ÇAôQš“Óø6,a) E»]ºÂQÅUgžâ5m­.ûþÑàÿ„5ÒÕúùaÙ*{@” slœw×V ˆÒv¤åNêüê$¯9ü±FXôÕ»U‘ßjš·wÆä,Øáq¡ž¼Pz.?ÁYÓëÚoCÿYÍÊÞ*s`%Ý`ÊT…P+`fUg0¢„õ’T®R6zcІAW×Z²e›Å_üô’ŽUø4wB›+/‚#P¨‡[n]õ>æÙ(Z²w9"!žþô}Ú£§\ɧ^ƒB¬ü“~N°K~G-_ºs‹f²ä+ÊΫîß0¹Ë6T—‚OeA=ðJeöû¹‘ç¨x‰ÙÔVW8‡Íèi;e+¬ð ˜Jë™Yϯy‰TÑai7Ò¹8I7‹}ÜÔµC¸/¾znµöŸä+ŸÄá–ý="MpQÿ ªa8ùÛÆßŽM'³F’B~«t PøCÞ’ NÛi½”—Ê{ØP§^JÀ#¸Ç°,µQÆâ=Ý[Íä’ûŒl p„¥óoMÜñFc0x¤c[™ † M;[EÄœTÑì‚݆FÞˆ€ÒÕØäAâOq°qÁÓ“µCY ‹Ñûi¬L†$Ìxt®L„'tnú[†s‚5›&¾»VÓ´š7¨…c…Áv:Þ•ö õÒû`Á‡zÆ×Î7GEÏØ¿‹ƒÉ_†_«ÞA5þà]ä+Íû´æå8ÎqÇ÷}W¶{ï^sQãÓú©ò[…z·GΚór y´»É;«¾òðQ¯Gó5$ˆb›gç¹?÷o@ß—l”a©I%C€Œ³¢£Š4d~ïÛ Ä…Ÿ¨/Ó×òÿ 9¯@Ý'¨•á÷Ã÷`ÓIƒƒ Ýz ”2"öWyn¬ ˜Ë£g€Ü¯E0¥0Á²½\23?{7ë¨bWZ"¤ìÑ5àº`BÛoX3Ã`ðÙèa镎Õ!œ€uEfkî.Q­”±=¼Ähs[Ô˜µFz$(IÆ îìm ]„mѳڨ)Û0={T¶Ä|&c壵),owι؄±ïõþ-^Äź͂óEYG½tù%Æx5’ù3¨Á¼§ÒGÇÀìxô=e?¹ú2èL4*Ëíô{œ:X5½¬]ÒËŽØCêÚæfÿo<ó´íÄÆôIœ, >–Þ*õbÁ¿ølÇk·”õäúdÊÝY0±½iމšËý4(½"_¶ûÎêõo¡ÌF7øBnR¾³r.×Ö¦læ~/HÉ Ò¡ïàƒøéMúpvóvfç^[‰U—×õ”"dð¿uÒ¾$õ9ñPìzà/ŠäaS-&ÖÂn@TU¢&kü,ÈsƒÓycáò-´ k⇊?#}uø×ÉŒt<¾Ú…+K>ÙµWaôž{nH˜Ã¢As$¶êœÚ÷BŸÈOÉ>›“' ³ñ%ÒŽïô·'´Hö_RxÄÊìƒlo1ÖîŸSÉu‰b)XþÁÆbüð‚ð´dsžZž,{ù-‰Ýj vr)\Œ0þ4Š›b)Cé(Åz¸Ä  c›˜zbíÚI lKåJ鼕COÉö… ºšÿ<"œ]ÜfÀâáú[÷U4‡½r5G mb8IÛFQº$À«ëóœl%Z£é߬t-?CÆø1ÑŠG0æâzÌÉwâÚOK4‹êÓ<:Öµh1õ¢55ý']DÆ%»Ò…ܽ-ÊÏ\'jÝnQ÷'ÖÀý[ ´œ¡!MØÙNY×ÓX^B)ehÑæñ9“ž©Îô ©%ä^YfAAfª¹qÄy*¨Ô ¯¬zFrwÍüÉ#JÛ®kÃôø³¯™È9»Ó¨ƒ‡D;­@'4½š¬{°±°z™á™'Ô0Ôb7½Š<4 o3Ó²æ'TIÒö¤ÖØlÏ2ªþñ¸-y‘Œç œ‘ÆÞ6Üìì,{³Ï;L ¹“m!TFôVÇÙ‰¬s~éPîã(Ë›¨åç-4xpÛHåK­owDpmºŸu,Æ•°£;Ò‰·&¢7zæ‹û‘ö؉ Z"§>o¦šÈÚmrÇüy4›»ñåܵžÌ–épÁòÓo™·É­«ö˾V’Þ íÊá-}EoYÚ;ÍÉE夑e@7Hi_.Õ0­¡0 p`¬p#bwj+t¸„;æÑX˜au-K…Åõþà埢%v¿À¬¹Ù‡ QwGºùíâyÌw˜®UÌÅ[©ík;8AE?Ьß Ò–µÖ’;_õÑщŽK.½ÁJ; H¿%‹ÝŠwéâcG¾a·¥“Êï“èe¼Ä–€*Ž®$IŠt§½Bþk˦ºç>-d€”T:§·ó>Þ\ã"Ùîœêðœ‹\¾‡7 ³ÇåÙ’ßÁºñ Y}NT˜j)ÿ?¾9ØF#«õÍå~I´ÝYóÁIñ‰8û˜KÜÌò¾'õ¥…¶À¨]ÐÞ×¾¼:{YªÀ¿qÑH– ¢¸¿Ô$d7I$2²ÌM?Ñ¿1™Fµ3;÷Kh·YââY’‡_‰0»I uË@Έ€Ù„šµ)Ô¹ötg9kÉ9²Ã±þ^ô¬˜Zw·n,B‹Á\¹ÝôÑÃEÆw\¤áÆ¥÷ÅuáhõË*ݰÊd]ݬ²œ +©Îäù€èÕíÈô$-a¢nðœ7ä7&Y7mï—î5D+»Ñ›àÿN['ب,èXкýˆð%ê­Èõ­™+}þm¸iTWñøÀ ?‚ä}ð»î¥CGìÀNWx¬ÔTÿm8NîÎ\Ü5Fí±Ì®Å[7¦ZÌi×7Ÿ»s8oÀ êûÀÓ‡™õ³9™šÉ8™9›{}L¯¨dŽ(çö(Ç×-'w°>dA©ØY\ˆäÛ ËfäÛÛ~Htž¢@ùyFËäݶ´´î€eŠ;(é7Z(¹‘­ÔÃ’ßÚ‡ø}õôL˜Ö&»;Ô¨0íN>I,ómRÇ‹®”š áHË”‰ÕqXw¤6dXÆÇxù[‘(á®á­•pE´À5Á£¸ ÛjµgŠ»Žú]£è-pÅÙØ¿Ж!;·DiO^$÷èë~…Iº~cäîf"f—þàà³ZÝz±u^åƒÖýÑã xN­#½7iJ…ü”—ÕõU–¶³z½J‘ç!W ú«Ê+b½„ZüXï#i‰¨ÒB8 ”6^YoVþð®ÝQL¤õÌ¡Vɉ„¸Ø!¬ÏÜQ2ßç¸/MHÙÅœGb*Tªð|@p£BáýcŒ¸DaÜŠDe%ÁûûF]Éœ,€•>n0i§ØC\-g§Í@ÐöË. ¢G4—"µõ<#ʼd‰ÊÓªL©Þä:û‡U›êœ(ý9-oÍï<Ž-1Pßp–¢îƒÀK£šzø:GÔü ÷ŸJ5ûªÐKÍ\H,Ä‹Ï@!“c®¹¬Z)ëŒDbèX¶I\m9˜7S˜¤§-RЬˆm„„laë KÖ˜¦S¢AôÚ§™Y¦2ç`uôѨ±9ŸABKE²XÞŸµ ˜ï‚¶uÛ zBÖ¶Ê7Œ~35#ðÅPÝß›&·† W)láV_ NØ]Ü©Zzº åo6@V@›ÊÁ,\á.[R¡o€süÐÈïÓøšßoÃ2q¸«/´³•ž @‚…2ý0á=r(žÔœ¨óMæ/)„Äþ¥—–Å“XÝqPdߥ«WÀÕCÂpc­¯›:¢÷ùå»ÌÕQ?ßt#¸yøÞ–¿ñüeõÚmõveÓ#ÏÁ·¿b¶Ñ¬e6ïKõM>†øTì;ˆ ¦aѺ£0(i{^w€ý°²¾U’Íô†„"‚]ko7ÆØ˜Q³ ËóÙÝ{Ï×xŒÒÓôdy*\Y6£òM9ÿ6Ä óc­Ë:E^=z:ºã¸t]+FÔ¿‘ªØ´ VÖXÆn-=.` Èi]}ò@¾lËΉ_H //ÅqY$×vÈ÷´Ç.ÿ7s*9÷¥IØææ‰%ÙH°Â˜èÊaý”øž¢Úð•þ±{íuQcŒE:—¶ 1*²w;t¡'Ûq—‚e³’§FЙ?h}}àu}¨Q§%xJÂ]v¬ÑA4ïK±âuC5åÿ{t/öF½N9î Ñ–²Jç°ªÞÅÙ7»¨• SPý @Õ ÿ›@²eS"ÈE}ËUã¸k¶°‰jÐCOF¾Ødnˆv³b{ãðËìz“q>Rp¶—ü[1Á?¢#A‚?^×ó!‘Æàâžlð(0}8‚Bø‚ëãP±ÑYÄ9Pó(1ÍñÐó·éK ³´[¯žŒiï#ô$}íÞ‡)¡Z‰±F%ÞêµbŒà™ÍyñSçEeäÕ*óÿTq£‡Zë$š g$â‹à"d6ž»Ejóq8I–ÙYmÂÜn°êÛJ´ÏÕ¬ˆ÷]ΤDªõê éÙ¶üR¶]³H¡½ÈÖƒ ý¢é0hþÆ-Ê&oŸ¶ÒñT…Ámš{ëUær^=ó\„Ä¢wC·Ô—D8hÕÂY´lmzª³ÛhèmÊDwŠ“fCÅ߯“/<Óã^†£ìûÖí€dgù$`ñ`µÛô¡)E·ýD;¢G›ˆ«‹Žì"C$êþ´ŒXðY÷®ž{”O@¼svë(q;¿a˶qý9)«0ÖŠ¬9Ü!´øÛaž`£²c:•ÑD}¢7$©¼<)–­Ï~ÈËNEp4Ï®T`¾p¿““³S*#KqoÒ&0LSWÖ;‡\Êãù§§| xÙ3y^ØX$wsèß|! Ï' y¿J¬mz±oð]ˆ Ûü·!ø·Â;6à4³T=Õ|¬9Åà‚#–EIØÕŽÔR õ®Ÿu,Å­"Áä}•åµJ´tŠL«ÕîU6úǸVÂî{~­ÀæR?f“½ÎýºþËôËǦ²ùF÷SlATìLœZܹ#Ÿtm²Aà+\fˆHZ ^{MžM}$b6SÁ×­¢A™ò¼–ÏÙ|‘š¡.Õ\'ËûU«3Ia`œæ{i"z= æ>x3‘ƒ]›ÆWÍ”ñµü+3—iÙÏl TìZ”J‹1uÃo+º\ »›û¶Ö:¼Yíuì÷,mL½{¬a«xSunT/× O~³ÉløFfã ¶¿ÿe,A¦Á{¬›Ñ5“#ðŸ4Ý4” –T…“ù©I‘œKí¹ëÑB Û±.åæÉ!娂Wv„Âj¼CÞÂ'šsÝ=qXXÞí–œ˜¬Û›£Bþoñ?åç`Jñɧæ`Ø_®Ÿ3¸°–'KúD}6ì6ùÀe ˜mˆxÄ,å¯ GJ¥xßÿƒšæCpñ‰0Ü»êÈŸ×Jì{Ý6â°«`ÊËU2Ls„æw®ÿ €úsâíã1K–¥cST'aÚ§Œ ù‹;`•~ÓÚµHNè©Pzï¥ù*4øøÕ¼ïÛŽëJ÷W2ZIͧÔÉÍÌÒDWx'q¥ï ïl¾‚y×µKmB:BuÑ]G6¦î=ÀÌPXós¥ !˜Wè9O?[çÊÍ—º×­*2Oåü×U›äÁæTËû?0CÚž3ê{¡jf³CU^ˆŒGRǧX/”_­Ìù׌EçÉ™¦d ¨TdWs±T¤§Ó9ØfXÐàÅ#ÁDŠ{kî­¦ÕOl ©´Â4#bw˜–²JnÐt­­|yÔÝ|é‹z}T!‰¡.§éÔ€ äô ·Õçöã~ýrUV9xãºx_mU©¹(æý¨ŠïƒÇÔ†Ø4Ð#’Qy„tEJQw% åm Ø‚Boñ[ah¨%ä‡O=.ÉNâóÉ}DÌÚ#ëÉ[á)`-ÉÈ9r^ÎÙ‘ ;$ä¸f¬Û¹[ÍeF‚:¶D9ÀqÄÿéèR¶YP…„>56Ù»Býcø²cœóÆôn§±~»`'b>Ê‹yE¦¯Ášˆ‚z~½ƒá-c™XÐ…µB3Ó/ð̦ '‚°á²IL¤¿êa´!ÊxJ…äY–rò?+Ô˜k ¿Í ÈÏëÏÜ¿ç ­‰½„\ÿbÓÍ÷X—ízÓÑWÃô`d3–4¿¬lS7­t,‘¦4Wž/þX«¶%HùqõÌþWÁ¯Xß9ÇìïfÝaPE[]UnûA²äIúKM¤„>DHš‰+Ö¼2wÇÂm3­ï®Š„òØÏmU !5(i /ÒN{¹ªë3±´ó\ ¯ ë‘‰ÊŸžEáC¥8å5®ç%«ÄŽùRóIòïñ ¹“É(5?ª%l¸¥ŠYK¼+Ó‚xÀˆx®.6ZᧈEðûV舻•îå˜ãß7·ëÔ°º.Œá^í`hçÉ Ø«…{qNtœ»cr‰ÁŸNP÷$¤êï JZ)ã`9§ií„ qÉÛì×pÝô2>vGkÍKß/g˰ Ï—Üå¢;>z4;—æ¨;4ƒ¢uNÄ Õ ÈÒÚãH¢+ÇŸêZÏLVÍÊ „X~›ß±©Ñ„¸ÒůÃÊ?-þì!îô=é‹¢9uªçÂfQçùÈYÏLë¬|´É˲ûúëßÌyw׉VØÒÔÜÆÊV,JŽ=T-3”ô|D! ´¬Dã·îUÆ~N ©È†V|¥âxPž 1¸Uoc.V«Rú]#gxq9=þúûMŒ²«ôw!ÑîAhÅ€ß%FtC„Ò#zN?˜ÕßÍà8H®¿»>‡Ñ½Ð…BJ[DK5|!=Íæä÷¢CeùH¼ù‘Ïq,™E²"«h9fót“ “mO1ObκNŒÕ­ 6R6 %èÅVã4üåÎNŒƒF%²‘¯ä{ÕmRiGõ.HÖ¶]£÷Z°ÊÏ¿ÝÞù᜺Rv:$¦ùô§¥Lñ=üå;]¶4Pp{€?´‡¶¹wÁÂ(€ô…œù­z¡óÌ+3¦Õ'Ò„‘£8d‘Â., $¼oYö1CFNö,°é~?ð]«\¢Þ|<ÉŠÎ’ÐÚx±Ù|¦~çZÖc>élL£Û~rå`I–Qí—&_nÅî=]Æ`"¯ó»±«½š,Kb†¿H_— Ž–t­³Dœ,‹‡1‘e6ªÖ€Æ‰¥|?± €jFÌ£ vÔK”K1µŸŽÍÏOÃ꽋xá°>úZ¦#‡¹g›}‰óxOißKÊ«ÇÊûãq-ã箫 ÖOº¢‚Ïì¡dEuk®ÐÊ“ç\D» 8üØr3|"ç×öþí¥‘èÌ9^7àú8e,¼QÀi] ÝÛöt~w-sN£ì;'ŽZõZ¦ƒçnÆY iˆá5ÕöL¤CA\“³ƒèw”*Aé5¤Ÿ@©êãÊXìxäxò]À,ÄäLlM:¯¼ñf òØ–\õÌ´€RJu_¥(„m¨xêdv£Ì7£Å@9ˆ6Ì«°Ö8Á[ª´ CM@ZÞÞ¤þ‰>@ŠÚ {TÌaXzA[KǬ.â‡sèžmÕ/QqS8ð>žJ¬Z\Ìmh¨º¾ë ´›½Ÿ,rCyx¸¤àøJ2’IÄ#k¡›GkHc€û®ø8¯¼·s T9]–°*¿:tíÖ˜1•¬žÈÑÓ—¯åyöµ(Ä2@W˜â.8Ê™ÁqI¶šÞWn=ô¸˜¿=zˆ&{Ñ>,ίdõA“yK8¬•d¡hî£ùí„e/ë&F”d€­{qûÙí–3'WkÄ`†¾QE{¯‹í£Ù0q¸Î©\^ðÈòçõ¬A—âò…ÀuIÆ»òý_ÑGÁ®™?5êÖk³¦èOnzªYi-BÐ-Àä°úo¢@q½ä~LE4°!}îËÕ Ñy#˜ðF„ÍÌ8ªÛÆ €ù áAnÕê c½„,d»·O(pC/w¥wmei4žì+UI„޶tø_ÖA‡ûâ3Z„iªý—B$mGBÿ~ü(ù…#([Íý…ºraò¸nšŸ5o%æ ø&~rKV\l‘Ž‹­ó °€31B0&#ÐÙÓ¡ò…F»Ò"]EŠc×nÄJ\$ç"š[l'¸2 \"zå*Óg|Ø|ΚĦ¾¹TѲ¾ýˆÄبáMÇj»×Ŧ›T²Ï¼å"½š9ÔÚ_RÍAÿD^ šú™ƒFLÍ(@)>õe‚õ8y 6‘Uúð˜¯JžWuž—µGí$"2ÿ<©â&ÃÒ•7Ä€¥\7|·ž%N¶Ÿð1&‚à ä¸z·û‰\wI+¬fYf—Òc_8‡ÿ0Ôe¡"u6±Æjæ6¹†LÙDß„Ânt¡N¼}‹8CVW’…ïÅ K´g§¨Jk’è»>?àÇ—þf"ìÕáüÁJhö!‰ÂJ[n&«’㪧¸ríZQá°‘ñð7ðWí ƒ¹Ô2Ìö.ñðÊ£p_ÏsV-9¤›U̧ômµ ®Ö©Û*ìF$ .y… n:0ËçùÒ¥Áøµ'ßö-U]³Ie¹2Ð)Ì)çè¿aФzN‡¿å×ôË }ªð"'š©ˆÐC5‰0•ÉcLf=1÷+T7Î30dëÅhL4óùbf<« @ÝØ—žä炉 À¹Ò­Ø>&‘| )©§˜JÈn¸_lÀÕ¾åàGC=ñTû@¢cvY—JÊûÔÜîýŠüyÑ€‹'Gñð?”ÌFhw²ÃÇÁ4ܨì]ÙlÀˆãACÏ%'©ªzPáM‰]tK²w1HdU!ÅV^lJ/OÒï oLøSà}òKÿu€ë¿ b"òÄ 3#|ÅJ¤r¨ Áϸ[i:Š|ófÿe¯ÜŒŠØ¢çÆúMßYÐ[¹Rª‡ON6~å«•(†²è{Qç/)ØÏ²Ý3ût˜h-¶$ÃÎØ(=½C™ÐïšÖÓÞ-} Ë€©y9ˆøàµ@j”¢k\.ŠjþÿHØÔãÒ‡Ô\¶X™.; žy“†Y x‚ðƒ*’âYb€$úц¢ÔŽv KOPË¡Á¢}—ÜY€k,ÌÜI¨¡Åï(‹VŠ8³ºT´¼‡RfÔÖ‘1 ».Á,´šLœµªi>zŸÅÈÏcqîzÛ­Ö\\ò—Únzý¤gîÒ°˜ Ì¢—lö0WEÝ¢7\ ŽuþÉñËN¸q =È?q›8°€waßMR>¡‘¼¿k+N¸0¿%ú…$p0TB– ó;v°éUp%lU|sÕ±mÆ”;j襕…Üë3¸™å9~l>„Ô„2qþZ¯®ùÌÎÀs“ÆWžzþñ,UPÕ ]RÑðaè1?IÞ˜mqhúÁº_ûCRÞ º¹&àCû,õXÖå@„Ç+5ÑÛ\3º$ĵíj ËabÂvoÈEÊØÿM|÷î¶%Ú­þr+qÍmþoN<nËU`Ù ÿ1Î-š‘R6j‘ÄìXCcÕìXZC|Þ¸E؇›ž·°ºJ^%=ƒÜ. w÷&XÈeÓsg£¨U ×,ùÏJܤQÆ¢9FŠÑ†:þ¼yɾ€LÕûPý=$ƒÿ€yú£Ñ çcüUÀ@¨š\.,öš+iéY÷ o FÈùÂùéNg»Q4TßÕû:ãÐ9ÂAÞ»{•_¶ØT”“}Ov¶ÆÏ·¨÷¾t k¬öͦIª­ÂFG0% $QÅâ0p¤LúØz]a¿ÓyJ }iõ¿5 '2‚9†G”£D™4¿è›Ø[Vù6Døñ­ì&˜ÕÛ-W/á ·c¢»×Õ¬ü£ù{Çþºƒ}àÞƒs\çÀD7ò¿u y\¥t=Òß]І¾r{žC½1f .:ô)˜a,áôžKïð-¤IމÆç‘q*ÐÔˆ,«‹Ë¶ü¦~ÓÕ÷Í’_à"DÏÓ‹/…$6'm‡ÿiÿ8Æ–lÄ*òÔ¯ñ¦K÷ˆ«í“—²ïã¤=ˆ/¶)€>"ðâOi¡,Îí–ªÍß,n†Ii¨þmEƒR¹m1¿v`|ÙÉÞIùÕŠ2!³vö͇hüñYAm©šµKΡ?9«Ü<¬W Ä;¬KÜ«PWNÐòKdKým´3¢ê†Ô6—ó…¼ÓgS[ºÃ9šŽ®KÁQ#á'ÁH­<×@ðz{]Ž]P¦¸U0´xцºœm ƒ‰$d»ùûõ)лn›ZrzÈJ¿^]qòq)A‚»Ô`Û:›iݘ.uû;]‚…*ĺ¶åxhÈÌ7ðÉb­ÂŒRšpç‘qo~³Ç&d0>`Í?ê»~Ø™ÝdJbm«Ô|uÏó{H^ÓÛ®zÓ¬ø¦ÜRl=2Ô lS™¯é ®¡៮‡£é Ž\1¾(Qž \1ò“4ƒ{Tþ¶âß¹‚¸—Eñኂ &ä¤ÎÊ>ôxŽBHºIÌ—Áž”ã*«,è°=0yá±+­#J=‘œÀ[KI§DÿvÞ¼ÿ@xÖ ÎJ† ô%L"pÁá&fƱ“˜Pº¸@_7ª¹NcÎøf} bÏs®ÜÓ®G9í)$>xˆ$ý†³?”­7©ç º,.ý?Š"Ù{z}<]M¼@BÛû!Ñq¯ô§d!ýB}…àd{N6ç*‘y—9¦‘ Û&.ä{ÑéÖ&·B>á'H±s‰Àd{Oq˜å@LJÍêd°' ixû$ÿƒë=ÿЫëË Ž‚ÞvÉs…Œ¡¶»:íäÚ«Ó­5$AíµÇI^¾ï§‘ ؆ÐrҠУªÚYï4÷µØþ‰Z }~vv¡w̤$ˆ›%ð}ébˆ™¾¶®bbŒ1¸ýïÌÆŒ[!?ÿ|$êà÷>UíLÛ/*¶#>(-bÊ:¸Ð'¬³ž€„ÿ,½C0µ±²Ì2„-~Ðþ]Ì|Nw™ iÃM@à[ÃŒòÇ$;”‹”s!ã $œ›Íí¤‹À"‡g••½üµÎ‡>]Ë@A;T_vº§BmíËv‰å¦í`ØÜTq¨Žg¡d:êp2¡½Cƒ¼dD¼öc,襲/ÖˆˆÚ¡4ûã¯@f“Â+çÚŒé[wzɰߔ {ê9X_˜¿Ãé@-:øªà›âÔ]k9޾o2¸¦Áöëwô¤SeùU:‰gmú…‚A¡Özƒ æXÆðV&ŽÍ{ RP`a'0àÂCÉ ÁšËF3º—&ôD4Ô»¬ÉÌ%oÒ®ê|çC±ÃŒQ-NÿYøJ”EIÕĽÓBËâ僊GÄ5¥B…2•Dìö7é)[Õ 9éœZØ(ò;'ã ÁzÄä lÐ@µçe3;IƒF(G÷Ƨ@ÂfŠº|5À}!D0ò…"‚ŒŒ,CÒíÕŒf}Y>KBÖÎW:ö.¡üÀc¶f[ˆ,¡·Wm| \ÕXFd€ +0'Gk,œ¬Þ}½ªü³‘ëíÙø¢DÊp©«žUgqòVoèŽî\D…œQŸŽë…wK;½(á€:’¥ã róªÆ¸˜’•”äQ¤ 9{çpä6º?f~ gº''í;77ì`᎛ö‘˜—#™¨iÄ÷Jšå Z‹Ÿò—o«É޹sÙn­% $¾2+³ä´à¡ìñæïay¨NRôl˜¢ý Ü0q˜±vÈ´Mpý&§ –ïe(=D›•ã o½éP¤ CCRƒ÷ÕÓ„mæ±Â*.ÞbûÈëS´7_ÛÞ%"dÌe:YܵÂ{?/nùå®>š9• ÕYÞ‡ÈBß^£Ð»ÚÇ §å£ïØ‘~ Éú!öÈ9‰nVñ1ò ÆÁôðNÉÜÉ>|…±üù2*Pöiµþà±Uø•š šö?ºåH἗缤­¿åu9CÌÊP0»Îÿz'¢1ÓŒüºÇ«òÚOX~†“Úh`< ð}zSÑß?ßÉŒd›Ä2¦˜ç,ë`……ÒÁdç¬êÝ÷eö£úá"jUÇI> 36½Ò AP¡Kh«`º<¼O—l …aßEþF>0&›`âêcôT ]IÁû—˜2Qó£PÕ²³#¹½^̯D²ÅΗöw;£x`ªëTÙs*BÓ³¥°Ú©¡æ‘w]]²»ƒÌÒ? ‘³3²²i ®¶…tö;õ:¦ÓhªÙb™í¢¤_Ærj¡æA$ 3În¨ÃUÈ‹?äÖ6×,©´m!u佸U7öð ÕbÆ¢W0•i¥Ö  ð3 –ã?쳎ÉßwðŸÅ41(«Ó ê©Y„þ\h6þ«ù­‘³3lêìm-r^ÿzãŠ1 ;§hB‡`†Å a$²CãEZ?ymÓ±¤110cäó!‚Õ6éÏÑEuêÒKlνêžzª¨^ëßÓ:»co€1üÏVFÔä•€CJ‰Lr5Úۄ܌ے²eœ'®¦ ÎNê!Y!ˆYÆCGB«¹{‹ðˆc6j·Àº•=nI[<`Õhvø¤]= ïéá=u0Æpºw³àϾŒü\‡iÉ|…AÌ’4ï[¯o´í›CÞm<ÿÝÝy£•ÒwéàÀbcV--'TíOzg× 1ÏA…cP™œÜ'ÑŰ®b…Š%Gµ ¬Ç{B2Ц{i«ÖB×dT?ø>îð¾÷²’y¿½=ÐA低+ƶ*R­ð/ÿÿ| ;*?yaz*b³îï׽ȉûÇÖ¨¸­V,»jÜúS¥û¤9´\Xïy-FñpO©Ó.yO‰±áŠœÄ•ÕË=Þ&è™X"P·;_݈â¢[- rG‚šÓì*Ã-ª–ÊÙqé¨o¼ mhMøÇ<, ØDè…]E»aaáXéû˜‰øbòrC^4â-ìø0 Ë IÏ[<çM•~Ý‘îÿP…喴ކ¿’ž|-b»~Z†».ò¿bÚòD}Ô4}gpÅ¢Ÿºex@Žo4¯ñŽÍ>ëEé¦èpæðåÏîóv0«ÊÊdΫ=pçë]>…©¾Ÿpë “ã½;(›^LÜT¼ÒÚC’åµ™´Ü¥å=¼Ÿ à°´éþ>zÔVóiÝH£.6#R©tû8ýfX3W±e3à»RVÇó>ã÷·"ßµ9Hï²÷NðxQ€CÜÁG [Ù73:^¹üìaC^üiÿx¬%ÕÕì…ƒ§~š}:!EÁ£0;XËô¨O]* •!ØTæ¼…7'¡yӢй‡Z£ÑvFî…„x-ZpýwÅ"˜Ñè)sY™öysȧ­{ Cüáxjlöóé‘097ƾ9‹k³)¥ÖT¼”¿÷ØÁÀ¯Ê·ñPê˜ø».kôluÇ/žQ¿'qXµ!'­Wì`Hê™’`@®é¡§3zv¬µd»Ó»A]“_Þ"<; %vy/Û…n2·Ó€°VœjåÿT@‡;€ß2ÿYuGâ{ÙxpÚ²Â]ÜëRÅfҨ̇Bª^Î]°Î=¥ëN2h s’™Œ˜†5îûÅ:Hæá-hÇÍû{`#!›V0õX¶1TS/>‹8Åb´%—ÊñR¡£ƒÃ‚>úÍ‹%ª„×÷êîJ eïˆMË[ÅäÔ¦ËÈàü9ÚÝ$ÿWU^<Çüþ33nßD}þêÑÎüÌ­qJ<¡l=ˆ9Êdf¥G´‹"}}ÞÜûæiúiY[çølw®Cõ™€”$LCºÔ‘Pvùbù©ÅÕ•l·@ÏÐOóO€À %Æùeÿcl =O•Æí}³^DK©ÿV½GB F'FbOÓVI *–é¬Øà†’%ÔŸú»õååFFA У^8>'4Œ‚“­6Þ“Îéã¢1Z¼×ÝBßF .®‡8™às‡yÎÆã¸tC) 0¿°‘‡øÕGñ=ƒ¨‡µLÓåJ£áØAy,À‚"*&†¦ÒRõ÷|qO§hçÔxÍûøóÓIßͽk²Ù¼Ž€V‡ 2¾R®À¢O˜¨¨,¸ €Ú19læžZø_þâîïXÌðŠU‚M}ÿfé9 T©Û¢ÔB˜•&¾u3ß„u8üÃÄBz(¤rn±uý À!Œa#Ö‘J£ð‰ùÛ5ߣš¼øÎ<*ëÎ4€}–em »¨Ḛ̀[ócr3>ð2l1§õdNC-íØ|ʸÒã?E `Pb¤É¦ÞPùÔÀ@wRGfª~¶„!=+`øzQé”0ˆŽ†%ßÒ°¤?·þœ/ÿƒûVY>$â5¿ÍzJAž°À´u^}±lÛ~Ä»±öü(5"ãH78*±×ô™¬µyô˾7VRÿ , ~¦Iß:‘³G…{L#ºKÔ•ŠM&³¥·æ@À±Ñ¸¸Ïé$Y„¶sÔîPsÂ1’±z&>àŠ¤3Âk;þÉçvçÒ"Ø{ö_v%uI4$$Dö_þü`Ó·N~+îªW`þaD å2vkð¨E"Q²·ú7RˆþXçî*0p?µå{’4 _IÀ3’–¡°g¾¢b[Û¯ŸˆmÌ1ø7•úaû_¼@êüª\%`yÆŽ%Ö£Äc¼êçµÕOÖŒî4ÐCx©Èãê”E?*oiÖQÆ"ì³õ!½0¬´H±€WvøŠ€|× ¹ŸÇ q Ï÷.q¤^]s·ÃHHk¡?nÉŠi{Ü€ðqÕ†oŸ@ŠéŸq¡2Šÿ"Q•¼z4ãßËÀŒŠV ƒ£_"0á‚ö¬Vͦ)ĺәs~?ègŇò@ MËÅÙS«f‚38™EqÄ;À»‘*…`7Šå± -+en iüÃ1y¡¸FÔ;ˆ8lt(ü#\žDgû!;)a†tð@©! ÎØýáÔ‹fË+·×ã-^± “sw •ñ~ðÍý:; ¬ÓTÞl„ˆØ ýÜ"RÞ$‘n#°9­Âi’èÝÇYÞ¹žðCB:F˜´œùœït,œ*Ø=œ¯yß »¦™þÏôë!ùsà ­6{”îÛÊð`5>.…:} õùIíyi5ëž¾‹¢°L f¥;М¬_ˆá—ˆ/î2É{Þ" ýWH”DvB¼`óÙã\ îmï¤FÎ@êLG¾*ÐF— @S:ÿ9ˆWh aÉ—ü4§ÝHÒ=LÐÏSþ·!ÜŒ âž³/+ÄE6ÅTwj?§-¼ƒ‰¢:\äY|W­JEù.Pm¡”‘>H¢Êó’ôeØ3² >.õÏøáˆ4¦êç‚Cªy Óv;oÚhåW_é½µH! %bU®ï'D·°ÓûF?gø/)®u<¼5î*ÙÉÞ{f±+žzËA32ä(&kñÑapé˜Ãþ®-,-äv3‡…@˜F#>H¶e˜š&иÔKtûÃag—‚t”â¨ešöí±Û^¾fu–}:--²)Uöa!ÇNn1¸»¦»I¥<Ü%ã5)º{9ßY3™D™CDT%¶rKP;ԟ‘—Ø di/%øV61vSŠ>y<ñ~Vª÷Qlùn\b7~êØ H5y‘5Ø^R «à»HY†ä|êWè³þ ÄúJàPß+üà SŸªÜåÿ‰¤ ΊGÌtPdUÄ˵Pá‹2ýÞ"‚3Y¥Y>9¶“™’ôkç–Š€_¸Ìéè·¢OØ‘ë/4z¢¹ñd{øÌÄ=XÌ8®%äÊÏÊ“U©ìÞO4>G§DTdñÄÇ/@W­+‹„UIEòÒHcæã"gå£.°ÚáÅKzéîʘÕ~P¦¬˜ŸuDbr¸«ÛÝNý‰qb‚ÌBwrq’|Y#£{N_¯Ñ×^ ]i$ƒM“µ’þ⮟ Ñ2r¿5L1hóC ÂŽ±CSl×"ñçbº_‡§þ”{×9Hóc¤=ulQpê«Ç9)¨rÈÃFÝÚÃõ=ôz ¡l.Í…½ñ¿þi5†Ík*öHh2̓–ûkLúËuk:"³|¦Uºû¼!ù÷ñ[ól„*u‹%ŒèÒKD$‚;göÿXÞ–Lx ;EÒUÅ|˜ˆv§åëa·V«J '“¼ˆÐ¤Çü*Â5FÿQP× n@"´ºr”ê¢ÿEá2öŸ[óŽÙ“‰Ëh† `â¥A… êBL9GMzçRÇž»äùš#qðbŠ4£®V€v[A*¸(˜îfShD%WëLÍPÏš{éq¼Ž'ËÛÙda(ïÀ'*%(yÕžn@dg$—¾T ÔêxÒgðÕ]ùmYÏåó#×ÃJ‚ Ùýõ¿E?ƒ_Ù¥ø&–ï–|ÅÀ‹½†Y>²Ñ`¿»¾lEÔp>hm¤Œ±Ëɶú³?nÅN~íA” —H÷f2£Áµð4•1ߨýLÆj¥øO]6£°=eÞž¶ ]Y@@´Ïc­Ï¦Š(mÌHƒx³$X£"ÖÜ9]R2sGšïâ^Ù‹#ÐVŠy£U,»êµà‚£Å`‰$ñIlòDݬÜÞ”sÿ6ê 2ŸË ·GúºÀéö9·ž`µŽ´ã“…Dg#\¸´ù=H~Q¤—<ûÝ¢´}Þn .ë\rЂð)ÅìŠ|ÊÇm~&¥6’flÚ- ]ˆM€È,éï;þHÕæ>8¥±uX!³í|±Ií?q1¸häHGË ÚVÒ`}µ·è©“Ut O&mæEÓÿw˜êEE›þóë$¹Ýž’ˆEæwœ¹l8 ÇmYj¥Ä®Êi¥È°ª3Ì Ñfñ-¿"`k=”¹´ŸÈ‹˜÷a•I9BêHÙD]×VóObW#Ð`Å—;È+[/ â?wlA·¸Þ Œ€ÃVUNxé›*¬œU;4·åÉ™åÓhzY¹ñÉc —<ZÅa.cÞ1xã5µAFñÌ4“¬O£Œ¼)î‘]±hç çüRì ôáØx3d2x’x´8Nhî[ Ó(7î$1»hƒãÒ2=û|+ÅÓN–t 3¸Þð9ÊøÂ±õpl~ô1´Ò5uqœ½±þ̹9§1‹’G‰6ÏÝè_¬F^ˆK±IîaGÓv™s4 ·Ñ'8¯„‡( ñ?ýHU¿Hù¢= Ë”A}¥lâSë))­ ÓåÊ*+u¶è«[z/!/"XÕÆÖÞ’¢ó±¹ÑB]>ä?òJŸ÷u¦1Óˆ_M”U]2¬›Ä¼îý̰iîP‘id¦éply‚¥xæZÅôtjï9„ <[â¹É»ý¤·Ërš¶Ò–Ô@~…¦•ÒØ‰F‰ãƒãc8·; žläp ¨®0í^8°sšEL[S@õãxzÛw®[Êî?ö¶¶ê6ðåúÄóÞ.ì!³æ ={HñÙà½0(Žã»³ÌÂÀ+@ðË…n܆3pÂ)éê9øîîp 2³ãöÏy ÇÑò0k‘‚ÿ31 ¾…7)}gpOø¦5Œ3õ*ˆQ5ñt㹋ì1¤5O¥m”5¿Á^p&;ve{Ú¾¬ÇIÆþU$œg’mŠshÇ[LSL­aùÈžøKÜÉøDÉê×rkQÜ´ ô!©Œq€o…±»ýŠôøÜx›·0(K„¨8 Ò±„Y-{³“ˆ¬|s1CbÿF„p™¦|z4•¤ÝaÒNöÂÛ±C¸ÞIÎüþÚÆŒßê;¤)î¦×%z0Š@“ÂÂ%$À™7>ÖÆ¿ÊĆ7Hœks”ÅÎ( ¤EQ(0ÈCWù«¥ûÇŽa…€'ø•9&ô˜‹Fvc2$ñcN?û È»ÃËŠ¿³-…ˆJÕVÆV,õ@ƒEtë\#þ‡Mõšñ‘ÕÉxùHs,o€{„³ôy"—nM”Þ?AaŽÜ„ZéMüšQ>~D·¸„«º6¼‘™=2 W ðBDðñ'ÏsO/ýùvÔð¦G3ÃÓíí[}z„ASí_\ºVåkŸ8mUÄ}Fr ä ¥üÀ ê Íú=l“ôr Fó5¡YŠ‚r-„Û ¥æ Òk×&•pë½›}è(콃ȲÏÐ’áŽ>1þ/®mòµ‹#Ö˜€ƒÍÛDÉ>ì0»Z*ÿå5Œ¹‘…V"UÄ)óžMyð1”ðhã‘»Ñk\"kñšÔBÚÑ §G?òˆ’¨a%\>sB5¶]Î ÷ ö«n3¸|&®V®TÉåzü/ç“ÃZÜ'¦S07Õ%¿Èoè=€&i!„S.;6Â~Öp+˜˜©”€ÄLñ^íâX0MCý4D?,â ˜ö8abÎqÎ'5VT¬ãÊ ò·“½*ØÅ€yŽNBö+Ö™¤ÿbBKËño‚cÃËháçÂGúp|?.©oáµig)7^-ÒšœO'À}zSSŸ ‘2Iºõ{èŒ?ù ñ¡$í…h¢©^vÂñ÷Sˆÿ{…PC¬‡åX„DÈ#ˆVܸi²ôÈÛ1ç"L™Ä¾°Ü—q<Ɖ!Ê¢á ¨GapñCE¾â_XB²¡7v0$O–àûc°2&êÀÆØØ$3#]»ÄŠ—Ê¨ô·éå·žq;¦‡ þš¼bB’A»‰B^6ø‰˜GËÝ0Â?(ä}ôœ®š­ÚÁÑ2RÝ‚ÎP=0²ÌÂ%¬Xj:‰©´"w×fîÅ=@ŸÈõNsUï[WMÅMñÃvú2KЗïz¼ÚÖÄ%[Ü£«ÝŒÓZ—Îï÷ê¯s5c‡³}œÚ óRè(wÑl`!ê•<Ïö¡¨êJçâöQKÉØç™–”„äY6÷ªŸZªSć·2ÆAœ¡…s9}výK½fƒ²IÅÓùl0Ú °‰H<¨ƒÄD—ÖØÓ¤côö´å&?‡¤áÁ·aÂŒÁ|9]=—•.Ôñ‰lyÏ.ñ6‘ˆ]¼ÍxÕP æZL«Ëºg„O™. :Œ•mv w4©*÷|E«vvXpÆOL£¸R0ÃtùIœJ*ÓŽàÞI]”MOñ¯›°mQ®Cü.cHÕÍÐm}M¤ßð8aRsfüÅó‰¿ÆÝ7òxÐ7¡+ÅJs r5¯kG«$Ú ¯ŸqgÓÕ`þbÊj”4ÁúR®Ҟgy²Bû~ ŸP ÀÐë‹!Ë=¯ÐX¨@ü‰+a—À])};@&Ê$†’þ&ëóÁMTFã®FÎ¥=ñß#JÝŸ›¢åð;Ï2e–ü{eD©[€ÇPKÂRÙJIpåšOž{înºØ!ÞèÖ¯æeì}Œ$ºS÷$1IµGžì¼rá½P0©¯”¶qô¦ùhŸ¤t‡[•̤€5&ï´ c;ÜKÉ]ò“~ônåC Íö–àµÌb¨+ékµ¸˜u.f^eŸÛÉáÛ±˜ñAÉõø?_YÖŠN„ÃôÌ«glêûWþ'Ì÷øß‰/#t[êiEÁY!néR—|v„{=G!ºy¦îw9çd³¿ ©—‚ÿv‹dÀXóz~ñ)ºá»Öü*0Œàò‚ðÇEBØ—ªêx>føÌÀQRËj#ÝA§lyu5R¿>,øÀ±ÒC0ÎNÉ50–×ð17É&^í·]3Ó’ç…0f’ó˜ow#HÄê^µy*%bz¬Srª¯v›]^›I[ ]y’d“îκÇZÑr'Õw5…UZ+±mi‹Ø‹¾¢ó<šp Ákä•öp¬é~Äø4`ýjimÿ@"öœhEá£1s¨ír‘©nÝ„ØéÌŒAi*¥+°y]q9Ù{K¨‹)¬ä§èòµó\Ÿ=‚@X=zÆpÈFDïtZð³çð~ŸE@”È—ŒÚi( D×î¬ßê±½ ìC+ÊóÌVNoDBêrøCD@RÀz^"ÓÒ%ú—p¯vÝ5HäÖ:]ñ}Jèö/î8g–Q8X!‚ØnKW"BDuƒR…ÜÒ‡¥‹`¨Æ£­¥J3Ã8ßfý×{þ ©Ï'âø —Þ ®'Zj ºŒ¶¬ÖÝÞ>0ZÕΘdÈ&Úo]6S4ˆàoßçæl…9±ò€¢5ÌÏqH´œN¢“B§ºyÔÔé[¼èïKDÂ"rqò¯ˆÑµ™ïR¤ñ.Ûm­\òäiĤú,¡±þâ³ü~ýõ*ÈH²OüA\é$Œ÷> T?!ùº-F}5ç$G~PæTZd¤\-Fw”.ä å³üÛŠ+[”5¹Äÿ m‰’Ãé}búÕPw’þ= ž’í÷įʻá^^Êá)*Í´Å)M£TÆJÔ†!Æ_DÃÑšímÐøÿq02^#ÒÛ)¹gcœTÕosŽkšJ¤KÈ”Iâ-]fžDâþ0gòÑþ*—;¾ô”˜,v³ò*ìlª¾:ð¨+MU…ËÀdáÐÏì°¸ü¿Væ“>3Ò†‡óJl©ËlhJ†\–A1†ß\ÁªÿI§O>O­4O»#«Ðȶî~¥—΂««\ìKcË•ÔtÆ6µT†€ÈcÚQÖ0g^ˆœ Ò û€æxûö"æXÚ*Úñ|îPôóÁŠÀˆõlq&”¡¢%ÚÕ6ÇTã¢~š³G²Ê=ü3æ<‡£¸¡òÎ¥< Ô1Œª{`%ü™ÃdNÓ‰OnÛ¼Pßå3û6¥_ …ÐB}³Ö¸·ÐŸÁQ¦}©©H ›¿º*F‘fBíbŸ³H¨Ï1§ï™š¦z8˜#Ï4!b¬D: o”?¾ù©y¬ì‰ª±ä¨ ìœÑe“Æ…¢O5Zl ”_ÅÖ^— MCÖð¥è‡ˆâ–^ƒ%â¯G3Lj}–  `@ËÔ6©|¢èZªøÝ¸‡I9*¾î•·”î%iO¥É=“ŠÔ†èà^Á`P%ý)Ñ0)ž}ŒzK‹¹óNí„Ú< _C ¿? ¸ŒWZ„Õ<@ÏýhÑt¦sñ74Y9de·^¹¢á-[-õ±¹i†¨jRÛVš… ç‹BúÄ»zQä|êT'h’0þ—¿IRØ›P#òÙc8ø**¸¨tlã äaòÜ‚tG!Y3Ùâi%+¯´ýUOF:¯¤qÂf(ß\Ò!3u‹ UfHHŽÿuß„T«#ñóüº¼*ZPyà€CÄ´Kìpß[(Á³æ%ˆëš}á¤oÀP½r¢b}‚æ³Ó$Oh~>gÕ1ãúÊþ ¼8 gxw"Sq9µéÍ$˜½çùÈcõDx9l´˜N)ò\‡ºÿ»¶ÜÕ:ñbX2 ­*¿’òÐ ïPTBÂ'­DÙõ[Š"Âux‚¯Š¦þßg›l·éɃ .ƒ˜Ý”<•Å…”¨V®eƒg4‰s}#Å´Å^Ikaå«¡ o™I8,ÝËœ?f/#).µß€]ƒ|“îx7ä[V cw×(KLØÞ;ØòÚB°ÔH¸êíô­£¶ZƒÄÆðÃS×5Nµ“²åPí™zP£½°É à ê,u¸‘®]͆DT‡djh¦¯í‡e‘×0ÔõÜ_T,¥×+mÄäU߃*ø þd{ëW)ÆyóPêÏïÓª|©e®?j_Tº\ÎÂ×ê©“ÊÇvÿZsôo³ÚîŒÒbdS^Æ1ÅàLh®öÚÈøí!X¡™´ ®·*l<Õ/È?Î(-eì³çŠ'Ó}ë™}æ/ì=ZPµPâYvÅ+n˜DÑH•_ÅÄŠ£Ûûƒ}¾Â8 ƒ,‘í®ÎÂ`³>;ë¸gKf-ÿsÙõ~+K!'s)k'+H4À˜•Á•žsžèˆè+Ubd˜ù·Þž¿UžI’ˆÎ1Žñ-àŒR£C-ÔA£ú­„að“a›Ú0:;o1 åÐÏS“C!•âö™ÖÝ¿…ªÕâ%Mc‘ôy/ÒÖó÷“im†H÷{ççX]Vч†W·+Q‡F¶®Ÿæyé?øVSu¦ Kbó—s, ¯ e5:4D;i´‡“#rl€'Æ¡á 0Øú;6Ýd¨Žøy)a÷++МŠÖXñ9×N÷g:¹¬òÏuYR´ôé[R ™®¤&I\ÈÏvUê5Ù>ÇŽ‚!”l…h“é ¨ 494 ·B@´mºiÐï«7ôÛ ¬l }üxê‹:Xîú„&³d}$›õpfÒ×uÕôG;¨S£Àu8O.$ÚŒ2­-(FÌó{·i)¢ ùmjoTÞ–š& ÄtÕMlœfÿOLB_€­YÖÿ{úºE0Âç㌸Ïè'ˆ‚,|Âu®üÿ?¡$q›ö¥žÐ¬òµ/ÅšÕW•A<ôéKôÇaØð{ÛàL[ñAAÙP Àù¤RÙÀßÔÏ©Í@­q“}ñî¥v øÕÆ÷øœPŒõþ's°6a£-+…?½{ö4‹J¸bïVùw²þ¾i3eRïÐ5"Ö‡µxC®EE-í¤¾íï2`éc¸=–³9š€=מ8It ÐA˜"aXÇT¬wfS?%EŸƒ±m¢—U3êœØµ“–ªÁÉ—ÔH,!¼sûme9¦2•.ök´‡Êá!>E {Þ¢ Š$þÆ#!>H…¬UæLÌjN¬wX 6hŒÜH»/â\c¡T”¶õï¬G‚Ë(ʜÿk³H¯ ñþ_6þ³ûp¡ˆëe\CªÞ©#íl‚sÉɺpE³¿¸€NŒž…²£-ÒfKnåý“ó¡#ù˜×ˆôñmÐKÀùuñ“ ¹ÛËòjÈϸ 7ä\e6B¯6Ú»)‡xoÀÞœÉ\3•NˆIJð^Ôó!d>ÖÄX’8¤æI!kÎ5½dª÷EŠ%ò“uÞ£ ]OÞb¥{uFxbbÓP¼§¡E‘ÐÉSz𗻥^ÄÐPpKŒsOã—±`P|Î Òu´utZ£§ ôvVLk*TL¹µbì fõgœ„ß3IðNËÑ` é!4y1„‘eµ}ê«ëL€Ë´A¿t[«DþG–>ÙSjúBÈ14:Y1O?yõѧCm™ ÈPÖì‚߉ŸºxŽsZR¾¤.(qR0Xïìý¡æýtÙnvØP”G~/ê@ãÚù¯Ç¥s>Œ×vø1\îOòb†¢£vBåû™é·—ÙA('"·Yw×us‹CÍüƒmA-iyˆe(ccLE\NzŽJJ K‘ÉTI‹ÝS´óqÛűc¬÷'?òБ¢œ'ɶãÿ?u¹-ži|Ph¶èIšïÿ5Ö†uÎ=ó塾yÐáÊ*…PG5ùÔe—C…( ÇåaÕÙh1YHøðêx{¢¥ åM¹n¼y 4yÁÄÖω %[ß|Oìχ³… èö.€3Ž‹–G÷Æ´(iVh$‘³ºä¼ß"’©65'!Ñ÷Kªc|¡æ;éo?[Þí%ÎþyHˆMH’å6s;'õ73¶óN«ƒ̪ù{P2ˆCŸüÙ W¿š{2\èȽ—Pýo!°ÆMxZáÂg–šèª¬Õqò‡-Ä ¬óL ‚AŠgÇñ+v7gŽëp¬3‚/-È®eŸÃr•¤ÅywERQd Ï>ÓtHñŒ¢Vj.AüÈyâ¥/öŠvn@)Ç´Û"õ6[Øü­†‡gß €5óX¿¬¯Cö ÇÁhéñeÌŸÖÅi5 œ8ríUtÔùØ¡T%Vþäï^Kg½”p§t[èSǽ7/Œ%Òºé]¶èÅg/tø~ô!ŸäÁpÑ?Å¢/Z@[Š6…Û ¹Ï\6~89Ôá²]ÿpCe$0AÙéšÊ ¦Ö§Âs}%P§‹H&ê °Æ^;°`ÎùÝt0®DÜ£ÇL‘±«8ç“e¿ ð=¤ÁLŠãêègEá€ÓÇšWÓ̶£™ iFhEÒnðó0GÝêèQ”¢¡Óá< Ñãö¥^[À›ú–Ò†]Y&¢ S% <¾1.Š7*9A&¿g`ƒß2Æ­Ÿ¹àØj '6z«nt_, R-qÜ@MîZY R¸aRI¯Ë&Ø=1ô–èB1r€*Îhcè äÞX\‚Ò›‰J›¯¥Êસöaœë¸M%£¡‚`å!¿˜¨U¯ 3Å+â`¤2 öyÎW/²`%ËR=¼ü•š™U‡Ü¾iž1ÝN$åzÁ:Û…O„ÏN0c¿¯À^Ÿ¨½{ï£ûE˜*É °´M.{mÙ0¶³S<¾¥H‡â»È£Ÿ»Îý›9ÊúS©ÀäTê–³hË[ þN" ß3W¨PªÞi‘ã Ô€YfÆ Èþ>iŠþy ÷Ýɦ’gÞ\K1_¿'dWn¥òú¡aÜxG_w'²‚w‹u³cR4ŠÜ80ÓX`p€Ûq.ÙúŸ7ËZh‡ÎiÈ\/‰Â7ŠÒû´Ø ¸“¾Wç"éé}.³)„xä6ÁÎM?Æ©Í^m¦ÈëÅ‹ûÛZµ²Hî7´Þ—k%Ú‡aO/vU¼á²žƒQL›uõrx׿?IÖmPô´§‘ͰªòîäW É áGüü+$ ƒ°z5ͼÐ9La„ª…õí·,õnèñ5vÒ_²ânð•ÿŽÖˆ…çޛӭør,KOk#Æ‹3qž»téO4e·ƒ?Dc“ÊŽwÓøJC÷™‚ö‰)ñc%…±ÑL§Âˆxo/q3³ïMxÊ+ÎûÁذÃ%Aœ Ѽë7¢ÐöÛZÀmÞáíe5¾DhÛkPœ(ü‚¤jîOëã$’Ýá_‡ õ=F«{\ɾçýà2†Hëöî C E`³QgT…7?´˜È?¤Fòýº'ïµ ¸Ýz÷a'",‘`ü&½Ä:|GOÇú§‰0yÛþ!Å‚Qsß@H¾33¡Äd}wÞtû4«þQvSlÌ4øaïxLÔÒXäŸÏ ®æ—FE•ãÆ“Î3$ZB&Þ‚ä°eôՙĔ´VAx²Ê¤>•q-ÛOûðÛú.ã3yšºòS ½S8³àÀ¹ñi´I*ðª¿ãrÓ€ÂîxŒe–è+ÿlëkí?LÄÏ]=8ßbÀýݤ×ò>¤Û1`+Õý·[9\˜¥ÔGý=†”fÀÂÓ ¦Í ¯±ÞÿRíD`X Ø­äV—N-ßÐÜ%º Lr’­”RÆPÛú7â9øŽ¹IR»=Ul”°V—ÎË'DÔHìÇï6GÖ×]üžª¹÷‚ø™º7éYuØoïç¹ðnîaÜᎩ…[ /Œ·ÅðØbÏ&®:}™ûô‰>ŽP`Y7,…¨ôŽWÃÄzðuâ–º5›³n.‡ôéxKÍuýíÊç7;ÌAì{÷Ìϰ*Q»‹£ +ýÀš¿îèy4ßeêÆ&=ªè{²Sý?_:BÆ|å9ëkw+„ñ·« À•¥Çºµ3‚U2à_¦R¿O/R…ló#â¹:l낇/Å «°Æ­¥”ÈSTúÅȶÂr0 »«ìš0ÐX0#Ȇ7ÀÿQÅkc6áH¨ÐÈ“b±ÌOlhVÜSÖë·¿gxi¥Êå›ÅùqhBÐ!:å¥áð„Wjë6Æ=¹½C¤‹9²T…Íöˆï4^-`Î,‘²ëÔ#%ÚMB÷§ü±ÛŠlï¶ ÈXêôâú˜ÜW9æ “*üL|m”vG^œâHâ¹4)¦‚rå3ÙÓämybÊU5bÊÇÍoR¼!ÓÞX%9CFpâ#¨9·¹¡ãPcúÒ‰O¡jÈu)Bw¡m²Ý/Fùe}rsÄÊ®*²«qèA³W’`áëÿF¡ïÁIž½L¶P$fi#–8w#u! V‹ áéB&=Ñrì:1ĺBy"_’¹ x´¥†³ú„!f2‚¾f9H DÍ‚ð-›Ø†gˆw‡ï¥í˜nÓ@ö}4_^™À@îô›¡±;Þ†$ Ó¤zã¨ÁâxtíEeÔ™]Á¸kÚPRxÌÛôÔ"–µ*—gq3}¾+8ÒšÁ;`¼Rø JM`noÖ…¡ŸMS¡µ¨ùs»¶ôØq» áØ=ί7;cÂeÕ¨$bCP4Áý$ÔXBQÐÁq…:€ÎáÞø?[˳ÿn‘Ÿº? cÚµR²ò©Fù2ÂÏ <"þ}ÅC-ˆË ·«D/}Xí­"R,wüßf'¹)'Ìt^5dg÷Ï‹Ê÷³ÇìElÏñ)«v½w™“Û¯ß8Ñüaé=V}߈7ÄηGcoJ.±™¨ˆ"g¬ÇW@¤~SHqe±’:Ê„“ÓâîÍ£µ;ñ·€¿—Ê¡›B;wÆŠc”ï–91²Ódô™™]¢Mª'V£bH‹7-a¹%’Ÿ,냽’f&£é½D-Mè›he“ «àö[à-Ï­¼•ÜUÉ©-;N,Í÷>¤²TóŸKVWwõyÐǨo LEâiR…䕟½9˜N%~á‹sSŸøH,Úh‹—šOÑøÊ4û!‡£ÏjÔÉúW’Õz9ÃT”Ü<™©Ì°ÿ64þOú;üö}þlÒoŠCžØn3÷¹§²T› Àýü z¢Ý^Dê9æüŽ(yÇåÄc~+oéñ±SÇÚ9,ØMeçLo‡°bí"†‚¸ã†Üëø¶JâË·‹uv°ÕYQ´¦TZ¹\ˆ­Ýa*§,’§Ú¼¼ä•hƸL׿Œ5¬_‡à¯g¢Ðzá9¬ˆ= Xý¨yO.´B^?,rxqäË1ð]jì§9 Mbr´ƒ³ü+¢qifH|ZXæåËç´±r”W£Øû+ʓ䜽çU)2Á(ŽMÞ÷—ož–:«¼k3LúR€ëïs b€ú܉¼D`4Ý^ã’àsþ,D,hS6ÚÙó¾-‰KZ¨n 4Ó«è’bu¹ß³ª¼­pàhÙ_ÕëA Ì…aB‚5 »`÷#BIÓ¡ÀĤvš[ 'ghmG·ð›"Ï9Bôðn­{BY‚-'‡I©4CnsèÜxþ꿉`Ž÷Xb`8G‚N f¶mu½ï[¦ÒRHñ;w°Æ!<¬iFŠ¥ð~±³ãtL]ð\)¡pòÀÈG† ÍG-QCt_p9åu§·JVz½@féSÞ.èQEÅíûÀ*¦€B—çA'uáô:ƒSÝ*¿)ÍÝìÜÉó²…ÜÝï"ÿJÎ T•熶¤2öÖß7¥Jìð†G Æh£¸l±zC™»f¸ñ»ÔX»œf8Ç’ƒ$λMåw& &*´A**Lul]Ðj!À’‡£Äè°:6qö…d–ºÕîØ7RûΩ‰QÒ( „fÈu+ëLB‹æ½Fµ:Â+ ¹3h?ꡟü tªØ~Z4Xß«©¨)Oõ‹÷Ö¬$# PfrŒÙÁ¥Ó3'ÈcOuÿGj(:Ï ¥x›":¹¤á³ƒcõpe eÕ ê¾‹>>’–DxÇt xï _«cU,Üt›5Öù?j¼{ØäÉ„!– Õ Üœ92©è ˆœ~”D ¯R‹Àîyñ<˜çÈ›¶ÃAΪÅÊ·7“í])˜ äÃa…ó)¤¤¼×–ý&o¼MyŽ~oÎöj®‰ÍwW qsŒƒ¡Ì  )!ê5¸±nÊÞ&±|úÍ‘£¦—š›Ü´ú$Û¼*ÚZ(ßÑ$ÔÔ•æµjÙM[W˜8—•QÏ9t‡áåkö–"}ñ²ãDB›|F‹4ŠQU>]¿0ŽÞq§î›~',J£õ `‘ä-!/ðg‚§á‘ÖOü+QêCmÒ"Û6rïh@²s]€“Ú™Ri\Ah3 ±á <£Æ—V„+©ýSD…µ„LL’öA&´mIŸ„¨Ws CóÈ‘nÚíž,É‘—fV§ØÕ¸TJê8^ÔÆ3LÏAnÀ»JNÝgÿ#R©R©sá€AÇ#mSÚ!åø#ã︻¯,1™è•ÓÑæâS%¤w ¤ þ“u͸<#‘ñ3G£²ñŒÙïzœô{›å&´ºÀÔ5“¸%ÚuG]§~ ¬qÍ—)ef¿œ# ìŽ[° +ø×YÚêÒJ]e‘¢8À£à–»_4u,G(’À¿Æ½'€²Í¸¶8öQËp‡ã¸ºëvV+dt%8N—þ=ø>Š~MÔ÷ðNS#2²€j†¡*øÊ 7^"g“LL“WRýß”a÷] b`_ÿ !Îb&½Ž"àRgGë»þ¦¹uÙ€Î+ÏTVô¾^.—61JÏ\`H53–N áà¢3f,7¹šøyÒÜÜ9å¿V{œ÷$J[¥(Ùiö² ÖT¾ËuÏ?­–­{†õÅ3i3hЇŽ$ä2ÃÖÿ 7ÜVq. u¼[9Å2ß ÿ(wïpÒ‰Ù¢ê3A4^qf€Ád•”¹¥÷ï„ã®ÖiÚÆ_Øvªî›Î]7š¨=DT “=q¨Ý¨©­R°áñ—Óæq깚CòP &?âŽPéOò”ÒDKEö{ïñ8çem.èEèÞ‚¯Ð©v2Zá©q4ƒHb—xxXž62oÉ?4]«šAÐŒZÑŸ >¸\L J¯ÁŽ f¨š6®†ªXsgú>Álì–Aå9x¾ÒÜ>JÄ!ænÞï– =Á1ö$hg\æ~–а=Áô<>Ž©µ¸½z5[±ƒƒxgÈ7vÅSÚ«c=²%<)©öáBAy6ÒMDáHÆ Ê—զĊò»X(I=í}HáúúR@ꢻŽïƒóªu¨è_1->ßȉ¨Íªð÷ ƒº–œ ®j V«)7ƒÉ,¬yükh™Lª[næ¥NË_Ï^Œ¿æßM ¬±Ÿ”2¢fUM¦o†Á&íI—^-’aX|=g°Ou‰ÇŸþÑ UÏ`ÏnÌyƒhÌ6$r÷ÿlýt =¹žNŸ$õÏAD>Þ1šcC´X^Åoe¬h!`¥Íæk zÌJ¥ÛÜÕáõ¼ âLÅÁÿ„RoMkÕ!E«áƒwÊ7älH¡9óhµ]Œ ’ûê÷u<>Ý8®j?€šË²Ëbö*E_‘Uä:ª°0‚ŠqTÊ«n˜Ëj›kßNdÑ÷2æÌD~¦%ìWao¤–/•w舦{”E’Ió!æó׿¤ñ“^ýƒª3’üuãÔ°ö9)» XjW2µâ²ÅÞ>ïQôë~]›2 úfÜ4öS¡»˜Zì Z¹Ñ ©ì¡ú™ eêÛ$[ ã#¾N®‹Ç…+ž´N1šºˆ215ÌîSñÐn p™èlôìØà—Á£CTÕ$6Øg³*ëŽ:ycÝïfÊÑ%²òšU{²ð%÷_Jâ“ ÆHQµÍŠO¨ñ˜½«ˆUeÊ­®Ô‚Ø’ë(=ÑÕ©fS£ˆŒþÁº†RGF¡—ZÙ'™üý(Å#•U}Ðzh3« hÁ“TaÉ5Øâésúi퇀Š}ëýÏ;)pŽ9$°šç°¿•´. ŽË$gš×’:²CÅ‘ž|=ºÕDÀØ~ì n¹as¢» “4Ý1ÏhF–«¥ã©9‘¶8ÎÕ¼K­DÜKæJ8¦˜›ëÜ1Žíc†‰þÑ¥ ÈüÁ ß Ç]ƒ .¸¬\i´!’`C¡¸uÑ»*r[8>Ó15“¾/%мẊ"à=g2üUh© FðDRC·ÿML°Bß> Ïd5jÇ3“á?S!þ£Äæe‹•0 O÷LÀÊŠ¤ÑIô¸ó7A7fG©Ë~Ɖ:õ1W-¯Òðlc½°VóŠb‘Š“5ϲDÐÐ|Fˆ¡¶•¬ŸßL¡½F>Äd†…‚h9Š$FþÅËžoúÂkªTSɦ–Éé˜ôˆvY®¼O MÐþó\Ž k3e‚þ,çÀõ=ü\-´ B?s€-=S<óè D°[{xƒ¢¿Ï ÀC—æWü¯YØ ”0î÷H8¨á‚Öúú÷<§âK‘eÖœ“scúª x¶þúˆµÄ@Z?¥_ã(u^LËõdçÐ\}Ê ¸§0 *:þ"[0l%¢®D™fU÷Mj5ò0n¹Ì¤M­¯*3ð)C`èÑ>¹ìR®6aÁ/¹“C(*é CS©1ZÑþ³@šgXPäO‘cÒ“±éÏ–‹šà䶆ïà¡Û¼1Á'x1ËÓ Š²7áß6Š2îaWÛ@¢¸eºÈìVÒ­xñ¾­4¾®ž¸|%/«[o í±ŸíØÏÛéÇþ×µõhOíê0áýW—êèoGI~­ý]žþ}<ÿ+MW Oú™Wϲ?WAÇ õieõt÷¯œbúµ£ö÷Óú«7}[û}3ÿmq_Uûûz`çSæE³BC,ªªímH-ç4lšä¤Y[–Kkú\rP¦‚[ Õ_ú}òjlO¥ÓêU"N”''¿íÄÅ Õá÷Æ‚õG œŠxÉÞ ùåáFóûû¿:\ìcÈtØœ®ÂT·,7+3›…¦oÿ~i¦| r]ú~AþÀ`°ηßꜯÑt£š÷ȃ.bÄ æ¶_; •Ç/JáVR¤4á|­”«±«™OMOŽÄá4»ÎI;xÄèCÓ Ø!÷ p‚l6Äw­Qq™ÿe¾‚;½ªIY·¿(è@4à†Æ £ _e³JºãÅêÕÑžO º?´û˜†ÂŸ/ÿp¿E9 r£^œÃÕ¨ 1SããÇAa­`áNJ?³ÞÎ`x…·÷ÝMçºqÐÓ"—Hà)Íøµ’Ùeœð@mö Ëiw?¾F;Ð<îl`K/Þp0ÚèÌ–ãíTF3µ & ºM©‡Cóó½ã°ÖÈvúW½:F—9*’2èàð¬ïµeÏsJDN-9GD™à(F× Ú§i¹ Þ4yíCçÛ5b×ïc®îÞKÑ)GĪa­ßTÆW”Ãòפvþi}4ø-{¾([§Vr·—ÆÒrtGdϰwÉ8÷LÁ}ø²LìØáäl/Ídµë‚ŽÈ2ö(Xg˜ßïØ6[½õôÞWKòJ©€KˆŠïtQ<âôÀ΄#øDñ ŽR‡˜Ò?Àò_[@g®r…úSª/-ÒÁwÿS€˜´¨@V4 Û–ƒ²»?³‚ÐT©Ypz ¢E]x½0€u’qä¿i×éÀœ(WšÔ¸=R<Á(²Ö íÊMlŘE‹ét]Ú@T§€Y+Îb1¦µ×ógÓ¨51ÉŒ Cm£Ê¬}˜ZzYñµÐŧØp.mŠÎžÎSðää\ÂF©°¾œRQ‰5;¶ÅOLN…ð”åY’ŽÂ¯NGõ„öèþi}ú²@say¨©«üeE£‡³* €€b¸›Ñ|yÒöwIŽþ³4Ь§ìçGÚ—÷†”$­Ðw§pv²ôZ.`º&¤zópo­ õ5¡š› ‹|Qýˆ~Âð|føöÖôª2è3‡–©1€HÃâK÷Ÿ'Kj·ñoÛY /±†Ÿ ÌÑqõ~éª÷ë¯Ù´ƒܼ‡øQS¯íU/uO¥K«Wšä+•”íÚtsiS$&ÕzÙLb ,ƒÄ[ü —§‚DaB:ªf„é7ìt“$/nkÿJ› ßÅË¡@ÏJ¨q$HË9C6¤AÝQB6ö/¶o¶1ƒ˜XC€‘ººÌd*%iã:â×þû£ƒSE9³Ô!ËþÀ¥Ma™åÒù /G ø¬óÞpþÔˬ]àŸÑ:7ŒᎺ|ÓÔ§¦€…âýâÊxLŠí,Ã[ÓNÀ¼aß©`7ýçÜŸTªüUc Î÷ñc0wÇïEëçû7¸4F8#Ü`Gç3­M"€gOíRR†ykÚb„z¨±‡VQW7‚ÖœC3–•›1œ8?®Cå˜ .Æ|+hV­gT‰'XDå.ålŽM]¸OH˜Ìõ&·Q¹_w…¢%oÙ(¹¡¶òý!¯Ñ] Ô8ìÆ?Zãm0÷»7ÙÕhÿ€iNÉÒ^sX`¡ ò€ÎWkgƒà[Å3ðÄàX7?³nà|y…‘·¤^©6$ìq ÷½ùñ#»wD}HL¿2 ó¤6+°Ùp+ϳP÷öŒjE9’÷âÖî©Ç2«_êyü·­û¯û­ÑV)Q$Yi¶ D–˜Ð¼]`—ç:ú÷ýq˜løxŽ¡¿(ñò-¿ S™sÀ)'&ÀœÂšD…J`žÌ‰àWªæ[ðÞM ³ÍÓéT\Ò` òP(¸’™rM,¹lGÈŸ^UD•öQr­×¤²¥¿W†p}_Ãø'Tvë:”à°ª2õ ü´°f8ÍR€H•äÚ¨¨¸X„ ÙçEõxã©g?MÒœ÷®W òGQºéåc '½ÑµÕÉúÞá¬dÒ’É’ºÑê#^oÝ`‹A3 1ÃhìO»öîê$lF]üˆ¸RÊGóæB>ß_X„©_£:r2!ÆQpjcöPNÖqâu1íFã¯}pA˜’œ;ÉŠl¬„Íy¿Ä•Üßâ ÔËßÏö;[c z€äR6yÌ[þßgžîsix8÷IûZ$y§Ð°oâXöâ)Xugµƒ©xB<ÀFI¯‹ÎøÐÇâßãÞjo+šQ¥ï mH…靨èKô‘lÛCóÔ‘ÓPÊphÔ¥Š7 jÔi1(?ŽÏÆín-«v§8w7–å2€ ©]?I<§`qrÝ$¡ÑÝÊÙoÕ —-¯[I9ˆVÜ褰eOPx¦ÃBŽˆt!©Uää§ê.ôÿ ’gà¿„¤ \óNÞmiû šâ@ÿ å+ýƒÂ™ÁA^.Éqyû‰ kÅ»†Ë5ŽO]4A¥~ˆêÏIhiéŠÁ£0H« çTºãõ­ˆ¾ðwùÚ.šÓfç†YfÆ5€D0|Ãýãº+׳7ÒçÄ‘2š#ýEÄÎfBÖª>Ì"¬"p”õŸE‚ ûç‰â0””Lb¬'ór ¬#žÞÿhHÆÑsÓ#áÿmÉVÊgÑÒ«1µLmD‘äMÆ%ÄÕ»-™y4h„U¼G–[Ó$Ç<§¶46ŠO¾âßtMÓòò£m¶|Ù+P&‹Ê`'{'ÚPÃǰaƒAŒêµíS2ŠNý4€D^wOQ[04&Hõ”×å {ññ)Ën'Òêl·;“º8îÂAjh'k¸½Ä%?@x³¤èäýó 1Œ=X̾v¡l$€ˆ¢‡¼ZÃx‰ýÀ†Êÿ-*S‡È@YFi½Ìç3HwÜSÙ¯+lìÝê¸<÷M—‰¿»h4ÕNü„! —'ýÝ6»ÿ2ìq*t³ÂÞík=¡ñÚk³EdIÀ?þÇ%–iTˆ‘挚)«$¤kóþ&`Oüa<ÍáP§g`¤¯N3c \UÛñ${14´ÕúÊ1ò Ûe¶Y»JY̽aÐ݃H¾,V ЂsCOiÍzØWq3qbÈzÝ-u÷›v|¬)´‰™â“"!áÙœî—_±–€2cƒZ#H[—ò¨ ,÷(·œÇF¶‚*Á®§¿æÞ¾™ü½½m«~˜-üè{g¬m—"3®b„±Ã%eÝ€ëôå⌠D]ùüYÊ1 `Æ ñ˱MS=Qf°”6ú2!~Eu‹j½ïbÚ/AÎt9„6_0†éUiµ%¸+ÛYÙSÔ.X݇ÅÖŒkÁ¤™ž±—Ç ó“ˆ*’ßPÙM"ÿWª ·/µtÔGqó‰úG»Ëå©Tè˜rsŸE?‡ÿtPšºÃ\Äê‚É9ýÉ¢QO1©·T >eN~ßmX!gÁ‹ø ;ï²Jð¯Ê¦lJdû(èL°¨d©éuÉú©_ká4€‡ |³—™ ìÒ¨øGÙ™â¦ï ëÅ0oxO‰D[—Íáp²“’j•®"J¼yîÔ&ò­nÐ~41ö&wœ]c<Þ¶¤?çzˆ§ ˆy ¸à¢Ì5Èû¾6—kDy#¬OíŠA@V=ªPîó»& æh8ØÜ-œÔZþqó!Ê,$â¢8pï&Øö²¿Jìl¶«¡~Ê–;­†ìß­èô,7Åxlj?Ü*ˆ`¯(súc;A*‰Ú}æ<-Cvñlv²„G%ÙôL}h 7qˆõnÞ á¶Š ‘c¥oê`:’_ ZÀ¼µmüZ´V”ç7 iÒhÛÔP£>·‘Åf "TïoW€ †& DÃ7Íd6 |T¯¢ƒ2¨‹´N_¶æ?Ç.Óˆ·{ ‚CM3½VU8Ÿ¹±Ýepñµb©·VÞ1X¥:|Åõ]£ðÔ¶,äü=ü¡ÕZ‡†+xÁPòý_h£!'4y¥O0AÎ+q¡µ´?ò3é¸îË„ñAÔ¶Nµ3x*È 8d{]¥oÂX޳ügy‰¼?{(ž)QdƒÕ_²¶ r¹™¬‡£á¦yQIÃs¾-ÓÙ­åv5c½è`¿ùÖÑ_]ß$ÑÜÜÓ;šÇªûzz"mHèî o[qU þņ<ÓoK,;/ºÌ­yv.?Ñ÷ôE'ÜÙsþóË „åÚp¤r«E+ï7´¢ò¨îj)‰O |ÍóÐä¡D½ß—Aó&švצE‹un\;Ü–o줽䑼ڼ rÔ6ÐÀ:».a: 4±Áàýâýù§šº“¶8Ö? 5'£ÓTØ@Œi¢ˆ§‘#NuFÚ“ˆÝ„­Õ`ž¾Ž@å- ÚU™nˆÈw<®"ßÃ}¹ML!•xºLy$úPe 8NyÙÅïÖ8²&:ŒYÜ3Ÿ0“ÕÝcë´ƒg½s(rÓÿVö8 E|…¸ïs¯“K"¡R{´G™7‹ßO°’a%s â)àRSÓ÷#8¶ü•3zºE•úëiLbu’*X—åèÀ ?åKn:PŠQP€ß®Éœ>’œ 0 €Ì°£É»lÁQPÝ6R\*ìÉ›ð€k”튤”™º)¿Ã|ß§Ùw|…¥M‚«÷ÀPX6deºy±¢Š€æx=ÛŸgfÖ 5Fºç:óSkº©3(m7—â!{z2 Að"ÐXþ©5øH£6Õ!»ö0µ¼ÿ.:ÝÖCß9á©î_«öqÓÔà×û0™§\ÊÐLªÚ4–’êÖ–pÐj%PCw9¸šbq¹Î}NÐqƒSNBLSч½;‚4ÎìÈOµ@;ѧ7¦Ò^µæã¾ÏKœƒÿG¼ ™<2×èçNhaŽp,¨ª•”Ù‹KÚ®Ëø(˜×\®¨¤€£i»ƒÖ h¤â…ër$â ¾Ä~·@VÖš»(}Þ–e1óŽȸÑ+úÀµ˜þóuön¯f à­[Ùrgp}­Å} Ϧeu'Myv¤<Ù1ífÜwJxn¨þ8¹‚ÈH¦%þZÒhÂI:؆Íågï nº|I?`ŒÉ5ˆŸM ò£ýž™¬=‚"É‘±Zéà&‡ïË4$r¤”4¾j–ó̲âI¤ŸÂØll­¤6½Í­œ~–©AX€\³h©œéÄ›(mÿ ï×ËŠËÐ;,‘ŸVêDŒwÕ­¢5ºÿ\8ªS¬²îx;“l¿YY=žµ»,òGýå0«â÷Õ«›±{¯ûŸaÍî}ßb–jå¯Ù!–™OKüwS«“?Ù:£”šªËÖ®…`Ï#Гìœo‚ åÇñõêóJ’ú¢záŽÚ&5d¿˺è^eaCfK>òžkGm*A`ÇÖÛâF_·ã1šÕ.àt8³#–ýr;JcGÝÎéú°º¬r{ׄçƒÿ,éÂõª`ëJ£G»îåYù«=øª$?1Ù^¤¾KŠ<e£wÞ!ˆÿj+IMú·ÛKÀýVäª4,ÞÇíèP™ãœÀo&W)ŒØQK½XD'ô¤g’àÌË›ìi€F1÷:UZ2oOz¾ÃþEÙ{l0.(Î#‚“:uÓ¢ ÛøÔ&‘˜‹ÜÕ”«"‡’«Ì·.ÍND³V\K@Q¸Ì¦›š$¯S)Ì•û³‹`°Ýzøáy害n€ûtŸDP› _ dü˜äÑDÀêÒg«ëÅ•¢’ËŽnãŒx¯SBØn£éîÊL©ú{³D ]ŒÒž± þÀ(]f™ iŠÔÐnL˾9¸›#xKÝF#?ÜšÆ"€*Zóµ0[Âi„à *`[³ðƒÆuÞH†´ÏùLNO-Vñ ¹…Éš½™•9Ö£‘H}œ•¿Æœ†ÿdb+DW„‚<­‘øûÐÈÈmZ`ÿb…oÜ>ˆÜÈ«%déø‰b¼Q¬“ƒ~\ö¥t0#}XR½¹{`¡ƒK(ã)·–Áò”¹~Œe^Fý|[3}|ãƒqí RšGö×n;@Ù¨ˆ³TZgdÝfü…ñÑYû´Û†*CuKiQQÜC¦Pd˜æížˆ15>Ýäkc˜ü['F÷@ŠÍêÒ±\€Æ««%Žnr-˜ŽÅ¨ÞX[LèœÄnQû­Ò>ËçQôàë60Ùy ¹Ê8¢µ'%ÍÉs(Ûßâ áå C» á±OZ—¡8Íâlµ¢ÖèõÜšc¯O÷¸>³9y°NÞç Ó£€ ñ`Û;MÊû¤í´}pÜy7ÍoY’$碂äEUÂ^3…Jrõ€ÖRMéÌ÷ùÔ?ýoä Qí7LíéÅVÐßÅŒÚ µŸZärÑšÒ˜èÝù”†™óÏ£þ¨{™™¤FK+¡ˆ)çãÔ‚1Cf±äû.@-(•¶¾Ê…Xå%JÍ‘N6•ÇëÖÛW¼d©¿Õ0ìÊc›„íÞJ\Ãz_2¥NÂŒíùXÀ*28¢©!w#£¡¡ô;¾üeÌZQ#;`û³¦¢WXg„†Ê=]ä}’>2ÞÍ턌§4s(rE ØÃ÷T$w)± siœ¢+oƱ„£7U‘@Ï€ßAðò¡Û!«p¡Ó¢iï'o’ô=kϬV]PÝ.¸òc¿ B7Ug5 \œQûEE.††ÌGAxê$˜X}Uzá½ð>dT"«qñ7 ›ö E%ÉJÙ¹ºZŠo'qk\  HD5ÊXç‘*ïôyÌÚ) ËAtü¶êí|I°‡x,…æzäÌÃã<"¶ˆHhR¯‘ µ†|¼ai½ë±a¸H„ÜßP–Ýõ¥eN¿W VA6ècc9—]$ß]ÿ³ÿxBš»áÈ—û.ªoæÅÝç³Uk ;Wõ:–n†U¤Æ<"÷Fi¤Ç”!–¹¬ý^gþÇ–_"Á5ÀX)9ïi*¦Ž­‚¡–içøD¸„R-JMã$7­ RO; u/>cÐ.5‹vÿEòÆ9£UùØèÎT{Ýÿ„\óz`½ƒÏõX Ï]-6ª±)ÚÆ-_} ‡nÆpfþ§y~2yky~ºž}ŽŽ·ø¦nÄ×RÁ’M-àpmÈ6г,íir¢„=Z0lÈæiq&¡[—]iþ9ËÛåeO L‰¸^ª·' È`*øe¯G¹v³+” ¼@o÷yÁ¿KdŠë›ö¸[òFp‹íO¼-6÷X5ªh×ìì@q”ãÞ%StT|y[ësqùeÈá0ÀbþwÅœì2¾—8÷]EÕœo¬¥í¥Ð¡G¹ç+¢¤áúÚfãK†¬ý$i½¦gz ÂÁ„ñRøqÃù[šÜÙÀöʪMëÇÂÀºÏ¶Ã)ŠÂµDD–ÝxmM졟¾Œu0ïüE«)2ؼõ«÷ŒµtfiË‚Ç Ýyp}^÷¯Í¡‚œË¥ ¨ãÍ"óïf|b&DzAV¨ ØNîÔÓ`eß,XÂö.+kycÈ9Žì¥þ9?¤AìɱK_YHÆ@$QÐ@3è³äy-Á¤VP^›±¯Û…:ÿBú%ÉicÆL8%mÈÃóQd×åÓ·]’ŠÕà%«=åæ¶³;/¡÷PÌ}x˜€ðb@bq¾¸Ç“õ̆fŽmjÝ…ç̤œÛAÅráÜÒõ,ÅGTwÓ@ý®ÍÍ=¼[¸J°åsÉc¦¡$ФYÊÝqJur¡ôœÏ\ºÅîû¾K;©ŸJ zßš³Ôthe°Âµ*¶|‹QÜ]û•mIoG·˜'AƒÈh` Þ©À˜±'¸é F™ŸŒíšé »¬á+Ú† pcU¥þÔTÚ 4RÙ85  ˶÷I&çvj›y-w9îYã¥0¹ÈœÙ]uÄßG #(¸©ý¨nÅÁ©’Äì#Ïõ:ÏïŽs¥\зàþ 0£uçæ]ò÷NAÔÌ_óáðÏ 7îˆinè#'YÁÆ×³ÅÚVŠÑ²MsT‡Ìɕà {v E>›öÎt‘º+%`UXòò›ÊÁD"«Ûævª'O“ùû„°¦$Àpf† ¦xމâJ2(]ˆ;­õR“ ÑAE|ÂsR5zÝ( YùŸäõ™Ï´í5ÈÑDÀ^ð-ÿ {û1sq^¥Î›¼Tþº‘BñÇþÔÿ2çü÷–vŒüà™t3œ …žNxç“SLËÏ[¢ ׯá¦þ0ÛÞ1†‹«Gi £/*Æþ[,NÆU]³§¯(GºV9Áî#c’J¨ÏeÓ÷^,啟Ÿiîô–¤—vy/ôC© ”Þg‡Y 3úñ"»lù®àøD¥m¸§0¾›16ÕQX©€y”ÁãÊõ(²æ—Ùé£I‹þÈ«¬yø­g7¤Ok³+ÿ×Q\ØÕÓ FS6dµGÝ!/Œ!›ffS€m&•6âݬR˜Ë©„•¹`Ø7è'5x¯žœÚU#Êb¡@fÉ,Lq¿­³u4µ’aa4Fñ§§E{±\6E”£hÿ|w9éKd9´Î뎫êûoÔ¦º›H›a@µo ƒ¿QªÒµ/]+Á}9õµtÎÁuèT\`逴áŠ+ØRÌÞËÞÔnÓC¦Òg‰'”fvá]ÙíÑ-2 øä¯¶wPJ‘¿Øû»Ë¶+ãvéi:IeaÔ>®W„öÒôø µ[ ¯›È §W& ßèG£O:›Š9SíótV¸¸©_Ž4«ZjÞ™áë-+íßübçLEDîh›†]Øh=L6äÊ^ì¾(N5Æ`¤Ñx¯oøØÕÜŒ0J2Ç!¸¦§kNØ<÷E“ª™©×#ôp_‚º<ào4a‹ÌÓcG,µ¶ÅL«}öÛcVœö!4Žqð–ŒMåwJZN²YÌ÷X³É'JÓÿ*×.Ós =ðh-×(ë]ýˆðc»ˆlml¼ucXrW*¸¾A#EÿdÇ«ãIOf¶F¶W™O!Ùç?”•£]Øg?Ú©¤¹úÆ<â,™WÐÊ^¼žÍd¯û•ðІiŸq^ê]*¦\‚À N‘oûšÖnÚtô ª¡.w‹“ÛR:S›¯˜ûžxÒߘlöˆÛK°‰1ªQæ@'1‡ó˜|aZ¯zï©/½Ó"|ã¯Pg»ÄªÁ(Z»I΀KëÛõAl[øEº¶íæïš‘,Ýñ–?2üçÖ“{8x vlÝâ(’y‡{èvë.6F_p×^÷Ê4«'¶c^†rçtÚŠÕÚ§X®ür8”¾[ïW‡LqõÕeAàe‡“ †ŸÑ¨,`e„m}ym“Å Ép½µ-óVp欱fË?¼¥ç~ÀùiE¼‡°·ÈIL‹ˆ»û¹]$’OHîŽÉ¥©w¢XÍbâåcî8Ê?î ™p¹±˜³A?Ï¡À‰ß}RQÏòçY÷æmñ…,Ò´,-ú¿ÅŸÿ;驳>¾0o‡Dž8ÙïT‹u6ê·%¾B ‚?t>+ZËBLf™‚•ë°Ñ¾[™ùÜbé’ÿqžu€üUĽvÁ‚½;è' ÏU åYg“žï¦º”1:j³˜¯„íʶœ‡A¨rkTm¿,œN¯ÏáI+òý-õQé:ß[×Ëe<ÆÊaè×Lx4 o§bPk@Nš¬YböAóÉãÜ"âY•ŠïO»6uˆ–žL\¸Ñê³\Y6@X”—Çè,³ùùÜ ­P1&¸Ñ J^­Föž½c" ¾×§T ¤×ïäW8ª@9&Ó•œ³¡'Z‹K‚ôê^vÂ[ `öüÀÑíLˆJÖÖJOkwrBïØÀ›,§«~ Ù'ûŒ«·`µ À®5Ҧ쌴kº±ÃcþÂA±ÜÒŸÞ¯ƒÖDÆÕê2l½]÷YÇÇ 6²Àî§a•C éP[À„ –N†§àðF!ö­À¢c†âxW$µ§þ/C^ò~ý—z®µóŒ³¥IùÃ$CÿQ¸0wÓÚäA9$]$b®'‘8s†c¼c€épl¤LçhS¾R)X~=¤èû£è6ƒkC×p3w³ ÷–ƒÂƒ!u ËuœÀ`K:ÕûØ&€%9 ˜niLWŽ^pÍ òY¨œ4Î=?°CÒIÀM¯càǛЊ²¡Éš˜]ô†9;:žEJoB¨üxêëæ«ÍU·Ó&=Å@L+\ÜŸªÒ¼ûÉ1ÿsL̵*sbäÅñ ¿LÖbßù粘­r¥ãBVäøÊiªÁAp#‡0Y;ÿ9Þ#%fŒ8LÄýäíö· Óµþû^µ@Áœ1´ã¢Ÿµ¡L¶Ó}ÞðNõ¹>~FÂlÌÐϼ£9 tlR@êµÉP‰N®µ rƒ8ÐfŒ„ßXL‡ÜíÍËð^rݲ©+8Ó®1‡«jxýÚ^T$£‰ÎÒãJtÓ?Ò-«ZÈoÔüDHQVÆµÜÆ3Y\ìW}¡<’”.é>¿ÕÈ+4Ò„‹—6‰¤ÅoÊ1¼z|E8vU4ª‚ÚØôÙn•ë¦é]U‡Ës›>–¨¤„ a† ½jyt_…_qŵê^BM]C’¨Xé©T(Ve ÎhUž¿IÿD÷“ây>Šv‰Ú¤»”ÖEºSŸ_»ûã&Õ¡üxQ¸jýOL#2*÷òí?½Z‘Aªˆ¨&ؽÛ'd#›]ä¿T“»¬†¸‡Á4µ©ÜÂ4b{ç2J¢Ôú^hvŠ‘ƒëõOÕ5f¼UýÌv «¤ƒ ¥"k81±OX,+].Ê–µÈÏ£H2ßCd8ì2×zôï’“ gÝHÇ]÷aCsÐGþAJ£IÀšpÀÝéYÛãceÖôYã~{ÃzLžD ‰5ÓFí%°À”˜êK†t FEùÏ‹¼pÌHC©¡_ÜÞ’rÉëâŠg²Ð2…YxÌ&r­7=ÓªÖ‡»I†¹ù%øyžÂ" Ù‹é\•—Xèò„.m¾YêF=dTÆ®þ[«hÿxI-RÒ,jùK­\z”ÕöP±±+jgÛ0ºúÿJFg´À«Éö†Jš]®€ ¡±ÍëÐWÔè~û/î"ðrõÈÅ~®qÄÜTyÔFr¤Ö÷äÜû2å5ó’â~nñM`é \z]ƒÓÄ¿­ô8«QÖŽó½EÊÛ»ÄR>%YÊΚ͢öœÕ6§¦‘Ÿ øË“i0ŽŽ‹Áþ0V#ne’/ à yU×*-£ší¦ @ÛØIÕâx*ée¨ÒrŽãvR1Cê&º †y+‚¨oSmér?Y´÷j”ªùܳxi%ð ì†Î Iäï [‡ž?„~éÓ_¸‹+6Y§9v~*´¡JLFvÉJ Axxq•nHÖvÏN¨‰s¯,èËE׋m rj‹¼-Y×ί—W¬ßÌÏ?tó<“Ù3ÀìøÈ¢þr‹­lKŠÈo²‰ÉÍTRñK5»®ÿ9Ç ê‚„²šdôrXø°‚Ý«m{Øv)à  Ç¾„ãåÈ3¨å_¤qmzÖe‰}‡±ìm¢L¤ª¦óo¨1W' *@#ù–áS쿚Æýÿ„1W~ÏI2Ž·°?fù»DGG´4¬Y«hà¯IÙ»›Qì*“$𥉽í½ôêDN3gm¾$×¼„~JôñT7Ø¿Ü`QÉ'äá*W›TKP±òÉƭ’?0_ÃÎ$ÖŽ[ëAŠ/o3&d¼ýô­­Š[Âp¤—ÏrÓ_ý~"Ôèž™‡AÆeXA-Ÿ4à>rèÐfé"ø@ç±ï7–²³”Íì?Œï$”… Üs¹šÎä u¯h(ëaèÅØÂFT‡0ö‡ôôÓªº÷J°ŽFÎ2ÊæBÞGYÅZö óÏpÚdJj u&&ã&¦äd& cír‹­Y›gÏÒ@ï | µ²ºû¨taÊp^Jw“ëSQ4æ]†IŽˆ±“¼»]µÙ9—l€Ü š…ùü´9ÂÃ[Özl•žk§>GH±ñ¡yÿ9’èz(¶‘ö“G¹àÕ&W¶BU3ï¹é/¼»£R?ûýNË/S®„ÙòÌï­õžVj4–¸ºŠxWV\lÆ0|U+¶„"âd3FQiCÍ´Åâ+÷¡P¶¿"uк«MóÆ;ªëÌG€ÇµòØ^³*ƒy›B§-‘D€jíq$ö€q? ßs¼bRËßöJ~:°;z¤0= FåwáeN¼Ûøy²MÐTóJuh0sIl´ZUŸm®¿ÁP-ò õ¥úGܼ'ŒqVEÊ‚R>Ÿkzv¡4Ti eŽ|k´ì‹ æ#ŒÇÇ¿¤Lû¿6þOªc·ØdȆӱþµ›u}aG»øQS·©¹¨ ·cSÌ m”™i³o³FÌ( \Âv&V‹’¹\Ïm /l¼âcaçWàNKÑÒe‡÷˱†Æƒó’æÚŒòWüsd¹…ÛÑñGwõ@íÀT9ªõ§*.ΨáÊi¾Om7?R¬òl #¡/Z‘é"e TtÓºÃÑT„4­aé¨L”ïÓÿ3=W–‹¾ñÓ[€¾éš§yX²ƒ†„Ã[žMx£žx=ç°á‚§$¥6±’£-Ï”5@ù‰z®b}óÖ¸GäÎlͽü¢nX\×0uÚÍ|ߟ¿@QÉÆ|Ÿ51uÃ+WÙê®T>… ½0¼rDªËIkä`;PùÙ6cˆ„n¶*Oõ‚H¸UÄ”s>ƒàizkob¶ÒœÅ!bÞPã®›mb¢¯M0­iœ–$òc° 0ÀínÁhÿm³wF³Ën`TxoˆSUÌåx?ÿWó4˜ƒö½×*0SjbÏ‹§c¢ÛRh)Ò¦ŸîÒ]ƒ¹Äê] ÀË?[µU–xŸ]ɵC{€vK#UG•X夶¢ à ˜¶!³€©D}ËÝÀƒ^ÎÊ@ÿg‹èÞW¶¬Qõ‹¼d:€Ç‰”aY±Ñ­»A°3’¤¢š¼? ÎVÑŒ0Ô_޲úqÓ$‰°V$뢯×wÊ^U%ªóµ p è¼lˆ,ºÑ¯â$J  Ü™T4ýsH$æØØÀn6êäð$ƒÌ¶Âi¯øo̬#½ýÅ|ŒÃ¿€”²U†×§˜X÷0`=À!.6 buCí¢>—k[hí ŽÎÃŽ&*G:ùL ŒìQßzúÕš˜Êgro›²Æ×C­#ÇÁ4õÒQ_:K\Cv¢Ã.¹ê™ô¦S€Tdâ wC¢ï §³á¥øüw'°Ö åzBÞé“NªÏQ€-0— sgä,p2ù^Q$Žz*Ön€•îšVëhb¸H ƒ’o›|!äÔmo2ÂùHIa-Ÿ{óSŽ"<å轩QçŽèßÞN9KY•T&ŠƒØñUƒ'Ý© ®³¿"ÒStŠos(Dÿ ¢i!^‹q'k'ó“£'ú¢š1c‘½Á•`Þè¤$.ºŠdøü`$Q=Iýš$s\yH´46`‰)ý$¸h1oµu·×4aÉ´»žÇ§ý˜qÌ?–`>´Æ,éa‡Øƒ)Zï KÙ±‰Ñ_ÒØ‚‚&(Ï@œã‡o¯¶ÏÃp3zZu¹¡;—gdÌñ ÀKË?åDÏÐd•ÔhìUj‹ÍƒßJhí¯6é#"šsÞSÝmKÍõh4Ø2‹Ëx-¤heàúwkŸºï.hšæYï¯""§ŒÝP"°¦räFUY±‹Á@Å„aE’MáOø?UCº˜¤EµËÿ,ÉDÝfÙÇÂA;Nú»Ä =.æž6¼ã•«Û,LYhÿ]fñÜá~éïòµ [Ü-Š|ˆõ´*~(Y]‘==¸lÞÜŸL·a¡'À ¥.à:‘õÄÚÓ!ãÐã?¨³ÚŒš°Æ­úTàÅ«UZÞG|†Tò!rÛ•x— ÛMòIõÎÁ ÎH`BX3°áe!âíþDáÀêäüÊ;’‡s²9ÞkÏd†MæåX_†ÿ#‘Äø)]{%tÄ‹›¼-gú±¬ùsà (X΋¯EœÅ›{ì— œG‰µ—Ê©^GÄ#(§_Ã8ð³Ë%‹Ã"Ëßßû$yÛ¾ê˜Û‡ž«¹Züér4Õ< ©äèóÚ´ÒbH㜾ü>÷é:/=g»ÖÄÐx³´³ÒŽ„ª,²6ðñõ¼¤ÖO Y…à?wZ¡ƒë¦ø«UŒ±€ä±-³hÛUÍ•†+Û³„ºbnr'ð u)³°öJ»] ÚZV‰ÁâpëhÜVb*ôLrÜ1\Ñ»%G¿zìEò]ª°.–  ²;v°Æ8ûúÇèÚœjÒbèElMˆÎ+‹]túÐ&\TEÊÚoÝãÞÉbJ@ž¨2°7:¢&”ˆ_ªDIq›Yg×IŸ˜&ï‘2’UïN AÔGÛ4ÅKœeM¢ Ñ;d^âý,½ÂRÖ(þ¤l»0‹&ØeFØíÌÌ4kRàgf²Ð`/™–œµb*¾^X<¶wé™O8K4<œ-p¶|XS°åæœ}Ø Æ2Ç×€ÜÒ¿õÐïɱ¯¾ÜkdUÁ¦ƒ³ÕVLœ °DØ"†g+~`Ì­ÝÚÅØµ(âî-¡s1O=”ýr§úÂçy QD±"b%C‰1•þLéãqöúFmk€qÓ:?Ò¸`Ï<›—Vå›2HZ7ÇÎ!ñ¶çŸðß¾"ùZ½esÜÌðÿ4ãÌ뜑·Tœ*LLœÀq —‡¯³db7á…3Ý„YαWâ)ív–3ó¿krOñ¡ß¤¸F“?•WE>ÖõãŸyÐd`ÒÎ.mn'±÷ç+é±ÉôŠ2ß·$Ö&ℵéw?ÇE—QCK)¨þô®ØKþUJc=4Oú¬ý_Ò˜ö.¨Ö4Ýq"Ko GËiÊõñ\Cfè­ ƒáoXï;/ízndÈšÁÀyÕlÏYBm¼!½oI¯TL •„³íx|ŒY£ƒ1ÉÿÔdïì1[‰¶fzo v[ù]Õø.ı=JW„ë¼}‡ÖL üÐA9Ô Gõ®1è·Ôî„Düg<æ³Á71ENr‚>ɨ¢é1¹e–®‹;.‚Ýß ]6Opö—¢|›¿!yWMäß™æ–<Ì#žãþèGyý<㣱_É u.´ Ò®a¸÷-n¥·%ÎÚÜﬡ =òâÝ+vÜÆ í¹`wiK H:Cÿ͌ٳŸÑ1²F±cð* Â[êC´Dòú?ιòZ²ç‚êÏɤŽb\šÞ›ß2˜kÊbfÍý¶YN³®IÕÑ<Ø›ú|Ë>V ƒ„Ý|Þ‚QwH¿ñ£JA´ i…n®ýÅØïJò溕S®úY"v¥¤kDÍ‚éó¬¼>õt ÚÓœïÅä 8a9Ûõ 7=“0>Ó^}7–ôÌÒ\¶Q>SQÙ´#5àÝ<9£i¸öâû‡îÅìsžÅŽ 6maÓiÂq·*N¿ðj—•LQCAñÝ‚.B;’'î´´åpU†Â°X^{©Mí÷áNmÅI>Ú(ógïwò¨ÈSÚŽ—Ýzòfâb °yܨüm;²Ñ6~ª ªÌ)ùï²bÉFzdÝý*t‚‹B¿¡¶G²0Oòéºn ,¢,Z{5nðŠiUƒ`qÓОŽòD蟗o!%Œ ¢l ë;äÚ:wç-ÆIíŽ!pœú0Z$ŽKn{‚«ÚXùì\§¹Àî°è§ØZtŒJzTÓÌ ÔéãJ‡2N|²+±EuJ(·þº‡Ág‹+fgc€äiq:– ÏäüPžTDر•°i= •Ï6¼Ö¸Ýmeoéþž` g‰õ*f×›ÜÚÃäË ›™/$j˜xxÃvÿo1l½QÑÂÅ3>¡ ¢ÿ'ÁyTk‚òAšÀ2Qî ÜÞáÚ›ðá&ƒQàƒÄ—Ã`Föž‡ |ŸÌ<åŠí“/¾ â_›‘ÀL…´Jºþ;B…Ö Û£•Á1mi"ìÑ4‰žøl¬£'Ç3Ö%š¦âu';S܆¹ÀŠi=•ûa¹³YksÈÄX³uÖ³lm@@Õ=S{ýr¥AÒl°ý¬sïØCcÛz®a‘°2yÀ,Z$Éfˆä'ž®µ[˜´Á‘_B@À§¨k“§RUÆæªŠÑ¡Ø%—xdF -m„a»QŸØÏNÿŒu¤jƒxìåü,ÝÛ 90‚Ú [µÌFÂÉ +uÂzCÿ ´äº4&‰b»ZK17‡VÃByth¯ø£-²d`¬¬ïŠýd#.|HŸ–JKô/N-»¬Ýn:Î هçp|ø§–°cÎÿm¾ÈW&ªómªhO \›W¬!øÅ6¯f,Q¾ ©ÝHɼ~rÐsêŽe¢b¡‘ÞÓÔñ60=¥ØHÈ•ÂAs\LRóYÚ*ñ¶Â-ð4D‹pð|Wd÷»2ÖC<îâÄUªækeV1‹ÛbÓTïVòVìsq•…*ÿ3)ˆ#‚‰’r«C6n…å+û-­šg9.Î ²ÿ3³¿[£ŽôŽI*û}“z8¡é´oP`p˜ìñß#ñðF6t-Éo:a^§_ôÔ½^yÉLª8‘ø­Èw¢ÿ)ÕÚ'ÓZÞ\ójÉ`ÈþÊÑoæeUÛ½ÄËg‘p"`a‹àû¥âƒ˜5õ„ÀO!Lkº PܱŒëh`Ö4ðÁ zÏ9¯;5ýM…ãM[× ÏíÐûO×ÿ.ž_š«™¶C<ß,ü¨Ëé¹Þ¾«eç“~Þ-'À»¤˜Ø•‰+nõ§g\þ_ìßöÁ5#¦2÷û[H;¥pJf~XНësÐâÐ{¦¸±9Ó˧2¹hlèWQ½‡ ÔбÜEÒUS䈱J“®­@P¨Èß AwYD³¡Ž/T‰•Uõø ª3 vGË8«ošÐX•X°2J”h/Œ;§ &øǽ•WÚ%Ôƒ¸éü)> —Áœn›IIasƒ7YyàºNÕB.fìàFùæúž|zéN4·…ŒÐ/­ƒ^ Û—Ø\o:ñèÒ¤­©÷XÕ|L8³þ¹¢l®¿G,ؽ š<µn)£k‘(¢ËÅinpáñýºi}]CèøL_V¸þß@/Õa?Û²Ÿ·Ô~§WíÑÛÔ™Ã|ûËõt1§Âjùú=|þп>œwÏÓÕèþ¦…óì;çô pßV—~ÞžuóŽ~Ýiý½ðþªÍßVÂþßM=úœÕ~~Þ›@øMsšâ#]ëÑt?_•°‹¸i¹'ëÔOxX€ãŠÝ@ž1ðÓ1Áüðøv.0ìYO™Ó—E¼n¦ô"©½;¥ácˆBó;!ê>  vSþ¼å…†%©Ã¬¿¸Š|O¾ZÇÑš4p)þ?§öªù &¡¨Ä*…·‹åÖùÏvò¯×"î\ˆ0¨íÑÒœñGy4áé>á#Ê Š]ÌÞu;‹ø¶èˆœ@l÷¤Ø@ðÔ¿—*cŽî÷vóFð®v²{k´<³òûÞ” ¶Õã3ä- _ïà ã–V†rBrN˜À3ÂS«Ð~äo iÀÚùO—á¾l6/N°H?â;U¦> ZÆñ߆šŠÈ˜ ±Hg­"zkÃï‡p‰# Q.;—¨§ J/îXµ|йz–ãâoPø„=à@Œï9…*ˆW–ß*j;̘>šaìßSß'Î×E‚è`Z£Ø“7×"Øîÿtoµ% 4¹4³gÄÿÑ?ù i›N¥ üx^îx ü“ÍZ*åä—R7]÷Ç/øÜ+cK“SÆÐZ ÜBœþH¾f`4¢2e+µ´%†JSèEߟþl¦±‹;I)Fa*¡hÁ‰ÉÃ(Lë§Öá#5‰Ú=×]þmâ (±‡‹‰íßZ®Z¦ãH¼vôŒ¨þë>|žõ–1ÿƒå,³Œg÷bȘ9{Ìoè_äà{Y½tªrvY2+€q7>I™ÁÜÖ•¬X¾ [š´‹Äò¹l ôî›,ÍJVMFýûÕ2¼Ý²bPWN+â„Æ>hÈ~§uüá0ûPquÏ QõîY&xž®M.{Îá.­÷ÕlþîÔ>"©+'£Äê ©Z,PXËísV”š%Á7 a_? ÍßÊÆ2{¾X¡Ü üœày£§Vód*#B‡œ: ¥û³: þg0¿œt-TZ4z8ª<;³5”š¼¶:Ñ䬆9E¤¯RX‡Š…÷x³ˆøõ‚¼3szî#F•L«Äö¹=Ý×r3‡ÁSpE?ßN¸ ¬ŸÀ^Ï}¸”XÓ’¢¼.v÷—XK@;rÄp;œÓÑv_Ü„ò:¯u»ìrÞ[R_ßЧÖÝÈi8Þï£CO ¾{ÄïDÜ]]×HÓŠÃZõòO‚âû™yÙYx#Ù¤‘T}ØšcU°ŒWBx`ÂLß‘óпôØG|šÑË¥E$0¥ú„`íàW^wcøQhRÛ¬X’Ð/¥==÷([8G+|NÑzäQŒd‘ÚLiP†|" bÚÞõG¸ºzO·ÞF öô„µ+ÃsѾFy'äïšê»k[/°h(pñLWS?§ ·/æ%w°AF§CûOmŦéSït# ¨J£aÞ{¡Ñ3(ÀfX Û –)º61p™Ì6ì^9jÁ˜ ä,®†$ÙVƒ×/€)O)¸¸(mÃÓ}uÄLQƒ"ƒìkÅõPcK“Ž‘“W?ê¶üª«ga$'¼?PB PW²‰X²É%¡•EYÄÊaê1™C×_G1·ùÁõc3v( hLH§eùzG”ýëpa•sz¶ÂäkWÚûŠ\táúf-¤Ñ¨ŸÚ¡0’% Í3X>»Ì4^ã¡)®‡åŠ5Ý¢¹ ±^ÈrÁ3W¾SµììÅ̃4±*‡¤wÖ…È+>ŽMÐÜ7lÔë“Cwtöо6Éõè,ÖÏ‚˜1¶á±û¾‘Ò䈃zË ‹J.hµ Fv¦:y@­6ƒ $jfjíNAõ¥´úiŒý*¿ÿ]MXµSet=~2Q”¬yTU‰ÿ‚ÙËP†»sgõ£½=®Ú©»6-ôqQìò2L‹XÙBˆ‰syè3„%Ÿœ¾¶ªÏã€U~å.ðɘˆ•YYM¬ÉJœáiµëg]lÞ`HW±(Éé£m-áA.2#*æN¿šù71é…QZqÞžÂGÌë§ãîï÷KP†掜ìpg¿Š?\X Ge¿fuÁÚåÒ%éÝöÿ @„½q¯ôꓦ yctŒ0Í஽:KR3=äöà9âì"½Vœ ÏÍMã.»C QsŠ˜/ÌP)ff <ö ÖÕ <ÌH@Pr•ƒ§Öz”PV¹çJDä~\ñ?ÇrÞñ[j³ý–.þCcá,{“´õpþ°Ž¥£==Y4r€hMoP‚þ ¡þlbÛ ÂC¥l-Ô³ÁÍÜ¥ºüVc&1¶Ìè³lærwÈiç"ƒ‘š3º +§¥d&6/i½=t7v8WÈ“ÖðßQU0ÈùE)èUo(Ž”ˆ™«oØ =We|«!nJÉ >(£ñM{Cà¿Ë@ׂÚÎA£þ»=Øj¦,eG(P`U6UÎ^®ÐBXrFQ­œÉ1Õ®,8¾ã}5îøm©£Ï!ò ÇN\Nž©> ýŒ¤~!ÇÔYˆ;5³%8{ÐnÚ1–Ç‚Ð(Oc®]Š¢¥tÎßO‚TŠìåþ´‰9Üóíl¥p8evv‹ ø›># ätME€Þæ»yŸ½ù0@Ü*}Ïä;í´;©6ãjÀ§?6h”ª‡´L^µ1ØG§r"}Â9Kd×2‹M­ÍâÎÄ¥Ÿí£Ó|m£K2\Ÿ¹ƒ·b¸à9Ë7“ß­¯F…|=Hñû•X®xZ=•ÂN|Hð]×Ò‡³ì° DÐ} äÖ{¶\Êï©”_pDØË¬cah§[É-*èSxJ•›´Ô>EþÓÓKØ¿ÿ5™®°ƒ³™$T@J²ûΘd€RÌIoØT†ïÚ- 0æu¼˜íåäʹ+•4l¸!¤ÌÊ¿ÔØ$Ç w)bîU…EÆt:DõK\Ë–ùT5¶`Ø’£E r¯èŒJ Jú_oK¸_:òmVA«¼¯!Åbòr—–y`Ï¿tH'9“x‚‘9!½-DXÕàI¥š€ ݉eM9à"ÆúéÿZ\+€#¸âü>†|[ŽË…"5ŸúxÖ%]ý¤Š:crWáEªŠ­|Mž¡C¡_òRáy—çï2aŸ)h7D1ö¿p3spž®în¬ÐÕD)9ÄÔd†qͪj•±ÿR–recÑ»2òváÿG/ýqs@ÉhbcyîžØ¼a44 ×9ñÞBÝšð«4¸ðäÍu“¹‘Þ bäzÈÒøó²¼?%ŠJ‡^â*âõn¿Ût97uer ?jÜS1Æ6+÷‚„›í¿m€ËO¹ÛdE}w!|}ø ¬XI9¦ú FqÜÅ¢'¥$“YòFŒBƒúªàYÿ‚cE@õ±¿'æ8gi±ZÃZø’rêº22B€Öè°)J-QžÒÁa_Àxño#W6iór4žÀ8d˜ùeð¢÷k˜ZΤ™ xÿ9_=’Šx¾¶ÅÙ¾MCʾr}ÖÛ„/®Ò=²ÕädÆ¥Ê:̹É㵛˾º¥>÷]¢Ë·¾[êÌ $>çµF•DÀm¢’œZáÎÅŒè ÀP³2¶^ú(63pZj%Ì^çÊ›ÿ#}’c| ì!¨"ß Ö†ö"jbÇÂß@þ3‹Bø#Ê,[’ØaPŽÛzÙœG,¹4Ÿ‘d;‰àrQ_‘õ5òVèY]q}Ú¨Æi'îÎ5iѳfhv[ 1AöFÏVüƒ÷†OÌ)niöãI›h.S vcÇ:,IG''\”;ߤ¦8_ºã¡¢Ë‡Ñš˜Ûbß—Ê6ÏüWÈ#ô¤É!OwûšF ×k ¢ê‚ÛZl¾«ÔOk¾\#@;韌֌§&ŸÌe,sWAu }é…/£ß¾ñc„ó ËxÓqŽDŸ‚°'-#öE'RsĵËÝþ^xwz ƒêÍgl|x±ldMÛtá_u$Áà¬IÓ%ósSß"._×ö2F%YãN6 òE)Õ°b†O§ÑKp°ÑŒ eP¯ 1E@‡™Ï§sžp5ƒüÝ+lú[[Ón-Ô“[{ôœÖ l´¿;W‡ýÓ\{\ò«L¢vz¼…Ü>`ë!Sé¡Ù?y6JŒBˆÏ¶ï Á3´‚*ipKW»zy}:h>YMœ?‡Ç!² ÑðÒ3õì£\·!•FZ}wO¢}z$h—¦jìg-¦vNTWÅ ¡½xøR×ÌPIŸ¹“T0wò! O¥ ù:éYûä}üØ™] Ä×ÛæuG/MMêíó@ŸZì4”:î% Ç1‡Š¬?s“¤'m€Ð\Çvßû¡(D:ð@ÞÆÒ­×˜K®ÚSðý)=ã6Ÿ½Çð%¼Aáf7ŠFQ‰xu7S2ô¨Ïuk2<¢QxÔ}Nƒ¡¾Kü‡À€‚¼•F´†Ï§ÏÆ!h¶o&Ë—I£Ð ºbÚ}äòTàÐYˆÊåÁò]#¬§µ±#›Kd#Öþ65vº}Ú´`…%7â[‘CdnILvôžÚ&¸øÿ$*Ýsûõ ¾àªÇcÔœly"À;·Š‡Y–‘È’ÈfÂDPQÚû©öç©'0båV÷²äí׊gxc\ÓdÕ,:Ãtoè äìL×ÞÙ4gIð÷ÏúÅim­DÆŽ”ë°`>Ãa¼6\Á|wëPmZõ¦xµó!Ž41’;:wž¯t©¿¢Øú(Ýl¹tQ>ä»(\™g:¯E}]˜ipˆ›Ð鄚ðlmîãèöÕ?¡07¨›ZùKЧ…àÞFƒ˜XJ ùY±jL²ÏL=?kžtÁí(“³×ëøAb2ÅÇnÞË)6ÜK+$ÔV‚Ë¿‘?:¹lÉΘÎɬÌ|ŸSª÷hÿj;› ÅÈã*ÇŠ •»ÕÏŒ÷žîñ˜™ü¶í<ú_ñŸ®ÿ®èR·†ì¸nœä=P/ÕØO×ÅJn ßÆÆÍEŸ‰O‰p†Nœo’!«]È®ÅSå\¢_(¤Ê`¬¿2»㨮ÊÐxéó{9L[g"¾sƒ¤Š—`ýõ×\fi?Ý0˜cÆC™â¶IçgŠ —G}1‚é¨ôØÚÜB᫬OL~¬¥ïµó_fcpÌè! $4V«¨å¢d—P+ÓZpt[¤ÄÝůÜq˜Á[7–­xÐۅ͆ޓ—ø…¹0žN r àÁüûhUÇay"áêˆô=iU?˜ü·°ÿIöJ9U‡ðƒq}!ÌïP*° äBD§TëßãÄRY ?ås8ZŽ¿üß̼¬"¥O2‚’-NË!¾& 3ÎPPÅùÌ´°[àۜűÂày•”ôr‰n?ë¡UН„£J—B¿Z{¿ãç Å³v;>Š|µOKüVù¼èòl3x¬×+$³åEq6Òsµp@`>z›‹GMuYˆ³1ƒïR¡p‡‹»8€`2ðƒtàU5iïÈ.²bQ+³röÂB8c7Q5?rH0Ö œú®üÔZ¨'ºNM¸N}¬Ñ÷Ì,¼×péJ¡é]9ïᢜòˆrÉ?ˆ‚4Ý“Û$¨1A-¨»û;Ÿå<ß·¦¶¢^Õ=YVÝÉM]yG\dÊ'8^Ñj¶R¨)¬aƒÌ©å©þ„\i‘½X>ù-?úeùC!²à÷ÉÓ$<(ê:—®çµÐ‡¥71:C‘ïÀ/czcïT¦‡VDZСƴٟ+ a4Vãx^ L‚¿ežªór7]â4f^ñÁúåoy[¨2EþDöbôïuŽç^Ú?GeÕ›ÿAcaß"4yâ™#ŠðݯJ÷sg•[Î]{¸ÂY@:茬):n«ÊÁ;íw©$M1²]ÃË“kž¯²©Ú• ¤å ‡K1š%D¸nq£@rþßIçþÙíî*žë¿ÜjyØ…†±B‘`±9Æå·ïÒñ$Þ¼|’«&]µˆÅc8!a-λÖƒX&4¦/ï­ßœè i†ºCE fåÓ? uÝ4t Çs!3Y]}n‚/E(ÌùT03£ÞO÷ÆJê=€ö<öø^÷f¥ý\&+@ã¦e—ˆ°[¶©©tÞÑ_Ä>¥•Š¿!H#”Bx]ïÆÄl7çó·ê˜ád OHG騆%Ê)Š×Ôÿ>q¾M ŽÂè8‘\u¯É?W‡Dm•0%‹ƒ®”Å›ý›Pº¤Åôñ8¹ÎÙn w9e’d©Çu HÀX›Œñ}né X\^†Q2—ÁÆ­ ÆC}gË­†Dóàµ@WŠ˜°y…—úsXÄ- ±ùô0ÿc l“†ùx€?V§´¯àõ™Ì¾.º…!,ÀÙPak$J‰ž?!üEò3ºd'ñÇݸõgÔvc^a_³Ó÷Á/vVÄV¾A Âò÷Ãö#<* Ï´Ä¡j×S!)ìp„kÏ·Ww“XÜ=Ä^D%YêùÌ?>©ü×¼^ÞQÃ]¶ZnNº{†U®2_>t_8rcšwDÑ!qÍ`•.ØFa¼G—®Óù®Ï°*ù-¬©w÷•ˆüs_NgÜàŒO,gšÿP«l¶Fš€lÿ@.:M]}\„óS;Z¦‘àQr 9=ª¤òa^ ö»Ÿ£ôŒ,7[랦ÞI\½30éÑÆ˜âm O}‘)YæúÂæ£’*”´«†Åo S&ƒ#Óš[¬ƒµÔ>Æð}$ƒÞã¡:=á„yñ Ùtvÿ·ð¹ûâ†Ñä=ëÒ8@{ã8aÈ®°ç¿ú¿žð{Œä?¿¦ì¿LÐc9 úÉ­æÕüXŠm·ÚŨâºï æ–çjtßç,zÉp ”œh+ 2 KU´ÒEŸuaëò”¢ÕIÀ[ÒMx³òß„!A1ÜýÎ< ø–¿ZÔJ\é5f×7ÈÁAH/à?‚IižiAÃ/ÍFäT2zS#Æ"óÐI²Ò^œ`0èqIá€üÙGvé‹?mCœ0¶½ß ðI°¥~+né]+ƯY4ŽL’á/ÍBµ¹ÆÁì\§™\•wIÞ,òm¡zÄE5ýC$•(#3øør 4 dËkÓ šÿ~Pl`-ð*]ràñêÆ´…2‘òh§/.ćÖÄ; N˜>¨eã\Cx“Du„T‘+•kZ#)vˆÞ¼­|zµ,óYÑ(¤O¢RÚõ…úÀÏ£D¢9¿-û!–-íë׫ΩRæE}WiT¼Ö+I4‡iAÓðñæÇù &„…iQWy{Ó—rÃZîÖ[ÎÎp «¡¼Ìóê‹~À¬]bIŶѮÀÜÄEÇöÄ• 6컫n/”„È q„žI#¶¿ŒiÏ M¤€‰ôÌÔ?ñuWS$5õÔ‰3òœ¼8O\û¨¯±®®üùDÌ6]áYãæ"l1®<+ Ï…ö®+ì}r™ ŽÞ‹ìy•m«ä¥&«”‰»¹ŽáîÒTÀP„zœÿ"¨¼Æ&KšG<·ÁdõÕ”"y®~øëŽœÓéƒÒn †;$yƒÏrlý8=1nú…¿õÑÝ3°ô$'OÿLÌòcÓ•)f—¿id%iWÍ Ñëi;•þ‚y PP¨×IraÜ ù²ÇdÈ0ÿöâ=½7Xà[0Q08³Ç¡dž±Õ9:_‹,Vg¾ãRšŠM¯@£Ç¢Õ¨z¿Y_lV»¿"ôîV7ò‡îTw ´ý3¾âHq)´rÑ}®=ÖÄU¿߬Š M•Ñè‰[¯ÎˆGèÏiê4÷àl¤½à”®&:Õ*ÄÔqZ±OËÀU^\Înì9§®Ðpûµ“ ÙE¸ïšÉ€T‚ûØ9?´ÁÏä~Së,‡&z‚¿™¯n“ö»!0ŒA å «{¼"å Ð$¼ßNЏ\LZaV‡ÌÄޑζ ý‰Ã½=T~¦)­Â·Tâ•ÝŠŠ9TÉ]¿Ë5-uAOHBö7ˆ~––n¹»D(3Ë ”ù­3†,âw¡–Ó†¯È"wÝ8±e£ÏQÄÿ+kX™QùófÓ:NaÁ áêèåëΞÛDQxs¡•˜7‚ª>áƒg§®ݾ“1½Vàùβòt>ƒJÔD ‘óv¸‚ Î÷¹Ò¾6ÛèhÂNnUTÅS!Z½Ùž“ÆÌˆíLRL®šR¸F0­±7–¤HTjv ; ƒ˜;íë´·ô"æxÀæá÷Dœ`/5%Ó^tã!ƒÃçÖ[M¾´éÞ.ç¡õšt4™ ÷O±óéÀ¨^QHë¿éF@¦ß²'Ѱ¤ó2Æ·¼åÞ@¤¬˜ùíçöµÉjs=V£bŸ$e‘,üÆ»»!n:²C;Û1¸|PJeWð i=ï’™UvuJ_oyéŠ>‰[bV¯-ÂHšUË¢wþsü‹~Ã,RæyúnßbtéÔÅó´ˆë¿»(РÆF…Ÿ'˜=–­9ÇOÝ\d=o­2Ý28c¸„ŸDï»%\1er>£W/¾Tà´¿rXÕÞX’xG§9Ö¥µmúŽ¥`!‡$é¸õòp?^íßüœ×CKºz%NÙ¡Ék4ÑüZM.¿D!Îf ºph4yÆþ3B`­¼(¤H á(RÍ#yžo䣓aPÎ×ÇgÂdäŠáV©¼"_’í¥[S,ÇšX8Œ9Ûòè¶ o·Ë!CŒÿ T y²Ð³u#M÷*Ê_ŸÈ 1WÅúx)KÿÍnG0œHq‚£ô›ÏìJ]à ƒ*Šu2tùŸBiA I!WMrîÕþk+ÏÜe˜©…†0ðœ\]ö×Vò“£¢‘G˜9nsÐMa$ð±Àñ%%‡|6G‹çñŸ6)’ú÷á‰ÑÕ¦¨Qý•ÌÚ’¯®ºP§|eÞI6”«dà$67i"½õ?­›`"y)¾Ý{'áši q5î¹€ÒÜ’hÅ~4ÀyÆÐ3{I­ÀËÅ5ÍZD`Y$Süâ¿ÌªkNì?­nø~ôoÌÑ«g˜8äïÑݾCô‡S²K‘Ìó®¸ÊJ´.LÀ4ß²ƒ¤/yѦ¶ˆmwËCÕ9j4;ÜJSYh¿´“—ÎU^ça‚y-Aw¥ëù!²¿?âñ~¼¦(ú²“nð9q™†À}Öæ oëtKúÍ{´$34:DÛžk’è1Jœ;ôtVOˆž¸½” µzªä*Zà¡¢m n6»lÕžZ›qÿZ7ÏgÀ¤bàÎãŒÏæ•ìN~T›£K.‰·:}Û%]ã=ZK ²»‚2e„/7ÅEWÁåœàE" ˆ4&’„†¦E¾Aˆ:’Ý‚µnž¿,=ùî…$×¾Kq5±F ÿê?„C3ß\¼,—à6 |±tAÌ;ï2"9×Wª¾HÖ*þª©"íV óÀ0UˆÔ>ù ÎPB´¿Ž·²NÂ)²ƒÙ»÷þ°-*áKüãfßò,èɦ—›À ~7'N‡7È¢c²Øu6ä¸zÿz»éAÌ¢ U¤î>)G Â)V=(жٰìe9ºý“ùË_ÕšÛf$Dfo3ZÆo³ÄK“çפZö®8Ôé ‚njñQ^^åÚ´:¶•NŽEa­3'ҥ¾KŽÁtX<µμO°ÇŒ0õwQÌ–»_Å%I×2%¹Ï•€9¾/+¢O³»“H=Ó Õ'6=ø)à¯Ýž¶á’ú#Wì†0q!†¦m ;Õ®PÃÀ»&Qc~Æcš'h7¬$.*êðM`ž8©›,É»W©h,må3]=‹ øÿ‹ïn*)´€ø¤òAWy8Á=(_½Ò?ìß=|`>•üóUaü,º0®p#üûôã òhBcÅ íÒïs'õíÔ ²°'ÇêzèÎ:4&ŠVú”Fª“ÆvV͉æDC¨šwý/¸MíˆÔÒý)mÿóÈ[èÑXqš5¯2ÔAÿÚ•YÕ7¡C¦}»}ƒúÂ¥_Š€0;»™g”y&¦im.ýÊ0l~Å—Jýg2²GB uS¶·¶ÓÚ{²ÄÅã£ã«ÍàêȹÚð›†J8üUn/Þn$ôIàorCô‘`×øÇuÆÉ¢;`¯‚˜™jÚ3×V²¿›ÂÖêHPù˜$©wn¶Úel].·ÉÆN "ûÆ>@æIx¢=u^ß¹õˆi/ó£X™ÚŸlA·â“poù?Z²c‡ë¥# ©°dJ«ÛY­;úƃîêCmñËù/€ÝΔxy<ÅèµJ/Ó¬ctòT‘F@=6 åô»|b¸}AÓ\Dž¡cÄ×0¦ˆÉ§wÝ’”–Š+Ž…2~é‡^ÅCÌG-C5T¥Ö¥{DX*½ãŒ¢í˜K}ßÔ"µŠÞÉ8g±Ó¼Òz¯Bmn~¯öÑ"´¼œ¸AíA6¥þÆÂêg’cxï}üÖ þ­/3#²¿oÿM?µvHl÷G{àXÕâ& §ˆÿpmZðÊ—¥=öªˆ¥ZN9Í…?¶€ Îš©òí´ßV‡9G?Ï£ûXÁ«#—EôhjØß?“ßt†ôuÝAùŸ3PÃÜihÏ´ItÖèÛTPó{˜2¡_ñq³ÐçHÿ} ]ûïþ2Lu£(ÜY6íy0€õûVEVJ¸F†:€‰Èæó(#‡Œî†¼ VúÁ—$nß M— ;œV¼øQhRÜ÷a·`L=©#øM GÿuœˆKtRˆ•*œµ¿HýT¼ŒÞ#8=ûB`– ë±øWñ¤x&yòS$?JrÙe9K;· qáë‚mÀÄU¾[±«Ó *dC-qÏœã-séÁæ­WqÂ[:h“¶QõãJ H¾3ÿ'^Á­úÿ:ô¶fn+8uþ1DÃÊï=ì—‰ºZò(”4’OðæGRbºÌ0R~²ÈÜB«¦äß&û׸3¥0Xmæ–ת\hn½X{·š3ÂY™t.mЉ¸7+ˆØüÖØ~9ò»6<9e .jF´Ò#ÄO‡ƒelà%›ýßæ_n¦?‘äü ú¹ €¬cÇ&¾ÔñÁ€ ö=¸£ZÈŽZàŸ>݈ì’f>n{Õ¡æŠé ¶]crãñ1:3¶öüòdb[ ²§mÀº¯õßÔùH tÁÄ ØiÌÓÿ ·¬jÍÇkãºU\F†‹]_QDu' …¹Ó€ƒ™³·1óÖшc„‚²tgZ8ÜæݧsYrÞhÄHêá2‹þ?nÁÆšBô¼o ¤aÛДû]>˜~§Xñ€_Ý,!ÍgâÕŸ;±Ø´i„MãÇzH9ö G$ëc(“㚤åäx³µ`ÐyžýYÖþsEÞ·èEîý¶‹u1(MÉh”yÐ ö|m;Ïo—ú²¾W­Ô|å{š<ðÒµP@˜Æ+#÷8V6·•‚E<å‘u’=Y³ä…¶me^ý·ÃžVöÕ½œo'ÖOît£Áü–Z µ‚¡¹{̽8ˆ€zw²XG|×_¨%}GPПÿO.ÒoèùãÒi'R—”‰'Ê)"ÎæIƒLYÿ~.¹ìC„â4Y[iŒ0œpû­Ž=¸üÝ„þ °83(Çè‹áNÊ}®ÔoŒ]GŸx¤”`óz§ÊOoÅLìrTFs ÉH^À°\»±xCÅ·WÔˆ÷aæ¼ áº%”qÛK„à*¼3ËénPQ!£pÙ5,7ºaúÆ>«`Ší+‘ߘ µqD½yU©7ÔÞ.u|*‹AJþ~ÖU:…°%UôÉ ëå3"²a³…ç–ÈVBJê~À‡¡™aÎ¥ÿ-/R§è|DçêE¦0r;–åï•ka [ÿÉý(4¥´xùi:ÇîËX,ûÑײ5:#e8{qñNPŠ‚Úü*5ÁÃ<^™2ø²“  !C+Oõ}»ª6ƦZ¯¨ÔˆÔ“5ÏOœbGôû\„ø-ÁiSòÞ[´ú’Œ‡´¡\Ø^¡•‚†˜Xß …žNFþ2åÞòAé2¬º.J>± ¦g»j*õܰ.°Øztml|ñîlµ¾ù(éè»zXóðK+-yÞ@ŽŠS®s‚üs9jœ)ôÄ…šfAfɇpe>M©?gêpº¶,JmúXòi „Ø®ÖÛUíßW/2ìÇn2¦Ùn#vÕŠ"Û2MgˆL«¥ §) „¥r*‡ùW°Þ±¸ZÔ”Q.÷šÃjH²sà$­2uF»WîèÚ€º±›ƒDt× •ஂ%Å·ˆ)¶Iz*£MD$µr?üž§M%ï–¢î ”/bPTæ%åy0tµõ™jKÃèþÎ MrRh6f~5âÒßÁ/DK¡Ÿ¨ÁØä–çûÌäJo)Nû¥ïAŒQ³·†´Un™y¼`Î-X¤bö°×‘P ÷î9š˜É ]nHcRüø†,ï¡ÞDÅ+Õz¸ÿ-Ä­ÊÑ&^\O<'{N4ð˜ÀîÍ27@ ‡¿nÊ‚™iApÄÛ‰c× Î>ÂeqÓÿ"'œì &$&ŒèyŒÍV|fZxp²ÊÞ2’¾r Cv‹<ý=ó=‰ÞŽLÞßÕ§;Ö,,t‹u"ärÙaÁh8\È« ü²uQö©¤g~òn½¼K…ð¼ _6îÄLr¦HÐqI¹G“"·ÇâØ¯¡vÖ!‰…ô÷NÒHofû£E–ÍëB§ *‹i‚Zßq®ïÆk²L.öǘÿ ê:¸®¦¶*>]ÊZÝŸÉXÔ¾:;…þØE{e¢Õ 1/|êó!P ¢D‚¹J8y0ugŒC«ÐéihVÑ!‰¾cFƒ‡!¦EŸÓh-°ÉýAË<½÷Lkq±“Žu¹´âšé?j]ç׎¾†R¾µtËJIÁú û ¦h_I92¡¸OÂäqhý»óÁ^ÕÙ()‘ôEÄ×ã V®Ü7ÑYçf]À&Á›7ÏÉŸÛÄñµËÿJkd++溂UhÕ±4go‡¬n*Ç<îÊi ŒÈÝ3ÙžS@˜+ï'Ò9åz÷)F’Qëß4ßRæ®`çÏs¹<˜Ÿc“ÁoܱìY10cÆwM–ºAô½ë¯¹<ÞŒlÉ7˜‚PÁíl³’g˜×¶†» ŒÃ.é6Ò?ÖkäX^.…å9ü‹¶;F´Äç‰ôXŠfuÝ/öýhw¬o0ã Ý‚q›9^EX`^¨Ü}hüQ&‰)ZÚÇ(WùþKùNu|›„fþ“‹ì­žkX½±¯ÃÞã‘;jÍ“ösV.Ý’´i²uÜì3˜„D.Áׂ0ÕóráœÙr¬tx`ùœñ‡khw.øÔ?‰ü/·œÃ5ˆ47¿¢…ã]'e.Tÿ4E'»_£øj˜ÊųÂÙóskܵw‡µŸ@€ÿ.½â`A_,—r¹Y É¿Øüp6Q”ꤣJzy™½ê™ñêá å-DêÓ980“F,=5C¹+¯…!‚8þ_©ÕSPô¬š Ñ"$"½ºÙnÚÎ’:ç× yö”·È1ª€œÙU¥>Ì!vC•@:<¨Ü.[¦ÖÎÖ.Š_‚§‚jùÒ™òË6L¹6.9GžPZNýãe¶CªªËÀ&ü0¤¼ÿ|Mýèž1“ŠƒÈ°·áÁѼ"5¬ä0ž³Û®IâH‰†'·f•<•‚ñÅÞÊ#¼¸´ f+µ«dØâéOQ)ˆ¾–¤AMËå2ÓÅÒ¿m'RiÓ™»PqhÏþƒøÖߪµF˜ÌÐÆ"·Ìýò~eç×b9¦»'!Ø0‡«4ù9úf'R¯Ã³Xdóî¬Nó®I.-¬;'ÆLPËù 1iû¹ò¾¾ú™@µ²DœË(sÝÓÆuD4IŸÜoÀª„\Ôö£îç-t*Èz‘[Ö…“–.dš¨•vQµG]ÆE<ì@Ÿ:[Á‹ú7ƒ,‡ÈܸóT±»Š ŸCcFËåbw][` ¡Ð‰°*Zª9d†»ÕKQ¤[Z7׫Á2Þí-CFÇ‹8N‡oåÁ¨Å5èKyyW®ïÖœÄ-‡¾“ÅèÛúÏëFÇuCKÅ#è¦/øòÛO.ÜE«tÅa$|˜)÷y€<`êÅ2‡äpPÖXÀ§ÁÖhGoO‚Õ`¿3ügeºYéU(¹…#»ÉÔ@ˆvÐÓûpg-|¸¯’â*îÕ}HFoâ žAÅŠœhúnñçD¨mßU&«É?Áà ݘË9‚†¸éµÂbëܘ‡‹7êÇ#YBZÂO…bÖ¦®ýÞòÑÌÉpV !Û/ê .Äk2ožíÅøOYOαÈ&P.(ráõÆä”˜Cè-Mºç‡úZîŽ úÝmå`™–ê$¿d¨ŠtÎŒ&á²Ü;ŠiËX0Âê! ao¾zµh6"GüJY¾Aʈ*º£8çhö»-^Ud÷Òo°8ÄdØh!{†vbþÆí[PŠ_Š&Þ'öHÌ•°ÅǼcmÔvœ¶ð^xBHÍøò°'‹Û†Wâ—‹:ºØ|”Tk«j  !ö™¡ÝZ‹Rº ¢ÅÎh"ÅêU~ÆUì/¦s•Ðh=]àu¦oˆ³“ñý¬+»ê³ï©®ú†ÛPoÔ4¿¶ËýN/Ú§ûnþ?µOö‘ÿ[zßSp¾¤Ùk½ú¿QWí¤¿máÂ~wÑÖ{ê²ÿ5¸_RT¿µÒ~zrú’?mnŸ]Î_ýÍø>@Î~gâáî &RMu ­â×¥QÎB;=ËíaMµU*N¦¬‡©S^¼—i‹É‹%­7/ÌÃXfê¸C¢`UTÅÜ¥y/DÜ‹¼ï,”$¿=©f?Þ,±(E¿5s4¿Ô-ù¡e!ÀèÖ#>±$›#ÊiÈæefÏF0`iàÛÞ••✠Òùô02ÇÌXic ¿ž/Ü6ÉËž•¸F“ß ‡ºSZ¹srO9Îu!U.£ºWU·ž&ûÉÁ´ô3ô1?•wù"±0pF~oÃvbñ‘É0r¯ˆFÞ¢å7Cæ¼ÇߨÁã`£Þ¼dýV¦v(7<>ÀB¤;_Á1A¢ðeþº{z^'ZM^hJÂ>êaX¬P–ßmç¬e5—Rõ¬ðƒ¼ôŸKáÎÙ&‘ä,i»÷™‚-Ü;+¥åʃÒ/ÿ('qðq¤œ+¤™–å†ÇŸQ#˜ŒYYÉl!ˆ¯M+ÛšÞ[‡LÅSjÅìkž‘¤¼YæãGÉØÆ…Ÿsø‘ÔxŒcÃÙ¯DÐ’©±OÿÉgÂBJN JÙÅÝaÓ5~‘¬{yæù\zéý( ð€ŠÄç¾ ݧjp`·0*]¾ÿek.¸T1)+§{4Æ?~$(Ô)¸ÕzÇU %’“à¢À‚zŠR‰…¥‰³¤jÍ»M~Àù-.‘0–„ÒNž÷ëé–’©±OòãÔ3Ë€°ñ7 $!Q%λS“„ƒ³bÇj‰hx¾œ…kÉØ þ Òm*ë™ô؃•B6¤Pìé¶HBëž/éŒB:ÎFG_çšñ›æS” T³¯ˆIÀÏBuóã½Æúªõu¯Žš±öÎÃ<‹´n÷“µGÆò¡Ý9àO§8ÐpÍcf‹˜á§P>ħç^£ßj{‹˜’$?¬ŒVæÆX.½M‰C°Ñƒd¦Ì{ïýŽ»ƒ|z‹ÞÛká˜ÑâåJ£½æJ®ÿO*$+Ä`–‡‡'°;ç7¢ÈX€› øz”"«¹²þÄ1­hW¬svB­õË9€~šË  ÕÀR($ªh²Qñ¿I«‰jrªa†…¬ÒøÙÄ:GæŸ]UK–ÝÀ1+ƒV‡7Ì>Óž q rŸUóºTÙ­ARÑ!ÏèéAºüc aKªgþ=Ò Û§_É\ºSbÙ‘­$ îbCæ\à€Ú”Fl3•¸L”ŠÅé2¼ÇEÍ(!µ*ÙÝ[_œt‰Ó©¥¹ö¢™<5_Ïcá–éj¶áÚ¿u“^vTà–‡^ìãŬ˜‚¢”*BRcâB  :"Ì[å”UñÙ2)iò=šˆQjá,Il4м0°* qªÏ¹…R)ç*¢–ªìBt}Âò¥Ñª–"ȆW0Sz£•¾Ó$xÕ Ñ~÷ø£ßÀ $%úh˜”/$˜Œ ¦Z~µ”ƵðÖKÔëàMÅlmËw¢Ò/ýP#[ ÷® |/h¢˜lNIØ$ÚÉÎD‹¸¾L_)‡áÈqŽh­=ÖiÔ| áÚXq»ÍºL£è±܆‡¤z{²uA±h©yDp¶áÛGþ}G±Ùó|Èp5K˜4é$æZ…N'›È¸Oadz§5†Ÿ”ÊWq3 p6 îáCÙõ­I„„Jû;ð¯üžâºÐÃøÐYòó^8¢5Ô ùÐuÓË2]¯ ª©˜+V 1;›JÆp‚}E’ÜrÍ›¹):ŸµØíÔgeõ¨Y,š‚ÀÎáó'šï]è¹Êèñƒcg®êÏŒ´<éè{+óþ)‡rÜ‚÷Ú~£Höñ¦\ìVõP¯}ø„ànó÷$ÏY ]AÕ«iY¹³O½²Á·+ý¨ý-õ5õT€ñXÇËwÒ`áÇ›€ueÖ:Ë)dA•6ÔòB×z ù:lmžWÈvohÕýŸš ^iaµíŠ!°{„ƒÑ 3LÞ“Íã=¡¸5ŽÙçê¾eÖfêŒ`Êý¦¡> K²fˆGQë Ëþ–ÍLðÖø”v.%æ øe;ÆC€ð‚µVD˜êÅ.~…#D°CoÛé˜4™Æ‹‰ã¼e Qn¨Ž¥QWa:XJÎi¹Cð¼+‘>#·ð»¥òßù²‡'e ½­…>?ËZðæµ:0i’§æ-Yÿg8-EhÍxòx×Î/ÄÒvŸä ;ÃYo…Ÿ§§pÁ©ƒ.•K]goËLÇ´˜¯{ Ž—D¹hlLñbT¶·Ñ8ØaÅ+^²¡ÝoéÇè4uD/öÓ¡žWÆ|¾ÙŽ#âÛœÃEÜ%¯¢úA˜I]»!TJµ  ´YÌx[1Ñ÷ÏF!ÅŽxs@û„‚±ä¸¶Ñ„ÊW ”·‘³²ê,&ÓM¥©*‰uå¨ÍöD)Gò£ÆÅÏe2E÷º«›q¿Ÿ+õMª<‡€´ÂËÇÍÏsøþ`,o)F¸¥Z¯÷Ø3ØZRv›at±„th§á#çH'ÛÑ£üˆÒºlÖ\*Qt–=zw`}Ùñ+WGÕ@‘‚ÿÅÒÈËÎÅÒÈɵuþö;5ïþœ€'5‚ÿÂÈÃÅÇÀÊ•§ÿŸ ¤ÿÿ§¯ ?‚ÿÆÚÍÓ×ËÚÍφ¬ÿpÇÿÿ]/ÿ9!‚ÿÌÉÈÀŽÈÈÆ¦ÿ—†ï3ë+JƒÿÛÏÆøÿÿß!-ùÿA..f&"EƒÿçÒÌÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ˆìëæÈrŒóëÛ¶¸¸·¹¸µÓéâÖ͘‹óåÊ·¾Â´Å·¾ÃãÛÕº¼ÁŠñ³²±³µ®·°´±¯´©˜¶÷À‰ð³Å»¾Á¶Ä¸¿À´Á®¥´ÿ÷Àˆõ˺·»¾´À¶¼¶ÈŬ·ÿÿøÀ‡øóݳ·º²½´¶ÑõñîÞ¸ˆux—†ùîêÝÝܸȹÞèìèåÛÅ®Ÿ~‰‚T…úñò€ô»¶Á÷õ¸´´«£¢›¤ }…ûÝÚÛÛڹ͹ÜܶͽÅÀ·Ä¶È¿ž†ø¸Âº¼À·Äº¾À¶ÀÇÅÃÿ³ÁÀ¢†úºÄ½¾Â·Äº¿À±Úùöö÷ð¸ÃÁ¥†ú¾Î½àÞßÝÜÚÙÆ1ÀóóôñàÜ鮆ý»¾Ëþúûùø^xž€õøøÿ½2‚þÁÒÃêæçæçæòñÝ{÷o€‡„‰‹Ô VÅ‚ÿ¾Æ½À»Ľ½Ýóó£zyñÿÿÙmcÿHƒ ÿÀËÃÆÉÀÌÃÄÞ€õN݃ÿ®G„ÿÂÏÆÊÍÃÐÆÉÞ÷÷Dz…ÿk„ÿ¿Å¿ÁýƿÃËøøeE­ÎÎ×Å£lDƒÿÅÖÌÐÓÈØÌÐÖúw jÕέ“¤¹ä&H‚ÿÁÇÁÞÇÀÁä® cûûíA„¡{,&‚ÿÄÑÈÌÏÅÒÈÊè=&ãýÌ57Œ15>‚ÿÅÒÈËÎÅÒÈɵuþö;5ïþœ€'5‚ÿÂÈÃÅÇÀÊ•§ÿŸ ¤ÿÿ§¯ ?‚ÿÆÚÍÓ×ËÚÍφ¬ÿpÇÿÿ]/ÿ9!‚ÿÌÉÈÀŽÈÈÆ¦ÿ—†ï3ë+JƒÿÛÏÆøÿÿß!-ùÿA..f&"EƒÿçÒÌÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ˆìëæÈrŒóëÛ¶¸¸·¹¸µÓéâÖ͘‹óåÊ·¾Â´Å·¾ÃãÛÕº¼ÁŠñ³²±³µ®·°´±¯´©˜¶÷À‰ð³Å»¾Á¶Ä¸¿À´Á®¥´ÿ÷Àˆõ˺·»¾´À¶¼¶ÈŬ·ÿÿøÀ‡øóݳ·º²½´¶ÑõñîÞ¸ˆux—†ùîêÝÝܸȹÞèìèåÛÅ®Ÿ~‰‚T…úñò€ô»¶Á÷õ¸´´«£¢›¤ }…ûÝÚÛÛڹ͹ÜܶͽÅÀ·Ä¶È¿ž†ø¸Âº¼À·Äº¾À¶ÀÇÅÃÿ³ÁÀ¢†úºÄ½¾Â·Äº¿À±Úùöö÷ð¸ÃÁ¥†ú¾Î½àÞßÝÜÚÙÆ1ÀóóôñàÜ鮆ý»¾Ëþúûùø^xž€õøøÿ½2‚þÁÒÃêæçæçæòñÝ{÷o€‡„‰‹Ô VÅ‚ÿ¾Æ½À»Ľ½Ýóó£zyñÿÿÙmcÿHƒ ÿÀËÃÆÉÀÌÃÄÞ€õN݃ÿ®G„ÿÂÏÆÊÍÃÐÆÉÞ÷÷Dz…ÿk„ÿ¿Å¿ÁýƿÃËøøeE­ÎÎ×Å£lDƒÿÅÖÌÐÓÈØÌÐÖúw jÕέ“¤¹ä&H‚ÿÁÇÁÞÇÀÁä® cûûíA„¡{,&‚ÿÄÑÈÌÏÅÒÈÊè=&ãýÌ57Œ15>‚ÿÅÒÈËÎÅÒÈɵuþö;5ïþœ€'5‚ÿÂÈÃÅÇÀÊ•§ÿŸ ¤ÿÿ§¯ ?‚ÿÆÚÍÓ×ËÚÍφ¬ÿpÇÿÿ]/ÿ9!‚ÿÌÉÈÀŽÈÈÆ¦ÿ—†ï3ë+JƒÿÛÏÆøÿÿß!-ùÿA..f&"EƒÿçÒÌÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚l8mk(_ccccccccccco`oÿÿÿÿÿÿÿÿÿÿÿÿÿûÞItÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýYtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýWtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöUtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ$tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþitÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿotÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmatÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬âÿqtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿítÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqŸÿztÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿêtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm'ÿátÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm£ÿltÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÿìtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô&tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿj3y‚‚‚‚‚‚‚‚‚‚‚‚Àÿÿÿÿÿÿÿý@QŒ¡ ‡Qit32jGˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%çˆæœåææååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çˆæé›ëè€åããâàÞÜÚ×ÓÏÊľ°à¶¸%è‡çé×Ë™ÍËÝéææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è†çæì¸—œ€œ€€œ€œœ—Ìì忀äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%è†ç æì¼£¡žž ¢¢¡€ž¡¢¢ žžŸ€¢  žžŸ¢¢ŸÔëææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çæì»œ¡¥€¹¨  ¦·¶µ¤¡ ©·¶³¢¡ «µ´¯¡¡Ÿ×ê€æ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è†ç<æì»»ðéðËÉïèï»Íïé벞¡Üìé窟¡ÚêæçææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çæ=åë»»êãêÌÍêãê»Ìêãè´¢Üç俬ž¡ÛèåæååäããáàÝÚØÓÏÈ¿´¦ÝçÚÍÕ£²%éèéì>ëñÁžž¾ñêñОžÏñêñ¾žžÐñê£áîìì­Ÿ¢àïëììëëêééçåâßÛÖÐǽªÕñâÚÍÕ ± %éèèçë×¹½€¼>¾¬¡ °ÑÍѸ  ¶ÑÍа  »ÑÍÍ©¡¡ÃÐÎË¥¡¡¹ÇÂÁ¿¼»»ºº¹·µ³°¬§Ÿ™…ÁúéäÚÍÔŸ° %éèèçí̘ž€ž ¢¢ €žŸ¢¢ €ž ¢¢Ÿ€ž¡¢¢Ÿ€ž¡¢¢Ÿ€ž‚œ›™˜–”’އo±ÿðëãÚÍÕž ¯ %êééèîÏŸ¥£€Ÿ ££¢€Ÿ¡££¢€Ÿ¢££¡€Ÿ€£ €Ÿ€£ ŸŸ €¤ŸžŸ¡Ÿ–“‹‰w©ÿöòëãÙÌÕ ®O%êééèîÏž£§½½¿³¢¢ª¾¼¿®¢¢¬¾½¾©¢¡°¿½»¥£¢´¾½¹¤£¢·¾¾µ¢£¤¸½½¬žŸž¯°¬˜‡xŸÿú÷òëâÙÌÖ ­P%êééèîÏŸ ¸ñíòÙ¡Ÿ¾óìóÏŸŸÌóì󾟟Ñóíï² £àñîì­ ¦åïðᣡ­ìíòΜž¨áÝÜ·„y—ÿýû÷òëâÙÍÕ ¬Q%êééèîÏŸ ·êæêÖ¢Ÿ½ìåìΟŸËìå콟ŸÎìæé² ¤Ýéæè® ¦àèéݤ ®èåêÌž¨Ý×Ö¶…z”þÿýû÷òëâÙÍÖ «R%êééèîÏŸ ¸ñìòÚ¡ž¿óìóПŸÍóì󾟟Ñóíï³ £áñîí® §æïð⣠®ííòМž«äÞݹ…}‹ûÿþýû÷òëâÚÍÖ ªS%ëêêéïÏž£¨ÌÏѺ¡¢¬ÎÎб¡¡¯ÌÊÊ«¢¡´ËÉÆ¦£¡ºËʤ£¢¿ÈÈ»¢£¤¾À¿±  ¡µ²°ž‰~‡ùÿþþýû÷òëãÚÍ× © %ëêêéïП¥£€Ÿ ££¢€Ÿ¡££¡€Ÿ¢££¡€Ÿ¢££ €Ÿ€£ ŸŸ €¤€Ÿ ¡£¡Ÿ™–’Œ‰ù€ÿ þýû÷òëãÚÎØ ¨ %ëêêéïΛ Ÿ¢££¢€Ÿ¡££¡€Ÿ¢££ €Ÿ¢££ €Ÿ€£ €Ÿ€ž€Ÿ žžœ›š—“ˆ}‡ùÿ€þ ýüú÷òêãÛÎØž §/%ìëëêïÔ­¹»¾¾¿­£¢¯ÐÐÒµ¢¢±ÑÐЮ£¢¸ÒÐ˧¤¢½ÒÑÆ¥¤£·¿†¾ »¹¸µ²­§¢•û„ÿ ü÷ðèáÙÎÙž ¦%ì‚ë'ìîïðïõΠ ÀõîõÒ  ÏõîõÀ  Óõïñ´¡¤äóðﯡ¤ãóïƒð ïïìéåâÞØÑËÀ½íñíììïñöûþÿýöêÜÌמ ¥%ìƒë€ê#éïË  ¾îçîР Íîçî¾  Ïîè곡¥ßëè鯡¥àìéƒê!ééèçåâÝØÑÊÀµªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì†ë#êðË  ¿õîõР Íõîõ¿  Òõïñ³¡¤âóð¤àíêƒë"êêéèåãßÚÓ˹­žŽ‚|zxuspkihly’³Ìç¨ £%ì†ëêðËŸ¤«À¿À®££¬À¿¿ª£¢±Á¿½¦¤£´ÀÀº€¤àíêƒëêêéèæãßÚÕÎÅ»°¢’…~}~v€[ YUPOXu¿ ¢&í†ìëñÍ¡§¥€¡¤¦¦¥€¡¤¥¥£€¡€¥£¡¡¢€¦áîëƒìëëêéçåáÜÖÐÉ¿µ¨˜‚†|YX YYUKDˆ‚¡&í†ìëñÄ›¡ €¡ €¡ £¥¥£¡¡¢¤¥¥¢€¡€ àïëƒìëëêêçåâÝØÒËú¯£™“’€‘‡€b€`€^ZEjS¡&î†íìïÝÈÓ†ÒÑÔ³£¢¿ÕÒÒ¬¤£ÀÕÑ€ÒÑéî…í$ìëêèçäßÚÕÎÈÀ¸¯¨¢ Ÿžž”kkj†‘‰jeartƒ8 &îˆíðˆòñ÷¡¡Õ÷ðô·¢£Þöñòî†íìëêèæäáÛ×ÒÌÅ¿¹³¯­«ªªŸ€t Ÿ¨¥¤xmi‡—Œ…Ÿ&îˆí‰ìëñÀ¡¡Òñêî¶¢£×ðëìíî'ïïîîíìêèæáÝØÓÍÈÿ¼¹¸·¸¬}||©´²±vs“¦š¢FŸ&î”íìòÀ¡¡Ðòìî´£¢×ñì„í,îçéèçæåäâáàÞÜÚ×ÓÏËÆÂ¿¼¹·¶µ¶«ƒ„„´¹²²ˆz´«°hŸ&ï”îíóÁ¡¦«²±±¦§¢×òí‚îíòÚ§­««ª©¨¦¥¥£¢¡Ÿš˜•“‘ŒŒ€‹ЋГ‰Š‰ˆ†‰‰Œo &ï”îíóÁ¡§¥€£¦§¢Öòí‚îíóÖ¡‡¥£¢¡Ÿ›˜—•”’‘‘‘ ‘‹ˆ†Šv &ï”îíóÁ¡§¥§§¦¥§¢Õóí‚îíòØ£¨¦¦§§¥¦¥¤¥¥£¡¡ œ›™€—”••–•––•––•””“‘‘”z &ð”ïîô£¤Êèã㲦£Ôôî‚ï,îô×£¦®âäçÑ¥£·äáåÄ  ·ÞØÚ®™˜¹ÖÒÓ¦˜šÇÕÑײ–•·ÒÌÔ¡&ð‚ïîíó££Ööïô»¤£Óóí‚î.íóÔ£¥²ñðô娢ÂõíôÓ ŸÅïçíº››Ëêâ籚ŸÙæáèÁ˜˜ÇäÛ螟&ðïñô€ò‹ñðöã£Ôóìò¼¤£Ööð‚ñ.ðöØ£¥²ïíð㨢ÃóëòÒ¡¡Çîæí¾žÍëäéµ¢ÜèãêÛ›ÊçÝ죟&ð€ïñåÕÞàãŠäåå麤£Ðóîï¶¥¤Êèã‚ä,ãèˤ¦°íïòÛ¦£½òíóΡ¢Ãðéî¼ ŸËíèè° ¢Ùìè쿟žÇëä육 &ñððïõÓŸ§§‹¨ ©ª©§¨§«³³±§¨¨§†¨§€¨'±³´¬§¨¨²³²ª¦¦§±±°§¥¤¨°°®¤¥¤©°¯¯¥¤¤¦¯­±‹  &ñððïõÕ¤©¨€¥§€¨€¥¨€¥€¨§££¤€¨§¥¥¦€¨¦¥¥§€¨¦¥¥§€¨€¦§¨¨§€¥€§¦€¥€¦£¢£¢€¥¤ Ÿ§Ž 9&òññðöÖ£©¨²³´¬§¨©²³³ª¨¨©³³²©¨§«´´±§¨§­´³¯§¨§¯´´¯§¨¨§¨¨§§‚¦€¥¤¥¤¤ƒ£¤¨¨§®­§§¦§¦©²±¶Ž E&òññðöÖ¤¦¸òðõÙ¦¤¿ôïõΤ¤ËõïôÀ¥¤Òõðñ¸¥§àôñí°¤°ìñó䨨§ÙèäãâáàßÞÝÜÜÛÚÙØ×‚Õ×Ψ¨§áìä㯧¤Ðôí÷¤¡1&òññðöÖ¤¥¾ôïôà§£Äöïöפ¤×öïöĤ¤×öïõÀ£©çóðò´£²ðñ󿀍é÷óô„õ„öõùꀨ æõó󳦤Öõìû¬Ÿ1&òññðöÖ¤¥¾öñ÷á§£Åøñø×¤¤ØøñøÅ¤¤Øøñ÷À£©èõòó´£´óóõ耨åóïðïó倨 èõòô´¦£×øïþ­Ÿ6&óòòñ÷×¥§¶èæëÓ§¦½êåëʦ¦Èëå꽦¦Îëæè·¦©Úéç屦®âçéÚ¨©©âô‘òôꬨ¨Úéèᮩ¥Ìëäî¡¡ &óòòñ÷פª¨€ª¨©©¨€ª©ªª©€ª©ªª©ªª©©ª©¨©©¨¨©¨¨©©¨€©ãô‘òóﲨª©ªª©©ªª©ª©¯ 'ôóóòøØ¥«ª§¦¦¨€ª¨‹§¨©ˆªãô‘óô§¨‚§¦­ 'ôóóòøØ¥««¹»»±©ª©³¶‰µ ´³²±°¯®­¬«‡ªåõ‘óôî´²¶†µ´»› 'ôóóòøØ¦¨¼÷ôùÞ§¨·òŠó òñðïîíìëêéèãääñ“óôïñ‡óñûР'ôóóòøØ¦§¾õñöߨ§ºõŒóôõöòòóôôõ•óôˆóñûР'õôôóùئ§¿úõû㨧¹õŽô‰óôôóó•ôóˆôòüР'õôôóùØ¥©³âãæË¨§ºõÂôòüР 'öõõôúÙ¦¬ª©¬¨»÷ÂõóþÑ 'öõõôúÙ¦¬«§¦¦©¬§¼÷ÂõóþÑ '÷ööõûÚ§¬®ÆÇɺ«©¾øÂöôÿÑ '÷ööõûÚ¨©¾üúÿâ©©¿øÂöôÿÑ '÷ööõûÚ¨ª¾öóøßª©Àøô–õ¨öôÿÒ '÷ööõûÚ¨©¿ýúÿ㩨Ãþú•ûú¨öôÿÒ '÷ööõûÚ§¬±ØÚÝÅ©¬±ÊÌËÊÉ‚ÈÉÉ‚ÈÉÈÆÏ¨öôÿÒ  'ø÷÷öüÛ§­«€¨©¬¬«€¨§€¨€§¨€§‚¨¤³¨÷õÿÓ  'ø÷÷öüÛ§­«€¨©¬¬«€¨«­­«€¨«­­ª€¨ ¬­­©¨¨©®ª¸¨÷õÿÓ -'ùøø÷ýܨ­±ÖÚÛ«¬µÖÖØ»««ºÙ×Ù·¬«ÄÚØÓ°¬­ÎÙÚˬ«¸¨øöÿÓ -'ùøø÷ýÜ©«¾ÿüÿ㪨ÊÿûÿÝ©©Ûÿûÿ˨­îÿüý¹¨¸ûýÿ𭪸¨øöÿÓ -'ùøø÷ýÜ©«½øõúÞª©ÉûôûÜ©©Ùûôûɨ®éùõö¹¨¸õöøë®ª¸¨øöÿÔ -'ùøø÷ýÜ©«½þüÿ⪩ÊÿûÿÜ©©Ùÿûÿʨ­ìÿüü¹¨¶ùýÿ𭪸øö÷–øöÿÔ -'úùùøþÝ©®±ÉÊ̽¬­µËÉ̹­­¸ÌÉ˵­¬¾ÌÊȰ­®ÅËËùþø÷•ù÷ÿÔ  'úùùøþÝ©¯®€ª¬®®­€ª¬®®­€ª­®®¬€ª€®«ªª«¯«¹ŒùûÛôüö”ù÷ÿמ (ûúúùÿÞª°®€«¬¯¯­€«¬¯¯­€«­¯¯¬€«®¯®«°¬º‹ú÷ÿOAóÿõù‘úùôÿÄŸ-(ûúúùÿÞª¯¶ÝÞáʬ­¼àÝáÄ­­ÂáÝ཭­ÍáÞÛ´®°×ßàÓ®­º‹ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ-(ûúúùÿÞ«­¿ÿþÿã««Íÿýÿà««Ûÿýÿͪ¯íÿþÿ¼ª¸ûÿÿ󯬺€ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡2(ûúúùÿÞ«­½ù÷ýÞ««ËþöýÞ««Øýöþ˪¯éû÷ù»ª·õøúî°¬ºúúùþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  3(ûúúùÿÞ«­½ýüÿà««ÉÿúÿÙ««ÕÿúÿÊ«®çÿüû¹«µõýÿº÷ÿ¨Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(ûúúùÿÞª°°ÃÅŸ®¯±ÁÁ³®®³€Á±¯®·Â¾¯¯®»Âº¯­ºöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž (üûûúÿߪ°¯€«­€¯¬««®¯¯®€«€¯­««¬€¯¬««­°¬º÷ÿ˜B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž6(üûûúÿߪ°®¯°°­¯¯­¯°°­¯¯­¯°¯­¯¯­°°®®¯®®°°­¯¬ºøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž7(ýüüûÿ૯¸íðôÔ­®ÀñïóÊ­­ÇòïñÁ­­Öóðê¶®±äòòÞ¯®¼úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ7(ýüüûÿà«®¿ÿþÿ㬬ÎÿýÿᬬÙÿýÿΫ¯ìÿþÿ¼«¸úÿÿó°­¼üýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž8(ýüüûÿà«®¿üúÿବÍÿùÿବØÿøÿÍ«¯éÿúü¼¬·÷üýñ±­¼üùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž9(ýüüûÿà«®¼ûûÿÞ¬­ÇÿúÿÕ¬¬ÐÿúÿȬ®âÿüø¹­´òýÿ믭¼üùÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ýüüûÿ૱°º¼½´¯°°»¼¼±€°¼¼»°°¯³½½¸¯°¯¶½½µ°®»üúÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýüüûÿ૱°­¬¬¯€°€­°€­°­­®€°¯­­¯±­»üüûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þýýüÿᬲ°¶¸·²±±°´µ´°±±°€³°€±´³²°±°²´³±±®¼ýýùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–g(þýýüÿᬰ¼÷÷ûÛ®®ÆøóøÓ®®Î÷ñöÆ®¯Þ÷óð¹®´ìôöå°®½ýýûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(€ÿ'þÿâ­±¹ãâåϯ°Àäáåȯ°ÅåáäÀ°°Ðåâß¶±³ÛãäÖ±¯¾ƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(€ÿþÿâ­³±€®¯²²°€®°²²°€®°²²¯€®±²²®³¯¾ƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(€ÿþÿâ­³²€®°²²±€®±²²±€®±²²°€®€²¯®®¯³¯¾€ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(€ÿ'þÿâ­²µÎÏѰ±¹ÐÎѽ°±»ÐÏй±°ÂÑÏÌ´²±ÉÐÐDZ¯¾€ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(€ÿ'þÿ⮯Åÿþÿè°­Ïÿýÿà®®ÜÿýÿÏ­²îÿþÿ¾­»üÿÿ󳯾ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(€ÿ'þÿ⮯Æÿüÿè°­Îÿûÿá®®Þÿûÿέ²ïÿüý¾­¼ûýÿò³¯¾ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(€ÿ'þÿ⮯Çÿýÿê°­Ïÿýÿâ®®ßÿýÿÏ­²ñÿþÿ¾­¼ýÿÿ󳯾‚ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(€ÿ'þÿâ­²·ßâå˰±¼áâãð°ÀáÞÞ»±°Ëâߨ´±²Õáàϱ°¾„ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(€ÿþÿã®´²€®°³³±€®°²²°€®±²²¯€® ²³³¯®®¯´°¾„ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(€ÿþÿà§®­®€­€®°²²±€®°²²±€®€­‚®ª¹„ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(€ÿþÿíÌÐ‡Ï ÑÁ°±»ÐÎѼ°±»Ð‡ÏÍÖˆÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(Žÿþÿâ®®ÏÿýÿÕ®®Ùÿþ”ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ƒÿˆþýÿâ®®ÎÿûÿÕ®®×ÿýˆþ‰ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(Žÿþÿâ®®ÏÿýÿÖ®®Õÿþ—ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(Žÿþÿâ­±»ÑÎÒ¼±­Ôÿþ–ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(Žÿþÿâ­³±€®°³­Óÿþ˜ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(Žÿþÿâ­³°€®°³­Ñÿþ›ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(Žÿþÿâ­°Àäáäð­Ïÿþ•ÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (üûúÿß««ÊÿúÿÑ««Ïÿú’û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(Žÿþÿ纾ÁËÊËÁ¾ºÜÿþ‘ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€bŒceXDGE€CEGDRe’cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埑‡“=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%çˆæœåææååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çˆæé›ëè€åããâàÞÜÚ×ÓÏÊľ°à¶¸%è‡çé×Ë™ÍËÝéææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è†çæì¸—œ€œ€€œ€œœ—Ìì忀äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%è†ç æì¼£¡žž ¢¢¡€ž¡¢¢ žžŸ€¢  žžŸ¢¢ŸÔëææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çæì»œ¡¥€¹¨  ¦·¶µ¤¡ ©·¶³¢¡ «µ´¯¡¡Ÿ×ê€æ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è†ç<æì»»ðéðËÉïèï»Íïé벞¡Üìé窟¡ÚêæçææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çæ=åë»»êãêÌÍêãê»Ìêãè´¢Üç俬ž¡ÛèåæååäããáàÝÚØÓÏÈ¿´¦ÝçÚÍÕ£²%éèéì>ëñÁžž¾ñêñОžÏñêñ¾žžÐñê£áîìì­Ÿ¢àïëììëëêééçåâßÛÖÐǽªÕñâÚÍÕ ± %éèèçë×¹½€¼>¾¬¡ °ÑÍѸ  ¶ÑÍа  »ÑÍÍ©¡¡ÃÐÎË¥¡¡¹ÇÂÁ¿¼»»ºº¹·µ³°¬§Ÿ™…ÁúéäÚÍÔŸ° %éèèçí̘ž€ž ¢¢ €žŸ¢¢ €ž ¢¢Ÿ€ž¡¢¢Ÿ€ž¡¢¢Ÿ€ž‚œ›™˜–”’އo±ÿðëãÚÍÕž ¯ %êééèîÏŸ¥£€Ÿ ££¢€Ÿ¡££¢€Ÿ¢££¡€Ÿ€£ €Ÿ€£ ŸŸ €¤ŸžŸ¡Ÿ–“‹‰w©ÿöòëãÙÌÕ ®O%êééèîÏž£§½½¿³¢¢ª¾¼¿®¢¢¬¾½¾©¢¡°¿½»¥£¢´¾½¹¤£¢·¾¾µ¢£¤¸½½¬žŸž¯°¬˜‡xŸÿú÷òëâÙÌÖ ­P%êééèîÏŸ ¸ñíòÙ¡Ÿ¾óìóÏŸŸÌóì󾟟Ñóíï² £àñîì­ ¦åïðᣡ­ìíòΜž¨áÝÜ·„y—ÿýû÷òëâÙÍÕ ¬Q%êééèîÏŸ ·êæêÖ¢Ÿ½ìåìΟŸËìå콟ŸÎìæé² ¤Ýéæè® ¦àèéݤ ®èåêÌž¨Ý×Ö¶…z”þÿýû÷òëâÙÍÖ «R%êééèîÏŸ ¸ñìòÚ¡ž¿óìóПŸÍóì󾟟Ñóíï³ £áñîí® §æïð⣠®ííòМž«äÞݹ…}‹ûÿþýû÷òëâÚÍÖ ªS%ëêêéïÏž£¨ÌÏѺ¡¢¬ÎÎб¡¡¯ÌÊÊ«¢¡´ËÉÆ¦£¡ºËʤ£¢¿ÈÈ»¢£¤¾À¿±  ¡µ²°ž‰~‡ùÿþþýû÷òëãÚÍ× © %ëêêéïП¥£€Ÿ ££¢€Ÿ¡££¡€Ÿ¢££¡€Ÿ¢££ €Ÿ€£ ŸŸ €¤€Ÿ ¡£¡Ÿ™–’Œ‰ù€ÿ þýû÷òëãÚÎØ ¨ %ëêêéïΛ Ÿ¢££¢€Ÿ¡££¡€Ÿ¢££ €Ÿ¢££ €Ÿ€£ €Ÿ€ž€Ÿ žžœ›š—“ˆ}‡ùÿ€þ ýüú÷òêãÛÎØž §/%ìëëêïÔ­¹»¾¾¿­£¢¯ÐÐÒµ¢¢±ÑÐЮ£¢¸ÒÐ˧¤¢½ÒÑÆ¥¤£·¿†¾ »¹¸µ²­§¢•û„ÿ ü÷ðèáÙÎÙž ¦%ì‚ë'ìîïðïõΠ ÀõîõÒ  ÏõîõÀ  Óõïñ´¡¤äóðﯡ¤ãóïƒð ïïìéåâÞØÑËÀ½íñíììïñöûþÿýöêÜÌמ ¥%ìƒë€ê#éïË  ¾îçîР Íîçî¾  Ïîè곡¥ßëè鯡¥àìéƒê!ééèçåâÝØÑÊÀµªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì†ë#êðË  ¿õîõР Íõîõ¿  Òõïñ³¡¤âóð¤àíêƒë"êêéèåãßÚÓ˹­žŽ‚|zxuspkihly’³Ìç¨ £%ì†ëêðËŸ¤«À¿À®££¬À¿¿ª£¢±Á¿½¦¤£´ÀÀº€¤àíêƒëêêéèæãßÚÕÎÅ»°¢’…~}~v€[ YUPOXu¿ ¢&í†ìëñÍ¡§¥€¡¤¦¦¥€¡¤¥¥£€¡€¥£¡¡¢€¦áîëƒìëëêéçåáÜÖÐÉ¿µ¨˜‚†|YX YYUKDˆ‚¡&í†ìëñÄ›¡ €¡ €¡ £¥¥£¡¡¢¤¥¥¢€¡€ àïëƒìëëêêçåâÝØÒËú¯£™“’€‘‡€b€`€^ZEjS¡&î†íìïÝÈÓ†ÒÑÔ³£¢¿ÕÒÒ¬¤£ÀÕÑ€ÒÑéî…í$ìëêèçäßÚÕÎÈÀ¸¯¨¢ Ÿžž”kkj†‘‰jeartƒ8 &îˆíðˆòñ÷¡¡Õ÷ðô·¢£Þöñòî†íìëêèæäáÛ×ÒÌÅ¿¹³¯­«ªªŸ€t Ÿ¨¥¤xmi‡—Œ…Ÿ&îˆí‰ìëñÀ¡¡Òñêî¶¢£×ðëìíî'ïïîîíìêèæáÝØÓÍÈÿ¼¹¸·¸¬}||©´²±vs“¦š¢FŸ&î”íìòÀ¡¡Ðòìî´£¢×ñì„í,îçéèçæåäâáàÞÜÚ×ÓÏËÆÂ¿¼¹·¶µ¶«ƒ„„´¹²²ˆz´«°hŸ&ï”îíóÁ¡¦«²±±¦§¢×òí‚îíòÚ§­««ª©¨¦¥¥£¢¡Ÿš˜•“‘ŒŒ€‹ЋГ‰Š‰ˆ†‰‰Œo &ï”îíóÁ¡§¥€£¦§¢Öòí‚îíóÖ¡‡¥£¢¡Ÿ›˜—•”’‘‘‘ ‘‹ˆ†Šv &ï”îíóÁ¡§¥§§¦¥§¢Õóí‚îíòØ£¨¦¦§§¥¦¥¤¥¥£¡¡ œ›™€—”••–•––•––•””“‘‘”z &ð”ïîô£¤Êèã㲦£Ôôî‚ï,îô×£¦®âäçÑ¥£·äáåÄ  ·ÞØÚ®™˜¹ÖÒÓ¦˜šÇÕÑײ–•·ÒÌÔ¡&ð‚ïîíó££Ööïô»¤£Óóí‚î.íóÔ£¥²ñðô娢ÂõíôÓ ŸÅïçíº››Ëêâ籚ŸÙæáèÁ˜˜ÇäÛ螟&ðïñô€ò‹ñðöã£Ôóìò¼¤£Ööð‚ñ.ðöØ£¥²ïíð㨢ÃóëòÒ¡¡Çîæí¾žÍëäéµ¢ÜèãêÛ›ÊçÝ죟&ð€ïñåÕÞàãŠäåå麤£Ðóîï¶¥¤Êèã‚ä,ãèˤ¦°íïòÛ¦£½òíóΡ¢Ãðéî¼ ŸËíèè° ¢Ùìè쿟žÇëä육 &ñððïõÓŸ§§‹¨ ©ª©§¨§«³³±§¨¨§†¨§€¨'±³´¬§¨¨²³²ª¦¦§±±°§¥¤¨°°®¤¥¤©°¯¯¥¤¤¦¯­±‹  &ñððïõÕ¤©¨€¥§€¨€¥¨€¥€¨§££¤€¨§¥¥¦€¨¦¥¥§€¨¦¥¥§€¨€¦§¨¨§€¥€§¦€¥€¦£¢£¢€¥¤ Ÿ§Ž 9&òññðöÖ£©¨²³´¬§¨©²³³ª¨¨©³³²©¨§«´´±§¨§­´³¯§¨§¯´´¯§¨¨§¨¨§§‚¦€¥¤¥¤¤ƒ£¤¨¨§®­§§¦§¦©²±¶Ž E&òññðöÖ¤¦¸òðõÙ¦¤¿ôïõΤ¤ËõïôÀ¥¤Òõðñ¸¥§àôñí°¤°ìñó䨨§ÙèäãâáàßÞÝÜÜÛÚÙØ×‚Õ×Ψ¨§áìä㯧¤Ðôí÷¤¡1&òññðöÖ¤¥¾ôïôà§£Äöïöפ¤×öïöĤ¤×öïõÀ£©çóðò´£²ðñ󿀍é÷óô„õ„öõùꀨ æõó󳦤Öõìû¬Ÿ1&òññðöÖ¤¥¾öñ÷á§£Åøñø×¤¤ØøñøÅ¤¤Øøñ÷À£©èõòó´£´óóõ耨åóïðïó倨 èõòô´¦£×øïþ­Ÿ6&óòòñ÷×¥§¶èæëÓ§¦½êåëʦ¦Èëå꽦¦Îëæè·¦©Úéç屦®âçéÚ¨©©âô‘òôꬨ¨Úéèᮩ¥Ìëäî¡¡ &óòòñ÷פª¨€ª¨©©¨€ª©ªª©€ª©ªª©ªª©©ª©¨©©¨¨©¨¨©©¨€©ãô‘òóﲨª©ªª©©ªª©ª©¯ 'ôóóòøØ¥«ª§¦¦¨€ª¨‹§¨©ˆªãô‘óô§¨‚§¦­ 'ôóóòøØ¥««¹»»±©ª©³¶‰µ ´³²±°¯®­¬«‡ªåõ‘óôî´²¶†µ´»› 'ôóóòøØ¦¨¼÷ôùÞ§¨·òŠó òñðïîíìëêéèãääñ“óôïñ‡óñûР'ôóóòøØ¦§¾õñöߨ§ºõŒóôõöòòóôôõ•óôˆóñûР'õôôóùئ§¿úõû㨧¹õŽô‰óôôóó•ôóˆôòüР'õôôóùØ¥©³âãæË¨§ºõÂôòüР 'öõõôúÙ¦¬ª©¬¨»÷ÂõóþÑ 'öõõôúÙ¦¬«§¦¦©¬§¼÷ÂõóþÑ '÷ööõûÚ§¬®ÆÇɺ«©¾øÂöôÿÑ '÷ööõûÚ¨©¾üúÿâ©©¿øÂöôÿÑ '÷ööõûÚ¨ª¾öóøßª©Àøô–õ¨öôÿÒ '÷ööõûÚ¨©¿ýúÿ㩨Ãþú•ûú¨öôÿÒ '÷ööõûÚ§¬±ØÚÝÅ©¬±ÊÌËÊÉ‚ÈÉÉ‚ÈÉÈÆÏ¨öôÿÒ  'ø÷÷öüÛ§­«€¨©¬¬«€¨§€¨€§¨€§‚¨¤³¨÷õÿÓ  'ø÷÷öüÛ§­«€¨©¬¬«€¨«­­«€¨«­­ª€¨ ¬­­©¨¨©®ª¸¨÷õÿÓ -'ùøø÷ýܨ­±ÖÚÛ«¬µÖÖØ»««ºÙ×Ù·¬«ÄÚØÓ°¬­ÎÙÚˬ«¸¨øöÿÓ -'ùøø÷ýÜ©«¾ÿüÿ㪨ÊÿûÿÝ©©Ûÿûÿ˨­îÿüý¹¨¸ûýÿ𭪸¨øöÿÓ -'ùøø÷ýÜ©«½øõúÞª©ÉûôûÜ©©Ùûôûɨ®éùõö¹¨¸õöøë®ª¸¨øöÿÔ -'ùøø÷ýÜ©«½þüÿ⪩ÊÿûÿÜ©©Ùÿûÿʨ­ìÿüü¹¨¶ùýÿ𭪸øö÷–øöÿÔ -'úùùøþÝ©®±ÉÊ̽¬­µËÉ̹­­¸ÌÉ˵­¬¾ÌÊȰ­®ÅËËùþø÷•ù÷ÿÔ  'úùùøþÝ©¯®€ª¬®®­€ª¬®®­€ª­®®¬€ª€®«ªª«¯«¹ŒùûÛôüö”ù÷ÿמ (ûúúùÿÞª°®€«¬¯¯­€«¬¯¯­€«­¯¯¬€«®¯®«°¬º‹ú÷ÿOAóÿõù‘úùôÿÄŸ-(ûúúùÿÞª¯¶ÝÞáʬ­¼àÝáÄ­­ÂáÝ཭­ÍáÞÛ´®°×ßàÓ®­º‹ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ-(ûúúùÿÞ«­¿ÿþÿã««Íÿýÿà««Ûÿýÿͪ¯íÿþÿ¼ª¸ûÿÿ󯬺€ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡2(ûúúùÿÞ«­½ù÷ýÞ««ËþöýÞ««Øýöþ˪¯éû÷ù»ª·õøúî°¬ºúúùþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  3(ûúúùÿÞ«­½ýüÿà««ÉÿúÿÙ««ÕÿúÿÊ«®çÿüû¹«µõýÿº÷ÿ¨Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(ûúúùÿÞª°°ÃÅŸ®¯±ÁÁ³®®³€Á±¯®·Â¾¯¯®»Âº¯­ºöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž (üûûúÿߪ°¯€«­€¯¬««®¯¯®€«€¯­««¬€¯¬««­°¬º÷ÿ˜B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž6(üûûúÿߪ°®¯°°­¯¯­¯°°­¯¯­¯°¯­¯¯­°°®®¯®®°°­¯¬ºøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž7(ýüüûÿ૯¸íðôÔ­®ÀñïóÊ­­ÇòïñÁ­­Öóðê¶®±äòòÞ¯®¼úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ7(ýüüûÿà«®¿ÿþÿ㬬ÎÿýÿᬬÙÿýÿΫ¯ìÿþÿ¼«¸úÿÿó°­¼üýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž8(ýüüûÿà«®¿üúÿବÍÿùÿବØÿøÿÍ«¯éÿúü¼¬·÷üýñ±­¼üùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž9(ýüüûÿà«®¼ûûÿÞ¬­ÇÿúÿÕ¬¬ÐÿúÿȬ®âÿüø¹­´òýÿ믭¼üùÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ýüüûÿ૱°º¼½´¯°°»¼¼±€°¼¼»°°¯³½½¸¯°¯¶½½µ°®»üúÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýüüûÿ૱°­¬¬¯€°€­°€­°­­®€°¯­­¯±­»üüûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þýýüÿᬲ°¶¸·²±±°´µ´°±±°€³°€±´³²°±°²´³±±®¼ýýùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–g(þýýüÿᬰ¼÷÷ûÛ®®ÆøóøÓ®®Î÷ñöÆ®¯Þ÷óð¹®´ìôöå°®½ýýûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(€ÿ'þÿâ­±¹ãâåϯ°Àäáåȯ°ÅåáäÀ°°Ðåâß¶±³ÛãäÖ±¯¾ƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(€ÿþÿâ­³±€®¯²²°€®°²²°€®°²²¯€®±²²®³¯¾ƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(€ÿþÿâ­³²€®°²²±€®±²²±€®±²²°€®€²¯®®¯³¯¾€ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(€ÿ'þÿâ­²µÎÏѰ±¹ÐÎѽ°±»ÐÏй±°ÂÑÏÌ´²±ÉÐÐDZ¯¾€ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(€ÿ'þÿ⮯Åÿþÿè°­Ïÿýÿà®®ÜÿýÿÏ­²îÿþÿ¾­»üÿÿ󳯾ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(€ÿ'þÿ⮯Æÿüÿè°­Îÿûÿá®®Þÿûÿέ²ïÿüý¾­¼ûýÿò³¯¾ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(€ÿ'þÿ⮯Çÿýÿê°­Ïÿýÿâ®®ßÿýÿÏ­²ñÿþÿ¾­¼ýÿÿ󳯾‚ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(€ÿ'þÿâ­²·ßâå˰±¼áâãð°ÀáÞÞ»±°Ëâߨ´±²Õáàϱ°¾„ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(€ÿþÿã®´²€®°³³±€®°²²°€®±²²¯€® ²³³¯®®¯´°¾„ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(€ÿþÿà§®­®€­€®°²²±€®°²²±€®€­‚®ª¹„ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(€ÿþÿíÌÐ‡Ï ÑÁ°±»ÐÎѼ°±»Ð‡ÏÍÖˆÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(Žÿþÿâ®®ÏÿýÿÕ®®Ùÿþ”ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ƒÿˆþýÿâ®®ÎÿûÿÕ®®×ÿýˆþ‰ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(Žÿþÿâ®®ÏÿýÿÖ®®Õÿþ—ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(Žÿþÿâ­±»ÑÎÒ¼±­Ôÿþ–ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(Žÿþÿâ­³±€®°³­Óÿþ˜ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(Žÿþÿâ­³°€®°³­Ñÿþ›ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(Žÿþÿâ­°Àäáäð­Ïÿþ•ÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (üûúÿß««ÊÿúÿÑ««Ïÿú’û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(Žÿþÿ纾ÁËÊËÁ¾ºÜÿþ‘ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€bŒceXDGE€CEGDRe’cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埑‡“=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%çˆæœåææååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çˆæé›ëè€åããâàÞÜÚ×ÓÏÊľ°à¶¸%è‡çé×Ë™ÍËÝéææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è†çæì¸—œ€œ€€œ€œœ—Ìì忀äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%è†ç æì¼£¡žž ¢¢¡€ž¡¢¢ žžŸ€¢  žžŸ¢¢ŸÔëææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çæì»œ¡¥€¹¨  ¦·¶µ¤¡ ©·¶³¢¡ «µ´¯¡¡Ÿ×ê€æ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è†ç<æì»»ðéðËÉïèï»Íïé벞¡Üìé窟¡ÚêæçææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çæ=åë»»êãêÌÍêãê»Ìêãè´¢Üç俬ž¡ÛèåæååäããáàÝÚØÓÏÈ¿´¦ÝçÚÍÕ£²%éèéì>ëñÁžž¾ñêñОžÏñêñ¾žžÐñê£áîìì­Ÿ¢àïëììëëêééçåâßÛÖÐǽªÕñâÚÍÕ ± %éèèçë×¹½€¼>¾¬¡ °ÑÍѸ  ¶ÑÍа  »ÑÍÍ©¡¡ÃÐÎË¥¡¡¹ÇÂÁ¿¼»»ºº¹·µ³°¬§Ÿ™…ÁúéäÚÍÔŸ° %éèèçí̘ž€ž ¢¢ €žŸ¢¢ €ž ¢¢Ÿ€ž¡¢¢Ÿ€ž¡¢¢Ÿ€ž‚œ›™˜–”’އo±ÿðëãÚÍÕž ¯ %êééèîÏŸ¥£€Ÿ ££¢€Ÿ¡££¢€Ÿ¢££¡€Ÿ€£ €Ÿ€£ ŸŸ €¤ŸžŸ¡Ÿ–“‹‰w©ÿöòëãÙÌÕ ®O%êééèîÏž£§½½¿³¢¢ª¾¼¿®¢¢¬¾½¾©¢¡°¿½»¥£¢´¾½¹¤£¢·¾¾µ¢£¤¸½½¬žŸž¯°¬˜‡xŸÿú÷òëâÙÌÖ ­P%êééèîÏŸ ¸ñíòÙ¡Ÿ¾óìóÏŸŸÌóì󾟟Ñóíï² £àñîì­ ¦åïðᣡ­ìíòΜž¨áÝÜ·„y—ÿýû÷òëâÙÍÕ ¬Q%êééèîÏŸ ·êæêÖ¢Ÿ½ìåìΟŸËìå콟ŸÎìæé² ¤Ýéæè® ¦àèéݤ ®èåêÌž¨Ý×Ö¶…z”þÿýû÷òëâÙÍÖ «R%êééèîÏŸ ¸ñìòÚ¡ž¿óìóПŸÍóì󾟟Ñóíï³ £áñîí® §æïð⣠®ííòМž«äÞݹ…}‹ûÿþýû÷òëâÚÍÖ ªS%ëêêéïÏž£¨ÌÏѺ¡¢¬ÎÎб¡¡¯ÌÊÊ«¢¡´ËÉÆ¦£¡ºËʤ£¢¿ÈÈ»¢£¤¾À¿±  ¡µ²°ž‰~‡ùÿþþýû÷òëãÚÍ× © %ëêêéïП¥£€Ÿ ££¢€Ÿ¡££¡€Ÿ¢££¡€Ÿ¢££ €Ÿ€£ ŸŸ €¤€Ÿ ¡£¡Ÿ™–’Œ‰ù€ÿ þýû÷òëãÚÎØ ¨ %ëêêéïΛ Ÿ¢££¢€Ÿ¡££¡€Ÿ¢££ €Ÿ¢££ €Ÿ€£ €Ÿ€ž€Ÿ žžœ›š—“ˆ}‡ùÿ€þ ýüú÷òêãÛÎØž §/%ìëëêïÔ­¹»¾¾¿­£¢¯ÐÐÒµ¢¢±ÑÐЮ£¢¸ÒÐ˧¤¢½ÒÑÆ¥¤£·¿†¾ »¹¸µ²­§¢•û„ÿ ü÷ðèáÙÎÙž ¦%ì‚ë'ìîïðïõΠ ÀõîõÒ  ÏõîõÀ  Óõïñ´¡¤äóðﯡ¤ãóïƒð ïïìéåâÞØÑËÀ½íñíììïñöûþÿýöêÜÌמ ¥%ìƒë€ê#éïË  ¾îçîР Íîçî¾  Ïîè곡¥ßëè鯡¥àìéƒê!ééèçåâÝØÑÊÀµªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì†ë#êðË  ¿õîõР Íõîõ¿  Òõïñ³¡¤âóð¤àíêƒë"êêéèåãßÚÓ˹­žŽ‚|zxuspkihly’³Ìç¨ £%ì†ëêðËŸ¤«À¿À®££¬À¿¿ª£¢±Á¿½¦¤£´ÀÀº€¤àíêƒëêêéèæãßÚÕÎÅ»°¢’…~}~v€[ YUPOXu¿ ¢&í†ìëñÍ¡§¥€¡¤¦¦¥€¡¤¥¥£€¡€¥£¡¡¢€¦áîëƒìëëêéçåáÜÖÐÉ¿µ¨˜‚†|YX YYUKDˆ‚¡&í†ìëñÄ›¡ €¡ €¡ £¥¥£¡¡¢¤¥¥¢€¡€ àïëƒìëëêêçåâÝØÒËú¯£™“’€‘‡€b€`€^ZEjS¡&î†íìïÝÈÓ†ÒÑÔ³£¢¿ÕÒÒ¬¤£ÀÕÑ€ÒÑéî…í$ìëêèçäßÚÕÎÈÀ¸¯¨¢ Ÿžž”kkj†‘‰jeartƒ8 &îˆíðˆòñ÷¡¡Õ÷ðô·¢£Þöñòî†íìëêèæäáÛ×ÒÌÅ¿¹³¯­«ªªŸ€t Ÿ¨¥¤xmi‡—Œ…Ÿ&îˆí‰ìëñÀ¡¡Òñêî¶¢£×ðëìíî'ïïîîíìêèæáÝØÓÍÈÿ¼¹¸·¸¬}||©´²±vs“¦š¢FŸ&î”íìòÀ¡¡Ðòìî´£¢×ñì„í,îçéèçæåäâáàÞÜÚ×ÓÏËÆÂ¿¼¹·¶µ¶«ƒ„„´¹²²ˆz´«°hŸ&ï”îíóÁ¡¦«²±±¦§¢×òí‚îíòÚ§­««ª©¨¦¥¥£¢¡Ÿš˜•“‘ŒŒ€‹ЋГ‰Š‰ˆ†‰‰Œo &ï”îíóÁ¡§¥€£¦§¢Öòí‚îíóÖ¡‡¥£¢¡Ÿ›˜—•”’‘‘‘ ‘‹ˆ†Šv &ï”îíóÁ¡§¥§§¦¥§¢Õóí‚îíòØ£¨¦¦§§¥¦¥¤¥¥£¡¡ œ›™€—”••–•––•––•””“‘‘”z &ð”ïîô£¤Êèã㲦£Ôôî‚ï,îô×£¦®âäçÑ¥£·äáåÄ  ·ÞØÚ®™˜¹ÖÒÓ¦˜šÇÕÑײ–•·ÒÌÔ¡&ð‚ïîíó££Ööïô»¤£Óóí‚î.íóÔ£¥²ñðô娢ÂõíôÓ ŸÅïçíº››Ëêâ籚ŸÙæáèÁ˜˜ÇäÛ螟&ðïñô€ò‹ñðöã£Ôóìò¼¤£Ööð‚ñ.ðöØ£¥²ïíð㨢ÃóëòÒ¡¡Çîæí¾žÍëäéµ¢ÜèãêÛ›ÊçÝ죟&ð€ïñåÕÞàãŠäåå麤£Ðóîï¶¥¤Êèã‚ä,ãèˤ¦°íïòÛ¦£½òíóΡ¢Ãðéî¼ ŸËíèè° ¢Ùìè쿟žÇëä육 &ñððïõÓŸ§§‹¨ ©ª©§¨§«³³±§¨¨§†¨§€¨'±³´¬§¨¨²³²ª¦¦§±±°§¥¤¨°°®¤¥¤©°¯¯¥¤¤¦¯­±‹  &ñððïõÕ¤©¨€¥§€¨€¥¨€¥€¨§££¤€¨§¥¥¦€¨¦¥¥§€¨¦¥¥§€¨€¦§¨¨§€¥€§¦€¥€¦£¢£¢€¥¤ Ÿ§Ž 9&òññðöÖ£©¨²³´¬§¨©²³³ª¨¨©³³²©¨§«´´±§¨§­´³¯§¨§¯´´¯§¨¨§¨¨§§‚¦€¥¤¥¤¤ƒ£¤¨¨§®­§§¦§¦©²±¶Ž E&òññðöÖ¤¦¸òðõÙ¦¤¿ôïõΤ¤ËõïôÀ¥¤Òõðñ¸¥§àôñí°¤°ìñó䨨§ÙèäãâáàßÞÝÜÜÛÚÙØ×‚Õ×Ψ¨§áìä㯧¤Ðôí÷¤¡1&òññðöÖ¤¥¾ôïôà§£Äöïöפ¤×öïöĤ¤×öïõÀ£©çóðò´£²ðñ󿀍é÷óô„õ„öõùꀨ æõó󳦤Öõìû¬Ÿ1&òññðöÖ¤¥¾öñ÷á§£Åøñø×¤¤ØøñøÅ¤¤Øøñ÷À£©èõòó´£´óóõ耨åóïðïó倨 èõòô´¦£×øïþ­Ÿ6&óòòñ÷×¥§¶èæëÓ§¦½êåëʦ¦Èëå꽦¦Îëæè·¦©Úéç屦®âçéÚ¨©©âô‘òôꬨ¨Úéèᮩ¥Ìëäî¡¡ &óòòñ÷פª¨€ª¨©©¨€ª©ªª©€ª©ªª©ªª©©ª©¨©©¨¨©¨¨©©¨€©ãô‘òóﲨª©ªª©©ªª©ª©¯ 'ôóóòøØ¥«ª§¦¦¨€ª¨‹§¨©ˆªãô‘óô§¨‚§¦­ 'ôóóòøØ¥««¹»»±©ª©³¶‰µ ´³²±°¯®­¬«‡ªåõ‘óôî´²¶†µ´»› 'ôóóòøØ¦¨¼÷ôùÞ§¨·òŠó òñðïîíìëêéèãääñ“óôïñ‡óñûР'ôóóòøØ¦§¾õñöߨ§ºõŒóôõöòòóôôõ•óôˆóñûР'õôôóùئ§¿úõû㨧¹õŽô‰óôôóó•ôóˆôòüР'õôôóùØ¥©³âãæË¨§ºõÂôòüР 'öõõôúÙ¦¬ª©¬¨»÷ÂõóþÑ 'öõõôúÙ¦¬«§¦¦©¬§¼÷ÂõóþÑ '÷ööõûÚ§¬®ÆÇɺ«©¾øÂöôÿÑ '÷ööõûÚ¨©¾üúÿâ©©¿øÂöôÿÑ '÷ööõûÚ¨ª¾öóøßª©Àøô–õ¨öôÿÒ '÷ööõûÚ¨©¿ýúÿ㩨Ãþú•ûú¨öôÿÒ '÷ööõûÚ§¬±ØÚÝÅ©¬±ÊÌËÊÉ‚ÈÉÉ‚ÈÉÈÆÏ¨öôÿÒ  'ø÷÷öüÛ§­«€¨©¬¬«€¨§€¨€§¨€§‚¨¤³¨÷õÿÓ  'ø÷÷öüÛ§­«€¨©¬¬«€¨«­­«€¨«­­ª€¨ ¬­­©¨¨©®ª¸¨÷õÿÓ -'ùøø÷ýܨ­±ÖÚÛ«¬µÖÖØ»««ºÙ×Ù·¬«ÄÚØÓ°¬­ÎÙÚˬ«¸¨øöÿÓ -'ùøø÷ýÜ©«¾ÿüÿ㪨ÊÿûÿÝ©©Ûÿûÿ˨­îÿüý¹¨¸ûýÿ𭪸¨øöÿÓ -'ùøø÷ýÜ©«½øõúÞª©ÉûôûÜ©©Ùûôûɨ®éùõö¹¨¸õöøë®ª¸¨øöÿÔ -'ùøø÷ýÜ©«½þüÿ⪩ÊÿûÿÜ©©Ùÿûÿʨ­ìÿüü¹¨¶ùýÿ𭪸øö÷–øöÿÔ -'úùùøþÝ©®±ÉÊ̽¬­µËÉ̹­­¸ÌÉ˵­¬¾ÌÊȰ­®ÅËËùþø÷•ù÷ÿÔ  'úùùøþÝ©¯®€ª¬®®­€ª¬®®­€ª­®®¬€ª€®«ªª«¯«¹ŒùûÛôüö”ù÷ÿמ (ûúúùÿÞª°®€«¬¯¯­€«¬¯¯­€«­¯¯¬€«®¯®«°¬º‹ú÷ÿOAóÿõù‘úùôÿÄŸ-(ûúúùÿÞª¯¶ÝÞáʬ­¼àÝáÄ­­ÂáÝ཭­ÍáÞÛ´®°×ßàÓ®­º‹ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ-(ûúúùÿÞ«­¿ÿþÿã««Íÿýÿà««Ûÿýÿͪ¯íÿþÿ¼ª¸ûÿÿ󯬺€ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡2(ûúúùÿÞ«­½ù÷ýÞ««ËþöýÞ««Øýöþ˪¯éû÷ù»ª·õøúî°¬ºúúùþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  3(ûúúùÿÞ«­½ýüÿà««ÉÿúÿÙ««ÕÿúÿÊ«®çÿüû¹«µõýÿº÷ÿ¨Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(ûúúùÿÞª°°ÃÅŸ®¯±ÁÁ³®®³€Á±¯®·Â¾¯¯®»Âº¯­ºöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž (üûûúÿߪ°¯€«­€¯¬««®¯¯®€«€¯­««¬€¯¬««­°¬º÷ÿ˜B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž6(üûûúÿߪ°®¯°°­¯¯­¯°°­¯¯­¯°¯­¯¯­°°®®¯®®°°­¯¬ºøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž7(ýüüûÿ૯¸íðôÔ­®ÀñïóÊ­­ÇòïñÁ­­Öóðê¶®±äòòÞ¯®¼úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ7(ýüüûÿà«®¿ÿþÿ㬬ÎÿýÿᬬÙÿýÿΫ¯ìÿþÿ¼«¸úÿÿó°­¼üýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž8(ýüüûÿà«®¿üúÿବÍÿùÿବØÿøÿÍ«¯éÿúü¼¬·÷üýñ±­¼üùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž9(ýüüûÿà«®¼ûûÿÞ¬­ÇÿúÿÕ¬¬ÐÿúÿȬ®âÿüø¹­´òýÿ믭¼üùÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ýüüûÿ૱°º¼½´¯°°»¼¼±€°¼¼»°°¯³½½¸¯°¯¶½½µ°®»üúÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýüüûÿ૱°­¬¬¯€°€­°€­°­­®€°¯­­¯±­»üüûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þýýüÿᬲ°¶¸·²±±°´µ´°±±°€³°€±´³²°±°²´³±±®¼ýýùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–g(þýýüÿᬰ¼÷÷ûÛ®®ÆøóøÓ®®Î÷ñöÆ®¯Þ÷óð¹®´ìôöå°®½ýýûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(€ÿ'þÿâ­±¹ãâåϯ°Àäáåȯ°ÅåáäÀ°°Ðåâß¶±³ÛãäÖ±¯¾ƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(€ÿþÿâ­³±€®¯²²°€®°²²°€®°²²¯€®±²²®³¯¾ƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(€ÿþÿâ­³²€®°²²±€®±²²±€®±²²°€®€²¯®®¯³¯¾€ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(€ÿ'þÿâ­²µÎÏѰ±¹ÐÎѽ°±»ÐÏй±°ÂÑÏÌ´²±ÉÐÐDZ¯¾€ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(€ÿ'þÿ⮯Åÿþÿè°­Ïÿýÿà®®ÜÿýÿÏ­²îÿþÿ¾­»üÿÿ󳯾ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(€ÿ'þÿ⮯Æÿüÿè°­Îÿûÿá®®Þÿûÿέ²ïÿüý¾­¼ûýÿò³¯¾ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(€ÿ'þÿ⮯Çÿýÿê°­Ïÿýÿâ®®ßÿýÿÏ­²ñÿþÿ¾­¼ýÿÿ󳯾‚ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(€ÿ'þÿâ­²·ßâå˰±¼áâãð°ÀáÞÞ»±°Ëâߨ´±²Õáàϱ°¾„ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(€ÿþÿã®´²€®°³³±€®°²²°€®±²²¯€® ²³³¯®®¯´°¾„ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(€ÿþÿà§®­®€­€®°²²±€®°²²±€®€­‚®ª¹„ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(€ÿþÿíÌÐ‡Ï ÑÁ°±»ÐÎѼ°±»Ð‡ÏÍÖˆÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(Žÿþÿâ®®ÏÿýÿÕ®®Ùÿþ”ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ƒÿˆþýÿâ®®ÎÿûÿÕ®®×ÿýˆþ‰ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(Žÿþÿâ®®ÏÿýÿÖ®®Õÿþ—ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(Žÿþÿâ­±»ÑÎÒ¼±­Ôÿþ–ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(Žÿþÿâ­³±€®°³­Óÿþ˜ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(Žÿþÿâ­³°€®°³­Ñÿþ›ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(Žÿþÿâ­°Àäáäð­Ïÿþ•ÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (üûúÿß««ÊÿúÿÑ««Ïÿú’û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(Žÿþÿ纾ÁËÊËÁ¾ºÜÿþ‘ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€bŒceXDGE€CEGDRe’cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埑‡“=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽt8mk@+¯®®¯¯¯¯¯¯¯¯°¯¯¯¯¯°°¯¯¯¯°°¯¯¯¯°°°¯¯¯¯°°¯¯¯°°°¯¯¯¯¯¯¯¯­¬‘U  Gÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿä†  NÿûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûûýþÿÕ1Vÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúÿä<  \ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè?  `ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè@  bÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿæ>   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿå=   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿã;   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿâ:   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà9   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÞ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ3   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÖ+   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÇ    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ©   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿv   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿí8   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ•   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÕ    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè0   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê6  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê:  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê=  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê>  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêA!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç9"   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷c   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ–   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýW   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé31CE2  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿìšÔøÿÿþè¬B  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿþÿ¬  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýþÿÿÿþûüÿÝ'  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÜ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ°  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿS  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ0  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿo  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ»  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿº  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿj  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû,  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¼  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿK  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ¥  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿÒ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüþþÿþýûüÿÑ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ›   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿëÈïýÿøÜœ3  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé4%46#  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC"  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè>"  cÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿóG  aÿüýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýÿÿÿÿÿÿÿÿÿÿÿÿýÿÉ   _ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿp E¥¬²µ·¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¶ðÿþÿÿÿÿÿÿÿÿÿÿþÿöº·¸·¼øÿÿÿÿÿÿÿÿÿÿÿÿüÿº $,:DKNPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRN^òÿþÿÿÿÿÿÿÿÿÿÿýÿÍJRQRMÖÿýÿÿÿÿÿÿÿÿÿÿýÿß (28=@AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD:fÿÿÿÿÿÿÿÿÿÿÿÿÿüÿš4EBE5¥ÿûþþþþþþþþþþýÿã  $()**********************************************,#Kûýûüüüüüüüüüüûÿ^,*-jÿýÿÿÿÿÿÿÿÿÿÿüÿ¿ Ëÿýÿÿÿÿÿÿÿÿÿþÿì(+ÙïêëëëëëëëëéìÛ< (c]^^^^^^^^^]bM  ic08Zý jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ Zÿ“ÏÁƒ2G÷Ë­ãbß²¾x¤0¾È±²èÅÂ/¹\c··U –*žt+¯ ¯ö¢…„¡$({w¥ Ö¢Ÿ ý«=ùq¼ÿ9f΀€ÏÁ } ºEì&ßÞË´gÎO$~¼XôÖ}Ó{ÀÜžÒ þJZcOLú{’‡šÐüy÷A/0ˆêÍìZøv$à¸K&Ýd ¡ÇàÔ~g€€Ë» ƒ’p•@<‡­pH?Kã )W6bÑù0ëÀØ.Yì¼ðÙR%m;H÷÷P‡B“ØUz–äð†O<š3F:¬`AÓuv=mC¬•ß#ôx'ûé`g4Lê@“Î]ÞaqÆŠ^…í0n'Ý> §Æ,Xa§ÇðvµEþ8ƒñþ†È³S8æT¼J ¾ꎚ.ÚûB¡à&–¢\±†OŒµãÊF»lrHû᱊ ƒ€€ÇàS<~d@€ËÉ@í;&å5ÅðÜÝÕ ©Æ©È­¢¸‰á)Fá| –¦W(– )Ô…R;<ä»Í÷þ(R:θ3I"tÿq‘‡ö·Ïþp¹3 7 †;<‚GBn2,XýÌL–gs6[6wœ›òÐBÎîsîû|ÿDRZŠÏÎÕÂÎÎÌ©7[K”é4 P,J}è2³2 H“ÖÉÕÍ(p7ˆó˦y =…wfVñïqRÖ3.( žcŒg"áâ<êÅQÆ7@ñæì!S»ˆÿQ§ßú¾¶ÿµ°ÞÙÕŒéàüplrm×h2øWøÖfƒQs{>h’ éUÑñþjºÕ¸¹‚¢ðõœÑ±àË!Å®(´ÜMÆ…ömX0÷]oàÉÊNumi ï¨|'y]x"c0£Ò3¤%/xúó3ÃÊÊÚy+¯tsfŒ2YtJ©Œ]Êf"c³nY‡œ´ç,Äd5,%%òÃ?ÚPü씕J²¶ -SÒ6ZÉd³R6‡;¤_­ÿUôÌ!ñ¶ÁÜÀ¶Ö¹²±‚Dº(ËìÄ€¢\-õolx¡ø/à;ÿk¼ç¾ “´díöÆãóëå QDD*¬žÈwY=±RàJÓ(|`µ> “¶$ŸâªfÔ}èEN¼0$,œU éß â1°mpÓ«¹ð¥[rñI|Ž(ÙwXI­1ÅÚ˜Ó)—KïjÈš QcI8…°Wv“®_Ô­ïÄ›2©KŸ¿Hì¥dƒyиS›]š¢t NÀñc̆ÐpG®«àš*ènîm ‹j1ãÛ)E"×Å÷åhT²%ÒW 3¶ê@}Õhx!ª{¡#†Ôe‘Y:‚nÝlD™û,°ˆ½Ö‘iH¸×?“†f•Pgn³m»|Æ èög“ʸv6+‰õ÷«W#§ë¯¹‹äc<Ô TòvSêSi£­©Eâsª˜2W€=R€€ÏÍ~?~ `­>Vîr² *;”- ‡Àj<µ'Ñ+HÿRÁªÕ| +`@O™oÔ@ÿ„ tÝ/MBVŠ©ç°Ë–¥ ìkÙƒjeÒš3ž³Ži# ! œŽÔ§é–Ååó†""c³nq!'ó J®Sý÷É!y¹„Šw%I ´9uû“õÊ?5v½8I1!dsäðTÛÏ„œÞy8€|4Ѱµò†rÇ4p•\E÷ÿFBÑA”j¾å¤&þ?­jMÎÝž;ªðy5¹fß“žšBºäv›µ>²eH.Â|AÊqp±ÑKöæ“J”ú tàâ±¼5R :¹Ø…Únî#ŒÏϧ¹ùõŸIฮw¿Ò’ –3éâÜ׋xÉ#‚kBùµ_Ùv.C’Z§Âdx!š^Ž)Aíüc‘éÇýÍºŠ ªÿqòMVœ}’åp¸¦T3*«ò8miC@ƒf|€ù¤µ„ÝÑ•I)€LBþ”«Ëô†ólÏ$YÅà1›¾éuÌÄßdC]‡lg+ïõ}?4@¹¿i„‹T ËM¹‚Sf’IMó%ú4Œ× gEãA™'¶ìu¡Vz“ÖKCZb늈/Q 93…€ç?õ¼–¡ð&ÒÏ ÇUE¬Ä'°˜§Ôð΅npJ|ƒNä `|¨¹¥®®MôÉw7>(zXöuÓ¢E–>÷Á”ØEí±½xÐÃ&zuûƒ¢Èý\ËËêtx‹F„QsünˆêNZ(I]á½¼ T£ø¿Z5ÊægÿAuÿo«"EäóK)ZFÿbÓò®2h.öp Zÿ j¬$ äx –‰©eâÆúKyëÉh4pãàð[˜$üÒ,K†_³JüGKcq<M²ï——äè$iÙ÷‹&ËÅ,úÛZbî*"I½<«˜Ÿï aí¯ÀǦ&Îå] aF\æns·•1‘wZykEsÖE²›±íá’_l]ë£3Ö¿– +êX€2À2$±d¨¶‹,0BjZm#À?R‘‡—R¸î0PçXäÎTÄrO…$œ‚—çJ}…²¿}+;ã'wÀ|¡¿ÃF¨¬IG”þGßbS¥:Ð7ÞØ®™p%êµIT;ð'ÛçÚB\ÖÅ™ Z3¼i|"¦î™ÂïTéì0y{Û·ˆúQ—³•ºÄ÷7«˜á$ RÖ;9óøí…C¶\w¨‡:³T»Jçugÿ EØyÒF!:…¡†oæ}ËH—/®ì4AR³¾Sø;Tbˆª•>pÈ$½B±ì%Zî­XP÷Ér¤}2fƒ+ù[–2D8pÐá[ôHë™é`/(ˆ v[ï\›Â z–ÁÛK Ô‚ÄØ מ8îm!6uUaîÿE 3† ïÀ/$ áûŸÛðøŽà¨nn_hQRŽ¦Ã´ýÞtJ.ÉÕ<`K÷ˆ|ÓGv‘’ Ûúâï]Ó±i$¤Ä<ÂpÌ+o@¾žq•ß9ý_šU2?¯µzó²òh¾‡ ˜©¯Æß˜6(„t^ˆ=~‰Ç¶]àÑŸÚeA@ŒŽ6c`“¥+dµbsJлÿ<äUú»ÊXš·iĨéW¸bbYšVe*šQÔVûþWT2¬…h³G8ݶ›HvÑUß&#¢åI†¹êTlç©Ú˜ùiVbýä¶ž8Ü C'Ýü»¸øÑ—À=Ç4mXŒ¼,9éU…¿”A¶Q ‚ Ê:*f|(Ñ[ÆÿQìáï Gškc°‹6íFJòê¢JýQ)UOó©ZÑœÍJTÑ$ñ-Jé j¡¡ñ¾Ñƒ ºÿi—Õ‡N—Š.Aœ05:WþÔhN&4ˆE/k¬>/Qü‘Qœ IÞJçÊå›Ê@¡leu>P·¾ „qÃEzãß Ÿ|sdÅÒHúB|7‘6RÑM°­nÜŠŒàf¡ K®!¶tølŸ•èçHÿ…ѸÄ÷µk‡U ^KÅ'峅κTu2†Ðýß"àËÞa ®/¯ùÅ0lÚÚ#€À»cq¾# -aô½À¯‡žé!Ä8G.¤Ýü…‰Jƒ×–`›@x¸šõ´õþ§ ÷¦öªç¹¬Ëf0—‡BQóÎüa; Ø ‰ Üò‚4YŒóÏûé“!¬ñVQª)%Á¿ïç î.?¢{dyp㸹I²Ý%F CâL½:DA¬äòQ$:MÏB÷ÿ>KW°YXsæÐëÊ}–`ò£<øñq##¨Ðý‹óœb›‹ü2i¶Ð’N^vRü ¿›Éûˆ=È\[[êÌ(’Òž3îv/Ï(~Ï=…Í>•Ê üá0ßè<Õļ莯ëÍX\÷†Š™pM.Î]ÎÚÜT%H?¢´]çìMö¨½SÞ$òV9ܼeÂ(öcX,·PzȬ›Zh‰M×(ÿUƒÿ”ó^Ÿ~å=C[²>…‰}죟 x|mÙïý!J´\—à0¼(,çšE®™ ]ïmÔ ±u¤61„ÆyÒ›„°–yVØEzÚðxXX°™mŽï§.TGèŒÿ pnˆæ®·­Høïœ@r7¼fƒºv©pqÿ–ázÑN”ÿ(‘«Âr$Ú­ßîì ŒÍݲÉTžCûê­¾V[ëïïJ/ˆ”`ø¨šÔ"ý©GOP©Ôªèƒ /¬5IƒFx?Ëešên‹H0ÌšÓÜë ²“áöË™5ÌwM6ÜNÿ†à$ÑÉ7½¨ø¸º[ÆëlÇ”øïÈÿ6€€Çá^Oδ‡áE€%hƒº¯­? aR ¨~-7k ZŽ[éHz¿N’xl“éNÁáËÌ?lN"çâé²6‡›1¬tÖB³Z¨%oyPÖÇpÉTpô<ö=$q©5c‘턱+¢dµWþÕ",“Y\ðD4Î×ÑÄTó!»€ ¾*,#0Å’ ?–8‹_¿ù(þ4‡`,ĺWÓXaÏ`äN³7 î@5[¥ðïGüŸV—‹·ö°£$7ÿ7ÆÊ¹ºw-âÇÞr¦©‰©H6D¸ìAºKáÜ󾀦¢ q4³©ˆ€oºå›OM#"œÁáƈý :R 0ÍpõÖóÁБЀ©O#¡ l¡·¾ù' {N~-?Kêþ{®òÿz€ù±"ØjÀŸN"ÁÞW’Hû £#æ2ö1®Ûë§Ui Ësþ?/á0/dOˆÿu¨‹Qú'í@Ši"MÕ]‡ýÜ—å• Ü É$ý¶Èi w`´oægM‚‰^7Âß绩RÏ’ÝÞŒeõGr|’Ã-|§À¿ìƘú,ä¤YÕ ªÊÖT"ªðôX£8æcbÓ.[>²¦ÒìG,1“zd,ÉÊQŽš§C}ñkí@‘ à a¹Öó¢/„ROÅÕo¨ªëÒÙ(>ì,[’ ’®Üð;z+ÏÏÛ†~~Ùsóõêô¶ñkˆ¦€Â_yG»%nÑ‘Gÿ_lßc©‡@)+P'èÿ|(9¢oÓK­;„ŸÈ°ÖdÇß«‘¨hœ2©üp £‡ø@žðÐÓ~f†aß•UmrB86Ôe/kr6MÔ S8´WF6І „÷ü Á9æ©‚·Úê iƒ×?;†ë9¹ÿ|U#5[Z½ýokªXq"ÓH-Xùêo_§ç^Îp¨˜ÏGMDoÙ¿¬{Ÿí¼bA/a!/o‰_=¤~„µy©9”/Ÿ†…½ÅÏß±˜& {#|ý0á1;|z 6‰8¸Vˆ6ýš•Áû\’Æ­$óºù8+_»…@ºÌÄy¦…] £Ÿw¤qáó/YùòÎ[ i{E·A{mƵ®/ÆK9’üøY²Ä©Ù¹¬ñéõ LÒ„¯»Â˜‚RcÓr#ÃwW@â0NöiÅz`“PŠ‚d\úù¤!•Tþ òÜ5ØÎo«¿õ8|Ò?ŠƒŽkûžyÊjX¡$„€´Üý¹ç3c‘ÉsUA¢¬EvãÃÍ4FAþäMÔAN½b×´lSÂÞêѹN*[è:ho÷5ŒÕ}DaÓ Ú&!/ëÍwYÀzOe©B9Ö!2ˆæxòܪ^ÚŒ?òÊN­˜GQÁd -ñ¬üõú´KÅêNLBQfãulO§b›\1?­W‹ <¸H2”ºwy½q†¬˜X—×kË(;¥Æ¿êÜ}sÄ„dá-<ý²ú¢%)ýöwc!ÛÃh¤3ýØo,ùò(Ä|Õ’‹:íºa(ôÜk¸LbZ@HXð×ÉOês¬ŠÎÓP_ mÈs[´‹ÒTà>¯vï%O»7•ùâ%¿bl O9F¸vLnI™y”8#æÉÒ†ÒûwÿT‘ ;Ýg¶Tî 醔C|VPlo.¡±ždæÐI©ðTe¾JAµ"ok;³¶á N {¥k \†dÍÒ®? F%íŽ@9çˆ]ì7äfî Ê$‹×ê–U’‚ž™Ûôã9)ÖX déÜg;Û¹D6Áä5;6ݧò6ᩤ``÷ç@èË‘#Ò®8ëŸÂs"3›Óýb’‘=\NOà ìü>$]CijY¤†~:¯ÂájǼÒzÑÈàpB»/˜¬ º ½š»Mb³Åö•ÿ8üãmÚ÷‹fÌ5·fèîZ5¥‹#€"`²D%Ç \Ÿ‹ç@±¬~¨8{¯5zîDÆ´Îi¦û}ã9—¡F\]£%œri7¯°î ‡n;œHê“/Ö°ˆ½<ÊÃyŒ®D^Ë pú$ºt4Õ³ÜteÀyQý§Î±«—}ktMK‚½hê‡ðmhÌÈühÂZßOÞ–å¢qHVÚTÒ›VEˆ0¬„'MK<ù”Hw€zr"$Ù¶é¦Ï¢šÆÅTö¹~3ÆÿJøî·áÖ ²83X6¾&öhœ×˜¨X릕#\›Ó ßzìõ¸ ˆµ ã“aCCÜ>= XÕ µDuqêð4-ÚoêOî9ót./ÅgùC™(·ŠîÁfŽ# oÆPapÙJ|:ú1±Ù =„x”s=í²- kÚȾò—?7I¬#Û„ÍÔeÛ9Ûa Úퟡ™ŒE«Ê'ÒçÚ%>eG^€(Ü»02cmËLî^³PÉ !œ÷Ü–½&z$MuÊ&#DûºÆÂH[©AÛÃÝú_RVr¢´e k#×lÆ”¶ŠGާ ÊÙ¸q<§Á­ð GÄ+3ì Ñæ»}Y©!ï˜DK—94-ÁïàÐh ‚^%gu¿ùó£õf- I¹‚Ø! ùoÐÅ«©øBÞ… Aâ¬yh]TÈ(b(^uÒ7lÆÚ½J¤¢j±#D±ˆfhs«oƒ£’ „8“zz+íUQ–"*™¹½8;Û-µVsÁ<õòXe«©‰V/~ `;"Dí3d9wU¨LY‰ ~ ïÑ{Þn X)b‘”µáÔB„ñ¡Šë°/Œã:/Äq·ÝrôÌ" áC Î{ÇÍWgILèC‚ ͆6_ÿ;¦ÉÞBè(µñÆM¦äBÂ~…Ãõkk“ÐŒQÁÔó¹¨Ý76Fì¨TÍM\—]äŸóbP:¶èãB@»:0!Æ×çt?  ¦#Êé/÷¬q‚®…1¾þ«‘–ê€÷d£ÂªVçRY‡hÅéÄÒö#Žüâ !Ï%d^’F4ÆúÙ=ðõÐ,ëµéÆ‘jÿW ò‹.Ç®ݳ1j$ž1R”ƒˆÍ›®©$'æäóFJ2l2à«üRuÚk1‹…Á‹ìS”NN”13ú5µ™H䨇!ÉFî@Co ™gmöZ†¥V¤Š?/Wrœ'h{Úˆ€¦ÓLæ.œ«(þÛ'Æ$kVŽ+3çú–ŽNPv¶Q¤)oÏ®²ÈEQœÁ2º‹Ækn^:ÌnŽÅ•1›#;nfzX{_†š‚ËÀdh¢qìü3ò?ðùج0Áó`°¿BV@SªÂ0Zq‰ó…|=$4?A§ÿx§ 6xc¹»?8Ž„Y ÄßÞXÂ2av ç)” ¯îœ—ˆ²AÚ-¥)>i|'UL=\J7¨;ÕЍR±¥Áyª­ÖqDu:¸„ ]©û‹ÏŸ8R•3C¼ÀÓ+H„Ǧ_·eÕÖ"jðl˜v-£l†g˜ ]k6eý“}Ý¿"Ç·#ä¬ÿ@Ð(ð|G9 ½’s‚m¿Ý*&äÉöïr ™0ƒ©É®^YeϼqØÃ!£*áWæ¼¹îU´€ þ2S#ª©Â˜Bðݦe¬·²UËÃ8z²Uߨs`D .‹Ç<—PÄŸ´Äã'(Å0àBs4ÐgY§î&Ô#&Ž#&ªñªhþÑ©,pÉýË)ª"N`8y‹™QW·U›-y¢®ñßó;‹qîÊLc¥Rô/NV*6…v¨ -·©«¹'½­ÁÞaiä[YéôSÒæwd•¤éVáôÇꢺŒ iP¾9‘ÈŸ»ÞÂ^cûË.z‘väÂ2Èg—@›4¤°È‰®>ê¬Ó[9+ØÑ8˜A\Vû)á}Aû¹ñ„xY 0q™Ê0Ð]»#R|Ò’Á"dú­UÕÐ_@ðM…X2¾ò¬YÞceNìÎÃТ  ªíçÌZu¿ä¨ÏãÌ;œ¼p/’ŽÐ¶§«vcžÔŦCéþ­ƒ±ZtjÌ[Œç«g̮խM±£æŒ©…sÓ—t 'ÂþLé<ö‘š!ÙzbŠ0ÉÛŠhÐè5û}ÒèEcð-jðGwYŒÔ®9K»ï ÔÔn«M‘ë3mÃBl‡6t½¿œÕâ­`úZ¼šfè%]å>ˆ’#y‘ôËgðøýYÓÀ†Øy¯xß3(ÆßºãrRéìÕ»ÞoòßíR%»¨j•:IºÛôÏnhº€æå^@9qRoçŒK%[µ*‹¥TÍŒJØ Ð7ò”»çÁš~OË( ¡ÁR¡ß Üù[ˆ~òà`ÉÂðÓs6ÀÚ"GЩ¸®tñA¼šM·LB­B˜Þ¼ VQ”è’Åá8 aVº{`bý'ˆÞ]XŠØÀÇåË¿ÕÓñ hÓcEˆ3§µzWÜd•›)p&?U”Í©s‘lTj¯Sn‘SÆÕ¹ÜO7´Eø÷–ñš‚î.ÖùÂÑ ÈÀîn™SŽs¦_Ï{N{© 3eIˆf¥¾Ë­ådBZÁÈxÛG…v3ñퟸ¸`Àõk?þ:'µßµ, Æ0΃½#X¼]w.› šóz´ðhµ·0¶&Žñ¤˜,‘ÒÂ0¼T¢‰õY§ê@ÃUS¶Ÿ—0eT”½óC¿¡ëÆ.uÌ/"¢þë®Ó>í°Ç­”h kËÚic[ýÛçvÏUiuâÄD溭 {\³Ñšý¹n5Í#z÷×¹ak…싱ƒ’…_ä‰ÒdÞå!YI'ºX¤H¢žZMùiJÉH7{§¢LØØ½ý1ó5c"Dˆ†Ùáj–·¾¯sdR€yŒ¨Ð2%^öÃu¤a”kè[O—;¸â!nü…¶À ™ÉdvçPÈü¸êßWQ¾x©(ì “:ïY0gi¸iàϺAÜ"¶A(gæÉa_òî;VÔ¡¢ôH<]†,öÒà%~ôë°ñ­W|XìˆÖ}PHP‘Ù’ÇÆ.ö¹ý9h°Ç¹Éa%UÅýûKÔ\'?óG&õp ÙçJBÒ:$Ó­€°,ÿ68 BÇ4KC¥`_m•*ª[MžjVÏ pÉ}j@ãIÁà óöŽŒ\e; ½ÞìõºØÝн$: -ýÎé.âÜ#¥vMsŸ¸BøP+Í@ÞEX`‹6g\SøÇ,ïÁ­ºzΉ^]PbßæýEN]ª¶myw÷¯ç} H?¥f"sþ©K1Ëâ„bËwÕÝõ“ÏÝ-½)„ ‹­©c`‚½m¾ßà^ß^kuï>v*‰‡ŠH«gØšÆûÚ+C­ ½êëVp‡ùŸ³ÊS5KAs¬“©+OVíTô||«Ñ®Î=[µ» äåï X‚ò×ÇW½FἚÏUGîp lþñ˜Â%cI( R=¥u“DõÒCÜãÕÇLnÛ]HÒ™¶j±ºËd>¤B6óxëLPL-vœÓˆ]`ð:é+§ˆÔÓS×;{¾º¨!Ûñãî…IŠwÀV­·µHR°[B°nŠ·J"ˆëýmàŒD“§œŒì’ÌÄ¢£P5ë˜é¢/XñBw ÖÁ¹>ÁV³î8ãv÷²ìClî—zá¢i´{Üßé aQ÷%±¥v^ü÷—Rj±3jù‰ÜóBÅÉÂòœƒÁ§Á-~'ÚÇîÁ=j¨y^í·bq©rÎD!ÕWÄdå¸éCS;¼3QSòƶž¬rç]ô¾‡­ªµ¡ân¡;ªIÍÕg좮ÒÇØpOÏÏM—{‡´½Œm a‰ž;+Døµ€æ´¿9BÅDážÎì«§€n°óåÖ¥Ÿ‰ó¦z‚C¡j|.ä´¯yauºµÏ?â™ Dés8Å"¤-8´¿5 ïŽüÎÑÜoNÄ`]z–¤£í¨ô¼Í¿"H”Ðwjbn:ÿc­¦Í'8(î¬ý+aËŠíáÏÀ~%å"7ý, œf9&‰XA˜¦Ô^uºÚ˜£°ÖfiSê x‹5ÅÌüÇLÿ g™D®„J¦;ðä—À½GºS£=ùÂÛ‰Tó¼ÌÖ YHÐ/h€ûž8ghTÅâㇳh„±à¤O™žeSÒÖ×í,Ç©¬.–åq:ØOã_¶Xx,û”KÀo³Ó,‰mÉ“€Sw_»8ÊŸõ:ëE†ÍÇy‡M1UÞÙ2„0ÅjÖHú¹¡S.EÑœ/MŠ] =!šÄ SŠäÒÿierÛ(F°€€Çá±qøj¼~¸õ²k`=¼@Ç_=òFý 8!K[cŠÿ~VºÜý¹¾ËŽhü…ËdÕ {˜ûÙÆð­»¹¯¢–Ü_/GªÿW.ñãÖgí¢¡Õí&D.žZý¤?&1wòÓ{S½ Ô>ž0¹5×ðVLMÝ| PüCuÙV®Xž¢Y [¯Ø‹íyíg‹²§`îÕÔ‹#öäÏÈøŒ°óAߌAóZ³E"MURçÌ3IŠbÉÙ–:Ç¿åøÛ$I_š´¢ž ¢ýÿð JrC ýWܨß]»gèô{w2±^ÙÓ± ÐMqd;/˜M‹bêz¨o4bú‹7Žy~CŠt¡0VÓ–b-’U…š°‘[].ð­¢Sk@D¢}*¦®öøBÞ .i_ ð Ðúô^¼tÖ·c"¿ôÙ¤fŠ'í:z€Nž7@FØ\(ž<Ùµ·L$Þ’2]™;]û~køÜn¶M”­ö¼–£ýŽÁ¢rD¡LIPßïù]›L"-ÀºHÕ% t¸ ãœý5ˆ¯ÿs$ÅEÃ2v|QðÔ•}÷×þ“ó„w6Mirþ$AõÊtN­kU¥¥ñ¢ƒ’=tâG“}¦ßló;fð,«Øi!ùó~þu8*ç!Û–º«&[Á: ¬b“liyÐLòy虑1÷…3¸;&Ûm¶?¨à À %êÐ …”A}Žõž? ´ƒ?ºhŸ‘ò€Ý•?%°~%-œ¶—í*ÜŽ)Ýl¾Ê· > ‡àsT«µ¦–̓â¬BZ{”‰)1—{LGÑW¡…‚’µ–>ÂKÙu"-èaÝÈCÇÃ"š)ÑŒGY.”ã+ñœ%R°¦{íYÿÒÌáh‡OZ£ÕYÓtŸùçYoQ+ƒ¥§âRŸáÐ{E¸ÍÄ7ÔZúðú6ãˆï?ÿ)aZÎ'ÿkîŽZ¨ÆÑŽÖôd†ž}E• ªÙ»„x9.j`á ó Üdjï»ïW|3ÝG¶šŸ¯»ž·µZ¥ã §B\rTäú»T¾Þ¸¯·¾?áë——ÛÚ-ööc}½¾ÿ¯ö#çô‘}½:ÇÏêãøz°uqÒÆA%°Ey ijßXÓ„(ÐA©Â¯d)SfYœ-[|»ª¸;ì2º.s!”‘ £%eËfùëq2‹ý¥/_Ÿ$Ü7èRpïÉW3çà;Ÿà¡|ãmµ˜^=ðêØÛæ÷ÿ3[ú²w…®µùçuS^Û–¥úf”:i^•Û?:u)7\Êldìo{LFLs7Â3Œ×¹»4§ÔÄÓdnÕ¦º‡Ó2¶X̼€\㉮ü^¸1T¨¾ó·h=›PÍðZŸL†n˜>Ÿ1C›£míWˆ±tJî›üÕ«cq5§ŽŒYhÚâÍÊÙ¤äÎ)„#Ç¥Êd¼)ø¦×~€QèÔ{L>­ˆp½ËÄî:ðá¬ÑõÀ.ÍÙZ@Í’Qò…kÖýyZ‡ÙÖ×_+ ¹¸çF¤'¹7ç›×G¼Ùn©ÓËJâŠUX¼".ÉÌ;.4eÑx=žÆ0íã6{çкÃ28ÓäQì~ãØ@Fè­ÙåZ…Æ|åÂÿ`B÷ÃÆ¾p/4²ü“ö(rÎIODÏT {éÔ*À@[tÝ,£MQ´ß­•3"øq@“‹"݈ºÑgxŸÍÊØƒÕ‹²9n4¹^Mf¼>Eë3fjý 8Jl'rDÔB®™šyYc¡ÇFÒómží¡‚Eg«‰ˆvʦK»Wžt ªš°5ï&¬®ª da6ȵ !‰5µY1ï:÷«ˆÜгo¯~~v…ÂQ—ÇYFt‚~p[N mm3Šó„®1ÝÕ›³Es>ôu~Õ ÆýÍ@ƒ‰÷¦9׈˜·+€ÃÒß>|hcQ1M°Ö]§¾Xk*ÁúRÌ_­¨Ô13„èé`Š{°(KËÜ[yÅï{üÂ)3áóBðœrŽÜ0n´$õÚrþé/xžòØÖPu8Úµa£¢"ËÝ}©11Úˆí´yi•k‰ÀW£åm`Ñõëoð³ƒ?‰PtÛ"¿_+Ý„UOþìCaB~¾JÀõ2F4‡ l,R¯Ëî>Ÿè :e=Њ|‡;•X+?[>ÛÍ[è‰a^zy§8Ã8°ÈŸö»À¯ýê<"ÈU ÂJš^£T]Ëçû!U¹ÒÑÜ{„¸×*\;ññ«2ÿgõ}rîìÒ`lýÙ·B0rÖáýv:æùÏ6kª‘ ´®ëbfíd0§«¬0MgÙÉPØ$Ú@«(ÙB냕I×ç)‰mT`@»:›Ù ë&÷Š‚HÓÎ)³œ¢ï6²/xù½S/“Ì5"òù¢WÁPš+ýøÉvJ®~ûÕ?Eèw¥þ¢£µ\÷¦š8¦ê1oÝ5²Æ“ܼ€ÐK Y›}lGbÆü6c±Dþçâ¶ÂLõIRÀ»éèŽ%ßÀ$ަ·`ìè=-/¨ò„Ô]•ÛÜZŽ’"Gs¥p²1 BƒZ7è»5‰L^2ÔÞ³|HiC9wODÀ´´0‚;”6áYu…#lÖ7÷_qøÇ)–¯{à ­|ZÆáž1ˆ!Éa§´‡=Ž6Rj´[Ò“„—u°r‘Ž’«.ÔJrå¬IºÜ,Ùnw¿Šš„ÈùŒ™UȦån$åN1Tiéü-x Îw–Ù¿¤Z–}Õ ø½ŒžJÞ@†‡¶µ¥5‹É·•ôÉ.ÞUIs‰i*K™÷IÑ€1'aoHßÖÃß8HƒG´úQL·Â|ÄìÃZH€¨üPÛfÜ6~¹`ΔŒe>ÜúŽ>Íu`ˆäMxWoVŠ—Çp-æ’àö&@fӠذ{ð,ëç/ë@2»]‰B1hK³>|ëˆÀç¬V‘‚’w…>UÝ•âA(AfsW>Ê©ÔÇ^ÑQÂüý„;+ ÷ D¼j¹~TÛºB-}â¹±’îâ'€xÔŽfà½/¶Õ9`àµþ•Jf‘]ï\M€WÁä—Æí§ÈSRä×Sôà2pyÏ\ÝsåOR„Åi·éš"Z¡Å^¥ë¢ú}½‘TV ¿@Â>e>5ì“xÞø3ÈX^pÒ»Ø}*¼»†í™¾ÚK¯|³ûþ¾þð„ÿ h€¯ 3<ìâ7jÃóþùrÙ¨=ÙfãG2ÒÆ)Ø÷ß6Œ½šοé ?­å#T²ܬÙÃ_7ˆw2…š+%!ûâŠ_˜?Þ°{éy` ¦¹1”HÇc*ˆ?^½“?ßµ´œÜ†œb“e ÉN[„Žˆ‹Ì€.µas-[âLD «ÈžBV£þbWdÐó%WSZÅÊÍŒyëë9ªikê)±ÖÇNgkTð·;ä0…'%r.‘ åÀ5‰£ñVлmŸ*ox²T]*Ž ¦r.í4I"{ÒìoÐÝ%†>`šè»1€ñYH­£E”¦·ÒÈ{uv¡WLO…÷‹øXyÊsù…ÞCuò“ÿXÚf‰1–wã¢ð}3Êä+KöYlbŽ$ q‚ŠæHÓõãöâbŸ~=’ èÓ‚¹9¡€9w­×x!ň5jÞŸ3Ìüdyo¦ü d1´ˆï­™ßÙfRW%ƒìM#ässƒ.[ß°†IË)ßI_WEÇ ËhôL¯½…|jXp7ë€ÈÂ{¬–·?òv+"wôñ”@·$íùIJTZŽç^=N’hë^vÇ,ù*ȼàx’³3èÉ´ZâÑ!œ„è^ˆïÍæ„Æ3éCm2;mœ\Ý_O[^²4'Hždi…¤`%¶YP€íAñ‰O¿T—áƒ\ 4lñüTKŶ¦§&uˆ¸2´±-³]PZôBåÝú~TwŽº`Æ=8ùóçÑm ÊCfÐZKÁý4Ûf”h¿XêpŽq<ÄŽ½U‹^2;–Ð0‘„”Ý– iàÅ+?n_éÑr.%r¥ù„Ó ‹Á»Š€iSCç¤MmAù¢{&Ð1¬=9@ž‰ª2U:,Y‹ÆÜ+=­÷#²Dh€Yů‘æ“Ê8Ý<†ðøV:2°1ac LrÈâ÷<ã%—o¶Y¶qöPO¬×Õµxò¶¸ÌˆZ9Ò3΂žk‡²v[JT£B( ŸÄˆÒ =†t|‹Ý S*¹áò’ú1@ô‚.BsìXôi ,MBÍêâåè4Em-®õMI¦P§àËr3ïo?üJô`€ÿ1¾i¦‘y>ꉂšM<Ä.é>ëRÖš™f­±œáeêÛ²_ÌëÞ°O÷Ÿ'EÊ}Ûc$KÖF/¶kèQòޱŽáþ4¤=åTŸ¥ßÖb؇d¤‚¾bRt9«ã2òË4vXö:³±GJü<‘—¢Á•F SþÎi»[çÈhVvÜB :wÇmo¾‘–ÇãÔ€«úXl© ïûn'sX\¾UwtIÉH`IT#_P]u¥ b}w3OVŠ2“èº|ø˜ŒPñ¼Í6}°ìyù¼²ûÖ¸8ÐÅÂci?NÁyËQD€8T¯Î…k]YÝ‘•5ßhv+±U¡èîÕÖ1ÓPë¼@uð@ÅT§gA†`œf{am³× —!Å6ï¡“ûº!²\ÖØŒÏ‘³¶mì0¥—ÇR¥ðñg­û¤×‹ÏkòE ËаɛBÈ H ò# ¾A±6BþôŽôÖTXšÖ_¾®iîPJ©d¿Žß³Þj5xŽ{·ZÃèWÊ®®þóß vFi’ªô(g#¨ñú[‡wc¿þ­ž`»~ÎP':(ÝXVØÏ"Ç©‹…`Q€2ìž‘P.‚;úPç~*Ýøù1¯fsûãÀTxÙÊ›ÇfE ¶…’ËW©1s<+½R ¸zï‰È #Ÿ{DEÝ¡ûŸgK‰µ‡\1×ò¯ðo/âïW¿T)N§òW%U>+äæAPHÕ-y¬¶bOûJ‘Ì_t“EmÓY‚†1åAfxF1¿)ë÷cV^û&“hKHø>& ÑCÕñq[ýÂ{%*ò6cy…1SPßnp÷;šÜÈ4„]ôÚy¤ŠðùZ~ò1+ç]?Ö,<7II¥¯‰›ßŽ÷Q®¢`K+tU:ü½UÒמžÿ‰V£r–¿(³×™‡çÊvýh, Œ ‰hêV;…³2p%O­–A‘ÞÐÈ«P\Sœ3n©üÉm_s“gB˾ºá6Òéä™:Ï1ÆÃÔVm /SÃf^0åOºRÍãSò,‡púŒ¯ÿj¸a³~ä‘âÌp÷«Î` jÆZ¥†ß/Òb KÞ êÐpÒEÆîF2¬|À˜Ýœ©Ë9D7:¤Z#«Œ Ë6¹“kXà\û·= dì­ˆ4 xB„€Ó€î k¼±FÙ¥†’ß»>^ÎÀº}ÿV^8®_½~Z÷Òth¨o¦H¢‘p“yC½)ü(»]X˜O˜ìKBßP Õ}=÷Ë«4+Tž‹”)ÞœwqJ‘¿ã‘ÅÓ”MÄL‚b”Ô½nùßâwÁZ¨ÚìÓG@6³p<UH@‚ÃmAÛ1."§tB£èïȸ^^Ä]ÞÙ6¡©àÄ~f¾ÍÂ5šbÿG/{9a­Ž_ÀKò7¡ŽÇIÕ…zb³£’Kl 0<©’ýZ¦µtP_Ç…_r‹°ü~Ëœkd^öà8Î'J…÷Xñjƒ£4ÛB® P%mùÃm÷dÿ{™ ë?^wÀu”ÍúÐö×ëÓ¡ÈèŠA•ì*x•ÛSÉÆ{K#/Úè=ÿ$xŸü [é7µˆ œ©å9¿HL1• !O”ÝAÚM´Emô¡G‘Q4D¹Øè/Eï¾¶MªmÔ¹ A»¸J_™RO/44¼‡KÏN£CžhA.]gL½°ag¬Ù`â³²³‘zUqêæŽ˜o›âˆþÆÓOFPÚ£6åÕÖôT&‡Ë:YªõcºŽb“„qvùúz+üø®Ó±(5îB€1 FVÝ2^®Æ¢ËÏ(õܹîyåµq‡7Åòp: Ã¥fµ~bc†]¯ó‰^ÂÜä„ ˆÿ=‘Ñ+-Ì\^±›D%R\ Znük» &byì1£Ÿý”R×gmb(”˜,Fõ´TàbÒ𹿱Ý™éö%p™&™³h ûJÓ"ÿMID†*ãõ’X%÷'ÐÀom3d‚"›7ùO,0”—þ)XãÄf•n892Ô=R€Cô´SÞo`¨%èúOƒ´r¸lAþà X‰HuLà]/‰[Ž•¹[o*bÙd<ÎG"®üÃrÝŒ+δ4•,D*¿¬\ðH‰ÁÆ#S¦•û¦úv¦²ìUÇEo=íƽ Ôz§ÃŽ Ò¨\”·¢1\àÜ/’ðæ"«Êa^±DÌÂ¥Nÿ`ÆSÜôàrÞ„àaö0>¢ßX§¿ÕÐQF˯U=ž!ib†Îã,ªÔ¾£¬Žö.ý¼““V0›ÄÓÏVÃ+É—ÐE d…l\ËPÜÿc*ª)fg²ÒrÁ-u#Þ½6¨ °ySùÀ]ȹ5–šRZ†$È©æóVçCVv"¦1„ç/Ûó”[ô¸‹ýãûbÓÒwÿ>iàåòœ1ìÙwbBºwqÍ_µasôi‡>èG™*¶‹oÓÖNduÖ鼋D¦aVÜ›—NÏeÂ*)¸È8±ºî)S„II¹Ô{uG±ã ‹hm)§sÛå#¢BcÍ‚¾—àú‘CÁÖþEïíîåæ_ ¼Nò™bÀ5hÿ'ÒDÈád h+)ôŽD0É·˜êæ0IŒ«ÎUZ}Áå58<$Õg°ˆÞ©&¸Šk­@ýUç5 ‚‰{àˆŸ¯š”aîPò5_½¥âÂg{h WŒvâëGJÌg"óÊrJèež"aq¾> Ã5çåº ¡ÞÂlQxXî_o‹¬z(y“oEyCÍ;PbÿÉVtž•>‡v9' Z1øâXRG\2¼/•‘̆ýâ‡pó'÷ßi(î÷ÄX"nmOHËz€ÖC€+bO©h,ÀG‹Ô#ª˜UvÝ'©ƒ/‘k†œsÇê‡ðÖšûI9ýoôKe¾úa“5…67Ð ¿;ƒNÐeæ÷PĈ#îÑ{FÜ„î‚.{¹3p”!$ÞÑÆ Ç v@#ƒ‹·f¥R%*o#àÿ2%÷14 ÃUꤒìå#†š{`|GÂ>Êæ»•AꎶõÅ'ß22ÞGÕ¡“E,È~©ˆ¸pÓzöŠ+ÎSÅåMѨãWÔVÉF)–ÿ‘°ÖÎø}w§5jvãÃ2+†ûWŽk]\½VüO¹;O?µeFÕÖªÉt]r×ýÐoýÏ׺T3V¦“¢Ñ` ‰Eç?œ Q—¯غôcÅÎ ÷7tÊt;çeÛ}ø2ßbÀ;E»3ßdo$Ú‘;Ï׽מµL‰›¯¹˜Å<óŒ Úë´|ï1”cÍ7‘ ý³Ûþ?mç<ø&h†Y]ž»Ep¸”UìnÂùIýˆàe‚vküÍÔ¤_½¡Þu0^ƒæÌi©ÌÃE™§ŽG)k”ÂÅÅx4QEÞ9AÔ]Ü^‹š&ÙŸbãÛ3k¾Ò³Ó¢.±=,,­j²Þÿ+ÛTÛÖA1»†ï³¡ÏDþjFàvAÀPïMî~dõ~)tÞm‰ºJ({‰ 2ü„Á{#¾5ñ”31r‡J%xnÊ«’¾~x_Æ¢dW¦’Ô‘.‡Ô°Ê>•`q¥bûÀìþžøé•ƒ¿–íoQ+ì:áú±“£Tq]2À~"‰ó%,ƒSMˆÑ”þHXApsjA:Z9Ò‹æÚ7ç:AŽg¸‚”:e €}k¤Qß Ùl‡€ž)âÜmÂï©Ë¾ r4¾|2Ô^…fîiƒàà^ˆ+o£‹×¼DžÍ\É`ðé§§Ý(¥ìµXÿ €ÁfÙfÃgÕ1XRmó¶Å%³œYÀÙ†Ç.S"9',¾Í–Ð z´¸87áÖ¾²–’ÕàðÉwÅ|pi~`7$ªY¾©¡ŽÔ1™ˆíÏ>&~„Ã>øóçNWÚJ†/^¥lªbô`Ú7»/èç¬û—5„l{à!_Žhø”RŽ´ßø¦,¦r|x<&g’ 0õ% ¬"Òm¹0ð+r¯µš 6µ‹>ð~ÎŒWBJtCua)æ`Õ?šý>eƒ`Îï>ÿWáIÞ$;OvŸW©q7Ü–ŸëéÐ0¢Q"iËÉB€¾~DR–v›èÓlÌM‚ó´ákQÖérÜO ·‘T¼#_´TiÚSpi=ô˜ê aZ±¢)r°YÐÇBx>"œ½¤`Õ\¾ø•ü˼â‘*Ýrö³;–V’F#ƒeÊïü¿òˆŸ=«'‡GídíHV0ÖdCÒv_ÿ{ ŠrW}Ëñn¯7 7›i”¦(\|/49³é0BúV#þ¨ôÑ×uµd(e;¶XþÞÂ%nýÁZŠ2ÕðpHžÿGïç”à÷Ì(ÆA¤’‹# ç¢ …ª™Y\BãŠÔ‘|Ç+¢ZA;‡û"¸B3#2|Ù‚îƒD§PFÝÂF z'œø"ªCŠÚÄz{V’ùØpE‚û™ÑHï½,œÛµW7lSC\_!¹fFÄG¦¨lQºO&Û7È6›¨êñD]E–ᄤµåq$ ö˾]ÙûÂ7 ¬?~vöQjô¾oŒ"K£ü'Ħ=¹!{ò¿®¾>Xòq´­™ Bí,Böh6Š`d09¶±·¼FµsälFDZu4‰Ö„6YD“,ð¼ø!X’/®:e:Û;H ŒŒPtŸ8U»$i’õ4—û«ÓÀL»ÿz{ŸÜ©ûw$ÃÏpOû©•ÓÓ\¬š¦µNB‰§Ò²K‚ÿAÙˆG ‹.k‘nÕ´ZaèÐM݈Ñ]Ä ÞkÇ¡¤±¿5þqíõkCYz©ÿ)HȇÛÎŒiÔ7£h3ÔH@«$f5ãÊðD²ÿjUÍõÃìÃ’zn Œd–m„zjù¹÷Ë“³€Õª.²þ%=9~jOÂ'k³qP5˜^ÊS¨’ðIBªÙ‚ŽPUúfƒ$߆UK¢úÕŒ¥ sá~8FZ>î;¥-Ìd®ðÀ½¤Æïš9·¼Ÿíz/™ãJÊÆVO­Y†¿¹!yŒõÊ4?6î½t.±Z¤Ò_& /ð©ø†:‘°ÙЀ¹ø˜b‚<"H½E[ì_’bûÚ1l·]šÈ=Í皯¢>‰š"M‘X˜+Æ®:Fö©˜ÛÜ-›U>͉B—0Á žfü‘úÐoM{žQ Ê@,­û oPá¬É…~¬ÄæÔÃ'æC4Ïò«55 šr¹ÒÀø Ž0éý±6:­;¤Z牟IØ©vNÆ›y§9ô2À{˱^Íãÿ")÷ ËCŸƒÍŸfqžE „W‘pþѫߥF„>+k£vÎÁ׊ Ž ·Ú×¾PiÆ;ÞØ)` (ȪòÊ4p»Ú¸C^ܨJÁJÅ ¡áð€Ô»O·lTu刿V½…ÆRÞ2Q~,]Òw»T£Î* ŸpáÆ_¼]ìUj†÷…K ÑçS®öD¾8ÌѵB‰ea0vÀ”€Ýß<±qŠöæGȃ$ %UqƉ^ˆÚç”@yíLoS¦bªŽr>‹WOŽ/ê Ó­pu•uÈHbèr˜Šn]:XÍúê³à¿×§à…L 0jôæšl¨ À%l„Ÿq Wè²}0Vq‹H¿{ð“?à˜°f–`rÅRaÙÿ+­åæú@k€R(q"ak#zᔆd¼<}ž ã<þ^v›–3µéÖ*)ºÜßúUW³DOÁˆÆg¡äkwTJ,OŒ¾Ð«øm°;™°qÎ M¹{úð–^ ö18¯t Žo>Š…š“ôùµ@}Ï]1øO6e»/Úƒ[ô¾H›hS5;å•„¼%Oiý–{¬ÒŸ'¾l3šPç({Þ8 wKdmޔר[7ò{6R>xÿ)ÆŸG³;ž*dª óo’ÊþßPçmÚ2ò@Ž×ŠèDÃòQ;oÊ¿ñÊåØ%T`Ö¶z®*•Czìæ‘N\Ž ”Ùð kP‰rôÔl{µ»ñD4º){Ÿ rAPáI/øº/Í!Mab±Ý$™{šõÚU¸ô§¦ºÔ—D CnIêÈf¿4Ð_ê‘bK„m‡*Í«É)+{wÔô#×X‰”†-&bÝLö¥“³9P“šJÉ"jÓ˜ö¶&sî!ñ­›.¯AMØ-_;z„ê¾%w™Is…ç²ÿM@EOµÖAœåwVêO7œtŸð£Q¾œþ^èŸSïĹdœ –ñ+Wyª}ÞÅoc©æ¬àÙ\?õÙCˆ¡¦¿¤}°Ú4 xÖñº ÔÜóRv*±Qyt·Aê ¥–[KZ¦`~`Aæþصì$ Q-Ä7ÈU÷…­Ø£“¤Wu Ý¡¾Ÿ””Äð»Â´$ù® Q™?k»yy:=ôËòÿXv^ÈŠ›²‚¢-3€¾Ôã´WF{ƒûÙ_Ý&–EZi›%TR£Ô{u¶üòy q°8‡†htö²÷u¬sA]ãÞ:…Žw c±å·3,±ágóCJðæÌD##&)»™´ªÜñZAÈxò¨5sÀ,݃ùć§Ì #ü‚mó‚^<˜jÃL~knû[×§ù­¹ï m¸(ámW‹)Ät”…óëø‰I‚EÕ¥®dèp°djá²qà®”û ^¬ Ô¦èÛn‚‹"¯,5äã×9ð»!¯Çü»[rÊ´lLóx©þ±rýßÏWV5~º¢ê‰ í IW†u¾œ®ë3éHCõRŽ„ø`z€gL8+Ì7J —$5ìE"y“ŠÊßäìD/Äð3í¢óõÊPÀ6ˆÞ ÔQú †áõä[\\æºô¨šFäGYuè"3á€+uÍ»ËÖI£æ[9ÛU6ê,¨V¼[àéy·¿5'Yk s»º|¡3-Œæd;ï/âý\ýOI5Aü=Ûâv‡&¦dˆKÙwÖˆªÃêF³høënH¯æ¤ŒãÔ¸õJoïh &ªq#\®Æ?EÏV”×R3’ÅFÄ¥t–´g¢[µ’E¤;=Ìà…v¬AXæËºT{úlþìZpúTiÎåÜú´·rïnF­Ö_Õ`biâŽzÖÏà | XïxÒ`½ŒgDJûû*†v‚ӿ˘xõi'¥í—²”æGe¶5÷.mÚ|¦'ÿAÇÜåq ÞÎOUGÒT…ˆ¨skÚûÜŒóN*‚o–ÁhPm®¼›f˜¤:ÿ4g ]ïœá˜ù›q¡º7°QñG±í÷6]Z£ê$+]ˆèf?è»Z/é·ø Ò_- CKàL6éÅVJW’Ÿòp½68«yeFàJoØò,½ÖRСoÅRfYÀYˆQï£F¬ÿ{ Èçsü`qGîøUŒm°QÉNגɉ \h«>ÆŒ¡@±è¶ƒè]Y$T䋨G(wbsM’§U‚œpEz®Ñ ã¶,(¾† RÆòÔÆöEt®ãZ…§ÿ5H¬*v”ØeäØB8¹v>ƒ,QµðËØ;”§?|’dkoÔ³'ë  hÚgªöýDJ~­Ç_Pp ¦ô‘¸*%6Â{SûàgЭÙ-iÉs÷X¯#e5][~*²t¢KG¨¤qjû"‘ã· b,ûÄþ»Ð¯Ó/¤F ZY´9ͳá&ºµ6G •w­´•ˆá˜<¦^×AÙW×NsLmŸŒÈ-YþaÕðûÝ9ewÜ·%«¢Ó4>~^N×=ÒYTŠw-ƺÈî'ÆxÄ? >xªžwªéì‰<°‘Y䃽wÓ]ºvåãqÒ®_úR:ç~Ôî9{ò6ZÙö¶j–Ì!Å=óe‡>­ÊŒ\߆æºj¸=àºGw rM7…ªÆî÷¸nôëŠöT)Èpì^xgðF­ÚšŠ!ø\ôw~˜Œ?”_îc ýlÄ}x9Ó]µ`ÁIN6=0ÿ³ kèºÊŽF²V:˜_€ï-½ñ¨ž1¼ØÏÙ¦ÑÉvS³>ì°†^lI*¶g~¼ÝÀ’fHÓz¦³=Ü‘ºúã­7ʿ՞†à 'âwðÌ[ê¿õTJnI«{ùÄy¥|qx'JžihAŽ­ðy{:­°ðo&ˆ?,ÍEáAÍ>ðs‚±Z§Á¸ÞŒý91-ο%õÿ=UÙÀå*âö£û™ž úKzm§bŽÊã÷šPB*m1Ðï˜|6÷òEEÚeÁèœì©È‰…"éc‚ +Ú „óå¿r PÒ>÷¤Èæçƒ<3¯Mp b“ßSiXÎ8I¡¨¹š"åIûèR΀€ãö¬~ÛOö§~ÝÇíLýµÝõ'þÝ'Â|çÿ6¬Ÿ9ÿm·v;ýý_ÿ%`AÉ3 °˜HŒ¨8̯ùû16‡ÿ„t3$ yÛ ¾X<49)¤—*=<¯§éú~Ÿ§éú~Ÿ§é­ êf¤ zÃßñä)m›Sq,a/ññ¬M ® 7›§£E®Å§Ì ¥ÝÓç—í„íÄ®ƒh˜\¸ctŽ{ÞïeºDHí>¦Og‰›(Û¡ØN¤A§°qldªœÅ4eòïQPÉTƒ—.[Ñ€{|–o†ßñ˜]ûó 7º&ôu †WL!Ðt}5uQú+j{"¦ÊÀ?C•ï)¿‚ÿEo’¼¿\Ê­1}fP¸ÄÛEºÅ{ÍŽÑJÑYèušK"‚¡ K«îðÿ#ü«Ä¾#¶ <¼ï<+Ò%«Ü°®‘«‰ÚQ÷>Å%s^íùû—õµÜ[Ê_Z¢Ê£)Ü`0€}5óm-A<ÎÎ,þ ÚͺÂO™º)#¿ñüÇñü~è:Ÿ°†NDw½Ô㙓[‰Øƒa<š¤n“hÑLˆ½"•q–$³O9ÇøƒÇ-ýom gZ´ã8÷äÆÞ Ž*ˆ‹ˆ÷KëE™k ŸéO>°²&I %Y¢ø©°&f«]½º%(v¨UmºçøV—î¸K Ø3E`ŸXUc>—öš$ÿXf3=ÿ6J¾”;p‘ÌIþèMq͵­6ä±åV‚ÅÚD=ø*W„yï=“Q3ƒ6Ìwh@×j¾‰‰7bç{; |:`Å00ª´ ÉÂeƒÚ'šv †YÕäDáür¹ö‡Ã¾t¡Iª+š8cŸ'Æg+^ã\Ö¹”72?†¤òù\õg±O;S‘'0ªûû‚h ¯‰‚ÊD™ÏOOR©{ úBówc¿þ³Â,]Œü(Ö”›Q‹º# •wËHý²’Á̯µ¸£„vu#ˆó8~Îí¤˜ýN…öÆèâîoQôA]ñ)†„ xLQk7œ_úe©ûKAkq°Z_ØH©œ€hÂyš«¿azmÄvÐfŠ‚ b\knéÖüálÁÎ++ônæ”ÒÚ!VˆlÐýœwÊrêÉTĤÃúƒÈF \PèƒOÎÓß&³•ö·ÁJ$¢#)…wd*Â*dv¡L;tdœq€±tüàUªåOû[´’¥M‘¦÷á*è|›¨(ª?4O†uP#]j×›FãÛÂ=ñÌ\LᡎÌÈ÷C@ª6+.cÿGéܯÂA¥˜â0P•íá¡02|* “Vnª¨S‘ÈþäDT4°ÛNñF.~ˆY³t® bž*hˆÕÚ¼dþÿ‰êê¯O¦ãßl¸F—1C9†#ûaKß‚ŸcuÉÚ’äñ@<9 ýÚ 'µ è‘F„Ô>nµ‚r„"‡•'ow¾ ü*v!Kó¬’P~Î'—›±w %—ý4(€Ñ—¨‚7á/¬I=ˆ¤mžŒa¢)°F#gxôMÆõ›R óp²Ô¡Ò&Ò¦mì"GŒVW'k‚£foöEùé ê«SÚ¶sÜ.Å¿á^ÏŒE¼ž~]Äç° “UÿIW;j5f[¤ôs ÖÀŠçh€j:iõ+<§öœrØêsK¨¼ƒƒ"¦1.«}´=F‰Ɇk˜ ƒø’ü½§Ùª«0b£Ãr稅ÍkO‡ààšD2P–[ÛMÕ<Б' §ß}}ÛrWõ®TC_º.Ó0%›tI$h=—ÿq›Œ&ãw¬Wuµ;ÇÞÎñBßŒÞ TØöNaé z¿A>áG·z—dô ¥a5B°˜aåþ­+YTÀÇÅ9"²ÈQü1UÊÔìO N_êßD-f­?ø“"“×驘Œ"$O³¥i-œ~“I$»ÂPNbOªÌiËÏ]RºóEeiÕÀ¬Â(gìÅM  ÏW¢ÿYüm~…ݺ*“9ŹlðWˆƒŒ¹REK<Ú³Èxr½d¾t?÷>Å%¡î%ö!f- Ñ”¹ø4Ô*†ƒøuN¥RÏïáïp3Æä­sb­¥?€è¿vRÍ…w˵UÅ#r½…̪©Ë^Õ©óõó6„$j#æÔدӭǪÂñ3[pp«_¹½ÉßæPë7MœWš”öXÇeZÉì™)¹õk+‡´¶s£P|ûn·%C-eCùSŒ¦7:€y” יʡM¦IḼ¯—8†Æ6ZàÊv2“¡q½gMKÈe¯yÙƒŠëø©zËx«ˆÙÒ½ ¼c°7¡š_÷«:²yèÚ÷UF2©l¯wX«§nœ-/OL(N£@æ¹è¥ÉÿÙic09½ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ ¼2ÿ“ÏÃ@@^ßjÆ_ŒüdAŠ{uÏØà¹½#­VìÂÃ/eɶüfKÖ!Â~5-h<^Œ³AwrÛõo·aà û‹t’®{F®#8´NÙj¯7„Æ•£*±¯>“p1R·Ù»‹Ï/T¤À–´;6Îâ]¡ºeYoç/leª}wUO¨Q÷‰¯L#0²ÌBÖ?.ñG°„ ¬OÒž<|ŠØDÙ¬þ8›±cÐáüH=½gfÕ#XÛ¿ëý~ò—™qeºÄ•q¸FìÖ 13ßÌ'l4 ´oÖÿ[M¢öHH¸4»*4™—^ˆäf¶þNìÇlÏ w®wY€€ÏÂÇ^›1A (ñ³’÷6–è`˜jÞd\)GVæ‹èfž‘¨¥h77ðõH·4š·˜ £ÑkWŸù—Ú«‘¢m"q9Η~ùód*ü|ÏÇ…˜N½:RŠö·3œ÷‚”˜g»NPdE„o˜ÃÅþØ-OáQMÈ”ç÷ÒA.$BwO<Û^. ¶R´ži[lÄöüû.…bŽè.Í Aj)R"ÆŒècŒz^çÓ³ì Äà¡6J—q) b'+õÃ@ëHÙÏÎÙÂÏÎÌ©7[K”é4 P,J}è2³2 H“ÖÉÕÍ(p7ˆó˦y =„›M3¹Ö~d;ÇŠ±™q@T÷‹eÂð‡Â]3Ü>~‚mÿ°ÿ6üý>ÿjúæóò-Úìã Ž#jð”Îüú,"¿Ý 2h"Ä]YøÁãâp~\#4’Yï„ëö¸Zàõ3¬8ôR°0‘Nô1Ê¿•}’ÏEcŸú€©¸³pÂÎË%/u SdœíFìü9V”AcÔŸÙt{ïqÁL”Ú¿’ãõ*ˆ‹e:rÇÚ"c³nBèZâKñé†)JXqÝjK<¦hŸtDöÐ`Y˜±=]žŸ^ÿÌÁyuY?ÿ9ûâJö‰egwzJ³dp„“­}öÅ2©Â¤EW"¾2Uúr»‚æFAj¦,Á–ı“ Ø¹½+A¼ñôtõw<„%ƒ•lòŽëÅz„k·i2Á Â_ιN ÂÆrmW=âu¼ã€ƒ÷£C&ô}Î<Ó·gç%¥‚Šw%7ýt[@P í|ƨcTúßïùænBèhx—KïjÈš QcI8…°Wvˆªè­ÉÛñÀR 9æòÝ´¾Ú$´eˆðˆ!»+¤Àˈˆ‹!±3™’x¶°ó´BõÁô“áº8#M‹) »Þ‹Q ÖXû¥ï€ ³¿–š„¯á㔲/ÓÿeNŠz¦Éß«¡™½V¯/Kí'Œ·ÀkJ»5¨C¼=3ä—Z׿•?&‘|0ê>•Àa='±æäkÖEqæž|øà0žõßÑdyÌà9RN/,²2?ª‘ï]Ø®;Ž™™NT\µÀ6€€ÏÍr?~ ­>Vîr² *;”- ‡Àj<µ(®Añÿ%‚ ¯?ZèX*Iž=/J V˜¨ÈÞ«‰4¥êÕɽx’±\íšYݺ×D‡-¸ž¦ã»:"`\ÖÄE]-eÌþ•ï±"c³nq!'ó J®Sý÷É!y¹„Šw%I ´:z8GšùP{Ä‚ϯ¿ð¦^¢'Ó†y1ìËH'þÓ4<·E“Ò­´œ¯?Gä†QA”j¾å¤&þC~ÔØ÷>ò„ow~òSòCÉætœà!*H5–Áãßíâþ±P’°òu6µ’¡eľô»ÚR±ƒÅÐ+ͼëÈÏϨ ùõŸJ ฮwm¬i";`n†]CJ¶8…fÊ—jæFz»bÒè¾ù䄎Sb•ì;ÀvCð“5_æ€L–y½gò ¡( Š7 ›y"DŽJ~$“%äfM0Rá¶à¹Ý :ës|oŸŒÒ¢"Út­ó¡d?]'šr?¶=í,l6w5E¾þôdšüµÏÙ"Êõ¾’}M7¤6o¾‰ ÚĦ·Ø˜ÔW„pƆt Ó)ž ,m¡ÒÙá6YB¥[ÚçÊò€¡Í| …*ßëÍJõIa¤<Ö†—pÄmç¿ë³«ÐV¥öÓÊg.5 ÃóÿWúµR­ŒôA!Ø£Ó!ßœª„@c ù8†S2VbnŒ‘A˜ÃÅ¿Pâ馿6nט“€Ê8«:y·Nö¡ê«r¾SÍK€njÔt³6ã:Hˆ)Ì”ÈFšàíƒT³y_Æÿ í’…|8Ï\Y„Ìk‚dT™ÂøÎ}ÒÄ\L/X¯Q.{ó&Z–VdÄ,f^Nß2ÂoáRß!-šHˆ%§®]®Mš_* û#Bçl;,&ãÑ}6è}üôÜRÇH‚T<+¥­Î}è§S¢?j n£ÙB£›’R(c¯œZÌìÓÅ”âá˜xcícÛË´Bÿr¹„¿¼Á/Π=´ZÊʇÁ}™¯áÂ{ÿ.~Úï.-…X¡AkˆáÅöõ“èÍšѽŒ.—ÙL«BßZS~¢ïë0Òô~Éú‘AéµÌEaýg·‘²9@-ÍÏØLçQƒyâ7ktJûbäÿlØŽ/Ý]Æß y-mq çp­Yºç„sÓzÀî›Ñ_Ô‰Û·ˆùo9UíDÐøÄ$U˜# u’©È †3dͰSä­Ûí®ÈÛkOﵪj+d-3¼ž|‹äåèÌ€e,1ଉ hsúÃ2È ™È)@Û›Òƒ?tdJ~×LÕ6óŸŸy—–{ènÿù®_†4Ó Eb5{$u Ió<>‰żr^{öá¤ÒÐÆêŽ@À׫0X‘}áüÆ‹Þýåqlö f²ºš¿==k 4ÑÌ °Œþ6Äü³ô~óAë•§"¡ù‹9jϋԖ^’¢1³” ~sQïÉÕ7¦ÂC;rONk ÎŒ °7sø,y–¢·Ê¤p@îèƒ\¨ø÷TÁOJÙÄñ}V0‰¯‰ºC„¹†šoóñfLÄTE‚4³ý‚ôÎþ[ ‹?‹ åï%=ÁœT…œ˜²±²`×z¥9”¥VAÂDe2kñG](*Ç.øP6—‚û TØ óTËØ7𥈥GÃp8ÔÍdO:ùÐkéŸ9.ù(Ü|‡AtI‘õó8eJàAFàúß<¬”áb&J: ûys2 ÉL{ö* ™®™¼ÒÜA²Vx•Y™Ë%Ü^¥ÈíRWßF: œä`†òÀªðàËq°6O™oƒTX––­y»gžåJHE`„Ö{¶ÅÌh³\‡‚ØœzêÀAÄ´Žô_ˆƒ£ÞÔ-ñb²ö£p±Ù†ÈÉÇ)†—"n†DzÅJÏ_Þ—wÛšÖïæ{hú.ÆU$;nJôT-X©ÕÐüö9,wUoå1¯èü`ÃGó›{¸Àk Iœ¾žFø®øº{Êc§"û¸KS‚«¶%%䜪’œJ;dí¢/Ÿ&Ë4Ð /çWH(S¤â©Ù%g=>¸¼äËl¨(“S$ ¶C¦†@Uî_“˜tðçGÔ³Ï+``Ÿ´íRö i3§N'“€g|n®ÐQÁåÑH[‘WkÊ¿gú»s–î‡ù ú¡£õ" †a投X:xZ# ô{Zð"óÞõtî†G5XÉ:€@Èr\€8±ÙGCšÎ 6‡1ðq‹;S ¦çû¹—3*ͦÔÝêP”ež=`Õ;j å¹Ò#£(¨çú߯swÊXˆ7lÁ/Dn‰ªî:Ý¢…!*8CXoÉúŒ>z–r^²—¢Þ%àš¹ò(ºúrÿ`_ºÆá;…è»9\©ï1¢y±áCßþ‚œn™(+l›ûQ{õï giã(?=Ð2 á…ŸºÃ'ÞyD[´°‹ÅÖ™\¹­M¹)G~ܧ-<–Õâ,$]ÒCĺzMZJ¦²s°ÈŽ-ÆöYÈVÐîŶ:PËÍÀ"Š˜í4«ÃX,øá"")$ÅŠÉÜCNÔ…Áë°Ù?‰¶1Y¾c”|jt"'¦ÊTqÆjˆð–í²¥4ªª/(ðÂçfÔkÒ5S)Q¿N«uKÇÕËxJŠ0éa z¨ÀŸ?Á¾…྄3åóUi78Ó`îÕŽ=X7xΠ•‚àiÏu­h§ÜbIP—Ô8$Ëë°x§ï{|EnªÚW€€ÇáYOη‡áD€%h|Âs>×M/¦œÿ‰T^¸@kU’8zˆ¿ÑtPÚu„Ôø=H‡‹[¯ $'>S¥Þÿ:D,Hùˆ­yø:pÌÆ‚@iÚB¸ºµt·¯@o»ãúšJüµ‰ûê¨Ý<6_ƒGŸáÐxÖöþ+„þÛÿl¬#äEýó\™™E Ⱥ_Ý–¸æ´A”–˜E¦š“Îo%ÌÝü×Þ:&HŒðyéRT„Õ`;h¯ ÝáâÇÞhm“$çzŸ\T7àsé´ ñP˜Ãò«5Õ]e¹®œá¯ãvƒi×Ek²'ÊmÙó>mп£³«ï ³æ.Uþrà½Bò²€£‹Æ"!Ë0fqbD¹ Wú·}!°F¥ñ÷ËTÃpûÌÿNÛÖŒë=·CÞé$2žMÉ#øÛæ®ÖCú#?²–wÕFŸ´u³¸5f€¦KEØ4L§lÄ"¯¤êI.æ³_&×Qzé¯ ¿u$“…’5Xw`´oægM‚„²n‚ßÐëœÃ7ût„I>%é16ö¼Öeý¦èd, ÝáþÒÃp7Ø/¹î}tî‚÷O4 ø4^®Ð›^ 7…°÷"›u¥ËqA Ò]ʧŸÂ…>ºø À¥ƒdŠ5¨¹ë¨W»0/QZú’«—êÆä&¤Ú2òûïê-r«¯’½ƒ 2ÏÏÜ~~áQùû €óI€Hº¼í¸ÁXþ;Hæ‰Ê*ÖÁÁØQäÜ*{¶¢ XÙŒäÊ0ÿ}SUù­éûïEhU–.ùâÿ@Å.f§ÅÅ¡l¹Z<„‡ûßБÌ(2Qs§C±sÈÕbO*Ñ;)¡´æÒÜ'âv.ÅÛ·}e· Ám$"Q@„ÑÒ•–D3J¤ž0ÙÜoâI«~ kÜ…ƒ-` *£ÙW»«q¿L'Ý<•òªTÒdž<¡©?zE”‰8¶â ©äIùîÒvÞrâ’Í2âú˜Ú‰!¸P"˜»%@A:™mµ£ÈÍ!0våD+¢þÓQ5ë/^‚Qªº.µ‡ÙØ´ýÕ£W¾ ™ðl]Q&íL2þS¶ß½S¨*’ë1Ý#QñJSy¿OP]¨^Ÿ)4Žr‚IÜ‘/Ïò#|—¢µE å/7à£#©l+v©eø¯×iõCIcu PÜè"ñ]ÄøŽÑ©z¿¡¤“Õ.8NÊdºåSÌ4¢ÏDÊW{òDKEÓš~N©à…ÉáØ£qøz÷ uŒpþF"T =I‚An2/9ú×XìšA¿¶@çµ)yõ1y ðìž¼¦®aÓyZ¬›& Ö4’Á‘a‚Úî½¾Óoâ®ÌEU{Ñ IIDšÔ›Ò¡*£GÖ°s‰ûRÝ‰Ö E–‹B¨Øü ôbg!”él¸ 1G;ÀuË+N¶ë…n”x8¤V›%½}è°Úi¸\̓꼣÷2]<†U\56PLžíz+5™ýL.˜Pª¸Š“ßbaÎ1•·?‹¢rÁm¥a!&° $¯­ `Ép7æmæf%·`[ñ1CÝZC»¯·³Ê’ãwœòõ︬WîùÆ2qL\އ°A…š±& AQ:pÖ#ßÌQví–£ÃH{¦æÏk0cáiI8"IG$^~kðýÖâΟ"[g¼øâÀ¶†×\ÚX¬¥4·õ9Z–½Óà,<¢¾ßÞ“>½&„ØPäFèЭëkœ^N⟠aK.å9­+ –*ÉœìK€°b½¾é6·œX*­©jû.<(ºlÙ^øymRß!‚ÔÈëɼäåð+æÂàÂi+u9?3ÐÕUG<Úu P<°WÂ#Œwâ䈥( £õ¥—‘jËÙ,Ò\ÏÚi§‡£¥·ÏVzL;±ŒÎõq¢  àÏ—Q-™Ï Is}^>jœ`¥mnDÏ= ø_¿Lô°\ çoøê†‡†R%]˜½Mw9':"+± ôú»<æ]VÍ©¨IþÔíê¦#i¨öÍås¿È‘•Î.]TÅ–‘‡Åê™~1À\Ö S¤f£ûŸ•2¸ŒaR;ê<°ç£çAÿƒÞûwZ°anlwœ'šøãNÝú®dí?W[úëVmŸþ¾"·zü9S}ÔMPV‘k)êIÁ¨ìr:8)êüñ[ízIØÊ/ð>ÅÓtйʾ€®æÏã<Ɉ¹”`˜P×ÜëŠál^*µ vüÊGÏS —ãœLsD^åQ¶jDó±§ Ç A›{æ²cÃ{®"VÏAÏgî)Íü¢žd”?’¾B~O5†pŒr*…Üsj$iáÇÄøxºƒ´e¹ð®qt;­Ò8UÔÑÂ|sÝ?z¦Ç7¼½mÌѹ—Â$Ê$ðt˜‹°ÂeNÍ{è­òÐühõÛ¾œ17„’í;úõˆ¬ Ç%b»s‘À§·K<õ~k 9B5Ñ.ÒŒè“vd 6³ ªQñP5^÷ÏàU-S™¸ø4Óx&ÕŸyG7(‚Èv7Jšú©â/ç7–0vÊœ2[EbÕà YÁÄ€²*Ø.]º¿—•Ø“p Rý¶sŽkÊ_æc‹y˜LÂw>àÑL„êÏ^k.W¡Ä{šñ§ea ¾ëºÜɶR#—rÿ>"|m I[ÎñóìàXÞ¥yÁOé’{ۻ͡ÓyȆ¬ž&«|é É`\þ‰ OZÂ…uÆ* †fÃ}׊”ÏTsÍé´ÃÎ¥·±¿PšCcÍI6ƒ”Z÷ÎlwMÑ×µdÑž0ë`Ûè­yQõbÆ„Äñ@Ø‘kOóšmfɈpÞæÚµ-Ó€9¾6'afÅ—¦Ü`ÖQüwÃaª¬ÜÂb‹¸Ý{®»^¥ÏrјÕ`ÅQGŸ¾æ§Úªu%?öÛ aÀM’ò ÷3LÿsÅl€ð9ùÈHý¶×´’øS‡ V;½ó7$—Œ‹¼´ÎÍ‹ñ|1s–†—&AW”[â&¡uSÃx—‹2Î1Ì\g¤ògO6fÉÂØaáAI"ñýæC¾º¢ rÝž …Œ¡hsð_?•Nd5¼¸ìÜ\à§ @î„r”0æÏG$¾•T¦» ¶!ÌöS9Ô F…ŸW::oÉ¡”À5øú:ŽÂ0[Pùý(矕q?zCc)qQîà %d—_–5Ôܾ®aô%\üi9¹„×è5$$«åÀPÉ~*›ØdEÍéj#¢r j;ýœh¸xÇðSy"pšˆ™|4ðIc'ñÔyd™[ƒ?+ÓêlPþ‚Qûgy~Æð»\l%hÐrJŒ^r•Q¼x ¤E wKd7"YHØÅ‡h C½bD®!"¶A)Gýì~eæjÑ.1ÖUÝ)Ý*DO1_ôÁž„ý<‘4¯ú­áŒà »æ{E‹€#“ÊÚQLÜÚ™”¹etaÀÛSÒGŸxz] ³XîʦO¿&:^Ì¢ë!HE¦"îDOiµ¶"}¿•[3)ÀÚ/}¸»ö©Í8nSd&ü ûË×Mï½zSÇ̱—˜Q-#+±Ñýȧ{2?¼{üìˆ$¦iHåÅ/™h5Ç…®PÞWÞšCì¸ÓŸI‰k`¾8Ñw=%³ã6sCK—µ^´Ž ]ЈXf2ñ4j€5tD…Œ{ù ¸Ûw¢ó¥mÏ#àñ}DH2§Î/;Z¹¥&&Ø8¯0³àL“²ÀEÌù£· aøì5ÏS*Í„`¯.“ϾÔo^ò³k3\ ¯ ˜/N ¶ßn4Ò2ÅHªãDdˆ:¼Ž•ÍשYÁLtHg(Êj¹ëZ…e¤qƒ—MßIŒåÃx—šo CâH­Ù# 9ÜRk ÷y5âF3e>À2†Ük” ±1£gÿ:6­Zn¨uø<Á‚-Í;;nåE—¹õye Ó1Še0FRª¨¿Æ”õg&#Eä)Œ‹"Õ~ÅF‚žF~×3åÇéZ\ŸÍ, 夋 ~Òüc®2çÁ9pu ‹ù 4_K4w&÷Ãꃣœ‘ÙJ„–#*<„ev–gqôê¥3yjŒI¦Q£KiX,"ïå"Üd>lmOcLÌf»(Ñ­cƒ€ß’K"Z4ÿTP@óž/ÁÉOR±-³8µÒø¿xi»!íf¼Ö³þ"¦{5U´ZXÕp6‹¯v’ÖöD^h+¦×–R›ȧ›­)f%W– :¬rý-’N&4!¶ 97ñÖת_w— ͤaÏè·:à5a\Ö>s‡Ó°¨E>®r9öBÖ9éóž Ÿ­ä³;äíhíDU3eÑèÔïÒÍ›«7ùñ¬’÷{‰™O»1øö¿E~Ò&Á?ÂÆ8wæ¯["á,î¶D©°ò½˜$ð·PT”Àð ¥$OÔ÷‹jG^°"ß–"Óšü”K熧“zü#?šâEê±ÌB¿Š…•,d39]Ä.~ô_ÿXÜrmú¬ö·€eqžPùÅe`v[•:€DºëR¡‚SWiÌT⮥¥”,ýuç¹ÓÉ1ê!ËW©!ö Ògébš·HTÕÒñùÙaÎ6€¦§LõniÏ/h y«f‚€J β‰þX7™ßèQ Wì³@ä‚#;͆X9=´ÄU¥ôç±U½Œ@ÓÙâ ÀI>>%|‡Cä·ÝÀÄ%lôKâ·~ŒéÓjÜÉ­ÌS…;N›iŠâª-÷vß„¦é{¡^C‘2é1Î)ÿ} œÙVw†éL¼+§Óš 4âCæ«à©JŠW²úšg=[`&7Ókß^šH&¶oK«Iƒ» äLhQˆ€%ÏöôîÍã^1¸þ$*Gg“ÑÞ Šª½©2‚AÝš©‡ÇèAí¿`amÞ°[%·ƒK)Û (jdaÈYsr·_ ÷ŸÓ›•ªÂ¿K®ñbÀK³UÀvý®˜ËÃu*êU»Q’_§qÉ@z¥XÅ(í+ʲ‚@®¶³ÐeÕ¡»B€mLÑ{ô­AÇ,–cÝKè¿§D±`Px £\¨ò Pª¾Ñ¨øb"¸‘4íFÜ£šP ê…¨Jµæˆ÷;¼ëÔës³{Ÿ¹9¢£óÿ4¾Æs•‰¨êM­oá<ºëŽ 1€—U±æðBj\Úï“Ívõ†O“”O¸Ÿñ³Ø+Ñ…j¸–vîk“©…öjR@º&n{\T Vü”3HÑ]r Þ¯3}3üMD4«ïíÙ•ò 7 ¹ ì”Ó)ÿ,Ž:r° >´a[HèH±5iG'%ù8)B®Í$;<à×ÿjTŽwú¿bfÅPHºÀó%;H'HÓÒ ¨L†‚M(†²Ê'àŠ(1¥JÂßÃUÙTCÕ®C©€›ÈNE¿F îܭÉv—Úà)›®û¡JçAé;æ™àSÞ©Ôšp}B&À·ÑÅéÌ€x6›p…–Šì±„Iºô¨5úøI[0õ‡ì8ÚñU2VšÎºW*²£Î{'qóyb§zÇ{gyxð{1ÒŠ\‚ÕÂÀÂ:§Ây'<g­Äþ=õ/f“zëá¸1EæðS|)G©ÉSÛy³§qÀåÚ­‚ü¼ÅŽr`}T«C¶·-”Pcçä¬'Ãû4á£ùô©æAµkŸ)N×Ôs¡[7(5kLS%…íl3ÊišnU'èa%}I<‘¤\eK@'TÇÞìK5o2SE›óauÛDG£»Uæ;ú‹Àúµ,Û𙃛ÊÊ©¸ì°bFkÆ'u¹‘¬a*CÛMM踤ËhÂ'«s„æ‚zfÙ.²7‚”û3x“P€€Çá±Ñøk][ß¶áÒT"«nà¥%p“nö›ClT˜&Aõâj}„Çw„EÊQÍÖ… ë8u‹Og;QrÐ`]†¨A¼}k“Ñ»;NÏ^ô„o—‘ªåHž]…Óò»ýü`Áª±F£ thºWƒÇe¯PË¡ ¾¤¸ôía7?Çö@ðT•feÎm.Éê7§ægz8^Õ\or!6‹ µöýœÚÇb65-v—KX\@Î& xs4šfŒòŸI< —¼ 1Æ4˜€Ã>µsa•Fn2—¿Î×’ S7[rÿs?[ý˜Œ†õ5»Râ5Øaû¿:J½…h‡Cfm+Ô¾¯í÷ÿs ç±]Ñ ”2/.Ç–HÜä­­^§•·’9–³Á9[ø)~óÑs%©YueºÆÿAC¨ƒ"tì†ÀÍ »[ØpáåÏB¶“$/âs< ínŠ‚‰€‹Šm·5"åú“O¹›ƒ²m¶Ûl|ß!¬ÙO%ÔkÇán¢”A}Žõžƒe¶ðqæ}0MC46²‰#§Äd—±ŸGÍd!vÍF¹pé#±×à è“2tŸPpù\¢ÇÇòØ]à„­8{ÁšÅàÛ˜éˆýývo{¡Ö’ý.B.-ÿªÙczUÛ}Í% ·÷Y+ `¤F渚ôcoäeŸN›Q,èwབྷPÈúÉÜ6Wl<ÏHÔ·%ååÃìMçMP£. —ôömø^XQd²ñ¿ž7üi×rãë.°BØéÀ}>+†$ýîvnðF+©Â鯺·\„Ç{å/ÅSfÿ°yÔÅ¿a6Áx÷4`EæÊönr}Ÿ¦Ui™so+¯*×8UVæ—ä•;š(^cçDJ§ÐŽ]ÊÕ‰»ôâÖâäXý'/t—XšüÁYä]%*Á•:"J‘rHZùãµ»†Árfè¶h`šxDÌö;>ZDu;vIàêžûÓ¢¢¨üŒyy¹þ.Ø 6ò{QTA8îB­Üa;Ë?!’W@ðw¶í h÷Ù,ïëO×w3-ÝböÌUdù^ŒàÅþ‚ÃÛʼn'†FÛÖ^Ô×ÿ?«ãý#Ñ'^2ñ»d$¸_;nð·ý+¥döÕÝ$À‹\ð5xu0>c?gk1×Q(߸°õ²$€Y¯£r ÷÷¡‰î?Œô{½£ð5•>4G=‰ùŠ»b³VÛu8ÃÝ$ø1+±XúãPDºcU§„bLFÛ«ØZ½Ö§Û#xÚŽJèP!â?G¹3é”Ï U´¡’’dguÏD˹¤1²«Ý—~"·‘d¥Š^ÿGìÉ+z DnøºÜg g”OI…ÈúD„±§Óò!djoœ¢ØMüèÇ?¥NVþ6Krm¼Në”í ¨t4ÝJFD °>†ë’i:A9‰¥XÂk¶¾í-A)ż•ì÷å÷IÎä;º÷¦"½ñ°Â¥æ‡2[Ä1u¦ =@ú}¾m¹Hŧ†øÿtun]‡ épÛm ›e.¼ËVŸš#¾´Ts/Œf¹Ÿvmšf;@ôt ÎÖÛóæ’QtnÐG%ýy^Úo5ÒZzM€ñêrwsb”2›æÆÊÎÇò­²·7oµ ð j&n¯ü#!q«[B@öQ9ÕFŽßšd” Y’ˆ Iùh.dM¾ç 9Um~Ó‡×ôT$-Ânus‹Ù%~—)o³›ùȼ²•‰÷‚$Á?\'‰?ÑÉé‚×lÝV¥¾›Ý‡¾Ðs2Õ=— bÊuŸ¬‘ÎV7k ½IX£frG¦·«I^Ø9¦)Ô1÷å.1 b÷¸îƒYûnœÈK\tˆxƒq%O#iȹ&U)§½Ç.üÌÐŒ®hK œ£8‰!IL íÀµ£ð ~¼È#€êr쉽­¾½¾8øpK¡ÍÖa‡Zº/*èZJ·xúÍÙËmvK–Cm~–ÇuvdæÚ™E ™™^/úÁýÀÖɯ–Úß·N¤kô§‘M„²7çý”ÃZÒéÂA$Έ;Òvn#©ÅKçA'P­YKšx<rجÖ!”í4HÞ0»"óG‡÷>Å%s^íùû„ÂèX•Ë;“¾Ï»gµø!bbœÎÐ^ô Â@4†¿®šÊG×Ûˆ+ Á)¢@§?iJIq ‡Õ«:RE„V%+KgyÒôÇX5„Úɱ‹Ð>°JTýNeÖŠ ëèëOZ]Ó….Y^À‡¼€GkAá(cpw&L‡Yè·±£ó‘Aþ^>ŒñØA¸Þðög»Óù¬i©è•ò.Þ¢ÕeR9̆o‡ÉLÓßjË)âp¶*×)@yÒ‚jÑA4´áÁ³ãkÝÂÏ:m/Æ¡ÖΪM—uÌÇÜç\JMd], †ˆ,¡‰l½=¸½iíakÛ He'¨$ö³7 g¢¬êXûQ¦åzñuIl0—ž+¹‡ãÿAçVrÕÊÏl^áèNÀÌŸ}IºúU'ãÔx÷N›-QLY„hhurm Ò]ÔÌ …žEBªb’)ƒ5 lV6œÓ+í’M† d¬š{϶þ7ko;Œ#Ë»Nž;íäyñ_3H+/D¹{K`jiæ`1Û££WÔ†17bpq¸tmÍÏö狽ܬõ} “[£ý~oÑeê¯ÀÝ¥‡4.²45<“„—ˆ ô}¥\vY-5žþ :MØã@©E>ô{5•óST™µÍ9³–{˜'Œký¼TåÎã\gÒ0[¡âa‡y‹8ºY‚¿¥F*àk É8±T ¸ –Ñœ:«Ï¹Y§/pPÏjàÜn19™¯-y2PÄ7JPÖ<Âqê¢óéBï\Ï5£ ë&K#·oèHîé ZJб6[®%…û‹Âš–ð Ý…G‘l[íÎ\]>*J"E†ëa0c½¨ ]-1\ ä=î^ˆòܶ²Îb#O0¤!q¡º¶¥#–íI&96-ERo*:»ÝƒAÝÚ¼!¯f[µ„ ¥5%Åk¥Ž1ˆ6ôœøyTi<Ù’Ôã• 0¸3ÏRÿ}ɦ’~8çIî%'ï,:Wc®Q™»2ÏhÔ«tþL次ª¶o‘<ž0' u¯’ è’ª¥Ø×%4 ¹t¥qÄPö¹Ÿ>~Ú1W¡Á‰×û,¿Æ£TË/Bk#Ã[4ÿ=¬VŒMÊÁKί$®Íû‘…°f*œ‡óKŽeNöªhD³h•²à6²&±ÜÛ´ï·3.ï¾›¡{h±JP4HŽP×XúúMHÌtOAÔÀ5­‚#Y|PPä—%Ó”ÖbÍAYê¨QeûŠH2CÊ5’í¢·ñ{¥I×j˜±"b¸æ`ýººÃ\!rÍ&Wod×óœ#Äs9=Eó4çØ ZK³4õTxúÿtoògÅdˆ¢9WMßtçtßoѤšÛn‘KЦ÷Ò„à–RvâBS‚A XEÁ`ê@ÖÊ1-‘9¿ïΛ¦$»:=§¨ÊˆA^úÏ:>LpÖ1»×ÂöˆøH,Û!]îÚÅ I“˜š?ÿ:µN.ê–»§§V›È Ï,‹¹>êØ‹‡«š|éWugèû3á)9 ܱ;u¿`J™Kø×ˆ*?R‘’åº*öâ±Ê43ÞŒ´TÙ«].{bè± I lÅX Â@”Å- }’:<0þ€E;¢^½¶§eoDÝ#f½~(,_X¢8 —^ßɯ÷³™yãìŸß„l põ¦^V…é6%Wš:’à Š/‘u>ë¼Av`²Ÿ ´ZC}ïÈ5ƒ„¢o#)ÂÕ³d•„›&nrõÚï Øû]ŒÜ!!ÙT—ÏWsâ×òt ßÈÊQKSª®ø¸3™ûüÇÑSˆ †ÞXÅè‚Í©[¯§øì9ð7üö%€Ò‰Ì'±`D•¦Ð+HfZo±£Æå4¸Qµ+\áN0Eø£\þL÷‹1©™r–aT7u %«Sg°sœÕ§š[ªQ‹vAe)ž9¤‚æ¶»]‘Ú+DËj‚êrÕ‹Ð-7{ØðÃ8dn%¯¹·ë°I¬ù¯é×ýfÇ-!V$–wÇJ–_O#h˜Ê'Ó¡˜€ —ÒOé(Lûnm‡_I«Jog#ÚÄpÕó•„7ž/ ˆ“ãúaÛøÞÿbmÁ?êð|¦õ¸YaJ–ÌÖüñ±P‹j0Œcœ›ê½&±Ùˆ®Î[l™Š“‘+ﯺtÜàs !+ ÕeJ'Œåhøùs4ó'ªä²eõ0³ÏÞâLviš—݃…thÛ…÷)Ÿž¬†/þ“È UP¸<¤HqÚ +E¸Ö§ÈòÑQ;ò;`ßÄ mrž¨YñAÏïËãÔðQ¯«°ò9$(Z„fwüšL÷Û¥‰×µÕTŠŸ… `ê«7Ê®H«’¢³±‰0¼ã``>ÜÏkýn¸¶SÒþQÿEù¸x²·÷ ==4 br*TFZ]NÓ ˜ãV/›²ˆ°¹þU¹@ï ÞL5ÜwϬ‡ø$TL~0fàÚˆ̦Mý‹Ò¢lË”#y>ΠéÎÔŒ?¾[¥à¬è ¤eÆá_‚Þ*䕛øÏè/ç8gZ;Z\Ð&4ÀI± xô)È•(€þNñÏ™é]{{´v=’=Ûaqˆ±õæ§³-bWs…=Ñ%ëˆ Ž v†1,ßQ‹ " Ž·%ô¶ïóp ¨AÅð-@®½¶\*.³0ÛY/}ù#€tO?ØFx~±xǧ§¿w.*[¡.ú)E.9Ê?ûš.T©£sü«¢Ò´:í§ÂñÙg£—@¤iôÃÒ0t…ycÛ´3ÌAí›n#0Ê›k¾„¢îm/G-ÚÒø5ç=ë¿ÜZ¤¶ï:zYõwc¿þ¶?îŒZlbü•U Ñi ¨oùFÕìÜPßÑò“ 6A´i‡ó\nWHVUÖŠzuaÐë„Tbtú 0–oêQúëâçŒAƒãÁMÆìÌ5øSÿR6bobÀ½>g·35<—I1§Ä-†YzNv?½µjˆÑÈ“LcgñwfûjçYþ»…rÉÓ´ÒÞªýê+ )„«Ju??N—Îú™„Ã:ÊŠÐòbØÂi)S'Þ0…ÑQˆàΘJ¦6°€ žBQ&ð ¼eo6Ì9 §?%?›Z“µ?ݪSÂ8\uEÂIÿjÚçô"|‹É€Á_GÃ/Àó =(¢5h|·a%ð`›×[”ªVÚ¤‘]ÜBW/ñ[ä-29·=ïp4åù9QÓæ 3Méº{QµèJ÷]Å÷i0ã×KÃg¯Ï·žÕ—'™\mþ§„{M¢gðÝj™Ç"WZ··pä:0g5y†¶\Œ[wÆ“‰VÙ7NW÷±A~•;Tˆ¯ŸëM-R20‚€#‚•,ûïzÕù,«20Ž‘½l\íK khï•>Pš:!ì Ðú\‰«ø7g¹(œðªZH*!@»ÃÚ‚NÜiÓcLýu’¸Ûì‘¥“æ[Ø îh3ÀêÁåÕ±>a¤m\!òèsÛj,¼ÅSOð?Üè:Èe³ˆµ@xŸéoÜ2K¹Û,ß#À?Ÿ¥rÿ 3ÙÐJý‚Åp1Üà/A¯E•I2j³¼èCúo–½±÷x‹Fµ3Ù»Qåó6–Çí]Þû»Œ#üfœ¸<{E¥ê"™óÙ>2TB“Ùm9úW†åÓæ'ýÞ¥0(˜£‰ÎCºè\Ó‘ñ!â`ÍâU“ŽË=Ð9û1¢¥âÊœq_©¢† Jn¹a¤`ócw4oPÁäc½Lq«8¸`.À2Sð”ržoõ‰T2dO1õõ¹G;ódönâ6­N„õ‡ C0×ZgÃu$‹9OB“ué2šœ0ôïŠjý°j‘µŒ›ÅŠxFÔ?”Z—yTw d¼p ù´ÃkÖÏ4ÌÏ–ÝA¢’ L«'æŠÿ}w0©U(¬'€ñÅÛúBƒtxt¡ ^q¼Ÿ¾åテgL­UÄ;]¡€¯ºÄ–€²ß3çì{)ÿ[ö¯=‹’´ç^Ô“Ý$vfî™Û½hY^ö•Ù4Q{ôÚ󆉮 mþ€ãLG™}Ú4”‰ýƘÚv¹Ë³Ì˜¬Å–[£‚DLoz^G»‰í Ûvx„凞5 Ñ54¬ØÏ<ì@$Gg¼`¯ëpEù±ž€Ó±G ô’ÖÈáµµyž9A åNMùɺúü¢ªÜµ+B™‹ëQÅ­´‡ì(òà)WÐ_SÁ~vÒŠƒ÷¾iÉ fVËל“ÐTH8ê™Ó‚a@š Û#áKqf@Ç)~ßO€#!F}ýz9g‡Ö“ždBݧ^ûŸ›:†K̳CÎâÒ-ù}çhÊ27„&Î=,A¿Ž\ìI5žÔÃdѲNØ>¸ÄèúéÒ1óÜzïsõ¥ötÀ¤Fª;‘üÿRµEÎA'KSB¥ó}&ü[ˆ}•eáÍra}½‡Ùž—MÛ)9±cµš‰ðtá,<àÿ@¿‡Ï¬<è] ÜÛÈS¨ð0ÌÑ× ówŒ2¢ñ^ ˆìNGýÛ?ò½Ý¿ÅÁA3&4Çf¿Õ5D]Ùœû@ü±%‘>ò„é©“(®.]þ"a]ƒH1bkHgKò?.µ°Ã‹$tȨi©Gnä­Îëù×_!Ý›¼!‹õÁùk.ä„tÁrSàC±†`Þ5è9AuT—a;²(– 6O+•”×Ç(©ã”]TªÞjéü,­9]ùj ùŸOÖ1ñ¿—d?7ó9œí;bŽh%å÷C@¤nÉg˜\L3ÄJ^v©â¯Q]¦î¤[Õ…K¤˜é5c‚KŸIÖç@Ä+¥Èêû« ×ÈI‰aM€¿ˆ„æÉnLÊ=O¤²óD³P)”‰vÍ!¾$Òíôés½›Ì|éÝÿ}¨dùzF}5@¯>ATžŒ#ÿýþÐöÈrds™šÓ¨[LA¿#¬CìùÍMßAáe:ÑÝËäà:Ó² n‰ŸŽòS´lÏ$;[ôM·:h|€§â S`-ò¥?Äv>Ö‘?6ÍNuM›uáëÔgFüww¯v,nEw\0;E+@0D™ÍÀ5£À¥"€¸<Á?Ï;å™RC#ù+i‡Ç´ÏB•¥‡hí!?C&PkîCê=X§iúÝà¼ýÒÌ…hÛÌ!Ä_‹z8—˜R<Ñ¿Ïõåjq–]šj5™õ/Îw¢˜“Ïoä%o´7[FViÊvGQ„«êôÚ¬„[#ŸÍ¸jhՂο¶ðݕ۫s¨»òäá)e1ÁÜs°"T,lS;nêŽí"&’ 9ØžÎfÔyòH“†.&骣b:% µV Ø÷’>Ê, W–ìdàâŠ>+M¿dZȶýuŒÁ½‘µqO.äã4ìƒÉuƉ, E@o>@Ô£ùÙRû§ç\òô1J·P ú`ÔðaÑÈvÏY/grÆW5òàó¬°ŠBÞEÜ÷—è±)‰õD1­Mí‚UœëŒ3%AjŠàxÚÞ>Ò_dÒÉðË—V+8gÎN芥’´ß(.àoŒs/BoâbdW.ú}vØXZÆ©§ %¬@Ysçhr˜F¡Ua:]ñ{÷Ø–MÂ1:°Îµâ”¯]1Ôf»Î8êÐÈ$ÀáÈ&6Š€Eìu~O‚Ö“¯A)öœ³47_xnÖÅîín›ÈŽlµ[Õ$DzÛÝçT1ŸÔ.)8¡œÉ…/¶]ê…Ð2Îf æH¯;yÏ/NÿWÝÇ7XÛlXErï7¥ä㕲nz$æiºJ²ÖºÑðÌŠ\4] ÇxGBàH¼$ /ÊDz^Þ¦ÂÁ³CsÅ,æÂw×£k­áT}ðwaš ‰~ƒå…vQ½ªÆ ’ÌŽ¥o¢ÑÈ–V†pözPB(ÕA?Ã;”"Iúmñô+²È…R“…¼Ì­+I>Y`¯-þ |ýlb@7¨†ii·pfÐð@ðXñMã´;²ýöä~·÷£}¥¢mÜ©4#§ü0$F¢ÈI €4ËqœËÚí].ý‰ìî;X[¿<‰ë°•QX«Á«¦1Ó(£kÄT¨3‰ ­¹qr÷´b [øÑ®w-¹¾нŸÈ¬)Ä,p¦"]ˆH6@¦ÄåÑ¢Ö::Y±ÝwÝ.f¦ÃšŽOh\4{t× frxì1zT³-4 ɲ¾ÅýŒ?‚´ë³BXFÇ ÒA'¥b¦?ýJª,<‹Só§–/yÑê ®!!]}^§2ÎÇ}¢âÓ¼-°ëÒýj³\aÅÙ5uœA½l£Ö(0gÄÖãÈÎx3à(ØF"»D÷n"B£þž¥áØHSP·ë·NPØ>ÀXŒ”\~ × êíj¯ —ìtXE… ,¢n¨‚ÕKµá˜¦h¨Ø÷)s#³oïýQtB³Ï:"N¯KËå½BãB6ßXK´›aK¹í×˼¸'/¡P(%hAªN‚L ÐhrÓ-ò˜-ñiÍ?EÖAñù£ÇlRs, ·®uGÙ_ç­o‹B¬ ËLÕŸ„gË—é³Ô\«iš) ñå·Ø¾˜9|Õ‹o%PïÍÕ[ÿ.æ°¤‘‘ä§©nPÂ.îN.Ìy8µ"9OÀq>kXv¯œ˜dûp/}†aKJóꎜ  üÏ´±¥¸s-  ¢iÔ ÃFýÚº1c0T!™÷uô©àÅä® 8@ùæ?Ð{h¦¹E{ðîÉù)àèJúh3>'(ÿa”Ûl¹ˆáO¢É4^e ‡‚qÈG^KÂy'8ú|µz^ÕY΃Ûà‚ò(Ž:‹áÔãÕ¨Æ3\Wà‹óë9[¥-QÍ K|(µ^äe&0k‚Æ!ÉË3.¾—ö ª²Ñ=%vP^DuŠÅ3˜ÏÖÙG*]‚$ºéBWX¬*uÌÏ™&ƒô>!é÷HíÈꮲ¸ÓÏEˆ‰º^nR¦¿ïW&7” *NºsÚ¾úž.ºX¨¸•·%÷Ê• «¿G˜M•ýÓp —Z± ¶ žüfLÝÞ”†é’\²3dtµdd”÷¯³.€G¿&8I®eþTr”Ÿ´S·L&Nàû!£òLC\j€d5Ç©ãß÷ÓNõ/Û ŸóTkŠcn=Ý‹¶l1Ј3WÐM?Z1ìÊË!‚l·Û½68|bwÒâéÝ…ÏÎãl7˜èÃoÈs–ŽtuÄ¢þé“v¤Ïl5"—±¨¼@ùoSýüøgÙ¯{nš~“*¹úMÇ0V¯kæOt)Éc›2æ‹æ=pž€œü*úšoC,”!Áïk"bã ]w4«´˜)£îÜÿ -— ¢rSÇ)V™-’¾ #Àx"á†_"o]¹¬³™ÒYïOWé”u› ´²ž…’çoØ å0jÐb/«ýw4ºHdñL³„•-®ú¡F˳ßÔ^ŠêW¯^(5‘ÚYz+š ë»Ê–J$˜­òtù°]ÁÀ:–‰;#•¼`y4÷áÞgû;L,Z0ÒP‰¤/Nºll‡pŠF_½—dâíÌ(Šp>Kv+q³eùùêJ5,ûžaéʉð1šËC#GôZMó¹ ^ZC>ÓMu±'R—BJVÎ4/§£ÒAtçæAKCjŒ¹hֆ܊‰>gæ7ÝZ½&£×dªÁ×ëôÚ\ß!òH8JÎÏÝ)‹ƒ$Ð0c±"àþœ„ˆ˜Y¬¯}ªÛî9à“× ÿ=”éöÔGÙ¤ÍNžU4Ï¢³·ß&âjfªÊE«ˆ?€ài(-‚f9üÔ@JÁŠæ:Þj}iYjoÝ)šmº,¢Çÿq†ÎQ¹ŠlŽÕΔÅQBÐXÁÿ%Ú¦ô ,â…Êg°”Äï·h”(D±¬šc-;g@ÐÙWƒz Žõ“•îÝ2uº¤´ñv€TÔTÞ¨S"Ãýtj.%CÔöÖ¤rµ’#&JÝXˆ3è#v2 m–ÿ‹ùmõ¢RÈ ¿cr܆kÇ1_òžFæ 5îèUwH¾Ûb6r~ ËÀFd«–*Ò{o‹&›.JÏBMÀKE:Ô÷RäWC¡®Ù’ƒ ªº$hiŽ^ÉFr(«[Úmqâ©Iø‘Ã(õ€.;H‰Q„()Á¤Šœºï‡æüS?,DËyu8s—¿Îr{åoj"3ïþôÌ“ý'xDgéIô}B—à)¯Šô²¦U¯iùÚÔ…£Rмœž§êú×ý%ÎAA¶½ÚÎe2ŽHžRËAÓaçKmy:6\é$õP÷^ÆÀpÆ›·^ÒwÕ¶“Rõß|ªNB5)tHU×§I»P]¬$¨íŠ×&He Q}‘ÌÊïŽèwF‚á‡SÊ8«5yË#ù ,ªÚ¼GÛ´ÚDˆv¦Ô–’ë'iþçKÎù ˆãΊ¢z§dö<É÷ÁfÓÛ5_65Ö«­– ÖqÂ>ÂìáüíÉ«‡¹Ñe×f­&mcS5‡}Æ8P‘û(ôÆ”5ªX&+× *e¤÷<˜åîÍõʼn›ÐFêçC}õž–Ro1û$Á®]ôÎ4Þ™íVs0átu¥È mò=ß%0YÇ`ÃÐPÂ#\½sõêZ¤j­×RŠÛv®*-w‹FªëŽÞÎ\œ-ˆ[±v˜3¼Šeyõµö1<áß±¬!m´îY: LôÎ@O·ZxâÎÁÑùÄ÷¤ñä’ý=Їœ$k® zˆÆcCžþá#¤B|¯£'›ÛÐD´2Ã1ï(ÜØJDü‘ÞN½DIðNWÿNªÈ²ÑàÈą̀¼¡S¨˜‰ ¨Í_îÎd‡©F«'—Xz¦àŽ£êÎBÓŒ­°SJK'CLîßµkV¯Ža›v¦­Oðþ¦Á >­oœ—µ²žÿfÔ+5AËèè C®m«ÒâêÆtûçÝIHÝGe–åçÆYv–¶•u4V­r|Ip㺯§©–¬^6« Êß‹,œF[¹ƒT•¦!>­Ãõk`X;š?(@õF}ã~ÝÒ²Q®z ã]€ÀƒL|—јʒ Oµð|áÖ˜ïS,vù¿xó›eQƒ°îâd÷*HjGÓÛ ØfA/ŒPL1ïöõ©$óx‹zÃ…¢R=´Î’׈2e~pÃ7Œ„o€fBÇø^L‡üÚ$ЭÍÃË(ì ußG[6@mg­¨¼-«y³¦}L˜UsR¸ßE.a)IãoGhÙ‘]åÕ’ƒvvׇJmnÛé+˜(œ6`õï—¼»2¤Eƒ“mîf«D@YŒyÇñt ‹{À{‚¶$ašÒsn‹K¦*Ay0ÀÐotA«‡AèÙRüFëŠ6¤ƒZýŒ} ­‡x‚IH—¼È*2¨[?ž¨@Ofw§[}$=‰jœ57ÂóMÔfPÖéÂûûywøÐÐÎ7ÿ#d°Æ–oEö@À¼©leXeÊfæ´ºÿ€3w“ ú)0ià‘‡²Jéînõ{± ¦NZ/8ÄC}YîÍ”ú–à ¤rU¨°>­ÔòÒë=¼ æ±\Ÿ˜dŽÜªb´®æ×¶—©2³#.:íñY†% ØÛsArÅÁ:±oPEž¥h=²GQp?ÂaƒÚ*Å2og¢$š»øê·± O /kp‘‘jç‚z/½–J`%$†ïXÈ'Yß’è gÖß°ï ÏB¨œT.Y&*ýòË 5£|ðÒƒ8+>£å¯î2K_oh™2ÎË—HùrD7£s“§ºÙäÇõ‡ºSS³cd½!à•’Eç¤Ó¸°¤{}/mKµZ‘ч2nmñ¢Îy¹ŠÐ‡Ž 4ÁIáU­ã>gÞЋÎÚþ丹š‰óí„9_ðý³¦ þŸºÊµ;ðå2%›[Áv§¼Q7ìs«„*6kÀZÆQ…,fàpÔ„£%vgX¸œ_›ÙEmé»’ßö5C0 5a’Ž­ˆÙ‹N™NdfšjÜ& ¯dü(63;“ŒRýmXHÃÜ}¦»Œ`eSh-1ƒ.K¾æ‹s–|¯VKáý-TYtf9ö„Ù¶O¡pKð3ÃÜO-ç “‰ƒ«T|¿CºÇ‹ˆ( ’—â)e±]¬p¡óV=”’^o93s:½õ]Ì"9°×Õ·¡—!Õ%Èn´W¥Mcq‰ä„m3ìØ,?<”œ cܳäâ3È®“#o¤³àˇ€ ûÖeÐÐ$D¬w3E'¥ËÊ™ûs{ýÛ÷ÀZ#ìÑá3( ôšˆñZ!_öZg\?î¨$<¬¸H?loîq–5›Ú‹Eµí:Á 2®å7‹‚îÌw¤E/‚’ž £"xÜ6rJº¨/T)9£*Í!ŸKñð9ÈîãÁiª9¦Ýìߨžù ¸“%žUAvêP¯le>v#V¤MÂT-bžè›|ÃŒèÅ£{£F@~³soeßïóYš}ÄÖ¹}•óÅœ.BIÂNXeÃÏCSe T± ôáÛÁM¥¾ßþg&÷ëƒß Æ’̱ Åÿß7/bH¿?wäæõH“‘z(+Z{0 a*Ï΂ëùèJª< tB®h0MtÓq(¹Ïa˜þnŠ ZHSÔN÷.[ Z-M#cvÿ*Á¬C´qÙ^?;“¤‘ðéæÖû+'+Ÿ/þªD/ˆ²vŠÓ°&¹¥ãÀ8««aͯSEf Y¡+¥k[X° ó•Lצðæ©é5œ—j¾Y£—rHØ»Sù˜×´~~è‹Û*xÚÅ?Æ…¸[ÝáÞë¸ë-Y6áUÞ°Dr=gož+NŽÀTÙOÖªïô7Of‘ûó¾vñø¹Ú|è«E¦ÐI $‡F\{Xé7o|¨ ÏÆ7E·ˆ2o(N¢u漬öóP¹¼÷ˆ$/°« ¼Ò7 .¸ðÉÄ2“›šbÌNô¦÷×.ó 1$ì8™Þcç«ZìÜÊ£|áͲÔPRyü {q7£¾ à?ÿ5e5°ô-]}¹ö”£keGcª/Xq\.ÂÄJ+iƒ ¤HJ#]yý‹5tø8Ôqc¤k÷k-Á\-©Q !Žö;|ºßd Wx~G¾(ÉÑMÁZ~ux‰è-o™´ã+aØ´È€0Æ´Y@{Òíº³4Î<óý/û2=Ï+»šìºÄ“Äü¥;Hoû3 ‘"›Éê{_»ûIþŸ3NwÐb¶éGª[IϦ¼ÈB)e¡‡ô'Ôjh[æq&š1k¦&ñHÜ­ç­0.q$3ã‡fHøC ȆҦœ‡}Ò&]p?ö±šd“95ÌÑÛ7½Î¼ÅòBý÷Q–æ^Næ5ÜRI:‚ywé] —•¦H¤Õ¬Eûeb€€âûQï¶ê¾Ôá¥øþ ÂϾÔïá¥ØŸQöØÓê)þøuqÒÿ%Îg —:ß9YàñNt$æ³/p첄„Ÿ×N Lü@$½¨ø›BmB ºÈy3Ô¢&7SSp@Ð7#éññâ $LÌyð,Â7ÿw€3ÀÓi|ØoþtwU€´í®kÜ+õ¿ˆ‚èöñ]u“â5ízLoÁ :ûú]WÌ’§ŒÃŸ ü;?9l éÌ ¡òK@)åÄüŒ;n„˜&¥T±ÒqüOa³î£,¿¯âüë#«Öµ 3 ¸‘ËÖ¼\Œ°1Gs+X,Ì@éªöå3L¬=žzt–ÓÄ9Vµ/e.3å$m H«jµ–y°úê•}_ï£/ã ¸¨TGa~„ AŸ‹š,T@­ºÕŤˑtÜaÈñ"ö€W¶ªæ¨ut*µ·ü¯wRÂ@¡ˆä&Þ)¼âP $! ÜÏFìÖ´nS<ÛõšOZM÷qä²®¡?µƒœ êv$ B00 SX#3v£yï£ùË¥fÓ/›Ð±Š ± ûp,¦àÎ.Ø}]q(R2§¶ÇÒÄ@Êó8Ää*Ǧ"€Ûä\Œ˜ ýJx8ñL4 [sB»ë%Ö¥–:ü³×r`Ÿ¢®Çî|3ÕÄ»¦3“í«rLy±ÌgNÄ÷Gl9øÅÃÀÀ'ÈÅìÓ4‰8Á}ç{aõD°iö±<—Ö̰~=´ÀJ5U¨ÚÁMÆo%vŽÄø`k×}i[¯ÄT]5ýÿJ²ŸÉpÔB±7G@B@%ƒÚ>X:ÁÐ/rÁgn¬¨rñïT{TY´I3Á>òæí)`”ëto¹%F)ëoT*~Á³#[©K(¥›@¢Œ‹¨ˆe¬¹ËJˆ±ÌáÞ•Ær:@ökÚòÒ‰?&n€ÂABU“þ˜¦ÝSæÐGÌ^møX‰ dx ¤¯)Ce A³£Qqý7ûìEªÉ@êûnðõþ £‡­&í¶§2uŸ&¶›ú,[ ›Ëw°e ZŽ‡Ã°ìY<2úU>z¸ ð›(Ye–‚£õœ°òE2F×±þë]šå|y[ì÷bµ0>;-€ug1·ý R¤(…Ö¬J)ƶ‚)LÁØ{7RÇC÷9ØýÓÛÌ׌k|žòÃäœáÜGùSæ/l"äw>ç:H°" t~eàþÛŽ RH2§º¢£^¶Ä{5TÕ<8U3‡Ð.õ"ª€¯‘/Ö‘õ®§[rĆå’ܪ‘ˆÊmd|ì…•¡…û:‹þÍdkq“¼š²–ô:™jbÃîø”FfÃÁfLú™T šá†C¦ò>ßÁâ]cçHÖBÓ9ÇTÐã…QE_ªrW‘”üôëKL´h 1d\ÿ TmË3¾Jz<úãWu–‹¢¤ã“Gôº‘ÛŒ- Dî/HÚ]-¬<~ÄßÔ$pJ¨Ø › 2îÜ-¦h½HÙ\;Î6>«zÖú­ŽÓAPx«Þ»G¸ Í‘›‡ñdl*<ä‡XïÛ€Ö@½_„vU,¸N5F:èâVË4s-ŽL¹òVÒýw»O¸çlŸN`2xÚ“V<ÜQ–jK晲™Û­‚7á/k„Ç%ÎgŽfÚ4‘_#íUgIô× ¡*þQ=^ô6X剿Ó…„Šþñ÷>Æ›0Yéûûë÷þ1‡zUÑrÓ"­¸ö§÷MÔUÿúB¨J=!ïpådw~éÒNÕ=Xy-WÈÿ(2$ K0 42ÓêVtšõ´Ð Ô]–«zo‰ê)0/ìA{^û( Àyvooâ1Ÿoš6~÷ÃÀ*¹8 ÇD*ÊI*­D «ˆR€”èŒn8MPœü¥Q• þàj[+€ŒÆ ÊõÆåÁLðÛ¸í"ýrD{¦ç¬¡Âgž£ØÍè‡X¹YIœmŽ9 Î×!‚0ÑÈ] Ô‚€ÇÄòý¯WÕ¶ºúºÏ¾§ÛK_V¢ßVÂþÝdï¶ÈŸWRßðïOøu5ügÕªwÛèýü:ËåûX?nîïÛÖ¿í§¯©¦ú¶>ú·†úµ _U/}]NwÛß÷ðéûöªþÝbþš·ÛÖ¿ õþ­Mÿ7¨¯ÛE_=+õ^Õ«¿·B5óÜVìÿ[Ý'íéõ~«ƒöú ~ÞžÀŸk`6øµÕ9ÎÑ<çú»¬)IHEtØUõ 4ŽwùŸM¢ð:¿t ák30àÊ'\ z÷ûŒ)=³tÝ}–7f<6h{µ©2æ{çÑèÏÛéñB T·×a±~¨±)ùh¤¼qø3B2F¨£Å¢Mƒ³eW`ç–p(ÄM%ò&[}yÁm¾TX-8$A}i Bè…;‹¶õË¢ìȈÎÀ{XöÃ1D‹×ÂH.uºFf'?–¤B*wâ^H õU×…)¯Z…¨ÇÏì@NeмüJB-s Ëx‘d{ÞÂÓh›4+½ßW0j !‹å@$\qŒ™fò-ÔÇ©]X×;n/ÆFYÂRæÙ"¾dB³)rçý;Õ=¹kŒ!¤W©B#B÷žâÌàjÍþíϯƒ.‹ ФŸÉ˜òª†ül¥Ð¯yäx(®Óy®A=øÓâ7Åßžå¤Öºëv4GÀ¿º´³d”†·7 óËòºZbâO]àäA‡1 ˆ¢FèD“†B×ÐÜóü·LÎo˺nÌM#¨°Í#C•Ç!ÜDmLÕDÈ%~šþ‡à(ª<ÎøÑ|ÙAÁ5xÕ"üÆÛëCÃ<›upV8Œ—V«¿/'$ÄhCˆ^GËý?­Pc°à _jîøÄl÷KJæFoûŸÄ8×åÅ©‚½ŸÀ¹Þ‹b†!Œ@f\tgìq‚ö;–˜½ž«4ól³àAM7ŸÍ ¾@Ô-ù¡Uî’YÅ3ztKhWcÈ,±¾äè0 .·0T>õdç]ÁÝi±.>ÄÖì,ï÷‡_%?¥y½ÛT†–ë'”€ Œç¦×ÝšÕœ¢²‘·Öûbº·†6å‰ù¢ï\^YÞµ0Ìh-4qVíWèºn÷d7ÃýwF?~Ë>+%Û,. 9·çõÛñÑF,\óF†ýŽK8WY£9]œcQ- ¶FcLo¦Ä›ÙÓ!†A<¾ÛpЧ*'1a=Ž à¹ nZQ¬[t ЏâÀܹT‚GRŠ‹5¸Þ(¿ âYüÙ+‹~Ù³ÝÒ$—#>»m´/Ž}è 6¤U¿™<žÿ='õ «Uk^YpE¼ñ/Ü"^Ziówt$åO½x~¨ñ$£‡ÜžpK…n¼ëÕ@iÀaϯ#¯|¹†>:ï¥ù½øt~ǰƒG•¯ý#ˆñ`zŸ%éD,’óÁ_¹š™çù&ö[E9d•O‡À² ’íC’ÝnØ©!ïbC”BJèz÷ m “¯Ž:™h L1ÿp«33÷ۋӧ湚A&Ö—Çs±(M:†ïþþ¤ãϺgŒŽãtîŠL:”M]6Î…¡Ï«AóÜ’/`##£A¨´ƒC`q£œ~…é$;¤íc¤“#vSýíqA:ÚsíªM³ŒœU€iµcØóöR¦ Ê!zI8ð+ HÞqõrI‘RF¡Ic ðD¡y´|+鯮ٜ5þ­ ¦¸sßb¿¿Þ; . á—çZt{£îL”…ày»1…0ù8!KÃ׫ømÎÖQKKþF—Ä™Â"„ѬcåpeÌm“ÀÛ(\õ‡?¦Ll.úíc¡ù &I&iâ~>žþãŸTå‘ïö^õ{ü\ó/Ü ¶ÿ\À„Xµ¦Ð ¡o1ëb¿SP„OÑ[*ød v:–} q'ü3Öüd~¹oÀ..g$¯Ô‹Lš¾æDSú‘|Vƒg%V|\ð´Ì<-1Ì&½D¥×èñ «bS\ÒÂVK„'4iʯÆtm!-+"eŸ#é8nžqq¥nr4ôån&’©±Oÿ|ô©-= jå½v*Á_´aTÀgßb +P¼y‹P»%ÇÄÚa n'pX˜¾ŸîªY "¦ÑûœÒkpå úüïpTT–§Y™g8ø°áŒÞ_2‡~4CX]¦’E¼VÏ ~PˆO” ú­>v¢ùýŒÕ y{ˆûNÝñJ5?cm½ ýˆׯ¿‡Rq«ݧŽsº¿ü þåaħ|0V9iÉ ¹MÍ›ÝásqËU}Xñ”椟騘äÖuåGX\ÇE!¢.”N°Ü,&lD¼˜$næLœ´^Œ3¦ª¢ü8 í®>‘ºÆÍûS—fb×¢óö™ØßŸxÿf¬]+}ùòxbÃÁx!*Ùù $,b3L«Xƒ[RëÇdBŸM‰Ë­(H´<½!œ$¢–‰ø³Bb$îX4n+ÕòŠ þEÃMó#8G°÷»›9ÖCfüüoùÎ{4DórHâ‚èÙB€4zãæ‹ÿ|F’‰eöÚ_ùL"æ¹|܆)²AÆc 1ZØ‚þär°%E…¦4?ÎO;SÒ&.ˆ\F½ƒNÁ| hÛg’»&úˆ÷$8Ç_lƒ5Sp=Ç¡Ð:Û•m #™®¿vÏvG¥/gLÜrûq±¶² ½¢¡MÉJ®úcRnÃ}wÏ7ËÈ>ë$…—2V…MMpâŸÏÈ;c‡OªPC˜YB²~ ÈšƒN?áôYQ^\…ÒâÖu‹(¯½*{eeýUDL@µKS¯^ÂMYŸòc7pÁ oÓ:“]p?WÑ[w {©²4$!ˆX7;ˆwØÜîáÎS‹Ã˜­K_d”kdź}Ž ÈŸ…v–¤0/ÀæHÑ ¢ŽãWÿ.ø 1é*½²LÖW€<$‡ðô@•„PÍýf­4*΢&–IvôÂÞc=Üxí&(ÅÓÏ¥þpBXÉØêlŒÊ»ñ\­ìµ”ŠŽü\ {ž'™÷‡ …¤DH-"Ò“,\}Ÿ¶ð(¿óBéÀÌ3q«”¢D¥.— ½óÛZgCîZ‰Ñ5}¶o‡Žü;á­k|¶D™Ÿ±­}¾cOç!¯‹-}&‹¸uw‚+cˆ|ìƒlo1ÖîŸSÉuÏ »gÃÒq'n7†½¸ ˜‹¤ S’ïV¡-!*+§Üo«FË%H')„GM6vóøõ»í @©†ÿ€p<»Â³þy&_ó'‹3 GQúsOª/š¯X8“D6ÚA àV¬Ì á&WjT®§Fåã§9aUz»›Ò<‰]=Ø"æ¨k|h¬tÎñç—Y Pz\Nßì´Veã´ñYR-uõæþït$1©¢[`›)Ë:úk бN‘¶s6iŸÎ¿3xžs.šF+Š= /ÏyŽ1j;D{2Ïš‹¢Œœ”å@rMpñЮ²»öùɶéK¢ëù›Þ¯ 0Å\°üµ±1õH·2ô#.Šl½Pö.Ëå?ažz•±ƒº° 2² îÇP>ÞÙtÐ…ýÄìÅëé¸Âñ •­"gªPéW…’‹–þ±&17I<{tp(ÈLÿñâîù®éÐÈÍ àÕ ¡[†h“*Ó. DB»¡çc ÇÀ³]W¬ãýÛpüšÑº¿`<»åi-à®Ü®×ÔVõ£¼Ü”^ZITt†•ðBíS Ú§üüIVb)Žp¬, ç„XP•4ø$ÃÖïGð‹—u;(;‰Ó†în¿†‡¡é÷¦}°ªÜa¡4þŸÀ­èU4†x½_’gv{ʱ†cLù©íü ³WÜk´)@ƒó3ÕŽ} ·Ø’ÐQÕĉ01N”÷¨_Íyp4×\çŬЇTöþbÛËœd[#ýÓ^‘k—Ðæã¶xüÒå?¤åi5¤ú 3\E> #á|¦ŒD­ì%Íæ° ‘n8g°¾5v*ÁÅ}› ºk&Ð-ËǕۇ·´Žb q$W€kJ÷=vŠKŽå-J´Šbs;û¡A=¿RÌh$H&ąv£XKóG¨‰aË” “Ñ0KÙûx$ xkØIyÈmž’!EÀà®\îúhá‡"㌻®RpãRûâºð´zå•nŒÉ#e—o”%~Ë–‹^Å&‹Hä¼rŽT ÁÊ[ˆk*N‰™Ú¦½ˆö·8ëÞ É--](mtzb÷^zmƈt&+(êÄÏ ãOäÊ=öÚBÀ1 RœíKó95µÛ¾í&4ó¹ƒh%¡LQ*Æ‚'NgÔFÌæfk$âdæmíô0"¾¡’:t£ŸØ£\´ÞÀù‘§aer Rw“l3-›“omù!Òz‰åäE/“vÚÒÓ¸>–(ãžé7Z(¹‘­ÔÃ’ßÚ‡ø}õôL˜Ö&»;Ô¨0íN>I,ómRÇ‹®”š áHË”‰ÕqXw¤6dXÆÇxù[‘(á®á­•pE´À5Á£¸ ÛjµgŠ»Žú]£è-pÅÙØ¿Ж!;·DiO^$÷èë~…Iº~cäîf"f—þàà³ZÝz±u^åƒÖýÑã xN­#½7iJ…ü”—ÕõU–¶³z½J‘ç!W ú«Ê+b½„ZüXï#i‰¨ÒB8 ”6^YoVþð®ÝQL¤õÌ¡Vɉ„¸Ø!¬ÏÜQ2ßç¸/MHÙÅœGb*Tªð|@p£BáýcŒ¸DaÜŠDe%ÁûûF]Éœ,€•>n0i§ØC\-g§Í@ÐöË. ¢G4—"µõ<#ʼd‰ÊÓªL©Þä:û‡U›êœ(ý9-oÍï<Ž-1Pßp–¢îƒÀK£šzø:GÔü ÷ŸJ5ûªÐKÍ\H,Ä‹Ï@!“c®¹¬Z)ëŒDbèX¶I\m9˜7S˜¤§-RЬˆm„„laë KÖ˜¦S¢AôÚ§™Y¦2ç`uôѨ±9ŸABKE²XÞŸµ ˜ï‚¶uÛ zBÖ¶Ê7Œ~35#ðÅPÝß›&·† W)láV_ NØ]Ü©Zzº åo6@V@›ÊÁ,\á.[R¡o€süÐÈïÓøšßoÃ2q¸«/´³•ž @‚…2ý0á=r(žÔœ¨óMæ/)„Äþ¥—–Å“XÝqPdߥ«WÀÕCÂpc­¯›:¢÷ùå»ÌÕQ?ßt#¸yøÞ–¿ñüeõÚmõveÓ#ÏÁ·¿b¶Ñ¬e6ïKõM>†ùaûü›ö”N3¬€('#dQR;mù™ßþeÀð–]—ƒØŸJ[7€ü*Ú7š[ = ØÇÕ+©çÝ¢vB™n…În?@t1zªICáõ›1|ò>¢ì¦«¨µ’”Ǧ2M¹u¤’>àÕc"£à]ãú. ·âüËP1vmï2BrO!Àtol+6Áž[UŒÿ$Ì©ØðYõB|-|mâ´ £ôs…®Ðšt7Ö÷@"gº\y¬lâá0Š1×^<Ö?Ú—T• Œ§ŠÎü ¸«•L§#9¤®oH®ü©†¸aRTÛ-˜T7;1ÄøUCÄzÇŒÚu^?+ÝâUmëõ ¸˜Þ{‰Ú'Ã]û¶QV‰«› 3Zï!I”äÖ£f…Çè„øÉ&H©0w˯ñ‡y>Á÷7uCž>JužZèi³ SkÅXêÉNí_Òë­ð¥"´xw£.BÌ‹âêv˜¦w8¾šÓÞ©“ù©I‘œKí¹ëÑB Û±.åæÉ!娂Wv„Âj¼CÞÂ'šsÝ=qXXÞí–œ˜¬Û›£Bþoñ?åç`Jñɧæ`Ø_®Ÿ3¸°–'KúD}6ì6ùÀe ˜mˆxÄ,å¯ GJ¥xßÿƒšæCpñ‰0Ü»êÈŸ×Jì{Ý6â°«`ÊËU2Ls„æw®ÿ €úsâíã1K–¥cST'aÚ§Œ ù‹;`•~ÓÚµHNè©Pzï¥ù*4øøÕ¼ïÛŽëJ÷W2ZIͧÔÉÍÌÒDWx'q¥ï ïl¾‚y×µKmB:BuÑ]G6¦î=ÀÌPXós¥ !˜Wè9O?[çÊÍ—º×­*2Oåü×U›äÁæTËû?0CÚž3ê{¡jf³CU^ˆŒGRǧX/”_­Ìù׌EçÉ™¦d ¨TdWs±T¤§Ó9ØfXÐàÅ#ÁDŠ{kî­¦ÕOl ©´Â4#bw˜–²JnÐt­­|yÔÝ|é‹z}T!‰¡.§éÔ€ äô ·Õçöã~ýrUV9xãºx_mU©¹(æý¨ŠïƒÇÔ†Ø4Ð#’Qy„tEJQw% åm Ø‚Boñ[ah¨%ä‡O=.ÉNâóÉ}DÌÚ#ëÉ[á)`-ÉÈ9r^ÎÙ‘ ;$ä¸f¬Û¹[ÍeF‚:¶D9ÀqÄÿéèR¶YP…„>56Ù»Býcø²cœóÆôn§±~»`'b>Ê‹yE¦¯Ášˆ‚z~½ƒá-c™XÐ…µB3Ó/ð̦ '‚°á²IL¤¿êa´!ÊxJ…äY–rò?+Ô˜k ¿Í ÈÏëÏÜ¿ç ­‰½„\ÿbÓÍ÷X—ízÓÑWÃô`d3–4¿¬lS7­t,‘¦4Wž/þX«¶%HùqõÌþWÁ¯Xß9ÇìïfÝaPE[]UnûA²äIúKM¤„>DHš‰+Ö¼2wÇÂm3­ï®Š„òØÏmU !5(i /ÒN{¹ªë3±´ó\ ¯ ë‘‰ÊŸžEáC¥8å5®ç%«ÄŽùRóIòïñ ¹“É(5?ª%l¸¥ŠYK¼+Ó‚xÀˆx®.6ZᧈEðûV舻•îå˜ãß7·ëÔ°º.Œá^í`hçÉ Ø«…{qNtœ»cr‰ÁŸNP÷$¤êï JZ)ã`9§ií„ qÉÛì×pÝô2>vGkÍKß/g˰ Ï—Üå¢;>z4;—æ¨;4ƒ¢uNÄ Õ ÈÒÚãH¢+ÇŸêZÏLVÍÊ „X~›ß±©Ñ„¸ÒůÃÊ?-þì!îô=é‹¢9uªçÂfQçùÈYÏLë¬|´É˲ûúëßÌyw׉VØÒÔÜÆÊV,JŽ=T-3”ô|D! ´¬Dã·îUÆ~N ©È†V|¥âxPž 1¸Uoc.V«Rú]#gxq9=þúûMŒ²«ôw!ÑîAhÅ€ß%FtC„Ò#zN?˜ÕßÍà8H®¿»>‡Ñ½Ð…BJ[DK5|!=Íæä÷¢CeùH¼ù‘Ïq,™E²"«h9fót“ “mO1ObκNŒÕ­ 6R6 %èÅVã4üåÎNŒƒF%²‘¯ä{ÕmRiGõ.HÖ¶]£÷Z°ÊÏ¿ÝÞù᜺Rv:$¦ùô§¥Lñ=üå;]¶4Pp{€?´‡¶¹wÁÂ(€ô…œù­z¡óÌ+3¦Õ'Ò„‘£8d‘Â., $¼oYö1CFNö,°é~?ð]«\¢Þ|<ÉŠÎ’ÐÚx±Ù|¦~çZÖc>élL£Û~rå`I–Qí—&_nÅî=]Æ`"¯ó»±«½š,Kb†¿H_— Ž–t­³Dœ,‹‡1‘e6ªÖ€Æ‰¥|?± €jFÌ£ vÔK”K1µŸŽÍÏOÃ꽋xá°>úZ¦#‡¹g›}‰óxOißKÊ«ÇÊûãq-ã箫 ÖOº¢‚Ïì¡dEuk®ÐÊ“ç\D» 8üØr3|"ç×öþí¥‘èÌ9^7àú8e,¼QÀi] ÝÛöt~w-sN£ì;'ŽZõZ¦ƒçnÆY iˆá5ÕöL¤CA\“³ƒèw”*BRqD—u2¨¸:rÅ!ESY©àHA,DÆgŒ$ €ÑSÎ÷I%[H«FÜûùù9OÈİ6‰}ÌÊp4W‹Á³ÑCšº†€˜¬xd¹~|ƒ/Üœ>u?Y¯U°Ù\xÕ Ñ~ÿjŒŠñ!C‰Úǧf¡C¯ç`FÏ4Ãt ¥¨Èhöð7¶lÒøÜYR?Uàœc_P‘UuÊÐ9‘æžKÂôà²ÂË1ð©%kHKÿrX#í k-ú»DH&šþž=†Zi¬››òþ‘©œqØu@["Q›uEÿA¼3lX´ýüµ;¬ ŽHF¼I†‹˜"°ùý0ß&™ZgºÐ¥¿Ò¡73Eå^¶³¯w¬Z©«î:Þ`0ìþAØÊE›”•ßNv„z$XИœSl¹{ÄÄ;]fþ‡AÓ–ò«mEg$ÍZk¿}¸Úiá ²ë]+½%è$ÇÀ`Y¾L§¶ºxëÃ,”lŪ‰æ H,¬ÙG£¼úKVº·ÜŸÒ“¶DF¬WÍb䉭.èaò”‘Šà,mÓëò“oMSÀWácê`7]Çúl–Míþ7¸« ® ¼*»Òц‹ï~ ÀÂ×$Xq©w;uU,;gZFç¢ÇŸ¥ÈB3öi8yj[\ÕN›F…$©üPy¥‰fw*{’»’Û,e.ü3G÷xÜì˜à¼wuuÀÓèîóNÕ‚Ÿ×jL^@?¯ɘµ„ºÔãÒ‡Ô\¶X™.; žy“†Y x‚ðƒ*’âYb€$úц¢ÔŽsÍî\ú:Frß™–¾ døoîRǨº[3FLðÆýcàu‚.Ýl™ªF¢YL`Û!0+Ex–€6.Í4¡öG€ºM8Ï A\j¿0@É W¢²XpO'P"Ƈ-"É4æ•»ÞþËlWF;É ÷êw VÅWÇ!tA3-J%3$ˆÆð¦ÛÀ¢ÓMxÐ\ü8.À;ªÉ¿ 0„ˆK_º 7G =킌·Úäîe°œEt»wÏ«_êѤ,Kþ y?SÙ0¿nõÏãò³³çDδö,U?´âÒ¦%¨}w¤„±Dßç`¾?‹·4^=”ÕåhïÐAüÀd÷¤CYÉ5 Ì»(ÆŽkAg‹ÝÛ.»uEs~‰T“·¬$î@pPÚOãHÒWHAÍ´½ ~ßR]ÅÅE8®Ûð4âÆ¹yaYºŠ¤9FŠÑ†9ü}òs¯ðÕ› `ô$8»EVcÞbnqà­ÜÛü͵µÝñZ¨¿ã'¼×4¼Ú{Ѭ„ã_¬ÉT®äÓ¹Š_nÊy¥øÈÉgâBÄ\ tÝ'¬’|ÞéUD±•¬/1’s!kdþs,(zix{×½"[àuu)dU'Èî{A,V¶w˜·¦Ê7—§‘n,(ë+ºV({ó»>ˆÕ$[\9Ø{D0™€ŸÞ==ß”Š"Ñ{<*ÖH%)Ñ=‘–ØÂ×.÷> ݵeUò¿Åµçµ0*€™á°½Z•μ’ 5w%C_ðZĘO4P 2Z s¸ãœMµÌƒ¤ÆÐ<ËZf,<ÞÇRýlP.ž]LŸª&fGJVÀÖ>º•Fm(§Jæ€+n‹6ÊɈ¦Å|Iýxîw0¶Ð3Ò/aÇOEqEzjÁç|¥&MKmí+4iŠÿ öÓ5'Ó¹¨àgèa©h/ÿ=¬˜Þ·Ô]ûQ×/*%T¡\AØó0ÑoòVá’çoñaˆ «MIiY×ç?§sÿ-ºñ¿É2‘}zé3ÎMTFQžpˆ· È2+Z›ëZma8ªš³„Ég\[èĩВk»Iá ruIHåYDyA©>•š;Dò 7§m‚¨ý’ö!žý™Ó|’ˆ(ýon|Á"T¾{‡¢ÆÔP2se\ê)´^˨«¥f(©è} ólºSHZtBÄ5ÐtsÍ–3l=•žÖ©­Fq{øâúÙ†ÄUPÄ»æoR!éX¬mVê< Q÷˜´Î;5@Ÿhîè;•Š á5/-î·ÇÐ5"ýóîîÜ‘¤­‡|9ÞÙ`jY›ºwéøF ˆD衽2NÔó°÷tOªPùÅÓý¥·Œ0ðu–˜¢Æyš‘`·fÊOð“v„²¶¢:Bå…žJ ùƵbJ«¬…‚4X¬ú—óŠ,aD A•Íðà!XÕ¡fŸŽà‚"D»IÊ5Íñ@Ú|J‹Ï` Föžx·Džiòç€É\ë¨2ì0$NÍBR?ÿOoù5i_¢‚¼#‚¼mú2aµ)õÁîþM4š``‚[Ý‚-dÜjN;3zÑä2*AS²ã¿ ®aÒ… ˆ~oO“u*Éæ1´€þY)Ó«é^áK8H!ð,º‡Z|õÞÈé&M€ËÜÍc b@sATFBÿ`.Ç„„ÑËè Vû”~Ñ7VÊÝ[˜éÊ¡yR8ôÑÿ ÂÇÜCñübmMp2ä©à›úníY°˜Kýoð¢OâSïÜJ•Cs1Ë ??3{Wù—Lýt»$NÚŠš¤š7ÁÓwלœ…ír7ÀÀ1·;dorîã$[y;˜í3>OÉ5vsy‚ÒÉŠZÿ^èÎ#¨ШzõonL)’f1-@ô4ÿ 5‡QèAØ‰ÛæfµJ=L¸Žo1^úÝ9y fQ‰’-VæžòÂЩK*ÕÃX>êdýWŠ¥×¾V¦‚;iS+“kca²Œ£Y¹Ê¿í_ºi¤ o-ºvÂãûsNé†m\Œ©«=}+“UCùŠ—­þÑôè2¶`1ê?‡èˆ#t\®àökkëít¦7,%,•`oD=a!¦´F‚-%¿pT¨f ¾õá­Â&}c8µr~›5>‘⃯l¥Eå䪊0 CZ+‰€ÍŸf–‡ÞZ¼RݽY-ij˜Q>‹AÐBÕ¬ûP2›¸Ñ´ J ¶ùJ@ÿæÁLåR$Ÿ¾r ‘p4O=ûi,xez—´Áa/)´˜Ð@†NOÕÀãÏæêì9R¸Ìî!Ù†äÚhm>Õ npœ?²ŒÍ´0ˆ—ÆÁ¿êe1øD‘ Ì›eÀ˜$2‰‹ CÊ|ååF8¿Ù°Hìµgj•1n§ä9E‡š¤æœ*&d‚Y¾¢ç©h¼™Ñ©ÓßÉü‰Mäzð#÷{ä:“´óÿi.ågªY^žˆITÓL˜Û«ÁŒm²x¢=.þß%ÜkwãVðí]“†gäC„t‡(êL`ä‘4Ÿ“°çZļ¢áŠ-!I‹0™|Y1GýûA§KË—áht nÓ]+I†1üe•2Ø?ñBª¬Ö……Øp†¿ûd&­yTyÃêó–çk‚ªµšè›xäKƒdÄÑ9r¬G×Rþ8{âålãâùêã„”±¾6 ¥W+Ã6ŲїÂbÌZ`†Çì½²êÚ3oøpm“UR€c©ƒ2¿ßûLXÿI|'çF)ýÙu2pR¦üƒ‹Þ‡hó‘ô#ó¯À£¡ôŒ!̇ØXõådöÆæfC¡-_׆{É?RµN!gr1â"\Dàø#¨|è}ˆUê, ›¹w"üÙDe\ÎAnˆdqƤåשXî—ÄuÈ cX±ŒIÂ[S»0GªuNwJSî½é5]^Ø›§– F–8ÆïîI£gPØúô¼Üå‘íiu;CÖ VÐûtÏš:=&dèæÂë„~» èóq;Oiœ¢Ö„ª™7‰§¸Ñ¥¤ìLk°ŇÕïtéäÍÖÍò"O‹Ìß~~¶<´'*¿^L?áïm$doÊ@)Z>5äÂáW_"2£ü§°é]­X9.¿.fý–C.âÕèb‚TšÎU@2½êp@¹˜ð21'}ó|ªâ™ÈχÝRð™ªH£ò'ýÊä Q ©9nëIySÝÐûi9jœZs2©¨PE’È/“»E#p˜x¼& ÞJƒ¿H¬Çâ­bh1›f¹ˆw;Òü=?ô£Þ»þ~€¹Žä—ÁÆòô¥‘%Ÿ«0Õ4z!òžðlydH>OßÈ¥$Añ}+u¯€e¡ÓMéÿplyÛ}ÊíUß1ƒZ¾Iõ™æ‚ØóÂ]o¢ÙoNR8@f²Bu@þNá— .>¼¥™zóä=é,lÊù,–Ĭò; b)8‹&yÝo>ßÑP× n@"´ºr”ê¢ÿEá2öŸ[óŽÙ“‰Ëh† `â¥A… écÏî FÍä u@“"m5\jü~À-Ý®q;°!¡¦*/É Ð Ü¬ˆxÒϵkÞ è'6Å·ö-¸j}á:Þ5a„vüa³‹'&íà2×»x>’Ó|üÀ:ñ•,:ƒÝD£Sîå’À”tV5":Z@Ñ«l#d×KÜØwQÖy‰Ûv Ÿ8ýPl€]#ݘÊ>×ÀÐ>TÇ~£ö3ª—á=tÚy#ë®ôõ°¹êÊ‡ÏøIÒj.ùQ46Œ¯í,‹> lâ ‰«‘³±»ªÖ¦]Kr[ítRV¨'†ZrtñK9î=p·7ó$ÍázãB`˜fÍ{uxSWk<''ʘ³#BKðo#+ƒ5€±I`ñ/¾íæ•ÆÀa,`¨R{îêÇl¨OúQ­üŸoù­ø¾øz­¯à]ˆM€È,éï;þHÕæ>8¥±uX!³ó/-qévO؉¸häHGË ÚVÒ`}ºY¨?wÒtäí/S”ÝfTQ”g_)x/Už†ltºoí„­]èùfÕmfà>á>°uÑ–ä6u“¼ÉAÿK’ÉâB(I9,aRç‚ X ² %Ì{Æ/f¶¨(Þ9ƒ†’u‰ôq—…=Ò+¶-äã¿‘ª]„œ;l‚fO •3·tP€.0îoöqŠÇSâp7…ˆµ gŒ!_ÿ}ô—ÿV’Õ-Ò+ð9ÊøÂ±õpl~ô1´Ò5uqœ½±þ̹9§1‹’G‰6ÏÝè_¬F^ˆK±IîaGÓv™s4 ·Ñ'8¯„‡( ñ?ýHU¿Hù¢= Ë”A}¥lâSë))­ ÓåÊ*+u¶è«[z/!/"XÕÆÖÞ’¢ó±¹ÑB]>ä?òJŸ÷u¦1Óˆ_M”U]2¬›Ä¼îý̰iîP‘id¦éply‚¥xæZÅôtjï9„ <[â¹É»ý¤·Ërš¶Ò–Ô@~…¦•ÒØ‰F‰ãƒãc8·; žläp ¨®0í^8°sšEL[S@õãxzÛw®[Êî?ö¶¶ê6ðåúÄóÞ.ì!³æ ={HñÙà½0(Žã»³ÌÂÀ+@ðË…n܆3pÂ)éê9øîîp 2³ãöÏy ÇÑò0k‘‚ÿ31 ¾…7)}gpOø¦5Œ3õ*ˆQ5ñt㹋ì1¤5O¥m”5¿Á^p&;ve{Ú¾¬ÇIÆþU$œg’mŠshÇ[LSL­aùÈžøKÜÉøDÉê×rkQÜ´ ô!©Œq€o…±»ýŠôøÜx›·0(K„¨8 Ò±„Y-{³“ˆ¬|s1CbÿF„p™¦|z4•¤ÝaÒNöÂÛ±C¸ÞIÎüþÚÆŒßê;¤)î¦×%z0Š@“ÂÂ%$À™7>ÖÆ¿ÊĆ7Hœks”ÅÎ( ¤EQ(0ÈCWù«¥ûÇŽa…€'ø•9&ô˜‹Fvc2$ñcN?û È»ÃËŠ¿³-…ˆJÕVÆV,õ@ƒEtë\#þ‡MõQð©¶8b@KW~†ðbûÂ>êÌ—ãÖ ‚‘d"‘àjLµ¨‡0‚Aæ¿âZŸæEÙô_#ùP¤Z@éü'—b R6§Vô ª:-ßâ´¤~2´<ÓÏ׺ݒžná}¿Ä,ÑŸ™#ë£ÖLG¡`Yˆ»8¾¨NšÔ$-2‡3…‚*Å4š+e>ñăRr,@bTmÀƒõùœ&J§×:'¡¬Ðçé…j¹ jPИ`Í5¿«ôDdzÎÛ7ïX»Ôž@rnó†Ë& P!ѶÕš177™p¿A¥iÕÞW)ˆ'kûeËRëk›·³=úàØAB?†uÕN‚•n8>%DÏ«.L°êd§b—÷ù9Y<ŽÈ2(uíqÔ‹Ú®'Ü(˜Ç¶«›bâCéµIŸý¤’å…À}­ø€2K&gÕwi zŒ&c¿Hr „¯{šݺ%…ÄìÒðÐÊo4¾·-¢çaÍa_µP¬S"Óö lÇãS—ºj]Y –ßW{9§¡ùL#%`áÅê…Ͼ2T ‰”â%å1Sñ(üRuôö´å&?‡¤áÁ·aÂŒÁ|9]=—•.Ôñ‰lyÏ.ñ6‘ˆ]¼ÍxÕP æZL«Ëºg„O™. :Œ•mv w4©*÷|E«vvXpÆOL£¸R0ÃtùIœJ*ÓŽàÞI]”MOñ¯›°mQ®Cü.cHÕÍÐm}M¤ßð8aRsfüÅó‰¿ÆÝ7òxÐ7¡+ÅJs r5¯kG«$Ú ¯ŸqgÓÕ`þbÊj”4ÁúR®Ҟgy²Bû~ ŸP ÀÐë‹!Ë=¯ÐX¨@ü‰+a—À])};@&Ê$†’þ&ëóÁMTFã®FÎ¥=ñß#JÝŸ›¢åð;Ï2e–ü{eD©[€ÇPKÂRÙJIpåšOž{înºØ!ÞèÖ¯æeì}Œ$ºS÷$1IµGžì¼rá½P0©¯”¶qô¦ùhŸ¤t‡[•̤€5&ï´ c;ÜKÉ]ò“~ônåC Íö–àµÌb¨+ékµ¸˜u.f^eŸÛÉáÛ±˜ñAÉõø?_YÖŠN„ÃôÌ«glêûWþ'Ì÷øß‰/#t[êiEÁY!néR—|v„{=G!ºy¦îw9çd³¿ ©—‚ÿv‹dÀXóz~ñ)ºá»Öü*0Œàò‚ðÇEBØ—ªêx>føÌÀQRËj#ÝA§lyu5R¿>,øÀ±ÒC0ÎNÉ50–×ð17É&^í·]3Ó’ç…0f’ó˜ow#HÄê^µy*%bz¬Srª¯v›]^›I[ ]y’d“îκÇZÑr'Õw5…UZ+±mi‹Ø‹¾¢ó<šp Ákä•öp¬é~Äø4`ýjimÿ@"öœhEá£1s¨ír‘©nÝ„ØéÌŒAi*¥+°y]q9Ù{K¨‹)¬ä§èòµó\Ÿ=‚@X=zÆpÈFDïtZð³çð~ŸE@”È—ŒÚi( D×î¬ßê±½ ìC+ÊóÌVNoDBêrøCD@RÀz^"ÓÒ%ú—p¯vÝ5HäÖ:]ñ}Jèö/î8g–Q8X!‚ØnKW"BDuƒR…ÜÒ‡¥‹`¨Æ£­¥J3Ã8ßfý×{þ ©Ï'âø —Þ ®'Zj ºŒ¶¬ÖÝÞ>0ZÕΘdÈ&Úo]6S4ˆàoßçæl…9±ò€¢5ÌÏqH´œN¢“B§ºyÔÔé[¼èïKDÂ"rqò¯ˆÑµ™ïR¤ñ.Ûm­\òäiĤú,¡±þâ³ü~ýõ*ÈH²OüA\é$Œ÷> T?!ùº-F}5ç$G~PæTZd¤\-Fw”.ä å³üÛŠ+[”5¹Äÿ m‰’Ãé}búÕPw’þ= ž’í÷įʻá^^Êá)*Í´Å)M£TÆJÔ†!Æ_DÃÑšímÐøÿq02^#ÒÛ)¹gcœTÕosŽkšJ¤KÈ”Iâ-]fžDâþ0gòÑþ*—;¾ô”˜,v³ò*ìlª¾:ð¨+MU…ËÀdáÐÏì°¸ü¿Væ“>3Ò†‡óJl©ËlhJ†\–A1†ß\ÁªÿI§O>O­4O»#«Ðȶî~¥—΂««\ìKcË8 NKUèÁ9„ÞšIP|ú,…@>=«?ã OØÕ‰§…ÝÀÅ"ÓSRÖ䉂ø†Þ$æ9;çɬë}NjmìŒ:ÏMT¨a·f$Øzœ;-Né—eΣA„ØÇJ¡¶Oño¯ò¾iß9+ ïÝ}â Ù.|‚àŽ¸s(¿ÙMÞ¨D~Mm}Ã! i"¿zɲ}YÝÍ8®ò°ý¿Âîvrܲ뜦o½ŒïéBé§”ÝÅ…*9ƒ‘aMÒÁ³¤aºaéé9:K:úo–gl=#’[TÆvNùü¢‚"H²síø2xXy\~Ó4ÕR¡´—9¨Ó'Knþþ»•}G~’÷—m‘×0ÔõÜ_+âΑ:Ï‹ óå'z0¿6µÊg*Žà(”e­é‚ãôÇöËœ“ÿR@ícPî ŽZqÏuÝMó‚ÿH?¥4tŠK]v'9P)P%PìuS¥7×UÑÌø² hTбæ-cÞU!‰r¹õ*UØXL›âYÂɵŸc\UóÈQŒ#i¥DãsŸ¡÷–®,€¿CÂ* ÖÃ9Ÿàƒ¹y)ïPßÊÂ<]Œ¹?=GéDÕ­1ï1ù„~§¼Y‘»C µð?EôãwÎI Ör@š*¸ÝJnO5ddWSÒaBÙßÙ }å£(`±c;у(–®HöQ“ÑCÎB°û»M*«°´X&–P*¥±Ïô_7‘Ý,0_úˆ©´‘03¢§Rã­ !1TW/¤,˜mE¾¬w¾~u…Õmxaevè9úN„ÀÂ9Š'QF9"Ç'¨qµE".¡Sœºì/‹ôÁ¦6, šq•,ÇöÁ8¬çöa8T‘²ÆûH1™D⯥/çúŠ‘Æ½S€Ô'³Ì9Šº¸‹>ü¿+=¯Ñ¼Dõ­† ¤è}HåWÏ Ü‚'Åæ™§Jo[ÁÀ‚‹W€s€†G=Žzoð¹iRVÍøàï6Ïv¼Ù$Œ>x’²[¤«ÇKfÚd;ætI,D Q%ûD_@£PFïgó{·i)¢ ùmeº ‹îä{ÏÃÛbœV&©Ö{ü3#·ºüp²§s_ïù­“¶¡1ͼ1ð·NùÜÁ®Z>¢Çw7tT”±\&Ê9«3®ìIL 1Åñd°îž‰ìÃdªëC»6ç{é·ý ˆ]rú•ExKËÓúÞ)øÆ¥J§Ó5ç~Ps$8·×ïë ‚” ÿ"ô›áª§@§ê@^ÿbí£PÆö3l_%Þ²šŠî‹¤Ú)‰» W3=m>‰Q¨^ðïwi‰Tà±ëÕu¶¸>8,ÿçû½ ÎIÿ5Ú â!)9VOO"âˆý>$ÂE ÍeçJ«ÕKr潩ºÜúP 2i»Óíý’@Dòr'É&–ëºúÐúÅðÑWLpÿ%ù£N¢ÚJ?RúgØÕBJß>÷\IÎÍ ÑT}ø$én˜¸å¥Vq¯Ù‡ZÆ>;£•l¥’I~œIó&]Ÿá¨Jݲ–°b=M9+£Ø‰Ž¢>ýC©¯ÎŸwÜ'6åÁ Yúÿ~ã¤:5รmy>Öëcá lI@y"¥úø1æ“<æþÒ…‘ºÿs (pÇ.öΛÎLíµ×Ñ%=ͯqLº –ÿ+gó3q«Þ@%ÞÒ¾¤ˆ#2+(O„EÚz+ ]ô¸Ð^ÝŒQvá ÍIÚ»›]Úã²y2póz·®#mÊ|QÊÑO@oHOàÇŠd¬÷æÃÿ KŠð\öpØÖglÊml-¸ Ë_ak£8‹Re¶ àë3}6¼„ãÈPzu àyÞͯ–~0×YÓ¥ÈÃeuaj°.e¤Ú£ŸQÓ,€‘­àLê_- èwˆæáLYUÀz~rzâ,ƒvÂÖh…Ç«âÁÂgBgàGéâ–|§X¾°³Ù§4ñ§Å„7k:L ,ÓË,¸‹¿N¦u@³«Y|®8ÀNÙ» u‡üÔö­‰T\>ï‹ÑetŠZIYÜ¥'Ô8™²@>ÁœŽ/bLx׿?IÚÒÒl½+d%jÒN_’å—¹”a´…X u¦m/ä€ÌàgûƒI-q eüF\¤°ð¸wÔ¯gÖÃ(“Ï[ñ–:–Ý »Âgã–üÿ†î_å×"Þ³õ’샞¾¾W¦EÙå1ï,Ü©ö3zE6Ú#©-2<¤éž}XR»Óí Æ÷RžÌm©EÁ$Ûäñ¥œ² 1å½·Q?/„NÎ1fú\l¸‡Hí{0 XûîY™Q`ý5wuÔTR­aÞ e×»b7-.·¡Öþi·ûÏ]: {¯é#i4p[<•;oÃIV« !æ€÷£´±šÓ”›ÆJlïEô Ýÿ1MÊ£Üdæ³C%„ž/+xÎC$Ì.Çò~×&sÏߊ0ýÇð¬U·ü¼dh_›0ll]^àZOmkŒ™Ðò?váüCç®+ÉkÓwÏ^ï¨Ï_i“ ¡låoÊ]Æ·˜‘"Ùô°ì”'¼µs+¯*«‰t’‹ÚVŠÜœ²jÒ‚=¬Â1h™hÆ£fXsÜ–\·^ÑU—`ÎVè:®XÙ.mz{¡’µ¢UŒêvõÖì 1È)ÍêfFõ§Hs/Û{/ñenô(uáÒÞ¶®aÁþŒ¨èßÕ3¼eNžzŸ @¶;Ý)¦÷r–°*äÈ¿ÁË+ˆ–t_:¯-Øá1  Ïù¬ã¡°´†âfN»v¶ ú‰.îtjxž ù}gÙà Azv{ZÕ©V2ceÖ^ϳä„ksc6ž‡±Å©”J„%Ž´p6¬5 ’ÜÇ'›™EofômýËÖz(£µþ5»*Æ\ïåjr…ÂZ]†T·>ë˴.Vý«ÁÆPé+¼*ë9~V’,foyvçþP—Ué`ÝÓe&¾0ºÂ|Ü‹-¯$–ï²(ž7²3Ås 0½#ßþ}Qi ¯†ò}£ækÁl%^&Ì‹Œ¹”G h\ïëL¾Âÿ!›W(˜%'‹@«»pæVD³„‡rõð|,AïÁì¨{´ …OŸoËݼ@æv.˜Ü’>>¾‘íl!Xî½Å†WþÕp–Ôžhત†zBÿ5)2å™ó4ªÃ^ÕÖv@,[(àùµô(}´Z^¥RI¤ŽØNàßÇcxª=ÀJCê¿×·”µÁ~˜ºw®` Vµ5÷7YÿY×Gžý³íóEe»dî×@—‚6" ¶ç¦‘ÉVd¼”D|:¬ðdÛ¾Å^¢©ÚoækA¶ŽŸMÆóúÊgYc¤ƒº@¾ÿ€TGtg*ƒ¬›C9Š2•y]•Ĥv.~ÇÖ}ŠZèe*}á#Uì!ÝxRÇíȳ™Cc‚gVÊ‹ßcLüM&‹¨Ï·ÍÓÕ&%z³þ?¡ÅU”É©ïÓDcXhG#·­PûµÊþHý[u‰¾i;•oá}ÄNé§»]àMÂôk&ËWr´Ç¥¶ó}-6È%P!·®ÓPÌz èr¿”1Tõ¡iØ»…ç×gØv¿ÃÚË—››®J€œ †©°ÍbL¸•1ÑÐ…•$Ä“ <½‹²«¹«ËÐÛ›¿ÏÂ$ul¿¹åæyÿ øm €i†]*,H_õïïФ >·"o 7W¸ä¸ÿEˆ… fÛ[>wÅ ñ)` U Áfšu}BŒN·;ãvqõW•­.ÙºÉÜoúß`“³Œ{W̺c˜õ?áf~ÓÌcû–ÎÍÂ'²öši”ùÎÐ+^ÁUaÌb€²¥ÂµòD:2¶¥U<Q2ç.ʺ¤ÀÍn,H…9z19ÍnXô”þ-KàýcgÆ.è˜.»à¸SBáä šŽZ¢†è¾àsÊëOn”¬ôÿ=@féSÞ.èQEÅíûÀ*¦€B—ç4Ü:±Š*ú„åZžùø–ùžÓ>)Âï‹/!‹µº–Ŷî5à‰ø)’ÛᤓS¿BóÉ$¼%þq„²@„‘€ô‚,›O<ú1»¤qõÞ?ßñ,=;® n|q‹«)ˆîôÉÙ-Ÿ{ko›Ò¥vxC#„ã4Q\6X‹½ !Ìݳ \xÝê,]Î3cÉ ÁЉ’gݦð=&{Û£+Áò5bD?GH¬®ksÜÑe‚½™¨ÿ€2 ¬itšmשּׂ6õå æˆ”}%&úÉÉ(äœCÖ¶Ke²Ú«x1XêœCó˜¤!gaAÿ4ëp¸¾áŒ ­^üñE š?×R•÷ª$²—-O©¥g†¸"b×|YX +zC¾ù[m \ú ß¹îwŒ¹WéQ/™ 7äèóJ®Kï"0(m=eý÷@&ú ¢²Þv7Rœm©ò°¥!„w‹=á1^jžt‹˜¿r=—œc};ç<1mð# ñ0ëêù•š}Œ>+ëLB‹æ½Fµ:Â+ ¹3h?ꡟü tªØ~Z4Xß«©¨)Oõ‹÷Ö¬$# PfrŒÙÁ¥Ó3'ÈcOuÿGj(:Ï ¥x›":¹¤á³ƒcõpe eÕ ê¾‹>>’–DxÇt xï _«cU,Üt›5Öù?j¼{ØäÉ„!– Õ Üœ92©è ˆœ~”D ¯R‹Àîyñ<˜çÈ›¶ÃAΪÅÊ·7“í])˜ äÃa…ó)¤¤¼×–ý&o¼MyŽ~oÎöj®‰ÍwW qsŒƒ¡Ì  )!ê5¸±nÊÞ&±|úÍ‘£¦—š›Ü´ú$Û¼*ÚZ(ßÑ$ÔÔ•æµjÙM[W˜8—•QÏ9t‡áåkö–"}ñ²ãDB›|F‹4ŠQU>]¿0ŽÞq§î›~',J£õ `‘ä-!/ðg‚§á‘ÖOü+QêCmÒ"Û6rïh@²s]€“Ú™Ri\Ah3 ±á <£Æ—V„+©ýSD…µ„LL’öA&´mIŸ„¨Ws CóÈ‘nÚíž,É5Mgs_¡•Q!’€^ýãæƒxgÈ7vÅSÚ«c=²%<)©öáBAy6ÒMDáHÆ Ê—զĊò»X(I=í}HáúúR@ꢻŽïƒóªu¨è_1->ßȉ¨Íªð÷ ƒº–œ ®j V«)7ƒÉ,¬yükh™Lª[næ¥NË_Ï^Œ¿æßM ¬±Ÿ”2¢fUM¦o†Á&íI—^-’aX|=g°Ou‰ÇŸþÑ UÏ`ÏnÌyƒhÌ6$r÷ÿlýt =¹žNŸ$õÏAD>Þ1šcC´X^Åoe¬h!`¥Íæk zÌJ¥ÛÜÕáõ¼ âLÅÁÿ„RoMkÕ!E«áƒwÊ7älH¡9óhµ]Œ ’ûê÷u<>Ý8®j?€šË²Ëbö*E_‘Uä:ª°0‚ŠqTÊ«n˜Ëj›kßNdÑ÷2æÌD~¦%ìWao¤–/•w舦{”E’Ió!æó׿¤ñ“^ýƒª3’üuãÔ°ö9)» XjW2µâ²ÅÞ>ïQôë~]›2 úfÜ4öS¡»˜Zì Z¹Ñ ©ì¡ú™ eêÛ$[ ã#¾N®‹Ç…+ž´N1šºˆ215ÌîSñÐn p™èlôìØà—Á£CTÕ$6Øg³*ëŽ:ycÝïfÊÑ%²òšU{²ð%÷_Jâ“ ÆHQµÍŠO¨ñ˜½«ˆUeÊ­®Ô‚Ø’ë(=ÑÕ©fS£ˆŒþÁº†RGF¡—ZÙ'™üý(Å#•U}Ðzh3« hÁ“TaÉ5Øâésúi퇀Š}ëýÏ;)pŽ9$°šç°¿•´. ŽË$gš×’:²CÅ‘ž|=ºÕDÀØ~ì n¹as¢» “4Ý1ÏhF–«¥ã©9‘¶8ÎÕ¼K­DÜKæJ8¦˜›ëÜ1Žíc†‰þÑ¥ ÈüÁ ß Ç]ƒ .¸¬\i´!’`C¡¸uÑ»*r[8>Ó15“¾/%мẊ"à=g2üUh© FðDRC·ÿML°Bß> Ïd5jÇ3“á?S!þ£Äæe‹•0 O÷LÀÊŠ¤ÑIô¸ó7A7fG©Ë~Ɖ:õ1W-¯Òðlc½°VóŠb‘Š“5ϲDÐÐ|Fˆ¡¶•¬ŸßL¡½F>Äd†…‚h9Š$FþÅËžoúÂkªTSɦ–Éé˜ôˆvY®¼O MÐþó\Ž k3e‚þ,çÀõ=ü\-´ B?s€-=S<óè D°[{xƒ¢¿Ï ÀC—æWü¯YØ ”0î÷H8¨á‚Öúú÷<§âK‘eÖœ“scúª x¶þúˆµÄ@Z?¥_ã(u^LËõdçÐ\}Ê ¸§0 *:þ"[0l%¢®D™fU÷Mj5ò0n¹Ì¤M­¯*3ð)C`èÑ>¹ìR®6aÁ/¹“C(*é CS©1ZÑþ³@šgXPäO‘cÒ“±éÏ–‹šà䶆ïà¡Û¼1Á'x1ËÓ Š²7áß6Š2îaWÛ@¢¸eºÈìVÒ­x€€ñý¬+»ê³ï©®ú†ÛOoÔ4¿¶ËýN/Ú§ûnþ?µOö‘ÿ[zßSp¾¤Ék½ú¿QWí¤¿máÂ~wÑÖ{ê²ÿ5¸_RL¿µÒ~zrú’?mnŸ]Î_ýÍø>@Î~gâáî &RMu ­â×¥QÎB;=ËíaMµU*N¦¬‡©S^¼—i‹É‹%­7/ÌÃXfê¸C¢`UTÅÜ¥y/DÜ‹¼ï,”$¿=©f?Þ,±(E¿5s4¿Ô-ù¡e!ÀèÖ#>±$›#ÊiÈæefÏF0`iàÛÞ••✠Òùô02ÇÌXic ¿ž/Ü6ÉËž•¸F“ß ‡ºSZ¹srO9Îu!U.£ºWU·ž&ûÉÁ´ô3ô1?•wù"±0pF~oÃvbñ‘É0r¯ˆFÞ¢å7Cæ¼ÇߨÁã`£Þ¼dýV¦v(7<>ÀB¤;_Á1A¢ðeþº{z^'ZM^hJÂ>êaX¬P–ßmç¬e5—Rõ¬ðƒ¼ôŸKáÎÙ&‘ä,i»÷™‚-Ü;+¥åʃÒ/ÿ('qðq¤œ+¤™–å†ÇŸQ#˜ŒYYÉl!ˆ¯M+ÛšÞ[‡LAQêÅìkž‘¤¼YæãGÉØÆ…Ÿsø‘ÔxŒcÃÙ¯DÐ’©±OÿÉgÂBJN JÙÅÝaÓ5~‘¬{yæù[(Ožú ó@¹þ¢\ëH¬ ÄQÑßðRÇ'ÓS­£•Ó¾Ó9Â1$Pßç[ ~·_7Íó|ßÍùXd­f5¤šl·s)­n8øp"ÿMÁ¿Š ´ €u"ÕÙ HWé$+‡ê5Eçq˜l=ÒLÉ– JãMù+n§zšÐôÂ(X ›ñô(P½³ÿv›ÕôLs’©±OÿÉgÂBJN JÙÅÝaƒí±ÀzG.ã{'šß6ïfƒËájÝ’ˬXKÄ4‘ÃV¹W(Ÿ€eÌIºD_œÿxnÒß,pÊ¡¦×¤"ŠXF9¡CÀ)£“×YG|·,ʬ¿0O;¯ŽG¿ÓB/eÿÀqTIu«Â)¸ÕzÇU %’“à¢À‚zŠR‰…¥‰³¤jÍ»M~Àù-.‘0–„ÒNž÷ëé–’©±OòãÔ3Ë€°ñ7 $!Q%λS“„ƒ³bÇj‰hx¾œ…kÉØ þ Òm*ë™ô؃•B6¤Pìé¶HBëž/éŒB:ÎFG_çšñ›æS” T³¯ˆIÀÏBuóã½Æúªõu¯Žš±öÎÃ<‹´n÷“µGÆò¡Ý9àO§8ÐpÍcf‹˜á§P>ħç^£ßj{‹˜’$?¬ŒVæÆX.½M‰C°Ñƒd¦Ì{ïýŽ»ƒ|z‹ÞÛká˜ÑâåJ£½æJ®ÿO*$+Ä`–‡‡'°;ç7¢ÈX€› øz”"«¹²þÄ1­hW¬svB­õË9€~šË  ÕÀR($ªh²Qñ¿I«‰jrªa†…¬ÒøÙÄ:GæŸ]UK–ÝÀ1+ƒV‡7Ì>Óž q rŸUóºTÙ­ARÑ!ÏèéAºüc aKªgþ=Ò Û§_É\ºSbÙ‘­$ îbCæ\à€Ú”Fl3•¸L”ŠÅé2¼ÇEÍ(!µ*ÙÝ[_œt‰Ó©¥¹ö¢™<5_Ïcá–éj¶áÚ¿u“^vTà–‡^ìãŬ˜‚¢”*BRcâB  :"Ì[å”UñÙ2)iò=šˆQjá,Il4м0°* qªÏ¹…R)ç*¢–ªìBt}Âò¥Ñª–"ȆW0Sz£•¾Ó$xÕ Ñ~÷ø£ßÀ $%úh˜”/$˜Œ ¦Z~µ”ƵðÖKÔëàMÅlmËw¢Ò/ýP#[ ÷® |/h¢˜lNIØ$ÚÉÎD‹¸¾L_)‡áÈqŽh­=ÖiÔ| áÚXq»ÍºL£è±܆‡¤z{²uA±h©yDp¶áÛGþ}G±Ùó|Èp5K˜4é$æZ…N'›È¸Oadz§5†Ÿ”ÊWq3 p6 îáCÙõ­I„„Jû;ðØm®hXWZ`_ >VkÇF£Š”R2޲y^¯g_l ¤n†f—Դ]2Æ}E’ÜïÖJrhb‡h µSóP߇¥§u =®a²OÜúþU·g<ÉQ߉¶ûOKïfŸ¢¼ò¤Ïø8tvM‰f›pª…ŠÀž[wõP¯}ø„ànó÷$ÏY ]AÕ«iY¹³O½²Á·+ý¨ý-õ5õT€ñXÇËwÒ`áÇ›€ueÖ:Ë)dA•6ÔòB×z ù:lmžWÈvohÕýŸš ^iaµíŠ!°{„ƒÑ 3LÞ“Íã=¡¸5ŽÙçê¾eÖfêŒ`Êý¦¡> K²fˆGQë Ëþ–ÍLðÖø”v.%æ øe;ÆC€ð‚µVD˜êÅ.~…#D°CoÛé˜4™Æ‹‰ã¼e Qn¨Ž¥QWa:XJÎi¹Cð¼+‘>#·ð»¥òßù²‡'âíý­…>?ËZðæµ:0i’§æ-Yÿg8-EhÍxòx׿@J²ÆÁ|¼HÃ}s%z1»¸Å¨=à§­2µŠmÅm F ÃB+Ël÷[x êö pËã RRŽšÁrͦÛþñ_žiöÓ¡žWÆ|¾ÙŽ#âÛœÃEÜ%¯¢úA˜I]»!TJµ  ´YÌx[1Ñ÷ÏF!ÅŽxs@û„‚±ä¸¶Ñ„ÊW ”·‘³²ê,&ÓM¥©*‰uå¨ÍöD)Gò£ÆÅÏe2E÷º«›q¿Ÿ+õMª<‡€´ÂËÇÍÏsøþ`,o)F¸¥Z¯÷Ø3ØZRv›at±„th§á#çH'ÛÑ£üˆÒºlÖ\*Qt–=zw`}Ùñ+WGÕ@‘/dev/null) .PHONY : tests coverage clean-coverage tests/ran-already angband-3.5.1/src/target.c0000644000175000017500000012326012456456606014665 0ustar chriscchrisc/* * File: target.c * Purpose: Targetting code * * Copyright (c) 1997-2007 Angband contributors * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "game-cmd.h" #include "monster/mon-lore.h" #include "monster/mon-util.h" #include "monster/monster.h" #include "squelch.h" #include "target.h" /* * Height of the help screen; any higher than 4 will overlap the health * bar which we want to keep in targeting mode. */ #define HELP_HEIGHT 3 /*** File-wide variables ***/ /* Is the target set? */ static bool target_set; /* Current monster being tracked, or 0 */ static struct monster *target_who; /* Target location */ static s16b target_x, target_y; #define TS_INITIAL_SIZE 20 /*** Functions ***/ /* * Monster health description */ static void look_mon_desc(char *buf, size_t max, int m_idx) { monster_type *m_ptr = cave_monster(cave, m_idx); bool living = TRUE; /* Determine if the monster is "living" (vs "undead") */ if (monster_is_unusual(m_ptr->race)) living = FALSE; /* Healthy monsters */ if (m_ptr->hp >= m_ptr->maxhp) { /* No damage */ my_strcpy(buf, (living ? "unhurt" : "undamaged"), max); } else { /* Calculate a health "percentage" */ int perc = 100L * m_ptr->hp / m_ptr->maxhp; if (perc >= 60) my_strcpy(buf, (living ? "somewhat wounded" : "somewhat damaged"), max); else if (perc >= 25) my_strcpy(buf, (living ? "wounded" : "damaged"), max); else if (perc >= 10) my_strcpy(buf, (living ? "badly wounded" : "badly damaged"), max); else my_strcpy(buf, (living ? "almost dead" : "almost destroyed"), max); } if (m_ptr->m_timed[MON_TMD_SLEEP]) my_strcat(buf, ", asleep", max); if (m_ptr->m_timed[MON_TMD_CONF]) my_strcat(buf, ", confused", max); if (m_ptr->m_timed[MON_TMD_FEAR]) my_strcat(buf, ", afraid", max); if (m_ptr->m_timed[MON_TMD_STUN]) my_strcat(buf, ", stunned", max); } /* * Determine is a monster makes a reasonable target * * The concept of "targetting" was stolen from "Morgul" (?) * * The player can target any location, or any "target-able" monster. * * Currently, a monster is "target_able" if it is visible, and if * the player can hit it with a projection, and the player is not * hallucinating. This allows use of "use closest target" macros. */ bool target_able(struct monster *m) { return m && m->race && m->ml && !m->unaware && projectable(p_ptr->py, p_ptr->px, m->fy, m->fx, PROJECT_NONE) && !p_ptr->timed[TMD_IMAGE]; } /* * Update (if necessary) and verify (if possible) the target. * * We return TRUE if the target is "okay" and FALSE otherwise. */ bool target_okay(void) { /* No target */ if (!target_set) return FALSE; /* Check "monster" targets */ if (target_who) { if (target_able(target_who)) { /* Get the monster location */ target_y = target_who->fy; target_x = target_who->fx; /* Good target */ return TRUE; } } else if (target_x && target_y) { /* Allow a direction without a monster */ return TRUE; } /* Assume no target */ return FALSE; } /* * Set the target to a monster (or nobody) */ bool target_set_monster(struct monster *mon) { /* Acceptable target */ if (mon && target_able(mon)) { target_set = TRUE; target_who = mon; target_y = mon->fy; target_x = mon->fx; return TRUE; } /* Reset target info */ target_set = FALSE; target_who = NULL; target_y = 0; target_x = 0; return FALSE; } /* * Set the target to a location */ void target_set_location(int y, int x) { /* Legal target */ if (cave_in_bounds_fully(cave, y, x)) { /* Save target info */ target_set = TRUE; target_who = NULL; target_y = y; target_x = x; } /* Clear target */ else { /* Reset target info */ target_set = FALSE; target_who = 0; target_y = 0; target_x = 0; } } /* * Sorting hook -- comp function -- by "distance to player" * * We use "u" and "v" to point to arrays of "x" and "y" positions, * and sort the arrays by double-distance to the player. */ static int cmp_distance(const void *a, const void *b) { int py = p_ptr->py; int px = p_ptr->px; const struct loc *pa = a; const struct loc *pb = b; int da, db, kx, ky; /* Absolute distance components */ kx = pa->x; kx -= px; kx = ABS(kx); ky = pa->y; ky -= py; ky = ABS(ky); /* Approximate Double Distance to the first point */ da = ((kx > ky) ? (kx + kx + ky) : (ky + ky + kx)); /* Absolute distance components */ kx = pb->x; kx -= px; kx = ABS(kx); ky = pb->y; ky -= py; ky = ABS(ky); /* Approximate Double Distance to the first point */ db = ((kx > ky) ? (kx + kx + ky) : (ky + ky + kx)); /* Compare the distances */ if (da < db) return -1; if (da > db) return 1; return 0; } /* * Hack -- help "select" a location (see below) */ static s16b target_pick(int y1, int x1, int dy, int dx, struct point_set *targets) { int i, v; int x2, y2, x3, y3, x4, y4; int b_i = -1, b_v = 9999; /* Scan the locations */ for (i = 0; i < point_set_size(targets); i++) { /* Point 2 */ x2 = targets->pts[i].x; y2 = targets->pts[i].y; /* Directed distance */ x3 = (x2 - x1); y3 = (y2 - y1); /* Verify quadrant */ if (dx && (x3 * dx <= 0)) continue; if (dy && (y3 * dy <= 0)) continue; /* Absolute distance */ x4 = ABS(x3); y4 = ABS(y3); /* Verify quadrant */ if (dy && !dx && (x4 > y4)) continue; if (dx && !dy && (y4 > x4)) continue; /* Approximate Double Distance */ v = ((x4 > y4) ? (x4 + x4 + y4) : (y4 + y4 + x4)); /* Penalize location XXX XXX XXX */ /* Track best */ if ((b_i >= 0) && (v >= b_v)) continue; /* Track best */ b_i = i; b_v = v; } /* Result */ return (b_i); } /* * Hack -- determine if a given location is "interesting" */ static bool target_set_interactive_accept(int y, int x) { object_type *o_ptr; /* Player grids are always interesting */ if (cave->m_idx[y][x] < 0) return (TRUE); /* Handle hallucination */ if (p_ptr->timed[TMD_IMAGE]) return (FALSE); /* Visible monsters */ if (cave->m_idx[y][x] > 0) { monster_type *m_ptr = cave_monster_at(cave, y, x); /* Visible monsters */ if (m_ptr->ml && !m_ptr->unaware) return (TRUE); } /* Scan all objects in the grid */ for (o_ptr = get_first_object(y, x); o_ptr; o_ptr = get_next_object(o_ptr)) { /* Memorized object */ if (o_ptr->marked && !squelch_item_ok(o_ptr)) return (TRUE); } /* Interesting memorized features */ if (cave->info[y][x] & (CAVE_MARK) && !cave_isboring(cave, y, x)) return (TRUE); /* Nope */ return (FALSE); } /* * Return a target set of target_able monsters. */ static struct point_set *target_set_interactive_prepare(int mode) { int y, x; struct point_set *targets = point_set_new(TS_INITIAL_SIZE); /* Scan the current panel */ for (y = Term->offset_y; y < Term->offset_y + SCREEN_HGT; y++) { for (x = Term->offset_x; x < Term->offset_x + SCREEN_WID; x++) { /* Check bounds */ if (!cave_in_bounds_fully(cave, y, x)) continue; /* Require "interesting" contents */ if (!target_set_interactive_accept(y, x)) continue; /* Special mode */ if (mode & (TARGET_KILL)) { /* Must contain a monster */ if (!(cave->m_idx[y][x] > 0)) continue; /* Must be a targettable monster */ if (!target_able(cave_monster_at(cave, y, x))) continue; } /* Save the location */ add_to_point_set(targets, y, x); } } sort(targets->pts, point_set_size(targets), sizeof(*(targets->pts)), cmp_distance); return targets; } /* * Perform the minimum "whole panel" adjustment to ensure that the given * location is contained inside the current panel, and return TRUE if any * such adjustment was performed. Optionally accounts for the targeting * help window. */ static bool adjust_panel_help(int y, int x, bool help) { bool changed = FALSE; int j; int screen_hgt_main = help ? (Term->hgt - ROW_MAP - 3) : (Term->hgt - ROW_MAP - 1); /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { int wx, wy; int screen_hgt, screen_wid; term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if ((j > 0) && !(op_ptr->window_flag[j] & PW_MAP)) continue; wy = t->offset_y; wx = t->offset_x; screen_hgt = (j == 0) ? screen_hgt_main : t->hgt; screen_wid = (j == 0) ? (Term->wid - COL_MAP - 1) : t->wid; /* Bigtile panels need adjustment */ screen_wid = screen_wid / tile_width; screen_hgt = screen_hgt / tile_height; /* Adjust as needed */ while (y >= wy + screen_hgt) wy += screen_hgt / 2; while (y < wy) wy -= screen_hgt / 2; /* Adjust as needed */ while (x >= wx + screen_wid) wx += screen_wid / 2; while (x < wx) wx -= screen_wid / 2; /* Use "modify_panel" */ if (modify_panel(t, wy, wx)) changed = TRUE; } return (changed); } /* * Describe a location relative to the player position. * e.g. "12 S 35 W" or "0 N, 33 E" or "0 N, 0 E" */ static void coords_desc(char *buf, int size, int y, int x) { const char *east_or_west; const char *north_or_south; int py = p_ptr->py; int px = p_ptr->px; if (y > py) north_or_south = "S"; else north_or_south = "N"; if (x < px) east_or_west = "W"; else east_or_west = "E"; strnfmt(buf, size, "%d %s, %d %s", ABS(y-py), north_or_south, ABS(x-px), east_or_west); } /* * Display targeting help at the bottom of the screen. */ static void target_display_help(bool monster, bool free) { /* Determine help location */ int wid, hgt, help_loc; Term_get_size(&wid, &hgt); help_loc = hgt - HELP_HEIGHT; /* Clear */ clear_from(help_loc); /* Prepare help hooks */ text_out_hook = text_out_to_screen; text_out_indent = 1; Term_gotoxy(1, help_loc); /* Display help */ text_out_c(TERM_L_GREEN, "

"); text_out(" and "); text_out_c(TERM_L_GREEN, ""); text_out(" look around. '"); text_out_c(TERM_L_GREEN, "g"); text_out(" moves to the selection. '"); text_out_c(TERM_L_GREEN, "p"); text_out("' selects the player. '"); text_out_c(TERM_L_GREEN, "q"); text_out("' exits. '"); text_out_c(TERM_L_GREEN, "r"); text_out("' displays details. '"); if (free) { text_out_c(TERM_L_GREEN, "m"); text_out("' restricts to interesting places. "); } else { text_out_c(TERM_L_GREEN, "+"); text_out("' and '"); text_out_c(TERM_L_GREEN, "-"); text_out("' cycle through interesting places. '"); text_out_c(TERM_L_GREEN, "o"); text_out("' allows free selection. "); } if (monster || free) { text_out("'"); text_out_c(TERM_L_GREEN, "t"); text_out("' targets the current selection."); } /* Reset */ text_out_indent = 0; } /* Size of the array that is used for object names during targeting. */ #define TARGET_OUT_VAL_SIZE 256 /** * Display the object name of the selected object and allow for full object recall. Returns * an event that occurred display. * * This will only work for a single object on the ground and not a pile. This loop is * similar to the monster recall loop in target_set_interactive_aux(). The out_val array * size needs to match the size that is passed in (since this code was extracted from there). * * \param o_ptr is the object to describe. * \param y is the cave row of the object. * \param x is the cave column of the object. * \param out_val is the string that holds the name of the object and is returned to the caller. * \param s1 is part of the output string. * \param s2 is part of the output string. * \param s3 is part of the output string. * \param coords is part of the output string */ static ui_event target_recall_loop_object(object_type *o_ptr, int y, int x, char out_val[TARGET_OUT_VAL_SIZE], const char *s1, const char *s2, const char *s3, char *coords) { bool recall = FALSE; ui_event press; while (1) { if (recall) { display_object_recall_interactive(o_ptr); press = inkey_m(); } else { char o_name[80]; /* Obtain an object description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Describe the object */ if (p_ptr->wizard) { strnfmt(out_val, TARGET_OUT_VAL_SIZE, "%s%s%s%s, %s (%d:%d).", s1, s2, s3, o_name, coords, y, x); } else { strnfmt(out_val, TARGET_OUT_VAL_SIZE, "%s%s%s%s, %s.", s1, s2, s3, o_name, coords); } prt(out_val, 0, 0); move_cursor_relative(y, x); press = inkey_m(); } if ((press.type == EVT_MOUSE) && (press.mouse.button == 1) && (KEY_GRID_X(press) == x) && (KEY_GRID_Y(press) == y)) recall = !recall; else if ((press.type == EVT_KBRD) && (press.key.code == 'r')) recall = !recall; else break; } return press; } /* * Examine a grid, return a keypress. * * The "mode" argument contains the "TARGET_LOOK" bit flag, which * indicates that the "space" key should scan through the contents * of the grid, instead of simply returning immediately. This lets * the "look" command get complete information, without making the * "target" command annoying. * * The "info" argument contains the "commands" which should be shown * inside the "[xxx]" text. This string must never be empty, or grids * containing monsters will be displayed with an extra comma. * * Note that if a monster is in the grid, we update both the monster * recall info and the health bar info to track that monster. * * This function correctly handles multiple objects per grid, and objects * and terrain features in the same grid, though the latter never happens. * * This function must handle blindness/hallucination. */ //static struct keypress target_set_interactive_aux(int y, int x, int mode) static ui_event target_set_interactive_aux(int y, int x, int mode) { s16b this_o_idx = 0, next_o_idx = 0; const char *s1, *s2, *s3; bool boring; int floor_list[MAX_FLOOR_STACK]; int floor_num; //struct keypress query; ui_event press; char out_val[TARGET_OUT_VAL_SIZE]; char coords[20]; const char *name; /* Describe the square location */ coords_desc(coords, sizeof(coords), y, x); /* Repeat forever */ while (1) { /* Paranoia */ press.type = EVT_KBRD; press.key.code = ' '; press.key.mods = 0; /* Assume boring */ boring = TRUE; /* Default */ s1 = "You see "; s2 = ""; s3 = ""; /* The player */ if (cave->m_idx[y][x] < 0) { /* Description */ s1 = "You are "; /* Preposition */ s2 = "on "; } /* Hallucination messes things up */ if (p_ptr->timed[TMD_IMAGE]) { const char *name = "something strange"; /* Display a message */ if (p_ptr->wizard) strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s (%d:%d).", s1, s2, s3, name, coords, y, x); else strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s.", s1, s2, s3, name, coords); prt(out_val, 0, 0); move_cursor_relative(y, x); //input = inkey_m(); //if ( press.key = inkey(); /* Stop on everything but "return" */ if (press.key.code == KC_ENTER) continue; return press; } /* Actual monsters */ if (cave->m_idx[y][x] > 0) { monster_type *m_ptr = cave_monster_at(cave, y, x); const monster_lore *l_ptr = get_lore(m_ptr->race); /* Visible */ if (m_ptr->ml && !m_ptr->unaware) { bool recall = FALSE; char m_name[80]; /* Not boring */ boring = FALSE; /* Get the monster name ("a kobold") */ monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_IND_VIS); /* Hack -- track this monster race */ monster_race_track(m_ptr->race); /* Hack -- health bar for this monster */ health_track(p_ptr, m_ptr); /* Hack -- handle stuff */ handle_stuff(p_ptr); /* Interact */ while (1) { /* Recall */ if (recall) { lore_show_interactive(m_ptr->race, l_ptr); press = inkey_m(); } /* Normal */ else { char buf[80]; /* Describe the monster */ look_mon_desc(buf, sizeof(buf), cave->m_idx[y][x]); /* Describe, and prompt for recall */ if (p_ptr->wizard) { strnfmt(out_val, sizeof(out_val), "%s%s%s%s (%s), %s (%d:%d).", s1, s2, s3, m_name, buf, coords, y, x); } else { strnfmt(out_val, sizeof(out_val), "%s%s%s%s (%s), %s.", s1, s2, s3, m_name, buf, coords); } prt(out_val, 0, 0); /* Place cursor */ move_cursor_relative(y, x); /* Command */ press = inkey_m(); } /* Normal commands */ if ((press.type == EVT_MOUSE) && (press.mouse.button == 1) && (KEY_GRID_X(press) == x) && (KEY_GRID_Y(press) == y)) recall = !recall; else if ((press.type == EVT_KBRD) && (press.key.code == 'r')) recall = !recall; else break; } if (press.type == EVT_MOUSE) { /* Stop on right click */ if (press.mouse.button == 2) break; /* Sometimes stop at "space" key */ if (press.mouse.button && !(mode & (TARGET_LOOK))) break; } else { /* Stop on everything but "return"/"space" */ if (press.key.code != KC_ENTER && press.key.code != ' ') break; /* Sometimes stop at "space" key */ if ((press.key.code == ' ') && !(mode & (TARGET_LOOK))) break; } /* Take account of gender */ if (rf_has(m_ptr->race->flags, RF_FEMALE)) s1 = "She is "; else if (rf_has(m_ptr->race->flags, RF_MALE)) s1 = "He is "; else s1 = "It is "; /* Use a verb */ s2 = "carrying "; /* Scan all objects being carried */ for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx) { char o_name[80]; object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Obtain an object description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Describe the object */ if (p_ptr->wizard) { strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s (%d:%d).", s1, s2, s3, o_name, coords, y, x); } /* Disabled since monsters now carry their drops else { strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s.", s1, s2, s3, o_name, coords); } */ prt(out_val, 0, 0); move_cursor_relative(y, x); press = inkey_m(); if (press.type == EVT_MOUSE) { /* Stop on right click */ if (press.mouse.button == 2) break; /* Sometimes stop at "space" key */ if (press.mouse.button && !(mode & (TARGET_LOOK))) break; } else { /* Stop on everything but "return"/"space" */ if ((press.key.code != KC_ENTER) && (press.key.code != ' ')) break; /* Sometimes stop at "space" key */ if ((press.key.code == ' ') && !(mode & (TARGET_LOOK))) break; } /* Change the intro */ s2 = "also carrying "; } /* Double break */ if (this_o_idx) break; /* Use a preposition */ s2 = "on "; } } /* Assume not floored */ floor_num = scan_floor(floor_list, N_ELEMENTS(floor_list), y, x, 0x0A); /* Scan all marked objects in the grid */ if ((floor_num > 0) && (!(p_ptr->timed[TMD_BLIND]) || (y == p_ptr->py && x == p_ptr->px))) { /* Not boring */ boring = FALSE; track_object(-floor_list[0]); handle_stuff(p_ptr); /* If there is more than one item... */ if (floor_num > 1) while (1) { /* Describe the pile */ if (p_ptr->wizard) { strnfmt(out_val, sizeof(out_val), "%s%s%sa pile of %d objects, %s (%d:%d).", s1, s2, s3, floor_num, coords, y, x); } else { strnfmt(out_val, sizeof(out_val), "%s%s%sa pile of %d objects, %s.", s1, s2, s3, floor_num, coords); } prt(out_val, 0, 0); move_cursor_relative(y, x); press = inkey_m(); /* Display objects */ if (((press.type == EVT_MOUSE) && (press.mouse.button == 1) && (KEY_GRID_X(press) == x) && (KEY_GRID_Y(press) == y)) || ((press.type == EVT_KBRD) && (press.key.code == 'r'))) { int rdone = 0; int pos; while (!rdone) { /* Save screen */ screen_save(); /* Display */ show_floor(floor_list, floor_num, (OLIST_WEIGHT | OLIST_GOLD)); /* Describe the pile */ prt(out_val, 0, 0); press = inkey_m(); /* Load screen */ screen_load(); if (press.type == EVT_MOUSE) { pos = press.mouse.y-1; } else { pos = press.key.code - 'a'; } if (0 <= pos && pos < floor_num) { track_object(-floor_list[pos]); handle_stuff(p_ptr); continue; } rdone = 1; } /* Now that the user's done with the display loop, let's */ /* the outer loop over again */ continue; } /* Done */ break; } /* Only one object to display */ else { /* Get the single object in the list */ object_type *o_ptr = object_byid(floor_list[0]); /* Allow user to recall an object */ press = target_recall_loop_object(o_ptr, y, x, out_val, s1, s2, s3, coords); /* Stop on everything but "return"/"space" */ if ((press.key.code != KC_ENTER) && (press.key.code != ' ')) break; /* Sometimes stop at "space" key */ if ((press.key.code == ' ') && !(mode & (TARGET_LOOK))) break; /* Plurals */ s1 = VERB_AGREEMENT(o_ptr->number, "It is ", "They are "); /* Preposition */ s2 = "on "; } } /* Double break */ if (this_o_idx) break; name = cave_apparent_name(cave, p_ptr, y, x); /* Terrain feature if needed */ if (boring || cave_isinteresting(cave, y, x)) { /* Hack -- handle unknown grids */ /* Pick a prefix */ if (*s2 && cave_isdoor(cave, y, x)) s2 = "in "; /* Pick proper indefinite article */ s3 = (is_a_vowel(name[0])) ? "an " : "a "; /* Hack -- special introduction for store doors */ if (cave_isshop(cave, y, x)) { s3 = "the entrance to the "; } /* Display a message */ if (p_ptr->wizard) { strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s (%d:%d).", s1, s2, s3, name, coords, y, x); } else { strnfmt(out_val, sizeof(out_val), "%s%s%s%s, %s.", s1, s2, s3, name, coords); } prt(out_val, 0, 0); move_cursor_relative(y, x); press = inkey_m(); if (press.type == EVT_MOUSE) { /* Stop on right click */ if (press.mouse.button == 2) break; } else { /* Stop on everything but "return"/"space" */ if ((press.key.code != KC_ENTER) && (press.key.code != ' ')) break; } } /* Stop on everything but "return" */ if (press.type == EVT_MOUSE) { /* Stop on right click */ if (press.mouse.button != 2) break; } else { if (press.key.code != KC_ENTER) break; } } /* Keep going */ return (press); } bool target_set_closest(int mode) { int y, x; monster_type *m_ptr; char m_name[80]; bool visibility; struct point_set *targets; /* Cancel old target */ target_set_monster(0); /* Get ready to do targetting */ targets = target_set_interactive_prepare(mode); /* If nothing was prepared, then return */ if (point_set_size(targets) < 1) { msg("No Available Target."); point_set_dispose(targets); return FALSE; } /* Find the first monster in the queue */ y = targets->pts[0].y; x = targets->pts[0].x; m_ptr = cave_monster_at(cave, y, x); /* Target the monster, if possible */ if (!target_able(m_ptr)) { msg("No Available Target."); point_set_dispose(targets); return FALSE; } /* Target the monster */ monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_CAPITAL); if (!(mode & TARGET_QUIET)) msg("%s is targeted.", m_name); Term_fresh(); /* Set up target information */ monster_race_track(m_ptr->race); health_track(p_ptr, m_ptr); target_set_monster(m_ptr); /* Visual cue */ Term_get_cursor(&visibility); (void)Term_set_cursor(TRUE); move_cursor_relative(y, x); Term_redraw_section(x, y, x, y); /* TODO: what's an appropriate amount of time to spend highlighting */ Term_xtra(TERM_XTRA_DELAY, 150); (void)Term_set_cursor(visibility); point_set_dispose(targets); return TRUE; } /** * Draw a visible path over the squares between (x1,y1) and (x2,y2). * * The path consists of "*", which are white except where there is a * monster, object or feature in the grid. * * This routine has (at least) three weaknesses: * - remembered objects/walls which are no longer present are not shown, * - squares which (e.g.) the player has walked through in the dark are * treated as unknown space. * - walls which appear strange due to hallucination aren't treated correctly. * * The first two result from information being lost from the dungeon arrays, * which requires changes elsewhere */ static int draw_path(u16b path_n, u16b *path_g, wchar_t *c, int *a, int y1, int x1) { int i; bool on_screen; /* No path, so do nothing. */ if (path_n < 1) return 0; /* The starting square is never drawn, but notice if it is being * displayed. In theory, it could be the last such square. */ on_screen = panel_contains(y1, x1); /* Draw the path. */ for (i = 0; i < path_n; i++) { byte colour; /* Find the co-ordinates on the level. */ int y = GRID_Y(path_g[i]); int x = GRID_X(path_g[i]); /* * As path[] is a straight line and the screen is oblong, * there is only section of path[] on-screen. * If the square being drawn is visible, this is part of it. * If none of it has been drawn, continue until some of it * is found or the last square is reached. * If some of it has been drawn, finish now as there are no * more visible squares to draw. */ if (panel_contains(y,x)) on_screen = TRUE; else if (on_screen) break; else continue; /* Find the position on-screen */ move_cursor_relative(y,x); /* This square is being overwritten, so save the original. */ Term_what(Term->scr->cx, Term->scr->cy, a+i, c+i); /* Choose a colour. */ if (cave->m_idx[y][x] && cave_monster_at(cave, y, x)->ml) { /* Visible monsters are red. */ monster_type *m_ptr = cave_monster_at(cave, y, x); /* Mimics act as objects */ if (rf_has(m_ptr->race->flags, RF_UNAWARE)) colour = TERM_YELLOW; else colour = TERM_L_RED; } else if (cave->o_idx[y][x] && object_byid(cave->o_idx[y][x])->marked) /* Known objects are yellow. */ colour = TERM_YELLOW; else if (!cave_ispassable(cave, y,x) && ((cave->info[y][x] & (CAVE_MARK)) || player_can_see_bold(y,x))) /* Known walls are blue. */ colour = TERM_BLUE; else if (!(cave->info[y][x] & (CAVE_MARK)) && !player_can_see_bold(y,x)) /* Unknown squares are grey. */ colour = TERM_L_DARK; else /* Unoccupied squares are white. */ colour = TERM_WHITE; /* Draw the path segment */ (void)Term_addch(colour, L'*'); } return i; } /** * Load the attr/char at each point along "path" which is on screen from * "a" and "c". This was saved in draw_path(). */ static void load_path(u16b path_n, u16b *path_g, wchar_t *c, int *a) { int i; for (i = 0; i < path_n; i++) { int y = GRID_Y(path_g[i]); int x = GRID_X(path_g[i]); if (!panel_contains(y, x)) continue; move_cursor_relative(y, x); Term_addch(a[i], c[i]); } Term_fresh(); } /* * Handle "target" and "look". * * Note that this code can be called from "get_aim_dir()". * * Currently, when "flag" is true, that is, when * "interesting" grids are being used, and a directional key is used, we * only scroll by a single panel, in the direction requested, and check * for any interesting grids on that panel. The "correct" solution would * actually involve scanning a larger set of grids, including ones in * panels which are adjacent to the one currently scanned, but this is * overkill for this function. XXX XXX * * Hack -- targetting/observing an "outer border grid" may induce * problems, so this is not currently allowed. * * The player can use the direction keys to move among "interesting" * grids in a heuristic manner, or the "space", "+", and "-" keys to * move through the "interesting" grids in a sequential manner, or * can enter "location" mode, and use the direction keys to move one * grid at a time in any direction. The "t" (set target) command will * only target a monster (as opposed to a location) if the monster is * target_able and the "interesting" mode is being used. * * The current grid is described using the "look" method above, and * a new command may be entered at any time, but note that if the * "TARGET_LOOK" bit flag is set (or if we are in "location" mode, * where "space" has no obvious meaning) then "space" will scan * through the description of the current grid until done, instead * of immediately jumping to the next "interesting" grid. This * allows the "target" command to retain its old semantics. * * The "*", "+", and "-" keys may always be used to jump immediately * to the next (or previous) interesting grid, in the proper mode. * * The "return" key may always be used to scan through a complete * grid description (forever). * * This command will cancel any old target, even if used from * inside the "look" command. * * * 'mode' is one of TARGET_LOOK or TARGET_KILL. * 'x' and 'y' are the initial position of the target to be highlighted, * or -1 if no location is specified. * Returns TRUE if a target has been successfully set, FALSE otherwise. */ bool target_set_interactive(int mode, int x, int y) { int py = p_ptr->py; int px = p_ptr->px; int path_n; u16b path_g[256]; int i, d, m, t, bd; int wid, hgt, help_prompt_loc; bool done = FALSE; bool flag = TRUE; bool help = FALSE; //struct keypress query; ui_event press; /* These are used for displaying the path to the target */ wchar_t path_char[MAX_RANGE_LGE]; int path_attr[MAX_RANGE_LGE]; struct point_set *targets; /* If we haven't been given an initial location, start on the player. */ if (x == -1 || y == -1) { x = p_ptr->px; y = p_ptr->py; } /* If we /have/ been given an initial location, make sure we honour it by going into "free targetting" mode. */ else { flag = FALSE; } /* Cancel target */ target_set_monster(0); /* Cancel tracking */ /* health_track(NULL); */ /* Calculate the window location for the help prompt */ Term_get_size(&wid, &hgt); help_prompt_loc = hgt - 1; /* Display the help prompt */ prt("Press '?' for help.", help_prompt_loc, 0); /* Prepare the target set */ targets = target_set_interactive_prepare(mode); /* Start near the player */ m = 0; /* Interact */ while (!done) { bool path_drawn = FALSE; /* Interesting grids */ if (flag && point_set_size(targets)) { y = targets->pts[m].y; x = targets->pts[m].x; /* Adjust panel if needed */ if (adjust_panel_help(y, x, help)) handle_stuff(p_ptr); /* Update help */ if (help) { bool good_target = target_able(cave_monster_at(cave, y, x)); target_display_help(good_target, !(flag && point_set_size(targets))); } /* Find the path. */ path_n = project_path(path_g, MAX_RANGE, py, px, y, x, PROJECT_THRU); /* Draw the path in "target" mode. If there is one */ if (mode & (TARGET_KILL)) path_drawn = draw_path(path_n, path_g, path_char, path_attr, py, px); /* Describe and Prompt */ press = target_set_interactive_aux(y, x, mode); /* Remove the path */ if (path_drawn) load_path(path_n, path_g, path_char, path_attr); /* Cancel tracking */ /* health_track(NULL); */ /* Assume no "direction" */ d = 0; /* Analyze */ if (press.type == EVT_MOUSE) { if (press.mouse.button == 3) { /* give the target selection command */ press.mouse.button = 2; press.mouse.mods = KC_MOD_CONTROL; } if (press.mouse.button == 2) { y = KEY_GRID_Y(press);//.mouse.y; x = KEY_GRID_X(press);//.mouse.x; if (press.mouse.mods & KC_MOD_CONTROL) { /* same as keyboard target selection command below */ struct monster *m = cave_monster_at(cave, y, x); if (target_able(m)) { /* Set up target information */ monster_race_track(m->race); health_track(p_ptr, m); target_set_monster(m); done = TRUE; } else { bell("Illegal target!"); } } else if (press.mouse.mods & KC_MOD_ALT) { /* go to spot - same as 'g' command below */ cmd_insert(CMD_PATHFIND); cmd_set_arg_point(cmd_get_top(), 0, y, x); done = TRUE; } else { /* cancel look mode */ done = TRUE; } } else /*if (press.mouse.button == 3) { } else*/ { y = KEY_GRID_Y(press);//.mouse.y; x = KEY_GRID_X(press);//.mouse.x; if (cave->m_idx[y][x] || cave->o_idx[y][x]){// || cave->feat[y][x]&) { /* reset the flag, to make sure we stay in this mode if * something is actually there */ flag = FALSE; /* scan the interesting list and see if there in anything here */ for (i = 0; i < point_set_size(targets); i++) { if ((y == targets->pts[i].y) && (x == targets->pts[i].x)) { m = i; flag = TRUE; break; } } } else { flag = FALSE; } } } else switch (press.key.code) { case ESCAPE: case 'q': { done = TRUE; break; } case ' ': case '*': case '+': { if (++m == point_set_size(targets)) m = 0; break; } case '-': { if (m-- == 0) m = point_set_size(targets) - 1; break; } case 'p': { /* Recenter around player */ verify_panel(); /* Handle stuff */ handle_stuff(p_ptr); y = p_ptr->py; x = p_ptr->px; } case 'o': { flag = FALSE; break; } case 'm': { break; } case 't': case '5': case '0': case '.': { struct monster *m = cave_monster_at(cave, y, x); if (target_able(m)) { health_track(p_ptr, m); target_set_monster(m); done = TRUE; } else { bell("Illegal target!"); } break; } case 'g': { cmd_insert(CMD_PATHFIND); cmd_set_arg_point(cmd_get_top(), 0, y, x); done = TRUE; break; } case '?': { help = !help; /* Redraw main window */ p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIP); Term_clear(); handle_stuff(p_ptr); if (!help) prt("Press '?' for help.", help_prompt_loc, 0); break; } default: { /* Extract direction */ d = target_dir(press.key); /* Oops */ if (!d) bell("Illegal command for target mode!"); break; } } /* Hack -- move around */ if (d) { int old_y = targets->pts[m].y; int old_x = targets->pts[m].x; /* Find a new monster */ i = target_pick(old_y, old_x, ddy[d], ddx[d], targets); /* Scroll to find interesting grid */ if (i < 0) { int old_wy = Term->offset_y; int old_wx = Term->offset_x; /* Change if legal */ if (change_panel(d)) { /* Recalculate interesting grids */ point_set_dispose(targets); targets = target_set_interactive_prepare(mode); /* Find a new monster */ i = target_pick(old_y, old_x, ddy[d], ddx[d], targets); /* Restore panel if needed */ if ((i < 0) && modify_panel(Term, old_wy, old_wx)) { /* Recalculate interesting grids */ point_set_dispose(targets); targets = target_set_interactive_prepare(mode); } /* Handle stuff */ handle_stuff(p_ptr); } } /* Use interesting grid if found */ if (i >= 0) m = i; } } /* Arbitrary grids */ else { /* Update help */ if (help) { bool good_target = target_able(cave_monster_at(cave, y, x)); target_display_help(good_target, !(flag && point_set_size(targets))); } /* Find the path. */ path_n = project_path(path_g, MAX_RANGE, py, px, y, x, PROJECT_THRU); /* Draw the path in "target" mode. If there is one */ if (mode & (TARGET_KILL)) path_drawn = draw_path (path_n, path_g, path_char, path_attr, py, px); /* Describe and Prompt (enable "TARGET_LOOK") */ press = target_set_interactive_aux(y, x, mode | TARGET_LOOK); /* Remove the path */ if (path_drawn) load_path(path_n, path_g, path_char, path_attr); /* Cancel tracking */ /* health_track(0); */ /* Assume no direction */ d = 0; /* Analyze the keypress */ if (press.type == EVT_MOUSE) { if (press.mouse.button == 3) { /* give the target selection command */ press.mouse.button = 2; press.mouse.mods = KC_MOD_CONTROL; } if (press.mouse.button == 2) { if (mode & (TARGET_KILL)) { if ((y == KEY_GRID_Y(press)) && (x == KEY_GRID_X(press))) { d = -1; } } y = KEY_GRID_Y(press);//.mouse.y; x = KEY_GRID_X(press);//.mouse.x; if (press.mouse.mods & KC_MOD_CONTROL) { /* same as keyboard target selection command below */ target_set_location(y, x); done = TRUE; } else if (press.mouse.mods & KC_MOD_ALT) { /* go to spot - same as 'g' command below */ cmd_insert(CMD_PATHFIND); cmd_set_arg_point(cmd_get_top(), 0, y, x); done = TRUE; } else { /* cancel look mode */ done = TRUE; if (d == -1) { target_set_location(y, x); d = 0; } } } else /*if (press.mouse.button == 3) { } else*/ { int dungeon_hgt = cave->height; int dungeon_wid = cave->width; y = KEY_GRID_Y(press);//.mouse.y; x = KEY_GRID_X(press);//.mouse.x; if (Term) { if (press.mouse.y <= 1) { /* move the screen north */ y--; } else if (press.mouse.y >= (Term->hgt - 2)) { /* move the screen south */ y++; } else if (press.mouse.x <= COL_MAP) { /* move the screen in west */ x--; } else if (press.mouse.x >= (Term->wid - 2)) { /* move the screen east */ x++; } } if (y < 0) y = 0; if (x < 0) x = 0; if (y >= dungeon_hgt-1) y = dungeon_hgt-1; if (x >= dungeon_wid-1) x = dungeon_wid-1; /* Adjust panel if needed */ if (adjust_panel_help(y, x, help)) { /* Handle stuff */ handle_stuff(p_ptr); /* Recalculate interesting grids */ point_set_dispose(targets); targets = target_set_interactive_prepare(mode); } if (cave->m_idx[y][x] || cave->o_idx[y][x]) { /* scan the interesting list and see if there in anything here */ for (i = 0; i < point_set_size(targets); i++) { if ((y == targets->pts[i].y) && (x == targets->pts[i].x)) { m = i; flag = TRUE; break; } } } else { flag = FALSE; } } } else switch (press.key.code) { case ESCAPE: case 'q': { done = TRUE; break; } case ' ': case '*': case '+': case '-': { break; } case 'p': { /* Recenter around player */ verify_panel(); /* Handle stuff */ handle_stuff(p_ptr); y = p_ptr->py; x = p_ptr->px; } case 'o': { break; } case 'm': { flag = TRUE; m = 0; bd = 999; /* Pick a nearby monster */ for (i = 0; i < point_set_size(targets); i++) { t = distance(y, x, targets->pts[i].y, targets->pts[i].x); /* Pick closest */ if (t < bd) { m = i; bd = t; } } /* Nothing interesting */ if (bd == 999) flag = FALSE; break; } case 't': case '5': case '0': case '.': { target_set_location(y, x); done = TRUE; break; } case 'g': { cmd_insert(CMD_PATHFIND); cmd_set_arg_point(cmd_get_top(), 0, y, x); done = TRUE; break; } case '?': { help = !help; /* Redraw main window */ p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIP); Term_clear(); handle_stuff(p_ptr); if (!help) prt("Press '?' for help.", help_prompt_loc, 0); break; } default: { /* Extract a direction */ d = target_dir(press.key); /* Oops */ if (!d) bell("Illegal command for target mode!"); break; } } /* Handle "direction" */ if (d) { int dungeon_hgt = cave->height; int dungeon_wid = cave->width; /* Move */ x += ddx[d]; y += ddy[d]; /* Slide into legality */ if (x >= dungeon_wid - 1) x--; else if (x <= 0) x++; /* Slide into legality */ if (y >= dungeon_hgt - 1) y--; else if (y <= 0) y++; /* Adjust panel if needed */ if (adjust_panel_help(y, x, help)) { /* Handle stuff */ handle_stuff(p_ptr); /* Recalculate interesting grids */ point_set_dispose(targets); targets = target_set_interactive_prepare(mode); } } } } /* Forget */ point_set_dispose(targets); /* Redraw as necessary */ if (help) { p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIP); Term_clear(); } else { prt("", 0, 0); prt("", help_prompt_loc, 0); p_ptr->redraw |= (PR_DEPTH | PR_STATUS); } /* Recenter around player */ verify_panel(); /* Handle stuff */ handle_stuff(p_ptr); /* Failure to set target */ if (!target_set) return (FALSE); /* Success */ return (TRUE); } /** * Obtains the location the player currently targets. * * Both `col` and `row` must point somewhere, and on function termination, * contain the X and Y locations respectively. */ void target_get(s16b *col, s16b *row) { assert(col); assert(row); *col = target_x; *row = target_y; } /** * Returns the currently targeted monster index. */ struct monster *target_get_monster(void) { return target_who; } /* * True if the player's current target is in LOS. */ bool target_sighted(void) { return target_okay() && panel_contains(target_y, target_x) && /* either the target is a grid and is visible, or it is a monster that is visible */ ((!target_who && player_can_see_bold(target_y, target_x)) || (target_who && target_who->ml)); } angband-3.5.1/src/savefile.c0000644000175000017500000003453212456456606015200 0ustar chriscchrisc/* * File: savefile.c * Purpose: Savefile loading and saving main routines * * Copyright (c) 2009 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include #include "angband.h" #include "savefile.h" /** * The savefile code. * * Savefiles since ~3.1 have used a block-based system. Each savefile * consists of an 8-byte header, the first four bytes of which mark this * as a savefile, the second four bytes provide a variant ID. * * After that, each block has the format: * - 16-byte string giving the type of block * - 4-byte block version * - 4-byte block size * - 4-byte block checksum * ... data ... * padding so that block is a multiple of 4 bytes * * The savefile deosn't contain the version number of that game that saved it; * versioning is left at the individual block level. The current code * keeps a list of savefile blocks to save in savers[] below, along with * their current versions. * * For each block type and version, there is a loading function to load that * type/version combination. For example, there may be a loader for v1 * and v2 of the RNG block; these must be different functions. It has been * done this way since it allows easier maintenance; after each release, you * need simply remove old loaders and you will not have to disentangle * lots of code with "if (version > 3)" and its like everywhere. * * Savefile loading and saving is done by keeping the current block in * memory, which is accessed using the wr_* and rd_* functions. This is * then written out, whole, to disk, with the appropriate header. * * * So, if you want to make a savefile compat-breaking change, then there are * a few things you should do: * * - increment the version in 'savers' below * - add a loading function that accepts the new version (in addition to * the previous loading function) to 'loaders' * - and watch the magic happen. * * * TODO: * - wr_ and rd_ should be passed a buffer to work with, rather than using * the rd_ and wr_ functions with a universal buffer * - */ /** Magic bits at beginning of savefile */ static const byte savefile_magic[4] = { 83, 97, 118, 101 }; static const byte savefile_name[4] = "VNLA"; /* Some useful types */ typedef int (*loader_t)(void); struct blockheader { char name[16]; u32b version; u32b size; }; struct blockinfo { char name[16]; loader_t loader; u32b version; }; /** Savefile saving functions */ static const struct { char name[16]; void (*save)(void); u32b version; } savers[] = { { "description", wr_description, 1 }, { "rng", wr_randomizer, 1 }, { "options", wr_options, 2 }, { "messages", wr_messages, 1 }, { "monster memory", wr_monster_memory, 3 }, { "object memory", wr_object_memory, 2 }, { "quests", wr_quests, 1 }, { "artifacts", wr_artifacts, 2 }, { "player", wr_player, 3 }, { "squelch", wr_squelch, 1 }, { "misc", wr_misc, 2 }, { "player hp", wr_player_hp, 1 }, { "player spells", wr_player_spells, 1 }, { "inventory", wr_inventory, 6 }, { "stores", wr_stores, 6 }, { "dungeon", wr_dungeon, 1 }, { "objects", wr_objects, 6 }, { "monsters", wr_monsters, 7 }, { "ghost", wr_ghost, 1 }, { "history", wr_history, 1 }, }; /** Savefile loading functions */ static const struct blockinfo loaders[] = { { "description", rd_null, 1 }, { "ghost", rd_null, 1 }, { "randarts", rd_null, 3 }, { "rng", rd_randomizer, 1 }, { "options", rd_options_2, 2 }, { "messages", rd_messages, 1 }, { "monster memory", rd_monster_memory_2, 2 }, { "monster memory", rd_monster_memory_3, 3 }, { "object memory", rd_object_memory_1, 1 }, { "object memory", rd_object_memory_2, 2 }, { "quests", rd_quests, 1 }, { "artifacts", rd_artifacts, 2 }, { "player", rd_player_2, 2 }, { "player", rd_player_3, 3 }, { "squelch", rd_squelch, 1 }, { "misc", rd_misc, 1 }, { "misc", rd_misc_2, 2}, { "player hp", rd_player_hp, 1 }, { "player spells", rd_player_spells, 1 }, { "inventory", rd_inventory_1, 1 }, { "inventory", rd_inventory_2, 2 }, { "inventory", rd_inventory_3, 3 }, { "inventory", rd_inventory_4, 4 }, { "inventory", rd_inventory_5, 5 }, { "inventory", rd_inventory_6, 6 }, { "stores", rd_stores_1, 1 }, { "stores", rd_stores_2, 2 }, { "stores", rd_stores_3, 3 }, { "stores", rd_stores_4, 4 }, { "stores", rd_stores_5, 5 }, { "stores", rd_stores_6, 6 }, { "dungeon", rd_dungeon, 1 }, { "objects", rd_objects_1, 1 }, { "objects", rd_objects_2, 2 }, { "objects", rd_objects_3, 3 }, { "objects", rd_objects_4, 4 }, { "objects", rd_objects_5, 5 }, { "objects", rd_objects_6, 6 }, { "monsters", rd_monsters_6, 6 }, { "monsters", rd_monsters_7, 7 }, { "history", rd_history, 1 }, }; /* Buffer bits */ static byte *buffer; static u32b buffer_size; static u32b buffer_pos; static u32b buffer_check; #define BUFFER_INITIAL_SIZE 1024 #define BUFFER_BLOCK_INCREMENT 1024 #define SAVEFILE_HEAD_SIZE 28 /** Utility **/ /* * Hack -- Show information on the screen, one line at a time. * * Avoid the top two lines, to avoid interference with "note()". */ void note(const char *message) { static int y = 2; /* Draw the message */ prt(message, y, 0); pause_line(Term); /* Advance one line (wrap if needed) */ if (++y >= 24) y = 2; /* Flush it */ Term_fresh(); } /** Base put/get **/ static void sf_put(byte v) { assert(buffer != NULL); assert(buffer_size > 0); if (buffer_size == buffer_pos) { buffer_size += BUFFER_BLOCK_INCREMENT; buffer = mem_realloc(buffer, buffer_size); } assert(buffer_pos < buffer_size); buffer[buffer_pos++] = v; buffer_check += v; } static byte sf_get(void) { assert(buffer != NULL); assert(buffer_size > 0); assert(buffer_pos < buffer_size); buffer_check += buffer[buffer_pos]; return buffer[buffer_pos++]; } /* accessor */ void wr_byte(byte v) { sf_put(v); } void wr_u16b(u16b v) { sf_put((byte)(v & 0xFF)); sf_put((byte)((v >> 8) & 0xFF)); } void wr_s16b(s16b v) { wr_u16b((u16b)v); } void wr_u32b(u32b v) { sf_put((byte)(v & 0xFF)); sf_put((byte)((v >> 8) & 0xFF)); sf_put((byte)((v >> 16) & 0xFF)); sf_put((byte)((v >> 24) & 0xFF)); } void wr_s32b(s32b v) { wr_u32b((u32b)v); } void wr_string(const char *str) { while (*str) { wr_byte(*str); str++; } wr_byte(*str); } void rd_byte(byte *ip) { *ip = sf_get(); } void rd_u16b(u16b *ip) { (*ip) = sf_get(); (*ip) |= ((u16b)(sf_get()) << 8); } void rd_s16b(s16b *ip) { rd_u16b((u16b*)ip); } void rd_u32b(u32b *ip) { (*ip) = sf_get(); (*ip) |= ((u32b)(sf_get()) << 8); (*ip) |= ((u32b)(sf_get()) << 16); (*ip) |= ((u32b)(sf_get()) << 24); } void rd_s32b(s32b *ip) { rd_u32b((u32b*)ip); } void rd_string(char *str, int max) { byte tmp8u; int i = 0; do { rd_byte(&tmp8u); if (i < max) str[i] = tmp8u; if (!tmp8u) break; } while (++i); str[max - 1] = '\0'; } void strip_bytes(int n) { byte tmp8u; while (n--) rd_byte(&tmp8u); } void pad_bytes(int n) { while (n--) wr_byte(0); } /*** Savefile saving functions ***/ static bool try_save(ang_file *file) { byte savefile_head[SAVEFILE_HEAD_SIZE]; size_t i, pos; /* Start off the buffer */ buffer = mem_alloc(BUFFER_INITIAL_SIZE); buffer_size = BUFFER_INITIAL_SIZE; for (i = 0; i < N_ELEMENTS(savers); i++) { buffer_pos = 0; buffer_check = 0; savers[i].save(); /* 16-byte block name */ pos = my_strcpy((char *)savefile_head, savers[i].name, sizeof savefile_head); while (pos < 16) savefile_head[pos++] = 0; #define SAVE_U32B(v) \ savefile_head[pos++] = (v & 0xFF); \ savefile_head[pos++] = ((v >> 8) & 0xFF); \ savefile_head[pos++] = ((v >> 16) & 0xFF); \ savefile_head[pos++] = ((v >> 24) & 0xFF); SAVE_U32B(savers[i].version); SAVE_U32B(buffer_pos); SAVE_U32B(buffer_check); assert(pos == SAVEFILE_HEAD_SIZE); file_write(file, (char *)savefile_head, SAVEFILE_HEAD_SIZE); file_write(file, (char *)buffer, buffer_pos); /* pad to 4 byte multiples */ if (buffer_pos % 4) file_write(file, "xxx", 4 - (buffer_pos % 4)); } mem_free(buffer); return TRUE; } /* * Set the savefile name. */ void savefile_set_name(const char *fname) { char path[128]; #if defined(SETGID) /* Rename the savefile, using the player_uid and base_name */ strnfmt(path, sizeof(path), "%d.%s", player_uid, fname); #else /* Rename the savefile, using the base name */ strnfmt(path, sizeof(path), "%s", fname); #endif /* Save the path */ path_build(savefile, sizeof(savefile), ANGBAND_DIR_SAVE, path); } /* * Attempt to save the player in a savefile */ bool savefile_save(const char *path) { ang_file *file; int count = 0; char new_savefile[1024]; char old_savefile[1024]; /* New savefile */ strnfmt(old_savefile, sizeof(old_savefile), "%s%u.old", path,Rand_simple(1000000)); while (file_exists(old_savefile) && (count++ < 100)) { strnfmt(old_savefile, sizeof(old_savefile), "%s%u%u.old", path,Rand_simple(1000000),count); } count = 0; /* Make sure that the savefile doesn't already exist */ /*safe_setuid_grab(); file_delete(new_savefile); file_delete(old_savefile); safe_setuid_drop();*/ /* Open the savefile */ safe_setuid_grab(); strnfmt(new_savefile, sizeof(new_savefile), "%s%u.new", path,Rand_simple(1000000)); while (file_exists(new_savefile) && (count++ < 100)) { strnfmt(new_savefile, sizeof(new_savefile), "%s%u%u.new", path,Rand_simple(1000000),count); } file = file_open(new_savefile, MODE_WRITE, FTYPE_SAVE); safe_setuid_drop(); if (file) { file_write(file, (char *) &savefile_magic, 4); file_write(file, (char *) &savefile_name, 4); character_saved = try_save(file); file_close(file); } if (character_saved) { bool err = FALSE; safe_setuid_grab(); if (file_exists(savefile) && !file_move(savefile, old_savefile)) err = TRUE; if (!err) { if (!file_move(new_savefile, savefile)) err = TRUE; if (err) file_move(old_savefile, savefile); else file_delete(old_savefile); } safe_setuid_drop(); return err ? FALSE : TRUE; } /* Delete temp file if the save failed */ if (file) { /* file is no longer valid, but it still points to a non zero * value if the file was created above */ safe_setuid_grab(); file_delete(new_savefile); safe_setuid_drop(); } return FALSE; } /*** Savefile loading functions ***/ /* Check the savefile header file clearly inicates that it's a savefile */ static bool check_header(ang_file *f) { byte head[8]; if (file_read(f, (char *) &head, 8) == 8 && memcmp(&head[0], savefile_magic, 4) == 0 && memcmp(&head[4], savefile_name, 4) == 0) return TRUE; return FALSE; } /* Get the next block header from the savefile */ static errr next_blockheader(ang_file *f, struct blockheader *b) { byte savefile_head[SAVEFILE_HEAD_SIZE]; size_t len; len = file_read(f, (char *)savefile_head, SAVEFILE_HEAD_SIZE); if (len == 0) /* no more blocks */ return 1; if (len != SAVEFILE_HEAD_SIZE || savefile_head[15] != 0) { return -1; } #define RECONSTRUCT_U32B(from) \ ((u32b) savefile_head[from]) | \ ((u32b) savefile_head[from+1] << 8) | \ ((u32b) savefile_head[from+2] << 16) | \ ((u32b) savefile_head[from+3] << 24); my_strcpy(b->name, (char *)&savefile_head, sizeof b->name); b->version = RECONSTRUCT_U32B(16); b->size = RECONSTRUCT_U32B(20); /* pad to 4 bytes */ if (b->size % 4) b->size += 4 - (b->size % 4); return 0; } /* Find the right loader for this block, return it */ static loader_t find_loader(struct blockheader *b, const struct blockinfo *loaders) { size_t i = 0; /* Find the right loader */ for (i = 0; loaders[i].name[0]; i++) { if (!streq(b->name, loaders[i].name)) continue; if (b->version != loaders[i].version) continue; return loaders[i].loader; } return NULL; } /* Load a given block with the given loader */ static bool load_block(ang_file *f, struct blockheader *b, loader_t loader) { /* Allocate space for the buffer */ buffer = mem_alloc(b->size); buffer_pos = 0; buffer_check = 0; buffer_size = file_read(f, (char *) buffer, b->size); if (buffer_size != b->size || loader() != 0) { mem_free(buffer); return FALSE; } mem_free(buffer); return TRUE; } /* Skip a block */ static void skip_block(ang_file *f, struct blockheader *b) { file_skip(f, b->size); } /* Try to load a savefile */ static bool try_load(ang_file *f, const struct blockinfo *loaders) { struct blockheader b; errr err; if (!check_header(f)) { note("Savefile is corrupted -- incorrect file header."); return FALSE; } /* Get the next block header */ while ((err = next_blockheader(f, &b)) == 0) { loader_t loader = find_loader(&b, loaders); if (!loader) { note("Savefile block can't be read."); note("Maybe try and load the savefile in an earlier version of Angband."); return FALSE; } if (!load_block(f, &b, loader)) { note(format("Savefile corrupted - Couldn't load block %s", b.name)); return FALSE; } } if (err == -1) { note("Savefile is corrupted -- block header mangled."); return FALSE; } /* XXX Reset cause of death */ if (p_ptr->chp >= 0) my_strcpy(p_ptr->died_from, "(alive and well)", sizeof(p_ptr->died_from)); return TRUE; } /* XXX this isn't nice but it'll have to do */ static char savefile_desc[120]; static int get_desc(void) { rd_string(savefile_desc, sizeof savefile_desc); return 0; } /** * Try to get the 'description' block from a savefile. Fail gracefully. */ const char *savefile_get_description(const char *path) { errr err; struct blockheader b; ang_file *f = file_open(path, MODE_READ, FTYPE_TEXT); if (!f) return NULL; /* Blank the description */ savefile_desc[0] = 0; if (!check_header(f)) { my_strcpy(savefile_desc, "Invalid savefile", sizeof savefile_desc); } else { while ((err = next_blockheader(f, &b)) == 0) { if (!streq(b.name, "description")) { skip_block(f, &b); continue; } load_block(f, &b, get_desc); break; } } file_close(f); return savefile_desc; } /** * Load a savefile. */ bool savefile_load(const char *path) { bool ok; ang_file *f = file_open(path, MODE_READ, FTYPE_TEXT); if (!f) { note("Couldn't open savefile."); return FALSE; } ok = try_load(f, loaders); file_close(f); return ok; } angband-3.5.1/src/list-effects.h0000644000175000017500000005016312456456606015775 0ustar chriscchrisc/* * File: list-effects.h * Purpose: List of effect types */ /* * "rating" is the power rating for an item activation, as a damage-per-blow * equivalent (x2). These ratings are used in the calculation of the power (and * therefore cost) of an item which has the effect as an activation, but NOT * for other items (e.g. potions, scrolls). Hence the use of INIHIBIT_POWER. */ /* name aim? rating short description */ EFFECT(XXX, FALSE, 0, NULL) EFFECT(POISON, FALSE, 0, "poisons you for 2d7+10 turns") EFFECT(BLIND, FALSE, 0, "blinds you for 4d25+75 turns") EFFECT(SCARE, FALSE, 0, "induces fear in you for 1d10+10 turns") EFFECT(CONFUSE, FALSE, 0, "confuses you for 4d5+10 turns") EFFECT(HALLUC, FALSE, 0, "causes you to hallucinate") EFFECT(PARALYZE, FALSE, 0, "induces paralysis for 1d5+5 turns") EFFECT(SLOW, FALSE, 0, "slows you for 1d25+15 turns") EFFECT(CURE_POISON, FALSE, 1, "neutralizes poison") EFFECT(CURE_BLINDNESS, FALSE, 4, "cures blindness") EFFECT(CURE_PARANOIA, FALSE, 2, "removes your fear") EFFECT(CURE_CONFUSION, FALSE, 4, "cures confusion") EFFECT(CURE_MIND, FALSE, 8, "restores 10SP, cures confusion and hallucination, removes fear and grants you temporary resistance to confusion") EFFECT(CURE_BODY, FALSE, 7, "heals 30 hitpoints, cut damage, and cures stunning, poison and blindness") EFFECT(CURE_LIGHT, FALSE, 3, "heals 20 hitpoints, some cut damage, makes you a little less confused, and cures blindness") EFFECT(CURE_SERIOUS, FALSE, 6, "heals 40 hitpoints, cut damage, and cures blindness and confusion") EFFECT(CURE_CRITICAL, FALSE, 9, "heals 60 hitpoints, cut damage, and cures stunning, poisoning, blindness, and confusion") EFFECT(CURE_FULL, FALSE, 12, "heals 35% of max HP (minimum 300HP), cut damage, and cures stunning, poisoning, blindness, and confusion") EFFECT(CURE_FULL2, FALSE, 18, "heals 1200 hit points, cut damage, and cures stunning, poisoning, blindness, and confusion") EFFECT(CURE_NONORLYBIG,FALSE, 21, "heals 5000 hit points, restores experience and stats, heals cut damage, and cures stunning, poison, blindness, and confusion") EFFECT(CURE_TEMP, FALSE, 9, "heals cut damage, and cures all stunning, poison, blindness and confusion") EFFECT(HEAL1, FALSE, 13, "heals 500 hit points") EFFECT(HEAL2, FALSE, 16, "heals 1000 hit points") EFFECT(HEAL3, FALSE, 14, "heals 500 hit points, heals cut damage, and cures stunning") EFFECT(GAIN_EXP, FALSE, INHIBIT_POWER, "grants 100,000 experience points") EFFECT(LOSE_EXP, FALSE, 0, "drains a quarter of your experience") EFFECT(RESTORE_EXP, FALSE, 8, "restores your experience") EFFECT(RESTORE_MANA, FALSE, 20, "restores your mana points to maximum") EFFECT(GAIN_STR, FALSE, INHIBIT_POWER, "restores and increases your strength") EFFECT(GAIN_INT, FALSE, INHIBIT_POWER, "restores and increases your intelligence") EFFECT(GAIN_WIS, FALSE, INHIBIT_POWER, "restores and increases your wisdom") EFFECT(GAIN_DEX, FALSE, INHIBIT_POWER, "restores and increases your dexterity") EFFECT(GAIN_CON, FALSE, INHIBIT_POWER, "restores and increases your constitution") EFFECT(GAIN_ALL, FALSE, INHIBIT_POWER, "restores and increases all your stats") EFFECT(BRAWN, FALSE, 30, "raises your strength at the expense of a random attribute") EFFECT(INTELLECT, FALSE, 25, "raises your intelligence at the expense of a random attribute") EFFECT(CONTEMPLATION, FALSE, 25, "raises your wisdom at the expense of a random attribute") EFFECT(TOUGHNESS, FALSE, 30, "raises your constitution at the expense of a random attribute") EFFECT(NIMBLENESS, FALSE, 25, "raises your dexterity at the expense of a random attribute") EFFECT(LOSE_STR, FALSE, 0, "reduces your strength with damage 5d5") EFFECT(LOSE_INT, FALSE, 0, "reduces your intelligence with damage 5d5") EFFECT(LOSE_WIS, FALSE, 0, "reduces your wisdom with damage 5d5") EFFECT(LOSE_DEX, FALSE, 0, "reduces your dexterity with damage 5d5") EFFECT(LOSE_CON, FALSE, 0, "reduces your constitution with damage 5d5") EFFECT(LOSE_CON2, FALSE, 0, "reduces your constitution with damage 10d10") EFFECT(RESTORE_STR, FALSE, 10, "restores your strength") EFFECT(RESTORE_INT, FALSE, 8, "restores your intelligence") EFFECT(RESTORE_WIS, FALSE, 8, "restores your wisdom") EFFECT(RESTORE_DEX, FALSE, 9, "restores your dexterity") EFFECT(RESTORE_CON, FALSE, 10, "restores your constitution") EFFECT(RESTORE_ALL, FALSE, 15, "restores all your stats") EFFECT(RESTORE_ST_LEV, FALSE, 17, "restores all your stats and your experience points") EFFECT(TMD_INFRA, FALSE, 5, "extends your infravision by 50 feet for 4d25+100 turns") EFFECT(TMD_SINVIS, FALSE, 7, "cures blindness and allows you to see invisible things for 2d6+12 turns") EFFECT(TMD_ESP, FALSE, 10, "cures blindness and gives you telepathy for 6d6+12 turns") EFFECT(ENLIGHTENMENT, FALSE, 22, "completely lights up and magically maps the level") EFFECT(ENLIGHTENMENT2, FALSE, INHIBIT_POWER, "increases your intelligence and wisdom, detects and maps everything in the surrounding area, and identifies all items in your pack") EFFECT(HERO, FALSE, 7, "restores 10 hit points, removes fear and grants you resistance to fear and +12 to-hit for 1d25+25 turns") EFFECT(SHERO, FALSE, 9, "restores 30 hit points, removes fear and grants you resistance to fear, +24 to-hit, and -10AC for 1d25+25 turns") EFFECT(RESIST_ACID, FALSE, 4, "grants temporary resistance to acid for 1d10+10 turns") EFFECT(RESIST_ELEC, FALSE, 4, "grants temporary resistance to electricity for 1d10+10 turns") EFFECT(RESIST_FIRE, FALSE, 4, "grants temporary resistance to fire for 1d10+10 turns") EFFECT(RESIST_COLD, FALSE, 4, "grants temporary resistance to cold for 1d10+10 turns") EFFECT(RESIST_POIS, FALSE, 4, "grants temporary resistance to poison for 1d10+10 turns") EFFECT(RESIST_ALL, FALSE, 10, "grants temporary resistance to acid, electricity, fire, cold and poison for 1d20+20 turns") EFFECT(DETECT_TREASURE, FALSE, 6, "detects gold and objects nearby") EFFECT(DETECT_TRAP, FALSE, 6, "detects traps nearby") EFFECT(DETECT_DOORSTAIR, FALSE, 6, "detects doors and stairs nearby") EFFECT(DETECT_INVIS, FALSE, 6, "detects invisible creatures nearby") EFFECT(DETECT_EVIL, FALSE, 6, "detects evil creatures nearby") EFFECT(DETECT_ALL, FALSE, 10, "detects treasure, traps, doors, stairs, and all creatures nearby") EFFECT(ENCHANT_TOHIT, FALSE, 15, "attempts to magically enhance a weapon's to-hit bonus. Also gives a chance to break a curse") EFFECT(ENCHANT_TODAM, FALSE, 20, "attempts to magically enhance a weapon's to-dam bonus. Also gives a chance to break a curse") EFFECT(ENCHANT_WEAPON, FALSE, 22, "attempts to magically enhance a weapon both to-hit and to-dam. Also gives a chance to break a curse") EFFECT(ENCHANT_ARMOR, FALSE, 12, "attempts to magically enhance a piece of armour. Also gives a chance to break a curse") EFFECT(ENCHANT_ARMOR2, FALSE, 15, "attempts to magically enhance a piece of armour with high chance of success. Also gives a chance to break a curse") EFFECT(RESTORE_ITEM, FALSE, 10, "restores an item after disenchantment or damage") EFFECT(IDENTIFY, FALSE, 9, "reveals to you the extent of an item's magical powers") EFFECT(REMOVE_CURSE, FALSE, INHIBIT_POWER, "removes all ordinary curses from all equipped items") EFFECT(REMOVE_CURSE2, FALSE, 20, "removes all curses from all equipped items") EFFECT(LIGHT, FALSE, 4, "lights up an area and inflicts 2d8 damage on light-sensitive creatures") EFFECT(SUMMON_MON, FALSE, 0, "summons monsters at the current dungeon level") EFFECT(SUMMON_UNDEAD, FALSE, 0, "summons undead monsters at the current dungeon level") EFFECT(TELE_PHASE, FALSE, 5, "teleports you randomly up to 10 squares away") EFFECT(TELE_LONG, FALSE, 6, "teleports you randomly up to 100 squares away") EFFECT(TELE_LEVEL, FALSE, 15, "teleports you one level up or down") EFFECT(CONFUSING, FALSE, 8, "causes your next attack upon a monster to confuse it") EFFECT(MAPPING, FALSE, 10, "maps the area around you") EFFECT(RUNE, FALSE, 20, "inscribes a glyph of warding beneath you, which monsters cannot move onto") EFFECT(ACQUIRE, FALSE, INHIBIT_POWER, "creates a good object nearby") EFFECT(ACQUIRE2, FALSE, INHIBIT_POWER, "creates a few good items nearby") EFFECT(ANNOY_MON, FALSE, 0, "awakens all nearby sleeping monsters and hastens all monsters within line of sight") EFFECT(CREATE_TRAP, FALSE, 0, "creates traps surrounding you") EFFECT(DESTROY_TDOORS, FALSE, 6, "destroys all traps and doors surrounding you") EFFECT(RECHARGE, FALSE, 11, "tries to recharge a wand or staff, destroying the wand or staff on failure") EFFECT(BANISHMENT, FALSE, 20, "removes all non-unique monsters represented by a chosen symbol from the level, dealing you damage in the process") EFFECT(DARKNESS, FALSE, 0, "darkens the nearby area and blinds you for 1d5+3 turns") EFFECT(PROTEVIL, FALSE, 6, "grants you protection from evil for 1d25 plus 3 times your character level turns") EFFECT(SATISFY, FALSE, 7, "magically renders you well-fed, curing any gastrointestinal problems") EFFECT(CURSE_WEAPON, FALSE, 0, "curses your currently wielded melee weapon") EFFECT(CURSE_ARMOR, FALSE, 0, "curses your currently worn body armor") EFFECT(BLESSING, FALSE, 6, "increases your AC and to-hit bonus for 1d12+6 turns") EFFECT(BLESSING2, FALSE, 7, "increases your AC and to-hit bonus for 1d24+12 turns") EFFECT(BLESSING3, FALSE, 8, "increases your AC and to-hit bonus for 1d48+24 turns") EFFECT(RECALL, FALSE, 15, "returns you from the dungeon or takes you to the dungeon after a short delay") EFFECT(DEEP_DESCENT, FALSE, 19, "teleports you up to five dungeon levels lower than the lowest point you have reached so far") EFFECT(EARTHQUAKES, FALSE, 5, "causes an earthquake around you") EFFECT(DESTRUCTION2, FALSE, 12, "destroys an area around you in the shape of a circle radius 15, and blinds you for 1d10+10 turns") EFFECT(LOSHASTE, FALSE, 0, "hastes all monsters within line of sight") EFFECT(LOSSLOW, FALSE, 7, "slows all non-unique monsters within line of sight") EFFECT(LOSSLEEP, FALSE, 8, "sleeps all non-unique creatures within line of sight") EFFECT(LOSCONF, FALSE, 10, "confuses all non-unique creatures within line of sight") EFFECT(LOSKILL, FALSE, 25, "removes all non-unique monsters within 20 squares, dealing you damage in the process") EFFECT(ILLUMINATION, FALSE, 4, "lights up the surrounding area, hurting light-sensitive creatures") EFFECT(CLAIRVOYANCE, FALSE, 23, "maps the entire level and detects nearby objects, traps, doors, and stairs") EFFECT(PROBING, FALSE, 8, "gives you information on the health and abilities of monsters you can see") EFFECT(HASTE, FALSE, 10, "hastens you for 2d10+20 turns") EFFECT(HASTE1, FALSE, 10, "hastens you for d20+20 turns") EFFECT(HASTE2, FALSE, 13, "hastens you for d75+75 turns") EFFECT(DISPEL_EVIL, FALSE, 12, "deals five times your level's damage to all evil creatures that you can see") EFFECT(DISPEL_EVIL60, FALSE, 9, "deals 60 damage to all evil creatures that you can see") EFFECT(DISPEL_UNDEAD, FALSE, 9, "deals 60 damage to all undead creatures that you can see") EFFECT(DISPEL_ALL, FALSE, 11, "deals 120 damage to all creatures that you can see") EFFECT(SLEEPII, FALSE, 8, "puts to sleep the monsters around you") EFFECT(STAR_BALL, FALSE, 18, "fires a ball of electricity in all directions, each one causing 150 damage") EFFECT(RAGE_BLESS_RESIST, FALSE, 21, "bestows upon you berserk rage, bless, and resistance") EFFECT(RESTORE_LIFE, FALSE, 8, "restores your experience to full") EFFECT(REM_FEAR_POIS, FALSE, 3, "cures you of fear and poison") EFFECT(FIREBRAND, FALSE, 25, "brands bolts with fire, in an unbalanced fashion") EFFECT(FIRE_BOLT, TRUE, 5, "creates a fire bolt with damage 9d8") EFFECT(FIRE_BOLT2, TRUE, 7, "creates a fire bolt with damage 12d8") EFFECT(FIRE_BOLT3, TRUE, 9, "creates a fire bolt with damage 16d8") EFFECT(FIRE_BOLT72, TRUE, 9, "creates a fire ball with damage 72") EFFECT(FIRE_BALL, TRUE, 11, "creates a fire ball with damage 144") EFFECT(FIRE_BALL2, TRUE, 11, "creates a large fire ball with damage 120") EFFECT(FIRE_BALL200, TRUE, 13, "creates a large fire ball with damage 200") EFFECT(COLD_BOLT, TRUE, 4, "creates a frost bolt with damage 6d8") EFFECT(COLD_BOLT2, TRUE, 7, "creates a frost bolt with damage 12d8") EFFECT(COLD_BALL2, TRUE, 13, "creates a large frost ball with damage 200") EFFECT(COLD_BALL50, TRUE, 8, "creates a frost ball with damage 50") EFFECT(COLD_BALL100, TRUE, 10, "creates a frost ball with damage 100") EFFECT(COLD_BALL160, TRUE, 12, "creates a frost ball with damage 160") EFFECT(ACID_BOLT, TRUE, 4, "creates an acid bolt with damage 5d8") EFFECT(ACID_BOLT2, TRUE, 6, "creates an acid bolt with damage 10d8") EFFECT(ACID_BOLT3, TRUE, 7, "creates an acid bolt with damage 12d8") EFFECT(ACID_BALL, TRUE, 11, "creates an acid ball with damage 125") EFFECT(ELEC_BOLT, TRUE, 5, "creates a lightning bolt (that always beams) with damage 6d6") EFFECT(ELEC_BALL, TRUE, 9, "creates a lightning ball with damage 64") EFFECT(ELEC_BALL2, TRUE, 14, "creates a large lightning ball with damage 250") EFFECT(DRAIN_LIFE1, TRUE, 9, "drains up to 90 hit points of life from a target creature. Does not affect undead, demons, golems, elementals or vortices") EFFECT(DRAIN_LIFE2, TRUE, 10, "drains up to 120 hit points of life from a target creature. Does not affect undead, demons, golems, elementals or vortices") EFFECT(DRAIN_LIFE3, TRUE, 11, "drains up to 150 hit points of life from a target creature. Does not affect undead, demons, golems, elementals or vortices") EFFECT(DRAIN_LIFE4, TRUE, 12, "drains up to 250 hit points of life from a target creature. Does not affect undead, demons, golems, elementals or vortices") EFFECT(MISSILE, TRUE, 3, "fires a magic missile with damage 3d4") EFFECT(MANA_BOLT, TRUE, 7, "fires a mana bolt with damage 12d8") EFFECT(BIZARRE, TRUE, 20, "does bizarre things") EFFECT(ARROW, TRUE, 11, "fires a magical arrow with damage 150") EFFECT(STINKING_CLOUD, TRUE, 3, "fires a stinking cloud with damage 12") EFFECT(STONE_TO_MUD, TRUE, 6, "turns rock into mud") EFFECT(TELE_OTHER, TRUE, 11, "teleports a target monster away") EFFECT(CONFUSE2, TRUE, 3, "confuses a target monster") EFFECT(MON_HEAL, TRUE, 0, "heals a single monster 4d6 hit points") EFFECT(MON_HASTE, TRUE, 0, "hastes a single monster") EFFECT(MON_SLOW, TRUE, 3, "attempts to magically slow a single monster") EFFECT(MON_CONFUSE, TRUE, 3, "attempts to magically confuse a single monster") EFFECT(MON_SLEEP, TRUE, 3, "attempts to induce magical sleep in a single monster") EFFECT(MON_CLONE, TRUE, 0, "hastes, heals, and magically duplicates a single monster") EFFECT(MON_SCARE, TRUE, 3, "attempts to induce magical fear in a single monster") EFFECT(LIGHT_LINE, TRUE, 6, "lights up part of the dungeon in a straight line") EFFECT(DISARMING, TRUE, 7, "destroys traps, unlocks doors and reveals all secret doors in a given direction") EFFECT(TDOOR_DEST, TRUE, 5, "destroys traps and doors") EFFECT(POLYMORPH, TRUE, 7, "polymorphs a monster into another kind of creature") EFFECT(STARLIGHT, FALSE, 5, "fires a line of light in all directions, each one causing light-sensitive creatures 6d8 damage") EFFECT(STARLIGHT2, FALSE, 7, "fires a line of light in all directions, each one causing 10d8 damage") EFFECT(BERSERKER, FALSE, 10, "puts you in a berserker rage for d50+50 turns") EFFECT(WONDER, TRUE, 9, "creates random and unpredictable effects") EFFECT(WAND_BREATH, TRUE, 12, "shoots a large ball of one of the base elements for 120-200 damage") EFFECT(STAFF_MAGI, FALSE, 20, "restores both intelligence and manapoints to maximum") EFFECT(STAFF_HOLY, FALSE, 12, "inflicts damage on evil creatures you can see, heals 50 hit points, cures all temporary negative effects and grants you protection from evil") EFFECT(DRINK_GOOD, FALSE, 0, NULL) EFFECT(DRINK_BREATH, TRUE, 8, "causes you to breathe either cold or flames for 80 damage") EFFECT(DRINK_SALT, FALSE, 0, "induces vomiting and paralysis for 4 turns, resulting in severe hunger but also curing poison") EFFECT(DRINK_DEATH, FALSE, 0, "inflicts 5000 points of damage") EFFECT(DRINK_RUIN, FALSE, 0, "inflicts 10d10 points of damage and decreases all your stats") EFFECT(DRINK_DETONATE, FALSE, 0, "inflicts 50d20 points of damage, severe cuts, and stunning") EFFECT(FOOD_GOOD, FALSE, 0, NULL) EFFECT(FOOD_WAYBREAD, FALSE, 4, "restores 4d8 hit points and neutralizes poison") EFFECT(FOOD_CRUNCH, FALSE, 0, NULL) EFFECT(FOOD_WHISKY, FALSE, 0, NULL) EFFECT(FOOD_WINE, FALSE, 0, "makes you fearless and foolhardy, but less co-ordinated") EFFECT(SHROOM_EMERGENCY, FALSE, 7, "grants temporary resistance to fire and cold, cures 200HP, but also makes you hallucinate wildly") EFFECT(SHROOM_TERROR, FALSE, 5, "speeds up you temporarily but also makes you mortally afraid") EFFECT(SHROOM_STONE, FALSE, 5, "turns your skin to stone briefly, which grants an extra 40AC but slows you down") EFFECT(SHROOM_DEBILITY, FALSE, 5, "restores some mana but also drains either your strength or constitution") EFFECT(SHROOM_SPRINTING, FALSE, 5, "hastes you for a while, but then makes you slower for a while afterward") EFFECT(SHROOM_PURGING, FALSE, 5, "makes you very hungry but restores constitution and strength") EFFECT(RING_ACID, TRUE, 11, "grants acid resistance for d20+20 turns and creates an acid ball of damage 70") EFFECT(RING_FLAMES, TRUE, 11, "grants fire resistance for d20+20 turns and creates a fire ball of damage 80") EFFECT(RING_ICE, TRUE, 11, "grants cold resistance for d20+20 turns and creates a cold ball of damage 75") EFFECT(RING_LIGHTNING, TRUE, 11, "grants electricity resistance for d20+20 turns and creates a lightning ball of damage 85") EFFECT(DRAGON_BLUE, TRUE, 18, "allows you to breathe lightning for 150 damage") EFFECT(DRAGON_GREEN, TRUE, 19, "allows you to breathe poison gas for 150 damage") EFFECT(DRAGON_RED, TRUE, 20, "allows you to breathe fire for 200 damage") EFFECT(DRAGON_MULTIHUED, TRUE, 20, "allows you to breathe the elements for 250 damage") EFFECT(DRAGON_BRONZE, TRUE, INHIBIT_POWER, "allows you to breathe confusion for 150 damage") EFFECT(DRAGON_GOLD, TRUE, 19, "allows you to breathe sound for 150 damage") EFFECT(DRAGON_CHAOS, TRUE, 23, "allows you to breathe chaos or disenchantment for 220 damage") EFFECT(DRAGON_LAW, TRUE, 23, "allows you to breathe sound/shards for 230 damage") EFFECT(DRAGON_BALANCE, TRUE, 24, "allows you to breathe balance for 250 damage") EFFECT(DRAGON_SHINING, TRUE, 21, "allows you to breathe light or darkness for 200 damage") EFFECT(DRAGON_POWER, TRUE, 25, "allows you to breathe for 300 damage") EFFECT(TRAP_DOOR, FALSE, 0, "a trap door which drops you down a level") EFFECT(TRAP_PIT, FALSE, 0, "a pit trap - the fall might hurt") EFFECT(TRAP_PIT_SPIKES, FALSE, 0, "a pit trap, with nasty spikes") EFFECT(TRAP_PIT_POISON, FALSE, 0, "a pit trap, with poisoned spikes") EFFECT(TRAP_RUNE_SUMMON, FALSE, 0, "a rune which summons monsters") EFFECT(TRAP_RUNE_TELEPORT, FALSE, 0, "a rune which teleports") EFFECT(TRAP_SPOT_FIRE, FALSE, 0, "a magical fire trap") EFFECT(TRAP_SPOT_ACID, FALSE, 0, "a magical acid trap") EFFECT(TRAP_DART_SLOW, FALSE, 0, "a dart which slows movements") EFFECT(TRAP_DART_LOSE_STR, FALSE, 0, "a dart which drains strength") EFFECT(TRAP_DART_LOSE_DEX, FALSE, 0, "a dart which drains dexterity") EFFECT(TRAP_DART_LOSE_CON, FALSE, 0, "a dart which drains constitution") EFFECT(TRAP_GAS_BLIND, FALSE, 0, "blinding gas") EFFECT(TRAP_GAS_CONFUSE, FALSE, 0, "confusing gas") EFFECT(TRAP_GAS_POISON, FALSE, 0, "poison gas") EFFECT(TRAP_GAS_SLEEP, FALSE, 0, "soporific gas") angband-3.5.1/src/ui-birth.h0000644000175000017500000000023212456456606015120 0ustar chriscchrisc#ifndef INCLUDED_UI_BIRTH_H #define INCLUDED_UI_BIRTH_H extern void ui_init_birthstate_handlers(void); extern errr get_birth_command(bool wait); #endif angband-3.5.1/src/z-bitflag.c0000644000175000017500000003172012456456607015256 0ustar chriscchrisc/* * File: z-bitflag.c * Purpose: Low-level bit vector manipulation * * Copyright (c) 2010 William L Moore * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "z-bitflag.h" /** * Tests if a flag is "on" in a bitflag set. * * TRUE is returned when `flag` is on in `flags`, and FALSE otherwise. * The flagset size is supplied in `size`. */ bool flag_has(const bitflag *flags, const size_t size, const int flag) { const size_t flag_offset = FLAG_OFFSET(flag); const int flag_binary = FLAG_BINARY(flag); if (flag == FLAG_END) return FALSE; assert(flag_offset < size); if (flags[flag_offset] & flag_binary) return TRUE; return FALSE; } bool flag_has_dbg(const bitflag *flags, const size_t size, const int flag, const char *fi, const char *fl) { const size_t flag_offset = FLAG_OFFSET(flag); const int flag_binary = FLAG_BINARY(flag); if (flag == FLAG_END) return FALSE; if (flag_offset >= size) { quit_fmt("Error in flag_has(%s, %s): FlagID[%d] Size[%u] FlagOff[%u] FlagBV[%d]\n", fi, fl, flag, (unsigned int) size, (unsigned int) flag_offset, flag_binary); } assert(flag_offset < size); if (flags[flag_offset] & flag_binary) return TRUE; return FALSE; } /** * Interates over the flags which are "on" in a bitflag set. * * Returns the next on flag in `flags`, starting from (and including) * `flag`. FLAG_END will be returned when the end of the flag set is reached. * Iteration will start at the beginning of the flag set when `flag` is * FLAG_END. The bitfield size is supplied in `size`. */ int flag_next(const bitflag *flags, const size_t size, const int flag) { const int max_flags = FLAG_MAX(size); int f, flag_offset, flag_binary; for (f = flag; f < max_flags; f++) { flag_offset = FLAG_OFFSET(f); flag_binary = FLAG_BINARY(f); if (flags[flag_offset] & flag_binary) return f; } return FLAG_END; } /** * Tests a bitfield for emptiness. * * TRUE is returned when no flags are set in `flags`, and FALSE otherwise. * The bitfield size is supplied in `size`. */ bool flag_is_empty(const bitflag *flags, const size_t size) { size_t i; for (i = 0; i < size; i++) if (flags[i] > 0) return FALSE; return TRUE; } /** * Tests a bitfield for fullness. * * TRUE is returned when all flags are set in `flags`, and FALSE otherwise. * The bitfield size is supplied in `size`. */ bool flag_is_full(const bitflag *flags, const size_t size) { size_t i; for (i = 0; i < size; i++) if (flags[i] != (bitflag) -1) return FALSE; return TRUE; } /** * Tests two bitfields for intersection. * * TRUE is returned when any flag is set in both `flags1` and `flags2`, and * FALSE otherwise. The size of the bitfields is supplied in `size`. */ bool flag_is_inter(const bitflag *flags1, const bitflag *flags2, const size_t size) { size_t i; for (i = 0; i < size; i++) if (flags1[i] & flags2[i]) return TRUE; return FALSE; } /** * Test if one bitfield is a subset of another. * * TRUE is returned when every set flag in `flags2` is also set in `flags1`, * and FALSE otherwise. The size of the bitfields is supplied in `size`. */ bool flag_is_subset(const bitflag *flags1, const bitflag *flags2, const size_t size) { size_t i; for (i = 0; i < size; i++) if (~flags1[i] & flags2[i]) return FALSE; return TRUE; } /** * Tests two bitfields for equality. * * TRUE is returned when the flags set in `flags1` and `flags2` are identical, * and FALSE otherwise. the size of the bitfields is supplied in `size`. */ bool flag_is_equal(const bitflag *flags1, const bitflag *flags2, const size_t size) { return (!memcmp(flags1, flags2, size * sizeof(bitflag))); } /** * Sets one bitflag in a bitfield. * * The bitflag identified by `flag` is set in `flags`. The bitfield size is * supplied in `size`. TRUE is returned when changes were made, FALSE * otherwise. */ bool flag_on(bitflag *flags, const size_t size, const int flag) { const size_t flag_offset = FLAG_OFFSET(flag); const int flag_binary = FLAG_BINARY(flag); assert(flag_offset < size); if (flags[flag_offset] & flag_binary) return FALSE; flags[flag_offset] |= flag_binary; return TRUE; } bool flag_on_dbg(bitflag *flags, const size_t size, const int flag, const char *fi, const char *fl) { const size_t flag_offset = FLAG_OFFSET(flag); const int flag_binary = FLAG_BINARY(flag); if (flag_offset >= size) { quit_fmt("Error in flag_on(%s, %s): FlagID[%d] Size[%u] FlagOff[%u] FlagBV[%d]\n", fi, fl, flag, (unsigned int) size, (unsigned int) flag_offset, flag_binary); } assert(flag_offset < size); if (flags[flag_offset] & flag_binary) return FALSE; flags[flag_offset] |= flag_binary; return TRUE; } /** * Clears one flag in a bitfield. * * The bitflag identified by `flag` is cleared in `flags`. The bitfield size * is supplied in `size`. TRUE is returned when changes were made, FALSE * otherwise. */ bool flag_off(bitflag *flags, const size_t size, const int flag) { const size_t flag_offset = FLAG_OFFSET(flag); const int flag_binary = FLAG_BINARY(flag); assert(flag_offset < size); if (!(flags[flag_offset] & flag_binary)) return FALSE; flags[flag_offset] &= ~flag_binary; return TRUE; } /** * Clears all flags in a bitfield. * * All flags in `flags` are cleared. The bitfield size is supplied in `size`. */ void flag_wipe(bitflag *flags, const size_t size) { memset(flags, 0, size * sizeof(bitflag)); } /** * Sets all flags in a bitfield. * * All flags in `flags` are set. The bitfield size is supplied in `size`. */ void flag_setall(bitflag *flags, const size_t size) { memset(flags, 255, size * sizeof(bitflag)); } /** * Negates all flags in a bitfield. * * All flags in `flags` are toggled. The bitfield size is supplied in `size`. */ void flag_negate(bitflag *flags, const size_t size) { size_t i; for (i = 0; i < size; i++) flags[i] = ~flags[i]; } /** * Copies one bitfield into another. * * All flags in `flags2` are copied into `flags1`. The size of the bitfields is * supplied in `size`. */ void flag_copy(bitflag *flags1, const bitflag *flags2, const size_t size) { memcpy(flags1, flags2, size * sizeof(bitflag)); } /** * Computes the union of two bitfields. * * For every set flag in `flags2`, the corresponding flag is set in `flags1`. * The size of the bitfields is supplied in `size`. TRUE is returned when * changes were made, and FALSE otherwise. */ bool flag_union(bitflag *flags1, const bitflag *flags2, const size_t size) { size_t i; bool delta = FALSE; for (i = 0; i < size; i++) { /* !flag_is_subset() */ if (~flags1[i] & flags2[i]) delta = TRUE; flags1[i] |= flags2[i]; } return delta; } /** * Computes the union of one bitfield and the complement of another. * * For every unset flag in `flags2`, the corresponding flag is set in `flags1`. * The size of the bitfields is supplied in `size`. TRUE is returned when * changes were made, and FALSE otherwise. */ bool flag_comp_union(bitflag *flags1, const bitflag *flags2, const size_t size) { size_t i; bool delta = FALSE; for (i = 0; i < size; i++) { /* no equivalent fn */ if (!(~flags1[i] & ~flags2[i])) delta = TRUE; flags1[i] |= ~flags2[i]; } return delta; } /** * Computes the intersection of two bitfields. * * For every unset flag in `flags2`, the corresponding flag is cleared in * `flags1`. The size of the bitfields is supplied in `size`. TRUE is returned * when changes were made, and FALSE otherwise. */ bool flag_inter(bitflag *flags1, const bitflag *flags2, const size_t size) { size_t i; bool delta = FALSE; for (i = 0; i < size; i++) { /* !flag_is_equal() */ if (!(flags1[i] == flags2[i])) delta = TRUE; flags1[i] &= flags2[i]; } return delta; } /** * Computes the difference of two bitfields. * * For every set flag in `flags2`, the corresponding flag is cleared in * `flags1`. The size of the bitfields is supplied in `size`. TRUE is returned * when changes were made, and FALSE otherwise. */ bool flag_diff(bitflag *flags1, const bitflag *flags2, const size_t size) { size_t i; bool delta = FALSE; for (i = 0; i < size; i++) { /* flag_is_inter() */ if (flags1[i] & flags2[i]) delta = TRUE; flags1[i] &= ~flags2[i]; } return delta; } /** * Tests if any of multiple bitflags are set in a bitfield. * * TRUE is returned if any of the flags specified in `...` are set in `flags`, * FALSE otherwise. The bitfield size is supplied in `size`. * * WARNING: FLAG_END must be the final argument in the `...` list. */ bool flags_test(const bitflag *flags, const size_t size, ...) { size_t flag_offset; int flag_binary; int f; va_list args; bool delta = FALSE; va_start(args, size); /* Process each flag in the va-args */ for (f = va_arg(args, int); f != FLAG_END; f = va_arg(args, int)) { flag_offset = FLAG_OFFSET(f); flag_binary = FLAG_BINARY(f); assert(flag_offset < size); /* flag_has() */ if (flags[flag_offset] & flag_binary) { delta = TRUE; break; } } va_end(args); return delta; } /** * Tests if all of the multiple bitflags are set in a bitfield. * * TRUE is returned if all of the flags specified in `...` are set in `flags`, * FALSE otherwise. The bitfield size is supplied in `size`. * * WARNING: FLAG_END must be the final argument in the `...` list. */ bool flags_test_all(const bitflag *flags, const size_t size, ...) { size_t flag_offset; int flag_binary; int f; va_list args; bool delta = TRUE; va_start(args, size); /* Process each flag in the va-args */ for (f = va_arg(args, int); f != FLAG_END; f = va_arg(args, int)) { flag_offset = FLAG_OFFSET(f); flag_binary = FLAG_BINARY(f); assert(flag_offset < size); /* !flag_has() */ if (!(flags[flag_offset] & flag_binary)) { delta = FALSE; break; } } va_end(args); return delta; } /** * Clears multiple bitflags in a bitfield. * * The flags specified in `...` are cleared in `flags`. The bitfield size is * supplied in `size`. TRUE is returned when changes were made, FALSE * otherwise. * * WARNING: FLAG_END must be the final argument in the `...` list. */ bool flags_clear(bitflag *flags, const size_t size, ...) { size_t flag_offset; int flag_binary; int f; va_list args; bool delta = FALSE; va_start(args, size); /* Process each flag in the va-args */ for (f = va_arg(args, int); f != FLAG_END; f = va_arg(args, int)) { flag_offset = FLAG_OFFSET(f); flag_binary = FLAG_BINARY(f); assert(flag_offset < size); /* flag_has() */ if (flags[flag_offset] & flag_binary) delta = TRUE; /* flag_off() */ flags[flag_offset] &= ~flag_binary; } va_end(args); return delta; } /** * Sets multiple bitflags in a bitfield. * * The flags specified in `...` are set in `flags`. The bitfield size is * supplied in `size`. TRUE is returned when changes were made, FALSE * otherwise. * * WARNING: FLAG_END must be the final argument in the `...` list. */ bool flags_set(bitflag *flags, const size_t size, ...) { size_t flag_offset; int flag_binary; int f; va_list args; bool delta = FALSE; va_start(args, size); /* Process each flag in the va-args */ for (f = va_arg(args, int); f != FLAG_END; f = va_arg(args, int)) { flag_offset = FLAG_OFFSET(f); flag_binary = FLAG_BINARY(f); assert(flag_offset < size); /* !flag_has() */ if (!(flags[flag_offset] & flag_binary)) delta = TRUE; /* flag_on() */ flags[flag_offset] |= flag_binary; } va_end(args); return delta; } /** * Wipes a bitfield, and then sets multiple bitflags. * * The flags specified in `...` are set in `flags`, while all other flags are * cleared. The bitfield size is supplied in `size`. * * WARNING: FLAG_END must be the final argument in the `...` list. */ void flags_init(bitflag *flags, const size_t size, ...) { int f; va_list args; flag_wipe(flags, size); va_start(args, size); /* Process each flag in the va-args */ for (f = va_arg(args, int); f != FLAG_END; f = va_arg(args, int)) flag_on(flags, size, f); va_end(args); } /** * Computes the intersection of a bitfield and multiple bitflags. * * The flags not specified in `...` are cleared in `flags`. The bitfeild size * is supplied in `size`. TRUE is returned when changes were made, FALSE * otherwise. * * WARNING: FLAG_END must be the final argument in the `...` list. */ bool flags_mask(bitflag *flags, const size_t size, ...) { int f; va_list args; bool delta = FALSE; bitflag *mask; /* Build the mask */ mask = C_ZNEW(size, bitflag); va_start(args, size); /* Process each flag in the va-args */ for (f = va_arg(args, int); f != FLAG_END; f = va_arg(args, int)) flag_on(mask, size, f); va_end(args); delta = flag_inter(flags, mask, size); /* Free the mask */ FREE(mask); return delta; } angband-3.5.1/src/parser.h0000644000175000017500000001120012456456606014666 0ustar chriscchrisc/** Init file parser library * * The basic structure of the parser is as follows: there is a table of hooks * which are run when a directive matching their format is encountered. When the * hook is called, all the arguments it declares in its format have been parsed * out and can be accessed with parser_get*(). See the unit tests for examples. */ #ifndef PARSER_H #define PARSER_H #include "h-basic.h" #include "z-bitflag.h" #include "z-rand.h" struct parser; enum parser_error { PARSE_ERROR_NONE = 0, PARSE_ERROR_GENERIC, PARSE_ERROR_INVALID_FLAG, PARSE_ERROR_INVALID_ITEM_NUMBER, PARSE_ERROR_INVALID_SPELL_FREQ, PARSE_ERROR_INVALID_VALUE, PARSE_ERROR_INVALID_COLOR, PARSE_ERROR_INVALID_EFFECT, PARSE_ERROR_INVALID_OPTION, PARSE_ERROR_MISSING_FIELD, PARSE_ERROR_MISSING_RECORD_HEADER, PARSE_ERROR_FIELD_TOO_LONG, PARSE_ERROR_NON_SEQUENTIAL_RECORDS, PARSE_ERROR_NOT_NUMBER, PARSE_ERROR_NOT_RANDOM, PARSE_ERROR_OBSOLETE_FILE, PARSE_ERROR_OUT_OF_BOUNDS, PARSE_ERROR_OUT_OF_MEMORY, PARSE_ERROR_TOO_FEW_ENTRIES, PARSE_ERROR_TOO_MANY_ENTRIES, PARSE_ERROR_UNDEFINED_DIRECTIVE, PARSE_ERROR_UNRECOGNISED_BLOW, PARSE_ERROR_UNRECOGNISED_TVAL, PARSE_ERROR_UNRECOGNISED_SVAL, PARSE_ERROR_VAULT_TOO_BIG, PARSE_ERROR_INTERNAL, PARSE_ERROR_MAX }; struct parser_state { enum parser_error error; unsigned int line; unsigned int col; char *msg; }; struct file_parser { const char *name; struct parser *(*init)(void); errr (*run)(struct parser *p); errr (*finish)(struct parser *p); void (*cleanup)(void); }; extern const char *parser_error_str[PARSE_ERROR_MAX]; /** Allocates a new parser. */ extern struct parser *parser_new(void); /** Parses the provided line. * * This runs the first parser hook registered with `p` that matches `line`. */ extern enum parser_error parser_parse(struct parser *p, const char *line); /** Destroys a parser. */ extern void parser_destroy(struct parser *p); /** Gets parser's private data. */ extern void *parser_priv(struct parser *p); /** Sets parser's private data. * * This is commonly used to store context for stateful parsing. */ extern void parser_setpriv(struct parser *p, void *v); /** Registers a parser hook. * * Hooks have the following format: * ::= [ ]* [? ]* * ::= int | str | sym | rand | char * The first is called the directive for this hook. Any other hooks with * the same directive are superseded by this hook. It is an error for a * mandatory field to follow an optional field. It is an error for any field to * follow a field of type `str`, since `str` fields are not delimited and will * consume the entire rest of the line. */ extern errr parser_reg(struct parser *p, const char *fmt, enum parser_error (*func)(struct parser *p)); /** A placeholder parse hook indicating a value is ignored */ extern enum parser_error ignored(struct parser *p); /** Returns whether the parser has a value named `name`. * * Used to test for presence of optional values. */ extern bool parser_hasval(struct parser *p, const char *name); /** Returns the symbol named `name`. This symbol must exist. */ extern const char *parser_getsym(struct parser *p, const char *name); /** Returns the string named `name`. This symbol must exist. */ extern const char *parser_getstr(struct parser *p, const char *name); /** Returns the integer named `name`. This symbol must exist. */ extern int parser_getint(struct parser *p, const char *name); /** Returns the unsigned integer named `name`. This symbol must exist. */ extern unsigned int parser_getuint(struct parser *p, const char *name); /** Returns the random value named `name`. This symbol must exist. */ extern struct random parser_getrand(struct parser *p, const char *name); /** Returns the character named `name`. This symbol must exist. */ extern wchar_t parser_getchar(struct parser *p, const char *name); /** Fills the provided struct with the parser's state, if any. Returns true if * the parser is in an error state, and false otherwise. */ extern int parser_getstate(struct parser *p, struct parser_state *s); /** Sets the parser's detailed error description and field number. */ extern void parser_setstate(struct parser *p, unsigned int col, const char *msg); errr run_parser(struct file_parser *fp); errr parse_file(struct parser *p, const char *filename); void cleanup_parser(struct file_parser *fp); int lookup_flag(const char **flag_table, const char *flag_name); errr grab_flag(bitflag *flags, const size_t size, const char **flag_table, const char *flag_name); errr remove_flag(bitflag *flags, const size_t size, const char **flag_table, const char *flag_name); #endif /* !PARSER_H */ angband-3.5.1/src/cmd-pickup.c0000644000175000017500000003536412456456606015442 0ustar chriscchrisc/* * File: cmd-pickup.c * Purpose: Pickup code * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke, * Copyright (c) 2007 Leon Marrick * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "cave.h" #include "cmds.h" #include "game-event.h" #include "generate.h" #include "history.h" #include "monster/mon-timed.h" #include "monster/mon-util.h" #include "object/inventory.h" #include "object/tvalsval.h" #include "object/object.h" #include "squelch.h" #include "trap.h" /* * Pick up objects on the floor beneath you. -LM- */ void do_cmd_pickup(cmd_code code, cmd_arg args[]) { int energy_cost; /* Autopickup first */ energy_cost = do_autopickup() * 10; /* Pick up floor objects with a menu for multiple objects */ energy_cost += py_pickup_item(1, args[0].item) * 10; /* Limit */ if (energy_cost > 100) energy_cost = 100; /* Charge this amount of energy. */ p_ptr->energy_use = energy_cost; } /* * Pick up objects on the floor beneath you. -LM- */ void do_cmd_autopickup(cmd_code code, cmd_arg args[]) { p_ptr->energy_use = do_autopickup() * 10; } /* * Pickup all gold at the player's current location. */ static void py_pickup_gold(void) { int py = p_ptr->py; int px = p_ptr->px; s32b total_gold = 0L; byte *treasure; s16b this_o_idx = 0; s16b next_o_idx = 0; object_type *o_ptr; int sound_msg; bool verbal = FALSE; /* Allocate an array of ordinary gold objects */ treasure = C_ZNEW(SV_GOLD_MAX, byte); /* Pick up all the ordinary gold objects */ for (this_o_idx = cave->o_idx[py][px]; this_o_idx; this_o_idx = next_o_idx) { /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Ignore if not legal treasure */ if ((o_ptr->tval != TV_GOLD) || (o_ptr->sval >= SV_GOLD_MAX)) continue; /* Note that we have this kind of treasure */ treasure[o_ptr->sval]++; /* Remember whether feedback message is in order */ if (!squelch_item_ok(o_ptr)) verbal = TRUE; /* Increment total value */ total_gold += (s32b)o_ptr->pval[DEFAULT_PVAL]; /* Delete the gold */ delete_object_idx(this_o_idx); } /* Pick up the gold, if present */ if (total_gold) { char buf[1024]; char tmp[80]; int i, count, total; object_kind *kind; /* Build a message */ (void)strnfmt(buf, sizeof(buf), "You have found %ld gold pieces worth of ", (long)total_gold); /* Count the types of treasure present */ for (total = 0, i = 0; i < SV_GOLD_MAX; i++) { if (treasure[i]) total++; } /* List the treasure types */ for (count = 0, i = 0; i < SV_GOLD_MAX; i++) { /* Skip if no treasure of this type */ if (!treasure[i]) continue; /* Get this object index */ kind = lookup_kind(TV_GOLD, i); if (!kind) continue; /* Get the object name */ object_kind_name(tmp, sizeof tmp, kind, TRUE); /* Build up the pickup string */ my_strcat(buf, tmp, sizeof(buf)); /* Added another kind of treasure */ count++; /* Add a comma if necessary */ if ((total > 2) && (count < total)) my_strcat(buf, ",", sizeof(buf)); /* Add an "and" if necessary */ if ((total >= 2) && (count == total-1)) my_strcat(buf, " and", sizeof(buf)); /* Add a space or period if necessary */ if (count < total) my_strcat(buf, " ", sizeof(buf)); else my_strcat(buf, ".", sizeof(buf)); } /* Determine which sound to play */ if (total_gold < 200) sound_msg = MSG_MONEY1; else if (total_gold < 600) sound_msg = MSG_MONEY2; else sound_msg = MSG_MONEY3; /* Display the message */ if (verbal) msgt(sound_msg, "%s", buf); /* Add gold to purse */ p_ptr->au += total_gold; /* Redraw gold */ p_ptr->redraw |= (PR_GOLD); } /* Free the gold array */ FREE(treasure); } /* * Determine if the object can be picked up automatically. */ static bool auto_pickup_okay(const object_type *o_ptr) { if (!inven_carry_okay(o_ptr)) return FALSE; if (OPT(pickup_always) || check_for_inscrip(o_ptr, "=g")) return TRUE; if (OPT(pickup_inven) && inven_stack_okay(o_ptr)) return TRUE; return FALSE; } /* * Carry an object and delete it. */ static void py_pickup_aux(int o_idx, bool domsg) { int slot, quiver_slot = 0; char o_name[80]; object_type *o_ptr = object_byid(o_idx); /* Carry the object */ slot = inven_carry(p_ptr, o_ptr); /* Handle errors (paranoia) */ if (slot < 0) return; /* If we have picked up ammo which matches something in the quiver, note * that it so that we can wield it later (and suppress pick up message) */ if (obj_is_ammo(o_ptr)) { int i; for (i = QUIVER_START; i < QUIVER_END; i++) { if (!p_ptr->inventory[i].kind) continue; if (!object_similar(&p_ptr->inventory[i], o_ptr, OSTACK_QUIVER)) continue; quiver_slot = i; break; } } /* Get the new object */ o_ptr = &p_ptr->inventory[slot]; /* Set squelch status */ p_ptr->notice |= PN_SQUELCH; /* Automatically sense artifacts */ object_sense_artifact(o_ptr); /* Log artifacts if found */ if (o_ptr->artifact) history_add_artifact(o_ptr->artifact, object_is_known(o_ptr), TRUE); /* Optionally, display a message */ if (domsg && !quiver_slot) { /* Describe the object */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Message */ msg("You have %s (%c).", o_name, index_to_label(slot)); } /* Update object_idx if necessary */ if (tracked_object_is(0 - o_idx)) { track_object(slot); } /* Delete the object */ delete_object_idx(o_idx); /* If we have a quiver slot that this ammo matches, use it */ if (quiver_slot) wield_item(o_ptr, slot, quiver_slot); } int do_autopickup(void) { int py = p_ptr->py; int px = p_ptr->px; s16b this_o_idx, next_o_idx = 0; object_type *o_ptr; /* Objects picked up. Used to determine time cost of command. */ byte objs_picked_up = 0; size_t floor_num = 0; int floor_list[MAX_FLOOR_STACK + 1]; /* Nothing to pick up -- return */ if (!cave->o_idx[py][px]) return (0); /* Always pickup gold, effortlessly */ py_pickup_gold(); /* Scan the remaining objects */ for (this_o_idx = cave->o_idx[py][px]; this_o_idx; this_o_idx = next_o_idx) { /* Get the object and the next object */ o_ptr = object_byid(this_o_idx); next_o_idx = o_ptr->next_o_idx; /* Ignore all hidden objects and non-objects */ if (squelch_item_ok(o_ptr) || !o_ptr->kind) continue; /* XXX Hack -- Enforce limit */ if (floor_num >= N_ELEMENTS(floor_list)) break; /* Hack -- disturb */ disturb(p_ptr, 0, 0); /* Automatically pick up items into the backpack */ if (auto_pickup_okay(o_ptr)) { /* Pick up the object with message */ py_pickup_aux(this_o_idx, TRUE); objs_picked_up++; continue; } /* Tally objects and store them in an array. */ /* Remember this object index */ floor_list[floor_num] = this_o_idx; /* Count non-gold objects that remain on the floor. */ floor_num++; } return objs_picked_up; } /** * Pick up objects and treasure on the floor. -LM- * * Called with pickup: * 0 to act according to the player's settings * 1 to quickly pickup single objects or present a menu for more * 2 to force a menu for any number of objects * * Scan the list of objects in that floor grid. Pick up gold automatically. * Pick up objects automatically until backpack space is full if * auto-pickup option is on, Otherwise, store objects on * floor in an array, and tally both how many there are and can be picked up. * * If not picking up anything, indicate objects on the floor. Show more * details if the "OPT(pickup_detail)" option is set. Do the same thing if we * don't have room for anything. * * [This paragraph is not true, intentional?] * If we are picking up objects automatically, and have room for at least * one, allow the "OPT(pickup_detail)" option to display information about objects * and prompt the player. Otherwise, automatically pick up a single object * or use a menu for more than one. * * Pick up multiple objects using Tim Baker's menu system. Recursively * call this function (forcing menus for any number of objects) until * objects are gone, backpack is full, or player is satisfied. * * We keep track of number of objects picked up to calculate time spent. * This tally is incremented even for automatic pickup, so we are careful * (in "dungeon.c" and elsewhere) to handle pickup as either a separate * automated move or a no-cost part of the stay still or 'g'et command. * * Note the lack of chance for the character to be disturbed by unmarked * objects. They are truly "unknown". * * \param item is the floor item index (must be negative) to pick up. */ byte py_pickup_item(int pickup, int item) { int py = p_ptr->py; int px = p_ptr->px; s16b this_o_idx = 0; size_t floor_num = 0; int floor_list[MAX_FLOOR_STACK + 1]; size_t i; int can_pickup = 0; bool call_function_again = FALSE; bool domsg = TRUE; /* Objects picked up. Used to determine time cost of command. */ byte objs_picked_up = 0; /* Always pickup gold, effortlessly */ py_pickup_gold(); /* Nothing else to pick up -- return */ if (!cave->o_idx[py][px]) return objs_picked_up; /* Tally objects that can be picked up.*/ floor_num = scan_floor(floor_list, N_ELEMENTS(floor_list), py, px, 0x08); for (i = 0; i < floor_num; i++) { can_pickup += inven_carry_okay(object_byid(floor_list[i])); } if (!can_pickup) { /* Can't pick up, but probably want to know what's there. */ event_signal(EVENT_SEEFLOOR); return objs_picked_up; } /* Use the item that we are given, if it is on the floor. */ if (item < 0) this_o_idx = 0 - item; /* Use a menu interface for multiple objects, or pickup single objects */ if (pickup == 1 && !this_o_idx) { if (floor_num > 1) pickup = 2; else this_o_idx = floor_list[0]; } /* Display a list if requested. */ if (pickup == 2 && !this_o_idx) { const char *q, *s; int item; /* Restrict the choices */ item_tester_hook = inven_carry_okay; /* Get an object or exit. */ q = "Get which item?"; s = "You see nothing there."; if (!get_item(&item, q, s, CMD_PICKUP, USE_FLOOR)) return (objs_picked_up); this_o_idx = 0 - item; call_function_again = TRUE; /* With a list, we do not need explicit pickup messages */ domsg = FALSE; } /* Pick up object, if legal */ if (this_o_idx) { /* Pick up the object */ py_pickup_aux(this_o_idx, domsg); /* Indicate an object picked up. */ objs_picked_up = 1; } /* * If requested, call this function recursively. Count objects picked * up. Force the display of a menu in all cases. */ if (call_function_again) objs_picked_up += py_pickup(2); /* Indicate how many objects have been picked up. */ return (objs_picked_up); } byte py_pickup(int pickup) { return py_pickup_item(pickup, 0); } /* * Move player in the given direction. * * This routine should only be called when energy has been expended. * * Note that this routine handles monsters in the destination grid, * and also handles attempting to move into walls/doors/rubble/etc. */ void move_player(int dir, bool disarm) { int py = p_ptr->py; int px = p_ptr->px; int y = py + ddy[dir]; int x = px + ddx[dir]; int m_idx = cave->m_idx[y][x]; struct monster *m_ptr = cave_monster(cave, m_idx); /* Attack monsters */ if (m_idx > 0) { /* Mimics surprise the player */ if (is_mimicking(m_ptr)) { become_aware(m_ptr); /* Mimic wakes up */ mon_clear_timed(m_ptr, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, FALSE); } else { py_attack(y, x); } } /* Optionally alter traps/doors on movement */ else if (disarm && (cave->info[y][x] & CAVE_MARK) && (cave_isknowntrap(cave, y, x) || cave_iscloseddoor(cave, y, x))) { /* Auto-repeat if not already repeating */ if (cmd_get_nrepeats() == 0) cmd_set_repeat(99); do_cmd_alter_aux(dir); } /* Cannot walk through walls */ else if (!cave_ispassable(cave, y, x)) { /* Disturb the player */ disturb(p_ptr, 0, 0); /* Notice unknown obstacles */ if (!(cave->info[y][x] & CAVE_MARK)) { /* Rubble */ if (cave_isrubble(cave, y, x)) { msgt(MSG_HITWALL, "You feel a pile of rubble blocking your way."); cave->info[y][x] |= (CAVE_MARK); cave_light_spot(cave, y, x); } /* Closed door */ else if (cave_iscloseddoor(cave, y, x)) { msgt(MSG_HITWALL, "You feel a door blocking your way."); cave->info[y][x] |= (CAVE_MARK); cave_light_spot(cave, y, x); } /* Wall (or secret door) */ else { msgt(MSG_HITWALL, "You feel a wall blocking your way."); cave->info[y][x] |= (CAVE_MARK); cave_light_spot(cave, y, x); } } /* Mention known obstacles */ else { if (cave_isrubble(cave, y, x)) msgt(MSG_HITWALL, "There is a pile of rubble blocking your way."); else if (cave_iscloseddoor(cave, y, x)) msgt(MSG_HITWALL, "There is a door blocking your way."); else msgt(MSG_HITWALL, "There is a wall blocking your way."); } } /* Normal movement */ else { /* See if trap detection status will change */ bool old_dtrap = ((cave->info2[py][px] & (CAVE2_DTRAP)) != 0); bool new_dtrap = ((cave->info2[y][x] & (CAVE2_DTRAP)) != 0); /* Note the change in the detect status */ if (old_dtrap != new_dtrap) p_ptr->redraw |= (PR_DTRAP); /* Disturb player if the player is about to leave the area */ if (p_ptr->running && !p_ptr->running_firststep && old_dtrap && !new_dtrap) { disturb(p_ptr, 0, 0); return; } /* Move player */ monster_swap(py, px, y, x); /* New location */ y = py = p_ptr->py; x = px = p_ptr->px; /* Searching */ if (p_ptr->searching || (p_ptr->state.skills[SKILL_SEARCH_FREQUENCY] >= 50) || one_in_(50 - p_ptr->state.skills[SKILL_SEARCH_FREQUENCY])) search(FALSE); /* Handle "store doors" */ if (cave_isshop(cave, p_ptr->py, p_ptr->px)) { /* Disturb */ disturb(p_ptr, 0, 0); cmd_insert(CMD_ENTER_STORE); } /* All other grids (including traps) */ else { /* Handle objects (later) */ p_ptr->notice |= (PN_PICKUP); } /* Discover invisible traps */ if (cave_issecrettrap(cave, y, x)) { /* Disturb */ disturb(p_ptr, 0, 0); /* Message */ msg("You found a trap!"); /* Pick a trap */ pick_trap(y, x); /* Hit the trap */ hit_trap(y, x); } /* Set off an visible trap */ else if (cave_isknowntrap(cave, y, x)) { /* Disturb */ disturb(p_ptr, 0, 0); /* Hit the trap */ hit_trap(y, x); } } p_ptr->running_firststep = FALSE; } angband-3.5.1/src/dungeon.c0000644000175000017500000011734612456456606015046 0ustar chriscchrisc/* * File: dungeon.c * Purpose: The game core bits, shared across platforms. * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "birth.h" #include "borg/borg1.h" #include "cave.h" #include "cmds.h" #include "dungeon.h" #include "files.h" #include "game-event.h" #include "generate.h" #include "grafmode.h" #include "init.h" #include "monster/mon-list.h" #include "monster/mon-make.h" #include "monster/mon-spell.h" #include "monster/mon-util.h" #include "monster/monster.h" #include "object/tvalsval.h" #include "pathfind.h" #include "prefs.h" #include "savefile.h" #include "spells.h" #include "target.h" u16b daycount = 0; /* * Change dungeon level - e.g. by going up stairs or with WoR. */ void dungeon_change_level(int dlev) { /* New depth */ p_ptr->depth = dlev; /* If we're returning to town, update the store contents according to how long we've been away */ if (!dlev && daycount) { if (OPT(cheat_xtra)) msg("Updating Shops..."); while (daycount--) { int n; /* Maintain each shop (except home) */ for (n = 0; n < MAX_STORES; n++) { /* Skip the home */ if (n == STORE_HOME) continue; /* Maintain */ store_maint(&stores[n]); } /* Sometimes, shuffle the shop-keepers */ if (one_in_(STORE_SHUFFLE)) { /* Message */ if (OPT(cheat_xtra)) msg("Shuffling a Shopkeeper..."); /* Pick a random shop (except home) */ while (1) { n = randint0(MAX_STORES); if (n != STORE_HOME) break; } /* Shuffle it */ store_shuffle(&stores[n]); } } daycount = 0; if (OPT(cheat_xtra)) msg("Done."); } /* Leaving */ p_ptr->leaving = TRUE; /* Save the game when we arrive on the new level. */ p_ptr->autosave = TRUE; } /* * Regenerate hit points */ static void regenhp(int percent) { s32b new_chp, new_chp_frac; int old_chp; /* Save the old hitpoints */ old_chp = p_ptr->chp; /* Extract the new hitpoints */ new_chp = ((long)p_ptr->mhp) * percent + PY_REGEN_HPBASE; p_ptr->chp += (s16b)(new_chp >> 16); /* div 65536 */ /* check for overflow */ if ((p_ptr->chp < 0) && (old_chp > 0)) p_ptr->chp = MAX_SHORT; new_chp_frac = (new_chp & 0xFFFF) + p_ptr->chp_frac; /* mod 65536 */ if (new_chp_frac >= 0x10000L) { p_ptr->chp_frac = (u16b)(new_chp_frac - 0x10000L); p_ptr->chp++; } else { p_ptr->chp_frac = (u16b)new_chp_frac; } /* Fully healed */ if (p_ptr->chp >= p_ptr->mhp) { p_ptr->chp = p_ptr->mhp; p_ptr->chp_frac = 0; } /* Notice changes */ if (old_chp != p_ptr->chp) { /* Redraw */ p_ptr->redraw |= (PR_HP); wieldeds_notice_flag(p_ptr, OF_REGEN); wieldeds_notice_flag(p_ptr, OF_IMPAIR_HP); } } /* * Regenerate mana points */ static void regenmana(int percent) { s32b new_mana, new_mana_frac; int old_csp; old_csp = p_ptr->csp; new_mana = ((long)p_ptr->msp) * percent + PY_REGEN_MNBASE; p_ptr->csp += (s16b)(new_mana >> 16); /* div 65536 */ /* check for overflow */ if ((p_ptr->csp < 0) && (old_csp > 0)) { p_ptr->csp = MAX_SHORT; } new_mana_frac = (new_mana & 0xFFFF) + p_ptr->csp_frac; /* mod 65536 */ if (new_mana_frac >= 0x10000L) { p_ptr->csp_frac = (u16b)(new_mana_frac - 0x10000L); p_ptr->csp++; } else { p_ptr->csp_frac = (u16b)new_mana_frac; } /* Must set frac to zero even if equal */ if (p_ptr->csp >= p_ptr->msp) { p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; } /* Redraw mana */ if (old_csp != p_ptr->csp) { /* Redraw */ p_ptr->redraw |= (PR_MANA); wieldeds_notice_flag(p_ptr, OF_REGEN); wieldeds_notice_flag(p_ptr, OF_IMPAIR_MANA); } } /* * Regenerate the monsters (once per 100 game turns) * * XXX XXX XXX Should probably be done during monster turns. */ static void regen_monsters(void) { int i, frac; /* Regenerate everyone */ for (i = 1; i < cave_monster_max(cave); i++) { /* Check the i'th monster */ monster_type *m_ptr = cave_monster(cave, i); /* Skip dead monsters */ if (!m_ptr->race) continue; /* Allow regeneration (if needed) */ if (m_ptr->hp < m_ptr->maxhp) { /* Hack -- Base regeneration */ frac = m_ptr->maxhp / 100; /* Hack -- Minimal regeneration rate */ if (!frac) frac = 1; /* Hack -- Some monsters regenerate quickly */ if (rf_has(m_ptr->race->flags, RF_REGENERATE)) frac *= 2; /* Hack -- Regenerate */ m_ptr->hp += frac; /* Do not over-regenerate */ if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp; /* Redraw (later) if needed */ if (p_ptr->health_who == m_ptr) p_ptr->redraw |= (PR_HEALTH); } } } /* * If player has inscribed the object with "!!", let him know when it's * recharged. -LM- * Also inform player when first item of a stack has recharged. -HK- * Notify all recharges w/o inscription if notify_recharge option set -WP- */ static void recharged_notice(const object_type *o_ptr, bool all) { char o_name[120]; const char *s; bool notify = FALSE; if (OPT(notify_recharge)) { notify = TRUE; } else if (o_ptr->note) { /* Find a '!' */ s = strchr(quark_str(o_ptr->note), '!'); /* Process notification request */ while (s) { /* Find another '!' */ if (s[1] == '!') { notify = TRUE; break; } /* Keep looking for '!'s */ s = strchr(s + 1, '!'); } } if (!notify) return; /* Describe (briefly) */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); /* Disturb the player */ disturb(p_ptr, 0, 0); /* Notify the player */ if (o_ptr->number > 1) { if (all) msg("Your %s have recharged.", o_name); else msg("One of your %s has recharged.", o_name); } /* Artifacts */ else if (o_ptr->artifact) { msg("The %s has recharged.", o_name); } /* Single, non-artifact items */ else msg("Your %s has recharged.", o_name); } /* * Recharge activatable objects in the player's equipment * and rods in the inventory and on the ground. */ static void recharge_objects(void) { int i; bool charged = FALSE, discharged_stack; object_type *o_ptr; /*** Recharge equipment ***/ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { /* Get the object */ o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; /* Recharge activatable objects */ if (recharge_timeout(o_ptr)) { charged = TRUE; /* Message if an item recharged */ recharged_notice(o_ptr, TRUE); } } /* Notice changes */ if (charged) { /* Window stuff */ p_ptr->redraw |= (PR_EQUIP); } charged = FALSE; /*** Recharge the inventory ***/ for (i = 0; i < INVEN_PACK; i++) { o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; discharged_stack = (number_charging(o_ptr) == o_ptr->number) ? TRUE : FALSE; /* Recharge rods, and update if any rods are recharged */ if (o_ptr->tval == TV_ROD && recharge_timeout(o_ptr)) { charged = TRUE; /* Entire stack is recharged */ if (o_ptr->timeout == 0) recharged_notice(o_ptr, TRUE); /* Previously exhausted stack has acquired a charge */ else if (discharged_stack) recharged_notice(o_ptr, FALSE); } } /* Notice changes */ if (charged) { /* Combine pack */ p_ptr->notice |= (PN_COMBINE); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN); } /*** Recharge the ground ***/ for (i = 1; i < o_max; i++) { /* Get the object */ o_ptr = object_byid(i); /* Skip dead objects */ if (!o_ptr->kind) continue; /* Recharge rods on the ground */ if (o_ptr->tval == TV_ROD) recharge_timeout(o_ptr); } } static void play_ambient_sound(void) { /* Town sound */ if (p_ptr->depth == 0) { /* Hack - is it daytime or nighttime? */ if (turn % (10L * TOWN_DAWN) < TOWN_DAWN / 2) { /* It's day. */ sound(MSG_AMBIENT_DAY); } else { /* It's night. */ sound(MSG_AMBIENT_NITE); } } /* Dungeon level 1-20 */ else if (p_ptr->depth <= 20) { sound(MSG_AMBIENT_DNG1); } /* Dungeon level 21-40 */ else if (p_ptr->depth <= 40) { sound(MSG_AMBIENT_DNG2); } /* Dungeon level 41-60 */ else if (p_ptr->depth <= 60) { sound(MSG_AMBIENT_DNG3); } /* Dungeon level 61-80 */ else if (p_ptr->depth <= 80) { sound(MSG_AMBIENT_DNG4); } /* Dungeon level 80- */ else { sound(MSG_AMBIENT_DNG5); } } /* * Helper for process_world -- decrement p_ptr->timed[] fields. */ static void decrease_timeouts(void) { int adjust = (adj_con_fix[p_ptr->state.stat_ind[A_CON]] + 1); int i; /* Decrement all effects that can be done simply */ for (i = 0; i < TMD_MAX; i++) { int decr = 1; if (!p_ptr->timed[i]) continue; switch (i) { case TMD_CUT: { /* Hack -- check for truly "mortal" wound */ decr = (p_ptr->timed[i] > 1000) ? 0 : adjust; break; } case TMD_POISONED: case TMD_STUN: { decr = adjust; break; } } /* Decrement the effect */ player_dec_timed(p_ptr, i, decr, FALSE); } return; } /* * Handle certain things once every 10 game turns */ static void process_world(struct cave *c) { int i; int regen_amount; object_type *o_ptr; /* Every 10 game turns */ if (turn % 10) return; /*** Check the Time ***/ /* Play an ambient sound at regular intervals. */ if (!(turn % ((10L * TOWN_DAWN) / 4))) { play_ambient_sound(); } /*** Handle the "town" (stores and sunshine) ***/ /* While in town */ if (!p_ptr->depth) { /* Hack -- Daybreak/Nighfall in town */ if (!(turn % ((10L * TOWN_DAWN) / 2))) { bool dawn; /* Check for dawn */ dawn = (!(turn % (10L * TOWN_DAWN))); /* Day breaks */ if (dawn) msg("The sun has risen."); /* Night falls */ else msg("The sun has fallen."); /* Illuminate */ cave_illuminate(c, dawn); } } /* While in the dungeon */ else { /* Update the stores once a day (while in the dungeon). The changes are not actually made until return to town, to avoid giving details away in the knowledge menu. */ if (!(turn % (10L * STORE_TURNS))) daycount++; } /*** Process the monsters ***/ /* Check for creature generation */ if (one_in_(MAX_M_ALLOC_CHANCE)) { /* Make a new monster */ (void)pick_and_place_distant_monster(cave, loc(p_ptr->px, p_ptr->py), MAX_SIGHT + 5, TRUE, p_ptr->depth); } /* Hack -- Check for creature regeneration */ if (!(turn % 100)) regen_monsters(); /*** Damage over Time ***/ /* Take damage from poison */ if (p_ptr->timed[TMD_POISONED]) { /* Take damage */ take_hit(p_ptr, 1, "poison"); } /* Take damage from cuts */ if (p_ptr->timed[TMD_CUT]) { /* Mortal wound or Deep Gash */ if (p_ptr->timed[TMD_CUT] > 200) i = 3; /* Severe cut */ else if (p_ptr->timed[TMD_CUT] > 100) i = 2; /* Other cuts */ else i = 1; /* Take damage */ take_hit(p_ptr, i, "a fatal wound"); } /*** Check the Food, and Regenerate ***/ /* Digest normally */ if (!(turn % 100)) { /* Basic digestion rate based on speed */ i = extract_energy[p_ptr->state.speed] * 2; /* Regeneration takes more food */ if (check_state(p_ptr, OF_REGEN, p_ptr->state.flags)) i += 30; /* Slow digestion takes less food */ if (check_state(p_ptr, OF_SLOW_DIGEST, p_ptr->state.flags)) i /= 5; /* Minimal digestion */ if (i < 1) i = 1; /* Digest some food */ player_set_food(p_ptr, p_ptr->food - i); } /* Getting Faint */ if (p_ptr->food < PY_FOOD_FAINT) { /* Faint occasionally */ if (!p_ptr->timed[TMD_PARALYZED] && one_in_(10)) { /* Message */ msg("You faint from the lack of food."); disturb(p_ptr, 1, 0); /* Faint (bypass free action) */ (void)player_inc_timed(p_ptr, TMD_PARALYZED, 1 + randint0(5), TRUE, FALSE); } } /* Starve to death (slowly) */ if (p_ptr->food < PY_FOOD_STARVE) { /* Calculate damage */ i = (PY_FOOD_STARVE - p_ptr->food) / 10; /* Take damage */ take_hit(p_ptr, i, "starvation"); } /** Regenerate HP **/ /* Default regeneration */ if (p_ptr->food >= PY_FOOD_WEAK) regen_amount = PY_REGEN_NORMAL; else if (p_ptr->food < PY_FOOD_STARVE) regen_amount = 0; else if (p_ptr->food < PY_FOOD_FAINT) regen_amount = PY_REGEN_FAINT; else /* if (p_ptr->food < PY_FOOD_WEAK) */ regen_amount = PY_REGEN_WEAK; /* Various things speed up regeneration */ if (check_state(p_ptr, OF_REGEN, p_ptr->state.flags)) regen_amount *= 2; if (p_ptr->searching || player_resting_can_regenerate(p_ptr)) regen_amount *= 2; /* Some things slow it down */ if (check_state(p_ptr, OF_IMPAIR_HP, p_ptr->state.flags)) regen_amount /= 2; /* Various things interfere with physical healing */ if (p_ptr->timed[TMD_PARALYZED]) regen_amount = 0; if (p_ptr->timed[TMD_POISONED]) regen_amount = 0; if (p_ptr->timed[TMD_STUN]) regen_amount = 0; if (p_ptr->timed[TMD_CUT]) regen_amount = 0; /* Regenerate Hit Points if needed */ if (p_ptr->chp < p_ptr->mhp) regenhp(regen_amount); /** Regenerate SP **/ /* Default regeneration */ regen_amount = PY_REGEN_NORMAL; /* Various things speed up regeneration */ if (check_state(p_ptr, OF_REGEN, p_ptr->state.flags)) regen_amount *= 2; if (p_ptr->searching || player_resting_can_regenerate(p_ptr)) regen_amount *= 2; /* Some things slow it down */ if (check_state(p_ptr, OF_IMPAIR_MANA, p_ptr->state.flags)) regen_amount /= 2; /* Regenerate mana */ if (p_ptr->csp < p_ptr->msp) regenmana(regen_amount); /*** Timeout Various Things ***/ decrease_timeouts(); /*** Process Light ***/ /* Check for light being wielded */ o_ptr = &p_ptr->inventory[INVEN_LIGHT]; /* Burn some fuel in the current light */ if (o_ptr->tval == TV_LIGHT) { bitflag f[OF_SIZE]; bool burn_fuel = TRUE; /* Get the object flags */ object_flags(o_ptr, f); /* Turn off the wanton burning of light during the day in the town */ if (!p_ptr->depth && ((turn % (10L * TOWN_DAWN)) < ((10L * TOWN_DAWN) / 2))) burn_fuel = FALSE; /* If the light has the NO_FUEL flag, well... */ if (of_has(f, OF_NO_FUEL)) burn_fuel = FALSE; /* Use some fuel (except on artifacts, or during the day) */ if (burn_fuel && o_ptr->timeout > 0) { /* Decrease life-span */ o_ptr->timeout--; /* Hack -- notice interesting fuel steps */ if ((o_ptr->timeout < 100) || (!(o_ptr->timeout % 100))) /* Redraw stuff */ p_ptr->redraw |= (PR_EQUIP); /* Hack -- Special treatment when blind */ if (p_ptr->timed[TMD_BLIND]) { /* Hack -- save some light for later */ if (o_ptr->timeout == 0) o_ptr->timeout++; /* The light is now out */ } else if (o_ptr->timeout == 0) { disturb(p_ptr, 0, 0); msg("Your light has gone out!"); /* If it's a torch, now is the time to delete it */ if (o_ptr->sval == SV_LIGHT_TORCH) { inven_item_increase(INVEN_LIGHT, -1); inven_item_optimize(INVEN_LIGHT); } } /* The light is getting dim */ else if ((o_ptr->timeout < 50) && (!(o_ptr->timeout % 20))) { disturb(p_ptr, 0, 0); msg("Your light is growing faint."); } } } /* Calculate torch radius */ p_ptr->update |= (PU_TORCH); /*** Process Inventory ***/ /* Handle experience draining */ if (check_state(p_ptr, OF_DRAIN_EXP, p_ptr->state.flags)) { if ((p_ptr->exp > 0) && one_in_(10)) { s32b d = damroll(10, 6) + (p_ptr->exp/100) * MON_DRAIN_LIFE; player_exp_lose(p_ptr, d / 10, FALSE); } wieldeds_notice_flag(p_ptr, OF_DRAIN_EXP); } /* Recharge activatable objects and rods */ recharge_objects(); /* Feel the inventory */ sense_inventory(); /*** Involuntary Movement ***/ /* Random teleportation */ if (check_state(p_ptr, OF_TELEPORT, p_ptr->state.flags) && one_in_(50)) { wieldeds_notice_flag(p_ptr, OF_TELEPORT); teleport_player(40); disturb(p_ptr, 0, 0); } /* Delayed Word-of-Recall */ if (p_ptr->word_recall) { /* Count down towards recall */ p_ptr->word_recall--; /* Activate the recall */ if (!p_ptr->word_recall) { /* Disturbing! */ disturb(p_ptr, 0, 0); /* Determine the level */ if (p_ptr->depth) { msgt(MSG_TPLEVEL, "You feel yourself yanked upwards!"); dungeon_change_level(0); } else { msgt(MSG_TPLEVEL, "You feel yourself yanked downwards!"); /* Force descent to a lower level if allowed */ if (OPT(birth_force_descend) && p_ptr->max_depth < MAX_DEPTH - 1 && !is_quest(p_ptr->max_depth)){ p_ptr->max_depth = p_ptr->max_depth + 1; } /* New depth - back to max depth or 1, whichever is deeper */ dungeon_change_level(p_ptr->max_depth < 1 ? 1: p_ptr->max_depth); } } } /* Delayed Deep Descent */ if (p_ptr->deep_descent) { /* Count down towards recall */ p_ptr->deep_descent--; /* Activate the recall */ if (p_ptr->deep_descent == 0) { int target_depth = p_ptr->max_depth; /* Calculate target depth */ for (i = 5; i > 0; i--) { if (is_quest(target_depth)) break; if (target_depth >= MAX_DEPTH - 1) break; target_depth++; } disturb(p_ptr, 0, 0); /* Determine the level */ if (target_depth > p_ptr->depth) { msgt(MSG_TPLEVEL, "The floor opens beneath you!"); dungeon_change_level(target_depth); } else { /* Otherwise do something disastrous */ msgt(MSG_TPLEVEL, "You are thrown back in an explosion!"); destroy_area(p_ptr->py, p_ptr->px, 5, TRUE); } } } } /* * Hack -- helper function for "process_player()" * * Check for changes in the "monster memory" */ static void process_player_aux(void) { int i; bool changed = FALSE; static monster_race *old_monster_race = 0; static bitflag old_flags[RF_SIZE]; static bitflag old_spell_flags[RSF_SIZE]; static byte old_blows[MONSTER_BLOW_MAX]; static byte old_cast_innate = 0; static byte old_cast_spell = 0; /* Tracking a monster */ if (p_ptr->monster_race) { /* Get the monster lore */ monster_lore *l_ptr = get_lore(p_ptr->monster_race); for (i = 0; i < MONSTER_BLOW_MAX; i++) { if (old_blows[i] != l_ptr->blows[i]) { changed = TRUE; break; } } /* Check for change of any kind */ if (changed || (old_monster_race != p_ptr->monster_race) || !rf_is_equal(old_flags, l_ptr->flags) || !rsf_is_equal(old_spell_flags, l_ptr->spell_flags) || (old_cast_innate != l_ptr->cast_innate) || (old_cast_spell != l_ptr->cast_spell)) { /* Memorize old race */ old_monster_race = p_ptr->monster_race; /* Memorize flags */ rf_copy(old_flags, l_ptr->flags); rsf_copy(old_spell_flags, l_ptr->spell_flags); /* Memorize blows */ memmove(old_blows, l_ptr->blows, sizeof(byte)*MONSTER_BLOW_MAX); /* Memorize castings */ old_cast_innate = l_ptr->cast_innate; old_cast_spell = l_ptr->cast_spell; /* Redraw stuff */ p_ptr->redraw |= (PR_MONSTER); redraw_stuff(p_ptr); } } } /* * Place cursor on a monster or the player. */ static void place_cursor(void) { if (OPT(show_target) && target_sighted()) { s16b col, row; target_get(&col, &row); move_cursor_relative(row, col); } } /* * Process the player * * Notice the annoying code to handle "pack overflow", which * must come first just in case somebody manages to corrupt * the savefiles by clever use of menu commands or something. * * Notice the annoying code to handle "monster memory" changes, * which allows us to avoid having to update the window flags * every time we change any internal monster memory field, and * also reduces the number of times that the recall window must * be redrawn. * * Note that the code to check for user abort during repeated commands * and running and resting can be disabled entirely with an option, and * even if not disabled, it will only check during every 128th game turn * while resting, for efficiency. */ static void process_player(void) { int i; /*** Check for interrupts ***/ player_resting_complete_special(p_ptr); /* Check for "player abort" */ if (p_ptr->running || cmd_get_nrepeats() > 0 || (player_is_resting(p_ptr) && !(turn & 0x7F))) { ui_event e; /* Do not wait */ inkey_scan = SCAN_INSTANT; /* Check for a key */ e = inkey_ex(); if (e.type != EVT_NONE) { /* Flush and disturb */ flush(); disturb(p_ptr, 0, 0); msg("Cancelled."); } } /*** Handle actual user input ***/ /* Repeat until energy is reduced */ do { /* Notice stuff (if needed) */ if (p_ptr->notice) notice_stuff(p_ptr); /* Update stuff (if needed) */ if (p_ptr->update) update_stuff(p_ptr); /* Redraw stuff (if needed) */ if (p_ptr->redraw) redraw_stuff(p_ptr); /* Place cursor on player/target */ place_cursor(); /* Refresh (optional) */ Term_fresh(); /* Hack -- Pack Overflow */ pack_overflow(); /* Assume free turn */ p_ptr->energy_use = 0; /* Dwarves detect treasure */ if (player_has(PF_SEE_ORE)) { /* Only if they are in good shape */ if (!p_ptr->timed[TMD_IMAGE] && !p_ptr->timed[TMD_CONFUSED] && !p_ptr->timed[TMD_AMNESIA] && !p_ptr->timed[TMD_STUN] && !p_ptr->timed[TMD_PARALYZED] && !p_ptr->timed[TMD_TERROR] && !p_ptr->timed[TMD_AFRAID]) detect_close_buried_treasure(); } /* Paralyzed or Knocked Out */ if ((p_ptr->timed[TMD_PARALYZED]) || (p_ptr->timed[TMD_STUN] >= 100)) { /* Take a turn */ p_ptr->energy_use = 100; } /* Picking up objects */ else if (p_ptr->notice & PN_PICKUP) { p_ptr->energy_use = do_autopickup() * 10; if (p_ptr->energy_use > 100) p_ptr->energy_use = 100; p_ptr->notice &= ~(PN_PICKUP); /* Appropriate time for the player to see objects */ event_signal(EVENT_SEEFLOOR); } /* Resting */ else if (player_is_resting(p_ptr)) { player_resting_step_turn(p_ptr); } /* Running */ else if (p_ptr->running) { /* Take a step */ run_step(0); } /* Repeated command */ else if (cmd_get_nrepeats() > 0) { /* Hack -- Assume messages were seen */ msg_flag = FALSE; /* Clear the top line */ prt("", 0, 0); /* Process the command */ process_command(CMD_GAME, TRUE); } /* Normal command */ else { /* Check monster recall */ process_player_aux(); /* Place cursor on player/target */ place_cursor(); /* Get and process a command */ process_command(CMD_GAME, FALSE); /* Mega hack - redraw if big graphics - sorry NRM */ if ((tile_width > 1) || (tile_height > 1)) p_ptr->redraw |= (PR_MAP); } /*** Clean up ***/ /* Significant */ if (p_ptr->energy_use) { /* Use some energy */ p_ptr->energy -= p_ptr->energy_use; /* Increment the total energy counter */ p_ptr->total_energy += p_ptr->energy_use; /* Hack -- constant hallucination */ if (p_ptr->timed[TMD_IMAGE]) { p_ptr->redraw |= (PR_MAP); } /* Shimmer multi-hued monsters */ for (i = 1; i < cave_monster_max(cave); i++) { struct monster *mon = cave_monster(cave, i); if (!mon->race) continue; if (!rf_has(mon->race->flags, RF_ATTR_MULTI)) continue; cave_light_spot(cave, mon->fy, mon->fx); } /* Clear NICE flag, and show marked monsters */ for (i = 1; i < cave_monster_max(cave); i++) { struct monster *mon = cave_monster(cave, i); mon->mflag &= ~MFLAG_NICE; if (mon->mflag & MFLAG_MARK) { if (!(mon->mflag & MFLAG_SHOW)) { mon->mflag &= ~MFLAG_MARK; update_mon(mon, FALSE); } } } } /* Clear SHOW flag */ for (i = 1; i < cave_monster_max(cave); i++) { struct monster *mon = cave_monster(cave, i); mon->mflag &= ~MFLAG_SHOW; } /* HACK: This will redraw the itemlist too frequently, but I'm don't know all the individual places it should go. */ p_ptr->redraw |= PR_ITEMLIST; } while (!p_ptr->energy_use && !p_ptr->leaving); /* Notice stuff (if needed) */ if (p_ptr->notice) notice_stuff(p_ptr); } static byte flicker = 0; static byte color_flicker[MAX_COLORS][3] = { {TERM_DARK, TERM_L_DARK, TERM_L_RED}, {TERM_WHITE, TERM_L_WHITE, TERM_L_BLUE}, {TERM_SLATE, TERM_WHITE, TERM_L_DARK}, {TERM_ORANGE, TERM_YELLOW, TERM_L_RED}, {TERM_RED, TERM_L_RED, TERM_L_PINK}, {TERM_GREEN, TERM_L_GREEN, TERM_L_TEAL}, {TERM_BLUE, TERM_L_BLUE, TERM_SLATE}, {TERM_UMBER, TERM_L_UMBER, TERM_MUSTARD}, {TERM_L_DARK, TERM_SLATE, TERM_L_VIOLET}, {TERM_WHITE, TERM_SLATE, TERM_L_WHITE}, {TERM_L_PURPLE, TERM_PURPLE, TERM_L_VIOLET}, {TERM_YELLOW, TERM_L_YELLOW, TERM_MUSTARD}, {TERM_L_RED, TERM_RED, TERM_L_PINK}, {TERM_L_GREEN, TERM_L_TEAL, TERM_GREEN}, {TERM_L_BLUE, TERM_DEEP_L_BLUE, TERM_BLUE_SLATE}, {TERM_L_UMBER, TERM_UMBER, TERM_MUD}, {TERM_PURPLE, TERM_VIOLET, TERM_MAGENTA}, {TERM_VIOLET, TERM_L_VIOLET, TERM_MAGENTA}, {TERM_TEAL, TERM_L_TEAL, TERM_L_GREEN}, {TERM_MUD, TERM_YELLOW, TERM_UMBER}, {TERM_L_YELLOW, TERM_WHITE, TERM_L_UMBER}, {TERM_MAGENTA, TERM_L_PINK, TERM_L_RED}, {TERM_L_TEAL, TERM_L_WHITE, TERM_TEAL}, {TERM_L_VIOLET, TERM_L_PURPLE, TERM_VIOLET}, {TERM_L_PINK, TERM_L_RED, TERM_L_WHITE}, {TERM_MUSTARD, TERM_YELLOW, TERM_UMBER}, {TERM_BLUE_SLATE, TERM_BLUE, TERM_SLATE}, {TERM_DEEP_L_BLUE, TERM_L_BLUE, TERM_BLUE}, }; static byte get_flicker(byte a) { switch(flicker % 3) { case 1: return color_flicker[a][1]; case 2: return color_flicker[a][2]; } return a; } /* * This animates monsters and/or items as necessary. */ static void do_animation(void) { int i; for (i = 1; i < cave_monster_max(cave); i++) { byte attr; monster_type *m_ptr = cave_monster(cave, i); if (!m_ptr || !m_ptr->race || !m_ptr->ml) continue; else if (rf_has(m_ptr->race->flags, RF_ATTR_MULTI)) attr = randint1(BASIC_COLORS - 1); else if (rf_has(m_ptr->race->flags, RF_ATTR_FLICKER)) attr = get_flicker(m_ptr->race->x_attr); else continue; m_ptr->attr = attr; p_ptr->redraw |= (PR_MAP | PR_MONLIST); } flicker++; } /* * This is used when the user is idle to allow for simple animations. * Currently the only thing it really does is animate shimmering monsters. */ void idle_update(void) { if (!character_dungeon) return; if (!OPT(animate_flicker) || (use_graphics != GRAPHICS_NONE)) return; /* Animate and redraw if necessary */ do_animation(); redraw_stuff(p_ptr); /* Refresh the main screen */ Term_fresh(); } /* * Interact with the current dungeon level. * * This function will not exit until the level is completed, * the user dies, or the game is terminated. */ static void dungeon(struct cave *c) { monster_type *m_ptr; int i; /* Hack -- enforce illegal panel */ Term->offset_y = DUNGEON_HGT; Term->offset_x = DUNGEON_WID; /* Not leaving */ p_ptr->leaving = FALSE; /* Cancel the target */ target_set_monster(0); /* Cancel the health bar */ health_track(p_ptr, NULL); /* Disturb */ disturb(p_ptr, 1, 0); /* * Because changing levels doesn't take a turn and PR_MONLIST might not be * set for a few game turns, manually force an update on level change. */ monster_list_force_subwindow_update(); /* Track maximum player level */ if (p_ptr->max_lev < p_ptr->lev) { p_ptr->max_lev = p_ptr->lev; } /* Track maximum dungeon level */ if (p_ptr->max_depth < p_ptr->depth) { p_ptr->max_depth = p_ptr->depth; } /* If autosave is pending, do it now. */ if (p_ptr->autosave) { /* The borg runs so quickly that this is a bad idea. */ #ifndef ALLOW_BORG save_game(); #endif #ifdef ALLOW_BORG if (!borg_active){ save_game(); } #endif p_ptr->autosave = FALSE; } /* Choose panel */ verify_panel(); /* Flush messages */ message_flush(); /* Hack -- Increase "xtra" depth */ character_xtra++; /* Clear */ Term_clear(); /* Update stuff */ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); /* Calculate torch radius */ p_ptr->update |= (PU_TORCH); /* Update stuff */ update_stuff(p_ptr); /* Fully update the visuals (and monster distances) */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_DISTANCE); /* Fully update the flow */ p_ptr->update |= (PU_FORGET_FLOW | PU_UPDATE_FLOW); /* Redraw dungeon */ p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP); /* Redraw "statusy" things */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP | PR_MONSTER | PR_MONLIST | PR_ITEMLIST); /* Update stuff */ update_stuff(p_ptr); /* Redraw stuff */ redraw_stuff(p_ptr); /* Hack -- Decrease "xtra" depth */ character_xtra--; /* Update stuff */ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); /* Combine / Reorder the pack */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Notice stuff */ notice_stuff(p_ptr); /* Update stuff */ update_stuff(p_ptr); /* Redraw stuff */ redraw_stuff(p_ptr); /* Refresh */ Term_fresh(); /* Handle delayed death */ if (p_ptr->is_dead) return; /* Announce (or repeat) the feeling */ if (p_ptr->depth) display_feeling(FALSE); /* Give player minimum energy to start a new level, but do not reduce higher value from savefile for level in progress */ if (p_ptr->energy < INITIAL_DUNGEON_ENERGY) p_ptr->energy = INITIAL_DUNGEON_ENERGY; /*** Process this dungeon level ***/ /* Main loop */ while (TRUE) { /* Hack -- Compact the monster list occasionally */ if (cave_monster_count(cave) + 32 > z_info->m_max) compact_monsters(64); /* Hack -- Compress the monster list occasionally */ if (cave_monster_count(cave) + 32 < cave_monster_max(cave)) compact_monsters(0); /* Hack -- Compact the object list occasionally */ if (o_cnt + 32 > z_info->o_max) compact_objects(64); /* Hack -- Compress the object list occasionally */ if (o_cnt + 32 < o_max) compact_objects(0); /* Can the player move? */ while ((p_ptr->energy >= 100) && !p_ptr->leaving) { /* Do any necessary animations */ do_animation(); /* process monster with even more energy first */ process_monsters(c, (byte)(p_ptr->energy + 1)); /* if still alive */ if (!p_ptr->leaving) { /* Mega hack -redraw big graphics - sorry NRM */ if ((tile_width > 1) || (tile_height > 1)) p_ptr->redraw |= (PR_MAP); /* Process the player */ process_player(); } } /* Notice stuff */ if (p_ptr->notice) notice_stuff(p_ptr); /* Update stuff */ if (p_ptr->update) update_stuff(p_ptr); /* Redraw stuff */ if (p_ptr->redraw) redraw_stuff(p_ptr); /* Place cursor on player/target */ place_cursor(); /* Handle "leaving" */ if (p_ptr->leaving) break; /* Process all of the monsters */ process_monsters(c, 100); /* Notice stuff */ if (p_ptr->notice) notice_stuff(p_ptr); /* Update stuff */ if (p_ptr->update) update_stuff(p_ptr); /* Redraw stuff */ if (p_ptr->redraw) redraw_stuff(p_ptr); /* Place cursor on player/target */ place_cursor(); /* Handle "leaving" */ if (p_ptr->leaving) break; /* Process the world */ process_world(c); /* Notice stuff */ if (p_ptr->notice) notice_stuff(p_ptr); /* Update stuff */ if (p_ptr->update) update_stuff(p_ptr); /* Redraw stuff */ if (p_ptr->redraw) redraw_stuff(p_ptr); /* Place cursor on player/target */ place_cursor(); /* Handle "leaving" */ if (p_ptr->leaving) break; /*** Apply energy ***/ /* Give the player some energy */ p_ptr->energy += extract_energy[p_ptr->state.speed]; /* Give energy to all monsters */ for (i = cave_monster_max(cave) - 1; i >= 1; i--) { int mspeed; /* Access the monster (if alive) */ m_ptr = cave_monster(cave, i); if (!m_ptr->race) continue; /* Calculate the net speed */ mspeed = m_ptr->mspeed; if (m_ptr->m_timed[MON_TMD_FAST]) mspeed += 10; if (m_ptr->m_timed[MON_TMD_SLOW]) mspeed -= 10; /* Give this monster some energy */ m_ptr->energy += extract_energy[mspeed]; } /* Count game turns */ turn++; } } /* * Process some user pref files */ static void process_some_user_pref_files(void) { bool found; char buf[1024]; /* Process the "user.prf" file */ process_pref_file("user.prf", TRUE, TRUE); /* Get the "PLAYER.prf" filename */ strnfmt(buf, sizeof(buf), "%s.prf", player_safe_name(p_ptr, TRUE)); /* Process the "PLAYER.prf" file, using the character name */ found = process_pref_file(buf, TRUE, TRUE); /* Try pref file using savefile name if we fail using character name */ if (!found) { int filename_index = path_filename_index(savefile); char filename[128]; my_strcpy(filename, &savefile[filename_index], sizeof(filename)); strnfmt(buf, sizeof(buf), "%s.prf", filename); process_pref_file(buf, TRUE, TRUE); } } /* * Actually play a game. * * This function is called from a variety of entry points, since both * the standard "main.c" file, as well as several platform-specific * "main-xxx.c" files, call this function to start a new game with a * new savefile, start a new game with an existing savefile, or resume * a saved game with an existing savefile. * * If the "new_game" parameter is true, and the savefile contains a * living character, then that character will be killed, so that the * player may start a new game with that savefile. This is only used * by the "-n" option in "main.c". * * If the savefile does not exist, cannot be loaded, or contains a dead * character, then a new game will be started. * * Several platforms (Windows, Macintosh, Amiga) start brand new games * with "savefile" empty, and initialize it later based on the player * name. * * Note that we load the RNG state from savefiles (2.8.0 or later) and * so we only initialize it if we were unable to load it. The loading * code marks successful loading of the RNG state using the "Rand_quick" * flag, which is a hack, but which optimizes loading of savefiles. */ void play_game(void) { u32b window_flag[ANGBAND_TERM_MAX]; /* Initialize */ bool new_game = init_angband(); /*** Do horrible, hacky things, to start the game off ***/ /* Hack -- Increase "icky" depth */ character_icky++; /* Verify main term */ if (!term_screen) quit("main window does not exist"); /* Make sure main term is active */ Term_activate(term_screen); /* Verify minimum size */ if ((Term->hgt < 24) || (Term->wid < 80)) quit("main window is too small"); /* Hack -- Turn off the cursor */ (void)Term_set_cursor(FALSE); /* initialize window options that will be overridden by the savefile */ memset(window_flag, 0, sizeof(u32b)*ANGBAND_TERM_MAX); if (ANGBAND_TERM_MAX > 1) window_flag[1] = (PW_MESSAGE); if (ANGBAND_TERM_MAX > 2) window_flag[2] = (PW_INVEN); if (ANGBAND_TERM_MAX > 3) window_flag[3] = (PW_MONLIST); if (ANGBAND_TERM_MAX > 4) window_flag[4] = (PW_ITEMLIST); if (ANGBAND_TERM_MAX > 5) window_flag[5] = (PW_MONSTER | PW_OBJECT); if (ANGBAND_TERM_MAX > 6) window_flag[6] = (PW_OVERHEAD); if (ANGBAND_TERM_MAX > 7) window_flag[7] = (PW_PLAYER_2); /* Set up the subwindows */ subwindows_set_flags(window_flag, ANGBAND_TERM_MAX); /*** Try to load the savefile ***/ p_ptr->is_dead = TRUE; if (savefile[0] && file_exists(savefile)) { if (!savefile_load(savefile)) quit("broken savefile"); if (p_ptr->is_dead && arg_wizard) { p_ptr->is_dead = FALSE; p_ptr->chp = p_ptr->mhp; p_ptr->noscore |= NOSCORE_WIZARD; } } /* No living character loaded */ if (p_ptr->is_dead) { /* Make new player */ new_game = TRUE; /* The dungeon is not ready */ character_dungeon = FALSE; } /* Init RNG */ if (Rand_quick) { u32b seed; /* Basic seed */ seed = (u32b)(time(NULL)); #ifdef UNIX /* Mutate the seed on Unix machines */ seed = ((seed >> 3) * (getpid() << 1)); #endif /* Use the complex RNG */ Rand_quick = FALSE; /* Seed the "complex" RNG */ Rand_state_init(seed); } /* Roll new character */ if (new_game) { /* The dungeon is not ready */ character_dungeon = FALSE; /* Start in town */ p_ptr->depth = 0; /* Seed for flavors */ seed_flavor = randint0(0x10000000); /* Seed for town layout */ seed_town = randint0(0x10000000); /* Roll up a new character. Quickstart is allowed if ht_birth is set */ player_birth(p_ptr->ht_birth ? TRUE : FALSE); } /* Seed for random artifacts */ if (!seed_randart || (new_game && !OPT(birth_keep_randarts))) seed_randart = randint0(0x10000000); /* Randomize the artifacts if required */ if (OPT(birth_randarts)) do_randart(seed_randart, TRUE); /* Initialize temporary fields sensibly */ p_ptr->object_idx = NO_OBJECT; p_ptr->object_kind = NULL; p_ptr->monster_race = NULL; /* Set the savefile name if it's not already set */ if (!savefile[0]) savefile_set_name(player_safe_name(p_ptr, TRUE)); /* Stop the player being quite so dead */ p_ptr->is_dead = FALSE; /* Flash a message */ prt("Please wait...", 0, 0); /* Allow big cursor */ smlcurs = FALSE; /* Flush the message */ Term_fresh(); /* Flavor the objects */ flavor_init(); /* Reset visuals */ reset_visuals(TRUE); /* Tell the UI we've started. */ event_signal(EVENT_ENTER_GAME); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP | PR_MONSTER | PR_MESSAGE); redraw_stuff(p_ptr); /* Process some user pref files */ process_some_user_pref_files(); /* React to changes */ Term_xtra(TERM_XTRA_REACT, 0); /* Generate a dungeon level if needed */ if (!character_dungeon) cave_generate(cave, p_ptr); /* Character is now "complete" */ character_generated = TRUE; /* Hack -- Decrease "icky" depth */ character_icky--; /* Start playing */ p_ptr->playing = TRUE; /* Save not required yet. */ p_ptr->autosave = FALSE; /* Hack -- Enforce "delayed death" */ if (p_ptr->chp < 0) p_ptr->is_dead = TRUE; /* Process */ while (TRUE) { /* Play ambient sound on change of level. */ play_ambient_sound(); /* Process the level */ dungeon(cave); /* Notice stuff */ if (p_ptr->notice) notice_stuff(p_ptr); /* Update stuff */ if (p_ptr->update) update_stuff(p_ptr); /* Redraw stuff */ if (p_ptr->redraw) redraw_stuff(p_ptr); /* Cancel the target */ target_set_monster(0); /* Cancel the health bar */ health_track(p_ptr, NULL); /* Forget the view */ forget_view(cave); /* Handle "quit and save" */ if (!p_ptr->playing && !p_ptr->is_dead) break; /* XXX XXX XXX */ message_flush(); /* Accidental Death */ if (p_ptr->playing && p_ptr->is_dead) { /* XXX-elly: this does not belong here. Refactor or * remove. Very similar to do_cmd_wiz_cure_all(). */ if ((p_ptr->wizard || OPT(cheat_live)) && !get_check("Die? ")) { /* Mark social class, reset age, if needed */ p_ptr->age = 0; /* Increase age */ p_ptr->age++; /* Mark savefile */ p_ptr->noscore |= NOSCORE_WIZARD; /* Message */ msg("You invoke wizard mode and cheat death."); message_flush(); /* Cheat death */ p_ptr->is_dead = FALSE; /* Restore hit points */ p_ptr->chp = p_ptr->mhp; p_ptr->chp_frac = 0; /* Restore spell points */ p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; /* Hack -- Healing */ (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); (void)player_clear_timed(p_ptr, TMD_CONFUSED, TRUE); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_clear_timed(p_ptr, TMD_AFRAID, TRUE); (void)player_clear_timed(p_ptr, TMD_PARALYZED, TRUE); (void)player_clear_timed(p_ptr, TMD_IMAGE, TRUE); (void)player_clear_timed(p_ptr, TMD_STUN, TRUE); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); /* Hack -- Prevent starvation */ player_set_food(p_ptr, PY_FOOD_MAX - 1); /* Hack -- cancel recall */ if (p_ptr->word_recall) { /* Message */ msg("A tension leaves the air around you..."); message_flush(); /* Hack -- Prevent recall */ p_ptr->word_recall = 0; } /* Note cause of death XXX XXX XXX */ my_strcpy(p_ptr->died_from, "Cheating death", sizeof(p_ptr->died_from)); /* New depth */ p_ptr->depth = 0; /* Leaving */ p_ptr->leaving = TRUE; } } /* Handle "death" */ if (p_ptr->is_dead) break; /* Make a new level */ cave_generate(cave, p_ptr); } /* Disallow big cursor */ smlcurs = TRUE; /* Tell the UI we're done with the game state */ event_signal(EVENT_LEAVE_GAME); /* Close stuff */ close_game(); } angband-3.5.1/src/main-gcu.c0000644000175000017500000006266612456456606015113 0ustar chriscchrisc/* * File: main-gcu.c * Purpose: Support for "curses" systems * * Copyright (c) 1997 Ben Harrison, and others * Copyright (c) 2009-2011 Erik Osheim * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "cmds.h" #include "dungeon.h" #ifdef USE_GCU #include "main.h" #include "files.h" /* Avoid 'struct term' name conflict with (via ) on AIX */ #define term System_term /* * Include the proper "header" file */ #ifdef USE_NCURSES # ifdef HAVE_STDBOOL_H # define NCURSES_ENABLE_STDBOOL_H 0 # endif # include #else # include #endif #include #undef term /* * Use POSIX terminal I/O */ #define USE_TPOSIX /* * Hack -- Windows Console mode uses PDCURSES and cannot do any terminal stuff * Hack -- Windows needs Sleep(), and I really don't want to pull in all * the Win32 headers for this one function */ #if defined(WIN32_CONSOLE_MODE) # undef USE_TPOSIX _stdcall void Sleep(int); #define usleep(v) Sleep(v / 1000) #endif /* * POSIX stuff */ #ifdef USE_TPOSIX # include #endif /* * If you have errors relating to curs_set(), comment out the following line */ #define USE_CURS_SET /* * If you have errors with any of the functions mentioned below, try * uncommenting the line it's mentioned on. */ /* #define cbreak() crmode() */ /* #define nonl() */ /* #define nl() */ /* * Save the "normal" and "angband" terminal settings */ #ifdef USE_TPOSIX static struct termios norm_termios; static struct termios game_termios; #endif /* * The TERM environment variable; used for terminal capabilities. */ static char *termtype; static bool loaded_terminfo; /* * Information about a term */ typedef struct term_data { term t; /* All term info */ WINDOW *win; /* Pointer to the curses window */ } term_data; /* Max number of windows on screen */ #define MAX_TERM_DATA 6 /* Minimum main term size */ #define MIN_TERM0_LINES 24 #define MIN_TERM0_COLS 80 /* Comfortable subterm size */ #define COMFY_SUBTERM_LINES 5 #define COMFY_SUBTERM_COLS 40 /* Information about our windows */ static term_data data[MAX_TERM_DATA]; /* Number of initialized "term" structures */ static int active = 0; #ifdef A_COLOR /* * Hack -- define "A_BRIGHT" to be "A_BOLD", because on many * machines, "A_BRIGHT" produces ugly "inverse" video. */ #ifndef A_BRIGHT # define A_BRIGHT A_BOLD #endif /* * Software flag -- we are allowed to use color */ static int can_use_color = FALSE; /* * Simple Angband to Curses color conversion table */ static int colortable[BASIC_COLORS]; /* Screen info: use one big Term 0, or other subwindows? */ static bool bold_extended = FALSE; static bool ascii_walls = FALSE; static int term_count = 4; /* * Background color we should draw with; either BLACK or DEFAULT */ static int bg_color = COLOR_BLACK; #define PAIR_WHITE 0 #define PAIR_RED 1 #define PAIR_GREEN 2 #define PAIR_YELLOW 3 #define PAIR_BLUE 4 #define PAIR_MAGENTA 5 #define PAIR_CYAN 6 #define PAIR_BLACK 7 #endif /* * Place the "keymap" into its "normal" state */ static void keymap_norm(void) { #ifdef USE_TPOSIX (void)tcsetattr(0, TCSAFLUSH, &norm_termios); #endif } /* * Place the "keymap" into the "game" state */ static void keymap_game(void) { #ifdef USE_TPOSIX /* Set the game's termios settings */ (void)tcsetattr(0, TCSAFLUSH, &game_termios); #endif } /* * Save the normal keymap */ static void keymap_norm_prepare(void) { #ifdef USE_TPOSIX /* Restore the normal termios settings */ tcgetattr(0, &norm_termios); #endif } /* * Save the keymaps (normal and game) */ static void keymap_game_prepare(void) { #ifdef USE_TPOSIX /* Save the current termios settings */ tcgetattr(0, &game_termios); /* Force "Ctrl-C" to interupt */ game_termios.c_cc[VINTR] = (char)3; /* Force "Ctrl-Z" to suspend */ game_termios.c_cc[VSUSP] = (char)26; #ifdef VDSUSP /* Hack -- disable "Ctrl-Y" on *BSD */ game_termios.c_cc[VDSUSP] = (char)-1; #endif /* Disable the standard control characters */ game_termios.c_cc[VQUIT] = (char)-1; game_termios.c_cc[VERASE] = (char)-1; game_termios.c_cc[VKILL] = (char)-1; game_termios.c_cc[VEOF] = (char)-1; game_termios.c_cc[VEOL] = (char)-1; /* Normally, block until a character is read */ game_termios.c_cc[VMIN] = 1; game_termios.c_cc[VTIME] = 0; /* Turn off flow control (enable ^S) */ game_termios.c_iflag &= ~IXON; #endif } /* * Suspend/Resume */ static errr Term_xtra_gcu_alive(int v) { if (!v) { /* Suspend */ int x, y; /* Go to normal keymap mode */ keymap_norm(); /* Restore modes */ nocbreak(); echo(); nl(); /* Hack -- make sure the cursor is visible */ Term_xtra(TERM_XTRA_SHAPE, 1); /* Flush the curses buffer */ refresh(); /* Get current cursor position */ getyx(stdscr, y, x); /* Move the cursor to bottom right corner */ mvcur(y, x, LINES - 1, 0); /* Exit curses */ endwin(); /* Flush the output */ fflush(stdout); } else { /* Resume */ /* Restore the settings */ cbreak(); noecho(); nonl(); /* Go to angband keymap mode */ keymap_game(); } /* Success */ return 0; } const char help_gcu[] = "Text mode, subopts\n -a Use ASCII walls\n -b Big screen (equivalent to -n1)\n -B Use brighter bold characters\n -nN Use N terminals (up to 6)"; /* * Usage: * * angband -mgcu -- [-a] [-b] [-B] [-nN] * * -a Use ASCII walls * -b Big screen (equivalent to -n1) * -B Use brighter bold characters * -nN Use N terminals (up to 6) */ /* * Init the "curses" system */ static void Term_init_gcu(term *t) { term_data *td = (term_data *)(t->data); /* * This is necessary to keep the first call to getch() * from clearing the screen */ wrefresh(stdscr); /* Count init's, handle first */ if (active++ != 0) return; /* Erase the window */ wclear(td->win); /* Reset the cursor */ wmove(td->win, 0, 0); /* Flush changes */ wrefresh(td->win); /* Game keymap */ keymap_game(); } /* * Nuke the "curses" system */ static void Term_nuke_gcu(term *t) { int x, y; term_data *td = (term_data *)(t->data); /* Delete this window */ delwin(td->win); /* Count nuke's, handle last */ if (--active != 0) return; /* Hack -- make sure the cursor is visible */ Term_xtra(TERM_XTRA_SHAPE, 1); #ifdef A_COLOR /* Reset colors to defaults */ start_color(); #endif /* Get current cursor position */ getyx(stdscr, y, x); /* Move the cursor to bottom right corner */ mvcur(y, x, LINES - 1, 0); /* Flush the curses buffer */ refresh(); /* Exit curses */ endwin(); /* Flush the output */ fflush(stdout); /* Normal keymap */ keymap_norm(); } /* * Helper function for get_gcu_term_size: * Given inputs, populates size and start (rows and y, or cols and x) * with correct values for a group (column or row) of terms. * term_group_index: the placement of the group, e.g. * top row is 0 * term_group_count: the number of groups in this dimension (2 or 3) * window_size: the number of grids the window has in this dimension * min_term0_size: the minimum main term size in this dimension * (80 or 24), also the maximum subterm size * comfy_subterm_size: in balancing among three groups, we first give the * main term its minimum, and then allocate evenly between the other * two subterms until they are both comfy_subterm_size, at which point * we grow the outer subterm until it reaches min_term0_size. (The * middle subterm then grows until min_term0_size, and any further * window space goes to the main term.) */ static void balance_dimension(int *size, int *start, int term_group_index, int term_group_count, int window_size, int min_term0_size, int comfy_subterm_size) { /* Convenience variable for clarity. * Note that it is also the number of separator rows/columns */ int subterm_group_count = term_group_count - 1; if (term_group_index == 0) { /* main term */ *size = MAX(min_term0_size, window_size - subterm_group_count*(min_term0_size + 1)); *start = 0; } else if (term_group_index == term_group_count - 1) { /* outer or only subterm */ if (window_size <= min_term0_size + subterm_group_count*(comfy_subterm_size + 1)) { /* Not enough room for min term0 and all subterms comfy. * Note that we round up here and down for the middle subterm*/ *size = (window_size - min_term0_size - subterm_group_count) / subterm_group_count; if (window_size > min_term0_size + subterm_group_count + *size * subterm_group_count) (*size)++; } else { *size = MIN(min_term0_size, window_size - min_term0_size - comfy_subterm_size*(subterm_group_count - 1) - subterm_group_count); } *start = window_size - *size; } else { /* middle subterm */ if (window_size <= subterm_group_count*(min_term0_size + 1) + comfy_subterm_size) { /* Outer subterm(s) not yet full-sized, thus at most comfy */ *size = MIN(comfy_subterm_size, (window_size - min_term0_size - subterm_group_count) / subterm_group_count); } else { *size = MIN(min_term0_size, window_size - subterm_group_count*(min_term0_size + 1)); } *start = 1 + MAX(min_term0_size, window_size - subterm_group_count*(min_term0_size + 1)); } } /* * For a given term number (i) set the upper left corner (x, y) and the * correct dimensions. Remember to leave one row and column between * subterms. */ static void get_gcu_term_size(int i, int *rows, int *cols, int *y, int *x) { bool is_wide = (10 * LINES < 3 * COLS); int term_rows = 1; int term_cols = 1; int term_row_index = 0; int term_col_index = 0; assert(i < term_count); /* For sufficiently small windows, we can only use one term. * Each additional row/column of terms requires at least two lines * for the separators. If everything is as square as possible, * the 3rd, 7th, 13th, etc. terms add to the short dimension, while * the 2nd, 5th, 10th, etc. terms add to the long dimension. * However, three terms are the special case of 1x3 or 3x1. */ if (is_wide) { while (term_rows*(term_rows + 1) < term_count) term_rows++; while (term_cols*term_cols < term_count) term_cols++; if (term_count == 3) { term_rows = 1; term_cols = 3; } term_col_index = i % term_cols; term_row_index = (int)(i / term_cols); } else { /* !is_wide */ while (term_rows*term_rows < term_count) term_rows++; while (term_cols*(term_cols + 1) < term_count) term_cols++; if (term_count == 3) { term_rows = 3; term_cols = 1; } term_col_index = (int)(i / term_rows); term_row_index = i % term_rows; } if (LINES < MIN_TERM0_LINES + 2 * (term_rows - 1) || COLS < MIN_TERM0_COLS + 2 * (term_cols - 1)) { term_rows = term_cols = term_count = 1; if (i != 0) { *rows = *cols = *y = *x = 0; } term_col_index = term_row_index = 0; } balance_dimension(cols, x, term_col_index, term_cols, COLS, MIN_TERM0_COLS, COMFY_SUBTERM_COLS); balance_dimension(rows, y, term_row_index, term_rows, LINES, MIN_TERM0_LINES, COMFY_SUBTERM_LINES); } /* * Query ncurses for new screen size and try to resize the GCU terms. */ static void do_gcu_resize(void) { int i, rows, cols, y, x; term *old_t = Term; for (i = 0; i < term_count; i++) { /* Activate the current Term */ Term_activate(&data[i].t); /* If we can resize the curses window, then resize the Term */ get_gcu_term_size(i, &rows, &cols, &y, &x); if (wresize(data[i].win, rows, cols) == OK) Term_resize(cols, rows); /* Activate the old term */ Term_activate(old_t); } do_cmd_redraw(); } /* * Process events, with optional wait */ static errr Term_xtra_gcu_event(int v) { int i, j, k, mods=0; if (v) { /* Wait for a keypress; use halfdelay(1) so if the user takes more */ /* than 0.2 seconds we get a chance to do updates. */ halfdelay(2); i = getch(); while (i == ERR) { i = getch(); idle_update(); } cbreak(); } else { /* Do not wait for it */ nodelay(stdscr, TRUE); /* Check for keypresses */ i = getch(); /* Wait for it next time */ nodelay(stdscr, FALSE); /* None ready */ if (i == ERR) return (1); if (i == EOF) return (1); } /* Not sure if this is portable to non-ncurses platforms */ #ifdef USE_NCURSES if (i == KEY_RESIZE) { /* wait until we go one second (10 deci-seconds) before actually * doing the resizing. users often end up triggering multiple * KEY_RESIZE events while changing window size. */ halfdelay(10); do { i = getch(); } while (i == KEY_RESIZE); cbreak(); do_gcu_resize(); if (i == ERR) return (1); } #endif /* uncomment to debug keycode issues */ #if 0 printw("key %d", i); wrefresh(stdscr); #endif /* This might be a bad idea, but... * * Here we try to second-guess ncurses. In some cases, keypad() mode will * fail to translate multi-byte escape sequences into things like number- * pad actions, function keys, etc. So we can hardcode a small list of some * of the most common sequences here, just in case. * * Notice that we turn nodelay() on. This means, that we won't accidentally * interpret sequences as valid unless all the bytes are immediately * available; this seems like an acceptable risk to fix problems associated * with various terminal emulators (I'm looking at you PuTTY). */ if (i == 27) { /* ESC */ nodelay(stdscr, TRUE); j = getch(); switch (j) { case 'O': { k = getch(); switch (k) { /* PuTTY number pad */ case 'q': i = '1'; break; case 'r': i = '2'; break; case 's': i = '3'; break; case 't': i = '4'; break; case 'u': i = '5'; break; case 'v': i = '6'; break; case 'w': i = '7'; break; case 'x': i = '8'; break; case 'y': i = '9'; break; /* no match */ case ERR: break; default: ungetch(k); ungetch(j); } break; } /* no match */ case ERR: break; default: ungetch(j); } nodelay(stdscr, FALSE); } #ifdef KEY_DOWN /* Handle arrow keys */ switch (i) { case KEY_DOWN: i = ARROW_DOWN; break; case KEY_UP: i = ARROW_UP; break; case KEY_LEFT: i = ARROW_LEFT; break; case KEY_RIGHT: i = ARROW_RIGHT; break; case KEY_DC: i = KC_DELETE; break; case KEY_BACKSPACE: i = KC_BACKSPACE; break; case KEY_ENTER: i = KC_ENTER; mods |= KC_MOD_KEYPAD; break; case 9: i = KC_TAB; break; case 13: i = KC_ENTER; break; case 27: i = ESCAPE; break; /* keypad keys */ case 0xFC: i = '0'; break; case 0xFD: i = '.'; break; case 0xC0: i = '\b'; break; case 0xDF: i = '1'; break; case 0xF5: i = '3'; break; case 0xE9: i = '5'; break; case 0xC1: i = '7'; break; case 0xF4: i = '9'; break; default: { if (i < KEY_MIN) break; /* Mega-Hack -- Fold, spindle, and mutilate * the keys to fit in 7 bits. */ if (i >= 252) i = KEY_F(63) - (i - 252); if (i >= ARROW_DOWN) i += 4; i = 128 + (i & 127); break; } } #endif /* Enqueue the keypress */ Term_keypress(i, mods); /* Success */ return (0); } static int scale_color(int i, int j, int scale) { return (angband_color_table[i][j] * (scale - 1) + 127) / 255; } static int create_color(int i, int scale) { int r = scale_color(i, 1, scale); int g = scale_color(i, 2, scale); int b = scale_color(i, 3, scale); int rgb = 16 + scale * scale * r + scale * g + b; /* In the case of white and black we need to use the ANSI colors */ if (r == g && g == b) { if (b == 0) rgb = 0; if (b == scale) rgb = 15; } return rgb; } /* * React to changes */ static errr Term_xtra_gcu_react(void) { if (ascii_walls) { int i; ascii_walls = FALSE; for (i = 0; i < 4; i++) { // magma as %:D f_info[50].x_char[i] = f_info[52].x_char[i] = 0x23; f_info[50].x_attr[i] = f_info[52].x_attr[i] = 0x01; // quartz as %:D f_info[51].x_char[i] = f_info[53].x_char[i] = 0x23; f_info[51].x_attr[i] = f_info[53].x_attr[i] = 0x01; // quartz/magma w treasure as *:o f_info[54].x_char[i] = f_info[55].x_char[i] = 0x2A; f_info[54].x_attr[i] = f_info[55].x_attr[i] = 0x03; // granite walls as #:D f_info[56].x_char[i] = 0x23; f_info[56].x_attr[i] = 0x01; // permanent walls as #:r f_info[60].x_char[i] = 0x23; f_info[60].x_attr[i] = 0x04; } } #ifdef A_COLOR if (COLORS == 256 || COLORS == 88) { /* If we have more than 16 colors, find the best matches. These numbers * correspond to xterm/rxvt's builtin color numbers--they do not * correspond to curses' constants OR with curses' color pairs. * * XTerm has 216 (6*6*6) RGB colors, with each RGB setting 0-5. * RXVT has 64 (4*4*4) RGB colors, with each RGB setting 0-3. * * Both also have the basic 16 ANSI colors, plus some extra grayscale * colors which we do not use. */ int i; int scale = COLORS == 256 ? 6 : 4; for (i = 0; i < BASIC_COLORS; i++) { int fg = create_color(i, scale); int isbold = bold_extended ? A_BRIGHT : A_NORMAL; init_pair(i + 1, fg, bg_color); colortable[i] = COLOR_PAIR(i + 1) | isbold; } } #endif return 0; } /* * Handle a "special request" */ static errr Term_xtra_gcu(int n, int v) { term_data *td = (term_data *)(Term->data); /* Analyze the request */ switch (n) { /* Clear screen */ case TERM_XTRA_CLEAR: touchwin(td->win); wclear(td->win); return 0; /* Make a noise */ case TERM_XTRA_NOISE: write(1, "\007", 1); return 0; /* Flush the Curses buffer */ case TERM_XTRA_FRESH: wrefresh(td->win); return 0; #ifdef USE_CURS_SET /* Change the cursor visibility */ case TERM_XTRA_SHAPE: curs_set(v); return 0; #endif /* Suspend/Resume curses */ case TERM_XTRA_ALIVE: return Term_xtra_gcu_alive(v); /* Process events */ case TERM_XTRA_EVENT: return Term_xtra_gcu_event(v); /* Flush events */ case TERM_XTRA_FLUSH: while (!Term_xtra_gcu_event(FALSE)); return 0; /* Delay */ case TERM_XTRA_DELAY: if (v > 0) usleep(1000 * v); return 0; /* React to events */ case TERM_XTRA_REACT: Term_xtra_gcu_react(); return 0; } /* Unknown event */ return 1; } /* * Actually MOVE the hardware cursor */ static errr Term_curs_gcu(int x, int y) { term_data *td = (term_data *)(Term->data); wmove(td->win, y, x); return 0; } /* * Erase a grid of space * Hack -- try to be "semi-efficient". */ static errr Term_wipe_gcu(int x, int y, int n) { term_data *td = (term_data *)(Term->data); wmove(td->win, y, x); if (x + n >= td->t.wid) /* Clear to end of line */ wclrtoeol(td->win); else /* Clear some characters */ whline(td->win, ' ', n); return 0; } /* * Place some text on the screen using an attribute */ static errr Term_text_gcu(int x, int y, int n, int a, const wchar_t *s) { term_data *td = (term_data *)(Term->data); #ifdef A_COLOR if (can_use_color) { /* the lower 7 bits of the attribute indicate the fg/bg */ int attr = a & 127; int color = colortable[attr]; /* the high bit of the attribute indicates a reversed fg/bg */ bool reversed = a > 127; /* the following check for A_BRIGHT is to avoid #1813 */ int mode; if (reversed && (color & A_BRIGHT)) mode = (color & ~A_BRIGHT) | A_BLINK | A_REVERSE; else if (reversed) mode = color | A_REVERSE; else mode = color | A_NORMAL; wattrset(td->win, mode); mvwaddnwstr(td->win, y, x, s, n); wattrset(td->win, A_NORMAL); return 0; } #endif mvwaddnwstr(td->win, y, x, s, n); return 0; } /* * Create a window for the given "term_data" argument. * * Assumes legal arguments. */ static errr term_data_init_gcu(term_data *td, int rows, int cols, int y, int x) { term *t = &td->t; /* Create new window */ td->win = newwin(rows, cols, y, x); /* Check for failure */ if (!td->win) quit("Failed to setup curses window."); /* Initialize the term */ term_init(t, cols, rows, 256); /* Avoid bottom right corner */ t->icky_corner = TRUE; /* Erase with "white space" */ t->attr_blank = TERM_WHITE; t->char_blank = ' '; /* Differentiate between BS/^h, Tab/^i, etc. */ t->complex_input = TRUE; /* Set some hooks */ t->init_hook = Term_init_gcu; t->nuke_hook = Term_nuke_gcu; /* Set some more hooks */ t->text_hook = Term_text_gcu; t->wipe_hook = Term_wipe_gcu; t->curs_hook = Term_curs_gcu; t->xtra_hook = Term_xtra_gcu; /* Save the data */ t->data = td; /* Activate it */ Term_activate(t); /* Success */ return (0); } static void hook_quit(const char *str) { int i; for (i = 0; i < term_count; i++) { if (angband_term[i]) { term_nuke(angband_term[i]); } } endwin(); } /* * Prepare "curses" for use by the file "z-term.c" * * Installs the "hook" functions defined above, and then activates * the main screen "term", which clears the screen and such things. * * Someone should really check the semantics of "initscr()" */ errr init_gcu(int argc, char **argv) { int i; int rows, cols, y, x; int next_win = 0; /* Initialize info about terminal capabilities */ termtype = getenv("TERM"); loaded_terminfo = termtype && tgetent(0, termtype) == 1; /* Parse args */ for (i = 1; i < argc; i++) { if (prefix(argv[i], "-b")) { term_count = 1; } else if (prefix(argv[i], "-B")) { bold_extended = TRUE; } else if (prefix(argv[i], "-a")) { ascii_walls = TRUE; } else if (prefix(argv[i], "-n")) { term_count = atoi(&argv[i][2]); if (term_count > MAX_TERM_DATA) term_count = MAX_TERM_DATA; else if (term_count < 1) term_count = 1; } else { plog_fmt("Ignoring option: %s", argv[i]); } } /* Extract the normal keymap */ keymap_norm_prepare(); /* We do it like this to prevent a link error with curseses that * lack ESCDELAY. */ if (!getenv("ESCDELAY")) putenv("ESCDELAY=20"); /* Initialize */ if (initscr() == NULL) return (-1); /* Activate hooks */ quit_aux = hook_quit; /* Require standard size screen */ if (LINES < MIN_TERM0_LINES || COLS < MIN_TERM0_COLS) quit("Angband needs at least an 80x24 'curses' screen"); #ifdef A_COLOR /* Do we have color, and enough color, available? */ can_use_color = ((start_color() != ERR) && has_colors() && (COLORS >= 8) && (COLOR_PAIRS >= 8)); #ifdef HAVE_USE_DEFAULT_COLORS /* Should we use curses' "default color" */ if (use_default_colors() == OK) bg_color = -1; #endif /* Attempt to use colors */ if (can_use_color) { /* Prepare the color pairs */ /* PAIR_WHITE (pair 0) is *always* WHITE on BLACK */ init_pair(PAIR_RED, COLOR_RED, bg_color); init_pair(PAIR_GREEN, COLOR_GREEN, bg_color); init_pair(PAIR_YELLOW, COLOR_YELLOW, bg_color); init_pair(PAIR_BLUE, COLOR_BLUE, bg_color); init_pair(PAIR_MAGENTA, COLOR_MAGENTA, bg_color); init_pair(PAIR_CYAN, COLOR_CYAN, bg_color); init_pair(PAIR_BLACK, COLOR_BLACK, bg_color); /* Prepare the colors */ colortable[TERM_DARK] = (COLOR_PAIR(PAIR_BLACK)); colortable[TERM_WHITE] = (COLOR_PAIR(PAIR_WHITE) | A_BRIGHT); colortable[TERM_SLATE] = (COLOR_PAIR(PAIR_WHITE)); colortable[TERM_ORANGE] = (COLOR_PAIR(PAIR_YELLOW) | A_BRIGHT); colortable[TERM_RED] = (COLOR_PAIR(PAIR_RED)); colortable[TERM_GREEN] = (COLOR_PAIR(PAIR_GREEN)); colortable[TERM_BLUE] = (COLOR_PAIR(PAIR_BLUE)); colortable[TERM_UMBER] = (COLOR_PAIR(PAIR_YELLOW)); colortable[TERM_L_DARK] = (COLOR_PAIR(PAIR_BLACK) | A_BRIGHT); colortable[TERM_L_WHITE] = (COLOR_PAIR(PAIR_WHITE)); colortable[TERM_L_PURPLE] = (COLOR_PAIR(PAIR_MAGENTA)); colortable[TERM_YELLOW] = (COLOR_PAIR(PAIR_YELLOW) | A_BRIGHT); colortable[TERM_L_RED] = (COLOR_PAIR(PAIR_MAGENTA) | A_BRIGHT); colortable[TERM_L_GREEN] = (COLOR_PAIR(PAIR_GREEN) | A_BRIGHT); colortable[TERM_L_BLUE] = (COLOR_PAIR(PAIR_BLUE) | A_BRIGHT); colortable[TERM_L_UMBER] = (COLOR_PAIR(PAIR_YELLOW)); colortable[TERM_PURPLE] = (COLOR_PAIR(PAIR_MAGENTA)); colortable[TERM_VIOLET] = (COLOR_PAIR(PAIR_MAGENTA)); colortable[TERM_TEAL] = (COLOR_PAIR(PAIR_CYAN)); colortable[TERM_MUD] = (COLOR_PAIR(PAIR_YELLOW)); colortable[TERM_L_YELLOW] = (COLOR_PAIR(PAIR_YELLOW | A_BRIGHT)); colortable[TERM_MAGENTA] = (COLOR_PAIR(PAIR_MAGENTA | A_BRIGHT)); colortable[TERM_L_TEAL] = (COLOR_PAIR(PAIR_CYAN) | A_BRIGHT); colortable[TERM_L_VIOLET] = (COLOR_PAIR(PAIR_MAGENTA) | A_BRIGHT); colortable[TERM_L_PINK] = (COLOR_PAIR(PAIR_MAGENTA) | A_BRIGHT); colortable[TERM_MUSTARD] = (COLOR_PAIR(PAIR_YELLOW)); colortable[TERM_BLUE_SLATE] = (COLOR_PAIR(PAIR_BLUE)); colortable[TERM_DEEP_L_BLUE] = (COLOR_PAIR(PAIR_BLUE)); } #endif /* Paranoia -- Assume no waiting */ nodelay(stdscr, FALSE); /* Prepare */ cbreak(); noecho(); nonl(); /* Tell curses to rewrite escape sequences to KEY_UP and friends */ keypad(stdscr, TRUE); /* Extract the game keymap */ keymap_game_prepare(); /* Now prepare the term(s) */ for (i = 0; i < term_count; i++) { /* Get the terminal dimensions; if the user asked for a big screen * then we'll put the whole screen in term 0; otherwise we'll divide * it amongst the available terms */ get_gcu_term_size(i, &rows, &cols, &y, &x); /* Skip non-existant windows */ if (rows <= 0 || cols <= 0) continue; /* Create a term */ term_data_init_gcu(&data[next_win], rows, cols, y, x); /* Remember the term */ angband_term[next_win] = &data[next_win].t; /* One more window */ next_win++; } /* Activate the "Angband" window screen */ Term_activate(&data[0].t); /* Remember the active screen */ term_screen = &data[0].t; /* Success */ return (0); } #endif /* USE_GCU */ angband-3.5.1/src/generate.c0000644000175000017500000031015312456456606015170 0ustar chriscchrisc/* * File: generate.c * Purpose: Dungeon generation. * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * Copyright (c) 2011 Erik Osheim * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "math.h" #include "files.h" #include "game-event.h" #include "generate.h" #include "init.h" #include "monster/mon-make.h" #include "monster/mon-spell.h" #include "object/tvalsval.h" #include "parser.h" #include "trap.h" #include "z-queue.h" #include "z-type.h" /** * This is the global structure representing dungeon generation info. */ static struct dun_data *dun; static struct room_template *room_templates; /** * This is a global array of positions in the cave we're currently * generating. It's used to quickly randomize all the current cave positions. */ static int *cave_squares = NULL; static bool town_gen(struct cave *c, struct player *p); static bool default_gen(struct cave *c, struct player *p); static bool labyrinth_gen(struct cave *c, struct player *p); static bool cavern_gen(struct cave *c, struct player *p); static bool build_simple(struct cave *c, int y0, int x0); static bool build_circular(struct cave *c, int y0, int x0); static bool build_overlap(struct cave *c, int y0, int x0); static bool build_crossed(struct cave *c, int y0, int x0); static bool build_large(struct cave *c, int y0, int x0); static bool build_nest(struct cave *c, int y0, int x0); static bool build_pit(struct cave *c, int y0, int x0); static bool build_template(struct cave *c, int y0, int x0); static bool build_lesser_vault(struct cave *c, int y0, int x0); static bool build_medium_vault(struct cave *c, int y0, int x0); static bool build_greater_vault(struct cave *c, int y0, int x0); static void alloc_objects(struct cave *c, int set, int typ, int num, int depth, byte origin); static bool alloc_object(struct cave *c, int set, int typ, int depth, byte origin); #if __STDC_VERSION__ < 199901L #define ROOM_LOG if (OPT(cheat_room)) msg #else #define ROOM_LOG(...) if (OPT(cheat_room)) msg(__VA_ARGS__); #endif /** * Note that Level generation is *not* an important bottleneck, though it can * be annoyingly slow on older machines... Thus we emphasize "simplicity" and * "correctness" over "speed". * * See the "vault.txt" file for more on vault generation. * See the "room_template.txt" file for more room templates. * * In this file, we use the "special" granite and perma-wall sub-types, where * "basic" is normal, "inner" is inside a room, "outer" is the outer wall of a * room, and "solid" is the outer wall of the dungeon or any walls that may not * be pierced by corridors. Thus the only wall type that may be pierced by a * corridor is the "outer granite" type. The "basic granite" type yields the * "actual" corridors. * * We use the special "solid" granite wall type to prevent multiple corridors * from piercing a wall in two adjacent locations, which would be messy, and we * use the special "outer" granite wall to indicate which walls "surround" * rooms, and may thus be "pierced" by corridors entering or leaving the room. * * Note that a tunnel which attempts to leave a room near the "edge" of the * dungeon in a direction toward that edge will cause "silly" wall piercings, * but will have no permanently incorrect effects, as long as the tunnel can * eventually exit from another side. And note that the wall may not come back * into the room by the hole it left through, so it must bend to the left or * right and then optionally re-enter the room (at least 2 grids away). This is * not a problem since every room that is large enough to block the passage of * tunnels is also large enough to allow the tunnel to pierce the room itself * several times. * * Note that no two corridors may enter a room through adjacent grids, they * must either share an entryway or else use entryways at least two grids * apart. This prevents "large" (or "silly") doorways. * * To create rooms in the dungeon, we first divide the dungeon up into "blocks" * of 11x11 grids each, and require that all rooms occupy a rectangular group * of blocks. As long as each room type reserves a sufficient number of * blocks, the room building routines will not need to check bounds. Note that * most of the normal rooms actually only use 23x11 grids, and so reserve 33x11 * grids. * * Note that the use of 11x11 blocks (instead of the 33x11 panels) allows more * variability in the horizontal placement of rooms, and at the same time has * the disadvantage that some rooms (two thirds of the normal rooms) may be * "split" by panel boundaries. This can induce a situation where a player is * in a room and part of the room is off the screen. This can be so annoying * that the player must set a special option to enable "non-aligned" room * generation. * * The 64 new "dungeon features" will also be used for "visual display" * but we must be careful not to allow, for example, the user to display * hidden traps in a different way from floors, or secret doors in a way * different from granite walls. */ /* * Dungeon allocation places and types, used with alloc_object(). */ #define SET_CORR 1 /* Hallway */ #define SET_ROOM 2 /* Room */ #define SET_BOTH 3 /* Anywhere */ #define TYP_RUBBLE 1 /* Rubble */ #define TYP_TRAP 3 /* Trap */ #define TYP_GOLD 4 /* Gold */ #define TYP_OBJECT 5 /* Object */ #define TYP_GOOD 6 /* Great object */ #define TYP_GREAT 7 /* Great object */ /* * Maximum numbers of rooms along each axis (currently 6x18). * Used for building fixed-size arrays. */ #define MAX_ROOMS_ROW (DUNGEON_HGT / BLOCK_HGT) #define MAX_ROOMS_COL (DUNGEON_WID / BLOCK_WID) #define MAX_PIT 2 /* Maximum number of pits or nests allowed */ /* * Bounds on some arrays used in the "dun_data" structure. * These bounds are checked, though usually this is a formality. */ #define CENT_MAX 100 #define DOOR_MAX 200 #define WALL_MAX 500 #define TUNN_MAX 900 /** * Structure to hold all "dungeon generation" data */ struct dun_data { /* The profile used to generate the level */ const struct cave_profile *profile; /* Array of centers of rooms */ int cent_n; struct loc cent[CENT_MAX]; /* Array of possible door locations */ int door_n; struct loc door[DOOR_MAX]; /* Array of wall piercing locations */ int wall_n; struct loc wall[WALL_MAX]; /* Array of tunnel grids */ int tunn_n; struct loc tunn[TUNN_MAX]; /* Number of blocks along each axis */ int row_rooms; int col_rooms; /* Array of which blocks are used */ bool room_map[MAX_ROOMS_ROW][MAX_ROOMS_COL]; /* Number of pits/nests on the level */ int pit_num; }; /** * Profile used for generating the town level. */ static struct cave_profile town_profile = { /* name builder dun_rooms dun_unusual max_rarity n_room_profiles */ "town-default", town_gen, 50, 200, 2, 0, /* name rnd chg con pen jct */ {"tunnel-default", 10, 30, 15, 25, 90}, /* name den rng mag mc qua qc */ {"streamer-default", 5, 2, 3, 90, 2, 40}, /* room_profiles -- not applicable */ NULL, /* cutoff -- not applicable */ 0 }; /* name function width height min-depth pit? rarity %cutoff */ static struct room_profile default_rooms[] = { /* greater vaults only have rarity 1 but they have other checks */ {"greater vault", build_greater_vault, 4, 6, 35, FALSE, 0, 100}, /* very rare rooms (rarity=2) */ {"monster pit", build_pit, 1, 3, 5, TRUE, 2, 8}, {"monster nest", build_nest, 1, 3, 5, TRUE, 2, 16}, {"medium vault", build_medium_vault, 2, 3, 30, FALSE, 2, 38}, {"lesser vault", build_lesser_vault, 2, 3, 20, FALSE, 2, 55}, /* unusual rooms (rarity=1) */ {"large room", build_large, 1, 3, 3, FALSE, 1, 15}, {"crossed room", build_crossed, 1, 3, 3, FALSE, 1, 35}, {"circular room", build_circular, 2, 2, 1, FALSE, 1, 50}, {"overlap room", build_overlap, 1, 3, 1, FALSE, 1, 70}, {"room template", build_template, 1, 3, 5, FALSE, 1, 100}, /* normal rooms */ {"simple room", build_simple, 1, 3, 1, FALSE, 0, 100} }; #define NUM_CAVE_PROFILES 3 /** * Profiles used for generating dungeon levels. */ static struct cave_profile cave_profiles[NUM_CAVE_PROFILES] = { { "labyrinth", labyrinth_gen, 0, 200, 0, 0, /* tunnels -- not applicable */ {"tunnel-default", 10, 30, 15, 25, 90}, /* streamers -- not applicable */ {"streamer-default", 5, 2, 3, 90, 2, 40}, /* room_profiles -- not applicable */ NULL, /* cutoff -- unused because of internal checks in labyrinth_gen */ 100 }, { "cavern", cavern_gen, 0, 200, 0, 0, /* tunnels -- not applicable */ {"tunnel-default", 10, 30, 15, 25, 90}, /* streamers -- not applicable */ {"streamer-default", 5, 2, 3, 90, 2, 40}, /* room_profiles -- not applicable */ NULL, /* cutoff -- debug */ 10 }, { /* name builder dun_rooms dun_unusual max_rarity n_room_profiles */ "default", default_gen, 50, 200, 2, N_ELEMENTS(default_rooms), /* name rnd chg con pen jct */ {"tunnel-default", 10, 30, 15, 25, 90}, /* name den rng mag mc qua qc */ {"streamer-default", 5, 2, 3, 90, 2, 40}, /* room_profiles */ default_rooms, /* cutoff */ 100 } }; /* Parsing functions for room_template.txt */ static enum parser_error parse_room_n(struct parser *p) { struct room_template *h = parser_priv(p); struct room_template *t = mem_zalloc(sizeof *t); t->tidx = parser_getuint(p, "index"); t->name = string_make(parser_getstr(p, "name")); t->next = h; parser_setpriv(p, t); return PARSE_ERROR_NONE; } static enum parser_error parse_room_x(struct parser *p) { struct room_template *t = parser_priv(p); if (!t) return PARSE_ERROR_MISSING_RECORD_HEADER; t->typ = parser_getuint(p, "type"); t->rat = parser_getint(p, "rating"); t->hgt = parser_getuint(p, "height"); t->wid = parser_getuint(p, "width"); t->dor = parser_getuint(p, "doors"); t->tval = parser_getuint(p, "tval"); return PARSE_ERROR_NONE; } static enum parser_error parse_room_d(struct parser *p) { struct room_template *t = parser_priv(p); if (!t) return PARSE_ERROR_MISSING_RECORD_HEADER; t->text = string_append(t->text, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } static struct parser *init_parse_room(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "V sym version", ignored); parser_reg(p, "N uint index str name", parse_room_n); parser_reg(p, "X uint type int rating uint height uint width uint doors uint tval", parse_room_x); parser_reg(p, "D str text", parse_room_d); return p; } static errr run_parse_room(struct parser *p) { return parse_file(p, "room_template"); } static errr finish_parse_room(struct parser *p) { room_templates = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_room(void) { struct room_template *t, *next; for (t = room_templates; t; t = next) { next = t->next; mem_free(t->name); mem_free(t->text); mem_free(t); } } static struct file_parser room_parser = { "room_template", init_parse_room, run_parse_room, finish_parse_room, cleanup_room }; static void run_room_parser(void) { event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (room templates)"); if (run_parser(&room_parser)) quit("Cannot initialize room templates"); } static void cleanup_room_parser(void) { cleanup_parser(&room_parser); } /** * Shuffle an array using Knuth's shuffle. */ static void shuffle(int *arr, int n) { int i, j, k; for (i = 0; i < n; i++) { j = randint0(n - i) + i; k = arr[j]; arr[j] = arr[i]; arr[i] = k; } } /** * Locate a square in y1 <= y < y2, x1 <= x < x2 which satisfies the given * predicate. */ static bool _find_in_range(struct cave *c, int *y, int y1, int y2, int *x, int x1, int x2, int *squares, cave_predicate pred) { int yd = y2 - y1; int xd = x2 - x1; int i, n = yd * xd; bool found = FALSE; /* Test each square in (random) order for openness */ for (i = 0; i < n && !found; i++) { int j = randint0(n - i) + i; int k = squares[j]; squares[j] = squares[i]; squares[i] = k; *y = (k / xd) + y1; *x = (k % xd) + x1; if (pred(c, *y, *x)) found = TRUE; } /* Return whether we found an empty square or not. */ return found; } /** * Locate a square in the dungeon which satisfies the given predicate. */ static bool cave_find(struct cave *c, int *y, int *x, cave_predicate pred) { int h = c->height; int w = c->width; return _find_in_range(c, y, 0, h, x, 0, w, cave_squares, pred); } /** * Locate a square in y1 <= y < y2, x1 <= x < x2 which satisfies the given * predicate. */ static bool cave_find_in_range(struct cave *c, int *y, int y1, int y2, int *x, int x1, int x2, cave_predicate pred) { int yd = y2 - y1; int xd = x2 - x1; int n = yd * xd; int i, found; /* Allocate the squares, and randomize their order */ int *squares = C_ZNEW(n, int); for (i = 0; i < n; i++) squares[i] = i; /* Do the actual search */ found = _find_in_range(c, y, y1, y2, x, x1, x2, squares, pred); /* Deallocate memory */ FREE(squares); /* Return whether or not we found an empty square */ return found; } /** * Locate an empty square for 0 <= y < ymax, 0 <= x < xmax. */ static bool find_empty(struct cave *c, int *y, int *x) { return cave_find(c, y, x, cave_isempty); } /** * Locate an empty square for y1 <= y < y2, x1 <= x < x2. */ static bool find_empty_range(struct cave *c, int *y, int y1, int y2, int *x, int x1, int x2) { return cave_find_in_range(c, y, y1, y2, x, x1, x2, cave_isempty); } /** * Locate a grid nearby (y0, x0) within +/- yd, xd. */ static bool find_nearby_grid(struct cave *c, int *y, int y0, int yd, int *x, int x0, int xd) { int y1 = y0 - yd; int x1 = x0 - xd; int y2 = y0 + yd + 1; int x2 = x0 + xd + 1; return cave_find_in_range(c, y, y1, y2, x, x1, x2, cave_in_bounds); } /** * Given two points, pick a valid cardinal direction from one to the other. */ static void correct_dir(int *rdir, int *cdir, int y1, int x1, int y2, int x2) { /* Extract vertical and horizontal directions */ *rdir = CMP(y2, y1); *cdir = CMP(x2, x1); /* If we only have one direction to go, then we're done */ if (!*rdir || !*cdir) return; /* If we need to go diagonally, then choose a random direction */ if (randint0(100) < 50) *rdir = 0; else *cdir = 0; } /** * Pick a random cardinal direction. */ static void rand_dir(int *rdir, int *cdir) { /* Pick a random direction and extract the dy/dx components */ int i = randint0(4); *rdir = ddy_ddd[i]; *cdir = ddx_ddd[i]; } /** * Determine whether the given coordinate is a valid starting location. */ static bool cave_isstart(struct cave *c, int y, int x) { if (!cave_isempty(c, y, x)) return FALSE; if (cave_isvault(c, y, x)) return FALSE; return TRUE; } /** * Place the player at a random starting location. */ static void new_player_spot(struct cave *c, struct player *p) { int y, x; /* Try to find a good place to put the player */ cave_find_in_range(c, &y, 0, c->height, &x, 0, c->width, cave_isstart); /* Create stairs the player came down if allowed and necessary */ if (OPT(birth_no_stairs)) ; else if (p->create_down_stair) cave_set_feat(c, y, x, FEAT_MORE); else if (p->create_up_stair) cave_set_feat(c, y, x, FEAT_LESS); player_place(c, p, y, x); } /** * Return how many cardinal directions around (x, y) contain walls. */ static int next_to_walls(struct cave *c, int y, int x) { int k = 0; assert(cave_in_bounds(c, y, x)); if (cave_iswall(c, y + 1, x)) k++; if (cave_iswall(c, y - 1, x)) k++; if (cave_iswall(c, y, x + 1)) k++; if (cave_iswall(c, y, x - 1)) k++; return k; } /** * Place rubble at (x, y). */ static void place_rubble(struct cave *c, int y, int x) { cave_set_feat(c, y, x, FEAT_RUBBLE); } /** * Place stairs (of the requested type 'feat' if allowed) at (x, y). * * All stairs from town go down. All stairs on an unfinished quest level go up. */ static void place_stairs(struct cave *c, int y, int x, int feat) { if (!c->depth) cave_set_feat(c, y, x, FEAT_MORE); else if (is_quest(c->depth) || c->depth >= MAX_DEPTH - 1) cave_set_feat(c, y, x, FEAT_LESS); else cave_set_feat(c, y, x, feat); } /** * Place random stairs at (x, y). */ static void place_random_stairs(struct cave *c, int y, int x) { int feat = randint0(100) < 50 ? FEAT_LESS : FEAT_MORE; if (cave_canputitem(c, y, x)) place_stairs(c, y, x, feat); } /** * Place a random object at (x, y). */ void place_object(struct cave *c, int y, int x, int level, bool good, bool great, byte origin, int tval) { s32b rating = 0; object_type otype; assert(cave_in_bounds(c, y, x)); if (!cave_canputitem(c, y, x)) return; object_wipe(&otype); if (!make_object(c, &otype, level, good, great, FALSE, &rating, tval)) return; otype.origin = origin; otype.origin_depth = c->depth; /* Give it to the floor */ /* XXX Should this be done in floor_carry? */ if (!floor_carry(c, y, x, &otype)) { if (otype.artifact) otype.artifact->created = FALSE; return; } else { if (otype.artifact) c->good_item = TRUE; if (rating > 250000) rating = 250000; /* avoid overflows */ c->obj_rating += (rating / 10) * (rating / 10); } } /** * Place a random amount of gold at (x, y). */ void place_gold(struct cave *c, int y, int x, int level, byte origin) { object_type *i_ptr; object_type object_type_body; assert(cave_in_bounds(c, y, x)); if (!cave_canputitem(c, y, x)) return; i_ptr = &object_type_body; object_wipe(i_ptr); make_gold(i_ptr, level, SV_GOLD_ANY); i_ptr->origin = origin; i_ptr->origin_depth = level; floor_carry(c, y, x, i_ptr); } /** * Place a secret door at (x, y). */ void place_secret_door(struct cave *c, int y, int x) { cave_set_feat(c, y, x, FEAT_SECRET); } /** * Place a closed door at (x, y). */ void place_closed_door(struct cave *c, int y, int x) { int tmp = randint0(400); if (tmp < 300) cave_set_feat(c, y, x, FEAT_DOOR_HEAD + 0x00); else if (tmp < 399) cave_set_feat(c, y, x, FEAT_DOOR_HEAD + randint1(7)); else cave_set_feat(c, y, x, FEAT_DOOR_HEAD + 0x08 + randint0(8)); } /** * Place a random door at (x, y). * * The door generated could be closed, open, broken, or secret. */ void place_random_door(struct cave *c, int y, int x) { int tmp = randint0(100); if (tmp < 30) cave_set_feat(c, y, x, FEAT_OPEN); else if (tmp < 40) cave_set_feat(c, y, x, FEAT_BROKEN); else if (tmp < 60) cave_set_feat(c, y, x, FEAT_SECRET); else place_closed_door(c, y, x); } /** * Chooses a room template of a particular kind at random. * */ struct room_template *random_room_template(int typ) { struct room_template *t = room_templates; struct room_template *r = NULL; int n = 1; do { if (t->typ == typ) { if (one_in_(n)) r = t; n++; } t = t->next; } while(t); return r; } /** * Chooses a vault of a particular kind at random. * * Each vault has equal probability of being chosen. One weird thing is that * currently the v->typ indices are one off from the room type indices, which * means that build_greater_vault will call this function with "typ=8". */ struct vault *random_vault(int typ) { struct vault *v = vaults; struct vault *r = NULL; int n = 1; do { if (v->typ == typ) { if (one_in_(n)) r = v; n++; } v = v->next; } while(v); return r; } /** * Place some staircases near walls. */ static void alloc_stairs(struct cave *c, int feat, int num, int walls) { int y, x, i, j, done; /* Place "num" stairs */ for (i = 0; i < num; i++) { /* Place some stairs */ for (done = FALSE; !done; ) { /* Try several times, then decrease "walls" */ for (j = 0; !done && j <= 1000; j++) { find_empty(c, &y, &x); if (next_to_walls(c, y, x) < walls) continue; place_stairs(c, y, x, feat); done = TRUE; } /* Require fewer walls */ if (walls) walls--; } } } /** * Allocates 'num' random objects in the dungeon. * * See alloc_object() for more information. */ static void alloc_objects(struct cave *c, int set, int typ, int num, int depth, byte origin) { int k, l = 0; for (k = 0; k < num; k++) { bool ok = alloc_object(c, set, typ, depth, origin); if (!ok) l++; } } /** * Allocates a single random object in the dungeon. * * 'set' controls where the object is placed (corridor, room, either). * 'typ' conrols the kind of object (rubble, trap, gold, item). */ static bool alloc_object(struct cave *c, int set, int typ, int depth, byte origin) { int x = 0, y = 0; int tries = 0; bool room; /* Pick a "legal" spot */ while (tries < 2000) { tries++; find_empty(c, &y, &x); /* See if our spot is in a room or not */ room = (c->info[y][x] & CAVE_ROOM) ? TRUE : FALSE; /* If we are ok with a corridor and we're in one, we're done */ if (set & SET_CORR && !room) break; /* If we are ok with a room and we're in one, we're done */ if (set & SET_ROOM && room) break; } if (tries == 2000) return FALSE; /* Place something */ switch (typ) { case TYP_RUBBLE: place_rubble(c, y, x); break; case TYP_TRAP: place_trap(c, y, x); break; case TYP_GOLD: place_gold(c, y, x, depth, origin); break; case TYP_OBJECT: place_object(c, y, x, depth, FALSE, FALSE, origin, 0); break; case TYP_GOOD: place_object(c, y, x, depth, TRUE, FALSE, origin, 0); break; case TYP_GREAT: place_object(c, y, x, depth, TRUE, TRUE, origin, 0); break; } return TRUE; } /** * Places a streamer of rock through dungeon. * * Note that their are actually six different terrain features used to * represent streamers. Three each of magma and quartz, one for basic vein, one * with hidden gold, and one with known gold. The hidden gold types are * currently unused. */ static void build_streamer(struct cave *c, int feat, int chance) { int i, tx, ty; int y, x, dir; /* Hack -- Choose starting point */ y = rand_spread(DUNGEON_HGT / 2, 10); x = rand_spread(DUNGEON_WID / 2, 15); /* Choose a random direction */ dir = ddd[randint0(8)]; /* Place streamer into dungeon */ while (TRUE) { /* One grid per density */ for (i = 0; i < dun->profile->str.den; i++) { int d = dun->profile->str.rng; /* Pick a nearby grid */ find_nearby_grid(c, &ty, y, d, &tx, x, d); /* Only convert walls */ if (cave_isrock(c, ty, tx)) { /* Turn the rock into the vein type */ cave_set_feat(c, ty, tx, feat); /* Sometimes add known treasure */ if (one_in_(chance)) upgrade_mineral(c, ty, tx); } } /* Advance the streamer */ y += ddy[dir]; x += ddx[dir]; /* Stop at dungeon edge */ if (!cave_in_bounds(c, y, x)) break; } } /** * Create up to 'num' objects near the given coordinates in a vault. */ static void vault_objects(struct cave *c, int y, int x, int depth, int num) { int i, j, k; /* Attempt to place 'num' objects */ for (; num > 0; --num) { /* Try up to 11 spots looking for empty space */ for (i = 0; i < 11; ++i) { /* Pick a random location */ find_nearby_grid(c, &j, y, 2, &k, x, 3); /* Require "clean" floor space */ if (!cave_canputitem(c, j, k)) continue; /* Place an item or gold */ if (randint0(100) < 75) place_object(c, j, k, depth, FALSE, FALSE, ORIGIN_SPECIAL, 0); else place_gold(c, j, k, depth, ORIGIN_VAULT); /* Placement accomplished */ break; } } } /** * Place a trap near (x, y), with a given displacement. */ static void vault_trap_aux(struct cave *c, int y, int x, int yd, int xd) { int tries, y1, x1; /* Find a nearby empty grid and place a trap */ for (tries = 0; tries <= 5; tries++) { find_nearby_grid(c, &y1, y, yd, &x1, x, xd); if (!cave_isempty(c, y1, x1)) continue; place_trap(c, y1, x1); break; } } /** * Place 'num' traps near (x, y), with a given displacement. */ static void vault_traps(struct cave *c, int y, int x, int yd, int xd, int num) { int i; for (i = 0; i < num; i++) vault_trap_aux(c, y, x, yd, xd); } /** * Place 'num' sleeping monsters near (x, y). */ static void vault_monsters(struct cave *c, int y1, int x1, int depth, int num) { int k, i, y, x; /* Try to summon "num" monsters "near" the given location */ for (k = 0; k < num; k++) { /* Try nine locations */ for (i = 0; i < 9; i++) { int d = 1; /* Pick a nearby location */ scatter(&y, &x, y1, x1, d, TRUE); /* Require "empty" floor grids */ if (!cave_isempty(cave, y, x)) continue; /* Place the monster (allow groups) */ pick_and_place_monster(c, y, x, depth, TRUE, TRUE, ORIGIN_DROP_SPECIAL); break; } } } /** * Mark squares as being in a room, and optionally light them. * * The boundaries (y1, x1, y2, x2) are inclusive. */ static void generate_room(struct cave *c, int y1, int x1, int y2, int x2, int light) { int y, x; int add = CAVE_ROOM | (light ? CAVE_GLOW : 0); for (y = y1; y <= y2; y++) for (x = x1; x <= x2; x++) c->info[y][x] |= add; } /** * Fill a rectangle with a feature. * * The boundaries (y1, x1, y2, x2) are inclusive. */ static void fill_rectangle(struct cave *c, int y1, int x1, int y2, int x2, int feat) { int y, x; for (y = y1; y <= y2; y++) for (x = x1; x <= x2; x++) cave_set_feat(c, y, x, feat); } /** * Fill the edges of a rectangle with a feature. * * The boundaries (y1, x1, y2, x2) are inclusive. */ static void draw_rectangle(struct cave *c, int y1, int x1, int y2, int x2, int feat) { int y, x; for (y = y1; y <= y2; y++) { cave_set_feat(c, y, x1, feat); cave_set_feat(c, y, x2, feat); } for (x = x1; x <= x2; x++) { cave_set_feat(c, y1, x, feat); cave_set_feat(c, y2, x, feat); } } /** * Fill a horizontal range with the given feature/info. */ static void fill_xrange(struct cave *c, int y, int x1, int x2, int feat, int info) { int x; for (x = x1; x <= x2; x++) { cave_set_feat(c, y, x, feat); c->info[y][x] |= info; } } /** * Fill a vertical range with the given feature/info. */ static void fill_yrange(struct cave *c, int x, int y1, int y2, int feat, int info) { int y; for (y = y1; y <= y2; y++) { cave_set_feat(c, y, x, feat); c->info[y][x] |= info; } } /** * Fill a circle with the given feature/info. */ static void fill_circle(struct cave *c, int y0, int x0, int radius, int border, int feat, int info) { int i, last = 0; int r2 = radius * radius; for(i = 0; i <= radius; i++) { double j = sqrt(r2 - (i * i)); int k = (int)(j + 0.5); int b = border; if (border && last > k) b++; fill_xrange(c, y0 - i, x0 - k - b, x0 + k + b, feat, info); fill_xrange(c, y0 + i, x0 - k - b, x0 + k + b, feat, info); fill_yrange(c, x0 - i, y0 - k - b, y0 + k + b, feat, info); fill_yrange(c, x0 + i, y0 - k - b, y0 + k + b, feat, info); last = k; } } /** * Fill the lines of a cross/plus with a feature. * * The boundaries (y1, x1, y2, x2) are inclusive. When combined with * draw_rectangle() this will generate a large rectangular room which is split * into four sub-rooms. */ static void generate_plus(struct cave *c, int y1, int x1, int y2, int x2, int feat) { int y, x; /* Find the center */ int y0 = (y1 + y2) / 2; int x0 = (x1 + x2) / 2; assert(c); for (y = y1; y <= y2; y++) cave_set_feat(c, y, x0, feat); for (x = x1; x <= x2; x++) cave_set_feat(c, y0, x, feat); } /** * Generate helper -- open all sides of a rectangle with a feature */ static void generate_open(struct cave *c, int y1, int x1, int y2, int x2, int feat) { int y0, x0; /* Center */ y0 = (y1 + y2) / 2; x0 = (x1 + x2) / 2; /* Open all sides */ cave_set_feat(c, y1, x0, feat); cave_set_feat(c, y0, x1, feat); cave_set_feat(c, y2, x0, feat); cave_set_feat(c, y0, x2, feat); } /** * Generate helper -- open one side of a rectangle with a feature */ static void generate_hole(struct cave *c, int y1, int x1, int y2, int x2, int feat) { /* Find the center */ int y0 = (y1 + y2) / 2; int x0 = (x1 + x2) / 2; assert(c); /* Open random side */ switch (randint0(4)) { case 0: cave_set_feat(c, y1, x0, feat); break; case 1: cave_set_feat(c, y0, x1, feat); break; case 2: cave_set_feat(c, y2, x0, feat); break; case 3: cave_set_feat(c, y0, x2, feat); break; } } /** * Build a circular room (interior radius 4-7). */ static bool build_circular(struct cave *c, int y0, int x0) { /* Pick a room size */ int radius = 2 + randint1(2) + randint1(3); /* Occasional light */ bool light = c->depth <= randint1(25) ? TRUE : FALSE; /* Mark interior squares as being in a room (optionally lit) */ int info = CAVE_ROOM | (light ? CAVE_GLOW : 0); /* Generate outer walls and inner floors */ fill_circle(c, y0, x0, radius + 1, 1, FEAT_WALL_OUTER, info); fill_circle(c, y0, x0, radius, 0, FEAT_FLOOR, info); /* Especially large circular rooms will have a middle chamber */ if (radius - 4 > 0 && randint0(4) < radius - 4) { /* choose a random direction */ int cd, rd; rand_dir(&rd, &cd); /* draw a room with a secret door on a random side */ draw_rectangle(c, y0 - 2, x0 - 2, y0 + 2, x0 + 2, FEAT_WALL_INNER); cave_set_feat(c, y0 + cd * 2, x0 + rd * 2, FEAT_SECRET); /* Place a treasure in the vault */ vault_objects(c, y0, x0, c->depth, randint0(2)); /* create some monsterss */ vault_monsters(c, y0, x0, c->depth + 1, randint0(3)); } return TRUE; } /** * Builds a normal rectangular room. */ static bool build_simple(struct cave *c, int y0, int x0) { int y, x; int light = FALSE; /* Pick a room size */ int y1 = y0 - randint1(4); int x1 = x0 - randint1(11); int y2 = y0 + randint1(3); int x2 = x0 + randint1(11); /* Occasional light */ if (c->depth <= randint1(25)) light = TRUE; /* Generate new room */ generate_room(c, y1-1, x1-1, y2+1, x2+1, light); /* Generate outer walls and inner floors */ draw_rectangle(c, y1-1, x1-1, y2+1, x2+1, FEAT_WALL_OUTER); fill_rectangle(c, y1, x1, y2, x2, FEAT_FLOOR); if (one_in_(20)) { /* Sometimes make a pillar room */ for (y = y1; y <= y2; y += 2) for (x = x1; x <= x2; x += 2) cave_set_feat(c, y, x, FEAT_WALL_INNER); } else if (one_in_(50)) { /* Sometimes make a ragged-edge room */ for (y = y1 + 2; y <= y2 - 2; y += 2) { cave_set_feat(c, y, x1, FEAT_WALL_INNER); cave_set_feat(c, y, x2, FEAT_WALL_INNER); } for (x = x1 + 2; x <= x2 - 2; x += 2) { cave_set_feat(c, y1, x, FEAT_WALL_INNER); cave_set_feat(c, y2, x, FEAT_WALL_INNER); } } return TRUE; } /** * Builds an overlapping rectangular room. */ static bool build_overlap(struct cave *c, int y0, int x0) { int y1a, x1a, y2a, x2a; int y1b, x1b, y2b, x2b; int light = FALSE; /* Occasional light */ if (c->depth <= randint1(25)) light = TRUE; /* Determine extents of room (a) */ y1a = y0 - randint1(4); x1a = x0 - randint1(11); y2a = y0 + randint1(3); x2a = x0 + randint1(10); /* Determine extents of room (b) */ y1b = y0 - randint1(3); x1b = x0 - randint1(10); y2b = y0 + randint1(4); x2b = x0 + randint1(11); /* Generate new room (a) */ generate_room(c, y1a-1, x1a-1, y2a+1, x2a+1, light); /* Generate new room (b) */ generate_room(c, y1b-1, x1b-1, y2b+1, x2b+1, light); /* Generate outer walls (a) */ draw_rectangle(c, y1a-1, x1a-1, y2a+1, x2a+1, FEAT_WALL_OUTER); /* Generate outer walls (b) */ draw_rectangle(c, y1b-1, x1b-1, y2b+1, x2b+1, FEAT_WALL_OUTER); /* Generate inner floors (a) */ fill_rectangle(c, y1a, x1a, y2a, x2a, FEAT_FLOOR); /* Generate inner floors (b) */ fill_rectangle(c, y1b, x1b, y2b, x2b, FEAT_FLOOR); return TRUE; } /** * Builds a cross-shaped room. * * Room "a" runs north/south, and Room "b" runs east/east * So a "central pillar" would run from x1a,y1b to x2a,y2b. * * Note that currently, the "center" is always 3x3, but I think that the code * below will work for 5x5 (and perhaps even for unsymetric values like 4x3 or * 5x3 or 3x4 or 3x5). */ static bool build_crossed(struct cave *c, int y0, int x0) { int y, x; int y1a, x1a, y2a, x2a; int y1b, x1b, y2b, x2b; int dy, dx, wy, wx; int light = FALSE; /* Occasional light */ if (c->depth <= randint1(25)) light = TRUE; /* Pick inner dimension */ wy = 1; wx = 1; /* Pick outer dimension */ dy = rand_range(3, 4); dx = rand_range(3, 11); /* Determine extents of room (a) */ y1a = y0 - dy; x1a = x0 - wx; y2a = y0 + dy; x2a = x0 + wx; /* Determine extents of room (b) */ y1b = y0 - wy; x1b = x0 - dx; y2b = y0 + wy; x2b = x0 + dx; /* Generate new room (a) */ generate_room(c, y1a-1, x1a-1, y2a+1, x2a+1, light); /* Generate new room (b) */ generate_room(c, y1b-1, x1b-1, y2b+1, x2b+1, light); /* Generate outer walls (a) */ draw_rectangle(c, y1a-1, x1a-1, y2a+1, x2a+1, FEAT_WALL_OUTER); /* Generate outer walls (b) */ draw_rectangle(c, y1b-1, x1b-1, y2b+1, x2b+1, FEAT_WALL_OUTER); /* Generate inner floors (a) */ fill_rectangle(c, y1a, x1a, y2a, x2a, FEAT_FLOOR); /* Generate inner floors (b) */ fill_rectangle(c, y1b, x1b, y2b, x2b, FEAT_FLOOR); /* Special features */ switch (randint1(4)) { /* Nothing */ case 1: break; /* Large solid middle pillar */ case 2: { fill_rectangle(c, y1b, x1a, y2b, x2a, FEAT_WALL_INNER); break; } /* Inner treasure vault */ case 3: { /* Generate a small inner vault */ draw_rectangle(c, y1b, x1a, y2b, x2a, FEAT_WALL_INNER); /* Open the inner vault with a secret door */ generate_hole(c, y1b, x1a, y2b, x2a, FEAT_SECRET); /* Place a treasure in the vault */ place_object(c, y0, x0, c->depth, FALSE, FALSE, ORIGIN_SPECIAL, 0); /* Let's guard the treasure well */ vault_monsters(c, y0, x0, c->depth + 2, randint0(2) + 3); /* Traps naturally */ vault_traps(c, y0, x0, 4, 4, randint0(3) + 2); break; } /* Something else */ case 4: { if (one_in_(3)) { /* Occasionally pinch the center shut */ /* Pinch the east/west sides */ for (y = y1b; y <= y2b; y++) { if (y == y0) continue; cave_set_feat(c, y, x1a - 1, FEAT_WALL_INNER); cave_set_feat(c, y, x2a + 1, FEAT_WALL_INNER); } /* Pinch the north/south sides */ for (x = x1a; x <= x2a; x++) { if (x == x0) continue; cave_set_feat(c, y1b - 1, x, FEAT_WALL_INNER); cave_set_feat(c, y2b + 1, x, FEAT_WALL_INNER); } /* Open sides with secret doors */ if (one_in_(3)) generate_open(c, y1b-1, x1a-1, y2b+1, x2a+1, FEAT_SECRET); } else if (one_in_(3)) { /* Occasionally put a "plus" in the center */ generate_plus(c, y1b, x1a, y2b, x2a, FEAT_WALL_INNER); } else if (one_in_(3)) { /* Occasionally put a "pillar" in the center */ cave_set_feat(c, y0, x0, FEAT_WALL_INNER); } break; } } return TRUE; } /** * Build a large room with an inner room. * * Possible sub-types: * 1 - An inner room * 2 - An inner room with a small inner room * 3 - An inner room with a pillar or pillars * 4 - An inner room with a checkerboard * 5 - An inner room with four compartments */ static bool build_large(struct cave *c, int y0, int x0) { int y, x, y1, x1, y2, x2; int light = FALSE; /* Occasional light */ if (c->depth <= randint1(25)) light = TRUE; /* Large room */ y1 = y0 - 4; y2 = y0 + 4; x1 = x0 - 11; x2 = x0 + 11; /* Generate new room */ generate_room(c, y1-1, x1-1, y2+1, x2+1, light); /* Generate outer walls */ draw_rectangle(c, y1-1, x1-1, y2+1, x2+1, FEAT_WALL_OUTER); /* Generate inner floors */ fill_rectangle(c, y1, x1, y2, x2, FEAT_FLOOR); /* The inner room */ y1 = y1 + 2; y2 = y2 - 2; x1 = x1 + 2; x2 = x2 - 2; /* Generate inner walls */ draw_rectangle(c, y1-1, x1-1, y2+1, x2+1, FEAT_WALL_INNER); /* Inner room variations */ switch (randint1(5)) { /* An inner room */ case 1: { /* Open the inner room with a secret door and place a monster */ generate_hole(c, y1-1, x1-1, y2+1, x2+1, FEAT_SECRET); vault_monsters(c, y0, x0, c->depth + 2, 1); break; } /* An inner room with a small inner room */ case 2: { /* Open the inner room with a secret door */ generate_hole(c, y1-1, x1-1, y2+1, x2+1, FEAT_SECRET); /* Place another inner room */ draw_rectangle(c, y0-1, x0-1, y0+1, x0+1, FEAT_WALL_INNER); /* Open the inner room with a locked door */ generate_hole(c, y0-1, x0-1, y0+1, x0+1, FEAT_DOOR_HEAD + randint1(7)); /* Monsters to guard the treasure */ vault_monsters(c, y0, x0, c->depth + 2, randint1(3) + 2); /* Object (80%) or Stairs (20%) */ if (randint0(100) < 80) place_object(c, y0, x0, c->depth, FALSE, FALSE, ORIGIN_SPECIAL, 0); else place_random_stairs(c, y0, x0); /* Traps to protect the treasure */ vault_traps(c, y0, x0, 4, 10, 2 + randint1(3)); break; } /* An inner room with an inner pillar or pillars */ case 3: { /* Open the inner room with a secret door */ generate_hole(c, y1-1, x1-1, y2+1, x2+1, FEAT_SECRET); /* Inner pillar */ fill_rectangle(c, y0-1, x0-1, y0+1, x0+1, FEAT_WALL_INNER); /* Occasionally, two more Large Inner Pillars */ if (one_in_(2)) { if (one_in_(2)) { fill_rectangle(c, y0-1, x0-7, y0+1, x0-5, FEAT_WALL_INNER); fill_rectangle(c, y0-1, x0+5, y0+1, x0+7, FEAT_WALL_INNER); } else { fill_rectangle(c, y0-1, x0-6, y0+1, x0-4, FEAT_WALL_INNER); fill_rectangle(c, y0-1, x0+4, y0+1, x0+6, FEAT_WALL_INNER); } } /* Occasionally, some Inner rooms */ if (one_in_(3)) { /* Inner rectangle */ draw_rectangle(c, y0-1, x0-5, y0+1, x0+5, FEAT_WALL_INNER); /* Secret doors (random top/bottom) */ place_secret_door(c, y0 - 3 + (randint1(2) * 2), x0 - 3); place_secret_door(c, y0 - 3 + (randint1(2) * 2), x0 + 3); /* Monsters */ vault_monsters(c, y0, x0 - 2, c->depth + 2, randint1(2)); vault_monsters(c, y0, x0 + 2, c->depth + 2, randint1(2)); /* Objects */ if (one_in_(3)) place_object(c, y0, x0 - 2, c->depth, FALSE, FALSE, ORIGIN_SPECIAL, 0); if (one_in_(3)) place_object(c, y0, x0 + 2, c->depth, FALSE, FALSE, ORIGIN_SPECIAL, 0); } break; } /* An inner room with a checkerboard */ case 4: { /* Open the inner room with a secret door */ generate_hole(c, y1-1, x1-1, y2+1, x2+1, FEAT_SECRET); /* Checkerboard */ for (y = y1; y <= y2; y++) for (x = x1; x <= x2; x++) if ((x + y) & 0x01) cave_set_feat(c, y, x, FEAT_WALL_INNER); /* Monsters just love mazes. */ vault_monsters(c, y0, x0 - 5, c->depth + 2, randint1(3)); vault_monsters(c, y0, x0 + 5, c->depth + 2, randint1(3)); /* Traps make them entertaining. */ vault_traps(c, y0, x0 - 3, 2, 8, randint1(3)); vault_traps(c, y0, x0 + 3, 2, 8, randint1(3)); /* Mazes should have some treasure too. */ vault_objects(c, y0, x0, c->depth, 3); break; } /* Four small rooms. */ case 5: { /* Inner "cross" */ generate_plus(c, y1, x1, y2, x2, FEAT_WALL_INNER); /* Doors into the rooms */ if (randint0(100) < 50) { int i = randint1(10); place_secret_door(c, y1 - 1, x0 - i); place_secret_door(c, y1 - 1, x0 + i); place_secret_door(c, y2 + 1, x0 - i); place_secret_door(c, y2 + 1, x0 + i); } else { int i = randint1(3); place_secret_door(c, y0 + i, x1 - 1); place_secret_door(c, y0 - i, x1 - 1); place_secret_door(c, y0 + i, x2 + 1); place_secret_door(c, y0 - i, x2 + 1); } /* Treasure, centered at the center of the cross */ vault_objects(c, y0, x0, c->depth, 2 + randint1(2)); /* Gotta have some monsters */ vault_monsters(c, y0 + 1, x0 - 4, c->depth + 2, randint1(4)); vault_monsters(c, y0 + 1, x0 + 4, c->depth + 2, randint1(4)); vault_monsters(c, y0 - 1, x0 - 4, c->depth + 2, randint1(4)); vault_monsters(c, y0 - 1, x0 + 4, c->depth + 2, randint1(4)); break; } } return TRUE; } /* Hook for which type of pit we are building */ /* TODO(elly): why is this file-static instead of an argument? */ static pit_profile *pit_type = NULL; /** * Hook for picking monsters appropriate to a nest/pit. * * Requires pit_type to be set. */ static bool mon_pit_hook(monster_race *r_ptr) { bool match_base = TRUE; bool match_color = TRUE; assert(r_ptr); assert(pit_type); if (rf_has(r_ptr->flags, RF_UNIQUE)) return FALSE; else if (!rf_is_subset(r_ptr->flags, pit_type->flags)) return FALSE; else if (rf_is_inter(r_ptr->flags, pit_type->forbidden_flags)) return FALSE; else if (!rsf_is_subset(r_ptr->spell_flags, pit_type->spell_flags)) return FALSE; else if (rsf_is_inter(r_ptr->spell_flags, pit_type->forbidden_spell_flags)) return FALSE; else if (pit_type->forbidden_monsters) { struct pit_forbidden_monster *monster; for (monster = pit_type->forbidden_monsters; monster; monster = monster->next) { if (r_ptr == monster->race) return FALSE; } } if (pit_type->n_bases > 0) { int i; match_base = FALSE; for (i = 0; i < pit_type->n_bases; i++) { if (r_ptr->base == pit_type->base[i]) match_base = TRUE; } } if (pit_type->colors) { struct pit_color_profile *colors; match_color = FALSE; for (colors = pit_type->colors; colors; colors = colors->next) { if (r_ptr->d_attr == colors->color) match_color = TRUE; } } return (match_base && match_color); } /** * Pick a type of monster pit, based on the level. * * We scan through all pits, and for each one generate a random depth * using a normal distribution, with the mean given in pit.txt, and a * standard deviation of 10. Then we pick the pit that gave us a depth that * is closest to the player's actual depth. * * Sets pit_type, which is required for mon_pit_hook. * Returns the index of the chosen pit. */ static int set_pit_type(int depth, int type) { int i; int pit_idx = 0; /* Hack -- set initial distance large */ int pit_dist = 999; for (i = 0; i < z_info->pit_max; i++) { int offset, dist; pit_profile *pit = &pit_info[i]; /* Skip empty pits or pits of the wrong room type */ if (!pit->name || pit->room_type != type) continue; offset = Rand_normal(pit->ave, 10); dist = ABS(offset - depth); if (dist < pit_dist && one_in_(pit->rarity)) { /* This pit is the closest so far */ pit_idx = i; pit_dist = dist; } } pit_type = &pit_info[pit_idx]; return pit_idx; } /** * Build a monster nest * * A monster nest consists of a rectangular moat around a room containing * monsters of a given type. * * The monsters are chosen from a set of 64 randomly selected monster races, * to allow the nest creation to fail instead of having "holes". * * Note the use of the "get_mon_num_prep()" function to prepare the * "monster allocation table" in such a way as to optimize the selection * of "appropriate" non-unique monsters for the nest. * * The available monster nests are specified in edit/pit.txt. * * Note that get_mon_num() function can fail, in which case the nest will be * empty, and will not affect the level rating. * * Monster nests will never contain unique monsters. */ static bool build_nest(struct cave *c, int y0, int x0) { int y, x, y1, x1, y2, x2; int i; int alloc_obj; monster_race *what[64]; bool empty = FALSE; int light = FALSE; int pit_idx; int size_vary = randint0(4); /* Large room */ y1 = y0 - 4; y2 = y0 + 4; x1 = x0 - 5 - size_vary; x2 = x0 + 5 + size_vary; /* Generate new room */ generate_room(c, y1-1, x1-1, y2+1, x2+1, light); /* Generate outer walls */ draw_rectangle(c, y1-1, x1-1, y2+1, x2+1, FEAT_WALL_OUTER); /* Generate inner floors */ fill_rectangle(c, y1, x1, y2, x2, FEAT_FLOOR); /* Advance to the center room */ y1 = y1 + 2; y2 = y2 - 2; x1 = x1 + 2; x2 = x2 - 2; /* Generate inner walls */ draw_rectangle(c, y1-1, x1-1, y2+1, x2+1, FEAT_WALL_INNER); /* Open the inner room with a secret door */ generate_hole(c, y1-1, x1-1, y2+1, x2+1, FEAT_SECRET); /* Decide on the pit type */ pit_idx = set_pit_type(c->depth, 2); /* Chance of objects on the floor */ alloc_obj = pit_info[pit_idx].obj_rarity; /* Prepare allocation table */ get_mon_num_prep(mon_pit_hook); /* Pick some monster types */ for (i = 0; i < 64; i++) { /* Get a (hard) monster type */ what[i] = get_mon_num(c->depth + 10); /* Notice failure */ if (!what[i]) empty = TRUE; } /* Prepare allocation table */ get_mon_num_prep(NULL); /* Oops */ if (empty) return FALSE; /* Describe */ ROOM_LOG("Monster nest (%s)", pit_info[pit_idx].name); /* Increase the level rating */ c->mon_rating += (size_vary + pit_info[pit_idx].ave / 20); /* Place some monsters */ for (y = y1; y <= y2; y++) { for (x = x1; x <= x2; x++) { /* Figure out what monster is being used, and place that monster */ monster_race *race = what[randint0(64)]; place_new_monster(c, y, x, race, FALSE, FALSE, ORIGIN_DROP_PIT); /* Occasionally place an item, making it good 1/3 of the time */ if (randint0(100) < alloc_obj) place_object(c, y, x, c->depth + 10, one_in_(3), FALSE, ORIGIN_PIT, 0); } } return TRUE; } /** * Build a monster pit * * Monster pits are laid-out similarly to monster nests. * * The available monster pits are specified in edit/pit.txt. * * The inside room in a monster pit appears as shown below, where the * actual monsters in each location depend on the type of the pit * * ############# * #11000000011# * #01234543210# * #01236763210# * #01234543210# * #11000000011# * ############# * * Note that the monsters in the pit are chosen by using get_mon_num() to * request 16 "appropriate" monsters, sorting them by level, and using the * "even" entries in this sorted list for the contents of the pit. * * Note the use of get_mon_num_prep() to prepare the monster allocation * table in such a way as to optimize the selection of appropriate non-unique * monsters for the pit. * * The get_mon_num() function can fail, in which case the pit will be empty, * and will not effect the level rating. * * Like monster nests, monster pits will never contain unique monsters. */ static bool build_pit(struct cave *c, int y0, int x0) { monster_race *what[16]; int i, j, y, x, y1, x1, y2, x2; bool empty = FALSE; int light = FALSE; int pit_idx; int alloc_obj; /* Large room */ y1 = y0 - 4; y2 = y0 + 4; x1 = x0 - 7; x2 = x0 + 7; /* Generate new room, outer walls and inner floor */ generate_room(c, y1-1, x1-1, y2+1, x2+1, light); draw_rectangle(c, y1-1, x1-1, y2+1, x2+1, FEAT_WALL_OUTER); fill_rectangle(c, y1, x1, y2, x2, FEAT_FLOOR); /* Advance to the center room */ y1 = y1 + 2; y2 = y2 - 2; x1 = x1 + 2; x2 = x2 - 2; /* Generate inner walls, and open with a secret door */ draw_rectangle(c, y1-1, x1-1, y2+1, x2+1, FEAT_WALL_INNER); generate_hole(c, y1-1, x1-1, y2+1, x2+1, FEAT_SECRET); /* Decide on the pit type */ pit_idx = set_pit_type(c->depth, 1); /* Chance of objects on the floor */ alloc_obj = pit_info[pit_idx].obj_rarity; /* Prepare allocation table */ get_mon_num_prep(mon_pit_hook); /* Pick some monster types */ for (i = 0; i < 16; i++) { /* Get a (hard) monster type */ what[i] = get_mon_num(c->depth + 10); /* Notice failure */ if (!what[i]) empty = TRUE; } /* Prepare allocation table */ get_mon_num_prep(NULL); /* Oops */ if (empty) return FALSE; ROOM_LOG("Monster pit (%s)", pit_info[pit_idx].name); /* Sort the entries XXX XXX XXX */ for (i = 0; i < 16 - 1; i++) { /* Sort the entries */ for (j = 0; j < 16 - 1; j++) { int i1 = j; int i2 = j + 1; int p1 = what[i1]->level; int p2 = what[i2]->level; /* Bubble */ if (p1 > p2) { monster_race *tmp = what[i1]; what[i1] = what[i2]; what[i2] = tmp; } } } /* Select every other entry */ for (i = 0; i < 8; i++) what[i] = what[i * 2]; /* Increase the level rating */ c->mon_rating += (3 + pit_info[pit_idx].ave / 20); /* Top and bottom rows (middle) */ for (x = x0 - 3; x <= x0 + 3; x++) { place_new_monster(c, y0 - 2, x, what[0], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y0 + 2, x, what[0], FALSE, FALSE, ORIGIN_DROP_PIT); } /* Corners */ for (x = x0 - 5; x <= x0 - 4; x++) { place_new_monster(c, y0 - 2, x, what[1], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y0 + 2, x, what[1], FALSE, FALSE, ORIGIN_DROP_PIT); } for (x = x0 + 4; x <= x0 + 5; x++) { place_new_monster(c, y0 - 2, x, what[1], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y0 + 2, x, what[1], FALSE, FALSE, ORIGIN_DROP_PIT); } /* Corners */ /* Middle columns */ for (y = y0 - 1; y <= y0 + 1; y++) { place_new_monster(c, y, x0 - 5, what[0], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y, x0 + 5, what[0], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y, x0 - 4, what[1], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y, x0 + 4, what[1], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y, x0 - 3, what[2], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y, x0 + 3, what[2], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y, x0 - 2, what[3], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y, x0 + 2, what[3], FALSE, FALSE, ORIGIN_DROP_PIT); } /* Corners around the middle monster */ place_new_monster(c, y0 - 1, x0 - 1, what[4], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y0 - 1, x0 + 1, what[4], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y0 + 1, x0 - 1, what[4], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y0 + 1, x0 + 1, what[4], FALSE, FALSE, ORIGIN_DROP_PIT); /* Above/Below the center monster */ for (x = x0 - 1; x <= x0 + 1; x++) { place_new_monster(c, y0 + 1, x, what[5], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y0 - 1, x, what[5], FALSE, FALSE, ORIGIN_DROP_PIT); } /* Next to the center monster */ place_new_monster(c, y0, x0 + 1, what[6], FALSE, FALSE, ORIGIN_DROP_PIT); place_new_monster(c, y0, x0 - 1, what[6], FALSE, FALSE, ORIGIN_DROP_PIT); /* Center monster */ place_new_monster(c, y0, x0, what[7], FALSE, FALSE, ORIGIN_DROP_PIT); /* Place some objects */ for (y = y0 - 2; y <= y0 + 2; y++) { for (x = x0 - 9; x <= x0 + 9; x++) { /* Occasionally place an item, making it good 1/3 of the time */ if (randint0(100) < alloc_obj) place_object(c, y, x, c->depth + 10, one_in_(3), FALSE, ORIGIN_PIT, 0); } } return TRUE; } /** * Build a room template from its string representation. */ static void build_room_template(struct cave *c, int y0, int x0, int ymax, int xmax, int doors, const char *data, int tval) { int dx, dy, x, y, rnddoors, doorpos, info; const char *t; bool rndwalls, light; assert(c); /* Occasional light */ light = c->depth <= randint1(25) ? TRUE : FALSE; /* Mark interior squares as being in a room (optionally lit) */ info = CAVE_ROOM | (light ? CAVE_GLOW : 0); /* Set the random door position here so it generates doors in all squares * marked with the same number */ rnddoors = randint1(doors); /* Decide whether optional walls will be generated this time */ rndwalls = one_in_(2) ? TRUE : FALSE; /* Place dungeon features and objects */ for (t = data, dy = 0; dy < ymax && *t; dy++) { for (dx = 0; dx < xmax && *t; dx++, t++) { /* Extract the location */ x = x0 - (xmax / 2) + dx; y = y0 - (ymax / 2) + dy; /* Skip non-grids */ if (*t == ' ') continue; /* Lay down a floor */ cave_set_feat(c, y, x, FEAT_FLOOR); /* Debugging assertion */ assert(cave_isempty(c, y, x)); /* Analyze the grid */ switch (*t) { case '%': cave_set_feat(c, y, x, FEAT_WALL_OUTER); break; case '#': cave_set_feat(c, y, x, FEAT_WALL_SOLID); break; case '+': place_secret_door(c, y, x); break; case 'x': { /* If optional walls are generated, put a wall in this square */ if (rndwalls) cave_set_feat(c, y, x, FEAT_WALL_SOLID); break; } case '=': { /* If optional walls are generated, put a door in this square */ if (rndwalls) place_secret_door(c, y, x); break; } case '-': { /* If optional walls are not generated, put a door in this square */ if (!rndwalls) place_secret_door(c, y, x); else cave_set_feat(c, y, x, FEAT_WALL_SOLID); break; } case '~': { /* Put something nice in this square * Object (80%) or Stairs (20%) */ if (randint0(100) < 80) place_object(c, y, x, c->depth, FALSE, FALSE, ORIGIN_SPECIAL, 0); else place_random_stairs(c, y, x); /* Some monsters to guard it */ vault_monsters(c, y, x, c->depth + 2, randint0(2) + 3); /* And some traps too */ vault_traps(c, y, x, 4, 4, randint0(3) + 2); break; } case '!': { /* Create some interesting stuff nearby */ /* A few monsters */ vault_monsters(c, y - 3, x - 3, c->depth + randint0(2), randint1(2)); vault_monsters(c, y + 3, x + 3, c->depth + randint0(2), randint1(2)); /* And maybe a bit of treasure */ if (one_in_(2)) vault_objects(c, y - 2, x + 2, c->depth, 1 + randint0(2)); if (one_in_(2)) vault_objects(c, y + 2, x - 2, c->depth, 1 + randint0(2)); break; } case '*': { /* Place an object of the template's specified tval */ place_object(c, y, x, c->depth, FALSE, FALSE, ORIGIN_SPECIAL, tval); break; } case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { /* Check if this is chosen random door position */ doorpos = atoi(t); if (doorpos == rnddoors) place_secret_door(c, y, x); else cave_set_feat(c, y, x, FEAT_WALL_SOLID); break; } } /* Part of a room */ c->info[y][x] |= info; } } } /** * Helper function for building room templates. */ static bool build_room_template_type(struct cave*c, int y0, int x0, int typ, const char *label) { room_template_type *t_ptr = random_room_template(typ); if (t_ptr == NULL) { /*quit_fmt("got NULL from random_room_template(%d)", typ);*/ return FALSE; } ROOM_LOG("Room template (%s)", t_ptr->name); /* Build the room */ build_room_template(c, y0, x0, t_ptr->hgt, t_ptr->wid, t_ptr->dor, t_ptr->text, t_ptr->tval); return TRUE; } static bool build_template(struct cave *c, int y0, int x0) { /* All room templates currently have type 1 */ return build_room_template_type(c, y0, x0, 1, "Special room"); } /** * Build a vault from its string representation. */ static void build_vault(struct cave *c, int y0, int x0, int ymax, int xmax, const char *data) { int dx, dy, x, y; const char *t; bool icky; assert(c); /* Place dungeon features and objects */ for (t = data, dy = 0; dy < ymax && *t; dy++) { for (dx = 0; dx < xmax && *t; dx++, t++) { /* Extract the location */ x = x0 - (xmax / 2) + dx; y = y0 - (ymax / 2) + dy; /* Skip non-grids */ if (*t == ' ') continue; /* Lay down a floor */ cave_set_feat(c, y, x, FEAT_FLOOR); /* Debugging assertion */ assert(cave_isempty(c, y, x)); /* By default vault squares are marked icky */ icky = TRUE; /* Analyze the grid */ switch (*t) { case '%': { /* In this case, the square isn't really part of the * vault, but rather is part of the "door step" to the * vault. We don't mark it icky so that the tunneling * code knows its allowed to remove this wall. */ cave_set_feat(c, y, x, FEAT_WALL_OUTER); icky = FALSE; break; } case '#': cave_set_feat(c, y, x, FEAT_WALL_INNER); break; case 'X': cave_set_feat(c, y, x, FEAT_PERM_INNER); break; case '+': place_secret_door(c, y, x); break; case '^': place_trap(c, y, x); break; case '*': { /* Treasure or a trap */ if (randint0(100) < 75) place_object(c, y, x, c->depth, FALSE, FALSE, ORIGIN_VAULT, 0); else place_trap(c, y, x); break; } } /* Part of a vault */ c->info[y][x] |= CAVE_ROOM; if (icky) c->info[y][x] |= CAVE_VAULT; } } /* Place dungeon monsters and objects */ for (t = data, dy = 0; dy < ymax && *t; dy++) { for (dx = 0; dx < xmax && *t; dx++, t++) { /* Extract the grid */ x = x0 - (xmax / 2) + dx; y = y0 - (ymax / 2) + dy; /* Hack -- skip "non-grids" */ if (*t == ' ') continue; /* Analyze the symbol */ switch (*t) { case '&': pick_and_place_monster(c, y, x, c->depth + 5, TRUE, TRUE, ORIGIN_DROP_VAULT); break; case '@': pick_and_place_monster(c, y, x, c->depth + 11, TRUE, TRUE, ORIGIN_DROP_VAULT); break; case '9': { /* Meaner monster, plus treasure */ pick_and_place_monster(c, y, x, c->depth + 9, TRUE, TRUE, ORIGIN_DROP_VAULT); place_object(c, y, x, c->depth + 7, TRUE, FALSE, ORIGIN_VAULT, 0); break; } case '8': { /* Nasty monster and treasure */ pick_and_place_monster(c, y, x, c->depth + 40, TRUE, TRUE, ORIGIN_DROP_VAULT); place_object(c, y, x, c->depth + 20, TRUE, TRUE, ORIGIN_VAULT, 0); break; } case ',': { /* Monster and/or object */ if (randint0(100) < 50) pick_and_place_monster(c, y, x, c->depth + 3, TRUE, TRUE, ORIGIN_DROP_VAULT); if (randint0(100) < 50) place_object(c, y, x, c->depth + 7, FALSE, FALSE, ORIGIN_VAULT, 0); break; } } } } } /** * Helper function for building vaults. */ static bool build_vault_type(struct cave*c, int y0, int x0, int typ, const char *label) { struct vault *v_ptr = random_vault(typ); if (v_ptr == NULL) { /*quit_fmt("got NULL from random_vault(%d)", typ);*/ return FALSE; } ROOM_LOG("%s (%s)", label, v_ptr->name); /* Boost the rating */ c->mon_rating += v_ptr->rat; /* Build the vault */ build_vault(c, y0, x0, v_ptr->hgt, v_ptr->wid, v_ptr->text); return TRUE; } /** * Build a lesser vault. */ static bool build_lesser_vault(struct cave *c, int y0, int x0) { return build_vault_type(c, y0, x0, 6, "Lesser vault"); } /** * Build a (medium) vault. */ static bool build_medium_vault(struct cave *c, int y0, int x0) { return build_vault_type(c, y0, x0, 7, "Medium vault"); } /** * Build a greater vaults. * * Since Greater Vaults are so large (4x6 blocks, in a 6x18 dungeon) there is * a 63% chance that a randomly chosen quadrant to start a GV on won't work. * To balance this, we give Greater Vaults an artificially high probability * of being attempted, and then in this function use a depth check to cancel * vault creation except at deep depths. * * The following code should make a greater vault with frequencies: * dlvl freq * 100+ 18.0% * 90-99 16.0 - 18.0% * 80-89 10.0 - 11.0% * 70-79 5.7 - 6.5% * 60-69 3.3 - 3.8% * 50-59 1.8 - 2.1% * 0-49 0.0 - 1.0% */ static bool build_greater_vault(struct cave *c, int y0, int x0) { int i; int numerator = 2; int denominator = 3; /* Only try to build a GV as the first room. */ if (dun->cent_n > 0) return FALSE; /* Level 90+ has a 2/3 chance, level 80-89 has 4/9, ... */ for(i = 90; i > c->depth; i -= 10) { numerator *= 2; denominator *= 3; } /* Attempt to pass the depth check and build a GV */ if (randint0(denominator) >= numerator) return FALSE; return build_vault_type(c, y0, x0, 8, "Greater vault"); } /** * Constructs a tunnel between two points * * This function must be called BEFORE any streamers are created, since we use * the special "granite wall" sub-types to keep track of legal places for * corridors to pierce rooms. * * We queue the tunnel grids to prevent door creation along a corridor which * intersects itself. * * We queue the wall piercing grids to prevent a corridor from leaving * a room and then coming back in through the same entrance. * * We pierce grids which are outer walls of rooms, and when we do so, we change * all adjacent outer walls of rooms into solid walls so that no two corridors * may use adjacent grids for exits. * * The solid wall check prevents corridors from chopping the corners of rooms * off, as well as silly door placement, and excessively wide room entrances. */ static void build_tunnel(struct cave *c, int row1, int col1, int row2, int col2) { int i, y, x; int tmp_row, tmp_col; int row_dir, col_dir; int start_row, start_col; int main_loop_count = 0; /* Used to prevent excessive door creation along overlapping corridors. */ bool door_flag = FALSE; /* Reset the arrays */ dun->tunn_n = 0; dun->wall_n = 0; /* Save the starting location */ start_row = row1; start_col = col1; /* Start out in the correct direction */ correct_dir(&row_dir, &col_dir, row1, col1, row2, col2); /* Keep going until done (or bored) */ while ((row1 != row2) || (col1 != col2)) { /* Mega-Hack -- Paranoia -- prevent infinite loops */ if (main_loop_count++ > 2000) break; /* Allow bends in the tunnel */ if (randint0(100) < dun->profile->tun.chg) { /* Get the correct direction */ correct_dir(&row_dir, &col_dir, row1, col1, row2, col2); /* Random direction */ if (randint0(100) < dun->profile->tun.rnd) rand_dir(&row_dir, &col_dir); } /* Get the next location */ tmp_row = row1 + row_dir; tmp_col = col1 + col_dir; while (!cave_in_bounds(c, tmp_row, tmp_col)) { /* Get the correct direction */ correct_dir(&row_dir, &col_dir, row1, col1, row2, col2); /* Random direction */ if (randint0(100) < dun->profile->tun.rnd) rand_dir(&row_dir, &col_dir); /* Get the next location */ tmp_row = row1 + row_dir; tmp_col = col1 + col_dir; } /* Avoid the edge of the dungeon */ if (cave_isperm(c, tmp_row, tmp_col)) continue; /* Avoid "solid" granite walls */ if (c->feat[tmp_row][tmp_col] == FEAT_WALL_SOLID) continue; /* Pierce "outer" walls of rooms */ if (c->feat[tmp_row][tmp_col] == FEAT_WALL_OUTER) { /* Get the "next" location */ y = tmp_row + row_dir; x = tmp_col + col_dir; /* Hack -- Avoid outer/solid permanent walls */ if (c->feat[y][x] == FEAT_PERM_SOLID) continue; if (c->feat[y][x] == FEAT_PERM_OUTER) continue; /* Hack -- Avoid outer/solid granite walls */ if (c->feat[y][x] == FEAT_WALL_OUTER) continue; if (c->feat[y][x] == FEAT_WALL_SOLID) continue; /* Accept this location */ row1 = tmp_row; col1 = tmp_col; /* Save the wall location */ if (dun->wall_n < WALL_MAX) { dun->wall[dun->wall_n].y = row1; dun->wall[dun->wall_n].x = col1; dun->wall_n++; } /* Forbid re-entry near this piercing */ for (y = row1 - 1; y <= row1 + 1; y++) for (x = col1 - 1; x <= col1 + 1; x++) if (c->feat[y][x] == FEAT_WALL_OUTER) cave_set_feat(c, y, x, FEAT_WALL_SOLID); } else if (c->info[tmp_row][tmp_col] & (CAVE_ROOM)) { /* Travel quickly through rooms */ /* Accept the location */ row1 = tmp_row; col1 = tmp_col; } else if (c->feat[tmp_row][tmp_col] >= FEAT_WALL_EXTRA) { /* Tunnel through all other walls */ /* Accept this location */ row1 = tmp_row; col1 = tmp_col; /* Save the tunnel location */ if (dun->tunn_n < TUNN_MAX) { dun->tunn[dun->tunn_n].y = row1; dun->tunn[dun->tunn_n].x = col1; dun->tunn_n++; } /* Allow door in next grid */ door_flag = FALSE; } else { /* Handle corridor intersections or overlaps */ /* Accept the location */ row1 = tmp_row; col1 = tmp_col; /* Collect legal door locations */ if (!door_flag) { /* Save the door location */ if (dun->door_n < DOOR_MAX) { dun->door[dun->door_n].y = row1; dun->door[dun->door_n].x = col1; dun->door_n++; } /* No door in next grid */ door_flag = TRUE; } /* Hack -- allow pre-emptive tunnel termination */ if (randint0(100) >= dun->profile->tun.con) { /* Distance between row1 and start_row */ tmp_row = row1 - start_row; if (tmp_row < 0) tmp_row = (-tmp_row); /* Distance between col1 and start_col */ tmp_col = col1 - start_col; if (tmp_col < 0) tmp_col = (-tmp_col); /* Terminate the tunnel */ if ((tmp_row > 10) || (tmp_col > 10)) break; } } } /* Turn the tunnel into corridor */ for (i = 0; i < dun->tunn_n; i++) { /* Get the grid */ y = dun->tunn[i].y; x = dun->tunn[i].x; /* Clear previous contents, add a floor */ cave_set_feat(c, y, x, FEAT_FLOOR); } /* Apply the piercings that we found */ for (i = 0; i < dun->wall_n; i++) { /* Get the grid */ y = dun->wall[i].y; x = dun->wall[i].x; /* Convert to floor grid */ cave_set_feat(c, y, x, FEAT_FLOOR); /* Place a random door */ if (randint0(100) < dun->profile->tun.pen) place_random_door(c, y, x); } } /** * Count the number of corridor grids adjacent to the given grid. * * This routine currently only counts actual "empty floor" grids which are not * in rooms. * * TODO: count stairs, open doors, closed doors? */ static int next_to_corr(struct cave *c, int y1, int x1) { int i, k = 0; assert(cave_in_bounds(c, y1, x1)); /* Scan adjacent grids */ for (i = 0; i < 4; i++) { /* Extract the location */ int y = y1 + ddy_ddd[i]; int x = x1 + ddx_ddd[i]; /* Count only floors which aren't part of rooms */ if (cave_isfloor(c, y, x) && !cave_isroom(c, y, x)) k++; } /* Return the number of corridors */ return k; } /** * Returns whether a doorway can be built in a space. * * To have a doorway, a space must be adjacent to at least two corridors and be * between two walls. */ static bool possible_doorway(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); if (next_to_corr(c, y, x) < 2) return FALSE; else if (cave_isstrongwall(c, y - 1, x) && cave_isstrongwall(c, y + 1, x)) return TRUE; else if (cave_isstrongwall(c, y, x - 1) && cave_isstrongwall(c, y, x + 1)) return TRUE; else return FALSE; } /** * Places door at y, x position if at least 2 walls found */ static void try_door(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); if (cave_isstrongwall(c, y, x)) return; if (cave_isroom(c, y, x)) return; if (randint0(100) < dun->profile->tun.jct && possible_doorway(c, y, x)) place_random_door(c, y, x); } /** * Attempt to build a room of the given type at the given block * * Note that we restrict the number of pits/nests to reduce * the chance of overflowing the monster list during level creation. */ static bool room_build(struct cave *c, int by0, int bx0, struct room_profile profile) { /* Extract blocks */ int by1 = by0; int bx1 = bx0; int by2 = by0 + profile.height; int bx2 = bx0 + profile.width; int allocated; int y, x; int by, bx; /* Enforce the room profile's minimum depth */ if (c->depth < profile.level) return FALSE; /* Only allow at most two pit/nests room per level */ if ((dun->pit_num >= MAX_PIT) && (profile.pit)){ return FALSE; } /* Never run off the screen */ if (by1 < 0 || by2 >= dun->row_rooms) return FALSE; if (bx1 < 0 || bx2 >= dun->col_rooms) return FALSE; /* Verify open space */ for (by = by1; by <= by2; by++) { for (bx = bx1; bx <= bx2; bx++) { if (1) { /* previous rooms prevent new ones */ if (dun->room_map[by][bx]) return FALSE; } else { return FALSE; /* XYZ */ } } } /* Get the location of the room */ y = ((by1 + by2 + 1) * BLOCK_HGT) / 2; x = ((bx1 + bx2 + 1) * BLOCK_WID) / 2; /* Try to build a room */ if (!profile.builder(c, y, x)) return FALSE; /* Save the room location */ if (dun->cent_n < CENT_MAX) { dun->cent[dun->cent_n].y = y; dun->cent[dun->cent_n].x = x; dun->cent_n++; } /* Reserve some blocks */ allocated = 0; for (by = by1; by < by2; by++) { for (bx = bx1; bx < bx2; bx++) { dun->room_map[by][bx] = TRUE; allocated++; } } /* Count pit/nests rooms */ if (profile.pit) dun->pit_num++; /* Success */ return TRUE; } /** * */ static void set_cave_dimensions(struct cave *c, int h, int w) { int i, n = h * w; c->height = h; c->width = w; if (cave_squares != NULL) FREE(cave_squares); cave_squares = C_ZNEW(n, int); for (i = 0; i < n; i++) cave_squares[i] = i; } /** * Generate a new dungeon level. */ #define DUN_AMT_ROOM 9 /* Number of objects for rooms */ #define DUN_AMT_ITEM 3 /* Number of objects for rooms/corridors */ #define DUN_AMT_GOLD 3 /* Amount of treasure for rooms/corridors */ static bool default_gen(struct cave *c, struct player *p) { int i, j, k, y, x, y1, x1; int by, bx = 0, tby, tbx, key, rarity, built; int num_rooms, size_percent; int dun_unusual = dun->profile->dun_unusual; bool blocks_tried[MAX_ROOMS_ROW][MAX_ROOMS_COL]; for (by = 0; by < MAX_ROOMS_ROW; by++) { for (bx = 0; bx < MAX_ROOMS_COL; bx++) { blocks_tried[by][bx] = FALSE; } } /* Possibly generate fewer rooms in a smaller area via a scaling factor. * Since we scale row_rooms and col_rooms by the same amount, DUN_ROOMS * gives the same "room density" no matter what size the level turns out * to be. TODO: vary room density slightly? */ /* XXX: Until vault generation is improved, scaling variance is removed */ i = randint1(10) + c->depth / 24; if (is_quest(c->depth)) size_percent = 100; else if (i < 2) size_percent = 75; else if (i < 3) size_percent = 80; else if (i < 4) size_percent = 85; else if (i < 5) size_percent = 90; else if (i < 6) size_percent = 95; else size_percent = 100; /* scale the various generation variables */ num_rooms = (dun->profile->dun_rooms * size_percent) / 100; set_cave_dimensions(c, DUNGEON_HGT, DUNGEON_WID); ROOM_LOG("height=%d width=%d nrooms=%d", c->height, c->width, num_rooms); /* Initially fill with basic granite */ fill_rectangle(c, 0, 0, DUNGEON_HGT - 1, DUNGEON_WID - 1, FEAT_WALL_EXTRA); /* Actual maximum number of rooms on this level */ dun->row_rooms = c->height / BLOCK_HGT; dun->col_rooms = c->width / BLOCK_WID; /* Initialize the room table */ for (by = 0; by < dun->row_rooms; by++) for (bx = 0; bx < dun->col_rooms; bx++) dun->room_map[by][bx] = blocks_tried[by][bx] = FALSE; /* No rooms yet, pits or otherwise. */ dun->pit_num = 0; dun->cent_n = 0; /* Build some rooms */ built = 0; while(built < num_rooms) { /* Count the room blocks we haven't tried yet. */ j = 0; tby = 0; tbx = 0; for(by = 0; by < dun->row_rooms; by++) { for(bx = 0; bx < dun->col_rooms; bx++) { if (blocks_tried[by][bx]) continue; j++; if (one_in_(j)) { tby = by; tbx = bx; } } } bx = tbx; by = tby; /* If we've tried all blocks we're done. */ if (j == 0) break; if (blocks_tried[by][bx]) quit_fmt("generation: inconsistent blocks"); /* Mark that we are trying this block. */ blocks_tried[by][bx] = TRUE; /* Roll for random key (to be compared against a profile's cutoff) */ key = randint0(100); /* We generate a rarity number to figure out how exotic to make the * room. This number has a depth/DUN_UNUSUAL chance of being > 0, * a depth^2/DUN_UNUSUAL^2 chance of being > 1, up to MAX_RARITY. */ i = 0; rarity = 0; while (i == rarity && i < dun->profile->max_rarity) { if (randint0(dun_unusual) < 50 + c->depth / 2) rarity++; i++; } /* Once we have a key and a rarity, we iterate through out list of * room profiles looking for a match (whose cutoff > key and whose * rarity > this rarity). We try building the room, and if it works * then we are done with this iteration. We keep going until we find * a room that we can build successfully or we exhaust the profiles. */ for (i = 0; i < dun->profile->n_room_profiles; i++) { struct room_profile profile = dun->profile->room_profiles[i]; if (profile.rarity > rarity) continue; if (profile.cutoff <= key) continue; if (room_build(c, by, bx, profile)) { built++; break; } } } /* Generate permanent walls around the edge of the dungeon */ draw_rectangle(c, 0, 0, DUNGEON_HGT - 1, DUNGEON_WID - 1, FEAT_PERM_SOLID); /* Hack -- Scramble the room order */ for (i = 0; i < dun->cent_n; i++) { int pick1 = randint0(dun->cent_n); int pick2 = randint0(dun->cent_n); y1 = dun->cent[pick1].y; x1 = dun->cent[pick1].x; dun->cent[pick1].y = dun->cent[pick2].y; dun->cent[pick1].x = dun->cent[pick2].x; dun->cent[pick2].y = y1; dun->cent[pick2].x = x1; } /* Start with no tunnel doors */ dun->door_n = 0; /* Hack -- connect the first room to the last room */ y = dun->cent[dun->cent_n-1].y; x = dun->cent[dun->cent_n-1].x; /* Connect all the rooms together */ for (i = 0; i < dun->cent_n; i++) { /* Connect the room to the previous room */ build_tunnel(c, dun->cent[i].y, dun->cent[i].x, y, x); /* Remember the "previous" room */ y = dun->cent[i].y; x = dun->cent[i].x; } /* Place intersection doors */ for (i = 0; i < dun->door_n; i++) { /* Extract junction location */ y = dun->door[i].y; x = dun->door[i].x; /* Try placing doors */ try_door(c, y, x - 1); try_door(c, y, x + 1); try_door(c, y - 1, x); try_door(c, y + 1, x); } ensure_connectedness(c); /* Add some magma streamers */ for (i = 0; i < dun->profile->str.mag; i++) build_streamer(c, FEAT_MAGMA, dun->profile->str.mc); /* Add some quartz streamers */ for (i = 0; i < dun->profile->str.qua; i++) build_streamer(c, FEAT_QUARTZ, dun->profile->str.qc); /* Place 3 or 4 down stairs near some walls */ alloc_stairs(c, FEAT_MORE, rand_range(3, 4), 3); /* Place 1 or 2 up stairs near some walls */ alloc_stairs(c, FEAT_LESS, rand_range(1, 2), 3); /* General amount of rubble, traps and monsters */ k = MAX(MIN(c->depth / 3, 10), 2); /* Put some rubble in corridors */ alloc_objects(c, SET_CORR, TYP_RUBBLE, randint1(k), c->depth, 0); /* Place some traps in the dungeon */ alloc_objects(c, SET_BOTH, TYP_TRAP, randint1(k), c->depth, 0); /* Determine the character location */ new_player_spot(c, p); /* Pick a base number of monsters */ i = MIN_M_ALLOC_LEVEL + randint1(8) + k; /* Put some monsters in the dungeon */ for (; i > 0; i--) pick_and_place_distant_monster(c, loc(p->px, p->py), 0, TRUE, c->depth); /* Put some objects in rooms */ alloc_objects(c, SET_ROOM, TYP_OBJECT, Rand_normal(DUN_AMT_ROOM, 3), c->depth, ORIGIN_FLOOR); /* Put some objects/gold in the dungeon */ alloc_objects(c, SET_BOTH, TYP_OBJECT, Rand_normal(DUN_AMT_ITEM, 3), c->depth, ORIGIN_FLOOR); alloc_objects(c, SET_BOTH, TYP_GOLD, Rand_normal(DUN_AMT_GOLD, 3), c->depth, ORIGIN_FLOOR); return TRUE; } /* ------------------ LABYRINTH ---------------- */ /** * Used to convert (x, y) into an array index (i) in labyrinth_gen(). */ static int lab_toi(int y, int x, int w) { return y * w + x; } /** * Used to convert an array index (i) into (x, y) in labyrinth_gen(). */ static void lab_toyx(int i, int w, int *y, int *x) { *y = i / w; *x = i % w; } /** * Given an adjoining wall (a wall which separates two labyrinth cells) * set a and b to point to the cell indices which are separated. Used by * labyrinth_gen(). */ static void lab_get_adjoin(int i, int w, int *a, int *b) { int y, x; lab_toyx(i, w, &y, &x); if (x % 2 == 0) { *a = lab_toi(y - 1, x, w); *b = lab_toi(y + 1, x, w); } else { *a = lab_toi(y, x - 1, w); *b = lab_toi(y, x + 1, w); } } /** * Return whether (x, y) is in a tunnel. * * For our purposes a tunnel is a horizontal or vertical path, not an * intersection. Thus, we want the squares on either side to walls in one * case (e.g. up/down) and open in the other case (e.g. left/right). We don't * want a square that represents an intersection point. * * The high-level idea is that these are squares which can't be avoided (by * walking diagonally around them). */ static bool lab_is_tunnel(struct cave *c, int y, int x) { bool west = cave_isopen(c, y, x - 1); bool east = cave_isopen(c, y, x + 1); bool north = cave_isopen(c, y - 1, x); bool south = cave_isopen(c, y + 1, x); return north == south && west == east && north != west; } /** * Build a labyrinth level. * * Note that if the function returns FALSE, a level wasn't generated. * Labyrinths use the dungeon level's number to determine whether to generate * themselves (which means certain level numbers are more likely to generate * labyrinths than others). */ static bool labyrinth_gen(struct cave *c, struct player *p) { int i, j, k, y, x; /* Size of the actual labyrinth part must be odd. */ /* NOTE: these are not the actual dungeon size, but rather the size of the * area we're genearting a labyrinth in (which doesn't count theh enclosing * outer walls. */ int h = 15 + randint0(c->depth / 10) * 2; int w = 51 + randint0(c->depth / 10) * 2; /* This is the number of squares in the labyrinth */ int n = h * w; /* NOTE: 'sets' and 'walls' are too large... we only need to use about * 1/4 as much memory. However, in that case, the addressing math becomes * a lot more complicated, so let's just stick with this because it's * easier to read. */ /* 'sets' tracks connectedness; if sets[i] == sets[j] then cells i and j * are connected to each other in the maze. */ int *sets; /* 'walls' is a list of wall coordinates which we will randomize */ int *walls; /* Most labyrinths are lit */ bool lit = randint0(c->depth) < 25 || randint0(2) < 1; /* Many labyrinths are known */ bool known = lit && randint0(c->depth) < 25; /* Most labyrinths have soft (diggable) walls */ bool soft = randint0(c->depth) < 35 || randint0(3) < 2; /* There's a base 2 in 100 to accept the labyrinth */ int chance = 2; /* If we're too shallow then don't do it */ if (c->depth < 13) return FALSE; /* Don't try this on quest levels, kids... */ if (is_quest(c->depth)) return FALSE; /* Certain numbers increase the chance of having a labyrinth */ if (c->depth % 3 == 0) chance += 1; if (c->depth % 5 == 0) chance += 1; if (c->depth % 7 == 0) chance += 1; if (c->depth % 11 == 0) chance += 1; if (c->depth % 13 == 0) chance += 1; /* Only generate the level if we pass a check */ /* NOTE: This test gets performed after we pass the test to use the * labyrinth cave profile. */ if (randint0(100) >= chance) return FALSE; /* allocate our arrays */ sets = C_ZNEW(n, int); walls = C_ZNEW(n, int); /* This is the dungeon size, which does include the enclosing walls */ set_cave_dimensions(c, h + 2, w + 2); /* Fill whole level with perma-rock */ fill_rectangle(c, 0, 0, DUNGEON_HGT - 1, DUNGEON_WID - 1, FEAT_PERM_SOLID); /* Fill the labyrinth area with rock */ fill_rectangle(c, 1, 1, h, w, soft ? FEAT_WALL_SOLID : FEAT_PERM_SOLID); /* Initialize each wall. */ for (i = 0; i < n; i++) { walls[i] = i; sets[i] = -1; } /* Cut out a grid of 1x1 rooms which we will call "cells" */ for (y = 0; y < h; y += 2) { for (x = 0; x < w; x += 2) { int k = lab_toi(y, x, w); sets[k] = k; cave_set_feat(c, y + 1, x + 1, FEAT_FLOOR); if (lit) c->info[y + 1][x + 1] |= CAVE_GLOW; } } /* Shuffle the walls, using Knuth's shuffle. */ shuffle(walls, n); /* For each adjoining wall, look at the cells it divides. If they aren't * in the same set, remove the wall and join their sets. * * This is a randomized version of Kruskal's algorithm. */ for (i = 0; i < n; i++) { int a, b, x, y; j = walls[i]; /* If this cell isn't an adjoining wall, skip it */ lab_toyx(j, w, &y, &x); if ((x < 1 && y < 1) || (x > w - 2 && y > h - 2)) continue; if (x % 2 == y % 2) continue; /* Figure out which cells are separated by this wall */ lab_get_adjoin(j, w, &a, &b); /* If the cells aren't connected, kill the wall and join the sets */ if (sets[a] != sets[b]) { int sa = sets[a]; int sb = sets[b]; cave_set_feat(c, y + 1, x + 1, FEAT_FLOOR); if (lit) c->info[y + 1][x + 1] |= CAVE_GLOW; for (k = 0; k < n; k++) { if (sets[k] == sb) sets[k] = sa; } } } /* Determine the character location */ new_player_spot(c, p); /* Generate a single set of stairs up if necessary. */ if (!cave_find(c, &y, &x, cave_isupstairs)) alloc_stairs(c, FEAT_LESS, 1, 3); /* Generate a single set of stairs down if necessary. */ if (!cave_find(c, &y, &x, cave_isdownstairs)) alloc_stairs(c, FEAT_MORE, 1, 3); /* Generate a door for every 100 squares in the labyrinth */ for (i = n / 100; i > 0; i--) { /* Try 10 times to find a useful place for a door, then place it */ for (j = 0; j < 10; j++) { find_empty(c, &y, &x); if (lab_is_tunnel(c, y, x)) break; } place_closed_door(c, y, x); } /* General some rubble, traps and monsters */ k = MAX(MIN(c->depth / 3, 10), 2); /* Scale number of monsters items by labyrinth size */ k = (3 * k * (h * w)) / (DUNGEON_HGT * DUNGEON_WID); /* Put some rubble in corridors */ alloc_objects(c, SET_BOTH, TYP_RUBBLE, randint1(k), c->depth, 0); /* Place some traps in the dungeon */ alloc_objects(c, SET_BOTH, TYP_TRAP, randint1(k), c->depth, 0); /* Put some monsters in the dungeon */ for (i = MIN_M_ALLOC_LEVEL + randint1(8) + k; i > 0; i--) pick_and_place_distant_monster(c, loc(p->px, p->py), 0, TRUE, c->depth); /* Put some objects/gold in the dungeon */ alloc_objects(c, SET_BOTH, TYP_OBJECT, Rand_normal(k * 6, 2), c->depth, ORIGIN_LABYRINTH); alloc_objects(c, SET_BOTH, TYP_GOLD, Rand_normal(k * 3, 2), c->depth, ORIGIN_LABYRINTH); alloc_objects(c, SET_BOTH, TYP_GOOD, randint1(2), c->depth, ORIGIN_LABYRINTH); /* Unlit labyrinths will have some good items */ if (!lit) alloc_objects(c, SET_BOTH, TYP_GOOD, Rand_normal(3, 2), c->depth, ORIGIN_LABYRINTH); /* Hard (non-diggable) labyrinths will have some great items */ if (!soft) alloc_objects(c, SET_BOTH, TYP_GREAT, Rand_normal(2, 1), c->depth, ORIGIN_LABYRINTH); /* If we want the players to see the maze layout, do that now */ if (known) wiz_light(FALSE); /* Deallocate our lists */ FREE(sets); FREE(walls); return TRUE; } /* ---------------- CAVERNS ---------------------- */ /** * Initialize the dungeon array, with a random percentage of squares open. */ static void init_cavern(struct cave *c, struct player *p, int density) { int h = c->height; int w = c->width; int size = h * w; int count = (size * density) / 100; /* Fill the edges with perma-rock, and rest with rock */ fill_rectangle(c, 0, 0, DUNGEON_HGT - 1, DUNGEON_WID - 1, FEAT_PERM_SOLID); fill_rectangle(c, 1, 1, h - 2, w - 2, FEAT_WALL_SOLID); while (count > 0) { int y = randint1(h - 2); int x = randint1(w - 2); if (cave_isrock(c, y, x)) { cave_set_feat(c, y, x, FEAT_FLOOR); count--; } } } /** * Return the number of walls (0-8) adjacent to this square. */ static int count_adj_walls(struct cave *c, int y, int x) { int yd, xd; int count = 0; for (yd = -1; yd <= 1; yd++) { for (xd = -1; xd <= 1; xd++) { if (yd == 0 && xd == 0) continue; if (cave_isfloor(c, y + yd, x + xd)) continue; count++; } } return count; } /** * Run a single pass of the cellular automata rules (4,5) on the dungeon. */ static void mutate_cavern(struct cave *c) { int y, x; int h = c->height; int w = c->width; int *temp = C_ZNEW(h * w, int); for (y = 1; y < h - 1; y++) { for (x = 1; x < w - 1; x++) { int count = count_adj_walls(c, y, x); if (count > 5) temp[y * w + x] = FEAT_WALL_SOLID; else if (count < 4) temp[y * w + x] = FEAT_FLOOR; else temp[y * w + x] = cave->feat[y][x]; } } for (y = 1; y < h - 1; y++) { for (x = 1; x < w - 1; x++) { cave_set_feat(c, y, x, temp[y * w + x]); } } FREE(temp); } /** * Fill an int[] with a single value. */ static void array_filler(int data[], int value, int size) { int i; for (i = 0; i < size; i++) data[i] = value; } /** * Determine if we need to worry about coloring a point, or can ignore it. */ static int ignore_point(struct cave *c, int colors[], int y, int x) { int h = c->height; int w = c->width; int n = lab_toi(y, x, w); if (y < 0 || x < 0 || y >= h || x >= w) return TRUE; if (colors[n]) return TRUE; //if (cave_isvault(c, y, x)) return TRUE; if (cave_isvault(c, y, x)) return FALSE; if (cave_ispassable(c, y, x)) return FALSE; if (cave_isdoor(c, y, x)) return FALSE; return TRUE; } static int xds[] = {0, 0, 1, -1, -1, -1, 1, 1}; static int yds[] = {1, -1, 0, 0, -1, 1, -1, 1}; #if 0 /* XXX d_m - is this meant to be in use? */ static void glow_point(struct cave *c, int y, int x) { int i, j; for (i = -1; i <= -1; i++) for (j = -1; j <= -1; j++) c->info[y + i][x + j] |= CAVE_GLOW; } #endif /** * Color a particular point, and all adjacent points. */ static void build_color_point(struct cave *c, int colors[], int counts[], int y, int x, int color, bool diagonal) { int h = c->height; int w = c->width; int size = h * w; struct queue *queue = q_new(size); int dslimit = diagonal ? 8 : 4; int *added = C_ZNEW(size, int); array_filler(added, 0, size); q_push_int(queue, lab_toi(y, x, w)); counts[color] = 0; while (q_len(queue) > 0) { int i, y2, x2; int n2 = q_pop_int(queue); lab_toyx(n2, w, &y2, &x2); if (ignore_point(cave, colors, y2, x2)) continue; colors[n2] = color; counts[color]++; /*if (lit) glow_point(c, y2, x2);*/ for (i = 0; i < dslimit; i++) { int y3 = y2 + yds[i]; int x3 = x2 + xds[i]; int n3 = lab_toi(y3, x3, w); if (ignore_point(cave, colors, y3, x3)) continue; if (added[n3]) continue; q_push_int(queue, n3); added[n3] = 1; } } FREE(added); q_free(queue); } /** * Create a color for each "NESW contiguous" region of the dungeon. */ static void build_colors(struct cave *c, int colors[], int counts[], bool diagonal) { int y, x; int h = c->height; int w = c->width; int color = 1; for (y = 0; y < h; y++) { for (x = 0; x < w; x++) { if (ignore_point(cave, colors, y, x)) continue; build_color_point(cave, colors, counts, y, x, color, diagonal); color++; } } } /** * Find and delete all small (<9 square) open regions. */ static void clear_small_regions(struct cave *c, int colors[], int counts[]) { int i, y, x; int h = c->height; int w = c->width; int size = h * w; int *deleted = C_ZNEW(size, int); array_filler(deleted, 0, size); for (i = 0; i < size; i++) { if (counts[i] < 9) { deleted[i] = 1; counts[i] = 0; } } for (y = 1; y < c->height - 1; y++) { for (x = 1; x < c->width - 1; x++) { i = lab_toi(y, x, w); if (!deleted[colors[i]]) continue; colors[i] = 0; cave_set_feat(c, y, x, FEAT_WALL_SOLID); } } FREE(deleted); } /** * Return the number of colors which have active cells. */ static int count_colors(int counts[], int size) { int i; int num = 0; for (i = 0; i < size; i++) if (counts[i] > 0) num++; return num; } /** * Return the first color which has one or more active cells. */ static int first_color(int counts[], int size) { int i; for (i = 0; i < size; i++) if (counts[i] > 0) return i; return -1; } /** * Find all cells of 'fromcolor' and repaint them to 'tocolor'. */ static void fix_colors(int colors[], int counts[], int from, int to, int size) { int i; for (i = 0; i < size; i++) if (colors[i] == from) colors[i] = to; counts[to] += counts[from]; counts[from] = 0; } /** * Create a tunnel connecting a region to one of its nearest neighbors. */ static void join_region(struct cave *c, int colors[], int counts[], int color) { int i; int h = c->height; int w = c->width; int size = h * w; /* Allocate a processing queue */ struct queue *queue = q_new(size); /* Allocate an array to keep track of handled squares, and which square * we reached them from. */ int *previous = C_ZNEW(size, int); array_filler(previous, -1, size); /* Push all squares of the given color onto the queue */ for (i = 0; i < size; i++) { if (colors[i] == color) { q_push_int(queue, i); previous[i] = i; } } /* Process all squares into the queue */ while (q_len(queue) > 0) { /* Get the current square and its color */ int n = q_pop_int(queue); int color2 = colors[n]; /* See if we've reached a square with a new color */ if (color2 && color2 != color) { /* Step backward through the path, turning stone to tunnel */ while (colors[n] != color) { int x, y; lab_toyx(n, w, &y, &x); colors[n] = color; if (!cave_isperm(c, y, x) && !cave_isvault(c, y, x)) { cave_set_feat(c, y, x, FEAT_FLOOR); } n = previous[n]; } /* Update the color mapping to combine the two colors */ fix_colors(colors, counts, color2, color, size); /* We're done now */ break; } /* If we haven't reached a new color, add all the unprocessed adjacent * squares to our queue. */ for (i = 0; i < 4; i++) { int y, x, n2; lab_toyx(n, w, &y, &x); /* Move to the adjacent square */ y += yds[i]; x += xds[i]; /* make sure we stay inside the boundaries */ if (y < 0 || y >= h) continue; if (x < 0 || x >= w) continue; /* If the cell hasn't already been procssed, add it to the queue */ n2 = lab_toi(y, x, w); if (previous[n2] >= 0) continue; q_push_int(queue, n2); previous[n2] = n; } } /* Free the memory we've allocated */ q_free(queue); FREE(previous); } /** * Start connecting regions, stopping when the cave is entirely connected. */ static void join_regions(struct cave *c, int colors[], int counts[]) { int h = c->height; int w = c->width; int size = h * w; int num = count_colors(counts, size); /* While we have multiple colors (i.e. disconnected regions), join one of * the regions to another one. */ while (num > 1) { int color = first_color(counts, size); join_region(c, colors, counts, color); num--; } } /** * Count the number of open cells in the dungeon. */ static int open_count(struct cave *c) { int x, y; int h = c->height; int w = c->width; int num = 0; for (y = 0; y < h; y++) for (x = 0; x < w; x++) if (cave_ispassable(c, y, x)) num++; return num; } /** * Make sure that all the regions of the dungeon are connected. * * This function colors each connected region of the dungeon, then uses that * information to join them into one conected region. */ void ensure_connectedness(struct cave *c) { int size = c->height * c->width; int *colors = C_ZNEW(size, int); int *counts = C_ZNEW(size, int); build_colors(c, colors, counts, TRUE); join_regions(c, colors, counts); FREE(colors); FREE(counts); } #define MAX_CAVERN_TRIES 10 /** * The generator's main function. */ bool cavern_gen(struct cave *c, struct player *p) { int i, k, openc; int h = rand_range(DUNGEON_HGT / 2, (DUNGEON_HGT * 3) / 4); int w = rand_range(DUNGEON_WID / 2, (DUNGEON_WID * 3) / 4); int size = h * w; int limit = size / 13; int density = rand_range(25, 40); int times = rand_range(3, 6); int *colors = C_ZNEW(size, int); int *counts = C_ZNEW(size, int); int tries = 0; bool ok = TRUE; set_cave_dimensions(c, h, w); ROOM_LOG("cavern h=%d w=%d size=%d density=%d times=%d", h, w, size, density, times); if (c->depth < 15) { /* If we're too shallow then don't do it */ ok = FALSE; } else { /* Start trying to build caverns */ array_filler(colors, 0, size); array_filler(counts, 0, size); for (tries = 0; tries < MAX_CAVERN_TRIES; tries++) { /* Build a random cavern and mutate it a number of times */ init_cavern(c, p, density); for (i = 0; i < times; i++) mutate_cavern(c); /* If there are enough open squares then we're done */ openc = open_count(c); if (openc >= limit) { ROOM_LOG("cavern ok (%d vs %d)", openc, limit); break; } ROOM_LOG("cavern failed--try again (%d vs %d)", openc, limit); } /* If we couldn't make a big enough cavern then fail */ if (tries == MAX_CAVERN_TRIES) ok = FALSE; } if (ok) { build_colors(c, colors, counts, FALSE); clear_small_regions(c, colors, counts); join_regions(c, colors, counts); /* Place 2-3 down stairs near some walls */ alloc_stairs(c, FEAT_MORE, rand_range(1, 3), 3); /* Place 1-2 up stairs near some walls */ alloc_stairs(c, FEAT_LESS, rand_range(1, 2), 3); /* General some rubble, traps and monsters */ k = MAX(MIN(c->depth / 3, 10), 2); /* Scale number of monsters items by cavern size */ k = MAX((4 * k * (h * w)) / (DUNGEON_HGT * DUNGEON_WID), 6); /* Put some rubble in corridors */ alloc_objects(c, SET_BOTH, TYP_RUBBLE, randint1(k), c->depth, 0); /* Place some traps in the dungeon */ alloc_objects(c, SET_BOTH, TYP_TRAP, randint1(k), c->depth, 0); /* Determine the character location */ new_player_spot(c, p); /* Put some monsters in the dungeon */ for (i = randint1(8) + k; i > 0; i--) pick_and_place_distant_monster(c, loc(p->px, p->py), 0, TRUE, c->depth); /* Put some objects/gold in the dungeon */ alloc_objects(c, SET_BOTH, TYP_OBJECT, Rand_normal(k, 2), c->depth + 5, ORIGIN_CAVERN); alloc_objects(c, SET_BOTH, TYP_GOLD, Rand_normal(k / 2, 2), c->depth, ORIGIN_CAVERN); alloc_objects(c, SET_BOTH, TYP_GOOD, randint0(k / 4), c->depth, ORIGIN_CAVERN); } FREE(colors); FREE(counts); return ok; } /* ------------------ TOWN ---------------- */ /** * Builds a store at a given pseudo-location * * Currently, there is a main street horizontally through the middle of town, * and all the shops face it (e.g. the shops on the north side face south). */ static void build_store(struct cave *c, int n, int yy, int xx) { /* Find the "center" of the store */ int y0 = yy * 9 + 6; int x0 = xx * 14 + 12; /* Determine the store boundaries */ int y1 = y0 - randint1((yy == 0) ? 3 : 2); int y2 = y0 + randint1((yy == 1) ? 3 : 2); int x1 = x0 - randint1(5); int x2 = x0 + randint1(5); /* Determine door location, based on which side of the street we're on */ int dy = (yy == 0) ? y2 : y1; int dx = rand_range(x1, x2); /* Build an invulnerable rectangular building */ fill_rectangle(c, y1, x1, y2, x2, FEAT_PERM_EXTRA); /* Clear previous contents, add a store door */ cave_set_feat(c, dy, dx, FEAT_SHOP_HEAD + n); } /** * Generate the "consistent" town features, and place the player * * HACK: We seed the simple RNG, so we always get the same town layout, * including the size and shape of the buildings, the locations of the * doorways, and the location of the stairs. This means that if any of the * functions used to build the town change the way they use the RNG, the * town layout will be generated differently. * * XXX: Remove this gross hack when this piece of code is fully reentrant - * i.e., when all we need to do is swing a pointer to change caves, we just * need to generate the town once (we will also need to save/load the town). */ static void town_gen_hack(struct cave *c, struct player *p) { int y, x, n, k; int rooms[MAX_STORES]; int n_rows = 2; int n_cols = (MAX_STORES + 1) / n_rows; /* Switch to the "simple" RNG and use our original town seed */ Rand_quick = TRUE; Rand_value = seed_town; /* Prepare an Array of "remaining stores", and count them */ for (n = 0; n < MAX_STORES; n++) rooms[n] = n; /* Place rows of stores */ for (y = 0; y < n_rows; y++) { for (x = 0; x < n_cols; x++) { if (n < 1) break; /* Pick a remaining store */ k = randint0(n); /* Build that store at the proper location */ build_store(c, rooms[k], y, x); /* Shift the stores down, remove one store */ rooms[k] = rooms[--n]; } } /* Place the stairs */ find_empty_range(c, &y, 3, TOWN_HGT - 3, &x, 3, TOWN_WID - 3); /* Clear previous contents, add down stairs */ cave_set_feat(c, y, x, FEAT_MORE); /* Place the player */ player_place(c, p, y, x); /* go back to using the "complex" RNG */ Rand_quick = FALSE; } /** * Town logic flow for generation of new town. * * We start with a fully wiped cave of normal floors. This function does NOT do * anything about the owners of the stores, nor the contents thereof. It only * handles the physical layout. */ static bool town_gen(struct cave *c, struct player *p) { int i; bool daytime = turn % (10 * TOWN_DAWN) < (10 * TOWN_DUSK); int residents = daytime ? MIN_M_ALLOC_TD : MIN_M_ALLOC_TN; assert(c); set_cave_dimensions(c, TOWN_HGT, TOWN_WID); /* NOTE: We can't use c->height and c->width here because then there'll be * a bunch of empty space in the level that monsters might spawn in (or * teleport might take you to, or whatever). * * TODO: fix this to use c->height and c->width when all the 'choose * random location' things honor them. */ /* Start with solid walls, and then create some floor in the middle */ fill_rectangle(c, 0, 0, DUNGEON_HGT - 1, DUNGEON_WID - 1, FEAT_PERM_SOLID); fill_rectangle(c, 1, 1, c->height -2, c->width - 2, FEAT_FLOOR); /* Build stuff */ town_gen_hack(c, p); /* Apply illumination */ cave_illuminate(c, daytime); /* Make some residents */ for (i = 0; i < residents; i++) pick_and_place_distant_monster(c, loc(p->px, p->py), 3, TRUE, c->depth); return TRUE; } /** * Clear the dungeon, ready for generation to begin. */ static void cave_clear(struct cave *c, struct player *p) { int x, y; wipe_o_list(c); wipe_mon_list(c, p); /* Clear flags and flow information. */ for (y = 0; y < DUNGEON_HGT; y++) { for (x = 0; x < DUNGEON_WID; x++) { /* Erase features */ c->feat[y][x] = 0; /* Erase flags */ c->info[y][x] = 0; c->info2[y][x] = 0; /* Erase flow */ c->cost[y][x] = 0; c->when[y][x] = 0; /* Erase monsters/player */ c->m_idx[y][x] = 0; /* Erase items */ c->o_idx[y][x] = 0; } } /* Unset the player's coordinates */ p->px = p->py = 0; /* Nothing special here yet */ c->good_item = FALSE; /* Nothing good here yet */ c->mon_rating = 0; c->obj_rating = 0; } /** * Place hidden squares that will be used to generate feeling */ static void place_feeling(struct cave *c) { int y,x,i,j; int tries = 500; for (i = 0; i < FEELING_TOTAL; i++) { for (j = 0; j < tries; j++) { /* Pick a random dungeon coordinate */ y = randint0(c->height); x = randint0(c->width); /* Check to see if it is not a wall */ if (cave_iswall(c, y, x)) continue; /* Check to see if it is already marked */ if (cave_isfeel(c, y, x)) continue; /* Set the cave square appropriately */ c->info2[y][x] |= CAVE2_FEEL; break; } } /* Reset number of feeling squares */ c->feeling_squares = 0; } /** * Calculate the level feeling for objects. */ static int calc_obj_feeling(struct cave *c) { u32b x; /* Town gets no feeling */ if (c->depth == 0) return 0; /* Artifacts trigger a special feeling when preserve=no */ if (c->good_item && OPT(birth_no_preserve)) return 10; /* Check the loot adjusted for depth */ x = c->obj_rating / c->depth; /* Apply a minimum feeling if there's an artifact on the level */ if (c->good_item && x < 64001) return 60; if (x > 16000000) return 20; if (x > 4000000) return 30; if (x > 1000000) return 40; if (x > 250000) return 50; if (x > 64000) return 60; if (x > 16000) return 70; if (x > 4000) return 80; if (x > 1000) return 90; return 100; } /** * Calculate the level feeling for monsters. */ static int calc_mon_feeling(struct cave *c) { u32b x; /* Town gets no feeling */ if (c->depth == 0) return 0; /* Check the monster power adjusted for depth */ x = c->mon_rating / (c->depth * c->depth); if (x > 7000) return 1; if (x > 4500) return 2; if (x > 2500) return 3; if (x > 1500) return 4; if (x > 800) return 5; if (x > 400) return 6; if (x > 150) return 7; if (x > 50) return 8; return 9; } /** * Reset the current dungeon's generation data. */ static void clear_dun_data(struct dun_data *d) { int bx, by; for (by = 0; by < MAX_ROOMS_ROW; by++) { for (bx = 0; bx < MAX_ROOMS_COL; bx++) { d->room_map[by][bx] = FALSE; } } } /** * Generate a random level. * * Confusingly, this function also generate the town level (level 0). */ void cave_generate(struct cave *c, struct player *p) { const char *error = "no generation"; int tries = 0; assert(c); c->depth = p->depth; /* Generate */ for (tries = 0; tries < 100 && error; tries++) { struct dun_data dun_body; error = NULL; cave_clear(c, p); /* Mark the dungeon as being unready (to avoid artifact loss, etc) */ character_dungeon = FALSE; /* Allocate global data (will be freed when we leave the loop) */ dun = &dun_body; clear_dun_data(dun); if (p->depth == 0) { dun->profile = &town_profile; dun->profile->builder(c, p); } else if (is_quest(c->depth)) { /* Quest levels must be normal levels */ dun->profile = &cave_profiles[NUM_CAVE_PROFILES - 1]; dun->profile->builder(c, p); } else { int perc = randint0(100); int last = NUM_CAVE_PROFILES - 1; int i; for (i = 0; i < NUM_CAVE_PROFILES; i++) { bool ok; const struct cave_profile *profile; profile = dun->profile = &cave_profiles[i]; if (i < last && profile->cutoff < perc) continue; ok = dun->profile->builder(c, p); if (ok) break; } } /* Ensure quest monsters */ if (is_quest(c->depth)) { int i; for (i = 1; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; int y, x; /* The monster must be an unseen quest monster of this depth. */ if (r_ptr->cur_num > 0) continue; if (!rf_has(r_ptr->flags, RF_QUESTOR)) continue; if (r_ptr->level != c->depth) continue; /* Pick a location and place the monster */ find_empty(c, &y, &x); place_new_monster(c, y, x, r_ptr, TRUE, TRUE, ORIGIN_DROP); } } /* Place dungeon squares to trigger feeling (not in town) */ if (p_ptr->depth) place_feeling(c); c->feeling = calc_obj_feeling(c) + calc_mon_feeling(c); /* Regenerate levels that overflow their maxima */ if (o_max >= z_info->o_max) error = "too many objects"; if (cave_monster_max(cave) >= z_info->m_max) error = "too many monsters"; if (error) ROOM_LOG("Generation restarted: %s.", error); } FREE(cave_squares); cave_squares = NULL; if (error) quit_fmt("cave_generate() failed 100 times!"); /* The dungeon is ready */ character_dungeon = TRUE; c->created_at = turn; } struct init_module generate_module = { .name = "generate", .init = run_room_parser, .cleanup = cleanup_room_parser, }; angband-3.5.1/src/main-crb.c0000644000175000017500000032227712456456606015100 0ustar chriscchrisc/* * File: main-crb.c * Purpose: Provide support for OS X, version 10.3 and later. * * Copyright (c) 2003 pelpel * Copyright (c) 2003,2004,2005 Robert Ruehlmann * Copyright (c) 2007,2008 pete mack * Copyright (c) 2008 Rowan Beentje * Copyright (c) 2010 Andi Sidwell * * Some excerpts quoted under fair use from works by Ben Harrison, * Keith Randall, Peter Ammon, and Ron Anderson. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "files.h" #include "init.h" #include "grafmode.h" #include #include /* * Notes: * * (pelpel) Characters in the ASCII mode are clipped by their bounding * rects to reduce redraw artefacts that were quite annoying in certain * font-point combos. * * * (pete mack) Nearly all quickdraw removed to improve performance from * interleaved Quickdraw and CGContext events. (Hence the really ugly * ATSU font metrics.) * IMPORTANT: If you need to use QuickDraw, make sure to call hibernate() * and SetPort() first. This will keep the graphics state consistent. * * (pete mack) If you wish to add additional heirarchical menus, the following * must hold: * All menus and submenus must have unique ids. * All menus must have IDs greater than 0 and less than MAX_MENU_ID * All submenus must have greater IDs than their parents. * * * Important Resources in the resource file: * * FREF 130 = ANGBAND_CREATOR / 'APPL' (application) * FREF 129 = ANGBAND_CREATOR / 'SAVE' (save file) * FREF 130 = ANGBAND_CREATOR / 'TEXT' (bone file, generic text file) * FREF 131 = ANGBAND_CREATOR / 'DATA' (binary image file, score file) * */ /* ------------------------------------------------------- * PORTING YOUR VARIANT * ------------------------------------------------------ * 0. Requires installation of XCode. The framework .h files are otherwise * absent. New changes also require use of NIB (xml) files, which * are most easily edited with Interface Builder. (XCode package.) * This reduces the amount of hand-coded menu creation by an order of magnitude. * * * 1. Compiling the binary * * You might wish to disable some SET_UID features for various reasons: * to have user folder within the lib folder, savefile names etc. * * 2. Installation * * The "angband" binary must be arranged this way for it to work: * * lib/ <- the lib folder * Angband (OS X).app/ * Contents/ * MacOS/ * angband <- the binary you've just compiled * Info.plist <- to be explained below * Resources/ * Angband.icns * Data.icns * Edit.icns * Save.icns * 8x8.png <- 8x8 tiles * 16x16.png <- 16x16 tiles * angband.rsrc <- see below * * Graphics resources are moved out of the resource fork and become ordinary * PNG files. Make sure to set its resolution to 72 dpi (<- VERY important) * while keeping vertical and horizontal scaling factor to 100% (<- VERY * important), when you convert tiles in any formats to PNG. This means * that the real size of an image must shrink or grow when you change it's dpi. * Graphics files must be of type png, because OSX 10.3 doesn't do * a good job with composited images. * * Transparency now uses the alpha channel, rather than a background color. * * ---(end of OS X + gcc porting note)-------------------------------------- * * Because the default font-size combination causes redraw artefact problem * (some characters, even in monospace fonts, have negative left bearings), * I [pelpel] introduced rather crude hack to clip all character drawings within * their bounding rects. If you don't like this, please comment out the line * #define CLIP_HACK * below. The alternative, #define OVERWRITE_HACK, is based on Julian Lighton's * brilliant suggestion, but it doesn't work as expected. This is because * DrawText can render the same character with _different_ pixel width, * depending on relative position of a character to the pen. Fonts do look * very nice on the Mac, but too nice I'd say, in case of Angband. * * The check for return values of AEProcessAppleEvent is intentionally ignored. * * Changes 2006 (pete mack) * - Removed conditional code. Removed non-quicktime sound. * - Reorganized event model to use Carbon events and dispatching. * - Removed old font menus & calculations; replaced with Apple font panel. * - Removed Quickdraw graphics; replaced with CGContext (Quartz) graphics. * - Removed Quickdraw text; replaced with CGFont. ATSUI is used for * finding fonts, font metrics, and Glyph information for fast rendering * of variable-width fonts. */ #ifdef MACH_O_CARBON #include #include #include #include #include #include "osx/osx_tables.h" /* Default creator signature */ #ifndef huge #define huge size_t #endif /* * Width in pixels of white borders around the black screen. */ #define BORDER_WID 1 static const bool show_events = 0; /* * A rather crude fix to reduce amount of redraw artifacts. * Some fixed width fonts (i.e. Monaco) has characters with negative * left bearings, so Term_wipe_mac or overwriting cannot completely * erase them. */ #define CLIP_HACK 0 /* */ static const int use_clip_hack = CLIP_HACK; /* * Minimum font size */ #define MIN_FONT 8 /* * Another redraw artifact killer, based on suggestion by Julian Lighton */ #define OVERWRITE_HACK (0) /* * These hacks should never be enabled at the same time. * Clip-hack renders overwrite-hack meaningless, and * it will cause use of an unitialized variable. - pete mack. */ static const int use_overwrite_hack = (OVERWRITE_HACK && !CLIP_HACK); /* * Maximum number of windows. */ #define MAX_TERM_DATA 8 /* graphics_modes index of current graphics mode */ static UInt32 graf_mode = 0; /* Tile dimensions of the current graphics mode */ static int graf_height = 0; static int graf_width = 0; /* * Use antialiasing. Without image differencing from * OSX 10.4 features, you won't want to use this. */ static bool antialias = false; typedef struct GlyphInfo GlyphInfo; typedef struct term_data term_data; /* * Extra "term" data */ struct term_data { term *t; WindowRef w; GlyphInfo *ginfo; Rect wr; /* Absolute bounds of window (for save/restore) */ Rect r; /* Canvas bounds of window (for mouse addressing &c) */ CGRect bounds; /* Relative bounds of border-clipped canvas. */ int spacing; /* Text padding (in pixels) for tiling wider than text */ char title[255]; /* Window title. */ s16b mapped; /* Active state. */ s16b rows; /* rows in picture */ s16b cols; /* columns in picture. */ char font_name[200]; /* Name of font for storage. */ ATSUFontID font_id; float font_size; /* Scaled ATSU font size. */ u16b font_wid; u16b font_hgt; u16b tile_wid; u16b tile_hgt; s16b size_wid; /* Window size in x. */ s16b size_hgt; /* Window size in y. */ }; struct GlyphInfo { UInt32 refcount; char psname[1000]; ATSUFontID font_id; CGFontRef fontRef; float font_size; ATSUStyle style; ATSUTextLayout layout; float font_wid; /* max character advance. */ s32b ascent; s32b descent; bool monospace; float offsets[256][3]; float heights[256][3]; }; static GlyphInfo glyph_data[MAX_TERM_DATA+1]; static WindowRef aboutDialog; static bool CheckEvents(int wait); static OSStatus RevalidateGraphics(term_data *td, bool reset_tilesize); static char *locate_lib(char *buf, size_t size); static void graphics_aux(UInt32 op); static void Term_wipe_mac_aux(int x, int y, int n); inline static void term_data_color(int a); static void install_handlers(WindowRef w); static void graphics_tiles_nuke(void); static void play_sound(int num); static void redrawRecentItemsMenu(); /* * Available values for 'wait' */ #define CHECK_EVENTS_DRAIN -1 #define CHECK_EVENTS_NO_WAIT 0 #define CHECK_EVENTS_WAIT 1 /* * Delay handling of double-clicked savefiles */ bool open_when_ready = FALSE; /* * Delay handling of pre-emptive "quit" event */ bool quit_when_ready = FALSE; static long mac_os_version; /* Out-of-band color identifiers */ /* True black (TERM_BLACK may be altered) */ #define COLOR_BLACK (255) /* No current color */ #define COLOR_INVALID (-1) /* * Keeps track of who owns the QD CGContext, and it's current state. * Always use this to change the active graphics port. * (It is a parallel structure to the Term variable.) */ struct ActivePort { WindowRef active; CGContextRef ctx; int color; /* Current fill colorcode */ /* CGColorRef color_info[256+1]; */ float color_info[256+1][3]; }; static struct ActivePort focus; /* initialized to 0 */ /* * An array of term_data's */ static term_data data[MAX_TERM_DATA]; /* * Note when "open"/"new" become valid */ static bool initialized = FALSE; /* * A mutable array for Recent Items */ CFMutableArrayRef recentItemsArrayRef = NULL; /* * Support the improved game command handling */ #include "textui.h" static game_command cmd = { CMD_NULL, 0 }; static MenuRef MyGetMenuHandle_aux(int menuID, bool first) { static MenuRef menuRefs[MAX_MENU_ID]; if(menuID <= 0 || menuID >= MAX_MENU_ID) return 0; if(menuRefs[menuID]) return menuRefs[menuID]; MenuRef m = GetMenuHandle(menuID); if(m) { menuRefs[menuID] = m; return m; } /* * First heirarchical call, find and initialize all menu IDs. * Subsequent misses will attempt to update the menuRefs array. * This will work for any depth heirarchy, so long as child menus have * higher IDs than their parents. * * Invariant: all MenuRefs with ID < MenuID(tmp) have been initialized. */ for(int id = 1; id < MAX_MENU_ID; id++) { /* Recursion depth is 1 */ if(first) m = MyGetMenuHandle_aux(id, false); if(!m) continue; menuRefs[id] = m; for(size_t i = 0; i < N_ELEMENTS(menuRefs); i++) { MenuRef tmp = 0; GetMenuItemHierarchicalMenu (m, i, &tmp); if(tmp) { menuRefs[GetMenuID(tmp)] = tmp; } } } return menuRefs[menuID]; } /* * Provide a flat namespace for OS X menus and submenus. * It's a nuisance doing this via heirarchical calls all the time. */ inline static MenuRef MyGetMenuHandle(int menuID) { return MyGetMenuHandle_aux(menuID, true); } /* * Convert a pathname to a corresponding FSSpec. * Returns noErr on success. */ static OSErr path_to_spec(const char *path, FSSpec *spec) { OSErr err; FSRef ref; /* Convert pathname to FSRef ... */ err = FSPathMakeRef((byte*) path, &ref, NULL); if (err != noErr) return (err); /* ... then FSRef to FSSpec */ err = FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, NULL, spec, NULL); /* Inform caller of success or failure */ return (err); } /* * Convert a FSSpec to a corresponding pathname. * Returns noErr on success. */ static OSErr spec_to_path(const FSSpec *spec, char *buf, size_t size) { OSErr err; FSRef ref; /* Convert FSSpec to FSRef ... */ err = FSpMakeFSRef(spec, &ref); if (err != noErr) return (err); /* ... then FSRef to pathname */ err = FSRefMakePath(&ref, (byte*)buf, size); /* Inform caller of success or failure */ return (err); } /* * [via path_to_spec] * Set creator and filetype of a file specified by POSIX-style pathname. * Returns 0 on success, -1 in case of errors. */ static void fsetfileinfo(const char *pathname, u32b fcreator, u32b ftype) { OSErr err; FSSpec spec; FInfo info; /* Convert pathname to FSSpec */ if (path_to_spec(pathname, &spec) != noErr) return; /* Obtain current finder info of the file */ if (FSpGetFInfo(&spec, &info) != noErr) return; /* Overwrite creator and type */ info.fdCreator = fcreator; info.fdType = ftype; err = FSpSetFInfo(&spec, &info); /* Done */ return; } static void osx_file_open_hook(const char *path, file_type ftype) { u32b mac_type = 0; if (ftype == FTYPE_RAW) mac_type = 'DATA'; else if (ftype == FTYPE_SAVE) mac_type = 'SAVE'; if (mac_type) fsetfileinfo(path, 'A271', mac_type); } /* * Activate a given window, if necessary. This should normally * be called by Term_activate, when the z-term is updating it's * state. It should also be called prior to any updates when * the window CGContext has been closed by hibernate() */ static void activate(WindowRef w) { /* Activate */ if(focus.active && focus.ctx) { CGContextSynchronize(focus.ctx); if(focus.active != w) { /* Change window context */ QDEndCGContext(GetWindowPort(focus.active), &focus.ctx); focus.ctx = 0; } } /* Activate */ if (w && focus.ctx == 0) { focus.color = COLOR_INVALID; term_data *td = (term_data*) GetWRefCon(w); /* Start queueing graphics events. */ /* and set up the context */ QDBeginCGContext(GetWindowPort(w), &focus.ctx); /* Shift the origin to inside the border, and use inverted y axis. */ CGAffineTransform m; m = CGAffineTransformMake(BORDER_WID, 0, 0, -1, BORDER_WID, BORDER_WID+td->bounds.size.height); CGContextConcatCTM (focus.ctx, m); CGContextClipToRect(focus.ctx, td->bounds); CGContextSetShouldAntialias (focus.ctx, antialias); CGContextSetInterpolationQuality(focus.ctx, kCGInterpolationNone); /* Invert the text so it's no longer mirrored in y. */ /* Origin is at still at the bottom of the line, so the ascent must */ /* be subtracted at display-time. (Not added, because the coordinate */ /* system is also flipped.) */ m = CGAffineTransformMake(1, 0, 0, -1, 0, 0); CGContextSetTextMatrix(focus.ctx, m); CFStringRef font_name = CFStringCreateWithCString( kCFAllocatorDefault, td->ginfo->psname, kCFStringEncodingISOLatin1); td->ginfo->fontRef = CGFontCreateWithFontName(font_name); CGContextSetFont(focus.ctx, td->ginfo->fontRef); CGContextSetFontSize(focus.ctx, td->font_size); CFRelease(font_name); if(td->ginfo->monospace) { CGContextSetCharacterSpacing(focus.ctx, td->tile_wid - td->ginfo->font_wid); } else { const ATSUAttributeTag itags[] = { kATSUCGContextTag, kATSUImposeWidthTag }; Fixed advance = (1<<16)*(td->tile_wid - td->font_wid); void *ivals[] = { &focus.ctx, &advance }; const ByteCount isizes[] = {sizeof(focus.ctx), sizeof(advance) }; ATSUSetAttributes(td->ginfo->style, 2, itags, isizes, ivals); } } /* Remember */ focus.active = w; } /* * Temporarily give up control of the Quickdraw port. * Call when the window becomes inactive. * Call when the graphics state changes in any way, to * invalidate the current CGContext and force an update. */ static void hibernate() { if(focus.ctx != 0) QDEndCGContext(GetWindowPort(focus.active), &focus.ctx); focus.ctx = 0; } /* * Display a warning message */ static void mac_warning(const char *warning) { CFStringRef msg; msg = CFStringCreateWithCString(NULL, warning, kCFStringEncodingISOLatin1); DialogRef dlg = 0; CreateStandardAlert(kAlertCautionAlert, msg, CFSTR(""), NULL, &dlg); DialogItemIndex itemIndex; RunStandardAlert(dlg, NULL, &itemIndex); /* DisposeDialog(dlg); // NO! */ CFRelease(msg); } /* * Notice fully up-to-date status of the main window */ static void validate_main_window(void) { WindowRef w; Rect r; /* Get the main window */ w = data[0].w; /* Get its rectangle */ GetPortBounds(GetWindowPort(w), &r); /* Validate it */ ValidWindowRect(w, &r); } /*** Some generic functions ***/ /* * Update color_info with the current values in angband_color_table */ static void update_color_info(void) { focus.color = COLOR_INVALID; focus.color_info[COLOR_BLACK][0] = 0; focus.color_info[COLOR_BLACK][1] = 0; focus.color_info[COLOR_BLACK][2] = 0; /* Update colors */ for (int i = 0; i < 256; i++) { float r = angband_color_table[i][1]; float g = angband_color_table[i][2]; float b = angband_color_table[i][3]; r = r == 255 ? 1 : r / 256; g = g == 255 ? 1 : g / 256; b = b == 255 ? 1 : b / 256; focus.color_info[i][0] = r; focus.color_info[i][1] = g; focus.color_info[i][2] = b; } } /* * Activate a color (0 to 256) * -1 is invalid, 256 is true black. */ inline static void term_data_color(int a) { if(!focus.ctx) activate(focus.active); if( a == COLOR_INVALID) { focus.color = a; } else if (focus.color != a) /* Assumes the window exists. */ { focus.color = a; /* CGContextSetFillColorWithColor(focus.ctx, focus.color_info[a]); */ CGContextSetRGBFillColor(focus.ctx, focus.color_info[a][0], focus.color_info[a][1], focus.color_info[a][2], 1); } } /* * Get font metrics */ static GlyphInfo *get_glyph_info(ATSUFontID fid, float size) { GlyphInfo *info; /* One extra, so a term_data can fetch before it frees. */ for(info = glyph_data; info <= glyph_data+MAX_TERM_DATA; info++) { if(info->font_id == fid && info->font_size == size) { info->refcount++; return info; } } /* One is always available. */ info = glyph_data; for (int c = 0; info->refcount != 0; info++, c++) assert(c <= MAX_TERM_DATA); info->style = 0; info->layout = 0; /* ICK */ info->font_size = size; info->font_id = fid; OSStatus err = ATSUCreateStyle(&info->style); require_noerr(err, CantInitialize); Fixed fsize = (Fixed)(size*(1<<16)); const ByteCount isizes[] = {sizeof(fid), sizeof(fsize) }; void *ivals[] = { &fid, &fsize }; const ATSUAttributeTag itags[] = { kATSUFontTag, kATSUSizeTag }; ATSUSetAttributes(info->style, 2, itags, isizes, ivals); err = ATSUCreateTextLayout(&info->layout); require_noerr(err, CantInitialize); /* Dummy text, required to initialize run style. */ UniChar text[1] = {'@'}; ATSUSetTextPointerLocation(info->layout, text, 0, 1, 1); ATSUSetRunStyle(info->layout, info->style, 0, 1); ByteCount oCount = 0; FontNameCode oCode; err = ATSUGetIndFontName(fid, 6, sizeof(info->psname), info->psname, &oCount, &oCode, 0, 0, 0); require_noerr(err, CantInitialize); if(oCount == 0 || strlen(info->psname) == 0) goto CantInitialize; info->psname[oCount] = 0; /* Is font mono-space? */ err = ATSUCreateTextLayout(&info->layout); require_noerr(err, CantInitialize); ATSUSetRunStyle(info->layout, info->style, 0, 0); info->monospace = true; info->font_wid = 0; info->ascent = 0; info->descent = 0; for(int i = 0; i < 256; i++) { OSStatus err; text[0] = i; Fixed start = 0, stop = 0, ascent = 0, descent = 0; ATSUSetTextPointerLocation(info->layout, text, 0, 1, 1); /* SetRunStyle doesn't honor runs in layouts of size 0. */ if(i == 0) ATSUSetRunStyle(info->layout, info->style, 0, 1); err = ATSUGetUnjustifiedBounds(info->layout, 0, 1, &start, &stop, &ascent, &descent); if(info->ascent < ascent) info->ascent = ascent; if(info->descent < descent) info->descent = descent; if(info->font_wid == 0) info->font_wid = stop - start; else if((info->font_wid != stop - start) && (stop - start != 0)) { info->monospace = false; } if(info->font_wid < stop - start) { info->font_wid = stop - start; } } /* Scale the rough font metrics to screen dimensions. */ /* Assumes 72dpi resolution. */ info->ascent = (info->ascent + (1<<16)-1)>>16; info->descent = (info->descent + (1<<16)-1)>>16; info->font_wid = (info->font_wid)/(1<<16); info->refcount++; return info; CantInitialize: if(info->layout) ATSUDisposeTextLayout(info->layout); if(info->style) ATSUDisposeStyle(info->style); info->style = 0; info->layout = 0; return 0; } static void release_glyph_info(GlyphInfo *info) { if(!info) return; assert(info->refcount > 0); info->refcount--; if(0 == info->refcount) { ATSUDisposeStyle(info->style); info->style = 0; CGFontRelease(info->fontRef); info->fontRef = 0; } } /* * Hack -- Apply and Verify the "font" info * * This should usually be followed by "term_data_check_size()" * * XXX XXX To force (re)initialisation of td->tile_wid and td->tile_hgt * you have to reset them to zero before this function is called. * XXX XXX This is automatic when the program starts because the term_data * array is WIPE'd by term_data_hack, but isn't in the other cases, i.e. * font, font style and size changes. */ static void term_data_check_font(term_data *td) { GlyphInfo *info = get_glyph_info(td->font_id, td->font_size); if(!info) return; release_glyph_info(td->ginfo); td->ginfo = info; td->font_wid = (info->font_wid +.999); td->font_hgt = info->ascent + info->descent; my_strcpy(td->font_name, info->psname, sizeof(td->font_name)); /* Set default tile size */ if (td->tile_wid == 0) td->tile_wid = td->font_wid; if (td->tile_hgt == 0) td->tile_hgt = td->font_hgt; } /* * Hack -- Apply and Verify the "size" info */ static void term_data_check_size(term_data *td) { if (td == &data[0]) { /* Enforce minimal size for the main game window */ if (td->cols < 80) td->cols = 80; if (td->rows < 24) td->rows = 24; } else { /* Information windows can be much smaller */ if (td->cols < 10) td->cols = 10; if (td->rows < 5) td->rows = 5; } /* Enforce maximal sizes */ if (td->cols > 255) td->cols = 255; if (td->rows > 255) td->rows = 255; /* Minimal tile size */ bool dirty = false; if (td->tile_wid < td->font_wid) { td->tile_wid = td->font_wid; dirty = true; } if (td->tile_hgt < td->font_hgt) { td->tile_hgt = td->font_hgt; dirty = true; } if(dirty) graphics_tiles_nuke(); /* Calculate full window size */ td->size_wid = td->cols * td->tile_wid + BORDER_WID * 2; td->size_hgt = td->rows * td->tile_hgt + BORDER_WID; hibernate(); BitMap tScreen; /* Get current screen */ (void)GetQDGlobalsScreenBits(&tScreen); /* Verify the bottom */ if (td->r.top > tScreen.bounds.bottom - td->size_hgt) { td->r.top = tScreen.bounds.bottom - td->size_hgt; } /* Verify the top */ if (td->r.top < tScreen.bounds.top + 2*GetMBarHeight()) { td->r.top = tScreen.bounds.top + 2*GetMBarHeight(); } /* Verify the right */ if (td->r.left > tScreen.bounds.right - td->size_wid) { td->r.left = tScreen.bounds.right - td->size_wid; } /* Verify the left */ if (td->r.left < tScreen.bounds.left) { td->r.left = tScreen.bounds.left; } /* Calculate bottom right corner */ td->r.right = td->r.left + td->size_wid; td->r.bottom = td->r.top + td->size_hgt; td->bounds = (CGRect) {{0, 0}, {td->cols * td->tile_wid, td->rows * td->tile_hgt}}; /* Assume no graphics, monospace */ td->t->higher_pict = FALSE; td->t->always_pict = FALSE; /* Handle graphics */ if (!td->ginfo->monospace) { /* Draw every character */ td->t->always_pict = TRUE; } else if (use_graphics) { /* Use higher pict whenever possible */ td->t->higher_pict = TRUE; } } /* * resize a term_data * * This should normally be followed by "term_data_redraw()" */ static void term_data_resize(term_data *td) { /* Invalidate the current CGContext. */ hibernate(); /* * Actually resize the window * * ResizeWindow is the preferred API call, but it cannot * be used here. */ SizeWindow(td->w, td->size_wid, td->size_hgt, 0); /* Cheat a little -- can't use the active view to redraw its own border. */ CGContextRef tmpCtx; QDBeginCGContext(GetWindowPort(td->w), &tmpCtx); CGContextSetRGBStrokeColor(tmpCtx, 1, 1, 1, 1); CGRect wbounds = {{0, 0}, {td->bounds.size.width+2*BORDER_WID, td->bounds.size.height+BORDER_WID+2}}; CGContextStrokeRect(tmpCtx, wbounds); QDEndCGContext(GetWindowPort(td->w), &tmpCtx); } /* * Hack -- redraw a term_data * * Note that "Term_redraw()" calls "TERM_XTRA_CLEAR" */ static void term_data_redraw(term_data *td) { term *old = Term; /* Activate the term */ Term_activate(td->t); /* Redraw the contents */ Term_redraw(); /* Flush the output */ Term_fresh(); Term_activate(old); } /* * Graphics support */ /* * PICT id / file name of image tiles */ static const char *pict_id = NULL; /* * Frame * Wrapper for CGImages of the current tile set. * */ static struct { /* The reference image at the original scale. */ CGImageRef image; /* Numbers of rows and columns in a tileset, */ int cols; int rows; /* * Tile images. * These are generated once at each tile scaling. Since * there are many unused tiles, and since generating tiles takes * a long time, they are generated only on demand. * The tiles at the current scaling. * Foreground tiles are RGBA * Background tiles are RGB only. * This is detected by DrawTile--background images have the same * tile-id for both foreground and background. * Stride is number of columns. */ CGImageRef *tile_images; } frame = {0}; /* * Rendevous for font update events. */ static struct { WindowRef focus; /* The most recently focused window. (NOT the fontpanel.) */ } fontInfo; /* * Replacement for BitMap (from QD2Qz porting guide) */ void DrawSubimage (CGContextRef context, CGRect dst, CGImageRef image, CGRect src) { /* the default drawing rectangle */ float w = (float) CGImageGetWidth(image); float h = (float) CGImageGetHeight(image); CGRect drawRect = {{0, 0}, {w, h}}; if (!CGRectEqualToRect (src, dst)) { float sx = CGRectGetWidth(dst) / CGRectGetWidth(src); float sy = CGRectGetHeight(dst) / CGRectGetHeight(src); float dx = CGRectGetMinX(dst) - (CGRectGetMinX(src) * sx); float dy = CGRectGetMinY(dst) - (CGRectGetMinY(src) * sy); drawRect = (CGRect) {{dx, dy}, {w*sx, h*sy}}; } CGContextSaveGState (context); CGContextClipToRect (context, dst); /* Don't display images upside down. (Works like SetTextMatrix) */ HIViewDrawCGImage (context, &drawRect, image); /* CGContextDrawImage (context, &drawRect, image); */ CGContextRestoreGState (context); } /* * Copy an image with tiles of size src into a new one with * tiles of size dst. Interpolation will not cross tile borders. */ static CGImageRef GetTileImage(int row, int col, bool has_alpha) { /* Cache hit. */ assert(col < frame.cols && row < frame.rows); if (frame.tile_images[row*frame.cols + col] != 0) { return frame.tile_images[row*frame.cols+col]; } term_data *td = &data[0]; size_t tile_wid = td->tile_wid * tile_width; size_t tile_hgt = td->tile_hgt * tile_height; size_t nbytes = (tile_hgt * tile_wid) * 4; void *data = calloc(1, nbytes); CGContextRef map; map = CGBitmapContextCreate(data, tile_wid, tile_hgt, 8, nbytes / tile_hgt, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast); CGAffineTransform m = {1, 0, 0, -1, 0, tile_hgt}; CGContextConcatCTM(map, m); /* Attempt to avoid interpolation across cell boundaries by clipping. */ /* It may be that we need a clip image first. */ CGRect src_r = {{ graf_width*col, graf_height*row }, { graf_width, graf_height }}; CGRect dst_r = {{ 0, 0 }, { tile_wid, tile_hgt }}; DrawSubimage(map, dst_r, frame.image, src_r); CGDataProviderRef prov; prov = CGDataProviderCreateWithData (NULL, data, nbytes, NULL); CGImageAlphaInfo alphaInfo = kCGImageAlphaPremultipliedLast; size_t pixelBits = 4 * 8; if(!has_alpha) { alphaInfo = kCGImageAlphaNone; pixelBits = 3 * 8; } CGImageRef timg = CGImageCreate(CGBitmapContextGetWidth(map), CGBitmapContextGetHeight(map), CGBitmapContextGetBitsPerComponent(map), CGBitmapContextGetBitsPerPixel(map), CGBitmapContextGetBytesPerRow(map), CGBitmapContextGetColorSpace(map), alphaInfo, prov, NULL, false, kCGRenderingIntentDefault); CGDataProviderRelease(prov); CGContextRelease(map); /* free(data); // Duplicate free? */ frame.tile_images[row*frame.cols+col] = timg; return timg; } static void DrawTile(int x, int y, byte a, wchar_t c, byte ta, wchar_t tc) { term_data *td = (term_data*) Term->data; int tile_wid = td->tile_wid * tile_width; int tile_hgt = td->tile_hgt * tile_height; CGRect dst_r = {{x*td->tile_wid, y*td->tile_hgt}, {tile_wid, tile_hgt}}; CGRect src_r = {{0, 0}, {tile_wid, tile_hgt}}; tc = (tc&0x7f) % frame.cols; ta = (ta&0x7f) % frame.rows; c = (c&0x7f) % frame.cols; a = (a&0x7f) % frame.rows; /* Requires alpha-masked foreground images */ /* Draw terrain. No alpha or rescaling, should just be a bitblt. */ if (!use_transparency) tc = c, ta = a; CGImageRef image = GetTileImage(ta, tc, false); DrawSubimage(focus.ctx, dst_r, image, src_r); /* Draw the foreground, if it is distinct from the background */ /* Use alpha. Rare, so it shouldn't take much time. */ if(use_transparency && (tc != c || ta != a)) { /* This doesn't preserve alpha. Don't know how to fix. */ image = GetTileImage(a, c, true); DrawSubimage(focus.ctx, dst_r, image, src_r); /* Use the original source instead. This is SLOW! */ /*src_r = (CGRect) {{ graf_width*c, graf_height*a }, */ /* { graf_width, graf_height }}; */ /* DrawSubimage(focus.ctx, dst_r, frame.image, src_r); */ } } static void ShowTextAt(int x, int y, int color, int n, const wchar_t *text ) { int i; term_data *td = (term_data*) Term->data; GlyphInfo *info = td->ginfo; /* Overwite the text, unless it's being called recursively. */ if(use_overwrite_hack && color != COLOR_BLACK) { Term_wipe_mac_aux(x, y, n); } /* Cribbed from the SDL port */ wchar_t src[255]; UInt8 text_mb[MB_LEN_MAX * 255]; wcsncpy(src, text, n); src[n] = L'\0'; size_t text_bytes = 0; /* Copied from FAangband - thanks to nck_m! */ for (i = 0; i < n; i++) { if ((src[i] & 0x7f) == src[i]) text_mb[text_bytes++] = (UInt8) src[i]; else if ((src[i] & 0x7ff) == src[i]){ text_mb[text_bytes++] = (UInt8) 0xc0 + (src[i] >> 6); text_mb[text_bytes++] = (UInt8) 0x80 + (src[i] & 0x3f); } else if ((src[i] & 0xffff) == src[i]) { text_mb[text_bytes++] = (UInt8) 0xe0 + (src[i] >> 12); text_mb[text_bytes++] = (UInt8) 0x80 + ((src[i] >> 6) & 0x3f); text_mb[text_bytes++] = (UInt8) 0x80 + (src[i] & 0x3f); } else { text_mb[text_bytes++] = (UInt8) 0xf0 + (src[i] >> 18); text_mb[text_bytes++] = (UInt8) 0x80 + ((src[i] >> 12) & 0x3f); text_mb[text_bytes++] = (UInt8) 0x80 + ((src[i] >> 6) & 0x3f); text_mb[text_bytes++] = (UInt8) 0x80 + (src[i] & 0x3f); } } text_mb[text_bytes] = '\0'; CFStringRef text_str = CFStringCreateWithBytes( kCFAllocatorDefault, text_mb, text_bytes, kCFStringEncodingUTF8, false); assert(text_str != NULL); CTFontRef font = CTFontCreateWithGraphicsFont( info->fontRef, (CGFloat)td->font_size, NULL, NULL); assert(font != NULL); UniChar *characters = (UniChar *)mem_alloc(n * sizeof(UniChar)); CGGlyph *glyphs = (CGGlyph *)mem_alloc(n * sizeof(CGGlyph)); assert(characters != NULL); assert(glyphs != NULL); CFStringGetCharacters(text_str, CFRangeMake(0, n), characters); CTFontGetGlyphsForCharacters(font, characters, glyphs, n); int xp = x * td->tile_wid - td->spacing / 2; /* Only round once. */ int yp = y * td->tile_hgt + info->ascent + (td->tile_hgt - td->font_hgt)/2; CGRect r; if(use_graphics || !use_overwrite_hack) { r = (CGRect) { {x*td->tile_wid, y*td->tile_hgt}, {n*td->tile_wid, td->tile_hgt} }; switch (color / MAX_COLORS) { case BG_BLACK: term_data_color(COLOR_BLACK); break; case BG_SAME: term_data_color(color % MAX_COLORS); break; case BG_DARK: term_data_color(TERM_SHADE); break; } CGContextFillRect(focus.ctx, r); } if(use_clip_hack) { CGContextSaveGState (focus.ctx); CGContextClipToRect(focus.ctx, r); } term_data_color(color % MAX_COLORS); /* Monospace; use preset text spacing when tiling is wider than text */ if(n == 1 || info->monospace) { CGContextShowGlyphsAtPoint(focus.ctx, (CGFloat)xp, (CGFloat)yp, glyphs, n); mem_free(characters); mem_free(glyphs); CFRelease(text_str); CFRelease(font); if(use_clip_hack) CGContextRestoreGState(focus.ctx); return; } UniChar utext[n]; for(int i = 0; i < n; i++) utext[i] = text[i]; ATSUSetTextPointerLocation(info->layout, utext, 0, n, n); ATSUSetRunStyle(info->layout, info->style, 0, n); ATSUDrawText(info->layout, 0, n, xp*(1<<16), yp*(1<<16)); mem_free(characters); mem_free(glyphs); CFRelease(text_str); CFRelease(font); if(use_clip_hack) CGContextRestoreGState (focus.ctx); return; } /* * Init the graphics "frame" */ static errr graphics_init(void) { OSErr err; /* Get the tile resources */ char path[1024]; locate_lib(path, sizeof(path)); char *tail = path + strlen(path); FSSpec pict_spec; snprintf(tail, path+1024-tail, "xtra/graf/%s", pict_id); if(noErr != path_to_spec(path, &pict_spec)) return -1; /* Attempt to create a CGImage from FSSpec using Quicktime importer */ GraphicsImportComponent gi; if( (err = GetGraphicsImporterForFile(&pict_spec, &gi)) ) return err; Rect r; /* Retrieve the rect of the image */ err = GraphicsImportGetNaturalBounds(gi, &r); /* Calculate and set numbers of rows and columns */ frame.rows = (r.bottom-r.top) / graf_height; frame.cols = (r.right-r.left) / graf_width; frame.tile_images = calloc(frame.rows*frame.cols, sizeof(CGImageRef)); if(!frame.tile_images) { return -1; /* E_NO_MEM */ } CGImageRef tile_img; err = GraphicsImportCreateCGImage (gi, &tile_img, 0); CloseComponent(gi); if (err != noErr) { free(frame.tile_images); frame.tile_images = 0; return (err); } frame.image = tile_img; /* Success */ return (noErr); } static void graphics_tiles_nuke(void) { if(frame.tile_images) { for(int i = frame.rows*frame.cols; --i >= 0; ) { if(frame.tile_images[i]) CGImageRelease(frame.tile_images[i]); frame.tile_images[i] = 0; } } } /* * Nuke the graphics "frame" and contents. */ static errr graphics_nuke(void) { /* Dispose image */ if (frame.image) { /* Dispose of the tile image */ CGImageRelease(frame.image); frame.image = NULL; } if(frame.tile_images) { graphics_tiles_nuke(); free(frame.tile_images); frame.tile_images = 0; } /* Flush events */ if (initialized) FlushEventQueue(GetMainEventQueue()); /* Success */ return (0); } /* Arbitary limit on number of possible samples per event */ #define MAX_SAMPLES 16 /* Struct representing all data for a set of event samples */ typedef struct { int num; /* Number of available samples for this event */ NSSound *sound[MAX_SAMPLES]; } sound_sample_list; /* Array of event sound structs */ static sound_sample_list samples[MSG_MAX]; /* * Load sound effects based on sound.cfg within the xtra/sound directory; * bridge to Cocoa to use NSSound for simple loading and playback, avoiding * I/O latency by cacheing all sounds at the start. Inherits full sound * format support from Quicktime base/plugins. * pelpel favoured a plist-based parser for the future but .cfg support * improves cross-platform compatibility. */ static void load_sounds(void) { char path[2048]; char buffer[2048]; ang_file *fff; /* Build the "sound" path */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "sound"); ANGBAND_DIR_XTRA_SOUND = string_make(path); /* Find and open the config file */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_SOUND, "sound.cfg"); fff = file_open(path, MODE_READ, -1); /* Handle errors */ if (!fff) { mac_warning("The sound configuration file could not be opened."); return; } /* Instantiate an autorelease pool for use by NSSound */ NSAutoreleasePool *autorelease_pool; autorelease_pool = [[NSAutoreleasePool alloc] init]; /* * This loop may take a while depending on the count and size of samples * to load. */ /* Parse the file */ /* Lines are always of the form "name = sample [sample ...]" */ while (file_getl(fff, buffer, sizeof(buffer))) { char *msg_name; char *cfg_sample_list; char *search; char *cur_token; char *next_token; int event; /* Skip anything not beginning with an alphabetic character */ if (!buffer[0] || !isalpha((unsigned char)buffer[0])) continue; /* Split the line into two: message name, and the rest */ search = strchr(buffer, ' '); cfg_sample_list = strchr(search + 1, ' '); if (!search) continue; if (!cfg_sample_list) continue; /* Set the message name, and terminate at first space */ msg_name = buffer; search[0] = '\0'; /* Make sure this is a valid event name */ event = message_lookup_by_sound_name(msg_name); if (event < 0) continue; /* Advance the sample list pointer so it's at the beginning of text */ cfg_sample_list++; if (!cfg_sample_list[0]) continue; /* Terminate the current token */ cur_token = cfg_sample_list; search = strchr(cur_token, ' '); if (search) { search[0] = '\0'; next_token = search + 1; } else { next_token = NULL; } /* * Now we find all the sample names and add them one by one */ while (cur_token) { int num = samples[event].num; /* Don't allow too many samples */ if (num >= MAX_SAMPLES) break; /* Build the path to the sample */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_SOUND, cur_token); if (file_exists(path)) { /* Load the sound into memory */ samples[event].sound[num] = [[NSSound alloc] initWithContentsOfFile:[NSString stringWithUTF8String:path] byReference:NO]; if (samples[event].sound[num] != nil) { /* Imcrement the sample count */ samples[event].num++; } } /* Figure out next token */ cur_token = next_token; if (next_token) { /* Try to find a space */ search = strchr(cur_token, ' '); /* If we can find one, terminate, and set new "next" */ if (search) { search[0] = '\0'; next_token = search + 1; } else { /* Otherwise prevent infinite looping */ next_token = NULL; } } } } /* Release the autorelease pool */ [autorelease_pool release]; /* Close the file */ file_close(fff); /* Register the sound hook */ sound_hook = play_sound; } /* * Play sound effects asynchronously. Select a sound from any available * for the required event, and bridge to Cocoa to play it. */ static void play_sound(int event) { /* Paranoia */ if (event < 0 || event >= MSG_MAX) return; /* Check there are samples for this event */ if (!samples[event].num) return; /* Instantiate an autorelease pool for use by NSSound */ NSAutoreleasePool *autorelease_pool; autorelease_pool = [[NSAutoreleasePool alloc] init]; /* Choose a random event */ int s = randint0(samples[event].num); /* Stop the sound if it's currently playing */ if ([samples[event].sound[s] isPlaying]) [samples[event].sound[s] stop]; /* Play the sound */ [samples[event].sound[s] play]; /* Release the autorelease pool */ [autorelease_pool release]; } /*** Support for the "z-term.c" package ***/ /* * Initialize a new Term * * Note also the "window type" called "noGrowDocProc", which might be more * appropriate for the main "screen" window. * * Note the use of "srcCopy" mode for optimized screen writes. */ static void Term_init_mac(term *t) { term_data *td = (term_data*)(t->data); WindowAttributes wattrs; OSStatus err; wattrs = kWindowCloseBoxAttribute | kWindowCollapseBoxAttribute | kWindowResizableAttribute; /* Make the window */ err = CreateNewWindow( kDocumentWindowClass, wattrs, &td->r, &td->w); Rect tmpR; GetWindowBounds((WindowRef)td->w, kWindowTitleBarRgn, &tmpR); int trueTop = td->r.top - (tmpR.bottom-tmpR.top); /* Enforce a minimum y position to avoid windows positioned vertically off screen */ if (trueTop < GetMBarHeight()) trueTop = GetMBarHeight(); MoveWindowStructure((WindowRef)td->w, td->r.left, trueTop); install_handlers(td->w); /* Fatal error */ if (err != noErr) ExitToShell(); /* Set refcon */ SetWRefCon(td->w, (long)td); /* Set window title */ SetWindowTitleWithCFString(td->w, CFStringCreateWithCString(NULL, td->title, kTextEncodingUS_ASCII)); InstallStandardEventHandler(GetWindowEventTarget(td->w)); /* Apply and Verify */ term_data_check_font(td); term_data_check_size(td); term_data_resize(td); /* assert(td->mapped) */ if (td->mapped) { WindowRef old_win = focus.active; ShowWindow(td->w); activate(td->w); term_data_color(COLOR_BLACK); CGContextFillRect(focus.ctx, td->bounds); activate(old_win); } /* Hack -- set "mapped" flag */ t->mapped_flag = td->mapped; } /* * Nuke an old Term */ static void Term_nuke_mac(term *t) { #pragma unused(t) } /* * React to changes */ static errr Term_xtra_mac_react(void) { /* Update colors */ update_color_info(); /* Success */ return (0); } /* * Do a "special thing" */ static errr Term_xtra_mac(int n, int v) { term_data *td = (term_data*)(Term->data); /* Analyze */ switch (n) { /* Make a noise */ case TERM_XTRA_NOISE: { /* Make a noise */ SysBeep(1); /* Success */ return (0); } /* Process random events */ case TERM_XTRA_BORED: { return (0); } /* Process pending events */ case TERM_XTRA_EVENT: { /* Process an event */ (void)CheckEvents(v); /* Success */ return (0); } /* Flush all pending input events (if any) */ case TERM_XTRA_FLUSH: { FlushEventsMatchingListFromQueue(GetMainEventQueue(), N_ELEMENTS(input_event_types), input_event_types); /* Success */ return (0); } /* Hack -- Change the "soft level" */ case TERM_XTRA_LEVEL: { /* Activate if requested */ if (v) activate(td->w); /* Success */ return (0); } /* Clear the screen */ case TERM_XTRA_CLEAR: { if(!focus.ctx) activate(td->w); term_data_color(COLOR_BLACK); CGContextFillRect(focus.ctx, td->bounds); CGContextSynchronize(focus.ctx); return (0); } /* React to changes */ case TERM_XTRA_REACT: { /* React to changes */ return (Term_xtra_mac_react()); } /* Delay (milliseconds) */ case TERM_XTRA_DELAY: { /* * WaitNextEvent relinquishes CPU as well as * induces a screen refresh on OS X */ /* If needed */ if (v > 0) { EventRecord tmp; UInt32 ticks; /* Convert millisecs to ticks */ ticks = (v * 60L) / 1000; /* * Hack? - Put the programme into sleep. * No events match ~everyEvent, so nothing * should be lost in Angband's event queue. * Even if ticks are 0, it's worth calling for * the above mentioned reasons. */ WaitNextEvent((EventMask)~everyEvent, &tmp, ticks, nil); } /* Success */ return (0); } case TERM_XTRA_FRESH: { assert(focus.active == td->w); if(focus.ctx) CGContextSynchronize(focus.ctx); return (0); } } /* Oops */ return (1); } /* * Low level graphics (Assumes valid input). * Draw a "cursor" at (x,y), using a "yellow box". * We are allowed to use "Term_what()" to determine * the current screen contents (for inverting, etc). */ static errr Term_curs_mac(int x, int y) { term_data *td = Term->data; if (!focus.active) activate(focus.active); CGContextSaveGState(focus.ctx); /* Temporarily set stroke color to yellow */ wchar_t c; byte a = TERM_YELLOW; CGContextSetRGBStrokeColor(focus.ctx, focus.color_info[a][0], focus.color_info[a][1], focus.color_info[a][2], 1); /* Frame the grid, staying within the boundary. */ int tile_wid = td->tile_wid; int tile_hgt = td->tile_hgt; if (tile_width != 1) { Term_what(x + 1, y, &a, &c); if (c == (wchar_t) 0xff) tile_wid *= tile_width; } if (tile_height != 1) { Term_what(x, y + 1, &a, &c); if (c == (wchar_t) 0xff) tile_hgt *= tile_height; } CGRect r = { { x * td->tile_wid + .5, y * td->tile_hgt + .5 }, { tile_wid - 1, tile_hgt - 1 } }; CGContextStrokeRectWithWidth(focus.ctx, r, 1.0); CGContextRestoreGState(focus.ctx); /* Success */ return (0); } /* * Low level graphics helper (Assumes valid input) * * Based on suggestion by Julian Lighton * * Overwrite "n" old characters starting at (x,y) * with the same ones in the background colour */ static void Term_wipe_mac_aux(int x, int y, int n) { /* Use old screen image kept inside the term package */ const wchar_t *cp = &(Term->old->c[y][x]); /* And write it in the background color */ ShowTextAt(x, y, COLOR_BLACK, n, cp); } /* * Low level graphics (Assumes valid input) * * Erase "n" characters starting at (x,y) */ static errr Term_wipe_mac(int x, int y, int n) { /* * Hack - overstrike the leftmost character with * the background colour. This doesn't interfere with * the graphics modes, because they set always_pict. */ if (use_overwrite_hack) Term_wipe_mac_aux(x, y, n); term_data_color(COLOR_BLACK); term_data *td = Term->data; assert(td); CGRect r = { { x * td->tile_wid, y * td->tile_hgt }, { n * td->tile_wid, -td->tile_hgt } }; CGContextFillRect(focus.ctx, r); /* Success */ return (0); } /* * Low level graphics. Assumes valid input. * * Draw several ("n") chars, with an attr, at a given location. */ static errr Term_text_mac(int x, int y, int n, int a, const wchar_t *cp) { if(!focus.ctx) activate(focus.active); /* Draw the string */ ShowTextAt(x, y, a, n, cp); /* Success */ return (0); } static errr Term_pict_mac(int x, int y, int n, const byte *ap, const wchar_t *cp, const byte *tap, const wchar_t *tcp) { if(!focus.ctx) activate(focus.active); /* Scan the input */ for (int i = 0; i < n; i++) { byte a = *ap++; wchar_t c = *cp++; byte ta = *tap++; wchar_t tc = *tcp++; /* Hack -- a filler for tiles */ if (a == 255 && (tile_height != 1 || tile_width != 1)) continue; /* TODO: background should be overridden with neutral color */ /* if unavailable. */ /* Graphics -- if Available and Needed */ if (use_graphics && (a & 0x80) && (c & 0x80)) { DrawTile(x+i, y, a, c, ta, tc); } /* * Deal with these cases: * (1) the player changed tile width / height, or * (2) fake fixed-width for proportional font */ else { ShowTextAt(x+i, y, a, 1, &c); } } /* Success */ return (0); } /* From the Linux mbstowcs(3) man page: * If dest is NULL, n is ignored, and the conversion proceeds as above, * except that the converted wide characters are not written out to mem†* ory, and that no length limit exists. */ static size_t Term_mbcs_mac(wchar_t *dest, const char *src, int n) { int i; int count = 0; /* Unicode code point to UTF-8 * 0x0000-0x007f: 0xxxxxxx * 0x0080-0x07ff: 110xxxxx 10xxxxxx * 0x0800-0xffff: 1110xxxx 10xxxxxx 10xxxxxx * 0x10000-0x1fffff: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx * Note that UTF-16 limits Unicode to 0x10ffff. This code is not * endian-agnostic. */ for (i = 0; i < n || dest == NULL; i++) { if ((src[i] & 0x80) == 0) { if (dest != NULL) dest[count] = src[i]; if (src[i] == 0) break; } else if ((src[i] & 0xe0) == 0xc0) { if (dest != NULL) dest[count] = (((unsigned char)src[i] & 0x1f) << 6)| ((unsigned char)src[i+1] & 0x3f); i++; } else if ((src[i] & 0xf0) == 0xe0) { if (dest != NULL) dest[count] = (((unsigned char)src[i] & 0x0f) << 12) | (((unsigned char)src[i+1] & 0x3f) << 6) | ((unsigned char)src[i+2] & 0x3f); i += 2; } else if ((src[i] & 0xf8) == 0xf0) { if (dest != NULL) dest[count] = (((unsigned char)src[i] & 0x0f) << 18) | (((unsigned char)src[i+1] & 0x3f) << 12) | (((unsigned char)src[i+2] & 0x3f) << 6) | ((unsigned char)src[i+3] & 0x3f); i += 3; } else { /* Found an invalid multibyte sequence */ return (size_t)-1; } count++; } return count; } /* * Create and initialize window number "i" */ static void term_data_link(int i) { term *old = Term; term_data *td = &data[i]; /* Only once */ if (td->t) return; /* Require mapped */ if (!td->mapped) return; /* Allocate */ td->t = ZNEW(term); /* Initialize the term */ term_init(td->t, td->cols, td->rows, td == &data[0] ? 100 : 1); /* Use a "software" cursor */ td->t->soft_cursor = TRUE; /* Differentiate between BS/^h, Tab/^i, etc. */ td->t->complex_input = TRUE; /* * We have an "icky" lower right corner, since * the window resize control is placed there */ td->t->icky_corner = TRUE; /* Erase with "white space" */ td->t->attr_blank = TERM_WHITE; td->t->char_blank = ' '; /* Prepare the init/nuke hooks */ td->t->init_hook = Term_init_mac; td->t->nuke_hook = Term_nuke_mac; /* Prepare the function hooks */ td->t->xtra_hook = Term_xtra_mac; td->t->wipe_hook = Term_wipe_mac; td->t->curs_hook = Term_curs_mac; td->t->bigcurs_hook = Term_curs_mac; td->t->text_hook = Term_text_mac; td->t->pict_hook = Term_pict_mac; td->t->mbcs_hook = Term_mbcs_mac; td->t->never_bored = TRUE; td->t->never_frosh = TRUE; /* Link the local structure */ td->t->data = (void *)(td); /* Activate it */ Term_activate(td->t); /* Global pointer */ angband_term[i] = td->t; /* Activate old */ Term_activate(old); } /* * (Carbon, Bundle) * Return a POSIX pathname of the lib directory, or NULL if it can't be * located. Caller must supply a buffer along with its size in bytes, * where returned pathname will be stored. */ static char *locate_lib(char *buf, size_t size) { CFURLRef main_url; bool success; /* Obtain the URL of the main bundle */ main_url = CFBundleCopyBundleURL(CFBundleGetMainBundle()); /* Oops */ if (!main_url) return (NULL); /* Get the URL in the file system's native string representation */ success = CFURLGetFileSystemRepresentation(main_url, TRUE, (byte*)buf, size); /* Free the url */ CFRelease(main_url); /* Oops */ if (!success) return (NULL); /* Append "/Contents/Resources/lib/" */ my_strcat(buf, "/Contents/Resources/lib/", size); return (buf); } /* * Using Core Foundation's Preferences services -- pelpel * * Requires OS 8.6 or greater with CarbonLib 1.1 or greater. Or OS X, * of course. * * Without this, we can support older versions of OS 8 as well * (with CarbonLib 1.0.4). * * Frequent allocation/deallocation of small chunks of data is * far from my liking, but since this is only called at the * beginning and the end of a session, I hope this hardly matters. */ /* * Store "value" as the value for preferences item name * pointed by key */ static void save_preference(const char *key, type_union value) { CFStringRef cf_key; CFPropertyListRef cf_value = 0; /* allocate and initialise the key */ cf_key = CFStringCreateWithCString(NULL, key, kTextEncodingUS_ASCII); /* allocate and initialise the value */ if(value.t == T_INT) cf_value = CFNumberCreate(NULL, kCFNumberIntType, &value.u.i); else if(value.t == T_STRING) cf_value = CFStringCreateWithCString(NULL, value.u.s, kTextEncodingUS_ASCII); else quit(format("Unrecognized save type %d\n", value.t)); if ((cf_key != NULL) && (cf_value != NULL)) { /* Store the key-value pair in the applications preferences */ CFPreferencesSetAppValue( cf_key, cf_value, kCFPreferencesCurrentApplication); } /* * Free CF data - the reverse order is a vain attempt to * minimise memory fragmentation. */ if (cf_value) CFRelease(cf_value); if (cf_key) CFRelease(cf_key); } /* * Load preference value for key, returns TRUE if it succeeds with * vptr updated appropriately, FALSE otherwise. */ static bool load_preference(const char *key, type_union *vptr, size_t maxlen ) { CFStringRef cf_key; CFPropertyListRef cf_value; /* allocate and initialise the key */ cf_key = CFStringCreateWithCString(NULL, key, kTextEncodingUS_ASCII); /* Oops */ if (cf_key == NULL) return (FALSE); /* Retrieve value for the key */ cf_value = CFPreferencesCopyAppValue( cf_key, kCFPreferencesCurrentApplication); /* Value not found */ if (cf_value == NULL) { CFRelease(cf_key); return (FALSE); } /* Convert the value to appropriate type */ if(vptr->t == T_INT) CFNumberGetValue( cf_value, kCFNumberIntType, &vptr->u.i); else if(vptr->t == T_STRING) { CFRange range = { 0, 200}; (void) CFStringGetBytes (cf_value, range, kCFStringEncodingISOLatin1, 0, 0, (UInt8*)vptr->u.s, maxlen, 0); } /* Free CF data */ CFRelease(cf_value); CFRelease(cf_key); /* Success */ return (TRUE); } /* Convenience wrappers for commonly used type short */ static void save_pref_short(const char *key, short value) { type_union u = i2u(value); save_preference(key, u); } static bool load_pref_short(const char *key, short *vptr) { bool ret; type_union u = { T_INT }; ret = load_preference(key, &u, 0); if( ret == TRUE ) *vptr = u.u.i; return ret; } static void save_pref_ushort(const char *key, unsigned short value) { type_union u = i2u((int)value); save_preference(key, u); } static bool load_pref_ushort(const char *key, unsigned short *vptr) { bool ret; type_union u = { T_INT }; ret = load_preference(key, &u, 0); if( ret == TRUE ) *vptr = (unsigned short)u.u.i; return ret; } /* XXX Version number for pref file */ #define VERSION_MAJOR 3 #define VERSION_MINOR 0 #define VERSION_PATCH 14 #define VERSION_EXTRA 0 /* * Save preferences to preferences file for current host+current user+ * current application. */ static void cf_save_prefs() { /* Version stamp */ save_pref_short("version.major", VERSION_MAJOR); save_pref_short("version.minor", VERSION_MINOR); save_pref_short("version.patch", VERSION_PATCH); save_pref_short("version.extra", VERSION_EXTRA); /* Gfx settings */ /* tile width/height */ save_pref_ushort("arg.tile_wid", tile_width); save_pref_ushort("arg.tile_hgt", tile_height); /* graphics mode */ save_pref_ushort("graf_mode", graf_mode); /* text antialiasing */ save_pref_ushort("arg.use_antialiasing", antialias); /* Windows */ for (int i = 0; i < MAX_TERM_DATA; i++) { term_data *td = &data[i]; save_pref_short(format("term%d.mapped", i), td->mapped); save_pref_ushort(format("term%d.tile_wid", i), td->tile_wid); save_pref_ushort(format("term%d.tile_hgt", i), td->tile_hgt); save_pref_short(format("term%d.cols", i), td->cols); save_pref_short(format("term%d.rows", i), td->rows); save_pref_short(format("term%d.left", i), td->r.left); save_pref_short(format("term%d.top", i), td->r.top); /* Integer font sizes only */ save_preference(format("term%d.font_size", i), i2u((int)td->font_size)); save_preference(format("term%d.font_name", i), s2u(td->font_name)); } /* * Save the recent items array - directly. */ CFPreferencesSetAppValue( CFSTR("recent_items"), recentItemsArrayRef, kCFPreferencesCurrentApplication); /* * Make sure preferences are persistent */ CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication); } /* * Load preferences from preferences file for current host+current user+ * current application. */ static void cf_load_prefs() { short pref_major, pref_minor, pref_patch, pref_extra; short valid; /* Assume nothing is wrong, yet */ bool ok = TRUE; /* Load version information */ ok &= load_pref_short("version.major", &pref_major); ok &= load_pref_short("version.minor", &pref_minor); ok &= load_pref_short("version.patch", &pref_patch); ok &= load_pref_short("version.extra", &pref_extra); /* Any of the above failed */ if (!ok) { #if 0 /* This may be the first run */ mac_warning("Preferences are not found."); #endif /* 0 */ /* Ignore the rest */ return; } /* Check version */ if ((pref_major != VERSION_MAJOR) || (pref_minor != VERSION_MINOR) || (pref_patch != VERSION_PATCH) || (pref_extra != VERSION_EXTRA)) { /* Version 3.0.8 rewrote the preference file format - don't attempt to load previous versions. */ if ((pref_major < 3) || ((pref_major == 3) && (pref_minor == 0) && (pref_patch < 8))) { /* Message */ mac_warning( format("Ignoring %d.%d.%d.%d preferences.", pref_major, pref_minor, pref_patch, pref_extra)); /* Ignore */ return; } else { FSRef fsRef; char prefpath[1024]; CFStringRef bundleid = (CFStringRef)CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), kCFBundleIdentifierKey); CFIndex bufferlength = CFStringGetMaximumSizeForEncoding(CFStringGetLength(bundleid), kCFStringEncodingASCII) + 1; char bundlename[bufferlength]; CFStringGetCString(bundleid, bundlename, bufferlength, kCFStringEncodingASCII); FSFindFolder(kOnAppropriateDisk, kPreferencesFolderType, kDontCreateFolder, &fsRef); FSRefMakePath(&fsRef, (UInt8 *)prefpath, 1024); mac_warning(format("Preference file has changed. If you have display problems, delete %s/%s.plist and restart.", prefpath, bundlename)); CFRelease(bundleid); } } /* HACK - Check for broken preferences */ load_pref_short("term0.mapped", &valid); /* Ignore broken preferences */ if (!valid) { /* mac_warning("Ignoring broken preferences."); */ /* Ignore */ return; } /* Gfx settings */ unsigned short pref_tmp; if (load_pref_ushort("arg.tile_wid", &pref_tmp)) tile_width = pref_tmp; if (load_pref_ushort("arg.tile_hgt", &pref_tmp)) tile_height = pref_tmp; /* anti-aliasing */ if(load_pref_ushort("arg.use_antialiasing", &pref_tmp)) antialias = pref_tmp; if(load_pref_ushort("graf_mode", &pref_tmp)) graf_mode = pref_tmp; /* Windows */ for (int i = 0; i < MAX_TERM_DATA; i++) { term_data *td = &data[i]; load_pref_short(format("term%d.mapped", i), &td->mapped); CheckMenuItem(MyGetMenuHandle(kWindowMenu), kAngbandTerm+i, td->mapped); load_pref_ushort(format("term%d.tile_wid", i), &td->tile_wid); load_pref_ushort(format("term%d.tile_hgt", i), &td->tile_hgt); load_pref_short(format("term%d.cols", i), &td->cols); load_pref_short(format("term%d.rows", i), &td->rows); load_pref_short(format("term%d.left", i), &td->r.left); load_pref_short(format("term%d.top", i), &td->r.top); type_union u = {T_INT}; if(load_preference(format("term%d.font_size", i), &u, sizeof(int))) td->font_size = (float) u.u.i; u = s2u(td->font_name); if(load_preference(format("term%d.font_name", i), &u, sizeof(td->font_name))) { ATSUFontID fid = 0; ATSUFindFontFromName(td->font_name, strlen(td->font_name), kFontPostscriptName, kFontMacintoshPlatform, kFontNoScriptCode, kFontNoLanguageCode, &fid); if(fid) td->font_id = fid; /* Use the default */ else my_strcpy(td->font_name, "Menlo-Regular", sizeof(td->font_name)); } } /* * Load the recent items array, if present, directly */ CFArrayRef recentItemsLoaded = (CFArrayRef)CFPreferencesCopyAppValue( CFSTR("recent_items"), kCFPreferencesCurrentApplication); if (recentItemsLoaded != NULL) { CFRelease(recentItemsArrayRef); recentItemsArrayRef = CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, recentItemsLoaded); CFRelease(recentItemsLoaded); redrawRecentItemsMenu(); } } /* * Hack -- default data for a window */ static void term_data_hack(term_data *td) { /* Default to Menlo font */ ATSUFontID fid = 0; ATSUFindFontFromName("Menlo-Regular", strlen("Menlo-Regular"), kFontPostscriptName, kFontMacintoshPlatform, kFontNoScriptCode, kFontNoLanguageCode, &fid); if(!fid) quit("Failed to find font 'Menlo'"); /* Wipe it */ WIPE(td, term_data); /* Start hidden */ td->mapped = FALSE; /* Default font */ td->font_id = fid; my_strcpy(td->font_name, "Menlo-Regular", sizeof(td->font_name)); /* Default font size - was 12 */ td->font_size = 14; /* Default size */ td->rows = 24; td->cols = 80; /* Default position */ td->r.left = 10; td->r.top = 40; } /* * Read the preference file, Create the windows. * * We attempt to use "FindFolder()" to track down the preference file. */ static void init_windows(void) { term_data *td; /*** Default values ***/ /* Initialize (backwards) */ for (int b = 0, i = MAX_TERM_DATA; i-- > 0; ) { /* Obtain */ td = &data[i]; /* Defaults */ term_data_hack(td); /* Copy the title */ my_strcpy((char *)(td->title), angband_term_name[i], sizeof(td->title)); /* Tile the windows */ td->r.left += (b * 30); td->r.top += (b * 30); /* Tile */ b++; } /*** Load preferences ***/ cf_load_prefs(); /*** Instantiate ***/ /* Main window */ td = &data[0]; /* Start visible */ td->mapped = TRUE; /* Link (backwards, for stacking order) */ for (int i = MAX_TERM_DATA; i-- > 0; ) { term_data_link(i); } /* Main window */ td = &data[0]; /* Main window */ Term_activate(td->t); } /* Set up the contents of the about dialog */ static void init_aboutdialogcontent() { HIViewRef aboutDialogViewRef; OSStatus err; /* Set the application name from the constants set in defines.h */ char *applicationName = format("%s", buildid); CFStringRef cfstr_applicationName = CFStringCreateWithBytes(NULL, (byte *)applicationName, strlen(applicationName), kCFStringEncodingASCII, false); HIViewFindByID(HIViewGetRoot(aboutDialog), aboutDialogName, &aboutDialogViewRef); SetControlData(aboutDialogViewRef, kControlEntireControl, kControlStaticTextCFStringTag, sizeof(cfstr_applicationName), &cfstr_applicationName); CFRelease(cfstr_applicationName); /* Set the application copyright as set up in variable.c */ HIViewFindByID(HIViewGetRoot(aboutDialog), aboutDialogCopyright, &aboutDialogViewRef); CFStringRef cfstr_applicationCopyright = CFStringCreateWithBytes(NULL, (byte *)copyright, strlen(copyright), kCFStringEncodingASCII, false); SetControlData(aboutDialogViewRef, kControlEntireControl, kControlStaticTextCFStringTag, sizeof(cfstr_applicationCopyright), &cfstr_applicationCopyright); CFRelease(cfstr_applicationCopyright); /* Use a small font for the copyright text */ TXNObject txnObject = HITextViewGetTXNObject(aboutDialogViewRef); TXNTypeAttributes typeAttr[1]; typeAttr[0].tag = kTXNQDFontSizeAttribute; typeAttr[0].size = kTXNFontSizeAttributeSize; typeAttr[0].data.dataValue = FloatToFixed(10); err = TXNSetTypeAttributes(txnObject, 1, typeAttr, kTXNStartOffset, kTXNEndOffset); /* Get the application icon and draw it */ ProcessSerialNumber psn = { 0, kCurrentProcess }; ControlRef iconControl; FSRef ref; FSSpec appSpec; IconRef iconRef; ControlButtonContentInfo cInfo; err = GetProcessBundleLocation(&psn, &ref); if(err == noErr) err = FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, NULL, &appSpec, NULL); if( err == noErr ) err = GetIconRefFromFile((const FSSpec *)&appSpec, &iconRef, nil); if(err == noErr) err = GetControlByID(aboutDialog, &aboutDialogIcon, &iconControl); if( err == noErr ) { cInfo.contentType = kControlContentIconRef; cInfo.u.iconRef = iconRef; err = SetControlData(iconControl, 0, kControlIconContentTag, sizeof(cInfo), (Ptr)&cInfo); } } /* * Save preferences */ static void save_pref_file(void) { cf_save_prefs(); } /* * Prepare savefile dialogue and set the variable * savefile accordingly. Returns true if it succeeds, false (or * aborts) otherwise. If all is false, only allow files whose type * is 'SAVE'. * Originally written by Peter Ammon */ static bool select_savefile(bool all) { OSErr err; FSSpec theFolderSpec; FSSpec savedGameSpec; NavDialogOptions dialogOptions; NavReplyRecord reply; /* Used only when 'all' is true */ NavTypeList types = {'A271', 1, 1, {'SAVE'}}; NavTypeListHandle myTypeList; AEDesc defaultLocation; /* Look for the "Angband/save/" sub-folder */ char path[1024]; path_build(path, sizeof(path), ANGBAND_DIR_USER, "save"); err = path_to_spec(path, &theFolderSpec); if (err != noErr) quit_fmt("Unable to find the savefile folder! (Error %d)", err); /* Get default Navigator dialog options */ err = NavGetDefaultDialogOptions(&dialogOptions); /* Clear preview option */ dialogOptions.dialogOptionFlags &= ~kNavAllowPreviews; /* Disable multiple file selection */ dialogOptions.dialogOptionFlags &= ~kNavAllowMultipleFiles; /* Make descriptor for default location */ err = AECreateDesc(typeFSS, &theFolderSpec, sizeof(FSSpec), &defaultLocation); /* Oops */ if (err != noErr) quit("Unable to allocate descriptor"); /* We are indifferent to signature and file types */ if (all) { myTypeList = (NavTypeListHandle)nil; } /* Set up type handle */ else { err = PtrToHand(&types, (Handle *)&myTypeList, sizeof(NavTypeList)); /* Oops */ if (err != noErr) quit("Error in PtrToHand. Try enlarging heap"); } /* Call NavGetFile() with the types list */ err = NavChooseFile(&defaultLocation, &reply, &dialogOptions, NULL, NULL, NULL, myTypeList, NULL); /* Free type list */ if (!all) DisposeHandle((Handle)myTypeList); /* Error */ if (err != noErr) { /* Nothing */ } /* Invalid response -- allow the user to cancel */ else if (!reply.validRecord) { /* Hack -- Fake error */ err = -1; } /* Retrieve FSSpec from the reply */ else { AEKeyword theKeyword; DescType actualType; Size actualSize; /* Get a pointer to selected file */ (void)AEGetNthPtr(&reply.selection, 1, typeFSS, &theKeyword, &actualType, &savedGameSpec, sizeof(FSSpec), &actualSize); /* Dispose NavReplyRecord, resources and descriptors */ (void)NavDisposeReply(&reply); } /* Dispose location info */ AEDisposeDesc(&defaultLocation); /* Error */ if (err != noErr) return (FALSE); /* Convert FSSpec to pathname and store it in variable savefile */ (void)spec_to_path(&savedGameSpec, savefile, sizeof(savefile)); /* Success */ return (TRUE); } /* * Initialize the menus * * Fixed top level menus are now loaded all at once by GetNewMBar(). * Although this simplifies the function a bit, we have to make sure * that resources have all the expected entries defined XXX XXX */ static void init_menubar(void) { /* Boilerplate nib stuff */ IBNibRef nib; OSStatus err; if((err = CreateNibReference(CFSTR("main"), &nib))) quit("Cannot find the main nib bundle!"); if((err = SetMenuBarFromNib(nib, CFSTR("MenuBar")))) quit("Cannot prepare menu bar!"); /* Load the about dialog and set its contents */ (void) CreateWindowFromNib(nib, CFSTR("DLOG:about"), &aboutDialog); init_aboutdialogcontent(); DisposeNibReference(nib); MenuRef m = MyGetMenuHandle(kGraphicsMenu); for (int i = 1; i <= CountMenuItems(m); i++) { /* Invalid entry */ SetMenuItemRefCon(m, i, -1); } /* Note that menu indices start at 1, while grafIDs start at 0. * Hence the + 1. The RefCon is the grafID, not the menu index. */ size_t i = 0; do { SetMenuItemRefCon(m, graphics_modes[i].grafID + 1, graphics_modes[i].grafID); } while (graphics_modes[i++].pNext); /* Set up bigtile menus */ m = MyGetMenuHandle(kBigtileWidthMenu); for (size_t i = 1; i <= CountMenuItems(m); i++) { SetMenuItemRefCon(m, i, i); } m = MyGetMenuHandle(kBigtileHeightMenu); for (size_t i = 1; i <= CountMenuItems(m); i++) { SetMenuItemRefCon(m, i, i); } for(int j = kTileWidMenu; j <= kTileHgtMenu; j++) { m = MyGetMenuHandle(j); for(UInt32 i = MIN_FONT; i <= 32; i++) { char buf[15]; /* Tile size */ strnfmt((char*)buf, 15, "%d", i); CFStringRef cfstr = CFStringCreateWithBytes ( NULL, (byte*) buf, strlen(buf), kCFStringEncodingASCII, false); AppendMenuItemTextWithCFString(m, cfstr, 0, j, NULL); SetMenuItemRefCon(m, i-MIN_FONT+1, i); CFRelease(cfstr); } } } /* Install the handlers from the Commands table. */ static void install_handlers(WindowRef w) { EventHandlerRef prevRef; for(size_t i = 0; i < N_ELEMENTS(event_defs) ; i++) { const CommandDef *def = &event_defs[i]; /* Install window handlers only for kWINDOW events */ if ((!w) == (def->targetID == kWINDOW)) continue; EventHandlerUPP evtUPP = NewEventHandlerUPP( def->handler ); const EventTypeSpec eventSpec = { def->evtClass, def->evtType }; EventTargetRef target = GetApplicationEventTarget(); if(def->targetID == kWINDOW) target = GetWindowEventTarget(w); else if(def->targetID) target = GetMenuEventTarget(MyGetMenuHandle(def->targetID)); OSStatus err = InstallEventHandler(target, evtUPP, 1, &eventSpec, def->userData, &prevRef); if(err == eventHandlerAlreadyInstalledErr) { err = AddEventTypesToHandler(prevRef, 1, &eventSpec); } } } static int funcGTE(int a, int b) { return a >= b; } static int funcConst(int a, int c) {return c; } /* This initializes all the menus with values that change unpredictably. * This function is called on every menu draw and therefore should be kept * light and fast; menus that change rarely are done at the time of change */ static void validate_menus(void) { WindowRef w = GetFrontWindowOfClass(kDocumentWindowClass, true); if (!w || !initialized) return; term_data *td = (term_data *) GetWRefCon(w); if (!td) return; struct { int menu; /* Radio-style Menu ID to validate */ URefCon cur; /* Value in use (Compare to RefCon) */ int limit; /* Constraint value */ int (*cmp) (int, int); /* Filter function */ } funcs [] = { { kTileWidMenu, td->tile_wid, td->font_wid, funcGTE }, { kTileHgtMenu, td->tile_hgt, td->font_hgt, funcGTE }, { kGraphicsMenu, graf_mode, 1, funcConst }, { kBigtileWidthMenu, tile_width, 1, funcGTE }, { kBigtileHeightMenu, tile_height, 1, funcGTE }, }; MenuHandle m; if (cmd.command != CMD_NULL) { EnableAllMenuItems(MyGetMenuHandle(kGraphicsMenu)); } for(size_t i = 0; i < N_ELEMENTS(funcs); i++) { m = MyGetMenuHandle(funcs[i].menu); int n = CountMenuItems(m); for (int j = 1; j <= n; j++) { URefCon value; GetMenuItemRefCon(m, j, &value); CheckMenuItem(m, j, funcs[i].cur == value); if (funcs[i].cmp(value, funcs[i].limit)) EnableMenuItem(m, j); else DisableMenuItem(m, j); } } if (cmd.command != CMD_NULL && character_generated) EnableMenuItem(MyGetMenuHandle(kFileMenu), kSave); else DisableMenuItem(MyGetMenuHandle(kFileMenu), kSave); m = MyGetMenuHandle(kFontMenu); CheckMenuItem(m, kAntialias, antialias); } static OSStatus ValidateMenuCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { validate_menus(); return noErr; } /* Populate the recent items menu */ static void redrawRecentItemsMenu() { DeleteMenuItems(MyGetMenuHandle(kOpenRecentMenu), 1, CountMenuItems(MyGetMenuHandle(kOpenRecentMenu))); if (!recentItemsArrayRef || CFArrayGetCount(recentItemsArrayRef) == 0) { AppendMenuItemTextWithCFString(MyGetMenuHandle(kOpenRecentMenu), CFSTR("No recent items"), kMenuItemAttrDisabled, kOpenRecentMenu, NULL); } else { for (int i = 0; i < CFArrayGetCount(recentItemsArrayRef); i++) { OSErr err; FSRef recentFileRef; CFDataRef recentFileData; Boolean updateAlias = FALSE; MenuItemIndex item; recentFileData = CFArrayGetValueAtIndex(recentItemsArrayRef, i); if (CFDataGetTypeID() != CFGetTypeID(recentFileData)) continue; AliasHandle recentFileAlias = (AliasHandle)NewHandle(CFDataGetLength(recentFileData)); CFDataGetBytes(recentFileData, CFRangeMake(0, CFDataGetLength(recentFileData)), (UInt8 *) *recentFileAlias); err = FSResolveAlias(NULL, recentFileAlias, &recentFileRef, &updateAlias); if (err != noErr) continue; HFSUniStr255 recentFileName; err = FSGetCatalogInfo(&recentFileRef, kFSCatInfoNone, NULL, &recentFileName, NULL, NULL); if (err != noErr) continue; CFStringRef cfstr = CFStringCreateWithCharacters(kCFAllocatorDefault, recentFileName.unicode, recentFileName.length); AppendMenuItemTextWithCFString(MyGetMenuHandle(kOpenRecentMenu), cfstr, 0, i, &item); /* Add a shortcut key -- command-alt-number */ if (i < 9) { SetMenuItemCommandKey(MyGetMenuHandle(kOpenRecentMenu), item, false, 0x31+i); SetMenuItemModifiers(MyGetMenuHandle(kOpenRecentMenu), item, kMenuOptionModifier); } CFRelease(cfstr); } AppendMenuItemTextWithCFString(MyGetMenuHandle(kOpenRecentMenu), CFSTR("-"), kMenuItemAttrSeparator, FOUR_CHAR_CODE('Rsep'), NULL); AppendMenuItemTextWithCFString(MyGetMenuHandle(kOpenRecentMenu), CFSTR("Clear menu"), 0, FOUR_CHAR_CODE('Rclr'), NULL); } } /* Add a savefile to the recent items list, or update its existing status */ static void updateRecentItems(char *savefile) { OSErr err; FSRef recentFileRef; AliasHandle recentFileAlias; CFDataRef newRecentFileData; CFDataRef recentFileData; /* Convert the save path to an FSRef, then an Alias, and convert to data ready for storage */ err = FSPathMakeRef((byte *)savefile, &recentFileRef, NULL); if (err != noErr) return; err = FSNewAlias(NULL, &recentFileRef, &recentFileAlias); if (err != noErr) return; newRecentFileData = CFDataCreate(kCFAllocatorDefault, (UInt8 *) *recentFileAlias, GetHandleSize((Handle)recentFileAlias)); /* Loop through the recent items array, and delete any matches */ for (int i = CFArrayGetCount(recentItemsArrayRef) - 1; i >= 0; i--) { Boolean updateAlias = FALSE; char recentFilePath[1024]; /* Retrieve the recent item, resolve the alias, and extract a path */ recentFileData = CFArrayGetValueAtIndex(recentItemsArrayRef, i); if (CFDataGetTypeID() != CFGetTypeID(recentFileData)) continue; AliasHandle recentFileAlias = (AliasHandle)NewHandle(CFDataGetLength(recentFileData)); CFDataGetBytes(recentFileData, CFRangeMake(0, CFDataGetLength(recentFileData)), (UInt8 *) *recentFileAlias); /* If resolving an alias fails, don't delete it - the array is size-limited * anyway, and this allows network shares or removeable drives to come back later */ err = FSResolveAlias(NULL, recentFileAlias, &recentFileRef, &updateAlias); if (err != noErr) continue; err = FSRefMakePath(&recentFileRef, (byte *)recentFilePath, 1024); if (err != noErr) continue; /* Remove the item from the array if the paths match */ if (strcmp(recentFilePath, savefile) == 0) { CFArrayRemoveValueAtIndex(recentItemsArrayRef, i); continue; } /* If performing a file search via the alias updated it, save changes */ if (updateAlias) { recentFileData = CFDataCreate(kCFAllocatorDefault, (UInt8 *) *recentFileAlias, GetHandleSize((Handle)recentFileAlias)); CFArraySetValueAtIndex(recentItemsArrayRef, i, newRecentFileData); } } /* Insert the encoded alias at the start of the recent items array */ CFArrayInsertValueAtIndex(recentItemsArrayRef, 0, newRecentFileData); /* Limit to ten items */ if (CFArrayGetCount(recentItemsArrayRef) > 10) CFArrayRemoveValueAtIndex(recentItemsArrayRef, 10); /* Redraw the menu */ redrawRecentItemsMenu(); } /* Handle a selection in the recent items menu */ static OSStatus OpenRecentCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { HICommand command; command.commandID = 0; GetEventParameter( inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(command), NULL, &command); /* If the 'Clear menu' command was selected, flush the recent items array */ if (command.commandID == FOUR_CHAR_CODE('Rclr')) { CFArrayRemoveAllValues(recentItemsArrayRef); /* Otherwise locate the correct filepath and open it. */ } else { if (cmd.command != CMD_NULL || command.commandID >= (UInt32)CFArrayGetCount(recentItemsArrayRef)) return eventNotHandledErr; OSErr err; FSRef recentFileRef; AliasHandle recentFileAlias; CFDataRef recentFileData; Boolean updateAlias = FALSE; recentFileData = CFArrayGetValueAtIndex(recentItemsArrayRef, command.commandID); if (CFDataGetTypeID() != CFGetTypeID(recentFileData)) return eventNotHandledErr; recentFileAlias = (AliasHandle)NewHandle(CFDataGetLength(recentFileData)); CFDataGetBytes(recentFileData, CFRangeMake(0, CFDataGetLength(recentFileData)), (UInt8 *) *recentFileAlias); err = FSResolveAlias(NULL, recentFileAlias, &recentFileRef, &updateAlias); if (err != noErr) return eventNotHandledErr; err = FSRefMakePath(&recentFileRef, (byte *)savefile, 1024); if (err != noErr) return eventNotHandledErr; cmd.command = CMD_LOADFILE; } /* Redraw the menu */ redrawRecentItemsMenu(); return noErr; } static OSStatus AngbandGame(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { UInt32 i; /* Only enabled options are Fonts, Open/New/Import and Quit. */ DisableAllMenuItems(MyGetMenuHandle(kTileWidMenu)); DisableAllMenuItems(MyGetMenuHandle(kTileHgtMenu)); SetFontInfoForSelection(kFontSelectionATSUIType, 0, 0, 0); for(i = kNew; i <= kImport; i++) EnableMenuItem(MyGetMenuHandle(kFileMenu), i); /* Validate graphics, after bootstrapped opening of terminals */ for(i = 0; i < N_ELEMENTS(data); i++) { if(data[i].mapped) RevalidateGraphics(&data[i], FALSE); } /* Flush the prompt */ Term_fresh(); Term_flush(); play_game(); quit(0); /* Not reached */ return noErr; } /* * "New" / "Open" / "Import" */ static OSStatus openGame(int op) { /* If a game is in progress, do not proceed */ if (cmd.command != CMD_NULL) return noErr; /* Let the player to choose savefile */ if (op != kNew && 0 == select_savefile(op == kImport)) { /* Failed to open */ return noErr; } /* Disable the file-handling options in the file menu */ for(int i = kNew; i <= kImport; i++) DisableMenuItem(MyGetMenuHandle(kFileMenu), i); /* Wait for a keypress */ pause_line(Term); /* Set the game status */ if (op == kNew) cmd.command = CMD_NEWGAME; else cmd.command = CMD_LOADFILE; return noErr; } /* * Run the event loop and return a gameplay status to init_angband */ static errr get_cmd_init() { EventTargetRef target = GetEventDispatcherTarget(); OSStatus err; EventRef event; /* Prompt the user */ prt("[Choose 'New', 'Open' or 'Import' from the 'File' menu]", 23, 11); Term_fresh(); while (cmd.command == CMD_NULL) { err = ReceiveNextEvent(0, 0, kEventDurationForever, true, &event); if(err == noErr) { SendEventToEventTarget (event, target); ReleaseEvent(event); } } /* Push the command to the game. */ cmd_insert_s(&cmd); /* A game is starting - update status and tracking as appropriate. */ term_data *td0 = &data[0]; ChangeWindowAttributes(td0->w, kWindowNoAttributes, kWindowCloseBoxAttribute); DisableMenuItem(MyGetMenuHandle(kFileMenu), kClose); /* Disable the file-handling options in the file menu. * This has to be done separately for new/open due to messages/prompts * which may delay open while the menus are still accessibile. */ for(int i = kNew; i <= kImport; i++) DisableMenuItem(MyGetMenuHandle(kFileMenu), i); /* If supplied with a savefile, update the Recent Items list */ if (savefile[0]) { updateRecentItems(savefile); redrawRecentItemsMenu(); } return 0; } static errr crb_get_cmd(cmd_context context, bool wait) { if (context == CMD_INIT) return get_cmd_init(); else return textui_get_cmd(context, wait); } static bool crb_get_file(const char *suggested_name, char *path, size_t len) { NSSavePanel *panel = [NSSavePanel savePanel]; NSString *directory = [NSString stringWithCString:ANGBAND_DIR_USER encoding:NSASCIIStringEncoding]; NSString *filename = [NSString stringWithCString:suggested_name encoding:NSASCIIStringEncoding]; if ([panel runModalForDirectory:directory file:filename] == NSOKButton) { const char *p = [[[panel URL] path] UTF8String]; my_strcpy(path, p, len); return TRUE; } return FALSE; } static OSStatus QuitCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { if (cmd.command == CMD_NULL && !character_generated) quit(0); else Term_key_push(KTRL('x')); return noErr; } static OSStatus CommandCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { HICommand command; command.commandID = 0; GetEventParameter( inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(command), NULL, &command); UInt32 attrib; GetEventParameter( inEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(attrib), NULL, &attrib); switch(command.commandID) { default: return eventNotHandledErr; case 'save': if(cmd.command != CMD_NULL && character_generated) Term_key_push(KTRL('S')); break; case 'open': openGame(command.menu.menuItemIndex); break; case 'font': { if(!FPIsFontPanelVisible()) { WindowRef w = FrontWindow(); if (w) { term_data *td = (term_data*) GetWRefCon(w); SetFontInfoForSelection(kFontSelectionATSUIType, 1, &td->ginfo->style, NULL); } } CFStringRef tags[] = {CFSTR("Show Fonts"), CFSTR("Hide Fonts")}; FPShowHideFontPanel(); SetMenuItemTextWithCFString(command.menu.menuRef, kFonts, tags[FPIsFontPanelVisible()] ); break; } } return noErr; } static OSStatus CloseCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { WindowRef w = 0; term_data *td; GetEventParameter(inEvent, kEventParamDirectObject, typeWindowRef, NULL, sizeof(w), NULL, &w); td = (term_data*) GetWRefCon(w); if(cmd.command == CMD_NULL && !character_generated && td == &data[0]) quit(0); hibernate(); /* Track the go-away box */ if (td && td != &data[0]) { /* Not Mapped */ td->mapped = FALSE; /* Not Mapped */ td->t->mapped_flag = FALSE; /* Hide the window */ TransitionWindow(td->w, kWindowZoomTransitionEffect, kWindowHideTransitionAction, NULL); /* Update the menu status */ CheckMenuItem(MyGetMenuHandle(kWindowMenu), kAngbandTerm+(td - &data[0]), FALSE); } return noErr; } static OSStatus ResizeCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { int x, y; WindowRef w = 0; unsigned flags; term_data *td; term *old = Term; int err ; GetEventParameter(inEvent, kEventParamDirectObject, typeWindowRef, NULL, sizeof(w), NULL, &w); err = GetEventParameter(inEvent, kEventParamAttributes, typeUInt32, NULL, sizeof(flags), NULL, &flags); td = (term_data*) GetWRefCon(w); /* Oops */ if (!td) return noErr; /* Obtain geometry of resized window */ Rect tmpR; GetWindowBounds((WindowRef)td->w, kWindowContentRgn, &tmpR); td->r = tmpR; if(td->r.top < 40) td->r.top = 40; /* Extract the new ClipRect size in pixels */ y = tmpR.bottom - tmpR.top - BORDER_WID; x = tmpR.right - tmpR.left - BORDER_WID * 2; /* Ignore drag effects, other than for moving the mouse origin */ if(td->rows * td->tile_hgt == y && td->cols * td->tile_wid == x) return noErr; /* Extract a "close" approximation */ td->rows = y / td->tile_hgt; td->cols = x / td->tile_wid; /* Apply and Verify */ term_data_check_size(td); /* Activate */ Term_activate(td->t); /* Resize the term to correspond to new count. */ Term_resize(td->cols, td->rows); Term_activate(old); /* Close the old (different size) CGContext */ hibernate(); /* Resize and Redraw */ term_data_resize(td); /* Since we don't know what view needs to be updated, recalculate */ /* and redraw them all. (term_data_redraw() is not sufficient) */ Term_key_push(KTRL('R')); return eventNotHandledErr; } static void graphics_aux(UInt32 op) { graf_mode = op; current_graphics_mode = get_graphics_mode(op); if (current_graphics_mode) { use_transparency = (op != 0); pict_id = current_graphics_mode->file; graf_width = current_graphics_mode->cell_width; graf_height = current_graphics_mode->cell_height; use_graphics = (op != 0); graf_mode = op; ANGBAND_GRAF = current_graphics_mode->pref; arg_graphics = op; } else { use_graphics = 0; graf_mode = 0; ANGBAND_GRAF = 0; use_transparency = false; } graphics_nuke(); /* load tiles and setup GWorlds if tiles are requested */ if (use_graphics && (graphics_init() != 0)) { /* Oops */ plog("Cannot initialize graphics!"); /* reset graphics flags */ use_graphics = 0; graf_mode = 0; ANGBAND_GRAF = 0; current_graphics_mode = NULL; /* reset transparency mode */ use_transparency = false; } /* Reset visuals, without updating the screen */ if (initialized && cmd.command != CMD_NULL) { reset_visuals(TRUE); } RevalidateGraphics(&data[0], FALSE); Term_key_push(KTRL('R')); } static OSStatus TileSizeCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { term_data *td = Term->data; assert(td); HICommand cmd; GetEventParameter(inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(cmd), NULL, &cmd); UInt32 newSize = 0; GetMenuItemRefCon(cmd.menu.menuRef, cmd.menu.menuItemIndex, &newSize); if (GetMenuID(cmd.menu.menuRef) == kTileWidMenu) { if (td->font_wid > newSize || newSize == td->tile_wid) return noErr; else td->tile_wid = newSize; } else if (GetMenuID(cmd.menu.menuRef) == kTileHgtMenu) { if (td->font_hgt > newSize || newSize == td->tile_hgt) return noErr; else td->tile_hgt = newSize; } else { return eventNotHandledErr; } RevalidateGraphics(td, FALSE); return noErr; } static OSStatus RestoreCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData) { WindowRef w = 0; GetEventParameter(inEvent, kEventParamDirectObject, typeWindowRef, NULL, sizeof(w), NULL, &w); term_data *td = (term_data*) GetWRefCon(w); if (!td) return eventNotHandledErr; /* Mapped */ td->mapped = TRUE; int i = td - &data[0]; /* Link */ term_data_link(i); /* Mapped (?) */ td->t->mapped_flag = TRUE; /* Bring to the front */ SelectWindow(td->w); /* Update menu states */ if (td == &data[0] && cmd.command != CMD_NULL) DisableMenuItem(MyGetMenuHandle(kFileMenu), kClose); else EnableMenuItem(MyGetMenuHandle(kFileMenu), kClose); return noErr; } static OSStatus TerminalCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { HICommand command; GetEventParameter(inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &command); /* Offset of Angband term in Window menu. */ int i = command.menu.menuItemIndex - kAngbandTerm; /* Check legality of choice */ if ((i < 0) || (i >= MAX_TERM_DATA)) return eventNotHandledErr; /* Obtain the window */ term_data *td = &data[i]; /* Mapped */ td->mapped = TRUE; /* Link */ term_data_link(i); /* Mapped (?) */ td->t->mapped_flag = TRUE; /* Show the window */ TransitionWindow(td->w, kWindowZoomTransitionEffect, kWindowShowTransitionAction, NULL); /* Update the menu status */ CheckMenuItem(MyGetMenuHandle(kWindowMenu), kAngbandTerm+i, TRUE); term_data_check_font(td); term_data_check_size(td); term_data_resize(td); Term_resize(td->cols, td->rows); term_data_redraw(td); /* Bring to the front */ SelectWindow(td->w); return noErr; } static OSStatus RevalidateGraphics(term_data *td, bool reset_tilesize) { if (!td) return noErr; /* * Reset the tilesize on graphics changes; term_data_check_font recalculates * this after it's been reset. However, only reset the tilesize for default * and font events (not startup - 'Play' 'Band' - or manual changes) */ if (reset_tilesize) { td->tile_wid = td->tile_hgt = 0; } /* Clear the graphics tile cache. */ graphics_tiles_nuke(); /* Sanity check for rows, columns, tilesize. */ term_data_check_font(td); term_data_check_size(td); /* Window size changes */ term_data_resize(td); term_data_redraw(td); return noErr; } static OSStatus UpdateCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData) { WindowRef w = 0; term_data *td; GetEventParameter(inEvent, kEventParamDirectObject, typeWindowRef, NULL, sizeof(w), NULL, &w); if(!w) return noErr; /* Clear window's update region and clip drawings with it */ BeginUpdate(w); td = (term_data*) GetWRefCon(w); if (td) term_data_redraw(td); EndUpdate(w); return noErr; } static void toggle_antialias(HICommand *command, void *data) { antialias = !antialias; } static void set_graphics_mode(HICommand *command, void *data) { /* Index in graphics_modes[] */ UInt32 op; GetMenuItemRefCon(command->menu.menuRef, command->menu.menuItemIndex, &op); if (graf_mode != op) graphics_aux(op); } static void set_tile_width(HICommand *command, void *data) { UInt32 op; GetMenuItemRefCon(command->menu.menuRef, command->menu.menuItemIndex, &op); assert(op != 0); tile_width = op; } static void set_tile_height(HICommand *command, void *data) { UInt32 op; GetMenuItemRefCon(command->menu.menuRef, command->menu.menuItemIndex, &op); assert(op != 0); tile_height = op; } static void reset_wid_hgt(HICommand *command, void *data) { term_data *td = Term->data; assert(td); td->tile_wid = td->font_wid; td->tile_hgt = td->font_hgt; } static void seek_graphics_size(term_data *td, int seek_wid, int seek_hgt) { td->tile_wid = td->font_wid; td->tile_hgt = td->font_hgt; tile_width = MAX(seek_wid / td->font_wid, 1); tile_height = MAX(seek_hgt / td->font_hgt, 1); td->tile_wid += (seek_wid - (tile_width * td->font_wid)) / tile_width; td->tile_hgt += (seek_hgt - (tile_height * td->font_hgt)) / tile_height; } static void set_nice_graphics_fit(HICommand *command, void *data) { term_data *td = Term->data; assert(td); seek_graphics_size(td, graf_width, graf_height); } static void set_nice_graphics_square(HICommand *command, void *data) { term_data *td = Term->data; assert(td); int max_dimension = MAX(td->font_wid, td->font_hgt); seek_graphics_size(td, max_dimension, max_dimension); } static OSStatus ToggleCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData) { HICommand command; GetEventParameter(inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(command), NULL, &command); for (size_t i = 0; i < N_ELEMENTS(menu_commands); i++) { if (command.commandID != menu_commands[i].id) continue; menu_commands[i].handler(&command, menu_commands[i].data); if (menu_commands[i].refresh == true) { RevalidateGraphics(&data[0], FALSE); Term_key_push(KTRL('R')); } return noErr; } return eventNotHandledErr; } static void FontChanged(UInt32 fontID, float size) { if (size < MIN_FONT || fontID == 0) return; ATSUStyle fontStyle; term_data *td = (term_data *) GetWRefCon(fontInfo.focus); assert(td); /* No change. */ if (td->font_id == fontID && td->font_size == size) return; const ATSUAttributeTag tags[] = {kATSUFontTag, kATSUSizeTag}; Fixed fsize = (Fixed)(size*(1<<16)); const ByteCount sizes[] = {sizeof(fontID), sizeof(fsize)}; void * values[] = { &fontID, &fsize }; ATSUCreateStyle(&fontStyle); ATSUSetAttributes(fontStyle, 2, tags, sizes, values); /* Reject italics &c */ const ATSUAttributeTag badtags[] = {kATSUQDItalicTag, kATSUQDUnderlineTag, kATSUQDCondensedTag }; for (size_t i = 0; i < N_ELEMENTS(badtags); i++) { bool ital = false; ByteCount ssize = sizeof(ital); ATSUGetAttribute(fontStyle, badtags[i], ssize, &ital, 0); if(ital) { ATSUDisposeStyle(fontStyle); return; } } ATSUDisposeStyle(fontStyle); td->font_id = fontID; td->font_size = size; RevalidateGraphics(td, TRUE); } /* * Bookkeeping for font-related events. */ static OSStatus FontCommand(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void *inUserData) { int class = GetEventClass(inEvent); int type = GetEventKind(inEvent); if(class == 'font' && type == kEventFontSelection) { UInt32 fid = 0; Fixed size = 0; (void) GetEventParameter (inEvent, kEventParamATSUFontSize, typeATSUSize, NULL, sizeof (size), NULL, &size); (void) GetEventParameter (inEvent, kEventParamATSUFontID, typeATSUFontID, NULL, sizeof(fid), NULL, &fid); if(size > 32*(1<<16)) size = 32*(1<<16); float fsize = 1.0*size/(1<<16); FontChanged(fid, fsize); return noErr; } else if(class == 'appl' && type == kEventAppActiveWindowChanged) { WindowRef w = 0; GetEventParameter(inEvent, kEventParamCurrentWindow, typeWindowRef, NULL, sizeof(w), NULL, &w); if(!GetWRefCon(w)) { /* Window is Font Panel. */ w = 0; GetEventParameter(inEvent, kEventParamPreviousWindow, typeWindowRef, NULL, sizeof(w), NULL, &w); } if(w) fontInfo.focus = w; return noErr; } else if(class == 'font' && type == kEventFontPanelClosed) { SetMenuItemTextWithCFString(GetMenuHandle(kFontMenu), kFonts, CFSTR("Show Fonts")); return noErr; } return eventNotHandledErr; } static OSStatus MouseCommand (EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData) { WindowRef w = 0; GetEventParameter(inEvent, kEventParamWindowRef, typeWindowRef, NULL, sizeof(w), NULL, &w); /* Relevant "term_data" */ term_data *td = (term_data *) GetWRefCon(w); if(&data[0] != td) return eventNotHandledErr; short button = 0; GetEventParameter(inEvent, kEventParamMouseButton, typeMouseButton, NULL, sizeof(button), NULL, &button); UInt32 modifiers = 0; GetEventParameter(inEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(modifiers), NULL, &modifiers); HIPoint p = {0, 0}; GetEventParameter(inEvent, kEventParamMouseLocation, typeHIPoint, NULL, sizeof(p), NULL, &p); if(button == -1) button = 1; if(button == 1 && modifiers & cmdKey) button = 2; else if(button == 1 && modifiers & shiftKey) button = 3; /* X coordinate relative to left side of window exclusive of border. */ p.x -= (BORDER_WID+td->r.left); /* Y coordinate relative to top of window content region. */ p.y -= td->r.top; Term_mousepress(p.x/td->tile_wid, p.y/td->tile_hgt, button); return noErr; } static OSStatus KeyboardCommand ( EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { /* Don't handle keyboard events in open/save dialogs, to prevent a 10.4 keyboard interaction bug */ UInt32 windowClass; GetWindowClass(GetUserFocusWindow(), &windowClass); if (windowClass == kMovableModalWindowClass) return eventNotHandledErr; UInt32 evt_mods; UInt32 evt_keycode; /* Get various aspects of the keycode */ GetEventParameter(inEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &evt_mods); GetEventParameter(inEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &evt_keycode); /* Extract some modifiers */ bool mc = (evt_mods & controlKey) ? TRUE : FALSE; bool ms = (evt_mods & shiftKey) ? TRUE : FALSE; bool mo = (evt_mods & optionKey) ? TRUE : FALSE; bool mx = (evt_mods & cmdKey) ? TRUE : FALSE; bool kp = FALSE; byte mods = (mo ? KC_MOD_ALT : 0) | (mx ? KC_MOD_META : 0); keycode_t ch = 0; /* Command + "normal key" -> menu action */ if (mx && evt_keycode < 64) return eventNotHandledErr; /* Hide the mouse pointer */ hibernate(); ObscureCursor(); /* see http://www.classicteck.com/rbarticles/mackeyboard.php */ switch (evt_keycode) { /* top number keys */ case 18: if (!ms || mo) ch = '1'; break; case 19: if (!ms || mo) ch = '2'; break; case 20: if (!ms || mo) ch = '3'; break; case 21: if (!ms || mo) ch = '4'; break; case 23: if (!ms || mo) ch = '5'; break; case 22: if (!ms || mo) ch = '6'; break; case 26: if (!ms || mo) ch = '7'; break; case 28: if (!ms || mo) ch = '8'; break; case 25: if (!ms || mo) ch = '9'; break; case 29: if (!ms || mo) ch = '0'; break; /* keypad keys */ case 65: ch = '.'; kp = TRUE; break; case 67: ch = '*'; kp = TRUE; break; case 69: ch = '+'; kp = TRUE; break; case 75: ch = '/'; kp = TRUE; break; case 76: ch = KC_ENTER; kp = TRUE; break; case 78: ch = '-'; kp = TRUE; break; case 81: ch = '='; kp = TRUE; break; case 82: ch = '0'; kp = TRUE; break; case 83: ch = '1'; kp = TRUE; break; case 84: ch = '2'; kp = TRUE; break; case 85: ch = '3'; kp = TRUE; break; case 86: ch = '4'; kp = TRUE; break; case 87: ch = '5'; kp = TRUE; break; case 88: ch = '6'; kp = TRUE; break; case 89: ch = '7'; kp = TRUE; break; case 91: ch = '8'; kp = TRUE; break; case 92: ch = '9'; kp = TRUE; break; /* main keyboard but deal with here */ case 48: ch = KC_TAB; break; case 36: ch = KC_ENTER; break; case 51: ch = KC_BACKSPACE; break; case 53: ch = ESCAPE; break; /* middle bit */ case 114: ch = KC_HELP; break; case 115: ch = KC_HOME; break; case 116: ch = KC_PGUP; break; case 117: ch = KC_DELETE; break; case 119: ch = KC_END; break; case 121: ch = KC_PGDOWN; break; case 123: ch = ARROW_LEFT; break; case 124: ch = ARROW_RIGHT; break; case 125: ch = ARROW_DOWN; break; case 126: ch = ARROW_UP; break; /* function keys */ case 122: ch = KC_F1; break; case 120: ch = KC_F2; break; case 99: ch = KC_F3; break; case 118: ch = KC_F4; break; case 96: ch = KC_F5; break; case 97: ch = KC_F6; break; case 98: ch = KC_F7; break; case 100: ch = KC_F8; break; case 101: ch = KC_F9; break; case 109: ch = KC_F10; break; case 103: ch = KC_F11; break; case 111: ch = KC_F12; break; case 105: ch = KC_F13; break; case 107: ch = KC_F14; break; case 113: ch = KC_F15; break; } if (ch) { mods |= (mc ? KC_MOD_CONTROL : 0) | (ms ? KC_MOD_SHIFT : 0) | (kp ? KC_MOD_KEYPAD : 0); Term_keypress(ch, mods); } else if (evt_keycode < 64) { /* Keycodes under 64 = main part of the keyboard, printables (mostly) */ char ch; GetEventParameter(inEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &ch); if (mc && MODS_INCLUDE_CONTROL(ch)) mods |= KC_MOD_CONTROL; if (ms && MODS_INCLUDE_SHIFT(ch)) mods |= KC_MOD_SHIFT; Term_keypress(ch, mods); } return noErr; } /* About angband... */ static OSStatus AboutCommand(EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { HICommand command; command.commandID = 0; GetEventParameter( inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(command), NULL, &command); if(command.commandID != 'abou') return eventNotHandledErr; /* Move it to the middle of the screen */ RepositionWindow(aboutDialog, NULL, kWindowCenterOnMainScreen); /* Show the dialog */ TransitionWindow(aboutDialog, kWindowZoomTransitionEffect, kWindowShowTransitionAction, NULL); /* wait for user input */ for(;;) { EventTargetRef target = GetEventDispatcherTarget(); EventRef event; OSStatus err = ReceiveNextEvent(0, 0, kEventDurationForever, true, &event); EventClass evc = GetEventClass(event); EventType evt = GetEventKind(event); if(err == noErr) { SendEventToEventTarget (event, target); ReleaseEvent(event); } if(evc == 'keyb' || (evc == 'mous' && evt == kEventMouseDown)) break; } /* Hide the dialogue */ TransitionWindow(aboutDialog, kWindowZoomTransitionEffect, kWindowHideTransitionAction, NULL); return noErr; } static OSStatus ResumeCommand (EventHandlerCallRef inCallRef, EventRef inEvent, void *inUserData ) { term_data *td; hibernate(); Cursor tempCursor; SetCursor(GetQDGlobalsArrow(&tempCursor)); /* Redraw all visible terms */ for (int i = 0; i < MAX_TERM_DATA; i++ ) { /* Obtain */ td = &data[i]; /* Redraw if mapped */ if (td->mapped) term_data_redraw(td); } return noErr; } static OSErr AEH_Open(const AppleEvent *theAppleEvent, AppleEvent* reply, SInt32 handlerRefCon) { FSSpec myFSS; AEDescList docList; long fileindex; long filecount; OSErr err; FInfo myFileInfo; /* If a game is in progress, do not proceed */ if (cmd.command != CMD_NULL) return noErr; /* Put the direct parameter (a descriptor list) into a docList */ err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeAEList, &docList); if (err) return err; err = AECountItems(&docList, &filecount); if (err) return err; /* Only open one file, but check for the first valid file in the list */ for (fileindex = 1; fileindex <= filecount; fileindex++) { err = AEGetNthPtr(&docList, fileindex, typeFSS, NULL, NULL, &myFSS, sizeof(myFSS), NULL); if (err) continue; err = FSpGetFInfo(&myFSS, &myFileInfo); if (err) continue; if (myFileInfo.fdType == 'SAVE') { /* Extract the filename and delay the open */ (void)spec_to_path(&myFSS, savefile, sizeof(savefile)); cmd.command = CMD_LOADFILE; break; } } /* Dispose */ err = AEDisposeDesc(&docList); /* Success */ return noErr; } /* * Handle quit_when_ready, by Peter Ammon, * slightly modified to check inkey_flag. */ static void quit_calmly(void) { /* Quit immediately if game's not started */ if (cmd.command == CMD_NULL || !character_generated) quit(NULL); /* Save the game and Quit (if it's safe) */ if (inkey_flag) { /* Hack -- Forget messages */ msg_flag = FALSE; /* Save the game */ #ifndef ZANG_AUTO_SAVE save_game(); #else do_cmd_save_game(FALSE); #endif /* !ZANG_AUTO_SAVE */ /* Quit */ quit(NULL); } /* Wait until inkey_flag is set */ } /* * Macintosh modifiers (event.modifier & ccc): * cmdKey, optionKey, shiftKey, alphaLock, controlKey * * * Macintosh Keycodes (0-63 normal, 64-95 keypad, 96-127 extra): * * Return:36 * Delete:51 * * Period:65 * Star:67 * Plus:69 * Clear:71 * Slash:75 * Enter:76 * Minus:78 * Equal:81 * 0-7:82-89 * 8-9:91-92 * * backslash/vertical bar (Japanese keyboard):93 * * F5: 96 * F6: 97 * F7: 98 * F3:99 * F8:100 * F10:101 * F11:103 * F13:105 * F14:107 * F9:109 * F12:111 * F15:113 * Help:114 * Home:115 * PgUp:116 * Del:117 * F4: 118 * End:119 * F2:120 * PgDn:121 * F1:122 * Lt:123 * Rt:124 * Dn:125 * Up:126 */ /* * optimize non-blocking calls to "CheckEvents()" * idea from "maarten hazewinkel " * * was: 6. the value of one (~ 60 fps) seems to work better with the borg, * and so should be for other cpu-intensive features like the autoroller. */ #define event_ticks 1 /* * check for events, return true if we process any */ static bool CheckEvents(int wait) { static EventTimeout lastticks; EventTimeout curticks; /* access the clock */ curticks = TickCount(); EventTimeout sleep_ticks; EventRef event; OSStatus err; /* hack -- allow efficient checking for non-pending events */ if ((wait == CHECK_EVENTS_NO_WAIT) && (curticks < lastticks + event_ticks)) return (false); /* timestamp last check */ lastticks = curticks; /* handles the quit_when_ready flag */ if (quit_when_ready) quit_calmly(); /* blocking call to waitnextevent - should use max_int xxx xxx */ if (wait == CHECK_EVENTS_WAIT) sleep_ticks = kEventDurationForever; /* non-blocking */ else sleep_ticks = 0l; EventTargetRef target = GetEventDispatcherTarget(); /* get an event (or null) */ do { err = ReceiveNextEvent(0, 0, wait ? kEventDurationForever : 0, true, &event); if(show_events) { EventClass evc = GetEventClass(event); EventType evt = GetEventKind(event); if(evc != 'mous' || evt != kEventMouseDragged ) printf("%d (%4s) %d\n", (int)evc, (char*)&evc, (int)evt); } if(err == noErr) { err = SendEventToEventTarget (event, target); ReleaseEvent(event); } else if(err != eventNotHandledErr && sleep_ticks >= 0) { curticks = TickCount(); sleep_ticks -= curticks - lastticks; lastticks = curticks; if(sleep_ticks <= 0) return false; } } while(err != eventNotHandledErr && err); /* DurationForever is -1 */ return true; } /*** Some Hooks for various routines ***/ /* * Hook to tell the user something important */ static void hook_plog(const char *str) { /* Warning message */ mac_warning(str); } /* * Hook to tell the user something, and then quit */ static void hook_quit(const char *str) { /* Warning if needed */ if (str) mac_warning(str); /* Update the Recent Items list - inserts newly created characters */ if (savefile[0]) updateRecentItems(savefile); /* Dispose of graphic tiles */ if(frame.image) graphics_nuke(); /* Write a preference file */ if (initialized) save_pref_file(); close_graphics_modes(); /* All done */ ExitToShell(); } /*** Main program ***/ /* * Initialize and verify file and dir paths * */ static void init_paths(void) { char path[1024]; /* Hook in to the file_open routine */ file_open_hook = osx_file_open_hook; /* Default to the "lib" folder with the application */ if (locate_lib(path, sizeof(path)) == NULL) { quit("unable to find 'lib' dir"); } /* Prepare the paths */ init_file_paths(path, path, path); /* Create any missing directories */ create_needed_dirs(); /* Build the filename */ path_build(path, sizeof(path), ANGBAND_DIR_FILE, "news.txt"); /* Attempt to open and close that file */ if (!file_exists(path)) { /* Warning */ plog_fmt("Unable to open the '%s' file.", path); quit("The Angband 'lib' folder is probably missing or misplaced."); } } /* * Macintosh Main loop */ int main(void) { /* Initialise the cursor and turn it into an "arrow" */ InitCursor(); /* * Remember Mac OS version, in case we have to cope with version-specific * problems */ (void)Gestalt(gestaltSystemVersion, &mac_os_version); /* Initiliases Cocoa */ NSApplicationLoad(); /* Hooks in some "z-util.c" hooks */ plog_aux = hook_plog; quit_aux = hook_quit; /* Initialize colors */ update_color_info(); /* Show the "watch" cursor */ SetCursor(*(GetCursor(watchCursor))); /* Initialize */ init_paths(); /* Load possible graphics modes -- must happen before menubar init */ init_graphics_modes("graphics.txt"); /* Prepare the menubar */ init_menubar(); /* Ensure that the recent items array is always an array and start with an empty menu */ recentItemsArrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); redrawRecentItemsMenu(); /* Prepare the windows */ init_windows(); /* Install the 'Apple Event' handler hook (ignore error codes) */ (void)AEInstallEventHandler( kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerUPP(AEH_Open), 0L, FALSE); /* Install menu and application handlers */ install_handlers(0); /* Reset the cursor */ Cursor tempCursor; SetCursor(GetQDGlobalsArrow(&tempCursor)); /* Quicktime -- Load sound effect resources */ load_sounds(); /* Note the "system" */ ANGBAND_SYS = "mac"; /* Validate the contents of the main window */ validate_main_window(); /* Flush input commands from the event queue */ FlushEventsMatchingListFromQueue(GetMainEventQueue(), N_ELEMENTS(input_event_types), input_event_types); /* Set command hook */ cmd_get_hook = crb_get_cmd; get_file = crb_get_file; /* Set up the display handlers and things. */ init_display(); if(graf_mode) graphics_aux(graf_mode); /* We are now initialized */ initialized = TRUE; validate_menus(); /* Start playing! */ EventRef newGameEvent = nil; CreateEvent ( nil, 'Play', 'Band', GetCurrentEventTime(), kEventAttributeNone, &newGameEvent ); PostEventToQueue(GetMainEventQueue(), newGameEvent, kEventPriorityLow); RunApplicationEventLoop(); /* Quit */ quit(NULL); /* Since it's an int function */ return (0); } #endif /* MACH_O_CARBON */ angband-3.5.1/src/borg/0000755000175000017500000000000012456456606014160 5ustar chriscchriscangband-3.5.1/src/borg/borg2.h0000644000175000017500000000247312456456606015352 0ustar chriscchrisc/* File: borg2.h */ /* Purpose: Header file for "borg2.c" -BEN- */ #ifndef INCLUDED_BORG2_H #define INCLUDED_BORG2_H #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #ifdef ALLOW_BORG /* * This file provides support for "borg2.c". */ #include "borg1.h" /* * Determine if a grid is a floor grid and only a floor grid */ extern bool borg_cave_floor_bold(int Y, int X); /* * Grid based version of "borg_cave_floor_bold()" */ #define borg_cave_floor_grid(A) \ (!((A)->feat & 0x20)) /* * Check a path for line of sight */ extern bool borg_los(int y1, int x1, int y2, int x2); /* * Check the projection from (x1,y1) to (x2,y2) */ extern bool borg_projectable(int y1, int x1, int y2, int x2); extern bool borg_offset_projectable(int y1, int x1, int y2, int x2); /* * Check the projection from (x1,y1) to (x2,y2). */ extern bool borg_projectable_pure(int y1, int x1, int y2, int x2); extern bool borg_projectable_dark(int y1, int x1, int y2, int x2); /* * Forget the "lite" */ extern void borg_forget_LIGHT(void); /* * Update the "lite" */ extern void borg_update_LIGHT(void); /* * Forget the "view" */ extern void borg_forget_view(void); /* * Update the "view" */ extern void borg_update_view(void); /* * Initialize this file */ extern void borg_init_2(void); #endif #endif angband-3.5.1/src/borg/borg4.c0000644000175000017500000114642612456456606015357 0ustar chriscchrisc/* File: borg4.c */ /* Purpose: Notice and Power code for the Borg -BEN- */ #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #include "files.h" #ifdef ALLOW_BORG #include "borg1.h" #include "borg2.h" #include "borg3.h" #include "borg4.h" /* * Note that we assume that any item with quantity zero does not exist, * thus, when simulating possible worlds, we do not actually have to * "optimize" empty slots. * */ /* * The "notice" functions examine various aspects of the player inventory, * the player equipment, or the home contents, and extract various numerical * quantities based on those aspects, adjusting them for various "abilities", * such as the ability to cast certain spells, etc. * * The "power" functions use the numerical quantities described above, and * use them to do two different things: (1) rank the "value" of having * various abilities relative to the possible "money" reward of carrying * sellable items instead, and (2) rank the value of various abilities * relative to each other, which is used to determine what to wear/buy, * and in what order to wear/buy those items. * * These functions use some very heuristic values, by the way... * * We should probably take account of things like possible enchanting * (especially when in town), and items which may be found soon. * * We consider several things: * (1) the actual "power" of the current weapon and bow * (2) the various "flags" imparted by the equipment * (3) the various abilities imparted by the equipment * (4) the penalties induced by heavy armor or gloves or edged weapons * (5) the abilities required to enter the "max_depth" dungeon level * (6) the various abilities of some useful inventory items * * Note the use of special "item counters" for evaluating the value of * a collection of items of the given type. Basically, the first item * of the given type is always the most valuable, with subsequent items * being worth less, until the "limit" is reached, after which point any * extra items are only worth as much as they can be sold for. */ /* * Helper function -- notice the player equipment */ static void borg_notice_aux1(void) { int i, hold; const struct player_race *rb_ptr = p_ptr->race; const struct player_class *cb_ptr = p_ptr->class; int extra_blows = 0; int extra_shots = 0; int extra_might = 0; int my_num_fire; bitflag f[OF_SIZE]; borg_item *item; /* Recalc some Variables */ borg_skill[BI_ARMOR] = 0; borg_skill[BI_SPEED] = 110; /* Start with a single blow per turn */ borg_skill[BI_BLOWS] = 1; /* Start with a single shot per turn */ my_num_fire = 1; /* Reset the "ammo" tval */ my_ammo_tval = -1; /* Reset the "ammo" sides for darts*/ my_ammo_sides = 4; /* Reset the shooting power */ my_ammo_power = 0; /* Reset the count of ID needed immediately */ my_need_id = 0; /* Base infravision (purely racial) */ borg_skill[BI_INFRA] = rb_ptr->infra; /* Base skill -- disarming */ borg_skill[BI_DIS] = rb_ptr->r_skills[SKILL_DISARM] + cb_ptr->c_skills[SKILL_DISARM]; /* Base skill -- magic devices */ borg_skill[BI_DEV] = rb_ptr->r_skills[SKILL_DEVICE] + cb_ptr->c_skills[SKILL_DEVICE]; /* Base skill -- saving throw */ borg_skill[BI_SAV] = rb_ptr->r_skills[SKILL_SAVE] + cb_ptr->c_skills[SKILL_SAVE]; /* Base skill -- stealth */ borg_skill[BI_STL] = rb_ptr->r_skills[SKILL_STEALTH] + cb_ptr->c_skills[SKILL_STEALTH]; /* Base skill -- searching ability */ borg_skill[BI_SRCH] = rb_ptr->r_skills[SKILL_SEARCH] + cb_ptr->c_skills[SKILL_SEARCH]; /* Base skill -- searching frequency */ borg_skill[BI_SRCHFREQ] = rb_ptr->r_skills[SKILL_SEARCH_FREQUENCY] + cb_ptr->c_skills[SKILL_SEARCH_FREQUENCY]; /* Base skill -- combat (normal) */ borg_skill[BI_THN] = rb_ptr->r_skills[SKILL_TO_HIT_MELEE] + cb_ptr->c_skills[SKILL_TO_HIT_MELEE]; /* Base skill -- combat (shooting) */ borg_skill[BI_THB] = rb_ptr->r_skills[SKILL_TO_HIT_BOW] + cb_ptr->c_skills[SKILL_TO_HIT_BOW]; /* Base skill -- combat (throwing) */ borg_skill[BI_THT] = rb_ptr->r_skills[SKILL_TO_HIT_THROW] + cb_ptr->c_skills[SKILL_TO_HIT_THROW]; /** Racial Skills **/ /* Extract the player flags */ player_flags(f); /* Good flags */ if (rf_has(f, OF_SLOW_DIGEST)) borg_skill[BI_SDIG] = TRUE; if (rf_has(f, OF_FEATHER)) borg_skill[BI_FEATH] = TRUE; if (rf_has(f, OF_REGEN)) borg_skill[BI_REG] = TRUE; if (rf_has(f, OF_TELEPATHY)) borg_skill[BI_ESP] = TRUE; if (rf_has(f, OF_SEE_INVIS)) borg_skill[BI_SINV] = TRUE; if (rf_has(f, OF_FREE_ACT)) borg_skill[BI_FRACT] = TRUE; if (rf_has(f, OF_HOLD_LIFE)) borg_skill[BI_HLIFE] = TRUE; /* Weird flags */ /* Bad flags */ if (rf_has(f, OF_IMPACT)) borg_skill[BI_W_IMPACT] = TRUE; if (rf_has(f, OF_AGGRAVATE)) borg_skill[BI_CRSAGRV] = TRUE; if (rf_has(f, OF_TELEPORT)) borg_skill[BI_CRSTELE] = TRUE; if (rf_has(f, OF_IMPAIR_HP)) borg_skill[BI_CRSHPIMP] = TRUE; if (rf_has(f, OF_IMPAIR_MANA)) borg_skill[BI_CRSMPIMP] = TRUE; if (rf_has(f, OF_AFRAID)) { borg_skill[BI_CRSFEAR] = TRUE; } if (rf_has(f, OF_VULN_FIRE)) borg_skill[BI_CRSFVULN] = TRUE; if (rf_has(f, OF_VULN_ACID)) borg_skill[BI_CRSAVULN] = TRUE; if (rf_has(f, OF_VULN_COLD)) borg_skill[BI_CRSCVULN] = TRUE; if (rf_has(f, OF_VULN_ELEC)) borg_skill[BI_CRSEVULN] = TRUE; /* Immunity flags */ if (rf_has(f, OF_IM_FIRE)) borg_skill[BI_IFIRE] = TRUE; if (rf_has(f, OF_IM_ACID)) borg_skill[BI_IACID] = TRUE; if (rf_has(f, OF_IM_COLD)) borg_skill[BI_ICOLD] = TRUE; if (rf_has(f, OF_IM_ELEC)) borg_skill[BI_IELEC] = TRUE; /* Resistance flags */ if (rf_has(f, OF_RES_ACID)) borg_skill[BI_RACID] = TRUE; if (rf_has(f, OF_RES_ELEC)) borg_skill[BI_RELEC] = TRUE; if (rf_has(f, OF_RES_FIRE)) borg_skill[BI_RFIRE] = TRUE; if (rf_has(f, OF_RES_COLD)) borg_skill[BI_RCOLD] = TRUE; if (rf_has(f, OF_RES_POIS)) borg_skill[BI_RPOIS] = TRUE; if (rf_has(f, OF_RES_FEAR)) borg_skill[BI_RFEAR] = TRUE; if (rf_has(f, OF_RES_LIGHT)) borg_skill[BI_RLITE] = TRUE; if (rf_has(f, OF_RES_DARK)) borg_skill[BI_RDARK] = TRUE; if (rf_has(f, OF_RES_BLIND)) borg_skill[BI_RBLIND] = TRUE; if (rf_has(f, OF_RES_CONFU)) borg_skill[BI_RCONF] = TRUE; if (rf_has(f, OF_RES_SOUND)) borg_skill[BI_RSND] = TRUE; if (rf_has(f, OF_RES_SHARD)) borg_skill[BI_RSHRD] = TRUE; if (rf_has(f, OF_RES_NEXUS)) borg_skill[BI_RNXUS] = TRUE; if (rf_has(f, OF_RES_NETHR)) borg_skill[BI_RNTHR] = TRUE; if (rf_has(f, OF_RES_CHAOS)) borg_skill[BI_RKAOS] = TRUE; if (rf_has(f, OF_RES_DISEN)) borg_skill[BI_RDIS] = TRUE; /* Sustain flags */ if (rf_has(f, OF_SUST_STR)) borg_skill[BI_SSTR] = TRUE; if (rf_has(f, OF_SUST_INT)) borg_skill[BI_SINT] = TRUE; if (rf_has(f, OF_SUST_WIS)) borg_skill[BI_SWIS] = TRUE; if (rf_has(f, OF_SUST_DEX)) borg_skill[BI_SDEX] = TRUE; if (rf_has(f, OF_SUST_CON)) borg_skill[BI_SCON] = TRUE; /* I am pretty sure the CF_flags will be caught by the * code above when the player flags are checked */ /* Clear the stat modifiers */ for (i = 0; i < 6; i++) my_stat_add[i] = 0; /* Scan the usable inventory */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Does the borg need to get an ID for it? */ if (streq(item->note, "magical") || streq(item->note, "ego") || streq(item->note, "splendid") || streq(item->note, "excellent")) my_need_id ++; /* track number of items the borg has on him */ /* Count up how many artifacts the borg has on him */ borg_has_on[item->kind] += item->iqty; if (item->name1) borg_artifact[item->name1] = item->iqty; /* Affect stats */ if (of_has(item->flags, OF_STR)) my_stat_add[A_STR] += item->pval; if (of_has(item->flags, OF_INT)) my_stat_add[A_INT] += item->pval; if (of_has(item->flags, OF_WIS)) my_stat_add[A_WIS] += item->pval; if (of_has(item->flags, OF_DEX)) my_stat_add[A_DEX] += item->pval; if (of_has(item->flags, OF_CON)) my_stat_add[A_CON] += item->pval; /* various slays */ if (of_has(item->flags, OF_SLAY_ANIMAL)) borg_skill[BI_WS_ANIMAL] = TRUE; if (of_has(item->flags, OF_SLAY_EVIL)) borg_skill[BI_WS_EVIL] = TRUE; if (of_has(item->flags, OF_SLAY_UNDEAD)) borg_skill[BI_WS_UNDEAD] = TRUE; if (of_has(item->flags, OF_SLAY_DEMON)) borg_skill[BI_WS_DEMON] = TRUE; if (of_has(item->flags, OF_SLAY_ORC)) borg_skill[BI_WS_ORC] = TRUE; if (of_has(item->flags, OF_SLAY_TROLL)) borg_skill[BI_WS_TROLL] = TRUE; if (of_has(item->flags, OF_SLAY_GIANT)) borg_skill[BI_WS_GIANT] = TRUE; if (of_has(item->flags, OF_SLAY_DRAGON)) borg_skill[BI_WS_DRAGON] = TRUE; if (of_has(item->flags, OF_KILL_UNDEAD)) borg_skill[BI_WK_UNDEAD] = TRUE; if (of_has(item->flags, OF_KILL_DEMON)) borg_skill[BI_WK_DEMON] = TRUE; if (of_has(item->flags, OF_KILL_DRAGON)) borg_skill[BI_WK_DRAGON] = TRUE; if (of_has(item->flags, OF_IMPACT)) borg_skill[BI_W_IMPACT] = TRUE; if (of_has(item->flags, OF_BRAND_ACID)) borg_skill[BI_WB_ACID] = TRUE; if (of_has(item->flags, OF_BRAND_ELEC)) borg_skill[BI_WB_ELEC] = TRUE; if (of_has(item->flags, OF_BRAND_FIRE)) borg_skill[BI_WB_FIRE] = TRUE; if (of_has(item->flags, OF_BRAND_COLD)) borg_skill[BI_WB_COLD] = TRUE; if (of_has(item->flags, OF_BRAND_POIS)) borg_skill[BI_WB_POIS] = TRUE; /* Affect infravision */ if (of_has(item->flags, OF_INFRA)) borg_skill[BI_INFRA] += item->pval; /* Affect stealth */ if (of_has(item->flags, OF_STEALTH)) borg_skill[BI_STL] += item->pval; /* Affect searching ability (factor of five) */ if (of_has(item->flags, OF_SEARCH)) borg_skill[BI_SRCH] += (item->pval * 5); /* Affect searching frequency (factor of five) */ if (of_has(item->flags, OF_SEARCH)) borg_skill[BI_SRCHFREQ] += (item->pval * 5); /* Affect digging (factor of 20) */ if (of_has(item->flags, OF_TUNNEL)) borg_skill[BI_DIG] += (item->pval * 20); /* Affect speed */ if (of_has(item->flags, OF_SPEED)) borg_skill[BI_SPEED] += item->pval; /* Affect blows */ if (of_has(item->flags, OF_BLOWS)) extra_blows += item->pval; /* Boost shots */ if (of_has(item->flags, OF_SHOTS)) extra_shots++; /* Boost might */ if (of_has(item->flags, OF_MIGHT)) extra_might++; /* Various flags */ if (of_has(item->flags, OF_SLOW_DIGEST)) borg_skill[BI_SDIG] = TRUE; if (of_has(item->flags, OF_AGGRAVATE)) borg_skill[BI_CRSAGRV] = TRUE; if (of_has(item->flags, OF_TELEPORT)) borg_skill[BI_CRSTELE] = TRUE; if (of_has(item->flags, OF_IMPAIR_HP)) borg_skill[BI_CRSHPIMP] = TRUE; if (of_has(item->flags, OF_IMPAIR_MANA)) borg_skill[BI_CRSMPIMP] = TRUE; if (of_has(item->flags, OF_AFRAID)) { borg_skill[BI_CRSFEAR] = TRUE; } if (of_has(item->flags, OF_VULN_FIRE)) borg_skill[BI_CRSFVULN] = TRUE; if (of_has(item->flags, OF_VULN_ACID)) borg_skill[BI_CRSAVULN] = TRUE; if (of_has(item->flags, OF_VULN_COLD)) borg_skill[BI_CRSCVULN] = TRUE; if (of_has(item->flags, OF_VULN_ELEC)) borg_skill[BI_CRSEVULN] = TRUE; if (of_has(item->flags, OF_REGEN)) borg_skill[BI_REG] = TRUE; if (of_has(item->flags, OF_TELEPATHY)) borg_skill[BI_ESP] = TRUE; if (of_has(item->flags, OF_SEE_INVIS)) borg_skill[BI_SINV] = TRUE; if (of_has(item->flags, OF_FEATHER)) borg_skill[BI_FEATH] = TRUE; if (of_has(item->flags, OF_FREE_ACT)) borg_skill[BI_FRACT] = TRUE; if (of_has(item->flags, OF_HOLD_LIFE)) borg_skill[BI_HLIFE] = TRUE; /* Item makes player glow or has a light radius */ if (of_has(item->flags, OF_LIGHT)) { /* Special case for Torches/Lantern of Brightness, they are not perm. */ if (item->tval != TV_LIGHT && item->sval != SV_LIGHT_TORCH && item->sval != SV_LIGHT_LANTERN) borg_skill[BI_LIGHT] ++; } /* Artifact-- borgs do not gain the knowlege of some flags until * after the *ID*. So we allow the borg to know that the * item does have lite even if its not *ID* */ if ((item->name1 >=1 && item->name1 <= 3) || /* Phial, Star, Arkenstone */ item->name1 == 7 || /* Planatir */ item->name1 == 14 || /* Elfstone */ item->name1 == 15) /* Jewel */ borg_skill[BI_LIGHT] ++; /* Immunity flags */ /* if you are immune you automaticly resist */ if (of_has(item->flags, OF_IM_FIRE)) { borg_skill[BI_IFIRE] = TRUE; borg_skill[BI_RFIRE] = TRUE; borg_skill[BI_TRFIRE] = TRUE; } if (of_has(item->flags, OF_IM_ACID)) { borg_skill[BI_IACID] = TRUE; borg_skill[BI_RACID] = TRUE; borg_skill[BI_TRACID] = TRUE; } if (of_has(item->flags, OF_IM_COLD)) { borg_skill[BI_ICOLD] = TRUE; borg_skill[BI_RCOLD] = TRUE; borg_skill[BI_TRCOLD] = TRUE; } if (of_has(item->flags, OF_IM_ELEC)) { borg_skill[BI_IELEC] = TRUE; borg_skill[BI_RELEC] = TRUE; borg_skill[BI_TRELEC] = TRUE; } /* Resistance flags */ if (of_has(item->flags, OF_RES_ACID)) borg_skill[BI_RACID] = TRUE; if (of_has(item->flags, OF_RES_ELEC)) borg_skill[BI_RELEC] = TRUE; if (of_has(item->flags, OF_RES_FIRE)) borg_skill[BI_RFIRE] = TRUE; if (of_has(item->flags, OF_RES_COLD)) borg_skill[BI_RCOLD] = TRUE; if (of_has(item->flags, OF_RES_POIS)) borg_skill[BI_RPOIS] = TRUE; if (of_has(item->flags, OF_RES_CONFU)) borg_skill[BI_RCONF] = TRUE; if (of_has(item->flags, OF_RES_SOUND)) borg_skill[BI_RSND] = TRUE; if (of_has(item->flags, OF_RES_LIGHT)) borg_skill[BI_RLITE] = TRUE; if (of_has(item->flags, OF_RES_DARK)) borg_skill[BI_RDARK] = TRUE; if (of_has(item->flags, OF_RES_CHAOS)) borg_skill[BI_RKAOS] = TRUE; if (of_has(item->flags, OF_RES_DISEN)) borg_skill[BI_RDIS] = TRUE; if (of_has(item->flags, OF_RES_SHARD)) borg_skill[BI_RSHRD] = TRUE; if (of_has(item->flags, OF_RES_NEXUS)) borg_skill[BI_RNXUS] = TRUE; if (of_has(item->flags, OF_RES_BLIND)) borg_skill[BI_RBLIND] = TRUE; if (of_has(item->flags, OF_RES_NETHR)) borg_skill[BI_RNTHR] = TRUE; /* Sustain flags */ if (of_has(item->flags, OF_SUST_STR)) borg_skill[BI_SSTR] = TRUE; if (of_has(item->flags, OF_SUST_INT)) borg_skill[BI_SINT] = TRUE; if (of_has(item->flags, OF_SUST_WIS)) borg_skill[BI_SWIS] = TRUE; if (of_has(item->flags, OF_SUST_DEX)) borg_skill[BI_SDEX] = TRUE; if (of_has(item->flags, OF_SUST_CON)) borg_skill[BI_SCON] = TRUE; /* Hack -- Net-zero The borg will miss read acid damaged items such as * Leather Gloves [2,-2] and falsely assume they help his power. * this hack rewrites the bonus to an extremely negative value * thus encouraging him to remove the non-helpful-non-harmful but * heavy-none-the-less item. */ if ((!item->name1 && !item->name2) && item->ac >= 1 && item->to_a + item->ac <= 0) { item->to_a = -20; } /* Modify the base armor class */ borg_skill[BI_ARMOR] += item->ac; /* Apply the bonuses to armor class */ borg_skill[BI_ARMOR] += item->to_a; /* Hack -- do not apply "weapon" bonuses */ if (i == INVEN_WIELD) continue; /* Hack -- do not apply "bow" bonuses */ if (i == INVEN_BOW) continue; /* Apply the bonuses to hit/damage */ borg_skill[BI_TOHIT] += item->to_h; borg_skill[BI_TODAM] += item->to_d; } /* Update "stats" */ for (i = 0; i < 6; i++) { int add, use, ind; add = my_stat_add[i]; /* Modify the stats for race/class */ add += (p_ptr->race->r_adj[i] + p_ptr->class->c_adj[i]); /* Extract the new "use_stat" value for the stat */ use = modify_stat_value(my_stat_cur[i], add); /* Save the stat */ my_stat_use[i] = use; /* Values: 3, ..., 17 */ if (use <= 18) ind = (use - 3); /* Ranges: 18/00-18/09, ..., 18/210-18/219 */ else if (use <= 18+219) ind = (15 + (use - 18) / 10); /* Range: 18/220+ */ else ind = (37); /* Save the index */ if (ind > 37) my_stat_ind[i] = 37; else my_stat_ind[i] = ind; borg_skill[BI_STR+i] = my_stat_ind[i]; borg_skill[BI_CSTR+i] = borg_stat[i]; } /* 'Mana' is actually the 'mana adjustment' */ if (p_ptr->class->spell_book == TV_PRAYER_BOOK) { borg_skill[BI_SP_ADJ] = ((adj_mag_mana[my_stat_ind[A_WIS]] * borg_skill[BI_CLEVEL]) / 2); borg_skill[BI_FAIL1] = adj_mag_stat[my_stat_ind[A_WIS]]; borg_skill[BI_FAIL2] = adj_mag_fail[my_stat_ind[A_WIS]]; } if (p_ptr->class->spell_book == TV_MAGIC_BOOK) { borg_skill[BI_SP_ADJ] = ((adj_mag_mana[my_stat_ind[A_INT]] * borg_skill[BI_CLEVEL]) / 2); borg_skill[BI_FAIL1] = adj_mag_stat[my_stat_ind[A_INT]]; borg_skill[BI_FAIL2] = adj_mag_fail[my_stat_ind[A_INT]]; } /* Bloating slows the player down (a little) */ if (borg_skill[BI_ISGORGED]) borg_skill[BI_SPEED] -= 10; /* Actual Modifier Bonuses (Un-inflate stat bonuses) */ borg_skill[BI_ARMOR] += ((int)(adj_dex_ta[my_stat_ind[A_DEX]]) - 128); borg_skill[BI_TODAM] += ((int)(adj_str_td[my_stat_ind[A_STR]]) - 128); borg_skill[BI_TOHIT] += ((int)(adj_dex_th[my_stat_ind[A_DEX]]) - 128); borg_skill[BI_TOHIT] += ((int)(adj_str_th[my_stat_ind[A_STR]]) - 128); /* Obtain the "hold" value */ hold = adj_str_hold[my_stat_ind[A_STR]]; /** Examine the "current bow" **/ item = &borg_items[INVEN_BOW]; /* attacking with bare hands */ if (item->iqty == 0) { item->ds = 0; item->dd = 0; item->to_d = 0; item->to_h = 0; item->weight = 0; } /* Real bonuses */ borg_skill[BI_BTOHIT] = item->to_h; borg_skill[BI_BTODAM] = item->to_d; /* It is hard to carholdry a heavy bow */ if (hold < item->weight / 10) { borg_skill[BI_HEAVYBOW] = TRUE; /* Hard to wield a heavy bow */ borg_skill[BI_TOHIT] += 2 * (hold - item->weight / 10); } /* Compute "extra shots" if needed */ if (item->iqty && (hold >= item->weight / 10)) { /* Take note of required "tval" for missiles */ switch (item->sval) { case SV_SLING: my_ammo_tval = TV_SHOT; my_ammo_sides = 3; my_ammo_power = 2; break; case SV_SHORT_BOW: my_ammo_tval = TV_ARROW; my_ammo_sides = 4; my_ammo_power = 2; break; case SV_LONG_BOW: my_ammo_tval = TV_ARROW; my_ammo_sides = 4; my_ammo_power = 3; break; case SV_LIGHT_XBOW: my_ammo_tval = TV_BOLT; my_ammo_sides = 5; my_ammo_power = 3; break; case SV_HEAVY_XBOW: my_ammo_tval = TV_BOLT; my_ammo_sides = 5; my_ammo_power = 4; break; } /* Add in extra power */ my_ammo_power += extra_might; /* Hack -- Reward High Level Rangers using Bows */ if (player_has(PF_EXTRA_SHOT) && (my_ammo_tval == TV_ARROW)) { /* Extra shot at level 20 */ if (borg_skill[BI_CLEVEL] >= 20) my_num_fire++; /* Extra shot at level 40 */ if (borg_skill[BI_CLEVEL] >= 40) my_num_fire++; } /* Add in the "bonus shots" */ my_num_fire += extra_shots; /* Require at least one shot */ if (my_num_fire < 1) my_num_fire = 1; } borg_skill[BI_SHOTS] = my_num_fire; /* Calculate "average" damage per "normal" shot (times 2) */ borg_skill[BI_BMAXDAM] = (my_ammo_sides + borg_skill[BI_BTODAM]) * my_ammo_power; borg_skill[BI_BMAXDAM] *= borg_skill[BI_SHOTS]; /* Examine the "main weapon" */ item = &borg_items[INVEN_WIELD]; /* attacking with bare hands */ if (item->iqty == 0) { item->ds = 0; item->dd = 0; item->to_d = 0; item->to_h = 0; item->weight = 0; } /* Real values */ borg_skill[BI_WTOHIT] = item->to_h; borg_skill[BI_WTODAM] = item->to_d; /* It is hard to hold a heavy weapon */ if (hold < item->weight / 10) { borg_skill[BI_HEAVYWEPON] = TRUE; /* Hard to wield a heavy weapon */ borg_skill[BI_TOHIT] += 2 * (hold - item->weight / 10); } /* Normal weapons */ if (item->iqty && (hold >= item->weight / 10)) { int str_index, dex_index; int div; /* Enforce a minimum "weight" (tenth pounds) */ div = ((item->weight < p_ptr->class->min_weight) ? p_ptr->class->min_weight : item->weight); /* Get the strength vs weight */ str_index = (adj_str_blow[my_stat_ind[A_STR]] * p_ptr->class->att_multiply / div); /* Maximal value */ if (str_index > 11) str_index = 11; /* Index by dexterity */ dex_index = (adj_dex_blow[my_stat_ind[A_DEX]]); /* Maximal value */ if (dex_index > 11) dex_index = 11; /* Use the blows table */ borg_skill[BI_BLOWS] = blows_table[str_index][dex_index]; /* Maximal value */ if (borg_skill[BI_BLOWS] > p_ptr->class->max_attacks) borg_skill[BI_BLOWS] = p_ptr->class->max_attacks; /* Add in the "bonus blows" */ borg_skill[BI_BLOWS] += extra_blows; /* Require at least one blow */ if (borg_skill[BI_BLOWS] < 1) borg_skill[BI_BLOWS] = 1; /* Boost digging skill by weapon weight */ borg_skill[BI_DIG] += (item->weight / 10); } /* Calculate "max" damage per "normal" blow */ /* and assume we can enchant up to +8 if borg_skill[BI_CLEVEL] > 25 */ borg_skill[BI_WMAXDAM] = (item->dd * item->ds + borg_skill[BI_TODAM] + borg_skill[BI_WTODAM]); /* Calculate base damage, used to calculating slays */ borg_skill[BI_WBASEDAM] = (item->dd * item->ds); /* Hack -- Reward High Level Warriors with Res Fear */ if (player_has(PF_BRAVERY_30)) { /* Resist fear at level 30 */ if (borg_skill[BI_CLEVEL] >= 30) borg_skill[BI_RFEAR] = TRUE; } /* Affect Skill -- stealth (bonus one) */ borg_skill[BI_STL] += 1; /* Affect Skill -- disarming (DEX and INT) */ borg_skill[BI_DIS] += adj_dex_dis[my_stat_ind[A_DEX]]; borg_skill[BI_DIS] += adj_int_dis[my_stat_ind[A_INT]]; /* Affect Skill -- magic devices (INT) */ borg_skill[BI_DEV] += adj_int_dev[my_stat_ind[A_INT]]; /* Affect Skill -- saving throw (WIS) */ borg_skill[BI_SAV] += adj_wis_sav[my_stat_ind[A_WIS]]; /* Affect Skill -- digging (STR) */ borg_skill[BI_DIG] += adj_str_dig[my_stat_ind[A_STR]]; /* Affect Skill -- disarming (Level, by Class) */ borg_skill[BI_DIS] += (cb_ptr->x_skills[SKILL_DISARM] * borg_skill[BI_MAXCLEVEL] / 10); /* Affect Skill -- magic devices (Level, by Class) */ borg_skill[BI_DEV] += (cb_ptr->x_skills[SKILL_DEVICE] * borg_skill[BI_MAXCLEVEL] / 10); /* Affect Skill -- saving throw (Level, by Class) */ borg_skill[BI_SAV] += (cb_ptr->x_skills[SKILL_SAVE] * borg_skill[BI_MAXCLEVEL] / 10); /* Affect Skill -- stealth (Level, by Class) */ borg_skill[BI_STL] += (cb_ptr->x_skills[SKILL_STEALTH] * borg_skill[BI_MAXCLEVEL] / 10); /* Affect Skill -- search ability (Level, by Class) */ borg_skill[BI_SRCH] += (cb_ptr->x_skills[SKILL_SEARCH] * borg_skill[BI_MAXCLEVEL] / 10); /* Affect Skill -- search frequency (Level, by Class) */ borg_skill[BI_SRCHFREQ] += (cb_ptr->x_skills[SKILL_SEARCH_FREQUENCY] * borg_skill[BI_MAXCLEVEL] / 10); /* Affect Skill -- combat (normal) (Level, by Class) */ borg_skill[BI_THN] += (cb_ptr->x_skills[SKILL_TO_HIT_MELEE] * borg_skill[BI_MAXCLEVEL] / 10); /* Affect Skill -- combat (shooting) (Level, by Class) */ borg_skill[BI_THB] += (cb_ptr->x_skills[SKILL_TO_HIT_BOW] * borg_skill[BI_MAXCLEVEL] / 10); /* Affect Skill -- combat (throwing) (Level, by Class) */ borg_skill[BI_THT] += (cb_ptr->x_skills[SKILL_TO_HIT_THROW] * borg_skill[BI_MAXCLEVEL] / 10); /* Limit Skill -- stealth from 0 to 30 */ if (borg_skill[BI_STL] > 30) borg_skill[BI_STL] = 30; if (borg_skill[BI_STL] < 0) borg_skill[BI_STL] = 0; /* Limit Skill -- digging from 1 up */ if (borg_skill[BI_DIG] < 1) borg_skill[BI_DIG] = 1; /*** Some penalties to consider ***/ /* Fear from spell or effect or flag */ if (borg_skill[BI_ISAFRAID] || borg_skill[BI_CRSFEAR]) { borg_skill[BI_TOHIT] -= 20; borg_skill[BI_ARMOR] += 8; borg_skill[BI_DEV] = borg_skill[BI_DEV] * 95 / 100; } /* priest weapon penalty for non-blessed edged weapons */ if (player_has(PF_BLESS_WEAPON) && ((item->tval == TV_SWORD || item->tval == TV_POLEARM) && !of_has(item->flags, OF_BLESSED))) { /* Reduce the real bonuses */ borg_skill[BI_TOHIT] -= 2; borg_skill[BI_TODAM] -= 2; } /*** Count needed enchantment ***/ /* Assume no enchantment needed */ my_need_enchant_to_a = 0; my_need_enchant_to_h = 0; my_need_enchant_to_d = 0; my_need_brand_weapon = 0; /* Hack -- enchant all the equipment (weapons) */ for (i = INVEN_WIELD; i <= INVEN_BOW; i++) { item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip "unknown" items */ if (!item->ident) continue; /* Most classes store the enchants until they get * a 3x shooter (like a long bow). * --Important: Also look in borg7.c for the enchanting. * --We do not want the bow enchanted by mistake. */ if (i == INVEN_BOW && /* bow */ my_ammo_power < 3 && /* 3x shooter */ (!item->name1 && !item->name2)) /* Not Ego or Artifact */ continue; /* Enchant all weapons (to hit) */ if ((borg_prayer_legal_fail(7, 3, 65) || borg_spell_legal_fail(7, 3, 65) || amt_enchant_weapon >=1 ) ) { if (item->to_h < borg_enchant_limit) { my_need_enchant_to_h += (borg_enchant_limit - item->to_h); } /* Enchant all weapons (to damage) */ if (item->to_d < borg_enchant_limit) { my_need_enchant_to_d += (borg_enchant_limit - item->to_d); } } else /* I dont have the spell or *enchant* */ { if (item->to_h < 8) { my_need_enchant_to_h += (8 - item->to_h); } /* Enchant all weapons (to damage) */ if (item->to_d < 8) { my_need_enchant_to_d += (8 - item->to_d); } } } /* Hack -- enchant all the equipment (armor) */ for (i = INVEN_BODY; i <= INVEN_FEET; i++) { item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip "unknown" items */ if (!item->ident) continue; /* Note need for enchantment */ if ((borg_prayer_legal_fail(7, 4, 65) || borg_spell_legal_fail(7, 2, 65) || amt_enchant_armor >=1 )) { if (item->to_a < borg_enchant_limit) { my_need_enchant_to_a += (borg_enchant_limit - item->to_a); } } else { if (item->to_a < 8) { my_need_enchant_to_a += (8 - item->to_a); } } } /* Examine the lite */ item = &borg_items[INVEN_LIGHT]; /* Assume normal lite radius */ borg_skill[BI_CURLITE] = 0; /* Glowing player has light */ if (borg_skill[BI_LIGHT]) borg_skill[BI_CURLITE] = borg_skill[BI_LIGHT]; /* Lite */ if (item->tval == TV_LIGHT) { if (of_has(item->flags, OF_LIGHT)) borg_skill[BI_CURLITE] = borg_skill[BI_CURLITE] + item->pval; } /* Special way to handle See Inv */ if (borg_see_inv >= 1) borg_skill[BI_SINV] = TRUE; if (borg_skill[BI_CDEPTH] == 0 && /* only in town. Allow him to recall down */ (borg_prayer_legal(2, 3) || borg_spell_legal(2, 6))) borg_skill[BI_SINV] = TRUE; /* Very special handling of Free Action. * If the person has perfect Savings throw, he can be * considered ok on Free Action. This can free up an * equipment slot. */ if (borg_skill[BI_SAV] >= 100) borg_skill[BI_FRACT] = TRUE; /* Special case for RBlindness. Perfect saves and the * resistances for light and dark are good enough for RBlind */ if (borg_skill[BI_SAV] >= 100 && borg_skill[BI_RDARK] && borg_skill[BI_RLITE]) borg_skill[BI_RBLIND] = TRUE; /*** Quiver needs to be evaluated ***/ /* Hack -- ignore invalid missiles */ for (i = QUIVER_START; i < QUIVER_END; i++) { item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) break; if (item->tval != my_ammo_tval) continue; /* Count missiles */ borg_skill[BI_AMISSILES] += item->iqty; /* Only enchant ammo if we have a good shooter, * otherwise, store the enchants in the home. */ if (my_ammo_power >= 3) { if ((borg_equips_artifact(EF_FIREBRAND) || borg_spell_legal_fail(7, 5, 65)) && item->iqty >=5 && /* Skip artifacts and ego-items */ !item->name2 && !item->name1 && item->ident && item->tval == my_ammo_tval) { my_need_brand_weapon +=10L; } /* if we have loads of cash (as we will at level 35), */ /* enchant missiles */ if (borg_skill[BI_CLEVEL] > 35) { if ((borg_spell_legal_fail(7, 3, 65) || borg_prayer_legal_fail(7, 3, 65)) && item->iqty >= 5) { if (item->to_h < 10) { my_need_enchant_to_h += (10 - item->to_h); } if (item->to_d < 10) { my_need_enchant_to_d += (10 - item->to_d); } } else { if (item->to_h < 8) { my_need_enchant_to_h += (8 - item->to_h); } if (item->to_d < 8) { my_need_enchant_to_d += (8 - item->to_d); } } } } /* Ammo Power > 3 */ } /* Quiver */ } /* * Helper function -- notice the player inventory */ static void borg_notice_aux2(void) { int i; borg_item *item; /*** Reset counters ***/ /* Reset basic */ amt_food_lowcal = 0; amt_food_hical = 0; /* Reset healing */ amt_slow_poison =0; amt_cure_confusion = 0; amt_cure_blind = 0; /* Reset stat potions */ for (i = 0; i < 6; i++) amt_inc_stat[i] = 0; /* Reset books */ amt_book[0] = 0; amt_book[1] = 0; amt_book[2] = 0; amt_book[3] = 0; amt_book[4] = 0; amt_book[5] = 0; amt_book[6] = 0; amt_book[7] = 0; amt_book[8] = 0; /* Reset various */ amt_add_stat[A_STR] = 0; amt_add_stat[A_INT] = 0; amt_add_stat[A_WIS] = 0; amt_add_stat[A_DEX] = 0; amt_add_stat[A_CON] = 0; amt_fix_stat[A_STR] = 0; amt_fix_stat[A_INT] = 0; amt_fix_stat[A_WIS] = 0; amt_fix_stat[A_DEX] = 0; amt_fix_stat[A_CON] = 0; amt_fix_stat[6] = 0; amt_fix_exp = 0; amt_cool_staff = 0; amt_cool_wand = 0; amt_digger = 0; /* Reset enchantment */ amt_enchant_to_a = 0; amt_enchant_to_d = 0; amt_enchant_to_h = 0; amt_brand_weapon = 0; amt_enchant_weapon = 0; amt_enchant_armor = 0; /* Reset number of Ego items needing *ID* */ amt_ego = 0; /*** Process the inventory ***/ /* Scan the inventory */ for (i = 0; i < INVEN_MAX_PACK; i++) { item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Does the borg need to get an ID for it? */ if (item->note && (strstr(item->note, "magical") || strstr(item->note, "special") || strstr(item->note, "ego") ||streq(item->note, "splendid") ||streq(item->note, "excellent"))) my_need_id ++; /* Hack -- skip un-aware items */ if (!item->kind) continue; /* count up the items on the borg (do not count artifacts */ /* that are not being wielded) */ borg_has[item->kind] += item->iqty; /* Analyze the item */ switch (item->tval) { /* Books */ case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: /* Skip incorrect books */ if (item->tval != p_ptr->class->spell_book) break; /* Count the books */ amt_book[item->sval] += item->iqty; break; /* Food */ case TV_FOOD: /* Analyze */ switch (item->sval) { case SV_FOOD_WAYBREAD: amt_food_hical += item->iqty; break; case SV_FOOD_RATION: amt_food_hical += item->iqty; break; case SV_FOOD_SLIME_MOLD: amt_food_lowcal += item->iqty; break; case SV_FOOD_PURGING: /* We don't count the shrooms until level 10, they clutter the inventory too much. * The borg will store them in the house. */ if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] >= borg_munchkin_level) { amt_fix_stat[A_STR] += item->iqty; amt_fix_stat[A_CON] += item->iqty; borg_skill[BI_ACUREPOIS] += item->iqty; } break; case SV_FOOD_RESTORING: if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] >= borg_munchkin_level) { amt_fix_stat[A_STR] += item->iqty; amt_fix_stat[A_INT] += item->iqty; amt_fix_stat[A_WIS] += item->iqty; amt_fix_stat[A_DEX] += item->iqty; amt_fix_stat[A_CON] += item->iqty; amt_fix_stat[6] += item->iqty; } break; case SV_FOOD_CURE_MIND: if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] >= borg_munchkin_level) { amt_cure_confusion += item->iqty; } break; case SV_FOOD_FAST_RECOVERY: if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] >= borg_munchkin_level) { amt_cure_blind += item->iqty; borg_skill[BI_ACUREPOIS] += item->iqty; } break; case SV_FOOD_SECOND_SIGHT: case SV_FOOD_EMERGENCY: case SV_FOOD_TERROR: case SV_FOOD_STONESKIN: case SV_FOOD_DEBILITY: case SV_FOOD_SPRINTING: if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] >= borg_munchkin_level) { borg_skill[BI_ASHROOM] +=item->iqty; } break; } break; /* Potions */ case TV_POTION: /* Analyze */ switch (item->sval) { case SV_POTION_HEALING: borg_skill[BI_AHEAL] += item->iqty; break; case SV_POTION_STAR_HEALING: borg_skill[BI_AEZHEAL] += item->iqty; break; case SV_POTION_LIFE: borg_skill[BI_ALIFE] += item->iqty; break; case SV_POTION_CURE_CRITICAL: borg_skill[BI_ACCW] += item->iqty; break; case SV_POTION_CURE_SERIOUS: borg_skill[BI_ACSW] += item->iqty; break; case SV_POTION_CURE_LIGHT: borg_skill[BI_ACLW] += item->iqty; break; case SV_POTION_CURE_POISON: borg_skill[BI_ACUREPOIS] += item->iqty; break; case SV_POTION_RESIST_HEAT: borg_skill[BI_ARESHEAT] += item->iqty; break; case SV_POTION_RESIST_COLD: borg_skill[BI_ARESCOLD] += item->iqty; break; case SV_POTION_RESIST_POIS: borg_skill[BI_ARESPOIS] += item->iqty; break; case SV_POTION_INC_STR: amt_inc_stat[A_STR] += item->iqty; break; case SV_POTION_INC_INT: amt_inc_stat[A_INT] += item->iqty; break; case SV_POTION_INC_WIS: amt_inc_stat[A_WIS] += item->iqty; break; case SV_POTION_INC_DEX: amt_inc_stat[A_DEX] += item->iqty; break; case SV_POTION_INC_CON: amt_inc_stat[A_CON] += item->iqty; break; case SV_POTION_INC_ALL: amt_inc_stat[A_STR] += item->iqty; amt_inc_stat[A_INT] += item->iqty; amt_inc_stat[A_WIS] += item->iqty; amt_inc_stat[A_DEX] += item->iqty; amt_inc_stat[A_CON] += item->iqty; break; case SV_POTION_RES_STR: amt_fix_stat[A_STR] += item->iqty; break; case SV_POTION_RES_INT: amt_fix_stat[A_INT] += item->iqty; break; case SV_POTION_RES_WIS: amt_fix_stat[A_WIS] += item->iqty; break; case SV_POTION_RES_DEX: amt_fix_stat[A_DEX] += item->iqty; break; case SV_POTION_RES_CON: amt_fix_stat[A_CON] += item->iqty; break; case SV_POTION_RESTORE_EXP: amt_fix_exp += item->iqty; break; case SV_POTION_SPEED: borg_skill[BI_ASPEED] += item->iqty; break; case SV_POTION_DETONATIONS: borg_skill[BI_ADETONATE] += item->iqty; break; } break; /* Scrolls */ case TV_SCROLL: /* Analyze the scroll */ switch (item->sval) { case SV_SCROLL_IDENTIFY: borg_skill[BI_AID] += item->iqty; break; case SV_SCROLL_RECHARGING: borg_skill[BI_ARECHARGE] += item->iqty; break; case SV_SCROLL_PHASE_DOOR: borg_skill[BI_APHASE] += item->iqty; break; case SV_SCROLL_TELEPORT: borg_skill[BI_ATELEPORT] += item->iqty; break; case SV_SCROLL_WORD_OF_RECALL: borg_skill[BI_RECALL] += item->iqty; break; case SV_SCROLL_ENCHANT_ARMOR: amt_enchant_to_a += item->iqty; break; case SV_SCROLL_ENCHANT_WEAPON_TO_HIT: amt_enchant_to_h += item->iqty; break; case SV_SCROLL_ENCHANT_WEAPON_TO_DAM: amt_enchant_to_d += item->iqty; break; case SV_SCROLL_STAR_ENCHANT_WEAPON: amt_enchant_weapon += item->iqty; break; case SV_SCROLL_PROTECTION_FROM_EVIL: borg_skill[BI_APFE] += item->iqty; break; case SV_SCROLL_STAR_ENCHANT_ARMOR: amt_enchant_armor += item->iqty; break; case SV_SCROLL_RUNE_OF_PROTECTION: borg_skill[BI_AGLYPH] += item->iqty; break; case SV_SCROLL_TELEPORT_LEVEL: borg_skill[BI_ATELEPORTLVL] += item->iqty; borg_skill[BI_ATELEPORT] += 1; break; case SV_SCROLL_MASS_BANISHMENT: borg_skill[BI_AMASSBAN] += item->iqty; break; } break; /* Rods */ case TV_ROD: /* Analyze */ switch (item->sval) { case SV_ROD_IDENTIFY: if (borg_activate_failure(item->tval, item->sval) < 500) { borg_skill[BI_AID] += item->iqty * 100; } else { borg_skill[BI_AID] += item->iqty; } break; case SV_ROD_RECALL: /* Don't count on it if I suck at activations */ if (borg_activate_failure(item->tval, item->sval) < 500) { borg_skill[BI_RECALL] += item->iqty * 100; } else { borg_skill[BI_RECALL] += item->iqty; } break; case SV_ROD_DETECT_TRAP: borg_skill[BI_ADETTRAP] += item->iqty * 100; break; case SV_ROD_DETECT_DOOR: borg_skill[BI_ADETDOOR] += item->iqty * 100; break; case SV_ROD_DETECTION: borg_skill[BI_ADETTRAP] += item->iqty * 100; borg_skill[BI_ADETDOOR] += item->iqty * 100; borg_skill[BI_ADETEVIL] += item->iqty * 100; break; case SV_ROD_ILLUMINATION: borg_skill[BI_ALITE] += item->iqty * 100; break; case SV_ROD_SPEED: /* Don't count on it if I suck at activations */ if (borg_activate_failure(item->tval, item->sval) < 500) { borg_skill[BI_ASPEED] += item->iqty * 100; } else { borg_skill[BI_ASPEED] += item->iqty; } break; case SV_ROD_MAPPING: borg_skill[BI_AMAGICMAP] += item->iqty * 100; break; case SV_ROD_HEALING: /* only +2 per rod because of long charge time. */ /* Don't count on it if I suck at activations */ if (borg_activate_failure(item->tval, item->sval) < 500) { borg_skill[BI_AHEAL] += item->iqty * 3; } else { borg_skill[BI_AHEAL] += item->iqty + 1; } break; case SV_ROD_LIGHT: case SV_ROD_FIRE_BOLT: case SV_ROD_ELEC_BOLT: case SV_ROD_COLD_BOLT: case SV_ROD_ACID_BOLT: { borg_skill[BI_AROD1] += item->iqty; break; } case SV_ROD_DRAIN_LIFE: case SV_ROD_FIRE_BALL: case SV_ROD_ELEC_BALL: case SV_ROD_COLD_BALL: case SV_ROD_ACID_BALL: { borg_skill[BI_AROD2] += item->iqty; break; } } break; /* Wands */ case TV_WAND: /* Analyze each */ if (item->sval == SV_WAND_TELEPORT_AWAY) { borg_skill[BI_ATPORTOTHER] += item->pval; } if (item->sval == SV_WAND_STINKING_CLOUD && borg_skill[BI_MAXDEPTH] < 30) { amt_cool_wand += item->pval; } if (item->sval == SV_WAND_MAGIC_MISSILE && borg_skill[BI_MAXDEPTH] < 30) { amt_cool_wand += item->pval; } if (item->sval == SV_WAND_ANNIHILATION) { amt_cool_wand += item->pval; } break; /* Staffs */ case TV_STAFF: /* Analyze */ switch (item->sval) { case SV_STAFF_IDENTIFY: if (borg_skill[BI_MAXDEPTH] <= 95) { borg_skill[BI_AID] += item->pval * item->iqty; } break; case SV_STAFF_TELEPORTATION: if (borg_skill[BI_MAXDEPTH] <= 95) { borg_skill[BI_AESCAPE] += (item->iqty); if (borg_activate_failure(item->tval, item->sval) < 500) { borg_skill[BI_AESCAPE] += item->pval; } } break; case SV_STAFF_SPEED: if (borg_skill[BI_MAXDEPTH] <= 95) borg_skill[BI_ASPEED] += item->pval; break; case SV_STAFF_HEALING: borg_skill[BI_AHEAL] += item->pval; break; case SV_STAFF_THE_MAGI: borg_skill[BI_ASTFMAGI] += item->pval; break; case SV_STAFF_DESTRUCTION: borg_skill[BI_ASTFDEST] +=item->pval; break; case SV_STAFF_POWER: amt_cool_staff +=item->iqty; break; case SV_STAFF_HOLINESS: amt_cool_staff +=item->iqty; borg_skill[BI_AHEAL] +=item->pval; break; } break; /* Flasks */ case TV_FLASK: /* Use as fuel if we equip a lantern */ if (borg_items[INVEN_LIGHT].sval == SV_LIGHT_LANTERN) borg_skill[BI_AFUEL] += item->iqty; /* Count as Missiles */ if (borg_skill[BI_CLEVEL] < 15 ) borg_skill[BI_AMISSILES] += item->iqty; break; /* Torches */ case TV_LIGHT: /* Use as fuel if it is a torch and we carry a torch */ if ((item->sval == SV_LIGHT_TORCH && item->timeout >= 1) && (borg_items[INVEN_LIGHT].sval == SV_LIGHT_TORCH) && borg_items[INVEN_LIGHT].iqty) { borg_skill[BI_AFUEL] += item->iqty; } break; /* Weapons */ case TV_HAFTED: case TV_POLEARM: case TV_SWORD: /* These items are checked a bit later in a sub routine * to notice the flags. It is done outside this switch. */ break; /* Shovels and such */ case TV_DIGGING: /* Hack -- ignore worthless ones (including cursed) */ if (item->value <= 0) break; if (item->cursed) break; /* Do not carry if weak, won't be able to dig anyway */ if (borg_skill[BI_DIG] < BORG_DIG) break; amt_digger += item->iqty; break; /* Missiles */ case TV_SHOT: case TV_ARROW: case TV_BOLT: /* Hack -- ignore invalid missiles */ if (item->tval != my_ammo_tval) break; /* Hack -- ignore worthless missiles */ if (item->value <= 0) break; /* Count plain missiles */ if (!item->name2) borg_skill[BI_AMISSILES] += item->iqty; /* Only enchant ammo if we have a good shooter, * otherwise, store the enchants in the home. */ if (my_ammo_power < 3) break; if ((borg_equips_artifact(EF_FIREBRAND) || borg_spell_legal_fail(7, 5, 65)) && item->iqty >=5 && /* Skip artifacts and ego-items */ !item->name1 && !item->name2 && item->ident && item->tval == my_ammo_tval) { my_need_brand_weapon +=10L; } /* if we have loads of cash (as we will at level 35), */ /* enchant missiles */ if (borg_skill[BI_CLEVEL] > 35) { if ((borg_spell_legal_fail(7, 3, 65) || borg_prayer_legal_fail(7, 3, 65)) && item->iqty >= 5) { if (item->to_h < 10) { my_need_enchant_to_h += (10 - item->to_h); } if (item->to_d < 10) { my_need_enchant_to_d += (10 - item->to_d); } } else { if (item->to_h < 8) { my_need_enchant_to_h += (8 - item->to_h); } if (item->to_d < 8) { my_need_enchant_to_d += (8 - item->to_d); } } } break; } } /*** Process the Spells and Prayers ***/ /* artifact activations are accounted here * But some artifacts are not counted for two reasons . * 1. Some spells-powers are needed instantly and are considered in * the borg preparation code. An artifact maybe non-charged at the * moment he needes it. Then he would need the spell and not be able * to cast it. (ie. teleport, phase) * 2. An artifact may grant a power then he assumes he has infinite * amounts. He then sells off his scrolls with the duplicate power. * When it comes time to upgrade and swap out the artifact, he wont * because his power drops since he does not have the scrolls anymore. * and he does not buy items first. * * A possible solution would be to have him keep a few scrolls as a * back-up, or to remove the bonus for level preparation from borg_power. * Right now I think it is better that he not consider the artifacts * Whose powers are considered in borg_prep. */ /* Handle "satisfy hunger" -> infinite food */ if (borg_spell_legal_fail(2, 0, 80) || borg_prayer_legal_fail(1, 5, 80)) { borg_skill[BI_FOOD] += 1000; } /* Handle "identify" -> infinite identifies */ if (borg_spell_legal(2, 5) || borg_prayer_legal(5, 2) || borg_equips_artifact(EF_IDENTIFY)) { borg_skill[BI_AID] += 1000; } /* Handle "detect traps" */ if (borg_prayer_legal(0, 5)) { borg_skill[BI_ADETTRAP] = 1000; } /* Handle "detect doors" */ if (borg_prayer_legal(0, 6)) { borg_skill[BI_ADETDOOR] = 1000; } /* Handle "detect evil & monsters" */ if (borg_prayer_legal(0, 0) || borg_spell_legal(0, 1)) { borg_skill[BI_ADETEVIL] = 1000; } /* Handle "detection" */ if (borg_prayer_legal(5, 1) || borg_equips_artifact(EF_DETECT_ALL)) { borg_skill[BI_ADETDOOR] = 1000; borg_skill[BI_ADETTRAP] = 1000; borg_skill[BI_ADETEVIL] = 1000; } /* Handle "See Invisible" in a special way. */ if (borg_prayer_legal(2, 3)/* || borg_spell_legal(2, 6)*/) { borg_skill[BI_DINV] = TRUE; } /* Handle "magic mapping" */ if (borg_prayer_legal(2, 6) || borg_equips_artifact(EF_MAPPING)) { borg_skill[BI_ADETDOOR] = 1000; borg_skill[BI_ADETTRAP] = 1000; borg_skill[BI_AMAGICMAP] = 1000; } /* Handle "call lite" */ if (borg_prayer_legal(0, 4) || borg_equips_artifact(EF_ILLUMINATION) || borg_equips_artifact(EF_CLAIRVOYANCE) || borg_spell_legal(0, 3)) { borg_skill[BI_ALITE] += 1000; } /* Handle "protection from evil" */ if (borg_prayer_legal(2, 4) || borg_equips_artifact(EF_PROTEVIL)) { borg_skill[BI_APFE] += 1000; } /* Handle "rune of protection" glyph" */ if (borg_prayer_legal(3, 4) || borg_spell_legal(6, 4)) { borg_skill[BI_AGLYPH] += 1000; } /* Handle "detect traps/doors" */ if (borg_spell_legal(0, 7)) { borg_skill[BI_ADETDOOR] = 1000; borg_skill[BI_ADETTRAP] = 1000; } /* Handle "enchant weapon" */ if (borg_spell_legal_fail(7, 3, 65) || borg_prayer_legal_fail(7, 3, 65)) { amt_enchant_to_h += 1000; amt_enchant_to_d += 1000; amt_enchant_weapon +=1000; } /* Handle "Brand Weapon (bolts)" */ if (borg_equips_artifact(EF_FIREBRAND) || borg_spell_legal_fail(7, 5, 65)) { amt_brand_weapon += 1000; } /* Handle "enchant armor" */ if (borg_spell_legal_fail(7, 2, 65) || borg_prayer_legal_fail(7, 4, 65)) { amt_enchant_to_a += 1000; amt_enchant_armor +=1000; } /* Handle Diggers (stone to mud) */ if (borg_spell_legal_fail(2, 2, 40) || borg_equips_artifact(EF_STONE_TO_MUD) || borg_equips_ring(SV_RING_DELVING)) { amt_digger += 1; } /* Handle recall */ if (borg_prayer_legal_fail(4, 4, 40) || borg_spell_legal_fail(6, 3,40) || (borg_skill[BI_CDEPTH] == 100 && (borg_prayer_legal(4, 4) || borg_spell_legal(6, 3)))) { borg_skill[BI_RECALL] += 1000; } if (borg_equips_artifact(EF_RECALL)) { borg_skill[BI_RECALL] += 1; } /* Handle teleport_level */ if (borg_prayer_legal_fail(4, 3, 20) || borg_spell_legal_fail(6, 2, 20)) { borg_skill[BI_ATELEPORTLVL] += 1000; } /* Handle PhaseDoor spell carefully */ if (borg_prayer_legal_fail(4, 0, 3) || borg_spell_legal_fail(0, 2, 3)) { borg_skill[BI_APHASE] += 1000; } if (borg_equips_artifact(EF_TELE_PHASE)) { borg_skill[BI_APHASE] += 1; } /* Handle teleport spell carefully */ if (borg_prayer_legal_fail(1, 1, 1) || borg_prayer_legal_fail(4, 1, 1) || borg_spell_legal_fail(1, 5, 1)) { borg_skill[BI_ATELEPORT] += 1000; } if (borg_equips_artifact(EF_TELE_LONG)) { borg_skill[BI_AESCAPE] += 1; borg_skill[BI_ATELEPORT] += 1; } /* Handle teleport away */ if (borg_prayer_legal_fail(4, 2, 40) || borg_spell_legal_fail(3, 1,40)) { borg_skill[BI_ATPORTOTHER] += 1000; } /* Handle Holy Word prayer just to see if legal */ if (borg_prayer_legal(3, 5)) { borg_skill[BI_AHWORD] += 1000; } /* speed spells HASTE*/ if ( borg_spell_legal( 3, 2 ) || borg_equips_artifact(EF_HASTE1) || borg_equips_artifact(EF_HASTE2)) { borg_skill[BI_ASPEED] += 1000; } /* Handle "cure light wounds" */ if (borg_equips_artifact(EF_CURE_SERIOUS)) { borg_skill[BI_ACSW] += 1000; } /* Handle "heal" */ if (borg_equips_artifact(EF_HEAL1) || borg_equips_artifact(EF_HEAL2) || borg_prayer_legal(3, 2) || borg_prayer_legal(6, 2)) { borg_skill[BI_AHEAL] += 1000; } /* Handle "fix exp" */ if (borg_equips_artifact(EF_RESTORE_LIFE)) { amt_fix_exp += 1000; } /* Handle "Remembrance" -- is just as good as Hold Life */ if (borg_prayer_legal(6, 4) || borg_equips_artifact(EF_RESTORE_LIFE)) { borg_skill[BI_HLIFE] = TRUE; } /* Handle "recharge" */ if (borg_equips_artifact(EF_RECHARGE) || borg_spell_legal(7,4) || borg_prayer_legal(7,1) || borg_spell_legal(2, 1)) { borg_skill[BI_ARECHARGE] += 1000; } /*** Process the Needs ***/ /* No need for fuel if we know it doesn't need it */ if (of_has(borg_items[INVEN_LIGHT].flags, OF_NO_FUEL)) borg_skill[BI_AFUEL] += 1000; /* No need to *buy* stat increase potions */ if (my_stat_cur[A_STR] >= (18+100) + 10 * (p_ptr->race->r_adj[A_STR] + p_ptr->class->c_adj[A_STR])) amt_add_stat[A_STR] += 1000; if (my_stat_cur[A_INT] >= (18+100) + 10 * (p_ptr->race->r_adj[A_INT] + p_ptr->class->c_adj[A_INT])) amt_add_stat[A_INT] += 1000; if (my_stat_cur[A_WIS] >= (18+100) + 10 * (p_ptr->race->r_adj[A_WIS] + p_ptr->class->c_adj[A_WIS])) amt_add_stat[A_WIS] += 1000; if (my_stat_cur[A_DEX] >= (18+100) + 10 * (p_ptr->race->r_adj[A_DEX] + p_ptr->class->c_adj[A_DEX])) amt_add_stat[A_DEX] += 1000; if (my_stat_cur[A_CON] >= (18+100) + 10 * (p_ptr->race->r_adj[A_CON] + p_ptr->class->c_adj[A_CON])) amt_add_stat[A_CON] += 1000; /* No need to *buy* stat repair potions */ if (!borg_skill[BI_ISFIXSTR]) amt_fix_stat[A_STR] += 1000; if (!borg_skill[BI_ISFIXINT]) amt_fix_stat[A_INT] += 1000; if (!borg_skill[BI_ISFIXWIS]) amt_fix_stat[A_WIS] += 1000; if (!borg_skill[BI_ISFIXDEX]) amt_fix_stat[A_DEX] += 1000; if (!borg_skill[BI_ISFIXCON]) amt_fix_stat[A_CON] += 1000; /* No need for experience repair */ if (!borg_skill[BI_ISFIXEXP]) amt_fix_exp += 1000; /* Correct the high and low calorie foods */ borg_skill[BI_FOOD] += amt_food_hical; if (amt_food_hical <= 3) borg_skill[BI_FOOD] += amt_food_lowcal; /* If weak, do not count food spells */ if (borg_skill[BI_ISWEAK] && (borg_skill[BI_FOOD] >= 1000)) borg_skill[BI_FOOD] -= 1000; } /* * Helper function -- notice the player swap weapon */ void borg_notice_weapon_swap(void) { int i; int b_i = 0; s32b v =-1L; s32b b_v = 0L; int dam, damage; borg_item *item; weapon_swap =0; /*** Process the inventory ***/ for (i = 0; i < INVEN_MAX_PACK; i++) { item = &borg_items[i]; /* reset counter */ v= -1L; dam =0; damage =0; /* Skip empty items */ if (!item->iqty) continue; /* Hack -- skip un-aware items */ if (!item->kind) continue; /* Skip non-wearable items */ if (borg_slot(item->tval, item->sval) == -1) continue; /* Dont carry swaps until dlevel 50. They are heavy. Unless the item is a digger, then carry it */ if (borg_skill[BI_MAXDEPTH] < 50 && item->tval !=TV_DIGGING) continue; /* priest weapon penalty for non-blessed edged weapons */ if (player_has(PF_BLESS_WEAPON) && (item->tval == TV_SWORD || item->tval == TV_POLEARM) && !of_has(item->flags, OF_BLESSED)) continue; /* Require ID, "known" (or average, good, etc) */ if (!item->ident && !streq(item->note, "magical") && !streq(item->note, "excellent") && !streq(item->note, "ego") && !streq(item->note, "splendid") && !streq(item->note, "terrible") && !streq(item->note, "special")) continue; /* Clear all the swap weapon flags as I look at each one. */ weapon_swap_digger = 0; weapon_swap_slay_animal = FALSE; weapon_swap_slay_evil = FALSE; weapon_swap_slay_undead = FALSE; weapon_swap_slay_demon = FALSE; weapon_swap_slay_orc = FALSE; weapon_swap_slay_troll = FALSE; weapon_swap_slay_giant = FALSE; weapon_swap_slay_dragon = FALSE; weapon_swap_kill_undead = FALSE; weapon_swap_kill_demon = FALSE; weapon_swap_kill_dragon = FALSE; weapon_swap_impact = FALSE; weapon_swap_brand_acid = FALSE; weapon_swap_brand_elec = FALSE; weapon_swap_brand_fire = FALSE; weapon_swap_brand_cold = FALSE; weapon_swap_brand_pois = FALSE; weapon_swap_see_infra = FALSE; weapon_swap_slow_digest = FALSE; weapon_swap_aggravate = FALSE; weapon_swap_teleport = FALSE; weapon_swap_regenerate = FALSE; weapon_swap_telepathy = FALSE; weapon_swap_LIGHT = FALSE; weapon_swap_see_invis = FALSE; weapon_swap_ffall = FALSE; weapon_swap_free_act = FALSE; weapon_swap_hold_life = FALSE; weapon_swap_immune_fire = FALSE; weapon_swap_immune_acid = FALSE; weapon_swap_immune_cold = FALSE; weapon_swap_immune_elec = FALSE; weapon_swap_resist_acid = FALSE; weapon_swap_resist_elec = FALSE; weapon_swap_resist_fire = FALSE; weapon_swap_resist_cold = FALSE; weapon_swap_resist_pois = FALSE; weapon_swap_resist_conf = FALSE; weapon_swap_resist_sound = FALSE; weapon_swap_resist_LIGHT = FALSE; weapon_swap_resist_dark = FALSE; weapon_swap_resist_chaos = FALSE; weapon_swap_resist_disen = FALSE; weapon_swap_resist_shard = FALSE; weapon_swap_resist_nexus = FALSE; weapon_swap_resist_blind = FALSE; weapon_swap_resist_neth = FALSE; decurse_weapon_swap =-1; /* Analyze the item */ switch (item->tval) { /* weapons */ case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_DIGGING: { /* Digging */ if (of_has(item->flags, OF_TUNNEL)) { /* Don't notice digger if we can turn stone to mud, * or I am using one. */ /* Hack -- ignore worthless ones (including cursed) */ if (item->value <= 0) break; if (item->cursed) break; if (!borg_spell_legal_fail(2, 2, 40) && !of_has(borg_items[INVEN_WIELD].flags, OF_TUNNEL)) weapon_swap_digger = item->pval; } /* various slays */ if (of_has(item->flags, OF_SLAY_ANIMAL)) weapon_swap_slay_animal = TRUE; if (of_has(item->flags, OF_SLAY_EVIL)) weapon_swap_slay_evil = TRUE; if (of_has(item->flags, OF_SLAY_UNDEAD)) weapon_swap_slay_undead = TRUE; if (of_has(item->flags, OF_SLAY_DEMON)) weapon_swap_slay_demon = TRUE; if (of_has(item->flags, OF_SLAY_ORC)) weapon_swap_slay_orc = TRUE; if (of_has(item->flags, OF_SLAY_TROLL)) weapon_swap_slay_troll = TRUE; if (of_has(item->flags, OF_SLAY_GIANT)) weapon_swap_slay_giant = TRUE; if (of_has(item->flags, OF_SLAY_DRAGON)) weapon_swap_slay_dragon = TRUE; if (of_has(item->flags, OF_KILL_UNDEAD)) weapon_swap_slay_undead = TRUE; if (of_has(item->flags, OF_KILL_DEMON)) weapon_swap_slay_demon = TRUE; if (of_has(item->flags, OF_KILL_DRAGON)) weapon_swap_kill_dragon = TRUE; if (of_has(item->flags, OF_IMPACT)) weapon_swap_impact = TRUE; if (of_has(item->flags, OF_BRAND_ACID)) weapon_swap_brand_acid = TRUE; if (of_has(item->flags, OF_BRAND_ELEC)) weapon_swap_brand_elec = TRUE; if (of_has(item->flags, OF_BRAND_FIRE)) weapon_swap_brand_fire = TRUE; if (of_has(item->flags, OF_BRAND_COLD)) weapon_swap_brand_cold = TRUE; if (of_has(item->flags, OF_BRAND_POIS)) weapon_swap_brand_pois = TRUE; /* Affect infravision */ if (of_has(item->flags, OF_INFRA)) weapon_swap_see_infra += item->pval; /* Affect speed */ /* Various flags */ if (of_has(item->flags, OF_SLOW_DIGEST)) weapon_swap_slow_digest = TRUE; if (of_has(item->flags, OF_AGGRAVATE)) weapon_swap_aggravate = TRUE; if (of_has(item->flags, OF_TELEPORT)) weapon_swap_teleport = TRUE; if (of_has(item->flags, OF_REGEN)) weapon_swap_regenerate = TRUE; if (of_has(item->flags, OF_TELEPATHY)) weapon_swap_telepathy = TRUE; if (of_has(item->flags, OF_LIGHT)) weapon_swap_LIGHT = TRUE; if (of_has(item->flags, OF_SEE_INVIS)) weapon_swap_see_invis = TRUE; if (of_has(item->flags, OF_FEATHER)) weapon_swap_ffall = TRUE; if (of_has(item->flags, OF_FREE_ACT)) weapon_swap_free_act = TRUE; if (of_has(item->flags, OF_HOLD_LIFE)) weapon_swap_hold_life = TRUE; /* Immunity flags */ /* if you are immune you automaticly resist */ if (of_has(item->flags, OF_IM_FIRE)) { weapon_swap_immune_fire = TRUE; weapon_swap_resist_fire = TRUE; } if (of_has(item->flags, OF_IM_ACID)) { weapon_swap_immune_acid = TRUE; weapon_swap_resist_acid = TRUE; } if (of_has(item->flags, OF_IM_COLD)) { weapon_swap_immune_cold = TRUE; weapon_swap_resist_cold = TRUE; } if (of_has(item->flags, OF_IM_ELEC)) { weapon_swap_immune_elec = TRUE; weapon_swap_resist_elec = TRUE; } /* Resistance flags */ if (of_has(item->flags, OF_RES_ACID)) weapon_swap_resist_acid = TRUE; if (of_has(item->flags, OF_RES_ELEC)) weapon_swap_resist_elec = TRUE; if (of_has(item->flags, OF_RES_FIRE)) weapon_swap_resist_fire = TRUE; if (of_has(item->flags, OF_RES_COLD)) weapon_swap_resist_cold = TRUE; if (of_has(item->flags, OF_RES_POIS)) weapon_swap_resist_pois = TRUE; if (of_has(item->flags, OF_RES_CONFU)) weapon_swap_resist_conf = TRUE; if (of_has(item->flags, OF_RES_SOUND)) weapon_swap_resist_sound = TRUE; if (of_has(item->flags, OF_RES_LIGHT)) weapon_swap_resist_LIGHT = TRUE; if (of_has(item->flags, OF_RES_DARK)) weapon_swap_resist_dark = TRUE; if (of_has(item->flags, OF_RES_CHAOS)) weapon_swap_resist_chaos = TRUE; if (of_has(item->flags, OF_RES_DISEN)) weapon_swap_resist_disen = TRUE; if (of_has(item->flags, OF_RES_SHARD)) weapon_swap_resist_shard = TRUE; if (of_has(item->flags, OF_RES_NEXUS)) weapon_swap_resist_nexus = TRUE; if (of_has(item->flags, OF_RES_BLIND)) weapon_swap_resist_blind = TRUE; if (of_has(item->flags, OF_RES_NETHR)) weapon_swap_resist_neth = TRUE; if (item->cursed) decurse_weapon_swap = 0; if (of_has(item->flags, OF_HEAVY_CURSE)) decurse_weapon_swap = 1; /* Sustain flags */ /* calculating the value of the swap weapon. */ damage = (item->dd * (item->ds) *25L); /* Reward "damage" and increased blows per round*/ v += damage * (borg_skill[BI_BLOWS]+1); /* Reward "bonus to hit" */ v += ((borg_skill[BI_TOHIT] + item->to_h)*100L); /* Reward "bonus to dam" */ v += ((borg_skill[BI_TODAM] + item->to_d)*75L); dam = damage * borg_skill[BI_BLOWS]; /* assume 2x base damage for x% of creatures */ dam = damage * 2 * borg_skill[BI_BLOWS]; /* rewared SAnimal if no electric brand */ if (!borg_skill[BI_WS_ANIMAL] && !borg_skill[BI_WB_ELEC] && weapon_swap_slay_animal) v += (dam*2) /2; if (!borg_skill[BI_WS_EVIL] && weapon_swap_slay_evil) v += (dam*7) /2; /* assume 3x base damage for x% of creatures */ dam = damage *3*borg_skill[BI_BLOWS]; /* half of the reward now for SOrc and STroll*/ if (!borg_skill[BI_WS_ORC] && weapon_swap_slay_orc) v += (dam*1) /2; if (!borg_skill[BI_WS_TROLL] && weapon_swap_slay_troll) v += (dam*2) /2; if (!borg_skill[BI_WS_UNDEAD] && weapon_swap_slay_undead) v += (dam*5) /2; if (!borg_skill[BI_WS_DEMON] && weapon_swap_slay_demon) v += (dam*3) /2; if (!borg_skill[BI_WS_GIANT] && weapon_swap_slay_giant) v += (dam*4) /2; if (!borg_skill[BI_WS_DRAGON] && !borg_skill[BI_WK_DRAGON] && weapon_swap_slay_dragon) v += (dam*6) /2; if (!borg_skill[BI_WB_ACID] && weapon_swap_brand_acid) v += (dam*4) /2; if (!borg_skill[BI_WB_ELEC] && weapon_swap_brand_elec) v += (dam*5) /2; if (!borg_skill[BI_WB_FIRE] && weapon_swap_brand_fire) v += (dam*3) /2; if (!borg_skill[BI_WB_COLD] && weapon_swap_brand_cold) v += (dam*3) /2; if (!borg_skill[BI_WB_POIS] && weapon_swap_brand_pois) v += (dam*3) /2; /* Orcs and Trolls get the second half of the reward if SEvil is not possesed. */ if (!borg_skill[BI_WS_ORC] && !borg_skill[BI_WS_EVIL] && weapon_swap_slay_orc) v += (dam*1) /2; if (!borg_skill[BI_WS_TROLL] && !borg_skill[BI_WS_EVIL] && weapon_swap_slay_troll) v += (dam*1) /2; /* assume 5x base damage for x% of creatures */ dam = damage * 5 * borg_skill[BI_BLOWS]; if (!borg_skill[BI_WK_UNDEAD] && weapon_swap_kill_undead) v += (dam*5) /2; if (!borg_skill[BI_WK_DEMON] && weapon_swap_kill_demon) v += (dam*5) /2; if (!borg_skill[BI_WK_DRAGON] && weapon_swap_kill_dragon) v += (dam*5) /2; /* reward the Tunnel factor when low level */ if (borg_skill[BI_MAXDEPTH] <= 40 && borg_skill[BI_MAXDEPTH] >= 25 && borg_gold < 100000 && weapon_swap_digger) v += (weapon_swap_digger * 3500L) + 1000L; /* Other Skills */ if (!borg_skill[BI_SDIG] && weapon_swap_slow_digest) v += 10L; if (weapon_swap_aggravate) v -= 8000L; if (weapon_swap_teleport) v -= 100000L; if (decurse_weapon_swap != -1) v -= 5000L; if (!borg_skill[BI_REG] && weapon_swap_regenerate) v += 2000L; if (!borg_skill[BI_ESP] && weapon_swap_telepathy) v += 5000L; if (!borg_skill[BI_LIGHT] && weapon_swap_LIGHT) v += 2000L; if (!borg_skill[BI_SINV] && weapon_swap_see_invis) v += 50000L; if (!borg_skill[BI_FEATH] && weapon_swap_ffall) v += 10L; if (!borg_skill[BI_FRACT] && weapon_swap_free_act) v += 10000L; if (!borg_skill[BI_HLIFE] && (borg_skill[BI_MAXCLEVEL] < 50) && weapon_swap_hold_life) v += 2000L; if (!borg_skill[BI_IFIRE] && weapon_swap_immune_fire) v += 70000L; if (!borg_skill[BI_IACID] && weapon_swap_immune_acid) v += 30000L; if (!borg_skill[BI_ICOLD] && weapon_swap_immune_cold) v += 50000L; if (!borg_skill[BI_IELEC] && weapon_swap_immune_elec) v += 25000L; if (!borg_skill[BI_RFIRE] && weapon_swap_resist_fire) v += 8000L; if (!borg_skill[BI_RACID] && weapon_swap_resist_acid) v += 6000L; if (!borg_skill[BI_RCOLD] && weapon_swap_resist_cold) v += 4000L; if (!borg_skill[BI_RELEC] && weapon_swap_resist_elec) v += 3000L; /* extra bonus for getting all basic resist */ if (weapon_swap_resist_fire && weapon_swap_resist_acid && weapon_swap_resist_elec && weapon_swap_resist_cold) v += 10000L; if (!borg_skill[BI_RPOIS] && weapon_swap_resist_pois) v += 20000L; if (!borg_skill[BI_RCONF] && weapon_swap_resist_conf) v += 5000L; if (!borg_skill[BI_RSND] && weapon_swap_resist_sound) v += 2000L; if (!borg_skill[BI_RLITE] && weapon_swap_resist_LIGHT) v += 800L; if (!borg_skill[BI_RDARK] && weapon_swap_resist_dark) v += 800L; if (!borg_skill[BI_RKAOS] && weapon_swap_resist_chaos) v += 8000L; if (!borg_skill[BI_RDIS] && weapon_swap_resist_disen) v += 5000L; if (!borg_skill[BI_RSHRD] && weapon_swap_resist_shard) v += 100L; if (!borg_skill[BI_RNXUS] && weapon_swap_resist_nexus) v += 100L; if (!borg_skill[BI_RBLIND] && weapon_swap_resist_blind) v += 5000L; if (!borg_skill[BI_RNTHR] && weapon_swap_resist_neth) v += 5500L; if (!borg_skill[BI_RFEAR] && weapon_swap_resist_fear) v += 5500L; /* Special concern if Tarrasque is alive */ if (borg_skill[BI_MAXDEPTH] >= 75 && ((!borg_skill[BI_ICOLD] && weapon_swap_immune_cold) || (!borg_skill[BI_IFIRE] && weapon_swap_immune_fire))) { /* If Tarraseque is alive */ if (borg_race_death[539] == 0) { if (!borg_skill[BI_ICOLD] && weapon_swap_immune_cold) v += 90000L; if (!borg_skill[BI_IFIRE] && weapon_swap_immune_fire) v += 90000L; } } /* Mega-Hack -- resists (level 60) */ /* its possible that he will get a sword and a cloak * both with the same high resist and keep each based * on that resist. We want him to check to see * that the other swap does not already have the high resist. */ if (!borg_skill[BI_RNTHR] && (borg_skill[BI_MAXDEPTH]+1 >= 55) && weapon_swap_resist_neth) v += 100000L; if (!borg_skill[BI_RKAOS] && (borg_skill[BI_MAXDEPTH]+1 >= 60) && weapon_swap_resist_chaos) v += 100000L; if (!borg_skill[BI_RDIS] && (borg_skill[BI_MAXDEPTH]+1 >= 60) && weapon_swap_resist_disen) v += 100000L; /* some artifacts would make good back ups for their activation */ /* skip usless ones */ if (v <= 1000) continue; /* collect the best one */ if (v < b_v) continue; /* track it */ b_i = i; b_v = v; } } } /* mark the swap item and its value */ weapon_swap_value = b_v; weapon_swap = b_i; /* Now that we know who the best swap is lets set our swap * flags and get a move on */ /*** Process the best inven item ***/ item = &borg_items[b_i]; /* Clear all the swap weapon flags as I look at each one. */ weapon_swap_slay_animal = FALSE; weapon_swap_slay_evil = FALSE; weapon_swap_slay_undead = FALSE; weapon_swap_slay_demon = FALSE; weapon_swap_slay_orc = FALSE; weapon_swap_slay_troll = FALSE; weapon_swap_slay_giant = FALSE; weapon_swap_slay_dragon = FALSE; weapon_swap_kill_undead = FALSE; weapon_swap_kill_demon = FALSE; weapon_swap_kill_dragon = FALSE; weapon_swap_impact = FALSE; weapon_swap_brand_acid = FALSE; weapon_swap_brand_elec = FALSE; weapon_swap_brand_fire = FALSE; weapon_swap_brand_cold = FALSE; weapon_swap_brand_pois = FALSE; weapon_swap_see_infra = FALSE; weapon_swap_slow_digest = FALSE; weapon_swap_aggravate = FALSE; weapon_swap_teleport = FALSE; weapon_swap_regenerate = FALSE; weapon_swap_telepathy = FALSE; weapon_swap_LIGHT = FALSE; weapon_swap_see_invis = FALSE; weapon_swap_ffall = FALSE; weapon_swap_free_act = FALSE; weapon_swap_hold_life = FALSE; weapon_swap_immune_fire = FALSE; weapon_swap_immune_acid = FALSE; weapon_swap_immune_cold = FALSE; weapon_swap_immune_elec = FALSE; weapon_swap_resist_acid = FALSE; weapon_swap_resist_elec = FALSE; weapon_swap_resist_fire = FALSE; weapon_swap_resist_cold = FALSE; weapon_swap_resist_pois = FALSE; weapon_swap_resist_conf = FALSE; weapon_swap_resist_sound = FALSE; weapon_swap_resist_LIGHT = FALSE; weapon_swap_resist_dark = FALSE; weapon_swap_resist_chaos = FALSE; weapon_swap_resist_disen = FALSE; weapon_swap_resist_shard = FALSE; weapon_swap_resist_nexus = FALSE; weapon_swap_resist_blind = FALSE; weapon_swap_resist_neth = FALSE; decurse_weapon_swap = -1; /* Assume no enchantment needed */ enchant_weapon_swap_to_h = 0; enchant_weapon_swap_to_d = 0; /* Enchant swap weapons (to hit) */ if ((borg_prayer_legal_fail(7, 3, 65) || borg_spell_legal_fail(7, 3, 65) || amt_enchant_weapon >=1 ) && item->tval != TV_DIGGING) { if (item->to_h < 10) { enchant_weapon_swap_to_h += (10 - item->to_h); } /* Enchant my swap (to damage) */ if (item->to_d < 10) { enchant_weapon_swap_to_d += (10 - item->to_d); } } else if (item->tval != TV_DIGGING) { if (item->to_h < 8) { enchant_weapon_swap_to_h += (8 - item->to_h); } /* Enchant my swap (to damage) */ if (item->to_d < 8) { enchant_weapon_swap_to_d += (8 - item->to_d); } } /* various slays */ if (of_has(item->flags, OF_SLAY_ANIMAL)) weapon_swap_slay_animal = TRUE; if (of_has(item->flags, OF_SLAY_EVIL)) weapon_swap_slay_evil = TRUE; if (of_has(item->flags, OF_SLAY_UNDEAD)) weapon_swap_slay_undead = TRUE; if (of_has(item->flags, OF_SLAY_DEMON)) weapon_swap_slay_demon = TRUE; if (of_has(item->flags, OF_SLAY_ORC)) weapon_swap_slay_orc = TRUE; if (of_has(item->flags, OF_SLAY_TROLL)) weapon_swap_slay_troll = TRUE; if (of_has(item->flags, OF_SLAY_GIANT)) weapon_swap_slay_giant = TRUE; if (of_has(item->flags, OF_SLAY_DRAGON)) weapon_swap_slay_dragon = TRUE; if (of_has(item->flags, OF_KILL_UNDEAD)) weapon_swap_kill_undead = TRUE; if (of_has(item->flags, OF_KILL_DEMON)) weapon_swap_kill_demon = TRUE; if (of_has(item->flags, OF_KILL_DRAGON)) weapon_swap_kill_dragon = TRUE; if (of_has(item->flags, OF_IMPACT)) weapon_swap_impact = TRUE; if (of_has(item->flags, OF_BRAND_ACID)) weapon_swap_brand_acid = TRUE; if (of_has(item->flags, OF_BRAND_ELEC)) weapon_swap_brand_elec = TRUE; if (of_has(item->flags, OF_BRAND_FIRE)) weapon_swap_brand_fire = TRUE; if (of_has(item->flags, OF_BRAND_COLD)) weapon_swap_brand_cold = TRUE; if (of_has(item->flags, OF_BRAND_POIS)) weapon_swap_brand_pois = TRUE; /* Affect infravision */ if (of_has(item->flags, OF_INFRA)) weapon_swap_see_infra += item->pval; /* Affect various skills */ /* Affect speed */ /* Various flags */ if (of_has(item->flags, OF_SLOW_DIGEST)) weapon_swap_slow_digest = TRUE; if (of_has(item->flags, OF_AGGRAVATE)) weapon_swap_aggravate = TRUE; if (of_has(item->flags, OF_TELEPORT)) weapon_swap_teleport = TRUE; if (of_has(item->flags, OF_REGEN)) weapon_swap_regenerate = TRUE; if (of_has(item->flags, OF_TELEPATHY)) weapon_swap_telepathy = TRUE; if (of_has(item->flags, OF_LIGHT)) weapon_swap_LIGHT = TRUE; if (of_has(item->flags, OF_SEE_INVIS)) weapon_swap_see_invis = TRUE; if (of_has(item->flags, OF_FEATHER)) weapon_swap_ffall = TRUE; if (of_has(item->flags, OF_FREE_ACT)) weapon_swap_free_act = TRUE; if (of_has(item->flags, OF_HOLD_LIFE)) weapon_swap_hold_life = TRUE; /* Immunity flags */ /* if you are immune you automaticly resist */ if (of_has(item->flags, OF_IM_FIRE)) { weapon_swap_immune_fire = TRUE; weapon_swap_resist_fire = TRUE; } if (of_has(item->flags, OF_IM_ACID)) { weapon_swap_immune_acid = TRUE; weapon_swap_resist_acid = TRUE; } if (of_has(item->flags, OF_IM_COLD)) { weapon_swap_immune_cold = TRUE; weapon_swap_resist_cold = TRUE; } if (of_has(item->flags, OF_IM_ELEC)) { weapon_swap_immune_elec = TRUE; weapon_swap_resist_elec = TRUE; } /* Resistance flags */ if (of_has(item->flags, OF_RES_ACID)) weapon_swap_resist_acid = TRUE; if (of_has(item->flags, OF_RES_ELEC)) weapon_swap_resist_elec = TRUE; if (of_has(item->flags, OF_RES_FIRE)) weapon_swap_resist_fire = TRUE; if (of_has(item->flags, OF_RES_COLD)) weapon_swap_resist_cold = TRUE; if (of_has(item->flags, OF_RES_POIS)) weapon_swap_resist_pois = TRUE; if (of_has(item->flags, OF_RES_CONFU)) weapon_swap_resist_conf = TRUE; if (of_has(item->flags, OF_RES_SOUND)) weapon_swap_resist_sound = TRUE; if (of_has(item->flags, OF_RES_LIGHT)) weapon_swap_resist_LIGHT = TRUE; if (of_has(item->flags, OF_RES_DARK)) weapon_swap_resist_dark = TRUE; if (of_has(item->flags, OF_RES_CHAOS)) weapon_swap_resist_chaos = TRUE; if (of_has(item->flags, OF_RES_DISEN)) weapon_swap_resist_disen = TRUE; if (of_has(item->flags, OF_RES_SHARD)) weapon_swap_resist_shard = TRUE; if (of_has(item->flags, OF_RES_NEXUS)) weapon_swap_resist_nexus = TRUE; if (of_has(item->flags, OF_RES_BLIND)) weapon_swap_resist_blind = TRUE; if (of_has(item->flags, OF_RES_NETHR)) weapon_swap_resist_neth = TRUE; if (item->cursed) decurse_weapon_swap = 0; if (of_has(item->flags, OF_HEAVY_CURSE)) decurse_weapon_swap = 1; } /* * Helper function -- notice the player swap armour */ void borg_notice_armour_swap(void) { int i; int b_i = 0; s32b v = -1L; s32b b_v = 0L; int dam, damage; borg_item *item; armour_swap = 0; /* borg option to not use them */ if (!borg_uses_swaps) return; /*** Process the inventory ***/ for (i = 0; i < INVEN_MAX_PACK; i++) { item = &borg_items[i]; /* reset counter */ v= -1L; dam =0; damage =0; /* Skip empty items */ if (!item->iqty) continue; /* Hack -- skip un-aware items */ if (!item->kind) continue; /* Skip non-wearable items */ if (borg_slot(item->tval, item->sval) == -1) continue; /* Dont carry swaps until dlevel 50. They are heavy */ if (borg_skill[BI_MAXDEPTH] < 50) continue; /* Require "known" (or average, good, etc) */ if (!item->ident && !strstr(item->note, "magical") && !strstr(item->note, "ego") && !strstr(item->note, "splendid") && !strstr(item->note, "excellent") && !strstr(item->note, "terrible") && !strstr(item->note, "special")) continue; /* One Ring is not a swap */ if (item->activation == EF_BIZARRE) continue; /* Clear all the swap weapon flags as I look at each one. */ armour_swap_slay_animal = FALSE; armour_swap_slay_evil = FALSE; armour_swap_slay_undead = FALSE; armour_swap_slay_demon = FALSE; armour_swap_slay_orc = FALSE; armour_swap_slay_troll = FALSE; armour_swap_slay_giant = FALSE; armour_swap_slay_dragon = FALSE; armour_swap_kill_undead = FALSE; armour_swap_kill_demon = FALSE; armour_swap_kill_dragon = FALSE; armour_swap_impact = FALSE; armour_swap_brand_acid = FALSE; armour_swap_brand_elec = FALSE; armour_swap_brand_fire = FALSE; armour_swap_brand_cold = FALSE; armour_swap_brand_pois = FALSE; armour_swap_see_infra = FALSE; armour_swap_slow_digest = FALSE; armour_swap_aggravate = FALSE; armour_swap_teleport = FALSE; armour_swap_regenerate = FALSE; armour_swap_telepathy = FALSE; armour_swap_LIGHT = FALSE; armour_swap_see_invis = FALSE; armour_swap_ffall = FALSE; armour_swap_free_act = FALSE; armour_swap_hold_life = FALSE; armour_swap_immune_fire = FALSE; armour_swap_immune_acid = FALSE; armour_swap_immune_cold = FALSE; armour_swap_immune_elec = FALSE; armour_swap_resist_acid = FALSE; armour_swap_resist_elec = FALSE; armour_swap_resist_fire = FALSE; armour_swap_resist_cold = FALSE; armour_swap_resist_pois = FALSE; armour_swap_resist_conf = FALSE; armour_swap_resist_sound = FALSE; armour_swap_resist_LIGHT = FALSE; armour_swap_resist_dark = FALSE; armour_swap_resist_chaos = FALSE; armour_swap_resist_disen = FALSE; armour_swap_resist_shard = FALSE; armour_swap_resist_nexus = FALSE; armour_swap_resist_blind = FALSE; armour_swap_resist_neth = FALSE; decurse_armour_swap = -1; /* Analyze the item */ switch (item->tval) { /* ARMOUR TYPE STUFF */ case TV_RING: case TV_AMULET: case TV_BOOTS: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { /* various slays */ /* as of 280, armours dont have slays but random artifacts might. */ if (of_has(item->flags, OF_SLAY_ANIMAL)) armour_swap_slay_animal = TRUE; if (of_has(item->flags, OF_SLAY_EVIL)) armour_swap_slay_evil = TRUE; if (of_has(item->flags, OF_SLAY_UNDEAD)) armour_swap_slay_undead = TRUE; if (of_has(item->flags, OF_SLAY_DEMON)) armour_swap_slay_demon = TRUE; if (of_has(item->flags, OF_SLAY_ORC)) armour_swap_slay_orc = TRUE; if (of_has(item->flags, OF_SLAY_TROLL)) armour_swap_slay_troll = TRUE; if (of_has(item->flags, OF_SLAY_GIANT)) armour_swap_slay_giant = TRUE; if (of_has(item->flags, OF_SLAY_DRAGON)) armour_swap_slay_dragon = TRUE; if (of_has(item->flags, OF_KILL_UNDEAD)) armour_swap_kill_undead = TRUE; if (of_has(item->flags, OF_KILL_DEMON)) armour_swap_kill_demon = TRUE; if (of_has(item->flags, OF_KILL_DRAGON)) armour_swap_kill_dragon = TRUE; if (of_has(item->flags, OF_IMPACT)) armour_swap_impact = TRUE; if (of_has(item->flags, OF_BRAND_ACID)) armour_swap_brand_acid = TRUE; if (of_has(item->flags, OF_BRAND_ELEC)) armour_swap_brand_elec = TRUE; if (of_has(item->flags, OF_BRAND_FIRE)) armour_swap_brand_fire = TRUE; if (of_has(item->flags, OF_BRAND_COLD)) armour_swap_brand_cold = TRUE; if (of_has(item->flags, OF_BRAND_POIS)) armour_swap_brand_pois = TRUE; /* Affect infravision */ if (of_has(item->flags, OF_INFRA)) armour_swap_see_infra += item->pval; /* Affect various skills */ /* Affect speed */ /* Various flags */ if (of_has(item->flags, OF_SLOW_DIGEST)) armour_swap_slow_digest = TRUE; if (of_has(item->flags, OF_AGGRAVATE)) armour_swap_aggravate = TRUE; if (of_has(item->flags, OF_TELEPORT)) armour_swap_teleport = TRUE; if (of_has(item->flags, OF_REGEN)) armour_swap_regenerate = TRUE; if (of_has(item->flags, OF_TELEPATHY)) armour_swap_telepathy = TRUE; if (of_has(item->flags, OF_LIGHT)) armour_swap_LIGHT = TRUE; if (of_has(item->flags, OF_SEE_INVIS)) armour_swap_see_invis = TRUE; if (of_has(item->flags, OF_FEATHER)) armour_swap_ffall = TRUE; if (of_has(item->flags, OF_FREE_ACT)) armour_swap_free_act = TRUE; if (of_has(item->flags, OF_HOLD_LIFE)) armour_swap_hold_life = TRUE; /* Immunity flags */ /* if you are immune you automaticly resist */ if (of_has(item->flags, OF_IM_FIRE)) { armour_swap_immune_fire = TRUE; armour_swap_resist_fire = TRUE; } if (of_has(item->flags, OF_IM_ACID)) { armour_swap_immune_acid = TRUE; armour_swap_resist_acid = TRUE; } if (of_has(item->flags, OF_IM_COLD)) { armour_swap_immune_cold = TRUE; armour_swap_resist_cold = TRUE; } if (of_has(item->flags, OF_IM_ELEC)) { armour_swap_immune_elec = TRUE; armour_swap_resist_elec = TRUE; } /* Resistance flags */ if (of_has(item->flags, OF_RES_ACID)) armour_swap_resist_acid = TRUE; if (of_has(item->flags, OF_RES_ELEC)) armour_swap_resist_elec = TRUE; if (of_has(item->flags, OF_RES_FIRE)) armour_swap_resist_fire = TRUE; if (of_has(item->flags, OF_RES_COLD)) armour_swap_resist_cold = TRUE; if (of_has(item->flags, OF_RES_POIS)) armour_swap_resist_pois = TRUE; if (of_has(item->flags, OF_RES_CONFU)) armour_swap_resist_conf = TRUE; if (of_has(item->flags, OF_RES_SOUND)) armour_swap_resist_sound = TRUE; if (of_has(item->flags, OF_RES_LIGHT)) armour_swap_resist_LIGHT = TRUE; if (of_has(item->flags, OF_RES_DARK)) armour_swap_resist_dark = TRUE; if (of_has(item->flags, OF_RES_CHAOS)) armour_swap_resist_chaos = TRUE; if (of_has(item->flags, OF_RES_DISEN)) armour_swap_resist_disen = TRUE; if (of_has(item->flags, OF_RES_SHARD)) armour_swap_resist_shard = TRUE; if (of_has(item->flags, OF_RES_NEXUS)) armour_swap_resist_nexus = TRUE; if (of_has(item->flags, OF_RES_BLIND)) armour_swap_resist_blind = TRUE; if (of_has(item->flags, OF_RES_NETHR)) armour_swap_resist_neth = TRUE; if (item->cursed) decurse_armour_swap = 0; if (of_has(item->flags, OF_HEAVY_CURSE)) decurse_armour_swap = 1; /* Sustain flags */ /* calculating the value of the swap weapon. */ damage = (item->dd * item->ds *35L); /* Reward "damage" and increased blows per round*/ v += damage * (borg_skill[BI_BLOWS]+1); /* Reward "bonus to hit" */ v += ((borg_skill[BI_TOHIT] + item->to_h)*100L); /* Reward "bonus to dam" */ v += ((borg_skill[BI_TODAM] + item->to_d)*35L); dam = damage * borg_skill[BI_BLOWS]; /* assume 2x base damage for x% of creatures */ dam = damage * 2 * borg_skill[BI_BLOWS]; if (!borg_skill[BI_WS_ANIMAL] && !borg_skill[BI_WB_ELEC] && armour_swap_slay_animal) v += (dam*2) /2; if (!borg_skill[BI_WS_EVIL] && armour_swap_slay_evil) v += (dam*7) /2; /* assume 3x base damage for x% of creatures */ dam = damage *3*borg_skill[BI_BLOWS]; if (!borg_skill[BI_WS_UNDEAD] && armour_swap_slay_undead) v += (dam*5) /2; if (!borg_skill[BI_WS_DEMON] && armour_swap_slay_demon) v += (dam*3) /2; if (!borg_skill[BI_WS_GIANT] && armour_swap_slay_giant) v += (dam*4) /2; if (!borg_skill[BI_WS_DRAGON] && !borg_skill[BI_WK_DRAGON] && armour_swap_slay_dragon) v += (dam*6) /2; if (!borg_skill[BI_WB_ACID] && armour_swap_brand_acid) v += (dam*4) /2; if (!borg_skill[BI_WB_ELEC] && armour_swap_brand_elec) v += (dam*5) /2; if (!borg_skill[BI_WB_FIRE] && armour_swap_brand_fire) v += (dam*3) /2; if (!borg_skill[BI_WB_COLD] && armour_swap_brand_cold) v += (dam*3) /2; if (!borg_skill[BI_WB_POIS] && armour_swap_brand_pois) v += (dam*3) /2; /* SOrc and STroll get 1/2 reward now */ if (!borg_skill[BI_WS_ORC] && armour_swap_slay_orc) v += (dam*1) /2; if (!borg_skill[BI_WS_TROLL] && armour_swap_slay_troll) v += (dam*2) /2; /* SOrc and STroll get 2/2 reward if slay evil not possesed */ if (!borg_skill[BI_WS_ORC] && !borg_skill[BI_WS_EVIL] && armour_swap_slay_orc) v += (dam*1) /2; if (!borg_skill[BI_WS_TROLL] && !borg_skill[BI_WS_EVIL] && armour_swap_slay_troll) v += (dam*1) /2; /* assume 5x base damage for x% of creatures */ dam = damage * 5 * borg_skill[BI_BLOWS]; if (!borg_skill[BI_WK_UNDEAD] && armour_swap_kill_undead) v += (dam*5) /2; if (!borg_skill[BI_WK_DEMON] && armour_swap_kill_demon) v += (dam*3) /2; if (!borg_skill[BI_WK_DRAGON] && armour_swap_kill_dragon) v += (dam*5) /2; if (!borg_skill[BI_SDIG] && armour_swap_slow_digest) v += 10L; if (armour_swap_aggravate) v -= 8000L; if (armour_swap_teleport) v -= 100000L; if (decurse_armour_swap != -1) v -= 5000L; if (!borg_skill[BI_REG] && armour_swap_regenerate) v += 2000L; if (!borg_skill[BI_ESP] && armour_swap_telepathy) v += 5000L; if (!borg_skill[BI_LIGHT] && armour_swap_LIGHT) v += 2000L; if (!borg_skill[BI_SINV] && armour_swap_see_invis) v += 50000L; if (!borg_skill[BI_FEATH] && armour_swap_ffall) v += 10L; if (!borg_skill[BI_FRACT] && armour_swap_free_act) v += 10000L; if (!borg_skill[BI_HLIFE] && (borg_skill[BI_MAXCLEVEL] < 50) && armour_swap_hold_life) v += 2000L; if (!borg_skill[BI_IFIRE] && armour_swap_immune_fire) v += 70000L; if (!borg_skill[BI_IACID] && armour_swap_immune_acid) v += 30000L; if (!borg_skill[BI_ICOLD] && armour_swap_immune_cold) v += 50000L; if (!borg_skill[BI_IELEC] && armour_swap_immune_elec) v += 25000L; if (!borg_skill[BI_RFIRE] && armour_swap_resist_fire) v += 8000L; if (!borg_skill[BI_RACID] && armour_swap_resist_acid) v += 6000L; if (!borg_skill[BI_RCOLD] && armour_swap_resist_cold) v += 4000L; if (!borg_skill[BI_RELEC] && armour_swap_resist_elec) v += 3000L; /* extra bonus for getting all basic resist */ if (armour_swap_resist_fire && armour_swap_resist_acid && armour_swap_resist_elec && armour_swap_resist_cold) v += 10000L; if (!borg_skill[BI_RPOIS] && armour_swap_resist_pois) v += 20000L; if (!borg_skill[BI_RCONF] && armour_swap_resist_conf) v += 5000L; if (!borg_skill[BI_RSND] && armour_swap_resist_sound) v += 2000L; if (!borg_skill[BI_RLITE] && armour_swap_resist_LIGHT) v += 800L; if (!borg_skill[BI_RDARK] && armour_swap_resist_dark) v += 800L; if (!borg_skill[BI_RKAOS] && armour_swap_resist_chaos) v += 8000L; if (!borg_skill[BI_RDIS] && armour_swap_resist_disen) v += 5000L; if (!borg_skill[BI_RSHRD] && armour_swap_resist_shard) v += 100L; if (!borg_skill[BI_RNXUS] && armour_swap_resist_nexus) v += 100L; if (!borg_skill[BI_RBLIND] && armour_swap_resist_blind) v += 5000L; if (!borg_skill[BI_RNTHR] && armour_swap_resist_neth) v += 5500L; /* Special concern if Tarraseque is alive */ if (borg_skill[BI_MAXDEPTH] >= 75 && ((!borg_skill[BI_ICOLD] && armour_swap_immune_cold) || (!borg_skill[BI_IFIRE] && armour_swap_immune_fire))) { /* If Tarraseque is alive */ if (borg_race_death[539] == 0) { if (!borg_skill[BI_ICOLD] && armour_swap_immune_cold) v += 90000L; if (!borg_skill[BI_IFIRE] && armour_swap_immune_fire) v += 90000L; } } /* Mega-Hack -- resists (level 60) */ /* Its possible that he will get a sword and a cloak * both with the same high resist and keep each based * on that resist. We want him to check to see * that the other swap does not already have the high resist. */ if (!borg_skill[BI_RNTHR] && borg_skill[BI_MAXDEPTH]+1 >= 55 && !weapon_swap_resist_neth && armour_swap_resist_neth) v += 105000L; if (!borg_skill[BI_RKAOS] && borg_skill[BI_MAXDEPTH]+1 >= 60 && !weapon_swap_resist_chaos && armour_swap_resist_chaos) v += 104000L; if (!borg_skill[BI_RDIS] && borg_skill[BI_MAXDEPTH]+1 >= 60 && !weapon_swap_resist_disen && armour_swap_resist_disen) v += 100000L; /* some artifacts would make good back ups for their activation */ } /* skip usless ones */ if (v <= 1000) continue; /* collect the best one */ if ((b_i >=0) && (v < b_v)) continue; /* track it */ b_i = i; b_v = v; armour_swap_value = v; armour_swap = i; } } /* Now that we know who the best swap is lets set our swap * flags and get a move on */ /*** Process the best inven item ***/ item = &borg_items[b_i]; /* Clear all the swap weapon flags as I look at each one. */ armour_swap_slay_animal = FALSE; armour_swap_slay_evil = FALSE; armour_swap_slay_undead = FALSE; armour_swap_slay_demon = FALSE; armour_swap_slay_orc = FALSE; armour_swap_slay_troll = FALSE; armour_swap_slay_giant = FALSE; armour_swap_slay_dragon = FALSE; armour_swap_kill_dragon = FALSE; armour_swap_impact = FALSE; armour_swap_brand_acid = FALSE; armour_swap_brand_elec = FALSE; armour_swap_brand_fire = FALSE; armour_swap_brand_cold = FALSE; armour_swap_brand_pois = FALSE; armour_swap_see_infra = FALSE; armour_swap_slow_digest = FALSE; armour_swap_aggravate = FALSE; armour_swap_teleport = FALSE; armour_swap_regenerate = FALSE; armour_swap_telepathy = FALSE; armour_swap_LIGHT = FALSE; armour_swap_see_invis = FALSE; armour_swap_ffall = FALSE; armour_swap_free_act = FALSE; armour_swap_hold_life = FALSE; armour_swap_immune_fire = FALSE; armour_swap_immune_acid = FALSE; armour_swap_immune_cold = FALSE; armour_swap_immune_elec = FALSE; armour_swap_resist_acid = FALSE; armour_swap_resist_elec = FALSE; armour_swap_resist_fire = FALSE; armour_swap_resist_cold = FALSE; armour_swap_resist_pois = FALSE; armour_swap_resist_conf = FALSE; armour_swap_resist_sound = FALSE; armour_swap_resist_LIGHT = FALSE; armour_swap_resist_dark = FALSE; armour_swap_resist_chaos = FALSE; armour_swap_resist_disen = FALSE; armour_swap_resist_shard = FALSE; armour_swap_resist_nexus = FALSE; armour_swap_resist_blind = FALSE; armour_swap_resist_neth = FALSE; decurse_armour_swap = -1; /* various slays */ if (of_has(item->flags, OF_SLAY_ANIMAL)) armour_swap_slay_animal = TRUE; if (of_has(item->flags, OF_SLAY_EVIL)) armour_swap_slay_evil = TRUE; if (of_has(item->flags, OF_SLAY_UNDEAD)) armour_swap_slay_undead = TRUE; if (of_has(item->flags, OF_SLAY_DEMON)) armour_swap_slay_demon = TRUE; if (of_has(item->flags, OF_SLAY_ORC)) armour_swap_slay_orc = TRUE; if (of_has(item->flags, OF_SLAY_TROLL)) armour_swap_slay_troll = TRUE; if (of_has(item->flags, OF_SLAY_GIANT)) armour_swap_slay_giant = TRUE; if (of_has(item->flags, OF_SLAY_DRAGON)) armour_swap_slay_dragon = TRUE; if (of_has(item->flags, OF_KILL_UNDEAD)) armour_swap_kill_undead = TRUE; if (of_has(item->flags, OF_KILL_DEMON)) armour_swap_kill_demon = TRUE; if (of_has(item->flags, OF_KILL_DRAGON)) armour_swap_kill_dragon = TRUE; if (of_has(item->flags, OF_IMPACT)) armour_swap_impact = TRUE; if (of_has(item->flags, OF_BRAND_ACID)) armour_swap_brand_acid = TRUE; if (of_has(item->flags, OF_BRAND_ELEC)) armour_swap_brand_elec = TRUE; if (of_has(item->flags, OF_BRAND_FIRE)) armour_swap_brand_fire = TRUE; if (of_has(item->flags, OF_BRAND_COLD)) armour_swap_brand_cold = TRUE; if (of_has(item->flags, OF_BRAND_POIS)) armour_swap_brand_pois = TRUE; /* Affect infravision */ if (of_has(item->flags, OF_INFRA)) armour_swap_see_infra += item->pval; /* Affect various skills */ /* Affect speed */ /* Various flags */ if (of_has(item->flags, OF_SLOW_DIGEST)) armour_swap_slow_digest = TRUE; if (of_has(item->flags, OF_AGGRAVATE)) armour_swap_aggravate = TRUE; if (of_has(item->flags, OF_TELEPORT)) armour_swap_teleport = TRUE; if (of_has(item->flags, OF_REGEN)) armour_swap_regenerate = TRUE; if (of_has(item->flags, OF_TELEPATHY)) armour_swap_telepathy = TRUE; if (of_has(item->flags, OF_LIGHT)) armour_swap_LIGHT = TRUE; if (of_has(item->flags, OF_SEE_INVIS)) armour_swap_see_invis = TRUE; if (of_has(item->flags, OF_FEATHER)) armour_swap_ffall = TRUE; if (of_has(item->flags, OF_FREE_ACT)) armour_swap_free_act = TRUE; if (of_has(item->flags, OF_HOLD_LIFE)) armour_swap_hold_life = TRUE; /* Immunity flags */ /* if you are immune you automaticly resist */ if (of_has(item->flags, OF_IM_FIRE)) { armour_swap_immune_fire = TRUE; armour_swap_resist_fire = TRUE; } if (of_has(item->flags, OF_IM_ACID)) { armour_swap_immune_acid = TRUE; armour_swap_resist_acid = TRUE; } if (of_has(item->flags, OF_IM_COLD)) { armour_swap_immune_cold = TRUE; armour_swap_resist_cold = TRUE; } if (of_has(item->flags, OF_IM_ELEC)) { armour_swap_immune_elec = TRUE; armour_swap_resist_elec = TRUE; } /* Resistance flags */ if (of_has(item->flags, OF_RES_ACID)) armour_swap_resist_acid = TRUE; if (of_has(item->flags, OF_RES_ELEC)) armour_swap_resist_elec = TRUE; if (of_has(item->flags, OF_RES_FIRE)) armour_swap_resist_fire = TRUE; if (of_has(item->flags, OF_RES_COLD)) armour_swap_resist_cold = TRUE; if (of_has(item->flags, OF_RES_POIS)) armour_swap_resist_pois = TRUE; if (of_has(item->flags, OF_RES_CONFU)) armour_swap_resist_conf = TRUE; if (of_has(item->flags, OF_RES_SOUND)) armour_swap_resist_sound = TRUE; if (of_has(item->flags, OF_RES_LIGHT)) armour_swap_resist_LIGHT = TRUE; if (of_has(item->flags, OF_RES_DARK)) armour_swap_resist_dark = TRUE; if (of_has(item->flags, OF_RES_CHAOS)) armour_swap_resist_chaos = TRUE; if (of_has(item->flags, OF_RES_DISEN)) armour_swap_resist_disen = TRUE; if (of_has(item->flags, OF_RES_SHARD)) armour_swap_resist_shard = TRUE; if (of_has(item->flags, OF_RES_NEXUS)) armour_swap_resist_nexus = TRUE; if (of_has(item->flags, OF_RES_BLIND)) armour_swap_resist_blind = TRUE; if (of_has(item->flags, OF_RES_NETHR)) armour_swap_resist_neth = TRUE; if (item->cursed) decurse_armour_swap = 0; if (of_has(item->flags, OF_HEAVY_CURSE)) decurse_armour_swap = 1; enchant_armour_swap_to_a = 0; /* dont look for enchantment on non armours */ if (item->tval >= TV_LIGHT) return; /* Hack -- enchant the swap equipment (armor) */ /* Note need for enchantment */ if ((borg_prayer_legal_fail(7, 4, 65) || borg_spell_legal_fail(7, 2, 65) || amt_enchant_armor >=1 )) { if (item->to_a < 10) { enchant_armour_swap_to_a += (10 - item->to_a); } } else { if (item->to_a < 8) { enchant_armour_swap_to_a += (8 - item->to_a); } } } /* * Analyze the equipment and inventory */ void borg_notice(bool notice_swap) { int inven_weight; int carry_capacity; int i; /* Clear out 'has' array */ memset(borg_has, 0, size_obj*sizeof(int)); /* Many of our variables are tied to borg_skill[], which is erased at the * the start of borg_notice(). So we must update the frame the cheat in * all the non inventory skills. */ borg_update_frame(); /* The borg needs to update his base stat points */ for (i =0; i < 6; i++) { /* Cheat the exact number from the game. This number is available to the player * on the extra term window. */ my_stat_cur[i] = p_ptr->stat_cur[i]; /* Max stat is the max that the cur stat ever is. */ if (my_stat_cur[i] > my_stat_max[i]) my_stat_max[i] = my_stat_cur[i]; } /* Notice the equipment */ borg_notice_aux1(); /* Notice the inventory */ borg_notice_aux2(); /* Notice and locate my swap weapon */ if (notice_swap) { borg_notice_weapon_swap(); borg_notice_armour_swap(); } borg_skill[BI_SRACID] = borg_skill[BI_RACID] || armour_swap_resist_acid || weapon_swap_resist_acid || borg_spell_legal_fail(4, 3, 15) /* Res FECAP */ || borg_spell_legal_fail(4, 3, 15); /* Res A */ borg_skill[BI_SRELEC] = borg_skill[BI_RELEC] || armour_swap_resist_elec || weapon_swap_resist_elec || borg_spell_legal_fail(4, 3, 15); /* Res FECAP */ borg_skill[BI_SRFIRE] = borg_skill[BI_RFIRE] || armour_swap_resist_fire || weapon_swap_resist_fire || borg_spell_legal_fail(4, 3, 15) /* Res FECAP */ || borg_prayer_legal_fail(1, 7, 15) /* Res FC */ || borg_spell_legal_fail(4, 1, 15); /* Res F */ borg_skill[BI_SRCOLD] = borg_skill[BI_RCOLD] || armour_swap_resist_cold || weapon_swap_resist_cold || borg_spell_legal_fail(4, 3, 15) /* Res FECAP */ || borg_prayer_legal_fail(1, 7, 15) /* Res FC */ || borg_spell_legal_fail(4, 0, 15); /* Res C */ borg_skill[BI_SRPOIS] = borg_skill[BI_RPOIS] || armour_swap_resist_pois || weapon_swap_resist_pois || borg_spell_legal_fail(4, 3, 15) /* Res FECAP */ || borg_spell_legal_fail(4, 2, 15); /* Res P */ borg_skill[BI_SRFEAR] = borg_skill[BI_RFEAR] || armour_swap_resist_fear || weapon_swap_resist_fear; borg_skill[BI_SRLITE] = borg_skill[BI_RLITE] || armour_swap_resist_LIGHT || weapon_swap_resist_LIGHT; borg_skill[BI_SRDARK] = borg_skill[BI_RDARK] || armour_swap_resist_dark || weapon_swap_resist_dark; borg_skill[BI_SRBLIND] = borg_skill[BI_RBLIND] || armour_swap_resist_blind || weapon_swap_resist_blind; borg_skill[BI_SRCONF] = borg_skill[BI_RCONF] || armour_swap_resist_conf || weapon_swap_resist_conf; borg_skill[BI_SRSND] = borg_skill[BI_RSND] || armour_swap_resist_sound || weapon_swap_resist_sound; borg_skill[BI_SRSHRD] = borg_skill[BI_RSHRD] || armour_swap_resist_shard || weapon_swap_resist_shard; borg_skill[BI_SRNXUS] = borg_skill[BI_RNXUS] || armour_swap_resist_nexus || weapon_swap_resist_nexus; borg_skill[BI_SRNTHR] = borg_skill[BI_RNTHR] || armour_swap_resist_neth || weapon_swap_resist_neth; borg_skill[BI_SRKAOS] = borg_skill[BI_RKAOS] || armour_swap_resist_chaos || weapon_swap_resist_chaos; borg_skill[BI_SRDIS] = borg_skill[BI_RDIS] || armour_swap_resist_disen || weapon_swap_resist_disen; borg_skill[BI_SHLIFE] = borg_skill[BI_HLIFE] || armour_swap_hold_life || weapon_swap_hold_life; borg_skill[BI_SFRACT] = borg_skill[BI_FRACT] || armour_swap_free_act || weapon_swap_free_act; /* Hack -- Apply "encumbrance" from weight */ /* Extract the current weight (in tenth pounds) */ inven_weight = p_ptr->total_weight; /* Extract the "weight limit" (in tenth pounds) */ carry_capacity = adj_str_wgt[my_stat_ind[A_STR]] * 100; /* Apply "encumbrance" from weight */ if (inven_weight > carry_capacity/2) borg_skill[BI_SPEED] -= ((inven_weight - (carry_capacity/2)) / (carry_capacity / 10)); } /* * Helper function -- notice the home equipment */ static void borg_notice_home_aux1(borg_item *in_item, bool no_items) { /*** Reset counters ***/ /* Reset basic */ num_food = 0; num_fuel = 0; num_mold = 0; num_ident = 0; num_recall = 0; num_phase = 0; num_escape = 0; num_tele_staves = 0; num_teleport = 0; num_teleport_level =0; num_recharge = 0; num_artifact = 0; num_ego = 0; num_invisible = 0; num_pfe =0; num_glyph = 0; num_genocide = 0; num_mass_genocide = 0; num_berserk = 0; num_pot_rheat = 0; num_pot_rcold = 0; num_speed = 0; num_detonate = 0; num_slow_digest = 0; num_regenerate = 0; num_telepathy = 0; num_see_inv = 0; num_ffall = 0; num_free_act = 0; num_hold_life = 0; num_immune_acid = 0; num_immune_elec = 0; num_immune_fire = 0; num_immune_cold = 0; num_resist_acid = 0; num_resist_elec = 0; num_resist_fire = 0; num_resist_cold = 0; num_resist_pois = 0; num_resist_conf = 0; num_resist_sound = 0; num_resist_LIGHT = 0; num_resist_dark = 0; num_resist_chaos = 0; num_resist_disen = 0; num_resist_shard = 0; num_resist_nexus = 0; num_resist_blind = 0; num_resist_neth = 0; num_sustain_str = 0; num_sustain_int = 0; num_sustain_wis = 0; num_sustain_dex =0; num_sustain_con = 0; num_sustain_all = 0; home_stat_add[A_STR] = 0; home_stat_add[A_INT] = 0; home_stat_add[A_WIS] = 0; home_stat_add[A_DEX] = 0; home_stat_add[A_CON] = 0; num_weapons = 0; num_bow =0; num_rings = 0; num_neck = 0; num_armor = 0; num_cloaks = 0; num_shields = 0; num_hats = 0; num_gloves = 0; num_boots = 0; num_LIGHT = 0; num_speed = 0; num_edged_weapon = 0; num_bad_gloves= 0; /* Reset healing */ num_cure_critical = 0; num_cure_serious = 0; num_fix_exp = 0; num_mana = 0; num_heal = 0; num_ezheal = 0; num_life = 0; if (!in_item && !no_items) num_ezheal_true = 0; if (!in_item && !no_items) num_heal_true = 0; if (!in_item && !no_items) num_life_true = 0; /* Mushrooms */ num_mush_second_sight = 0; /* esp */ num_mush_fast_recovery = 0; /* cure stun, cut, pois, blind */ num_mush_restoring = 0; /* Restore All */ num_mush_cure_mind = 0; /* Cure confustion, Halluc, fear, tmp resist Conf */ num_mush_emergency = 0; /* Hallucinate, Oppose Fire, Oppose Cold, Heal 200 */ num_mush_terror = 0; /* Terror --give +5 speed boost */ num_mush_stoneskin = 0; /* StoneSkin */ num_mush_debility = 0; /* Mana Restore, temp loss of a stat (str/con) */ num_mush_sprinting = 0; /* Sprinting (speed +10) */ num_mush_purging = 0; /* Purging --Makes hungry, restore Str/Con, Cure Pois */ /* Reset missiles */ num_missile = 0; /* Reset books */ num_book[0] = 0; num_book[1] = 0; num_book[2] = 0; num_book[3] = 0; num_book[4] = 0; num_book[5] = 0; num_book[6] = 0; num_book[7] = 0; num_book[8] = 0; /* Reset various */ num_fix_stat[A_STR] = 0; num_fix_stat[A_INT] = 0; num_fix_stat[A_WIS] = 0; num_fix_stat[A_DEX] = 0; num_fix_stat[A_CON] = 0; num_fix_stat[6] = 0; /* Reset enchantment */ num_enchant_to_a = 0; num_enchant_to_d = 0; num_enchant_to_h = 0; home_slot_free = 0; home_damage = 0; num_duplicate_items = 0; } /* * This checks for duplicate items in the home */ static void borg_notice_home_dupe(borg_item *item, bool check_sval, int i) { /* eventually check for power overlap... armor of resistence is same as weak elvenkind.*/ /* two armors of elvenkind that resist poison is a dupe. AJG*/ int dupe_count, x; borg_item *item2; ego_item_type *e_ptr = &e_info[item->name2]; /* check for a duplicate. */ /* be carefull about extra powers (elvenkind/magi) */ if (e_ptr->xtra == OBJECT_XTRA_TYPE_RESIST || e_ptr->xtra == OBJECT_XTRA_TYPE_POWER) return; /* if this is a stack of items then all after the first are a */ /* duplicate */ dupe_count = item->iqty-1; /* Look for other items before this one that are the same */ for (x = 0; x < i; x++) { if (x < STORE_INVEN_MAX) item2 = &borg_shops[7].ware[x]; else /* Check what the borg has on as well.*/ item2 = &borg_items[((x-STORE_INVEN_MAX)+INVEN_WIELD)]; /* if everything matches it is a duplicate item */ /* Note that we only check sval on certain items. This */ /* is because, for example, two pairs of dragon armor */ /* are not the same unless thier subtype (color) matches */ /* but a defender is a defender even if one is a dagger and */ /* one is a mace */ if ( (item->tval == item2->tval) && (check_sval ? (item->sval == item2->sval) : TRUE) && (item->name1 == item2->name1) && (item->name2 == item2->name2) ) { dupe_count++; } } /* there can be one dupe of rings because there are two ring slots. */ if (item->tval == TV_RING && dupe_count) dupe_count--; /* Add this items count to the total duplicate count */ num_duplicate_items += dupe_count; } /* * Helper function -- notice the home inventory */ static void borg_notice_home_aux2(borg_item *in_item, bool no_items) { int i; borg_item *item; borg_shop *shop = &borg_shops[7]; bitflag f[OF_SIZE]; /*** Process the inventory ***/ /* Scan the home */ for (i = 0; i < (STORE_INVEN_MAX+(INVEN_TOTAL-INVEN_WIELD)); i++) { if (no_items) break; if (!in_item) if (i < STORE_INVEN_MAX) item = &shop->ware[i]; else item = &borg_items[((i-STORE_INVEN_MAX)+INVEN_WIELD)]; else item = in_item; /* Skip empty items */ if (!item->iqty) { home_slot_free++; continue; } /* Hack -- skip un-aware items */ if (!item->kind) { home_slot_free++; continue; } if (of_has(item->flags, OF_SLOW_DIGEST)) num_slow_digest += item->iqty; if (of_has(item->flags, OF_REGEN)) num_regenerate += item->iqty; if (of_has(item->flags, OF_TELEPATHY)) num_telepathy += item->iqty; if (of_has(item->flags, OF_SEE_INVIS)) num_see_inv += item->iqty; if (of_has(item->flags, OF_FEATHER)) num_ffall += item->iqty; if (of_has(item->flags, OF_FREE_ACT)) num_free_act += item->iqty; if (of_has(item->flags, OF_HOLD_LIFE)) num_hold_life += item->iqty; if (of_has(item->flags, OF_IM_FIRE)) { num_immune_fire += item->iqty; num_resist_fire += item->iqty; } if (of_has(item->flags, OF_IM_ACID)) { num_immune_acid += item->iqty; num_resist_acid += item->iqty; } if (of_has(item->flags, OF_IM_COLD)) { num_immune_cold += item->iqty; num_resist_cold += item->iqty; } if (of_has(item->flags, OF_IM_ELEC)) { num_immune_elec += item->iqty; num_resist_elec += item->iqty; } if (of_has(item->flags, OF_RES_ACID)) num_resist_acid += item->iqty; if (of_has(item->flags, OF_RES_ELEC)) num_resist_elec += item->iqty; if (of_has(item->flags, OF_RES_FIRE)) num_resist_fire += item->iqty; if (of_has(item->flags, OF_RES_COLD)) num_resist_cold += item->iqty; if (of_has(item->flags, OF_RES_POIS)) num_resist_pois += item->iqty; if (of_has(item->flags, OF_RES_SOUND)) num_resist_sound += item->iqty; if (of_has(item->flags, OF_RES_LIGHT)) num_resist_LIGHT += item->iqty; if (of_has(item->flags, OF_RES_DARK)) num_resist_dark += item->iqty; if (of_has(item->flags, OF_RES_CHAOS)) num_resist_chaos += item->iqty; if (of_has(item->flags, OF_RES_CONFU)) num_resist_conf += item->iqty; if (of_has(item->flags, OF_RES_DISEN)) num_resist_disen += item->iqty; if (of_has(item->flags, OF_RES_SHARD)) num_resist_shard += item->iqty; if (of_has(item->flags, OF_RES_NEXUS)) num_resist_nexus += item->iqty; if (of_has(item->flags, OF_RES_BLIND)) num_resist_blind += item->iqty; if (of_has(item->flags, OF_RES_NETHR)) num_resist_neth += item->iqty; /* Count Sustains */ if (of_has(item->flags, OF_SUST_STR)) num_sustain_str += item->iqty; if (of_has(item->flags, OF_SUST_INT)) num_sustain_str += item->iqty; if (of_has(item->flags, OF_SUST_WIS)) num_sustain_str += item->iqty; if (of_has(item->flags, OF_SUST_DEX)) num_sustain_str += item->iqty; if (of_has(item->flags, OF_SUST_CON)) num_sustain_str += item->iqty; if (of_has(item->flags, OF_SUST_STR) && of_has(item->flags, OF_SUST_INT) && of_has(item->flags, OF_SUST_WIS) && of_has(item->flags, OF_SUST_DEX) && of_has(item->flags, OF_SUST_CON)) num_sustain_all +=item->iqty; /* count up bonus to stats */ /* HACK only collect stat rings above +3 */ if (of_has(item->flags, OF_STR)) { if (item->tval != TV_RING || item->pval > 3) home_stat_add[A_STR] += item->pval * item->iqty; } if (of_has(item->flags, OF_INT)) { if (item->tval != TV_RING || item->pval > 3) home_stat_add[A_INT] += item->pval * item->iqty; } if (of_has(item->flags, OF_WIS)) { if (item->tval != TV_RING || item->pval > 3) home_stat_add[A_WIS] += item->pval * item->iqty; } if (of_has(item->flags, OF_DEX)) { if (item->tval != TV_RING || item->pval > 3) home_stat_add[A_DEX] += item->pval * item->iqty; } if (of_has(item->flags, OF_CON)) { if (item->tval != TV_RING || item->pval > 3) home_stat_add[A_CON] += item->pval * item->iqty; } /* count up bonus to speed */ if (of_has(item->flags, OF_SPEED)) num_speed += item->pval * item->iqty; /* count artifacts */ if (item->name1) { num_artifact += item->iqty; } /* count egos that need *ID* */ if ((e_info[item->name2].xtra == OBJECT_XTRA_TYPE_RESIST || e_info[item->name2].xtra == OBJECT_XTRA_TYPE_POWER) && !item->fully_identified) { num_ego += item->iqty; } /* Analyze the item */ switch (item->tval) { case TV_SOFT_ARMOR: case TV_HARD_ARMOR: num_armor += item->iqty; /* see if this item is duplicated */ borg_notice_home_dupe( item, FALSE, i ); break; case TV_DRAG_ARMOR: num_armor += item->iqty; /* see if this item is duplicated */ borg_notice_home_dupe( item, TRUE, i ); break; case TV_CLOAK: num_cloaks += item->iqty; /* see if this item is duplicated */ borg_notice_home_dupe( item, FALSE, i ); break; case TV_SHIELD: num_shields += item->iqty; /* see if this item is duplicated */ borg_notice_home_dupe( item, FALSE, i ); break; case TV_HELM: case TV_CROWN: num_hats += item->iqty; /* see if this item is duplicated */ borg_notice_home_dupe( item, FALSE, i ); break; case TV_GLOVES: num_gloves += item->iqty; /* most gloves hurt magic for spell-casters */ if (player_has(PF_CUMBER_GLOVE) && borg_skill[BI_MAXSP] > 3) { /* Penalize non-usable gloves */ if (item->iqty && (!of_has(item->flags, OF_FREE_ACT) && !of_has(item->flags, OF_DEX) && item->pval > 0)) { num_bad_gloves += item->iqty; } } /* gloves of slaying give a damage bonus */ home_damage += item->to_d * 3; /* see if this item is duplicated */ borg_notice_home_dupe( item, FALSE, i ); break; case TV_FLASK: /* Use as fuel if we equip a lantern */ if (borg_items[INVEN_LIGHT].sval == SV_LIGHT_LANTERN) { num_fuel += item->iqty; /* borg_note(format("1.num_fuel=%d",num_fuel)); */ } break; case TV_LIGHT: /* Fuel */ if (borg_items[INVEN_LIGHT].sval == SV_LIGHT_TORCH) { num_fuel += item->iqty; } /* Artifacts */ if (item->name1) { num_LIGHT += item->iqty; } break; case TV_BOOTS: num_boots += item->iqty; /* see if this item is duplicated */ borg_notice_home_dupe( item, FALSE, i ); break; case TV_SWORD: case TV_POLEARM: case TV_HAFTED: /* case TV_DIGGING: */ { s16b num_blow; num_weapons += item->iqty; /* most edged weapons hurt magic for priests */ if (player_has(PF_BLESS_WEAPON)) { /* Penalize non-blessed edged weapons */ if ((item->tval == TV_SWORD || item->tval == TV_POLEARM) && !of_has(item->flags, OF_BLESSED)) { num_edged_weapon += item->iqty; } } /* NOTE: This damage does not take slays into account. */ /* it is just a rough estimate to make sure the glave of pain*/ /* is kept if it is found */ /* It is hard to hold a heavy weapon */ num_blow = 1; if (adj_str_hold[my_stat_ind[A_STR]] >= item->weight / 10) { int str_index, dex_index; int num = 0, wgt = 0, mul = 0, div = 0; /* Analyze the class */ switch (borg_class) { /* Warrior */ case CLASS_WARRIOR: num = 6; wgt = 30; mul = 5; break; /* Mage */ case CLASS_MAGE: num = 4; wgt = 40; mul = 2; break; /* Priest (was mul = 3.5) */ case CLASS_PRIEST: num = 5; wgt = 35; mul = 3; break; /* Rogue */ case CLASS_ROGUE: num = 5; wgt = 30; mul = 3; break; /* Ranger */ case CLASS_RANGER: num = 5; wgt = 35; mul = 4; break; /* Paladin */ case CLASS_PALADIN: num = 5; wgt = 30; mul = 4; break; } /* Enforce a minimum "weight" */ div = ((item->weight < wgt) ? wgt : item->weight); /* Access the strength vs weight */ str_index = (adj_str_blow[my_stat_ind[A_STR]] * mul / div); /* Maximal value */ if (str_index > 11) str_index = 11; /* Index by dexterity */ dex_index = (adj_dex_blow[my_stat_ind[A_DEX]]); /* Maximal value */ if (dex_index > 11) dex_index = 11; /* Use the blows table */ num_blow = blows_table[str_index][dex_index]; /* Maximal value */ if (num_blow > num) num_blow = num; } /* Require at least one blow */ if (num_blow < 1) num_blow = 1; if (of_has(item->flags, OF_BLOWS)) num_blow += item->pval; num_blow *= item->iqty; if ( item->to_d > 8 || borg_skill[BI_CLEVEL] < 15 ) { home_damage += num_blow * (item->dd * (item->ds) + (borg_skill[BI_TODAM] + item->to_d)); } else { home_damage += num_blow * (item->dd * (item->ds) + (borg_skill[BI_TODAM] + 8)); } /* see if this item is a duplicate */ borg_notice_home_dupe( item, FALSE, i ); break; } case TV_BOW: num_bow += item->iqty; /* see if this item is a duplicate */ borg_notice_home_dupe( item, FALSE, i ); break; case TV_RING: num_rings += item->iqty; /* see if this item is a duplicate */ borg_notice_home_dupe( item, TRUE, i ); break; case TV_AMULET: num_neck += item->iqty; /* see if this item is a duplicate */ borg_notice_home_dupe( item, TRUE, i ); break; /* Books */ case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: /* Skip incorrect books */ if (item->tval != p_ptr->class->spell_book) break; /* Count the books */ num_book[item->sval] += item->iqty; break; /* Food */ case TV_FOOD: /* Analyze */ switch (item->sval) { case SV_FOOD_WAYBREAD: num_food += item->iqty; break; case SV_FOOD_RATION: num_food += item->iqty; break; case SV_FOOD_SLIME_MOLD: num_mold += item->iqty; break; case SV_FOOD_PURGING: num_fix_stat[A_CON] += item->iqty; num_fix_stat[A_STR] += item->iqty; num_mush_purging += item->iqty; break; case SV_FOOD_RESTORING: num_fix_stat[A_STR] += item->iqty; num_fix_stat[A_INT] += item->iqty; num_fix_stat[A_WIS] += item->iqty; num_fix_stat[A_DEX] += item->iqty; num_fix_stat[A_CON] += item->iqty; num_fix_stat[6] += item->iqty; break; /* Mushrooms added in 312 */ case SV_FOOD_SECOND_SIGHT: num_mush_second_sight +=item->iqty; break; case SV_FOOD_EMERGENCY: num_mush_emergency +=item->iqty; break; case SV_FOOD_TERROR: num_mush_terror +=item->iqty; break; case SV_FOOD_STONESKIN: num_mush_stoneskin +=item->iqty; break; case SV_FOOD_DEBILITY: num_mush_debility +=item->iqty; break; case SV_FOOD_SPRINTING: num_mush_sprinting +=item->iqty; break; case SV_FOOD_FAST_RECOVERY: num_mush_fast_recovery +=item->iqty; break; case SV_FOOD_CURE_MIND: num_mush_cure_mind +=item->iqty; break; } break; /* Potions */ case TV_POTION: /* Analyze */ switch (item->sval) { case SV_POTION_CURE_CRITICAL: num_cure_critical += item->iqty; break; case SV_POTION_CURE_SERIOUS: num_cure_serious += item->iqty; break; case SV_POTION_RESIST_HEAT: num_pot_rheat += item->iqty; break; case SV_POTION_RESIST_COLD: num_pot_rcold += item->iqty; break; case SV_POTION_RES_STR: num_fix_stat[A_STR] += item->iqty; break; case SV_POTION_RES_INT: num_fix_stat[A_INT] += item->iqty; break; case SV_POTION_RES_WIS: num_fix_stat[A_WIS] += item->iqty; break; case SV_POTION_RES_DEX: num_fix_stat[A_DEX] += item->iqty; break; case SV_POTION_RES_CON: num_fix_stat[A_CON] += item->iqty; break; case SV_POTION_RESTORE_EXP: num_fix_exp += item->iqty; break; case SV_POTION_RESTORE_MANA: num_mana += item->iqty; break; case SV_POTION_HEALING: num_heal += item->iqty; if (!in_item && !no_items) num_heal_true += item->iqty; break; case SV_POTION_STAR_HEALING: num_ezheal += item->iqty; if (!in_item && !no_items) num_ezheal_true += item->iqty; break; case SV_POTION_LIFE: num_life += item->iqty; if (!in_item && !no_items) num_life_true += item->iqty; break; case SV_POTION_BERSERK_STRENGTH: num_berserk += item->iqty; break; case SV_POTION_SPEED: num_speed += item->iqty; break; case SV_POTION_DETONATIONS: num_detonate +=item->iqty; break; } break; /* Scrolls */ case TV_SCROLL: /* Analyze the scroll */ switch (item->sval) { case SV_SCROLL_IDENTIFY: num_ident += item->iqty; break; case SV_SCROLL_PHASE_DOOR: num_phase += item->iqty; break; case SV_SCROLL_TELEPORT: num_teleport += item->iqty; break; case SV_SCROLL_WORD_OF_RECALL: num_recall += item->iqty; break; case SV_SCROLL_ENCHANT_ARMOR: num_enchant_to_a += item->iqty; break; case SV_SCROLL_ENCHANT_WEAPON_TO_HIT: num_enchant_to_h += item->iqty; break; case SV_SCROLL_ENCHANT_WEAPON_TO_DAM: num_enchant_to_d += item->iqty; break; case SV_SCROLL_PROTECTION_FROM_EVIL: num_pfe += item->iqty; break; case SV_SCROLL_RUNE_OF_PROTECTION: num_glyph += item->iqty; break; case SV_SCROLL_TELEPORT_LEVEL: num_teleport_level += item->iqty; break; case SV_SCROLL_RECHARGING: num_recharge += item->iqty; break; case SV_SCROLL_MASS_BANISHMENT: num_mass_genocide += item->iqty; break; } break; /* Rods */ case TV_ROD: /* Analyze */ switch (item->sval) { case SV_ROD_IDENTIFY: num_ident += item->iqty * 100; break; case SV_ROD_RECALL: num_recall += item->iqty * 100; break; } break; /* Staffs */ case TV_STAFF: /* only collect staves with more than 3 charges at high level */ if (item->pval <= 3 && borg_skill[BI_CLEVEL] > 30) break; /* Analyze */ switch (item->sval) { case SV_STAFF_IDENTIFY: num_ident += item->pval * item->iqty; break; case SV_STAFF_TELEPORTATION: num_escape += item->pval * item->iqty; num_tele_staves ++; break; } break; /* Missiles */ case TV_SHOT: case TV_ARROW: case TV_BOLT: /* Hack -- ignore invalid missiles */ if (item->tval != my_ammo_tval) break; /* Hack -- ignore worthless missiles */ if (item->value <= 0) break; /* Count them */ num_missile += item->iqty; break; } /* if only doing one item, break. */ if (in_item) break; } /*** Process the Spells and Prayers ***/ /* Handle "satisfy hunger" -> infinite food */ if (borg_spell_legal(2, 0) || borg_prayer_legal(1, 5)) { num_food += 1000; } /* Handle "identify" -> infinite identifies */ if (borg_spell_legal(2, 5) || borg_prayer_legal(5, 2)) { num_ident += 1000; } /* Handle "enchant weapon" */ if (borg_spell_legal_fail(7, 3, 65) || borg_prayer_legal_fail(7, 3, 65)) { num_enchant_to_h += 1000; num_enchant_to_d += 1000; } /* Handle "protection from evil" */ if (borg_prayer_legal(2, 4)) { num_pfe += 1000; } /* Handle "rune of protection" glyph */ if (borg_prayer_legal(3, 4) || borg_spell_legal(6, 4)) { num_glyph += 1000; } /* handle restore */ /* Handle recall */ if (borg_prayer_legal(4, 4) || borg_spell_legal(6, 3)) { num_recall += 1000; } /* Handle teleport_level */ if (borg_prayer_legal(4, 3) || borg_spell_legal(6, 2)) { num_teleport_level += 1000; } /* Handle recharge */ if (borg_prayer_legal(7, 1) || borg_spell_legal(2, 1) || borg_spell_legal(7, 4)) { num_recharge += 1000; } /*** Process the Needs ***/ /* Hack -- No need for stat repair */ if (borg_skill[BI_SSTR]) num_fix_stat[A_STR] += 1000; if (borg_skill[BI_SINT]) num_fix_stat[A_INT] += 1000; if (borg_skill[BI_SWIS]) num_fix_stat[A_WIS] += 1000; if (borg_skill[BI_SDEX]) num_fix_stat[A_DEX] += 1000; if (borg_skill[BI_SCON]) num_fix_stat[A_CON] += 1000; /* Extract the player flags */ player_flags(f); /* Good flags */ if (rf_has(f, OF_SLOW_DIGEST)) num_slow_digest = TRUE; if (rf_has(f, OF_FEATHER)) num_ffall = TRUE; if (rf_has(f, OF_LIGHT)) num_LIGHT = TRUE; if (rf_has(f, OF_REGEN)) num_regenerate = TRUE; if (rf_has(f, OF_TELEPATHY)) num_telepathy = TRUE; if (rf_has(f, OF_SEE_INVIS)) num_see_inv = TRUE; if (rf_has(f, OF_FREE_ACT)) num_free_act = TRUE; if (rf_has(f, OF_HOLD_LIFE)) num_hold_life = TRUE; /* Weird flags */ /* Bad flags */ /* Immunity flags */ if (rf_has(f, OF_IM_FIRE)) num_immune_fire = TRUE; if (rf_has(f, OF_IM_ACID)) num_immune_acid = TRUE; if (rf_has(f, OF_IM_COLD)) num_immune_cold = TRUE; if (rf_has(f, OF_IM_ELEC)) num_immune_elec = TRUE; /* Resistance flags */ if (rf_has(f, OF_RES_ACID)) num_resist_acid = TRUE; if (rf_has(f, OF_RES_ELEC)) num_resist_elec = TRUE; if (rf_has(f, OF_RES_FIRE)) num_resist_fire = TRUE; if (rf_has(f, OF_RES_COLD)) num_resist_cold = TRUE; if (rf_has(f, OF_RES_POIS)) num_resist_pois = TRUE; if (rf_has(f, OF_RES_LIGHT)) num_resist_LIGHT = TRUE; if (rf_has(f, OF_RES_DARK)) num_resist_dark = TRUE; if (rf_has(f, OF_RES_BLIND)) num_resist_blind = TRUE; if (rf_has(f, OF_RES_CONFU)) num_resist_conf = TRUE; if (rf_has(f, OF_RES_SOUND)) num_resist_sound = TRUE; if (rf_has(f, OF_RES_SHARD)) num_resist_shard = TRUE; if (rf_has(f, OF_RES_NEXUS)) num_resist_nexus = TRUE; if (rf_has(f, OF_RES_NETHR)) num_resist_neth = TRUE; if (rf_has(f, OF_RES_CHAOS)) num_resist_chaos = TRUE; if (rf_has(f, OF_RES_DISEN)) num_resist_disen = TRUE; /* Sustain flags */ if (rf_has(f, OF_SUST_STR)) num_sustain_str = TRUE; if (rf_has(f, OF_SUST_INT)) num_sustain_int = TRUE; if (rf_has(f, OF_SUST_WIS)) num_sustain_wis = TRUE; if (rf_has(f, OF_SUST_DEX)) num_sustain_dex = TRUE; if (rf_has(f, OF_SUST_CON)) num_sustain_con = TRUE; } /* * Extract the bonuses for items in the home. * * in_item is passed in if you want to pretend that in_item is * the only item in the home. * no_items is passed in as TRUE if you want to pretend that the * home is empty. */ void borg_notice_home(borg_item *in_item, bool no_items) { /* Notice the home equipment */ borg_notice_home_aux1(in_item, no_items); /* Notice the home inventory */ borg_notice_home_aux2(in_item, no_items); } /* * Helper function -- calculate "power" of equipment */ static s32b borg_power_aux1(void) { int hold; int damage, dam; int i; int cur_wgt = 0; int max_wgt = 0; s32b value = 0L; borg_item *item; /* Obtain the "hold" value (weight limit for weapons) */ hold = adj_str_hold[my_stat_ind[A_STR]]; /*** Analyze weapon ***/ /* Examine current weapon */ item = &borg_items[INVEN_WIELD]; /* We give a bonus to wearing an unID'D sword in order to use it and * garner a pseudoID from it. We do not do this late in the game though * because our weapon often has traits that we need in order to be deep (FA, SeeInvis) */ if (borg_skill[BI_CDEPTH] < 10 && borg_skill[BI_MAXCLEVEL] < 15 && item->iqty && item->ident != TRUE) value += 1000000; /* Calculate "average" damage per "normal" blow */ /* and assume we can enchant up to +8 if borg_skill[BI_CLEVEL] > 25 */ damage = (item->dd * item->ds * 20L); /* Reward "damage" and increased blows per round*/ value += damage * (borg_skill[BI_BLOWS]+1); /* Reward "bonus to hit" */ value += ((borg_skill[BI_TOHIT] + item->to_h)*100L ); /* Reward "bonus to dam" */ value += ((borg_skill[BI_TODAM] + item->to_d)*30L); /* extra damage for some */ if (borg_worships_damage) { value += ((borg_skill[BI_TOHIT] + item->to_h)*15L); } /* extra boost for deep dungeon */ if (borg_skill[BI_MAXDEPTH] >= 75) { value += ((borg_skill[BI_TOHIT] + item->to_h)*15L); value += item->dd * item->ds * 20L * 2 * borg_skill[BI_BLOWS]; } /* assume 2x base damage for x% of creatures */ dam = damage * 2 * borg_skill[BI_BLOWS]; if (borg_skill[BI_WS_ANIMAL]) value += (dam * 2) / 2; if (borg_skill[BI_WS_EVIL]) value += (dam * 7) / 2; /* extra damage for some */ if (borg_worships_damage) { value += (dam); } /* assume 3x base damage for x% of creatures */ dam = damage * 3 * borg_skill[BI_BLOWS]; if (borg_skill[BI_WS_UNDEAD] && (!borg_skill[BI_WK_UNDEAD])) value += (dam * 5) / 2; if (borg_skill[BI_WS_DEMON] && (!borg_skill[BI_WK_DEMON])) value += (dam * 3) / 2; if (borg_skill[BI_WS_DRAGON] && (!borg_skill[BI_WK_DRAGON])) value += (dam * 6) / 2; if (borg_skill[BI_WS_GIANT]) value += (dam * 4) / 2; if (borg_skill[BI_WB_ACID]) value += (dam * 4) / 2; if (borg_skill[BI_WB_ELEC]) value += (dam * 5) / 2; if (borg_skill[BI_WB_FIRE]) value += (dam * 3) / 2; if (borg_skill[BI_WB_COLD]) value += (dam * 3) / 2; /* SOrc and STroll get 1/2 of reward now */ if (borg_skill[BI_WS_ORC] ) value += (dam * 1) / 2; if (borg_skill[BI_WS_TROLL] ) value += (dam * 2) / 2; /* and the other 2/2 if SEvil not possesed */ if (borg_skill[BI_WS_ORC] && !borg_skill[BI_WS_EVIL]) value += (dam * 1) / 2; if (borg_skill[BI_WS_TROLL] && !borg_skill[BI_WS_EVIL]) value += (dam * 1) / 2; /* extra damage for some */ if (borg_worships_damage) { value += (dam); } /* assume 5x base damage for x% of creatures */ dam = damage * 5 * borg_skill[BI_BLOWS]; if (borg_skill[BI_WK_UNDEAD]) value += (dam * 5) / 2; if (borg_skill[BI_WK_DEMON]) value += (dam * 5) / 2; if (borg_skill[BI_WK_DRAGON]) value += (dam * 5) / 2; /* extra damage for some */ if (borg_worships_damage) { value += (dam); } /* It used to be only on Grond */ if (borg_skill[BI_W_IMPACT]) value += 50L; /* Hack -- It is hard to hold a heavy weapon */ if (borg_skill[BI_HEAVYWEPON]) value -= 500000L; /* HACK -- Borg worships num_blow, even on broken swords. */ /* kind 47 is a broken sword usually 1d2 in damage */ /* if (item->kind == 47 || item->kind == 30 ||item->kind == 390 ) value -=90000L; */ /* We want low level borgs to have high blows (dagger, whips) */ if (borg_skill[BI_CLEVEL] <= 10) value += borg_skill[BI_BLOWS] * 45000L; /*** Analyze bow ***/ /* Examine current bow */ item = &borg_items[INVEN_BOW]; /* We give a bonus to wearing an unID'D bow in order to use it and * garner a pseudoID from it. We do not do this late in the game though * because our weapon often has traits that we need in order to be deep (FA, SeeInvis) */ if (borg_skill[BI_CDEPTH] < 10 && borg_skill[BI_MAXCLEVEL] < 15 && item->iqty && item->ident != TRUE) value += 6000000; /* Calculate "average" damage per "normal" shot (times 2) */ if ( item->to_d > 8 || borg_skill[BI_CLEVEL] < 25 ) damage = ((my_ammo_sides) + (item->to_d)) * my_ammo_power; else damage = (my_ammo_sides + 8) * my_ammo_power; /* Reward "damage" */ if (borg_worships_damage) { value += (borg_skill[BI_SHOTS] * damage * 11L); } else { value += (borg_skill[BI_SHOTS] * damage * 9L); } /* Extra bonus for low levels, they need a ranged weap */ if (borg_skill[BI_CLEVEL] < 15) value += (borg_skill[BI_SHOTS] * damage * 200L); /* slings force you to carry heavy ammo. Penalty for that unles you have lots of str */ if (item->sval == SV_SLING && !item->name1 && my_stat_ind[A_STR] < 9) { value -= 5000L; } /* Bonus if level 1 to buy a sling, they are cheap ranged weapons */ if (item->sval == SV_SLING && borg_skill[BI_CLEVEL] ==1 && my_stat_ind[A_STR] >= 9) value += 8000; /* Reward "bonus to hit" */ value += ((borg_skill[BI_TOHIT] + item->to_h)*100L);; /* extra damage for some */ if (borg_worships_damage) { value += ((borg_skill[BI_TOHIT] + item->to_h) * 25L); } /* Prefer bows */ if (player_has(PF_EXTRA_SHOT) && my_ammo_tval == TV_ARROW) value += 30000L; /* Hack -- It is hard to hold a heavy weapon */ if (hold < item->weight / 10) value -= 500000L; /*** Analyze dragon armour ***/ /* Examine current armor */ item = &borg_items[INVEN_BODY]; if (item->tval == TV_DRAG_ARMOR && !item->name1) { switch( item->sval) { case SV_DRAGON_BLACK: case SV_DRAGON_BLUE: case SV_DRAGON_WHITE: case SV_DRAGON_RED: value += 1100; break; case SV_DRAGON_GREEN: value += 2750; break; case SV_DRAGON_MULTIHUED: value += 3250; break; case SV_DRAGON_SHINING: case SV_DRAGON_LAW: case SV_DRAGON_BRONZE: case SV_DRAGON_GOLD: case SV_DRAGON_CHAOS: case SV_DRAGON_BALANCE: case SV_DRAGON_POWER: value += 5150; } } /*** Examine the Rings for special types ***/ for (i = INVEN_LEFT; i <= INVEN_RIGHT; i++) { /* Obtain the item */ item = &borg_items[i]; /* Reward the [Elemental] protection rings for their activation */ if (item->kind == RING_FLAMES) value += 25000; if (item->kind == RING_ACID) value += 10000; if (item->kind == RING_ICE) value += 15000; if (item->kind == RING_LIGHTNING) value += 10000; } /*** Reward various things ***/ /* Hack -- Reward light radius */ if (borg_skill[BI_CURLITE] <= 3) value += (borg_skill[BI_CURLITE] * 100000L); if (borg_skill[BI_CURLITE] > 3) value += (300000L) + (borg_skill[BI_CURLITE] * 1000); /* Hack -- Reward speed * see if speed can be a bonus if good speed; not +3. * reward higher for +10 than +50 speed (decreased return). */ if (borg_worships_speed) { if (borg_skill[BI_SPEED] >= 150) value += (((borg_skill[BI_SPEED] - 120) * 1500L) + 185000L); if (borg_skill[BI_SPEED] >= 145 && borg_skill[BI_SPEED] <= 149) value += (((borg_skill[BI_SPEED] - 120) * 1500L) + 180000L); if (borg_skill[BI_SPEED] >= 140 && borg_skill[BI_SPEED] <= 144) value += (((borg_skill[BI_SPEED] - 120) * 1500L) + 175000L); if (borg_skill[BI_SPEED] >= 135 && borg_skill[BI_SPEED] <= 139) value += (((borg_skill[BI_SPEED] - 120) * 1500L) + 175000L); if (borg_skill[BI_SPEED] >= 130 && borg_skill[BI_SPEED] <= 134) value += (((borg_skill[BI_SPEED] - 120) * 1500L) + 160000L); if (borg_skill[BI_SPEED] >= 125 && borg_skill[BI_SPEED] <= 129) value += (((borg_skill[BI_SPEED] - 110) * 1500L) + 135000L); if (borg_skill[BI_SPEED] >= 120 && borg_skill[BI_SPEED] <= 124) value += (((borg_skill[BI_SPEED] - 110) * 1500L) + 110000L); if (borg_skill[BI_SPEED] >= 115 && borg_skill[BI_SPEED] <= 119) value += (((borg_skill[BI_SPEED] - 110) * 1500L) + 85000L); if (borg_skill[BI_SPEED] >= 110 && borg_skill[BI_SPEED] <= 114) value += (((borg_skill[BI_SPEED] - 110) * 1500L) + 65000L); else value += (((borg_skill[BI_SPEED] -110) *2500L)); } else { if (borg_skill[BI_SPEED] >= 140) value += (((borg_skill[BI_SPEED] - 120) * 1000L) + 175000L); if (borg_skill[BI_SPEED] >= 135 && borg_skill[BI_SPEED] <= 139) value += (((borg_skill[BI_SPEED] - 120) * 1000L) + 165000L); if (borg_skill[BI_SPEED] >= 130 && borg_skill[BI_SPEED] <= 134) value += (((borg_skill[BI_SPEED] - 120) * 1000L) + 150000L); if (borg_skill[BI_SPEED] >= 125 && borg_skill[BI_SPEED] <= 129) value += (((borg_skill[BI_SPEED] - 110) * 1000L) + 125000L); if (borg_skill[BI_SPEED] >= 120 && borg_skill[BI_SPEED] <= 124) value += (((borg_skill[BI_SPEED] - 110) * 1000L) + 100000L); if (borg_skill[BI_SPEED] >= 115 && borg_skill[BI_SPEED] <= 119) value += (((borg_skill[BI_SPEED] - 110) * 1000L) + 75000L); if (borg_skill[BI_SPEED] >= 110 && borg_skill[BI_SPEED] <= 114) value += (((borg_skill[BI_SPEED] - 110) * 1000L) + 55000L); else value += (((borg_skill[BI_SPEED] -110) *2500L)); } /* Hack -- Reward strength bonus */ value += (my_stat_ind[A_STR] * 100L); /* Hack -- Reward intelligence bonus */ if ((p_ptr->class->spell_book == TV_MAGIC_BOOK) && (my_stat_ind[A_INT] <= 37 )) { value += (my_stat_ind[A_INT] * 500L); /* Bonus for sp. */ if (borg_worships_mana) { value += ((adj_mag_mana[my_stat_ind[A_INT]] * borg_skill[BI_CLEVEL]) / 2) * 255L; } else { value += ((adj_mag_mana[my_stat_ind[A_INT]] * borg_skill[BI_CLEVEL]) / 2) * 155L; } /* bonus for fail rate */ value += adj_mag_stat[my_stat_ind[A_INT]] * 5010L; /* mage should try to get min fail to 0 */ if (player_has(PF_ZERO_FAIL)) { /* other fail rates */ if (adj_mag_fail[my_stat_ind[A_INT]] < 1) value += 90000L; } } /* Hack -- Reward wisdom bonus */ if ((p_ptr->class->spell_book == TV_PRAYER_BOOK) && (my_stat_ind[A_WIS] <= 37 )) { value += (my_stat_ind[A_WIS] * 200L); /* Bonus for sp. */ value += ((adj_mag_mana[my_stat_ind[A_WIS]] * borg_skill[BI_CLEVEL]) / 2) * 150L; /* bonus for fail rate */ value += adj_mag_stat[my_stat_ind[A_WIS]] * 3000L; /* priest should try to get min fail to 0 */ if (player_has(PF_ZERO_FAIL)) { /* Bonus for priests to in order to keep Holy Word fail rate down */ if (borg_prayer_legal(3, 5)) value += my_stat_ind[A_WIS] * 35000L; if (adj_mag_fail[my_stat_ind[A_WIS]] < 1) value += 70000L; } } /* Dexterity Bonus --good for attacking and ac*/ if (my_stat_ind[A_DEX] <= 37 ) { /* Hack -- Reward bonus */ value += (my_stat_ind[A_DEX] * 120L); } /* Constitution Bonus */ if (my_stat_ind[A_CON] <= 37 ) { int bonus_hp = p_ptr->player_hp[p_ptr->lev-1] + adj_con_mhp[my_stat_ind[A_CON]] * borg_skill[BI_CLEVEL] / 100; if (borg_worships_hp) { value += (my_stat_ind[A_CON] * 250L); /* Hack -- Reward hp bonus */ /* This is a bit wierd because we are not really giving a bonus for */ /* what hp you have, but for the 'bonus' hp you get */ /* getting over 800hp is very important. */ if (bonus_hp < 800) value += bonus_hp * 450L; else value += (bonus_hp-800) * 100L + (350L * 500); } else /*does not worship hp */ { value += (my_stat_ind[A_CON] * 150L); /* Hack -- Reward hp bonus */ /* This is a bit wierd because we are not really giving a bonus for */ /* what hp you have, but for the 'bonus' hp you get */ /* getting over 500hp is very important. */ if (bonus_hp < 500) value += bonus_hp * 350L; else value += (bonus_hp-500) * 100L + (350L * 500); } } /* HACK - a small bonus for adding to stats even above max. */ /* This will allow us to swap a ring of int +6 for */ /* our ring of int +2 even though we are at max int because */ /* we are wielding a weapon that has +4 int */ /* later it might be nice to swap to a weapon that does not */ /* have an int bonus */ for (i = 0; i < 6; i++) value += my_stat_add[i]; /*** Reward current skills ***/ /* Hack -- tiny rewards */ value += (borg_skill[BI_DIS] * 2L); value += (borg_skill[BI_DEV] * 25L); value += (borg_skill[BI_SAV] * 25L); /* perfect saves are very nice */ if (borg_skill[BI_SAV] > 99) value += 10000; value += (borg_skill[BI_STL] * 2L); value += (borg_skill[BI_SRCH] * 1L); value += (borg_skill[BI_SRCHFREQ] * 1L); value += (borg_skill[BI_THN] * 5L); value += (borg_skill[BI_THB] * 35L); value += (borg_skill[BI_THT] * 2L); value += (borg_skill[BI_DIG] * 2L); /*** Reward current flags ***/ /* Various flags */ if (borg_skill[BI_SDIG]) value += 750L; if (borg_skill[BI_SDIG] && borg_skill[BI_ISHUNGRY]) value += 7500L; if (borg_skill[BI_SDIG] && borg_skill[BI_ISWEAK]) value += 7500L; /* Feather Fall if low level is nice */ if (borg_skill[BI_MAXDEPTH] < 20) { if (borg_skill[BI_FEATH]) value += 500L; } else { if (borg_skill[BI_FEATH]) value +=50; } if (borg_skill[BI_LIGHT]) value += 2000L; if (borg_skill[BI_ESP]) { if (borg_skill[BI_SINV]) value += 500L; } if (!borg_skill[BI_DINV]) { if (borg_skill[BI_SINV]) value += 5000L; } if (borg_skill[BI_FRACT]) value += 10000L; /* after you max out you are pretty safe from drainers.*/ if (borg_skill[BI_MAXCLEVEL] < 50) { if (borg_skill[BI_HLIFE]) value += 2000L; } else { if (borg_skill[BI_HLIFE]) value += 200L; } if (borg_skill[BI_REG]) value += 2000L; if (borg_skill[BI_ESP]) value += 80000L; /* Immunity flags */ if (borg_skill[BI_ICOLD]) value += 65000L; if (borg_skill[BI_IELEC]) value += 40000L; if (borg_skill[BI_IFIRE]) value += 80000L; if (borg_skill[BI_IACID]) value += 50000L; /* Resistance flags */ if (borg_skill[BI_RCOLD]) value += 3000L; if (borg_skill[BI_RELEC]) value += 4000L; if (borg_skill[BI_RACID]) value += 6000L; if (borg_skill[BI_RFIRE]) value += 8000L; /* extra bonus for getting all basic resist */ if (borg_skill[BI_RFIRE] && borg_skill[BI_RACID] && borg_skill[BI_RELEC] && borg_skill[BI_RCOLD]) value += 10000L; if (borg_skill[BI_RPOIS]) value += 20000L; if (borg_skill[BI_RSND]) value += 3500L; if (borg_skill[BI_RLITE]) value += 800L; if (borg_skill[BI_RDARK]) value += 800L; if (borg_skill[BI_RKAOS]) value += 5000L; /* this is way boosted to avoid carrying stuff you don't need */ if (borg_skill[BI_RCONF]) value += 80000L; /* mages need a slight boost for this */ if (borg_class == CLASS_MAGE && borg_skill[BI_RCONF]) value +=2000L; if (borg_skill[BI_RDIS]) value += 5000L; if (borg_skill[BI_RSHRD]) value += 100L; if (borg_skill[BI_RNXUS]) value += 100L; if (borg_skill[BI_RBLIND]) value += 5000L; if (borg_skill[BI_RNTHR]) value += 5500L; if (borg_skill[BI_RFEAR]) value += 2000L; /* Sustain flags */ if (borg_skill[BI_SSTR]) value += 50L; if (borg_skill[BI_SINT]) value += 50L; if (borg_skill[BI_SWIS]) value += 50L; if (borg_skill[BI_SCON]) value += 50L; if (borg_skill[BI_SDEX]) value += 50L; /* boost for getting them all */ if (borg_skill[BI_SSTR] && borg_skill[BI_SINT] && borg_skill[BI_SWIS] && borg_skill[BI_SDEX] && borg_skill[BI_SCON]) value += 1000L; /*** XXX XXX XXX Reward "necessary" flags ***/ /* Mega-Hack -- See invisible (level 10) */ if ((borg_skill[BI_SINV] || borg_skill[BI_ESP]) && (borg_skill[BI_MAXDEPTH]+1 >= 10)) value += 100000L; /* Mega-Hack -- Free action (level 20) */ if (borg_skill[BI_FRACT] && (borg_skill[BI_MAXDEPTH]+1 >= 20)) value += 100000L; /* Mega-Hack -- resists (level 25) */ if (borg_skill[BI_RFIRE] && (borg_skill[BI_MAXDEPTH]+1 >= 25)) value += 100000L; /* Mega-Hack -- resists (level 40) */ if (borg_skill[BI_RPOIS] && (borg_skill[BI_MAXDEPTH]+1 >= 40)) value += 100000L; if (borg_skill[BI_RELEC] && (borg_skill[BI_MAXDEPTH]+1 >= 40)) value += 100000L; if (borg_skill[BI_RACID] && (borg_skill[BI_MAXDEPTH]+1 >= 40)) value += 100000L; if (borg_skill[BI_RCOLD] && (borg_skill[BI_MAXDEPTH]+1 >= 40)) value += 100000L; /* Mega-Hack -- Speed / Hold Life (level 46) and maxed out */ if ((borg_skill[BI_HLIFE] && (borg_skill[BI_MAXDEPTH]+1 >= 46) && (borg_skill[BI_MAXCLEVEL] < 50))) value += 100000L; if ((borg_skill[BI_SPEED] >= 115) && (borg_skill[BI_MAXDEPTH]+1 >=46)) value +=100000L; if (borg_skill[BI_RCONF] && (borg_skill[BI_MAXDEPTH]+1 >= 46)) value += 100000L; /* Mega-Hack -- resist Nether is -very- nice to have at level 50 */ if (borg_skill[BI_RNTHR] && (borg_skill[BI_MAXDEPTH]+1 >= 50)) value += 55000L; /* Mega-Hack -- resist Sound to avoid being KO'd */ if (borg_skill[BI_RSND] && (borg_skill[BI_MAXDEPTH]+1 >= 50)) value += 100000L; /* Mega-Hack -- resists & Telepathy (level 55) */ if (borg_skill[BI_RBLIND] && (borg_skill[BI_MAXDEPTH]+1 >= 55)) value += 100000L; if (borg_skill[BI_ESP] && (borg_skill[BI_MAXDEPTH]+1 >= 55)) value += 100000L; if (borg_skill[BI_RNTHR] && (borg_skill[BI_MAXDEPTH]+1 >= 60)) value += 55000L; /* Mega-Hack -- resists & +10 speed (level 60) */ if (borg_skill[BI_RKAOS] && (borg_skill[BI_MAXDEPTH]+1 >= 60)) value += 104000L; if (borg_skill[BI_RDIS] && (borg_skill[BI_MAXDEPTH]+1 >= 60)) value += 90000L; if ((borg_skill[BI_SPEED] >= 120) && (borg_skill[BI_MAXDEPTH]+1 >=60)) value +=100000L; /* Must have +20 speed (level 80) */ if ((borg_skill[BI_SPEED] >= 130) && (borg_skill[BI_MAXDEPTH]+1 >=80)) value +=100000L; /* Not Req, but a good idea: * Extra boost to Nether deeper down * RDark for deeper uniques * Good to have +30 speed */ if (borg_skill[BI_RNTHR] && (borg_skill[BI_MAXDEPTH]+1 >= 80)) value += 15000L; if (borg_skill[BI_RDARK] && (borg_skill[BI_MAXDEPTH]+1 >= 80)) value += 25000L; if ((borg_skill[BI_SPEED] >= 140) && (borg_skill[BI_MAXDEPTH]+1 >=80) && borg_class == CLASS_WARRIOR) value += 100000L; /*** Reward powerful armor ***/ /* Reward armor */ if (borg_worships_ac) { if (borg_skill[BI_ARMOR] < 15) value += ((borg_skill[BI_ARMOR]) * 2500L); if (borg_skill[BI_ARMOR] >= 15 && borg_skill[BI_ARMOR] < 75) value += ((borg_skill[BI_ARMOR]) * 2000L) + 28250L; if (borg_skill[BI_ARMOR] >= 75) value += ((borg_skill[BI_ARMOR]) * 1500L) + 73750L; } else { if (borg_skill[BI_ARMOR] < 15) value += ((borg_skill[BI_ARMOR]) * 2000L); if (borg_skill[BI_ARMOR] >= 15 && borg_skill[BI_ARMOR] < 75) value += ((borg_skill[BI_ARMOR]) * 500L) + 28350L; if (borg_skill[BI_ARMOR] >= 75) value += ((borg_skill[BI_ARMOR]) * 100L) + 73750L; } /* Hack-- Reward the borg for carrying a NON*ID* item * this way he will pull it from the house and *ID* it. */ if (amt_ego || ((e_info[borg_items[INVEN_OUTER].name2].xtra == OBJECT_XTRA_TYPE_RESIST || e_info[borg_items[INVEN_OUTER].name2].xtra == OBJECT_XTRA_TYPE_POWER) && !borg_items[INVEN_OUTER].fully_identified)) value += 999999L; /*** Penalize various things ***/ /* Penalize various flags */ if (borg_skill[BI_CRSTELE]) value -= 100000L; if (borg_class == CLASS_MAGE && borg_skill[BI_CRSAGRV]) value -= 800000L; else if (borg_skill[BI_CRSAGRV]) value -= 800000L; if (borg_skill[BI_CRSHPIMP]) value -=35000; if (borg_class != CLASS_WARRIOR && borg_skill[BI_CRSMPIMP]) value -=15000; if ((borg_class == CLASS_MAGE || borg_class == CLASS_PRIEST) && borg_skill[BI_CRSMPIMP]) value -=15000; if (borg_skill[BI_CRSFEAR]) value -= 400000L; if (borg_skill[BI_CRSFEAR] && borg_class != CLASS_MAGE) value -= 200000L; if (borg_skill[BI_CRSFVULN]) value -=30000; if (borg_skill[BI_CRSEVULN]) value -=30000; if (borg_skill[BI_CRSCVULN]) value -=30000; if (borg_skill[BI_CRSAVULN]) value -=30000; /*** Penalize armor weight ***/ if (my_stat_ind[A_STR] < 15) { if (borg_items[INVEN_BODY].weight > 200) value -= (borg_items[INVEN_BODY].weight - 200) * 15; if (borg_items[INVEN_HEAD].weight > 30) value -= 250; if (borg_items[INVEN_ARM].weight > 10) value -= 250; if (borg_items[INVEN_FEET].weight > 50) value -= 250; } /* Compute the total armor weight */ cur_wgt += borg_items[INVEN_BODY].weight; cur_wgt += borg_items[INVEN_HEAD].weight; cur_wgt += borg_items[INVEN_ARM].weight; cur_wgt += borg_items[INVEN_OUTER].weight; cur_wgt += borg_items[INVEN_HANDS].weight; cur_wgt += borg_items[INVEN_FEET].weight; /* Determine the weight allowance */ max_wgt = p_ptr->class->spell_weight; /* Hack -- heavy armor hurts magic */ if (p_ptr->class->spell_book && ((cur_wgt - max_wgt) / 10) > 0) { /* Mega-Hack -- Penalize heavy armor which hurts mana */ if (borg_skill[BI_MAXSP] >= 300 && borg_skill[BI_MAXSP] <= 350) value -= (((cur_wgt - max_wgt) / 10) * 400L); if (borg_skill[BI_MAXSP] >= 200 && borg_skill[BI_MAXSP] <= 299) value -= (((cur_wgt - max_wgt) / 10) * 800L); if (borg_skill[BI_MAXSP] >= 100 && borg_skill[BI_MAXSP] <= 199) value -= (((cur_wgt - max_wgt) / 10) * 1600L); if (borg_skill[BI_MAXSP] >= 1 && borg_skill[BI_MAXSP] <= 99) value -= (((cur_wgt - max_wgt) / 10) * 3200L); } /*** Penalize bad magic ***/ /* Hack -- most gloves hurt magic for spell-casters */ if (player_has(PF_CUMBER_GLOVE) && borg_class == CLASS_MAGE) { item = &borg_items[INVEN_HANDS]; /* Penalize non-usable gloves */ if (item->iqty && (!of_has(item->flags, OF_FREE_ACT) && !(of_has(item->flags, OF_DEX) && item->pval > 0)) && !(item->sval == SV_SET_OF_ALCHEMISTS_GLOVES)) { /* Hack -- Major penalty */ value -= 275000L; } } /* Hack -- most edged weapons hurt magic for priests */ if (player_has(PF_BLESS_WEAPON)) { item = &borg_items[INVEN_WIELD]; /* Penalize non-blessed edged weapons */ if ((item->tval == TV_SWORD || item->tval == TV_POLEARM) && !of_has(item->flags, OF_BLESSED)) { /* Hack -- Major penalty */ value -= 75000L; } } #if 0 /* I wonder if this causes the borg to change his gear so radically at depth 99 */ /* HUGE MEGA MONDO HACK! prepare for the big fight */ /* go after Morgoth new priorities. */ if ((borg_skill[BI_MAXDEPTH]+1 == 100 || borg_skill[BI_CDEPTH] == 100) && (!borg_skill[BI_KING])) { /* protect from stat drain */ if (borg_skill[BI_SSTR]) value += 35000L; /* extra bonus for spell casters */ if (p_ptr->class->spell_book == TV_MAGIC_BOOK && borg_skill[BI_SINT]) value += 45000L; /* extra bonus for spell casters */ if (p_ptr->class->spell_book == TV_PRAYER_BOOK && borg_skill[BI_SWIS]) value += 35000L; if (borg_skill[BI_SCON]) value += 55000L; if (borg_skill[BI_SDEX]) value += 15000L; if (borg_skill[BI_WS_EVIL]) value += 15000L; /* Another bonus for resist nether, poison and base four */ if (borg_skill[BI_RNTHR]) value += 15000L; if (borg_skill[BI_RDIS]) value += 15000L; /* to protect against summoned baddies */ if (borg_skill[BI_RPOIS]) value += 100000L; if (borg_skill[BI_RFIRE] && borg_skill[BI_RACID] && borg_skill[BI_RELEC] && borg_skill[BI_RCOLD]) value += 100000L; } #endif /* Reward for activatable Artifacts in inventory */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { int multibonus = 0; item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Good to have one item with multiple high resists */ multibonus = (of_has(item->flags, OF_RES_POIS) + of_has(item->flags, OF_RES_BLIND) + of_has(item->flags, OF_RES_CONFU) + of_has(item->flags, OF_RES_SOUND) + of_has(item->flags, OF_RES_SHARD) + of_has(item->flags, OF_RES_NEXUS) + of_has(item->flags, OF_RES_NETHR) + of_has(item->flags, OF_RES_CHAOS) + of_has(item->flags, OF_RES_DISEN) + (of_has(item->flags, OF_RES_FIRE) && of_has(item->flags, OF_RES_COLD) && of_has(item->flags, OF_RES_ELEC) && of_has(item->flags, OF_RES_ACID)) + (of_has(item->flags, OF_SUST_STR) && of_has(item->flags, OF_SUST_INT) && of_has(item->flags, OF_SUST_WIS) && of_has(item->flags, OF_SUST_DEX) && of_has(item->flags, OF_SUST_CON))); if (multibonus >= 2) value += 3000 * multibonus; /* This needs to be changed */ switch (item->activation) { /* Artifact -- Narthanc- fire bolt 9d8*/ /* Artifact -- Paurhach- fire bolt 9d8 */ case EF_FIRE_BOLT: value +=(500+(9*(8+1)/2)); break; /* Artifact -- Nimthanc- frost bolt 6d8*/ /* Artifact -- Paurnimmen- frost bolt 6d8 */ case EF_COLD_BOLT: value +=(500+(6*(8+1)/2)); break; /* Artifact -- Dethanc- electric bolt 4d8*/ /* Artifact -- Pauraegen- lightning bolt 4d8 */ case EF_ELEC_BOLT: value +=(500+(4*(8+1)/2)); break; /* Artifact -- Rilia- poison gas 12*/ case EF_STINKING_CLOUD: value +=(500+(24)); break; /* Artifact -- Belangil- frost ball 48*/ case EF_COLD_BALL50: value +=(500+(96)); break; /* Artifact -- Arunruth- frost bolt 12d8*/ case EF_COLD_BOLT2: value +=(500+(12*(8+1)/2)); break; /* Artifact -- Ringil- frost ball 100*/ /* Artifact -- Aeglos- frost ball 100*/ case EF_COLD_BALL100: value +=(500+(200)); /* extra boost for speed */ if (!op_ptr->opt[OPT_birth_randarts] && !op_ptr->opt[OPT_birth_randarts]) value +=25000L; break; /* Artifact -- Anduril- fire ball 72*/ /* Artifact -- Firestar- fire ball 72 */ case EF_FIRE_BALL: value +=(500+(144)); break; /* Artifact -- NARYA- FIRE BALL 120 */ case EF_FIRE_BALL2: value +=(500+(240)); break; /* Artifact -- Theoden- drain Life 120*/ case EF_DRAIN_LIFE2: value +=(500+120); break; /* Artifact -- Totila- confusion */ case EF_CONFUSE2: value +=(500+(200)); break; /* Artifact -- TURMIL- drain life 90 */ case EF_DRAIN_LIFE1: value +=(500+90); break; /* Artifact -- Razorback- spikes 150 */ /* Artifact -- FINGOLFIN- MISSILE 150 (bonus for TH TD)*/ case EF_ARROW: value +=(500+(300)); break; /* Artifact -- Cammithrim- Magic Missile 2d6 */ case EF_MISSILE: value +=(500+(2*(6+1)/2)); break; /* Artifact -- PaurNEN- ACID bolt 5d8 */ case EF_ACID_BOLT: value +=(500+(5*(8+1)/2)); break; /* Artifact -- INGWE- DISPEL EVIL X5 */ case EF_DISPEL_EVIL: value +=(500+(10 + (borg_skill[BI_CLEVEL]*5)/2)); break; /* Artifact -- NENYA- COLD BALL 200 */ case EF_COLD_BALL2: value +=(500+(400)); break; /* Artifact -- VILYA- ELEC BALL 250 */ case EF_ELEC_BALL2: value +=(500+(500)); break; /* Artifact -- POWER One Ring-*/ case EF_BIZARRE: value +=(999999); break; /* Artifact -- Ulmo- tele way */ case EF_TELE_OTHER: if (borg_class == CLASS_MAGE) { value +=500; } else value +=(500+(500)); break; /* Artifact -- Colluin - bladturner Resistance */ case EF_RESIST_ALL: value +=(500+(150)); /* extra bonus for the non spell guys */ if (borg_class == CLASS_WARRIOR || borg_class == CLASS_ROGUE || borg_class == CLASS_PALADIN) value +=25000; break; /* Artifact -- Holcolleth -- Sleep II */ case EF_SLEEPII: if ((borg_class == CLASS_MAGE) || (borg_class == CLASS_PRIEST) ) { value +=500; } else value +=(500+(200)); break; /* Artifact -- Thingol recharge */ case EF_RECHARGE: if (borg_class == CLASS_MAGE) { value +=500; } else value +=(500+(100)); break; /* Artifact -- Holehenth detection */ /* Artifact -- Dal fear and poison */ case EF_REM_FEAR_POIS: if (borg_class == CLASS_MAGE || borg_class == CLASS_PRIEST) { value +=500; } else value +=(500+(200)); break; /* Artifact -- Carlammas PFE*/ /* Artifact -- Lotharang- cure light */ /* Artifact -- Eriril id */ /* Artifact -- Cubragol brand bolts, bonus for speed */ case EF_FIREBRAND: value +=(500+(300)); /* extra boost for speed */ if (!op_ptr->opt[OPT_birth_randarts] && !op_ptr->opt[OPT_birth_randarts]) value +=25000L; break; /* Artifact -- Avavir WoR */ /* Artifact -- Taratol, feanor, tulkas speed */ /* Artifact -- Soulkeeper, Gondor heal */ /* Artifact -- Belegonnon phase */ /* Artifact -- Colannon teleport */ /* Artifact -- Luthien RLL */ /* Artifact -- Phial */ /* Artifact -- Star */ case EF_MAPPING: value +=(1200); break; /* Artifact -- Arkstone */ } } /* Result */ return (value); } /* * Helper function -- calculate power of inventory */ static s32b borg_power_aux2(void) { int k, carry_capacity, inven_weight, book; s32b value = 0L; /*** Basic abilities ***/ /* * In here, we must subtract out the bonus granted from certain * Artifacts. They grant amt_x = 1000 then the power is increased * by 1000 times whatever bonus. In the case of Gondor. This is * 1000 heals times 4000 points per heal. * */ /* Reward fuel */ k = 0; for (; k < 6 && k < borg_skill[BI_AFUEL]; k++) value += 60000L; if (borg_skill[BI_STR] >= 15) { for (; k < 10 && k < borg_skill[BI_AFUEL]; k++) value += 6000L - (k * 100); } /* Reward Food */ /* if hungry, food is THE top priority */ if ((borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK]) && borg_skill[BI_FOOD]) value += 100000; k = 0; for (; k < 7 && k < borg_skill[BI_FOOD]; k++) value += 50000L; if (borg_skill[BI_STR] >= 15) { for (; k < 10 && k < borg_skill[BI_FOOD]; k++) value += 200L; } if (borg_skill[BI_REG] && borg_skill[BI_CLEVEL] <=15) { k=0; for (; k < 15 && k < borg_skill[BI_FOOD]; k++) value += 700L; } /* Prefere to buy HiCalorie foods over LowCalorie */ if (amt_food_hical <= 5) value += amt_food_hical * 50; /* Reward Cure Poison and Cuts*/ if ((borg_skill[BI_ISCUT] || borg_skill[BI_ISPOISONED]) && borg_skill[BI_ACCW]) value +=100000; if ((borg_skill[BI_ISCUT] || borg_skill[BI_ISPOISONED]) && borg_skill[BI_AHEAL]) value +=50000; if ((borg_skill[BI_ISCUT] || borg_skill[BI_ISPOISONED]) && borg_skill[BI_ACSW]) { /* usually takes more than one */ k = 0; for (; k < 5 && k < borg_skill[BI_ACSW]; k++) value += 25000L; } if (borg_skill[BI_ISPOISONED] && borg_skill[BI_ACUREPOIS]) value +=15000; if (borg_skill[BI_ISPOISONED] && amt_slow_poison) value +=5000; /* collect Resistance pots if not immune -- All Classes */ if (!borg_skill[BI_IPOIS] && borg_skill[BI_ACUREPOIS] <= 20) { /* Not if munchkin starting */ if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] < borg_munchkin_level) { /* Do not carry these until later */ } else { for (; k < 4 && k < borg_skill[BI_ARESPOIS]; k++) value += 300L; } } /* Reward Resistance Potions for Warriors */ if (borg_class == CLASS_WARRIOR && borg_skill[BI_MAXDEPTH] > 20) { k = 0; /* Not if munchkin starting */ if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] < borg_munchkin_level) { /* Do not carry these until later */ } else { /* collect pots if not immune */ if (!borg_skill[BI_IFIRE]) { for (; k < 4 && k < borg_skill[BI_ARESHEAT]; k++) value += 500L; } k = 0; /* collect pots if not immune */ if (!borg_skill[BI_ICOLD]) { for (; k < 4 && k < borg_skill[BI_ARESCOLD]; k++) value += 500L; } /* collect pots if not immune */ if (!borg_skill[BI_IPOIS]) { for (; k < 4 && k < borg_skill[BI_ARESPOIS]; k++) value += 500L; } } } /* Reward ident */ k = 0; if (borg_skill[BI_CLEVEL] >= 10) { for (; k < 5 && k < borg_skill[BI_AID]; k++) value += 6000L; if (borg_skill[BI_STR] >= 15) { for (; k < 15 && k < borg_skill[BI_AID]; k++) value += 600L; } } /* Reward ID if I am carrying a {magical} or {excellent} item */ if (my_need_id) { k = 0; for (; k < my_need_id && k < borg_skill[BI_AID]; k++) value += 6000L; } /* Reward PFE carry lots of these*/ k = 0; /* Not if munchkin starting */ if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] < borg_munchkin_level) { /* Do not carry these until later */ } else { for (; k < 10 && k < borg_skill[BI_APFE]; k++) value += 10000L; for (; k < 25 && k < borg_skill[BI_APFE]; k++) value += 2000L; } /* Reward Glyph- Rune of Protection- carry lots of these*/ k = 0; for (; k < 10 && k < borg_skill[BI_AGLYPH]; k++) value += 10000L; for (; k < 25 && k < borg_skill[BI_AGLYPH]; k++) value += 2000L; if (borg_skill[BI_MAXDEPTH] >= 100) { k = 0; for (; k < 10 && k < borg_skill[BI_AGLYPH]; k++) value += 2500L; for (; k < 75 && k < borg_skill[BI_AGLYPH]; k++) value += 2500L; } /* Reward Scroll of Mass Genocide, only when fighting Morgoth */ if (borg_skill[BI_MAXDEPTH] >= 100) { k = 0; for (; k < 99 && k < borg_skill[BI_AMASSBAN]; k++) value += 2500L; } /* Reward recall */ k = 0; if (borg_skill[BI_CLEVEL] > 7) { /* Not if munchkin starting */ if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] < borg_munchkin_level) { /* Do not carry these until later */ } else { for (; k < 3 && k < borg_skill[BI_RECALL]; k++) value += 50000L; if (borg_skill[BI_STR] >= 15) { for (; k < 7 && k < borg_skill[BI_RECALL]; k++) value += 5000L; } /* Deep borgs need the rod to avoid low mana traps */ if (borg_skill[BI_MAXDEPTH] >= 50 && borg_has[ROD_RECALL]) value +=12000; } } /* Reward phase */ k = 1; /* first phase door is very important */ if (borg_skill[BI_APHASE]) value += 50000; /* Not if munchkin starting */ if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] < borg_munchkin_level) { /* Do not carry these until later */ } else { for (; k < 8 && k < borg_skill[BI_APHASE]; k++) value += 500L; if (borg_skill[BI_STR] >= 15) { for (; k < 15 && k < borg_skill[BI_APHASE]; k++) value += 500L; } } /* Reward escape (staff of teleport or artifact */ k = 0; if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] < borg_munchkin_level) { /* Do not carry these until later */ } else { for (; k < 2 && k < borg_skill[BI_AESCAPE]; k++) value += 10000L; if (borg_skill[BI_CDEPTH] > 70) { k = 0; for (; k < 3 && k < borg_skill[BI_AESCAPE]; k++) value += 10000L; } } /* Reward teleport scroll*/ k = 0; if (borg_skill[BI_CLEVEL] >=3) { if (borg_skill[BI_ATELEPORT]) value += 10000L; } if (borg_skill[BI_CLEVEL] >= 7) { for (; k < 3 && k < borg_skill[BI_ATELEPORT]; k++) value += 10000L; } if (borg_skill[BI_CLEVEL] >=30) { for (; k < 10 && k < borg_skill[BI_ATELEPORT]; k++) value += 10000L; } /* Reward Teleport Level scrolls */ k = 0; if (borg_skill[BI_CLEVEL] >= 15) { for (; k < 5 && k < borg_skill[BI_ATELEPORTLVL]; k++) value += 5000L; } /*** Healing ***/ if (borg_class == CLASS_WARRIOR || borg_class == CLASS_ROGUE) { k = 0; for (; k < 15 && k < borg_skill[BI_AHEAL]; k++) value += 8000L; k = 0; /* carry a couple for emergency. Store the rest. */ if (borg_skill[BI_MAXDEPTH] >= 46) { if (borg_scumming_pots) { for (; k < 1 && k < borg_skill[BI_AEZHEAL]; k++) value +=10000L; } else { for (; k < 2 && k < borg_skill[BI_AEZHEAL]; k++) value +=10000L; } } /* These guys need to carry the rods more, town runs low on supply. */ k = 0; for (; k < 6 && k < borg_has[ROD_HEAL]; k++) value +=20000L; } else if (borg_class == CLASS_RANGER || borg_class == CLASS_PALADIN || borg_class == CLASS_MAGE) { k = 0; for (; k < 10 && k < borg_skill[BI_AHEAL]; k++) value += 4000L; k = 0; /* carry a couple for emergency. Store the rest. */ if (borg_skill[BI_MAXDEPTH] >= 46) { if (borg_scumming_pots) { for (; k < 1 && k < borg_skill[BI_AEZHEAL]; k++) value +=10000L; } else { for (; k < 2 && k < borg_skill[BI_AEZHEAL]; k++) value +=10000L; } } if (borg_class == CLASS_PALADIN) { /* Reward heal potions */ k = 0; for (; k < 3 && k < borg_has[POTION_HEAL]; k++) value += 5000L; } /* These guys need to carry the rods more, town runs low on supply. */ k = 0; for (; k < 4 && k < borg_has[ROD_HEAL]; k++) value +=20000L; } else if (borg_class == CLASS_PRIEST) { /* Level 1 priests are given a Potion of Healing. It is better * for them to sell that potion and buy equipment or several * Cure Crits with it. */ if (borg_skill[BI_CLEVEL] == 1) { k = 0; for (; k < 10 && k < borg_has[POTION_HEAL]; k++) value -= 2000L; } /* Reward heal potions */ k = 0; for (; k < 5 && k < borg_has[POTION_HEAL]; k++) value += 2000L; k = 0; /* carry a couple for emergency. Store the rest. */ if (borg_skill[BI_MAXDEPTH] >= 46) { if (borg_scumming_pots) { for (; k < 1 && k < borg_skill[BI_AEZHEAL]; k++) value +=10000L; } else { for (; k < 2 && k < borg_skill[BI_AEZHEAL]; k++) value +=10000L; } } } /* Collecting Potions, prepping for Morgoth/Sauron fight */ if (borg_skill[BI_MAXDEPTH] >= 99) { /* Sauron is alive -- carry them all*/ if (borg_race_death[546] == 0) { k = 0; for (; k < 99 && k < borg_has[POTION_HEAL]; k++) value += 8000L; k = 0; for (; k < 99 && k < borg_skill[BI_AEZHEAL]; k++) value +=10000L; k = 0; for (; k < 99 && k < borg_skill[BI_ASPEED]; k++) value += 8000L; k = 0; for (; k < 99 && k < borg_skill[BI_ALIFE]; k++) value +=10000L; k = 0; if (borg_class != CLASS_WARRIOR) { for (; k < 99 && k < borg_has[POTION_RES_MANA]; k++) value += 5000L; } k = 0; for (; k < 40 && k < borg_has[SHROOM_STONESKIN]; k++) value += 5000L; /* No need to store extras in home */ borg_scumming_pots = FALSE; } /* Sauron is dead -- store them unless I have enough */ if (borg_race_death[546] != 0) { /* Must scum for more pots */ if ((num_heal_true + borg_has[POTION_HEAL] + num_ezheal_true + borg_skill[BI_AEZHEAL] < 30) || (num_ezheal_true + borg_skill[BI_AEZHEAL] < 20) || (num_speed + borg_skill[BI_ASPEED] < 15)) { /* leave pots at home so they dont shatter */ borg_scumming_pots = TRUE; } /* I have enough, carry all pots, and other good stuff. */ else { k = 0; for (; k < 99 && k < borg_has[POTION_HEAL]; k++) value += 8000L; k = 0; for (; k < 99 && k < borg_skill[BI_AEZHEAL]; k++) value +=10000L; k = 0; for (; k < 99 && k < borg_skill[BI_ALIFE]; k++) value +=10000L; k = 0; for (; k < 99 && k < borg_skill[BI_ASPEED]; k++) value +=8000L; k = 0; for (; k < 40 && k < borg_has[SHROOM_STONESKIN]; k++) value += 5000L; k = 0; if (borg_class != CLASS_WARRIOR) { for (; k < 99 && k < borg_has[POTION_RES_MANA]; k++) value += 5000L; } /* Shrooms of Restoring */ k = 0; for (; k < 35 && k < amt_fix_stat[6]; k++) value += 5000L; /* Reward Scroll of Mass Genocide, only when fighting Morgoth */ k = 0; for (; k < 99 && k < borg_skill[BI_AMASSBAN]; k++) value += 2500L; /* No need to store extras in home */ borg_scumming_pots = FALSE; } } } /* Restore Mana */ if (borg_skill[BI_MAXSP] > 100) { k = 0; for (; k < 10 && k < borg_has[POTION_RES_MANA]; k++) value += 4000L; k = 0; for (; k < 100 && k < borg_skill[BI_ASTFMAGI]; k++) value += 4000L; } /* Reward Cure Critical. Heavy reward on first 5 */ if (borg_skill[BI_CLEVEL] < 35 && borg_skill[BI_CLEVEL] > 10) { k = 0; for (; k < 10 && k < borg_skill[BI_ACCW]; k++) value += 5000L; } else if (borg_skill[BI_CLEVEL] > 35) { /* Reward cure critical. Later on in game. */ k = 0; for (; k < 10 && k < borg_skill[BI_ACCW]; k++) value += 5000L; if (borg_skill[BI_STR] > 15) { for (; k < 15 && k < borg_skill[BI_ACCW]; k++) value += 500L; } } /* Reward cure serious -- only reward serious if low on crits */ if (borg_skill[BI_ACCW] < 5 && borg_skill[BI_MAXCLEVEL] > 10 && (borg_skill[BI_CLEVEL] < 35 || !borg_skill[BI_RCONF])) { k = 0; for (; k < 7 && k < borg_skill[BI_ACSW]; k++) value += 50L; if (borg_skill[BI_STR] > 15) { for (; k < 10 && k < borg_skill[BI_ACSW]; k++) value += 5L; } } /* Reward cure light -- Low Level Characters */ if ((borg_skill[BI_ACCW] + borg_skill[BI_ACSW] < 5) && borg_skill[BI_CLEVEL] < 8) { k = 0; for (; k < 5 && k < borg_skill[BI_ACLW]; k++) value += 550L; } /* Reward Cures */ if (!borg_skill[BI_RCONF]) { if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] < 10) { /* Do not carry these until later */ } else { k = 0; for (; k < 10 && k < amt_cure_confusion; k++) value += 400L; } } if (!borg_skill[BI_RBLIND]) { k = 0; if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] < borg_munchkin_level) { /* Do not carry these until later */ } else { for (; k < 5 && k < amt_cure_blind; k++) value += 300L; } } if (!borg_skill[BI_RPOIS]) { k = 0; if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] < borg_munchkin_level) { /* Do not carry these until later */ } else { for (; k < 5 && k < borg_skill[BI_ACUREPOIS]; k++) value += 250L; } } /*** Detection ***/ /* Reward detect trap */ k = 0; for (; k < 1 && k < borg_skill[BI_ADETTRAP]; k++) value += 4000L; /* Reward detect door */ k = 0; for (; k < 1 && k < borg_skill[BI_ADETDOOR]; k++) value += 2000L; /* Reward detect evil for non spell caster guys */ if (!borg_skill[BI_ESP] && !borg_prayer_legal(0, 0) && !borg_spell_legal(0, 1)) { k = 0; for (; k < 1 && k < borg_skill[BI_ADETEVIL]; k++) value += 1000L; } /* Reward magic mapping */ k = 0; for (; k < 1 && k < borg_skill[BI_AMAGICMAP]; k++) value += 4000L; /* Reward call lite */ k = 0; for (; k < 1 && k < borg_skill[BI_ALITE]; k++) value += 1000L; /* Genocide scrolls. Just scrolls, mainly used for Morgoth */ if (borg_skill[BI_MAXDEPTH] >= 100) { k = 0; for (; k < 10 && k < borg_has[SCROLL_GENOCIDE]; k++) value += 10000L; for (; k < 25 && k < borg_has[SCROLL_GENOCIDE]; k++) value += 2000L; } /* Reward speed potions/rods/staves (but no staves deeper than depth 95) */ k = 0; if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] < borg_munchkin_level) { /* Do not carry these until later */ } else { for (; k < 20 && k < borg_skill[BI_ASPEED]; k++) value += 5000L; } /* Reward Recharge ability */ if (borg_skill[BI_ARECHARGE] && borg_skill[BI_MAXDEPTH] < 99) value += 5000L; /*** Missiles ***/ /* Reward missiles */ if (borg_class == CLASS_RANGER || borg_class == CLASS_WARRIOR) { k = 0; for (; k < 40 && k < borg_skill[BI_AMISSILES]; k++) value += 1000L; if (borg_skill[BI_STR] > 15 && borg_skill[BI_STR] < 18) { for (; k < 80 && k < borg_skill[BI_AMISSILES]; k++) value += 100L; } if (borg_skill[BI_STR] > 18) { for (; k < 180 && k < borg_skill[BI_AMISSILES]; k++) value += 80L; } } else { k = 0; for (; k < 20 && k < borg_skill[BI_AMISSILES] && k < 99; k++) value += 1000L; if (borg_skill[BI_STR] > 15) { for (; k < 50 && k < borg_skill[BI_AMISSILES] && k < 99; k++) value += 100L; } /* Don't carry too many */ if (borg_skill[BI_STR] <= 15 && borg_skill[BI_AMISSILES] > 20) value -= 1000L; } /* Potions of Detonations */ k = 0; for (; k < 15 && k < borg_skill[BI_ADETONATE]; k++) value += 2000L; /*** Various ***/ /* -- Reward carrying a staff of destruction. */ if (borg_skill[BI_ASTFDEST]) value += 5000L; k=0; for (; k < 9 && k < borg_skill[BI_ASTFDEST]; k++) value += 200L; /* -- Reward carrying a wand of Teleport Other. */ if (borg_skill[BI_ATPORTOTHER]) value += 5000L; /* Much greater reward for Warrior */ if (borg_class == CLASS_WARRIOR && borg_skill[BI_ATPORTOTHER]) value += 50000L; /* reward per charge */ k=0; for (; k < 15 && k < borg_skill[BI_ATPORTOTHER]; k++) value += 5000L; /* -- Reward carrying an attack wand. */ if ((borg_has[WAND_MM] || borg_has[WAND_SCLOUD]) && borg_skill[BI_MAXDEPTH] < 30) value += 5000L; if (borg_has[WAND_ANNILATION] && borg_skill[BI_CDEPTH] < 30) value += 5000L; /* Much greater reward for Warrior or lower level */ if ((borg_class == CLASS_WARRIOR || borg_skill[BI_CLEVEL] <= 20) && (borg_has[WAND_MM] || borg_has[WAND_ANNILATION] || borg_has[WAND_SCLOUD])) value += 10000L; /* reward per charge */ value += amt_cool_wand * 50L; /* These staves are great but do not clutter inven with them */ /* -- Reward carrying a staff of holiness/power */ if (amt_cool_staff) value += 2500L; k=0; for (; k < 3 && k < amt_cool_staff; k++) value += 500L; /* Rods of attacking are good too */ k = 0; for (; k < 6 && k < borg_skill[BI_AROD1]; k++) value += 8000; k = 0; for (; k < 6 && k < borg_skill[BI_AROD2]; k++) value += 12000; /* Hack -- Reward add stat */ if (amt_add_stat[A_STR]) value += 50000; if (amt_add_stat[A_INT]) value += 20000; if (p_ptr->class->spell_book == TV_MAGIC_BOOK) if (amt_add_stat[A_INT]) value += 50000; if (amt_add_stat[A_WIS]) value += 20000; if (p_ptr->class->spell_book == TV_PRAYER_BOOK) if (amt_add_stat[A_WIS]) value += 50000; if (amt_add_stat[A_DEX]) value += 50000; if (amt_add_stat[A_CON]) value += 50000; /* Hack -- Reward stat potions */ if (amt_inc_stat[A_STR] && my_stat_cur[A_STR] < (18+100)) value += 550000; if (amt_inc_stat[A_INT] && my_stat_cur[A_INT] < (18+100)) value += 520000; if (p_ptr->class->spell_book == TV_MAGIC_BOOK) if (amt_inc_stat[A_INT] && my_stat_cur[A_INT] < (18+100)) value += 575000; if (amt_inc_stat[A_WIS] && my_stat_cur[A_WIS] < (18+100)) value += 520000; if (p_ptr->class->spell_book == TV_PRAYER_BOOK) if (amt_inc_stat[A_WIS] && my_stat_cur[A_WIS] < (18+100)) value += 575000; if (amt_inc_stat[A_DEX] && my_stat_cur[A_DEX] < (18+100)) value += 550000; if (amt_inc_stat[A_CON] && my_stat_cur[A_CON] < (18+100)) value += 550000; /* Hack -- Reward fix stat */ if (amt_fix_stat[A_STR]) value += 10000; if (amt_fix_stat[A_INT]) value += 10000; if (amt_fix_stat[A_WIS]) value += 10000; if (amt_fix_stat[A_DEX]) value += 10000; if (amt_fix_stat[A_CON]) value += 10000; /* Reward Remove Curse */ if (borg_wearing_cursed) { if (borg_has[SCROLL_STAR_CURSE]) value += 90000; if (borg_has[SCROLL_CURSE]) value += 90000; } /* Hack -- Restore experience */ if (amt_fix_exp) value += 50000; /*** Enchantment ***/ /* Reward enchant armor */ if (amt_enchant_to_a < 1000 && my_need_enchant_to_a) value += 540L; /* Reward enchant weapon to hit */ if (amt_enchant_to_h < 1000 && my_need_enchant_to_h) value += 540L; /* Reward enchant weapon to damage */ if (amt_enchant_to_d < 1000 && my_need_enchant_to_d) value += 500L; /* Reward *enchant weapon* to damage */ if (amt_enchant_weapon) value += 5000L; /* Reward *enchant armour* */ if (amt_enchant_armor) value += 5000L; /* Reward carrying a shovel if low level */ if (borg_skill[BI_MAXDEPTH] <= 40 && borg_skill[BI_MAXDEPTH] >= 25 && borg_gold < 100000 && borg_items[INVEN_WIELD].tval != TV_DIGGING && amt_digger == 1) value += 5000L; /*** Hack -- books ***/ /* Reward books */ for (book = 0; book < 9; book++) { /* No copies */ if (!amt_book[book]) continue; /* The "hard" books */ if (book >= 4) { /* Reward the book */ k = 0; for (; k < 1 && k < amt_book[book]; k++) value += 300000L; } /* The "easy" books */ else { int what, when = 99; /* Scan the spells */ for (what = 0; what < 9; what++) { borg_magic *as = &borg_magics[book][what]; /* Track minimum level */ if (as->level < when) when = as->level; } /* Hack -- Ignore "difficult" normal books */ if ((when > 5) && (when >= borg_skill[BI_MAXCLEVEL] + 2)) continue; /* Reward the book */ k = 0; for (; k < 1 && k < amt_book[book]; k++) value += 500000L; if (borg_skill[BI_STR] > 5) for (; k < 2 && k < amt_book[book]; k++) value += 10000L; if (borg_skill[BI_MAXDEPTH] > 50) for (; k < 3 && k < amt_book[book]; k++) value += 2500L; } } /* Hack -- Apply "encumbrance" from weight */ /* Extract the current weight (in tenth pounds) */ inven_weight = p_ptr->total_weight; /* Extract the "weight limit" (in tenth pounds) */ carry_capacity = adj_str_wgt[my_stat_ind[A_STR]] * 100; /* XXX XXX XXX Apply "encumbrance" from weight */ if (inven_weight > carry_capacity/2) { borg_item *item = &borg_items[INVEN_MAX_PACK-1]; /* Some items will be used immediately and should not contribute to encumbrance */ if (item->iqty && ((item->tval == TV_SCROLL && ((item->sval == SV_SCROLL_ENCHANT_ARMOR && amt_enchant_to_a < 1000 && my_need_enchant_to_a) || (item->sval == SV_SCROLL_ENCHANT_WEAPON_TO_HIT && amt_enchant_to_h < 1000 && my_need_enchant_to_h) || (item->sval == SV_SCROLL_ENCHANT_WEAPON_TO_DAM && amt_enchant_to_d < 1000 && my_need_enchant_to_d) || item->sval == SV_SCROLL_STAR_ENCHANT_WEAPON || item->sval == SV_SCROLL_STAR_ENCHANT_ARMOR)) || (item->tval == TV_POTION && ((item->sval == SV_POTION_RES_STR && borg_skill[BI_ISFIXSTR]) || (item->sval == SV_POTION_RES_INT && borg_skill[BI_ISFIXINT]) || (item->sval == SV_POTION_RES_WIS && borg_skill[BI_ISFIXWIS]) || (item->sval == SV_POTION_RES_DEX && borg_skill[BI_ISFIXDEX]) || (item->sval == SV_POTION_RES_CON && borg_skill[BI_ISFIXCON]) || item->sval == SV_POTION_INC_STR || item->sval == SV_POTION_INC_INT || item->sval == SV_POTION_INC_WIS || item->sval == SV_POTION_INC_DEX || item->sval == SV_POTION_INC_CON || item->sval == SV_POTION_INC_ALL)))) { /* No encumbrance penalty for purchasing these items */ } else { value -= ((inven_weight - (carry_capacity/2)) / (carry_capacity / 10) *1000L); } } /* Reward empty slots (up to 5) */ k = 1; for (; k < 6; k++) if (!borg_items[INVEN_MAX_PACK-k].iqty) value += 40L; /* Return the value */ return (value); } /* * Calculate the "power" of the Borg */ s32b borg_power(void) { int i = 1; s32b value = 0L; /* Process the equipment */ value += borg_power_aux1(); /* Process the inventory */ value += borg_power_aux2(); /* Add a bonus for deep level prep */ /* Dump prep codes */ /* Scan from surface to deep , stop when not preped */ for (i = 1; i <= borg_skill[BI_MAXDEPTH]+50; i++) { /* Dump fear code*/ if ((char *)NULL != borg_prepared(i)) break; } value +=((i-1) * 40000L); /* Add the value for the swap items */ value += weapon_swap_value; value += armour_swap_value; /* Return the value */ return (value); } /* * Helper function -- calculate power of equipment in the home */ static s32b borg_power_home_aux1(void) { s32b value = 0L; /* This would be better seperated by item type (so 1 bonus for resist cold armor */ /* 1 bonus for resist cold shield... but that would take a bunch more code. */ /* try to collect at least 2 of each resist/power (for swapping) */ /* This can be used to get rid of extra artifacts... */ /* spare lite sources. Artifacts only */ if (num_LIGHT == 1) value += 150L; else if (num_LIGHT == 2) value += 170L; else if (num_LIGHT > 2) value += 170L + (num_LIGHT - 2) * 5L; if (num_slow_digest == 1) value += 50L; else if (num_slow_digest == 2) value += 70L; else if (num_slow_digest > 2) value += 70L + (num_slow_digest - 2) * 5L; if (num_regenerate == 1) value += 75L; else if (num_regenerate == 2) value += 100L; else if (num_regenerate > 2) value += 100L + (num_regenerate - 2) * 10L; if (num_telepathy == 1) value += 1000L; else if (num_telepathy == 2) value += 1500L; else if (num_telepathy > 2) value += 1500L + (num_telepathy - 2) * 10L; if (num_see_inv == 1) value += 800L; else if (num_see_inv == 2) value += 1200L; else if (num_see_inv > 2) value += 1200L + (num_see_inv - 2) * 10L; if (num_ffall == 1) value += 10L; else if (num_ffall == 2) value += 15L; else if (num_ffall > 2) value += 15L + (num_ffall - 2) * 1L; if (num_free_act == 1) value += 1000L; else if (num_free_act == 2) value += 1500L; else if (num_free_act > 2) value += 1500L + (num_free_act - 2) * 10L; if (num_hold_life == 1) value += 1000L; else if (num_hold_life == 2) value += 1500L; else if (num_hold_life > 2) value += 1500L + (num_hold_life - 2) * 10L; if (num_resist_acid == 1) value += 1000L; else if (num_resist_acid == 2) value += 1500L; else if (num_resist_acid > 2) value += 1500L + (num_resist_acid - 2) * 1L; if (num_immune_acid == 1) value += 3000L; else if (num_immune_acid == 2) value += 5000L; else if (num_immune_acid > 2) value += 5000L + (num_immune_acid - 2) * 30L; if (num_resist_elec == 1) value += 1000L; else if (num_resist_elec == 2) value += 1500L; else if (num_resist_elec > 2) value += 1500L + (num_resist_elec - 2) * 1L; if (num_immune_elec == 1) value += 3000L; else if (num_immune_elec == 2) value += 5000L; else if (num_immune_elec > 2) value += 5000L + (num_immune_elec - 2) * 30L; if (num_resist_fire == 1) value += 1000L; else if (num_resist_fire == 2) value += 1500L; else if (num_resist_fire > 2) value += 1500L + (num_resist_fire - 2) * 1L; if (num_immune_fire == 1) value += 3000L; else if (num_immune_fire == 2) value += 5000L; else if (num_immune_fire > 2) value += 5000L + (num_immune_fire - 2) * 30L; if (num_resist_cold == 1) value += 1000L; else if (num_resist_cold == 2) value += 1500L; else if (num_resist_cold > 2) value += 1500L + (num_resist_cold - 2) * 1L; if (num_immune_cold == 1) value += 3000L; else if (num_immune_cold == 2) value += 5000L; else if (num_immune_cold > 2) value += 5000L + (num_immune_cold - 2) * 30L; if (num_resist_pois == 1) value += 5000L; else if (num_resist_pois == 2) value += 9000L; else if (num_resist_pois > 2) value += 9000L + (num_resist_pois - 2) * 40L; if (num_resist_conf == 1) value += 2000L; else if (num_resist_conf == 2) value += 8000L; else if (num_resist_conf > 2) value += 8000L + (num_resist_conf - 2) * 45L; if (num_resist_sound == 1) value += 500L; else if (num_resist_sound == 2) value += 700L; else if (num_resist_sound > 2) value += 700L + (num_resist_sound - 2) * 30L; if (num_resist_LIGHT == 1) value += 100L; else if (num_resist_LIGHT == 2) value += 150L; else if (num_resist_LIGHT > 2) value += 150L + (num_resist_LIGHT - 2) * 1L; if (num_resist_dark == 1) value += 100L; else if (num_resist_dark == 2) value += 150L; else if (num_resist_dark > 2) value += 150L + (num_resist_dark - 2) * 1L; if (num_resist_chaos == 1) value += 1000L; else if (num_resist_chaos == 2) value += 1500L; else if (num_resist_chaos > 2) value += 1500L + (num_resist_chaos - 2) * 10L; if (num_resist_disen == 1) value += 5000L; else if (num_resist_disen == 2) value += 7000L; else if (num_resist_disen > 2) value += 7000L + (num_resist_disen - 2) * 35L; if (num_resist_shard == 1) value += 100L; else if (num_resist_shard == 2) value += 150L; else if (num_resist_shard > 2) value += 150L + (num_resist_shard - 2) * 1L; if (num_resist_nexus == 1) value += 200L; else if (num_resist_nexus == 2) value += 300L; else if (num_resist_nexus > 2) value += 300L + (num_resist_nexus - 2) * 2L; if (num_resist_blind == 1) value += 500L; else if (num_resist_blind == 2) value += 1000L; else if (num_resist_blind > 2) value += 1000L + (num_resist_blind - 2) * 5L; if (num_resist_neth == 1) value += 3000L; else if (num_resist_neth == 2) value += 4000L; else if (num_resist_neth > 2) value += 4000L + (num_resist_neth - 2) * 45L; /* stat gain items as well...(good to carry ring of dex +6 in */ /* house even if I don't need it right now) */ if (home_stat_add[A_STR] < 9) value += home_stat_add[A_STR] * 300L; else if (home_stat_add[A_STR] < 15) value += 9 * 300L + (home_stat_add[A_STR] - 9) * 200L; else value += 9 * 300L + 6 * 200L + (home_stat_add[A_STR] - 15) * 1L; if (home_stat_add[A_DEX] < 9) value += home_stat_add[A_DEX] * 300L; else if (home_stat_add[A_DEX] < 15) value += 9 * 300L + (home_stat_add[A_DEX] - 9) * 200L; else value += 9 * 300L + 6 * 200L + (home_stat_add[A_DEX] - 15) * 1L; /* HACK extra con for thorin and other such things */ if (home_stat_add[A_CON] < 15) value += home_stat_add[A_CON] * 300L; else if (home_stat_add[A_CON] < 21) value += 15 * 300L + (home_stat_add[A_CON] - 15) * 200L; else value += 15 * 300L + 6 * 200L + (home_stat_add[A_CON] - 21) * 1L; /* int and wis are only bonused for spell casters. */ if (p_ptr->class->spell_book == TV_MAGIC_BOOK) { if (home_stat_add[A_INT] < 20) value += home_stat_add[A_INT] * 400L; else if (home_stat_add[A_INT] < 26) value += 20 * 400L + (home_stat_add[A_INT] - 20) * 300L; else value += 20 * 100L + 6 * 300L + (home_stat_add[A_INT] - 26) * 5L; } if (p_ptr->class->spell_book == TV_PRAYER_BOOK) { if (home_stat_add[A_WIS] < 20) value += home_stat_add[A_WIS] * 400L; else if (home_stat_add[A_WIS] < 26) value += 20 * 400L + (home_stat_add[A_WIS] - 20) * 300L; else value += 20 * 400L + 6 * 300L + (home_stat_add[A_WIS] - 26) * 3L; } /* Sustains */ if (num_sustain_str == 1) value += 200L; else if (num_sustain_str == 2) value += 250L; else if (num_sustain_str > 2) value += 250L + (num_sustain_str - 2) * 1L; if (num_sustain_int == 1) value += 200L; else if (num_sustain_int == 2) value += 250L; else if (num_sustain_int > 2) value += 250L + (num_sustain_int - 2) * 1L; if (num_sustain_wis == 1) value += 200L; else if (num_sustain_wis == 2) value += 250L; else if (num_sustain_wis > 2) value += 250L + (num_sustain_wis - 2) * 1L; if (num_sustain_con == 1) value += 200L; else if (num_sustain_con == 2) value += 250L; else if (num_sustain_con > 2) value += 250L + (num_sustain_con - 2) * 1L; if (num_sustain_dex == 1) value += 200L; else if (num_sustain_dex == 2) value += 250L; else if (num_sustain_dex > 2) value += 250L + (num_sustain_dex - 2) * 1L; if (num_sustain_all == 1) value += 1000L; else if (num_sustain_all == 2) value += 1500L; else if (num_sustain_all > 2) value += 1500L + (num_sustain_all - 2) * 1L; /* do a minus for too many duplicates. This way we do not store */ /* useless items and spread out types of items. */ if (num_weapons > 5) value -= (num_weapons - 5) * 2000L; else if (num_weapons > 1) value -= (num_weapons - 1) * 100L; if (num_bow > 2) value -= (num_bow - 2) * 1000L; if (num_rings > 6) value -= (num_rings - 6) * 4000L; else if (num_rings > 4) value -= (num_rings - 4) * 2000L; if (num_neck > 3) value -= (num_neck - 3) * 1500L; else if (num_neck > 3) value -= (num_neck - 3) * 700L; if (num_armor > 6) value -= (num_armor - 6) * 1000L; if (num_cloaks > 3) value -= (num_cloaks - 3) * 1000L; if (num_shields > 3) value -= (num_shields - 3) * 1000L; if (num_hats > 4) value -= (num_hats - 4) * 1000L; if (num_gloves > 3) value -= (num_gloves - 3) * 1000L; if (num_boots > 3) value -= (num_boots - 3) * 1000L; value += home_damage; /* if edged and priest, dump it */ value -= num_edged_weapon * 3000L; /* if gloves and mage or ranger and not FA/Dex, dump it. */ value -= num_bad_gloves * 3000L; /* do not allow duplication of items. */ value -= num_duplicate_items * 50000L; /* Return the value */ return (value); } /* * Helper function -- calculate power of items in the home * * The weird calculations help spread out the purchase order */ static s32b borg_power_home_aux2(void) { int k, book; s32b value = 0L; /*** Basic abilities ***/ /* Collect food */ if (borg_skill[BI_MAXCLEVEL] < 10) { for (k = 0; k < 25 && k < num_food; k++) value += 8000L - k*10L; } else if (borg_skill[BI_MAXCLEVEL] < 35) { for (k = 0; k < 90 && k < num_food; k++) value += 8000L - k*10L; } else { for (k = 0; k < 90 && k < num_food; k++) value += 8000L - k*10L; } if (borg_skill[BI_MAXCLEVEL] > 35 && borg_class == CLASS_WARRIOR) { for (k = 0; k < 89 && k < num_food; k++) value += 8000L - k*2L; } #if 0 /* Collect fuel */ if (borg_skill[BI_MAXCLEVEL] < 10) { for (k = 0; k < 25 && k < num_fuel; k++) value += 8000L - k*10L; } else if (borg_skill[BI_MAXCLEVEL] < 35) { for (k = 0; k < 50 && k < num_fuel; k++) value += 8000L - k*10L; } else { for (k = 0; k < 90 && k < num_fuel; k++) value += 8000L - k*10L; } /* Collect Molds as pets */ for (k = 0; k < 10 && k < num_mold; k++) value += 10L - k; #endif /* Collect ident */ for (k = 0; k < 50 && k < num_ident; k++) value += 2000L - k*10L; /* Collect enchantments armour */ if (borg_skill[BI_CLEVEL] < 45) { for (k = 0; k < 90 && k < num_enchant_to_a; k++) value += 500L - k*10L; } /* Collect enchantments to hit */ if (borg_skill[BI_CLEVEL] < 45) { for (k = 0; k < 90 && k < num_enchant_to_h; k++) value += 500L - k*10L; } /* Collect enchantments to dam */ if (borg_skill[BI_CLEVEL] < 45) { for (k = 0; k < 90 && k < num_enchant_to_d; k++) value += 500L - k*10L; } /* Collect pfe */ for (k = 0; k < 90 && k < num_pfe; k++) value += 500L - k*10L; /* Collect glyphs */ for (k = 0; k < 90 && k < num_glyph; k++) value += 500L - k*10L; /* Reward Genocide scrolls. Just scrolls, mainly used for Morgoth */ for (k = 0; k < 90 && k < num_genocide; k++) value += 500L - k*10L; /* Reward Mass Genocide scrolls. Just scrolls, mainly used for Morgoth */ for (k = 0; k < 90 && k < num_mass_genocide; k++) value += 500L; /* Collect Recharge ability */ for (k = 0; k < 90 && k < num_recharge; k++) value += 500L - k*10L; /* Reward Resistance Potions for Warriors */ if (borg_class == CLASS_WARRIOR && borg_skill[BI_MAXDEPTH] > 20 && borg_skill[BI_MAXDEPTH] < 80) { k = 0; for (; k < 90 && k < num_pot_rheat; k++) value += 100L - k*10L; for (; k < 90 && k < num_pot_rcold; k++) value += 100L - k*10L; } /* Collect recall */ for (k = 0; k < 90 && k < num_recall; k++) value += 1000L; /* Collect escape (staff of teleport) */ if (borg_skill[BI_MAXCLEVEL] < 40) { for (k = 0; k < 85 && k < num_escape; k++) value += 2000L - k*10L; } /* Collect a maximal number of staves in the home */ for (k = 0; k < 90 && k < num_tele_staves; k++) value -= 50000L; /* Collect teleport */ for (k = 0; k < 85 && k < num_teleport; k++) value += 5000L; /* Collect phase */ if (borg_skill[BI_MAXCLEVEL] < 10) { for (k = 0; k < 90 && k < num_phase; k++) value += 5000L; } /* Collect teleport level scrolls*/ /* for (k = 0; k < 85 && k < num_teleport_level; k++) value += 5000L - k*8L; */ /* Collect Speed */ /* for (k = 0; k < 85 && k < num_speed; k++) value += 5000L - k*10L; */ /* Collect Potions of Detonations */ for (k = 0; k < 85 && k < num_detonate; k++) value += 5000L; /* collect mana/ */ if (borg_skill[BI_MAXSP] > 1) { for (k = 0; k < 90 && k < num_mana; k++) value += 6000L - k*8L; } /* Level 1 priests are given a Potion of Healing. It is better * for them to sell that potion and buy equipment or several * Cure Crits with it. */ if (borg_skill[BI_CLEVEL] == 1) { k = 0; for (; k < 10 && k < num_heal; k++) value -= 5000L; } /*** Healing ***/ /* Collect cure critical */ for (k = 0; k < 90 && k < num_cure_critical; k++) value += 1500L-k*10L; /* Collect heal, *Heal*, Life */ for (k = 0; k < 90 && k < num_heal; k++) value += 3000L; for (k = 0; k < 198 && k < num_ezheal; k++) value += 8000L; for (k = 0; k < 198 && k < num_life; k++) value += 9000L; /* junk cure serious if we have some in the home */ if (borg_skill[BI_CLEVEL] > 35) /* dont bother keeping them if high level */ for (k = 0; k < 90 && k < num_cure_serious; k++) value -= 1500L-k*10L; /*** Various ***/ /* Fixing Stats */ if (borg_skill[BI_CLEVEL] == 50 && num_fix_exp) value -= 7500L; if (borg_skill[BI_CLEVEL] > 35 && borg_skill[BI_CLEVEL] <= 49) for (k = 0; k < 70 && k < num_fix_exp; k++) value += 1000L - k*10L; else if (borg_skill[BI_CLEVEL] <= 35) for (k = 0; k < 5 && k < num_fix_exp; k++) value += 1000L - k*10L; /* Keep shrooms in the house */ #if 0 for (k = 0; k < 90 && k < num_fix_stat[6]; k++) value += 5000L; for (k = 0; k < 90 && k < num_mush_second_sight; k++) value += 5000L; for (k = 0; k < 90 && k < num_mush_fast_recovery; k++) value += 5000L; for (k = 0; k < 90 && k < num_mush_cure_mind; k++) value += 5000L; for (k = 0; k < 90 && k < num_mush_emergency; k++) value += 5000L; /* for (k = 0; k < 90 && k < num_mush_terror; k++) value += 5000L; */ for (k = 0; k < 90 && k < num_mush_stoneskin; k++) value += 5000L; for (k = 0; k < 90 && k < num_mush_debility; k++) value += 5000L; for (k = 0; k < 90 && k < num_mush_sprinting; k++) value += 5000L; /* for (k = 0; k < 90 && k < num_mush_purging; k++) value += 5000L; */ #endif /*** Hack -- books ***/ /* Reward books */ for (book = 0; book < 4; book++) { if (borg_skill[BI_CLEVEL] > 35) /* Collect up to 20 copies of each normal book */ for (k = 0; k < 20 && k < num_book[book]; k++) { /* Hack -- only stockpile useful books */ if (num_book[book]) value += 5000L - k*10L; } else /* Collect up to 5 copies of each normal book */ for (k = 0; k < 5 && k < num_book[book]; k++) { /* Hack -- only stockpile useful books */ if (num_book[book]) value += 5000L - k*10L; } } /* Reward artifacts in the home */ value += num_artifact * 500L; /* Reward certain types of egos in the home */ value += num_ego * 5000L; /* Return the value */ return (value); } /* * Calculate the "power" of the home */ s32b borg_power_home(void) { s32b value = 0L; /* Process the home equipment */ value += borg_power_home_aux1(); /* Process the home inventory */ value += borg_power_home_aux2(); /* Return the value */ return (value); } /* * Calculate base danger from a monster's physical attacks * * We attempt to take account of various resistances, both in * terms of actual damage, and special effects, as appropriate. * * We reduce the danger from distant "sleeping" monsters. * PFE reduces my fear of an area. * */ static int borg_danger_aux1(int i, bool full_damage) { int k, n = 0; int pfe = 0; int power, chance; s16b ac = borg_skill[BI_ARMOR]; borg_kill *kill = &borg_kills[i]; monster_race *r_ptr = &r_info[kill->r_idx]; /* shields gives +50 to ac and deflects some missiles and balls*/ if (borg_shield) ac += 50; /* PFE gives a protection. */ /* Hack -- Apply "protection from evil" */ if ( (borg_prot_from_evil) && (rf_has(r_ptr->flags, RF_EVIL)) && ((borg_skill[BI_CLEVEL]) >= r_ptr->level) ) { pfe = 1; } /* Mega-Hack -- unknown monsters */ if (kill->r_idx >= z_info->r_max) return (1000); /* Analyze each physical attack */ for (k = 0; k < 4; k++) { int z = 0; /* Extract the attack infomation */ int effect = r_ptr->blow[k].effect; int method = r_ptr->blow[k].method; int d_dice = r_ptr->blow[k].d_dice; int d_side = r_ptr->blow[k].d_side; power = 0; /* Done */ if (!method) break; /* Analyze the attack */ switch (effect) { case RBE_HURT: z = (d_dice * d_side); /* stun */ if ((d_side < 3) && (z > d_dice * d_side)) { n += 200; } /* fudge- only mystics kick and they tend to KO. Avoid close */ /* combat like the plauge */ if (method == RBM_KICK) { n += 400; } power = 60; if ((pfe) && !borg_attacking) { z /= 2; } break; case RBE_POISON: z = (d_dice * d_side); power = 5; if (borg_skill[BI_RPOIS]) break; if (borg_skill[BI_TRPOIS]) break; /* Add fear for the effect */ z += 10; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_UN_BONUS: z = (d_dice * d_side); power = 20; if (borg_skill[BI_RDIS]) break; /* Add fear for the effect */ z += 500; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_UN_POWER: z = (d_dice * d_side); /* Add fear for the effect */ z += 20; power = 15; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_EAT_GOLD: z = (d_dice * d_side); /* if in town and low level avoid them stupid urchins */ if (borg_skill[BI_CLEVEL] < 5) z += 50; power = 5; if (100 <= adj_dex_safe[my_stat_ind[A_DEX]] + borg_skill[BI_CLEVEL]) break; if (borg_gold < 100) break; if (borg_gold > 100000) break; /* Add fear for the effect */ z += 5; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_EAT_ITEM: z = (d_dice * d_side); power = 5; if (100 <= adj_dex_safe[my_stat_ind[A_DEX]] + borg_skill[BI_CLEVEL]) break; /* Add fear for the effect */ z += 5; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_EAT_FOOD: z = (d_dice * d_side); power = 5; if (borg_skill[BI_FOOD] > 5) break; /* Add fear for the effect */ z += 5; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_EAT_LIGHT: z = (d_dice * d_side); power = 5; if (borg_skill[BI_CURLITE] == 0) break; if (borg_skill[BI_AFUEL] > 5) break; /* Add fear for the effect */ z += 5; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_ACID: if (borg_skill[BI_IACID]) break; z = (d_dice * d_side); if (borg_skill[BI_RACID]) z = (z + 2) / 3; if (borg_skill[BI_TRACID]) z = (z + 2) / 3; /* Add fear for the effect */ z += 200; /* We dont want our armour corroded. */ if ((pfe) && !borg_attacking) z /= 2; break; case RBE_ELEC: if (borg_skill[BI_IELEC]) break; z = (d_dice * d_side); power = 10; if (borg_skill[BI_RELEC]) z = (z + 2) / 3; if (borg_skill[BI_TRELEC]) z = (z + 2) / 3; /* Add fear for the effect */ z = z * 2; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_FIRE: if (borg_skill[BI_IFIRE]) break; z = (d_dice * d_side); power = 10; if (borg_skill[BI_RFIRE]) z = (z + 2) / 3; if (borg_skill[BI_TRFIRE]) z = (z + 2) / 3; /* Add fear for the effect */ z = z * 2; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_COLD: if (borg_skill[BI_ICOLD]) break; z = (d_dice * d_side); power = 10; if (borg_skill[BI_RCOLD]) z = (z + 2) / 3; if (borg_skill[BI_TRCOLD]) z = (z + 2) / 3; /* Add fear for the effect */ z = z * 2; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_BLIND: z = (d_dice * d_side); power = 2; if (borg_skill[BI_RBLIND]) break; /* Add fear for the effect */ z += 10; if (borg_class == CLASS_MAGE) z +=75; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_CONFUSE: z = (d_dice * d_side); power = 10; if (borg_skill[BI_RCONF]) break; /* Add fear for the effect */ z += 200; if (borg_class == CLASS_MAGE) z +=200; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_TERRIFY: z = (d_dice * d_side); power = 10; if (borg_skill[BI_RFEAR]) break; /* Add fear for the effect */ z = z * 2; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_PARALYZE: z = (d_dice * d_side); power = 2; if (borg_skill[BI_FRACT]) break; z += 200; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_LOSE_STR: z = (d_dice * d_side); if (borg_skill[BI_SSTR]) break; if (borg_stat[A_STR] <= 3) break; if (borg_prayer_legal(6, 3)) break; z += 150; /* extra scary to have str drain below 10 */ if (borg_stat[A_STR] < 10) z += 100; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_LOSE_DEX: z = (d_dice * d_side); if (borg_skill[BI_SDEX]) break; if (borg_stat[A_DEX] <= 3) break; if (borg_prayer_legal(6, 3)) break; z += 150; /* extra scary to have drain below 10 */ if (borg_stat[A_DEX] < 10) z += 100; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_LOSE_CON: z = (d_dice * d_side); if (borg_skill[BI_SCON]) break; if (borg_stat[A_CON] <= 3) break; if (borg_prayer_legal(6, 3)) break; /* Add fear for the effect */ z += 150; /* extra scary to have con drain below 8 */ if (borg_stat[A_STR] < 8) z += 100; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_LOSE_INT: z = (d_dice * d_side); if (borg_skill[BI_SINT]) break; if (borg_stat[A_INT] <= 3) break; if (borg_prayer_legal(6, 3)) break; z += 150; /* extra scary for spell caster */ if (p_ptr->class->spell_book == TV_MAGIC_BOOK) z += 50; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_LOSE_WIS: z = (d_dice * d_side); if (borg_skill[BI_SWIS]) break; if (borg_stat[A_WIS] <= 3) break; if (borg_prayer_legal(6, 3)) break; z += 150; /* extra scary for pray'er */ if (p_ptr->class->spell_book == TV_PRAYER_BOOK) z += 50; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_LOSE_ALL: z = (d_dice * d_side); power = 2; /* only morgoth. HACK to make it easier to fight him */ break; case RBE_SHATTER: z = (d_dice * d_side); z -= (z * ((ac < 150) ? ac : 150) / 250); power = 60; /* Add fear for the effect */ z += 150; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_EXP_10: z = (d_dice * d_side); if (borg_skill[BI_HLIFE]) break; /* do not worry about drain exp after level 50 */ if (borg_skill[BI_CLEVEL] == 50) break; if (borg_prayer_legal(6, 4)) break; /* Add fear for the effect */ z += 100; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_EXP_20: z = (d_dice * d_side); if (borg_skill[BI_HLIFE]) break; /* do not worry about drain exp after level 50 */ if (borg_skill[BI_CLEVEL] >= 50) break; if (borg_prayer_legal(6, 4)) break; /* Add fear for the effect */ z += 150; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_EXP_40: z = (d_dice * d_side); if (borg_skill[BI_HLIFE]) break; /* do not worry about drain exp after level 50 */ if (borg_skill[BI_CLEVEL] >= 50) break; if (borg_prayer_legal(6, 4)) break; /* Add fear for the effect */ z += 200; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_EXP_80: z = (d_dice * d_side); if (borg_skill[BI_HLIFE]) break; /* do not worry about drain exp after level 50 */ if (borg_skill[BI_CLEVEL] >= 50) break; if (borg_prayer_legal(6, 4)) break; /* Add fear for the effect */ z += 250; if ((pfe) && !borg_attacking) z /= 2; break; case RBE_HALLU: z = (d_dice * d_side); /* Add fear for the effect */ z += 250; if ((pfe) && !borg_attacking) z /= 2; break; } /* if we are doing partial damage reduce for % chance that it will */ /* hit you. */ if (!full_damage) { /* figure out chance that monster will hit you. */ /* add a 50% bonus in to account for bad luck. */ if (borg_fighting_unique || (r_ptr->level + power) > 0) chance = 150 - (((ac * 300) / 4) / 1+((r_ptr->level + power) * 3)); else chance = -1; /* always have a 5% chance of hitting. */ if (chance < 5) chance = 5; /* Modify the damage by the chance of getting hit */ z = (z * chance) / 100; } /* Add in damage */ n += z; } /* Danger */ return (n); } /* * Calculate base danger from a monster's spell attacks * * We attempt to take account of various resistances, both in * terms of actual damage, and special effects, as appropriate. * * We reduce the danger from distant "sleeping" monsters. * * We reduce the danger if the monster is immobile or not LOS */ static int borg_danger_aux2(int i, int y, int x, bool average, bool full_damage) { int q, n= 0, pfe =0, glyph= 0, glyph_check =0; int spot_x, spot_y, spot_safe=1; int lev, hp, total_dam = 0, av; bool bolt = FALSE; borg_kill *kill = &borg_kills[i]; borg_grid *ag; monster_race *r_ptr = &r_info[kill->r_idx]; /* PFE gives a protection. */ /* Hack -- Apply "protection from evil" */ if ( (borg_prot_from_evil) && (rf_has(r_ptr->flags, RF_EVIL)) && ((borg_skill[BI_CLEVEL] ) >= r_ptr->level) ) { pfe = 1; } /* glyph of warding rune of protection provides some small * protection with some ranged atacks; mainly summon attacks. * We should reduce the danger commensurate to the probability of the * monster breaking the glyph as defined by melee2.c */ if (borg_on_glyph) { glyph = 1; } else if (track_glyph_num) { /* Check all existing glyphs */ for (glyph_check = 0; glyph_check < track_glyph_num; glyph_check++) { if ((track_glyph_y[glyph_check] == y) && (track_glyph_x[glyph_check] == x)) { /* Reduce the danger */ glyph = 1; } } } /* Mega-Hack -- unknown monsters */ if (kill->r_idx >= z_info->r_max) return (1000); /* Paranoia -- Nothing to cast */ if (!kill->ranged_attack) return (0); /* Extract the level */ lev = r_ptr->level; /* Extract hit-points */ hp = kill->power; /* Analyze the spells */ for (q = 0; q < kill->ranged_attack; q++) { int p = 0; int z = 0; /* Cast the spell. */ switch (kill->spell[q]) { case 32+0: /* RF4_SHRIEK */ /* if looking at full damage, things that are just annoying */ /* do not count.*/ /* Add fear for the effect */ p += 5; break; case 32+1: /* RF4_XXX2X4 */ /* this is now a failed spell attempt for monsters */ /* used to recognize invisible/ hidden monsters */ p += 10; break; case 32+2: /* RF4_XXX3X4 */ break; case 32+3: /* RF4_XXX4X4 */ break; case 32+4: /* RF4_ARROW_1 */ z = (1 * 6); break; case 32+5: /* RF4_ARROW_2 */ z = (3 * 6); break; case 32+6: /* RF4_ARROW_3 */ z = (5 * 6); break; case 32+7: /* RF4_ARROW_4 */ z = (7 * 6); break; case 32+8: /* RF4_BR_ACID */ if (borg_skill[BI_IACID]) break; z = (hp / 3); /* max damage */ if (z > 1600) z = 1600; if (borg_skill[BI_RACID]) z = (z + 2) / 3; if (borg_skill[BI_TRACID]) z = (z + 2) / 3; /* if looking at full damage, things that are just annoying */ /* do not count.*/ /* Add fear for the effect */ p += 40; break; case 32+9: /* RF4_BR_ELEC */ if (borg_skill[BI_IELEC]) break; z = (hp / 3); /* max damage */ if (z > 1600) z = 1600; if (borg_skill[BI_RELEC]) z = (z + 2) / 3; if (borg_skill[BI_TRELEC]) z = (z + 2) / 3; /* if looking at full damage, things that are just annoying */ /* do not count.*/ /* Add fear for the effect */ p += 20; break; case 32+10: /* RF4_BR_FIRE */ if (borg_skill[BI_IFIRE]) break; z = (hp / 3); /* max damage */ if (z > 1600) z = 1600; if (borg_skill[BI_RFIRE]) z = (z + 2) / 3; if (borg_skill[BI_TRFIRE]) z = (z + 2) / 3; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 40; break; case 32+11: /* RF4_BR_COLD */ if (borg_skill[BI_ICOLD]) break; z = (hp / 3); /* max damage */ if (z > 1600) z = 1600; if (borg_skill[BI_RCOLD]) z = (z + 2) / 3; if (borg_skill[BI_TRCOLD]) z = (z + 2) / 3; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 20; break; case 32+12: /* RF4_BR_POIS */ z = (hp / 3); /* max damage */ if (z > 800) z = 800; if (borg_skill[BI_RPOIS]) z = (z + 2) / 3; if (borg_skill[BI_TRPOIS]) z = (z + 2) / 3; if (borg_skill[BI_TRPOIS]) break; if (borg_skill[BI_RPOIS]) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 20; break; case 32+13: /* RF4_BR_NETH */ z = (hp / 6); /* max damage */ if (z > 350) z = 550; if (borg_skill[BI_RNTHR]) { z = (z*6)/9; break; } /* Add fear for the effect */ p += 125; break; case 32+14: /* RF4_BR_LIGHT */ z = (hp / 6); /* max damage */ if (z > 400) z = 400; if (borg_skill[BI_RLITE]) { z = (z*2)/3; break; } if (borg_skill[BI_RBLIND]) break; p += 20; if (borg_class == CLASS_MAGE) p +=20; break; case 32+15: /* RF4_BR_DARK */ z = (hp / 6); /* max damage */ if (z > 400) z = 400; if (borg_skill[BI_RDARK]) z = (z*2)/ 3; if (borg_skill[BI_RDARK]) break; if (borg_skill[BI_RBLIND]) break; p += 20; if (borg_class == CLASS_MAGE) p +=20; break; case 32+16: /* RF4_BR_CONF */ z = (hp / 6); /* max damage */ if (z > 400) z = 400; if (borg_skill[BI_RCONF]) z = z / 2; if (borg_skill[BI_RCONF]) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 300; if (borg_class == CLASS_MAGE) p +=200; break; case 32+17: /* RF4_BR_SOUN */ z = (hp / 6); /* max damage */ if (z > 500) z = 500; if (borg_skill[BI_RSND]) z = (z*5)/9; if (borg_skill[BI_RSND]) break; /* if already stunned be REALLY nervous dangerousabout this */ if (borg_skill[BI_ISSTUN]) z += 500; if (borg_skill[BI_ISHEAVYSTUN]) z += 1000; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 50; break; case 32+18: /* RF4_BR_CHAO */ z = (hp / 6); /* max damage */ if (z > 500) z = 500; if (borg_skill[BI_RKAOS]) z = (z*6)/9; /* Add fear for the effect */ p += 100; if (borg_skill[BI_RKAOS]) break; p += 200; break; case 32+19: /* RF4_BR_DISE */ z = (hp / 6); /* max damage */ if (z > 500) z = 500; if (borg_skill[BI_RDIS]) z = (z*6)/10; if (borg_skill[BI_RDIS]) break; p += 500; break; case 32+20: /* RF4_BR_NEXU */ z = (hp / 3); /* max damage */ if (z > 400) z = 400; if (borg_skill[BI_RNXUS]) z = (z*6)/10; if (borg_skill[BI_RNXUS]) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 100; break; case 32+21: /* RF4_BR_TIME */ z = (hp / 3); /* max damage */ if (z > 150) z = 150; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 250; break; case 32+22: /* RF4_BR_INER */ z = (hp / 6); /* max damage */ if (z > 200) z = 200; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 100; break; case 32+23: /* RF4_BR_GRAV */ z = (hp / 3); /* max damage */ if (z > 200) z = 200; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 100; if (borg_skill[BI_RSND]) break; /* if already stunned be REALLY nervous about this */ if (borg_skill[BI_ISSTUN]) z += 500; if (borg_skill[BI_ISHEAVYSTUN]) z += 1000; break; case 32+24: /* RF4_BR_SHAR */ z = (hp / 6); /* max damage */ if (z > 500) z = 500; if (borg_skill[BI_RSHRD]) z = (z*6)/9; if (borg_skill[BI_RSHRD]) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 50; break; case 32+25: /* RF4_BR_PLAS */ z = (hp / 6); /* max damage */ if (z > 150) z = 150; if (borg_skill[BI_RSND]) break; /* Pump this up if you have goi so that the borg is sure */ /* to be made nervous */ p += 100; /* if already stunned be REALLY nervous about this */ if (borg_skill[BI_ISSTUN]) z += 500; if (borg_skill[BI_ISHEAVYSTUN]) z += 1000; break; case 32+26: /* RF4_BR_WALL */ z = (hp / 6); /* max damage */ if (z > 200) z = 200; if (borg_skill[BI_RSND]) break; /* if already stunned be REALLY nervous about this */ if (borg_skill[BI_ISSTUN]) z += 100; if (borg_skill[BI_ISHEAVYSTUN]) z += 500; /* Add fear for the effect */ p += 50; break; case 32+27: /* RF4_BR_MANA */ /* XXX XXX XXX */ break; case 32+28: /* RF4_XXX5X4 */ break; case 32+29: /* RF4_XXX6X4 */ break; case 32+30: /* RF4_XXX7X4 */ break; case 32+31: /* RF4_BOULDER */ z = (1 + lev / 7) * 12 / 2; bolt = TRUE; break; case 64+0: /* RF5_BA_ACID */ if (borg_skill[BI_IACID]) break; z = (lev * 3) / 2 + 15; if (borg_skill[BI_RACID]) z = (z + 2) / 3; if (borg_skill[BI_TRACID]) z = (z + 2) / 3; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 40; break; case 64+1: /* RF5_BA_ELEC */ if (borg_skill[BI_IELEC]) break; z = (lev * 3) / 2 + 8; if (borg_skill[BI_RELEC]) z = (z + 2) / 3; if (borg_skill[BI_TRELEC]) z = (z + 2) / 3; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 20; break; case 64+2: /* RF5_BA_FIRE */ if (borg_skill[BI_IFIRE]) break; z = (lev * 7) / 2 + 10; if (borg_skill[BI_RFIRE]) z = (z + 2) / 3; if (borg_skill[BI_TRFIRE]) z = (z + 2) / 3; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 40; break; case 64+3: /* RF5_BA_COLD */ if (borg_skill[BI_ICOLD]) break; z = (lev * 3) / 2 + 10; if (borg_skill[BI_RCOLD]) z = (z + 2) / 3; if (borg_skill[BI_TRCOLD]) z = (z + 2) / 3; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 20; break; case 64+4: /* RF5_BA_POIS */ z = (12 * 2); if (borg_skill[BI_RPOIS]) z = (z + 2) / 3; if (borg_skill[BI_TRPOIS]) z = (z + 2) / 3; if (borg_skill[BI_TRPOIS]) break; if (borg_skill[BI_RPOIS]) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 20; break; case 64+5: /* RF5_BA_NETH */ z = (50 +50 + (10 * 10) + lev); if (borg_skill[BI_RNTHR]) z = (z*6)/8; if (borg_skill[BI_RNTHR]) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 250; break; case 64+6: /* RF5_BA_WATE */ z = ((lev * 5) / 2) + 50; if (borg_skill[BI_RSND]) break; /* if already stunned be REALLY nervous about this */ if (borg_skill[BI_ISSTUN]) p += 500; if (borg_skill[BI_ISHEAVYSTUN]) p += 1000; if (borg_skill[BI_RCONF]) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 50; if (borg_class == CLASS_MAGE) p +=20; break; case 64+7: /* RF5_BA_MANA */ z = ((lev * 5) + 150); /* Add fear for the effect */ p += 50; break; case 64+8: /* RF5_BA_DARK */ z = (((lev * 5)) + (50)); if (borg_skill[BI_RDARK]) z = (z*6)/9; if (borg_skill[BI_RDARK]) break; if (borg_skill[BI_RBLIND]) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 20; if (borg_class == CLASS_MAGE) p +=20; break; case 64+9: /* RF5_DRAIN_MANA */ if (borg_skill[BI_MAXSP]) p += 10; break; case 64+10: /* RF5_MIND_BLAST */ if (borg_skill[BI_SAV] < 100) z = 20; break; case 64+11: /* RF5_BRAIN_SMASH */ z = (12 * 15); p += 200 - 2 * borg_skill[BI_SAV]; if (p < 0) p =0; break; case 64+12: /* RF5_CAUSE_1 */ if (borg_skill[BI_SAV] >= 100) break; z = (3 * 8); /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ /* reduce by % chance of save (add 20% for fudge) */ z = z * (120 - borg_skill[BI_SAV]) / 100; break; case 64+13: /* RF5_CAUSE_2 */ if (borg_skill[BI_SAV] >= 100) break; z = (8 * 8); /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ /* reduce by % chance of save (add 20% for fudge) */ z = z * (120 - borg_skill[BI_SAV]) / 100; break; case 64+14: /* RF5_CAUSE_3 */ if (borg_skill[BI_SAV] >= 100) break; z = (10 * 15); /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ /* reduce by % chance of save (add 20% for fudge) */ z = z * (120 - borg_skill[BI_SAV]) / 100; break; case 64+15: /* RF5_CAUSE_4 */ if (borg_skill[BI_SAV] >= 100) break; z = (15 * 15); /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 20; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ /* reduce by % chance of save (add 40% for fudge) */ z = z * (120 - borg_skill[BI_SAV]) / 100; break; case 64+16: /* RF5_BO_ACID */ bolt = TRUE; if (borg_skill[BI_IACID]) break; z = ((7 * 8) + (lev / 3)); if (borg_skill[BI_RACID]) z = (z + 2) / 3; if (borg_skill[BI_TRACID]) z = (z + 2) / 3; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 40; break; case 64+17: /* RF5_BO_ELEC */ if (borg_skill[BI_IELEC]) break; bolt = TRUE; z = ((4 * 8) + (lev / 3)); if (borg_skill[BI_RELEC]) z = (z + 2) / 3; if (borg_skill[BI_TRELEC]) z = (z + 2) / 3; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 20; break; case 64+18: /* RF5_BO_FIRE */ if (borg_skill[BI_IFIRE]) break; bolt = TRUE; z = ((9 * 8) + (lev / 3)); if (borg_skill[BI_RFIRE]) z = (z + 2) / 3; if (borg_skill[BI_TRFIRE]) z = (z + 2) / 3; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 40; break; case 64+19: /* RF5_BO_COLD */ if (borg_skill[BI_ICOLD]) break; bolt = TRUE; z = ((6 * 8) + (lev / 3)); if (borg_skill[BI_RCOLD]) z = (z + 2) / 3; if (borg_skill[BI_TRCOLD]) z = (z + 2) / 3; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 20; break; case 64+20: /* RF5_BO_POIS */ /* XXX XXX XXX */ bolt = TRUE; break; case 64+21: /* RF5_BO_NETH */ bolt = TRUE; z = (50 + 30 + (5 * 5) + (lev * 3) / 2); if (borg_skill[BI_RNTHR]) z = (z*6)/8; if (borg_skill[BI_RNTHR]) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 200; break; case 64+22: /* RF5_BO_WATE */ z = ((10 * 10) + (lev)); bolt = TRUE; if (borg_skill[BI_RSND]) break; /* if already stunned be REALLY nervous about this */ if (borg_skill[BI_ISSTUN]) p += 500; if (borg_skill[BI_ISHEAVYSTUN]) p += 1000; if (borg_skill[BI_RCONF]) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 20; if (borg_class == CLASS_MAGE) p +=20; break; case 64+23: /* RF5_BO_MANA */ z = ((lev * 7) / 2) + 50; bolt = TRUE; /* Add fear for the effect */ p += 50; break; case 64+24: /* RF5_BO_PLAS */ z = (10 + (8 * 7) + (lev)); bolt = TRUE; if (borg_skill[BI_RSND]) break; /* if already stunned be REALLY nervous about this */ if (borg_skill[BI_ISSTUN]) z += 500; if (borg_skill[BI_ISHEAVYSTUN]) z += 1000; break; case 64+25: /* RF5_BO_ICEE */ z = ((6 * 6) + (lev)); bolt = TRUE; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 20; if (borg_skill[BI_RSND]) break; /* if already stunned be REALLY nervous about this */ if (borg_skill[BI_ISSTUN]) z += 50; if (borg_skill[BI_ISHEAVYSTUN]) z += 1000; break; case 64+26: /* RF5_MISSILE */ z = ((2 * 6) + (lev / 3)); bolt = TRUE; break; case 64+27: /* RF5_SCARE */ if (borg_skill[BI_SAV] >= 100) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 10; break; case 64+28: /* RF5_BLIND */ if (borg_skill[BI_SAV] >= 100) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 10; break; case 64+29: /* RF5_CONF */ if (borg_skill[BI_SAV] >= 100) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 10; break; case 64+30: /* RF5_SLOW */ if (borg_skill[BI_FRACT]) break; if (borg_skill[BI_SAV] >= 100) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 5; break; case 64+31: /* RF5_HOLD */ if (borg_skill[BI_FRACT]) break; if (borg_skill[BI_SAV] >= 100) break; p += 150; break; case 96+0: /* RF6_HASTE */ /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 10; break; case 96+1: /* RF6_XXX1X6 */ break; case 96+2: /* RF6_HEAL */ /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 10; break; case 96+3: /* RF6_XXX2X6 */ break; case 96+4: /* RF6_BLINK */ break; case 96+5: /* RF6_TPORT */ break; case 96+6: /* RF6_XXX3X6 */ break; case 96+7: /* RF6_XXX4X6 */ break; case 96+8: /* RF6_TELE_TO */ /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 20; break; case 96+9: /* RF6_TELE_AWAY */ /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 10; break; case 96+10: /* RF6_TELE_LEVEL */ if (borg_skill[BI_SAV] >= 100) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 50; break; case 96+11: /* RF6_XXX5 */ break; case 96+12: /* RF6_DARKNESS */ /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 5; break; case 96+13: /* RF6_TRAPS */ /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ p += 50; break; case 96+14: /* RF6_FORGET */ if (borg_skill[BI_SAV] >= 100) break; /* if looking at full damage, things that are just annoying */ /* do not count. */ /* Add fear for the effect */ { /* if you are a spell caster, this is a big issue */ if (borg_skill[BI_CURSP] < 15) { p += 500; } else { p += 30; } } break; case 96+15: /* RF6_XXX6X6 */ break; /* Summoning is only as dangerous as the monster that is * actually summoned but the monsters that summon are a priority * to kill. PFE reduces danger from some evil summoned monsters * One Problem with GOI and Create Door is that the GOI reduces * the fear so much that the borg won't cast the Create Door, * eventhough it would be a good idea. */ case 96+16: /* S_KIN */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe ) { p +=(lev); p = p / spot_safe; } else if (glyph || borg_create_door || borg_fighting_unique) { p +=(lev) * 3; p = p / spot_safe; } else { p += (lev) * 7; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+17: /* S_HI_DEMON */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe ) { p +=(lev); p = p / spot_safe; } else if (glyph || borg_create_door || borg_fighting_unique) { p +=(lev) * 6; p = p / spot_safe; } else { p += (lev) * 12; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+18: /* RF6_S_MONSTER */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe || glyph || borg_create_door || borg_fighting_unique) p +=0; else { p += (lev) * 5; p = p / spot_safe; } break; case 96+19: /* RF6_S_MONSTERS */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe || glyph || borg_create_door || borg_fighting_unique) p +=0; else { p += (lev) * 7; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+20: /* RF6_S_ANIMAL */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe || glyph || borg_create_door || borg_fighting_unique) p +=0; else { p += (lev) * 5; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+21: /* RF6_S_SPIDER */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe || glyph || borg_create_door || borg_fighting_unique) p +=0; else { p += (lev) * 5; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+22: /* RF6_S_HOUND */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe || glyph || borg_create_door || borg_fighting_unique) p +=0; else { p += (lev) * 5; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+23: /* RF6_S_HYDRA */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe ) { p +=(lev); p = p / spot_safe; } else if (glyph || borg_create_door || borg_fighting_unique) { p +=(lev) * 2; p = p / spot_safe; } else { p += (lev) * 5; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+24: /* RF6_S_ANGEL */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe || borg_fighting_unique) { p +=(lev); p = p / spot_safe; } else if (glyph || borg_create_door || borg_fighting_unique) { p +=(lev)* 3; p = p / spot_safe; } else { p += (lev) * 7; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+25: /* RF6_S_DEMON */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe ) { p +=(lev); p = p / spot_safe; } else if (glyph || borg_create_door || borg_fighting_unique) { p +=(lev) * 3; p = p / spot_safe; } else { p += (lev) * 7; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+26: /* RF6_S_UNDEAD */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe ) { p +=(lev); p = p / spot_safe; } else if (glyph || borg_create_door || borg_fighting_unique) { p +=(lev) * 3; p = p / spot_safe; } else { p += (lev) * 7; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+27: /* RF6_S_DRAGON */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe ) { p +=(lev); p = p / spot_safe; } else if (glyph || borg_create_door || borg_fighting_unique) { p +=(lev) * 3; p = p / spot_safe; } else { p += (lev) * 7; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+28: /* RF6_S_HI_UNDEAD */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe ) { p +=(lev); p = p / spot_safe; } else if (glyph || borg_create_door || borg_fighting_unique) { p +=(lev) * 6; p = p / spot_safe; } else { p += (lev) * 12; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+29: /* RF6_S_HI_DRAGON */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe ) { p = p / spot_safe; } else if (glyph || borg_create_door || borg_fighting_unique) { p +=(lev) * 6; p = p / spot_safe; } else { p += (lev) * 12; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+30: /* RF6_S_WRAITH */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe ) { p +=(lev); p = p / spot_safe; } else if (glyph || borg_create_door || borg_fighting_unique) { p +=(lev) * 6; p = p / spot_safe; } else { p += (lev) * 12; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; case 96+31: /* RF6_S_UNIQUE */ /* This is used to calculate the free squares next to us. * This is important when dealing with summoners. */ for (spot_x = -1; spot_x <= 1; spot_x++) { for (spot_y = -1; spot_y <= 1; spot_y++) { /* Acquire location */ x = spot_x + kill->x; y = spot_y + kill->y; ag = &borg_grids[y][x]; /* skip our own spot */ if (x == kill->x && y == kill->y) continue; /* track spaces already protected */ if ( ag->feat == FEAT_GLYPH || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { /* track the safe areas for calculating danger */ spot_safe ++; /* Just in case */ if (spot_safe == 0) spot_safe = 1; if (spot_safe == 8) spot_safe = 100; if (borg_morgoth_position || borg_as_position) spot_safe = 1000; } } } if (pfe ) { p +=(lev); p = p / spot_safe; } else if (glyph || borg_create_door) { p +=(lev) * 3; /* slightly reduced danger for unique */ p = p / spot_safe; } else { p += (lev) * 6; p = p / spot_safe; } /* reduce the fear if it is a unique */ if (rf_has(r_info->flags, RF_UNIQUE)) p = p * 75/100; break; } /* A bolt spell cannot jump monsters to hit the borg. */ if (bolt == TRUE && !borg_projectable_pure(kill->y, kill->x, c_y, c_x)) z = 0; /* Some borgs are concerned with the 'effects' of an attack. ie, cold attacks shatter potions, * fire attacks burn scrolls, electric attacks zap rings. */ if (borg_skill[BI_MAXDEPTH] >= 75) p = 0; /* Notice damage */ p += z; /* Track the most dangerous spell */ if (p > n) n = p; /* Track the damage of all the spells, used in averaging */ total_dam +=p; } /* Slightly decrease the danger if the borg is sitting in * a sea of runes. */ if (borg_morgoth_position || borg_as_position) total_dam = total_dam * 7 / 10; /* Average damage of all the spells & compare to most dangerous spell */ av = total_dam / kill->ranged_attack; /* If the most dangerous spell is alot bigger than the average, * then return the dangerous one. * * There is a problem when dealing with defence manuevers. * If the borg is considering casting a spell like * Resistance and the monster also has a non * resistable attack (like Disenchant) then the damage * returned will be for that spell, since the danger of the * others (like fire, cold) will be greatly reduced by the * proposed defence spell. The result will be the borg will * not cast the resistance spell eventhough it may be a very * good idea. * * Example: a monster has three breath attacks (Fire, Ice, * Disenchant) and each hits for 800 pts of damage. The * borg currently resists all three, so the danger would be * 500. If the borg were to use a Res Heat Potion that would * decrease the danger to: * Fire: 333 * Ice: 500 * Disen: 500 * Now the Average is 444. Not really worth it, nominal change. * But if the resistance spell was both Fire and Ice, then * it would be: * Fire: 333 * Ice: 333 * Disen: 500 * With an average of 388. Probably worth it, but the borg * would see that the Disen attack is a quite dangerous and * would return the result of 500. * * To fix this, the flag 'average' is added to the * borg_danger() to skip this check and return the average * damage. If the flag is FALSE then the formula below is * SKIPPED and the value returned with be the average. * If the flag is TRUE, then the formula below will be used * to determine the returned value. Currently the elemental * resistance spells and PFE have the flag set as FALSE. * */ if (!average) return (av); if (n >= av * 15/10 || n > borg_skill[BI_CURHP] * 8/10) return (n); else /* Average Danger */ return (av); } /* * Calculate the danger to a grid from a monster XXX XXX XXX * * Note that we are paranoid, especially about "monster speed", * since even if a monster is slower than us, it will occasionally * get one full turn to attack us. * * Note that we assume that monsters can walk through walls and * other monsters to get to the player. XXX XXX XXX * * This function attempts to consider possibilities such as movement plus * spell attacks, physical attacks and spell attacks together, * and other similar situations. * * Currently we assume that "sleeping" monsters are less dangerous * unless you get near them, which may wake them up. * * We attempt to take into account things like monsters which sometimes * "stumble", and monsters which only "sometimes" use powerful spells. */ int borg_danger_aux(int y, int x, int c, int i, bool average, bool full_damage) { borg_kill *kill = &borg_kills[i]; monster_race *r_ptr = &r_info[kill->r_idx]; int x9 = kill->x; int y9 = kill->y; int y_temp, x_temp; int ax, ay, d; int q=0, r, p, v1=0, v2=0, b_v2 = 0, b_v1 = 0; int fake_speed = borg_skill[BI_SPEED]; int monster_speed = kill->speed; int t, e; int ii; int chance; /* Paranoia */ if (!kill->r_idx) return (0); /* Skip certain monster indexes. * These have been listed mainly in Teleport Other * checks in borg6.c in the defence maneuvers. */ if (borg_tp_other_n) { for (ii = 1; ii <= borg_tp_other_n; ii++) { /* Is the current danger check same as a saved monster index? */ if (i == borg_tp_other_index[ii]) { return (0); } } } /* Distance components */ ax = (x9 > x) ? (x9 - x) : (x - x9); ay = (y9 > y) ? (y9 - y) : (y - y9); /* Distance */ d = MAX(ax, ay); /* Minimal distance */ if (d < 1) d = 1; /* Minimal distance */ if (d > 20) return (0); /* A very speedy borg will miscalculate danger of some monsters */ if (borg_skill[BI_SPEED] >=135) fake_speed = (borg_fighting_unique ? 120 : 125); /* Consider the character haste and slow monster spells */ if (borg_speed) fake_speed += 10; if (borg_slow_spell) monster_speed -= 10; /* Assume monsters are a little fast when you are low level */ if (borg_skill[BI_MAXHP] < 20 && borg_skill[BI_CDEPTH]) monster_speed += 3; /* Player energy per game turn */ e = extract_energy[(fake_speed)]; /* Game turns per player move */ t = (100 + (e - 1)) / e; /* Monster energy per game turn */ e = extract_energy[monster_speed]; /* Monster moves */ q = c * ((t * e) / 10); /* allow partial hits when not caculating full possible damage */ if (full_damage) q = (int)((q+9)/10)*10; /* Minimal energy. Monsters get at least some energy. * If the borg is very fast relative to a monster, then the * monster danger is artifically low due to the way the borg * will calculate the danger and energy. So the monsters must * be given some base energy to equate the borg's. * ie: the borg with speed +40 (speed = 150) is attacking * a monster with normal speed (speed = 110). One would * think that the borg gets 4 attacks per turn over the monster. * and this does happen. What if the monster can deal out * 1000 damage pts per monster attack turn? The borg will * reduce the danger to 250 because the borg is 4x faster * than the monster. But eventually the borg will get hit * by that 1000 pt damage attack. And when it does, its * going to hurt. * So we make sure the monster is at least as fast as us. * But the monster is allowed to be faster than us. */ if (q <= 10) q = 10; /** Danger from physical attacks **/ /* Physical attacks */ v1 = borg_danger_aux1(i, full_damage); /* Hack -- Under Stressful Situation. */ if (time_this_panel > 1200 || borg_t > 25000) { /* he might be stuck and could overflow */ v1 = v1 / 5; } /* No attacks for some monsters */ if (rf_has(r_ptr->flags, RF_NEVER_BLOW)) { v1 = 0; } /* No movement for some monsters */ if ((rf_has(r_ptr->flags, RF_NEVER_MOVE)) && (d > 1)) { v1 = 0; } /* multipliers yeild some trouble when I am weak */ if ((rf_has(r_ptr->flags, RF_MULTIPLY)) && (borg_skill[BI_CLEVEL] < 20)) { /* extra 50% */ v1 = v1 + (v1 *15/10); } /* Friends yeild some trouble when I am weak */ if ((r_ptr->friends || r_ptr->friends_base) && (borg_skill[BI_CLEVEL] < 20)) { if (borg_skill[BI_CLEVEL] < 15) { /* extra 80% */ v1 = v1 + (v1 *18/10); } else { /* extra 30% */ v1 = v1 + (v1 *13/10); } } /* Reduce danger from sleeping monsters */ if (!kill->awake) { int inc = r_ptr->sleep + 5; /* Reduce the fear if Borg is higher level */ if (borg_skill[BI_CLEVEL] >= 25 ) { v1 = v1 / 2; } /* Tweak danger based on the "alertness" of the monster */ /* increase the danger for light sleepers */ v1 = v1 + (v1*inc/100); } /* Reduce danger from sleeping monsters with the sleep 2 spell*/ if (borg_sleep_spell_ii) { if ( (d == 1) && (kill->awake) && (!(rf_has(r_ptr->flags, RF_NO_SLEEP))) && (!(rf_has(r_ptr->flags, RF_UNIQUE))) && (kill->level <= (borg_skill[BI_CLEVEL] - 15))) { /* Under special circumstances force the damage to 0 */ if (borg_skill[BI_CLEVEL] < 20 && borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 2) { v1 = 0; } else { v1 = v1 / 3; } } } /* Reduce danger from sleeping monsters with the sleep 1,3 spell*/ if (borg_sleep_spell) { if (kill->awake && (!(rf_has(r_ptr->flags, RF_NO_SLEEP))) && (!(rf_has(r_ptr->flags, RF_UNIQUE))) && (kill->level <= (borg_skill[BI_CLEVEL] - 15))) { /* Under special circumstances force the damage to 0 */ if (borg_skill[BI_CLEVEL] < 20 && borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 2) { v1 = 0; } else { v1 = v1 / (d+2); } } } /* Reduce danger from confused monsters */ if (kill->confused) { v1 = v1 / 2; } if (kill->stunned) { v1 = v1 * 10 / 13; } if (borg_confuse_spell) { if (kill->awake && !kill->confused && (!(rf_has(r_ptr->flags, RF_NO_SLEEP))) && (!(rf_has(r_ptr->flags, RF_UNIQUE))) && (kill->level <= (borg_skill[BI_CLEVEL] - 15))) { /* Under special circumstances force the damage to 0 */ if (borg_skill[BI_CLEVEL] < 20 && borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 2) { v1 = 0; } else { v1 = v1 / (d+2); } } } /* Perceive a reduce danger from scared monsters */ if (borg_fear_mon_spell) { v1 = 0; } /* Hack -- Physical attacks require proximity * * Note that we do try to consider a fast monster moving and attacking * in the same round. We should consider monsters that have a speed 2 or 3 classes * higher than ours, but most times, the borg will only encounter monsters with a single * catagory higher speed. */ if (q > 10 && d != 1 && !(rf_has(r_ptr->flags, RF_NEVER_MOVE))) { b_v1 = 0; /* Check for a single grid movement, simulating the monster's move action. */ for (ii = 0; ii < 8; ii++) { /* Obtain a grid to which the monster might move */ y_temp = y9 + ddy_ddd[ii]; x_temp = x9 + ddx_ddd[ii]; /* Check for legality */ if (!cave_in_bounds_fully(cave, y_temp,x_temp)) continue; /* Cannot occupy another monster's grid */ if (borg_grids[y_temp][x_temp].kill) continue; /* Cannot occupy a closed door */ if (borg_grids[y_temp][x_temp].feat >= FEAT_DOOR_HEAD && borg_grids[y_temp][x_temp].feat <= FEAT_DOOR_TAIL) continue; /* Cannot occupy a perma-wall */ if (borg_grids[y_temp][x_temp].feat >= FEAT_PERM_EXTRA) continue; /* Cannot occupy a wall/seam grid (unless pass_wall or kill_wall) */ if ((borg_grids[y_temp][x_temp].feat >= FEAT_WALL_EXTRA && borg_grids[y_temp][x_temp].feat <= FEAT_WALL_SOLID) || (borg_grids[y_temp][x_temp].feat == FEAT_MAGMA || borg_grids[y_temp][x_temp].feat == FEAT_QUARTZ || borg_grids[y_temp][x_temp].feat == FEAT_MAGMA_K || borg_grids[y_temp][x_temp].feat == FEAT_QUARTZ_K || borg_grids[y_temp][x_temp].feat == FEAT_RUBBLE)) { /* legally on a wall of some sort, check for closeness*/ if (rf_has(r_ptr->flags, RF_PASS_WALL)) { if (distance(y_temp, x_temp, y, x) == 1) b_v1 = v1; } if (rf_has(r_ptr->flags, RF_KILL_WALL)) { if (distance(y_temp, x_temp, y, x) == 1) b_v1 = v1; } } /* Is this grid being considered adjacent to the grid for which the borg_danger() was called? */ if (distance(y_temp, x_temp, y, x) >1) continue; /* A legal floor grid */ if (borg_cave_floor_bold(y_temp, x_temp)) { /* Really fast monster can hit me more than once after it's move */ b_v1 = v1 * (q/(d*10)); } } /* Monster is not able to move and threaten me in the same round */ v1 = b_v1; } /* Consider a monster that is fast and can strike more than once per round */ if (q > 10 && d == 1) { v1= v1 * q / 10; } /* Need to be close if you are normal speed */ if (q == 10 && d > 1) { v1 = 0; } /** Ranged Attacks **/ v2 = borg_danger_aux2(i,y,x,average, full_damage); /* Never cast spells */ if (!r_ptr->freq_innate && !r_ptr->freq_spell) { v2 = 0; } /* Hack -- verify distance */ if (distance(y9, x9, y, x) > MAX_RANGE) { v2 = 0; } /* Hack -- verify line of sight (both ways) for monsters who can only move 1 grid. */ if (q <= 10 && !borg_projectable(y9, x9, y, x) && !borg_projectable(y, x, y9, x9)) { v2 = 0; } /* Hack -- verify line of sight (both ways) for monsters who can only move > 1 grid. * Some fast monsters can take a move action and range attack in the same round. * Basically, we see how many grids the monster can move and check LOS from each of * those grids to determine the relative danger. We need to make sure that the monster * is not passing through walls unless he has that ability. * Consider a fast monster who can move and cast a spell in the same round. * This is important for a borg looking for a safe grid from a ranged attacker. * If the attacker is fast then he might be able to move to a grid which does have LOS * to the grid the borg is considering. * * ############## * #.....#.#.1#D# Grids marked 2 are threatened by the D currently. * #####.#..##@## Grids marked 1 are safe currently, but the fast D will be able * #####.#..1221# to move to the borg's grid after he moves and the D will be able * ############## to use a ranged attack to grids 1, all in the same round. * The borg should not consider grid 1 as safe. */ if (q >= 20) { int b_q = q; b_v2 = 0; /* Maximal speed check */ if (q > 20) q = 20; /* Check for a single grid movement, simulating the monster's move action. */ for (ii = 0; ii < 8; ii++) { /* Obtain a grid to which the monster might move */ y_temp = y9 + ddy_ddd[ii]; x_temp = x9 + ddx_ddd[ii]; /* Check for legality */ if (!cave_in_bounds_fully(cave, y_temp,x_temp)) continue; /* Cannot occupy another monster's grid */ if (borg_grids[y_temp][x_temp].kill) continue; /* Cannot occupy a closed door */ if (borg_grids[y_temp][x_temp].feat >= FEAT_DOOR_HEAD && borg_grids[y_temp][x_temp].feat <= FEAT_DOOR_TAIL) continue; /* Cannot occupy a perma-wall */ if (borg_grids[y_temp][x_temp].feat >= FEAT_PERM_EXTRA) continue; /* Cannot occupy a wall/seam grid (unless pass_wall or kill_wall) */ if ((borg_grids[y_temp][x_temp].feat >= FEAT_WALL_EXTRA && borg_grids[y_temp][x_temp].feat <= FEAT_WALL_SOLID) || (borg_grids[y_temp][x_temp].feat == FEAT_MAGMA || borg_grids[y_temp][x_temp].feat == FEAT_QUARTZ || borg_grids[y_temp][x_temp].feat == FEAT_MAGMA_K || borg_grids[y_temp][x_temp].feat == FEAT_QUARTZ_K || borg_grids[y_temp][x_temp].feat == FEAT_RUBBLE)) { /* legally on a wall of some sort, check for LOS*/ if (rf_has(r_ptr->flags, RF_PASS_WALL)) { if (borg_projectable(y_temp, x_temp, y, x)) b_v2 = v2 * b_q / 10; } if (rf_has(r_ptr->flags, RF_KILL_WALL)) { if (borg_projectable(y_temp, x_temp, y, x)) b_v2 = v2 * b_q / 10; } } /* Monster on a legal floor grid. Can he see me? */ else if (borg_projectable(y_temp, x_temp, y, x)) b_v2 = v2 * b_q / 10; } /* Monster is not able to move and threaten me in the same round */ v2 = b_v2; } /* Hack -- Under Stressful Situation. */ if (time_this_panel > 1200 || borg_t > 25000) { /* he might be stuck and could overflow */ v2 = v2 / 5; } /* multipliers yeild some trouble when I am weak */ if ((rf_has(r_ptr->flags, RF_MULTIPLY)) && (borg_skill[BI_CLEVEL] < 20)) { v2 = v2 + (v2 *12/10); } /* Friends yeild some trouble when I am weak */ if ((r_ptr->friends || r_ptr->friends_base) && (borg_skill[BI_CLEVEL] < 20)) { v2 = v2 + (v2 *12/10); } /* Reduce danger from sleeping monsters */ if (!kill->awake) { int inc = r_ptr->sleep + 5; /* weaklings and should still fear */ if (borg_skill[BI_CLEVEL] >= 25 ) { v2 = v2 / 2; } /* Tweak danger based on the "alertness" of the monster */ /* increase the danger for light sleepers */ v2 = v2 + (v2*inc/100); } /* Reduce danger from sleeping monsters with the sleep 2 spell*/ if (borg_sleep_spell_ii) { if ( (d == 1) && (kill->awake) && (!(rf_has(r_ptr->flags, RF_NO_SLEEP))) && (!(rf_has(r_ptr->flags, RF_UNIQUE))) && (kill->level <= ((borg_skill[BI_CLEVEL] < 15) ? borg_skill[BI_CLEVEL] : (((borg_skill[BI_CLEVEL]-10)/4)*3) + 10) )) { v2 = v2 / 3; } } /* Reduce danger from sleeping monsters with the sleep 1,3 spell*/ if (borg_sleep_spell) { v2 = v2 / (d+2); } /* Reduce danger from confused monsters */ if (kill->confused) { v2 = v2 / 2; } /* Reduce danger from stunnned monsters */ if (kill->stunned) { v2 = v2 *10/13; } if (borg_confuse_spell) { v2 = v2 / 6; } #if 0 /* They still cast spells, they are still dangerous */ /* Reduce danger from scared monsters */ if (borg_fear_mon_spell) { v2 = v2 * 8/10; } if (kill->afraid) { v2 = v2 * 8/10; } #endif if (!full_damage) { /* reduce for frequency. */ chance = (r_ptr->freq_innate + r_ptr->freq_spell)/2; if (chance < 11) v2 = ((v2 * 4) / 10); else if (chance < 26) v2 = ((v2 * 6) / 10); else if (chance < 51) v2 = ((v2 * 8) / 10) ; } /* Danger */ if (v2) { /* Full power */ r = q; /* Total danger */ v2 = v2 * r / 10; } /* Maximal danger */ p = MAX(v1, v2); if (p > 2000) p = 2000; /* Result */ return (p); } /* * Hack -- Calculate the "danger" of the given grid. * * Currently based on the physical power of nearby monsters, as well * as the spell power of monsters which can target the given grid. * * This function is extremely expensive, mostly due to the number of * times it is called, and also to the fact that it calls its helper * functions about thirty times each per call. * * We need to do more intelligent processing with the "c" parameter, * since currently the Borg does not realize that backing into a * hallway is a good idea, since as far as he can tell, many of * the nearby monsters can "squeeze" into a single grid. * * Note that we also take account of the danger of the "region" in * which the grid is located, which allows us to apply some "fear" * of invisible monsters and things of that nature. * * Generally bool Average is TRUE. */ int borg_danger(int y, int x, int c, bool average, bool full_damage) { int i, p=0; /* Base danger (from regional fear) but not within a vault. Cheating the floor grid */ if (!cave_isvault(cave, y, x) && borg_skill[BI_CDEPTH] <= 80) { p += borg_fear_region[y/11][x/11] * c; } /* Reduce regional fear on Depth 100 */ if (borg_skill[BI_CDEPTH] == 100 && p >= 300) p = 300; /* Added danger (from a lot of monsters). * But do not add it if we have been sitting on * this panel for too long, or monster's in a vault. The fear_monsters[][] * can induce some bouncy behavior. */ if (time_this_panel <= 200 && !cave_isvault(cave, y, x)) p += borg_fear_monsters[y][x] * c; full_damage = TRUE; /* Examine all the monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Collect danger from monster */ p += borg_danger_aux(y, x, c, i, average, full_damage); } /* Return the danger */ return (p > 2000 ? 2000 : p); } /* * Determine if the Borg is out of "crucial" supplies. * * Note that we ignore "restock" issues for the first several turns * on each level, to prevent repeated "level bouncing". */ const char *borg_restock(int depth) { /* We are now looking at our preparedness */ if ( -1 == borg_ready_morgoth) borg_ready_morgoth = 0; /* Always ready for the town */ if (!depth) return ((char *)NULL); /* Always Ready to leave town */ if (borg_skill[BI_CDEPTH] == 0) return ((char *)NULL); /* Always spend time on a level unless 100*/ if (borg_t - borg_began < 100 && borg_skill[BI_CDEPTH] != 100) return ((char *)NULL); /*** Level 1 ***/ /* Must have some lite */ if (borg_skill[BI_CURLITE] < 1) return ("rs my_CURLITE"); /* Must have "fuel" */ if (borg_skill[BI_AFUEL] < 1 && !borg_skill[BI_LIGHT]) return ("rs amt_fuel"); /* Must have "food" */ if (borg_skill[BI_FOOD] < 1) return ("rs amt_food"); /* Assume happy at level 1 */ if (depth <= 1) return ((char *)NULL); /*** Level 2 and 3 ***/ /* Must have "fuel" */ if (borg_skill[BI_AFUEL] < 2 && !borg_skill[BI_LIGHT]) return ("rs fuel+2"); /* Must have "food" */ if (borg_skill[BI_FOOD] < 3) return ("rs food+2"); /* Must have "recall" */ /* if (borg_skill[BI_RECALL] < 2) return ("rs recall"); */ /* Assume happy at level 3 */ if (depth <= 3) return ((char *)NULL); /*** Level 3 to 5 ***/ if (depth <= 5) return ((char *)NULL); /*** Level 6 to 9 ***/ /* Must have "phase" */ if (borg_skill[BI_APHASE] < 1) return ("rs phase"); /* Potions of Cure Wounds */ if ((borg_skill[BI_MAXCLEVEL] < 30) && borg_skill[BI_ACLW] + borg_skill[BI_ACSW] + borg_skill[BI_ACCW]< 1) return ("rs clw/csw"); /* Assume happy at level 9 */ if (depth <= 9) return ((char *)NULL); /*** Level 10 - 19 ***/ /* Must have good light */ if (borg_skill[BI_CURLITE] < 2) return "rs light+1"; /* Must have "cure" */ if ((borg_skill[BI_MAXCLEVEL] < 30) && borg_skill[BI_ACLW] + borg_skill[BI_ACSW] + borg_skill[BI_ACCW] < 2) return ("rs cure"); /* Must have "teleport" */ if (borg_skill[BI_ATELEPORT] + borg_skill[BI_AESCAPE] < 2) return ("rs tele&esc(1)"); /* Assume happy at level 19 */ if (depth <= 19) return ((char *)NULL); /*** Level 20 - 35 ***/ /* Must have "cure" */ if ((borg_skill[BI_MAXCLEVEL] < 30) && borg_skill[BI_ACSW] + borg_skill[BI_ACCW] < 4) return ("rs cure"); /* Must have "teleport" or Staff */ if (borg_skill[BI_ATELEPORT] + borg_skill[BI_AESCAPE] < 4) return ("rs tele&esc(4)"); /* Assume happy at level 44 */ if (depth <= 35) return ((char *)NULL); /*** Level 36 - 45 ***/ /* Must have Scroll of Teleport (or good 2nd choice) */ if (borg_skill[BI_ATELEPORT] + borg_skill[BI_ATELEPORTLVL] < 2) return ("rs teleport(1)"); /* Assume happy at level 44 */ if (depth <= 45) return ((char *)NULL); /*** Level 46 - 64 ***/ /* Assume happy at level 65 */ if (depth <= 64) return ((char *)NULL); /*** Level 65 - 99 ***/ /* Must have "Heal" */ if (borg_skill[BI_AHEAL] + borg_has[ROD_HEAL] + borg_skill[BI_AEZHEAL] < 1) return ("rs heal"); /* Assume happy at level 99 */ if (depth <= 99) return ((char *)NULL); /*** Level 100 ***/ /* Must have "Heal" */ /* If I just got to dlevel 100 and low on heals, get out now. */ if (borg_t - borg_began < 10 && borg_skill[BI_AEZHEAL] < 15) return ("rs *heal*"); /* Assume happy */ return ((char *)NULL); } /* * Determine if the Borg meets the "minimum" requirements for a level */ static const char *borg_prepared_aux(int depth) { if ( -1 == borg_ready_morgoth) borg_ready_morgoth = 0; if (borg_skill[BI_KING]) { borg_ready_morgoth = 1; return (NULL); } /* Always ready for the town */ if (!depth) return (NULL); /*** Essential Items for Level 1 ***/ /* Require lite (any) */ if (borg_skill[BI_CURLITE] < 1) return ("1 Lite"); /* Require food */ if (borg_skill[BI_FOOD] < 5) return ("5 Food"); /* Usually ready for level 1 */ if (depth <= 1) return ((char *)NULL); /*** Essential Items for Level 2 ***/ /* Require fuel */ if (borg_skill[BI_AFUEL] < 5 && !borg_skill[BI_LIGHT]) return ("5 Fuel"); /* Require recall */ /* if (borg_skill[BI_RECALL] < 1) return ("1 recall"); */ if (!borg_plays_risky) { /* Require 30 hp */ if (borg_skill[BI_MAXHP] < 30) return ("30 hp"); } /* Usually ready for level 2 */ if (depth <= 2) return ((char *)NULL); /*** Essential Items for Level 3 and 4 ***/ if (!borg_plays_risky) { /* class specific requirement */ switch (borg_class) { case CLASS_WARRIOR: if (borg_skill[BI_MAXHP] < 50) return ("50 hp"); if (borg_skill[BI_MAXCLEVEL] < 4) return ("4 clevel"); break; case CLASS_ROGUE: if (borg_skill[BI_MAXHP] < 50) return ("50 hp"); if (borg_skill[BI_MAXCLEVEL] < 8) return ("8 clevel"); break; case CLASS_PRIEST: if (borg_skill[BI_MAXHP] < 40) return ("40 hp"); if (borg_skill[BI_MAXCLEVEL] < 9) return ("9 level"); break; case CLASS_PALADIN: if (borg_skill[BI_MAXHP] < 50) return ("50 hp"); if (borg_skill[BI_MAXCLEVEL] < 4) return ("4 clevel"); break; case CLASS_RANGER: if (borg_skill[BI_MAXHP] < 50) return ("50 hp"); if (borg_skill[BI_MAXCLEVEL] < 4) return ("4 clevel"); break; case CLASS_MAGE: if (borg_skill[BI_MAXHP] < 60) return ("60 hp"); if (borg_skill[BI_MAXCLEVEL] < 11) return ("11 clevel"); break; } } /* Potions of Cure Serious Wounds */ if ((borg_skill[BI_MAXCLEVEL] < 30) && borg_skill[BI_ACLW] + borg_skill[BI_ACSW] + borg_skill[BI_ACCW] < 2) return ("2 cure"); #if 0 /* Scrolls of Identify */ if (amt_ident < 2 && (borg_skill[BI_CDEPTH])) return ("2 ident"); #endif /* Usually ready for level 3 and 4 */ if (depth <= 4) return ((char *)NULL); /*** Essential Items for Level 5 to 9 ***/ if (!borg_plays_risky) { /* class specific requirement */ if (borg_skill[BI_CDEPTH]) { switch (borg_class) { case CLASS_WARRIOR: if (borg_skill[BI_MAXHP] < 60) return ("60 hp"); if (borg_skill[BI_MAXCLEVEL] < 6) return ("6 clevel"); break; case CLASS_ROGUE: if (borg_skill[BI_MAXHP] < 60) return ("60 hp"); if (borg_skill[BI_MAXCLEVEL] < 10) return ("10 clevel"); break; case CLASS_PRIEST: if (borg_skill[BI_MAXHP] < 60) return ("60 hp"); if (borg_skill[BI_MAXCLEVEL] < 15) return ("15 clevel"); break; case CLASS_PALADIN: if (borg_skill[BI_MAXHP] < 60) return ("60 hp"); if (borg_skill[BI_MAXCLEVEL] < 6) return ("6 clevel"); break; case CLASS_RANGER: if (borg_skill[BI_MAXHP] < 60) return ("60 hp"); if (borg_skill[BI_MAXCLEVEL] < 6) return ("6 clevel"); break; case CLASS_MAGE: if (borg_skill[BI_MAXHP] < 80) return ("80 hp"); if (borg_skill[BI_MAXCLEVEL] < 15) return ("15 level"); break; } } } #if 0 /* Scrolls of Identify */ if (amt_ident < 5 && (borg_skill[BI_CDEPTH])) return ("5 idents"); #endif /* Potions of Cure Serious/Critical Wounds */ if ((borg_skill[BI_MAXCLEVEL] < 30) && borg_skill[BI_ACLW] + borg_skill[BI_ACSW] + borg_skill[BI_ACCW] < 2) return ("2 cures"); /* Scrolls of Word of Recall */ if (borg_skill[BI_RECALL] < 1) return ("1 recall"); /* Usually ready for level 5 to 9 */ if (depth <= 9) return ((char *)NULL); /*** Essential Items for Level 10 to 19 ***/ /* Require light (radius 2) */ if (borg_skill[BI_CURLITE] < 2) return "2 Light"; /* Escape or Teleport */ if (borg_skill[BI_ATELEPORT] + borg_skill[BI_AESCAPE] < 2) return ("2 tele&esc"); if (!borg_plays_risky) { /* class specific requirement */ switch (borg_class) { case CLASS_WARRIOR: if (borg_skill[BI_MAXCLEVEL] < (depth - 4) && depth <= 19) return ("dlevel - 4 >= clevel"); break; case CLASS_ROGUE: if (borg_skill[BI_MAXCLEVEL] < depth && depth <= 19) return ("dlevel >= clevel" ); break; case CLASS_PRIEST: if (borg_skill[BI_MAXCLEVEL] < depth && depth <= 19) return ("dlevel >= clevel" ); break; case CLASS_PALADIN: if (borg_skill[BI_MAXCLEVEL] < depth && depth <= 19) return ("dlevel >= clevel" ); break; case CLASS_RANGER: if (borg_skill[BI_MAXCLEVEL] < depth && depth <= 19) return ("dlevel >= clevel" ); break; case CLASS_MAGE: if (borg_skill[BI_MAXCLEVEL] < (depth + 5) && borg_skill[BI_MAXCLEVEL] <= 28) return ("dlevel + 5 > = clevel" ); break; } } #if 0 /* Identify */ if (amt_ident < 10) return ("ident10"); #endif /* Potions of Cure Critical Wounds */ if ((borg_skill[BI_MAXCLEVEL] < 30) && borg_skill[BI_ACCW] < 3) return ("cure crit3"); /* See invisible */ /* or telepathy */ if ((!borg_skill[BI_SINV] && !borg_skill[BI_DINV] && !borg_skill[BI_ESP])) return ("See Invis : ESP"); /* Usually ready for level 10 to 19 */ if (depth <= 19) return ((char *)NULL); /*** Essential Items for Level 20 ***/ /* Free action */ if (!borg_skill[BI_FRACT]) return ("FA"); /* ready for level 20 */ if (depth <= 20) return ((char *)NULL); /*** Essential Items for Level 25 ***/ /* must have fire + 2 other basic resists */ if (!borg_skill[BI_SRFIRE]) return ("RF"); { int basics = borg_skill[BI_RACID] + borg_skill[BI_RCOLD] + borg_skill[BI_RELEC]; if (basics < 2) return ("basic resist2"); } /* have some minimal stats */ if (borg_stat[A_STR] < 7) return ("low STR"); if (p_ptr->class->spell_book == TV_MAGIC_BOOK) { if (borg_stat[A_INT] < 7) return ("low INT"); } if (p_ptr->class->spell_book == TV_PRAYER_BOOK) { if (borg_stat[A_WIS] < 7) return ("low WIS"); } if (borg_stat[A_DEX] < 7) return ("low DEX"); if (borg_stat[A_CON] < 7) return ("low CON"); if (!borg_plays_risky) { /* class specific requirement */ switch (borg_class) { case CLASS_WARRIOR: if (borg_skill[BI_MAXCLEVEL] < (depth + 5) && borg_skill[BI_MAXCLEVEL] <= 38) return ("dlevel + 5 >= clevel" ); break; case CLASS_ROGUE: if (borg_skill[BI_MAXCLEVEL] < (depth + 10) && borg_skill[BI_MAXCLEVEL] <= 43) return ("dlevel + 10 >= clevel" ); break; case CLASS_PRIEST: if (borg_skill[BI_MAXCLEVEL] < (depth + 13) && borg_skill[BI_MAXCLEVEL] <= 46) return ("dlevel + 13 >= clevel" ); break; case CLASS_PALADIN: if (borg_skill[BI_MAXCLEVEL] < (depth + 7) && borg_skill[BI_MAXCLEVEL] <= 40) return ("dlevel + 7 >= clevel" ); break; case CLASS_RANGER: if (borg_skill[BI_MAXCLEVEL] < (depth + 8) && borg_skill[BI_MAXCLEVEL] <= 41 && borg_skill[BI_MAXCLEVEL] > 28) return ("dlevel + 8 >= clevel" ); break; case CLASS_MAGE: if (borg_skill[BI_MAXCLEVEL] < (depth + 8) && borg_skill[BI_MAXCLEVEL] <= 38) return ("dlevel + 8 >= clevel" ); if (((borg_skill[BI_MAXCLEVEL]-38) * 2 + 30) < depth && borg_skill[BI_MAXCLEVEL] <= 44 && borg_skill[BI_MAXCLEVEL] > 38) return ("(clevel-38)*2+30 < dlevel" ); break; } } /* Ready for level 25 */ if (depth <= 25) return ((char *)NULL); /*** Essential Items for Level 25 to 39 ***/ /* All Basic resistance*/ if (!borg_skill[BI_SRCOLD]) return ("RC"); if (!borg_skill[BI_SRELEC]) return ("RE"); if (!borg_skill[BI_SRACID]) return ("RA"); /* Escape and Teleport */ if (borg_skill[BI_ATELEPORT] + borg_skill[BI_AESCAPE] < 6) return ("tell&esc6"); /* Cure Critical Wounds */ if ((borg_skill[BI_MAXCLEVEL] < 30) && (borg_skill[BI_ACCW] + borg_skill[BI_ACSW]) < 10) return ("cure10"); /* Ready for level 33 */ if (depth <= 33) return ((char *)NULL); /* Minimal level */ if (borg_skill[BI_MAXCLEVEL] < 40 && !borg_plays_risky) return ("level 40"); /* Usually ready for level 20 to 39 */ if (depth <= 39) return ((char *)NULL); /*** Essential Items for Level 40 to 45 ***/ /* Resist */ if (!borg_skill[BI_SRPOIS]) return ("RPois"); if (!borg_skill[BI_SRCONF]) return ("RConf"); if (borg_stat[A_STR] < 16) return ("low STR"); if (p_ptr->class->spell_book == TV_MAGIC_BOOK) { if (borg_stat[A_INT] < 16) return ("low INT"); } if (p_ptr->class->spell_book == TV_PRAYER_BOOK) { if (borg_stat[A_WIS] < 16) return ("low WIS"); } if (borg_stat[A_DEX] < 16) return ("low DEX"); if (borg_stat[A_CON] < 16) return ("low CON"); /* Ok to continue */ if (depth <= 45) return ((char *)NULL); /*** Essential Items for Level 46 to 55 ***/ /* Must have +5 speed after level 46 */ if (borg_skill[BI_SPEED] < 115) return ("+5 speed"); /* Potions of heal */ if (borg_skill[BI_AHEAL] < 1 && (borg_skill[BI_AEZHEAL] < 1) ) return ("1heal"); if (!borg_plays_risky) { /* Minimal hitpoints */ if (borg_skill[BI_MAXHP] < 500) return ("HP 500"); } /* High stats XXX XXX XXX */ if (borg_stat[A_STR] < 18+40) return ("low STR"); if (p_ptr->class->spell_book == TV_MAGIC_BOOK) { if (borg_stat[A_INT] < 18+100) return ("low INT"); } if (p_ptr->class->spell_book == TV_PRAYER_BOOK) { if (borg_stat[A_WIS] < 18+100) return ("low WIS"); } if (borg_stat[A_DEX] < 18+60) return ("low DEX"); if (borg_stat[A_CON] < 18+60) return ("low CON"); /* Hold Life */ if ((!borg_skill[BI_HLIFE] && !weapon_swap_hold_life && !armour_swap_hold_life) && (borg_skill[BI_MAXCLEVEL] < 50) ) return ("hold life"); /* Usually ready for level 46 to 55 */ if (depth <= 55) return ((char *)NULL); /*** Essential Items for Level 55 to 59 ***/ /* Potions of heal */ if (borg_skill[BI_AHEAL] < 2 && borg_skill[BI_AEZHEAL] < 1) return ("2heal"); /* Resists */ if (!borg_skill[BI_SRBLIND]) return ("RBlind"); /* Must have resist nether */ /* if (!borg_plays_risky && !borg_skill[BI_SRNTHR]) return ("RNeth"); */ /* Telepathy, better have it by now */ if (!borg_skill[BI_ESP]) return ("ESP"); /* Usually ready for level 55 to 59 */ if (depth <= 59) return ((char *)NULL); /*** Essential Items for Level 61 to 80 ***/ /* Must have +10 speed */ if (borg_skill[BI_SPEED] < 120) return ("+10 speed"); /* Resists */ if (!borg_skill[BI_SRKAOS]) return ("RChaos"); if (!borg_skill[BI_SRDIS]) return ("RDisen"); /* Usually ready for level 61 to 80 */ if (depth <= 80) return ((char *)NULL); /*** Essential Items for Level 81-85 ***/ /* Minimal Speed */ if (borg_skill[BI_SPEED] < 130) return ("+20 Speed"); /* Usually ready for level 81 to 85 */ if (depth <= 85) return ((char *)NULL); /*** Essential Items for Level 86-99 ***/ /* Usually ready for level 86 to 99 */ if (depth <= 99) return ((char *)NULL); /*** Essential Items for Level 100 ***/ /* must have lots of restore mana to go after MORGOTH */ if (!borg_skill[BI_KING]) { if ((borg_skill[BI_MAXSP] > 100) && (borg_has[POTION_RES_MANA] < 15)) return ("10ResMana"); /* must have lots of heal */ if (borg_has[POTION_HEAL] < 5) return ("5Heal"); /* must have lots of ez-heal */ if (borg_skill[BI_AEZHEAL] < 15) return ("15EZHeal"); /* must have lots of speed */ if (borg_skill[BI_ASPEED] < 10) return ("10Speed"); } /* Its good to be the king */ if (depth <= 127) return ((char *)NULL); /* all bases covered */ return ((char *)NULL); } /* buffer for borg_prepared mesage */ #define MAX_REASON 1024 static char borg_prepared_buffer[MAX_REASON]; /* * Determine if the Borg is "prepared" for the given level * * This routine does not help him decide how to get ready for the * given level, so it must work closely with "borg_power()". * * Note that we ignore any "town fear", and we allow fear of one * level up to and including the relevant depth. * * This now returns a string with the reason you are not prepared. * */ const char *borg_prepared(int depth) { const char *reason; /* Town and First level */ if (depth == 1) return ((char *)NULL); /* Not prepared if I need to restock */ if ((reason = borg_restock(depth))) return (reason); /*** Require his Clevel to be greater than or equal to Depth */ if (borg_skill[BI_MAXCLEVEL] < depth && borg_skill[BI_MAXCLEVEL] < 50) return ("Clevel < depth"); /* Must meet minimal requirements */ if (depth <= 99) { if ((reason = borg_prepared_aux(depth))) return (reason); } /* Not if No_Deeper is set */ if (depth >= borg_no_deeper) { strnfmt(borg_prepared_buffer, MAX_REASON, "No deeper %d.", borg_no_deeper); return (borg_prepared_buffer); } /* Once Morgoth is dead */ if (borg_skill[BI_KING]) { return ((char *)NULL); } /* Always okay from town */ if (!borg_skill[BI_CDEPTH]) return (reason); /* Scum on depth 80-81 for some *heal* potions */ if (depth >= 82 && (num_ezheal < 10 && borg_skill[BI_AEZHEAL] < 10)) { /* Must know exact number of Potions in home */ borg_notice_home(NULL, FALSE); strnfmt(borg_prepared_buffer, MAX_REASON, "Scumming *Heal* potions (%d to go).", 10-num_ezheal); return (borg_prepared_buffer); } /* Scum on depth 80-81 for lots of *Heal* potions preparatory for Endgame */ if (depth >= 82 && borg_skill[BI_MAXDEPTH] >= 97) { /* Must know exact number of Potions in home */ borg_notice_home(NULL, FALSE); /* Scum for 30*/ if (num_ezheal_true + borg_skill[BI_AEZHEAL] < 30) { strnfmt(borg_prepared_buffer, MAX_REASON, "Scumming *Heal* potions (%d to go).", 30- (num_ezheal_true + borg_skill[BI_AEZHEAL])); return (borg_prepared_buffer); } /* Return to town to get your stock from the home*/ if (num_ezheal_true + borg_skill[BI_AEZHEAL] >= 30 && /* Enough combined EZ_HEALS */ num_ezheal_true >=1 && borg_skill[BI_MAXDEPTH] >= 99) /* Still some sitting in the house */ { strnfmt(borg_prepared_buffer, MAX_REASON, "Collect from house (%d potions).", num_ezheal_true); return (borg_prepared_buffer); } } /* Check to make sure the borg does not go below where 3 living */ /* uniques are. */ if (borg_skill[BI_MAXDEPTH] <= 98) { monster_race *r_ptr = &r_info[borg_living_unique_index]; /* are too many uniques alive */ if (borg_numb_live_unique < 3 || borg_plays_risky || borg_skill[BI_CLEVEL] == 50 || borg_kills_uniques == FALSE) return ((char *)NULL); /* Check for the dlevel of the unique */ if (depth < borg_unique_depth) return ((char *)NULL); /* To avoid double calls to format() */ /* Reset our description for not diving */ strnfmt(borg_prepared_buffer, MAX_REASON, "Must kill %s.", r_ptr->name); return (borg_prepared_buffer); } else if (borg_skill[BI_MAXDEPTH] >= 98 || depth >= 98) /* check to make sure the borg does not go to level 100 */ /* unless all the uniques are dead. */ { monster_race *r_ptr; /* Access the living unique obtained from borg_update() */ r_ptr = &r_info[borg_living_unique_index]; /* -1 is unknown. */ borg_ready_morgoth = -1; if (borg_numb_live_unique < 1 || borg_living_unique_index == 547) /* Morgoth */ { if (depth >= 99) borg_ready_morgoth = 1; return ((char *)NULL); } /* Under special cases allow the borg to dive to 99 then quickly * get his butt to dlevel 98 */ if (borg_skill[BI_MAXDEPTH] == 99 && depth <= 98 && (borg_prayer_legal_fail(4, 3, 20) || /* Teleport Level */ borg_spell_legal_fail(6, 2, 20) || /* Teleport Level */ borg_skill[BI_ATELEPORTLVL] >= 1)) /* Teleport Level scroll */ { return ((char *)NULL); } /* To avoid double calls to format() */ strnfmt(borg_prepared_buffer, MAX_REASON, "%s still alive!", r_ptr->name); return (borg_prepared_buffer); } return (char *)NULL; } /* * Initialize this file */ void borg_init_4(void) { /* Do nothing? */ } #ifdef MACINTOSH static int HACK = 0; #endif #endif /* ALLOW_BORG */ angband-3.5.1/src/borg/borg8.h0000644000175000017500000000123412456456606015352 0ustar chriscchrisc/* File: borg8.h */ /* Purpose: Header file for "borg8.c" -BEN- */ #ifndef INCLUDED_BORG8_H #define INCLUDED_BORG8_H #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #ifdef ALLOW_BORG /* * This file provides support for "borg8.c". */ #include "borg1.h" #include "borg2.h" #include "borg3.h" #include "borg6.h" #include "cmds.h" /* * Think about the stores */ extern bool borg_think_store(void); extern bool borg_caution_phase(int, int); extern bool borg_LIGHT_beam(bool simulation); /* * Think about the dungeon */ extern bool borg_think_dungeon(void); /* * Initialize this file */ extern void borg_init_8(void); #endif #endif angband-3.5.1/src/borg/borgread.txt0000644000175000017500000002010012456456606016477 0ustar chriscchrisc Greetings my friends and welcome to the world of mindless dribble. This source code will enable you to spend countless hours staring at your computer when you should be doing something more productive, anything more productive. You have a couple of options on how to get the borg running. Be sure to copy the file borg.txt into the angband\lib\user directory. On my system, borg.txt is in c:\games\ang309\lib\user. For those using Unix, you need to put it in a different directory. The borg.txt file ought to be placed in the directory ~/.angband/Angband/ on Unix systems. Option one: Use the precompiled executable files and replace your angband.exe or angband.scr files with the ones with this package. 1. copy the angband.exe and replace the existing one in your angband directory. If using the screensaver, copy and replace the angband.scr in your windows directory. 2. If using screensaver, copy the angband.ini included with the screensaver zip file and put that in your windows directory as well. Be sure to edit it so it points to the correct location of your angband files. (See the notes below) Option two: Compile your own executable file using the borg source code provided in this package. Follow the instructions below. To install and compile this borg, you will need to do the following: 1. Modify the config.h to uncomment: a. the allow_borg line b. the score_borg line c. the allow_borg_graphics line 2. Modify the makefile to include the borg1.o (or borg1.obj if windows) though borg9.o 3. Make sure the file borg.txt is located in the \lib\user\ directory. Unless you are using unix. Unix users must have it in a specially named directory, but I don't remember what it is. 4. Modify your borg.txt file if you want to run the borg in a particular fashion, including continuous play borgs. 5. Compile 6. Start the game, load up a character or make new one. 7. Hit control z, read and ignore the messages, hit z again. 8. Grab some popcorn and a soda, and watch your mind go numb. The borg may get stuck in certain situations. He may have a Clock Overflow. He may loop buying and selling the same stuff over and over. Believe me when I say that these have been addressed. His loops are greatly reduced. Continuous Play Mode: (option) Upon the death of a borg, he will automatically reroll a random character, with a random name and start fresh from clevel 1. To enable the Continuous Play Mode, turn the game option cheat_live on. To do that enter the options by pressing the equal sign (=) then Cheat Options (6). If you want, you can tell the borg to select a certain race and or class for the next one rolled up. You can make these selections from the borg.txt file. The Continual Play Mode is NOT turned on by default, you will need to select it. This borg is updated frequently. You can get the lastest source as well as executables at http://innovapain.com/borg Have Fun, Dr. Andrew White =========================== Angband Borg Screen Saver =========================== by Robert Ruehlmann < rr9@angband.org > Andrew White < andrew@innovapain.com > Uses Andrew P. White's APWBorg. (see http://innovapain.com/borg). Description: ------------ A screensaver that runs the vanilla Angband Windows version with the APW Borg and automatically restarts the Borg when the character dies (continuous play mode). The borg engine is updated frequently, so visit Dr. White's page and obtain the most recent version of the borg. You may also down-load an up to date executable of the screensaver from that page. Note that the Angband display is not always dynamic and may not protect your monitor from burning-in of images. While this is highly unlikely with modern monitors you might want to configure the energy saving settings for your monitor so that it turns itself off after some time of inactivity. The screensaver will also keep the processor and hard-disk busy. Power-saving features that depend on inactivity of these parts won't be effective while the screensaver is running. You have been warned. Installation: ------------- Copy angband.scr and the included angband.ini into your Windows directory. Make sure you have the Windows version of Angband installed. If you don't have it yet, then download it from http://rephial.org/ and install it. You will need all the supporting files found in the Lib directory. Open angband.ini with a text-editor and modify "AngbandPath" so that it points to the directory where Angband for Windows is installed. Note that the path has to end with a backslash ('\'). The "SaverFile" variable should contain the name of the character you want to use for the screensaver. A random character will be automatically created if the character doesn't exist yet. Note that the savefile will be marked as cheater and won't get an highscore entry! With the changes to the 3.0.9 game code, there is a slight flaw in how the borg rolls up the first character for the screensaver. The character is rolled but the borg won't engage until the next time the screensaver is activated. It is recommended that you create a normal character using the regular version of Angband and setup your term windows the way you like them. Then save that file and use that file name as the "SaverFile" for your screensaver. For example, I have these three lines in my angband.ini file. [Angband] AngbandPath="c:\games\angband-3.0.9\" SaverFile="Saver" Test the screen saver in windows. Select the screensaver in the Windows Display Properties and test it! Technical stuff: ---------------- The screensaver is basically just a renamed Windows Angband executable. The main-win.c file has been heavily modified to allow the game to act as screensaver. "SCORE_BORGS" has been turned on so that normal Borgs (but not Borgs used with the continuous play mode turned on like in the screensaver!) will get highscore entries. The screensaver uses the angband.ini of the normal Angband installation to determine the screen-layout, as well as the graphics and sound settings. My "ALLOW_BORG_GRAPHICS" code that is included in the APW Borg has been turned on, so the Borg runs nicely with the various graphics and "view_foo_lite" lighting settings. The screensaver can be used as normal Angband executable by renaming it to angband.exe and replacing the old exe in the Angband installation directory with it. The screensaver tries to be "nice" and only uses processor cycles when the processor would be idle otherwise. It shouldn't slow down other processes that might be running. The user can also switch that feature on with the "Options/Low priority" menu-entry when using the screensaver as normal Angband executable (very useful for running Borgs in the background). Known problems: --------------- - No preview of the screensaver when in the Windows display properties. - Password protection doesn't work yet (note that Windows NT seems to handle password protection itself, so this might be no problem on NT and maybe Windows 2000 machines). - Configuration of the screenserver should be possible with a dialog instead of an ini-file. - Selecting "Show scores" while the Borg is running will probably crash the Borg since it can't parse the score-screen. - The screensaver probably won't work correctly with other Borgs that don't provide a continuous play mode compatible with the APW code. - Running the same savefile twice at the same time (for example by running a normal game and the screensaver with the same savefile) might lead to problems. - The size of some info windows can increase when exiting the "pseudo- screensaver" mode started from the options menu. - The Borg is a very complicated piece of code and contains lots of bugs. Expect slowdowns, loops, crashes, and other problems. If you encounter a suspect bug, first consult the APWBorg Webpage for a updated screen- saver, and check the Daily Log of Changes to see if your bug has been fixed. If not, then send the bug and savefile to Dr. White at andrew@innovapain.com Links: ------ APW-Borg homepage: http://innovapain.com/borg Angband homepage: http://rephial.org/ angband-3.5.1/src/borg/borg9.c0000644000175000017500000061071512456456606015360 0ustar chriscchrisc/* File: borg9.c */ /* Purpose: Highest level functions for the Borg -BEN- */ #include "angband.h" #include "object/tvalsval.h" #include "birth.h" #include "cave.h" #include "target.h" #include "spells.h" #include "object/inventory.h" #include "borg1.h" #include "borg2.h" #include "borg3.h" #include "borg4.h" #include "borg5.h" #include "borg6.h" #include "borg7.h" #include "borg8.h" #include "borg9.h" #ifdef BABLOS extern bool auto_play; extern bool keep_playing; #endif /* bablos */ bool borg_cheat_death; /* * This file implements the "Ben Borg", an "Automatic Angband Player". * * Use of the "Ben Borg" requires re-compilation with ALLOW_BORG defined, * and with the various "borg*.c" files linked into the executable. * * The "do_cmd_borg()" function, called when the user hits "^Z", allows * the user to interact with the Borg. You do so by typing "Borg Commands", * including 'z' to activate (or re-activate), 'K' to show monsters, 'T' to * show objects, 'd' to toggle "demo mode", 'f' to open/shut the "log file", * 'i' to display internal flags, etc. See "do_cmd_borg()" for more info. * * The first time you enter a Borg command: * * (1) The various "borg" modules are initialized. * * (2) Some important "state" information is extracted, including the level * and race/class of the player, and some more initialization is done. * * (3) Some "historical" information (killed uniques, maximum dungeon depth) * is "stolen" from the game. * * The Ben Borg is only supposed to "know" what is visible on the screen, * which it learns by using the "term.c" screen access function "Term_what()", * the cursor location function "Term_locate()", and the cursor visibility * extraction function "Term_get_cursor()". * * The Ben Borg is only supposed to "send" keypresses when the "Term_inkey()" * function asks for a keypress, which is accomplished by using a special * function hook in the "z-term.c" file, which allows the Borg to "steal" * control from the "Term_inkey()" and "Term_flush()" functions. This * allows the Ben Borg to pretend to be a normal user. * * The Borg is thus allowed to examine the screen directly (by efficient * direct access of the "Term->scr->a" and "Term->scr->c" arrays, which * could be replaced by calls to "Term_grab()"), and to access the cursor * location (via "Term_locate()") and visibility (via "Term_get_cursor()"), * and, as mentioned above, the Borg is allowed to send keypresses directly * to the game, and only when needed, using the "Term_inkey_hook" hook, and * uses the same hook to know when it should discard all pending keypresses. * * Note that any "user input" will be ignored, and will cancel the Borg, * after the Borg has completed any key-sequences currently in progress. * * Note that the "borg_t" parameter bears a close resemblance to the number of * "player turns" that have gone by. Except that occasionally, the Borg will * do something that he *thinks* will take time but which actually does not * (for example, attempting to open a hallucinatory door), and that sometimes, * the Borg performs a "repeated" command (rest, open, tunnel, or search), * which may actually take longer than a single turn. This has the effect * that the "borg_t" variable is slightly lacking in "precision". Note that * we can store every time-stamp in a 's16b', since we reset the clock to * 1000 on each new level, and we refuse to stay on any level longer than * 30000 turns, unless we are totally stuck, in which case we abort. * * The Borg assumes that the "maximize" flag is off, and that the * "preserve" flag is on, since he cannot actually set those flags. * If the "maximize" flag is on, the Borg may not work correctly. * If the "preserve" flag is off, the Borg may miss artifacts. */ /* * Some variables */ static bool initialized; /* Hack -- Initialized */ #ifndef BABLOS void borg_log_death(void) { char buf[1024]; ang_file *borg_log_file; time_t death_time; /* Build path to location of the definition file */ path_build(buf, 1024, ANGBAND_DIR_USER, "borg-log.txt"); /* Append to the file */ borg_log_file = file_open(buf, MODE_APPEND, FTYPE_TEXT); /* Failure */ if (!borg_log_file) return; /* Get time of death */ (void)time(&death_time); /* Save the date */ strftime(buf, 80, "%Y/%m/%d %H:%M\n", localtime(&death_time)); file_putf(borg_log_file, buf); file_putf(borg_log_file, "%s the %s %s, Level %d/%d\n", op_ptr->full_name, p_ptr->race->name, p_ptr->class->name, p_ptr->lev, p_ptr->max_lev); file_putf(borg_log_file, "Exp: %lu Gold: %lu Turn: %lu\n", (long)p_ptr->max_exp + (100 * p_ptr->max_depth), (long)p_ptr->au, (long)turn); file_putf(borg_log_file, "Killed on level: %d (max. %d) by %s\n", p_ptr->depth, p_ptr->max_depth, p_ptr->died_from); file_putf(borg_log_file, "Borg Compile Date: %s\n", borg_engine_date); file_putf(borg_log_file, "----------\n\n"); file_close(borg_log_file); } #endif /* BABLOS */ void borg_log_death_data(void) { char buf[1024]; ang_file *borg_log_file; time_t death_time; path_build(buf, 1024, ANGBAND_DIR_USER, "borg.dat"); /* Append to the file */ borg_log_file = file_open(buf, MODE_APPEND, FTYPE_TEXT); /* Failure */ if (!borg_log_file) return; /* Get time of death */ (void)time(&death_time); /* dump stuff for easy import to database */ file_putf(borg_log_file, "%s, %s, %s, %d, %d, %s\n",borg_engine_date, p_ptr->race->name, p_ptr->class->name, p_ptr->lev, p_ptr->depth, p_ptr->died_from); file_close(borg_log_file); } /* * Think about the world and perform an action * * Check inventory/equipment/spells/panel once per "turn" * * Process "store" and other modes when necessary * * Note that the non-cheating "inventory" and "equipment" parsers * will get confused by a "weird" situation involving an ant ("a") * on line one of the screen, near the left, next to a shield, of * the same color, and using --(-- the ")" symbol, directly to the * right of the ant. This is very rare, but perhaps not completely * impossible. I ignore this situation. :-) * * The handling of stores is a complete and total hack, but seems * to work remarkably well, considering... :-) Note that while in * a store, time does not pass, and most actions are not available, * and a few new commands are available ("sell" and "purchase"). * * Note the use of "cheat" functions to extract the current inventory, * the current equipment, the current panel, and the current spellbook * information. These can be replaced by (very expensive) "parse" * functions, which cause an insane amount of "screen flashing". * * Technically, we should attempt to parse all the messages that * indicate that it is necessary to re-parse the equipment, the * inventory, or the books, and only set the appropriate flags * at that point. This would not only reduce the potential * screen flashing, but would also optimize the code a lot, * since the "cheat_inven()" and "cheat_equip()" functions * are expensive. For paranoia, we could always select items * and spells using capital letters, and keep a global verification * buffer, and induce failure and recheck the inventory/equipment * any time we get a mis-match. We could even do some of the state * processing by hand, for example, charge reduction and such. This * might also allow us to keep track of how long we have held objects, * especially if we attempt to do "item tracking" in the inventory * extraction code. */ static bool borg_think(void) { int i; byte t_a; char buf[128]; static char svSavefile[1024]; static char svSavefile2[1024]; static bool justSaved = FALSE; /* Fill up the borg_skill[] array */ (void)borg_update_frame(); /*** Process inventory/equipment ***/ /* Cheat */ if (borg_do_equip) { /* Only do it once */ borg_do_equip = FALSE; /* Cheat the "equip" screen */ borg_cheat_equip(); /* Done */ return (FALSE); } /* Cheat */ if (borg_do_inven) { /* Only do it once */ borg_do_inven = FALSE; /* Cheat the "inven" screen */ borg_cheat_inven(); /* Done */ return (FALSE); } /* save now */ if (borg_save && borg_save_game()) { /* Log */ borg_note("# Auto Save!"); borg_save = FALSE; /* Create a scum file */ if (borg_skill[BI_CLEVEL] >= borg_dump_level || strstr(p_ptr->died_from, "starvation")) { memcpy(svSavefile, savefile, sizeof(savefile)); /* Process the player name */ for (i = 0; op_ptr->full_name[i]; i++) { char c = op_ptr->full_name[i]; /* No control characters */ if (iscntrl(c)) { /* Illegal characters */ quit_fmt("Illegal control char (0x%02X) in player name", c); } /* Convert all non-alphanumeric symbols */ if (!isalpha(c) && !isdigit(c)) c = '_'; /* Build "file_name" */ svSavefile2[i] = c; } svSavefile2[i] = 0; path_build(savefile, 1024, ANGBAND_DIR_USER, svSavefile2); justSaved = TRUE; } return (TRUE); } if (justSaved) { memcpy(savefile, svSavefile, sizeof(savefile)); borg_save_game(); justSaved = FALSE; return (TRUE); } /* Parse "equip" mode */ if ((0 == borg_what_text(0, 0, 10, &t_a, buf)) && (streq(buf, "(Equipment) "))) { /* Parse the "equip" screen */ /* borg_parse_equip(); */ /* Leave this mode */ borg_keypress(ESCAPE); /* Done */ return (TRUE); } /* Parse "inven" mode */ if ((0 == borg_what_text(0, 0, 10, &t_a, buf)) && (streq(buf, "(Inventory) "))) { /* Parse the "inven" screen */ /* borg_parse_inven(); */ /* Leave this mode */ borg_keypress(ESCAPE); /* Done */ return (TRUE); } /* Parse "inven" mode */ if ((0 == borg_what_text(0, 0, 6, &t_a, buf)) && (streq(buf, "(Inven"))) { if (borg_best_item != -1) borg_keypress(I2A(borg_best_item)); /* Leave this mode */ borg_keypress(ESCAPE); borg_best_item = -1; /* Done */ return (TRUE); } /*** Find books ***/ /* Only if needed */ if (borg_do_spell && (borg_do_spell_aux == 0)) { /* Assume no books */ for (i = 0; i < 9; i++) borg_book[i] = -1; /* Scan the pack */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip non-books */ if (item->tval != p_ptr->class->spell_book) continue; /* Note book locations */ borg_book[item->sval] = i; } } /*** Process books ***/ /* Hack -- Warriors never browse */ if (borg_class == CLASS_WARRIOR) borg_do_spell = FALSE; /* Hack -- Blind or Confused prevents browsing */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED]) borg_do_spell = FALSE; /* XXX XXX XXX Dark */ /* Hack -- Stop doing spells when done */ if (borg_do_spell_aux > 8) borg_do_spell = FALSE; /* Cheat */ if (borg_do_spell) { /* Look for the book */ i = borg_book[borg_do_spell_aux]; /* Cheat the "spell" screens (all of them) */ if (i >= 0) { /* Cheat that page */ borg_cheat_spell(borg_do_spell_aux); } /* Advance to the next book */ borg_do_spell_aux++; /* Done */ return (FALSE); } /* Check for "browse" mode */ if ((0 == borg_what_text(COL_SPELL, ROW_SPELL, -12, &t_a, buf)) && (streq(buf, "Lv Mana Fail"))) { /* Parse the "spell" screen */ /* borg_parse_spell(borg_do_spell_aux); */ /* Advance to the next book */ /* borg_do_spell_aux++; */ /* Leave that mode */ borg_keypress(ESCAPE); /* Done */ return (TRUE); } /* If king, maybe retire. */ if (borg_skill[BI_KING]) { /* Prepare to retire */ if (borg_stop_king) { #ifndef BABLOS borg_write_map(FALSE); #endif /* bablos */ borg_oops("retire"); } /* Borg will be respawning */ if (borg_respawn_winners) { #ifndef BABLOS borg_write_map(FALSE); #if 0 /* Note the score */ borg_enter_score(); #endif /* Write to log and borg.dat */ borg_log_death(); borg_log_death_data(); /* respawn */ resurrect_borg(); #endif /* bablos */ } } /*** Handle stores ***/ /* Hack -- Check for being in a store CHEAT*/ if ((0 == borg_what_text(1, 3, 4, &t_a, buf)) && (streq(buf, "Stor") || streq(buf, "Home"))) { /* Cheat the store number */ shop_num = (cave->feat[p_ptr->py][p_ptr->px] - FEAT_SHOP_HEAD); /* Clear the goal (the goal was probably going to a shop number) */ goal = 0; /* Hack -- Reset food counter for money scumming */ if (shop_num == 0) borg_food_onsale = 0; /* Hack -- Reset fuel counter for money scumming */ if (shop_num == 0) borg_fuel_onsale = 0; /* Extract the current gold (unless in home) */ borg_gold = (long)p_ptr->au; /* Cheat the store (or home) inventory (all pages) */ borg_cheat_store(); /* Recheck inventory */ borg_do_inven = TRUE; /* Recheck equipment */ borg_do_equip = TRUE; /* Recheck spells */ borg_do_spell = TRUE; /* Restart spells */ borg_do_spell_aux = 0; /* Examine the inventory */ borg_notice(TRUE); /* Evaluate the current world */ my_power = borg_power(); /* Hack -- allow user abort */ if (borg_cancel) return (TRUE); /* Do not allow a user key to interrupt the borg while in a store */ borg_in_shop = TRUE; /* Think until done */ return (borg_think_store()); } /*** Determine panel ***/ /* Hack -- cheat */ w_y = Term->offset_y; w_x = Term->offset_x; /* Done */ borg_do_panel = FALSE; /* Hack -- Check for "sector" mode */ if ((0 == borg_what_text(0, 0, 16, &t_a, buf)) && (prefix(buf, "Map sector "))) { /* Hack -- get the panel info */ w_y = (buf[12] - '0') * (SCREEN_HGT / 2); w_x = (buf[14] - '0') * (SCREEN_WID / 2); /* Leave panel mode */ borg_keypress(ESCAPE); /* Done */ return (TRUE); } /* Check panel */ if (borg_do_panel) { /* Only do it once */ borg_do_panel = FALSE; /* Enter "panel" mode */ borg_keypress('L'); /* Done */ return (TRUE); } /*** Analyze the Frame ***/ /* Analyze the frame */ if (borg_do_frame) { /* Only once */ borg_do_frame = FALSE; /* Analyze the "frame" */ borg_update_frame(); } /*** Re-activate Tests ***/ /* Check equip again later */ borg_do_equip = TRUE; /* Check inven again later */ borg_do_inven = TRUE; /* Check panel again later */ borg_do_panel = TRUE; /* Check frame again later */ borg_do_frame = TRUE; /* Check spells again later */ borg_do_spell = TRUE; /* Hack -- Start the books over */ borg_do_spell_aux = 0; /*** Analyze status ***/ /* Track best level */ if (borg_skill[BI_CLEVEL] > borg_skill[BI_MAXCLEVEL]) borg_skill[BI_MAXCLEVEL] = borg_skill[BI_CLEVEL]; if (borg_skill[BI_CDEPTH] > borg_skill[BI_MAXDEPTH]) { borg_skill[BI_MAXDEPTH] = borg_skill[BI_CDEPTH]; } /*** Think about it ***/ /* Increment the clock */ borg_t++; /* Increment the panel clock */ time_this_panel++; /* Examine the screen */ borg_update(); /* Examine the equipment/inventory */ borg_notice(TRUE); /* Evaluate the current world */ my_power = borg_power(); /* Hack -- allow user abort */ if (borg_cancel) return (TRUE); /* Do something */ return (borg_think_dungeon()); } /* * Hack -- methods of hurting a monster (order not important). * * See "message_pain()" for details. */ static char *suffix_pain[] = { " is unharmed." " barely notices.", " flinches.", " squelches.", " quivers in pain.", " writhes about.", " writhes in agony.", " jerks limply.", " spawns!", " looks healthier.", " starts moving faster.", " starts moving slower.", " is unaffected!", " is immune.", " resists a lot.", " resists.", " resists somewhat.", " shrugs off the attack.", " snarls with pain.", " yelps in pain.", " howls in pain.", " howls in agony.", /* xxx */ " yelps feebly.", " ignores the attack.", " grunts with pain.", " squeals in pain.", " shrieks in pain.", " shrieks in agony.", /* xxx */ " cries out feebly.", /* xxx */ /* xxx */ " cries out in pain.", " screams in pain.", " screams in agony.", /* xxx */ " cringes from the light!", " loses some skin!", " is hit hard.", NULL }; /* * Hack -- methods of killing a monster (order not important). * * See "mon_take_hit()" for details. */ static char *prefix_kill[] = { "You have killed ", "You have slain ", "You have destroyed ", NULL }; /* * Hack -- methods of monster death (order not important). * * See "project_m()", "do_cmd_fire()", "mon_take_hit()" for details. */ static char *suffix_died[] = { " dies.", " is destroyed.", " dissolves!", " shrivels away in the light!", NULL }; static char *suffix_blink[] = { " disappears!", /* from teleport other */ " changes!", /* from polymorph spell */ " teleports away.", /* RF6_TPORT */ " blinks away.", /* RF6_BLINK */ NULL }; /* * Hack -- methods of hitting the player (order not important). * * The "insult", "moan", and "begs you for money" messages are ignored. * * See "make_attack_normal()" for details. */ static char *suffix_hit_by[] = { " hits you.", " touches you.", " punches you.", " kicks you.", " claws you.", " bites you.", " stings you.", " butts you.", " crushes you.", " engulfs you.", " crawls on you.", " drools on you.", " spits on you.", " gazes at you.", " wails at you.", " releases spores at you.", NULL }; /* * Hack -- methods of casting spells at the player (order important). * * See "make_attack_spell()" for details. */ static char *suffix_spell[] = { " makes a high pitched shriek.", /* 0 RF4_SHRIEK */ " tries to cast a spell, but fails.", /* 1 RF4_FAILS */ " does something.", /* 2 RF4_XXX3X4 */ " does something.", /* 3 RF4_XXX4X4 */ " fires an arrow.", /* 4 RF4_ARROW_1 */ " fires an arrow!", /* 5 RF4_ARROW_2 */ " fires a missile.", /* 6 RF4_ARROW_3 */ " fires a missile!", /* 7 RF4_ARROW_4 */ " breathes acid.", /* 8 RF4_BR_ACID */ " breathes lightning.", /* 9 RF4_BR_ELEC */ " breathes fire.", /*10 RF4_BR_FIRE */ " breathes frost.", /*11 RF4_BR_COLD */ " breathes gas.", /*12 RF4_BR_POIS */ " breathes nether.", /*13 RF4_BR_NETH */ " breathes light.", /*14 RF4_BR_LIGHT */ " breathes darkness.", /*15 RF4_BR_DARK */ " breathes confusion.", /*16 RF4_BR_CONF */ " breathes sound.", /*17 RF4_BR_SOUN */ " breathes chaos.", /*18 RF4_BR_CHAO */ " breathes disenchantment.", /*19 RF4_BR_DISE */ " breathes nexus.", /*20 RF4_BR_NEXU */ " breathes time.", /*21 RF4_BR_TIME */ " breathes inertia.", /*22 RF4_BR_INER */ " breathes gravity.", /*23 RF4_BR_GRAV */ " breathes shards.", /*24 RF4_BR_SHAR */ " breathes plasma.", /*25 RF4_BR_PLAS */ " breathes force.", /*26 RF4_BR_WALL */ " does something.", /*27 RF4_BR_MANA */ " does something.", /*28 RF4_XXX5X4 */ " does something.", /*29 RF4_XXX6X4 */ " does something.", /*30 RF4_XXX7X4 */ " hurls a boulder at you!", /*31 RF4_BOULDER */ " casts an acid ball.", /*32 RF5_BA_ACID */ " casts a lightning ball.", /*33 RF5_BA_ELEC */ " casts a fire ball.", /*34 RF5_BA_FIRE */ " casts a frost ball.", /*35 RF5_BA_COLD */ " casts a stinking cloud.", /*36 RF5_BA_POIS */ " casts a nether ball.", /*37 RF5_BA_NETH */ " gestures fluidly.", /*38 RF5_BA_WATE */ " invokes a mana storm.", /*39 RF5_BA_MANA */ " invokes a darkness storm.", /*40 RF5_BA_DARK */ " draws psychic energy from you!", /*41 RF5_DRAIN_MANA */ " gazes deep into your eyes.", /*42 RF5_MIND_BLAST */ " looks deep into your eyes.", /*43 RF5_BRAIN_SMASH */ " points at you and curses.", /*44 RF5_CAUSE_1 */ " points at you and curses horribly.", /*45 RF5_CAUSE_2 */ " points at you, incanting terribly!", /*46 RF5_CAUSE_3 */ " points at you, screaming the word DIE!", /*47 RF5_CAUSE_4 */ " casts a acid bolt.", /*48 RF5_BO_ACID */ " casts a lightning bolt.", /*49 RF5_BO_ELEC */ " casts a fire bolt.", /*50 RF5_BO_FIRE */ " casts a frost bolt.", /*51 RF5_BO_COLD */ " does something.", /*52 RF5_BO_POIS */ " casts a nether bolt.", /*53 RF5_BO_NETH */ " casts a water bolt.", /*54 RF5_BO_WATE */ " casts a mana bolt.", /*55 RF5_BO_MANA */ " casts a plasma bolt.", /*56 RF5_BO_PLAS */ " casts an ice bolt.", /*57 RF5_BO_ICEE */ " casts a magic missile.", /*58 RF5_MISSILE */ " casts a fearful illusion.", /*59 RF5_SCARE */ " casts a spell, burning your eyes!", /*60 RF5_BLIND */ " creates a mesmerising illusion.", /*61 RF5_CONF */ " drains power from your muscles!", /*62 RF5_SLOW */ " stares deep into your eyes!", /*63 RF5_HOLD */ " concentrates on XXX body.", /*64 RF6_HASTE */ " does something.", /*65 RF6_XXX1X6 */ " concentrates on XXX wounds.", /*66 RF6_HEAL */ " does something.", /*67 RF6_XXX2X6 */ " does something.", /*68 RF6_XXX3X6 */ " does something.", /*69 RF6_XXX4X6 */ " commands you to return.", /*70 RF6_TELE_TO */ " teleports you away.", /*71 RF6_TELE_AWAY */ " gestures at your feet.", /*72 RF6_TELE_LEVEL */ " does something.", /*73 RF6_XXX5 */ " gestures in shadow.", /*74 RF6_DARKNESS */ " casts a spell and cackles evilly.", /*75 RF6_TRAPS */ " tries to blank your mind.", /*76 RF6_FORGET */ " does something.", /*77 RF6_XXX6X6 */ " does something.", /*78 RF6_XXX7X6 */ " does something.", /*79 RF6_XXX8X6 */ " magically summons help!", /*80 RF6_S_MONSTER */ " magically summons monsters!", /*81 RF6_S_MONSTERS */ " magically summons animals.", /*82 RF6_S_ANIMAL */ " magically summons spiders.", /*83 RF6_S_SPIDER */ " magically summons hounds.", /*84 RF6_S_HOUND */ " magically summons hydras.", /*85 RF6_S_HYDRA */ " magically summons an angel!", /*86 RF6_S_ANGEL */ " magically summons a hellish adversary!", /*87 RF6_S_DEMON */ " magically summons an undead adversary!", /*88 RF6_S_UNDEAD */ " magically summons a dragon!", /*89 RF6_S_DRAGON */ " magically summons greater undead!", /*90 RF6_S_HI_UNDEAD */ " magically summons ancient dragons!", /*91 RF6_S_HI_DRAGON */ " magically summons mighty undead opponents!", /*92 RF6_S_WRAITH */ " magically summons special opponents!", /*93 RF6_S_UNIQUE */ NULL }; #if 0 /* XXX XXX XXX */ msg("%s looks healthier.", m_name); msg("%s looks REALLY healthy!", m_name); #endif /* * Hack -- Spontaneous level feelings (order important). * * See "do_cmd_feeling()" for details. */ static char *prefix_feeling[] = { "Looks like any other level", "You feel there is something special", "You have a superb feeling", "You have an excellent feeling", "You have a very good feeling", "You have a good feeling", "You feel strangely lucky", "You feel your luck is turning", "You like the look of this place", "This level can't be all bad", "What a boring place", NULL }; /* * Hack -- Parse a message from the world * * Note that detecting "death" is EXTREMELY important, to prevent * all sorts of errors arising from attempting to parse the "tomb" * screen, and to allow the user to "observe" the "cause" of death. * * Note that detecting "failure" is EXTREMELY important, to prevent * bizarre situations after failing to use a staff of perceptions, * which would otherwise go ahead and send the "item index" which * might be a legal command (such as "a" for "aim"). This method * is necessary because the Borg cannot parse "prompts", and must * assume the success of the prompt-inducing command, unless told * otherwise by a failure message. Also, we need to detect failure * because some commands, such as detection spells, need to induce * furthur processing if they succeed, but messages are only given * if the command fails. * * Note that certain other messages may contain useful information, * and so they are "analyzed" and sent to "borg_react()", which just * queues the messages for later analysis in the proper context. * * Along with the actual message, we send a special formatted buffer, * containing a leading "opcode", which may contain extra information, * such as the index of a spell, and an "argument" (for example, the * capitalized name of a monster), with a "colon" to separate them. * * XXX XXX XXX Several message strings take a "possessive" of the form * "his" or "her" or "its". These strings are all represented by the * encoded form "XXX" in the various match strings. Unfortunately, * the encode form is never decoded, so the Borg currently ignores * messages about several spells (heal self and haste self). * * XXX XXX XXX We notice a few "terrain feature" messages here so * we can acquire knowledge about wall types and door types. */ static void borg_parse_aux(char *msg, int len) { int i, tmp; int y9; int x9; int ax,ay; int d; char who[256]; char buf[256]; borg_grid *ag = &borg_grids[g_y][g_x]; /* Log (if needed) */ if (borg_verbose) borg_note(format("# Parse Msg bite <%s>", msg)); /* Hack -- Notice death */ if (prefix(msg, "You die.")) { /* Abort (unless cheating) */ if (!(p_ptr->wizard || op_ptr->opt[OPT_cheat_live])) { /* Abort */ borg_oops("death"); /* Abort right now! */ borg_active = FALSE; /* Noise XXX XXX XXX */ Term_xtra(TERM_XTRA_NOISE, 1); } /* Done */ return; } /* Hack -- Notice "failure" */ if (prefix(msg, "You failed ")) { /* Hack -- store the keypress */ borg_note("# Normal failure."); /* Set the failure flag */ borg_failure = TRUE; /* Flush our key-buffer */ borg_flush(); /* If we were casting a targetted spell and failed */ /* it does not mean we can't target that location */ successful_target = 0; /* Incase we failed our emergency use of MM */ borg_confirm_target = FALSE; /* Check to see if it was a door then convert it */ if (ag->feat == FEAT_DOOR_HEAD) { /* What is my chance of opening the door? */ if (borg_skill[BI_DIS] < 20) { /* Set door as jammed, then bash it */ ag->feat = FEAT_DOOR_HEAD + 0x08; } } /* check for glyphs since we no longer have a launch message */ if (borg_casted_glyph) { /* Forget the newly created-though-failed glyph */ track_glyph_num --; track_glyph_x[track_glyph_num] = 0; track_glyph_y[track_glyph_num] = 0; borg_note("# Removing glyph from array,"); borg_casted_glyph = FALSE; } /* Incase it was a Resistance refresh */ if (borg_attempting_refresh_resist) { if (borg_resistance > 1) borg_resistance -=25000; borg_attempting_refresh_resist = FALSE; } return; } /* Ignore teleport trap */ if (prefix(msg, "You hit a teleport")) return; /* Ignore arrow traps */ if (prefix(msg, "An arrow ")) return; /* Ignore dart traps */ if (prefix(msg, "A small dart ")) return; if (prefix(msg, "The cave ")) { borg_react(msg, "QUAKE"); borg_needs_new_sea = TRUE; return; } /* need to check stat */ if (prefix(msg, "You feel very") || prefix(msg, "You feel less") || prefix(msg, "Wow! You feel very")) { /* need to check str */ if (prefix(msg, "You feel very weak")) { my_need_stat_check[0] = TRUE; } if (prefix(msg, "You feel less weak")) { my_need_stat_check[0] = TRUE; } if (prefix(msg, "Wow! You feel very strong")) { my_need_stat_check[0] = TRUE; } /* need to check int */ if (prefix(msg, "You feel very stupid")) { my_need_stat_check[1] = TRUE; } if (prefix(msg, "You feel less stupid")) { my_need_stat_check[1] = TRUE; } if (prefix(msg, "Wow! You feel very smart")) { my_need_stat_check[1] = TRUE; } /* need to check wis */ if (prefix(msg, "You feel very naive")) { my_need_stat_check[2] = TRUE; } if (prefix(msg, "You feel less naive")) { my_need_stat_check[2] = TRUE; } if (prefix(msg, "Wow! You feel very wise")) { my_need_stat_check[2] = TRUE; } /* need to check dex */ if (prefix(msg, "You feel very clumsy")) { my_need_stat_check[3] = TRUE; } if (prefix(msg, "You feel less clumsy")) { my_need_stat_check[3] = TRUE; } if (prefix(msg, "Wow! You feel very dextrous")) { my_need_stat_check[3] = TRUE; } /* need to check con */ if (prefix(msg, "You feel very sickly")) { my_need_stat_check[4] = TRUE; } if (prefix(msg, "You feel less sickly")) { my_need_stat_check[4] = TRUE; } if (prefix(msg, "Wow! You feel very healthy")) { my_need_stat_check[4] = TRUE; } /* need to check cha */ if (prefix(msg, "You feel very ugly")) { my_need_stat_check[5] = TRUE; } if (prefix(msg, "You feel less ugly")) { my_need_stat_check[5] = TRUE; } if (prefix(msg, "Wow! You feel very cute")) { my_need_stat_check[5] = TRUE; } } /* time attacks, just do all stats. */ if (prefix(msg, "You're not as")) { my_need_stat_check[0] = TRUE; my_need_stat_check[1] = TRUE; my_need_stat_check[2] = TRUE; my_need_stat_check[3] = TRUE; my_need_stat_check[4] = TRUE; my_need_stat_check[5] = TRUE; } /* Nexus attacks, need to check everything! */ if (prefix(msg, "Your body starts to scramble...")) { my_need_stat_check[0] = TRUE; my_need_stat_check[1] = TRUE; my_need_stat_check[2] = TRUE; my_need_stat_check[3] = TRUE; my_need_stat_check[4] = TRUE; my_need_stat_check[5] = TRUE; /* max stats may have lowered */ my_stat_max[0] = 0; my_stat_max[1] = 0; my_stat_max[2] = 0; my_stat_max[3] = 0; my_stat_max[4] = 0; my_stat_max[5] = 0; } /* amnesia attacks, re-id wands, staves, equipment. */ if (prefix(msg, "You feel your memories fade.")) { /* Set the borg flag */ borg_skill[BI_ISFORGET] = TRUE; } if (streq(msg, "Your memories come flooding back.")) { borg_skill[BI_ISFORGET] = FALSE; } if (streq(msg, "You have been knocked out.")) { borg_note("Ignoring Messages While KO'd"); borg_dont_react = TRUE; } if (streq(msg, "You are paralyzed")) { borg_note("Ignoring Messages While Paralyzed"); borg_dont_react = TRUE; } /* Hallucination -- Open */ if (streq(msg, "You feel drugged!")) { borg_note("# Hallucinating. Special control of wanks."); borg_skill[BI_ISIMAGE] = TRUE; } /* Hallucination -- Close */ if (streq(msg, "You can see clearly again.")) { borg_note("# Hallucination ended. Normal control of wanks."); borg_skill[BI_ISIMAGE] = FALSE; } /* Hit somebody */ if (prefix(msg, "You hit ")) { tmp = strlen("You hit "); strnfmt(who, 1 + len - (tmp + 1), "%s", msg + tmp); strnfmt(buf, 256, "HIT:%s", who); borg_react(msg, buf); return; } /* Miss somebody */ if (prefix(msg, "You miss ")) { tmp = strlen("You miss "); strnfmt(who, 1 + len - (tmp + 1), "%s", msg + tmp); strnfmt(buf, 256, "MISS:%s", who); borg_react(msg, buf); return; } /* Miss somebody (because of fear) */ if (prefix(msg, "You are too afraid to attack ")) { tmp = strlen("You are too afraid to attack "); strnfmt(who, 1 + len - (tmp + 1), "%s", msg + tmp); strnfmt(buf, 256, "MISS:%s", who); borg_react(msg, buf); return; } /* "Your is unaffected!" * Note that this check must be before the suffix_pain * because suffix_pain will look for 'is unaffected!' and * assume it is talking about a monster which in turn will * yeild to the Player Ghost being created. */ if (prefix(msg, "Your ")) { if (suffix(msg, " is unaffected!")) { /* Your equipment ignored the attack. * Ignore the message */ return; } } /* "It screams in pain." (etc) */ for (i = 0; suffix_pain[i]; i++) { /* "It screams in pain." (etc) */ if (suffix(msg, suffix_pain[i])) { tmp = strlen(suffix_pain[i]); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "PAIN:%s", who); borg_react(msg, buf); return; } } /* "You have killed it." (etc) */ for (i = 0; prefix_kill[i]; i++) { /* "You have killed it." (etc) */ if (prefix(msg, prefix_kill[i])) { tmp = strlen(prefix_kill[i]); strnfmt(who, 1 + len - (tmp + 1), "%s", msg + tmp); strnfmt(buf, 256, "KILL:%s", who); borg_react(msg, buf); return; } } /* "It dies." (etc) */ for (i = 0; suffix_died[i]; i++) { /* "It dies." (etc) */ if (suffix(msg, suffix_died[i])) { tmp = strlen(suffix_died[i]); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "DIED:%s", who); borg_react(msg, buf); return; } } /* "It blinks or telports." (etc) */ for (i = 0; suffix_blink[i]; i++) { /* "It teleports." (etc) */ if (suffix(msg, suffix_blink[i])) { tmp = strlen(suffix_blink[i]); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "BLINK:%s", who); borg_react(msg, buf); return; } } /* "It misses you." */ if (suffix(msg, " misses you.")) { tmp = strlen(" misses you."); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "MISS_BY:%s", who); borg_react(msg, buf); return; } /* "It is repelled.." */ /* treat as a miss */ if (suffix(msg, " is repelled.")) { tmp = strlen(" is repelled."); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "MISS_BY:%s", who); borg_react(msg, buf); return; } /* "It hits you." (etc) */ for (i = 0; suffix_hit_by[i]; i++) { /* "It hits you." (etc) */ if (suffix(msg, suffix_hit_by[i])) { tmp = strlen(suffix_hit_by[i]); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "HIT_BY:%s", who); borg_react(msg, buf); /* If I was hit, then I am not on a glyph */ if (track_glyph_num) { /* erase them all and * allow the borg to scan the screen and rebuild the array. * He won't see the one under him though. So a special check * must be made. */ byte feat = cave->feat[c_y][c_x]; /* Remove the entire array */ for (i = 0; i < track_glyph_num; i++) { /* Stop if we already new about this glyph */ track_glyph_x[i] = 0; track_glyph_y[i] = 0; } track_glyph_num = 0; /* Check for glyphs under player -- Cheat*/ if (feat == FEAT_GLYPH) { track_glyph_x[track_glyph_num] = c_x; track_glyph_y[track_glyph_num] = c_y; track_glyph_num++; } } return; } } /* "It casts a spell." (etc) */ for (i = 0; suffix_spell[i]; i++) { /* "It casts a spell." (etc) */ if (suffix(msg, suffix_spell[i])) { tmp = strlen(suffix_spell[i]); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "SPELL_%03d:%s", i, who); borg_react(msg, buf); return; } } /* State -- Asleep */ if (suffix(msg, " falls asleep!")) { tmp = strlen(" falls asleep!"); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "STATE_SLEEP:%s", who); borg_react(msg, buf); return; } /* State -- confused */ if (suffix(msg, " looks confused.")) { tmp = strlen(" looks confused."); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "STATE_CONFUSED:%s", who); borg_react(msg, buf); return; } /* State -- confused */ if (suffix(msg, " looks more confused.")) { tmp = strlen(" looks more confused."); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "STATE_CONFUSED:%s", who); borg_react(msg, buf); return; } /* State -- Not Asleep */ if (suffix(msg, " wakes up.")) { tmp = strlen(" wakes up."); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "STATE_AWAKE:%s", who); borg_react(msg, buf); return; } /* State -- Afraid */ if (suffix(msg, " flees in terror!")) { tmp = strlen(" flees in terror!"); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "STATE__FEAR:%s", who); borg_react(msg, buf); return; } /* State -- Not Afraid */ if (suffix(msg, " recovers his courage.")) { tmp = strlen(" recovers his courage."); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "STATE__BOLD:%s", who); borg_react(msg, buf); return; } /* State -- Not Afraid */ if (suffix(msg, " recovers her courage.")) { tmp = strlen(" recovers her courage."); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "STATE__BOLD:%s", who); borg_react(msg, buf); return; } /* State -- Not Afraid */ if (suffix(msg, " recovers its courage.")) { tmp = strlen(" recovers its courage."); strnfmt(who, 1 + len - tmp, "%s", msg); strnfmt(buf, 256, "STATE__BOLD:%s", who); borg_react(msg, buf); return; } /* Feature XXX XXX XXX */ if (streq(msg, "The door appears to be broken.")) { /* Only process open doors */ if (ag->feat == FEAT_OPEN) { /* Mark as broken */ ag->feat = FEAT_BROKEN; /* Clear goals */ goal = 0; } return; } /* Feature XXX XXX XXX */ if (streq(msg, "The door appears to be stuck.")) { /* Only process non-jammed doors */ if ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_DOOR_HEAD + 0x07)) { /* Mark the door as jammed */ ag->feat = FEAT_DOOR_HEAD + 0x08; /* Clear goals */ goal = 0; } return; } /* Feature XXX XXX XXX */ if (streq(msg, "This seems to be permanent rock.")) { /* Only process walls */ if ((ag->feat >= FEAT_WALL_EXTRA) && (ag->feat <= FEAT_PERM_SOLID)) { /* Mark the wall as permanent */ ag->feat = FEAT_PERM_EXTRA; /* Clear goals */ goal = 0; } return; } /* Feature XXX XXX XXX */ if (streq(msg, "You tunnel into the granite wall.")) { /* reseting my panel clock */ time_this_panel = 1; /* Only process walls */ if ((ag->feat >= FEAT_WALL_EXTRA) && (ag->feat <= FEAT_PERM_SOLID)) { /* Mark the wall as granite */ ag->feat = FEAT_WALL_EXTRA; /* Clear goals */ goal = 0; } return; } /* Feature XXX XXX XXX */ if (streq(msg, "You tunnel into the quartz vein.")) { /* Process magma veins with treasure */ if (ag->feat == FEAT_MAGMA_K) { /* Mark the vein */ ag->feat = FEAT_QUARTZ_K; /* Clear goals */ goal = 0; } /* Process magma veins */ else if (ag->feat == FEAT_MAGMA) { /* Mark the vein */ ag->feat = FEAT_QUARTZ; /* Clear goals */ goal = 0; } return; } /* Feature XXX XXX XXX */ if (streq(msg, "You tunnel into the magma vein.")) { /* Process quartz veins with treasure */ if (ag->feat == FEAT_QUARTZ_K) { /* Mark the vein */ ag->feat = FEAT_MAGMA_K; /* Clear goals */ goal = 0; } /* Process quartz veins */ else if (ag->feat == FEAT_QUARTZ) { /* Mark the vein */ ag->feat = FEAT_MAGMA; /* Clear goals */ goal = 0; } return; } /* Word of Recall -- Ignition */ if (prefix(msg, "The air about you becomes ")) { /* Initiate recall */ /* Guess how long it will take to lift off */ goal_recalling = 15000 + 5000; /* Guess. game turns x 1000 ( 15+rand(20))*/ return; } /* Word of Recall -- Lift off */ if (prefix(msg, "You feel yourself yanked ")) { /* Recall complete */ goal_recalling = 0; return; } /* Word of Recall -- Cancelled */ if (prefix(msg, "A tension leaves ")) { /* Hack -- Oops */ goal_recalling = 0; return; } /* Wearing Cursed Item */ if ((prefix(msg, "Oops! It feels deathly cold!")) || (suffix(msg, " seems to be cursed.")) || (suffix(msg, " appears to be cursed."))) { /* Hack -- Oops */ borg_wearing_cursed =TRUE; return; } /* protect from evil */ if (prefix(msg, "You feel safe from evil!")) { borg_prot_from_evil = TRUE; return; } if (prefix(msg, "You no longer feel safe from evil.")) { borg_prot_from_evil = FALSE; return; } /* haste self */ if (prefix(msg, "You feel yourself moving faster!")) { borg_speed = TRUE; return; } if (prefix(msg, "You feel yourself slow down.")) { borg_speed = FALSE; return; } /* Bless */ if (prefix(msg, "You feel righteous")) { borg_bless = TRUE; return; } if (prefix(msg, "The prayer has expired.")) { borg_bless = FALSE; return; } /* hero */ if (prefix(msg, "You feel like a hero!")) { borg_hero = TRUE; return; } if (prefix(msg, "You no longer feel heroic.")) { borg_hero = FALSE; return; } /* berserk */ if (prefix(msg, "You feel like a killing machine!")) { borg_berserk = TRUE; return; } if (prefix(msg, "You no longer feel berserk.")) { borg_berserk = FALSE; return; } /* Sense Invisible */ if (prefix(msg, "Your eyes feel very sensitive!")) { borg_see_inv = 30000; return; } if (prefix(msg, "Your eyes no longer feel so sensitive.")) { borg_see_inv = 0; return; } /* check for wall blocking but not when confused*/ if ((prefix(msg, "There is a wall ") && (!borg_skill[BI_ISCONFUSED]))) { my_need_redraw = TRUE; my_need_alter = TRUE; goal = 0; return; } /* check for closed door but not when confused*/ if ((prefix(msg, "There is a closed door blocking your way.") && (!borg_skill[BI_ISCONFUSED] && !borg_skill[BI_ISIMAGE]))) { my_need_redraw = TRUE; my_need_alter = TRUE; goal = 0; return; } /* check for mis-alter command. Sometime induced by never_move guys*/ if (prefix(msg, "You spin around.") && !borg_skill[BI_ISCONFUSED]) { /* Examine all the monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Now do distance considerations */ x9 = kill->x; y9 = kill->y; /* Distance components */ ax = (x9 > c_x) ? (x9 - c_x) : (c_x - x9); ay = (y9 > c_y) ? (y9 - c_y) : (c_y - y9); /* Distance */ d = MAX(ax, ay); /* if the guy is too close then delete him. */ if (d < 4) { /* Hack -- kill em */ borg_delete_kill(i); } } my_no_alter = TRUE; goal = 0; return; } /* Check for the missing staircase */ if (suffix(msg, " staircase here.")) { /* make sure the aligned dungeon is on */ /* make sure the borg does not think he's on one */ /* Remove all stairs from the array. */ track_less_num = 0; track_more_num = 0; borg_on_dnstairs = FALSE; borg_on_upstairs = FALSE; borg_grids[c_y][c_x].feat = FEAT_BROKEN; return; } /* Feature XXX XXX XXX */ if (prefix(msg, "You see nothing there ")) { ag->feat = FEAT_BROKEN; my_no_alter = TRUE; /* Clear goals */ goal = 0; return; } /* Hack to protect against clock overflows and errors */ if (prefix(msg, "Illegal ")) { /* Hack -- Oops */ borg_respawning = 7; borg_keypress(ESCAPE); borg_keypress(ESCAPE); time_this_panel +=100; return; } /* Hack to protect against clock overflows and errors */ if (prefix(msg, "You have nothing to identify")) { /* Hack -- Oops */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); time_this_panel +=100; /* ID all items (equipment) */ for (i = INVEN_WIELD; i <= INVEN_FEET; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; item->ident = TRUE; } /* ID all items (inventory) */ for (i = 0; i <= INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; item->ident = TRUE; } return; } /* Hack to protect against clock overflows and errors */ if (prefix(msg, "Identifying The Phial")) { /* ID item (equipment) */ borg_item *item = &borg_items[INVEN_LIGHT]; item->ident = TRUE; /* Hack -- Oops */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); time_this_panel +=100; } /* resist acid */ if (prefix(msg, "You feel resistant to acid!")) { borg_skill[BI_TRACID] = TRUE; return; } if (prefix(msg, "You are no longer resistant to acid.")) { borg_skill[BI_TRACID] = FALSE; return; } /* resist electricity */ if (prefix(msg, "You feel resistant to electricity!")) { borg_skill[BI_TRELEC] = TRUE; return; } if (prefix(msg, "You are no longer resistant to electricity.")) { borg_skill[BI_TRELEC] = FALSE; return; } /* resist fire */ if (prefix(msg, "You feel resistant to fire!")) { borg_skill[BI_TRFIRE] = TRUE; return; } if (prefix(msg, "You are no longer resistant to fire.")) { borg_skill[BI_TRFIRE] = FALSE; return; } /* resist cold */ if (prefix(msg, "You feel resistant to cold!")) { borg_skill[BI_TRCOLD] = TRUE; return; } if (prefix(msg, "You are no longer resistant to cold.")) { borg_skill[BI_TRCOLD] = FALSE; return; } /* resist poison */ if (prefix(msg, "You feel resistant to poison!")) { borg_skill[BI_TRPOIS] = TRUE; return; } if (prefix(msg, "You are no longer resistant to poison.")) { borg_skill[BI_TRPOIS] = FALSE; return; } /* Shield */ if (prefix(msg, "A mystic shield forms around your body!") || prefix(msg, "Your skin turns to stone.")) { borg_shield = TRUE; return; } if (prefix(msg, "Your mystic shield crumbles away.") || prefix(msg, "A fleshy shade returns to your skin.")) { borg_shield = FALSE; return; } /* Glyph of Warding (the spell no longer gives a report)*/ /* Sadly Rune of Protection has no message */ if (prefix(msg, "You inscribe a mystic symbol on the ground!")) { /* Check for an existing glyph */ for (i = 0; i < track_glyph_num; i++) { /* Stop if we already new about this glyph */ if ((track_glyph_x[i] == c_x) && (track_glyph_y[i] == c_y)) break; } /* Track the newly discovered glyph */ if ((i == track_glyph_num) && (i < track_glyph_size)) { borg_note("# Noting the creation of a glyph."); track_glyph_x[i] = c_x; track_glyph_y[i] = c_y; track_glyph_num++; } return; } if (prefix(msg, "The rune of protection is broken!")) { /* we won't know which is broken so erase them all and * allow the borg to scan the screen and rebuild the array. * He won't see the one under him though. So a special check * must be made. */ byte feat = cave->feat[c_y][c_x]; /* Remove the entire array */ for (i = 0; i < track_glyph_num; i++) { /* Stop if we already new about this glyph */ track_glyph_x[i] = 0; track_glyph_y[i] = 0; } /* no known glyphs */ track_glyph_num = 0; /* Check for glyphs under player -- Cheat*/ if (feat == FEAT_GLYPH) { track_glyph_x[track_glyph_num] = c_x; track_glyph_y[track_glyph_num] = c_y; track_glyph_num++; } return; } /* failed glyph spell message */ if (prefix(msg, "The object resists the spell") || prefix(msg, "There is no clear floor")) { /* Forget the newly created-though-failed glyph */ track_glyph_x[track_glyph_num] = 0; track_glyph_y[track_glyph_num] = 0; track_glyph_num --; /* note it */ borg_note("# Removing the Glyph under me, placing with broken door."); /* mark that we are not on a clear spot. The borg ignores * broken doors and this will keep him from casting it again. */ ag->feat = FEAT_BROKEN; return; } /* Removed rubble. Important when out of lite */ if (prefix(msg, "You have removed the ")) { int x, y; /* remove rubbles from array */ for (y = c_y -1; y < c_y +1; y++) { for (x = c_x -1; x < c_x +1; x++) { /* replace all rubble with broken doors, the borg ignores * broken doors. This routine is only needed if the borg * is out of lite and searching in the dark. */ if (borg_skill[BI_CURLITE]) continue; if (ag->feat == FEAT_RUBBLE) ag->feat = FEAT_BROKEN; } } return; } if (prefix(msg, "The enchantment failed")) { /* reset our panel clock for this */ time_this_panel = 1; return; } /* need to kill monsters when WoD is used */ if (prefix(msg, "There is a searing blast of light!")) { /* Examine all the monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill = &borg_kills[i]; int x9 = kill->x; int y9 = kill->y; int ax, ay, d; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Distance components */ ax = (x9 > c_x) ? (x9 - c_x) : (c_x - x9); ay = (y9 > c_y) ? (y9 - c_y) : (c_y - y9); /* Distance */ d = MAX(ax, ay); /* Minimal distance */ if (d > 12) continue; /* Hack -- kill em */ borg_delete_kill(i); } /* Remove the region fear as well */ borg_fear_region[c_y/11][c_x/11] = 0; return; } /* Be aware and concerned of busted doors */ if (prefix(msg, "You hear a door burst open!")) { /* on level 1 and 2 be concerned. Could be Grip or Fang */ if (borg_skill[BI_CDEPTH] <= 3 && borg_skill[BI_CLEVEL] <= 5) scaryguy_on_level = TRUE; } /* Some spells move the borg from his grid */ if (prefix(msg, "commands you to return.") || prefix(msg, "teleports you away.") || prefix(msg, "gestures at your feet.")) { /* If in Lunal mode better shut that off, he is not on the stairs anymore */ if (borg_lunal_mode) borg_lunal_mode = FALSE; borg_note("# Disconnecting Lunal Mode due to monster spell."); } /* Sometimes the borg will overshoot the range limit of his shooter */ if (prefix(msg, "Target out of range.")) { /* Fire Anyway? [Y/N] */ borg_keypress('y'); } /* Feelings about the level */ for (i = 0; prefix_feeling[i]; i++) { /* "You feel..." (etc) */ if (prefix(msg, prefix_feeling[i])) { strnfmt(buf, 256, "FEELING:%d", i); borg_react(msg, buf); return; } } } /* * Parse a message, piece of a message, or set of messages. * * We must handle long messages which are "split" into multiple * pieces, and also multiple messages which may be "combined" * into a single set of messages. */ static void borg_parse(char *msg) { static char len = 0; static char buf[1024]; /* Note the long message */ if (borg_verbose && msg) borg_note(format("# Parsing msg <%s>", msg)); /* Flush messages */ if (len && (!msg || (msg[0] != ' '))) { int i, j; /* Split out punctuation */ for (j = i = 0; i < len-1; i++) { /* Check for punctuation */ if ((buf[i] == '.') || (buf[i] == '!') || (buf[i] == '?') || (buf[i] == '"')) { /* Require space */ if (buf[i+1] == ' ') { /* Terminate */ buf[i+1] = '\0'; /* Parse fragment */ borg_parse_aux(buf + j, (i + 1) - j); /* Restore */ buf[i+1] = ' '; /* Advance past spaces */ for (j = i + 2; buf[j] == ' '; j++) /* loop */; } } } /* Parse tail */ borg_parse_aux(buf + j, len - j); /* Forget */ len = 0; } /* No message */ if (!msg) { /* Start over */ len = 0; } /* Continued message */ else if (msg[0] == ' ') { /* Collect, verify, and grow */ len += strnfmt(buf+len, 1024-len, "%s", msg+1); } /* New message */ else { /* Collect, verify, and grow */ len = strnfmt(buf, 1024, "%s", msg); } } #ifndef BABLOS #if 0 static s16b stat_use[6]; static int adjust_stat_borg(int value, int amount, int borg_roll) { return (modify_stat_value(value, amount)); } static void get_stats_borg_aux(void) { int i, j; int bonus; int dice[18]; /* Roll and verify some stats */ while (TRUE) { /* Roll some dice */ for (j = i = 0; i < 18; i++) { /* Roll the dice */ dice[i] = randint1(3 + i % 3); /* Collect the maximum */ j += dice[i]; } /* Verify totals */ if ((j > 42) && (j < 54)) break; } /* Roll the stats */ for (i = 0; i < A_MAX; i++) { /* Extract 5 + 1d3 + 1d4 + 1d5 */ j = 5 + dice[3*i] + dice[3*i+1] + dice[3*i+2]; /* Save that value */ p_ptr->stat_max[i] = j; /* Obtain a "bonus" for "race" and "class" */ bonus = p_ptr->race->r_adj[i] + p_ptr->class->c_adj[i]; /* Variable stat maxes */ /* Start fully healed */ p_ptr->stat_cur[i] = p_ptr->stat_max[i]; /* Efficiency -- Apply the racial/class bonuses */ stat_use[i] = modify_stat_value(p_ptr->stat_max[i], bonus); } } /* * Roll for a new characters stats * * For efficiency, we include a chunk of "calc_bonuses()". */ static void get_stats_borg(void) { int i; int stat_limit[6]; s32b borg_round = 0L; /* load up min. stats */ stat_limit[0] = 14; /* Str */ stat_limit[1] = 0; /* Int */ stat_limit[2] = 0; /* Wis */ stat_limit[3] = 14; /* Dex */ stat_limit[4] = 14;/* Con */ stat_limit[5] = 0; /* Chr */ switch (p_ptr->class->cidx) { case CLASS_WARRIOR: stat_limit[0] = 17; stat_limit[3] = 16; break; case CLASS_MAGE: stat_limit[1] = 17; stat_limit[3] = 16; break; case CLASS_PRIEST: stat_limit[2] = 17; stat_limit[0] = 16; break; case CLASS_ROGUE: stat_limit[0] = 17; stat_limit[3] = 16; break; case CLASS_PALADIN: stat_limit[0] = 17; stat_limit[3] = 16; break; case CLASS_RANGER: stat_limit[0] = 17; stat_limit[3] = 16; break; } /* Minimal stats selected */ if (stat_limit[0] + stat_limit[1] + stat_limit[2] + stat_limit[3] + stat_limit[4] + stat_limit[5] >= 1) { /* Auto-roll */ while (1) { bool accept = TRUE; /* Get a new character */ get_stats_borg_aux(); /* Advance the round */ borg_round++; /* Hack -- Prevent overflow */ if (borg_round >= 750000L) { borg_note("# Minimal Stats too high."); break; } /* Check and count acceptable stats */ for (i = 0; i < A_MAX; i++) { /* This stat is okay (JesperN)*/ if (p_ptr->stat_max[i] >= stat_limit[i]) { accept = TRUE; } /* This stat is not okay */ else { accept = FALSE; break; } } /* Break if "happy" */ if (accept) break; } /* while */ /* Note the number of rolls to achieve stats */ borg_note(format("# Minimal stats rolled in %d turns.",borg_round)); } /* minimal stats */ else /* Otherwise just get a character */ { borg_note("# Rolling random stats."); get_stats_borg_aux(); } } /* * Roll for some info that the auto-roller ignores */ static void get_extra_borg(void) { int i, j, min_value, max_value; /* Level one */ p_ptr->max_lev = p_ptr->lev = 1; /* Experience factor */ p_ptr->expfact = p_ptr->race->r_exp + p_ptr->class->c_exp; /* Hitdice */ p_ptr->hitdie = p_ptr->race->r_mhp + p_ptr->class->c_mhp; /* Initial hitpoints */ p_ptr->mhp = p_ptr->hitdie; /* Minimum hitpoints at highest level */ min_value = (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 3) / 8; min_value += PY_MAX_LEVEL; /* Maximum hitpoints at highest level */ max_value = (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 5) / 8; max_value += PY_MAX_LEVEL; /* Pre-calculate level 1 hitdice */ p_ptr->player_hp[0] = p_ptr->hitdie; /* Roll out the hitpoints */ while (TRUE) { /* Roll the hitpoint values */ for (i = 1; i < PY_MAX_LEVEL; i++) { j = randint0(p_ptr->hitdie); p_ptr->player_hp[i] = p_ptr->player_hp[i-1] + j; } /* XXX Could also require acceptable "mid-level" hitpoints */ /* Require "valid" hitpoints at highest level */ if (p_ptr->player_hp[PY_MAX_LEVEL-1] < min_value) continue; if (p_ptr->player_hp[PY_MAX_LEVEL-1] > max_value) continue; /* Acceptable */ break; } } /* * Get the racial history, and social class, using the "history charts". */ static void get_history_borg(void) { int i, roll, social_class; struct history_chart *chart; struct history_entry *entry; char *res = NULL; /* Clear the previous history strings */ p_ptr->history[0] = '\0'; /* Initial social class */ social_class = randint1(4); /* Starting place */ chart = p_ptr->race->history; /* Process the history */ while (chart) { roll = randint1(100); for (entry = chart->entries; entry; entry = entry->next) if (roll <= entry->roll) break; assert(entry); res = string_append(res, entry->text); social_class += entry->bonus - 50; chart = entry->succ; } #if 0 while (chart) { /* Start over */ i = 0; /* Roll for nobility */ roll = randint1(100); /* Get the proper entry in the table */ while ((chart != h_info[i].chart) || (roll > h_info[i].roll)) i++; /* Get the textual history */ my_strcat(p_ptr->history, h_info[i].text, sizeof(p_ptr->history)); /* Add in the social class */ social_class += (int)(h_info[i].bonus) - 50; /* Enter the next chart */ chart = h_info[i].next; } #endif /* Verify social class */ if (social_class > 100) social_class = 100; else if (social_class < 1) social_class = 1; /* Save the social class */ p_ptr->sc = social_class; } /* * Computes character's age, height, and weight */ static void get_ahw_borg(void) { /* Calculate the age */ p_ptr->age = p_ptr->race->b_age + randint0(p_ptr->race->m_age); /* Calculate the height/weight for males */ if (p_ptr->psex == SEX_MALE) { p_ptr->ht = Rand_normal(p_ptr->race->m_b_ht, p_ptr->race->m_m_ht); p_ptr->wt = Rand_normal(p_ptr->race->m_b_wt, p_ptr->race->m_m_wt); } /* Calculate the height/weight for females */ else if (p_ptr->psex == SEX_FEMALE) { p_ptr->ht = Rand_normal(p_ptr->race->f_b_ht, p_ptr->race->f_m_ht); p_ptr->wt = Rand_normal(p_ptr->race->f_b_wt, p_ptr->race->f_m_wt); } } /* * Get the player's starting money */ static void get_money_borg(void) { int i; int gold = 0; /* Social Class determines starting gold */ gold = (p_ptr->sc * 6) + randint1(100) + 300; /* Process the stats */ for (i = 0; i < A_MAX; i++) { /* Mega-Hack -- reduce gold for high stats */ if (stat_use[i] >= 18+50) gold -= 300; else if (stat_use[i] >= 18+20) gold -= 200; else if (stat_use[i] > 18) gold -= 150; else gold -= (stat_use[i] - 8) * 10; } /* Minimum 100 gold */ if (gold < 100) gold = 100; /* Save the gold */ p_ptr->au = gold; } #endif /* * Name segments for random player names * Copied Cth by DvE * Copied from borgband by APW */ /* Dwarves */ static char *dwarf_syllable1[] = { "B", "D", "F", "G", "Gl", "H", "K", "L", "M", "N", "R", "S", "T", "Th", "V", }; static char *dwarf_syllable2[] = { "a", "e", "i", "o", "oi", "u", }; static char *dwarf_syllable3[] = { "bur", "fur", "gan", "gnus", "gnar", "li", "lin", "lir", "mli", "nar", "nus", "rin", "ran", "sin", "sil", "sur", }; /* Elves */ static char *elf_syllable1[] = { "Al", "An", "Bal", "Bel", "Cal", "Cel", "El", "Elr", "Elv", "Eow", "Ear", "F", "Fal", "Fel", "Fin", "G", "Gal", "Gel", "Gl", "Is", "Lan", "Leg", "Lom", "N", "Nal", "Nel", "S", "Sal", "Sel", "T", "Tal", "Tel", "Thr", "Tin", }; static char *elf_syllable2[] = { "a", "adrie", "ara", "e", "ebri", "ele", "ere", "i", "io", "ithra", "ilma", "il-Ga", "ili", "o", "orfi", "u", "y", }; static char *elf_syllable3[] = { "l", "las", "lad", "ldor", "ldur", "linde", "lith", "mir", "n", "nd", "ndel", "ndil", "ndir", "nduil", "ng", "mbor", "r", "rith", "ril", "riand", "rion", "s", "thien", "viel", "wen", "wyn", }; /* Gnomes */ static char *gnome_syllable1[] = { "Aar", "An", "Ar", "As", "C", "H", "Han", "Har", "Hel", "Iir", "J", "Jan", "Jar", "K", "L", "M", "Mar", "N", "Nik", "Os", "Ol", "P", "R", "S", "Sam", "San", "T", "Ter", "Tom", "Ul", "V", "W", "Y", }; static char *gnome_syllable2[] = { "a", "aa", "ai", "e", "ei", "i", "o", "uo", "u", "uu", }; static char *gnome_syllable3[] = { "ron", "re", "la", "ki", "kseli", "ksi", "ku", "ja", "ta", "na", "namari", "neli", "nika", "nikki", "nu", "nukka", "ka", "ko", "li", "kki", "rik", "po", "to", "pekka", "rjaana", "rjatta", "rjukka", "la", "lla", "lli", "mo", "nni", }; /* Hobbit */ static char *hobbit_syllable1[] = { "B", "Ber", "Br", "D", "Der", "Dr", "F", "Fr", "G", "H", "L", "Ler", "M", "Mer", "N", "P", "Pr", "Per", "R", "S", "T", "W", }; static char *hobbit_syllable2[] = { "a", "e", "i", "ia", "o", "oi", "u", }; static char *hobbit_syllable3[] = { "bo", "ck", "decan", "degar", "do", "doc", "go", "grin", "lba", "lbo", "lda", "ldo", "lla", "ll", "lo", "m", "mwise", "nac", "noc", "nwise", "p", "ppin", "pper", "tho", "to", }; /* Human */ static char *human_syllable1[] = { "Ab", "Ac", "Ad", "Af", "Agr", "Ast", "As", "Al", "Adw", "Adr", "Ar", "B", "Br", "C", "Cr", "Ch", "Cad", "D", "Dr", "Dw", "Ed", "Eth", "Et", "Er", "El", "Eow", "F", "Fr", "G", "Gr", "Gw", "Gal", "Gl", "H", "Ha", "Ib", "Jer", "K", "Ka", "Ked", "L", "Loth", "Lar", "Leg", "M", "Mir", "N", "Nyd", "Ol", "Oc", "On", "P", "Pr", "R", "Rh", "S", "Sev", "T", "Tr", "Th", "V", "Y", "Z", "W", "Wic", }; static char *human_syllable2[] = { "a", "ae", "au", "ao", "are", "ale", "ali", "ay", "ardo", "e", "ei", "ea", "eri", "era", "ela", "eli", "enda", "erra", "i", "ia", "ie", "ire", "ira", "ila", "ili", "ira", "igo", "o", "oa", "oi", "oe", "ore", "u", "y", }; static char *human_syllable3[] = { "a", "and", "b", "bwyn", "baen", "bard", "c", "ctred", "cred", "ch", "can", "d", "dan", "don", "der", "dric", "dfrid", "dus", "f", "g", "gord", "gan", "l", "li", "lgrin", "lin", "lith", "lath", "loth", "ld", "ldric", "ldan", "m", "mas", "mos", "mar", "mond", "n", "nydd", "nidd", "nnon", "nwan", "nyth", "nad", "nn", "nnor", "nd", "p", "r", "ron", "rd", "s", "sh", "seth", "sean", "t", "th", "tha", "tlan", "trem", "tram", "v", "vudd", "w", "wan", "win", "wyn", "wyr", "wyr", "wyth", }; /* Orc */ static char *orc_syllable1[] = { "B", "Er", "G", "Gr", "H", "P", "Pr", "R", "V", "Vr", "T", "Tr", "M", "Dr", }; static char *orc_syllable2[] = { "a", "i", "o", "oo", "u", "ui", }; static char *orc_syllable3[] = { "dash", "dish", "dush", "gar", "gor", "gdush", "lo", "gdish", "k", "lg", "nak", "rag", "rbag", "rg", "rk", "ng", "nk", "rt", "ol", "urk", "shnak", "mog", "mak", "rak", }; /* * Random Name Generator * based on a Javascript by Michael Hensley * "http://geocities.com/timessquare/castle/6274/" * Copied from Cth by DvE * Copied from borgband by APW */ static void create_random_name(int race, char *name) { /* Paranoia */ if (!name) return; /* Select the monster type */ switch (race) { /* Create the monster name */ case RACE_DWARF: strcpy(name, dwarf_syllable1[randint0(sizeof(dwarf_syllable1) / sizeof(char*))]); strcat(name, dwarf_syllable2[randint0(sizeof(dwarf_syllable2) / sizeof(char*))]); strcat(name, dwarf_syllable3[randint0(sizeof(dwarf_syllable3) / sizeof(char*))]); break; case RACE_ELF: case RACE_HALF_ELF: case RACE_HIGH_ELF: strcpy(name, elf_syllable1[randint0(sizeof(elf_syllable1) / sizeof(char*))]); strcat(name, elf_syllable2[randint0(sizeof(elf_syllable2) / sizeof(char*))]); strcat(name, elf_syllable3[randint0(sizeof(elf_syllable3) / sizeof(char*))]); break; case RACE_GNOME: strcpy(name, gnome_syllable1[randint0(sizeof(gnome_syllable1) / sizeof(char*))]); strcat(name, gnome_syllable2[randint0(sizeof(gnome_syllable2) / sizeof(char*))]); strcat(name, gnome_syllable3[randint0(sizeof(gnome_syllable3) / sizeof(char*))]); break; case RACE_HOBBIT: strcpy(name, hobbit_syllable1[randint0(sizeof(hobbit_syllable1) / sizeof(char*))]); strcat(name, hobbit_syllable2[randint0(sizeof(hobbit_syllable2) / sizeof(char*))]); strcat(name, hobbit_syllable3[randint0(sizeof(hobbit_syllable3) / sizeof(char*))]); break; case RACE_HUMAN: case RACE_DUNADAN: strcpy(name, human_syllable1[randint0(sizeof(human_syllable1) / sizeof(char*))]); strcat(name, human_syllable2[randint0(sizeof(human_syllable2) / sizeof(char*))]); strcat(name, human_syllable3[randint0(sizeof(human_syllable3) / sizeof(char*))]); break; case RACE_HALF_ORC: case RACE_HALF_TROLL: case RACE_KOBOLD: strcpy(name, orc_syllable1[randint0(sizeof(orc_syllable1) / sizeof(char*))]); strcat(name, orc_syllable2[randint0(sizeof(orc_syllable2) / sizeof(char*))]); strcat(name, orc_syllable3[randint0(sizeof(orc_syllable3) / sizeof(char*))]); break; /* Create an empty name */ default: name[0] = '\0'; break; } } /* * Init players with some belongings * * Having an item makes the player "aware" of its purpose. */ static void player_outfit_borg(struct player *p) { const struct start_item *si; object_type object_type_body; /* Give the player starting equipment */ for (si = p_ptr->class->start_items; si; si = si->next) { /* Get local object */ struct object *i_ptr = &object_type_body; /* Prepare the item */ object_prep(i_ptr, si->kind, 0, MINIMISE); i_ptr->number = (byte)rand_range(si->min, si->max); i_ptr->origin = ORIGIN_BIRTH; object_flavor_aware(i_ptr); object_notice_everything(i_ptr); inven_carry(p, i_ptr); si->kind->everseen = TRUE; /* Deduct the cost of the item from starting cash */ p->au -= object_value(i_ptr, i_ptr->number, FALSE); } /* Sanity check */ if (p->au < 0) p->au = 0; /* Now try wielding everything */ wield_all(p); } /* Allow the borg to play continously. Reset all values, */ void resurrect_borg(void) { int i,j; /* Cheat death */ p_ptr->is_dead = FALSE; borg_skill[BI_MAXDEPTH] = 0; borg_skill[BI_MAXCLEVEL] = 1; /* Flush message buffer */ borg_parse(NULL); /* flush the commands */ borg_flush(); /* remove the spell counters */ if (p_ptr->class->spell_book) { for (i = 0; i < 9; i++ ) { for (j = 0; j < 8; j++) { /* get the magics */ borg_magic *as = &borg_magics[i][j]; /* reset the counter */ as->times = 0; } } } /*** Wipe the player ***/ player_init(p_ptr); borg_skill[BI_ISCUT] = borg_skill[BI_ISSTUN] = borg_skill[BI_ISHEAVYSTUN] = borg_skill[BI_ISIMAGE] = borg_skill[BI_ISSTUDY] = FALSE; /* reset our panel clock */ time_this_panel =1; /* reset our vault/unique check */ vault_on_level = FALSE; unique_on_level = 0; scaryguy_on_level = FALSE; /* reset our breeder flag */ breeder_level = FALSE; /* Assume not leaving the level */ goal_leaving = FALSE; /* Assume not fleeing the level */ goal_fleeing = FALSE; /* Assume not fleeing the level */ borg_fleeing_town = FALSE; /* Assume not ignoring monsters */ goal_ignoring = FALSE; flavor_init(); /** Roll up a new character **/ /* Full Random */ if (borg_respawn_class == -1 && borg_respawn_race == -1) { player_generate(p_ptr, NULL, NULL, NULL); } /* Selected Race, random Class */ if (borg_respawn_race != -1 && borg_respawn_class == -1) { player_generate(p_ptr, NULL, player_id2race(borg_respawn_race), NULL); } /* Random Race, Selected Class */ if (borg_respawn_race == -1 && borg_respawn_class != -1) { player_generate(p_ptr, NULL, NULL, player_id2class(borg_respawn_class)); } /* The dungeon is not ready */ character_dungeon = FALSE; /* Start in town */ p_ptr->depth = 0; /* Hack -- seed for flavors */ seed_flavor = randint0(0x10000000); /* Hack -- seed for town layout */ seed_town = randint0(0x10000000); /* Roll up a new character. Quickstart is allowed if ht_birth is set */ player_birth(TRUE); /* Seed for random artifacts */ if (!seed_randart || !OPT(birth_keep_randarts)) seed_randart = randint0(0x10000000); /* Randomize the artifacts if required */ if (OPT(birth_randarts)) do_randart(seed_randart, TRUE); #if 0 int stats[A_MAX]; /* Borrow commands from birth.c */ get_stats(stats); get_bonuses(); get_ahw(p_ptr); p_ptr->history = get_history(p_ptr->race->history, &p_ptr->sc); p_ptr->sc_birth = p_ptr->sc; roll_hp(); get_money(); store_reset(); #endif #if 0 /* Some Extra things */ get_stats_borg(); get_extra_borg(); get_ahw_borg(); get_history_borg(); get_money_borg(); #endif /* Get a random name */ create_random_name(p_ptr->race->ridx,op_ptr->full_name); /* outfit the player */ C_MAKE(p_ptr->inventory, ALL_INVEN_TOTAL, struct object); (void)player_outfit_borg(p_ptr); /* Hack -- flush it */ Term_fresh(); /*** Hack -- Extract race ***/ /* Insert the player Race--cheat */ borg_race = p_ptr->race->ridx; /* Cheat the class */ borg_class = p_ptr->class->cidx; /*** Hack -- react to race and class ***/ /* Notice the new race and class */ prepare_race_class_info(); /* need to check all stats */ my_need_stat_check[0] = TRUE; my_need_stat_check[1] = TRUE; my_need_stat_check[2] = TRUE; my_need_stat_check[3] = TRUE; my_need_stat_check[4] = TRUE; my_need_stat_check[5] = TRUE; /* Allowable Cheat -- Obtain "recall" flag */ goal_recalling = p_ptr->word_recall * 1000; /* Allowable Cheat -- Obtain "prot_from_evil" flag */ borg_prot_from_evil = (p_ptr->timed[TMD_PROTEVIL] ? TRUE : FALSE); /* Allowable Cheat -- Obtain "speed" flag */ borg_speed = (p_ptr->timed[TMD_FAST] ? TRUE : FALSE); /* Allowable Cheat -- Obtain "resist" flags */ borg_skill[BI_TRACID] = (p_ptr->timed[TMD_OPP_ACID] ? TRUE : FALSE); borg_skill[BI_TRELEC] = (p_ptr->timed[TMD_OPP_ELEC] ? TRUE : FALSE); borg_skill[BI_TRFIRE] = (p_ptr->timed[TMD_OPP_FIRE] ? TRUE : FALSE); borg_skill[BI_TRCOLD] = (p_ptr->timed[TMD_OPP_COLD] ? TRUE : FALSE); borg_skill[BI_TRPOIS] = (p_ptr->timed[TMD_OPP_POIS] ? TRUE : FALSE); borg_bless = (p_ptr->timed[TMD_BLESSED] ? TRUE : FALSE); borg_shield = (p_ptr->timed[TMD_SHIELD] ? TRUE : FALSE); borg_hero = (p_ptr->timed[TMD_HERO] ? TRUE : FALSE); borg_berserk = (p_ptr->timed[TMD_SHERO] ? TRUE : FALSE); if (p_ptr->timed[TMD_SINVIS]) borg_see_inv = 10000; /* Message */ borg_note("# Respawning"); borg_respawning = 5; /* fully healed and rested */ p_ptr->chp = p_ptr->mhp; p_ptr->csp = p_ptr->msp; /* Mark savefile as borg cheater */ if (!(p_ptr->noscore & 0x0010)) p_ptr->noscore |= 0x0010; /* Done. Play on */ } #endif /* bablos */ /* * Mega-Hack -- special "inkey_hack" hook. XXX XXX XXX * * A special function hook (see "util.c") which allows the Borg to take * control of the "inkey()" function, and substitute in fake keypresses. */ extern struct keypress (*inkey_hack)(int flush_first); /* * This function lets the Borg "steal" control from the user. * * The "util.c" file provides a special "inkey_hack" hook which we use * to steal control of the keyboard, using the special function below. * * Since this function bypasses the code in "inkey()" which "refreshes" * the screen whenever the game has to wait for a keypress, the screen * will only get refreshed when (1) an option such as "fresh_before" * induces regular screen refreshing or (2) various explicit calls to * "Term_fresh" are made, such as in the "project()" function. This * has the interesting side effect that the screen is never refreshed * while the Borg is browsing stores, checking his inventory/equipment, * browsing spell books, checking the current panel, or examining an * object, which reduces the "screen flicker" considerably. :-) * * The only way that the Borg can be stopped once it is started, unless * it dies or encounters an error, is to press any key. This function * checks for real user input on a regular basic, and if any is found, * it is flushed, and after completing any actions in progress, this * function hook is removed, and control is returned to the user. * * We handle "broken" messages, in which long messages are "broken" into * pieces, and all but the first message are "indented" by one space, by * collecting all the pieces into a complete message and then parsing the * message once it is known to be complete. * * This function hook automatically removes itself when it realizes that * it should no longer be active. Note that this may take place after * the game has asked for the next keypress, but the various "keypress" * routines should be able to handle this. */ static struct keypress borg_inkey_hack(int flush_first) { keycode_t borg_ch; struct keypress key = {EVT_KBRD, 0, 0}; ui_event ch_evt; int y = 0; int x = ((Term->wid /* - (COL_MAP)*/ - 1) / (tile_width)); byte t_a; char buf[1024]; bool borg_prompt; /* ajg For now we can just use this locally. in the 283 borg he uses this to optimize knowing if we are waiting at a prompt for info */ /* Locate the cursor */ (void)Term_locate(&x, &y); /* Refresh the screen */ Term_fresh(); /* Deactivate */ if (!borg_active) { /* Message */ borg_note("# Removing keypress hook"); /* Remove hook */ inkey_hack = NULL; /* Flush keys */ borg_flush(); /* Flush */ flush(); /* Done */ key.type = EVT_NONE; return key; } /* Mega-Hack -- flush keys */ if (flush_first) { /* Only flush if needed */ if (borg_inkey(FALSE) != 0) { /* Message */ borg_note("# Flushing keypress buffer"); /* Flush keys */ borg_flush(); /* Cycle a few times to catch up if needed */ if (time_this_panel > 250) { borg_respawning = 3; } } } /* Assume no prompt/message is available */ borg_prompt = FALSE; /* Mega-Hack -- check for possible prompts/messages */ /* If the first four characters on the message line all */ /* have the same attribute (or are all spaces), and they */ /* are not all spaces (ascii value 0x20)... */ if ((0 == borg_what_text(0, 0, 4, &t_a, buf)) && (t_a != TERM_DARK) && (*((u32b*)(buf)) != 0x20202020)) { /* Assume a prompt/message is available */ borg_prompt = TRUE; } if (borg_prompt && streq(buf, "Type")) { borg_prompt = FALSE; } /* Mega-Hack -- Catch "Die? [y/n]" messages */ /* If there is text on the first line... */ /* And the game does not want a command... */ /* And the cursor is on the top line... */ /* And the text acquired above is "Die?" */ if (borg_prompt && !inkey_flag && (y == 0) && (x >= 4) && streq(buf, "Die?") && borg_cheat_death) { /* Flush messages */ borg_parse(NULL); /* flush the buffer */ borg_flush(); /* Take note */ borg_note("# Cheating death..."); #ifndef BABLOS /* Dump the Character Map*/ if (borg_skill[BI_CLEVEL] >= borg_dump_level || strstr(p_ptr->died_from, "starvation")) borg_write_map(FALSE); /* Log the death */ borg_log_death(); borg_log_death_data(); #if 0 /* Note the score */ borg_enter_score(); #endif /* Reset the player game data then resurrect a new player */ resurrect_borg(); #endif /* BABLOS */ /* Cheat death */ key.code = 'n'; return key; } /* with 292, there is a flush() introduced as it asks for confirmation. * This flush is messing up the borg. This will allow the borg to * work around the flush * Attempt to catch "Attempt it anyway? [y/n]" */ if (borg_prompt && !inkey_flag && (y == 0) && (x >= 4) && streq(buf, "Atte")) { /* Return the confirmation */ borg_note("# Confirming use of Spell/Prayer."); key.code = 'y'; return key; } /* with 292, there is a flush() introduced as it asks for confirmation. * This flush is messing up the borg. This will allow the borg to * work around the flush * This is used only with emergency use of spells like Magic Missile * Attempt to catch "Direction (5 old target" */ if (borg_prompt && !inkey_flag && borg_confirm_target && (y == 0) && (x >= 4) && streq(buf, "Dire")) { /* reset the flag */ borg_confirm_target = FALSE; /* Return 5 for old target */ key.code = '5'; return key; } /* Wearing two rings. Place this on the left hand */ if (borg_prompt && !inkey_flag && (y == 0) && (x >= 12) && (0 == borg_what_text(0, y, 12, &t_a, buf)) && (streq(buf, "(Equip: c-d,"))) { /* Left hand */ key.code = 'c'; return key; } /* Mega-Hack -- Handle death */ if (p_ptr->is_dead) { #ifndef BABLOS /* Print the map */ if (borg_skill[BI_CLEVEL] >= borg_dump_level || strstr(p_ptr->died_from, "starvation")) borg_write_map(FALSE); /* Log death */ borg_log_death(); borg_log_death_data(); #if 0 /* Note the score */ borg_enter_score(); #endif #endif /* bablos */ /* flush the buffer */ borg_flush(); if (borg_cheat_death) { /* Reset death flag */ p_ptr->is_dead = FALSE; #ifndef BABLOS /* Reset the player game data then resurrect a new player */ resurrect_borg(); #endif /* bablos */ } else { /* Oops */ borg_oops("player died"); /* Useless keypress */ key.code = KTRL('C'); return key; } } /* Mega-Hack -- Catch "-more-" messages */ /* If there is text on the first line... */ /* And the game does not want a command... */ /* And the cursor is on the top line... */ /* And there is text before the cursor... */ /* And that text is "-more-" */ if (borg_prompt && !inkey_flag && (y == 0) && (x >= 7) && (0 == borg_what_text(x-7, y, 7, &t_a, buf)) && (streq(buf, " -more-"))) { /* Get the message */ if (0 == borg_what_text(0, 0, x-7, &t_a, buf)) { /* Parse it */ borg_parse(buf); } /* Clear the message */ key.code = ' '; return key; } /* Mega-Hack -- catch normal messages */ /* If there is text on the first line... */ /* And the game wants a command */ if (borg_prompt && inkey_flag) { /* Get the message(s) */ if (0 == borg_what_text(0, 0, ((Term->wid - 1) / (tile_width)), &t_a, buf)) { int k = strlen(buf); /* Strip trailing spaces */ while ((k > 0) && (buf[k-1] == ' ')) k--; /* Terminate */ buf[k] = '\0'; /* Parse it */ borg_parse(buf); } /* Clear the message */ key.code = ' '; return key; } /* Flush messages */ borg_parse(NULL); borg_dont_react = FALSE; /* Check for key */ borg_ch = borg_inkey(TRUE); /* Use the key */ if (borg_ch) { key.code = borg_ch; return key; } /* Check for user abort */ (void)Term_inkey(&ch_evt, FALSE, TRUE); /* Hack to keep him active in town. */ if (borg_skill[BI_CDEPTH] >= 1) borg_in_shop = FALSE; if (!borg_in_shop && (ch_evt.type & EVT_KBRD) && ch_evt.key.code > 0 && ch_evt.key.code != 10) { /* Oops */ borg_note(format("# User key press <%d><%c>",ch_evt.key.code ,ch_evt.key.code)); borg_note(format("# Key type was <%d><%c>",ch_evt.type,ch_evt.type)); borg_oops("user abort"); /* Hack -- Escape */ key.code = ESCAPE; return key; } /* for some reason, selling and buying in the store sets the event handler to Select. */ if (ch_evt.type & EVT_SELECT) ch_evt.type = EVT_KBRD; if (ch_evt.type & EVT_MOVE) ch_evt.type = EVT_KBRD; /* Save the system random info */ borg_rand_quick = Rand_quick; borg_rand_value = Rand_value; /* Use the local random info */ Rand_quick = TRUE; Rand_value = borg_rand_local; /* Don't interrupt our own resting or a repeating command */ if (p_ptr->resting || cmd_get_nrepeats() > 0) { key.type = EVT_NONE; return key; } /* Think */ while (!borg_think()) /* loop */; /* DVE- Update the status screen */ borg_status(); /* Save the local random info */ borg_rand_local = Rand_value; /* Restore the system random info */ Rand_quick = borg_rand_quick; Rand_value = borg_rand_value; /* Hack -- allow stepping to induce a clean cancel */ if (borg_step && (!--borg_step)) borg_cancel = TRUE; /* Check for key */ borg_ch = borg_inkey(TRUE); /* Use the key */ if (borg_ch) { key.code = borg_ch; return key; } /* Oops */ borg_oops("normal abort"); /* Hack -- Escape */ key.code = ESCAPE; return key; } /* * Output a long int in binary format. */ static void borg_prt_binary(u32b flags, int row, int col) { int i; u32b bitmask; /* Scan the flags */ for (i = bitmask = 1; i <= 32; i++, bitmask *= 2) { /* Dump set bits */ if (flags & bitmask) { Term_putch(col++, row, TERM_BLUE, '*'); } /* Dump unset bits */ else { Term_putch(col++, row, TERM_WHITE, '-'); } } } /* this will display the values which the borg believes an * item has. Select the item by inven # prior to hitting * the ^zo. */ static void borg_display_item(object_type *item2, int n) { int j = 0; bitflag f[OF_SIZE]; borg_item *item; item = &borg_items[n]; /* Extract the flags */ object_flags(item2, f); /* Clear screen */ Term_clear(); /* Describe fully */ prt(item->desc, 2, j); prt(format("kind = %-5d level = %-4d tval = %-5d sval = %-5d", item->kind, item->level, item->tval, item->sval), 4, j); prt(format("number = %-3d wgt = %-6d ac = %-5d damage = %dd%d", item->iqty, item->weight, item->ac, item->dd, item->ds), 5, j); prt(format("pval = %-5d toac = %-5d tohit = %-4d todam = %-4d", item->pval, item->to_a, item->to_h, item->to_d), 6, j); prt(format("name1 = %-4d name2 = %-4d value = %d cursed = %ld", item->name1, item->name2, (long)item->value, item->cursed), 7, j); prt(format("*id*need = %d ident = %d fully_id = %d timeout = %-d", item->needs_I, item->ident, item->fully_identified, item->timeout), 8, j); /* maybe print the inscription */ prt(format("Inscription: %s, activation: %d, chance: %d",item->note, item->activation, borg_skill[BI_DEV] - item->level),9,j); prt("+------------FLAGS1------------+", 10, j); prt("AFFECT..........SLAY.......BRAND", 11, j); prt(" ae xxxpaefc", 12, j); prt("siwdcc ssidsasmnvudotgddduoclio", 13, j); prt("tnieoh trnipthgiinmrrnrrmniierl", 14, j); prt("rtsxna..lcfgdkttmldncltggndsdced", 15, j); if (item->ident) borg_prt_binary(f[0], 16, j); prt("+------------FLAGS2------------+", 17, j); prt("SUST........IMM.RESIST.........", 18, j); prt(" afecaefcpfldbc s n ", 19, j); prt("siwdcc cilocliooeialoshnecd", 20, j); prt("tnieoh irelierliatrnnnrethi", 21, j); prt("rtsxna......decddcedsrekdfddxhss", 22, j); if (item->fully_identified) borg_prt_binary(f[1], 23, j); prt("+------------FLAGS3------------+", 10, j+32); prt("s ts h tadiiii aiehs hp", 11, j+32); prt("lf eefo egrgggg bcnaih vr", 12, j+32); prt("we lerln ilgannnn ltssdo ym", 13, j+32); prt("da reiedo merirrrr eityew ccc", 14, j+32); prt("itlepnelf ppanaefc svaktm uuu", 15, j+32); prt("ghigavaiu aoveclio saanyo rrr", 16, j+32); prt("seteticfe craxierl etropd sss", 17, j+32); prt("trenhstel tttpdced detwes eee", 18, j+32); if (item->fully_identified) borg_prt_binary(f[2], 19, j+32); } static int borg_getval(char ** string, char * val) { char string2[4]; int retval; if (!prefix(*string, val)) { return -1000; } (*string) += strlen(val); memmove(string2, *string, 3); string2[3] = 0; sscanf(string2, "%d", &retval); *string+=3; return retval; } static bool borg_load_formula(char * string) { int formula_num; int iformula = 0; int x = 0; int value= 0; char string2[4]; memmove(string2, string, 3); string2[3] = 0; sscanf(string2, "%d", &formula_num); string+=4; if (formula[formula_num]) { borg_note(format("formula defined twice %03d", formula_num)); return FALSE; } C_MAKE(formula[formula_num], MAX_FORMULA_ELEMENTS, int); while (string && *string) { switch (*string) { case ' ': string++; continue; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': sscanf(string, "%d", &value); if (iformula+2 > MAX_FORMULA_ELEMENTS) { borg_note(format("too many elements in formula %03d", formula_num)); formula[formula_num][0] = BFO_NUMBER; formula[formula_num][1] = 0; return FALSE; } formula[formula_num][iformula++] = BFO_NUMBER; formula[formula_num][iformula++] = value; break; case '_': if (iformula+2 > MAX_FORMULA_ELEMENTS) { borg_note(format("too many elements in formula %03d", formula_num)); formula[formula_num][0] = BFO_NUMBER; formula[formula_num][1] = 0; return FALSE; } formula[formula_num][iformula++] = BFO_VARIABLE; if (-1000 != (value = borg_getval(&string, "_ITEM"))) { formula[formula_num][iformula++] = value; break; } if (-1000 != (value = borg_getval(&string, "_WITEM"))) { formula[formula_num][iformula++] = value + z_info->k_max; break; } if (-1000 != (value = borg_getval(&string, "_ARTIFACT"))) { formula[formula_num][iformula++] = value + z_info->k_max + z_info->k_max; break; } for (x = 0; x < BI_MAX; x++) { if (prefix(string, prefix_pref[x])) { value = z_info->k_max + z_info->k_max + z_info->a_max + x; formula[formula_num][iformula++] = value; break; } } if (x == BI_MAX) { formula[formula_num][0] = BFO_NUMBER; formula[formula_num][1] = 0; borg_note(format("bad item in formula%03d %s", formula_num, string)); return FALSE; } break; default: if (iformula+1 > MAX_FORMULA_ELEMENTS) { borg_note(format("too many elements in formula %03d", formula_num)); formula[formula_num][0] = BFO_NUMBER; formula[formula_num][1] = 0; return FALSE; } if (*string == '>') { if (*(string+1) == '=') { formula[formula_num][iformula++] = BFO_GTE; break; } formula[formula_num][iformula++] = BFO_GT; break; } if (*string == '<') { if (*(string+1) == '=') { formula[formula_num][iformula++] = BFO_LTE; break; } formula[formula_num][iformula++] = BFO_LT; break; } if (*string == '!') { if (*(string+1) == '=') formula[formula_num][iformula++] = BFO_NEQ; else formula[formula_num][iformula++] = BFO_NOT; break; } if (*string == '=') { formula[formula_num][iformula++] = BFO_EQ; break; } if (*string == '&') { formula[formula_num][iformula++] = BFO_AND; break; } if (*string == '-') { /* - followed by space is a minus. */ if (*(string+1) == ' ') { formula[formula_num][iformula++] = BFO_MINUS; break; } if (iformula+1 > MAX_FORMULA_ELEMENTS) { borg_note(format("too many elements in formula %03d", formula_num)); formula[formula_num][0] = BFO_NUMBER; formula[formula_num][1] = 0; return FALSE; } /* - followed by anything else is a negative number */ sscanf(string, "%d", &value); formula[formula_num][iformula++] = BFO_NUMBER; formula[formula_num][iformula++] = value; break; } if (*string == '+') { formula[formula_num][iformula++] = BFO_PLUS; break; } if (*string == '/') { formula[formula_num][iformula++] = BFO_DIVIDE; break; } if (*string == '*') { formula[formula_num][iformula++] = BFO_MULT; break; } if (*string == '|') { formula[formula_num][iformula++] = BFO_OR; break; } borg_note(format("bad item in formula %03d %s", formula_num, string)); formula[formula_num][0] = BFO_NUMBER; formula[formula_num][1] = 0; return FALSE; } string = strchr(string, ' '); } if (!borg_check_formula(formula[formula_num])) { borg_note(format("bad formula %03d", formula_num)); formula[formula_num][0] = BFO_NUMBER; formula[formula_num][1] = 0; return FALSE; } return TRUE; } static bool add_power_item(int class_num, int depth_num, int cnd_num, int range_to, int range_from, bool each, int item_num, int power) { if ((class_num > MAX_CLASSES && class_num != 999 ) || depth_num >= MAX_DEPTH || item_num >= (z_info->k_max + z_info->k_max + z_info->a_max + BI_MAX) || range_to < range_from) { borg_note("Malformed item power in borg.txt: values out of range"); return FALSE; } /* The class 999 is for all classes */ if (class_num == 999) { for (class_num = 0; class_num < MAX_CLASSES; class_num ++) { borg_power_item[class_num][n_pwr[class_num]].depth = depth_num; borg_power_item[class_num][n_pwr[class_num]].cnd = cnd_num; borg_power_item[class_num][n_pwr[class_num]].item = item_num; borg_power_item[class_num][n_pwr[class_num]].power = power; borg_power_item[class_num][n_pwr[class_num]].from = range_from; borg_power_item[class_num][n_pwr[class_num]].to = range_to; borg_power_item[class_num][n_pwr[class_num]].each = each; n_pwr[class_num]++; } } else { borg_power_item[class_num][n_pwr[class_num]].depth = depth_num; borg_power_item[class_num][n_pwr[class_num]].cnd = cnd_num; borg_power_item[class_num][n_pwr[class_num]].item = item_num; borg_power_item[class_num][n_pwr[class_num]].power = power; borg_power_item[class_num][n_pwr[class_num]].from = range_from; borg_power_item[class_num][n_pwr[class_num]].to = range_to; borg_power_item[class_num][n_pwr[class_num]].each = each; n_pwr[class_num]++; } return TRUE; } static bool borg_load_power(char * string) { int class_num= -1; int depth_num= -1; int cnd_num = -1; int range_to= -1; int range_from= -1; bool each = FALSE; int item_num= -1; int power= -1; int x; if (-1000 == (class_num = borg_getval(&string, "_CLASS"))) { borg_note("Malformed item power in borg.txt: missing _CLASS"); return FALSE; } if (-1000 == (depth_num = borg_getval(&string, "_DEPTH"))) { borg_note("Malformed item power in borg.txt: missing _DEPTH"); return FALSE; } if (-1000 == (cnd_num = borg_getval(&string, "_CND"))) { /* condition is optional */ cnd_num = -1; } if (-1000 == (range_from = borg_getval(&string, "_RANGE"))) { borg_note("Malformed item power in borg.txt: missing _RANGE"); return FALSE; } if (-1000 == (range_to = borg_getval(&string, "TO"))) { borg_note("Malformed item power in borg.txt: messed up _RANGE"); return FALSE; } if (-1000 != (item_num = borg_getval(&string, "_FORMULA"))) { if (range_to != 999 || range_from != 0) { borg_note("Malformed item power in borg.txt: range must be 0-999 formulas"); return FALSE; } return add_power_item(class_num, depth_num, cnd_num, range_to, range_from, each, -1, item_num); } if (-1000 != (item_num = borg_getval(&string, "_ITEM"))) { string++; sscanf(string, "%d", &power); if (strstr(string, "EACH")) each = TRUE; return add_power_item(class_num, depth_num, cnd_num, range_to, range_from, each, item_num, power); } if (-1000 != (item_num = borg_getval(&string, "_WITEM"))) { string++; sscanf(string, "%d", &power); if (strstr(string, "EACH")) each = TRUE; return add_power_item(class_num, depth_num, cnd_num, range_to, range_from, each, z_info->k_max + item_num, power); } if (-1000 != (item_num = borg_getval(&string, "_ARTIFACT"))) { string++; sscanf(string, "%d", &power); if (strstr(string, "EACH")) each = TRUE; item_num += z_info->k_max + z_info->k_max; return add_power_item(class_num, depth_num, cnd_num, range_to, range_from, each, item_num, power); } for (x = 0; x < BI_MAX; x++) { if (prefix(string, prefix_pref[x])) { string += strlen(prefix_pref[x]); item_num = z_info->k_max + z_info->k_max + z_info->a_max + x; string++; sscanf(string, "%d", &power); if (strstr(string, "EACH")) each = TRUE; return add_power_item(class_num, depth_num, cnd_num, range_to, range_from, each, item_num, power); } } borg_note("Malformed item power in borg.txt"); return FALSE; } static bool add_required_item(int class_num, int depth_num, int item_num, int number_items) { if ((class_num >MAX_CLASSES && class_num != 999 ) || depth_num >= MAX_DEPTH || item_num >= (z_info->k_max + z_info->k_max + z_info->a_max + BI_MAX)) { borg_note("Malformed item requirment in borg.txt: value out of range"); return FALSE; } /* The class 999 is for all classes */ if (class_num == 999) { for (class_num = 0; class_num < MAX_CLASSES; class_num ++) { borg_required_item[class_num][n_req[class_num]].depth = depth_num; borg_required_item[class_num][n_req[class_num]].item = item_num; borg_required_item[class_num][n_req[class_num]].number = number_items; n_req[class_num]++; } } else { borg_required_item[class_num][n_req[class_num]].depth = depth_num; borg_required_item[class_num][n_req[class_num]].item = item_num; borg_required_item[class_num][n_req[class_num]].number = number_items; n_req[class_num]++; } return TRUE; } static bool borg_load_requirement(char * string) { int class_num=-1; int depth_num=-1; int item_num=-1; int number_items=-1; int x=-1; if (-1000 == (class_num = borg_getval(&string, "_CLASS"))) { borg_note("Malformed item requirment in borg.txt"); return FALSE; } if (-1000 == (depth_num = borg_getval(&string, "_DEPTH"))) { borg_note("Malformed item requirment in borg.txt"); return FALSE; } if (-1000 != (item_num = borg_getval(&string, "_FORMULA"))) { return add_required_item(class_num, depth_num, -1, item_num); } if (-1000 != (item_num = borg_getval(&string, "_ITEM"))) { string++; sscanf(string, "%d", &number_items); return add_required_item(class_num, depth_num, item_num, number_items); } if (-1000 != (item_num = borg_getval(&string, "_WITEM"))) { string++; sscanf(string, "%d", &number_items); return add_required_item(class_num, depth_num, z_info->k_max + item_num, number_items); } if (-1000 != (item_num = borg_getval(&string, "_ARTIFACT"))) { string++; sscanf(string, "%d", &number_items); return add_required_item(class_num, depth_num, z_info->k_max + z_info->k_max +item_num, number_items); } for (x = 0; x < BI_MAX; x++) { if (prefix(string, prefix_pref[x])) { string += strlen(prefix_pref[x]); item_num = z_info->k_max + z_info->k_max + z_info->a_max + x; string++; sscanf(string, "%d", &number_items); return add_required_item(class_num, depth_num, item_num, number_items); } } borg_note("Malformed item requirment in borg.txt"); return FALSE; } /* just used to do a quick sort on the required items array */ int borg_item_cmp(const void * item1, const void * item2) { if (((req_item*)item1)->depth != ((req_item*)item2)->depth) return ((req_item*)item1)->depth - ((req_item*)item2)->depth; if (((req_item*)item1)->item != ((req_item*)item2)->item) return ((req_item*)item1)->item - ((req_item*)item2)->item; return ((req_item*)item1)->number - ((req_item*)item2)->number; } /* * Initialize borg.txt */ void init_borg_txt_file(void) { ang_file *fp; char buf[1024]; int i; /* Array of borg variables is stored as */ /* 0 to k_max = items in inventory */ /* k_max to 2*k_max = items being worn */ /* 2*k_max to a_max = artifacts worn */ /* 2*k_max + a_max to end of array = Other skills/possessions */ size_obj = z_info->k_max + z_info->k_max + z_info->a_max + BI_MAX; /* note: C_MAKE automaticly 0 inits things */ for (i = 0; i < MAX_CLASSES; i++) { C_MAKE(borg_required_item[i], 400, req_item); /* externalize the 400 later */ n_req[i] = 0; C_MAKE(borg_power_item[i], 400, power_item); /* externalize the 400 later */ n_pwr[i] = 0; } for (i = 0; i < 999; i++) { formula[i] = 0; } C_MAKE(borg_has, size_obj, int); /* make some shortcut pointers into the array */ borg_has_on = borg_has + z_info->k_max; borg_artifact = borg_has_on + z_info->k_max; borg_skill = borg_artifact + z_info->a_max; path_build(buf, 1024, ANGBAND_DIR_USER, "borg.txt"); /* Open the file */ fp = file_open(buf, MODE_READ, -1); /*fp = fopen(buf, "r"); */ /* setup default values, in case any are missing */ borg_worships_damage = FALSE; borg_worships_speed = FALSE; borg_worships_hp= FALSE; borg_worships_mana = FALSE; borg_worships_ac = FALSE; borg_worships_gold = FALSE; borg_plays_risky = FALSE; borg_scums_uniques = TRUE; borg_kills_uniques = FALSE; borg_uses_swaps = TRUE; borg_slow_optimizehome = FALSE; borg_stop_dlevel = 128; borg_stop_clevel = 55; borg_no_deeper = 127; borg_stop_king = TRUE; borg_uses_calcs = FALSE; borg_respawn_winners = FALSE; borg_respawn_class = -1; borg_respawn_race = -1; borg_chest_fail_tolerance = 7; borg_delay_factor = 1; borg_money_scum_amount = 0; borg_self_scum = TRUE; borg_lunal_mode = FALSE; borg_self_lunal = TRUE; borg_verbose = FALSE; borg_munchkin_start = FALSE; borg_munchkin_level = 12; borg_munchkin_depth = 16; borg_enchant_limit = 10; /* No file, use defaults*/ if (!fp) { /* Complain */ msg("*****WARNING***** You do not have a proper BORG.TXT file!"); msg("Make sure BORG.TXT is located in the \\user\\ subdirectory!"); msg("Which is: %s", buf); message_flush(); return; } /* Parse the file */ /* AJG needed to make this wider so I could read long formulas */ while (file_getl(fp, buf, sizeof(buf)-1)) { /* Skip comments and blank lines */ if (!buf[0] || (buf[0] == '#')) continue; /* Chop the buffer */ buf[sizeof(buf)-1] = '\0'; /* Extract the true/false */ if (prefix(buf, "borg_worships_damage =")) { if (buf[strlen("borg_worships_damage =")+1] == 'T' || buf[strlen("borg_worships_damage =")+1] == '1' || buf[strlen("borg_worships_damage =")+1] == 't') borg_worships_damage=TRUE; else borg_worships_damage = FALSE; continue; } if (prefix(buf, "borg_worships_speed =")) { if (buf[strlen("borg_worships_speed =")+1] == 'T' || buf[strlen("borg_worships_speed =")+1] == '1' || buf[strlen("borg_worships_speed =")+1] == 't') borg_worships_speed=TRUE; else borg_worships_speed = FALSE; continue; } if (prefix(buf, "borg_worships_hp =")) { if (buf[strlen("borg_worships_hp =")+1] == 'T' || buf[strlen("borg_worships_hp =")+1] == '1' || buf[strlen("borg_worships_hp =")+1] == 't') borg_worships_hp=TRUE; else borg_worships_hp= FALSE; continue; } if (prefix(buf, "borg_worships_mana =")) { if (buf[strlen("borg_worships_mana =")+1] == 'T' || buf[strlen("borg_worships_mana =")+1] == '1' || buf[strlen("borg_worships_mana =")+1] == 't') borg_worships_mana=TRUE; else borg_worships_mana = FALSE; continue; } if (prefix(buf, "borg_worships_ac =")) { if (buf[strlen("borg_worships_ac =")+1] == 'T' || buf[strlen("borg_worships_ac =")+1] == '1' || buf[strlen("borg_worships_ac =")+1] == 't') borg_worships_ac=TRUE; else borg_worships_ac= FALSE; continue; } if (prefix(buf, "borg_worships_gold =")) { if (buf[strlen("borg_worships_gold =")+1] == 'T' || buf[strlen("borg_worships_gold =")+1] == '1' || buf[strlen("borg_worships_gold =")+1] == 't') borg_worships_gold=TRUE; else borg_worships_gold= FALSE; continue; } if (prefix(buf, "borg_plays_risky =")) { if (buf[strlen("borg_plays_risky =")+1] == 'T' || buf[strlen("borg_plays_risky =")+1] == '1' || buf[strlen("borg_plays_risky =")+1] == 't') borg_plays_risky=TRUE; else borg_plays_risky = FALSE; continue; } if (prefix(buf, "borg_scums_uniques =")) { if (buf[strlen("borg_scums_uniques =")+1] == 'T' || buf[strlen("borg_scums_uniques =")+1] == '1' || buf[strlen("borg_scums_uniques =")+1] == 't') borg_scums_uniques=TRUE; else borg_scums_uniques = FALSE; continue; } if (prefix(buf, "borg_kills_uniques =")) { if (buf[strlen("borg_kills_uniques =")+1] == 'T' || buf[strlen("borg_kills_uniques =")+1] == '1' || buf[strlen("borg_kills_uniques =")+1] == 't') borg_kills_uniques=TRUE; else borg_kills_uniques = FALSE; continue; } if (prefix(buf, "borg_uses_swaps =")) { if (buf[strlen("borg_uses_swaps =")+1] == 'T' || buf[strlen("borg_uses_swaps =")+1] == '1' || buf[strlen("borg_uses_swaps =")+1] == 't') borg_uses_swaps=TRUE; else borg_uses_swaps = FALSE; continue; } if (prefix(buf, "borg_slow_optimizehome =")) { if (buf[strlen("borg_slow_optimizehome =")+1] == 'T' || buf[strlen("borg_slow_optimizehome =")+1] == '1' || buf[strlen("borg_slow_optimizehome =")+1] == 't') borg_slow_optimizehome=TRUE; else borg_slow_optimizehome = FALSE; /* for now always leave as false since its broken */ borg_slow_optimizehome = FALSE; continue; } if (prefix(buf, "borg_stop_king =")) { if (buf[strlen("borg_stop_king =")+1] == 'T' || buf[strlen("borg_stop_king =")+1] == '1' || buf[strlen("borg_stop_king =")+1] == 't') borg_stop_king=TRUE; else borg_stop_king = FALSE; continue; } if (prefix(buf, "borg_uses_dynamic_calcs =")) { if (buf[strlen("borg_uses_dynamic_calcs =")+1] == 'T' || buf[strlen("borg_uses_dynamic_calcs =")+1] == '1' || buf[strlen("borg_uses_dynamic_calcs =")+1] == 't') borg_uses_calcs=TRUE; else borg_uses_calcs = FALSE; continue; } if (prefix(buf, "borg_respawn_winners =")) { if (buf[strlen("borg_respawn_winners =")+1] == 'T' || buf[strlen("borg_respawn_winners =")+1] == '1' || buf[strlen("borg_respawn_winners =")+1] == 't') borg_respawn_winners = TRUE; else borg_respawn_winners = FALSE; continue; } if (prefix(buf, "borg_lunal_mode =")) { if (buf[strlen("borg_lunal_mode =")+1] == 'T' || buf[strlen("borg_lunal_mode =")+1] == '1' || buf[strlen("borg_lunal_mode =")+1] == 't') borg_lunal_mode = TRUE; else borg_lunal_mode = FALSE; continue; } if (prefix(buf, "borg_self_lunal =")) { if (buf[strlen("borg_self_lunal =")+1] == 'T' || buf[strlen("borg_self_lunal =")+1] == '1' || buf[strlen("borg_self_lunal =")+1] == 't') borg_self_lunal = TRUE; else borg_self_lunal = FALSE; continue; } if (prefix(buf, "borg_self_scum =")) { if (buf[strlen("borg_self_scum =")+1] == 'T' || buf[strlen("borg_self_scum =")+1] == '1' || buf[strlen("borg_self_scum =")+1] == 't') borg_self_scum = TRUE; else borg_self_scum = FALSE; continue; } if (prefix(buf, "borg_verbose =")) { if (buf[strlen("borg_verbose =")+1] == 'T' || buf[strlen("borg_verbose =")+1] == '1' || buf[strlen("borg_verbose =")+1] == 't') borg_verbose = TRUE; else borg_verbose = FALSE; continue; } if (prefix(buf, "borg_munchkin_start =")) { if (buf[strlen("borg_munchkin_start =")+1] == 'T' || buf[strlen("borg_munchkin_start =")+1] == '1' || buf[strlen("borg_munchkin_start =")+1] == 't') borg_munchkin_start = TRUE; else borg_munchkin_start = FALSE; continue; } if (prefix(buf, "borg_munchkin_level =")) { sscanf(buf+strlen("borg_munchkin_level =")+1, "%d", &borg_munchkin_level); if (borg_munchkin_level <= 1) borg_munchkin_level = 1; if (borg_munchkin_level >= 50) borg_munchkin_level = 50; continue; } if (prefix(buf, "borg_munchkin_depth =")) { sscanf(buf+strlen("borg_munchkin_depth =")+1, "%d", &borg_munchkin_depth); if (borg_munchkin_depth <= 1) borg_munchkin_depth = 8; if (borg_munchkin_depth >= 100) borg_munchkin_depth = 100; continue; } if (prefix(buf, "borg_enchant_limit =")) { sscanf(buf+strlen("borg_enchant_limit =")+1, "%d", &borg_enchant_limit); if (borg_enchant_limit <= 8) borg_enchant_limit = 8; if (borg_enchant_limit >= 15) borg_enchant_limit = 15; continue; } /* Extract the integers */ if (prefix(buf, "borg_respawn_race =")) { sscanf(buf+strlen("borg_respawn_race =")+1, "%d", &borg_respawn_race); continue; } if (prefix(buf, "borg_respawn_class =")) { sscanf(buf+strlen("borg_respawn_class =")+1, "%d", &borg_respawn_class); continue; } if (prefix(buf, "borg_dump_level =")) { sscanf(buf+strlen("borg_dump_level =")+1, "%d", &borg_dump_level); continue; } if (prefix(buf, "borg_save_death =")) { sscanf(buf+strlen("borg_save_death =")+1, "%d", &borg_save_death); continue; } if (prefix(buf, "borg_stop_clevel =")) { sscanf(buf+strlen("borg_stop_clevel =")+1, "%d", &borg_stop_clevel); continue; } if (prefix(buf, "borg_stop_dlevel =")) { sscanf(buf+strlen("borg_stop_dlevel =")+1, "%d", &borg_stop_dlevel); continue; } if (prefix(buf, "borg_no_deeper =")) { sscanf(buf+strlen("borg_no_deeper =")+1, "%d", &borg_no_deeper); continue; } if (prefix(buf, "borg_chest_fail_tolerance =")) { sscanf(buf+strlen("borg_chest_fail_tolerance =")+1, "%d", &borg_chest_fail_tolerance); continue; } if (prefix(buf, "borg_delay_factor =")) { sscanf(buf+strlen("borg_delay_factor =")+1, "%d", &borg_delay_factor); if (borg_delay_factor >= 9) borg_delay_factor = 9; continue; } if (prefix(buf, "borg_money_scum_amount =")) { sscanf(buf+strlen("borg_money_scum_amount =")+1, "%d", &borg_money_scum_amount); continue; } if (prefix(buf, "REQ")) { if (!borg_load_requirement(buf+strlen("REQ"))) borg_note(buf); continue; } if (prefix(buf, "FORMULA")) { if (!borg_load_formula(buf+strlen("FORMULA"))) borg_note(buf); continue; } if (prefix(buf, "CND")) { if (!borg_load_formula(buf+strlen("CND"))) borg_note(buf); continue; } if (prefix(buf, "POWER")) { if (!borg_load_power(buf+strlen("POWER"))) borg_note(buf); continue; } } /* Close it */ file_close(fp); for (i = 0; i < MAX_CLASSES; i++) qsort(borg_required_item[i], n_req[i], sizeof(req_item), borg_item_cmp); /* make sure it continues to run if reset */ if (borg_respawn_winners) borg_stop_king = FALSE; /* Success */ return; } /* * Initialize the Borg */ void borg_init_9(void) { byte *test; /*** Hack -- verify system ***/ /* Message */ prt("Initializing the Borg... (memory)", 0, 0); /* Hack -- flush it */ Term_fresh(); /* Mega-Hack -- verify memory */ C_MAKE(test, 400 * 1024L, byte); FREE(test); /*** Hack -- initialize some stuff ***/ C_MAKE(borg_required_item, MAX_CLASSES, req_item*); C_MAKE(n_req, MAX_CLASSES, int); C_MAKE(borg_power_item, MAX_CLASSES, power_item*); C_MAKE(n_pwr, MAX_CLASSES, int); /*** Hack -- initialize borg.ini options ***/ /* Message */ prt("Initializing the Borg... (borg.txt)", 0, 0); init_borg_txt_file(); /*** Hack -- initialize game options ***/ /* Message */ prt("Initializing the Borg... (options)", 0, 0); /* Hack -- flush it */ Term_fresh(); /* Make sure it rolls up a new guy at death */ if (screensaver) { /* We need the borg to keep playing after he dies */ option_set("cheat_live", TRUE); } /* We use the original keypress codes */ option_set("rogue_like_commands", FALSE); /* No auto_more */ option_set("auto_more", FALSE); /* We pick up items when we step on them */ option_set("pickup_always", TRUE); /* We do not want verbose messages */ option_set("pickup_detail", FALSE); /* We specify targets by hand */ option_set("use_old_target", FALSE); /* We must pick items up without verification */ option_set("pickup_inven", TRUE); /* Pile symbol '&' confuse the borg */ option_set("show_piles", FALSE); /* We repeat by hand */ /* always_repeat = FALSE; */ /* We do not haggle */ /* auto_haggle = TRUE; */ /* We need space */ option_set("show_labels", FALSE); /* show_weights = FALSE; */ option_set("show_flavors", FALSE); /* Allow items to stack */ /* stack_force_notes = TRUE; */ /* stack_force_costs = TRUE; */ /* Ignore discounts */ /* stack_force_costs = TRUE; */ /* Ignore inscriptions */ /* stack_force_notes = TRUE; */ /* Efficiency */ /* avoid_abort = TRUE; */ /* Efficiency */ op_ptr->hitpoint_warn = 0; /* The "easy" options confuse the Borg */ option_set("easy_open", FALSE); option_set("easy_alter", FALSE); /* easy_floor = FALSE; */ #ifndef ALLOW_BORG_GRAPHICS if (!borg_graphics) { int i; /* Reset the # and % -- Scan the features */ for (i = 1; i < z_info->f_max; i++) { feature_type *f_ptr = &f_info[i]; /* Skip non-features */ if (!f_ptr->name) continue; /* Switch off "graphics" */ f_ptr->x_attr[3] = f_ptr->d_attr; f_ptr->x_char[3] = f_ptr->d_char; } } #endif #ifdef USE_GRAPHICS /* The Borg can't work with graphics on, so switch it off */ if (use_graphics) { /* Reset to ASCII mode */ use_graphics = FALSE; arg_graphics = FALSE; /* Reset visuals */ reset_visuals(TRUE); } #endif /* USE_GRAPHICS */ /*** Redraw ***/ /* Redraw map */ p_ptr->redraw |= (PR_MAP); /* Redraw everything */ do_cmd_redraw(); /*** Various ***/ /* Message */ prt("Initializing the Borg... (various)", 0, 0); /* Hack -- flush it */ Term_fresh(); /*** Cheat / Panic ***/ /* more cheating */ borg_cheat_death = FALSE; /* set the continous play mode if the game cheat death is on */ if (op_ptr->opt[OPT_cheat_live]) borg_cheat_death = TRUE; /*** Initialize ***/ /* Initialize */ borg_init_1(); borg_init_2(); borg_init_3(); borg_init_4(); borg_init_5(); borg_init_6(); borg_init_7(); borg_init_8(); #if 0 /* Maintain a correct base for randart values. */ for (i = 0; i < artifact_count; i++) { artifact_type *a_ptr = &a_info[i]; borg_art_save_tval[i] = a_ptr->tval; borg_art_save_sval[i] = a_ptr->sval; borg_art_save_pval[i] = a_ptr->pval; borg_art_save_to_h[i] = a_ptr->to_h; borg_art_save_to_d[i] = a_ptr->to_d; borg_art_save_to_a[i] = a_ptr->to_a; borg_art_save_ac[i] = a_ptr->ac; borg_art_save_dd[i] = a_ptr->dd; borg_art_save_ds[i] = a_ptr->ds; borg_art_save_weight[i] = a_ptr->weight; borg_art_save_cost[i] = a_ptr->cost; borg_art_save_flags1[i] = a_ptr->flags1; borg_art_save_flags2[i] = a_ptr->flags2; borg_art_save_flags3[i] = a_ptr->flags3; borg_art_save_level[i] = a_ptr->level; borg_art_save_rarity[i] = a_ptr->rarity; borg_art_save_activation[i] = a_ptr->activation; borg_art_save_time[i] = a_ptr->time; borg_art_save_randtime[i] = a_ptr->randtime; } #endif /*** Hack -- Extract race ***/ /* Insert the player Race--cheat */ borg_race = p_ptr->race->ridx; /*** Hack -- Extract class ***/ borg_class = p_ptr->class->cidx; /*** Hack -- react to race and class ***/ /* Notice the new race and class */ prepare_race_class_info(); /*** All done ***/ /* Done initialization */ prt("Initializing the Borg... done.", 0, 0); /* Clear line */ prt("", 0, 0); /* Reset the clock */ borg_t = 10; /* Official message */ borg_note("# Ready..."); /* Now it is ready */ initialized = TRUE; } #ifndef BABLOS /* * Write a file with the current dungeon info (Borg) * and his equipment, inventory and home (Player) * and his swap armor, weapon (Borg) * From Dennis Van Es, With an addition of last messages from me (APW) */ void borg_write_map(bool ask) { char buf2[1024]; char buf[80]; ang_file *borg_map_file = NULL; char line[DUNGEON_WID + 1]; borg_item *item; int i,j; int to, itemm; s16b m_idx; struct store *st_ptr = &stores[7]; char o_name[80]; /* Process the player name */ for (i = 0; op_ptr->full_name[i]; i++) { char c = op_ptr->full_name[i]; /* No control characters */ if (iscntrl(c)) { /* Illegal characters */ quit_fmt("Illegal control char (0x%02X) in player name", c); } /* Convert all non-alphanumeric symbols */ if (!isalpha(c) && !isdigit(c)) c = '_'; /* Build "file_name" */ buf[i] = c; } /* Terminate */ buf[i++] = '.'; buf[i++] = 'm'; buf[i++] = 'a'; buf[i++] = 'p'; buf[i++] = '\0'; path_build(buf2, 1024, ANGBAND_DIR_USER, buf); /* XXX XXX XXX Get the name and open the map file */ if (ask && get_string("Borg map File: ", buf2, 70)) { /* Open a new file */ borg_map_file = file_open(buf2,MODE_WRITE, FTYPE_TEXT); /* Failure */ if (!borg_map_file) msg("Cannot open that file."); } else if (!ask) borg_map_file = file_open(buf2, MODE_WRITE, FTYPE_TEXT); file_putf(borg_map_file, "%s the %s %s, Level %d/%d\n", op_ptr->full_name, p_ptr->race->name, p_ptr->class->name, p_ptr->lev, p_ptr->max_lev); file_putf(borg_map_file, "Exp: %lu Gold: %lu Turn: %lu\n", (long)(p_ptr->max_exp + (100 * p_ptr->max_depth)), (long)p_ptr->au, (long)turn); file_putf(borg_map_file, "Killed on level: %d (max. %d) by %s\n\n", p_ptr->depth, p_ptr->max_depth, p_ptr->died_from); file_putf(borg_map_file, "Borg Compile Date: %s\n", borg_engine_date); for (i = 0; i < DUNGEON_HGT; i++) { for (j = 0; j < DUNGEON_WID; j++) { char ch; borg_grid *ag= &borg_grids[i][j]; m_idx = cave->m_idx[i][j]; /* reset the ch each time through */ ch = ' '; /* Known grids */ if (ag->feat) { ch = f_info[ag->feat].d_char; } /* Known Items */ if (ag->take) { borg_take *take = &borg_takes[ag->take]; object_kind *k_ptr = take->kind; ch = k_ptr->d_char; } /* UnKnown Monsters */ if (m_idx) { ch = '&'; } /* Known Monsters */ if (ag->kill) { borg_kill *kill = &borg_kills[ag->kill]; monster_race *r_ptr = &r_info[kill->r_idx]; ch = r_ptr->d_char; } /* The Player */ if ((i == c_y) && (j == c_x)) ch = '@'; line[j] = ch; } /* terminate the line */ line[j++] = '\0'; file_putf(borg_map_file, "%s\n", line); } /* Known/Seen monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Note */ file_putf(borg_map_file,"monster '%s' (%d) at (%d,%d) speed:%d \n", (r_info[kill->r_idx].name), kill->r_idx, kill->y, kill->x, kill->speed); } /*** Dump the last few messages ***/ i = messages_num(); if (i > 250) i = 250; file_putf(borg_map_file, "\n\n [Last Messages]\n\n"); while (i-- >0) { const char *msg = message_str((s16b)i); /* Eliminate some lines */ if (prefix(msg, "# Matched") || prefix(msg, "# There is") || prefix(msg, "# Tracking") || prefix(msg, "# MISS_BY:") || prefix(msg, "# HIT_BY:") || prefix(msg, "> ")) continue; file_putf(borg_map_file, "%s\n", msg); } /*** Player Equipment ***/ file_putf(borg_map_file, "\n\n [Character Equipment]\n\n"); for (i = INVEN_WIELD; i < QUIVER_END; i++) { object_desc(o_name, sizeof(o_name), &p_ptr->inventory[i], ODESC_FULL); file_putf(borg_map_file, "%c) %s\n", index_to_label(i), o_name); } file_putf(borg_map_file, "\n\n"); /* Dump the inventory */ file_putf(borg_map_file, " [Character Inventory]\n\n"); for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; file_putf(borg_map_file, "%c) %s\n", index_to_label(i), item->desc); } file_putf(borg_map_file, "\n\n"); /* Dump the Home (page 1) */ file_putf(borg_map_file, " [Home Inventory (page 1)]\n\n"); for (i = 0; i < 12; i++) { object_desc(o_name, sizeof(o_name), &st_ptr->stock[i], ODESC_FULL); file_putf(borg_map_file, "%c) %s\n", I2A(i%12), o_name); } file_putf(borg_map_file, "\n\n"); /* Dump the Home (page 2) */ file_putf(borg_map_file, " [Home Inventory (page 2)]\n\n"); for (i = 12; i < 24; i++) { object_desc(o_name, sizeof(o_name), &st_ptr->stock[i], ODESC_FULL); file_putf(borg_map_file, "%c) %s\n", I2A(i%12), o_name); } file_putf(borg_map_file, "\n\n"); /* Write swap info */ if (borg_uses_swaps) { file_putf(borg_map_file, " [Swap info]\n\n"); item = &borg_items[weapon_swap]; file_putf(borg_map_file,"Swap Weapon: %s\n", item->desc); item = &borg_items[armour_swap]; file_putf(borg_map_file,"Swap Armour: %s", item->desc); file_putf(borg_map_file, "\n\n"); } file_putf(borg_map_file, " [Player State at Death] \n\n"); /* Dump the player state */ file_putf(borg_map_file, format("Current speed: %d. \n", borg_skill[BI_SPEED])); if (p_ptr->timed[TMD_BLIND]) { file_putf(borg_map_file, "You cannot see.\n"); } if (p_ptr->timed[TMD_CONFUSED]) { file_putf(borg_map_file, "You are confused.\n"); } if (p_ptr->timed[TMD_AFRAID]) { file_putf(borg_map_file, "You are terrified.\n"); } if (p_ptr->timed[TMD_CUT]) { file_putf(borg_map_file, "You are bleeding.\n"); } if (p_ptr->timed[TMD_STUN]) { file_putf(borg_map_file, "You are stunned.\n"); } if (p_ptr->timed[TMD_POISONED]) { file_putf(borg_map_file, "You are poisoned.\n"); } if (p_ptr->timed[TMD_IMAGE]) { file_putf(borg_map_file, "You are hallucinating.\n"); } if (check_state(p_ptr, OF_AGGRAVATE, p_ptr->state.flags)) { file_putf(borg_map_file, "You aggravate monsters.\n"); } if (p_ptr->timed[TMD_BLESSED]) { file_putf(borg_map_file, "You feel rightous.\n"); } if (p_ptr->timed[TMD_HERO]) { file_putf(borg_map_file, "You feel heroic.\n"); } if (p_ptr->timed[TMD_SHERO]) { file_putf(borg_map_file, "You are in a battle rage.\n"); } if (p_ptr->timed[TMD_PROTEVIL]) { file_putf(borg_map_file, "You are protected from evil.\n"); } if (p_ptr->timed[TMD_SHIELD]) { file_putf(borg_map_file, "You are protected by a mystic shield.\n"); } if (p_ptr->timed[TMD_INVULN]) { file_putf(borg_map_file, "You are temporarily invulnerable.\n"); } if (p_ptr->timed[TMD_CONFUSED]) { file_putf(borg_map_file, "Your hands are glowing dull red.\n"); } if (p_ptr->word_recall) { file_putf(borg_map_file, format("You will soon be recalled. (%d turns)\n", p_ptr->word_recall)); } if (p_ptr->timed[TMD_OPP_FIRE]) { file_putf(borg_map_file, format("You resist fire exceptionally well.\n")); } if (p_ptr->timed[TMD_OPP_ACID]) { file_putf(borg_map_file, format("You resist acid exceptionally well.\n")); } if (p_ptr->timed[TMD_OPP_ELEC]) { file_putf(borg_map_file, format("You resist elec exceptionally well.\n")); } if (p_ptr->timed[TMD_OPP_COLD]) { file_putf(borg_map_file, format("You resist cold exceptionally well.\n")); } if (p_ptr->timed[TMD_OPP_POIS]) { file_putf(borg_map_file, format("You resist poison exceptionally well.\n")); } file_putf(borg_map_file, "\n\n"); /* Dump the Time Variables */ file_putf(borg_map_file, "Time on this panel; %d\n", time_this_panel); file_putf(borg_map_file, "Time on this level; %d\n", borg_t - borg_began); file_putf(borg_map_file, "Time since left town; %d\n", borg_time_town + (borg_t - borg_began)); file_putf(borg_map_file, "Food in town; %d\n", borg_food_onsale); file_putf(borg_map_file, "Fuel in town; %d\n", borg_fuel_onsale); file_putf(borg_map_file, "Borg_no_retreat; %d\n", borg_no_retreat); file_putf(borg_map_file, "Breeder_level; %d\n", breeder_level); file_putf(borg_map_file, "Unique_on_level; %d\n", unique_on_level); if ((turn % (10L * TOWN_DAWN)) < ((10L * TOWN_DAWN) / 2)) file_putf(borg_map_file, "It is daytime in town.\n"); else file_putf(borg_map_file, "It is night-time in town.\n"); file_putf(borg_map_file, "\n\n"); file_putf(borg_map_file, "borg_uses_swaps; %d\n", borg_uses_swaps); file_putf(borg_map_file, "borg_worships_damage; %d\n", borg_worships_damage); file_putf(borg_map_file, "borg_worships_speed; %d\n", borg_worships_speed); file_putf(borg_map_file, "borg_worships_hp; %d\n", borg_worships_hp); file_putf(borg_map_file, "borg_worships_mana; %d\n",borg_worships_mana); file_putf(borg_map_file, "borg_worships_ac; %d\n",borg_worships_ac); file_putf(borg_map_file, "borg_worships_gold; %d\n",borg_worships_gold); file_putf(borg_map_file, "borg_plays_risky; %d\n",borg_plays_risky); file_putf(borg_map_file, "borg_slow_optimizehome; %d\n\n",borg_slow_optimizehome); file_putf(borg_map_file, "borg_scumming_pots; %d\n\n",borg_scumming_pots); file_putf(borg_map_file, "\n\n"); /* Dump the spells */ if (p_ptr->class->spell_book) { file_putf(borg_map_file,"\n\n [ Spells ] \n\n"); file_putf(borg_map_file,"Name Legal Times cast\n"); for (i = 0; i < 9; i++ ) { for (j = 0; j < 8; j++) { borg_magic *as = &borg_magics[i][j]; char *legal; int failpercent =0; if (as->level <99) { if (p_ptr->class->spell_book == TV_PRAYER_BOOK) { legal = (borg_prayer_legal(i, j) ? "Yes" : "No "); failpercent = (borg_prayer_fail_rate( i, j)); } else { legal = (borg_spell_legal(i, j) ? "Yes" : "No "); failpercent = (borg_spell_fail_rate(i, j)); } file_putf(borg_map_file,"%-30s %s %d fail:%d \n",as->name, legal, (long)as->times, failpercent); } } file_putf(borg_map_file,"\n"); } } /* Dump the borg_skill[] information */ itemm = z_info->k_max + z_info->k_max + z_info->a_max; to = z_info->k_max + z_info->k_max + z_info->a_max + BI_MAX; for (;itemm < to; itemm++) { file_putf(borg_map_file,"skill %d (%s) value= %d.\n",itemm, prefix_pref[itemm - z_info->k_max - z_info->k_max - z_info->a_max], borg_has[itemm]); } #if 0 /* Allocate the "okay" array */ C_MAKE(okay, z_info->a_max, bool); /*** Dump the Uniques and Artifact Lists ***/ /* Scan the artifacts */ for (k = 0; k < z_info->a_max; k++) { artifact_type *a_ptr = &a_info[k]; /* Default */ okay[k] = FALSE; /* Skip "empty" artifacts */ if (!a_ptr->name) continue; /* Skip "uncreated" artifacts */ if (!a_ptr->cur_num) continue; /* Assume okay */ okay[k] = TRUE; } /* Check the dungeon */ for (y = 0; y < DUNGEON_HGT; y++) { for (x = 0; x < DUNGEON_WID; x++) { s16b this_o_idx, next_o_idx = 0; /* Scan all objects in the grid */ for (this_o_idx = cave->o_idx[y][x]; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = &o_list[this_o_idx]; /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Ignore non-artifacts */ if (!artifact_p(o_ptr)) continue; /* Ignore known items */ if (object_is_known(o_ptr)) continue; /* Note the artifact */ okay[o_ptr->name1] = FALSE; } } } /* Check the inventory and equipment */ for (i = 0; i < INVEN_TOTAL; i++) { object_type *o_ptr = &p_ptr->inventory[i]; /* Ignore non-objects */ if (!o_ptr->k_idx) continue; /* Ignore non-artifacts */ if (!artifact_p(o_ptr)) continue; /* Ignore known items */ if (object_is_known(o_ptr)) continue; /* Note the artifact */ okay[o_ptr->name1] = FALSE; } file_putf(borg_map_file, "\n\n"); /* Hack -- Build the artifact name */ file_putf(borg_map_file, " [Artifact Info] \n\n"); /* Scan the artifacts */ for (k = 0; k < z_info->a_max; k++) { artifact_type *a_ptr = &a_info[k]; /* List "dead" ones */ if (!okay[k]) continue; /* Paranoia */ strcpy(o_name, "Unknown Artifact"); /* Obtain the base object type */ z = borg_lookup_kind(a_ptr->tval, a_ptr->sval); /* Real object */ if (z) { object_type *i_ptr; object_type object_type_body; /* Get local object */ i_ptr = &object_type_body; /* Create fake object */ object_prep(i_ptr, z); /* Make it an artifact */ i_ptr->name1 = k; /* Describe the artifact */ object_desc_spoil(o_name, sizeof(o_name), i_ptr, FALSE, 0); } /* Hack -- Build the artifact name */ file_putf(borg_map_file, "The %s\n", o_name); } /* Free the "okay" array */ FREE(okay); file_putf(borg_map_file, "\n\n"); /* Display known uniques * * Note that the player ghosts are ignored. XXX XXX XXX */ /* Allocate the "who" array */ C_MAKE(who, z_info->r_max, u16b); /* Collect matching monsters */ for (i = 1, n = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; monster_lore *l_ptr = &l_list[i]; /* Require known monsters */ if (!cheat_know && !l_ptr->r_sights) continue; /* Require unique monsters */ if (!(rf_has(r_ptr->flags, RF_UNIQUE))) continue; /* Collect "appropriate" monsters */ who[n++] = i; } borg_sort_comp = borg_sort_comp_hook; borg_sort_swap = borg_sort_swap_hook; /* Sort the array by dungeon depth of monsters */ borg_sort(who, &why, n); /* Hack -- Build the artifact name */ file_putf(borg_map_file, " [Unique Info] \n\n"); /* Print the monsters */ for (i = 0; i < n; i++) { monster_race *r_ptr = &r_info[who[i]]; bool dead = (r_ptr->max_num == 0); /* Print a message */ file_putf(borg_map_file, "%s is %s\n", (r_ptr->name), (dead ? "dead" : "alive")); } /* Free the "who" array */ FREE(who); #endif /* extra dump stuff */ file_close(borg_map_file); } /* Try to make a scumfile so we can see what went wrong. */ void borg_save_scumfile(void) { static char svSavefile[1024]; static char svSavefile2[1024]; int i; /* Create a scum file */ if (borg_save_death && (borg_skill[BI_CLEVEL] >= borg_dump_level || strstr(p_ptr->died_from, "starvation"))) { memcpy(svSavefile, savefile, sizeof(savefile)); /* Process the player name */ for (i = 0; op_ptr->full_name[i]; i++) { char c = op_ptr->full_name[i]; /* No control characters */ if (iscntrl(c)) { /* Illegal characters */ quit_fmt("Illegal control char (0x%02X) in player name", c); } /* Convert all non-alphanumeric symbols */ if (!isalpha(c) && !isdigit(c)) c = '_'; /* Build "file_name" */ svSavefile2[i] = c; } svSavefile2[i] = 0; path_build(savefile, 1024, ANGBAND_DIR_USER, svSavefile2); } } #endif /* BABLOS */ /* DVE's function for displaying the status of various info */ /* Display what the borg is thinking DvE*/ void borg_status(void) { int j; /* Scan windows */ for (j = 0; j < 8; j++) { term *old = Term; /* Unused */ if (!angband_term[j]) continue; /* Check for borg status term */ if (op_ptr->window_flag[j] & (PW_BORG_2)) { byte attr; /* Activate */ Term_activate(angband_term[j]); /* Display what resists the borg (thinks he) has */ Term_putstr(5, 0, -1,TERM_WHITE, "RESISTS"); /* Basic four */ attr = TERM_SLATE; if (borg_skill[BI_RACID]) attr = TERM_BLUE; if (borg_skill[BI_TRACID]) attr = TERM_GREEN; if (borg_skill[BI_IACID]) attr = TERM_WHITE; Term_putstr(1, 1, -1, attr, "Acid"); attr = TERM_SLATE; if (borg_skill[BI_RELEC]) attr = TERM_BLUE; if (borg_skill[BI_TRELEC]) attr = TERM_GREEN; if (borg_skill[BI_IELEC]) attr = TERM_WHITE; Term_putstr(1, 2, -1, attr, "Elec"); attr = TERM_SLATE; if (borg_skill[BI_RFIRE]) attr = TERM_BLUE; if (borg_skill[BI_TRFIRE]) attr = TERM_GREEN; if (borg_skill[BI_IFIRE]) attr = TERM_WHITE; Term_putstr(1, 3, -1, attr, "Fire"); attr = TERM_SLATE; if (borg_skill[BI_RCOLD]) attr = TERM_BLUE; if (borg_skill[BI_TRCOLD]) attr = TERM_GREEN; if (borg_skill[BI_ICOLD]) attr = TERM_WHITE; Term_putstr(1, 4, -1, attr, "Cold"); /* High resists */ attr = TERM_SLATE; if (borg_skill[BI_RPOIS]) attr = TERM_BLUE; if (borg_skill[BI_TRPOIS]) attr = TERM_GREEN; Term_putstr(1, 5, -1, attr, "Pois"); if (borg_skill[BI_RFEAR]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(1, 6, -1, attr, "Fear"); if (borg_skill[BI_RLITE]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(1, 7, -1, attr, "Lite"); if (borg_skill[BI_RDARK]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(1, 8, -1, attr, "Dark"); if (borg_skill[BI_RBLIND]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(6, 1, -1, attr, "Blind"); if (borg_skill[BI_RCONF]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(6, 2, -1, attr, "Confu"); if (borg_skill[BI_RSND]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(6, 3, -1, attr, "Sound"); if (borg_skill[BI_RSHRD]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(6, 4, -1, attr, "Shard"); if (borg_skill[BI_RNXUS]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(6, 5, -1, attr, "Nexus"); if (borg_skill[BI_RNTHR]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(6, 6, -1, attr, "Nethr"); if (borg_skill[BI_RKAOS]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(6, 7, -1, attr, "Chaos"); if (borg_skill[BI_RDIS]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(6, 8, -1, attr, "Disen"); /* Other abilities */ if (borg_skill[BI_SDIG]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(12, 1, -1, attr, "S.Dig"); if (borg_skill[BI_FEATH]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(12, 2, -1, attr, "Feath"); if (borg_skill[BI_LIGHT]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(12, 3, -1, attr, "PLite"); if (borg_skill[BI_REG]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(12, 4, -1, attr, "Regen"); if (borg_skill[BI_ESP]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(12, 5, -1, attr, "Telep"); if (borg_skill[BI_SINV]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(12, 6, -1, attr, "Invis"); if (borg_skill[BI_FRACT]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(12, 7, -1, attr, "FrAct"); if (borg_skill[BI_HLIFE]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(12, 8, -1, attr, "HLife"); /* Display the slays */ Term_putstr(5, 10, -1,TERM_WHITE, "Weapon Slays:"); if (borg_skill[BI_WS_ANIMAL]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(1, 11, -1, attr, "Animal"); if (borg_skill[BI_WS_EVIL]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(8, 11, -1, attr, "Evil"); if (borg_skill[BI_WS_UNDEAD]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(15, 11, -1, attr, "Undead"); if (borg_skill[BI_WS_DEMON]) attr = TERM_BLUE; if (borg_skill[BI_WK_DEMON]) attr = TERM_GREEN; else attr = TERM_SLATE; Term_putstr(22, 11, -1, attr, "Demon"); if (borg_skill[BI_WS_ORC]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(1, 12, -1, attr, "Orc"); if (borg_skill[BI_WS_TROLL]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(8, 12, -1, attr, "Troll"); if (borg_skill[BI_WS_GIANT]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(15, 12, -1, attr, "Giant"); if (borg_skill[BI_WS_DRAGON]) attr = TERM_BLUE; if (borg_skill[BI_WK_DRAGON]) attr = TERM_GREEN; else attr = TERM_SLATE; Term_putstr(22, 12, -1, attr, "Dragon"); if (borg_skill[BI_WB_ACID]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(1, 13, -1, attr, "Acid"); if (borg_skill[BI_WB_COLD]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(8, 13, -1, attr, "Cold"); if (borg_skill[BI_WB_ELEC]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(15, 13, -1, attr, "Elec"); if (borg_skill[BI_WB_FIRE]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(22, 13, -1, attr, "Fire"); /* Display the Concerns */ Term_putstr(36, 10, -1,TERM_WHITE, "Concerns:"); if (borg_wearing_cursed) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(29, 11, -1, attr, "Cursed"); if (borg_skill[BI_ISWEAK]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(36, 11, -1, attr, "Weak"); if (borg_skill[BI_ISPOISONED]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(43, 11, -1, attr, "Poison"); if (borg_skill[BI_ISCUT]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(29, 12, -1, attr, "Cut"); if (borg_skill[BI_ISSTUN]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(36, 12, -1, attr, "Stun"); if (borg_skill[BI_ISCONFUSED]) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(43, 12, -1, attr, "Confused"); if (goal_fleeing) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(29, 13, -1, attr, "Goal Fleeing"); if (borg_no_rest_prep > 0) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(43, 13, -1, attr, "No Resting"); /* Display the Time */ Term_putstr(60, 10, -1,TERM_WHITE, "Time:"); Term_putstr(54, 11, -1, TERM_SLATE, "This Level "); Term_putstr(65, 11, -1, TERM_WHITE, format("%d",borg_t - borg_began)); Term_putstr(54, 12, -1, TERM_SLATE, "Since Town "); Term_putstr(65, 12, -1, TERM_WHITE, format("%d",borg_time_town + (borg_t - borg_began))); Term_putstr(54, 13, -1, TERM_SLATE, "This Panel "); Term_putstr(65, 13, -1, TERM_WHITE, format("%d",time_this_panel)); /* Sustains */ Term_putstr(19, 0, -1, TERM_WHITE, "Sustains"); if (borg_skill[BI_SSTR]) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(21, 1, -1, attr, "STR"); if (borg_skill[BI_SINT]) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(21, 2, -1, attr, "INT"); if (borg_skill[BI_SWIS]) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(21, 3, -1, attr, "WIS"); if (borg_skill[BI_SDEX]) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(21, 4, -1, attr, "DEX"); if (borg_skill[BI_SCON]) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(21, 5, -1, attr, "CON"); /* Temporary effects */ Term_putstr(28, 0, -1, TERM_WHITE, "Temp Effects"); if (borg_prot_from_evil) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(28, 1, -1, attr, "Prot. Evil"); if (borg_hero) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(28, 2, -1, attr, "Heroism"); if (borg_berserk) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(28, 3, -1, attr, "Berserk"); if (borg_shield) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(28, 4, -1, attr, "Shielded"); if (borg_bless) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(28, 5, -1, attr, "Blessed"); if (borg_speed) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(28, 6, -1, attr, "Fast"); if (borg_see_inv >= 1) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(28, 6, -1, attr, "See Inv"); /* Temporary effects */ Term_putstr(42, 0, -1, TERM_WHITE, "Level Information"); if (vault_on_level) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(42, 1, -1, attr, "Vault on level"); if (unique_on_level) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(42, 2, -1, attr, "Unique on level"); if (unique_on_level) Term_putstr(58, 2, -1, attr, format("(%s)", r_info[unique_on_level].name)); else Term_putstr(58, 2, -1, attr, " "); if (scaryguy_on_level) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(42, 3, -1, attr, "Scary Guy on level"); if (breeder_level) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(42, 4, -1, attr,"Breeder level (closing doors)"); if (borg_kills_summoner != -1) attr = TERM_WHITE; else attr = TERM_SLATE; Term_putstr(42, 5, -1, attr,"Summoner very close (AS-Corridor)"); /* level preparedness */ attr = TERM_SLATE; Term_putstr(42, 6, -1, attr,"Reason for not diving:"); attr = TERM_WHITE; Term_putstr(64, 6, -1, attr,format("%s ", borg_prepared(borg_skill[BI_MAXDEPTH]+1))); attr = TERM_SLATE; Term_putstr(42, 7, -1, attr,"Scumming: not active "); if (borg_money_scum_amount != 0) { attr = TERM_WHITE; Term_putstr(42, 7, -1, attr,format("Scumming: $%d ", borg_money_scum_amount)); } attr = TERM_SLATE; Term_putstr(42, 8, -1, attr,"Maximal Depth:"); attr = TERM_WHITE; Term_putstr(56, 8, -1, attr,format("%d ", borg_skill[BI_MAXDEPTH])); /* Important endgame information */ if (borg_skill[BI_MAXDEPTH] >= 50) /* 85 */ { Term_putstr(5, 15, -1,TERM_WHITE, "Important Deep Events:"); attr = TERM_SLATE; Term_putstr(1, 16, -1, attr, "Home *Heal*: "); attr = TERM_WHITE; Term_putstr(13, 16, -1, attr, format("%d ",num_ezheal)); attr = TERM_SLATE; Term_putstr(1, 17, -1, attr, "Home Heal: "); attr = TERM_WHITE; Term_putstr(11, 17, -1, attr, format("%d ",num_heal)); attr = TERM_SLATE; Term_putstr(1, 18, -1, attr, "Home Life: "); attr = TERM_WHITE; Term_putstr(11, 18, -1, attr, format("%d ",num_life)); attr = TERM_SLATE; Term_putstr(1, 19, -1, attr, "Res_Mana: "); attr = TERM_WHITE; Term_putstr(11, 19, -1, attr, format("%d ",num_mana)); if (morgoth_on_level) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(1, 20, -1, attr, format("Morgoth on Level. Last seen:%d ", borg_t - borg_t_morgoth)); if (borg_morgoth_position) attr = TERM_BLUE; else attr = TERM_SLATE; if (borg_needs_new_sea) attr = TERM_WHITE; Term_putstr(1, 21, -1, attr, "Sea of Runes."); if (borg_ready_morgoth) attr = TERM_BLUE; else attr = TERM_SLATE; Term_putstr(1, 22, -1, attr, "Ready for Morgoth."); } else { Term_putstr(5, 15, -1,TERM_WHITE, " "); attr = TERM_SLATE; Term_putstr(1, 16, -1, attr, " "); attr = TERM_WHITE; Term_putstr(10, 16, -1, attr, format(" ",num_ezheal)); attr = TERM_SLATE; Term_putstr(1, 17, -1, attr, " "); attr = TERM_WHITE; Term_putstr(10, 17, -1, attr, format(" ",num_life)); attr = TERM_SLATE; Term_putstr(1, 18, -1, attr, " "); attr = TERM_WHITE; Term_putstr(11, 18, -1, attr, format(" ",num_heal)); attr = TERM_SLATE; Term_putstr(1, 19, -1, attr, " "); attr = TERM_WHITE; Term_putstr(11, 19, -1, attr, format(" ",num_mana)); } /* Fresh */ Term_fresh(); /* Restore */ Term_activate(old); } } } /* * Hack -- forward declare */ void do_cmd_borg(void); /* * Hack -- interact with the "Ben Borg". */ void do_cmd_borg(void) { struct keypress cmd; cmd.type = EVT_KBRD; #ifdef BABLOS if (auto_play) { auto_play = FALSE; keep_playing = TRUE; cmd.code = 'z'; } else { #endif /* BABLOS */ /* Get a "Borg command", or abort */ #ifdef XSCREENSAVER if (auto_start_borg == FALSE) #endif { if (!get_com("Borg command: ", &cmd)) return; } #ifdef BABLOS } #endif /* BABLOS */ /* Simple help */ if (cmd.code == '?') { int i = 2; /* Save the screen */ Term_save(); /* Clear the screen */ Term_clear(); i++; Term_putstr(2, i, -1, TERM_WHITE, "Command 'z' activates the Borg."); Term_putstr(42, i++, -1, TERM_WHITE, "Command 'u' updates the Borg."); Term_putstr(2, i++, -1, TERM_WHITE, "Command 'x' steps the Borg."); Term_putstr(42, i, -1, TERM_WHITE, "Command 'f' modifies the normal flags."); Term_putstr(2, i++, -1, TERM_WHITE, "Command 'c' modifies the cheat flags."); Term_putstr(42, i, -1, TERM_WHITE, "Command 'l' activates a log file."); Term_putstr(2, i++, -1, TERM_WHITE, "Command 's' activates search mode."); Term_putstr(42, i, -1, TERM_WHITE, "Command 'i' displays grid info."); Term_putstr(2, i++, -1, TERM_WHITE, "Command 'g' displays grid feature."); Term_putstr(42, i, -1, TERM_WHITE, "Command 'a' displays avoidances."); Term_putstr(2, i++, -1, TERM_WHITE, "Command 'k' displays monster info."); Term_putstr(42, i, -1, TERM_WHITE, "Command 't' displays object info."); Term_putstr(2, i++, -1, TERM_WHITE, "Command '%' displays targetting flow."); Term_putstr(42, i, -1, TERM_WHITE, "Command '#' displays danger grid."); Term_putstr(2, i++, -1, TERM_WHITE, "Command '_' Regional Fear info."); Term_putstr(42, i, -1, TERM_WHITE, "Command 'p' Borg Power."); Term_putstr(2, i++, -1, TERM_WHITE, "Command '1' change max depth."); Term_putstr(42, i, -1, TERM_WHITE, "Command '2' level prep info."); Term_putstr(2, i++, -1, TERM_WHITE, "Command '3' Feature of grid."); Term_putstr(42, i, -1, TERM_WHITE, "Command '!' Time."); Term_putstr(2, i++, -1, TERM_WHITE, "Command '@' Borg LOS."); Term_putstr(42, i, -1, TERM_WHITE, "Command 'w' My Swap Weapon."); Term_putstr(2, i++, -1, TERM_WHITE, "Command 'q' Auto stop on level."); Term_putstr(42, i, -1, TERM_WHITE, "Command 'v' Version stamp."); Term_putstr(2, i++, -1, TERM_WHITE, "Command 'd' Dump spell info."); Term_putstr(42, i, -1, TERM_WHITE, "Command 'h' Borg_Has function."); Term_putstr(2, i++, -1, TERM_WHITE, "Command '$' Reload Borg.txt."); Term_putstr(42, i, -1, TERM_WHITE, "Command 'y' Last 75 steps."); Term_putstr(2, i++, -1, TERM_WHITE, "Command 'm' money Scum."); Term_putstr(42, i, -1, TERM_WHITE, "Command '^' Flow Pathway."); Term_putstr(2, i++, -1, TERM_WHITE, "Command 'R' Respawn Borg."); Term_putstr(42, i, -1, TERM_WHITE, "Command 'o' Object Flags."); Term_putstr(2, i++, -1, TERM_WHITE, "Command 'r' Restock Stores."); /* Prompt for key */ msg("Commands: "); inkey(); /* Restore the screen */ Term_load(); /* Done */ return; } /* Hack -- force initialization */ if (!initialized) borg_init_9(); switch (cmd.code) { /* Command: Nothing */ case '$': { int j; /*** Hack -- initialize borg.ini options ***/ /* Message */ borg_note("Reloading the Borg rules... (borg.txt)"); for (j = 0; j < MAX_CLASSES; j++) { FREE(borg_required_item[j]); /* externalize the 400 later */ FREE(borg_power_item[j]); /* externalize the 400 later */ } FREE(borg_required_item); /* externalize the 400 later */ FREE(borg_power_item); /* externalize the 400 later */ FREE(borg_has); for (j = 0; j < 1000; j++) { if (formula[j]) { FREE(formula[j]); formula[j] = 0; } } FREE(n_req); FREE(n_pwr); C_MAKE(borg_required_item, MAX_CLASSES, req_item*); C_MAKE(n_req, MAX_CLASSES, int); C_MAKE(borg_power_item, MAX_CLASSES, power_item*); C_MAKE(n_pwr, MAX_CLASSES, int); init_borg_txt_file(); borg_note("# Ready..."); break; } /* Command: Activate */ case 'z': case 'Z': { /* Activate */ borg_active = TRUE; /* Reset cancel */ borg_cancel = FALSE; /* Step forever */ borg_step = 0; /* need to check all stats */ my_need_stat_check[0] = TRUE; my_need_stat_check[1] = TRUE; my_need_stat_check[2] = TRUE; my_need_stat_check[3] = TRUE; my_need_stat_check[4] = TRUE; my_need_stat_check[5] = TRUE; /* Allowable Cheat -- Obtain "recall" flag */ goal_recalling = p_ptr->word_recall * 1000; /* Allowable Cheat -- Obtain "prot_from_evil" flag */ borg_prot_from_evil = (p_ptr->timed[TMD_PROTEVIL] ? TRUE : FALSE); /* Allowable Cheat -- Obtain "speed" flag */ borg_speed = (p_ptr->timed[TMD_FAST] ? TRUE : FALSE); /* Allowable Cheat -- Obtain "resist" flags */ borg_skill[BI_TRACID] = (p_ptr->timed[TMD_OPP_ACID] ? TRUE : FALSE); borg_skill[BI_TRELEC] = (p_ptr->timed[TMD_OPP_ELEC] ? TRUE : FALSE); borg_skill[BI_TRFIRE] = (p_ptr->timed[TMD_OPP_FIRE] ? TRUE : FALSE); borg_skill[BI_TRCOLD] = (p_ptr->timed[TMD_OPP_COLD] ? TRUE : FALSE); borg_skill[BI_TRPOIS] = (p_ptr->timed[TMD_OPP_POIS] ? TRUE : FALSE); borg_bless = (p_ptr->timed[TMD_BLESSED] ? TRUE : FALSE); borg_shield = (p_ptr->timed[TMD_SHIELD] ? TRUE : FALSE); borg_hero = (p_ptr->timed[TMD_HERO] ? TRUE : FALSE); borg_berserk = (p_ptr->timed[TMD_SHERO] ? TRUE : FALSE); if (p_ptr->timed[TMD_SINVIS]) borg_see_inv = 10000; if (lazymove_delay != 0) { borg_note("# Turning off lazy movement controls"); lazymove_delay = 0; } /* Message */ borg_note("# Installing keypress hook"); /* If the clock overflowed, fix that */ if (borg_t > 9000) borg_t = 9000; /* Activate the key stealer */ inkey_hack = borg_inkey_hack; break; } /* Command: Update */ case 'u': case 'U': { /* Activate */ borg_active = TRUE; /* Immediate cancel */ borg_cancel = TRUE; /* Step forever */ borg_step = 0; /* Allowable Cheat -- Obtain "recall" flag */ goal_recalling = p_ptr->word_recall * 1000; /* Allowable Cheat -- Obtain "prot_from_evil" flag */ borg_prot_from_evil = (p_ptr->timed[TMD_PROTEVIL] ? TRUE : FALSE); /* Allowable Cheat -- Obtain "speed" flag */ borg_speed = (p_ptr->timed[TMD_FAST] ? TRUE : FALSE); /* Allowable Cheat -- Obtain "resist" flags */ borg_skill[BI_TRACID] = (p_ptr->timed[TMD_OPP_ACID] ? TRUE : FALSE); borg_skill[BI_TRELEC] = (p_ptr->timed[TMD_OPP_ELEC] ? TRUE : FALSE); borg_skill[BI_TRFIRE] = (p_ptr->timed[TMD_OPP_FIRE] ? TRUE : FALSE); borg_skill[BI_TRCOLD] = (p_ptr->timed[TMD_OPP_COLD] ? TRUE : FALSE); borg_skill[BI_TRPOIS] = (p_ptr->timed[TMD_OPP_POIS] ? TRUE : FALSE); borg_bless = (p_ptr->timed[TMD_BLESSED] ? TRUE : FALSE); borg_shield = (p_ptr->timed[TMD_SHIELD] ? TRUE : FALSE); borg_hero = (p_ptr->timed[TMD_HERO] ? TRUE : FALSE); borg_berserk = (p_ptr->timed[TMD_SHERO] ? TRUE : FALSE); if (p_ptr->timed[TMD_SINVIS]) borg_see_inv = 10000; /* Message */ borg_note("# Installing keypress hook"); /* Activate the key stealer */ inkey_hack = borg_inkey_hack; break; } /* Command: Step */ case 'x': case 'X': { /* Activate */ borg_active = TRUE; /* Reset cancel */ borg_cancel = FALSE; /* Step N times */ borg_step = get_quantity("Step how many times? ", 10); /* need to check all stats */ my_need_stat_check[0] = TRUE; my_need_stat_check[1] = TRUE; my_need_stat_check[2] = TRUE; my_need_stat_check[3] = TRUE; my_need_stat_check[4] = TRUE; my_need_stat_check[5] = TRUE; /* Allowable Cheat -- Obtain "prot_from_evil" flag */ borg_prot_from_evil = (p_ptr->timed[TMD_PROTEVIL] ? TRUE : FALSE); /* Allowable Cheat -- Obtain "speed" flag */ borg_speed = (p_ptr->timed[TMD_FAST] ? TRUE : FALSE); /* Allowable Cheat -- Obtain "resist" flags */ borg_skill[BI_TRACID] = (p_ptr->timed[TMD_OPP_ACID] ? TRUE : FALSE); borg_skill[BI_TRELEC] = (p_ptr->timed[TMD_OPP_ELEC] ? TRUE : FALSE); borg_skill[BI_TRFIRE] = (p_ptr->timed[TMD_OPP_FIRE] ? TRUE : FALSE); borg_skill[BI_TRCOLD] = (p_ptr->timed[TMD_OPP_COLD] ? TRUE : FALSE); borg_skill[BI_TRPOIS] = (p_ptr->timed[TMD_OPP_POIS] ? TRUE : FALSE); borg_bless = (p_ptr->timed[TMD_BLESSED] ? TRUE : FALSE); borg_shield = (p_ptr->timed[TMD_SHIELD] ? TRUE : FALSE); borg_hero = (p_ptr->timed[TMD_HERO] ? TRUE : FALSE); borg_berserk = (p_ptr->timed[TMD_SHERO] ? TRUE : FALSE); if (p_ptr->timed[TMD_SINVIS]) borg_see_inv = 10000; /* Message */ borg_note("# Installing keypress hook"); borg_note(format("# Stepping Borg %d times", borg_step)); /* If the clock overflowed, fix that */ if (borg_t > 9000) borg_t = 9000; /* Activate the key stealer */ inkey_hack = borg_inkey_hack; break; } /* Command: toggle "flags" */ case 'f': case 'F': { /* Get a "Borg command", or abort */ if (!get_com("Borg command: Toggle Flag: (m/d/s/f/g) ", &cmd)) return; switch (cmd.code) { /* Give borg thought messages in window */ case 'm': case 'M': { break; } /* Give borg the ability to use graphics ----broken */ case 'g': case 'G': { borg_graphics = !borg_graphics; msg("Borg -- borg_graphics is now %d.", borg_graphics); break; } /* Dump savefile at each death */ case 'd': case 'D': { borg_flag_dump = !borg_flag_dump; msg("Borg -- borg_flag_dump is now %d.", borg_flag_dump); break; } /* Dump savefile at each level */ case 's': case 'S': { borg_flag_save = !borg_flag_save; msg("Borg -- borg_flag_save is now %d.", borg_flag_save); break; } /* clear 'fear' levels */ case 'f': case 'F': { msg("Command No Longer Usefull"); break; } } break; } /* Command: toggle "cheat" flags */ case 'c': { /* Get a "Borg command", or abort */ if (!get_com("Borg command: Toggle Cheat: (d/i/e/s/p)", &cmd)) return; switch (cmd.code) { case 'd': case 'D': { borg_cheat_death = !borg_cheat_death; msg("Borg -- borg_cheat_death is now %d.", borg_cheat_death); break; } } break; } /* List the Nasties on the level */ case 'C': { int i; /* Log Header */ borg_note("Borg Nasties Count"); /* Find the numerous nasty in order of nastiness */ for (i = 0; i < borg_nasties_num; i++) { borg_note(format("Nasty: [%c] Count: %d, limited: %d",borg_nasties[i], borg_nasties_count[i],borg_nasties_limit[i])); } /* Done */ msg("Borg Nasty Dump Complete. Examine Log."); break; } /* Activate a search string */ case 's': case 'S': { /* Get the new search string (or cancel the matching) */ if (!get_string("Borg Match String: ", borg_match, 70)) { /* Cancel it */ strcpy(borg_match, ""); /* Message */ msg("Borg Match String de-activated."); } break; } /* Command: check Grid "feature" flags */ case 'g': { int x, y; u16b low, high = 0; /* Get a "Borg command", or abort */ if (!get_com("Borg command: Show grids: ", &cmd)) return; /* Extract a flag */ switch (cmd.code) { case '0': low = high = 1 << 0; break; case '1': low = high = 1 << 1; break; case '2': low = high = 1 << 2; break; case '3': low = high = 1 << 3; break; case '4': low = high = 1 << 4; break; case '5': low = high = 1 << 5; break; case '6': low = high = 1 << 6; break; case '7': low = high = 1 << 7; break; case '.': low = high = FEAT_FLOOR; break; case ' ': low = high = FEAT_NONE; break; case 'i': low = high = FEAT_INVIS; break; case ';': low = high = FEAT_GLYPH; break; case ',': low = high = FEAT_OPEN; break; case 'x': low = high = FEAT_BROKEN; break; case '<': low = high = FEAT_LESS; break; case '>': low = high = FEAT_MORE; break; case '@': low = FEAT_SHOP_HEAD; high = FEAT_SHOP_TAIL; break; case '^': low = FEAT_TRAP_HEAD; high = FEAT_TRAP_TAIL; break; case '+': low = FEAT_DOOR_HEAD; high = FEAT_DOOR_TAIL; break; case 's': low = high = FEAT_SECRET; break; case ':': low = high = FEAT_RUBBLE; break; case 'm': low = high = FEAT_MAGMA; break; case 'q': low = high = FEAT_QUARTZ; break; case 'r': low = high = FEAT_QUARTZ_H; break; case 'k': low = high = FEAT_MAGMA_K; break; case '&': low = high = FEAT_QUARTZ_K; break; case 'w': low = FEAT_WALL_EXTRA; high = FEAT_WALL_SOLID; break; case 'p': low = FEAT_PERM_EXTRA; high = FEAT_PERM_SOLID; break; default: low = high = 0x00; break; } /* Scan map */ for (y = 1; y <= AUTO_MAX_Y - 1; y++) { for (x = 1; x <= AUTO_MAX_X - 1; x++) { byte a = TERM_RED; borg_grid *ag = &borg_grids[y][x]; /* show only those grids */ if (!(ag->feat >= low && ag->feat <= high)) continue; /* Color */ if (borg_cave_floor_bold(y, x)) a = TERM_YELLOW; /* Display */ print_rel('*', a, y, x); } } /* Get keypress */ msg("Press any key."); message_flush(); /* Redraw map */ prt_map(); break; } /* Display Feature of a targetted grid */ case 'G': { int y = 1; int x = 1; s16b ty, tx; u16b mask; mask = borg_grids[y][x].feat; target_get(&tx, &ty); y = ty; x = tx; borg_note(format("Borg's Feat for grid (%d, %d) is %d, game Feat is %d", y,x,mask, cave->feat[y][x])); prt_map(); break; } /* Command: check "info" flags */ case 'i': { int x, y; u16b mask; /* Get a "Borg command", or abort */ if (!get_com("Borg command: Show grids: ", &cmd)) return; /* Extract a flag */ switch (cmd.code) { case '0': mask = 1 << 0; break; /* Mark */ case '1': mask = 1 << 1; break; /* Glow */ case '2': mask = 1 << 2; break; /* Dark */ case '3': mask = 1 << 3; break; /* Okay */ case '4': mask = 1 << 4; break; /* Lite */ case '5': mask = 1 << 5; break; /* View */ case '6': mask = 1 << 6; break; /* Temp */ case '7': mask = 1 << 7; break; /* Xtra */ case 'm': mask = BORG_MARK; break; case 'g': mask = BORG_GLOW; break; case 'd': mask = BORG_DARK; break; case 'o': mask = BORG_OKAY; break; case 'l': mask = BORG_LIGHT; break; case 'v': mask = BORG_VIEW; break; case 't': mask = BORG_TEMP; break; case 'x': mask = BORG_XTRA; break; default: mask = 0x000; break; } /* Scan map */ for (y = 1; y <= AUTO_MAX_Y - 1; y++) { for (x = 1; x <= AUTO_MAX_X - 1; x++) { byte a = TERM_RED; borg_grid *ag = &borg_grids[y][x]; /* Given mask, show only those grids */ if (mask && !(ag->info & mask)) continue; /* Given no mask, show unknown grids */ if (!mask && (ag->info & BORG_MARK)) continue; /* Color */ if (borg_cave_floor_bold(y, x)) a = TERM_YELLOW; /* Display */ print_rel('*', a, y, x); } } /* Get keypress */ msg("Press any key."); message_flush(); /* Redraw map */ prt_map(); break; } /* Display Info of a targetted grid */ case 'I': { int y = 1; int x = 1; s16b ty, tx; target_get(&tx, &ty); y = ty; x = tx; if (borg_grids[y][x].info & BORG_MARK) msg("Info for grid (%d, %d) is MARK", y,x); if (borg_grids[y][x].info & BORG_GLOW) msg("Info for grid (%d, %d) is GLOW", y,x); if (borg_grids[y][x].info & BORG_DARK) msg("Info for grid (%d, %d) is DARK", y,x); if (borg_grids[y][x].info & BORG_OKAY) msg("Info for grid (%d, %d) is OKAY", y,x); if (borg_grids[y][x].info & BORG_LIGHT) msg("Info for grid (%d, %d) is LITE", y,x); if (borg_grids[y][x].info & BORG_VIEW) msg("Info for grid (%d, %d) is VIEW", y,x); if (borg_grids[y][x].info & BORG_TEMP) msg("Info for grid (%d, %d) is TEMP", y,x); if (borg_grids[y][x].info & BORG_XTRA) msg("Info for grid (%d, %d) is XTRA", y,x); if (cave_isvault(cave, y, x)) msg("Info for grid (%d, %d) is ICKY", y,x); borg_note(format("Info for grid (%d, %d) is %d", y,x,cave->info[y][x])); prt_map(); break; } /* Command: check "avoidances" */ case 'a': case 'A': { int x, y, p; /* Scan map */ for (y = 1; y <= AUTO_MAX_Y - 1; y++) { for (x = 1; x <= AUTO_MAX_X - 1; x++) { byte a = TERM_RED; /* Obtain danger */ p = borg_danger(y, x, 1, TRUE, FALSE); /* Skip non-avoidances */ if (p < avoidance / 10) continue; /* Use colors for less painful */ if (p < avoidance / 2) a = TERM_ORANGE; if (p < avoidance / 4) a = TERM_YELLOW; if (p < avoidance / 6) a = TERM_GREEN; if (p < avoidance / 8) a = TERM_BLUE; /* Display */ print_rel('*', a, y, x); } } /* Get keypress */ msg("(%d,%d of %d,%d) Avoidance value %d.", c_y, c_x, Term->offset_y / PANEL_HGT,Term->offset_x / PANEL_WID,avoidance); message_flush(); /* Redraw map */ prt_map(); break; } /* Command: check previous steps */ case 'y': { int i; /* Scan map */ byte a = TERM_RED; /* Check for an existing step */ for (i = 0; i < track_step_num; i++) { /* Display */ print_rel('*', a, track_step_y[track_step_num-i], track_step_x[track_step_num-i]); msg("(-%d) Steps noted %d,%d", i,track_step_y[track_step_num-i], track_step_x[track_step_num-i]); message_flush(); print_rel('*', TERM_ORANGE, track_step_y[track_step_num-i], track_step_x[track_step_num-i]); } /* Redraw map */ prt_map(); break; } /* Command: show "monsters" */ case 'k': case 'K': { int i, n = 0; /* Scan the monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill = &borg_kills[i]; /* Still alive */ if (kill->r_idx) { int x = kill->x; int y = kill->y; /* Display */ print_rel('*', TERM_RED, y, x); /* Count */ n++; } } /* Get keypress */ msg("There are %d known monsters.", n); message_flush(); /* Redraw map */ prt_map(); break; } /* Command: show "objects" */ case 't': case 'T': { int i, n = 0; /* Scan the objects */ for (i = 1; i < borg_takes_nxt; i++) { borg_take *take = &borg_takes[i]; /* Still alive */ if (take->kind) { int x = take->x; int y = take->y; /* Display */ print_rel('*', TERM_RED, y, x); /* Count */ n++; } } /* Get keypress */ msg("There are %d known objects.", n); message_flush(); /* Redraw map */ prt_map(); break; } /* Command: debug -- current target flow */ case '%': { int x, y; int n_x; int n_y; s16b tx, ty; /* Determine "path" */ n_x = p_ptr->px; n_y = p_ptr->py; target_get(&tx, &ty); x = tx; y = ty; /* Borg's pathway */ while (1) { /* Display */ print_rel('*', TERM_RED, n_y, n_x); if (n_x == x && n_y == y) break; /* Calculate the new location */ mmove2(&n_y, &n_x, p_ptr->py, p_ptr->px, y, x); } msg("Borg's Targetting Path"); message_flush(); /* Determine "path" */ n_x = p_ptr->px; n_y = p_ptr->py; x = tx; y = ty; /* Real LOS */ project(-1, 0, y, x, 1, GF_MISSILE, PROJECT_BEAM); msg("Actual Targetting Path"); message_flush(); /* Redraw map */ prt_map(); break; } /* Display the intended path to the flow */ case '^': { int x, y; int o; int false_y, false_x; false_y = c_y; false_x = c_x; /* Continue */ for (o = 0; o < 250; o++) { int b_n = 0; int i, b_i = -1; int c, b_c; /* Flow cost of current grid */ b_c = borg_data_flow->data[c_y][c_x] * 10; /* Prevent loops */ b_c = b_c - 5; /* Look around */ for (i = 0; i < 8; i++) { /* Grid in that direction */ x = false_x + ddx_ddd[i]; y = false_y + ddy_ddd[i]; /* Flow cost at that grid */ c = borg_data_flow->data[y][x] * 10; /* Never backtrack */ if (c > b_c) continue; /* Notice new best value */ if (c < b_c) b_n = 0; /* Apply the randomizer to equivalent values */ if ((++b_n >= 2) && (randint0(b_n) != 0)) continue; /* Track it */ b_i = i; b_c = c; } /* Try it */ if (b_i >= 0) { /* Access the location */ x = false_x + ddx_ddd[b_i]; y = false_y + ddy_ddd[b_i]; /* Display */ print_rel('*', TERM_RED, y, x); /* Simulate motion */ false_y = y; false_x = x; } } print_rel('*', TERM_YELLOW, borg_flow_y[0], borg_flow_x[0]); msg("Probable Flow Path"); message_flush(); /* Redraw map */ prt_map(); break; } /* Command: debug -- danger of grid */ case '#': { int n; s16b ty, tx; target_get(&tx, &ty); /* Turns */ n = get_quantity("Quantity: ", 1); /* Danger of grid */ msg("Danger(%d,%d,%d) is %d", tx, ty, n, borg_danger(ty, tx, n, TRUE, FALSE)); break; } /* Command: Regional Fear Info*/ case '_': { int x, y, p; /* Scan map */ for (y = 1; y <= AUTO_MAX_Y - 1; y++) { for (x = 1; x <= AUTO_MAX_X - 1; x++) { byte a = TERM_RED; /* Obtain danger */ p = borg_fear_region[y/11][x/11]; /* Skip non-fears */ if (p < avoidance / 10) continue; /* Use colors = less painful */ if (p < avoidance / 2) a = TERM_ORANGE; if (p < avoidance / 4) a = TERM_YELLOW; if (p < avoidance / 6) a = TERM_GREEN; if (p < avoidance / 8) a = TERM_BLUE; /* Display */ print_rel('*', a, y, x); } } /* Get keypress */ msg("(%d,%d of %d,%d) Regional Fear.", c_y, c_x, Term->offset_y / PANEL_HGT,Term->offset_x / PANEL_WID); message_flush(); /* Redraw map */ prt_map(); /* Scan map */ for (y = 1; y <= AUTO_MAX_Y; y++) { for (x = 1; x <= AUTO_MAX_X; x++) { byte a = TERM_BLUE; /* Obtain danger */ p = borg_fear_monsters[y][x]; /* Skip non-fears */ if (p <= 0) continue; /* Color Defines */ if (p == 1) a = TERM_L_BLUE; /* Color Defines */ if (p < avoidance / 20 && p > 1) a = TERM_BLUE; /* Color Defines */ if (p < avoidance / 10 && p > avoidance / 20) a = TERM_GREEN; /* Color Defines */ if (p < avoidance / 4 && p > avoidance / 10) a = TERM_YELLOW; /* Color Defines */ if (p < avoidance / 2 && p > avoidance / 4) a = TERM_ORANGE; /* Color Defines */ if (p > avoidance / 2) a = TERM_RED; /* Display */ print_rel('*', a, y, x); } } /* Get keypress */ msg("(%d,%d of %d,%d) Monster Fear.", c_y, c_x, Term->offset_y / PANEL_HGT,Term->offset_x / PANEL_WID); message_flush(); /* Redraw map */ prt_map(); break; } /* Command: debug -- Power */ case 'p': case 'P': { s32b p; /* Examine the screen */ borg_update_frame(); /* Cheat the "equip" screen */ borg_cheat_equip(); /* Cheat the "inven" screen */ borg_cheat_inven(); /* Examine the screen */ borg_update(); /* Examine the inventory */ borg_object_star_id(); borg_notice(TRUE); /* Evaluate */ p = borg_power(); borg_notice_home(NULL, FALSE); /* Report it */ msg("Current Borg Power %ld", p); msg("Current Home Power %ld", borg_power_home()); break; } /* Command: Show time */ case '!': { s32b time = borg_t - borg_began; msg("time: (%d) ", time); time = (borg_time_town + (borg_t - borg_began)); msg("; from town (%d)", time); msg("; on this panel (%d)", time_this_panel); msg("; need inviso (%d)", need_see_inviso); break; } /* Command: LOS */ case '@': { int x, y; /* Scan map */ for (y = w_y; y < w_y + SCREEN_HGT; y++) { for (x = w_x; x < w_x + SCREEN_WID; x++) { byte a = TERM_RED; /* Obtain danger */ if (!borg_los(c_y,c_x, y, x)) continue; /* Display */ print_rel('*', a, y, x); } } /* Get keypress */ msg("Borg has Projectable to these places."); message_flush(); /* Scan map */ for (y = w_y; y < w_y + SCREEN_HGT; y++) { for (x = w_x; x < w_x + SCREEN_WID; x++) { byte a = TERM_YELLOW; /* Obtain danger */ if (!borg_projectable_dark(c_y, c_x, y, x)) continue; /* Display */ print_rel('*', a, y, x); } } msg("Borg has Projectable Dark to these places."); message_flush(); /* Scan map */ for (y = w_y; y < w_y + SCREEN_HGT; y++) { for (x = w_x; x < w_x + SCREEN_WID; x++) { byte a = TERM_GREEN; /* Obtain danger */ if (!borg_los(c_y, c_x, y, x)) continue; /* Display */ print_rel('*', a, y, x); } } msg("Borg has LOS to these places."); message_flush(); /* Redraw map */ prt_map(); break; } /* command: debug -- change max depth */ case '1': { int new_borg_skill; /* Get the new max depth */ new_borg_skill = get_quantity("Enter new Max Depth: ", MAX_DEPTH - 1); /* Allow user abort */ if (new_borg_skill >= 0) { p_ptr->max_depth = new_borg_skill; borg_skill[BI_MAXDEPTH] = new_borg_skill; } break; } /* command: debug -- allow borg to stop */ case 'q': { int new_borg_stop_dlevel = 127; int new_borg_stop_clevel = 51; /* Get the new max depth */ new_borg_stop_dlevel = get_quantity("Enter new auto-stop dlevel: ", MAX_DEPTH -1); new_borg_stop_clevel = get_quantity("Enter new auto-stop clevel: ", 51); get_com("Stop when Morgoth Dies? (y or n)? ", &cmd); borg_stop_dlevel = new_borg_stop_dlevel; borg_stop_clevel = new_borg_stop_clevel; if (cmd.code =='n' || cmd.code =='N' ) borg_stop_king = FALSE; break; } /* command: money Scum-- allow borg to stop when he gets a certain amount of money*/ case 'm': { int new_borg_money_scum_amount = 0; /* report current status */ msg("money Scumming for %d, I need %d more.", borg_money_scum_amount, borg_money_scum_amount - borg_gold); /* Get the new amount */ new_borg_money_scum_amount = get_quantity("Enter new dollar amount for money scumming (0 for no scumming):", borg_money_scum_amount); borg_money_scum_amount = new_borg_money_scum_amount; break; } /* Command: HACK debug -- preparation for level */ case '2': { int i=0; /* Extract some "hidden" variables */ borg_cheat_equip(); borg_cheat_inven(); /* Examine the screen */ borg_update_frame(); borg_update(); /* Examine the inventory */ borg_object_star_id(); borg_notice(TRUE); borg_notice_home(NULL, FALSE); /* Dump prep codes */ for (i = 1; i <= 101; i++) { /* Dump fear code*/ if ((char*)NULL != borg_prepared(i)) break; } borg_slow_return = TRUE; msg("Max Level: %d Prep'd For: %d Reason: %s", borg_skill[BI_MAXDEPTH], i-1, borg_prepared(i) ); borg_slow_return = FALSE; if (borg_ready_morgoth == 1) { msg("You are ready for the big fight!!"); } else if (borg_ready_morgoth == 0) { msg("You are NOT ready for the big fight!!"); } else if (borg_ready_morgoth == -1) { msg("No readiness check done."); } break; } /* Command: debug -- stat information */ case '3': { int i; for (i =0; i < 6; i++) { borg_note(format("stat # %d, is: %d", i, my_stat_cur[i])); } #if 0 artifact_type *a_ptr; int i; for (i = 0; i < z_info->a_max; i++) { a_ptr = &a_info[i]; borg_note(format("(%d) %d, %d (act:%d)",i, a_ptr->name, a_ptr->text, a_ptr->activation)); } #endif break; } /* Command: List the swap weapon and armour */ case 'w': case 'W': { borg_item *item; /* Cheat the "equip" screen */ borg_cheat_equip(); /* Cheat the "inven" screen */ borg_cheat_inven(); /* Examine the inventory */ borg_notice(TRUE); borg_notice_home(NULL, FALSE); /* Check the power */ borg_power(); /* Examine the screen */ borg_update(); /* Examine the screen */ borg_update_frame(); /* note the swap items */ item = &borg_items[weapon_swap]; msg("Swap Weapon: %s, value= %d", item->desc, weapon_swap_value); item = &borg_items[armour_swap]; msg("Swap Armour: %s, value= %d", item->desc, armour_swap_value); break; } case 'd': { int ii= 1; /* Save the screen */ Term_save(); /* Dump the spells */ if (p_ptr->class->spell_book) { int i,j; for (i = 0; i < 9; i++ ) { /* Clear the screen */ Term_clear(); ii = 2; Term_putstr(1, ii, -1, TERM_WHITE, "[ Spells ]."); for (j = 0; j < 9; j++) { borg_magic *as = &borg_magics[i][j]; char *legal; int failpercent = 0; if (as->level <99) { if (p_ptr->class->spell_book == TV_PRAYER_BOOK) { legal = (borg_prayer_legal(i, j) ? "Legal" : "Not Legal "); failpercent = (borg_prayer_fail_rate(i, j)); } else { legal = (borg_spell_legal(i, j) ? "legal" : "Not Legal "); failpercent = (borg_spell_fail_rate(i,j)); } Term_putstr(1, ii++, -1, TERM_WHITE, format("%s, %s, attempted %d times, fail rate:%d",as->name, legal, as->times, failpercent)); } } get_com("Exam spell books. Press any key for next book.", &cmd); } /* dumps */ } /* spells */ /* Restore the screen */ Term_load(); /* Done */ return; } /* dump borg 'has' information */ case 'h': case 'H': { int item, to; /* Get a "Borg command", or abort */ if (!get_com("Dynamic Borg Has What: ((i)nv/(w)orn/(a)rtifact/(s)kill) ", &cmd)) return; switch (cmd.code) { case 'i': case 'I': item = 0; to = z_info->k_max; break; case 'w': case 'W': item = z_info->k_max; to = z_info->k_max + z_info->k_max; break; case 'a': case 'A': item = z_info->k_max + z_info->k_max; to = z_info->k_max + z_info->k_max + z_info->a_max; break; default: item = z_info->k_max + z_info->k_max + z_info->a_max; to = z_info->k_max + z_info->k_max + z_info->a_max + BI_MAX; break; } /* Cheat the "equip" screen */ borg_cheat_equip(); /* Cheat the "inven" screen */ borg_cheat_inven(); /* Examine the screen */ borg_update_frame(); /* Examine the screen */ borg_update(); /* Examine the inventory */ borg_object_star_id(); borg_notice(TRUE); borg_notice_home(NULL, FALSE); for (;item < to; item++) { switch (cmd.code) { case 'i': case 'I': borg_note(format("Item%03d value= %d.", item, borg_has[item])); break; case 'w': case 'W': borg_note(format("WItem%03d value= %d.", item-z_info->k_max, borg_has[item])); break; case 'a': case 'A': borg_note(format("Artifact%03d value= %d.", item-z_info->k_max-z_info->k_max, borg_has[item])); break; default: borg_note(format("skill %d (%s) value= %d.",item, prefix_pref[item - z_info->k_max - z_info->k_max - z_info->a_max], borg_has[item])); break; } } /* note the completion. */ msg("Borg_has[] dump complete. Examine Log. "); break; } /* Version of the game */ case 'v': case 'V': { msg("APWBorg Version: %s",borg_engine_date); break; } /* Command: Display all known info on item */ case 'o': case 'O': { int n =0; object_type *item2; /* use this item */ // XXX replace this with an item selector n = get_quantity("Which item?", 1); /* Cheat the "equip" screen */ borg_cheat_equip(); /* Cheat the "inven" screen */ borg_cheat_inven(); /* Examine the inventory */ borg_notice(TRUE); borg_notice_home(NULL, FALSE); /* Check the power */ borg_power(); /* Examine the screen */ borg_update(); /* Examine the screen */ borg_update_frame(); /* Save the screen */ Term_save(); /* get the item */ item2 = &p_ptr->inventory[n]; /* Display the special screen */ borg_display_item(item2, n); /* pause for study */ msg("Borg believes: "); message_flush(); /* Restore the screen */ Term_load(); break; } /* Command: Resurrect Borg */ case 'R': { /* Confirm it */ get_com("Are you sure you want to Respawn this borg? (y or n)? ", &cmd); if (cmd.code =='y' || cmd.code =='Y' ) { resurrect_borg(); } break; } /* Command: Restock the Stores */ case 'r': { int n; /* Confirm it */ get_com("Are you sure you want to Restock the stores? (y or n)? ", &cmd); if (cmd.code =='y' || cmd.code =='Y' ) { /* Message */ msg("Updating Shops..."); /* Maintain each shop (except home) */ for (n = 0; n < MAX_STORES; n++) { /* Skip the home */ if (n == STORE_HOME) continue; /* Maintain */ store_maint(&stores[n]); } } break; } case ';': { int glyph_check; byte a = TERM_RED; for (glyph_check = 0; glyph_check < track_glyph_num; glyph_check++) { /* Display */ print_rel('*', a, track_glyph_y[glyph_check], track_glyph_x[glyph_check]); msg("Borg has Glyph (%d)noted.", glyph_check); message_flush(); } /* Get keypress */ } /* Oops */ default: { /* Message */ msg("That is not a legal Borg command."); break; } } } #ifdef MACINTOSH static int HACK = 0; #endif angband-3.5.1/src/borg/borg1.c0000644000175000017500000017333712456456606015354 0ustar chriscchrisc/* File: borg1.c */ /* Purpose: Low level stuff for the Borg -BEN- */ #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #ifdef ALLOW_BORG #include "borg1.h" /* * This file contains various low level variables and routines. */ /* Date of the last change */ char borg_engine_date[] = __DATE__; /* * Borg information, ScreenSaver or continual play mode; */ int borg_respawn_race; int borg_respawn_class; int borg_respawn_str; int borg_respawn_int; int borg_respawn_wis; int borg_respawn_dex; int borg_respawn_con; int borg_dump_level; int borg_save_death; bool borg_respawn_winners; int borg_delay_factor; /* dynamic borg stuff */ bool borg_uses_swaps; bool borg_uses_calcs = TRUE; bool borg_worships_damage; bool borg_worships_speed; bool borg_worships_hp; bool borg_worships_mana; bool borg_worships_ac; bool borg_worships_gold; bool borg_plays_risky; bool borg_slow_optimizehome; bool borg_scums_uniques; bool borg_kills_uniques; int borg_chest_fail_tolerance; s32b borg_money_scum_amount; int borg_money_scum_who; int borg_money_scum_ware; bool borg_self_scum; /* borg scums on his own */ bool borg_lunal_mode; /* see borg.txt */ bool borg_self_lunal; /* borg allowed to do this himself */ bool borg_verbose; bool borg_munchkin_start; bool borg_munchkin_mode; int borg_munchkin_level; int borg_munchkin_depth; int borg_enchant_limit; /* HACK... this should really be a parm into borg_prepared */ /* I am just being lazy */ bool borg_slow_return = FALSE; req_item **borg_required_item; int *n_req; power_item **borg_power_item; int *n_pwr; int *borg_has; int *borg_has_on; int *borg_artifact; int *borg_skill; int size_depth; int size_obj; int *formula[1000]; const char *prefix_pref[] = { /* personal attributes */ "_STR", "_INT", "_WIS", "_DEX", "_CON", "_CSTR", "_CINT", "_CWIS", "_CDEX", "_CCON", "_SSTR", "_SINT", "_SWIS", "_SDEX", "_SCON", "_LIGHT", "_CURHP", "_MAXHP", "_CURSP", "_MAXSP", "_ADJSP", "_SFAIL1", "_SFAIL2", "_CLEVEL", "_MAXCLEVEL", "_ESP", "_CURLITE", "_RECALL", "_FOOD", /* 29 */ "_SPEED", "_SDIG", "_FEATH", "_REG", "_SINV", "_INFRA", "_DIS", "_DEV", "_SAV", "_STL", "_SRCH", "_SERCHFREQ", "_THN", "_THB", "_THT", "_DIG", "_IFIRE", "_IACID", "_ICOLD", "_IELEC", "_IPOIS", "_TRFIRE", "_TRCOLD", "_TRACID", "_TRPOIS", "_TRELEC", "_RFIRE", "_RCOLD", "_RELEC", "_RACID", "_RPOIS", "_RFEAR", "_RLITE", "_RDARK", "_RBLIND", "_RCONF", "_RSND", "_RSHRD", "_RNXUS", "_RNTHR", "_RKAOS", "_RDIS", "_HLIFE", "_FRACT", "_SRFIRE", /* same as without S but includes swap */ "_SRCOLD", "_SRELEC", "_SRACID", "_SRPOIS", "_SRFEAR", "_SRLITE", "_SRDARK", "_SRBLIND", "_SRCONF", "_SRSND", "_SRSHRD", "_SRNXUS", "_SRNTHR", "_SRKAOS", "_SRDIS", "_SHLIFE", "_SFRACT", /* random extra variable */ "_DEPTH", /* current depth being tested */ "_CDEPTH", /* borgs current depth */ "_MAXDEPTH", /* recall depth */ "_KING", /* borg has won */ /* player state things */ "_ISWEAK", "_ISHUNGRY", "_ISFULL", "_ISGORGED", "_ISBLIND", "_ISAFRAID", "_ISCONFUSED", "_ISPOISONED", "_ISCUT", "_ISSTUN", "_ISHEAVYSTUN", "_ISPARALYZED", "_ISIMAGE", "_ISFORGET", "_ISENCUMB", "_ISSTUDY", "_ISSEARCHING", "_ISFIXLEV", "_ISFIXEXP", "_ISFIXSTR", "_ISFIXINT", "_ISFIXWIS", "_ISFIXDEX", "_ISFIXCON", "_ISFIXALL", /* some combat stuff */ "_ARMOR", "_TOHIT", /* base to hit, does not include weapon */ "_TODAM", /* base to damage, does not include weapon */ "_WTOHIT", /* weapon to hit */ "_WTODAM", /* weapon to damage */ "_BTOHIT", /* bow to hit */ "_BTODAM", /* bow to damage */ "_BLOWS", "_SHOTS", "_WMAXDAM", /* max damage per round with weapon (normal blow) */ /* Assumes you can enchant to +8 if you are level 25+ */ "_WBASEDAM",/* max damage per round with weapon (normal blow) */ /* Assumes you have no enchantment */ "_BMAXDAM", /* max damage per round with bow (normal hit) */ /* Assumes you can enchant to +8 if you are level 25+ */ "_HEAVYWEPON", "_HEAVYBOW", /* curses */ "_CRSTELE", "_CRSAGRV", "_CRSHPIMP", /* Impaired HP recovery */ "_CRSMPIMP", /* Impaired MP recovery */ "_CRSFEAR", /* Fear curse flag */ "_CRSFVULN", /* Vulnerable to fire */ "_CRSEVULN", /* Vulnerable to elec */ "_CRSCVULN", /* Vulnerable to Cold */ "_CRSAVULN", /* Vulnerable to Acid */ /* weapon attributes */ "_WSANIMAL", /* WS = weapon slays */ "_WSEVIL", "_WSUNDEAD", "_WSDEMON", "_WSORC", "_WSTROLL", "_WSGIANT", "_WSDRAGON", "_WKUNDEAD", /* WK = weapon kills */ "_WKDEMON", "_WKDRAGON", "_WIMPACT", "_WBACID", /* WB = Weapon Branded With */ "_WBELEC", "_WBFIRE", "_WBCOLD", "_WBPOIS", /* amounts */ "_APHASE", "_ATELEPORT", /* all sources of teleport */ "_AESCAPE", /* Staff, artifact (can be used when blind/conf) */ "_FUEL", "_HEAL", "_EZHEAL", "_LIFE", "_ID", "_ASPEED", "_ASTFMAGI", /* Amount Staff Charges */ "_ASTFDEST", "_ATPORTOTHER", /* How many Teleport Other charges you got? */ "_AMISSILES", /* only ones for your current bow count */ "_ACUREPOIS", "_ADETTRAP", "_ADETDOOR", "_ADETEVIL", "_AMAGICMAP", "_ALITE", "_ARECHARGE", "_APFE", /* Protection from Evil */ "_AGLYPH", /* Rune Protection */ "_ACCW", /* CCW potions (just because we use it so often) */ "_ACSW", /* CSW potions (+ CLW if cut) */ "_ACLW", "_ARESHEAT", /* potions of res heat */ "_ARESCOLD", /* pot of res cold */ "_ARESPOIS", /* Potions of Res Poison */ "_ATELEPORTLVL", /* scroll of teleport level */ "_AHWORD", /* Holy Word prayer Legal*/ "_ADETONATE", /* Potion of Detonation */ "_AMASSBAN", /* ?Mass Banishment */ "_ASHROOM", /* Number of cool mushrooms */ "_AROD1", /* Attack rods */ "_AROD2", /* Attack rods */ "_DINV", /* See Inv Spell is Legal */ NULL }; /* * Some variables */ bool borg_active; /* Actually active */ bool borg_resurrect = FALSE; /* continous play mode */ bool borg_cancel; /* Being cancelled */ char genocide_target; /* identity of the poor unsuspecting soul */ int zap_slot; /* slot of a wand/staff---to avoid a game bug*/ bool borg_casted_glyph; /* because we dont have a launch anymore */ int borg_stop_dlevel = -1; int borg_stop_clevel = -1; int borg_no_deeper = 127; bool borg_stop_king = TRUE; bool borg_dont_react = FALSE; int successful_target = 0; int sold_item_tval[10]; int sold_item_sval[10]; int sold_item_pval[10]; int sold_item_store[10]; int sold_item_num = -1; int sold_item_nxt = 0; int bought_item_tval[10]; int bought_item_sval[10]; int bought_item_pval[10]; int bought_item_store[10]; int bought_item_num = -1; int bought_item_nxt = 0; int borg_numb_live_unique; int borg_living_unique_index; int borg_unique_depth; /* * Various silly flags */ bool borg_flag_save = FALSE; /* Save savefile at each level */ bool borg_flag_dump = FALSE; /* Save savefile at each death */ bool borg_save = FALSE; /* do a save next level */ bool borg_graphics = FALSE; /* rr9's graphics */ bool borg_confirm_target = FALSE; /* emergency spell use */ bool borg_scumming_pots = TRUE; /* Borg will quickly store pots in home */ /* * Use a simple internal random number generator */ bool borg_rand_quick; /* Save system setting */ u32b borg_rand_value; /* Save system setting */ u32b borg_rand_local; /* Save personal setting */ /* * Hack -- Time variables */ s16b borg_t = 0L; /* Current "time" */ s16b borg_t_morgoth = 0L; /* Last time I saw Morgoth */ s16b need_see_inviso = 0; /* cast this when required */ s16b borg_see_inv = 0; bool need_shift_panel = FALSE; /* to spot offscreens */ s16b when_shift_panel = 0L; s16b time_this_panel = 0L; /* Current "time" on current panel*/ bool vault_on_level; /* Borg will search for a vault */ int unique_on_level; bool scaryguy_on_level; /* flee from certain guys */ bool morgoth_on_level; bool borg_morgoth_position; int borg_t_antisummon; /* Timestamp when in a AS spot */ bool borg_as_position; /* Sitting in an anti-summon corridor */ bool borg_digging; /* used in Anti-summon corridor */ bool breeder_level = FALSE; /* Borg will shut door */ s16b old_depth = 128; s16b borg_respawning = 0; s16b borg_no_retreat= 0; /* * Hack -- Other time variables */ s16b when_call_LIGHT; /* When we last did call light */ s16b when_wizard_LIGHT; /* When we last did wizard light */ s16b when_detect_traps; /* When we last detected traps */ s16b when_detect_doors; /* When we last detected doors */ s16b when_detect_walls; /* When we last detected walls */ s16b when_detect_evil; /* When we last detected monsters or evil */ s16b when_last_kill_mult = 0; /* When a multiplier was last killed */ bool my_need_alter; /* incase i hit a wall or door */ bool my_no_alter; /* */ bool my_need_redraw; /* incase i hit a wall or door */ bool borg_attempting_refresh_resist = FALSE; /* for the Resistance spell */ /* * Some information */ s16b goal; /* Goal type */ bool goal_rising; /* Currently returning to town */ bool goal_leaving; /* Currently leaving the level */ bool goal_fleeing; /* Currently fleeing the level */ bool goal_fleeing_lunal; /* Fleeing level while in lunal Mode */ bool goal_fleeing_munchkin; /* Fleeing level while in munchkin Mode */ bool borg_fleeing_town; /* Currently fleeing the level to return to town */ bool goal_ignoring; /* Currently ignoring monsters */ int goal_recalling; /* Currently waiting for recall, guessing the turns left */ bool goal_less; /* return to, but dont use, the next up stairs */ s16b borg_times_twitch; /* how often twitchy on this level */ s16b borg_escapes; /* how often teleported on this level */ bool stair_less; /* Use the next "up" staircase */ bool stair_more; /* Use the next "down" staircase */ s32b borg_began; /* When this level began */ s32b borg_time_town; /* how long it has been since I was in town */ s16b avoidance = 0; /* Current danger thresh-hold */ bool borg_failure; /* Notice failure */ bool borg_simulate; /* Simulation flag */ bool borg_attacking; /* Simulation flag */ bool borg_offsetting; /* offset ball attacks */ bool borg_completed; /* Completed the level */ bool borg_on_upstairs; /* used when leaving a level */ bool borg_on_dnstairs; /* used when leaving a level */ bool borg_needs_searching; /* borg will search with each step */ s16b borg_oldchp; /* hit points last game turn */ s16b borg_oldcsp; /* mana points last game turn */ /* defence flags */ bool borg_prot_from_evil; bool borg_speed; bool borg_bless; bool borg_hero; bool borg_berserk; s16b borg_game_ratio; /* the ratio of borg time to game time */ s16b borg_resistance; /* borg is Resistant to all elements */ s16b borg_no_rest_prep; /* borg wont rest for a few turns */ bool borg_shield; bool borg_on_glyph; /* borg is standing on a glyph of warding */ bool borg_create_door; /* borg is going to create doors */ bool borg_sleep_spell; bool borg_sleep_spell_ii; bool borg_slow_spell; /* borg is about to cast the spell */ bool borg_confuse_spell; bool borg_fear_mon_spell; /* * Current shopping information */ bool borg_in_shop = FALSE; /* True if the borg is inside of a store */ s16b goal_shop = -1; /* Next shop to visit */ s16b goal_ware = -1; /* Next item to buy there */ s16b goal_item = -1; /* Next item to sell there */ int borg_food_onsale = -1; /* Are shops selling food? */ int borg_fuel_onsale = -1; /* Are shops selling fuel? */ bool borg_needs_quick_shopping = FALSE; /* Needs to buy without browsing all shops */ s16b borg_best_fit_item = -1; /* Item to be worn. Index used to note which item not to sell */ int borg_best_item = -1; /* Attempting to wear a best fit item */ /* VERSION_STRING == "3.2.0" */ char shop_orig[28] = "acfhjmnoqruvyz13456790ABDFGH"; char shop_rogue[28] = "abcfmnoqrtuvyz13456790ABDFGH"; byte borg_nasties_num = 7; /* Current size of the list */ byte borg_nasties_count[7]; char borg_nasties[7] = "ZAVULWD"; /* Order of Nastiness. Hounds < Demons < Wyrms */ byte borg_nasties_limit[7] = {20, 20, 10, 10, 10, 10, 10}; /* * Location variables */ int w_x; /* Current panel offset (X) */ int w_y; /* Current panel offset (Y) */ int morgy_panel_y; int morgy_panel_x; int borg_target_y; int borg_target_x; /* Current targetted location */ int c_x; /* Current location (X) */ int c_y; /* Current location (Y) */ int g_x; /* Goal location (X) */ int g_y; /* Goal location (Y) */ /* BIG HACK! Assume only 10 cursed artifacts */ int bad_obj_x[50]; /* Dropped cursed artifact at location (X) */ int bad_obj_y[50]; /* Dropped cursed artifact at location (Y) */ int bad_obj_cnt; /* Count marker for quantity of bad objects */ /* * Some estimated state variables */ s16b my_stat_max[6]; /* Current "maximal" stat values */ s16b my_stat_cur[6]; /* Current "natural" stat values */ s16b my_stat_use[6]; /* Current "resulting" stat values */ s16b my_stat_ind[6]; /* Current "additions" to stat values */ bool my_need_stat_check[6]; /* do I need to check my stats? */ s16b my_stat_add[6]; /* additions to stats This will allow upgrading of */ /* equiptment to allow a ring of int +4 to be traded */ /* for a ring of int +6 even if maximized to allow a */ /* later swap to be better. */ s16b home_stat_add[6]; int weapon_swap; /* location of my swap weapon */ int armour_swap; /* my swap of armour */ /* a 3 state boolean */ /*-1 = not cursed, no help needed for it */ /* 0 = light curse, needs light remove curse spell */ /* 1 = heavy curse, needs heavy remove curse spell */ int decurse_weapon_swap; /* my swap is great, except its cursed */ int enchant_weapon_swap_to_h; /* my swap is great, except its cursed */ int enchant_weapon_swap_to_d; /* my swap is great, except its cursed */ int decurse_armour_swap; /* my swap is great, except its cursed */ int enchant_armour_swap_to_a; /* my swap is great, except its cursed */ bool borg_wearing_cursed; s32b weapon_swap_value; s32b armour_swap_value; s16b weapon_swap_digger; byte weapon_swap_slay_animal; byte weapon_swap_slay_evil; byte weapon_swap_slay_undead; byte weapon_swap_slay_demon; byte weapon_swap_slay_orc; byte weapon_swap_slay_troll; byte weapon_swap_slay_giant; byte weapon_swap_slay_dragon; byte weapon_swap_kill_undead; byte weapon_swap_kill_demon; byte weapon_swap_kill_dragon; byte weapon_swap_impact; byte weapon_swap_brand_acid; byte weapon_swap_brand_elec; byte weapon_swap_brand_fire; byte weapon_swap_brand_cold; byte weapon_swap_brand_pois; byte weapon_swap_see_infra; byte weapon_swap_slow_digest; byte weapon_swap_aggravate; byte weapon_swap_teleport; byte weapon_swap_regenerate; byte weapon_swap_telepathy; byte weapon_swap_LIGHT; byte weapon_swap_see_invis; byte weapon_swap_ffall; byte weapon_swap_free_act; byte weapon_swap_hold_life; byte weapon_swap_immune_fire; byte weapon_swap_immune_acid; byte weapon_swap_immune_cold; byte weapon_swap_immune_elec; byte weapon_swap_resist_acid; byte weapon_swap_resist_elec; byte weapon_swap_resist_fire; byte weapon_swap_resist_cold; byte weapon_swap_resist_pois; byte weapon_swap_resist_conf; byte weapon_swap_resist_sound; byte weapon_swap_resist_LIGHT; byte weapon_swap_resist_dark; byte weapon_swap_resist_chaos; byte weapon_swap_resist_disen; byte weapon_swap_resist_shard; byte weapon_swap_resist_nexus; byte weapon_swap_resist_blind; byte weapon_swap_resist_neth; byte weapon_swap_resist_fear; byte armour_swap_slay_animal; byte armour_swap_slay_evil; byte armour_swap_slay_undead; byte armour_swap_slay_demon; byte armour_swap_slay_orc; byte armour_swap_slay_troll; byte armour_swap_slay_giant; byte armour_swap_slay_dragon; byte armour_swap_kill_undead; byte armour_swap_kill_demon; byte armour_swap_kill_dragon; byte armour_swap_impact; byte armour_swap_brand_acid; byte armour_swap_brand_elec; byte armour_swap_brand_fire; byte armour_swap_brand_cold; byte armour_swap_brand_pois; byte armour_swap_see_infra; byte armour_swap_slow_digest; byte armour_swap_aggravate; byte armour_swap_teleport; byte armour_swap_regenerate; byte armour_swap_telepathy; byte armour_swap_LIGHT; byte armour_swap_see_invis; byte armour_swap_ffall; byte armour_swap_free_act; byte armour_swap_hold_life; byte armour_swap_immune_fire; byte armour_swap_immune_acid; byte armour_swap_immune_cold; byte armour_swap_immune_elec; byte armour_swap_resist_acid; byte armour_swap_resist_elec; byte armour_swap_resist_fire; byte armour_swap_resist_cold; byte armour_swap_resist_pois; byte armour_swap_resist_conf; byte armour_swap_resist_sound; byte armour_swap_resist_LIGHT; byte armour_swap_resist_dark; byte armour_swap_resist_chaos; byte armour_swap_resist_disen; byte armour_swap_resist_shard; byte armour_swap_resist_nexus; byte armour_swap_resist_blind; byte armour_swap_resist_neth; byte armour_swap_resist_fear; byte my_ammo_tval; /* Ammo -- "tval" */ byte my_ammo_sides; /* Ammo -- "sides" */ s16b my_ammo_power; /* Shooting multipler */ s16b my_need_enchant_to_a; /* Need some enchantment */ s16b my_need_enchant_to_h; /* Need some enchantment */ s16b my_need_enchant_to_d; /* Need some enchantment */ s16b my_need_brand_weapon; /* actually brand bolts */ s16b my_need_id; /* need to buy ID for an inventory item */ /* * Hack -- basic "power" */ s32b my_power; /* * Various "amounts" (for the player) */ s16b amt_food_hical; s16b amt_food_lowcal; s16b amt_slow_poison; s16b amt_cure_confusion; s16b amt_cure_blind; s16b amt_book[9]; s16b amt_add_stat[6]; s16b amt_inc_stat[6]; /* Stat potions */ s16b amt_fix_stat[7]; /* #7 is to fix all stats */ s16b amt_fix_exp; s16b amt_cool_staff; /* holiness - power staff */ s16b amt_cool_wand; /* # of charges on Wands which can be useful for attacks */ s16b amt_enchant_to_a; s16b amt_enchant_to_d; s16b amt_enchant_to_h; s16b amt_brand_weapon; /* brand bolts */ s16b amt_enchant_weapon; s16b amt_enchant_armor; s16b amt_digger; s16b amt_ego; /* * Various "amounts" (for the home) */ s16b num_food; s16b num_fuel; s16b num_mold; s16b num_ident; s16b num_recall; s16b num_phase; s16b num_escape; s16b num_tele_staves; s16b num_teleport; s16b num_berserk; s16b num_teleport_level; s16b num_recharge; s16b num_cure_critical; s16b num_cure_serious; s16b num_pot_rheat; s16b num_pot_rcold; s16b num_missile; s16b num_book[9]; s16b num_fix_stat[7]; /* #7 is to fix all stats */ s16b num_fix_exp; s16b num_mana; s16b num_heal; s16b num_heal_true; s16b num_ezheal; s16b num_ezheal_true; s16b num_life; s16b num_life_true; s16b num_pfe; s16b num_glyph; s16b num_mass_genocide; s16b num_speed; s16b num_detonate; /* Mushrooms */ s16b num_mush_second_sight; /* esp */ s16b num_mush_fast_recovery; /* cure stun, cut, pois, blind */ s16b num_mush_restoring; /* Restore All */ s16b num_mush_cure_mind; /* Cure confustion, Halluc, fear, tmp resist Conf */ s16b num_mush_emergency; /* Hallucinate, Oppose Fire, Oppose Cold, Heal 200 */ s16b num_mush_terror; /* Terror --give +5 speed boost */ s16b num_mush_stoneskin; /* StoneSkin */ s16b num_mush_debility; /* Mana Restore, temp loss of a stat (str/con) */ s16b num_mush_sprinting; /* Sprinting (speed +10) */ s16b num_mush_purging; /* Purging --Makes hungry, restore Str/Con, Cure Pois */ s16b num_enchant_to_a; s16b num_enchant_to_d; s16b num_enchant_to_h; s16b num_brand_weapon; /* brand bolts */ s16b num_genocide; s16b num_artifact; s16b num_ego; s16b home_slot_free; s16b home_damage; s16b num_duplicate_items; s16b num_slow_digest; s16b num_regenerate; s16b num_telepathy; s16b num_LIGHT; s16b num_see_inv; s16b num_invisible; /* */ s16b num_ffall; s16b num_free_act; s16b num_hold_life; s16b num_immune_acid; s16b num_immune_elec; s16b num_immune_fire; s16b num_immune_cold; s16b num_resist_acid; s16b num_resist_elec; s16b num_resist_fire; s16b num_resist_cold; s16b num_resist_pois; s16b num_resist_conf; s16b num_resist_sound; s16b num_resist_LIGHT; s16b num_resist_dark; s16b num_resist_chaos; s16b num_resist_disen; s16b num_resist_shard; s16b num_resist_nexus; s16b num_resist_blind; s16b num_resist_neth; s16b num_sustain_str; s16b num_sustain_int; s16b num_sustain_wis; s16b num_sustain_dex; s16b num_sustain_con; s16b num_sustain_all; s16b num_edged_weapon; s16b num_bad_gloves; s16b num_weapons; s16b num_bow; s16b num_rings; s16b num_neck; s16b num_armor; s16b num_cloaks; s16b num_shields; s16b num_hats; s16b num_gloves; s16b num_boots; /* * Hack -- extra state variables */ int borg_feeling = 0; /* Current level "feeling" */ /* * Hack -- current shop index */ s16b shop_num = -1; /* Current shop index */ /* * State variables extracted from the screen */ s32b borg_exp; /* Current experience */ s32b borg_gold; /* Current gold */ int borg_stat[6]; /* Current stat values */ int borg_book[9]; /* Current book slots */ /* * State variables extracted from the inventory/equipment */ int borg_cur_wgt; /* Current weight */ /* * Constant state variables */ int borg_race; /* Player race */ int borg_class; /* Player class */ /* * Hack -- access the class/race records */ player_magic *mb_ptr; /* Player magic info */ /* * Number of turns to step for (zero means forever) */ u16b borg_step = 0; /* Step count (if any) */ /* * Status message search string */ char borg_match[128] = "plain gold ring"; /* Search string */ /* * Hack -- the detection arrays */ bool borg_detect_wall[6][18]; bool borg_detect_trap[6][18]; bool borg_detect_door[6][18]; bool borg_detect_evil[6][18]; /* * Locate the store doors */ int *track_shop_x; int *track_shop_y; /* * Track "stairs up" */ s16b track_less_num; s16b track_less_size; int *track_less_x; int *track_less_y; /* * Track "stairs down" */ s16b track_more_num; s16b track_more_size; int *track_more_x; int *track_more_y; /* * Track glyphs */ s16b track_glyph_num; s16b track_glyph_size; int *track_glyph_x; int *track_glyph_y; bool borg_needs_new_sea; /* Environment changed. Need to make a new Sea of Runes for Morgy */ /* * Track the items worn to avoid loops */ s16b track_worn_num; s16b track_worn_size; byte *track_worn_name1; s16b track_worn_time; /* * ghijk The borg will use the following ddx and ddy to search * d827a for a suitable grid in an open room. * e4@3b * f615c * lmnop 24 grids * */ const s16b borg_ddx_ddd[24] = { 0, 0, 1, -1, 1, -1, 1, -1, 2, 2, 2, -2, -2, -2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2}; const s16b borg_ddy_ddd[24] = { 1, -1, 0, 0, 1, 1, -1, -1, -1, 0, 1, -1, 0, 1, -2, -2, -2, -2, -2, 2, 2, 2, 2, 2}; /* * Track Steps */ s16b track_step_num; s16b track_step_size; int *track_step_x; int *track_step_y; /* * Track closed doors which I have closed */ s16b track_door_num; s16b track_door_size; int *track_door_x; int *track_door_y; /* * Track closed doors which started closed */ s16b track_closed_num; s16b track_closed_size; int *track_closed_x; int *track_closed_y; /* * Track the mineral veins with treasure * */ s16b track_vein_num; s16b track_vein_size; int *track_vein_x; int *track_vein_y; /* * The object list. This list is used to "track" objects. */ s16b borg_takes_cnt; s16b borg_takes_nxt; borg_take *borg_takes; /* * The monster list. This list is used to "track" monsters. */ s16b borg_kills_cnt; s16b borg_kills_summoner; /* index of a summoner */ s16b borg_kills_nxt; borg_kill *borg_kills; /* a 3 state boolean */ /*-1 = not checked yet */ /* 0 = not ready */ /* 1 = ready */ int borg_ready_morgoth; /* * Hack -- extra fear per "region" */ u16b borg_fear_region[6][18]; /* * Hack -- extra fear per "region" induced from extra monsters. */ u16b borg_fear_monsters[AUTO_MAX_Y][AUTO_MAX_X]; /* * Hack -- count racial appearances per level */ s16b *borg_race_count; /* * Hack -- count racial kills (for uniques) */ s16b *borg_race_death; /* * The current map */ borg_grid *borg_grids[AUTO_MAX_Y]; /* The grids */ /* * Maintain a set of grids marked as "BORG_LIGHT" */ s16b borg_LIGHT_n = 0; byte borg_LIGHT_x[AUTO_LIGHT_MAX]; byte borg_LIGHT_y[AUTO_LIGHT_MAX]; /* * Maintain a set of grids marked as "BORG_GLOW" */ s16b borg_glow_n = 0; byte borg_glow_x[AUTO_LIGHT_MAX]; byte borg_glow_y[AUTO_LIGHT_MAX]; /* * Maintain a set of grids marked as "BORG_VIEW" */ s16b borg_view_n = 0; byte borg_view_x[AUTO_VIEW_MAX]; byte borg_view_y[AUTO_VIEW_MAX]; /* * Maintain a temporary set of grids * Used to store monster info. */ s16b borg_temp_n = 0; byte borg_temp_x[AUTO_TEMP_MAX]; byte borg_temp_y[AUTO_TEMP_MAX]; /* * Maintain a temporary set of grids * Used to store lit grid info */ s16b borg_temp_lit_n = 0; byte borg_temp_lit_x[AUTO_TEMP_MAX]; byte borg_temp_lit_y[AUTO_TEMP_MAX]; /* * Maintain a set of special grids used for Teleport Other */ s16b borg_tp_other_n = 0; byte borg_tp_other_x[255]; byte borg_tp_other_y[255]; int borg_tp_other_index[255]; byte offset_x; byte offset_y; /* * Maintain a circular queue of grids */ s16b borg_flow_n = 0; byte borg_flow_x[AUTO_FLOW_MAX]; byte borg_flow_y[AUTO_FLOW_MAX]; /* * Hack -- use "flow" array as a queue */ int flow_head = 0; int flow_tail = 0; /* * Some variables */ borg_data *borg_data_flow; /* Current "flow" data */ borg_data *borg_data_cost; /* Current "cost" data */ borg_data *borg_data_hard; /* Constant "hard" data */ borg_data *borg_data_know; /* Current "know" flags */ borg_data *borg_data_icky; /* Current "icky" flags */ /* * Strategy flags -- recalculate things */ bool borg_danger_wipe = FALSE; /* Recalculate danger */ bool borg_do_update_view = FALSE; /* Recalculate view */ bool borg_do_update_LIGHT = FALSE; /* Recalculate lite */ /* * Strategy flags -- examine the world */ bool borg_do_inven = TRUE; /* Acquire "inven" info */ bool borg_do_equip = TRUE; /* Acquire "equip" info */ bool borg_do_panel = TRUE; /* Acquire "panel" info */ bool borg_do_frame = TRUE; /* Acquire "frame" info */ bool borg_do_spell = TRUE; /* Acquire "spell" info */ byte borg_do_spell_aux = 0; /* Hack -- book for "borg_do_spell" */ bool borg_do_browse = 0; /* Acquire "store" info */ byte borg_do_browse_what = 0; /* Hack -- store for "borg_do_browse" */ byte borg_do_browse_more = 0; /* Hack -- pages for "borg_do_browse" */ /* * Strategy flags -- run certain functions */ bool borg_do_crush_junk = FALSE; bool borg_do_crush_hole = FALSE; bool borg_do_crush_slow = FALSE; /* am I fighting a unique? */ int borg_fighting_unique; bool borg_fighting_evil_unique; /* Need to know if evil for Priest Banishment */ /* am I fighting a summoner? */ bool borg_fighting_summoner; /* * Calculate "incremental motion". Used by project() and shoot(). * Assumes that (*y,*x) lies on the path from (y1,x1) to (y2,x2). */ /* changing this to be more like project_path */ /* note that this is much slower but much more accurate */ void mmove2(int *py, int *px, int y1, int x1, int y2, int x2) { int dy, dx; int sy, sx; int y, x; /* Scale factors */ int full, half; /* Fractions */ int frac; /* Slope */ int m; /* Distance */ int k = 0; /* Extract the distance travelled */ /* Analyze "dy" */ if (y2 < y1) { dy = (y1 - y2); sy = -1; } else { dy = (y2 - y1); sy = 1; } /* Analyze "dx" */ if (x2 < x1) { dx = (x1 - x2); sx = -1; } else { dx = (x2 - x1); sx = 1; } /* Paranoia -- Hack -- no motion */ if (!dy && !dx) return; /* Number of "units" in one "half" grid */ half = (dy * dx); /* Number of "units" in one "full" grid */ full = half << 1; /* First step is fixed */ if (*px == x1 && *py == y1) { if (dy > dx) { *py+=sy; return; } else if (dx > dy) { *px+=sx; return; } else { *px+=sx; *py+=sy; return; } } /* Move mostly vertically */ if (dy > dx) { k = dy; /* Start at tile edge */ frac = dx * dx; /* Let m = ((dx/dy) * full) = (dx * dx * 2) = (frac * 2) */ m = frac << 1; /* Start */ y = y1 + sy; x = x1; /* Create the projection path */ while (1) { if (x == *px && y == *py) k = 1; /* Slant */ if (m) { /* Advance (X) part 1 */ frac += m; /* Horizontal change */ if (frac >= half) { /* Advance (X) part 2 */ x += sx; /* Advance (X) part 3 */ frac -= full; } } /* Advance (Y) */ y += sy; /* Track distance */ k--; if (!k) { *px = x; *py = y; return; } } } /* Move mostly horizontally */ else if (dx > dy) { /* Start at tile edge */ frac = dy * dy; /* Let m = ((dy/dx) * full) = (dy * dy * 2) = (frac * 2) */ m = frac << 1; /* Start */ y = y1; x = x1 + sx; k = dx; /* Create the projection path */ while (1) { if (x == *px && y == *py) k = 1; /* Slant */ if (m) { /* Advance (Y) part 1 */ frac += m; /* Vertical change */ if (frac >= half) { /* Advance (Y) part 2 */ y += sy; /* Advance (Y) part 3 */ frac -= full; } } /* Advance (X) */ x += sx; /* Track distance */ k--; if (!k) { *px = x; *py = y; return; } } } /* Diagonal */ else { /* Start */ k = dy; y = y1 + sy; x = x1 + sx; /* Create the projection path */ while (1) { if (x == *px && y == *py) k=1; /* Advance (Y) */ y += sy; /* Advance (X) */ x += sx; /* Track distance */ k--; if (!k) { *px = x; *py = y; return; } } } } /* * Query the "attr/char" at a given location on the screen * We return "zero" if the given location was legal * * XXX XXX XXX We assume the given location is legal */ errr borg_what_char(int x, int y, byte *a, wchar_t *c) { /* Direct access XXX XXX XXX */ (*a) = (Term->scr->a[y][x]); (*c) = (Term->scr->c[y][x]); /* Success */ return (0); } /* * Query the "attr/chars" at a given location on the screen * * Note that "a" points to a single "attr", and "s" to an array * of "chars", into which the attribute and text at the given * location are stored. * * We will not grab more than "ABS(n)" characters for the string. * If "n" is "positive", we will grab exactly "n" chars, or fail. * If "n" is "negative", we will grab until the attribute changes. * * We automatically convert all "blanks" and "invisible text" into * spaces, and we ignore the attribute of such characters. * * We do not strip final spaces, so this function will very often * read characters all the way to the end of the line. * * We succeed only if a string of some form existed, and all of * the non-space characters in the string have the same attribute, * and the string was long enough. * * XXX XXX XXX We assume the given location is legal */ errr borg_what_text(int x, int y, int n, byte *a, char *s) { int i; wchar_t screen_str[1024]; int t_a; wchar_t t_c; int *aa; wchar_t *cc; int w, h; /* Current attribute */ int d_a = 0; /* Max length to scan for */ int m = ABS(n); /* Activate */ /* Do I need to get the right window? Term_activate(angband_term[0]); */ /* Obtain the size */ (void)Term_get_size(&w, &h); /* Hack -- Do not run off the screen */ if (x + m > w) m = w - x; /* Direct access XXX XXX XXX */ aa = &(Term->scr->a[y][x]); cc = &(Term->scr->c[y][x]); /* Grab the string */ for (i = 0; i < m; i++) { /* Access */ t_a = *aa++; t_c = *cc++; /* Handle spaces */ if ((t_c == L' ') || !t_a) { /* Save space */ screen_str[i] = L' '; } /* Handle real text */ else { /* Attribute ready */ if (d_a) { /* Verify the "attribute" (or stop) */ if (t_a != d_a) break; } /* Acquire attribute */ else { /* Save it */ d_a = t_a; } /* Save char */ screen_str[i] = t_c; } } /* Terminate the string */ screen_str[i] = L'\0'; /* Save the attribute */ (*a) = d_a; /* Convert back to a char string */ wcstombs(s, screen_str, ABS(n)+1); /* Too short */ if ((n > 0) && (i != n)) return (1); /* Success */ return (0); } /* * Log a message to a file */ void borg_info(char *what) { } /* * Memorize a message, Log it, Search it, and Display it in pieces */ void borg_note(char *what) { int j, n, i, k; int w, h, x, y; term *old = Term; /* Memorize it */ message_add(what, MSG_GENERIC); /* Log the message */ borg_info(what); /* Mega-Hack -- Check against the search string */ if (borg_match[0] && strstr(what, borg_match)) { /* Clean cancel */ borg_cancel = TRUE; } /* Mega-Hack -- Check against the swap loops */ if (strstr(what, "Best Combo") || strstr(what, "Taking off ")) { /* Tick the anti loop clock */ time_this_panel += 10; borg_note(format("# Anti-loop variable tick (%d).", time_this_panel)); } /* Scan windows */ for (j = 0; j < 8; j++) { if (!angband_term[j]) continue; /* Check flag */ if (!(op_ptr->window_flag[j] & PW_BORG_1)) continue; /* Activate */ Term_activate(angband_term[j]); /* Access size */ Term_get_size(&w, &h); /* Access cursor */ Term_locate(&x, &y); /* Erase current line */ Term_erase(0, y, 255); /* Total length */ n = strlen(what); /* Too long */ if (n > w - 2) { char buf[1024]; /* Split */ while (n > w - 2) { /* Default */ k = w - 2; /* Find a split point */ for (i = w / 2; i < w - 2; i++) { /* Pre-emptive split point */ if (isspace(what[i])) k = i; } /* Copy over the split message */ for (i = 0; i < k; i++) { /* Copy */ buf[i] = what[i]; } /* Indicate split */ buf[i++] = '\\'; /* Terminate */ buf[i] = '\0'; /* Show message */ Term_addstr(-1, TERM_WHITE, buf); /* Advance (wrap) */ if (++y >= h) y = 0; /* Erase next line */ Term_erase(0, y, 255); /* Advance */ what += k; /* Reduce */ n -= k; } /* Show message tail */ Term_addstr(-1, TERM_WHITE, what); /* Advance (wrap) */ if (++y >= h) y = 0; /* Erase next line */ Term_erase(0, y, 255); } /* Normal */ else { /* Show message */ Term_addstr(-1, TERM_WHITE, what); /* Advance (wrap) */ if (++y >= h) y = 0; /* Erase next line */ Term_erase(0, y, 255); } /* Flush output */ Term_fresh(); /* Use correct window */ Term_activate(old); } } /* * Abort the Borg, noting the reason */ void borg_oops(const char *what) { /* Stop processing */ borg_active = FALSE; /* Give a warning */ borg_note(format("# Aborting (%s).", what)); /* Forget borg keys */ borg_flush(); } /* * A Queue of keypresses to be sent */ static keycode_t *borg_key_queue; static s16b borg_key_head; static s16b borg_key_tail; /* * Add a keypress to the "queue" (fake event) */ errr borg_keypress(keycode_t k) { /* Hack -- Refuse to enqueue "nul" */ if (!k) return (-1); /* Hack -- note the keypress */ if(k >= 32 && k <= 126) { borg_note(format("& Key <%c> (0x%02X)", k, k)); } else { borg_note(format("& Key <0x%02X>", k)); } /* Store the char, advance the queue */ borg_key_queue[borg_key_head++] = k; /* Circular queue, handle wrap */ if (borg_key_head == KEY_SIZE) borg_key_head = 0; /* Hack -- Catch overflow (forget oldest) */ if (borg_key_head == borg_key_tail) borg_oops("overflow"); /* Hack -- Overflow may induce circular queue */ if (borg_key_tail == KEY_SIZE) borg_key_tail = 0; /* Success */ return (0); } /* * Add a keypress to the "queue" (fake event) */ errr borg_keypresses(const char *str) { const char *s; /* Enqueue them */ for (s = str; *s; s++) borg_keypress(*s); /* Success */ return (0); } /* * Get the next Borg keypress */ keycode_t borg_inkey(bool take) { int i; /* Nothing ready */ if (borg_key_head == borg_key_tail) return (0); /* Extract the keypress */ i = borg_key_queue[borg_key_tail]; /* Do not advance */ if (!take) return (i); /* Advance the queue */ borg_key_tail++; /* Circular queue requires wrap-around */ if (borg_key_tail == KEY_SIZE) borg_key_tail = 0; /* Return the key */ return (i); } /* * Get the next Borg keypress */ void borg_flush(void) { /* Simply forget old keys */ borg_key_tail = borg_key_head; } /* * Hack -- take a note later */ bool borg_tell(char *what) { /* Hack -- self note */ borg_keypress(':'); borg_keypresses(what); borg_keypress(KC_ENTER); /* Success */ return (TRUE); } /* * Attempt to change the borg's name */ bool borg_change_name(char *str) { /* Cancel everything */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); /* Character description */ borg_keypress('C'); /* Change the name */ borg_keypress('c'); /* Enter the new name */ borg_keypresses(str); /* End the name */ borg_keypress(KC_ENTER); /* Cancel everything */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); /* Success */ return (TRUE); } /* * Attempt to dump a character description file */ bool borg_dump_character(char *str) { /* Cancel everything */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); /* Character description */ borg_keypress('C'); /* Dump character file */ borg_keypress('f'); /* Enter the new name */ borg_keypresses(str); /* End the file name */ borg_keypress(KC_ENTER); /* Cancel everything */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); /* Success */ return (TRUE); } /* * Attempt to save the game */ bool borg_save_game(void) { /* Cancel everything */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); /* Save the game */ borg_keypress('^'); borg_keypress('S'); /* Cancel everything */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); /* Success */ return (TRUE); } /* * Update the Borg based on the current "frame" * * Assumes the Borg is actually in the dungeon. */ void borg_update_frame(void) { int i; player_state *state = &p_ptr->state; /* Assume level is fine */ borg_skill[BI_ISFIXLEV] = FALSE; /* Note "Lev" vs "LEV" */ if (p_ptr->lev < p_ptr->max_lev) borg_skill[BI_ISFIXLEV] = TRUE; /* Extract "LEVEL xxxxxx" */ borg_skill[BI_CLEVEL] = p_ptr->lev; /* cheat the max clevel */ borg_skill[BI_MAXCLEVEL] = p_ptr->max_lev; /* Note "Winner" */ borg_skill[BI_KING] = p_ptr->total_winner; /* Assume experience is fine */ borg_skill[BI_ISFIXEXP] = FALSE; /* Note "Exp" vs "EXP" and am I lower than level 50*/ if (p_ptr->exp < p_ptr->max_exp) { /* fix it if in town */ if (borg_skill[BI_CLEVEL] == 50 && borg_skill[BI_CDEPTH] == 0) borg_skill[BI_ISFIXEXP] = TRUE; /* dont worry about fixing it in the dungeon */ if (borg_skill[BI_CLEVEL] == 50 && borg_skill[BI_CDEPTH] >=1) borg_skill[BI_ISFIXEXP] = FALSE; /* Not at Max Level */ if (borg_skill[BI_CLEVEL] != 50) borg_skill[BI_ISFIXEXP] = TRUE; } /* Extract "EXP xxxxxxxx" */ borg_exp = p_ptr->exp; /* Extract "AU xxxxxxxxx" */ borg_gold = p_ptr->au; /* Extract "Fast (+x)" or "Slow (-x)" */ borg_skill[BI_SPEED] = state->speed; /* Check my float for decrementing variables */ if (borg_skill[BI_SPEED] >110) { borg_game_ratio = 100000/(((borg_skill[BI_SPEED]-110)*10)+100); } else { borg_game_ratio = 1000; } /* A quick cheat to see if I missed a message about my status on some timed spells */ if (!goal_recalling && p_ptr->word_recall ) goal_recalling = TRUE; if (!borg_prot_from_evil && p_ptr->timed[TMD_PROTEVIL]) borg_prot_from_evil = (p_ptr->timed[TMD_PROTEVIL] ? TRUE : FALSE); if (!borg_speed && (p_ptr->timed[TMD_FAST] || p_ptr->timed[TMD_SPRINT] || p_ptr->timed[TMD_TERROR])) (borg_speed = (p_ptr->timed[TMD_FAST] || p_ptr->timed[TMD_SPRINT] || p_ptr->timed[TMD_TERROR]) ? TRUE : FALSE); borg_skill[BI_TRACID] = (p_ptr->timed[TMD_OPP_ACID] ? TRUE : FALSE); borg_skill[BI_TRELEC] = (p_ptr->timed[TMD_OPP_ELEC] ? TRUE : FALSE); borg_skill[BI_TRFIRE] = (p_ptr->timed[TMD_OPP_FIRE] ? TRUE : FALSE); borg_skill[BI_TRCOLD] = (p_ptr->timed[TMD_OPP_COLD] ? TRUE : FALSE); borg_skill[BI_TRPOIS] = (p_ptr->timed[TMD_OPP_POIS] ? TRUE : FALSE); borg_bless = (p_ptr->timed[TMD_BLESSED] ? TRUE : FALSE); borg_shield = (p_ptr->timed[TMD_SHIELD] ? TRUE : FALSE); borg_shield = (p_ptr->timed[TMD_STONESKIN] ? TRUE : FALSE); borg_hero = (p_ptr->timed[TMD_HERO] ? TRUE : FALSE); borg_berserk = (p_ptr->timed[TMD_SHERO] ? TRUE : FALSE); /* if hasting, it doesn't count as 'borg_speed'. The speed */ /* gained from hasting is counted seperately. */ if (borg_speed) { if (p_ptr->timed[TMD_FAST] || p_ptr->timed[TMD_SPRINT]) borg_skill[BI_SPEED] -= 10; else if (p_ptr->timed[TMD_TERROR]) borg_skill[BI_SPEED] -=5; } /* Extract "Cur AC xxxxx" */ borg_skill[BI_ARMOR] = state->dis_ac + state->dis_to_a; /* Extract "Cur HP xxxxx" */ borg_skill[BI_CURHP] = p_ptr->chp; /* Extract "Max HP xxxxx" */ borg_skill[BI_MAXHP] = p_ptr->mhp; /* Extract "Cur SP xxxxx" (or zero) */ borg_skill[BI_CURSP] = p_ptr->csp; /* Extract "Max SP xxxxx" (or zero) */ borg_skill[BI_MAXSP] = p_ptr->msp; /* Clear all the "state flags" */ borg_skill[BI_ISWEAK] = borg_skill[BI_ISHUNGRY] = borg_skill[BI_ISFULL] = borg_skill[BI_ISGORGED] = FALSE; borg_skill[BI_ISBLIND] = borg_skill[BI_ISCONFUSED] = borg_skill[BI_ISAFRAID] = borg_skill[BI_ISPOISONED] = FALSE; borg_skill[BI_ISCUT] = borg_skill[BI_ISSTUN] = borg_skill[BI_ISHEAVYSTUN] = borg_skill[BI_ISIMAGE] = borg_skill[BI_ISSTUDY] = FALSE; borg_skill[BI_ISSEARCHING] = FALSE; borg_skill[BI_ISPARALYZED] = FALSE; borg_skill[BI_ISFORGET] = FALSE; /* Check for "Weak" */ if (p_ptr->food < PY_FOOD_WEAK) borg_skill[BI_ISWEAK] = borg_skill[BI_ISHUNGRY] = TRUE; /* Check for "Hungry" */ else if (p_ptr->food < PY_FOOD_ALERT) borg_skill[BI_ISHUNGRY] = TRUE; /* Check for "Normal" */ else if (p_ptr->food < PY_FOOD_FULL) /* Nothing */; /* Check for "Full" */ else if (p_ptr->food < PY_FOOD_MAX) borg_skill[BI_ISFULL] = TRUE; /* Check for "Gorged" */ else borg_skill[BI_ISGORGED] = borg_skill[BI_ISFULL] = TRUE; /* Check for "Blind" */ if (p_ptr->timed[TMD_BLIND]) borg_skill[BI_ISBLIND] = TRUE; /* Check for "Confused" */ if (p_ptr->timed[TMD_CONFUSED]) borg_skill[BI_ISCONFUSED] = TRUE; /* Check for "Afraid" */ if (p_ptr->timed[TMD_AFRAID]) borg_skill[BI_ISAFRAID] = TRUE; /* Check for "Poisoned" */ if (p_ptr->timed[TMD_POISONED]) borg_skill[BI_ISPOISONED] = TRUE; /* Check for any text */ if (p_ptr->timed[TMD_CUT]) borg_skill[BI_ISCUT] = TRUE; /* Check for Stun */ if (p_ptr->timed[TMD_STUN] && (p_ptr->timed[TMD_STUN] <= 50)) borg_skill[BI_ISSTUN] = TRUE; /* Check for Heavy Stun */ if (p_ptr->timed[TMD_STUN] > 50) borg_skill[BI_ISHEAVYSTUN] = TRUE; /* Check for Paralyze */ if (p_ptr->timed[TMD_PARALYZED] > 50) borg_skill[BI_ISPARALYZED] = TRUE; /* Check for "Hallucinating" */ if (p_ptr->timed[TMD_IMAGE]) borg_skill[BI_ISIMAGE] = TRUE; /* Check for "Amnesia" */ if (p_ptr->timed[TMD_AMNESIA]) borg_skill[BI_ISFORGET] = TRUE; /* Check to "Bless" */ borg_bless = (p_ptr->timed[TMD_BLESSED] ? TRUE : FALSE); /* Check for Searching mode */ if (p_ptr->searching) borg_skill[BI_ISSEARCHING] = TRUE; /* Check for "Study" */ if (p_ptr->new_spells) borg_skill[BI_ISSTUDY] = TRUE; /* Parse stats */ for (i = 0; i < 6; i++) { borg_skill[BI_ISFIXSTR+i] = p_ptr->stat_cur[A_STR+i] < p_ptr->stat_max[A_STR+i]; borg_skill[BI_CSTR+i] = p_ptr->stat_cur[A_STR+i]; borg_stat[i] = p_ptr->stat_cur[i]; } /* Hack -- Access max depth */ borg_skill[BI_CDEPTH] = p_ptr->depth; /* Hack -- Access max depth */ borg_skill[BI_MAXDEPTH] = p_ptr->max_depth; } int borg_check_formula(int *formula) { int oper1; /* operand #1 */ int oper2; /* operand #2 */ int stack[256]; /* stack */ int *stackptr; /* stack pointer */ /* loop until we hit BFO_DONE */ for (stackptr = stack; *formula; formula++) { if (stackptr < stack) return 0; switch (*formula) { /* Number */ case BFO_NUMBER: *stackptr++ = *++formula; break; /* Variable */ case BFO_VARIABLE: *stackptr++ = borg_has[*++formula]; if ((*formula) > (z_info->k_max + z_info->k_max + z_info->a_max + BI_MAX)) return 0; break; /* Equal */ case BFO_EQ: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 == oper2); break; /* Not Equal */ case BFO_NEQ: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 != oper2); break; /* Less Than */ case BFO_LT: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 < oper2); break; /* Less Than Or Equal */ case BFO_LTE: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 <= oper2); break; /* Greater Than */ case BFO_GT: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 > oper2); break; /* Greater Than Or Equal */ case BFO_GTE: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 >= oper2); break; /* Logical And */ case BFO_AND: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 && oper2); break; /* Logical Or */ case BFO_OR: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 || oper2); break; /* Plus */ case BFO_PLUS: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 + oper2); break; /* Minus */ case BFO_MINUS: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 - oper2); break; /* Divide */ case BFO_DIVIDE: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 / (oper2 ? oper2 : 1)); break; /* Multiply */ case BFO_MULT: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 * oper2); break; /* Logical Not */ case BFO_NOT: oper1 = *--stackptr; *stackptr++ = (!oper1); break; default: return 0; } } if (stackptr != (stack+1)) return 0; return 1; } char *borg_prt_formula(int *formula) { static char FormulaStr[2000]; char tmpStr[50]; memset(FormulaStr, 0, sizeof(FormulaStr)); /* loop until we hit BFO_DONE */ for (; *formula; formula++) { switch (*formula) { /* Number */ case BFO_NUMBER: sprintf(tmpStr, "%d ", *++formula); strcat(FormulaStr, tmpStr); break; /* Variable */ case BFO_VARIABLE: strcat(FormulaStr, "'"); strcat(FormulaStr, borg_prt_item(*++formula)); strcat(FormulaStr, "'"); strcat(FormulaStr, " "); break; /* Equal */ case BFO_EQ: strcat(FormulaStr, "== "); break; /* Not Equal */ case BFO_NEQ: strcat(FormulaStr, "!= "); break; /* Less Than */ case BFO_LT: strcat(FormulaStr, "< "); break; /* Less Than Or Equal */ case BFO_LTE: strcat(FormulaStr, "<= "); break; /* Greater Than */ case BFO_GT: strcat(FormulaStr, "> "); break; /* Greater Than Or Equal */ case BFO_GTE: strcat(FormulaStr, ">= "); break; /* Logical And */ case BFO_AND: strcat(FormulaStr, "&& "); break; /* Logical Or */ case BFO_OR: strcat(FormulaStr, "|| "); break; /* Plus */ case BFO_PLUS: strcat(FormulaStr, "+ "); break; /* Minus */ case BFO_MINUS: strcat(FormulaStr, "- "); break; /* Divide */ case BFO_DIVIDE: strcat(FormulaStr, "/ "); break; /* Multiply */ case BFO_MULT: strcat(FormulaStr, "* "); break; /* Logical Not */ case BFO_NOT: strcat(FormulaStr, "! "); break; } } /* BFO_DONE */ return FormulaStr; } int borg_calc_formula(int *formula) { int oper1; /* operand #1 */ int oper2; /* operand #2 */ int stack[256]; /* stack */ int *stackptr; /* stack pointer */ if (!formula) return 0; *stack = 0; /* loop until we hit BFO_DONE */ for (stackptr = stack; *formula; formula++) { switch (*formula) { /* Number */ case BFO_NUMBER: *stackptr++ = *++formula; break; /* Variable */ case BFO_VARIABLE: *stackptr++ = borg_has[*++formula]; break; /* Equal */ case BFO_EQ: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 == oper2); break; /* Not Equal */ case BFO_NEQ: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 != oper2); break; /* Less Than */ case BFO_LT: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 < oper2); break; /* Less Than Or Equal */ case BFO_LTE: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 <= oper2); break; /* Greater Than */ case BFO_GT: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 > oper2); break; /* Greater Than Or Equal */ case BFO_GTE: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 >= oper2); break; /* Logical And */ case BFO_AND: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 && oper2); break; /* Logical Or */ case BFO_OR: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 || oper2); break; /* Plus */ case BFO_PLUS: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 + oper2); break; /* Minus */ case BFO_MINUS: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 - oper2); break; /* Divide */ case BFO_DIVIDE: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 / (oper2 ? oper2 : 1)); break; /* Multiply */ case BFO_MULT: oper2 = *--stackptr; oper1 = *--stackptr; *stackptr++ = (oper1 * oper2); break; /* Logical Not */ case BFO_NOT: oper1 = *--stackptr; *stackptr++ = (!oper1); break; } } /* BFO_DONE */ return *--stackptr; } bool (*borg_sort_comp)(void* u, void* v, int a, int b); void (*borg_sort_swap)(void* u, void* v, int a, int b); /* * Borg's sorting algorithm -- quick sort in place * * Note that the details of the data we are sorting is hidden, * and we rely on the "ang_sort_comp()" and "ang_sort_swap()" * function hooks to interact with the data, which is given as * two pointers, and which may have any user-defined form. */ void borg_sort_aux(void *u, void *v, int p, int q) { int z, a, b; /* Done sort */ if (p >= q) return; /* Pivot */ z = p; /* Begin */ a = p; b = q; /* Partition */ while (TRUE) { /* Slide i2 */ while (!(*borg_sort_comp)(u, v, b, z)) b--; /* Slide i1 */ while (!(*borg_sort_comp)(u, v, z, a)) a++; /* Done partition */ if (a >= b) break; /* Swap */ (*borg_sort_swap)(u, v, a, b); /* Advance */ a++, b--; } /* Recurse left side */ borg_sort_aux(u, v, p, b); /* Recurse right side */ borg_sort_aux(u, v, b+1, q); } /* * Borg's sorting algorithm -- quick sort in place * * Note that the details of the data we are sorting is hidden, * and we rely on the "ang_sort_comp()" and "ang_sort_swap()" * function hooks to interact with the data, which is given as * two pointers, and which may have any user-defined form. */ void borg_sort(void *u, void *v, int n) { /* Sort the array */ borg_sort_aux(u, v, 0, n-1); } /* * Sorting hook -- comp function -- see below * * We use "u" to point to an array of strings, and "v" to point to * an array of indexes, and we sort them together by the strings. */ bool borg_sort_comp_hook(void *u, void *v, int a, int b) { char **text = (char **)(u); s16b *what = (s16b*)(v); int cmp; /* Compare the two strings */ cmp = (strcmp(text[a], text[b])); /* Strictly less */ if (cmp < 0) return (TRUE); /* Strictly more */ if (cmp > 0) return (FALSE); /* Enforce "stable" sort */ return (what[a] <= what[b]); } /* * Sorting hook -- swap function -- see below * * We use "u" to point to an array of strings, and "v" to point to * an array of indexes, and we sort them together by the strings. */ void borg_sort_swap_hook(void *u, void *v, int a, int b) { char **text = (char**)(u); s16b *what = (s16b*)(v); char *texttmp; s16b whattmp; /* Swap "text" */ texttmp = text[a]; text[a] = text[b]; text[b] = texttmp; /* Swap "what" */ whattmp = what[a]; what[a] = what[b]; what[b] = whattmp; } /* * Initialize this file */ void borg_init_1(void) { int i, x, y; /* Allocate the "keypress queue" */ C_MAKE(borg_key_queue, KEY_SIZE, keycode_t); /* Prapare a local random number seed */ if (!borg_rand_local) borg_rand_local = randint1(0x10000000); /*** Grids ***/ /* Make each row of grids */ for (y = 0; y < AUTO_MAX_Y; y++) { /* Make each row */ C_MAKE(borg_grids[y], AUTO_MAX_X, borg_grid); } /*** Grid data ***/ /* Allocate */ MAKE(borg_data_flow, borg_data); /* Allocate */ MAKE(borg_data_cost, borg_data); /* Allocate */ MAKE(borg_data_hard, borg_data); /* Allocate */ MAKE(borg_data_know, borg_data); /* Allocate */ MAKE(borg_data_icky, borg_data); /* Prepare "borg_data_hard" */ for (y = 0; y < AUTO_MAX_Y; y++) { for (x = 0; x < AUTO_MAX_X; x++) { /* Prepare "borg_data_hard" */ borg_data_hard->data[y][x] = 255; } } /*** Very special "tracking" array ***/ /* Track the shop locations */ C_MAKE(track_shop_x, 9, int); C_MAKE(track_shop_y, 9, int); /*** Special "tracking" arrays ***/ /* Track "up" stairs */ track_less_num = 0; track_less_size = 16; C_MAKE(track_less_x, track_less_size, int); C_MAKE(track_less_y, track_less_size, int); /* Track "down" stairs */ track_more_num = 0; track_more_size = 16; C_MAKE(track_more_x, track_more_size, int); C_MAKE(track_more_y, track_more_size, int); /* Track glyphs */ track_glyph_num = 0; track_glyph_size = 200; C_MAKE(track_glyph_x, track_glyph_size, int); C_MAKE(track_glyph_y, track_glyph_size, int); /* Track the worn items to avoid loops */ track_worn_num = 0; track_worn_size = 10; track_worn_time = 0; C_MAKE(track_worn_name1, track_worn_size, byte); /* Track Steps */ track_step_num = 0; track_step_size = 100; C_MAKE(track_step_x, track_step_size, int); C_MAKE(track_step_y, track_step_size, int); /* Track doors closed by borg */ track_door_num = 0; track_door_size = 100; C_MAKE(track_door_x, track_door_size, int); C_MAKE(track_door_y, track_door_size, int); /* Track closed doors on map */ track_closed_num = 0; track_closed_size = 100; C_MAKE(track_closed_x, track_closed_size, int); C_MAKE(track_closed_y, track_closed_size, int); /* Track mineral veins with treasure. */ track_vein_num = 0; track_vein_size = 100; C_MAKE(track_vein_x, track_vein_size, int); C_MAKE(track_vein_y, track_vein_size, int); /*** Object tracking ***/ /* No objects yet */ borg_takes_cnt = 0; borg_takes_nxt = 1; /* Array of objects */ C_MAKE(borg_takes, 256, borg_take); /*** Monster tracking ***/ /* No monsters yet */ borg_kills_cnt = 0; borg_kills_nxt = 1; /* Array of monsters */ C_MAKE(borg_kills, 256, borg_kill); /*** Special counters ***/ /* Count racial appearances */ C_MAKE(borg_race_count, z_info->r_max, s16b); /* Count racial deaths */ C_MAKE(borg_race_death, z_info->r_max, s16b); /*** XXX XXX XXX Hack -- Cheat ***/ /* Hack -- Extract dead uniques */ for (i = 1; i < z_info->r_max-1; i++) { monster_race *r_ptr = &r_info[i]; /* Skip non-monsters */ if (!r_ptr->name) continue; /* Skip non-uniques */ if (rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* Mega-Hack -- Access "dead unique" list */ if (r_ptr->max_num == 0) borg_race_death[i] = 1; } } /*** Object kind lookup functions ***/ /** * Return the k_idx of the object kind with the given `tval` and `sval`, or 0. */ int borg_lookup_kind(int tval, int sval) { int k; /* Look for it */ for (k = 1; k < z_info->k_max; k++) { object_kind *k_ptr = &k_info[k]; /* Found a match */ if ((k_ptr->tval == tval) && (k_ptr->sval == sval)) return (k); } /* Failure */ msg("No object (%s,%d,%d)", tval_find_name(tval), tval, sval); return 0; } #ifdef MACINTOSH static int HACK = 0; #endif #endif /* ALLOW_BORG */ angband-3.5.1/src/borg/borg4.h0000644000175000017500000000265612456456606015357 0ustar chriscchrisc /* File: borg4.h */ /* Purpose: Header file for "borg4.c" -BEN- */ #ifndef INCLUDED_BORG4_H #define INCLUDED_BORG4_H #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #ifdef ALLOW_BORG /* * This file provides support for "borg4.c". */ #include "borg1.h" #include "borg2.h" #include "borg3.h" /* * Extract various bonuses */ extern void borg_notice(bool notice_swap); /* * Extract the bonuses for items in the home. * * in_item is passed in if you want to pretent that in_item is * the only item in the home. * no_items is passed in as TRUE if you want to pretend that the * home is empty. */ extern void borg_notice_home(borg_item *in_item, bool no_items); /* * Calculate the basic "power" */ extern s32b borg_power(void); /* * Calculate the basic "power" of the home */ extern s32b borg_power_home(void); /* * Calculate danger to a grid from a monster */ extern int borg_danger_aux(int y, int x, int c, int i, bool average, bool full_damage); /* * Hack -- Calculate the "danger" of the given grid. */ extern int borg_danger(int y, int x, int c, bool average, bool full_damage); /* * Determine if the Borg is out of "crucial" supplies. */ extern const char *borg_restock(int depth); /* * Determine if the Borg is "prepared" for the given level */ extern const char *borg_prepared(int depth); /* * Initialize this file */ extern void borg_init_4(void); #endif #endif angband-3.5.1/src/borg/borg8.c0000644000175000017500000044254412456456606015362 0ustar chriscchrisc/* File: borg8.c */ /* Purpose: High level functions for the Borg -BEN- */ #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #include "borg1.h" #include "borg2.h" #include "borg3.h" #include "borg4.h" #include "borg5.h" #include "borg6.h" #include "borg7.h" #include "borg8.h" #ifdef BABLOS extern bool borg_clock_over; #endif /* bablos */ byte *test; byte *best; s32b *b_home_power; /* money Scumming is a type of town scumming for money */ bool borg_money_scum(void) { int dir= -1; int divisor = 2; borg_grid *ag; /* Just a quick check to make sure we are supposed to do this */ if (borg_money_scum_amount == 0) return (FALSE); /* Take note */ borg_note(format("# Waiting for towns people to breed. I need %d...",borg_money_scum_amount - borg_gold)); /* I'm not in a store */ borg_in_shop = FALSE; /* Rest for 9 months */ if (borg_skill[BI_CLEVEL] >= 35) { borg_keypress(ESCAPE); borg_keypress('R'); borg_keypress('5'); borg_keypress('0'); borg_keypress('0'); borg_keypress(KC_ENTER); } else if (borg_skill[BI_CLEVEL] >= 15) { borg_keypress(ESCAPE); borg_keypress('R'); borg_keypress('7'); borg_keypress('5'); borg_keypress(KC_ENTER); } else /* Low level, dont want to get mobbed */ { borg_keypress(ESCAPE); borg_keypress('R'); borg_keypress('2'); borg_keypress('5'); borg_keypress(KC_ENTER); } /* Don't rest too long at night. We tend to crash the game if too many * townsfolk are on the level */ /* Night or day up in town */ if ((turn % (10L * TOWN_DAWN)) < ((10L * TOWN_DAWN) / 2)) divisor = 5; /* sometimes twitch in order to move around some */ if (borg_t % divisor) { borg_keypress(ESCAPE); /* Pick a random direction */ while (dir == -1 || dir == 5 || dir == 0) { dir = randint0(10); /* Hack -- set goal */ g_x = c_x + ddx[dir]; g_y = c_y + ddy[dir]; ag = &borg_grids[g_y][g_x]; /* Skip walls and shops */ if (ag->feat != FEAT_FLOOR) dir = -1; } /* Normally move */ /* Send direction */ borg_keypress(I2D(dir)); } /* reset the clocks */ borg_t = 10; time_this_panel = 1; borg_began = 1; /* Done */ return (TRUE); } /* * Determine if an item can "absorb" a second item * * See "object_absorb()" for the actual "absorption" code. * * If permitted, we allow wands/staffs (if they are known to have equal * charges) and rods (if fully charged) to combine. * * Note that rods/staffs/wands are then unstacked when they are used. * * If permitted, we allow weapons/armor to stack, if they both known. * * Food, potions, scrolls, and "easy know" items always stack. * * Chests never stack (for various reasons). * * We do NOT allow activatable items (artifacts or dragon scale mail) * to stack, to keep the "activation" code clean. Artifacts may stack, * but only with another identical artifact (which does not exist). * * Ego items may stack as long as they have the same ego-item type. * This is primarily to allow ego-missiles to stack. */ static bool borg_object_similar(borg_item *o_ptr, borg_item *j_ptr) { /* NOTE: This assumes the giving of one item at a time */ int total = o_ptr->iqty + 1; /* Require identical object types */ if (o_ptr->kind != j_ptr->kind) return (0); /* Analyze the items */ switch (o_ptr->tval) { /* Chests */ case TV_CHEST: { /* Never okay */ return (0); } /* Food and Potions and Scrolls */ case TV_FOOD: case TV_POTION: case TV_SCROLL: { /* Assume okay */ break; } /* Staffs and Wands */ case TV_STAFF: case TV_WAND: { /* Require knowledge */ if ((!o_ptr->aware) || (!j_ptr->aware)) return (0); /* Fall through */ } /* Staffs and Wands and Rods */ case TV_ROD: { /* Require permission */ /* if (!testing_stack) return (0);*/ /* Require identical charges */ /* if (o_ptr->pval != j_ptr->pval) return (0); */ /* Probably okay */ break; } /* Weapons and Armor */ case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { /* Require permission */ /* if (!testing_stack) return (0);*/ /* XXX XXX XXX Require identical "sense" status */ /* if ((o_ptr->ident & ID_SENSE) != */ /* (j_ptr->ident & ID_SENSE)) return (0); */ /* Fall through */ } /* Rings, Amulets, Lites */ case TV_RING: case TV_AMULET: case TV_LIGHT: { /* Require full knowledge of both items */ if ((!o_ptr->aware) || (!j_ptr->aware)) return (0); /* Fall through */ } /* Missiles */ case TV_BOLT: case TV_ARROW: case TV_SHOT: { /* Require identical "bonuses" */ if (o_ptr->to_h != j_ptr->to_h) return (FALSE); if (o_ptr->to_d != j_ptr->to_d) return (FALSE); if (o_ptr->to_a != j_ptr->to_a) return (FALSE); /* Require identical "pval" code */ if (o_ptr->pval != j_ptr->pval) return (FALSE); /* Require identical "artifact" names */ if (o_ptr->name1 != j_ptr->name1) return (FALSE); /* Require identical "ego-item" names */ if (o_ptr->name2 != j_ptr->name2) return (FALSE); /* Hack -- Never stack "powerful" items */ if (!of_is_empty(o_ptr->flags) || !of_is_empty(j_ptr->flags)) return FALSE; /* Hack -- Never stack recharging items */ if (o_ptr->timeout || j_ptr->timeout) return (FALSE); /* Require identical "values" */ if (o_ptr->ac != j_ptr->ac) return (FALSE); if (o_ptr->dd != j_ptr->dd) return (FALSE); if (o_ptr->ds != j_ptr->ds) return (FALSE); /* Probably okay */ break; } /* Various */ default: { /* Require knowledge */ if ((!o_ptr->aware) || (!j_ptr->aware)) return (0); /* Probably okay */ break; } } /* Hack -- Require identical "broken" status */ if ((o_ptr->fully_identified) != (j_ptr->fully_identified)) return (0); /* The stuff with 'note' is not right but it is close. I think it */ /* has him assuming that he can't stack sometimes when he can. This */ /* is alright, it just causes him to take a bit more time to do */ /* some exchanges. */ /* Hack -- require semi-matching "inscriptions" */ if (o_ptr->note[0] && j_ptr->note[0] && (!streq(o_ptr->note, j_ptr->note))) return (0); /* Hack -- normally require matching "inscriptions" */ if ((!streq(o_ptr->note, j_ptr->note))) return (0); /* Hack -- normally require matching "discounts" */ if ((o_ptr->discount != j_ptr->discount)) return (0); /* Maximal "stacking" limit */ if (total >= MAX_STACK_SIZE) return (0); /* They match, so they must be similar */ return (TRUE); } /* * Find the mininum amount of some item to buy/sell. For most * items this is 1, but for certain items (such as ammunition) * it may be higher. -- RML */ static int borg_min_item_quantity(borg_item *item) { /* Only trade in bunches if sufficient cash */ if (borg_gold < 250) return (1); /* Don't trade expensive items in bunches */ if (item->cost > 5) return (1); /* Don't trade non-known items in bunches */ if (!item->aware) return (1); /* Only allow some types */ switch (item->tval) { case TV_SHOT: case TV_ARROW: case TV_BOLT: /* Maximum number of items */ if (item->iqty < 5) return (item->iqty); return (5); case TV_FOOD: if (item->iqty < 3) return (item->iqty); return (3); #if 0 case TV_POTION: case TV_SCROLL: if (item->iqty < 2) return (item->iqty); return (2); #endif default: return (1); } } /* * This file handles the highest level goals, and store interaction. * * Store interaction strategy * * (1) Sell items to the home (for later use) ** optimize the stuff in the home... this involves buying and selling stuff ** not in the 'best' list. * We sell anything we may need later (see step 4) * * (2) Sell items to the shops (for money) * We sell anything we do not actually need * * (3) Buy items from the shops (for the player) * We buy things that we actually need * * (4) Buy items from the home (for the player) * We buy things that we actually need (see step 1) * * (5) Buy items from the shops (for the home) * We buy things we may need later (see step 1) * * (6) Buy items from the home (for the stores) * We buy things we no longer need (see step 2) * * The basic principle is that we should always act to improve our * "status", and we should sometimes act to "maintain" our status, * especially if there is a monetary reward. But first we should * attempt to use the home as a "stockpile", even though that is * not worth any money, since it may save us money eventually. */ /* this optimized the home storage by trying every combination... it was too slow.*/ /* put this code back when running this on a Cray. */ static void borg_think_home_sell_aux2_slow( int n, int start_i ) { int i; /* All done */ if (n == STORE_INVEN_MAX) { s32b home_power; /* Examine the home */ borg_notice_home(NULL, FALSE); /* Evaluate the home */ home_power = borg_power_home(); /* Track best */ if (home_power > *b_home_power) { /* Save the results */ for (i = 0; i < STORE_INVEN_MAX; i++) best[i] = test[i]; #if 0 /* dump, for debugging */ borg_note(format("Trying Combo (best home power %ld)", *b_home_power)); borg_note(format(" (test home power %ld)",home_power)); for (i = 0; i < STORE_INVEN_MAX; i++) { if (borg_shops[7].ware[i].iqty) borg_note(format("store %d %s (qty-%d).", i, borg_shops[7].ware[i].desc, borg_shops[7].ware[i].iqty )); else borg_note(format("store %d (empty).", i)); } borg_note(" "); /* add a blank line */ #endif /* Use it */ *b_home_power = home_power; } /* Success */ return; } /* Note the attempt */ test[n] = n; /* Evaluate the default item */ borg_think_home_sell_aux2_slow(n + 1, start_i ); /* if this slot and the previous slot is empty, move on to previous slot*/ /* this will prevent trying a thing in all the empty slots to see if */ /* empty slot b is better than empty slot a.*/ if ((n != 0) && !borg_shops[7].ware[n].iqty && !borg_shops[7].ware[n-1].iqty) return; /* try other combinations */ for (i = start_i; i < INVEN_MAX_PACK; i++) { borg_item *item; borg_item *item2; item = &borg_items[i]; item2= &borg_shops[7].ware[n]; /* Skip empty items */ /* Require "aware" */ /* Require "known" */ if (!item->iqty || !item->kind || !item->aware) continue; /* Hack -- ignore "worthless" items */ if (!item->value) continue; if (i==weapon_swap && weapon_swap !=0) continue; if (i==armour_swap && armour_swap !=0) continue; /* stacking? */ if (borg_object_similar(item2, item)) { item2->iqty++; item->iqty--; } else { int k; bool found_match = FALSE; /* eliminate items that would stack else where in the list. */ for (k = 0; k < STORE_INVEN_MAX; k++) { if (borg_object_similar(&safe_home[k], item)) { found_match = TRUE; break; } } if (found_match) continue; /* replace current item with this item */ COPY(item2, item, borg_item); /* only move one into a non-stack slot */ item2->iqty = 1; /* remove item from pack */ item->iqty--; } /* Note the attempt */ test[n] = i + STORE_INVEN_MAX; /* Evaluate the possible item */ borg_think_home_sell_aux2_slow( n + 1, i+1 ); /* restore stuff */ COPY(item2, &safe_home[n], borg_item); /* put item back into pack */ item->iqty++; } } /* * this will see what single addition/substitution is best for the home. * The formula is not as nice as the one above because it will * not check all possible combinations of items. but it is MUCH faster. */ static void borg_think_home_sell_aux2_fast( int n, int start_i ) { borg_item *item; borg_item *item2; s32b home_power; int i, k, p; bool skip_it = FALSE; /* get the starting best (current) */ /* Examine the home */ borg_notice_home(NULL, FALSE); /* Evaluate the home */ *b_home_power = borg_power_home(); /* try individual substitutions/additions. */ for (n = 0; n < STORE_INVEN_MAX; n++) { item2 = &borg_shops[7].ware[n]; for (i = 0; i < INVEN_MAX_PACK; i++) { item = &borg_items[i]; /* Skip empty items */ /* Require "aware" */ /* Require "known" */ if (!item->iqty || (!item->kind &&!item->aware)) continue; if (i==weapon_swap && weapon_swap !=0) continue; if (i==armour_swap && armour_swap !=0) continue; /* Do not dump stuff at home that is not fully id'd and should be */ /* this is good with random artifacts. */ if ((op_ptr->opt[OPT_birth_randarts] || op_ptr->opt[OPT_birth_randarts]) && !item->fully_identified && item->name1) continue; /* Hack -- ignore "worthless" items */ if (!item->value) continue; /* If this item was just bought a the house, don't tell it back to the house */ for (p = 0; p < bought_item_num; p++) { if (bought_item_tval[p] == item->tval && bought_item_sval[p] == item->sval && bought_item_pval[p] == item->pval && bought_item_store[p] == 7) skip_it = TRUE; } if (skip_it == TRUE) continue; /* stacking? */ if (borg_object_similar(item2, item)) { /* if this stacks with what was previously here */ item2->iqty++; } else { bool found_match = FALSE; /* eliminate items that would stack else where in the list. */ for (k = 0; k < STORE_INVEN_MAX; k++) { if (borg_object_similar(&safe_home[k], item)) { found_match = TRUE; break; } } if (found_match) continue; /* replace current item with this item */ COPY(item2, item, borg_item); /* only move one into a non-stack slot */ item2->iqty = 1; } /* remove item from pack */ item->iqty--; /* Note the attempt */ test[n] = i + STORE_INVEN_MAX; /* Test to see if this is a good substitution. */ /* Examine the home */ borg_notice_home(NULL, FALSE); /* Evaluate the home */ home_power = borg_power_home(); /* Track best */ if (home_power > *b_home_power) { /* Save the results */ for (k = 0; k < STORE_INVEN_MAX; k++) best[k] = test[k]; #if 0 /* dump, for debugging */ borg_note(format("Trying Combo (best home power %ld)", *b_home_power)); borg_note(format(" (test home power %ld)", home_power)); for (i = 0; i < STORE_INVEN_MAX; i++) if (borg_shops[7].ware[i].iqty) borg_note(format("store %d %s (qty-%d).", i, borg_shops[7].ware[i].desc, borg_shops[7].ware[i].iqty )); else borg_note(format("store %d (empty).", i)); borg_note(" "); /* add a blank line */ #endif /* Use it */ *b_home_power = home_power; } /* restore stuff */ COPY(item2, &safe_home[n], borg_item); /* put item back into pack */ item->iqty++; /* put the item back in the test array */ test[n] = n; } } } /* locate useless item */ static void borg_think_home_sell_aux3( ) { int i; s32b borg_empty_home_power; s32b power; /* get the starting power */ borg_notice(TRUE); power = borg_power(); /* get what an empty home would have for power */ borg_notice_home( NULL, TRUE ); borg_empty_home_power = borg_power_home(); /* go through the inventory and eliminate items that either */ /* 1) will not increase the power of an empty house. */ /* 2) will reduce borg_power if given to home */ for (i = 0; i < INVEN_MAX_PACK; i++) { int num_items_given; num_items_given = 0; /* if there is no item here, go to next slot */ if (!borg_items[i].iqty) continue; /* Dont sell back our Best Fit item (avoid loops) */ if (borg_best_fit_item == borg_items[i].name1) continue; /* 1) eliminate garbage items (items that add nothing to an */ /* empty house) */ borg_notice_home( &borg_items[i], FALSE ); if (borg_power_home() <= borg_empty_home_power) { safe_items[i].iqty = 0; continue; } /* 2) will reduce borg_power if given to home */ while (borg_items[i].iqty) { /* reduce inventory by this item */ num_items_given++; borg_items[i].iqty--; /* Examine borg */ borg_notice(FALSE); /* done if this reduces the borgs power */ if (borg_power() < power) { /* we gave up one to many items */ num_items_given--; break; } } /* restore the qty */ borg_items[i].iqty = safe_items[i].iqty; /* set the qty to number given without reducing borg power */ safe_items[i].iqty = num_items_given; } } /* * Step 1 -- sell "useful" things to the home (for later) */ static bool borg_think_home_sell_aux( bool save_best ) { int icky = STORE_INVEN_MAX - 1; s32b home_power = -1L; int p, i = -1; byte test_a[STORE_INVEN_MAX]; byte best_a[STORE_INVEN_MAX]; /* if the best is being saved (see borg_think_shop_grab_aux) */ /* !FIX THIS NEEDS TO BE COMMENTED BETTER */ if (!save_best) b_home_power = &home_power; test = test_a; best = best_a; #if 0 /* if I have not been to home, do not try this yet. */ if (!borg_shops[7].when) return FALSE; #endif /* Hack -- the home is full */ /* and pack is full */ if (borg_shops[7].ware[icky].iqty && borg_items[INVEN_MAX_PACK-1].iqty) return (FALSE); /* Copy all the store slots */ for (i = 0; i < STORE_INVEN_MAX; i++) { /* Save the item */ COPY(&safe_home[i], &borg_shops[7].ware[i], borg_item); /* clear test arrays (test[i] == i is no change) */ best[i] = test[i] = i; } /* Hack -- Copy all the slots */ for (i = 0; i < INVEN_MAX_PACK; i++) { /* Save the item -- do not consider these */ if (i==weapon_swap && weapon_swap !=0) continue; if (i==armour_swap && armour_swap !=0) continue; /* dont consider the item i just found to be my best fit (4-6-07) */ if (borg_best_fit_item == borg_items[i].name1) continue; COPY(&safe_items[i], &borg_items[i], borg_item); } /* get rid of useless items */ borg_think_home_sell_aux3(); /* Examine the borg once more with full inventory then swap in the */ /* safe_items for the home optimization */ borg_notice(FALSE); /* swap quantities (this should be all that is different) */ for (i = 0; i < INVEN_MAX_PACK; i++) { byte save_qty; if (i==weapon_swap && weapon_swap !=0) continue; if (i==armour_swap && armour_swap !=0) continue; save_qty = safe_items[i].iqty; safe_items[i].iqty = borg_items[i].iqty; borg_items[i].iqty = save_qty; } *b_home_power = -1; /* find best combo for home. */ if (borg_slow_optimizehome) { borg_think_home_sell_aux2_slow( 0, 0 ); } else { borg_think_home_sell_aux2_fast( 0, 0 ); } /* restore bonuses and such */ for (i = 0; i < STORE_INVEN_MAX; i++) { COPY(&borg_shops[7].ware[i], &safe_home[i], borg_item); } for (i = 0; i < INVEN_TOTAL; i++) { if (i==weapon_swap && weapon_swap !=0) continue; if (i==armour_swap && armour_swap !=0) continue; COPY(&borg_items[i], &safe_items[i], borg_item); } borg_notice(FALSE); borg_notice_home(NULL, FALSE); /* Drop stuff that will stack in the home */ for (i = 0; i < STORE_INVEN_MAX; i++) { /* if this is not the item that was there, */ /* drop off the item that replaces it. */ if (best[i] != i && best[i] != 255) { borg_item *item = &borg_items[best[i]-STORE_INVEN_MAX]; borg_item *item2 = &borg_shops[7].ware[i]; /* if this item is not the same as what was */ /* there before take it. */ if (!borg_object_similar(item2, item)) continue; /* There are limted quantity per slot */ if (item2->iqty > 90) continue; goal_shop = 7; goal_item = best[i] - STORE_INVEN_MAX; return (TRUE); } } /* Get rid of stuff in house but not in 'best' house if */ /* pack is not full */ if (!borg_items[INVEN_MAX_PACK-1].iqty) { for (i = 0; i < STORE_INVEN_MAX; i++) { /* if this is not the item that was there, */ /* get rid of the item that was there */ if ((best[i] != i) && (borg_shops[7].ware[i].iqty)) { borg_item *item = &borg_items[best[i]-STORE_INVEN_MAX]; borg_item *item2 = &borg_shops[7].ware[i]; /* if this item is not the same as what was */ /* there before take it. */ if (borg_object_similar(item, item2)) continue; /* skip stuff if we sold bought it */ /* skip stuff if we sold/bought it */ for (p = 0; p < sold_item_num; p++) { if (sold_item_tval[p] == item2->tval && sold_item_sval[p] == item2->sval && sold_item_store[p] == 7) return (FALSE); } goal_shop = 7; goal_ware = i; return TRUE; } } } /* Drop stuff that is in best house but currently in inventory */ for (i = 0; i < STORE_INVEN_MAX; i++) { /* if this is not the item that was there, */ /* drop off the item that replaces it. */ if (best[i] != i && best[i] != 255) { /* hack dont sell DVE */ if (!borg_items[best[i]-STORE_INVEN_MAX].iqty) return (FALSE); goal_shop = 7; goal_item = best[i] - STORE_INVEN_MAX; return (TRUE); } } /* Return our num_ counts to normal */ borg_notice_home(NULL, FALSE); /* Assume not */ return (FALSE); } /* * Determine if an item can be sold in the given store * * XXX XXX XXX Consider use of "icky" test on items */ static bool borg_good_sell(borg_item *item, int who) { int i; /* Never sell worthless items */ if (item->value <= 0) return (FALSE); /* Never sell valuable non-id'd items */ if (strstr(item->note, "magical") || strstr(item->note, "excellent") || strstr(item->note, "ego") || strstr(item->note, "splendid") || strstr(item->note, "special")) return (FALSE); /* Worshipping gold or scumming will allow the sale */ if (item->value > 0 && ((borg_worships_gold || borg_skill[BI_MAXCLEVEL] < 10) || ((borg_money_scum_amount < borg_gold) && borg_money_scum_amount != 0)) && !strstr(item->note, "cursed") && !strstr(item->note, "magical") && !strstr(item->note, "ego") && !strstr(item->note, "splendid") && !strstr(item->note, "special") && !strstr(item->note, "excellent")) { /* Borg is allowed to continue in this routine to sell non-ID items */ } else /* Some items must be ID, or at least 'known' */ { /* Analyze the type */ switch (item->tval) { case TV_POTION: case TV_SCROLL: /* Never sell if not "known" and interesting */ if (!item->ident && (borg_skill[BI_MAXDEPTH] > 35)) return (FALSE); /* Spell casters should not sell ResMana to shop unless * they have tons in the house */ if (item->tval == TV_POTION && item->sval == SV_POTION_RESTORE_MANA && borg_skill[BI_MAXSP] > 100 && borg_has[POTION_RES_MANA] + num_mana > 99) return (FALSE); break; case TV_FOOD: case TV_ROD: case TV_WAND: case TV_STAFF: case TV_RING: case TV_AMULET: case TV_LIGHT: /* Never sell if not "known" */ if (!item->ident && borg_item_worth_id(item) && (borg_skill[BI_MAXDEPTH] > 35)) return (FALSE); break; case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: /* Only sell "known" items (unless "icky") */ if (!item->ident && borg_item_worth_id(item)) return (FALSE); break; } } /* Do not sell stuff that is not fully id'd and should be */ if ((op_ptr->opt[OPT_birth_randarts] || op_ptr->opt[OPT_birth_randarts]) && !item->fully_identified && item->name1) { /* CHECK THE ARTIFACTS */ /* For now check all artifacts */ return (FALSE); } /* Do not sell stuff that is not fully id'd and should be */ if (!item->fully_identified && item->name2) { if (e_info[borg_items[INVEN_OUTER].name2].xtra == OBJECT_XTRA_TYPE_RESIST || e_info[borg_items[INVEN_OUTER].name2].xtra == OBJECT_XTRA_TYPE_POWER) { return (FALSE); } } /* Do not sell it if I just bought one */ /* do not buy the item if I just sold it. */ for (i = 0; i < bought_item_num; i++) { if (bought_item_tval[i] == item->tval && bought_item_sval[i] == item->sval && (bought_item_store[i] == who || who != 7)) { #if 0 borg_note(format("# Choosing not to sell back %s",item->desc)); #endif return (FALSE); } } /* Switch on the store */ switch (who + 1) { /* General Store */ case 1: /* Won't buy anything */ break; /* Armoury */ case 2: /* Analyze the type */ switch (item->tval) { case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: return (TRUE); } break; /* Weapon Shop */ case 3: /* Analyze the type */ switch (item->tval) { case TV_SHOT: case TV_BOLT: case TV_ARROW: case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: return (TRUE); } break; /* Temple */ case 4: /* Analyze the type */ switch (item->tval) { case TV_HAFTED: case TV_PRAYER_BOOK: case TV_SCROLL: case TV_POTION: return (TRUE); } break; /* book store --Alchemist */ case 5: /* Analyze the type */ switch (item->tval) { case TV_SCROLL: case TV_POTION: return (TRUE); } break; /* Magic Shop */ case 6: /* Analyze the type */ switch (item->tval) { case TV_AMULET: case TV_RING: case TV_SCROLL: case TV_POTION: case TV_STAFF: case TV_WAND: case TV_ROD: case TV_MAGIC_BOOK: return (TRUE); } break; /* Black Market --they buy most things.*/ case 7: /* Analyze the type */ switch (item->tval) { case TV_LIGHT: case TV_CLOAK: case TV_FOOD: return (TRUE); } break; } /* Assume not */ return (FALSE); } /* * Step 2 -- sell "useless" items to a shop (for cash) */ static bool borg_think_shop_sell_aux(void) { int icky = STORE_INVEN_MAX - 1; int k, b_k = -1; int i, b_i = -1; int qty = 1; s32b p, b_p = 0L; s32b c = 0L; s32b b_c = 30001L; bool fix = FALSE; /* Evaluate */ b_p = my_power; /* Check each shop */ for (k = 0; k < (MAX_STORES -1) ; k++) { /* Hack -- Skip "full" shops */ if (borg_shops[k].ware[icky].iqty) continue; /* Save the store hole */ COPY(&safe_shops[k].ware[icky], &borg_shops[k].ware[icky], borg_item); /* Sell stuff */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip some important type items */ if ((item->tval == my_ammo_tval) && (borg_skill[BI_AMISSILES] < 45)) continue; if (item->tval == TV_ROD && item->sval == SV_ROD_HEALING && borg_has[ROD_HEAL] <= 3) continue; if (borg_class == CLASS_WARRIOR && item->tval == TV_ROD && item->sval == SV_ROD_MAPPING && item->iqty <= 2) continue; /* Avoid selling staff of dest*/ if (item->tval == TV_STAFF && item->sval == SV_STAFF_DESTRUCTION && borg_skill[BI_ASTFDEST] < 2) continue; /* Do not sell our attack wands if they still have charges */ if (item->tval == TV_WAND && borg_skill[BI_CLEVEL] < 35 && (item->sval == SV_WAND_MAGIC_MISSILE || item->sval == SV_WAND_STINKING_CLOUD || item->sval == SV_WAND_ANNIHILATION) && item->pval != 0) continue; /* dont sell our swap items */ if (i==weapon_swap && weapon_swap !=0) continue; if (i==armour_swap && armour_swap !=0) continue; /* Skip "bad" sales */ if (!borg_good_sell(item, k)) continue; /* Save the item */ COPY(&safe_items[i], &borg_items[i], borg_item); /* Give the item to the shop */ COPY(&borg_shops[k].ware[icky], &safe_items[i], borg_item); /* get the quantity */ qty = borg_min_item_quantity(item); /* Give a single item */ borg_shops[k].ware[icky].iqty = qty; /* Lose a single item */ borg_items[i].iqty -=qty; /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ p = borg_power(); /* Restore the item */ COPY(&borg_items[i], &safe_items[i], borg_item); /* Ignore "bad" sales */ if (p < b_p) continue; /* Extract the "price" */ c = ((item->value < 30000L) ? item->value : 30000L); /* sell cheap items first. This is done because we may have to */ /* buy the item back in some very strange cercemstances. */ if ((p == b_p) && (c >= b_c)) continue; /* Maintain the "best" */ b_k = k; b_i = i; b_p = p; b_c = c; } /* Restore the store hole */ COPY(&borg_shops[k].ware[icky], &safe_shops[k].ware[icky], borg_item); } /* Examine the inventory */ if (fix) borg_notice(TRUE); /* Sell something (if useless) */ if ((b_k >= 0) && (b_i >= 0)) { /* Visit that shop */ goal_shop = b_k; /* Sell that item */ goal_item = b_i; /* Success */ return (TRUE); } /* Assume not */ return (FALSE); } /* * Help decide if an item should be bought from a real store * * We prevent the purchase of enchanted (or expensive) ammo, * so we do not spend all our money on temporary power. * * if level 35, who needs cash? buy the expecive ammo! * * We prevent the purchase of low level discounted books, * so we will not waste slots on cheap books. * * We prevent the purchase of items from the black market * which are often available at normal stores, currently, * this includes low level books, and all wands and staffs. */ static bool borg_good_buy(borg_item *item, int who, int ware) { int p; /* Check the object */ switch (item->tval) { case TV_SHOT: case TV_ARROW: case TV_BOLT: if (borg_skill[BI_CLEVEL] < 35) { if (item->to_h) return (FALSE); if (item->to_d) return (FALSE); } break; case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: if (item->sval >= 4) break; if (item->discount) return (FALSE); break; case TV_WAND: case TV_STAFF: break; } /* Don't buy from the BM until we are rich */ if (who == 6) { /* buying Remove Curse scroll is acceptable */ if (item->tval == TV_SCROLL && item->sval == SV_SCROLL_REMOVE_CURSE && borg_wearing_cursed) return (TRUE); /* Buying certain special items are acceptable */ if ((item->tval == TV_POTION && ((item->sval == SV_POTION_STAR_HEALING) || (item->sval == SV_POTION_LIFE) || (item->sval == SV_POTION_HEALING) || (item->sval == SV_POTION_INC_STR && my_stat_cur[A_STR] < (18+100)) || (item->sval == SV_POTION_INC_INT && my_stat_cur[A_INT] < (18+100)) || (item->sval == SV_POTION_INC_WIS && my_stat_cur[A_WIS] < (18+100)) || (item->sval == SV_POTION_INC_DEX && my_stat_cur[A_DEX] < (18+100)) || (item->sval == SV_POTION_INC_CON && my_stat_cur[A_CON] < (18+100)))) || (item->tval == TV_ROD && ((item->sval == SV_ROD_HEALING) || (item->sval == SV_ROD_RECALL && (borg_class == CLASS_WARRIOR || borg_class == CLASS_ROGUE)) || (item->sval == SV_ROD_SPEED && (borg_class == CLASS_WARRIOR || borg_class == CLASS_ROGUE)) || (item->sval == SV_ROD_TELEPORT_OTHER && (borg_class == CLASS_WARRIOR || borg_class == CLASS_ROGUE)) || (item->sval == SV_ROD_ILLUMINATION && (!borg_skill[BI_ALITE])))) || (item->tval == TV_PRAYER_BOOK && p_ptr->class->spell_book == TV_PRAYER_BOOK && (amt_book[item->sval] == 0 && item->sval >= 5)) || (item->tval == TV_MAGIC_BOOK && p_ptr->class->spell_book == TV_MAGIC_BOOK && (amt_book[item->sval] == 0 && item->sval >= 5)) || (item->tval == TV_SCROLL && (item->sval == SV_SCROLL_TELEPORT_LEVEL || item->sval == SV_SCROLL_TELEPORT))) { /* Hack-- Allow the borg to scum for this Item */ if (borg_self_scum && /* borg is allowed to scum */ borg_skill[BI_CLEVEL] >= 10 && /* Be of sufficient level */ borg_skill[BI_LIGHT] && /* Have some Perma lite source */ borg_skill[BI_FOOD] + num_food >= 100 && /* Have plenty of food */ item->cost <= 85000) /* Its not too expensive */ { int save_throw; /* Set some Savings Throw Percents based on Class */ if (borg_class == CLASS_ROGUE || borg_class == CLASS_WARRIOR) { save_throw = 95; } else { save_throw = 90; } if (adj_dex_safe[borg_skill[BI_DEX]] + borg_skill[BI_CLEVEL] > save_throw ) /* Good chance to thwart mugging */ { /* Record the amount that I need to make purchase */ borg_money_scum_amount = item->cost; borg_money_scum_who = who; borg_money_scum_ware = ware; } } /* Ok to buy this */ return (TRUE); } if ((borg_skill[BI_CLEVEL] < 15) && (borg_gold < 20000)) return (FALSE); if ((borg_skill[BI_CLEVEL] < 35) && (borg_gold < 15000)) return (FALSE); if (borg_gold < 10000) return (FALSE); } /* do not buy the item if I just sold it. */ for (p = 0; p < sold_item_num; p++) { if (sold_item_tval[p] == item->tval && sold_item_sval[p] == item->sval && sold_item_store[p] == who) { if (borg_verbose) borg_note(format("# Choosing not to buy back %s",item->desc)); return (FALSE); } } /* Do not buy a second digger */ if (item->tval == TV_DIGGING) { int ii; /* scan for an existing digger */ for (ii = 0; ii < INVEN_MAX_PACK; ii++) { borg_item *item2 = &borg_items[ii]; /* skip non diggers */ if (item2->tval == TV_DIGGING) return (FALSE); #if 0 /* perhaps let him buy a digger with a better * pval than his current digger */ {if (item->pval <= item2->pval) return (FALSE);} #endif } } /* Low level borgs should not waste the money on certain things */ if (borg_skill[BI_MAXCLEVEL] < 5) { /* next book, cant read it */ if ((item->tval == TV_MAGIC_BOOK || item->tval == TV_PRAYER_BOOK) && item->sval >=1) return (FALSE); } /* Rangers and Paladins and the extra books */ if ((borg_class == CLASS_PALADIN || borg_class == CLASS_RANGER) && borg_skill[BI_MAXCLEVEL] <= 8) { if ((item->tval == TV_MAGIC_BOOK || item->tval == TV_PRAYER_BOOK) && item->sval >=1) return (FALSE); } /* Okay */ return (TRUE); } /* * Step 3 -- buy "useful" things from a shop (to be used) */ static bool borg_think_shop_buy_aux(void) { int hole = INVEN_MAX_PACK - 1; int slot; int qty =1; int k, b_k = -1; int n, b_n = -1; s32b p, b_p = 0L; s32b c, b_c = 0L; bool fix = FALSE; /* Require one empty slot */ if (borg_items[hole].iqty) return (FALSE); if (borg_items[INVEN_MAX_PACK-1].iqty) return (FALSE); /* Already have a target 9-4-05*/ if (goal_ware != -1) return (FALSE); /* Extract the "power" */ b_p = my_power; b_p = borg_power(); /* Check the shops */ for (k = 0; k < (MAX_STORES -1 ); k++) { /* If I am bad shape up, only see certain stores */ if ((borg_skill[BI_CURLITE] == 0 || borg_skill[BI_FOOD] == 0) && k !=0 && k != 7) continue; if ((borg_skill[BI_ISCUT] || borg_skill[BI_ISPOISONED]) && k != 3) continue; /* Scan the wares */ for (n = 0; n < STORE_INVEN_MAX; n++) { borg_item *item = &borg_shops[k].ware[n]; /* Skip empty items */ if (!item->iqty) continue; /* Skip "bad" buys */ if (!borg_good_buy(item, k, n)) continue; /* Attempting to scum money, don't buy other stuff unless it is our home or food-store */ if (borg_money_scum_amount && (k != borg_money_scum_who || n != borg_money_scum_ware)) continue; /* Hack -- Require "sufficient" cash */ if (borg_gold < item->cost) continue; /* Skip it if I just sold this item. XXX XXX*/ /* Special check for 'immediate shopping' */ if (borg_skill[BI_FOOD] == 0 && (item->tval != TV_FOOD && (item->tval != TV_SCROLL && item->sval != SV_SCROLL_SATISFY_HUNGER))) continue; /* Don't fill up on attack wands, its ok to buy a few */ if (item->tval == TV_WAND && (item->sval == SV_WAND_MAGIC_MISSILE || item->sval == SV_WAND_STINKING_CLOUD) && amt_cool_wand > 40) continue; /* These wands are not useful later on, we need beefier attacks */ if (item->tval == TV_WAND && (item->sval == SV_WAND_MAGIC_MISSILE || item->sval == SV_WAND_STINKING_CLOUD) && borg_skill[BI_MAXCLEVEL] > 30) continue; /* Save shop item */ COPY(&safe_shops[k].ware[n], &borg_shops[k].ware[n], borg_item); /* Save hole */ COPY(&safe_items[hole], &borg_items[hole], borg_item); /* Save the number to trade */ qty = borg_min_item_quantity(item); /* Remove one item from shop (sometimes) */ borg_shops[k].ware[n].iqty -= qty; /* Obtain "slot" */ slot = borg_wield_slot(item); /* XXX what if the item is a ring? we have 2 ring slots --- copy it from the Home code */ /* He will not replace his Brightness Torch with a plain one, so he ends up * not buying any torches. Force plain torches for purchase to be seen as * fuel only */ if (item->tval == TV_LIGHT && item->sval == SV_LIGHT_TORCH && of_has(borg_items[INVEN_LIGHT].flags, OF_LIGHT)) { slot = -1; } /* Hack, we keep diggers as a back-up, not to * replace our current weapon */ if (item->tval == TV_DIGGING) slot = -1; /* if our current equip is cursed, then I can't * buy a new replacement. * XXX Perhaps he should not buy anything but save * money for the Remove Curse Scroll. */ if (slot >= INVEN_WIELD) { if (borg_items[slot].cursed) continue; if (of_has(borg_items[slot].flags, OF_HEAVY_CURSE)) continue; if (of_has(borg_items[slot].flags, OF_PERMA_CURSE)) continue; } /* Consider new equipment */ if (slot >= 0) { /* Save old item */ COPY(&safe_items[slot], &borg_items[slot], borg_item); /* Move equipment into inventory */ COPY(&borg_items[hole], &safe_items[slot], borg_item); /* Move new item into equipment */ COPY(&borg_items[slot], &safe_shops[k].ware[n], borg_item); /* Only a single item */ borg_items[slot].iqty = qty; /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ p = borg_power(); /* Restore old item */ COPY(&borg_items[slot], &safe_items[slot], borg_item); } /* Consider new inventory */ else { /* Move new item into inventory */ COPY(&borg_items[hole], &safe_shops[k].ware[n], borg_item); /* Only a single item */ borg_items[hole].iqty = qty; /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the equipment */ p = borg_power(); } /* Restore hole */ COPY(&borg_items[hole], &safe_items[hole], borg_item); /* Restore shop item */ COPY(&borg_shops[k].ware[n], &safe_shops[k].ware[n], borg_item); /* Obtain the "cost" of the item */ c = item->cost * qty; #if 0 /* Penalize the cost of expensive items */ if (c > borg_gold / 10) p -= c; #endif /* Ignore "bad" purchases */ if (p <= b_p) continue; /* Ignore "expensive" purchases */ if ((p == b_p) && (c >= b_c)) continue; /* Save the item and cost */ b_k = k; b_n = n; b_p = p; b_c = c; } } /* Examine the inventory */ if (fix) borg_notice(TRUE); /* Buy something */ if ((b_k >= 0) && (b_n >= 0)) { /* Visit that shop */ goal_shop = b_k; /* Buy that item */ goal_ware = b_n; /* Success */ return (TRUE); } /* Nope */ return (FALSE); } /* * Step 4 -- buy "useful" things from the home (to be used) */ static bool borg_think_home_buy_aux(void) { int hole = INVEN_MAX_PACK - 1; int slot, i; int stack; int qty=1; int n, b_n = -1; s32b p, b_p = 0L; s32b p_left = 0; s32b p_right = 0; bool fix = FALSE; bool skip_it = FALSE; /* Extract the "power" */ b_p = my_power; /* Scan the home */ for (n = 0; n < STORE_INVEN_MAX; n++) { borg_item *item = &borg_shops[7].ware[n]; /* Skip empty items */ if (!item->iqty) continue; /* Skip it if I just sold it */ for (i = 0; i < sold_item_num; i++) { if (sold_item_tval[i] == item->tval && sold_item_sval[i] == item->sval) { if (borg_verbose) borg_note(format("# Choosing not to buy back '%s' from home.", item->desc)); skip_it = TRUE; } } if (skip_it == TRUE) continue; /* Reset the 'hole' in case it was changed by the last stacked item.*/ hole = INVEN_MAX_PACK - 1; /* borg_note(format("# Considering buying (%d)'%s' (pval=%d) from home.", item->iqty,item->desc, item->pval)); */ /* Save shop item */ COPY(&safe_shops[7].ware[n], &borg_shops[7].ware[n], borg_item); /* Save hole */ COPY(&safe_items[hole], &borg_items[hole], borg_item); /* Save the number */ qty = borg_min_item_quantity(item); /* Remove one item from shop (sometimes) */ borg_shops[7].ware[n].iqty -= qty; /* Obtain "slot" */ slot = borg_wield_slot(item); stack = borg_slot(item->tval, item->sval); /* Consider new equipment-- Must check both ring slots */ if (slot >= 0) { /* Require one empty slot */ if (borg_items[INVEN_MAX_PACK-1].iqty) continue; if (borg_items[INVEN_MAX_PACK-2].iqty) continue; /* Check Rings */ if (slot == INVEN_LEFT) { /** First Check Left Hand **/ /* special curse check for left ring */ if (!borg_items[INVEN_LEFT].cursed) { /* Save old item */ COPY(&safe_items[slot], &borg_items[slot], borg_item); /* Move equipment into inventory */ COPY(&borg_items[hole], &safe_items[slot], borg_item); /* Move new item into equipment */ COPY(&borg_items[slot], &safe_shops[7].ware[n], borg_item); /* Only a single item */ borg_items[slot].iqty = qty; /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ p_left = borg_power(); #if 0 /* dump list and power... for debugging */ borg_note(format("Trying Item %s (best power %ld)",borg_items[slot].desc, p_left)); borg_note(format(" Against Item %s (borg_power %ld)",safe_items[slot].desc, my_power)); #endif /* Restore old item */ COPY(&borg_items[slot], &safe_items[slot], borg_item); } /** Second Check Right Hand **/ /* special curse check for right ring */ if (!borg_items[INVEN_RIGHT].cursed) { /* Save old item */ COPY(&safe_items[INVEN_RIGHT], &borg_items[INVEN_RIGHT], borg_item); /* Move equipment into inventory */ COPY(&borg_items[hole], &safe_items[INVEN_RIGHT], borg_item); /* Move new item into equipment */ COPY(&borg_items[INVEN_RIGHT], &safe_shops[7].ware[n], borg_item); /* Only a single item */ borg_items[INVEN_RIGHT].iqty = qty; /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ p_right = borg_power(); #if 0 /* dump list and power... for debugging */ borg_note(format("Trying Item %s (best power %ld)",borg_items[INVEN_RIGHT].desc, p_right)); borg_note(format(" Against Item %s (borg_power %ld)",safe_items[INVEN_RIGHT].desc, my_power)); #endif /* Restore old item */ COPY(&borg_items[INVEN_RIGHT], &safe_items[INVEN_RIGHT], borg_item); } /* Is this ring better than one of mine? */ p = MAX(p_right, p_left); } else /* non rings */ { /* do not consider if my current item is cursed */ if (slot != -1 && borg_items[slot].cursed) continue; /* Save old item */ COPY(&safe_items[slot], &borg_items[slot], borg_item); /* Move equipment into inventory */ COPY(&borg_items[hole], &safe_items[slot], borg_item); /* Move new item into equipment */ COPY(&borg_items[slot], &safe_shops[7].ware[n], borg_item); /* Only a single item */ borg_items[slot].iqty = qty; /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ p = borg_power(); #if 0 /* dump list and power... for debugging */ borg_note(format("Trying Item %s (best power %ld)",borg_items[slot].desc, p)); borg_note(format(" Against Item %s (borg_power %ld)",safe_items[slot].desc, my_power)); #endif /* Restore old item */ COPY(&borg_items[slot], &safe_items[slot], borg_item); } /* non rings */ } /* equip */ /* Consider new inventory */ else { if (stack != -1) hole = stack; /* Require one empty slot */ if (stack == -1 && borg_items[INVEN_MAX_PACK-1].iqty) continue; if (stack == -1 && borg_items[INVEN_MAX_PACK-2].iqty) continue; /* Save hole (could be either empty slot or stack */ COPY(&safe_items[hole], &borg_items[hole], borg_item); /* Move new item into inventory */ COPY(&borg_items[hole], &safe_shops[7].ware[n], borg_item); /* Is this new item merging into an exisiting stack? */ if (stack != -1) { /* Add a quantity to the stack */ borg_items[hole].iqty = safe_items[hole].iqty + qty; } else { /* Only a single item */ borg_items[hole].iqty = qty; } /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the equipment */ p = borg_power(); } /* Restore hole */ COPY(&borg_items[hole], &safe_items[hole], borg_item); /* Restore shop item */ COPY(&borg_shops[7].ware[n], &safe_shops[7].ware[n], borg_item); /* Ignore "silly" purchases */ if (p <= b_p) continue; /* Save the item and cost */ b_n = n; b_p = p; } /* Examine the inventory */ if (fix) borg_notice(TRUE); /* Buy something */ if ((b_n >= 0) && (b_p > my_power)) { /* Go to the home */ goal_shop = 7; /* Buy that item */ goal_ware = b_n; /* Success */ return (TRUE); } /* Nope */ return (FALSE); } /* * Step 5 -- buy "interesting" things from a shop (to be used later) */ static bool borg_think_shop_grab_aux(void) { int k, b_k = -1; int n, b_n = -1; int qty=1; s32b s, b_s = 0L; s32b c, b_c = 0L; s32b borg_empty_home_power; /* Dont do this if Sauron is dead */ if (borg_race_death[546] != 0) return (FALSE); /* not until later-- use that money for better equipment */ if (borg_skill[BI_CLEVEL] < 15) return (FALSE); /* get what an empty home would have for power */ borg_notice_home( NULL, TRUE ); borg_empty_home_power = borg_power_home(); b_home_power = &s; /* Require two empty slots */ if (borg_items[INVEN_MAX_PACK-1].iqty) return (FALSE); if (borg_items[INVEN_MAX_PACK-2].iqty) return (FALSE); /* Examine the home */ borg_notice_home(NULL, FALSE); /* Evaluate the home */ b_s = borg_power_home(); /* Check the shops */ for (k = 0; k < (MAX_STORES-1); k++) { /* Scan the wares */ for (n = 0; n < STORE_INVEN_MAX; n++) { borg_item *item = &borg_shops[k].ware[n]; /* Skip empty items */ if (!item->iqty) continue; /* Skip "bad" buys */ if (!borg_good_buy(item, k, n)) continue; /* Dont buy easy spell books late in the game */ /* Hack -- Require some "extra" cash */ if (borg_gold < 1000L + item->cost * 5) continue; /* make this the next to last item that the player has */ /* (can't make it the last or it thinks that both player and */ /* home are full) */ COPY(&borg_items[INVEN_MAX_PACK-2], &borg_shops[k].ware[n], borg_item); /* Save the number */ qty = borg_min_item_quantity(item); /* Give a single item */ borg_items[INVEN_MAX_PACK-2].iqty = qty; /* make sure this item would help an empty home */ borg_notice_home( &borg_shops[k].ware[n], FALSE ); if (borg_empty_home_power >= borg_power_home()) continue; /* optimize the home inventory */ if (!borg_think_home_sell_aux( TRUE )) continue; /* Obtain the "cost" of the item */ c = item->cost * qty; /* Penalize expensive items */ if (c > borg_gold / 10) s -= c; /* Ignore "bad" sales */ if (s < b_s) continue; /* Ignore "expensive" purchases */ if ((s == b_s) && (c >= b_c)) continue; /* Save the item and cost */ b_k = k; b_n = n; b_s = s; b_c = c; } } /* restore inventory hole (just make sure the last slot goes back to */ /* empty) */ borg_items[INVEN_MAX_PACK-2].iqty = 0; /* Examine the real home */ borg_notice_home(NULL, FALSE); /* Evaluate the home */ s = borg_power_home(); /* remove the target that optimizing the home gave */ goal_shop = goal_ware = goal_item = -1; /* Buy something */ if ((b_k >= 0) && (b_n >= 0)) { /* Visit that shop */ goal_shop = b_k; /* Buy that item */ goal_ware = b_n; /* Success */ return (TRUE); } /* Nope */ return (FALSE); } /* * Step 6 -- take "useless" things from the home (to be sold) */ static bool borg_think_home_grab_aux(void) { int p, n, b_n = -1; s32b s, b_s = 0L; int qty=1; bool skip_it = FALSE; /* Require two empty slots */ if (borg_items[INVEN_MAX_PACK-1].iqty) return (FALSE); if (borg_items[INVEN_MAX_PACK-2].iqty) return (FALSE); /* Examine the home */ borg_notice_home(NULL, FALSE); /* Evaluate the home */ b_s = borg_power_home(); /* Scan the home */ for (n = 0; n < STORE_INVEN_MAX; n++) { borg_item *item = &borg_shops[7].ware[n]; /* Skip empty items */ if (!item->iqty) continue; /* skip stuff if we sold bought it */ for (p = 0; p < sold_item_num; p++) { if (sold_item_tval[p] == item->tval && sold_item_sval[p] == item->sval && sold_item_store[p] == 7) skip_it = TRUE; } if (skip_it == TRUE) continue; /* Save shop item */ COPY(&safe_shops[7].ware[n], &borg_shops[7].ware[n], borg_item); /* Save the number */ qty = borg_min_item_quantity(item); /* Remove one item from shop */ borg_shops[7].ware[n].iqty -= qty; /* Examine the home */ borg_notice_home(NULL, FALSE); /* Evaluate the home */ s = borg_power_home(); /* Restore shop item */ COPY(&borg_shops[7].ware[n], &safe_shops[7].ware[n], borg_item); /* Ignore "bad" sales */ if (s < b_s) continue; /* Maintain the "best" */ b_n = n; b_s = s; } /* Examine the home */ borg_notice_home(NULL, FALSE); /* Evaluate the home */ s = borg_power_home(); /* Stockpile */ if (b_n >= 0) { /* Visit the home */ goal_shop = 7; /* Grab that item */ goal_ware = b_n; /* Success */ return (TRUE); } /* Assume not */ return (FALSE); } /* * Step 7A -- buy "useful" weapons from the home (to be used as a swap) */ static bool borg_think_home_buy_swap_weapon(void) { int hole; int slot; int old_weapon_swap; s32b old_weapon_swap_value; int old_armour_swap; s32b old_armour_swap_value; int n, b_n = -1; s32b p = 0L, b_p = 0L; bool fix = FALSE; /* save the current values */ old_weapon_swap = weapon_swap; old_weapon_swap_value = weapon_swap_value; old_armour_swap = armour_swap; old_armour_swap_value = armour_swap_value; if (weapon_swap <= 0 || weapon_swap_value <=0) { hole = INVEN_MAX_PACK - 1; weapon_swap_value = -1L; } else { hole = weapon_swap; } /* Extract the "power" */ b_p = weapon_swap_value; /* Scan the home */ for (n = 0; n < STORE_INVEN_MAX; n++) { borg_item *item = &borg_shops[7].ware[n]; /* Skip empty items */ if (!item->iqty) continue; /* Obtain "slot" make sure its a weapon */ slot = borg_wield_slot(item); if (slot != INVEN_WIELD) continue; /* Save shop item */ COPY(&safe_shops[7].ware[n], &borg_shops[7].ware[n], borg_item); /* Save hole */ COPY(&safe_items[hole], &borg_items[hole], borg_item); /* Remove one item from shop */ borg_shops[7].ware[n].iqty--; /* Consider new equipment */ if (slot == INVEN_WIELD) { /* Move new item into inventory */ COPY(&borg_items[hole], &safe_shops[7].ware[n], borg_item); /* Only a single item */ borg_items[hole].iqty = 1; /* Fix later */ fix = TRUE; /* Examine the iventory and swap value*/ borg_notice(TRUE); /* Evaluate the new equipment */ p = weapon_swap_value; } /* Restore hole */ COPY(&borg_items[hole], &safe_items[hole], borg_item); /* Restore shop item */ COPY(&borg_shops[7].ware[n], &safe_shops[7].ware[n], borg_item); /* Ignore "silly" purchases */ if (p <= b_p) continue; /* Save the item and value */ b_n = n; b_p = p; } /* Examine the inventory */ if (fix) borg_notice(TRUE); /* Buy something */ if ((b_n >= 0) && (b_p > weapon_swap_value)) { /* Go to the home */ goal_shop = 7; /* Buy that item */ goal_ware = b_n; /* Restore the values */ weapon_swap = old_weapon_swap; weapon_swap_value = old_weapon_swap_value; armour_swap = old_armour_swap; armour_swap_value = old_armour_swap_value; /* Success */ return (TRUE); } /* Restore the values */ weapon_swap = old_weapon_swap; weapon_swap_value = old_weapon_swap_value; armour_swap = old_armour_swap; armour_swap_value = old_armour_swap_value; /* Nope */ return (FALSE); } /* * Step 7B -- buy "useful" armour from the home (to be used as a swap) */ static bool borg_think_home_buy_swap_armour(void) { int hole; int n, b_n = -1; s32b p, b_p = 0L; bool fix = FALSE; int old_weapon_swap; s32b old_weapon_swap_value; int old_armour_swap; s32b old_armour_swap_value; /* save the current values */ old_weapon_swap = weapon_swap; old_weapon_swap_value = weapon_swap_value; old_armour_swap = armour_swap; old_armour_swap_value = armour_swap_value; if (armour_swap <= 1 || armour_swap_value <=0 ) { hole = INVEN_MAX_PACK - 1; armour_swap_value = -1L; } else { hole = armour_swap; } /* Extract the "power" */ b_p = armour_swap_value; /* Scan the home */ for (n = 0; n < STORE_INVEN_MAX; n++) { borg_item *item = &borg_shops[7].ware[n]; /* Skip empty items */ if (!item->iqty) continue; /* Save shop item */ COPY(&safe_shops[7].ware[n], &borg_shops[7].ware[n], borg_item); /* Save hole */ COPY(&safe_items[hole], &borg_items[hole], borg_item); /* Remove one item from shop */ borg_shops[7].ware[n].iqty--; /* Move new item into inventory */ COPY(&borg_items[hole], &safe_shops[7].ware[n], borg_item); /* Only a single item */ borg_items[hole].iqty = 1; /* Fix later */ fix = TRUE; /* Examine the inventory (false)*/ borg_notice(TRUE); /* Evaluate the new equipment */ p = armour_swap_value; /* Restore hole */ COPY(&borg_items[hole], &safe_items[hole], borg_item); /* Restore shop item */ COPY(&borg_shops[7].ware[n], &safe_shops[7].ware[n], borg_item); /* Ignore "silly" purchases */ if (p <= b_p) continue; /* Save the item and value */ b_n = n; b_p = p; } /* Examine the inventory */ if (fix) borg_notice(TRUE); /* Buy something */ if ((b_n >= 0) && (b_p > armour_swap_value)) { /* Go to the home */ goal_shop = 7; /* Buy that item */ goal_ware = b_n; /* Restore the values */ weapon_swap = old_weapon_swap; weapon_swap_value = old_weapon_swap_value; armour_swap = old_armour_swap; armour_swap_value = old_armour_swap_value; /* Success */ return (TRUE); } /* Restore the values */ weapon_swap = old_weapon_swap; weapon_swap_value = old_weapon_swap_value; armour_swap = old_armour_swap; armour_swap_value = old_armour_swap_value; /* Nope */ return (FALSE); } /* * Choose a shop to visit (see above) */ static bool borg_choose_shop(void) { /* Must be in town */ if (borg_skill[BI_CDEPTH]) return (FALSE); /* Forbid if been sitting on level forever */ /* Just come back and work through the loop later */ if (borg_t - borg_began > 2000) return (FALSE); if (time_this_panel > 1350) return (FALSE); /* Already flowing to a store to sell something */ if (goal_shop != -1 && goal_ware != -1) return (TRUE); /* If poisoned or bleeding -- flow to temple */ if (borg_skill[BI_ISCUT] || borg_skill[BI_ISPOISONED]) goal_shop = 3; /* If Starving -- flow to general store */ if (borg_skill[BI_FOOD] == 0 || (borg_skill[BI_CURLITE] == 0 && borg_skill[BI_CLEVEL] >= 2)) { /* G Store first */ goal_shop = 0; } /* Do a quick cheat of the shops and inventory */ borg_cheat_store(); borg_notice(TRUE); /* if No Lantern -- flow to general store */ if (borg_skill[BI_CURLITE] == 1 && borg_gold >= 100 /* && !borg_shops[0].when */) goal_shop = 0; /* If poisoned, bleeding, or needing to shop instantly * Buy items straight away, without having to see each shop */ if ((borg_skill[BI_CURLITE] == 0 || borg_skill[BI_FOOD] == 0 || borg_skill[BI_ISCUT] || borg_skill[BI_ISPOISONED]) || (borg_skill[BI_CURLITE] == 1 && borg_gold >= 100 && borg_skill[BI_CLEVEL] < 10)) { if (borg_think_shop_buy_aux()) { /* Message */ borg_note(format("# Buying '%s' at '%s' immediately", borg_shops[goal_shop].ware[goal_ware].desc, f_info[0x08+goal_shop].name)); /* Set my Quick Shopping flag */ borg_needs_quick_shopping = TRUE; /* Success */ return (TRUE); } /* if temple is out of healing stuff, try the house */ if (borg_think_home_buy_aux()) { /* Message */ borg_note(format("# Buying '%s' from the home immediately.", borg_shops[goal_shop].ware[goal_ware].desc)); /* Success */ return (TRUE); } } #if 0 /* Must have visited all shops first---complete information */ for (i = 0; i < (MAX_STORES); i++) { borg_shop *shop = &borg_shops[i]; /* Skip "visited" shops */ if (!shop->when && !goal_shop) return (FALSE); } #endif /* if we are already flowing toward a shop do not check again... */ if (goal_shop != -1 && goal_ware != -1) return TRUE; /* Assume no important shop */ goal_shop = goal_ware = goal_item = -1; borg_needs_quick_shopping= FALSE; /* if the borg is scumming for cash for the human player and not himself, * we dont want him messing with the home inventory */ if (borg_gold < borg_money_scum_amount && borg_money_scum_amount != 0 && !borg_skill[BI_CDEPTH] && borg_skill[BI_LIGHT] && !borg_self_scum) { /* Step 0 -- Buy items from the shops (for the player while scumming) */ if (borg_think_shop_buy_aux()) { /* Message */ borg_note(format("# Buying '%s' at '%s' (money scumming)", borg_shops[goal_shop].ware[goal_ware].desc, f_info[0x08+goal_shop].name)); /* Success */ return (TRUE); } else return (FALSE); } /* Step 1 -- Sell items to the home */ if (borg_think_home_sell_aux( FALSE )) { /* Message */ if (goal_item != -1) borg_note(format("# Selling '%s' to the home", borg_items[goal_item].desc)); else borg_note(format("# Buying '%s' from the home (step 1)", borg_shops[goal_shop].ware[goal_ware].desc)); /* Success */ return (TRUE); } /* Step 2 -- Sell items to the shops */ if (borg_think_shop_sell_aux()) { /* Message */ borg_note(format("# Selling '%s' at '%s'", borg_items[goal_item].desc, f_info[0x08+goal_shop].name)); /* Success */ return (TRUE); } /* Step 3 -- Buy items from the shops (for the player) */ if (borg_think_shop_buy_aux()) { /* Message */ borg_note(format("# Buying '%s'(%c) at '%s' (for player 'b')", borg_shops[goal_shop].ware[goal_ware].desc,shop_orig[goal_ware], f_info[0x08+goal_shop].name)); /* Success */ return (TRUE); } /* Step 4 -- Buy items from the home (for the player) */ if (borg_think_home_buy_aux()) { /* Message */ borg_note(format("# Buying '%s' from the home (step 4)", borg_shops[goal_shop].ware[goal_ware].desc)); /* Success */ return (TRUE); } /* get rid of junk from home first. That way the home is 'uncluttered' */ /* before you buy stuff for it. This will prevent the problem where an */ /* item has become a negative value and swapping in a '0' gain item */ /* (like pottery) is better. */ /* Step 5 -- Grab items from the home (for the shops) */ if (borg_think_home_grab_aux()) { /* Message */ borg_note(format("# Grabbing (to sell) '%s' from the home", borg_shops[goal_shop].ware[goal_ware].desc)); /* Success */ return (TRUE); } /* Do not Stock Up the home while money scumming */ if (borg_money_scum_amount) return (FALSE); /* Step 6 -- Buy items from the shops (for the home) */ if (borg_think_shop_grab_aux()) { /* Message */ borg_note(format("# Grabbing (for home) '%s' at '%s'", borg_shops[goal_shop].ware[goal_ware].desc, f_info[0x08+goal_shop].name)); /* Success */ return (TRUE); } /* Step 7A -- Buy weapons from the home (as a backup item) */ if (borg_uses_swaps && borg_think_home_buy_swap_weapon()) { /* Message */ borg_note(format("# Buying '%s' from the home as a backup", borg_shops[goal_shop].ware[goal_ware].desc)); /* Success */ return (TRUE); } /* Step 7B -- Buy armour from the home (as a backup item) */ if (borg_uses_swaps && borg_think_home_buy_swap_armour()) { /* Message */ borg_note(format("# Buying '%s' from the home as a backup", borg_shops[goal_shop].ware[goal_ware].desc)); /* Success */ return (TRUE); } /* Failure */ return (FALSE); } /* * Sell items to the current shop, if desired */ static bool borg_think_shop_sell(void) { int qty= 1; /* Sell something if requested */ if ((goal_shop == shop_num) && (goal_item >= 0)) { borg_item *item = &borg_items[goal_item]; qty = borg_min_item_quantity(item); /* Remove the inscription */ /* 309 does not allow for } while in the store */ /* if (item->tval == TV_FOOD) borg_send_deinscribe(goal_item); */ /* Log */ borg_note(format("# Selling %s", item->desc)); /* Buy an item */ borg_keypress('s'); /* Buy the desired item */ borg_keypress(I2A(goal_item)); /* Hack -- Sell a single item */ if (item->iqty > 1 || qty >= 2) { if (qty == 5) borg_keypress('5'); if (qty == 4) borg_keypress('4'); if (qty == 3) borg_keypress('3'); if (qty == 2) borg_keypress('2'); borg_keypress(KC_ENTER); } /* Mega-Hack -- Accept the price */ if (goal_shop != 7) { borg_keypress(KC_ENTER); borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress(ESCAPE); } /* Mark our last item sold */ if (sold_item_nxt >= 9) sold_item_nxt = 0; sold_item_pval[sold_item_nxt] = item->pval; sold_item_tval[sold_item_nxt] = item->tval; sold_item_sval[sold_item_nxt] = item->sval; sold_item_store[sold_item_nxt] = goal_shop; sold_item_num = sold_item_nxt; sold_item_nxt ++; /* The purchase is complete */ goal_shop = goal_ware = goal_item = -1; /* tick the anti-loop clock */ time_this_panel ++; /* I'm not in a store */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_in_shop = FALSE; borg_do_inven = TRUE; /* Success */ return (TRUE); } /* Nope */ return (FALSE); } /* * Buy items from the current shop, if desired */ static bool borg_think_shop_buy(void) { char purchase_target = '0'; /* Buy something if requested */ if ((goal_shop == shop_num) && (goal_ware >= 0)) { borg_shop *shop = &borg_shops[goal_shop]; borg_item *item = &shop->ware[goal_ware]; purchase_target = shop_orig[goal_ware]; /* Paranoid */ if (item->tval == 0) { /* The purchase is complete */ goal_shop = goal_ware = goal_item = -1; /* Increment our clock to avoid loops */ time_this_panel ++; return (FALSE); } /* Log */ borg_note(format("# Buying %s.", item->desc)); /* Buy the desired item */ borg_keypress(purchase_target); borg_keypress('p'); /* Mega-Hack -- Accept the price */ borg_keypress(KC_ENTER); borg_keypress(KC_ENTER); borg_keypress(' '); borg_keypress(' '); borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress(ESCAPE); /* if the borg is scumming and bought it., * reset the scum amount. */ if (borg_money_scum_amount && (item->cost >= borg_money_scum_amount * 9 / 10)) { borg_money_scum_amount = 0; /* Log */ borg_note(format("# Setting Money Scum to %s.", borg_money_scum_amount)); } /* Remember what we bought to avoid buy/sell loops */ if (bought_item_nxt >= 9) bought_item_nxt = 0; bought_item_pval[bought_item_nxt] = item->pval; bought_item_tval[bought_item_nxt] = item->tval; bought_item_sval[bought_item_nxt] = item->sval; bought_item_store[bought_item_nxt] = goal_shop; bought_item_num = bought_item_nxt; bought_item_nxt ++; /* The purchase is complete */ goal_shop = goal_ware = goal_item = -1; /* Increment our clock to avoid loops */ time_this_panel ++; /* leave the store */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); /* I'm not in a store */ borg_in_shop = FALSE; /* Success */ return (TRUE); } /* Nothing to buy */ return (FALSE); } /* * Deal with being in a store */ bool borg_think_store(void) { /* Hack -- prevent clock wrapping */ if (borg_t >= 20000 && borg_t <=20010) { /* Clear Possible errors */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress(ESCAPE); /* Re-examine inven and equip */ borg_do_inven = TRUE; borg_do_equip = TRUE; } /* update all my equipment and swap items */ borg_do_inven = TRUE; borg_do_equip = TRUE; borg_notice(TRUE); #if 0 /* Stamp the shop with a time stamp */ borg_shops[shop_num].when = borg_t; #endif /* Wear "optimal" equipment */ if (borg_best_stuff()) return (TRUE); /* If using a digger, Wear "useful" equipment. * unless that digger is an artifact, then treat * it as a normal weapon */ if (borg_items[INVEN_WIELD].tval == TV_DIGGING && !borg_items[INVEN_WIELD].name1 && borg_wear_stuff()) return (TRUE); /* Choose a shop to visit. Goal_shop indicates he is trying to sell something somewhere. */ if (borg_choose_shop()) { /* Note Pref. */ borg_note(format("# Currently in store '%d' would prefer '%d'.",shop_num+1,goal_shop+1)); /* Try to sell stuff */ if (borg_think_shop_sell()) return (TRUE); /* Try to buy stuff */ if (borg_think_shop_buy()) return (TRUE); } /* No shop */ goal_shop = goal_ware = goal_item = -1; /* Leave the store */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress(ESCAPE); /* Done */ return (TRUE); } /* Attempt a series of maneuvers to stay alive when you run out of light */ bool borg_think_dungeon_light(void) { int ii, x, y; bool not_safe = FALSE; borg_grid *ag; /* Consume needed things */ if (borg_skill[BI_ISHUNGRY] && borg_use_things()) return (TRUE); if (!borg_skill[BI_LIGHT] && (borg_skill[BI_CURLITE] <= 0 || borg_items[INVEN_LIGHT].timeout <= 3) && borg_skill[BI_CDEPTH] >= 1) { enum borg_need need; /* I am recalling, sit here till it engages. */ if (goal_recalling) { /* just wait */ borg_keypress('R'); borg_keypress('9'); borg_keypress(KC_ENTER); return (TRUE); } /* wear stuff and see if it glows */ if (borg_wear_stuff()) return (TRUE); if (borg_wear_quiver()) return (TRUE); /* attempt to refuel/swap */ need = borg_maintain_light(); if (need == BORG_MET_NEED) return (TRUE); if (need == BORG_NO_NEED) return (FALSE); /* Can I recall out with a rod */ if (!goal_recalling && borg_zap_rod(SV_ROD_RECALL)) return (TRUE); /* Can I recall out with a spell */ if (!goal_recalling && borg_recall()) return (TRUE); /* Log */ borg_note("# Testing for stairs ."); /* Test for stairs */ borg_keypress('<'); /* If on a glowing grid, got some food, and low mana, then rest here */ if ((borg_skill[BI_CURSP] < borg_skill[BI_MAXSP] && borg_skill[BI_MAXSP] > 0) && (borg_grids[c_y][c_x].info & BORG_GLOW) && !borg_skill[BI_ISWEAK] && (borg_prayer_legal(1, 5) || borg_spell_legal(2, 0) || borg_skill[BI_FOOD] >= borg_skill[BI_CDEPTH]) && (borg_prayer_legal(0, 4) || borg_spell_legal(0, 3)) && (!borg_prayer_okay(0, 4) && !borg_spell_okay(0, 3))) { /* Scan grids adjacent to me */ for (ii = 0; ii < 8; ii++) { x = c_x + ddx_ddd[ii]; y = c_y + ddy_ddd[ii]; /* Bounds check */ if (!cave_in_bounds_fully(cave, y,x)) continue; /* Access the grid */ ag = &borg_grids[y][x]; /* Check for adjacent Monster */ if (ag->kill) { not_safe = TRUE; } } /* Be concerned about the Regional Fear. */ if (borg_fear_region[c_y/11][c_x/11] > borg_skill[BI_CURHP] / 10) not_safe = TRUE; /* Be concerned about the Monster Fear. */ if (borg_fear_monsters[c_y][c_x] > borg_skill[BI_CURHP] / 10) not_safe = TRUE; /* rest here to gain some mana */ if (!not_safe) { borg_note("# Resting on this Glowing Grid to gain mana."); borg_keypress('R'); borg_keypress('*'); borg_keypress(KC_ENTER); return (TRUE); } } /* If I have the capacity to Call Light, then do so if adjacent to a dark grid. * We can illuminate the entire dungeon, looking for stairs. */ /* Scan grids adjacent to me */ for (ii = 0; ii < 8; ii++) { x = c_x + ddx_ddd[ii]; y = c_y + ddy_ddd[ii]; /* Bounds check */ if (!cave_in_bounds_fully(cave, y,x)) continue; /* Access the grid */ ag = &borg_grids[y][x]; /* skip the Wall grids */ if (ag->feat >= FEAT_RUBBLE && ag->feat <= FEAT_PERM_SOLID) continue; /* Problem with casting Call Light on Open Doors */ if ((ag->feat == FEAT_OPEN || ag->feat == FEAT_BROKEN) && (y == c_y && x == c_x)) { /* Cheat the grid info to see if the door is lit */ if (cave->feat[c_y][c_x] == CAVE_GLOW) ag->info |= BORG_GLOW; continue; } /* Look for a dark one */ if ((ag->info & BORG_DARK) || /* Known to be dark */ ag->feat == FEAT_NONE || /* Nothing known about feature */ !(ag->info & BORG_MARK) || /* Nothing known about info */ !(ag->info & BORG_GLOW)) /* not glowing */ { /* Attempt to Call Light */ if (borg_activate_artifact(EF_ILLUMINATION) || borg_zap_rod(SV_ROD_ILLUMINATION) || borg_use_staff(SV_STAFF_LIGHT) || borg_read_scroll(SV_SCROLL_LIGHT) || borg_spell(0, 3) || borg_prayer(0, 4)) { borg_note("# Illuminating the region while dark."); borg_react("SELF:lite", "SELF:lite"); return (TRUE); } /* Attempt to use Light Beam requiring a direction. */ if (borg_LIGHT_beam(FALSE)) return (TRUE); } } /* Try to flow to upstairs if on level one */ if (borg_flow_stair_less(GOAL_FLEE, FALSE)) { /* Take the stairs */ /* Log */ borg_note("# Taking up Stairs stairs (low Light)."); borg_keypress('<'); return (TRUE); } /* Try to flow to a lite */ if (borg_skill[BI_RECALL] && borg_flow_light(GOAL_FLEE)) { return (TRUE); } } /* Nothing to do */ return (FALSE); } /* This is an exploitation function. The borg will stair scum * in the dungeon to grab items close to the stair. */ bool borg_think_stair_scum(bool from_town) { int j, b_j = -1; int i; borg_grid *ag = &borg_grids[c_y][c_x]; byte feat = cave->feat[c_y][c_x]; enum borg_need need; /* examine equipment and swaps */ borg_notice(TRUE); /* No scumming mode if starving or in town */ if (borg_skill[BI_CDEPTH] == 0 || borg_skill[BI_ISWEAK]) { borg_note("# Leaving Scumming Mode. (Town or Weak)"); borg_lunal_mode = FALSE; return (FALSE); } /* No scumming if inventory is full. Require one empty slot */ if (borg_items[INVEN_MAX_PACK-1].iqty) return (FALSE); /* if borg is just starting on this level, he may not * know that a stair is under him. Cheat to see if one is * there */ if (feat == FEAT_MORE && ag->feat != FEAT_MORE) { /* Check for an existing "down stairs" */ for (i = 0; i < track_more_num; i++) { /* We already knew about that one */ if ((track_more_x[i] == c_x) && (track_more_y[i] == c_y)) break; } /* Track the newly discovered "down stairs" */ if ((i == track_more_num) && (i < track_more_size)) { track_more_x[i] = c_x; track_more_y[i] = c_y; track_more_num++; } /* tell the array */ ag->feat = FEAT_MORE; } if (feat == FEAT_LESS && ag->feat != FEAT_LESS) { /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { /* We already knew about this one */ if ((track_less_x[i] == c_x) && (track_less_y[i] == c_y)) continue; } /* Track the newly discovered "up stairs" */ if ((i == track_less_num) && (i < track_less_size)) { track_less_x[i] = c_x; track_less_y[i] = c_y; track_less_num++; } /* Tell the array */ ag->feat = FEAT_LESS; } /** First deal with staying alive **/ /* Hack -- require light */ need = borg_maintain_light(); if (need == BORG_MET_NEED) return TRUE; else if (need == BORG_UNMET_NEED) borg_note("# Scum. (need fuel)"); /** Track down some interesting gear **/ /* XXX Should we allow him great flexibility in retreiving loot? (not always safe?)*/ /* Continue flowing towards objects */ if (borg_flow_old(GOAL_TAKE)) return (TRUE); /* Find a (viewable) object */ if (borg_flow_take_scum(TRUE, 6)) return (TRUE); /*leave level right away. */ borg_note("# Fleeing level. Scumming Mode"); goal_fleeing = TRUE; /* Scumming Mode - Going down */ if (track_more_num && (ag->feat == FEAT_MORE || ag->feat == FEAT_LESS || borg_skill[BI_CDEPTH] < 30)) { int y, x; if (track_more_num >= 2) borg_note("# Scumming Mode: I know of a down stair."); /* Check for an existing "down stairs" */ for (i = 0; i < track_more_num; i++) { x = track_more_x[i]; y = track_more_y[i]; /* How far is the nearest down stairs */ j = distance(c_y, c_x, y, x); /* skip the far ones */ if (b_j <= j && b_j != -1) continue; /* track it */ b_j =j; } /* if the downstair is close and path is safe, continue on */ if (b_j < 8 || ag->feat == FEAT_MORE || borg_skill[BI_CDEPTH] < 30) { /* Note */ borg_note("# Scumming Mode. Power Diving. "); /* Continue leaving the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Flow to DownStair */ if (borg_flow_stair_more(GOAL_FLEE, FALSE, FALSE)) return (TRUE); /* if standing on a stair */ if (ag->feat == FEAT_MORE) { /* Take the DownStair */ borg_on_upstairs = TRUE; borg_keypress('>'); return (TRUE); } } } /* Scumming Mode - Going up */ if (track_less_num && borg_skill[BI_CDEPTH] != 1 && (ag->feat == FEAT_MORE || ag->feat == FEAT_LESS)) { int y, x; borg_grid *ag = &borg_grids[c_y][c_x]; /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* skip the far ones */ if (b_j <= j && b_j != -1) continue; /* track it */ b_j =j; } /* if the upstair is close and safe path, continue */ if (b_j < 8 || ag->feat == FEAT_LESS) { /* Note */ borg_note("# Scumming Mode. Power Climb. "); /* Set to help borg move better */ goal_less = TRUE; /* Continue leaving the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Flow to UpStair */ if (borg_flow_stair_less(GOAL_FLEE, FALSE)) { borg_note("# Looking for stairs. Scumming Mode."); /* Success */ return (TRUE); } if (ag->feat == FEAT_LESS) { /* Take the Up Stair */ borg_on_dnstairs = TRUE; borg_keypress('<'); return (TRUE); } } } /* Special case where the borg is off a stair and there * is a monster in LOS. He could freeze and unhook, or * move to the closest stair and risk the run. */ if (borg_skill[BI_CDEPTH] >= 2) { /* Continue fleeing to stair */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Note */ borg_note("# Scumming Mode. Any Stair. "); /* Try to find some stairs */ if (borg_flow_stair_both(GOAL_FLEE, TRUE)) return (TRUE); } /* return to normal borg_think_dungeon */ return (FALSE); } /* This is an exploitation function. The borg will stair scum * in the dungeon to get to the bottom of the dungeon asap. * Once down there, he can be told to do something. * * Dive if stairs are close and safe. * Retreat off level if monster has LOS to borg. * Fill Lantern * Eat food * Call light. might be dangerous because monster get a chance to hit us. */ bool borg_think_dungeon_lunal(void) { bool safe_place = FALSE; int j, b_j = -1; int i; borg_grid *ag = &borg_grids[c_y][c_x]; byte feat = cave->feat[c_y][c_x]; enum borg_need need; /* examine equipment and swaps */ borg_notice(TRUE); /* No Lunal mode if starving or in town */ if (borg_skill[BI_CDEPTH] == 0 || borg_skill[BI_ISWEAK]) { borg_note("# Leaving Lunal Mode. (Town or Weak)"); borg_lunal_mode = FALSE; return (FALSE); } /* if borg is just starting on this level, he may not * know that a stair is under him. Cheat to see if one is * there */ if (feat == FEAT_MORE && ag->feat != FEAT_MORE) { /* Check for an existing "down stairs" */ for (i = 0; i < track_more_num; i++) { /* We already knew about that one */ if ((track_more_x[i] == c_x) && (track_more_y[i] == c_y)) break; } /* Track the newly discovered "down stairs" */ if ((i == track_more_num) && (i < track_more_size)) { track_more_x[i] = c_x; track_more_y[i] = c_y; track_more_num++; } /* tell the array */ ag->feat = FEAT_MORE; } if (feat == FEAT_LESS && ag->feat != FEAT_LESS) { /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { /* We already knew about this one */ if ((track_less_x[i] == c_x) && (track_less_y[i] == c_y)) continue; } /* Track the newly discovered "up stairs" */ if ((i == track_less_num) && (i < track_less_size)) { track_less_x[i] = c_x; track_less_y[i] = c_y; track_less_num++; } /* Tell the array */ ag->feat = FEAT_LESS; } /* Act normal on 1 unless stairs are seen*/ if (borg_skill[BI_CDEPTH] == 1 && track_more_num == 0) { borg_lunal_mode = FALSE; return (FALSE); } /* If no down stair is known, act normal */ if (track_more_num ==0 && track_less_num == 0) { borg_note("# Leaving Lunal Mode. (No Stairs seen)"); borg_lunal_mode = FALSE; return (FALSE); } /* If self scumming and getting closer to zone, act normal */ if (borg_self_lunal) { if (borg_skill[BI_MAXDEPTH] <= borg_skill[BI_CDEPTH] + 15 || (char *)NULL != borg_prepared(borg_skill[BI_CDEPTH] - 5) || borg_skill[BI_CDEPTH] >= 50 || borg_skill[BI_CDEPTH] == 0 || borg_skill[BI_ISWEAK]) { borg_lunal_mode = FALSE; goal_fleeing = FALSE; goal_fleeing_lunal = FALSE; borg_note("# Self Lunal mode disengaged normally."); return (FALSE); } } /** First deal with staying alive **/ /* Hack -- require light */ need = borg_maintain_light(); if (need == BORG_MET_NEED) return TRUE; else if (need == BORG_UNMET_NEED) borg_note("# Lunal. (need fuel)"); /* No Light at all */ if (borg_skill[BI_CURLITE] == 0 && borg_items[INVEN_LIGHT].tval == 0) { borg_note("# No Light at all."); return (FALSE); } /* Define if safe_place is true or not */ safe_place = borg_check_rest(c_y, c_x); /* Light Room, looking for monsters */ /* if (safe_place && borg_check_LIGHT_only()) return (TRUE); */ /* Check for stairs and doors and such */ /* if (safe_place && borg_check_LIGHT()) return (TRUE); */ /* Recover from any nasty condition */ if (safe_place && borg_recover()) return (TRUE); /* Consume needed things */ if (safe_place && borg_use_things()) return (TRUE); /* Consume needed things */ if (borg_skill[BI_ISHUNGRY] && borg_use_things()) return (TRUE); /* Crush junk if convienent */ if (safe_place && borg_crush_junk()) return (TRUE); /** Track down some interesting gear **/ /* XXX Should we allow him great flexibility in retreiving loot? (not always safe?)*/ /* Continue flowing towards objects */ if (safe_place && borg_flow_old(GOAL_TAKE)) return (TRUE); /* Find a (viewable) object */ if (safe_place && borg_flow_take_lunal(TRUE, 4)) return (TRUE); /*leave level right away. */ borg_note("# Fleeing level. Lunal Mode"); goal_fleeing_lunal = TRUE; goal_fleeing = TRUE; /* Full of Items - Going up */ if (track_less_num && borg_items[INVEN_MAX_PACK-2].iqty && (safe_place || ag->feat == FEAT_MORE || ag->feat == FEAT_LESS)) { int y, x; int closeness = 8; borg_grid *ag = &borg_grids[c_y][c_x]; /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* skip the far ones */ if (b_j <= j && b_j != -1) continue; /* track it */ b_j =j; } /* if on depth 1, try to venture more to get back to town */ if (borg_skill[BI_CDEPTH] == 1) { if (track_less_num) { closeness = 20; } } /* if the upstair is close and safe path, continue */ if ((b_j < closeness && safe_place) || ag->feat == FEAT_LESS) { /* Note */ borg_note("# Lunal Mode. Power Climb (needing to sell). "); /* Set to help borg move better */ goal_less = TRUE; /* Continue leaving the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Flow to UpStair */ if (borg_flow_stair_less(GOAL_FLEE, FALSE)) { borg_note("# Looking for stairs. Lunal Mode (needing to sell)."); /* Success */ return (TRUE); } if (ag->feat == FEAT_LESS) { /* Take the Up Stair */ borg_on_dnstairs = TRUE; borg_keypress('<'); return (TRUE); } } } /* Lunal Mode - Going down */ if (track_more_num && (safe_place || ag->feat == FEAT_MORE || ag->feat == FEAT_LESS || borg_skill[BI_CDEPTH] < 30)) { int y, x; if (track_more_num >= 2) borg_note("# Lunal Mode: I know of a down stair."); /* Check for an existing "down stairs" */ for (i = 0; i < track_more_num; i++) { x = track_more_x[i]; y = track_more_y[i]; /* How far is the nearest down stairs */ j = distance(c_y, c_x, y, x); /* skip the far ones */ if (b_j <= j && b_j != -1) continue; /* track it */ b_j =j; } /* if the downstair is close and path is safe, continue on */ if ((b_j < 8 && safe_place) || ag->feat == FEAT_MORE || borg_skill[BI_CDEPTH] < 30) { /* Note */ borg_note("# Lunal Mode. Power Diving. "); /* Continue leaving the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Flow to DownStair */ if (borg_flow_stair_more(GOAL_FLEE, TRUE, FALSE)) return (TRUE); /* if standing on a stair */ if (ag->feat == FEAT_MORE) { /* Take the DownStair */ borg_on_upstairs = TRUE; borg_keypress('>'); return (TRUE); } } } /* Lunal Mode - Going up */ if (track_less_num && borg_skill[BI_CDEPTH] != 1 && (safe_place || ag->feat == FEAT_MORE || ag->feat == FEAT_LESS)) { int y, x; borg_grid *ag = &borg_grids[c_y][c_x]; /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* skip the far ones */ if (b_j <= j && b_j != -1) continue; /* track it */ b_j =j; } /* if the upstair is close and safe path, continue */ if ((b_j < 8 && safe_place) || ag->feat == FEAT_LESS) { /* Note */ borg_note("# Lunal Mode. Power Climb. "); /* Set to help borg move better */ goal_less = TRUE; /* Continue leaving the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Flow to UpStair */ if (borg_flow_stair_less(GOAL_FLEE, FALSE)) { borg_note("# Looking for stairs. Lunal Mode."); /* Success */ return (TRUE); } if (ag->feat == FEAT_LESS) { /* Take the Up Stair */ borg_on_dnstairs = TRUE; borg_keypress('<'); return (TRUE); } } } /* Special case where the borg is off a stair and there * is a monster in LOS. He could freeze and unhook, or * move to the closest stair and risk the run. */ if (borg_skill[BI_CDEPTH] >= 2) { /* Continue fleeing to stair */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Note */ borg_note("# Lunal Mode. Any Stair. "); /* Try to find some stairs */ if (borg_flow_stair_both(GOAL_FLEE, TRUE)) return (TRUE); } /* Lunal Mode - Reached 99 */ if (borg_skill[BI_CDEPTH] == 99) { borg_note("# Lunal Mode ended at depth."); } /* Unable to do it */ if (borg_skill[BI_CDEPTH] > 1) { borg_note("# Lunal Mode ended incorrectly."); } /* return to normal borg_think_dungeon */ borg_note("Leaving Lunal Mode. (End of Lunal Mode)"); borg_lunal_mode = FALSE; goal_fleeing = goal_fleeing_lunal = FALSE; return (FALSE); } /* This is an exploitation function. The borg will stair scum * in the dungeon to get to a sweet spot to gather items. * * Dive if stairs are close and safe. * Retreat off level if monster has LOS to borg. * Fill Lantern * Eat food * Call light. might be dangerous because monster get a chance to hit us. */ bool borg_think_dungeon_munchkin(void) { bool safe_place = FALSE; int bb_j = MAX_RANGE; int j, b_j = -1; int i,ii, x, y; int closeness = 8; borg_grid *ag = &borg_grids[c_y][c_x]; byte feat = cave->feat[c_y][c_x]; enum borg_need need; /* examine equipment and swaps */ borg_notice(TRUE); /* Not if starving or in town */ if (borg_skill[BI_CDEPTH] == 0 || borg_skill[BI_ISWEAK]) { borg_note("# Leaving munchkin Mode. (Town or Weak)"); borg_munchkin_mode = FALSE; return (FALSE); } /* if borg is just starting on this level, he may not * know that a stair is under him. Cheat to see if one is * there */ if (feat == FEAT_MORE && ag->feat != FEAT_MORE) { /* Check for an existing "down stairs" */ for (i = 0; i < track_more_num; i++) { /* We already knew about that one */ if ((track_more_x[i] == c_x) && (track_more_y[i] == c_y)) break; } /* Track the newly discovered "down stairs" */ if ((i == track_more_num) && (i < track_more_size)) { track_more_x[i] = c_x; track_more_y[i] = c_y; track_more_num++; } /* tell the array */ ag->feat = FEAT_MORE; } if (feat == FEAT_LESS && ag->feat != FEAT_LESS) { /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { /* We already knew about this one */ if ((track_less_x[i] == c_x) && (track_less_y[i] == c_y)) continue; } /* Track the newly discovered "up stairs" */ if ((i == track_less_num) && (i < track_less_size)) { track_less_x[i] = c_x; track_less_y[i] = c_y; track_less_num++; } /* Tell the array */ ag->feat = FEAT_LESS; } /* Act normal on 1 unless stairs are seen*/ if (borg_skill[BI_CDEPTH] == 1 && track_more_num == 0) { borg_munchkin_mode = FALSE; return (FALSE); } /* If no down stair is known, act normal */ if (track_more_num ==0 && track_less_num == 0) { borg_note("# Leaving Munchkin Mode. (No Stairs seen)"); borg_munchkin_mode = FALSE; return (FALSE); } /** First deal with staying alive **/ /* Hack -- require light */ need = borg_maintain_light(); if (need == BORG_MET_NEED) return TRUE; else if (need == BORG_UNMET_NEED) borg_note("# Munchkin. (need fuel)"); /* No Light at all */ if (borg_skill[BI_CURLITE] == 0) { borg_note("# No Light at all."); } /* Define if safe_place is true or not */ safe_place = borg_check_rest(c_y, c_x); /* Can do a little attacking. */ if (borg_munchkin_mage()) return (TRUE); if (borg_munchkin_melee()) return (TRUE); /* Consume needed things */ if (safe_place && borg_use_things()) return (TRUE); /* Consume needed things */ if (borg_skill[BI_ISHUNGRY] && borg_use_things()) return (TRUE); /* Wear stuff and see if it's good */ if (safe_place && borg_wear_stuff()) return (TRUE); if (safe_place && borg_wear_quiver()) return (TRUE); if (safe_place && borg_remove_stuff()) return (TRUE); /* Crush junk if convienent */ if (safe_place && borg_crush_junk()) return (TRUE); /* Learn learn and test useful spells */ if (safe_place && borg_play_magic(TRUE)) return (TRUE); /** Track down some interesting gear **/ /* XXX Should we allow him great flexibility in retreiving loot? (not always safe?)*/ /* Continue flowing towards objects */ if (borg_flow_old(GOAL_TAKE)) return (TRUE); /* Borg may be off the stair and a monster showed up. */ /* Find a (viewable) object */ if (safe_place && borg_flow_take_lunal(TRUE, 5)) return (TRUE); /* Recover from any nasty condition */ if (safe_place && borg_recover()) return (TRUE); /*leave level right away. */ borg_note("# Fleeing level. Munchkin Mode"); goal_fleeing_munchkin = TRUE; goal_fleeing = TRUE; /* Increase the range of the borg a bit */ if (borg_skill[BI_CDEPTH] <= 10) closeness += (borg_skill[BI_CLEVEL] - 10) + (10 - borg_skill[BI_CDEPTH]); /* Full of Items - Going up */ if (track_less_num && (borg_items[INVEN_PACK-2].iqty) && (safe_place || ag->feat == FEAT_LESS || borg_skill[BI_CURLITE] == 0)) { int y, x; borg_grid *ag = &borg_grids[c_y][c_x]; /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* Is it reachable or behind a wall? */ if (!borg_projectable(y, x, c_y, c_x)) continue; /* skip the far ones */ if (b_j <= j && b_j != -1) continue; /* track it */ b_j =j; } /* if on depth 1, try to venture more to get back to town */ if (borg_skill[BI_CDEPTH] == 1) { if (track_less_num) { closeness = 20; } } /* if the upstair is close and safe path, continue */ if ((b_j < closeness && safe_place) || ag->feat == FEAT_LESS) { /* Note */ borg_note("# Munchkin Mode. Power Climb (needing to sell). "); /* Set to help borg move better */ goal_less = TRUE; /* Continue leaving the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Flow to UpStair */ if (borg_flow_stair_less(GOAL_FLEE, TRUE)) { borg_note("# Looking for stairs. Munchkin Mode (needing to sell)."); /* Success */ return (TRUE); } if (ag->feat == FEAT_LESS) { /* Take the Up Stair */ borg_on_dnstairs = TRUE; borg_keypress('<'); return (TRUE); } } } /* Too deep. trying to gradually move shallow. Going up */ if ((track_less_num && borg_skill[BI_CDEPTH] > borg_munchkin_depth) && (safe_place || ag->feat == FEAT_LESS)) { borg_grid *ag = &borg_grids[c_y][c_x]; /* Reset */ b_j = -1; /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* Is it reachable or behind a wall? */ if (!borg_projectable(y, x, c_y, c_x)) continue; /* skip the far ones */ if (b_j <= j && b_j != -1) continue; /* track it */ b_j =j; if (b_j < bb_j) bb_j = b_j; } /* if the upstair is close and safe path, continue */ if ((b_j < closeness && safe_place) || ag->feat == FEAT_LESS) { /* Note */ borg_note("# Munchkin Mode. Power Climb. "); /* Set to help borg move better */ goal_less = TRUE; /* Continue leaving the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Flow to UpStair */ if (borg_flow_stair_less(GOAL_FLEE, TRUE)) { borg_note("# Looking for stairs. Munchkin Mode."); /* Success */ return (TRUE); } if (ag->feat == FEAT_LESS) { /* Take the Up Stair */ borg_on_dnstairs = TRUE; borg_keypress('<'); return (TRUE); } } } /* Going down */ if ((track_more_num && borg_skill[BI_CDEPTH] < borg_munchkin_depth) && ( safe_place || ag->feat == FEAT_MORE)) { int y, x; /* Reset */ b_j = -1; if (track_more_num >= 1) borg_note("# Munchkin Mode: I know of a down stair."); /* Check for an existing "down stairs" */ for (i = 0; i < track_more_num; i++) { x = track_more_x[i]; y = track_more_y[i]; /* How far is the nearest down stairs */ j = distance(c_y, c_x, y, x); /* Is it reachable or behind a wall? */ if (!borg_projectable(y, x, c_y, c_x)) continue; /* skip the far ones */ if (b_j <= j && b_j != -1) continue; /* track it */ b_j =j; } /* if the downstair is close and path is safe, continue on */ if ((b_j < closeness && safe_place) || ag->feat == FEAT_MORE || borg_skill[BI_CDEPTH] == 1) { /* Note */ borg_note("# Munchkin Mode. Power Diving. "); /* Continue leaving the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Flow to DownStair */ if (borg_flow_stair_more(GOAL_FLEE, TRUE, FALSE)) return (TRUE); /* if standing on a stair */ if (ag->feat == FEAT_MORE) { /* Take the DownStair */ borg_on_upstairs = TRUE; borg_keypress('>'); return (TRUE); } } } /* Going up */ if ((track_less_num && borg_skill[BI_CDEPTH] != 1 && safe_place) || ag->feat == FEAT_LESS) { int y, x; borg_grid *ag = &borg_grids[c_y][c_x]; /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* Is it reachable or behind a wall? */ if (!borg_projectable(y, x, c_y, c_x)) continue; /* skip the far ones */ if (b_j <= j && b_j != -1) continue; /* track it */ b_j =j; } /* if the upstair is close and safe path, continue */ if ((b_j < closeness && safe_place) || ag->feat == FEAT_LESS) { /* Note */ borg_note("# Munchkin Mode. Power Climb. "); /* Set to help borg move better */ goal_less = TRUE; /* Continue leaving the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Flow to UpStair */ if (borg_flow_stair_less(GOAL_FLEE, TRUE)) { borg_note("# Looking for stairs. Munchkin Mode."); /* Success */ return (TRUE); } if (ag->feat == FEAT_LESS) { /* Take the Up Stair */ borg_on_dnstairs = TRUE; borg_keypress('<'); return (TRUE); } } } /* Special case where the borg is off a stair and there * is a monster in LOS. He could freeze and unhook, or * move to the closest stair and risk the run. */ if (borg_skill[BI_CDEPTH] >= 2 || !safe_place) { /* Continue fleeing to stair */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Note */ borg_note("# Munchkin Mode. Any Stair. "); /* Adjacent Monster. Either attack it, or try to outrun it */ for (i = 0; i < 8; i++) { y = c_y + ddy_ddd[i]; x = c_x + ddx_ddd[i]; /* Bounds check */ if (!cave_in_bounds(cave, y, x)) continue; /* Get the grid */ ag = &borg_grids[y][x]; /* Monster is adjacent to the borg */ if (ag->kill) { /* Check for an existing "up stairs" */ for (ii = 0; ii < track_less_num; ii++) { x = track_less_x[ii]; y = track_less_y[ii]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* Is it reachable or behind a wall? */ if (!borg_projectable(y, x, c_y, c_x)) continue; /* skip the far ones */ if (b_j <= j && b_j != -1) continue; /* track it */ b_j =j; } /* Check for an existing "down stairs" */ for (ii = 0; ii < track_more_num; ii++) { x = track_more_x[ii]; y = track_more_y[ii]; /* How far is the nearest down stairs */ j = distance(c_y, c_x, y, x); /* Is it reachable or behind a wall? */ if (!borg_projectable(y, x, c_y, c_x)) continue; /* skip the far ones */ if (b_j <= j && b_j != -1) continue; /* track it */ b_j =j; } /* Can the borg risk the run? */ if (b_j <= 3) { /* Try to find some stairs */ if (borg_flow_stair_both(GOAL_FLEE, FALSE)) return (TRUE); } else { /* Try to kill it */ if (borg_attack(FALSE)) return (TRUE); } } /* Adjacent to kill */ } /* Scanning neighboring grids */ /* Try to find some stairs */ if (borg_flow_stair_both(GOAL_FLEE, FALSE)) return (TRUE); if (ag->feat == FEAT_LESS) { /* Take the Up Stair */ borg_on_dnstairs = TRUE; borg_keypress('<'); return (TRUE); } if (ag->feat == FEAT_MORE) { /* Take the Stair */ borg_on_upstairs = TRUE; borg_keypress('<'); return (TRUE); } } /* return to normal borg_think_dungeon */ borg_note("Leaving Munchkin Mode. (End of Mode)"); borg_munchkin_mode = FALSE; goal_fleeing = goal_fleeing_munchkin = FALSE; return (FALSE); } /* * Hack -- perform an action in the dungeon under boosted bravery * * This function is a sub-set of the standard dungeon goals, and is * only executed when all of the standard dungeon goals fail, because * of excessive danger, or because the level is "bizarre". */ static bool borg_think_dungeon_brave(void) { /*** Local stuff ***/ int p1 = borg_danger(c_y, c_x, 1, TRUE, FALSE); /* Try a defence manuever on 100 */ if (borg_skill[BI_CDEPTH] == 100 && borg_defend(p1)) return TRUE; /* Attack monsters */ if (borg_attack(TRUE)) return (TRUE); /* Cast a light beam to remove fear of an area */ if (borg_LIGHT_beam(FALSE)) return (TRUE); /*** Flee (or leave) the level ***/ /* Take stairs down */ /* Usable stairs */ if (borg_grids[c_y][c_x].feat == FEAT_MORE) { /* Take the stairs */ borg_on_upstairs = TRUE; borg_note("# Fleeing via stairs."); borg_keypress('>'); /* Success */ return (TRUE); } /* Return to Stairs, but not use them */ if (goal_less) { /* Continue fleeing to stair */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Try to find some stairs */ if (scaryguy_on_level && !borg_skill[BI_CDEPTH] && borg_flow_stair_both(GOAL_FLEE, FALSE)) return (TRUE); /* Try to find some stairs up */ if (borg_flow_stair_less(GOAL_FLEE, FALSE)) { borg_note("# Looking for stairs. Goal_less, brave."); return (TRUE); } } /* Flee the level */ if (goal_fleeing || goal_leaving || scaryguy_on_level) { /* Hack -- Take the next stairs */ stair_less = goal_fleeing; if (borg_ready_morgoth == 0) stair_less = TRUE; if (stair_less == TRUE) { borg_note("# Fleeing and leaving the level. Brave Thinking."); } /* Go down if fleeing or prepared. */ stair_more = goal_fleeing; if ((char *)NULL == borg_prepared(borg_skill[BI_CDEPTH]+1)) stair_more = TRUE; /* Continue fleeing the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Try to find some stairs up */ if (stair_less) if (borg_flow_stair_less(GOAL_FLEE, FALSE)) { borg_note("# Looking for stairs. Flee, brave."); return (TRUE); } /* Try to find some stairs down */ if (stair_more) if (borg_flow_stair_more(GOAL_FLEE, FALSE, TRUE)) return (TRUE); } /* Do short looks on special levels */ if (vault_on_level) { /* Continue flowing towards monsters */ if (borg_flow_old(GOAL_KILL)) return (TRUE); /* Find a (viewable) monster */ if (borg_flow_kill(TRUE, 35)) return (TRUE); /* Continue flowing towards objects */ if (borg_flow_old(GOAL_TAKE)) return (TRUE); /* Find a (viewable) object */ if (borg_flow_take(TRUE, 35)) return (TRUE); if (borg_flow_vein(TRUE, 35)) return (TRUE); /* Continue to dig out a vault */ if (borg_flow_old(GOAL_VAULT)) return (TRUE); /* Find a vault to excavate */ if (borg_flow_vault(35)) return (TRUE); } /* Continue flowing towards monsters */ if (borg_flow_old(GOAL_KILL)) return (TRUE); /* Find a (viewable) monster */ if (borg_flow_kill(TRUE, 250)) return (TRUE); /* Continue flowing towards objects */ if (borg_flow_old(GOAL_TAKE)) return (TRUE); /* Find a (viewable) object */ if (borg_flow_take(TRUE, 250)) return (TRUE); if (borg_flow_vein(TRUE, 250)) return (TRUE); /*** Exploration ***/ /* Continue flowing (see below) */ if (borg_flow_old(GOAL_MISC)) return (TRUE); /* Continue flowing (see below) */ if (borg_flow_old(GOAL_DARK)) return (TRUE); /* Continue flowing (see below) */ if (borg_flow_old(GOAL_XTRA)) return (TRUE); /* Continue flowing (see below) */ if (borg_flow_old(GOAL_BORE)) return (TRUE); /*** Explore the dungeon ***/ /* Explore interesting grids */ if (borg_flow_dark(TRUE)) return (TRUE); /* Explore interesting grids */ if (borg_flow_dark(FALSE)) return (TRUE); /* Search for secret door via spell before spastic */ if (!when_detect_doors || (borg_t - when_detect_doors >= 500)) { if (borg_check_LIGHT()) return (TRUE); } /*** Track down old stuff ***/ /* Chase old objects */ if (borg_flow_take(FALSE,250)) return (TRUE); if (borg_flow_vein(FALSE,250)) return (TRUE); /* Chase old monsters */ if (borg_flow_kill(FALSE,250)) return (TRUE); /* Search for secret door via spell before spastic */ if (!when_detect_doors || (borg_t - when_detect_doors >= 500)) { if (borg_check_LIGHT()) return (TRUE); } /* Attempt to leave the level */ if (borg_leave_level(TRUE)) return (TRUE); /* Search for secret doors */ if (borg_flow_spastic(TRUE)) return (TRUE); /* Nothing */ return (FALSE); } /* * Perform an action in the dungeon * * Return TRUE if a "meaningful" action was performed * Otherwise, return FALSE so we will be called again * * Strategy: * Make sure we are happy with our "status" (see above) * Attack and kill visible monsters, if near enough * Open doors, disarm traps, tunnel through rubble * Pick up (or tunnel to) gold and useful objects * Explore "interesting" grids, to expand the map * Explore the dungeon and revisit old grids * * Fleeing: * Use word of recall when level is "scary" * Flee to stairs when there is a chance of death * Avoid "stair bouncing" if at all possible * * Note that the various "flow" actions allow the Borg to flow * "through" closed doors, which will be opened when he attempts * to pass through them, so we do not have to pursue terrain until * all monsters and objects have been dealt with. * * XXX XXX XXX The poor Borg often kills a nasty monster, and * then takes a nap to recover from damage, but gets yanked * back to town before he can collect his reward. */ bool borg_think_dungeon(void) { int i, j; int b_j = -1; /* Delay Factor */ int msec = ((op_ptr->delay_factor * op_ptr->delay_factor) + (borg_delay_factor * borg_delay_factor)); /* HACK allows user to stop the borg on certain levels */ if (borg_skill[BI_CDEPTH] == borg_stop_dlevel) borg_oops("Auto-stop for user DLevel."); if (borg_skill[BI_CLEVEL] == borg_stop_clevel) borg_oops("Auto-stop for user CLevel."); /* HACK to end all hacks,,, allow the borg to stop if money scumming */ if (borg_gold > borg_money_scum_amount && borg_money_scum_amount != 0 && !borg_skill[BI_CDEPTH] && !borg_self_scum) { borg_oops("Money Scum complete."); } /* Hack -- Stop the borg if money scumming and the shops are out of food. */ if (!borg_skill[BI_CDEPTH] && borg_money_scum_amount != 0 && (borg_food_onsale == 0 && borg_skill[BI_FOOD] < 5)) { /* Town out of food. If player initiated borg, stop here */ if (borg_self_scum == FALSE) { borg_oops("Money Scum stopped. No more food in shop."); return (TRUE); } else /* Borg doing it himself */ { /* move money goal to 0 and leave the level */ borg_money_scum_amount = 0; } } /* Hack -- prevent clock wrapping Step 1*/ if ((borg_t >= 12000 && borg_t <=12025) || (borg_t >= 25000 && borg_t <=25025)) { /* Clear Possible errors */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress(ESCAPE); /* Re-examine inven and equip */ borg_do_inven = TRUE; borg_do_equip = TRUE; /* enter a special routine to handle this behavior. Messing with * the old_level forces him to re-explore this level, and reshop, * if in town. */ old_depth = 126; /* Continue on */ return (TRUE); } /* Hack -- prevent clock wrapping Step 2*/ if (borg_t >= 30000) { /* Panic */ borg_oops("clock overflow"); #ifdef BABLOS /* Clock overflow escape code */ printf("Clock overflow code!\n"); p_ptr->playing = FALSE; p_ptr->leaving = TRUE; borg_clock_over = TRUE; #endif /* BABLOS */ /* Oops */ return (TRUE); } /* Allow respawning borgs to update their variables */ if (borg_respawning > 1) { borg_note(format("# Pressing 'escape' to catch up and get in sync (%d).", borg_respawning)); borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_respawning --; return (TRUE); } /* add a short pause to slow the borg down for viewing */ Term_xtra(TERM_XTRA_DELAY, msec); /* redraw the screen if we need to */ if (my_need_redraw) { borg_note(format("# Redrawing screen.")); do_cmd_redraw(); my_need_redraw = FALSE; } /* Prevent clock overflow */ if (borg_t - borg_began >= 10000) { /* Start leaving */ if (!goal_leaving) { /* Note */ borg_note("# Leaving (boredom)"); /* Start leaving */ goal_leaving = TRUE; } /* Start fleeing */ if (!goal_fleeing) { /* Note */ borg_note("# Fleeing (boredom)"); /* Start fleeing */ goal_fleeing = TRUE; } } /* am I fighting a unique or a summoner, or scaryguy? */ borg_near_monster_type(borg_skill[BI_MAXCLEVEL] < 15 ? MAX_SIGHT : 12); /* Allow borg to jump back up to town if needed. He probably fled town because * he saw a scaryguy (BSV, SER, Maggot). Since he is here on depth 1, do a quick * check for items near the stairs that I can pick up before I return to town. */ if (borg_skill[BI_CDEPTH] == 1 && borg_fleeing_town) { /* Try to grab a close item while I'm down here */ if (borg_think_stair_scum(TRUE)) return (TRUE); /* Start leaving */ if (!goal_leaving) { /* Note */ borg_note("# Leaving (finish shopping)"); /* Start leaving */ goal_leaving = TRUE; } /* Start fleeing */ if (!goal_fleeing) { /* Note */ borg_note("# Fleeing (finish shopping)"); /* Start fleeing */ goal_fleeing = TRUE; } } /* Prevent a "bouncing Borg" bug. Where borg with telepathy * will sit in a narrow area bouncing between 2 or 3 places * tracking and flowing to a bouncing monster behind a wall. * First, reset goals. * Second, clear all known monsters/takes * Third, Flee the level */ if (borg_skill[BI_CDEPTH] && (time_this_panel >= 300 && time_this_panel <= 303)) { /* Clear Goals */ goal = 0; } if (borg_skill[BI_CDEPTH] && (time_this_panel >= 500 && time_this_panel <= 503)) { /* No objects here */ borg_takes_cnt = 0; borg_takes_nxt = 1; /* Forget old objects */ C_WIPE(borg_takes, 256, borg_take); /* No monsters here */ borg_kills_cnt = 0; borg_kills_nxt = 1; /* Forget old monsters */ C_WIPE(borg_kills, 256, borg_kill); } if (borg_skill[BI_CDEPTH] && (time_this_panel >= 700)) { /* Start leaving */ if (!goal_leaving) { /* Note */ borg_note("# Leaving (bouncing-borg)"); /* Start leaving */ goal_leaving = TRUE; } /* Start fleeing */ if (!goal_fleeing) { /* Note */ borg_note("# Fleeing (bouncing-borg)"); /* Start fleeing */ goal_fleeing = TRUE; } } /* Count the awake breeders */ for (j = 0, i = 1; i < borg_kills_nxt; i++) { borg_kill *kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Skip sleeping monsters */ if (!kill->awake) continue; /* Count the monsters which are "breeders" */ if (rf_has(r_info[kill->r_idx].flags, RF_MULTIPLY)) j++; } /* hack -- close doors on breeder levels */ if (j >= 3) { /* set the flag to close doors */ breeder_level = TRUE; } /* Hack -- caution from breeders*/ if ((j >= MIN(borg_skill[BI_CLEVEL] + 2, 5)) && (borg_skill[BI_RECALL] <= 0 || borg_skill[BI_CLEVEL] < 35)) { /* Ignore monsters from caution */ if (!goal_ignoring && borg_t >= 2500) { /* Flee */ borg_note("# Ignoring breeders (no recall)"); /* Ignore multipliers */ goal_ignoring = TRUE; } /* Start leaving */ if (!goal_leaving) { /* Note */ borg_note("# Leaving (no recall)"); /* Start leaving */ goal_leaving = TRUE; } /* Start fleeing */ if (!goal_fleeing) { /* Note */ borg_note("# Fleeing (no recall)"); /* Start fleeing */ goal_fleeing = TRUE; } } /* Reset avoidance */ if (avoidance != borg_skill[BI_CURHP]) { /* Reset "avoidance" */ avoidance = borg_skill[BI_CURHP]; /* Re-calculate danger */ borg_danger_wipe = TRUE; /* Forget goals */ } /* Keep borg on a short leash */ if (track_less_num && (borg_skill[BI_MAXHP] < 30 || borg_skill[BI_CLEVEL] < 15) && borg_skill[BI_CDEPTH] >= borg_skill[BI_CLEVEL] - 5) { int y, x; /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* skip the far ones */ if (b_j <= j && b_j != -1) continue; /* track it */ b_j = j; } /* Return to the upstair-- too far away? */ if ((!goal_less) && b_j > borg_skill[BI_CLEVEL] * 3 + 14) { /* Return to Stairs */ if (!goal_less) { /* Note */ borg_note(format("# Return to Stair (wandered too far. Leash: %d)",borg_skill[BI_CLEVEL] * 3 + 14)); /* Start returning */ goal_less = TRUE; } } /* Clear the flag to Return to the upstair-- we are close enough now */ else if (goal_less && b_j < 3) { /* Note */ borg_note("# Close enough to Stair."); /* Clear the flag */ goal_less = FALSE; goal = 0; } } /* Quick check to see if borg needs to engage his lunal mode */ if (borg_self_lunal && !borg_plays_risky) /* Risky borg in a hurry */ { if ((char *)NULL == borg_prepared(borg_skill[BI_CDEPTH] + 15) && /* Prepared */ borg_skill[BI_MAXDEPTH] >= borg_skill[BI_CDEPTH] + 15 && /* Right zone */ borg_skill[BI_CDEPTH] >=1 && /* In dungeon fully */ borg_skill[BI_CDEPTH] > borg_skill[BI_CLEVEL] / 3) /* Not shallow */ { borg_lunal_mode = TRUE; /* Enter the Lunal scumming mode */ if (borg_lunal_mode && borg_think_dungeon_lunal()) return (TRUE); } } /* Quick check to see if borg needs to engage his lunal mode for munchkin_start */ if (borg_munchkin_start && borg_skill[BI_MAXCLEVEL] < 12) { if (borg_skill[BI_CDEPTH] >=1) { borg_munchkin_mode = TRUE; /* Enter the Lunal scumming mode */ if (borg_think_dungeon_munchkin()) return (TRUE); } /* Must not be in munchkin mode then */ borg_munchkin_mode = FALSE; } /* Keep borg on a suitable level */ if (track_less_num && borg_skill[BI_CLEVEL] < 10 && !goal_less && (char *)NULL != borg_prepared(borg_skill[BI_CDEPTH])) { /* Note */ borg_note("# Needing to get back on correct depth"); /* Start returning */ goal_less = TRUE; /* Take stairs */ if (borg_grids[c_y][c_x].feat == FEAT_LESS) { borg_keypress('<'); return (TRUE); } } /*** crucial goals ***/ /* examine equipment and swaps */ borg_notice(TRUE); /* require light-- Special handle for being out of a light source.*/ if (borg_think_dungeon_light()) return (TRUE); /* Decrease the amount of time not allowed to retreat */ if (borg_no_retreat > 0) borg_no_retreat--; /*** Important goals ***/ /* Continue flowing towards good anti-summon grid */ if (borg_flow_old(GOAL_DIGGING)) return (TRUE); /* Try not to die */ if (borg_caution()) return (TRUE); /*** if returning from dungeon in bad shape...***/ if (borg_skill[BI_CURLITE] == 0 || borg_skill[BI_ISCUT] || borg_skill[BI_ISPOISONED] || borg_skill[BI_FOOD] == 0) { /* First try to wear something */ if (borg_skill[BI_CURLITE] == 0) { /* attempt to refuel/swap */ if (borg_maintain_light() == BORG_MET_NEED) return (TRUE); /* wear stuff and see if it glows */ if (borg_wear_stuff()) return (TRUE); if (borg_wear_quiver()) return (TRUE); } /* Recover from damage */ if (borg_recover()) return (TRUE); /* If full of items, we wont be able to buy stuff, crush stuff */ if (borg_items[INVEN_MAX_PACK-1].iqty && borg_crush_hole()) return (TRUE); /* shop for something that will help us */ if (borg_flow_shop_visit()) return (TRUE); if (borg_choose_shop()) { /* Try and visit a shop, if so desired */ if (borg_flow_shop_entry(goal_shop)) return (TRUE); } } /* if I must go to town without delay */ if ((char *)NULL != borg_restock(borg_skill[BI_CDEPTH])) { if (borg_leave_level(FALSE)) return (TRUE); } /* Learn useful spells immediately */ if (borg_play_magic(FALSE)) return (TRUE); /* If using a digger, Wear "useful" equipment before fighting monsters */ if (borg_items[INVEN_WIELD].tval == TV_DIGGING && borg_wear_stuff()) return (TRUE); /* If not using anything, Wear "useful" equipment before fighting monsters */ if (!borg_items[INVEN_WIELD].tval && borg_wear_stuff()) return (TRUE); /* If not wielding any missiles, load up the quiver */ if (borg_items[INVEN_BOW].iqty && !borg_items[QUIVER_START].tval && borg_wear_quiver()) return (TRUE); /* Dig an anti-summon corridor */ if (borg_flow_kill_corridor_1(TRUE)) return (TRUE); /* Attack monsters */ if (borg_attack(FALSE)) return (TRUE); /* Wear things that need to be worn, but try to avoid swap loops */ /* if (borg_best_stuff()) return (TRUE); */ if (borg_wear_stuff()) return (TRUE); if (borg_wear_quiver()) return (TRUE); if (borg_swap_rings()) return (TRUE); if (borg_wear_rings()) return (TRUE); /* Continue flowing towards objects */ if (borg_flow_old(GOAL_TAKE)) return (TRUE); /* Find a really close object */ if (borg_flow_take(TRUE, 5)) return (TRUE); /* Remove "backwards" rings */ /* Only do this in Stores to avoid loops if (borg_swap_rings()) return (TRUE); */ /* Repair "backwards" rings */ if (borg_wear_rings()) return (TRUE); /* Remove stuff that is useless or detrimental */ if (borg_remove_stuff()) return (TRUE); if (borg_dump_quiver()) return (TRUE); if (borg_stack_quiver()) return (TRUE); /* Check the light */ if (borg_check_LIGHT()) return (TRUE); /* Continue flowing to a safe grid on which I may recover */ if (borg_flow_old(GOAL_RECOVER)) return (TRUE); /* Recover from damage */ if (borg_recover()) return (TRUE); /* Attempt to find a grid which is safe and I can recover on it. This should work closely with borg_recover. */ if (borg_flow_recover(FALSE, 50)) return (TRUE); /* Perform "cool" perma spells */ if (borg_perma_spell()) return (TRUE); /* Try to stick close to stairs if weak */ if (borg_skill[BI_CLEVEL] < 10 && borg_skill[BI_MAXSP] && borg_skill[BI_CURSP] == 0 && borg_no_rest_prep <= 1 && !borg_bless && !borg_hero && !borg_berserk) { if (borg_skill[BI_CDEPTH]) { int i, y, x; /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* Not on a stair */ if (c_y != y || c_x != x) continue; /* I am standing on a stair */ /* reset the goal_less flag */ goal_less = FALSE; /* if not dangerous, wait here */ if (borg_danger(c_y,c_x,1, TRUE, FALSE) == 0) { /* rest here a moment */ borg_note("# Resting on stair to gain Mana."); borg_keypress(','); return (TRUE); } } } else /* in town */ { int i, y, x; /* Check for an existing "dn stairs" */ for (i = 0; i < track_more_num; i++) { x = track_more_x[i]; y = track_more_y[i]; /* Not on a stair */ if (c_y != y || c_x != x) continue; /* I am standing on a stair */ /* if not dangerous, wait here */ if (borg_danger(c_y,c_x,1, TRUE, FALSE) == 0) { /* rest here a moment */ borg_note("# Resting on town stair to gain Mana."); borg_keypress(','); return (TRUE); } } } /* In town, standing on stairs, sit tight */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Try to find some stairs up */ if (borg_flow_stair_less(GOAL_FLEE, TRUE)) { borg_note("# Looking for stairs. Stair hugging."); return (TRUE); } } /* If in town and have no money, and nothing to sell, * then do not stay in town, its too dangerous. */ if (borg_skill[BI_CDEPTH] == 0 && borg_skill[BI_CLEVEL] < 6 && borg_gold < 10 && borg_count_sell() < 5) { borg_note("# Nothing to sell in town (leaving)."); goal_leaving = TRUE; /* Continue fleeing the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Try to find some stairs down */ if (borg_flow_stair_more(GOAL_FLEE, FALSE, FALSE)) return (TRUE); } /*** Flee the level XXX XXX XXX ***/ /* Return to Stairs, but not use them */ if (goal_less) { /* Continue fleeing to stair */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Try to find some stairs */ if (scaryguy_on_level && borg_flow_stair_both(GOAL_FLEE, FALSE)) return (TRUE); /* Try to find some stairs up */ if (borg_flow_stair_less(GOAL_FLEE, FALSE)) { borg_note("# Looking for stairs. Goal_less, Fleeing."); return (TRUE); } } /* Flee the level */ if (goal_fleeing && !goal_recalling) { /* Hack -- Take the next stairs */ stair_less = stair_more = TRUE; borg_note("# Fleeing and leaving the level. (Looking for any stair)"); /* Continue fleeing the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Try to find some stairs */ if (scaryguy_on_level && borg_flow_stair_both(GOAL_FLEE, FALSE)) return (TRUE); /* Try to find some stairs up */ if (borg_flow_stair_less(GOAL_FLEE, FALSE)) { borg_note("# Looking for stairs. Fleeing."); return (TRUE); } /* Try to find some stairs down */ if (borg_flow_stair_more(GOAL_FLEE, FALSE, FALSE)) return (TRUE); } /* Flee to a safe Morgoth grid if appropriate */ if (!borg_skill[BI_KING] && morgoth_on_level && !borg_morgoth_position && (borg_skill[BI_AGLYPH] >= 10 && (!borg_skill[BI_ISBLIND] && !borg_skill[BI_ISCONFUSED]))) { /* Continue flowing towards good morgoth grid */ if (borg_flow_old(GOAL_MISC)) return (TRUE); /* Attempt to locate a good Glyphed grid */ if (borg_flow_glyph(GOAL_MISC)) return (TRUE); /* Have the borg excavate the dungeon with Stone to Mud */ } /* Continue flowing towards objects */ if (borg_flow_old(GOAL_TAKE)) return (TRUE); /* Find a really close object */ if (borg_flow_take(TRUE, 5)) return (TRUE); if (borg_flow_vein(TRUE, 5)) return (TRUE); /* Continue flowing towards (the hopefully close) monsters */ if (borg_flow_old(GOAL_KILL)) return (TRUE); /* Find a really close monster */ if (borg_flow_kill(TRUE, 20)) return (TRUE); /* Continue flowing towards objects */ if (borg_flow_old(GOAL_TAKE)) return (TRUE); /* Find a really close object */ if (borg_flow_take(FALSE, 10)) return (TRUE); if (borg_flow_vein(FALSE, 10)) return (TRUE); /* Continue flowing towards monsters */ if (borg_flow_old(GOAL_KILL)) return (TRUE); /* Continue towards a vault */ if (borg_flow_old(GOAL_VAULT)) return (TRUE); /* Find a viewable monster and line up a shot on him */ if (borg_flow_kill_aim(TRUE)) return (TRUE); /*** Deal with inventory objects ***/ /* check for anything that should be inscribed */ /* if (borg_inscribe_food()) return (TRUE); */ /* Use things */ if (borg_use_things()) return (TRUE); /* Identify unknown things */ if (borg_test_stuff()) return (TRUE); /* Enchant things */ if (borg_enchanting()) return (TRUE); /* Recharge things */ if (borg_recharging()) return (TRUE); /* Destroy junk */ if (borg_crush_junk()) return (TRUE); /* Destroy items to make space */ if (borg_crush_hole()) return (TRUE); /* Destroy items if we are slow */ if (borg_crush_slow()) return (TRUE); /*** Flow towards objects ***/ /* Continue flowing towards objects */ if (borg_flow_old(GOAL_TAKE)) return (TRUE); /* Find a (viewable) object */ if (borg_flow_take(TRUE, 250)) return (TRUE); if (borg_flow_vein(TRUE, 250)) return (TRUE); /*** Leave the level XXX XXX XXX ***/ /* Leave the level */ if ((goal_leaving && !goal_recalling && !unique_on_level) || (borg_skill[BI_CDEPTH] && borg_skill[BI_CLEVEL] < 25 && borg_gold < 25000 && borg_count_sell() >= 13)) { /* Hack -- Take the next stairs */ if (borg_ready_morgoth == 0) { borg_note("# Fleeing and leaving the level (Looking for Up Stair)."); stair_less = TRUE; } /* Only go down if fleeing or prepared. */ if ((char *)NULL == borg_prepared(borg_skill[BI_CDEPTH]+1)) stair_more = TRUE; /* Continue leaving the level */ if (borg_flow_old(GOAL_FLEE)) return (TRUE); /* Try to find some stairs up */ if (stair_less) { if (borg_flow_stair_less(GOAL_FLEE, FALSE)) { borg_note("# Looking for stairs. Goal_Leaving."); return (TRUE); } } /* Only go up if needing to sell */ if (borg_skill[BI_CDEPTH] && borg_skill[BI_CLEVEL] < 25 && borg_gold < 25000 && borg_count_sell() >= 13) stair_more = FALSE; /* Try to find some stairs down */ if (stair_more) if (borg_flow_stair_more(GOAL_FLEE, FALSE, FALSE)) return (TRUE); } /* Power dive if I am playing too shallow * This is also seen in leave_level(). If * this formula is modified here, change it * in leave_level too. */ if (borg_skill[BI_CDEPTH] != 0 && (char *)NULL == borg_prepared(borg_skill[BI_CDEPTH] + 5) && !stair_less) { /* Take next stairs */ stair_more = TRUE; /* Continue leaving the level */ if (borg_flow_old(GOAL_BORE)) return (TRUE); /* No down if needing to sell */ if (borg_skill[BI_CDEPTH] && borg_skill[BI_CLEVEL] < 25 && borg_gold < 25000 && borg_count_sell() >= 13) { stair_more = FALSE; } /* Attempt to use those stairs */ if (stair_more && borg_flow_stair_more(GOAL_BORE, TRUE, FALSE)) { /* Leave a note */ borg_note("# Powerdiving."); return (TRUE); } } /*** Exploration ***/ /* Continue flowing (see below) */ if (borg_flow_old(GOAL_MISC)) return (TRUE); /* Continue flowing (see below) */ if (borg_flow_old(GOAL_DARK)) return (TRUE); /* Continue flowing (see below) */ if (borg_flow_old(GOAL_XTRA)) return (TRUE); /* Continue flowing (see below) */ if (borg_flow_old(GOAL_BORE)) return (TRUE); if (borg_flow_old(GOAL_VAULT)) return (TRUE); /*** Explore the dungeon ***/ if (vault_on_level) { /* Chase close monsters */ if (borg_flow_kill(FALSE, MAX_RANGE + 1)) return (TRUE); /* Chase close objects */ if (borg_flow_take(FALSE, 35)) return (TRUE); if (borg_flow_vein(FALSE, 35)) return (TRUE); /* Excavate a vault safely */ if (borg_excavate_vault(MAX_RANGE-2)) return (TRUE); /* Find a vault to excavate */ if (borg_flow_vault(35)) return (TRUE); /* Explore close interesting grids */ if (borg_flow_dark(TRUE)) return (TRUE); } /* Chase old monsters */ if (borg_flow_kill(FALSE, 250)) return (TRUE); /* Chase old objects */ if (borg_flow_take(FALSE, 250)) return (TRUE); if (borg_flow_vein(FALSE, 250)) return (TRUE); /* Explore interesting grids */ if (borg_flow_dark(TRUE)) return (TRUE); /* Leave the level (if needed) */ if (borg_gold < borg_money_scum_amount && borg_money_scum_amount != 0 && !borg_skill[BI_CDEPTH] && borg_skill[BI_LIGHT]) { /* Stay in town and scum for money after shopping */ } else { if (borg_leave_level(FALSE)) return (TRUE); } /* Explore interesting grids */ if (borg_flow_dark(FALSE)) return (TRUE); /*** Deal with shops ***/ /* Hack -- visit all the shops */ if (borg_flow_shop_visit()) return (TRUE); /* Hack -- Visit the shops */ if (borg_choose_shop()) { /* Try and visit a shop, if so desired */ if (borg_flow_shop_entry(goal_shop)) return (TRUE); } /*** Leave the Level ***/ /* Study/Test boring spells/prayers */ if (!goal_fleeing && borg_play_magic(TRUE)) return (TRUE); /* Search for secret door via spell before spastic */ if (!when_detect_doors || (borg_t - when_detect_doors >= 500)) { if (borg_check_LIGHT()) return (TRUE); } /* Search for secret doors */ if (borg_flow_spastic(FALSE)) return (TRUE); /* Flow directly to a monster if not able to be spastic */ if (borg_flow_kill_direct(FALSE, FALSE)) return (TRUE); /* Recharge items before leaving the level */ if (borg_wear_recharge()) return (TRUE); /* Leave the level (if possible) */ if (borg_gold < borg_money_scum_amount && borg_money_scum_amount != 0 && !borg_skill[BI_CDEPTH] && borg_skill[BI_LIGHT] && !borg_plays_risky) /* risky borgs are in a hurry */ { /* Stay in town, scum for money now that shopping is done. */ if (borg_money_scum()) return (TRUE); } else { if (borg_leave_level(TRUE)) return (TRUE); } /* Search for secret door via spell before spastic */ if (!when_detect_doors || (borg_t - when_detect_doors >= 500)) { if (borg_check_LIGHT()) return (TRUE); } /* Search for secret doors */ if (borg_flow_spastic(TRUE)) return (TRUE); /* Flow directly to a monster if not able to be spastic */ if (borg_flow_kill_direct(TRUE, FALSE)) return (TRUE); /*** Wait for recall ***/ /* Wait for recall, unless in danger */ if (goal_recalling && (borg_danger(c_y, c_x, 1, TRUE, FALSE) <= 0)) { /* Take note */ borg_note("# Waiting for Recall..."); /* Rest until done */ borg_keypress('R'); borg_keypress('9'); borg_keypress(KC_ENTER); /* Done */ return (TRUE); } /*** Nothing to do ***/ /* Twitching in town can be fatal. Really he should not become twitchy * but sometimes he cant recall to the dungeon and that may induce the * twitchy behavior. So we reset the level if this happens. That will * force him to go shopping all over again. */ if ((borg_skill[BI_CDEPTH] == 0 && borg_t - borg_began > 800) || borg_t > 28000) old_depth = 126; /* Set a flag that the borg is not allowed to retreat for 5 rounds */ borg_no_retreat = 5; /* Boost slightly */ if (avoidance < borg_skill[BI_CURHP] * 2) { bool done = FALSE; /* Note */ borg_note(format("# Boosting bravery (1) from %d to %d!", avoidance, borg_skill[BI_CURHP] * 2)); /* Hack -- ignore some danger */ avoidance = (borg_skill[BI_CURHP] * 2); /* Forget the danger fields */ borg_danger_wipe = TRUE; /* Try anything */ if (borg_think_dungeon_brave()) done = TRUE; /* Reset "avoidance" */ avoidance = borg_skill[BI_CURHP]; /* Re-calculate danger */ borg_danger_wipe = TRUE; /* Forget goals */ /* goal = 0;*/ /* Done */ if (done) return (TRUE); } /* try phase before boosting bravery further and acting goofy */ borg_times_twitch++; /* Phase to get out of being twitchy up to 3 times per level. */ if (borg_times_twitch < 3) { borg_note("# Considering Phase (twitchy)"); /* Phase */ if (borg_spell(0, 2) || borg_prayer(4, 0) || borg_activate_artifact(EF_TELE_PHASE)|| borg_read_scroll(SV_SCROLL_PHASE_DOOR) || borg_spell(1, 5) || borg_prayer(1, 1) || borg_prayer(4, 1)) { /* Success */ return (TRUE); } } /* Set a flag that the borg is not allowed */ /* to retreat for 10 rounds */ borg_no_retreat = 10; /* Boost some more */ if (avoidance < borg_skill[BI_MAXHP] * 4) { bool done = FALSE; /* Note */ borg_note(format("# Boosting bravery (2) from %d to %d!", avoidance, borg_skill[BI_MAXHP] * 4)); /* Hack -- ignore some danger */ avoidance = (borg_skill[BI_MAXHP] * 4); /* Forget the danger fields */ borg_danger_wipe = TRUE; /* Try anything */ if (borg_think_dungeon_brave()) done = TRUE; /* Reset "avoidance" */ avoidance = borg_skill[BI_CURHP]; /* Re-calculate danger */ borg_danger_wipe = TRUE; /* Forget goals */ /* goal = 0;*/ /* Done */ if (done) return (TRUE); } /* Boost a lot */ if (avoidance < 30000) { bool done = FALSE; /* Note */ borg_note(format("# Boosting bravery (3) from %d to %d!", avoidance, 30000)); /* Hack -- ignore some danger */ avoidance = 30000; /* Forget the danger fields */ borg_danger_wipe = TRUE; /* Reset multiple factors to jumpstart the borg */ unique_on_level = 0; scaryguy_on_level = FALSE; /* reset our breeder flag */ breeder_level = FALSE; /* Forget goals */ goal = 0; /* Hack -- cannot rise past town */ if (!borg_skill[BI_CDEPTH]) goal_rising = FALSE; /* Assume not ignoring monsters */ goal_ignoring = FALSE; /* No known stairs */ track_less_num = 0; track_more_num = 0; /* No known glyph */ track_glyph_num = 0; /* No known steps */ track_step_num = 0; /* No known doors */ track_door_num = 0; /* No known doors */ track_closed_num = 0; /* No mineral veins */ track_vein_num = 0; /* No objects here */ borg_takes_cnt = 0; borg_takes_nxt = 1; /* Try anything */ if (borg_think_dungeon_brave()) done = TRUE; /* Reset "avoidance" */ avoidance = borg_skill[BI_CURHP]; /* Re-calculate danger */ borg_danger_wipe = TRUE; /* Done */ if (done) return (TRUE); } /* try teleporting before acting goofy */ borg_times_twitch++; /* Teleport to get out of being twitchy up to 5 times per level. */ if (borg_times_twitch < 5) { /* Teleport */ if ( borg_spell(1, 5) || borg_prayer(4, 1) || borg_prayer(1, 1) || borg_use_staff(SV_STAFF_TELEPORTATION) || borg_read_scroll(SV_SCROLL_TELEPORT) || borg_read_scroll(SV_SCROLL_TELEPORT_LEVEL) ) { /* Success */ borg_note("# Teleport (twitchy)"); return (TRUE); } } /* Recall to town */ if (borg_skill[BI_CDEPTH] && (borg_recall())) { /* Note */ borg_note("# Recalling (twitchy)"); /* Success */ return (TRUE); } /* Reset multiple factors to jumpstart the borg */ unique_on_level = 0; scaryguy_on_level = FALSE; /* reset our breeder flag */ breeder_level = FALSE; /* No objects here */ borg_takes_cnt = 0; borg_takes_nxt = 1; /* No monsters here */ borg_kills_cnt = 0; borg_kills_nxt = 1; /* Attempt to dig to the center of the dungeon */ if (borg_flow_kill_direct(TRUE, TRUE)) return (TRUE); /* Twitch around */ if (borg_twitchy()) return (TRUE); /* Oops */ return (FALSE); } /* * Initialize this file */ void borg_init_8(void) { /* Nothing */ } #ifdef MACINTOSH static int HACK = 0; #endif angband-3.5.1/src/borg/borg3.h0000644000175000017500000001762612456456606015361 0ustar chriscchrisc/* File: borg3.h */ /* Purpose: Header file for "borg3.c" -BEN- */ #ifndef INCLUDED_BORG3_H #define INCLUDED_BORG3_H #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #ifdef ALLOW_BORG /* * This file provides support for "borg3.c". */ #include "borg1.h" extern void apw(void); /* special function used in testing */ /* * Hack -- location of the "Lv Mana Fail" prompt */ #define ROW_SPELL 1 #define COL_SPELL 20+35 /* * Forward declare */ typedef struct borg_item borg_item; typedef struct borg_shop borg_shop; extern bool (*borg_sort_comp)(void* u, void* v, int a, int b); extern void (*borg_sort_swap)(void* u, void* v, int a, int b); extern bool borg_sort_comp_hook(void* u, void* v, int a, int b); extern void borg_sort_swap_hook(void* u, void* v, int a, int b); extern void borg_sort_aux(void* u, void* v, int p, int q); extern void borg_sort(void* u, void* v, int n); /* * A structure holding information about an object. 120 bytes. * * The "iqty" is zero if the object is "missing" * The "kind" is zero if the object is "unaware" (or missing) * The "able" is zero if the object is "unknown" (or unaware or missing) * * Note that unaware items will have a "tval" but an invalid "sval". */ struct borg_item { char desc[80]; /* Actual Description */ char *note; /* Pointer to tail of 'desc' */ u32b kind; /* Kind index */ bool ident; /* True if item is identified */ bool aware; /* Player is aware of the effects */ bool fully_identified; /* True if item is fully identified (AJG) */ bool needs_I; /* True if item needs to be 'I'd (AJG) */ bool xxxx; /* Unused */ byte tval; /* Item type */ byte sval; /* Item sub-type */ s16b pval; /* Item extra-info */ byte discount; /* Discount */ byte iqty; /* Number of items */ s16b weight; /* Probable weight */ byte name1; /* Artifact index (if any) */ byte name2; /* Ego-item index (if any) */ u16b activation; /* Artifact activation and effects*/ s16b timeout; /* Timeout counter */ s16b to_h; /* Bonus to hit */ s16b to_d; /* Bonus to dam */ s16b to_a; /* Bonus to ac */ s16b ac; /* Armor class */ byte dd; /* Damage dice */ byte ds; /* Damage sides */ byte level; /* Level */ s32b cost; /* Cost (in stores) */ s32b value; /* Value (estimated) */ bool cursed; /* Item is cursed */ bitflag flags[OF_SIZE]; /**< Flags */ }; /* * A store */ struct borg_shop { /* s16b when; */ /* Time stamp */ s16b xtra; /* Something unused */ s16b page; /* Current page */ s16b more; /* Number of pages */ borg_item ware[24]; /* Store contents */ }; /* * Spell method values */ #define BORG_MAGIC_ICK 0 /* Spell is illegible */ #define BORG_MAGIC_NOP 1 /* Spell takes no arguments */ #define BORG_MAGIC_EXT 2 /* Spell has "detection" effects */ #define BORG_MAGIC_AIM 3 /* Spell requires a direction */ #define BORG_MAGIC_OBJ 4 /* Spell requires a pack object */ #define BORG_MAGIC_WHO 5 /* Spell requires a monster symbol */ /* * Spell status values */ #define BORG_MAGIC_ICKY 0 /* Spell is illegible */ #define BORG_MAGIC_LOST 1 /* Spell is forgotten */ #define BORG_MAGIC_HIGH 2 /* Spell is high level */ #define BORG_MAGIC_OKAY 3 /* Spell is learnable */ #define BORG_MAGIC_TEST 4 /* Spell is untried */ #define BORG_MAGIC_KNOW 5 /* Spell is known */ /* * Forward declare */ typedef struct borg_magic borg_magic; /* * A spell/prayer in a book */ struct borg_magic { const char *name; /* Textual name */ byte status; /* Status (see above) */ byte method; /* Method (see above) */ byte rating; /* Usefulness */ byte level; /* Required level */ byte power; /* Required power */ byte sfail; /* Minimum chance of failure */ byte cheat; /* Actual "spell index" (or 99) */ s32b times; /* Times this spell was cast */ }; /* * Some variables */ extern borg_item *borg_items; /* Current "inventory" */ extern borg_shop *borg_shops; /* Current "shops" */ /* * Safety arrays for simulating possible worlds */ extern borg_item *safe_items; /* Safety "inventory" */ extern borg_item *safe_home; /* Safety "home" */ extern borg_shop *safe_shops; /* Safety "shops" */ /* * Spell casting information */ extern borg_magic borg_magics[9][9]; /* Spell info */ /* * Determine which slot an item could be wielded into */ extern int borg_wield_slot(const borg_item *item); /* * Analyze an item, given a textual description */ extern void borg_item_analyze(borg_item *item, const object_type *real_item, char *desc); /* look for a *id*'d item */ extern bool borg_object_star_id( void ); /* look for a *id*'d item */ extern bool borg_object_star_id_aux(borg_item *borg_item, object_type *real_item); /* * Inscribe an object */ extern void borg_send_inscribe(int i, char *str); extern void borg_send_deinscribe(int i); /* * Count the items of a given tval/sval */ extern int borg_count(int tval, int sval); /* * Find an item with a given tval/sval */ extern int borg_slot(int tval, int sval); /* * Item usage functions */ enum borg_need { BORG_NO_NEED, BORG_MET_NEED, BORG_UNMET_NEED, }; extern enum borg_need borg_maintain_light(void); extern bool borg_refuel_lantern(void); /* * Item usage functions (by sval) */ extern bool borg_eat_food(int sval); extern bool borg_quaff_crit( bool no_check ); extern bool borg_quaff_potion(int sval); extern bool borg_eat_unknown(void); extern bool borg_use_unknown(void); extern bool borg_quaff_unknown(void); extern bool borg_read_unknown(void); extern bool borg_read_scroll(int sval); extern bool borg_equips_rod(int sval); extern bool borg_zap_rod(int sval); extern bool borg_aim_wand(int sval); extern bool borg_use_staff(int sval); extern bool borg_use_staff_fail(int sval); extern bool borg_equips_staff_fail(int sval); extern bool borg_inscribe_food(void); extern int borg_activate_failure(int tval, int sval); /* * Artifact usage function (by index) */ extern bool borg_activate_artifact(int activation); /* */ extern bool borg_equips_artifact(int activation); /* */ extern bool borg_activate_dragon(int drag_sval); /* */ extern bool borg_equips_dragon(int drag_sval); /* */ extern bool borg_activate_item(int tval, int sval, bool target); extern bool borg_equips_item(int tval, int sval); extern bool borg_activate_ring(int ring_sval); /* */ extern bool borg_equips_ring(int ring_sval); /* */ /* * Spell functions */ extern bool borg_spell_legal(int book, int what); extern bool borg_spell_okay(int book, int what); extern bool borg_spell(int book, int what); extern bool borg_spell_fail(int book, int what, int allow_fail); extern bool borg_spell_okay_fail(int book, int what, int allow_fail ); extern bool borg_spell_legal_fail(int book, int what, int allow_fail ); extern int borg_spell_fail_rate(int book, int what); extern int borg_prayer_fail_rate(int book, int what); /* * Prayer functions */ extern bool borg_prayer_legal(int book, int what); extern bool borg_prayer_okay(int book, int what); extern bool borg_prayer(int book, int what); extern bool borg_prayer_fail(int book, int what, int allow_fail); extern bool borg_prayer_okay_fail(int book, int what, int allow_fail ); extern bool borg_prayer_legal_fail(int book, int what, int allow_fail ); /* * Cheat/Parse the "equip" and "inven" screens. */ extern void borg_cheat_equip(void); extern void borg_cheat_inven(void); extern void borg_cheat_store(void); /* * Cheat/Parse the "spell" screen */ extern void borg_cheat_spell(int book); /* * Hack -- prepare stuff based on the race/class */ extern void prepare_race_class_info(void); extern void borg_clear_3(void); /* * Initialize this file */ extern void borg_init_3(void); #endif #endif angband-3.5.1/src/borg/borg5.h0000644000175000017500000000123512456456606015350 0ustar chriscchrisc/* File: borg5.h */ /* Purpose: Header file for "borg5.c" -BEN- */ #ifndef INCLUDED_BORG5_H #define INCLUDED_BORG5_H #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #ifdef ALLOW_BORG /* * This file provides support for "borg5.c". */ #include "borg1.h" #include "borg2.h" #include "borg3.h" #include "borg6.h" /* * Update state based on current "map" */ extern void borg_update(void); /* * React to various "important" messages */ extern void borg_react(char *msg, char *buf); extern void borg_delete_kill(int i); extern void borg_delete_take(int i); /* * Initialize this file */ extern void borg_init_5(void); #endif #endif angband-3.5.1/src/borg/borg2.c0000644000175000017500000007567512456456606015363 0ustar chriscchrisc/* File: borg2.c */ /* Purpose: Low level dungeon mapping skills -BEN- */ #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #ifdef ALLOW_BORG #include "borg1.h" #include "borg2.h" /* * This file helps the Borg understand mapping the dungeon. * * Currently, this includes general routines involving dungeon grids, * including calculating "flow" values from place to place, determining * "line of sight", plus "field of view" and "torch-lit grids", setting * the target to a given location, and extracting the optimal direction * for "movement" from place to place. * * Note that the dungeon is assumed smaller than 256 by 256. * * This file also supplies the (compiled out) support for "automatic * room extraction". This code will automatically group regions of * the dungeon into rooms, and do the "flow" navigation on those rooms * instead of on grids. Often, this takes less space, and is faster, * howver, it is more complicated, and does not allow "specialized" * flow calculations that penalize grids by variable amounts. */ /* Is this grid a grid which can be stepped on or can I see through it */ bool borg_cave_floor_bold(int Y, int X) { if (cave_in_bounds_fully(cave, Y,X)) { if ((borg_grids[Y][X].feat == FEAT_FLOOR) || (borg_grids[Y][X].feat >= FEAT_TRAP_HEAD && borg_grids[Y][X].feat <= FEAT_TRAP_TAIL) || (borg_grids[Y][X].feat == FEAT_LESS) || (borg_grids[Y][X].feat == FEAT_MORE) || (borg_grids[Y][X].feat == FEAT_BROKEN) || (borg_grids[Y][X].feat == FEAT_OPEN) || (borg_grids[Y][X].feat == FEAT_GLYPH)) return (TRUE); } return (FALSE); } /* * A simple, fast, integer-based line-of-sight algorithm. * * See "los()" in "cave.c" for complete documentation */ bool borg_los(int y1, int x1, int y2, int x2) { /* Delta */ int dx, dy; /* Absolute */ int ax, ay; /* Signs */ int sx, sy; /* Fractions */ int qx, qy; /* Scanners */ int tx, ty; /* Scale factors */ int f1, f2; /* Slope, or 1/Slope, of LOS */ int m; /* Extract the offset */ dy = y2 - y1; dx = x2 - x1; /* Extract the absolute offset */ ay = ABS(dy); ax = ABS(dx); /* Handle adjacent (or identical) grids */ if ((ax < 2) && (ay < 2)) return (TRUE); /* Paranoia -- require "safe" origin */ if (!cave_in_bounds_fully(cave, y1, x1)) return (FALSE); /* Directly South/North */ if (!dx) { /* South -- check for walls */ if (dy > 0) { for (ty = y1 + 1; ty < y2; ty++) { if (!borg_cave_floor_bold(ty, x1)) return (FALSE); } } /* North -- check for walls */ else { for (ty = y1 - 1; ty > y2; ty--) { if (!borg_cave_floor_bold(ty, x1)) return (FALSE); } } /* Assume los */ return (TRUE); } /* Directly East/West */ if (!dy) { /* East -- check for walls */ if (dx > 0) { for (tx = x1 + 1; tx < x2; tx++) { if (!borg_cave_floor_bold(y1, tx)) return (FALSE); } } /* West -- check for walls */ else { for (tx = x1 - 1; tx > x2; tx--) { if (!borg_cave_floor_bold(y1, tx)) return (FALSE); } } /* Assume los */ return (TRUE); } /* Extract some signs */ sx = (dx < 0) ? -1 : 1; sy = (dy < 0) ? -1 : 1; /* Vertical "knights" */ if (ax == 1) { if (ay == 2) { if (borg_cave_floor_bold(y1 + sy, x1)) return (TRUE); } } /* Horizontal "knights" */ else if (ay == 1) { if (ax == 2) { if (borg_cave_floor_bold(y1, x1 + sx)) return (TRUE); } } /* Calculate scale factor div 2 */ f2 = (ax * ay); /* Calculate scale factor */ f1 = f2 << 1; /* Travel horizontally */ if (ax >= ay) { /* Let m = dy / dx * 2 * (dy * dx) = 2 * dy * dy */ qy = ay * ay; m = qy << 1; tx = x1 + sx; /* Consider the special case where slope == 1. */ if (qy == f2) { ty = y1 + sy; qy -= f1; } else { ty = y1; } /* Note (below) the case (qy == f2), where */ /* the LOS exactly meets the corner of a tile. */ while (x2 - tx) { if (!borg_cave_floor_bold(ty, tx)) return (FALSE); qy += m; if (qy < f2) { tx += sx; } else if (qy > f2) { ty += sy; if (!borg_cave_floor_bold(ty, tx)) return (FALSE); qy -= f1; tx += sx; } else { ty += sy; qy -= f1; tx += sx; } } } /* Travel vertically */ else { /* Let m = dx / dy * 2 * (dx * dy) = 2 * dx * dx */ qx = ax * ax; m = qx << 1; ty = y1 + sy; if (qx == f2) { tx = x1 + sx; qx -= f1; } else { tx = x1; } /* Note (below) the case (qx == f2), where */ /* the LOS exactly meets the corner of a tile. */ while (y2 - ty) { if (!borg_cave_floor_bold(ty, tx)) return (FALSE); qx += m; if (qx < f2) { ty += sy; } else if (qx > f2) { tx += sx; if (!borg_cave_floor_bold(ty, tx)) return (FALSE); qx -= f1; ty += sy; } else { tx += sx; qx -= f1; ty += sy; } } } /* Assume los */ return (TRUE); } /* * Check the projection from (x1,y1) to (x2,y2). * Assume that there is no monster in the way. * Hack -- we refuse to assume that unknown grids are floors * Adapted from "projectable()" in "spells1.c". */ bool borg_projectable(int y1, int x1, int y2, int x2) { int dist, y, x; borg_grid *ag; /* Start at the initial location */ y = y1; x = x1; /* Simulate the spell/missile path */ for (dist = 0; dist <= MAX_RANGE; dist++) { /* Get the grid */ ag = &borg_grids[y][x]; if ((borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 3 || borg_morgoth_position || scaryguy_on_level)) { /* Assume all unknown grids more than distance 20 from you * are walls--when I am wounded. This will make me more fearful * of the grids that are up to 19 spaces away. I treat them as * regular floor grids. Which means monsters are assumed to have * LOS on me. I am also more likely to shoot into the dark grids. */ if ((dist > 20) && (ag->feat == FEAT_NONE)) break; } else if (borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 2) { /* Assume all unknow grids more than distance 10 from you * are walls--when I am wounded. This will make me more fearful * of the grids that are up to 9 spaces away. I treat them as * regular floor grids. */ if ((dist > 10) && (ag->feat == FEAT_NONE)) break; } else if (borg_fear_region[c_y/11][c_x/11] >= avoidance / 20) { /* If a non-LOS monster is attacking me, then it is probably has * LOS to me, so do not place walls on unknown grids. This will allow * me the chance to attack monsters. * * This does not work if the non-LOS monster is invisible. * This helps in a case like this: *#################### 1. Player has ESP and can sense the priest. *......@...... p 2. Priest has cast a spell at the player. *############# 3. Unknown grids are between player and priest * 4. Borg has created regional fear from non-LOS priest. * */ if ((dist > MAX_RANGE) && (ag->feat == FEAT_NONE)) break; } else { /* Assume all unknow grids more than distance 3 from you * are walls. This makes me brave and chancey. */ if ((dist > 2) && (ag->feat == FEAT_NONE)) break; } /* Never pass through walls/doors */ if (dist && (!borg_cave_floor_grid(ag))) break; /* Check for arrival at "final target" */ if ((x == x2) && (y == y2)) return (TRUE); /* Calculate the new location */ mmove2(&y, &x, y1, x1, y2, x2); } /* Assume obstruction */ return (FALSE); } /* * Check the projection from (x1,y1) to (x2,y2). * Assume that there is no monster in the way. * Hack -- we refuse to assume that unknown grids are floors * Adapted from "projectable()" in "spells1.c". * This is used by borg_offset() */ bool borg_offset_projectable(int y1, int x1, int y2, int x2) { int dist, y, x; borg_grid *ag; /* Start at the initial location */ y = y1; x = x1; /* Simulate the spell/missile path */ for (dist = 0; dist <= MAX_RANGE; dist++) { /* Get the grid */ ag = &borg_grids[y][x]; /* Assume all unknown grids are walls. */ if ((dist) && (ag->feat == FEAT_NONE)) break; /* Never pass through walls/doors */ if (dist && (!borg_cave_floor_grid(ag))) break; /* Check for arrival at "final target" */ if ((x == x2) && (y == y2)) return (TRUE); /* Calculate the new location */ mmove2(&y, &x, y1, x1, y2, x2); } /* Assume obstruction */ return (FALSE); } /* * Check the projection from (x1,y1) to (x2,y2). * Assume that monsters in the way will stop the projection * Hack -- we refuse to assume that unknown grids are floors * In fact, we assume they are walls. * Adapted from "projectable()" in "spells1.c". */ bool borg_projectable_pure(int y1, int x1, int y2, int x2) { int dist, y, x; borg_grid *ag; /* Start at the initial location */ y = y1; x = x1; /* Simulate the spell/missile path */ for (dist = 0; dist <= MAX_RANGE; dist++) { /* Get the grid */ ag = &borg_grids[y][x]; /* Hack -- assume unknown grids are walls */ if (dist && (ag->feat == FEAT_NONE)) break; /* Never pass through walls/doors */ if (dist && (!borg_cave_floor_grid(ag))) break; /* Check for arrival at "final target" */ if ((x == x2) && (y == y2)) return (TRUE); /* Stop at monsters */ if (ag->kill) break; /* Calculate the new location */ mmove2(&y, &x, y1, x1, y2, x2); } /* Assume obstruction */ return (FALSE); } /* * Check the projection from (x1,y1) to (x2,y2). * Assume that monsters in the way will stop the projection. * Assume that an unknown grid is a floor grid. * We want at least one unknown grid. * * This routine is used mainly aiming beams of light and * shooting into darkness, testing the projection path. * */ bool borg_projectable_dark(int y1, int x1, int y2, int x2) { int dist, y, x; int unknown = 0; borg_grid *ag; /* Start at the initial location */ y = y1; x = x1; /* Simulate the spell/missile path */ for (dist = 0; dist <= MAX_RANGE; dist++) { /* Get the grid */ ag = &borg_grids[y][x]; /* We want at least 1 unknown grid */ if (dist && (ag->feat == FEAT_NONE)) unknown ++; /* Never pass through walls/doors */ if (dist && (!borg_cave_floor_grid(ag))) break; /* Check for arrival at "final target" */ if ((x == x2) && (y == y2) && unknown >= 1) return (TRUE); /* Stop at monsters */ if (ag->kill) break; /* Calculate the new location */ mmove2(&y, &x, y1, x1, y2, x2); } /* Assume obstruction */ return (FALSE); } /* * Clear the lite grids */ void borg_forget_LIGHT(void) { int i; /* None to forget */ if (!borg_LIGHT_n) return; /* Clear them all */ for (i = 0; i < borg_LIGHT_n; i++) { int y = borg_LIGHT_y[i]; int x = borg_LIGHT_x[i]; /* Forget that the grid is lit */ borg_grids[y][x].info &= ~BORG_LIGHT; } /* None left */ borg_LIGHT_n = 0; } /* * XXX XXX XXX * * This macro allows us to efficiently add a grid to the "lite" array, * note that we are never called for illegal grids, or for grids which * have already been placed into the "lite" array, and we are never * called when the "lite" array is full. */ #define borg_cave_LIGHT_hack(Y,X) \ borg_grids[Y][X].info |= BORG_LIGHT; \ borg_LIGHT_y[borg_LIGHT_n] = (Y); \ borg_LIGHT_x[borg_LIGHT_n] = (X); \ borg_LIGHT_n++ /* * Update the set of grids "illuminated" by the player's lite. * * See "update_LIGHT" in "cave.c" for complete documentation * * It is very important that the "player grid" be the first grid in the * array of "BORG_LIGHT" grids, since this is assumed in several places. */ void borg_update_LIGHT(void) { int i, x, y, min_x, max_x, min_y, max_y; /*** Clear old grids ***/ /* Clear them all */ for (i = 0; i < borg_LIGHT_n; i++) { y = borg_LIGHT_y[i]; x = borg_LIGHT_x[i]; /* Mark the grid as not "lite" */ borg_grids[y][x].info &= ~BORG_LIGHT; } /* None left */ borg_LIGHT_n = 0; /* Hack -- Player has no lite */ if (borg_skill[BI_CURLITE] <= 0) return; /*** Collect the new "lite" grids ***/ /* Player grid */ borg_cave_LIGHT_hack(c_y, c_x); /* Radius 1 -- torch radius */ if (borg_skill[BI_CURLITE] >= 1) { /* Adjacent grid */ borg_cave_LIGHT_hack(c_y+1, c_x); borg_cave_LIGHT_hack(c_y-1, c_x); borg_cave_LIGHT_hack(c_y, c_x+1); borg_cave_LIGHT_hack(c_y, c_x-1); /* Diagonal grids */ borg_cave_LIGHT_hack(c_y+1, c_x+1); borg_cave_LIGHT_hack(c_y+1, c_x-1); borg_cave_LIGHT_hack(c_y-1, c_x+1); borg_cave_LIGHT_hack(c_y-1, c_x-1); } /* Radius 2 -- lantern radius */ if (borg_skill[BI_CURLITE] >= 2 && c_y + 2 < AUTO_MAX_Y && c_y - 2 > 0 && c_x + 2 < AUTO_MAX_X && c_x - 2 > 0) { /* South of the player */ if (borg_cave_floor_bold(c_y+2, c_x)) { borg_cave_LIGHT_hack(c_y+2, c_x); borg_cave_LIGHT_hack(c_y+2, c_x+2); borg_cave_LIGHT_hack(c_y+2, c_x-2); } /* North of the player */ if (borg_cave_floor_bold(c_y-2, c_x)) { borg_cave_LIGHT_hack(c_y-2, c_x); borg_cave_LIGHT_hack(c_y-2, c_x+2); borg_cave_LIGHT_hack(c_y-2, c_x-2); } /* East of the player */ if (borg_cave_floor_bold(c_y, c_x+2)) { borg_cave_LIGHT_hack(c_y, c_x+2); borg_cave_LIGHT_hack(c_y+1, c_x+2); borg_cave_LIGHT_hack(c_y-1, c_x+2); } /* West of the player */ if (borg_cave_floor_bold(c_y, c_x-2)) { borg_cave_LIGHT_hack(c_y, c_x-2); borg_cave_LIGHT_hack(c_y+2, c_x-2); borg_cave_LIGHT_hack(c_y-2, c_x-2); } } /* Radius 3+ -- artifact radius */ if (borg_skill[BI_CURLITE] >= 3 && c_y + 3 < AUTO_MAX_Y && c_y - 3 > 0 && c_x + 3 < AUTO_MAX_X && c_x - 3 > 0) { int d, p; /* Maximal radius */ p = borg_skill[BI_CURLITE]; /* Paranoia -- see "LITE_MAX" */ if (p > 5) p = 5; /* South-East of the player */ if (borg_cave_floor_bold(c_y+3, c_x+3)) { borg_cave_LIGHT_hack(c_y+3, c_x+3); } /* South-West of the player */ if (borg_cave_floor_bold(c_y+3, c_x-3)) { borg_cave_LIGHT_hack(c_y+3, c_x-3); } /* North-East of the player */ if (borg_cave_floor_bold(c_y-3, c_x+3)) { borg_cave_LIGHT_hack(c_y-3, c_x+3); } /* North-West of the player */ if (borg_cave_floor_bold(c_y-3, c_x-3)) { borg_cave_LIGHT_hack(c_y-3, c_x-3); } /* Maximal north */ min_y = c_y - p; if (min_y < 0) min_y = 0; /* Maximal south */ max_y = c_y + p; if (max_y > AUTO_MAX_Y-1) max_y = AUTO_MAX_Y-1; /* Maximal west */ min_x = c_x - p; if (min_x < 0) min_x = 0; /* Maximal east */ max_x = c_x + p; if (max_x > AUTO_MAX_X-1) max_x = AUTO_MAX_X-1; /* Scan the maximal box */ for (y = min_y; y <= max_y; y++) { for (x = min_x; x <= max_x; x++) { int dy = (c_y > y) ? (c_y - y) : (y - c_y); int dx = (c_x > x) ? (c_x - x) : (x - c_x); /* Skip the "central" grids (above) */ if ((dy <= 2) && (dx <= 2)) continue; /* Hack -- approximate the distance */ d = (dy > dx) ? (dy + (dx>>1)) : (dx + (dy>>1)); /* Skip distant grids */ if (d > p) continue; /* Viewable, nearby, grids get "torch lit" */ if (borg_grids[y][x].info & BORG_VIEW) { /* This grid is "torch lit" */ borg_cave_LIGHT_hack(y, x); } } } } } /* * Clear the viewable space */ void borg_forget_view(void) { int i; borg_grid *ag; /* None to forget */ if (!borg_view_n) return; /* Clear them all */ for (i = 0; i < borg_view_n; i++) { int y = borg_view_y[i]; int x = borg_view_x[i]; /* Access the grid */ ag = &borg_grids[y][x]; /* Forget that the grid is viewable */ ag->info &= ~BORG_VIEW; } /* None left */ borg_view_n = 0; } /* * This macro allows us to efficiently add a grid to the "view" array, * note that we are never called for illegal grids, or for grids which * have already been placed into the "view" array, and we are never * called when the "view" array is full. */ #define borg_cave_view_hack(A,Y,X) \ (A)->info |= BORG_VIEW; \ borg_view_y[borg_view_n] = (Y); \ borg_view_x[borg_view_n] = (X); \ borg_view_n++ /* * Helper function for "borg_update_view()" below * * See "update_view_aux()" in "cave.c" for complete documentation. */ static bool borg_update_view_aux(int y, int x, int y1, int x1, int y2, int x2) { bool f1, f2, v1, v2, z1, z2, wall; borg_grid *ag; borg_grid *g1_ag; borg_grid *g2_ag; /* Access the grids */ g1_ag = &borg_grids[y1][x1]; g2_ag = &borg_grids[y2][x2]; /* Check for walls */ f1 = (borg_cave_floor_grid(g1_ag)); f2 = (borg_cave_floor_grid(g2_ag)); /* Totally blocked by physical walls */ if (!f1 && !f2) return (TRUE); /* Check for visibility */ v1 = (f1 && (g1_ag->info & BORG_VIEW)); v2 = (f2 && (g2_ag->info & BORG_VIEW)); /* Totally blocked by "unviewable neighbors" */ if (!v1 && !v2) return (TRUE); /* Access the grid */ ag = &borg_grids[y][x]; /* Check for walls */ wall = (!borg_cave_floor_grid(ag)); /* Check the "ease" of visibility */ z1 = (v1 && (g1_ag->info & BORG_XTRA)); z2 = (v2 && (g2_ag->info & BORG_XTRA)); /* Hack -- "easy" plus "easy" yields "easy" */ if (z1 && z2) { ag->info |= BORG_XTRA; borg_cave_view_hack(ag, y, x); return (wall); } /* Hack -- primary "easy" yields "viewed" */ if (z1) { borg_cave_view_hack(ag, y, x); return (wall); } /* Hack -- "view" plus "view" yields "view" */ if (v1 && v2) { /* ag->info |= BORG_XTRA; */ borg_cave_view_hack(ag, y, x); return (wall); } /* Mega-Hack -- the "borg_los()" function works poorly on walls */ if (wall) { borg_cave_view_hack(ag, y, x); return (wall); } /* Hack -- check line of sight */ if (borg_los(c_y, c_x, y, x)) { borg_cave_view_hack(ag, y, x); return (wall); } /* Assume no line of sight. */ return (TRUE); } /* * Calculate the region currently "viewable" by the player * * See "update_view()" in "cave.c" for complete documentation * * It is very important that the "player grid" be the first grid in the * array of "BORG_VIEW" grids, since this is assumed in several places. */ void borg_update_view(void) { int n, m, d, k, y, x, z; int se, sw, ne, nw, es, en, ws, wn; int full, over; borg_grid *ag; /*** Initialize ***/ /* Full radius (20) */ full = MAX_SIGHT; /* Octagon factor (30) */ over = MAX_SIGHT * 3 / 2; /*** Step 0 -- Begin ***/ /* Save the old "view" grids for later */ for (n = 0; n < borg_view_n; n++) { y = borg_view_y[n]; x = borg_view_x[n]; /* Access the grid */ ag = &borg_grids[y][x]; /* Mark the grid as not in "view" */ ag->info &= ~(BORG_VIEW); } /* Start over with the "view" array */ borg_view_n = 0; /*** Step 1 -- adjacent grids ***/ /* Now start on the player */ y = c_y; x = c_x; /* Access the grid */ ag = &borg_grids[y][x]; /* Assume the player grid is easily viewable */ ag->info |= BORG_XTRA; /* Assume the player grid is viewable */ borg_cave_view_hack(ag, y, x); /*** Step 2 -- Major Diagonals ***/ /* Hack -- Limit */ z = full * 2 / 3; /* Scan south-east */ for (d = 1; d <= z; d++) { if (!cave_in_bounds_fully(cave, y+d, x+d)) continue; ag = &borg_grids[y+d][x+d]; ag->info |= BORG_XTRA; borg_cave_view_hack(ag, y+d, x+d); if (!borg_cave_floor_grid(ag)) break; } /* Scan south-west */ for (d = 1; d <= z; d++) { /* Caution */ if (!cave_in_bounds_fully(cave, y+d, x-d)) continue; ag = &borg_grids[y+d][x-d]; ag->info |= BORG_XTRA; borg_cave_view_hack(ag, y+d, x-d); if (!borg_cave_floor_grid(ag)) break; } /* Scan north-east */ for (d = 1; d <= z; d++) { /* Caution */ if (!cave_in_bounds_fully(cave, y-d, x+d)) continue; ag = &borg_grids[y-d][x+d]; ag->info |= BORG_XTRA; borg_cave_view_hack(ag, y-d, x+d); if (!borg_cave_floor_grid(ag)) break; } /* Scan north-west */ for (d = 1; d <= z; d++) { /* Caution */ if (!cave_in_bounds_fully(cave, y-d, x-d)) continue; ag = &borg_grids[y-d][x-d]; ag->info |= BORG_XTRA; borg_cave_view_hack(ag, y-d, x-d); if (!borg_cave_floor_grid(ag)) break; } /*** Step 3 -- major axes ***/ /* Scan south */ for (d = 1; d <= full; d++) { /* Caution */ if (!cave_in_bounds_fully(cave, y+d, x)) continue; ag = &borg_grids[y+d][x]; ag->info |= BORG_XTRA; borg_cave_view_hack(ag, y+d, x); if (!borg_cave_floor_grid(ag)) break; } /* Initialize the "south strips" */ se = sw = d; /* Scan north */ for (d = 1; d <= full; d++) { /* Caution */ if (!cave_in_bounds_fully(cave, y-d, x)) continue; ag = &borg_grids[y-d][x]; ag->info |= BORG_XTRA; borg_cave_view_hack(ag, y-d, x); if (!borg_cave_floor_grid(ag)) break; } /* Initialize the "north strips" */ ne = nw = d; /* Scan east */ for (d = 1; d <= full; d++) { /* Caution */ if (!cave_in_bounds_fully(cave, y, x+d)) continue; ag = &borg_grids[y][x+d]; ag->info |= BORG_XTRA; borg_cave_view_hack(ag, y, x+d); if (!borg_cave_floor_grid(ag)) break; } /* Initialize the "east strips" */ es = en = d; /* Scan west */ for (d = 1; d <= full; d++) { /* Caution */ if (!cave_in_bounds_fully(cave, y, x-d)) continue; ag = &borg_grids[y][x-d]; ag->info |= BORG_XTRA; borg_cave_view_hack(ag, y, x-d); if (!borg_cave_floor_grid(ag)) break; } /* Initialize the "west strips" */ ws = wn = d; /*** Step 4 -- Divide each "octant" into "strips" ***/ /* Now check each "diagonal" (in parallel) */ for (n = 1; n <= over / 2; n++) { int ypn, ymn, xpn, xmn; /* Acquire the "bounds" of the maximal circle */ z = over - n - n; if (z > full - n) z = full - n; while ((z + n + (n>>1)) > full) z--; /* Access the four diagonal grids */ ypn = y + n; ymn = y - n; xpn = x + n; xmn = x - n; /* South strip */ if (ypn < AUTO_MAX_Y-1) { /* Maximum distance */ m = MIN(z, (AUTO_MAX_Y-1) - ypn); /* East side */ if ((xpn <= AUTO_MAX_X-1) && (n < se)) { /* Scan */ for (k = n, d = 1; d <= m; d++) { /* Check grid "d" in strip "n", notice "blockage" */ if (borg_update_view_aux(ypn+d, xpn, ypn+d-1, xpn-1, ypn+d-1, xpn)) { if (n + d >= se) break; } /* Track most distant "non-blockage" */ else { k = n + d; } } /* Limit the next strip */ se = k + 1; } /* West side */ if ((xmn >= 0) && (n < sw)) { /* Scan */ for (k = n, d = 1; d <= m; d++) { /* Check grid "d" in strip "n", notice "blockage" */ if (borg_update_view_aux(ypn+d, xmn, ypn+d-1, xmn+1, ypn+d-1, xmn)) { if (n + d >= sw) break; } /* Track most distant "non-blockage" */ else { k = n + d; } } /* Limit the next strip */ sw = k + 1; } } /* North strip */ if (ymn > 0) { /* Maximum distance */ m = MIN(z, ymn); /* East side */ if ((xpn <= AUTO_MAX_X-1) && (n < ne)) { /* Scan */ for (k = n, d = 1; d <= m; d++) { /* Check grid "d" in strip "n", notice "blockage" */ if (borg_update_view_aux(ymn-d, xpn, ymn-d+1, xpn-1, ymn-d+1, xpn)) { if (n + d >= ne) break; } /* Track most distant "non-blockage" */ else { k = n + d; } } /* Limit the next strip */ ne = k + 1; } /* West side */ if ((xmn >= 0) && (n < nw)) { /* Scan */ for (k = n, d = 1; d <= m; d++) { /* Check grid "d" in strip "n", notice "blockage" */ if (borg_update_view_aux(ymn-d, xmn, ymn-d+1, xmn+1, ymn-d+1, xmn)) { if (n + d >= nw) break; } /* Track most distant "non-blockage" */ else { k = n + d; } } /* Limit the next strip */ nw = k + 1; } } /* East strip */ if (xpn < AUTO_MAX_X-1) { /* Maximum distance */ m = MIN(z, (AUTO_MAX_X-1) - xpn); /* South side */ if ((ypn <= AUTO_MAX_Y-1) && (n < es)) { /* Scan */ for (k = n, d = 1; d <= m; d++) { /* Check grid "d" in strip "n", notice "blockage" */ if (borg_update_view_aux(ypn, xpn+d, ypn-1, xpn+d-1, ypn, xpn+d-1)) { if (n + d >= es) break; } /* Track most distant "non-blockage" */ else { k = n + d; } } /* Limit the next strip */ es = k + 1; } /* North side */ if ((ymn >= 0) && (n < en)) { /* Scan */ for (k = n, d = 1; d <= m; d++) { /* Check grid "d" in strip "n", notice "blockage" */ if (borg_update_view_aux(ymn, xpn+d, ymn+1, xpn+d-1, ymn, xpn+d-1)) { if (n + d >= en) break; } /* Track most distant "non-blockage" */ else { k = n + d; } } /* Limit the next strip */ en = k + 1; } } /* West strip */ if (xmn > 0) { /* Maximum distance */ m = MIN(z, xmn); /* South side */ if ((ypn <= AUTO_MAX_Y-1) && (n < ws)) { /* Scan */ for (k = n, d = 1; d <= m; d++) { /* Check grid "d" in strip "n", notice "blockage" */ if (borg_update_view_aux(ypn, xmn-d, ypn-1, xmn-d+1, ypn, xmn-d+1)) { if (n + d >= ws) break; } /* Track most distant "non-blockage" */ else { k = n + d; } } /* Limit the next strip */ ws = k + 1; } /* North side */ if ((ymn >= 0) && (n < wn)) { /* Scan */ for (k = n, d = 1; d <= m; d++) { /* Check grid "d" in strip "n", notice "blockage" */ if (borg_update_view_aux(ymn, xmn-d, ymn+1, xmn-d+1, ymn, xmn-d+1)) { if (n + d >= wn) break; } /* Track most distant "non-blockage" */ else { k = n + d; } } /* Limit the next strip */ wn = k + 1; } } } /*** Step 5 -- Complete the algorithm ***/ /* Update all the new grids */ for (n = 0; n < borg_view_n; n++) { y = borg_view_y[n]; x = borg_view_x[n]; /* Access the grid */ ag = &borg_grids[y][x]; /* Clear the "BORG_XTRA" flag */ ag->info &= ~BORG_XTRA; } } /* * Init this file. */ void borg_init_2(void) { /* Nothing */ } #else #ifdef MACINTOSH static int HACK = 0; #endif #endif angband-3.5.1/src/borg/borg9.h0000644000175000017500000000105112456456606015350 0ustar chriscchrisc/* File: borg9.h */ /* Purpose: Header file for "borg9.c" -BEN- */ #ifndef INCLUDED_BORG9_H #define INCLUDED_BORG9_H #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #ifdef ALLOW_BORG /* * This file provides support for "borg9.c". */ #ifndef BABLOS extern void resurrect_borg(void); extern void borg_write_map(bool ask); extern errr borg_enter_score(void); #endif /* bablos */ extern void borg_save_scumfile(void); extern void borg_status(void); /* * Initialize this file */ extern void borg_init_9(void); #endif #endif angband-3.5.1/src/borg/borg5.c0000644000175000017500000042607612456456606015361 0ustar chriscchrisc/* File: borg5.c */ /* Purpose: Medium level stuff for the Borg -BEN- */ #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #include "monster/mon-spell.h" #include "borg1.h" #include "borg2.h" #include "borg3.h" #include "borg4.h" #include "borg5.h" /* * This file is responsible for the "borg_update" routine, which is used * to notice changes in the world, and to keep track of terrain features, * objects, monsters, both from visual changes, and from world messages. * * One big thing this file does is "object/monster tracking", which * attempts to gather information about the objects and monsters in * the dungeon, including their identity, location, and state, and * to "follow" them if they "move", and to delete them when they die. * * Information about terrain is used to help plan "flow" paths. Info * about objects and monsters is used to optimize planning paths to * those objects and monsters. Info about monsters is also used for * the "danger" functions, which help avoid dangerous situations. * * Notes: * We assume that monsters/objects can never appear in walls/doors * We count the occurance of invisible or offscreen monsters * We treat "mimics" and "trappers" as "invisible" monsters * * To Do: * Track approximate monster hitpoints (min/max hitpoints?) * If so, factor in regeneration and various spell attacks * Take account of monster "fear" when "following" monsters * * Bugs: * Groups of monsters may induce faulty monster matching * Teleporting monsters may induce faulty monster matching * Monsters which appear singly and in groups are "weird" * The timestamps are not quite in sync properly (?) */ /* * Old values */ static int o_w_x = -1; /* Old panel */ static int o_w_y = -1; /* Old panel */ static int o_c_x = -1; /* Old location */ static int o_c_y = -1; /* Old location */ /* * Hack -- message memory */ static s16b borg_msg_len; static s16b borg_msg_siz; static char *borg_msg_buf; static s16b borg_msg_num; static s16b borg_msg_max; static s16b *borg_msg_pos; static s16b *borg_msg_use; /* * Hack -- help identify "unique" monster names */ static int borg_unique_size; /* Number of uniques */ static s16b *borg_unique_what; /* Indexes of uniques */ static const char **borg_unique_text; /* Names of uniques */ /* * Hack -- help identify "normal" monster names */ static int borg_normal_size; /* Number of normals */ static s16b *borg_normal_what; /* Indexes of normals */ static const char **borg_normal_text; /* Names of normals */ /* * Hack -- monster/object tracking grids */ typedef struct borg_wank borg_wank; struct borg_wank { byte x; byte y; byte t_a; wchar_t t_c; bool is_take; bool is_kill; }; /* * Hack -- object/monster tracking array */ static int borg_wank_num = 0; static borg_wank *borg_wanks; /* * Attempt to guess what kind of object is at the given location. * * This routine should rarely, if ever, return "zero". * * Hack -- we use "base level" instead of "allocation levels". */ static struct object_kind *borg_guess_kind(byte a, wchar_t c,int y,int x) { /* ok, this is an real cheat. he ought to use the look command * in order to correctly id the object. But I am passing that up for * the sake of speed and accuracy */ /* Cheat the Actual item */ object_type *o_ptr; o_ptr= object_byid(cave->o_idx[y][x]); return (o_ptr->kind); #if 0 /* The rest here is the original code. It made several mistakes */ /* Actual item */ { int i, s; int b_i = 0, b_s = 0; /* Find an "acceptable" object */ for (i = 1; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; /* Skip non-objects */ if (!k_ptr->name) continue; /* Base score */ s = 10000; /* Hack -- penalize "extremely" out of depth */ if (k_ptr->level > borg_skill[BI_CDEPTH] + 50) s = s - 500; /* Hack -- penalize "very" out of depth */ if (k_ptr->level > borg_skill[BI_CDEPTH] + 15) s = s - 100; /* Hack -- penalize "rather" out of depth */ if (k_ptr->level > borg_skill[BI_CDEPTH] + 5) s = s - 50; /* Hack -- penalize "somewhat" out of depth */ if (k_ptr->level > borg_skill[BI_CDEPTH]) s = s - 10; /* Hack -- Penalize "depth miss" */ s = s - ABS(k_ptr->level - borg_skill[BI_CDEPTH]); /* Hack -- Penalize INSTA_ART items */ if (k_ptr->flags[2] & TR2_INSTA_ART) s = s - 1000; /* Hack -- Penalize CURSED items */ if (k_ptr->flags[2] & TR2_LIGHT_CURSE) s = s - 5000; /* Hack -- Penalize BROKEN items */ if (k_ptr->cost <= 0) s = s - 5000; /* Verify char */ if (c != k_ptr->d_char) continue; /* Flavored objects */ if (k_ptr->flavor) { /* Hack -- penalize "flavored" objects */ s = s - 20; } /* Normal objects */ else { /* Verify attr */ if (a != k_ptr->d_attr) continue; } /* Desire "best" possible score */ if (b_i && (s < b_s)) continue; /* Track it */ b_i = i; b_s = s; } /* Result */ return (b_i); } #endif } /* * Delete an old "object" record */ void borg_delete_take(int i) { borg_grid *ag; borg_take *take = &borg_takes[i]; /* Paranoia -- Already wiped */ if (!take->kind) return; /* Note */ if (borg_verbose) borg_note(format("# Forgetting an object '%s' at (%d,%d)", (take->kind->name), take->y, take->x)); /* Access the grid */ ag = &borg_grids[take->y][take->x]; /* Forget it */ ag->take = 0; /* Kill the object */ WIPE(take, borg_take); /* One less object */ borg_takes_cnt--; /* Wipe goals */ if (goal == GOAL_TAKE) goal = 0; } /* * Determine if an object should be "viewable" */ static bool borg_follow_take_aux(int i, int y, int x) { borg_grid *ag; /* Access the grid */ ag = &borg_grids[y][x]; /* Not on-screen */ if (!(ag->info & BORG_OKAY)) return (FALSE); /* Assume viewable */ return (TRUE); } /* * Attempt to "follow" a missing object * * This routine is not called when the player is blind or hallucinating. * * This function just deletes objects which have disappeared. * * We assume that a monster walking onto an object destroys the object * if it has the appropriate flags. */ static void borg_follow_take(int i) { int ox, oy; borg_take *take = &borg_takes[i]; borg_grid *ag = &borg_grids[take->y][take->x]; borg_kill *kill = &borg_kills[ag->kill]; monster_race *r_ptr = &r_info[kill->r_idx]; struct object_kind *old_kind; /* Paranoia */ if (!take->kind) return; /* Old location */ ox = take->x; oy = take->y; old_kind = take->kind; /* delete them if they are under me */ if (take->y == c_y && take->x == c_x) { borg_delete_take(i); } /* Out of sight */ if (!borg_follow_take_aux(i, oy, ox)) return; /* Some monsters won't take or crush items */ if (ag->kill && !rf_has(r_ptr->flags, RF_TAKE_ITEM) && !rf_has(r_ptr->flags, RF_KILL_ITEM)) return; /* Note */ borg_note(format("# There was an object '%s' at (%d,%d)", (old_kind->name), ox, oy)); /* Kill the object */ borg_delete_take(i); } /* * Obtain a new "take" index */ static int borg_new_take(struct object_kind *kind, int y, int x) { int i, n = -1; borg_take *take; borg_grid *ag = &borg_grids[y][x]; object_type *o_ptr = object_byid(cave->o_idx[y][x]); /* Look for a "dead" object */ for (i = 1; (n < 0) && (i < borg_takes_nxt); i++) { /* Reuse "dead" objects */ if (!borg_takes[i].kind) n = i; } /* Allocate a new object */ if ((n < 0) && (borg_takes_nxt < 256)) { /* Acquire the entry, advance */ n = borg_takes_nxt++; } /* Hack -- steal an old object */ if (n < 0) { /* Note */ borg_note("# Too many objects"); /* Hack -- Pick a random object */ n = randint0(borg_takes_nxt-1) + 1; /* Delete it */ borg_delete_take(n); } /* Count new object */ borg_takes_cnt++; /* Obtain the object */ take = &borg_takes[n]; /* Save the kind */ take->kind = kind; take->tval = kind->tval; /* Save the location */ take->x = x; take->y = y; /* Save the index */ ag->take = n; /* Timestamp */ take->when = borg_t; /* Not had Orb of Draining cast on it */ take->orbed = FALSE; /* Assess a estimated value */ if (kind->aware) { /* Standard Value of an item */ take->value = kind->cost; /* Money needs a value */ if (take->tval == TV_GOLD) take->value = 30; } else { take->value = 1; } /* Cheat to see if this item is ID'd or not. We use this cheat to avoid * dumping an item which we know to be bad then turning around and picking * it up again. */ if ((o_ptr->ident & IDENT_KNOWN) && (o_ptr->to_a < 0 || o_ptr->to_d < 0 || o_ptr->to_h < 0)) take->value = -10; /* Note */ borg_note(format("# Creating an object '%s' at (%d,%d)", (take->kind->name), take->x, take->y)); /* Wipe goals only if I have some light source */ if (borg_skill[BI_CURLITE]) goal = 0; /* Hack -- Force the object to sit on a floor grid */ ag->feat = FEAT_FLOOR; /* Result */ return (n); } /* * Attempt to notice a changing "take" */ static bool observe_take_diff(int y, int x, byte a, wchar_t c) { int i; struct object_kind *kind; borg_take *take; /* Guess the kind */ kind = borg_guess_kind(a, c,y,x); /* Oops */ if (!kind) return (FALSE); /* no new takes if hallucinations */ if (borg_skill[BI_ISIMAGE]) return (FALSE); /* Make a new object */ i = borg_new_take(kind, y, x); /* Get the object */ take = &borg_takes[i]; /* Timestamp */ take->when = borg_t; /* Okay */ return (TRUE); } /* * Attempt to "track" a "take" at the given location * Assume that the object has not moved more than "d" grids * Note that, of course, objects are never supposed to move, * but we may want to take account of "falling" missiles later. */ static bool observe_take_move(int y, int x, int d, byte a, wchar_t c) { int i, z, ox, oy; object_kind *k_ptr; /* Scan the objects */ for (i = 1; i < borg_takes_nxt; i++) { borg_take *take = &borg_takes[i]; /* Skip dead objects */ if (!take->kind) continue; /* Skip assigned objects */ if (take->seen) continue; /* Extract old location */ ox = take->x; oy = take->y; /* Calculate distance */ z = distance(oy, ox, y, x); /* Possible match */ if (z > d) continue; /* Access the kind */ k_ptr = take->kind; /* Require matching char if not hallucinating*/ if (!borg_skill[BI_ISIMAGE] && c != k_ptr->d_char) continue; /* Require matching attr if not hallucinating rr9*/ if (!borg_skill[BI_ISIMAGE] && a != k_ptr->d_attr && (k_ptr->d_attr != 11 && k_ptr->d_char == '!') /* There are serious bugs with Flasks of Oil not having the attr set correctly */) { /* Ignore "flavored" colors */ if (!k_ptr->flavor) continue; } /* Actual movement (?) */ if (z) { /* Update the grids */ borg_grids[take->y][take->x].take = 0; /* Track it */ take->x = x; take->y = y; /* Update the grids */ borg_grids[take->y][take->x].take = i; /* Note */ borg_note(format("# Tracking an object '%s' at (%d,%d) from (%d,%d)", (k_ptr->name), take->y, take->x, ox, oy)); /* Clear goals */ if (goal == GOAL_TAKE) goal = 0; } /* Timestamp */ take->when = borg_t; /* Mark as seen */ take->seen = TRUE; /* Mark floor underneath */ borg_grids[take->y][take->x].feat = FEAT_FLOOR; /* Done */ return (TRUE); } /* Oops */ return (FALSE); } /* * Attempt to guess what type of monster is at the given location. * * If we are unable to think of any monster that could be at the * given location, we will assume the monster is a player ghost. * This is a total hack, but may prevent crashes. * * The guess can be improved by the judicious use of a specialized * "attr/char" mapping, especially for unique monsters. Currently, * the Borg does not stoop to such redefinitions. * * We will probably fail to identify "trapper" and "lurker" monsters, * since they look like whatever they are standing on. Now we will * probably just assume they are player ghosts. XXX XXX XXX * * Note that "town" monsters may only appear in town, and in "town", * only "town" monsters may appear, unless we summon or polymorph * a monster while in town, which should never happen. * * To guess which monster is at the given location, we consider every * possible race, keeping the race (if any) with the best "score". * * Certain monster races are "impossible", including town monsters * in the dungeon, dungeon monsters in the town, unique monsters * known to be dead, monsters more than 50 levels out of depth, * and monsters with an impossible char, or an impossible attr. * * Certain aspects of a monster race are penalized, including extreme * out of depth, minor out of depth, clear/multihued attrs. * * Certain aspects of a monster race are rewarded, including monsters * that appear in groups, monsters that reproduce, monsters that have * been seen on this level a lot. * * We are never called for "trapper", "lurker", or "mimic" monsters. * * The actual rewards and penalties probably need some tweaking. * * Hack -- try not to choose "unique" monsters, or we will flee a lot. */ static int borg_guess_race(byte a, wchar_t c, bool multi, int y, int x) { /* ok, this is an real cheat. he ought to use the look command * in order to correctly id the monster. but i am passing that up for * the sake of speed */ #if 0 int i, s, n; int b_i = 0, b_s = 0; #endif monster_type *m_ptr; m_ptr= cave_monster(cave, cave->m_idx[y][x]); /* Actual monsters */ return (m_ptr->race->ridx); #if 0 /* If I cannot locate it, then use the old routine to id the monster */ /* Find an "acceptable" monster */ for (i = 1; i < z_info->r_max-1; i++) { monster_race *r_ptr = &r_info[i]; /* Skip non-monsters */ if (!r_ptr->name) continue; /* Base score */ s = 10000; /* Verify char rr9*/ if (c != r_ptr->d_char) continue; /* Clear or multi-hued monsters */ if (r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_ATTR_CLEAR)) { /* Penalize "weird" monsters */ if (!multi) s = s - 1000; } /* Normal monsters */ else { /* Verify multi */ if (multi) continue; /* Verify attr */ if (a != r_ptr->d_attr) continue; } /* Check uniques */ if (rf_has(r_ptr->flags, RF_UNIQUE)) { /* Hack -- Dead uniques stay dead */ if (borg_race_death[i] > 0) continue; /* Prefer normals */ s = s - 10; } /* Hack -- penalize "extremely" out of depth */ if (r_ptr->level > borg_skill[BI_CDEPTH] + 50) continue; /* Hack -- penalize "very" out of depth */ if (r_ptr->level > borg_skill[BI_CDEPTH] + 15) s = s - 100; /* Hack -- penalize "rather" out of depth */ if (r_ptr->level > borg_skill[BI_CDEPTH] + 5) s = s - 50; /* Hack -- penalize "somewhat" out of depth */ if (r_ptr->level > borg_skill[BI_CDEPTH]) s = s - 10; /* Penalize "depth miss" */ s = s - ABS(r_ptr->level - borg_skill[BI_CDEPTH]); /* Hack -- Reward multiplying monsters */ if (rf_has(r_ptr->flags, RF_MULTIPLY)) s = s + 10; /* Count occurances */ n = borg_race_count[i]; /* Mega-Hack -- Reward occurances XXX XXX XXX */ s = s + (n / 100) + (((n < 100) ? n : 100) / 10) + ((n < 10) ? n : 10); /* Desire "best" possible score */ if (b_i && (s < b_s)) continue; /* Track it */ b_i = i; b_s = s; } /* Success */ if (b_i) return (b_i); /* Message */ borg_note(format("# Assuming player ghost (char %d, attr %d)", c, a)); /* Assume player ghost */ return (z_info->r_max - 1); #endif } /* * Attempt to convert a monster name into a race index * * First we check for all possible "unique" monsters, including * ones we have killed, and even if the monster name is "prefixed" * (as in "The Tarrasque" and "The Lernean Hydra"). Since we use * a fast binary search, this is acceptable. * * Otherwise, if the monster is NOT named "The xxx", we assume it * must be a "player ghost" (which is impossible). * * Then, we do a binary search on all "normal" monster names, using * a search which is known to find the last matching entry, if one * exists, and otherwise to find an entry which would follow the * matching entry if there was one, unless the matching entry would * follow all the existing entries, in which case it will find the * final entry in the list. Thus, we can search *backwards* from * the result of the search, and know that we will access all of * the matching entries, as long as we stop once we find an entry * which does not match, since this will catch all cases above. * * Finally, we assume the monster must be a "player ghost" (which * as noted above is impossible), which is a hack, but may prevent * crashes, even if it does induce strange behavior. */ static int borg_guess_race_name(char *who) { int k, m, n; int i, b_i = 0; int s, b_s = 0; monster_race *r_ptr; char partial[160]; int len = strlen(who); /* Start the search */ m = 0; n = borg_unique_size; /* Binary search */ while (m < n - 1) { /* Pick a "middle" entry */ i = (m + n) / 2; /* Search to the right (or here) */ if (strcmp(borg_unique_text[i], who) <= 0) { m = i; } /* Search to the left */ else { n = i; } } /* Check for equality */ if (streq(who, borg_unique_text[m])) { /* Use this monster */ return (borg_unique_what[m]); } /* Hack -- handle "offscreen" */ if (suffix(who, " (offscreen)")) { /* Remove the suffix */ strcpy(partial, who); partial[len - 12] = '\0'; who = partial; /* Message */ borg_note(format("# Handling offscreen monster (%s)", who)); } /* Assume player ghost */ if (!prefix(who, "The ")) { /* Message */ borg_note(format("# Assuming player ghost (%s) (a)", who)); /* Oops */ return (z_info->r_max-1); } /* Skip the prefix */ who += 4; /* Start the search */ m = 0; n = borg_normal_size; /* Binary search */ while (m < n - 1) { /* Pick a "middle" entry */ i = (m + n) / 2; /* Search to the right (or here) */ if (strcmp(borg_normal_text[i], who) <= 0) { m = i; } /* Search to the left */ else { n = i; } } /* Scan possibilities */ for (k = m; k >= 0; k--) { /* Stop when done */ if (!streq(who, borg_normal_text[k])) break; /* Extract the monster */ i = borg_normal_what[k]; /* Access the monster */ r_ptr = &r_info[i]; /* Basic score */ s = 1000; /* Penalize "depth miss" */ s = s - ABS(r_ptr->level - borg_skill[BI_CDEPTH]); /* Track best */ if (b_i && (s < b_s)) continue; /* Track it */ b_i = i; b_s = s; } /* Success */ if (b_i) return (b_i); /* No match found */ borg_note(format("# Assuming player ghost (%s)(b)", who)); /* Oops */ return (z_info->r_max-1); } /* * Increase the "grid danger" from lots of monsters * ################### * #54433333333333445# Each monster gives some danger. * #54433222222233445# The danger decreases as you move out. * #54433222222233445# There is no danger if the monster * #54433221112233445# does not have LOS to the grid. * #54433221@12233445# * #54433221112233445# * #54433222222233445# * #54433222222233445# * #54433333333333445# * ################### */ static void borg_fear_grid(char *who, int y, int x, int k) /* 8-8, this was uint */ { int x1=0, y1=0; borg_kill *kill; borg_grid *ag; /* Not in town */ if (borg_skill[BI_CDEPTH] == 0) return; /* In a Sea of Runes, no worry */ if (borg_morgoth_position || borg_as_position) return; /* Do not add fear in a vault -- Cheating the cave info */ if (cave_isvault(cave, y, x)) return; /* Access the grid info */ ag = &borg_grids[y][x]; kill = &borg_kills[ag->kill]; /* Level 50 borgs have greatly reduced Monster Fear */ if (borg_skill[BI_CLEVEL] == 50) k = k * 5 / 10; /* Collect "fear", spread around */ for (x1= -6; x1 <= 6; x1 ++) { for (y1= -6; y1 <= 6; y1 ++) { /* careful */ if (x+x1 <= 0 || x1+x >= AUTO_MAX_X) continue; if (y+y1 <= 0 || y1+y >= AUTO_MAX_Y) continue; /* Very Weak Fear at this range */ if (borg_los(kill->y, kill->x, y+y1, x+x1)) borg_fear_monsters[y + y1][x + x1] += (k / 8); /* Next range set */ if (x1 <= -5 || x1 >= 5) continue; if (y1 <= -5 || y1 >= 5) continue; /* Weak Fear at this range */ if (borg_los(kill->y, kill->x, y+y1, x+x1)) borg_fear_monsters[y + y1][x + x1] += (k / 5); /* Next range set */ if (x1 <= -3 || x1 >= 3) continue; if (y1 <= -3 || y1 >= 3) continue; /* Fear at this range */ if (borg_los(kill->y, kill->x, y+y1, x+x1)) borg_fear_monsters[y + y1][x + x1] += (k / 3); /* Next range set */ if (x1 <= -2 || x1 >= 2) continue; if (y1 <= -2 || y1 >= 2) continue; /* Mild Fear at this range */ if (borg_los(kill->y, kill->x, y+y1, x+x1)) borg_fear_monsters[y + y1][x + x1] += (k / 2); /* Next range set */ if (x1 <= -1 || x1 >= 1) continue; if (y1 <= -1 || y1 >= 1) continue; /* Full fear close to this monster */ if (borg_los(kill->y, kill->x, y+y1, x+x1)) borg_fear_monsters[y + y1][x + x1] += k; } } } /* * Increase the "region danger" * This is applied when the borg cannot find the source of a message. He assumes it is an * invisible monster. This will keep him from resting while unseen guys attack him. */ static void borg_fear_regional(char *who, int y, int x, int k, bool seen_guy) /* 8-8 , had been uint */ { int x0, y0, x1, x2, y1, y2; /* Do not add fear in a vault -- Cheating the cave info */ if (cave_isvault(cave, y, x)) return; /* Messages */ if (seen_guy) { borg_note(format("# Fearing region value %d.", k)); } else { borg_note(format("# Fearing region (%d,%d) value %d because of a non-LOS %s", y, x, k, who)); need_shift_panel = TRUE; } /* Current region */ y0 = (y/11); x0 = (x/11); /* Nearby regions */ y1 = (y0 > 0) ? (y0 - 1) : 0; x1 = (x0 > 0) ? (x0 - 1) : 0; y2 = (x0 < 5) ? (x0 + 1) : 5; x2 = (x0 < 17) ? (x0 + 1) : 17; /* Collect "fear", spread around */ borg_fear_region[y0][x0] += k; borg_fear_region[y0][x1] += k; borg_fear_region[y0][x2] += k; borg_fear_region[y1][x0] += k / 2; borg_fear_region[y2][x0] += k / 2; borg_fear_region[y1][x1] += k / 2; borg_fear_region[y1][x2] += k / 3; borg_fear_region[y2][x1] += k / 3; borg_fear_region[y2][x2] += k / 3; } /* * Hack -- Update a "new" monster */ static void borg_update_kill_new(int i) { int k= 0; int j= 0; int num =0; int pct; borg_kill *kill = &borg_kills[i]; monster_type *m_ptr = cave_monster(cave, cave->m_idx[kill->y][kill->x]); monster_race *r_ptr = &r_info[kill->r_idx]; /* Extract the monster speed */ kill->speed = (m_ptr->mspeed); #if 0 /* Hack -- assume optimal racial variety */ if (!(rf_has(r_ptr->flags, RF_UNIQUE))) { /* Hack -- Assume full speed bonus */ kill->speed += (extract_energy[kill->speed] / 10); } #endif /* Extract max hitpoints */ /* This is a cheat. Borg does not look * at the bar at the bottom and frankly that would take a lot of code. * It would involve targeting every monster to read their individual bar. * then keeping track of it. When the borg has telepathy this would * cripple him down and be tremendously slow. * * This cheat is not too bad. A human could draw the same info from * from the screen. * * Basically the borg is cheating the real hit points of the monster then * using that information to calculate the estimated hp of the monster. * Its the same basic tactict that we would use. * * Kill->power is used a lot in borg_danger, * for calculating damage from breath attacks. */ if (m_ptr->maxhp) { /* Cheat the "percent" of health */ pct = 100L * m_ptr->hp / ((m_ptr->maxhp > 1) ? m_ptr->maxhp : 1); } else { pct = 100; } /* Compute estimated HP based on number of * in monster health bar */ kill->power = (m_ptr->maxhp * pct) / 100; kill->injury = 100-pct; /* Extract the Level*/ kill->level = r_ptr->level; /* Some monsters never move */ if (rf_has(r_ptr->flags, RF_NEVER_MOVE)) kill->awake = TRUE; /* Cheat in the game's index of the monster. * Used in tracking monsters */ kill->m_idx = cave->m_idx[kill->y][kill->x]; /* Is it sleeping */ if (m_ptr->m_timed[MON_TMD_SLEEP] == 0) kill->awake = TRUE; else kill->awake = FALSE; /* Is it afraid */ if (m_ptr->m_timed[MON_TMD_FEAR] == 0) kill->afraid = FALSE; else kill->afraid = TRUE; /* Is it confused */ if (m_ptr->m_timed[MON_TMD_CONF] == 0) kill->confused = FALSE; else kill->confused = TRUE; /* Is it stunned*/ if (m_ptr->m_timed[MON_TMD_STUN] == 0) kill->stunned = FALSE; else kill->stunned = TRUE; /* Preload the spells from the race into this individual monster */ kill->spell_flags[0] = r_ptr->spell_flags[0]; kill->spell_flags[1] = r_ptr->spell_flags[1]; kill->spell_flags[2] = r_ptr->spell_flags[2]; /* Extract the "inate" "normal" "bizarre" spells */ for (k = 0; k < 96; k++) { if (rsf_has(r_ptr->spell_flags, k)) kill->spell[num++] = k + 32 - 1; } /* Store the number of ranged attacks */ kill->ranged_attack = num; /* We want to remember Morgy's panel */ if (kill->r_idx == 547) { j = ((kill->y - PANEL_HGT / 2) / PANEL_HGT) * PANEL_HGT; if (j < 0) j = 0; if (j > DUNGEON_HGT - SCREEN_HGT) j = DUNGEON_HGT - SCREEN_HGT; morgy_panel_y = j; j = ((kill->x - PANEL_WID / 2) / PANEL_WID) * PANEL_WID; if (j < 0) j = 0; if (j > DUNGEON_WID - SCREEN_WID) j = DUNGEON_WID - SCREEN_WID; morgy_panel_x = j; } /* Hack -- Force the monster to be sitting on a floor * grid unless that monster can pass through walls */ if (!rf_has(r_ptr->flags, RF_PASS_WALL)) { borg_grids[kill->y][kill->x].feat = FEAT_FLOOR; } /* Hack -- Force the ghostly monster to be in a wall * grid until the grid is proven to be something else */ if (rf_has(r_ptr->flags, RF_PASS_WALL)) { borg_grids[kill->y][kill->x].feat = FEAT_WALL_EXTRA; } } /* * Hack -- Update a "old" monster * * We round the player speed down, and the monster speed up, * and we assume maximum racial speed for each monster. */ static void borg_update_kill_old(int i) { int t, e; int k= 0; int num =0; int j = 0; int pct; borg_kill *kill = &borg_kills[i]; monster_type *m_ptr = cave_monster(cave, cave->m_idx[kill->y][kill->x]); monster_race *r_ptr = &r_info[kill->r_idx]; /* Extract max hitpoints */ /* Extract actual Hitpoints, this is a cheat. Borg does not look * at the bar at the bottom and frankly that would take a lot of code. * It would involve targeting every monster to read their individual bar. * then keeping track of it. When the borg has telepathy this would * cripple him down and be tremendously slow. * * This cheat is not too bad. A human could draw the same info from * from the screen. * * Basically the borg is cheating the real hit points of the monster then * using that information to calculate the estimated hp of the monster. * Its the same basic tactict that we would use. * * Kill->power is used a lot in borg_danger, * for calculating damage from breath attacks. */ if (m_ptr->maxhp) { /* Cheat the "percent" of health */ pct = 100L * m_ptr->hp / ((m_ptr->maxhp > 1) ? m_ptr->maxhp : 1); } else { pct = 100; } /* Compute estimated HP based on number of * in monster health bar */ kill->power = (m_ptr->maxhp * pct) / 100; kill->injury = 100-pct; /* Is it sleeping */ if (m_ptr->m_timed[MON_TMD_SLEEP] == 0) kill->awake = TRUE; else kill->awake = FALSE; /* Is it afraid */ if (m_ptr->m_timed[MON_TMD_FEAR] == 0) kill->afraid = FALSE; else kill->afraid = TRUE; /* Is it confused */ if (m_ptr->m_timed[MON_TMD_CONF] == 0) kill->confused = FALSE; else kill->confused = TRUE; /* Is it stunned*/ if (m_ptr->m_timed[MON_TMD_STUN] == 0) kill->stunned = FALSE; else kill->stunned = TRUE; /* Cheat in the game's index of the monster. * Used in tracking monsters */ kill->m_idx = cave->m_idx[kill->y][kill->x]; /* Extract the monster speed */ kill->speed = (m_ptr->mspeed); /* Player energy per game turn */ e = extract_energy[borg_skill[BI_SPEED]]; /* Game turns per player move */ t = (100 + (e - 1)) / e; /* Monster energy per game turn */ e = extract_energy[kill->speed]; /* Monster moves (times ten) */ kill->moves = (t * e) / 10; /* Preload the spells from the race into this individual monster */ kill->spell_flags[0] = r_ptr->spell_flags[0]; kill->spell_flags[1] = r_ptr->spell_flags[1]; kill->spell_flags[2] = r_ptr->spell_flags[2]; /* Extract the "inate" "normal" "bizarre" spells */ for (k = 0; k < 96; k++) { if (rsf_has(r_ptr->spell_flags, k)) kill->spell[num++] = k + 32 - 1; } /* Store the number of ranged attacks */ kill->ranged_attack = num; /* Special check on uniques, sometimes the death * is not caught so he thinks they are still running * around */ if ((rf_has(r_ptr->flags, RF_UNIQUE)) && r_ptr->max_num == 0) borg_race_death[i] = 1; /* We want to remember Morgy's panel */ if (kill->r_idx == 547) { j = ((kill->y - PANEL_HGT / 2) / PANEL_HGT) * PANEL_HGT; if (j < 0) j = 0; if (j > DUNGEON_HGT - SCREEN_HGT) j = DUNGEON_HGT - SCREEN_HGT; morgy_panel_y = j; j = ((kill->x - PANEL_WID / 2) / PANEL_WID) * PANEL_WID; if (j < 0) j = 0; if (j > DUNGEON_WID - SCREEN_WID) j = DUNGEON_WID - SCREEN_WID; morgy_panel_x = j; } /* Hack -- Force the monster to be sitting on a floor * grid unless that monster can pass through walls */ if (!rf_has(r_ptr->flags, RF_PASS_WALL)) { borg_grids[kill->y][kill->x].feat = FEAT_FLOOR; } /* Hack -- Force the ghostly monster to be in a wall * grid until the grid is proven to be something else */ if (rf_has(r_ptr->flags, RF_PASS_WALL)) { borg_grids[kill->y][kill->x].feat = FEAT_WALL_EXTRA; } } /* * Delete an old "kill" record */ void borg_delete_kill(int i) { borg_kill *kill = &borg_kills[i]; /* Paranoia -- Already wiped */ if (!kill->r_idx) return; /* Note */ borg_note(format("# Forgetting a monster '%s' at (%d,%d)", (r_info[kill->r_idx].name), kill->y, kill->x)); /* Clear goals if I am flowing to this monster.*/ if (goal == GOAL_KILL && borg_flow_y[0] == kill->y && borg_flow_x[0] == kill->x) goal = 0; /* Update the grids */ borg_grids[kill->y][kill->x].kill = 0; /* save a time stamp of when the last multiplier was killed */ if (rf_has(r_info[kill->r_idx].flags, RF_MULTIPLY)) when_last_kill_mult = borg_t; /* Kill the monster */ WIPE(kill, borg_kill); /* One less monster */ borg_kills_cnt--; /* Recalculate danger */ borg_danger_wipe = TRUE; } /* * Force sleep onto a "kill" record * ??? Since this check is done at update_kill should I have it here? */ static void borg_sleep_kill(int i) { borg_kill *kill = &borg_kills[i]; /* Paranoia -- Already wiped */ if (!kill->r_idx) return; /* Note */ borg_note(format("# Noting sleep on a monster '%s' at (%d,%d)", (r_info[kill->r_idx].name), kill->y, kill->x)); /* note sleep */ kill->awake = FALSE; /* Wipe flow goals */ goal = 0; /* Recalculate danger */ borg_danger_wipe = TRUE; } /* * Determine if a monster should be "viewable" */ static bool borg_follow_kill_aux(int i, int y, int x) { int d; borg_grid *ag; borg_kill *kill = &borg_kills[i]; monster_race *r_ptr = &r_info[kill->r_idx]; /* Distance to player */ d = distance(c_y, c_x, y, x); /* Too far away */ if (d > MAX_SIGHT) return (FALSE); /* Access the grid */ ag = &borg_grids[y][x]; /* Not on-screen */ if (!(ag->info & BORG_OKAY)) return (FALSE); /* Line of sight */ if (ag->info & BORG_VIEW) { /* Use "illumination" */ if (ag->info & (BORG_LIGHT | BORG_GLOW)) { /* We can see invisible */ if (borg_skill[BI_SINV] || borg_see_inv) return (TRUE); /* Monster is not invisible */ if (!(rf_has(r_ptr->flags, RF_INVISIBLE))) return (TRUE); } /* Use "infravision" */ if (d <= borg_skill[BI_INFRA]) { /* Infravision works on "warm" creatures */ if (!(rf_has(r_info->flags, RF_COLD_BLOOD))) return (TRUE); } } /* Telepathy requires "telepathy" */ if (borg_skill[BI_ESP]) { /* Telepathy fails on "strange" monsters */ if (rf_has(r_info->flags, RF_EMPTY_MIND)) return (FALSE); if (rf_has(r_info->flags, RF_WEIRD_MIND)) return (FALSE); /* Success */ return (TRUE); } /* Nope */ return (FALSE); } /* * Attempt to "follow" a missing monster * * This routine is not called when the player is blind or hallucinating. * * Currently this function is a total hack, but handles the case of only * one possible location (taking it), two adjacent possible locations * (taking the diagonal one), and three adjacent locations with the * central one being a diagonal (taking the diagonal one). * * We should perhaps handle the case of three adjacent locations with * the central one being a non-diagonal (taking the non-diagonal one). * * We should perhaps attempt to take into account "last known direction", * which would allow us to "predict" motion up to walls, and we should * perhaps attempt to take into account the "standard" flee algorithm, * though that feels a little like cheating. */ static void borg_follow_kill(int i) { int j; int x, y; int ox, oy; int dx, b_dx = 0; int dy, b_dy = 0; borg_grid *ag; borg_kill *kill = &borg_kills[i]; /* Paranoia */ if (!kill->r_idx) return; /* Old location */ ox = kill->x; oy = kill->y; /* Out of sight */ if (!borg_follow_kill_aux(i, oy, ox)) return; /* Note */ borg_note(format("# There was a monster '%s' at (%d,%d)", (r_info[kill->r_idx].name), oy, ox)); /* Prevent silliness */ if (!borg_cave_floor_bold(oy, ox)) { /* Delete the monster */ borg_delete_kill(i); /* Done */ return; } /* Prevent loops */ if (randint1(100) < 1) { /* Just delete the monster */ borg_delete_kill(i); /* Done */ return; } /* prevent overflows */ if (borg_t > 20000) { /* Just delete the monster */ borg_delete_kill(i); /* Done */ return; } /* Some never move, no reason to follow them */ if ((rf_has(r_info[kill->r_idx].flags, RF_NEVER_MOVE)) || /* Some are sleeping and don't move, no reason to follow them */ (kill->awake == FALSE)) { /* delete them if they are under me */ if (kill->y == c_y && kill->x == c_x) { borg_delete_kill(i); } /* Dont 'forget' certain ones */ return; } /* Scan locations */ for (j = 0; j < 8; j++) { /* Access offset */ dx = ddx_ddd[j]; dy = ddy_ddd[j]; /* Access location */ x = ox + dx; y = oy + dy; /* legal */ if (!cave_in_bounds_fully(cave, y,x)) continue; /* Access the grid */ ag = &borg_grids[y][x]; /* Skip known walls and doors */ if (!borg_cave_floor_grid(ag)) continue; /* Skip known monsters */ if (ag->kill) continue; /* Skip visible grids */ if (borg_follow_kill_aux(i, y, x)) continue; /* Collect the offsets */ b_dx += dx; b_dy += dy; } /* Don't go too far */ if (b_dx < -1) b_dx = -1; else if (b_dx > 1) b_dx = 1; /* Don't go too far */ if (b_dy < -1) b_dy = -1; else if (b_dy > 1) b_dy = 1; /* Access location */ x = ox + b_dx; y = oy + b_dy; /* Access the grid */ ag = &borg_grids[y][x]; /* Avoid walls and doors */ if (!borg_cave_floor_grid(ag)) { /* Just delete the monster */ borg_delete_kill(i); /* Done */ return; } /* Avoid monsters */ if (ag->kill != i) { /* Just delete the monster */ borg_delete_kill(i); /* Done */ return; } /* Delete monsters that did not really move */ if (kill->y == oy && kill->x == ox) { borg_delete_kill(i); return; } /* Update the grids */ borg_grids[kill->y][kill->x].kill = 0; /* Save the old Location */ kill->ox = ox; kill->oy = oy; /* Save the Location */ kill->x = ox + b_dx; kill->y = oy + b_dy; /* Update the grids */ borg_grids[kill->y][kill->x].kill = i; /* Note */ borg_note(format("# Following a monster '%s' to (%d,%d) from (%d,%d)", (r_info[kill->r_idx].name), kill->y, kill->x, oy, ox)); /* Recalculate danger */ borg_danger_wipe = TRUE; /* Clear goals */ if ((!borg_skill[BI_ESP] && goal == GOAL_KILL && (borg_flow_y[0] == kill->y && borg_flow_x[0] == kill->x)) || (goal == GOAL_TAKE && borg_munchkin_mode)) goal = 0; } /* * Obtain a new "kill" index */ static int borg_new_kill(int r_idx, int y, int x) { int i, n = -1; borg_kill *kill; borg_grid *ag; monster_race *r_ptr; /* Look for a "dead" monster */ for (i = 1; (n < 0) && (i < borg_kills_nxt); i++) { /* Skip real entries */ if (!borg_kills[i].r_idx) n = i; } /* Allocate a new monster */ if ((n < 0) && (borg_kills_nxt < 255)) { /* Acquire the entry, advance */ n = borg_kills_nxt++; } /* Hack -- steal an old monster */ if (n < 0) { /* Note */ borg_note("# Too many monsters"); /* Hack -- Pick a random monster */ n = randint1(borg_kills_nxt-1) + 1; /* Kill it */ borg_delete_kill(n); } /* Count the monsters */ borg_kills_cnt++; /* Access the monster */ kill = &borg_kills[n]; r_ptr = &r_info[kill->r_idx]; ag = &borg_grids[y][x]; /* Save the race */ kill->r_idx = r_idx; /* Location */ kill->ox = kill->x = x; kill->oy = kill->y = y; /* Games Index of the monster */ kill->m_idx = cave->m_idx[y][x]; /* Update the grids */ borg_grids[kill->y][kill->x].kill = n; /* Timestamp */ kill->when = borg_t; /* Mark the Morgoth time stamp if needed */ if (kill->r_idx == 547) borg_t_morgoth = borg_t; /* Update the monster */ borg_update_kill_new(n); /* Update the monster */ borg_update_kill_old(n); /* Note (r_info[kill->r_idx].name)*/ borg_note(format("# Creating a monster '%s' at (%d,%d), HP: %d, Time: %d, Index: %d", (r_info[kill->r_idx].name), kill->y, kill->x, kill->power, kill->when, kill->r_idx)); /* Recalculate danger */ borg_danger_wipe = TRUE; /* Remove Regional Fear which may have been induced from a non-LOS monster. * We assume this newly created monster is the one which induced our Regional * Fear. If it wasn't, then the borg will create new Regional Fear next time * the unseen monster attacks. There is no harm done by clearing these. * At most, he may end up resting in an area for 1 turn */ if (borg_t < need_see_inviso + 5) { int y0,x0,y1,x1,y2,x2; y0 = (c_y/11); x0 = (c_x/11); /* Nearby regions */ y1 = (y0 > 0) ? (y0 - 1) : 0; x1 = (x0 > 0) ? (x0 - 1) : 0; y2 = (x0 < 5) ? (x0 + 1) : 5; x2 = (x0 < 17) ? (x0 + 1) : 17; /* Remove "fear", spread around */ borg_fear_region[y0][x0] = 0; borg_fear_region[y0][x1] = 0; borg_fear_region[y0][x2] = 0; borg_fear_region[y1][x0] = 0; borg_fear_region[y2][x0] = 0; borg_fear_region[y1][x1] = 0; borg_fear_region[y1][x2] = 0; borg_fear_region[y2][x1] = 0; borg_fear_region[y2][x2] = 0; borg_note(format("# Removing Regional Fear (%d,%d) because of a LOS %s", y, x, r_info[kill->r_idx].name)); } /* Wipe goals only if I have some light source */ if (borg_skill[BI_CURLITE] && borg_los(kill->y, kill->x, c_y, c_x)) goal = 0; /* Hack -- Force the monster to be sitting on a floor * grid unless that monster can pass through walls */ if (!(rf_has(r_ptr->flags, RF_PASS_WALL))) { ag->feat = FEAT_FLOOR; } /* Hack -- Force the ghostly monster to be in a wall * grid until the grid is proven to be something else */ if (rf_has(r_ptr->flags, RF_PASS_WALL)) { ag->feat = FEAT_WALL_EXTRA; } /* Count up out list of Nasties */ for (i = 0; i < borg_nasties_num; i++) { /* Count them up */ if (r_info[kill->r_idx].d_char == borg_nasties[i]) borg_nasties_count[i] ++; } /* Return the monster */ return (n); } /* * Attempt to notice a changing "kill" */ static bool observe_kill_diff(int y, int x, byte a, wchar_t c) { int i, r_idx; borg_kill *kill; /* Guess the race */ r_idx = borg_guess_race(a, c, FALSE, y ,x); /* Oops */ if (!r_idx || r_idx < 0) return (FALSE); /* no new monsters if hallucinations */ if (borg_skill[BI_ISIMAGE]) return (FALSE); /* Create a new monster */ i = borg_new_kill(r_idx, y, x); /* Get the object */ kill = &borg_kills[i]; /* Timestamp */ kill->when = borg_t; /* Mark the Morgoth time stamp if needed */ if (kill->r_idx == 547) borg_t_morgoth = borg_t; /* Done */ return (TRUE); } /* * Attempt to "track" a "kill" at the given location * Assume that the monster moved at most 'd' grids. * If "flag" is TRUE, allow monster "conversion" */ static bool observe_kill_move(int y, int x, int d, byte a, wchar_t c, bool flag) { int i, z, ox, oy; int r_idx; borg_kill *kill; monster_race *r_ptr; bool flicker = FALSE; /* Look at the monsters */ for (i = 1; i < borg_kills_nxt; i++) { kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Skip assigned monsters */ if (kill->seen) continue; /* Old location */ ox = kill->x; oy = kill->y; /* Calculate distance */ z = distance(oy, ox, y, x); /* Access the monster race */ r_ptr = &r_info[kill->r_idx]; /* Double the distance for uniques so the borg does not create 2 of the same unique * monster on the level */ if (rf_has(r_ptr->flags, RF_UNIQUE)) d = d * 2; /* Verify distance */ if (z > d) continue; /* Verify that we are looking at the right one */ if (kill->m_idx != cave->m_idx[y][x]) continue; /* Verify "reasonable" motion, if allowed */ if (!flag && (z > (kill->moves / 10) + 1)) continue; /* Verify matching char so long as not hallucinating */ if (!borg_skill[BI_ISIMAGE] && c != r_ptr->d_char) continue; /* Verify matching attr so long as not hallucinating */ if (a != r_ptr->d_attr || borg_skill[BI_ISIMAGE]) { /* Require matching attr (for normal monsters) */ if (!rf_has(r_ptr->flags, RF_ATTR_MULTI) && !rf_has(r_ptr->flags, RF_ATTR_CLEAR)) { /* Require flag */ if (!flag) continue; /* Never flicker known monsters */ if (kill->known) continue; /* Find a multi-hued monster */ r_idx = borg_guess_race(a, c, TRUE, y , x); /* Handle failure */ if (r_idx == z_info->r_max - 1) continue; /* Note */ borg_note(format("# Flickering monster '%s' at (%d,%d)", (r_info[r_idx].name), y, x)); /* Note */ borg_note(format("# Converting a monster '%s' at (%d,%d)", (r_info[kill->r_idx].name), kill->y, kill->x)); /* Change the race */ kill->r_idx = r_idx; /* Monster flickers */ flicker = TRUE; /* Recalculate danger */ borg_danger_wipe = TRUE; /* Clear monster flow goals */ goal = 0; } } /* Actual movement */ if (z) { /* Update the grids */ borg_grids[kill->y][kill->x].kill = 0; /* Save the old Location */ kill->ox = kill->x; kill->oy = kill->y; /* Save the Location */ kill->x = x; kill->y = y; /* Update the grids */ borg_grids[kill->y][kill->x].kill = i; /* Note */ borg_note(format("# Tracking a monster '%s' at (%d,%d) from (%d,%d)", (r_ptr->name), kill->y, kill->x, ox, oy)); /* Recalculate danger */ borg_danger_wipe = TRUE; /* Clear goals */ if ((!borg_skill[BI_ESP] && goal == GOAL_KILL && (borg_flow_y[0] == kill->y && borg_flow_x[0] == kill->x)) || (goal == GOAL_TAKE && borg_munchkin_mode)) goal = 0; } /* Note when last seen */ kill->when = borg_t; /* Mark the Morgoth time stamp if needed */ if (kill->r_idx == 547) borg_t_morgoth = borg_t; /* Monster flickered */ if (flicker) { /* Update the monster */ borg_update_kill_new(i); } /* Update the monster */ borg_update_kill_old(i); /* Mark as seen */ kill->seen = TRUE; /* Done */ return (TRUE); } /* Oops */ return (FALSE); } /* * Calculate base danger from a spell attack by an invisible monster * * We attempt to take account of various resistances, both in * terms of actual damage, and special effects, as appropriate. */ static int borg_fear_spell(int i) { int z = 0; int p = 0; int ouch = 0; /* Damage taken */ if (borg_oldchp > borg_skill[BI_CURHP]) ouch = (borg_oldchp - borg_skill[BI_CURHP]) * 2; /* Check the spell */ switch (i) { case 0: /* RF4_SHRIEK */ p += 10; /* If low level borg. Get off the level now. */ if (borg_skill[BI_CLEVEL] <= 5) goal_fleeing = goal_leaving = TRUE; break; case 1: /* RF4_FAILED spell by monster. Fear it! */ /* It could be a unique like Azriel */ p += borg_skill[BI_CDEPTH]; break; case 2: /* RF4_XXX3X4 */ break; case 3: /* RF4_XXX4X4 */ break; case 4: /* RF4_ARROW_1 */ z = (1 * 6); break; case 5: /* RF4_ARROW_2 */ z = (3 * 6); break; case 6: /* RF4_ARROW_3 */ z = (5 * 6); break; case 7: /* RF4_ARROW_4 */ z = (7 * 6); break; case 8: /* RF4_BR_ACID */ if (borg_skill[BI_IACID]) break; z = ouch; p += 40; break; case 9: /* RF4_BR_ELEC */ if (borg_skill[BI_IELEC]) break; z = ouch; p += 20; break; case 10: /* RF4_BR_FIRE */ if (borg_skill[BI_IFIRE]) break; z = ouch; p += 40; break; case 11: /* RF4_BR_COLD */ if (borg_skill[BI_ICOLD]) break; z = ouch; p += 20; break; case 12: /* RF4_BR_POIS */ z = ouch; if (borg_skill[BI_RPOIS]) break; if (borg_skill[BI_TRPOIS]) break; p += 20; break; case 13: /* RF4_BR_NETH */ z = ouch + 100; if (borg_skill[BI_RNTHR]) break; p += 50; if (borg_skill[BI_HLIFE]) break; /* do not worry about drain exp after level 50 */ if (borg_skill[BI_CLEVEL] >= 50) break; p += 150; break; case 14: /* RF4_BR_LIGHT */ z = ouch; if (borg_skill[BI_RLITE]) break; if (borg_skill[BI_RBLIND]) break; p += 20; break; case 15: /* RF4_BR_DARK */ z = ouch; if (borg_skill[BI_RDARK]) break; if (borg_skill[BI_RBLIND]) break; p += 20; break; case 16: /* RF4_BR_CONF */ z = ouch; if (borg_skill[BI_RCONF]) break; p += 100; break; case 17: /* RF4_BR_SOUN */ z = ouch; if (borg_skill[BI_RSND]) break; p += 50; break; case 18: /* RF4_BR_CHAO */ z = ouch; if (borg_skill[BI_RKAOS]) break; p += 200; if (!borg_skill[BI_RNTHR]) p += 50; if (!borg_skill[BI_HLIFE]) p += 50; if (!borg_skill[BI_RCONF]) p += 50; if (borg_skill[BI_CLEVEL] == 50) break; p += 100; break; case 19: /* RF4_BR_DISE */ z = ouch; if (borg_skill[BI_RDIS]) break; p += 500; break; case 20: /* RF4_BR_NEXU */ z = ouch; if (borg_skill[BI_RNXUS]) break; p += 100; break; case 21: /* RF4_BR_TIME */ z = ouch; p += 200; break; case 22: /* RF4_BR_INER */ z = ouch; p += 50; break; case 23: /* RF4_BR_GRAV */ z = ouch; p += 50; if (borg_skill[BI_RSND]) break; p += 50; break; case 24: /* RF4_BR_SHAR */ z = ouch; if (borg_skill[BI_RSHRD]) break; p += 50; break; case 25: /* RF4_BR_PLAS */ z = ouch; if (borg_skill[BI_RSND]) break; p += 50; break; case 26: /* RF4_BR_WALL */ z = ouch; if (borg_skill[BI_RSND]) break; p += 50; break; case 27: /* RF4_BR_MANA */ /* XXX XXX XXX */ break; case 28: /* RF4_XXX5X4 */ break; case 29: /* RF4_XXX6X4 */ break; case 30: /* RF4_XXX7X4 */ break; case 31: /* RF4_BOULDER */ z = ouch; p +=40; break; case 32: /* RF5_BA_ACID */ if (borg_skill[BI_IACID]) break; z = ouch; p += 40; break; case 33: /* RF5_BA_ELEC */ if (borg_skill[BI_IELEC]) break; z = ouch; p += 20; break; case 34: /* RF5_BA_FIRE */ if (borg_skill[BI_IFIRE]) break; z = ouch; p += 40; break; case 35: /* RF5_BA_COLD */ if (borg_skill[BI_ICOLD]) break; z = ouch; p += 20; break; case 36: /* RF5_BA_POIS */ z = ouch; if (borg_skill[BI_RPOIS]) break; p += 20; break; case 37: /* RF5_BA_NETH */ z = ouch + 100; if (borg_skill[BI_RNTHR]) break; p += 300; break; case 38: /* RF5_BA_WATE */ z = ouch; p += 50; break; case 39: /* RF5_BA_MANA */ z = ouch; break; case 40: /* RF5_BA_DARK */ z = ouch; if (borg_skill[BI_RDARK]) break; if (borg_skill[BI_RBLIND]) break; p += 20; break; case 41: /* RF5_DRAIN_MANA */ if (borg_skill[BI_MAXSP]) p += 10; break; case 42: /* RF5_MIND_BLAST */ z = 20; break; case 43: /* RF5_BRAIN_SMASH */ z = (12 * 15); p += 100; break; case 44: /* RF5_CAUSE_1 */ z = (3 * 8); break; case 45: /* RF5_CAUSE_2 */ z = (8 * 8); break; case 46: /* RF5_CAUSE_3 */ z = (10 * 15); break; case 47: /* RF5_CAUSE_4 */ z = (15 * 15); p += 50; break; case 48: /* RF5_BO_ACID */ if (borg_skill[BI_IACID]) break; z = ouch; p += 40; break; case 49: /* RF5_BO_ELEC */ if (borg_skill[BI_IELEC]) break; z = ouch; p += 20; break; case 50: /* RF5_BO_FIRE */ if (borg_skill[BI_IFIRE]) break; z = ouch; p += 40; break; case 51: /* RF5_BO_COLD */ if (borg_skill[BI_ICOLD]) break; z = ouch; p += 20; break; case 52: /* RF5_BO_POIS */ /* XXX XXX XXX */ break; case 53: /* RF5_BO_NETH */ z = ouch + 100; if (borg_skill[BI_RNTHR]) break; p += 200; break; case 54: /* RF5_BO_WATE */ z = ouch; p += 20; break; case 55: /* RF5_BO_MANA */ z = ouch; break; case 56: /* RF5_BO_PLAS */ z = ouch; p += 20; break; case 57: /* RF5_BO_ICEE */ z = ouch; p += 20; break; case 58: /* RF5_MISSILE */ z = ouch; break; case 59: /* RF5_SCARE */ p += 10; break; case 60: /* RF5_BLIND */ p += 10; break; case 61: /* RF5_CONF */ p += 10; break; case 62: /* RF5_SLOW */ p += 5; break; case 63: /* RF5_HOLD */ p += 20; break; case 64: /* RF6_HASTE */ p += 10+ borg_skill[BI_CDEPTH]; break; case 65: /* RF6_XXX1X6 */ break; case 66: /* RF6_HEAL */ p += 10; break; case 67: /* RF6_XXX2X6 */ break; case 68: /* RF6_XXX3X6 */ break; case 69: /* RF6_XXX4X6 */ break; case 70: /* RF6_TELE_TO */ p += 20 + borg_skill[BI_CDEPTH]; break; case 71: /* RF6_TELE_AWAY */ p += 10; break; case 72: /* RF6_TELE_LEVEL */ p += 50; break; case 73: /* RF6_XXX5 */ break; case 74: /* RF6_DARKNESS */ break; case 75: /* RF6_TRAPS */ p += 50; break; case 76: /* RF6_FORGET */ /* if you are a spell caster, this is very scary.*/ if (borg_skill[BI_CURSP] > 10) p += 500; else p += 30; break; case 77: /* RF6_XXX6X6 */ break; case 78: /* RF6_XXX7X6 */ break; case 79: /* RF6_XXX8X6 */ break; /* Summoning is only as dangerious as the monster that is */ /* attually summoned. This helps borgs kill summoners */ case 80: /* RF6_S_MONSTER */ p +=55; break; case 81: /* RF6_S_MONSTERS */ p += 30; break; case 82: /* RF6_S_ANIMAL */ p +=15; break; case 83: /* RF6_S_SPIDER */ p +=25; break; case 84: /* RF6_S_HOUND */ p +=45; break; case 85: /* RF6_S_HYDRA */ p += 70; break; case 86: /* RF6_S_ANGEL */ p += 80; break; case 87: /* RF6_S_DEMON */ p += 80; break; case 88: /* RF6_S_UNDEAD */ p += 80; break; case 89: /* RF6_S_DRAGON */ p += 80; break; case 90: /* RF6_S_HI_UNDEAD */ p += 95; break; case 91: /* RF6_S_HI_DRAGON */ p += 95; break; case 92: /* RF6_S_WRAITH */ p += 95; break; case 93: /* RF6_S_UNIQUE */ p += 50; break; } /* Things which hurt us alot need to be a concern */ if (ouch >= borg_skill[BI_CURHP] / 2) ouch = ouch * 2; /* Notice damage */ return (p + z + (borg_skill[BI_CDEPTH] * 2)); } /* * Attempt to locate a monster which could explain a message involving * the given monster name, near the given location, up to the given * distance from the given location. * * Invisible monsters, bizarre monsters, and unexplainable monsters are * all treated the same way, and should eventually contribute some amount * of basic "fear" to the current region. * * First, we attempt to convert "similar" objects into the desired monster, * then we attempt to convert "similar" monsters into the desired monster, * then we attempt to match an existing monster, and finally, we give up. * * XXX XXX XXX Hack -- To prevent fatal situations, every time we think * there may be a monster nearby, we look for a nearby object which could * be the indicated monster, and convert it into that monster. This allows * us to correctly handle a room full of multiplying clear mushrooms. * * XXX XXX XXX When surrounded by multiple monsters of the same type, * we will ascribe most messages to one of those monsters, and ignore * the existance of all the other similar monsters. * * XXX XXX XXX Currently, confusion may cause messages to be ignored. */ static int borg_locate_kill(char *who, int y, int x, int r) { int i, d, r_idx; int b_i, b_d; borg_take *take; borg_kill *kill; object_kind *k_ptr; monster_race *r_ptr; /* Handle invisible monsters */ if (streq(who, "It") || streq(who, "Someone") || streq(who, "Something")) { /* Note */ borg_note("# Invisible monster nearby."); /* if I can, cast detect inviso--time stamp it * We stamp it now if we can, or later if we just did the spell * That way we dont loop casting the spell. */ /* detect invis spell not working right, for now just shift panel * and cast a light beam if in a hallway and we have see_inv*/ if (need_see_inviso < (borg_t)) { need_see_inviso = (borg_t); } /* Ignore */ return (0); } /* Handle offsreen monsters */ if (suffix(who, " (offscreen)")) { /* Note */ borg_note("# Offscreen monster nearby"); /* Shift the panel */ need_shift_panel = TRUE; /* Ignore */ return (0); } /* Guess the monster race */ r_idx = borg_guess_race_name(who); /* Access the monster race */ r_ptr = &r_info[r_idx]; /* Note */ if (borg_verbose) borg_note(format("# There is a monster '%s' within %d grids of %d,%d", (r_ptr->name), r, y, x)); /* Hack -- count racial appearances */ if (borg_race_count[r_idx] < MAX_SHORT) borg_race_count[r_idx]++; /* Handle trappers and lurkers and mimics */ if (rf_has(r_ptr->flags, RF_CHAR_CLEAR)) { /* Note */ borg_note("# Bizarre monster nearby"); } /*** Hack -- Find a similar object ***/ /* Nothing yet */ b_i = -1; b_d = 999; /* Scan the objects */ for (i = 1; i < borg_takes_nxt; i++) { take = &borg_takes[i]; /* Skip "dead" objects */ if (!take->kind) continue; /* Access kind */ k_ptr = take->kind; /* Verify char */ if (k_ptr->d_char != r_ptr->d_char) continue; /* Verify attr (unless clear or multi-hued) */ if (!rf_has(r_ptr->flags, RF_ATTR_MULTI) && !rf_has(r_ptr->flags, RF_ATTR_CLEAR)) { /* Verify attr (unless flavored) */ if (!(k_ptr->flavor)) { /* Verify attr */ if (k_ptr->d_attr != r_ptr->d_attr) continue; } } /* Calculate distance */ d = distance(take->y, take->x, y, x); /* Skip "wrong" objects */ if (d > r) continue; /* Track closest one */ if (d > b_d) continue; /* Track it */ b_i = i; b_d = d; } /* Found one */ if (b_i >= 0) { take = &borg_takes[b_i]; /* Note */ borg_note(format("# Converting an object '%s' at (%d,%d)", (take->kind->name), take->y, take->x)); /* Save location */ x = take->x; y = take->y; /* Delete the object */ borg_delete_take(b_i); /* Make a new monster */ b_i = borg_new_kill(r_idx, y, x); /* Get the monster */ kill = &borg_kills[b_i]; /* Timestamp */ kill->when = borg_t; /* Mark the Morgoth time stamp if needed */ if (kill->r_idx == 547) borg_t_morgoth = borg_t; /* Known identity */ if (!r) kill->known = TRUE; /* Return the index */ return (b_i); } /*** Hack -- Find a similar monster ***/ /* Nothing yet */ b_i = -1; b_d = 999; /* Scan the monsters */ for (i = 1; i < borg_kills_nxt; i++) { kill = &borg_kills[i]; /* Skip "dead" monsters */ if (!kill->r_idx) continue; /* Skip "matching" monsters */ if (kill->r_idx == r_idx) continue; /* Verify char */ if (r_info[kill->r_idx].d_char != r_ptr->d_char) continue; /* Verify attr (unless clear or multi-hued) */ if (!rf_has(r_ptr->flags, RF_ATTR_MULTI) && !rf_has(r_ptr->flags, RF_ATTR_CLEAR)) { /* Verify attr */ if (r_info[kill->r_idx].d_attr != r_ptr->d_attr) continue; } /* Distance away */ d = distance(kill->y, kill->x, y, x); /* Check distance */ if (d > r) continue; /* Track closest one */ if (d > b_d) continue; /* Track it */ b_i = i; b_d = d; } /* Found one */ if (b_i >= 0) { kill = &borg_kills[b_i]; /* Note */ borg_note(format("# Converting a monster '%s' at (%d,%d)", (r_info[kill->r_idx].name), kill->y, kill->x)); /* Change the race */ kill->r_idx = r_idx; /* Update the monster */ borg_update_kill_new(b_i); /* Update the monster */ borg_update_kill_old(b_i); /* Known identity */ if (!r) kill->known = TRUE; /* Recalculate danger */ borg_danger_wipe = TRUE; /* Clear goals */ goal = 0; /* Index */ return (b_i); } /*** Hack -- Find an existing monster ***/ /* Nothing yet */ b_i = -1; b_d = 999; /* Scan the monsters */ for (i = 1; i < borg_kills_nxt; i++) { kill = &borg_kills[i]; /* Skip "dead" monsters */ if (!kill->r_idx) continue; /* Skip "different" monsters */ if (kill->r_idx != r_idx) continue; /* Distance away */ d = distance(kill->y, kill->x, y, x); /* Check distance */ if (d > r+3) continue; /* Hopefully this will add fear to our grid */ if (!borg_projectable(kill->y,kill->x,y,x)) continue; /* Track closest one */ if (d > b_d) continue; /* Track it */ b_i = i; b_d = d; } /*** Hack -- Find an existing monster Last Chance ***/ /* Note: * There can be some problems with monsters that use melee * attack. The range (r) will be 1. But the known monster * may be a few paces further and moved closely and attacked * in the same round. If this is the case, we miss them the * first pass then end up Ignoring them. */ if (b_i == -1) { /* Nothing yet */ b_i = -1; b_d = 999; /* Scan the monsters */ for (i = 1; i < borg_kills_nxt; i++) { kill = &borg_kills[i]; /* Skip "dead" monsters */ if (!kill->r_idx) continue; /* Skip "different" monsters */ if (kill->r_idx != r_idx) continue; /* Distance away */ d = distance(kill->y, kill->x, y, x); /* Check distance */ /* Note: * There can be some problems with monsters that use melee * attack. The range (r) will be 1. But the known monster * may be a few paces further and moved closely and attacked * in the same round. If this is the case, we miss them the * first pass then end up Ignoring them. * We extend the range of the search*/ if (d > r + 20) continue; /* Track closest one */ if (d > b_d) continue; /* Track it */ b_i = i; b_d = d; } } /* Found one */ if (b_i >= 0) { kill = &borg_kills[b_i]; /* Note */ if (borg_verbose) borg_note(format("# Matched a monster '%s' at (%d,%d) for the parsed msg.", (r_info[kill->r_idx].name), kill->y, kill->x)); /* Known identity */ if (!r) kill->known = TRUE; /* Index */ return (b_i); } /*** Oops ***/ /* Note */ if (borg_verbose) borg_note(format("# Unable to locate monster '%s' near (%d,%d), which generated the msg (%s).", (r_ptr->name), y, x, who)); /* Oops */ /* this is the case where we know the name of the monster */ /* but cannot locate it on the monster list. */ return (-1); } /* * Notice the "death" of a monster */ static void borg_count_death(int i) { int r_idx; borg_kill *kill = &borg_kills[i]; /* Access race */ r_idx = kill->r_idx; /* Hack -- count racial deaths */ if (borg_race_death[r_idx] < MAX_SHORT) borg_race_death[r_idx]++; /* if it was a unique then remove the unique_on_level flag */ if (rf_has(r_info[kill->r_idx].flags, RF_UNIQUE)) unique_on_level = 0; } /* * Handle "detection" spells and "call lite" * * Note that we must use the "old" player location */ static bool borg_handle_self(char *str) { int i; int q_x, q_y; int y,x; /* Extract panel */ q_x = o_w_x / PANEL_WID; q_y = o_w_y / PANEL_HGT; /* Handle failure */ if (borg_failure) { borg_note("# Something failed"); } /* Handle "call lite" */ else if (prefix(str, "lite")) { /* Message */ borg_note(format("# Called lite at (%d,%d)", o_c_y, o_c_x)); /* If not holding a lite, then glow adjacent grids */ if (!borg_skill[BI_CURLITE]) { /* Scan the "local" grids (5x5) 2 same as torch grid * The spells do some goofy radius thing. */ for (y = c_y - 1; y <= c_y + 1; y++) { /* Scan the "local" grids (5x5) */ for (x = c_x - 1; x <= c_x + 1; x++) { /* Get the grid */ borg_grid *ag = &borg_grids[y][x]; /* Mark as perma-lit */ ag->info |= BORG_GLOW; /* Mark as not dark */ ag->info &= ~BORG_DARK; } } } /* Hack -- convert torch-lit grids to perma-lit grids */ for (i = 0; i < borg_LIGHT_n; i++) { int x = borg_LIGHT_x[i]; int y = borg_LIGHT_y[i]; /* Get the grid */ borg_grid *ag = &borg_grids[y][x]; /* Mark as perma-lit */ ag->info |= BORG_GLOW; /* Mark as not dark */ ag->info &= ~BORG_DARK; } } /* Handle "detect walls" */ else if (prefix(str, "wall")) { /* Message */ borg_note(format("# Detected walls (%d,%d to %d,%d)", q_y, q_x, q_y+1, q_x+1)); /* Mark detected walls */ borg_detect_wall[q_y+0][q_x+0] = TRUE; borg_detect_wall[q_y+0][q_x+1] = TRUE; borg_detect_wall[q_y+1][q_x+0] = TRUE; borg_detect_wall[q_y+1][q_x+1] = TRUE; } /* Handle "detect traps" */ else if (prefix(str, "trap")) { /* Message */ borg_note(format("# Detected traps (%d,%d to %d,%d)", q_y, q_x, q_y+1, q_x+1)); /* Mark detected traps */ borg_detect_trap[q_y+0][q_x+0] = TRUE; borg_detect_trap[q_y+0][q_x+1] = TRUE; borg_detect_trap[q_y+1][q_x+0] = TRUE; borg_detect_trap[q_y+1][q_x+1] = TRUE; } /* Handle "detect doors" */ else if (prefix(str, "door")) { /* Message */ borg_note(format("# Detected doors (%d,%d to %d,%d)", q_y, q_x, q_y+1, q_x+1)); /* Mark detected doors */ borg_detect_door[q_y+0][q_x+0] = TRUE; borg_detect_door[q_y+0][q_x+1] = TRUE; borg_detect_door[q_y+1][q_x+0] = TRUE; borg_detect_door[q_y+1][q_x+1] = TRUE; } /* Handle "detect traps and doors" */ else if (prefix(str, "both")) { /* Message */ borg_note(format("# Detected traps and doors (%d,%d to %d,%d)", q_y, q_x, q_y+1, q_x+1)); /* Mark detected traps */ borg_detect_trap[q_y+0][q_x+0] = TRUE; borg_detect_trap[q_y+0][q_x+1] = TRUE; borg_detect_trap[q_y+1][q_x+0] = TRUE; borg_detect_trap[q_y+1][q_x+1] = TRUE; /* Mark detected doors */ borg_detect_door[q_y+0][q_x+0] = TRUE; borg_detect_door[q_y+0][q_x+1] = TRUE; borg_detect_door[q_y+1][q_x+0] = TRUE; borg_detect_door[q_y+1][q_x+1] = TRUE; } /* Handle "detect traps and doors and evil" */ else if (prefix(str, "TDE")) { /* Message */ borg_note(format("# Detected traps, doors & evil (%d,%d to %d,%d)", q_y, q_x, q_y+1, q_x+1)); /* Mark detected traps */ borg_detect_trap[q_y+0][q_x+0] = TRUE; borg_detect_trap[q_y+0][q_x+1] = TRUE; borg_detect_trap[q_y+1][q_x+0] = TRUE; borg_detect_trap[q_y+1][q_x+1] = TRUE; /* Mark detected doors */ borg_detect_door[q_y+0][q_x+0] = TRUE; borg_detect_door[q_y+0][q_x+1] = TRUE; borg_detect_door[q_y+1][q_x+0] = TRUE; borg_detect_door[q_y+1][q_x+1] = TRUE; /* Mark detected evil */ borg_detect_evil[q_y+0][q_x+0] = TRUE; borg_detect_evil[q_y+0][q_x+1] = TRUE; borg_detect_evil[q_y+1][q_x+0] = TRUE; borg_detect_evil[q_y+1][q_x+1] = TRUE; } /* Handle "detect evil" */ else if (prefix(str, "evil")) { /* Message */ borg_note(format("# Detected evil (%d,%d to %d,%d)", q_y, q_x, q_y+1, q_x+1)); /* Mark detected evil */ borg_detect_evil[q_y+0][q_x+0] = TRUE; borg_detect_evil[q_y+0][q_x+1] = TRUE; borg_detect_evil[q_y+1][q_x+0] = TRUE; borg_detect_evil[q_y+1][q_x+1] = TRUE; } /* Done */ return (TRUE); } /* * Update the Borg based on the current "map" */ static void borg_forget_map(void) { int x, y; borg_grid *ag; /* Clean up the grids */ for (y = 0; y < AUTO_MAX_Y; y++) { for (x = 0; x < AUTO_MAX_X; x++) { /* Access the grid */ ag = &borg_grids[y][x]; /* Wipe it */ WIPE(ag, borg_grid); /* Lay down the outer walls */ ag->feat = FEAT_PERM_SOLID; } } /* Clean up the grids */ for (y = 1; y < AUTO_MAX_Y-1; y++) { for (x = 1; x < AUTO_MAX_X-1; x++) { /* Access the grid */ ag = &borg_grids[y][x]; /* Forget the contents */ ag->feat = FEAT_NONE; /* Hack -- prepare the town */ if (!borg_skill[BI_CDEPTH]) ag->feat = FEAT_FLOOR; } } /* Reset "borg_data_cost" */ COPY(borg_data_cost, borg_data_hard, borg_data); /* Reset "borg_data_flow" */ COPY(borg_data_flow, borg_data_hard, borg_data); /* Clear "borg_data_know" */ WIPE(borg_data_know, borg_data); /* Clear "borg_data_icky" */ WIPE(borg_data_icky, borg_data); /* Forget the view */ borg_forget_view(); } /* * Update the "map" based on visual info on the screen * * Note that we make assumptions about the grid under the player, * to prevent painful situations such as seeming to be standing * in a wall, or on a trap, etc. * * In general, we use the same "feat" codes as the game itself, but * sometimes we are just guessing (as with "visible traps"), and we * use some special codes, explained below. * * Note that we use the "feat" code of "FEAT_NONE" for grids which * have never been seen, or which, when seen, have always contained * an object or monster. These grids are probably walls, unless * they contain a monster or object, in which case they are probably * floors, unless they contain a monster which passes through walls, * in which case they are probably walls. * * Note that we use the "feat" code of "FEAT_FLOOR" for grids which * were a normal floor last time we checked. These grids may have * changed into non-floor grids recently (via earthquake?), unless * the grid is on the current panel, and is currently "lit" in some * manner, and does not contain a monster. * * Note that we use the "feat" code of "FEAT_INVIS" for grids which * once contained a wall/door, but then contained a monster or object. * These grids are probably floors, unless the grid contains a monster * which can pass through walls, in which case note that missiles and * spells may not affect a monster in the grid. * * Note that we use the other "feat" codes for grids which probably * contain the given feature type, unless several feature types use * the same symbol, in which case we use some "default" code, changing * our guess when messages provide us with more information. This is * especially necessary for distinguishing magma from quartz, and for * distinguishing normal doors from locked doors from jammed doors. * Note that most "feat" codes, even if they are not "guesses", may * not be valid unless the grid is on the current panel. * * We use the "BORG_MARK" flag to mark a grid as having been "observed", * though this may or may not indicate that the "feature" code is known, * since observations of monsters or objects via telepathy and/or remote * detection may trigger this flag. * * We use the "BORG_OKAY" flag to mark a grid as being on the current * panel, which is used for various things, including verifying that * a grid can be used as the destination of a target, and to allow us * to assume that off-panel monsters are not "visible". * * Note the "interesting" code used to learn which floor grids are "dark" * and which are "perma-lit", by tracking those floor grids which appear * to be "lit", and then marking all of these grids which do not appear * to be lit by the torch as "known" to be illuminated, and by marking * any grids which "disappear" or which are displayed as "dark floors" * as "known" to be "dark". This leaves many grids, especially those * lit by the torch, as being neither lit nor dark. * * The basic problem is that, especially with no special options set, * the player has very little direct information about which grids * are perma-lit, since all non-floor grids are memorized when they * are seen, and torch-lit floor grids look just like perma-lit * floor grids. Also, monsters hide any object or feature in their * grid, and objects hide any feature in their grid, and objects are * memorized when they are seen, and monsters can be detected by a * variety of methods, including infravision and telepathy. * * So we ignore most non-floor grids, and we mark any floor grids which * are "known" to be perma-lit as "BORG_GLOW", and any which are "known" * to be dark as "BORG_DARK". These flags are used for many purposes, * most importantly, to determine when "call lite" would be useful, and * to help determine when a monster is standing in a viewable perma-lit * grid, and should thus be "visible", and to determine when the player * has "lite", even though his torch has gone out. * * When a "call lite" spell succeeds, we mark the grids around the * player as "BORG_GLOW" and not "BORG_DARK", but we do not attempt * to "spread" the lite to the entire room, since, in general, it is * not possible to know what grids are in the "room". * * Note that we assume that normally, when the player steps onto * something, it disappears, and turns into a normal floor, unless * the player is stepping onto a grid which is normally "permanent" * (floors, stairs, store doors), in which case it does not change. * * Note that when we encounter a grid which blocks motion, but which * was previously thought to not block motion, we must be sure to * remove it from any "flow" which might be in progress, to prevent * nasty situations in which we attempt to flow into a wall grid * which was thought to be something else, like an unknown grid. * */ static void borg_update_map(void) { int i, x, y, dx, dy; borg_grid *ag; grid_data g; /* Analyze the current map panel */ for (dy = 0; dy < SCREEN_HGT; dy++) { /* Scan the row */ for (dx = 0; dx < SCREEN_WID; dx++) { bool old_wall; bool new_wall; /* Obtain the map location */ x = w_x + dx; y = w_y + dy; /* map_info returns the information the player is allowed to * know about the screen location */ map_info(y, x, &g); /* Get the borg_grid */ ag = &borg_grids[y][x]; /* Notice "on-screen" */ ag->info |= BORG_OKAY; /* Notice "knowledge" */ if (g.f_idx != FEAT_NONE) { ag->info |= BORG_MARK; ag->feat = g.f_idx; } /* Notice the player */ if (g.is_player) { /* Memorize player location */ c_x = x; c_y = y; } /* Save the old "wall" or "door" */ old_wall = !borg_cave_floor_grid(ag); /* Analyze know information about grid */ switch (g.f_idx) { /* Darkness */ case FEAT_NONE: { /* The grid is not lit */ ag->info &= ~BORG_GLOW; /* Known grids must be dark floors */ if (ag->feat != FEAT_NONE) ag->info |= BORG_DARK; /* Done */ break; } /* Floors */ case FEAT_FLOOR: { /* Handle "blind" */ if (borg_skill[BI_ISBLIND]) { /* Nothing */ } /* Handle "dark" floors */ if (g.lighting == FEAT_LIGHTING_DARK) { /* Dark floor grid */ ag->info |= BORG_DARK; ag->info &= ~BORG_GLOW; } /* Handle Glowing floors */ else if (g.lighting == FEAT_LIGHTING_LIT) { /* Perma Glowing Grid */ ag->info |= BORG_GLOW; /* Assume not dark */ ag->info &= ~BORG_DARK; } /* torch-lit or line of sight grids */ else { ag->info |= BORG_LIGHT; /* Assume not dark */ ag->info &= ~BORG_DARK; } /* Done */ break; } /* Open doors */ case FEAT_OPEN: case FEAT_BROKEN: { /* Done */ break; } /* Walls */ case FEAT_WALL_EXTRA: case FEAT_WALL_INNER: case FEAT_WALL_OUTER: case FEAT_WALL_SOLID: case FEAT_PERM_SOLID: case FEAT_PERM_EXTRA: case FEAT_PERM_INNER: case FEAT_PERM_OUTER: { /* ok this is a humongo cheat. He is pulling the * grid information from the game rather than from * his memory. He is going to see if the wall is perm. * This is a cheat. May the Lord have mercy on my soul. * * The only other option is to have him "dig" on each * and every granite wall to see if it is perm. Then he * can mark it as a non-perm. However, he would only have * to dig once and only in a range of spaces near the * center of the map. Since perma-walls are located in * vaults and vaults have a minimum size. So he can avoid * digging on walls that are, say, 10 spaces from the edge * of the map. He can also limit the dig by his depth. * Vaults are found below certain levels and with certain * "feelings." Can be told not to dig on boring levels * and not before level 50 or whatever. * * Since the code to dig slows the borg down a lot. * (Found in borg6.c in _flow_dark_interesting()) We will * limit his capacity to search. We will set a flag on * the level is perma grids are found. */ /* is it a perma grid? */ if (ag->feat == FEAT_PERM_INNER) { vault_on_level = TRUE; } /* Done */ break; } /* Seams */ case FEAT_MAGMA: case FEAT_QUARTZ: { /* Done */ break; } /* Hidden */ case FEAT_MAGMA_K: case FEAT_QUARTZ_K: { /* Check for an existing vein */ for (i = 0; i < track_vein_num; i++) { /* Stop if we already new about this */ if ((track_vein_x[i] == x) && (track_vein_y[i] == y)) break; } /* Track the newly discovered vein */ if ((i == track_vein_num) && (i < track_vein_size)) { track_vein_x[i] = x; track_vein_y[i] = y; track_vein_num++; /* do not overflow */ if (track_vein_num > 99) track_vein_num = 99; } /* Done */ break; } /* Rubble */ case FEAT_RUBBLE: { /* Done */ break; } /* Doors */ case FEAT_DOOR_HEAD: case FEAT_DOOR_HEAD+1: case FEAT_DOOR_HEAD+2: case FEAT_DOOR_HEAD+3: case FEAT_DOOR_HEAD+4: case FEAT_DOOR_HEAD+5: case FEAT_DOOR_HEAD+6: case FEAT_DOOR_HEAD+7: case FEAT_DOOR_HEAD+8: case FEAT_DOOR_HEAD+9: case FEAT_DOOR_HEAD+10: case FEAT_DOOR_HEAD+11: case FEAT_DOOR_HEAD+12: case FEAT_DOOR_HEAD+13: case FEAT_DOOR_HEAD+14: case FEAT_DOOR_TAIL: { /* Only while low level */ if (borg_skill[BI_CLEVEL] <= 5) { /* Check for an existing door */ for (i = 0; i < track_closed_num; i++) { /* Stop if we already new about this door */ if ((track_closed_x[i] == x) && (track_closed_y[i] == y)) break; } /* Track the newly discovered door */ if ((i == track_closed_num) && (i < track_closed_size)) { track_closed_x[i] = x; track_closed_y[i] = y; track_closed_num++; /* do not overflow */ if (track_closed_num > 254) track_closed_num = 254; } } /* Done */ break; } /* Traps */ case FEAT_TRAP_HEAD: case FEAT_TRAP_HEAD+1: case FEAT_TRAP_HEAD+2: case FEAT_TRAP_HEAD+3: case FEAT_TRAP_HEAD+4: case FEAT_TRAP_HEAD+5: case FEAT_TRAP_HEAD+6: case FEAT_TRAP_HEAD+7: case FEAT_TRAP_HEAD+8: case FEAT_TRAP_HEAD+9: case FEAT_TRAP_HEAD+10: case FEAT_TRAP_HEAD+11: case FEAT_TRAP_HEAD+12: case FEAT_TRAP_HEAD+13: case FEAT_TRAP_HEAD+14: case FEAT_TRAP_TAIL: { /* Done */ break; } /* glyph of warding stuff here, */ case FEAT_GLYPH: { /* Check for an existing glyph */ for (i = 0; i < track_glyph_num; i++) { /* Stop if we already new about this glyph */ if ((track_glyph_x[i] == x) && (track_glyph_y[i] == y)) break; } /* Track the newly discovered glyph */ if ((i == track_glyph_num) && (i < track_glyph_size)) { track_glyph_x[i] = x; track_glyph_y[i] = y; track_glyph_num++; } /* done */ break; } /* Up stairs */ case FEAT_LESS: { /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { /* Stop if we already new about these stairs */ if ((track_less_x[i] == x) && (track_less_y[i] == y)) break; } /* Track the newly discovered "up stairs" */ if ((i == track_less_num) && (i < track_less_size)) { track_less_x[i] = x; track_less_y[i] = y; track_less_num++; } /* Done */ break; } /* Down stairs */ case FEAT_MORE: { /* Check for an existing "down stairs" */ for (i = 0; i < track_more_num; i++) { /* We already knew about that one */ if ((track_more_x[i] == x) && (track_more_y[i] == y)) break; } /* Track the newly discovered "down stairs" */ if ((i == track_more_num) && (i < track_more_size)) { track_more_x[i] = x; track_more_y[i] = y; track_more_num++; } /* Done */ break; } /* Store doors */ case FEAT_SHOP_HEAD: case FEAT_SHOP_HEAD+1: case FEAT_SHOP_HEAD+2: case FEAT_SHOP_HEAD+3: case FEAT_SHOP_HEAD+4: case FEAT_SHOP_HEAD+5: case FEAT_SHOP_HEAD+6: case FEAT_SHOP_TAIL: { /* Shop type */ i = ag->feat - FEAT_SHOP_HEAD; /* Save new information */ track_shop_x[i] = x; track_shop_y[i] = y; /* Done */ break; } } /* Now do non-feature stuff */ if (g.first_kind || g.m_idx) { /* Monsters/Objects */ borg_wank *wank; /* Check for memory overflow */ if (borg_wank_num == AUTO_VIEW_MAX) { borg_note(format("# Wank problem at grid (%d,%d) m:%d o:%d, borg at (%d,%d)", y, x, g.m_idx, g.first_kind ? g.first_kind->kidx : 0, c_y, c_x)); borg_oops("too many objects..."); } /* Access next wank, advance */ wank = &borg_wanks[borg_wank_num++]; /* Save some information */ wank->x = x; wank->y = y; /* monster symbol takes priority */ /* TODO: Store known information about monster/object, instead * of just the screen character */ if (g.m_idx) { monster_type *m_ptr = cave_monster(cave, g.m_idx); wank->t_a = m_ptr->attr; wank->t_c = r_info[m_ptr->race->ridx].d_char; } else { wank->t_a = g.first_kind->d_attr; wank->t_c = g.first_kind->d_char; } wank->is_take = (g.first_kind != NULL); wank->is_kill = (g.m_idx != 0); } /* Save the new "wall" or "door" */ new_wall = !borg_cave_floor_grid(ag); /* Notice wall changes */ if (old_wall != new_wall) { /* Remove this grid from any flow */ if (new_wall) borg_data_flow->data[y][x] = 255; /* Remove this grid from any flow */ borg_data_know->data[y][x] = FALSE; /* Remove this grid from any flow */ borg_data_icky->data[y][x] = FALSE; /* Recalculate the view (if needed) */ if (ag->info & BORG_VIEW) borg_do_update_view = TRUE; /* Recalculate the lite (if needed) */ if (ag->info & BORG_LIGHT) borg_do_update_LIGHT = TRUE; } } } } /* * Look at the screen and update the borg * * Uses the "panel" info (w_x, w_y) obtained earlier * * Note that all the "important" messages that occured after our last * action have been "queued" in a usable form. We must attempt to use * these messages to update our knowledge about the world, keeping in * mind that the world may have changed in drastic ways. * * Note that the "borg_t" variable corresponds *roughly* to player turns, * except that resting and "repeated" commands count as a single turn, * and "free" moves (including "illegal" moves, such as attempted moves * into walls, or tunneling into monsters) are counted as turns. * * Also note that "borg_t" is not incremented until the Borg is about to * do something, so nothing ever has a time-stamp of the current time. * * We rely on the fact that all "perma-lit" grids are memorized when * they are seen, so any grid on the current panel that appears "dark" * must not be perma-lit. * * We rely on the fact that all "objects" are memorized when they are * seen, so any grid on the current panel that appears "dark" must not * have an object in it. But it could have a monster which looks like * an object, but this is very rare. XXX XXX XXX * * XXX XXX XXX The basic problem with timestamping the monsters * and objects is that we often get a message about a monster, and so * we want to timestamp it, but then we cannot use the timestamp to * indicate that the monster has not been "checked" yet. Perhaps * we need to do something like give each monster a "moved" flag, * and clear all the flags to FALSE each turn before tracking. (?) * * Note that when two monsters of the same race are standing next to * each other, and they both move, such that the second monster ends * up where the first one began, we will incorrectly assume that the * first monster stayed still, and either the second monster moved * two spaces, or the second monster disappeared and a third monster * appeared, which is technically possible, if the first monster ate * the second, and then cloned the third. * * There is a problem with monsters which look like objects, namely, * they are assumed to be objects, and then if they leave line of * sight, they disappear, and the Borg assumes that they are gone, * when really they should be identified as monsters. * * XXX XXX Hack -- note the fast direct access to the screen. */ void borg_update(void) { int i, ii, k, x, y, dx, dy; int hit_dist; char *msg; char *what; borg_grid *ag; bool reset = FALSE; int j; int floor_grid = 0; int floor_glyphed = 0; bool monster_in_vault = FALSE; /*** Process objects/monsters ***/ /* Scan monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Clear flags */ kill->seen = FALSE; kill->used = FALSE; /* Skip recently seen monsters except if hallucinating */ if (borg_t - kill->when < 2000 && !borg_skill[BI_ISIMAGE]) continue; /* Note */ borg_note(format("# Expiring a monster '%s' (%d) at (%d,%d)", (r_info[kill->r_idx].name), kill->r_idx, kill->y, kill->x)); /* Kill the monster */ borg_delete_kill(i); } /* Scan objects */ for (i = 1; i < borg_takes_nxt; i++) { borg_take *take = &borg_takes[i]; /* Skip dead objects */ if (!take->kind) continue; /* Clear flags */ take->seen = FALSE; /* delete them if they are under me * of if I am Hallucinating */ if ((take->y == c_y && take->x == c_x) || (take->y == o_c_y && take->x == o_c_x) || borg_skill[BI_ISIMAGE]) { borg_delete_take(i); continue; } /* Skip recently seen objects */ if (borg_t - take->when < 2000) continue; /* Note */ borg_note(format("# Expiring an object '%s' (%d) at (%d,%d)", (take->kind->name), take->kind->kidx, take->y, take->x)); /* Kill the object */ borg_delete_take(i); } /*** Handle messages ***/ /* Process messages */ for (i = 0; i < borg_msg_num; i++) { /* Get the message */ msg = borg_msg_buf + borg_msg_pos[i]; /* Note the message */ borg_note(format("# %s (+)", msg)); } /* Process messages */ for (i = 0; i < borg_msg_num; i++) { /* Skip parsed messages */ if (borg_msg_use[i]) continue; /* Get the message */ msg = borg_msg_buf + borg_msg_pos[i]; /* Get the arguments */ what = strchr(msg, ':') + 1; /* Hack -- Handle "SELF" info */ if (prefix(msg, "SELF:")) { (void)borg_handle_self(what); borg_msg_use[i] = 1; } /* Handle "You feel..." */ else if (prefix(msg, "FEELING:")) { borg_feeling = atoi(what); borg_msg_use[i] = 1; } } /* Process messages */ for (i = 0; i < borg_msg_num; i++) { /* Skip parsed messages */ if (borg_msg_use[i]) continue; /* Get the message */ msg = borg_msg_buf + borg_msg_pos[i]; /* Get the arguments */ what = strchr(msg, ':') + 1; /* Handle "You hit xxx." */ if (prefix(msg, "HIT:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, g_y, g_x, 0)) > 0) { borg_msg_use[i] = 2; } } /* Handle "You miss xxx." */ else if (prefix(msg, "MISS:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, g_y, g_x, 0)) > 0) { borg_msg_use[i] = 2; } } /* Handle "You have killed xxx." */ else if (prefix(msg, "KILL:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, g_y, g_x, 0)) > 0) { borg_count_death(k); borg_delete_kill(k); borg_msg_use[i] = 2; /* reset the panel. He's on a roll */ time_this_panel = 1; } /* Shooting through darkness worked */ if (successful_target < 0) successful_target = 2; } /* Handle "The xxx disappears!" via teleport other, and blinks away */ else if (prefix(msg, "BLINK:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, g_y, g_x, 0)) > 0) { borg_delete_kill(k); borg_msg_use[i] = 2; /* reset the panel. He's on a roll */ time_this_panel = 1; } /* Shooting through darkness worked */ if (successful_target < 0) successful_target = 2; } /* Handle "xxx dies." */ else if (prefix(msg, "DIED:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, g_y, g_x, 3)) > 0) { borg_count_death(k); borg_delete_kill(k); borg_msg_use[i] = 2; /* reset the panel. He's on a roll */ time_this_panel = 1; } /* Shooting through darkness worked */ if (successful_target < 0) successful_target = 2; } /* Handle "xxx screams in pain." */ else if (prefix(msg, "PAIN:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, g_y, g_x, 3)) > 0) { borg_msg_use[i] = 2; } /* Shooting through darkness worked */ if (successful_target < 0) successful_target = 2; } /* Handle "sleep" */ else if (prefix(msg, "STATE__FEAR:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, g_y, g_x, 0)) > 0) { borg_msg_use[i] = 2; } } /* Handle "sleep" */ else if (prefix(msg, "STATE__BOLD:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, g_y, g_x, 0)) > 0) { borg_msg_use[i] = 2; } } else if (prefix(msg, "STATE_SLEEP:")) { /* Shooting through darkness worked */ if (successful_target < 0) successful_target = 2; } else if (prefix(msg, "STATE__FEAR:")) { /* Shooting through darkness worked */ if (successful_target < 0) successful_target = 2; } else if (prefix(msg, "STATE_CONFUSED:")) { /* Shooting through darkness worked */ if (successful_target < 0) successful_target = 2; } } /* Process messages */ /* getting distance to allow for 'hit's */ hit_dist = 1; for (i = 0; i < borg_msg_num; i++) { /* Skip parsed messages */ if (borg_msg_use[i]) continue; /* Get the message */ msg = borg_msg_buf + borg_msg_pos[i]; /* if you have moved then do not count the monsters as unknown */ /* unless they are very far away */ if (prefix(msg, "SPELL_70") || prefix(msg, "SPELL_71")) { hit_dist = 100; break; } /* monsters move from earthquake */ if (prefix(msg, "QUAKE")) { hit_dist = 3; break; } } /* Process messages */ for (i = 0; i < borg_msg_num; i++) { /* Skip parsed messages */ if (borg_msg_use[i]) continue; /* Get the message */ msg = borg_msg_buf + borg_msg_pos[i]; /* Get the arguments */ what = strchr(msg, ':') + 1; /* Handle "You hit xxx." */ if (prefix(msg, "HIT:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, g_y, g_x, hit_dist)) > 0) { borg_msg_use[i] = 3; } } /* Handle "You miss xxx." */ else if (prefix(msg, "MISS:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, g_y, g_x, hit_dist)) > 0) { borg_msg_use[i] = 3; } } /* Handle "You have killed xxx." */ else if (prefix(msg, "KILL:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, g_y, g_x, 1)) > 0) { borg_count_death(k); borg_delete_kill(k); borg_msg_use[i] = 3; /* reset the panel. He's on a roll */ time_this_panel = 1; } /* Shooting through darkness worked */ if (successful_target < 0) successful_target = 2; } /* Handle "The xxx disappears!" via teleport other, and blinks away */ else if (prefix(msg, "BLINK:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, g_y, g_x, 1)) > 0) { borg_delete_kill(k); borg_msg_use[i] = 3; /* reset the panel. He's on a roll */ time_this_panel = 1; } /* Shooting through darkness worked */ if (successful_target == -1) successful_target = 2; } /* Handle "xxx dies." */ else if (prefix(msg, "DIED:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, o_c_y, o_c_x, 20)) > 0) { borg_count_death(k); borg_delete_kill(k); borg_msg_use[i] = 3; /* reset the panel. He's on a roll */ time_this_panel = 1; } /* Shooting through darkness worked */ if (successful_target < 0) successful_target = 2; } /* Handle "xxx screams in pain." */ else if (prefix(msg, "PAIN:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, o_c_y, o_c_x, 20)) > 0) { borg_msg_use[i] = 3; } /* Shooting through darkness worked */ if (successful_target < 0) successful_target = 2; } /* Handle "xxx hits you." */ else if (prefix(msg, "HIT_BY:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, o_c_y, o_c_x, 1)) > 0) { borg_msg_use[i] = 3; } } /* Handle "xxx misses you." */ else if (prefix(msg, "MISS_BY:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, o_c_y, o_c_x, 1)) > 0) { borg_msg_use[i] = 3; } } /* Handle "sleep" */ else if (prefix(msg, "STATE_SLEEP:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, o_c_y, o_c_x, 20)) > 0) { borg_sleep_kill(k); borg_msg_use[i] = 3; } } /* Handle "awake" */ else if (prefix(msg, "STATE_AWAKE:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, o_c_y, o_c_x, 20)) > 0) { borg_msg_use[i] = 3; } } /* Handle "sleep" */ else if (prefix(msg, "STATE__FEAR:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, o_c_y, o_c_x, 20)) > 0) { borg_msg_use[i] = 3; } } /* Handle "sleep" */ else if (prefix(msg, "STATE__BOLD:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, o_c_y, o_c_x, 20)) > 0) { borg_msg_use[i] = 3; } } /* Hack -- Handle "spell" */ else if (prefix(msg, "SPELL_")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, o_c_y, o_c_x, 20)) > 0) { borg_msg_use[i] = 3; } } /* Hack -- Handle "cackles evilly" */ if (prefix(msg, "SPELL_75")) { /* Remove the flag which tells borg that * Trap Detection was done here */ borg_detect_trap[o_w_y / PANEL_HGT+0][o_w_x / PANEL_WID+0] = FALSE; borg_detect_trap[o_w_y / PANEL_HGT+0][o_w_x / PANEL_WID+1] = FALSE; borg_detect_trap[o_w_y / PANEL_HGT+1][o_w_x / PANEL_WID+0] = FALSE; borg_detect_trap[o_w_y / PANEL_HGT+1][o_w_x / PANEL_WID+1] = FALSE; /* Leave a note */ borg_note("# Logging need for use of Detect Traps."); /* Mark Adjacent grids to borg as Traps */ for (ii = 0; ii < 8; ii++) { /* Grid in that direction */ x = c_x + ddx_ddd[ii]; y = c_y + ddy_ddd[ii]; /* Access the grid */ ag = &borg_grids[y][x]; /* Skip unknown grids (important) */ if (ag->feat == FEAT_NONE) continue; /* Mark known floor grids as trap */ if (borg_cave_floor_grid(ag)) { ag->feat = FEAT_TRAP_HEAD; /* Leave a note */ borg_note(format("# Assuming a Traps at (%d,%d).",y,x)); } } } } /* If we didn't successfully hit our target, mark the first unknown grid in the path * as a wall. Then reset our targeting count so the borg can try it again. If no * unknown grid is found, then allow the borg to attempt another shot. He will not * allow a missile to travel along this path since we just marked that unknown grid * as a wall. Perhaps the borg will shoot at another monster (it being on another * pathway). * If I do not mark the pathway with an unknown grid, then all the grids must be known, * and I ought to be allowed to shoot again. Having a low number on successful_target * will prohibit me from using a ranged attack. */ if (successful_target < 0) { if (successful_target > -10) { successful_target -= 10; if (borg_target_unknown_wall(g_y, g_x)) successful_target = 2; } } /*** Handle new levels ***/ /* Hack -- note new levels */ if (old_depth != borg_skill[BI_CDEPTH]) { /* if we are not leaving town increment time since town clock */ if (!old_depth) borg_time_town = 0; else borg_time_town += borg_t - borg_began; /* Hack -- Restart the clock */ borg_t = 1000; borg_t_morgoth = 1; borg_t_antisummon = 0; /* reset our panel clock */ time_this_panel =1; /* reset our vault/unique check */ vault_on_level = FALSE; unique_on_level = 0; scaryguy_on_level = FALSE; /* reset our breeder flag */ breeder_level = FALSE; /* reset our need to see inviso clock */ need_see_inviso = 1; /* reset our 'shoot in the dark' flag */ successful_target = 0; /* When level was begun */ borg_began = borg_t; /* Not completed */ borg_completed = FALSE; /* New danger thresh-hold */ avoidance = borg_skill[BI_CURHP]; /* Wipe the danger */ borg_danger_wipe = TRUE; /* Clear our bought/sold flags */ sold_item_num = 0; sold_item_nxt = 1; bought_item_nxt = 1; bought_item_num = 0; for (i = 0; i < 10; i++) { sold_item_tval[i] = 0; sold_item_sval[i] = 0; sold_item_pval[i] = 0; sold_item_store[i] = 0; bought_item_tval[i] = 0; bought_item_sval[i] = 0; bought_item_pval[i] = 0; bought_item_store[i] = 0; } /* Update some stuff */ borg_do_update_view = TRUE; borg_do_update_LIGHT = TRUE; /* Examine the world */ borg_do_inven = TRUE; borg_do_equip = TRUE; borg_do_spell = TRUE; borg_do_panel = TRUE; borg_do_frame = TRUE; /* Enable some functions */ borg_do_crush_junk = TRUE; borg_do_crush_hole = TRUE; borg_do_crush_slow = TRUE; /* Mega-Hack -- Clear "call lite" stamp */ when_call_LIGHT = 0; /* Mega-Hack -- Clear "wizard lite" stamp */ when_wizard_LIGHT = 0; /* Mega-Hack -- Clear "detect traps" stamp */ when_detect_traps = 0; /* Mega-Hack -- Clear "detect doors" stamp */ when_detect_doors = 0; /* Mega-Hack -- Clear "detect walls" stamp */ when_detect_walls = 0; /* Mega-Hack -- Clear "detect evil" stamp */ when_detect_evil = 0; /* Hack -- Clear "panel" flags */ for (y = 0; y < 6; y++) { for (x = 0; x < 18; x++) { borg_detect_wall[y][x] = FALSE; borg_detect_trap[y][x] = FALSE; borg_detect_door[y][x] = FALSE; borg_detect_evil[y][x] = FALSE; } } /* Hack -- Clear "fear" */ for (y = 0; y < 6; y++) { for (x = 0; x < 18; x++) { borg_fear_region[y][x] = 0; } } /* Remove regional fear from monsters, it gets added back in later. */ for (y = 0; y < AUTO_MAX_Y; y++) { for (x = 0; x < AUTO_MAX_X; x++) { borg_fear_monsters[y][x] = 0; } } #if 0 /* Hack -- Clear "shop visit" stamps */ for (i = 0; i < MAX_STORES; i++) borg_shops[i].when = 0; #endif /* No goal yet */ goal = 0; /* Hack -- Clear "shop" goals */ goal_shop = goal_ware = goal_item = -1; /* Reset food&fuel in store */ borg_food_onsale = -1; borg_fuel_onsale = -1; /* Do not use any stairs */ stair_less = stair_more = FALSE; /* Hack -- cannot rise past town */ if (!borg_skill[BI_CDEPTH]) goal_rising = FALSE; /* Assume not leaving the level */ goal_leaving = FALSE; /* Assume not fleeing the level */ goal_fleeing = FALSE; goal_fleeing_lunal = FALSE; goal_fleeing_munchkin = FALSE; /* Assume not ignoring monsters */ goal_ignoring = FALSE; /* Assume not fleeing the level */ if (!borg_skill[BI_CDEPTH]) borg_fleeing_town = FALSE; if (borg_skill[BI_CDEPTH] >= 2) borg_fleeing_town = FALSE; /* No known stairs */ track_less_num = 0; track_more_num = 0; /* No known glyph */ track_glyph_num = 0; /* No known steps */ track_step_num = 0; /* No known doors */ track_door_num = 0; /* No known doors */ track_closed_num = 0; /* No known veins*/ track_vein_num = 0; /* No artifacts swapping in and out */ track_worn_num =0; /* No objects here */ borg_takes_cnt = 0; borg_takes_nxt = 1; /* Forget old objects */ C_WIPE(borg_takes, 256, borg_take); /* No monsters here */ borg_kills_cnt = 0; borg_kills_nxt = 1; /* Hack- Assume that Morgoth is on Level 100 unless * we know he is dead */ morgoth_on_level = FALSE; if ((borg_skill[BI_CDEPTH] >= 100 && !borg_skill[BI_KING]) || (unique_on_level == 547)) { /* We assume Morgoth is on this level */ morgoth_on_level = TRUE; /* Must build a new sea of runes */ borg_needs_new_sea = TRUE; } /* Reset nasties to 0 */ for (i = 0; i < borg_nasties_num; i++) { borg_nasties_count[i] = 0; /* Assume there are some Hounds on the Level */ if (borg_nasties[i] == 'Z') borg_nasties_count[i] = 25; /* Assume some on level */ } /* Forget old monsters */ C_WIPE(borg_kills, 256, borg_kill); /* Hack -- Forget race counters */ C_WIPE(borg_race_count, z_info->r_max, s16b); /* Hack -- Rarely, a Unique can die off screen and the borg will miss it. * This check will cheat to see if uniques are dead. */ /* Clear our Uniques vars */ borg_numb_live_unique = 0; borg_living_unique_index = 0; borg_unique_depth = 127; /*Extract dead uniques and set some Prep code numbers */ for (i = 1; i < z_info->r_max-1; i++) { monster_race *r_ptr = &r_info[i]; /* Skip non-monsters */ if (!r_ptr->name) continue; /* Skip non-uniques */ if (!(rf_has(r_ptr->flags, RF_UNIQUE))) continue; /* Mega-Hack -- Access "dead unique" list */ if (r_ptr->max_num == 0) borg_race_death[i] = 1; /* If any have been killed it is not a live unique */ if (borg_race_death[i] != 0) continue; /* skip if deeper than max dlevel */ if (r_ptr->level > borg_skill[BI_MAXDEPTH]) continue; /* skip certain questor Monsters */ if (rf_has(r_ptr->flags, RF_QUESTOR)) continue; /* Define some numbers used by Prep code */ borg_numb_live_unique ++; /* Its important to know the depth of the most shallow guy */ if (r_ptr->level < borg_unique_depth) borg_unique_depth = r_ptr->level; if (i < borg_living_unique_index || borg_living_unique_index == 0) borg_living_unique_index = i; } /* Forget the map */ borg_forget_map(); /* Reset */ reset = TRUE; /* wipe out bad artifacts list */ bad_obj_cnt = 0; for (i = 0; i < 50; i++) { bad_obj_x[i] = -1; bad_obj_y[i] = -1; } /* save once per level, but not if Lunal Scumming */ if (borg_flag_save && !borg_lunal_mode && !borg_munchkin_mode) borg_save = TRUE; /* Save new depth */ old_depth = borg_skill[BI_CDEPTH]; borg_times_twitch = 0; borg_escapes = 0; } /* Handle old level */ else { /* reduce Resistance count. NOTE: do not reduce below 1. That is done */ /* when the spell is cast. */ if (borg_resistance >= 1) { borg_resistance -= borg_game_ratio; } /* reduce the No-resting-because-I-just-did-a-prep-spell */ if (borg_no_rest_prep >= 1) { borg_no_rest_prep -= borg_game_ratio; } /* Count down to blast off */ if (goal_recalling >= 1) { goal_recalling -= borg_game_ratio; /* dont let it get to 0 or borg will recast the spell */ if (goal_recalling <= 0) goal_recalling = 1; } /* Lets make sure we did not miss read */ if (goal_recalling && !p_ptr->word_recall) { goal_recalling = 0; } /* when we need to cast this spell again */ if (borg_see_inv >= 1) { borg_see_inv -= borg_game_ratio; } /* Hack- Assume that Morgoth is on Level 100 */ morgoth_on_level = FALSE; if ((borg_skill[BI_CDEPTH] >= 100 && !borg_skill[BI_KING]) || (unique_on_level == 547)) { /* We assume Morgoth is on this level */ morgoth_on_level = TRUE; } /* If been sitting on level 100 for a long time and Morgoth * is a: * 1. no show, * 2. was here but has not been around in a very long time. * then assume he is not here so borg can continue to * explore the dungeon. */ if (morgoth_on_level && borg_t - borg_began >= 500) { /* Morgoth is a no show */ if (unique_on_level != 547) morgoth_on_level = FALSE; /* Morgoth has not been seen in a long time */ if (unique_on_level == 547 && (borg_t - borg_t_morgoth > 500)) { borg_note(format("# Morgoth has not been seen in %d turns. Going to hunt him.", borg_t - borg_t_morgoth)); morgoth_on_level = FALSE; } /* Morgoth has not been seen in a very long time */ if (borg_t - borg_t_morgoth > 2500) { borg_note(format("# Morgoth has not been seen in %d turns. No show.", borg_t - borg_t_morgoth)); unique_on_level = 0; } } /* Slight Cheat for the borg. He would like to keep an * eye on the Resist All spell. The borg will check if * all resistances are on and if so, give himself the * flag, but not if the flag is already on. */ if (borg_resistance <= 0 && borg_skill[BI_TRFIRE] && borg_skill[BI_TRELEC] && borg_skill[BI_TRCOLD] && borg_skill[BI_TRACID] && borg_skill[BI_TRPOIS]) { /* Set the flag on with some average count */ borg_resistance = 20000; } /* Slight safety check for borg to make sure he really * does resist all if he thinks he does. */ if (borg_resistance >= 1 && /* borg thinks it's on */ (borg_skill[BI_TRFIRE] + borg_skill[BI_TRELEC] + borg_skill[BI_TRCOLD] + borg_skill[BI_TRACID] + borg_skill[BI_TRPOIS] != 5)) { /* Set the flag on with some average count */ borg_resistance = 0; } /* Reduce fear over time */ if (!(borg_t % 10)) { for (y = 0; y < 6; y++) { for (x = 0; x < 18; x++) { if (borg_fear_region[y][x]) borg_fear_region[y][x]--; } } } /* Remove regional fear from monsters, it gets added back in later. */ for (y = 0; y < AUTO_MAX_Y; y++) { for (x = 0; x < AUTO_MAX_X; x++) { borg_fear_monsters[y][x] = 0; } } /* Handle changing map panel */ if ((o_w_x != w_x) || (o_w_y != w_y)) { /* Forget the previous map panel */ for (dy = 0; dy < SCREEN_HGT; dy++) { for (dx = 0; dx < SCREEN_WID; dx++) { /* Access the actual location */ x = o_w_x + dx; y = o_w_y + dy; /* Get the borg_grid */ ag = &borg_grids[y][x]; /* Clear the "okay" field */ ag->info &= ~BORG_OKAY; } } /* Time stamp this new panel-- to avoid a repeated motion bug */ time_this_panel = 1; } /* Examine the world while in town. */ if (!borg_skill[BI_CDEPTH]) borg_do_inven = TRUE; if (!borg_skill[BI_CDEPTH]) borg_do_equip = TRUE; } /*** Update the map ***/ /* Track floors and items */ borg_temp_lit_n = 0; borg_wank_num = 0; /* Update the map */ borg_update_map(); /* Mark this grid as having been stepped on */ track_step_x[track_step_num] = p_ptr->px; track_step_y[track_step_num] = p_ptr->py; track_step_num++; /* Hack - Clean the steps every so often */ if (track_step_num >= 75) { for (i = 0; i <= 75; i++) { /* Move each step down one position */ track_step_x[i] = track_step_x[i + 1]; track_step_y[i] = track_step_y[i + 1]; } /* reset the count */ track_step_num = 75; } /* Reset */ if (reset) { /* Fake old panel */ o_w_x = w_x; o_w_y = w_y; /* Fake old location */ o_c_x = c_x; o_c_y = c_y; /* Fake goal location */ g_x = c_x; g_y = c_y; } /* Player moved */ if ((o_c_x != c_x) || (o_c_y != c_y)) { /* Update view */ borg_do_update_view = TRUE; /* Update lite */ borg_do_update_LIGHT = TRUE; /* Assume I can shoot here */ successful_target = 0; } /* Update the view */ if (borg_do_update_view) { /* Update the view */ borg_update_view(); /* Take note */ borg_do_update_view = FALSE; } /* Update the lite */ if (borg_do_update_LIGHT) { /* Update the lite */ borg_update_LIGHT(); /* Take note */ borg_do_update_LIGHT = FALSE; } #if 0 /* Examine "lit" grids */ for (i = 0; i < borg_temp_lit_n; i++) { /* Get location */ x = borg_temp_lit_x[i]; y = borg_temp_lit_y[i]; /* Get the borg_grid */ ag = &borg_grids[y][x]; /* Skip torch-lit grids */ if (ag->info & BORG_LIGHT) continue; /* Assume not dark */ ag->info &= ~BORG_DARK; /* Assume perma-lit */ if (y !=c_y && x != c_x) ag->info |= BORG_GLOW; } #endif /* Convert necessary FEAT_INVIS grids to proper FEAT_FLOOR */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; /* Monster */ kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Ignore monsters who can pass through walls */ if (rf_has(r_info[kill->r_idx].flags, RF_PASS_WALL)) continue; /* Make sure this grid keeps Floor grid */ borg_grids[kill->y][kill->x].feat = FEAT_FLOOR; } /* Let me know if I am correctly positioned for special * Morgoth routines; sea of runes * * ############ * #3.........# * #2..xxxxx..# * #1..xxxxx..# * #0..xx@xx..# * #1..xxxxx..# * #2..xxxxx..# * #3.........# * #4432101234# * ############ */ borg_morgoth_position = FALSE; if (!borg_skill[BI_KING] && morgoth_on_level) { /* Must be in a fairly central region */ if (c_y >= 15 && c_y <= AUTO_MAX_Y - 15 && c_x >= 50 && c_x <= AUTO_MAX_X - 50) { /* Scan neighbors */ for (j = 0; j < 24; j++) { int y = c_y + borg_ddy_ddd[j]; int x = c_x + borg_ddx_ddd[j]; /* Get the grid */ ag = &borg_grids[y][x]; /* Skip unknown grids (important) */ if (ag->feat == FEAT_GLYPH) floor_glyphed++; } /* Number of perfect grids */ if (floor_glyphed == 24) borg_morgoth_position = TRUE; } /* Centrally located */ } /* on depth 100 not King */ /* Check to see if I am in a correct anti-summon corridor * ############## We want the borg to dig a tunnel which * #............# limits the LOS of summoned monsters. * ###............# It works better in hallways. * ##@#............# * #p##............# * ########## #######+###### * # # * # ################ # * # # # * ### # # * * * ############## Don't Build either of these as an AS-corridor * #............# * ###............# * ##@#............# * #p##............## * ########.#########+#####@# * # # ### * # ################ # * # # # * ### # # * */ for (j = 0; j <= 24; j++) { int y = c_y + borg_ddy_ddd[j]; int x = c_x + borg_ddx_ddd[j]; /* Stay in the bounds */ if (!cave_in_bounds(cave, y, x)) { floor_grid++; continue; } /* Get the grid */ ag = &borg_grids[y][x]; /* Skip unknown grids (important to make sure next one in line is not LOS floor) */ if (j <= 7 && ag->feat <= FEAT_MORE) floor_grid++; if (j >= 8 && ag->feat <= FEAT_MORE && borg_los(c_y, c_x, y, x)) floor_grid++; } /* Number of perfect grids */ if (floor_grid == 1) borg_as_position = TRUE; else borg_as_position = FALSE; /* Examine changing doors while shallow */ if (borg_skill[BI_CLEVEL] <= 5 && borg_skill[BI_CDEPTH] && track_closed_num) { /* Scan all known closed doors */ for (i = 0; i < track_closed_num; i++) { /* Get location */ x = track_closed_x[i]; y = track_closed_y[i]; /* Get the borg_grid */ ag = &borg_grids[y][x]; if (ag->feat == FEAT_OPEN || ag->feat == FEAT_BROKEN) { /* This door was not opened by me */ borg_note(format("# Monster opened door at %d,%d. That's scary.",y,x)); scaryguy_on_level = TRUE; } } } /*** Track objects and monsters ***/ /* Pass 1 -- stationary monsters */ for (i = borg_wank_num - 1; i >= 0; i--) { borg_wank *wank = &borg_wanks[i]; /* Track stationary monsters */ if (wank->is_kill && observe_kill_move(wank->y, wank->x, 0, wank->t_a, wank->t_c, FALSE)) { /* Hack -- excise the entry */ borg_wanks[i] = borg_wanks[--borg_wank_num]; } } /* Pass 2 -- stationary objects */ for (i = borg_wank_num - 1; i >= 0; i--) { borg_wank *wank = &borg_wanks[i]; /* Track stationary objects */ if (wank->is_take && observe_take_move(wank->y, wank->x, 0, wank->t_a, wank->t_c)) { /* Hack -- excise the entry */ borg_wanks[i] = borg_wanks[--borg_wank_num]; } } /* Pass 3a -- moving monsters (distance 1) */ for (i = borg_wank_num - 1; i >= 0; i--) { borg_wank *wank = &borg_wanks[i]; /* Track moving monsters */ if (wank->is_kill && observe_kill_move(wank->y, wank->x, 1, wank->t_a, wank->t_c, FALSE)) { /* Hack -- excise the entry */ borg_wanks[i] = borg_wanks[--borg_wank_num]; } } /* Pass 3b -- moving monsters (distance 2) */ for (i = borg_wank_num - 1; i >= 0; i--) { borg_wank *wank = &borg_wanks[i]; /* Track moving monsters */ if (wank->is_kill && observe_kill_move(wank->y, wank->x, 2, wank->t_a, wank->t_c, FALSE)) { /* Hack -- excise the entry */ borg_wanks[i] = borg_wanks[--borg_wank_num]; } } /* Pass 3c -- moving monsters (distance 3) */ for (i = borg_wank_num - 1; i >= 0; i--) { borg_wank *wank = &borg_wanks[i]; /* Track moving monsters */ if (wank->is_kill && observe_kill_move(wank->y, wank->x, 3, wank->t_a, wank->t_c, FALSE)) { /* Hack -- excise the entry */ borg_wanks[i] = borg_wanks[--borg_wank_num]; } } /* Pass 3d -- moving monsters (distance 7, allow changes) */ for (i = borg_wank_num - 1; i >= 0; i--) { borg_wank *wank = &borg_wanks[i]; /* Track moving monsters */ if (wank->is_kill && observe_kill_move(wank->y, wank->x, 7, wank->t_a, wank->t_c, TRUE)) { /* Hack -- excise the entry */ borg_wanks[i] = borg_wanks[--borg_wank_num]; } } /* Pass 4 -- new objects */ for (i = borg_wank_num - 1; i >= 0; i--) { borg_wank *wank = &borg_wanks[i]; /* Track new objects */ if (wank->is_take && observe_take_diff(wank->y, wank->x, wank->t_a, wank->t_c)) { /* Hack -- excise the entry */ borg_wanks[i] = borg_wanks[--borg_wank_num]; } } /* Pass 5 -- new monsters */ for (i = borg_wank_num - 1; i >= 0; i--) { borg_wank *wank = &borg_wanks[i]; /* Track new monsters */ if (wank->is_kill && observe_kill_diff(wank->y, wank->x, wank->t_a, wank->t_c)) { /* Hack -- excise the entry */ borg_wanks[i] = borg_wanks[--borg_wank_num]; } } /*** Handle messages ***/ /* Process messages */ for (i = 0; i < borg_msg_num; i++) { /* Skip parsed messages */ if (borg_msg_use[i]) continue; /* Get the message */ msg = borg_msg_buf + borg_msg_pos[i]; /* Get the arguments */ what = strchr(msg, ':') + 1; /* Handle "xxx dies." */ if (prefix(msg, "DIED:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, c_y, c_x, 20)) > 0) { borg_count_death(k); borg_delete_kill(k); borg_msg_use[i] = 4; } } /* Handle "xxx screams in pain." */ else if (prefix(msg, "PAIN:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, c_y, c_x, 20)) > 0) { borg_msg_use[i] = 4; } } /* Handle "xxx hits you." */ else if (prefix(msg, "HIT_BY:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, c_y, c_x, hit_dist)) > 0) { borg_msg_use[i] = 4; } } /* Handle "xxx misses you." */ else if (prefix(msg, "MISS_BY:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, c_y, c_x, hit_dist)) > 0) { borg_msg_use[i] = 4; } } /* Handle "sleep" */ else if (prefix(msg, "STATE_SLEEP:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, c_y, c_x, 20)) > 0) { borg_sleep_kill(k); borg_msg_use[i] = 4; } } /* Handle "awake" */ else if (prefix(msg, "STATE_AWAKE:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, c_y, c_x, 20)) > 0) { borg_msg_use[i] = 4; } } /* Handle "sleep" */ else if (prefix(msg, "STATE__FEAR:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, c_y, c_x, 20)) > 0) { borg_msg_use[i] = 4; } } /* Handle "sleep" */ else if (prefix(msg, "STATE__BOLD:")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, c_y, c_x, 20)) > 0) { borg_msg_use[i] = 4; } } /* Hack -- Handle "spell" */ else if (prefix(msg, "SPELL_")) { /* Attempt to find the monster */ if ((k = borg_locate_kill(what, c_y, c_x, 20)) > 0) { borg_msg_use[i] = 4; } } } /* Process messages */ for (i = 0; i < borg_msg_num; i++) { /* Skip parsed messages */ if (borg_msg_use[i]) continue; /* Get the message */ msg = borg_msg_buf + borg_msg_pos[i]; /* Get the arguments */ what = strchr(msg, ':') + 1; /* Handle "xxx hits you." */ if (prefix(msg, "HIT_BY:")) { borg_fear_regional(what, c_y, c_x, 4 * ((borg_skill[BI_CDEPTH] / 5) + 1), FALSE); borg_msg_use[i] = 5; } /* Handle "xxx misses you." */ else if (prefix(msg, "MISS_BY:")) { borg_fear_regional(what, c_y, c_x, 2 * ((borg_skill[BI_CDEPTH] / 5) + 1), FALSE); borg_msg_use[i] = 5; } /* Hack -- Handle "spell" */ else if (prefix(msg, "SPELL_")) { borg_fear_regional(what, c_y, c_x, borg_fear_spell(atoi(msg+6)), FALSE); borg_msg_use[i] = 5; } } /* Display messages */ for (i = 0; i < borg_msg_num; i++) { /* Get the message */ msg = borg_msg_buf + borg_msg_pos[i]; /* Final message */ borg_note(format("# %s (%d)", msg, borg_msg_use[i])); } /*** Notice missing monsters ***/ /* Scan the monster list */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Skip seen monsters */ if (kill->when == borg_t) continue; /* Skip assigned monsters */ if (kill->seen) continue; /* Hack -- blind or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISIMAGE]) continue; /* Predict the monster */ borg_follow_kill(i); } /* Update the fear_grid_monsters[][] with the monsters danger * This will provide a 'regional' fear from the accumulated * group of monsters. One Orc wont be too dangerous, but 20 * of them can be deadly. */ for (i = 1; i < borg_kills_nxt; i++) { int p; borg_kill *kill = &borg_kills[i]; monster_race *r_ptr; /* Reset the 'vault monsters */ monster_in_vault = FALSE; /* Skip dead monsters */ if (!kill->r_idx) continue; r_ptr = &r_info[kill->r_idx]; /* Skip monsters that dont chase */ if (rf_has(r_ptr->flags, RF_NEVER_MOVE)) continue; /* Skip monsters that are far away */ if (distance(kill->y,kill->x, c_y, c_x) >= 20) continue; /* Skip monsters in vaults */ if (vault_on_level) { /* Check adjacent grids to monster */ for (ii = 0; ii < 8; ii++) { /* Grid in that direction */ x = kill->x + ddx_ddd[ii]; y = kill->y + ddy_ddd[ii]; /* Legal grid */ if (!cave_in_bounds_fully(cave, y,x)) continue; /* Access the grid */ ag = &borg_grids[y][x]; /* Skip unknown grids (important) */ if (ag->feat == FEAT_NONE) continue; /* Mark this as a Vault monster */ if (ag->feat >= FEAT_PERM_SOLID && ag->feat <= FEAT_PERM_OUTER) { monster_in_vault = TRUE; } } } /* Monster is probably in a vault, ignore the regional fear */ if (monster_in_vault == TRUE) continue; /* Obtain some danger */ p = (borg_danger(kill->y,kill->x, 1, FALSE, FALSE) / 10); /* Apply the Fear */ borg_fear_grid(r_info[kill->r_idx].name, kill->y, kill->x, p); } /*** Notice missing objects ***/ /* Scan the object list */ for (i = 1; i < borg_takes_nxt; i++) { borg_take *take = &borg_takes[i]; /* Skip dead objects */ if (!take->kind) continue; /* Skip seen objects */ if (take->when >= borg_t - 2) continue; /* Hack -- blind or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISIMAGE]) continue; /* Follow the object */ borg_follow_take(i); } /*** Various things ***/ /* Forget goals while "impaired" in any way */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISAFRAID] || borg_skill[BI_ISIMAGE]) goal = 0; /* Forget goals while "bleeding" in any way */ if (borg_skill[BI_ISWEAK] || borg_skill[BI_ISPOISONED] || borg_skill[BI_ISCUT] || borg_skill[BI_ISSTUN] || borg_skill[BI_ISHEAVYSTUN]) goal = 0; /* Forget goals when HP or SP reduces */ /* if ((borg_skill[BI_CURHP] < borg_oldchp) || (borg_skill[BI_CURSP] < borg_oldcsp)) goal = 0; */ /* Save the hit points */ borg_oldchp = borg_skill[BI_CURHP]; /* Save the spell points */ borg_oldcsp = borg_skill[BI_CURSP]; /* Forget failure */ borg_failure = FALSE; /* Forget the messages */ borg_msg_len = 0; borg_msg_num = 0; /*** Save old info ***/ /* Save the old "location" */ o_c_x = c_x; o_c_y = c_y; /* Save the old "panel" */ o_w_x = w_x; o_w_y = w_y; /*** Defaults ***/ /* Default "goal" location */ g_x = c_x; g_y = c_y; } /* * Handle various "important" messages * * Actually, we simply "queue" them for later analysis */ void borg_react(char *msg, char *buf) { int len; if (borg_dont_react || borg_skill[BI_ISPARALYZED]) { borg_note("# Ignoring messages."); return; } /* Note actual message */ if (borg_verbose) borg_note(format("> Reacting Msg (%s)", msg)); /* Extract length of parsed message */ len = strlen(buf); /* Verify space */ if (borg_msg_num + 1 > borg_msg_max) { borg_note("too many messages"); return; } /* Verify space */ if (borg_msg_len + len + 1 > borg_msg_siz) { borg_note("too much messages"); return; } /* Assume not used yet */ borg_msg_use[borg_msg_num] = 0; /* Save the message position */ borg_msg_pos[borg_msg_num] = borg_msg_len; /* Save the message text */ strcpy(borg_msg_buf + borg_msg_len, buf); /* Advance the buf */ borg_msg_len += len + 1; /* Advance the pos */ borg_msg_num++; } /* * Initialize this file */ void borg_init_5(void) { int i; int size; s16b what[1024]; const char *text[1024]; /*** Message tracking ***/ /* No chars saved yet */ borg_msg_len = 0; /* Maximum buffer size */ borg_msg_siz = 4096; /* Allocate a buffer */ C_MAKE(borg_msg_buf, borg_msg_siz, char); /* No msg's saved yet */ borg_msg_num = 0; /* Maximum number of messages */ borg_msg_max = 256; /* Allocate array of positions */ C_MAKE(borg_msg_pos, borg_msg_max, s16b); /* Allocate array of use-types */ C_MAKE(borg_msg_use, borg_msg_max, s16b); /*** Object/Monster tracking ***/ /* Array of "wanks" */ C_MAKE(borg_wanks, AUTO_VIEW_MAX, borg_wank); /*** Reset the map ***/ /* Forget the map */ borg_forget_map(); /*** Parse "unique" monster names ***/ /* Start over */ size = 0; /* Collect "unique" monsters */ for (i = 1; i < z_info->r_max-1; i++) { monster_race *r_ptr = &r_info[i]; /* Skip non-monsters */ if (!r_ptr->name) continue; /* Skip non-unique monsters */ if (!(rf_has(r_ptr->flags, RF_UNIQUE))) continue; /* Use it */ text[size] = r_ptr->name; what[size] = i; size++; } /* Set the sort hooks */ borg_sort_comp = borg_sort_comp_hook; borg_sort_swap = borg_sort_swap_hook; /* Sort */ borg_sort(text, what, size); /* Save the size */ borg_unique_size = size; /* Allocate the arrays */ C_MAKE(borg_unique_text, borg_unique_size, const char *); C_MAKE(borg_unique_what, borg_unique_size, s16b); /* Save the entries */ for (i = 0; i < size; i++) borg_unique_text[i] = text[i]; for (i = 0; i < size; i++) borg_unique_what[i] = what[i]; /*** Parse "normal" monster names ***/ /* Start over */ size = 0; /* Collect "normal" monsters */ for (i = 1; i < z_info->r_max-1; i++) { monster_race *r_ptr = &r_info[i]; /* Skip non-monsters */ if (!r_ptr->name) continue; /* Skip unique monsters */ if (rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* Use it */ text[size] = r_ptr->name; what[size] = i; size++; } /* Set the sort hooks */ borg_sort_comp = borg_sort_comp_hook; borg_sort_swap = borg_sort_swap_hook; /* Sort */ borg_sort(text, what, size); /* Save the size */ borg_normal_size = size; /* Allocate the arrays */ C_MAKE(borg_normal_text, borg_normal_size, const char *); C_MAKE(borg_normal_what, borg_normal_size, s16b); /* Save the entries */ for (i = 0; i < size; i++) borg_normal_text[i] = text[i]; for (i = 0; i < size; i++) borg_normal_what[i] = what[i]; } #ifdef MACINTOSH static int HACK = 0; #endif angband-3.5.1/src/borg/borg6.c0000644000175000017500000207622512456456606015361 0ustar chriscchrisc /* File: borg6.c */ /* Purpose: Medium level stuff for the Borg -BEN- */ #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #include "monster/mon-spell.h" #include "borg1.h" #include "borg2.h" #include "borg3.h" #include "borg4.h" #include "borg5.h" #include "borg6.h" #include "borg7.h" static bool borg_desperate = FALSE; /* * This file is responsible for the low level dungeon goals. * * This includes calculating the danger from monsters, determining * how and when to attack monsters, and calculating "flow" paths * from place to place for various reasons. * * Notes: * We assume that invisible/offscreen monsters are dangerous * We consider physical attacks, missile attacks, spell attacks, * wand attacks, etc, as variations on a single theme. * We take account of monster resistances and susceptibilities * We try not to wake up sleeping monsters by throwing things * * * Bugs: */ /* * Given a "source" and "target" locations, extract a "direction", * which will move one step from the "source" towards the "target". * * Note that we use "diagonal" motion whenever possible. * * We return "5" if no motion is needed. */ static int borg_extract_dir(int y1, int x1, int y2, int x2) { /* No movement required */ if ((y1 == y2) && (x1 == x2)) return (5); /* South or North */ if (x1 == x2) return ((y1 < y2) ? 2 : 8); /* East or West */ if (y1 == y2) return ((x1 < x2) ? 6 : 4); /* South-east or South-west */ if (y1 < y2) return ((x1 < x2) ? 3 : 1); /* North-east or North-west */ if (y1 > y2) return ((x1 < x2) ? 9 : 7); /* Paranoia */ return (5); } /* * Given a "source" and "target" locations, extract a "direction", * which will move one step from the "source" towards the "target". * * We prefer "non-diagonal" motion, which allows us to save the * "diagonal" moves for avoiding pillars and other obstacles. * * If no "obvious" path is available, we use "borg_extract_dir()". * * We return "5" if no motion is needed. */ static int borg_goto_dir(int y1, int x1, int y2, int x2) { int d, e; int ay = (y2 > y1) ? (y2 - y1) : (y1 - y2); int ax = (x2 > x1) ? (x2 - x1) : (x1 - x2); /* Default direction */ e = borg_extract_dir(y1, x1, y2, x2); /* Adjacent location, use default */ if ((ay <= 1) && (ay <= 1)) return (e); /* Try south/north (primary) */ if (ay > ax) { d = (y1 < y2) ? 2 : 8; if (borg_cave_floor_bold(y1 + ddy[d], x1 + ddx[d])) return (d); } /* Try east/west (primary) */ if (ay < ax) { d = (x1 < x2) ? 6 : 4; if (borg_cave_floor_bold(y1 + ddy[d], x1 + ddx[d])) return (d); } /* Try diagonal */ d = borg_extract_dir(y1, x1, y2, x2); /* Check for walls */ if (borg_cave_floor_bold(y1 + ddy[d], x1 + ddx[d])) return (d); /* Try south/north (secondary) */ if (ay <= ax) { d = (y1 < y2) ? 2 : 8; if (borg_cave_floor_bold(y1 + ddy[d], x1 + ddx[d])) return (d); } /* Try east/west (secondary) */ if (ay >= ax) { d = (x1 < x2) ? 6 : 4; if (borg_cave_floor_bold(y1 + ddy[d], x1 + ddx[d])) return (d); } /* Circle obstacles */ if (!ay) { /* Circle to the south */ d = (x1 < x2) ? 3 : 1; if (borg_cave_floor_bold(y1 + ddy[d], x1 + ddx[d])) return (d); /* Circle to the north */ d = (x1 < x2) ? 9 : 7; if (borg_cave_floor_bold(y1 + ddy[d], x1 + ddx[d])) return (d); } /* Circle obstacles */ if (!ax) { /* Circle to the east */ d = (y1 < y2) ? 3 : 9; if (borg_cave_floor_bold(y1 + ddy[d], x1 + ddx[d])) return (d); /* Circle to the west */ d = (y1 < y2) ? 1 : 7; if (borg_cave_floor_bold(y1 + ddy[d], x1 + ddx[d])) return (d); } /* Oops */ return (e); } /* * Clear the "flow" information * * This function was once a major bottleneck, so we now use several * slightly bizarre, but highly optimized, memory copying methods. */ static void borg_flow_clear(void) { /* Reset the "cost" fields */ COPY(borg_data_cost, borg_data_hard, borg_data); /* Wipe costs and danger */ if (borg_danger_wipe) { /* Wipe the "know" flags */ WIPE(borg_data_know, borg_data); /* Wipe the "icky" flags */ WIPE(borg_data_icky, borg_data); /* Wipe complete */ borg_danger_wipe = FALSE; } /* Start over */ flow_head = 0; flow_tail = 0; } /* * Spread a "flow" from the "destination" grids outwards * * We fill in the "cost" field of every grid that the player can * "reach" with the number of steps needed to reach that grid, * if the grid is "reachable", and otherwise, with "255", which * is the largest possible value that can be stored in a byte. * * Thus, certain grids which are actually "reachable" but only by * a path which is at least 255 steps in length will thus appear * to be "unreachable", but this is not a major concern. * * We use the "flow" array as a "circular queue", and thus we must * be careful not to allow the "queue" to "overflow". This could * only happen with a large number of distinct destination points, * each several units away from every other destination point, and * in a dungeon with no walls and no dangerous monsters. But this * is technically possible, so we must check for it just in case. * * We do not need a "priority queue" because the cost from grid to * grid is always "one" and we process them in order. If we did * use a priority queue, this function might become unusably slow, * unless we reactivated the "room building" code. * * We handle both "walls" and "danger" by marking every grid which * is "impassible", due to either walls, or danger, as "ICKY", and * marking every grid which has been "checked" as "KNOW", allowing * us to only check the wall/danger status of any grid once. This * provides some important optimization, since many "flows" can be * done before the "ICKY" and "KNOW" flags must be reset. * * Note that the "borg_enqueue_grid()" function should refuse to * enqueue "dangeous" destination grids, but does not need to set * the "KNOW" or "ICKY" flags, since having a "cost" field of zero * means that these grids will never be queued again. In fact, * the "borg_enqueue_grid()" function can be used to enqueue grids * which are "walls", such as "doors" or "rubble". * * This function is extremely expensive, and is a major bottleneck * in the code, due more to internal processing than to the use of * the "borg_danger()" function, especially now that the use of the * "borg_danger()" function has been optimized several times. * * The "optimize" flag allows this function to stop as soon as it * finds any path which reaches the player, since in general we are * looking for paths to destination grids which the player can take, * and we can stop this function as soon as we find any usable path, * since it will always be as short a path as possible. * * We queue the "children" in reverse order, to allow any "diagonal" * neighbors to be processed first, since this may boost efficiency. * * Note that we should recalculate "danger", and reset all "flows" * if we notice that a wall has disappeared, and if one appears, we * must give it a maximal cost, and mark it as "icky", in case it * was currently included in any flow. * * If a "depth" is given, then the flow will only be spread to that * depth, note that the maximum legal value of "depth" is 250. * * "Avoid" flag means the borg will not move onto unknown grids, * nor to Monster grids if borg_desperate or borg_lunal_mode are * set. * * "Sneak" will have the borg avoid grids which are adjacent to a monster. * */ static void borg_flow_spread(int depth, bool optimize, bool avoid, bool tunneling, int stair_idx, bool sneak) { int i; int n, o = 0; int x1, y1; int x, y; int fear = 0; int ii; int yy, xx; bool bad_sneak = FALSE; int origin_y, origin_x; bool twitchy = FALSE; /* Default starting points */ origin_y = c_y; origin_x = c_x; /* Is the borg moving under boosted bravery? */ if (avoidance > borg_skill[BI_CURHP]) twitchy = TRUE; /* Use the closest stair for calculation distance (cost) from the stair to the goal */ if (stair_idx >= 0 && borg_skill[BI_CLEVEL] < 15) { origin_y = track_less_y[stair_idx]; origin_x = track_less_x[stair_idx]; optimize = FALSE; } /* Now process the queue */ while (flow_head != flow_tail) { /* Extract the next entry */ x1 = borg_flow_x[flow_tail]; y1 = borg_flow_y[flow_tail]; /* Circular queue -- dequeue the next entry */ if (++flow_tail == AUTO_FLOW_MAX) flow_tail = 0; /* Cost (one per movement grid) */ n = borg_data_cost->data[y1][x1] + 1; /* New depth */ if (n > o) { /* Optimize (if requested) */ if (optimize && (n > borg_data_cost->data[origin_y][origin_x])) break; /* Limit depth */ if (n > depth) break; /* Save */ o = n; } /* Queue the "children" */ for (i = 0; i < 8; i++) { int old_head; borg_grid *ag; /* reset bad_sneak */ bad_sneak = FALSE; /* Neighbor grid */ x = x1 + ddx_ddd[i]; y = y1 + ddy_ddd[i]; /* only on legal grids */ if (!cave_in_bounds_fully(cave, y,x)) continue; /* Skip "reached" grids */ if (borg_data_cost->data[y][x] <= n) continue; /* Access the grid */ ag = &borg_grids[y][x]; if (sneak) { /* Scan the neighbors */ for (ii = 0; ii < 8; ii++) { /* Neighbor grid */ xx = x + ddx_ddd[ii]; yy = y + ddy_ddd[ii]; /* only on legal grids */ if (!cave_in_bounds_fully(cave, yy,xx)) continue; /* Make sure no monster is on this grid, which is * adjacent to the grid on which, I am thinking about stepping. */ if (borg_grids[yy][xx].kill) { bad_sneak = TRUE; break; } } } /* The grid I am thinking about is adjacent to a monster */ if (sneak && bad_sneak && !borg_desperate && !twitchy) continue; /* Avoid "wall" grids (not doors) unless tunneling*/ if (!tunneling && ag->feat >= FEAT_SECRET) continue; /* Avoid "perma-wall" grids */ if (ag->feat >= FEAT_PERM_EXTRA) continue; /* Avoid unknown grids (if requested or retreating) * unless twitchy. In which case, expore it */ if ((avoid || borg_desperate) && (ag->feat == FEAT_NONE) && !twitchy) continue; /* Avoid Monsters if Desprerate, lunal */ if ((ag->kill) && (borg_desperate || borg_lunal_mode || borg_munchkin_mode)) continue; /* Avoid Monsters if low level, unless twitchy */ if ((ag->kill) && !twitchy && borg_skill[BI_FOOD] >= 2 && borg_skill[BI_MAXCLEVEL] < 5) continue; /* Avoid shop entry points if I am not heading to that shop */ if (goal_shop >= 0 && feature_isshop(ag->feat) && (ag->feat != FEAT_SHOP_HEAD + goal_shop) && y != c_y && x != c_x) continue; /* Avoid Traps if low level-- unless brave */ if (ag->feat >= FEAT_TRAP_HEAD && ag->feat <= FEAT_TRAP_TAIL && !twitchy) { /* Do not disarm when you could end up dead */ if (borg_skill[BI_CURHP] < 60) continue; /* Do not disarm when clumsy */ if (borg_skill[BI_DIS] < 30 && borg_skill[BI_CLEVEL] < 20 ) continue; if (borg_skill[BI_DIS] < 45 && borg_skill[BI_CLEVEL] < 10 ) continue; /* NOTE: Traps are tough to deal with as a low * level character. If any modifications are made above, * then the same changes must be made to borg_flow_direct() * and borg_flow_interesting() */ } /* Ignore "icky" grids */ if (borg_data_icky->data[y][x]) continue; /* Analyze every grid once */ if (!borg_data_know->data[y][x]) { int p; /* Mark as known */ borg_data_know->data[y][x] = TRUE; if (!borg_desperate && !borg_lunal_mode && !borg_munchkin_mode && !borg_digging) { /* Get the danger */ p = borg_danger(y, x, 1, TRUE, FALSE); /* Increase bravery */ if (borg_skill[BI_MAXCLEVEL] == 50) fear = avoidance * 5 / 10; if (borg_skill[BI_MAXCLEVEL] != 50) fear = avoidance * 3 / 10; if (scaryguy_on_level) fear = avoidance * 2; if (unique_on_level && vault_on_level && borg_skill[BI_MAXCLEVEL] == 50) fear = avoidance * 3; if (scaryguy_on_level && borg_skill[BI_CLEVEL] <= 5) fear = avoidance * 3; if (goal_ignoring) fear = avoidance * 5; if (borg_t - borg_began > 5000) fear = avoidance * 25; if (borg_skill[BI_FOOD] == 0) fear = avoidance * 100; /* Normal in town */ if (borg_skill[BI_CLEVEL] == 0) fear = avoidance * 3/ 10; /* Dangerous grid */ if (p > fear) { /* Mark as icky */ borg_data_icky->data[y][x] = TRUE; /* Ignore this grid */ continue; } } } /* Save the flow cost */ borg_data_cost->data[y][x] = n; /* Enqueue that entry */ borg_flow_x[flow_head] = x; borg_flow_y[flow_head] = y; /* Circular queue -- memorize head */ old_head = flow_head; /* Circular queue -- insert with wrap */ if (++flow_head == AUTO_FLOW_MAX) flow_head = 0; /* Circular queue -- handle overflow (badly) */ if (flow_head == flow_tail) flow_head = old_head; } } /* Forget the flow info */ flow_head = flow_tail = 0; } /* * Enqueue a fresh (legal) starting grid, if it is safe */ static void borg_flow_enqueue_grid(int y, int x) { int old_head; int fear = 0; int p; /* Avoid icky grids */ if (borg_data_icky->data[y][x]) return; /* Unknown */ if (!borg_data_know->data[y][x]) { /* Mark as known */ borg_data_know->data[y][x] = TRUE; /** Mark dangerous grids as icky **/ /* Get the danger */ p = borg_danger(y, x, 1, TRUE, FALSE); /* Increase bravery */ if (borg_skill[BI_MAXCLEVEL] == 50) fear = avoidance * 5 / 10; if (borg_skill[BI_MAXCLEVEL] != 50) fear = avoidance * 3 / 10; if (scaryguy_on_level) fear = avoidance * 2; if (unique_on_level && vault_on_level && borg_skill[BI_MAXCLEVEL] == 50) fear = avoidance * 3; if (scaryguy_on_level && borg_skill[BI_CLEVEL] <= 5) fear = avoidance * 3; if (goal_ignoring) fear = avoidance * 5; if (borg_t - borg_began > 5000) fear = avoidance * 25; if (borg_skill[BI_FOOD] == 0) fear = avoidance * 100; /* Normal in town */ if (borg_skill[BI_CLEVEL] == 0) fear = avoidance * 3/ 10; /* Dangerous grid */ if ((p > fear) && !borg_desperate && !borg_lunal_mode && !borg_munchkin_mode && !borg_digging) { /* Icky */ borg_data_icky->data[y][x] = TRUE; /* Avoid */ return; } } /* Only enqueue a grid once */ if (!borg_data_cost->data[y][x]) return; /* Save the flow cost (zero) */ borg_data_cost->data[y][x] = 0; /* Enqueue that entry */ borg_flow_y[flow_head] = y; borg_flow_x[flow_head] = x; /* Circular queue -- memorize head */ old_head = flow_head; /* Circular queue -- insert with wrap */ if (++flow_head == AUTO_FLOW_MAX) flow_head = 0; /* Circular queue -- handle overflow */ if (flow_head == flow_tail) flow_head = old_head; } /* Do a Stair-Flow. Look at how far away this grid is to my closest stair */ static int borg_flow_cost_stair(int y, int x, int b_stair) { int cost = 255; /* Clear the flow codes */ borg_flow_clear(); /* Paranoid */ if (b_stair == -1) return (0); /* Enqueue the player's grid */ borg_flow_enqueue_grid(track_less_y[b_stair],track_less_x[b_stair]); /* Spread, but do NOT optimize */ borg_flow_spread(250, FALSE, FALSE, FALSE, b_stair, FALSE); /* Distance from the grid to the stair */ cost = borg_data_cost->data[y][x]; return (cost); } /* * Do a "reverse" flow from the player outwards */ static void borg_flow_reverse(int depth, bool optimize, bool avoid, bool tunneling, int stair_idx, bool sneak) { /* Clear the flow codes */ borg_flow_clear(); /* Enqueue the player's grid */ borg_flow_enqueue_grid(c_y, c_x); /* Spread, but do NOT optimize */ borg_flow_spread(depth, optimize, avoid, tunneling, stair_idx, sneak); } /* * Attempt to induce "word of recall" * artifact activations added throughout this code */ bool borg_recall(void) { /* Multiple "recall" fails */ if (!goal_recalling) { /* Try to "recall" */ if (borg_zap_rod(SV_ROD_RECALL) || borg_activate_artifact(EF_RECALL) || borg_spell_fail(6, 3, 60) || borg_prayer_fail(4, 4, 60) || borg_read_scroll(SV_SCROLL_WORD_OF_RECALL)) { /* Do reset depth at certain times. */ if (borg_skill[BI_CDEPTH] < borg_skill[BI_MAXDEPTH] && ((borg_skill[BI_MAXDEPTH] >= 60 && borg_skill[BI_CDEPTH] >= 40) || (borg_skill[BI_CLEVEL] < 48 && borg_skill[BI_CDEPTH] >= borg_skill[BI_MAXDEPTH] - 3) || (borg_skill[BI_CLEVEL] < 48 && borg_skill[BI_CDEPTH] >= 15 && borg_skill[BI_MAXDEPTH] - borg_skill[BI_CDEPTH] > 10))) { /* Special check on deep levels */ if (borg_skill[BI_CDEPTH] >=80 && borg_skill[BI_CDEPTH] < 100 && /* Deep */ borg_race_death[546] != 0) /* Sauron is Dead */ { /* Do reset Depth */ borg_note("# Resetting recall depth."); borg_keypress('y'); } else if (goal_fleeing_munchkin == TRUE) { /* Do not reset Depth */ borg_note("# Resetting recall depth during munchkin mode."); borg_keypress('y'); } else if (borg_skill[BI_CDEPTH] >=100 && !borg_skill[BI_KING]) { /* Do reset Depth */ borg_note("# Not Resetting recall depth."); borg_keypress('n'); } else { /* Do reset Depth */ borg_note("# Resetting recall depth."); borg_keypress('y'); } } /* reset recall depth in dungeon? */ else if (borg_skill[BI_CDEPTH] < borg_skill[BI_MAXDEPTH] && borg_skill[BI_CDEPTH] != 0) { /* Do not reset Depth */ borg_note("# Not resetting recall depth."); borg_keypress('n'); } borg_keypress(ESCAPE); /* Success */ return (TRUE); } } /* Nothing */ return (FALSE); } /* * Prevent starvation by any means possible */ static bool borg_eat_food_any(void) { int i; /* Scan the inventory for "normal" food */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip unknown food */ if (!item->kind) continue; /* Skip non-food */ if (item->tval != TV_FOOD) continue; /* Eat something of that type */ if (borg_eat_food(item->sval)) return (TRUE); } /* Scan the inventory for "okay" food */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip unknown food */ if (!item->kind) continue; /* Skip non-food */ if (item->tval != TV_FOOD) continue; /* Eat something of that type */ if (borg_eat_food(item->sval)) return (TRUE); } /* Scan the inventory for "potions" food */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip unknown food */ if (!item->kind) continue; /* Skip non-food */ if (item->tval != TV_POTION) continue; /* Consume in order, when hurting */ if ((borg_skill[BI_CURHP] < 4 || (borg_skill[BI_CURHP] <= borg_skill[BI_MAXHP])) && (borg_quaff_potion(SV_POTION_CURE_LIGHT) || borg_quaff_potion(SV_POTION_CURE_SERIOUS) || borg_quaff_potion(SV_POTION_CURE_CRITICAL) || borg_quaff_potion(SV_POTION_RESTORE_MANA) || borg_quaff_potion(SV_POTION_HEALING) || borg_quaff_potion(SV_POTION_STAR_HEALING) || borg_quaff_potion(SV_POTION_LIFE) )) { return (TRUE); } } /* Nothing */ return (FALSE); } /* * Hack -- evaluate the likelihood of the borg getting surrounded * by a bunch of monsters. This is called from borg_danger() when * he looking for a strategic retreat. It is hopeful that the borg * will see that several monsters are approaching him and he may * become surrouned then die. This routine looks at near-by monsters * and determines the likelihood of him getting surrouned. */ static bool borg_surrounded(void) { borg_kill *kill; monster_race *r_ptr; int safe_grids = 8; int non_safe_grids = 0; int monsters = 0; int adjacent_monsters = 0; int x9, y9, ax, ay, d; int i; /* Evaluate the local monsters */ for (i = 1; i < borg_kills_nxt; i++) { kill = &borg_kills[i]; r_ptr = &r_info[kill->r_idx]; /* Skip dead monsters */ if (!kill->r_idx) continue; x9 = kill->x; y9 = kill->y; /* Distance components */ ax = (x9 > c_x) ? (x9 - c_x) : (c_x - x9); ay = (y9 > c_y) ? (y9 - c_y) : (c_y - y9); /* Distance */ d = MAX(ax, ay); /* if the monster is too far then skip it. */ if (d > 3) continue; /* if he cant see me then forget it.*/ if (!borg_los(c_y, c_x, y9, x9)) continue; /* if asleep, don't consider this one */ if (!kill->awake) continue; /* Monsters with Pass Wall are dangerous, no escape from them */ if (rf_has(r_ptr->flags, RF_PASS_WALL)) continue; if (rf_has(r_ptr->flags, RF_KILL_WALL)) continue; /* Cant really run away from Breeders very well */ /* if (rf_has(r_ptr->flags, RF_MULTIPLY)) continue; */ /* Monsters who never move cant surround */ /* if (rf_has(r_ptr->flags, RF_NEVER_MOVE)) continue; */ /* keep track of monsters touching me */ if (d == 1) adjacent_monsters ++; /* Add them up. */ monsters ++; } /* Evaluate the Non Safe Grids, (walls, closed doors, traps, monsters) */ for (i = 0; i < 8; i++) { int x = c_x + ddx_ddd[i]; int y = c_y + ddy_ddd[i]; /* Access the grid */ borg_grid *ag = &borg_grids[y][x]; /* Bound check */ if (!cave_in_bounds_fully(cave, y,x)) continue; /* Skip walls/doors */ if (!borg_cave_floor_grid(ag)) non_safe_grids ++; /* Skip unknown grids */ else if (ag->feat == FEAT_NONE) non_safe_grids ++; /* Skip monster grids */ else if (ag->kill) non_safe_grids ++; /* Mega-Hack -- skip stores XXX XXX XXX */ else if (feature_isshop(ag->feat)) non_safe_grids ++; /* Mega-Hack -- skip traps XXX XXX XXX */ if ((ag->feat >= FEAT_TRAP_HEAD) && (ag->feat <= FEAT_TRAP_TAIL)) non_safe_grids ++; } /* Safe grids are decreased */ safe_grids = safe_grids - non_safe_grids; /* Am I in hallway? If so don't worry about it */ if (safe_grids == 1 && adjacent_monsters == 1) return (FALSE); /* I am likely to get surrouned */ if (monsters > safe_grids) { borg_note(format("# Possibility of being surrounded (monsters/safegrids)(%d/%d)", monsters, safe_grids)); /* The borg can get trapped by continuing to flee * into a dead-end. So he needs to be able to trump this * routine. */ if (goal_ignoring) { /* borg_note("# Ignoring the fact that I am surrounded."); * return (FALSE); */ } else return (TRUE); } /* Probably will not be surrouned */ return (FALSE); } /* * Mega-Hack -- evaluate the "freedom" of the given location * * The theory is that often, two grids will have equal "danger", * but one will be "safer" than the other, perhaps because it * is closer to stairs, or because it is in a corridor, or has * some other characteristic that makes it "safer". * * Then, if the Borg is in danger, say, from a normal speed monster * which is standing next to him, he will know that walking away from * the monster is "pointless", because the monster will follow him, * but if the resulting location is "safer" for some reason, then * he will consider it. This will allow him to flee towards stairs * in the town, and perhaps towards corridors in the dungeon. * * This method is used in town to chase the stairs. * * XXX XXX XXX We should attempt to walk "around" buildings. */ static int borg_freedom(int y, int x) { int d, f = 0; /* Hack -- chase down stairs in town */ if (!borg_skill[BI_CDEPTH] && track_more_num) { /* Love the stairs! */ d = double_distance(y, x, track_more_y[0], track_more_x[0]); /* Proximity is good */ f += (1000 - d); /* Close proximity is great */ if (d < 4) f += (2000 - (d * 500)); } /* Hack -- chase Up Stairs in dungeon */ if (borg_skill[BI_CDEPTH] && track_less_num) { /* Love the stairs! */ d = double_distance(y, x, track_less_y[0], track_less_x[0]); /* Proximity is good */ f += (1000 - d); /* Close proximity is great */ if (d < 4) f += (2000 - (d * 500)); } /* Freedom */ return (f); } /* * Check a floor grid for "happy" status * * These grids are floor grids which contain stairs, or which * are non-corners in corridors, or which are directly adjacent * to pillars, or grids which we have stepped on before. * Stairs are good because they can be used to leave * the level. Corridors are good because you can back into them * to avoid groups of monsters and because they can be used for * escaping. Pillars are good because while standing next to a * pillar, you can walk "around" it in two different directions, * allowing you to retreat from a single normal monster forever. * Stepped on grids are good because they likely stem from an area * which has been cleared of monsters. */ static bool borg_happy_grid_bold(int y, int x) { int i; borg_grid *ag = &borg_grids[y][x]; /* Bounds Check */ if (y >= DUNGEON_HGT -2 || y <= 2 || x >= DUNGEON_WID -2 || x <= 2) return (FALSE); /* Accept stairs */ if (ag->feat == FEAT_LESS) return (TRUE); if (ag->feat == FEAT_MORE) return (TRUE); if (ag->feat == FEAT_GLYPH) return (TRUE); /* Hack -- weak/dark is very unhappy */ if (borg_skill[BI_ISWEAK] || borg_skill[BI_CURLITE] == 0) return (FALSE); /* Apply a control effect so that he does not get stuck in a loop */ if ((borg_t - borg_began) >= 2000) return (FALSE); /* Case 1a: north-south corridor */ if (borg_cave_floor_bold(y-1, x) && borg_cave_floor_bold(y+1, x) && !borg_cave_floor_bold(y, x-1) && !borg_cave_floor_bold(y, x+1) && !borg_cave_floor_bold(y+1, x-1) && !borg_cave_floor_bold(y+1, x+1) && !borg_cave_floor_bold(y-1, x-1) && !borg_cave_floor_bold(y-1, x+1)) { /* Happy */ return (TRUE); } /* Case 1b: east-west corridor */ if (borg_cave_floor_bold(y, x-1) && borg_cave_floor_bold(y, x+1) && !borg_cave_floor_bold(y-1, x) && !borg_cave_floor_bold(y+1, x) && !borg_cave_floor_bold(y+1, x-1) && !borg_cave_floor_bold(y+1, x+1) && !borg_cave_floor_bold(y-1, x-1) && !borg_cave_floor_bold(y-1, x+1)) { /* Happy */ return (TRUE); } /* Case 1aa: north-south doorway */ if (borg_cave_floor_bold(y-1, x) && borg_cave_floor_bold(y+1, x) && !borg_cave_floor_bold(y, x-1) && !borg_cave_floor_bold(y, x+1)) { /* Happy */ return (TRUE); } /* Case 1ba: east-west doorway */ if (borg_cave_floor_bold(y, x-1) && borg_cave_floor_bold(y, x+1) && !borg_cave_floor_bold(y-1, x) && !borg_cave_floor_bold(y+1, x)) { /* Happy */ return (TRUE); } /* Case 2a: north pillar */ if (!borg_cave_floor_bold(y-1, x) && borg_cave_floor_bold(y-1, x-1) && borg_cave_floor_bold(y-1, x+1) && borg_cave_floor_bold(y-2, x)) { /* Happy */ return (TRUE); } /* Case 2b: south pillar */ if (!borg_cave_floor_bold(y+1, x) && borg_cave_floor_bold(y+1, x-1) && borg_cave_floor_bold(y+1, x+1) && borg_cave_floor_bold(y+2, x)) { /* Happy */ return (TRUE); } /* Case 2c: east pillar */ if (!borg_cave_floor_bold(y, x+1) && borg_cave_floor_bold(y-1, x+1) && borg_cave_floor_bold(y+1, x+1) && borg_cave_floor_bold(y, x+2)) { /* Happy */ return (TRUE); } /* Case 2d: west pillar */ if (!borg_cave_floor_bold(y, x-1) && borg_cave_floor_bold(y-1, x-1) && borg_cave_floor_bold(y+1, x-1) && borg_cave_floor_bold(y, x-2)) { /* Happy */ return (TRUE); } /* check for grids that have been stepped on before */ for (i = 0; i < track_step_num; i++) { /* Enqueue the grid */ if ((track_step_y[i] == y) && (track_step_x[i] == x)) { /* Recent step is good */ if (i < 25) { return (TRUE); } } } /* Not happy */ return (FALSE); } /* This will look down a hallway and possibly light it up using * the Light Beam mage spell. This spell is mostly used when * the borg is moving through the dungeon under boosted bravery. * This will allow him to "see" if anyone is there. * * It might also come in handy if he's in a hallway and gets shot, or * if resting in a hallway. He may want to cast it to make * sure no previously unknown monsters are in the hall. * NOTE: ESP will alter the value of this spell. * * Borg has a problem when not on map centering mode and casting the beam * repeatedly, down or up when at the edge of a panel. */ bool borg_LIGHT_beam(bool simulation) { int dir = 5; bool spell_ok = FALSE; int i; bool blocked = FALSE; borg_grid *ag = &borg_grids[c_y][c_x]; /* Hack -- weak/dark is very unhappy */ if (borg_skill[BI_ISWEAK]) return (FALSE); /* Require the abilitdy */ if (borg_spell_okay_fail(1,6, 20) || (-1 != borg_slot(TV_WAND, SV_WAND_LIGHT) && borg_items[borg_slot(TV_WAND, SV_WAND_LIGHT)].pval) || borg_equips_rod(SV_ROD_LIGHT)) spell_ok = TRUE; /*** North Direction Test***/ /* Quick Boundary check */ if (c_y - borg_skill[BI_CURLITE] - 1 > 0) { /* Look just beyond my light */ ag = &borg_grids[c_y- borg_skill[BI_CURLITE] -1][c_x]; /* Must be on the panel */ if (panel_contains(c_y - borg_skill[BI_CURLITE] - 1, c_x)) { /* Check each grid in our light radius along the course */ for (i = 0; i <= borg_skill[BI_CURLITE]; i++) { if (borg_cave_floor_bold(c_y - i, c_x) && !borg_cave_floor_bold(c_y - borg_skill[BI_CURLITE] -1 , c_x) && ag->feat < FEAT_DOOR_HEAD && blocked == FALSE) { /* note the direction */ dir = 8; } else { dir = 5; blocked = TRUE; } } } } /*** South Direction Test***/ /* Quick Boundary check */ if (c_y + borg_skill[BI_CURLITE] + 1 < AUTO_MAX_Y && dir == 5) { /* Look just beyond my light */ ag = &borg_grids[c_y + borg_skill[BI_CURLITE] + 1][c_x]; /* Must be on the panel */ if (panel_contains(c_y + borg_skill[BI_CURLITE] + 1, c_x)) { /* Check each grid in our light radius along the course */ for (i = 0; i <= borg_skill[BI_CURLITE]; i++) { if (borg_cave_floor_bold(c_y + i, c_x)&& /* all floors */ !borg_cave_floor_bold(c_y + borg_skill[BI_CURLITE] + 1 , c_x) && ag->feat < FEAT_DOOR_HEAD && blocked == FALSE) { /* note the direction */ dir = 2; } else { dir = 5; blocked = TRUE; } } } } /*** East Direction Test***/ /* Quick Boundary check */ if (c_x + borg_skill[BI_CURLITE] + 1 < AUTO_MAX_X && dir == 5) { /* Look just beyond my light */ ag = &borg_grids[c_y] [c_x + borg_skill[BI_CURLITE] + 1]; /* Must be on the panel */ if (panel_contains(c_y, c_x + borg_skill[BI_CURLITE] + 1)) { /* Check each grid in our light radius along the course */ for (i = 0; i <= borg_skill[BI_CURLITE]; i++) { if (borg_cave_floor_bold(c_y, c_x + i)&& /* all floors */ !borg_cave_floor_bold(c_y, c_x + borg_skill[BI_CURLITE] + 1) && ag->feat < FEAT_DOOR_HEAD && blocked == FALSE) { /* note the direction */ dir = 6; } else { dir = 5; blocked = TRUE; } } } } /*** West Direction Test***/ /* Quick Boundary check */ if (c_x - borg_skill[BI_CURLITE] - 1 > 0 && dir == 5) { /* Look just beyond my light */ ag = &borg_grids[c_y] [c_x - borg_skill[BI_CURLITE] - 1]; /* Must be on the panel */ if (panel_contains(c_y, c_x - borg_skill[BI_CURLITE] - 1)) { /* Check each grid in our light radius along the course */ for (i = 1; i <= borg_skill[BI_CURLITE]; i++) { /* Verify that there are no blockers in my light radius and * the 1st grid beyond my light is not a floor nor a blocker */ if (borg_cave_floor_bold(c_y, c_x - i) && /* all see through */ !borg_cave_floor_bold(c_y, c_x - borg_skill[BI_CURLITE] -1) && ag->feat < FEAT_DOOR_HEAD && blocked == FALSE) { /* note the direction */ dir = 4; } else { dir = 5; blocked = TRUE; } } } } /* Dont do it if on the edge of shifting the panel. */ if (dir == 5 || spell_ok == FALSE || blocked == TRUE || (dir == 2 && (c_y == 18 || c_y == 19 || c_y == 29 || c_y == 30 || c_y == 40 || c_y == 41 || c_y == 51 || c_y == 52))|| (dir == 8 && (c_y == 13 || c_y == 14 || c_y == 24 || c_y == 25 || c_y == 35 || c_y == 36 || c_y == 46 || c_y == 47))) return (FALSE); /* simulation */ if (simulation) return (TRUE); /* cast the light beam */ if (borg_spell_fail(1,6, 20) || borg_zap_rod(SV_ROD_LIGHT) || borg_aim_wand(SV_WAND_LIGHT)) { /* apply the direction */ borg_keypress(I2D(dir)); borg_note("# Illuminating this hallway"); return(TRUE); } /* cant do it */ return (FALSE); } /* * Scan the monster lists for certain types of monster that we * should be concerned over. * This only works for monsters we know about. If one of the * monsters around is misidentified then it may be a unique * and we wouldn't know. Special consideration is given to Morgoth */ void borg_near_monster_type(int dist) { borg_kill *kill; monster_race *r_ptr; int x9, y9, ax, ay, d; int i; int breeder_count = 0; /* reset the borg flags */ borg_fighting_summoner = FALSE; borg_fighting_unique = 0; borg_fighting_evil_unique = FALSE; borg_kills_summoner = -1; /* Scan the monsters */ for (i = 1; i < borg_kills_nxt; i++) { kill = &borg_kills[i]; r_ptr = &r_info[kill->r_idx]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Count breeders */ if (rf_has(r_ptr->flags, RF_MULTIPLY)) breeder_count ++; /*** Scan for Scary Guys ***/ /* Do ScaryGuys now, before distance checks. We are * Looking for scary guys on level, not scary guys * near me */ /* run from certain scaries */ if (borg_skill[BI_CLEVEL] <= 5 && (strstr(r_ptr->name, "Squint"))) scaryguy_on_level = TRUE; /* Mage and priest are extra fearful */ if (borg_skill[BI_CLEVEL] <= 6 && (borg_class == CLASS_MAGE || borg_class == CLASS_PRIEST) && (strstr(r_ptr->name, "Squint"))) scaryguy_on_level = TRUE; /* run from certain dungeon scaries */ if (borg_skill[BI_CLEVEL] <= 5 && (strstr(r_ptr->name, "Grip") || strstr(r_ptr->name, "Fang") || strstr(r_ptr->name, "Small kobold"))) scaryguy_on_level = TRUE; /* run from certain scaries */ if (borg_skill[BI_CLEVEL] <= 8 && (strstr(r_ptr->name, "Novice") || strstr(r_ptr->name, "Kobold") || strstr(r_ptr->name, "Kobold archer") || strstr(r_ptr->name, "Jackal") || strstr(r_ptr->name, "Shrieker") || strstr(r_ptr->name, "Farmer Maggot") || strstr(r_ptr->name, "Filthy street urchin") || strstr(r_ptr->name, "Battle-scarred veteran") || strstr(r_ptr->name, "Mean-looking mercenary"))) scaryguy_on_level = TRUE; if (borg_skill[BI_CLEVEL] <= 15 && (strstr(r_ptr->name, "Bullr") || ((strstr(r_ptr->name, "Giant white mouse") || strstr(r_ptr->name, "White worm mass") || strstr(r_ptr->name, "Green worm mass")) && breeder_count >= borg_skill[BI_CLEVEL]))) scaryguy_on_level = TRUE; if (borg_skill[BI_CLEVEL] <= 20 && (strstr(r_ptr->name, "Cave spider") || strstr(r_ptr->name, "Pink naga") || strstr(r_ptr->name, "Giant pink frog") || strstr(r_ptr->name, "Radiation eye") || (strstr(r_ptr->name, "Yellow worm mass") && breeder_count >= borg_skill[BI_CLEVEL]))) scaryguy_on_level = TRUE; if (borg_skill[BI_CLEVEL] < 45 && (strstr(r_ptr->name, "Gravity") || strstr(r_ptr->name, "Inertia") || strstr(r_ptr->name, "Ancient") || strstr(r_ptr->name, "Beorn") || strstr(r_ptr->name, "Dread") /* Appear in Groups */)) scaryguy_on_level = TRUE; /* Nether breath is bad */ if (!borg_skill[BI_SRNTHR] && (strstr(r_ptr->name, "Azriel") || strstr(r_ptr->name, "Dracolich")|| strstr(r_ptr->name, "Dracolisk"))) scaryguy_on_level = TRUE; /* Blindness is really bad */ if ((!borg_skill[BI_SRBLIND]) && ((strstr(r_ptr->name, "Light hound") && !borg_skill[BI_SRLITE]) || (strstr(r_ptr->name, "Dark hound") && !borg_skill[BI_SRDARK]))) scaryguy_on_level = TRUE; /* Chaos and Confusion are really bad */ if ((!borg_skill[BI_SRKAOS] && !borg_skill[BI_SRCONF]) && (strstr(r_ptr->name, "Chaos"))) scaryguy_on_level = TRUE; if (!borg_skill[BI_SRCONF] && (strstr(r_ptr->name, "Pukelman") || strstr(r_ptr->name, "Nightmare"))) scaryguy_on_level = TRUE; /* Poison is really Bad */ if (!borg_skill[BI_RPOIS] && /* Note the RPois not SRPois */ (strstr(r_ptr->name, "Drolem"))) scaryguy_on_level = TRUE; /* Now do distance considerations */ x9 = kill->x; y9 = kill->y; /* Distance components */ ax = (x9 > c_x) ? (x9 - c_x) : (c_x - x9); ay = (y9 > c_y) ? (y9 - c_y) : (c_y - y9); /* Distance */ d = MAX(ax, ay); /* if the guy is too far then skip it unless in town. */ if (d > dist && borg_skill[BI_CDEPTH]) continue; /* Special check here for Searching since we are * already scanning the monster list */ if (borg_needs_searching) { if (d < 7) borg_needs_searching = FALSE; } /*** Scan for Uniques ***/ /* this is a unique. */ if (rf_has(r_ptr->flags, RF_UNIQUE)) { /* Set a flag for use with certain types of spells */ unique_on_level = kill->r_idx; /* return 1 if not Morgy, +10 if it is Morgy or Sauron */ if (rf_has(r_ptr->flags, RF_QUESTOR)) { borg_fighting_unique += 10; } /* regular unique */ borg_fighting_unique ++; /* Note that fighting a Questor would result in a 11 value */ if (rf_has(r_ptr->flags, RF_EVIL)) borg_fighting_evil_unique = TRUE; } /*** Scan for Summoners ***/ if ((rsf_has(r_ptr->spell_flags, RSF_S_KIN)) || (rsf_has(r_ptr->spell_flags, RSF_S_HI_DEMON)) || (rsf_has(r_ptr->spell_flags, RSF_S_MONSTER)) || (rsf_has(r_ptr->spell_flags, RSF_S_MONSTERS)) || (rsf_has(r_ptr->spell_flags, RSF_S_ANIMAL)) || (rsf_has(r_ptr->spell_flags, RSF_S_SPIDER)) || (rsf_has(r_ptr->spell_flags, RSF_S_HOUND)) || (rsf_has(r_ptr->spell_flags, RSF_S_HYDRA)) || (rsf_has(r_ptr->spell_flags, RSF_S_AINU)) || (rsf_has(r_ptr->spell_flags, RSF_S_DEMON)) || (rsf_has(r_ptr->spell_flags, RSF_S_UNDEAD)) || (rsf_has(r_ptr->spell_flags, RSF_S_DRAGON)) || (rsf_has(r_ptr->spell_flags, RSF_S_HI_UNDEAD)) || (rsf_has(r_ptr->spell_flags, RSF_S_WRAITH)) || (rsf_has(r_ptr->spell_flags, RSF_S_UNIQUE)) ) { /* mark the flag */ borg_fighting_summoner = TRUE; /* recheck the distance to see if close * and mark the index for as-corridor */ if (d < 8) { borg_kills_summoner = i; } } } } /* * Help determine if "phase door" seems like a good idea */ bool borg_caution_phase(int emergency, int turns) { int n, k, i, d, x, y, p; int dis = 10; int min = dis / 2; borg_grid *ag= &borg_grids[c_y][c_x]; /* must have the ability */ if (!borg_skill[BI_APHASE]) return (FALSE); /* Simulate 100 attempts */ for (n = k = 0; k < 100; k++) { /* Pick a location */ for (i = 0; i < 100; i++) { /* Pick a (possibly illegal) location */ while (1) { y = rand_spread(c_y, dis); x = rand_spread(c_x, dis); d = distance(c_y, c_x, y, x); if ((d >= min) && (d <= dis)) break; } /* Ignore illegal locations */ if ((y <= 0) || (y >= AUTO_MAX_Y - 1)) continue; if ((x <= 0) || (x >= AUTO_MAX_X - 1)) continue; /* Access */ ag = &borg_grids[y][x]; /* Skip unknown grids */ if (ag->feat == FEAT_NONE) continue; /* Skip weird grids */ if (ag->feat == FEAT_INVIS) continue; /* Skip walls */ if (!borg_cave_floor_bold(y, x)) continue; /* Skip monsters */ if (ag->kill) continue; /* Stop looking */ break; } /* If low level, unknown squares are scary */ if (ag->feat == FEAT_NONE && borg_skill[BI_MAXHP] < 30) { n++; continue; } /* No location */ /* in the real code it would keep trying but here we should */ /* assume that there is unknown spots that you would be able */ /* to go but may be dangerious. */ if (i >= 100) { n++; continue; } /* Examine */ p = borg_danger(y, x, turns, TRUE, FALSE); /* if *very* scary, do not allow jumps at all */ if (p > borg_skill[BI_CURHP]) n++; } /* Too much danger */ /* in an emergency try with extra danger allowed */ if (n > emergency) { borg_note(format("# No Phase. scary squares: %d", n)); return (FALSE); } else borg_note(format("# Safe to Phase. scary squares: %d", n)); /* Okay */ return (TRUE); } /* * Help determine if "phase door" with Shoot N Scoot seems like * a good idea. * Good Idea on two levels: * 1. We are the right class, we got some good ranged weapons * 2. The possible landing grids are ok. * Almost a copy of the borg_caution_phase above. * The emergency is the number of dangerous grids out of 100 * that we tolerate. If we have 80, then we accept the risk * of landing on a grid that is 80% likely to be bad. A low * number, like 20, means that we are less like to risk the * phase door and we require more of the possible grids to be * safe. * * The pattern of ShootN'Scoot works like this: * 1. Shoot monster that is far away. * 2. Monsters walks closer and closer each turn * 3. Borg shoots monster each step it takes as it approaches. * 4. Monster gets within 1 grid of the borg. * 5. Borg phases away. * 6. Go back to #1 */ bool borg_shoot_scoot_safe(int emergency, int turns, int b_p) { int n, k, i, d, x, y, p, u; int dis = 10; int min = dis / 2; bool adjacent_monster = FALSE; borg_grid *ag; borg_kill *kill; monster_race *r_ptr; /* no need if high level in town */ if (borg_skill[BI_CLEVEL] >= 8 && borg_skill[BI_CDEPTH] == 0) return (FALSE); /* must have the ability */ if (!borg_skill[BI_APHASE]) return (FALSE); /* Not if No Light */ if (!borg_skill[BI_CURLITE]) return (FALSE); /* Cheat the floor grid */ /* Not if in a vault since it throws us out of the vault */ if (cave_isvault(cave, c_y, c_x)) return (FALSE); /*** Need Missiles or cheap spells ***/ /* Mage Priest */ if (borg_class == CLASS_MAGE || borg_class == CLASS_PRIEST) { /* Low mana */ if (borg_skill[BI_CLEVEL] >= 45 && borg_skill[BI_CURSP] < 15) return (FALSE); /* Low mana, low level, generally OK */ if (borg_skill[BI_CLEVEL] < 45 && borg_skill[BI_CURSP] < 5) return (FALSE); } else /* Other classes need some missiles */ { if (borg_skill[BI_AMISSILES] < 5 || borg_skill[BI_CLEVEL] >= 45) return (FALSE); } /* Not if I am in a safe spot for killing special monsters */ if (borg_morgoth_position || borg_as_position) return (FALSE); /* scan the adjacent grids for an awake monster */ for (i = 0; i < 8; i++) { /* Grid in that direction */ x = c_x + ddx_ddd[i]; y = c_y + ddy_ddd[i]; /* Access the grid */ ag = &borg_grids[y][x]; /* Obtain the monster */ kill = &borg_kills[ag->kill]; r_ptr = &r_info[kill->r_idx]; /* If a qualifying monster is adjacent to me. */ if ((ag->kill && kill->awake) && !(rf_has(r_ptr->flags, RF_NEVER_MOVE)) && !(rf_has(r_ptr->flags, RF_PASS_WALL)) && !(rf_has(r_ptr->flags, RF_KILL_WALL)) && (kill->power >= borg_skill[BI_CLEVEL])) { /* Spell casters shoot at everything */ if (borg_spell_okay(0, 0)) { adjacent_monster = TRUE; } else if (borg_prayer_okay(2, 1)) { adjacent_monster = TRUE; } /* All other borgs need to make sure he would shoot. * In an effort to conserve missiles, the borg will * not shoot at certain types of monsters. That list * is defined in borg_launch_damage_one(). * * We need this aforementioned list to match the one * following. Otherwise Rogues and Warriors will * burn up Phases as he scoots away but never fire * the missiles. That totally defeats the purpose * of this routine. * * The following criteria are exactly the same as the * list in borg_launch_damage_one() */ else if ((borg_danger_aux(kill->y,kill->x,1,i, TRUE, FALSE) > avoidance * 3/10) || ((r_ptr->friends || r_ptr->friends_base) /* monster has friends*/ && kill->level >= borg_skill[BI_CLEVEL] - 5 /* close levels */) || (kill->ranged_attack /* monster has a ranged attack */) || (rf_has(r_ptr->flags, RF_UNIQUE)) || (rf_has(r_ptr->flags, RF_MULTIPLY)) || (borg_skill[BI_CLEVEL] <= 5 /* stil very weak */)) { adjacent_monster = TRUE; } } } /* if No Adjacent_monster no need for it */ if (adjacent_monster == FALSE) return (FALSE); /* Simulate 100 attempts */ for (n = k = 0; k < 100; k++) { /* Pick a location */ for (i = 0; i < 100; i++) { /* Pick a (possibly illegal) location */ while (1) { y = rand_spread(c_y, dis); x = rand_spread(c_x, dis); d = distance(c_y, c_x, y, x); if ((d >= min) && (d <= dis)) break; } /* Ignore illegal locations */ if ((y <= 0) || (y >= AUTO_MAX_Y - 2)) continue; if ((x <= 0) || (x >= AUTO_MAX_X - 2)) continue; /* Access */ ag = &borg_grids[y][x]; /* Skip unknown grids */ if (ag->feat == FEAT_NONE) continue; /* Skip weird grids */ if (ag->feat == FEAT_INVIS) continue; /* Skip walls */ if (!borg_cave_floor_bold(y, x)) continue; /* Skip monsters */ if (ag->kill) continue; /* Stop looking. Really, the game would keep * looking for a grid. The borg could check * all the known grids but I dont think that * is not a good idea, especially if the area is * not fully explored. */ break; } /* No location */ /* In the real code it would keep trying but here we should */ /* assume that there is unknown spots that you would be able */ /* to go but we define it as dangerous. */ if (i >= 100) { n++; continue; } /* Examine danger of that grid */ p = borg_danger(y, x, turns, TRUE, FALSE); /* if more scary than my current one, do not allow jumps at all */ if (p > b_p) { n++; continue; } /* Should not land next to a monster either. * Scan the adjacent grids for a monster. * Reuse the adjacent_monster variable. */ for (u = 0; u < 8; u++) { /* Access the grid */ ag = &borg_grids[y+ddy_ddd[u]][x+ddx_ddd[u]]; /* Obtain the monster */ kill = &borg_kills[ag->kill]; /* If monster adjacent to that grid... */ if (ag->kill && kill->awake) n++; } } /* Too much danger */ /* in an emergency try with extra danger allowed */ if (n > emergency) { borg_note(format("# No Shoot'N'Scoot. scary squares: %d/100", n)); return (FALSE); } else borg_note(format("# Safe to Shoot'N'Scoot. scary squares: %d/100", n)); /* Okay */ return (TRUE); } /* * Help determine if "Teleport" seems like a good idea */ bool borg_caution_teleport(int emergency, int turns) { int n, k, i, d, x, y, p; int dis = 100; int min = dis / 2; int q_x, q_y; borg_grid *ag= &borg_grids[c_y][c_x]; /* Extract panel */ q_x = w_x / PANEL_WID; q_y = w_y / PANEL_HGT; /* must have the ability */ if (!borg_skill[BI_ATELEPORT] || !borg_skill[BI_AESCAPE]) return (FALSE); /* Simulate 100 attempts */ for (n = k = 0; k < 100; k++) { /* Pick a location */ for (i = 0; i < 100; i++) { /* Pick a (possibly illegal) location */ while (1) { y = rand_spread(c_y, dis); x = rand_spread(c_x, dis); d = distance(c_y, c_x, y, x); if ((d >= min) && (d <= dis)) break; } /* Ignore illegal locations */ if ((y <= 0) || (y >= AUTO_MAX_Y - 1)) continue; if ((x <= 0) || (x >= AUTO_MAX_X - 1)) continue; /* Access */ ag = &borg_grids[y][x]; /* Skip unknown grids if explored, or been on level for a while, otherwise, consider ok*/ if (ag->feat == FEAT_NONE && ((borg_detect_wall[q_y+0][q_x+0] == TRUE && borg_detect_wall[q_y+0][q_x+1] == TRUE && borg_detect_wall[q_y+1][q_x+0] == TRUE && borg_detect_wall[q_y+1][q_x+1] == TRUE) || borg_t > 2000)) continue; /* Skip weird grids */ if (ag->feat == FEAT_INVIS) continue; /* Skip walls */ if (!borg_cave_floor_bold(y, x)) continue; /* Skip monsters */ if (ag->kill) continue; /* Stop looking */ break; } /* If low level, unknown squares are scary */ if (ag->feat == FEAT_NONE && borg_skill[BI_MAXHP] < 30) { n++; continue; } /* No location */ /* in the real code it would keep trying but here we should */ /* assume that there is unknown spots that you would be able */ /* to go but may be dangerious. */ if (i >= 100) { n++; continue; } /* Examine */ p = borg_danger(y, x, turns, TRUE, FALSE); /* if *very* scary, do not allow jumps at all */ if (p > borg_skill[BI_CURHP]) n++; } /* Too much danger */ /* in an emergency try with extra danger allowed */ if (n > emergency) { borg_note(format("# No Teleport. scary squares: %d", n)); return (FALSE); } /* Okay */ return (TRUE); } /* * Hack -- If the borg is standing on a stair and is in some danger, just leave the level. * No need to hang around on that level, try conserving the teleport scrolls */ bool borg_escape_stair(void) { /* Current grid */ borg_grid *ag = &borg_grids[c_y][c_x]; /* Usable stairs */ if (ag->feat == FEAT_LESS) { /* Take the stairs */ borg_on_dnstairs = TRUE; borg_note("# Escaping level via stairs."); borg_keypress('<'); /* Success */ return (TRUE); } return (FALSE); } /* * Try to phase door or teleport * b_q is the danger of the least dangerious square around us. */ bool borg_escape(int b_q) { int risky_boost = 0; int j; int glyphs = 0; borg_grid *ag; /* only escape with spell if fail is low */ int allow_fail = 25; int sv_mana; /* if very healthy, allow extra fail */ if (((borg_skill[BI_CURHP]*100)/borg_skill[BI_MAXHP]) > 70) allow_fail = 10; /* comprimised, get out of the fight */ if (borg_skill[BI_ISHEAVYSTUN]) allow_fail = 35; /* for emergencies */ sv_mana = borg_skill[BI_CURSP]; /* Borgs who are bleeding to death or dying of poison may sometimes * phase around the last two hit points right before they enter a * shop. He knows to make a bee-line for the temple but the danger * trips this routine. So we must bypass this routine for some * particular circumstances. */ if (!borg_skill[BI_CDEPTH] && (borg_skill[BI_ISPOISONED] || borg_skill[BI_ISWEAK] || borg_skill[BI_ISCUT])) return (FALSE); /* Borgs who are in a sea of runes or trying to build one * and mostly healthy stay put */ if ((borg_skill[BI_CDEPTH] == 100) && borg_skill[BI_CURHP] >= (borg_skill[BI_MAXHP] * 5 / 10)) { /* In a sea of runes */ if (borg_morgoth_position) return (FALSE); /* Scan neighbors */ for (j = 0; j < 8; j++) { int y = c_y + ddy_ddd[j]; int x = c_x + ddx_ddd[j]; /* Get the grid */ ag = &borg_grids[y][x]; /* Skip unknown grids (important) */ if (ag->feat == FEAT_GLYPH) glyphs++; } /* Touching at least 3 glyphs */ if (glyphs >= 3) return (FALSE); } /* Hack -- If the borg is weak (no food, starving) on depth 1 and he has no idea where the stairs * may be, run the risk of diving deeper against the benefit of rising to town. */ if (borg_skill[BI_ISWEAK] && borg_skill[BI_CDEPTH] == 1) { if (borg_read_scroll(SV_SCROLL_TELEPORT_LEVEL)) { borg_note("# Attempting to get to town immediately"); return (TRUE); } } /* Risky borgs are more likely to stay in a fight */ if (borg_plays_risky) risky_boost = 3; /* 1. really scary, I'm about to die */ /* Try an emergency teleport, or phase door as last resort */ if ( borg_skill[BI_ISHEAVYSTUN] || (b_q > avoidance * (45+risky_boost)/10) || ((b_q > avoidance * (40+risky_boost)/10) && borg_fighting_unique >=10 && borg_skill[BI_CDEPTH] == 100 && borg_skill[BI_CURHP] < 600) || ((b_q > avoidance * (30+risky_boost)/10) && borg_fighting_unique >=10 && borg_skill[BI_CDEPTH] == 99 && borg_skill[BI_CURHP] < 600) || ((b_q > avoidance * (25+risky_boost)/10) && borg_fighting_unique >=1 && borg_fighting_unique <=8 && borg_skill[BI_CDEPTH] >= 95 && borg_skill[BI_CURHP] < 550) || ((b_q > avoidance * (17+risky_boost)/10) && borg_fighting_unique >=1 && borg_fighting_unique <=8 && borg_skill[BI_CDEPTH] < 95) || ((b_q > avoidance * (15+risky_boost)/10) && !borg_fighting_unique) ) { int allow_fail = 15; if (borg_escape_stair() || borg_spell_fail(1, 5, allow_fail-10) || borg_prayer_fail(1, 1, allow_fail-10) || borg_prayer_fail(4, 1, allow_fail-10) || borg_read_scroll(SV_SCROLL_TELEPORT) || borg_read_scroll(SV_SCROLL_TELEPORT_LEVEL) || borg_use_staff_fail(SV_STAFF_TELEPORTATION) || borg_activate_artifact(EF_TELE_LONG) || /* revisit spells, increased fail rate */ borg_spell_fail(1, 5, allow_fail + 9) || borg_prayer_fail(1, 1, allow_fail + 9) || borg_prayer_fail(4, 1, allow_fail + 9) || /* revisit teleport, increased fail rate */ borg_use_staff(SV_STAFF_TELEPORTATION) || /* Attempt Teleport Level */ borg_spell_fail(6, 2, allow_fail + 9) || borg_prayer_fail(4, 3, allow_fail + 9) || /* try phase at least, with some hedging of the safety of landing zone */ (borg_caution_phase(75, 2) && (borg_read_scroll(SV_SCROLL_PHASE_DOOR) || borg_activate_artifact(EF_TELE_PHASE)|| borg_spell_fail(0, 2, allow_fail) || borg_prayer_fail(4, 0, allow_fail))) ) { /* Flee! */ borg_note("# Danger Level 1."); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; return (TRUE); } borg_skill[BI_CURSP] = borg_skill[BI_MAXSP]; /* try to teleport, get far away from here */ if (borg_skill[BI_CDEPTH] && borg_skill[BI_CLEVEL] < 10 && (borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] * 1 / 10) && (borg_prayer(1, 1) || borg_prayer(4, 1) || borg_spell(1, 5))) { /* verify use of spell */ /* borg_keypress('y'); */ /* Flee! */ borg_note("# Danger Level 1.1 Critical Attempt"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; return (TRUE); } /* emergency phase activation no concern for safety of landing zone. */ if (borg_skill[BI_CDEPTH] && ((borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] * 1 / 10 || b_q > avoidance * (45+risky_boost)/10) && (borg_activate_artifact(EF_TELE_PHASE) || borg_read_scroll(SV_SCROLL_PHASE_DOOR)))) { /* Flee! */ borg_escapes--; /* a phase isn't really an escape */ borg_note("# Danger Level 1.2 Critical Phase"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; return (TRUE); } /* emergency phase spell */ if (borg_skill[BI_CDEPTH] && borg_skill[BI_CLEVEL] < 10 && (borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] * 1 / 10) && ((borg_spell_fail(0, 2, 15) || borg_prayer(4, 0)))) { /* verify use of spell */ /* borg_keypress('y'); */ /* Flee! */ borg_note("# Danger Level 1.3 Critical Attempt"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; return (TRUE); } /* Restore the real mana level */ borg_skill[BI_CURSP] = sv_mana; } /* If fighting a unique and at the end of the game try to stay and * finish the fight. Only bail out in extreme danger as above. */ if (b_q < avoidance * (25+risky_boost)/10 && borg_fighting_unique >=1 && borg_fighting_unique <=3 && borg_skill[BI_CDEPTH] >= 97) return (FALSE); /* 2 - a bit more scary/ * Attempt to teleport (usually) * do not escape from uniques so quick */ if ( borg_skill[BI_ISHEAVYSTUN] || ((b_q > avoidance * (3+risky_boost)/10) && borg_class == CLASS_MAGE && borg_skill[BI_CURSP] <= 20 && borg_skill[BI_MAXCLEVEL] >= 45) || ((b_q > avoidance * (13+risky_boost)/10) && borg_fighting_unique >=1 && borg_fighting_unique <= 8 && borg_skill[BI_CDEPTH] != 99) || ((b_q > avoidance * (11+risky_boost)/10) && !borg_fighting_unique) ) { /* Try teleportation */ if ( borg_escape_stair() || borg_spell_fail(1, 5, allow_fail -10 ) || borg_prayer_fail(4, 1, allow_fail- 10) || borg_prayer_fail(1, 1, allow_fail - 10) || borg_use_staff_fail(SV_STAFF_TELEPORTATION) || borg_activate_artifact(EF_TELE_LONG) || borg_read_scroll(SV_SCROLL_TELEPORT) || borg_read_scroll(SV_SCROLL_TELEPORT_LEVEL) || borg_spell_fail(1, 5, allow_fail) || borg_prayer_fail(4, 1, allow_fail) || borg_prayer_fail(1, 1, allow_fail) || borg_use_staff(SV_STAFF_TELEPORTATION)) { /* Flee! */ borg_note("# Danger Level 2.1"); /* Success */ /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; return (TRUE); } /* Phase door, if useful */ if (borg_caution_phase(50, 2) && borg_t - borg_t_antisummon > 50 && (borg_spell(0, 2) || borg_prayer(4, 0) || borg_read_scroll(SV_SCROLL_PHASE_DOOR) || borg_activate_artifact(EF_TELE_PHASE)|| borg_activate_artifact(EF_TELE_LONG) )) { /* Flee! */ borg_note("# Danger Level 2.2"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } } /* 3- not too bad */ /* also run if stunned or it is scary here */ if ( borg_skill[BI_ISHEAVYSTUN] || ((b_q > avoidance * (13+risky_boost)/10) && borg_fighting_unique >=2 && borg_fighting_unique <= 8) || ((b_q > avoidance * (10+risky_boost)/10) && !borg_fighting_unique) || ((b_q > avoidance * (10+risky_boost)/10) && borg_skill[BI_ISAFRAID] && (borg_skill[BI_AMISSILES] <=0 && borg_class == CLASS_WARRIOR) )) { /* Phase door, if useful */ if ((borg_escape_stair() || borg_caution_phase(25, 2)) && borg_t - borg_t_antisummon > 50 && (borg_spell_fail(0, 2, allow_fail) || borg_prayer_fail(4, 0, allow_fail) || borg_activate_artifact(EF_TELE_PHASE)|| borg_activate_artifact(EF_TELE_LONG) || borg_read_scroll(SV_SCROLL_PHASE_DOOR))) { /* Flee! */ borg_escapes--; /* a phase isn't really an escape */ borg_note("# Danger Level 3.1"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } /* Teleport via spell */ if ( borg_spell_fail(1, 5, allow_fail) || borg_prayer_fail(1, 1, allow_fail) || borg_prayer_fail(4, 1, allow_fail) || borg_activate_artifact(EF_TELE_LONG) || borg_activate_artifact(EF_TELE_PHASE)|| borg_use_staff_fail(SV_STAFF_TELEPORTATION) || borg_read_scroll(SV_SCROLL_TELEPORT)) { /* Flee! */ borg_note("# Danger Level 3.2"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } /* Phase door, if useful */ if (borg_caution_phase(75, 2) && borg_t - borg_t_antisummon > 50 && (borg_spell_fail(0, 2, allow_fail) || borg_prayer_fail(4, 0, allow_fail) || borg_activate_artifact(EF_TELE_PHASE)|| borg_activate_artifact(EF_TELE_LONG) || borg_read_scroll(SV_SCROLL_PHASE_DOOR))) { /* Flee! */ borg_escapes--; /* a phase isn't really an escape */ borg_note("# Danger Level 3.3"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } /* Use Tport Level after the above attempts failed. */ if (borg_read_scroll(SV_SCROLL_TELEPORT_LEVEL)) { /* Flee! */ borg_note("# Danger Level 3.4"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } /* if we got this far we tried to escape but couldn't... */ /* time to flee */ if (!goal_fleeing && (!borg_fighting_unique || borg_skill[BI_CLEVEL] < 35) && !vault_on_level) { /* Note */ borg_note("# Fleeing (failed to teleport)"); /* Start fleeing */ goal_fleeing = TRUE; } /* Flee now */ if (!goal_leaving && (!borg_fighting_unique || borg_skill[BI_CLEVEL] < 35) && !vault_on_level) { /* Flee! */ borg_note("# Leaving (failed to teleport)"); /* Start leaving */ goal_leaving = TRUE; } } /* 4- not too scary but I'm comprimized */ if ( (b_q > avoidance * (8+risky_boost)/10 && (borg_skill[BI_CLEVEL] < 35 || borg_skill[BI_CURHP] <= borg_skill[BI_MAXHP] / 3)) || ((b_q > avoidance * (9+risky_boost)/10) && borg_fighting_unique >=1 && borg_fighting_unique <= 8 && (borg_skill[BI_CLEVEL] < 35 || borg_skill[BI_CURHP] <= borg_skill[BI_MAXHP] /3 )) || ((b_q > avoidance * (6+risky_boost)/10) && borg_skill[BI_CLEVEL] <= 20 && !borg_fighting_unique) || ((b_q > avoidance * (6+risky_boost)/10) && borg_skill[BI_CLEVEL] <= 35)) { /* Phase door, if useful */ if ((borg_escape_stair() || borg_caution_phase(20, 2)) && borg_t - borg_t_antisummon > 50 && (borg_spell_fail(0, 2, allow_fail) || borg_prayer_fail(4, 0, allow_fail) || borg_activate_artifact(EF_TELE_PHASE)|| borg_activate_artifact(EF_TELE_LONG) || borg_read_scroll(SV_SCROLL_PHASE_DOOR) )) { /* Flee! */ borg_escapes--; /* a phase isn't really an escape */ borg_note("# Danger Level 4.1"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } /* Teleport via spell */ if ( borg_spell_fail(1, 5, allow_fail) || borg_prayer_fail(1, 1, allow_fail) || borg_prayer_fail(4, 1, allow_fail) || borg_activate_artifact(EF_TELE_LONG) || borg_activate_artifact(EF_TELE_PHASE)|| borg_read_scroll(SV_SCROLL_TELEPORT) || borg_use_staff_fail(SV_STAFF_TELEPORTATION) ) { /* Flee! */ borg_note("# Danger Level 4.2"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } /* if we got this far we tried to escape but couldn't... */ /* time to flee */ if (!goal_fleeing && !borg_fighting_unique && borg_skill[BI_CLEVEL] < 25 && !vault_on_level) { /* Note */ borg_note("# Fleeing (failed to teleport)"); /* Start fleeing */ goal_fleeing = TRUE; } /* Flee now */ if (!goal_leaving && !borg_fighting_unique && !vault_on_level) { /* Flee! */ borg_note("# Leaving (failed to teleport)"); /* Start leaving */ goal_leaving = TRUE; } /* Emergency Phase door if a weak mage */ if ((borg_class == CLASS_MAGE && borg_skill[BI_CLEVEL] <=35 ) && borg_caution_phase(65, 2) && borg_t - borg_t_antisummon > 50 && (borg_spell_fail(0, 2, allow_fail) || borg_prayer_fail(4, 0, allow_fail) || borg_activate_artifact(EF_TELE_PHASE)|| borg_activate_artifact(EF_TELE_LONG) || borg_read_scroll(SV_SCROLL_PHASE_DOOR) )) { /* Flee! */ borg_escapes--; /* a phase isn't really an escape */ borg_note("# Danger Level 4.3"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } } /* 5- not too scary but I'm very low level */ if ( borg_skill[BI_CLEVEL] < 10 && (b_q > avoidance * (5+risky_boost) /10 || (b_q > avoidance * (7+risky_boost)/10 && borg_fighting_unique >=1 && borg_fighting_unique <= 8))) { /* Phase door, if useful */ if ((borg_escape_stair() || borg_caution_phase(20,2)) && (borg_spell_fail(0, 2, allow_fail) || borg_prayer_fail(4, 0, allow_fail) || borg_activate_artifact(EF_TELE_PHASE)|| borg_activate_artifact(EF_TELE_LONG) || borg_read_scroll(SV_SCROLL_PHASE_DOOR) )) { /* Flee! */ borg_note("# Danger Level 5.1"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } /* Teleport via spell */ if ( borg_spell_fail(1, 5, allow_fail) || borg_prayer_fail(1, 1, allow_fail) || borg_prayer_fail(4, 1, allow_fail) || borg_activate_artifact(EF_TELE_LONG) || borg_activate_artifact(EF_TELE_PHASE)|| borg_read_scroll(SV_SCROLL_TELEPORT) || borg_use_staff_fail(SV_STAFF_TELEPORTATION) ) { /* Flee! */ borg_note("# Danger Level 5.2"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } /* if we got this far we tried to escape but couldn't... */ /* time to flee */ if (!goal_fleeing && !borg_fighting_unique) { /* Note */ borg_note("# Fleeing (failed to teleport)"); /* Start fleeing */ goal_fleeing = TRUE; } /* Flee now */ if (!goal_leaving && !borg_fighting_unique) { /* Flee! */ borg_note("# Leaving (failed to teleport)"); /* Start leaving */ goal_leaving = TRUE; } /* Emergency Phase door if a weak mage */ if ((borg_class == CLASS_MAGE && borg_skill[BI_CLEVEL] <=8 ) && borg_caution_phase(65, 2) && (borg_spell_fail(0, 2, allow_fail) || borg_prayer_fail(4, 0, allow_fail) || borg_activate_artifact(EF_TELE_PHASE)|| borg_activate_artifact(EF_TELE_LONG) || borg_read_scroll(SV_SCROLL_PHASE_DOOR) )) { /* Flee! */ borg_escapes--; /* a phase isn't really an escape */ borg_note("# Danger Level 5.3"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } } /* 6- not too scary but I'm out of mana */ if ( (borg_class == CLASS_MAGE || borg_class == CLASS_PRIEST) && (b_q > avoidance * (6+risky_boost) /10 || (b_q > avoidance * (8+risky_boost)/10 && borg_fighting_unique >=1 && borg_fighting_unique <= 8)) && (borg_skill[BI_CURSP] <= (borg_skill[BI_MAXSP] * 1 / 10) && borg_skill[BI_MAXSP] >= 100)) { /* Phase door, if useful */ if ((borg_escape_stair() || borg_caution_phase(20,2)) && borg_t - borg_t_antisummon > 50 && (borg_spell_fail(0, 2, allow_fail) || borg_prayer_fail(4, 0, allow_fail) || borg_activate_artifact(EF_TELE_PHASE)|| borg_activate_artifact(EF_TELE_LONG) || borg_read_scroll(SV_SCROLL_PHASE_DOOR) )) { /* Flee! */ borg_note("# Danger Level 6.1"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } /* Teleport via spell */ if ( borg_spell_fail(1, 5, allow_fail) || borg_prayer_fail(1, 1, allow_fail) || borg_prayer_fail(4, 1, allow_fail) || borg_activate_artifact(EF_TELE_LONG) || borg_activate_artifact(EF_TELE_PHASE)|| borg_read_scroll(SV_SCROLL_TELEPORT) || borg_use_staff_fail(SV_STAFF_TELEPORTATION) ) { /* Flee! */ borg_note("# Danger Level 6.2"); /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } } /* 7- Shoot N Scoot */ if ((borg_spell_okay_fail(0, 2, allow_fail) || borg_prayer_okay_fail(4, 0, allow_fail)) && borg_shoot_scoot_safe(20, 2, b_q)) { /* Phase door */ if (borg_spell_fail(0, 2, allow_fail) || borg_prayer_fail(4, 0, allow_fail)) { /* Flee! */ borg_note("# Shoot N Scoot. (Danger Level 7.1)"); borg_escapes--; /* a phase isn't really an escape */ /* Reset timer if borg was in a anti-summon corridor */ if (borg_t - borg_t_antisummon < 50) borg_t_antisummon = 0; /* Success */ return (TRUE); } } return (FALSE); } /* * ** Try healing ** * this function tries to heal the borg before trying to flee. * The ez_heal items (*Heal* and Life) are reserved for Morgoth. * In severe emergencies the borg can drink an ez_heal item but that is * checked in borg_caution(). He should bail out of the fight before * using an ez_heal. */ static bool borg_heal(int danger ) { int hp_down; int pct_down; int allow_fail = 15; int chance; int clw_heal = 15; int csw_heal = 25; int ccw_heal = 30; int cmw_heal = 50; int heal_heal = 300; int stats_needing_fix = 0; bool rod_good = FALSE; hp_down = borg_skill[BI_MAXHP] - borg_skill[BI_CURHP]; pct_down = ((borg_skill[BI_MAXHP] - borg_skill[BI_CURHP]) * 100 / borg_skill[BI_MAXHP]); clw_heal = ((borg_skill[BI_MAXHP] - borg_skill[BI_CURHP]) * 15 / 100); csw_heal = ((borg_skill[BI_MAXHP] - borg_skill[BI_CURHP]) * 20 / 100); ccw_heal = ((borg_skill[BI_MAXHP] - borg_skill[BI_CURHP]) * 25 / 100); cmw_heal = ((borg_skill[BI_MAXHP] - borg_skill[BI_CURHP]) * 30 / 100); heal_heal = ((borg_skill[BI_MAXHP] - borg_skill[BI_CURHP]) * 35 / 100); if (clw_heal < 15) clw_heal = 15; if (csw_heal < 25) csw_heal = 25; if (ccw_heal < 30) ccw_heal = 30; if (cmw_heal < 50) cmw_heal = 50; if (heal_heal < 300) heal_heal = 300; /* Quick check for rod success (used later on) */ if (borg_slot(TV_ROD, SV_ROD_HEALING) != -1) { /* Reasonable chance of success */ if (borg_activate_failure(TV_ROD, SV_ROD_HEALING) < 500) rod_good = TRUE; } /* when fighting Morgoth, we want the borg to use Life potion to fix his * stats. So we need to add up the ones that are dropped. */ if (borg_skill[BI_ISFIXSTR]) stats_needing_fix ++; if (borg_skill[BI_ISFIXINT]) stats_needing_fix ++; if (borg_skill[BI_ISFIXWIS]) stats_needing_fix ++; if (borg_skill[BI_ISFIXDEX]) stats_needing_fix ++; if (borg_skill[BI_ISFIXCON]) stats_needing_fix ++; /* Special cases get a second vote */ if (borg_class == CLASS_MAGE && borg_skill[BI_ISFIXINT]) stats_needing_fix ++; if (borg_class == CLASS_PRIEST && borg_skill[BI_ISFIXWIS]) stats_needing_fix ++; if (borg_class == CLASS_WARRIOR && borg_skill[BI_ISFIXCON]) stats_needing_fix ++; if (borg_skill[BI_MAXHP] <= 850 && borg_skill[BI_ISFIXCON]) stats_needing_fix ++; if (borg_skill[BI_MAXHP] <= 700 && borg_skill[BI_ISFIXCON]) stats_needing_fix += 3; if (borg_class == CLASS_PRIEST && borg_skill[BI_MAXSP] < 100 && borg_skill[BI_ISFIXWIS]) stats_needing_fix +=5; if (borg_class == CLASS_MAGE && borg_skill[BI_MAXSP] < 100 && borg_skill[BI_ISFIXINT]) stats_needing_fix +=5; /* Hack -- heal when confused. This is deadly.*/ /* This is checked twice, once, here, to see if he is in low danger * and again at the end of borg_caution, when all other avenues have failed */ if (borg_skill[BI_ISCONFUSED]) { if ((pct_down >= 80) && danger - heal_heal < borg_skill[BI_CURHP] && borg_quaff_potion(SV_POTION_HEALING)) { borg_note("# Fixing Confusion. Level 1"); return (TRUE); } if ((pct_down >= 85) && danger >= borg_skill[BI_CURHP] * 2 && (borg_quaff_potion(SV_POTION_STAR_HEALING) || borg_quaff_potion(SV_POTION_LIFE))) { borg_note("# Fixing Confusion. Level 1.a"); return (TRUE); } if (danger < borg_skill[BI_CURHP] + csw_heal && (borg_eat_food(SV_FOOD_CURE_MIND) || borg_quaff_potion(SV_POTION_CURE_SERIOUS) || borg_quaff_crit(FALSE) || borg_quaff_potion(SV_POTION_HEALING) || borg_use_staff_fail(SV_STAFF_HEALING) || borg_use_staff_fail(SV_STAFF_CURING))) { borg_note("# Fixing Confusion. Level 2"); return (TRUE); } /* If my ability to use a teleport staff is really * bad, then I should heal up then use the staff. */ /* Check for a charged teleport staff */ if (borg_equips_staff_fail(SV_STAFF_TELEPORTATION)) { /* check my skill, drink a potion */ if ((borg_activate_failure(TV_STAFF, SV_STAFF_TELEPORTATION) > 650) && (danger < (avoidance + ccw_heal) * 15 / 10) && (borg_quaff_crit(TRUE) || borg_quaff_potion(SV_POTION_HEALING))) { borg_note("# Fixing Confusion. Level 3"); return (TRUE); } /* However, if I am in really big trouble and there is no way * I am going to be able to * survive another round, take my chances on the staff. */ else if (danger > avoidance * 2) { borg_note("# Too scary to fix Confusion. Level 4"); return (FALSE); } } else { /* If I do not have a staff to teleport, take the potion * and try to fix the confusion */ if ((borg_quaff_crit(TRUE) || borg_quaff_potion(SV_POTION_CURE_SERIOUS) || borg_quaff_potion(SV_POTION_HEALING))) { borg_note("# Fixing Confusion. Level 5"); return (TRUE); } } } /* Hack -- heal when blind. This is deadly.*/ if (borg_skill[BI_ISBLIND] && (randint0(100) < 85)) { /* if in extreme danger, use teleport then fix the * blindness later. */ if (danger > avoidance * 25/10) { /* Check for a charged teleport staff */ if (borg_equips_staff_fail(SV_STAFF_TELEPORTATION)) return (0); } if ((hp_down >= 300) && borg_quaff_potion(SV_POTION_HEALING)) { return (TRUE); } /* Warriors with ESP won't need it so quickly */ if (!(borg_class == CLASS_WARRIOR && borg_skill[BI_CURHP] > borg_skill[BI_MAXHP] /4 && borg_skill[BI_ESP])) { if (borg_eat_food(SV_FOOD_FAST_RECOVERY) || borg_quaff_potion(SV_POTION_CURE_LIGHT) || borg_quaff_potion(SV_POTION_CURE_SERIOUS) || borg_quaff_crit(TRUE) || borg_use_staff_fail(SV_STAFF_HEALING) || borg_use_staff_fail(SV_STAFF_CURING) || borg_quaff_potion(SV_POTION_HEALING)) { borg_note("# Fixing Blindness."); return (TRUE); } } } /* We generally try to conserve ez-heal pots */ if ((borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED]) && ((hp_down >= 400) || (danger > borg_skill[BI_CURHP] *5 && hp_down > 100)) && borg_quaff_potion(SV_POTION_STAR_HEALING)) { borg_note("# Fixing Confusion/Blind."); return (TRUE); } /* Healing and fighting Morgoth. */ if (borg_fighting_unique >= 10) { if (borg_skill[BI_CURHP] <= 700 && ((borg_skill[BI_CURHP] > 250 && borg_prayer_fail(3,5, 14)) || /* Holy Word */ /* Choose Life over *Healing* to fix stats*/ (stats_needing_fix >= 5 && borg_quaff_potion(SV_POTION_LIFE)) || /* Choose Life over Healing if way down on pts*/ (hp_down > 500 && borg_has[borg_lookup_kind(TV_POTION, SV_POTION_STAR_HEALING)] <= 0 && borg_quaff_potion(SV_POTION_LIFE)) || borg_quaff_potion(SV_POTION_STAR_HEALING) || borg_quaff_potion(SV_POTION_HEALING) || (borg_skill[BI_CURHP] < 250 && borg_prayer_fail(3,5, 5)) || /* Holy Word */ (borg_skill[BI_CURHP] > 550 && borg_prayer_fail(3,5, 15)) || /* Holy Word */ borg_prayer_fail(6, 2, 15) || borg_prayer_fail(3, 2, 15) || borg_quaff_potion(SV_POTION_LIFE) || borg_zap_rod(SV_ROD_HEALING))) { borg_note("# Healing in Questor Combat."); return (TRUE); } } /* restore Mana */ /* note, blow the staff charges easy because the staff will not last. */ if (borg_skill[BI_CURSP] < (borg_skill[BI_MAXSP] / 5) && (randint0(100) < 50)) { if (borg_use_staff_fail(SV_STAFF_THE_MAGI)) { borg_note("# Use Magi Staff"); return (TRUE); } } /* blowing potions is harder */ /* NOTE: must have enough mana to keep up or do a HEAL */ if (borg_skill[BI_CURSP] < (borg_skill[BI_MAXSP] / 10) || ((borg_skill[BI_CURSP] < 70 && borg_skill[BI_MAXSP] > 200) ) ) { /* use the potion if battling a unique and not too dangerous */ if (borg_fighting_unique >= 10 || (borg_fighting_unique && danger < avoidance *2) || (borg_skill[BI_ATELEPORT] + borg_skill[BI_AESCAPE] == 0 && danger > avoidance)) { if (borg_use_staff_fail(SV_STAFF_THE_MAGI) || borg_quaff_potion(SV_POTION_RESTORE_MANA)) { borg_note("# Restored My Mana"); return (TRUE); } } } /* if unhurt no healing needed */ if (hp_down == 0) return FALSE; /* Don't bother healing if not in danger */ if (danger == 0 && !borg_skill[BI_ISPOISONED] && !borg_skill[BI_ISCUT]) return (FALSE); /* Restoring while fighting Morgoth */ if (stats_needing_fix >=5 && borg_fighting_unique >= 10 && borg_skill[BI_CURHP] > 650 && borg_eat_food(SV_FOOD_RESTORING)) { borg_note("# Trying to fix stats in combat."); return(TRUE); } /* No further Healing considerations if fighting Questors */ if (borg_fighting_unique >= 10) { /* No further healing considerations right now */ return (FALSE); } /* Hack -- heal when wounded a percent of the time */ chance = randint0(100); /* if we are fighting a unique increase the odds of healing */ if (borg_fighting_unique) chance -= 10; /* if danger is close to the hp and healing will help, do it */ if (danger >= borg_skill[BI_CURHP] && danger < borg_skill[BI_MAXHP] ) chance -= 75; else { if (borg_class != CLASS_PRIEST && borg_class != CLASS_PALADIN) chance -= 25; } /* Risky Borgs are less likely to heal in the fight */ if (borg_plays_risky) chance += 5; if (((pct_down <= 15 && chance < 98) || (pct_down >= 16 && pct_down <= 25 && chance < 95) || (pct_down >= 26 && pct_down <= 50 && chance < 80) || (pct_down >= 51 && pct_down <= 65 && chance < 50) || (pct_down >= 66 && pct_down <= 74 && chance < 25) || (pct_down >= 75 && chance < 1)) && (!borg_skill[BI_ISHEAVYSTUN] && !borg_skill[BI_ISSTUN] && !borg_skill[BI_ISPOISONED] && !borg_skill[BI_ISCUT])) return FALSE; /* Cure light Wounds (2d10) */ if ( pct_down >= 30 && (pct_down <= 40 || borg_skill[BI_CLEVEL] < 10) && ((danger) < borg_skill[BI_CURHP] + clw_heal) && (clw_heal > danger / 3) && /* No rope-a-doping */ (borg_prayer_fail(0, 1, allow_fail) || borg_spell_fail(0,5,allow_fail) || borg_quaff_potion(SV_POTION_CURE_LIGHT) || borg_activate_artifact(EF_CURE_LIGHT) ) ) { borg_note("# Healing Level 1."); return (TRUE); } /* Cure Serious Wounds (4d10) */ if ( pct_down >= 40 && (pct_down <= 50 || borg_skill[BI_CLEVEL] < 20) && ((danger) < borg_skill[BI_CURHP]+ csw_heal) && (csw_heal > danger / 3) && /* No rope-a-doping */ (borg_prayer_fail(1, 2, allow_fail) || borg_quaff_potion(SV_POTION_CURE_SERIOUS) || borg_activate_artifact(EF_CURE_SERIOUS))) { borg_note("# Healing Level 2."); return (TRUE); } /* Cure Critical Wounds (6d10) */ if ( pct_down >= 50 && pct_down <= 55 && ((danger) < borg_skill[BI_CURHP] + ccw_heal) && (ccw_heal > danger / 3) && /* No rope-a-doping */ (borg_prayer_fail(2, 2, allow_fail) || borg_prayer_fail(6, 0, allow_fail) || borg_activate_artifact(EF_CURE_CRITICAL) || borg_quaff_crit(FALSE))) { borg_note("# Healing Level 3."); return (TRUE); } /* Cure Mortal Wounds (8d10) */ if ( pct_down >= 50 && ((danger) < borg_skill[BI_CURHP] + cmw_heal) && (cmw_heal > danger / 3) && /* No rope-a-doping */ (borg_prayer_fail(2, 7, allow_fail) || borg_prayer_fail(6, 1, allow_fail))) { borg_note("# Healing Level 4."); return (TRUE); } /* If in danger try one more Cure Critical if it will help */ if (danger >= borg_skill[BI_CURHP] && danger < borg_skill[BI_MAXHP] && borg_skill[BI_CURHP] < 50 && danger < ccw_heal && borg_quaff_crit(TRUE)) { borg_note("# Healing Level 5."); return (TRUE); } /* Heal step one (200hp) */ if (pct_down >= 55 && danger < borg_skill[BI_CURHP] + heal_heal && ( (((!borg_skill[BI_ATELEPORT] && !borg_skill[BI_AESCAPE]) || rod_good ) && borg_zap_rod(SV_ROD_HEALING)) || borg_activate_artifact(EF_HEAL1) || borg_activate_artifact(EF_HEAL2) || borg_use_staff_fail(SV_STAFF_HEALING) || borg_prayer_fail(3, 2, allow_fail))) { borg_note("# Healing Level 6."); return (TRUE); } /* Generally continue to heal. But if we are preparing for the end * game uniques, then bail out here in order to save our heal pots. * (unless morgoth is dead) * Priests wont need to bail, they have good heal spells. */ if (borg_skill[BI_MAXDEPTH] >=98 && !borg_skill[BI_KING] && !borg_fighting_unique && borg_class != CLASS_PRIEST) { /* Bail out to save the heal pots for Morgoth*/ return (FALSE); } /* Heal step two (300hp) */ if (pct_down > 50 && danger < borg_skill[BI_CURHP] + heal_heal && (borg_use_staff_fail(SV_STAFF_HEALING) || (borg_fighting_evil_unique && borg_prayer_fail(3,5, allow_fail)) || /* holy word */ borg_prayer_fail(3, 2, allow_fail) || (((!borg_skill[BI_ATELEPORT] && !borg_skill[BI_AESCAPE]) || rod_good ) && borg_zap_rod(SV_ROD_HEALING)) || borg_zap_rod(SV_ROD_HEALING) || borg_quaff_potion(SV_POTION_HEALING) )) { borg_note("# Healing Level 7."); return (TRUE); } /* Healing step three (300hp). */ if (pct_down > 60 && danger < borg_skill[BI_CURHP]+ heal_heal && ((borg_fighting_evil_unique && borg_prayer_fail(3,5, allow_fail)) || /* holy word */ (((!borg_skill[BI_ATELEPORT] && !borg_skill[BI_AESCAPE]) || rod_good) && borg_zap_rod(SV_ROD_HEALING)) || borg_prayer_fail(6, 2, allow_fail) || borg_prayer_fail(3, 2, allow_fail) || borg_use_staff_fail(SV_STAFF_HEALING) || borg_quaff_potion(SV_POTION_HEALING) || borg_activate_artifact(EF_HEAL1) || borg_activate_artifact(EF_HEAL2)) ) { borg_note("# Healing Level 8."); return (TRUE); } /* Healing. First use of EZ_Heals */ if (pct_down > 65 && (danger < borg_skill[BI_CURHP] + heal_heal) && ((borg_fighting_evil_unique && borg_prayer_fail(3,5, allow_fail)) || /* holy word */ borg_prayer_fail(6, 2, allow_fail) || borg_prayer_fail(3, 2, allow_fail) || borg_use_staff_fail(SV_STAFF_HEALING) || (((!borg_skill[BI_ATELEPORT] && !borg_skill[BI_AESCAPE]) || rod_good) && borg_zap_rod(SV_ROD_HEALING)) || borg_quaff_potion(SV_POTION_HEALING) || borg_activate_artifact(EF_HEAL1) || borg_activate_artifact(EF_HEAL2) || (borg_fighting_unique && (borg_quaff_potion(SV_POTION_STAR_HEALING) || borg_quaff_potion(SV_POTION_HEALING) || borg_quaff_potion(SV_POTION_LIFE))))) { borg_note("# Healing Level 9."); return (TRUE); } /* Healing final check. Note that *heal* and Life potions are not * wasted. They are saved for Morgoth and emergencies. The * Emergency check is at the end of borg_caution() which is after the * borg_escape() routine. */ if (pct_down > 75 && danger > borg_skill[BI_CURHP] && borg_skill[BI_ATELEPORT] + borg_skill[BI_AESCAPE] <= 0 && (borg_quaff_potion(SV_POTION_HEALING) || borg_quaff_potion(SV_POTION_STAR_HEALING) || borg_quaff_potion(SV_POTION_LIFE))) { borg_note("# Healing Level 10."); return (TRUE); } /*** Cures ***/ /* Dont do these in the middle of a fight, teleport out then try it */ if (danger > avoidance * 2 / 10) return (FALSE); /* Hack -- cure poison when poisoned * This was moved from borg_caution. */ if (borg_skill[BI_ISPOISONED] && (borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 2)) { if (borg_spell_fail(1, 3, 60) || borg_prayer_fail(2, 0, 60) || borg_quaff_potion(SV_POTION_CURE_POISON) || borg_activate_artifact(EF_REM_FEAR_POIS) || borg_use_staff(SV_STAFF_CURING) || borg_eat_food(SV_FOOD_FAST_RECOVERY)|| borg_eat_food(SV_FOOD_PURGING) || /* buy time */ borg_quaff_crit(TRUE) || borg_prayer_fail(0,1,40) || borg_spell_fail(0,5,40) || borg_use_staff_fail(SV_STAFF_HEALING)) { borg_note("# Curing."); return (TRUE); } /* attempt to fix mana then poison on next round */ if ((borg_spell_legal(1, 3) || borg_prayer_legal(2, 0)) && (borg_quaff_potion(SV_POTION_RESTORE_MANA))) { borg_note("# Curing next round."); return (TRUE); } } /* Hack -- cure poison when poisoned CRITICAL CHECK */ if (borg_skill[BI_ISPOISONED] && (borg_skill[BI_CURHP] < 2 || borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 20)) { int sv_mana = borg_skill[BI_CURSP]; borg_skill[BI_CURSP] = borg_skill[BI_MAXSP]; if (borg_spell(1, 3) || borg_prayer(2, 0)|| borg_spell(0, 5)) { /* verify use of spell */ /* borg_keypress('y'); */ /* Flee! */ borg_note("# Emergency Cure Poison! Gasp!!!...."); return (TRUE); } borg_skill[BI_CURSP] = sv_mana; /* Quaff healing pots to buy some time- in this emergency. */ if (borg_quaff_potion(SV_POTION_CURE_LIGHT) || borg_quaff_potion(SV_POTION_CURE_SERIOUS) ) return (TRUE); /* Try to Restore Mana */ if (borg_quaff_potion(SV_POTION_RESTORE_MANA)) return (TRUE); /* Emergency check on healing. Borg_heal has already been checked but * but we did not use our ez_heal potions. All other attempts to save * ourself have failed. Use the ez_heal if I have it. */ if (borg_skill[BI_CURHP] < borg_skill[BI_MAXHP]/20 && (borg_quaff_potion(SV_POTION_STAR_HEALING) || borg_quaff_potion(SV_POTION_LIFE) || borg_quaff_potion(SV_POTION_HEALING))) { borg_note("# Healing. Curing section."); return (TRUE); } /* Quaff unknown potions in this emergency. We might get luck */ if (borg_quaff_unknown()) return (TRUE); /* Eat unknown mushroom in this emergency. We might get luck */ if (borg_eat_unknown()) return (TRUE); /* Use unknown Staff in this emergency. We might get luck */ if (borg_use_unknown()) return (TRUE); } /* Hack -- cure wounds when bleeding, also critical check */ if (borg_skill[BI_ISCUT] && (borg_skill[BI_CURHP] < borg_skill[BI_MAXHP]/3 || randint0(100) < 20) ) { if (borg_quaff_potion(SV_POTION_CURE_SERIOUS) || borg_quaff_potion(SV_POTION_CURE_LIGHT) || borg_quaff_crit(borg_skill[BI_CURHP] < 10) || borg_spell(0,5) || borg_prayer(1,2) || borg_prayer(2,7) || borg_prayer(6,1) || borg_prayer(0,1)) { return (TRUE); } } /* bleeding and about to die CRITICAL CHECK*/ if (borg_skill[BI_ISCUT] && ((borg_skill[BI_CURHP] < 2) || borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 20)) { int sv_mana = borg_skill[BI_CURSP]; borg_skill[BI_CURSP] = borg_skill[BI_MAXSP]; /* Quaff healing pots to buy some time- in this emergency. */ if (borg_quaff_potion(SV_POTION_CURE_LIGHT) || borg_quaff_potion(SV_POTION_CURE_SERIOUS)) return (TRUE); /* Try to Restore Mana */ if (borg_quaff_potion(SV_POTION_RESTORE_MANA)) return (TRUE); /* Emergency check on healing. Borg_heal has already been checked but * but we did not use our ez_heal potions. All other attempts to save * ourself have failed. Use the ez_heal if I have it. */ if (borg_skill[BI_CURHP] < borg_skill[BI_MAXHP]/20 && (borg_quaff_potion(SV_POTION_HEALING) || borg_quaff_potion(SV_POTION_STAR_HEALING) || borg_quaff_potion(SV_POTION_LIFE) )) { borg_note("# Healing. Bleeding."); return (TRUE); } /* Cast a spell, go into negative mana */ if (borg_spell(0, 5) || borg_prayer(0,1) || borg_prayer(1, 2)) { /* verify use of spell */ /* borg_keypress('y'); */ /* Flee! */ borg_note("# Emergency Wound Patch! Gasp!!!...."); return (TRUE); } borg_skill[BI_CURSP] = sv_mana; /* Quaff unknown potions in this emergency. We might get luck */ if (borg_quaff_unknown()) return (TRUE); /* Eat unknown mushroom in this emergency. We might get luck */ if (borg_eat_unknown()) return (TRUE); /* Use unknown Staff in this emergency. We might get luck */ if (borg_use_unknown()) return (TRUE); } /* nothing to do */ return (FALSE); } /* * Be "cautious" and attempt to prevent death or dishonor. * * Strategy: * * (1) Caution * (1a) Analyze the situation * (1a1) try to heal * (1a2) try a defence * (1b) Teleport from danger * (1c) Handle critical stuff * (1d) Retreat to happy grids * (1e) Back away from danger * (1f) Heal various conditions * * (2) Attack * (2a) Simulate possible attacks * (2b) Perform optimal attack * * (3) Recover * (3a) Recover by spells/prayers * (3b) Recover by items/etc * (3c) Recover by resting * * XXX XXX XXX * In certain situations, the "proper" course of action is to simply * attack a nearby monster, since often most of the danger is due to * a single monster which can sometimes be killed in a single blow. * * Actually, both "borg_caution()" and "borg_recover()" need to * be more intelligent, and should probably take into account * such things as nearby monsters, and/or the relative advantage * of simply pummeling nearby monsters instead of recovering. * * Note that invisible/offscreen monsters contribute to the danger * of an extended "region" surrounding the observation, so we will * no longer rest near invisible monsters if they are dangerous. * * XXX XXX XXX * We should perhaps reduce the "fear" values of each region over * time, to take account of obsolete invisible monsters. * * Note that walking away from a fast monster is counter-productive, * since the monster will often just follow us, so we use a special * method which allows us to factor in the speed of the monster and * predict the state of the world after we move one step. Of course, * walking away from a spell casting monster is even worse, since the * monster will just get to use the spell attack multiple times. But, * if we are trying to get to known safety, then fleeing in such a way * might make sense. Actually, this has been done too well, note that * it makes sense to flee some monsters, if they "stumble", or if we * are trying to get to stairs. XXX XXX XXX * * Note that the "flow" routines attempt to avoid entering into * situations that are dangerous, but sometimes we do not see the * danger coming, and then we must attempt to survive by any means. * * We will attempt to "teleport" if the danger in the current situation, * as well as that resulting from attempting to "back away" from danger, * are sufficient to kill us in one or two blows. This allows us to * avoid teleportation in situations where simply backing away is the * proper course of action, for example, when standing next to a nasty * stationary monster, but also to teleport when backing away will not * reduce the danger sufficiently. * * But note that in "nasty" situations (when we are running out of light, * or when we are starving, blind, confused, or hallucinating), we will * ignore the possibility of "backing away" from danger, when considering * the possibility of using "teleport" to escape. But if the teleport * fails, we will still attempt to "retreat" or "back away" if possible. * * XXX XXX XXX Note that it should be possible to do some kind of nasty * "flow" algorithm which would use a priority queue, or some reasonably * efficient normal queue stuff, to determine the path which incurs the * smallest "cumulative danger", and minimizes the total path length. * It may even be sufficient to treat each step as having a cost equal * to the danger of the destination grid, plus one for the actual step. * This would allow the Borg to prefer a ten step path passing through * one grid with danger 10, to a five step path, where each step has * danger 9. Currently, he often chooses paths of constant danger over * paths with small amounts of high danger. However, the current method * is very fast, which is certainly a point in its favor... * * When in danger, attempt to "flee" by "teleport" or "recall", and if * this is not possible, attempt to "heal" damage, if needed, and else * attempt to "flee" by "running". * * XXX XXX XXX Both "borg_caution()" and "borg_recover()" should only * perform the "healing" tasks if they will cure more "damage"/"stuff" * than may be re-applied in the next turn, this should prevent using * wimpy healing spells next to dangerous monsters, and resting to regain * mana near a mana-drainer. * * Whenever we are in a situation in which, even when fully healed, we * could die in a single round, we set the "goal_fleeing" flag, and if * we could die in two rounds, we set the "goal_leaving" flag. * * In town, whenever we could die in two rounds if we were to stay still, * we set the "goal_leaving" flag. In combination with the "retreat" and * the "back away" code, this should allow us to leave town before getting * into situations which might be fatal. * * Flag "goal_fleeing" means get off this level right now, using recall * if possible when we get a chance, and otherwise, take stairs, even if * it is very dangerous to do so. * * Flag "goal_leaving" means get off this level when possible, using * stairs if possible when we get a chance. * * We will also take stairs if we happen to be standing on them, and we * could die in two rounds. This is often "safer" than teleportation, * and allows the "retreat" code to retreat towards stairs, knowing that * once there, we will leave the level. * * If we can, we should try to hit a monster with an offset spell. * A Druj can not move but they are really dangerous. So we should retreat * to a happy grid (meaning we have los and it does not), we should target * one space away from the bad guy then blast away with ball spells. * * Hack -- Special checks for dealing with Morgoth. * The borg would like to stay put on level 100 and use * spells to attack Morgoth then use Teleport Other as he * gets too close. * 1. Make certain borg is sitting in a central room. * 2. Attack Morgoth with spells. * 3. Use Teleport Other on Morgoth as he approches. * 4. Use Teleport Other/Mass Banishment on all other monsters * if borg is correctly positioned in a good room. * 5. Stay put and rest until Morgoth returns. */ bool borg_caution(void) { int j, p; bool borg_surround= FALSE; bool nasty = FALSE; bool on_dnstair = FALSE; bool on_upstair = FALSE; /*** Notice "nasty" situations ***/ /* About to run out of light is extremely nasty */ if (!borg_skill[BI_LIGHT] && borg_items[INVEN_LIGHT].timeout < 250) nasty = TRUE; /* Starvation is nasty */ if (borg_skill[BI_ISWEAK]) nasty = TRUE; /* Blind-ness is nasty */ if (borg_skill[BI_ISBLIND]) nasty = TRUE; /* Confusion is nasty */ if (borg_skill[BI_ISCONFUSED]) nasty = TRUE; /* Hallucination is nasty */ if (borg_skill[BI_ISIMAGE]) nasty = TRUE; /* if on level 100 and not ready for Morgoth, run */ if (borg_skill[BI_CDEPTH] == 100 && borg_t - borg_began < 10 && !borg_morgoth_position) { if (borg_ready_morgoth == 0 && !borg_skill[BI_KING]) { /* teleport level up to 99 to finish uniques */ if (borg_spell(6,2) || borg_prayer(4,3) || borg_read_scroll(SV_SCROLL_TELEPORT_LEVEL)) { borg_note("# Rising one dlevel (Not ready for Morgoth)"); return (TRUE); } /* Start leaving */ if (!goal_leaving) { /* Note */ borg_note("# Leaving (Not ready for Morgoth now)"); /* Start leaving */ goal_leaving = TRUE; } } } /*** Evaluate local danger ***/ /* Monsters on all sides of me? */ borg_surround = borg_surrounded(); /* No searching if scary guys on the level */ if (scaryguy_on_level == TRUE) borg_needs_searching = FALSE; /* Only allow three 'escapes' per level unless heading for morogoth or fighting a unique, then allow 85. */ if ((borg_escapes > 3 && !unique_on_level && !borg_ready_morgoth) || borg_escapes > 55) { /* No leaving if going after questors */ if (borg_skill[BI_CDEPTH] <=98) { /* Start leaving */ if (!goal_leaving) { /* Note */ borg_note("# Leaving (Too many escapes)"); /* Start leaving */ goal_leaving = TRUE; } /* Start fleeing */ if (!goal_fleeing && borg_escapes > 3) { /* Note */ borg_note("# Fleeing (Too many escapes)"); /* Start fleeing */ goal_fleeing = TRUE; } } } /* No hanging around if nasty here. */ if (scaryguy_on_level) { /* Note */ borg_note("# Scary guy on level."); /* Start leaving */ if (!goal_leaving) { /* Note */ borg_note("# Leaving (Scary guy on level)"); /* Start leaving */ goal_leaving = TRUE; } /* Start fleeing */ if (!goal_fleeing) { /* Note */ borg_note("# Fleeing (Scary guy on level)"); /* Start fleeing */ goal_fleeing = TRUE; } /* Return to town quickly after leaving town */ if (borg_skill[BI_CDEPTH] == 0) borg_fleeing_town = TRUE; } /* Make a note if Ignoring monsters (no fighting) */ if (goal_ignoring) { /* Note */ borg_note("# Ignoring combat with monsters."); } /* Note if ignorig messages */ if (borg_dont_react) { borg_note("# Borg ignoring messges."); } /* Look around */ p = borg_danger(c_y, c_x, 1, TRUE, FALSE); /* Describe (briefly) the current situation */ /* Danger (ignore stupid "fear" danger) */ if ((((p > avoidance / 10) || (p > borg_fear_region[c_y/11][c_x/11]) || borg_morgoth_position || borg_skill[BI_ISWEAK]) || borg_skill[BI_CDEPTH] ==100) && !borg_skill[BI_KING]) { /* Describe (briefly) the current situation */ borg_note(format("# Loc:%d,%d Dep:%d Lev:%d HP:%d/%d SP:%d/%d Danger:p=%d", c_y, c_x, borg_skill[BI_CDEPTH], borg_skill[BI_CLEVEL], borg_skill[BI_CURHP], borg_skill[BI_MAXHP], borg_skill[BI_CURSP], borg_skill[BI_MAXSP],p)); if (borg_resistance) { borg_note(format("# Protected by Resistance (borg turns:%d; game turns:%d)", borg_resistance/borg_game_ratio,p_ptr->timed[TMD_OPP_ACID])); } if (borg_shield) { borg_note("# Protected by Mystic Shield"); } if (borg_prot_from_evil) { borg_note("# Protected by PFE"); } if (borg_morgoth_position) { borg_note("# Protected by Sea of Runes."); } if (borg_fighting_unique >=10) { borg_note("# Questor Combat."); } if (borg_as_position) { borg_note("# Protected by anti-summon corridor."); } } /* Comment on glyph */ if (track_glyph_num) { int i; for (i = 0; i < track_glyph_num; i++) { /* Enqueue the grid */ if ((track_glyph_y[i] == c_y) && (track_glyph_x[i] == c_x)) { /* if standing on one */ borg_note(format("# Standing on Glyph")); } } } /* Comment on stair */ if (track_less_num) { int i; for (i = 0; i < track_less_num; i++) { /* Enqueue the grid */ if ((track_less_y[i] == c_y) && (track_less_x[i] == c_x)) { /* if standing on one */ borg_note(format("# Standing on up-stairs")); on_upstair = FALSE; } } } /* Comment on stair */ if (track_more_num) { int i; for (i = 0; i < track_more_num; i++) { /* Enqueue the grid */ if ((track_more_y[i] == c_y) && (track_more_x[i] == c_x)) { /* if standing on one */ borg_note(format("# Standing on dn-stairs")); on_dnstair = FALSE; } } } if (!goal_fleeing) { /* Start being cautious and trying to not die */ if (borg_class == CLASS_MAGE && !borg_morgoth_position && !borg_as_position && !borg_skill[BI_ISBLIND] && !borg_skill[BI_ISCUT] && !borg_skill[BI_ISPOISONED] && !borg_skill[BI_ISCONFUSED]) { /* do some defence before running away */ if (borg_defend(p)) return TRUE; /* try healing before running away */ if (borg_heal(p)) return TRUE; } else { /* try healing before running away */ if (borg_heal(p)) return TRUE; /* do some defence before running away! */ if (borg_defend(p)) return TRUE; } } if (borg_uses_swaps) { /* do some swapping before running away! */ if (p > (avoidance / 3) ) { if (borg_backup_swap(p)) return TRUE; } } /* If I am waiting for recall, & safe, then stay put. */ if (goal_recalling && borg_check_rest(c_y, c_x) && borg_skill[BI_CDEPTH] && !borg_skill[BI_ISHUNGRY]) { /* rest here until lift off */ borg_note("# Resting for Recall."); borg_keypress('R'); borg_keypress('5'); borg_keypress('0'); borg_keypress('0'); borg_keypress(KC_ENTER); /* I'm not in a store */ borg_in_shop = FALSE; return (TRUE); } /* If I am waiting for recall in town */ if (goal_recalling && goal_recalling <= (borg_game_ratio *2) && !borg_skill[BI_CDEPTH]) { /* Cast other good Mage prep things */ if ((!borg_speed && borg_spell_fail(3, 2,15)) || (borg_skill[BI_TRFIRE] + borg_skill[BI_TRCOLD] + borg_skill[BI_TRACID] + borg_skill[BI_TRELEC] + borg_skill[BI_TRPOIS] < 3 && borg_spell_fail(4,3,15)) || (!borg_shield && borg_spell_fail(4,4,15)) || (!borg_hero && borg_spell_fail(7,0,15)) || (!borg_berserk && borg_spell_fail(7,1,15))) { borg_note("# Casting preparatory spell before Recall activates."); return (TRUE); } /* Cast PFE just before returning to dungeon */ if (!borg_prot_from_evil && borg_prayer_fail(2, 4, 15) ) { borg_note("# Casting PFE before Recall activates."); return (TRUE); } /* Cast other good Priest prep things */ if ((!borg_bless && (borg_prayer_fail(3,0,15) || borg_prayer_fail(1,3,15) || borg_prayer_fail(0,2,15))) || (!borg_skill[BI_TRFIRE] && !borg_skill[BI_TRCOLD] && borg_prayer_fail(1,7,15))) { borg_note("# Casting preparatory prayer before Recall activates."); return (TRUE); } } /*** Danger ***/ /* Impending doom */ /* Don't take off in the middle of a fight */ /* just to restock and it is useless to restock */ /* if you have just left town. */ if (borg_restock(borg_skill[BI_CDEPTH]) && !borg_fighting_unique && (borg_time_town + (borg_t - borg_began)) > 200) { /* Start leaving */ if (!goal_leaving) { /* Note */ borg_note(format("# Leaving (restock) %s", borg_restock(borg_skill[BI_CDEPTH]))); /* Start leaving */ goal_leaving = TRUE; } /* Start fleeing */ if (!goal_fleeing && borg_skill[BI_ACCW] < 2 && borg_skill[BI_FOOD] > 3 && borg_skill[BI_AFUEL] > 2) { /* Flee */ borg_note(format("# Fleeing (restock) %s", borg_restock(borg_skill[BI_CDEPTH]))); /* Start fleeing */ goal_fleeing = TRUE; } } /* Excessive danger */ else if (p > (borg_skill[BI_CURHP] * 2)) { /* Start fleeing */ /* do not flee level if going after Morgoth or fighting a unique */ if (!goal_fleeing && !borg_fighting_unique && (borg_skill[BI_CLEVEL] < 50) && !vault_on_level && (borg_skill[BI_CDEPTH] < 100 && borg_ready_morgoth == 1)) { /* Note */ borg_note("# Fleeing (excessive danger)"); /* Start fleeing */ goal_fleeing = TRUE; } } /* Potential danger (near death) in town */ else if (!borg_skill[BI_CDEPTH] && (p > borg_skill[BI_CURHP]) && (borg_skill[BI_CLEVEL] < 50) ) { /* Flee now */ if (!goal_leaving) { /* Flee! */ borg_note("# Leaving (potential danger)"); /* Start leaving */ goal_leaving = TRUE; } } /*** Stairs ***/ /* Leaving or Fleeing, take stairs */ if (goal_leaving || goal_fleeing || scaryguy_on_level || goal_fleeing_lunal || goal_fleeing_munchkin || ((p > avoidance || (borg_skill[BI_CLEVEL] < 5 && p > avoidance /2)) && borg_grids[c_y][c_x].feat == FEAT_LESS)) /* danger and standing on stair */ { if (borg_ready_morgoth == 0 && !borg_skill[BI_KING]) { stair_less = TRUE; if (scaryguy_on_level) borg_note("# Fleeing and leaving the level. (scaryguy)"); if (goal_fleeing_lunal) borg_note("# Fleeing and leaving the level. (fleeing_lunal)"); if (goal_fleeing_munchkin) borg_note("# Fleeing and leaving the level. (fleeing munchkin)"); if (p > avoidance && borg_skill[BI_CLEVEL] <= 49 && borg_grids[c_y][c_x].feat == FEAT_LESS) borg_note("# Leaving level, Some danger but I'm on a stair."); } if (scaryguy_on_level) stair_less = TRUE; /* Only go down if fleeing or prepared */ if (goal_fleeing == TRUE || goal_fleeing_lunal== TRUE || goal_fleeing_munchkin) stair_more = TRUE; if ((char *)NULL == borg_prepared(borg_skill[BI_CDEPTH]+1)) stair_more = TRUE; if (!track_less_num && (borg_skill[BI_CURLITE] == 0 || borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK] || borg_skill[BI_FOOD] < 2)) stair_more = FALSE; /* If I need to sell crap, then don't go down */ if (borg_skill[BI_CDEPTH] && borg_skill[BI_CLEVEL] < 25 && borg_gold < 25000 && borg_count_sell() >= 13) stair_more = FALSE; /* Its ok to go one level deep if evading scary guy */ if (scaryguy_on_level) stair_more = TRUE; /* if fleeing town, then dive */ if (!borg_skill[BI_CDEPTH]) stair_more = TRUE; } /* Take stairs up */ if (stair_less) { /* Current grid */ borg_grid *ag = &borg_grids[c_y][c_x]; /* Usable stairs */ if (ag->feat == FEAT_LESS || borg_on_upstairs || on_upstair) { /* Log it */ borg_note(format("# Leaving via up stairs.")); /* Take the stairs */ borg_on_dnstairs = TRUE; borg_keypress('<'); /* Success */ return (TRUE); } } /* Take stairs down */ if (stair_more && !goal_recalling) { /* Current grid */ borg_grid *ag = &borg_grids[c_y][c_x]; /* Usable stairs */ if (ag->feat == FEAT_MORE || borg_on_dnstairs || on_dnstair) { /* Do these if not lunal mode */ if (!goal_fleeing_lunal && !goal_fleeing_munchkin) { /* Cast other good Mage prep things */ if (!goal_fleeing && (borg_skill[BI_CURSP] > borg_skill[BI_MAXSP] * 6 /10 && ((!borg_speed && borg_spell_fail(3, 2,15)) || (borg_skill[BI_TRFIRE] + borg_skill[BI_TRCOLD] + borg_skill[BI_TRACID] + borg_skill[BI_TRELEC] + borg_skill[BI_TRPOIS] < 3 && borg_spell_fail(4,3,15)) || (!borg_shield && borg_spell_fail(4,4,15)) || (!borg_hero && borg_spell_fail(7,0,15)) || (!borg_berserk && borg_spell_fail(7,1,15))))) { borg_note("# Casting preparatory spell before taking stairs."); borg_no_rest_prep = 3000; return (TRUE); } /* Cast PFE just before returning to dungeon */ if (!goal_fleeing && !borg_prot_from_evil && borg_prayer_fail(2, 4, 15) ) { borg_note("# Casting PFE before taking stairs."); borg_no_rest_prep = 3000; return (TRUE); } /* Cast other good Priest prep things */ if (!goal_fleeing && (borg_skill[BI_CURSP] > borg_skill[BI_MAXSP] * 6 /10 && ((!borg_bless && (borg_prayer_fail(3,0,15) || borg_prayer_fail(1,3,15) || borg_prayer_fail(0,2,15))) || (!borg_skill[BI_TRFIRE] && !borg_skill[BI_TRCOLD] && borg_prayer_fail(1,7,15))))) { borg_note("# Casting preparatory prayer before taking stairs."); borg_no_rest_prep = 3000; return (TRUE); } } /* Take the stairs */ borg_on_upstairs = TRUE; borg_keypress('>'); /* Success */ return (TRUE); } } /*** Deal with critical situations ***/ /* Hack -- require light */ if (!borg_skill[BI_CURLITE] && !borg_skill[BI_LIGHT]) /* No Lite, AND Not Glowing */ { enum borg_need need = borg_maintain_light(); if (need == BORG_MET_NEED) return TRUE; else if ((need == BORG_UNMET_NEED) && borg_skill[BI_CDEPTH]) { /* Flee for fuel */ /* Start leaving */ if (!goal_leaving) { /* Flee */ borg_note("# Leaving (need fuel)"); /* Start leaving */ goal_leaving = TRUE; } } } /* Hack -- prevent starvation */ if (borg_skill[BI_ISWEAK]) { /* Attempt to satisfy hunger */ if (borg_eat_food_any() || borg_spell(2, 0) || borg_prayer(1, 5)) { /* Success */ return (TRUE); } /* Try to restore mana then cast the spell next round */ if (borg_quaff_potion(SV_POTION_RESTORE_MANA)) return (TRUE); /* Flee for food */ if (borg_skill[BI_CDEPTH]) { /* Start leaving */ if (!goal_leaving) { /* Flee */ borg_note("# Leaving (need food)"); /* Start leaving */ goal_leaving = TRUE; } /* Start fleeing */ if (!goal_fleeing) { /* Flee */ borg_note("# Fleeing (need food)"); /* Start fleeing */ goal_fleeing = TRUE; } } } /* Prevent breeder explosions when low level */ if (breeder_level && borg_skill[BI_CLEVEL] < 15) { /* Start leaving */ if (!goal_fleeing) { /* Flee */ borg_note("# Fleeing (breeder level)"); /* Start fleeing */ goal_fleeing = TRUE; } } /*** Flee on foot ***/ /* Desperation Head for stairs */ /* If you are low level and near the stairs and you can */ /* hop onto them in very few steps, try to head to them */ /* out of desperation */ if ((track_less_num || track_more_num) && (goal_fleeing || scaryguy_on_level || (p > avoidance && borg_skill[BI_CLEVEL] < 35))) { int y, x, i; int b_j = -1; int m; int b_m = -1; bool safe = TRUE; borg_grid *ag; /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; ag = &borg_grids[y][x]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* Skip stairs if a monster is on the stair */ if (ag->kill) continue; /* skip the closer ones */ if (b_j >= j) continue; /* track it */ b_j =j; } /* Check for an existing "down stairs" */ for (i = 0; i < track_more_num; i++) { x = track_more_x[i]; y = track_more_y[i]; ag = &borg_grids[y][x]; /* How far is the nearest up stairs */ m = distance(c_y, c_x, y, x); /* Skip stairs if a monster is on the stair */ if (ag->kill) continue; /* skip the closer ones */ if (b_m >= m) continue; /* track it */ b_m =m; } /* If you are within a few (3) steps of the stairs */ /* and you can take some damage to get there */ /* go for it */ if (b_j < 3 && b_j != -1 && p < borg_skill[BI_CURHP]) { borg_desperate = TRUE; if (borg_flow_stair_less(GOAL_FLEE, FALSE)) { /* Note */ borg_note("# Desperate for Stairs (one)"); borg_desperate = FALSE; return (TRUE); } borg_desperate = FALSE; } /* If you are next to steps of the stairs go for it */ if (b_j <= 2 && b_j != -1) { borg_desperate = TRUE; if (borg_flow_stair_less(GOAL_FLEE, FALSE)) { /* Note */ borg_note("# Desperate for Stairs (two)"); borg_desperate = FALSE; return (TRUE); } borg_desperate = FALSE; } /* Low level guys tend to waste money reading the recall scrolls */ if (b_j < 20 && b_j != -1 && scaryguy_on_level && borg_skill[BI_CLEVEL] < 20) { /* do not attempt it if an adjacent monster is faster than me */ for (i=0; i < 8; i++) { x = c_x + ddx_ddd[i]; y = c_y + ddy_ddd[i]; /* check for bounds */ if (!cave_in_bounds(cave, y,x)) continue; /* Monster there ? */ if (!borg_grids[y][x].kill) continue; /* Access the monster and check it's speed */ if (borg_kills[borg_grids[y][x].kill].speed > borg_skill[BI_SPEED]) safe = FALSE; } /* Dont run from Grip or Fang */ if ((borg_skill[BI_CDEPTH] <= 5 && borg_skill[BI_CDEPTH] != 0 && borg_fighting_unique) || !safe) { /* try to take them on, you cant outrun them */ } else { borg_desperate = TRUE; if (borg_flow_stair_less(GOAL_FLEE, FALSE)) { /* Note */ borg_note("# Desperate for Stairs (three)"); borg_desperate = FALSE; return (TRUE); } borg_desperate = FALSE; } } /* If you are next to steps of the down stairs go for it */ if (b_m <= 2 && b_m != -1) { borg_desperate = TRUE; if (borg_flow_stair_more(GOAL_FLEE, FALSE, FALSE)) { /* Note */ borg_note("# Desperate for Stairs (four)"); borg_desperate = FALSE; return (TRUE); } borg_desperate = FALSE; } } /* * Strategic retreat * * Do not retreat if * 1) we are icky (poisoned, blind, confused etc * 2) we have boosted our avoidance because we are stuck * 3) we are in a Sea of Runes * 4) we are not in a vault */ if (((p > avoidance / 3 && !nasty && !borg_no_retreat) || (borg_surround && p != 0)) && !borg_morgoth_position && (borg_t - borg_t_antisummon >= 50) && !borg_skill[BI_ISCONFUSED] && !cave_isvault(cave, c_y, c_x) && borg_skill[BI_CURHP] < 500) { int d, b_d = -1; int r, b_r = -1; int b_p = -1, p1 = -1; int b_x = c_x; int b_y = c_y; int ii; /* Scan the useful viewable grids */ for (j = 1; j < borg_view_n; j++) { int x1 = c_x; int y1 = c_y; int x2 = borg_view_x[j]; int y2 = borg_view_y[j]; /* Cant if confused: no way to predict motion */ if (borg_skill[BI_ISCONFUSED]) continue; /* Require "floor" grids */ if (!borg_cave_floor_bold(y2, x2)) continue; /* Try to avoid pillar dancing if at good health */ if (borg_skill[BI_CURHP] >= borg_skill[BI_MAXHP] * 7 /10 && ((track_step_y[track_step_num -2] == y2 && track_step_x[track_step_num -2] == x2 && track_step_y[track_step_num -3] == c_y && track_step_x[track_step_num -3] == c_x) || time_this_panel >= 300)) continue; /* XXX -- Borgs in an unexplored hall (& with only a torch) * will always return FALSE for Happy Grids: * * 222222 Where 2 = unknown grid. Borg has a torch. * 2221.# Borg will consider both the . and the 1 * #@# for a retreat from the C. But the . will be * #C# false d/t adjacent wall to the east. 1 will * #'# will be false d/t unknown grid to the west. * So he makes no attempt to retreat. * However, the next function (backing away), allows him * to back up to 1 safely. * * To play safer, the borg should not retreat to grids where * he has not previously been. This tends to run him into * more monsters. It is better for him to retreat to grids * previously travelled, where the monsters are most likely * dead, and the path is clear. However, there is not (yet) * tag for those grids. Something like BORG_BEEN would work. */ /* Require "happy" grids (most of the time)*/ if (!borg_happy_grid_bold(y2, x2)) continue; /* Track "nearest" grid */ if (b_r >= 0) { int ay = ((y2 > y1) ? (y2 - y1) : (y1 - y2)); int ax = ((x2 > x1) ? (x2 - x1) : (x1 - x2)); /* Ignore "distant" locations */ if ((ax > b_r) || (ay > b_r)) continue; } /* Reset */ r = 0; /* Simulate movement */ while (1) { borg_grid *ag; /* Obtain direction */ d = borg_goto_dir(y1, x1, y2, x2); /* Verify direction */ if ((d == 0) || (d == 5)) break; /* Track distance */ r++; /* Simulate the step */ y1 += ddy[d]; x1 += ddx[d]; /* Obtain the grid */ ag = &borg_grids[y1][x1]; /* Lets make one more check that we are not bouncing */ if (borg_skill[BI_CURHP] >= borg_skill[BI_MAXHP] * 7 /10 && ((track_step_y[track_step_num -2] == y1 && track_step_x[track_step_num -2] == x1 && track_step_y[track_step_num -3] == c_y && track_step_x[track_step_num -3] == c_x) || time_this_panel >= 300)) break; /* Require floor */ if (!borg_cave_floor_grid(ag)) break; /* Require it to be somewhat close */ if (r >= 10) break; /* Check danger of that spot */ p1 = borg_danger(y1, x1, 1, TRUE, FALSE); if (p1 >= p) break; /* make sure it is not dangerous to take the first step; unless surrounded. */ if (r == 1) { /* Not surrounded or surrounded and ignoring*/ if (!borg_surround || (borg_surround && goal_ignoring)) { if (p1 >= borg_skill[BI_CURHP] * 4/10) break; /* Ought to be worth it */; if (p1 > p * 5 / 10) break; } else /* Surrounded, try to back-up */ { if (borg_skill[BI_CLEVEL] >= 20) { if (p1 >= (b_r <= 5 ? borg_skill[BI_CURHP] * 15/10 : borg_skill[BI_CURHP])) break; } else { if (p1 >= borg_skill[BI_CURHP] * 4) break; } } /* * Skip this grid if it is adjacent to a monster. He will just hit me * when I land on that grid. */ for (ii = 1; ii < borg_kills_nxt; ii++) { borg_kill *kill; /* Monster */ kill = &borg_kills[ii]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Require current knowledge */ if (kill->when < borg_t - 2) continue; /* Check distance -- 1 grid away */ if (distance(kill->y, kill->x, y1, x1) <= 1 && kill->speed > borg_skill[BI_SPEED] && !borg_surround) break; } } /* Skip monsters */ if (ag->kill) break; /* Skip traps */ if ((ag->feat >= FEAT_TRAP_HEAD) && (ag->feat <= FEAT_TRAP_TAIL)) break; /* Safe arrival */ if ((x1 == x2) && (y1 == y2)) { /* Save distance */ b_r = r; b_p = p1; /* Save location */ b_x = x2; b_y = y2; /* Done */ break; } } } /* Retreat */ if (b_r >= 0) { /* Save direction */ b_d = borg_goto_dir(c_y, c_x, b_y, b_x); /* Hack -- set goal */ g_x = c_x + ddx[b_d]; g_y = c_y + ddy[b_d]; /* Note */ borg_note(format("# Retreating to %d,%d (distance %d) via %d,%d (%d > %d)", b_y, b_x, b_r, g_y, g_x, p, b_p)); /* Strategic retreat */ borg_keypress(I2D(b_d)); /* Reset my Movement and Flow Goals */ goal = 0; /* Success */ return (TRUE); } } /*** Escape if possible ***/ /* Attempt to escape via spells */ if (borg_escape(p)) { /* increment the escapes this level counter */ borg_escapes++; /* Clear any Flow queues */ goal = 0; /* Success */ return (TRUE); } /*** Back away ***/ /* Do not back up if * 1) we are nasty (poisoned, blind, confused etc * 2) we are boosting our avoidance because we are stuck * 3) we are in a sweet Morgoth position (sea of runes) * 4) the monster causing concern is asleep * 5) we are not in a vault * 6) loads of HP */ if (((p > (avoidance *4/10) && !nasty && !borg_no_retreat) || (borg_surround && p != 0)) && !borg_morgoth_position && (borg_t - borg_t_antisummon >= 50) && !borg_skill[BI_ISCONFUSED] && !cave_isvault(cave, c_y, c_x) && borg_skill[BI_CURHP] < 500) { int i = -1, b_i = -1; int k = -1, b_k = -1; int f = -1, b_f = -1; int g_k = 0; int ii; bool adjacent_monster = FALSE; /* Current danger */ b_k = p; /* Fake the danger down if surounded so that he can move. */ if (borg_surround) b_k = (b_k * 12/10); /* Check the freedom */ b_f = borg_freedom(c_y, c_x); /* Attempt to find a better grid */ for (i = 0; i < 8; i++) { int x = c_x + ddx_ddd[i]; int y = c_y + ddy_ddd[i]; /* Access the grid */ borg_grid *ag = &borg_grids[y][x]; /* Cant if confused: no way to predict motion */ if (borg_skill[BI_ISCONFUSED]) continue; /* Skip walls/doors */ if (!borg_cave_floor_grid(ag)) continue; /* Skip monster grids */ if (ag->kill) continue; /* Mega-Hack -- skip stores XXX XXX XXX */ if (feature_isshop(ag->feat)) continue; /* Mega-Hack -- skip traps XXX XXX XXX */ if ((ag->feat >= FEAT_TRAP_HEAD) && (ag->feat <= FEAT_TRAP_TAIL)) continue; /* If i was here last round and 3 rounds ago, suggesting a "bounce" */ if (borg_skill[BI_CURHP] >= borg_skill[BI_MAXHP] * 7 /10 && ((track_step_y[track_step_num -2] == y && track_step_x[track_step_num -2] == x && track_step_y[track_step_num -3] == c_y && track_step_x[track_step_num -3] == c_x) || time_this_panel >= 300)) continue; /* * Skip this grid if it is adjacent to a monster. He will just hit me * when I land on that grid. */ for (ii = 1; ii < borg_kills_nxt; ii++) { borg_kill *kill; /* Monster */ kill = &borg_kills[ii]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Require current knowledge */ if (kill->when < borg_t - 2) continue; /* Check distance -- 1 grid away */ if (distance(kill->y, kill->x, y, x) <= 1 && !borg_surround) adjacent_monster = TRUE; /* Check distance -- 2 grids away and he is faster than me */ if (distance(kill->y, kill->x, y, x) <= 2 && kill->speed > borg_skill[BI_SPEED] && !borg_surround) adjacent_monster = TRUE; } /* Skip this grid consideration because it is next to a monster */ if (adjacent_monster == TRUE) continue; /* Extract the danger there */ k = borg_danger(y, x, 1, TRUE, FALSE); /* Skip this grid if danger is higher than my HP. * Take my chances with fighting. */ if (k > avoidance) continue; /* Skip this grid if it is not really worth backing up. Look for a 40% * reduction in the danger if higher level. If the danger of the new grid * is close to the danger of my current grid, I'll stay and fight. */ if (borg_skill[BI_MAXCLEVEL] >=35 && k > b_k * 6 /10) continue; /* Skip this grid if it is not really worth backing up. If the danger of the new grid * is close to the danger of my current grid, I'll stay and fight unless I am low * level and there is an adjacent monster. */ if (borg_skill[BI_MAXCLEVEL] < 35 && adjacent_monster == FALSE && k > b_k * 8 /10) continue; /* Skip higher danger */ /* note: if surrounded, then b_k has been adjusted to a higher number to make his current * grid seem more dangerous. This will encourage him to Back-Up. */ if (k > b_k) continue; /* Record the danger of this prefered grid */ g_k = k; /* Check the freedom there */ f = borg_freedom(y, x); /* Danger is the same, so look at the nature of the grid */ if (b_k == k) { /* If I am low level, reward backing-up if safe */ if (borg_skill[BI_CLEVEL] <= 10 && borg_skill[BI_CDEPTH] && (borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] || borg_skill[BI_CURSP] < borg_skill[BI_MAXSP])) { /* do consider the retreat */ } else { /* Freedom of my grid is better than the next grid * so stay put and fight. */ if (b_f > f || borg_skill[BI_CDEPTH] >= 85) continue; } } /* Save the info */ b_i = i; b_k = k; b_f = f; } /* Back away */ if (b_i >= 0) { /* Hack -- set goal */ g_x = c_x + ddx_ddd[b_i]; g_y = c_y + ddy_ddd[b_i]; /* Note */ borg_note(format("# Backing up to %d,%d (%d > %d)", g_x, g_y, p, g_k)); /* Back away from danger */ borg_keypress(I2D(ddd[b_i])); /* Reset my Movement and Flow Goals */ goal = 0; /* Success */ return (TRUE); } } /*** Cures ***/ /* cure confusion, second check, first (slightly different) in borg_heal */ if (borg_skill[BI_ISCONFUSED]) { if (borg_skill[BI_MAXHP]-borg_skill[BI_CURHP] >= 300 && (borg_quaff_potion(SV_POTION_HEALING) || borg_quaff_potion(SV_POTION_STAR_HEALING) || borg_quaff_potion(SV_POTION_LIFE))) { borg_note("# Healing. Confusion."); return (TRUE); } if (borg_eat_food(SV_FOOD_CURE_MIND) || borg_quaff_potion(SV_POTION_CURE_SERIOUS) || borg_quaff_crit(FALSE) || borg_quaff_potion(SV_POTION_HEALING) || borg_use_staff_fail(SV_STAFF_HEALING)) { borg_note("# Healing. Confusion."); return (TRUE); } } /* Hack -- cure fear when afraid */ if ((borg_skill[BI_ISAFRAID] && !borg_skill[BI_CRSFEAR]) && (randint0(100) < 70 || (borg_class == CLASS_WARRIOR && borg_skill[BI_AMISSILES] <=0))) { if (borg_eat_food(SV_FOOD_CURE_MIND) || borg_prayer(0, 3) || borg_quaff_potion(SV_POTION_BOLDNESS) || borg_quaff_potion(SV_POTION_HEROISM) || borg_quaff_potion(SV_POTION_BERSERK_STRENGTH) || borg_spell_fail(7, 1, 25) || /* berserk */ borg_spell_fail(7, 0, 25) || /* hero */ borg_activate_artifact(EF_REM_FEAR_POIS) ) { return (TRUE); } } /*** Note impending death XXX XXX XXX ***/ /* Flee from low hit-points */ if (((borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 3) || ((borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 2) && borg_skill[BI_CURHP] < (borg_skill[BI_CLEVEL] *3) )) && (borg_skill[BI_ACCW] < 3) && (borg_skill[BI_AHEAL] < 1)) { /* Flee from low hit-points */ if (borg_skill[BI_CDEPTH] && (randint0(100) < 25)) { /* Start leaving */ if (!goal_leaving) { /* Flee */ borg_note("# Leaving (low hit-points)"); /* Start leaving */ goal_leaving = TRUE; } /* Start fleeing */ if (!goal_fleeing) { /* Flee */ borg_note("# Fleeing (low hit-points)"); /* Start fleeing */ goal_fleeing = TRUE; } } } /* Flee from bleeding wounds or poison and no heals */ if ((borg_skill[BI_ISCUT] || borg_skill[BI_ISPOISONED]) && (borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 2) ) { /* Flee from bleeding wounds */ if (borg_skill[BI_CDEPTH] && (randint0(100) < 25)) { /* Start leaving */ if (!goal_leaving) { /* Flee */ borg_note("# Leaving (bleeding/posion)"); /* Start leaving */ goal_leaving = TRUE; } /* Start fleeing */ if (!goal_fleeing) { /* Flee */ borg_note("# Fleeing (bleeding/poison)"); /* Start fleeing */ goal_fleeing = TRUE; } } } /* Emergency check on healing. Borg_heal has already been checked but * but we did not use our ez_heal potions. All other attempts to save * ourself have failed. Use the ez_heal if I have it. */ if ((borg_skill[BI_CURHP] < borg_skill[BI_MAXHP]/10 || /* dangerously low HP -OR-*/ (p > borg_skill[BI_CURHP] && /* extreme danger -AND-*/ (borg_skill[BI_ATELEPORT] + borg_skill[BI_AESCAPE] <= 2 && borg_skill[BI_CURHP] < borg_skill[BI_MAXHP]/4)) || /* low on escapes */ (borg_skill[BI_AEZHEAL] > 5 && borg_skill[BI_CURHP] < borg_skill[BI_MAXHP]/4) || /* moderate danger, lots of heals */ (borg_skill[BI_MAXHP] - borg_skill[BI_CURHP] >= 600 && borg_fighting_unique && borg_skill[BI_CDEPTH] >= 85)) && /* moderate danger, unique, deep */ (borg_quaff_potion(SV_POTION_STAR_HEALING) || borg_quaff_potion(SV_POTION_HEALING) || borg_quaff_potion(SV_POTION_LIFE) )) { borg_note("# Using reserve EZ_Heal."); return (TRUE); } /* Hack -- use "recall" to flee if possible */ if (goal_fleeing && !goal_fleeing_munchkin && !borg_fleeing_town && borg_skill[BI_CDEPTH] >= 1 && (borg_recall())) { /* Note */ borg_note("# Fleeing the level (recall)"); /* Success */ return (TRUE); } /* If I am waiting for recall,and in danger, buy time with * phase and cure_anythings. */ if (goal_recalling && (p > avoidance * 2)) { if (!borg_skill[BI_ISCONFUSED] && !borg_skill[BI_ISBLIND] && borg_skill[BI_MAXSP] > 60 && borg_skill[BI_CURSP] < (borg_skill[BI_CURSP] / 4) && borg_quaff_potion(SV_POTION_RESTORE_MANA)) { borg_note("# Buying time waiting for Recall.(1)"); return (TRUE); } if (borg_caution_phase(50, 1) && (borg_read_scroll(SV_SCROLL_PHASE_DOOR) || borg_spell_fail(0, 2, 30) || borg_prayer_fail(4, 0, 30) || borg_activate_artifact(EF_TELE_PHASE)|| borg_activate_artifact(EF_TELE_LONG))) { borg_note("# Buying time waiting for Recall.(2)"); return (TRUE); } if ((borg_skill[BI_MAXHP] - borg_skill[BI_CURHP] < 100) && (borg_quaff_crit(TRUE) || borg_quaff_potion(SV_POTION_CURE_SERIOUS) || borg_quaff_potion(SV_POTION_CURE_LIGHT))) { borg_note("# Buying time waiting for Recall.(3)"); return (TRUE); } if ((borg_skill[BI_MAXHP] - borg_skill[BI_CURHP] > 150) && (borg_zap_rod(SV_ROD_HEALING) || borg_quaff_potion(SV_POTION_HEALING) || borg_quaff_potion(SV_POTION_STAR_HEALING) || borg_quaff_potion(SV_POTION_LIFE) || borg_quaff_crit(TRUE) || borg_quaff_potion(SV_POTION_CURE_SERIOUS) || borg_quaff_potion(SV_POTION_CURE_LIGHT))) { borg_note("# Buying time waiting for Recall.(4)"); return (TRUE); } } /* if I am gonna die next round, and I have no way to escape * use the unknown stuff (if I am low level). */ if (p > (borg_skill[BI_CURHP] * 4) && borg_skill[BI_CLEVEL] < 20 && !borg_skill[BI_MAXSP]) { if (borg_use_unknown()|| borg_read_unknown() || borg_quaff_unknown() || borg_eat_unknown()) return (TRUE); } /* Nothing */ return (FALSE); } /* * New method for handling attacks, missiles, and spells * * Every turn, we evaluate every known method of causing damage * to monsters, and evaluate the "reward" inherent in each of * the known methods which is usable at that time, and then * we actually use whichever method, if any, scores highest. * * For each attack, we need a function which will determine the best * possible result of using that attack, and return its value. Also, * if requested, the function should actually perform the action. * * Note that the functions should return zero if the action is not * usable, or if the action is not useful. * * These functions need to apply some form of "cost" evaluation, to * prevent the use of expensive spells with minimal reward. Also, * we should always prefer attacking by hand to using spells if the * damage difference is "small", since there is no "cost" in making * a physical attack. * * We should take account of "spell failure", as well as "missile * missing" and "blow missing" probabilities. * * Note that the functions may store local state information when * doing a "simulation" and then they can use this information if * they are asked to implement their strategy. * * There are several types of damage inducers: * * Attacking physically * Launching missiles * Throwing objects * Casting spells * Praying prayers * Using wands * Using rods * Using staffs * Using scrolls * Activating Artifacts * Activate Dragon Armour */ enum { BF_REST, BF_THRUST, BF_OBJECT, BF_LAUNCH_NORMAL, BF_LAUNCH_SEEKER, BF_LAUNCH_SILVER, BF_LAUNCH_FLAME, BF_LAUNCH_FROST, BF_LAUNCH_ANIMAL, BF_LAUNCH_UNDEAD, BF_LAUNCH_DEMON, BF_LAUNCH_ORC, BF_LAUNCH_GIANT, BF_LAUNCH_TROLL, /* 10 */ BF_LAUNCH_DRAGON, BF_LAUNCH_EVIL, BF_LAUNCH_WOUNDING, BF_LAUNCH_VENOM, BF_LAUNCH_HOLY, BF_SPELL_MAGIC_MISSILE, BF_SPELL_MAGIC_MISSILE_RESERVE, /* 20 */ BF_SPELL_STINK_CLOUD, BF_SPELL_ELEC_BOLT, BF_SPELL_LIGHT_BEAM, BF_SPELL_COLD_BOLT, BF_SPELL_STONE_TO_MUD, BF_SPELL_FIRE_BOLT, BF_SPELL_POLYMORPH, BF_SPELL_ACID_BOLT, BF_SPELL_SLOW_MONSTER, BF_SPELL_COLD_BALL, /* 30 */ BF_SPELL_SLEEP_III, BF_SPELL_FIRE_BALL, BF_SPELL_SHOCK_WAVE, BF_SPELL_EXPLOSION, BF_SPELL_CLOUD_KILL, BF_SPELL_CONFUSE_MONSTER, BF_SPELL_ACID_BALL, BF_SPELL_COLD_STORM, BF_SPELL_METEOR_STORM, BF_SPELL_RIFT, /* 40 */ BF_SPELL_BEDLAM, BF_SPELL_REND_SOUL, BF_SPELL_CHAOS_STRIKE, BF_SPELL_MANA_STORM, BF_PRAYER_BLIND_CREATURE, BF_PRAYER_SANCTUARY, BF_PRAYER_HOLY_ORB_BALL, BF_PRAYER_DISP_UNDEAD1, BF_PRAYER_DISP_EVIL1, BF_PRAYER_HOLY_WORD, /* 50 */ BF_PRAYER_DISP_UNDEAD2, BF_PRAYER_DISP_EVIL2, BF_PRAYER_DRAIN_LIFE, BF_ROD_ELEC_BOLT, BF_ROD_COLD_BOLT, BF_ROD_ACID_BOLT, BF_ROD_FIRE_BOLT, BF_ROD_LIGHT_BEAM, BF_ROD_DRAIN_LIFE, BF_ROD_ELEC_BALL, /* 60 */ BF_ROD_COLD_BALL, BF_ROD_ACID_BALL, BF_ROD_FIRE_BALL, BF_ROD_SLOW_MONSTER, BF_ROD_SLEEP_MONSTER, BF_ROD_UNKNOWN, BF_STAFF_SLEEP_MONSTERS, BF_STAFF_SLOW_MONSTERS, BF_STAFF_DISPEL_EVIL, BF_STAFF_POWER, BF_STAFF_HOLINESS, BF_WAND_UNKNOWN, BF_WAND_MAGIC_MISSILE, BF_WAND_ELEC_BOLT, BF_WAND_COLD_BOLT, BF_WAND_ACID_BOLT, BF_WAND_FIRE_BOLT, BF_WAND_SLOW_MONSTER, BF_WAND_SLEEP_MONSTER, BF_WAND_CONFUSE_MONSTER, BF_WAND_FEAR_MONSTER, BF_WAND_ANNIHILATION, BF_WAND_DRAIN_LIFE, BF_WAND_LIGHT_BEAM, BF_WAND_STINKING_CLOUD, BF_WAND_ELEC_BALL, BF_WAND_COLD_BALL, BF_WAND_ACID_BALL, BF_WAND_FIRE_BALL, BF_WAND_WONDER, BF_WAND_DRAGON_COLD, BF_WAND_DRAGON_FIRE, BF_EF_FIRE1, BF_EF_FIRE2, BF_EF_FIRE3, BF_EF_FROST1, BF_EF_FROST2, BF_EF_FROST3, BF_EF_FROST4, BF_EF_FROST5, BF_EF_DRAIN_LIFE1, BF_EF_DRAIN_LIFE2, BF_EF_STINKING_CLOUD, BF_EF_CONFUSE, BF_EF_ARROW, BF_EF_MISSILE, BF_EF_SLEEP, BF_EF_LIGHTNING_BOLT, BF_EF_ACID1, BF_EF_DISP_EVIL, BF_EF_ELEC2, BF_EF_MANA_BOLT, BF_EF_STAR_BALL, /* Razorback and Mediator */ BF_RING_ACID, BF_RING_FIRE, BF_RING_ICE, BF_RING_LIGHTNING, BF_RING_DELVING, BF_DRAGON_BLUE, BF_DRAGON_WHITE, BF_DRAGON_BLACK, BF_DRAGON_GREEN, BF_DRAGON_RED, BF_DRAGON_MULTIHUED, BF_DRAGON_BRONZE, BF_DRAGON_GOLD, BF_DRAGON_CHAOS, BF_DRAGON_LAW, BF_DRAGON_BALANCE, BF_DRAGON_SHINING, BF_DRAGON_POWER, BF_MAX }; /* * Guess how much damage a physical attack will do to a monster */ static int borg_thrust_damage_one(int i) { int dam; int mult; borg_kill *kill; monster_race *r_ptr; borg_item *item; int chance; /* Examine current weapon */ item = &borg_items[INVEN_WIELD]; /* Monster record */ kill = &borg_kills[i]; /* Monster race */ r_ptr = &r_info[kill->r_idx]; /* Damage */ dam = (item->dd * (item->ds + 1) / 2); /* here is the place for slays and such */ mult = 1; if (((borg_skill[BI_WS_ANIMAL]) && (rf_has(r_ptr->flags, RF_ANIMAL))) || ((borg_skill[BI_WS_EVIL]) && (rf_has(r_ptr->flags, RF_EVIL)))) mult = 2; if (((borg_skill[BI_WS_UNDEAD]) && (rf_has(r_ptr->flags, RF_UNDEAD))) || ((borg_skill[BI_WS_DEMON]) && (rf_has(r_ptr->flags, RF_DEMON))) || ((borg_skill[BI_WS_ORC]) && (rf_has(r_ptr->flags, RF_ORC))) || ((borg_skill[BI_WS_TROLL]) && (rf_has(r_ptr->flags, RF_TROLL))) || ((borg_skill[BI_WS_GIANT]) && (rf_has(r_ptr->flags, RF_GIANT))) || ((borg_skill[BI_WS_DRAGON]) && (rf_has(r_ptr->flags, RF_DRAGON))) || ((borg_skill[BI_WB_ACID]) && !(rf_has(r_ptr->flags, RF_IM_ACID))) || ((borg_skill[BI_WB_FIRE]) && !(rf_has(r_ptr->flags, RF_IM_FIRE))) || ((borg_skill[BI_WB_COLD]) && !(rf_has(r_ptr->flags, RF_IM_COLD))) || ((borg_skill[BI_WB_POIS]) && !(rf_has(r_ptr->flags, RF_IM_POIS))) || ((borg_skill[BI_WB_ELEC]) && !(rf_has(r_ptr->flags, RF_IM_ELEC)))) mult = 3; if (((borg_skill[BI_WK_UNDEAD]) && (rf_has(r_ptr->flags, RF_UNDEAD))) || ((borg_skill[BI_WK_DEMON]) && (rf_has(r_ptr->flags, RF_DEMON))) || ((borg_skill[BI_WK_DRAGON]) && (rf_has(r_ptr->flags, RF_DRAGON)))) mult = 5; /* add the multiplier */ dam *= mult; /* add weapon bonuses */ dam += item->to_d; /* add player bonuses */ dam += borg_skill[BI_TODAM]; /* multiply the damage for the whole round of attacks */ dam *= borg_skill[BI_BLOWS]; /* Bonuses for combat */ chance = (borg_skill[BI_THN] + ((borg_skill[BI_TOHIT] + item->to_h) * 3)); /* Chance of hitting the monsters AC */ if (chance < (r_ptr->ac * 3/4) * 8/10) dam = 0; /* 5% automatic success/fail */ if (chance > 95) chance = 95; if (chance < 5) chance = 5; /* add 10% to chance to give a bit more wieght to weapons */ if (borg_skill[BI_CLEVEL] > 15) chance += 10; /* Mages with Mana do not get that bonus, they should cast */ if (borg_class == CLASS_MAGE && borg_skill[BI_CURSP] > 1) chance -= 10; /* reduce damage by the % chance to hit */ dam = (dam * chance) / 100; /* Try to place a minimal amount of damage */ if (dam <= 0) dam = 1; /* Limit damage to twice maximal hitpoints */ if (dam > kill->power * 2 && !rf_has(r_ptr->flags, RF_UNIQUE)) dam = kill->power * 2; /* Reduce the damage if a mage, they should not melee if they can avoid it */ if (borg_class == CLASS_MAGE && borg_skill[BI_MAXCLEVEL] < 40 && borg_skill[BI_CURSP] > 1) dam = (dam * 8 / 10) + 1; /* * Enhance the preceived damage on Uniques. This way we target them * Keep in mind that he should hit the uniques but if he has a * x5 great bane of dragons, he will tend attack the dragon since the * precieved (and actual) damage is higher. But don't select * the town uniques (maggot does no damage) * */ if ((rf_has(r_ptr->flags, RF_UNIQUE)) && borg_skill[BI_CDEPTH] >=1) dam += (dam * 5); /* Hack -- ignore Maggot until later. Player will chase Maggot * down all accross the screen waking up all the monsters. Then * he is stuck in a comprimised situation. */ if ((rf_has(r_ptr->flags, RF_UNIQUE)) && borg_skill[BI_CDEPTH] ==0) { dam = dam * 2/3; /* Dont hunt maggot until later */ if (borg_skill[BI_CLEVEL] < 5) dam = 0; } /* give a small bonus for whacking a breeder */ if (rf_has(r_ptr->flags, RF_MULTIPLY)) dam = (dam * 3/2); /* Enhance the perceived damage to summoner in order to influence the * choice of targets. */ if ( (rsf_has(r_ptr->spell_flags, RSF_S_KIN)) || (rsf_has(r_ptr->spell_flags, RSF_S_HI_DEMON)) || (rsf_has(r_ptr->spell_flags, RSF_S_MONSTER)) || (rsf_has(r_ptr->spell_flags, RSF_S_MONSTERS)) || (rsf_has(r_ptr->spell_flags, RSF_S_ANIMAL)) || (rsf_has(r_ptr->spell_flags, RSF_S_SPIDER)) || (rsf_has(r_ptr->spell_flags, RSF_S_HOUND)) || (rsf_has(r_ptr->spell_flags, RSF_S_HYDRA)) || (rsf_has(r_ptr->spell_flags, RSF_S_AINU)) || (rsf_has(r_ptr->spell_flags, RSF_S_DEMON)) || (rsf_has(r_ptr->spell_flags, RSF_S_UNDEAD)) || (rsf_has(r_ptr->spell_flags, RSF_S_DRAGON)) || (rsf_has(r_ptr->spell_flags, RSF_S_HI_UNDEAD)) || (rsf_has(r_ptr->spell_flags, RSF_S_WRAITH)) || (rsf_has(r_ptr->spell_flags, RSF_S_UNIQUE)) ) dam += ((dam * 3)/2); /* * Apply massive damage bonus to Questor monsters to * encourage borg to strike them. */ if (rf_has(r_ptr->flags, RF_QUESTOR)) dam += (dam * 5); /* Damage */ return (dam); } /* * Simulate/Apply the optimal result of making a physical attack */ extern int borg_attack_aux_thrust(void) { int p, dir; int i, b_i = -1; int d, b_d = -1; borg_grid *ag; borg_kill *kill; /* Too afraid to attack */ if (borg_skill[BI_ISAFRAID] || borg_skill[BI_CRSFEAR]) return (0); /* Examine possible destinations */ for (i = 0; i < borg_temp_n; i++) { int x = borg_temp_x[i]; int y = borg_temp_y[i]; /* Require "adjacent" */ if (distance(c_y, c_x, y, x) > 1) continue; /* Acquire grid */ ag = &borg_grids[y][x]; /* Calculate "average" damage */ d = borg_thrust_damage_one(ag->kill); /* No damage */ if (d <= 0) continue; /* Obtain the monster */ kill = &borg_kills[ag->kill]; /* Hack -- avoid waking most "hard" sleeping monsters */ if (!kill->awake && (d <= kill->power) && !borg_munchkin_mode) { /* Calculate danger */ p = borg_danger_aux(y, x, 1, ag->kill, TRUE, TRUE); if (p > avoidance * 2) continue; } /* Hack -- ignore sleeping town monsters */ if (!borg_skill[BI_CDEPTH] && !kill->awake) continue; /* Calculate "danger" to player */ p = borg_danger_aux(c_y, c_x, 2, ag->kill, TRUE, TRUE); /* Reduce "bonus" of partial kills when higher level */ if (d <= kill->power && borg_skill[BI_MAXCLEVEL] > 15) p = p / 10; /* Add the danger-bonus to the damage */ d += p; /* Ignore lower damage */ if ((b_i >= 0) && (d < b_d)) continue; /* Save the info */ b_i = i; b_d = d; } /* Nothing to attack */ if (b_i < 0) return (0); /* Simulation */ if (borg_simulate) return (b_d); /* Save the location */ g_x = borg_temp_x[b_i]; g_y = borg_temp_y[b_i]; ag = &borg_grids[g_y][g_x]; kill= &borg_kills[ag->kill]; /* Note */ borg_note(format("# Facing %s at (%d,%d) who has %d Hit Points.",(r_info[kill->r_idx].name), g_y,g_x,kill->power)); borg_note(format("# Attacking with weapon '%s'", borg_items[INVEN_WIELD].desc)); /* Get a direction for attacking */ dir = borg_extract_dir(c_y, c_x, g_y, g_x); /* Attack the grid */ borg_keypress('+'); borg_keypress(I2D(dir)); /* Success */ return (b_d); } /* * Target a location. Can be used alone or at "Direction?" prompt. * * Warning -- This will only work for locations on the current panel */ bool borg_target(int y, int x) { int x1, y1, x2, y2; borg_grid *ag; borg_kill *kill; ag = &borg_grids[y][x]; kill = &borg_kills[ag->kill]; /* Log */ /* Report a little bit */ if (ag->kill) { borg_note(format("# Targeting %s who has %d Hit Points (%d,%d).",(r_info[kill->r_idx].name), kill->power, y, x)); } else { borg_note(format("# Targetting location (%d,%d)", y, x)); } /* Target mode */ borg_keypress('*'); /* Target a location */ borg_keypress('p'); /* Determine "path" */ x1 = c_x; y1 = c_y; x2 = x; y2 = y; /* Move to the location (diagonals) */ for (; (y1 < y2) && (x1 < x2); y1++, x1++) borg_keypress('3'); for (; (y1 < y2) && (x1 > x2); y1++, x1--) borg_keypress('1'); for (; (y1 > y2) && (x1 < x2); y1--, x1++) borg_keypress('9'); for (; (y1 > y2) && (x1 > x2); y1--, x1--) borg_keypress('7'); /* Move to the location */ for (; y1 < y2; y1++) borg_keypress('2'); for (; y1 > y2; y1--) borg_keypress('8'); for (; x1 < x2; x1++) borg_keypress('6'); for (; x1 > x2; x1--) borg_keypress('4'); /* Select the target */ borg_keypress('5'); /* Carry these variables to be used on reporting spell * pathway */ borg_target_y = y; borg_target_x = x; /* Success */ return (TRUE); } /* * Mark spot along the target path a wall. * This will mark the unknown squares as a wall. This might not be * the wall we ran into but also might be. * * Warning -- This will only work for locations on the current panel */ bool borg_target_unknown_wall(int y, int x) { int n_x, n_y; bool found = FALSE; bool y_hall = FALSE; bool x_hall = FALSE; borg_grid *ag; monster_race *r_ptr; borg_kill *kill; borg_note(format("# Perhaps wall near targetted location (%d,%d)", y, x)); /* Determine "path" */ n_x = c_x; n_y = c_y; /* check for 'in a hall' x axis */ /* This check is for this: */ /* * x x * ..@. or .@.. * x x * * 'x' being 'not a floor' and '.' being a floor. * * We would like to know if in a hall so we can place * the suspect wall off the hallway path. * like this:######x P * ........@.... * ################## * The shot may miss and we want the borg to guess the * wall to be at the X instead of first unkown grid which * is 3 west and 1 south of the X. */ if ((borg_grids[c_y+1][c_x].feat == FEAT_FLOOR && borg_grids[c_y-1][c_x].feat == FEAT_FLOOR && (borg_grids[c_y+2][c_x].feat == FEAT_FLOOR || borg_grids[c_y-2][c_x].feat == FEAT_FLOOR)) && (borg_grids[c_y][c_x+1].feat != FEAT_FLOOR && borg_grids[c_y][c_x-1].feat != FEAT_FLOOR)) x_hall = TRUE; /* check for 'in a hall' y axis. * Again, we want to place the suspected wall off our * hallway. */ if ((borg_grids[c_y][c_x+1].feat == FEAT_FLOOR && borg_grids[c_y][c_x-1].feat == FEAT_FLOOR && (borg_grids[c_y][c_x+2].feat == FEAT_FLOOR || borg_grids[c_y][c_x-2].feat == FEAT_FLOOR)) && (borg_grids[c_y+1][c_x].feat != FEAT_FLOOR && borg_grids[c_y-1][c_x].feat != FEAT_FLOOR)) y_hall = TRUE; while (1) { ag = &borg_grids[n_y][n_x]; kill = &borg_kills[ag->kill]; r_ptr = &r_info[kill->r_idx]; if (rf_has(r_ptr->flags, RF_PASS_WALL)) { borg_note(format("# Guessing wall (%d,%d) under ghostly target (%d,%d)", n_y, n_x, n_y, n_x)); borg_grids[n_y][n_x].feat = FEAT_WALL_EXTRA; found = TRUE; return (found); /* not sure... should we return here? */ } if (borg_grids[n_y][n_x].feat == FEAT_NONE && ((n_y != c_y) || !y_hall) && ((n_x != c_x) || !x_hall)) { borg_note(format("# Guessing wall (%d,%d) near target (%d,%d)", n_y, n_x, y, x)); borg_grids[n_y][n_x].feat = FEAT_WALL_EXTRA; found = TRUE; return (found); /* not sure... should we return here? maybe should mark ALL unknowns in path... */ } /* Pathway found the target. */ if (n_x == x && n_y == y) { /* end of the pathway */ mmove2(&n_y, &n_x, y, x, c_y, c_x); borg_note(format("# Guessing wall (%d,%d) near target (%d,%d)", n_y, n_x, y, x)); borg_grids[n_y][n_x].feat = FEAT_WALL_EXTRA; found = TRUE; return (found); } /* Calculate the new location */ mmove2(&n_y, &n_x, c_y, c_x, y, x); } } /* * Guess how much damage a spell attack will do to a monster * * We only handle the "standard" damage types. * * We are paranoid about monster resistances * * He tends to waste all of his arrows on a monsters immediately adjacent * to him. Then he has no arrows for the rest of the level. We will * decrease the damage if the monster is adjacent and we are getting low * on missiles. * * We will also decrease the value of the missile attack on breeders or * high clevel borgs town scumming. */ int borg_launch_damage_one(int i, int dam, int typ, int ammo_location) { int p1, p2 = 0; int j; bool borg_use_missile = FALSE; int ii; int vault_grids = 0; int x, y; int k; bool gold_eater = FALSE; int chance = 0; int bonus = 0; int cur_dis = 0; int armor = 0; borg_kill *kill; borg_grid *ag; monster_race *r_ptr; /* Monster record */ kill = &borg_kills[i]; /* Monster race */ r_ptr = &r_info[kill->r_idx]; /* How far away is the target? */ cur_dis = distance(c_y, c_x, kill->y, kill->x); /* Calculation our chance of hitting. Player bonuses, Bow bonuses, Ammo Bonuses */ bonus = (borg_skill[BI_TOHIT] + borg_items[INVEN_BOW].to_h + borg_items[ammo_location].to_h); chance = (borg_skill[BI_THB] + (bonus * BTH_PLUS_ADJ)); armor = r_ptr->ac + cur_dis; /* Very quickly look for gold eating monsters */ for (k = 0; k < 4; k++) { /* gold eater */ if (r_ptr->blow[k].effect == RBE_EAT_GOLD) gold_eater = TRUE; } /* Analyze the damage type */ switch (typ) { /* Magic Missile */ case GF_MISSILE: break; /* Standard Arrow */ case GF_ARROW: if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Seeker Arrow/Bolt */ case GF_ARROW_SEEKER: if (!(rf_has(r_ptr->flags, RF_UNIQUE)) && (kill->level < borg_skill[BI_CLEVEL])) dam /= 3; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Silver Arrow/Bolt */ case GF_ARROW_SILVER: /* No code in 3.0 for this * if (rf_has(r_ptr->flags, RF_EVIL)) dam *= 3; * if (distance(c_y, c_x,kill->y, kill->x) == 1 && * !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; */ break; /* Arrow of Flame*/ case GF_ARROW_FLAME: if (!(rf_has(r_ptr->flags, RF_IM_FIRE))) dam *= 3; if ((rf_has(r_ptr->flags, RF_HURT_FIRE))) dam *= 2; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Arrow of Frost*/ case GF_ARROW_FROST: if (!rf_has(r_ptr->flags, RF_IM_COLD)) dam *= 3; if (rf_has(r_ptr->flags, RF_HURT_COLD)) dam *= 2; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Arrow of Hurt Animal*/ case GF_ARROW_ANIMAL: if (rf_has(r_ptr->flags, RF_ANIMAL)) dam *= 2; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Arrow of hurt evil */ case GF_ARROW_EVIL: if (rf_has(r_ptr->flags, RF_EVIL)) dam *= 2; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Arrow of slay undead*/ case GF_ARROW_UNDEAD: if (rf_has(r_ptr->flags, RF_UNDEAD)) dam *= 2; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Arrow of slay demon*/ case GF_ARROW_DEMON: if (rf_has(r_ptr->flags, RF_DEMON)) dam *= 2; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Arrow of slay orc*/ case GF_ARROW_ORC: if (rf_has(r_ptr->flags, RF_ORC)) dam *= 2; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Arrow of slay troll*/ case GF_ARROW_TROLL: if (rf_has(r_ptr->flags, RF_TROLL)) dam *= 2; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Arrow of slay giant*/ case GF_ARROW_GIANT: if (rf_has(r_ptr->flags, RF_GIANT)) dam *= 2; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Arrow of slay dragon*/ case GF_ARROW_DRAGON: if (rf_has(r_ptr->flags, RF_DRAGON)) dam *= 3; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Arrow of Wounding*/ case GF_ARROW_WOUNDING: if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Arrow of Poison Branding*/ case GF_ARROW_POISON: if (!(rf_has(r_ptr->flags, RF_IM_POIS))) dam *= 3; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Arrow of Holy Might*/ case GF_ARROW_HOLY: if (rf_has(r_ptr->flags, RF_EVIL)) dam *= 3; if (cur_dis == 1 && !(rf_has(r_ptr->flags, RF_UNIQUE))) dam /= 5; /* Do I hit regularly? (80%)*/ if (chance < armor * 8/10) dam = 0; break; /* Pure damage */ case GF_MANA: if (borg_fighting_unique && borg_has[POTION_RES_MANA] > 3) dam *= 2; break; /* Meteor -- powerful magic missile */ case GF_METEOR: break; /* Acid */ case GF_ACID: if (rf_has(r_ptr->flags, RF_IM_ACID)) dam = 0; break; /* Electricity */ case GF_ELEC: if (rf_has(r_ptr->flags, RF_IM_ELEC)) dam = 0; break; /* Fire damage */ case GF_FIRE: if (rf_has(r_ptr->flags, RF_IM_FIRE)) dam = 0; if ((rf_has(r_ptr->flags, RF_HURT_FIRE))) dam *= 2; break; /* Cold */ case GF_COLD: if (rf_has(r_ptr->flags, RF_IM_COLD)) dam = 0; if (rf_has(r_ptr->flags, RF_HURT_COLD)) dam *= 2; break; /* Poison */ case GF_POIS: if (rf_has(r_ptr->flags, RF_IM_POIS)) dam = 0; break; /* Ice */ case GF_ICE: if (rf_has(r_ptr->flags, RF_IM_COLD)) dam = 0; break; /* Holy Orb */ case GF_HOLY_ORB: if (rf_has(r_ptr->flags, RF_EVIL)) dam *= 2; break; /* dispel undead */ case GF_DISP_UNDEAD: if (!(rf_has(r_ptr->flags, RF_UNDEAD))) dam = 0; break; /* Dispel Evil */ case GF_DISP_EVIL: if (!(rf_has(r_ptr->flags, RF_EVIL))) dam = 0; break; /* Holy Word */ case GF_HOLY_WORD: if (!(rf_has(r_ptr->flags, RF_EVIL))) dam = 0; break; /* Weak Lite */ case GF_LIGHT_WEAK: if (!(rf_has(r_ptr->flags, RF_HURT_LIGHT))) dam = 0; break; /* Drain Life */ case GF_OLD_DRAIN: if (distance(c_y, c_x,kill->y, kill->x) == 1) dam /= 5; if ((rf_has(r_ptr->flags, RF_UNDEAD)) || (rf_has(r_ptr->flags, RF_DEMON)) || (strchr("Egv", r_ptr->d_char))) { dam = 0; } break; /* Stone to Mud */ case GF_KILL_WALL: if (!(rf_has(r_ptr->flags, RF_HURT_ROCK))) dam = 0; break; /* New mage spell */ case GF_NETHER: { if (rf_has(r_ptr->flags, RF_UNDEAD)) { dam = 0; } else if (rsf_has(r_ptr->spell_flags, RSF_BR_NETH)) { dam *= 3; dam /= 9; } else if (rf_has(r_ptr->flags, RF_EVIL)) { dam /= 2; } } break; /* New mage spell */ case GF_CHAOS: if (rsf_has(r_ptr->spell_flags, RSF_BR_CHAO)) { dam *=3; dam /= 9; } /* If the monster is Unique full damage ok. * Otherwise, polymorphing will reset HP */ if (!(rf_has(r_ptr->flags, RF_UNIQUE))) dam = -999; break; /* New mage spell */ case GF_GRAVITY: if (rsf_has(r_ptr->spell_flags, RSF_BR_GRAV)) { dam *= 3; dam /= 9; } break; /* New mage spell */ case GF_SHARD: if (rsf_has(r_ptr->spell_flags, RSF_BR_SHAR)) { dam *= 3; dam /= 9; } break; /* New mage spell */ case GF_SOUND: if (rsf_has(r_ptr->spell_flags, RSF_BR_SOUN)) { dam *= 3; dam /= 9; } break; /* Weird attacks */ case GF_PLASMA: if (rsf_has(r_ptr->spell_flags, RSF_BR_PLAS)) { dam *= 3; dam /= 9; } break; case GF_CONFU: if (rsf_has(r_ptr->spell_flags, RSF_BR_CONF)) { dam *= 3; dam /= 9; } break; case GF_DISEN: if (rsf_has(r_ptr->spell_flags, RSF_BR_DISE)) { dam *= 3; dam /= 9; } break; case GF_NEXUS: if (rsf_has(r_ptr->spell_flags, RSF_BR_NEXU)) { dam *= 3; dam /= 9; } break; case GF_FORCE: if (rsf_has(r_ptr->spell_flags, RSF_BR_WALL)) { dam *= 3; dam /= 9; } break; case GF_INERTIA: if (rsf_has(r_ptr->spell_flags, RSF_BR_INER)) { dam *= 3; dam /= 9; } break; case GF_TIME: if (rsf_has(r_ptr->spell_flags, RSF_BR_TIME)) { dam *= 3; dam /= 9; } break; case GF_LIGHT: if (rsf_has(r_ptr->spell_flags, RSF_BR_LIGHT)) { dam *= 3; dam /= 9; } break; case GF_DARK: if (rsf_has(r_ptr->spell_flags, RSF_BR_DARK)) { dam *= 3; dam /= 9; } break; case GF_WATER: if (rsf_has(r_ptr->spell_flags, RSF_BA_WATE)) { dam *= 3; dam /= 9; } dam /= 2; break; /* Various */ case GF_OLD_HEAL: case GF_OLD_CLONE: case GF_OLD_SPEED: case GF_DARK_WEAK: case GF_KILL_DOOR: case GF_KILL_TRAP: case GF_MAKE_WALL: case GF_MAKE_DOOR: case GF_MAKE_TRAP: case GF_AWAY_UNDEAD: case GF_TURN_EVIL: dam = 0; break; /* These spells which put the monster out of commission, we * look at the danger of the monster prior to and after being * put out of commission. The difference is the damage. * The following factors are considered when we * consider the spell: * * 1. Is it already comprised by that spell? * 2. Is it comprimised by another spell? * 3. Does it resist the modality? * 4. Will it make it's savings throw better than half the time? * 5. We generally ignore these spells for breeders. * * The spell sleep II and sanctuary have a special consideration * since the monsters must be adjacent to the player. */ case GF_AWAY_ALL: /* Teleport Other works differently. Basically the borg * will keep a list of all the monsters in the line of * fire. Then when he checks the danger, he will not * include those monsters. */ /* try not to teleport away uniques. These are the guys you are trying */ /* to kill! */ if (rf_has(r_ptr->flags, RF_UNIQUE)) { /* This unique is low on HP, finish it off */ if (kill->injury >= 60) dam = -9999; /* I am sitting pretty in an AS-Corridor */ else if (borg_as_position) dam = -9999; /* If this unique is causing the danger, get rid of it */ else if (dam > avoidance * 13/10 && borg_skill[BI_CDEPTH] <= 98) { /* get rid of this unique by storing his info */ borg_tp_other_index[borg_tp_other_n] = i; borg_tp_other_y[borg_tp_other_n] = kill->y; borg_tp_other_x[borg_tp_other_n] = kill->x; borg_tp_other_n ++; } /* If fighting multiple uniques, get rid of one */ else if (borg_fighting_unique >=2 && borg_fighting_unique <=8) { /* get rid of one unique or both if they are in a beam-line */ borg_tp_other_index[borg_tp_other_n] = i; borg_tp_other_y[borg_tp_other_n] = kill->y; borg_tp_other_x[borg_tp_other_n] = kill->x; borg_tp_other_n ++; } /* Unique is adjacent to Borg */ else if (borg_class == CLASS_MAGE && distance(c_y, c_x, kill->y, kill->x) <= 2) { /* get rid of unique next to me */ borg_tp_other_index[borg_tp_other_n] = i; borg_tp_other_y[borg_tp_other_n] = kill->y; borg_tp_other_x[borg_tp_other_n] = kill->x; borg_tp_other_n ++; } /* Unique in a vault, get rid of it, clean vault */ else if (vault_on_level) { /* Scan grids adjacent to monster */ for (ii = 0; ii < 8; ii++) { x = kill->x + ddx_ddd[ii]; y = kill->y + ddy_ddd[ii]; /* Access the grid */ ag = &borg_grids[y][x]; /* Skip unknown grids (important) */ if (ag->feat == FEAT_NONE) continue; /* Count adjacent Permas */ if (ag->feat == FEAT_PERM_INNER) vault_grids ++; } /* Near enough perma grids? */ if (vault_grids >= 2) { /* get rid of unique next to perma grids */ borg_tp_other_index[borg_tp_other_n] = i; borg_tp_other_y[borg_tp_other_n] = kill->y; borg_tp_other_x[borg_tp_other_n] = kill->x; borg_tp_other_n ++; } } else dam = -999; } else /* not a unique */ { /* get rid of this non-unique by storing his info */ borg_tp_other_index[borg_tp_other_n] = i; borg_tp_other_y[borg_tp_other_n] = kill->y; borg_tp_other_x[borg_tp_other_n] = kill->x; borg_tp_other_n ++; } break; /* This teleport away is used to teleport away all monsters * as the borg goes through his special attacks. */ case GF_AWAY_ALL_MORGOTH: /* Mostly no damage */ dam = 0; /* If its touching a glyph grid, nail it. */ for (j = 0; j < 8; j++) { int y2 = kill->y + ddy_ddd[j]; int x2 = kill->x + ddx_ddd[j]; /* Get the grid */ ag = &borg_grids[y2][x2]; /* If its touching a glyph grid, nail it. */ if (ag->feat == FEAT_GLYPH) { /* get rid of this one by storing his info */ borg_tp_other_index[borg_tp_other_n] = i; borg_tp_other_y[borg_tp_other_n] = kill->y; borg_tp_other_x[borg_tp_other_n] = kill->x; borg_tp_other_n ++; dam = 300; } } /* If the borg is not in a good position, do it */ if (morgoth_on_level && !borg_morgoth_position) { /* get rid of this one by storing his info */ borg_tp_other_index[borg_tp_other_n] = i; borg_tp_other_y[borg_tp_other_n] = kill->y; borg_tp_other_x[borg_tp_other_n] = kill->x; borg_tp_other_n ++; dam = 100; } /* If the borg does not have enough Mana to attack this * round and cast Teleport Away next round, then do it now. */ if (borg_skill[BI_CURSP] <= 35) { /* get rid of this unique by storing his info */ borg_tp_other_index[borg_tp_other_n] = i; borg_tp_other_y[borg_tp_other_n] = kill->y; borg_tp_other_x[borg_tp_other_n] = kill->x; borg_tp_other_n ++; dam = 150; } break; /* This GF_ is hacked to work for Mass Genocide. Since * we cannot mass gen uniques. */ case GF_DISP_ALL: if (rf_has(r_ptr->flags, RF_UNIQUE)) { dam = 0; break; } dam = borg_danger_aux(c_y,c_x,1,i, TRUE, TRUE); break; case GF_OLD_CONF: dam = 0; if (rf_has(r_ptr->flags, RF_NO_CONF)) break; if (rf_has(r_ptr->flags, RF_MULTIPLY)) break; if (kill->speed < r_ptr->speed - 5 ) break; if (kill->confused) break; if (!kill->awake) break; if ((kill->level > (borg_skill[BI_CLEVEL] < 13 ? 10 : (((borg_skill[BI_CLEVEL]-10)/4)*3) + 10))) break; dam = -999; if (rf_has(r_ptr->flags, RF_UNIQUE)) break; borg_confuse_spell = FALSE; p1 = borg_danger_aux(c_y,c_x,1,i, TRUE, TRUE); /* Make certain monsters appear to have more danger so the borg is more likely to use this attack */ if (kill->afraid && borg_skill[BI_CLEVEL] <=10) p1 = p1 + 20; borg_confuse_spell = TRUE; p2 = borg_danger_aux(c_y,c_x,1,i, TRUE, TRUE); borg_confuse_spell = FALSE; dam= (p1-p2); break; case GF_TURN_ALL: dam = 0; if (kill->speed < r_ptr->speed -5 ) break; if (rf_has(r_ptr->flags, RF_NO_FEAR)) break; if (kill->confused) break; if (!kill->awake) break; if ((kill->level > (borg_skill[BI_CLEVEL] < 13 ? 10 : (((borg_skill[BI_CLEVEL]-10)/4)*3) + 10))) break; dam = -999; if (rf_has(r_ptr->flags, RF_UNIQUE)) break; borg_fear_mon_spell = FALSE; p1 = borg_danger_aux(c_y,c_x,1,i, TRUE, TRUE); /* Make certain monsters appear to have more danger so the borg is more likely to use this attack */ if (kill->afraid && borg_skill[BI_CLEVEL] <=10) p1 = p1 + 20; borg_fear_mon_spell = TRUE; p2 = borg_danger_aux(c_y,c_x,1,i, TRUE, TRUE); borg_fear_mon_spell = FALSE; dam= (p1-p2); break; case GF_OLD_SLOW: dam = 0; if (kill->speed < r_ptr->speed - 5) break; if (kill->confused) break; if (!kill->awake) break; if ((kill->level > (borg_skill[BI_CLEVEL] < 13 ? 10 : (((borg_skill[BI_CLEVEL]-10)/4)*3) + 10))) break; dam = -999; if (rf_has(r_ptr->flags, RF_UNIQUE)) break; borg_slow_spell = FALSE; p1 = borg_danger_aux(c_y,c_x,1,i, TRUE, TRUE); /* Make certain monsters appear to have more danger so the borg is more likely to use this attack */ if (kill->afraid && borg_skill[BI_CLEVEL] <=10) p1 = p1 + 20; borg_slow_spell = TRUE; p2 = borg_danger_aux(c_y,c_x,1,i, TRUE, TRUE); borg_slow_spell = FALSE; dam= (p1-p2); break; case GF_OLD_SLEEP: dam = 0; if (rf_has(r_ptr->flags, RF_NO_SLEEP)) break; if (kill->speed < r_ptr->speed -5 ) break; if (kill->confused) break; if (!kill->awake) break; if ((kill->level > (borg_skill[BI_CLEVEL] < 13 ? 10 : (((borg_skill[BI_CLEVEL]-10)/4)*3) + 10))) break; dam = -999; if (rf_has(r_ptr->flags, RF_UNIQUE)) break; borg_sleep_spell = FALSE; p1 = borg_danger_aux(c_y,c_x,1,i, TRUE, TRUE); /* Make certain monsters appear to have more danger so the borg is more likely to use this attack */ if (kill->afraid && borg_skill[BI_CLEVEL] <=10) p1 = p1 + 20; borg_sleep_spell = TRUE; p2 = borg_danger_aux(c_y,c_x,1,i, TRUE, TRUE); borg_sleep_spell = FALSE; dam= (p1-p2); break; case GF_OLD_POLY: dam = 0; if ((kill->level > (borg_skill[BI_CLEVEL] < 13 ? 10 : (((borg_skill[BI_CLEVEL]-10)/4)*3) + 10))) break; dam = -999; if (rf_has(r_ptr->flags, RF_UNIQUE)) break; dam = borg_danger_aux(c_y,c_x,2,i, TRUE, TRUE); /* dont bother unless he is a scary monster */ if ((dam < avoidance * 2) && !kill->afraid) dam = 0; break; case GF_TURN_UNDEAD: if (rf_has(r_ptr->flags, RF_UNDEAD)) { dam = 0; if (kill->confused) break; if (kill->speed < r_ptr->speed -5 ) break; if (!kill->awake) break; if (kill->level > borg_skill[BI_CLEVEL]-5) break; borg_fear_mon_spell = FALSE; p1 = borg_danger_aux(c_y,c_x,1,i, TRUE, TRUE); borg_fear_mon_spell = TRUE; p2 = borg_danger_aux(c_y,c_x,1,i, TRUE, TRUE); borg_fear_mon_spell = FALSE; dam= (p1-p2); } else { dam = 0; } break; /* Banishment-- cast when in extreme danger (checked in borg_defense). */ case GF_AWAY_EVIL: if (rf_has(r_ptr->flags, RF_EVIL)) { /* try not teleport away uniques. */ if (rf_has(r_ptr->flags, RF_UNIQUE)) { /* Banish ones with escorts */ if (r_ptr->friends || r_ptr->friends_base) { dam = 0; } else { /* try not Banish non escorted uniques */ dam = -500; } } else { /* damage is the danger of the baddie */ dam = borg_danger_aux(c_y,c_x,1,i, TRUE, TRUE); } } else { dam = 0; } break; } /* use Missiles on certain types of monsters */ if ((borg_skill[BI_CDEPTH] >= 1) && (borg_danger_aux(kill->y,kill->x,1,i, TRUE, TRUE) > avoidance * 2/10 || ((r_ptr->friends || r_ptr->friends_base) /* monster has friends*/ && kill->level >= borg_skill[BI_CLEVEL] - 5 /* close levels */) || kill->ranged_attack /* monster has a ranged attack */ || rf_has(r_ptr->flags, RF_UNIQUE) || rf_has(r_ptr->flags, RF_MULTIPLY) || gold_eater || /* Monster can steal gold */ rf_has(r_ptr->flags, RF_NEVER_MOVE) /* monster never moves */ || borg_skill[BI_CLEVEL] <= 20 /* stil very weak */)) { borg_use_missile = TRUE; } /* Return Damage as pure danger of the monster */ if (typ == GF_AWAY_ALL || typ == GF_AWAY_EVIL || typ == GF_AWAY_ALL_MORGOTH) return (dam); /* Limit damage to twice maximal hitpoints */ if (dam > kill->power * 2 && !rf_has(r_ptr->flags, RF_UNIQUE)) dam = kill->power * 2; /* give a small bonus for whacking a unique */ /* this should be just enough to give prefrence to wacking uniques */ if ((rf_has(r_ptr->flags, RF_UNIQUE)) && borg_skill[BI_CDEPTH] >=1) dam = (dam * 3); /* Hack -- ignore Maggot until later. Player will chase Maggot * down all accross the screen waking up all the monsters. Then * he is stuck in a compromised situation. */ if ((rf_has(r_ptr->flags, RF_UNIQUE)) && borg_skill[BI_CDEPTH] ==0) { dam = dam * 2/3; /* Dont hunt maggot until later */ if (borg_skill[BI_CLEVEL] < 5) dam = 0; } /* give a small bonus for whacking a breeder */ if (rf_has(r_ptr->flags, RF_MULTIPLY)) dam = (dam * 3/2); /* Enhance the perceived damage to summoner in order to influence the * choice of targets. */ if ( (rsf_has(r_ptr->spell_flags, RSF_S_KIN)) || (rsf_has(r_ptr->spell_flags, RSF_S_HI_DEMON)) || (rsf_has(r_ptr->spell_flags, RSF_S_MONSTER)) || (rsf_has(r_ptr->spell_flags, RSF_S_MONSTERS)) || (rsf_has(r_ptr->spell_flags, RSF_S_ANIMAL)) || (rsf_has(r_ptr->spell_flags, RSF_S_SPIDER)) || (rsf_has(r_ptr->spell_flags, RSF_S_HOUND)) || (rsf_has(r_ptr->spell_flags, RSF_S_HYDRA)) || (rsf_has(r_ptr->spell_flags, RSF_S_AINU)) || (rsf_has(r_ptr->spell_flags, RSF_S_DEMON)) || (rsf_has(r_ptr->spell_flags, RSF_S_UNDEAD)) || (rsf_has(r_ptr->spell_flags, RSF_S_DRAGON)) || (rsf_has(r_ptr->spell_flags, RSF_S_HI_UNDEAD)) || (rsf_has(r_ptr->spell_flags, RSF_S_WRAITH)) || (rsf_has(r_ptr->spell_flags, RSF_S_UNIQUE)) ) dam += ((dam * 3)/2); /* * Apply massive damage bonus to Questor monsters to * encourage borg to strike them. */ if (rf_has(r_ptr->flags, RF_QUESTOR)) dam += (dam * 9); /* Try to conserve missiles. */ if (typ == GF_ARROW || (typ >= GF_ARROW_FLAME && typ <= GF_ARROW_HOLY)) { if (!borg_use_missile) /* set damage to zero, force borg to melee attack */ dam = 0; } /* Damage */ return (dam); } /* * Simulate / Invoke the launching of a bolt at a monster */ static int borg_launch_bolt_aux_hack(int i, int dam, int typ, int ammo_location) { int d, p2, p1, x, y; int o_y = 0; int o_x = 0; int walls =0; int unknown =0; borg_grid *ag; borg_kill *kill; monster_race *r_ptr; /* Monster */ kill = &borg_kills[i]; /* monster race */ r_ptr = &r_info[kill->r_idx]; /* Skip dead monsters */ if (!kill->r_idx) return (0); /* Require current knowledge */ if (kill->when < borg_t - 2) return (0); /* Acquire location */ x = kill->x; y = kill->y; /* Acquire the grid */ ag = &borg_grids[y][x]; /* Never shoot walls/doors */ if (!borg_cave_floor_grid(ag)) return (0); /* dont shoot at ghosts if not on known floor grid */ if ((rf_has(r_ptr->flags, RF_PASS_WALL)) && (ag->feat == FEAT_INVIS || (ag->feat != FEAT_FLOOR && ag->feat != FEAT_OPEN && ag->feat != FEAT_BROKEN && ag->feat != FEAT_TRAP_HEAD))) return (0); /* dont shoot at ghosts in walls, not perfect */ if (rf_has(r_ptr->flags, RF_PASS_WALL)) { /* if 2 walls and 1 unknown skip this monster */ /* Acquire location */ x = kill->x; y = kill->y; /* Get grid */ for (o_x = -1; o_x <= 1; o_x++) { for (o_y = -1; o_y <= 1; o_y++) { /* Acquire location */ x = kill->x + o_x; y = kill->y + o_y; ag = &borg_grids[y][x]; if (ag->feat >= FEAT_MAGMA && ag->feat <= FEAT_PERM_SOLID) walls++; if (ag->feat == FEAT_INVIS) unknown++; if (ag->feat == FEAT_NONE) unknown++; } } /* Is the ghost likely in a wall? */ if (walls >=2 && unknown >=1) return (0); } /* Calculate damage */ d = borg_launch_damage_one(i, dam, typ, ammo_location); /* Return Damage, on Teleport Other, true damage is * calculated elsewhere */ if (typ == GF_AWAY_ALL || typ == GF_AWAY_ALL_MORGOTH) return (d); /* Return Damage as pure danger of the monster */ if (typ == GF_AWAY_EVIL) return (d); /* Return 0 if the true damge (w/o the danger bonus) is 0 */ if (d <= 0) return (d); /* Calculate danger */ p2 = borg_danger_aux(y, x, 1, i, TRUE, FALSE); /* Hack -- avoid waking most "hard" sleeping monsters */ if (!kill->awake && (p2 > avoidance / 2) && (d < kill->power) && !borg_munchkin_mode) { return (-999); } /* Hack -- ignore sleeping town monsters */ if (!borg_skill[BI_CDEPTH] && !kill->awake) { return (0); } /* Hack -- ignore nonthreatening town monsters when low level */ if (!borg_skill[BI_CDEPTH] && borg_skill[BI_CLEVEL] < 3 /* && monster_is_nonthreatening_test */ ) { /* Nothing yet */ } /* Calculate "danger" to player */ p1 = borg_danger_aux(c_y, c_x, 1, i, TRUE, FALSE); /* Extra "bonus" if attack kills */ if (d >= kill->power) d = 2 * d; /* Add in dangers */ d = d + p1; /* Result */ return (d); } /* * Determine the "reward" of launching a beam/bolt/ball at a location * * An "unreachable" location always has zero reward. * * Basically, we sum the "rewards" of doing the appropriate amount of * damage to each of the "affected" monsters. * * We will attempt to apply the offset-ball attack here */ static int borg_launch_bolt_aux(int y, int x, int rad, int dam, int typ, int max, int ammo_location) { int ry, rx; int x1, y1; int x2, y2; int dist; int r, n; borg_grid *ag; monster_race *r_ptr; borg_kill *kill; borg_grid *ag_path; monster_race *r_ptr_path; borg_kill *kill_path; int q_x, q_y; /* Extract panel */ q_x = w_x / PANEL_WID; q_y = w_y / PANEL_HGT; /* Reset damage */ n = 0; /* Initial location */ x1 = c_x; y1 = c_y; /* Final location */ x2 = x; y2 = y; /* Start over */ x = x1; y = y1; /* Simulate the spell/missile path */ for (dist = 0; dist < max; dist++) { /* Bounds Check */ if (!cave_in_bounds_fully(cave, y2, x2)) break; /* Get the grid of the targetted monster */ ag = &borg_grids[y2][x2]; kill = &borg_kills[ag->kill]; r_ptr = &r_info[kill->r_idx]; /* Get the grid of the pathway monster, if any */ ag_path = &borg_grids[y][x]; kill_path = &borg_kills[ag_path->kill]; r_ptr_path = &r_info[kill_path->r_idx]; ag = &borg_grids[y][x]; /* Stop at walls */ /* note: beams end at walls. */ if (dist) { /* Stop at walls */ /* note if beam, this is the end of the beam */ /* dispel spells act like beams (sort of) */ if (!borg_cave_floor_grid(ag)) { if (rad != -1 && rad != 10) return (0); else return (n); } } /* Collect damage (bolts/beams) */ if (rad <= 0 || rad == 10) n += borg_launch_bolt_aux_hack(ag->kill, dam, typ, ammo_location); /* Check for arrival at "final target" */ /* except beams, which keep going. */ if ( (rad != -1 && rad !=10) && ((x == x2) && (y == y2))) break; /* Stop bolts at monsters */ if (!rad && ag->kill) return (n); /* The missile path can be complicated. There are several checks * which need to be made. First we assume that we targetting * a monster. That monster could be known from either sight or * ESP. If the entire pathway from us to the monster is known, * then there is no concern. But if the borg is shooting through * unknown grids, then there is a concern when he has ESP; without * ESP he would not see that monster if the unknown grids * contained walls or closed doors. * * 1. ESP Inactive * A. No Infravision * -Then the monster must be in a lit grid. OK to shoot * B. Yes Infravision * -Then the monster must be projectable() OK to shoot * 2. ESP Active * A. No Infravision * -Then the monster could be in a lit grid. Try to shoot * -Or I detect it with ESP and it's not projectable(). * B. Yes Infravision * -Then the monster could be projectable() * -Or I detect it with ESP and it's not projectable(). * -In the cases of ESP Active, the borg will test fire a missile. * Then wait for a 'painful ouch' from the monster. * * Low level borgs will not take the shot unless they have * a clean and known pathway. Borgs over a certain clevel, * will attempt the shot and listen for the 'ouch' repsonse * to know that the clear. If no 'Ouch' is heard, then the * borg will assume there is a wall in the way. Exception to * this is with arrows. Arrows can miss the target or fall * fall short, in which case no 'ouch' is heard. So the borg * allowed to miss two shots with arrows/bolts/thrown objects. */ /* dont do the check if esp */ if (!borg_skill[BI_ESP]) { /* Check the missile path--no Infra, no HAS_LIGHT */ if (dist && (borg_skill[BI_INFRA] <=0) && !rf_has(r_ptr->flags, RF_HAS_LIGHT)) { /* Stop at unknown grids (see above) */ /* note if beam, dispel, this is the end of the beam */ if (ag->feat == FEAT_NONE && borg_skill[BI_CLEVEL] < 5) { if (rad != -1 && rad !=10) return (0); else return (n); } /* Stop at weird grids (see above). * FEAT_INVIS is granted to grids which were unknown, * Then contained a monster or object. Most of the time * FEAT_INVIS is a floor grid. But could be a * monster which has PASS_WALL, in which case, bolts * will not affect it. * Note if beam, this is the end of the beam. */ if (ag->feat == FEAT_INVIS && (borg_skill[BI_CLEVEL] < 5 || rf_has(r_ptr_path->flags, RF_PASS_WALL))) /* should be THIS grid's monster is passwall */ { if (rad != -1 && rad !=10) return (0); else return (n); } /* Stop at unseen walls */ /* We just shot and missed, this is our next shot */ if (successful_target < 0) { /* When throwing things, it is common to just 'miss' */ /* Skip only one round in this case */ if (successful_target <= -12) successful_target = 0; if (rad != -1 && rad !=10) return (0); else return (n); } } else /* I do have infravision or it's a lite monster */ { /* Stop at unseen walls */ /* We just shot and missed, this is our next shot */ if (successful_target < 0) { /* When throwing things, it is common to just 'miss' */ /* Skip only one round in this case */ if (successful_target <= -12) successful_target = 0; if (rad != -1 && rad !=10) return (0); else return (n); } } } else /* I do have ESP */ { /* Check the missile path */ if (dist ) { /* if this area has been magic mapped, * ok to shoot in the dark */ if (!borg_detect_wall[q_y+0][q_x+0] && !borg_detect_wall[q_y+0][q_x+1] && !borg_detect_wall[q_y+1][q_x+0] && !borg_detect_wall[q_y+1][q_x+1] && borg_fear_region[c_y/11][c_x/11] < avoidance / 20) { /* Stop at unknown grids (see above) */ /* note if beam, dispel, this is the end of the beam */ if (ag->feat == FEAT_NONE && borg_skill[BI_CLEVEL] < 5) { if (rad != -1 && rad !=10) return (0); else return (n); } /* Stop at unseen walls */ /* We just shot and missed, this is our next shot */ if (successful_target < 0) { /* When throwing things, it is common to just 'miss' */ /* Skip only one round in this case */ if (successful_target <= -12) successful_target = 0; if (rad != -1 && rad !=10) return (0); else return (n); } } /* Stop at weird grids (see above) */ /* note if beam, this is the end of the beam */ if (ag->feat == FEAT_INVIS && (borg_skill[BI_CLEVEL] < 5 || (rf_has(r_ptr->flags, RF_PASS_WALL)))) /* should be THIS grid's monster is passwall */ { if (rad != -1 && rad !=10) return (0); else return (n); } /* Stop at unseen walls */ /* We just shot and missed, this is our next shot */ if (successful_target < 0) { /* When throwing things, it is common to just 'miss' */ /* Skip only one round in this case */ if (successful_target <= -12) successful_target = 0; if (rad != -1 && rad !=10) return (0); else return (n); } } } /* Calculate the new location */ mmove2(&y, &x, y1, x1, y2, x2); } /* Bolt/Beam attack */ if (rad <= 0 ) return (n); /* Excessive distance */ if (dist >= max) return (0); /* Check monsters and objects in blast radius */ for (ry = y2 - rad; ry < y2 + rad; ry++) { for (rx = x2 - rad; rx < x2 + rad; rx++) { /* Bounds check */ if (!cave_in_bounds(cave, ry, rx)) continue; /* Get the grid */ ag = &borg_grids[ry][rx]; /* Check distance */ r = distance(y2, x2, ry, rx); /* Maximal distance */ if (r > rad) continue; /* Never pass through walls*/ if (!borg_los(y2, x2, ry, rx)) continue; /* dispel spells should hurt the same no matter the rad: make r= y and x */ if (rad == 10) r = 0; /* Collect damage, lowered by distance */ n += borg_launch_bolt_aux_hack(ag->kill, dam / (r + 1), typ, ammo_location); /* probable damage int was just changed by b_l_b_a_h*/ /* check destroyed stuff. */ if (ag->take) { borg_take *take = &borg_takes[ag->take]; object_kind *k_ptr = take->kind; switch (typ) { case GF_ACID: { /* rings/boots cost extra (might be speed!) */ if (k_ptr->tval == TV_BOOTS && !k_ptr->aware) { n -= 20; } break; } case GF_ELEC: { /* rings/boots cost extra (might be speed!) */ if (k_ptr->tval == TV_RING && !k_ptr->aware) { n -= 20; } if (k_ptr->tval == TV_RING && k_ptr->sval == SV_RING_SPEED) { n -= 2000; } break; } case GF_FIRE: { /* rings/boots cost extra (might be speed!) */ if (k_ptr->tval == TV_BOOTS && !k_ptr->aware) { n -= 20; } break; } case GF_COLD: { if (k_ptr->tval == TV_POTION) { n -= 20; /* Extra penalty for cool potions */ if (!k_ptr->aware || k_ptr->sval == SV_POTION_HEALING || k_ptr->sval == SV_POTION_STAR_HEALING || k_ptr->sval == SV_POTION_LIFE || (k_ptr->sval == SV_POTION_INC_STR && amt_add_stat[A_STR] >= 1000) || (k_ptr->sval == SV_POTION_INC_INT && amt_add_stat[A_INT] >= 1000) || (k_ptr->sval == SV_POTION_INC_WIS && amt_add_stat[A_WIS] >= 1000) || (k_ptr->sval == SV_POTION_INC_DEX && amt_add_stat[A_DEX] >= 1000) || (k_ptr->sval == SV_POTION_INC_CON && amt_add_stat[A_CON] >= 1000)) n -= 2000; } break; } case GF_MANA: { /* Used against uniques, allow the stuff to burn */ break; } } } } } /* Result */ return (n); } /* * Simulate/Apply the optimal result of launching a beam/bolt/ball * * Note that "beams" have a "rad" of "-1", "bolts" have a "rad" of "0", * and "balls" have a "rad" of "2" or "3", depending on "blast radius". * dispel spells have a rad of 10 */ static int borg_launch_bolt(int rad, int dam, int typ, int max, int ammo_location) { int i=0; int b_i = -1; int n=0; int b_n = -1; int b_o_y = 0, b_o_x = 0; int o_y =0, o_x = 0; int d, b_d = MAX_RANGE; /* Examine possible destinations */ /* This will allow the borg to target places adjacent to a monster * in order to exploit and abuse a feature of the game. Whereas, * the borg, while targeting a monster will not score d/t walls, he * could land a successful hit by targeting adjacent to the monster. * For example: * ###################### * #####....@......###### * ############Px........ * ###################### * In order to hit the P, the borg must target the x and not the P. * */ for (i = 0; i < borg_temp_n; i++) { int x = borg_temp_x[i]; int y = borg_temp_y[i]; /* Consider each adjacent spot to and on top of the monster */ for (o_x = -1; o_x <= 1; o_x++) { for (o_y = -1; o_y <= 1; o_y++) { /* Acquire location */ x = borg_temp_x[i] + o_x; y = borg_temp_y[i] + o_y; /* Reset Teleport Other variables */ borg_tp_other_n = 0; n = 0; /* Bounds check */ if (!cave_in_bounds(cave, y,x)) continue; /* Remember how far away the monster is */ d = distance(c_y, c_x, borg_temp_y[i], borg_temp_x[i]); /* Skip certain types of Offset attacks */ if ((x != borg_temp_x[i] || y != borg_temp_y[i]) && typ == GF_AWAY_ALL) continue; /* Skip places that are out of range */ if (distance(c_y, c_x, y, x) > max) continue; /* Consider it if its a ball spell or right on top of it */ if ((rad >= 2 && borg_grids[y][x].feat != FEAT_NONE) || (y == borg_temp_y[i] && x == borg_temp_x[i])) n = borg_launch_bolt_aux(y, x, rad, dam, typ, max, ammo_location); /* Teleport Other is now considered */ if (typ == GF_AWAY_ALL && n > 0) { /* Consider danger with certain monsters removed * from the danger check. They were removed from the list of * considered monsters (borg_tp_other array) */ n = borg_danger(c_y, c_x, 1, TRUE, FALSE); /* Skip Offsets that do only 1 damage */ if (n == 1) n = -10; } /* Reset Teleport Other variables */ borg_tp_other_n = 0; /* Skip useless attacks */ if (n <= 0) continue; /* The game forbids targetting the outside walls */ if (x == 0 || y == 0 || x == DUNGEON_WID-1 || y == DUNGEON_HGT-1) continue; /* Collect best attack */ if ((b_i >= 0) && (n < b_n)) continue; /* Skip attacking farther monster if rewards are equal. */ if (n == b_n && d > b_d) continue; /* Track it */ b_i = i; b_n = n; b_o_y = o_y; b_o_x = o_x; b_d = d; } } } /* Reset Teleport Other variables */ borg_tp_other_n = 0; /* Simulation */ if (borg_simulate) return (b_n); /* Save the location */ g_x = borg_temp_x[b_i] + b_o_x; g_y = borg_temp_y[b_i] + b_o_y; /* Target the location */ (void)borg_target(g_y, g_x); /* Result */ return (b_n); } /* * Simulate/Apply the optimal result of launching a normal missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) break; /* Skip Ego branded items--they are looked at later */ if (item->name2) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Boost the perceived damage on unID'd ones so he can get a quick pseudoID on it */ if (strstr(item->note, "magical")) d = d * 99; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d <= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing standard missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile from the quiver */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a SEEKER missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_seeker(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; /* Skip non-seekers items--they are looked at later */ if (item->sval != SV_AMMO_HEAVY) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d <= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_SEEKER, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing seeker missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a SILVER missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_silver(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; /* Skip non-seekers items--they are looked at later */ if (item->sval != SV_AMMO_SILVER) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d <= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_SILVER, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing silver missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_flame(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; if (!of_has(item->flags, OF_BRAND_FIRE)) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d <= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_FLAME, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing flame branded missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_frost(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; if (!of_has(item->flags, OF_BRAND_COLD)) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d<= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_FROST, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing frost branded missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress(b_k+73); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_venom(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; if (!of_has(item->flags, OF_BRAND_POIS)) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d <= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_POISON, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing venom branded missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_holy(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; if (!of_has(item->flags, OF_SLAY_EVIL)) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d <= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_HOLY, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing holy branded missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_animal(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; if (!of_has(item->flags, OF_SLAY_ANIMAL)) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Skip un-identified, non-average, missiles */ if (!item->ident && !streq(item->note, "{average}")) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d<= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_ANIMAL, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing animal missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_undead(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; if (!of_has(item->flags, OF_SLAY_UNDEAD)) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d<= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_UNDEAD, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing undead missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_demon(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; if (!of_has(item->flags, OF_SLAY_DEMON)) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d<= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_DEMON, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing demon missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_orc(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; if (!of_has(item->flags, OF_SLAY_ORC)) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d<= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_ORC, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing orc missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_troll(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; if (!of_has(item->flags, OF_SLAY_TROLL)) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d<= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_TROLL, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing troll missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_giant(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; if (!of_has(item->flags, OF_SLAY_GIANT)) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d<= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_GIANT, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing giant missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_dragon(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; if (!of_has(item->flags, OF_SLAY_DRAGON) && !of_has(item->flags, OF_KILL_DRAGON)) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d<= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_DRAGON, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing dragon branded missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_evil(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; if (!of_has(item->flags, OF_SLAY_EVIL)) continue; /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d<= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_EVIL, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing evil branded missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of launching a branded missile * * First, pick the "optimal" ammo, then pick the optimal target */ static int borg_attack_aux_launch_wounding(void) { int b_n = 0; int k , b_k = -1; int d , b_d = -1; borg_item *bow = &borg_items[INVEN_BOW]; /* Scan the pack */ for (k = QUIVER_START; k < QUIVER_END; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; if (item->sval == SV_AMMO_HEAVY) continue; /* if (item->name2 != EGO_WOUNDING) continue; The wounding flag was removed in 330. */ /* Skip bad missiles */ if (item->tval != my_ammo_tval) continue; /* Skip worthless missiles */ if (item->value <= 0) continue; /* Determine average damage */ d = (item->dd * (item->ds + 1) / 2); d = d + item->to_d + bow->to_d; d = d * my_ammo_power * borg_skill[BI_SHOTS]; /* Paranoia */ if (d <= 0) continue; if ((b_k >=0) && (d<= b_d)) continue; b_k = k; b_d = d; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal type of bolt */ b_n = borg_launch_bolt(0, b_d, GF_ARROW_WOUNDING, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Firing wounding branded missile '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('f'); /* Use the missile */ borg_keypress((b_k+73)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* Attempt to rest on the grid to allow the monster to approach me. * Make sure the monster does not have a ranged attack and that I am * inclined to attack him. */ static int borg_attack_aux_rest(void) { int i; bool resting_is_good = FALSE; int my_danger = borg_danger(c_y, c_x, 1, FALSE, FALSE); /* Examine all the monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill = &borg_kills[i]; int x9 = kill->x; int y9 = kill->y; int ax, ay, d; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Distance components */ ax = (x9 > c_x) ? (x9 - c_x) : (c_x - x9); ay = (y9 > c_y) ? (y9 - c_y) : (c_y - y9); /* Distance */ d = MAX(ax, ay); /* Minimal and maximal distance */ if (d != 2) continue; /* Ranged Attacks, don't rest. */ if (kill->ranged_attack) continue; /* Skip the sleeping ones */ if (!kill->awake) continue; /* need to have seen it recently */ if (borg_t - kill->when > 10) continue; /* Skip monsters that dont chase */ if (rf_has(r_info[kill->r_idx].flags, RF_NEVER_MOVE)) continue; /* Monster better not be faster than me */ if (kill->speed - borg_skill[BI_SPEED] >=5) continue; /* Should be flowing towards the monster */ if (goal != GOAL_KILL || borg_flow_y[0] != kill->y) continue; /* Cant have an obstacle between us */ if (!borg_los(c_y, c_x, kill->y, kill->x)) continue; /* Might be a little dangerous to just wait here */ if ( my_danger > borg_skill[BI_CURHP]) continue; /* Should be a good idea to wait for monster here. */ resting_is_good = TRUE; } /* Not a good idea */ if (resting_is_good == FALSE) return (0); /* Return some value for this rest */ if (borg_simulate) return (1); /* Rest */ borg_keypress(','); borg_note(format("# Resting on grid (%d, %d), waiting for monster to approach.",c_y,c_x)); /* All done */ return (1); } /* * Simulate/Apply the optimal result of throwing an object * * First choose the "best" object to throw, then check targets. */ static int borg_attack_aux_object(void) { int b_n; int b_r = 0; int k, b_k = -1; int d, b_d = -1; int div, mul; /* Scan the pack */ for (k = 0; k < INVEN_MAX_PACK; k++) { borg_item *item = &borg_items[k]; /* Skip empty items */ if (!item->iqty) continue; /* Skip un-identified, non-average, objects */ /* if (!item->ident && !streq(item->note, "{average}")) continue; */ /* Skip my spell/prayer book */ if (item->tval == p_ptr->class->spell_book) continue; /* Skip "equipment" items (not ammo) */ if (borg_wield_slot(item) >= 0) continue; /* Skip wands, they are worth money */ if (item->tval == TV_WAND) continue; /* Determine average damage from object */ d = (k_info[item->kind].dd * (k_info[item->kind].ds + 1) / 2); /* Skip useless stuff */ if (d <= 0) continue; /* Skip "expensive" stuff */ if (item->tval != TV_POTION && item->sval != SV_POTION_DETONATIONS && d < item->value && borg_skill[BI_CLEVEL] > 5) continue; /* Hack -- Save Detonations for Uniques */ if (item->tval == TV_POTION && item->sval == SV_POTION_DETONATIONS && !borg_fighting_unique) continue; /* Hack -- Save Heals and cool stuff */ if (item->tval == TV_POTION && item->sval != SV_POTION_DETONATIONS) continue; /* Hack -- Save last flasks for fuel, if needed */ if (item->tval == TV_FLASK && (borg_skill[BI_AFUEL] <= 1 && !borg_fighting_unique)) continue; /* Dont throw wands or rods */ if (item->tval == TV_ROD || item->tval == TV_ROD) continue; /* Ignore worse damage */ if ((b_k >= 0) && (d <= b_d)) continue; /* Track */ b_k = k; b_d = d; /* Extract a "distance multiplier" */ mul = 10; /* Enforce a minimum "weight" of one pound */ div = ((item->weight > 10) ? item->weight : 10); /* Hack -- Distance -- Reward strength, penalize weight */ b_r = (adj_str_blow[my_stat_ind[A_STR]] + 20) * mul / div; /* Max distance of 10 */ if (b_r > 10) b_r = 10; } /* Nothing to use */ if (b_k < 0) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Choose optimal location */ b_n = borg_launch_bolt(0, b_d, GF_ARROW, 6 + 2 * my_ammo_power, b_k); /* Simulation */ if (borg_simulate) return (b_n); /* Do it */ borg_note(format("# Throwing painful object '%s'", borg_items[b_k].desc)); /* Fire */ borg_keypress('v'); /* Use the object */ borg_keypress(I2A(b_k)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -2; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of using a "normal" attack spell * * Take into account the failure rate of spells/objects/etc. XXX XXX XXX */ static int borg_attack_aux_spell_bolt(int book, int what, int rad, int dam, int typ) { int b_n; int penalty =0; borg_magic *as = &borg_magics[book][what]; /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Paranoia */ if (borg_simulate && (borg_class != CLASS_MAGE && borg_skill[BI_CLEVEL] <= 2) && (randint0(100) < 1)) return (0); /* Not if money scumming in town */ if (borg_money_scum_amount && borg_skill[BI_CDEPTH] == 0) return (0); /* Not if low on food */ if (borg_skill[BI_FOOD] == 0 && (borg_skill[BI_ISWEAK] && borg_spell_legal(2, 0))) return (0); /* Require ability (right now) */ if (!borg_spell_okay_fail(book, what, (borg_fighting_unique ? 40 : 25))) return (0); /* Choose optimal location */ b_n = borg_launch_bolt(rad, dam, typ, MAX_RANGE, 0); /* weak mages need that spell, they dont get penalized */ /* weak == those that can't teleport reliably anyway */ if (book == 0 && what == 0 && (!borg_spell_legal_fail(1, 5, 15) || borg_skill[BI_MAXCLEVEL] <= 30)) { if (borg_simulate) return (b_n); } /* Penalize mana usage except on MM */ if (book != 0 && what != 0) { /* Standard penalty */ b_n = b_n - as->power; /* Extra penalty if the cost far outweighs the damage */ if (borg_skill[BI_MAXSP] < 50 && as->power > b_n) b_n = b_n - as->power; /* Penalize use of reserve mana */ if (borg_skill[BI_CURSP] - as->power < borg_skill[BI_MAXSP] / 2) b_n = b_n - (as->power * 3); /* Penalize use of deep reserve mana */ if (borg_skill[BI_CURSP] - as->power < borg_skill[BI_MAXSP] / 3) b_n = b_n - (as->power * 5); } /* Really penalize use of mana needed for final teleport */ if (borg_class == CLASS_MAGE) penalty = 6; if (borg_class == CLASS_RANGER) penalty = 22; if (borg_class == CLASS_ROGUE) penalty = 20; if ((borg_skill[BI_MAXSP] > 30) && (borg_skill[BI_CURSP] - as->power < penalty)) b_n = b_n - (as->power * 750); /* Simulation */ if (borg_simulate) return (b_n); /* Cast the spell */ (void)borg_spell(book, what); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -1; /* Value */ return (b_n); } /* This routine is the same as the one above only in an emergency case. * The borg will enter negative mana casting this */ static int borg_attack_aux_spell_bolt_reserve(int book, int what, int rad, int dam, int typ) { int b_n; int i; int x9, y9, ax, ay, d; int near_monsters = 0; /* Fake our Mana */ int sv_mana = borg_skill[BI_CURSP]; /* Only Weak guys should try this */ if (borg_skill[BI_CLEVEL] >= 15) return (0); /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Not if low on food */ if (borg_skill[BI_FOOD] == 0 && (borg_skill[BI_ISWEAK] && borg_spell_legal(2, 0))) return (0); /* Must not have enough mana right now */ if (borg_spell_okay_fail(book, what, 25)) return (0); /* Must be dangerous */ if (borg_danger(c_y, c_x,1, TRUE, FALSE) < avoidance * 2) return (0); /* Find the monster */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; /* Monster */ kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* check the location */ x9 = kill->x; y9 = kill->y; /* Distance components */ ax = (x9 > c_x) ? (x9 - c_x) : (c_x - x9); ay = (y9 > c_y) ? (y9 - c_y) : (c_y - y9); /* Distance */ d = MAX(ax, ay); /* Count the number of close monsters * There should only be one close monster. * We do not want to risk fainting. */ if (d < 7) near_monsters ++; /* If it has too many hp to be taken out with this */ /* spell, don't bother trying */ /* NOTE: the +4 is because the damage is toned down as an 'average damage' */ if (kill->power > (dam+4)) return (0); /* Do not use it in town */ if (borg_skill[BI_CDEPTH] == 0) return (0); break; } /* Should only be 1 near monster */ if (near_monsters > 1) return (0); /* Require ability (with faked mana) */ borg_skill[BI_CURSP] = borg_skill[BI_MAXSP]; if (!borg_spell_okay_fail(book, what, 25)) { /* Restore Mana */ borg_skill[BI_CURSP] = sv_mana; return (0); } /* Choose optimal location */ b_n = borg_launch_bolt(rad, dam, typ, MAX_RANGE, 0); /* return the value */ if (borg_simulate) { /* Restore Mana */ borg_skill[BI_CURSP] = sv_mana; return (b_n); } /* Cast the spell with fake mana */ borg_skill[BI_CURSP] = borg_skill[BI_MAXSP]; if (borg_spell_fail(book, what, 25)) { /* Note the use of the emergency spell */ borg_note("# Emergency use of an Attack Spell."); /* verify use of spell */ /* borg_keypress('y'); */ } /* Use target */ /* borg_keypress('5'); */ borg_confirm_target = TRUE; /* Set our shooting flag */ successful_target = -1; /* restore true mana */ borg_skill[BI_CURSP] = 0; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of using a "normal" attack prayer */ static int borg_attack_aux_prayer_bolt(int book, int what, int rad, int dam, int typ) { int b_n; int penalty =0; int fail_rate = 25; borg_magic *as = &borg_magics[book][what]; /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Paranoia */ if (borg_simulate && (randint0(100) < 2)) return (0); /* Not if money scumming in town */ if (borg_money_scum_amount >= 1 && borg_skill[BI_CDEPTH] == 0) return (0); /* Not if low on food */ if (borg_skill[BI_FOOD] == 0 && (borg_skill[BI_ISWEAK] && borg_prayer_legal(5, 2))) return (0); /* Boost Fail rate while in munchkin mode, its safe on the stair */ if (borg_munchkin_mode) fail_rate = 35; /* Require ability */ if (!borg_prayer_okay_fail(book, what, fail_rate)) return (0); /* Choose optimal location */ b_n = borg_launch_bolt(rad, dam, typ, MAX_RANGE, 0); /* Penalize mana usage except Orb */ if (book != 2 && what != 1) { /* Standard penalty */ b_n = b_n - as->power; /* Penalize use of reserve mana */ if (borg_skill[BI_CURSP] - as->power < borg_skill[BI_MAXSP] / 2) b_n = b_n - (as->power * 3); /* Penalize use of deep reserve mana */ if (borg_skill[BI_CURSP] - as->power < borg_skill[BI_MAXSP] / 3) b_n = b_n - (as->power * 5); } /* Really penalize use of mana needed for final teleport */ if (borg_class == CLASS_PRIEST) penalty = 8; if (borg_class == CLASS_PALADIN) penalty =20; if ((borg_skill[BI_MAXSP] > 30) && (borg_skill[BI_CURSP] - as->power < penalty)) b_n = b_n - (as->power * 750); /* Simulation */ if (borg_simulate) return (b_n); /* Cast the prayer */ (void)borg_prayer(book, what); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -1; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of using a "dispel" attack prayer */ static int borg_attack_aux_prayer_dispel(int book, int what, int dam, int typ) { int b_n; int penalty =0; borg_magic *as = &borg_magics[book][what]; /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Not if low on food */ if (borg_skill[BI_FOOD] == 0 && (borg_skill[BI_ISWEAK] && borg_prayer_legal(5, 2))) return (0); /* Paranoia */ if (borg_simulate && (randint0(100) < 2)) return (0); /* Require ability */ if (!borg_prayer_okay_fail(book, what, 25)) return (0); /* Choose optimal location--radius defined as 10 */ b_n = borg_launch_bolt(10, dam, typ, MAX_RANGE, 0); /* Penalize mana usage */ b_n = b_n - as->power; /* Penalize use of reserve mana */ if (borg_skill[BI_CURSP] - as->power < borg_skill[BI_MAXSP] / 2) b_n = b_n - (as->power * 3); /* Penalize use of deep reserve mana */ if (borg_skill[BI_CURSP] - as->power < borg_skill[BI_MAXSP] / 3) b_n = b_n - (as->power * 5); /* Really penalize use of mana needed for final teleport */ if (borg_class == CLASS_PRIEST) penalty = 8; if (borg_class == CLASS_PALADIN) penalty =20; if ((borg_skill[BI_MAXSP] > 30) && (borg_skill[BI_CURSP] - as->power < penalty)) b_n = b_n - (as->power * 750); /* Simulation */ if (borg_simulate) return (b_n); /* Cast the prayer */ (void)borg_prayer(book, what); /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of using a "dispel" attack spell */ static int borg_attack_aux_spell_dispel(int book, int what, int dam, int typ) { int b_n; int penalty =0; borg_magic *as = &borg_magics[book][what]; /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Not if low on food */ if (borg_skill[BI_FOOD] == 0 && (borg_skill[BI_ISWEAK] && borg_spell_legal(2, 0))) return (0); /* Paranoia */ if (borg_simulate && (randint0(100) < 2)) return (0); /* Require ability */ if (!borg_spell_okay_fail(book, what, 25)) return (0); /* Choose optimal location--radius defined as 10 */ b_n = borg_launch_bolt(10, dam, typ, MAX_RANGE, 0); /* Penalize mana usage */ b_n = b_n - as->power; /* Penalize use of reserve mana */ if (borg_skill[BI_CURSP] - as->power < borg_skill[BI_MAXSP] / 2) b_n = b_n - (as->power * 3); /* Penalize use of deep reserve mana */ if (borg_skill[BI_CURSP] - as->power < borg_skill[BI_MAXSP] / 3) b_n = b_n - (as->power * 5); /* Really penalize use of mana needed for final teleport */ if (borg_class == CLASS_MAGE) penalty = 6; if (borg_class == CLASS_RANGER) penalty =22; if (borg_class == CLASS_ROGUE) penalty = 20; if ((borg_skill[BI_MAXSP] > 30) && (borg_skill[BI_CURSP] - as->power < penalty)) b_n = b_n - (as->power * 750); /* Really penalize use of mana needed for final teleport */ /* (6 pts for mage) */ if ((borg_skill[BI_MAXSP] > 30) && (borg_skill[BI_CURSP] - as->power) < 6) b_n = b_n - (as->power * 750); /* Simulation */ if (borg_simulate) return (b_n); /* Cast the prayer */ (void)borg_spell(book, what); /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of using a "dispel" staff * Which would be dispel evil, power, holiness. Genocide handeled later. */ static int borg_attack_aux_staff_dispel(int sval, int rad, int dam, int typ) { int b_n; /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Paranoia */ if (borg_simulate && (randint0(100) < 2)) return (0); /* look for the staff */ if (!borg_equips_staff_fail(sval)) return (0); /* Choose optimal location--radius defined as 10 */ b_n = borg_launch_bolt(10, dam, typ, MAX_RANGE, 0); /* Big Penalize charge usage */ b_n = b_n - 50; /* Simulation */ if (borg_simulate) return (b_n); /* Cast the prayer */ (void)borg_use_staff(sval); /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of using a "normal" attack rod */ static int borg_attack_aux_rod_bolt(int sval, int rad, int dam, int typ) { int b_n; /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Paranoia */ if (borg_simulate && (randint0(100) < 2)) return (0); /* Not likely to be successful in the activation */ if (500 < borg_activate_failure(TV_ROD, sval)) return (0); /* Look for that rod */ if (!borg_equips_rod(sval)) return (0); /* Choose optimal location */ b_n = borg_launch_bolt(rad, dam, typ, MAX_RANGE, 0); /* Simulation */ if (borg_simulate) return (b_n); /* Zap the rod */ (void)borg_zap_rod(sval); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -1; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of using a "normal" attack wand */ static int borg_attack_aux_wand_bolt(int sval, int rad, int dam, int typ) { int i; int b_n; /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Dont use wands in town, charges are too spendy */ if (!borg_skill[BI_CDEPTH]) return (0); /* Paranoia */ if (borg_simulate && (randint0(100) < 2)) return (0); /* Look for that wand */ i = borg_slot(TV_WAND, sval); /* None available */ if (i < 0) return (0); /* No charges */ if (!borg_items[i].pval) return (0); /* Not likely to be successful in the activation */ if (500 < borg_activate_failure(TV_WAND, sval)) return (0); /* Choose optimal location */ b_n = borg_launch_bolt(rad, dam, typ, MAX_RANGE, 0); /* Penalize charge usage */ if (borg_skill[BI_CLEVEL] > 5) b_n = b_n - 5; /* Wands of wonder are used in last ditch efforts. They behave * randomly, so the best use of them is an emergency. I have seen * borgs die from hill orcs with fully charged wonder wands. Odds * are he could have taken the orcs with the wand. So use them in * an emergency after all the borg_caution() steps have failed */ if (sval == SV_WAND_WONDER && !borg_munchkin_mode) { /* check the danger */ if (b_n > 0 && borg_danger(c_y,c_x,1, TRUE, FALSE) >= (avoidance * 7/10) ) { /* make the wand appear deadly */ b_n = 999; /* note the use of the wand in the emergency */ borg_note(format("# Emergency use of a Wand of Wonder.")); } else { b_n = 0; } } /* Simulation */ if (borg_simulate) return (b_n); /* Aim the wand */ (void)borg_aim_wand(sval); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -1; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of using an un-id'd wand */ static int borg_attack_aux_wand_bolt_unknown(int dam, int typ) { int i; int b_i = -1; int b_n; /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Paranoia */ if (borg_simulate && (randint0(100) < 5)) return (0); /* Look for an un-id'd wand */ for (i=0; i < INVEN_MAX_PACK; i++) { if (borg_items[i].tval != TV_WAND) continue; /* known */ if (borg_items[i].kind) continue; /* No charges */ if (!borg_items[i].pval) continue; if (strstr(borg_items[i].desc, "empty")) continue; /* Select this wand */ b_i = i; } /* None available */ if (b_i < 0) return (0); /* Choose optimal location */ b_n = borg_launch_bolt(0, dam, typ, MAX_RANGE, 0); /* Simulation */ if (borg_simulate) return (b_n); /* Log the message */ borg_note(format("# Aiming unknown wand '%s.'", borg_items[b_i].desc)); /* record the address to avoid certain bugs with inscriptions&amnesia */ zap_slot = b_i; /* Perform the action */ borg_keypress('a'); borg_keypress(I2A(b_i)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -1; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of using an un-id'd rod */ static int borg_attack_aux_rod_bolt_unknown(int dam, int typ) { int i; int b_i = -1; int b_n; /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Paranoia */ if (borg_simulate && (randint0(100) < 5)) return (0); /* Look for an un-id'd wand */ for (i=0; i < INVEN_MAX_PACK; i++) { if (borg_items[i].tval != TV_ROD) continue; /* known */ if (borg_items[i].kind) continue; /* No charges */ if (!borg_items[i].pval) continue; /* Not an attacker */ if (strstr(borg_items[i].desc, "tried")) continue; /* Select this rod */ b_i = i; } /* None available */ if (b_i < 0) return (0); /* Choose optimal location */ b_n = borg_launch_bolt(0, dam, typ, MAX_RANGE, 0); /* Simulation */ if (borg_simulate) return (b_n); /* Log the message */ borg_note(format("# Aiming unknown rod '%s.'", borg_items[b_i].desc)); /* record the address to avoid certain bugs with inscriptions&amnesia */ zap_slot = b_i; /* Perform the action */ borg_keypress('z'); borg_keypress(I2A(b_i)); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -1; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of ACTIVATING an attack artifact * */ static int borg_attack_aux_artifact(int art_name, int art_loc, int rad, int dam, int typ) { int b_n; /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Paranoia */ if (borg_simulate && (randint0(100) < 2)) return (0); /* Look for that artifact and to see if it is charged */ if (!borg_equips_artifact(art_name)) return (0); /* Choose optimal location */ b_n = borg_launch_bolt(rad, dam, typ, MAX_RANGE, 0); /* Simulation */ if (borg_simulate) return (b_n); /* Activate the artifact */ (void)borg_activate_artifact(art_name); /* Use target */ if (art_name != EF_DISPEL_EVIL || art_name != EF_ARROW) { borg_keypress('5'); /* Set our shooting flag */ successful_target = -1; } /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of ACTIVATING an attack ring * */ static int borg_attack_aux_ring(int ring_name, int rad, int dam, int typ) { int b_n; /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Paranoia */ if (borg_simulate && (randint0(100) < 2)) return (0); /* Look for that ring and to see if it is charged */ if (!borg_equips_ring(ring_name)) return (0); /* Choose optimal location */ b_n = borg_launch_bolt(rad, dam, typ, MAX_RANGE, 0); /* Simulation */ if (borg_simulate) return (b_n); /* Activate the artifact */ (void)borg_activate_ring(ring_name); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -1; /* Value */ return (b_n); } /* * Simulate/Apply the optimal result of ACTIVATING a DRAGON ARMOUR * */ static int borg_attack_aux_dragon(int sval, int rad, int dam, int typ) { int b_n; /* No firing while blind, confused, or hallucinating */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) return (0); /* Paranoia */ if (borg_simulate && (randint0(100) < 2)) return (0); /* Randart dragon armors do not activate for breath */ if (borg_items[INVEN_BODY].name1) return (0); /* Look for that scale mail and charged*/ if (!borg_equips_dragon(sval)) return (0); /* Choose optimal location */ b_n = borg_launch_bolt(rad, dam, typ, MAX_RANGE, 0); /* Simulation */ if (borg_simulate) return (b_n); /* Activate the scale mail */ (void)borg_activate_dragon(sval); /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -1; /* Value */ return (b_n); } /* * Try to sleep an adjacent bad guy * This had been a defence maneuver, which explains the format. * This is used for the sleep ii spell and the sanctuary prayer, * also the holcolleth activation. * * There is a slight concern with the level of the artifact and the * savings throw. Currently the borg uses his own level to determine * the save. The artifact level may be lower and the borg will have * the false impression that spell will work when in fact the monster * may easily save against the attack. */ static int borg_attack_aux_sanctuary(void) { int p1= 0; int p2 = 0; int d = 0; borg_magic *as = &borg_magics[1][4]; /* Can I do it */ if (!borg_prayer_okay(1, 4)) return (0); /* Obtain initial danger */ borg_sleep_spell = FALSE; p1= borg_danger(c_y,c_x,4, TRUE, FALSE); /* What effect is there? */ borg_sleep_spell_ii = TRUE; p2=borg_danger(c_y,c_x,4, TRUE, FALSE); borg_sleep_spell_ii = FALSE; /* value is d, enhance the value for rogues and rangers so that * they can use their critical hits. */ d = (p1-p2); /* Penalize mana usage */ d = d - as->power; /* Penalize use of reserve mana */ if (borg_skill[BI_CURSP] - as->power < borg_skill[BI_MAXSP] / 2) d = d - (as->power * 10); /* Simulation */ if (borg_simulate) return (d); /* Cast the spell */ if (borg_prayer(1, 4)) /* Value */ { return (d); } else return (0); } static int borg_attack_aux_artifact_holcolleth(void) { int p1= 0; int p2 = 0; int d = 0; if (!borg_equips_artifact(EF_SLEEPII)) return (0); /* Obtain initial danger */ borg_sleep_spell = FALSE; p1= borg_danger(c_y,c_x,4, TRUE, FALSE); /* What effect is there? */ borg_sleep_spell_ii = TRUE; p2=borg_danger(c_y,c_x,4, TRUE, FALSE); borg_sleep_spell_ii = FALSE; /* value is d, enhance the value for rogues and rangers so that * they can use their critical hits. */ d = (p1-p2); /* Simulation */ if (borg_simulate) return (d); /* Cast the spell */ if (borg_activate_artifact(EF_SLEEPII)) { /* Value */ return (d); } else { borg_note("# Failed to properly activate the artifact"); return (0); } } /* * Simulate/Apply the optimal result of using the given "type" of attack */ static int borg_attack_aux(int what) { int dam = 0; int chance; int rad = 0; /* Analyze */ switch (what) { /* Wait on grid for monster to approach me */ case BF_REST: return (borg_attack_aux_rest()); /* Physical attack */ case BF_THRUST: return (borg_attack_aux_thrust()); /* Missile attack */ case BF_LAUNCH_NORMAL: return (borg_attack_aux_launch()); /* Missile attack */ case BF_LAUNCH_SEEKER: return (borg_attack_aux_launch_seeker()); /* Missile attack */ case BF_LAUNCH_SILVER: return (borg_attack_aux_launch_silver()); /* Missile attack */ case BF_LAUNCH_FLAME: return (borg_attack_aux_launch_flame()); /* Missile attack */ case BF_LAUNCH_FROST: return (borg_attack_aux_launch_frost()); /* Missile attack */ case BF_LAUNCH_ANIMAL: return (borg_attack_aux_launch_animal()); /* Missile attack */ case BF_LAUNCH_UNDEAD: return (borg_attack_aux_launch_undead()); /* Missile attack */ case BF_LAUNCH_DEMON: return (borg_attack_aux_launch_demon()); /* Missile attack */ case BF_LAUNCH_ORC: return (borg_attack_aux_launch_orc()); /* Missile attack */ case BF_LAUNCH_TROLL: return (borg_attack_aux_launch_troll()); /* Missile attack */ case BF_LAUNCH_GIANT: return (borg_attack_aux_launch_giant()); /* Missile attack */ case BF_LAUNCH_DRAGON: return (borg_attack_aux_launch_dragon()); /* Missile attack */ case BF_LAUNCH_EVIL: return (borg_attack_aux_launch_evil()); /* Missile attack */ case BF_LAUNCH_WOUNDING: return (borg_attack_aux_launch_wounding()); /* Missile attack */ case BF_LAUNCH_VENOM: return (borg_attack_aux_launch_venom()); /* Missile attack */ case BF_LAUNCH_HOLY: return (borg_attack_aux_launch_holy()); /* Object attack */ case BF_OBJECT: return (borg_attack_aux_object()); /* Spell -- slow monster */ case BF_SPELL_SLOW_MONSTER: dam = 10; return (borg_attack_aux_spell_bolt(2,8, rad, dam, GF_OLD_SLOW)); /* Spell -- confuse monster */ case BF_SPELL_CONFUSE_MONSTER: rad = 0; dam = 10; return (borg_attack_aux_spell_bolt(1,0, rad, dam, GF_OLD_CONF)); case BF_SPELL_SLEEP_III: dam = 10; return (borg_attack_aux_spell_dispel(3,3, dam, GF_OLD_SLEEP)); /* Spell -- Polymorph Monster */ case BF_SPELL_POLYMORPH: dam = 10; rad = 0; return (borg_attack_aux_spell_bolt(2, 4, rad, dam, GF_OLD_POLY)); /* Spell -- magic missile */ case BF_SPELL_MAGIC_MISSILE: rad = 0; dam = (3+((borg_skill[BI_CLEVEL])/4))*(4+1)/2; return (borg_attack_aux_spell_bolt(0, 0, rad, dam, GF_MISSILE)); /* Spell -- magic missile EMERGENCY*/ case BF_SPELL_MAGIC_MISSILE_RESERVE: rad = 0; dam = (3+((borg_skill[BI_CLEVEL])/4))*(4+1); return (borg_attack_aux_spell_bolt_reserve(0, 0, rad, dam, GF_MISSILE)); /* Spell -- electric bolt */ case BF_SPELL_ELEC_BOLT: rad = -1; dam = (3+((borg_skill[BI_CLEVEL]-5)/4))*(8+1)/2; return (borg_attack_aux_spell_bolt(1, 1, rad, dam, GF_ELEC)); /* Spell -- cold bolt */ case BF_SPELL_COLD_BOLT: rad = 0; dam = (5+((borg_skill[BI_CLEVEL]-5)/4))*(8+1)/2; return (borg_attack_aux_spell_bolt(1, 7, rad, dam, GF_COLD)); /* Spell -- fire bolt */ case BF_SPELL_FIRE_BOLT: rad = 0; dam = (8+((borg_skill[BI_CLEVEL]-5)/4))*(8+1)/2; return (borg_attack_aux_spell_bolt(2, 3, rad, dam, GF_FIRE)); /* Spell -- acid bolt */ case BF_SPELL_ACID_BOLT: rad = 0; dam = (6+((borg_skill[BI_CLEVEL]-5)/4))*(8+1)/2; return (borg_attack_aux_spell_bolt(2, 7, rad, dam, GF_ACID)); /* Spell -- kill wall */ case BF_SPELL_STONE_TO_MUD: rad = 0; dam = (20+(30/2)); return (borg_attack_aux_spell_bolt(2, 2, rad, dam, GF_KILL_WALL)); /* Spell -- light beam */ case BF_SPELL_LIGHT_BEAM: rad = -1; dam = (6*(8+1)/2); return (borg_attack_aux_spell_bolt(1, 6, rad, dam, GF_LIGHT_WEAK)); /* Spell -- stinking cloud */ case BF_SPELL_STINK_CLOUD: rad = 2; dam = (10 + (borg_skill[BI_CLEVEL]/2)); return (borg_attack_aux_spell_bolt(0, 8, rad, dam, GF_POIS)); /* Spell -- cold ball */ case BF_SPELL_COLD_BALL: rad = 2; dam = (30 + borg_skill[BI_CLEVEL]); return (borg_attack_aux_spell_bolt(3, 0, rad, dam, GF_COLD)); /* Spell -- acid ball */ case BF_SPELL_ACID_BALL: rad = 2; dam = (40 + (borg_skill[BI_CLEVEL]/2)); return (borg_attack_aux_spell_bolt(5, 3, rad, dam, GF_ACID)); /* Spell -- fire ball */ case BF_SPELL_FIRE_BALL: rad = 2; dam = (55 + borg_skill[BI_CLEVEL]); return (borg_attack_aux_spell_bolt(3, 4, rad, dam, GF_FIRE)); /* Spell -- poison storm Cloud Kill*/ case BF_SPELL_CLOUD_KILL: rad = 3; dam = (40 + (borg_skill[BI_CLEVEL]/2)); return (borg_attack_aux_spell_bolt(5, 2, rad, dam, GF_POIS)); /* Spell -- Ice Storm */ case BF_SPELL_COLD_STORM: rad = 3; dam = (50 + borg_skill[BI_CLEVEL] * 2); return (borg_attack_aux_spell_bolt(5, 4, rad, dam, GF_ICE)); /* Spell -- meteor storm */ case BF_SPELL_METEOR_STORM: rad = 3; dam = (30 + borg_skill[BI_CLEVEL] / 2); return (borg_attack_aux_spell_bolt(5, 5, rad, dam, GF_METEOR)); /* Spell -- Rift */ case BF_SPELL_RIFT: rad = -1; dam = ((borg_skill[BI_CLEVEL] * 3) + 40); return (borg_attack_aux_spell_bolt(5, 6, rad, dam, GF_GRAVITY)); /* Spell -- mana storm */ case BF_SPELL_MANA_STORM: rad = 3; dam = (300 + (borg_skill[BI_CLEVEL] * 2)); return (borg_attack_aux_spell_bolt(8, 7, rad, dam, GF_MANA)); /* Spell -- Shock Wave */ case BF_SPELL_SHOCK_WAVE: dam = (borg_skill[BI_CLEVEL] + 10); rad = 2; return (borg_attack_aux_spell_bolt(5, 0, rad, dam, GF_SOUND)); /* Spell -- Explosion */ case BF_SPELL_EXPLOSION: dam = ((borg_skill[BI_CLEVEL] * 2) + 20); rad = 2; return (borg_attack_aux_spell_bolt(5, 1, rad, dam, GF_SHARD)); /* Spell -- Bedlam (Big conf ball, no damage) */ case BF_SPELL_BEDLAM: dam = (borg_skill[BI_CLEVEL]); rad = 4; return (borg_attack_aux_spell_bolt(8, 1, rad, dam, GF_OLD_CONF)); /* Spell -- Rend Soul */ case BF_SPELL_REND_SOUL: rad = 0; dam = ((borg_skill[BI_CLEVEL] * 11) / 2); return (borg_attack_aux_spell_bolt(8, 2, rad, dam, GF_NETHER)); /* Spell -- Chaos Strike */ case BF_SPELL_CHAOS_STRIKE: rad = 0; dam = ((borg_skill[BI_CLEVEL] * 13) / 2); return (borg_attack_aux_spell_bolt(8, 6, rad, dam, GF_CHAOS)); /* Prayer -- orb of draining */ case BF_PRAYER_HOLY_ORB_BALL: rad = ((borg_skill[BI_CLEVEL] >= 30) ? 3 : 2); dam = ((borg_class == CLASS_PRIEST) ? 2 : 4); dam = (3*(8+1)/2 + borg_skill[BI_CLEVEL] + (borg_skill[BI_CLEVEL]/dam)); return (borg_attack_aux_prayer_bolt(2, 1, rad, dam, GF_HOLY_ORB)); /* Prayer -- blind creature */ case BF_PRAYER_BLIND_CREATURE: rad = 0; dam = 10; return (borg_attack_aux_prayer_bolt(1,0, rad, dam, GF_OLD_CONF)); /* Prayer -- and sanctuary */ case BF_PRAYER_SANCTUARY: dam = 10; return (borg_attack_aux_sanctuary()); /* Prayer -- Dispel Undead */ case BF_PRAYER_DISP_UNDEAD1: dam = ((borg_skill[BI_CLEVEL] * 3)/2); return (borg_attack_aux_prayer_dispel(3,1, dam, GF_DISP_UNDEAD)); /* Prayer -- Dispel Evil */ case BF_PRAYER_DISP_EVIL1: dam = ((borg_skill[BI_CLEVEL] * 3)/2); return (borg_attack_aux_prayer_dispel(3,3, dam, GF_DISP_EVIL)); /* Prayer -- Dispel Undead2 Wrath of God */ case BF_PRAYER_DISP_UNDEAD2: dam = ((borg_skill[BI_CLEVEL] * 4)/2); return (borg_attack_aux_prayer_dispel(8,0, dam, GF_DISP_UNDEAD)); /* Prayer -- Dispel EVIL2 Wrath of God */ case BF_PRAYER_DISP_EVIL2: dam = ((borg_skill[BI_CLEVEL] * 4)/2); return (borg_attack_aux_prayer_dispel(8,1, dam, GF_DISP_EVIL)); /* Prayer -- Banishment (teleport evil away)*/ /* This is a defense spell: done in borg_defense() */ /* Prayer -- Holy Word also has heal effect and is considered in borg_heal */ case BF_PRAYER_HOLY_WORD: if (borg_skill[BI_MAXHP] - borg_skill[BI_CURHP] >= 300) /* force him to think the spell is more deadly to get him to * cast it. This will provide some healing for him. */ { dam = ((borg_skill[BI_CLEVEL] * 10)); return (borg_attack_aux_prayer_dispel(3,5, dam, GF_DISP_EVIL)); } else /* If he is not wounded dont cast this, use Disp Evil instead. */ { dam = ((borg_skill[BI_CLEVEL] * 3)/2) -50; return (borg_attack_aux_prayer_dispel(3,5, dam, GF_DISP_EVIL)); } /* Prayer -- Drain Life Wrath of God */ case BF_PRAYER_DRAIN_LIFE: rad = 0; dam = (borg_skill[BI_CLEVEL] * 4); return (borg_attack_aux_prayer_bolt(8,4, rad, dam, GF_OLD_DRAIN)); /* ROD -- slow monster */ case BF_ROD_SLOW_MONSTER: dam = 10; rad = 0; return (borg_attack_aux_rod_bolt(SV_ROD_SLOW_MONSTER, rad, dam, GF_OLD_SLOW)); /* ROD -- sleep monster */ case BF_ROD_SLEEP_MONSTER: dam = 10; rad = 0; return (borg_attack_aux_rod_bolt(SV_ROD_SLEEP_MONSTER, rad, dam, GF_OLD_SLEEP)); /* Rod -- elec bolt */ case BF_ROD_ELEC_BOLT: rad = -1; dam = 6*(6+1)/2; return (borg_attack_aux_rod_bolt(SV_ROD_ELEC_BOLT, rad, dam, GF_ELEC)); /* Rod -- cold bolt */ case BF_ROD_COLD_BOLT: rad = 0; dam = 6*(8+1)/2; return (borg_attack_aux_rod_bolt(SV_ROD_COLD_BOLT, rad, dam, GF_COLD)); /* Rod -- acid bolt */ case BF_ROD_ACID_BOLT: rad = 0; dam = 12*(8+1)/2; return (borg_attack_aux_rod_bolt(SV_ROD_ACID_BOLT, rad, dam, GF_ACID)); /* Rod -- fire bolt */ case BF_ROD_FIRE_BOLT: rad = 0; dam = 12*(8+1)/2; return (borg_attack_aux_rod_bolt(SV_ROD_FIRE_BOLT, rad, dam, GF_FIRE)); /* Spell -- light beam */ case BF_ROD_LIGHT_BEAM: rad = -1; dam = (6*(8+1)/2); return (borg_attack_aux_rod_bolt(SV_ROD_LIGHT, rad, dam, GF_LIGHT_WEAK)); /* Spell -- drain life */ case BF_ROD_DRAIN_LIFE: rad = 0; dam = (150); return (borg_attack_aux_rod_bolt(SV_ROD_DRAIN_LIFE, rad, dam, GF_OLD_DRAIN)); /* Rod -- elec ball */ case BF_ROD_ELEC_BALL: rad = 2; dam = 64; return (borg_attack_aux_rod_bolt(SV_ROD_ELEC_BALL, rad, dam, GF_ELEC)); /* Rod -- acid ball */ case BF_ROD_COLD_BALL: rad = 2; dam = 100; return (borg_attack_aux_rod_bolt(SV_ROD_COLD_BALL, rad, dam, GF_COLD)); /* Rod -- acid ball */ case BF_ROD_ACID_BALL: rad = 2; dam = 120; return (borg_attack_aux_rod_bolt(SV_ROD_ACID_BALL, rad, dam, GF_ACID)); /* Rod -- fire ball */ case BF_ROD_FIRE_BALL: rad = 2; dam = 144; return (borg_attack_aux_rod_bolt(SV_ROD_FIRE_BALL, rad, dam, GF_FIRE)); /* Rod -- unid'd rod */ case BF_ROD_UNKNOWN: rad = 0; dam = 75; return (borg_attack_aux_rod_bolt_unknown(dam, GF_MISSILE)); /* Wand -- unid'd wand */ case BF_WAND_UNKNOWN: rad = 0; dam = 75; return (borg_attack_aux_wand_bolt_unknown(dam, GF_MISSILE)); /* Wand -- magic missile */ case BF_WAND_MAGIC_MISSILE: rad = 0; dam = 3*(4+1)/2; return (borg_attack_aux_wand_bolt(SV_WAND_MAGIC_MISSILE, rad, dam, GF_MISSILE)); /* Wand -- slow monster */ case BF_WAND_SLOW_MONSTER: rad = 0; dam = 10; return (borg_attack_aux_wand_bolt(SV_WAND_SLOW_MONSTER, rad, dam, GF_OLD_SLOW)); /* Wand -- sleep monster */ case BF_WAND_SLEEP_MONSTER: rad = 0; dam = 10; return (borg_attack_aux_wand_bolt(SV_WAND_SLEEP_MONSTER, rad, dam, GF_OLD_SLEEP)); /* Wand -- fear monster */ case BF_WAND_FEAR_MONSTER: rad = 0; dam = 2*(6+1)/2; return (borg_attack_aux_wand_bolt(SV_WAND_FEAR_MONSTER, rad, dam, GF_TURN_ALL)); /* Wand -- conf monster */ case BF_WAND_CONFUSE_MONSTER: rad = 0; dam = 2*(6+1)/2; return (borg_attack_aux_wand_bolt(SV_WAND_CONFUSE_MONSTER, rad, dam, GF_OLD_CONF)); /* Wand -- elec bolt */ case BF_WAND_ELEC_BOLT: dam = 6*(8+1)/2; rad = -1; return (borg_attack_aux_wand_bolt(SV_WAND_ELEC_BOLT, rad, dam, GF_ELEC)); /* Wand -- cold bolt */ case BF_WAND_COLD_BOLT: dam = 6*(8+1)/2; rad = 0; return (borg_attack_aux_wand_bolt(SV_WAND_COLD_BOLT, rad, dam, GF_COLD)); /* Wand -- acid bolt */ case BF_WAND_ACID_BOLT: rad = 0; dam = 5*(8+1)/2; return (borg_attack_aux_wand_bolt(SV_WAND_ACID_BOLT, rad, dam, GF_ACID)); /* Wand -- fire bolt */ case BF_WAND_FIRE_BOLT: rad = 0; dam = 9*(8+1)/2; return (borg_attack_aux_wand_bolt(SV_WAND_FIRE_BOLT, rad, dam, GF_FIRE)); /* Spell -- light beam */ case BF_WAND_LIGHT_BEAM: rad = -1; dam = (6*(8+1)/2); return (borg_attack_aux_wand_bolt(SV_WAND_LIGHT, rad, dam, GF_LIGHT_WEAK)); /* Wand -- stinking cloud */ case BF_WAND_STINKING_CLOUD: rad = 2; dam = 12; return (borg_attack_aux_wand_bolt(SV_WAND_STINKING_CLOUD, rad, dam, GF_POIS)); /* Wand -- elec ball */ case BF_WAND_ELEC_BALL: rad = 2; dam = 64; return (borg_attack_aux_wand_bolt(SV_WAND_ELEC_BALL, rad, dam, GF_ELEC)); /* Wand -- acid ball */ case BF_WAND_COLD_BALL: rad = 2; dam = 100; return (borg_attack_aux_wand_bolt(SV_WAND_COLD_BALL, rad, dam, GF_COLD)); /* Wand -- acid ball */ case BF_WAND_ACID_BALL: rad = 2; dam = 120; return (borg_attack_aux_wand_bolt(SV_WAND_ACID_BALL, rad, dam, GF_ACID)); /* Wand -- fire ball */ case BF_WAND_FIRE_BALL: rad = 2; dam = 144; return (borg_attack_aux_wand_bolt(SV_WAND_FIRE_BALL, rad, dam, GF_FIRE)); /* Wand -- dragon cold */ case BF_WAND_DRAGON_COLD: rad = 3; dam = 160; return (borg_attack_aux_wand_bolt(SV_WAND_DRAGON_COLD, rad, dam, GF_COLD)); /* Wand -- dragon fire */ case BF_WAND_DRAGON_FIRE: rad = 3; dam = 200; return (borg_attack_aux_wand_bolt(SV_WAND_DRAGON_FIRE, rad, dam, GF_FIRE)); /* Wand -- annihilation */ case BF_WAND_ANNIHILATION: dam = 250; return (borg_attack_aux_wand_bolt(SV_WAND_ANNIHILATION, rad, dam, GF_OLD_DRAIN)); /* Wand -- drain life */ case BF_WAND_DRAIN_LIFE: dam = 150; return (borg_attack_aux_wand_bolt(SV_WAND_DRAIN_LIFE, rad, dam, GF_OLD_DRAIN)); /* Wand -- wand of wonder */ case BF_WAND_WONDER: dam = 35; return (borg_attack_aux_wand_bolt(SV_WAND_WONDER, rad, dam, GF_MISSILE)); /* Staff -- Sleep Monsters */ case BF_STAFF_SLEEP_MONSTERS: dam = 60; return (borg_attack_aux_staff_dispel(SV_STAFF_SLEEP_MONSTERS, rad, dam, GF_OLD_SLEEP)); /* Staff -- Slow Monsters */ case BF_STAFF_SLOW_MONSTERS: dam = 60; rad = 10; return (borg_attack_aux_staff_dispel(SV_STAFF_SLOW_MONSTERS, rad, dam, GF_OLD_SLOW)); /* Staff -- Dispel Evil */ case BF_STAFF_DISPEL_EVIL: dam = 60; return (borg_attack_aux_staff_dispel(SV_STAFF_DISPEL_EVIL, rad, dam, GF_DISP_EVIL)); /* Staff -- Power */ case BF_STAFF_POWER: dam = 120; return (borg_attack_aux_staff_dispel(SV_STAFF_POWER, rad, dam, GF_TURN_ALL)); /* Staff -- holiness */ case BF_STAFF_HOLINESS: if (borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] /2) dam = 500; else dam = 120; return (borg_attack_aux_staff_dispel(SV_STAFF_HOLINESS, rad, dam, GF_DISP_EVIL)); /* Artifact -- Narthanc- fire bolt 9d8*/ case BF_EF_FIRE1: rad = 0; dam = (9*(8+1)/2); return (borg_attack_aux_artifact(EF_FIRE_BOLT, INVEN_WIELD,rad, dam, GF_FIRE)); /* Artifact -- Anduril- fire ball 72*/ case BF_EF_FIRE2: rad = 2; dam = 72; return (borg_attack_aux_artifact(EF_FIRE_BOLT72, INVEN_WIELD, rad, dam, GF_FIRE)); /* Artifact -- NARYA- FIRE BALL 120 */ case BF_EF_FIRE3: rad = 2; dam = 120; return (borg_attack_aux_artifact(EF_FIRE_BALL2, INVEN_RIGHT,rad, dam, GF_FIRE)); /* Artifact -- Nimthanc- frost bolt 6d8*/ case BF_EF_FROST1: rad = 0; dam = (6*(8+1)/2); return (borg_attack_aux_artifact(EF_COLD_BOLT, INVEN_WIELD, rad, dam, GF_COLD)); /* Artifact -- Belangil- frost ball 48*/ case BF_EF_FROST2: rad = 2; dam = 48; return (borg_attack_aux_artifact(EF_COLD_BALL50, INVEN_WIELD,rad, dam, GF_COLD)); /* Artifact -- Arunruth- frost bolt 12d8*/ case BF_EF_FROST4: rad = 0; dam = (12*(8+1)/2); return (borg_attack_aux_artifact(EF_COLD_BOLT2, INVEN_WIELD,rad, dam, GF_COLD)); /* Artifact -- Ringil- frost ball 100*/ case BF_EF_FROST3: rad = 2; dam = 100; return (borg_attack_aux_artifact(EF_COLD_BALL100, INVEN_WIELD,rad, dam, GF_COLD)); /* Artifact -- Dethanc- electric bolt 4d8*/ case BF_EF_LIGHTNING_BOLT: rad = -1; dam = (4*(8+1)/2); return (borg_attack_aux_artifact(EF_ELEC_BOLT, INVEN_WIELD, rad, dam, GF_ELEC)); /* Artifact -- Rilia- poison gas 12*/ case BF_EF_STINKING_CLOUD: rad = 2; dam = 12; return (borg_attack_aux_artifact(EF_STINKING_CLOUD, INVEN_WIELD, rad, dam, GF_POIS)); /* Artifact -- Theoden- drain Life 120*/ case BF_EF_DRAIN_LIFE2: rad = 0; dam = 120; return (borg_attack_aux_artifact(EF_DRAIN_LIFE2, INVEN_WIELD, rad, dam, GF_OLD_DRAIN)); /* Artifact -- Totila- confustion */ case BF_EF_CONFUSE: rad = 0; dam = 10; return (borg_attack_aux_artifact(EF_CONFUSE2, INVEN_WIELD,rad, dam, GF_OLD_CONF)); /* Artifact -- Holcolleth -- sleep ii and sanctuary */ case BF_EF_SLEEP: dam = 10; return (borg_attack_aux_artifact_holcolleth()); /* Artifact -- TURMIL- drain life 90 */ case BF_EF_DRAIN_LIFE1: rad = 0; dam = 90; return (borg_attack_aux_artifact(EF_DRAIN_LIFE1, INVEN_WIELD,rad, dam, GF_OLD_DRAIN)); /* Artifact -- Fingolfin- spikes 150 */ case BF_EF_ARROW: rad = 0; dam = 150; return (borg_attack_aux_artifact(EF_ARROW, INVEN_BODY,rad, dam, GF_MISSILE)); /* Artifact -- Cammithrim- Magic Missile 2d6 */ case BF_EF_MISSILE: rad = 0; dam = (2*(6+1)/2); return (borg_attack_aux_artifact(EF_MISSILE, INVEN_HANDS,rad, dam, GF_MISSILE)); /* Artifact -- PaurNEN- ACID bolt 5d8 */ case BF_EF_ACID1: rad = 0; dam = (5*(8+1)/2); return (borg_attack_aux_artifact(EF_ACID_BOLT, INVEN_HANDS,rad, dam, GF_ACID)); /* Artifact -- INGWE- DISPEL EVIL X5 */ case BF_EF_DISP_EVIL: rad = 10; dam = (10 + (borg_skill[BI_CLEVEL]*5)/2); return (borg_attack_aux_artifact(EF_DISPEL_EVIL, INVEN_NECK,rad, dam, GF_DISP_EVIL)); /* Artifact -- NENYA- COLD BALL 200 */ case BF_EF_FROST5: rad = 2; dam = 200; return (borg_attack_aux_artifact(EF_COLD_BALL2, INVEN_RIGHT,rad, dam, GF_COLD)); /* Artifact -- VILYA- ELEC BALL 250 */ case BF_EF_ELEC2: rad = 2; dam = 250; return (borg_attack_aux_artifact(EF_ELEC_BALL2, INVEN_RIGHT,rad, dam, GF_ELEC)); /* Artifact -- Mana Bolt */ case BF_EF_MANA_BOLT: rad = 0; dam = (12*6) / 2; return (borg_attack_aux_artifact(EF_MANA_BOLT, INVEN_RIGHT,rad, dam, GF_MANA)); /* Artifact -- Razorback(1000) and Mediator(50) */ case BF_EF_STAR_BALL: rad = 3; if (borg_items[INVEN_BODY].name1 == 16) dam = 1000; else dam = 50; return (borg_attack_aux_artifact(EF_ELEC_BALL, INVEN_BODY, rad, dam, GF_ELEC)); /* Ring of ACID */ case BF_RING_ACID: rad = 2; dam = 70; return (borg_attack_aux_ring(SV_RING_ACID, rad, dam, GF_ACID)); /* Ring of FLAMES */ case BF_RING_FIRE: rad = 2; dam = 80; return (borg_attack_aux_ring(SV_RING_FLAMES, rad, dam, GF_FIRE)); /* Ring of ICE */ case BF_RING_ICE: rad = 2; dam = 75; return (borg_attack_aux_ring(SV_RING_ICE, rad, dam, GF_ICE)); /* Ring of LIGHTNING */ case BF_RING_LIGHTNING: rad = 2; dam = 85; return (borg_attack_aux_ring(SV_RING_LIGHTNING, rad, dam, GF_ELEC)); /* Ring of Delving -- kill wall--stone to mud */ case BF_RING_DELVING: rad = 0; dam = (20+(30/2)); return (borg_attack_aux_ring(SV_RING_DELVING, rad, dam, GF_KILL_WALL)); /* Hack -- Dragon Scale Mail can be activated as well */ case BF_DRAGON_BLUE: rad =2; dam=100; return (borg_attack_aux_dragon(SV_DRAGON_BLUE, rad, dam, GF_ELEC)); case BF_DRAGON_WHITE: rad =2; dam=110; return (borg_attack_aux_dragon(SV_DRAGON_WHITE, rad, dam, GF_COLD)); case BF_DRAGON_BLACK: rad =2; dam=130; return (borg_attack_aux_dragon(SV_DRAGON_BLACK, rad, dam, GF_ACID)); case BF_DRAGON_GREEN: rad =2; dam=150; return (borg_attack_aux_dragon(SV_DRAGON_GREEN, rad, dam, GF_POIS)); case BF_DRAGON_RED: rad =2; dam=200; return (borg_attack_aux_dragon(SV_DRAGON_RED, rad, dam, GF_FIRE)); case BF_DRAGON_MULTIHUED: chance = randint0(5); rad =2; dam=200; return (borg_attack_aux_dragon(SV_DRAGON_MULTIHUED, rad, dam, (((chance == 1) ? GF_ELEC : ((chance == 2) ? GF_COLD : ((chance == 3) ? GF_ACID : ((chance == 4) ? GF_POIS : GF_FIRE)))) )) ); case BF_DRAGON_BRONZE: rad =2; dam=120; return (borg_attack_aux_dragon(SV_DRAGON_BRONZE, rad, dam, GF_CONFU)); case BF_DRAGON_GOLD: rad =2; dam=150; return (borg_attack_aux_dragon(SV_DRAGON_GOLD, rad, dam, GF_SOUND)); case BF_DRAGON_CHAOS: chance = randint0(2); rad =2; dam=220; return (borg_attack_aux_dragon(SV_DRAGON_CHAOS, rad, dam, (chance == 1 ? GF_CHAOS : GF_DISEN)) ); case BF_DRAGON_LAW: chance = randint0(2); rad =2; dam=230; return (borg_attack_aux_dragon(SV_DRAGON_LAW, rad, dam, (chance == 1 ? GF_SOUND : GF_SHARD)) ); case BF_DRAGON_BALANCE: chance = randint0(4); rad =2; dam=230; return (borg_attack_aux_dragon(SV_DRAGON_BALANCE, rad, dam, ( ((chance == 1) ? GF_CHAOS : ((chance == 2) ? GF_DISEN : ((chance == 3) ? GF_SOUND : GF_SHARD))) )) ); case BF_DRAGON_SHINING: chance = randint0(2); rad =2; dam=200; return (borg_attack_aux_dragon(SV_DRAGON_SHINING, rad, dam, (chance == 0 ? GF_LIGHT : GF_DARK)) ); case BF_DRAGON_POWER: rad =2; dam=300; return (borg_attack_aux_dragon(SV_DRAGON_POWER, rad, dam, GF_MISSILE)); } /* Oops */ return (0); } /* * Attack nearby monsters, in the best possible way, if any. * * We consider a variety of possible attacks, including physical attacks * on adjacent monsters, missile attacks on nearby monsters, spell/prayer * attacks on nearby monsters, and wand/rod attacks on nearby monsters. * * Basically, for each of the known "types" of attack, we "simulate" the * "optimal" result of using that attack, and then we "apply" the "type" * of attack which appears to have the "optimal" result. * * When calculating the "result" of using an attack, we only consider the * effect of the attack on visible, on-screen, known monsters, which are * within 16 grids of the player. This prevents most "spurious" attacks, * but we can still be fooled by situations like creeping coins which die * while out of sight, leaving behind a pile of coins, which we then find * again, and attack with distance attacks, which have no effect. Perhaps * we should "expect" certain results, and take note of failure to observe * those effects. XXX XXX XXX * * See above for the "semantics" of each "type" of attack. */ bool borg_attack(bool boosted_bravery) { int i, x, y; int a_y, a_x; int n, b_n = 0; int g, b_g = -1; bool adjacent_monster = FALSE; borg_grid *ag; monster_race *r_ptr; /* Nobody around */ if (!borg_kills_cnt) return (FALSE); /* Set the attacking flag so that danger is boosted for monsters */ /* we want to attack first. */ borg_attacking = TRUE; /* Reset list */ borg_temp_n = 0; /* Find "nearby" monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; /* Monster */ kill = &borg_kills[i]; r_ptr = &r_info[kill->r_idx]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Require current knowledge */ if (kill->when < borg_t - 2) continue; /* Ignore multiplying monsters and when fleeing from scaries*/ if (goal_ignoring && !borg_skill[BI_ISAFRAID] && (rf_has(r_info[kill->r_idx].flags, RF_MULTIPLY) )) continue; /* Acquire location */ a_x = kill->x; a_y = kill->y; /* Low level mages need to conserve the mana in town. These guys don't fight back */ if (borg_class == CLASS_MAGE && borg_skill[BI_MAXCLEVEL] < 10 && borg_skill[BI_CDEPTH] == 0 && (strstr(r_ptr->name, "Farmer") /* strstr(r_ptr->name, "Blubbering") || */ /* strstr(r_ptr->name, "Boil") || */ /* strstr(r_ptr->name, "Village") || */ /*strstr(r_ptr->name, "Pitiful") || */ /* strstr(r_ptr->name, "Mangy") */)) continue; /* Check if there is a monster adjacent to me or he's close and fast. */ if ((kill->speed > borg_skill[BI_SPEED] && distance(c_y, c_x, a_y, a_x) <= 2) || distance(c_y, c_x, a_y, a_x) <= 1) adjacent_monster = TRUE; /* no attacking most scaryguys, try to get off the level */ if (scaryguy_on_level) { /* probably Grip or Fang. */ if (strstr(r_ptr->name, "Grip") || strstr(r_ptr->name, "Fang")) { /* Try to fight Grip and Fang. */ } else if (borg_skill[BI_CDEPTH] <= 5 && borg_skill[BI_CDEPTH] != 0 && (rf_has(r_info[kill->r_idx].flags, RF_MULTIPLY))) { /* Try to fight single worms and mice. */ } else if (borg_t - borg_began >= 2000 || borg_time_town + (borg_t - borg_began) >= 3000) { /* Try to fight been there too long. */ } else if (boosted_bravery || borg_no_retreat >= 1 || goal_recalling) { /* Try to fight if being Boosted or recall engaged. */ borg_note("# Bored, or recalling and fighting a monster on Scaryguy Level."); } else if (borg_skill[BI_CDEPTH] * 4 <= borg_skill[BI_CLEVEL] && borg_skill[BI_CLEVEL] > 10) { /* Try to fight anyway. */ borg_note("# High clevel fighting monster on Scaryguy Level."); } else if (adjacent_monster) { /* Try to fight if there is a monster next to me */ borg_note("# Adjacent to monster on Scaryguy Level."); } else { /* Flee from other scary guys */ continue; } } /* Acquire location */ x = kill->x; y = kill->y; /* Get grid */ ag = &borg_grids[y][x]; /* Never shoot off-screen */ if (!(ag->info & BORG_OKAY)) continue; /* Never shoot through walls */ if (!(ag->info & BORG_VIEW)) continue; /* Check the distance XXX XXX XXX */ if (distance(c_y, c_x, y, x) > MAX_RANGE) continue; /* Sometimes the borg can lose a monster index in the grid if there are lots of monsters * on screen. If he does lose one, reinject the index here. */ if (!ag->kill) borg_grids[kill->y][kill->x].kill = i; /* Save the location (careful) */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } /* No destinations */ if (!borg_temp_n) { borg_attacking = FALSE; return (FALSE); } /* Simulate */ borg_simulate = TRUE; /* Analyze the possible attacks */ for (g = 0; g < BF_MAX; g++) { /* Simulate */ n = borg_attack_aux(g); /* Track "best" attack <= */ if (n <= b_n) continue; /* Track best */ b_g = g; b_n = n; } /* Nothing good */ if (b_n <= 0) { borg_attacking = FALSE; return (FALSE); } /* Note */ borg_note(format("# Performing attack type %d with value %d.", b_g, b_n)); /* Instantiate */ borg_simulate = FALSE; /* Instantiate */ (void)borg_attack_aux(b_g); borg_attacking = FALSE; /* Success */ return (TRUE); } /* Munchkin Attack - Magic * * The early mages have a very difficult time surviving until they level up some. * This routine will allow the mage to do some very limited attacking while he is * doing the munchking start (stair scumming for items). * * Basically, he will rest on stairs to recuperate mana, then use MM to attack some * easy to kill monsters. If the monster gets too close, he will flee via the stairs. * He hope to be able to kill the monster in two shots from the MM. A perfect scenario * would be a mold which does not move, then he could rest/shoot/rest. */ bool borg_munchkin_mage(void) { int i, x, y; int a_y, a_x; int b_dam = -1, dam = 0; int b_n = -1; borg_grid *ag; /* Must be standing on a stair */ if (borg_grids[c_y][c_x].feat != FEAT_MORE && borg_grids[c_y][c_x].feat != FEAT_LESS) return (FALSE); /* Not if too dangerous */ if ((borg_danger(c_y, c_x, 1, TRUE, TRUE) > avoidance * 7/10) || borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 3) return (FALSE); if (borg_skill[BI_ISCONFUSED]) return (FALSE); /* Nobody around */ if (!borg_kills_cnt) return (FALSE); /* Set the attacking flag so that danger is boosted for monsters */ /* we want to attack first. */ borg_attacking = TRUE; /* Reset list */ borg_temp_n = 0; /* Find "nearby" monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; /* Monster */ kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Require current knowledge */ if (kill->when < borg_t - 2) continue; /* Acquire location */ a_x = kill->x; a_y = kill->y; /* Not in town. This should not be reached, but just in case we add it */ if (borg_skill[BI_CDEPTH] == 0) continue; /* Check if there is a monster adjacent to me or he's close and fast. */ if ((kill->speed > borg_skill[BI_SPEED] && distance(c_y, c_x, a_y, a_x) <= 2) || distance(c_y, c_x, a_y, a_x) <= 1) return (FALSE); /* no attacking most scaryguys, try to get off the level */ if (scaryguy_on_level) return (FALSE); /* Acquire location */ x = kill->x; y = kill->y; /* Get grid */ ag = &borg_grids[y][x]; /* Never shoot off-screen */ if (!(ag->info & BORG_OKAY)) continue; /* Never shoot through walls */ if (!(ag->info & BORG_VIEW)) continue; /* Check the distance XXX XXX XXX */ if (distance(c_y, c_x, y, x) > MAX_RANGE) continue; /* Save the location (careful) */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } /* No destinations */ if (!borg_temp_n) { borg_attacking = FALSE; return (FALSE); } /* Simulate */ borg_simulate = TRUE; /* Simulated */ for (i = 0; i < BF_MAX; i++) { /* Skip certain ones */ if (i <= 1) continue; dam = borg_attack_aux(i); /* Track the best attack method */ if (dam >= b_dam && dam > 0) { b_dam = dam; b_n = i; } } /* Nothing good */ if (b_n < 0 || b_dam <= 0) { borg_attacking = FALSE; return (FALSE); } /* Note */ borg_note(format("# Performing munchkin attack with value %d.", b_dam)); /* Instantiate */ borg_simulate = FALSE; /* Instantiate */ (void)borg_attack_aux(b_n); borg_attacking = FALSE; /* Success */ return (TRUE); } /* Munchkin Attack - Melee * * The early borgs have a very difficult time surviving until they level up some. * This routine will allow the borg to do some very limited attacking while he is * doing the munchking start (stair scumming for items). * * Basically, he will rest on stairs to recuperate HP, then use melee to attack some * easy to kill adjacent monsters. */ bool borg_munchkin_melee(void) { int i, x, y; int n = 0; borg_grid *ag; /* No Mages for now */ if (borg_class == CLASS_MAGE) return (FALSE); /* Must be standing on a stair */ if (borg_grids[c_y][c_x].feat != FEAT_MORE && borg_grids[c_y][c_x].feat != FEAT_LESS) return (FALSE); /* Nobody around */ if (!borg_kills_cnt) return (FALSE); /* Not if too dangerous */ if ((borg_danger(c_y, c_x, 1, TRUE, TRUE) > avoidance * 7/10) || borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 3) return (FALSE); if (borg_skill[BI_ISCONFUSED]) return (FALSE); /* Set the attacking flag so that danger is boosted for monsters */ /* we want to attack first. */ borg_attacking = TRUE; /* Reset list */ borg_temp_n = 0; /* Find "nearby" monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; /* Monster */ kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Require current knowledge */ if (kill->when < borg_t - 2) continue; /* Not in town. This should not be reached, but just in case we add it */ if (borg_skill[BI_CDEPTH] == 0) continue; /* no attacking most scaryguys, try to get off the level */ if (scaryguy_on_level) return (FALSE); /* Acquire location */ x = kill->x; y = kill->y; /* Get grid */ ag = &borg_grids[y][x]; /* Never shoot off-screen */ if (!(ag->info & BORG_OKAY)) continue; /* Never shoot through walls */ if (!(ag->info & BORG_VIEW)) continue; /* Check the distance XXX XXX XXX */ if (distance(c_y, c_x, y, x) != 1) continue; /* Save the location (careful) */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } /* No destinations */ if (!borg_temp_n) { borg_attacking = FALSE; return (FALSE); } /* Simulate */ borg_simulate = TRUE; /* Simulated */ n = borg_attack_aux(BF_THRUST); /* Nothing good */ if (n <= 0) { borg_attacking = FALSE; return (FALSE); } /* Note */ borg_note(format("# Performing munchkin attack with value %d.", n)); /* Instantiate */ borg_simulate = FALSE; /* Instantiate */ (void)borg_attack_aux(BF_THRUST); borg_attacking = FALSE; /* Success */ return (TRUE); } /* Log the pathway and feature of the spell pathway * Useful for debugging beams and Tport Other spell */ static void borg_log_spellpath(bool beam) { int n_x, n_y, x, y; int dist = 0; borg_grid *ag; borg_kill *kill; y = borg_target_y; x = borg_target_x; n_x = c_x; n_y = c_y; while (1) { ag = &borg_grids[n_y][n_x]; kill = &borg_kills[ag->kill]; /* Note the Pathway */ if (!borg_cave_floor_grid(ag)) { borg_note(format("# Logging Spell pathway (%d,%d): Wall grid.", n_y, n_x)); break; } else if (ag->kill) { borg_note(format("# Logging Spell pathway (%d,%d): %s, danger %d", n_y, n_x, (r_info[kill->r_idx].name), borg_danger_aux(c_y,c_x, 1, ag->kill, TRUE, FALSE))); } else if (n_y == c_y && n_x == c_x) { borg_note(format("# Logging Spell pathway (%d,%d): My grid.", n_y, n_x)); } else { borg_note(format("# Logging Spell pathway (%d,%d).", n_y, n_x)); } /* Stop loop if we reach our target if using bolt */ if (n_x == x && n_y == y) break; /* Safegaurd not to loop */ dist ++; if (dist >= MAX_RANGE) break; /* Calculate the new location */ mmove2(&n_y, &n_x, c_y, c_x, y, x); } } /* * * There are several types of setup moves: * * Temporary speed * Protect From Evil * Bless\Prayer * Berserk\Heroism * Temp Resist (either all or just cold/fire?) * Shield * Teleport away * Glyph of Warding * See inviso * * * and many others * */ enum { BD_BLESS, BD_SPEED, BD_RESIST_FC, BD_RESIST_FECAP, BD_RESIST_F, BD_RESIST_C, /* 5*/ BD_RESIST_A, BD_RESIST_P, BD_PROT_FROM_EVIL, BD_SHIELD, BD_TELE_AWAY, /* 10 */ BD_HERO, BD_BERSERK, BD_GLYPH, BD_CREATE_DOOR, BD_MASS_GENOCIDE, /* 15 */ BD_GENOCIDE, BD_GENOCIDE_NASTIES, BD_EARTHQUAKE, BD_DESTRUCTION, BD_TPORTLEVEL, /* 20 */ BD_BANISHMENT, /* Priest spell */ BD_DETECT_INVISO, BD_LIGHT_BEAM, BD_SHIFT_PANEL, BD_REST, BD_TELE_AWAY_MORGOTH, BD_BANISHMENT_MORGOTH, BD_LIGHT_MORGOTH, BD_MAX }; /* * Bless/Prayer to prepare for battle */ static int borg_defend_aux_bless( int p1 ) { int fail_allowed = 25; borg_grid *ag = &borg_grids[c_y][c_x]; int i; bool borg_near_kill = FALSE; /* already blessed */ if (borg_bless) return (0); /* Cant when Blind */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* Dark */ if (!(ag->info & BORG_GLOW) && borg_skill[BI_CURLITE] == 0) return (0); /* no spell */ if ( !borg_prayer_okay_fail(0, 2, fail_allowed) && !borg_prayer_okay_fail(3, 0, fail_allowed) && -1 == borg_slot(TV_SCROLL, SV_SCROLL_BLESSING) && -1 == borg_slot(TV_SCROLL, SV_SCROLL_HOLY_CHANT) && -1 == borg_slot(TV_SCROLL, SV_SCROLL_HOLY_PRAYER)) return (0); /* Check if a monster is close to me . */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; /* Monster */ kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Require current knowledge */ if (kill->when < borg_t - 5) continue; /* Check the distance XXX XXX XXX */ if (distance(c_y, c_x, kill->y, kill->x) > 3) continue; /* kill near me */ borg_near_kill = TRUE; } /* if we are in some danger but not much, go for a quick bless */ if ((p1 > avoidance/12 || borg_skill[BI_CLEVEL] <= 15) && p1 > 0 && borg_near_kill && p1 < avoidance/2) { /* Simulation */ /* bless is a low priority */ if (borg_simulate) return (1); borg_note("# Attempting to cast Bless"); /* No resting to recoop mana */ borg_no_rest_prep = 10000; /* do it! */ if (borg_prayer(0, 2 ) || borg_prayer(3,0) || borg_read_scroll(SV_SCROLL_BLESSING) || borg_read_scroll(SV_SCROLL_HOLY_CHANT) || borg_read_scroll(SV_SCROLL_HOLY_PRAYER)) return 1; } return (0); } /* * Speed to prepare for battle */ static int borg_defend_aux_speed( int p1 ) { int p2 = 0; bool good_speed = FALSE; bool speed_spell = FALSE; bool speed_staff = FALSE; bool speed_rod = FALSE; int fail_allowed = 25; /* already fast */ if (borg_speed) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance) fail_allowed -= 19; else /* a little scary */ if ( p1 > (avoidance*2)/3) fail_allowed -= 10; else /* not very scary, allow lots of fail */ if ( p1 < avoidance/3) fail_allowed += 10; /* only cast defence spells if fail rate is not too high */ if ( borg_spell_okay_fail( 3, 2, fail_allowed)) speed_spell = TRUE; /* staff must have charges */ if ( borg_equips_staff_fail(SV_STAFF_SPEED)) speed_staff = TRUE; /* rod can't be charging */ if (borg_equips_rod(SV_ROD_SPEED)) speed_rod = TRUE; /* Need some form */ if (0 > borg_slot(TV_POTION, SV_POTION_SPEED) && !speed_staff && !speed_rod && !speed_spell && !borg_equips_artifact(EF_HASTE1) && !borg_equips_artifact(EF_HASTE2)) return (0); /* if we have an infinite/large suppy of speed we can */ /* be generious with our use */ if (speed_rod || speed_spell || speed_staff || borg_equips_artifact(EF_HASTE1) || borg_equips_artifact(EF_HASTE2)) good_speed = TRUE; /* pretend we are protected and look again */ borg_speed = TRUE; p2 = borg_danger(c_y, c_x, 1, TRUE, FALSE); borg_speed = FALSE; /* if scaryguy around cast it. */ if (scaryguy_on_level) { /* HACK pretend that it was scary and will be safer */ p2 = p2 * 3/10; } /* if we are fighting a unique cast it. */ if (good_speed && borg_fighting_unique) { /* HACK pretend that it was scary and will be safer */ p2 = p2 * 7/10; } /* if we are fighting a unique and a summoner cast it. */ if (borg_fighting_summoner && borg_fighting_unique) { /* HACK pretend that it was scary and will be safer */ p2 = p2 * 7/10; } /* if the unique is Sauron cast it */ if (borg_skill[BI_CDEPTH] == 99 && borg_fighting_unique >=10 ) { p2 = p2 * 6/10; } /* if the unique is a rather nasty one. */ if (borg_fighting_unique && (unique_on_level == 76 || unique_on_level == 110 || unique_on_level == 111 || unique_on_level == 112 || unique_on_level == 133 || unique_on_level == 137)) { p2 = p2 * 6/10; } /* if the unique is Morgoth cast it */ if (borg_skill[BI_CDEPTH] == 100 && borg_fighting_unique >= 10) { p2 = p2 * 5/10; } /* Attempt to conserve Speed at end of game */ if (borg_skill[BI_CDEPTH] >=97 && !borg_fighting_unique && !good_speed) p2 = 9999; /* if this is an improvement and we may not avoid monster now and */ /* we may have before */ if ( ((p1 > p2) && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2)) && (p1 > (avoidance/5)) && good_speed) || ((p1 > p2) && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/3)) && (p1 > (avoidance/7)))) { /* Simulation */ if (borg_simulate) return (p1-p2); borg_note("# Attempting to cast Speed"); /* No resting to recoop mana */ borg_no_rest_prep = 10000; /* do it! */ if ( borg_zap_rod( SV_ROD_SPEED ) || borg_activate_artifact(EF_HASTE1) || borg_activate_artifact(EF_HASTE2) || borg_use_staff(SV_STAFF_SPEED) || borg_quaff_potion(SV_POTION_SPEED)) /* Value */ return (p1-p2); if (borg_spell_fail( 3, 2, fail_allowed)) return (p1-p2); } /* default to can't do it. */ return (0); } /* cold/fire */ static int borg_defend_aux_resist_fc( int p1 ) { int p2 = 0; int fail_allowed = 25; bool save_fire = FALSE, save_cold = FALSE; if (borg_skill[BI_TRFIRE] && borg_skill[BI_TRCOLD]) return (0); #if 0 if (borg_skill[BI_RFIRE] && borg_skill[BI_RCOLD]) return (0); #endif /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance) fail_allowed -= 19; else /* a little scary */ if ( p1 > (avoidance*2)/3) fail_allowed -= 10; else /* not very scary, allow lots of fail */ if ( p1 < avoidance/3) fail_allowed += 10; if (!borg_prayer_okay_fail(1, 7, fail_allowed) && !borg_equips_artifact(EF_RESIST_ALL)) return (0); /* elemental and PFE use the 'averaging' method for danger. Redefine p1 as such. */ p1 = borg_danger(c_y, c_x, 1, FALSE, FALSE); /* pretend we are protected and look again */ save_fire = borg_skill[BI_TRFIRE]; save_cold = borg_skill[BI_TRCOLD]; borg_skill[BI_TRFIRE] = TRUE; borg_skill[BI_TRCOLD] = TRUE; p2 = borg_danger(c_y, c_x, 1, FALSE, FALSE); borg_skill[BI_TRFIRE] = save_fire; borg_skill[BI_TRCOLD] = save_cold; /* Hack - * If the borg is fighting a particular unique enhance the * benefit of the spell. */ if (borg_fighting_unique && (unique_on_level == 539) /* Tarresque */ /* || * (unique_on_level == XX) || */ ) p2 = p2 * 8 / 10; /* if this is an improvement and we may not avoid monster now and */ /* we may have before */ if (p1 > p2 && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2)) && p1 > (avoidance/7)) { /* Simulation */ if (borg_simulate) return (p1-p2); borg_note("# Attempting to cast FC"); /* No resting to recoop mana */ borg_no_rest_prep = 10000; /* do it! */ if (borg_activate_artifact(EF_RESIST_ALL) || borg_prayer_fail(1, 7, fail_allowed) ) /* No resting to recoop mana */ borg_no_rest_prep = 10000; /* Value */ return (p1-p2); } /* default to can't do it. */ return (0); } /* all resists */ static int borg_defend_aux_resist_fecap( int p1) { int p2 = 0; int fail_allowed = 25; bool save_fire = FALSE, save_acid = FALSE, save_poison = FALSE, save_elec = FALSE, save_cold = FALSE; if (borg_skill[BI_TRFIRE] && borg_skill[BI_TRACID] && borg_skill[BI_TRPOIS] && borg_skill[BI_TRELEC] && borg_skill[BI_TRCOLD]) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance) fail_allowed -= 19; else /* a little scary */ if ( p1 > (avoidance*2)/3) fail_allowed -= 10; else /* not very scary, allow lots of fail */ if ( p1 < avoidance/3) fail_allowed += 10; if (!borg_spell_okay_fail(4, 3, fail_allowed) && !borg_equips_artifact(EF_RESIST_ALL)) return (0); /* elemental and PFE use the 'averaging' method for danger. Redefine p1 as such. */ p1 = borg_danger(c_y, c_x, 1, FALSE, FALSE); /* pretend we are protected and look again */ save_fire = borg_skill[BI_TRFIRE]; save_elec = borg_skill[BI_TRELEC]; save_cold = borg_skill[BI_TRCOLD]; save_acid = borg_skill[BI_TRACID]; save_poison = borg_skill[BI_TRPOIS]; borg_skill[BI_TRFIRE] = TRUE; borg_skill[BI_TRELEC] = TRUE; borg_skill[BI_TRCOLD] = TRUE; borg_skill[BI_TRACID] = TRUE; borg_skill[BI_TRPOIS] = TRUE; p2 = borg_danger(c_y, c_x, 1, FALSE, FALSE); borg_skill[BI_TRFIRE] = save_fire; borg_skill[BI_TRELEC] = save_elec; borg_skill[BI_TRCOLD] = save_cold; borg_skill[BI_TRACID] = save_acid; borg_skill[BI_TRPOIS] = save_poison; /* Hack - * If the borg is fighting a particular unique enhance the * benefit of the spell. */ if (borg_fighting_unique && (unique_on_level == 539) /* Tarresque */ /* || * (unique_on_level == XX) || */ ) p2 = p2 * 8 / 10; /* Hack - * If borg is high enough level, he does not need to worry * about mana consumption. Cast the good spell. */ if (borg_skill[BI_CLEVEL] >= 45) p2 = p2 * 8 / 10; /* if this is an improvement and we may not avoid monster now and */ /* we may have before */ if (p1 > p2 && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2)) && p1 > (avoidance/7)) { /* Simulation */ if (borg_simulate) return (p1 - p2 + 2); borg_note("# Attempting to cast FECAP"); /* do it! */ if (borg_activate_artifact(EF_RESIST_ALL) || borg_spell_fail(4, 3, fail_allowed) ) /* No resting to recoop mana */ borg_no_rest_prep = 10000; /* Value */ return (p1-p2+2); } /* default to can't do it. */ return (0); } /* fire */ static int borg_defend_aux_resist_f( int p1 ) { int p2 = 0; int fail_allowed = 25; bool save_fire = FALSE; save_fire = borg_skill[BI_TRFIRE]; if (borg_skill[BI_TRFIRE]) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance) fail_allowed -= 19; else /* a little scary */ if ( p1 > (avoidance*2)/3) fail_allowed -= 10; else /* not very scary, allow lots of fail */ if ( p1 < avoidance/3) fail_allowed += 10; if (!borg_spell_okay_fail(4, 1, fail_allowed) && !borg_equips_artifact(EF_RESIST_ALL) && !borg_equips_ring(SV_RING_FLAMES) && -1 == borg_slot(TV_POTION, SV_POTION_RESIST_HEAT)) return (0); /* elemental and PFE use the 'averaging' method for danger. Redefine p1 as such. */ p1 = borg_danger(c_y, c_x, 1, FALSE, FALSE); /* pretend we are protected and look again */ borg_skill[BI_TRFIRE] = TRUE; p2 = borg_danger(c_y, c_x, 1, FALSE, FALSE); borg_skill[BI_TRFIRE] = save_fire; /* Hack - * If the borg is fighting a particular unique enhance the * benefit of the spell. */ if (borg_fighting_unique && (unique_on_level == 539) /* Tarresque */ /* || * (unique_on_level == XX) || */ ) p2 = p2 * 8 / 10; /* if this is an improvement and we may not avoid monster now and */ /* we may have before */ if (p1 > p2 && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2)) && p1 > (avoidance/7)) { /* Simulation */ if (borg_simulate) return (p1-p2); borg_note("# Attempting to cast RFire"); /* do it! */ if (borg_activate_ring(SV_RING_FLAMES)) { /* Ring also attacks so target self */ borg_keypress('*'); borg_keypress('5'); return (p1-p2); } if (borg_activate_artifact(EF_RESIST_ALL) || borg_spell_fail(4, 1, fail_allowed) || borg_quaff_potion(SV_POTION_RESIST_HEAT)) /* No resting to recoop mana */ borg_no_rest_prep = 2000; /* Value */ return (p1-p2); } /* default to can't do it. */ return (0); } /* cold */ static int borg_defend_aux_resist_c( int p1 ) { int p2 = 0; int fail_allowed = 25; bool save_cold = FALSE; if ( borg_skill[BI_TRCOLD] ) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance) fail_allowed -= 19; else /* a little scary */ if ( p1 > (avoidance*2)/3) fail_allowed -= 10; else /* not very scary, allow lots of fail */ if ( p1 < avoidance/3) fail_allowed += 10; if (!borg_spell_okay_fail(4, 0, fail_allowed) && !borg_equips_artifact(EF_RESIST_ALL) && !borg_equips_ring(SV_RING_ICE) && -1 == borg_slot(TV_POTION, SV_POTION_RESIST_COLD)) return (0); /* elemental and PFE use the 'averaging' method for danger. Redefine p1 as such. */ p1 = borg_danger(c_y, c_x, 1, FALSE, FALSE); save_cold = borg_skill[BI_TRCOLD]; /* pretend we are protected and look again */ borg_skill[BI_TRCOLD] = TRUE; p2 = borg_danger(c_y, c_x, 1, FALSE, FALSE); borg_skill[BI_TRCOLD] = save_cold; /* Hack - * If the borg is fighting a particular unique enhance the * benefit of the spell. */ if (borg_fighting_unique && (unique_on_level == 539) /* Tarresque */ /* || * (unique_on_level == XX) || */ ) p2 = p2 * 8 / 10; /* if this is an improvement and we may not avoid monster now and */ /* we may have before */ if (p1 > p2 && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2)) && p1 > (avoidance/7)) { /* Simulation */ if (borg_simulate) return (p1-p2); borg_note("# Attempting to cast RCold"); /* do it! */ if (borg_activate_ring(SV_RING_ICE)) { /* Ring also attacks so target self */ borg_keypress('*'); borg_keypress('5'); return (p1-p2); } if (borg_activate_artifact(EF_RESIST_ALL) || borg_spell_fail(4, 0, fail_allowed) || borg_quaff_potion(SV_POTION_RESIST_COLD)) /* No resting to recoop mana */ borg_no_rest_prep = 2000; /* Value */ return (p1-p2); } /* default to can't do it. */ return (0); } /* acid */ static int borg_defend_aux_resist_a( int p1 ) { int p2 = 0; int fail_allowed = 25; bool save_acid = FALSE; if (borg_skill[BI_TRACID]) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance) fail_allowed -= 19; else /* a little scary */ if ( p1 > (avoidance*2)/3) fail_allowed -= 10; else /* not very scary, allow lots of fail */ if ( p1 < avoidance/3) fail_allowed += 10; if (!borg_spell_okay_fail(4, 3, fail_allowed) && !borg_equips_artifact(EF_RESIST_ALL) && !borg_equips_ring(SV_RING_ACID)) return (0); /* elemental and PFE use the 'averaging' method for danger. Redefine p1 as such. */ p1 = borg_danger(c_y, c_x, 1, FALSE, FALSE); save_acid = borg_skill[BI_TRACID]; /* pretend we are protected and look again */ borg_skill[BI_TRACID] = TRUE; p2 = borg_danger(c_y, c_x, 1, FALSE, FALSE); borg_skill[BI_TRACID] = save_acid; /* if this is an improvement and we may not avoid monster now and */ /* we may have before */ if (p1 > p2 && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2)) && p1 > (avoidance/7)) { /* Simulation */ if (borg_simulate) return (p1-p2); borg_note("# Attempting to cast RAcid"); /* do it! */ if (borg_spell(4, 3)) { return (p1-p2); } if (borg_activate_ring(SV_RING_ACID)) { /* Ring also attacks so target self */ borg_keypress('*'); borg_keypress('5'); return (p1-p2); } if (borg_activate_artifact(EF_RESIST_ALL)) /* No resting to recoop mana */ borg_no_rest_prep = 2000; /* Value */ return (p1-p2); } /* default to can't do it. */ return (0); } /* poison */ static int borg_defend_aux_resist_p( int p1 ) { int p2 = 0; int fail_allowed = 25; bool save_poison = FALSE; if (borg_skill[BI_TRPOIS]) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance) fail_allowed -= 19; else /* a little scary */ if ( p1 > (avoidance*2)/3) fail_allowed -= 10; else /* not very scary, allow lots of fail */ if ( p1 < avoidance/3) fail_allowed += 10; if (!borg_spell_okay_fail(4, 2, fail_allowed) && !borg_equips_artifact(EF_RESIST_ALL)) return (0); /* elemental and PFE use the 'averaging' method for danger. Redefine p1 as such. */ p1 = borg_danger(c_y, c_x, 1, FALSE, FALSE); save_poison = borg_skill[BI_TRPOIS]; /* pretend we are protected and look again */ borg_skill[BI_TRPOIS] = TRUE; p2 = borg_danger(c_y, c_x, 1, FALSE, FALSE); borg_skill[BI_TRPOIS] = save_poison; /* if this is an improvement and we may not avoid monster now and */ /* we may have before */ if (p1 > p2 && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2)) && p1 > (avoidance/7)) { /* Simulation */ if (borg_simulate) return (p1-p2); borg_note("# Attempting to cast RPois"); /* do it! */ if (borg_activate_artifact(EF_RESIST_ALL) || borg_spell_fail(4, 2, fail_allowed) ) /* No resting to recoop mana */ borg_no_rest_prep = 2000; /* Value */ return (p1-p2); } /* default to can't do it. */ return (0); } static int borg_defend_aux_prot_evil( int p1) { int p2 = 0; int fail_allowed = 25; bool pfe_spell = FALSE; borg_grid *ag = &borg_grids[c_y][c_x]; /* if already protected */ if (borg_prot_from_evil) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance) fail_allowed -= 19; else /* a little scary */ if ( p1 > (avoidance*2)/3) fail_allowed -= 5; else /* not very scary, allow lots of fail */ if ( p1 < avoidance/3) fail_allowed += 10; if (borg_prayer_okay_fail(2,4,fail_allowed)) pfe_spell= TRUE; if ( 0 <= borg_slot(TV_SCROLL,SV_SCROLL_PROTECTION_FROM_EVIL)) pfe_spell = TRUE; if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) pfe_spell = FALSE; if (!(ag->info & BORG_GLOW) && borg_skill[BI_CURLITE] == 0) pfe_spell = FALSE; if (borg_equips_artifact(EF_PROTEVIL)) pfe_spell = TRUE; if (pfe_spell == FALSE) return (0); /* elemental and PFE use the 'averaging' method for danger. Redefine p1 as such. */ p1 = borg_danger(c_y, c_x, 1, FALSE, FALSE); /* pretend we are protected and look again */ borg_prot_from_evil = TRUE; p2 = borg_danger(c_y, c_x, 1, FALSE, FALSE); borg_prot_from_evil = FALSE; /* if this is an improvement and we may not avoid monster now and */ /* we may have before */ if ((p1 > p2 && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2)) && p1 > (avoidance /7)) || (borg_money_scum_amount >= 1 && borg_skill[BI_CDEPTH] ==0)) { /* Simulation */ if (borg_simulate) return (p1-p2); borg_note("# Attempting to cast PFE"); /* do it! */ if (borg_prayer_fail(2, 4, fail_allowed) || borg_activate_artifact(EF_PROTEVIL) || borg_read_scroll(SV_SCROLL_PROTECTION_FROM_EVIL) ) /* No resting to recoop mana */ borg_no_rest_prep = 2000; /* Value */ return (p1-p2); } /* default to can't do it. */ return (0); } static int borg_defend_aux_shield( int p1) { int p2 = 0; int fail_allowed = 25; /* if already protected */ if (borg_shield) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance) fail_allowed -= 19; else /* a little scary */ if ( p1 > (avoidance*2)/3) fail_allowed -= 5; else /* not very scary, allow lots of fail */ if ( p1 < avoidance/3) fail_allowed += 5; if (!borg_spell_okay_fail(4, 4, fail_allowed) && borg_has[SHROOM_STONESKIN] <= 0 ) return (0); /* pretend we are protected and look again */ borg_shield = TRUE; p2 = borg_danger(c_y, c_x, 1, TRUE, FALSE); borg_shield = FALSE; /* slightly enhance the value if fighting a unique */ if (borg_fighting_unique) p2=(p2*7/10); /* if this is an improvement and we may not avoid monster now and */ /* we may have before */ if (p1 > p2 && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2)) && p1 > (avoidance/7)) { /* Simulation */ if (borg_simulate) return (p1-p2); borg_note("# Attempting to cast Shield"); /* do it! */ if (borg_spell_fail(4, 4, fail_allowed) || borg_eat_food(SV_FOOD_STONESKIN)) { /* No resting to recoop mana */ borg_no_rest_prep = 2000; return (p1-p2); } } /* default to can't do it. */ return (0); } /* * Try to get rid of all of the non-uniques around so you can go at it * 'mano-e-mano' with the unique. Teleport Other. */ static int borg_defend_aux_tele_away( int p1) { int p2 = p1; int fail_allowed = 50; bool spell_ok = FALSE; int i, x, y; borg_grid *ag; /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* * Only tport monster away if scared or getting low on mana */ if (borg_fighting_unique) { if (p1 < avoidance * 7/10 && borg_skill[BI_CURSP] > 30 && borg_simulate) return (0); } else { if (p1 < avoidance * 5/10 && borg_skill[BI_CURSP] > 30 && borg_simulate) return (0); } /* No real Danger to speak of */ if (p1 < avoidance * 4 / 10 && borg_simulate) return (0); spell_ok = FALSE; /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance*3) fail_allowed -= 10; else /* scary */ if ( p1 > avoidance*2) fail_allowed -= 5; else /* a little scary */ if ( p1 > (avoidance*5)/2) fail_allowed += 5; /* do I have the ability? */ if (borg_spell_okay_fail(3, 1, fail_allowed) || borg_prayer_okay_fail(4, 2, fail_allowed) || borg_equips_artifact(EF_TELE_OTHER) || ( -1 != borg_slot(TV_WAND, SV_WAND_TELEPORT_AWAY) && borg_items[borg_slot(TV_WAND, SV_WAND_TELEPORT_AWAY)].pval)) spell_ok = TRUE; if (!spell_ok) return (0); /* No Teleport Other if surrounded */ if (borg_surrounded() == TRUE) return (0); /* Borg_temp_n temporarily stores several things. * Some of the borg_attack() sub-routines use these numbers, * which would have been filled in borg_attack(). * Since this is a defence manuever which will move into * and borrow some of the borg_attack() subroutines, we need * to make sure that the borg_temp_n arrays are properly * filled. Otherwise, the borg will attempt to consider * these grids which were left filled by some other routine. * Which was probably a flow routine which stored about 200 * grids into the array. * Any change in inclusion/exclusion criteria for filling this * array in borg_attack() should be included here also. */ /* Nobody around so dont worry */ if (!borg_kills_cnt && borg_simulate) return (0); /* Reset list */ borg_temp_n = 0; borg_tp_other_n = 0; /* Find "nearby" monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; /* Monster */ kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Require current knowledge */ if (kill->when < borg_t - 2) continue; /* Acquire location */ x = kill->x; y = kill->y; /* Get grid */ ag = &borg_grids[y][x]; /* Never shoot off-screen */ if (!(ag->info & BORG_OKAY)) continue; /* Never shoot through walls */ if (!(ag->info & BORG_VIEW)) continue; if ((ag->feat >= FEAT_RUBBLE) && (ag->feat <= FEAT_PERM_SOLID)) continue; /* Check the distance XXX XXX XXX */ if (distance(c_y, c_x, y, x) > MAX_RANGE) continue; /* Save the location (careful) */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } /* No targets for me. */ if (!borg_temp_n && borg_simulate) return (0); /* choose, then target a bad guy. * Damage will be the danger to my grid which the monster creates. * We are targetting the single most dangerous monster. * p2 will be the original danger (p1) minus the danger from the most dangerous * monster eliminated. * ie: if we are fighting only a single monster who is generating 500 danger and we * target him, then p2 _should_ end up 0, since p1 - his danger is 500-500. * If we are fighting two guys each creating 500 danger, then p2 will be 500, since * 1000-500 = 500. */ p2 = p1 - borg_launch_bolt(-1, p1, GF_AWAY_ALL, MAX_RANGE, 0); /* check to see if I am left better off */ if (borg_simulate) { /* Reset list */ borg_temp_n = 0; borg_tp_other_n = 0; if (p1 > p2 && p2 < avoidance/2) { /* Simulation */ return (p1-p2); } else return (0); } /* Log the Path for Debug */ borg_log_spellpath(TRUE); /* Log additional info for debug */ for (i = 0; i < borg_tp_other_n; i++) { borg_note(format("# T.O. %d, index %d (%d,%d)",borg_tp_other_n, borg_tp_other_index[i], borg_tp_other_y[i], borg_tp_other_x[i])); } /* Reset list */ borg_temp_n = 0; borg_tp_other_n = 0; /* Cast the spell */ if (borg_spell(3, 1) || borg_prayer(4, 2) || borg_activate_artifact(EF_TELE_OTHER)|| borg_aim_wand(SV_WAND_TELEPORT_AWAY)) { /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -1; /* Value */ return (p2); } return (0); } /* * Hero to prepare for battle, +12 tohit. */ static int borg_defend_aux_hero( int p1 ) { int fail_allowed = 15; /* already hero */ if (borg_hero) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); if ( !borg_spell_okay_fail(7, 0, fail_allowed ) && -1 == borg_slot(TV_POTION, SV_POTION_HEROISM)) return (0); /* if we are in some danger but not much, go for a quick bless */ if ((p1 > avoidance * 1 / 10 && p1 < avoidance * 5 / 10) || (borg_fighting_unique && p1 < avoidance * 7 / 10)) { /* Simulation */ /* hero is a low priority */ if (borg_simulate) return (1); borg_note("# Attempting to cast Hero"); /* do it! */ if (borg_spell(7, 0 ) || borg_quaff_potion(SV_POTION_HEROISM)) { /* No resting to recoop mana */ borg_no_rest_prep = 1000; return 1; } } return (0); } /* * Bersek to prepare for battle, +24 tohit, -10 AC */ static int borg_defend_aux_berserk( int p1 ) { int fail_allowed = 15; /* already berserk */ if (borg_berserk) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); if (!borg_spell_okay_fail(7, 1, fail_allowed ) && -1 == borg_slot(TV_POTION, SV_POTION_BERSERK_STRENGTH) && !borg_equips_artifact(EF_BERSERKER)) return (0); /* if we are in some danger but not much, go for a quick bless */ if ((p1 > avoidance * 1 / 10 && p1 < avoidance * 5 / 10) || (borg_fighting_unique && p1 < avoidance * 7 / 10)) { /* Simulation */ /* berserk is a low priority */ if (borg_simulate) return (5); /* do it! */ if (borg_spell(7, 1) || borg_activate_artifact(EF_BERSERKER) || borg_quaff_potion(SV_POTION_BERSERK_STRENGTH)) return 2; } return (0); } /* Glyph of Warding and Rune of Protection */ static int borg_defend_aux_glyph( int p1) { int p2 = 0, i; int fail_allowed = 25; bool glyph_spell = FALSE; borg_grid *ag = &borg_grids[c_y][c_x]; /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* He should not cast it while on an object. * I have addressed this inadequately in borg9.c when dealing with * messages. The message "the object resists" will delete the glyph * from the array. Then I set a broken door on that spot, the borg ignores * broken doors, so he won't loop. */ if ( (ag->take) || (ag->feat == FEAT_GLYPH) || ((ag->feat >= FEAT_TRAP_HEAD) && (ag->feat <= FEAT_TRAP_TAIL)) || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_DOOR_TAIL)) || (ag->feat == FEAT_LESS) || (ag->feat == FEAT_MORE) || (ag->feat == FEAT_OPEN) || (ag->feat == FEAT_BROKEN) ) { return (0); } /* Morgoth breaks these in one try so its a waste of mana against him */ if (borg_fighting_unique >= 10) return (0); /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance) fail_allowed -= 19; else /* a little scary */ if ( p1 > (avoidance*2)/3) fail_allowed -= 5; else /* not very scary, allow lots of fail */ if ( p1 < avoidance/3) fail_allowed += 20; if (borg_prayer_okay_fail(3,4,fail_allowed)) glyph_spell = TRUE; if (borg_spell_okay_fail(6,4,fail_allowed)) glyph_spell = TRUE; if ( 0 <= borg_slot(TV_SCROLL,SV_SCROLL_RUNE_OF_PROTECTION)) glyph_spell = TRUE; if ((borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE]) && glyph_spell) glyph_spell = FALSE; if (!(ag->info & BORG_GLOW) && borg_skill[BI_CURLITE] == 0) glyph_spell = FALSE; if (!glyph_spell) return (0); /* pretend we are protected and look again */ borg_on_glyph = TRUE; p2 = borg_danger(c_y, c_x, 1, TRUE, FALSE); borg_on_glyph = FALSE; /* if this is an improvement and we may not avoid monster now and */ /* we may have before */ if (p1 > p2 && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2)) && p1 > (avoidance/7)) { /* Simulation */ if (borg_simulate) return (p1-p2); /* do it! */ if (borg_prayer_fail(3, 4, fail_allowed) || borg_spell_fail(6, 4, fail_allowed) || borg_read_scroll(SV_SCROLL_RUNE_OF_PROTECTION)) { /* Check for an existing glyph */ for (i = 0; i < track_glyph_num; i++) { /* Stop if we already new about this glyph */ if ((track_glyph_x[i] == c_x) && (track_glyph_y[i] == c_y)) return (p1-p2); } /* Track the newly discovered glyph */ if (track_glyph_num < track_glyph_size) { borg_note("# Noting the creation of a glyph."); track_glyph_x[track_glyph_num] = c_x; track_glyph_y[track_glyph_num] = c_y; track_glyph_num++; } return (p1-p2); } } /* default to can't do it. */ return (0); } /* Create Door */ static int borg_defend_aux_create_door( int p1) { int p2 = 0; int fail_allowed = 30; int door_bad =0; int door_x = 0, door_y = 0, x = 0,y = 0; borg_grid *ag; /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* any summoners near?*/ if (!borg_fighting_summoner) return (0); /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance) fail_allowed -= 19; else /* a little scary */ if ( p1 > (avoidance*2)/3) fail_allowed -= 5; else /* not very scary, allow lots of fail */ if ( p1 < avoidance/3) fail_allowed += 20; if (!borg_spell_okay_fail(6, 0, fail_allowed)) return (0); /* Do not cast if surounded by doors or something */ /* Get grid */ for (door_x = -1; door_x <= 1; door_x++) { for (door_y = -1; door_y <= 1; door_y++) { /* Acquire location */ x = door_x + c_x; y = door_y + c_y; ag = &borg_grids[y][x]; /* track spaces already protected */ if ( (ag->feat == FEAT_GLYPH) || ag->kill || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_PERM_SOLID))) { door_bad++; } /* track spaces that cannot be protected */ if ( (ag->take) || ((ag->feat >= FEAT_TRAP_HEAD) && (ag->feat <= FEAT_TRAP_TAIL)) || (ag->feat == FEAT_LESS) || (ag->feat == FEAT_MORE) || (ag->feat == FEAT_OPEN) || (ag->feat == FEAT_BROKEN) || (ag->kill)) { door_bad++; } } } /* Track it */ /* lets make sure that we going to be benifited */ if (door_bad >= 6) { /* not really worth it. Only 2 spaces protected */ return (0); } /* pretend we are protected and look again */ borg_create_door = TRUE; p2 = borg_danger(c_y, c_x, 1, TRUE, FALSE); borg_create_door = FALSE; /* if this is an improvement and we may not avoid monster now and */ /* we may have before */ if (p1 > p2 && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2)) && p1 > (avoidance/7)) { /* Simulation */ if (borg_simulate) return (p1-p2); /* do it! */ if (borg_spell_fail(6, 0, fail_allowed)) { /* Set the breeder flag to keep doors closed. Avoid summons */ breeder_level = TRUE; /* Must make a new Sea too */ borg_needs_new_sea = TRUE; /* Value */ return (p1-p2); } } /* default to can't do it. */ return (0); } /* This will simulate and cast the mass genocide spell. */ static int borg_defend_aux_mass_genocide(int p1) { int hit = 0, i= 0,p2; int b_p =0, p; borg_kill *kill; monster_race *r_ptr; /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* see if prayer is legal */ if (!borg_spell_okay_fail(8, 5, 40) && !borg_equips_artifact(EF_BANISHMENT) && (borg_skill[BI_AMASSBAN] == 0))/* Mass Banishment scroll */ return (0); /* See if he is in real danger */ if (p1 < avoidance * 12/10 && borg_simulate) return (0); /* Find a monster and calculate its danger */ for (i = 1; i < borg_kills_nxt; i++) { /* Monster */ kill = &borg_kills[i]; r_ptr = &r_info[kill->r_idx]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Check the distance */ if (distance(c_y, c_x, kill->y, kill->x) > 20) continue; /* we try not to genocide uniques */ if (rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* Calculate danger */ p = borg_danger_aux(c_y, c_x, 1, i, TRUE, TRUE); /* store the danger for this type of monster */ b_p = b_p + p; hit = hit + 3; } /* normalize the value */ p2 = (p1 - b_p); if (p2 < 0) p2 = 0; /* if strain (plus a pad incase we did not know about some monsters) * is greater than hp, don't cast it */ if ((hit * 12 / 10) >= borg_skill[BI_CURHP]) return (0); /* Penalize the strain from casting the spell */ p2 = p2 + hit; /* Be more likely to use this if fighting Morgoth */ if (borg_fighting_unique >= 10 && (hit / 3 > 8)) { p2 = p2 * 6/10; } /* if this is an improvement and we may not avoid monster now and */ /* we may have before */ if (p1 > p2 && p2 <= (borg_fighting_unique?(avoidance*2/3): (avoidance/2)) ) { /* Simulation */ if (borg_simulate) return (p1-p2); /* Cast the spell */ if (borg_read_scroll(SV_SCROLL_MASS_BANISHMENT) || borg_activate_artifact(EF_BANISHMENT) || borg_spell(8, 5)) { /* Remove monsters from the borg_kill */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; monster_race *r_ptr; /* Monster */ kill = &borg_kills[i]; r_ptr = &r_info[kill->r_idx]; /* Cant kill uniques like this */ if (rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* remove this monster */ borg_delete_kill(i); } /* Value */ return (p1-p2); } } /* Not worth it */ return (0); } /* This will simulate and cast the genocide spell. * There are two seperate functions happening here. * 1. will genocide the race which is immediately threatening the borg. * 2. will genocide the race which is most dangerous on the level. Though it may not be * threatening the borg right now. It was considered to nuke the escorts of a unique. * But it could also be used to nuke a race if it becomes too dangerous, for example * a summoner called up 15-20 hounds, and they must be dealt with. * The first option may be called at any time. While the 2nd option is only called when the * borg is in relatively good health. */ static int borg_defend_aux_genocide(int p1) { int i, p, u, b_i = 0; int p2 = 0; int threat = 0; int max=1; int b_p[256]; int b_num[256]; int b_threat[256]; int b_threat_num[256]; int total_danger_to_me = 0; char genocide_target = (char)0; unsigned char b_threat_id = (char)0; bool genocide_spell = FALSE; int fail_allowed = 25; /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance) fail_allowed -= 19; else /* a little scary */ if ( p1 > (avoidance*2)/3) fail_allowed -= 10; else /* not very scary, allow lots of fail */ if ( p1 < avoidance/3) fail_allowed += 10; /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* Normalize the p1 value. It contains danger added from * regional fear and monster fear. Which wont be counted * in the post-genocide checks */ if (borg_fear_region[c_y/11][c_x/11]) p1 -= borg_fear_region[c_y/11][c_x/11]; if (borg_fear_monsters[c_y][c_x]) p1 -= borg_fear_monsters[c_y][c_x]; /* Make sure I have the spell */ if (borg_spell_okay_fail(8, 3, fail_allowed) || borg_equips_artifact(EF_BANISHMENT) || borg_equips_staff_fail(SV_STAFF_BANISHMENT) || ( -1 != borg_slot(TV_SCROLL, SV_SCROLL_BANISHMENT))) { genocide_spell = TRUE; } if (genocide_spell == FALSE) return (0); /* Don't try it if really weak */ if (borg_skill[BI_CURHP] <= 75) return (0); /* two methods to calculate the threat: *1. cycle each character of monsters on screen * collect collective threat of each char *2 select race of most dangerous guy, and choose him. * Method 2 is cheaper and faster. * * The borg uses method #1 */ /* Clear previous dangers */ for (i= 0; i < 256; i++) { b_p[i] = 0; b_num[i] = 0; b_threat[i]=0; b_threat_num[i]=0; } /* Find a monster and calculate its danger */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; monster_race *r_ptr; /* Monster */ kill = &borg_kills[i]; r_ptr = &r_info[kill->r_idx]; /* Our char of the monster */ u = r_ptr->d_char; /* Skip dead monsters */ if (!kill->r_idx) continue; /* we try not to genocide uniques */ if (rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* Calculate danger */ /* Danger to me by this monster */ p = borg_danger_aux(c_y, c_x, 1, i, TRUE, TRUE); /* Danger of this monster to his own grid */ threat = borg_danger_aux(kill->y, kill->x, 1, i, TRUE, TRUE); /* store the danger for this type of monster */ b_p[u] = b_p[u] + p; /* Danger to me */ total_danger_to_me += p; b_threat[u] = b_threat[u] + threat; /* Danger to monsters grid */ /* Store the number of this type of monster */ b_num[u] ++; b_threat_num[u] ++; } /* Now, see which race contributes the most danger * both to me and danger on the level */ for (i=0; i < 256; i++) { /* skip the empty ones */ if (b_num[i] == 0 && b_threat_num[i] ==0) continue; /* for the race threatening me right now */ if (b_p[i] > max) { /* track the race */ max = b_p[i]; b_i = i; /* note the danger with this race gone. Note that the borg does max his danger * at 2000 points. It could be much, much higher at depth 99 or so. * What the borg should do is recalculate the danger without considering this monster * instead of this hack which does not yeild the true danger. */ p2 = total_danger_to_me - b_p[b_i]; } /* for this race on the whole level */ if (b_threat[i] > max) { /* track the race */ max = b_threat[i]; b_threat_id = i; } /* Leave an interesting note for debugging */ if (!borg_simulate) borg_note(format("# Race '%c' is a threat with total danger %d from %d individuals.",i,b_threat[i],b_threat_num[i])); } /* This will track and decide if it is worth genociding this dangerous race for the level */ if (b_threat_id) { /* Not if I am weak (should have 400 HP really in case of a Pit) */ if (borg_skill[BI_CURHP] < 375) b_threat_id = 0; /* The threat must be real */ if (b_threat[b_threat_id] < borg_skill[BI_MAXHP] * 3) b_threat_id = 0; /* Too painful to cast it (padded to be safe incase of unknown monsters) */ if ((b_num[b_threat_id] * 4)*12/10 >= borg_skill[BI_CURHP]) b_threat_id = 0; /* Loads of monsters might be a pit, in which case, try not to nuke them */ if (b_num[b_threat_id] >= 75) b_threat_id = 0; /* Do not perform in Danger */ if (p1 > avoidance / 5) b_threat_id = 0; /* report the danger and most dangerous race */ if (b_threat_id) { borg_note(format("# Race '%c' is a real threat with total danger %d from %d individuals.",b_threat_id,b_threat[b_threat_id],b_threat_num[b_threat_id])); } /* Genociding this race would reduce the danger of the level */ genocide_target = b_threat_id; } /* Consider the immediate threat genocide */ if (b_i) { /* Too painful to cast it (padded to be safe incase of unknown monsters) */ if ((b_num[b_i] * 4)*12/10 >= borg_skill[BI_CURHP]) b_i = 0; /* See if he is in real danger, generally, * or deeper in the dungeon, conservatively, */ if (p1 < avoidance * 7/10 || (borg_skill[BI_CDEPTH] > 75 && p1 < avoidance*6/10)) b_i = 0; /* Did this help improve my situation? */ if (p2 <= (avoidance / 2)) b_i = 0; /* Genociding this race would help me immediately */ genocide_target = b_i; } /* Complete the genocide routine */ if (genocide_target) { if (borg_simulate) { /* Simulation for immediate threat */ if (b_i) return (p1-p2); /* Simulation for immediate threat */ if (b_threat_id) return (b_threat[b_threat_id]); } if (b_i) borg_note(format("# Banishing race '%c' (qty:%d). Danger after spell:%d",genocide_target, b_num[b_i], p2)); if (b_threat_id) borg_note(format("# Banishing race '%c' (qty:%d). Danger from them:%d",genocide_target, b_threat_num[b_threat_id], b_threat[b_threat_id])); /* do it! ---use scrolls first since they clutter inventory */ if ( borg_read_scroll( SV_SCROLL_BANISHMENT) || borg_spell(8, 3) || borg_activate_artifact(EF_BANISHMENT) || borg_use_staff(SV_STAFF_BANISHMENT)) { /* and the winner is.....*/ borg_keypress((genocide_target)); } /* Remove this race from the borg_kill */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; monster_race *r_ptr; /* Monster */ kill = &borg_kills[i]; r_ptr = &r_info[kill->r_idx]; /* Our char of the monster */ if (r_ptr->d_char != genocide_target) continue; /* we do not genocide uniques */ if (rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* remove this monster */ borg_delete_kill(i); } return (p1-p2); } /* default to can't do it. */ return (0); } /* This will cast the genocide spell on Hounds and other * really nasty guys like Angels, Demons, Dragons and Liches * at the beginning of each level or when they get too numerous. * The acceptable numbers are defined in borg_nasties_limit[] * The definition for the list is in borg1.c * borg_nasties[7] = "ZAVULWD" * */ static int borg_defend_aux_genocide_nasties(int p1) { int i= 0; int b_i = -1; bool genocide_spell = FALSE; /* Not if I am weak */ if (borg_skill[BI_CURHP] < (borg_skill[BI_MAXHP] *7/10) || borg_skill[BI_CURHP] < 250) return (0); /* only do it when Hounds start to show up, */ if (borg_skill[BI_CDEPTH] < 25) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* Do not perform in Danger */ if (p1 > avoidance / 4) return (0); if (borg_spell_okay_fail(8, 3, 35) || borg_equips_artifact(EF_BANISHMENT) || borg_equips_staff_fail(SV_STAFF_BANISHMENT)) { genocide_spell = TRUE; } if (genocide_spell == FALSE) return (0); /* Find the numerous nasty in order of nastiness */ for (i = 0; i < borg_nasties_num; i++) { if (borg_nasties_count[i] >= borg_nasties_limit[i]) b_i = i; } /* Nothing good to Genocide */ if (b_i == -1) return (0); if (borg_simulate) return (10); /* Note it */ borg_note(format("# Banishing nasties '%c' (qty:%d).",borg_nasties[b_i], borg_nasties_count[b_i])); /* Execute -- Nice pun*/ if (borg_activate_artifact(EF_BANISHMENT) || borg_use_staff(SV_STAFF_BANISHMENT) || borg_spell(8, 3)) { /* and the winner is.....*/ borg_keypress(borg_nasties[b_i]); /* set the count to not do it again */ borg_nasties_count[b_i] = 0; /* Remove this race from the borg_kill */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; monster_race *r_ptr; /* Monster */ kill = &borg_kills[i]; r_ptr = &r_info[kill->r_idx]; /* Our char of the monster */ if (r_ptr->d_char != borg_nasties[b_i]) continue; /* remove this monster */ borg_delete_kill(i); } return (10); } /* default to can't do it. */ return (0); } /* Earthquake, priest and mage spells. */ static int borg_defend_aux_earthquake(int p1) { int p2 = 9999; int i; int threat_count = 0; borg_kill *kill; /* Cast the spell */ if (!borg_simulate && (borg_prayer(2, 5) || borg_spell(8,0))) { /* Must make a new Sea too */ borg_needs_new_sea = TRUE; return (p2); } /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* Can I cast the spell? */ if (!borg_prayer_okay_fail(2, 5, 35) && !borg_spell_okay_fail(8, 0, 35)) return (0); /* See if he is in real danger or fighting summoner*/ if (p1 < avoidance * 6 / 10 && !borg_fighting_summoner) return (0); /* Several monsters can see the borg and they have ranged attacks */ for (i = 0; i < borg_kills_nxt; i++) { kill = &borg_kills[i]; /* Look for threats */ if (borg_los(c_y, c_x, kill->y, kill->x) && kill->ranged_attack && distance(kill->y, kill->x, c_y, c_x) >= 2) { /* They can hit me */ threat_count ++; } } /* Real danger? */ if (threat_count >= 4 && p1 > avoidance * 7 /10) p2 = p1 / 3; if (threat_count == 3 && p1 > avoidance * 7 /10) p2 = p1 * 6/10; if (p1 > p2 && p2 <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2)) && p1 > (avoidance/5)) { /* Simulation */ if (borg_simulate) return (p1-p2); } return (0); } /* Word of Destruction, priest and mage spells. Death is right around the * corner, so kill everything. */ static int borg_defend_aux_destruction(int p1) { int p2 = 0; int d = 0; bool spell= FALSE; bool real_danger = FALSE; /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* Cast the spell */ if (!borg_simulate) { if (borg_prayer(8, 3) || borg_use_staff(SV_STAFF_DESTRUCTION)) { /* Must make a new Sea too */ borg_needs_new_sea = TRUE; /* borg9.c will check for the success of the spell and remove the danger from the grids. */ } return (500); } /* Not if in a sea of runes */ if (borg_morgoth_position) return (0); /* See if he is in real danger */ if (p1 > avoidance) real_danger = TRUE; if (p1 > avoidance * 8/10 && borg_skill[BI_CDEPTH] >= 90 && borg_skill[BI_CURHP] <= 300) real_danger = TRUE; if (real_danger == FALSE) return (0); /* Borg_defend() is called before borg_escape(). He may have some * easy ways to escape (teleport scroll) but he may attempt this spell * of Destruction instead of using the scrolls. * Note that there will be some times when it is better for * the borg to use Destruction instead of Teleport; too * often he will die out-of-the-fryingpan-into-the-fire. * So we have him to a quick check on safe landing zones. */ /* Examine landing zones from teleport scrolls instead of WoD */ if ((borg_skill[BI_ATELEPORT] || borg_skill[BI_ATELEPORTLVL]) && !borg_skill[BI_ISBLIND] && !borg_skill[BI_ISCONFUSED] && borg_fighting_unique <= 4 && borg_skill[BI_CURHP] >= 275) { if (borg_caution_teleport(75, 2)) return (0); } /* Examine Landing zones from teleport staff instead of WoD */ if (borg_skill[BI_AESCAPE] >= 2 && borg_skill[BI_CURHP] >= 275) { if (borg_caution_teleport(75, 2)) return (0); } /* capable of casting the spell */ if (borg_prayer_okay_fail(8, 3, 55) || borg_equips_staff_fail(SV_STAFF_DESTRUCTION)) spell = TRUE; /* Special check for super danger--no fail check */ if ((p1 > (avoidance * 4) || (p1 > avoidance && borg_skill[BI_CURHP] <= 150)) && borg_equips_staff_fail(SV_STAFF_DESTRUCTION)) spell= TRUE; if (spell == FALSE) return (0); /* What effect is there? */ p2= 0; /* value is d */ d = (p1-p2); /* Try not to cast this against uniques */ if (borg_fighting_unique <= 2 && p1 < avoidance * 2) d = 0; if (borg_fighting_unique >= 10) d = 0; /* Simulation */ if (borg_simulate) return (d); return (0); } /* Teleport Level, priest and mage spells. Death is right around the * corner, Get off the level now. */ static int borg_defend_aux_teleportlevel( int p1) { /* Cast the spell */ if (!borg_simulate) { if (borg_prayer(4, 3) || borg_spell(6, 2)) { /* Must make a new Sea too */ borg_needs_new_sea = TRUE; return (500); } } /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* See if he is in real danger */ if (p1 < avoidance * 2) return (0); /* Borg_defend() is called before borg_escape(). He may have some * easy ways to escape (teleport scroll) but he may attempt this spell * of this spell instead of using the scrolls. * Note that there will be some times when it is better for * the borg to use this instead of Teleport; too * often he will die out-of-the-fryingpan-into-the-fire. * So we have him to a quick check on safe landing zones. */ /* Use teleport scrolls instead if safe to land */ if ((borg_skill[BI_ATELEPORT] || borg_skill[BI_ATELEPORTLVL]) && !borg_skill[BI_ISBLIND] && !borg_skill[BI_ISCONFUSED]) { if (borg_caution_teleport(65, 2)) return (0); } /* Use teleport staff instead if safe to land */ if (borg_skill[BI_AESCAPE] >= 2) { if (borg_caution_teleport(65, 2)) return (0); } /* capable of casting the spell */ if (!borg_prayer_okay_fail(4, 3, 55) && !borg_spell_okay_fail(6, 2, 55)) return (0); /* Try not to cast this against special uniques */ if (morgoth_on_level || (borg_fighting_unique >= 1 && borg_as_position)) return (0); /* Simulation */ if (borg_simulate) return (p1); return (0); } /* Remove Evil guys within LOS. The Priest Spell */ static int borg_defend_aux_banishment( int p1) { int p2 = 0; int fail_allowed = 15; int i; int banished_monsters = 0; borg_grid *ag; /* Only tell away if scared */ if ( p1 < avoidance * 1/10) return (0); /* if very scary, do not allow for much chance of fail */ if ( p1 > avoidance * 4) fail_allowed -= 10; /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); if (!borg_prayer_okay_fail(8, 2, fail_allowed)) return (0); /* reset initial danger */ p1 =1; /* Two passes to determine exact danger */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; /* Monster */ kill = &borg_kills[i]; ag= &borg_grids[kill->y][kill->x]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Check the LOS */ if (!borg_projectable(c_y, c_x, kill->y, kill->x)) continue; /* Calculate danger of who is left over */ p1 += borg_danger_aux(c_y, c_x, 1, i, TRUE, TRUE); } /* Set P2 to be P1 and subtract the danger from each monster * which will be booted. Non booted monsters wont decrement * the p2 */ p2 = p1; /* Pass two -- Find a monster and calculate its danger */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill; monster_race *r_ptr; /* Monster */ kill = &borg_kills[i]; r_ptr = &r_info[kill->r_idx]; ag= &borg_grids[kill->y][kill->x]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Check the LOS */ if (!borg_projectable(c_y, c_x, kill->y, kill->x)) continue; /* Note who gets considered */ if (!borg_simulate) { borg_note(format("# Banishing Evil: (%d,%d): %s, danger %d. is considered.", kill->y, kill->x, (r_info[kill->r_idx].name), borg_danger_aux(c_y,c_x, 1, ag->kill, TRUE, FALSE))); } /* Non evil monsters*/ if (!(rf_has(r_ptr->flags, RF_EVIL))) { /* Note who gets to stay */ if (!borg_simulate) { borg_note(format("# Banishing Evil: (%d,%d): %s, danger %d. Stays (not evil).", kill->y, kill->x, (r_info[kill->r_idx].name), borg_danger_aux(c_y,c_x, 1, ag->kill, TRUE, FALSE))); } continue; } /* Unique Monster in good health*/ if (rf_has(r_ptr->flags, RF_UNIQUE) && kill->injury > 60) { /* Note who gets to stay */ if (!borg_simulate) { borg_note(format("# Banishing Evil: (%d,%d): %s, danger %d. Unique not considered: Injury %d.", kill->y, kill->x, (r_info[kill->r_idx].name), borg_danger_aux(c_y,c_x, 1, ag->kill, TRUE, FALSE), kill->injury)); } continue; } /* Monsters in walls cant be booted */ if (!borg_cave_floor_bold(kill->y, kill->x)) { /* Note who gets banished */ if (!borg_simulate) { borg_note(format("# Banishing Evil: (%d,%d): %s, danger %d. Stays (in wall).", kill->y, kill->x, (r_info[kill->r_idx].name), borg_danger_aux(c_y,c_x, 1, ag->kill, TRUE, TRUE))); } continue; } /* Note who gets banished */ if (!borg_simulate) { borg_note(format("# Banishing Evil: (%d,%d): %s, danger %d. Booted.", kill->y, kill->x, (r_info[kill->r_idx].name), borg_danger_aux(c_y,c_x, 1, ag->kill, TRUE, TRUE))); borg_delete_kill(i); } /* Count */ banished_monsters ++; /* Calculate danger of who is left over */ p2 -= borg_danger_aux(c_y, c_x, 1, i, TRUE, TRUE); } /* Cast the spell */ if (!borg_simulate && borg_prayer(8, 2) ) { /* Value */ return (p1-p2); } /* p2 is the danger after all the bad guys are removed. */ /* no negatives */ if (p2 <= 0) p2 = 0; /* No monsters get booted */ if (banished_monsters == 0) p2 = 9999; /* Try not to cast this against Morgy/Sauron */ if (borg_fighting_unique >= 10 && borg_skill[BI_CURHP] > 250 && borg_skill[BI_CDEPTH] == 99) p2 = 9999; if (borg_fighting_unique >= 10 && borg_skill[BI_CURHP] > 350 && borg_skill[BI_CDEPTH] == 100) p2 = 9999; /* check to see if I am left better off */ if (p1 > p2 && p2 <= (borg_fighting_unique?((avoidance*2)/3) : (avoidance/2))) { /* Simulation */ if (borg_simulate) return (p1-p2); } return (0); } /* * Detect Inviso/Monsters * Used only if I am hit by an unseen guy. * Casts detect invis. */ static int borg_defend_aux_inviso(int p1) { int fail_allowed = 25; borg_grid *ag = &borg_grids[c_y][c_x]; /* no need */ if (borg_skill[BI_ISFORGET] || borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_see_inv) return (0); /* not recent */ if (borg_t > need_see_inviso + 5) return (0); /* too dangerous to cast */ if (p1 > avoidance * 2) return (0); /* Do I have anything that will work? */ if (-1 == borg_slot(TV_POTION,SV_POTION_DETECT_INVIS) && -1 == borg_slot(TV_SCROLL,SV_SCROLL_DETECT_INVIS) && !borg_equips_staff_fail(SV_STAFF_DETECT_INVIS) && !borg_equips_staff_fail(SV_STAFF_DETECT_EVIL) && !borg_prayer_okay_fail(2, 3, fail_allowed) && !borg_prayer_okay_fail(5, 0, fail_allowed) && !borg_spell_okay_fail(2, 6, fail_allowed)) return (0); /* Darkness */ if (!(ag->info & BORG_GLOW) && !borg_skill[BI_CURLITE]) return (0); /* No real value known, but lets cast it to find the bad guys. */ if (borg_simulate) return (10); /* smoke em if you got em */ /* short time */ /* snap shot */ if (borg_prayer(5, 0) || borg_spell_fail(2, 6, fail_allowed) || borg_read_scroll(SV_SCROLL_DETECT_INVIS) || borg_use_staff(SV_STAFF_DETECT_INVIS) || borg_use_staff(SV_STAFF_DETECT_EVIL)) { borg_see_inv = 3000; /* hack, actually a snap shot, no ignition message */ return (10); } if (borg_quaff_potion(SV_POTION_DETECT_INVIS)) { borg_see_inv = 18000; borg_no_rest_prep = 18000; return (10); } /* long time */ if (borg_prayer_fail(2, 3, fail_allowed)) { borg_see_inv = 30000; borg_no_rest_prep = 16000; return (10); } /* ah crap, I guess I wont be able to see them */ return (0); } /* * Light Beam to spot lurkers * Used only if I am hit by an unseen guy. * Lights up a hallway. */ static int borg_defend_aux_lbeam(void) { bool hallway = FALSE; int x=c_x; int y=c_y; /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* Light Beam section to spot non seen guys */ /* not recent, dont bother */ if (borg_t > (need_see_inviso+2)) return (0); /* Check to see if I am in a hallway */ /* Case 1a: north-south corridor */ if (borg_cave_floor_bold(y-1, x) && borg_cave_floor_bold(y+1, x) && !borg_cave_floor_bold(y, x-1) && !borg_cave_floor_bold(y, x+1) && !borg_cave_floor_bold(y+1, x-1) && !borg_cave_floor_bold(y+1, x+1) && !borg_cave_floor_bold(y-1, x-1) && !borg_cave_floor_bold(y-1, x+1)) { /* ok to light up */ hallway = TRUE; } /* Case 1b: east-west corridor */ if (borg_cave_floor_bold(y, x-1) && borg_cave_floor_bold(y, x+1) && !borg_cave_floor_bold(y-1, x) && !borg_cave_floor_bold(y+1, x) && !borg_cave_floor_bold(y+1, x-1) && !borg_cave_floor_bold(y+1, x+1) && !borg_cave_floor_bold(y-1, x-1) && !borg_cave_floor_bold(y-1, x+1)) { /* ok to light up */ hallway = TRUE; } /* Case 1aa: north-south doorway */ if (borg_cave_floor_bold(y-1, x) && borg_cave_floor_bold(y+1, x) && !borg_cave_floor_bold(y, x-1) && !borg_cave_floor_bold(y, x+1)) { /* ok to light up */ hallway = TRUE; } /* Case 1ba: east-west doorway */ if (borg_cave_floor_bold(y, x-1) && borg_cave_floor_bold(y, x+1) && !borg_cave_floor_bold(y-1, x) && !borg_cave_floor_bold(y+1, x)) { /* ok to light up */ hallway = TRUE; } /* not in a hallway */ if (!hallway) return (0); /* Make sure I am not in too much danger */ /* XXX '(' replaces previous use of global variable that was always * '('. This is a BUG. I however have no idea how to fix it bceause * I don't know the code well enough. -AS */ if (borg_simulate && '(' > avoidance*3/4) return (0); /* test the beam function */ if (!borg_LIGHT_beam(TRUE)) return (0); /* return some value */ if (borg_simulate) return (10); /* if in a hallway call the Light Beam routine */ if (borg_LIGHT_beam(FALSE)) { return (10); } return (0); } /* Shift the panel to locate offscreen monsters */ static int borg_defend_aux_panel_shift(void) { int dir=0; int wx = Term->offset_x / PANEL_WID; int wy = Term->offset_y / PANEL_HGT; /* no need */ if (!need_shift_panel && borg_skill[BI_CDEPTH] < 70) return (0); /* if Morgy is on my panel, dont do it */ if (borg_skill[BI_CDEPTH] == 100 && w_y == morgy_panel_y && w_x == morgy_panel_x) return (0); /* Which direction do we need to move? */ /* Shift panel to the right */ if (c_x >= 52 && c_x <= 60 && wx == 0) dir = 6; if (c_x >= 84 && c_x <= 94 && wx == 1) dir = 6; if (c_x >= 116 && c_x <= 123 && wx == 2) dir = 6; if (c_x >= 148 && c_x <= 159 && wx == 3) dir = 6; /* Shift panel to the left */ if (c_x <= 142 && c_x >= 136 && wx == 4) dir = 4; if (c_x <= 110 && c_x >= 103 && wx == 3) dir = 4; if (c_x <= 78 && c_x >= 70 && wx == 2) dir = 4; if (c_x <= 46 && c_x >= 37 && wx == 1) dir = 4; /* Shift panel down */ if (c_y >= 15 && c_y <= 19 && wy == 0) dir = 2; if (c_y >= 25 && c_y <= 30 && wy == 1) dir = 2; if (c_y >= 36 && c_y <= 41 && wy == 2) dir = 2; if (c_y >= 48 && c_y <= 52 && wy == 3) dir = 2; /* Shift panel up */ if (c_y <= 51 && c_y >= 47 && wy == 4) dir = 8; if (c_y <= 39 && c_y >= 35 && wy == 3) dir = 8; if (c_y <= 28 && c_y >= 24 && wy == 2) dir = 8; if (c_y <= 17 && c_y >= 13 && wy == 1) dir = 8; /* Do the Shift if needed, then note it, reset the flag */ if (need_shift_panel == TRUE) { /* Send action (view panel info) */ borg_keypress('L'); if (dir) borg_keypress(I2D(dir)); borg_keypress(ESCAPE); borg_note("# Shifted panel to locate offscreen monster."); need_shift_panel = FALSE; /* Leave the panel shift mode */ borg_keypress(ESCAPE); } else /* check to make sure its appropriate */ { /* Hack Not if I just did one */ if (when_shift_panel && (borg_t - when_shift_panel <= 10 || borg_t - borg_t_morgoth <= 10)) { /* do nothing */ } else /* shift up? only if a north corridor */ if (dir == 8 && borg_projectable_pure(c_y,c_x, c_y-2, c_x) && track_step_y[track_step_num -1] != c_y - 1) { /* Send action (view panel info) */ borg_keypress('L'); if (dir) borg_keypress(I2D(dir)); borg_note("# Shifted panel as a precaution."); /* Mark the time to avoid loops */ when_shift_panel = borg_t; /* Leave the panel shift mode */ borg_keypress(ESCAPE); } else /* shift down? only if a south corridor */ if (dir == 2 && borg_projectable_pure(c_y,c_x, c_y+2, c_x) && track_step_y[track_step_num -1] != c_y + 1) { /* Send action (view panel info) */ borg_keypress('L'); borg_keypress(I2D(dir)); borg_note("# Shifted panel as a precaution."); /* Mark the time to avoid loops */ when_shift_panel = borg_t; /* Leave the panel shift mode */ borg_keypress(ESCAPE); } else /* shift Left? only if a west corridor */ if (dir == 4 && borg_projectable_pure(c_y,c_x, c_y, c_x-2) && track_step_x[track_step_num -1] != c_x - 1) { /* Send action (view panel info) */ borg_keypress('L'); if (dir) borg_keypress(I2D(dir)); borg_note("# Shifted panel as a precaution."); /* Mark the time to avoid loops */ when_shift_panel = borg_t; /* Leave the panel shift mode */ borg_keypress(ESCAPE); } else /* shift Right? only if a east corridor */ if (dir == 6 && borg_projectable_pure(c_y,c_x, c_y, c_x+2) && track_step_x[track_step_num -1] != c_x + 1) { /* Send action (view panel info) */ borg_keypress('L'); if (dir) borg_keypress(I2D(dir)); borg_note("# Shifted panel as a precaution."); /* Mark the time to avoid loops */ when_shift_panel = borg_t; /* Leave the panel shift mode */ borg_keypress(ESCAPE); } } /* This uses no energy */ return (0); } /* This and the next routine is used on level 100 and when * attacking Morgoth. The borg has found a safe place to wait * for Morgoth to show. * * If the borg is not being threatened immediately by a monster, * then rest right here. * * Only borgs with teleport away and a good attack spell do this * routine. */ static int borg_defend_aux_rest(void) { int i; if (!borg_morgoth_position && (!borg_as_position || borg_t - borg_t_antisummon >= 50)) return (0); /* Not if Morgoth is not on this level */ if (!morgoth_on_level && (!borg_as_position || borg_t - borg_t_antisummon >= 50)) return (0); /* Not if I can not teleport others away */ #if 0 if (!borg_spell_okay_fail(3, 1, 30) && !borg_prayer_okay_fail(4, 2, 30)) return (0); #endif /* Not if a monster can see me */ /* Examine all the monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill = &borg_kills[i]; int x9 = kill->x; int y9 = kill->y; int ax, ay, d; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Distance components */ ax = (x9 > c_x) ? (x9 - c_x) : (c_x - x9); ay = (y9 > c_y) ? (y9 - c_y) : (c_y - y9); /* Distance */ d = MAX(ax, ay); /* Minimal distance */ if (d > MAX_RANGE) continue; /* If I can see Morgoth or a guy with Ranged Attacks, don't rest. */ if (borg_los(c_y, c_x, kill->y, kill->x) && (kill->r_idx == 547 || kill->ranged_attack) && avoidance <= borg_skill[BI_CURHP]) { borg_note("# Not resting. I can see Morgoth or a shooter."); return(0); } /* If a little twitchy, its ok to stay put */ if (avoidance > borg_skill[BI_CURHP]) continue; } /* Return some value for this rest */ if (borg_simulate) return (200); /* Rest */ borg_keypress(','); borg_note(format("# Resting on grid (%d, %d), waiting for Morgoth.",c_y,c_x)); /* All done */ return (200); } /* * Try to get rid of all of the monsters while I build my * Sea of Runes. */ static int borg_defend_aux_tele_away_morgoth(void) { int p2 = 0; int fail_allowed = 40; int i, x, y; borg_grid *ag; /* Only if on level 100 */ if (!borg_skill[BI_CDEPTH] == 100) return (0); /* Not if Morgoth is not on this level */ if (!morgoth_on_level) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* Do I have the T.O. spell? */ if (!borg_spell_okay_fail(3, 1, fail_allowed) && !borg_prayer_okay_fail(4, 2, fail_allowed)) return (0); /* Do I have the Glyph spell? No good to use TO if I cant build the sea of runes */ if (borg_skill[BI_AGLYPH] < 10) return (0); /* No Teleport Other if surrounded */ if (borg_surrounded() == TRUE) return (0); /* Borg_temp_n temporarily stores several things. * Some of the borg_attack() sub-routines use these numbers, * which would have been filled in borg_attack(). * Since this is a defence manuever which will move into * and borrow some of the borg_attack() subroutines, we need * to make sure that the borg_temp_n arrays are properly * filled. Otherwise, the borg will attempt to consider * these grids which were left filled by some other routine. * Which was probably a flow routine which stored about 200 * grids into the array. * Any change in inclusion/exclusion criteria for filling this * array in borg_attack() should be included here also. */ /* Nobody around so dont worry */ if (!borg_kills_cnt && borg_simulate) return (0); /* Reset list */ borg_temp_n = 0; borg_tp_other_n = 0; /* Find "nearby" monsters */ for (i = 0; i < borg_kills_nxt; i++) { borg_kill *kill; /* Monster */ kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Require current knowledge */ if (kill->when < borg_t - 2) continue; /* Acquire location */ x = kill->x; y = kill->y; /* Get grid */ ag = &borg_grids[y][x]; /* Never shoot off-screen */ if (!(ag->info & BORG_OKAY)) continue; /* Never shoot through walls */ if (!(ag->info & BORG_VIEW)) continue; /* Check the distance XXX XXX XXX */ if (distance(c_y, c_x, y, x) > MAX_RANGE) continue; /* Check the LOS */ if (!borg_projectable(c_y, c_x, kill->y, kill->x)) continue; /* Save the location (careful) */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } /* No destinations */ if (!borg_temp_n && borg_simulate) return (0); /* choose then target a bad guy or several * If left as bolt, he targets the single most nasty guy. * If left as beam, he targets the collection of monsters. */ p2 = borg_launch_bolt(-1, 50, GF_AWAY_ALL_MORGOTH, MAX_RANGE, 0); /* Normalize the value a bit */ if (p2 > 1000) p2 = 1000; /* Reset list */ borg_temp_n = 0; borg_tp_other_n = 0; /* Return a good score to make him do it */ if (borg_simulate) return (p2); /* Log the Path for Debug */ borg_log_spellpath(TRUE); /* Log additional info for debug */ for (i = 0; i < borg_tp_other_n; i++) { borg_note(format("# %d, index %d (%d,%d)",borg_tp_other_n, borg_tp_other_index[i], borg_tp_other_y[i], borg_tp_other_x[i])); } borg_note("# Attempting to cast T.O. for depth 100."); /* Cast the spell */ if (borg_spell(3, 1) || borg_prayer(4, 2) || borg_activate_artifact(EF_TELE_OTHER)|| borg_aim_wand(SV_WAND_TELEPORT_AWAY)) { /* Use target */ borg_keypress('5'); /* Set our shooting flag */ successful_target = -1; /* Value */ return (p2); } return (0); } /* * Try to get rid of all of the monsters while I build my * Sea of Runes. */ static int borg_defend_aux_banishment_morgoth(void) { int fail_allowed = 50; int i, x, y; int count = 0; int glyphs = 0; borg_grid *ag; borg_kill *kill; monster_race *r_ptr; /* Not if Morgoth is not on this level */ if (!morgoth_on_level) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* Scan grids looking for glyphs */ for (i = 0; i < 8; i++) { /* Access offset */ x = c_x + ddx_ddd[i]; y = c_y + ddy_ddd[i]; /* Access the grid */ ag = &borg_grids[y][x]; /* Check for Glyphs */ if (ag->feat == FEAT_GLYPH) glyphs ++; } /* Only if on level 100 and in a sea of runes or * in the process of building one */ #if 0 if (!borg_morgoth_position && glyphs < 3) return (0); #endif /* Do I have the spell? (Banish Evil) */ if (!borg_spell_okay_fail(8, 5, fail_allowed) && !borg_prayer_okay_fail(8, 2, fail_allowed)) return (0); /* Nobody around so dont worry */ if (!borg_kills_cnt && borg_simulate) return (0); /* Find "nearby" monsters */ for (i = 1; i < borg_kills_nxt; i++) { /* Monster */ kill = &borg_kills[i]; r_ptr = &r_info[kill->r_idx]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Require current knowledge */ if (kill->when < borg_t - 2) continue; /* Acquire location */ x = kill->x; y = kill->y; /* Get grid */ ag = &borg_grids[y][x]; /* Never try on non-evil guys if Priest */ if (p_ptr->class->spell_book == TV_PRAYER_BOOK && !(rf_has(r_ptr->flags, RF_EVIL))) continue; /* Check the distance */ if (distance(c_y, c_x, y, x) > MAX_RANGE) continue; /* Monster must be LOS */ if (!borg_projectable(c_y, c_x, kill->y, kill->x)) continue; /* Count the number of monsters too close double*/ if (distance(c_y, c_x, y, x) <= 7) count ++; /* Count the number of monster on screen */ count ++; } /* No destinations */ if (count <= 7 && borg_simulate) return (0); /* Return a good score to make him do it */ if (borg_simulate) return (1500); borg_note(format("# Attempting to cast Banishment for depth 100. %d monsters ", count)); /* Cast the spell */ if (borg_spell(8, 5) || borg_prayer(8, 2)) { /* Remove this race from the borg_kill */ for (i = 0; i < borg_kills_nxt; i++) { borg_kill *kill; monster_race *r_ptr; /* Monster */ kill = &borg_kills[i]; r_ptr = &r_info[kill->r_idx]; /* Cant kill uniques like this */ if (rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* remove this monster */ borg_delete_kill(i); } /* Value */ return (1000); } return (0); } /* * Sometimes the borg will not fire on Morgoth as he approaches * while tunneling through rock. The borg still remembers and * assumes that the rock is unknown grid. */ static int borg_defend_aux_light_morgoth(void) { int fail_allowed = 50; int i, x, y; int b_y = -1; int b_x = -1; int count = 0; borg_kill *kill; /* Only if on level 100 and in a sea of runes */ if (!borg_morgoth_position) return (0); /* Not if Morgoth is not on this level */ if (!morgoth_on_level) return (0); /* Cant when screwed */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (0); /* Do I have the spell? */ if (!borg_spell_okay_fail(1, 6, fail_allowed) && !borg_prayer_okay_fail(5, 4, fail_allowed)) return (0); /* Nobody around so dont worry */ if (!borg_kills_cnt && borg_simulate) return (0); /* Find "nearby" monsters */ for (i = 1; i < borg_kills_nxt; i++) { /* Monster */ kill = &borg_kills[i]; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Skip non- Morgoth monsters */ if (kill->r_idx != 547) continue; /* Require current knowledge */ if (kill->when < borg_t - 2) continue; /* Acquire location */ x = kill->x; y = kill->y; /* Check the distance */ if (distance(c_y, c_x, y, x) > MAX_RANGE) continue; if (distance(c_y, c_x, y, x) <= 5) continue; /* We want at least one dark spot on the path */ if (!borg_projectable_dark(c_y, c_x, y, x)) continue; /* Count Morgoth so I try the spell */ count ++; b_y = y; b_x = x; } /* No destinations */ if (count <= 0 && borg_simulate) return (0); /* Return a good score to make him do it */ if (borg_simulate) return (500); borg_note(format("# Attempting to Illuminate a Pathway to (%d, %d)",b_y,b_x)); /* Target Morgoth Grid */ (void)borg_target(b_y,b_x); /* Cast the spell */ if (borg_spell(1, 6) || borg_prayer(5, 4)) { /* Select the target */ borg_keypress('5'); /* Value */ return (200); } return (0); } /* * Simulate/Apply the optimal result of using the given "type" of defence * p1 is the current danger level (passed in for effiency) */ static int borg_defend_aux(int what, int p1) { /* Analyze */ switch (what) { case BD_SPEED: { return (borg_defend_aux_speed(p1)); } case BD_PROT_FROM_EVIL: { return (borg_defend_aux_prot_evil(p1)); } case BD_RESIST_FC: { return (borg_defend_aux_resist_fc(p1)); } case BD_RESIST_FECAP: { return (borg_defend_aux_resist_fecap(p1)); } case BD_RESIST_F: { return (borg_defend_aux_resist_f(p1)); } case BD_RESIST_C: { return (borg_defend_aux_resist_c(p1)); } case BD_RESIST_A: { return (borg_defend_aux_resist_a(p1)); } case BD_RESIST_P: { return (borg_defend_aux_resist_p(p1)); } case BD_BLESS: { return (borg_defend_aux_bless(p1)); } case BD_HERO: { return (borg_defend_aux_hero(p1)); } case BD_BERSERK: { return (borg_defend_aux_berserk(p1)); } case BD_SHIELD: { return (borg_defend_aux_shield(p1)); } case BD_TELE_AWAY: { return (borg_defend_aux_tele_away(p1)); } case BD_GLYPH: { return (borg_defend_aux_glyph(p1)); } case BD_CREATE_DOOR: { return (borg_defend_aux_create_door(p1)); } case BD_MASS_GENOCIDE: { return (borg_defend_aux_mass_genocide(p1)); } case BD_GENOCIDE: { return (borg_defend_aux_genocide(p1)); } case BD_GENOCIDE_NASTIES: { return (borg_defend_aux_genocide_nasties(p1)); } case BD_EARTHQUAKE: { return (borg_defend_aux_earthquake(p1)); } case BD_TPORTLEVEL: { return (borg_defend_aux_teleportlevel(p1)); } case BD_DESTRUCTION: { return (borg_defend_aux_destruction(p1)); } case BD_BANISHMENT: { return (borg_defend_aux_banishment(p1)); } case BD_DETECT_INVISO: { return (borg_defend_aux_inviso(p1)); } case BD_LIGHT_BEAM: { return (borg_defend_aux_lbeam()); } case BD_SHIFT_PANEL: { return (borg_defend_aux_panel_shift()); } case BD_REST: { return (borg_defend_aux_rest()); } case BD_TELE_AWAY_MORGOTH: { return (borg_defend_aux_tele_away_morgoth()); } case BD_BANISHMENT_MORGOTH: { return (borg_defend_aux_banishment_morgoth()); } case BD_LIGHT_MORGOTH: { return (borg_defend_aux_light_morgoth()); } } return (0); } /* * prepare to attack... this is setup for a battle. */ bool borg_defend(int p1) { int n, b_n = 0; int g, b_g = -1; /* Simulate */ borg_simulate = TRUE; /* if you have Resist All and it is about to drop, */ /* refresh it (if you can) */ if (borg_resistance && borg_resistance < (borg_game_ratio *2)) { int p; /* check 'true' danger. This will make sure we do not */ /* refresh our Resistance if no-one is around */ borg_attacking = TRUE; p = borg_danger(c_y,c_x,1, FALSE, FALSE ); /* Note FALSE for danger!! */ borg_attacking = FALSE; if (p > borg_fear_region[c_y/11][c_x/11] || borg_fighting_unique) { if (borg_spell(4, 3)) { borg_note(format("# Refreshing Resistance. borg_resistance=%d, p_ptr->=%d, (ratio=%d)",borg_resistance, p_ptr->timed[TMD_OPP_ACID], borg_game_ratio)); borg_attempting_refresh_resist = TRUE; borg_resistance = 25000; return (TRUE); } } } /* Analyze the possible setup moves */ for (g = 0; g < BD_MAX; g++) { /* Simulate */ n = borg_defend_aux(g, p1); /* Track "best" attack */ if (n <= b_n) continue; /* Track best */ b_g = g; b_n = n; } /* Nothing good */ if (b_n <= 0) { return (FALSE); } /* Note */ borg_note(format("# Performing defence type %d with value %d", b_g, b_n)); /* Instantiate */ borg_simulate = FALSE; /* Instantiate */ (void)borg_defend_aux(b_g, p1); /* Success */ return (TRUE); } /* * Perma spells. Some are cool to have on all the time, so long as their * mana cost is not too much. * There are several types of setup moves: * * Temporary speed * Protect From Evil * Prayer * Temp Resist (either all or just cold/fire?) * Shield * */ enum { BP_SPEED, BP_PROT_FROM_EVIL, BP_BLESS, BP_RESIST_ALL, BP_RESIST_ALL_COLLUIN, BP_RESIST_F, BP_RESIST_C, BP_RESIST_P, BP_RESIST_FC, BP_SHIELD, BP_HERO, BP_BERSERK, BP_BERSERK_POTION, BP_GLYPH, BP_SEE_INV, BP_MAX }; /* * Prayer to prepare for battle */ static int borg_perma_aux_bless(void) { int fail_allowed = 15, cost; borg_magic *as; /* increase the threshold */ if (unique_on_level) fail_allowed = 20; if (borg_fighting_unique) fail_allowed = 25; /* already blessed */ if (borg_bless) return (0); /* Cant when Blind */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED]) return (0); /* XXX Dark */ if ( !borg_prayer_okay_fail(3, 0, fail_allowed)) return (0); /* Obtain the cost of the spell */ as = &borg_magics[3][0]; cost = as->power; /* If its cheap, go ahead */ if (borg_skill[BI_CLEVEL] > 10 && cost >= ((unique_on_level) ? borg_skill[BI_CURSP] / 7 : borg_skill[BI_CURSP] /10)) return (0); /* Simulation */ /* bless is a low priority */ if (borg_simulate) return (1); /* do it! */ borg_prayer(3,0); /* No resting to recoop mana */ borg_no_rest_prep = 10000; return (1); } /* all resists FECAP*/ static int borg_perma_aux_resist(void) { int cost = 0; int fail_allowed = 5; borg_magic *as; /* increase the threshold */ if (unique_on_level) fail_allowed = 10; if (borg_fighting_unique) fail_allowed = 15; if (borg_skill[BI_TRFIRE] + borg_skill[BI_TRACID] + borg_skill[BI_TRPOIS] + borg_skill[BI_TRELEC] + borg_skill[BI_TRCOLD] >= 3) return (0); if (!borg_spell_okay_fail(4, 3, fail_allowed)) return (0); /* Obtain the cost of the spell */ as = &borg_magics[4][3]; cost = as->power; /* If its cheap, go ahead */ if (cost >= ((unique_on_level) ? borg_skill[BI_CURSP] / 7 : borg_skill[BI_CURSP] /10)) return (0); /* Simulation */ if (borg_simulate) return (2); /* do it! */ borg_spell_fail(4, 3, fail_allowed); /* No resting to recoop mana */ borg_no_rest_prep = 3000; /* default to can't do it. */ return (2); } /* all resists from the cloak*/ static int borg_perma_aux_resist_colluin(void) { if (borg_skill[BI_TRFIRE] + borg_skill[BI_TRACID] + borg_skill[BI_TRPOIS] + borg_skill[BI_TRELEC] + borg_skill[BI_TRCOLD] >= 3) return (0); /* Only use it when Unique is close */ if (!borg_fighting_unique) return (0); if (!borg_equips_artifact(EF_RESIST_ALL)) return (0); /* Simulation */ if (borg_simulate) return (2); /* do it! */ borg_activate_artifact(EF_RESIST_ALL); /* No resting to recoop mana */ borg_no_rest_prep = 3000; /* Value */ return (2); } /* resists--- Only bother if a Unique is on the level.*/ static int borg_perma_aux_resist_f(void) { int cost = 0; int fail_allowed = 5; borg_magic *as; /* increase the threshold */ if (unique_on_level) fail_allowed = 10; if (borg_fighting_unique) fail_allowed = 15; if (borg_skill[BI_TRFIRE] || !unique_on_level) return (0); if (borg_skill[BI_IFIRE]) return (0); if (!borg_spell_okay_fail(4, 1, fail_allowed)) return (0); /* Skip it if I can do the big spell */ if (borg_spell_okay_fail(4, 3, fail_allowed)) return (0); /* Obtain the cost of the spell */ as = &borg_magics[4][1]; cost = as->power; /* If its cheap, go ahead */ if (cost >= borg_skill[BI_CURSP] /20) return (0); /* Simulation */ if (borg_simulate) return (1); /* do it! */ if (borg_spell_fail(4, 1, fail_allowed) ) { /* No resting to recoop mana */ borg_no_rest_prep = 3000; /* Value */ return (1); } /* default to can't do it. */ return (0); } /* resists--- Only bother if a Unique is on the level.*/ static int borg_perma_aux_resist_c(void) { int cost = 0; int fail_allowed = 5; borg_magic *as; /* increase the threshold */ if (unique_on_level) fail_allowed = 10; if (borg_fighting_unique) fail_allowed = 15; if (borg_skill[BI_TRCOLD] || !unique_on_level) return (0); if (borg_skill[BI_ICOLD]) return (0); if (!borg_spell_okay_fail(4, 0, fail_allowed)) return (0); /* Skip it if I can do the big spell */ if (borg_spell_okay_fail(4, 3, fail_allowed)) return (0); /* Obtain the cost of the spell */ as = &borg_magics[4][0]; cost = as->power; /* If its cheap, go ahead */ if (cost >= borg_skill[BI_CURSP] /20) return (0); /* Simulation */ if (borg_simulate) return (1); /* do it! */ if (borg_spell_fail(4, 0, fail_allowed) ) { /* No resting to recoop mana */ borg_no_rest_prep = 3000; /* Value */ return (1); } /* default to can't do it. */ return (0); } /* resists--- Only bother if a Unique is on the level.*/ static int borg_perma_aux_resist_p(void) { int cost = 0; int fail_allowed = 5; borg_magic *as; /* increase the threshold */ if (unique_on_level) fail_allowed = 10; if (borg_fighting_unique) fail_allowed = 15; if (borg_skill[BI_TRPOIS] || !unique_on_level) return (0); if (!borg_spell_okay_fail(4, 2, fail_allowed)) return (0); /* Skip it if I can do the big spell */ if (borg_spell_okay_fail(4, 3, fail_allowed)) return (0); /* Obtain the cost of the spell */ as = &borg_magics[4][2]; cost = as->power; /* If its cheap, go ahead */ if (cost >= borg_skill[BI_CURSP] /20) return (0); /* Simulation */ if (borg_simulate) return (1); /* do it! */ if (borg_spell_fail(4, 2, fail_allowed) ) { /* No resting to recoop mana */ borg_no_rest_prep = 3000; /* Value */ return (1); } /* default to can't do it. */ return (0); } /* resist fire and cold for priests */ static int borg_perma_aux_resist_fc(void) { int cost = 0; int fail_allowed = 5; borg_magic *as; /* increase the threshold */ if (unique_on_level) fail_allowed = 10; if (borg_fighting_unique) fail_allowed = 15; /* cast if one drops and unique is near */ if (borg_fighting_unique && ((borg_skill[BI_TRFIRE] || borg_skill[BI_IFIRE]) && (borg_skill[BI_TRCOLD] || borg_skill[BI_ICOLD]))) return (0); /* cast if both drop and no unique is near */ if (!borg_fighting_unique && (borg_skill[BI_TRFIRE] || borg_skill[BI_TRCOLD])) return (0); /* no need if immune */ if (borg_skill[BI_IFIRE] && borg_skill[BI_ICOLD]) return (0); if (!borg_prayer_okay_fail(1, 7, fail_allowed)) return (0); /* Obtain the cost of the spell */ as = &borg_magics[1][7]; cost = as->power; /* If its cheap, go ahead */ if (cost >= ((unique_on_level) ? borg_skill[BI_CURSP] / 7 : borg_skill[BI_CURSP] /10)) return (0); /* Simulation */ if (borg_simulate) return (2); /* do it! */ if (borg_prayer_fail(1, 7, fail_allowed) ) { /* No resting to recoop mana */ borg_no_rest_prep = 3000; /* Value */ return (2); } /* default to can't do it. */ return (0); } /* * Speed to prepare for battle */ static int borg_perma_aux_speed(void) { int fail_allowed = 7; int cost; borg_magic *as; /* increase the threshold */ if (unique_on_level) fail_allowed = 10; if (borg_fighting_unique) fail_allowed = 15; /* already fast */ if (borg_speed) return (0); /* only cast defence spells if fail rate is not too high */ if (!borg_spell_okay_fail( 3, 2, fail_allowed)) return (0); /* Obtain the cost of the spell */ as = &borg_magics[3][2]; cost = as->power; /* If its cheap, go ahead */ if (cost >= ((unique_on_level) ? borg_skill[BI_CURSP] / 7 : borg_skill[BI_CURSP] /10)) return (0); /* Simulation */ if (borg_simulate) return (5); /* do it! */ if (borg_spell_fail( 3, 2, fail_allowed)) { /* No resting to recoop mana */ borg_no_rest_prep = 3000; return (5); } /* default to can't do it. */ return (0); } static int borg_perma_aux_shield(void) { int fail_allowed = 5; int cost; borg_magic *as; /* increase the threshold */ if (unique_on_level) fail_allowed = 10; if (borg_fighting_unique) fail_allowed = 15; /* if already protected */ if (borg_shield) return (0); if (!borg_spell_okay_fail(4, 4, fail_allowed)) return (0); /* Obtain the cost of the spell */ as = &borg_magics[4][4]; cost = as->power; /* If its cheap, go ahead */ if (cost >= ((unique_on_level) ? borg_skill[BI_CURSP] / 7 : borg_skill[BI_CURSP] /10)) return (0); /* Simulation */ if (borg_simulate) return (2); /* do it! */ if (borg_spell_fail(4, 4, fail_allowed)) { /* No resting to recoop mana */ borg_no_rest_prep = 3000; return (2); } /* default to can't do it. */ return (0); } static int borg_perma_aux_prot_evil(void) { int cost = 0; int fail_allowed = 5; borg_magic *as; /* if already protected */ if (borg_prot_from_evil) return (0); /* increase the threshold */ if (unique_on_level) fail_allowed = 10; if (borg_fighting_unique) fail_allowed = 15; if (!borg_prayer_okay_fail(2,4,fail_allowed)) return (0); /* Obtain the cost of the spell */ as = &borg_magics[2][4]; cost = as->power; /* If its cheap, go ahead */ if (cost >= ((unique_on_level) ? borg_skill[BI_CURSP] / 7 : borg_skill[BI_CURSP] /10)) return (0); /* Simulation */ if (borg_simulate) return (3); /* do it! */ if (borg_prayer_fail(2, 4, fail_allowed)) { /* No resting to recoop mana */ borg_no_rest_prep = 3000; /* Value */ return (3); } /* default to can't do it. */ return (0); } /* * Hero to prepare for battle */ static int borg_perma_aux_hero(void) { int fail_allowed = 5, cost; borg_magic *as; /* increase the threshold */ if (unique_on_level) fail_allowed = 10; if (borg_fighting_unique) fail_allowed = 15; /* already blessed */ if (borg_hero) return (0); /* Cant when Blind */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED]) return (0); /* XXX Dark */ if ( !borg_spell_okay_fail(7, 0, fail_allowed)) return (0); /* Obtain the cost of the spell */ as = &borg_magics[7][0]; cost = as->power; /* If its cheap, go ahead */ if (cost >= ((unique_on_level) ? borg_skill[BI_CURSP] / 7 : borg_skill[BI_CURSP] /10)) return (0); /* Simulation */ /* hero is a low priority */ if (borg_simulate) return (1); /* do it! */ if (borg_spell(7,0)) { /* No resting to recoop mana */ borg_no_rest_prep = 3000; return 1; } return (0); } /* * Berserk to prepare for battle */ static int borg_perma_aux_berserk(void) { int fail_allowed = 5, cost; borg_magic *as; /* increase the threshold */ if (unique_on_level) fail_allowed = 10; if (borg_fighting_unique) fail_allowed = 15; /* already blessed */ if (borg_berserk) return (0); /* Cant when Blind */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED]) return (0); /* XXX Dark */ if ( !borg_spell_okay_fail(7, 1, fail_allowed)) return (0); /* Obtain the cost of the spell */ as = &borg_magics[7][1]; cost = as->power; /* If its cheap, go ahead */ if (cost >= ((unique_on_level) ? borg_skill[BI_CURSP] / 7 : borg_skill[BI_CURSP] /10)) return (0); /* Simulation */ /* Berserk is a low priority */ if (borg_simulate) return (2); /* do it! */ if (borg_spell(7,1)) { /* No resting to recoop mana */ borg_no_rest_prep = 3000; return 2; } return (0); } /* * Berserk to prepare for battle */ static int borg_perma_aux_berserk_potion(void) { /* Saver the potions */ if (!borg_fighting_unique) return (0); /* already blessed */ if (borg_hero || borg_berserk) return (0); /* do I have any? */ if (-1 == borg_slot(TV_POTION,SV_POTION_BERSERK_STRENGTH)) return (0); /* Simulation */ /* Berserk is a low priority */ if (borg_simulate) return (2); /* do it! */ if (borg_quaff_potion(SV_POTION_BERSERK_STRENGTH)) return (2); return (0); } #ifdef UNUSED /* Glyph of Warding in a a-s corridor */ static int borg_perma_aux_glyph(void) { int i, wall_y, wall_x, wall_count = 0, y,x; int fail_allowed = 20; borg_grid *ag = &borg_grids[c_y][c_x]; /* check to make sure a summoner is near */ if (borg_kills_summoner == -1) return (0); /* make sure I have the spell */ if (!borg_prayer_okay_fail(3,4,fail_allowed) && !borg_spell_okay_fail(6,4,fail_allowed)) return (0); /* He should not cast it while on an object. * I have addressed this inadequately in borg9.c when dealing with * messages. The message "the object resists" will delete the glyph * from the array. Then I set a broken door on that spot, the borg ignores * broken doors, so he won't loop. */ if ( (ag->take) || (ag->feat == FEAT_GLYPH) || ((ag->feat >= FEAT_TRAP_HEAD) && (ag->feat <= FEAT_TRAP_TAIL)) || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_DOOR_TAIL)) || (ag->feat == FEAT_LESS) || (ag->feat == FEAT_MORE) || (ag->feat == FEAT_OPEN) || (ag->feat == FEAT_BROKEN) ) { return (0); } /* Check for an existing glyph that is not found in the auto_grid */ for (i = 0; i < track_glyph_num; i++) { /* Stop if we are on a glyph */ if ((track_glyph_x[i] == c_x) && (track_glyph_y[i] == c_y)) return (0); } /* This spell is cast while he is digging and AS Corridor */ /* Get grid */ for (wall_x = -1; wall_x <= 1; wall_x++) { for (wall_y = -1; wall_y <= 1; wall_y++) { /* Acquire location */ x = wall_x + c_x; y = wall_y + c_y; ag = &borg_grids[y][x]; /* track adjacent walls */ if ( (ag->feat == FEAT_GLYPH) || ((ag->feat >= FEAT_MAGMA) && (ag->feat <= FEAT_WALL_SOLID))) { wall_count++; } } } /* must be in a corridor */ if (wall_count < 6) return (0); /* Simulation */ if (borg_simulate) return (10); /* do it! */ if (borg_prayer_fail(3, 4, fail_allowed) || borg_spell_fail(6, 4, fail_allowed) || borg_read_scroll(SV_SCROLL_RUNE_OF_PROTECTION)) { /* Check for an existing glyph */ for (i = 0; i < track_glyph_num; i++) { /* Stop if we already new about this glyph */ if ((track_glyph_x[i] == c_x) && (track_glyph_y[i] == c_y)) return (p1-p2); } /* Track the newly discovered glyph */ if (track_glyph_num < track_glyph_size) { borg_note("# Noting the creation of a corridor glyph."); track_glyph_x[track_glyph_num] = c_x; track_glyph_y[track_glyph_num] = c_y; track_glyph_num++; } return (p1-p2); } /* default to can't do it. */ return (0); } #endif /* * Detect Inviso/Monsters * Casts detect invis. */ static int borg_perma_aux_see_inv(void) { int fail_allowed = 25; borg_grid *ag = &borg_grids[c_y][c_x]; /* no need */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_SINV] || borg_see_inv) return (0); /* Do I have anything that will work? */ if (!borg_prayer_okay_fail(2, 3, fail_allowed) /* && !borg_spell_okay_fail(2, 6, fail_allowed) */) return (0); /* Darkness */ if (!(ag->info & BORG_GLOW) && !borg_skill[BI_CURLITE]) return (0); /* No real value known, but lets cast it to find the bad guys. */ if (borg_simulate) return (10); /* long time */ if (borg_prayer_fail(2, 3, fail_allowed) /* || borg_spell_fail(2, 6, fail_allowed) */) { borg_see_inv = 32000; borg_no_rest_prep = 16000; return (10); } /* ah crap, I guess I wont be able to see them */ return (0); } /* * Simulate/Apply the optimal result of using the given "type" of set-up */ static int borg_perma_aux(int what) { /* Analyze */ switch (what) { case BP_SPEED: { return (borg_perma_aux_speed()); } case BP_PROT_FROM_EVIL: { return (borg_perma_aux_prot_evil()); } case BP_RESIST_ALL: { return (borg_perma_aux_resist()); } case BP_RESIST_ALL_COLLUIN: { return (borg_perma_aux_resist_colluin()); } case BP_RESIST_F: { return (borg_perma_aux_resist_f()); } case BP_RESIST_C: { return (borg_perma_aux_resist_c()); } case BP_RESIST_P: { return (borg_perma_aux_resist_p()); } case BP_RESIST_FC: { return (borg_perma_aux_resist_fc()); } case BP_BLESS: { return (borg_perma_aux_bless()); } case BP_HERO: { return (borg_perma_aux_hero()); } case BP_BERSERK: { return (borg_perma_aux_berserk()); } case BP_BERSERK_POTION: { return (borg_perma_aux_berserk_potion()); } case BP_SHIELD: { return (borg_perma_aux_shield()); } case BP_GLYPH: { /* return (borg_perma_aux_glyph()); Tends to use too much mana doing this */ return (0); } case BP_SEE_INV: { return (borg_perma_aux_see_inv()); } } return (0); } /* * Walk around with certain spells on if you can afford to do so. */ bool borg_perma_spell() { int n, b_n = 0; int g, b_g = -1; /* Simulate */ borg_simulate = TRUE; /* Not in town */ if (!borg_skill[BI_CDEPTH]) return (FALSE); /* Not in shallow dungeon */ if (borg_skill[BI_CDEPTH] < borg_skill[BI_CLEVEL]/3 || borg_skill[BI_CDEPTH] < 7) return (FALSE); /* Low Level, save your mana, use the Defence maneuvers above */ if (borg_skill[BI_CLEVEL] <= 10) return (FALSE); /* Only when lots of mana is on hand */ if (borg_skill[BI_CURSP] < borg_skill[BI_MAXSP] * 75/100) return (FALSE); /* Analyze the possible setup moves */ for (g = 0; g < BP_MAX; g++) { /* Simulate */ n = borg_perma_aux(g); /* Track "best" move */ if (n <= b_n) continue; /* Track best */ b_g = g; b_n = n; } /* Nothing good */ if (b_n <= 0) { return (FALSE); } /* Note */ borg_note(format("# Performing perma-spell type %d with value %d", b_g, b_n)); /* Instantiate */ borg_simulate = FALSE; /* Instantiate */ (void)borg_perma_aux(b_g); /* Success */ return (TRUE); } /* * check to make sure there are no monsters around * that should prevent resting */ bool borg_check_rest(int y, int x) { int i,ii; bool borg_in_vault = FALSE; /* Do not rest recently after killing a multiplier */ /* This will avoid the problem of resting next to */ /* an unkown area full of breeders */ if (when_last_kill_mult > (borg_t-4) && when_last_kill_mult <= borg_t) return (FALSE); /* No resting if Blessed and good HP and good SP */ if ((borg_bless || borg_hero || borg_berserk) && !borg_munchkin_mode && (borg_skill[BI_CURHP] >= borg_skill[BI_MAXHP] * 8/10) && borg_skill[BI_CURSP] >= borg_skill[BI_MAXSP] * 7/10) return (FALSE); /* Set this to Zero */ when_last_kill_mult = 0; /* Most of the time, its ok to rest in a vault */ if (vault_on_level) { for (i=-1; i < 1; i++) { for (ii=-1; ii < 1; ii++) { /* check bounds */ if (!cave_in_bounds_fully(cave, c_y+i,c_x+ii)) continue; if (borg_grids[c_y+i][c_x+ii].feat ==FEAT_PERM_INNER) borg_in_vault = TRUE; } } } /* No resting to recover if I just cast a prepatory spell * which is what I like to do right before I take a stair, * Unless I am down by half my SP. */ if (borg_no_rest_prep >= 1 && !borg_munchkin_mode && borg_skill[BI_CURSP] > borg_skill[BI_MAXSP] /2 && borg_skill[BI_CDEPTH] < 85) return (FALSE); /* Dont worry about fears if in a vault */ if (!borg_in_vault) { /* Be concerned about the Regional Fear. */ if (borg_fear_region[y/11][x/11] > borg_skill[BI_CURHP] / 20 && borg_skill[BI_CDEPTH] != 100) return (FALSE); /* Be concerned about the Monster Fear. */ if (borg_fear_monsters[y][x] > borg_skill[BI_CURHP] / 10 && borg_skill[BI_CDEPTH] != 100) return (FALSE); /* Be concerned about the Monster Danger. */ if (borg_danger(y, x, 1, TRUE, FALSE) > borg_skill[BI_CURHP] / 40 && borg_skill[BI_CDEPTH] >= 85) return (FALSE); /* Be concerned if low on food */ if ((borg_skill[BI_CURLITE] == 0 || borg_skill[BI_ISWEAK] || borg_skill[BI_FOOD] < 2) && !borg_munchkin_mode) return (FALSE); } /* Examine all the monsters */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill = &borg_kills[i]; monster_race *r_ptr = &r_info[kill->r_idx]; int x9 = kill->x; int y9 = kill->y; int ax, ay, d; int p = 0; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Distance components */ ax = (x9 > x) ? (x9 - x) : (x - x9); ay = (y9 > y) ? (y9 - y) : (y - y9); /* Distance */ d = MAX(ax, ay); /* Minimal distance */ if (d > MAX_RANGE) continue; /* if too close to a Mold or other Never-Mover, don't rest */ if (d < 2 && !(rf_has(r_ptr->flags, RF_NEVER_MOVE))) return (FALSE); if (d == 1) return (FALSE); /* if too close to a Multiplier, don't rest */ if (d < 10 && (rf_has(r_ptr->flags, RF_MULTIPLY))) return (FALSE); /* If monster is asleep, dont worry */ if (!kill->awake && d > 8 && !borg_munchkin_mode) continue; /* one call for dangers */ p = borg_danger_aux(y9, x9, 1, i, TRUE, TRUE); /* Ignore proximity checks while inside a vault */ if (!borg_in_vault) { /* Real scary guys pretty close */ if (d < 5 && (p > avoidance/3) && !borg_munchkin_mode) return (FALSE); /* scary guys far away */ /*if (d < 17 && d > 5 && (p > avoidance/3)) return (FALSE); */ } /* should check LOS... monster to me concerned for Ranged Attacks */ if (borg_los(y9,x9, y, x) && kill->ranged_attack ) return FALSE; /* Special handling for the munchkin mode */ if (borg_munchkin_mode && borg_los(y9, x9, y, x) && (kill->awake && !(rf_has(r_ptr->flags, RF_NEVER_MOVE)))) return FALSE; /* if it walks through walls, not safe */ if ((rf_has(r_ptr->flags, RF_PASS_WALL)) && !borg_in_vault) return FALSE; if (rf_has(r_ptr->flags, RF_KILL_WALL) && !borg_in_vault) return FALSE; } return TRUE; } /* * Attempt to recover from damage and such after a battle * * Note that resting while in danger is counter-productive, unless * the danger is low, in which case it may induce "farming". * * Note that resting while recall is active will often cause you * to lose hard-won treasure from nasty monsters, so we disable * resting when waiting for recall in the dungeon near objects. * * First we try spells/prayers, which are "free", and then we * try food, potions, scrolls, staffs, rods, artifacts, etc. * * XXX XXX XXX * Currently, we use healing spells as if they were "free", but really, * this is only true if the "danger" is less than the "reward" of doing * the healing spell, and if there are no monsters which might soon step * around the corner and attack. */ bool borg_recover(void) { int p = 0; int q; enum borg_need need; /*** Handle annoying situations ***/ need = borg_maintain_light(); if (need == BORG_MET_NEED) return TRUE; else if (need == BORG_UNMET_NEED) borg_note(format("# Need to refuel but cant!", p)); /*** Do not recover when in danger ***/ /* Look around for danger */ p = borg_danger(c_y, c_x, 1, TRUE, FALSE); /* Never recover in dangerous situations */ if (p > avoidance / 4) return (FALSE); /*** Roll for "paranoia" ***/ /* Base roll */ q = randint0(100); /* Half dead */ if (borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 2) q = q - 10; /* Almost dead */ if (borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 4) q = q - 10; /*** Use "cheap" cures ***/ /* Hack -- cure stun */ if (borg_skill[BI_ISSTUN] && (q < 75)) { if (borg_activate_artifact(EF_CURE_BODY) || borg_prayer(2, 7) || borg_prayer(3, 2) || borg_prayer(6, 1) || borg_prayer(6, 2)) { /* Take note */ borg_note(format("# Cure Stun", p)); return (TRUE); } } /* Hack -- cure stun */ if (borg_skill[BI_ISHEAVYSTUN]) { if (borg_eat_food(SV_FOOD_FAST_RECOVERY) || borg_activate_artifact(EF_CURE_BODY) || borg_prayer(2, 7) || borg_prayer(3, 2) || borg_prayer(6, 1) || borg_prayer(6, 2)) { /* Take note */ borg_note(format("# Cure Heavy Stun", p)); return (TRUE); } } /* Hack -- cure cuts */ if (borg_skill[BI_ISCUT] && (q < 75)) { if (borg_activate_artifact(EF_CURE_LIGHT) || borg_prayer(2, 2) || borg_prayer(2, 7) || borg_prayer(3, 2) || borg_prayer(6, 0) || borg_prayer(6, 1) || borg_prayer(6, 2)) { /* Take note */ borg_note(format("# Cure Cuts", p)); return (TRUE); } } /* Hack -- cure poison */ if (borg_skill[BI_ISPOISONED] && (q < 75)) { if (borg_eat_food(SV_FOOD_FAST_RECOVERY) || borg_activate_artifact(EF_REM_FEAR_POIS) || borg_spell(1, 3) || borg_prayer(2, 0)) { /* Take note */ borg_note(format("# Cure poison", p)); return (TRUE); } } /* Hack -- cure fear */ if (borg_skill[BI_ISAFRAID] && !borg_skill[BI_CRSFEAR] && (q < 75)) { if (borg_eat_food(SV_FOOD_CURE_MIND) || borg_activate_artifact(EF_REM_FEAR_POIS) || borg_spell(7, 1) || borg_spell(7, 0) || borg_prayer(0, 3)) { /* Take note */ borg_note(format("# Cure fear", p)); return (TRUE); } } /* Hack -- satisfy hunger */ if ((borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK]) && (q < 75)) { if (borg_spell(2, 0) || borg_prayer(1, 5)) { return (TRUE); } } /* Hack -- hallucination */ if (borg_skill[BI_ISIMAGE] && (q < 75)) { if (borg_eat_food(SV_FOOD_CURE_MIND)) { return (TRUE); } } /* Hack -- heal damage */ if ((borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 2) && (q < 75) && p == 0 && (borg_skill[BI_CURSP] > borg_skill[BI_MAXSP] /4)) { if (borg_activate_artifact(EF_HEAL1) || borg_prayer(3, 2) || borg_prayer(6, 2) || borg_prayer(2, 7) || borg_prayer(6, 1) ) { /* Take note */ borg_note(format("# heal damage (recovering)")); return (TRUE); } } /* cure experience loss with prayer */ if (borg_skill[BI_ISFIXEXP] && (borg_activate_artifact(EF_RESTORE_LIFE) || borg_prayer(6, 4)) ) { return (TRUE); } /* cure stat drain with prayer */ if ((borg_skill[BI_ISFIXSTR] || borg_skill[BI_ISFIXINT] || borg_skill[BI_ISFIXWIS] || borg_skill[BI_ISFIXDEX] || borg_skill[BI_ISFIXCON] || borg_skill[BI_ISFIXALL]) && borg_prayer(6, 3)) { return (TRUE); } /*** Use "expensive" cures ***/ /* Hack -- cure stun */ if (borg_skill[BI_ISSTUN] && (q < 25)) { if (borg_use_staff_fail(SV_STAFF_CURING) || borg_zap_rod(SV_ROD_CURING) || borg_zap_rod(SV_ROD_HEALING) || borg_activate_artifact(EF_HEAL1) || borg_activate_artifact(EF_HEAL2) || borg_quaff_crit(FALSE)) { return (TRUE); } } /* Hack -- cure heavy stun */ if (borg_skill[BI_ISHEAVYSTUN] && (q < 95)) { if (borg_quaff_crit(TRUE) || borg_use_staff_fail(SV_STAFF_CURING) || borg_zap_rod(SV_ROD_CURING) || borg_zap_rod(SV_ROD_HEALING) || borg_activate_artifact(EF_HEAL1) || borg_activate_artifact(EF_HEAL2)) { return (TRUE); } } /* Hack -- cure cuts */ if (borg_skill[BI_ISCUT] && (q < 25)) { if (borg_use_staff_fail(SV_STAFF_CURING) || borg_zap_rod(SV_ROD_CURING) || borg_zap_rod(SV_ROD_HEALING) || borg_activate_artifact(EF_HEAL1) || borg_activate_artifact(EF_HEAL2) || borg_quaff_crit(borg_skill[BI_CURHP] < 10)) { return (TRUE); } } /* Hack -- cure poison */ if (borg_skill[BI_ISPOISONED] && (q < 25)) { if (borg_eat_food(SV_FOOD_FAST_RECOVERY) || borg_quaff_potion(SV_POTION_CURE_POISON) || borg_eat_food(SV_FOOD_WAYBREAD) || borg_eat_food(SV_FOOD_FAST_RECOVERY) || borg_quaff_crit(borg_skill[BI_CURHP] < 10) || borg_use_staff_fail(SV_STAFF_CURING) || borg_zap_rod(SV_ROD_CURING) || borg_activate_artifact(EF_REM_FEAR_POIS)) { return (TRUE); } } /* Hack -- cure blindness */ if (borg_skill[BI_ISBLIND] && (q < 25)) { if (borg_eat_food(SV_FOOD_FAST_RECOVERY) || borg_eat_food(SV_FOOD_FAST_RECOVERY) || borg_quaff_potion(SV_POTION_CURE_LIGHT) || borg_quaff_potion(SV_POTION_CURE_SERIOUS) || borg_quaff_crit(FALSE) || borg_use_staff_fail(SV_STAFF_CURING) || borg_zap_rod(SV_ROD_CURING)) { return (TRUE); } } /* Hack -- cure confusion */ if (borg_skill[BI_ISCONFUSED] && (q < 25)) { if (borg_eat_food(SV_FOOD_CURE_MIND) || borg_quaff_potion(SV_POTION_CURE_SERIOUS) || borg_quaff_crit(FALSE) || borg_use_staff_fail(SV_STAFF_CURING) || borg_zap_rod(SV_ROD_CURING)) { return (TRUE); } } /* Hack -- cure fear */ if (borg_skill[BI_ISAFRAID] && !borg_skill[BI_CRSFEAR] && (q < 25)) { if (borg_eat_food(SV_FOOD_CURE_MIND) || borg_quaff_potion(SV_POTION_BOLDNESS) || borg_quaff_potion(SV_POTION_HEROISM) || borg_quaff_potion(SV_POTION_BERSERK_STRENGTH) || borg_activate_artifact(EF_REM_FEAR_POIS)) { return (TRUE); } } /* Hack -- satisfy hunger */ if ((borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK]) && (q < 25)) { if (borg_read_scroll(SV_SCROLL_SATISFY_HUNGER)) { return (TRUE); } } /* Hack -- heal damage */ if ((borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] / 2) && (q < 25)) { if (borg_zap_rod(SV_ROD_HEALING) || borg_quaff_potion(SV_POTION_CURE_SERIOUS) || borg_quaff_crit(FALSE) || borg_activate_artifact(EF_CURE_SERIOUS)) { return (TRUE); } } /* Hack -- Rest to recharge Rods of Healing or Recall*/ if (borg_has[ROD_RECALL] || borg_has[ROD_HEAL]) { /* Step 1. Recharge just 1 rod. */ if ((borg_has[ROD_HEAL] && !borg_items[borg_slot(TV_ROD, SV_ROD_HEALING)].pval) || (borg_has[ROD_RECALL] && !borg_items[borg_slot(TV_ROD, SV_ROD_RECALL)].pval)) { /* Mages can cast the recharge spell */ /* Rest until at least one recharges */ if (!borg_skill[BI_ISWEAK] && !borg_skill[BI_ISCUT] && !borg_skill[BI_ISHUNGRY] && !borg_skill[BI_ISPOISONED] && borg_check_rest(c_y, c_x) && !borg_spell_okay(7,4)) { /* Take note */ borg_note("# Resting to recharge a rod..."); /* Reset the Bouncing-borg Timer */ time_this_panel =0; /* Rest until done */ borg_keypress('R'); borg_keypress('1'); borg_keypress('0'); borg_keypress('0'); borg_keypress(KC_ENTER); /* I'm not in a store */ borg_in_shop = FALSE; /* Done */ return (TRUE); } } } /*** Just Rest ***/ /* Hack -- rest until healed */ if (!borg_skill[BI_ISBLIND] && !borg_skill[BI_ISPOISONED] && !borg_skill[BI_ISCUT] && !borg_skill[BI_ISWEAK] && !borg_skill[BI_ISHUNGRY] && (borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE] || borg_skill[BI_ISAFRAID] || borg_skill[BI_ISSTUN] || borg_skill[BI_ISHEAVYSTUN] || borg_skill[BI_CURHP] < borg_skill[BI_MAXHP] || borg_skill[BI_CURSP] < borg_skill[BI_MAXSP] * (borg_skill[BI_CDEPTH] > 85 ? 7 : 6) / 10)) { if (borg_check_rest(c_y, c_x) && !scaryguy_on_level && p <= borg_fear_region[c_y/11][c_x/11] && goal != GOAL_RECOVER) { /* check for then call lite in dark room before resting */ if (!borg_check_LIGHT_only()) { /* Take note */ borg_note(format("# Resting to recover HP/SP...")); /* Rest until done */ borg_keypress('R'); borg_keypress('&'); borg_keypress(KC_ENTER); /* Reset our panel clock, we need to be here */ time_this_panel =0; /* reset the inviso clock to avoid loops */ need_see_inviso = borg_t - 50; /* Done */ return (TRUE); } else { /* Must have been a dark room */ borg_note(format("# Lighted the darkened room instead of resting.")); return (TRUE); } } } /* Hack to recharge mana if a low level mage or priest */ if (borg_skill[BI_MAXSP] && (borg_skill[BI_CLEVEL] <= 40 || borg_skill[BI_CDEPTH] >= 85) && borg_skill[BI_CURSP] < (borg_skill[BI_MAXSP] * 8 / 10) && p < avoidance * 1 / 10 && borg_check_rest(c_y, c_x)) { if (!borg_skill[BI_ISWEAK] && !borg_skill[BI_ISCUT] && !borg_skill[BI_ISHUNGRY] && !borg_skill[BI_ISPOISONED] && borg_skill[BI_FOOD] > 2 && !borg_munchkin_mode) { /* Take note */ borg_note(format("# Resting to gain Mana. (danger %d)...", p)); /* Rest until done */ borg_keypress('R'); borg_keypress('*'); borg_keypress(KC_ENTER); /* I'm not in a store */ borg_in_shop = FALSE; /* Done */ return (TRUE); } } /* Hack to recharge mana if a low level mage in munchkin mode */ if (borg_skill[BI_MAXSP] && borg_munchkin_mode == TRUE && (borg_skill[BI_CURSP] < borg_skill[BI_MAXSP] || borg_skill[BI_CURHP] < borg_skill[BI_MAXHP]) && borg_check_rest(c_y, c_x)) { if (!borg_skill[BI_ISWEAK] && !borg_skill[BI_ISCUT] && !borg_skill[BI_ISHUNGRY] && !borg_skill[BI_ISPOISONED] && borg_skill[BI_FOOD] > 2 && (borg_grids[c_y][c_x].feat == FEAT_MORE || borg_grids[c_y][c_x].feat == FEAT_MORE)) { /* Take note */ borg_note(format("# Resting to gain munchkin HP/mana. (danger %d)...", p)); /* Rest until done */ borg_keypress('R'); borg_keypress('*'); borg_keypress(KC_ENTER); /* I'm not in a store */ borg_in_shop = FALSE; /* Done */ return (TRUE); } } /* Hack to heal blindness if in munchkin mode */ if (borg_skill[BI_ISBLIND] && borg_munchkin_mode == TRUE) { /* Take note */ borg_note("# Resting to cure problem. (danger %d)..."); /* Rest until done */ borg_keypress('R'); borg_keypress('*'); borg_keypress(KC_ENTER); /* I'm not in a store */ borg_in_shop = FALSE; /* Done */ return (TRUE); } /* Nope */ return (FALSE); } /* * Take one "step" towards the given location, return TRUE if possible */ static bool borg_play_step(int y2, int x2) { borg_grid *ag; borg_grid *ag2; ui_event ch_evt = EVENT_EMPTY; int dir, x, y, ox, oy, i; int o_y=0, o_x=0, door_found = 0; /* Breeder levels, close all doors */ if (breeder_level) { /* scan the adjacent grids */ for (ox = -1; ox <= 1; ox++) { for (oy = -1; oy <= 1; oy++) { /* skip our own spot */ if ((oy+c_y == c_y) && (ox+c_x == c_x)) continue; /* skip our orignal goal */ if ((oy+c_y == y2) && (ox+c_x == x2)) continue; /* Acquire location */ ag = &borg_grids[oy+c_y][ox+c_x]; /* skip non open doors */ if (ag->feat != FEAT_OPEN) continue; /* skip monster on door */ if (ag->kill) continue; /* Skip repeatedly closed doors */ if (track_door_num >= 255) continue; /* save this spot */ o_y = oy; o_x = ox; door_found = 1; } } /* Is there a door to close? */ if (door_found) { /* Get a direction, if possible */ dir = borg_goto_dir(c_y, c_x, c_y+o_y, c_x+o_x); /* Obtain the destination */ x = c_x + ddx[dir]; y = c_y + ddy[dir]; /* Hack -- set goal */ g_x = x; g_y = y; /* Close */ borg_note("# Closing a door"); borg_keypress('c'); borg_keypress(I2D(dir)); /* Check for an existing flag */ for (i = 0; i < track_door_num; i++) { /* Stop if we already new about this door */ if ((track_door_x[i] == x) && (track_door_y[i] == y)) return (TRUE); } /* Track the newly closed door */ if (i == track_door_num && i < track_door_size) { borg_note("# Noting the closing of a door."); track_door_num++; track_door_x[i] = x; track_door_y[i] = y; } return (TRUE); } } /* Stand stairs up */ if (goal_less) { /* Define the grid we are looking at to be our own grid */ ag = &borg_grids[c_y][c_x]; /* Up stairs. Cheat the game grid info in. (cave_feat[c_y][c_x] == FEAT_LESS) */ if (ag->feat == FEAT_LESS) { /* Stand on stairs */ borg_on_dnstairs = TRUE; goal_less = FALSE; borg_keypress('<'); /* Success */ return (TRUE); } } /* Get a direction, if possible */ dir = borg_goto_dir(c_y, c_x, y2, x2); /* We have arrived */ if (dir == 5) return (FALSE); /* Obtain the destination */ x = c_x + ddx[dir]; y = c_y + ddy[dir]; /* Access the grid we are stepping on */ ag = &borg_grids[y][x]; /* Hack -- set goal */ g_x = x; g_y = y; /* Monsters -- Attack */ if (ag->kill) { borg_kill *kill = &borg_kills[ag->kill]; /* can't attack someone if afraid! */ if (borg_skill[BI_ISAFRAID] || borg_skill[BI_CRSFEAR] ) return (FALSE); /* Hack -- ignore Maggot until later. */ if ((rf_has(r_info[kill->r_idx].flags, RF_UNIQUE)) && borg_skill[BI_CDEPTH] ==0 && borg_skill[BI_CLEVEL] < 5) return (FALSE); /* Message */ borg_note(format("# Walking into a '%s' at (%d,%d)", r_info[kill->r_idx].name, kill->y, kill->x)); /* Walk into it */ if (my_no_alter) { borg_keypress(';'); my_no_alter = FALSE; } else { borg_keypress('+'); } borg_keypress(I2D(dir)); return (TRUE); } /* Objects -- Take */ if (ag->take && borg_takes[ag->take].kind) { borg_take *take = &borg_takes[ag->take]; /*** Handle Chests ***/ /* The borg will cheat when it comes to chests. * He does not have to but it makes him faster and * it does not give him any information that a * person would not know by looking at the trap. * So there is no advantage to the borg. */ if (strstr(take->kind->name, "chest") && !strstr(take->kind->name, "Ruined")) { object_type *o_ptr = object_byid(cave->o_idx[y2][x2]); /* Unknown, Search it */ if (!object_is_known(o_ptr) && chest_trap_type(o_ptr)) { borg_note(format("# Searching a '%s' at (%d,%d)", take->kind->name, take->y, take->x)); /* Walk onto it */ borg_keypress('0'); borg_keypress('5'); borg_keypress(KC_ENTER); borg_keypress('s'); return (TRUE); } /* Traps. Disarm it w/ fail check */ if (o_ptr->pval[DEFAULT_PVAL] >= 1 && object_is_known(o_ptr) && borg_skill[BI_DEV] - o_ptr->pval[DEFAULT_PVAL] >= borg_chest_fail_tolerance ) { borg_note(format("# Disarming a '%s' at (%d,%d)", take->kind->name, take->y, take->x)); /* Open it */ borg_keypress('D'); borg_keypress(I2D(dir)); return (TRUE); } /* No trap, or unknown trap that passed above checks - Open it */ if (o_ptr->pval[DEFAULT_PVAL] < 0 || !object_is_known(o_ptr)) { borg_note(format("# Opening a '%s' at (%d,%d)", take->kind->name, take->y, take->x)); /* Open it */ borg_keypress('o'); borg_keypress(I2D(dir)); return (TRUE); } /* Empty chest */ /* continue in routine and pick it up */ } /*** Handle Orb of Draining ***/ /* Priest/Paladin borgs who have very limited ID ability can save some money and * inventory space my casting Orb of Draining on objects. Cursed objects will melt * under the Orb of Draining spell. This will save the borg from carrying the item * around until he can ID it. * * By default, the flag ORBED is set to false when an item is created. If the borg * gets close to an item, and the conditions are favorable, he will cast OoD on the * item and change the flag. */ if (take->orbed == FALSE && (take->tval >= TV_SHOT && take->tval < TV_STAFF)) { if (distance(take->y, take->x, c_y, c_x) == 1) { if (borg_prayer_okay_fail(2, 1, 25)) { /* Target the Take location */ borg_target(take->y, take->x); /* Cast the prayer */ borg_prayer(2,1); /* Message */ borg_note("# Orbing an object to check for cursed item."); /* use the old target */ borg_keypress('5'); /* Change the take flag */ take->orbed = TRUE; /* check the blast radius of the prayer for other items */ for (i=0; i < 24; i++) { /* Extract the location */ int xx = take->x + borg_ddx_ddd[i]; int yy = take->y + borg_ddy_ddd[i]; /* Check the grid for a take */ if(!cave_in_bounds_fully(cave, yy,xx)) continue; ag2 = &borg_grids[yy][xx]; if (ag2->take) { /* This item was orbed (mostly true)*/ borg_takes[borg_grids[yy][xx].take].orbed = TRUE; } } /* Return */ return (TRUE); } } } /*** Handle other takes ***/ /* Message */ borg_note(format("# Walking onto and deleting a '%s' at (%d,%d)", take->kind->name, take->y, take->x)); /* Delete the item from the list */ borg_delete_take(ag->take); /* Walk onto it */ borg_keypress(I2D(dir)); return (TRUE); } /* Glyph of Warding */ if (ag->feat == FEAT_GLYPH) { /* Message */ borg_note(format("# Walking onto a glyph of warding.")); /* Walk onto it */ borg_keypress(I2D(dir)); return (TRUE); } /* Traps -- disarm -- */ if (borg_skill[BI_CURLITE] && !borg_skill[BI_ISBLIND] && !borg_skill[BI_ISCONFUSED] && !scaryguy_on_level && (ag->feat >= FEAT_TRAP_HEAD) && (ag->feat <= FEAT_TRAP_TAIL)) { /* NOTE: If a scary guy is on the level, we allow the borg to run over the * trap in order to escape this level. */ /* allow "destroy doors" */ if (borg_prayer(7, 0)) { borg_note("# Unbarring ways"); return (TRUE); } /* Disarm */ borg_note("# Disarming a trap"); borg_keypress('D'); borg_keypress(I2D(dir)); /* We are not sure if the trap will get 'untrapped'. pretend it will*/ ag->feat = FEAT_NONE; return (TRUE); } /* Closed Doors -- Open */ if ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_DOOR_HEAD + 0x07)) { /* Paranoia XXX XXX XXX */ if (!randint0(100)) return (FALSE); /* Not a good idea to open locked doors if a monster * is next to the borg beating on him */ /* scan the adjacent grids */ for (i = 0; i < 8; i++) { /* Grid in that direction */ x = c_x + ddx_ddd[i]; y = c_y + ddy_ddd[i]; /* Access the grid */ ag2 = &borg_grids[y][x]; /* If monster adjacent to me and I'm weak, dont * even try to open the door */ if (ag2->kill && borg_skill[BI_CLEVEL] < 15 && !borg_skill[BI_ISAFRAID]) return (FALSE); } /* Use other techniques from time to time */ if (!randint0(100) || time_this_panel >= 500) { /* Mega-Hack -- allow "destroy doors" */ if (borg_prayer(7, 0)) { borg_note("# Unbarring ways"); return (TRUE); } /* Mega-Hack -- allow "destroy doors" */ if (borg_spell(1, 2)) { borg_note("# Destroying doors"); return (TRUE); } /* Mega-Hack -- allow "stone to mud" */ if (borg_spell(2, 2) || borg_activate_ring(SV_RING_DELVING) || borg_activate_artifact(EF_STONE_TO_MUD)) { borg_note("# Melting a door"); borg_keypress(I2D(dir)); /* Remove this closed door from the list. * Its faster to clear all doors from the list * then rebuild the list. */ if (track_closed_num) { track_closed_num = 0; } return (TRUE); } return (TRUE); } /* Open */ if (my_need_alter) { borg_keypress('+'); my_need_alter = FALSE; } else { borg_note("# Opening a door"); borg_keypress('0'); borg_keypress('9'); borg_keypress(KC_ENTER); borg_keypress('o'); } borg_keypress(I2D(dir)); /* Remove this closed door from the list. * Its faster to clear all doors from the list * then rebuild the list. */ if (track_closed_num) { track_closed_num = 0; } return (TRUE); } /* Rubble, Treasure, Seams, Walls -- Tunnel or Melt */ if (ag->feat >= FEAT_SECRET && ag->feat <= FEAT_WALL_SOLID) { /* No digging when hungry */ if (borg_skill[BI_ISHUNGRY]) return FALSE; /* Don't dig walls and seams when exploring (do dig rubble) */ if (ag->feat != FEAT_RUBBLE && goal == GOAL_DARK) return FALSE; /* Use Stone to Mud when available */ if (borg_spell(2, 2) || borg_activate_ring(SV_RING_DELVING) || borg_activate_artifact(EF_STONE_TO_MUD)) { borg_note("# Melting a wall/etc"); borg_keypress(I2D(dir)); /* Forget number of mineral veins to force rebuild of vein list */ track_vein_num = 0; return TRUE; } /* If we don't have a digger, don't bother digging certain walls * (without sufficient character level) */ if (borg_items[weapon_swap].tval != TV_DIGGING && borg_items[INVEN_WIELD].tval != TV_DIGGING) { int clev = 0; if (ag->feat >= FEAT_MAGMA && ag->feat <= FEAT_QUARTZ_K) clev = 30; if ((ag->feat >= FEAT_WALL_EXTRA && ag->feat <= FEAT_WALL_SOLID) || ag->feat == FEAT_SECRET) clev = 40; if (borg_skill[BI_CLEVEL] <= clev) { /* Clear flow grids */ goal = 0; return FALSE; } } /* Mega-Hack -- prevent infinite loops */ if (randint0(500) <= 5 && !vault_on_level) return FALSE; /* Switch to a digger if we have one */ if (borg_items[weapon_swap].tval == TV_DIGGING && !borg_items[INVEN_WIELD].cursed) { borg_note("# Swapping Digger"); borg_keypress(ESCAPE); borg_keypress('w'); borg_keypress(I2A(weapon_swap)); borg_keypress(' '); borg_keypress(' '); } /* Dig */ borg_note("# Digging through wall/etc"); borg_keypress('T'); borg_keypress(I2D(dir)); /* Forget number of mineral veins to force rebuild of vein list */ /* XXX Maybe only do this if successful? */ track_vein_num = 0; return TRUE; } /* Shops -- Enter */ if (feature_isshop(ag->feat)) { /* Message */ borg_note(format("# Entering a '%d' shop", (ag->feat - FEAT_SHOP_HEAD) + 1)); /* Enter the shop */ borg_keypress(I2D(dir)); return (TRUE); } /* Perhaps the borg could search for traps as he walks around level one. */ if (borg_skill[BI_MAXCLEVEL] <= 5 && borg_skill[BI_CDEPTH] && !borg_skill[BI_ISSEARCHING] && borg_needs_searching == TRUE && !borg_no_retreat && !scaryguy_on_level && borg_skill[BI_CURLITE] != 0 && !borg_skill[BI_ISHUNGRY] && !borg_skill[BI_ISWEAK] && borg_skill[BI_FOOD] > 2) { borg_note("# Borg searching-walking engaged."); borg_keypress('S'); } /* Turn off the searching if needed */ if (!borg_needs_searching && borg_skill[BI_ISSEARCHING]) { borg_note("# Disengage the searching-walking."); borg_keypress('S'); borg_skill[BI_ISSEARCHING] = FALSE; } /* Walk in that direction */ if (my_need_alter) { borg_keypress('+'); my_need_alter = FALSE; } else { /* nothing */ } /* Note if Borg is searching */ if (borg_skill[BI_ISSEARCHING]) borg_note("# Borg is searching while walking."); /* Actually enter the direction */ borg_keypress(I2D(dir)); /* I'm not in a store */ borg_in_shop = FALSE; /* for some reason, selling and buying in the store sets the event handler to Select. * This is a game bug not a borg bug. The borg is trying to overcome the game bug. * But he still has some troubles unhooking in town after shopping. Again, this is * due to the event handler. The handler should release the EVT_SELECT but it does not. */ if (ch_evt.type & EVT_SELECT) ch_evt.type = EVT_KBRD; if (ch_evt.type & EVT_MOVE) ch_evt.type = EVT_KBRD; /* Did something */ return (TRUE); } /* * Act twitchy */ bool borg_twitchy(void) { int dir = 5; /* This is a bad thing */ borg_note("# Twitchy!"); /* try to phase out of it */ if (borg_caution_phase(15, 2) && (borg_spell_fail(0, 2, 40) || borg_prayer_fail(4, 0, 40) || borg_activate_artifact(EF_TELE_PHASE)|| borg_activate_artifact(EF_TELE_LONG) || borg_read_scroll(SV_SCROLL_PHASE_DOOR) )) { /* We did something */ return (TRUE); } /* Pick a random direction */ while (dir == 5 || dir == 0) { dir = randint0(9); } /* Hack -- set goal */ g_x = c_x + ddx[dir]; g_y = c_y + ddy[dir]; /* Normally move */ /* Send direction */ borg_keypress(I2D(dir)); /* We did something */ return (TRUE); } /* * Commit the current "flow" */ static bool borg_flow_commit(char *who, int why) { int cost; /* Cost of current grid */ cost = borg_data_cost->data[c_y][c_x]; /* Verify the total "cost" */ if (cost >= 250) return (FALSE); /* Message */ if (who) borg_note(format("# Flowing toward %s at cost %d", who, cost)); /* Obtain the "flow" information */ COPY(borg_data_flow, borg_data_cost, borg_data); /* Save the goal type */ goal = why; /* Success */ return (TRUE); } /* * Attempt to take an optimal step towards the current goal location * * Note that the "borg_update()" routine notices new monsters and objects, * and movement of monsters and objects, and cancels any flow in progress. * * Note that the "borg_update()" routine notices when a grid which was * not thought to block motion is discovered to in fact be a grid which * blocks motion, and removes that grid from any flow in progress. * * When given multiple alternative steps, this function attempts to choose * the "safest" path, by penalizing grids containing embedded gold, monsters, * rubble, doors, traps, store doors, and even floors. This allows the Borg * to "step around" dangerous grids, even if this means extending the path by * a step or two, and encourages him to prefer grids such as objects and stairs * which are not only interesting but which are known not to be invisible traps. * * XXX XXX XXX XXX This function needs some work. It should attempt to * analyze the "local region" around the player and determine the optimal * choice of locations based on some useful computations. * * If it works, return TRUE, otherwise, cancel the goal and return FALSE. */ bool borg_flow_old(int why) { int x, y; /* Continue */ if (goal == why) { int b_n = 0; int i, b_i = -1; int c, b_c; /* Flow cost of current grid */ b_c = borg_data_flow->data[c_y][c_x] * 10; /* Prevent loops */ b_c = b_c - 5; /* Look around */ for (i = 0; i < 8; i++) { /* Grid in that direction */ x = c_x + ddx_ddd[i]; y = c_y + ddy_ddd[i]; /* Flow cost at that grid */ c = borg_data_flow->data[y][x] * 10; /* Never backtrack */ if (c > b_c) continue; /* avoid screen edgeds */ if (x > AUTO_MAX_X-1 || x < 1 || y > AUTO_MAX_Y-1 || y < 1) continue; /* Notice new best value */ if (c < b_c) b_n = 0; /* Apply the randomizer to equivalent values */ if (borg_skill[BI_CDEPTH] == 0 && (++b_n >= 2) && (randint0(b_n) != 0)) continue; else if (borg_skill[BI_CDEPTH] >= 1 && ++b_n >= 2) continue; /* Special case when digging anti-summon corridor */ if (goal == GOAL_DIGGING &&(ddx_ddd[i] == 0 ||ddy_ddd[i] == 0)) { /* No straight lines */ if (distance(c_y, c_x, borg_flow_y[0], borg_flow_x[0]) <= 2) continue; } /* Track it */ b_i = i; b_c = c; } /* Try it */ if (b_i >= 0) { /* Access the location */ x = c_x + ddx_ddd[b_i]; y = c_y + ddy_ddd[b_i]; /* Attempt motion */ if (borg_play_step(y, x)) return (TRUE); } /* Mark a timestamp to wait on a anti-summon spot for a few turns */ if (goal == GOAL_DIGGING && c_y == borg_flow_y[0] && c_x == borg_flow_x[0]) borg_t_antisummon = borg_t; /* Cancel goal */ goal = 0; } /* Nothing to do */ return (FALSE); } /* * Prepare to flee the level via stairs */ bool borg_flow_stair_both(int why, bool sneak) { int i; /* None to flow to */ if (!track_less_num && !track_more_num) return (FALSE); /* dont go down if hungry or low on food, unless fleeing a scary town */ if (!goal_fleeing && !scaryguy_on_level && !track_less_num && (avoidance <= borg_skill[BI_CURHP] * 15/10) && (borg_skill[BI_ISWEAK] || borg_skill[BI_ISHUNGRY] || borg_skill[BI_FOOD] < 2)) return (FALSE); /* Absolutely no diving if no light */ if (borg_skill[BI_CURLITE] ==0 && borg_skill[BI_CDEPTH] != 0 && borg_munchkin_mode == FALSE) return (FALSE); /* clear the possible searching flag */ borg_needs_searching = FALSE; /* Clear the flow codes */ borg_flow_clear(); /* Enqueue useful grids */ for (i = 0; i < track_less_num; i++) { /* Not if a monster is parked on the stiar */ if (borg_grids[track_less_y[i]][track_less_x[i]].kill) continue; /* Enqueue the grid */ borg_flow_enqueue_grid(track_less_y[i], track_less_x[i]); } /* Enqueue useful grids */ for (i = 0; i < track_more_num; i++) { /* Not if a monster is parked on the stiar */ if (borg_grids[track_more_y[i]][track_more_x[i]].kill) continue; /* Enqueue the grid */ borg_flow_enqueue_grid(track_more_y[i], track_more_x[i]); } /* Spread the flow */ borg_flow_spread(250, FALSE, FALSE, FALSE, -1, sneak); /* Attempt to Commit the flow */ if (!borg_flow_commit("stairs", why)) return (FALSE); /* Take one step */ if (!borg_flow_old(why)) return (FALSE); /* Success */ return (TRUE); } /* * Prepare to flow towards "up" stairs */ bool borg_flow_stair_less(int why, bool sneak) { int i; /* None to flow to */ if (!track_less_num) return (FALSE); /* Clear the flow codes */ borg_flow_clear(); /* clear the possible searching flag */ borg_needs_searching = FALSE; /* Enqueue useful grids */ for (i = 0; i < track_less_num; i++) { /* Not if a monster is parked on the stiar */ if (borg_grids[track_less_y[i]][track_less_x[i]].kill) continue; /* Enqueue the grid */ borg_flow_enqueue_grid(track_less_y[i], track_less_x[i]); } if (borg_skill[BI_CLEVEL] > 35 || borg_skill[BI_CURLITE] == 0) { /* Spread the flow */ borg_flow_spread(250, TRUE, FALSE, FALSE, -1, sneak); } else { /* Spread the flow, No Optimize, Avoid */ borg_flow_spread(250, FALSE, !borg_desperate, FALSE, -1, sneak); } /* Attempt to Commit the flow */ if (!borg_flow_commit("up-stairs", why)) return (FALSE); /* Take one step */ if (!borg_flow_old(why)) return (FALSE); /* Success */ return (TRUE); } /* * Prepare to flow towards "down" stairs */ bool borg_flow_stair_more(int why, bool sneak, bool brave) { int i; /* None to flow to */ if (!track_more_num) return (FALSE); /* not unless safe or munchkin/Lunal Mode or brave */ if (!borg_lunal_mode && !borg_munchkin_mode && !brave && (char *)NULL != borg_prepared(borg_skill[BI_CDEPTH] + 1)) return (FALSE); /* dont go down if hungry or low on food, unless fleeing a scary town */ if (!brave && borg_skill[BI_CDEPTH] && !scaryguy_on_level && (borg_skill[BI_ISWEAK] || borg_skill[BI_ISHUNGRY] || borg_skill[BI_FOOD] < 2)) return (FALSE); /* If I need to sell crap, then don't go down */ if (borg_skill[BI_CDEPTH] && borg_skill[BI_CLEVEL] < 25 && borg_gold < 25000 && borg_count_sell() >= 13 && !borg_munchkin_mode) return (FALSE); /* No diving if no light */ if (borg_skill[BI_CURLITE] == 0 && borg_munchkin_mode == FALSE) return (FALSE); /* don't head for the stairs if you are recalling, */ /* even if you are fleeing. */ if (goal_recalling) return (FALSE); /* Clear the flow codes */ borg_flow_clear(); /* Enqueue useful grids */ for (i = 0; i < track_more_num; i++) { /* Not if a monster is parked on the stiar */ if (borg_grids[track_more_y[i]][track_more_x[i]].kill) continue; /* Enqueue the grid */ borg_flow_enqueue_grid(track_more_y[i], track_more_x[i]); } /* Spread the flow */ borg_flow_spread(250, TRUE, FALSE, FALSE, -1, sneak); /* Attempt to Commit the flow */ if (!borg_flow_commit("down-stairs", why)) return (FALSE); /* Take one step */ if (!borg_flow_old(why)) return (FALSE); /* Success */ return (TRUE); } /* * Hack -- Glyph creating */ static byte glyph_x; static byte glyph_y; static byte glyph_y_center = 0; static byte glyph_x_center = 0; /* * Prepare to flow towards a location and create a * special glyph of warding pattern. * * The borg will look for a room that is at least 7x7. * ########## * #3.......# * #2.xxxxx.# * #1.xxxxx.# * #0.xx@xx.# * #1.xxxxx.# * #2.xxxxx.# * #3.......# * # 3210123# * ########## * and when he locates one, he will attempt to: * 1. flow to a central location and * 2. begin planting Runes in a pattern. When complete, * 3. move to the center of it. */ /* * ghijk The borg will use the following ddx and ddy to search * d827a for a suitable grid in an open room. * e4@3b * f615c * lmnop 24 grids * */ bool borg_flow_glyph(int why) { int i; int cost; int x, y; int v = 0; int b_x = c_x; int b_y = c_y; int b_v = -1; int goal_glyph = 0; int glyph = 0; borg_grid *ag; if ((glyph_y_center == 0 && glyph_x_center == 0) || distance (c_y, c_x, glyph_y_center, glyph_x_center) >= 50) { borg_needs_new_sea = TRUE; } /* We have arrived */ if ((glyph_x == c_x) && (glyph_y == c_y)) { /* Cancel */ glyph_x = 0; glyph_y = 0; /* Store the center of the glyphs */ if (borg_needs_new_sea) { glyph_y_center = c_y; glyph_x_center = c_x; } borg_needs_new_sea = FALSE; /* Take note */ borg_note(format("# Glyph Creating at (%d,%d)", c_x, c_y)); /* Create the Glyph */ if (borg_prayer_fail(3, 4, 30) || borg_spell_fail(6, 4, 30) || borg_read_scroll(SV_SCROLL_RUNE_OF_PROTECTION)) { /* Check for an existing glyph */ for (i = 0; i < track_glyph_num; i++) { /* Stop if we already new about this glyph */ if ((track_glyph_x[i] == c_x) && (track_glyph_y[i] == c_y)) return (FALSE); } /* Track the newly discovered glyph */ if (track_glyph_num < track_glyph_size) { borg_note("# Noting the creation of a glyph."); track_glyph_x[track_glyph_num] = c_x; track_glyph_y[track_glyph_num] = c_y; track_glyph_num++; } /* Success */ return (TRUE); } /* Nope */ return (FALSE); } /* Reverse flow */ borg_flow_reverse(250, TRUE, FALSE, FALSE, -1, FALSE); /* Scan the entire map */ for (y = 15; y < AUTO_MAX_Y-15; y++) { for (x = 50; x < AUTO_MAX_X-50; x++) { borg_grid *ag_ptr[24]; int floor = 0; int glyph = 0; /* Acquire the grid */ ag = &borg_grids[y][x]; /* Skip every non floor/glyph */ if (ag->feat != FEAT_FLOOR && ag->feat != FEAT_GLYPH) continue; /* Acquire the cost */ cost = borg_data_cost->data[y][x]; /* Skip grids that are really far away. He probably * won't be able to safely get there */ if (cost >= 75) continue; /* Extract adjacent locations to each considered grid */ for (i = 0; i < 24; i++) { /* Extract the location */ int xx = x + borg_ddx_ddd[i]; int yy = y + borg_ddy_ddd[i]; /* Get the grid contents */ ag_ptr[i] = &borg_grids[yy][xx]; } /* Center Grid */ if (borg_needs_new_sea) { goal_glyph = 24; /* Count Adjacent Flooors */ for (i = 0; i < 24; i++) { ag = ag_ptr[i]; if (ag->feat == FEAT_FLOOR || ag->feat == FEAT_GLYPH) floor++; } /* Not a good location if not the center of the sea */ if (floor != 24) { continue; } /* Count floors already glyphed */ for (i = 0; i < 24; i++) { ag = ag_ptr[i]; /* Glyphs */ if (ag->feat == FEAT_GLYPH) { glyph++; } } /* Tweak -- Reward certain floors, punish distance */ v = 100 + (glyph * 500) - (cost * 1); if (borg_grids[y][x].feat == FEAT_FLOOR) v += 3000; /* If this grid is surrounded by glyphs, select it */ if (glyph == goal_glyph) v += 5000; /* If this grid is already glyphed but not * surrounded by glyphs, then choose another. */ if (glyph != goal_glyph && borg_grids[y][x].feat == FEAT_GLYPH) v = -1; /* The grid is not searchable */ if (v <= 0) continue; /* Track "best" grid */ if ((b_v >= 0) && (v < b_v)) continue; /* Save the data */ b_v = v; b_x = x; b_y = y; } /* old center, making outlying glyphs, */ else { /* Count Adjacent Flooors */ for (i = 0; i < 24; i++) { /* Leave if this grid is not in good array */ if (glyph_x_center + borg_ddx_ddd[i] != x) continue; if (glyph_y_center + borg_ddy_ddd[i] != y) continue; /* Already got a glyph on it */ if (borg_grids[y][x].feat == FEAT_GLYPH) continue; /* Tweak -- Reward certain floors, punish distance */ v = 500 + (glyph * 500) - (cost * 1); /* The grid is not searchable */ if (v <= 0) continue; /* Track "best" grid */ if ((b_v >= 0) && (v < b_v)) continue; /* Save the data */ b_v = v; b_x = x; b_y = y; } } } } /* Extract adjacent locations to each considered grid */ if (glyph_y_center != 0 && glyph_x_center != 0) { for (i = 0; i < 24; i++) { /* Extract the location */ int xx = glyph_x_center + borg_ddx_ddd[i]; int yy = glyph_y_center + borg_ddy_ddd[i]; borg_grid *ag_ptr[24]; /* Get the grid contents */ ag_ptr[i] = &borg_grids[yy][xx]; ag = ag_ptr[i]; /* If it is not a glyph, skip it */ if (ag->feat == FEAT_GLYPH) glyph++; /* Save the data */ if (glyph == 24) { b_v = 5000; b_x = glyph_x_center; b_y = glyph_y_center; } } } /* Clear the flow codes */ borg_flow_clear(); /* Hack -- Nothing found */ if (b_v < 0) return (FALSE); /* Access grid */ ag = &borg_grids[b_y][b_x]; /* Memorize */ glyph_x = b_x; glyph_y = b_y; /* Enqueue the grid */ borg_flow_enqueue_grid(b_y, b_x); /* Spread the flow */ borg_flow_spread(250, TRUE, FALSE, FALSE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("Glyph", GOAL_MISC)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_MISC)) return (FALSE); /* Success */ return (TRUE); } /* * Prepare to flow towards light */ bool borg_flow_light(int why) { int y,x,i; /* reset counters */ borg_glow_n = 0; i=0; /* build the glow array */ /* Scan map */ for (y = w_y; y < w_y + SCREEN_HGT; y++) { for (x = w_x; x < w_x + SCREEN_WID; x++) { borg_grid *ag = &borg_grids[y][x]; /* Not a perma-lit, and not our spot. */ if (!(ag->info & BORG_GLOW)) continue; /* keep count */ borg_glow_y[borg_glow_n] = y; borg_glow_x[borg_glow_n] = x; borg_glow_n++; } } /* None to flow to */ if (!borg_glow_n) return (FALSE); /* Clear the flow codes */ borg_flow_clear(); /* Enqueue useful grids */ for (i = 0; i < borg_glow_n; i++) { /* Enqueue the grid */ borg_flow_enqueue_grid(borg_glow_y[i], borg_glow_x[i]); } /* Spread the flow */ borg_flow_spread(250, TRUE, FALSE, FALSE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("a lighted area", why)) return (FALSE); /* Take one step */ if (!borg_flow_old(why)) return (FALSE); /* Success */ return (TRUE); } /* * Prepare to flow towards a vault grid which can be excavated */ bool borg_flow_vault(int nearness) { int y,x,i; int b_y, b_x; borg_grid *ag; /* reset counters */ borg_temp_n = 0; i=0; /* no need if no vault on level */ if (!vault_on_level) return (FALSE); /* build the array -- Scan screen */ for (y = w_y; y < w_y + SCREEN_HGT; y++) { for (x = w_x; x < w_x + SCREEN_WID; x++) { /* only bother with near ones */ if (distance(c_y, c_x, y, x) > nearness) continue; /* only deal with excavatable walls */ if (borg_grids[y][x].feat < FEAT_MAGMA || borg_grids[y][x].feat > FEAT_PERM_EXTRA) continue; /* Examine grids adjacent to this grid to see if there is a perma wall adjacent */ for (i=0; i < 8; i++) { b_x = x + ddx_ddd[i]; b_y = y + ddy_ddd[i]; /* Bounds check */ if (!cave_in_bounds_fully(cave, b_y, b_x)) continue; /* Access the grid */ ag = &borg_grids[b_y][b_x]; /* Not a perma, and not our spot. */ if (ag->feat != FEAT_PERM_INNER) continue; /* keep count */ borg_temp_y[borg_temp_n] = y; borg_temp_x[borg_temp_n] = x; borg_temp_n++; } } } /* None to flow to */ if (!borg_temp_n) return (FALSE); /* Examine each ones */ for (i = 0; i < borg_temp_n; i++) { /* Enqueue the grid */ borg_flow_enqueue_grid(borg_temp_y[i], borg_temp_x[i]); } /* Spread the flow */ borg_flow_spread(250, TRUE, FALSE, FALSE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("vault excavation", GOAL_VAULT)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_VAULT)) return (FALSE); /* Success */ return (TRUE); } /* Excavate an existing vault using ranged spells. * Stand where you are, use stone to mud to excavate the vault. This will allow the mage * borgs to get a few more attack spells on the monster. Without this routine, he would * approach the vault and use Stone to Mud when he was adjacent to the wall, giving him * only 1 or 2 shots before the monster is next to the borg. * * A problem arises when the borg will melt an interior wall to a vault and free the imprisoned * monster. The monster then has LOS on the borg but he will not know that he has LOS on * the monster since the now-melted wall is dark and considered a FEAT_INVIS grid. The borg either * needs to illuminate the area or be allowed to attack over a FEAT_INVIS grid in a vault. */ bool borg_excavate_vault(int range) { int y,x,i,ii; int b_y, b_x; borg_grid *ag; /* reset counters */ borg_temp_n = 0; i=0; ii = 0; /* no need if no vault on level */ if (!vault_on_level) return (FALSE); /* only if you can cast the spell */ if (!borg_spell_okay_fail(2, 2, 30)) return (FALSE); /* Danger/bad idea checks */ /* build the array -- Scan screen */ for (y = w_y; y < w_y + SCREEN_HGT; y++) { for (x = w_x; x < w_x + SCREEN_WID; x++) { /* only bother with near ones */ if (distance(c_y, c_x, y, x) > range) continue; /* only deal with excavatable walls */ if (borg_grids[y][x].feat < FEAT_MAGMA || borg_grids[y][x].feat > FEAT_PERM_EXTRA) continue; /* Examine grids adjacent to this grid to see if there is a perma wall adjacent */ for (i=0; i < 8; i++) { b_x = x + ddx_ddd[i]; b_y = y + ddy_ddd[i]; /* Bounds check */ if (!cave_in_bounds_fully(cave, b_y, b_x)) continue; ag = &borg_grids[b_y][b_x]; /* Not a perma, and not our spot. */ if (ag->feat != FEAT_PERM_INNER) continue; /* Track the new grid */ for (ii=0; ii < borg_temp_n; ii++) { if (borg_temp_y[ii] == y && borg_temp_x[ii] == x) break; } /* Track the newly discovered excavatable wall */ if ((ii == borg_temp_n) && (ii < AUTO_TEMP_MAX)) { borg_temp_x[ii] = x; borg_temp_y[ii] = y; borg_temp_n++; /* do not overflow */ if (borg_temp_n > AUTO_TEMP_MAX) borg_temp_n = AUTO_TEMP_MAX; } } } } /* None to excavate */ if (!borg_temp_n) return (FALSE); /* Review the useful grids */ for (i = 0; i < borg_temp_n; i++) { /* skip non-projectable grids grid (I cant shoot them) */ if (!borg_los(c_y, c_x, borg_temp_y[i], borg_temp_x[i])) continue; /* Attempt to target the grid */ borg_target(borg_temp_y[i],borg_temp_x[i]); /* Attempt to excavate it with "stone to mud" */ if (borg_spell(2, 2) || borg_activate_ring(SV_RING_DELVING) || borg_activate_artifact(EF_STONE_TO_MUD)) { borg_note("# Excavation of vault"); borg_keypress('5'); /* turn that wall into a floor grid. If the spell failed, it will still look * like a wall and the borg_update routine will redefine it as a wall */ borg_do_update_view = TRUE; borg_do_update_LIGHT = TRUE; /* Not Lit */ borg_grids[borg_temp_y[i]][borg_temp_x[i]].info &= ~BORG_GLOW; /* Dark */ borg_grids[borg_temp_y[i]][borg_temp_x[i]].info |= BORG_GLOW; /* Feat Floor */ borg_grids[borg_temp_y[i]][borg_temp_x[i]].feat = FEAT_FLOOR; return (TRUE); } /* Success */ return (TRUE); } /* No grid to excavate */ return (FALSE); } /* * Prepare to "flow" towards any non-visited shop */ bool borg_flow_shop_visit(void) { /* Borg is allowed to cheat the store inventory as of 320. No need to visit each one */ return (FALSE); #if 0 int i, x, y; /* Must be in town */ if (borg_skill[BI_CDEPTH]) return (FALSE); /* Clear the flow codes */ borg_flow_clear(); /* Visit the shops */ for (i = 0; i < MAX_STORES; i++) { /* If low Level skip certain buildings in town * in order to reduce time spent in town. */ if (borg_skill[BI_CLEVEL] <= 10) { /* Skip Magic Shop unless Mage */ if (i == 5 && (borg_class != CLASS_MAGE)) { borg_shops[i].when = borg_t; continue; } /* Skip Black Market */ if (i == 6) { borg_shops[i].when = borg_t; continue; } /* Skip Home */ if (i == 7) { borg_shops[i].when = borg_t; continue; } } /* Must not be visited */ if (borg_shops[i].when) continue; /* if poisoned or bleeding skip non temples */ if ( (borg_skill[BI_ISCUT] || borg_skill[BI_ISPOISONED]) && (i != 3 && i !=7) ) continue; /* if starving--skip non food places */ if (borg_skill[BI_FOOD] == 0 && (i != 0 && i !=7) ) continue; /* if dark--skip non food places */ if ( borg_skill[BI_CURLITE] == 0 && (i != 0 ) && borg_skill[BI_CLEVEL] >= 2) continue; /* if only torch-- go directly to Gen Store --Get a Lantern */ if ( borg_skill[BI_CURLITE] == 1 && i != 0 && /* !borg_shops[0].when && */ borg_gold >= 75) continue; /* Obtain the location */ x = track_shop_x[i]; y = track_shop_y[i]; /* Hack -- Must be known and not under the player */ if (!x || !y || ((c_x == x) && (c_y == y))) continue; /* Enqueue the grid */ borg_flow_enqueue_grid(y, x); } /* Spread the flow */ borg_flow_spread(250, TRUE, FALSE, FALSE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("un-visited shops", GOAL_MISC)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_MISC)) return (FALSE); /* Success */ return (TRUE); #endif } /* * Prepare to "flow" towards a specific shop entry */ bool borg_flow_shop_entry(int i) { int x, y; char *name = (f_info[0x08+i].name); /* Must be in town */ if (borg_skill[BI_CDEPTH]) return (FALSE); /* Obtain the location */ x = track_shop_x[i]; y = track_shop_y[i]; /* Hack -- Must be known */ if (!x || !y) return (FALSE); /* Hack -- re-enter a shop if needed */ if ((x == c_x) && (y == c_y)) { /* Note */ borg_note("# Re-entering a shop"); /* Enter the store */ borg_keypress('5'); /* Success */ return (TRUE); } /* Clear the flow codes */ borg_flow_clear(); /* Enqueue the grid */ borg_flow_enqueue_grid(y, x); /* Spread the flow */ borg_flow_spread(250, TRUE, FALSE, FALSE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit(name, GOAL_MISC)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_MISC)) return (FALSE); /* Success */ return (TRUE); } /* * The borg can take a shot from a distance * */ static bool borg_has_distance_attack( void ) { int rad; int dam; borg_simulate = TRUE; /* XXX For now only line up Magic Missle shots */ rad = 0; dam = (3+((borg_skill[BI_CLEVEL])/4))*(4+1)/2; if (borg_attack_aux_spell_bolt(0, 0, rad, dam, GF_MISSILE) > 0) return TRUE; return FALSE; } /* * Take a couple of steps to line up a shot * */ bool borg_flow_kill_aim(bool viewable) { int o_y, o_x; int s_c_y = c_y; int s_c_x = c_x; int i; /* Efficiency -- Nothing to kill */ if (!borg_kills_cnt) return (FALSE); /* Sometimes we loop on this if we back up to a point where */ /* the monster is out of site */ if (time_this_panel > 500) return (FALSE); /* Not if Weak from hunger or no food */ if (borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK] || borg_skill[BI_FOOD] == 0) return (FALSE); /* If you can shoot from where you are, don't bother reaiming */ if (borg_has_distance_attack()) return (FALSE); /* Consider each adjacent spot */ for (o_x = -2; o_x <= 2; o_x++) { for (o_y = -2; o_y <= 2; o_y++) { /* borg_attack would have already checked for a shot from where I currently am */ if (o_x == 0 && o_y == 0) continue; /* XXX Mess with where the program thinks the player is */ c_x = s_c_x + o_x; c_y = s_c_y + o_y; /* avoid screen edgeds */ if (c_x > AUTO_MAX_X-2 || c_x < 2 || c_y > AUTO_MAX_Y-2 || c_y < 2) continue; /* Make sure we do not end up next to a monster */ for (i = 0; i < borg_kills_nxt; i++) { if (distance(c_y, c_x, borg_kills[i].y, borg_kills[i].x) == 1) break; } if (i != borg_kills_nxt) continue; /* Check for a distance attack from here */ if (borg_has_distance_attack()) { /* Clear the flow codes */ borg_flow_clear(); /* Enqueue the grid */ borg_flow_enqueue_grid(c_y, c_x); /* restore the saved player position */ c_x = s_c_x; c_y = s_c_y; /* Spread the flow */ borg_flow_spread(5, TRUE, !viewable, FALSE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("targetable position", GOAL_KILL)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_KILL)) return (FALSE); return (TRUE); } } } /* restore the saved player position */ c_x = s_c_x; c_y = s_c_y; return FALSE; } /* * Dig an anti-summon corridor. Type I * * ############## We want the borg to dig a tunnel which * #............# limits the LOS of summoned monsters. * ###............# It works better in hallways. * ##@#............# * #p##............# The borg will build an array of grids * ########## #######+###### near him. Then look at specific patterns * # # to find the good grids to excavate. * # ################ # * # # # * ### # # * * Look at wall array to see if it is acceptable * We want to find this in the array: * * ##### ..@.. ####. .#### * ##.## ##.## ##.#. .#.## * #.#.# #.#.# #.#.@ @.#.# * ##.## ##.## ##.#. .#.## * ..@.. ##### ####. .#### * * NORTH SOUTH WEST East * */ bool borg_flow_kill_corridor_1(bool viewable) { int o_y = 0; int o_x = 0; int m_x = 0; int m_y = 0; int b_y = 0, b_x = 0; int b_distance = 99; int i; bool b_n = FALSE; bool b_s = FALSE; bool b_e = FALSE; bool b_w = FALSE; int n_array[25] = {1,0,0,0,1, 1,0,1,0,1, 0,1,0,1,0, 0,0,1,0,0, 1,1,1,1,1}; int ny[25] = {-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0}; int nx[25] = {-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2}; int s_array[25] = {1,1,1,1,1, 0,0,1,0,0, 0,1,0,1,0, 1,0,1,0,1, 1,0,0,0,1}; int sy[25] = { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4}; int sx[25] = {-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2}; int e_array[25] = {1,0,0,1,1, 1,0,1,0,0, 1,1,0,1,0, 1,0,1,0,0, 1,0,0,1,1}; int ey[25] = {-2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2}; int ex[25] = { 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4}; int w_array[25] = {1,1,0,0,1, 0,0,1,0,1, 0,1,0,1,1, 0,0,1,0,1, 1,1,0,0,1}; int wy[25] = {-2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2}; int wx[25] = {-4,-3,-2,-1, 0,-4,-3,-2,-1, 0,-4,-3,-2,-1, 0,-4,-3,-2,-1, 0,-4,-3,-2,-1, 0}; int wall_north = 0; int wall_south = 0; int wall_east = 0; int wall_west = 0; int q_x; int q_y; borg_kill *kill; borg_digging = FALSE; /* Efficiency -- Nothing to kill */ if (!borg_kills_cnt) return (FALSE); /* Only do this to summoners when they are close*/ if (borg_kills_summoner == -1) return (FALSE); /* Hungry,starving */ if (borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK]) return (FALSE); /* Sometimes we loop on this */ if (time_this_panel > 500) return (FALSE); /* Do not dig when confused */ if (borg_skill[BI_ISCONFUSED]) return (FALSE); /* Not when darkened */ if (borg_skill[BI_CURLITE] == 0) return (FALSE); /* Not if sitting in a sea of runes */ if (borg_morgoth_position) return (FALSE); if (borg_as_position) return (FALSE); /* get the summoning monster */ kill = &borg_kills[borg_kills_summoner]; /* Summoner must be mobile */ if (rf_has(r_info[kill->r_idx].flags, RF_NEVER_MOVE)) return(FALSE); /* Summoner must be able to pass through walls */ if (rf_has(r_info[kill->r_idx].flags, RF_PASS_WALL)) return(FALSE); if (rf_has(r_info[kill->r_idx].flags, RF_KILL_WALL)) return(FALSE); /* Summoner has to be awake (so he will chase me */ if (!kill->awake) return (FALSE); /* Must have Stone to Mud spell */ if (!borg_spell_okay(2, 2) && !borg_equips_ring(SV_RING_DELVING) && !borg_equips_artifact(EF_STONE_TO_MUD)) return (FALSE); /* Summoner needs to be able to follow me. * So I either need to be able to * 1) have LOS on him or * 2) this panel needs to have had Magic Map or Wizard light cast on it. * If Mapped, then the flow codes needs to be used. */ if (!borg_los(kill->y, kill->x, c_y, c_x)) { /* Extract panel */ q_x = w_x / PANEL_WID; q_y = w_y / PANEL_HGT; if (borg_detect_wall[q_y+0][q_x+0] == TRUE && borg_detect_wall[q_y+0][q_x+1] == TRUE && borg_detect_wall[q_y+1][q_x+0] == TRUE && borg_detect_wall[q_y+1][q_x+1] == TRUE) { borg_flow_clear(); borg_digging = TRUE; borg_flow_enqueue_grid(kill->y, kill->x); borg_flow_spread(10, TRUE, FALSE, FALSE, -1, FALSE); if (!borg_flow_commit("Monster Path", GOAL_KILL)) return (FALSE); } else { borg_flow_clear(); borg_digging = TRUE; borg_flow_enqueue_grid(kill->y, kill->x); borg_flow_spread(10, TRUE, TRUE, FALSE, -1, FALSE); if (!borg_flow_commit("Monster Path", GOAL_KILL)) return (FALSE); } } /* NORTH -- Consider each area near the borg, looking for a good spot to hide */ for (o_y = -2; o_y < 1; o_y++) { /* Resest Wall count */ wall_north = 0; /* No E-W offset when looking North-South */ o_x = 0; for (i = 0; i < 25; i++) { borg_grid *ag; /* Check grids near borg */ m_y = c_y + o_y + ny[i]; m_x = c_x + o_x + nx[i]; /* avoid screen edgeds */ if (!cave_in_bounds_fully(cave, m_y, m_x)) { continue; } /* grid the grid */ ag = &borg_grids[m_y][m_x]; /* Certain grids must not be floor types */ if (n_array[i] == 0 && ((ag->feat == FEAT_NONE) || (ag->feat >= FEAT_MAGMA && ag->feat <= FEAT_QUARTZ_K) || (ag->feat >= FEAT_WALL_EXTRA && ag->feat <= FEAT_WALL_SOLID))) { /* This is a good grid */ wall_north++; } if (n_array[i] == 1 && ((ag->feat <= FEAT_MORE) || (ag->feat >= FEAT_MAGMA && ag->feat <= FEAT_QUARTZ_K) || (ag->feat >= FEAT_WALL_EXTRA && ag->feat <= FEAT_WALL_SOLID))) { /* A good wall would score 25. */ wall_north++; } } /* If I found 25 grids, then that spot will work well */ if (wall_north == 25) { if (distance(c_y, c_x, c_y + o_y + ny[7], c_x + o_x + nx[7]) < b_distance) { b_y = o_y; b_x = o_x; b_n = TRUE; b_distance = distance(c_y, c_x, c_y + o_y + ny[7], c_x + o_x + nx[7]); } } } /* SOUTH -- Consider each area near the borg, looking for a good spot to hide */ for (o_y = -1; o_y < 2; o_y++) { /* Resest Wall count */ wall_south = 0; for (i = 0; i < 25; i++) { borg_grid *ag; /* No lateral offset on South check */ o_x = 0; /* Check grids near borg */ m_y = c_y + o_y + sy[i]; m_x = c_x + o_x + sx[i]; /* avoid screen edgeds */ if (!cave_in_bounds_fully(cave, m_y, m_x)) continue; /* grid the grid */ ag = &borg_grids[m_y][m_x]; /* Certain grids must not be floor types */ if (s_array[i] == 0 && ((ag->feat == FEAT_NONE) || (ag->feat >= FEAT_MAGMA && ag->feat <= FEAT_QUARTZ_K) || (ag->feat >= FEAT_WALL_EXTRA && ag->feat <= FEAT_WALL_SOLID))) { /* This is a good grid */ wall_south++; } if (s_array[i] == 1 && ((ag->feat <= FEAT_MORE) || (ag->feat >= FEAT_MAGMA && ag->feat <= FEAT_QUARTZ_K) || (ag->feat >= FEAT_WALL_EXTRA && ag->feat <= FEAT_WALL_SOLID))) { /* A good wall would score 25. */ wall_south++; } } /* If I found 25 grids, then that spot will work well */ if (wall_south == 25) { if (distance(c_y, c_x, c_y + o_y + sy[17], c_x + o_x + sx[17]) < b_distance) { b_y = o_y; b_x = o_x; b_s = TRUE; b_n = FALSE; b_distance = distance(c_y, c_x, c_y + b_y + sy[17], c_x + b_x + sx[17]); } } } /* EAST -- Consider each area near the borg, looking for a good spot to hide */ for (o_x = -1; o_x < 2; o_x++) { /* Resest Wall count */ wall_east = 0; /* No N-S offset check when looking E-W */ o_y = 0; for (i = 0; i < 25; i++) { borg_grid *ag; /* Check grids near borg */ m_y = c_y + o_y + ey[i]; m_x = c_x + o_x + ex[i]; /* avoid screen edgeds */ if (!cave_in_bounds_fully(cave, m_y, m_x)) continue; /* grid the grid */ ag = &borg_grids[m_y][m_x]; /* Certain grids must not be floor types */ if (e_array[i] == 0 && ((ag->feat == FEAT_NONE) || (ag->feat >= FEAT_MAGMA && ag->feat <= FEAT_QUARTZ_K) || (ag->feat >= FEAT_WALL_EXTRA && ag->feat <= FEAT_WALL_SOLID))) { /* This is a good grid */ wall_east++; } if (e_array[i] == 1 && ((ag->feat <= FEAT_MORE) || (ag->feat >= FEAT_MAGMA && ag->feat <= FEAT_QUARTZ_K) || (ag->feat >= FEAT_WALL_EXTRA && ag->feat <= FEAT_WALL_SOLID))) { /* A good wall would score 25. */ wall_east++; } } /* If I found 25 grids, then that spot will work well */ if (wall_east == 25) { if (distance(c_y, c_x, c_y + o_y + ey[13], c_x + o_x + ex[13]) < b_distance) { b_y = o_y; b_x = o_x; b_e = TRUE; b_s = FALSE; b_n = FALSE; b_distance = distance(c_y, c_x, c_y + b_y + ey[13], c_x + b_x + ex[13]); } } } /* WEST -- Consider each area near the borg, looking for a good spot to hide */ for (o_x = -2; o_x < 1; o_x++) { /* Resest Wall count */ wall_west = 0; /* No N-S offset check when looking E-W */ o_y = 0; for (i = 0; i < 25; i++) { borg_grid *ag; /* Check grids near borg */ m_y = c_y + o_y + wy[i]; m_x = c_x + o_x + wx[i]; /* avoid screen edgeds */ if (!cave_in_bounds_fully(cave, m_y, m_x)) continue; /* grid the grid */ ag = &borg_grids[m_y][m_x]; /* Certain grids must not be floor types */ if (w_array[i] == 0 && ((ag->feat == FEAT_NONE) || (ag->feat >= FEAT_MAGMA && ag->feat <= FEAT_QUARTZ_K) || (ag->feat >= FEAT_WALL_EXTRA && ag->feat <= FEAT_WALL_SOLID))) { /* This is a good grid */ wall_west++; } if (w_array[i] == 1 && ((ag->feat <= FEAT_MORE) || (ag->feat >= FEAT_MAGMA && ag->feat <= FEAT_QUARTZ_K) || (ag->feat >= FEAT_WALL_EXTRA && ag->feat <= FEAT_WALL_SOLID))) { /* A good wall would score 25. */ wall_west++; } } /* If I found 25 grids, then that spot will work well */ if (wall_west == 25) { if (distance(c_y, c_x, c_y + o_y + wy[11], c_x + o_x + wx[11]) < b_distance) { b_y = o_y; b_x = o_x; b_w = TRUE; b_e = FALSE; b_s = FALSE; b_n = FALSE; b_distance = distance(c_y, c_x, c_y + o_y + wy[11], c_x + o_x + wx[11]); } } } /* Attempt to enqueu the grids that should be floor grids and have the borg * move onto those grids */ if (b_n == TRUE) { /* Clear the flow codes */ borg_flow_clear(); /* Enqueue the grid where I will hide */ borg_digging = TRUE; borg_flow_enqueue_grid(c_y + b_y + ny[7], c_x + b_x + nx[7]); /* Spread the flow */ borg_flow_spread(5, TRUE, FALSE, TRUE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("anti-summon corridor north type 1", GOAL_DIGGING)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_DIGGING)) return (FALSE); return (TRUE); } if (b_s == TRUE) { /* Clear the flow codes */ borg_flow_clear(); /* Enqueue the grid where I will hide */ borg_digging = TRUE; borg_flow_enqueue_grid(c_y + b_y + sy[17], c_x + b_x + sx[17]); /* Spread the flow */ borg_flow_spread(6, TRUE, FALSE, TRUE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("anti-summon corridor south type 1", GOAL_DIGGING)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_DIGGING)) return (FALSE); return (TRUE); } if (b_e == TRUE) { /* Clear the flow codes */ borg_flow_clear(); /* Enqueue the grid where I will hide */ borg_digging = TRUE; borg_flow_enqueue_grid(c_y + b_y + ey[13], c_x + b_x + ex[13]); /* Spread the flow */ borg_digging = TRUE; borg_flow_spread(5, TRUE, FALSE, TRUE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("anti-summon corridor east type 1", GOAL_DIGGING)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_DIGGING)) return (FALSE); return (TRUE); } if (b_w == TRUE) { /* Clear the flow codes */ borg_flow_clear(); /* Enqueue the grid where I will hide */ borg_digging = TRUE; borg_flow_enqueue_grid(c_y + b_y + wy[11], c_x + b_x + wx[11]); /* Spread the flow */ borg_flow_spread(5, TRUE, FALSE, TRUE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("anti-summon corridor west type 1", GOAL_DIGGING)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_DIGGING)) return (FALSE); return (TRUE); } return FALSE; } /* * Dig an anti-summon corridor * * ############## We want the borg to not dig #1 * #............# but to dig #2, and hopefully shoot from the * #######............# last #2 and try to avoid standing on #3. * #222223............# This is great for offset ball attacks but * #2#####..s.........# not for melee. Warriors need to dig a wall * ######2###########+###### adjacent to the monsters so he can swing on them. * # 1 # * # ################ # * # # # * ### # # * */ bool borg_flow_kill_corridor_2(bool viewable) { int o_y, o_x; int m_x, m_y; int f_y,f_x; int floors = 0; int b_y = 0, b_x = 0; int perma_grids = 0; borg_kill *kill; /* Efficiency -- Nothing to kill */ if (!borg_kills_cnt) return (FALSE); /* Only do this to summoners when they are close*/ if (borg_kills_summoner == -1) return (FALSE); /* Do not dig when weak. It takes too long */ if (borg_skill[BI_STR] < 17) return (FALSE); /* Hungry,starving */ if (borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK]) return (FALSE); /* Sometimes we loop on this */ if (time_this_panel > 500) return (FALSE); /* Do not dig when confused */ if (borg_skill[BI_ISCONFUSED]) return (FALSE); /* Not when darkened */ if (borg_skill[BI_CURLITE] == 0) return (FALSE); /* Not if sitting in a sea of runes */ if (borg_morgoth_position) return (FALSE); /* get the summoning monster */ kill = &borg_kills[borg_kills_summoner]; /* Consider each adjacent spot to monster*/ for (o_x = -1; o_x <= 1; o_x++) { for (o_y = -1; o_y <= 1; o_y++) { borg_grid *ag ; /* Check grids near monster */ m_x = kill->x + o_x; m_y = kill->y + o_y; /* grid the grid */ ag = &borg_grids[m_y][m_x]; /* avoid screen edgeds */ if (m_x > AUTO_MAX_X-2 || m_x < 2 || m_y > AUTO_MAX_Y-2 || m_y < 2) continue; /* Can't tunnel a non wall or permawall*/ if (ag->feat != FEAT_NONE && ag->feat < FEAT_MAGMA) continue; if (ag->feat >= FEAT_PERM_EXTRA) { perma_grids ++; continue; } /* Do not dig unless we appear strong enough to succeed or we have a digger */ if (borg_spell_legal(2, 2) || (borg_skill[BI_DIG] > BORG_DIG && borg_items[weapon_swap].tval == TV_DIGGING) || (borg_skill[BI_DIG] > BORG_DIG + 20)) { /* digging ought to work */ } else { /* do not try digging */ continue; } /* reset floors counter */ floors = 0; /* That grid must not have too many floors adjacent */ for (f_x = -1; f_x <= 1; f_x++) { for (f_y = -1; f_y <= 1; f_y++) { /* grid the grid */ ag = &borg_grids[m_y+f_y][m_x+f_x]; /* check if this neighbor is a floor */ if (ag->feat == FEAT_FLOOR || ag->feat == FEAT_BROKEN) floors ++; } } /* Do not dig if too many floors near. */ if (floors >=5) continue; /* Track the good location */ b_y = m_y; b_x = m_x; } } /* NOTE: Perma_grids count the number of grids which contain permawalls. * The borg may try to flow to an unknown grid but may get stuck on a perma * wall. This will keep him from flowing to a summoner if the summoner is * near a perma grid. The real fix would to be in the flow_spread so that * he will not flow through perma_grids. I will work on that next. */ if (b_y !=0 && b_x !=0 && perma_grids == 0) { /* Clear the flow codes */ borg_flow_clear(); /* Enqueue the grid */ borg_flow_enqueue_grid(m_y, m_x); /* Spread the flow */ borg_flow_spread(15, TRUE, FALSE, TRUE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("anti-summon corridor", GOAL_KILL)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_KILL)) return (FALSE); return (TRUE); } return FALSE; } /* * Attempt to flow to a safe grid in order to rest up properly. Following a battle, a borg needs to heal up. * He will attempt to heal up right where the fight was, but if he cannot, then he needs to retreat a bit. * This will help him find a good safe place to hide. * */ bool borg_flow_recover(bool viewable, int dist) { int i, x, y; /* Sometimes we loop on this */ if (time_this_panel > 500) return (FALSE); /* No retreating and recovering when low level */ if (borg_skill[BI_CLEVEL] <= 5) return (FALSE); /* Mana for spell casters */ if (borg_class == CLASS_MAGE || borg_class == CLASS_PRIEST) { if (borg_skill[BI_CURHP] > borg_skill[BI_MAXHP] / 3 && borg_skill[BI_CURSP] > borg_skill[BI_MAXSP] / 4 && /* Non spell casters? */ !borg_skill[BI_ISCUT] && !borg_skill[BI_ISSTUN] && !borg_skill[BI_ISHEAVYSTUN] && !borg_skill[BI_ISAFRAID]) return (FALSE); } else /* Non Spell Casters */ { /* do I need to recover some? */ if (borg_skill[BI_CURHP] > borg_skill[BI_MAXHP] / 3 && !borg_skill[BI_ISCUT] && !borg_skill[BI_ISSTUN] && !borg_skill[BI_ISHEAVYSTUN] && !borg_skill[BI_ISAFRAID]) return (FALSE); } /* If Fleeing, then do not rest */ if (goal_fleeing) return (FALSE); /* If Scumming, then do not rest */ if (borg_lunal_mode || borg_munchkin_mode) return (FALSE); /* No need if hungry */ if (borg_skill[BI_ISHUNGRY]) return (FALSE); /* Nothing found */ borg_temp_n = 0; /* Scan some known Grids * Favor the following types of grids: * 1. Happy grids */ /* look at grids within 20 grids of me */ for (y = c_y -25; y < c_y + 25; y++) { for (x = c_x -25; x < c_x + 25; x++) { /* Stay in bounds */ if (!cave_in_bounds(cave, y,x)) continue; /* Skip my own grid */ if (y == c_y && x == c_x) continue; /* Skip grids that are too close to me */ if (distance(c_y, c_x, y, x) < 7) continue; /* Is this grid a happy grid? */ if (!borg_happy_grid_bold(y, x)) continue; /* Cant rest on a wall grid. */ if (borg_grids[y][x].feat == FEAT_PERM_EXTRA || borg_grids[y][x].feat == FEAT_PERM_EXTRA || borg_grids[y][x].feat == FEAT_DOOR_HEAD + 0x00 || borg_grids[y][x].feat == FEAT_RUBBLE || borg_grids[y][x].feat == FEAT_MAGMA || borg_grids[y][x].feat == FEAT_MAGMA_K || borg_grids[y][x].feat == FEAT_PERM_INNER || borg_grids[y][x].feat == FEAT_PERM_SOLID || borg_grids[y][x].feat == FEAT_WALL_EXTRA) continue; /* Can I rest on that one? */ if (!borg_check_rest(y, x)) continue; /* Careful -- Remember it */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } } /* Nothing to kill */ if (!borg_temp_n) return (FALSE); /* Clear the flow codes */ borg_flow_clear(); /* Look through the good grids */ for (i = 0; i < borg_temp_n; i++) { /* Enqueue the grid */ borg_flow_enqueue_grid(borg_temp_y[i], borg_temp_x[i]); } /* Spread the flow */ borg_flow_spread(dist, FALSE, TRUE, FALSE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("Recover Grid", GOAL_RECOVER)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_RECOVER)) return (FALSE); return (TRUE); } /* * Prepare to "flow" towards monsters to "kill" * But in a few phases, viewable, near and far. * Note that monsters under the player are always deleted */ bool borg_flow_kill(bool viewable, int nearness) { int i, x, y, p, j,b_j= -1; int b_stair = -1; bool borg_in_hall = FALSE; int hall_y, hall_x, hall_walls = 0; bool skip_monster = FALSE; borg_grid *ag; /* Efficiency -- Nothing to kill */ if (!borg_kills_cnt) return (FALSE); /* Don't chase down town monsters when you are just starting out */ if (borg_skill[BI_CDEPTH] == 0 && borg_skill[BI_CLEVEL] < 20) return (FALSE); /* YOU ARE NOT A WARRIOR!! DON'T ACT LIKE ONE!! */ if (borg_class == CLASS_MAGE && borg_skill[BI_CLEVEL] < (borg_skill[BI_CDEPTH] ? 35 : 25)) return (FALSE); /* Not if Weak from hunger or no food */ if (borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK] || borg_skill[BI_FOOD] == 0) return (FALSE); /* Not if sitting in a sea of runes */ if (borg_morgoth_position) return (FALSE); /* Nothing found */ borg_temp_n = 0; /* check to see if in a hall, used later */ for (hall_x = -1; hall_x <= 1; hall_x++) { for (hall_y = -1; hall_y <= 1; hall_y++) { /* Acquire location */ x = hall_x + c_x; y = hall_y + c_y; ag = &borg_grids[y][x]; /* track walls */ if ( (ag->feat == FEAT_GLYPH) || ((ag->feat >= FEAT_MAGMA) && (ag->feat <= FEAT_PERM_SOLID))) { hall_walls++; } /* addem up */ if (hall_walls >= 5) borg_in_hall = TRUE; } } /* Check distance away from stairs, used later */ /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* skip the closer ones */ if (b_j >= j) continue; /* track it */ b_j =j; b_stair = i; } /* Scan the monster list */ for (i = 1; i < borg_kills_nxt; i++) { borg_kill *kill = &borg_kills[i]; int x9 = kill->x; int y9 = kill->y; int ax, ay, d; /* Skip dead monsters */ if (!kill->r_idx) continue; /* Distance components */ ax = (x9 > c_x) ? (x9 - c_x) : (c_x - x9); ay = (y9 > c_y) ? (y9 - c_y) : (c_y - y9); /* Distance */ d = MAX(ax, ay); /* dont bother flowing to an adjacent monster when I am afraid */ if (d == 1 && (borg_skill[BI_ISAFRAID] || borg_skill[BI_CRSFEAR])) continue; /* Ignore multiplying monsters */ if (goal_ignoring && !borg_skill[BI_ISAFRAID] && (rf_has(r_info[kill->r_idx].flags, RF_MULTIPLY))) continue; /* Ignore molds when low level */ if (borg_skill[BI_MAXCLEVEL] < 10 && (rf_has(r_info[kill->r_idx].flags, RF_NEVER_MOVE))) continue; /* Avoid flowing to a fight if a scary guy is on the level */ if (scaryguy_on_level) continue; /* Avoid multiplying monsters when low level */ if (borg_skill[BI_CLEVEL] < 10 && (rf_has(r_info[kill->r_idx].flags, RF_MULTIPLY))) continue; /* Hack -- ignore Maggot until later. Player will chase Maggot * down all accross the screen waking up all the monsters. Then * he is stuck in a compromised situation. */ if ((rf_has(r_info[kill->r_idx].flags, RF_UNIQUE)) && borg_skill[BI_CDEPTH] ==0 && borg_skill[BI_CLEVEL] < 5) continue; /* Access the location */ x = kill->x; y = kill->y; /* Get the grid */ ag = &borg_grids[y][x]; /* Require line of sight if requested */ if (viewable && !(ag->info & BORG_VIEW)) continue; /* Calculate danger */ p = borg_danger(y, x, 1, TRUE, FALSE); /* Hack -- Skip "deadly" monsters unless uniques*/ if (borg_skill[BI_CLEVEL] > 25 && (!rf_has(r_info->flags, RF_UNIQUE)) && p > avoidance / 2) continue; if (borg_skill[BI_CLEVEL] <= 15 && p > avoidance / 3) continue; /* Skip ones that make me wander too far */ if (b_stair != -1 && borg_skill[BI_CLEVEL] < 10) { /* Check the distance of this monster to the stair */ j = distance (track_less_y[b_stair], track_less_x[b_stair], y, x); /* skip far away monsters while I am close to stair */ if (b_j <= borg_skill[BI_CLEVEL] * 5 + 9 && j >= borg_skill[BI_CLEVEL] * 5 + 9 ) continue; } /* Hack -- Avoid getting surrounded */ if (borg_in_hall && (rf_has(r_info[kill->r_idx].flags, RF_GROUP_AI))) { /* check to see if monster is in a hall, */ for (hall_x = -1; hall_x <= 1; hall_x++) { for (hall_y = -1; hall_y <= 1; hall_y++) { if (!cave_in_bounds_fully(cave, hall_y + y,hall_x + x)) continue; ag = &borg_grids[hall_y + y][hall_x + x]; /* track walls */ if ( (ag->feat == FEAT_GLYPH) || ((ag->feat >= FEAT_MAGMA) && (ag->feat <= FEAT_PERM_SOLID))) { hall_walls++; } /* we want the monster to be in a hall also * * ######################## * ############ S ### * # @' SSS ### * # ########## SS### * # # # Ss### * # # ###### ###### * # # # # * Currently, we would like the borg to avoid * flowing to a situation like the one above. * We would like him to stay in the hall and * attack from a distance. One problem is the * lower case 's' in the corner, He will show * up as being in a corner, and the borg may * flow to it. Let's hope that is a rare case. * * The borg might flow to the 'dark' south exit * of the room. This would be dangerous for * him as well. */ /* add 'em up */ if (hall_walls < 4) { /* This monster is not in a hallway. * It may not be safe to fight. */ skip_monster = TRUE; } } } } /* Skip this one if it is just 2 grids from me and it can attack me as soon as I * move 1 grid closer to it. Note that some monsters are faster than me and it * could still cover the 1 grid and hit me. I'll fix it (based on my speed) later XXX */ if (d == 2 && /* Spacing is important */ (!(kill->ranged_attack)) && /* Ranged Attacks, don't rest. */ (!(rf_has(r_info[kill->r_idx].flags, RF_NEVER_MOVE)))) /* Skip monsters that dont chase */ { skip_monster = TRUE; } /* skip certain ones */ if (skip_monster) continue; /* Clear the flow codes */ borg_flow_clear(); /* Check the distance to stair for this proposed grid and leash*/ if (borg_flow_cost_stair(y,x, b_stair) > borg_skill[BI_CLEVEL] * 3 +9 && borg_skill[BI_CLEVEL] < 20) continue; /* Careful -- Remember it */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } /* Nothing to kill */ if (!borg_temp_n) return (FALSE); /* Clear the flow codes */ borg_flow_clear(); /* Look for something to kill */ for (i = 0; i < borg_temp_n; i++) { /* Enqueue the grid */ borg_flow_enqueue_grid(borg_temp_y[i], borg_temp_x[i]); } /* Spread the flow */ /* if we are not flowing toward monsters that we can see, make sure they */ /* are at least easily reachable. The second flag is whether or not */ /* to avoid unknown squares. This was for performance when we have ESP. */ borg_flow_spread(nearness, TRUE, !viewable, FALSE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("kill", GOAL_KILL)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_KILL)) return (FALSE); /* Success */ return (TRUE); } /* * Prepare to "flow" towards mineral veins with treasure * */ bool borg_flow_vein(bool viewable, int nearness) { int i, x, y; int b_stair = -1, j, b_j = -1; int cost = 0; int leash = borg_skill[BI_CLEVEL] * 3 + 9; borg_grid *ag; /* Efficiency -- Nothing to take */ if (!track_vein_num) return (FALSE); /* Increase leash */ if (borg_skill[BI_CLEVEL] >= 20) leash = 250; /* Not needed if rich */ if (borg_gold >= 100000) return (FALSE); /* Require digger, capacity, or skill */ if (!borg_spell_okay_fail(2, 2, 35) && borg_items[weapon_swap].tval != TV_DIGGING) return (FALSE); /* Nothing yet */ borg_temp_n = 0; /* Set the searching flag for low level borgs */ borg_needs_searching = TRUE; /* Check distance away from stairs, used later */ /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* skip the closer ones */ if (b_j >= j) continue; /* track it */ b_j =j; b_stair = i; } /* Scan the vein list */ for (i = 0; i < track_vein_num; i++) { /* Access the location */ x = track_vein_x[i]; y = track_vein_y[i]; /* Get the grid */ ag = &borg_grids[y][x]; /* Require line of sight if requested */ if (viewable && !(ag->info & BORG_VIEW)) continue; /* Clear the flow codes */ borg_flow_clear(); /* obtain the number of steps from this take to the stairs */ cost = borg_flow_cost_stair(y,x, b_stair); /* Check the distance to stair for this proposed grid, unless i am looking for very close items (leash) */ if (nearness > 5 && cost > leash && borg_skill[BI_CLEVEL] < 20) continue; /* Careful -- Remember it */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } /* Nothing to mine */ if (!borg_temp_n) return (FALSE); /* Clear the flow codes */ borg_flow_clear(); /* Look for something to take */ for (i = 0; i < borg_temp_n; i++) { /* Enqueue the grid */ borg_flow_enqueue_grid(borg_temp_y[i], borg_temp_x[i]); } /* Spread the flow */ /* if we are not flowing toward items that we can see, make sure they */ /* are at least easily reachable. The second flag is weather or not */ /* to avoid unkown squares. This was for performance. */ borg_flow_spread(nearness, TRUE, !viewable, FALSE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("vein", GOAL_TAKE)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_TAKE)) return (FALSE); /* Success */ return (TRUE); } /* * Prepare to "flow" towards objects to "take" * * Note that objects under the player are always deleted */ bool borg_flow_take(bool viewable, int nearness) { int i, x, y; int b_stair = -1, j, b_j = -1; int leash = borg_skill[BI_CLEVEL] * 3 + 9; int full_quiver; borg_grid *ag; /* Missile carry limit */ if (borg_class == CLASS_RANGER) full_quiver = (MAX_STACK_SIZE-1) * 2; else full_quiver = MAX_STACK_SIZE - 1; /* Efficiency -- Nothing to take */ if (!borg_takes_cnt) return (FALSE); /* Require one empty slot */ if (borg_items[INVEN_MAX_PACK-1].iqty) return (FALSE); /* If ScaryGuy, no chasing down items */ if (scaryguy_on_level) return (FALSE); /* If out of fuel, don't mess around */ if (!borg_skill[BI_CURLITE]) return (FALSE); /* Not if sitting in a sea of runes */ if (borg_morgoth_position) return (FALSE); /* increase leash */ if (borg_skill[BI_CLEVEL] >= 20) leash = 250; /* Starting over on count */ borg_temp_n = 0; /* Set the searching flag for low level borgs */ borg_needs_searching = TRUE; /* if the borg is running on Boosted Bravery, no * searching */ if (borg_no_retreat >= 1) borg_needs_searching = FALSE; /* Check distance away from stairs, used later */ /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* skip the closer ones */ if (b_j >= j) continue; /* track it */ b_j =j; b_stair = i; } /* Scan the object list */ for (i = 1; i < borg_takes_nxt; i++) { borg_take *take = &borg_takes[i]; int a; bool item_bad; /* Skip dead objects */ if (!take->kind) continue; /* Access the location */ x = take->x; y = take->y; /* Skip ones that make me wander too far */ if (b_stair != -1 && borg_skill[BI_CLEVEL] < 10) { /* Check the distance of this 'take' to the stair */ j = distance (track_less_y[b_stair], track_less_x[b_stair], y, x); /* skip far away takes while I am close to stair*/ if (b_j <= leash && j >= leash ) continue; } /* look to see if this is on the bad items list */ item_bad = FALSE; for (a = 0; a < bad_obj_cnt; a++) { if (x == bad_obj_x[a] && y == bad_obj_y[a]) item_bad = TRUE; } /* it is a bad item, do not track it */ if (item_bad) continue; /* skip worthless items */ if (take->value <= 0) continue; /* Get the grid */ ag = &borg_grids[y][x]; /* Require line of sight if requested */ if (viewable && !(ag->info & BORG_VIEW)) continue; /* Don't bother with ammo if I am at capacity */ if (take->tval == my_ammo_tval && borg_skill[BI_AMISSILES] >= full_quiver) continue; /* No need to chase certain things down after a certain amount. Dont chase: * Money * Other spell books * Wrong ammo */ if (borg_gold >= 500000) { if (take->tval == TV_GOLD) continue; if ((take->tval == TV_MAGIC_BOOK || take->tval == TV_PRAYER_BOOK) && take->tval != p_ptr->class->spell_book) continue; if ((take->tval == TV_SHOT || take->tval == TV_ARROW || take->tval == TV_BOLT) && take->tval != my_ammo_tval) continue; /* Restore Mana for warriors? low level potions low level scrolls */ } /* Clear the flow codes */ borg_flow_clear(); /* Check the distance to stair for this proposed grid and leash*/ if (nearness > 5 && borg_flow_cost_stair(y,x, b_stair) > leash && borg_skill[BI_CLEVEL] < 20) continue; /* Careful -- Remember it */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } /* Nothing to take */ if (!borg_temp_n) return (FALSE); /* Clear the flow codes */ borg_flow_clear(); /* Look for something to take */ for (i = 0; i < borg_temp_n; i++) { /* Enqueue the grid */ borg_flow_enqueue_grid(borg_temp_y[i], borg_temp_x[i]); } /* Spread the flow */ /* if we are not flowing toward items that we can see, make sure they */ /* are at least easily reachable. The second flag is weather or not */ /* to avoid unkown squares. This was for performance. */ borg_flow_spread(nearness, TRUE, !viewable, FALSE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("item", GOAL_TAKE)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_TAKE)) return (FALSE); /* Success */ return (TRUE); } /* * Prepare to "flow" towards special objects to "take" * * Note that objects under the player are always deleted */ bool borg_flow_take_scum(bool viewable, int nearness) { int i, x, y; int j; int b_j = -1; int b_stair = -1; borg_grid *ag; /* Efficiency -- Nothing to take */ if (!borg_takes_cnt) return (FALSE); /* Require one empty slot */ if (borg_items[INVEN_MAX_PACK-1].iqty) return (FALSE); /* Nothing yet */ borg_temp_n = 0; /* Set the searching flag for low level borgs */ borg_needs_searching = TRUE; /* Check distance away from stairs, used later */ /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* skip the closer ones */ if (b_j >= j) continue; /* track it */ b_j =j; b_stair = i; } /* Scan the object list -- set filter*/ for (i = 1; i < borg_takes_nxt; i++) { borg_take *take = &borg_takes[i]; /* Skip dead objects */ if (!take->kind) continue; /* Access the location */ x = take->x; y = take->y; /* Get the grid */ ag = &borg_grids[y][x]; /* skip worthless items */ if (take->value <= 0) continue; /* Require line of sight if requested */ if (viewable && !(ag->info & BORG_VIEW)) continue; /* Clear the flow codes */ borg_flow_clear(); /* Check the distance to stair for this proposed grid with leash */ if (borg_flow_cost_stair(y,x, b_stair) > borg_skill[BI_CLEVEL] * 3 +9 && borg_skill[BI_CLEVEL] < 20) continue; /* Careful -- Remember it */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } /* Nothing to take */ if (!borg_temp_n) return (FALSE); /* Clear the flow codes */ borg_flow_clear(); /* Look for something to take */ for (i = 0; i < borg_temp_n; i++) { /* Enqueue the grid */ borg_flow_enqueue_grid(borg_temp_y[i], borg_temp_x[i]); } /* Spread the flow */ /* if we are not flowing toward items that we can see, make sure they */ /* are at least easily reachable. The second flag is weather or not */ /* to avoid unknown squares. This was for performance. */ borg_flow_spread(nearness, TRUE, !viewable, FALSE, -1, TRUE); /* Attempt to Commit the flow */ if (!borg_flow_commit("Scum item", GOAL_TAKE)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_TAKE)) return (FALSE); /* Success */ return (TRUE); } /* * Prepare to "flow" towards special objects to "take" * * Note that objects under the player are always deleted */ bool borg_flow_take_lunal(bool viewable, int nearness) { int i, ii, x, y; int j; int b_j = -1; int b_stair = -1; borg_grid *ag; /* Efficiency -- Nothing to take */ if (!borg_takes_cnt) return (FALSE); /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* skip the closer ones */ if (b_j >= j) continue; /* track it */ b_j =j; b_stair = i; } /* Nothing yet */ borg_temp_n = 0; /* Set the searching flag for low level borgs */ borg_needs_searching = TRUE; /* Scan the object list -- set filter*/ for (i = 1; i < borg_takes_nxt; i++) { borg_take *take = &borg_takes[i]; object_kind *k_ptr = take->kind; int a; bool item_bad; /* Skip dead objects */ if (!k_ptr) continue; /* Access the location */ x = take->x; y = take->y; /* all items start bad */ item_bad = TRUE; /* Gold is good to have */ if (take->tval == TV_GOLD) { borg_note(format("# Lunal Item %s, at %d,%d", take->kind->name, y, x )); item_bad = FALSE; } /* If full can I absorb the item? */ if (borg_items[INVEN_MAX_PACK-1].iqty && item_bad == TRUE) { /* Scan the inventory */ for (ii=0; ii < INVEN_MAX_PACK-1; ii++) { /* skip empty slots */ if (!borg_items[ii].iqty) continue; /* Object should have some value */ if (take->value <= 0) continue; /* Both objects should have the same ID value */ if (take->kind->kidx != borg_items[ii].kind) continue; /* Certain types of items can stack */ if (k_ptr->sval == borg_items[ii].sval && k_ptr->tval == borg_items[ii].tval && (borg_items[ii].tval == TV_POTION || borg_items[ii].tval == TV_SCROLL || borg_items[ii].tval == TV_ROD)) { item_bad = FALSE; } } } /* Require one empty slot */ if (!borg_items[INVEN_MAX_PACK-1].iqty && item_bad == TRUE) { /* Certain Potions are worthless */ if (take->tval == TV_POTION && (take->kind->sval >= SV_POTION_INC_STR) && (take->kind->sval <= SV_POTION_DETECT_INVIS)) { borg_note(format("# Lunal Item %s, at %d,%d", take->kind->name, y, x )); item_bad = FALSE; } /* Certain insta_arts are good. Note that there is no top end of this. So if an item * were added after the last artifact, it would also be picked up. */ if (of_has(take->kind->flags, OF_INSTA_ART)) { borg_note(format("# Lunal Item %s, at %d,%d", take->kind->name, y, x )); item_bad = FALSE; } /* if scumming the start of the game, take all items to sell them */ if (borg_munchkin_start) { /* Certain known items are junky and should be ignored. Grab only * things of value */ if (take->value >= 1) item_bad = FALSE; } } /* look to see if this is on the bad items list */ for (a = 0; a < bad_obj_cnt; a++) { if (x == bad_obj_x[a] && y == bad_obj_y[a]) item_bad = TRUE; } /* it is a bad item, do not track it */ if (item_bad) continue; /* Get the grid */ ag = &borg_grids[y][x]; /* Require line of sight if requested */ if (viewable && !(ag->info & BORG_VIEW)) continue; /* Clear the flow codes */ borg_flow_clear(); /* Check the distance to stair for this proposed grid */ if (borg_flow_cost_stair(y,x, b_stair) > borg_skill[BI_CLEVEL] * 3 +9 && borg_skill[BI_CLEVEL] < 20) continue; /* Careful -- Remember it */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } /* Nothing to take */ if (!borg_temp_n) return (FALSE); /* Clear the flow codes */ borg_flow_clear(); /* Look for something to take */ for (i = 0; i < borg_temp_n; i++) { /* Enqueue the grid */ borg_flow_enqueue_grid(borg_temp_y[i], borg_temp_x[i]); } /* Spread the flow */ /* if we are not flowing toward items that we can see, make sure they */ /* are at least easily reachable. The second flag is weather or not */ /* to avoid unknown squares. This was for performance. */ borg_flow_spread(nearness, FALSE, !viewable, FALSE, -1, TRUE); /* Attempt to Commit the flow */ if (!borg_flow_commit("munchkin item", GOAL_TAKE)) return (FALSE); /* Check for monsters before walking over to the item */ if (borg_check_LIGHT()) return (TRUE); /* Take one step */ if (!borg_flow_old(GOAL_TAKE)) return (FALSE); /* Success */ return (TRUE); } /* * Determine if a grid is "interesting" (and should be explored) * * A grid is "interesting" if it is a closed door, rubble, hidden treasure, * or a visible trap, or an "unknown" grid. * or a non-perma-wall adjacent to a perma-wall. (GCV) * * b_stair is the index to the closest upstairs. */ static bool borg_flow_dark_interesting(int y, int x, int b_stair) { int oy; int ox, i; borg_grid *ag; /* Have the borg so some Searching */ borg_needs_searching = TRUE; /* Get the borg_grid */ ag = &borg_grids[y][x]; /* Explore unknown grids */ if (ag->feat == FEAT_NONE) return (TRUE); /* Efficiency -- Ignore "boring" grids */ if (ag->feat < FEAT_TRAP_HEAD) return (FALSE); /* Explore "known treasure" */ if ((ag->feat == FEAT_MAGMA_K) || (ag->feat == FEAT_QUARTZ_K)) { /* Do not dig when confused */ if (borg_skill[BI_ISCONFUSED]) return (FALSE); /* Do not bother if super rich */ if (borg_gold >= 100000) return (FALSE); /* Not when darkened */ if (borg_skill[BI_CURLITE] == 0) return (FALSE); /* Allow "stone to mud" ability */ if (borg_spell_legal(2, 2) || borg_equips_ring(SV_RING_DELVING) || borg_equips_artifact(EF_STONE_TO_MUD)) return (TRUE); /* Do not dig unless we appear strong enough to succeed or we have a digger */ if ((borg_skill[BI_DIG] > BORG_DIG && borg_items[weapon_swap].tval == TV_DIGGING) || (borg_skill[BI_DIG] > BORG_DIG + 20)) { /* digging ought to work */ } else { return (FALSE); } /* Okay */ return (TRUE); } /* "Vaults" Explore non perma-walls adjacent to a perma wall */ if (ag->feat == FEAT_WALL_EXTRA || ag->feat == FEAT_MAGMA || ag->feat == FEAT_QUARTZ) { /* Do not attempt when confused */ if (borg_skill[BI_ISCONFUSED]) return (FALSE); /* hack and cheat. No vaults on this level */ if (!vault_on_level) return (FALSE); /* AJG Do not attempt on the edge */ if(x < AUTO_MAX_X-1 && y < AUTO_MAX_Y-1 && x > 1 && y > 1) { /* scan the adjacent grids */ for (ox = -1; ox <= 1; ox++) { for (oy = -1; oy <= 1; oy++) { /* Acquire location */ ag = &borg_grids[oy+y][ox+x]; /* skip non perma grids wall */ if (ag->feat != FEAT_PERM_INNER) continue; /* Allow "stone to mud" ability */ if (borg_spell_legal(2, 2) || borg_equips_ring(SV_RING_DELVING) || borg_equips_artifact(EF_STONE_TO_MUD)) return (TRUE); /* Do not dig unless we appear strong enough to succeed or we have a digger */ if ((borg_skill[BI_DIG] > BORG_DIG && borg_items[weapon_swap].tval == TV_DIGGING) || (borg_skill[BI_DIG] > BORG_DIG + 20)) { /* digging ought to work, proceed */ } else { continue; } /* Final check on ability */ if ((borg_skill[BI_DIG] < BORG_DIG && borg_items[weapon_swap].tval == TV_DIGGING) || (borg_skill[BI_DIG] < BORG_DIG + 20)) return (FALSE); /* Glove up and dig in */ return (TRUE); } } } /* not adjacent to a GCV, Restore Grid */ ag = &borg_grids[y][x]; } /* Explore "rubble" */ if (ag->feat == FEAT_RUBBLE && !borg_skill[BI_ISWEAK]) { return (TRUE); } /* Explore "closed doors" */ if ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_DOOR_TAIL)) { /* some closed doors leave alone */ if (breeder_level) { /* Did I close this one */ for (i = 0; i < track_door_num; i++) { /* mark as icky if I closed this one */ if ((track_door_x[i] == x) && (track_door_y[i] == y)) { /* not interesting */ return (FALSE); } } } /* this door should be ok to open */ return (TRUE); } /* Explore "visible traps" */ if ((ag->feat >= FEAT_TRAP_HEAD) && (ag->feat <= FEAT_TRAP_TAIL)) { /* Do not disarm when blind */ if (borg_skill[BI_ISBLIND]) return (FALSE); /* Do not disarm when confused */ if (borg_skill[BI_ISCONFUSED]) return (FALSE); /* Do not disarm when hallucinating */ if (borg_skill[BI_ISIMAGE]) return (FALSE); /* Do not flow without lite */ if (borg_skill[BI_CURLITE] == 0) return (FALSE); /* Do not disarm trap doors on level 99 */ if (borg_skill[BI_CDEPTH] == 99 && ag->feat == FEAT_TRAP_HEAD) return (FALSE); /* Do not disarm when you could end up dead */ if (borg_skill[BI_CURHP] < 60) return (FALSE); /* Do not disarm when clumsy */ if (borg_skill[BI_DIS] < 30 && borg_skill[BI_CLEVEL] < 20 ) return (FALSE); if (borg_skill[BI_DIS] < 45 && borg_skill[BI_CLEVEL] < 10 ) return (FALSE); /* Do not explore if a Scaryguy on the Level */ if (scaryguy_on_level) return (FALSE); /* NOTE: the flow code allows a borg to flow through a trap and so he may * still try to disarm one on his way to the other interesting grid. If mods * are made to the above criteria for disarming traps, then mods must also be * made to borg_flow_spread() and borg_flow_direct() */ /* Okay */ return (TRUE); } /* Ignore other grids */ return (FALSE); } /* * Determine if a grid is "reachable" (and can be explored) */ static bool borg_flow_dark_reachable(int y, int x) { int j; borg_grid *ag; /* Scan neighbors */ for (j = 0; j < 8; j++) { int y2 = y + ddy_ddd[j]; int x2 = x + ddx_ddd[j]; /* Get the grid */ ag = &borg_grids[y2][x2]; /* Skip unknown grids (important) */ if (ag->feat == FEAT_NONE) continue; /* Accept known floor grids */ if (borg_cave_floor_grid(ag)) return (TRUE); } /* Failure */ return (FALSE); } /* Dig a straight Tunnel to a close monster */ bool borg_flow_kill_direct(bool viewable, bool twitchy) { int i; int b_i = -1; int d; int b_d = MAX_SIGHT; borg_kill *kill; /* Do not dig when weak. It takes too long */ if (!twitchy && ((borg_skill[BI_DIG] < BORG_DIG && borg_items[weapon_swap].tval == TV_DIGGING) || (borg_skill[BI_DIG] < BORG_DIG + 20))) return (FALSE); /* Not if Weak from hunger or no food */ if (!twitchy && (borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK] || borg_skill[BI_FOOD] == 0)) return (FALSE); /* Only when sitting for too long or twitchy */ if (!twitchy && borg_t - borg_began < 3000 && borg_times_twitch < 5) return (FALSE); /* Do not dig when confused */ if (borg_skill[BI_ISCONFUSED]) return (FALSE); /* Not when darkened */ if (borg_skill[BI_CURLITE] == 0) return (FALSE); /* Efficiency -- Nothing to kill */ if (borg_kills_cnt) { /* Scan the monsters */ for (i = 1; i < borg_kills_nxt; i++) { kill = &borg_kills[i]; /* Skip "dead" monsters */ if (!kill->r_idx) continue; /* Distance away */ d = distance(kill->y, kill->x, c_y, c_x); /* Track closest one */ if (d > b_d) continue; /* Track it */ b_i = i; b_d = d; } } /* If no Kill, then pick the center of the map */ if (b_i == -1) { /* Clear the flow codes */ borg_flow_clear(); /* Enqueue the grid */ borg_flow_enqueue_grid(AUTO_MAX_Y / 2, AUTO_MAX_X / 2); /* Spread the flow */ borg_flow_spread(150, TRUE, FALSE, TRUE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("center direct", GOAL_KILL)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_KILL)) return (FALSE); return (TRUE); } if (b_i) /* don't want it near permawall */ { /* get the closest monster */ kill = &borg_kills[b_i]; /* Clear the flow codes */ borg_flow_clear(); /* Enqueue the grid */ borg_flow_enqueue_grid(kill->y, kill->x); /* Spread the flow */ borg_flow_spread(15, TRUE, FALSE, TRUE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("kill direct", GOAL_KILL)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_KILL)) return (FALSE); return (TRUE); } return FALSE; } /* * Place a "direct path" into the flow array, checking danger * * Modify the "cost" array in such a way that from any point on * one "direct" path from the player to the given grid, as long * as the rest of the path is "safe" and "clear", the Borg will * walk along the path to the given grid. * * This function is used by "borg_flow_dark_1()" to provide an * optimized "flow" during the initial exploration of a level. * It is also used by "borg_flow_dark_2()" in a similar fashion. */ static void borg_flow_direct(int y, int x) { int n = 0; int x1, y1, x2, y2; int ay, ax; int shift; int p, fear = 0; borg_grid *ag; /* Avoid icky grids */ if (borg_data_icky->data[y][x]) return; /* Unknown */ if (!borg_data_know->data[y][x]) { /* Mark as known */ borg_data_know->data[y][x] = TRUE; /* Get the danger */ p = borg_danger(y, x, 1, TRUE, FALSE); /* Increase bravery */ if (borg_skill[BI_MAXCLEVEL] == 50) fear = avoidance * 5 / 10; if (borg_skill[BI_MAXCLEVEL] != 50) fear = avoidance * 3 / 10; if (scaryguy_on_level) fear = avoidance * 2; if (unique_on_level && vault_on_level && borg_skill[BI_MAXCLEVEL] == 50) fear = avoidance * 3; if (scaryguy_on_level && borg_skill[BI_CLEVEL] <= 5) fear = avoidance * 3; if (goal_ignoring) fear = avoidance * 5; if (borg_t - borg_began > 5000) fear = avoidance * 25; if (borg_skill[BI_FOOD] == 0) fear = avoidance * 100; /* Normal in town */ if (borg_skill[BI_CLEVEL] == 0) fear = avoidance * 1 / 10; /* Mark dangerous grids as icky */ if (p > fear) { /* Icky */ borg_data_icky->data[y][x] = TRUE; /* Avoid */ return; } } /* Save the flow cost (zero) */ borg_data_cost->data[y][x] = 0; /* Save "origin" */ y1 = y; x1 = x; /* Save "destination" */ y2 = c_y; x2 = c_x; /* Calculate distance components */ ay = (y2 < y1) ? (y1 - y2) : (y2 - y1); ax = (x2 < x1) ? (x1 - x2) : (x2 - x1); /* Path */ while (1) { /* Check for arrival at player */ if ((x == x2) && (y == y2)) return; /* Next */ n++; /* Move mostly vertically */ if (ay > ax) { /* Extract a shift factor XXX */ shift = (n * ax + (ay-1) / 2) / ay; /* Sometimes move along the minor axis */ x = (x2 < x1) ? (x1 - shift) : (x1 + shift); /* Always move along major axis */ y = (y2 < y1) ? (y1 - n) : (y1 + n); } /* Move mostly horizontally */ else { /* Extract a shift factor XXX */ shift = (n * ay + (ax-1) / 2) / ax; /* Sometimes move along the minor axis */ y = (y2 < y1) ? (y1 - shift) : (y1 + shift); /* Always move along major axis */ x = (x2 < x1) ? (x1 - n) : (x1 + n); } /* Access the grid */ ag = &borg_grids[y][x]; /* Ignore "wall" grids */ if (!borg_cave_floor_grid(ag)) return; /* Avoid Traps if low level-- unless brave or scaryguy. */ if (ag->feat >= FEAT_TRAP_HEAD && ag->feat <= FEAT_TRAP_TAIL && avoidance <= borg_skill[BI_CURHP] && !scaryguy_on_level) { /* Do not disarm when you could end up dead */ if (borg_skill[BI_CURHP] < 60) return; /* Do not disarm when clumsy */ if (borg_skill[BI_DIS] < 30 && borg_skill[BI_CLEVEL] < 20 ) return; if (borg_skill[BI_DIS] < 45 && borg_skill[BI_CLEVEL] < 10 ) return; } /* Abort at "icky" grids */ if (borg_data_icky->data[y][x]) return; /* Analyze every grid once */ if (!borg_data_know->data[y][x]) { /* Mark as known */ borg_data_know->data[y][x] = TRUE; /* Get the danger */ p = borg_danger(y, x, 1, TRUE, FALSE); /* Increase bravery */ if (borg_skill[BI_MAXCLEVEL] == 50) fear = avoidance * 5 / 10; if (borg_skill[BI_MAXCLEVEL] != 50) fear = avoidance * 3 / 10; if (scaryguy_on_level) fear = avoidance * 2; if (unique_on_level && vault_on_level && borg_skill[BI_MAXCLEVEL] == 50) fear = avoidance * 3; if (scaryguy_on_level && borg_skill[BI_CLEVEL] <= 5) fear = avoidance * 3; if (goal_ignoring) fear = avoidance * 5; if (borg_t - borg_began > 5000) fear = avoidance * 25; if (borg_skill[BI_FOOD] == 0) fear = avoidance * 100; /* Normal in town */ if (borg_skill[BI_CLEVEL] == 0) fear = avoidance * 1 / 10; /* Avoid dangerous grids (forever) */ if (p > fear) { /* Mark as icky */ borg_data_icky->data[y][x] = TRUE; /* Abort */ return; } } /* Abort "pointless" paths if possible */ if (borg_data_cost->data[y][x] <= n) break; /* Save the new flow cost */ borg_data_cost->data[y][x] = n; } } /* Currently not used, I thought I might need it for anti-summoning */ extern void borg_flow_direct_dig(int y, int x) { int n = 0; int x1, y1, x2, y2; int ay, ax; int shift; int p, fear = 0; #if 0 /* Avoid icky grids */ if (borg_data_icky->data[y][x]) return; /* Unknown */ if (!borg_data_know->data[y][x]) { /* Mark as known */ borg_data_know->data[y][x] = TRUE; /* Mark dangerous grids as icky */ if (borg_danger(y, x, 1, TRUE, FALSE) > avoidance / 3) { /* Icky */ borg_data_icky->data[y][x] = TRUE; /* Avoid */ return; } } #endif /* Save the flow cost (zero) */ borg_data_cost->data[y][x] = 0; /* Save "origin" */ y1 = y; x1 = x; /* Save "destination" */ y2 = c_y; x2 = c_x; /* Calculate distance components */ ay = (y2 < y1) ? (y1 - y2) : (y2 - y1); ax = (x2 < x1) ? (x1 - x2) : (x2 - x1); /* Path */ while (1) { /* Check for arrival at player */ if ((x == x2) && (y == y2)) return; /* Next */ n++; /* Move mostly vertically */ if (ay > ax) { /* Extract a shift factor XXX */ shift = (n * ax + (ay-1) / 2) / ay; /* Sometimes move along the minor axis */ x = (x2 < x1) ? (x1 - shift) : (x1 + shift); /* Always move along major axis */ y = (y2 < y1) ? (y1 - n) : (y1 + n); } /* Move mostly horizontally */ else { /* Extract a shift factor XXX */ shift = (n * ay + (ax-1) / 2) / ax; /* Sometimes move along the minor axis */ y = (y2 < y1) ? (y1 - shift) : (y1 + shift); /* Always move along major axis */ x = (x2 < x1) ? (x1 - n) : (x1 + n); } /* Abort at "icky" grids */ if (borg_data_icky->data[y][x]) return; /* Analyze every grid once */ if (!borg_data_know->data[y][x]) { /* Mark as known */ borg_data_know->data[y][x] = TRUE; /* Get the danger */ p = borg_danger(y, x, 1, TRUE, FALSE); /* Increase bravery */ if (borg_skill[BI_MAXCLEVEL] == 50) fear = avoidance * 5 / 10; if (borg_skill[BI_MAXCLEVEL] != 50) fear = avoidance * 3 / 10; if (scaryguy_on_level) fear = avoidance * 2; if (unique_on_level && vault_on_level && borg_skill[BI_MAXCLEVEL] == 50) fear = avoidance * 3; if (scaryguy_on_level && borg_skill[BI_CLEVEL] <= 5) fear = avoidance * 3; if (goal_ignoring) fear = avoidance * 5; if (borg_t - borg_began > 5000) fear = avoidance * 25; if (borg_skill[BI_FOOD] == 0) fear = avoidance * 100; /* Normal in town */ if (borg_skill[BI_CLEVEL] == 0) fear = avoidance * 1 / 10; /* Avoid dangerous grids (forever) */ if (p > fear) { /* Mark as icky */ borg_data_icky->data[y][x] = TRUE; /* Abort */ return; } } /* Abort "pointless" paths if possible */ if (borg_data_cost->data[y][x] <= n) break; /* Save the new flow cost */ borg_data_cost->data[y][x] = n; } } /* * Hack -- mark off the edges of a rectangle as "avoid" or "clear" */ static void borg_flow_border(int y1, int x1, int y2, int x2, bool stop) { int x, y; /* Scan west/east edges */ for (y = y1; y <= y2; y++) { /* Avoid/Clear west edge */ borg_data_know->data[y][x1] = stop; borg_data_icky->data[y][x1] = stop; /* Avoid/Clear east edge */ borg_data_know->data[y][x2] = stop; borg_data_icky->data[y][x2] = stop; } /* Scan north/south edges */ for (x = x1; x <= x2; x++) { /* Avoid/Clear north edge */ borg_data_know->data[y1][x] = stop; borg_data_icky->data[y1][x] = stop; /* Avoid/Clear south edge */ borg_data_know->data[y2][x] = stop; borg_data_icky->data[y2][x] = stop; } } /* * Prepare to "flow" towards "interesting" grids (method 1) * * This function examines the torch-lit grids for "interesting" grids. */ static bool borg_flow_dark_1(int b_stair) { int i; int cost; int x, y; /* Hack -- not in town */ if (!borg_skill[BI_CDEPTH]) return (FALSE); /* Reset */ borg_temp_n = 0; /* Scan torch-lit grids */ for (i = 0; i < borg_LIGHT_n; i++) { y = borg_LIGHT_y[i]; x = borg_LIGHT_x[i]; /* Skip "boring" grids (assume reachable) */ if (!borg_flow_dark_interesting(y, x, b_stair)) continue; /* Clear the flow codes */ borg_flow_clear(); /* obtain the number of steps from this take to the stairs */ cost = borg_flow_cost_stair(y,x, b_stair); /* Check the distance to stair for this proposed grid if dangerous */ if (borg_skill[BI_CDEPTH] >= borg_skill[BI_CLEVEL] - 5 && cost > borg_skill[BI_CLEVEL] * 3 +9 && borg_skill[BI_CLEVEL] < 20) continue; /* Careful -- Remember it */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } /* Nothing */ if (!borg_temp_n) return (FALSE); /* Wipe icky codes from grids if needed */ if (goal_ignoring || scaryguy_on_level) borg_danger_wipe = TRUE; /* Clear the flow codes */ borg_flow_clear(); /* Create paths to useful grids */ for (i = 0; i < borg_temp_n; i++) { y = borg_temp_y[i]; x = borg_temp_x[i]; /* Create a path */ borg_flow_direct(y, x); } /* Attempt to Commit the flow */ if (!borg_flow_commit(NULL, GOAL_DARK)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_DARK)) return (FALSE); /* Forget goal */ /* goal = 0; */ /* Success */ return (TRUE); } /* * Prepare to "flow" towards "interesting" grids (method 2) * * This function is only used when the player is at least 4 grids away * from the outer dungeon wall, to prevent any nasty memory errors. * * This function examines the grids just outside the torch-lit grids * for "unknown" grids, and flows directly towards them (one step). */ static bool borg_flow_dark_2(int b_stair) { int i, r; int cost; int x, y; borg_grid *ag; /* Hack -- not in town */ if (!borg_skill[BI_CDEPTH]) return (FALSE); /* Set the searching flag for low level borgs */ borg_needs_searching = TRUE; /* Maximal radius */ r = borg_skill[BI_CURLITE] + 1; /* Reset */ borg_temp_n = 0; /* Four directions */ for (i = 0; i < 4; i++) { y = c_y + ddy_ddd[i] * r; x = c_x + ddx_ddd[i] * r; /* Check legality */ if (y < 1) continue; if (x < 1) continue; if (y > AUTO_MAX_Y - 2) continue; if (x > AUTO_MAX_X - 2) continue; /* Acquire grid */ ag = &borg_grids[y][x]; /* Require unknown */ if (ag->feat != FEAT_NONE) continue; /* Require viewable */ if (!(ag->info & BORG_VIEW)) continue; /* if it makes me wander, skip it */ /* Clear the flow codes */ borg_flow_clear(); /* obtain the number of steps from this take to the stairs */ cost = borg_flow_cost_stair(y,x, b_stair); /* Check the distance to stair for this proposed grid */ if (borg_skill[BI_CDEPTH] >= borg_skill[BI_CLEVEL] - 5 && cost > borg_skill[BI_CLEVEL] * 3 +9 && borg_skill[BI_CLEVEL] < 20) continue; /* Careful -- Remember it */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } /* Nothing */ if (!borg_temp_n) return (FALSE); /* Wipe icky codes from grids if needed */ if (goal_ignoring || scaryguy_on_level) borg_danger_wipe = TRUE; /* Clear the flow codes */ borg_flow_clear(); /* Create paths to useful grids */ for (i = 0; i < borg_temp_n; i++) { y = borg_temp_y[i]; x = borg_temp_x[i]; /* Create a path */ borg_flow_direct(y, x); } /* Attempt to Commit the flow */ if (!borg_flow_commit(NULL, GOAL_DARK)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_DARK)) return (FALSE); /* Forget goal */ /* goal = 0; */ /* Success */ return (TRUE); } /* * Prepare to "flow" towards "interesting" grids (method 3) * * Note the use of a limit on the "depth" of the flow, and of the flag * which avoids "unknown" grids when calculating the flow, both of which * help optimize this function to only handle "easily reachable" grids. * * The "borg_temp" array is much larger than any "local region". */ static bool borg_flow_dark_3(int b_stair) { int i; int cost; int x, y; int x1, y1, x2, y2; /* Hack -- not in town */ if (!borg_skill[BI_CDEPTH]) return (FALSE); /* Local region */ y1 = c_y - 4; x1 = c_x - 4; y2 = c_y + 4; x2 = c_x + 4; /* Restrict to "legal" grids */ if (y1 < 1) y1 = 1; if (x1 < 1) x1 = 1; if (y2 > AUTO_MAX_Y - 2) y2 = AUTO_MAX_Y - 2; if (x2 > AUTO_MAX_X - 2) x2 = AUTO_MAX_X - 2; /* Reset */ borg_temp_n = 0; /* Examine the region */ for (y = y1; y <= y2; y++) { /* Examine the region */ for (x = x1; x <= x2; x++) { /* Skip "boring" grids */ if (!borg_flow_dark_interesting(y, x, b_stair)) continue; /* Skip "unreachable" grids */ if (!borg_flow_dark_reachable(y, x)) continue; /* Clear the flow codes */ borg_flow_clear(); /* obtain the number of steps from this take to the stairs */ cost = borg_flow_cost_stair(y,x, b_stair); /* Check the distance to stair for this proposed grid */ if (borg_skill[BI_CDEPTH] >= borg_skill[BI_CLEVEL] - 5 && cost > borg_skill[BI_CLEVEL] * 3 + 9 && borg_skill[BI_CLEVEL] < 20) continue; /* Careful -- Remember it */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } } /* Nothing interesting */ if (!borg_temp_n) return (FALSE); /* Wipe icky codes from grids if needed */ if (goal_ignoring || scaryguy_on_level) borg_danger_wipe = TRUE; /* Clear the flow codes */ borg_flow_clear(); /* Enqueue useful grids */ for (i = 0; i < borg_temp_n; i++) { y = borg_temp_y[i]; x = borg_temp_x[i]; /* Enqueue the grid */ borg_flow_enqueue_grid(y, x); } /* Spread the flow (limit depth) */ borg_flow_spread(5, FALSE, TRUE, FALSE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit(NULL, GOAL_DARK)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_DARK)) return (FALSE); /* Success */ return (TRUE); } /* * Prepare to "flow" towards "interesting" grids (method 4) * * Note that we avoid grids close to the edge of the panel, since they * induce panel scrolling, which is "expensive" in terms of CPU usage, * and because this allows us to "expand" the border by several grids * to lay down the "avoidance" border in known legal grids. * * We avoid paths that would take us into different panels by setting * the "icky" flag for the "border" grids to prevent path construction, * and then clearing them when done, to prevent confusion elsewhere. * * The "borg_temp" array is large enough to hold one panel full of grids. */ static bool borg_flow_dark_4(int b_stair) { int i, x, y; int cost; int x1, y1, x2, y2; int leash = 250; /* Hack -- not in town */ if (!borg_skill[BI_CDEPTH]) return (FALSE); /* Hack -- Not if a vault is on the level */ if (vault_on_level) return (FALSE); /* Local region */ y1 = c_y - 11; x1 = c_x - 11; y2 = c_y + 11; x2 = c_x + 11; /* Restrict to "legal" grids */ if (y1 < 1) y1 = 1; if (x1 < 1) x1 = 1; if (y2 > AUTO_MAX_Y - 2) y2 = AUTO_MAX_Y - 2; if (x2 > AUTO_MAX_X - 2) x2 = AUTO_MAX_X - 2; /* Nothing yet */ borg_temp_n = 0; /* check the leash length */ if (borg_skill[BI_CDEPTH] >= borg_skill[BI_CLEVEL] - 5) leash = borg_skill[BI_CLEVEL] * 3 + 9; /* Examine the panel */ for (y = y1; y <= y2; y++) { /* Examine the panel */ for (x = x1; x <= x2; x++) { /* Skip "boring" grids */ if (!borg_flow_dark_interesting(y, x, b_stair)) continue; /* Skip "unreachable" grids */ if (!borg_flow_dark_reachable(y, x)) continue; /* Clear the flow codes */ borg_flow_clear(); /* obtain the number of steps from this take to the stairs */ cost = borg_flow_cost_stair(y,x, b_stair); /* Check the distance to stair for this proposed grid */ if (cost > borg_skill[BI_CLEVEL] * 3 +9 && borg_skill[BI_CLEVEL] < 20) continue; /* Careful -- Remember it */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; } } /* Nothing useful */ if (!borg_temp_n) return (FALSE); /* Wipe icky codes from grids if needed */ if (goal_ignoring || scaryguy_on_level) borg_danger_wipe = TRUE; /* Clear the flow codes */ borg_flow_clear(); /* Enqueue useful grids */ for (i = 0; i < borg_temp_n; i++) { y = borg_temp_y[i]; x = borg_temp_x[i]; /* Enqueue the grid */ borg_flow_enqueue_grid(y, x); } /* Expand borders */ y1--; x1--; y2++; x2++; /* Avoid the edges */ borg_flow_border(y1, x1, y2, x2, TRUE); /* Spread the flow (limit depth Leash) */ if (borg_skill[BI_CLEVEL] < 15) { /* Short Leash */ borg_flow_spread(leash, TRUE, TRUE, FALSE, -1, FALSE); } else { /* Long Leash */ borg_flow_spread(250, TRUE, TRUE, FALSE, -1, FALSE); } /* Clear the edges */ borg_flow_border(y1, x1, y2, x2, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("dark-4", GOAL_DARK)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_DARK)) return (FALSE); /* Success */ return (TRUE); } /* * Prepare to "flow" towards "interesting" grids (method 5) */ static bool borg_flow_dark_5(int b_stair) { int i, x, y; int cost; int leash = 250; /* Hack -- not in town */ if (!borg_skill[BI_CDEPTH]) return (FALSE); /* Nothing yet */ borg_temp_n = 0; /* check the leash length */ if (borg_skill[BI_CDEPTH] >= borg_skill[BI_CLEVEL] - 5) leash = borg_skill[BI_CLEVEL] * 3 + 9; /* Examine every "legal" grid */ for (y = 1; y < AUTO_MAX_Y-1; y++) { for (x = 1; x < AUTO_MAX_X-1; x++) { /* Skip "boring" grids */ if (!borg_flow_dark_interesting(y, x, b_stair)) continue; /* Skip "unreachable" grids */ if (!borg_flow_dark_reachable(y, x)) continue; /* Clear the flow codes */ borg_flow_clear(); /* obtain the number of steps from this take to the stairs */ cost = borg_flow_cost_stair(y,x, b_stair); /* Check the distance to stair for this proposed grid */ if (cost > borg_skill[BI_CLEVEL] * 3 +9 && borg_skill[BI_CLEVEL] < 20) continue; /* Careful -- Remember it */ borg_temp_x[borg_temp_n] = x; borg_temp_y[borg_temp_n] = y; borg_temp_n++; /* Paranoia -- Check for overflow */ if (borg_temp_n == AUTO_TEMP_MAX) { /* Hack -- Double break */ y = AUTO_MAX_Y; x = AUTO_MAX_X; break; } } } /* Nothing useful */ if (!borg_temp_n) return (FALSE); /* Wipe icky codes from grids if needed */ if (goal_ignoring || scaryguy_on_level) borg_danger_wipe = TRUE; /* Clear the flow codes */ borg_flow_clear(); /* Enqueue useful grids */ for (i = 0; i < borg_temp_n; i++) { y = borg_temp_y[i]; x = borg_temp_x[i]; /* Enqueue the grid */ borg_flow_enqueue_grid(y, x); } /* Spread the flow */ if (borg_skill[BI_CLEVEL] <= 5 && avoidance <= borg_skill[BI_CURHP]) { /* Short Leash */ borg_flow_spread(leash, TRUE, TRUE, FALSE, -1, FALSE); } else if (borg_skill[BI_CLEVEL] <= 30 && avoidance <= borg_skill[BI_CURHP]) { /* Short Leash */ borg_flow_spread(leash, TRUE, TRUE, FALSE, -1, FALSE); } else { /* Long Leash */ borg_flow_spread(250, TRUE, TRUE, FALSE, -1, FALSE); } /* Attempt to Commit the flow */ if (!borg_flow_commit("dark-5", GOAL_DARK)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_DARK)) return (FALSE); /* Success */ return (TRUE); } /* * Prepare to "flow" towards "interesting" grids * * The "exploration" routines are broken into "near" and "far" * exploration, and each set is chosen via the flag below. */ bool borg_flow_dark(bool neer) { int i; int x, y, j, b_j = -1; int b_stair = -1; /* Not if sitting in a sea of runes and we saw Morgoth recently */ if (borg_morgoth_position && morgoth_on_level) return (FALSE); /* Paranoia */ if (borg_flow_dark_interesting(c_y, c_x, -1)) { return (FALSE); } /* Check distance away from stairs, used later */ /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* skip the closer ones */ if (b_j >= j) continue; /* track it */ b_j =j; b_stair = i; } /* Near */ if (neer) { /* Method 1 */ if (borg_flow_dark_1(b_stair)) return (TRUE); /* Method 2 */ if (borg_flow_dark_2(b_stair)) return (TRUE); /* Method 3 */ if (borg_flow_dark_3(b_stair)) return (TRUE); } /* Far */ else { /* Method 4 */ if (borg_flow_dark_4(b_stair)) return (TRUE); /* Method 5 */ if (borg_flow_dark_5(b_stair)) return (TRUE); } /* Fail */ return (FALSE); } /* * Hack -- spastic searching */ static byte spastic_x; static byte spastic_y; /* * Search carefully for secret doors and such */ bool borg_flow_spastic(bool bored) { int cost; int i, x, y, v; int b_x = c_x; int b_y = c_y; int b_v = -1; int j, b_j = -1; int b_stair = -1; borg_grid *ag; /* Hack -- not in town */ if (!borg_skill[BI_CDEPTH]) return (FALSE); /* Hack -- Not if starving */ if (borg_skill[BI_ISWEAK]) return (FALSE); /* Hack -- Not if hopeless unless twitchy */ if (borg_t - borg_began > 3000 && avoidance <= borg_skill[BI_CURHP]) return (FALSE); /* Not bored */ if (!bored) { /* Look around for danger */ int p = borg_danger(c_y, c_x, 1, TRUE, FALSE); /* Avoid searching when in danger */ if (p > avoidance / 4) return (FALSE); } /* Check distance away from stairs, used later */ /* Check for an existing "up stairs" */ for (i = 0; i < track_less_num; i++) { x = track_less_x[i]; y = track_less_y[i]; /* How far is the nearest up stairs */ j = distance(c_y, c_x, y, x); /* skip the closer ones */ if (b_j >= j) continue; /* track it */ b_j =j; b_stair = i; } /* We have arrived */ if ((spastic_x == c_x) && (spastic_y == c_y)) { /* Cancel */ spastic_x = 0; spastic_y = 0; ag = &borg_grids[c_y][c_x]; /* Take note */ borg_note(format("# Spastic Searching at (%d,%d)...value:%d", c_x, c_y, ag->xtra)); /* Count searching */ for (i = 0; i < 9; i++) { /* Extract the location */ int xx = c_x + ddx_ddd[i]; int yy = c_y + ddy_ddd[i]; /* Current grid */ ag = &borg_grids[yy][xx]; /* Tweak -- Remember the search */ if (ag->xtra < 100) ag->xtra += 5; } /* Tweak -- Search a little */ borg_keypress('0'); borg_keypress('5'); borg_keypress(KC_ENTER); borg_keypress('s'); /* Success */ return (TRUE); } /* Reverse flow */ borg_flow_reverse(250, TRUE, FALSE, FALSE, -1, FALSE); /* Scan the entire map */ for (y = 1; y < AUTO_MAX_Y-1; y++) { for (x = 1; x < AUTO_MAX_X-1; x++) { borg_grid *ag_ptr[8]; int wall = 0; int supp = 0; int diag = 0; int monsters = 0; /* Acquire the grid */ ag = &borg_grids[y][x]; /* Skip unknown grids */ if (ag->feat == FEAT_NONE) continue; /* Skip trap grids */ if (ag->feat == FEAT_TRAP_HEAD) continue; /* Skip walls/doors */ if (!borg_cave_floor_grid(ag)) continue; /* Acquire the cost */ cost = borg_data_cost->data[y][x]; /* Skip "unreachable" grids */ if (cost >= 250) continue; /* Skip grids that are really far away. He probably * won't find anything and it takes lots of turns */ if (cost >= 25 && borg_skill[BI_CLEVEL] < 30) continue; if (cost >= 50) continue; /* Tweak -- Limit total searches */ if (ag->xtra >= 50) continue; if (ag->xtra >= borg_skill[BI_CLEVEL]) continue; /* Limit initial searches until bored */ if (!bored && (ag->xtra > 5)) continue; /* Avoid searching detected sectors */ if (borg_detect_door[y/PANEL_HGT][x/PANEL_WID]) continue; /* Skip ones that make me wander too far unless twitchy (Leash)*/ if (b_stair != -1 && borg_skill[BI_CLEVEL] < 15 && avoidance <= borg_skill[BI_CURHP]) { /* Check the distance of this grid to the stair */ j = distance (track_less_y[b_stair], track_less_x[b_stair], y, x); /* Distance of me to the stairs */ b_j = distance (c_y, c_x, track_less_y[b_stair], track_less_x[b_stair]); /* skip far away grids while I am close to stair*/ if (b_j <= borg_skill[BI_CLEVEL] * 3 + 9 && j >= borg_skill[BI_CLEVEL] * 3 + 9 ) continue; /* If really low level don't do this much */ if (borg_skill[BI_CLEVEL] <= 3 && b_j <= borg_skill[BI_CLEVEL] + 9 && j >= borg_skill[BI_CLEVEL] + 9 ) continue; /* Do not Venture too far from stair */ if (borg_skill[BI_CLEVEL] <= 3 && j >= borg_skill[BI_CLEVEL] + 5 ) continue; /* Do not Venture too far from stair */ if (borg_skill[BI_CLEVEL] <= 10 && j >= borg_skill[BI_CLEVEL] + 9 ) continue; } /* Extract adjacent locations */ for (i = 0; i < 8; i++) { /* Extract the location */ int xx = x + ddx_ddd[i]; int yy = y + ddy_ddd[i]; /* Get the grid contents */ ag_ptr[i] = &borg_grids[yy][xx]; } /* Count possible door locations */ for (i = 0; i < 4; i++) { ag = ag_ptr[i]; if (ag->feat >= FEAT_WALL_EXTRA) wall++; } /* No possible secret doors */ if (wall < 1) continue; /* Count supporting evidence for secret doors */ for (i = 0; i < 4; i++) { ag = ag_ptr[i]; /* Rubble */ if (ag->feat == FEAT_RUBBLE) continue; /* Walls, Doors */ if (((ag->feat >= FEAT_SECRET) && (ag->feat <= FEAT_PERM_SOLID)) || ((ag->feat == FEAT_OPEN) || (ag->feat == FEAT_BROKEN)) || ((ag->feat >= FEAT_DOOR_HEAD) && (ag->feat <= FEAT_DOOR_TAIL))) { supp++; } } /* Count supporting evidence for secret doors */ for (i = 4; i < 8; i++) { ag = ag_ptr[i]; /* Rubble */ if (ag->feat == FEAT_RUBBLE) continue; /* Walls */ if (ag->feat >= FEAT_SECRET) { diag++; } } /* No possible secret doors */ if (diag < 2) continue; /* Count monsters */ for (i = 0; i < 8; i++) { ag = ag_ptr[i]; /* monster */ if (ag->kill) monsters ++; } /* No search near monsters */ if (monsters >= 1) continue; /* Tweak -- Reward walls, punish visitation, distance, time on level */ v = (supp * 500) + (diag * 100) - (ag->xtra * 40) - (cost * 2) - (borg_t - borg_began); /* Punish low level and searching too much */ v -= (50 - borg_skill[BI_CLEVEL]) * 5; /* The grid is not searchable */ if (v <= 0) continue; /* Tweak -- Minimal interest until bored */ if (!bored && (v < 1500)) continue; /* Track "best" grid */ if ((b_v >= 0) && (v < b_v)) continue; /* Save the data */ b_v = v; b_x = x; b_y = y; } } /* Clear the flow codes */ borg_flow_clear(); /* Hack -- Nothing found */ if (b_v < 0) return (FALSE); /* Access grid */ ag = &borg_grids[b_y][b_x]; /* Memorize */ spastic_x = b_x; spastic_y = b_y; /* Enqueue the grid */ borg_flow_enqueue_grid(b_y, b_x); /* Spread the flow */ borg_flow_spread(250, TRUE, FALSE, FALSE, -1, FALSE); /* Attempt to Commit the flow */ if (!borg_flow_commit("spastic", GOAL_XTRA)) return (FALSE); /* Take one step */ if (!borg_flow_old(GOAL_XTRA)) return (FALSE); /* Success */ return (TRUE); } /* * Initialize this file */ void borg_init_6(void) { /* Nothing */ } #ifdef MACINTOSH static int HACK = 0; #endif angband-3.5.1/src/borg/borg3.c0000644000175000017500000032707012456456606015351 0ustar chriscchrisc/* File: borg3.c */ /* Purpose: Object and Spell routines for the Borg -BEN- */ #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #ifdef ALLOW_BORG #include "borg1.h" #include "borg3.h" /* * This file helps the Borg analyze "objects" and "shops", and to * deal with objects and spells. */ /* * Some variables */ borg_item *borg_items; /* Current "inventory" */ borg_shop *borg_shops; /* Current "shops" */ /* * Safety arrays for simulating possible worlds */ borg_item *safe_items; /* Safety "inventory" */ borg_item *safe_home; /* Safety "home stuff" */ borg_shop *safe_shops; /* Safety "shops" */ /* * Spell info */ borg_magic borg_magics[9][9]; /* Spell info, by book/what */ /* Food Names */ static const char *food_syllable1[] = { "BBQ ", "Boiled ", "Fresh ", "Frozen ", "Burned ", "Rotten ", "Raw ", "Toasted ", "Broiled ", "Baked ", "Fried ", "Buttered ", "Steamed ", "Gramma's ", }; /* Food Names */ static const char *food_syllable2[] = { "Pizza", "Eggs", "Spam", "Oatmeal", "Chicken", "Bacon", "Peanutbutter", "Roast Beef", "Cheese", "Toast", "Hamburger", "Carrots", "Corn", "Potato", "Pork Chops", "Chinese Takeout", "Cookies", }; /* Slime Molds */ static const char *mold_syllable1[] = { "Ab", "Ac", "Ad", "Af", "Agr", "Ast", "As", "Al", "Adw", "Adr", "Ar", "B", "Br", "C", "Cr", "Ch", "Cad", "D", "Dr", "Dw", "Ed", "Eth", "Et", "Er", "El", "Eow", "F", "Fr", "G", "Gr", "Gw", "Gal", "Gl", "H", "Ha", "Ib", "Jer", "K", "Ka", "Ked", "L", "Loth" , "Lar", "Leg", "M", "Mir", "N", "Nyd", "Ol", "Oc", "On", "P", "Pr", "R", "Rh", "S", "Sev", "T", "Tr", "Th", "V", "Y", "Z", "W", "Wic", }; static const char *mold_syllable2[] = { "a", "adrie", "ara", "e", "ebri", "ele", "ere", "i", "io", "ithra", "ilma", "il-Ga", "ili", "o", "orfi", "u", "y", }; static const char *mold_syllable3[] = { "bur", "fur", "gan", "gnus", "gnar", "li", "lin", "lir", "mli", "nar", "nus", "rin", "ran", "sin", "sil", "sur", }; /* * Hack -- help analyze the magic * * The comments yield the "name" of the spell or prayer. * * Also, the leading letter in the comment indicates how we use the * spell or prayer, if at all, using "A" for "attack", "D" for "call * light" and "detection", "E" for "escape", "H" for healing, "O" for * "object manipulation", and "F" for "terrain feature manipulation", * plus "!" for entries that can soon be handled. */ static byte borg_magic_method[2][9][9] = { /*** Spells ***/ { { /* Magic for Beginners (sval 0) */ BORG_MAGIC_AIM /* A "Magic Missile" */, BORG_MAGIC_EXT /* "Detect Monsters" */, BORG_MAGIC_NOP /* E "Phase Door" */, BORG_MAGIC_NOP /* D "Light Area" */, BORG_MAGIC_NOP /* "Treasure Detection" */, BORG_MAGIC_NOP /* H "Cure Light Wounds" */, BORG_MAGIC_NOP /* "Find Hidden Traps/Doors" */, BORG_MAGIC_AIM /* D "Stinking Cloud" */, BORG_MAGIC_ICK /* A */ }, { /* Conjurings and Tricks (sval 1) */ BORG_MAGIC_AIM /* "Confusion" */, BORG_MAGIC_AIM /* A "Lightning Bolt" */, BORG_MAGIC_NOP /* F "Trap/Door Destruction" */, BORG_MAGIC_NOP /* H "Cure Poison" */, BORG_MAGIC_AIM /* "Sleep I" */, BORG_MAGIC_NOP /* E "Teleport Self" */, BORG_MAGIC_AIM /* A "Spear of Light" */, BORG_MAGIC_AIM /* A "Frost Bolt" */, BORG_MAGIC_AIM /* A "Wonder" */ }, { /* Incantations and Illusions (sval 2) */ BORG_MAGIC_NOP /* H "Satisfy Hunger" */, BORG_MAGIC_OBJ /* O "Recharge Item I" */, BORG_MAGIC_AIM /* "Stone to Mud" */, BORG_MAGIC_AIM /* "Fire Bolt" */, BORG_MAGIC_AIM /* O "Polymorph" */, BORG_MAGIC_OBJ /* "Identify" */, BORG_MAGIC_NOP /* A "Detect Inv" */, BORG_MAGIC_AIM /* "Acid Bolt" */, BORG_MAGIC_AIM /* A "Slow Mon"*/ }, { /* Sorcery and Evocations (sval 3) */ BORG_MAGIC_AIM /* A "Frost Ball" */, BORG_MAGIC_AIM /* O "Teleport Other" */, BORG_MAGIC_NOP /* "Haste Self" */, BORG_MAGIC_NOP /* A "Mass Sleep" */, BORG_MAGIC_AIM /* "Fire Ball" */, BORG_MAGIC_NOP /* "Detect Enchant" */, BORG_MAGIC_ICK /* "(Blank)"*/, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */ }, { /* Resistance of Scarabtarices (sval 4) */ BORG_MAGIC_NOP /* "Resist Cold" */, BORG_MAGIC_NOP /* "Resist Fire" */, BORG_MAGIC_NOP /* "Resist Pois" */, BORG_MAGIC_NOP /* "Resistance" */, BORG_MAGIC_NOP /* "Shield" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */ }, { /* Raal's Tome of Destruction (sval 5) */ BORG_MAGIC_AIM /* A "Shock Wave" */, BORG_MAGIC_AIM /* A "Explosion" */, BORG_MAGIC_AIM /* A "Cloud Kill" */, BORG_MAGIC_AIM /* A "Acid Kill" */, BORG_MAGIC_AIM /* A "Ice Storm" */, BORG_MAGIC_AIM /* A "Meteor Swarm" */, BORG_MAGIC_AIM /* "Rift"*/, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */ }, { /* Mordenkainen's Escapes (sval 6) */ BORG_MAGIC_NOP /* "Door Creation" */, BORG_MAGIC_NOP /* "Stair Creation" */, BORG_MAGIC_NOP /* "Teleport Level" */, BORG_MAGIC_NOP /* "Word of Recall" */, BORG_MAGIC_NOP /* E "Rune of Protec" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */ }, { /* Tenser's transformations... (sval 7) */ BORG_MAGIC_NOP /* ! "Heroism" */, BORG_MAGIC_NOP /* "Berserker" */, BORG_MAGIC_OBJ /* ! "Enchant Armour" */, BORG_MAGIC_OBJ /* "Enchant Weapon" */, BORG_MAGIC_OBJ /* "Recharge Item II" */, BORG_MAGIC_OBJ /* "Elemental Brand" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */ }, { /* Kelek's Grimoire of Power (sval 8) */ BORG_MAGIC_NOP /* "Earthquake" */, BORG_MAGIC_AIM /* "Bedlam" */, BORG_MAGIC_AIM /* O "Rend Sould" */, BORG_MAGIC_WHO /* "Genocide" */, BORG_MAGIC_NOP /* "Word of Dest" */, BORG_MAGIC_NOP /* "Mass Genocide"*/, BORG_MAGIC_AIM /* "Chaos Strike"*/, BORG_MAGIC_AIM /* "Mana Storm" */, BORG_MAGIC_ICK /* "(blank)" */ } }, /*** Prayers ***/ { { /* Beginners Handbook (sval 0) */ BORG_MAGIC_EXT /* "Detect Evil" */, BORG_MAGIC_NOP /* "Cure Light Wounds" */, BORG_MAGIC_NOP /* "Bless" */, BORG_MAGIC_NOP /* H "Remove Fear" */, BORG_MAGIC_NOP /* D "Call Light" */, BORG_MAGIC_NOP /* D "Detect Doors/Stairs" */, BORG_MAGIC_NOP /* "Slow Poison" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */ }, { /* Words of Wisdom (sval 1) */ BORG_MAGIC_AIM /* "Scare Creature" */, BORG_MAGIC_NOP /* E "Portal" */, BORG_MAGIC_NOP /* H "Cure Serious Wounds" */, BORG_MAGIC_NOP /* "Chant" */, BORG_MAGIC_NOP /* "Sanctuary" */, BORG_MAGIC_NOP /* H "Satisfy Hunger" */, BORG_MAGIC_NOP /* "Remove Curse" */, BORG_MAGIC_NOP /* "Resist Heat and Cold" */, BORG_MAGIC_ICK /* "(blank)" */ }, { /* Chants and Blessings (sval 2) */ BORG_MAGIC_NOP /* H "Neutralize Poison" */, BORG_MAGIC_AIM /* A "Orb of Draining" */, BORG_MAGIC_NOP /* H "Cure Critical Wounds" */, BORG_MAGIC_EXT /* "Sense Invisible" */, BORG_MAGIC_NOP /* "Protection from Evil" */, BORG_MAGIC_NOP /* "Earthquake" */, BORG_MAGIC_NOP /* D "Sense Surroundings" */, BORG_MAGIC_NOP /* H "Cure Mortal Wounds" */, BORG_MAGIC_NOP /* "Turn Undead" */ }, { /* Exorcism and Dispelling (sval 3) */ BORG_MAGIC_NOP /* "Prayer" */, BORG_MAGIC_NOP /* ! "Dispel Undead" */, BORG_MAGIC_NOP /* H "Heal" */, BORG_MAGIC_NOP /* ! "Dispel Evil" */, BORG_MAGIC_NOP /* "Glyph of Warding" */, BORG_MAGIC_NOP /* ! "Holy Word" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */ }, { /* Ethereal openings (sval 4) */ BORG_MAGIC_NOP /* E "Blink" */, BORG_MAGIC_NOP /* E "Teleport" */, BORG_MAGIC_AIM /* "Teleport Away" */, BORG_MAGIC_NOP /* "Teleport Level" */, BORG_MAGIC_NOP /* E "Word of Recall" */, BORG_MAGIC_NOP /* "Alter Reality" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */ }, { /* Godly Insights... (sval 5) */ BORG_MAGIC_EXT /* "Detect Monsters" */, BORG_MAGIC_EXT /* D "Detection" */, BORG_MAGIC_OBJ /* O "Perception" */, BORG_MAGIC_NOP /* "Probing" */, BORG_MAGIC_NOP /* D "Clairvoyance" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */ }, { /* Purifications and Healing (sval 6) */ BORG_MAGIC_NOP /* H "Cure Serious Wounds" */, BORG_MAGIC_NOP /* H "Cure Mortal Wounds" */, BORG_MAGIC_NOP /* H "Healing" */, BORG_MAGIC_NOP /* ! "Restoration" */, BORG_MAGIC_NOP /* ! "Remembrance" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */ }, { /* Holy Infusions (sval 7) */ BORG_MAGIC_NOP /* F "Unbarring Ways" */, BORG_MAGIC_OBJ /* O "Recharging" */, BORG_MAGIC_NOP /* "Dispel Curse" */, BORG_MAGIC_OBJ /* O "Enchant Weapon" */, BORG_MAGIC_OBJ /* O "Enchant Armour" */, BORG_MAGIC_OBJ /* "Elemental Brand" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */ }, { /* Wrath of God (sval 8) */ BORG_MAGIC_NOP /* ! "Dispel Undead" */, BORG_MAGIC_NOP /* ! "Dispel Evil" */, BORG_MAGIC_NOP /* "Banishment" */, BORG_MAGIC_NOP /* "Word of Destruction" */, BORG_MAGIC_AIM /* "Annihilation" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */, BORG_MAGIC_ICK /* "(blank)" */ } } }; /* * Hack -- help analyze the magic * * The comments yield the "name" of the spell or prayer. * * Also, the leading letter in the comment indicates how we use the * spell or prayer, if at all, using "A" for "attack", "D" for "call * light" and "detection", "E" for "escape", "H" for healing, "O" for * "object manipulation", "F" for "terrain feature manipulation", * "X" for "never use this", and "!" for "soon to be handled". * * The value indicates how much we want to know the spell/prayer. A * rating of zero indicates that the spell/prayer is useless, and should * never be learned or used. A rating from 1 to 49 indicates that the * spell/prayer is worth some experience to use once, so we should study * (and use) it when we get bored in town. A rating from 50 to 99 means * that the spell/prayer should be learned as soon as possible (and used * when bored). * * XXX XXX XXX Verify ratings. */ static byte borg_magic_rating[2][9][9] = { /*** Spells ***/ { { /* Magic for Beginners (sval 0) */ 95 /* A "Magic Missile" */, 85 /* "Detect Monsters" */, 75 /* E "Phase Door" */, 65 /* D "Light Area" */, 5 /* "Treasure Detection" */, 65 /* H "Object Detection" */, 85 /* "Cure Light Wounds" */, 95 /* D "Find Hidden Traps/Doors" */, 85 /* A "Stinking Cloud" */ }, { /* Conjurings and Tricks (sval 1) */ 55 /* "Confusion" */, 85 /* A "Lightning Bolt" */, 55 /* F "Trap/Door Destruction" */, 65 /* H "Cure Poison" */, 65 /* "Sleep I" */, 95 /* E "Teleport Self" */, 55 /* A "Spear of Light" */, 85 /* A "Frost Bolt" */, 75 /* A "Wonder" */ }, { /* Incantations and Illusions (sval 2) */ 95 /* H "Satisfy Hunger" */, 65 /* O "Recharge Item I" */, 75 /* "Stone to mud" */, 75 /* "Fire Bolt" */, 55 /* O "PolyMorph" */, 95 /* "Identify" */, 75 /* A "Detect Inv" */, 75 /* "Acid Bolt" */, 55 /* "Slow Monster" */ }, { /* Sorcery and Evocations (sval 3) */ 85 /* A "Frost Ball" */, 75 /* O "Teleport Other" */, 85 /* "Haste Self" */, 65 /* "Mass Sleep" */, 75 /* A "Fire Ball" */, 55 /* "Detect Enchantment" */, 0 /* "blank" */, 0 /* "blank" */, 0 /* "(blank)" */ }, { /* Resistance of Scarabtarices (sval 4) */ 65 /* "Resist Cold" */, 65 /* "Resist Fire" */, 60 /* "Resist Poison" */, 70 /* "Resistance" */, 75 /* "Shield" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */ }, { /* Raal's Tome of Destruction (sval 5) */ 85 /* A "Shock Wave" */, 85 /* A "Explosion" */, 85 /* A "Cloud Kill" */, 85 /* A "Acid Ball" */, 85 /* A "Ice Storm" */, 85 /* A "Meteor Swarm" */, 85 /* "Rift" */, 0 /* "(blank)" */, 0 /* "(blank)" */ }, { /* Mordenkainen's Escapes (sval 6) */ 65 /* "Door Creation" */, 5 /* "Stair Creation" */, 65 /* "Teleport Level" */, 65 /* "Word of Recall" */, 55 /* E "Rune of Protection" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */ }, { /* Tenser's transformations... (sval 7) */ 75 /* H "Heroism" */, 75 /* "Berserker" */, 75 /* H "Enchant Armor" */, 75 /* "Enchant Weapon" */, 75 /* "Recharge Item II" */, 75 /* "Elemental Brand" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */ }, { /* Kelek's Grimoire of Power (sval 8) */ 55 /* "Earthquake" */, 5 /* "Bedlam" */, 75 /* "Rend Soul" */, 75 /* "Genocide" */, 55 /* "Word of Dest" */, 65 /* "Mass Genocide" */, 75 /* "Chaos Strike" */, 75 /* "Mana Storm" */, 0 /* "(blank)" */ } }, /*** Prayers ***/ { { /* Beginners Handbook (sval 0) */ 85 /* "Detect Evil" */, 55 /* H "Cure Light Wounds" */, 80 /* "Bless" */, 35 /* H "Remove Fear" */, 35 /* D "Call Light" */, 75 /* D "Detect Doors/Stairs" */, 55 /* "Slow Poison" */, 0 /* "(blank)" */, 0 }, { /* Words of Wisdom (sval 1) */ 55 /* "Confuse Creature" */, 90 /* E "Portal" */, 55 /* H "Cure Serious Wounds" */, 55 /* "Chant" */, 55 /* "Sanctuary" */, 75 /* H "Satisfy Hunger" */, 35 /* "Remove Curse" */, 55 /* "Resist Heat and Cold" */, 0 /* "(blank)" */ }, { /* Chants and Blessings (sval 2) */ 65 /* H "Neutralize Poison" */, 95 /* A "Orb of Draining" */, 55 /* H "Cure Critical Wounds" */, 65 /* "Sense Invisible" */, 65 /* "Protection from Evil" */, 55 /* "Earthquake" */, 65 /* D "Sense Surroundings" */, 55 /* H "Cure Mortal Wounds" */, 55 /* "Turn Undead" */ }, { /* Exorcism and Dispelling (sval 3) */ 45 /* "Prayer" */, 65 /* ! "Dispel Undead" */, 55 /* H "Heal" */, 55 /* ! "Dispel Evil" */, 55 /* "Glyph of Warding" */, 55 /* ! "Holy Word" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */ }, { /* Ethereal openings (sval 4) */ 65 /* E "Blink" */, 65 /* E "Teleport" */, 55 /* "Teleport Away" */, 55 /* "Teleport Level" */, 75 /* E "Word of Recall" */, 65 /* "Alter Reality" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */ }, { /* Godly Insights... (sval 5) */ 55 /* "Detect Monsters" */, 65 /* D "Detection" */, 75 /* O "Perception" */, 5 /* "Probing" */, 65 /* D "Clairvoyance" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */ }, { /* Purifications and Healing (sval 6) */ 55 /* H "Cure Serious Wounds" */, 55 /* H "Cure Mortal Wounds" */, 55 /* H "Healing" */, 45 /* ! "Restoration" */, 45 /* ! "Remembrance" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */ }, { /* Holy Infusions (sval 7) */ 50 /* F "Unbarring Ways" */, 50 /* O "Recharging" */, 45 /* "Dispel Curse" */, 65 /* O "Enchant Weapon" */, 65 /* O "Enchant Armour" */, 65 /* "Elemental Brand" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */ }, { /* Wrath of God (sval 8) */ 65 /* ! "Dispel Undead" */, 65 /* ! "Dispel Evil" */, 55 /* "Banishment" */, 55 /* "Word of Destruction" */, 55 /* "Annihilation" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */, 0 /* "(blank)" */ } } }; /* Cheat the game's index for spells */ static byte borg_magic_index[2][9][9] = { /*** Spells ***/ { { /* Magic for Beginners */ 0 /* SPELL_MAGIC_MISSILE */, 1 /* SPELL_DETECT_MONSTERS */, 2 /* SPELL_PHASE_DOOR */, 3 /* SPELL_LIGHT_AREA */, 6 /* SPELL_OBJECT_DETECTION */, 5 /* SPELL_CURE_LIGHT_WOUNDS */, 4 /* SPELL_FIND_TRAPS_DOORS */, 11 /* SPELL_STINKING_CLOUD */, 99 }, /* Conjurings and Tricks */ { 13 /* SPELL_CONFUSE_MONSTER */, 12 /* SPELL_LIGHTNING_BOLT */, 19 /* SPELL_TRAP_DOOR_DESTRUCTION */, 25 /* SPELL_CURE_POISON */, 14 /* SPELL_SLEEP_MONSTER */, 30 /* SPELL_TELEPORT_SELF */, 20 /* SPELL_SPEAR_OF_LIGHT */, 16 /* SPELL_FROST_BOLT */, 15 /* SPELL_WONDER */ }, /* Incantations and Illusions */ { 26 /* SPELL_SATISFY_HUNGER */, 50 /* SPELL_RECHARGE_ITEM_I */, 21 /* SPELL_TURN_STONE_TO_MUD */, 18 /* SPELL_FIRE_BOLT */, 35 /* SPELL_POLYMORPH_OTHER */, 8 /* SPELL_IDENTIFY */, 9 /* SPELL_DETECT_INVISIBLE */, 17 /* SPELL_ACID_BOLT */, 31 /* SPELL_SLOW_MONSTER */ }, /* Sorcery and Evocations */ { 55 /* SPELL_FROST_BALL */, 32 /* SPELL_TELEPORT_OTHER */, 29 /* SPELL_HASTE_SELF */, 39 /* SPELL_MASS_SLEEP */, 57 /* SPELL_FIRE_BALL */, 10 /* SPELL_TREASURE_DETECTION */, 99, 99, 99 }, /* Resistances of Scarabtarices */ { 44 /* SPELL_RESIST_COLD */, 45 /* SPELL_RESIST_FIRE */, 46 /* SPELL_RESIST_POISON */, 47 /* SPELL_RESISTANCE */, 48 /* SPELL_SHIELD */, 99, 99, 99, 99 }, /* Raal's Tome of Destruction */ { 36 /* SPELL_SHOCK_WAVE */, 37 /* SPELL_EXPLOSION */, 38 /* SPELL_CLOUD_KILL */, 56 /* SPELL_ACID_BALL */, 58 /* SPELL_ICE_STORM */, 60 /* SPELL_METEOR_SWARM */, 62 /* SPELL_RIFT */, 99, 99 }, /* Mordenkainen's Escapes */ { 22 /* SPELL_DOOR_CREATION */, 24 /* SPELL_STAIR_CREATION */, 33 /* SPELL_TELEPORT_LEVEL */, 34 /* SPELL_WORD_OF_RECALL */, 49 /* SPELL_RUNE_OF_PROTECTION */, 99, 99, 99, 99 }, /* Tenser's transformations */ { 27 /* SPELL_HEROISM */, 28 /* SPELL_BERSERKER */, 51 /* SPELL_ENCHANT_ARMOR */, 52 /* SPELL_ENCHANT_WEAPON */, 53 /* SPELL_RECHARGE_ITEM_II */, 54 /* SPELL_ELEMENTAL_BRAND */, 99, 99, 99 }, /* Kelek's Grimoire of Power */ { 23 /* SPELL_EARTHQUAKE */, 40 /* SPELL_BEDLAM */, 41 /* SPELL_REND_SOUL */, 59 /* SPELL_GENOCIDE */, 42 /* SPELL_WORD_OF_DESTRUCTION */, 61 /* SPELL_MASS_GENOCIDE */, 43 /* SPELL_CHAOS_STRIKE */, 63 /* SPELL_MANA_STORM */, 99 } }, { /*** Priest spell books ***/ { 0 /* a PRAYER_DETECT_EVIL */, 1 /* b PRAYER_CURE_LIGHT_WOUNDS */, 2 /* c PRAYER_BLESS */, 3 /* d PRAYER_REMOVE_FEAR */, 4 /* e PRAYER_CALL_LIGHT */, 5 /* f PRAYER_FIND_TRAPS */, 7 /* g PRAYER_SLOW_POISON */, 99, 99 }, { 8 /* PRAYER_SCARE_MONSTER */, 9 /* PRAYER_PORTAL */, 10/* PRAYER_CURE_SERIOUS_WOUNDS */, 11 /* PRAYER_CHANT */, 12 /* PRAYER_SANCTUARY */, 13 /* PRAYER_SATISFY_HUNGER */, 14 /* PRAYER_REMOVE_CURSE */, 15 /* PRAYER_RESIST_HEAT_COLD */, 99 }, { 16 /* PRAYER_NEUTRALIZE_POISON */, 17 /* PRAYER_ORB_OF_DRAINING */, 18 /* PRAYER_CURE_CRITICAL_WOUNDS */, 19 /* PRAYER_SENSE_INVISIBLE */, 20 /* PRAYER_PROTECTION_FROM_EVIL */, 21 /* PRAYER_EARTHQUAKE */, 22 /* PRAYER_SENSE_SURROUNDINGS */, 23 /* PRAYER_CURE_MORTAL_WOUNDS */, 24 /* PRAYER_TURN_UNDEAD */ }, { 25 /* PRAYER_PRAYER */, 26 /* PRAYER_DISPEL_UNDEAD */, 27 /* PRAYER_HEAL */, 28 /* PRAYER_DISPEL_EVIL */, 29 /* PRAYER_GLYPH_OF_WARDING */, 30 /* PRAYER_HOLY_WORD */, 99, 99, 99 }, { 52 /* PRAYER_BLINK */, 53 /* PRAYER_TELEPORT_SELF */, 54 /* PRAYER_TELEPORT_OTHER */, 55 /* PRAYER_TELEPORT_LEVEL */, 56 /* PRAYER_WORD_OF_RECALL */, 57 /* PRAYER_ALTER_REALITY */, 99, 99, 99 }, { 31 /* PRAYER_DETECT_MONSTERS */, 32 /* PRAYER_DETECTION */, 33 /* PRAYER_PERCEPTION */, 34 /* PRAYER_PROBING */, 35 /* PRAYER_CLAIRVOYANCE */, 99, 99, 99, 99 }, { 36 /* PRAYER_CURE_SERIOUS_WOUNDS2 */, 37 /* PRAYER_CURE_MORTAL_WOUNDS2 */, 38 /* PRAYER_HEALING */, 39 /* PRAYER_RESTORATION */, 40 /* PRAYER_REMEMBRANCE */, 99, 99, 99, 99 }, { 46 /* PRAYER_UNBARRING_WAYS */, 47 /* PRAYER_RECHARGING */, 48 /* PRAYER_DISPEL_CURSE */, 49 /* PRAYER_ENCHANT_WEAPON */, 50 /* PRAYER_ENCHANT_ARMOUR */, 51 /* PRAYER_ELEMENTAL_BRAND */, 99, 99, 99 }, { 41 /* PRAYER_DISPEL_UNDEAD2 */, 42 /* PRAYER_DISPEL_EVIL2 */, 43 /* PRAYER_BANISHMENT */, 44 /* PRAYER_WORD_OF_DESTRUCTION */, 45 /* PRAYER_ANNIHILATION */, 99, 99, 99, 99 } } }; static const char *borg_magic_name[2][9][9] = { /*** Spells ***/ { { /* Magic for Beginners (sval 0) */ "Magic Missile" , "Detect Monsters" , "Phase Door" , "Light Area" , "Treasure Detection" , "Cure Light Wounds" , "Find Traps, Doors & Stairs" , "Stinking Cloud", "(Blank)" }, { /* Conjurings and Tricks (sval 1) */ "Confusion" , "Lightning Bolt" , "Trap/Door Destruction" , "Cure Poison" , "Sleep Monster" , "Teleport Self" , "Spear of Light" , "Frost Bolt" , "Wonder" }, { /* Incantations and Illusions (sval 2) */ "Satisfy Hunger" , "Lesser Recharging" , "Turn Stone to Mud" , "Fire Bolt" , "PolyMorph Other" , "Identify" , "Reveal Monsters" , "Acid Bolt" , "Slow Monster" }, { /* Sorcery and Evocations (sval 3) */ "Frost Ball" , "Teleport Other" , "Haste Self" , "Mass Sleep" , "Fire Ball" , "Detect Enchantment" , "0x3x6" , "0x3x7" , "0x3x8" }, { /* Resistance of Scarabtarices (sval 4) */ "Resist Cold" , "Resist Fire" , "Resist Poison" , "Resistance" , "Shield" , "(blank)" , "(blank)" , "(blank)" , "(blank)" }, { /* Raal's Tome of Destruction (sval 5) */ "Shock Wave" , "Explosion" , "Cloud Kill" , "Acid Ball" , "Ice Storm" , "Meteor Swarm" , "Rift" , "(blank)" , "(blank)" }, { /* Mordenkainen's Escapes (sval 6) */ "Door Creation" , "Stair Creation" , "Teleport Level" , "Word of Recall" , "Rune of Protection" , "(blank)" , "(blank)" , "(blank)" , "(blank)" }, { /* Tenser's transformations... (sval 7) */ "Heroism" , "Berserker" , "Enchant Armor" , "Enchant Weapon" , "Greater Recharging" , "Elemental Brand" , "(blank)" , "(blank)" , "(blank)" }, { /* Kelek's Grimoire of Power (sval 8) */ "Earthquake" , "Bedlam" , "Rend Soul" , "Banishment" , "Word of Dest" , "Mass Genocide" , "Chaos Strike" , "Mana Storm" , "(blank)" } }, /*** Prayers ***/ { { /* Beginners Handbook (sval 0) */ "Detect Evil" , "Cure Light Wounds" , "Bless" , "Remove Fear" , "Call Light" , "Find Traps, Doors & Stairs" , "Slow Poison" , "(blank)", "(blank)" }, { /* Words of Wisdom (sval 1) */ "Scare Monster" , "Portal" , "Cure Serious Wounds" , "Chant" , "Sanctuary" , "Satisfy Hunger" , "Remove Curse" , "Resist Heat and Cold" , "(blank)" }, { /* Chants and Blessings (sval 2) */ "Neutralize Poison" , "Orb of Draining" , "Cure Critical Wounds" , "Sense Invisible" , "Protection from Evil" , "Earthquake" , "Sense Surroundings" , "Cure Mortal Wounds" , "Turn Undead" }, { /* Exorcism and Dispelling (sval 3) */ "Prayer" , "Dispel Undead" , "Heal" , "Dispel Evil" , "Glyph of Warding" , "Holy Word" , "(blank)" , "(blank)" , "(blank)" }, { /* Ethereal openings (sval 4) */ "Blink" , "Teleport Self" , "Teleport Other" , "Teleport Level" , "Word of Recall" , "Alter Reality" , "(blank)" , "(blank)" , "(blank)" }, { /* Godly Insights... (sval 5) */ "Detect Monsters" , "Detection" , "Perception" , "Probing" , "Clairvoyance" , "(blank)" , "(blank)" , "(blank)" , "(blank)" }, { /* Purifications and Healing (sval 6) */ "Cure Serious Wounds" , "Cure Mortal Wounds" , "Healing" , "Restoration" , "Remembrance" , "(blank)" , "(blank)" , "(blank)" , "(blank)" }, { /* Holy Infusions (sval 7) */ "Unbarring Ways" , "Recharging" , "Dispel Curse" , "Enchant Weapon" , "Enchant Armour" , "Elemental Brand" , "(blank)" , "(blank)" , "(blank)" }, { /* Wrath of God (sval 8) */ "Dispel Undead" , "Dispel Evil" , "Banishment" , "Word of Destruction" , "Annihilation" , "(blank)" , "(blank)" , "(blank)" , "(blank)" } } }; /* * Constant "item description parsers" (singles) */ static int borg_single_size; /* Number of "singles" */ static s16b *borg_single_what; /* Kind indexes for "singles" */ static char **borg_single_text; /* Textual prefixes for "singles" */ /* * Constant "item description parsers" (plurals) */ static int borg_plural_size; /* Number of "plurals" */ static s16b *borg_plural_what; /* Kind index for "plurals" */ static char **borg_plural_text; /* Textual prefixes for "plurals" */ static char **borg_sv_plural_text; /* Save Textual prefixes for "plurals" (in kind order) */ /* * Constant "item description parsers" (suffixes) */ static int borg_artego_size; /* Number of "artegos" */ static s16b *borg_artego_what; /* Indexes for "artegos" */ static char **borg_artego_text; /* Textual prefixes for "artegos" */ static char **borg_sv_art_text; /* Save textual prefixes for "artifacts" (in kind order) */ /* * Return the slot that items of the given type are wielded into * XXX this just duplicates Angband's version and should use that instead * * Returns "-1" if the item cannot be wielded */ int borg_wield_slot(const borg_item *item) { switch (item->tval) { case TV_SWORD: case TV_POLEARM: case TV_HAFTED: case TV_DIGGING: return INVEN_WIELD; case TV_DRAG_ARMOR: case TV_HARD_ARMOR: case TV_SOFT_ARMOR: return INVEN_BODY; case TV_SHIELD: return INVEN_ARM; case TV_CROWN: case TV_HELM: return INVEN_HEAD; case TV_BOW: return INVEN_BOW; case TV_RING: return INVEN_LEFT; case TV_AMULET: return INVEN_NECK; case TV_LIGHT: return INVEN_LIGHT; case TV_CLOAK: return INVEN_OUTER; case TV_GLOVES: return INVEN_HANDS; case TV_BOOTS: return INVEN_FEET; } /* No slot available */ return -1; } /* * Get the *ID information * * This function pulls the information from the screen if it is not passed * a *real* item. It is only passed in *real* items if the borg is allowed * to 'cheat' for inventory. * This function returns TRUE if space needs to be pressed */ bool borg_object_star_id_aux(borg_item *borg_item, object_type *real_item) { bitflag f[OF_SIZE]; /* the data directly from the real item */ object_flags(real_item, f); of_copy(borg_item->flags, f); borg_item->needs_I = FALSE; return (FALSE); } /* * Look for an item that needs to be analysed because it has been *ID*d * * This will go through inventory and look for items that were just*ID*'d * and examine them for their bonuses. */ bool borg_object_star_id( void ) { int i; /* look in inventory and equiptment for something to *id* */ for (i = 0; i < QUIVER_END; i++) /* or INVEN_TOTAL */ { borg_item *item = &borg_items[i]; ego_item_type *e_ptr = &e_info[item->name2]; if (borg_items[i].needs_I) { /* cheat to get the information. */ borg_object_star_id_aux( &borg_items[i], &p_ptr->inventory[i]); /* inscribe certain objects */ if (!borg_skill[BI_CDEPTH] && (e_ptr->xtra == OBJECT_XTRA_TYPE_RESIST || e_ptr->xtra == OBJECT_XTRA_TYPE_POWER) && (streq(item->note, "{ }") || streq(item->note, "") || strstr(item->note, "uncursed"))) { /* make the inscription */ borg_keypress('{'); if (i >= INVEN_WIELD) { borg_keypress('/'); borg_keypress(I2A(i - INVEN_WIELD)); } else { borg_keypress(I2A(i)); } if (of_has(item->flags, OF_SPEED)) { borg_keypresses("Spd"); } /* slays and immunities */ if (of_has(item->flags, OF_RES_POIS)) { borg_keypresses("Poisn"); } if (of_has(item->flags, OF_IM_FIRE)) { borg_keypresses("IFir"); } if (of_has(item->flags, OF_IM_COLD)) { borg_keypresses("ICld"); } if (of_has(item->flags, OF_IM_ACID)) { borg_keypresses("IAcd"); } if (of_has(item->flags, OF_IM_ELEC)) { borg_keypresses("IElc"); } if (of_has(item->flags, OF_RES_LIGHT)) { borg_keypresses("Lite"); } if (of_has(item->flags, OF_RES_DARK)) { borg_keypresses("Dark"); } if (of_has(item->flags, OF_RES_BLIND)) { borg_keypresses("Blnd"); } if (of_has(item->flags, OF_RES_CONFU)) { borg_keypresses("Conf"); } if (of_has(item->flags, OF_RES_SOUND)) { borg_keypresses("Sound"); } if (of_has(item->flags, OF_RES_SHARD)) { borg_keypresses("Shrd"); } if (of_has(item->flags, OF_RES_NETHR)) { borg_keypresses("Nthr"); } if (of_has(item->flags, OF_RES_NEXUS)) { borg_keypresses("Nxs"); } if (of_has(item->flags, OF_RES_CHAOS)) { borg_keypresses("Chaos"); } if (of_has(item->flags, OF_RES_DISEN)) { borg_keypresses("Disn"); } /* TR2_activate was removed */ if ((item->name1 && a_info[item->name1].effect) || (k_info[item->kind].effect)) { borg_keypresses("Actv"); } if (of_has(item->flags, OF_TELEPATHY)) { borg_keypresses("ESP"); } if (of_has(item->flags, OF_HOLD_LIFE)) { borg_keypresses("HL"); } if (of_has(item->flags, OF_FREE_ACT)) { borg_keypresses("FA"); } if (of_has(item->flags, OF_SEE_INVIS)) { borg_keypresses("SInv"); } /* end the inscription */ borg_keypress(KC_ENTER); } } } return (FALSE); } /* * Determine the "base price" of a known item (see below) * * This function is adapted from "object_value_known()". * * This routine is called only by "borg_item_analyze()", which * uses this function to guess at the "value" of an item, if it * was to be sold to a store, with perfect "charisma" modifiers. */ static s32b borg_object_value_known(borg_item *item) { s32b value; object_kind *k_ptr = &k_info[item->kind]; /* Worthless items */ if (!k_ptr->cost) return (0L); /* Extract the base value */ value = k_ptr->cost; /* Hack -- use artifact base costs */ if (item->name1) { artifact_type *a_ptr = &a_info[item->name1]; /* Worthless artifacts */ if (!a_ptr->cost) return (0L); /* Hack -- use the artifact cost */ value = a_ptr->cost; } /* Hack -- add in ego-item bonus cost */ if (item->name2) { ego_item_type *e_ptr = &e_info[item->name2]; /* Worthless ego-items */ if (!e_ptr->cost) return (0L); /* Hack -- reward the ego-item cost */ value += e_ptr->cost; } /* Analyze pval bonus */ switch (item->tval) { /* Wands/Staffs */ case TV_WAND: case TV_STAFF: { /* Pay extra for charges */ value += ((value / 20) * item->pval); break; } /* Wearable items */ case TV_SHOT: case TV_ARROW: case TV_BOLT: case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: case TV_LIGHT: case TV_AMULET: case TV_RING: { /* Hack -- Negative "pval" is always bad */ if (item->pval < 0) return (0L); /* No pval */ if (!item->pval) break; /* Give credit for stat bonuses */ if (of_has(item->flags, OF_STR)) value += (item->pval * 200L); if (of_has(item->flags, OF_INT)) value += (item->pval * 200L); if (of_has(item->flags, OF_WIS)) value += (item->pval * 200L); if (of_has(item->flags, OF_DEX)) value += (item->pval * 200L); if (of_has(item->flags, OF_CON)) value += (item->pval * 200L); /* Give credit for stealth and searching */ if (of_has(item->flags, OF_STEALTH)) value += (item->pval * 100L); if (of_has(item->flags, OF_SEARCH)) value += (item->pval * 100L); /* Give credit for infra-vision and tunneling */ if (of_has(item->flags, OF_INFRA)) value += (item->pval * 50L); if (of_has(item->flags, OF_TUNNEL)) value += (item->pval * 50L); /* Give credit for extra attacks */ if (of_has(item->flags, OF_BLOWS)) value += (item->pval * 2000L); /* Give credit for speed bonus */ if (of_has(item->flags, OF_SPEED)) value += (item->pval * 30000L); break; } } /* Analyze the item */ switch (item->tval) { /* Rings/Amulets */ case TV_RING: case TV_AMULET: { /* Hack -- negative bonuses are bad */ if (item->to_a < 0) return (0L); if (item->to_h < 0) return (0L); if (item->to_d < 0) return (0L); /* Give credit for bonuses */ value += ((item->to_h + item->to_d + item->to_a) * 100L); break; } /* Armor */ case TV_BOOTS: case TV_GLOVES: case TV_CLOAK: case TV_CROWN: case TV_HELM: case TV_SHIELD: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { /* Hack -- negative armor bonus */ if (item->to_a < 0) return (0L); /* Give credit for bonuses */ value += ((item->to_h + item->to_d + item->to_a) * 100L); break; } /* Bows/Weapons */ case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_SWORD: case TV_POLEARM: { /* Hack -- negative hit/damage bonuses */ if (item->to_h + item->to_d < 0) return (0L); /* Factor in the bonuses */ value += ((item->to_h + item->to_d + item->to_a) * 100L); /* Hack -- Factor in extra damage dice */ if ((item->dd > k_ptr->dd) && (item->ds == k_ptr->ds)) { value += (item->dd - k_ptr->dd) * item->ds * 200L; } break; } /* Ammo */ case TV_SHOT: case TV_ARROW: case TV_BOLT: { /* Hack -- negative hit/damage bonuses */ if (item->to_h + item->to_d < 0) return (0L); /* Factor in the bonuses */ value += ((item->to_h + item->to_d) * 5L); /* Hack -- Factor in extra damage dice */ if ((item->dd > k_ptr->dd) && (item->ds == k_ptr->ds)) { value += (item->dd - k_ptr->dd) * item->ds * 5L; } break; } } /* Return the value */ return (value); } /* * Analyze an item, also given its name * * This cheats all the information, and maybe is getting information * that the player doesn't always get. The best way to fix this is to * refactor the main game code to get it to make a 'fake' object that * contains only known info and copy from that. */ void borg_item_analyze(borg_item *item, const object_type *real_item, char *desc) { char *scan; obj_pseudo_t pseudo; /* Wipe the item */ WIPE(item, borg_item); /* Non-item */ if (!real_item->kind || !real_item->number) return; /* Extract data from the game */ object_flags_known(real_item, item->flags); pseudo = object_pseudo(real_item); /* Save the item description */ my_strcpy(item->desc, desc, sizeof item->desc); /* Advance to the "inscription" or end of string and save */ for (scan = item->desc; *scan && (*scan != '{'); scan++) /* loop */; item->note = scan; /* Get various info */ item->tval = real_item->tval; item->sval = real_item->sval; item->iqty = real_item->number; item->weight = real_item->weight; item->timeout = real_item->timeout; item->ac = real_item->ac; item->dd = real_item->dd; item->ds = real_item->ds; item->level = real_item->kind->level; item->activation = real_item->kind->effect; item->cursed = cursed_p(item->flags); /* Check ID status */ /* XXX surely the Borg doesn't need four bools per object to keep track * of all this? fully_identified should always be !needs_I so that could * go for starters. */ if (object_is_known(real_item)) { /* Fully ID'd */ item->aware = TRUE; item->ident = TRUE; item->fully_identified = TRUE; item->needs_I = FALSE; } else if (object_flavor_is_aware(real_item)) { /* Object is flavoured and aware */ item->aware = TRUE; item->needs_I = TRUE; } else { item->needs_I = TRUE; } /* Rods are considered pval 1 if charged */ if (item->tval == TV_ROD) { /* XXX There should be an obj_rod_charging() function for this logic */ /* This was ripped from object/obj-desc.c */ if (item->iqty == 1) { item->pval = real_item->timeout ? 0 : 1; } else { int power; int time_base = randcalc(real_item->kind->time, 0, MINIMISE); if (!time_base) time_base = 1; /* * Find out how many rods are charging, by dividing * current timeout by each rod's maximum timeout. * Ensure that any remainder is rounded up. Display * very discharged stacks as merely fully discharged. */ power = (real_item->timeout + (time_base - 1)) / time_base; item->pval = (power < item->iqty) ? 1 : 0; } } else if (item->tval == TV_STAFF || item->tval == TV_WAND) { /* Staffs & wands considered charged unless they are known empty */ /* Assume good */ item->pval = 1; /* if Known, get correct pval */ if (item->ident) item->pval = real_item->pval[DEFAULT_PVAL]; /* if seen {empty} assume pval 0 */ if (real_item->ident & IDENT_EMPTY) item->pval = 0; } /* Kind index -- Only if partially ID */ if (item->aware) item->kind = real_item->kind->kidx; /* Notice various things if ID'd */ if (item->ident) { if (real_item->artifact) item->name1 = real_item->artifact->aidx; if (real_item->ego) { item->name2 = real_item->ego->eidx; /* Repair the Elvenkind items that are not armour so that * the borg can correctly handle the high resists */ if (item->name2 == 61 || item->name2 == 21) item->name2 = 9; } item->pval = real_item->pval[DEFAULT_PVAL]; item->value = borg_object_value_known(item); } else if (item->aware) { item->value = real_item->kind->cost; } else { /* Guess at cost */ switch (item->tval) { case TV_FOOD: item->value = 5L; break; case TV_POTION: item->value = 20L; break; case TV_SCROLL: item->value = 20L; break; case TV_STAFF: item->value = 70L; break; case TV_WAND: item->value = 50L; break; case TV_ROD: item->value = 90L; break; case TV_RING: case TV_AMULET: item->value = 45L; break; default: item->value = 20L; break; } } /* If it's not The One Ring, then it's worthless */ if (item->cursed && item->activation != EF_BIZARRE) item->value = 0L; /* "Strange" objects are also considered worthless */ else if (strstr(item->note, "strange")) item->value = 0L; /* Copy across attack plusses (or fake them) */ if (object_attack_plusses_are_visible(real_item)) { item->to_h = real_item->to_h; item->to_d = real_item->to_d; } else if (pseudo == INSCRIP_SPLENDID || pseudo == INSCRIP_EXCELLENT || pseudo == INSCRIP_SPECIAL) { int slot = borg_wield_slot(item); /* Minimally boost the value so we don't crush it */ item->value += 25; /* Weapons are assumed to have at least +5/+5 */ /* In munchkin_mode, we want to make money so we want to wear stuff * to ID it. So make the borg believe that the item has a high bonus * to make it replace current equipment. Sometimes this item might be * cursed but there's always ?Remove Curse. */ if (slot == INVEN_WIELD || slot == INVEN_BOW) item->to_h = item->to_d = borg_munchkin_mode ? 9 : 5; } else if (pseudo == INSCRIP_MAGICAL) { int slot = borg_wield_slot(item); /* Lower value for worse item */ item->value += 5; /* Assume +1 (or +8 with munchkin) */ if (slot == INVEN_WIELD || slot == INVEN_BOW) item->to_h = item->to_d = borg_munchkin_mode ? 8 : 1; } /* Copy across defence plusses (or fake them) */ if (object_defence_plusses_are_visible(real_item)) { item->to_a = real_item->to_a; } else if (pseudo == INSCRIP_SPLENDID || pseudo == INSCRIP_EXCELLENT || pseudo == INSCRIP_SPECIAL) { /* Add some value and assume modifiers */ item->value += 25; if (borg_wield_slot(item) > INVEN_BOW) item->to_a = borg_munchkin_mode ? 9 : 5; } else if (pseudo == INSCRIP_MAGICAL) { /* Add less value and assume modifiers */ item->value += 5; if (borg_wield_slot(item) > INVEN_BOW) item->to_a = borg_munchkin_mode ? 8 : 1; } } /* * Send a command to inscribe item number "i" with the inscription "str". */ void borg_send_inscribe(int i, char *str) { char *s; /* Label it */ borg_keypress('{'); /* Choose from inventory */ if (i < INVEN_WIELD) { /* Choose the item */ borg_keypress(I2A(i)); } /* Choose from equipment */ else { /* Go to equipment (if necessary) */ if (borg_items[0].iqty) borg_keypress('/'); /* Choose the item */ borg_keypress(I2A(i - INVEN_WIELD)); } /* Send the label */ for (s = str; *s; s++) borg_keypress(*s); /* End the inscription */ borg_keypress(KC_ENTER); } /* * Find the slot of an item with the given tval/sval, if available. * Given multiple choices, choose the item with the largest "pval". * Given multiple choices, choose the smallest available pile. */ int borg_slot(int tval, int sval) { int i, n = -1; /* Scan the pack */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip un-aware items */ if (!item->kind) continue; /* Require correct tval */ if (item->tval != tval) continue; /* Require correct sval */ if (item->sval != sval) continue; /* Prefer smallest pile */ if ((n >= 0) && (item->iqty > borg_items[n].iqty)) continue; /* Prefer largest "pval" (even if smaller pile)*/ if ((n >= 0) && (item->pval < borg_items[n].pval) && (item->iqty > borg_items[n].iqty)) continue; /* Save this item */ n = i; } /* Done */ return (n); } enum borg_need borg_maintain_light(void) { int i; borg_item *current_light = &borg_items[INVEN_LIGHT]; /* current torch */ if (current_light->tval == TV_LIGHT) { if (current_light->sval == SV_LIGHT_TORCH) { if (current_light->timeout > 250) { return BORG_NO_NEED; } else { /* Look for another torch */ i = borg_slot(TV_LIGHT, SV_LIGHT_TORCH); if (i < 0) return BORG_UNMET_NEED; /* Torches automatically disappear when they get to 0 turns * so we don't need to actively swap them out */ return BORG_NO_NEED; } } /* Refuel current lantern */ if (current_light->sval == SV_LIGHT_LANTERN) { /* Refuel the lantern if needed */ if (borg_items[INVEN_LIGHT].timeout < 1000) { if (borg_refuel_lantern()) return BORG_MET_NEED; return BORG_UNMET_NEED; } } return BORG_NO_NEED; } else { i = borg_slot(TV_LIGHT, SV_LIGHT_LANTERN); if (i < 0) { i = borg_slot(TV_LIGHT, SV_LIGHT_TORCH); } if (i < 0) { return BORG_UNMET_NEED; } else { borg_keypress('w'); borg_keypress(I2A(i)); return BORG_MET_NEED; } } } /* * Hack -- refuel a lantern */ bool borg_refuel_lantern(void) { int i; /* Look for a torch */ i = borg_slot(TV_FLASK, 0); /* None available check for lantern */ if (i < 0) { i = borg_slot(TV_LIGHT, SV_LIGHT_LANTERN); /* It better have some oil left */ if (borg_items[i].timeout <= 0) i = -1; } /* Still none */ if (i < 0) return (FALSE); /* Cant refuel a torch with oil */ if (borg_items[INVEN_LIGHT].sval != SV_LIGHT_LANTERN) { return (FALSE); } /* Log the message */ borg_note(format("# Refueling with %s.", borg_items[i].desc)); /* Perform the action */ borg_keypress('F'); borg_keypress(I2A(i)); /* Hack -- Clear "shop" goals */ goal_shop = goal_ware = goal_item = -1; /* Success */ return (TRUE); } /* * Hack -- attempt to eat the given food (by sval) */ bool borg_eat_food(int sval) { int i; /* Look for that food */ i = borg_slot(TV_FOOD, sval); /* None available */ if (i < 0) return (FALSE); /* Log the message */ borg_note(format("# Eating %s.", borg_items[i].desc)); /* Perform the action */ borg_keypress('E'); borg_keypress(I2A(i)); /* Hack -- Clear "shop" goals */ goal_shop = goal_ware = goal_item = -1; /* Success */ return (TRUE); } /* * Quaff a potion of cure critical wounds. This is a special case * for several reasons. * 1) it is usually the only healing potion we have on us * 2) we should try to conserve a couple for when we really need them * 3) if we are burning through them fast we should probably teleport out of * the fight. * 4) When it is the only/best way out of danger, drink away */ bool borg_quaff_crit( bool no_check ) { static s16b when_last_quaff = 0; if (no_check) { if (borg_quaff_potion(SV_POTION_CURE_CRITICAL)) { when_last_quaff = borg_t; return (TRUE); } return (FALSE); } /* Avoid drinking CCW twice in a row */ if (when_last_quaff > (borg_t-4) && when_last_quaff <= borg_t && (randint1(100) < 75)) return FALSE; /* Save the last two for when we really need them */ if (borg_skill[BI_ACCW] < 2) return FALSE; if (borg_quaff_potion(SV_POTION_CURE_CRITICAL)) { when_last_quaff = borg_t; return (TRUE); } return (FALSE); } /* * Hack -- attempt to quaff the given potion (by sval) */ bool borg_quaff_potion(int sval) { int i; /* Look for that potion */ i = borg_slot(TV_POTION, sval); /* None available */ if (i < 0) return (FALSE); /* Log the message */ borg_note(format("# Quaffing %s.", borg_items[i].desc)); /* Perform the action */ borg_keypress('q'); borg_keypress(I2A(i)); /* Hack -- Clear "shop" goals */ goal_shop = goal_ware = goal_item = -1; /* Success */ return (TRUE); } /* * Hack -- attempt to quaff an unknown potion */ bool borg_quaff_unknown(void) { int i, n = -1; /* Scan the pack */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Require correct tval */ if (item->tval != TV_POTION) continue; /* Skip aware items */ if (item->kind) continue; /* Save this item */ n = i; } /* None available */ if (n < 0) return (FALSE); /* Log the message */ borg_note(format("# Quaffing unknown potion %s.", borg_items[n].desc)); /* Perform the action */ borg_keypress('q'); borg_keypress(I2A(n)); /* Hack -- Clear "shop" goals */ goal_shop = goal_ware = goal_item = -1; /* Success */ return (TRUE); } /* * Hack -- attempt to read an unknown scroll */ bool borg_read_unknown(void) { int i, n = -1; /* Scan the pack */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Require correct tval */ if (item->tval != TV_SCROLL) continue; /* Skip aware items */ if (item->kind) continue; /* Save this item */ n = i; } /* None available */ if (n < 0) return (FALSE); /* Dark */ if (no_light()) return (FALSE); /* Blind or Confused */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED]) return (FALSE); /* Log the message */ borg_note(format("# Reading unknown scroll %s.", borg_items[n].desc)); /* Perform the action */ borg_keypress('r'); borg_keypress(I2A(n)); /* Incase it is ID scroll, ESCAPE out. */ borg_keypress(ESCAPE); /* Hack -- Clear "shop" goals */ goal_shop = goal_ware = goal_item = -1; /* Success */ return (TRUE); } /* * Hack -- attempt to eat an unknown potion. This is done in emergencies. */ bool borg_eat_unknown(void) { int i, n = -1; /* Scan the pack */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Require correct tval */ if (item->tval != TV_FOOD) continue; /* Skip aware items */ if (item->kind) continue; /* Save this item */ n = i; } /* None available */ if (n < 0) return (FALSE); /* Log the message */ borg_note(format("# Eating unknown mushroom %s.", borg_items[n].desc)); /* Perform the action */ borg_keypress('E'); borg_keypress(I2A(n)); /* Hack -- Clear "shop" goals */ goal_shop = goal_ware = goal_item = -1; /* Success */ return (TRUE); } /* * Hack -- attempt to use an unknown staff. This is done in emergencies. */ bool borg_use_unknown(void) { int i, n = -1; /* Scan the pack */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Require correct tval */ if (item->tval != TV_STAFF) continue; /* Skip aware items */ if (item->kind) continue; /* Save this item */ n = i; } /* None available */ if (n < 0) return (FALSE); /* Log the message */ borg_note(format("# Using unknown Staff %s.", borg_items[n].desc)); /* record the address to avoid certain bugs with inscriptions&amnesia */ zap_slot = n; /* Perform the action */ borg_keypress('u'); borg_keypress(I2A(n)); /* Incase it is ID staff, ESCAPE out. */ borg_keypress(ESCAPE); /* Success */ return (TRUE); } /* * Hack -- attempt to read the given scroll (by sval) */ bool borg_read_scroll(int sval) { int i; /* Dark */ if (no_light()) return (FALSE); /* Blind or Confused or Amnesia*/ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISFORGET]) return (FALSE); /* Look for that scroll */ i = borg_slot(TV_SCROLL, sval); /* None available */ if (i < 0) return (FALSE); /* Log the message */ borg_note(format("# Reading %s.", borg_items[i].desc)); /* Perform the action */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress('r'); borg_keypress(I2A(i)); /* Hack -- Clear "shop" goals */ goal_shop = goal_ware = goal_item = -1; /* Success */ return (TRUE); } /* Return the relative chance for failure to activate an item. * The lower the number, the better the chance of success * 200 is 80% of success * 600 is 40% chance of success */ int borg_activate_failure(int tval, int sval) { int lev; int skill; int fail; int i; /* Look for that item */ i = borg_slot(tval, sval); /* None available */ if (i < 0) return (100); /* No charges */ if (!borg_items[i].pval) return (100); /* Extract the item level */ lev = (borg_items[i].level); /* Base chance of success */ skill = borg_skill[BI_DEV]; /* Confusion hurts skill */ if (borg_skill[BI_ISCONFUSED]) skill = skill * 75 / 100; /* High level objects are harder */ fail = 100 * ((skill - lev) - (141 - 1)) / ((lev - skill) - (100 - 10)); /* Yep we got one */ return (fail); } /* * Hack -- checks rod (by sval) and * make a fail check on it. */ bool borg_equips_rod(int sval) { int i, skill, lev; int fail; /* Look for that staff */ i = borg_slot(TV_ROD, sval); /* None available */ if (i < 0) return (FALSE); /* No charges */ if (!borg_items[i].pval) return (FALSE); /* Extract the item level */ lev = (borg_items[i].level); /* Base chance of success */ skill = borg_skill[BI_DEV]; /* Confusion hurts skill */ if (borg_skill[BI_ISCONFUSED]) skill = skill * 75 / 100; /* High level objects are harder */ fail = 100 * ((skill - lev) - (141 - 1)) / ((lev - skill) - (100 - 10)); /* Roll for usage (at least 1/2 chance of success. */ if (fail > 500) return (FALSE); /* Yep we got one */ return (TRUE); } /* * Hack -- attempt to zap the given (charged) rod (by sval) */ bool borg_zap_rod(int sval) { int i, lev, fail; int skill; /* Look for that rod */ i = borg_slot(TV_ROD, sval); /* None available */ if (i < 0) return (FALSE); /* Hack -- Still charging */ if (!borg_items[i].pval) return (FALSE); /* Extract the item level */ lev = (borg_items[i].level); /* Base chance of success */ skill = borg_skill[BI_DEV]; /* Confusion hurts skill */ if (borg_skill[BI_ISCONFUSED]) skill = skill * 75 / 100; /* High level objects are harder */ fail = 100 * ((skill - lev) - (141 - 1)) / ((lev - skill) - (100 - 10)); /* Roll for usage */ if (sval != SV_ROD_RECALL) { if (fail > 500) return (FALSE); } /* Log the message */ borg_note(format("# Zapping %s.", borg_items[i].desc)); /* Perform the action */ borg_keypress('z'); borg_keypress(I2A(i)); /* Success */ return (TRUE); } /* * Hack -- attempt to aim the given (charged) wand (by sval) */ bool borg_aim_wand(int sval) { int i; /* Look for that wand */ i = borg_slot(TV_WAND, sval); /* None available */ if (i < 0) return (FALSE); /* No charges */ if (!borg_items[i].pval) return (FALSE); /* record the address to avoid certain bugs with inscriptions&amnesia */ zap_slot = i; /* Log the message */ borg_note(format("# Aiming %s.", borg_items[i].desc)); /* Perform the action */ borg_keypress('a'); borg_keypress(I2A(i)); /* Success */ return (TRUE); } /* * Hack -- attempt to use the given (charged) staff (by sval) */ bool borg_use_staff(int sval) { int i; /* Look for that staff */ i = borg_slot(TV_STAFF, sval); /* None available */ if (i < 0) return (FALSE); /* No charges */ if (!borg_items[i].pval) return (FALSE); /* record the address to avoid certain bugs with inscriptions&amnesia */ zap_slot = i; /* Log the message */ borg_note(format("# Using %s.", borg_items[i].desc)); /* Perform the action */ borg_keypress('u'); borg_keypress(I2A(i)); /* Success */ return (TRUE); } /* * Hack -- attempt to use the given (charged) staff (by sval) and * make a fail check on it. */ bool borg_use_staff_fail(int sval) { int i, fail, lev; int skill; /* Look for that staff */ i = borg_slot(TV_STAFF, sval); /* None available */ if (i < 0) return (FALSE); /* No charges */ if (!borg_items[i].pval) return (FALSE); /* record the address to avoid certain bugs with inscriptions&amnesia */ zap_slot = i; /* Extract the item level */ lev = (borg_items[i].level); /* Base chance of success */ skill = borg_skill[BI_DEV]; /* Confusion hurts skill */ if (borg_skill[BI_ISCONFUSED]) skill = skill * 75 / 100; /* High level objects are harder */ fail = 100 * ((skill - lev) - (141 - 1)) / ((lev - skill) - (100 - 10)); /* Roll for usage, but if its a Teleport be generous. */ if (fail > 500) { if (sval != SV_STAFF_TELEPORTATION) { return (FALSE); } /* We need to give some "desparation attempt to teleport staff" */ if (!borg_skill[BI_ISCONFUSED] && !borg_skill[BI_ISBLIND]) /* Dark? */ { /* We really have no chance, return false, attempt the scroll */ if (fail > 500) return (FALSE); } /* We might have a slight chance, or we cannot not read */ } /* record the address to avoid certain bugs with inscriptions&amnesia */ zap_slot = i; /* Log the message */ borg_note(format("# Using %s.", borg_items[i].desc)); /* Perform the action */ borg_keypress('u'); borg_keypress(I2A(i)); /* Success */ return (TRUE); } /* * Hack -- checks staff (by sval) and * make a fail check on it. */ bool borg_equips_staff_fail(int sval) { int i, fail, lev; int skill; /* Look for that staff */ i = borg_slot(TV_STAFF, sval); /* None available */ if (i < 0) return (FALSE); /* No charges */ if (!borg_items[i].pval) return (FALSE); /* Extract the item level */ lev = (borg_items[i].level); /* Base chance of success */ skill = borg_skill[BI_DEV]; /* Confusion hurts skill */ if (borg_skill[BI_ISCONFUSED]) skill = skill * 75 / 100; /* High level objects are harder */ fail = 100 * ((skill - lev) - (141 - 1)) / ((lev - skill) - (100 - 10)); /* If its a Destruction, we only use it in emergencies, attempt it */ if (sval == SV_STAFF_DESTRUCTION) { return (TRUE); } /* Roll for usage, but if its a Teleport be generous. */ if (fail > 500) { /* No real chance of success on other types of staffs */ if (sval != SV_STAFF_TELEPORTATION) { return (FALSE); } /* We need to give some "desparation attempt to teleport staff" */ if (sval == SV_STAFF_TELEPORTATION && !borg_skill[BI_ISCONFUSED]) { /* We really have no chance, return false, attempt the scroll */ if (fail < 650) return (FALSE); } /* We might have a slight chance (or its a Destruction), continue on */ } /* Yep we got one */ return (TRUE); } /* * Attempt to use the given artifact */ bool borg_activate_artifact(int activation) { int i; assert(activation); /* Check the equipment */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { borg_item *item = &borg_items[i]; /* Skip artifacts w/o activation */ if (!item->name1 || a_info[item->name1].effect != activation) continue; /* Check charge */ if (item->timeout) continue; /* * Random Artifact must be *ID* to know the activation power. * The borg will cheat with random artifacts to know if the * artifact number is activatable, but artifact names and * types will be scrambled. So he must first *ID* the artifact * he must play with the artifact to learn its power, just as * he plays with magic to gain experience. But I am not about * to undertake that coding. He needs to *ID* it anyway to learn * of the resists that go with the artifact. * Lights dont need *id* just regular id. */ if ((op_ptr->opt[OPT_birth_randarts] || op_ptr->opt[OPT_birth_randarts]) && (item->activation != EF_ILLUMINATION && item->activation != EF_MAPPING && item->activation != EF_CLAIRVOYANCE) && (!item->fully_identified)) { borg_note(format("# %s must be *ID*'d before activation.", item->desc)); return (FALSE); } /* Log the message */ borg_note(format("# Activating artifact %s.", item->desc)); /* Perform the action */ borg_keypress('A'); borg_keypress(I2A(i - INVEN_WIELD)); /* Success */ return (TRUE); } /* Oops */ return (FALSE); } /* * Hack -- check and see if borg is wielding an artifact */ bool borg_equips_artifact(int activation) { int i; /* Check the equipment */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { borg_item *item = &borg_items[i]; artifact_type *a_ptr; /* Skip non artifacts */ /* if (!artifact_p(item)) continue; */ /* get the item */ a_ptr = &a_info[item->name1]; /* Skip artifacts w/o activation */ /* TR2_activate was removed */ if (!a_info[item->name1].effect && !k_info[item->kind].effect) continue; /* Skip wrong activation */ if (a_ptr->effect != activation) continue; /* Check charge. But not on certain ones Wor, ID, phase, TELEPORT.*/ /* this is to ensure that his borg_prep code is working ok */ if ((activation != EF_RECALL && activation != EF_IDENTIFY && activation != EF_TELE_PHASE && activation != EF_TELE_LONG) && (item->timeout >= 1) ) continue; /* * Random Artifact must be *ID* to know the activation power. * The borg will cheat with random artifacts to know if the * artifact number is activatable, but artifact names and * types will be scrambled. So he must first *ID* the artifact * he must play with the artifact to learn its power, just as * he plays with magic to gain experience. But I am not about * to undertake that coding. He needs to *ID* it anyway to learn * of the resists that go with the artifact. * Lights dont need *id* just regular id. */ if ((op_ptr->opt[OPT_birth_randarts] || op_ptr->opt[OPT_birth_randarts]) && (item->activation != EF_ILLUMINATION && item->activation != EF_MAPPING && item->activation != EF_CLAIRVOYANCE) && (!item->fully_identified)) { borg_note(format("# %s must be *ID*'d before activation.", item->desc)); return (FALSE); } /* Success */ return (TRUE); } /* I do not have it or it is not charged */ return (FALSE); } /* * Check and see if borg is wielding an artifact */ bool borg_equips_item(int tval, int sval) { int i; int lev, fail; int skill; /* Check the equipment-- */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { borg_item *item = &borg_items[i]; /* Skip incorrect artifacts */ if (item->tval != tval) continue; if (item->sval != sval) continue; /* Check charge. */ if (item->timeout) continue; /* Extract the item level for fail rate check*/ lev = item->level; /* Base chance of success */ skill = borg_skill[BI_DEV]; /* Confusion hurts skill */ if (borg_skill[BI_ISCONFUSED]) skill = skill * 75 / 100; /* High level objects are harder */ fail = 100 * ((skill - lev) - (141 - 1)) / ((lev - skill) - (100 - 10)); /* Roll for usage. Return Fail if greater than 50% fail. Must beat 500 to succeed. */ if (fail > 500) continue; /* Success */ return (TRUE); } /* I guess I dont have it, or it is not ready, or too hard to activate. */ return (FALSE); } /* * Attempt to use the given equipment item. */ bool borg_activate_item(int tval, int sval, bool target) { int i; /* Check the equipment */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { borg_item *item = &borg_items[i]; /* Skip incorrect items */ if (item->tval != tval) continue; if (item->sval != sval) continue; /* Check charge */ if (item->timeout) return (FALSE); /* Log the message */ borg_note(format("# Activating item %s.", item->desc)); /* Perform the action */ borg_keypress('A'); borg_keypress(I2A(i - INVEN_WIELD)); /* Some items require a target */ if (target) { borg_keypress('5'); } /* Success */ return (TRUE); } /* Oops */ return (FALSE); } /* * Hack -- check and see if borg is wielding a dragon armor and if * he will pass a fail check. */ bool borg_equips_dragon(int drag_sval) { int lev, fail; int skill; int numerator; int denominator; /* Check the equipment */ borg_item *item = &borg_items[INVEN_BODY]; /* Skip incorrect armours */ if (item->tval !=TV_DRAG_ARMOR) return (FALSE); if (item->sval != drag_sval) return (FALSE); /* Check charge */ if (item->timeout) return (FALSE); /* Make Sure Mail is IDed */ if (!item->ident) return (FALSE); /* check on fail rate * The fail check is automatic for dragon armor. It is an attack * item. He should not sit around failing 5 or 6 times in a row. * he should attempt to activate it, and if he is likely to fail, then * eh should look at a different attack option. We are assuming * that the fail rate is about 50%. So He may still try to activate it * and fail. But he will not even try if he has negative chance or * less than twice the USE_DEVICE variable */ /* Extract the item level */ lev = borg_items[INVEN_BODY].level; /* Base chance of success */ skill = borg_skill[BI_DEV]; /* Confusion hurts skill */ if (borg_skill[BI_ISCONFUSED]) skill = skill * 75 / 100; /* High level objects are harder */ numerator = (skill - lev) - (141 - 1); denominator = (lev - skill) - (100 - 10); /* Make sure that we don't divide by zero */ if (denominator == 0) denominator = numerator > 0 ? 1 : -1; fail = (100 * numerator) / denominator; /* Roll for usage, but if its a Teleport be generous. */ if (fail > 500) return (FALSE); /* Success */ return (TRUE); } /* * Hack -- attempt to use the given dragon armour */ bool borg_activate_dragon(int drag_sval) { /* Check the equipment */ borg_item *item = &borg_items[INVEN_BODY]; /* Skip incorrect mails */ if (item->tval != TV_DRAG_ARMOR) return (FALSE); if (item->sval != drag_sval) return (FALSE); /* Check charge */ if (item->timeout) return (FALSE); /* Make Sure Mail is IDed */ if (!item->ident) return (FALSE); /* Log the message */ borg_note(format("# Activating dragon scale %s.", item->desc)); /* Perform the action */ borg_keypress('A'); borg_keypress(I2A(INVEN_BODY - INVEN_WIELD)); /* Success */ return (TRUE); } /* * Hack -- check and see if borg is wielding a ring and if * he will pass a fail check. */ bool borg_equips_ring(int ring_sval) { int lev, fail, i; int skill; for (i = INVEN_LEFT; i < INVEN_RIGHT; i++) { borg_item *item = &borg_items[i]; /* Skip incorrect armours */ if (item->tval !=TV_RING) continue; if (item->sval != ring_sval) continue; /* Check charge */ if (item->timeout) continue; /* Make Sure is IDed */ if (!item->ident) continue; /* check on fail rate */ /* Extract the item level */ lev = borg_items[i].level; /* Base chance of success */ skill = borg_skill[BI_DEV]; /* Confusion hurts skill */ if (borg_skill[BI_ISCONFUSED]) skill = skill * 75 / 100; /* High level objects are harder */ fail = 100 * ((skill - lev) - (141 - 1)) / ((lev - skill) - (100 - 10)); /* Roll for usage, but if its a Teleport be generous. */ if (fail > 500) continue; /* Success */ return (TRUE); } return (FALSE); } /* * Hack -- attempt to use the given ring */ bool borg_activate_ring(int ring_sval) { int i; /* Check the equipment */ for (i = INVEN_LEFT; i < INVEN_RIGHT; i++) { borg_item *item = &borg_items[i]; /* Skip incorrect mails */ if (item->tval != TV_RING) continue; if (item->sval != ring_sval) continue; /* Check charge */ if (item->timeout) continue; /* Make Sure item is IDed */ if (!item->ident) continue; /* Log the message */ borg_note(format("# Activating ring %s.", item->desc)); /* Perform the action */ borg_keypress('A'); borg_keypress(I2A(i - INVEN_WIELD)); /* Success */ return (TRUE); } return (FALSE); } /* * Determine if borg can cast a given spell (when fully rested) */ bool borg_spell_legal(int book, int what) { borg_magic *as = &borg_magics[book][what]; /* The borg must be able to "cast" spells */ if (p_ptr->class->spell_book != TV_MAGIC_BOOK) return (FALSE); /* The book must be possessed */ if (amt_book[book] <= 0) return (FALSE); /* The spell must be "known" */ if (as->status < BORG_MAGIC_TEST) return (FALSE); /* The spell must be affordable (when rested) */ if (as->power > borg_skill[BI_MAXSP]) return (FALSE); /* Success */ return (TRUE); } /* * Determine if borg can cast a given spell (right now) */ bool borg_spell_okay(int book, int what) { int reserve_mana = 0; borg_magic *as = &borg_magics[book][what]; /* Dark */ if (no_light()) return (FALSE); /* Define reserve_mana for each class */ if (borg_class == CLASS_MAGE) reserve_mana = 6; if (borg_class == CLASS_RANGER) reserve_mana = 22; if (borg_class == CLASS_ROGUE) reserve_mana = 20; /* Low level spell casters should not worry about this */ if (borg_skill[BI_CLEVEL] < 35) reserve_mana = 0; /* Require ability (when rested) */ if (!borg_spell_legal(book, what)) return (FALSE); /* Hack -- blind/confused/amnesia */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED]) return (FALSE); /* The spell must be affordable (now) */ if (as->power > borg_skill[BI_CURSP]) return (FALSE); /* Do not cut into reserve mana (for final teleport) */ if (borg_skill[BI_CURSP] - as->power < reserve_mana) { /* Phase spells ok */ if (book == 0 && what == 2) return (TRUE); /* Teleport spells ok */ if (book == 1 && what == 5) return (TRUE); /* Satisfy Hunger OK */ if (book == 2 && what == 0) return (TRUE); /* Magic Missile OK */ if (book == 0 && what == 0 && borg_skill[BI_CDEPTH] <= 35) return (TRUE); /* others are rejected */ return (FALSE); } /* Success */ return (TRUE); } /* * fail rate on a spell */ int borg_spell_fail_rate(int book, int what) { int chance, minfail; borg_magic *as = &borg_magics[book][what]; /* Access the spell */ chance = as->sfail; /* Reduce failure rate by "effective" level adjustment */ chance -= 3 * (borg_skill[BI_CLEVEL] - as->level); /* Reduce failure rate by INT/WIS adjustment */ chance -= (adj_mag_stat[my_stat_ind[A_INT]]); /* Fear makes the failrate higher */ if (borg_skill[BI_ISAFRAID]) chance += 20; /* Extract the minimum failure rate */ minfail = adj_mag_fail[my_stat_ind[A_INT]]; /* Non mage characters never get too good */ if (!player_has(PF_ZERO_FAIL)) { if (minfail < 5) minfail = 5; } /* Minimum failure rate and max */ if (chance < minfail) chance = minfail; if (chance > 50) chance = 50; /* Stunning makes spells harder */ if (borg_skill[BI_ISHEAVYSTUN]) chance += 25; if (borg_skill[BI_ISSTUN]) chance += 15; /* Amnesia makes it harder */ if (borg_skill[BI_ISFORGET]) chance *= 2; /* Always a 5 percent chance of working */ if (chance > 95) chance = 95; /* Return the chance */ return (chance); } /* * same as borg_spell_okay with a fail % check */ bool borg_spell_okay_fail(int book, int what, int allow_fail ) { if (borg_spell_fail_rate(book, what) > allow_fail) return FALSE; return borg_spell_okay( book, what ); } /* * Same as borg_spell with a fail % check */ bool borg_spell_fail(int book, int what, int allow_fail) { if (borg_spell_fail_rate(book, what) > allow_fail) return FALSE; return borg_spell( book, what ); } /* * Same as borg_spell_legal with a fail % check */ bool borg_spell_legal_fail(int book, int what, int allow_fail) { if (borg_spell_fail_rate(book, what) > allow_fail) return FALSE; return borg_spell_legal( book, what ); } /* * Attempt to cast a spell */ bool borg_spell(int book, int what) { int i; borg_magic *as = &borg_magics[book][what]; /* Require ability (right now) */ if (!borg_spell_okay(book, what)) return (FALSE); /* Look for the book */ i = borg_book[book]; /* Paranoia */ if (i < 0) return (FALSE); /* Debugging Info */ borg_note(format("# Casting %s (%d,%d).", as->name, book, what)); /* Cast a spell */ borg_keypress('m'); borg_keypress(I2A(i)); borg_keypress(I2A(what)); /* increment the spell counter */ as->times ++; /* Success */ return (TRUE); } /* * Determine if borg can pray a given prayer (when fully rested) */ bool borg_prayer_legal(int book, int what) { borg_magic *as = &borg_magics[book][what]; /* The borg must be able to "pray" prayers */ if (p_ptr->class->spell_book != TV_PRAYER_BOOK) return (FALSE); /* Look for the book */ if (amt_book[book] <= 0) return (FALSE); /* The prayer must be "known" */ if (as->status < BORG_MAGIC_TEST) return (FALSE); /* The prayer must be affordable (when fully rested) */ if (as->power > borg_skill[BI_MAXSP]) return (FALSE); /* Success */ return (TRUE); } /* * Determine if borg can pray a given prayer (right now) */ bool borg_prayer_okay(int book, int what) { int reserve_mana =0; borg_magic *as = &borg_magics[book][what]; /* Dark */ if (no_light()) return (FALSE); /* define reserve_mana */ if (borg_class == CLASS_PRIEST) reserve_mana = 8; if (borg_class == CLASS_PALADIN) reserve_mana = 20; /* Low level spell casters should not worry about this */ if (borg_skill[BI_CLEVEL] < 35) reserve_mana = 0; /* Require ability (when rested) */ if (!borg_prayer_legal(book, what)) return (FALSE); /* Hack -- blind/confused/amnesia */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED]) return (FALSE); /* The prayer must be affordable (right now) */ if (as->power > borg_skill[BI_CURSP]) return (FALSE); /* Do not cut into reserve mana (for final teleport) */ if (borg_skill[BI_CURSP] - as->power < reserve_mana) { /* Phase spells ok */ if (book == 1 && what == 1) return (TRUE); if (book == 4 && what == 0) return (TRUE); /* Teleport spells ok */ if (book == 4 && what == 1) return (TRUE); /* Satisfy Hunger spells ok */ if (book == 1 && what == 5) return (TRUE); /* Banishment is OK, */ if (book == 8 && what == 2) return (TRUE); /* others are rejected */ return (FALSE); } /* Success */ return (TRUE); } int borg_prayer_fail_rate(int book, int what) { int chance, minfail; borg_magic *as = &borg_magics[book][what]; /* Access the spell */ chance = as->sfail; /* Reduce failure rate by "effective" level adjustment */ chance -= 3 * (borg_skill[BI_CLEVEL] - as->level); /* Reduce failure rate by INT/WIS adjustment */ chance -= (adj_mag_stat[my_stat_ind[A_WIS]]); /* Extract the minimum failure rate */ minfail = adj_mag_fail[my_stat_ind[A_WIS]]; /* Non priest characters never get too good */ if (!player_has(PF_ZERO_FAIL)) { if (minfail < 5) minfail = 5; } /* Hack -- Priest prayer penalty for "edged" weapons -DGK */ if (player_has(PF_BLESS_WEAPON)) { borg_item *item; item = &borg_items[INVEN_WIELD]; /* Penalize non-blessed edged weapons */ if ((item->tval == TV_SWORD || item->tval == TV_POLEARM) && !of_has(item->flags, OF_BLESSED)) { chance += 25; } } /* Fear makes it more difficult */ if (borg_skill[BI_ISAFRAID]) chance += 20; /* Minimum failure rate */ if (chance < minfail) chance = minfail; if (chance > 50) chance = 50; /* Stunning makes spells harder */ if (borg_skill[BI_ISHEAVYSTUN]) chance += 25; if (borg_skill[BI_ISSTUN]) chance += 15; /* Always a 5 percent chance of working */ if (chance > 95) chance = 95; /* Return the chance */ return (chance); } /* * same as borg_prayer_okay with a fail % check */ bool borg_prayer_okay_fail(int book, int what, int allow_fail ) { if (borg_prayer_fail_rate(book, what) > allow_fail) return FALSE; return borg_prayer_okay( book, what ); } /* * Same as borg_prayer with a fail % check */ bool borg_prayer_fail(int book, int what, int allow_fail) { if (borg_prayer_fail_rate(book, what) > allow_fail) return FALSE; return borg_prayer( book, what ); } /* * Same as borg_prayer_legal with a fail % check */ bool borg_prayer_legal_fail(int book, int what, int allow_fail) { if (borg_prayer_fail_rate(book, what) > allow_fail) return FALSE; return borg_prayer_legal( book, what ); } /* * Attempt to pray a prayer */ bool borg_prayer(int book, int what) { int i; borg_magic *as = &borg_magics[book][what]; /* Require ability (right now) */ if (!borg_prayer_okay(book, what)) return (FALSE); /* Look for the book */ i = borg_book[book]; /* Paranoia */ if (i < 0) return (FALSE); /* Debugging Info */ borg_note(format("# Praying %s (%d,%d).", as->name, book, what)); /* Pray a prayer */ borg_keypress('p'); borg_keypress(I2A(i)); borg_keypress(I2A(what)); /* Because we have no launch message to indicate failure */ if (book ==3 && what ==4) { borg_casted_glyph = TRUE; } else { borg_casted_glyph = FALSE; } /* increment the spell counter */ as->times ++; /* Success */ return (TRUE); } /* * Inscribe food and Slime Molds */ extern bool borg_inscribe_food(void) { int ii; char name[80]; for (ii=0; ii < INVEN_TOTAL; ii++) { borg_item *item = &borg_items[ii]; /* Skip empty items */ if (!item->iqty) continue; /* Require correct tval */ if (item->tval != TV_FOOD) continue; /* skip things already inscribed */ if (!(streq(item->note, "")) && !(streq(item->note, "{ }"))) continue; /* inscribe foods and molds */ if (item->sval == SV_FOOD_SLIME_MOLD || item->sval == SV_FOOD_RATION) { if (item->sval == SV_FOOD_RATION) { /* get a name */ strcpy(name, food_syllable1[randint0(sizeof(food_syllable1) / sizeof(char*))]); strcat(name, food_syllable2[randint0(sizeof(food_syllable2) / sizeof(char*))]); borg_send_inscribe(ii, name); return (TRUE); } if (item->sval == SV_FOOD_SLIME_MOLD) { /* get a name */ strcpy(name, mold_syllable1[randint0(sizeof(mold_syllable1) / sizeof(char*))]); strcat(name, mold_syllable2[randint0(sizeof(mold_syllable2) / sizeof(char*))]); strcat(name, mold_syllable3[randint0(sizeof(mold_syllable3) / sizeof(char*))]); borg_send_inscribe(ii, name); return (TRUE); } } } /* all done */ return (FALSE); } /* * Send a command to de-inscribe item number "i" . */ void borg_send_deinscribe(int i) { /* Ok to inscribe Slime Molds */ if (borg_items[i].tval == TV_FOOD && borg_items[i].sval == SV_FOOD_SLIME_MOLD) return; /* Label it */ borg_keypress('}'); /* Choose from inventory */ if (i < INVEN_WIELD) { /* Choose the item */ borg_keypress(I2A(i)); } /* Choose from equipment */ else { /* Go to equipment (if necessary) */ if (borg_items[0].iqty) borg_keypress('/'); /* Choose the item */ borg_keypress(I2A(i - INVEN_WIELD)); } /* May ask for a confirmation */ borg_keypress('y'); borg_keypress('y'); } /* * Return the owner struct for the given store. */ static struct owner *store_owner(int st) { return stores[st].owner; } /* (This is copied from store.c * Determine the price of an object (qty one) in a store. * * store_buying == TRUE means the shop is buying, player selling * == FALSE means the shop is selling, player buying * * This function takes into account the player's charisma, but * never lets a shop-keeper lose money in a transaction. * * The "greed" value should exceed 100 when the player is "buying" the * object, and should be less than 100 when the player is "selling" it. * * Hack -- the black market always charges twice as much as it should. */ s32b borg_price_item(const object_type *o_ptr, bool store_buying, int qty, int this_store) { int adjust; s32b price; owner_type *ot_ptr; if (this_store == STORE_NONE) return 0L; ot_ptr = store_owner(this_store); /* Get the value of the stack of wands, or a single item */ if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF)) price = object_value(o_ptr, qty, FALSE); else price = object_value(o_ptr, 1, FALSE); /* Worthless items */ if (price <= 0) return (0L); /* Add in the charisma factor */ if (this_store == STORE_B_MARKET) adjust = 150; else adjust = 100; /* Shop is buying */ if (store_buying) { /* Set the factor */ adjust = 100 + (100 - adjust); if (adjust > 100) adjust = 100; /* Shops now pay 2/3 of true value */ price = price * 2 / 3; /* Mega-Hack -- Black market sucks */ if (this_store == STORE_B_MARKET) price = price / 2; /* Check for no_selling option */ if (OPT(birth_no_selling)) return (0L); } /* Shop is selling */ else { /* Fix the factor */ if (adjust < 100) adjust = 100; /* Mega-Hack -- Black market sucks */ if (this_store == STORE_B_MARKET) price = price * 2; } /* Compute the final price (with rounding) */ price = (price * adjust + 50L) / 100L; /* Now convert price to total price for non-wands */ if (!(o_ptr->tval == TV_WAND) && !(o_ptr->tval == TV_STAFF)) price *= qty; /* Now limit the price to the purse limit */ if (store_buying && (price > ot_ptr->max_cost * qty)) price = ot_ptr->max_cost * qty; /* Note -- Never become "free" */ if (price <= 0L) return (qty); /* Return the price */ return (price); } /* * Cheat the "equip" screen */ void borg_cheat_equip(void) { int i; char buf[256]; /* Extract the equipment */ for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL; i++) { /* skip non items */ if (!p_ptr->inventory[i].kind) { /* Be sure to wipe it from the borg equip */ WIPE(&borg_items[i], borg_item); } /* Default to "nothing" */ buf[0] = '\0'; /* Describe a real item */ if (p_ptr->inventory[i].kind) { /* Describe it */ object_desc(buf, sizeof(buf), &p_ptr->inventory[i], ODESC_FULL); /* Analyze the item (no price) */ borg_item_analyze(&borg_items[i], &p_ptr->inventory[i], buf); /* get the fully id stuff */ if (p_ptr->inventory[i].ident & (IDENT_KNOWN | IDENT_EFFECT)) { borg_items[i].fully_identified = TRUE; borg_items[i].needs_I = FALSE; } /* Uninscribe items with ! inscriptions */ if (strstr(borg_items[i].desc, "!")) borg_send_deinscribe(i); } } } /* * Cheat the "inven" screen */ void borg_cheat_inven(void) { int i; char buf[256]; /* Extract the current weight */ borg_cur_wgt = p_ptr->total_weight; /* Extract the inventory */ for (i = 0; i < INVEN_MAX_PACK; i++) { /* Skip non-items */ if (!p_ptr->inventory[i].kind) { /* Wipe from borg lists */ WIPE(&borg_items[i], borg_item); } /* Default to "nothing" */ buf[0] = '\0'; /* Describe it */ object_desc(buf, sizeof(buf), &p_ptr->inventory[i], ODESC_FULL); /* Skip Empty slots */ if (streq(buf,"(nothing)")) continue; /* Analyze the item (no price) */ borg_item_analyze(&borg_items[i], &p_ptr->inventory[i], buf); /* get the fully id stuff */ if (p_ptr->inventory[i].ident & (IDENT_KNOWN | IDENT_EFFECT)) { borg_items[i].fully_identified = TRUE; borg_items[i].needs_I = FALSE; } /* Note changed inventory */ borg_do_crush_junk = TRUE; borg_do_crush_hole = TRUE; borg_do_crush_slow = TRUE; /* Uninscribe items with ! inscriptions */ if (strstr(borg_items[i].desc, "!")) {borg_send_deinscribe(i);} } } /* * Cheat the "Store" screen */ void borg_cheat_store(void) { int shop_num; /* Scan each store */ for (shop_num = 0; shop_num < MAX_STORES; shop_num++) { int slot; struct store *st_ptr = &stores[shop_num]; /* Clear the inventory from memory */ C_WIPE(&borg_shops[shop_num].ware, 24, borg_item); /* Check each existing object in this store */ for (slot = 0; slot < 24; slot++) { object_type *o_ptr = &st_ptr->stock[slot]; borg_item *b_item = &borg_shops[shop_num].ware[slot]; char buf[120]; /* Describe the item */ object_desc(buf, sizeof buf, o_ptr, ODESC_FULL); if (streq(buf, "(nothing)")) break; /* Analyze the item */ borg_item_analyze(b_item, o_ptr, buf); /* Need to be able to analyse the home inventory to see if it was */ /* *fully ID*d. */ if (o_ptr->ident & IDENT_KNOWN) { borg_object_star_id_aux(b_item, o_ptr); b_item->fully_identified = TRUE; } /* Check if the general store has certain items */ if (shop_num == 0) { /* Food -- needed for money scumming */ if (b_item->tval == TV_FOOD && b_item->sval == SV_FOOD_RATION) borg_food_onsale = b_item->iqty; /* Fuel for lanterns */ if (b_item->tval == TV_FLASK && borg_items[INVEN_LIGHT].sval == SV_LIGHT_LANTERN) borg_fuel_onsale = b_item->iqty; /* Fuel for lanterns */ if (b_item->tval == TV_LIGHT && borg_items[INVEN_LIGHT].sval == SV_LIGHT_TORCH) borg_fuel_onsale = b_item->iqty; } /* Hack -- Save the declared cost */ b_item->cost = borg_price_item(o_ptr, FALSE, 1, shop_num); } } } /* * Hack -- Cheat the "spell" info * * Hack -- note the use of the "cheat" field for efficiency */ void borg_cheat_spell(int book) { int what; /* Can we use spells/prayers? */ if (!p_ptr->class->spell_book) return; /* Process the Books */ /* for (book = 0; book < 9; book++) */ /* { */ /* Process the spells */ for (what = 0; what < 9; what++) { /* Access the spell */ borg_magic *as = &borg_magics[book][what]; /* Skip illegible spells */ if (as->status == BORG_MAGIC_ICKY) continue; /* Note "forgotten" spells */ if (p_ptr->spell_flags[as->cheat] & PY_SPELL_FORGOTTEN) { /* Forgotten */ as->status = BORG_MAGIC_LOST; } /* Note "difficult" spells */ else if (borg_skill[BI_CLEVEL] < as->level) { /* Unknown */ as->status = BORG_MAGIC_HIGH; } /* Note "Unknown" spells */ else if (!(p_ptr->spell_flags[as->cheat] & PY_SPELL_LEARNED)) { /* UnKnown */ as->status = BORG_MAGIC_OKAY; } /* Note "untried" spells */ else if (!(p_ptr->spell_flags[as->cheat] & PY_SPELL_WORKED)) { /* Untried */ as->status = BORG_MAGIC_TEST; } /* Note "known" spells */ else { /* Known */ as->status = BORG_MAGIC_KNOW; } } /* } */ } /* * Prepare a book */ static void prepare_book_info(void) { int what; int book; int index; /* Reset each spell entry */ for (book = 0; book < 9; book++) { for (what = 0; what < 9; what++) { borg_magic *as = &borg_magics[book][what]; /* Assume no name */ as->name = NULL; /* Assume illegible */ as->status = BORG_MAGIC_ICKY; /* Assume illegible */ as->method = BORG_MAGIC_ICK; /* Impossible values */ as->level = 99; as->power = 99; /* Impossible value */ as->cheat = 99; } } /* Can we use spells/prayers? */ if (!p_ptr->class->spell_book) return; /* define the spell type */ if (p_ptr->class->spell_book == TV_MAGIC_BOOK) { /* Mage book */ index = 0; } else { /* Priest */ index = 1; } /* Process each existing spell */ for (book = 0; book < 9; book++) { for (what = 0; what < 9; what++) { borg_magic *as = &borg_magics[book][what]; const magic_type *spell_ptr; /* access the game index */ spell_ptr = &p_ptr->class->spells.info[borg_magic_index[index][book][what]]; /* Save the spell index */ as->cheat = borg_magic_index[index][book][what]; /* Hack -- assume excessive level */ as->status = BORG_MAGIC_HIGH; /* Access the correct "method" */ as->method = borg_magic_method[index][book][what]; /* Access the correct "rating" */ as->rating = borg_magic_rating[index][book][what]; /* Save the spell name */ as->name = borg_magic_name[index][book][what]; /* Skip blank ones */ if (as->cheat == 99) continue; /* Save the spell level */ as->level = spell_ptr->slevel; /* Save the spell mana */ as->power = spell_ptr->smana; /* Save the spell fail ratename */ as->sfail = spell_ptr->sfail; } } } /* * Hack -- prepare some stuff based on the player race and class */ void prepare_race_class_info(void) { /* Initialize the various spell arrays by book */ prepare_book_info(); } void borg_clear_3(void) { FREE(borg_items); FREE(borg_shops); FREE(safe_items); FREE(safe_home); FREE(safe_shops); FREE(borg_plural_text); FREE(borg_sv_plural_text); FREE(borg_plural_what); FREE(borg_single_text); FREE(borg_single_what); FREE(borg_artego_text); FREE(borg_sv_art_text); FREE(borg_artego_what); } /* * Initialize this file * * Note that all six artifact "Rings" will parse as "kind 506" * (the first artifact ring) and both artifact "Amulets" will * parse as "kind 503" (the first of the two artifact amulets), * but as long as we use the "name1" field (and not the "kind" * or "sval" fields) we should be okay. * * We sort the two arrays of items names in reverse order, so that * we will catch "mace of disruption" before "mace", "Scythe of * Slicing" before "Scythe", and for "Ring of XXX" before "Ring". * * Note that we do not have to parse "plural artifacts" (!) * * Hack -- This entire routine is a giant hack, but it works */ void borg_init_3(void) { int i, k, n; int size; s16b what[514]; char *text[514]; char buf[256]; /*** Item/Ware arrays ***/ /* Make the inventory array */ C_MAKE(borg_items, QUIVER_END, borg_item); /* Make the stores in the town */ C_MAKE(borg_shops, 9, borg_shop); /*** Item/Ware arrays (simulation) ***/ /* Make the "safe" inventory array */ C_MAKE(safe_items, QUIVER_END, borg_item); C_MAKE(safe_home, STORE_INVEN_MAX, borg_item); /* Make the "safe" stores in the town */ C_MAKE(safe_shops, 8, borg_shop); /*** Plural Object Templates ***/ /* Start with no objects */ size = 0; /* Analyze some "item kinds" */ for (k = 1; k < z_info->k_max; k++) { object_type hack; /* Get the kind */ object_kind *k_ptr = &k_info[k]; /* Skip "empty" items */ if (!k_ptr->name) continue; /* Skip "gold" objects */ if (k_ptr->tval == TV_GOLD) continue; /* Skip "artifacts" */ if (of_has(k_ptr->flags, OF_INSTA_ART)) continue; /* Hack -- make an item */ object_prep(&hack, &k_info[k], 10 , MINIMISE); /* Describe a "plural" object */ hack.number = 2; object_desc(buf, sizeof(buf), &hack, ODESC_PREFIX | ODESC_FULL | ODESC_SPOIL); /* Save an entry */ text[size] = string_make(buf); what[size] = k; size++; } /* Set the sort hooks */ borg_sort_comp = borg_sort_comp_hook; borg_sort_swap = borg_sort_swap_hook; /* Sort */ borg_sort(text, what, size); C_MAKE(borg_sv_plural_text, z_info->k_max, char *); for (i = 0; i < size; i++) borg_sv_plural_text[what[i]] = text[i]; /* Save the size */ borg_plural_size = size; /* Allocate the "item parsing arrays" (plurals) */ C_MAKE(borg_plural_text, borg_plural_size, char *); C_MAKE(borg_plural_what, borg_plural_size, s16b); /* Save the entries */ for (i = 0; i < size; i++) borg_plural_text[i] = text[i]; for (i = 0; i < size; i++) borg_plural_what[i] = what[i]; /*** Singular Object Templates ***/ /* Start with no objects */ size = 0; /* Analyze some "item kinds" */ for (k = 1; k < z_info->k_max; k++) { object_type hack; /* Get the kind */ object_kind *k_ptr = &k_info[k]; /* Skip "empty" items */ if (!k_ptr->name) continue; /* Skip "dungeon terrain" objects */ if (k_ptr->tval == TV_GOLD) continue; /* Skip "artifacts" */ if (of_has(k_ptr->flags, OF_INSTA_ART)) continue; /* Hack -- make an item */ object_prep(&hack, &k_info[k], 0, MINIMISE); /* Describe a "singular" object */ hack.number = 1; object_desc(buf, sizeof(buf), &hack, ODESC_PREFIX | ODESC_FULL | ODESC_SPOIL); /* Save an entry */ text[size] = string_make(buf); what[size] = k; size++; } /* Analyze the "INSTA_ART" items */ for (i = 1; i < z_info->a_max; i++) { object_type hack; artifact_type *a_ptr = &a_info[i]; char *name = (a_ptr->name); /* Skip "empty" items */ if (!a_ptr->name) continue; /* Hack-- to handle bug in 301 code. * In the object.txt file, the new artifacts (jewel, * elfstones) have the INSTA_ART flag, but the flag is * not listed in the artifact.txt file. Because of this, * these 2 items will be skipped over by the borg. * Remove this hack and restore the bypass below when * the bug in the artifact.txt file is fixed. */ if (!(of_has(a_ptr->flags, OF_INSTA_ART)) && i != 14 && /* elfstone */ i != 15) /* Jewel */ continue; #if 0 /* Remove this bypass when bug is fixed in artifact.txt */ /* Skip non INSTA_ART things */ if (!(a_ptr->flags[2] & TR2_INSTA_ART)) continue; #endif /* Extract the k"ind" */ k = borg_lookup_kind(a_ptr->tval, a_ptr->sval); /* Hack -- make an item */ object_prep(&hack, &k_info[k], 10, MINIMISE); /* Save the index */ /* hack.name1 = i; */ /* Describe a "singular" object */ hack.number = 1; object_desc(buf, sizeof(buf), &hack, ODESC_PREFIX | ODESC_FULL | ODESC_SPOIL); /* Extract the "suffix" length */ n = strlen(name) + 1; /* Remove the "suffix" */ buf[strlen(buf) - n] = '\0'; /* Save an entry */ text[size] = string_make(buf); what[size] = k; size++; } /* Set the sort hooks */ borg_sort_comp = borg_sort_comp_hook; borg_sort_swap = borg_sort_swap_hook; /* Sort */ borg_sort(text, what, size); /* Save the size */ borg_single_size = size; /* Allocate the "item parsing arrays" (plurals) */ C_MAKE(borg_single_text, borg_single_size, char *); C_MAKE(borg_single_what, borg_single_size, s16b); /* Save the entries */ for (i = 0; i < size; i++) borg_single_text[i] = text[i]; for (i = 0; i < size; i++) borg_single_what[i] = what[i]; /*** Artifact and Ego-Item Parsers ***/ /* No entries yet */ size = 0; /* Collect the "artifact names" */ for (k = 1; k < z_info->a_max; k++) { artifact_type *a_ptr = &a_info[k]; /* Skip non-items */ if (!a_ptr->name) continue; /* Extract a string */ sprintf(buf, " %s", (a_ptr->name)); /* Save an entry */ text[size] = string_make(buf); what[size] = k; size++; } C_MAKE(borg_sv_art_text, z_info->a_max, char *); for (i = 0; i < size; i++) borg_sv_art_text[what[i]] = text[i]; /* Collect the "ego-item names" */ for (k = 1; k < z_info->e_max; k++) { ego_item_type *e_ptr = &e_info[k]; /* Skip non-items */ if (!e_ptr->name) continue; /* Extract a string */ sprintf(buf, " %s", (e_ptr->name)); /* Save an entry */ text[size] = string_make(buf); what[size] = k + 256; size++; } /* Set the sort hooks */ borg_sort_comp = borg_sort_comp_hook; borg_sort_swap = borg_sort_swap_hook; /* Sort */ borg_sort(text, what, size); /* Save the size */ borg_artego_size = size; /* Allocate the "item parsing arrays" (plurals) */ C_MAKE(borg_artego_text, borg_artego_size, char *); C_MAKE(borg_artego_what, borg_artego_size, s16b); /* Save the entries */ for (i = 0; i < size; i++) borg_artego_text[i] = text[i]; for (i = 0; i < size; i++) borg_artego_what[i] = what[i]; } const char *borg_prt_item(int item) { if (item < z_info->k_max) { return borg_sv_plural_text[item]; } if (item < z_info->k_max + z_info->k_max) return borg_sv_plural_text[item - z_info->k_max]; if (item < z_info->k_max + z_info->k_max + z_info->a_max) return borg_sv_art_text[item - z_info->k_max - z_info->k_max]; return (prefix_pref[item - z_info->k_max - z_info->k_max - z_info->a_max]); } #ifdef MACINTOSH static int HACK = 0; #endif #endif /* ALLOW_BORG */ angband-3.5.1/src/borg/borg6.h0000644000175000017500000000644712456456606015363 0ustar chriscchrisc/* File: borg6.h */ /* Purpose: Header file for "borg6.c" -BEN- */ #ifndef INCLUDED_BORG6_H #define INCLUDED_BORG6_H #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #ifdef ALLOW_BORG /* * This file provides support for "borg6.c". */ #include "borg1.h" #include "borg2.h" #include "borg3.h" /* * Possible values of "goal" */ #define GOAL_KILL 1 /* Monsters */ #define GOAL_TAKE 2 /* Objects */ #define GOAL_MISC 3 /* Stores */ #define GOAL_DARK 4 /* Exploring */ #define GOAL_XTRA 5 /* Searching */ #define GOAL_BORE 6 /* Leaving */ #define GOAL_FLEE 7 /* Fleeing */ #define GOAL_VAULT 8 /* Vaults */ #define GOAL_RECOVER 9 /* Resting safely */ #define GOAL_DIGGING 10 /* Anti-summon Corridor */ /* * Minimum "harmless" food */ #define SV_FOOD_MIN_OKAY SV_FOOD_CURE_POISON /* * Attempt to induce "word of recall" */ extern bool borg_recall(void); /* * Low level goals */ extern bool borg_caution(void); extern bool borg_attack(bool boosted_bravery); extern bool borg_munchkin_mage(void); extern bool borg_munchkin_melee(void); extern bool borg_recover(void); extern bool borg_offset_ball(void); extern bool borg_defend(int p); extern bool borg_perma_spell(void); extern bool borg_check_rest(int y, int x); extern void borg_near_monster_type(int dist); /* * Twitchy goals */ extern bool borg_charge_kill(void); extern bool borg_charge_take(void); extern bool borg_twitchy(void); /* * Continue a high level goal */ extern bool borg_flow_old(int why); /* * Flow to stairs */ extern bool borg_flow_stair_both(int why, bool sneak); extern bool borg_flow_stair_less(int why, bool sneak); extern bool borg_flow_stair_more(int why, bool sneak, bool brave); extern bool borg_flow_glyph(int why); extern bool borg_flow_light(int why); extern bool borg_check_LIGHT_only(void); extern bool borg_backup_swap(int p); extern bool borg_flow_recover(bool viewable, int dist); /* * Flow to shops */ extern bool borg_flow_shop_visit(void); extern bool borg_flow_shop_entry(int n); /* * Flow towards monsters/objects */ extern bool borg_flow_kill(bool viewable, int nearness); extern bool borg_flow_kill_aim(bool viewable); extern bool borg_flow_kill_corridor_1(bool viewable); extern bool borg_flow_kill_corridor_2(bool viewable); extern bool borg_flow_kill_direct(bool viewable, bool twitchy); extern bool borg_flow_take(bool viewable, int nearness); extern bool borg_flow_vein(bool viewable, int nearness); extern bool borg_flow_take_lunal(bool viewable, int nearness); extern bool borg_flow_take_scum(bool viewable, int nearness); extern void borg_flow_direct_dig(int m_y, int m_x); extern bool borg_flow_vault(int nearness); extern bool borg_excavate_vault(int nearness); extern bool borg_LIGHT_beam(bool simulation); /* * Flow towards "interesting" grids */ extern bool borg_flow_dark(bool neer); /* * Search for secret doors */ extern bool borg_flow_spastic(bool bored); extern bool borg_target(int y, int x); extern int borg_launch_damage_one(int i, int dam, int typ, int ammo_location); extern int borg_attack_aux_thrust(void); extern void borg_log_battle(bool); extern void borg_log_event(char *event); extern bool borg_target_unknown_wall(int g_y,int g_x); /* * Initialize this file */ extern void borg_init_6(void); #endif #endif angband-3.5.1/src/borg/borg1.h0000644000175000017500000013024312456456606015346 0ustar chriscchrisc /* File: borg1.h */ /* Purpose: Header file for "borg1.c" -BEN- */ #ifndef INCLUDED_BORG1_H #define INCLUDED_BORG1_H #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #ifdef ALLOW_BORG /* Allocate a wiped array of type T[N], assign to pointer P */ #define C_MAKE(P, N, T) \ ((P) = C_ZNEW(N, T)) /* Allocate a wiped thing of type T, assign to pointer P */ #define MAKE(P, T) \ ((P) = ZNEW(T)) /* Mega-Hack - indices of the player classes */ #define CLASS_WARRIOR 0 #define CLASS_MAGE 1 #define CLASS_PRIEST 2 #define CLASS_ROGUE 3 #define CLASS_RANGER 4 #define CLASS_PALADIN 5 #include "../effects.h" /* WARNING: If you mess with the objects.txt or the monster.txt and change * the locations of things, then you must make those changes in borg.txt * as well as in this borg code. The borg is very concerned about item * index locations. ie: borgs_has[POTION_HEAL] is looking for a Potion of Healing. * The borg is concerned over several items, broken swords, and several * monster locations (Tarresque, Sauron, Morgoth). */ /* * This file provides support for "borg1.c". */ /*** Some constants ***/ /* * Maximum possible dungeon size */ #define AUTO_MAX_X DUNGEON_WID #define AUTO_MAX_Y DUNGEON_HGT /* The borg_has[] needs to know certain numbers */ #define SHROOM_STONESKIN 22 #define POTION_HEAL 321 /* lookup_kind(TV_POTION, SV_POTION_HEAL) */ #define POTION_STAR_HEAL 322 #define POTION_LIFE 323 #define POTION_RES_MANA 325 /* #define POTION_INVULN 238 */ /* #define POTION_RESISTANCE 268 */ #define SCROLL_STAR_CURSE 276 #define SCROLL_CURSE 275 #define SCROLL_GENOCIDE 283 #define SCROLL_MGENOCIDE 284 #define SCROLL_TPORTLEVEL 262 #define WAND_ANNILATION 396 #define WAND_MM 370 #define WAND_SCLOUD 375 #define WAND_TPORTOTHER 389 #define STAFF_TPORT 420 #define ROD_RECALL 455 #define ROD_HEAL 447 #define RING_FLAMES 207 #define RING_ACID 208 #define RING_ICE 209 #define RING_LIGHTNING 210 /* The sval of some items are needed and the game does not supply some any if it has an effect (activation) */ #define SV_POTION_INC_STR 1 #define SV_POTION_INC_INT 2 #define SV_POTION_INC_WIS 3 #define SV_POTION_INC_DEX 4 #define SV_POTION_INC_CON 5 #define SV_POTION_INC_ALL 7 #define SV_POTION_INC_EXP 8 #define SV_POTION_CURE_LIGHT 9 #define SV_POTION_CURE_SERIOUS 10 #define SV_POTION_CURE_CRITICAL 11 #define SV_POTION_HEALING 12 #define SV_POTION_STAR_HEALING 13 #define SV_POTION_LIFE 14 #define SV_POTION_CURE_POISON 15 #define SV_POTION_RESTORE_MANA 16 #define SV_POTION_RES_STR 17 #define SV_POTION_RES_INT 18 #define SV_POTION_RES_WIS 19 #define SV_POTION_RES_DEX 20 #define SV_POTION_RES_CON 21 #define SV_POTION_RESTORE_EXP 23 /* Restore Level */ #define SV_POTION_INC_STR2 24 /* Brawn, gain Str lose 1 other */ #define SV_POTION_INC_INT2 25 /* Intellect, gain Str lose 1 other */ #define SV_POTION_INC_WIS2 26 /* Contemplate, gain Str lose 1 other */ #define SV_POTION_INC_DEX2 27 /* Nimble, gain Str lose 1 other */ #define SV_POTION_INC_CON2 28 /* Toughness, gain Str lose 1 other */ #define SV_POTION_ENLIGHTENMENT 30 #define SV_POTION_STAR_ENLIGHTNMENT 31 #define SV_POTION_SPEED 32 #define SV_POTION_HEROISM 33 #define SV_POTION_BERSERK_STRENGTH 34 #define SV_POTION_BOLDNESS 35 #define SV_POTION_RESIST_HEAT 36 #define SV_POTION_RESIST_COLD 37 #define SV_POTION_RESIST_POIS 38 #define SV_POTION_DETECT_INVIS 39 #define SV_POTION_INFRAVISION 49 #define SV_POTION_SLIME_MOLD 50 #define SV_POTION_DRAGON_BREATH 58 #define SV_POTION_DETONATIONS 59 #define SV_ROD_RECALL 26 #define SV_ROD_IDENTIFY 27 #define SV_ROD_DETECT_TRAP 3 #define SV_ROD_DETECT_DOOR 2 #define SV_ROD_DETECTION 4 #define SV_ROD_ILLUMINATION 25 #define SV_ROD_SPEED 28 #define SV_ROD_MAPPING 5 #define SV_ROD_HEALING 18 #define SV_ROD_TELEPORT_OTHER 22 #define SV_ROD_LIGHT 24 #define SV_ROD_SLOW_MONSTER 15 #define SV_ROD_SLEEP_MONSTER 16 #define SV_ROD_ELEC_BOLT 9 #define SV_ROD_COLD_BOLT 8 #define SV_ROD_FIRE_BOLT 7 #define SV_ROD_ACID_BOLT 10 #define SV_ROD_DRAIN_LIFE 21 #define SV_ROD_ELEC_BALL 13 #define SV_ROD_COLD_BALL 12 #define SV_ROD_FIRE_BALL 11 #define SV_ROD_ACID_BALL 14 #define SV_ROD_CURING 17 #define SV_WAND_TELEPORT_AWAY 20 #define SV_WAND_STINKING_CLOUD 6 #define SV_WAND_MAGIC_MISSILE 1 #define SV_WAND_ANNIHILATION 27 #define SV_WAND_LIGHT 15 #define SV_WAND_WONDER 22 #define SV_WAND_SLOW_MONSTER 11 #define SV_WAND_SLEEP_MONSTER 13 #define SV_WAND_FEAR_MONSTER 14 #define SV_WAND_CONFUSE_MONSTER 12 #define SV_WAND_ELEC_BOLT 2 #define SV_WAND_COLD_BOLT 3 #define SV_WAND_ACID_BOLT 5 #define SV_WAND_FIRE_BOLT 4 #define SV_WAND_ELEC_BALL 7 #define SV_WAND_COLD_BALL 8 #define SV_WAND_ACID_BALL 10 #define SV_WAND_FIRE_BALL 9 #define SV_WAND_DRAGON_FIRE 23 #define SV_WAND_DRAGON_COLD 24 #define SV_WAND_DRAIN_LIFE 26 #define SV_STAFF_IDENTIFY 25 #define SV_STAFF_SPEED 22 #define SV_STAFF_HEALING 14 #define SV_STAFF_THE_MAGI 24 #define SV_STAFF_POWER 17 #define SV_STAFF_HOLINESS 18 #define SV_STAFF_TELEPORTATION 21 #define SV_STAFF_DESTRUCTION 5 #define SV_STAFF_CURING 12 #define SV_STAFF_SLEEP_MONSTERS 8 #define SV_STAFF_SLOW_MONSTERS 7 #define SV_STAFF_DISPEL_EVIL 15 #define SV_STAFF_BANISHMENT 16 #define SV_STAFF_DETECT_INVIS 9 #define SV_STAFF_DETECT_EVIL 10 #define SV_STAFF_LIGHT 19 #define SV_STAFF_MAPPING 11 #define SV_STAFF_REMOVE_CURSE 23 #define SV_FOOD_SECOND_SIGHT 6 /* esp */ #define SV_FOOD_FAST_RECOVERY 7 /* cure stun, cut, pois, blind */ #define SV_FOOD_RESTORING 8 /* Restore All */ #define SV_FOOD_CURE_MIND 9 /* Cure confustion, Halluc, fear, tmp resist Conf */ #define SV_FOOD_EMERGENCY 10 /* Hallucinate, Oppose Fire, Oppose Cold, Heal 200 */ #define SV_FOOD_TERROR 11 /* Terror --give +5 speed boost */ #define SV_FOOD_STONESKIN 12 /* StoneSkin */ #define SV_FOOD_DEBILITY 14 /* Mana Restore, temp loss of a stat (str/con) */ #define SV_FOOD_SPRINTING 15 /* Sprinting (speed +10) */ #define SV_FOOD_PURGING 16 /* Purging --Makes hungry, restore Str/Con, Cure Pois */ #define SV_SCROLL_TELEPORT 2 #define SV_SCROLL_TELEPORT_LEVEL 3 #define SV_SCROLL_MAPPING 4 #define SV_SCROLL_DETECT_TRAP 6 #define SV_SCROLL_DETECT_DOOR 7 #define SV_SCROLL_DETECT_INVIS 8 #define SV_SCROLL_ENCHANT_WEAPON_TO_HIT 11 #define SV_SCROLL_ENCHANT_WEAPON_TO_DAM 12 #define SV_SCROLL_ENCHANT_ARMOR 13 #define SV_SCROLL_STAR_ENCHANT_WEAPON 14 #define SV_SCROLL_STAR_ENCHANT_ARMOR 15 #define SV_SCROLL_REMOVE_CURSE 16 #define SV_SCROLL_STAR_REMOVE_CURSE 17 #define SV_SCROLL_ACQUIREMENT 21 #define SV_SCROLL_STAR_ACQUIREMENT 22 #define SV_SCROLL_DISPEL_UNDEAD 23 #define SV_SCROLL_BANISHMENT 24 #define SV_SCROLL_MASS_BANISHMENT 25 #define SV_SCROLL_SATISFY_HUNGER 26 #define SV_SCROLL_IDENTIFY 27 #define SV_SCROLL_LIGHT 28 #define SV_SCROLL_RECHARGING 30 #define SV_SCROLL_TRAP_DOOR_DESTRUCTION 31 #define SV_SCROLL_BLESSING 33 #define SV_SCROLL_HOLY_CHANT 34 #define SV_SCROLL_HOLY_PRAYER 35 #define SV_SCROLL_PROTECTION_FROM_EVIL 36 #define SV_SCROLL_MONSTER_CONFUSION 37 #define SV_SCROLL_RUNE_PROTECTION 38 #define SV_RING_ACID 19 #define SV_RING_FIRE 18 #define SV_RING_COLD 20 #define SV_RING_ELEC 21 #define SV_PLANATIR 7 #define SV_PHIAL 4 #define EGO_AMAN 42 /* Where did not name2 go in 330? */ #define MAX_CLASSES 6 /* Max # of classes 0 = warrior, 5 = Paladin */ #define MAX_RACES 10 /* * Flags for the "info" field of grids * * Note that some of the flags below are not "perfect", in particular, * several of the flags should be treated as "best guesses", see below. * * The "BORG_MARK" flag means that the grid has been "observed", though * the terrain feature may or may not be memorized. Note the use of the * "FEAT_NONE", "FEAT_FLOOR", and "FEAT_INVIS" feature codes below. * * The "BORG_GLOW" flag means that a grid is probably "perma-lit", but * sometimes it is really only "recently" perma-lit, but was then made * dark with a darkness attack, and it is now torch-lit or off-screen. * * The "BORG_DARK" flag means that a grid is probably not "perma-lit", * but sometimes it is really only "recently" dark, but was then made * "lite" with a "call lite" spell, and it is now torch-lit or off-screen. * * The "BORG_LIGHT" flag means that a grid is probably lit by the player * torch, but this may not be true if the nearby "BORG_VIEW" flags are * not correct, or if the "lite radius" has changed recently. * * The "BORG_VIEW" flag means that a grid is probably in line of sight * of the player, but this may not be true if some of the grids between * the player and the grid contain previously unseen walls/doors/etc. * * The "BORG_TEMP" flag means that a grid has been added to the array * "borg_temp_x"/"borg_temp_y", though normally we ignore this flag. * * The "BORG_XTRA" flag is used for various "extra" purposes, primarily * to assist with the "update_view()" code. */ #define BORG_MARK 0x01 /* observed grid */ #define BORG_GLOW 0x02 /* probably perma-lit */ #define BORG_DARK 0x04 /* probably not perma-lit */ #define BORG_OKAY 0x08 /* on the current panel */ #define BORG_LIGHT 0x10 /* lit by the torch */ #define BORG_VIEW 0x20 /* in line of sight */ #define BORG_TEMP 0x40 /* temporary flag */ #define BORG_XTRA 0x80 /* extra flag */ /* * Maximum size of the "lite" array */ #define AUTO_LIGHT_MAX 1536 /* * Some assistance with the borg_attack and magic arrows */ #define GF_ARROW_FLAME 70 #define GF_ARROW_FROST 71 #define GF_ARROW_ANIMAL 72 #define GF_ARROW_UNDEAD 73 #define GF_ARROW_DEMON 74 #define GF_ARROW_ORC 75 #define GF_ARROW_TROLL 76 #define GF_ARROW_GIANT 77 #define GF_ARROW_DRAGON 78 #define GF_ARROW_EVIL 79 #define GF_ARROW_WOUNDING 80 #define GF_ARROW_POISON 81 #define GF_ARROW_SEEKER 82 #define GF_ARROW_SILVER 83 #define GF_ARROW_HOLY 84 #define GF_HOLY_WORD 85 #define GF_AWAY_ALL_MORGOTH 86 /* * Player race constants (hard-coded by save-files, arrays, etc) */ #define RACE_HUMAN 0 #define RACE_HALF_ELF 1 #define RACE_ELF 2 #define RACE_HOBBIT 3 #define RACE_GNOME 4 #define RACE_DWARF 5 #define RACE_HALF_ORC 6 #define RACE_HALF_TROLL 7 #define RACE_DUNADAN 8 #define RACE_HIGH_ELF 9 #define RACE_KOBOLD 10 /* * Maximum size of the "view" array */ /*#define AUTO_VIEW_MAX 1536*/ #define AUTO_VIEW_MAX 9000 /* * Number of grids in the "temp" array */ #define AUTO_TEMP_MAX 9000 /* * Number of grids in the "flow" array */ #define AUTO_FLOW_MAX 1536 /* * Enable the "borg_note()" usage of the Recall Window * Also specify the number of "rolling rows" to use */ #define BORG_NOTE_ROWS 12 /* * Threshold where the borg will start to carry / use Digger items */ #define BORG_DIG 14 /* * Size of Keypress buffer */ #define KEY_SIZE 8192 /* * Object information */ typedef struct borg_take borg_take; struct borg_take { struct object_kind *kind; /* Kind */ bool known; /* Verified kind */ bool seen; /* Assigned motion */ bool extra; /* Unused */ bool orbed; /* Orb of Draining cast on it */ byte x, y; /* Location */ s16b when; /* When last seen */ int value; /* Estimated value of item */ int tval; /* Known tval */ }; /* * Monster information */ typedef struct borg_kill borg_kill; struct borg_kill { s16b r_idx; /* Race index */ bool known; /* Verified race */ bool awake; /* Probably awake */ bool confused; /* Probably confused */ bool afraid; /* Probably afraid */ bool quiver; /* Probably quivering */ bool stunned; bool poisoned; /* Probably poisoned */ bool seen; /* Assigned motion */ bool used; /* Assigned message */ byte x, y; /* Location */ byte ox, oy; /* Old location */ byte speed; /* Estimated speed */ byte moves; /* Estimates moves */ byte ranged_attack; /* qty of ranged attacks */ byte spell[96]; /* spell flag for monster spells */ s16b power; /* Estimated hit-points */ s16b injury; /* Percent wounded */ s16b other; /* Estimated something */ s16b level; /* Monsters Level */ u32b spell_flags[RF_MAX]; /* Monster race spell flags preloaded */ s16b when; /* When last seen */ s16b m_idx; /* Game's index */ }; /* * Forward declare */ typedef struct borg_grid borg_grid; /* * A grid in the dungeon. Several bytes. * * There is a set of eight bit flags (see below) called "info". * * There is a terrain feature type, which may be incorrect. It is * more or less based on the standard "feature" values, but some of * the legal values are never used, such as "secret door", and others * are used in bizarre ways, such as "invisible trap". * * There is an object index into the "object tracking" array. * * There is a monster index into the "monster tracking" array. * * There is a byte "hmmm" which is currently unused. * * There is a byte "xtra" which tracks how much "searching" has been done * in the grid or in any grid next to the grid. * * To perform "navigation" from one place to another, the "flow" routines * are used, which place "cost" information into the "cost" fields. Then, * if the path is clear, the "cost" information is copied into the "flow" * fields, which are used for the actual navigation. This allows multiple * routines to check for "possible" flowing, without hurting the current * flow, which may have taken a long time to construct. We also assume * that the Borg never needs to follow a path longer than 250 grids long. * Note that the "cost" fields have been moved into external arrays. * * Hack -- note that the "char" zero will often crash the system! */ struct borg_grid { byte feat; /* Grid type */ byte info; /* Grid flags */ byte take; /* Object index */ byte kill; /* Monster index */ byte hmmm; /* Extra field (unused) */ byte xtra; /* Extra field (search count) */ }; /* * Forward declare */ typedef struct borg_data borg_data; /* * Hack -- one byte of info per grid * * We use a structure to encapsulate the data into a "typed" form. */ struct borg_data { byte data[AUTO_MAX_Y][AUTO_MAX_X]; }; /*** Some macros ***/ /* * Determine "twice" the distance between two points * This results in "diagonals" being "correctly" ranged, * that is, a diagonal appears "furthur" than an adjacent. */ #define double_distance(Y1,X1,Y2,X2) \ (distance(((int)(Y1))<<1,((int)(X1))<<1,((int)(Y2))<<1,((int)(X2))<<1)) /*** Some variables ***/ /* * Some variables */ extern bool borg_active; /* Actually active */ extern bool borg_resurrect; /* Continous play mode */ extern bool borg_cancel; /* Being cancelled */ extern bool borg_scumming_pots; /* Borg will quickly store pots in home */ extern char genocide_target; /* Identity of the poor unsuspecting soul */ extern int zap_slot; /* to avoid a nasty game bug with amnesia */ extern bool borg_casted_glyph; /* we dont have a launch messages anymore */ extern int borg_stop_dlevel; extern int borg_stop_clevel; extern int borg_no_deeper; extern bool borg_stop_king; extern bool borg_dont_react; extern int successful_target; extern int sold_item_tval[10]; extern int sold_item_sval[10]; extern int sold_item_pval[10]; extern int sold_item_store[10]; extern int sold_item_num; extern int sold_item_nxt; extern int bought_item_tval[10]; extern int bought_item_sval[10]; extern int bought_item_pval[10]; extern int bought_item_store[10]; extern int bought_item_num; extern int bought_item_nxt; extern char shop_orig[28]; extern char shop_rogue[28]; extern byte borg_nasties_num; extern byte borg_nasties_count[7]; extern char borg_nasties[7]; extern byte borg_nasties_limit[7]; /* options from the borg.txt file */ extern int borg_respawn_race; extern int borg_respawn_class; extern int borg_respawn_str; extern int borg_respawn_int; extern int borg_respawn_wis; extern int borg_respawn_dex; extern int borg_respawn_con; extern int borg_dump_level; extern int borg_save_death; extern bool borg_respawn_winners; extern int borg_delay_factor; extern bool borg_worships_damage; extern bool borg_worships_speed; extern bool borg_worships_hp; extern bool borg_worships_mana; extern bool borg_worships_ac; extern bool borg_worships_gold; extern bool borg_plays_risky; extern bool borg_uses_swaps; extern bool borg_uses_calcs; extern bool borg_slow_optimizehome; extern bool borg_scums_uniques; extern bool borg_kills_uniques; extern int borg_chest_fail_tolerance; extern s32b borg_money_scum_amount; extern int borg_money_scum_who; extern int borg_money_scum_ware; extern bool borg_self_scum; extern bool borg_lunal_mode; extern bool borg_self_lunal; extern bool borg_verbose; extern bool borg_munchkin_start; extern bool borg_munchkin_mode; extern int borg_munchkin_level; extern int borg_munchkin_depth; extern int borg_enchant_limit; /* how high to enchant items */ /* HACK... this should really be a parm into borg_prepared */ /* I am just being lazy */ extern bool borg_slow_return; /* dynamic required items */ /* dynamic required items */ typedef struct req_item { int depth; int item; int number; } req_item; extern req_item **borg_required_item; extern int *n_req; typedef struct power_item { int depth; int cnd; int item; int from; int to; int power; bool each; } power_item; extern power_item **borg_power_item; extern int *n_pwr; extern int *borg_has; extern int *borg_has_on; extern int *borg_artifact; extern int *borg_skill; extern int size_depth; extern int size_obj; /* NOTE: This must exactly match the prefix_pref enums in BORG1.c */ enum { BI_STR, BI_INT, BI_WIS, BI_DEX, BI_CON, BI_CSTR, BI_CINT, BI_CWIS, BI_CDEX, BI_CCON, BI_SSTR, BI_SINT, BI_SWIS, BI_SDEX, BI_SCON, BI_LIGHT, BI_CURHP, BI_MAXHP, BI_CURSP, BI_MAXSP, BI_SP_ADJ, BI_FAIL1, BI_FAIL2, BI_CLEVEL, BI_MAXCLEVEL, BI_ESP, BI_CURLITE, BI_RECALL, BI_FOOD, BI_SPEED, BI_SDIG, BI_FEATH, BI_REG, BI_SINV, BI_INFRA, BI_DIS, BI_DEV, BI_SAV, BI_STL, BI_SRCH, BI_SRCHFREQ, BI_THN, BI_THB, BI_THT, BI_DIG, BI_IFIRE, BI_IACID, BI_ICOLD, BI_IELEC, BI_IPOIS, BI_TRFIRE, BI_TRCOLD, BI_TRACID, BI_TRPOIS, BI_TRELEC, BI_RFIRE, BI_RCOLD, BI_RELEC, BI_RACID, BI_RPOIS, BI_RFEAR, BI_RLITE, BI_RDARK, BI_RBLIND, BI_RCONF, BI_RSND, BI_RSHRD, BI_RNXUS, BI_RNTHR, BI_RKAOS, BI_RDIS, BI_HLIFE, BI_FRACT, BI_SRFIRE, BI_SRCOLD, BI_SRELEC, BI_SRACID, BI_SRPOIS, BI_SRFEAR, BI_SRLITE, BI_SRDARK, BI_SRBLIND, BI_SRCONF, BI_SRSND, BI_SRSHRD, BI_SRNXUS, BI_SRNTHR, BI_SRKAOS, BI_SRDIS, BI_SHLIFE, BI_SFRACT, BI_DEPTH, BI_CDEPTH, BI_MAXDEPTH, BI_KING, BI_ISWEAK, BI_ISHUNGRY, BI_ISFULL, BI_ISGORGED, BI_ISBLIND, BI_ISAFRAID, BI_ISCONFUSED, BI_ISPOISONED, BI_ISCUT, BI_ISSTUN, BI_ISHEAVYSTUN, BI_ISPARALYZED, BI_ISIMAGE, BI_ISFORGET, BI_ISENCUMB, BI_ISSTUDY, BI_ISSEARCHING, BI_ISFIXLEV, BI_ISFIXEXP, BI_ISFIXSTR, BI_ISFIXINT, BI_ISFIXWIS, BI_ISFIXDEX, BI_ISFIXCON, BI_ISFIXALL, BI_ARMOR, BI_TOHIT, BI_TODAM, BI_WTOHIT, BI_WTODAM, BI_BTOHIT, BI_BTODAM, BI_BLOWS, BI_SHOTS, BI_WMAXDAM, BI_WBASEDAM, BI_BMAXDAM, BI_HEAVYWEPON, BI_HEAVYBOW, BI_CRSTELE, BI_CRSAGRV, BI_CRSHPIMP, BI_CRSMPIMP, BI_CRSFEAR, BI_CRSFVULN, BI_CRSEVULN, BI_CRSCVULN, BI_CRSAVULN, BI_WS_ANIMAL, BI_WS_EVIL, BI_WS_UNDEAD, BI_WS_DEMON, BI_WS_ORC, BI_WS_TROLL, BI_WS_GIANT, BI_WS_DRAGON, BI_WK_UNDEAD, BI_WK_DEMON, BI_WK_DRAGON, BI_W_IMPACT, BI_WB_ACID, BI_WB_ELEC, BI_WB_FIRE, BI_WB_COLD, BI_WB_POIS, BI_APHASE, BI_ATELEPORT, BI_AESCAPE, BI_AFUEL, BI_AHEAL, BI_AEZHEAL, BI_ALIFE, BI_AID, BI_ASPEED, BI_ASTFMAGI, BI_ASTFDEST, BI_ATPORTOTHER, BI_AMISSILES, BI_ACUREPOIS, BI_ADETTRAP, BI_ADETDOOR, BI_ADETEVIL, BI_AMAGICMAP, BI_ARECHARGE, BI_ALITE, BI_APFE, BI_AGLYPH, BI_ACCW, BI_ACSW, BI_ACLW, BI_ARESHEAT, BI_ARESCOLD, BI_ARESPOIS, BI_ATELEPORTLVL, /* scroll of teleport level */ BI_AHWORD, /* Holy Word prayer */ BI_ADETONATE, /* POTIONS used as weapons */ BI_AMASSBAN, /* ?Mass Banishment */ BI_ASHROOM, BI_AROD1, /* Attack rods */ BI_AROD2, /* Attack rods */ BI_DINV, /* See Inv Spell Legal */ BI_MAX }; #define MAX_FORMULA_ELEMENTS 60 enum { BFO_DONE, /* just to make sure we end fast if there is no formula */ BFO_NUMBER, BFO_VARIABLE, BFO_EQ, BFO_NEQ, BFO_NOT, BFO_LT, BFO_LTE, BFO_GT, BFO_GTE, BFO_AND, BFO_OR, BFO_PLUS, BFO_MINUS, BFO_DIVIDE, BFO_MULT }; extern int *formula[1000]; extern const char *prefix_pref[]; /* * Hack -- optional cheating flags */ /* * Various silly flags */ extern bool borg_flag_save; /* Save savefile at each level */ extern bool borg_flag_dump; /* Save savefile at each death */ extern bool borg_save; /* do a save next time we get to press a key! */ extern bool borg_borg_message; /* List borg messages or not */ extern bool borg_graphics; /* List borg messages or not */ extern bool borg_confirm_target; extern char borg_engine_date[]; /* last update */ /* * Use a simple internal random number generator */ extern bool borg_rand_quick; /* Save system setting */ extern u32b borg_rand_value; /* Save system setting */ extern u32b borg_rand_local; /* Save personal setting */ /* * Hack -- time variables */ extern s16b borg_t; /* Current "time" */ extern s16b borg_t_morgoth; extern s16b need_see_inviso; /* To tell me to cast it */ extern s16b borg_see_inv; extern bool need_shift_panel; /* to spot offscreeners */ extern s16b when_shift_panel; extern s16b time_this_panel; /* Current "time" for current panel*/ extern bool vault_on_level; /* borg will search for a vault */ extern int unique_on_level; extern bool scaryguy_on_level; extern bool morgoth_on_level; extern bool borg_morgoth_position; extern int borg_t_antisummon; /* Timestamp when in a AS spot */ extern bool borg_as_position; /* Sitting in an anti-summon corridor */ extern bool borg_digging; /* used in Anti-summon corridor */ extern bool breeder_level; /* Borg will shut doors */ extern s16b old_depth; extern s16b borg_respawning; /* to prevent certain crashes */ extern s16b borg_no_retreat; /* * Hack -- Other time variables */ extern s16b when_call_LIGHT; /* When we last did call light */ extern s16b when_wizard_LIGHT; /* When we last did wizard light */ extern s16b when_detect_traps; /* When we last detected traps */ extern s16b when_detect_doors; /* When we last detected doors */ extern s16b when_detect_walls; /* When we last detected walls */ extern s16b when_detect_evil; extern s16b when_last_kill_mult; /* When a multiplier was last killed */ extern bool my_need_alter; /* incase of walls/doors */ extern bool my_no_alter; /* incase of walls/doors */ extern bool my_need_redraw; /* incase of walls/doors */ extern bool borg_attempting_refresh_resist; /* for the Resistance spell */ /* * Some information */ extern s16b goal; /* Flowing (goal type) */ extern bool goal_rising; /* Currently returning to town */ extern bool goal_leaving; /* Currently leaving the level */ extern bool goal_fleeing; /* Currently fleeing the level */ extern bool goal_fleeing_lunal; /* Currently fleeing the level in lunal*/ extern bool goal_fleeing_munchkin; /* Fleeing level while in munchkin Mode */ extern bool borg_fleeing_town; /* Currently fleeing the level to return to town */ extern bool goal_ignoring; /* Currently ignoring monsters */ extern int goal_recalling; /* Currently waiting for recall, guessing turns left */ extern bool goal_less; /* return to, but dont use, the next up stairs */ extern s16b borg_times_twitch; /* how often twitchy on this level */ extern s16b borg_escapes; /* how often teleported on this level */ extern bool stair_less; /* Use the next "up" staircase */ extern bool stair_more; /* Use the next "down" staircase */ extern s32b borg_began; /* When this level began */ extern s32b borg_time_town; /* how long it has been since I was in town */ extern s16b avoidance; /* Current danger thresh-hold */ extern bool borg_failure; /* Notice failure */ extern bool borg_simulate; /* Simulation flag */ extern bool borg_attacking; /* Are we attacking a monster? */ extern bool borg_offsetting; /* Are we attacking a monster? with offsett balls*/ extern bool borg_completed; /* Completed the level */ extern bool borg_on_upstairs; /* used when leaving a level */ extern bool borg_on_dnstairs; /* used when leaving a level */ extern bool borg_needs_searching; /* borg will search with each step */ extern s16b borg_oldchp; /* hit points last game turn */ extern s16b borg_oldcsp; /* mana points last game turn */ /* defence flags */ extern bool borg_prot_from_evil; extern bool borg_speed; extern bool borg_bless; extern bool borg_hero; extern bool borg_berserk; extern s16b borg_game_ratio; extern s16b borg_resistance; extern s16b borg_no_rest_prep; /* borg wont rest for a few turns */ extern bool borg_shield; extern bool borg_on_glyph; /* borg is standing on a glyph of warding */ extern bool borg_create_door; /* borg is going to create doors */ extern bool borg_sleep_spell; extern bool borg_sleep_spell_ii; extern bool borg_slow_spell; extern bool borg_confuse_spell; extern bool borg_fear_mon_spell; /* * Shop goals */ extern bool borg_in_shop; extern s16b goal_shop; /* Next shop to visit */ extern s16b goal_ware; /* Next item to buy there */ extern s16b goal_item; /* Next item to sell there */ extern int borg_food_onsale; /* Are shops selling food? */ extern int borg_fuel_onsale; /* Are shops selling fuel? */ extern bool borg_needs_quick_shopping; /* Needs to buy without browsing all shops */ extern s16b borg_best_fit_item; /* Item to be worn, not sold */ extern int borg_best_item; /* * Other variables */ extern int w_x; /* Current panel offset (X) */ extern int w_y; /* Current panel offset (Y) */ extern int morgy_panel_y; extern int morgy_panel_x; extern int borg_target_y; extern int borg_target_x; /* Current targetted location */ extern int c_x; /* Current location (X) */ extern int c_y; /* Current location (Y) */ extern int g_x; /* Goal location (X) */ extern int g_y; /* Goal location (Y) */ extern int bad_obj_x[50]; /* Dropped cursed artifact at location (X) */ extern int bad_obj_y[50]; /* Dropped cursed artifact at location (Y) */ extern int bad_obj_cnt; /* * Some estimated state variables */ extern s16b my_stat_max[6]; /* Current "maximal" stat values */ extern s16b my_stat_cur[6]; /* Current "natural" stat values */ extern s16b my_stat_use[6]; /* Current "resulting" stat values */ extern s16b my_stat_ind[6]; /* Current "additions" to stat values */ extern bool my_need_stat_check[6]; /* do I need to check my stats */ extern s16b my_stat_add[6]; /* aditions to stats */ extern s16b home_stat_add[6]; extern int weapon_swap; /* location of my swap weapon */ extern s32b weapon_swap_value; /* value of my swap weapon */ extern int armour_swap; /* location of my swap weapon */ extern s32b armour_swap_value; /* value of my swap weapon */ /* a 3 state boolean */ /*-1 = not cursed, no help needed for it */ /* 0 = light curse, needs light remove curse spell */ /* 1 = heavy curse, needs heavy remove curse spell */ extern int decurse_weapon_swap; /* my swap is great, except its cursed */ extern int enchant_weapon_swap_to_h; /* my swap is great, except its cursed */ extern int enchant_weapon_swap_to_d; /* my swap is great, except its cursed */ extern int decurse_armour_swap; /* my swap is great, except its cursed */ extern int enchant_armour_swap_to_a; /* my swap is great, except its cursed */ extern bool borg_wearing_cursed; extern s16b weapon_swap_digger; extern byte weapon_swap_slay_animal; extern byte weapon_swap_slay_evil; extern byte weapon_swap_slay_undead; extern byte weapon_swap_slay_demon; extern byte weapon_swap_slay_orc; extern byte weapon_swap_slay_troll; extern byte weapon_swap_slay_giant; extern byte weapon_swap_slay_dragon; extern byte weapon_swap_kill_undead; extern byte weapon_swap_kill_demon; extern byte weapon_swap_kill_dragon; extern byte weapon_swap_impact; extern byte weapon_swap_brand_acid; extern byte weapon_swap_brand_elec; extern byte weapon_swap_brand_fire; extern byte weapon_swap_brand_cold; extern byte weapon_swap_brand_pois; extern byte weapon_swap_see_infra; extern byte weapon_swap_slow_digest; extern byte weapon_swap_aggravate; extern byte weapon_swap_teleport; extern byte weapon_swap_regenerate; extern byte weapon_swap_telepathy; extern byte weapon_swap_LIGHT; extern byte weapon_swap_see_invis; extern byte weapon_swap_ffall; extern byte weapon_swap_free_act; extern byte weapon_swap_hold_life; extern byte weapon_swap_immune_fire; extern byte weapon_swap_immune_acid; extern byte weapon_swap_immune_cold; extern byte weapon_swap_immune_elec; extern byte weapon_swap_resist_acid; extern byte weapon_swap_resist_elec; extern byte weapon_swap_resist_fire; extern byte weapon_swap_resist_cold; extern byte weapon_swap_resist_pois; extern byte weapon_swap_resist_conf; extern byte weapon_swap_resist_sound; extern byte weapon_swap_resist_LIGHT; extern byte weapon_swap_resist_dark; extern byte weapon_swap_resist_chaos; extern byte weapon_swap_resist_disen; extern byte weapon_swap_resist_shard; extern byte weapon_swap_resist_nexus; extern byte weapon_swap_resist_blind; extern byte weapon_swap_resist_neth; extern byte weapon_swap_resist_fear; extern byte armour_swap_slay_animal; extern byte armour_swap_slay_evil; extern byte armour_swap_slay_undead; extern byte armour_swap_slay_demon; extern byte armour_swap_slay_orc; extern byte armour_swap_slay_troll; extern byte armour_swap_slay_giant; extern byte armour_swap_slay_dragon; extern byte armour_swap_kill_undead; extern byte armour_swap_kill_demon; extern byte armour_swap_kill_dragon; extern byte armour_swap_impact; extern byte armour_swap_brand_acid; extern byte armour_swap_brand_elec; extern byte armour_swap_brand_fire; extern byte armour_swap_brand_cold; extern byte armour_swap_brand_pois; extern byte armour_swap_see_infra; extern byte armour_swap_slow_digest; extern byte armour_swap_aggravate; extern byte armour_swap_teleport; extern byte armour_swap_regenerate; extern byte armour_swap_telepathy; extern byte armour_swap_LIGHT; extern byte armour_swap_see_invis; extern byte armour_swap_ffall; extern byte armour_swap_free_act; extern byte armour_swap_hold_life; extern byte armour_swap_immune_fire; extern byte armour_swap_immune_acid; extern byte armour_swap_immune_cold; extern byte armour_swap_immune_elec; extern byte armour_swap_resist_acid; extern byte armour_swap_resist_elec; extern byte armour_swap_resist_fire; extern byte armour_swap_resist_cold; extern byte armour_swap_resist_pois; extern byte armour_swap_resist_conf; extern byte armour_swap_resist_sound; extern byte armour_swap_resist_LIGHT; extern byte armour_swap_resist_dark; extern byte armour_swap_resist_chaos; extern byte armour_swap_resist_disen; extern byte armour_swap_resist_shard; extern byte armour_swap_resist_nexus; extern byte armour_swap_resist_blind; extern byte armour_swap_resist_neth; extern byte armour_swap_resist_fear; extern byte my_ammo_tval; /* Ammo -- "tval" */ extern byte my_ammo_sides; /* Ammo -- "sides" */ extern s16b my_ammo_power; /* Shooting multipler */ extern s16b my_need_enchant_to_a; /* Need some enchantment */ extern s16b my_need_enchant_to_h; /* Need some enchantment */ extern s16b my_need_enchant_to_d; /* Need some enchantment */ extern s16b my_need_brand_weapon; /* brand bolts */ extern s16b my_need_id; /* need to buy ID for an inventory item */ /* * Hack -- basic "power" */ extern s32b my_power; /* * Various "amounts" (for the player) */ extern s16b amt_food_lowcal; extern s16b amt_food_hical; extern s16b amt_slow_poison; extern s16b amt_cure_confusion; extern s16b amt_cure_blind; extern s16b amt_cool_staff; /* holiness-power staff */ extern s16b amt_cool_wand; /* # of charges */ extern s16b amt_book[9]; extern s16b amt_add_stat[6]; extern s16b amt_inc_stat[6]; extern s16b amt_fix_stat[7]; extern s16b amt_fix_exp; extern s16b amt_enchant_to_a; extern s16b amt_enchant_to_d; extern s16b amt_enchant_to_h; extern s16b amt_brand_weapon; /* cubragol and bolts */ extern s16b amt_enchant_weapon; extern s16b amt_enchant_armor; extern s16b amt_digger; extern s16b amt_ego; /* * Various "amounts" (for the home) */ extern s16b num_food; extern s16b num_fuel; extern s16b num_mold; extern s16b num_ident; extern s16b num_recall; extern s16b num_phase; extern s16b num_escape; extern s16b num_tele_staves; extern s16b num_teleport; extern s16b num_berserk; extern s16b num_teleport_level; extern s16b num_recharge; extern s16b num_cure_critical; extern s16b num_cure_serious; extern s16b num_pot_rheat; extern s16b num_pot_rcold; extern s16b num_missile; extern s16b num_book[9]; extern s16b num_fix_stat[7]; extern s16b num_fix_exp; extern s16b num_mana; extern s16b num_heal; extern s16b num_heal_true; extern s16b num_ezheal; extern s16b num_ezheal_true; extern s16b num_life; extern s16b num_life_true; extern s16b num_pfe; extern s16b num_glyph; extern s16b num_detonate; extern s16b num_mush_second_sight; /* esp */ extern s16b num_mush_fast_recovery; /* cure stun, cut, pois, blind */ extern s16b num_mush_restoring; /* Restore All */ extern s16b num_mush_cure_mind; /* Cure confustion, Halluc, fear, tmp resist Conf */ extern s16b num_mush_emergency; /* Hallucinate, Oppose Fire, Oppose Cold, Heal 200 */ extern s16b num_mush_terror; /* Terror --give +5 speed boost */ extern s16b num_mush_stoneskin; /* StoneSkin */ extern s16b num_mush_debility; /* Mana Restore, temp loss of a stat (str/con) */ extern s16b num_mush_sprinting; /* Sprinting (speed +10) */ extern s16b num_mush_purging; /* Purging --Makes hungry, restore Str/Con, Cure Pois */ extern s16b num_enchant_to_a; extern s16b num_enchant_to_d; extern s16b num_enchant_to_h; extern s16b num_brand_weapon; /* crubragol and bolts */ extern s16b num_genocide; extern s16b num_mass_genocide; extern s16b num_artifact; extern s16b num_ego; extern s16b home_slot_free; extern s16b home_damage; extern s16b num_duplicate_items; extern s16b num_slow_digest; extern s16b num_regenerate; extern s16b num_telepathy; extern s16b num_LIGHT; extern s16b num_see_inv; extern s16b num_invisible; /**/ extern s16b num_ffall; extern s16b num_free_act; extern s16b num_hold_life; extern s16b num_immune_acid; extern s16b num_immune_elec; extern s16b num_immune_fire; extern s16b num_immune_cold; extern s16b num_resist_acid; extern s16b num_resist_elec; extern s16b num_resist_fire; extern s16b num_resist_cold; extern s16b num_resist_pois; extern s16b num_resist_conf; extern s16b num_resist_sound; extern s16b num_resist_LIGHT; extern s16b num_resist_dark; extern s16b num_resist_chaos; extern s16b num_resist_disen; extern s16b num_resist_shard; extern s16b num_resist_nexus; extern s16b num_resist_blind; extern s16b num_resist_neth; extern s16b num_sustain_str; extern s16b num_sustain_int; extern s16b num_sustain_wis; extern s16b num_sustain_dex; extern s16b num_sustain_con; extern s16b num_sustain_all; extern s16b num_speed; extern s16b num_edged_weapon; extern s16b num_bad_gloves; extern s16b num_weapons; extern s16b num_bow; extern s16b num_rings; extern s16b num_neck; extern s16b num_armor; extern s16b num_cloaks; extern s16b num_shields; extern s16b num_hats; extern s16b num_gloves; extern s16b num_boots; /* * Deal with knowing which uniques are alive */ extern int borg_numb_live_unique; extern int borg_living_unique_index; extern int borg_unique_depth; /* * Hack -- extra state variables */ extern int borg_feeling; /* Current level "feeling" */ /* * Hack -- current shop index */ extern s16b shop_num; /* Current shop index */ /* * State variables extracted from the screen */ extern s32b borg_exp; /* Current experience */ extern s32b borg_gold; /* Current gold */ extern int borg_stat[6]; /* Current stats */ extern int borg_book[9]; /* Current book slots */ /* * State variables extracted from the inventory/equipment */ extern int borg_cur_wgt; /* Current weight */ /* * Constant state variables */ extern int borg_race; /* Current race */ extern int borg_class; /* Current class */ /* * Constant state structures */ extern player_magic *mb_ptr; /* Player magic info */ extern void mmove2(int *y, int *x, int y1, int x1, int y2, int x2); /* * Number of turns to step for (zero means forever) */ extern u16b borg_step; /* Step count (if any) */ /* * Status message search string */ extern char borg_match[128]; /* Search string */ /* * Log file */ extern FILE *borg_fff; /* Log file */ /* * Hack -- the detection arrays */ extern bool borg_detect_wall[6][18]; extern bool borg_detect_trap[6][18]; extern bool borg_detect_door[6][18]; extern bool borg_detect_evil[6][18]; /* * Locate the store doors */ extern int *track_shop_x; extern int *track_shop_y; /* * Track "stairs up" */ extern s16b track_less_num; extern s16b track_less_size; extern int *track_less_x; extern int *track_less_y; /* * Track "stairs down" */ extern s16b track_more_num; extern s16b track_more_size; extern int *track_more_x; extern int *track_more_y; /* * Track glyphs */ extern s16b track_glyph_num; extern s16b track_glyph_size; extern int *track_glyph_x; extern int *track_glyph_y; extern bool borg_needs_new_sea; /* * Track the items worn to avoid loops */ extern s16b track_worn_num; extern s16b track_worn_size; extern s16b track_worn_time; extern byte *track_worn_name1; extern const s16b borg_ddx_ddd[24]; extern const s16b borg_ddy_ddd[24]; /* * Track steps */ extern s16b track_step_num; extern s16b track_step_size; extern int *track_step_x; extern int *track_step_y; /* * Track closed doors */ extern s16b track_door_num; extern s16b track_door_size; extern int *track_door_x; extern int *track_door_y; /* * Track closed doors which started closed */ extern s16b track_closed_num; extern s16b track_closed_size; extern int *track_closed_x; extern int *track_closed_y; /* * Track the mineral veins with treasure * */ extern s16b track_vein_num; extern s16b track_vein_size; extern int *track_vein_x; extern int *track_vein_y; /* * The object list. This list is used to "track" objects. */ extern s16b borg_takes_cnt; extern s16b borg_takes_nxt; extern borg_take *borg_takes; /* * The monster list. This list is used to "track" monsters. */ extern s16b borg_kills_cnt; extern s16b borg_kills_summoner; /* index of a summoning guy */ extern s16b borg_kills_nxt; extern borg_kill *borg_kills; /* * Hack -- depth readiness */ extern int borg_ready_morgoth; /* * Hack -- extra fear per "region" */ extern u16b borg_fear_region[6][18]; extern u16b borg_fear_monsters[AUTO_MAX_Y][AUTO_MAX_X]; /* * Hack -- count racial appearances per level */ extern s16b *borg_race_count; /* * Hack -- count racial kills (for uniques) */ extern s16b *borg_race_death; /* * Current "grid" list */ extern borg_grid *borg_grids[AUTO_MAX_Y]; /* Current "grid list" */ /* * Maintain a set of grids (liteable grids) */ extern s16b borg_LIGHT_n; extern byte borg_LIGHT_y[AUTO_LIGHT_MAX]; extern byte borg_LIGHT_x[AUTO_LIGHT_MAX]; /* * Maintain a set of glow grids (liteable grids) */ extern s16b borg_glow_n; extern byte borg_glow_y[AUTO_LIGHT_MAX]; extern byte borg_glow_x[AUTO_LIGHT_MAX]; /* * Maintain a set of grids (viewable grids) */ extern s16b borg_view_n; extern byte borg_view_y[AUTO_VIEW_MAX]; extern byte borg_view_x[AUTO_VIEW_MAX]; /* * Maintain a set of grids (scanning arrays) */ extern s16b borg_temp_n; extern byte borg_temp_y[AUTO_TEMP_MAX]; extern byte borg_temp_x[AUTO_TEMP_MAX]; /* * Maintain a temporary set of grids * Used to store lit grid info */ extern s16b borg_temp_lit_n; extern byte borg_temp_lit_x[AUTO_TEMP_MAX]; extern byte borg_temp_lit_y[AUTO_TEMP_MAX]; /* * Maintain a set of special grids used for Teleport Other */ extern s16b borg_tp_other_n; extern byte borg_tp_other_x[255]; extern byte borg_tp_other_y[255]; extern int borg_tp_other_index[255]; extern byte offset_y; extern byte offset_x; /* * Maintain a set of grids (flow calculations) */ extern s16b borg_flow_n; extern byte borg_flow_y[AUTO_FLOW_MAX]; extern byte borg_flow_x[AUTO_FLOW_MAX]; /* * Hack -- use "flow" array as a queue */ extern int flow_head; extern int flow_tail; /* * Some variables */ extern borg_data *borg_data_flow; /* Current "flow" data */ extern borg_data *borg_data_cost; /* Current "cost" data */ extern borg_data *borg_data_hard; /* Constant "hard" data */ extern borg_data *borg_data_know; /* Current "know" flags */ extern borg_data *borg_data_icky; /* Current "icky" flags */ /* * Strategy flags -- recalculate things */ extern bool borg_danger_wipe; /* Recalculate danger */ extern bool borg_do_update_view; /* Recalculate view */ extern bool borg_do_update_LIGHT; /* Recalculate lite */ /* * Strategy flags -- examine the world */ extern bool borg_do_inven; /* Acquire "inven" info */ extern bool borg_do_equip; /* Acquire "equip" info */ extern bool borg_do_panel; /* Acquire "panel" info */ extern bool borg_do_frame; /* Acquire "frame" info */ extern bool borg_do_spell; /* Acquire "spell" info */ extern byte borg_do_spell_aux; /* Hack -- book for "borg_do_spell" */ extern bool borg_do_browse; /* Acquire "store" info */ extern byte borg_do_browse_what; /* Hack -- store for "borg_do_browse" */ extern byte borg_do_browse_more; /* Hack -- pages for "borg_do_browse" */ /* * Strategy flags -- run certain functions */ extern bool borg_do_crush_junk; extern bool borg_do_crush_hole; extern bool borg_do_crush_slow; /* am I fighting a unique */ extern int borg_fighting_unique; extern bool borg_fighting_evil_unique; /* am I fighting a summoner */ extern bool borg_fighting_summoner; /*** Some functions ***/ extern int borg_lookup_kind(int tval, int sval); /* * Queue a keypress */ extern errr borg_keypress(keycode_t k); /* * Queue several keypresses */ extern errr borg_keypresses(const char *str); /* * Dequeue a keypress */ extern keycode_t borg_inkey(bool take); /* * Flush the keypresses */ extern void borg_flush(void); /* * Obtain some text from the screen (single character) */ extern errr borg_what_char(int x, int y, byte *a, wchar_t *c); /* * Obtain some text from the screen (multiple characters) */ extern errr borg_what_text(int x, int y, int n, byte *a, char *s); /* * Log a message to a file */ extern void borg_info(char *what); /* * Log a message, Search it, and Show/Memorize it in pieces */ extern void borg_note(char *what); /* * Abort the Borg, noting the reason */ extern void borg_oops(const char *what); /* * Take a "memory note" */ extern bool borg_tell(char *what); /* * Change the player name */ extern bool borg_change_name(char *str); /* * Dump a character description */ extern bool borg_dump_character(char *str); /* * Save the game (but do not quit) */ extern bool borg_save_game(void); /* * Update the "frame" info from the screen */ extern void borg_update_frame(void); /* * Calc a formula out in RPN */ extern int borg_calc_formula(int *); /* * check out a formula in RPN */ extern int borg_check_formula(int *); /* * return a string for the formula */ extern char *borg_prt_formula(int *formula); /* * Print the string for an item */ extern const char *borg_prt_item(int item); /* * Initialize this file */ extern void borg_init_1(void); #endif #endif angband-3.5.1/src/borg/borg.txt0000644000175000017500000016203612456456606015662 0ustar chriscchrisc # This file will allow you to customize your APWBorg along certain themes. # The borg is fairly successful, having won the game several times. # However, some players/observers of borgs would like to see it function # differently. Some would like to see the borg play more aggressively, or # more conservatively. While others would like to value armour class more. # Still others would like to see it collect more speed items. # With the expressions below, you can influence the borg's behavior and # equipment selection choices. The 'borg_worship_' variables will influence # his equipment selection by adding additional bonuses to items which # enhance that attribute. For example: if a borg recieves 2000 pts for # a single point of armour class, an 'ac worshipping' borg would receive # 3000 pts. This bonus would significantly influence equipment choices. # borg_worships_gold explained: # The borg_worships_gold option will greatly impact how the borg treats items # which he finds in the dungeon. With this opion on, he will return to town # whenever he fills up with items then sell those items. This can cause # the borg to lose some artifacts, since he will sell them even if not ID'd. # Generally speaking the borg will not sell an item unless it is at least # psuedo ID'd. The benefit of this option is that the borg will significantly # increase his income at the low clevels. This will increase his survivablity # by allowing him to invest in armour and arrows. With this on, # he will not recall to town to sell stuff but climb the stairs instead. # He will also not recall into the dungeon until dlevel 8 (instead of 5). # This option has no effect after clevel 20. One other downside of this is # that the borg will spend more time in town and may have to evade Vets more. # To modify, simply set it to TRUE or FALSE. # NOTE: THERE MUST BE A SPACE AFTER THE = # option = TRUE is acceptable # option =TRUE is NOT acceptable and will result in a default value. # Worships borg_worships_damage = FALSE borg_worships_speed = FALSE borg_worships_hp = FALSE borg_worships_mana = FALSE borg_worships_ac = FALSE borg_worships_gold = FALSE # use the POWER_ and REQ_ lines below. If false the borg will # use the calcs in the C code. Which is recommended since I hone those # more frequently than I do the dynamic calcs. Most borg users will # have more successful borgs by leaving this option as FALSE. # note: the dynamic calcs are slower than the internal calcs borg_uses_dynamic_calcs = FALSE # Risky # A risky borg is one who is not confined by character level requirements # in order to dive deeper. It is also more likely to stay in a battle than # to teleport out. A risky borg will dive faster but is more likely to die. # A risky borg is not concerned with killing uniques before diving deeper. # # A borg who scums for uniques will set the auto_scum flag in order to generate # more exciting levels and hopefully encounter a unique # # borgs who kill_uniques will wait for uniques to die before diving deeper # into the dungeon. Usually, he will not dive deeper then three uniques. # Example, Unique Monsters who normally reside on levels 12, 15, and 18 are # still alive so the borg will not dive deeper than level 18 until at least one # of those uniques are dead. Setting this to FALSE will allow the borg to dive # deeper, faster, not being held up by the uniques. But, he does run the risk # of finding 3 or 4 uniques on one level. That can be a bit scary. borg_plays_risky = FALSE borg_scums_uniques = TRUE borg_kills_uniques = FALSE # Swap Items # The borg is designed to use Swap Items in the inventory. A swap item # is an equipment item (like a sword or armour item) which posseses a # desireable resistance or trait. If the borg is in danger, then he will # consider exchanging his current item for the swap item. A prime example of # this is at dungeon level 60. He is required to have several resists in # place. If he does not have them then he will not dive deeper. However, # with Swaps enabled he will select an item to cover the open resist then # dive down. Having Swaps enabled allows the borg to dive deeper, faster. # The draw back is the Swap Items take up two inventory slots. borg_uses_swaps = TRUE # Home Storage # The borg has two routines to store items in the home. One is very # effective and will make the best possible choice for adding an item to the # home. Unfortunately, this function is very slow. A much faster routine # will do a fine job at storing items in the home but it is not as # efficient. borg_slow_optimizehome = FALSE # Respawn # If the borg is in continual play mode (as with the screen saver), # he will respawn a randomly generated character at death. This section # allows the user to make certain bias for the type of character generated. # You may select the race and or class and or minimal stats for the Borg. # You may also select the minimal character level needed before the # character dump is created in the game directory. # With regards to race, the borg is programmed to accept the variety of # user defined races which may be in the p_info.txt file. So the values # given in table below are for the default races. But if you are bright # enough to modify the p_info.txt file then you are bright enough to figure # out that race 0 does not necessarily equal Human. It's just the first # race listed in your p_info.txt file. # # RACE:-1 Random Race CLASS: -1 Random Class # 0 Human 0 Warrior # 1 Half Elf 1 Mage # 2 Elf 2 Priest # 3 Hobbit 3 Rogue # 4 Gnome 4 Ranger # 5 Dwarf 5 Paladin # 6 Half Orc # 7 Half Troll # 8 Dunadan # 9 High Elf # 10 Kobold # # With regards to the stats. The minimal stats are rolled by the # borg. CON will be 16, the secondary stat (usually DEX) will be 17, # The primary stat will be 17. These are the maximal values which # can be rolled (racial and class bonuses added after). # If the borg can not reach the stats after 500,000 tries the game # will just assign you a random stat. # # After killing Morgoth, generally, the borg will stop and allow you # to inspect the victory. If you set the respawn_winners then after # killing Morgoth,the borg will generate a new character. A map file # is created so you can see what the final battle looked like. borg_respawn_race = -1 borg_respawn_class = -1 borg_respawn_winners = FALSE # Dumps # This variable will determine the minimal character level at which the borg # will create a character dump file. That file contains some vital information # concerning the status of the borg at the time of his demise. It is placed # in the user directory. # The borg_save_death variable will tell the borg to save the game in the user # directory so that it can be examined more closely. The clevel of the borg # must at least equal the borg_dump_level in order for the game to save. borg_dump_level = 1 borg_save_death = 1 # Auto Stops # The borg is able to stop when it reaches a certain dungeon depth or character # level. He will also stop when he wins the game. If you want him to keep # playing, even after Morgoth is dead, then change the borg_stop_king to FALSE. # Set the other values to the level at which you want the borg to stop. Set # them out of bounds if you do not want him to stop. borg_stop_dlevel = 128 borg_stop_clevel = 51 borg_no_deeper = 127 borg_stop_king = TRUE # Chest Tolerance # The borg is able to search, disarm, and open chests. There is a inherant # risk when dealing with chests. The risk of setting off the trap vs the # benefit of the loot within the chest. The game uses a straight forward # formula for calculating the success of a chest. It is: # randint(100) < the skill of the player minus the dificulty of the chest. # Difficulties run from 1 to 63. I would recommend a tolerance of about 7 # for vanilla chests (since they suck) and about 15 for DrAngband. borg_chest_fail_tolerance = 7 # Speed of the Borg # You can slow the borg down several different ways. One way is to set the # base game delay factor in the options menu. This will slow down the borg # and the visual effects (like missiles shooting, explosions). If using the # screensaver, you will need to load angband.exe load the savefile, make the # modifications, then save and exit. Another way to slow the borg down is # to add more term windows. The more it has to do, the slower it will be. # I recommend using Inventory, Equipment, Messages, Monster Recall, Borg # Status windows. Then you can really see what the borg is up to. Lastly, # to slow the borg down use the following variable. The formula is: # base_game_delay_factor^2 + borg_delay_factor^2. borg_delay_factor = 9 # Money Scumming # This started as more of a joke but it does have a useful purpose. If you # find yourself shopping in the BM and you really want that item and its just # out of your price range, then you can set a dollar amount into this variable # and the borg will run around town killing monsters and collecting items for # cash. Once he has reached his monetary goal, it will unhook and stop moving. # The borg will wait on the level, to build up more towns people, kill them, # buy food when it needs to. But it won't leave the level until the goal # is reached. To disengage the money scum, leave this variable at 0 (zero). # This will also simulate the borg_worships_gold and allow the borg to sell # non-ID'd items which will be dropped in town. The borg will flee from town # from Scary Guys. So keep this in mind with borgs under clevel 6. The borg # will not scum unless he has a perma light source (phial, or some glowing # artifact). The borg will stop if the General Store runs out of food to buy. # It is not recommended for borgs with Regeneration and no Slow # Digestion, since they will spend all their money on food. But if you have a # borg with Satisfy Hunger spell, they can stay in town forever. # NOTE: if a human wants the borg to scum to a particular amount, turn the # borg_self_scum to FALSE or else he will buy his own gear with that money. borg_money_scum_amount = 0 # Borg Scumming # This is a companion to the Money Scum above. The borg will scum town if # a stat potion is in the BM. If the borg finds an item in town that he would # really like to have, then he will stay in town until he can gathered enough # money to buy it. The borg will behave like the borg_money_scum_amount above. # If this is TRUE, then the borg is allowed to scum for items that he wants. # To forbid this behavior (which can take a very long time) set it FALSE. # NOTE: if a human wants the borg to scum to a particular amount, turn the # borg_self_scum to FALSE or else he will buy his own gear with that money. # Also, the borg must be at least clevel 10, with a perma light, # a 65% chance to avoid the pick pocket, and lots of food. borg_self_scum = TRUE # Lunal Borg # The borg will dive deep in the dungeon, even while he is still # low level, bouncing between levels to take nearby down stairs. # Once deep, he will gather items, then recall to town. He will not recall # back down into the dungeon, but walk all the way down again. If you want # a fast win, this is not the option for you. If you want the borg to have # maxed stats early on at the expense of game turns, then give this a try. # The best way to use this is to have a borg that can cast Satisfy Hunger. # This is a one way trip for the borg and he will be getting hungry. # The borg should also have a perma light source (like the phial). Again, # one way trip. He won't be stopping to restock his fuel source. However, # if he has food or fuel, he will use them when appropriate. Having extra # speed will help the borg too. Often he will come down the stairs, and # find himself right next to a monster. Sometimes, that monster can get # the first hit on a borg, killing him instantly. Even +3 speed would help # to avoid this type of instadeath. # # Self Lunal Mode will allow the borg to use the stair scumming in order to # dive deep in the dungeon for his own goals. For example, if the borg has # been down to depth 99, and now has no more potions of healing, he will # only be prepared for depth 45. He will remain shallow in the dungeon, # from depth 1-10 waiting for the shops to cycle. Then he will attempt to # buy a healing potion from the town shops. If none is available, he will # return to the shallow dungeon depths and wait for the shops to cycle. He # will repeat this pattern until he gets a potion of healing. If the borg # is allowed to self-lunal, then it will bounce the stairs down to a depth # where it feels comfortable. In the case above, it will do this until # about depth 40. borg_lunal_mode = FALSE borg_self_lunal = FALSE # Borg Verbose # Verbose is default off. It makes the borg give more reports on his actions # and thoughts. He still gives reports when verbose is FALSE, but when TRUE, # he really chats up a storm. borg_verbose = FALSE # Munchkin Start # Munchink start will have the borg stair-scum at depth 5-6, looking for items # which he will then sell in town. He will continue this process until about # clevel 6 or 7. The advantage is a sizable boost to his early income and # he can find some wands early on to assist with monster killing. borg_munchkin_start = TRUE borg_munchkin_level = 12 borg_munchkin_depth = 16 # Enchant Limit # The borg knows how to enchant his equipment using scrolls and spells. # For ammo, he will stop enchanting about +10 or so. If he has access # to the *enchant* spell, he can go up to +15. But the borg will spend # a lot of time casting and resting in order to get his item up to +15. # The borg has plenty of time, to waste doing this. If you want a fast # win, then choose a lower number like +11. borg_enchant_limit = 12 # WARNING: If you mess with the objects.txt or the monster.txt and change # the locations of things, then you must make those changes in borg.txt # as well as in this borg code. The borg is very concerned about item # index locations. ie: borgs_has[242] is looking for a Potion of Healing. # The borg is concerned over several items, broken swords, and several # monster locations (Tarresque, Sauron, Morgoth). # CHANGE THIS AT YOUR OWN RISK. Changes here can cause VERY STUPID borg # behaviour. If you do change them and your borg acts goofy, do not email me # complaining that your borg keeps dying. Change these values if you know # exactly what you are doing. It is strongly recommended that you keep a # backup copy of a borg.txt. # requirements # format of line # REQ_CLASSaaa_DEPTHbbb_(special value) # NOTE: CLASS999 = all classes # NOTE: CLASS000 = Warrior # NOTE: CLASS001 = Mage # NOTE: CLASS002 = Priests # NOTE: CLASS003 = Rogue # NOTE: CLASS004 = Ranger # NOTE: CLASS005 = Paladin # NOTE: it is possible to do stupid/impossible things, like require the borg # to have 3 Ringils or carry 999 potions of healing to get to level 1. # there are no checks against such stupidity. # special values are: # _ITEMxxx = xxx is the index in k_info- Item in inventory # _WITEMxxx = xxx is the index in k_info- Item being worn # _ARTIFACTxxx = xxx is the index in a_info- Artifact being worn # _FORMULAxxx = formula found on seperate line # the rest do not require numbers. # Too add this to this list, add to array in borg1.c, add to enum in borg1.h # (those must always match) then make sure the value is set in borg4.c borg_notice() # -personal attributes # _STR (0-39. 3 = 0, 15 = 18/00-18/09, 39 = 18/220) # _INT # _WIS # _DEX # _CON # _CHR # _CSTR (3-238+, 18/09 = 27) # _CINT # _CWIS # _CDEX # _CCON # _CCHR # Sustain Stat: # _SSTR # _SINT # _SWIS # _SDEX # _SCON # _SCHR # # _LIGHT = Has Lite # _CURHP = Current HP # _MAXHP = Max HP # _OLDCHP = HP last round # _CURSP = Current Mana # _MAXSP = max Mana # _ADJSP = mana adj due to Int/Wis # _OLDCSP = SP last round # _SFAIL1 = fail rate from array1 # _SFAIL2 = min fail rate # _CLEVEL = cur char level # _MAXCLEVEL = Max char level # _ESP = has telepathy # _CURLITE = Lite Radius # _RECALL = number of 'Recall's # _FOOD = number of foods # _SPEED = base speed (110 = normal speed) # _SDIG = Slow Digest # _FEATH = feather fall # _REG = regen # _SINV = See invis # _INFRA = Infravision # _DIS = Base Disarm # _DEV = Base device use # _SAV = Base Saving throw # _STL = Stealth # _SRCH = Search # _SERCHFREQ = Search Frequency # _THN = To hit (normal) # _THB = To hit (shooting) # _THT = To hit (throwing) # _DIG = Digging # Ignores/Immune # _IFIRE # _IACID # _ICOLD # _IELEC # Resists # _RFIRE # _RCOLD # _RELEC # _RACID # _RPOIS # _RFEAR # _RLITE # _RDARK # _RBLIND # _RCONF # _RSND # _RSHRD # _RNXUS # _RNTHR # _RKAOS # _RDIS # _HLIFE = Hold Life # _FRACT = Free Action # same as without S but includes swap # _SRFIRE # _SRCOLD # _SRELEC # _SRACID # _SRPOIS # _SRFEAR # _SRLITE # _SRDARK # _SRBLIND # _SRCONF # _SRSND # _SRSHRD # _SRNXUS # _SRNTHR # _SRKAOS # _SRDIS # _SHLIFE # _SFRACT # _DEPTH = current depth being tested or Max Depth (for power) # _CDEPTH = current depth borg is on # when the borg is testing, he might see if he is ready for depth 10 while he is on # depth 9 # _MAXDEPTH = recall depth # _KING = ***WINNER*** # Player Status # _ISWEAK # _ISHUNGRY # _ISFULL # _ISGORGED # _ISBLIND # _ISAFRAID # _ISCONFUSED # _ISPOISONED # _ISCUT # _ISSTUN # _ISHEAVYSTUN # _ISIMAGE # _ISSTUDY # _ISSEARCHING # _ISFIXLEV # _ISFIXEXP # _ISFIXSTR # _ISFIXINT # _ISFIXWIS # _ISFIXDEX # _ISFIXCON # _ISFIXCHR # _ISFIXALL # _ARMOR = base AC # _TOHIT = base to hit, does not include weapon # _TODAM = base to damage, does not include weapon # _WTOHIT = weapon to hit # _WTODAM = weapon to damage # _BTOHIT = bow to hit # _BTODAM = bow to damage # _BLOWS = # attacks with current weapon # _SHOTS = # shots with current bow # _WMAXDAM = max damage per round with weapon (normal blow) # Assumes you can enchant to +8 if you are level 25+ # _WBASEDAM = base damage per round with weapon (normal blow) # Assumes you no bonuses for to hit # _BMAXDAM = max damage per round with bow (normal hit) # Assumes you can enchant to +8 if you are level 25+ # _HEAVYWEPON = Weapon is 'heavy' # _HEAVYBOW = bow is 'heavy' # _CRSTELE = random teleport # _CRSAGRV = Aggrevate # weapon attributes # WS = slays # _WSANIMAL # _WSEVIL # _WSUNDEAD # _WSDEMON # _WSORC # _WSTROLL # _WSGIANT # _WSDRAGON # WK = Weapon Kills # _WKDRAGON # _WKDEMON # _WKUNDEAD # _WIMPACT # WB = Weapon Branded With # _WBACID # _WBELEC # _WBFIRE # _WBCOLD # _WBPOIS # inventory amounts # _ATELEPORT # _AESCAPE # _FUEL # _HEAL # _EZHEAL # _ID # _ASPEED # STF = Staff # _ASTFMAGI Amount Staff Charges # _ASTFDEST # _AMISSILES only ones for your current bow count # _ACUREPOIS # _ADETTRAP # _ADETDOOR # _ADETEVIL # _AMAGICMAP # _ALITE # _ARECHARGE # _APFE = Protection from Evil # _AGLYPH = Rune Protection # _ACCW = CCW potions # _ACSW = CSW potions (+ CLW if cut) # _ARESHEAT = Resist Heat potion # _ARESCOLD = Resist Cold potion # _ATELEPORTLVL = Scroll of Teleport Level # _HWORD = Holy Word spell is legal # _ADETONATE = POTIONS TO THROW # _DINV = See Inv spell is legal # Formulas are in (ew) reverse polish notation. # Here is a copy of the formulas as defaults. # If you alter yours and mess them up, look here # to return them to the normal value. #FORMULA000=_CLEVEL 30 >= _ACCW _ACSW + 2 >= || #FORMULA001=_CLEVEL 30 >= _ACCW _ACSW + 3 >= || #FORMULA002=_ATELEPORT _AESCAPE + 2 >= #FORMULA003=_CLEVEL _DEPTH 4 - >= _CLEVEL 19 >= || #FORMULA004=_CLEVEL _DEPTH 5 + >= _CLEVEL 19 >= || #FORMULA005=_CLEVEL _DEPTH >= _CLEVEL 19 >= || #FORMULA006=_CLEVEL 30 >= _ACCW 5 >= || #FORMULA007=_ESP _SINV || _DINV || #FORMULA008=_RCOLD _RELEC + _RACID + 1 >= #FORMULA009=_CLEVEL _DEPTH 5 + >= _CLEVEL 38 > || #FORMULA010=_CLEVEL _DEPTH 8 + >= _CLEVEL 38 > || #FORMULA011=_CLEVEL 38 - 2 * 30 + _DEPTH >= _CLEVEL 45 > || #FORMULA012=_CLEVEL _DEPTH 10 - >= _CLEVEL 43 > || #FORMULA013=_CLEVEL _DEPTH 13 - >= _CLEVEL 46 > || #FORMULA014=_CLEVEL _DEPTH 8 - >= _CLEVEL 41 > || #FORMULA015=_CLEVEL _DEPTH 7 - >= _CLEVEL 40 > || #FORMULA016=_ATELEPORT _AESCAPE + 6 >= #FORMULA017=_CLEVEL 30 >= _ACCW _ACSW + 10 >= || #FORMULA018=_SHLIFE _CLEVEL 50 = || #FORMULA019=_HEAL _EZHEAL || #FORMULA020=_HEAL 1 > _EZHEAL || #FORMULA021=_WMAXDAM 20 * _BLOWS 1 + * # see also formulas 81+ #FORMULA022=_WBASEDAM _BLOWS * 1 * _WSANIMAL * #FORMULA023=_WBASEDAM _BLOWS * 140 * _WSEVIL * #FORMULA024=_WBASEDAM _BLOWS * 150 * _WSUNDEAD * _WKUNDEAD ! * #FORMULA025=_WBASEDAM _BLOWS * 90 * _WSDEMON * _WKDEMON ! * #FORMULA026=_WBASEDAM _BLOWS * 20 * _WSORC * #FORMULA027=_WBASEDAM _BLOWS * 45 * _WSTROLL * #FORMULA028=_WBASEDAM _BLOWS * 180 * _WSDRAGON * _WKDRAGON ! * #FORMULA029=_WBASEDAM _BLOWS * 120 * _WSGIANT * #FORMULA030=_WBASEDAM _BLOWS * 130 * _WBACID * #FORMULA031=_WBASEDAM _BLOWS * 150 * _WBELEC * #FORMULA032=_WBASEDAM _BLOWS * 90 * _WBFIRE * #FORMULA033=_WBASEDAM _BLOWS * 90 * _WBCOLD * #FORMULA034=_WBASEDAM _BLOWS * 250 * _WKDRAGON * # See formulas 81+ #CND035=_STR 9 < #FORMULA036=_SPEED 110 < _SPEED 114 > || _SPEED 110 - * 2500 * #CND037=_MAXHP 500 > #FORMULA038=_MAXHP 500 - 100 * #CND039=_CLEVEL 25 < #CND040=_ESP ! #FORMULA041=_CLEVEL 50 == _HLIFE && 200 * _CLEVEL 50 != _HLIFE && 2000 * + #FORMULA042=_RCOLD _RFIRE && _RACID && _RELEC && 10000 * #FORMULA043=_SSTR _SINT && _SWIS && _SCON && _SDEX && 1000 * #FORMULA044=_SINV _ESP || 100000 * #CND045=_CLEVEL 50 != #CND046=_ARMOR 15 < #CND047=_ARMOR 15 >= _ARMOR 75 < && #CND048=_ARMOR 75 >= #FORMULA049=_RCOLD _RFIRE && _RACID && _RELEC && 100000 * #CND050=_CDEPTH 90 > #CND051=_REG 1 >= #CND052=_ITEM419 0 == #CND056=_CLEVEL 1 == #CND057=_MAXSP 100 > #CND058=_STR 15 > #CND059 _IFIRE ! #CND060 _ICOLD ! #FORMULA061= _AHWORD 1000 >= #CND062=_RCONF ! _CLEVEL 35 < || #CND063=_RCONF ! #FORMULA064=_ADJSP 35000 * #CND065=_RBLIND ! #FORMULA066=_ADJSP 35000 * #CND067=_RPOIS ! #FORMULA068=_WBASEDAM _BLOWS * 90 * _WBPOIS * # #FORMULA071=_ITEM324 _ITEM327 + 3 < _ITEM324 _ITEM327 + * 500 * #FORMULA072=_ITEM324 _ITEM327 + 3 >= 3 * 500 * #FORMULA073=_CDEPTH ! _CURHP 60 >= || #FORMULA074=_CDEPTH ! _CURHP 80 >= || #FORMULA075=_CDEPTH ! _CLEVEL 6 >= || #FORMULA076=_CDEPTH ! _CLEVEL 15 >= || #FORMULA077=_CDEPTH ! _CLEVEL 10 >= || #CND080=_STR 7 > # #Also see formulas 22-34 #FORMULA081=_WBASEDAM _BLOWS * 40 * _WSORC * _WSEVIL ! * #FORMULA082=_WBASEDAM _BLOWS * 45 * _WSTROLL * _WSEVIL ! * #FORMULA083=_WBASEDAM _BLOWS * 20 * _WSANIMAL * _WBELEC ! * #FORMULA085=_WBASEDAM _BLOWS * 175 * _WKUNDEAD * #FORMULA086=_WBASEDAM _BLOWS * 150 * _WKDEMON * #CND087= _CLEVEL 10 <= #FORMULA088= _FUEL 5 >= _LIGHT 1 >= || # #(heal + ez_heal > 30) && (ez_heal > 20) #FORMULA111=_ITEM242 _EZHEAL + 30 > _EZHEAL 20 >= && # things marked depth 99 and greater are ignored if Morgoth is dead REQ_CLASS999_DEPTH001_CURLITE=1 REQ_CLASS999_DEPTH001_FOOD=5 REQ_CLASS999_DEPTH002_FORMULA088 REQ_CLASS999_DEPTH002_RECALL=1 REQ_CLASS999_DEPTH002_CURHP=30 REQ_CLASS000_DEPTH003_CURHP=50 REQ_CLASS000_DEPTH003_CLEVEL=4 REQ_CLASS001_DEPTH003_CURHP=60 REQ_CLASS001_DEPTH003_CLEVEL=11 REQ_CLASS002_DEPTH003_CURHP=50 REQ_CLASS002_DEPTH003_CLEVEL=9 REQ_CLASS003_DEPTH003_CURHP=50 REQ_CLASS003_DEPTH003_CLEVEL=8 REQ_CLASS004_DEPTH003_CURHP=50 REQ_CLASS004_DEPTH003_CLEVEL=4 REQ_CLASS005_DEPTH003_CURHP=50 REQ_CLASS005_DEPTH003_CLEVEL=4 REQ_CLASS999_DEPTH003_FORMULA000 # this isn't quite what the original code did but no matter, it is commmented # out in the original code. # REQ_CLASS999_DEPTH003_ID=2 REQ_CLASS000_DEPTH005_FORMULA073 REQ_CLASS000_DEPTH005_FORMULA075 REQ_CLASS001_DEPTH005_FORMULA074 REQ_CLASS001_DEPTH005_FORMULA076 REQ_CLASS002_DEPTH005_FORMULA073 REQ_CLASS002_DEPTH005_FORMULA076 REQ_CLASS003_DEPTH005_FORMULA073 REQ_CLASS003_DEPTH005_FORMULA077 REQ_CLASS004_DEPTH005_FORMULA073 REQ_CLASS004_DEPTH005_FORMULA075 REQ_CLASS005_DEPTH005_FORMULA073 REQ_CLASS005_DEPTH005_FORMULA075 # this isn't quite what the original code did but no matter, it is commmented # out in the original code. # REQ_CLASS999_DEPTH005_ID=5 REQ_CLASS999_DEPTH005_RECALL=2 REQ_CLASS999_DEPTH010_CURLITE=2 REQ_CLASS999_DEPTH010_FORMULA001 REQ_CLASS999_DEPTH010_FORMULA002 REQ_CLASS000_DEPTH011_FORMULA003 REQ_CLASS001_DEPTH011_FORMULA004 REQ_CLASS002_DEPTH011_FORMULA005 REQ_CLASS003_DEPTH011_FORMULA005 REQ_CLASS004_DEPTH011_FORMULA005 REQ_CLASS005_DEPTH011_FORMULA005 # REQ_CLASS999_DEPTH010_ID=10 REQ_CLASS999_DEPTH010_FORMULA007 REQ_CLASS999_DEPTH020_FORMULA006 REQ_CLASS999_DEPTH020_FRACT=1 REQ_CLASS999_DEPTH021_SRFIRE=1 REQ_CLASS999_DEPTH021_FORMULA008 REQ_CLASS999_DEPTH021_CSTR=7 REQ_CLASS999_DEPTH021_CDEX=7 REQ_CLASS999_DEPTH021_CCON=7 REQ_CLASS001_DEPTH021_CINT=7 REQ_CLASS003_DEPTH021_CINT=7 REQ_CLASS004_DEPTH021_CINT=7 REQ_CLASS002_DEPTH021_CWIS=7 REQ_CLASS005_DEPTH021_CWIS=7 REQ_CLASS000_DEPTH021_FORMULA009 REQ_CLASS001_DEPTH021_FORMULA010 REQ_CLASS001_DEPTH033_FORMULA011 REQ_CLASS003_DEPTH021_FORMULA012 REQ_CLASS002_DEPTH021_FORMULA013 REQ_CLASS004_DEPTH021_FORMULA014 REQ_CLASS005_DEPTH021_FORMULA015 REQ_CLASS999_DEPTH026_FORMULA016 REQ_CLASS999_DEPTH026_FORMULA017 REQ_CLASS999_DEPTH030_ATELEPORT=1 REQ_CLASS999_DEPTH030_SRCOLD=1 REQ_CLASS999_DEPTH030_SRACID=1 REQ_CLASS999_DEPTH030_SRELEC=1 REQ_CLASS999_DEPTH034_CLEVEL=40 REQ_CLASS999_DEPTH035_SRPOIS=1 REQ_CLASS999_DEPTH040_CSTR=16 REQ_CLASS999_DEPTH040_CDEX=16 REQ_CLASS999_DEPTH040_CCON=16 REQ_CLASS001_DEPTH040_CINT=16 REQ_CLASS003_DEPTH040_CINT=16 REQ_CLASS004_DEPTH040_CINT=16 REQ_CLASS002_DEPTH040_CWIS=16 REQ_CLASS005_DEPTH040_CWIS=16 REQ_CLASS999_DEPTH046_SPEED=115 REQ_CLASS999_DEPTH046_RCONF=1 REQ_CLASS999_DEPTH046_CURHP=500 REQ_CLASS999_DEPTH046_CSTR=58 REQ_CLASS999_DEPTH046_CDEX=68 REQ_CLASS001_DEPTH046_CINT=118 REQ_CLASS003_DEPTH046_CINT=115 REQ_CLASS004_DEPTH046_CINT=115 REQ_CLASS002_DEPTH046_CWIS=118 REQ_CLASS005_DEPTH046_CWIS=115 REQ_CLASS999_DEPTH046_FORMULA018 REQ_CLASS999_DEPTH046_FORMULA019 REQ_CLASS999_DEPTH056_FORMULA020 REQ_CLASS999_DEPTH056_SRBLIND=1 #REQ_CLASS999_DEPTH056_SRNTHR=1 REQ_CLASS999_DEPTH056_ESP=1 REQ_CLASS999_DEPTH060_SPEED=120 REQ_CLASS999_DEPTH060_SRKAOS=1 REQ_CLASS999_DEPTH060_SRDIS=1 REQ_CLASS999_DEPTH081_SPEED=130 # p of restore Mana REQ_CLASS001_DEPTH100_ITEM266=10 REQ_CLASS002_DEPTH100_ITEM266=10 REQ_CLASS003_DEPTH100_ITEM266=10 REQ_CLASS004_DEPTH100_ITEM266=10 REQ_CLASS005_DEPTH100_ITEM266=10 # p of Healing REQ_CLASS999_DEPTH100_FORMULA111 # (heal + ez_heal > 30) && (ez_heal > 20) FORMULA111=_ITEM242 _EZHEAL + 30 > _EZHEAL 20 >= && REQ_CLASS999_DEPTH100_EZHEAL=15 # p of speed REQ_CLASS999_DEPTH100_ASPEED=10 #REQ_CLASS999_DEPTH101_KING=1 # Formulas are in (ew) reverse polish notation. # Sorry, it was easiest to process. # I will comment translations above the formulas for # people who are not reverse polish. # ((max_level >= 30) || ((ccw+csw) >= 2)) FORMULA000=_CLEVEL 30 >= _ACCW _ACSW + 2 >= || # ((max_level >= 30) || ((ccw+csw) >= 3)) FORMULA001=_CLEVEL 30 >= _ACCW _ACSW + 3 >= || # amt_teleport + amt_escape >= 2 FORMULA002=_ATELEPORT _AESCAPE + 2 >= # max_level >= depth - 4 || clevel >= 19 FORMULA003=_CLEVEL _DEPTH 4 - >= _CLEVEL 19 >= || # max_level >= depth + 5 || clevel >= 19 FORMULA004=_CLEVEL _DEPTH 5 + >= _CLEVEL 19 >= || # max_level >= depth || clevel >= 19 FORMULA005=_CLEVEL _DEPTH >= _CLEVEL 19 >= || # ((max_level >= 30) || (CCW >= 5)) FORMULA006=_CLEVEL 30 >= _ACCW 5 >= || # see invis or telepathy FORMULA007=_ESP _SINV || _DINV || # one resist (other than fire) FORMULA008=_RCOLD _RELEC + _RACID + 1 >= # max_level >= depth + 5 || max_level > 38 FORMULA009=_CLEVEL _DEPTH 5 + >= _CLEVEL 38 > || # max_level >= depth + 8 || max_level > 38 FORMULA010=_CLEVEL _DEPTH 8 + >= _CLEVEL 38 > || # (max_level-38)*2+30 <= dlevel (or clevel > 45) FORMULA011=_CLEVEL 38 - 2 * 30 + _DEPTH >= _CLEVEL 45 > || # max_level >= depth - 10 || max_level > 43 FORMULA012=_CLEVEL _DEPTH 10 - >= _CLEVEL 43 > || # max_level >= depth - 13 || max_level > 46 FORMULA013=_CLEVEL _DEPTH 13 - >= _CLEVEL 46 > || # max_level >= depth - 8 || max_level >= 41 FORMULA014=_CLEVEL _DEPTH 8 - >= _CLEVEL 41 > || # max_level >= depth - 7 || max_level >= 40 FORMULA015=_CLEVEL _DEPTH 7 - >= _CLEVEL 40 > || # amt_teleport + amt_escape >= 6 FORMULA016=_ATELEPORT _AESCAPE + 6 >= # ((max_level >= 30) || ((ccw+csw) >= 10)) FORMULA017=_CLEVEL 30 >= _ACCW _ACSW + 10 >= || # if below level 50, must have hold life FORMULA018=_SHLIFE _CLEVEL 50 = || # have some heal or ez heal FORMULA019=_HEAL _EZHEAL || # have 2 heal or 1 ez heal FORMULA020=_HEAL 1 > _EZHEAL || # Priests have Holy Word CND061= _AHWORD 1000 >= # HP must be more than x unless we are checking from town (_CDEPTH 0) FORMULA073=_CDEPTH ! _CURHP 60 >= || FORMULA074=_CDEPTH ! _CURHP 80 >= || # player level must be more than x0 unless we are checking from town (_CDEPTH 0) FORMULA075=_CDEPTH ! _CLEVEL 6 >= || FORMULA076=_CDEPTH ! _CLEVEL 15 >= || FORMULA077=_CDEPTH ! _CLEVEL 10 >= || #BI_FUEL >= 5 || BI_LIGHT >= 1 FORMULA088= _FUEL 5 >= _LIGHT 1 >= || # Power calculations # CHANGE THIS AT YOUR OWN RISK. Changes here can cause VERY STUPID borg # behavior. # Stuff left in code: 1) heavy armor gives a sliding loss of power # 2) bad gloves on a mage, -275K # 3) bad weapon on a priest, -75K # 4) special bonus for one item with RNeth RDisn RChaos = 25K # 5) special bonus for one item with RNeth RDisn = 15K # 6) CSW reward (complex) # 7) low level spell books (complex... need to know what you can cast) # 8) state specific things. This includes, enchant weapon scrolls when # weapon needs enchanting, restore stat potions, cures when injured in town, # and extra food when hungry # 9) weight/encumbrance penalty (too complex) # 10) reward for empty slots (to avoid carrying worthless junk) 4K/slot # # POWER_CLASSxxx_DEPTHxxx_CNDxxx_RANGExxxTOxxx_(special value)=xxx EACH # NOTE: CND is optional. It refers to a _FORMULA line later. The formula will be # evalulated and, if it is 0, the power calc is skipped # NOTE: EACH is optional. # NOTE: with range, only amounts in that range will count. # so if range is RANGE006TO007 and you have 12, you get # 2 * the 'power' with 'each' or nothing if not each # Range is ignored for formulas (gives an error) # NOTE: _RANGE000TO999 is a special case. it means 'no range used' # things marked depth 99 and greater are ignored if Morgoth is dead # 20 per damage point * (blows + 1) POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA021 FORMULA021=_WMAXDAM 20 * _BLOWS 1 + * POWER_CLASS999_DEPTH000_RANGE000TO999_TOHIT= 750 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_WTOHIT= 750 EACH # slays and such... yikes! POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA022 POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA083 #Brands rewarded if Kill Brand not there. #SAnimal is rewarded only if weapon is not electric brand. FORMULA022=_WBASEDAM _BLOWS * 1 * _WSANIMAL * FORMULA083=_WBASEDAM _BLOWS * 20 * _WSANIMAL * _WBELEC ! * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA023 FORMULA023=_WBASEDAM _BLOWS * 140 * _WSEVIL * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA024 FORMULA024=_WBASEDAM _BLOWS * 150 * _WSUNDEAD * _WKUNDEAD ! * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA025 FORMULA025=_WBASEDAM _BLOWS * 90 * _WSDEMON * _WKDEMON ! * #SOrc is rewarded more if slay evil is not possesed POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA026 POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA081 FORMULA026=_WBASEDAM _BLOWS * 20 * _WSORC * FORMULA081=_WBASEDAM _BLOWS * 20 * _WSORC * _WSEVIL ! * #STroll is rewarded more if slay evil is not possesed POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA027 POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA082 FORMULA027=_WBASEDAM _BLOWS * 45 * _WSTROLL * FORMULA082=_WBASEDAM _BLOWS * 45 * _WSTROLL * _WSEVIL ! * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA028 FORMULA028=_WBASEDAM _BLOWS * 180 * _WSDRAGON * _WKDRAGON ! * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA029 FORMULA029=_WBASEDAM _BLOWS * 120 * _WSGIANT * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA030 FORMULA030=_WBASEDAM _BLOWS * 130 * _WBACID * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA031 FORMULA031=_WBASEDAM _BLOWS * 150 * _WBELEC * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA032 FORMULA032=_WBASEDAM _BLOWS * 90 * _WBFIRE * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA033 FORMULA033=_WBASEDAM _BLOWS * 90 * _WBCOLD * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA033 FORMULA068=_WBASEDAM _BLOWS * 90 * _WBPOIS * #Kills brands POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA034 FORMULA034=_WBASEDAM _BLOWS * 250 * _WKDRAGON * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA085 FORMULA085=_WBASEDAM _BLOWS * 175 * _WKUNDEAD * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA086 FORMULA086=_WBASEDAM _BLOWS * 150 * _WKDEMON * POWER_CLASS999_DEPTH000_RANGE000TO999_WIMPACT=5000 POWER_CLASS999_DEPTH000_CND080_RANGE000TO999_HEAVYWEPON=-8000 CND080=_STR 7 > POWER_CLASS999_DEPTH000_RANGE000TO999_HEAVYBOW=-500000 # Borg worships num_blow, even on broken swords. # kind 47 is a broken sword usually 1d2 in damage POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM030=-90000 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM047=-90000 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM390=-90000 # slings force you to carry heavy ammo. Penalty for that unles you have lots of str POWER_CLASS999_DEPTH000_CND035_RANGE000TO999_WITEM077= -5000 CND035=_STR 9 < #We want the borg to use whips and daggers at first POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_BLOWS= 45000 EACH CND087= _CLEVEL 10 <= # bow damage POWER_CLASS999_DEPTH000_RANGE000TO999_BMAXDAM= 9 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_TOHIT= 250 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_BTOHIT= 250 EACH #We want low level dudes to really like ranged weaps POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_BMAXDAM= 300 EACH POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_TOHIT= 300 EACH POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_BTOHIT= 300 EACH #We want low level dudes to buy a sling asap POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_WITEM073= 3000 POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_WITEM074= 3000 POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_WITEM075= 3000 POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_WITEM076= 3000 POWER_CLASS999_DEPTH000_CND087_RANGE000TO999_WITEM077= 3000 # Rangers perfer bows POWER_CLASS004_DEPTH000_RANGE000TO999_WITEM073= 30000 POWER_CLASS004_DEPTH000_RANGE000TO999_WITEM074= 30000 # Dragon armor liked for the activation. (AJG: I adjusted this slightly) POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM400=1100 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM401=1100 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM402=1100 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM403=1100 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM404=2750 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM405=3250 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM406=5550 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM407=5650 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM408=5750 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM409=5850 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM410=5950 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM411=5975 POWER_CLASS999_DEPTH000_RANGE000TO999_WITEM412=5999 # Light bonuses POWER_CLASS999_DEPTH000_RANGE000TO000_CURLITE=-3000 POWER_CLASS999_DEPTH000_RANGE001TO003_CURLITE=500000 EACH POWER_CLASS999_DEPTH000_RANGE003TO099_CURLITE=580000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT001=8000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT002=10000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT003=12000 # Speed formulas are slightly complex. Note negative for poor speed # 110 is the base speed # (Speed - 110) * 2500 POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA036 FORMULA036=_SPEED 110 < _SPEED 114 > || _SPEED 110 - * 2500 * POWER_CLASS999_DEPTH000_RANGE111TO999_SPEED= 1000 EACH POWER_CLASS999_DEPTH000_RANGE110TO114_SPEED= 55000 POWER_CLASS999_DEPTH000_RANGE115TO119_SPEED= 75000 POWER_CLASS999_DEPTH000_RANGE120TO124_SPEED= 100000 POWER_CLASS999_DEPTH000_RANGE125TO129_SPEED= 125000 POWER_CLASS999_DEPTH000_RANGE130TO134_SPEED= 140000 POWER_CLASS999_DEPTH000_RANGE135TO139_SPEED= 155000 POWER_CLASS999_DEPTH000_RANGE140TO144_SPEED= 165000 POWER_CLASS999_DEPTH000_RANGE145TO149_SPEED= 170000 POWER_CLASS999_DEPTH000_RANGE150TO999_SPEED= 175000 # stat bonuses POWER_CLASS999_DEPTH000_RANGE000TO999_STR= 100 EACH # note: division of bonus based on class POWER_CLASS001_DEPTH000_RANGE000TO999_INT= 200 EACH POWER_CLASS002_DEPTH000_RANGE000TO999_WIS= 200 EACH POWER_CLASS003_DEPTH000_RANGE000TO999_INT= 200 EACH POWER_CLASS004_DEPTH000_RANGE000TO999_INT= 200 EACH POWER_CLASS005_DEPTH000_RANGE000TO999_WIS= 200 EACH # we can't directly give a bonus for mana or your bonus # would adjust as you cast spells. Instead we give a # bonus for 'mana adjustment' based on stats POWER_CLASS001_DEPTH000_RANGE000TO999_ADJSP= 255 EACH POWER_CLASS002_DEPTH000_RANGE000TO999_ADJSP= 250 EACH POWER_CLASS003_DEPTH000_RANGE000TO999_ADJSP= 155 EACH POWER_CLASS004_DEPTH000_RANGE000TO999_ADJSP= 155 EACH POWER_CLASS005_DEPTH000_RANGE000TO999_ADJSP= 150 EACH # The fail rate is based on the table adj_mag_stat[] POWER_CLASS001_DEPTH000_RANGE000TO999_SFAIL1= 5010 EACH POWER_CLASS002_DEPTH000_RANGE000TO999_SFAIL1= 5000 EACH POWER_CLASS003_DEPTH000_RANGE000TO999_SFAIL1= 3010 EACH POWER_CLASS004_DEPTH000_RANGE000TO999_SFAIL1= 3010 EACH POWER_CLASS005_DEPTH000_RANGE000TO999_SFAIL1= 3000 EACH # This is the 'min fail rate' and it is nice if it is 0 # (note range 0 to 0) (I hope this works) POWER_CLASS001_DEPTH000_RANGE000TO002_SFAIL2= 70000 POWER_CLASS002_DEPTH000_RANGE000TO002_SFAIL2= 70000 # Priests with Holy Word legal try to maximize WIS POWER_CLASS002_DEPTH000_CND061_RANGE000TO999_FORMULA064 FORMULA064=_ADJSP 35000 * POWER_CLASS999_DEPTH000_RANGE000TO999_DEX= 120 EACH # like spell points, hit points are 'powered' based on your hp bonus # which is based on your con and adj_con_mhp[] POWER_CLASS999_DEPTH000_RANGE000TO999_CON= 150 EACH # first 500 hp's are more important than the next 500 POWER_CLASS999_DEPTH000_RANGE000TO500_MAXHP= 350 EACH # can't use the range because of the 999 max :-( POWER_CLASS999_DEPTH000_CND037_RANGE000TO999_FORMULA038 CND037=_MAXHP 500 > FORMULA038=_MAXHP 500 - 100 * # charisma is only nice at low levels POWER_CLASS999_DEPTH000_CND039_RANGE000TO999_CHR= 2 EACH CND039=_CLEVEL 25 < # 'minor' skills POWER_CLASS999_DEPTH000_RANGE000TO999_DIS= 2 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_DEV= 25 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_SAV= 25 EACH POWER_CLASS999_DEPTH000_RANGE100TO999_SAV= 10000 POWER_CLASS999_DEPTH000_RANGE000TO999_STL= 2 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_SRCH= 1 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_SERCHFREQ= 1 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_THN= 5 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_THB= 35 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_THT= 2 EACH POWER_CLASS999_DEPTH000_RANGE000TO999_DIG= 2 EACH # other powers POWER_CLASS999_DEPTH000_RANGE000TO999_SDIG= 750 # note: after depth 20 you only get 50 for Feather fall (500-450) POWER_CLASS999_DEPTH000_RANGE000TO999_FEATH= 500 POWER_CLASS999_DEPTH020_RANGE000TO999_FEATH= -450 POWER_CLASS999_DEPTH000_RANGE000TO999_LIGHT= 2000 # 500 for ESP & See inv, 5000 for just see inv (ESP is rewarded later) POWER_CLASS999_DEPTH000_RANGE000TO999_SINV= 500 POWER_CLASS999_DEPTH000_CND040_RANGE000TO999_SINV= 4500 CND040=_ESP ! POWER_CLASS999_DEPTH000_RANGE000TO999_FRACT= 10000 # only 200 pts for Hold Life if you have maxed out your level POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA041 FORMULA041=_CLEVEL 50 == _HLIFE && 200 * _CLEVEL 50 != _HLIFE && 2000 * + POWER_CLASS999_DEPTH000_RANGE000TO999_REG= 2000 POWER_CLASS999_DEPTH000_RANGE000TO999_ESP= 80000 POWER_CLASS999_DEPTH000_RANGE000TO999_ICOLD= 50000 POWER_CLASS999_DEPTH000_RANGE000TO999_IELEC= 25000 POWER_CLASS999_DEPTH000_RANGE000TO999_IFIRE= 70000 POWER_CLASS999_DEPTH000_RANGE000TO999_IACID= 30000 POWER_CLASS999_DEPTH000_RANGE000TO999_RCOLD= 3000 POWER_CLASS999_DEPTH000_RANGE000TO999_RELEC= 4000 POWER_CLASS999_DEPTH000_RANGE000TO999_RACID= 6000 POWER_CLASS999_DEPTH000_RANGE000TO999_RFIRE= 8000 # special bonus for base 4 resists POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA042 FORMULA042=_RCOLD _RFIRE && _RACID && _RELEC && 10000 * POWER_CLASS999_DEPTH000_RANGE000TO999_RPOIS= 20000 POWER_CLASS999_DEPTH000_RANGE000TO999_RSND= 3500 POWER_CLASS999_DEPTH000_RANGE000TO999_RLITE= 800 POWER_CLASS999_DEPTH000_RANGE000TO999_RDARK= 800 POWER_CLASS999_DEPTH000_RANGE000TO999_RKAOS= 5000 # note, this is especially high because some items (CCW) give # extra bonuses if you don't have RCONF, so we need to ensure # you will not do that -instead- of getting RCONF POWER_CLASS999_DEPTH000_RANGE000TO999_RCONF= 80000 # and a little extra for a mage. POWER_CLASS001_DEPTH000_RANGE000TO999_RCONF= 2000 POWER_CLASS999_DEPTH000_RANGE000TO999_RDIS= 5000 POWER_CLASS999_DEPTH000_RANGE000TO999_RSHRD= 100 POWER_CLASS999_DEPTH000_RANGE000TO999_RNXUS= 100 POWER_CLASS999_DEPTH000_RANGE000TO999_RBLIND= 5000 POWER_CLASS999_DEPTH000_RANGE000TO999_RNTHR= 5500 POWER_CLASS999_DEPTH000_RANGE000TO999_RFEAR= 2000 # sustains # note: don't care about SCHR POWER_CLASS999_DEPTH000_RANGE000TO999_SSTR= 50 POWER_CLASS999_DEPTH000_RANGE000TO999_SINT= 50 POWER_CLASS999_DEPTH000_RANGE000TO999_SWIS= 50 POWER_CLASS999_DEPTH000_RANGE000TO999_SCON= 50 POWER_CLASS999_DEPTH000_RANGE000TO999_SDEX= 50 # special bonus for sustain all POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA043 FORMULA043=_SSTR _SINT && _SWIS && _SCON && _SDEX && 1000 * # special rewards for 'must have' (based on requirements above) POWER_CLASS999_DEPTH009_RANGE000TO999_FORMULA044 FORMULA044=_SINV _ESP || 100000 * POWER_CLASS999_DEPTH019_RANGE000TO999_FRACT= 100000 POWER_CLASS999_DEPTH024_RANGE000TO999_RFIRE= 100000 POWER_CLASS999_DEPTH035_RANGE000TO999_RPOIS= 100000 POWER_CLASS999_DEPTH030_RANGE000TO999_RELEC= 100000 POWER_CLASS999_DEPTH030_RANGE000TO999_RACID= 100000 POWER_CLASS999_DEPTH030_RANGE000TO999_RCOLD= 100000 POWER_CLASS999_DEPTH040_RANGE000TO999_RCONF= 100000 POWER_CLASS999_DEPTH045_CND045_RANGE000TO999_HLIFE= 100000 CND045=_CLEVEL 50 != POWER_CLASS999_DEPTH045_RANGE115TO999_SPEED= 100000 # note: Resist nether shows up several times... it is important POWER_CLASS999_DEPTH049_RANGE000TO999_RNTHR= 55000 POWER_CLASS999_DEPTH049_RANGE000TO999_RSND= 100000 POWER_CLASS999_DEPTH054_RANGE000TO999_RBLIND= 100000 POWER_CLASS999_DEPTH054_RANGE000TO999_ESP= 100000 POWER_CLASS999_DEPTH059_RANGE000TO999_RNTHR= 55000 POWER_CLASS999_DEPTH059_RANGE000TO999_RKAOS= 104000 POWER_CLASS999_DEPTH059_RANGE000TO999_RDIS= 90000 # speed above 120 gets a bonus POWER_CLASS999_DEPTH059_RANGE120TO999_SPEED= 100000 # speed above 130 gets a bonus POWER_CLASS999_DEPTH079_RANGE130TO999_SPEED= 100000 POWER_CLASS999_DEPTH079_RANGE000TO999_RNTHR= 15000 POWER_CLASS999_DEPTH079_RANGE000TO999_RDARK= 25000 # Warrior's get an extra bonus for speed about 140 POWER_CLASS000_DEPTH079_RANGE140TO999_SPEED= 100000 # AC Bonuses (dependant on level) POWER_CLASS999_DEPTH000_CND046_RANGE000TO999_ARMOR= 2000 EACH CND046=_ARMOR 15 < POWER_CLASS999_DEPTH000_CND047_RANGE000TO999_ARMOR= 500 EACH CND047=_ARMOR 15 >= _ARMOR 75 < && POWER_CLASS999_DEPTH000_CND048_RANGE000TO999_ARMOR= 100 EACH CND048=_ARMOR 75 >= # cursed items POWER_CLASS999_DEPTH000_RANGE000TO999_CRSTELE= -100000 POWER_CLASS000_DEPTH000_RANGE000TO999_CRSAGRV= -80000 POWER_CLASS001_DEPTH000_RANGE000TO999_CRSAGRV= -8000 POWER_CLASS002_DEPTH000_RANGE000TO999_CRSAGRV= -80000 POWER_CLASS003_DEPTH000_RANGE000TO999_CRSAGRV= -80000 POWER_CLASS004_DEPTH000_RANGE000TO999_CRSAGRV= -80000 POWER_CLASS005_DEPTH000_RANGE000TO999_CRSAGRV= -80000 # Depth 99+, assume going after Morgoth. # note: these are ignored if Morgoth is dead #POWER_CLASS999_DEPTH099_RANGE000TO999_SSTR= 35000 #POWER_CLASS001_DEPTH099_RANGE000TO999_SINT= 45000 #POWER_CLASS003_DEPTH099_RANGE000TO999_SINT= 45000 #POWER_CLASS004_DEPTH099_RANGE000TO999_SINT= 45000 #POWER_CLASS002_DEPTH099_RANGE000TO999_SWIS= 35000 #POWER_CLASS005_DEPTH099_RANGE000TO999_SWIS= 35000 #POWER_CLASS999_DEPTH099_RANGE000TO999_SCON= 55000 #POWER_CLASS999_DEPTH099_RANGE000TO999_SDEX= 15000 #POWER_CLASS999_DEPTH099_RANGE000TO999_WSEVIL= 15000 #POWER_CLASS999_DEPTH099_RANGE000TO999_RNTHR= 15000 #POWER_CLASS999_DEPTH099_RANGE000TO999_RDIS= 15000 #POWER_CLASS999_DEPTH099_RANGE000TO999_RPOIS= 100000 #Pots of Berserk Str for non Priest/Mage POWER_CLASS000_DEPTH099_RANGE000TO999_ITEM258= 2000 EACH POWER_CLASS003_DEPTH099_RANGE000TO999_ITEM258= 2000 EACH POWER_CLASS004_DEPTH099_RANGE000TO999_ITEM258= 2000 EACH POWER_CLASS005_DEPTH099_RANGE000TO999_ITEM258= 2000 EACH # Mass Banishment Scrolls POWER_CLASS999_DEPTH099_RANGE000TO999_AMASSBAN= 2500 EACH # Heal Pots POWER_CLASS005_DEPTH099_RANGE000TO999_ITEM242= 2000 EACH # Res Mana pots POWER_CLASS005_DEPTH099_RANGE000TO999_ITEM266= 2000 EACH #POWER_CLASS999_DEPTH099_RANGE000TO999_FORMULA049 FORMULA049=_RCOLD _RFIRE && _RACID && _RELEC && 100000 * #POWER_CLASS999_DEPTH099_RANGE000TO999_AGLYPH= 2500 EACH # artifact activation bonuses POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT001= 1500 POWER_CLASS001_DEPTH000_RANGE000TO999_ARTIFACT001= 500 POWER_CLASS002_DEPTH000_RANGE000TO999_ARTIFACT001= 500 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT001= 1000 POWER_CLASS004_DEPTH000_RANGE000TO999_ARTIFACT001= 1000 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT001= 1000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT002= 1200 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT001= 2000 POWER_CLASS001_DEPTH000_RANGE000TO999_ARTIFACT003= 2000 POWER_CLASS002_DEPTH000_RANGE000TO999_ARTIFACT003= 1500 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT003= 2000 POWER_CLASS004_DEPTH000_RANGE000TO999_ARTIFACT003= 2000 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT003= 2000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT067= 527 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT068= 518 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT069= 524 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT070= 596 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT072= 554 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT082= 700 # NOTE: Don't do this if you are using random artifacts (ringil speed bonus) # POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT082= 25000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT083= 644 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT093= 620 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT097= 700 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT112= 700 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT115= 644 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT122= 590 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT016= 800 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT053= 507 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT054= 540 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT055= 527 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT056= 518 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT057= 522 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT059= 650 # NOTE: Don't do this if you are using random artifacts (Feanor special bonus) # POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT060= 5000 # Ok so I fudged this one: Dispel Evil (it was a nice formula in the code) # I took a random average POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT005= 650 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT010= 740 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT011= 900 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT012= 1000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT013= 999999 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT108= 1000 POWER_CLASS001_DEPTH000_RANGE000TO999_ARTIFACT108= 500 POWER_CLASS002_DEPTH000_RANGE000TO999_ARTIFACT108= 1000 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT108= 1000 POWER_CLASS004_DEPTH000_RANGE000TO999_ARTIFACT108= 1000 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT108= 1000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT017= 650 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT017= 25000 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT017= 25000 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT017= 25000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT044= 650 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT044= 25000 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT044= 25000 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT044= 25000 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT045= 7500 POWER_CLASS001_DEPTH000_RANGE000TO999_ARTIFACT045= 500 POWER_CLASS002_DEPTH000_RANGE000TO999_ARTIFACT045= 500 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT045= 700 POWER_CLASS004_DEPTH000_RANGE000TO999_ARTIFACT045= 700 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT045= 700 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT046= 600 POWER_CLASS001_DEPTH000_RANGE000TO999_ARTIFACT046= 500 POWER_CLASS002_DEPTH000_RANGE000TO999_ARTIFACT046= 600 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT046= 600 POWER_CLASS004_DEPTH000_RANGE000TO999_ARTIFACT046= 600 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT046= 600 POWER_CLASS000_DEPTH000_RANGE000TO999_ARTIFACT061= 700 POWER_CLASS001_DEPTH000_RANGE000TO999_ARTIFACT061= 500 POWER_CLASS002_DEPTH000_RANGE000TO999_ARTIFACT061= 500 POWER_CLASS003_DEPTH000_RANGE000TO999_ARTIFACT061= 700 POWER_CLASS004_DEPTH000_RANGE000TO999_ARTIFACT061= 700 POWER_CLASS005_DEPTH000_RANGE000TO999_ARTIFACT061= 700 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT126= 800 # NOTE: Don't do this if you are using random artifacts (Cubragol speed) # POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT126= 25000 POWER_CLASS999_DEPTH000_RANGE000TO999_ARTIFACT031= 500 # Condition 058 is used miltiple times relating to inventory # items. Weak characters need to not be slow. CND058=_STR 15 > # Inventory items POWER_CLASS999_DEPTH000_RANGE001TO006_FUEL= 60000 EACH POWER_CLASS999_DEPTH000_CND058_RANGE007TO008_FUEL= 500 EACH POWER_CLASS999_DEPTH000_RANGE001TO008_FOOD= 50000 EACH POWER_CLASS999_DEPTH000_CND058_RANGE009TO015_FOOD= 200 EACH # Carry extra food if Regen POWER_CLASS999_DEPTH000_CND051_RANGE000TO015_FOOD= 700 EACH CND051=_REG 1 >= _CLEVEL 20 <= && # ID scrolls, but not too many if Low Strength POWER_CLASS999_DEPTH000_RANGE001TO004_ID= 6000 EACH POWER_CLASS999_DEPTH000_CND058_RANGE005TO010_ID= 6000 EACH # This is *ID* POWER_CLASS999_DEPTH000_RANGE001TO003_ITEM177= 10000 EACH POWER_CLASS999_DEPTH000_RANGE005TO010_ITEM177= 2000 EACH POWER_CLASS999_DEPTH000_RANGE001TO005_APFE= 10000 EACH POWER_CLASS999_DEPTH000_RANGE006TO010_APFE= 2000 EACH POWER_CLASS999_DEPTH000_RANGE001TO005_AGLYPH= 10000 EACH POWER_CLASS999_DEPTH000_RANGE006TO010_AGLYPH= 2000 EACH POWER_CLASS999_DEPTH000_RANGE001TO003_RECALL= 50000 EACH POWER_CLASS999_DEPTH000_CND058_RANGE004TO007_RECALL= 5000 EACH # Resist Heat and Cold for Warriors (for now) POWER_CLASS000_DEPTH000_CND059_RANGE001TO004_ARESHEAT= 500 EACH CND059=_IFIRE ! POWER_CLASS000_DEPTH000_CND060_RANGE001TO004_ARESCOLD= 500 EACH CND060=_ICOLD ! # scrolls of phase door POWER_CLASS999_DEPTH000_RANGE000TO004_APHASE= 50000 EACH POWER_CLASS999_DEPTH000_RANGE005TO008_APHASE= 1000 EACH POWER_CLASS999_DEPTH000_CND058_RANGE009TO015_APHASE= 500 EACH POWER_CLASS999_DEPTH000_RANGE001TO002_AESCAPE= 10000 EACH POWER_CLASS999_DEPTH090_CND050_RANGE003TO005_AESCAPE= 30000 CND050=_CDEPTH 90 > POWER_CLASS999_DEPTH000_RANGE001TO005_ATELEPORT= 10000 EACH POWER_CLASS999_DEPTH000_RANGE006TO999_ATELEPORT= 50000 #POWER_CLASS999_DEPTH000_CND058_RANGE006TO010_ATELEPORT= 10000 EACH #POWER_CLASS999_DEPTH000_CND058_RANGE010TO999_ATELEPORT= 100000 #POWER_CLASS999_DEPTH000_RANGE001TO005_ATELEPORTLVL= 10000 EACH # Healing stuff gets complex and is very class dependant POWER_CLASS000_DEPTH000_RANGE001TO020_HEAL= 8000 EACH POWER_CLASS003_DEPTH000_RANGE001TO020_HEAL= 8000 EACH # *HEAL* POWER_CLASS999_DEPTH000_RANGE001TO002_ITEM419= 10000 EACH # first two LIFE give 9000 if you have no *HEAL* POWER_CLASS999_DEPTH000_CND052_RANGE001TO002_ITEM420= 9000 CND052=_ITEM419 0 == # rod of healing POWER_CLASS000_DEPTH000_RANGE001TO002_ITEM374= 20000 EACH POWER_CLASS003_DEPTH000_RANGE001TO002_ITEM374= 20000 EACH POWER_CLASS001_DEPTH000_RANGE001TO020_HEAL= 4000 EACH POWER_CLASS004_DEPTH000_RANGE001TO020_HEAL= 4000 EACH POWER_CLASS005_DEPTH000_RANGE001TO020_HEAL= 4000 EACH POWER_CLASS001_DEPTH000_RANGE001TO002_ITEM419= 9000 EACH POWER_CLASS004_DEPTH000_RANGE001TO002_ITEM419= 9000 EACH POWER_CLASS005_DEPTH000_RANGE001TO002_ITEM419= 9000 EACH # make sure level 1 Priest sell thier healing potion for quick cash POWER_CLASS002_DEPTH000_CND056_RANGE000TO999_ITEM242= -2000 EACH CND056=_CLEVEL 1 == POWER_CLASS002_DEPTH000_RANGE000TO010_ITEM242= 2000 EACH # if your max mana is more than 100, reward up to ten restore manas POWER_CLASS999_DEPTH000_CND057_RANGE001TO010_ITEM266= 4000 EACH CND057=_MAXSP 100 > # and some magi staff charges POWER_CLASS999_DEPTH000_CND057_RANGE001TO100_ASTFMAGI= 4000 EACH POWER_CLASS999_DEPTH000_RANGE001TO005_ACCW= 5000 EACH POWER_CLASS999_DEPTH000_CND058_RANGE006TO010_ACCW= 5000 EACH # next 5 at 500 if you done have resist conf or are below level 35 POWER_CLASS999_DEPTH000_CND062_RANGE011TO015_ACCW= 500 EACH CND062=_RCONF ! _CLEVEL 35 < || # If you don't have RCONF, give reward for collecting cure conf POWER_CLASS999_DEPTH000_CND063_RANGE001TO010_ITEM008= 400 EACH CND063=_RCONF ! # If you don't have RBLIND, give reward for collecting cure blind POWER_CLASS999_DEPTH000_CND065_RANGE001TO005_ITEM006= 300 EACH CND065=_RBLIND ! # If you don't have RPOIS, give reward for collecting cure pois POWER_CLASS999_DEPTH000_CND067_RANGE001TO005_ACUREPOIS= 250 EACH CND067=_RPOIS ! POWER_CLASS999_DEPTH000_RANGE000TO999_ADETTRAP= 4000 POWER_CLASS999_DEPTH000_RANGE000TO999_ADETDOOR= 2000 POWER_CLASS999_DEPTH000_RANGE000TO999_ADETEVIL= 1000 POWER_CLASS999_DEPTH000_RANGE000TO999_AMAGICMAP= 4000 POWER_CLASS999_DEPTH000_RANGE000TO999_ALITE= 1000 # Genocide - only collect when deep POWER_CLASS999_DEPTH100_RANGE001TO010_ITEM207= 10000 EACH POWER_CLASS999_DEPTH100_RANGE011TO020_ITEM207= 2000 EACH # Mass Genocide - only collect when deep POWER_CLASS999_DEPTH100_RANGE001TO010_ITEM200= 10000 EACH POWER_CLASS999_DEPTH100_RANGE011TO020_ITEM200= 2000 EACH POWER_CLASS999_DEPTH000_RANGE001TO005_ARECHARGE= 5000 EACH POWER_CLASS000_DEPTH000_RANGE001TO010_AMISSILES= 1000 EACH POWER_CLASS001_DEPTH000_RANGE001TO010_AMISSILES= 1000 EACH POWER_CLASS002_DEPTH000_RANGE001TO010_AMISSILES= 1000 EACH POWER_CLASS003_DEPTH000_RANGE001TO010_AMISSILES= 1000 EACH POWER_CLASS004_DEPTH000_RANGE001TO020_AMISSILES= 1000 EACH POWER_CLASS005_DEPTH000_RANGE001TO010_AMISSILES= 1000 EACH POWER_CLASS000_DEPTH000_CND058_RANGE011TO040_AMISSILES= 100 EACH POWER_CLASS001_DEPTH000_CND058_RANGE011TO040_AMISSILES= 100 EACH POWER_CLASS002_DEPTH000_CND058_RANGE011TO040_AMISSILES= 100 EACH POWER_CLASS003_DEPTH000_CND058_RANGE011TO040_AMISSILES= 100 EACH POWER_CLASS004_DEPTH000_CND058_RANGE021TO070_AMISSILES= 100 EACH POWER_CLASS005_DEPTH000_CND058_RANGE011TO040_AMISSILES= 100 EACH #too many missiles POWER_CLASS000_DEPTH000_RANGE050TO999_AMISSILES= -1000 EACH POWER_CLASS001_DEPTH000_RANGE050TO999_AMISSILES= -1000 EACH POWER_CLASS002_DEPTH000_RANGE050TO999_AMISSILES= -1000 EACH POWER_CLASS003_DEPTH000_RANGE050TO999_AMISSILES= -1000 EACH POWER_CLASS004_DEPTH000_RANGE075TO999_AMISSILES= -1000 EACH POWER_CLASS005_DEPTH000_RANGE050TO999_AMISSILES= -1000 EACH # Potions of Detonations POWER_CLASS999_DEPTH000_RANGE001TO020_ADETONATE= 2000 EACH # If you have up to 3 staffs of power or holiness you get rewarded. # first gets 2500 POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA070 FORMULA070=_ITEM324 _ITEM327 || 2500 * # all three get 500 POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA071 FORMULA071=_ITEM324 _ITEM327 + 3 < _ITEM324 _ITEM327 + * 500 * POWER_CLASS999_DEPTH000_RANGE000TO999_FORMULA072 FORMULA072=_ITEM324 _ITEM327 + 3 >= 3 * 500 * # If you have up to 3 staffs of destruction you get rewarded. POWER_CLASS999_DEPTH000_RANGE000TO999_ITEM307= 5000 POWER_CLASS999_DEPTH000_RANGE000TO003_ITEM307= 200 EACH # Wand of Teleport Other (or Spells) POWER_CLASS999_DEPTH000_RANGE000TO999_ATPORTOTHER= 5000 # bonus for Warriors POWER_CLASS000_DEPTH000_RANGE000TO015_ATPORTOTHER= 50000 POWER_CLASS999_DEPTH000_RANGE000TO010_ATPORTOTHER= 1000 EACH POWER_CLASS999_DEPTH000_RANGE010TO999_ATPORTOTHER= 61000 # High Level Spell Books POWER_CLASS001_DEPTH000_RANGE001TO999_ITEM379= 300000 POWER_CLASS003_DEPTH000_RANGE001TO999_ITEM379= 300000 POWER_CLASS004_DEPTH000_RANGE001TO999_ITEM379= 300000 POWER_CLASS002_DEPTH000_RANGE001TO999_ITEM384= 300000 POWER_CLASS005_DEPTH000_RANGE001TO999_ITEM384= 300000 POWER_CLASS001_DEPTH000_RANGE001TO999_ITEM380= 300000 POWER_CLASS003_DEPTH000_RANGE001TO999_ITEM380= 300000 POWER_CLASS004_DEPTH000_RANGE001TO999_ITEM380= 300000 POWER_CLASS002_DEPTH000_RANGE001TO999_ITEM385= 300000 POWER_CLASS005_DEPTH000_RANGE001TO999_ITEM385= 300000 POWER_CLASS001_DEPTH000_RANGE001TO999_ITEM381= 300000 POWER_CLASS003_DEPTH000_RANGE001TO999_ITEM381= 300000 POWER_CLASS004_DEPTH000_RANGE001TO999_ITEM381= 300000 POWER_CLASS002_DEPTH000_RANGE001TO999_ITEM386= 300000 POWER_CLASS005_DEPTH000_RANGE001TO999_ITEM386= 300000 POWER_CLASS001_DEPTH000_RANGE001TO999_ITEM382= 300000 POWER_CLASS003_DEPTH000_RANGE001TO999_ITEM382= 300000 POWER_CLASS004_DEPTH000_RANGE001TO999_ITEM382= 300000 POWER_CLASS002_DEPTH000_RANGE001TO999_ITEM387= 300000 POWER_CLASS005_DEPTH000_RANGE001TO999_ITEM387= 300000 POWER_CLASS001_DEPTH000_RANGE001TO999_ITEM383= 300000 POWER_CLASS003_DEPTH000_RANGE001TO999_ITEM383= 300000 POWER_CLASS004_DEPTH000_RANGE001TO999_ITEM383= 300000 POWER_CLASS002_DEPTH000_RANGE001TO999_ITEM388= 300000 POWER_CLASS005_DEPTH000_RANGE001TO999_ITEM388= 300000 angband-3.5.1/src/borg/borg7.c0000644000175000017500000042207712456456606015360 0ustar chriscchrisc/* File: borg7.c */ /* Purpose: High level functions for the Borg -BEN- */ #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #include "borg1.h" #include "borg2.h" #include "borg3.h" #include "borg4.h" #include "borg5.h" #include "borg6.h" #include "borg7.h" /* * This file handles various high level inventory related goals. * * Problems: * Use "time stamps" (and not "random" checks) for several routines, * including "kill junk" and "wear stuff", and maybe even "free space". * But be careful with the "free space" routine, wear stuff first. * Make sure nothing is "destroyed" if we do not do them every turn. * Consider some special routines in stores (and in the home). * * Hack -- We should perhaps consider wearing "harmless" items into empty * slots when in the dungeon, to allow rings/amulets to be brought back up * to town to be sold. * * We should take account of possible combinations of equipment. This may * be a potentially expensive computation, but could be done occasionally. * It is important to use a "state-less" formula to allow the exchange to * be spread over multiple turns. * * Hack -- We should attempt to only collect non-discounted items, at least * for the "expensive" slots, such as books, since we do not want to lose * value due to stacking. We seem to sell the non-discounted items first, * and to buy the discounted items first, since they are cheap. Oh well, * we may just be stuck with using discounted books. Unless we actually * do correct "combining" in the simulations, and reward free slots. Ick! * * XXX XXX XXX We really need a better "twitchy" function. * * XXX XXX XXX We need a better "flee this level" function * * XXX XXX XXX We need to stockpile possible useful items at home. * * XXX XXX XXX Perhaps we could simply maintain a list of abilities * that we might need at some point, such as the ability to identify, and * simply allow the Borg to "sell" items to the home which satisfy this * desire for "abilities". * * XXX XXX XXX Also, we should probably attempt to track the "best" item * in the home for each equipment slot, using some form of heuristic, and * reward that item based on its power, so that the Borg would always * have a "backup" item in case of disenchantment. * * XXX XXX XXX Also, we could reward equipment based on possible enchantment, * up to the maximal amount available in the home, which would induce item * switching when the item could be enchanted sufficiently. * * Fleeing from fast spell-casters is probably not a very smart idea, nor is * fleeing from fast monsters, nor is attempting to clear a room full of fast * moving breeding monsters, such as lice. */ /* * Hack -- importance of the various "level feelings" * Try to explore the level for at least this many turns */ static s16b value_feeling[] = { 500, 8000, 8000, 6000, 4000, 2000, 1000, 800, 600, 400, 200, 0 }; /** * Work out if it's worth using ID on an item. Also used in other places * as a general litmus test for whether an item is worth keeping hold of * while it's not ID'd. */ bool borg_item_worth_id(const borg_item *item) { /* Never ID average stuff */ if (strstr(item->note, "average")) return FALSE; /** Some stuff should always be ID'd... **/ switch (item->tval) { case TV_BOW: case TV_SHOT: case TV_ARROW: case TV_BOLT: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: /* Don't bother IDing unidentified items until they are pseudo'd */ if (!item->ident) return FALSE; } /* Not worth IDing magical items if we have better ego/artifact stuff */ if (strstr(item->note, "magical")) { int slot; borg_item *inven_item; /* Obtain the slot of the suspect item */ slot = borg_wield_slot(item); if (slot < 0) return FALSE; /* Obtain my equipped item in the slot */ inven_item = &borg_items[slot]; if (inven_item->name2 || inven_item->name1) return FALSE; } return TRUE; } /* * Use things in a useful, but non-essential, manner */ bool borg_use_things(void) { int i; /* Quaff experience restoration potion */ if (borg_skill[BI_ISFIXEXP] && (borg_prayer(6,4) || borg_activate_artifact(EF_RESTORE_LIFE) || borg_quaff_potion(SV_POTION_RESTORE_EXP))) { return (TRUE); } /* just drink the stat gains, at this dlevel we wont need cash */ if ( borg_quaff_potion(SV_POTION_INC_STR) || borg_quaff_potion(SV_POTION_INC_INT) || borg_quaff_potion(SV_POTION_INC_WIS) || borg_quaff_potion(SV_POTION_INC_DEX) || borg_quaff_potion(SV_POTION_INC_CON)) { return (TRUE); } /* Quaff potions of "restore" stat if needed */ if ( (borg_skill[BI_ISFIXSTR] && (borg_quaff_potion(SV_POTION_RES_STR) || borg_quaff_potion(SV_POTION_INC_STR) || borg_eat_food(SV_FOOD_PURGING)|| borg_eat_food(SV_FOOD_RESTORING))) || (borg_skill[BI_ISFIXINT] && (borg_quaff_potion(SV_POTION_RES_INT) || borg_quaff_potion(SV_POTION_INC_INT) || borg_eat_food(SV_FOOD_RESTORING))) || (borg_skill[BI_ISFIXWIS] && (borg_quaff_potion(SV_POTION_RES_WIS) || borg_quaff_potion(SV_POTION_INC_WIS) || borg_eat_food(SV_FOOD_RESTORING))) || (borg_skill[BI_ISFIXDEX] && (borg_quaff_potion(SV_POTION_RES_DEX) || borg_quaff_potion(SV_POTION_INC_DEX) || borg_eat_food(SV_FOOD_RESTORING))) || (borg_skill[BI_ISFIXCON] && (borg_quaff_potion(SV_POTION_RES_CON) || borg_quaff_potion(SV_POTION_INC_CON) || borg_eat_food(SV_FOOD_PURGING) || borg_eat_food(SV_FOOD_RESTORING)))) { return (TRUE); } /* Use some items right away */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Process "force" items */ switch (item->tval) { case TV_POTION: { /* Check the scroll */ switch (item->sval) { case SV_POTION_ENLIGHTENMENT: /* Never quaff these in town */ if (!borg_skill[BI_CDEPTH]) break; case SV_POTION_INC_ALL: /* Try quaffing the potion */ if (borg_quaff_potion(item->sval)) return (TRUE); } break; } case TV_SCROLL: { /* Hack -- check Blind/Confused */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED]) break; /* XXX XXX XXX Dark */ /* Check the scroll */ switch (item->sval) { case SV_SCROLL_MAPPING: case SV_SCROLL_DETECT_TRAP: case SV_SCROLL_DETECT_DOOR: case SV_SCROLL_ACQUIREMENT: case SV_SCROLL_STAR_ACQUIREMENT: { /* Never read these in town */ if (!borg_skill[BI_CDEPTH]) break; /* Try reading the scroll */ if (borg_read_scroll(item->sval)) return (TRUE); break; } } break; } } } /* Eat food */ if (borg_skill[BI_ISHUNGRY]) { /* Attempt to satisfy hunger */ if (borg_spell(2, 0) || borg_prayer(1, 5)|| borg_eat_food(SV_FOOD_SLIME_MOLD)|| borg_eat_food(SV_FOOD_WAYBREAD) || borg_eat_food(SV_FOOD_RATION)) { return (TRUE); } } /* Nothing to do */ return (FALSE); } /* * Check to see if the surrounding dungeon should be illuminated, and if * it should, do it. * * Always case light when we have no torch. * * This is when resting to heal. I don't want him teleporting into a room, * resting to heal while there is a dragon sitting in a dark corner waiting * to breathe on him. * * Returns TRUE if it did something, FALSE otherwise */ bool borg_check_LIGHT_only(void) { /* Never in town, when blind or when hallucinating */ if (!borg_skill[BI_CDEPTH]) return (FALSE); if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISIMAGE]) return (FALSE); /** Use wizard light sometimes **/ if (!when_wizard_LIGHT || (borg_t - when_wizard_LIGHT >= 1000)) { if (borg_activate_artifact(EF_CLAIRVOYANCE) || borg_prayer_fail(5, 4, 40)) { borg_note("# Wizard lighting the dungeon"); /* borg_react("SELF:wizard lite", "SELF:wizard lite"); */ when_wizard_LIGHT = borg_t; return TRUE; } } /** Work out if there's any reason to light */ /* Don't bother because we only just did it */ if (when_call_LIGHT != 0 && (borg_t - when_call_LIGHT) < 7) return FALSE; if (borg_skill[BI_CURLITE] == 1) { int i; int corners = 0; /* Scan diagonal neighbors. * * 4 corners 3 corners 2 corners 1 corner 0 corners * ### ##. #.. ##. #.. .#. .#. ... .#. * .@. .@. .@. .@. .@. .@. #@# .@. .@. * ### ###  ### ##. #.. ##. .#. ... .#. * * There's actually no way to tell which are rooms and which are * corridors from diagonals except 4 (always a corridor) and * 0 (always a room). This is why we only use it for radius 1 light. */ for (i = 4; i < 8; i++) { borg_grid *ag; /* Get location */ int x = c_x + ddx_ddd[i]; int y = c_y + ddy_ddd[i]; /* Bounds check */ if (!cave_in_bounds_fully(cave, y, x)) continue; /* Get grid */ ag = &borg_grids[y][x]; /* Location must be known */ if (ag->feat == FEAT_NONE) corners++; /* Location must be a wall/door */ if (!borg_cave_floor_grid(ag)) corners++; } /* This is quite an arbitrary cutoff */ if (corners > 2) return FALSE; } else if (borg_skill[BI_CURLITE] > 1) { int x, y; int floors = 0; /* * Scan the surrounding 5x5 area for unlit tiles. * * Radius two light misses out the four corners but otherwise illumates * a 5x5 grid, which is 21 grids illumated incl player. * * ... * ..... * ..@.. * ..... * ... */ for (y = c_y - 2; y <= c_y + 2; y++) { for (x = c_x - 2; x <= c_x + 2; x++) { borg_grid *ag; /* Bounds check */ if (!cave_in_bounds_fully(cave, y, x)) continue; /* Get grid */ ag = &borg_grids[y][x]; /* Must be a floor grid lit by torchlight, not by magic */ if (borg_cave_floor_grid(ag) && (ag->info & BORG_LIGHT) && !(cave->info[y][x] & CAVE_GLOW)) { floors++; } } } /* Don't bother unless there are enough unlit floors */ /* 11 is the empirical cutoff point for sensible behaviour here */ if (floors < 11) return FALSE; } /* Light it up! */ if (borg_activate_artifact(EF_ILLUMINATION) || borg_zap_rod(SV_ROD_ILLUMINATION) || borg_use_staff(SV_STAFF_LIGHT) || borg_read_scroll(SV_SCROLL_LIGHT) || borg_spell_fail(0, 3, 40) || borg_prayer_fail(0, 4, 40)) { borg_note("# Illuminating the dungeon"); borg_react("SELF:lite", "SELF:lite"); when_call_LIGHT = borg_t; return TRUE; } return FALSE; } /* * Refuel, call lite, detect traps/doors/walls/evil, etc * * Note that we refuel whenever our lite starts to get low. * * Note that we detect traps/doors/walls/evil at least once in each * panel, as soon as possible after entering a new panel. * * We use the special "SELF" messages to "borg_react()" to delay the * processing of "detection" and "call lite" until we know if it has * worked or not. */ bool borg_check_LIGHT(void) { int q_x, q_y; bool do_trap; bool do_door; bool do_wall; bool do_evil; /* Never in town when mature (scary guy)*/ if (borg_skill[BI_MAXCLEVEL] > 10 && !borg_skill[BI_CDEPTH]) return (FALSE); /* Never when comprimised, save your mana */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED] || borg_skill[BI_ISIMAGE] || borg_skill[BI_ISPOISONED] || borg_skill[BI_ISCUT] || borg_skill[BI_ISWEAK]) return (FALSE); /* XXX XXX XXX Dark */ /* Extract the panel */ q_x = w_x / PANEL_WID; q_y = w_y / PANEL_HGT; /* Start */ do_trap = FALSE; /* Determine if we need to detect traps */ if (!borg_detect_trap[q_y+0][q_x+0]) do_trap = TRUE; if (!borg_detect_trap[q_y+0][q_x+1]) do_trap = TRUE; if (!borg_detect_trap[q_y+1][q_x+0]) do_trap = TRUE; if (!borg_detect_trap[q_y+1][q_x+1]) do_trap = TRUE; /* Hack -- check traps every few turns anyway */ /* if (!when_detect_traps || (borg_t - when_detect_traps >= 183)) do_trap = TRUE; */ /* Start */ do_door = FALSE; /* Determine if we need to detect doors */ if (!borg_detect_door[q_y+0][q_x+0]) do_door = TRUE; if (!borg_detect_door[q_y+0][q_x+1]) do_door = TRUE; if (!borg_detect_door[q_y+1][q_x+0]) do_door = TRUE; if (!borg_detect_door[q_y+1][q_x+1]) do_door = TRUE; /* Hack -- check doors every few turns anyway */ /* if (!when_detect_doors || (borg_t - when_detect_doors >= 731)) do_door = TRUE; */ /* Start */ do_wall = FALSE; /* Determine if we need to detect walls */ if (!borg_detect_wall[q_y+0][q_x+0]) do_wall = TRUE; if (!borg_detect_wall[q_y+0][q_x+1]) do_wall = TRUE; if (!borg_detect_wall[q_y+1][q_x+0]) do_wall = TRUE; if (!borg_detect_wall[q_y+1][q_x+1]) do_wall = TRUE; /* Hack -- check walls every few turns anyway */ /* if (!when_detect_walls || (borg_t - when_detect_walls >= 937)) do_wall = TRUE; */ /* Start */ do_evil = FALSE; /* Determine if we need to detect evil */ if (!borg_detect_evil[q_y+0][q_x+0]) do_evil = TRUE; if (!borg_detect_evil[q_y+0][q_x+1]) do_evil = TRUE; if (!borg_detect_evil[q_y+1][q_x+0]) do_evil = TRUE; if (!borg_detect_evil[q_y+1][q_x+1]) do_evil = TRUE; /* Hack -- check evil every few turns anyway- more fq if low level */ /* if (!when_detect_evil || (borg_t - when_detect_evil >= 183 - (80 - borg_skill[BI_MAXCLEVEL]))) do_evil = TRUE; */ /* Really low level */ /* if (borg_skill[BI_CLEVEL] <= 3 && (!when_detect_evil || (borg_t - when_detect_evil >= 50))) do_evil = TRUE; */ /* Not too frequent in town */ /* if (borg_skill[BI_CDEPTH] == 0 && (!when_detect_evil || (borg_t - when_detect_evil >= 250))) do_evil = TRUE; */ /* Dont bother if I have ESP */ if (borg_skill[BI_ESP]) do_evil = FALSE; /* Only look for monsters in town, not walls, etc (scary guy)*/ if (!borg_skill[BI_CDEPTH]) { do_trap = FALSE; do_door = FALSE; do_wall = FALSE; } /*** Do Things ***/ /* Hack -- find traps and doors and evil*/ if ((do_trap || do_door || do_evil) && ((!when_detect_traps || (borg_t - when_detect_traps >= 5)) || (!when_detect_evil || (borg_t - when_detect_evil >= 5)) || (!when_detect_doors || (borg_t - when_detect_doors >= 5))) && borg_skill[BI_CDEPTH]) /* Never in town */ { /* Check for traps and doors and evil*/ if (borg_activate_artifact(EF_DETECT_ALL) || borg_zap_rod(SV_ROD_DETECTION) || borg_prayer_fail(5, 1, 40)) { borg_note("# Checking for traps, doors, and evil."); borg_react("SELF:TDE", "SELF:TDE"); when_detect_traps = borg_t; when_detect_doors = borg_t; when_detect_evil = borg_t; return (TRUE); } } /* Hack -- find evil */ if (do_evil && (!when_detect_evil || (borg_t - when_detect_evil >= 20))) { /* Check for evil */ if (borg_prayer_fail(0, 0, 40) || borg_spell_fail(0, 1, 40)) { borg_note("# Checking for monsters."); borg_react("SELF:evil", "SELF:evil"); when_detect_evil = borg_t; return (TRUE); } } /* Hack -- find traps and doors (and stairs) */ if ((do_trap || do_door) && ((!when_detect_traps || (borg_t - when_detect_traps >= 5)) || (!when_detect_doors || (borg_t - when_detect_doors >= 5))) && borg_skill[BI_CDEPTH]) /* Never in town */ { /* Check for traps and doors */ if (borg_activate_artifact(EF_DETECT_ALL) || borg_spell_fail(0, 6, 40) || borg_prayer_fail(0, 5, 40)) { borg_note("# Checking for traps, doors & stairs."); borg_react("SELF:both", "SELF:both"); when_detect_traps = borg_t; when_detect_doors = borg_t; return (TRUE); } } /* Hack -- find traps */ if (do_trap && (!when_detect_traps || (borg_t - when_detect_traps >= 7)) && borg_skill[BI_CDEPTH]) /* Never in town */ { /* Check for traps */ if (borg_activate_artifact(EF_DETECT_TRAP) || borg_read_scroll(SV_SCROLL_DETECT_TRAP) || borg_zap_rod(SV_ROD_DETECT_TRAP) || borg_prayer_fail(0, 5, 40)) { borg_note("# Checking for traps."); borg_react("SELF:trap", "SELF:trap"); when_detect_traps = borg_t; return (TRUE); } } /* Hack -- find doors */ if (do_door && (!when_detect_doors || (borg_t - when_detect_doors >= 9)) && borg_skill[BI_CDEPTH]) /* Never in town */ { /* Check for traps */ if (borg_activate_artifact(EF_DETECT_ALL) || borg_read_scroll(SV_SCROLL_DETECT_DOOR) || borg_zap_rod(SV_ROD_DETECT_DOOR) || borg_prayer_fail(0, 5, 40)) { borg_note("# Checking for doors."); borg_react("SELF:door", "SELF:door"); when_detect_doors = borg_t; return (TRUE); } } /* Hack -- find walls */ if (do_wall && (!when_detect_walls || (borg_t - when_detect_walls >= 15)) && borg_skill[BI_CDEPTH]) /* Never in town */ { /* Check for walls */ if (borg_activate_artifact(EF_MAPPING) || borg_read_scroll(SV_SCROLL_MAPPING) || borg_use_staff(SV_STAFF_MAPPING) || borg_zap_rod(SV_ROD_MAPPING) || borg_prayer(2, 6)) { borg_note("# Checking for walls."); borg_react("SELF:wall", "SELF:wall"); when_detect_walls = borg_t; return (TRUE); } } /* Do the actual illumination bit */ return borg_check_LIGHT_only(); } /* * Enchant armor, not including my swap armour */ static bool borg_enchant_to_a(void) { int i, b_i = -1; int a, b_a = 99; /* Nothing to enchant */ if (!my_need_enchant_to_a) return (FALSE); /* Need "enchantment" ability */ if ((!amt_enchant_to_a) && (!amt_enchant_armor)) return (FALSE); /* Look for armor that needs enchanting */ for (i = INVEN_BODY; i < INVEN_TOTAL; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip non-identified items */ if (!item->ident) continue; /* Obtain the bonus */ a = item->to_a; /* Skip "boring" items */ if (borg_spell_okay_fail(7, 2, 65) || borg_prayer_okay_fail(7, 4, 65) || amt_enchant_armor >=1) { if (a >= borg_enchant_limit) continue; } else { if (a >= 8) continue; } /* Find the least enchanted item */ if ((b_i >= 0) && (b_a < a)) continue; /* Save the info */ b_i = i; b_a = a; } /* Nothing */ if (b_i < 0) return (FALSE); /* Enchant it */ if (borg_read_scroll(SV_SCROLL_STAR_ENCHANT_ARMOR) || borg_read_scroll(SV_SCROLL_ENCHANT_ARMOR) || borg_spell_fail(7, 2, 65) || borg_prayer_fail(7, 4, 65)) { /* Choose from equipment */ if (b_i >= INVEN_WIELD) { borg_keypress('/'); /* Choose that item */ borg_keypress(I2A(b_i - INVEN_WIELD)); } /* Success */ return (TRUE); } /* Nothing to do */ return (FALSE); } /* * Enchant weapons to hit */ static bool borg_enchant_to_h(void) { int i, b_i = -1; int a, s_a, b_a = 99; /* Nothing to enchant */ if (!my_need_enchant_to_h && !enchant_weapon_swap_to_h) return (FALSE); /* Need "enchantment" ability */ if ( (!amt_enchant_to_h) && (!amt_enchant_weapon) ) return (FALSE); /* Look for a weapon that needs enchanting */ for (i = INVEN_WIELD; i <= INVEN_BOW; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip non-identified items */ if (!item->ident) continue; /* Skip my swap digger */ if (item->tval == TV_DIGGING) continue; /* Obtain the bonus */ a = item->to_h; /* Skip "boring" items */ if (borg_prayer_okay_fail(7, 3, 65) || borg_spell_okay_fail(7, 3, 65) || amt_enchant_weapon >= 1 ) { if (a >= borg_enchant_limit) continue; } else { if (a >= 8) continue; } /* Most classes store the enchants until they get * a 3x shooter (like a long bow). * Generally, we do not want the x2 shooter enchanted, * since it wastes scrolls. But if the sword is at +5 * and the sling at +2, then the sling will be selected * because its enchantment is lower. The borg tries to * enchant the least enchanted item. This will make sure * the x2 shooter is skipped and the sword is enchanted, * if needed. If the sword is at +9,+9, and the sling at * +0,+0 and the borg has some enchant scrolls, he should * store them instead of wasting them on the sling. */ if (i == INVEN_BOW && /* bow */ my_ammo_power < 3 && /* 3x shooter */ (!item->name1 && !item->name2)) /* Not artifact or ego */ continue; /* Find the least enchanted item */ if ((b_i >= 0) && (b_a < a)) continue; /* Save the info */ b_i = i; b_a = a; } if (weapon_swap > 1) { for (i=weapon_swap; i <= weapon_swap; i++) { borg_item *item = &borg_items[weapon_swap]; /* Obtain the bonus */ s_a = item->to_h; /* Skip my swap digger */ if (item->tval == TV_DIGGING) continue; /* Skip "boring" items */ if (borg_prayer_okay_fail(7, 3, 65) || borg_spell_okay_fail(7, 3, 65) || amt_enchant_weapon >= 1 ) { if (s_a >= borg_enchant_limit) continue; } else { if (s_a >= 8) continue; } /* Find the least enchanted item */ if ((b_i >= 0) && (b_a < s_a)) continue; /* Save the info */ b_i = weapon_swap; b_a = s_a; } } /* Nothing, check ammo */ if (b_i < 0) { /* look through inventory for ammo */ for (i = 0; i < QUIVER_END; i++) { borg_item *item = &borg_items[i]; /* Skip regular inventory */ if (i >= INVEN_MAX_PACK && i < QUIVER_START) continue; /* Only enchant ammo if we have a good shooter, * otherwise, store the enchants in the home. */ if (my_ammo_power < 3 || (!borg_items[INVEN_BOW].name1 && !borg_items[INVEN_BOW].name2)) continue; /* Only enchant if qty >= 5 */ if (item->iqty < 5) continue; /* Skip non-identified items */ if (!item->ident) continue; /* Make sure it is the right type if missile */ if (item->tval != my_ammo_tval) continue; /* Obtain the bonus */ a = item->to_h; /* Skip items that are already enchanted */ if (borg_prayer_okay_fail(7, 3, 65) || borg_spell_okay_fail(7, 3, 65) || amt_enchant_weapon >= 1 ) { if (a >= 10) continue; } else { if (a >= 8) continue; } /* Find the least enchanted item */ if ((b_i >= 0) && (b_a < a)) continue; /* Save the info */ b_i = i; b_a = a; } } /* Nothing */ if (b_i < 0) return (FALSE); /* Enchant it */ if (borg_read_scroll(SV_SCROLL_STAR_ENCHANT_ARMOR) || borg_read_scroll(SV_SCROLL_ENCHANT_ARMOR) || borg_prayer_fail(7, 3, 65) || borg_spell_fail(7, 3, 65)) { /* Choose from equipment */ if (b_i >= INVEN_WIELD) { borg_keypress('/'); /* Choose that item */ borg_keypress(I2A(b_i - INVEN_WIELD)); } else /* choose the swap or ammo */ { borg_keypress(I2A(b_i)); } /* Success */ return (TRUE); } /* Nothing to do */ return (FALSE); } /* * Enchant weapons to dam */ static bool borg_enchant_to_d(void) { int i, b_i = -1; int a, s_a, b_a = 99; /* Nothing to enchant */ if (!my_need_enchant_to_d && !enchant_weapon_swap_to_d) return (FALSE); /* Need "enchantment" ability */ if ( (!amt_enchant_to_d) && (!amt_enchant_weapon) ) return (FALSE); /* Look for a weapon that needs enchanting */ for (i = INVEN_WIELD; i <= INVEN_BOW; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip non-identified items */ if (!item->ident) continue; /* Skip my swap digger */ if (item->tval == TV_DIGGING) continue; /* Obtain the bonus */ a = item->to_d; /* Skip "boring" items */ if (borg_prayer_okay_fail(7, 3, 65) || borg_spell_okay_fail(7, 3, 65) || amt_enchant_weapon >= 1 ) { if (a >= borg_enchant_limit) continue; } else { if (a >= 8) continue; } /* Most classes store the enchants until they get * a 3x shooter (like a long bow). * Generally, we do not want the x2 shooter enchanted, * since it wastes scrolls. But if the sword is at +5 * and the sling at +2, then the sling will be selected * because its enchantment is lower. The borg tries to * enchant the least enchanted item. This will make sure * the x2 shooter is skipped and the sword is enchanted, * if needed. If the sword is at +9,+9, and the sling at * +0,+0 and the borg has some enchant scrolls, he should * store them instead of wasting them on the sling. */ if (i == INVEN_BOW && /* bow */ my_ammo_power < 3 && /* 3x shooter */ (!item->name1 && !item->name2)) /* Not artifact or ego */ continue; /* Find the least enchanted item */ if ((b_i >= 0) && (b_a < a)) continue; /* Save the info */ b_i = i; b_a = a; } if (weapon_swap > 1) { for (i = weapon_swap; i <= weapon_swap; i++) { borg_item *item = &borg_items[weapon_swap]; /* Skip non-identified items */ if (!item->ident) continue; /* Skip my swap digger */ if (item->tval == TV_DIGGING) continue; /* Obtain the bonus */ s_a = item->to_d; /* Skip "boring" items */ if (borg_prayer_okay_fail(7, 3, 65) || borg_spell_okay_fail(7, 3, 65) || amt_enchant_weapon >= 1 ) { if (s_a >= borg_enchant_limit) continue; } else { if (s_a >= 8) continue; } /* Find the least enchanted item */ if ((b_i >= 0) && (b_a < s_a)) continue; /* Save the info */ b_i = weapon_swap; b_a = s_a; } } /* Nothing, check ammo */ if (b_i < 0) { /* look through inventory for ammo */ for (i = 0; i < QUIVER_END; i++) { borg_item *item = &borg_items[i]; /* Skip regular inventory */ if (i >= INVEN_MAX_PACK && i < QUIVER_START) continue; /* Only enchant ammo if we have a good shooter, * otherwise, store the enchants in the home. */ if (my_ammo_power < 3 || (!borg_items[INVEN_BOW].name1 && !borg_items[INVEN_BOW].name2)) continue; /* Only enchant ammo if we have a good shooter, * otherwise, store the enchants in the home. */ if (my_ammo_power < 3) continue; /* Only enchant if qty >= 5 */ if (item->iqty < 5) continue; /* Skip non-identified items */ if (!item->ident) continue; /* Make sure it is the right type if missile */ if (item->tval != my_ammo_tval) continue; /* Obtain the bonus */ a = item->to_d; /* Skip items that are already enchanted */ if (borg_prayer_okay_fail(7, 3, 65) || borg_spell_okay_fail(7, 3, 65) || amt_enchant_weapon >= 1 ) { if (a >= 10) continue; } else { if (a >= 8) continue; } /* Find the least enchanted item */ if ((b_i >= 0) && (b_a < a)) continue; /* Save the info */ b_i = i; b_a = a; } } /* Nothing */ if (b_i < 0) return (FALSE); /* Enchant it */ if (borg_read_scroll(SV_SCROLL_STAR_ENCHANT_WEAPON) || borg_read_scroll(SV_SCROLL_ENCHANT_WEAPON_TO_DAM) || borg_prayer_fail(7, 3, 65) || borg_spell_fail(7, 3, 65)) { /* Choose from equipment */ if (b_i >= INVEN_WIELD) { borg_keypress('/'); /* Choose that item */ borg_keypress(I2A(b_i - INVEN_WIELD)); } else /* choose the swap or ammo */ { borg_keypress(I2A(b_i)); } /* Success */ return (TRUE); } /* Nothing to do */ return (FALSE); } /* * Brand Bolts */ static bool borg_brand_weapon(void) { int i, b_i = -1; int a, b_a = 0; /* Nothing to brand */ if (!my_need_brand_weapon) return (FALSE); /* Need "brand" ability */ if (!amt_brand_weapon) return (FALSE); /* look through inventory for ammo */ for (i = QUIVER_START; i < QUIVER_END; i++) { borg_item *item = &borg_items[i]; /* Only enchant if qty >= 5 */ if (item->iqty < 5) continue; /* Skip non-identified items */ if (!item->ident) continue; /* Make sure it is the right type if missile */ if (item->tval != my_ammo_tval) continue; /* Obtain the bonus */ a = item->to_h; /* Skip branded items */ if (item->name2) continue; /* Find the most enchanted item */ if ((b_i >= 0) && (b_a > a)) continue; /* Save the info */ b_i = i; b_a = a; } /* Nothing to Brand */ if (b_i == -1) return (FALSE); /* Enchant it */ if (borg_activate_artifact(EF_FIREBRAND) || borg_spell_fail(7, 5, 65)) { /* 291 would like a location of the brand */ /* choose the or ammo */ { borg_keypress('/'); borg_keypress(I2A(b_i - INVEN_WIELD));; } /* Success */ return (TRUE); } /* Nothing to do */ return (FALSE); } /* * Remove Curse */ static bool borg_decurse_armour(void) { /* Nothing to decurse */ if ((borg_uses_swaps && decurse_armour_swap == -1) && !borg_wearing_cursed) return (FALSE); /* Ability for heavy curse */ if (borg_uses_swaps && decurse_armour_swap == 1) { if (-1 == borg_slot(TV_SCROLL,SV_SCROLL_STAR_REMOVE_CURSE) && !borg_prayer_okay_fail(7,2,40)) { return (FALSE); } else if (borg_uses_swaps && decurse_armour_swap ==1) { /* First wear the item */ borg_note("# Decursing armor."); borg_keypress('w'); borg_keypress(I2A(armour_swap)); /* ooops it feels deathly cold */ borg_keypress(' '); } /* remove the curse */ if (borg_read_scroll(SV_SCROLL_STAR_REMOVE_CURSE) || borg_prayer(7,2) ) { /* Shekockazol! */ borg_wearing_cursed = FALSE; return (TRUE); } } /* Ability for light curse */ if ((borg_uses_swaps && decurse_armour_swap == 0) || borg_wearing_cursed) { if (-1 == borg_slot(TV_SCROLL,SV_SCROLL_REMOVE_CURSE) && (-1 == borg_slot(TV_STAFF,SV_STAFF_REMOVE_CURSE) && -1 == borg_items[borg_slot(TV_STAFF, SV_STAFF_REMOVE_CURSE)].pval) && !borg_prayer_okay_fail(1,6,40) ) { return (FALSE); } if (borg_wearing_cursed) { /* no need to wear it first */ } else { /* First wear the item */ borg_note("# Decursing armor."); borg_keypress('w'); borg_keypress(I2A(armour_swap)); /* ooops it feels deathly cold */ borg_keypress(' '); } /* remove the curse */ if (borg_read_scroll(SV_SCROLL_REMOVE_CURSE) || borg_use_staff(SV_STAFF_REMOVE_CURSE)|| borg_prayer(1,6) ) { /* Shekockazol! */ borg_wearing_cursed = FALSE; return (TRUE); } } /* Nothing to do */ return (FALSE); } /* * Remove Curse * */ static bool borg_decurse_weapon(void) { /* Nothing to decurse */ if (borg_uses_swaps && decurse_weapon_swap == -1) return (FALSE); /* Ability for heavy curse */ if (borg_uses_swaps && decurse_weapon_swap == 1) { if (-1 == borg_slot(TV_SCROLL,SV_SCROLL_STAR_REMOVE_CURSE) && !borg_prayer_okay_fail(7,2,40)) { return (FALSE); } /* First wear the item */ borg_note("# Decursing weapon."); borg_keypress('w'); borg_keypress(I2A(weapon_swap)); /* ooops it feels deathly cold */ borg_keypress(' '); /* remove the curse */ if (borg_read_scroll(SV_SCROLL_STAR_REMOVE_CURSE) || borg_prayer(7,2) ) { /* Shekockazol! */ return (TRUE); } } /* Ability for light curse */ if (borg_uses_swaps && decurse_weapon_swap == 0) { if (-1 == borg_slot(TV_SCROLL,SV_SCROLL_REMOVE_CURSE) && (-1 == borg_slot(TV_STAFF,SV_STAFF_REMOVE_CURSE) && -1 == borg_items[borg_slot(TV_STAFF, SV_STAFF_REMOVE_CURSE)].pval) && !borg_prayer_okay_fail(1,6,40) ) { return (FALSE); } /* First wear the item */ borg_note("# Decursing weapon."); borg_keypress('w'); borg_keypress(I2A(weapon_swap)); /* ooops it feels deathly cold */ borg_keypress(' '); /* remove the curse */ if (borg_read_scroll(SV_SCROLL_REMOVE_CURSE) || borg_use_staff(SV_STAFF_REMOVE_CURSE)|| borg_prayer(1,6) ) { /* Shekockazol! */ return (TRUE); } } /* Nothing to do */ return (FALSE); } /* * Enchant things */ bool borg_enchanting(void) { /* Forbid blind/confused */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED]) return (FALSE); /* Forbid if been sitting on level forever */ /* Just come back and finish the job later */ if ((borg_t - borg_began > 5500 && borg_skill[BI_CDEPTH] >= 1) || (borg_t-borg_began > 3501 && borg_skill[BI_CDEPTH] == 0)) return (FALSE); /* Remove Curses */ if (borg_decurse_armour()) return (TRUE); if (borg_decurse_weapon()) return (TRUE); /* Only in town */ if (borg_skill[BI_CDEPTH]) return (FALSE); /* Enchant things */ if (borg_brand_weapon()) return (TRUE); if (borg_enchant_to_h()) return (TRUE); if (borg_enchant_to_d()) return (TRUE); if (borg_enchant_to_a()) return (TRUE); /* Nope */ return (FALSE); } /* * Recharge things * * XXX XXX XXX Prioritize available items */ bool borg_recharging(void) { int i = -1; bool charge = FALSE; /* Forbid blind/confused */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED]) return (FALSE); /* XXX XXX XXX Dark */ /* Look for an item to recharge */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip non-identified items */ if (!item->ident && !(strstr(item->note, "empty"))) continue; /* assume we can't charge it. */ charge = FALSE; /* Wands with no charges can be charged */ if ((item->tval == TV_WAND) && (item->pval <= 1)) charge = TRUE; /* recharge staves sometimes */ if (item->tval == TV_STAFF) { /* Allow staves to be recharged at 2 charges if * the borg has the big recharge spell. And its not a *Dest* */ if ((item->pval < 2) && (borg_spell_okay_fail(7, 4, 96) || borg_spell_okay_fail(2, 1, 96)) && item->sval < SV_STAFF_POWER) charge = TRUE; /* recharge any staff at 0 charges */ if (item->pval <= 1) charge = TRUE; /* Staves of teleport get recharged at 2 charges in town */ if ((item->sval == SV_STAFF_TELEPORTATION) && (item->pval < 3) && !borg_skill[BI_CDEPTH]) charge = TRUE; /* They stack. If quantity is 4 and pval is 1, then there are 4 charges. */ if ((item->iqty + item->pval >= 4) && item->pval >= 1) charge = FALSE; } /* get the next item if we are not to charge this one */ if (!charge) continue; /* Attempt to recharge */ if (borg_spell_fail(7, 4, 96) || borg_read_scroll(SV_SCROLL_RECHARGING) || borg_spell_fail(2, 1, 96) || borg_prayer_fail(7, 1, 96) || borg_activate_artifact(EF_RECHARGE)) { /* Message */ borg_note(format("Recharging %s with current charge of %d", item->desc, item->pval)); /* Recharge the item */ borg_keypress(I2A(i)); /* Remove the {empty} if present */ if (strstr(item->note, "empty")) borg_send_deinscribe(i); /* Success */ return (TRUE); } else /* if we fail once, no need to try again. */ break; } /* Nope */ return (FALSE); } /* * Attempt to consume an item as a method of destroying it. */ static bool borg_consume(int i) { borg_item *item = &borg_items[i]; /* Special destruction */ switch (item->tval) { case TV_POTION: /* Check the potion */ switch (item->sval) { case SV_POTION_SLIME_MOLD: case SV_POTION_CURE_LIGHT: case SV_POTION_CURE_SERIOUS: case SV_POTION_CURE_CRITICAL: case SV_POTION_HEALING: case SV_POTION_STAR_HEALING: case SV_POTION_LIFE: case SV_POTION_RES_STR: case SV_POTION_RES_INT: case SV_POTION_RES_WIS: case SV_POTION_RES_DEX: case SV_POTION_RES_CON: case SV_POTION_RESTORE_EXP: case SV_POTION_RESTORE_MANA: case SV_POTION_HEROISM: case SV_POTION_BERSERK_STRENGTH: case SV_POTION_RESIST_HEAT: case SV_POTION_RESIST_COLD: case SV_POTION_INFRAVISION: case SV_POTION_DETECT_INVIS: case SV_POTION_CURE_POISON: case SV_POTION_SPEED: case SV_POTION_INC_EXP: { /* Try quaffing the potion */ if (borg_quaff_potion(item->sval)) return (TRUE); } break; /* Gain one/lose one potions */ case SV_POTION_INC_STR2: { /* Maxed out no need. Don't lose another stat */ if (borg_skill[BI_CSTR] >= 118) return (FALSE); /* This class does not want to risk losing a different stat */ if (borg_class == CLASS_MAGE) return (FALSE); /* Otherwise, it should be ok */ if (borg_quaff_potion(item->sval)) return (TRUE); } break; case SV_POTION_INC_INT2: { /* Maxed out no need. Don't lose another stat */ if (borg_skill[BI_CINT] >= 118) return (FALSE); /* This class does not want to risk losing a different stat */ if (borg_class == CLASS_WARRIOR || borg_class == CLASS_PRIEST || borg_class == CLASS_PALADIN || borg_class == CLASS_ROGUE) return (FALSE); /* Otherwise, it should be ok */ if (borg_quaff_potion(item->sval)) return (TRUE); } break; case SV_POTION_INC_WIS2: { /* Maxed out no need. Don't lose another stat */ if (borg_skill[BI_CWIS] >= 118) return (FALSE); /* This class does not want to risk losing a different stat */ if (borg_class == CLASS_WARRIOR || borg_class == CLASS_MAGE || borg_class == CLASS_RANGER || borg_class == CLASS_ROGUE) return (FALSE); /* Otherwise, it should be ok */ if (borg_quaff_potion(item->sval)) return (TRUE); } break; case SV_POTION_INC_DEX2: { /* Maxed out no need. Don't lose another stat */ if (borg_skill[BI_CDEX] >= 118) return (FALSE); /* This class does not want to risk losing a different stat */ if (borg_class == CLASS_MAGE || borg_class == CLASS_PRIEST) return (FALSE); /* Otherwise, it should be ok */ if (borg_quaff_potion(item->sval)) return (TRUE); } break; case SV_POTION_INC_CON2: { /* Maxed out no need. Don't lose another stat */ if (borg_skill[BI_CCON] >= 118) return (FALSE); /* Otherwise, it should be ok */ if (borg_quaff_potion(item->sval)) return (TRUE); } break; } break; case TV_SCROLL: /* Check the scroll */ switch (item->sval) { case SV_SCROLL_REMOVE_CURSE: case SV_SCROLL_LIGHT: case SV_SCROLL_MONSTER_CONFUSION: case SV_SCROLL_STAR_REMOVE_CURSE: case SV_SCROLL_TRAP_DOOR_DESTRUCTION: case SV_SCROLL_SATISFY_HUNGER: case SV_SCROLL_DISPEL_UNDEAD: case SV_SCROLL_BLESSING: case SV_SCROLL_HOLY_CHANT: case SV_SCROLL_HOLY_PRAYER: { /* Try reading the scroll */ if (borg_read_scroll(item->sval)) return (TRUE); break; } } break; case TV_FOOD: /* Check the grub */ switch (item->sval) { case SV_FOOD_SECOND_SIGHT: case SV_FOOD_FAST_RECOVERY: case SV_FOOD_CURE_MIND: case SV_FOOD_RESTORING: case SV_FOOD_EMERGENCY: case SV_FOOD_TERROR: case SV_FOOD_STONESKIN: case SV_FOOD_DEBILITY: case SV_FOOD_SPRINTING: case SV_FOOD_PURGING: case SV_FOOD_RATION: case SV_FOOD_SLIME_MOLD: case SV_FOOD_WAYBREAD: /* Try eating the food (unless Bloated) */ if (!borg_skill[BI_ISFULL] && borg_eat_food(item->sval)) return (TRUE); } break; } /* Nope */ return (FALSE); } /* * Destroy "junk" items */ bool borg_crush_junk(void) { int i; bool fix = FALSE; s32b p; s32b value; int count; /* Hack -- no need */ if (!borg_do_crush_junk) return (FALSE); /* No crush if even slightly dangerous */ if (borg_danger(c_y,c_x,1, TRUE, FALSE) > borg_skill[BI_CURHP] / 10) return (FALSE); /* Destroy actual "junk" items */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* dont crush the swap weapon */ if (i == weapon_swap && item->iqty == 1 && item->tval != TV_FOOD) continue; if (i == armour_swap && item->tval != TV_FOOD) continue; /* Dont crush weapons if we are weilding a digger */ #if 0 if (item->tval >=TV_DIGGING && item->tval <= TV_SWORD && borg_items[INVEN_WIELD].tval == TV_DIGGING) continue; #endif /* dont crush our spell books */ if (item->tval == p_ptr->class->spell_book) continue; /* Do not crush unID'd Scrolls, sell them in town */ if (item->tval == TV_SCROLL && (!item->ident && !item->kind)) continue; /* Do not crush Boots, they could be SPEED */ if (item->tval == TV_BOOTS && !item->ident) continue; /* save the items value */ value = item->value; /* Crush Stacked Wands and Staves that are empty. * ie. 5 Staffs of Teleportation (2 charges). * Only 2 charges in 5 staves means top 3 are empty. */ if ((item->tval == TV_STAFF || item->tval == TV_WAND) && (item->ident || strstr(item->note, "empty"))) { if (item->iqty > item->pval) value = 0L; } /* Skip non "worthless" items */ if (item->tval >= TV_CHEST) { /* unknown and not worthless */ if (!item->ident && !strstr(item->note, "average") && value > 0) continue; /* skip items that are 'valuable'. This is level dependent */ /* try to make the borg junk +1,+1 dagger at level 40 */ /* if the item gives a bonus to a stat, boost its value */ if (((of_has(item->flags, OF_STR)) || (of_has(item->flags, OF_INT)) || (of_has(item->flags, OF_WIS)) || (of_has(item->flags, OF_STR)) || (of_has(item->flags, OF_CON))) && value > 0) { value += 2000L; } /* Keep some stuff */ if ( (item->tval == my_ammo_tval && value > 0) || ((item->tval == TV_POTION && item->sval == SV_POTION_RESTORE_MANA) && (borg_skill[BI_MAXSP] >= 1)) || (item->tval == TV_POTION && item->sval == SV_POTION_HEALING) || (item->tval == TV_POTION && item->sval == SV_POTION_STAR_HEALING) || (item->tval == TV_POTION && item->sval == SV_POTION_LIFE) || (item->tval == TV_POTION && item->sval == SV_POTION_SPEED) || (item->tval == TV_ROD && item->sval == SV_ROD_DRAIN_LIFE)|| (item->tval == TV_ROD && item->sval == SV_ROD_HEALING) || (item->tval == TV_ROD && item->sval == SV_ROD_MAPPING && borg_class == CLASS_WARRIOR) || (item->tval == TV_STAFF && item->sval == SV_STAFF_DISPEL_EVIL) || (item->tval == TV_STAFF && item->sval == SV_STAFF_POWER) || (item->tval == TV_STAFF && item->sval == SV_STAFF_HOLINESS) || (item->tval == TV_WAND && item->sval == SV_WAND_DRAIN_LIFE) || (item->tval == TV_WAND && item->sval == SV_WAND_ANNIHILATION) || (item->tval == TV_WAND && item->sval == SV_WAND_TELEPORT_AWAY && borg_class == CLASS_WARRIOR) || (item->tval == TV_CLOAK && item->name2 == EGO_AMAN) || (item->tval == TV_SCROLL && item->sval == SV_SCROLL_TELEPORT_LEVEL && borg_skill[BI_ATELEPORTLVL] < 1000) || (item->tval == TV_SCROLL && item->sval == SV_SCROLL_PROTECTION_FROM_EVIL)) { value +=5000L; } /* Go Ahead and crush diggers */ if (item->tval == TV_DIGGING) value = 0L; /* Crush missiles that aren't mine */ if (item->tval == TV_SHOT || item->tval == TV_ARROW || item->tval == TV_BOLT) { if (item->tval != my_ammo_tval) value = 0L; } /* borg_worships_gold will sell all kinds of stuff, * except {cursed} is junk */ if (item->value > 0 && ((borg_worships_gold || borg_skill[BI_MAXCLEVEL] < 10) || ((borg_money_scum_amount < borg_gold) && borg_money_scum_amount != 0)) && borg_skill[BI_MAXCLEVEL] <= 20 && !(strstr(item->note, "cursed}")) ) continue; /* up to level 5, keep anything of any value */ if (borg_skill[BI_CDEPTH] < 5 && value > 0) continue; /* up to level 10, keep anything of any value */ if (borg_skill[BI_CDEPTH] < 10 && value > 15) continue; /* up to level 15, keep anything of value 100 or better */ if (borg_skill[BI_CDEPTH] < 15 && value > 100) continue; /* up to level 30, keep anything of value 500 or better */ if (borg_skill[BI_CDEPTH] < 30 && value > 500) continue; /* up to level 40, keep anything of value 1000 or better */ if (borg_skill[BI_CDEPTH] < 40 && value > 1000) continue; /* up to level 60, keep anything of value 1200 or better */ if (borg_skill[BI_CDEPTH] < 60 && value > 1200) continue; /* up to level 80, keep anything of value 1400 or better */ if (borg_skill[BI_CDEPTH] < 80 && value > 1400) continue; /* up to level 90, keep anything of value 1600 or better */ if (borg_skill[BI_CDEPTH] < 90 && value > 1600) continue; /* up to level 95, keep anything of value 4800 or better */ if (borg_skill[BI_CDEPTH] < 95 && value > 4800) continue; /* below level 127, keep anything of value 2000 or better */ if (borg_skill[BI_CDEPTH] < 127 && value > 5600) continue; /* Save the item */ COPY(&safe_items[i], &borg_items[i], borg_item); /* Destroy the item */ WIPE(&borg_items[i], borg_item); /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ p = borg_power(); /* Restore the item */ COPY(&borg_items[i], &safe_items[i], borg_item); /* skip things we are using */ if (p < my_power) continue; } /* re-examine the inventory */ if (fix) borg_notice(TRUE); /* Hack -- skip good un-id'd "artifacts" */ if (strstr(item->note, "special")) continue; if (strstr(item->note, "terrible")) continue; if (strstr(item->note, "indestructible")) continue; /* hack -- with random artifacts some are good and bad */ /* so check them all */ if ((op_ptr->opt[OPT_birth_randarts] || op_ptr->opt[OPT_birth_randarts]) && item->name1 && !item->fully_identified) continue; /* Message */ borg_note(format("# Junking junk (valued at %d)",value)); /* Message */ borg_note(format("# Destroying %s.", item->desc)); if (item->tval == TV_STAFF || item->tval == TV_WAND) { /* Destroy one item */ borg_keypresses("01"); borg_keypress(KC_ENTER); } else { /* Destroy all items */ borg_keypresses("099"); borg_keypress(KC_ENTER); } /* Destroy that item */ if (!item->name1) borg_keypress('k'); else { int a; /* worthless artifacts are dropped. */ borg_keypress('d'); /* mark the spot that the object was dropped so that */ /* it will not be picked up again. */ count = bad_obj_cnt; for (a = 0; a <= count; a++) { if (bad_obj_x[a] != -1) continue; if (bad_obj_y[a] != -1) continue; bad_obj_x[a] = c_x; bad_obj_y[a] = c_y; borg_note(format("# Crappy artifact at %d,%d",bad_obj_x[a],bad_obj_y[a])); bad_obj_cnt ++; break; } } borg_keypress(I2A(i)); /* This item only */ borg_keypress('a'); /* Success */ return (TRUE); } /* re-examine the inventory */ if (fix) borg_notice(TRUE); /* Hack -- no need */ borg_do_crush_junk = FALSE; /* Nothing to destroy */ return (FALSE); } /* * Destroy something to make a free inventory slot. * * This function evaluates the possible worlds that result from * the destruction of each inventory slot, and attempts to destroy * that slot which causes the best possible resulting world. * * We attempt to avoid destroying unknown items by "rewarding" the * presence of unknown items by a massively heuristic value. * * If the Borg cannot find something to destroy, which should only * happen if he fills up with artifacts, then he will probably act * rather twitchy for a while. * * This function does not have to be very efficient. */ bool borg_crush_hole(void) { int i, b_i = -1; s32b p, b_p = 0L; s32b value; bool fix = FALSE; /* Do not destroy items unless we need the space */ if (!borg_items[INVEN_MAX_PACK-1].iqty) return (FALSE); /* No crush if even slightly dangerous */ if (borg_skill[BI_CDEPTH] && (borg_danger(c_y,c_x,1, TRUE, FALSE) > borg_skill[BI_CURHP] / 10 && (borg_skill[BI_CURHP] != borg_skill[BI_MAXHP] || borg_danger(c_y,c_x,1, TRUE, FALSE) > (borg_skill[BI_CURHP] * 2) / 3))) return (FALSE); /* Scan the inventory */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Hack -- skip "artifacts" */ if (item->name1) continue; /* skip food */ if (item->tval == TV_FOOD && borg_skill[BI_FOOD] < 5) continue; /* dont crush the swap weapon */ if (i == weapon_swap && item->tval != TV_FOOD) continue; if (i == armour_swap && item->tval != TV_FOOD) continue; /* dont crush our spell books */ if (item->tval == p_ptr->class->spell_book) continue; /* Do not crush Boots, they could be SPEED */ if (item->tval == TV_BOOTS && !item->ident) continue; /* Dont crush weapons if we are weilding a digger */ if (item->tval >=TV_DIGGING && item->tval <= TV_SWORD && borg_items[INVEN_WIELD].tval == TV_DIGGING) continue; /* Hack -- skip "artifacts" */ if (item->name1 && !item->fully_identified) continue; if (strstr(item->note, "special")) continue; if (strstr(item->note, "terrible")) continue; if (strstr(item->note, "indestructible")) continue; /* never crush cool stuff that we might be needing later */ if ((item->tval == TV_POTION && item->sval == SV_POTION_RESTORE_MANA) && (borg_skill[BI_MAXSP] >= 1)) continue; if (item->tval == TV_POTION && item->sval == SV_POTION_HEALING) continue; if (item->tval == TV_POTION && item->sval == SV_POTION_STAR_HEALING) continue; if (item->tval == TV_POTION && item->sval == SV_POTION_LIFE) continue; if (item->tval == TV_POTION && item->sval == SV_POTION_SPEED) continue; if (item->tval == TV_SCROLL && item->sval == SV_SCROLL_PROTECTION_FROM_EVIL) continue; if (item->tval == TV_SCROLL && item->sval == SV_SCROLL_RUNE_OF_PROTECTION) continue; if (item->tval == TV_SCROLL && item->sval == SV_SCROLL_TELEPORT_LEVEL && borg_skill[BI_ATELEPORTLVL] < 1000 ) continue; if (item->tval == TV_CLOAK && item->name2 == EGO_AMAN) continue; if (item->tval == TV_ROD && (item->sval == SV_ROD_HEALING || (item->sval == SV_ROD_MAPPING && borg_class == CLASS_WARRIOR)) && item->iqty <= 5) continue; if (item->tval == TV_WAND && item->sval == SV_WAND_TELEPORT_AWAY && borg_class == CLASS_WARRIOR && borg_skill[BI_ATPORTOTHER] <= 8) continue; if (item->tval == TV_ROD && (item->sval == SV_ROD_LIGHT && borg_skill[BI_CURLITE] <= 0)) continue; /* save the items value */ value = item->value; /* Save the item */ COPY(&safe_items[i], &borg_items[i], borg_item); /* Destroy the item */ WIPE(&borg_items[i], borg_item); /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ p = borg_power(); /* power is much more important than gold. */ p *= 100; /* If I have no food, and in town, I must have a free spot to buy food */ if (borg_skill[BI_CDEPTH] == 0 && borg_skill[BI_FOOD] ==0) { /* Power is way more important than gold */ p *= 500; } /* Restore the item */ COPY(&borg_items[i], &safe_items[i], borg_item); /* Penalize loss of "gold" */ /* if the item gives a bonus to a stat, boost its value */ if ((of_has(item->flags, OF_STR)) || (of_has(item->flags, OF_INT)) || (of_has(item->flags, OF_WIS)) || (of_has(item->flags, OF_DEX)) || (of_has(item->flags, OF_CON))) { value += 20000L; } /* Keep the correct types of missiles which have value * if we do have have tons already. unless in town, you can junk em in town. */ if ((item->tval == my_ammo_tval) && (value > 0) && (borg_skill[BI_AMISSILES] <= 35) && borg_skill[BI_CDEPTH] >=1) { value +=5000L; } /* Hack show prefrence for destroying things we will not use */ /* if we are high enough level not to worry about gold. */ if (borg_skill[BI_CLEVEL] > 35) { switch (item->tval) { /* rings are under valued. */ case TV_RING: p -= (item->iqty * value * 10); break; case TV_AMULET: case TV_BOW: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: p -= (item->iqty * value * 5); break; case TV_CLOAK: if (item->name2 != EGO_AMAN) p -=(item->iqty *(300000L)); else p -= (item->iqty * value); break; case TV_ROD: /* BIG HACK! don't crush cool stuff. */ if ((item->sval != SV_ROD_DRAIN_LIFE) || (item->sval != SV_ROD_ACID_BALL) || (item->sval != SV_ROD_ELEC_BALL) || (item->sval != SV_ROD_FIRE_BALL) || (item->sval != SV_ROD_COLD_BALL) ) p -= (item->iqty * (300000L)); /* value at 30k */ else p -= (item->iqty * value); break; case TV_STAFF: /* BIG HACK! don't crush cool stuff. */ if (item->sval != SV_STAFF_DISPEL_EVIL || ((item->sval != SV_STAFF_POWER || item->sval != SV_STAFF_HOLINESS) && amt_cool_staff < 2) || (item->sval != SV_STAFF_DESTRUCTION && borg_skill[BI_ASTFDEST] < 2)) p -= (item->iqty * (300000L)); /* value at 30k */ else p -= (item->iqty * (value/2)); case TV_WAND: /* BIG HACK! don't crush cool stuff. */ if ((item->sval != SV_WAND_DRAIN_LIFE) || (item->sval != SV_WAND_TELEPORT_AWAY) || (item->sval != SV_WAND_ACID_BALL) || (item->sval != SV_WAND_ELEC_BALL) || (item->sval != SV_WAND_FIRE_BALL) || (item->sval != SV_WAND_COLD_BALL) || (item->sval != SV_WAND_ANNIHILATION) || (item->sval != SV_WAND_DRAGON_FIRE) || (item->sval != SV_WAND_DRAGON_COLD) ) p -= (item->iqty * (300000L)); /* value at 30k */ else p -= (item->iqty * (value/2)); break; /* scrolls and potions crush easy */ case TV_SCROLL: if ((item->sval != SV_SCROLL_PROTECTION_FROM_EVIL) || (item->sval != SV_SCROLL_RUNE_OF_PROTECTION)) p -=(item->iqty * (30000L)); else p -= (item->iqty * (value/10)); break; case TV_POTION: /* BIG HACK! don't crush heal/mana potions. It could be */ /* that we are in town and are collecting them. */ if ((item->sval != SV_POTION_HEALING) || (item->sval != SV_POTION_STAR_HEALING) || (item->sval != SV_POTION_LIFE) || (item->sval != SV_POTION_RESTORE_MANA)) p -= (item->iqty * (300000L)); /* value at 30k */ else p -= (item->iqty * (value/10)); break; default: p -= (item->iqty * (value/3)); break; } } else { p -= (item->iqty * value); } /* Hack -- try not to destroy "unaware" items * unless deep */ if (!item->kind && (value > 0)) { /* Hack -- Reward "unaware" items */ switch (item->tval) { case TV_RING: case TV_AMULET: p -= (borg_skill[BI_MAXDEPTH] * 5000L); break; case TV_ROD: p -= (borg_skill[BI_MAXDEPTH] * 3000L); break; case TV_STAFF: case TV_WAND: p -= (borg_skill[BI_MAXDEPTH] * 2000L); break; case TV_SCROLL: case TV_POTION: p -= (borg_skill[BI_MAXDEPTH] * 500L); break; case TV_FOOD: p -= (borg_skill[BI_MAXDEPTH] * 10L); break; } } /* Hack -- try not to destroy "unknown" items */ if (!item->ident && (value > 0) && borg_item_worth_id(item)) { /* Reward "unknown" items */ switch (item->tval) { case TV_SHOT: case TV_ARROW: case TV_BOLT: p -= 100L; break; case TV_BOW: p -= 20000L; break; case TV_DIGGING: p -= 10L; break; case TV_HAFTED: case TV_POLEARM: case TV_SWORD: p -= 10000L; break; case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: p -= 15000L; break; case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: p -= 15000L; break; case TV_AMULET: case TV_RING: p -= 5000L; break; case TV_STAFF: case TV_WAND: p -= 1000L; break; } } /* Ignore "bad" swaps */ if ((b_i >= 0) && (p < b_p)) continue; /* Maintain the "best" */ b_i = i; b_p = p; } /* Examine the inventory */ if (fix) borg_notice(TRUE); /* Attempt to destroy it */ if (b_i >= 0) { borg_item *item = &borg_items[b_i]; /* Debug */ borg_note(format("# Junking %ld gold (full)", my_power*100 - b_p)); /* Try to consume the junk */ if (borg_consume(b_i)) return (TRUE); /* Message */ borg_note(format("# Destroying %s.", item->desc)); /* Destroy that item */ borg_keypress('k'); borg_keypress(I2A(b_i)); /* This item only */ borg_keypress('a'); /* Success */ return (TRUE); } /* Hack -- no need */ borg_do_crush_hole = FALSE; /* Paranoia */ return (FALSE); } /* * Destroy "junk" when slow (in the dungeon). * * We penalize the loss of both power and monetary value, and reward * the loss of weight that may be slowing us down. The weight loss * is worth one gold per tenth of a pound. This causes things like * lanterns and chests and spikes to be considered "annoying". */ bool borg_crush_slow(void) { int i, b_i = -1; s32b p, b_p = 0L; s32b temp; s32b greed; bool fix = FALSE; /* No crush if even slightly dangerous */ if (borg_danger(c_y,c_x,1, TRUE, FALSE) > borg_skill[BI_CURHP] / 20) return (FALSE); /* Hack -- never in town */ if (borg_skill[BI_CDEPTH] == 0) return (FALSE); /* Do not crush items unless we are slow */ if (borg_skill[BI_SPEED] >= 110) return (FALSE); /* Not if in munchkin mode */ if (borg_munchkin_mode) return (FALSE); /* Calculate "greed" factor */ greed = (borg_gold / 100L) + 100L; /* Minimal and maximal greed */ if (greed < 500L && borg_skill[BI_CLEVEL] > 35) greed = 500L; if (greed > 25000L) greed = 25000L; /* Decrease greed by our slowness */ greed -= (110 - borg_skill[BI_SPEED]) * 500; if (greed <=0) greed = 0L; /* Scan for junk */ for (i = 0; i < ALL_INVEN_TOTAL; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip our equipment, but do not skip the quiver */ if (i >= INVEN_MAX_PACK && i <= INVEN_FEET) continue; /* dont crush the swap weapon */ if (i == weapon_swap && item->iqty == 1) continue; if (i == armour_swap) continue; /* Skip "good" unknown items (unless "icky") */ if (!item->ident && borg_item_worth_id(item)) continue; /* Do not crush Boots, they could be SPEED */ if (item->tval == TV_BOOTS && !item->ident) continue; /* Hack -- Skip artifacts */ if ((op_ptr->opt[OPT_birth_randarts] || op_ptr->opt[OPT_birth_randarts]) && item->name1 && !item->fully_identified) continue; if (strstr(item->note, "special")) continue; if (strstr(item->note, "terrible")) continue; if (strstr(item->note, "indestructible")) continue; /* Dont crush weapons if we are weilding a digger */ if (item->tval >=TV_DIGGING && item->tval <= TV_SWORD && borg_items[INVEN_WIELD].tval == TV_DIGGING) continue; /* Dont crush it if it is our only source of light */ if (item->tval == TV_ROD && (item->sval == SV_ROD_LIGHT && borg_skill[BI_CURLITE] <= 0)) continue; /* Rods of healing are too hard to come by */ if (item->tval == TV_ROD && item->sval == SV_ROD_HEALING) continue; /* Save the item */ COPY(&safe_items[i], &borg_items[i], borg_item); /* Destroy one of the items */ borg_items[i].iqty--; /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ p = borg_power(); /* Restore the item */ COPY(&borg_items[i], &safe_items[i], borg_item); /* Obtain the base price */ temp = ((item->value < 30000L) ? item->value : 30000L); /* Hack -- ignore very cheap items */ if (temp < greed) temp = 0L; /* Penalize */ p -= temp; /* Obtain the base weight */ temp = item->weight; /* Reward */ p += (temp*100); /* Ignore "bad" swaps */ if (p < b_p) continue; /* Maintain the "best" */ b_i = i; b_p = p; } /* Examine the inventory */ if (fix) borg_notice(TRUE); /* Destroy "useless" things */ if ((b_i >= 0) && (b_p >= (my_power))) { borg_item *item = &borg_items[b_i]; /* Message */ borg_note(format("# Junking %ld gold (slow)", (my_power) - b_p)); /* Attempt to consume it */ if (borg_consume(b_i)) return (TRUE); /* Message */ borg_note(format("# Destroying %s.", item->desc)); /* Destroy one item */ /* Quiver Slot */ if (b_i >= QUIVER_START) { /* Have to take it off before dropping */ borg_keypress('t'); borg_keypress((b_i+73)); return FALSE; } /* Drop one item */ borg_keypress('0'); borg_keypress('1'); borg_keypress(KC_ENTER); borg_keypress('d'); borg_keypress(I2A(b_i)); /* Destroy that item */ borg_keypress('k'); /* Now on the floor */ borg_keypress('-'); /* Assume first - TODO: this might be wrong ! */ borg_keypress('a'); /* This item only */ borg_keypress('a'); } /* Hack -- no need */ borg_do_crush_slow = FALSE; /* Nothing to destroy */ return (FALSE); } /* * Identify items if possible * * Note that "borg_parse()" will "cancel" the identification if it * detects a "You failed..." message. This is VERY important!!! * Otherwise the "identify" might induce bizarre actions by sending * the "index" of an item as a command. * * Hack -- recover from mind blanking by re-identifying the equipment. * * We instantly identify items known to be "good" (or "terrible"). * * We identify most un-aware items as soon as possible. * * We identify most un-known items as soon as possible. * * We play games with items that get "feelings" to try and wait for * "sensing" to take place if possible. * * XXX XXX XXX Make sure not to sell "non-aware" items, unless * we are really sure we want to lose them. For example, we should * wait for feelings on (non-icky) wearable items or else make sure * that we identify them before we try and sell them. * * Mega-Hack -- the whole "sometimes identify things" code is a total * hack. Slightly less bizarre would be some form of "occasionally, * pick a random item and identify it if necessary", which might lower * the preference for identifying items that appear early in the pack. * Also, preventing inventory motion would allow proper time-stamping. * * This function is also repeated to *ID* objects. Right now only objects * with random high resist or random powers are *ID*'d */ bool borg_test_stuff(void) { int i; int b_i = -1, b_v = -1; bool free_id = borg_spell_legal(2, 5) || borg_prayer_legal(5, 2) || borg_equips_artifact(EF_IDENTIFY); /* don't ID stuff when you can't recover spent spell point immediately */ if (((borg_skill[BI_CURSP] < 50 && borg_spell_legal(2, 5)) || (borg_skill[BI_CURSP] < 50 && borg_prayer_legal(5, 2))) && !borg_check_rest(c_y, c_x)) return (FALSE); /* No ID if in danger */ if (borg_danger(c_y, c_x, 1, TRUE, FALSE) > 1) return (FALSE); /* Look for an item to identify (equipment) */ for (i = INVEN_WIELD; i < QUIVER_END; i++) { int v = 0; borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; if (item->fully_identified) continue; if (item->ident && item->needs_I) continue; /* Preferentially ID egos and artifacts */ if (item->name1) v = item->value + 150000L; if (e_info[item->name2].xtra == OBJECT_XTRA_TYPE_RESIST || e_info[item->name2].xtra == OBJECT_XTRA_TYPE_POWER) { v = item->value + 100000L; } /* Prioritize the ID */ if (strstr(item->note, "magical")) v = item->value +1000L; else if (strstr(item->note, "excellent")) v = item->value + 20000L; else if (strstr(item->note, "ego")) v = item->value + 20000L; else if (strstr(item->note, "splendid")) v = item->value + 20000L; else if (strstr(item->note, "special")) v = item->value + 50000L; else if (strstr(item->note, "terrible")) v = item->value + 50000L; else if (strstr(item->note, "indestructible")) v = item->value + 50000L; else if (strstr(item->note, "tried")) v = item->value + 2500L; /* Ignore */ if (!v) continue; /* Track the best */ if (v <= b_v) continue; /* Track it */ b_i = i; b_v = v; } /* Look for an item to identify (inventory) */ for (i = 0; i < INVEN_MAX_PACK; i++) { int v = 0; borg_item *item = &borg_items[i]; /* Skip empty and ID'd items */ if (!item->iqty) continue; if (item->fully_identified) continue; if (item->ident && !item->needs_I) continue; /* Preferentially ID artifacts */ if (item->name1) v = item->value + 150000L; /* Identify "good" (and "terrible") items */ if (strstr(item->note, "magical")) v = item->value + 1000L; else if (strstr(item->note, "excellent")) v = item->value + 20000L; else if (strstr(item->note, "ego")) v = item->value + 20000L; else if (strstr(item->note, "splendid")) v = item->value + 20000L; else if (strstr(item->note, "special")) v = item->value + 50000L; else if (strstr(item->note, "terrible")) v = item->value + 50000L; else if (strstr(item->note, "indestructible")) v = item->value + 50000L; else if (strstr(item->note, "tried")) v = item->value + 2500L; else if (free_id || borg_item_worth_id(item)) v = item->value; /* Hack -- reward "unaware" items */ if (!item->kind) { /* Analyze the type */ switch (item->tval) { case TV_RING: case TV_AMULET: v += (borg_skill[BI_MAXDEPTH] * 5000L); break; case TV_ROD: v += (borg_skill[BI_MAXDEPTH] * 3000L); break; case TV_WAND: case TV_STAFF: v += (borg_skill[BI_MAXDEPTH] * 2000L); break; case TV_POTION: case TV_SCROLL: /* Hack -- boring levels */ if (borg_skill[BI_MAXDEPTH] < 5) break; /* Hack -- reward depth */ v += (borg_skill[BI_MAXDEPTH] * 500L); break; case TV_FOOD: v += (borg_skill[BI_MAXDEPTH] * 10L); break; } } /* Ignore */ if (!v) continue; /* Track the best */ if (v <= b_v) continue; /* Track it */ b_i = i; b_v = v; } /* Found something */ if (b_i >= 0) { borg_item *item = &borg_items[b_i]; /* Use an item to identify */ if (borg_activate_artifact(EF_IDENTIFY) || borg_spell(2, 5) || borg_prayer(5, 2) || borg_zap_rod(SV_ROD_IDENTIFY) || borg_use_staff(SV_STAFF_IDENTIFY) || borg_read_scroll(SV_SCROLL_IDENTIFY)) { /* Log -- may be cancelled */ borg_note(format("# Identifying %s.", item->desc)); /* Toggle if necessary */ if ((p_ptr->command_wrk == USE_INVEN && b_i >= INVEN_WIELD) || (p_ptr->command_wrk == USE_EQUIP && b_i < INVEN_WIELD)) borg_keypress('/'); /* Equipment */ if (b_i >= INVEN_WIELD) { /* Select the item */ borg_keypress(I2A(b_i - INVEN_WIELD)); /* HACK need to recheck stats if we id something on us. */ for (i = 0; i < 6; i++) { my_need_stat_check[i] = TRUE; my_stat_max[i] = 0; } } /* Inventory */ else { /* Select the item */ borg_keypress(I2A(b_i)); } borg_keypress(ESCAPE); return TRUE; } } /* Nothing to do */ return FALSE; } /* * This function is responsible for making sure that, if possible, * the "best" ring we have is always on the "right" (tight) finger, * so that the other functions, such as "borg_best_stuff()", do not * have to think about the "tight" ring, but instead, can just assume * that the "right" ring is "good for us" and should never be removed. * * In general, this will mean that our "best" ring of speed will end * up on the "right" finger, if we have one, or a ring of free action, * or a ring of see invisible, or some other "useful" ring. * */ bool borg_swap_rings(void) { int hole = INVEN_MAX_PACK - 1; int icky = INVEN_MAX_PACK - 2; s32b v1, v2; char current_right_ring[80]; char current_left_ring[80]; /*** Check conditions ***/ /* Require two empty slots */ if (borg_items[icky].iqty) return (FALSE); /* Forbid if been sitting on level forever */ /* Just come back and work through the loop later */ if (borg_t - borg_began > 1000) return (FALSE); if (borg_skill[BI_CDEPTH] != 0) return (FALSE); /* Forbid if cursed */ if (borg_wearing_cursed) return (FALSE); /*** Remove naked "loose" rings ***/ /* Remove any naked loose ring */ if (borg_items[INVEN_LEFT].iqty && !borg_items[INVEN_RIGHT].iqty && borg_items[INVEN_LEFT].activation != EF_BIZARRE) { /* Log */ borg_note("# Taking off naked loose ring."); /* Remove it */ borg_keypress('t'); borg_keypress(I2A(INVEN_LEFT - INVEN_WIELD)); /* Success */ return (TRUE); } /*** Check conditions ***/ /* Require "tight" ring */ if (!borg_items[INVEN_RIGHT].iqty) return (FALSE); /* Cannot remove the One Ring */ if (!borg_items[INVEN_RIGHT].activation == EF_BIZARRE) return (FALSE); /*** Remove nasty "tight" rings ***/ /* Save the hole */ COPY(&safe_items[hole], &borg_items[hole], borg_item); /* Save the ring */ COPY(&safe_items[INVEN_LEFT], &borg_items[INVEN_LEFT], borg_item); /* Take off the ring */ COPY(&borg_items[hole], &borg_items[INVEN_LEFT], borg_item); /* Erase left ring */ WIPE(&borg_items[INVEN_LEFT], borg_item); /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ v1 = borg_power(); /* Restore the ring */ COPY(&borg_items[INVEN_LEFT], &safe_items[INVEN_LEFT], borg_item); /* Restore the hole */ COPY(&borg_items[hole], &safe_items[hole], borg_item); /*** Consider taking off the "right" ring ***/ /* Save the hole */ COPY(&safe_items[hole], &borg_items[hole], borg_item); /* Save the ring */ COPY(&safe_items[INVEN_RIGHT], &borg_items[INVEN_RIGHT], borg_item); /* Take off the ring */ COPY(&borg_items[hole], &borg_items[INVEN_RIGHT], borg_item); /* Erase the ring */ WIPE(&borg_items[INVEN_RIGHT], borg_item); /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ v2 = borg_power(); /* Restore the ring */ COPY(&borg_items[INVEN_RIGHT], &safe_items[INVEN_RIGHT], borg_item); /* Restore the hole */ COPY(&borg_items[hole], &safe_items[hole], borg_item); /*** Swap rings if necessary ***/ /* Define the rings and descriptions. */ strcpy(current_right_ring, borg_items[INVEN_RIGHT].desc); strcpy(current_left_ring, borg_items[INVEN_LEFT].desc); /* Remove "useless" ring */ if (v2 > v1) { /* Log */ borg_note("# Taking off less valuable right ring."); /* Take it off */ if (borg_items[INVEN_RIGHT].iqty) { borg_keypress('t'); borg_keypress(I2A(INVEN_RIGHT - INVEN_WIELD)); borg_keypress(' '); } /* make sure one is on the left */ if (borg_items[INVEN_LEFT].iqty) { borg_note("# Taking off more valuable left ring."); borg_keypress('t'); borg_keypress(I2A(INVEN_LEFT - INVEN_WIELD)); borg_keypress(' '); } /* Success */ return (TRUE); } /* Nope */ return (FALSE); } /* * Place our "best" ring on the "tight" finger if needed * * This function is adopted from "borg_wear_stuff()" * * Basically, we evaluate the world in which each ring is added * to the current set of equipment, and we wear the ring, if any, * that gives us the most "power". * * The "borg_swap_rings()" code above occasionally allows us to remove * both rings, at which point this function will place the "best" ring * on the "tight" finger, and then the "borg_best_stuff()" function will * allow us to put on our second "best" ring on the "loose" finger. * * This function should only be used when a ring finger is empty. */ bool borg_wear_rings(void) { int slot; int hole = INVEN_MAX_PACK - 1; s32b p, b_p = 0L; int i, b_i = -1; borg_item *item; bool fix = FALSE; /* Require no rings */ if (borg_items[INVEN_LEFT].iqty) return (FALSE); if (borg_items[INVEN_RIGHT].iqty) return (FALSE); /* Require two empty slots */ if (borg_items[hole-1].iqty) return (FALSE); /* hack prevent the swap till you drop loop */ if (borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK]) return (FALSE); /* Forbid if been sitting on level forever */ /* Just come back and work through the loop later */ if (borg_t - borg_began > 2000) return (FALSE); /* Scan inventory */ for (i = 0; i < INVEN_MAX_PACK; i++) { item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Require "aware" */ if (!item->kind) continue; /* Require "known" (or average) */ if (!item->ident && !strstr(item->note, "average")) continue; /* Hack -- ignore "worthless" items */ if (!item->value) continue; /* skip artifact rings not star id'd */ if ((op_ptr->opt[OPT_birth_randarts] || op_ptr->opt[OPT_birth_randarts]) && !item->fully_identified && item->name1) continue; /* Where does it go */ slot = borg_wield_slot(item); /* Only process "rings" */ if (slot != INVEN_LEFT) continue; /* Occassionally evaluate swapping into the tight finger */ if (randint0(100) > 75 || item->activation == EF_BIZARRE) { slot = INVEN_RIGHT; } /* Need to be careful not to put the One Ring onto * the Left Hand */ if (item->activation == EF_BIZARRE && (borg_items[INVEN_RIGHT].iqty)) continue; /* Save the old item (empty) */ COPY(&safe_items[slot], &borg_items[slot], borg_item); /* Save the new item */ COPY(&safe_items[i], &borg_items[i], borg_item); /* Wear new item */ COPY(&borg_items[slot], &safe_items[i], borg_item); /* Only a single item */ borg_items[slot].iqty = 1; /* Reduce the inventory quantity by one */ borg_items[i].iqty--; /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ p = borg_power(); /* the One Ring would be awsome */ if (item->activation == EF_BIZARRE) p = my_power * 2; /* Restore the old item (empty) */ COPY(&borg_items[slot], &safe_items[slot], borg_item); /* Restore the new item */ COPY(&borg_items[i], &safe_items[i], borg_item); /* Ignore "bad" swaps */ if ((b_i >= 0) && (p < b_p)) continue; /* Maintain the "best" */ b_i = i; b_p = p; } /* Restore bonuses */ if (fix) borg_notice(TRUE); /* No item */ if ((b_i >= 0) && (b_p > my_power)) { /* Get the item */ item = &borg_items[b_i]; /* Log */ borg_note("# Putting on best tight ring."); /* Log */ borg_note(format("# Wearing %s.", item->desc)); /* Wear it */ borg_keypress('w'); borg_keypress(I2A(b_i)); /* Did something */ time_this_panel ++; return (TRUE); } /* Nope */ return (FALSE); } /* * Place our "swap" if needed. We check both the armour and the weapon * then wear the one that give the best result (lowest danger). * This function is adopted from "borg_wear_stuff()" and borg_wear_rings * * Basically, we evaluate the world in which the swap is added * to the current set of equipment, and we use weapon, * that gives the largest drop in danger---based mostly on resists. * * The borg is forbidden to swap out certain resistances. * */ bool borg_backup_swap(int p) { int slot; int swap; s32b b_p = 0L; s32b b_p1 = 0L; s32b b_p2 = 0L; int i; int save_rconf = 0; int save_rblind = 0; int save_fract = 0; borg_item *item; bool fix = FALSE; /* hack prevent the swap till you drop loop */ if (borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK]) return (FALSE); /* Forbid if been sitting on level forever */ /* Just come back and work through the loop later */ if (time_this_panel > 300) return (FALSE); /* make sure we have an appropriate swap */ if (armour_swap < 1 && weapon_swap < 1) return (FALSE); /* Save our normal condition */ save_rconf = borg_skill[BI_RCONF]; save_rblind = borg_skill[BI_RBLIND]; save_fract = borg_skill[BI_FRACT]; /* Check the items, first armour then weapon */ i = armour_swap; /* make sure it is not a -1 */ if (i == -1) i = 0; /* get the item */ item = &borg_items[i]; /* Where does it go */ slot = borg_wield_slot(item); /* safety check incase slot = -1 */ if (slot < 0) return (FALSE); /* Save the old item (empty) */ COPY(&safe_items[slot], &borg_items[slot], borg_item); /* Save the new item */ COPY(&safe_items[i], &borg_items[i], borg_item); /* Wear new item */ COPY(&borg_items[slot], &safe_items[i], borg_item); /* Only a single item */ borg_items[slot].iqty = 1; /* Reduce the inventory quantity by one */ borg_items[i].iqty--; /* Fix later */ fix = TRUE; /* Examine the benefits of the swap item */ borg_notice(FALSE); /* Evaluate the power with the new item worn */ b_p1 = borg_danger(c_y,c_x,1, TRUE, FALSE); /* Restore the old item (empty) */ COPY(&borg_items[slot], &safe_items[slot], borg_item); /* Restore the new item */ COPY(&borg_items[i], &safe_items[i], borg_item); /* Examine the critical skills */ if ((save_rconf) && borg_skill[BI_RCONF] == 0) b_p1 = 9999; if ((save_rblind) && (!borg_skill[BI_RBLIND] && !borg_skill[BI_RLITE] && !borg_skill[BI_RDARK] && borg_skill[BI_SAV] < 100)) b_p1 = 9999; if ((save_fract) && (!borg_skill[BI_FRACT] && borg_skill[BI_SAV] < 100)) b_p1 = 9999; /* Restore bonuses */ if (fix) borg_notice(TRUE); /* skip random artifact not star id'd */ if ((op_ptr->opt[OPT_birth_randarts] || op_ptr->opt[OPT_birth_randarts]) && !item->fully_identified && item->name1) b_p1 = 9999; /* skip it if it has not been decursed */ if ((item->cursed) || (of_has(item->flags, OF_HEAVY_CURSE))) b_p1 = 9999; /* Now we check the weapon */ /* get the item */ i = weapon_swap; /* make sure it is not a -1 */ if (i == -1) i = 0; item = &borg_items[i]; /* Where does it go */ slot = borg_wield_slot(item); /* safety check incase slot = -1 */ if (slot < 0) return (FALSE); /* Save the old item (empty) */ COPY(&safe_items[slot], &borg_items[slot], borg_item); /* Save the new item */ COPY(&safe_items[i], &borg_items[i], borg_item); /* Wear new item */ COPY(&borg_items[slot], &safe_items[i], borg_item); /* Only a single item */ borg_items[slot].iqty = 1; /* Reduce the inventory quantity by one */ borg_items[i].iqty--; /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the power with the new item worn */ b_p2 = borg_danger(c_y,c_x,1, TRUE, FALSE); /* Examine the critical skills */ /* Examine the critical skills */ if ((save_rconf) && borg_skill[BI_RCONF] == 0) b_p2 = 9999; if ((save_rblind) && (!borg_skill[BI_RBLIND] && !borg_skill[BI_RLITE] && !borg_skill[BI_RDARK] && borg_skill[BI_SAV] < 100)) b_p2 = 9999; if ((save_fract) && (!borg_skill[BI_FRACT] && borg_skill[BI_SAV] < 100)) b_p2 = 9999; /* Restore the old item (empty) */ COPY(&borg_items[slot], &safe_items[slot], borg_item); /* Restore the new item */ COPY(&borg_items[i], &safe_items[i], borg_item); /* Restore bonuses */ if (fix) borg_notice(TRUE); /* skip random artifact not star id'd */ if ((op_ptr->opt[OPT_birth_randarts] || op_ptr->opt[OPT_birth_randarts]) && !item->fully_identified && item->name1) b_p2 = 9999; /* skip it if it has not been decursed */ if ((item->cursed) || (of_has(item->flags, OF_HEAVY_CURSE))) b_p2 = 9999; /* Pass on the swap which yields the best result */ if (b_p1 <= b_p2) { b_p = b_p1; swap = armour_swap; } else { b_p = b_p2; swap = weapon_swap; } /* good swap. Make sure it helps a significant amount */ if (p > b_p && b_p <= (borg_fighting_unique?((avoidance*2)/3): (avoidance/2))) { /* Log */ borg_note(format("# Swapping backup. (%d < %d).", b_p, p)); /* Wear it */ borg_keypress('w'); borg_keypress(I2A(swap)); /* Did something */ return (TRUE); } /* Nope */ return (FALSE); } /* * Examine the quiver and unwield any quiver slots that ought to stack * * Borg will scan the quiver slots for items which match exactly to another * slot. Then unwield that slot. On his next round, he will enter borg_wear() * and wield that stack of missiles, they should then stack into an exisiting * quiver slot. */ bool borg_stack_quiver(void) { int i; int p; borg_item *item; borg_item *slot; /* hack to prevent the swap till you drop loop */ if (borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK]) return (FALSE); /* Forbid if been sitting on level forever */ /* Just come back and work through the loop later */ if (borg_t - borg_began > 2000) return (FALSE); if (time_this_panel > 150) return (FALSE); /* Not if full, we need a free inventory slot */ if (borg_items[INVEN_PACK].iqty) return (FALSE); /* Scan equip */ for (i = QUIVER_END-1; i >= QUIVER_START; i--) { item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip the non_ID ones */ if (item->ident == FALSE) continue; /* compare this slot to the other known slots. */ for (p = QUIVER_END-1; p >= QUIVER_START; p--) { slot = &borg_items[p]; /* Skip empty items */ if (!slot->iqty) continue; /* Skip the non_ID ones */ if (item->ident == FALSE) continue; /* Dont compare this slot to itself */ if (p == i) continue; /* Compare the slots */ if (item->name2 == slot->name2 && item->to_d == slot->to_d && item->to_h == slot->to_h && item->dd == slot->dd && item->ds == slot->ds && streq(item->note, slot->note) && (item->iqty + slot->iqty <= (MAX_STACK_SIZE-1))) { /* These are essentially the same */ borg_note(format("# Unwielding %s. Combining quiver slots %c & %c.", item->desc, i+73, p+73)); /* Wear it */ borg_keypress('t'); borg_keypress(i + 73); /* Did something */ time_this_panel ++; return (TRUE); } } } /* Nope */ return (FALSE); } /* * Examine the quiver and dump any worthless items * * Borg will scan the quiver slots for items which are cursed or have * negative bonuses. Then shoot those iems to get rid of them. * He needs to do so when safe. */ bool borg_dump_quiver(void) { int i, b_i = -1; int quiver_capacity; borg_item *item; /* hack to prevent the swap till you drop loop */ if (borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK]) return (FALSE); /* Forbid if been sitting on level forever */ /* Just come back and work through the loop later */ if (borg_t - borg_began > 2000) return (FALSE); if (time_this_panel > 150) return (FALSE); /* How many should I carry */ if (borg_class == CLASS_RANGER || borg_class == CLASS_WARRIOR) quiver_capacity = (MAX_STACK_SIZE-1) * 2; else quiver_capacity = MAX_STACK_SIZE-1; /* Scan equip */ for (i = QUIVER_END-1; i >= QUIVER_START; i--) { item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip if it is not cursed and matches my ammo. If it is not cursed but does * not match my ammo, then it is dumped. */ if (!item->cursed && item->tval == my_ammo_tval) { /* It has some value */ if (item->to_d > 0 && item->to_h > 0) continue; if (strstr(item->note, "magical") || strstr(item->note, "excellent") || strstr(item->note, "ego") || strstr(item->note, "splendid") || strstr(item->note, "special")) continue; /* Limit the amount of missiles carried */ if (borg_skill[BI_AMISSILES] <= quiver_capacity && item->to_d >= 0 && item->to_h >= 0) continue; } /* Track a crappy one */ b_i = i; } /* No item */ if (b_i >= 0) { /* Get the item */ item = &borg_items[b_i]; /* Log */ borg_note(format("# Dumping %s. Bad ammo in quiver.", item->desc)); /* Wear it */ borg_keypress('v'); borg_keypress('/'); borg_keypress(b_i + 73); borg_keypress('2'); /* Did something */ time_this_panel ++; return (TRUE); } /* Nope */ return (FALSE); } /* * Remove useless equipment. * * Look through the inventory for equipment that is reducing power. * * Basically, we evaluate the world both with the current set of * equipment, and in the alternate world in which various items * are removed, and we take * one step towards the world in which we have the most "power". */ bool borg_remove_stuff(void) { int hole = INVEN_MAX_PACK - 1; s32b p, b_p = 0L, w_p= 0L; int i, b_i = -1; borg_item *item; bool fix = FALSE; /* hack to prevent the swap till you drop loop */ if (borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK]) return (FALSE); /* We need room to work */ if (borg_items[hole].iqty) return (FALSE); /* Forbid if been sitting on level forever */ /* Just come back and work through the loop later */ if (borg_t - borg_began > 2000) return (FALSE); if (time_this_panel > 150) return (FALSE); /* Start with good power */ b_p = my_power; /* Scan equip */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Require "aware" */ if (!item->kind) continue; /* Require "known" (or average, good, etc) */ if (!item->ident && !strstr(item->note, "average") && !strstr(item->note, "magical") && !strstr(item->note, "ego") && !strstr(item->note, "splendid") && !strstr(item->note, "excellent") && !strstr(item->note, "indestructible") && !strstr(item->note, "special")) continue; /* skip it if it has not been decursed */ if (item->cursed) continue; /* Save the hole */ COPY(&safe_items[hole], &borg_items[hole], borg_item); /* Save the item */ COPY(&safe_items[i], &borg_items[i], borg_item); /* Take off the item */ COPY(&borg_items[hole], &safe_items[i], borg_item); /* Erase the item from equip */ WIPE(&borg_items[i], borg_item); /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ p = borg_power(); /* Restore the item */ COPY(&borg_items[i], &safe_items[i], borg_item); /* Restore the hole */ COPY(&borg_items[hole], &safe_items[hole], borg_item); /* Track the crappy items */ /* crappy includes things that do not add to power */ if (p >= b_p) { b_i = i; w_p = p; } } /* Restore bonuses */ if (fix) borg_notice(TRUE); /* No item */ if (b_i >= 0) { /* Get the item */ item = &borg_items[b_i]; #if 0 /* dump list and power... for debugging */ borg_note(format("Equip Item %d %s.", i, safe_items[i].desc)); borg_note(format("With Item (borg_power %ld)", b_p)); borg_note(format("Removed Item (best power %ld)", p)); #endif /* Log */ borg_note(format("# Removing %s. Power with: (%ld) Power w/o (%ld)", item->desc, b_p, w_p)); /* Wear it */ borg_keypress('t'); borg_keypress(I2A(b_i- INVEN_WIELD)); /* Did something */ time_this_panel ++; return (TRUE); } /* Nope */ return (FALSE); } /* * Wear useful equipment. * * Look through the inventory for equipment that is better than * the current equipment, and wear it, in an optimal order. * * Basically, we evaluate the world both with the current set of * equipment, and in the alternate world in which various items * are used instead of the items they would replace, and we take * one step towards the world in which we have the most "power". * * The "borg_swap_rings()" code above occasionally allows us to remove * both rings, at which point this function will replace the "best" ring * on the "tight" finger, and the second "best" ring on the "loose" finger. */ bool borg_wear_stuff(void) { int hole = INVEN_MAX_PACK - 1; int slot; int d; int o; bool recently_worn = FALSE; s32b p, b_p = 0L; int i, b_i = -1; int ii, b_ii = -1; int danger; char target_ring_desc[80]; borg_item *item; bool fix = FALSE; /* Start with current power */ b_p = my_power; /* hack to prevent the swap till you drop loop */ if (borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK]) return (FALSE); /* We need an empty slot to simulate pushing equipment */ if (borg_items[hole].iqty) return (FALSE); /* Forbid if cursed */ if (borg_wearing_cursed) return (FALSE); /* Forbid if been sitting on level forever */ /* Just come back and work through the loop later */ if (borg_t - borg_began > 2000) return (FALSE); if (time_this_panel > 1300) return (FALSE); /* Scan inventory */ for (i = 0; i < INVEN_MAX_PACK; i++) { item = &borg_items[i]; /* reset this item marker */ recently_worn = FALSE; /* Skip empty items */ if (!item->iqty) continue; /* Require "aware" */ if (!item->kind) continue; /* Require "known" (or average, good, etc) for armors. * It is ok to wear unknown weapons/ bows because we can pseudoID them through use */ if (!item->ident && !strstr(item->note, "average") && !strstr(item->note, "magical") && !strstr(item->note, "ego") && !strstr(item->note, "splendid") && !strstr(item->note, "excellent") && !strstr(item->note, "indestructible") && !strstr(item->note, "special")) continue; /* Hack -- ignore "worthless" items */ if (!item->value) continue; /* do not wear not *idd* artifacts */ if ((op_ptr->opt[OPT_birth_randarts] || op_ptr->opt[OPT_birth_randarts]) && !item->fully_identified && item->name1) continue; /* skip it if it has not been decursed, unless the One Ring */ if ((item->cursed) && (item->activation != EF_BIZARRE)) continue; /* Do not consider wearing this item if I worn it already this level, * I might be stuck in a loop. */ for (o = 0; o < track_worn_num; o++) { /* Examine the worn list */ if (track_worn_num >=1 && track_worn_name1[o] == item->name1 && track_worn_time > borg_t - 10) { /* Recently worn item */ recently_worn = TRUE; } } /* Note and fail out */ if (recently_worn == TRUE) { borg_note(format("# Not considering a %s; it was recently worn.", item->desc)); continue; } /* Where does it go */ slot = borg_wield_slot(item); /* Cannot wear this item */ if (slot < 0) continue; /* Make sure that slot does not have a cursed item */ if (borg_items[slot].cursed || of_has(item->flags, OF_LIGHT_CURSE)|| of_has(item->flags, OF_HEAVY_CURSE)|| of_has(item->flags, OF_PERMA_CURSE)) continue; /* Do not wear certain items if I am over weight limit. It induces loops */ if (borg_skill[BI_ISENCUMB]) { /* Compare Str bonuses */ if (of_has(borg_items[slot].flags, OF_STR) && !of_has(item->flags, OF_STR)) continue; /* Compare Str bonuses */ else if (of_has(borg_items[slot].flags, OF_STR) && of_has(item->flags, OF_STR) && borg_items[slot].pval > item->pval) continue; } /* Obtain danger */ danger = borg_danger(c_y,c_x,1, TRUE, FALSE); /* If this is a ring and both hands are full, then check each hand * and compare the two. If needed the tight ring can be removed then * the better ring placed there on. */ /*** Process regular items and non full rings ***/ /* Non ring, non full hands */ if (slot != INVEN_LEFT || (!borg_items[INVEN_LEFT].tval || !borg_items[INVEN_RIGHT].tval)) { /* Save the old item */ COPY(&safe_items[slot], &borg_items[slot], borg_item); /* Save the new item */ COPY(&safe_items[i], &borg_items[i], borg_item); /* Save the hole */ COPY(&safe_items[hole], &borg_items[hole], borg_item); /* Take off old item */ COPY(&borg_items[hole], &safe_items[slot], borg_item); /* Wear new item */ COPY(&borg_items[slot], &safe_items[i], borg_item); /* Only a single item */ borg_items[slot].iqty = 1; /* Reduce the inventory quantity by one */ borg_items[i].iqty--; /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ p = borg_power(); /* Evaluate local danger */ d = borg_danger(c_y,c_x,1, TRUE, FALSE); if (borg_verbose) { /* dump list and power... for debugging */ borg_note(format("Trying Item %s (best power %ld)",borg_items[slot].desc, p)); borg_note(format("Against Item %s (borg_power %ld)",safe_items[slot].desc, b_p)); } /* Restore the old item */ COPY(&borg_items[slot], &safe_items[slot], borg_item); /* Restore the new item */ COPY(&borg_items[i], &safe_items[i], borg_item); /* Restore the hole */ COPY(&borg_items[hole], &safe_items[hole], borg_item); /* Need to be careful not to put the One Ring onto * the Left Hand */ if (item->activation == EF_BIZARRE && !borg_items[INVEN_LEFT].tval) p = -99999; /* Ignore if more dangerous */ if (danger < d) continue; /* XXX XXX XXX Consider if slot is empty */ /* Hack -- Ignore "essentially equal" swaps */ if (p <= b_p+50) continue; /* Maintain the "best" */ b_i = i; b_p = p; } /* non-rings, non full */ if (randint0(100)==10 || item->activation == EF_BIZARRE) { /* ring, full hands */ if (slot == INVEN_LEFT && borg_items[INVEN_LEFT].tval && borg_items[INVEN_RIGHT].tval) { for (ii = INVEN_LEFT; ii <= INVEN_RIGHT; ii++) { slot = ii; /* Does One Ring need to be handled here? */ /* Save the old item */ COPY(&safe_items[slot], &borg_items[slot], borg_item); /* Save the new item */ COPY(&safe_items[i], &borg_items[i], borg_item); /* Save the hole */ COPY(&safe_items[hole], &borg_items[hole], borg_item); /* Take off old item */ COPY(&borg_items[hole], &safe_items[slot], borg_item); /* Wear new item */ COPY(&borg_items[slot], &safe_items[i], borg_item); /* Only a single item */ borg_items[slot].iqty = 1; /* Reduce the inventory quantity by one */ borg_items[i].iqty--; /* Fix later */ fix = TRUE; /* Examine the inventory */ borg_notice(FALSE); /* Evaluate the inventory */ p = borg_power(); /* Evaluate local danger */ d = borg_danger(c_y,c_x,1, TRUE, FALSE); /* Restore the old item */ COPY(&borg_items[slot], &safe_items[slot], borg_item); /* Restore the new item */ COPY(&borg_items[i], &safe_items[i], borg_item); /* Restore the hole */ COPY(&borg_items[hole], &safe_items[hole], borg_item); /* Need to be careful not to put the One Ring onto * the Left Hand */ if (ii == INVEN_LEFT && item->activation == EF_BIZARRE) p = -99999; /* Ignore "bad" swaps */ if (p < b_p) continue; /* no swapping into more danger */ if (danger <= d && danger != 0) continue; /* Maintain the "best" */ b_i = i; b_p = p; b_ii = ii; } } /* ring, looking at replacing each ring */ } /* Random ring check */ } /* end scanning inventory */ /* Restore bonuses */ if (fix) borg_notice(TRUE); /* item */ if ((b_i >= 0) && (b_p > my_power)) { /* Get the item */ item = &borg_items[b_i]; /* Define the desc of the nice ring */ strcpy(target_ring_desc, item->desc); /* Remove old ring to make room for good one */ if (b_ii >= INVEN_RIGHT && item->tval == TV_RING) { /* Log */ borg_note(format("# Removing %s to make room for %s.", &borg_items[b_ii].desc, item->desc)); /* Make room */ borg_keypress('t'); borg_keypress(I2A(b_ii-INVEN_WIELD)); /* Did something */ time_this_panel ++; return (TRUE); } /* Log */ borg_note(format("# Wearing %s.", item->desc)); /* Wear it */ borg_keypress('w'); borg_keypress(I2A(b_i)); time_this_panel ++; /* Track the newly worn artifact item to avoid loops */ if (item->name1 && (track_worn_num < track_worn_size)) { borg_note("# Noting the wearing of artifact."); track_worn_name1[track_worn_num] = item->name1; track_worn_time = borg_t; track_worn_num++; } return (TRUE); } /* Nope */ return (FALSE); } /* * Equip useful missiles. * * Look through the inventory for missiles that need to be wielded. * The quiver has 10 slots and can carry MAX_STACK_SIZE-1 of the identical missiles. */ bool borg_wear_quiver(void) { int hole = QUIVER_END-1; int p; borg_item *slot; int i, b_i = -1; char target_desc[80]; borg_item *item; bool fix = FALSE; /* hack to prevent the swap till you drop loop */ if (borg_skill[BI_ISHUNGRY] || borg_skill[BI_ISWEAK]) return (FALSE); /* Forbid if been sitting on level forever */ /* Just come back and work through the loop later */ if (borg_t - borg_began > 2000) return (FALSE); if (time_this_panel > 1300) return (FALSE); /* Scan inventory */ for (i = 0; i < INVEN_MAX_PACK; i++) { item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Require "aware" */ if (item->tval != my_ammo_tval) continue; /* Hack -- ignore "worthless" items */ if (!item->value) continue; /* if the quivers and full and this missile won't stack into an existing * quiver stack, then leave it. * For the most part, an arrow will be placed into an occupied quiver slot * if it matches the type in the slot. */ if (borg_items[hole].iqty) { for (p = QUIVER_START; p < QUIVER_END; p++) { slot = &borg_items[p]; if (item->name2 == slot->name2 && item->dd == slot->dd && item->ds == slot->ds && item->to_d == slot->to_d && item->to_h == slot->to_h) { b_i = i; } } } else { /* Load these missiles into the non-full quiver */ b_i = i; } } /* end scanning inventory */ /* Restore bonuses */ if (fix) borg_notice(TRUE); /* item */ if (b_i >= 0) { /* Get the item */ item = &borg_items[b_i]; /* Define the desc of the nice ring */ strcpy(target_desc, item->desc); /* Log */ borg_note(format("# Loading Quiver %s.", item->desc)); /* Wear it */ borg_keypress(ESCAPE); borg_keypress('w'); borg_keypress(I2A(b_i)); time_this_panel ++; return (TRUE); } /* Nope */ return (FALSE); } /* * Hack -- order of the slots * * XXX XXX XXX Note that we ignore the "tight" ring, and we * assume that we will always be wearing our "best" ring on * our "right" (tight) finger, and if we are not, then the * "borg_swap_rings()" function will remove both the rings, * which will induce the "borg_best_stuff()" function to put * the rings back on in the "optimal" order. */ static byte borg_best_stuff_order[] = { INVEN_BOW, INVEN_WIELD, INVEN_BODY, INVEN_OUTER, INVEN_ARM, INVEN_HEAD, INVEN_HANDS, INVEN_FEET, INVEN_LEFT, INVEN_LIGHT, INVEN_NECK, 255 }; /* * Helper function (see below) */ static void borg_best_stuff_aux(int n, byte *test, byte *best, s32b *vp) { int i; int slot; /* Extract the slot */ slot = borg_best_stuff_order[n]; /* All done */ if (slot == 255) { s32b p; /* Examine */ borg_notice(FALSE); /* Evaluate */ p = borg_power(); /* Track best */ if (p > *vp) { #if 0 /* dump list and power... for debugging */ borg_note(format("Trying Combo (best power %ld)", *vp)); borg_note(format(" (borg_power %ld)", p)); for (i = 0; i < INVEN_MAX_PACK; i++) borg_note(format("inv %d %s.", i, borg_items[i].desc)); for (i=0; borg_best_stuff_order[i] != 255; i++) borg_note(format("stuff %s.", borg_items[borg_best_stuff_order[i]].desc)); #endif /* Save the results */ for (i = 0; i < n; i++) best[i] = test[i]; /* Use it */ *vp = p; } /* Success */ return; } /* Note the attempt */ test[n] = slot; /* Evaluate the default item */ borg_best_stuff_aux(n + 1, test, best, vp); /* Try other possible objects */ for (i = 0; i < ((shop_num == 7) ? (INVEN_MAX_PACK + STORE_INVEN_MAX) : INVEN_MAX_PACK); i++) { borg_item *item; if (i < INVEN_MAX_PACK) item = &borg_items[i]; else item = &borg_shops[7].ware[i - INVEN_MAX_PACK]; /* Skip empty items */ if (!item->iqty) continue; /* Require "aware" */ if (!item->kind) continue; /* Require "known" (or average, good, etc) */ if (!item->ident && !strstr(item->note, "average") && !strstr(item->note, "magical") && !strstr(item->note, "ego") && !strstr(item->note, "splendid") && !strstr(item->note, "excellent") && !strstr(item->note, "indestructible") && !strstr(item->note, "special")) continue; /* Hack -- ignore "worthless" items */ if (!item->value) continue; /* Skip it if it has not been decursed */ if (item->cursed || of_has(item->flags, OF_LIGHT_CURSE)|| of_has(item->flags, OF_HEAVY_CURSE)|| of_has(item->flags, OF_PERMA_CURSE)) continue; /* Do not wear not *idd* artifacts */ if ((op_ptr->opt[OPT_birth_randarts] || op_ptr->opt[OPT_birth_randarts]) && !item->fully_identified && item->name1) continue; /* Make sure it goes in this slot, special consideration for checking rings */ if (slot != borg_wield_slot(item)) continue; /* Make sure that slot does not have a cursed item */ if (borg_items[slot].cursed || of_has(item->flags, OF_LIGHT_CURSE)|| of_has(item->flags, OF_HEAVY_CURSE)|| of_has(item->flags, OF_PERMA_CURSE)) continue; /* Do not wear certain items if I am over weight limit. It induces loops */ if (borg_skill[BI_ISENCUMB]) { /* Compare Str bonuses */ if (of_has(borg_items[slot].flags, OF_STR) && !of_has(item->flags, OF_STR)) continue; /* Compare Str bonuses */ else if (of_has(borg_items[slot].flags, OF_STR) && of_has(item->flags, OF_STR) && borg_items[slot].pval > item->pval) continue; } /* Wear the new item */ COPY(&borg_items[slot], item, borg_item); /* Note the attempt */ if (i < INVEN_MAX_PACK) test[n] = i; else /* if in home, note by adding 100 to item number. */ test[n] = (i - INVEN_MAX_PACK) + 100; /* Evaluate the possible item */ borg_best_stuff_aux(n + 1, test, best, vp); /* Restore equipment */ COPY(&borg_items[slot], &safe_items[slot], borg_item); } } /* * Attempt to instantiate the *best* possible equipment. */ bool borg_best_stuff(void) { int hole = INVEN_MAX_PACK - 1; char purchase_target[1]; int k; byte t_a; char buf[1024]; int p; s32b value; int i; byte test[12]; byte best[12]; /* Hack -- Anti-loop */ if (time_this_panel >= 300) return (FALSE); /* Hack -- Initialize */ for (k = 0; k < 12; k++) { /* Initialize */ best[k] = test[k] = 255; } /* Hack -- Copy all the slots */ for (i = 0; i < INVEN_TOTAL; i++) { /* Skip quiver slots */ if (i >= INVEN_MAX_PACK && i < INVEN_WIELD) continue; /* Save the item */ COPY(&safe_items[i], &borg_items[i], borg_item); } if (shop_num == 7) { /* Hack -- Copy all the store slots */ for (i = 0; i < STORE_INVEN_MAX; i++) { /* Save the item */ COPY(&safe_home[i], &borg_shops[7].ware[i], borg_item); } } /* Evaluate the inventory */ value = my_power; /* Determine the best possible equipment */ (void)borg_best_stuff_aux(0, test, best, &value); /* Restore bonuses */ borg_notice(TRUE); /* Make first change. */ for (k = 0; k < 12; k++) { /* Get choice */ i = best[k]; /* Ignore non-changes */ if (i == borg_best_stuff_order[k] || 255 == i) continue; if (i < 100) { borg_item *item = &borg_items[i]; /* Catch the keyboard flush induced from the 'w' */ if ((0 == borg_what_text(0, 0, 6, &t_a, buf)) && (streq(buf, "(Inven"))) { borg_keypress(I2A(i)); /* Track the newly worn artifact item to avoid loops */ if (item->name1 && (track_worn_num < track_worn_size)) { borg_note("# Noting the wearing of artifact."); track_worn_name1[track_worn_num] = item->name1; track_worn_time = borg_t; track_worn_num++; } } else { /* weild the item */ borg_note(format("# Best Combo %s.", item->desc)); borg_keypress('w'); borg_best_item = i; return (TRUE); } /* Full rings? Select which to replace */ #if 0 if (item->tval == TV_RING && borg_items[INVEN_RIGHT].iqty && borg_items[INVEN_LEFT].iqty) { /* Left Ring */ borg_keypress('c'); } #endif time_this_panel ++; return (TRUE); } else { borg_item *item; /* can't get an item if full. */ if (borg_items[hole].iqty) return (FALSE); i-=100; item = &borg_shops[7].ware[i]; /* Dont do it if you just sold this item */ for (p = 0; p < sold_item_num; p++) { if (sold_item_tval[p] == item->tval && sold_item_sval[p] == item->sval && sold_item_store[p] == 7) return (FALSE); } /* Get the item */ borg_note(format("# Getting (Best Fit) %s.", item->desc)); /* Define the special key */ purchase_target[0] = shop_orig[i]; /* Purchase that item */ borg_keypress(purchase_target[0]); borg_keypress('p'); /* press SPACE a few time (mulitple objects) */ borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress(ESCAPE); borg_keypress(ESCAPE); /* tick the clock */ time_this_panel ++; /* Note that this is a nice item and not to sell it right away */ borg_best_fit_item = item->name1; return (TRUE); } } /* Nope */ return (FALSE); } /* * Study and/or Test spells/prayers */ bool borg_play_magic(bool bored) { int book, b_book = -1; int what; int i, b_i = -1; int j, b_j = -1; int r, b_r = -1; /* Hack -- must use magic or prayers */ if (!p_ptr->class->spell_book) return (FALSE); /* Hack -- blind/confused */ if (borg_skill[BI_ISBLIND] || borg_skill[BI_ISCONFUSED]) return (FALSE); /* Dark */ if (!borg_skill[BI_CURLITE]) return (FALSE); if (borg_grids[c_y][c_x].info == BORG_DARK) return (FALSE); /* Check each book (backwards) */ for (book = 9-1 ; book >= 0; book--) { /* Look for the book in inventory*/ i = borg_book[book]; /* No such book */ if (i < 0) continue; /* Check each spells */ for (what = 9 - 1 ; what >= 0; what--) { borg_magic *as = &borg_magics[book][what]; /* Require "learnable" status */ if (as->status != BORG_MAGIC_OKAY) continue; /* Obtain "index" */ j = what; /* Obtain "rating" */ r = as->rating; /* Skip "boring" spells/prayers */ if (!bored && (r <= 50)) continue; /* Skip "icky" spells/prayers */ if (r <= 0) continue; /* Skip "worse" spells/prayers */ if (r <= b_r) continue; /* Track it */ b_i = i; b_j = j; b_r = r; b_book = book; } } /* Study */ if (borg_skill[BI_ISSTUDY] && (b_r > 0)) { borg_magic *as = &borg_magics[b_book][b_j]; /* Debugging Info */ borg_note(format("# Studying spell/prayer %s.", as->name)); /* Learn the spell */ borg_keypress('G'); /* Specify the book */ borg_keypress(I2A(b_i)); /* Specify the spell (but not the prayer) */ if (player_has(PF_CHOOSE_SPELLS)) { /* Specify the spell */ borg_keypress(I2A(b_j)); } /* Success */ return (TRUE); } /* Hack -- only in town */ if (borg_skill[BI_CDEPTH] && !borg_munchkin_mode) return (FALSE); /* Hack -- only when bored */ if (!bored) return (FALSE); /* Check each book (backwards) */ for (book = 9 - 1; book >= 0; book--) { /* Look for the book */ i = borg_book[book]; /* No such book */ if (i < 0) continue; /* Check every spell (backwards) */ for (what = 9 - 1; what >= 0; what--) { borg_magic *as = &borg_magics[book][what]; /* Only try "untried" spells/prayers */ if (as->status != BORG_MAGIC_TEST) continue; /* Ignore "bizarre" spells/prayers */ if (as->method == BORG_MAGIC_OBJ) continue; /* Make sure I have enough mana */ if (borg_skill[BI_CURSP] <= as->power) continue; /* Some spells should not be tested in munchkin mode */ if (borg_munchkin_mode) { /* Priest type */ if (player_has(PF_CHOOSE_SPELLS) && book == 1 && what == 1) continue; /* Mage types */ if (!player_has(PF_CHOOSE_SPELLS) && book == 0 && what == 2) continue; } /* Note */ borg_note("# Testing untried spell/prayer"); /* Hack -- Use spell or prayer */ if (borg_spell(book, what) || borg_prayer(book, what)) { /* Hack -- Allow attack spells */ if (as->method == BORG_MAGIC_AIM) { /* Hack -- target self */ borg_keypress('*'); borg_keypress('p'); borg_keypress('t'); } /* Hack -- Allow genocide spells */ if (as->method == BORG_MAGIC_WHO) { /* Hack -- target Maggot */ borg_keypress('h'); } /* Success */ return (TRUE); } } } /* Nope */ return (FALSE); } /* * Count the number of items worth "selling" * * This determines the choice of stairs. * */ int borg_count_sell(void) { int i, k = 0; s32b price; s32b greed; /* Calculate "greed" factor */ greed = (borg_gold / 100L) + 100L; /* Minimal greed */ if (greed < 1000L) greed = 1000L; if (greed > 25000L) greed = 25000L; if (borg_skill[BI_MAXDEPTH] >= 50) greed = 75000; if (borg_skill[BI_CLEVEL] < 25) greed = (borg_gold / 100L) + 50L; if (borg_skill[BI_CLEVEL] < 20) greed = (borg_gold / 100L) + 35L; if (borg_skill[BI_CLEVEL] < 15) greed = (borg_gold / 100L) + 20L; if (borg_skill[BI_CLEVEL] < 13) greed = (borg_gold / 100L) + 10L; if (borg_skill[BI_CLEVEL] < 10) greed = (borg_gold / 100L) + 5L; if (borg_skill[BI_CLEVEL] < 5) greed = (borg_gold / 100L); /* Count "sellable" items */ for (i = 0; i < INVEN_MAX_PACK; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip "crappy" items */ if (item->value <= 0) continue; /* skip our swap weapon */ if (i == weapon_swap) continue; if (i == armour_swap) continue; /* Dont sell my ammo */ if (item->tval == my_ammo_tval) continue; /* Don't sell my books */ if (item->tval == p_ptr->class->spell_book ) continue; /* Don't sell my needed potion/wands/staff/scroll collection */ if ((item->tval == TV_POTION && item->sval == SV_POTION_CURE_SERIOUS) || (item->tval == TV_POTION && item->sval == SV_POTION_CURE_CRITICAL) || (item->tval == TV_POTION && item->sval == SV_POTION_HEALING) || (item->tval == TV_POTION && item->sval == SV_POTION_STAR_HEALING) || (item->tval == TV_POTION && item->sval == SV_POTION_LIFE) || (item->tval == TV_POTION && item->sval == SV_POTION_SPEED) || (item->tval == TV_STAFF && item->sval == SV_STAFF_TELEPORTATION) || (item->tval == TV_WAND && item->sval == SV_WAND_DRAIN_LIFE) || (item->tval == TV_WAND && item->sval == SV_WAND_ANNIHILATION) || (item->tval == TV_SCROLL && item->sval == SV_SCROLL_TELEPORT)) continue; /* Obtain the base price */ price = ((item->value < 30000L) ? item->value : 30000L); /* Skip cheap "known" (or "average") items */ if ((price * item->iqty < greed) && (item->ident || strstr(item->note, "average"))) continue; /* Count remaining items */ k++; } /* Result */ return (k); } /* * Scan the item list and recharge items before leaving the * level. Right now rod are not recharged from this. */ bool borg_wear_recharge(void) { int i, b_i = -1; int slot = -1; int b_slot = -1; /* No resting in danger */ if (!borg_check_rest(c_y, c_x)) return (FALSE); /* Not if hungry */ if (borg_skill[BI_ISWEAK]) return (FALSE); /* Look for an (wearable- non rod) item to recharge */ for (i = 0; i < INVEN_TOTAL; i++) { borg_item *item = &borg_items[i]; /* Skip empty items */ if (!item->iqty) continue; /* Skip the quiver slots from the inventory */ if (i >= INVEN_MAX_PACK && i < INVEN_WIELD) continue; /* skip items that are charged */ if (!item->timeout) continue; /* Where can it be worn? */ slot = borg_wield_slot(item); /* skip non-ego lights, No need to rest to recharge a torch, which uses fuels turns in o_ptr->timeout */ if (item->tval == TV_LIGHT && !of_has(item->flags, OF_NO_FUEL)) continue; /* note this one */ b_i = i; b_slot = slot; } if (b_i >= INVEN_WIELD) { /* Item is worn, no swap is nec. */ borg_note(format("# Waiting for '%s' to Recharge.", borg_items[b_i].desc)); /* Rest for a while */ borg_keypress('R'); borg_keypress('7'); borg_keypress('5'); borg_keypress(KC_ENTER); /* done */ return (TRUE); } /* Item must be worn to be recharged * But, none if some equip is cursed */ if (b_slot >= INVEN_WIELD && !borg_wearing_cursed) { /* wear the item */ borg_note("# Swapping Item for Recharge."); borg_keypress(ESCAPE); borg_keypress('w'); borg_keypress(I2A(b_i)); borg_keypress(' '); borg_keypress(' '); /* rest for a while */ borg_keypress('R'); borg_keypress('7'); borg_keypress('5'); borg_keypress(KC_ENTER); /* done */ return (TRUE); } /* nothing to recharge */ return (FALSE); } /* * Leave the level if necessary (or bored) * Scumming defined in borg_prepared. */ bool borg_leave_level(bool bored) { int k, g = 0; bool need_restock = FALSE; /* Hack -- waiting for "recall" other than depth 1 */ if (goal_recalling && borg_skill[BI_CDEPTH] > 1) return (FALSE); /* Not bored if I have seen Morgoth recently */ if (borg_skill[BI_CDEPTH] == 100 && morgoth_on_level && (borg_t - borg_t_morgoth < 5000)) { goal_leaving = FALSE; goal_rising = FALSE; bored = FALSE; } /* There is a great concern about recalling back to level 100. * Often the borg will fall down a trap door to level 100 when he is not * prepared to be there. Some classes can use Teleport Level to get * back up to 99, But Warriors cannot. Realistically the borg needs * be be able to scum deep in the dungeon. But he cannot risk being * on 100 and using the few *Healing* pots that he managed to collect. * It is better for warriors to walk all the way down to 98 and scum. * It seems like a long and nasty crawl, but it is the best way to * make sure the borg survives. Along the way he will collect the * Healing, Life and *Healing* that he needs. * * The other classes (or at least those who can use the Teleport Level * spell) will not need to do this nasty crawl. Risky Borgs will * not crawl either. */ /* Town */ if (!borg_skill[BI_CDEPTH]) { /* Cancel rising */ goal_rising = FALSE; /* Wait until bored */ if (!bored) return (FALSE); /* Case for those who cannot Teleport Level */ if (borg_skill[BI_MAXDEPTH] == 100 && !borg_plays_risky) { if (borg_skill[BI_ATELEPORTLVL] == 0) { /* These pple must crawl down to 100, Sorry */ goal_fleeing = TRUE; goal_leaving = TRUE; stair_more = TRUE; /* Note */ borg_note("# Borg must crawl to deep dungeon- no recall to 100."); /* Attempt to use those stairs */ if (borg_flow_stair_more(GOAL_BORE, FALSE, FALSE)) return (TRUE); /* Oops */ return (FALSE); } } /* Hack -- Recall into dungeon */ if ((borg_skill[BI_MAXDEPTH] >= (borg_worships_gold ? 10 : 8)) && (borg_skill[BI_RECALL] >= 3) && (((char *)NULL == borg_prepared(borg_skill[BI_MAXDEPTH]*6/10))|| borg_plays_risky) && borg_recall()) { /* Note */ borg_note("# Recalling into dungeon."); /* Give it a shot */ return (TRUE); } else { /* note why we didn't recall. */ if (borg_skill[BI_MAXDEPTH] < (borg_worships_gold ? 10 : 8)) { borg_note("# Not deep enough to recall"); } else { if (borg_skill[BI_RECALL] <= 2) { borg_note("# Not enough recalls to recall"); } else { /* recall unless way out of our league */ if ((char *)NULL != borg_prepared(borg_skill[BI_MAXDEPTH]*6/10)) { borg_note(format("# Way too scary to recall down there! %s", borg_prepared(borg_skill[BI_MAXDEPTH]))); } else { borg_note("# failed to recall when I wanted to"); } } } goal_fleeing = TRUE; goal_leaving = TRUE; } stair_more = TRUE; /* Attempt to use those stairs */ if (borg_flow_stair_more(GOAL_BORE, FALSE, FALSE)) return (TRUE); /* Oops */ return (FALSE); } /** In the Dungeon **/ /* do not hangout on boring levels for *too* long */ if ((char *)NULL == borg_prepared(borg_skill[BI_CDEPTH] + 1)) g = 1; /* Count sellable items */ k = borg_count_sell(); /* Do not dive when "full" of items */ if (g && (k >= 12)) g = 0; /* Do not dive when drained */ if (g && borg_skill[BI_ISFIXEXP]) g = 0; /* Hack -- Stay on each level for a minimal amount of time */ if (g != 0 && borg_skill[BI_MAXCLEVEL] >= 20 && (borg_t - borg_began < value_feeling[borg_feeling])) { g = 0; } /* Rise a level if bored and unable to dive. */ if (bored && ((char *)NULL != borg_prepared(borg_skill[BI_CDEPTH] + 1))) { g = -1; borg_slow_return = TRUE; borg_note(format("# heading up (bored and unable to dive: %s)", borg_prepared(borg_skill[BI_CDEPTH] + 1))); borg_slow_return = FALSE; } /* Rise a level if bored and stastic. */ if (bored && avoidance > borg_skill[BI_CURHP]) { g = -1; borg_slow_return = TRUE; borg_note("# heading up (bored and spastic)."); borg_slow_return = FALSE; } /* Power dive if I am playing too shallow*/ if ((char *)NULL == borg_prepared(borg_skill[BI_CDEPTH] + 5) && k < 13) g = 1; /* Power dive if I am playing deep */ if ((char *)NULL == borg_prepared(borg_skill[BI_CDEPTH] + 1) && borg_skill[BI_CDEPTH] >= 75) g = 1; /* Hack -- Power-climb upwards when needed */ if ((char *)NULL != borg_prepared(borg_skill[BI_CDEPTH])) { /* Certain checks are bypassed if Unique monster on level */ if (!unique_on_level) { borg_slow_return = TRUE; borg_note(format("# Climbing (too deep: %s)", borg_prepared(borg_skill[BI_CDEPTH]))); borg_slow_return = FALSE; g = -1; /* if I am really out of depth go to town */ if ((char *)NULL != borg_prepared(borg_skill[BI_MAXDEPTH]*5/10) && borg_skill[BI_MAXDEPTH] > 65) { borg_slow_return = TRUE; borg_note(format("# Returning to town (too deep: %s)", borg_prepared(borg_skill[BI_CDEPTH]))); goal_rising = TRUE; borg_slow_return = FALSE; } } /* if I must go to town without delay */ if ((char *)NULL != borg_restock(borg_skill[BI_CDEPTH])) { borg_note(format("# returning to town to restock(too deep: %s)", borg_restock(borg_skill[BI_CDEPTH]))); goal_rising = TRUE; need_restock = TRUE; } /* I must return to collect stock from the house. */ if (strstr(borg_prepared(borg_skill[BI_CDEPTH]), "Collect from house")) { borg_note("# Returning to town to Collect stock."); goal_rising = TRUE; need_restock = TRUE; } } /* Hack -- if I am playing way too shallow return to town */ if ((char *)NULL == borg_prepared(borg_skill[BI_CDEPTH] + 20) && (char *)NULL == borg_prepared(borg_skill[BI_MAXDEPTH] *6/10) && borg_skill[BI_MAXDEPTH] > borg_skill[BI_CDEPTH] + 20 && (borg_skill[BI_RECALL] >= 3 || borg_gold > 2000) ) { borg_note("# returning to town to recall back down (too shallow)"); goal_rising = TRUE; } /* Hack -- It is much safer to scum for items on 98 * Check to see if depth 99, if Sauron is dead and Im not read to fight * the final battle */ if (borg_skill[BI_CDEPTH] == 99 && borg_race_death[546] == 1 && borg_ready_morgoth !=1) { borg_note("# Returning to level 98 to scum for items."); g = -1; } /* Power dive if Morgoth is dead */ if (borg_skill[BI_KING]) g = 1; /* Power dive to 99 if ready */ if ((char *)NULL == borg_prepared(99)) g = 1; /* Climb if deeper than I want to be */ if (borg_skill[BI_CDEPTH] > borg_no_deeper) { borg_note(format("# Going up a bit (No Deeper than %d).", borg_no_deeper)); g = -1; } /* Return to town to sell stuff -- No recall allowed.*/ if (((borg_worships_gold || borg_skill[BI_MAXCLEVEL] < 15) && borg_skill[BI_MAXCLEVEL] <= 25) && (k >= 12)) { borg_note("# Going to town (Sell Stuff, Worshipping Gold)."); g = -1; } /* Return to town to sell stuff (use Recall) */ if ((bored && borg_skill[BI_MAXCLEVEL] >= 26) && (k >= 12)) { borg_note("# Going to town (Sell Stuff)."); goal_rising = TRUE; } /* Return to town when level drained */ if (borg_skill[BI_ISFIXLEV]) { borg_note("# Going to town (Fix Level)."); goal_rising = TRUE; } /* Return to town to restore experience */ if (bored && borg_skill[BI_ISFIXEXP] && borg_skill[BI_CLEVEL] !=50) { borg_note("# Going to town (Fix Experience)."); goal_rising = TRUE; } /* return to town if it has been a while */ if ((!goal_rising && bored && !vault_on_level && !borg_fighting_unique && borg_time_town + borg_t - borg_began > 8000) || (borg_time_town + borg_t - borg_began > 12000)) { borg_note("# Going to town (I miss my home)."); goal_rising = TRUE; } /* return to town if been scumming for a bit */ if (borg_skill[BI_MAXDEPTH] >= borg_skill[BI_CDEPTH] + 10 && borg_skill[BI_CDEPTH] <= 12 && borg_time_town + borg_t - borg_began > 3500) { borg_note("# Going to town (scumming check)."); goal_rising = TRUE; } /* Low level dudes need to visit town more frequently to keep up on food */ if (borg_skill[BI_CLEVEL] < 15) { if (borg_time_town + (borg_t - borg_began) > (borg_skill[BI_CLEVEL] * 250) || borg_time_town + (borg_t - borg_began) > 2500 || (borg_time_town + (borg_t - borg_began) > 2000 && borg_skill[BI_REG])) { borg_note("# Going to town (short trips)."); g = -1; } } /* Return to town to drop off some scumming stuff */ if (borg_scumming_pots && !vault_on_level && (borg_skill[BI_AEZHEAL] >= 3 || borg_skill[BI_ALIFE] >= 1)) { borg_note("# Going to town (Dropping off Potions)."); goal_rising = TRUE; } /* if returning to town, try to go upstairs */ if (goal_rising) g = -1; /* Mega-Hack -- spend time on the first level to rotate shops */ if (borg_skill[BI_CLEVEL] > 10 && (borg_skill[BI_CDEPTH] == 1) && (borg_t - borg_began < 100) && (g < 0) && (borg_skill[BI_FOOD] > 1)) { borg_note("# Staying on level to rotate shops."); g = 0; } /* Use random stairs when really bored */ if (bored && (borg_t - borg_began >= 5000)) { /* Note */ borg_note("# Choosing random stairs."); /* Use random stairs */ g = ((randint0(100) < 50) ? -1 : 1); } /* Go Up */ if (g < 0) { /* Take next stairs */ borg_note("# Looking for up stairs. Going up."); stair_less = TRUE; /* Hack -- recall if going to town */ if (goal_rising && ((borg_time_town + (borg_t - borg_began)) > 200) && (borg_skill[BI_CDEPTH] >= 5) && borg_recall()) { borg_note("# Recalling to town (goal rising)"); return (TRUE); } /* Hack -- Recall if needing to Restock */ if (need_restock && borg_skill[BI_CDEPTH] >= 5 && borg_recall()) { borg_note("# Recalling to town (need to restock)"); } /* Attempt to use stairs */ if (borg_flow_stair_less(GOAL_BORE, FALSE)) { borg_note("# Looking for stairs. I'm bored."); return (TRUE); } /* Cannot find any stairs */ if (goal_rising && bored && (borg_t - borg_began) >= 1000) { if (borg_recall()) { borg_note("# Recalling to town (no stairs)"); return (TRUE); } } /* No up stairs found. do down then back up */ if (track_less_num == 0) g = 1; } /* Go Down */ if (g > 0) { /* Take next stairs */ stair_more = TRUE; /* Attempt to use those stairs */ if (borg_flow_stair_more(GOAL_BORE, FALSE, FALSE)) return (TRUE); } /* Failure */ return (FALSE); } /* * Initialize this file */ void borg_init_7(void) { /* Nothing */ } #ifdef MACINTOSH static int HACK = 0; #endif angband-3.5.1/src/borg/borg7.h0000644000175000017500000000254612456456606015360 0ustar chriscchrisc/* File: borg7.h */ /* Purpose: Header file for "borg7.c" -BEN- */ #ifndef INCLUDED_BORG7_H #define INCLUDED_BORG7_H #include "angband.h" #include "object/tvalsval.h" #include "cave.h" #ifdef ALLOW_BORG /* * This file provides support for "borg7.c". */ #include "borg1.h" #include "borg2.h" #include "borg3.h" /* * Determine if an item is likely to be worthless */ extern bool borg_item_worth_id(const borg_item *item); /* * Various functions */ extern bool borg_use_things(void); extern bool borg_check_LIGHT(void); extern bool borg_check_LIGHT_only(void); extern bool borg_enchanting(void); extern bool borg_recharging(void); extern bool borg_crush_junk(void); extern bool borg_crush_hole(void); extern bool borg_crush_slow(void); extern bool borg_test_stuff(void); extern bool borg_takeoff_stuff(void); extern bool borg_swap_rings(void); extern bool borg_wear_rings(void); extern bool borg_wear_stuff(void); extern bool borg_wear_quiver(void); extern bool borg_best_stuff(void); extern bool borg_play_magic(bool bored); extern bool borg_remove_stuff(void); extern bool borg_dump_quiver(void); extern bool borg_stack_quiver(void); extern bool borg_wear_recharge(void); extern int borg_count_sell(void); /* * Attempt to leave the level */ extern bool borg_leave_level(bool bored); /* * Initialize this file */ extern void borg_init_7(void); #endif #endif angband-3.5.1/src/osx/0000755000175000017500000000000012456456606014040 5ustar chriscchriscangband-3.5.1/src/osx/osx_tables.h0000644000175000017500000001415712456456606016364 0ustar chriscchrisc#ifndef INCLUDED_OSX_TABLES_H #define INCLUDED_OSX_TABLES_H /* * Maximum menu ID. * IMPORTANT: see note in main-crb.c if you wish to add menus. */ #define MAX_MENU_ID (150) /* These numbers must agree with the corresponding Menu ID in the nib. */ enum MenuID { kAngbandMenu = 100, kFileMenu = 101, kOpenRecentMenu = 102, kFontMenu = 103, kTileWidMenu = 104, kTileHgtMenu = 105, kGraphicsMenu = 106, kBigtileWidthMenu = 107, kBigtileHeightMenu = 108, kWindowMenu = 109, kNiceGraphicsMenu = 110 }; // File Menu enum { kNew = 1, /* N, 'new' */ kOpen = 2, /* O, 'open' */ kOpenRecent = 3, kImport = 4, /* I, 'impo' */ /* \-p */ kSave = 6, /* S, 'save' */ kClose = 7, /* W, 'clos' */ }; // Window menu enum { kMinimize = 1, /* Not used */ kMinimizeAll = 2, /* Not used */ kAngbandTerm = 4, kTerminal1 = 5, /* Terminal ids are relative to Terminal 1 */ /* ... */ kBringToFront = 13 }; // Font menu enum { kFonts = 1, kAntialias = 2, kTileWidth = 3, kTileHeight = 4 }; // Graphics menu enum { kGrafNone = 1, kGraf8x8 = 2, kGraf16x16 = 3, kGraf32x32 = 4, kGraf8x16 = 5, kGraf64x64 = 6, kBigTile = 7 }; enum { // Event target are windows, not a menu. kWINDOW = -1 }; /* References to HIViews in the dialog window */ static const HIViewID aboutDialogIcon = { 'DLOG', 1 }; static const HIViewID aboutDialogName = { 'DLOG', 2 }; static const HIViewID aboutDialogCopyright = { 'DLOG', 4 }; /* Event handler specification */ struct CommandDef { int evtClass; // Eventspec class - char-style constant eg 'quit' int evtType; // Eventspec type - enumeration EventHandlerUPP handler; int targetID; // Menu target (0 if no target) void *userData; // Event user data (Not used currently) }; typedef struct CommandDef CommandDef; #define HANDLERDEF(func) \ static OSStatus func(EventHandlerCallRef inHandlerCallRef, \ EventRef inEvent, \ void * inUserData ) HANDLERDEF(CloseCommand); HANDLERDEF(QuitCommand); HANDLERDEF(TileSizeCommand); HANDLERDEF(FontCommand); HANDLERDEF(RestoreCommand); HANDLERDEF(ToggleCommand); HANDLERDEF(TerminalCommand); HANDLERDEF(KeyboardCommand); HANDLERDEF(MouseCommand); HANDLERDEF(ResizeCommand); HANDLERDEF(UpdateCommand); HANDLERDEF(AboutCommand); HANDLERDEF(ValidateMenuCommand); HANDLERDEF(OpenRecentCommand); HANDLERDEF(ResumeCommand); HANDLERDEF(CommandCommand); HANDLERDEF(AngbandGame); /* WARNING: This list must be grouped by (func, userData) pairs */ const CommandDef event_defs [] = { /* * Start game event - posted into the event queue after * any potential open game events from the Finder */ { 'Play', 'Band', AngbandGame, 0, NULL }, /* Quit the game */ { 'appl', kEventAppQuit, QuitCommand, 0, NULL }, /* Reactivate the game after it's been in the background */ { 'appl', kEventAppActivated, ResumeCommand, 0, NULL }, /* "About Angband" command */ { 'cmds', kEventProcessCommand, AboutCommand, kAngbandMenu, NULL }, /* Execute "boring" commands - "Save", "Open", and "Show Fonts" */ { 'cmds', kEventProcessCommand, CommandCommand, 0, NULL }, /* Menu item within the "Open Recent" submenu */ { 'cmds', kEventProcessCommand, OpenRecentCommand, kOpenRecentMenu, NULL }, /* Selection of a terminal within the Window menu */ { 'cmds', kEventProcessCommand, TerminalCommand, kWindowMenu, NULL }, /* Activating a menu option */ { 'cmds', kEventProcessCommand, ToggleCommand, kFontMenu, NULL }, { 'cmds', kEventProcessCommand, ToggleCommand, kBigtileWidthMenu, NULL }, { 'cmds', kEventProcessCommand, ToggleCommand, kBigtileHeightMenu, NULL }, { 'cmds', kEventProcessCommand, ToggleCommand, kGraphicsMenu, NULL }, /* Alter tile width and height */ { 'cmds', kEventProcessCommand, TileSizeCommand, kTileWidMenu, NULL }, { 'cmds', kEventProcessCommand, TileSizeCommand, kTileHgtMenu, NULL }, /* Font panel - selection of a new font */ { 'font', kEventFontSelection, FontCommand, 0, NULL }, /* Font panel closed */ { 'font', kEventFontPanelClosed, FontCommand, 0, NULL }, /* Application window focus changes (update font focus status) */ { 'appl', kEventAppActiveWindowChanged, FontCommand, 0, NULL }, /* Update seldom-changed menu item statuses on each menu open */ { 'menu', kEventMenuEnableItems, ValidateMenuCommand, 0, NULL }, /* Keyboard keydown event */ { 'keyb', kEventRawKeyDown, KeyboardCommand, 0, NULL }, /* Keyboard key repeat event */ { 'keyb', kEventRawKeyRepeat, KeyboardCommand, 0, NULL }, /* Mouse click in a term */ { 'wind', kEventWindowHandleContentClick, MouseCommand, kWINDOW, NULL }, /* Close a term */ { 'wind', kEventWindowClose, CloseCommand, kWINDOW, NULL }, /* Activate a term (term brought to front) */ { 'wind', kEventWindowActivated, RestoreCommand, kWINDOW, NULL }, /* A term requires redrawing */ { 'wind', kEventWindowUpdate, UpdateCommand, kWINDOW, NULL }, /* Resize and move of a term, update term positions and sizes */ { 'wind', kEventWindowResizeCompleted, ResizeCommand, kWINDOW, NULL }, { 'wind', kEventWindowDragCompleted, ResizeCommand, kWINDOW, NULL }, }; /* * Construct a list of events that should be flushed in order to flush input */ static EventTypeSpec input_event_types[] = { { 'keyb', kEventRawKeyDown }, { 'keyb', kEventRawKeyRepeat }, { 'wind', kEventWindowHandleContentClick }, }; #define CMDHANDLER(x) \ static void x(HICommand *command, void *data); CMDHANDLER(toggle_antialias); CMDHANDLER(reset_wid_hgt); CMDHANDLER(set_graphics_mode); CMDHANDLER(set_tile_width); CMDHANDLER(set_tile_height); CMDHANDLER(set_nice_graphics_fit); CMDHANDLER(set_nice_graphics_square); static struct { UInt32 id; // command id void (*handler)(HICommand *command, void *data); // handler void *data; // data bool refresh; // Change requires graphics refresh of main window. } menu_commands[] = { { 'anti', toggle_antialias, NULL, true }, { 'rewh', reset_wid_hgt, NULL, true }, { 'graf', set_graphics_mode, NULL, true }, { 'twid', set_tile_width, NULL, true }, { 'thgt', set_tile_height, NULL, true }, { 'ngfi', set_nice_graphics_fit, NULL, true }, { 'ngsq', set_nice_graphics_square, NULL, true }, }; #endif /* !INCLUDED_OSX_TABLES_H */ angband-3.5.1/src/osx/Angband.xml0000644000175000017500000000417612456456606016124 0ustar chriscchrisc CFBundleName$NAME$ CFBundleDisplayName$NAME$ (OS X) CFBundleExecutable$EXECUTABLE$ CFBundlePackageTypeAPPL CFBundleSignatureA271 CFBundleVersion$VERSION$ CFBundleShortVersionString$VERSION$ CFBundleIconFile$NAME$ CFBundleIdentifiernet.thangorodrim.$NAME$ CFBundleInfoDictionaryVersion6.0 CFBundleLongVersionString $VERSION$, Copyright $COPYRIGHT$ NSHumanReadableCopyright Copyright © $COPYRIGHT$ CFBundleGetInfoString $VERSION$, © $COPYRIGHT$ CFBundleDocumentTypes CFBundleTypeExtensions* CFBundleTypeIconFileSave CFBundleTypeNameAngband saved game CFBundleTypeOSTypesSAVE CFBundleTypeRoleEditor CFBundleTypeExtensions* CFBundleTypeIconFileEdit CFBundleTypeNameAngband game data CFBundleTypeOSTypesTEXT CFBundleTypeRoleEditor CFBundleTypeExtensions* CFBundleTypeIconFileData CFBundleTypeNameAngband game data CFBundleTypeOSTypesDATA CFBundleTypeRoleEditor angband-3.5.1/src/osx/Data.icns0000644000175000017500000043673012456456606015604 0ustar chriscchriscicns=Øis32–…†óòêòI…ô²²¥¦¥­ÍZ„ õÈ·°È´˜àûmƒ ö½¬³½äÃüÁÑ‚ ÷À½ÆÜ¥ûùùÛóò¤€ ùÀýñ‰¡­ÅÉ­}€ úɼþò“½àÚ¨Šè€ûÖÅËÅÜ—€ÿé£ ýÚÉÃÿ3zæ¦Ï«,΀ þ¿¾È{-ÿ…N)Á†I€ þËßÅ6äœBýºÖ+€ ÿÌÑÁ4ÿ&¹ÿ4ÿJq€ ÿØÒÓ,£ÌCi@SRÿ¶“•Ƶ‡¼ASINÕ…†óòêòI…ô²²¥¦¥­ÍZ„ õÈ·°È´˜àûmƒ ö½¬³½äÃüÁÑ‚ ÷À½ÆÜ¥ûùùÛóò¤€ ùÀýñ‰¡­ÅÉ­}€ úɼþò“½àÚ¨Šè€ûÖÅËÅÜ—€ÿé£ ýÚÉÃÿ3zæ¦Ï«,΀ þ¿¾È{-ÿ…N)Á†I€ þËßÅ6äœBýºÖ+€ ÿÌÑÁ4ÿ&¹ÿ4ÿJq€ ÿØÒÓ,£ÌCi@SRÿ¶“•Ƶ‡¼ASINÕ…†óòêòI…ô²²¥¦¥­ÍZ„ õÈ·°È´˜àûmƒ ö½¬³½äÃüÁÑ‚ ÷À½ÆÜ¥ûùùÛóò¤€ ùÀýñ‰¡­ÅÉ­}€ úɼþò“½àÚ¨Šè€ûÖÅËÅÜ—€ÿé£ ýÚÉÃÿ3zæ¦Ï«,΀ þ¿¾È{-ÿ…N)Á†I€ þËßÅ6äœBýºÖ+€ ÿÌÑÁ4ÿ&¹ÿ4ÿJq€ ÿØÒÓ,£ÌCi@SRÿ¶“•Ƶ‡¼ASINÕs8mk€€€€€€‚€ÿÿÿÿÿùþ¤€ÿÿÿÿÿÿÿÿ°€ÿÿÿÿÿÿÿÿÿ¶€ÿÿÿÿÿÿÿÿÿÿŒ€ÿÿÿÿÿÿÿÿÿÿùòå€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ùùùùùùil32 &Ž ˆìëæÈrŒì‡ÛÚÕÎØ‹í¢Ãé®±ª®²©Ä¼£«¶ÁŠîËÔÓÎÏÐÍÎÐÎÕÑËò÷À‰îÎÔÑ¿ÂÇÒÔоÀÊбÿ÷ÀˆïÆÐÉ»¼ÆÊÏȺ»Èɾ±ÿÿøÀ‡ðÙØÖרØÛÖ×ÖÝÞÙɯor‡—†ñż´¯±¾É¶¶®ÈÏǨžƒxxw”`…òÝààßßáÞßàßßàÝÚÒľ¿¿À¦…óÎÅÃÓÕϸÑ×ÍÕÍ»¶ÆÎÊÀ´Üá†ôÛØÙÜßÛÖÞÞØÞÚ×ÕÝÛÛÙÖçò†õÉÞàÍÐÒÏÏ×ÝÌÈÐÏÒÏÎÓÑìö†öºØÓÂÄÇÃÅÐд+šÁÇÄÂÇÆíö†÷€êæêìæèèéèZx˜îìçèçðø2‚øÏÜÓ¶ÖÒ¸¼ËѾ¼{÷mpluw‹Ô VÅ‚ùè€êìééêíéêìœzyñÿÿÙmcÿHƒúÚå߯ÊÒáÏÎÆÈßõN݃ÿ®G„ûæìçÝÝåçààÚÙéDz…ÿk„ ûÙààÞáäìâê€ø eE­ÎÎ×Å£lDƒüÂÏÎÉË×ßÌßúúw jÕέ“¤¹ä&H‚ýòöøöõôðõùû® cûûíA„¡{,&‚þ¹ßæàËÈÁßîû=&ãýÌ57Œ15>‚þñõôôòôñóøÇuþö;5ïþœ€'5‚ÿÌéëÑÖÞëîè…§ÿŸ ¤ÿÿ§¯ ?‚ÿÖíêÝÝæêîç¬ÿpÅþþ]/ÿ9!‚ÿôîéèôõäóô¡ÿ—†ï3ë+JƒÿÚÓÌÆáÜÅâÛ­!-ùþ@..f&"Eƒˆÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ˆìëæÈrŒì‡ÛÚÕÎØ‹í¢Ãé®±ª®²©Ä¼£«¶ÁŠîËÔÓÎÏÐÍÎÐÎÕÑËò÷À‰îÎÔÑ¿ÂÇÒÔоÀÊбÿ÷ÀˆïÆÐÉ»¼ÆÊÏȺ»Èɾ±ÿÿøÀ‡ðÙØÖרØÛÖ×ÖÝÞÙɯor‡—†ñż´¯±¾É¶¶®ÈÏǨžƒxxw”`…òÝààßßáÞßàßßàÝÚÒľ¿¿À¦…óÎÅÃÓÕϸÑ×ÍÕÍ»¶ÆÎÊÀ´Üá†ôÛØÙÜßÛÖÞÞØÞÚ×ÕÝÛÛÙÖçò†õÉÞàÍÐÒÏÏ×ÝÌÈÐÏÒÏÎÓÑìö†öºØÓÂÄÇÃÅÐд+šÁÇÄÂÇÆíö†÷€êæêìæèèéèZx˜îìçèçðø2‚øÏÜÓ¶ÖÒ¸¼ËѾ¼{÷mpluw‹Ô VÅ‚ùè€êìééêíéêìœzyñÿÿÙmcÿHƒúÚå߯ÊÒáÏÎÆÈßõN݃ÿ®G„ûæìçÝÝåçààÚÙéDz…ÿk„ ûÙààÞáäìâê€ø eE­ÎÎ×Å£lDƒüÂÏÎÉË×ßÌßúúw jÕέ“¤¹ä&H‚ýòöøöõôðõùû® cûûíA„¡{,&‚þ¹ßæàËÈÁßîû=&ãýÌ57Œ15>‚þñõôôòôñóøÇuþö;5ïþœ€'5‚ÿÌéëÑÖÞëîè…§ÿŸ ¤ÿÿ§¯ ?‚ÿÖíêÝÝæêîç¬ÿpÅþþ]/ÿ9!‚ÿôîéèôõäóô¡ÿ—†ï3ë+JƒÿÚÓÌÆáÜÅâÛ­!-ùþ@..f&"Eƒˆÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ˆìëæÈrŒì‡ÛÚÕÎØ‹í¢Ãé®±ª®²©Ä¼£«¶ÁŠîËÔÓÎÏÐÍÎÐÎÕÑËò÷À‰îÎÔÑ¿ÂÇÒÔоÀÊбÿ÷ÀˆïÆÐÉ»¼ÆÊÏȺ»Èɾ±ÿÿøÀ‡ðÙØÖרØÛÖ×ÖÝÞÙɯor‡—†ñż´¯±¾É¶¶®ÈÏǨžƒxxw”`…òÝààßßáÞßàßßàÝÚÒľ¿¿À¦…óÎÅÃÓÕϸÑ×ÍÕÍ»¶ÆÎÊÀ´Üá†ôÛØÙÜßÛÖÞÞØÞÚ×ÕÝÛÛÙÖçò†õÉÞàÍÐÒÏÏ×ÝÌÈÐÏÒÏÎÓÑìö†öºØÓÂÄÇÃÅÐд+šÁÇÄÂÇÆíö†÷€êæêìæèèéèZx˜îìçèçðø2‚øÏÜÓ¶ÖÒ¸¼ËѾ¼{÷mpluw‹Ô VÅ‚ùè€êìééêíéêìœzyñÿÿÙmcÿHƒúÚå߯ÊÒáÏÎÆÈßõN݃ÿ®G„ûæìçÝÝåçààÚÙéDz…ÿk„ ûÙààÞáäìâê€ø eE­ÎÎ×Å£lDƒüÂÏÎÉË×ßÌßúúw jÕέ“¤¹ä&H‚ýòöøöõôðõùû® cûûíA„¡{,&‚þ¹ßæàËÈÁßîû=&ãýÌ57Œ15>‚þñõôôòôñóøÇuþö;5ïþœ€'5‚ÿÌéëÑÖÞëîè…§ÿŸ ¤ÿÿ§¯ ?‚ÿÖíêÝÝæêîç¬ÿpÅþþ]/ÿ9!‚ÿôîéèôõäóô¡ÿ—†ï3ë+JƒÿÚÓÌÆáÜÅâÛ­!-ùþ@..f&"Eƒˆÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚l8mk(_ccccccccccco`oÿÿÿÿÿÿÿÿÿÿÿÿÿûÞItÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýYtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýWtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöUtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá$tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúitÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿotÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmatÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬âÿqtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿítÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqŸÿztÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿêtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm'ÿátÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm£ÿltÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÿìtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô&tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿj3y‚‚‚‚‚‚‚‚‚‚‚‚Àÿÿÿÿÿÿÿý@QŒ¡ ‡Qit32v¶ˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç©æååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæå傿åæååæååæååæååæåããáßßÜÚ×ÒÎÊľ°ß¶¸%è‚çæëïéæçæèëçìïèççæíîçíîçîîçîíææäãæäßÞÚÚÜÔËÅ¿±¿ä¯·%èçæëÕ¼ÞêæêäÒççæëοãéæêËÁæèçéÈÀçèÄÆè€çÂÈèæäéÓÖâÞÝÕ°»ÏÆ¿¹ ÏÚ®¶%è€ç@æêל²™äêÝŸ˜çæìÊŸ®¢éíâ©§ëì¼¥¥­ìì¶©¡´ìì°¬ž»ìèÀ‰¹èÝßœ¥Š´ÍÁ”d¸ÚÕ¬µ%è€çAæïµ¼È„ÏíßЦäæî¨Ê¹‰Ûð£Ð±ßìŸÖ¨’äèžÚ¡˜éâžÜšŸéåÚ±·èâϘςœÑÁ±£çÌÖ¨´%è€çBæî¶£¯ªÂíéä¤åç묢²§Òí§¡´¥×ꥤ´£Ý椤µ£äÞ ¥·¦æåñ¸¶êä͘¨šÒÅÆˆ–èÛÎÕ¥³%è€çCæíÄܟÐìçÞ¡ãæî²Þ™Üðª”Ü™áؚæì™¥Óœê钮͡íäì´³êâÛ‚¶³ž×ÇĉŽáæÚÍÕ£²%éèCé㨡¯êêܪž¬ßíÛ¥ ºìëÖ¢Ÿ¿ìëÑ¢ŸÅììÌ¢ŸËììÇ¢ŸÐìêÁŸž¿ææ¶›™ËÔÌ€sÃôâÚÍÕ ±%é‚è)êçÙêéèçäçäççëäÚëèçìâÜìèçëáÝìèçìÞßìçèìÝáìçè€åâåäåÓÙÜÔÎú§ÉøêäÚÍÔŸ°%é„èëè=éèéèèçèëçèèçéêçèèçêëçèèçêêçèèçêêçèèéèèçåäâäßÙÖÐȾ¬ÃüñëãÚÍÕž ¯%êƒéççé çèèééèèéèéé€èç€éçç€éèçè€éèééçè€çæãáßÜØÒȾ®¼ý÷òëãÙÌÕ ®%êƒéïí€éêïì€éëìçíééëëèíèéëïë€é(ëïëééèíéêìéèíèêêçæééâÝÙÓÏÆ²¸ýû÷òëâÙÌÖ ­%ê‚éGêÆ©äêéé­ééê㪣Éíêß§£Îíéå´¸íèêã°ÀîçíÒ¢©ÛëíÍ «Þêè×£ÈâØÖ¼‹£¸úþû÷òëâÙÍÕ ¬%ê€éJèëß®˜ßëëÛ«žçèñ´¸ÄŠäò­¿»éíÏ¡¨îçíÌŸ²ðçëžÓ¡¦ðæ›Ø˜®ïç½”¼æØÔ¦€¸úÿýû÷òëâÙÍÖ «%êƒéHì£Þëèëæ¦åèîªÁ¨›×ð¦Â¦ÛëîÔ¨íèèðϱïêߤĞ¥ì٥œ©êåð´ºæÙÓÖ™›·ùÿþýû÷òëâÚÍÖ ª%ë‚êJìî£æîéíè§îëï¯Õ¥Öò¨“×¢ÝëòÕ«õéèôϵ÷êå—¤Ô¢îà’«Ð¤îæô´ÀìÙÕÙš¢¼øÿÿþýû÷òëãÚÍ× ©%ëê;ëåÅ”¾äíãÀ—Åäñŕžéñ½š¾¢íëÞ²˜ÏéìÜ®žÒé𥬰´ðퟱ«¼ðèÓ£ÒÝÖº‡‰«ú€ÿ þýûöñëãÚÎØ ¨%ëê<ìã¼À¼àîà¼À¼ãëìDZÞíêê³àìíÖº¾ÃéíÓ»¾Åëëå¹»éêì⵿ëéêÆº·Èß×°¢•¦ûÿ€þ ýüúöñêãÛÎØž §%ì‚ë:ìòñòíêíòñòìëëðóíêëëñòíëëîòññëêïòòñëëìòòìëëíòòëêéîîìæÝØÖоú„ÿ ü÷ðèáÙÎÙž ¦%ìƒëêèê€ëéèé€ëéèê€ëèèê€ë éèêëëêèèêëëêèè€ë$êééëêêèåãâÞØÐȼºíñíëìïñöûýÿýöêÜÌÖž ¥%ìƒëìð€ëêïóìêëëðóìëëêñò€ëêíïëòòëòñ€ë%êîíëêêèìçâÞØÔÒĵª›Ž‡}~‡’«ÀÓäëÜÝœ ¤%ìë"êíêÕéìêïÕÀåíêîÒÂçíêîÎÄéìêðáØíëëìÈÉì€ë+ÅÌíëêñÚßíêêîÖÛåÞÜͦ±¼¬Ÿˆjs|wwlYdjgnq}­Íæ¥ £%ìëRíå§”ãìïÕ ´ ëð΢±¥íñÇ¥¬ªïîÕ•©ðéñ¹¬¥·ð𳯡¿ñíÆÀòèíÀŠÂêÞÛ”Ÿ€©´ŸdhRvyUaOs|qMUDs‘Ï¡¢&íìQíæØ¥áíô²ÈÆ‰Ùø«Î½Œàõ§Ôµ‘äïâÇ­ðëì¢ß¥›îç á¢ïëá·¾ôêêÞ±¿ìäÇ™Åw”¾‘o„NmŽoewIlˆfeqJlsj£‰£&íìSëîï¤âíò¶¦´¬Ì÷¯¥¶ªÖ󫥸¨ÛîôÖªñì騨º§è㤨º©ëêø¾¼ôêéö¶¾ìæÄ•˜ž‘Ä•oqrp›xcijn”p`gfoŠkc¡&îƒíRé¡áîô¿ŠäŸÛø¶ãœáö­—áœèíñѨñëò©Ù ðï–²Ò¥óëôº»õëêò³½íåÕ|¹£šÊªb—{¨Wo¡ƒUi‚•‰yŒ5 &î€íVìï䬩àò䪤¹ðïਣ¾ñðÛ¦£ÃñðÒ£ž·ìòÑ¥£ÐññË¥£ÕñïߟÃðí¾žÅèä®—”ÅÇÁŽ}~ª¬ªuz¥§£yry¡ž›—’Œ Ÿ&î‚íTìåèåìíðêÞðíìðéßñíìðçáñíîéæèæíìñãäñìíñâåñìîèççèíìæåããçãáÍÔÓÊÇñ¹¹¶¶´§³´±³°¦°®«©¦¢š¢HŸ&îƒíïîïííìíð€í7ìîðìííìîðìííîïîïííìïïìííìðïìííîïïîíìíììêæåáàÙÕÐÌÈÇ¿¿¾½¿€½ ¼¼¾º¹·µ³°«¯~Ÿ&ïƒîìííîîííîí€îììîìì€îííîìîîíìí€îíìí€îíìííîîììëêèçãáÜÙÖÒÎËÊÉÈÇÆÅÆ€Ç ÅÆÄÄÂÀ¾¼¸¼œ &ïƒîôò€îïñìòîîïõñ€îïõñîîíñðíòíîðõð€îñõïîîíñôïîîíòëîîéèëâäßÚÙÛÙÒÐÏÏÔÔ€Ï ÑÔÍÒÎÌÊÈÇÃɧ &ï‚îSïˬéïîë±¥ÈòííÁµðîî뼸ñíñ੨×òîè´Åóíïå±Éóìïã®ÎóìóÌ¢°æìíž®ßáÞÆ›ËÛÖ×¾˜ÍÙÖØ¦“­ØÔÓÑÏÍÕ° &ð€ïUîñ䲜åðöÀµÑ‰æõÚ­¦ïî󨧧òíöªË¶šòóÑ¢·öíóËžº÷íòÇ›Áöïéß”º÷ߛ܋½ìß°ÉâÝ׫Ìßá¾Ê}ÌßÙÙØÖÞ· &ðƒïRò§ãðö´Ä°Ôôñé«îïîôá©ñîïªÊ¦¢åðöÔ¶õîíùɸöîíùþöòڭİøÎ¯¿™²îäî¨Êèââé¢Îäé³³¬’½çÞßÝÛã½ &ð‚ïSñô§ëòõ»×­Óôóé­öðíöá«ùïñ§œÛ¤èïùÔ¹üííüɼýííüÂÃûðᓵϪùغǮñçóªÕïåçï¥ÚììÀˆÇ¯¾ìããâàé &ðïMðêɘÂèöѕȟëòåÁ›Ìëò仚Ïë÷¹£¿«ôðá²¢×îðÞ«£Ùïðܧ§Üð𜼪Çõì—À¤ÍòèΙ²ÞìåÉ•µßî×ÚÜë€çåîÅ &ñðTòéÁÅÁæòòеßóòâÀÄÃëôß¿ÄÅíñïĺéñóÙÀÃËðóÓÁÂÎñòÐÁÁÐòòå¸ÈòïòáµËñîížÙñéÂÁ½ÝîïÓ°ÔïêëêêçñÇ &ñ‚ð8ñø÷øòððõøóïðóø÷øñïóø÷÷ñðñ÷øòððôøøöðïõøøöððöøøõðïòøöððïò÷õ€ïõõöòíïõõöñîîòõñìíëõÊ &òƒñïîï€ñïîð€ñîîï€ñîîï€ñîîðññðîîðññðîïðññðîîðññðîï€ñðîï€ðîííïððîíî€ðîíîïîìöË &ò‚ñðõùóðñðòõ€ñðöùòññð÷øñ÷øñøø€ñðôôñ ùöðññòùöðñðóùõðñðóùôïðïóùóïðïôøóïðîøÍ &òñðõßÄèôðôîÜññðõ×ÇíóðôÓÉðòñôÐË€ñ.òÍÎòñð÷ããóðòïÈÕôðóíÆÙôðóêÅÛõðôçÄàõðôäÃãôïõáÄæôð€ñîøÍ &ò€ñNðõࣺ îô禟ñðöÓ¦µ©ó÷Ì©°¯õ÷Å«¬µöö¾°©¼÷ôÐ’¿øïö±¶¡Ì÷󭹞Ó÷𨻜Ùöí¦¼œàö裼œæö䣻žìò€ñïùΠ&ó€òUðû½ÄÓŠØùêÙ­ïñú°ÓÁåûªÙ¹”ê÷¦ß°™ïó¥ä¨Ÿòó翽ùóç¥èš­ûà§ç”µþØ­ç¼ÿвãŒÄÿɸ݊ÌÿÁÀ×ŠÔøñòòðúÏ &ó€òUðù¿ª·²Ìùôï«ðò÷´©º¯Üù¯¨½­áõ­­½ªçñ«¬¾«ìñþɼúô⥮¿®øÝ§®½°ýÕ§°»´ÿͦ²º»ÿȦ´¶Àÿ¨µ´ÇúðòòðúÏ 'ô€óUòúÍŠè¨Úøóê©ïòú¼”é¡çý²›ç¡íúª¤ã¢òø¡­ß¤öñúƺúòñ“ÀЯüìŽÊȵþçŠÓÀ¼ÿàˆÚ¸ÄÿÙ‡à±ÌÿÒˆæ«ÖùòóóñûÏ 'ôóLôî°©¸õõ毢±éøå­¨Ã÷öà«§ÈøöÛª§Î÷÷Öª§Õ÷öͤ£ÅôøÊ©¨àö÷΍åõöÀª«êõõºª®îôó¶©±ñô𳪴ôóñûÏ 'ôóLòõòãõôóñëîëòóöîå÷óòöíæ÷óò÷ëç÷óò÷éé÷òôîìííóó÷æí÷òó÷äîöòóöäñöòôõãòõòôôãóõòõòãôôóñûР'ô„óöó,õôõóóòôöòóóòôöòóóòõöòóóòõõòóóôõôôóóòöõòóóòöôò€óöóòóóòöô€óòö‚ó÷ƒóñûР'õƒôóóôòóóôôóóôó€ôòó€ôóôôóôôóòóóôôóôóóôôóòôóòôóòôóôó€ôóôò‚ôòüР'õƒôúøôú÷€ô&ö÷òøôôõû÷ôôó÷õóøóó÷õô÷óô÷úõôôóøóõöôôøúõ€ôøúôùùôùñøõôõøòø‚ôòüР'ö‚õLöѲðöõõ̶õõöÔùôó¾øôøç­­Ýøøâ«¯áøõì¶Ïúóúר´ë÷öæ¯Ùúó÷â°áùô÷Þ¯æøôøÂ§Âöõö¾¨Æøô€õóþÑ 'ö€õUôøê· ë÷øç³¦óôý¾ÁΑñûÝ«¬øóü¯Ð»žøú©×³¥úøÐ¢¿üôó£ã ·üõÉŸÌýóõÆ ×ûõòÀÜùùÛ©å‹ÚÿÒ®à‹ãùôõõóþÑ '÷ƒöRø¬éøõ÷ó¯ñõü³Ë²£ãùúç®÷õö¯Ð«¦íõ®Ï¨ªòõÿϽüøå®Í¤²øóÿÂÉýõôÿ¿ÔûõôþµÚùýɽÀ ÈÿÂüŸÏýôööôÿÑ '÷‚öSøû­òúôùõ±úöü¹˜à¯âùýè±ÿöø¬¢à©ïø¦¦á©ôõÿÏÃÿ÷ì›´Ú®ûóÿÂÐÿôõÿ¿ÛÿôõÿµâþûÔ’ÏÂÃÿÌ’Õ¼ÍþõööôÿÑ '÷öT÷ñÏœÈïùïËŸÎðþÏ̧õøëÀžÕòþ¾¨Ä°úü¶¯¿¶üöä°¨àöú¨º´Åýõਰç÷õݧ·èøôØ¡¼éúê—ͤãþã—ϤéùõööôÿÒ '÷öMøïÆÊÆìúìÆÊÆïø÷ÐºéøøåÄÉÊó÷õÈ¿ï÷÷óÅÁó÷ùÙÅÇÓ÷øí¿ÈööøÓÇÅÛùöÐÈÅÞúôÌÉÄâøù߸ÙúôúÛ¸Þúõ€öôÿÒ '÷‚öK÷þýþøõøþýþ÷ööüþùööùþýý÷ö÷ýþøöö÷ýþøöõûþþüööøþý÷ööüþþûõöüþþúõöýýþúööúþûõöõúþûõöôÿÒ 'øƒ÷õôö€÷õôö€÷õôö÷÷öôôõ€÷õô€÷öôôö÷÷öôôö÷÷öôô€÷öõõö÷÷öõõö÷÷öõõ€÷öõö€÷öõö‚÷õÿÓ 'ø„÷ü€÷öøû÷ ýÿø÷÷öýÿø÷÷öùû÷þþ÷ÿý€÷øÿýöŸ÷õÿÓ 'ùø.÷úøáöù÷ûõâøø÷üÝÍôú÷ûÚÐ÷ù÷ýîåúøøùÓÕùøùøÐØû÷ùöÎÛûŸøöÿÓ 'ùø0úñ°›ðúúî«£ø÷ýÙ«º®úþÒ®µ´ýûá²þöÿô®Âþý¼¸©Êþü·»¥Òþ÷øöÿÓ 'ùø0ùòã­íúùñß²õ÷ÿµ×Æ“ëÿ¯Ý½˜ðûîÒ¶ý÷ø©è¬£úó¨ë¥ªþí©ìž²ý÷øöÿÔ 'ùø/÷úû¬íû÷üõ°õøý¹®¿³áÿ³­Á±æúÿà³ýøõ°°Ã¯ôıû課óúƒøö÷–øöÿÔ 'úƒù.õ©íûøúï­õøÿÀ—î¤ìÿ¶Ÿì¤ôúýܱþ÷þ¥°ã¨üûºÛ¬ÿö—ÄÕ³ÿø‚ùþø÷•ù÷ÿÔ 'ú€ù1øûïµ¥²ëÿ볦µïþê°¬Èýü殫ÍþüÝ«¥ÁøþÛ­«ÚýýÔ­«àýþÏ­«åýøùûÛôüö”ù÷ÿמ(û‚ú.ùñõòøûøñõñùúýõëýúùýóìýúûöòôòúùþïïþùùþîñýùúýìóýùú÷ÿOAóÿõù‘úùôÿÄŸ(ûƒúüûü€ú&üûüúúùûýùúúùûýùúúûüûüúúùüüùúúùýüùúúùýüù‚ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(ûƒúùúø€úùúùúúùùúùúúùùúù€úøù€úùúùù€úùúú÷úúù„úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(û‚ú"ûýøþúúûý÷þúúûüøþúúüüùýùúüÿüúúùýûúýù‚úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (ûƒú)¿¬Îýúø»­Òþûô¶®Ùþûð³¯ÝþúöÂÅÿøþ篳æþùú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û€ú-ùÿÒµâêÿɽۑñÿÁÅÒ•õÿºÍÉšúÿ߬´ÿøÿ­Ü¶©ÿùúöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(ü€û.ùÿÂ˾£×ÿ¼Ìº¥Þÿ¶Î¶§çÿ³Ð³©ìýÿäµÿûø²Ó¬­öüû÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü€û/ùÿ˗ܺÔÿØàµÝÿ»šâ±æÿ´Ÿä¯íýÿä¸ÿúû©ªã¬ùüûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ý€ü0ûÿå›Ô§òÿÜÓ§öÿÔ¡Ñ«ûÿ̥ͯÿýïÀ¤ßúÿ»²ÃºÿûüúÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýü/ûÿݽæÿûþÚ½êÿûýÕ¿îÿüüÑÀñþÿæÉÍÒüýùÊÆøýüüûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ýƒüþÿþ€üÿÿþ€üÿÿý€üÿÿýüüþ€ÿ€üÿÿýü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ýƒüúùú€üúùû€üúùû€üúùûüüûùùú€üúú‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚üûþÿýüüûüÿ€üûýÿüÿÿüÿÿ€üûþþ‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýü"ûÿéÎòþûþøæüüûÿöçýüüÿÞÓúýüþÛÕûýûÿïìþ‚ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ€ý$üÿì«Ã¨úÿó®¦ýüÿí©¬ÿüÿײ¹¸ÿÿÏ´µ¿ÿÿáÂÿûý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þ€ý$ûÿÇËÚ‘âÿôãµúýÿóà·üüÿ³ßÁ›õÿ¯æ¹ ùÿòÑÃÿüý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(ÿ)ýÿÅÍÁ¥ÜÿÿøµûþÿºÐ¸©ëÿ¶Ó¶«ðÿÿå¸ÿþþÿÞÂÿÿô´Õ­µ€ÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(ÿdýÿΙ߽Ùÿÿø¶üþÿ¿ä³êÿ·¢ç±ñÿÿåºÿþþÿÞÄÿÿú¦²ã±ÿþÿè¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(ÿ\þÿçœ×©öÿøÑ¤ÕøÿÖ£Ó­þÿΧбÿÿò¦áþÿð¾­åþÿ´»ÀÅÿÿÒGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(„ÿOà¿çÿÿõÍÑÍøÿÿ×ÁðÿÿþÓÃóÿÿéËÏÕþÿæÌÏ×ÿÿ÷ÈÌüÿÿú/¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(ÿþ™ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(„ÿýüþ€ÿüüý€ÿýüþ€ÿýü€ÿ8þüüýÿÿþüüþÿÿþüüþÿþÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(„ÿþ‡ÿþ‚ÿþþÿþÿÿþÿÿþ‚ÿ-þÿÿþÿÿûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿûèýÿþÿçÒöÿþÿäÓúÿþÿõêÿ ÝØüÿþÿñîÿþÿüÖß‚ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(ƒÿ_øµ ÷ÿÿç­Â­þÿ߯¾³ÿÿ쥱ÿýÿж·ÀÿÿãžÃÿüÿ½­ÐÿþÿÿþþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(ƒÿ<øé²óÿÿÁÓÓ”êÿ¹ÛË—òÿôÛ·ÿþÿ°çº¡ûÿôÓÄÿÿú­î©°ÿþÿÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(„ÿ'ý±ôÿÿųºÝÿ½²Ä·èÿÿêµÿÿþ·¶Æ´óÿÿÝÃÿÿô±¶Ç·þ„ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(„ÿ(ü®òÿÿΕñ«ìÿÄ›ò©ôÿÿè±ÿýÿ²«ìªÿþÿÛÀÿýÿ¢¾à²ÿþ„ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ÿ+þÿõ¹©¶ñÿô·±Åÿÿï´°Ìÿÿæ°©Àùÿ䳯ØÿÿÞ®«ÊÿÿÙ²°äÿþ„ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(ƒÿþ÷ú÷ýÿÿúïÿøð€ÿü÷úø€ÿõò€ÿûøùø€ÿòõŠÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(‰ÿþþÿþ‚ÿþ…ÿþÿÿþ…ÿþÿÿþˆÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(‹ÿþ‚ÿþˆÿþ‡ÿþŒÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(»ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(µÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü±û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(±ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b®cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埱=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç©æååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæå傿åæååæååæååæååæåããáßßÜÚ×ÒÎÊľ°ß¶¸%è‚çæëïéæçæèëçìïèççæíîçíîçîîçîíææäãæäßÞÚÚÜÔËÅ¿±¿ä¯·%èçæëÕ¼ÞêæêäÒççæëοãéæêËÁæèçéÈÀçèÄÆè€çÂÈèæäéÓÖâÞÝÕ°»ÏÆ¿¹ ÏÚ®¶%è€ç@æêל²™äêÝŸ˜çæìÊŸ®¢éíâ©§ëì¼¥¥­ìì¶©¡´ìì°¬ž»ìèÀ‰¹èÝßœ¥Š´ÍÁ”d¸ÚÕ¬µ%è€çAæïµ¼È„ÏíßЦäæî¨Ê¹‰Ûð£Ð±ßìŸÖ¨’äèžÚ¡˜éâžÜšŸéåÚ±·èâϘςœÑÁ±£çÌÖ¨´%è€çBæî¶£¯ªÂíéä¤åç묢²§Òí§¡´¥×ꥤ´£Ý椤µ£äÞ ¥·¦æåñ¸¶êä͘¨šÒÅÆˆ–èÛÎÕ¥³%è€çCæíÄܟÐìçÞ¡ãæî²Þ™Üðª”Ü™áؚæì™¥Óœê钮͡íäì´³êâÛ‚¶³ž×ÇĉŽáæÚÍÕ£²%éèCé㨡¯êêܪž¬ßíÛ¥ ºìëÖ¢Ÿ¿ìëÑ¢ŸÅììÌ¢ŸËììÇ¢ŸÐìêÁŸž¿ææ¶›™ËÔÌ€sÃôâÚÍÕ ±%é‚è)êçÙêéèçäçäççëäÚëèçìâÜìèçëáÝìèçìÞßìçèìÝáìçè€åâåäåÓÙÜÔÎú§ÉøêäÚÍÔŸ°%é„èëè=éèéèèçèëçèèçéêçèèçêëçèèçêêçèèçêêçèèéèèçåäâäßÙÖÐȾ¬ÃüñëãÚÍÕž ¯%êƒéççé çèèééèèéèéé€èç€éçç€éèçè€éèééçè€çæãáßÜØÒȾ®¼ý÷òëãÙÌÕ ®%êƒéïí€éêïì€éëìçíééëëèíèéëïë€é(ëïëééèíéêìéèíèêêçæééâÝÙÓÏÆ²¸ýû÷òëâÙÌÖ ­%ê‚éGêÆ©äêéé­ééê㪣Éíêß§£Îíéå´¸íèêã°ÀîçíÒ¢©ÛëíÍ «Þêè×£ÈâØÖ¼‹£¸úþû÷òëâÙÍÕ ¬%ê€éJèëß®˜ßëëÛ«žçèñ´¸ÄŠäò­¿»éíÏ¡¨îçíÌŸ²ðçëžÓ¡¦ðæ›Ø˜®ïç½”¼æØÔ¦€¸úÿýû÷òëâÙÍÖ «%êƒéHì£Þëèëæ¦åèîªÁ¨›×ð¦Â¦ÛëîÔ¨íèèðϱïêߤĞ¥ì٥œ©êåð´ºæÙÓÖ™›·ùÿþýû÷òëâÚÍÖ ª%ë‚êJìî£æîéíè§îëï¯Õ¥Öò¨“×¢ÝëòÕ«õéèôϵ÷êå—¤Ô¢îà’«Ð¤îæô´ÀìÙÕÙš¢¼øÿÿþýû÷òëãÚÍ× ©%ëê;ëåÅ”¾äíãÀ—Åäñŕžéñ½š¾¢íëÞ²˜ÏéìÜ®žÒé𥬰´ðퟱ«¼ðèÓ£ÒÝÖº‡‰«ú€ÿ þýûöñëãÚÎØ ¨%ëê<ìã¼À¼àîà¼À¼ãëìDZÞíêê³àìíÖº¾ÃéíÓ»¾Åëëå¹»éêì⵿ëéêÆº·Èß×°¢•¦ûÿ€þ ýüúöñêãÛÎØž §%ì‚ë:ìòñòíêíòñòìëëðóíêëëñòíëëîòññëêïòòñëëìòòìëëíòòëêéîîìæÝØÖоú„ÿ ü÷ðèáÙÎÙž ¦%ìƒëêèê€ëéèé€ëéèê€ëèèê€ë éèêëëêèèêëëêèè€ë$êééëêêèåãâÞØÐȼºíñíëìïñöûýÿýöêÜÌÖž ¥%ìƒëìð€ëêïóìêëëðóìëëêñò€ëêíïëòòëòñ€ë%êîíëêêèìçâÞØÔÒĵª›Ž‡}~‡’«ÀÓäëÜÝœ ¤%ìë"êíêÕéìêïÕÀåíêîÒÂçíêîÎÄéìêðáØíëëìÈÉì€ë+ÅÌíëêñÚßíêêîÖÛåÞÜͦ±¼¬Ÿˆjs|wwlYdjgnq}­Íæ¥ £%ìëRíå§”ãìïÕ ´ ëð΢±¥íñÇ¥¬ªïîÕ•©ðéñ¹¬¥·ð𳯡¿ñíÆÀòèíÀŠÂêÞÛ”Ÿ€©´ŸdhRvyUaOs|qMUDs‘Ï¡¢&íìQíæØ¥áíô²ÈÆ‰Ùø«Î½Œàõ§Ôµ‘äïâÇ­ðëì¢ß¥›îç á¢ïëá·¾ôêêÞ±¿ìäÇ™Åw”¾‘o„NmŽoewIlˆfeqJlsj£‰£&íìSëîï¤âíò¶¦´¬Ì÷¯¥¶ªÖ󫥸¨ÛîôÖªñì騨º§è㤨º©ëêø¾¼ôêéö¶¾ìæÄ•˜ž‘Ä•oqrp›xcijn”p`gfoŠkc¡&îƒíRé¡áîô¿ŠäŸÛø¶ãœáö­—áœèíñѨñëò©Ù ðï–²Ò¥óëôº»õëêò³½íåÕ|¹£šÊªb—{¨Wo¡ƒUi‚•‰yŒ5 &î€íVìï䬩àò䪤¹ðïਣ¾ñðÛ¦£ÃñðÒ£ž·ìòÑ¥£ÐññË¥£ÕñïߟÃðí¾žÅèä®—”ÅÇÁŽ}~ª¬ªuz¥§£yry¡ž›—’Œ Ÿ&î‚íTìåèåìíðêÞðíìðéßñíìðçáñíîéæèæíìñãäñìíñâåñìîèççèíìæåããçãáÍÔÓÊÇñ¹¹¶¶´§³´±³°¦°®«©¦¢š¢HŸ&îƒíïîïííìíð€í7ìîðìííìîðìííîïîïííìïïìííìðïìííîïïîíìíììêæåáàÙÕÐÌÈÇ¿¿¾½¿€½ ¼¼¾º¹·µ³°«¯~Ÿ&ïƒîìííîîííîí€îììîìì€îííîìîîíìí€îíìí€îíìííîîììëêèçãáÜÙÖÒÎËÊÉÈÇÆÅÆ€Ç ÅÆÄÄÂÀ¾¼¸¼œ &ïƒîôò€îïñìòîîïõñ€îïõñîîíñðíòíîðõð€îñõïîîíñôïîîíòëîîéèëâäßÚÙÛÙÒÐÏÏÔÔ€Ï ÑÔÍÒÎÌÊÈÇÃɧ &ï‚îSïˬéïîë±¥ÈòííÁµðîî뼸ñíñ੨×òîè´Åóíïå±Éóìïã®ÎóìóÌ¢°æìíž®ßáÞÆ›ËÛÖ×¾˜ÍÙÖØ¦“­ØÔÓÑÏÍÕ° &ð€ïUîñ䲜åðöÀµÑ‰æõÚ­¦ïî󨧧òíöªË¶šòóÑ¢·öíóËžº÷íòÇ›Áöïéß”º÷ߛ܋½ìß°ÉâÝ׫Ìßá¾Ê}ÌßÙÙØÖÞ· &ðƒïRò§ãðö´Ä°Ôôñé«îïîôá©ñîïªÊ¦¢åðöÔ¶õîíùɸöîíùþöòڭİøÎ¯¿™²îäî¨Êèââé¢Îäé³³¬’½çÞßÝÛã½ &ð‚ïSñô§ëòõ»×­Óôóé­öðíöá«ùïñ§œÛ¤èïùÔ¹üííüɼýííüÂÃûðᓵϪùغǮñçóªÕïåçï¥ÚììÀˆÇ¯¾ìããâàé &ðïMðêɘÂèöѕȟëòåÁ›Ìëò仚Ïë÷¹£¿«ôðá²¢×îðÞ«£Ùïðܧ§Üð𜼪Çõì—À¤ÍòèΙ²ÞìåÉ•µßî×ÚÜë€çåîÅ &ñðTòéÁÅÁæòòеßóòâÀÄÃëôß¿ÄÅíñïĺéñóÙÀÃËðóÓÁÂÎñòÐÁÁÐòòå¸ÈòïòáµËñîížÙñéÂÁ½ÝîïÓ°ÔïêëêêçñÇ &ñ‚ð8ñø÷øòððõøóïðóø÷øñïóø÷÷ñðñ÷øòððôøøöðïõøøöððöøøõðïòøöððïò÷õ€ïõõöòíïõõöñîîòõñìíëõÊ &òƒñïîï€ñïîð€ñîîï€ñîîï€ñîîðññðîîðññðîïðññðîîðññðîï€ñðîï€ðîííïððîíî€ðîíîïîìöË &ò‚ñðõùóðñðòõ€ñðöùòññð÷øñ÷øñøø€ñðôôñ ùöðññòùöðñðóùõðñðóùôïðïóùóïðïôøóïðîøÍ &òñðõßÄèôðôîÜññðõ×ÇíóðôÓÉðòñôÐË€ñ.òÍÎòñð÷ããóðòïÈÕôðóíÆÙôðóêÅÛõðôçÄàõðôäÃãôïõáÄæôð€ñîøÍ &ò€ñNðõࣺ îô禟ñðöÓ¦µ©ó÷Ì©°¯õ÷Å«¬µöö¾°©¼÷ôÐ’¿øïö±¶¡Ì÷󭹞Ó÷𨻜Ùöí¦¼œàö裼œæö䣻žìò€ñïùΠ&ó€òUðû½ÄÓŠØùêÙ­ïñú°ÓÁåûªÙ¹”ê÷¦ß°™ïó¥ä¨Ÿòó翽ùóç¥èš­ûà§ç”µþØ­ç¼ÿвãŒÄÿɸ݊ÌÿÁÀ×ŠÔøñòòðúÏ &ó€òUðù¿ª·²Ìùôï«ðò÷´©º¯Üù¯¨½­áõ­­½ªçñ«¬¾«ìñþɼúô⥮¿®øÝ§®½°ýÕ§°»´ÿͦ²º»ÿȦ´¶Àÿ¨µ´ÇúðòòðúÏ 'ô€óUòúÍŠè¨Úøóê©ïòú¼”é¡çý²›ç¡íúª¤ã¢òø¡­ß¤öñúƺúòñ“ÀЯüìŽÊȵþçŠÓÀ¼ÿàˆÚ¸ÄÿÙ‡à±ÌÿÒˆæ«ÖùòóóñûÏ 'ôóLôî°©¸õõ毢±éøå­¨Ã÷öà«§ÈøöÛª§Î÷÷Öª§Õ÷öͤ£ÅôøÊ©¨àö÷΍åõöÀª«êõõºª®îôó¶©±ñô𳪴ôóñûÏ 'ôóLòõòãõôóñëîëòóöîå÷óòöíæ÷óò÷ëç÷óò÷éé÷òôîìííóó÷æí÷òó÷äîöòóöäñöòôõãòõòôôãóõòõòãôôóñûР'ô„óöó,õôõóóòôöòóóòôöòóóòõöòóóòõõòóóôõôôóóòöõòóóòöôò€óöóòóóòöô€óòö‚ó÷ƒóñûР'õƒôóóôòóóôôóóôó€ôòó€ôóôôóôôóòóóôôóôóóôôóòôóòôóòôóôó€ôóôò‚ôòüР'õƒôúøôú÷€ô&ö÷òøôôõû÷ôôó÷õóøóó÷õô÷óô÷úõôôóøóõöôôøúõ€ôøúôùùôùñøõôõøòø‚ôòüР'ö‚õLöѲðöõõ̶õõöÔùôó¾øôøç­­Ýøøâ«¯áøõì¶Ïúóúר´ë÷öæ¯Ùúó÷â°áùô÷Þ¯æøôøÂ§Âöõö¾¨Æøô€õóþÑ 'ö€õUôøê· ë÷øç³¦óôý¾ÁΑñûÝ«¬øóü¯Ð»žøú©×³¥úøÐ¢¿üôó£ã ·üõÉŸÌýóõÆ ×ûõòÀÜùùÛ©å‹ÚÿÒ®à‹ãùôõõóþÑ '÷ƒöRø¬éøõ÷ó¯ñõü³Ë²£ãùúç®÷õö¯Ð«¦íõ®Ï¨ªòõÿϽüøå®Í¤²øóÿÂÉýõôÿ¿ÔûõôþµÚùýɽÀ ÈÿÂüŸÏýôööôÿÑ '÷‚öSøû­òúôùõ±úöü¹˜à¯âùýè±ÿöø¬¢à©ïø¦¦á©ôõÿÏÃÿ÷ì›´Ú®ûóÿÂÐÿôõÿ¿ÛÿôõÿµâþûÔ’ÏÂÃÿÌ’Õ¼ÍþõööôÿÑ '÷öT÷ñÏœÈïùïËŸÎðþÏ̧õøëÀžÕòþ¾¨Ä°úü¶¯¿¶üöä°¨àöú¨º´Åýõਰç÷õݧ·èøôØ¡¼éúê—ͤãþã—ϤéùõööôÿÒ '÷öMøïÆÊÆìúìÆÊÆïø÷ÐºéøøåÄÉÊó÷õÈ¿ï÷÷óÅÁó÷ùÙÅÇÓ÷øí¿ÈööøÓÇÅÛùöÐÈÅÞúôÌÉÄâøù߸ÙúôúÛ¸Þúõ€öôÿÒ '÷‚öK÷þýþøõøþýþ÷ööüþùööùþýý÷ö÷ýþøöö÷ýþøöõûþþüööøþý÷ööüþþûõöüþþúõöýýþúööúþûõöõúþûõöôÿÒ 'øƒ÷õôö€÷õôö€÷õôö÷÷öôôõ€÷õô€÷öôôö÷÷öôôö÷÷öôô€÷öõõö÷÷öõõö÷÷öõõ€÷öõö€÷öõö‚÷õÿÓ 'ø„÷ü€÷öøû÷ ýÿø÷÷öýÿø÷÷öùû÷þþ÷ÿý€÷øÿýöŸ÷õÿÓ 'ùø.÷úøáöù÷ûõâøø÷üÝÍôú÷ûÚÐ÷ù÷ýîåúøøùÓÕùøùøÐØû÷ùöÎÛûŸøöÿÓ 'ùø0úñ°›ðúúî«£ø÷ýÙ«º®úþÒ®µ´ýûá²þöÿô®Âþý¼¸©Êþü·»¥Òþ÷øöÿÓ 'ùø0ùòã­íúùñß²õ÷ÿµ×Æ“ëÿ¯Ý½˜ðûîÒ¶ý÷ø©è¬£úó¨ë¥ªþí©ìž²ý÷øöÿÔ 'ùø/÷úû¬íû÷üõ°õøý¹®¿³áÿ³­Á±æúÿà³ýøõ°°Ã¯ôıû課óúƒøö÷–øöÿÔ 'úƒù.õ©íûøúï­õøÿÀ—î¤ìÿ¶Ÿì¤ôúýܱþ÷þ¥°ã¨üûºÛ¬ÿö—ÄÕ³ÿø‚ùþø÷•ù÷ÿÔ 'ú€ù1øûïµ¥²ëÿ볦µïþê°¬Èýü殫ÍþüÝ«¥ÁøþÛ­«ÚýýÔ­«àýþÏ­«åýøùûÛôüö”ù÷ÿמ(û‚ú.ùñõòøûøñõñùúýõëýúùýóìýúûöòôòúùþïïþùùþîñýùúýìóýùú÷ÿOAóÿõù‘úùôÿÄŸ(ûƒúüûü€ú&üûüúúùûýùúúùûýùúúûüûüúúùüüùúúùýüùúúùýüù‚ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(ûƒúùúø€úùúùúúùùúùúúùùúù€úøù€úùúùù€úùúú÷úúù„úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(û‚ú"ûýøþúúûý÷þúúûüøþúúüüùýùúüÿüúúùýûúýù‚úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (ûƒú)¿¬Îýúø»­Òþûô¶®Ùþûð³¯ÝþúöÂÅÿøþ篳æþùú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û€ú-ùÿÒµâêÿɽۑñÿÁÅÒ•õÿºÍÉšúÿ߬´ÿøÿ­Ü¶©ÿùúöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(ü€û.ùÿÂ˾£×ÿ¼Ìº¥Þÿ¶Î¶§çÿ³Ð³©ìýÿäµÿûø²Ó¬­öüû÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü€û/ùÿ˗ܺÔÿØàµÝÿ»šâ±æÿ´Ÿä¯íýÿä¸ÿúû©ªã¬ùüûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ý€ü0ûÿå›Ô§òÿÜÓ§öÿÔ¡Ñ«ûÿ̥ͯÿýïÀ¤ßúÿ»²ÃºÿûüúÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýü/ûÿݽæÿûþÚ½êÿûýÕ¿îÿüüÑÀñþÿæÉÍÒüýùÊÆøýüüûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ýƒüþÿþ€üÿÿþ€üÿÿý€üÿÿýüüþ€ÿ€üÿÿýü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ýƒüúùú€üúùû€üúùû€üúùûüüûùùú€üúú‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚üûþÿýüüûüÿ€üûýÿüÿÿüÿÿ€üûþþ‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýü"ûÿéÎòþûþøæüüûÿöçýüüÿÞÓúýüþÛÕûýûÿïìþ‚ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ€ý$üÿì«Ã¨úÿó®¦ýüÿí©¬ÿüÿײ¹¸ÿÿÏ´µ¿ÿÿáÂÿûý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þ€ý$ûÿÇËÚ‘âÿôãµúýÿóà·üüÿ³ßÁ›õÿ¯æ¹ ùÿòÑÃÿüý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(ÿ)ýÿÅÍÁ¥ÜÿÿøµûþÿºÐ¸©ëÿ¶Ó¶«ðÿÿå¸ÿþþÿÞÂÿÿô´Õ­µ€ÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(ÿdýÿΙ߽Ùÿÿø¶üþÿ¿ä³êÿ·¢ç±ñÿÿåºÿþþÿÞÄÿÿú¦²ã±ÿþÿè¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(ÿ\þÿçœ×©öÿøÑ¤ÕøÿÖ£Ó­þÿΧбÿÿò¦áþÿð¾­åþÿ´»ÀÅÿÿÒGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(„ÿOà¿çÿÿõÍÑÍøÿÿ×ÁðÿÿþÓÃóÿÿéËÏÕþÿæÌÏ×ÿÿ÷ÈÌüÿÿú/¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(ÿþ™ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(„ÿýüþ€ÿüüý€ÿýüþ€ÿýü€ÿ8þüüýÿÿþüüþÿÿþüüþÿþÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(„ÿþ‡ÿþ‚ÿþþÿþÿÿþÿÿþ‚ÿ-þÿÿþÿÿûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿûèýÿþÿçÒöÿþÿäÓúÿþÿõêÿ ÝØüÿþÿñîÿþÿüÖß‚ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(ƒÿ_øµ ÷ÿÿç­Â­þÿ߯¾³ÿÿ쥱ÿýÿж·ÀÿÿãžÃÿüÿ½­ÐÿþÿÿþþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(ƒÿ<øé²óÿÿÁÓÓ”êÿ¹ÛË—òÿôÛ·ÿþÿ°çº¡ûÿôÓÄÿÿú­î©°ÿþÿÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(„ÿ'ý±ôÿÿųºÝÿ½²Ä·èÿÿêµÿÿþ·¶Æ´óÿÿÝÃÿÿô±¶Ç·þ„ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(„ÿ(ü®òÿÿΕñ«ìÿÄ›ò©ôÿÿè±ÿýÿ²«ìªÿþÿÛÀÿýÿ¢¾à²ÿþ„ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ÿ+þÿõ¹©¶ñÿô·±Åÿÿï´°Ìÿÿæ°©Àùÿ䳯ØÿÿÞ®«ÊÿÿÙ²°äÿþ„ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(ƒÿþ÷ú÷ýÿÿúïÿøð€ÿü÷úø€ÿõò€ÿûøùø€ÿòõŠÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(‰ÿþþÿþ‚ÿþ…ÿþÿÿþ…ÿþÿÿþˆÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(‹ÿþ‚ÿþˆÿþ‡ÿþŒÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(»ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(µÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü±û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(±ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b®cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埱=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç©æååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæå傿åæååæååæååæååæåããáßßÜÚ×ÒÎÊľ°ß¶¸%è‚çæëïéæçæèëçìïèççæíîçíîçîîçîíææäãæäßÞÚÚÜÔËÅ¿±¿ä¯·%èçæëÕ¼ÞêæêäÒççæëοãéæêËÁæèçéÈÀçèÄÆè€çÂÈèæäéÓÖâÞÝÕ°»ÏÆ¿¹ ÏÚ®¶%è€ç@æêל²™äêÝŸ˜çæìÊŸ®¢éíâ©§ëì¼¥¥­ìì¶©¡´ìì°¬ž»ìèÀ‰¹èÝßœ¥Š´ÍÁ”d¸ÚÕ¬µ%è€çAæïµ¼È„ÏíßЦäæî¨Ê¹‰Ûð£Ð±ßìŸÖ¨’äèžÚ¡˜éâžÜšŸéåÚ±·èâϘςœÑÁ±£çÌÖ¨´%è€çBæî¶£¯ªÂíéä¤åç묢²§Òí§¡´¥×ꥤ´£Ý椤µ£äÞ ¥·¦æåñ¸¶êä͘¨šÒÅÆˆ–èÛÎÕ¥³%è€çCæíÄܟÐìçÞ¡ãæî²Þ™Üðª”Ü™áؚæì™¥Óœê钮͡íäì´³êâÛ‚¶³ž×ÇĉŽáæÚÍÕ£²%éèCé㨡¯êêܪž¬ßíÛ¥ ºìëÖ¢Ÿ¿ìëÑ¢ŸÅììÌ¢ŸËììÇ¢ŸÐìêÁŸž¿ææ¶›™ËÔÌ€sÃôâÚÍÕ ±%é‚è)êçÙêéèçäçäççëäÚëèçìâÜìèçëáÝìèçìÞßìçèìÝáìçè€åâåäåÓÙÜÔÎú§ÉøêäÚÍÔŸ°%é„èëè=éèéèèçèëçèèçéêçèèçêëçèèçêêçèèçêêçèèéèèçåäâäßÙÖÐȾ¬ÃüñëãÚÍÕž ¯%êƒéççé çèèééèèéèéé€èç€éçç€éèçè€éèééçè€çæãáßÜØÒȾ®¼ý÷òëãÙÌÕ ®%êƒéïí€éêïì€éëìçíééëëèíèéëïë€é(ëïëééèíéêìéèíèêêçæééâÝÙÓÏÆ²¸ýû÷òëâÙÌÖ ­%ê‚éGêÆ©äêéé­ééê㪣Éíêß§£Îíéå´¸íèêã°ÀîçíÒ¢©ÛëíÍ «Þêè×£ÈâØÖ¼‹£¸úþû÷òëâÙÍÕ ¬%ê€éJèëß®˜ßëëÛ«žçèñ´¸ÄŠäò­¿»éíÏ¡¨îçíÌŸ²ðçëžÓ¡¦ðæ›Ø˜®ïç½”¼æØÔ¦€¸úÿýû÷òëâÙÍÖ «%êƒéHì£Þëèëæ¦åèîªÁ¨›×ð¦Â¦ÛëîÔ¨íèèðϱïêߤĞ¥ì٥œ©êåð´ºæÙÓÖ™›·ùÿþýû÷òëâÚÍÖ ª%ë‚êJìî£æîéíè§îëï¯Õ¥Öò¨“×¢ÝëòÕ«õéèôϵ÷êå—¤Ô¢îà’«Ð¤îæô´ÀìÙÕÙš¢¼øÿÿþýû÷òëãÚÍ× ©%ëê;ëåÅ”¾äíãÀ—Åäñŕžéñ½š¾¢íëÞ²˜ÏéìÜ®žÒé𥬰´ðퟱ«¼ðèÓ£ÒÝÖº‡‰«ú€ÿ þýûöñëãÚÎØ ¨%ëê<ìã¼À¼àîà¼À¼ãëìDZÞíêê³àìíÖº¾ÃéíÓ»¾Åëëå¹»éêì⵿ëéêÆº·Èß×°¢•¦ûÿ€þ ýüúöñêãÛÎØž §%ì‚ë:ìòñòíêíòñòìëëðóíêëëñòíëëîòññëêïòòñëëìòòìëëíòòëêéîîìæÝØÖоú„ÿ ü÷ðèáÙÎÙž ¦%ìƒëêèê€ëéèé€ëéèê€ëèèê€ë éèêëëêèèêëëêèè€ë$êééëêêèåãâÞØÐȼºíñíëìïñöûýÿýöêÜÌÖž ¥%ìƒëìð€ëêïóìêëëðóìëëêñò€ëêíïëòòëòñ€ë%êîíëêêèìçâÞØÔÒĵª›Ž‡}~‡’«ÀÓäëÜÝœ ¤%ìë"êíêÕéìêïÕÀåíêîÒÂçíêîÎÄéìêðáØíëëìÈÉì€ë+ÅÌíëêñÚßíêêîÖÛåÞÜͦ±¼¬Ÿˆjs|wwlYdjgnq}­Íæ¥ £%ìëRíå§”ãìïÕ ´ ëð΢±¥íñÇ¥¬ªïîÕ•©ðéñ¹¬¥·ð𳯡¿ñíÆÀòèíÀŠÂêÞÛ”Ÿ€©´ŸdhRvyUaOs|qMUDs‘Ï¡¢&íìQíæØ¥áíô²ÈÆ‰Ùø«Î½Œàõ§Ôµ‘äïâÇ­ðëì¢ß¥›îç á¢ïëá·¾ôêêÞ±¿ìäÇ™Åw”¾‘o„NmŽoewIlˆfeqJlsj£‰£&íìSëîï¤âíò¶¦´¬Ì÷¯¥¶ªÖ󫥸¨ÛîôÖªñì騨º§è㤨º©ëêø¾¼ôêéö¶¾ìæÄ•˜ž‘Ä•oqrp›xcijn”p`gfoŠkc¡&îƒíRé¡áîô¿ŠäŸÛø¶ãœáö­—áœèíñѨñëò©Ù ðï–²Ò¥óëôº»õëêò³½íåÕ|¹£šÊªb—{¨Wo¡ƒUi‚•‰yŒ5 &î€íVìï䬩àò䪤¹ðïਣ¾ñðÛ¦£ÃñðÒ£ž·ìòÑ¥£ÐññË¥£ÕñïߟÃðí¾žÅèä®—”ÅÇÁŽ}~ª¬ªuz¥§£yry¡ž›—’Œ Ÿ&î‚íTìåèåìíðêÞðíìðéßñíìðçáñíîéæèæíìñãäñìíñâåñìîèççèíìæåããçãáÍÔÓÊÇñ¹¹¶¶´§³´±³°¦°®«©¦¢š¢HŸ&îƒíïîïííìíð€í7ìîðìííìîðìííîïîïííìïïìííìðïìííîïïîíìíììêæåáàÙÕÐÌÈÇ¿¿¾½¿€½ ¼¼¾º¹·µ³°«¯~Ÿ&ïƒîìííîîííîí€îììîìì€îííîìîîíìí€îíìí€îíìííîîììëêèçãáÜÙÖÒÎËÊÉÈÇÆÅÆ€Ç ÅÆÄÄÂÀ¾¼¸¼œ &ïƒîôò€îïñìòîîïõñ€îïõñîîíñðíòíîðõð€îñõïîîíñôïîîíòëîîéèëâäßÚÙÛÙÒÐÏÏÔÔ€Ï ÑÔÍÒÎÌÊÈÇÃɧ &ï‚îSïˬéïîë±¥ÈòííÁµðîî뼸ñíñ੨×òîè´Åóíïå±Éóìïã®ÎóìóÌ¢°æìíž®ßáÞÆ›ËÛÖ×¾˜ÍÙÖØ¦“­ØÔÓÑÏÍÕ° &ð€ïUîñ䲜åðöÀµÑ‰æõÚ­¦ïî󨧧òíöªË¶šòóÑ¢·öíóËžº÷íòÇ›Áöïéß”º÷ߛ܋½ìß°ÉâÝ׫Ìßá¾Ê}ÌßÙÙØÖÞ· &ðƒïRò§ãðö´Ä°Ôôñé«îïîôá©ñîïªÊ¦¢åðöÔ¶õîíùɸöîíùþöòڭİøÎ¯¿™²îäî¨Êèââé¢Îäé³³¬’½çÞßÝÛã½ &ð‚ïSñô§ëòõ»×­Óôóé­öðíöá«ùïñ§œÛ¤èïùÔ¹üííüɼýííüÂÃûðᓵϪùغǮñçóªÕïåçï¥ÚììÀˆÇ¯¾ìããâàé &ðïMðêɘÂèöѕȟëòåÁ›Ìëò仚Ïë÷¹£¿«ôðá²¢×îðÞ«£Ùïðܧ§Üð𜼪Çõì—À¤ÍòèΙ²ÞìåÉ•µßî×ÚÜë€çåîÅ &ñðTòéÁÅÁæòòеßóòâÀÄÃëôß¿ÄÅíñïĺéñóÙÀÃËðóÓÁÂÎñòÐÁÁÐòòå¸ÈòïòáµËñîížÙñéÂÁ½ÝîïÓ°ÔïêëêêçñÇ &ñ‚ð8ñø÷øòððõøóïðóø÷øñïóø÷÷ñðñ÷øòððôøøöðïõøøöððöøøõðïòøöððïò÷õ€ïõõöòíïõõöñîîòõñìíëõÊ &òƒñïîï€ñïîð€ñîîï€ñîîï€ñîîðññðîîðññðîïðññðîîðññðîï€ñðîï€ðîííïððîíî€ðîíîïîìöË &ò‚ñðõùóðñðòõ€ñðöùòññð÷øñ÷øñøø€ñðôôñ ùöðññòùöðñðóùõðñðóùôïðïóùóïðïôøóïðîøÍ &òñðõßÄèôðôîÜññðõ×ÇíóðôÓÉðòñôÐË€ñ.òÍÎòñð÷ããóðòïÈÕôðóíÆÙôðóêÅÛõðôçÄàõðôäÃãôïõáÄæôð€ñîøÍ &ò€ñNðõࣺ îô禟ñðöÓ¦µ©ó÷Ì©°¯õ÷Å«¬µöö¾°©¼÷ôÐ’¿øïö±¶¡Ì÷󭹞Ó÷𨻜Ùöí¦¼œàö裼œæö䣻žìò€ñïùΠ&ó€òUðû½ÄÓŠØùêÙ­ïñú°ÓÁåûªÙ¹”ê÷¦ß°™ïó¥ä¨Ÿòó翽ùóç¥èš­ûà§ç”µþØ­ç¼ÿвãŒÄÿɸ݊ÌÿÁÀ×ŠÔøñòòðúÏ &ó€òUðù¿ª·²Ìùôï«ðò÷´©º¯Üù¯¨½­áõ­­½ªçñ«¬¾«ìñþɼúô⥮¿®øÝ§®½°ýÕ§°»´ÿͦ²º»ÿȦ´¶Àÿ¨µ´ÇúðòòðúÏ 'ô€óUòúÍŠè¨Úøóê©ïòú¼”é¡çý²›ç¡íúª¤ã¢òø¡­ß¤öñúƺúòñ“ÀЯüìŽÊȵþçŠÓÀ¼ÿàˆÚ¸ÄÿÙ‡à±ÌÿÒˆæ«ÖùòóóñûÏ 'ôóLôî°©¸õõ毢±éøå­¨Ã÷öà«§ÈøöÛª§Î÷÷Öª§Õ÷öͤ£ÅôøÊ©¨àö÷΍åõöÀª«êõõºª®îôó¶©±ñô𳪴ôóñûÏ 'ôóLòõòãõôóñëîëòóöîå÷óòöíæ÷óò÷ëç÷óò÷éé÷òôîìííóó÷æí÷òó÷äîöòóöäñöòôõãòõòôôãóõòõòãôôóñûР'ô„óöó,õôõóóòôöòóóòôöòóóòõöòóóòõõòóóôõôôóóòöõòóóòöôò€óöóòóóòöô€óòö‚ó÷ƒóñûР'õƒôóóôòóóôôóóôó€ôòó€ôóôôóôôóòóóôôóôóóôôóòôóòôóòôóôó€ôóôò‚ôòüР'õƒôúøôú÷€ô&ö÷òøôôõû÷ôôó÷õóøóó÷õô÷óô÷úõôôóøóõöôôøúõ€ôøúôùùôùñøõôõøòø‚ôòüР'ö‚õLöѲðöõõ̶õõöÔùôó¾øôøç­­Ýøøâ«¯áøõì¶Ïúóúר´ë÷öæ¯Ùúó÷â°áùô÷Þ¯æøôøÂ§Âöõö¾¨Æøô€õóþÑ 'ö€õUôøê· ë÷øç³¦óôý¾ÁΑñûÝ«¬øóü¯Ð»žøú©×³¥úøÐ¢¿üôó£ã ·üõÉŸÌýóõÆ ×ûõòÀÜùùÛ©å‹ÚÿÒ®à‹ãùôõõóþÑ '÷ƒöRø¬éøõ÷ó¯ñõü³Ë²£ãùúç®÷õö¯Ð«¦íõ®Ï¨ªòõÿϽüøå®Í¤²øóÿÂÉýõôÿ¿ÔûõôþµÚùýɽÀ ÈÿÂüŸÏýôööôÿÑ '÷‚öSøû­òúôùõ±úöü¹˜à¯âùýè±ÿöø¬¢à©ïø¦¦á©ôõÿÏÃÿ÷ì›´Ú®ûóÿÂÐÿôõÿ¿ÛÿôõÿµâþûÔ’ÏÂÃÿÌ’Õ¼ÍþõööôÿÑ '÷öT÷ñÏœÈïùïËŸÎðþÏ̧õøëÀžÕòþ¾¨Ä°úü¶¯¿¶üöä°¨àöú¨º´Åýõਰç÷õݧ·èøôØ¡¼éúê—ͤãþã—ϤéùõööôÿÒ '÷öMøïÆÊÆìúìÆÊÆïø÷ÐºéøøåÄÉÊó÷õÈ¿ï÷÷óÅÁó÷ùÙÅÇÓ÷øí¿ÈööøÓÇÅÛùöÐÈÅÞúôÌÉÄâøù߸ÙúôúÛ¸Þúõ€öôÿÒ '÷‚öK÷þýþøõøþýþ÷ööüþùööùþýý÷ö÷ýþøöö÷ýþøöõûþþüööøþý÷ööüþþûõöüþþúõöýýþúööúþûõöõúþûõöôÿÒ 'øƒ÷õôö€÷õôö€÷õôö÷÷öôôõ€÷õô€÷öôôö÷÷öôôö÷÷öôô€÷öõõö÷÷öõõö÷÷öõõ€÷öõö€÷öõö‚÷õÿÓ 'ø„÷ü€÷öøû÷ ýÿø÷÷öýÿø÷÷öùû÷þþ÷ÿý€÷øÿýöŸ÷õÿÓ 'ùø.÷úøáöù÷ûõâøø÷üÝÍôú÷ûÚÐ÷ù÷ýîåúøøùÓÕùøùøÐØû÷ùöÎÛûŸøöÿÓ 'ùø0úñ°›ðúúî«£ø÷ýÙ«º®úþÒ®µ´ýûá²þöÿô®Âþý¼¸©Êþü·»¥Òþ÷øöÿÓ 'ùø0ùòã­íúùñß²õ÷ÿµ×Æ“ëÿ¯Ý½˜ðûîÒ¶ý÷ø©è¬£úó¨ë¥ªþí©ìž²ý÷øöÿÔ 'ùø/÷úû¬íû÷üõ°õøý¹®¿³áÿ³­Á±æúÿà³ýøõ°°Ã¯ôıû課óúƒøö÷–øöÿÔ 'úƒù.õ©íûøúï­õøÿÀ—î¤ìÿ¶Ÿì¤ôúýܱþ÷þ¥°ã¨üûºÛ¬ÿö—ÄÕ³ÿø‚ùþø÷•ù÷ÿÔ 'ú€ù1øûïµ¥²ëÿ볦µïþê°¬Èýü殫ÍþüÝ«¥ÁøþÛ­«ÚýýÔ­«àýþÏ­«åýøùûÛôüö”ù÷ÿמ(û‚ú.ùñõòøûøñõñùúýõëýúùýóìýúûöòôòúùþïïþùùþîñýùúýìóýùú÷ÿOAóÿõù‘úùôÿÄŸ(ûƒúüûü€ú&üûüúúùûýùúúùûýùúúûüûüúúùüüùúúùýüùúúùýüù‚ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(ûƒúùúø€úùúùúúùùúùúúùùúù€úøù€úùúùù€úùúú÷úúù„úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(û‚ú"ûýøþúúûý÷þúúûüøþúúüüùýùúüÿüúúùýûúýù‚úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (ûƒú)¿¬Îýúø»­Òþûô¶®Ùþûð³¯ÝþúöÂÅÿøþ篳æþùú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û€ú-ùÿÒµâêÿɽۑñÿÁÅÒ•õÿºÍÉšúÿ߬´ÿøÿ­Ü¶©ÿùúöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(ü€û.ùÿÂ˾£×ÿ¼Ìº¥Þÿ¶Î¶§çÿ³Ð³©ìýÿäµÿûø²Ó¬­öüû÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü€û/ùÿ˗ܺÔÿØàµÝÿ»šâ±æÿ´Ÿä¯íýÿä¸ÿúû©ªã¬ùüûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ý€ü0ûÿå›Ô§òÿÜÓ§öÿÔ¡Ñ«ûÿ̥ͯÿýïÀ¤ßúÿ»²ÃºÿûüúÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýü/ûÿݽæÿûþÚ½êÿûýÕ¿îÿüüÑÀñþÿæÉÍÒüýùÊÆøýüüûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ýƒüþÿþ€üÿÿþ€üÿÿý€üÿÿýüüþ€ÿ€üÿÿýü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ýƒüúùú€üúùû€üúùû€üúùûüüûùùú€üúú‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚üûþÿýüüûüÿ€üûýÿüÿÿüÿÿ€üûþþ‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýü"ûÿéÎòþûþøæüüûÿöçýüüÿÞÓúýüþÛÕûýûÿïìþ‚ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ€ý$üÿì«Ã¨úÿó®¦ýüÿí©¬ÿüÿײ¹¸ÿÿÏ´µ¿ÿÿáÂÿûý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þ€ý$ûÿÇËÚ‘âÿôãµúýÿóà·üüÿ³ßÁ›õÿ¯æ¹ ùÿòÑÃÿüý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(ÿ)ýÿÅÍÁ¥ÜÿÿøµûþÿºÐ¸©ëÿ¶Ó¶«ðÿÿå¸ÿþþÿÞÂÿÿô´Õ­µ€ÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(ÿdýÿΙ߽Ùÿÿø¶üþÿ¿ä³êÿ·¢ç±ñÿÿåºÿþþÿÞÄÿÿú¦²ã±ÿþÿè¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(ÿ\þÿçœ×©öÿøÑ¤ÕøÿÖ£Ó­þÿΧбÿÿò¦áþÿð¾­åþÿ´»ÀÅÿÿÒGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(„ÿOà¿çÿÿõÍÑÍøÿÿ×ÁðÿÿþÓÃóÿÿéËÏÕþÿæÌÏ×ÿÿ÷ÈÌüÿÿú/¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(ÿþ™ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(„ÿýüþ€ÿüüý€ÿýüþ€ÿýü€ÿ8þüüýÿÿþüüþÿÿþüüþÿþÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(„ÿþ‡ÿþ‚ÿþþÿþÿÿþÿÿþ‚ÿ-þÿÿþÿÿûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿûèýÿþÿçÒöÿþÿäÓúÿþÿõêÿ ÝØüÿþÿñîÿþÿüÖß‚ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(ƒÿ_øµ ÷ÿÿç­Â­þÿ߯¾³ÿÿ쥱ÿýÿж·ÀÿÿãžÃÿüÿ½­ÐÿþÿÿþþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(ƒÿ<øé²óÿÿÁÓÓ”êÿ¹ÛË—òÿôÛ·ÿþÿ°çº¡ûÿôÓÄÿÿú­î©°ÿþÿÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(„ÿ'ý±ôÿÿųºÝÿ½²Ä·èÿÿêµÿÿþ·¶Æ´óÿÿÝÃÿÿô±¶Ç·þ„ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(„ÿ(ü®òÿÿΕñ«ìÿÄ›ò©ôÿÿè±ÿýÿ²«ìªÿþÿÛÀÿýÿ¢¾à²ÿþ„ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ÿ+þÿõ¹©¶ñÿô·±Åÿÿï´°Ìÿÿæ°©Àùÿ䳯ØÿÿÞ®«ÊÿÿÙ²°äÿþ„ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(ƒÿþ÷ú÷ýÿÿúïÿøð€ÿü÷úø€ÿõò€ÿûøùø€ÿòõŠÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(‰ÿþþÿþ‚ÿþ…ÿþÿÿþ…ÿþÿÿþˆÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(‹ÿþ‚ÿþˆÿþ‡ÿþŒÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(»ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(µÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü±û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(±ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b®cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埱=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽt8mk@+¯®®¯¯¯¯¯¯¯¯°¯¯¯¯¯°°¯¯¯¯°°¯¯¯¯°°°¯¯¯¯°°¯¯¯°°°¯¯¯¯¯¯¯¯­¬‘U  Gÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿä†  NÿûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûûýþÿÕ1Vÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúÿä<  \ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè?  `ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè@  bÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿæ>   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿå=   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿã;   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿâ:   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà9   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÞ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ9  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ3   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÖ+   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÇ    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ©   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿs   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç2   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŒ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÏ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè0   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê6  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê:  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê=  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê>  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêA!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç9"   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷c   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ–   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýW   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé31CE2  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿìšÔøÿÿþè¬B  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿþÿ¬  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýþÿÿÿþûüÿÝ'  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÜ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ°  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿS  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ0  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿo  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ»  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿº  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿj  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû,  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¼  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿK  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ¥  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿÒ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüþþÿþýûüÿÑ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ›   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿëÈïýÿøÜœ3  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé4%46#  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC"  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè>"  cÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿóG  aÿüýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýÿÿÿÿÿÿÿÿÿÿÿÿýÿÉ   _ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿp E¥¬²µ·¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¶ðÿþÿÿÿÿÿÿÿÿÿÿþÿöº·¸·¼øÿÿÿÿÿÿÿÿÿÿÿÿüÿº $,:DKNPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRN^òÿþÿÿÿÿÿÿÿÿÿÿýÿÍJRQRMÖÿýÿÿÿÿÿÿÿÿÿÿýÿß (28=@AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD:fÿÿÿÿÿÿÿÿÿÿÿÿÿüÿš4EBE5¥ÿûþþþþþþþþþþýÿã  $()**********************************************,#Kûýûüüüüüüüüüüûÿ^,*-jÿýÿÿÿÿÿÿÿÿÿÿüÿ¿ Ëÿýÿÿÿÿÿÿÿÿÿþÿì(+ÙïêëëëëëëëëéìÛ< (c]^^^^^^^^^]bM  ic08pª jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ o½ÿ“ÏÁ¦øñÁ&*1Sȉ ÜÊR8¡Át¢Ž´µ‰ s‰?Xµ!áÍQ Fp ¬Å­òx.9ZÔwP Ð×ÛÃTÁ‚~ŒÛɺAÝn·Nç…)îõˆeÌ5¹!—KïjÈš QcI8…°Wv“¬†ÖAÿlÛ³³*‹ÊÝÚjÑVBhÁ6ÎëæX+#dPa©®ÿF=ÊÁ->™%¶‡87 ÀõØ^Ã1I(ì4° ’#vôì7Ù ŒÇxá‹!'-fòÊÂógŸ"BŽñŽcãU\!‰ÏÛëÅpМc™^G¢}ܺS y/0¸LÄûF­ØÚxHM òzo”8sàïǧè…<õUzÇ&­¾|œ]h{-›K ?\Vîr² *;”- ‡Àj<µ'Ñ+HÿRÁªÕ| +`@O™oÔ@ÿ„ tÝ/MBVŠ©ç°Ë–¥ ìkÙƒjeÒ_ÁyÁ,Æ#šHˆCA&ô§) º˜¼¾pÄ"c³nq!'ó J®Sý÷É!y¹„Šw%I ´9uû“õÊ?5v½C‰ê‚pO–‰€%“‚ÁÏ'Çx¶¸)õò†rÇ4ohXû¨˜ÿA”j¾å¤&þ?­jMÎÝž;ªðy5¹fß“žšBºäv›µ>²eH.Â|AÊqq#9Öb«U6ÖˆÈÜ×n@ÒŽ-2xAÆñ‹ ÏÏ«™ùõ9ŸU`ฮw¿Ò’ –3è'=ÿ[L„M7Í»]9dë)8S™´3Šq¶š ´{PI¨ÍåK^*Øh-Ehtoö$÷²T¨¢¹Ä!¿)áדÞí”fÙKÇWMÿ0qKï—…Ô5ï_qÉho~NÆs´´ëõxBú1âuMŽƒèÆ]`UPÔ¼àÔñ'zæ­4\&›~ÖõbÍAÿýÛÎ`ŒÁƱ 4[7;nŒTìµDcS–3ð;sÜ‘ýûF†&fOé5Æ'Ù©‘ë¦w…m±p#ðìC"x†™²`Æx̪ùw[ 5,É_ñ+˜íìŒ+!¿ÄÚæ—?§$`ãëêÞbt دי—o†J:uS N$µ-\†þîõVò9«Áº„c{ál#!d8åjÛÇxäÙ28°Õ–5÷ °… Ümþ#ðØ£ð¿ÓõPóe¢@Èü–â†c…Áº#Âä¼5ß ž)‡gÀ¡Ü/D•V.òs!Ys L½T})8¸?ÓÂ7–!ZNkÛtÐHi%°¡65¼Z™ žÖðݘ´_Û•ò (qYgX–¹võ¸¦òu½ÐÀ¡Ž:KóºL2öïåÍ-ó(I9ªÀ߇ß=B«0ªbÎ?&·ì•UÌis’ó1uõ©Ð<“e®ˆ€cþx릷۷ˆúQ—³•ºÄ÷7«˜á$ RÖ;9óøí…C¶\w¨‡:³T»Jçugÿ EØyÒFv1+‘¼¹¦©ÿ ·¶6‚Zà—ìï ~3m!®^{9=XÑ‚VËDÿdwôDDèâx–z&Óhé´ý“ªƒ‹VNo S¼†+zœ/T´ÿ2-Ÿu `@³÷Ô'6âKˆhoFÁœ¤YyäÔ!ÅhPQ“üù’kaÇDŸ×Ê.<@µíNýöíª»EÖâ:åÏÑuÃ7Ð#“I߈J-·¯pösA%Ú4ü$¬£*Þ w½ž²Ú<Êéô3aßåØ ´˜'H‰B~ê‘WIó„§9šH*¦ Ê” ÞÊT²1"¢R¢tÛ`Dø€,yy¬4âYµ¹fÀºˆ0Ö—2}•õ˜ü.ëmÐUW÷Û¹—Ñg@Gw‹9@ݦ#Èl™ö‚èlr;[b€;èjl7ÉC€¶uEÂå…^@<µÓÿ_ ær¾&04òäµO´}ÉÙ—v”A4=ê•ô#†q«>}%h oØ·Ÿ £÷I™ÂЛ“ÑH€ÝôR¯öf^iˆØ¶u«ÈjÁ"OU%œ- ½@‰µòÿ¸¦!Ø{V·Œûݸ&Ì!<;?ûÅXË4| eJ â7ÇjUAè #ï¹Çˆ´ˆ¿®˜wg¨±¤jè‘‹í sO´Å@3h7ÏS2x0ýq˯LÎR4Õ›H¿†ªbÓŸ¦ma€‚·ž©Ý椔´PŒd+«ŽÄnˆñ=—à‰B»Yï+bñ›Ïõµ¬ -rÅ þ1ž ÊΗ|•E>ó„tÐÐýß"àËÞa ®/¯ùÅ0lÚÚ#€À»cq¾# -aô½À¯‡žé!Ä8G.¤Ýü…‰Jƒ×–`›@x¸šõµ…1‰îCédé,;ùË“x„ñ\±£$¦NbÙ“˜îûk_W°¤*£wܘž#›zŒÁâß)Žz1ªTékŒŠÄ€Ð ºžBÉ*ÃÕL¯£FÀÏKºß¥´¡ëVîûíȹ;¥î^ÐÄÛ&qô…Õ3`v~bŠé!Y3W4Œeé’”æœ!¸ÜígÔéò‰á–¢òµš+|eìq'‚b-2¯Ã…ºÔ‚Ã<ÅpÐÕGcv-åíûŸ§æžã˜Ä*Û) lçàñö-)ZÕ¾†ºf°ð°¤Mrç–zᤶ 7J¡Æ¡ˆï«]=”г¼,DÏZ½+ ›°ŽÒÏ¡Û7­Tj¦Æ…úÚ?óbÑÜ\»ÉXT_ŠÌ‚õÆ‘MqÝíážøŸ Ÿ_ kÑ. íw¬GÔGèãcž¯¡fÒ<ð®N§T¯T±µ 1¾ÛüBÑËââv0ß©Øc ž…›!èöÂÓ ·„Õ÷ëš‹aˆsm¥´Ã‘ù5Ð’¬ì†—«Ëû÷u‘õGNèîÁ DŸ"«•O:  ¾Ïî¶/V˜”9RÂãŸÚÿ#]W¹¼ö¬N/izBŽd;þ ¾@гå $TvÌbQV·mº¸S 6DlÿeÙ ²j_¯Æá웼؈×|ú¸~VU^ó á¥C¾?=Ùªð>AíI(˨– ~7I§)¡-”g—ðþEw[ëvlŒ@€€Çá^Oδ‡áE€%hƒº¯­? aR ¨~-7k ZŽ[éHz¿N’xl“éM2ÄÀ6„í hÔ²§Pj•9å7ú# ´¶^`г.u¶·ºw—ùЋïEY¸’L'b»lÃgƒ®IbÛÄlqÑ]b jõÌËŒÙÚ³,Bìuz6µ€nb ˆ±EûÿIGñ¤;áyTÛ’•¤‰´Ú:¼Zg¹aÈ3û½$?žß¹õix»k 2CZ„ ñeeéâÇÞr¦©‰©H6D¸ìAºKáÜ󾀦¢ q4³©ˆ€oºå›OM#"œÁáƈý :R/(×[ÏCŸ¹áÛXTžƒèoaOŸ@öœüX]áp±ûK´®£ä†’zóEðœ’Gܘ‚-Ýn”ýÐ?(Y?þëÓHt‰ÈWææ.¸-ÎŽëªFá§ÃÙó®Àpø©© É×å +=ßlÎ$ĨT‡6ÍÑöк6!•£ ÙÆSß5áxíË À"æï.=lü`»¬³ÊÙ¨óCå*¬·uK¨Ç)¨¹S-©÷ÂÐPòo€BìÄÉ#4±a…ß,ŒÝÂY#é'W]M gî˜Qªô÷»Áh¾ä¢³«©1ȣУ8fî§òyU“'K–J±g4{CÛzª‹hŠ¡½<\€Ð¦µ$MfôðN©˜Px÷¼šAOÚ°¸ªYd]í´®øÆÇ¹„Û&Ÿ¯-ÓÎg]žJXUÙ\«G»²èQÚ,Ö¬NÊ(0ðê¤×ï¼…â]ÈÅP] ›ïbèã–·˜Èؿˤ=ÄÃÇíµàà§ãР߇ÒQ Ñü+f×z·v K\ Å˃Íû¶rä9â$]oÌÁÅdêØ ÊÆÜ1˜Å{µ íŒ4­µb/÷PÿNX.\ y4X¼‹bãq|dý28€À&é`‚¶uYGbX8ÌÐ1îóZ=¯G£×¢uoLǯ¯&äoî >˜³èœÈ†W¿¾ô.&ðÐo`ö¬®§€}ŸS±‡ÉÕ'0ÍØ¤—Ö!Lmàr ‹ìݶąvDûµgNÙûð‘T^s¾4¸¶KÒRhdñÀ™’ î—s?»ö5²×]¦Ñ7ÂLóXo/]÷}Wþ¦g¬I“PYšûþošº]]Ý0ö±öÝ\Ú]¸B}À-â#L*Áì$V7D~]…¢ÅIˆ,¾z¼ pýé =a Ç~I‚tµS7ïœ=Çf§I`ØÛ§iÐݵ }Xyhyf^1Ø–?3­—aþ‚¦ „W°`.íȼ޽’éÞ#‡pQÚ ¼æÖöl¼2vR+$T—u‘] r«|ýŒÚ©³‰S´ÁÓÚ˜©†q8dt<˜Çg;PÄûI©U­»{¬YÅÀ £µìÍÆH²¼jQôÜåÁàNh˜µhŽ ¦œ›¯[5Ã’ü²ª¨ºò{óŒö’‚6XIèd8–*Î ïóÞÊ^œú*žwñ®17ŒÅ-+Óµ) ÎÚ·–½¥*ÇW è$¬Yãï‰óDnÂCxÊ£ÂÀ÷\À-5B®¶ó†Æ „Vê÷Ô‘¶«È<ŒÍeØüiøÇÛÝüOê\äˆ(í‚ÜeÒs¯ÐÙ(›–õcüµTV¾—Á³¤Aï³T«Â%Ò(@Ž’ÑûyþˆÒÑ!@>=fÐåò‘ÃØy–ùøïpÎ^Å TyðÀû„¬@ý§jouq HšPØ´… ïb–_å¯ Õàÿ:#r÷UùÔqìjÜebUlxOÑ¡fRŒ$šÍE2ª{™àÁ‚ö:E«VO—¶ßó¼r¼b6?5¹IW7åÒ9-HÉ’$úhnÂ)¸ÿzg„ ›|BùÁ*…0X‹[¼pð•ë–'ÒÓ“u¿ð~ô¼’Øé×ð&ÊŠRÚe'VÜ3ƒtÐþ“•*W=Üêvø¾_¥Ieë´wÚɘ+ žY-YøÂÒÈ¡ÌúüHÅ.˜MÿzX:áÀ•ºHxÈÈ¡~D¿ æ.­×9L#gœnm™¼ó‹Z½õ„«·Ç(Ÿµçé0'¾ý7 @ňz8mCSyö…&º{Œ˜Dx±»2Á( ›tË^£b(ZDתì°tªWÛîHLš±ßMÊÃâ1s*›yXçïÕ¢ÏyÃÚïZ–?ñ eŸÑ¡;ûæ§akÂ/—´a¶MŸXhá›YÄJR&aÍý𢢴W´E÷¨ü%u–$mãù0ìrT¦”Â-%[tÍ'ãá73ÿYMÀ®Z{q  óÿ?°ï·ëë?(áÿ!â?ž% if˜_*7Z± —®‹²´/aæçXKA yc¥&ø“²\B>Ô3ÙcÛ#çt[›s0q¯ZÉ›4;HKV„¼G.´¢·±Ð>C@â&J܇ÅKß@øüf×ù/Pxhêg¡ú+°…eÍpó²­›¤Ì$Lõgˆ¤ñã²EP„äØÔ,cèó<ÆÔ¶ô§={lµÏ†:#èv>~ °’ÝAnÀúžÈG‹lWÉFe ÝDl2xÿo’Òø*Cô=2ï×ea OŽÝ´ãÀý£e¬œ›#*&rô ¶¸š„æ3Âò-ͨ^ˆªh¬ZÛy( _'»ûN‚º£·*„ígDP› ¯H±úg Öëuû‘^©V,ç«Ø|-"7š· Ÿ0A½^v­É@bÉ ¥à}’y–m¬ýR`2!1ª9ÈÊô’`‚L&^¾þ«¾!Ûž´ˆ”V)G:öM„C+"Â8¡'†tpŽ(æ`î˜Ô‘¾°0Ù/hŸÁòOCE,àa/“LèF0ÙÑgß .Àʰ+†öîêlÿ.Z¿ +IXÊÿÕŽUW,«už§·z*Y½ßTú) „chfø¿žàeꈌîdžR÷®Š‹FkCÕ‰M©uuj‡ÒŠóôd˜x1Äåxúelæ*!ãLûŽVâ¿/a¤ÒõH~¡¥p0â«÷]\¨ÓÈ=—T®‰'JŒä Ú—Ûàê(´'t^ÒHƘ‘É"nJV‚æÒâÁø¬ôÏ Ý2É!Të× POi}6‘'‘$HªFlÝn£ðóFJ2l2à«üRuÚk1‹…Á‹ìS”NN”13ú5µ™H䨇!ÉFî@Co ™gmöZ†¥V¤Š?/Wrœ'h{Úˆ€¦ÓLæ.œ«(þÛ'Æ$kVŽ+3çú–ŽNPv¶Q¤)oÏ®²·kä¨C´u—›ë͘‡Î¨÷ø­irçÁNgÃÜÖy‡: /?òkp˜æ(õ?W®ñSa±·5Æ{~e×/2¤ñEÙ<°Ò#Hç/1_‰o —™gT-ü.Þ_´…=½d‹M˜Ø"—Ä‚ß"ðB»Î¥pÁN‹¨ä†s¯ð_‚iMòÎ5¦àÅ’CÎ5D?é8ËÕ#oÚ #¤«Šn픫h8FRÛ?åâ)1f¦bëü“ÍÇÛQ¸f·ã(9- ìPKä·t|‰™œÇÏÔa†û‹ËÐÓ?œ±x1ÎÛ|d¹ó ‰.N3PxãÍM९ÇH`CB#ƒ£Y(/¦ÑaPj>Ú^U¤‘*?ÊvTP/ÎpŒ|änÕÈ |ñÉS oÿ`ªoÌ™^ËÙ`ÏR>¼+ÏT‘-6PI›Ò´¿µk4OÆ‘³ÍîF3H~y;…8ÎHº¹} B\ëkÉáAq|Å:ô‡f,LEdúuš¾Vè^Æ3çã–fH.9çÓCê zi&|ß]rk‘ÇRÌ-ÞÜh‹ÍŒ¨ŒwÞê|^)· ™Y,o6¯DñéÝ« \uÂDµ¶µüDnçŽöBˆ:¼žöÜúóþ g­¬Úì£Mh …‚©+i9€ÛˆJ †Ž°ˆÎÓQ˜oÒ€íâüzý᮲±Ö²ŸÛ„¿3Áöš‰°ÔñáûÈ ²o.XO-½þ¦·yG¹8t D¬)V•“ï›t³ÑûΔNh™àÕM>¬ø±”4b¾‚±;}©È(Ò* ƒ:uµêå vû °>]G Ám©ÞåEaÒ$•?Ûë«ôdƒ¨ì¡Øp¨\£„xÂÏUå¡ÚZd2‚Ûee£Ó 3Á¬üÓ\ÿéXü#°ã N5~ä ßÓGÜVÊ©> ÈX5¢ïŽN>,\J"Ö[õ·9_¶pˆESG am›ólMËf½„ JCêó]á$ØuÙ„ˆG¯¬ärÁÿÿ=þw^½ãYœ™âÂt.˜_-1áë€we±ô\RÉPžðcÇžÇù,äÂVˆ…p¥á€-;E,C78è9Ñn×£}Ö¬AÅè)c¤ª$„ÓA[é Z˜Z¶?å\]=ûS“ÊM` D9Á ;vÙã­f¦—œ}0§1)¡ÍF‰@AG‰»Ùb2;{>°PCÏKú!Hi ÝÕ¢9G -£´ÕSd—Ò(Êzö™\-?§,ëkĵ–oê ,:6 ,,yD¬#›@«598á½d!¶Ä"KÝApšB° –H¹ AE‡µ®eÛ# xaÊݽ-aÙYæe`h‡ƒöóuÅÙú Ø‹!¡,&QÍ0/_åæC3÷¦ü¿/ÄÈ»h•í ?‹L:ÔÔ-õiŸ¹>ÛwEN9¿Þ ÖÍÏÿ Ñ,¨›ðëy핊#‡#ÀÕÌUIžÒ¯V÷3(^Ù'# I»„vTVÇÿ÷Èú¼†Èbá q'FQÅBP) pW_£ûr!÷:Àû·’ö÷Äêâ¾¥Ú¯ôÀ Ÿ›«(ï̾“Np&<½L…²}{ý¦éZÇ+qªŸXÕ|Ü]æÉ5N ¡ñ¹eÈ}âw {sæX 1MFb @ÞÉ…¤=tb ›åL™òd‡\´$£ýÒÆ¥]ªï– Æôeîß‚ï^Ò…!^9 îÏ*ûjf™Ú-pÖRÖÖ!Ic½K7H4ŒÊÚ¶6:ßì,ÓäÉ7:a®^ô&:³Pøs¼@C!ˆËÊP>Û‚Ì~·Fþqö•ÀSJ?eÝ”÷71IÛ$wk²Æ¢I þŽÆQ`7's<«ÖåqîÊÔa8‰ ‘ÄÇ?ˆµ!ülóÐÀ6&é”ô7DŒó«jû>œRtŠÁh`¾R»|¥Ÿ ‘pØÿ"ðøÁyqÚYF¶€Á¥¥`»ÚF;çZ5éÓ…ò˜›U”e”MïóU¸šòVÁqœ¤Eâ|7¹{ý™ˆiöÐ:wßåã9ܱs&}>Ø,{„÷Í !K]t|0uº‡E©·N9âhÆõeYÌÜÍÚêØ‘ÿ;©©ï˜ŠÎi€k$?=8F†|W˜­’Y›3$y‡±BÛߊ®{Yæ [ærÉÄ?èÞWcÄ-™º¸ïS>)g9¡Æ°¦ôþãÐ¼Ñ iñÑø>:çqߨ ë.}mvµ3;Ü +uš1è¸E-Â{‘´Lq…Ô3å” RRÆ•ýÔÔüü@Ø­ûZÂ6Å„›t­è"šh] T^tCùU,1íÎd½€[…Øj¬hIµ b<ÏTp‚¨ÙºUGº›¼Mz·Äܲæ¤Õ³Ä*&¡t𒥨,›Ý—˜ Ã9é«* „¼Ä÷Öí«©jY:ä;Rm¢ðN?ëGáó´â«È¨øµ ¼ßÒþDgˆ&ˆék6‚l¨où‹î«ÞòR”JZi<Üä¯nOqÉ©¶Ö'ÀgHó”À£DÙ8u)(åbRŽ‚Ú|µ] øºEa3Ôó|°Åñou ËŽ­õz´" <@áxî÷¥BbžÐÑQ¦ OïÚòî;VÔ¡¢ôH<]†,öÒà%~ôë°ñ­W|XìˆÖE÷H –ÂFùÀÏíÿç±E„KÒo‰¯“ÊmUbþå¥ÝŸ@ïW¢8¬2œÚߢý/U…  í÷{6}I:Ò0}–ˆò‚‚g8u(ÅÊOŽè7ˆDF€µ·7B~«9]¸þzÆï {S^GZÍÒ}Z<3Œ0Îðä"H£ÒÓÖRó=Kßoi¾Öqõ ëq÷´õž¢FZôù†%ð­àÇ+1ÑÇŽ}Õ¥BД²_¯—ÁQœ’'Óòi¼a½G¢¦X\ú}U¦±óKB!=èK»”© ÿ€F‹y* Ùï+'ÓsaH·óèŸm›®jG"’^TÏ€²5G¨(Lx+û›z$³m<ùžyñôàº6;„Õš4ž™ØŒO}Òò‰ê 7§kàÑÇ<‚=ûûT£u•\îV=p¥üï6døŒÕ@HQîµévC?Ÿ-8£œúHš°f¬ l4*Ûý³ô¯:ïõ_Ô|@ac0޲õik…AI=ƒ«ˆðÖç~{¼˨Žwf˜¦ŠÒÀÈD×çãØŒCÚþŠ)³œ‘ó»>ŠÓ¾—;!ÇQ(\X¤¡Ii^k&4 ûÜÛx¯½ùC7ðv·¾ÅE/.›kü01¬Ï%øQWæ¾#öËY•îºÿRfˆ1¾-ˆÖ]»?®·E++¹W>cSï‡G½ë#˜|ÒˆôyKe­cô…$ªtþcquÚòÇþ›Úoõï£(”¯œá¶Ø~J·ýÎé.âà¼&Œ+’Ï4í’ѯ‚Ž7>ºf<ѰŒ ÅfDÓ•Á$ÈHOE7ý¬G¦´û„¡¼ËG—C:A‡–Ø·ØœþÓE-ú„xƒwjΉiãž(t#A!úÚ…‚åQv3 Ý9I)y–wq{fù4Wcp\ãoéõS_Ë9bþ2ÖyEö°?Æ9ÒìÎ2^„@H—tö›ï·æ\™ Š6‚žàæ ”#_õVµt½ŸkÕIXúw¬iŒ‘T´¼x(ƪ>L$„´6êôÚä9¶/qÂ#,6¹)ô…O³…ryüZªø)@÷#²áâž5ß“—·ºwÃ5ÿ.Ö°_ƒd`2”‡ÅH+oò5ˆõÔ(ꟜX£±Z²‘8ÌÚŸo ó%öÎB—ÓþŽã'$IEd5j‰^ñYø«žœ7¢_’yþ€¡‹,0äUòœÈK}öÓÃÚ¦_~=r¥}|”Wƒîâ4hû¤ót’øÈúD‹7s|P¼˜`V r‘ܤ•i˜u!¹è‡Ù}J°W¢ J3Ë™Ó68$û7ì-Ô‘cƒI-ôÀ2ð“Å~ÌÌ Ô’Ê›šNÝΜ³PÓ]U†Îª6Îw™Ø`£<Ž•9ùŸy)z]Ó6ºÊ4[/Ô¶œ%ÿa¡÷°Vå¾ošga•yÅ„à‘ûö#XŠ”‘”\‘Êûaøi]œ¹JC†S„˜> ÞÏ~?¨^3ýÈÙY‘ô+UÔæTÑàîzWŸ†Àh/§îZˆ"•b¼ÜræQøØÅz¯-fiå8Ý¿‡âžvËÙÓšøx€ø8n?CW<€Â`¬¬5Lñ);JjÌ¿ŸÚëž7†~r¯èIê$ÀŸ¥7æ?7Á饬T¿qIðî3Xö+Mà ŽêÉ8®Þy¹Þ*ÿh4xjÛvØ |þvÿýƒ‰¸ð-‹x#…¼P·|¦Qå†íD÷ŽY¹ñ%Ü!î†A"7f4žqRàEñ_A„ä—j¶›y½jÉŽ#“˜oô ’ÀzaJU¡Z`ÓaUBhÚ„«òxô‡ÛйâÏF6CŒ¡Ã Ü›øÝÌ™åÎ5,¯§³+éÉš,/ùý©j')Z©×cR¯ ÀÛð °§*ÞG¦U8Ãê­:$p óË4uß;Ríâ{}5¦hù}ÁÐ8 õl0ƒ³àLO8¯}zóµ&F‡Záö˜§Øþ˜ŸïŸ{—T¹¹ªàÏj}xô甫…`Áã (ÓN¶¡g"Ä%»¿`÷YFß:>þÉgó*ƒ‚x©j<Ê‹€€Çá±QøjÌ~°õ²k`=¼@Ç_=òFý 8!K[cŠÿ~VºÜý¹¾ËŽhü…ËdÕ {˜ûÙÆð­»¹¯¢–Ü_/GªÿW.ñãÖgí¢¡Õí&D.žZý¤?&1wó¡E]Q ­Céà “]d½úò•@BÏòlU¥!j‰áêGWAkuû}¯=¬ñvCTìòòÓ]@ãÖÏuñx¡$§ª©¸œ•œ`(0áojT(%€¾:mvéÙpY´cG|!Æ/\6iD=ADÒXIK¿"‰3ˆR~Û‡•³x^.c³ôŸÛ®D}Wº©µÙ#xØÿCçùäJà8ÇcñÂpóAI”ýNeÞ ¿¤97ÀiSW/G!„ •ÔÉì© +4¨Ÿ†[XjÆ¥E.9<¯ækàBÀ€~¹›P¦Ãwú’¥¤ÑzZÂþ·kú§ÉTü‰l“”«2hUSñsYcñsY²o(•—‰Ö=`œî²F^¿ïs…Öu|qïJb÷YŠ:xçÚÓ–’ŠÝS'&@ª°ö5SL>»gèô{w2±^ÙÓ± ÐMqd;/˜M‹bêz¨o4bú‹7Žy~CŠt¡0VÓ–b-’U…š°‘Â7ç¾^`[GH»œQH>Œ• ÓW{ü!opù6õPáçëïgbŒ4UcfÉ©9/ƒeázÍóâ€Nž²«›.O?žHlܽ¡ÜÞ¢XÜH³"qZ~­nt+\ÝuÝJÑÿ5仯êM£zSü:‰* ›ýÿÓ‹ý}¥wè[N¸Ìp«©Á+ÿ*åƒÞ*'› IWß}è?›Pt¬e¿S0GÕ³w:'VµªÒŒÑN/>®²Þªœ¨¿€xžÜ•˜LЗ…«³2{ÖÊP¨ªârâž(Œ²×UdËx'Aœutß¼|'wÿIäg¢fDÇÞÍþàì›m¶Øþ£€/€—©[)”A}Žõž? ´ƒ?ºhŸ‘ò€Ý•?%°~%-œ¶—í*ÜŽ)Ýl¾Ê· > ‡àsT«µ¦–̓â¬BZ{”‰)1—{LGÑW¡…‚’µ–>ÂKÙu"-èaÝÈCÇÃ" b˜x˜GY.”âîÉÚ±<âÄáù%@C:a­îiÊ_yAçé?;š‰E35WuæÝÝôC${™¸LR€À\±mÇÞñŸXSÐîa9`h ã€9JLx§*nÉé"ÿTëÁaSîŠ1ƒñXˆ˜1‘¨}ÿIÀGàèHU&=__qjÔs þ™l™\RZåöú¾_o©ýöú?ÿ±¾_o¨½öúz_o ðöRÄú½/·Ò*}]Ïÿ­0á#5¾Û®Ík1,©6Vt””X¶òaÝ®m–‚\Ú\Í¿™Eä'ß࣭¿`³ï¾ŸH‰f€L[Ì:LJZÖOË2å¾zž°«y€YmvT>+¸&Ê#Jµ4²zJÕ¶Ó/,§ûϧ'Y]téÛ´ûX(ÏzýO“[FW´¿ÓäàËcrµ´GVrã>pÛž¬K­ÙtÓ:åeíïSÈ©¨~ÌWÖdæÜmÇ%×Ö)»v þ#‹0ðG’"–}!`,ïL% KÌÇIX{fþ¿7c!Јà[óo+Žw"ånœ“Õ©¸ÈŽ›`ÖÚ„Õ{Ù \XÅàŽ$LIaYˆI aÐôÎ šªÈP?èÖ@“5:|IÌÔ³pœeðïê4£ˆþt½Að b<ÿtTáÇϸU«–nDõŠ–ç}Æ£hè˜ ˜Ë*4(}%3†¢ç®3ðËn˜h3sŠ7â;þta‡qaȘ×_%¤TÁ÷3•wÕÏ”§$ ùv²[_ [”§“£þ74„Ówƒ¡åÐ`:nE¾ÕuØ@,—CÅ„í¿_zßè>Bëð%IŒ~õÞ+É"¶\#II‡ O¤ÚOº÷Çநω…ÈMRS0E•oEõ+èGZtŠÚ.ƒï^¡Ò5Ó *¸’† ÇÉ{¿ ¸´FÎ`´°8ª@A$à•Ècw›ð©ŸQ¬T[ó^R>;ºÖ»è-ÕŠjŠ\(2m1a-R9aí­,‡ëÊÜP•õO{t*®HÚÀ3å—W¥~3]8ìfX1òq< ›/(&’žYf0·µ7› ùhç ‘ÜWµáÕªB*êCXàñÄŒj¦-\Ç68®¼óK7:¾‚ã´kd)L÷ƒI O‡sþÿ7ã!A™J+Éו9}ÖrBfIhë3w°³ªÛ¼RÆ,¥!Ž>½n«üG‰ co7-h$ZÒ­SCS´-WÈÿwE…p@û«È øØƒÇ°~Þ˜ý„Æ›üòn÷»˜˜hÅI/žÆìT–ýýË×õæRMP#0~ZbŠûìÖJ†?ÃOX}t„¿©¤0l08Ìfgî×b7À3U±Š ê ’ÓÚÕ9¦F¥reGšI‡Â`«P%ø«øF|âPì_0–¹µ4ÂOÅ@è—ÓÑL•°>.»µª¹%î¤/*ÛÝUX AW–Еž)WüÔñÊú6€zl¯l=^‡õr å<á^NFZšS1ñõJ” ™mNŽž3F€i~•JÍ:ˆgã=]Á©> lå>EºÊåz_“A™@­p‹óUýÒx‰¾‘îÑ×D×õ<ø—WrÔ2Q9$õ{RGÎþþéORe® jÏÃÝuGÊ‚>i48·uܺèWõ•z·t#:{ ¡PO¨v²€3·ô~ù^sŽSŸ3jŒ"—u·Æ6M± ßýØríoÀy…óGìuê—úê¥ÒØ¥•9ƒ‘6Ð.ÏJ vƒg¸VGѺé+âÀÚz¸Ëf¹°žÀíñ;.úõÆ?k0ÿL°¬  G“ÃǾhO¤âq äG”˜hwkw:8»¶C®ûͲîA~[AR Ǽ„mô³Ou M?*h-¢ÝDI©Pǃ0·çrRäåw;,߸áj z…j†}[îâÇô¬2¾_dÆ¡ÿJ`vBͱÍUí†".Rpu²ÝÐbþD–WO°Ué©£x2\_ÕCç`Þ“\wØj¶' èŒ]KߢßÙ³ÿpã+–BAÜâ›Cíu/±éOÀhü#9*™[¹é¡ç3¤‰Ïåz\ÙJb¹Ì¶R£"6ÑvõÇnü¢œ1àw ÈT æ…AW0Zµ mëé󚣦+½¶È$HGk~|ùp)w(û¬“ÂM&wh`S­ûðÔ^î+sñ9‡Óà FÁŽÂûV•éQ(w´†«2÷Æ šŒ²…Þ×²Þ hZØÑD4ê¶®Iå0]ÔD´½ö¥T“+'OªÓò9|V h9½oŒ‹Mùû(¦óªol¢ñ(¦ãyÒ½û²…A1Å¥ü ü»gvËÔI÷’ùCYxrù‘Õ ÊÂIñß mÅ™&(ï²ôÆtgÍÓ!À⤀‰5mAú¸Vü ±¨æƒú å¨Gu;Ù²P—tæÙã«ÍŒÏ"µôÊæ ä½/Æ´Ý0«R+«XÍfè-q¥žûΙÛZ¼zü”ÑÏ5uJ ÃÄV1àB6”×4éy|†>¥†ÄŽtÞÖK0Ÿ_ŒzKƒ™íNô^®=— s`xDèÚ+µþН2š^ÕépÙZ5˜˜ÁÆçh(ü[å2\L„³“xD^8 ꟹi%æ‡äÓWòm¯Þ1”t¾¤œîÞ9÷zÂaÄ©]jH¿õ-uf™¦Æ|e 'Ò½© ß¡ €íŽúÿ‡ v”1éAÂGþ‡ßŠþbµ»Ñ»Ëù5—fk*oιÿ|ižïm'lšJõRÍÑ’'°ûWÏ$Ô+Ew‚5'—ùoÓ´—ƒpiþ°<$P:Ð JYØ¥Fýãhþ‚O¬×ôÙ%6#öÙ[ìµUX—$ÉÄ’xm“"÷dÓ"­kD³¼.üB%mÑ *­[F‚ÊfÀÖßYöâg\cóBÇG`Aü6z}=ùi/ƯóÛNÙ/UphL6#àIðY3.X) 9Íî;G>a±¦(/xj²2‚йw GBí¥¶Æ* ´Ûb‹QÕÎ|ÝÆ”Oy«W^á¿aíLyhwP&M´O­L‘À‘ð7žê¥@ «¹þK;‡ÂYm”Ø0G·vòa±£WÇ»®_´¥ºe§€jà âx–ÄœÌĵŽô ¦R,5 „¬Oa¦{Úv?·²íOZ¢ ÑDäí¦èÆb•&gM §^Æ\¤”Óþ®ÿSùbœEç‘^ZOì³ÿq…DŸˆ-ÄŸ+ŸûmsFE»¨²oMK“úÈL2Q9j [”ºÂv[‡gÊ«îÉ¢YÞúð3ðDè͸†Š¶B;tè©\ðwÌ|î \êW‚¼=¸t¼¯Æ2Lì÷Ã×puw›{›·*¤÷õ½£ FÙœ+ˆ¶E8 R×AÕºáloÕ™`ØØ(Ö­²‡ð™ õH«TE<âz§ PS0àO9°PØ8ª–×§#ý’^eŒ½}Kp'¥ô]ƹxåsíûØòA^ékk¯¯Ù-Îæ½Êñ¤6â®<2Vå¢ úóvü[ê}ÆÉîw ¨´‹åBÚhx¯‡Ö# ??À¸JúHz'4¦.•S<ùõJ©'·"˜ö¤Öú!í1ØÚö&:×Á*¯ /7ýÊÞ´êÿxŽ&ÜÑ;§9âáC/\²îäËÇŠYÖ“IbEe,ï¤OVÒ\ò‘¬ áùÉP™ ë‘A÷/ù®Ñö˜áˆmGQÚ‘<3>:«Ž–ëð£+tñv›/ÊË`1ÞËdqžPÀº¥üŒ¼פ'<Ñ·Â Žkp9á)G¿‚’\!¡Ú‚uáù3{ð¤æ¯+ËYĬs#O™ð ~©T1ÉÄc€ÐÄxø¢ªz³WKWŸOTêòqTï@6å(GÎ킲"£E“!É }°•Ìb\ç"4¦ˆ.ƒŸÔªÞÑp¸+:¨Ý›eä5n•G˜ŒrÉ@²û´EÁ­ Êv)w„(çŸ`u±gq†ôËÔ®lÁ©$:}«ã,\—­;æiÊ?ýôæò¶?X’jw³6,¯JÇÞï(Ùò­`ë–Ú½yG¨?ž…[ü ¥ AÈŸU§zuJguüícÞ+ T y“‰.’*NÜ2!¹Kj††ÕÁô¢É¯#^tÝI"´”v¥[½,~Ù`?+†^Oº¢TkiÖ?1©Æ}Cø£*ûÍL³VØÎp²õmÙ/æuïX'ûÀÏ“¢å>í±’%ë@£ÚÌþd53¡ï¸™H{ʯ˜°£Ÿ÷ä M©LÌvŸÜŽ\ ÂÜÓ‡W{Î!ögè+<ã›]—}Ù*ɨ®B\®ÇrüàØôJW\„s Ww—©Y¸»Ýlt{bŠJ˜dˆ”Ý…“ùÆaç¶Û=pÁ¹rSa>ú?»¢%ÍmˆÌù;fÞà Y|u*_zߺMx±lö¿'ñ´P̽ Þ¥Ü €Ó”š»žý±6Bþô5GéXÈÈÆ_¾®iîPJ©d¿Žè_›‘iÔÓϦiÆã@ÞÅ¿r¸Г/üD=gö×>2qG–’¦}ç¿@ìŒ4Ó%UèPÎGQãñÙÕ=ö©nê‹âíwc¿ÀÞgÏIðí;,Š“x<&Ï%IaÍ:˜Œœº m’h(T(ˆpD¨ᇙTK¸×ù;¥³;2äs !ÔDÂ-††ÿ]tôMþÌåi†@x$ËýžB•ŒÔu]—ÐuÒ»æ–Q[³3µIŸÿa™ì퀛4(>ØÐ ª¹w§»Iß eš À.¡Ž7`ý‡é-çKyÖ䘳A„ƒ¸ŸCIÜîW}öyä3©ašuÃ:ÒË(öiya£HO5>¸zÄ*Ó2Î(‰öíÒù[bÝMÜ f.ßÈMyÛM!ÅÏqµA¾¬aœ‰³¹mÈ¿ €ÍÂ8EB:Y?x«=Á>i>¹ã3:K´S¿™ôUÚÉâd‚¨Ž¾6ƒvÿPx—§$´Â}ƒ¿)d¸|Êš] { ÌŒyÊÅ þØ1+ø£”õ?؉(0œÖªÐo6x~/¼Wv|ã‘ZË1‘¾˜„º)÷é˜BK¡Ôsäÿe¡øÚ^ýÚ‡<û zq/AÝ9yC"Nû]H~uÎ4ï#°?ž"›lk3WuÁ Çâbxɼýþ-Ìß6yQ|„À§A^=ëJŠŒNšT…w&é¯`úµ³æpTu(;ðP‚W±Ç(‹öÉ3ˆyÄés’3÷RºG-¢ñ«}¼ ¦¾çwšb‘mlPof¿¦i|®k «QE:ºüè6(ÿ<ô‡k?\ñ‰ä¤’I$’I$’I#÷­iÇ 3Ïø…êÁý9êpÚº2úV´Æ¼U]óP]è“bÞL^%Wc·t27/€Ð;2zKsÛÙ¸ÅÐ=GÅ‘;šO°Õˆ³ÅU:싟èqªšš+Š*Eð‚¡Œyk‰EÙçƒE!cœ2€èŒ@ªû¿š.X=#÷­>ýÇtà“v“ÓxÙ"´èc|·êÝþËÒI ³¢,} P4å¥ xB„*¢ç£¤J lË¥kF>¯d*OãÝ—;r”a¯» cÄëÎLÑÞH<ûÏNy«òŠ\3*_`Ù´îãÌ®ñ1-ìn³éå>ŒLxö†1UÂænMï\8Ûâ dêšÕnÆ)²l! Š~éÉ Êì4W´œ=1; +Xjt†J!’@—„E²,’9µ@ßÀx2ºÂÙ§ã,GŠmws³i SXnêz.‡TS 2Ökº÷±üIQø'Q×FÆçÒjêr\|ÜŽh8^f!¶7d;Ú·l6ºï¸ÁƼݞ»÷»šì„9/¶áè„úF,ç¦N½Ìs 4ƒKv­*àŽE4— Fî\X>×_ÎÄÌtÄ™T%Ò݃â´ïG b~’ £ëUj Çä™v‚‘eGË¿^S³)>lxÿ"¢·GwùòÁ(5[<‰¹Þ¤f†:íØ'6ž"˜÷ÿjÙ¹¾¥ã¯ÀnÌe 0UÖ­ kg‘ÜÄÏ@'ÚÈþ…Çbÿu*žõåhox ÕöøªÌD’–¦Ññ¹*Ø: /˜ª“½:hóq0ŽêGE²mhÑàm£öãM@] Ùê儃dÜ‹¡÷ ö[!ø‡–¦†î)cm»Ù:yÌnÄ=Jˆ8£‘PñTPxØfk,Ôçö”5þÆKä ˜¨ÿ>/Q†i}7Ç÷Ò©)MT¤BæÑ>â§"ü+ì)š¦éäƒ4ë›DàßA¾Iµ:°¬ÜHÁoý׬Âîâ‡")/f„ë½wäi;Ó: ø€ôË÷ñò´PjvÊæèÁ)©Ü“9t’iºÚ)ѽmØ®Uš¦ñšzšq×´ÓÛ¯Ÿ¤D(uãÉeýÿK˜‡Ò.ø w9Ì×[ö€ *z™ÃEêœac-ÛH²ù«4t| °É€áØÜêº;QûG„[°—üéÛÐqàVÛát ,›]] ôøUe+åÝ·k¯z#€€ðvìCä0ªêBZ‚QTƒ2Q"4ÏÊÚßø¾dËŽ`¤í€D r • ÑàNÄÜj–4J¥ÌDíÛ%AòõôΣÓ=_‰êåÛ'dGqïäßP)só ®þXCïUñ7]1éÔÀp0T ÈÊ—é¶ö·‘©šñüa!,$ÍÎÂô³ù;¢2ÔuC|†ÆÓülxJŸW:Üj´‹EK™£åøúÀ;›í€ÿ&ÃÉŠ´N7jÌ ŽÊ]X‡í©÷Ñ¡ýdùÝ8´`©<ÿZ³˜ÓÖËëw øHʇkŸMþ¥Ô~õíùKEä3]³Mš´øÔ°swÂî6À]‘4$ÕOܹì§r\‰lî,¡qÁ˜{fœ"d*C`Ö¦¤Sᣠ.<)‡ì¼oO±Åæ,íÀf¯xÜÍ–ÒωAŽšÐ÷bu]‚q¾Î%‚õ?´H¿™±þíù"´˜1vKÇ„;ƒ G ƒ¢p| ïŠ õ4%ôqní«ÿ’¨Xrƒc•û!ðw]Ì]õ´GÇìˆ:Ôw- yÁ §¥˜ª?é{³kÔæZ-ºdÜ™U/Ÿ»W˜Œ¼„™À£(m¨Øƒå;zý©ùÓ£•î~HFGÔôCc,ôz{ؼWµ$r@W©›‰¥ùSB]BŽ6–8µâ%h°YOV”©ŸÙ—¤b¬ÑQÍY  cžìæ¡â’¼ˆ›³“/ñÐ ÐIüÉ*ŒáÍšm_«ôlÇLN5dÅ¡¶1ãÈ¿õf4lf«ðø«oúJÛ÷| ·‚€&%Vô…vâVhóG>]yö쪚£:ò@ÍÀñ/ûçÿ1L¿`Ma‹ÔRõŒ$_ý©p9£l„rí¶Ï)gU}è×èfP R½–m¹A{ìI0ø½\¦;#ÒÔ7 ñâÕÙYÅU)ÛRaèÐeÆô’ù4û²}ÃsÙe³iµÚxó3ÂûD¨Çæ •_îùnã9óYçÌ)ÿ5=àÜ/’ðæ"«Êa^±DÌÂ¥Nÿ`ÆSÜôàrÞ„àaö0>¢ßX§¿ÕÐQF˯U=žŒÔº<ÆU4­¸zÕßÔø;M\í0ý,7"€áêNjbÏïõLßj±èìaøeiÒ2ÿYGs³ºau-Ù3 †Óv†WÄ’žÁ©‚1Iž*RWZ‡dQ:17åBSB CÓS·òfŸùNýÅDt± ´r8šÏŒØaàìðt·F’ ˜„®8ϦZ–¯âáY™¬4ó yJ£²)=@€•CûÈz¨¦²|…´×Õ+ÏŽcÄ̽~)×ëä"qð´–Ô”me·Ÿì£©&fèôžŽ¢QIk-4`‹œŒ\øBÚsa ? ‰w¢DšLÍòv¼KT©<¾áLûÏ1ïútL“ÿ,v°=X Ô^;®ƒ1uƒ /EÔTf&VT?•ŒÔ¿Èä«:OJŸC»“ÐG­%ÂÚ±[s©ÂÜ· ®òñèÖŠ6á@A6ŸOêGçœóƒÀŽñ>Je1œ‡[#V²Òqrâуñþ*v’ìúK½?h¹tÆ~FŽ.º”U<ýøeóñÚèàƒZM7ÕÁÖõ¹ÞÎìÏøššÛyëÿ7?z j ò­±£.8sß"J󠻯{Þ¦?‡&¬SùМ‘ˆV©š s 7ãb„D¶Ä@1Tmá ÃPó²ìå#†š{`|GÂ>Êæ»•OaA8±êˆ>ù‘–ò;p´kÉ¢ŒçI”¥õLEÆ›×´Q\~rž/*nG¾¢¶J1L·ø‹)󇧆ÓKï*|¿½˜ÎÍV'e'6ÿGî*N˜±èÇ…üzñŒb½SÐÔý§&y© “%}qŒÝ!€ZEýYc”Š´äɘ-Ç3´6ḄxËÞ2ÏmžI 11Bºÿzƒ¢ÆÄ  —ò¨>­ÕÃý¶%ìÕ¶ÇzDtaò²*¡øférsnq Ž}XÒŸ&4ÝÅ;ÌeóMäh?löÿGí³¼ð'ŸÍË+³×h®нÙºNç¼ -§fĦeÉÉ¿{B?Àn;õ ù³jsüYg‰ö–¹L ¢mÍòa¬QEÞ9AÔ]Ü^‹š&ÙŸbãÛ3k¾ÒÔÑœ,Ñ`Nâ œñÍ÷¸$/cÌrŽ>56ª0/g'æ¸ÃLÙ¾DÚ\3X\ÚP*€T€<1ÂÜAŒ®÷ÜÜάc=¼ž]?)£³ÈdÃ'8RËD(Ž<ÖqÝG#5j bÏïqR\軾ýGNøÙ(FODY@˯IÚÇ(éhR/È äp:®?´¾ß”±hÚ3!o“åPîÒÈ54ØOä…„6¤¥£(¾m£~s¤æ{ˆ)C¦RÖºEð­–Èxé=‘»[¾§.ø(m¿¢éN3>—‘Z’sÜÃTçB)¦ç”ÛìÕÐÙþÌ¡¶_ÛWÀ9pÝžŸÁg.æWZÄ1Xªî³áÝ"W<(þåw9 ܲû6[@1»Ò{%^ŸñPUïÿ-­‚1·„>Ø:jû%}¸—& :X­ýâ_ö«ŽŠT–ÆsŽÞˆûSÝÆ‚Ü€©©²Þ¸bõE2p«b‹Ü‘'æp;,ˆi#Þ¿JÚ°aÇq´^ÓèМ(ˆ“¤xð‰§R†%Û"¶Ù‘€Ú÷àï»cú’ïÀ¸iÏþRw Z·dàÏ>8˜N·W:{Z¢kX³ïìèÅt$§D7XÖž` Sù¡ÓæX6 îóïúü);ćcƒ)îÓêõ.&û’Óý}:½U DÓ—’…|üˆ¥,í8+’w)ßt9å )©B¶ïK¡u% ƒ\l”££NÒ›ƒH`?“AAL+V4E.V :èNø,dÏ´Œ«—ß¿™wœR%[®^ÖgrÊÒHÄs£cL¹]ÿKÿŒDùíY<:8×h»'jD‚±špÓ·UÃθîÂ@¤Â]½ø©’Ué1u2þB,Á{‡“·»³4F8Pk}K6”Zð\QâÂp¥É")Å›Âpo¦hÜ×™A”y¿ ñm’ø/¨ê£5sl<¢ÜJË(óÇP0é}‘ûŽ›W|O /Ü–¡°ÏƒIƒ€Ò]Dq²â^{%6ÚÃåú¹Û+ºú*»Œrcßž#‡¨A¼5BٴͺËr,WÏ:¹ßk¿ÚΣõ¨¬h±›#ÁCÛÑ­Æ? 3É]aŒC‡óî!J"¤¶/×W±Þ+÷©,þx©¥Vó+ÒqYÌì‹|Œ$Ž­_>!á¯î!Ú…‰z‚¤êq«O…b.¿ ÐñÞSj¡tOn²öí<ã5¶¦uTßQ_ÈÝV–#—#$ 1½=lزUúÌ·Yž¥7çj, 6H2ïâŽBl¯#,d¥(y Ü”¬¹Þätirãòbãc·LÞï ëEvΨ˩(é‡xÁþB^×}ÎE"¸˜OUB3æÛ1„·rùÕk†éKäñ{£vÆ£ ™ÉþkÔ$V„KzþÕýäV@Ù=e•A™ó{!â³·°<˜/û©í¡Cß ‡‘o`™9r )ö45´X­¹»ÞV¸‰ExòÖ4eœàÌ€<ÁHóZß·=+yÏø¨ŠL!‡ 'ÏXúÙ=$»,oË££€À;š¸#ý‡­ØÝ¼hO½ˆ3Bfõ?“Hçj^ÑCâGÏ?ƒn+×É[±)E!½XBy¢Gä(…»\cºzµyÛÁwh›‘hÊñ5$=þ}Іwq©÷¾:Ô|™9™V–Ùï‹@Î! v¶ì‰û–ð`ýjØÓÇL¯ ÂÒs*9WS>ß´ lò‡üË>úÁ0hYwìÝÇ"{sðö7’/M ~ñœ©mãmÉhŠlI3MF!uÆ^Ä•­R·+ñk.}Ðúl„"ø03áËÑDÆ`•Å/gGü›õ$£œ’ê–É9ìI® Üò?_ÆY%Ûæ‰Ê½g£ÞÚëۣ®êT 83ÓÊ!o’kÏtêW/H¥`ßÖ”Èx½ø}Æ;ÎôuGk¦Ÿx*Óöš4¯QàÅV¦MGKÑÀS¯%á¶d…ê®'|*›g&ðצQ__ ­qhcße[)xØäÖvWjÆ‚CÖeVÚ $Ï¢G+„­JÚV´óS÷XÚQóCÎ.zœ ‰õгȩ2½t.±Z¤Ò_$œ¡¥tXóÓæwÈRÃdͱЎ̵èì|iùͶeçF§L%ì‘Ú˜”dgy_kÁrs8iSuÚm2õÏÖaÚ(úŒÝB”æÊK‡Þý/‡þƒlÄ’€=b„“»ìÓhjWãNÐÖ‹°DÔºNºnÁÄÈ+Ñέžöó$ˆo Ö5J°VgFóÀ^â4¤Z ~þNóï4±£|Ábµé¥·:ÕUý²¾­îÇÑŠ$Ÿë òïH÷Ëe,:ÀŸÏʈ‘˜ò å Epݤî~Z½µ•ƒAÛEM$2/Ÿ@M–9‹q°ý©ÔC¤›hͽ{cЏÆ@ÀžMO .ö”v<>·ªd2UêØgc`fOºÚ}R=e s/®‚‘œÊò›^òHÃm2ÏHªÆhÅ÷åxG– $`Vä]Þ('…Và5.f|UØ-óÉ:@u>9tˉ8·ÛÄë •\ŒýIéxyõÈ[§wz/_lÄÁ¹ˆiÑ>°ÚlOiËb“‰¦HãDùÔ‚”¶Ð»*0ÔÑP.nR?ålt™äiÍXªà†L{©«{Ãø0˜[_`ÕúAV_¡ØW ƒÉ õòÞ÷wñ‚7C ùþ² ‹•mábX±2‚4¼Rÿ  Ð:ÍR?„zí½1ʯQsÜaY4šÖáûdϵ]ýReÞãsÌo艫iÊ?ãüKLJTø=NPjm¹ý"4òžìœ!ÏIKýZáÁ¼è®þ(‰öóîÔà;ìÆ²/ÀðÚ®Õ”Ì!G<ÃeèQyVø õþ[ƒå25™ÆåôñpJÖ®Ö(+: $ È¿|¡9•ÐJ8eÖwJlRàV÷07Úâˆ\ùÊpAg›ZÅ#ì  Q:´]{…ä‘vèÎ0àÕK“å˜Cæç<ïðÄjå4$ø””fïsY>¡9T{(M#™UÊŽÀñ®’ɈÚáÙbÎñýr´ßý¾˜•Â7p]| /$Ô"ÎC㉆‚7”µ—dÉ(}¬òÝÁ#л~ñ/(ºZ·\é·­öÆ%ßT ÌÔó%¥ƒ7Û{pC,nþö±¹äÙ9ß—øOàù a‹^›ûášP%W=´<–¸ªÑìŸPfˆh¤ójן ¹,›r IŸÐCÞ:¦y‹×ŒsOJÞ-=r[¦½¤@ëKK²ŠQ 3ôùr¥ÃÕÁ€ñëØWàP „,˜4È3B–eu»¦T½nnƒjËÅÑÁÿ0¼ÿyä§ú7¢„šý¦K›7#wbBßžC„½þ%ºð¨YÖvóí…WtÐlEj~!Ë'¤›VÕa~:¯§ó§Ä´Ä\T„6FUœ+·T¿û>Üãy04#r©™@€$Ò4’—õF ™²¡U¡! PÞ70àÁ¦OÊ@úBZVÙ:ËH¶$ –Ñ\òíò¡Ž[^{ JRTå`VNÒPÓóŽLSHB:”š—&.ˆÌŽscB¬‚fin-¬³¶(8‰0×<úz¹+¬ ªw¢Þ^En½ž}qcAb±ååìÔœØô>uøÉmb“H„dO`Q$‡'ã^ ÚÆ‘§äOîfø÷qÚY™Áâ¾ô$5iWƒNFKBkŒ†)éoñ¹ø~®5X:iÞ§ÿ11çÆä°¯¹©Êµö29%ˆà fc›ÕG›—Ta¾jâî‰'½Ý‡çzv%¹‚»(Gjò %«ÑÒ)ÂŽ¾¢¬´âˆOÐÿ$´oñ³æHÛ}6éé¢c,)ØKÓqå‘1üÔ~&Ìœ,›áú±c«’Y1v¯/ÙýfÏÁ þ€N-¿H­“Ê7ÆÏyëW樟5_XÑø*'LTº" Övnw¼ašêkÁk˜þh‡5‚>™ÈíÇð{°!Åo«N÷³xë1ÒzÊLès¿ú%CY‘âc!zÅo*D—ün~¢‹;qýœ=CˆpšÒŒoàAfgÞd“ x££k±ìH”Qön¯Í9SÜå¢b ·„þ'Ý“ôgà/·ˆ;InšÁH±NÝÈ[ý³]’s%öäž\è2G °ä+EEÒwÚ¬RP½"Òñ©êâ&ß?›uO ›bD]ŽJÌqñy+–“ôlÊau”éÁܲKäþÇ”§ïéµ&kÀ[Ýí^£t•ßb ÌtÆÙž>^ªªYŸK¤Yª°k õoö)+è4RèýþJ4•_(ô¬iW+ÎMñ.¾êã˱1ÐSõ f±üh>4µ®“ð”µæx çRsïM®¯°¹¾n2f« +cË X•¹TlŒ/©Ù#À…¨¶®¦}]÷ß =½×¨QQäìD/Äð3í¢óõÊPÀ6ˆÞ ÔQú †áõä[\\æºô¨šFäGYuè"3á€+uÍ»ËÖI£æ[9ÛU6ê,¨V¼[àéy·¿5'Yk s»º|¡3-Œæd;ï/âý\ýOI5Aü=Ûâv‡&¦dˆKÙwÖˆªÃêF³høënH¯æ¤ŒãÔ¸õJoïh &ªq#\/}ý~ æÖL²s¹R{™5cpxΑHîE«]t›«KÔjšc´Ž^µ÷$‡ìå_Üÿ'X‹97”|”ݳh'¹¢_á¿X° "'GÁô ôÓ]ùzÑ¥—sÞ¿u§XH…+VÜÓS›yð<5û{[”ÿAƒ Ól¦‹ëüitÔ´U)+[zÞ9CjÁ‹Ö8Ñg1š{hO“a P/c£á‚®hOà’`v|ã«3ämÙªÌçGr‹®ê~ˆƒ,á¢k½óœ33n"´7FôY>q;ßseÕª>¡Jßã–3¬ –®\_eþõÇ­vEu㥑4™F¨Ð•µHv6ÚU"nϳ 4d"R?u¡Ù™\ò±o¦ Ý9€BÁ3¶Dpw—ƇÈŽ#‘ÝS" éÁyß§¥W!ɳ†7ûpŽ }Z*¬ÐI3_®¾e¦ä7)-;«Á•:?g½œêW,Ìå3¨O\ð÷ù·†tUjÆìÅÔ,\5~´N øKéÌt÷—¤‘/÷‡Vgý fYÔü]Fü.>m|2öå)Ïß$œšëàu,ÆÉú¨6™ê½¿QrW¸‰ðêÓ—ïô_o‰ûH])¶Þy˜ØÓNS¾wª+œ:wó ñZIkwýéñi)Ð ø›Lm šÁ]ê±CJWÛ:þgeï;XVG_‘8ø#ëcV[¹’ó—ôõ¶†Ù7º‹,Có•5wü­¥{R1' nŸCS¿‘X•fÝJñ¾ïûÅag–B”nWá0yÌíažåºCº8“ý—½ý·qmõ l«te[½ÉLod¹Ú¢Mƒ&6ô¯—¸èÞ7ÛåÔOLª1JT=©91×=7Ýöþ=“ˆ °®šr^|~®>E—ݦêå(™ _ú,¯ÚVA(v2úéÂ$mAž¼¥Þ ,°²ÛH¯Üç7üd‹ˆÛÞ‡zdÀRÒ[»©PÆgj¨\0 s‘n¢²SÄOHþhê<ÚÚÏÑNGpáÍ›!µ„,Xv–~®³¿×?Ñ §Í3/ ¹Ñ¶B­_>UE“ÝV.@H¦œ«ÍÑ¡Zý61Ž‘Zª)«ÐMüÏîƒiGÏÙ†˜”U -àY«†/8S¹É“NV`ƒiWX}«÷(s7un9ÌEþð^>"`×é”´èaô´ÜªáS¡hÅÍøl™]íPÚ^†‘KÈ=Hø¨·Žlļy»Ó®+ÙUgE.âóÃ?‚5nÔÔ€ë“×ì«ÊÝúb0þQ¹Œ0ô}³õàçMt@è 3Ú‹ @¿Ì2~ [@;mšÃPcï¼f¾ˆÙ4"Œ\¢{¡Ø|¢N¯,FÍãV͉æFÜïW6xD‚0–a±ìºÄš ™ž†‰úBWhaÛŠYä×Q‹Ô¯ âdr·Yâ>S#²8¼­u<¿P_x_ B·>ýdÞü¥ˆŽ=“wÒß‚›Ç ­Z‚2ʾžËyÑrs!)î0Øœ?Çñ(5œ®Xéô¹çpn7£?NLKs¯É}ÞªŽ@ì¿àr•q{aQ÷ÁF¹ÌjO¤·¦Úv(ì®1{[(JÇ‚›vt›q“±Óù«jòdM™¢s°§"&‹¥ŽiÀ;Í„Ty<öt n¦MÖšgF\ðg†uâÂ)®lR{ïêm+9Ç 4 3D@¼©?„*€€ãö¬~ÛSö§~ÝÇíLý¶õ'þÝ'Â|çÿ6¯Ÿ9ÿm·v;ýý_ÿ%`AÉ3 °˜HŒ¨8̯ùû16‡ÿ„t3$ yÛ ¾X<49)¤—*=<¯§éú~Ÿ§éú~Ÿ§é­ êf¤ zÃßñä)m›Sq,a/ññ ä*°bҘϩýA¤@Ðÿ ƒÂ™l~–õÔòà<›ý&®=L¢Ä¼ ñÞ–´‡OÞ!4þ~Òìü›8/l%¯w~Œü«9 2ù8èÌÞü-Æ6QÕ6 «_G^W“t Ÿ‡ Pk¶š(vÍ]0¥…ÚøE@ØKâ1Ë;åi¼2¸»hÑq—~¦á•=½æËúœ§¸d—]Š‘=¼CbM}oŸà€…¥Õ÷x#K,?Iõ×ËÎç9HȾ“€Ë¥êݨ÷>Å%s^íùû—õµÜ[Ê_Z¢Ê£)Ü`0€}5óm-A<ÎÎ,þ ÚͺÂO™º)#¿ñüÇñü~è:Ÿ°†NDw½Ô㙓[‰Øƒa<š¤n“hÑLˆ½"•q–$³O9ÇøƒÇ-ýom gZ´ã8÷äÆÞ Ž*ˆ‹ˆ÷KëE™k ŸéO>°²&I %Y¢ø©°&f«]½º%(v¨UmºçøV—î¸K Ø3E`ŸXUc>—öš$ÿXf3=ÿ6J¾”;p‘ÌIþèMq͵­6ä±åV‚ÅÚD=ø*W„yï=“Q3ƒ6Ìwh@×j¾‰‰7bç{; |:`Å00ª´ ÉÂeƒÚ'šv †YÕäDáür¹ö‡Ã¾t¡Iª+š8cŸ'Æg+^ã\Ö¹”72?†¤òù\õg±O;S‘'0ªûû‚h ¯‰‚ÊD™ÏOOR©{ úBówc¿þ³Â,]Œü(Ö”›Q‹º# •wËHý²’Á̯µ¸£„vu#ˆó8~Îí¤˜ýN…öÆèâîoQôA]ñ)†„ xLQk7œ_úe©ûKAkq°Z_ØH©œ€hÂyš«¿azmÄvÐfŠ‚ b\knéÖüá7ñÌÓ2±‰±.t»ï„`.æÎŸY#Yƒørna fenÎZg†ü+k›•P¨60©yoÕ`N ©Ö¨Ên4æ!$æÒÜ4|¿U‰.ÇX­F#.z.©)Œ-0Õ Í[ɬ¥½çþ¶¸±«}ïà¿2{_š5 ~cøIŠÊ|XVõ…fùø?Œ÷C@ª6+.cÿGéܯÂA¥˜â0P•íá¡02|* “Vnª¨S‘ÈþäDT4°ÛNñF.~ˆY³t® bž*hˆÕÚ¼dþÿ‰êê¯O¦ãßl¸F—1C9†#ûaKß‚ŸcuÉÚ’äñ@<9 ýÚ 'µ è‘F„Ô>nµ‚r„"‡•'ow¾ ü*v!Kó¬’P~Î'—›±w %—ý4(€Ñ—¨‚7á/¬I=ˆ¤mžŒa¢)°F#gxôMÆõ›R óp²Ô¡Ò&Ò¦mì"GŒVW'k‚£foöEùé ê«SÚ¶sÜ.Å¿á^ÏŒE¼ž~]Äç° “UÿIW;j5f[¤ôs ÖÀŠçh€j:iõ+<§öœrØêsK¨¼ƒƒ"¦1.«}´=F‰Ɇk˜ ƒø’ü½§Ùª«0b£Ãr稅ÍkO‡ààšD2P–[ÛMÕ<Б' §ß}}ÛrWõ®TC_º.Ó0%›tI$h=—ÿq›Œ&ãw¬Wuµ;ÇÞÎñBßŒÞ TØöNaé z¿A>áG·z—dô ¥`†¦%a,EšçžQñNH¬Žx¾Ï½¦#a«Ê‰°2ÿ+zð`˜ôÄhÎÏÚÆüÆó0ðéůš®¤yÒÅ“ÙïgñF‘UÚq’Å’únÄV'™´GfX+‘·{{ê y}ÿ O:zXÌòí%΂‡Þu#ôÂzKNrwUFÞ5±ŽÆ88[ê÷>Å%¡î%ö!f- Ñ”¹ø4Ô*†ƒøuN¥RÏïáïp3Æä­sb­¥?€è¿vRÍ…w˵UÅ#r½…̪©Ë^Õ©óõó6„$j#æÔدӭǪÂñ3[pp«_¹½ÉßæPë7MœWš”öXÇeZÉì™)¹õk+‡´¶s£P|ûn·%C-eCùSŒ¦7:€y” יʡM¦IḼ¯—8†Æ6ZàÊv2“¡q½gMKÈe¯yÙƒŠëø©zËx«ˆÙÒ½ ¼c°7¡š_÷«:²yèÚ÷UF2©l¯wX«§nœ-/OL(N£@æ¹è¥ÉÿÙic09 jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ £ÿ“ÏÂö^ßj(©OX¯[tÕ»e2«D„€)Y´]M™|X/GÑ+ ÷qlOûr@'J!Ñgz?³pȯ6Ó"ã•#¹KyB§Ô#Ød\VЮ¥K§ÉRZµT ¾}á×Ô” ‰àºÉí’&µ‚y¢S'Å>#üñœ“tãÖFh úÁ<­=;F;£>ûYºßù¤ø ¯Gœ[³Ç©ÁCÕ¨ŠQ~6™ÉI@µÐѨ$¿Ë¯¢„*²ÝfÅKér•ã1XÔ£<úÝÔ’ jS:"Awõ:d‹•µ±n>²•˜"@Ä gH$åe*Ë€€ÏÂÇ^›1A (ñ³’÷6–è`˜jÞd\)GVæ‹èfž‘¨¥h77ðõH·4š·˜ £ÑkWŸù—Ú«‘¢m"q9Η~ùód*ü|ÏÇ…˜N½:RŠö·3œ÷‚”˜g»NPdE„o˜ÃÅþØ-OáQMÈ”ç÷ÒA.$BwO<Û^. ¶R´ži[lÄöüû.…*àÄf† Àµ”©cFt1Æ=/sŒiÙ÷¼!À¡4£Me÷U&•úá u¤lŒÏÎÎÂÎÎÒ©7[K”é4 O…y9ñt¾Âõ™¤Š¢p7Ƨf¸¼ÕC?ݸ; bp±Â 0FÉËIÿƒLÇž Þ¢ƒ$ŒÛýqor7\h›cÛ\õ_/m+•«Z)a%)(q"±ó_B‹+¯ÆI‚ä…šú°£û„Lñ ä9„ê"SÎåñeSÏ~:lü‚êôP¼*Ç;z¾U̬¬Ø[眡%âl—pg*™_·¿–ÁN°Ù*æ¤îƒ~¨2Ö ƒÒP„AvaW…šTTî="c³nBèúz:Ûi2Œ”Öüøi—ÌÿrY«Ê{^“Æ|&ð°s+ãùŸJ¯“¼“(ÒPXÆE\„•’ D_?HY™ Ÿ | ’0X($ ¨ôÑó°÷I¸§³ ØýÛ¼‡ÒnÚŒdƒ?ËÁtZg5ªÛ~ÃÜ–›×òß¼Äû¦!{^›¾Xï—'­ÐB‡ sý—½fj5z²üE¿ìsʯ9|5u}ÎMÜCØjÍ{lñ¯Pê…RݘgÆÚ ÿ‚›|—rÆ øRSEQ©Ìö%ÝNMÀ¿IÀGa*†*‰±TO@é_W†Ùe8 4±Pj æE%eÐ&#¬p°/%x#˜`³ÕGÔµ5iŠw'@â}åM©Æ™È&t,÷­ÈíðÆ\ïòêÃòÚ V[cOˆd>9Âÿ>˜š÷nÀÅÑ1k‰Ë 7¤¾S'v/ó\fd-œäµW›’ŸïŒŸ\Ž~‚sHL_ÞXè­½$b͆õí2ù­J‘ýð–?ÖÚî_qÿC+­q/ã,æZ¨­éC€€ÏÍr?~ ­>Vîr² *;”- ‡Àj<µ(®Añÿ%‚ ¯?ZèX*Iž=/J V˜¨ÈÞ«‰4v6Åro^$¬W;*YNŸÃ:èå£^pÏreè(nkb"¹gÏ`ºƒZ< "c³nq!'ó J®Sý÷É!y¹„Šw8tŸ€¡‡£{|émy’-I¤·…ËÛo£pþè…0«2·7GàŒr˜>ýÀy¿/ <Ç*ηºÉ$A”j¾å¤&þC~ÔØ÷>ò„ow~òSòCÉætœï,ñRžZû-Rmë^R¡Pí³Á²ñ0)•wÆå®bwáØ2Š:v¾ÏϬ ùõIŸWฮwm¬i";`n†UPlvæ™ä¨ËGN¹Ö·PéÚ'úJLK}ã:n¯q´ x¨³¢3ó)ij2WÎÅPró“Úm»³J–»íËt³3ž¢ÌpBžÆ|;PmsÓ~@c3^+òüÝ¢lX’žÚ!½–ï¼\tŽƒ]`É’ —âäS‰qIû¬í42Î4™>$’"5Ðö§¬$Âprz7#O‹½(ÛA›Ü¦9:×(µšÁR”Êß/&‰’m¢!ðWã~µCÿL2m˶E9Ãýªvy¹­B‹"i·‰|{O9sû,pÆÒwaµlz¬m{ŒœFØ&f!¯ÍÄx)t‡‰w¾%r±û€³-ñW³n¤œHvC8ž‰‰­êüÊ"ä\e­µ6@K  ý†ò€ÔõnY^ÉÈ…ðôZÌrm2Š[™…ìOµ}òº'Q õäšbjDÞK|†Ïq„š@êˆÄÑ öãe»”ö+=!\ÁÏ‘°²áp&™€ÝbGRY/ÜbžÞµl‘qÞ7áuä¥@?ÏK ¨"lÊ@Nc’»A"¿Kþ(eq§RkûÑÞ/CÙW9§ ™Q£·{Ï&¼àülù)˜®5EÂy›:äU‰3…2¢¿ ­¸á\>ªàMš¯Îï•äB!]<ÔŠ´}KÁª‰DÊ1œZæw›k©4ž\% ä_¥|1Ü©5 @¦e¹ŸZŽÏà×ЪDy¤CKø2tß¿t=u^6cB™¶ï}söð=|3˜%û/Xô—9 ûtI¬‡æEAy;{%OSþr1w«Nòýɾ· $úP˜ƒLZÊ}FçB<õàÏ?'%ÎÌÀ6.œîï;r…¾ˆ,¸âøÖ”ÖB¢‡ÛÙÔumœa’Ê…ÑkÎÒp›§óÖ¿ÖýZÄtXÛ·ˆùo9UíDÐøÄ$U˜# u’©È †3dͰSä­Ûí®ÈÛkOﵪj+d-3¼ž|± 2öb œîjÖÇ?¢˜88$jÖµe4ŽÇ««Ô©! #ª 6îl•kYÛD~ íã J«‰ Ìš5–`&a4þ ®Øˆ ³?ù‘ôÑ+kã`ކ‰îÙõ¡Ãà ñlª];nøáñ0¬‹RÕüL=‰CÖôÒy7*m ‰wI ]xcŒ—&qÝElç½À×­îI{ž9<ŒÅ‘4ù–0c`Õ€FøÓúÇ΃ۘùú ¬ÿBÛOºŠd8i g„ôo]~’qÝ]Å#(Ä !EþB¸Ã=Êy`Yøð{NmJîŠÊFjœ×¹GâõeéÄÊ©“¯Zí 3@ÑâC`í}w¡Ÿ†};%D{ì ¥Äˆ+X M`J3ýJ¼WA4ÌÄVZ}í¿Ðª ê«²¥^IÖ¿ÕL.ðX±_äàC,Å5ï‰ÒÓªGBg•–Çfæë«Ø³¨öh%"ð~¾CºÖ/¦ÌÊï¼no`)u‘dZå2Äœù;©tOÒ¬yñúEO;v“@W1ËwìkW9M@kÄe;ÓšV™sÉáz•¶ßÞ«ï«M'HŠ(× ÐÓðÖW³‡O°‘ê:øx‰tÄÔ›`1AÇæŽªÁܰÃÕÂ2“(S iB°õ›8°Ûk|Ð,Yš² |šš0P¦>.1h€°šUý¦ãôì7)fÇbûŸSë!ß(3!±Z®}jJ¹Itæ}0tÓù^PŸ¿IÇO¦&¯?´$Ót•ki’ĆêÇGïâ€ÉAt ” Ȧ·­Ð&2m¦G_üKEÞ¡ìå†5meÞ5Ç-^± íïæHL¯;eÓRØÓTß½‘A2}³Žz‘H'ÁR(ƒƒ7eåFž 7¨•vwD…/à t׫,(qÿ0øÿgUdŸm÷_a/Ï,K3Føݯ»ïÅ«Ñèʇô8޳0 w1ñ Ù£Gö·Fž‡U”³LÒŒý.Œ®­ªÜ¥9Ú@ ´| wõ)JxK5 ”|jt#YÊs˜ÐÀã5D¢JÒ–ðÀÀãÝRkdÍJÞwñ×M/¦œÿ‰T^¸@kU’8zˆ¿ÑtPÚu„Ôø=H‡‹[¯ $'>S¥Þÿ:D,Hùˆ­yø:pÌÆ‚@iÚB¸ºµt·¯@o»ãúšJüµ‰ûê¨ÝcÂÈÌ àcc[Ûø®ûoÿ2°‘÷ËrdHW Ž˜Η÷Ee®9­e%¦iŸæ‚dó›És75÷‡èy¥"m*Áu¬Ç'*àvÑ^º9 âÇÞhm“$çzŸ\T7àsé´ ñP˜Ãò«5Õ]e¹®œá¯ãvƒi×Ek²'ÊmÙó>mп£³«ï ³æ.Uþrà½Bò²€£‹Æ"!Ë0fqbD¹ Wú·}!°F¥ñ÷ËTÃpûÌÿNÛÖŒë=·CÞ“ÑY•†äªûŒ\¬‡ôF e,ïª$AGi~Öœ‰ Ôë¨&HûŽ‘Ðº3©BâNìø¾o´òÌŽPI$ádw`´oægM‚„²n‚ßÐëœÃ7ût„I>%é16ö¼Öeý¦èd, ÝáþÒÃp7Ø/mäRG:wA{§šü/WhÍõÚo aîE6ê!K–â‚—!¢þ úëâƒN8îŸîHÙŒßsoãp¯Óú6d[öýÑI ŽªOë0X<¶a( R‘îLÐDDÏÏèΟŸÐíŸÐôóI€Hº¼í¸ÁXþ;Hæ‰Ê*ÖÁÁØQäÜ*{¶¢ XÙŒäÊ0ÿnÉ`:_B³wÏ”£bn¢âC9_íµIÂ¥?¢\â©•i½)Ÿç% ð&¯ä\:{$¼û—S8UVþg¬p³Cí2.YÕk„¾­cX;ÊDAdE«m;\8t©Œ6wø’j߈#brH™êŸ7_åfˆäj=[GÚ鉮>®Ø 3=U¨éÔ¤<Ó7»WÕ3,·8´¿[ɹ´¬úŒk¥Ä D¨UÊ[Ì®ÔfíÉ¡F$z\ŽQÞ®´‚8«q°€æŸ ¾Š™4¨:Ë®¦Z}Ê'¶mŠôÝख=2åÚ´ƒå]Qné{²§Ö pm#·Òuô —A Ç3ò»EV\”Cûæ‚€‹qcW[{|±âÎK(¸–†çJk ¶œ9-,µà Ž.3…É/zUKufçÃ>Bìd¸ [Kdï¾ïC3yå’s¦ÅN”Ò(¦\9´óÉ´)&z‰1î]&‰|ëÁ0>FÞ`šyËK<¸U߇PZ“BÒqÞ¦äÛûÃØvùÒxnA%w´çtž_„ìÕ¿ j@f¹‰Š 66’eÉí,Ê,Ð?@ÌXÆ‹éާ!ðìPéù¾˜pk«ºÖg`K5Pì]F¹²a¦oà…%cl¼ÁöÜ\Š Çr¿Ÿ–Ï'¢x›?*;Q*3+•Bªªíß‹|Ú2ÖÚv¦ˆnùÐÚuàþ×Î4ìV=‡Âu7è pÆû»Ú‰|Ì€ÑRÿp•Fk¯>+Ûè1n»ï@¢slL5$ðFóHDÑÄ]?¨“ûü{—ÐHÌF,zƒiZä:§àHë¬ãÿ{ïUsGv]ü(‚.©‘Þ"$>•¤£ßþQ¨m¥£ýûâ_ؤhÓ}‘ž“Ä·hë$ýçp3y×›vâ<²$l¡glòÓ>óŸÚ ô…FaÜ(Ügçdê%pŸk ;-Úªnü'ÇŽ…n(·4*-‘`0Ž sYéëüHjQ‰ %mÕn§a,˜U–üdï"¬-Æ->Ø’¿ÕÑÉÚ©HåµÇçÊOHéÓ ™Y]¯‹¾Kg‡jó†=Ÿ|É7¯%u‚ܤ§ÒêF_àëŽÍx2KZõP0¾ëÿ--7ÿ+¢RØí÷ør^¥Mš]¤êÛúÿ…¼ á?´GÿjÇtŠ‹û–lÅ–äEÒ—ó#¡ÑlA™¸kÕª‹ËD$”úÌé|ØðŸ o»(ƛޔ4Sòk›È\z5*ýI® ·à°¼X‘ÉHž\/—;î½v),” 0¤³ˆ¹i7ž\ŒÑXLc¼és&¡«6fMXb›ö@ßR±ÈT‡¸ú¿o(˜·{ŒòѶ‡»ðŸbt„µëÐiW’W¨‚[|îYrŸø«0–”Xq­˜”í¦˜Ê®gä7²p@${ääA%Ž ;&¨ÞZv»QYvo4¨wèŸþ›z;ט!@êTa¡N•Q€…™•÷÷X—ÐÑtnöé*›#î<|ÛÁWŸŸÉgk&Ò©±?pÇn´§Wc5¸bxkÖÞ×ëS;ÝêlG€n£ú²å¢/¸ÞaDþOÂW?BãY÷!‹í­ìHc]ží,cÃÆåš kã2ñ0ѯƒhÐUR¦WŠÊ³nÁ+Å]êçg"ëݬ‡/G~ðz0ðrŸ5#j“à;j=40&ý¿åèšUû0ù $Vll ™É@ùsv%KllÁh¼}ü”Ë?Q¸U^é•ì züf«‹ÿ†çøÑG;ÏQmñ5l¸þöhÌÃ-bƒû$+2÷uäPNém"–ù>­o1°{/°Çâ¾$/¶­ §ò³•ilãYÄ B°¹ÄE¾LÓì÷m@Ó‹·¼ ·–ÌÂKŒüe²„u7?²dëÖ«È«ÕÛÚɬiJÐÀàâ7›²åšk=JÉ7ä‹„½GYÕ(šû 0bwMM\ŸW²·¾"Ç=r°PzXcv#ηµð‰'j7åˆë 3 Sç”Të’  &´»–ΰÃõö€'‡ü7'ÍR‰«CÕëˆ+ˆUP“߬¹¨ip!tcb yà„¯Šx ˜Ý»¥âW!RB±?¶Ð²a= Ð`ù¦ÛG½ ^Nj‰m%ÓJi”Ä«§Îãݧ°‡Iyƒš‹¤Ë˜˜Q ƒ~<ÿNi|Ôü‹¾¯[ªƒ b:ŠÉÓ°Í1CGÛAOîxñ½ÇñÒ©œ8•îÎTu†´’MyC55S:û ›ˆ¶hj–dzzœÎ&†¹±#4 ª^¾§Ûql~å<Ú&6U¤$•%rµʾ§$•¤»`݆ºEEñV)»J~9ƒåÇò;IÄK¾œ?{·²Iá=›µúkHÌ+­á¶ÏÏ-¡*+D;€$æ^}Í5×@2x¬ÄèÐÕÓC¬;§IWA)ñWà¯ý4d¶{çfe“óðù’FøÍ¬ëüˆŠÏÕz$ÁóÄÖ\ê Æ±eî> ZVÁ9^/9÷"1TÔÙùãOÊ' •ˆz OûžPS–|ÈÐnX(Ì?cÎÅÝXxíÊÖé¸`‹³¹îò“H?8 üi~×-Üb•¯æ–÷5ËÂÞ}²T^¹üf?â =§Œb:$ˆ+ ¾þ;z‰°êä¢J(‹Üîirÿ%‚Üü`ùÿ}¸Æ`Zù*K¤:ÑTèê{Âö'ª€Ò!˜J+M÷„wåÃÛ¬$æûÞf³Tñq§á°6%•Ýî=É TÊ¡ZæåJ‘àcDÖ$X'‹ášz¹·„(TpmáëØ-L’O9¸±†2×ïÁ¼þ ˜µ%¤w}±EVîÉŠ0fºŸÏo=ÍÌn¸5å§QO Cá¦ø©ˆ¾ÕS©M  iš•–ÿ4þÊX.DÙ„¿¾âôo‚xfŒË×åäÛm{Š¡Ë†„ó7$—Œ‹¼´ÎÍ‹ñ|1s–†—&AW”[â&¡vRn²°aRQU÷ŽE™è‹È¨ÒIS•3ïæŠ–ÿ‡r’TÂ+ÿuõB´Ãzú¥¤]šq^M<ŽÍÖu ÷ίa Ìê½mZx•µ£‡låJN;±wØÌÏe3oíJÕg13aÜ5ƒCµÞx:R¿Eƒ,Ÿ" ˜­Jèx²ú ö@xìú‘Õ.õ‘Ëçâv;¾¿Ñkô„,O§×;2ƒ„°î§a§­^69C‘®îQ`‹U|í9¹¾ùÀÙ7rqáï_=_—«:ë ½Rô'›Äu.æÑM{BˆZ’µýsRž‡^:Ñ³É¬Ñæ1¢àéþ·Ô-O­[~– ¸kæQh8L 3Sºª®¾.ü»sþB™n„1!ºzE´G®ý àXæÑU”ÈŸ\W\ó'+ì÷\<ÒÝ+©-n« ™ŠxPÂ3&²žI™¡í/#•ÍãœæUwr Vl –¤e…|öìÄ\oœ=A, Â#Ž ð" Ò{¹¦y»ä/ÖG…£–`.ñXÔ0­ꇅhmÒä¦L›‹ÇN_Q±»SÌ2ÖÔ]”f7«.ªREöéÔÔT˜÷®TÁÒ¨ÈWåLé±ÖÛ×i{múX˜‡Ç…±.»„õ`nå†pž}»£bsái±é~§6è#M¤òp— Ц}-ß`¡îzš“^ýkB‘$ŠË»Ý~t}‡ÁÈj´ÕÊ9Tt^‘Y­«(È éh­¥Wo;¢ëN„ ¾ó@X …ê?b-§Kòôi#e¡ƒÅØâFu¯³h9²¦{G\°ÍÜ…¿'\z ‘¹tç±³°Ní‰5MC†IUY:©ßmˆQ‡ÚbãGûëCz"3x$÷¶–p-)æþ#Aô|"ÏÏÝç/µQd¥‘¼Âuâ G¦8èø3í] çÈP¨}0·jü˜Uç€l„‘K˜MÇ4䆴§SmÎplÉ–œaG€8uÃPXÊ9äÛ»)´<¾AðÆ ('‚…›žïF¦/grz E}%Ž9Ž£^æ³ä©–ÇiÏ3ù5ÖC¼‚i¯ÝínSγ~F…+d­óÑý(Ôà^^ïIôW«º6Cÿt‡¿iNmÆ$=sôòŽS°!s |´C¯Ð+Š"•HÞcC[²°¼Ø©Œ…‘@#4Pʤ8šh·|B$ìgGû!S:–0€#@“ÈéÀWëzA¡«¾K–ÿ$59wÉ1½S@•þW-©†盄±c×éX0À­u¦ÿCü¤H_@VcŠ¥ñƒŒ½Þ’Ô±>;¤¹ß4 “ÏÃSâªAzL²ià†>¬4¬Äù”Ãón]˜¡Uì£s•¨¶‚|i¨´Å#+—s@‘EÉñåÐ ‡þêA–#¨RZ΢ˆß¥Cªßo|Ò1ÔŸcÝÒY$c.ÞUYí_R)¡méÌñýÃÚ¤ÀJÜ­´¿Þ™È‡L)3ƈ ÎG´•«¥«SjV,O ³€ØfðÇ_1¬x3ÖÙDÍÌS_Ã+çSÓ°Äç40ÞÍÿn0fGrxèx¼€5>W5¥PŽylòD¤Ï,ïÒCRîeÀÑlŽ@~xÁ`DM!¨YabŸµ (­Å®Îå˜VzŠI”Hm“apÅ3×=F“nZ_M ‡›Å[ÐÚ…Ëã\k‚¹0˜¥ÆÛ®x¼…•Æ3dºC®Ë¨‚‚ÄÆ !†óÁάŸ¯÷®yoƒ Ê]ÍÁ'ÑðÅÐŽ¨:ÕL\wwÒg}EõììÍÓóGÖ6õG{˜ç2/PËx¢§‹yv&SøbœY='@n†KÜD¤~€Hº­Ê!Ã×ìŽñ/RC#{¾"ˆ·y˜ßù‹½ÈX¿#/»8EÞ ëXpe.)^èÞðf\¸…ÏyyÒrvbäÌÕÒ Œ½?q/Mÿ6)à ² m-‘±WÅÀzÝaVœÖ¨4˜~5’¿D’'œñ/¦‡.ED˜bñ‰0‘ùÿ«›œJXRgŠÇå}YO¡âDÐÍe¡äœh¤c Óc]žª†PÕïm¸Ÿæa)°–@†¯)= ¨_kù rÃzÿƒ»!ðÄ Ÿ:Ÿ¼2ë&R«Äék'Á{ʃÚB3…â«ý"–Þjï'šâäµফÝÝyq ˜ ðqGÐÝÅd¦ar³Ztïêùüµ1LêêÔeuüê‚1vñ µ0)Ùª­½ƒKªÙ—nF%ŽeøÇØ#ÑnÉ|6 þyðÚÌtxÅq(t¶mBZžwCå„–„­O^âFd«ZÖ¶xÈC‰³ö~’€ë–j4­Ògá¨)˜¦¼Ld~Z=X\ô"ü´+ЋªÝXD)“)Ýlk‚lOÀß·!ŒHÀ°¾ât Æ-[òµ˜ì}t{êpóž1Þ“?.åeZ%Z¸·õ¿®“”Í„‰‰ã›³ìµâc7$f*×Ï…jØÈ«dÌãÌ­‡ŸÞ¨ŠhÔI^)Jk°³«ºÜ€õ'âïçÉ¿hã¬-?*-ß{ø®ì•{d£Ù?‡*µÆ fmª% Ûò_A⛊ð@9(K–n#;#{¥©|Ë΂xþ-ÐSõÕ”6‰Ž¶=—š5c?cµãª—6€G]´*ÅÝX±’á÷;€žYu#xßòL¼6MÄ—8ÏÉCð»ÉpTQÐÈ¥ÆÂÍEu~ÇbÃémºó¿å OTiçzÞztÉ¡=Å©²Ë·Þ«DŸ ÙÐA«é|NÈ£ÝsmÁã©îNCú­Û>¶G¾²º5•i)%}ëóq®ý©gï"&`pkq½óçm€ÄNØø;1ïé‡ =ÍéÍlån²AÑ ¦ÊyìTpRdVwR!LÊ;dˆB—o„,·Þ95囀#·rœ.ŠîýfôÑ*é°·R”ÚàN;βÞSÖºóTânn>¬ñµ.>÷"45‡/R%×A€s/—'r¼Üå`÷qñÊÛœ"$×úLíî²8›Ôʈ¬l€!à÷¥¬ 3ÁPZ^èÐúd˜Sûé§ìMI!Fþ²hBó‡!d\iÝ'j°Béc’ê<›`íÇìSu~‰g.§Í¢nhÂK›ðîõ/=®P€ÁLÇWg§ÀŠ‹ycIq»ÍVõË·&Ü´$r¹çÈ ]0Þž# }näŠñm­(X4`îgAGHÀ2Ù · ]GahI ‚ßS)ƒ3cµQpðY,ÇÀéKÃUJê´óD“L²)e‹Ð.íHI©^(mº“lÊéÆ=H@Φ'JÃTdƒýׂµ!ö|›ñ7*3’CsfsàAÝrÀ_ð$ÈôPaït»¦ö³7'wÕùÆùsïrF¼ õÅTK«_þÅ%€Yü;µ|Eú¦E±•~£ŸýUlˆ'}áËH?kè=äv*/‡idü£\e’5rÛ[ú G|HŸ*ò¥+¨ òïÉ)¥„‘<6ù y`Yä7Øò9ƒnåÅ4¡,Û}_†Ãä•Iy0©ÿ¨‡“sÒ5µãZºÄ"ÏR~œ¼Æ/‘l…i£JC¡ÊzQƒ“ì»Úk¹¶™©pب9ò#„4ŒÄµ,Þ׌j›<Ä´C£ÍiZ!¼ôÃ8®'ƒ\‘3GjU3ù¸~K¹ÿJŽPlò!ØÃ,<誜iÜäÆU¯Ÿ½Õ ËeàËÍ2îäÌÁ°]ö·¾.¿`8qÌà†8 "Jà†±ôÊRÆ]4í°ýš%ùÆ>‰XÃö¨Pžïÿ Æ-&k“šíåÓ£0^Ø_£òå3¤×~Ìâð £ùÎÀPpØPÌsF5.¤‘R¶áÛ‹_gÃ^B#Cl᪈;RÀhÆÌÈâÙÒÍÄrJòú%•'á–BøÞ¦%íQ!(à_×L¡y ¯Kƒ}öUÜCf­ç<’°ä·Ž«cä< Hý8F¹ô‘ŒTõ -<›Ò’ 8c~wšma™kËõ(ºƒŒ äÃÓüåïlw$ƒVœ+8*j [Õk¶Îù;÷1µXÁã±ÀZ§ƒý[ÿOŒÒù†÷)æ¢qǦʥë¶éIhØi/JøšÝÓ²+÷ÊΕÛôÈEIô ã?Ϻç€`-âh©·Jôg, 㡇ñö5“ÊS'¤)ud¶÷0õ^ˆ¿]š¬íÙyWVX¦-€¼ÍùœïT޹\(iû‹,‰o-°ZC_\Y¦E2‰®´—m@z_Dw¶†l ÙÅ,qeâ“k=ŽË±Yx Õ fŠØ¤³µ¬s¡ÙýOÇf 9ÆÃ˜¦µ`C‘(´æ£p^¬2|¨=6rùŠêÇYE'8OÓÛ›ŒìÒÀÑC£Ò0h’èK§cxJUÞèìáMJèI²=›Áõ4ÜÀ+¤þr$èCÊMñv;FbÏph§©-¯ÛÿƒÉO—Ê1WÌ~p».Ú š7m&X`ù¦ è™Gù\vã|;Ê42½$ά4©¼‚Ǧ|ÐÀ•aÙAÂ6– 4 5‚a£,6Ü»‡y "™®â “^‡r€€Çá±±øk4? Üõ²k {˜©Ô£åÜÞ<”=ÃŽC;Ä6J°~©ÿaU¹Ñ?™º”…ÔÎù>ÚôÜ—ÒÌ[ÏäúÁ·_=Í}’c’%O¢ ÷ŒZ Y¶ár\‹³Ó'ðÑõb ^sM¦ïgP-é€Ò|ÈÏAkuû¥q…²Ò4[cèýð.µØ÷¡¿ö÷£üº3 Ÿ}LàlÀø4À8w€¨À+·›æýˆÁ¡Ù5?ýBªóW —c[(.¶Am æ¥úW¢©2“¶AÔärCõ¡™ÔU¼ ;öÝP•¢æZ8jJ´R/û½2[Ò8Ð? ôùß=¥%ûÓÄè¿¥+ ²)Cöµý!õH3kÅÇýÓgŒÆw”%]¢t(°ÖÞôˆz¬è–Ç82^Õ™›\ŠóR¬¹ÅF•@?þ‰ÓÎâñ–âY ˆA=þSVÐuDëŠ"æe»ö¢"RŽ·Ì!vX#®ËWðzì€rÞý·’ [w)+„›w´Úb¤›˜¼yòpÇ}„Çw„EÊQÍÖ… ë8u‹Og;QrÐ`]†¨A¼}k“Ñ»;NÏ^ô„o—‘ªåHž]…Óò»ýü`Áª±F£ thºWƒÇe¯PË¡ ¾¤¸ôía7?Çö@ðT•l®Ÿ\½•ÔoOÌÎ ôp½ª¸ËÞT ¿÷cÒ4”EqÊÙY¨­v—KX\@̑ՎT9Í3FyO¤žÎ<2d@ôX¨MI â‰w¾ª 6J€LÝmÌõ>Ý£ˆ 3xyÄkº#Ÿ}ºjsk(}0‚°…'Ïtù kgoÿgA®dò¶Å<‹K±ð¥”9Éê••hÒPãE{’<< ÝÃa—>ãõl;îæ.–I ÙU‚4˜;%2hï©5Ïóž`ÇÓ„µrˆjÅ…R©àMßâ? VùÃyª£x‚˜VöØ]­e/_·XæØ1æ.ÒÄnVìç=øs“™Øi\#-äçŽë}“u=8g°Åmôp(YwøåëBuiAÖªÆ(ÖÙ‡äÅÙEm ï‚ÍlOwZ—ïêÞWÑI™œêh3I6³¥5Ë€n”÷“oT$[6à ·;ù6)¬k‚"nL†cî7Õ¸"Å®ÓÝh73/²¾Baž±V‘1F™h±—\UÎâÏKeå­Ký†™ ø¿ë .¥îìDhÒ¦÷rÑñœà*E‰êeßF-–‚Nƾˆõ¨²BÍ:²iàý`4H`¾S£ñ¨ÈˆyôTeÏÆàhÖôÀ¹¨ÌÛèÇÎú=}RȹÎèV´ W^’¾š$õÉKéPŸÎEgƒ»Ã3Ij±;¯Ç­XyñÓ̽A=ƒ]‹_ÁñxAƒ²TÛãz”ûàÓº™ÆÆÎbüãIN~ZßKøq`§ûs–×{F\¬¨1`à XtÖÝœÇÌ-I6ðCàI¦Æ:†Ö=Ü'‰G//i„é½ú`Úç[kß2+ýaâD›JD\KŽÃw×Wº5½}©Á“-²WÞ»r›j\¶Êëë~lk×_ •/66ÞºòFªwÁn÷/o'(ù<“]Låôx‘á(ÕVñ¸;yIÉïºI­ê‚Ð'˜s57wE<¬?¤gžZ²Mj‡1ų$§ôÛÔ«Yp/Ëwm’ª·ô|‹|Lsb–ª R‹þwv{â­uîëzüŠ™uNæà`ƒn³×åŒPŠe> …žž-gÔ-LÜM:ÌÙ*?> Ù&Ø4í²dUG³ì#¬ ÍÊ3¬/Hl¼¶¹júR)æ÷šæ: ÝPNsÕŸNÚÝh"?¯qßz\ îô/U 5‹ìú˜è}´&%<¨í“â*íƒR–8!´ü ý…¼:ÅP À ÆÛ3öÚ¶EÁ¸°˜ÚÈl3N_ò¤håÇE¬‚ƒe´ÐwÙ.¨ÿ3Ï™VÉçqâ‘?m6›Úqk˜m´ÕX^ƒ!IñwÅdÎÅPZÇÇhe›/gé¥ ¤SZl:p6#i*ëí½¼ 2ß)}¨:ë s­kØîeáã_—ÿ‰ßÄžI—h>zç@Ö‚ ûw8q0–£m®Åº½–yPç¶°ÐÈpú£iYQìk‰¤ÜIgÖN .Yÿ ˜Kà˜°™BŒÃ›‚ÇnØŸÐe X ƒr½m™½Âu§$H°´­æ¿Øk¦t¹f?[F…¸Ãµl<4¿AiOÈD’Ê¿õ@ˆ©Óª˜+¨V«ÅJqÓà 4’^„¢®at®uR'Îò šJÛܹØ3™PG%ÓgóCšæ'.Ä[¥¼¹´X‘f $p{3˜Ó|8õìÙΣ[ÞÈ–üV Æø’syüA`ŠÚ){ë/]˜f‰Ùú(*€¤Ü<R>ôxÍ©mÿ½>Ù‰67òYaEg÷­¯zòÈ„âÇúí©¿p}#:á˜î£—¸…J´|ÿe[Ñ$ª?›*e¥ƒ.(—–Žì2šlƒˆ ªHHäÉ]2î|Y€:Öý¸Ü< 6ü¹ï¡uÝþ°à1¿¯‹«5éÒí™DÍS¿Ç駈`™_Å6¯«õà‚Q2¾v kÛRÂ'ÑŸLÜá•]´)¡û‘¯;àCÀ+-^3¬ÀPüÌwUÚ ¸ÙŒÚr3£ õ¶þà‰‡Äž½Rènïz ¡‚$†êBðzºðé5¶²îç¦ç¹€ ˜NwÈà[ŽÃGæàŒtþ¸ï{Ð0‚êÉKôMº³¯þÓ9£k4–¦Û Uñ¨ì^&¯¹tÆRôÑKÔêݪùÀ/¬”S ûm~”ç´vw„‘?ý°™Ì7îƒô€ÑDYðt%.ÿz0n c„û<ÚõJÌG7 '=*HÞÜå!4Ç+,x>¦ *eBÊC:Wà+©ëM;¹ u ¤M§¿7í°å¥Ÿá,ÿFF5D|Vd&2¯¢˜¥^x*ýX‘ÁÅêÒ^dI"ù¡°`¹-¤ˆŸÇãö3”ɘ²‘%T!Î2R"¥ËbGKÀ<Òêˆú¾8©Þ¨¦ añü‹ÝŠæ@ar:gË® ›ÂL8©©Ø[D¿,5>é˜ Í Ä¢C3-¡Ïßµ|ÛzÞ~‚¬®ø‘‹ô8ÁV×â;QÎ ‡Ö›©á fC˜Š­Ô4¬lã†×JÆÍÚ›÷1çÆÎÚW ½óÃä_Šƒ¨ŸÄXÎÜ\{ØM¢4s ò~áÊ\„q9Eê1N>ø¹úÏ™^¦Šƒ\!íÿh\g·È$B?K†yKßv§!rrSÒÀze*òz]üg"G|3È׈V¹u–x£×¦@Kûí;rÅ›jZÁ.åç¯xÏxgoaK VT2x5 Ü?J¯)Lƒ@vÕ Îts Ù[1™¬å¬ÔÔ2°86TXW×7vÜ®55œo³®/ÏèŸßÑjÎCô<`]꽌µ¶ åœD©Ý¦ÓÐ>ì“ 1¥fãЇrÁ¬ö;¤äíB¬ùŒR‘†4<Œ²Ò–Ì´½^mÛj;éÙøÉ³÷¨ÜDa½ÒÍhi•0Dl¦ŒQŽÕèÕt àô² Û;'ô1ÃuK††ÖÖ¾øÂ%0bŠó5ũHxž{»ä=î—n°ätD¡ÑMù¢w/æšÕ›Tð`»t*u4O3°LuL£î$¿¨• í;eê°äZèLkmJ0!¨Æa‘ APTé² ÎÌ9±?D‹l$º{qî|ð*¯Ùß:Ç­ãRYÜ34ýýE«‹e³sÏ­E¥feük¨-!mJÛ«ü·¤w0· ¢ÚŸká)Ù˜ÁךÊ$ÔË‚£ÿP§MRÊnìÀ¨T4ö‘óŽz²Ü‡?Ûìùq¡.5Þq wëûSÛÓ)ÿ 's î\8%of\.Ñ{JV ؽö¢ÚÐîvºJ6š2Fz‰ºã¿C@)*ÿ7R3Vi:ZµóÄe+ýÏ©ù§HÆëóqþ-ëÌk» ™\ %ò¼m‘Cs^ì“FIIN7ò³z«x˜*‘`Õ‰ÿuÅnœÀþ,Ëgbå°ˆ,5Ê}HÇ,'ï'ÛYÙ8V>ÇTi{ÑeiÅr•Þ"å¯ÍM“4ç4âR¶¢5ÕÞMþ6nß*¡Ùû)ÞG¶»²ß÷}ˆš¢Ë­‘)õ!ѳOÉËôûç¿å1P1•Œ2 J*åyÏÏÙ¯þçþψ›I b‚è]F’ÎiÄݵ´ç·ÿ;˜W £ð&‚pW³ÜSoVƒ?)cksÍ« ’Zõ•9Þð,'E]"ŽQ8"áDO¬/ô'”×$ݦ¸i¿¾t÷>Å%s^œÑÕ.Ü¢¦oÑ—ŠJK°BÄ|Ïå¥_óaKe‰Šólr¿àE;lQU”˜wÍ Q¥Få(}çTž`㽪|Sø,È%7DÇäéz®A¢ÚP…²&UvÄÁ=·@§.-£ Ç_š#5Ö ª ÷7T: ¤]õq^ÜËD¯Õe”˜IÌÿ4¤Vo?Ç>µsÐ4Qæå¯wá­&ðÝcŠMv„H¿÷#§µûO£™Ê‰#Ëì¶fýƒîêÒ}…‡gi¡µt¸µÖ>©àYàñ±¿RŒá6“~#À8ƶµ‘ñ2à°¼ z¦´÷õºÔ&î.‰moÐ ÜèßÔ}¯¸üâˆÚóÓÏ…½È» íQ«C ¶ºîòŒñ£šA2$<™>GCÊV¥æ Öm7 ¼kn­‹=Sz˜À+Y%ý) 3ò/ÛØ‡a-ø«ÍıÕ4CuSKX]J°Ä5ÂÛÚ:d‚ìŽäú;BÖ¡×;µòÿ?ðD擎èÑOÏ”­ê‚7MŽf´¢¥Ne9—OÚ<=é ™žàBn*o¢•uÙôƒºÏ¶Œ\…ûíP>ÇXùöG4—º~2¦SQ±a9£I7ÓqQ×€Ë:+)€Ý*OS4ÝÇÕV'ûK®è°L•}I®((èC¶ž¤Ñ6ä´Óf#ã]Äzòȳ ž¶1¼Bv óhgÙÏðRâM‹s»Ev‘ BŸ«Ù]Rp²Zeù àgxº‘Ìù0/5¯8kR;‘×pvcž3ûòM´ì[f@ âÞkÔ59ÚðƒøuzE±W)¡m«Õ Ï—ñ1Ùðü³_ÐÃûsZßžà P­2HÅ“5b@Èk<$pÿa4ó¡lŽ Âè[ýÖ)Ø\õt’EWŸ¦ãüd[ ÏºŠ¸ýþ>ü«Í.J¾…ì4xiv”D‰æ¦5ÝrnQcczµPÍsÑ‹;ñkª gy4­«Æ’ø~ߠǬ“óþ“©ÿ~ª‡Á1î¨îP×#ÑU±9^;1N)¡y W¸P9Šð½àH[Ô§ÁMÜʺ°¢49nï>~p†C"È•æ>¤ûÃ…HhÀÏŸÑ5‹ñ'¦\|®WKŸaèw‡„»ªƒ+ÌwM§¯a­–§jÞ,ÃHÖºàœ™¨¿›{±f²ˆmhŒ®…rá_pÁ*´=†öݬAáè©tK‡RM*ÛÉ,žz%˰ÿN¨aÈÔÁ¦[],ÜM½_‚ °¬èîÃ3p»ÂeååÐ&&ÜûýŒ‰lw­Ìw[¥õæD­†Ã¶Øs¡ŽÌ&`’?Ô¶>ÄŸK×Ë$-måVå;ĦgsÈÍĺ‡Éì@AZ¨Û÷rI‹œíÙ?>Y‡™ÅçR·¬-UE,Íé‰|Ú oŸ?¸Î ÔÍÀ¯¸·L-i—U —Öª#ìxïØ`®O/ïVL?Õê¤Yò\¸4Œ‘ř̂+ÖJ]ÆXN6<Ø%¡oŽvŸwGé$\H‚eÆ¡Õ/E~ŸèžÃoìZŠ>¹@ÖPÂeØ «SÖÑÞ’÷ia\èã.qD ÐYoÙ„Ã4m†+jL­‡Ä~ÀÊ“DœÏ&ì”Ï$XÛ^RÚ1¯2û°J¥†w¿Šã¡Ø –^‘k8ƒáÏÞÆàjÄ0”@áCÓûM¿¯â;’,º‰ щ{ª™ŒŒcÇgðž­706EâP£ÌЦD{^ˆâ3ë0æÑ.ÆÇ~&Ô¬F5XT)*¯ÇDj5Aæ0r\ÇKªʦ*¼÷Ò‘…úHÞš†ù‹]bTTµþ"zùˆ5¸µGõêÇ-ü>(Šoö5ÝvàBl¤ý×­]Ÿm$ºŸ(ˆmþ+N*â¤!´3%ûc#mµÉ¿´±‡ÁXŠãgd‡vofwPúYg"K9°oFEОa¸¤ƒ$<¡³Y.Ú+ºT‘=v¡‰‹yæã™€poöêë p…Ë4~ÎîÊDãFZ˜¹kß HÏœ>J÷µ„L++kÞ±þ¹4\˜^&ŒƒªÝe¢ùׯãR÷'ñ‡g¥¹”¿dE»²z¶éS7S~úLŠC¢-݇³nÙé|'ò$½Å( Fü¹ÿO!,”àidˆkÑl#þé–ŽJõ_Ž¿ÃadÈG§‡Œ‰@`ì×Û„+m;ß{ÅÈTæS™ÿp'@v©ÅÝR×oôôÙâéUMô[“àëúYÈ‹‡«š?N{¦ËœËX°;_U/Žª$üX£ðÏÓuѹqUö­‰ìyƒ|8”» ÜI¨hÈÕ¢ñQÛ¿…œ@YCÿ` ô†B(6¡aƒM‰ÝöŒš2¬Oj&­x)fž;*n¿N‹DŸ»û‰ºê³IˆSÒ>ïÛ}äÊÑVTOŸ&@2§p²@⃅øØxn ÌI bµ=údiÞ^ňQ£:Ps­q-ªâsKOäÁÂQ7‘”ájÙ²JÂM“79zíwál}®ÆnŒlªK竹ñkð,¥h»ÊbŽ2”A3JxBXV9‘bGØ9æÉ­kÍrd|´ðTaæˆ,Ú•ºúpŽÄÄâÉT-¡? Ø<³Ê»T%²(¶ä³r6l“‡üè—BÆã8%µqŠ¡ç¤¥Â½v4>]£;Lt.¨>è7%{&®ºÜÞrš?bÓ F*ž`õ\iìõð©œ/ˆY#J|LT©!Fž*ÖÎÄï6Ú²æ]ü[Ä2±næVáo}W&B“æ¿§\Lõ›´…X’Yß*Y}<¢`(ŸLr†b,~_H]?¤¡0Cí®õeTjÇGÕ{9Ö#†§£^ej%¦3/ܞĘü‡+ãƒ?$å<ÅÑæ<ÍUÚª+øÁ¦p‰(S¾cPåÜ#ý¶£Æ9ɰ¼ýW &Ì~§_ÌEö¦ã؇¢–t À}XkK7Ÿ[‚2i¦ŒÐ•!R‡’o1ú–|”¬ñRxx°~ëƒëÌþ ‘æOÖ ÀÙäÏ jh $Ÿð²Ì¢çæÀ>/•‚eêî²Ò¼?îm:´2—Xü 6гHïw–*˜"? ½éN + ¸_’B…}Eå¸0ÏI%æüt±:öºª‘Sð¤ @UfùUÉÕrTVv1&ƒ?ò Ü£9–a´èûEz™¼Ð÷Ó6‚í-/`xY8}öN]á=€ðVÕW–ò~Yú,ø«V^õÚá*øÑÅŒ'Êpjk $Â@²'Ï 9žF:}çúv—æÃð˨@γîa,êjÛÜÔß$•ò,%†ì‰Z#ý_8ry‘·@…:X3‚\k·±>SÏzùhðdïóp ¨AÅð-@®½¶\*.³0ÛY/}ù#€tO?Øn1D‡0_Í»h„òÉ Þ<µŠï¡’”R㜣ÿ\Ñr¥Hpÿ c²•dZ˜‡]µ“™¢Ë=Øê÷È|®¥¾Ü;‚Рƒ,|ÚïÈÍ9áK>ÏÊ òf…(k\‡MBôrÝ­(ÿA¯9ï]þâÕ%·yÓÒÌ>êjžsßwc¿þ¶2b“%'îö8“ #O†ö_z ç®á6J{x×qÎôMnÞ"©w1§±nE;Éï5ƒÜWZ¬±{Úebz$$Š£FÜãê#uVí(œ»s¿ ©¸eè|%K]¸KѦzbµ¿©À[ÿP":Xüq¦ŽÁ¸\xÚppUÓøòp¤šäÒC-zB²bŸŽÓ<½úFð€N‘;¨vnDß©”‚ØÔ"ïXi­­Ý:Å[ÂX‰Žuã ó_¼”ÌÔxBõ7už_•ö#N{T¦‰ëóôUŠ,êÓv¶ØØ’œ«w Êg»ïÂ?§Þ i  ?¿s… ,_Z(…äöÖºóú,¼™¡°ô• Ð×ê£Ô=+< Ç!Fé4é6u-JÛÚ¥£KõÚ'3-‹·™^ý\’û[aܦ„ø¾sâz¨=fÞÞ‰ûS´* ù ¯Täÿÿª rä±:ŸsU›ÿXE cÖU¸ÉÊ?ç·Ø«¯®¨-;}1*›Œp¸¬„Ø{Åïùÿ…³@pÑœÞx'pŸÌ0ðQ9è,œW‹Ž„Y-ƒbÆ÷A‰~ X"€ùV„j2h÷ʳÓ¦9TYý¬:qwñ(õVš®ÔTs`O¢@iŸÀ`4Ú&ºjÏÕqåZþÞ‘Z*'ÐjTJ¤,"õ6ÉÕ*(,L 5áœõZÜI \³ßg#¹èÝÙ‚D¨ÅÞú@é¨ó)? Í—n+]óñ5¸ÄJ$uH¼¤Øê®œåw}ÒžŒü•Ý…úwúN ¿i—³ÊG†\ö±ýš¦r-b µË²J /R“»<òÉ>Î`>í¢õIÆd|à‘Xç¡Å ¢;¦ýìm!U7qÛ‹@âAÓ w>Ç„¾Vè7yðÒÃX-®·¥ g§÷2©=ƒöË”¶ÏtqÏð5Ý)BÔÒs`–¹fÀ˜ß×Þ§f‰æ’ýéÃ\O±9ªD1ÏãSÄ—ÿQ(9oE! ΗZ½Qkú?0Ž2 ªKnq|¬ÄnUºŠrõbòK—ÛM¥ ¨…; -ð]™‘f”ßVdQ™Pæ£Ç‡¾ìWd™noJ¹ÞÌí*âÓºŒå L5ìýO:fœ×»%”žp”©¤G%çÞÑx*l/ž:'<“£÷´Î¤ëö“¤¯Ë˜ÝŸ™.ë:ÛàÓƒBÞ–‡sãcçû‚ÁÍü€E0´tT¡ó¸ÚÅ‚7”Cq‹kÒ̩Ư/^UoNãÃíî»L›G1šgAüHæ¸á.½%†oÿM½ï•ýÇ ïS-ÏK¸7 ºòÝÁ[ ›'Äù -6 “‰£ûF¨9ˆíLƒtgú`Y)¯Q“Dß>3ÌmsÙÓéìiù0 I]Œ6B¥±ÔÚR ˆRv+®X9ú²áÙZ«¬qT b‹…¢•‰tÕwýéðúÊÏä—4`lhén ‹[·»¦«Ò²OuÞIºqñeªÀ½B‚Ô¢¦›Þ¤¹è¶ .gíiNý`ùë¯Á¾f ô®j.³Kƒ–íPBmýAœb…>o‚— qÜ{<®;dÁœJqèÈà 7IQwrŠÿ ¼sÕv%i½|–‹xwËØ5, h ŽûíѼy^@ÕçN7¸› _›[§|VÅ\«¤Õåþ]ƒù] Dú [Œ¢ÿd"ñÝ:R=Uý5¶iÜÅò‚½ÆyrYb!uWM÷”o¡f Èötê&Ë­Î/Náià3¾a ó«,»,ïCmìך‹jÝà@€}iEbF×ĸA³ïÓîw´Ê`³P(ÌqG^UKÌ–<ðyòZ6RÛ=}Ñ\}¸|V5Ьû·Ð kaLÔ)†§bðäUÑZl«3*• àßëéúqÿG™: ñD˜DI“M82üGÜû“p\—B2.ó€’£(š£8°6N—€+fåáJk°}¨€ãbJ{Qù\bÆê‘NVÝÏÿIŠ|íTËì»Üͨô¼‡‘6š¯h·$±“d›¡ {”þRÌÝ'ø RüöÐöЖү¢žÈT!àÏÈÏîîMåy Yæ†þ–mQÑë#ráfjRàèK.ew' ýÛÜz9dº#ãçÙÞ¹kc¢CÇßè ëÎ1}šÂ„ DÂFAcÕ,Ìc—× E±eœ [ÃFjÎÍ^Ó­SúÈ; «RWËNú,æ®.8€?Bu”“$¿öf¬í¼}â ®øYÆCi&˜ðj2•ÁÞÏ—Ð5=+­F)¬«NEäÙÚI ;²³%ÿ\×᥼^A:2¯ˆÔ¯;¨i¯2 OfNoQÖë¨iWví,S[«×š@ë°Ëðöžý:*C«D_5U7ñï¶Æf'ß»;ЬÝ•‰%íê¤)Øßxç oÉ@©õšøÉ|p/Íß?–„îUû—–ÃêG|‰I] ö™(å—AZ1÷C@ªž;ªZg‘ˆ¥ òÍxƒ>’·åÕ3óüö¦uà†ÇsÝ>Ö3j¼óô·5ÀJÀ ?Ý2—8h¦Ø¶SðK¬jG-dcËûr”<™>Ê=•χÍϨ’Iûñ þRÞ¾“Lá-»áñOÂ>o|ö£@ÏtQL¡Hðã"!*noOAL ªaÓ:œÖ¸½ßÖ;H ™Ns³%/æ‰oäݽ¡˜ÿ}ö7"°È_õBĺü²øp>oá’ó€‡SHòêÔR4¤‚Í~éä:bÉ|Â-¤tI>.Ú.\Q¸••Kp°GœÏÞ_FŽé“³c-hÓðëæ¢•þÓóÈ0‰Ù”ÓxÑ)SÚ{x]{4ßÿKê²1|/›hó z­·\ZÆmYÀ؇¯sºÏþë%ø,\¶~ÌÕi19QËa¯I æ)²ŽÉÜoÕ„8™ÓæýÛW‚[åøfŠ`ï5ìo(²H̃N^޹oCîy†\Þ!XˆË:xRìô3½Aå©ÕåîÌGê¶)Ó €Ò0“úuü»=ƒDº‚ëOlæü)ÎÖÛ“E[•cŠé×{®S§¾¢AO M†),†[TãB—EcI*,ß0‰Ì×bp¥Ña’+öC+H±ðg®ÈZ^æTÙÿjNÃÖ=ï§<‰dtL³–“°ŠOzo"Ý=¨Îo÷5ÕSlÈ[Û¸œˆcŸÀu}F)³/ñ8Î}nm´{ã;-> ë”ù/\Áhh¦¯ˆÌÒ$?Œ$%„Š3mܤÎyõ‚³W%Ÿ[œF]å|¿ý¾ÐµÅ»Ý`áq ì‘›aý¬²½›I$q35(D7=&{í¤eÙ2>È(>qˆ {çàÖwžíÓÃÿS'â 8V®—Ô•ä¡ju!c¿/Š]MÅtߨÇ3j¤.³ê fΔY]í”Ô4žéÓ[­mþÞ‚ûÉf}èÍté¬Wû÷ÃØˆòž7í/^/ÆzÚa ­S6ß#Xj”£V¹àØén¦B‚ÖéÏa­1ŠÔ6GV¯H¤K©dÙ€nXÑDîÀ$òÓ8&ÏÒ¿ô~>Æ›NdO…6mŒ_ú‹Á¬czOÞ "ºN'úû*ºÿ Ø·QMìòUg7»¡·)¶C‹2%sà@Šø¬…#„ËÔfY ]òztÞÒ°mfN«7;/`žøÄ¤ÒËÔZ„%‘²H°}Q€Uœ:ê›ò_¨±EMÈ ½t]2)€"â¨â÷§uù&° EœÓLúnC|¯í `}O)ða ¸ê³aª­þ5S±l'ÑÈ–V†pözPB(ÕA?Ã;”"Iúmñô+²È…R“…¼Ì­+I>Y`¯-þ |ýlb@7¨†ii·pfÐð@ðXñMã´;²ýöä~·÷£}¥¢mÜ©4#§ü0$F¢ÈI €4ËqœËÚí].ý‰ìî;X[¿<‰ë°•QX«Á«¦1Ó(£kÄT¨3‰ ­¹qm´JïÓhÕ¥=FÃ1 ö=#ç°á©þÂL6>ºÑyµEº7neXÕqSÓ¯a6š¶úœäˆ‰¦(¼÷Úíÿm^/•g-—bçpÈxÜhDÚж¿ Âþ"ÓJæ3ÑŠíð`„ñˆÀâ,§ñäUtíù†µY£Y×î‹©æQ"ŠcTÏì«Öï[;ý–£Ìñâ–Óµ'sƒñ [v[YÄטýz-;ƒ>&·FsÁŸFÄz0±NÖ¸õy@£ý‘ãâ/Ë)BkôÇó1&=^$Ø@.Œø¥³áˆö ÓO—U²meøü€Û\\!s££#-y)¥{ËæÄÕÞYäókÁÙ?.üo7c ŸSIÇjEÝI˜ç  ­H“/Ü68å|J–Å*L—j;ðYù' |„!IÙM”}vKºr„›ÖÙõ8>ªó¡OÑu|F>hñۜ˅-ëQ¹ärù&ûL«=±G^‰„gË—é³Ô\«iš) ñ?KØþ‘@LY!´¬è´ žÚSÊ ­¥[#Ê—R«ôü 墬‹çÁŒ6U ÂÌcsµ¾Iw™™U(ź!RŠò±ÈF;&%Ê9ŨÑLѵsÁk„ EΩ5F gL”aüãK¼™-£o`i_?Mo|°ÐV ¬}GdåÖI2¥D55x`B„׃O>$Ñ '¯um @^1^nŸŽ¸3æì›U³jª·dñTŽ 9OIŒ´=ñC}¾#އ¢øu8çu‡ ìßÛø÷4á]éÀ¶2šþ¬%×4|è—“{ÌûTûyÔËWý÷)–ôô* j ëì ¼ˆëÉÀ "ì ‡:…)Ê¡‰£:7ýkõe¤º§[¬ÁÞædtˆØ·ÑɹБ—GðûÅ}~1éûiQd„+X&ÂV׺.h³½ë.§)~·’Í$­Mž#Mû8ÛlXÓ‡œÍ¥i,[†/ ¹/éW7AR´óÑñdDØEë,àdŒ,¥Â½ø‰¶L¿Ã¡+ŠA…;tÂdî²?$Ä5ƨC\zž=ÿ>šp·©xØLÀ÷û7ÆÜ"z »©XрέÂó¹{æñó}Á6[ÀíÞ›4~ü':ì£|ɨý8ý‹; ¼ÇF~Cœ´s£®%÷L›µ&{a©½EàèÊËzŸÈZý Y€) a. tRKÚŠÐ|ò_Î&T]MN6áûWø‘òx2{PîÕTv†^x;š¯ÞpîªØÛuNÐ,,Aѧ¥ñ4²„_ÿR¨ËÙyáqÕ9{©µ¨÷é~hVUCÆF+°ùP“_¥”3Îo쟽ÍmœÎ‚ ׋œAÆ1בƒt‚ª_#S)ƒP&ƒ!}_èù¥ÒC'Šdýœ$©mwÔ­/Ö'|Qx|j(_¨K°ÝP²%w¬7‹ W4rQk¨ûîdqèôŠß!wO›Ú¬PµŒ»’ vG+xÀòióŠbozAwTÆ1á•î‡þ¨Yvà øML2¿{.ÉÅÛ˜Qà|–ìVãf2Ê#ô% ÌûÜ iö‚ðÕþâò,‡Y>Nwã`ž9õ\GŒ)íU§išžÇký`Í:Qü=£öåþÉ|Ç&;4&Œr›Dƒ ã ú~Š»àXÀÛšÿ_qæK?Ú‹0¡`Sšá$jÌ S÷)úL0×5l‹™r {Ÿ„.Ì\&ƒ‰ôä $DÂÍexãè%Vßp‘Ïž¸_ø8ÙNŸmD}šLÔéåSLú+;}òn&¡6j¬£õÊ€þ¤ ¶ ˜çóQ++±\’G·PÊ¡¹'Ò™¦Û¢ÊhñÆ9Fæ)²;W:SE A`;R4;i j›Ð,³Š)žÂS¾Ý X§ÕØŒ±¬šC}NÑË…}÷Ám•9PíÓ'[ªKOhME@=ê…2,?ÓÇØ_ÛTq,9ÏÑÓ¸žú^Ñ4H™—ÈsCÛ÷F ºE šãpmŠá!^Ô Ìn ÍÙ¬Ô`¤ˆßè{˜<ñ­ *xLJL9Ë2Ž_ai/›=·_º˜cLwIPV^ÆŠ 5ïÿuºbHRÌïæ–vüç†Çf‰ëWLL¨|}Öý’??¸Ïáþ×»Ÿô¢P×`$ ªG(+œÃJÌ;µÃ„Ü]¦7o~%´\=¦®©þ*õØx0 İ¡ª%nÎÀÕðÑ ¤­I"ME —Ѥsë¢îVtGëîï§2Kìç±&½ð?? O»±-µ›ÆšÏNð϶5™f(2~o¥Ÿ¥ü¶¦ÂSÆÞ†òø3áG@Yª’Ý:„jU @±É=\‰x]ã´ŠxZhš` ‹Ð¯•åÔ'3F~¹¼«ƒ”Gl=³´º™UË•oM*G\0´¨®uV Lqá{¿¦èõbIÙ ô„ÉwñÙGŒ<«6ó=¦™œhg'æmsìaRÁ¡ g¤NJË¢OuÀ™}ÐzŠäMuQ8®ôGì6C& •ûo$¨"zs^}DÉÚ¦z£5ãµÉ.ƒkªœˆä!Já¢#@ÜŸxª¾tÎO÷h0•ŒUXû¯ÉñJç€ÖáBVSscÍ›‘~Ëo ãƒF7Õ‰nIxhô‹îxs•'ª8iµ—îwi3Ättžžôš{Žƒœ$^ÁgÊnÄ i•mÌ ÎôŒ_Ò’³SÝ?7 bàê oçÕ[¿.÷:u¥ak’¯Ð–Ê›è<J Ü óî‰ï¢"z¬HŽÐÅ'æM' ûØvtr¢3Ž—ˆ‰<ì¬yTs˜¿±Â Ú  Ú=,Uï„ØmÖ¾#mÿ$¥ÛÙÇ­œá¤™…†ø‹ð/ÓË2b¥ÞÂ’’¾4%PÏÂåÍK:cøc†¡ošoÍ;’¦[S6RÂyˆ&ü6Íà ±6îQóIÕ0 ®LÒu»öZŒëv}hn–ä¡ÊÍ›µ„&Šª¬ƒ±mUÇ&Fó³rê:q´õBÂ'ZßœŸ•“iû±"]!ò)½¥õÿ~ ù´ c1Àòö¥E:¹lY!lc¿ñ<;æÓJråÃNaØ)[•ñF]¿Yäû†]„zQÈ¿bìé8&ÄÒ{Wð’ãªìK9Í3¯+Ó=,X-–LøÒ—é†qò/ô»×ÀVdefèÝÚñ ò„™ÊÅ„'ç cñ+¢¤í"Å)²:‰Å2Œßëü‹Ï ònµñóáÈž°žä_é^ŒÉdPG_ÑZë» dT]„Âô%…8¦¹·ƒÁþ~¯ºNê(gI™¶b]îœù¥…Œ%¸Ý 6§Jíë2ç\- 8ëÔ{…^ vƲ¶ ÛŽ´Æ|Á’awéQŠ {— †sàÝœ(Īãü=½Æ^†Ê}aó‚o.Ìy ±”„¼rY€{qgwÝò`+ˆE¦#5Óšq´Ùçß7­¥Ö¿"•…eŒ¢0P튽‘ü¼d’œ þ¸9›Â$àp¶{.†z#²f=‚+åXBPÙÞ÷¢ŠßóÒªæ[‘œT¢½sõêZ¤j­×RŠÛv®'x•<¡r¦ ûþÍ:Ö²â]¿Ú¹6ŠnŽ‚ojè¿G\óÙü+-Â9[¤>GZqú«JM’ÜDþÐBõºÌ³63g—PÓ¿çn˜þ›o‚ÖÇ­e»uø<ÖL1¨æŒ7m˜ùýnà(›BâÃkò6’R%¹;B8C¢R$åCðÏͲOYêL^»áÚÖ¥Ò!¾ªá^‹Z\ÑVmÃézáΤW†2¨Cãÿ~¿R¤€ó}¥âÙñ¯êÙ&±ç®+çä¨îD~OMÑU:‹<Átqx|½øõ”k9 zÅì彃˜„H{]ÈÇ çƒ5BG€ƒô_¾ô‰²×ê+HÛ4¥Ár'Y=üøK_»ò>2Ö:)“y¢Ï`þàêû÷¥üREÝøFÖ—ÜeaÑ/£„Æ”™ï €ðt§­,H•ÙEŽ¥åCC€b1¸Ê·ŠP`¶2÷ºön£ùZmvëÏZ!öß 'w¡SdZÑcTWeæŒVJÝ‹ŽXL¢Yš³Fd÷gëoüÛVim^“€Á¾Xf ?VX±á&WãsW®ï Š=÷ÿpÌm~³Þ–Cæn¹Ê-¨ó\ ]p[)ˆ÷ð]pÂ\,Ž±í™‘?Åáç0JùZÚŠ„¬QÐxêÝÐjoüæÎÏ}¶` )6dûا.düª±iL)‘ 6Òç€AœªœtžòDM‰mOcs”JîÙú"ÆG–fŸkt”/"“ 5ÌÅØ˜}å>M+ Ÿã0рǓ<üƒxÊõä5oûþ÷¿k©3\e¤Î4SOT/ÑG^jòJ„R$Q(FA%wKÙÖqê#l ‡ÎØY¡ea6,à¹ÙŽþÖ üSãñÅYÕzÛÕÙ8ÿdK¸IAÂ(ªïîuÓèy²8ôù´ÃFˆ»T+}M#Ï0%Õ僴 Lü„z¸Ð.ÂUq˜èòBä¤Ö¡â±÷ç(SÛ¢»4Ü $R0hPˆ·’f[ÐG°å£cbÀ: Üù°åçºú¯çª¶‡ïF%³ø‘Be¬)‚ª…r¯þZYâQ„¨»«4Ë& á¯E5OËݯ&Œ}H9…ÛÍ4<ð¬’ê9\1 ¹ò¯œJš•ÝS[û«4Ésû–nˆh1üY×’cÎÕ>=é'÷mÌH+„+ç%¸ÒÌpAI^oôªÓms)¯9àþ>À»·÷öü4>¾)d!êD<>)LA¹Ñjt÷ U„ZõÜ›?$j5¤/óoó¿îø1"½ºsô°¿!½ ²5ÓÂr,¬>¶iZº½Vdœ£s<ÿBãU}‰&àœÿ#xpƒ²kú¦Ão=ŠF“ÙÚå7SÄ<Â6Ü/*鸿ªÌ>¹Ñ¹Ð€aš¤gm}EM6ðA8D sæZ’¼àLø½:ÊuR]‡ÊγûšÓi,åš]z@튄A]£MyÙ£س“€^“] >°¹›çëùĤöSã?Æ}—¦—2 Fª.¸ =D»ÒdÞuωM¾f UýýI•åÆ"b5œÎk³Z~—Hm rvé}×®ù<ë:áäL—Ûl¨ÐX°úþ;¹¶‚às™j‚ùPIºi÷š í0ƨ²5CÖ›ýR["ä™èÇ/ò%7Àèa—Q"k‹=VunI= n…¢VdïqÐYÎPš’>Z`âîh˜2;d–^;¸Ï“f퉃,#Ûß¼[ºØ„:”b?˜'µ5LCxÃÌßNIx ‹…ÊBò´Š`œj´úLõóÿrÛƒ_td}J™Ü½Ôæ9ð´éÔ¥ ÍG¼Ÿ‡òû‹­Ò<‚é± ¹ÎÛ´"2óLp ID_ëWŸ©‚î‘Ó‚c­ˆ5òŸ‡|©3M €‘„ú§7®Tb­*Þ÷xçÙ:*Qpû€aÊÙh JCÐ:z,«)÷ŧõ°—’aŸ/‡”²|ßÐNTN´ ÐÆbËçÅ“57&©›¢|šã^-=û7e]Ó¶*2M ¬uÔâçg€oy¥ƒ}àwÈ(&Ø4èÈô‰Í/³Ù nÍŸ{ÿ^yˆ‹6G.(üÅ4ºþ5¼Uµu†;Âv†[¯ÞwjÌ=Øo‘~%£±ƒ4òÈ;Nm?<•Ùç}?ŠaÊ…ÑаtØÍ,&gò ŒíÌH1œÀ|ƒK•¶Ï{_t$B}Æfžƒ3¡%Õ®×`ÉÆëw²U&ð(~t?—ÑÕâlDBIð­JÝIøí¤Ö½oèŸjÿ+zsÈô<¹ŒþjÉ“Y/ôG´3'Kñ™Œ7F‰Œq9ʤY±± ·˜Úx„G*™ê&ªùþ³Â3±íÞW4œ;gË5;Ùë;÷¡ –GA›GãšÛx~mí…G')ÒVsZdÐ4 ¢;Ú.+#„‘xvPcµ>’¨¶ÑJp?ö¼Cg*²>¶ySÎÆ$½ï¤Ýû›+xÆ]ñw*T}DO`¦) @ÛøÍô¢ÆN?–«SzYíiÞ¦–£4~Ö)„ÿsfYh³ˆ'Kí¼J«L‰ ìÜk„¾ŽËÁ ”F@¤´¯Và—\“œÞ83MëaGHÖn»¶^½²¥Šo­µFSÏ+ÑÚ]n§ Ú)ˆ^ÔtžPõôÃ~ƒSM —çí¿ ml€þ—OH» „ûÃ(¬¿¨ƒËN”ãYª“ÿ5Ü?: .x¯"¿jÀ»Ý)ÿsÑEIí,:×g±ˆ¨OÅÁ({“ûâ;\ãO®lt3§È¡¤*Ê@‰¿Ë ÏÅM¹µå#ƒðÒ’ðØËLomÀymSBã“Ï/6ªÐÐÎ7ÿ#d°Æ–oEö@À¼©leXeÊfæ´ºÿ€3w“ ú)0ià‘‡²Jéînõ{± ¦NZ/8ÄC}YîÍ”ú–à ¤rU¨°>­ÔòÒë=¼ æ±\Ÿ˜dŽÜªb´®æ×¶—©2³#.:íñY†% ØÛsArÅÁ:±oPEž¥h=²GQp?ÂaƒÚ*Å2og¢$š»øê·± O /kp‘‘jç‚z/½–J`%$†ïXÈ'Yß’è gÖß°ï ÏB¨œT.Y&*ýòË 5£|ðÒƒ8+>£å¯î2K_oh™2ÎË—HùrD7£s“§ºÙäÇõ‡ºSS³cd½!à•’Eç¤Ó¸°¤{}/mKµZ‘ч2nmñ¢Îy¹ŠÐ‡Ž 4ÁIáU­ã>gÞЋŲ0½˜6&jb²å ˜V)èŠz_ÛpÇ2¤&ø4P”}\¿9á~Ñ‹‡ÿdLW¥Ø¹ÑèU<sg=N#dHs bm¢9x"ÿv«u+C[MPOÔÈ÷ã‹ÔNBì¸.d£¦çw`ÀæoWŠNºˆç`í78ý‰.8Ȁ؛ÍÁì·eåÇ ^ ¯ò\?Q”®Vé+g‹H&þ .õÈ LR&ðs%.ÁÄŸú`á­9ƒMÀ=<ía*ÿk[Á“,„’q0uj÷èwXñ`®Í€É)~"–[Ü*Ç E§ÚKxmldr yA+²Ày¤]Z_vÔ¦3á¡®¹Þ ýíœGñÏ9- ‹Ù½ŽFêÇÝ2RüñQZP 6ªôéÕžá g%@'ö_í¦vNUXã°³ÿ*y³4çø/]™÷³Z¦RÈy:UgÆ<Š¥TÆ#¨(®²]É…÷ó%>GW:4;wè&Ÿ G’å²²~±˜yët°§×mBu@§8!£çAÖ •w)¸$\vc¼í"(‘|”ÖÝÆá³’UÕAz áIÍVh@Mœ/GÀç#»`ß2¸<—‘·ö'¾[η¬gïO¾ÌðéÜ\B$”TX‘7}P³:žÑÁ’dtT¥A£Î®›.¥*1÷ EBÝz~ã`hD»ÇjL)Ç»C$@|03@,½"ÂOWÈ‹W®ž'U AIMôNÁ·Xžà7x²öÄKmzã=•ìmyÆe½ÙóÅ*-@å¶Aæ¶53`wN!EOÒM'õÃØ¡Bžìn 'ÿsô›«r`àÁ™Ôªù¨î\¶@´Zš1'UÅPí«Ã´qÙdò/S»6ˆ7ígi¼ÑPSè}ì˜ < “,¥}Ú`^G9œì9µêhlE¬jÇ‘k[X° ó•Lצðæ©é5œ—j¿ËM¼Œ´2Œï‘TÙ:BƹëŒ1G¨ù»"/nìðj0fòîI§ÁGÙ’•?›É>þðCk4t ¯Íí¡÷Œ©}Jž¢Çß;°ÅåO¹ƒÌÌÖ¢ ë>Ýt¾˜žZö•i-íI¹”9§"ï;[ASºÛ y0©i”yBu¯5åg·š…Íç¼A!}€uY摸IudžN!”œÜÓ~bw²7þ¹w™‰'aÄÎó/Ý Üè)ÖÏF¶EÑcÀA¹±yü âÞÓ:U¿Ì.ª¸ççòïõçÛ‹(¸—·zÒ¸ÆEþ++…ØX‚éE`-0t‰ Dk¯?±^ÇÍHÄ¡EË$ݦÓÁc‹\ýåîc¢4¶0‹Gã ld">uín¶«ƒø¿-ò¤3½`ùðÒÈÐ&Å×T({FªuW4zÃæHS`ÐÑY†«Ê‰ñ+™q³×¹¯ïï_|7,oópÒ-iþÆL€¤H¦òzž×îþÀR§ÌÇÓô†-ºQê–Òsé¯2Šf\ÅÒ®Ù¿înÕíµÓ ¡Eðr·ž´À¹Æ@ÏŽ´_ÊååÑæ˜Ó{¤Lºà>f>I¶Æhq’Lä×3GlÞ÷:ó úƒÿPOpaÕHÙneäàc]À$“¨'—~•йyZdŠMZÄQnˆí€€âûQï¶î¾Ôá¥øþ ÂξÔïá¥ØŸQöÙsê)þøuqÒÿ%Îg —:ß9YàñNt$æ³/p첄„Ÿ×N Lü@$½¨ø›BmB ºÈy3Ô¢&7SSp@Ð7#éññâ ˆ¿ 3ÈNF/ÿ`³Å t–*{[£+#±X­w\Ý·±ëÁ¡]Ó9P:Y¿w™ ·¾• §¦ä(ÛxÀ}êÔW?< K}‘`‚¤­ðPy”>Ih¡§„añU®2ÒÀ_¬²,¥)aæsÖ·¸hN¯Œ(häã’" ¿äÓ¶úÇëÌGÃK6ñ.0;Š…DvÌé!våÀWq·uójây[3Ä<ª­¢3{¦íÛA&¾­et*µ·ü¯wRÂ@¡ˆä&Þ)¼âP $! ÜÏFìÖ´nS<ÛõšOZM÷qä²®¡?µƒœ êv$ B00 SX#3v£yï£ùË¥fÓ/›Ð±Š ± ûp,¦àÎ.Ø}]q(R2§¶ÇÒÄ@Êó8Ää*Ǧ"€Ûä\Œ˜ ýJx8ñL4 [sB»ë%Ö¥–:ü³×r`Ÿ¢®Çî|3ÕÄ»¦3“í«rLy±ÌgNÄ÷Gl9øÅÃÀÀ'ÈÅìÓ4‰8Á}ç{aõD°iö±<—Ö̰~=´ÀJ5U¨ÚÁMÆo%vŽÄø`k×}i[¯ÄT]5ýÿJ²ŸÉpÔB±7G@B@%ƒÚ>X:ÁÐ/rÁgn¬¨rñïT{TY´I3Á>òæí)`”ëto¹%F)ëoT*~Á³#[©K(¥›@¢Œ‹¨ˆe¬¹ËJˆ±ÌáÞ•Ær:@ökÚòÒ‰?&n€ÂABU“þ˜¦ÝSæÐGÌ^møX‰ dx ¤¯)Ce A³£Qqý7ûìEªÉ@êûnðõþ £‡­&í¶§2uŸ&¶›ú,[ ›Ëw°e ZŽ‡Ã°ìY<2úU>z¸ ð›(Ye–‚£õœ°òE2F×±þë]šå|y[ì÷bµ0>;-€ug1·ý R¤(…Ö¬J)ƶ‚)LÁØ{7RÇC÷9ØýÓÛÌ׌k|žòÃäœáÜGùSæ/l"äw>ç:H°" t~eàþÛŽ RH2§º¢£^¶Ä{5TÕ<8U3‡Ð.õ"ª€¯‘/Ö‘õ®§[rĆå’ܪ‘ˆÊmd|ì…•¡…û:‹þÍdkq“¼š²–ô:™jbÃîø”FfÃÁfLú™T šá†C¦ò>ßÁâ]cçHÖBÓ9ÇTÐã…QE_ªrW‘”üôëKL´h 1d\ÿ TmË3¾Jz<úãWu–‹¢¤ã“Gôº‘ÛŒ- Dí–DçÙe6¬ˆaúê·ž$%Tj`ð\¢§"†¤çúadüi×Nb¸Ž‡…ñêÃfv×äÆ6í6ZÀÊ..Õê½OPÑ#Ç|µ5L\M›ÑÝL {ÉïX4Ÿ:Î(²“ "?Úu÷¯õdŸISs+ihgº26,‰úêÌFiÑ>ÐÎû¿Ù~šµ%‹jC.Œ©ÂæŽï!B"8T¡ƒõÙ_úoOÜÎÀ,§#u„âí›h÷>Æ›0Yéûûë÷þ1‡zUÑrÓ"­¸ö§÷MÔUÿúB¨J=!ïpådw~éÒNÕ=Xy-WÈÿ(2$ K0 42ÓêVtšõ´Ð Ô]–«zo‰ê)0/ìA{^û( Àyvooâ1Ÿoš6~÷ÃÀ*¹8 ÇD*ÊI*­D «ˆR€”èŒn8MPœü¥Q• þàj[+€ŒÆ ÊõÆåÁLðÛ¸í"ýrD{¦ç¬¡Âgž£ØÍè‡X¹YIœmŽ9 Î×!‚0ÑÈ] Ô‚€ÇÄòý·'íïç~ßFKê¡¿nˆ~ßSïÛêµûz ï·K/·Ñþ‰ŸÃ©¯á`ßo\Ûé}ü:ËåûkßÛÞNý¾ƒÕPßU«}^–÷Õê}[[¯ªë¾¯A^û}¿‡Oß¶¡ý½VPëíë_…ú¨¯ÕÛoû{õý´çê©?W¡ÕõzLþݢߪÊý]Ø·Ð?öôúžÿ+¥?Ûè™ûz{Ÿk\ }`ˆ’"…LO}E~ƒ)2ŽÔ8KÉ8ìO."h¢ñ iʱæx‹M¸‡Â€Š%IۘɛÄBôñH1 g3u\å_Fq¿Üá’º¡Ý<ÙFæôgJ)`*8´¯‚ÿz{ú¨`…[kÂýÁ\p&ò¼nÌ.†šµpmXH^ß›{5 ÀŠL?l±¼óCÉÓy£Û4wvíÅ,øÖWRÓ«Vñ§ÆÆµºÃµ‘|š@ ‚^hýÏò\¢`Èþ¶LzA@é¶q,¯A¬]‡¨(Ù—Ä^ëÇ@O;–Úcî\'Á‰¬žÉ„,\" »W(Zß5Z@(Kv`MÚo‡DÊdê¢Tý 5˜ªƒ.ßÕ¦²J·¾bÅø?2¹ŒÏÀØK‹ÑÉྡྷ ìeTi¸wL’ëŒÿ®†ô÷/Š7…ô6vŒ õ‡Š†Ý) _D©aŒql/ŰÛm¡el4:Éß•7gŸê|£F[^)q÷QOÅ&& ·¨ýý4=”ÜbY÷ ;þrüÆs1iI `áSEä<1ó³ùD7s¸fÞÀÙðñ»fà ц͹‘ÎVäMWñBåÂjŠfû(ã‘í)Ö¹v‡aĘéSýÓrYè´¶jhàà }4Gr‘pz3!ô?·¸qLÚ ÊWªsº.x”«äýãG{ˆz$ ¿F”éN \ì –,oë˜}àòŸÃå„¥óËˆÝ ßgúÉŒÛ÷s¨š2c«”@xŠ#Ôl\¼çž 9—×Aßò8QÚ¢Òûê­àq÷œÃýï©É $òã¢v+˜þjô•Ī6Mã8ÆùÍ:Ïnšø…C,ÆKC ˆÛˆ3)TäUC¯'œ/Öj¤Ú öå黑eXŸD'–Á¤0¾G­v<“’¢#ìyñRj‡l0$9 Žú‘1¾–gz ЬHÜHºFÁ5VD {"hïêªÍywõmÃM™ØÖŸ‡Ç›œR„â¶JgâËÊœŒYz¼ñŒ'A±é÷ÎL\ø†àНl#“ÎÏsvMléN¦¦ßÜ÷è;¬æÏU;%ŽÙpV¹ ’ˆŠäqˆy1€\Š÷‚>ßdnÉïHAšCû|‰¹TNç8Ö¶ù%ÉDëŠ8P:rjcª‘˜Ãní¿¦ºˆéHM|Ä3dwº£WüA/ÀR–ÖwÅý€Ò’»ãóX¥‘¦Rò rY@ˆJ!¯Å<ú™u‘ åżé¤b‡©[‚¸8mÇ;(ow"㦘c¸¤hô1a§Põ)ô«t$wVÆ¥ Râ6[{¥ëK­ªeÛ«`D_˺.!µmÓGÖµ…ä Y2t' a¤EñücšÈ­÷BEâšãþ®à0‹ˆGEÃÐÖMß¡AªáÞj”(,ƒë_í^+aXòXvŸQ“Þñ(¥"f?Ú‹îÈàÉžü­rrÍÌ’$£ŽMãI&!d'B¸Ç>ÁÂÑ¥)Š…àÉ'êlÖF8kOW IT¾Ã.oá5œ—‹ZÅé›h¢O{ÊÏq}$/ˆ»ÐzÃù¼\íhø¤†Y›iŠ”&¡r¸„؆ÕLÍó§¢”ªÁûS¡¶ˆÆ]$”šÃSbN)ú—ëé€e7  >X›|³*3Ô:Â.(Á˜z¹#vZß»ãC×ÅüÃÐÆ"Ãs73‡…ÊIä,Ôì‹Ôåð­ë¿Œ1Ó¬ Ô{ǰ—‚9&~Ζ$>±wŠíU´†þ³Ä”Ð<àfú7x&°$ŠävK ´õ}ñž6:œ4ÐøåöNÑ2­µ”7 _·ŽCŸÞ‚·œr07ÆÒ¼ÀÛ°«€f8G¬h}û+8¹=7ÉUsô„íŒÅkJ‹7MLúnzÀ[(ö=+ØR*Ñ AÙy$: Úê47.;#Xñ]Ö¶¼ô°ÍYG0 qžR6SÌY×,{*ÝT¥†ƒÞì¦"ºü u¢:¥—€ùøxœ;`†¢—&]àMªR TßÜIþB™QíÒ;i-Y@- ì-Íî¼ÿDØ7¼…®!\C3)>S|žèû#–ŽJ{aïñžâ¢$Ö8$ðÑ\–FϦÜg =9s>Ìö0öðòÎß^î«'ä‡]¯ý´B»3µnçóŽKúO2Æwªv.”\éâô~úàXdüQ<^*G]Ö:þÔ¢|˜¾ §AUf…sasmöd#DÏ1G6pó© làsÚß'ùmKùìULh€ßÑDF©H:Õ1õä¼jyš]Òð“…¦‘vV ØŽì#Ó%°æê¿‘ª²"x_É–¿acŒ/ðwxf¸g)-¤Ð=¶@=]¾ÿ-þÖÙ]tþÿ¸»vãȰúWŸ —9‚†ZŽ"4ø(¥ÇÌû~7 Yƒ ssZ¶"u³t)}Ô šh ΄&¬\ ¯ÆØaíò#²«5lôÉÙÄTè©…@ïhD£Y@ù`§£ïÜmµú”›"@BÝ·;7w¾ ¹¹„qµ¯Ÿ‘†Q7>uâË;šúÐÀ2Ä 4ƒ„®J¶ÛÃÑ,Á;« 8Ûw¨ôýóoS²Û†yTúè°À¯¬ ösÆ¢_«zUªÅ¯nxnê=;‡´Ï‚€YzaÂ8XÓ+N,é៣J(Õ†#dö³à'û´¢ºuü¨hÖ€¢”«(y-ƒ:YiO<œ»vÇzìõ¯(3†Â–´ã‡"ÃÞó% þpAÈ/ÄÛþΞŸ¡žÇè;é¦d>xIÔzªñ •O\w± jn~Øþä‚ Ù85ϳlYÖ« „ õI÷>‹±±’ŒŸr]~ÊãPE¼7.ÀhÇ4‘2ìwì)KÒ!?“+æT‰Û(×j_ÔdtR Cò?Š‹´,ZZ¼Ë/¸mÀþœÑóáa @ð|„å3x‚*dQÈ ÕÎÀt&lQ»+°±Vü,' f^¥¸š¾Þ,‡HáÃFA_WtôšÉX£ÓÝ)ó«õ6ñ“L5D”Lê¿Oä<° "XÛ”„W¨_PO÷ôÃÉÑ”}4C\f®¼Z| 扭~àí²î_á Uü}¦Se¼&ûñÈøXXO}Ï{÷þ´;K9nÒpxö–=u&¿Å"À/^Ý\¾§i´¨>ÊŽÛæŸ/¥(¿u6Ÿ[ðÇý“þ7&-±rüs&ûºÕéw.È|Ïÿ p„µÓJÜàJPEHOf@|̵R»×çÐ1j/qô½`¸ˆ Ÿ%M?HTÚ¼kw’©±OÐh¨×ÌN7“ Y»ìäÀW_6ÿ#³¨¼]‹F·3–ã ÔÊ]GÿEÀ™øÉs2û­Îu{ÝJ{dB ¨~/Âh¼Åï…`¸:a+ÁÓ€Ð]¼ø%•5ó.–œ¼F æZ†/>˜s“ \c?Á“šAf€O¥RKôgeÍËsþpº´X‹–ýL¥VCO£ÐÍ—íÕ×eÆE‹çÏYíZxÌÊ7jiÿh_¶%LS Þ.‡Fi¾A¥&#¨@(WhØOd>’bS‡·™…–í*švM¼³ áŽTQ:œ«65ï> ‚?]ÑµŠ¨g ÒROéz+ˆ'ݤ 7!c _®ž£\—ûƒM#•ÛnæÁdìVÅRzÔ §È£>þÔ¢ŸTCªHú °å\ÆžQJ?þoÚÌþESq`aæ×BúsÌÂeúm¶øëûaê Q ‡½ ”ãœ=¸‡õ󆩕œÊ¢ïY./£iù°¢&˜ƒ²ûéÌÔÉjd[.žZ¬mìÙØ É ‚VäÚHç ¥(Ë×r|ëƒä]íN7îÆÀ©²‹‘ ?µ;K„~Fº^å-0Ì¥‰ÿœoäO,8ÇHeÜ(¤Qﳜv·—ß»˜í{_^œæ. Tð oåaÆœIôˆ¿e#”ÉšHÂÞ9™héÜ+3*!“äùzq= lû²& †³k*Ža¼wn,˜± de¨5ì<¶‹“iKÎ3llÜkÈuD|Á1™LPç".0y#Ãs¹¬¬Ãz EPKr öqMb€f ×¹xBÕ¤ …Dý†„ýæ:â®! *IüÅ<²à0ágýY¥œ«æðsÇ׫f–76¨9ljF;YX#ѦoP¹o(+Ñ5†g—ò–+ô°¸þ]ìR7ÐôÅí6h°ßº¡M­—›_`ˆ£„ôHÁÐQ[Êð!ýAÊÅ«Œ¬–&`œN£Öj‹¥\ÙÅ]Z¾µæÙ솮@—½¢,†õÓ Ú¢€à&±F¹HË›Ñp†g2 P ê÷Lt’}úë¥T¹`­ë©GÒ'œúÄs'c"søã®—±Þ xèT+"?”„Œ"PñV-£øÄËÇÈf¬Ú±SOf—[“Õ»òlÛ‚Ü.±àñ5[A6Üš{àUÐÍäICì÷Ìæ©} ¸/º iŽÝ¯ÌÖý$ÖæÖÞ²b¥êîô¤UË žhu‘‡_5ñ]9€Km`t¹û›.øN*>"’쯱kœ¤µ¼®ÓaÇO¯$%ƒÄtõ®õmG$0ÖÅ`§þW$º”†^ô…MVIÀÁ iª$ŒR¹Tì“–ÌÙ¹‡Ü\ºÝÖGB"„/0¿hõMìÔ§±uý.·klž{•Š£5”Øeúš¨„´ÚƒNüyQýµÊ:i{a‰U³“gø¿Ó–7[ÂDưΙ×.Î'=GÍÄOY(¤Hs§•mlÀ’¾’>^Ìvº„õ[{à „4/?v'gaˆEmå&ܹ-zC+¨â½ÿFðSŸ®@‚ª@S ¦Yçñyµ±÷ëèÎcr¹ÚŽòK×=]È]”ö*ÒxŽÍ@ž);)ó!qW[u:s«|8õe‘ðXEÌØ­¡Ã>¼kyô›Þ,@Ex14Œ™ø&iT}ÉðjØš¦€^Z‹ö›ƒÓm³†îÈ5²•⻥»&yJ„ÙM†N1dÀcм1|Oƒ•Î\âc‰ÕMÎfÃtÍrù2“^ 7ãÈ^KØÒôö½ ¯Ê]ø¢˜Ètˆ’À{ɹ·1¥¥J)ŠÏ¿™©ÏZÃ!ŒÏÏ4ƒï:)õaºœ‹‹““_·\1T/°zÃoªƒJ·½ …¾šjúóQâ,“ý=d4ÖªBAöæ Õñš™À¬AÂ~R QÄÃH/ÙÔ~©Eè1ÃV²9Ÿ^Vák5Gñ˜"E¨øúÙÙ(a½÷Ó<·Ó£ŽHõ?‹FtU­‰^X(A¯@•Çeˆ.tX©M(¤Ö"×ø\µu=[EO½€ÀP«ÜÃ=Èø"O8 *˜Š¤+dF_ä€Ý/;O2Á¨wr…n‹‚‡ú(c(P´ é€çW÷ÇÄumúÀ„£‘Ç'!ÇŠRÌ/¢Ž“g’=Çå9©\§è H:Ãû½É&áÑN ü•mz\§:’j¯O‘[V2(»Ç"ä,9Ýæ hÖÃ8äýA‰`õ<þa ;S¡ë‰j,Ö!‹à a£'uñ<ê*B} <žkj f ˜òòT{$…– ]¨!Lœ9u;Zžmÿ5)¡±•ë“çàììï’RÚç%H½ «ØÈ¾c;è÷eü=:‰ÌR—¬_Bn«Îtz{,•¬÷W©ô+)§÷Óy´6cé+B‚¼ð¼þU§âð‚Ú è ®`ÞH,~}P…—¯‹w~à 9£P+M$K|-ÑÞyõa¡Z/îŠ8\*Ü0 ÃÎ 0m­_¨)ÊêºóùÞŠ ‹*-=Ø k÷'ϱÙá­?š¸ï—LÆmw–Ñäs8{V‘±Ë §Ö‚@•UÀlõ\¢ñvý²Ê-òIÇÊRD5ÄÊþdµ»þjpˆon¹šâ4ÑO¬&¹Q½;ŽÃ¡ÃK9QêžKß´¬*f´w¹ŸBµì$A6…$'I±’g:ˆd^ÜÆHÃÌå$ Ô†4OÊ”ú•¶J‰ÖúnrŒ½®ª™wS„DÄ;ÝÍ:Ê(+Ÿâ¼òí²ŸtÒ|œhôÿ'íÑ,]ÕÒö?Øjô´Aèáæi9FÚ¤FÞ±RÅ… bÎJ]Ý%;hY‰Y´‹†çdüðÒÚÅÉ|QÁ€œ …Îy'ñÐ,x&ÄÑ(,4%êXžœ$¦á ™çx ÛUVšº²ø“‚ËÀYïÔ£¶é=¥N…úîW ,0 `}|Ë3ñéµT°á¹Û¼°¯¨®œÀ=Â2(=:íÔðUŒB3ça³µP)Ž™vàˆ¢ˆqÚéG‡zC,1ËgN"pèšZwY9¢ÍÇíÙªx<çOE$™% a^!YÙ¨  ™èÏþ`dz°A'@˜ÎkâŒ5ñ#[uÔ^¯ƒðZåø•¼ÔÿîS(Ã?(išO:è³­†9 o‚£bJy .^°˜ŒL‰ OeÑ‚P *seA`Q—g= ¦‡¾Nzd+»wå?aNyê°µ"ˆÍ]ÙÑ2FUhc5_å>íþ“£‡dmEÌö úT÷ƒ„¶yÛç6?¹u€ÃÐw ¡üÀ¢èÒ…Jö¬ê ÷ì`r ®+YÒ- ??/‰»Ÿ‚f#BôZ¢.n:Ϥ³ ßjÅm¿!BmšG¾˜”fKëÏðbL-íì ut¡êŸâ•|š¦Ù†(4ÄMÓE„TêÁ‡Ñ 1h?§<4† Tëw¯i÷›' ß!šU‘»¬#ã‹x®k»Þ8¢Ý9¯A™/óæ ø–Ìp²jqÉë|+ƒ'bQª‰±Ùe—G­ôú¨‡š×<¦aH¡[ä™5 ˆ(L +NLú˜mØËÂl€w¨9@’{CX(ÆÑ=mkSú’©±O>ðSá0B{2«Ùoê@¡O‘‡ìEùÛ}.aUOšÞîuGó+üúpfYpô ·52ÛL€;¡s“¦üyç>åܼ= pMº[¼YEö؉ ¶Qr…‘ÞxlÜåS!µWk-¾DÉjÂU¿xÅÛãMVä“ùMw~%¬iõØMþÏ’’åká=ÜC¡»K/é… Çr‚Jço•Ð;-ãåÏNì¢.Ë i¬:lÓ·e˰øgÌ9ˆ)Àë}ûë[¼Åºú°aöÄ”‡sOû‡Wè>Qó'É%®ÎPè:'Õl¬dP˜ét†|ïvZ“…ÀoáR4S¹9qžAS<™&6&^ß,ƒ]‡!×c~ânM›{ë|ù*ÚªX(ûî` “ÀAa½ömŒÓ²Ÿ"$ô—‹xé¼¹U¤0rŒêQjÇ~nÛz|€zXUÕZÈ……ˆ±ë ·;q°’ÒæÆ(í_ò¥IÓ Ó^?¬"xÉ1)4gÝwÝÉ/2ÜR4Påéök(’?8 ”„³BÌ=ÓhÊÃtlœÛ¯X›ÅsÙÿ[iKéuçÊ8yÁ¸Ó8¸„+VÎ(ËrhÕ¿:ƒÛ%p¸Q‹Oc/v,ÁpX£B—Ã'  ^£‚:àµj¤`„ì}äó ¾PxB…ÜЋNÝY}¯„ ‰RÑ,O3™-—«[’ú¥ŸÖs“ÜêO„&`Í$[™dÙTWàK¬HU“.‰ðÅøƒÇeÁO§j'ØÐŠÑŒSü{ßs¯/¼­ë .ˆ­ó ìwŒXZ„X þEŒ_å¶¿Oìk§®äWziÇBöçŽ`Â<$¡ÖUà¤ÃùF +Šxf°dîãl!¸’L ,Åmo#Šÿ9þ\@+Žóaî®î»Ã£K¨°«MÖÖT¿£Ïš¦< ­q럛‚PžèÈ™^-YèÆ?LßÄ„ÁÍ&ãCGcĘqZŒ7M6!W¬éÅrH¸Ùh¬€æÐ hû­w§35E>ø‘î×áùqùzTªÚõs˵éöG~çYm0ˆê³YŠÈMOÊiÃ>ÿV ôš†Òmr<Œ?=d’%¨të0KÜH¿S¸l®­»R"­ºÝ¥“1»)œï5"ÿ6ʾkìI”-Lä|T¼²™w%çó6’>!x;F(Ê!оÒ1¸Lw56½?ë¶ôµ0¬[“éÝâUUÆ‚ˆ´7+‘÷ú:ÁV®é Ïþ/‘·_Ù·3¶òÈìD Ç5E 5äþt<õ-þ¤N©Ï:Û£#;¤5aÒw%¥°ÌÈ»÷VS%6­«9XL)¥‡Éu †ŸÓÇ$ÜŸúúq«¬ªLH@}åxÙ%»«²óI’çøŠÿCX8Ê ßPó‚H#v‚è‘·?ØêÌpgæ|ë©Us£’ŠÂ¦(uþ;â|¬· S7\ñ¦Ð˜çópL1oJõ|~»tÁ®¨Ò7”ìÉ[ l':Æ „÷–9¡N¼"ÌŽ¨Ð?¶T·œ®€ò6ÿx£Ø­¬BS/™VD=›Áuª`Ñ’ÿ}“u¢xñØá-Ų¢Îœ‚|9‰NþGÕÅÔ0a“ûz´T¸ÉãfÇ95€üIXâ‰ñè0œ”j–.ë{·»H.oq!ž‡¸J%ðìƒlo1ÖîŸSÉuº¦Å½äܶ<Øc°[´ dMXVü·»ªKŸa°~¥@dß%ˆ¸mŒ»$¨ðD‹ðBqÁTaÍÛ j©äÜÿiI“öšù v¬µÊÞ±3%ª×­ øÏàAKme»ß\ÏÇ': KöÌkª~H„KiM–pñO<<›uÄçÆ|‹óÖ¦ôß÷L_mÛ¡ ¦Nàß ÷µt(¥ÅPâÐ |é©”Á" ‡Š‚°rOå᱃ƒ|ý©7¯þ°§x†ù(­ß V–$щùõ>†[ÀìIh¨êâD˜§J{Ô/漸k®sâÖH ECª{1íåÎ2-‘þéί ȵËèsq€Û<~iä&¹€B¥)¬ÓþŠ …éSYœ‰OûÕ¥Ó¥Â<Ž ˆôa³!B‚ÝÓ¡­ÕvcÑÆ‘…À—óT”Ý{Ñ»ñ¼E-&³ª»[ޱ¬Kå1ñr^=w‘ˆN»ìÝHÖ‘„kÔ«!0 Îgt(3 §·ñêYă©Ì9•Ôqë ~cõ,9r²z& {?o‚Á¯-{ /#ù ³ÒD(¸ËßM0ä\`—uÀŠN`jbùÓ×CŒý¿Œ~Ç5`·•ÕB\…n 2¹a¥h²ÞA·¥7·±'$pßP¢OJ.2N[¤WÒ8€»C™Áç I,ómRÇ‹®”š áHË”‰ÕqXw¤6dXÆÇxù[‘(á®á­•pE´À5Á£¸ ÛjµgŠ»Žú]£è-pÅÙØ¿Ж!;·DiO^$÷èë~…Iº~cäîf"f—þàà³ZÝz±u^åƒÖýÑã xN­#½7iJ…ü”—ÕõU–¶³z½J‘ç!W ú«Ê+b½„ZüXï#i‰¨ÒB8 ”6^YoVþð®ÝQL¤õÌ¡Vɉ„¸Ø!¬ÏÜQ2ßç¸/MHÙÅœGb*Tªð|@p£BáýcŒ¸DaÜŠDe%ÁûûF]Éœ,€•>n0i§ØC\-g§Í@ÐöË. ¢G4—"µõ<#ʼd‰ÊÓªL©Þä:û‡U›êœ(ý9-oÍï<Ž-1Pßp–¢îƒÀK£šzø:GÔü ÷ŸJ5ûªÐKÍ\H,Ä‹Ï@!“c®¹¬Z)ëŒDbèX¶I\m9˜7S˜¤§-RЬˆm„„laë KÖ˜¦S¢AôÚ§™Y¦2ç`uôѨ±9ŸABKE²XÞŸµ ˜ï‚¶uÛ zBÖ¶Ê7Œ~35#ðÅPÝß›&·† W)láV_ NØ]Ü©Zzº åo6@V@›ÊÁ,\á.[R¡o€süÐÈïÓøšßoÃ2q¸«/´³•ž @‚…2ý0á=r(žÔœ¨óMæ/)„Äþ¥—–Å“XÝqPdߥ«WÀÕCÂpc­¯›:¢÷ùå»ÌÕQ?ßt#¸yøÞ–¿ñüeõÚmõveÓ#ÏÁ·¿b¶Ñ¬e6ïKõM>†ù¥Ä/~ÁàJGk)¢4ƒFEÜàÞÞ®bᣘøÊh]‘L, IŽ{SʋܸÏi[ÈÆç9àÔê„gÄF{Ãhtz_K-¬âE÷9dã ™®Ìp…DÝã´žDµ+‚‘Ê7¼57u¼æ”.O£ ]y§Ïwæ~ Ic+Øv÷ÎÒÉE¾Ëî(ÿ,S$ø±æ 4«Â·©næÁ ÓÎD|±¬Bè””‰|ä…2%¬£ÜÖdl~îV"m½zÙ& ÂչСŒÙ×XÄE¼«Ä g{`ݶ´â Kl4Z t.̱ 2Ñ7: …°Š?á$^$‰ÃÁby=¡‹À•e ‹¶Næ ë½äŠ[ðˆ’ÀÁLÝy²î²±Š®ÜÊ(¡‡†w]Š€\±rælnél çT”yÄëià½Xß…¦4+6\|KlY³›ÄkÊ9ã>r’Hب¿0_:ÛQÝåD~žY]±VË›k‡t>Aï@ÈX’%·¢«x=vQO€¿¸¾ØkuoZãvü›þ©ŸÛÏÍgIÓÙœ±Õš<¬ @ððL”yŒ¿PW‡4£-W¨Ï=æŽÄßÏ´Ö,=FÛäÒ* .ÿ^N°V³"3ÚBCïcáE¥717œex‡wJnÑNsIéeTn&dü-ÜJA¡ÓIîÕpúÀÓ±x ~—^—[ñÆK‡÷Š*â§bh3”iˆQ!Éð®È…aÌVAr¡®"™ï,—å÷?U°ÈÐØõ¤®±¯ÿ_ù(ò;çÐ 9n–"öN)÷ rï ´RqÇÈÁAGÔŒÔü]‹Gj¨sË héÃÉÆïÎãhuŒÐÚÙ8ÇÏÖ w±îß—â^€©CIP•Cj¦ª/R•‘ûѾp|]Š™±Ÿ ¦‰(Hî‚ê°.#ùýû"5éÏ+‚q²¶7… Ðh0pOQæiü¶;ìîÁÝg@e ˜mˆxÄ,åCõÿŽ*¥xßÿƒšæCpñ‰!Ê€ùöôµÉ “ªœÄ„Ô•¹Žsº‹rA…˜øK¤ÏÀ UãKž\öïá1‡ìƒÁd¯DU œ¡&;ºåçß=d ÷?…aÝ¡Öj ôîû<8¦¹,«ùò‰¿cÈ•âÜâ§;ÐhÅœE2–Ó;}GÜ…Œ9.é󤫸è;^]JG¬Í9“rxhíàqš•7knå}·“f¸žXØèšP’@E~ƒ”ùñu¾|­ ’òòX›+2e „Œ"&š÷D mÖ˜ô/Ÿ¿Bì¤Ã5ÍøÈ¥ø’F¶cä ƃ/¿0#‡›üš…æya0AUÁÇR» %)¶ÆZ¹çSûÞãj¯wU*7Û4Ø(­ÃÆk˜w¡4åU9Z ÊC _?F‚vôˆ,õN¦ÜRÇÏÍ/žKT@KºâÄ«P[—œHŸg̈XP®pqƒùý®ß?ã=S›r eOÏ"ð¡Òñø³0yw9-^$wÊ”èpÃ^HR ÄÏ…tZX™“î‘Ð,RÊ]áXFœÁô‹Œ‡×-pSÄ"ùŽj°]oïC³EâB„Éý:ñÑÞ×=åÄв O`ËÌ®èÕá0›cr‰ÑÇNC)(¦ :Wˆyà%-4ñâˆÐ Éí„ qÉÛì×pÝô2>vGkÍKß/g˰ Ï—Üå¢;>z4;—æ¨;4ƒ¢uNÄ Õ ÈÒÚãH¢+ÇŸêZÏLVÍÊ „X~›ß±©Ñ„¸ÒůÃÊ?-þì!îô=é‹¢9uªçÂfQçùÈYÏLë¬|´É˲ûúëßÌyw׉VØÒÔÜÆÊV,JŽ=T-3”ô|D! ´¬Dã·îUÆ~N ©È†V|¥âxPž 1¸Uoc.V«Rú]#gxq9=þúûMŒ²«ôw!ÑîAhÅ€ß%FtC„Ò#zN?˜ÕßÍà8H®¿»>‡Ñ½Ð…BJ[DK5|!=Íæä÷¢CeùH¼ù‘Ïq,™E²"«h9fót“ “mO1ObκNŒÕ­ 6R6 %èÅVã4üåÎNŒƒF%²‘¯ä{ÕmRiGõ.HÖ¶]£÷Z°ÊÏ¿ÝÞù᜺Rv:$¦ùô§¥Lñ=üå;]¶4Pp{€?´‡¶¹wÁÂ(€ô…œù­z¡óÌ+3¦Õ'Ò„‘£8d‘Â., $¼oYö1CFNö,°é~?ð]«\¢Þ|<ÉŠÎ’ÐÚx±Ù|¦~çZÖc>élL£Û~rå`I–Qí—&_nÅî=]Æ`"¯ó»±«½š,Kb†¿H_— Ž–t­³Dœ,‹‡1‘e6ªÖ€Æ‰¥|?± €jFÌ£ vÔK”K1µŸŽÍÏOÃ꽋xá°>úZ¦#‡¹g›}‰óxOißKÊ«ÇÊûãq-ã箫 ÖOº¢‚Ïì¡dEuk®ÐÊ“ç\D» 8üØr3|"ç×öþí¥‘èÌ9^7àú8e,¼QÀi] ÝÛöt~w-sN£ì;'ŽZõZ¦ƒçnÆY iˆá5ÕöL¤CA\“³ƒèw”*BRq.€8ë<†È(FNö;›£U:P¬s¢¤mšmíVmC'jØ—S&ƒ”^¨Æ²Eâ)wÖÐÁû¼¡óU·³‚)ø8rÏô©ý‡ûS-½‰î¤qž])¶ŸW+bšž§èÄ}êÑy”1ýÜ& u „Ô ™À?e‰ÍµÖåÝÌÇeê̈lt\uÌ'?¯ÔÜý-•!ýâ³ÜeU±D]P·«tÞ˜%¸lÏyþoì%¤Õ Ñ~ÿlË£„2SÄŠ· @Ø4§PÆxyÌÏ‚åÀ>9Ï#øG‡8í oºS߃$‚\Û]Uêüµå,z½pdœ®/±r^[|CŽ]sβ7²ëEPD<ÒzŸb W·Kóï—ª)0)BÞ x§Ø#qҹѾôèã.·wE”8Èp‚ùÁZ×6ò£›ÁZ©émµ]{4Fõ§Ð’ï)Éø©z¿ù…>´jÀç<ž»ƒý¬»»#Ð ûWé7ϸut F…S´7'K™™P ypA°ù‘"‚ñò;½ÅCoðñ?ÄPð+œˆl‰XóJ*%ÆE•ÅÞ^¬"~…ª)'¹r¦«¾Š{oä¾(‡*8•’»èHt@ÅšB³òÝ¡k,aY¹cæ™ìÛ<ïÒ âg×s} / >6[?6©Ý!ÎA–ÿxÌÒâ­íTèЉ´ ØýçÎÅŽùy°•Ñpˆq±’JÊ&#›ë¡œ9¸Xw1‰ W‰­t©#bÕ‰äU§ð :8I'w‡Hn.š¢ïoáð™}.€]ŠxË$W¬Dˆý¤™ÍrÃns{ GÝЬ í\hÌò¼Ñ AÕt8° µÜ\ø±ÏO.Þé) }yS|záxÎ/{ÆAýþx¸ÓKSPb“¬„ósgÍñ[Å¿œ™&ÁÑGº€¨3™Œ¨f‹€ ?JÀ|, Ù›1 ÈÿI3æ>­!•:1÷œâÆ.é£i짰푞ü’å?ù wÄ£,ïWŸ–Á¥jB%騑¾ÔY}öËM‰ü`HîûîC©ôÀç'Mfúœi+ dŒDžñüT#¡×{g¸X±!æŠH‰=Î!¢~/ YÃÞ²? «ÊU<Ög;1º~‹„]ìü+¹1°¢–d ¤6=‡† ëZ(€Øð+× I;‰f熴¹qÄñÕ4ñÓÈe-n>ž§H1PÎð}!æQëu6u¨ÞÊ+Ô·K­\îæ<îxVWfÞáÞ²­aa”Q†æí€Û·8µV¶Q.äÁ=[Ýý‡ÊWçJ­k¼8°„‰dùÙõkLBÆT†S}¡MKª´û¿ëôpº¦~,ú×úÓq`Û/g° L(Ò&K2KCž›u@4±Çì¾…s+|äI¹h+v::žpÚº§Z8|£ŒtW~†"˜Ñ>ÿWy=bûnå_ã6Q=†ë2ÚQIhš0›ÀÏlŒËVSàŽ•«4ä?[á<„À@Dk_óPLw©ÈRrRµç²QÇ*ßć¸7Á’ѪrªÃòE|ožÁö‰¿w›QíƒíÒ)P]ûzX»xÃåŶS5ëõ‡wWöbÆ3½i)¨åwè@ Ýý6/†¢3Œ¿ ïFw$Ê ©©åLb5ËÈ› jÍÔU!Ê2 +ÇÙ…¿3ÐÄNÐÓËÇV^2ü5wcEÓ¢J'þÓ¾Û–.e·‚Ê”Zº¨ùO´éLüZ}ÑÈÅr<•HŠ&.\5EUj .¿„Bs—.¬¾+™ûŸÄu:gGL«ëS‡ë è|Ô×=Û{0LÞI‹u϶ñÀž£À(úÞ~©W^t Á[AË_ÒƒÙ‰;|£á½Zøñ­ì&˜¾øj/ÑG¸ãseé[Á—´#a·¨ËXtVêE˜­@"ÇÔl¿¾úP “0{“€ã̤12´ÃèŸ1Šñ´Ì;%ò æ?ð¦Ó_3î™/ž}ì甞ýÉüFuöåèžödV êÖÁ+Qo ’š–,±L+ŠÉïˆÆyú#©ŸÀæÇYJžÕ.T^‚w|Xøªɼ°@–ï­þ=×òýp2’ÍôºñìŸ4U¸ ‡ÎšÈa¤¶qÿ+œì‚™"_¹¼½‘í­O›ÆB†wcÄ +,&¯hÅ™ì”s:Qò_Zê\ESZ¢¡jd7²âÀžðT¥ñÝéþƒ§^””ä°‘ÞÄçrÙÜžKC}ÎãC#£”KS8È´¿8)‡ªÚ~®HÃ=¢Ñ Æ“ç§GËˤwÖ-Æê‹ÖA'HŠ= +»#í•MÐ._¼QJdš¶;£•Ýué…SÄúoûÀ¥˜’°zUŽFpÎó!Å$OçùÂe‘°™&4=úV@É•¤x0†å|l9_7À^@M!õ¶£äÉ⌣Öç,³É›º,|Ï~u¹S”î†ãè‰ÐuTàþxÝ×:‘4)¦ÇûFªŽŠlŒ¸®¦³ ¼ ‡’º‚ÛSv'/fÍ•5™M4‡‡‹ÈŠTH…f­0¯FF¼¡‚?TëÏe–ÔÚÌÑ®×N.Ó€ó¦o¾pù„4e”Xö{d®âæ1qœˆ{$4¶uœ£j™S°ÃÂþjôj~O#KWõ¦g,~kQnw¥¤ ˜p£Ç Ð-Ö¤ÖÑ…oŠæ ’Vµ0ÉU’¼ð´Øß«=3‰cOãuÙÆä }¶™¦ß/éBòÇÎÓ0PiÛTtÿ@BMM±EêÜG-F†>춤–á(½UR)EÖ“B ÒÚ0O뀞¾­Sé¦Ûÿ)ðF­BA”–èò°ˆ×uVóóÔWŒOa¨Ï«ïRúp]¦ƒÍ…ôÌ )¤ï¯+(q±RÞ "n*¹s ¨ý“ˆÁïçù8ëtÁ w‹Ïl¼VîØ#,å$çócÌUò;­Ü¤(>ç‡Í–^ ôÝn'Þc"MÔ;akBNtù€þX›ÂæfŶÎÍt±àÂÓT}ˆ¼â‹' 3EY|¤¡!0/f°?‘&¾ÄU ¼É£YÞ4.roãvä”r®ÞµdÒÚ%;È ˆÍöáþ!/Uj# `Œn-ôZIÂ×XŽaѳßšZ–Ñ"8ê¯õq¦ôÊȦ7‚Œ.Ri‚œA›ÄDcþÀ”²2:n~7ÎÈHP{ø¾|øNÂÉßæÁyQ°ý‘VèÊ‹òº¨z®>“ۨ„p˜g€Ämy¬…#À–F=~j9›È ¹ÏåçÕºÀåœØPNYb9°ú›ƒ+°{prF,ž§k™Ppà0&³©z‡é—¬— .¨E;6D÷ÔÐ #Уv€Äˆ"î ÆDM¡%q+‰Êrmk7eBßÖË,¥–ð’TG#SSÐâ“}”H{s‰•Û)Œ‘ŸéYJ¦Û·Z}UûÏÍ2Ý,Ýu¨ÆM¬ìF„Ù!d¡³ƒ‚"(‘Ÿ JCøX¬àðâ„— M@p x¿8fø3UäOêl<òß/à·Ä€ýÁ”ÔºøbýD# MMÙª3¥‘jWD±RÒLÀ“O-Œh§}`>mà^ ÒKxÇÚNÏå‹ðV´,ó銋5†²ö ÌÊlßÇÏF3ÌÄ2,1P*6Ϩ?Ê‘‘PJt«©v2Õ}ÿtÄ™«†ÚwpGMTóòÑi"nm L jÝ-vfñVEÍL«×:IlS£p¡?lë5>¢´èúå°VG£×S!Œ<}GÑlü”ÌŽU )‘£a#ó‡&_èQTvÀ³`TÉ Œµ˜ÿsÁ$®_ƒ~rLîÓe€m"@ †rÐ?Dˆ³|é½ÐçAn.Nñk’¤ z].…ìk ܆³êrÄžØP‰vªÔœÇ:>þü¾:gaÄÍ3šæž\//(%Ûjf)AkW'_ˆÍ(1`Z/+°Mˬõ¾Î5½ˆ+ àä‘[msëX3î3×åŸrÝ Í\{ûÑ z‡‡Sxlƒ³ÞÑø!½ù:È BL¡\ùeïv£ ¬biøÎ_ïÃÁÐâ´lM€Q£aÉ)n†Oݪª×r"Ùd­SOt€,ëkñ‘ùqÖB߃^NüšÖlô~XÀMnIp»ÂM‰:¯(„~Ks=°ìÃdFní)wk ËTæ–•ïØÔsm^@ñsV$;1&%!ôж=X6Ë0ç™Á±Û|W*$sY·7߆¼¤ÅîÞ)1W áfÎjwÏHg›¡þ4khÚ±ec-hþNÀOasª‰¡æûWØs~”ªÔ4±d5³«Ê%Ðal¸–y .“ôÅìØ1ë¿â…#Íê“q8¡}Ƶ㛲Ûh—†¹ù1>N½jªÿK/QÛQ×­¢:œ£ùÛMeGÃ0PÓª±õõz” ç§×ðë*´ÔÔ¿}Y¦z0Šè,óm¡$༲™’ó\¶Á±‹ð‡m ý3Î=Vé>;jMÊ×Þðk–Û7GÈ´».Û׃j„ƒ*Æ`òÀ‘…öÛ@eì>ðNعZô¶- ²+ûë/‚xXðž+.Bˉ8'M÷®‡3o¿ ¨¤âžJÝmæ9x\höý"4¤û"è{RÆåþW²Û —çºa-;A÷ÙÈ#ò7iVÉ4ƒGÍåAmp$Á³Ú9š‰ÇHÒ<˜’j½ Z›…¬fœÇ<²&ümà«( /u¬èZæZvaùªœ„ÜšÁ¥›¶ÑºD™ZK}lˆkÜBÝäu/Ø2#IOkæg@YÊ›ÌúÔÇ/¶ÛØä[èhkr'iЩçÅò‚ žÊO#Hémù-¾É“ ¬d®m"7LÃÖš{Œ¤¸´6¿@Òöj‘̲àÄjHéMŸ<ÕsWOä%¥T…ìRªžeU)†\Žü`ÜH~BØ<„{â†Z¨wîUµ¾pôqÜÐíèa§nÓÚ²¸äY¢qV) ¼ZoÏ_„š5v˜½ËÄŸ™­¬!ñ’É<:@¸e›€“í• ¾²y›#ý,ψ;)êQ=5›nABÚ›¥…‚7EEIUr‘[sŒ§/P8¢wÛ*ÁÎ%³ríW«r„®udœw«ÂÊÖ·ÿ4ŽžsUcã/úh£!ÌKLrþŸÅÅÛßšHøåc¸<°fú¼úÑ ¬y<„ºO¢ßÒפý…œ& pþ[ç|ØÐ¹ªÕ¸æP*¼›5 1Õéï| ºÑ—+‡J?¦U‘Þ³f¹@¡8Â\¾ ׌€$éó)žÒ–Ÿlã—,ò­ä¯Œn'ºÙ;2÷[eÅòîÅn€ªäu†+ˆL€sÍŽ©¤ËŸN-hVl,4˜g ³ÅÙQýŠÏi•ÔŽÔñ ¾t¾{›­­©ï˜¯ûÊó2Ýùì›ZožÐ߈sqL _­ÏÄ>tÀæo"k qâðó½ü@íæš¢ik­c†‹9sêÒÿ©ú%Ÿyawr›xQpá8a—De·=%&Mñ”>Ñ/|‹ý¹ñKà®õqÚcùÀjΟÓÛœ<¹Š7T¤°IÆž 2@€£ÐÊ®OƒüM›œÑ Šè`$nŽgÌÔXmðBEòÔ3°–×G0Oµ‹Âð@(`,m¯‹þ‹¹sÁ¨À ´]´ïGY$«+œÈŸ¡Œû+|ÚÕ2e)Ô']ÑþÓ|—–+ÞÇÏàÖ±,î‘F>˜@+yH6¿,N£çÞX­[A;bL7÷Þ€þâ§$Æ’¬Ô¾gsŠOþŽ‹µÆ»)ýïác"ÿY•3ÆÕoZIïeG}¯Œ¤a±Ì nýϬÞ¯ÑçheU,¤”›œÈ\¨©8©¶G·s.{ù“ ÛŠ-/8Â^†š…{ñÜ`yð&Ï~³KPÖ"œ¿zÎ ¼3¶q´F€°ûÚ‘¹ùŽ^[YmkbO¢È3g«¬¿Àuœ¹7˜AäŒÌ’=ô®em§_};SLÅâÄÚ±Î(0÷߂Լ3’îø¤O´º¸¸»›)æ%È ·´ðîCôÄkT?Ù™+¬¹eP£ò®ìwid5Åy‰¿P(Ç•€ÈäH·4 ‹Œàúd0 1ÌAú2Žf}Âe2öhb9˜=Ó+:’#Ùsi½³íñaýÙn¼ž>pðíçªóÅÊ ,¯Æ\”ržöÉN–Íø‰îÆæ'¦7c²â÷wJ;¹&Ä.t#£ä­gP@Y ö^H~§cñZä¹ {;#KµòTx.µö¾uÓê»ç9‹ ’u97[Ÿ‡Ù7jø²3Mþ¦ˆÝß¡¾Ÿ†;.™Y¨{7Z ”O¥mYí*G¨¹Nt(r' fìK ç¦Ï;|•ª ƒÕØ#¹;Ê$4Vð†Hx6"%Oñ¿ÞúR_• +š§ÁþŸ¥Ô<ÂW7V§eg—UŠeˆ€•RðEæ+3_ ü, N[„x‹¸1î§¿’„ ;B«y6êj>KïuH’Üg">uÌŽ_ÓÈ€’“°œø·¬<Ö˜aANC¤i(šžœ¨’H¾Þ6aÈŠgÅó_ÑÛ‚C+ÂP®Îlp¢›9P"o8Õ¶¡Ý!‘uËÍÜ2WÏ”öùñç!¦o"e¬R+ž X͸v1ÖZ¯×¦ēԼ,s͞޶E¬l“Vò3vFrnÀt‚'¢ñßµåԥ̃ZE Äb³–åïPͽöIu= ¿•9缌<Å(›Ø©\©öFV‚ä?¼véš©½ÈýdÝ~õZý)û…:ð©e‰Ï &sæ°Ün%¸«ä"ãBø²ãýCC}º1Ò—-¸¹3KÅdOF‰Eß¿µžüž3¨G_uRQçÍ*"Œ\ÞŒÞl= ñ@üÎi…¦˜ä)ç›AQJ|*^õ´;ê.„“,îo ë½IOZ¥…x£+hQg ö[[EBþ{Ãpyþ?wù‡KÔ‰CÃŽÊPâ†fY§#ÇAå7÷©¦L±ìÂ)²‚@OÇ¿’¹Z^ˆ]cëZJ›¬9/ûó!Dà{v–׬Âÿ-á¶”…ô¬‹F±–k× õnßµ^›âm“ Ò¥KÌBF>Ú,cW2óôF¿Ã)\,€ó|f4`&l+’ƒÕ¢D Ð*& ö4¦©¢)„¯ÁÔÊ€²É¨ªUtÅ0_Ìë`³|-ÊPÃU~‘zW×iØäïˆtúáœgÜîÔ~¸OбÓy¹€„ªfÖ¿?b‹Dk¯G’“âo½ìÇ[}&ä8XVÖ±ÔP)f†Š;XõW$àÚ†/·ÜTö'ÙlÍ£¦à®´+«ÒRŒ¿œ("Ñc¸LÕ}óõCj]¾;¡òE údÙû#´+lꤑf¿¡C¡ÕZï¨ßòKÓ†¹F„hi±_¹£ÉÄ•)hª LkÒU:®'cKeh;Š5äÂáW_"2£ü§°é]­X9.½‹è…ˆ+R{¤hi6Ȥd1ØuâjîëÐLÐñûyV`±+ jVaÃmNÞñ'jã[X  ô‡4%p(Ëz1ÓÖÐNÏŸUÄwر\58ƒ–¥Ȭ'iÍ0RÛ{Ñ~ÊÄÝÊü§îø¦Èªy> Œg~‘YÅZÄÐc6Ír/îv+¥øzéG½wöh ŸÞeÚï'sQ6C%GDKe†´ ´Ñ9³M©l6@KôxÒuôh 뮵§¶bwÊõ:’AÂêÎK} ©'\Ë/˜TcÔW7<’U†ä023ÎûjÞÉuOIúð/Ó0O¯;%oût®ŸÝ"8ò\õHñe¯GW<»€ùK#U›ÕBºåjÍjF $HëÎëyöþІ¸cr€¹¥Ó” ?PEü^/iõ¿8í™8œ±ˆ`Æ*Sê…sö´Ã"—A{Öˆ"û·G‰\ÂGÑ_X[8·JÆ€^P?ºJCù*6c¢2ƒCRÊ B4@²ôCpá¼²ÔHj]ÂOÕ#¼u(uε³OEÉs.`É‘ïŸju‚¤?г˜ç<™Zc—ÖÜ”êà8nÊü‘2ëc¯eî£?xŽ"~6)xÄX/îï›uši#,ròm¾„ìÏÛ±SŸ»FeÈeÒ=ÙŒ£èðm| åLwê?`S1š©~×@M§’1žºïOUÕSÏG”›Gu§l«Ë7û$Îk´$ כܞö^–U÷ýb§P¹çY;À³u†vkpJY•JÔå± €×–ìfVÔì(ÐG¸HÏË"œd²E\òÞ#†qw]ØX´‰íDáLD’Vÿ°j¦B¢·h °÷Tíd$—%i\¬ŠHû‰}÷o0œ®6 cB#Ø¿wSþ;eBÒoäûÍoÅ÷ÃÕmìBh|AgOx±ßòF¯1ñÅ-‹ªÁ Ÿ™ykK²~ÄMÃG†ÄÙLwJÚL ãÿ‡Hì_îróbÀ™”^hõx'™¤K¶?ë/¡Ü7|¸D”bIˆuQÈ^'ü¥i+²ƒ\‚Œ–J£øÉzZ÷Ƌݮ]ÝÕ†³Ké¹m,•º ¢T+oMé¤\ôÉ4®p»ùáÓ׿¶/ï>ºZVÛæÆrÇð¤ùŸÆŽf6Æ¥)±LqÞ–ü¹3<ºmK#÷>9,aRç‚ X ² %Ì{Æ/f¶¨(Þ9ƒ†’u‰ôq—…=Ò+¶-äã¿‘ª]„œ;l‚fO •3·tP€.0îp–Fê|Nð±¡P,úù9þ£Ùñ„ Ut.mMð9ÊøÂ±õpl~ô1´Ò5uqœ½±þ̹9§1‹’G‰6ÏÝè_¬F^ˆK±IîaGÓv™s4 ·Ñ'8¯„‡( ñ?ýHU¿Hù¢= Ë”A}¥lâSë))­ ÓåÊ*+u¶è«[z/!/"XÕÆÖÞ’¢ó±¹ÑB]>ä?òJŸ÷u¦1Óˆ_M”U]2¬›Ä¼îý̰iîP‘id¦éply‚¥xæZÅôtjï9„ <[â¹É»ý¤·Ërš¶Ò–Ô@~…¦•ÒØ‰F‰ãƒãc8·; žläp ¨®0í^8°sšEL[S@õãxzÛw®[Êî?ö¶¶ê6ðåúÄóÞ.ì!³æ ={HñÙà½0(Žã»³ÌÂÀ+@ðË…n܆3pÂ)éê9øîîp 2³ãöÏy ÇÑò0k‘‚ÿ31 ¾…7)}gpOø¦5Œ3õ*ˆQ5ñt㹋ì1¤5O¥m”5¿Á^p&;ve{Ú¾¬ÇIÆþU$œg’mŠshÇ[LSL­aùÈžøKÜÉøDÉê×rkQÜ´ ô!©Œq€o…±»ýŠôøÜx›·0(K„¨8 Ò±„Y-{³“ˆ¬|s1CbÿF„p™¦|z4•¤ÝaÒNöÂÛ±C¸ÞIÎüþÚÆŒßê;¤)î¦×%z0Š@“ÂÂ%$À™7>ÖÆ¿ÊĆ7Hœks”ÅÎ( ¤EQ(0ÈCWù«¥ûÇŽa…€'ø•9&ô˜‹Fvc2$ñcN?û È»ÃËŠ¿³-…ˆJÕVÆV,õ@ƒEtë\#þ‡MõQð©¶8Oj£úG¹‚K&Žx;ù§(ÈP'©NyàþB$šf¶Sr}}K–&ì²þZü)û¦Hâw³Å‹6Îd®—ʲÚã“j¾/ýé‡Ë,lã¼þz¼ÑÀ0”y®²NÙPÊS¦w_c$"­WEàŽ0ŽÊ±æÉûAä“·,öìIŒ&'5·4eWáÇ9‚|E%¡„ ô±÷ ô ª:/‚E=½ÅO";à$eÕ£0åa·ôl5­n¯áÉ$º¢øDtÌ©’¾K ˜¤UŽž¹$Y@qá¨&쩪•ÌWùm‡Eø‰]§ 3é‘3¢Yí:¡#=žÿ xw®Í‡#S·Ñzäˆ(ˆJ–ˤä9ѨC‡î£'ç–Ø_cd5ÒæìÆ«”-BRb!?I¥b©ÎõB”ÈÊb|ˆìÅN[ÙeÙ¼»w7{ÅÔ ykHן€_Ë©6Àvf~eÖµèòˆL^êÿ? ýNǧI³íÔ×›Ð>šþ")tèÙïÔâ[-—>üÈ 3ÍôY&9IxMâhÅÖHŽ6CöJ}¦×`*µwìZ|ô9¼¾ƒª?·9,ˆ Ä÷l*¯ 0ãó,ª¢6?Yâž¿…]’m?`„ Ј!—‘Žÿ~¯*±Ò2í*¹`ÑOÞÜôƒ¼¡õ(w6÷!?4½ÜjDpe36O#¾Ê\´hb3¥.5•OF@ܾB0ØfÉe¿óª“bÌÄÆÓ%Õ8¡Q K#lo2Ö˜3RÓß«p HQý¢EåÇï’²ï"§|…Ð |û¬hèa e¦›¦_4P>ïjÁ9³e¨ä ÿZ_Î8ý €¡ø3%‘ï—\+™9 ÂóÖK—b¤ÑÇRêj«ßf%nn #Ä·ËÜÑúâ âWÜSd m‡9_æ§G`ˆs[¶bÌæ™@š”õŸ¦_'Ì™ù†õ2LõY.ø)jATF(ª0o>Ew“@ãÇEÊæB³ÊÇý¼w6˜Þ‚ašzÅ}ãþ7>¸ƒÉâÓƒ9ì Âð¹»!{¿ßz:ïµ—­ÒCœpuCî{èÚÏ/o™tþëôö´å&?‡¤áÁ·aÂŒÁ|9]=—•.Ôñ‰lyÏ.ñ6‘ˆ]¼ÍxÕP æZL«Ëºg„O™. :Œ•mv w4©*÷|E«vvXpÆOL£¸R0ÃtùIœJ*ÓŽàÞI]”MOñ¯›°mQ®Cü.cHÕÍÐm}M¤ßð8aRsfüÅó‰¿ÆÝ7òxÐ7¡+ÅJs r5¯kG«$Ú ¯ŸqgÓÕ`þbÊj”4ÁúR®Ҟgy²Bû~ ŸP ÀÐë‹!Ë=¯¡^ób„‰ø3'¦úð:ïžP˜SuN¦¬3ÏÎø÷ˆè¢Wk'Eå¥á—Qþqle ®”;_¡Md“û8;«ÔÄ‘_Ï€ª¼ð*5~‚w ¯YåÅÆH™fåšt€ñ³i Z_%Ž4^…_s-Ö¸ÁÍCÈðd2lÞ;n¡,·®-_”}ªNTtÌN­ ‹_¿”ýw>‘.‹¥o§½Bâ?7ËfÆÅ …#Z'J᎞i„lilF2’¨Øã°{„O¡'Bm´[‡ãÞýÍJµl•ûNƒ3 f `Cã.cåÚ‡K6q:Q½°†M¦ýf À?D¿Þ-Ó€·HäŽÚ )6¢†pŠ8{ÿ‹ ÿKDý#¤:ܨ·¹Š€“wÙâA”ßgºÍp/<>æJÖšÞoIª%Wí-Ák˜ÅPWÒ×kq0ê\̼Ê/DiÀ¿ë¯ôá9çkŒXà[w&pM*ø}»òÍÜé,´˜Ûf$ã”×}vI¢¸î]*0ŠÒ-;3/ÕÃ:W¸Y¡õ\¦ì²#EÂêãâªEä{ÖÅ.ŠptHéÊV=¿%Q\ÄhëèDæ¹dÛs|³†æf(ÍXÒÍó‘O*çbJÁ÷Sr…¬ép’`‘f¼B:ÞÞvÙñc¤ƒŽÀ™ÉÙ&¦Úþ&ù$»Ú”1sf%F H Å(Áy°óËgFíN;%æ¨]Þ‹âq…¥¡Í5#ë]è›Ì“ üŸIcƒÒ鮽…•Ò„|JjIq¹±Ú²ˆM‚¦ëWýêñ²DhkY$H©豈Y)ñªÄ,iA1=(<×þ÷Žû‹u÷œ¨¿yɤJìð?z@9‡ÐÁoxa¡ ÈPõ%zn ²ÊVaO¾c”‡¦Âc#2`&F{M!£×WÝöV])\¬ïÇ d"I\4%»MfxD èc¹£_üóøÉd>E” øCD@ !× "ÔWÉK~²`áêÛ×oÑy‹&¹ÒïêWG±xßqÃ8Œ²‰ÂÀÁ ÃrZ¹‚#¬”.æ”8…,[F4lím*QõšðŠ×&[ç1º ™áÈ(µ8T›^¢è»$LaN|ËP —ˆT’G[îƒ:ÏÒù;žǧ‚p°ð5™Î!T‹ÞPH)\Œ(‚œÛ…¸¡k"Û#Špr|º ‹ç¿ì¥þ—™”D`ÊdéÔêÐz~¡Õ©hFÀšÂÝÐ._ÏÍWE”6#ßÜQ¶ÂGŒ½Ã.[rG}"â*¬g%j‘ÇFθÓ‰ÇnŸ°°ñÝVÊòß.¶Y‡õAÐ’øÂ$¼wž/⸑=ú…„ßð:ÃiË´v¿Á>âLÄ'D‰/Èílð¨ËÚNýV´/zBƒnI$’FÇÓ#Ïg¶¼Þº,Ö#rŠýšÜ¨ n8¡¬ïmj§7æ^sí `ÿ`õ°3÷¬R»êÌ­§ˆÀâò‘û/»’%ûÝ šÃÕÞíÎ]^äH¤?®¹YœŸ‘)>ýõ*ÈH²OüA\é$Œ÷> T?!ùº-F}5ç$G~PæTZd¤\-Fw”.ä å³üÛŠ+[”5¹Äÿ m‰’Ãé}búÕPw’þ= ž’í÷įʻá^^Êá)*Í´Å)M£TÆJÔ†!Æ_DÃÑšímÐøÿq02^#ÒÛ)¹gcœTÕosŽkšJ¤KÈ”Iâ-]fžDâþ0gòÑþ*—;¾ô”˜,v³ò*ìlª¾:ð¨+MU…ËÀdáÐÏì°¸ü¿Væ“>3Ò†‡óJl©ËlhJ†\–A1†ß\ÁªÿI§O>O­4O»#«Ðȶî~¥—΂««\ìKcËŽU—Ï›»”૪DɼÑN¬®ïÊ´ ¼ll_ý1žu …[üdy“HSÎ%º,ì¥eMßÅó‘;zT–\û§’ŒÏÝF ªO È ³‰cè*U²ç³[ÝñÁ¥ñ'9l()Ïc-´ÏšÄ(Ù'-áÜv‹ý¼èùÖâÁá€tC´n±’×û#„¤ë`<¸àœ“G›j€}õÍ‹;gÿeaÃôòyð›v·Kn®!5ôÅ`ôEXµû=3/¨Û;S²òÕÞâ^°ºBÃFfå{ñÁK^L-MYú濫9ƒÅ!ƒêe†®~ÞB¿¼oRâ`å¶•ä­¿…š7iá‘ßð{}¿QõvRQ€æS9pØCrœaè-ÓFào“QK9<‡Íÿ è`â{ݽ7*¶´+‹û 2‰–q…̈v !yAG|‰Åüj¢‹uÌÊ™2±‰„7¯#y@ä¬ên…®µ7»vÛ¹›^.EìÍ” úÿln‚m‰›´º 耓Rˆ |ù&|~ûFgtŸ&õ¯Ûã~‹ïí˜-)ëÂJ0·‘þz;yû>$ÔÏ`¶ XúÊ‘ÑÜG„¹TÅ<Àw}jè-UlÇR¶N]mt€èwâàp3„ ÊŽ²¿Å µ9þ|sÿ);6‚úÕ¹°Îõ¨ŠÉá<ë:2>=,l*SP£k‹…N±l¨ƒ¥ÉT¼0ÒÈðÉÇJºM@»35Åj™þó‰–‰øXÏ,ÇÑAl²±Û8ÿ;›®ª1ójÿ(zÄ/·ž²˜M!Çäõ䨕@á“Ñ΋":çë˜g?¢V¾ÛeLú×k÷ê!ŸÑ=vecÇ)‰xLÄ7J†ýw±±†æ}Dóé’.lIvUï)5T-â â—Ý ®A=.´«7pÜ^Ë‚ w`»íOñ=M¸Íó‚ÿH?¨HÏe^©‡ÊŠô†ˆ)ñ Ñ eMн¼ø-ÁÐúû¹ÀÌOr/0‘Hµr<=&úöôË÷*ð:ûí;icº w£'ð³R+R¬e'ûvÅYÿ,~Vêâ6õXiÁm„-ì÷@Fåõ¤JM!Û‹ ;¼Cn»ñDó¼f2,€/…X+•R:‚•pôn¬¿!bá¯?›à£éYB‹8³^m_ ûB]¨Aý¥-s+¥gÂ9µÃâ _ÚïÒ¬ T·:ø®¬NfÝxüÄþciͬ›wÃsȾüNû°"÷cïN–¬O]Hÿ3ž"’Sq[æ;£ª7Eñ³D×½¨¢!=ÆP UÄs©§Ô»ï™uƒIBn±¶ÇL·o0æÓضæõH@=†™„E –i3§0· ¥¿ãŒM覕R½èÉ@n%ïG¤{ÀÑoî&ét×ÿIê©C.ÉöÆÔž½ûwb)ZÓäñMȤfZ1߇Dõrq„‘¤Íb6‰“Tߌ,¡R†‘ªèØqë2vSWyS¨À¥'(……¥P'bŸý“)$ˆ(¼Ø¹ÅîüœªZÚú¨½¥ÊƒŽgI %Ø=_ZZŽ™°’­‡ö¸7 ¹±Þ¿5*ƒûàà” h±MšqëÎ?ÓYŸÅ"ϵ=JIQW}ÆÔ䱚X³d‹|CÉÅ”{õ7 ƒdë[ÊŠÐ p›¸£YKÉÇå½.}Ò¢òÑì;aÿ%… ’o“Q,8©XŽ+ˆ¿Ü2×Àåæª¹ÐRö„±:¿v÷“DÂQ#íÍa®,%ê—®:éÑ&ÜWŸ…°ßûD,Œ£ ?“g~â ü°•vüõØ{àfðmŠ€=(½º¥LpJù³ðÀ]߯¡™ ¯ëïô …±^2uh­ÅÃïƒfÈâÑèÃÞOn#kÈO*¬¡V>ñNo9{µ…Ïtr-‚ %Ÿ'W~QÜuÞ€œ …z¼˜Ì¨¡(ÜGy?¥Ÿ tÓ \‰q}nã‹^¢ÍN¤ýñUyQŒ7Ï»ù§©ùHÀÎfý$Y0 ¾Jí _×{ •)“¹£¿L·0Qˆ“™fÓàÖjˆƒiž2þĸ«•ë¿–Ú£j¶î²_±Ñ]h‡úz:µ¹‹u fƒ¥Þ)­D“#Ù¼ãuJ;™½ˆÝ­%fþá/ÃBi‰ÈMí6zéë ¸†„Ó •MÓ|Ò"c [ÏÃSJ’^¸7g‰M1"À…Är¸–Õ×È5½q/WçV6I™LÛ^Ž c©æú ük•öµ·{Î0S{œÖ| ìÞ°8¦Ï$°#½f½wz=gµž&B¬d­”àaËÐñƒíá¢ÚK5àó-ð Ýj¼}¥«lóbN³³g±ñÔù´jO©³¿©ƒc¥Òp䥑ªËé"}¡Óu ÷U©&4Âmâq‚¹>½‚p£½ÄL’Gõn«§]±dC²&{6Æ4+C– ¤Ô>Å5›Fu†"-Q`G @§è«°î±Á„#6ƒ|&›ÔrÆXÏ'> 9ÒrÐDÚÙLÊVº7=Œ’;ÁâùÏÈžˆëD>jr¦X©\}V‘%·(,úx~hì˜òª,U~Esª ¥^>ÆÈ2;êŽuÇ hµm[;]‚¯¬‰Õ’K0,²ÃRC1wx׿?IÖmE 0ÖrjÚ¯MÜñ V¯@|ðiìþrC$ÿºï“Ú8¿äS(ïêÕÇÔ»WÌíâž÷Ô CNoÑ5ʘÍ0÷rËñ2Ǽ„‹&Yæk4„ 3„÷}ì0fçïÒ`èÉ]*ÇQ ±!~—Ü‹Óï-:ÌŸÄÔ'« bûðþ|9ÜVÒd€‡BÒ2ʵa7˜ZÑý;Šk’¿·$~d7‹¯ˆh‘\§¤_ß’Å)_ÜMõ¹ºÐ«1G~}m+Tî’M×Õ OÔwk¨`ÅùOkê}`”ð&ËÖì…"ƒé¡^Ûç!R+Î,±ªÁVêôî1–r‹>E G†P¤EÊ/¡3ér›$©"Oþ;üGËbÙŰCôÃ:´Ÿ¤hUè¥1ò‿ä|¸{êöÚ§KSB nŒyG™€¥%5{‰Üz‘¹ÉëOÕ*¬ÝÜtÍÊ׳²}/õ†¤–Ô>‰‹gº© ‚rÛjkVðÈGÿC™ñ]£æém‡ðLmí Ò‘D¹ªÝ,…4Çãb¾ÖðN¶ ÕÇëÂÕô ôŒ5…õ4!h÷¡¬·clÖR¶µ:Hsými8²sZSßHù†pšç • 0•}rþnì°#Q§èü~¸¬{Äÿ-3H—<Ê mp­º€j/-¾qÀ÷͹=¡fŸeÇbš¦æ/ê.áS-rU 4 lÚyIJy¤ÔÊGŠÖÉÓLú8Î{„£¾îøÅ!Ë©¢f­…}Ð…f!m¶¿? §oAÊ’ƒå×0'‹Èk §³l"µþà• \Ì”ÆõØÝ¥}Æe®í-±÷Û–#m=…ÙIjûèØú†Ó·\xô“Š£·mÈ„ú%™ á§„Çë'ÀBßûÝœðD!èo;17sú©4`‚Æ}ÂxöE¨à–›®ùú¸ràj·ÕH/åe‚ CÌ{°3ÜIÊ\¡s9ù!”‡=ü¥iø“kJ€µ+¿\›Àæm2d˜«æ£´Ýec|~û7ÛYÏý©òv³"ÙC5þ°JÞ&Woxýîÿ׃¥IHÞ¤ª´Ã£ós¬ëº0˜ÙJJ T(Ç Cn{ÁUô=x~U©DãrtŠœÆü¡„90qcÞº$ ¸„¨c+UòÚ7ÜhžIû¶Bªñ5m5ýÛ·ÌŠŒ®Ý™ÑnjóH¿’PMçÝû78?EØ{Pjœ™¶'ÖØ*Úò^ÜXõ÷ÿ Zß©N¾vV„ýå™ó4ªÃ^ÕÖv@,[(àùµô(}´Z^¥RI¤ŽØNàßÇcxª=ÀJCê¿×·”µÁ~˜ºw®` Vµ5÷7YÿY×Gžý³íóEe»dî×@—‚6" ¶ç¦‘ÉVd¼”D|:¬ðdÛ¾Å^¢‰¡óxµOuy»LuÐýœÕÇå¥7 tϘ<Éó)Zbä¡£¤äU"/È“Bóòÿ*Ð?ù7Ç]$to¥³xJc|v_Ê]ÌQhÇÔÑnQŒÅNH"ÇÁKÄs`MÏÛ(ŸÒõˆ¤Sõ¾i¼7óÌßR•“ªe‰n›µ cåÄ_zƒÑÒoI!¼5u î4Ùð åŠæ]ö÷§sO4º»ÔNé§»]àMÂôk&ËWr´ÆûÌ Û¸^m­ÜšÂãï.Ì]h1ê;*ݰ¾ÿ$®™ÅÁìïÜÒh8Òàkúâ± )CKÜA³’u`"x9GGÚßfÊGу³ô0Ä!v0še­þúW×}{O !0tü>ÿ"ª‡-`¢ÝEuv#“D¢$ϳr™`“^÷¼þàæ}e©íȤúñ-5ÿU¢ºZÍZE‰Àiº½Ç%ÀçüXˆXЦmµ³ç|Z–µQ Üi§WÑ$(Äës¿%1Ê6#;ÔÇ 8µÆö‰åÑÿGØ©]íÜ").ÚD½Ü§\ßJ¨ÿ#örnmƒKï5E丱HÎãmjÏ9_3-—žo,¼¯ :¦ûØž†ˆ»v&ŽæÍáC23ç;Y`øñƒÂ+¿d¾h§ù3VåèÄç5¹cÐTNRøµ/ƒõŸ»¢`ºï‚áM ‡~B<0Nj9jŠ¢ûÏ(#­=ºR³Óýê7JžñwBŠ.(çT‚òbS+/ÎyçäB€FòœÏBÄmßä.ÎKA‘©öK[]! è´áÕ® R©Øš¨5y@´h(F»™½ ïÛy¤‚–Ýv§_ƒÓãœM9#>º#YØÈú˜Ð(–3Žr𶮢;¤qåE-AQ;YzýæQnNŒ×7>8ƒŒEÕ”Äw zdì–Ͻ‡µ·ÍéR»Þ±bÃ|9ö$Ä4äòÓšr‚~IÄ ”›¥øcÞÐ?§ç¥­ãáû~qüŠÅQqjS “¸BÙöõ_ÆP. vIŸ§L­µÚTR 5±¾È)¥g&ÏÏøÝñe`40­éûåm´@)sè3~ç¹ÞF r—ÉQ/™ 7äèóJ®Kï"0(m=eý÷@&ú ¢²Þv7Rœm©ò°¥!„w‹=á1^jžt‹˜¿r=—œc};ç<1mð# ñ0ëêù•š}Œ>+ëLB‹æ½Fµ:Â+ ¹3h?ꡟü tªØ~Z4Xß«©¨)Oõ‹÷Ö¬$# PfrŒÙÁ¥Ó3'ÈcOuÿGj(:Ï ¥x›":¹¤á³ƒcõpe eÕ ê¾‹>>’–DxÇt xï _«cU,Üt›5Öù?j¼{ØäÉ„!– Õ Üœ92©è ˆœ~”D ¯R‹Àîyñ<˜çÈ›¶ÃAΪÅÊ·7“í])˜ äÃa…ó)¤¤¼×–ý&o¼MyŽ~oÎöj®‰ÍwW qsŒƒ¡Ì  )!ê5¸±nÊÞ&±|úÍ‘£¦—š›Ü´ú$Û¼*ÚZ(ßÑ$ÔÔ•æµjÙM[W˜8—•QÏ9t‡áåkö–"}ñ²ãDB›|F‹4ŠQU>]¿0ŽÞq§î›~',J£õ `‘ä-!/ðg‚§á‘ÖOü+QêCmÒ"Û6rïh@²s]€“Ú™Ri\Ah3 ±á <£Æ—V„+©ýSD…µ„LL’öA&´mIŸ„¨Ws CóÈ‘nÚíž,É&s13]Æçqp$-ÈÍÌ49yfÆø&šìÐM•ƒ‰u Uã3*æ8UxZ™ßþÍòî’ñk†ô1„Ÿz. ÷6)W‘z7ÛùþÎåOím¢b0„¿þ8ô>ï`Ü…’&Ó,³_?%å^²ø½¢˜Ça¶ï8ØÞ·ü°Õ$Î*aSýìDà³(@ ¶Eú>×2¼äž(à a&”Ú=RæÂmD¯q&\™2 w% ¿¤œÜ`Ã0ôM›AIOœräì̤zwÚ~çÃèÚàr®\˜¨¡Ð„ìd]þ²?Ôp:nÂúsF#bþ+BCzáΖM%Ì@w]§“Ødtjö—íÞ¾ãzÌ•Z¬®ü@:y+øp,rfº´ •!ÄÒ»ûTñåÔÓyŸÒ)QUcTŸíõ‹×m›ƒè`d²™"È›°˜ü™š–‰ÇúÅÐì縭 #1q_®Ód·ExÐô šŒJ‹]8ƒP[wƒY3C1ÞRòjŽš" TN}îÎc‹èþHÔkÁ+™“cÇWêRΣ /ó‰µãQuƒxgÈ7vÅSÚ«c=²%<)©öáBAy6ÒMDáHÆ Ê—զĊò»X(I=í}HáúúR@ꢻŽïƒóªu¨è_1->ßȉ¨ÌÛ„RW¼Á¨Á¡(Ž–ŽS ­tvñÆqðZãÔŠÆuð‰àPÉ(p*=J  ówcÖDˆŠ¹‡ñiwˆõâm»ô0(‚ ÊòkID"QD#°h1€d´\8OÉJE.­dÈú)ÆdÍMð¡þô&>ŸUŸréE[²´\,³kyŽ7„!`§€÷€âÃBž³ƒ©dº&‡¬ì ‰‡Ñó£³!¿…W86óÞH#‘±M`«Ýœ¶îºÈOÁïÅKY”ëîï6ë‰Ä^´zÒä¿ÆmÀB‹~﹓«^hn…ŸV’ÐpBøhñVnŸÌ«Œg0ʆa¡XëÁPl—é²4©Â>¬)JÑf¾­ío±<à7¬‡x ÉþŸVxŃ]üÆr |d(:R‚SÌE>ñITv¯|E?“„ÜS’ä_—U‡„v+*0pKÊ½Ñø „i“Ø‘²Oé'\t"º?‡ȹQ'ó#ÄÞLÇIN²Ú@K°U§ACt¯Pï—¤Æçv¡æ¸GYneL³®<“)š‰R•6$‰Äáñ“ô,zèà¼8pÀÈþ¾Ô°ÞoÎ qP¶gtŸ-BB¾ ƒUˆTpOf¡ôc×ÂÜõåó¿wôro´é7›m4ß]¼Tª«˜=ØÆ¼./4CÇ­Švࢶ@p [CËo3@ÐŽãĬbôò­ñ<éºom•U{Mp®á”§¹>ô†Ò¾ópfEêÁíÀ'ÂÜí?¢G?ÁXhËþ-¾x4 ÔA»`2iVƒÓù–צ©·Žd¸7» eÇdâÀÎG÷4±œ¡ Ù0±nÓ:éZPˆw.èõwÂWQ¶²BÙ=9äº3Õ׬Ò~¿ƒÀº sr‹+BW­ ·FÚF‰™«~ËÔ퇷Ì\²äóW±¥ø8ȇt £§}7VÎwÐÙPŒÁ}¨p÷ÊGñ¯ÇLTv¶ñšøTúZ°0Ìé)SÅLí°0Š’#F Í3ªxçxî›yóyçâ°€îûl39cqôK²®r ^N‹pÊHœ çÍÛf ±Lù¹…{_k »v0ñtÂâEEQsj€ÍBÀ(Ît:Üð%áÔ£% nïÍÅÑxð£%sì(P1šÊ™w’XýŽU8¿Y ø0jc¡³Óˆc Öz6 ST:™ØÕЂF•èqÇQï" {ÀçÇÀùj9Û©À,ð«E^Ÿj×÷`i'Û^2@2ˆÝ®lRxuGŒÀÅí\B«.Umv¤Ä—YAH€È2ˆŒþÁº†RGF¡—ZÙ'™üý(Å#•U}Ðzh3« hÁ“TaÉ5Øâésúi퇀Š}ëýÏ;)pŽ9$°šç°¿•´. ŽË$gš×’:²CÅ‘ž|=ºÕDÀØ~ì n¹as¢» “4Ý1ÏhF–«¥ã©9‘¶8ÎÕ¼K­DÜKæJ8¦˜›ëÜ1Žíc†‰þÑ¥ ÈüÁ ß Ç]ƒ .¸¬\i´!’`C¡¸uÑ»*r[8>Ó15“¾/%мẊ"à=g2üUh© FðDRC·ÿML°Bß> Ïd5jÇ3“á?S!þ£Äæe‹•0 O÷LÀÊŠ¤ÑIô¸ó7A7fG©Ë~Ɖ:õ1W-¯Òðlc½°VóŠb‘Š“5ϲDÐÐ|Fˆ¡¶•¬ŸßL¡½F>Äd†…‚h9Š$FþÅËžoúÂkªTSɦ–Éé˜ôˆvY®¼O MÐþó\Ž k3e‚þ,çÀõ=ü\-´ B?s€-=S<óè D°[{xƒ¢¿Ï ÀC—æWü¯YØ ”0î÷H8¨á‚Öúú÷<§âK‘eÖœ“scúª x¶þúˆµÄ@Z?¥_ã(u^LËõdçÐ\}Ê ¸§0 *:þ"[0l%¢®D™fU÷Mj5ò0n¹Ì¤M­¯*3ð)C`èÑ>¹ìR®6aÁ/¹“C(*é CS©1ZÑþ³@šgXPäO‘cÒ“±éÏ–‹šà䶆ïà¡Û¼1Á'x1ËÓ Š²7áß6Š2îaWÛ@¢¸eºÈìVÒ­x€€ñý¬+»ê³ï©ºú†ÛPoÔ4¿¶ËýN/Ú§ûnþ?µOö‘ÿ[zßS˜¾¤Ùk½ú¿QWí¤¿máÂ~wÑÖ{ê²ÿ5Ä_RT¿µÒ~zrú’?mnŸ]Î_ýÍø>@Î~gâáî &RMu ­â×¥QÎB;=ËíaMµU*N¦¬‡©S^¼—i‹É‹%­7/ÌÃXfê¸C¢`UTÅÜ¥y/DÜ‹¼ï,”$¿=©f?Þ,±(E¿5s4¿Ô-ù¡e!ÀèÖ#>±$›#ÊiÈæefÏF0`iàÛÞ••✠Òùô02ÇÌXic ¿ž/Ü6ÉËž•¸F“ß ‡ºSZ¹srO9Îu!U.£ºWU·ž&ûÉÁ´ô3ô1?•wù"±0pF~oÃvbñ‘É0r¯ˆFÞ¢å7Cæ¼ÇߨÁã`£Þ¼dýV¦v(7<>ÀB¤;_Á1A¢ðeþº{z^'ZM^hJÂ>êaX¬P–ßmç¬e5—Rõ¬ðƒ¼ôŸK›–yÌMBÀ¦Eå’ˆÞÃ$©»ó31Ø_ Ø! ]•h5&’P9†¬r-%^b—½-öæÝ&=ôίüiÆ5B½Yì—G¯Š:);𠍼i¦Ä¡ç4[Fƒ¬;½CŠÌóãɆø€·7Ͳ››¢’©±OÿÉgÂBJN JÙÅÝaÓ5~‘¬{yæù\zéý( ð€ŠÄç¾ ݧjp`·0*]¾ÿek.¸T1)+§{4Æ?~$(Ô)¸ÕzÇU %’“à¢À‚zŠR‰…¥‰³¤jÍ»M~Àù-.‘0–„ÒNž÷ëé–’©±OòãÔ3Ë€°ñ7 $!Q%λS“„ƒ³bÇj‰hx¾œ…kÉØ þ Òm*ë™ô؃•B6¤Pìé¶HBëž/éŒB:ÎFG_çšñ›æS” T³¯ˆIÀÏBuóã½Æúªõu¯Žš±öÎÃ<‹´n÷“µGÆò¡Ý9àO§8ÐpÍcf‹˜á§P>ħç^£ßj{‹˜’$?¬ŒVæÆX.½M‰C°Ñƒd¦Ì{ïýŽ»ƒ|z‹ÞÛká˜ÑâåJ£½æJ®ÿO*$+Ä`–‡‡'°;ç7¢ÈX€› øz”"«¹²þÄ1­hW¬svB­õË9€~šË  ÕÀR($ªh²Qñ¿I«‰jrªa†…¬ÒøÙÄ:GæŸ]UK–ÝÀ1+ƒV‡7Ì>Óž q rŸUóºTÙ­ARÑ!ÏèéAºüc aKªgþ=Ò Û§_É\ºSbÙ‘­$ îbCæ\à€Ú”Fl3•¸L”ŠÅé2¼ÇEÍ(!µ*ÙÝ[_œt‰Ó©¥¹ö¢™<5_Ïcá–éj¶áÚ¿u“^vTà–‡^ìãŬ˜‚¢”*BRcâB  :"Ì[å”UñÙ2)iò=šˆQjá,Il4м0°* qªÏ¹…R)ç*¢–ªìBt}Âò¥Ñª–"ȆW0Sz£•¾Ó$xÕ Ñ~÷ø£ßÀ $%úh˜”/$˜Œ ¦Z~µ”ƵðÖKÔëàMÅlmËw¢Ò/ýP#[ ÷® |/h¢˜lNIØ$ÚÉÎD‹¸¾L_)‡áÈqŽh­=ÖiÔ| áÚXq»ÍºL£è±܆‡¤z{²uA±h©yDp¶áÛGþ}G±Ùó|Èp2{€8GÎyXI<îs‚¬~}LR†‰Ñ«+>Vã|›\Z xÓ˜KcBy±åDÙqzw½š¡fd„Ätô›Ýy§þaØm€Ü3–¤jñ{É\Ô$Å Â+fR|VØóŸsæß<¯‡Þ™Ær‹ø£}E’ÜrÍ›¹):ŸµØíÔgeõ¨Y,š‚ÀÎáó'šï]è¹Êèñƒcg®êÏŒ´<éè{+óþ)‡rÜ‚÷Ú~£Höñ¦\ìVõP¯}ø„ànó÷$ÏY ]AÕ«iY¹³O½²Á·+ý¨ý-õ5õT€ñXÇËwÒ`áÇ›€ueÖ:Ë)dA•6ÔòB×z ù:lmžWÈvohÕýŸš ^iaµíŠ!°{„ƒÑ 3LÞ“Íã=¡¸5ŽÙçê¾eÖfêŒ`Êý¦¡> K²fˆGQë Ëþ–ÍLðÖø”v.%æ øe;ÆC€ðáÞ´,oX<ÀTë«3Vºš3 þ|ãëñHzLãɇ!|·›×Û-øsä¤Y5–à(a8â éä4Fõò{Žû|`øEù+ÉèŒä—Myö‚V,7°WñŒhvÓp¥Ciyyx!Sx×Î/ÄÒvŸä ;ÃYo…Ÿ§§pÁ©ƒ.•K]goËLÇ´˜¯{ Ž—D¹hlLñbT¶·Ñ8ØaÅ+^²¡ÝoéÇè4uD/öÓ¡žWÆ|¾ÙŽ#âÛœÃEÜ%¯¢úA˜I]»!TJµ  ´YÌx[1Ñ÷ÏF!ÅŽxs@û„‚±ä¸¶Ñ„ÊW ”·‘³²ê,&ÓM¥©*‰uå¨ÍöD)Gò£ÆÅÏe2E÷º«›q¿Ÿ+õMª<‡€´ÂËÇÍÏsøþ`,o)F¸¥Z¯÷Ø3ØZRv›at±„th§á#çH'ÛÑ£üˆÒºlÖ\*Qt–=zw`}Ùñ+WGÕ@‘ IBFramework Version 762 IBOldestOS 6 IBOpenObjects 29 IBSystem Version 10D573 targetFramework IBCarbonFramework angband-3.5.1/src/osx/English.lproj/main.nib/classes.nib0000644000175000017500000000034612456456606022403 0ustar chriscchrisc IBVersion 1 angband-3.5.1/src/osx/English.lproj/main.nib/Makefile0000644000175000017500000000011712456456606021710 0ustar chriscchriscMKPATH=../../../../mk/ include $(MKPATH)rules.mk include $(MKPATH)objective.mk angband-3.5.1/src/osx/English.lproj/main.nib/objects.xib0000644000175000017500000005442612456456606022421 0ustar chriscchrisc Terminal 4 4 TRUE wnd Reset Width/Height TRUE rewh DLOG 1 4 2 0 173 20 96 96 20 173 116 269 Save s TRUE save Font TRUE TRUE Font 103 TRUE Show Fonts t TRUE font Antialias TRUE anti TRUE TRUE TRUE Tile Width TRUE Tile Width 104 Tile Height TRUE Tile Height 105 Game TRUE Game 101 New n TRUE open Open… o TRUE open Open Recent TRUE TRUE Open Recent 102 Import... i TRUE open TRUE Close w TRUE clos Nice graphics TRUE Nice graphics 110 Fit tiles exactly TRUE ngfi Just get 'em square TRUE ngsq 16x16 tiles TRUE TRUE graf Arrange in Front f TRUE 1572864 frnt FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE 3 -2 1 -5 0 0 443 360 DLOG 2 4 Angband 1 20 124 403 21 124 20 145 423 DLOG 3 7 TRUE 20 170 403 190 DLOG 4 7 1 1 2 2 TRUE TRUE TRUE TRUE TRUE TRUE TRUE 0 0 403 190 170 20 360 423 170 20 360 423 0 0 360 443 134 467 494 910 0 0 768 1024 Minimize Window m mini Terminal 3 3 TRUE wnd Angband TRUE Angband 100 _NSAppleMenu About Angband 0 abou Window 109 Minimize All Windows m 1572864 mina TRUE Angband 0 TRUE TRUE wnd Terminal 1 1 TRUE wnd Terminal 2 2 TRUE wnd Terminal 5 5 TRUE wnd Terminal 6 6 TRUE wnd Terminal 7 7 TRUE wnd TRUE TRUE Bring All to Front f TRUE bfrt 8x8 tiles TRUE TRUE graf 8x16 tiles TRUE TRUE graf 32x32 tiles TRUE TRUE graf 64x64 tiles TRUE TRUE graf Single TRUE TRUE thgt Bigtile height 108 Double TRUE thgt Triple TRUE thgt ASCII Graphics TRUE TRUE graf Bigtile height TRUE Bigtile width TRUE Bigtile width 107 Single TRUE TRUE twid Double TRUE twid Triple TRUE twid Graphics 106 TRUE TRUE Item TRUE TRUE Window TRUE main _NSMainMenu Graphics TRUE DLOG:about File's Owner MenuBar IBCarbonFramework 472 angband-3.5.1/src/osx/English.lproj/Makefile0000644000175000017500000000014112456456606020212 0ustar chriscchriscMKPATH=../../../mk/ include $(MKPATH)rules.mk include $(MKPATH)objective.mk SUBDIRS = main.nib angband-3.5.1/src/osx/English.lproj/InfoPlist.strings0000644000175000017500000000040012456456606022072 0ustar chriscchriscþÿ/* Localized versions of Info.plist keys */ CFBundleName = "Angband"; NSHumanReadableCopyright = "© __MyCompanyName__, 2006"; angband-3.5.1/src/osx/English.lproj/._main.nib0000644000175000017500000000012212456456606020404 0ustar chriscchriscMac OS X  2 Rangband-3.5.1/src/osx/Edit.icns0000644000175000017500000054317112456456606015616 0ustar chriscchriscicnsÆyis32¢…†ÐÅãóòðòI…»­ÚÞÞÚÕÿ\„ ÁŽ¥ÆÎʹþÿmƒÚ³¸€¾´úÿÿ‚ ÙÈééÜ¥ûùùûóò¤€ ¾´ââñ‰¡­ÅÉ­}€ Å£Éßð㎽àÚ¨Šè€áÂËâçÇ€ÿé£ ËÌöøÿ3zæ¦Ï«,΀ Ã³Üæ{-ÿ…N)Á†I€ Ä ²¶/ãœBýºÖ+€ ä×èì2ÿ&¹ÿ4ÿJq€ ÚÐøÿ,£ÌCi@SR θçÿ¶“•Ƶ‡¼ASINÕ…†ÏÅãóòðòI…¹¬ÛÞÞÚÕÿ\„ ¾¤ÆÎʹþÿmƒ Ù³¸¾¾¼³úÿÿ‚ ÙÈééÜ¥ûùùûóò¤€ ¼´âàñ‰¡­ÅÉ­}€ Å£ÉÝðã½àÚ¨Šè€ßÀËâéÆŽ€ÿé£ ÈÌöøÿ3zæ¦Ï«,΀ À±Ûæ{-ÿ…N)Á†I€ ®³/äœBýºÖ+€ ã×çì2ÿ&¹ÿ4ÿJq€ ×Îøÿ,£ÌCi@SR ͸çÿ¶“•Ƶ‡¼ASINÕ…†ÐÆáóòðòI…»­ÛÞÞÚÕÿ\„ Á¥ÆÎ˹þÿmƒ Úµ¹¿¿¾´úÿÿ‚ ÙÉçéÜ¥ûùùûóò¤€ ½¶ââñ‰¡­ÅÉ­}€ ŤÉßðã½àÚ¨Šè€ßÄËâçÇŽ€ÿé£ ÊÎöøÿ3zæ¦Ï«,΀ ³Þè{-ÿ…N)Á†I€ Ÿ³¸/äœBýºÖ+€ ä×èì2ÿ&¹ÿ4ÿJq€ ÛÐøÿ,£ÌCi@SR θéÿ¶“•Ƶ‡¼ASINÕs8mk€€€€€€‚€ÿÿÿÿÿÿþ¤€ÿÿÿÿÿÿÿÿ®€ÿÿÿÿÿÿÿÿÿ¶€ÿÿÿÿÿÿÿÿÿÿŒ€ÿÿÿÿÿÿÿÿÿÿùòå€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿò€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ùùùùùùil32ÎŽ ìì×ÓÏÎÓìëæÌ‚ŒìÛ¹ÁÙ‚ÛÚÕÎØ‹íܺ©Æ„ÜÙÓ¼ÁŠîÞ¾®¾É΂ÞÝÚͶ÷À‰îßÁµ¹Ç̓ßÜдÿ÷ÀˆïáÁ·««°¹ÌÓÕÕÓÏÆ°ÿÿøÀ‡ðâ󵺀· ¶µ³°Áưˆux—† ñäàßàáââäâä€âÛÆ¨›––”`…òæ×ÏÎÉáƒæåá×Ê€ÄÀ¦…óèÐÅÔ†èæãàÞÝÝÜá†ôê´ʇêéé€èçò† õìʹÉÙÚÙÙêìæß…ìö†öîÊ¿ÄÚèäåîîØ1¼€îíö†÷ðË»¾ÀÏèèççæZx–ƒðø2‚øñÜ×ÖÑÓØ×Ü××Å{÷o€‡„‰‹Ô VÅ‚ùóãßÓÜÞñ‚ó £zyñÿÿÙmcÿHƒúõÚÑè†õN݃ÿ®G„û÷ͼÕõ„÷Dz…ÿk„ ûøÒÀÓæèãäð€ø eE­ÎÎ×Å£lDƒüúÔÆÑàèïïøúúw jÕέ“¤¹ä&H‚ýû×ÌÄÅÒáÚàõ¬ cûûíA„¡{,&‚þýÒÀÃÍÂÂþÈ=&ãýÌ57Œ15>‚þþáØÜóööôóÁuþö;5ïþœ€'5‚ÿÿùõõôõ€ÿ §ÿŸ ¤ÿÿ§¯ ?‚ÿÿíåáçì€ÿ‘¬ÿpÇÿÿ]/ÿ9!‚ÿÿÝÌÚýÿ°ÿ—†ï3ë+JƒÿÿÕÅÐñý€ÿß!-ùÿA..f&"EƒÿÿãÜÚÛäþ€ÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ìì×ÓÏÌÓìëæÌ‚ŒìÛÀ·ÁÙ‚ÛÚÕÎØ‹íܸ§Å„ÜÙÓ¼ÁŠîÞ¼®¾ÇЂÞÝÚͶ÷À‰îß¿µ¹Ç̃ßÜдÿ÷Àˆïá¿·©©°¹ÌÓÕÕÓÏİÿÿøÀ‡ðâÀ±³¸·¶¶µ¶³¯¿Ä¯ˆux—†ñäàßàá€äâä€âÛÆ¨›––”`…òæÖÏÎÇáƒæåá×Ê€ÄÀ¦…óèÐÅÔ†èæãàÞÝÝÜá†ôêÀ²Ê‡êéé€èçò† õìÈ¸ÉØÚÙØêìæß…ìö†öîÊÁÂÚèäåîîØ1¼€îíö†÷ðË»¾ÀÏè€çæZx•ƒðø2‚øñÜ×ÕÑÓ××ÚØØÅ{÷o€‡„‰‹Ô VÅ‚ùóâÞÓÞÜñ‚ó £zyñÿÿÙmcÿHƒúõØÐè†õN݃ÿ®G„û÷˼Õõ„÷Dz…ÿk„ ûøÏÀÑäæãäð€ø eE­ÎÎ×Å£lDƒüúÓÄÑÞèíïøúúw jÕέ“¤¹ä&H‚ýû×ÊÂÅÒáÙÞõ¬ cûûíA„¡{,&‚þýϾÃʾÀÀ¾É=&ãýÌ57Œ15>‚þþßÖÜóööôóÂuþö;5ïþœ€'5‚ÿÿùõôôõ€ÿ §ÿŸ ¤ÿÿ§¯ ?‚ÿÿìäßåì€ÿ‘¬ÿpÇÿÿ]/ÿ9!‚ÿÿÜÊÚýÿ°ÿ—†ï3ë+JƒÿÿÓÄÏòÿß!-ùÿA..f&"EƒÿÿâÜÚÛäþ€ÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ìì×ÕÐÌÒìëæÌ‚ŒìÛ¹ƒÛÚÕÎØ‹íܸ©Æ„ÜÙÓ¼ÁŠîÞ¼°¾ÉÒ‚ÞÝÚͶ÷À‰îßÁ¶¹Ç̃ßÜдÿ÷Àˆ ïáÁ¸«­°¹ÌÕÏÆ°ÿÿøÀ‡ðâµµ¼¸¸·¶¸µ°Áưˆux—† ñäàßàáâääâä€âÛÆ¨›––”`…òæÖÏÏÉáƒæåá×Ê€ÄÀ¦…óèÏÆÕ†èæãàÞÝÝÜá†ôêÁ´Ë‡êéé€èçò† õìȹÉÙÚÙÙììæß…ìö†öîÌÂÄÚéäåîîØ1¼€îíö†÷ð˼ÀÁÍèèççæZx•ƒðø2‚øñÜ×ÕÓÓ××Ú××Å{÷o€‡„‰‹Ô VÅ‚ùóãßÕÜÞñ‚ó £zyñÿÿÙmcÿHƒúõØÑé†õN݃ÿ®G„û÷;Öõ„÷Dz…ÿk„ ûøÏÀÓæèãäñ€ø eE­ÎÎ×Å£lDƒüúÔÈÓàèïïùúúw jÕέ“¤¹ä&H‚ýû×ÊÅÅÔãÚàõ¬ cûûíA„¡{,&‚þýϾÅÍÂÂÃÀÊ=&ãýÌ57Œ15>‚þþßÖÞôööôôÂuþö;5ïþœ€'5‚ÿÿù÷ôô÷€ÿ §ÿŸ ¤ÿÿ§¯ ?‚ÿÿíçáåí€ÿ‘¬ÿpÇÿÿ]/ÿ9!‚ÿÿÜÍÜýÿ°ÿ—†ï3ë+JƒÿÿÕÅÐòÿß!-ùÿA..f&"EƒÿÿãÜÚÛçþ€ÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚l8mk(_ccccccccccco`oÿÿÿÿÿÿÿÿÿÿÿÿÿÿîItÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýYtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýWtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöUtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá$tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúitÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿotÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmatÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬âÿqtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿítÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqŸÿztÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿêtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm'ÿátÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm£ÿltÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÿìtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô&tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿj3y‚‚‚‚‚‚‚‚‚‚‚‚Àÿÿÿÿÿÿÿý@QŒ¡ ‡Qit32[ш‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç„æåæååææ‚åç„åæååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæ çìèêëçéììéëìâêìëéæååããâàÞÜÚ×ÓÏÊľ°à¶¸%è‚çèá¬ÀÁÄÅÊ¿ºÉ¯ÀŹÀ¹º¼¿ÑéŽçææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è‚çèâÐÒÄÒÖËËÅ»ËËáÍ³Ê´ÍÆÂëæçææ€äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%èƒçèëëíëêëíéçíìèêèíèíèçææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çèæéèæççæçæççæçæ’çææ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è„ç âåÕéÝÞéæèèæèè—çææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çèä¶·¨§Ìº­«¨§³²ãè–çææåääâáÞÛÙÔÏÉÀµ§ÝçÚÍÕ£²%éƒèæçâåâëìÍÝÍ×ßÈæé—èççååäãáÞÛ×ÑÌù§ÕñâÚÍÕ ±%é‚èéâÀͽÂǾƽåëéëé™èççååäâàÝÙÔÎż©ËøêäÚÍÔŸ°%éƒè çѹÊĪÐÖÏìíèç›èçæåäãáÝÚÖÐǽ«ÃüñëãÚÍÕž ¯%ê‚é èëÚËÓÙÌ×ÐÐÍÌäê›éèèææäâàÜØÒÊ¿®¼ý÷òëãÙÌÕ ®%ê‚é êæÀ¾¿¶¶¹°°±´ãêœéèèæåãáÝÙÓËÁ±¸ýû÷òëâÙÌÖ ­%êƒé èåèåëêçèèçéêéèèçåäâÞÙÔ̲µûþû÷òëâÙÍÕ ¬%ê‚éëÞÅ¿´°±µ³´²Ûìèéé€è˜éèçæäâÞÚÔÍô³úÿýû÷òëâÙÍÖ «%êƒéèãàäÖÒããàáèííêì€íêè–éèçæäãßÚÕÎĵ³ùÿþýû÷òëâÚÍÖ ª%ë‚êëçÄɵ¾Æ¾¹Æ®ÌȪÕʾ³®ÇÛíé”êéèçåäàÛÖÏÅ·´ùÿÿþýû÷òëãÚÍ× ©%ë‚êëçÌÎÑÕËÕÈÈËØÔÂÆÃÑÌÊÖáì•ê ééèæäáÜÖÐǹµù€ÿ þýû÷òëãÚÎØ ¨%ëƒêèÜà×ÓÚÙéàÕÙæòèì€ïíë–ê ééèæäáÜ×ÐȺ¸ùÿ€þ ýüú÷òêãÛÎØž §%ì‚ëìç¹¾·¼À´Ç²¸Ïîìëêëéëì–ë êêéçåâÝØÑɼ»û„ÿ ü÷ðèáÙÎÙž ¦%ìƒëéêëééèçÜãêèçäåëëæïìæ–ë êêéèåâÞØÑʾ»íñíììïñöûþÿýöêÝÌמ ¥%ì‚ëíä¶¿±±½±º¶´°º¯§º¶°·«·èëéêê‘ë!êêéèæãÞÙÒÊÁ¶ªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì„ëããçéêáâçãßáßÝèÞåàÍçðïòððìë"êêéèåãßÚÓ̹­žŽ‚|zxuspkhhly’³Ìæ¥ £%ì‚ëìçÉÏÑÒÕÔÒÍÙÑØ¿ÒÎÒÙÏÒÆÒÕÃÐÐç‚ëêŠë#êêéèæãßÚÕÍÅ»°¢’…~}}{zyywtomvÏ¡¢&í‚ì=íçÇÊÅÉÒÀ˼·È¨½Ê¤³¿¯ÁÇʳ¼¦ØííîïîñïïîîíîïðîïíïîíîìëéæãÞØÒÈ¿µ¨˜†„‚€€€€{pj£‰£&íƒìCëââáÔâëñçÕ¼ÕßáâèÜâìíææîæßéÝìÚÓåÐááâäèÞËÚâßéÓÛèÝãáÝâÖÂÔÉËú¯£™“’‘‘Œ€‹ ŠŠˆ‡†kc¡&î‚íCïæºµ½½³¯ª¶¯°¡¬¸¾¹¼©Ë®˜Ä¡±Ê«³¬­®·±¯±µ¨°²É³¸¬µš¦¸¨­¾¥ª ¬ÎÈÀ¸¯¨¢ Ÿž›€™ ˜——–”‘‰yŒ5 &îƒíSïçèòæêáÔßñãÑèÝòåéßÙà׿×ïèà÷ÞÝóñõòõàÑááüÙ×ôââîÙàìëÞÞåäÒÏÓÌÆÀ¹´¯®«ª©¨§¦¦¥¥¤¢¡ž›—’Œ Ÿ&î‚íCïæ¿¼½ªÌº»¿Á¹ÎºÁ»²¹Á¾¶×ȵÆÁ·µÎ¿Ã·³»·¥½¼½´¥¼Åºµ­ºàîëëèçãàÛÖÐËÆÁ½¹·¶µ´³² ±±¯­«©¦¢š¢HŸ&îƒí@ìÓÙÌÃÒÈݶÇäàÑÙÙÜØÛѾÛßÍÆÓÜ×ß»ÇÉØÓÐäÕÅßÌÖ»ÐÖÆÕ׿ìëêèçåáÝÙÕÐÌÈÅ¿¿¾‚½ ¼¼»º¹·µ³°«¯~Ÿ&ï„îòòïðï€ò€ðóòòñòòñõð€òñðñï€óñïðòôóððôðñòîíììêèçäáÝÙÖÒÏÍÊÉÈ€ÇÆ€Ç ÆÅÅÄÂÀ¾¼¸¼œ &ï„îíí€îííîííîˆíîí€îíîî€íîîíîííîííììêèçäâÞÛÙÖÔÒÐ„Ï ÐÐÏÎÍÌÊÈÇÃɧ &ï³îííììéèçåãàÝÜÚÙØ×ÖÖ„× ÖÖÔÓÑÏÍÕ° &ð„ï îïîîðîíïðíð‚îœïîîííìêéèçåãáàßÞ€ÝÜÝ‚Ü ÝÜÛÚÙØÖÞ· &ðƒïðóðóôëòöñç÷íôôöôôï îîííìëééèçæä€ãƒâá€àßÝÛã½ &ð‚ïñè¯ÅÃÉÌ¿³À®À°¿¿¸ÀËìðœïîî€íìê€éèè€çæ€çæ ååääãâàé &ð‚ïðëÞÜÏÝê»ËÛÙÕß¼ÔÈÄÅëðï€î€íìëë€êˆé€èççåîÅ &ñƒðñôóõóððõôôöóòõöññ ð€ïî„í„ìëêêçñÇ &ñ„ðññòññôï€ðïðïïñ£ðïŒîƒíëõÊ &ò„ñ èìÞçìßòîðñò©ñŽð‚ïîìöË &ò‚ñòíÁ¿·¯¼¯³²¯²Ìõð«ñðîøÍ &òƒñ ïóìîðõéØîÚÕÝôð¾ñîøÍ &ò‚ñ óêÃÏ¿ÃÉÁ¿Êöòóð¿ñïùΠ&óƒò ñÝÄ×϶ÚÜåù÷øö¿òðúÏ &ó‚òñôÞÊØàÍÖÔÐÎÍËÚôñ½òðúÏ 'ô‚óôðÍÂÁÅÃÍɼ¾º·Ô÷ò½óñûÏ 'ôƒó òîóïòòîïñðôùö¿óñûÏ 'ô‚óõèÌÄ»¶¸½¹º¹åõòòóóòóóôóòò²óñûР'ô„ó îìïâÞîïìíñòõöó€ö óðõöôõ÷ööôñ¯óñûР'õ‚ôõðÇ͸ÃʼɱÏ˵ªæË½ÃÅÕͬÏÙ¾±ÉÝøó­ôòüР'õ‚ôõñÚÝáäÙãØÖÛãëÜÒÕ×ÜÙèçÞÔÒÑÝÞ×Ýèöó­ôòüР'öƒõóáæÛ×ßÞðçØÞìûûóøúú÷öùûööúùúùö¯õóþÑ 'ö‚õöñÄÉÄÉËÀÎÍÀÃÚ÷õøõôôõõôôõõô°õóþÑ '÷‚ö÷óóõñöñòçåðìðøííô€öõ¸öôÿÑ '÷‚öøî¿ÃºµÉ;ºÇ­¾½±²ì÷ôõ÷¸öôÿÑ '÷„ö ðéðóæð÷óéðüÞÛ÷€üûô÷·öôÿÒ '÷‚ö÷ñÍÔÖÙËÇÌÎÆÙÏ¿ÙÍÊÇØÌÔö„õö€õö‹õööõõ™öôÿÒ '÷‚ö4÷ñÖØÑØá¯ÍÜÚÑÌÞáËÖѳ¯Ùîú÷øøúûûùúúùøúúùúúùùúüùúúùùøøúûù˜öôÿÒ 'øƒ÷öéêëößÙ÷ïðëèíêíÙ÷êäóèÑ€îéçÜÅæçíïçìåÄÜäÜêÕîçêîè×êÑÐÛù—÷õÿÓ 'ø‚÷ùð¹À½Öü€·*Ü®¯Æº»ª¶Ý˼±×ÇŸÂÂÄ·½ÅÊÆ·²°³Ë»Ä¸²¹®¹½Ôþ»Çñø–÷õÿÓ 'ùƒøùõ€÷/üøøùøúùâöúû÷ÞôùúõÞúíãýüüûúê÷ü÷æûúøúü÷åüðéëüöûýú÷—øöÿÓ 'ù‡ø÷ö÷÷öøø÷úùö÷øûø÷÷øýøúü€÷øøúø÷øûø ÷øûøùúú÷ùø÷÷˜øöÿÓ 'ùƒøùýû€üÿþþøøüÿõýüûýÿþýø÷øø÷†ø÷ƒø÷€ø÷øöÿÔ 'ù‚øùóÄÕÙÞÒÏÖÓÂÄÊÛÅÉÛÕÜÏÖÜœøö÷–øöÿÔ 'ú‚ùûòÓÙÈÛÞÈÍÎÀ¯ÉÎßÄÙÌËÓÏÍú›ùþø÷•ù÷ÿÔ 'úƒùúþüþýýÿþÿúôÿþüÿüýþþÿþ›ùûÛôüö”ù÷ÿמ(û„ú øùúùøù÷øøúøøùøùøùšú÷ÿOAóÿõù‘úùôÿÄŸ(û…úøñùþøÿýþþ¤ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(û‚ú û÷Éȼ»ÈËżįõû—ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(ûƒú øóíñêîìáëèàøû—úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (û‚ú ûôÙçØÞåÚÜÜþýùù”ú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û‚ú ûøÖÁÌdzÅÑßÿýþþ”úöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(üƒû ýòÝïîÙïíææççéú“û÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(üƒûøÍ¾¼Æ³ÈÆ€·µÅ”ûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ýƒü û÷úùüû÷ùùúùúú”ü úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ý‚üþñ×ÒÆÇÈÈÆÇÅíÿúûüûüü€ûüüûƒü ûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ý‚ü ýúîéïÞÙíëéëû€ÿüþ€ÿýýþÿÿýý€ÿþ„ü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ýƒüúÝâÏÖÝÖÕàÊÞ×ÉÂòÞÑ×ÔÜãÎÃÛàêÓÚÊÒÿû‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚üýøÑÔÓÛÑÙËÍËßçÑÂÜÓÒÑâèÑÅÊÒÇÔÚ×ÄÒþƒü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýƒüûõùôíòõüõñòùÿÿôü€ÿ ýþþÿÿýõþÿÿþ…ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ‚ýþøÃɾÃʾ×ϺÂßÿûþüûüüýüýþüüûü…ý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þƒýûûúúüøúèñûöøüýýÿþ’ý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(„ÿ#ýíêðÜôïáäóáðÝÿÿþýÿþÿÿýþÿüÿÿýüÿÿýÿþüþƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(„ÿ#øÉÀº¹¿»ÏÑÊÀ²×ÿþþÿþÿþþÿþþÿþýÿÿþþÿþþÿþƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(…ÿüþôóó€ÿþÿõù—ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(†ÿþÿþÿÿþ™ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(‡ÿþ¡ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(…ÿþþÿÿ‚þÿ…þ’ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(—ÿþ’ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿýâëòòêáÛöðÝðèÞðõíñçÝ”ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(„ÿöÂÒÂÕ־ĵ¯ÄÃÖѾºÄ¾ÀÜÿþ’ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(†ÿþýþÿÿùïëø€ÿýîþþ–ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(…ÿýþÿþýÿþþÿþýþþÿÿþÿþþ˜ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(‡ÿýü„ÿýûÿþÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(„ÿýØÜÌÈáÍÏÛÛØÛÆîÿþÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(„ÿ üääåÖÙíàÉËÕÏÜú¢ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(„ÿ ûð÷æñüöíåíù¤ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(„ÿ úÌÉÀ»¹³ÃÂÈåÿý¤ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(…ÿ üûüðëáüûøùûü§ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(„ÿþÒ¼¾ÉÆÌĸ»»´Ûÿýþþÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü‚ûü÷ÓàÞÒàáÕÙÓÅØÓÒÕÕÛöÿüü–û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(„ÿþüþ÷üü÷üþðúðò÷þýúòóðü•ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b€cd`FL@FPFBOÔÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (û‚ú üòÙåÕàâÛÚÛÿýùù”ú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û‚ú û÷Ó½ÍŬÇÑßÿüþý”úöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(üƒû ýðÛðëÛïìæçææê”û÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü‚û üøÊº¼Å·Èʹ´²Æ”ûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ýƒü ûöúùüû÷ùúúùùúý“ü úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýüûÿð×ÏÂÂÉÅÆÅÂïÿûúüûü‡ûƒü ûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ý‚ü ýùíéîØÚíéèëû€ÿüÿýýþÿÿýý€ÿþ„ü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ý‚ü ýøÛàÑ×ÜÒÙàÏÝÔɾñÜÏÑÓáâËÃÚÞêÒÛÇÓÿû‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚ü ý÷ÐÑÔÚÎØÍËÎÝãѾÙÑÐÌâëÏÃÊÒÄÒÖ×ÃÓÿû‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýƒüúôøóîòôûöïòúÿÿóýÿÿþýþþÿÿüõ€ÿþ…ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ‚ýÿö¿É½ÈɽÕкÂÝÿûþûûüüýüýþüüûü…ý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þƒý ûûúúýøûèóûö÷€ýÿ“ý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(„ÿ#ýíêïÝóîßæôáîßÿþþýÿýÿÿýÿÿýÿÿýýÿÿýÿþüþƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(„ÿ#÷ÅÁ·º¿¹ÎÍÉÀ®Ùÿþþÿþÿþþÿþþÿþýÿÿþþÿþþÿþƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(…ÿýþóòó€ÿþÿóù—ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(†ÿþÿ„þ™ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(‡ÿþ„ÿþ™ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(…ÿþþÿÿ‹þ’ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(—ÿþ’ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿüàëñòèàÛöñÖðéÞðóíñæßÿþ’ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(„ÿôÁн×ѻĴ±À¾ØÌ½µÄ½ÀÞÿþ’ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(†ÿþý€ÿøðéø€ÿüíþþ–ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(…ÿýþÿþþÿþÿÿþýþþÿÿþÿþþ˜ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(‡ÿýü„ÿýüÿþÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(„ÿüÔÛÍÄàÌÍÛØØÚÅñÿþÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(„ÿ ûââæÓÙïÜÆÈÕÏÛû¢ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(„ÿ úñ÷ßðûöìæîù¤ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(„ÿ øÇÆ¿»±³ÂÂÆæÿý¤ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(…ÿ üúüðêáüûøùûü§ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(„ÿþη¾ÄÄÊÁ¹¹º±Ýÿýþžÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü‚ûü÷ÑßÜÒÜÚÖÖÑÄ×ÕÔ××ßøÿýü–û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(„ÿþûüùüýõýþñùïòôþüøóðïü•ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b€cd_DIAGOCEP@PMBB_FEK=O_d”cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埅†€‚–=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%ç„æåææåææ‚åç„åæååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çƒæçëçëêæéììéëëâêììíììêæååããâàÞÜÚ×ÓÏÊľ°à¶¸%è‚çêܪÂÁÅÆÉ¿¼Ç´Äż¿¹·¼½ÑêæçææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è‚çèáÒÑÃÕÖËÍļÍÎâ̳ȲÎÁÃìæçææ€äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%èƒçèëëíêéëíèèíëèééíéíèèçææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çèæéèæççæçæççæçæ’çææ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è„ç áå×éÛßêæèçåè˜çææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çèᳺ©°É·­±©­·ºæ—çææåääâáÞÛÙÔÏÉÀµ§ÝçÚÍÕ£²%éƒè çæãåãìêËÞÍÚßÊç˜èççååäãáÞÛ×ÑÌù§ÕñâÚÍÕ ±%é‚è êßÀ˸ÄĽÄÀèêéëšèççååäâàÝÙÔÎż©ËøêäÚÍÔŸ°%é‚è éå͸ÌèÔÒÒíìèç›èçæåäãáÝÚÖÐǽ«ÃüñëãÚÍÕž ¯%ê‚é èëÞÊÔ×ÌÖÑÑÊÍæê›éèèææäâàÜØÒÊ¿®¼ý÷òëãÙÌÕ ®%ê‚é êä½¾´¶·°±°¶åêœéèèæåãáÝÙÓËÁ±¸ýû÷òëâÙÌÖ ­%êƒé èåéäìêçèèçéêéèèçåäâÞÙÔ̲µûþû÷òëâÙÍÕ ¬%êéèìÚĺ²ª²²¶¶¯Þêèèé€è˜éèçæäâÞÚÔÍô³úÿýû÷òëâÙÍÖ «%êƒéèáàæÑÒäãàâèííêìííîêè–éèçæäãßÚÕÎĵ³ùÿþýû÷òëâÚÍÖ ª%ë‚êëãÃÈ·¿Æ¾½Å´ÊÆ©ÖɲµÈàìé”êéèçåäàÛÖÏÅ·´ùÿÿþýû÷òëãÚÍ× ©%ë‚êëæÍÐÔÕËÕÉÈÍÕÓÄÅÇÔÌÈÔäë•ê ééèæäáÜÖÐǹµù€ÿ þýû÷òëãÚÎØ ¨%ë‚êëçÛà×ÖÜÙéßÓÚçñèì€ïí—ê ééèæäáÜ×ÐȺ¸ùÿ€þ ýüú÷òêãÛÎØž §%ì‚ëíã¸Á¸Ã¿¹ÈÀ²·Òïì€ëéëì–ë êêéçåâÝØÑɼ»û„ÿ ü÷ðèáÙÎÙž ¦%ìƒëéêêèêççÜåêçæâåìêçïëç–ë êêéèåâÞØÑʾ»íñíììïñöûþÿýöêÝÌמ ¥%ì‚ëí⹿´²¿³»·¯¯¿­¬¿¯²»¥¶êêéêê‘ë!êêéèæãÞÙÒÊÁ¶ªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì„ëãäéçéáâçãàãààèÝçÞÎéðïñðð‘ë"êêéèåãßÚÓ̹­žŽ‚|zxuspkhhly’³Ìæ¥ £%ì‚ëìåËÎÎÕÖÕÏÏÚÍØ¾ÒÏÕÙÐÍÈÒÔÀÑÐéêëêŠë#êêéèæãßÚÕÍÅ»°¢’…~}}{zyywtomvÏ¡¢&í‚ì%îäÅÊÂÐÓÀʹ¹À§Âç¶Ã®½Èdzǵ¨Ýîíîïîòïïîîí‚ïíïîíîììéæãÞØÒÈ¿µ¨˜†„‚€€€€{pj£‰£&íƒìCëââáÔãëñåÓÀ×ßâáèÜäííåçîåàèÜìÚÙâÎâáâãêÛÏÝáàéÏÜèÝäàÝãÓÃÔÉÌú¯£™“’‘‘Œ€‹ ŠŠˆ‡†kc¡&îíDìðⷶ»¶¨­µ¬±£®Á½¹º±Ì­ Ãž»É¨³©®³º¬´³´¨´¸ÏÀ¡³½®±˜­¶¬²¾¤¬¡®ÎÈÀ¸¯¨¢ Ÿž›€™ ˜——–”‘‰yŒ5 &îƒíSïæéóæëÞÕßòàÔçÞóäéÞÛàØåØñæá÷ÚàóòõòôÞÔàåûØÝôåãì×ãëëÝÞåäÑÐÓÌÆÀ¹´¯®«ª©¨§¦¦¥¥¤¢¡ž›—’Œ Ÿ&îíDìïã¼¾·¬Í¹½Á·λö¶¾Á½¼Ýɴǽ¸Ð»Áº¶¼»­Å¾´®¹Å»²±½ãíëëéæãàÛÖÐËÆÁ½¹·¶µ´³² ±±¯­«©¦¢š¢HŸ&î‚íAîëÑÝÃÆÑÈÜ·ËäÞÐÛ×ÝØÛÎÂàßÍÈÕàÙÞ·ÇÍÛÒÒç×ÏÜÌ×µÓÔÃÙØçìëêèçåáÝÙÕÐÌÈÅ¿¿¾‚½ ¼¼»º¹·µ³°«¯~Ÿ&ï„î>óòðñïòòññðñóñòñòòññððôïòðòððñðòóóðîðòôòððôðñòîíììêèçäáÝÙÖÒÏÍÊÉÈ€ÇÆ€Ç ÆÅÅÄÂÀ¾¼¸¼œ &ï„îíí€îíí€î…í îîííîíîííîíîíîî€íîííîííîííììêèçäâÞÛÙÖÔÒÐ„Ï ÐÐÏÎÍÌÊÈÇÃɧ &ï³îííììéèçåãàÝÜÚÙØ×ÖÖ„× ÖÖÔÓÑÏÍÕ° &ð‡ïîðîîïðîð‚îœïîîííìêéèçåãáàßÞ€ÝÜÝ‚Ü ÝÜÛÚÙØÖÞ· &ðƒïðòïôóëôöïëöîôôöôôï îîííìëééèçæä€ãƒâá€àßÝÛã½ &ð‚ïòã®ÆÂËÆ»·Å¶Ä±ÁÀ¸ÁÉíïîî€íìê€éèè€çæ€çæ ååääãâàé &ð‚ïðêßÜÎáæ´ÑÝÙØÝ½×ÄÆÃížï€î€íìëë€êˆé€èççåîÅ &ñƒðñóóõóññõôôõóòõöðò ð€ïî„í„ìëêêçñÇ &ñ„ðòðòññóï‚ðïï¤ðïŒîƒíëõÊ &òƒñ ðçíÛéëâòîððò©ñŽð‚ïîìöË &ò‚ñòê½¾·°¿­¹´­µÎõð«ñðîøÍ &òƒñ ðòêðð÷äÚíÛØßôð¾ñîøÍ &ò‚ñ óçÃκÅÅÃÂÐ÷òòð¿ñïùΠ&óƒò ðÙÃÚδàÜçùö÷õ¿òðúÏ &ó‚òñôâËÚÝÌÕÒÒÐÎÍÞôñ½òðúÏ 'ô‚óôîÎÀÃÂÂÌÉ»Á¾·Ø÷ò½óñûÏ 'ôƒó ñïòíòòíïñïôøõ¿óñûÏ 'ôóòöãËÀ¹¯¸¹½¼¶èõò€óòóóôóò€óô¯óñûР'ô„ó ììñÝÞïïìíñòõöó€ö óðööõõöõöôñ¯óñûР'õ‚ôöíÇÌ»ÅÊÂÁÉ¸ËÆ³°çɾÂÂÙѯÕÔÁ¶¯Ïä÷ó­ôòüР'õ‚ôõðÛßäãÙäØ×ÝàéÛÔÓØÜÙçèàÔÐÒßÜÖâìõ®ôòüР'ö‚õöñßåÛÛáÝðåÖßîûúóùúú÷öùûö÷€úøö¯õóþÑ 'ö‚õ÷íÃÌÄÏÊÄÎË¿ÂÝ÷ö÷ôõôôõõô°õóþÑ '÷‚ö÷óôóòõðóæçðíð÷ëíõ¼öôÿÑ '÷‚öøíººËÍ»ÁÉ®¾Â¯·ðöôõ÷¸öôÿÑ '÷„öñéðòæðöóëðüÞâ÷üûýúó÷·öôÿÒ '÷‚öøîÎÔÔÛÉÉÌÑÉÚÎÃÛÍÊÎÕÆÓøõ€ö€õöõõöö‹õöö€õ˜öôÿÒ '÷‚ö4øïÔÙÏßݯÏàÜÓÍåßÌÖÑ®®Úòú÷ùùúúûùúúøøúùùúúùúúüøúùøùøøúúù˜öôÿÒ 'øƒ÷5õêêíöÝÜøîïçæìëëßöéçõâÐðíîèçÚÃéåðïçëåÍãàÜêÙïèëðäÚäÌÍßúö–÷õÿÓ 'ø÷7öùì¿»ÀÁÕÄ¿¸¸¶Ö§µÉ¾¿¯¹àĶ±Û¿œÈÁ¹ºÃÆÆ·¯¹¹Ì´Ç»´¼­»»ÖÁ¹»Íôø–÷õÿÓ 'ùƒøùõ€÷/üøøùøû÷àøúûõàöøûñÞüêæýüûûùçøüõæûùøúüõçüíèìü÷ûüú÷—øöÿÓ 'ùƒø÷÷ø÷÷ö€÷€øúù÷÷øû€÷ùýøúû€÷øøúø÷øûø÷øû÷€ú÷ø€÷˜øöÿÓ 'ùƒøùýû€üÿþþøøûþöþüûýþþü÷÷øø÷‚ø÷€ø÷ƒø÷øø÷÷øöÿÔ 'ù‚øúïÂÖÙßÐÍ×ÔÆÀÈØËÑ×ÚØÐ×ßú›øö÷–øöÿÔ 'ú‚ùûðÕÙÆáßÇÎÎòÉÎáÈ×ÏÆÔÍÒüøšùþø÷•ù÷ÿÔ 'úƒùú€ýüýÿþÿùõÿþýÿýýÿþÿý›ùûÛôüö”ù÷ÿמ(û„úùùúøøù÷÷ùúøøùøùøøùøùšú÷ÿOAóÿõù‘úùôÿÄŸ(û„ú ùùîúýùÿýýþ¤ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ(û‚ú ûóÅǹ¹ÍÈɾÇÈøû—ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡(ûƒú øòìòéïèäíèáù˜úþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  (û‚ú üñÙçÓàâÛÛÝÿýùù”ú÷ÿ©Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(û‚ú ûõÒ¿ÎÆ®ÉÒáÿüþý”úöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž(üƒû ýóÜðëÜðíççæèê”û÷ÿ™B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž(ü‚ûüöÑ»½Ç¹Ìɹº¸¶Èü“ûøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž(ýƒü ûöúùýû÷úúûùùûý“ü úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ(ýüûÿíØÎÃÂÉÄÉÉÁðÿûúüûüü†ûƒü ûýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž(ý‚üýøìèñ×Ùíìéëüþÿÿü€ÿþýþþÿÿýý€ÿþ„ü ùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž(ý‚ü ý÷ÝâÑ×ÞÖÙàÐÚÓÇÆóÜÒÕÑàçÌÂÝßêÔÜÇÔÿû‚ü øÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ý‚ü ýõÒÖ×ÛÑÚÌÎÐÜäÏÇÚÑÒÐàéÓÉÈÓÅÕØÖÆÓÿû‚ü úÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýƒüúô÷óïóôúõïòûÿÿôýÿÿþÿÿüõ€ÿþ…ü ûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þ‚ýÿôÁÌÀËÊÂ×̹Ââÿûþûûüüýüýþü…ý ùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–(þƒýûûúúý÷üèôûö÷ýüýÿ“ý7ûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(„ÿ#üíìîÚöíÞéóãëÞÿþþýÿþÿÿýÿþüÿÿýýÿþþÿþüþƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(‚ÿ%þÿõÅÆ¸¶¿¼ÏÍÌÅ´Ùÿþþÿþÿþþÿþþÿþþÿÿþþÿþþÿþƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(…ÿýÿ€óÿÿþþÿõû—ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(ˆÿ„þ™ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(‡ÿþ¡ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(…ÿþ’ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(—ÿþ’ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(„ÿûàëóòéäãöñØðçÞðôíòäßÿþ’ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(‚ÿþÿòÃÓÀÜտý¶Ä½ØÎ»¹Å¿Âßÿþ’ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(†ÿþý€ÿ÷ñëù€ÿüíÿþ–ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(…ÿý€þýþþÿÿþýþ€ÿþÿþþ˜ÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(‡ÿýý„ÿüüÿþÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(„ÿúÕÚÏÎßÌÑÝÜÙÙÆóÿþÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(„ÿ ûãáäØÛîÞÈÐÔÏÝü¢ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(„ÿ úðøãóûöëæîú¤ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(„ÿ öÉÉÁ¿·´ÁÄÊêÿý¤ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(…ÿ ýùüïêáüûùùûý§ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(„ÿü׸¿ÂÂËù»¾¶ßÿýþžÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (ü‚ûüõÓàÜÓÞÛÒÖÑÇÙÔÖÚØÞùÿý—û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(„ÿþûýùýþ÷ýþòôîòóþýøôóõý•ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€b€cd^FKAGOFEOAOL@C_FFKBT`d”cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埅„‚—=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽt8mk@+¯®®¯¯¯¯¯¯¯¯°¯¯¯¯¯°°¯¯¯¯°°¯¯¯¯°°°¯¯¯¯°°¯¯¯°°°¯¯¯¯¯¯¯¯­¬‘U  Gÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿä†  NÿûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûûýþÿÕ1Vÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúÿä<  \ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè?  `ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè@  bÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿæ>   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿå=   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿã;   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿâ:   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà9   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÞ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ3   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÖ+   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÇ    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ©   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿs   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç2   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŒ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÏ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè0   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê6  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê:  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê=  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê>  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêA!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç9"   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷c   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ–   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýW   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé31CE2  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿìšÔøÿÿþè¬B  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿþÿ¬  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýþÿÿÿþûüÿÝ'  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÜ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ°  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿS  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ0  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿo  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ»  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿº  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿj  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû,  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¼  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿK  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ¥  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿÒ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüþþÿþýûüÿÑ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ›   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿëÈïýÿøÜœ3  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé4%46#  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC"  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè>"  cÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿóG  aÿüýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýÿÿÿÿÿÿÿÿÿÿÿÿýÿÉ   _ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿp E¥¬²µ·¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¶ðÿþÿÿÿÿÿÿÿÿÿÿþÿöº·¸·¼øÿÿÿÿÿÿÿÿÿÿÿÿüÿº $,:DKNPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRN^òÿþÿÿÿÿÿÿÿÿÿÿýÿÍJRQRMÖÿýÿÿÿÿÿÿÿÿÿÿýÿß (28=@AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD:fÿÿÿÿÿÿÿÿÿÿÿÿÿüÿš4EBE5¥ÿûþþþþþþþþþþýÿã  $()**********************************************,#Kûýûüüüüüüüüüüûÿ^,*-jÿýÿÿÿÿÿÿÿÿÿÿüÿ¿ Ëÿýÿÿÿÿÿÿÿÿÿþÿì(+ÙïêëëëëëëëëéìÛ< (c]^^^^^^^^^]bM  ic08‡ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ †°ÿ“ÏÁ§nË•>/P"ƒ5o®¦µZÅíIÚ²JüÆÃÀ;U{`³Tþ™qåÈ«Óâ)™¨¥f œm1qLÍJ†ßÐA"p;H´ºžÀ|'€Ãh©`¾PæK±ïþÀ|'§9…16Ê[UÏÁ } ºEì&ßÞË´gÎO$~¼XôÖ}Ó{ÀÜžÒ þJZcOLú{’‡šÐüy÷A/0ˆêÍìZøv$à¸K&Ýd ¡ÇàyÌ~g`€Ë» ƒ’p•@Â*@3×Wçç(÷§˜?ƒó¶¥°¶1oÌÌθ\©GxÐ.…cñu ‘êFç!¤‰_Ýy)¥å™8w†Ô‡Á‹IB¿“”°°pÌ゚ćZamoÌsÙl²Ô:&WÉkG¦C‚Xa§ÇðvµEþ8ÛJ–™¿º)'DÇ2,¿#Oc*鎪uEÜÝ<®X>éÔáäv<¡Å¦ö!+IÀ2饀و›øu]šÃ7Ì#Òw™ Ÿ,Ýï ä$%¹ñ\M ö­À.ép§{²°çùÇšlz""–Rü‹©“‚gÉpŒ ý¯^ƒú,ÇàS<~d`€ËÉ@í;&å5ÅðÜÝÕ ©Æ©È­¢¸‰á)Fá| –¦W(– )Ô…R;<ä»Í÷þ(R:θ3I"tÿq‘‡ö·Ïþp¹3 7 †;<‚GBn2,XýÌL–gs6`4wàYÞÓXm86yq¨’÷ÿZpÔqRÏιµί©7[K”é4 P,J}è2³2%裓ž -‚ZÃu6=¯$•=`HeLŒb¨­Õ.¦Hƒ}´‡NÛ¿¡÷CÎ¥üïXrW¹z0#Ÿ*¸h45Ö˹!-G¹Å(Ž»ÌMMwŒ–玙ŽÇH'4ãL5Â]Ïé” Y)’‰FÖ“ç*²¥¥jc™|‹×}¤r…¿ê Qq“ìýLò(ªänB¢Ý‹oŽ·ŸnNéÏü°"c³nBèúzõ¹H)4íVøŠäV«9&ß‹ [¢¤:wŒ×1²%WoI«Ä~Šóè³¹“=4'”(žñEM9N¸‚ñÔ¹Ìé´"[¼Ý•FmÒ{ƒn`1é>Ê¿s)d«b1½Ò„yh¨; ÕÊWÝbì !`Ã<·@DÁ;¢æ~>Eßpà XÜCi«ÛÒxAB‹UNª_Æ~q£Ô—«RéÂ소Èl¸¦å¡—KïjÈš QcI8…°Wv“®_Ô­ïÄ›2¯¶W,„-’]&YgË4Q„qú—Ì$¾©]2I}MåPUŬ+}A0›ÝÃ%C»¹ –›Læ{%ì$ILH”2]„]ד†Ó†%ó~øKkžœgbkù»:ÔGýRR}ÇæI s é\Ä!Sµ„^£€vé1 A/AþÎÞð° Qýk|W¥@޻䳖¥1Ànð»|4À$r§³5ÌÊΗÿ2÷3_¤^I!'GÚÖè2ƒúM•“ak*"þ¯À 7W®·[ i@‡BÒ'$'µ0–ÜW;•n†eŒÇÆq·“CqŸÌñTë®ËE«ÉîÀrëðÃH ÇðWì–LýqªŸKi¾+^|²6|\†¶À´3~Zxÿ~ ´[öšm³Í×€!ìø2SÏ[d)K{iRé¾X· lYŠxÔ<gJšÂ³*8ï£ñ…×/;z¸ÏÍ~?~ `­>Vîr² *;”- ‡Àj<µ'Ñ+HÿRÁªÕ| +`@O™oÔ@ÿ„ tÝ/MBVŠ©ç°Ë–¥ ìkÙƒjeÒ_ÁyÁ,Æ#šHˆCA'¿£þ™l^_8b"c³nq!'ó J®Sý÷É!y¹„Šw%I ´9uû“õÊ?5v½8I1!dsäðTÛÏ„œÞy8€|4Ѱµò†rÇ4p•\Fz8A”j¾å¤&þ?­jMÎÝž;ªðy5¹fß“žšBºäv›µ>²eH.Â|AÊqq#9Öb«U6Ö–žoW…Ei^ ,øG{x¾g‹ÁÏÏ¢ùô‰ŸAàฮw¿Ò’ –3è'=ÿ[L„M7Í»]9dë)8S™´3Šq¶š ´{PI¨ÍåK^*î1œ]5×Í•‰öÛïÃRÞÂJ©_¯¸Õ8ëLð€Ø^ÆŸ|• Ä!gø¬ ög®¦bQü¹š²©~¥@úaž›<-ÕÜs{$4:aMqÕ†é,›vöW<º¥º±ˆÍš´Ÿa(3Ô¶UÂ+c5Ì5CV4)Qý⦠´HV’3Ö˜#nôúßÌ™ÖQpÝd™²‹õÎþ…=Öä®CÈœ)h _–fw¸oö¶ ÐÓøn]³Ê<ô¦ØÏ˜2é¯Ì^i„Øã›í®OLðßJPé&ñ(‡¿©¹ £*!7EŽBnyY—$N'! lÆ)xW™úeçÄ"øTå¸j[`FÀ‡9vÂf‚͉vmoÝ—W‰h #±8iV¡­·¬7ÿr9„f2ÐDM®Y9=äáÎô¶,BX¸=ˆ®vè_lL[%—D€Xr0¢‘qjÆ›«SÎ4}—Àb±` PAåU…n—;¾ïzDÛ>XíÐô BKi}4¹ Ÿ¤ÃÿGì%à/Zæšè?ñ<=Ú ’þ›/…²´¤‘e™òÁJMbbÂoÅ´z0› %˜ü§8¦ÍðÛM}Z%ÇócD Ž¢¸¹lZ ­CËÑLQ‚/-ôK+Û·ˆúQ—³•ºÄ÷7«˜á$ RÖ;9óøí…C¶\w¨‡:³T»Jçugÿ EØyÏÇ» ³•%²kÇxè.Hëªôãdü ™žH µ×Ü»nʆ÷cÀ  D¨÷RŽZ.†mwMh°­û)6nd[ ·»£[ŔƻŒ¦€~B4Ãc’ŧDóB¯Q(õ ÂIzå.ç“:õÊ kêzî¦qÎYžÝ×Ywb8´Æ[%º9™Ï–)`è@¡yz:ÍÉ—Œ›‘•ßü÷ýŸœ°2²¨é{)ì¸.vjs}$³,¦™‚ ò¤­0ÑÕÓ|õUô=.Ò!GŽ–ñ-×þ’N†Äƒ„õXè‰{@•tŠÒ.5ÓÐ\ô\^EÁ¬lÔXVô}­ÜVuî耮m<\Ü|9mRàëj#F=Œ ‡2yïê=*!2#²n†Fû¤ø}Ö¦R´ÂâìG‘Ђuörµ+ô[1h;´>^ÑÒÖ¡œÐíµ9Qú<ͺ#8>ufœ¿î÷F|3ŠnI#+YÇŠ²Ûð3ÌàHm¤X_P«¸@CŠ5à?`UúT·)k¸ú¼òQn圦ÎX æ øÐœ]ÇÈ`ϺPD³¨E/q¨•a½n?v«‰Ó„xZHýð×¾ ­ædC”G?ú3K§P„ˆ‹À•ê£ì5»‰Mf;ÃQ9Q7¾%ÚÖ›@а§a71`÷Gq‡#h/måÃÀ3ç¿%×Aɧ(Œ±¡Ù?øŒjò]¥Øº,½!©NøÐýß"àËÞa ®/¯ùÅ0lÚÚ#€À»cq¾# -aô½À¯‡žé!Ä8G.¤Ýü…‰Jƒ×–`›@x¸šõ¸ÿ6,mðsû'Íõ‘o2—ášAg¡‘ÑyQè‹À¸é÷gve_a)UTŒûdYÉD«Äy'…ðÝB;êh1¾í²ÊÍeH=qëû`½¯D2oƒ³ßwD…¨4<˜ÉÕ÷ž I±ŠÍ ?ŒG—BÏ¿¼¢BÍÛ);ÏÑÊ\w²ôJ øÿ~¢›ìt¼xM´Žéíø¤Œ×W½ÖmÙ+ŽiY RÜíPåœË™ºj)„ÆB ebz~™jÌI²3©ûñ[©›¯Ýde¡ÑŽ!~òk§†Z]ƒº<Ô`íÍ̯ÿ釂”#w³aKˀެ1ý”‹íUáÍš¥ @³žõôƒæ¯£š·?OÍGDØBïÄïŽÅ/´9JÌ9×öüÛvgaZ ’–wE¦z±n]ö\‘Ѝ4¤ ((ýÊÚuVysÞê-T;òs%|“ ¡ëeoÕŠ(¤íŽUE’— :–ÍÞ'Å®|ç«;ª¾Þ<¶>úûøJêþÕÍ­°)Y-§¢ÖŸlu‘ƒä‰gSp6v†'Ó0庚~ßIbÂ/’±¨´ ɃÔ%‘pSª€‘Ù&EégÀ iú¶'Ëu¨‘|¥ ÍÁÀ|–xòÀ>M—xÖÕ¥êál²Æ¶VH­UýäÎÔŒ­µi+Z‰ñZ§ÝY @dsw}“ÄŽ/¨‰ Nô_[is˜íŽõŒ5èÛdf®“X°X‡FÞt«`ój41àÖgš®<â¿E”­=ù„€b…t¸B~~a=`bRÍÏäiÊÅö×uÒ¸È »XGÐÊ  apÝ;'pèž9À>®ä²@>M ˜x5ÚižŽ<š‹Sé`±­Š½ÿVÀ¦P¼›9ŠŽtÚ&SÝŠ¡òp¯ð@ïö]¤H–:gWÏ@’.{âêYWï+ÅAÔ\…Ë÷ð^#¨ñSÏžÓR_e‹5Ö|aH• ·g×¾ \‹åõžÈ[“òi>AºçÑÐÝ©H2Îr¦A¹³(^§2Lù::“ò ñÄÙ4äÄ+†à~¹s>.Óñmê…f0ÒÖ)éuü8²/£Ç¨¾›xÛô¥ÀzCy¸u‡øRÅsü·e=4ÀöX$/\’7´É|Y¡ÉÂ¥òÔF™ðÝ¢l½óvMn:;<7Aœ×ýÁ¬Õl¶b¹Úw æH•ÎÔ(ÌFù†kãÄÖ[ÐÖšM?úèBɲä“pG*.ƂDZ…=ò0DÉÁ¿Gl"Q/2îŽL³@¤ú0/ c}z%Çá]Ïε‡áE%hƒº¯­? aR ¨~-7k ZŽ[éHz¿N’xl“éNÁáËÌ?lN"çâé²UïÊ ¾±ÓY Íj  •¾5åC[mÃ$Q¤M© OŽ5&¬r=°–%q:)«•}Æ-·üFÇÒØj8Šžd#÷pwÅE„br,h­/oíaFHoþÞ³‹0,°:âÇÞr¦©‰©H6D¸ìAºKáÜ󾀦¢ q4³©ˆ€oºå›OM#"œÁáƈý :R 0ÍpõÖóÁБЀ©O#¡ l¡·¾ù' {N~-?Kêþ{®òÿz€ù±"ØjÀŸN"ÁÞW’Hû £#æ2ö1®Ûë§Ui Ëj眷âÀt´‘=#ÿV¢-G蟵)§)öm_]ÛÌm£@õä’~Ûd4„w`´oægM‚‰^7Âß绩RÏ’ÝÞŒeõGr|’Ã-|§À¿ìƘú,ä¤YÕ ªÊÖT"ªðôX£8æcbÓ.G† n»ZŸvN£–˜É¼üð}¾³… »áÚ}*e à a¹-ÂÙˆÈÓ‘ÞÙë!jÿsÞÂ;%y6íΓÏÏØB~~ÉóõÆô¶ñkˆ¦€Â_yG»%nÑ‘Gÿ_lÜî5` ‰…gÅuѦùÙ™ô«Õƒê”šO|©§ñ‰8ÜN©ïé_å§0êÆ+òQ¹Uj榄Î%3%m”û?U4a˜Ë G-&7ÜÀ }꺃ú*-ÊM5’d‡Ô%¾o!$ÍÏø$þ«}U¨4ü¶ýÚý2wþ¤¢_PØÖ®–Ð-;®L]sóá’LL,áxóÏòµéÃQi§ÊÄj ¥`<²-š0ªjë6¯‚éÞG&Ø™)œç’&úF¤yÓ ÕÃuä N.¢ ‡Gÿ3R¼¤¶PéU(˲XƉŒO¾ï@Ẇ~B}ô׫FQßÒ&Y+#ß`“•h |ï{¾øiGKòúõc€](4ÑÉäßß3^ŒH]M Îõ|‹˜NšÇ“3 £p?D®øÑ›hGÊÝ÷_+§“ïñ§•Jgûæû‰°OÙuZ¡iwyÑ…êQ™óé #^¢](Aö§šíÚ%ßu¥úÆ0·«Žý Ò©UrqA÷Ô¯cl@P*Rž «ÌÛ8jÖå…“ K‚ÕÔ5 Ãå]=©nE?á+Ñß‹q)`ߟ§‹t$$à*1Œ\~‹ÛT#Ýc ÍôÌØ[̎Ǹr3E mFb¼(æËK ÓôÊw œáe ÛÄ1h 8¯#^s©™DÊØŒƒÖ¤ ¼lô‰á²²­B&éi„&Q“’zîá¸õDpU;CÄ[Ó”ÓªÒ¢¡JF#QòlÖÁó;î9æ¨úî·²ôº~½œdÊiHÑÙ¼0ÙY+P¯â²Ý«´x‘"(½ß[D¢„®1,ºJôŰ3ÿ*2ÀNÛ¤¬e6YæiÌUmê˜ešx©*Æ÷“)J&(…*½ê±üÙä*>@³ áb1—Ï8›êàa$¾L®§Z]'aî‚ é<ô¼ž]â*5ï£:¯ ö,„÷"v0Í(á"LÒ•Å¥cîOÃDðáøué ¨´rEQ×à‰Ž`F,Í.Çöó$A¶¬+6kв²Uªîç‡`y Bu—t¼æ_?áÄ@Rª]÷Ä5˜ùÂ,%‡ª>“ mtÌ9› íZBB÷¸ïc¹SÀÒТý€äY¾N·ûÑŽÛ• |M‰ý Êu`³@APØ\™ˆ’\¸ç²_D~ h¼¶™ËHntþú7j¸‹UÞãr…þôP PX6?>Ÿ/ÓÃ2®½¯¸‰ë‡ûö]hû"`ã­!gST;ÍUÿ ¯ë}H9Fž$ïT'óP£å‚ç‰lD}[ÚâM3°*ÈcLô5¸­:*Qhv'œA[d ¡1ŽªR½#ǻȳ¿y„fâcìfú϶œ¬c[TbDûÑ'rsä1ê¤-X•~h¨÷:.¤²]7kÚ«öˆÝdVF|9I`ñs —Ĉóσ ýÍ rò9œrКñ“×ÎÈs¿?ǬÇEÌúÏ%bð¾;Ï|ÇYسÙêgÜjL2% ]wh°·®õ‚S²hGþ[š¨ß¸Ô™õWwˆ]í®ÄMºÒÝF<~Ê( Ë“³AÄlqš¤¬>v®«?q[§T‹ìÆÈµ>t;ààNZ·ä4W%W1†‡ß—pJ¼qxöñ¶cÖ‡H,°}øç¾_Ïß±ã/š=õ=«Ù5˜Ló,`]R%¢é±³¨{­Áû=“ÜâWÉIŽ1¾\á¿Ï&މ°UשéåB ÄQîíf˜†šIäHè¸:2ðâ½Ü½¹]|#jKëy²ÆóFJ2l2à«üRuÚk1‹…Á‹ìS”NN”13ú5µ™H䨇!ÉFî@Co ”ÄAöߟæ¿`P‰Í–~>°ÓÐ,ƒàg¦ôûã›.F¹vµ›ý]·¾ÝäòŠ.ÜÇ$¨Ó·£‚É|¦ã;[+7×35§gRÂ×_’¯Q¾í¶[S3ôNàåpQ€ùàŠ'ø¢Å†KÊ”¾Q;²¶ävÌ‹•™îauO å’tpÌØâ‚ð8MªÄÒŽÁzÑÁ_½ö—ÀM’äÿfa’:_¡Y°“àì=#QüpQ¼‚×ONz0êzÓAÄDê^ÅTáæ£¹‚Â~Y£e[7…y¤Ï¸N·¡¿›Ê9fé÷g7¹SÔn,g¼Ú˜ê^Á ï -|ɰ¾JIÓF¤V}1–i^ž“u¤¶¡óͯ—OFÉq‘Bźï5ˆú÷Hç`Á#7´Ì˜². ×Añ[ Û+ÚNz{cB¦ýÒoã„[òúúê7­D:~¯êröagÍØnøLÜ6Nnlã~yë0ÞÎ3ÏÙˆHëÕ0U0& ç„5ùgzèiÜ s“vÿ6ŒÂ½&×…òUži±éhJ;‰¨Îä¸2‘BOž‡ü›4Ë/bA…k"È@ç=œútIæçjªýi«Rsƒn˜ Ûµ»‰zû2ŸÄ°do–)'U0Ú]•[‰þ8íN) )’· ZÀ߀ÿ26{Š÷W#¢¸?ûj3V0yà^*jЕzkR tÔr&5²)3ŠØ+ak¶k‡Pu”pUý¥a¼NµFž»/­Sÿ'ݸ2A÷ðïnîB韘Ì9·eÀV½`‹SMVbDqXÜiXט-µ¹ ÄÊØS~a€^$B×K%@‚“¬„89Öˆá·ð`û?K—U‹6ó*ŒÂ¤þ]æ:£yϰ=·M¿dc^?÷Õ)¹ K¾öY@+¦ÑÑéèF]ÿjÀœˆÑµJ‰@=j=ÌiÅ]bñŒü™Ÿ ÐEõ Ú—€úŒt­<ô"ÒˆU¶ŽàÿééokèÓ~bÌRcÉ[œ2:N¹Ló¡Sç7òǵM#AÍÀúfƒ hu:Ï…Šuÿ+]]¨(Úˆ/b›*¾¹“m©bØe1pClTí0Äñ^4þ®ÓZG†Íòy¯n©âÇêÈZÄ÷Cãôgl°´š=>ó.'à=I b¡ü¶í&úkt]’â/¨×Úm¿LìÕÖ žYíRgŽ¡kVï(­öQ5i®¹º÷Z2\c¡‚ô†Í„;ÿ$úÛwÕLfè
ý… a£UŸñ'²˜£ñoc”•9A¥åa°Xã-¦¨wšÿr:ÍÒãê'n.iÃÄËC<ºóFå㹿ۤ!¨ÞÍýAs6ŠBTÃsEÿ08QaJwnê1Q¾ÜèÜ R|ľÛÂ÷qTÙÚ&­²ö‘wã°É·i¹ª¿ØGÖÍ‹jòa`ðþóÇèuªpWgVQ—_Õ+ öÁYª¬ÅÜf·?#.ä3Nyî°Åì±Ó“XUÂ!΢¥ËâdPÁý„;œ Cvu#¦Ý̂ͪHê^IS  ¾Q«üºKArÐÉ—_ ÄÙ:ùÉ?@O²:pü¡Y½ðW`VnAq{X~™±£- ,êQâáÒYÃCå^ÏûS:§Jy1iÂ.”þ—¨ãg#¹ô#?uÍ£ø³ÞöMY—ºŸ¬k/+×N‰^~TH&ÂkT÷€^hÄÜÔ{ÛJh=‰ƒó€ëãáé4¥zíÿB«vRzP+¤­æ>ñ·TšF<çðên ÊÌ×"ê%âÚðZóóîO—1rÓE55ëõöv6ö‘ZÛ}/¾¿—)9²%ÓÚâ÷Ô¸€]½5/zÏ‘ŸÀg3×É&+|´•ÇÅï T ˜UDAéß5F¡k½Ïç[ªw%‰®œÑwetõ2Z®vf†÷Ó÷ƒÆ‹µ”†‡æOW:X)žpŽÂ¼ö¤Î»Àö•"s^Â#VUnœ±¢çéæ§‘^Æñ“©Dòî;VÔ¡¢ôH<]†,öÒà%~ôë°ñ­W|XìˆÖ}PHP‘Ù’ÇÆ.ö¹ý9h°Ç¹Éa%UÅýûKÔ\'?óG&õp ÙçJBÒ:$Ó­€°,ÿ68 BÇ4KC¥`_m•*ª[MžjVÏ›J€˜2ÃË·_“hY•ˆô RŸËÐíEäVëOM[Ùâà’›3­ ÞæysµÞ>½ã_»ƒâPö †„ò0d™³g›Yܬ›\BõuÃªŠˆï«*Üï‚5T×|Zìžð6É"æýrz·÷àF#çø’WÈn{‘±Ñ,è:­žÙ’ëu8Ýlb±kÅ“6ÐËM5ß‹ëA:X¢ß!CéÎ÷wësXùÃ;8XqjöÒíàN#ÒAS*DKñm` ª(Læ§­+D°[!"õ=s±¹°Ð vÂBs<Äâ4U%ˆv  xJ#þÚKÇWê㢧ŒýÇhqÓ¢ «hŠãž*ž©HuÓn;ÍõyÕmÖµ¨Rb–l\h*LhY>F³ ?·FY±gïß½ˆct>WÛ€*œc†^á0š]Gb°Ÿd3˜H+”£Ö?<«A|œf^„Èõ:•º>{€¥Wep(ÿ"ŠÂ8,Zû™‘#º¬ÒÇlã_ÍÒÐ%œC]¡âóáêÙÛçηÙg|Cš%øwGÝ#R¡|¸=—OˆoX=±/ý÷­¼ƒÅUÓè¸í3zØÑ~z,.’l-=°Ðì­æ÷ë÷y »#uõM¾§3²Yº ^šû¾ y$›w†ã“Z¿X»iWèÍÈôɬt×JVQT²~ˆ ªŽ; >a (f¿:?/êW[;_òÆM ž¢ÿO"áþÍÆa¦TÝ'¢ ´DÞÖsoq“•hå*jiðð‚¢>íÂD2‚k‰´-,›>¡ Õ^ ˆwé¼Ûd[š)‡ÅÞ%õ£@3ÿlZ‘e~>j _‚JÊ2xtú¨ØÎSqæc„öÕÏ*×S&”«WŠsʘ-HMß¿ êì1å¥(Дgeö¬c*ÌIüÇn‡Ësp=9 7… ˆ†EìwiÒ)þó¢!¢…E×£­•–¬DnEdêˆrÔÊLn"7å¾oƒ€¯- 3gf€îK7Œ1@E快˃n¬£„LUøIn›-—Ö֞θoŸó†uéภΡéwkí§õ@f-=›¤XÇœaÀ2Ö:BuN˜*é($†Tô4¿×äaèötb[](#è0 i>>ú—Qeåù å{«þçuPh³T­[k)©4ä9í·„^ÂpÙ\Lâúx”O!½\ÛÕR2¨á»¡dXf«æèjŠVßP+È!`Ûq‹´°˜—aޝ'-`úTk£á7®Ð§Ÿ%ö™4*ô,÷»ž”’Ùå#“q\ô±¯à&vXƒLèê WCÚª B° òÔª,奙^M]5ã‘l·Fοo:JG”g 2 E±2µÈe@ñx'ƒÏFÏ^XFê"K ÿW±!è­B’wr“àbjЧÏÑïˆ'þgo~Ï oÎ'uÜ<–a–2ì¬<›]Bfæ$;¸*\êïæèJ¸ §JÂö-çeu›É"£-†ø½ÇlÚÇÑ~Ûä»òjêû~-ó‘#WÌ9 [ìhæ°'R4bþq´zŠd÷àQ«Úu8ø”©µuOÿ?–¾Û 5>ÎYf‚S ¬·´ ¦Ç‰~U"¥×Ç+¼¦Tÿ ϾvaåÝ\J§‹ríØ €«ª2¼$µ®^ ? ’Ýî#‚™Œ€íòMT0éMÇy±ì¼ñDâòZ¯å h)Ü-÷k¬âY}^¦·2»)ç¿â1–2ö8·#®‹-˜’I•&•Êœ›v¸åÀñöh,7ÒTD“>y¯®z“·¸ž!ª†ïIÞø5ä´ >E #MVï#ÓÔ«!ù´+ù;ð”N5èÐýKÛÝãÓ"0CVùÍæÛ¦Sx¨Þ ïæë|{iñMä,¶£¨¬N‘™)T§Oß=ª‘ù0f¼°ágÇ®vÑk´qÑ·FG¨l;f‘A~aÏ à‰1,‚ÀlE¨ÆðÀÏÊ3&Í¥@w¯B‘„t2ŠÁ%˜´¬fœû(ŒÕŠGaæÃ^P€ø¦XDCTà ö;¥ÝtÊ\y¤#D1QpÎI`œÝ, ÊNd,F m,I*r^Jšéí >ÎîÂÀg~àó7ÕäèQ; äª;þ{?j÷‰‡1#4y-ºq~%¼jÚÀâ3áç’Š *ØC.2¥ÊœÌ²µv¡”}†Œ-ósNaìS%L‡ ³PÂK³Æì ÙÚzJg‚íÅOi £Ÿ±¨”c÷تÞHÈÎ !$묭•@ ñoT÷4]oc<¤©$Ô…fnØ¿õ<þ±vJ ܹ 5ðAïJpyWþ ›‰,CD¼×V ­®¬§}ÐÔ³BFú¶OT?C¿TM\Jñ ¾Ù$Dw3rüúÆØ:Öyt’(&!l£`†}E÷äW¼£<¢z×@Âp4ÀßOøJ²›Í‹+@É—A¾Aõºþþbãˆû‹° ¾Z£;Få%<3ð‚­Æj®²úЇèK~›6 •ôYÓj÷°¦Åßó®)»V!œmD«aÐ>`=ÇŒ€Ëµ±p“ ,'DEqªÏ ÑN7,| Ï<ÍQWd”ƒÙ§[«œ—½Pê'þ«ùÓSLÆ2J¬D§¾”§…~îfÂîãñ¢XÀr6¾"£‘cB,…1EC=­-I EÖ~ ˆ‡a×ÈŠ…4'íøeè+ôµÝ³á ÷•Ÿ³ÇÊØ¢´ _aL©Ž9 {[>i\S†ns¼eŸP‘BPBw‘> ¨OWØ"%iÿ'G>`·çÔœì_Z·j¼E¡X8Ÿ ±†âÆø‡xÀ¶êÍSB?Ê Î6ã)W¬Ö¾-s®N:Jëåûê§Ñ¸¨éL(u¡®cªž;¼ac·f‘M7_n¢ò'UµÙ4Únµ¦£F)IJמmVþ¬]Ïï"YÞK¦ ‹É¾r…õÞh!‘«}Q)Œ:w#¢áV#ãr´*îdŽxã„ -ššoîh÷ÖóÆã\VB6W-­EÕk3¤ß•Ù¯G˜¶Ä“üõœ‘úÎ`´N!:ø¯­‘‘A`BilÌìñsÔ‚Ø­ • ΈéöW%™Œ=PnÜ?Y’Âoj¬äŸÈåcû³…kËúµ‚ƒå­_×±üŠ?<…°‚Y“¶<%óëì-ç(Ù^_.äõ_ÍÇÆØÄ .ýüïšU†«/ÿ5¸©?õp„Eõ®êDcž£]Í„¢˜Œpq@NQ‘ÛH´/(+† Æ‹‚6JóP¸“^9{:ÇD—Üà&¯«Š.I±w퇊 `ÏÄP'¦˜:í~a +%ÁðšQ5ÖR}0otP· úa ­3•å@`ý²•ä—¶š:åsS ( ¡ïu瞈2v^—¶>=~æ´{ÿˆØ2ÙÊ,|ä©Ldƒ«oQ]šQuÇ)¡j(lœµ|ç‹‰ZwÊÝíÿP;Ö–Ö&#Øo|×åqm“âÄ4Œ N§n‰ ¢p!þDO=<û̓}‘gIÓQ Œ,¹Û½ÌÞ ÚaWr*Ê´âAýܤ°é­Æì¢CV¶‰V¸j¢H„Ï!(¾oKÌßjÙIÛÞ‹XÆ¥ìö—çq_ˆÛm ø5%•cãÌS8hîhµ qéÁ ÚŇò À€:ÄÀ%Bþ4ëY‡,$þH$6:ÍíÝ.DÅì ¾i2ÿ÷ZÖ&¤Å2G”Z(Ës‰ë`d¬l±ƒ-Ý{Ö“ÄHw¦-} T|ð³B°DˆÑ W"(ÖgŽßfqa#%•ö™•‘ûp[ö:-ŠÁO¶Jþ¶i¶Ízj7Wë :™ÅöÈŽ‹^ð‚3›Õ楦#ú»zçiö4ÞVŠãÛw)·yÕ’°ÂZ:ˆ/ëÜí|6é¦þç%ÿ&°‹I?+z˜yPYT“65އþÉ´ÞäVŸ»ÕÎ S«||.ËÍ`’?)á'˜Pù$Dêð|3ÙÊžÔD~§†¿–³øñŒÇá±qøjÔ~ õ²k`=¼@Ç_=òFý 8!K[cŠÿ~VºÜý¹¾ËŽhü…ËdÕ {˜ûÙÆð­»¹¯¢–Ü_/GªÿW.ñãÖgí¢¡Õí&D.žZý¤?&1wó¡E]Q ­Céà “]d½úò•@BÏòlU¥!j‰áêGWAkuû}¯=¬ñvCTìòòÓ]@ãÖÏuñx¡$§ª©¸œ•œ`(0áojT(%€¾:mvéÙpY´cG|!Æ/\6iD=ADÒXIK¿"‰3ˆR~Û‡•³x^.c³ôŸÛ®D}Wº©µÙ#xØÿCçùäJà8ÇcñÂpóAI•²(ï_ƒÒ›à4©«—£ÂÊêdŒöT…•šTOÃ-¬5 ãR¢‚Wó5ð!`@?\ͨSa‹‚;ýIRÒh½-a[­CÊ|•OÈ–É9J³&…U?5–?5›&òiYxcÖ Îë Deëþ÷8]gWÇô¦/u˜£§Ž}­9l’ŠÝS'&@ª°ö5SL>»gèô{w2±^ÙÓ± ÐMqd;/˜M‹bêz¨o4bú‹7Žy~CŠt¡0VÓ–b-’U…š°‘[].ð­¢Sk@D¢}*¦®öøBÞ .i_ ð ÐúôO‰Hù.Ÿ~g²hš.‡»¡T#ݳŒø §€Íж 'ŸÏ$6n ¾Pîo Q,n$Y‘8­?V·:®nºî¥hˆÿZòZƒ¦Ñ½)þ@Ä•ÐMþÿJéƒ Åþ¾Ø‰;‹ª§2OlI…Ò _ûUQá™Oî§­›¹Ñ:µ­V”fŽÉ[Ò@œ_¬ÓölÑÕ D¯K¢ªOåöÁÍv8(( rï™GC·-uVL·‚tX¬Gýãá;¿üžFz&dL}áLßîɶÛmê8ð z@!)”A}Žõž? ´ƒ?ºhŸ‘ò€Ý•?%°~%-œ¶—í*ÜŽ)Ýl¾Ê· > ‡àsT«µ¦–̓â¬BZ{”‰)1—{LGÑW¡…‚’µ–>ÂKÙu"-èaÝÈCÇÃ"œ÷¬ÂÄByK 9tßÃfG)?gcíÏ(Ô€X²iÊ_yAçé@èꥺJ=à¢WÐ+Æ}Àܽ†ø¡ÝX6àpÛŽ#¼þ)n™ï´AÒÄOù Dcù´³YZö~À}_áÁÎo#xq“3}+¸9ÑLC¾: ²½Düu §“îíƒ3&%9m¤9®á"åö÷Ó}½_o¢'ðöËíô¾Ýñ¾ßCßáìa‹íî¶ûw:û{ðþ²ÀðÂÔ)O–Ô#3E¢4â.Í«ö¬ §uƒQ’Ÿ é±kÔÓÚ@qVK!s"@ëãú®ž³1 kReêíGhÜØÚø¨ Ÿ ãJ;M‰Ó·J7—§:b*;Íó°¿žççÛì¸_e9CÅHžrŸ•M©Í³! ocþoÚK¶AÒ)H‹€ÿOÊœL½‘£*Nî}´ÓZ=ÈüÔ~µÏ°ŠY j|׌e÷ò 8MýÐàiˆxŸð©âÛ×ø2±ô°‰fëu7i¿áÅKÁ ‚ŠnRü7;³IL¼ ]=/«ÆÇTlhI ‚vÃKýÍç0úÒzê.Üû9nrŒk ëV{x±6œ˜‘ü ;Ê8ž–û³õ¹+‘J!Í6LUQGò$¡b°&‡ð ôó Éö}®ìÆ•Z÷ê[þþÍ‘î§÷ôîµö“˜‚ã bÈ RãðÉB ¯µE4uk˜Ïs¡›ýöÔêæ8Ø ´ÔQàcqgö0T+®Ž·9eŽÖÏ™žMÒ»Ð4[b" û#ÂÀHzÉ1,?¿À¾[É=®ÁXËl!P¬°wx)Šž ®ù·ÍU”(Æ…(|T\‡pMQ`¦7¹q˜åÞo.K»ÑÞã¯ÅÁ›öRÇx\÷Œ]ƶÙ׽ðff í¦oîGôѺP}>6Çæ½Û0ò¹¤n»vΙll¾V˜w·Àï|Û=|š•™!ZaÝΚ8ŸX¨qÙ1IÅ®¶`Ó7„+øƒŠwÉB43> ÐKÅÔ?ëàHg_óµUšo“Þ+_ˆ|ÍóQË ²©¤BæÍ3)U¦NÒ¯Z“Ÿ^âjY¿%}åW@˜I!FL0¸LA…ýE'¨M@Ñ"=š{©n´òj ŒFXÀÅõQéý¨É¡ªßE8¨&WYj­äYZÁ¾‚pѶŒé qã-ïå ùÐk¾ C;¤Æ4Æ6uß«%BâuhEXsûŒfŒ=~¼nHwÅaSž¼¨ïx”'˲h:uÞL­ÅFím3F’f몊'iy\G½ãÄp?-Dk£2<^–ü}¾x‡ q£èCÊ.¡:é<ÙÔøIì^öÚ¢©ÉŠ)w,IÐ@oô}=éÑ] â£cø/„?”àunî¿Ìó¸½öÜ–ê¯;íŠÀf£mg¢ãàï^ƒä·+¤|ÈPÍÂR\±Ö°{öÙ£@­¹øÈV¬ÁÂ8¶‘ÇãKRiP[à Ü®À#!âÍqfk¦¸:S»ˆlæ±’F‡Í2„{±Å7pºv÷Ãàòk³‘wœÜ:a7 wñÞfRTa]²]cWÚ(mÂ_zí;,œlÍ¥ÄMÕµÈNÄúB¥m&øL·ZšÂuêýºÆ&mÊ%!]ƒ0ùD,;ª™ÌX¥½Þè¸ëô@‡Æ‘¯Ò,” MÞEˆ«³h3üc‹Aknù"„èuØðͪ¥N]ºm£©e D‡—æq½òMAœn3©Öô¸àè¡UUåØ Ü\?ÂC¹>ã ùh…Œ«ñ™×!ñ:ŸÞ³YŠGígµÛYå½# ù4O›`ßrXÿ8…2Þ?5âÓµ‘o“ö8wðD7uK^¼oz¨%Uñ€ÇÅ[¥§—Ž÷•¾R?+Ú¯() ~¼þ´‡übô¨Øs &€’¸ñVíÊMÏ@ÅF{ ,MBÍêâ‡Ôi b¡?þ°CŠÒÎÔt˜¤»¢wÄÏà—XX9€zó 7c<†>a?â©„ïÞüt'Ñwˆ%hÏSh’AwÈ{Q]é½UpëÊ ÖÅu^?è‘ø[´µ¿¡þ18¢X p¬á@£%ÎìÊ0›÷pøG1Š"W»:´v­ð’•C«ÛkÁ¾eÅ0>­á6«È(=õf¥üý9L'Š”¢H€t"1„XÙ `n‰"í¡h0‰>qЙ5 t^S FFïB¨øœaºœ5”Ýaj7VçÑ/9ªÆ^p¸PÄxø¢ªz³WK.Ôög„u¾€mÊP:ÒdµªY”<ÛYé ÆÃºfJœäF›¨î¹&Nȧ©PÜ—\TnͲò¶ÚŠüQ‚ =S•¹y`¿è‘Ý «¥Ýc®ÃÚƒè)¡ýÀ#Øz8¯z‡‚Ï ¥Ä‘”ŒOÂ}¨X²¢Ü:Kñ=™¹o{?™Òêa'Oi½ß¸ˆ|æ7/3æ(®&ôk%Z— Ó0x?«7(¸ãÿ'=«Ì oe˜ Áìæú0âë¹²÷tÁÌã^„:…9q¼Øj »u ?Øß ´ÓH¼ŸuDÁM&b?Ç—tŸuŽ)kML³VØÎp²õmÙ/æuïX'ûÀÏ“¢å>í±’%ë@£Û5ô(ùGXÇpÿ )yU'éwõ˜¶!Ù) ¯˜”AêøÌ…|²Í–=£À¬ìQÒ¿$eè°eQ hÿYÍ7k|ù êÂ.ÛˆP!gN´ÓhK¶´Á  ²£ÙPëcm:löa„ÔþŽó©Ë[†é»}¡ƒ²Lf³œ?¿ŸŒI„c4F©ã†J½{>ôâÿp`<\"4£·S\SÉç~­âòw@Ê…—ûYAx"÷wbÍÈ1d‡ÙöLF´™+]«vÛœ;w ‡þfg8@‚›ýçiVwìU9Ñ.]-Ó.¦µè¶Ã‹pÀMò,Sa>ú?»¢%ÍmˆÌù;fÞà Y|u*_zߺMx±lö¿'ñ´P̽ ™´,€”Š"1`Ëäd/ïHïM`uE‰­eûêæžåª–@ øíû=æ£Wˆç»u¬>€e|ªêïàcŪ† ‘#ÔlNyñ“Œ >´­3ï=úda¦™(¯B†r:¡ã–wc¿ü¡»Íކ’—¬éÒF bì§€.gøgÑYyÁ{X7n (ÓI³\tXÎmNeðP:žBË&‘Ë·¨uãÔç+|´æ:è}¦BÛƒ‰þÄÑXøÔî,äˆG¥-Ä;Û‹ÿdŸŒS–6bT}ý5>uR`!áêe¯¯sú oÌÆÕú>Ÿßy®B>…þÉáLü¨¥Ä†îÈE<3a™A«®ÇxÅ{WtÝC«z"Ø-SsµQÅ0÷xììСQ†Bø‚`7|Ö:¬ªí.xF€ß·äΓ/8”õYV‚Ŧw’“(zó!ëÿƒ«ï¤¦&ë\SÒ"«ÓÆ´›¾hæý…Y¿‘‘I…\c'ÑrÝeDät8€E¤EÆHVK«áÂjd”¿%ŽÊÛâŠuÎ|R¸®ì†Z%.@²õ¥ ýÑšÂp½y*¼4ð¡hf´\}–ßcÒ6)àR?Bû ZúÁëÏ]D-ñ=Z'Ç€æ’9ŸÈh²ƒjÄ“tíã‹×ì;`˜›DÍøí€~|0]jTåéÿL_5$>·/§ »i`ÿ4êž@*bC žÀgÓÅÃGÁ‹óËÓÝ>0Š‹F˲7íæþqþùßnyó|.€ýñýû¿%4².zÄx6ê.É`TyR‚ô³¸^}‹8Xl¢,8Héu¾õ¶}hž-Ï9—‡b^× p<ÝË–ïašzÔÚÿ)ÑC Â\iæ”Vhwº#S“.yiJrØk?~^ yýK^[hö?ÿxo[_¬Щ¦´e¬( ­œÒ)üêu§pK Ë öº EFXéÐÿ‡X$c©a’d®Þt%:¸ž‰Nýì OžB*cBpês ß¹A ·ÿãÛ±HÿTÀµÒš‚»D@Ï”J\…ë§<`ž‚ô«´Œ×¨–6ß)'Eò!Îü–V1¦¿7I€öá¾^”Ïêl÷Û5*¨Ûk9°¹Ï&¡¯A†@pI¹ûî¿¿Õ„~¿Ï öòÉåÇȼ­h¥ºåFAÙÒyü S‘¢ÑKrîgƲ°´Ò^Q$É–Vø‚N¯3!U†DR€ÄõŒžöW^±¹Z´ @àº$Ö»Ó¶ ºúí¾Æ1ŒcÆ1Œ`‡5lÞÉRÓXùMÛ7ÅÆk·Ys}Õ3ß)•e¨ëéBÏ“Ÿ-•†ÿMë5ù‡’µ¶g á`?3à L©µ ipä Z\âeϼcþe,Aš3K({䥓&¸ŸW§êiË/ €È¥³'m\×—£´Ê÷–KzúËÛ Þzp½ òµ,Á {ø4¥œ´-•Òy¥âàãóC.Ò’Â’˜c4ÓÖù6ŠiW§XFfz7kš£dŠÝ‡Û.šp{2)ÆC¬}°ŒRrÌ ‹R‰¡¬iÛ€ÁgÕk‘=4 Pó’T¹»!‰RŽe»¨L˜¶.g6÷ôk÷óЧ;š¡ž{éâô!Þˆ1M¹óö’¬|&ˆóŽ× tÃ4±ì0ò²†Hƒy´]€-ÌÝN€Tlš–íðD?"i‹ZM8¸íƒ5Í=}[צu¸¸Ü©ŽêOÒL¡‹•à@ &å•ÞÇÙ\ÜW”YÐ[¯šûXâM'z*«Ÿ:Êæ&èŽeTà¶ ÅÆ5–V»Vœ+ð[Ù—kÄZp¸ rCëÔÆ´Iel°Žºt'~’tñQ~î‘ïᯭ–{O³(Ù¾Òßóö{·»]÷õäÕ-æãR´í™\.Þ°)ùâIçhÄèõW°«‘;×öÞ”ù³W]ŵþ ³ç}mü]Û{¹dÂãÆgó uü Ã,©ZUQ4v ¨»¨Uˆy˜|—/Hh!:êbš@Dµ3Ï4çòU;ÈÅ£øylNÓºÓr;»X”Bâ°]ŽèGÜùõsøÍÆdš%!€¡gtL¼©²Úÿh½A¡-w%/U’A’f‡M8dÈ©_jåT ~1™…éÉ/¡Ò¬£ ý˜–Õ»>ó!Иzöp91Š‘?œJ†&:ÁðßÓy´[Æ ­¬œluiTà.ŠbÛŸ!ýÆbŒCãpë­ÍëxcôŠp¤™[ïã³aP˜’À ©üÐŽ:©‹4u ¿BCµ•é®Ï?¥…°†fo¨e–²`0EݯŽÿqõÛ1_Èú‰æ¡o;3̯K º…nÞÕñ§Æ9ê§WAJf”ta²Ñ®Ë‹ê|Ðh“#¯ ‚&^«2—ƒôðÛU¼_ae»¤Uì”cñ(w³„m;Œˆ²V“½àPÐH5힯B’Ügßd

ó!aûN øÇMÙˆ›å›£îš—¿:ZIÜൠÉ5ix´Ü+þíY1Ô÷H8Aê7ââ‚›p†Œ¢^¦SÀN¶øü¼ÍÉyq•AoøÚCe¤|¸Þ’@©éRÈ„Î\¤É2l6GJ q%ZàÝ÷ú¯¢þþuÚ®úÌ.›-Λè†9{®i¬t‹NšÃS‘uö_È ÑXœü4ï ¦û MŽ›Ë}! (F¶Ø¾º¤S.wH‹È‚A•ÚeèÔcóe!™j1‘NÒ›9M@9WOD㆞¯–š=LÙyåãó¯ŠÙWR=H~éj ÷’bH|ŒÄ$øNרDç\»é‰Ï9¸¼vU#glG͉›56uoʱ9ƒçô•éoŽ&{‡D„"&,Ò{Þ°ÁNº¥ ’<=ÿb5ÝË7” Ú…bƒ~àœ?`áÖªZýnÿa¹› åpü/ãœÙ¥œ4X6&Þר[WZ¤ÓêPý½xPCë+}êþ‹)ë°³vÚŽª¬Ë5~?Z#R.ÆÎú¢“¥7Ì'ì=ÊȺFPš/Ó K »_ÛÿSr“¶ö§ú ÿ Y ãÝ7Ô,ðÏÿ$À¬¾{àÜ/’ðæ"«Êa^±DÌÂ¥Nÿ`ÆSÜôàrÞ„àaö0>¢ßX§¿ÕÐQF˯U=ž!ib†Îã,ªÔ¾£¬Žö.ý¼““V0›ÄÓÏVÃ+É—ÐE d…l\ËPÜÿc*ª)fg²ÒrÁ-u#Þ½6¨ °ySùÀ]ȹ5–šRZ†$È©æóVçCVv"¦1„ç/Ûó”[ô¸‹ýãûbÓÒwÿ>iàåòœ1ìÙwbBºwqÍ_µasôi‡>èG™*¶‹oÓÖNduÖ鼋D¦aVÜ›—NÏeÂ*)¸È8±ºî)S„II¹Ô{uG±ã ‹hm)§sÛå#¢BcÍ‚¾—àú‘CÁÖýÞ=IJ¤þòÏ.]àóÌ΋zÅV Ï!é{µ™<Ó >»Ïbõ$Ñ 嵯€Rs*e_RÕ_ô¡¿šúÿwzA:}•Ó®SÍæ,‚ó˜ ˜°$$‘Üf˦) o˜×![BóN½Æe‘'@nÄBÚ™ïOì(¦J^VÓäëÖáSàÌ3^~[ Êì!ÆÅ…ŽåöøºÁ¢‡‘)6ôW”<Óµ/ò9*ΓҧÐîÇ$ôëC&ãæŠ_÷ßñC€Ùë=×qe%vBÒÑÛíN:¯Í|PgYõGÙ{uè­bˆè€Ð¦PjÛ!\=ÿc¯¥èfxÞ'R—.xÖ®k‚0ÉéÆ „îv3.©€¢¬©Û̓©A|†ÔW´’ øá¡“¯4vÔ®*pªÑ¼gî2.Í"Ï ÕaD&iG#A¸ô&. &:‰ Vcwmxä÷¢ö®iVíš[<ÅöbZ×'*!ÎR8i§¶Ä|#ì®k¹T¨ëo\R}ó#-äxÐZ4Q¢ÌGꘋ‡ 7¯h¢¸üå<^TÝŽ5}El”b™oñÇâQÕkFìýkŒeªð;xžµã/!qw3Y•|3O/k•ÙÀƒõÁq°ž"j’èvÊ §§=ÀÓ†ÏTgêWMÌ­âæMèRövÊ:¾æ»T%%‹t5}¡MàËDÝy»ãˆ‡§>/¶ˆÛäÝi¨y[nHú ¢…–¡ƒè¿tÆù´G]›+æb²j"ÜÌÉ´4?Ëíéä%T•ÚœÿxØí¾wžóà™ revzíÂâQW±» å'ö#– Ù¯ó7R’~ö„yÔÁz›1¦§3 fž9¥®SX;àÑExåQwqx.h›f}ˆ#lͬpDûJ?Ö(í Ž,^YÁcï=&Y¡Œ¦‡¦øÍb¡at[3·Ÿ £BOCž'zvV]2ìÈBÒµ|8íÆ¢Þq‘ßT¿Zµ;Ëzp?kWªö0 ËëŸ ­W~6·±n u)î¨Ç©iž7sÜ‚¾Äteö™è-æ1M¼š=n¦Å~z×Sð=kyöǹsqÏ F2µHŒh@¹·Ë ÔÑ5É´Tè…„6¤¥£(¾m£~s¤æ{ˆ)C¦RÖºEð­–Èxêovón·}N]ðPÛ‘¥óáþ¢ô+7sHðüôA[}^½â$öjæK‡M=8öéE/eªÇø¨Ø m–l6}S%…&ß;lR[9Å‘Œ ˜lrå2#’rËìÙmÇ´ïö´ÅPoÞUÿ%'ÿ2CÕCwœ£(ªÊ,MVË?æd¼ôpvÉ ‰-Éœs™Ý­O_ø®“°¹nûÅ× 4çH†©Yˆ¯RôÔWàäñ'úÅÔLÛµOVÙsjø`|š›ä›ß Õ¿®õ´*ò4LP Kœ¤fÏ;cyÀSÛ‡_Ú:_ðò/äÄŸì2¿OkT@mk}àý®„”è†ëÂSÌÁª41ú|ËÁÞ}ÿ/“¼Hv82ží>¯Râo¹-?×Ó©ÅÂY"iËÉB€¾~DR–v›èÓlÌM‚ó´ákQÖérÜO ·‘T¼#_´TiÚSpi=ô˜ê aZ±¢)r°YÐÇBx>"œ½¤`Õ\¾ø•ü˼â‘*Ýrö³;–V’F#ƒeÊïü¿òˆŸ=«'‡GídíHV2#óê£Ò"0ÖDª¼µg8b_ÏëÏßñ›k–ô憻ønõ3È·!(âmÎ- Ïñ/Æð äëPÖïº;ÿÃóÂ꟱ _#ޔ̊A;]mfQÖj¶”?>Jwל;ó›Mg¥a¦÷+ö2¥ë¤ôfþ^K:.x·™zNsâ&ÆÆ¯Wóã3…pA(ƒNYTëÆ½L'©µ³—é5ß-Ò{ßdÝõ!¦Z¢@±É¼/é|/:_¨*Ÿö ¡½µ^-÷ý•Þ‡jû´3“o²K(ÿ,ÝŒœq)íg@ýÓ G/EáiCÕnÓZú¤dó0tõWß ´ÜÿOšµŠ`çlJÂ Ž¾ Ý+Ÿ ®²ãg~kàpmšÓÕ^'!‰­¢ vœ-Øîà·}Ž™ÚëüË.²?½Sф㬽*å‡ei~Çw"c–¢ªk% œ泉›è½noÃ'EEû4Ú°ëLcÊ3Ð6;x?=E½æ/§ª¾›id›_³¿¡^úç!Û?ɳÝhfñ†ðxçW±ÁÏØ®äÉåsf¢ð]3]¦|έ½hçâSÛðGv‰ÄÐlÙ6Ùí;‘Þ:1ûèíjÓ$Ò†ö„x© gîà*‹ž:ø)6CWBm¸QMÁ£(†¾Ä@Þp™’@޵¢VÈ"ý¾åÞï-”Ü¢½×ÉH„ÔÌå9¾…φÖí€ýõ4;5p[Œ[¯ºµ1¥ Aß’½”(ôî`@K4ˆÃ#·‹´uMy)ÌÚ£RŒ.â:¼ÖdÖp(û€÷ÍÓôJÛÈ>¾õú$kÁÏoý£h|Û,÷7gYÔ¢ûç¯4>¶í´7MžšÕŽ‹ºeì©ÖÉó v>¼¼D5fƒjбÑÂWR±G€›JCãµÐL™[v@?½,j#m'6s*˜9W£É­r-³Î¬ÌàžçGXÀ¸º°†ç„(èIÞŽ‰Š7ï“·¹Ò.×XhOâXØ1ŒÑzR ôŠÏÑÊøMBå ÜB˜oˆMù«õÙøþŒ·›æ§Ì”»cÿ¿ÏåTÊÌ¡Zu»=p)\‡¬–ÊŸÊŒ’Y® ˜SÊ0y¹ºÏó Ái1œ·SuËŽÀØ’…ÊËKþfòç5“»RŸ{QàÛzQJ•ZzÍ.*Ò1nP¸*ªâ•Œæõê ¹8[¯ÁL­<(yNJ„¬Ÿ^z>ÐK2Áÿ½t.±Z¤Ò_$œ¡¥tXóÓæwÈRÃdØ/A€ýš<…m#Ô0.ÉË® í$Ÿ¥†Ôò˜ …ÔaÖÅ~ŒDâžcÝ2—x¶O#¹X%¨À¥æÛïÛ”=W®’¿å¢¬íS2Í&YËõQÄxNÐüîfWg¸âd˜™t{w•vÍ€Kãáñw©m£ÉÞœ)NêaÏ+Uóß7U3;¹‰nd†¢¨–$cï£éÒèÉÓïë߈rÖ¹ ð/]4Fy@1À®TèA®2æJ4å<ƒo(&_ *¿gÌ…‹Wˆ…Oó¼WO&žz¦Ç³&ÏÖØï U8Aú]§T ºé5"w,%Åÿ@ò§Z+P>ˆ)uZ²þ‘„íñ sø—² *ÖõTÌç'o ªõÑ-×S¶>®C顲¯!ý¼äÃݱUÊ]Y|H²ÉEMé|Ð×ùÐé EQœ?½©‰w^xLèûZû¨Á;‡®z¦}E«lƒ2Ò1áY·' <$¼›õj¾mNÍuŸhc[…'o™Ý{î;Rr}³­æãºXÈ®TMXWûd³t'B$àl;\gøiíú¶F+7pyˆy¯·Òß˜ÙÆÚã'5Ô1U]@EÂéSîj®Ò ȱÌ×n¡…·Á~·Íyà&'³¸ù³çDxCàxäZaÞ™Ó25W“Jþ§~‘uü€tPÉ•m8¾Äs8©ã›ºŠÌW—ëŒ84æ×í1×I8 Ä&™ìÝŸ¢%ˆ(Bôñ-ÀvWƒxÈà\qzì£%x]I^[9‚Õ.nÃTëqµ\nû,Ü&ñ&H i-˜ß^‚óƒ(å*ÅkL¥L L$OVÝ4èŠ^ìê­Ýè-‚oÎñ•îréž’®5ÅuÆî§BÅ8ˆ-†—ÚÚùî&fÂó ìÿ)B–rIï¯|9IIþ³ú"¦y³­’#Ü43Àãõ/Øá’¦ˆÌÛ„ÞâÎÓIî)³h]mÊÏ”W~+\ÙJ+×ic®ôCÍdYd7Í 6òÕ¼¡rD²/Ör:° H3‹©#âª/2jëÝr¶áè“ÿ`Ž}!Zeß7,Â_çk–zñžݳñúkæ­ŸUvõ’@kÐОÑvaì£~--Sù „„®À‹Ì$$2sþÓí7P l³\¤“YÙk4²(ó×ÒÇŠºz&ÞS0M¿<Ó×åTº£ä‚´]Ä^HÈh4Vfo}KÂg9ÄŽiš1¬7C‹¼bÇxÊ=rñÅeQ¦©4ét|Þ¨Ý^ELàÈp@&]fg2RÔþ‹Ã1Òñž0ý” ž¤(fA:Ò “•>ªg …¨v³=“ßIâ(¨òC¿Ù9R,Áªô䆸X38’9‰†Z4é) –Ò%ƒ 7ŽÃë“-ó‰­ ƒ>}M`›¶Rã[nš¿júȉ—2ª£QýÕ¤ˆO­Â~ÿN ç!,Må/°'\¥ËO°BXx7ËGµ›Ì%¡ýž]rÉ¿ËÉ:ÆÛ°ºK“wu$”ÚL}¢\&¶¤xQc8"naà6/,˼E@ïmÊ©ÂçC&ÕUcÁùñ³­úæ¹ôEâÖ’(˜£ÄÔ”O£xß¡®æÝÖ¦G TdÒŽ<¤[ÑeðE I–oŸtùŸ Þva»Bµ‡ìsS êO¸`{tV ¢Àv8ŽÞþ"3~zÈ¿¸Æºp8ñm‹æÞŸìO¾HÕN‡óHØÝk=JØz@‰Ñõ¿žÒ½O0ا°8ºù0J\KfeÐwl{6·â“¥ÂÂoùè'#×qΆŷ™¯¬gm£ý2Ç0¡aÙ!DlÉlQ´€d*:EªßüÂåØyÎöyÌŒÍÅxçpg&×»€h¸Lî-ßTDK7¤£ðw7fãDµÛ•[ÜX räìD/Äð3í¢óõÊPÀ6ˆÞ ÔQú †áõä[\\æºô¨šFäGYuè"3á€+uÍ»ËÖI£æ[9ÛU6ê,¨V¼[àéy·¿5'Yk s»º|¡3-Œæd;ï/âý\ýOI5Aü=Ûâv‡&¦dˆKÙwÖˆªÃêF³høënH¯æ¤ŒãÔ¸õJoïh &ªq#[á;×Àܯ@”½MÈ €ž<°eð"É&&•™PÛÉZlnºJsHû­)G³®P£p¨ÖŒ¯©,f‚©®Ó]Ö¼CGPÌ`‘;}o€'A²¤ø´ƒñý9ÊiÖ–Õœ€Áú,Ͳ«D4jàzï‰Ëô×nïf󌌭­Ïæ›x;±ù\Ü„ÕwÝ7”uÎlÁ%È[Y¾`9<ÐRР¡¯)ÿMx§“”}B—•‹§X¶J ¸ â¹ö‚m)Ãto`£âŽ'cÛîlºµGÔ-Kžixy|jm?ÒžµE‚¥ëS«…¬rÝD‚!º¶é²ËIX¥÷¹!;Éx€|/oKvëm¡]ãY›.6×¶õÁ=_̤%´ÛØ|ûâLíuVÔÇ£àÍ£‘Œ /ÿ^0©…<û¦$¹Ž¨¢Sª«‘4œ”½¹ñÈçîq Y@þcöWuc´\7­ˆ­q•Ú!–§ ´ª L—žÐ j~Sëói¥UMLó•,ž[ÕOl2üǶÇcÖeOÅÔgÿap‘óká—°w)N~ù$ÈÖß©f6OÖ@Ñ´ÏUíúˆ”ý[޾ .à3AMé#pTJm„ôÅ`fûáÉZ ”ÅÔW™è—==`ÌXXlŠä·bõ|›B‰m®RšÑù†‡•vóè[u&,]i釄€ïkC„Í>š Þ†7.i+ˆ‹KŽá¸K ÄØo¶ï{ßõAÏ Ýwæ ïó+ëÄÊ v;ó\üÙ‚q€÷#ÿ4êºÀZV}õ*‘Khú,Sd¾áÂéz*ú]”!µYËËïQÑíй—Ž+<ò7öù@õÓ*ŒR•ÏC©ïëž›îûÉÄ"Má^|~®=E'ºCIüóTÁœyÉ:uÚR ”>p¤ÓNù ã³"àžå.ðYe…–Ú@ =…Ov3ÇùÞñH¼«XµuÐ…ä4~ËìÈB—2öiÊæ#KfÑ\%¶‡ÞYxÖ23ß™~%q¹VHßÿk%FÜÖœzäcXÊðJ«÷=nrÝ8Y5 €?MŦgÐáEÄDùIUŽŠ)eç&É‘¿e¬‰@Ú¤É#½G”x?áÒaQíoÜh³vÿLšr³JºÃí_¹C™»«qÎb/÷‚ññ¿L¥§@óqO|ÙaÏ«r…£7á¹®š®x.‘Ýè“MájŸñ»½î›½:⽕ r;žü«v¦¢€~×=ߦ#åû˜ÃGÛ1^t×CÁØÕ×ͨަjÝù‚Âù®~3<-žLý‘í(Që|¢†\ÈCaŽ&nË Ã…¨Ï½‘|Z#Ÿ.ñ<¾†8–÷´x2˼r°çâšÄ ºKb=©MC5·åiÀ܆üÅ@«9mÑnÓ۷јë1㕯a‡ŸyâMÎfÌ»÷8æ\„³­ƒ-–ó¢ä8s‡\a±8âP k9\±ÓésÎàÜoF~œ˜–ç_’úÿ^ªŽ@ì¿àr•q{aQ÷ÁG}ÌÏP}%½6Ó±Geqˆ{Í ¨!•6˜èwŠL>{ù"¢ˆí2àôNvÔäD‘t±Á•íByòß¹(i{ÒdNósÁž׋¦¸P ±Iï¿©´¬ç$ЀT\Íò¤ýÍXe1àüþÿ÷çõ-ùÔ`~Nÿ?#ÉèÊøi0??§;äùýY_"€ÓÇÝ…¦ŸM†ÊJ÷ü‹ãjQ‘•‹Ù^héwÏÑ¥Rèìn’8jJGm{y ²d½Ë -€X®/jÝ"ÔÐ]Sd« ± Í4¦Š€4ð¼Ñ…ÊQqbËñûd9UW.(=ˆ¦L.oV…âŒËtÂ÷qíû0 µ¶|ÑÒ‰<:“ÉŒúllüX±4Ò¨ùVÇ»&1ðèê¶`ýÕÑû ÑqEA§Ö¦DAË73bÅ5O0H›WŠLÒHÖtãj þCh¯¼%γA—¦mã—³Ð&Ò×dPå¯Ç>Þ’2`plâßT–Pp¤}~›_MKÏ5ïIÃjw•+¿(»Äï1]EªíØ›!3Ï׊}wÚ#õ×ðA–A.ñmcïj¡gˆml^-Í Â}z; _ò¶QîW»8å{\E±%]× Zp” Zzü mB¶ÑX¥!ß”¸΢äè&´y­wªÉÈ<‰à_½ ßÒ,[ÒAÖ<:+)»âÀß}É–?ÿc &ˆI§²nW1ÈS¢pH¨"ÿ‚X±;hYÂ\AF¦Óÿ#ùù\Ý3ÒÙΗ`ÞKº'1ö·íÒÆéX·]ªwý¸OEÖ¨“*ñþ§I‡ ÊÚöSR«­Y7ürbóå–{¥ë,ÀöU65’¹OO5aN6òXÉßNDÑ ¤§ò‚’¤K»‹ÛAj<Ô~ñžaTÅ@ oì¯ yË*÷’®Éç e?3J6Jr(]^P_tÞ¨.¤Iôdñ:uV‡H ‘ËGçÃ%fÑzM×àí6„oM6…vñïx0V‚دc(@MIõ&üÂ@àÚ‡±È8AZšc"ò™–‰"ö~ûâð 8Ò ]A»”œ1d(]GKU¸ÿM PÍHÖ“ù;3¸šõlß…·6 ®¼duµìÄâM9­âò_j½;ºÈIl•=~tX¨Mî¡ð5·Û\1ÕIÀ¥r3D°ïrÄêœ#¶2ƒ•¾Åã *CŸ6ÑIÑ]È M—Æ¢ R¼6ÃøQ ºS,Öí…€/9.ôD'¦Õª9)~Èå_a?ä»Ê%+„•Uì=‘^ÀýùÁíBpó^g†©ô³ÆnëúÕúªèÀSV¯Æ ^F6ðH©'€uJµ@+[ªdæ¾[&æ–tM¶ÝJ`,¢ROWÀ °Eýþn«ýáöÁªäí¶´è,ÄP‚(JVöšŒ•ŠÅKˆy{¶­ þb½å›u4\ÛÞ?Õ äìýG…º¼¨ÿ;o…ÿi‚ùøØ'ð4¹0­oLyc©“®Œ5ç«zUØŠh³ÿ1Ó%£²É›yiÕWùÜž ·Ì~|ím4ÝÍ(V½ÆW;¯PýXŒIx&/Ž‹‰ à,ã3ûáqþõf3œ‹ã¼ÌÔ°'')öë}+ä…B°Ü‘j ‰•i&³*_å]èõ¥ª%7 â"‘|ñ?lå}ÖѺˆÐÄ"Ñz1èþx ì4Ó÷Ó!×]e 6…`NfkkeKŒ£ˆá·ûE¾Ì*X*McÛƒ›Š ¬ó,¿wX¿ú#ð8ЍQ¹-H…¶ˆ*¹TGÈ4„¼>MŸGïp> |œºåeÚ{vòy­Éͦ (ë¸?ÀE„ÆÐd$Œ T{<ѹٿny™ïª#‡ï!´Œ_Zú|…Žk#,w2?qÌxí }'v¥FÞ™Eb_έ`¿“5Ð å`¸úAò†±åE@OX?ß^oy_Mð‰Ô⨌uÛ /kœºY€„æ”NÈrú “JˆÖ› @f5ŽGb¶¶Œ¹ª¦qÌÛî^2ƒþY„Bx†OY‰‚)U™iõȼI´9±‹/0\¬åN­K ÞQ\Uh˜s²j2 Úlwc{NF¤ÎÑ-lRć”ªw¢ÿe#›ä‚Ò@[¹@¦¸¼P@¾”k<Ô{9ÎÉ$&\ZVVôQ}s%&ß}ƒÌÛ&*lãFï“+EMÜ¥W%„f´©Áº[.~Nœ|‘âêÿpG¥<Ý•–5Y´˜·Ì¿%ßþ…(J[QUQ”¾x|WK¨¡M ¢°u7¹‚¥,M¬Î®@u£J·Þnõ8> ùµàưR[øÒ“üòÖ¼H{BM5×Z+gP ü[ïç¸+°–™àNZé‘\øþ[·(|cP=úZÚô$C,1ä w°²Òu¯†bª_kŒÒ¨¡|vϘ6)º«-ÂdR^枎ì»ÆÊF×Ò:±ÂFö‘-ä·s‚Ÿ¢}<ÅÂhÿhâSñF¤®Ìl~C¯Z mîzD¿çkq] ƒ®/ìz&QÖ ¦Ê)Øt›ã³ßýÅÌeEÐô*¼«/%81C­•ÿ/ „CÃabñçÂŽmþ‘Úv‘²ñ=!+Båô/ÕàÒØ%¯0£å—yº€¬&ÖÍu˜ÚÏí˜>­¤xjujz³áÇ\Éúy˵&¢,(?5dÑÔÝc9Ž×¤;öÛÒŽÅ®ýïñ°’G„½pŒæB¬—²ƒô8Ã4#ì,ÇãÓAki·¬l}}Ò6Ðeö„ùÌ"®¸>„O Ô× ðóEž¥9ê?¡MúSüÝ1VK¦‹ÈŒüGŠ{r¡äSìCqÃ!d16‘°£ÿa”³~„4™ÿb$‹›<õÜó’ñ…öŠm\‹Ôï°÷dîiŠÔ-¬Î"Ú(íͽD.mÇùH½u˜Ç,Â!†8Vö¿KS¬œŸiY¹li£*»è? Ì LO·ÍB~wJ¤p‹Ò2‚Ç·¥| þ­GS³á"ú+Ô*þ˜òݱ½,¢]V^º÷ªý kÊç±Ü#"ŸžD¯Q¾õej¼ ’ŠLo\SËæHQÎX”}^äažëm­“¡fŸyE·=³?¡P¼,DJÀ~\q¼?‹!Ñ%•e«O­Àæ ¦\ý"·b˜Ò6ÖƒBÅ^ººéÜ-ªߨõÎpÇ oé#oYSMENš¼©A©öÁ~Jß÷3ü,ù˜­R"Ê·AÀTûäkN­õ°*X_öZ&ôÂì_zw¶Zã·µ•nÖæq?À¬†Ï/Ë jÉS+­4÷WÜËMRœ,B‚ÆöŠàuÕ¥øèƒî6•åºq7ò¯C ucåɤœƒo«&h‚²¼¸vÈÞ&O(±4¹PÔƒH7n€,’ylÙÊ@¢´»ÃH]Þ®5s¹r–› †'Ù]y^¼èoèlçF%…’|§Þ–sô»Ë¥Ô“|ßwm›¿µÞá2êfŠìÞmM(‡8ú+×lûgC„¥$‹.;&|ó•¥Ý›ØªÛ܉–}Ø“ P1ò߉CBnö l’¡fÌ£´†êžb"Òy±“gÆÏVo\ˆ%'a{Ö:ÐÀÃ`Ä%¥úP%ÓàäáÈg;œ-¶±pÌkÕLcÌ ëAã°pu­ÀºDíu¼?˜½2ZÛméÞF¯å<-âÿ(Š—˜^i ÐQ VÈ›x16;¥Öüe=e3Úö”‰[,"$¹Šä+ÔnåFêÅ ÷û\a¨=þ*ëô€7Aq꟒ ²⣖â\¼…ÁKt cÀõ‡'9DÔ×®«Ûåä)SZ[®`eC݈ÚCƒÅ #ž¶t; Ê­§k˜FþBÕÒ¼qæ+ÛêÊ€ý;pLÔ‰'Àè0{m7R}[Mï/~vɸhÁ¤ Ÿß£)¼Å¦û`£L5,ÝÕÀçHóðOª(®T÷0ÌóÂR1wúXˆXÖèÅ¿ ¦lò\–æ^#äåAÚaYø>FàÊ$,%Z\Ï.ÇNïýýì¨9y‡Œ¡°†„ƒ€€üÓú¡Ú, –&I†î§^W~øª~•Þ¨Ñ@1 ݘßý_•:åÆEîoSš+¡ŠdëÌÂÕm°¹[3Y["õ*ô¡‡.«†$uun!¦+ó7Êõâ¼c BWâ¢ê×å8Ö®éFâ+À‘/!³kÄ3ÃYŠÙ¹Fõ‚œV£Ú´8–ÔSì›åa«}WÀ%ûì¾ 9äaøV—~‚KS“Ù›‹#ÿMõø#Rô£H<²6Û(ñ4BS=¡=– ÿnºð qÝ @«c tùJŽ«5‡¨~»ùÃ2Ÿ5ÿ¥Ñ"“µêTF}¤ ô«Ieö^zH٘숂í®)ÈŸLÚÚGî 5v›£Œ¤E±â70?[wc%¦Ç…Qd«RþtÜ‚C>[áLëËÓ4m¬|Uθ]S~Š• m.¹8³aW;‘F t-Â{ аkAoÂÏR ò\2‘5ÜX À¥R«‹é£8…~©±MtdñšRZ|íUN¯|hXaå‹ö•¬UÍ7ŠåùÓÍ€H$––º˜€›zµAŒnÒÀm“/Ø{hèy Œ“`!ôVÄÛ•÷”›§§¸"v– èHÕ½Ä šb¼®±†½ïÀ´°ãoèSÛWPw9ýÉ’ñnÓ öJ´÷ʾy;lÛÑUÆÒL}zä)ÎCõÅàž»"ãy#Ûu? ;¤àªu3´ÕÿU2—OAh¤ŠýçQ·éÝÉÓè[6ޤþŽ¿¡±ó—Afñ¾FîÍsÑé¾”ªç•eîâöÉK—Ž÷Ü–(snOöXZÉÊ9`#æ­êü·ð¿oŒ¥6V—&û Tc› M·¯ÜšN‘ockà¬Q¿Ë,à!ñ¯Lõ†!¶ÈŽ´³>}g¿tmdÕ¥2錷Ý?玣åøçOU; ÊÕ]Ö;à´‘†/¶E˜K·_˜\‰{dUÓ[†8#¼Ó¿‘[lžaR`ΗoVB™úöè=\掞ªõÖÉÙB#HV™µôH‘‚ÖïÛ4[:bêò­Ã}Êéi7%κExm˨ä«tv†@¸*¯ÑŠbeÃuÎ/ì±ð΢¡1)ì÷á¢Í[BBb¬ˆ·„s5vÖÌŸ÷ýÔR>|¬Ë ®´Òâ![non ŽªÛОWÊ€[VÛXžy-Xþâí~mI…Í%ª#Úy›™ Q D¿a@éÏeRÔ<ÏìF7Ÿ-˜Çð=85`Õ•&IÞº„.Dåj‡™¾' 9\Rs8úιRÒÖ7V…iV–ÂYàüþ‘¯‘ÏçõAùÓà¾OA—È×óú@¾EŸÓò=üþ«¯‘0á~®AkÖ™åuÀW9ºÞ¾ùÃU7CqD¾¹ô±ÈÚUÐè×U§‚;FhÖ­B†”’<’"%b¡…+SËC©–" „ò¾%lº*£Òøî£ßSœÒÛjrv°Fz­Þ/=4`üÀ©Y02Þîÿéèù@ýÕj.XFO“½~cÞF.Àg3e«Ë²ì[@Í–6@bXñ§ÊÚ®‰ž g¥Ðó­®YŒâñ³D„2I™ )WLXUèÃ¥(±´K̃˜0qî8eW#8E{zyÞ0Ùó^ú¤_ˆT¢´6ì´ÿAPl“þ^ñ/•ˆ ì0Ym~W²ö:éh@}X!ˆ¥=éyíöíb•ÿzàðI~HÉQH)÷á¶ 9C½zÖs«ÌƒÒ^£ƒ!Eû?q¬Ì”VfX·u%Æ0ä’O Ä3AûwTú¸Ëkr»8tDz š«ÀeÝŽ¬Gìœ;0òÇŽ2CÞDA9€:Uö©&Û *êiLª˜§ú¬¦àxÛo;ˆ¬²ÚŠDBlfÝš uad,ÆÚ½‡ 1&¾Õ24fíú+ð 85;WõÇ}²7±¶vöwÜ2¡]?Ç ÉVq§;ä„IÔÉòRx*VF €'ÓW’J”Þ6«üšQS*­¿ÄùQFV,îÔÉc/~tÜ;ÿ`¡–Þ,)Ú³~ÒâŸÓ èÞFÕ‹ÔGùäe\ÆíW˜¥[ jZsV¼HêèÞ¹¼fŠ“9Ÿ&¤1økÆyuØ1V ñ; æp’Fž»yçÿe¢ŽŒ4˜Úª:÷tW4 ·Pœ:*ÌÌýgP˜ÎÀ *80V-¹¬~tbø”5b‰¢¡Š‰®j.5ª5„Zú7€ª6T°ŠÅ€É‘Þ‹Xù¹yBžܔaôÉ̾KáÜÝpÅŠŒcù¨ ËëÜÛò.Ñ'6L˺Å'¾d D¯ç|ŠÕû€ŸfèyV² \ê Ì)ç¥Ð‰íÛz!×î}L²&!¡W3•+Ž6€-œü#Úì¯ Á‡?Ü›éíĨ c‰¤màUâ!ÿ0§Ô¬—)s(~’Ô—9N{JÃëµ®WEÀEW¦Рɰ"ž¥g9K"7P(«Ê@MWN>³É%˜ßް#HcZ>"b©ëi¨.ä"AôÙmz Då¨Á9Õ–Íd­V:@èã¶…êoÒ¶7Éî‰f°6ª? CäÕ¤žþt”å=ZùF;ÜÔÉýl=|þ¶äoäb›OË1“*<\1™¾¶‹.f€ÔIþ‚&WÎËþMž.ò~p_ˆ¡z­]ùË’C:þØüC¢¼ád¶ùr(Ûp¾·4È)#Ty\nUú7¶¬ÙãþêŒÏ)(-O Æ ªÄÍV¬²õH[=|å‚ô[îÛÛ}‰BÀ; š‰IX)L=£.źEë[j”kh^­ ã,D £‡7‹©ûè/lŠÙ vŒ|ÖmƒÿƒkŠB¦¥!àG6 £Š€(8â(i" j(žù¼-'<¹Y6˜¾´ñèÒûû[‰1)àMž÷]~Û”iN³  Í¨4)OZêç’# œ»‰+Ò· › L«#ãC‘áÿn¡²ÝX !4À^òKM kIJŽ ¢gÔ±žØ*ÃJ€Èlä«Ì«ÒåßÀ;ŸL´4þw±„à!'2å_¹þ+(vg+ð<°Õ©?ˆ{G€M-.¨&*_À=Î&+hƒ•m˜câ2S¡Æ?)\©„L,âæsBô”PéÝbÍŠ˜±v¯F¹6 ˆL¦Þ·0Èç5 ¤j”¨Þåf‘þ×ÀÞ}!óhˆùÚý‚ „»-wy-T%SNNŲû995‚SQ°u³ú޹ P¡œT¾"T%î`ÈK¯—ö® Ò|  Ò}ßüþ0Dc·~!ûý³6q"¨…u-Å™ÁüùŽs ðÒkû_%uJƒ¸•í3âeݦ{‡Îz1GY»75 ‹W¢N®;YM‹ ½µ#!KMéªìš7m£ÌäïÓÍ–ÄN…°Wç¨@ á8|z°åö…xê~?™Ûø –'—Sj:× â+»ŒWy™ûâåéÅì7Ùë@]Çdg’³ë­¨’ú0U¨…x[˜‹Tæh #Eí®7õ¿t]‘ƒùÏÜwû­«DÿtŒvQWã—º›µ»Šˆî¢ã#xwþ­‘Uéê…µÌóŠŠp2 ò€q&-L”02 =¸œYS핲@Ê Ý‡#F‹×ñ¡0³’vй“ÒÝÝÁ›ê¶æ"GŽ;0:n‹^™" [Ü.L:ñ`ÑÊô~熪Žg=†EªpÐûùeׂðSÛU[Œ;KP“Ó]b#©¶‰¨¥Û)¸’s”°BN;+cÕV:A<Îs'å8k6Ê‹ ,ùÝŒ{–]äólW1qRvÿ#@˜|6 LyûÛ’:#×;iY޹I„;ÀQ.ʽÉÁ6$åý0Û‹÷[wt¡²éO¢ 1˜ÍŒÒ.·¥/3òwàô f(ËÓb¶o¶—£e(÷ÃÀëŽò.ê¾ß‹¤"O ³Ãóʼn™ThBÔÔ^Ôÿk®gx³w¼ƒp,ƒsê›X·Ê;æaçgß±{é5½l’Dð©4E ó~žª—|ðE+8ÉÓÿ1Ý…£#8È#ºbW^ÌS]žô~Vêg S‘8eQa@ëIÄ÷)4ò8ç‚"[掑râBÑ@*²€õaSuk¡[H*F„ØÉšH¾Ò†Æ•%lÍ}ôñ®2‡EéÂS¤öè“€]lÉ,ø>þ-¾WOe2 ‘“n·é¿)dTÃå‰)Tb,•Ôôt$¢U~¯h‹Ö"މöÞ¯Ô6r6fî‘bž6;Ñ=K×4~ëÚ’èÈÎòàš³<ÞÓ–tð8”ht~"¡>Ñ”.g*Šc¬ü ¢]Æ‘unvŠªgçNöùË:88'oa³É¥ÛÎ…-ªB¢{©“x··Ò¯×ôyïïù+ýo†Ò_‹™D,Ý¿ì)šæC‹`AnÛoi€ù¨åž¿hs`Êß7€ÞD·”í9b%f)m˜<&–Rz[žGyÔýUB‘f"<¿ åkŒú“˜w®ZÇ›ItB?ÄœY ¢éux‚“¢&u­™a^aBüÚ(Öõºc7qy6´íùSƒàeF¹O•îBÙK†–ƒ¥)ëíÒ‘è÷¾dæŽ-lLµÐü†¡?Œ1¨Cˆ¾òBÏF¢FîûéÐëtaMy]é]¶C9“ýX(±ü'¯QâS®‹ô?)`š‹¸­ÌuœŸV‰4Íœ"ŒæidB*ŠÖ >ˆáX2»G¢KMž@MQþÔ`R/ä*é ƒõþk«áåó+ã<䇅ºœ+çVDb´Xïɤ”‹®©曬C@X'é~°r»Ô–¶ø] š½ßRÏì”ûˇ¤¤¼ÿG6ž¾7ÿ1û?Ue­•ÕÚ oôÔ0Ñŷµ'‰4Ù- y‡|ƒ/+ö…ú!F(êÐyAjoôYô¾‘QB]‹²râËö…V“ŒÊV¿@ÞljiŽ9f˜‚L½”…fû†&tö¾‹p¢Þ#ì#kÐhñå».¤Z™Õ „ŽîS1!¤æÙBZà“g\Î  !÷Ó ã”ùm–ÈoÐVýà1Šö›8–ÚƒùžÌ~€•«¢ÍîíáÏã[ö³}®žÕôXþ•þú­û+5’—¢®Ž×¼ ™;ÅÖZŠ)óÐ$»³dႃÄAä?3!ãö¬~ÛOö§~ÝÇíLýµÝõ'þÝ'Â|çÿ6¬Ÿ9ÿm·v;ýý_ÿ%`AÉ3 °˜HŒ¨8̯ùû16‡ÿ„t3$ yÛ ¾X<49)¤—*=<¯§éú~Ÿ§éú~Ÿ§é­ êf¤ zÃßñä)m›Sq,a/ññ ä*°bҘϩýA¤@Ðÿ ƒÂ™l~–õÔòà<›ý&®=L¢Ä¼Ôl޼‡ýáé {Ð|DmLË›')Ÿ¬\bA€rê3åòé †·)l»©+ñe´ìäiæ:‘i!ŸAê.‰½h!•Ó Ý8N~ŠvV_-%¸T¬9Ÿu(d’¢½Ëº|)ù¨AÉk¾Èú;_šTY¯ÄÁ踼:Qп•N\X!iu}ÞäHÿ~5 z”ëåð‘}\´[jûçlx“³n÷>Å%s^íùû—õµÜ[Ê_Z¢Ê£)Ü`0€}5óm-A<ÎÎ,þ ÚͺÂO™º)#¿ñüÇñü~è:Ÿ°†NDw½Ô㙓[‰Øƒa<š¤n“hÑLˆ½"•q–$³O9ÇøƒÇ-ýom gZ´ã8÷äÆÞ Ž*ˆ‹ˆ÷KëE™k ŸéO>°²&I %Y¢ø©°&f«]½º%(v¨UmºçøV—î¸K Ø3E`ŸXUc>—öš$ÿXf3=ÿ6J¾”;p‘ÌIþèMq͵­6ä±åV‚ÅÚD=ø*W„yï=“Q3ƒ6Ìwh@×j¾‰‰7bç{; |:`Å00ª´ ÉÂeƒÚ'šv †YÕäDáür¹ö‡Ã¾t¡Iª+š8cŸ'Æg+^ã\Ö¹”72?†¤òù\õg±O;S‘'0ªûû‚h ¯‰‚ÊD™ÏOOR©{ úBówc¿þ³Â,]Œü(Ö”›Q‹º# •wËHý²’Á̯µ¸£„vu#ˆó8~Îí¤˜ýN…öÆèâîoQôA]ñ)†„ xLQk7œ_úe©ûKAkq°Z_ØH©œ€hÂyš«¿azmÄvÐfŠ‚ b\knéÖüálÁÎ&W‰1‰±.t»§s€­Ù¡ûCö97G°…³Æ‹¹ ïï×Ro§P1{#Ló4áþq_Ž~õ Áow“)±æ#^’¢ì® ¥ÄåÔ•û¯`àKOú RÆ¡ý|éRçcÐ&ê (ÙP ùpªíœ¤¬„)Óà\6 ¤ש y¾ïÙ÷C@ª6+.cÿGéܯÂA¥˜â0P•íá¡02|* “Vnª¨S‘ÈþäDT4°ÛNñF.~ˆY³t® bž*hˆÕÚ¼dþÿ‰êê¯O¦ãßl¸F—1C9†#ûaKß‚ŸcuÉÚ’äñ@<9 ýÚ 'µ è‘F„Ô>nµ‚r„"‡•'ow¾ ü*v!Kó¬’P~Î'—›±w %—ý4(€Ñ—¨‚7á/¬I=ˆ¤mžŒa¢)°F#gxôMÆõ›R óp²Ô¡Ò&Ò¦mì"GŒVW'k‚£foöEùé ê«SÚ¶sÜ.Å¿á^ÏŒE¼ž~]Äç° “UÿIW;j5f[¤ôs ÖÀŠçh€j:iõ+<§öœrØêsK¨¼ƒƒ"¦1.«}´=F‰Ɇk˜ ƒø’ü½§Ùª«0b£Ãr稅ÍkO‡ààšD2P–[ÛMÕ<Б' §ß}}ÛrWõ®TC_º.Ó0%›tI$h=—ÿq›Œ&ãw¬Wuµ;ÇÞÎñBßŒÞ TØöNaé z¿A>áG·z—dô ¥`†¦%a0ÃÖβ*pY¨ø§$VYL‘ûµ(Ju9™Ý.%[êßD,uîGýé&ÏÞ ¯ä^ÔÄ¢LSŸlãôšI$ÿ6¬@‘Å%¡î%ö!f- Ñ”¹ø4Ô*†ƒøuN¥RÏïáïp3Æä­sb­¥?€è¿vRÍ…w˵UÅ#r½…̪©Ë^Õ©óõó6„$j#æÔدӭǪÂñ3[pp«_¹½ÉßæPë7MœWš”öXÇeZÉì™)¹õk+‡´¶s£P|ûn·%C-eCùSŒ¦7:€y” יʡM¦IḼ¯—8†Æ6ZàÊv2“¡q½gMKÈe¯yÙƒŠëø©zËx«ˆÙÒ½ ¼c°7¡š_÷«:²yèÚ÷UF2©l¯wX«§nœ-/OL(N£@æ¹è¥ÉÿÙic09’o jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ ‘‚ÿ“ÏÂñ^ÝoZ¸„ iÊܡ܌m¢“¾( dçïW¼ê¯ Ú»µh©®¥²NÎþ³&)ÇW/žf~p5áezMŽi —Àd4?3$ ]vIŒ|¶¡Ò/ç°N7W–—¯2Øf2½„ŠlÄ¿y‘b¢öÐâ¦;EºÜLlMP÷6l ™×ýÉådä¬L AžÌ ¾×ft_¤K&D@²&M¾üÁÕ·€×~=Gôšwð®bH†½øÃ ÊJa¶êkœWÌݾǕ¼ÏplðŦ”PmT›(°4ál½è.ÒêäVœs±ü9TⵤTŒ5t ¶œh-=À|4`(*Ù‚ ‚F‹+ 0w-ýèºGþIëñ”SÚÝ2um›PÁ´À|4@(€ÿ;¿úØGfI ÉødSõRw_­Úàaàyñ󬎌šÑÏÂÇ^›1A (ñ³’÷6–è`˜jÞd\)GVæ‹èfž‘¨¥h77ðõH·4š·˜ £ÑkWŸù—Ú«‘¢m"q9Η~ùód*ü|ÏÇ…˜N½:RŠö·3œ÷‚”˜g»NPdE„o˜ÃÅþØ-OáQMÈ”ç÷ÒA.$BwO<Û^. ¶R´ži[lÄöüû.…bŽè.Í Aj)R"ÆŒècŒz^çÓ³ì Äà¡4£Me÷U&•úá u¤lŒÏλ´ή©7[K”é4 P,J}è2³2%裓ž -‚ZÃa´VRºP/tD±<Ó+¡…×óã!¥•kvNx Í~©.©«³jg8ÖŽ;ê¸èDP€€¦ŽÔ-ŽX3xÞeVüèaºbÔ«S/É­q¯¡®*ï~~Ù¿^¯”)‚öC×"c³nBèúzõ¹H) Þéá¡Jª [ògQÒù7q·§% x3¢þãíŒ0ß Oñ*.ü?uˆ‰«†õðû+:û^ª5[˜’3ĉ‰udÊtWúJM 9â©:‘à2 hƒÎœp¸–÷îî˜Që¡Sf ëÓ¦}¨í\}pí•\µžË;‹¡Õލã¿ÑÜíòY¾MÌ}‘v¾ªd¥®Þʦt\ÕPäÑŠÃç_ùsr¤i}¦A—KïjÈš QcI8…°Wvˆªè­ÉÛñÀR :EŸC¾•ØýÙªb÷¬y, ôs6ÏL0£.}]xìå§f¦õz«˜F Ëü‘'[R®Il£ÆRJÄðz™òßÜ ÂcÂ-±Æ@ØŽŽÃþ )à¾Aô÷Ï5¦þÜÞÅVpô 55lQ¥ ¤5룢‰¥Åœ‹™óI´H>鱉þL‘=«Þ;H!ºüQ^)¡À>ÃC|4àÐæio­mלŠêt0nñbvù A/Ù劻¡‘Ù!AÇfLMöšÔ¥¶B#¾™ÍZXNº”ò¿C“LYÉe&zÌ~½ö^lù5›eTËp¥¤†XÆt4Ìß$Y½`m·½sÙ5ˆÀ>8¯À (.h€F–™—ìu^×ÜgãpB¹X9RgÒgFI°YÚSÿ„k+'œ£Ã9¡kÿx‘žAýCå¡ër½çÚV°n|¿ ˜˜)Go7|we^,N ò*±‘{ú,Õ:‘÷ñÔÁ9Õë ¶Þ½'T//ÏÍr?~ ­>Vîr² *;”- ‡Àj<µ(®Añÿ%‚ ¯?ZèX*Iž=/J V˜¨ÈÞ«‰4v6Åro^$¬W;*YNŸÃ:è壷«æeè(nkb"¹gÏ`ºƒZ< "c³nq!'ó J®Sý÷É!y¹„Šw8tŸ€¡‡£{|émy’-I¤·…ËÛo£pþè…0«2·7GàŒr˜>ýÀy¿/ <Ç*ηºÉ$A”j¾å¤&þC~ÔØ÷>ò„ow~òSòCÉætœï,ñRžZû-Rmë^R¡Pí³Á²ñ0)•wÆå®bwáØ2Š:v¾ÏÏ¢)ùôŸB ฮwm¬i";`n†UPlvæ™ä¨ËGN¹Ö·PéÚ'úJLK}ã:n¯q´ x¨³¢3ó)ijÎäÇØ[fÄì‹.34ÝÕ)–X‹âÍ‹©¾ÑÐgŽ&YÉvìÿ2£æNþšRÀ%äSS¸°çï?¹š²`‰*X%!tàœD_=³ à ¬ñ®¯‘ Q"¢Î-H³ û'3ÀQ3úa¼ëÎè%Ê÷äžYu×%G²×òK.ÇãÃq› ²röÚï0€½U,>žøWÀßD*Uÿhêÿc'ôItt‰ò»2»×kê#¯FüP‰¢p÷wŒ]æejÀ×3êûI,ΔæŒTaÆ¥ªO`b‚퟽¹Ê7)„аͦ¢w:ÃÆ`Q×Ef‹å¤º#~˜ä)–á*•ä`¹mL[¡+á /ƒ7ô\rTÝ3œ®M6ænê×^VÆ5ßTk“ èÙÎTòY{üÎ2Æ7©–;SêYæKÑÆ ÇJ0R.r)b£‘ršHò%Ÿµ…TÆ 7yÃQìÁÜ}b~·òÁÂH–yêÏ' # -ú¥žÂ¬ý¢ðx™ß<ÈÕK³%ó‚c°ql <Öòïû`‰Ö££­J ‘áz]7UU%ÿ_qU„ˆawxûc›nþ"¸ÕÃ`d‰5öföýØ,‹k€A¸!Ÿýñ¬1ýÝϲP…€cÕ‰BGñíGpÚégx‚Û²azm;ã‘cö‹dâÌß ×aø£ Ô :…|³ÜLg¶¡7ŽÅn­-õ 4ô·ïÃÞd¦ 7A …ü4RMàã c½ÞÂltÍ?[Ê\%é ¬12åaˆ²$T9éÊâ j» FØ>e «~QÀ¸‰êÀ“O£˜oP³â¶l¨"\2T‘AÒ«XÓQ#—IÞUüL5ÅÂÚ¡Ën„À~}npB³–ž’Pº<˶šGü"%ÖðäÕe›«òw:|§"g,\fÆ«ß`Ù >¼Z!ÖMUïr¦.ÁPH¾  Ä»¸Ò Û=(å¬eég24¬ !¶:þ/§4 œ²J-µ˜ŠN yÅ^%£6ÝÐüö9,wUoå1¯èü`ÃGó›{¸Àk Iœ¾žFø®øº{Êc§"û¸KS‚«¶%%䜪’œJ;dí¢/Ÿ&Ë4Ð /çZ§ÎÓÓîÁ1)9Sé@tzµFL°»ñ×ãæî)ij>‡»–Œ–Lá¿l:CQHΞ)Ó&Íugƒâ\ù—¬Â´jøOQ%ÚV•Û}&J¦Ã¤>§rèùþ*8†‚?¬Ÿd¼·Žâz84[‚û“³' ¾5µyNœùx~Íy ÑP_Î ÉŒ·ŽŸŠÕ{_†gOéMSHèBCóÁM¸hÚ«Õé«ñÄò–¹0V&»5ßÙ,.`Î òÇñqŽæÓ.¡wâÔ|ž‡«)þ±­Ô´õìbç)Aqê-hB?õ¯Ô -#”¯»´]ʇ=[VÓBчí‰^­!ÃȵÒ)w‰ /v|e»’B6I‹­NÈî¥ä&$FÔbÚ<óáÏÏ‚öXs¶ñk4-ã¬>*5çmrªeç„6€v¾Óc[ïTV¿ü-;5ëŸíç¯è}¬"/²NuaŽ?ÞÒY­ÃSXðÜâЖá@@aÚƒ…ØM 4º;÷«"ªfks¦!ncúfbäýS4ýbáäÖ¦"ZtšÙ­žÚb¹ê—Dêc2Fu••¹0£¸”ÞæáÉÌßc.)Ýæ±¸/­¤² ÙæxÀ>¦äµÀ>M—…—ß!Šä ·J GX|_&©S({ûóT’Wõz<ÜÚ²o=Tn­ÐdÕ¸¤á{ÆMôòô‘È*W¤ÕS[²ÁLùþ ìaÛåBë±¹žqœÛPêÝaÉîlŠoÆÒq–¤DÏØV…×N§-…àúò¨@.ò¢,Ç¥ÇÎK§Æß©/a³óÛþU-¥[¡¥£þ´ÀàsIÄ=@’[ŒUÈo"¢>w¦/?œ „hÀ@V‡°Ô`,=*Öê£`Ú«K5¹=é‚ú«ýÀ|—8’ÙóèºýÙÌë±) ÍÖÇöÖü×à¡°]ÑD´kÑ¢9ÿ—ûX 5Ûëüï ï^ž ©3MMlÐT1 wš5v*‡•D—,(±± ×¾ôTE9ï×ý ®½èÈ"ý"5j;KoS(¾EûS¹êÒ¶„ÑÄÒŽ³òã(ú;‡€¥û÷¦ßšSsú.0^ùñäQMðQluôì^Ç©^{³?‹³+'âìZuzWœIò¯n¹6ø‡82YóµgD¸ã¿pk€œ<Ú e°î_%z˨XžA/L™"Åôï ²­¶Q\ȶÔøóŒÎ‚¨85y üTr%ÊN$÷Œ¶qðárHe58QÇÃæ•_xD¸f1C…E3dòŽÊ À2áWC’ºWƒ}§u¢¤èÌm-üa&‰fÀÛ¨ •hÀæeäc :¹ÆÚ²Xc2QBɹ ¦÷W™—ëîß”TêÇáYOη‡áD€%h|Âs>×M/¦œÿ‰T^¸@kU’8zˆ¿ÑtPÚu„Ôø=H‡‹[¯ $'>S¥Þÿ:D,Hùˆ­yø:pÌÆ‚@iÚB¸ºµt·¯@o»ãúšJüµ‰ûê¨ÝcÂÈÌ àcc[Ûø®ûoÿ2°‘÷ËrdHf?üýã/îŠË\sZ ÊKL"Ó?Í Éç7’ænþkï$K8'¼ô©*Bj°´W‡îŽpƒâÇÞhm“$çzŸ\T7àsé´ ñP˜Ãò«5Õ]e¹®œá¯ãvƒi×Ek²'ÊmÙó>mп£³«ï ³æ.Uþrà½Bò²€£‹Æ"!Ë0fqbD¹ Wú·}!°F¥ñ÷ËTÃpûÌÿNÛÖŒë=·CÞ“ÑY•†äªûŒ\¬‡ôF e,ïª$AH*^Éq9©×PL‘÷#¡tgR…Ä&Ùñ|Û_Hüûêu$“…’@;w`´oægM‚„²n‚ßÐëœÃ7ût„I>%é16ö¼Öeý¦èd, ÝáþÒÃp7Ø/¹î}tî‚÷O4 ø4^®Ð›^ 7…°÷"›u¥ËqA Ò]ʧŸÂ…>ºø ÀŽ;§û’öc7áÙ'$¼ó™ý¿tRC¨#ª“úÌ-°2(?‘§Ùæ¤ÏÏÙ&~~αùû€óI€Hº¼í¸ÁXþ;Hæ‰Ê*ÖÁÁØQäÜ*{¶¢ XÙŒäÊ0ÿnÉ`:_B³wÏ”£bn¢âC9_íµIÂ¥?¢\â©•i½)Ÿç% ð&¯ä\:{$¼û—S8UVþg¬p³Cí2.YÕk„¾­cX;ÊDAdE«m;\8t©Œ6wø’j߈$®ìJëE&M ~ ¨—èMÚãМ£7KCIŸo£ªAÚ˜t—ed{÷­EÔ±-ä*i³È· 5ã Åso®7¤§ˆ!å–xX·eÚtUÑu¬>ÎÀ~»ÕëKOÿC U¸Rô³æLô…B1¡ßºaþÙùHü߉GE¦ØžA?)AÊ~Ω ;`….6ŠÀ WÐÝ‘|1$ñKaö*e*¨ÈdÛœ+…ó;ß#ÝþÀ…›²7áÔp4ò¾ˆì{—ùHúõ ï³5¿ò‰ cÿ€üGá“k¬>п>Ø;Âø~€¬§sìs¯?ׂ‰&·ßL&¯¸ã­þCì%3%¼Y“ÝÕo…ÌrNìhØ•Ým¬Ð_¾[Ð/ ÂP×’ÇeÊç6P~…˜O0¦¸TWNÎδA¾µŽñ07RñG „Ø»7Cˆf8‘i!ÞÙÓÿ~Äóš°ý‚øQÃÂëÒìg3ÀôíIÀù Ôé s)¼…‡Ëe7?f3¥GHzJ/Qª„öw”ÜìN$`ßÕï«Dq$0ˆÈL/™Ÿ@ù™§Î$ÜÐÃñsÉHI¤ÂíÎ*è6àûXÒ™Ù0åÝ>'b˜óž—8+åˆ}²xÂ’†Cë.Ì:b-êTa¡Ý®Ì]cØn«]¡‘ôÛ*Pн1OaA>ñ–ÝÝ{*ãÿôįŽYðã*C`®‹C~‰©¨GüÚ:,Žf0ø]}NÜ3?õ¡ìµNÉ %[` ]É%¥!W¢ÿ@ óÕI¿@?ªÎÕZù:˜~é‹ R+…Ý@ªÙâÅ ˆª'dWÖuV zíCxGr‹ñçŸóЉ‡»¢æoœXâžpß®…5 ügŸl7Ö¿·IøÅQ‰Ã1pÈGqC´µs•æJàøtŒ(}99«g5ù„$TÈ ¿b¸´5—vs…•“oÏ2Riw?äG‘6©úüñ[íz#F« ~½âÅl*á/QÖuJ&Lòÿ9=dá«ý¥²*˜YÌIy›|²Ÿ/Ub’ņÜ6?+bNMü›8ø2^\ï¶;‹‹a!‚&•|ˆ³Î+>>êRLjšGÇLlÆMÎyæ;7­YJm«tÏŸ“õìè~› )[¬[Ëç—Û㕱:ŽfÃ¥k¢F<£¬˜¸¬T8¨GÝó†%b¹^Š}8_©\Ù³i¿¤®'øÅ„uÀF]ž‘¬mX-`ó¬·í3-×vÐÈ`tq…øþ£;G”v”gD›³!£óÏu50DµNfãàÓMàƒ úÃP{4éÒUÐG ¹/M„;‚[TJ¬w÷+Fð´‘ð¯v8O²W™kÇSßTÇMœËÛ2vxžæ5x¼¤þ‡9 22§iy;#´ÜnH?(9¡½ÁÂNÅÈæÇޖЉAè5Z FƒoÓÝu/2§p{À»‹ FK×Ã/e§Î+¹bòš…6¬ÏaJ(®€•õª-ˆ[Ö®§í ¢FЃÓ'Û„ï¥Ñè4å ýÝ» CêØwÊùÔP;hµªFwtŠxŠk OÉì}sãúœËqÞM Q3hù»óf(oò¾/¿ˆ\¦J`ú aÃgõðOLXÃkH›P…M»”7kÃWõVn á1EÜn½åä ûKíyK6Ŧj6*nj}ª§RT)^fî:a/︽àžMµpgœ4—8«)N&oézÊÜl‹Ô‹¹~žj¬OD)}ó7$—Œ‹¼´ÎÍ‹ñ|1s–†—&AW”[â&¡vRn²°aRQU÷ŽE™è‹È¨ÒIS•3ïæŠ–ÿ‡r’Vþ?nPi'çCJWneû ’HâôQï”l——Tôƒ±ëµöeJèîQæä&䨭(E©ÁÄ,Q¯ÈiHO‰-Ú- _ï‘ÆEwxÍtŒkÿ ÁX¾8Ý=£‘¦<¿K¿O ÞŸ"ÿ<;0´ÐWžO$©Ñî¢J[wÙµ'F“Xûتtà}ñ·)¼énÝâ„k.tx£Â<~­wh Owµºq‘o‹ÿEàT ‡sÐ!Y£“¹b8๖z¿šˆ6A'œ\› U‘Ïgó‰"–àÌÐ-$u‚ªwÕÁã@’x™ãr>¬ 7@ Õü› J¸5cÖ’ò‚%0‰¦˜À(Zšb¿·<”Ý~AüÖä%Ìû•fc.¢»»±ìØpñ5ýâ«—P¬É½™a©í&x*†j;ËMAÙ mQ.¼ÿKTòÇ,mˆ£ÙÇ<ª7<=â£mÄ>ÂÚáH—°Â‘±›› ÇÑ¥J…–Ù©Þà÷”©´øâOÈmrê ÷ºô•¦6ÜûK‘ƒuª4êž‚ÄZá°rrW¦p\=7l‹^/çL› 2Âxc¶+z@±q^¦ö Äu):ÓYû«Ÿ’+AÓŸ&6%+[Ó£mID|i¡}9o¢¹³c:›ÛÝ„$OqvFþ=¼èãgªFå1 ø1l ?}±l¢©ÓV¨$>P&· ñzŒü^n±Äw)‚öBªXæ\äꛨqð¸6†œæJ½ú6} >ƒ@vè^þ¬iÆ¿…ü$»eб;tVÚ ¯…39-bè™èR^8ûS ‰,gMd'öð4È2Å ÷×H!|.šœ"ˆL(›éÏÏäËjç@Ìç‡Ú (tr›dT Hx“âœa€,-õ°ò ]Aq,b“zÿCäíÁ_vL/s0˜ä …ÝZ¼y»S¿´½ÛÒe“O,€­2ðDã̽è Nm“Æê¡Öì´±³b$:(èDta;Ô"x¤ØP¥%ÊM ÔHæ›ÃA÷¼Qm]‰»RÖñ¸oªO¤1Ûñð—É‹<¯e­ÔMþDÅJâ½É JjNA6±¼»>µ[oy…AL‰q „y®aüäÕå]ÁWO’ì1ßÜYN­PM˜Êh1hÁ·(¤»{Ï4X ù­¬OfáBoéé´ó £’¶ùëæóqLLhÙÿ>ÎDœ¢P˜ë§Õ{×<¨ÀæÿÿB;ÿ&1×cÄa¨Àb­,ÖVÒgü%‹§¡fÍçÍÕýºÆEêÜÕ÷ºhÞCȃ¢û\HV\ú ?óa«7í«bÕâî!WA»QÔpc͔ܺŹ}VýwÝEZªàþa·ËÄÆ™}LÎñ Ü¿“sUë òÉAlÌöŒ`@kRœÔ€ $yZ$}b¬xþ®G¯$BbqAî­éZ9<¸<Ó~.ÜàÖ@ÀÉOCÐÍ ™“¤5‰ŠöùÁ· #>dC4zIµÈâ0¡$*Êé¡i¹¥lËëûô²¬'t/WÇê‡UÙ¥¤òÆ }\äs셱˾*ô!F3UŽÎ ÓÞäuÕBÞoœÚ¬öÖ6_kÛ“×–žêø~1öôEqúŠ6 þY‰«í¡”tX‚´SçÚ¾ÕÖVŠC—R%<±~O›òjVÇWeƒ»zØ*Ô“‡f»@ýR.U¸NVA"\tñEÑ“¼}\TèVئi¿aÅ=ÜZ1¡£ätˆR©eÍr€ j¹®Ä ‰U¦=Ð[¼‚Ÿil˜g€gúÈÃOÎôgñbé“ÿGÝ-ªG¡³n/ è/ç>†2òÆ¿&~•ÿO«¶ ’}• µ…½0h7Ã?@ÄK(¹Îï=A8Rde“=€—û¹žŒòî;T%¨BÁKX³·›è¨qÜ[3S$@!áóŽ}ûžsXå¡ÒÉtÊŸ:Ôå=qeÚo—«ËØB°Í%0Po|ѣÚsE8 ­›éØw²Ä~ª™q$nfFŸ/4>é{¡^C‘2é1Î)ÿ} œÙVw†éL¼+§Óš 4âCæ«à©JŠW²úšg=[1Ü’”i7LÃ'õ»sƒxµ}s²VÊY¿LŒ‚áÔ’ß-qÜ´_W”ZŸ˜…°’ÀtxWûè ßhUVøæªÑþç˜ö!Œ[CRÌ‚„ŽWs”'=Ç^ö,m`Ò÷!P§óùóæîË{ÐMV¦ZfÕøØ5O­¡HyŒo¿ö(ÍÑÑÞ³…]©ÕDsjrÄ?GR¢Rð©k.åïô8¨+üÑ«øb'%ȵ‘*#õÈ¿D}}C „‹iÐÉÝi}áá`ã_t#ÊÓNåytú'O›à ¤û;?æÔ÷’&më[•_UÃõ©£Dè]2àã ~ReÄî—ÖìTRèÀĘÇØsHs_%å_ã§z¸Ÿ >e¼P˃Õc1×O•f™ÄÒ,4á9½¢£$¬ÖMçhOÑhüߎà@„šÂfž±òÒã­‡ž²-„ EK[k@Ç(ãì²äJ©B‚xªÛ[rXxg͘¼F€Kãw颸‹ë(¦*j!C›çÝpô”ö×GIÝÿPºð­Ãwè®X&±^!M+Ø®â-†À|¹¹rŒåºöQº fœ úžþ7£³Èj®½!Ñì¼{ L•¯ÈNkJä‰3Ï4k3>ÇSîš%œ¶”mP§ÅìD©Ì,ÊÏó¨ gßÍ®…¤cøª£„Ž{T‹gúÈTD¾¥/ѯ¯¼ö÷úÊXeiž´ù˜=^ dYšgçþÝŸ v—èn|E>!y%ʶ3£€dá/Ó—e EùÀÇ•QÁ8°DUmgßD›¦5Ÿe%:PD<ôja½…91`͹¥°Aª¯p\¹ñ+Œò·°"»M¢þ?¸`’»åb)ñ$›¼+(bŸÇÅpi× C3 CO16³ÊKÏGš÷øó–¾ÆŠ%©'Ÿ(^òE ä,»éZÏêy%0U_ÈgÝ‘z“›¢ :k’NÑö °:ÏyA4¯Õ? %Ç«³>l—v/Au5²tr²¨Z>úâÖpU`¼jOå‡Ï•Jó0‹"B»”´žƒå‘3(ø(©múdìüñ—Ä €– õ·cË˾§þ×ìÌÔMŽLÃð`;¨»ô g 2»TÔš6"”=f=ÙRˆÚ:Æ”·™¥ŽºªAÎ Ü‚š§j?¯”P-#³ž­‚2ç‡άLÎ…#ŒòX2„õÀùû+çì,ÏÝàð`Ó\¢!_éïÂ2{ME)kšcz³zÍ9'¬6)Õ[|ùA°¢ËP+\bp¸çz2Ë[ªɆ¶ú+r<Á ŽÉè2žm—o²ñU¹V_ê5Ö}†éKš»BQL™Mõ£yU˜ý–>Zf™X­1é¨Qß‹°Ï“ôj‰ÄT îKVˆQûõÂK-Û°h¿ÝŒB·W.~ß ~ À*3à·ï-'z‡²úhù»Í4Á}qCy±œgÅäe—Í 7±Ð^¼P¤ˆ§’–ü±ó4{W- ”• tq;\†XŒvvöÛ*š{XÐ×À»pÖ€;ü‡ënTrÌ2JgK•ÛÛŠ«í› €W4æV® ÿ-ùRÏ$âeb’4ìÛƒÿoPÂà±£øŒ\p†‰¤}Ž ~-iœÇO‡ÍßÞ‰.ÑÔ¯ <?ot»]ì.Ϲ·#s|b«ˆ“ô”ÜÑF3ki8£ë›V€ƒ;àÌDÁ¢éO\…í«CnoT'nÙ5 ~[ôX~1^¥0ñäëˆ*£S0NK›©z=,TŒ ÑÉ›‘j-uÚ œâSOJpè´è8k!W8Fìau–šCoÜ7tÃ$®Zó%(óäÚ†`Ñ‹B†>"’ÍÀ]ðÝà˜šÒÁõ›Z*7â‘*ôÚÔ6b Ãuï¾Ûfn7À¸cµh~â#é³r 1}ÿ(–"0¯Ä}Ÿk¯™L/Î ?*ÀËåŠgèÁšÍàÜ¿áÍ ¡‹pmþ&5ÀýqdõÝÅ]a%óÔu@ÓO³ØØòmBë[ƒxMËÿ+)ýú!at×»˜2’$QcŠ&„òH™UöìÄ炤æ÷XõöÒ-„\'‚ÝŒxl%o Ö—–ÑÕÕ²)#f £M°mpéâ Ç)Gß±mè’z<2Øu×’Z¼¶ûCݾpÅÝ>þÀÌ“öpÏz0ÄÚbó)cO`Sé*½¤ÃUŠ«L:×] 4£ø3ˆ×‹Ê!3—-ÄEøM¬Lü(ë¶M²ÁýݲW¼ÚAOĨŠJÇ=kÿJÑ9ev‰RùŽM”µ:¢;ÃGe¥å zGѰ¾DÓXNj¬ho›o`}K ?ö8'©`i+MéˆÝä^?}`£J&/Oî[ÚL³(H|l).Ø­å6‡Ì@ âÔ’?æD=ÊÃZw'¢HâTH'ˆ#a RÅ÷yà0¬5æ—„~A$ @Öå5Ãyzh·,žA²ò­… íEƒ ¤£¨£-‰šÇ¶±àcÝÈ6eZmƒ0ñÞDeê»ø"=<ÐyYÙÒþ7(˜d_OòS>Œ+&Gq&VlƒGîwq7“ðØLªˆÜ81) üqaáàÔÉé/ׯzÛžîÕ–A&’2#£Ã\ÆŠe8¨ù«3¨¬ÎSÕ¿FVžÁk,•TØÝO{À÷¯Â½¾}jؾ)t°üŽóýЬœdøjÝÀ6pïþ^üöÇ ž\*ÈâÌ{&KT¼€¾PB˜€µ‘ø,Ë0¿J\"´M”éHOÖØmÆï{7ñ6 ^$švÄv(„¡ã×eŒÙå TÙ.ž4{×è(€è†ß†Ò's•<-û à›QˆP\J鉑5HµåZ=»:껄®®iâÆHºmXõÂKÉSñ§ZH©7\‡GÑ·ÀùûIçëÌÏÞ ä´,  YX €X* 뮿/ ü¸“zè΂Q ÅÙÝñ¹OR!—oTäŠÿOÖvèÕœñÊp{;QŠ´øÑ/Wj²ÐUl–@eòJí;yH:@°+|ämr{n½þÒû£!kƒ-ÀnÉë’|xŸÈ/ú@‰¦í\ŠÍ6F@ÄîÝÂϰáP vxÌóišìü]/doà{ ÿ@„é‰îÔ¾ý}ÅœZµnŽh3å;ÑŠ¤— y5“‚_Åb<ë’‚ìUï½CÌåÕ¿q 4©¢"³6/çaÅn¸À2!jàGƒ9ÏçxçðRîwzG ‰ Mî}Õk#_òjŒk'äÛ[Æ ÕÔðHÌÃÓû@…{êåcpRݲ…|’({Ê?C»ºh€Ñdv}ß±aST½eõQÆ3°Sm¥¤Ëã÷(d˜µÎÑþnªa¯Ùféî½ lLáôTm`–adÃJ*1B hüª¿ñã´FRÈeÝ¡·„[#%¨:xNbàÆ%½£û‡3ÜÚÂÀá»}3áÕ~›zLBöC‡£ L fC†bã¹p½ÒÖõ#¬M€EjK×ð¾9T£ÄˆÅOÝ“5gò¾Àrw4øçŒ>j‰d†:ãj<¹ã¯!tåAS!5lJñzM«¦‘tjÚP]ë-Òòó˜$@‹VGü³„ýZZÏdÊ“#Î[TÈL|{P< ¯¤í0¸~czalÀ]d$/w'JmêÔÁa"0~)±›%A4T« 'J¦®?ÿ{”ð ³C1`oí­Ê ka¯¯¼ãvç.š#^jª†‚ûÏ%ÎWU¨t ï‰/˜Ò¨ÂlR2ZÎZY¶Åü÷tç»n·VÌ´õ":$I›ó)ÕOèÂ…s@ ë&² ™Ë¾ßÕ¢Tøc„&/ƒ²Âº„p”+ýï nlÀ·MNp·*f £¡Û‹ÓIDx18‚LðFù„Iw{ž°+ŸZˆ;Q·ã’ÔÆÑ®É;Žù`26hö¢5:ð†5¾êá‚pØ.‚ðeò794coÞ06þ½n­ƒ™ çdÛÓ+ªdhJÊKN­[ìÆ d?ûÜݿϢ5¶çœ¢Ðh/¦¿åñ6f™=|ìœeòÅÿ‡H"ƧèC5TÈ‹{ÞGW7ÿ ££ º5§7ü½Ë6Æšâ(¹]zLK"ÉYöc)êic.Ç’™ºÙ581iùYœÿhƒòwB+lx×A8DÑZôƒò‘vÏ¿§ŒÐ@‘y«¸e;~â_…ŠÓÈä„g—o¶œª xɧ]ˆ<V ’_2L¹ˆì9ÔáÃÀ¨Ö¸ýíÑä⊪Á/ˆ‘à¼ùœ×¨v«íúÐÚ|•ô&N=ž0v¶¬‘Õì“'9dí´ë#¼Š S3Ôæƒ¦pŽ8|~¡ãœ×³¤ hí±°nâ™:æ>4`“½¡Ì1;´KDËA$bèx%‰ 35dÏPÆ6…fÿ6 W7m‰\ÒB˜ÇâP~]t±ðlz’Œk!dž|¡(ÙÉ”›Ø`Ò.”Š¥ç/n¸qQïZ§Çá±Qøk4? Øõ²k {˜©Ô£åÜÞ<”=ÃŽCƒ Ðl7Ìù±…œ®÷%R6¢…ùTüðè¡U¬o]`‹[¯žæ¾É1ÉE´s›‚¯QÐi‹ž:=š·Øêʪ>âQ´è.Šó{KóÆÀZוXZÝ~Ä©\al´Øû7¥¸U`r¡õF§LÂè4gMWÎF£!•¬à„éÛÍó~Ä[ÎFAMOÿ(R•¦‚gœ·; Ò!ü ¯ æYÍ&^:‹K¤¢Óò¥H¨fu_JìÈãý·T%Fè‚9–ŽX͈¼¼SÈ@½ˆÀå_,Á?§dA£“Âr²‘¿ÊBk>E¾û\wÚú¤µãc7Ng  w”%]¢t(°ÖÞôˆz¬è–Ç82‘½¥-#7cX×÷ÖÀ­‹ùŠŒÐÚøÆi$9j=ÐÎS žà;)‰+h :Ç¢Ó¾¾\t¼-É)G[掻,×e‚+Œø=v@9o~Û‡IP@Š­»‚”•ÂM»Úm ±RiLv°3A}„Çw„EÊQÍÖ… ë8u‹Og;QrÐ`]†¨A¼}k“Ñ»;NÏ^ô„o—‘ªåHž]…Óò»ýü`Áª±F£ thºWƒÇe¯PË¡ ¾¤¸ôía7?Çö@ðT•feÎm.Éê7§ægz8^Õ\eï*_Îû±éJ"À¸ål¬ÔV»K¥¬. g¼9šM3FyO¤žÎ<2d@ôX¨MI â‰w¾ª 6J€LÝmËÿMwhâ ÇžAqîˆÅçßn‚œÚÊ`_L ¬!IóÝ>BšÙÛÿyÐk™<€í±O0¢Òì|)d¢ƒÕ+*Ѥ¡ÆŠ÷$xy <»†Ã.}ÇêØwÝÌ ],’²«i0vJdÑÞ/R&xϽU€6@_ÄæxÚ݉$ýû¾ œâ^<1|O ñ‘¿Ü“m¶Û7ÈEk6SÉeÄ0R<S”A}Žõžƒe¶ðqæ}0MC46²‰#§Äd—±ŸGÍd!vÍF¹pé#±×à è“2æâû} /·£Oáé‡ü=ޱü=?‡B¿ÃÑoø{9ãøz‚‡£ðöuqÒÄC'˜ÐðøÏ,ÚW33;'|R B˜jðòŽÑ`ïÕ¿ Z¬ý>ÖI¦^O§×P¦Ë¾aé'¾“8“†@œËŠú×jÜÎö¨÷Õ“K­dÈQ¤“\ BèmÞµBòȲw€‡Ï–»Å´Æk‚PñËó9È¿@/.f"­ê˜ûÞà\&_†£RŒ+ÔÈP.,ôÒJ>o7$63JHÿ·êÍ»Q…äXï²—CÇ2ÐZ‚¶Tm2üဵeiÐ#í„—Ÿt\ÍMv_¿|o³g x¼±ÃºÄMÄЪ4Ç¿ Œ¯/Ù¼DÓ¥Å̱'nr”÷:3t™æÉÓuÃYt28’QÏ­ñ›%‘Šöp²Ç‡V$Q­8˜'†Fz'œ6º×²,…Ø0Iîí ©‰ õ7%"IäÇ{2ôŽ¥ÿ>QMÎŽù¤ç-è.ùbôû¯öArœ.0|Ø}½§Ÿ?<šÊèSÒSü1 œïÁêÆsÀS!ã#–À½å^¡ å®ÊmŠ{5c÷˜h9WoÇ4¥klŽx= …<)¤D3 hõ¿§à‹™oã²ëL×ãöÝ;ðh„] H Yﲿ³$ä #EåÀ”þèÕ ®ÛJŠ…âm…u|æã.°º¨E¤å3”ì™/™ýëÞÑí/ä,Ò€­[]س/BŸa ³?G*ðñËúóJkÓ3OåÍ&«ŒúˆÌÕíBfîÄù ìû2Ðþ*ÚϳÎÛé'aÕc}ñÏ<%mxÿk u3ZñîüIÌþˆSs½8§ÞÍSÜ÷)°DÑ£oÉÓßïƒ ¹:V—vqÌ¡ «„írh™ E-xcµå-þ[»Ø¯ÈAÚ¥íלê/³?8E´B¡æªbË?§ôL~ÍÛ㲯ß{Šõ“T¢èä:|õÅLrB½`¯eÍu]‚—ÝÅÈŠŽ4ôömEÛá '¬ãêo •\©*³k{< ¯a„R»?‡…¾NMÚ³9×Åü!–a¢æ7h &X± `µj7“„ã„ó¡Oó¢\9~'Ïo¥˜sá“6ÍP`*Ä’Q®½ÛªM­;JÊ_`¬ñÔr-‹óXÔ‹$<^†×þtýJ\ AÛ<Œˆd=þ >Ì”„¼GÏoQ§/n3Oò£2þ`-þÑ©<øà=/¨MöRŸ´çœùÊ_flÊl–)è1}pÎ^4 ‹uíz ÎÍÅÔ—-Ê05ÚŒáñ 3É™e‰H]´@ìÔÿ8êšUzHn…ü° ¥«·”@1‚rpDtví^Á‰[ËÜã ƒ«^î>p!ã×Å`kf§ÙE‘DöþÛ¥ïá9OëÎLM¹±Ñ) DÞ”ðàDÑ'^ä8‹â=Q, U„ìü f6Ëx÷3¸<#Fëcf X]^œ’Íx?œ?[=Ë#l²æ-WR{àÞÐIulA©eÔj{2˜Õí–¢«Z½¿Má‘bzf—?(~¤Ô…Ù'ð( DME0jßËPáÙb,kË}!÷à»äŒ¾Møà{,UýróòÙïÓT_¬ÊLn'¦ÍHVgTÄ~$ª¾Örb$Wþ«+êBdEÔ§êJ½ñ˵ë\×ípq'A¾U÷™ªçpmãSÛõŒÒÀg€Ž  5zYeGµæsiEa?£f¢/1cˆú¼_?ë0˜Ç—6“„¯gt¯V怖¿vËÀØø ¡KÔhA*yZ“| ¤Å ††”q6Y ^¹syæ Bß­; ñçÕþÔSVX빋yk‹L AOkÙ_ºjÓûšÛœ$n|¢Ó{[š0‹¸  ;Í©¢E;$TRµ° ÎUVÊæè³Åmʆ¹ƒy¶»s_büŒ;ç"`ÇÕ°¸­ùܦáH”€ê'[4Aè$âìåû‡Qعa„æV7ÈÃL ½*lî%«‰a’zÀpî&>¬Ñ‘7Ó&¨b~hÌVxú>^/ºñí0ùƒYhÑ#0x s1ÈJ«q`ßVü© -S$Ø¿k®Òçô¡¨‰0À9í¨Ó­Š†ÙF¡¯é1JÕ/A°jGßÈ)q÷>Å%sRŽgÈõ ­E{ºÐÙ»Él5¬„6R?‘²¼€è»EÈÌTüõîN½Ló^!&¹hÛÝÊЫI/žÛ/{ÀºÜ¿Ñ´G¿ª’¶Ñ&:¤‰ãI¸³óvØGû†2BËHŽ<Ôíl¹sõ㦑ðú*+Ø— 6‘”Ý;ó‡Xƒ˜•ÖítOÙŽëoo¸7Þ^ØÅØ™cÒ(b@yÌ$Š]S¹ä³•Öâ)Mrà^o"Nè«×ÜÉÁp1Dtg{#Lˆ¯?˾ã5xF*¬îc;~jŠ=é]H`1Óßâ\%èIíƒ-ã3'¡ìçäÑSQêVýO† ‹CŽHpL,Ú´½`,”Š:¶Á¶0ý |l,çm³O7þ ©˜­Øÿ"’„6ANp*^ »iɨ;!ÂSs%ÌT„S?ª^mÔ5K¾Z&žÁû“*km-:Ÿï³ÈÑÔ×-åsÐ)LŸ)Ê<ÑœJÝdPÈ»X»LÁÃ;z ©¾¥ÔäÙ V=ÞÍ)¢`ÅÁ9uÇ»²Oœâø¦ÊX:iwÙÕ²ÈöÄ›Gþ…yð ä?ÎAðWP¼þ¿ç0©0©a-aï¦á\?Žq¹jõ Ž÷ˆß®V Twà •mK$%Š&ÒØCÃp±bš3õ@}úX²g«±òmµ_ ,oÎP›Ý´ëfrMÜO™T\zL|Ჩ»#„Š‰ÔˆâKÚ}’œáònÁ—· \[îÛ,‹[M)f¾·")­Ù™öã‰Oî‘k9Äú¾g~Ôõ ‚¯Mêfº¬x‘Qk‰ðK¢3pÇöæ¥õÀ\4CÖ"…F;CÓ”ÆâAúþ s­Ÿ.,~jz iÓà…Y,ùÞý{9Œ­3 “`v‰û‰ƒr&Õ|+È©w}ÖÞÁ¢ÝÛU«,ûN£àx€AÈ5ÀÓE€G„óœ³^«ÅSEšDú+o;„»'¥Œ0†Zá R<e“†PfjéVw6þÔoš “UïØä×*>Âzž²]¼FçÏÇ4Ràûà à‡Úû¥ÜCá–{3"–QB`¢g8çõ«?A¬öR¼®›£¼³?ÿS[Yæ²9Q±'vhÞ °'²¬ÐYoÙ„Ã4m†+jL­‡Ä~ÀÊ“DœÏ&ì”Ï$XÛ^RÚ1¯2û°J¥†w¿Šã¡ØÔã• 0¸3ÏRÿ}ɦ’~8çIî%'ï,:Wc®Q™»2ÏhÔ«tþL次ª¶o‘<ž0' u¯’ è’ª¥Ø×%4 ¹t¥qÄPö¹Ÿ>~Ú1W¡Á‰×û,¿Æ£TË/Bk#Ã[4ÿ=yª>POj áDÚªœ¾Ð/ ˆw‰Èñ‘Ù&†ã¡Â}¨÷‘ϼðä!ÖÆÄöBâ¯Ò²¯Sû!.ƒG¥˜'ö³'3•õHúñJR噿æÚ~^n~‹• PYU9œ¨ý¿YR¤i-±®Bì€ÛYÓ‚ nuÁàtþpÙ¬—m¿‹Ý*Hž»PÄʼnÇ3àßíÕÖá –hä¶t‹4ÐrBŸ™Ð»ýžB‡ƒß~H®_P¢æ$++N¸kÈ”]îÀÙ?%ƒÖŸ þ”ÈC×}ý_ëŒÂ$$Á³(?ú„Ð÷¸Í‚Ï×¼±­ÀÂ!€¾ýǵR&’¡P <°£!ßÝÓ2±ùñLb"ëe÷ý°6¢~±­{öŶmŠz˜{ÅÈTæS™ÿp'@v©ÅÝR×oôôêÓyyå‘w'ѽ[põsO*âάý£¿`†|%'!;ƒ Ö…Ù÷­4TûJ²'\¶Z÷ Rm–þñýLb°Y¾Ã–­/%ˆûÇfssªrÉç›!ËÁ\ÝÔîŸ8ÆÚpêzmšÙOzKx*]f< ³a.—F.km4¤ÎåÃHBB ™*Ér¯< šLÂCK±à"YÛç7Ô—ëtƒ—«áµFh“«%ýŸržgNïæ´:B4ýB‡ -˜÷Nøz Ø fÊQh®ü ­µØÍ•I|õw>-'@ÍøÜŒ¥@ô°U:ªï‹ƒ9‘aß¿Ì}0€¸måŒXîˆ,Ú•ºúpŽ¿\EÅTéÛ› QÆFø$¡AÃä•iòuZÁs¤nsˆððÖ½ÓLßm6më8zÀóy±r…µÂð²o^V˜Ô¾â滸V–Ë7°jÖG -ZP;´¼8 Ô½/Îñ ¯ ù÷ãUtî[ÅÎiù,GÔÀ:_ÂUzM?mèÏ®Äñwá±erd)>kúuÄÁ¿Y±ËHU‰%ñÒ¥—ÓÈÚ&ò‰ôÇ(f Çåô…ÓúJ>Û›a×ÒjÒ›ÙÈö±5@<åa ÄE'…KÂâ$Çä8þ˜vþ7¿ñ6àŽõx>SzÜ,°Œ¥KFækþxبEµF1ÎM„t¿[]~•ÀÙA=î[tæ>Â×H­}°QCŒUÄÂé×¹œ·ƒûïrXöuøŒC¶ùfìöE­…³;­™UxWm5X²eîA»Ëßä«äô­õ –DNXi7ýxå Äö[öaçÝUãuv@„öíug [,°¼ÏÙìPsûòøõ<kêì<ŽI ¡ǃ¿&“=öébuíuU"§áH:€ªÍò«’ªä¨¬ìbL/x؆·3Úÿ-ÁÊz_Ê?ñ~n,­ýÃOD (œŠ•–—S´Ãf8Õ‹æì¢,.•nC;È7“ wÆsë!þ Œ¸6¢§s)“bô¨›2á§³µÿ Eö®K0âk5|…i Œ‚¿Ë‰Yš¬Û/>Ó®!j/túÇŸ³¾©ÇïüÒ,`ô^wÞøÀ“ÛÍäÖ`}ìäfôÒªæÄY·´ #DŒ–¥maÖÔâÎ3&:Àß±ò¾gdÀ,æëÈzÒ³ï¨ò¸‚êhcÀ õ°0Ò ¸ëp"_K`ðNÿ€UB(jp í²áQv™„ØÂÉ{ïÈᔢyþÄh¥±áúÅ㜞ýÜ ¸¨qn„»èd¥¸ç(ÿw4\©R?FçùVE¥huÛN!…ã²ÏF6ÿ@¤iôÃÒ0t…ycÛ´3ÌAí›n#0Ê›k¾„¢îm/G-ÚÒø5ç=ë¿ÜZ¤¶ï:zYõwc¿þ¶2]³ÈéòçSŒÁˆ |Ž´ïw>Z#f-B”Ð~c†à]"Ýv ®’EÊà‚zw7ì_þ­ í'aWM³ÜÚ?æÁ*'<$ÿš¢ó4úé©;bûq‹›ÞA ížxç§NÞVĬZþzmJ8¤°™ç¼iq@aÕ½<ÊxFÐOUt±Ì_}Àûû‘ÊÓyü²)´jŠç+±ó Ýó¸3Lu©£VÖ./<Ý ®yýùð'pÛ¨IŸ‚-¥üÙ›rÊâ(]X†xöû3 “ŒÔé*àü òF¤ŠõET•U‹ðÌ6ÿ4àNÆ>Ød©PÉ]<ú+3ƒ¸Ô5Íç“–3LPYhÏ ÏMòúû¾ašá]g¡4-bs’Ò­ë"M…ŠêC.‘òÅéãÈžeã ¥ë—úx¾}ºˆ2}øq»®A¬Íê©“7ên‘9–èLöÞm Šé±¶M¹G°³ä v{Â#>íD?ÿ;«£@/æÜ!ÿŠ›sñäAEž…¬æRð_‘gU¼[½T˜ÿV‘DµóP¥;õ1b넨XáN¢IR%†4Zâ½$´åßo:Ñ(º¢@ƒñ‹œU”(ii-rZý ÉÁÛAFw£±c¿ƒ3›GÆobЏ!àƒp%|ç§:²>µ…‚œUáñZúÒ=ölÐ3µpg³XêªMÜ,Ñú6}4w4-Å`8Aóäݯ…”៞ÕÅm7¢~™úÛ YdägšÁ™¤/`wt¼Gw±ê9užŠ9"ÁI¶Òÿ/äp‰•sûôŠD¸ƒ3οyçÓ%ÿ3)Wǵfæóä¹bæˆNŽ> ’D¾ÁÔ 09òì®&drƒ—e œ™È(I©õs8NGøDØ…H_`^7·òL% ¯ôûg_Tmû†Õ'µ2Ë|ý~ZnÖþ¨Á`m/ªµç²|e ¨…G&÷Kö,÷D€<‹$y4¢q¢bµ®·˜o$] ,¯Z lå:¯Yö8¨ZhÏ…ž@C&oš[.WË´^öL©+g]ñêÕU4¥ ÐºÇ‰à^¢+ð´”o—ÉïàÛ•&¥ç”î™öt!>ËkAu©ø‰zG±}‡¯iƒØ·Õ,~?“áZê>íLJ%6=z„îÀ&ùS1|i=Šüû¶_çšÉVy 2zÐǾÅqcm1 ˆEAú}¾=êÚTfš6ñ™”ߛඵç?ÌýÎD×Y³Jï8HsÍ"Ioô–»0—QêßV5Ô%|™¿à&W¶³ùç->[³CEQ‰à×$òQÞJí…C¥¶¯Åe³Åhjå|óÎÞòám N˜Í‡)X‰7Gî¤Va\Ú_•®³¬ßk1À%€fæšóË ø†TÓÊA )'’ìi˜XÓj«Ýxvÿwx¾˜×ª}à?·½,«õj[Uëœ¤ðƒ°²È)ZÓŒ*¶0¶yë鍊uFþ0!ŽÂ(1¤¤l‚ãŸâLÒ5ù`;¦4héñ€è8’ŠÂøZBw÷ªâ% „àžÀ /÷C@yÓŸ-ŸCãµ6OõUpl{Ér²bÑI¿(œ¯ •Ft¡â°ƒ%3Ú“kÅ;Ôô=Tˆ•;[¼aŸvòVõŠÓœÃ„§I%ÇŠB¸©f©V%`À2@z£!l”£ª’B Ä›9ÑH­¡YÑ›ïå3Üü¹$³‡`÷;«®ÎÂÆã)‘,-cµÛ·þÕi%TeK-åFzªó=xØø¢ço5‡R³ÛˆÞ­°¤ŸÛÀðV’WkPy—íQE¡ºáT!üûWcúLþ— Vß‚#;÷VØòc®O çVŽÐ,Öég‰Ò0¤ÛØ1J²¥¤²¡”jÙþ7(%ê'óâZD¡{W÷ùړà Uóqâ‰âO—«v“u»YDÏ ‰ZÅQ=‰w²‚ݹÝb•OlÅhÍ«ŸÀz©š+Ɣɓ¡âŠÇ#T¢øŒi‹ŠONdZVµ PÜmõ‘‰”ξ±Ø*Ñvè­ü·Ñ‘©Ë©:rÓ›ì¯]Á#”º‚4|l¸sÌ*Ì[¯ØMJ $ªYg„0µaxkO·MxÚP5œÊÇjñ6ÔDÇ_ ˆTè0… Æ uÀãgÅ‘ebòlgwˆ5˼¬˜Ff^ëÚg)_¬HÔ/†ˆ¡ë“¶WØé%¹ï•c>mþ·=˜hÉá]ö$‡ûˆp^VÜhQ3òs«vˆDMµE³xŸ09h£‹µÄXŸ„_DVby±TQ3µ°=£i¨¬&ðäOßæ&þ;[ògt¢z^ÛPlq¨ò$JÌs†öG­}<& QÂèñÄÁ¯é‚!ñÄXÿÈÿ)ĹÚ|3¹”"C:e&ò+šr¨E:qto)$øÏØL¸v‰…Úçwh8Ï-éØ}J·(g.o6a²fodÔ’ÒͦâvooNuÁÞN±Q\>Øî]‘]¨Í'ÌàâÍù©?g1vUÜÌûSÙ7J7 l(îÍ®Ž,°œyª®ûg¢;\iÓovM@k2B(éÆÝQh€Kª-àá6µ$0Ö®çºú® T¥Åó“<†€•Úv,W¯iíª×qOÌøê@K£Då2‘‘›ðü•þ§x‹ƒ¡6FãìV¡lÃÇ,UÄЈ¼¾ßtë­p}K¾š½üËõV,Ξ!wÒŽ´þ71Ì#‡†áëü ¹ôþqL,Öm{ÔZ;ã8î̳åþÿUŠI`A Oá/\ŸWÈ­hô„-'ä;šKv1?´v^v{‰ÏGYxÖÜrýÜ¡ÒÑr `=· X·ë.NU"g$NþýHÚ„Hçz#˵lK¡ç‰–uD”_3.t]Jµšæ¿îA 'R?s¬Ë.õzFéêÉím4D,Éã1í‹>ƒ» .gàæÑÈ–V†pözPB(ÕA?Ã;”"Iúmñô+²È…R“…¼Ì­+I>Y`¯-þ |ýlb@7¨†ii·pfÐð@ðXñMã´;²ýöä~·÷£}¥¢mÜ©4#§ü0$F¢ÈI €4ËqœËÚí].ý‰ìî;X[¿<‰ë°•QX«Á«¦1Ó(£kÄT¨3‰ ­¹qr÷´b [øÑ®w-¹¾нŸÈ¬)Ä,p¦"]ˆH6@¦ÄåÑ¢Ö::Y±ÝwÝ.f¦ÃšŽOh\4{t× frxì1zT³-4 ɲ¾ÅýŒ?‚´ë³BXFÇ ÒA'¥b¦?ýJª,<‹Só§–/yÑê ®!!]}^§2ÎÇ}¢âÓ¼-°ëÒýj³\aÅÙ5uœA½l£Ö(0gÄÖãÈÎx3à(Ø,‹x1uRîlسôÇä¿Ük*|Gö ±Bò‚yl„ßš¿7p²ÇÝü|r€f kZ‘1¿Ns±€P°bxBä¥5èm0‡m‡xµ@Ûa@®ÉÕ §ká’‚‰Ouüûd9ÇÙi 4‰Ù»;yKÀÍàp‘f)a¹ ·…hA[š|ÔÜ0 nÕŠo;cˆÕ]´Ê;úU2f5[dQI¾‹¬ƒâ1óGŽØ¤æX)o\ê²,¿Î.!Zß…XA–™«?Ï—/Óf5¨¹V(Ó4:RAâL¯¢ÚÄN‹éÅy(êÍŒ^§ÂVb¯Ïeˆ*tÅià,tA©ºÜÖBJ°®”‡A7á’Éq…Ùäý®Ö'ß :-ódÝçìç=7[CŒÐ”‰ò5³R„ Ñ*`@ca* ÇŠ¡c(Dð?b0‡‚äì †Hoq±/å=Ö¶‰ÓôÊ^B>c`Mx9Ï àôÚ`H\?¼å¦›d8ÌÿFÛ6ùÔ-jŽGÙµU[²xªGœ§¤ÆZø‡!¾ß ÇCÑ|:œsº sµÆkŠü~}cG/ët¥°*9¡io…«ÜŒ¤Æ p@XÄ99fe×ÒþÁ•@öZ'¤®Ê ÈŽ±YmÐ…!ä*kûÈTÇš3L䜄õ.¤XP‹FÆœå c‚éŸu[RäK·ƒÍ!Œ®fª@n‹Aó/c ŠHùw\lØ;ÒDI|àBp²CÜnnÇZRµ7íd CäÕÿ!ÊíñËkU­F”ó;kœ}ÔéˆÍŽšHRB_ÛnÒÂðræÄ*piwƒ&z?ÂV 6yý{dz­/¯²?$Ä5ƨC\zž=ÿ>šp·©xØL\Bˆ×ÆÜ"z »lØc¡f¯ š~´cÙ•–6CÙo·zlpøÄ:ï¥ÅÓ» žÆØ;o1цßç-èë‰EýÓ&íIžØjE/cQx:2òÞ§üUmùÐs«‰"NjZÄ•À;l5°äv+uÛ{„ƒÒÎÈ‚,¢œ“Ðv帎ƒBöW‚©ã1+Iˆ,‘Ǧ[‰ÿq¹~“Ú5Æöh âñ*J ó’Õ(8·á¿x!= ½?=|º¤¹d`¦%¡§ÛÙ?{šÛ9¯ 8ƒŒc¯#(8éT¾>F¦S M Bú¿Ñ‡sK¤†OÈû8IRÚïªYYížø¢ðøÔP¿P’½zñA¬ŽÒËÐq\Ð_XÅØ€ÞT²Q$Åo»§Í‚îÔ´H)Ù­ãɧ¿ó?ÙÚabц²„M!zuÓcd;„R0Êýì»'naDSòX°9[˜Ë( Ðf÷š´ý ÐkúîF.{~TÉè$ôcÅŸë¢údÚ)Ê’¶.¡ê¡ -ƒN šÿDÒ/ÄíȘN}ŒC¯Æèžà¼#ÀþX2x“ëT)[ú³_ëIJڶÎE´*×®mán¡j¢= ü™JļÔÓ<Ð0c²r?öÁ‡xÜý Ï¡ò0KÂæ]üç‚O\/ü ì§O¶¢>Í&jtò©¦}¾ù7P›5VR.,EüIAl1Ïæ¢V W1Ð&óPëJËS~éLÓmÑe?ÿ 6rÌSdv®t¦*Š‚ÀvùBQ-ªo@²Î(\¦{ LNûv‰@r„Kɦ2Ó¶t •x7 ÙØïY9PíÓ'[ªKOhME@=ê…2,?ÓÇØ_Û¨\gé¥4«Ž«WG Î7æÒcI•(g°%óµÁþïdä?ùînÌR¡ã9þ%«ªb;×ñ쨜ëý4cÌÓoªgìÀGظ9±„‡MÏLÆÈ›Gj Ñv¿ræD]e3w¢?ÿYÙÍV¿ü¯õávw–ÿXšs¬¤’]e^&(?yýÎrO%öþ›»ƒ},zÍ2PѶ8TöÞì·V®òIâî$(Õd çÁ‡?ï9ºÑŽIrº¼Ùÿ,/ò{%zhÊ:á$3ËÕCÄ}Ò#ø2aà§­ !kß0ŽË Õ.DõiêµÜ;ÀÅÔOâúö\Úë(Á4l¤`}ò«H{xßÿQꘞÿ_BbËw™!ƒ-;æÚÚék3ÌÛ~òßi>.?.¸UjnchéHe(ð;gw:G;Á유ìôÊYRi©«hû …`ü-^ø+I¾5dû‚ö7}ã¥vͬL3¡á©Ìªn ­D«w<Õ`­js%ÃÁ¼œ+JÜBÐÕ–e³!?¢âEOÇê°j¾`CÿAVoéNâW}°²¡w%*7·-_ô¹‰K¨tÿ†›ˆ£ŒEèo´U’æRæQ?ýécÑÙ\ØôÕÙ:ŠØ _¤»ý ‹~¿gx-m[ëÓ÷w‹Äaq^rø4ŽDÈ’iІz‹®„´Ö~í’H†§q~ö¢Q-ª’Üæb¡yZš%sXå8K²ÍD–]‰ýò Õºñì­šüc¦ç¡`T?Œ}:Öáh:~Yg«äàÜê8¶šIdã.&ék œà‹»Ú7üXY«D Ê ýtLjÃ/×ÄÂñãKQåQ¢G%ë¥Í?|ò¾f”c^ˆyj]ç’äµÕg;Éà®óÁ¿wÉ*ìr|ŽiÃ7$WþÌ¥Ÿ„ gý$†•9Í4Âïöи…IÀÎLp™Lë:9['¨Ñ–ô —Jž_'¶Ï-ŠªjŽ¥rwE<Wž&Q癀ó¢PG½ÊÈÁĆ_ò³Òy‰;sã9æ4¡·>2~”†×™ZKØñP5¹‡C>=L41;ÁY¢ÆŽv,’áö@P-ó?…ÙRè Z{lˆ#¾¦:GÈü!Ö«©ð˜¶¿kš«Ù½ã>=“Ž™$µu((# údýŸ¯oÛ7´zõÚÇæzl·ôÛ*Ün¶Ç×ÎGkDR@Ýäõ­DyyYÞºDRÚxsÏ9©«ô8«ùµ½Ú|>”Arÿ)¦~¢sþï‰&êVx{}n»ðH‚°¹ò{‡¹ÊŠ;˜øüÉ!¡ÞÓ?]Á,;†¬0Ö<°\x(ÐWšMéAH!jÕŹ’Nˆ“³ †p9ï+¤¨Å6Åïb’iiÐßýFKþk»©b«¥Ò/ÿ#«²JˆæäO|ø¤¨'ãOáš‚÷ìñ˜Çø’(”çô(ª \ÊMÐòé•Kÿ7]5– G¸@òó) sæÊsÎ7ù#µó ®‘Çæ Ö;uë—¼g ¿DJ‡k8Pû1 x.ÏÛy‚„ Q˜+Ò™ÔÞï“Ñ›¥ë^Î…¤J]ÛN”)ó Kð ÿ~¯’`Ó¦«`ï©E²w©G|JˆNè’HOýý­bPë—DO#¶ZÉvø´Juš)Ò·Xâ~õ@çŠNˆ k 5ÙüJ•AäÅÿ…ÇQ¦¯~·©$ÔjKðÝ(€{ š–/úHUTpµ¨n­aHÝ!×-?QƒàAŸD›¤ð`7£Â@WõödoÄ[‚’T÷&@².ºÒË¿XxÒZðUÏÇf/h¾2](ÑõÒ\Mg‘WðaÒìÁ¬«AHWÔ|wwæOtåÁª®Gž‘É]¸²(Ú0ì+3¶ÚœOÕµN6P¢{«"ËP‹wªN`Ý&¿¡·íçê#»ìô&¾éd[-» †£æ³feT9~Ó §²‘©OÝñžùñû<éU!MzŒ-û8*öÇp^RÉæ°DDéÔÙ¾4ΩÝ-&&ì Kl#N11ì}b´ ¡qé¾—ÃÝÊBWÙy ܺž–6£”¯í€ ð‹YtŠ‚Kí¶úÖa.jŠ=1ä×ZFžÓõx¯‘ªd[TJ‡†÷²(Õ!‡ò"´q(×Áü2ãÛi‰Ð…¶MqŠkvŒ[áä ÕÖÁLÙ V`‹\O´líŸO-Æ%]þˆœí àÈJf}°@?L+Þ„Ç9Ê1`ºß>ÜÅRœÏmÒ+üf—´äŸà+ì@ò…Мr9_qÕ^ dj\ÄTñ;µƒ`C»v}–;±NWç¬2WŸ|ö%Йö«g‹dA¥R" æk|¾¿ØÓ™ÆwþYºôV]Ø|ÔŸÔi:˜ü~¤E[ý¡­ÈžTFyð aoèð¯ôêÆÖ¥ðÁYSÓubê1#A/hÓ4Ç|PGøµ÷«>c¤÷ÕnÕÛôAYüOвÑ~ůáSõ!nó‚D,r„QåèrÄ4¦ÉÌšž<*„I´øÃn…kR#9Ò?Á”ŒèH,`„ê<˜¥—aNtƒÈ0˜"/’‰þæߺÀÇï!Þ‚Æ!ÑcØB~jÅiêÏ”_ÞËÏÍÔf.9‚ók•÷µÙe³ôükoFÞ¶p`“Øqê_¿žE±ÐJ€èR•*L[`‹&“Þšm¤Wö?|þù¾Ð/?üŽ?‹³¢Ä™H­ÔòÒë=¼ æ±\Ÿ˜dŽÜªb´®æ×¶—©2³#.:íñY†% ØÛsArÅÁ7)Ö úÜop¾²\‰-Îó¢ÅQŽ‘®ôñâ 7Bز2ªÛ-!Y`}& ‚¡t‹¼= Fùö †#?žœì‘s ³ÿT AòŸ¢2öÚ?Ô¢&xÞý m¬?PáÝ„#$/ˆ›ÞbW †K-ÝzŠùc±†ìa‹bÈü‘vb–D@f³9¿‹0ßË{4ƒi(ò¡‹ÖÈL“‰Þƒ,¾•ßì d²¹k©ÿqÞ ¨Gê"ÙþÃfØ!>…Á/ÀÏp <·œ$rN&­Qð>ýë,  2J_ˆ¥–Åw ±Â‡ÍXöRIxm¼äÍÌê÷Õh¯(C[&¼·*ËDfCõ J=~s­[ãÿ;UÄ$ÆkŪëQYq3”ÚßÇüÝ«@] ¨t¯¶×°²‹½@òq> Ò,ýèMÍèçPˆu+ò…6Äï/ï^šï·ô¤|–L¬] A9g˰Mùï5,ª†é><ß½ÿc!ÿ>ØaAcÅ)ÿ<ÿv• ù8¹¢Hê×yÚDQ"ø))à º2'Ãg$«ª‚õA“š2¬Ð‚ô¿œŽî<š£šmÑžÍý‰ï’ ‰2Yà5Tn¥ öÆPsçb5`JDÜ!õBÒ4ãâr «‰…6(²R(Í-“˜GЕá•y~ê´åþ[Ԥʑ*–6ˆŸ9HtYLyÖüïØU³*(,ù­Z,ÐÒM̃•- ô·ÉÅ8Ö%CCOç¨Ò”"Q¶v7›S,²»écs =ÿ ”“‹ú‹i-7€;œøæè Õ¤µ8ÝDïrå²¢ÔÒ67oðX5ˆvŽ;+Ççrt’><Úßedåsåÿj¤Bø‹'h­;kš^<Šº¶Úõ4V`ÅšºV°åµ‹Ï9TÍzojž“YÉv«öÂni*ëP=Œ¢Ï[tˆYA|—ÿE<ô[õ4à&ÆÎòŒàÞðö;˜‡mê!ÀµkPpA`®Ï*ƒ\ÍWp9] eÎÏ¡g«í¶RØ@B«7â!‰f‚­—0дȇæi¿!Ëî »qÝÞ ɼ¡:‰×šò³ÛÍBæóÞ ¾À:¬‚óHÜ$ºãÃ'ÊNniˆ?1;Ò›ß\»Ì€Ä“°âgyŒ_ž¬yk³s(P8Zó‡6ÈQAH}çð5íÄÞŽúƒ‚4ÿ~Ôi”ÖÃеuöçÚR­•Œ"¨¾@EaÅp» ](¬¦‚‘!(uçö,˜‰EÀ£F|ÄZ,_fçK´3Š^U˜iÄÆnf²òRñ‘,4Å蟻‹×Š`°NŸTÞTT­ó"µ ‰d!XâL;¦Nñ@gA_N¤^Pß»)Ÿ]DÎ:0ãmø»oª1»vx,t"å•îÛ7°6î^üÜÊ {Ìy=MKð›ä²£è­¨1:‚µ„×J8ÒÚN}5æBK- ?¡>£SBß3‰4Ñ‹]17Š@.åo=h)sŒ!Ÿ;2GÂD6•4ä;î‘2ë€ùøßµŒÐã$™É®fŽÙ½îuæ/’ÿtÜuDR6[™y8˜×pI$ê åߥt.^V™"“V±ZvµÑK&àý]Jþ¤¯ÕØ?ê.ÀüþŽ¿;ÏÏéêùa}]oßR?ííú‹ÀòJu:ŸØÖç Ö'‰_[%_{#–ÌÁ‹ñgj¨Ù™Î‘'Òn7Â?GAÚA‹, ÇðQ/6ÙîÒ01iq£Ï}À]ˆ)7jWâ&Žãþ˜¡BøÂ4B½!âFåB¦ë#!¶lj….TYÞÄQ(!‡±Ò›MÑeö«0/Þ‰vEt…¯-ùä}†K5ßþíòH/ù§´ˆÉ*¿(˜~rlưQis+vBÉe.ÉÏë¿Æ<í”æì”WÛš£&a•ˆƒyD-ÙšFxK H +\!f¬éhš˜–ßpþ=mžZR©ý^H`’¦|‰ôÏCWÃDa/:‚º&—ØËwž«Ã cù¦AüKبo²Œ µ®£ÍÞñVD€E2šBNC̽Ÿâ&kÓF£ñÀÖ=1?ÊèôiÏÕÔ‚åø§“]ž}çtfªëZoÒŸ \éH åÄ0Ìø=Èó‹Ì>Ø×@ðçóVu°9ÚH’šRScÔ¾æ<ñ\84œÄo.v!ÔåfÇx÷QZ—1Ž]õ¶aÔù=l[i+¬ÆëÝá+[Ò°ò2óK ·ÄF\vŸcÀMtÕ• ~ÃU^û<~ÖÜ>v„ô.©P¿(t¸2øñ±°¦šÅÔsœjzêAEjòµ»Î^·Ò8žóRé³?±…Z:z˜³¢øxÈËBhVß[ñ;oðVÏ¿D—Õþ™*vDOçªZoOGÊ= ïïêÛÖM5hÑè~ÅžúÁ¨#C부ኒÊÇs×ü×)ùôiÂ͘¥þ!øŽ‹éìÝ+Ë(Ä‚@3$/Í(Þ_GÜî)Â\@Bƒê\¤œØß~U^Nt»V˜I¸«^ —¨µââ¨x^ØãR“Ú!EÐOæÍ¹lþ›©¾àê5ÊŽeHS”0š`DÌOÈ)œ÷8†DC¤÷l‘ÔcƒÞAàj…‡”% ™´nX–YÍc9Á=}ëf«Xh³ ­ÏÐåE´½,ªÞk'¢ oHÁ4&]×âËyåÑ4ZþSô)6zÃGlR¬bñ±Úæ„b§{’E5÷´9U„ûqˆá/Â×"ýN¼kñ&žÍàà¬áV!ƒÁJŸDHˆlq¥PÓú¡Î‚SûÖAðÕ«sbÖ1"`Õs_¦\Cc¨cªj?ü³¬§á”“¼]¬ÿEí²SÞœƒU’U†›å—=@hæÙ 6é8Öí")]T³ŒŸJn³—å¾p}þZš^Ǩ<.»Üá*-½F¸ˆØsâIUYÁ´ÎvÐ'Œ«–Ÿ†üGÖñqaŠlóÌ+<¹©•…E. ùqbÚô}Žš¢bl£V×Ú«XsÁ®ty¤>Rsh£ýzh€Y÷£¤àS–qÚÍ%@ Pë¢oÐd+IÄäc.ö=>N,¸ï^۳ͦRTš˜tòÓQæfêáôë·ME¡¤!hñ¤½^ž×Š Í6( Ò>è"©žl2ÄÂ]ird†A‚äÃÍqœ3¬"{7öžC4š6RžÖ22-yI&¼Y”“"¦<0\NM¡‘¶Á;@ûð${xÉwÈ„åV<ê30Gó‰48fÒ´›t6GÜ|x¨³é,ô¤ l^îÝUL·ý4 wñ.»^Õ¼wK·x$‡ž˜‘ö’ðäØ*³q k*œX¼6«uøŠTùœÌJjåuµ«i†h+…pÃYøº ˆ¸ˆ«¿ä7¬µ¡Š‡Q‚Mоy¾ü2¼“+sIõ,óÚ:µòi- úG½uôš¨°'¬ÿWLãéš™ÀÌ&q{Rya!v ûg˜êê¯Àbë+f)Ì Öš¶4Z3qSÖ“äÕFÏ'è ª¦Kõ,æt@sÂÀáð•÷&ô(?h×F[ƒ/ôœµ¯ÁrФ‚‘bkñMеeé÷±;æê8ÂhÈça7ú•üo)!*‹Ù¥íîèï•V³¢ ýTõ½7 ÌR]—~¨ š†ã±«³Àx“% …@ètrFrÚ4›‚Ñ„ÌHÖ¢Ë ³akKRU±AU²@Md{ž&’QCvaÖ‚侄sH.ü1`Óïµ6¾TýáÍéF¼»OÔ뢸à¥mTvÊÜ…}#1ˆÿ1RI²Eñ=”ñ¢Ž§Í#—OŒI,­ÁCîö¯kÕŽ#«ß‚èÄÏ[IJ%jføgn½ü:‘Û³ !JŸI—ÚXî(˜ ;—™M’6aÄ `Óô´”P” ¦ì ² ”%‰eJ'ºÇÞ½ß1|DËÇWՎ٤ĵ‹ß‚7D[Q0ŸãÇê_ÑÔ·J™·¾”m9E~{‰_“µ±; Â߬uü6W–ëy¿Ñd—zì -3?K†9Ï’øGr‚(”èyºÖû×ìuöÉþQ:qî/Ê$;«iª= ˈÝäO8KOàÛ"…-*.‰‰~ˆ=\—Ž?]¬Å p ÕÄJ‹žYŽ}Þ±ç·ݲÔËm·áøã/‹6ÄÇÕO¯…!^Ô÷|æ` Å_öJd.Zb×/½9ÉvK‘Øñf1Èfüœ:€ñ› >ˆF¶ ¯Ý£ý'¿}ôžp¡_e˜[qdk?²¾ÎôT5am´™íÐ%SÞKiNšäƒh= ¦Y‰±¹´ 42GV³;>iØxHýA™´ðT0~ ¤íÛÓIÇN¯Qøˆ>€ëáa·hfÒöêÉ–RGùæKšÕÝŒC=hIÅ^Óˆ~ÞM›S;³èp2ÂqÚ…†°ßóÞ±úº5ÜÔýºŽÉþý2Š Í±¥!2‹ÞgÇÁ:ˆ™²ÕÜdÄÞªbÐÁ 9—Ìñ1=ø'?ÿc¶'P¿”å~ò•Á·a†#é²O*ÕÊ2 í+>™íþùp鉇´¿#ËŽÍÑ;`cz[!~XWvjº­4PI½?á«¿ÛC'ç.?UB QpÁê}4(ŽÆ>b tÔÿ0îUØ ü K2ã'~:´ÓÏ­v ¸ÐÏ@gœPãF|$5ÕFÚb„ ¤á¡¹cšVÙdã{7—ÀmUɉ¶•qùš5éï²IÑ+£ì¤ª #é´LÔ’¶SE¨?<æN5Pý¨!,äRÍ×Df÷TØÇEá¼ýôÉPù¾U•,`ýõE|3û#m©Hûsb†þãÕ„W•4Rç 0íî$ñ†? ¯4¶P|ø*uµµuf PE9ÚzJYÜÐ3àêчæ‡Â|¾º£3¶­ä+iÍÇ߬ÙË¢4÷‘GÜvüæúC«Òb 37ÓIHÇ¡hb·(†‡.&ä² !”ön…õüÔ‹!,ý8 JÒøYs¨¾ ÓÞŒùìò" •‹/vNáF­Ú„þѤcQÂÀZÖêÓI'oÚKÎnžè-XÛT‚SÃû'ôšÐUíèl/Þ³wÝ©¤Î¡çÙ|ÜbÑnî~ÀÓ3’RKÙ#xwô?¤ yë£B-òqn«  ø›°é9¹‘$Åñ4åU7Ž^„nñzy/ ”žR+(D3ÅUÚ€D2)Lñª7yƒQ4 e%bÞ÷  ³_‘Œõ/~DuÍðF(s%y5~TöcÄqR¤,73Kb¿@/1yöÀ ö>XËÉŠ,žå9!;øéŒ³ÂÜRl— Uùöì(c´Ãì<@–ã_<æI®EšXƒò-»ÁÜã›}¾¡¡ty*Á2Þ°è5FK°›J§˜gˉ’Àªíæ£fk•|RsF ài ^$Õ6ãÑæK+ é=^%¿)n&¹`€$ŸèV‡ùDí~á ðpg³ÊÿMÓ— º87›¹ãŽ@)‡Ó Ë/²¬ö¯ q50ðì¡æZà׋—צ¢:Æ:àßK ‚1(ÒtÕ *¾Û&ÞÄ” Ò¿†×$à¿áHNdÀ)ÃáKwAùD·4žJ>û{.Ή-GÒºdfã‹Äõ/'&âð”–\¬RÅORãÚÀÜ—òDÒƒ)SqYdðn/S¤šQÒ•ž5sÎëˆI­sŸ"*ç©«{ûç±ÐªB”"爾ÎÔ¼¸&šS—‹ òP‰ˆÆj8Yj‰®/ù¤*ôH‡ÁÎ{ÚÙç T>ªjí™SS¤‚LwŽ›†)¡áw=³?w¼ªéÏŒ>kËͪã±l1Õ®ŸÊ€õx¯©Jãuì—rt}m3,Mü?Á7|WC²r¨i xÈh9™íäh‘¿0zòUÚÉ“ç®,¡4uÈ7,Kœi¸ïÈÊ¢ÃW®}]gÙéï@-±Ñ¤ú…~)èö‚äbøÒðæØ&•[¼…uÏžÈ+e}]6‹RjŸá¬º§ÛÆDcï ¹XYÐóüÖˆMÚƒv X¾9†`å7ˆ…ûaYÜȽ¼•†çÌ->™ï“·Â?£m³»–A}$»Õ(ÇÀ—Sö'öM‹÷€8fv„ðß°•r7Î_,¼9àAxÿYbyRAp W0›M‚Ü®äyJOŠPÀ ažmÆÕ`Îr+ò%Å…±xís¼¯ð)b\æ|+¯j¢CRi”ë Tîò¡yçÁmªÄøE~š1r€$¾Ãs‚·¢òÝ?^hÖ›Ç ëš*€…|ëœÁÇã2C—13Þ*ó›OÔÂ¥ÛãA-òyP|]ŒBNÏÕ<©]¸Ö™$ä±¥øãØq® BYc:»Âð ´â“ÝÏ€±§UíÖ6,®&+ñˆ…[¹ÿ:aÊþùh}µ‘Ø(åÞ'¨Zb<¹}k ¿ÌǨvªéCå"+éÀòO9¬5ëƒÇ1l°­ êЫ´eÙâæÀk»?VKpˉfZ/8Q£ª¦®yGo3½òcì>˜l£ðI?Ïß©o•Å~Íè Á‹Ó˜JSÝâb6ýgDŽ¢á:“þÌ™·Ï¬–Õ˜‚ôãö Âñîxp/j6EùÌ•ÈmäÁBo’Q¿Çº^yËCq R‡s(sè:¦…à[Ó6éèù%ʺl%;è¶L& ã©â›¤ö!TîEUƒN)T¾i6myñ4 ƒžYîuVwß«â/´3T'ñu ¯~ÁâH øhð!¶@•;~‡DYT‰,ßþ‚£Y£?ñìQ~$Ù*•“qD#•¤?°ÞèúàF®âÛ§ýe=WþÏsÌD•ÂCOá;PÜ£·aÀDÆ(Æ/’Y2çNµm‚o+SüFEBÝäd^JK´«;´×¸kÒ/S[ëç‹Ãü¥.ºqn6&8"E´Qö>îU©”R÷–GÔã•-£F×´˜¤_æÔeÿ¢QÌOg%®³š`"›uñéia!{æ² miGb('ScæÿJ… }JÐŽlëÉL wÖ#u`p%´Ò£vbžYÖ=öŒ´N Ä@–àWúœµóÇð{ᢧÆŒhÜ3BŠX‘Qêµ+õ–2_Ê…i×>‰ó6}/ó¢F·ÝÝy‰b6ž²¤mô¶ÌiEaÎù)j3&'ÿiªxÒ\ÌÓMêfÇ “ÑØ°d‘¾í×6¾©d…g9ËqcXte„W=^ ßv—£Ñ‘$ºKº°#XÓJ³Ü€£âù2Úg§×t›¦G_ÜMk'' • G¢A3þ†šôO×·Þíó²°ÿmägÔsÕ7Áâc夥4 K»+¯.•0,ÿ!ÆÚ/ÏÜVVDÅ¿vncúåñ–™vÊöc`ÖæÊDû5H{%JndG¨#noŽ«ô|Iö°8 \*9°êTT(wÔjŠC¬<™Bå¶¿(Ðh¢\â‹d±gÍô¨r·¦”þÁ›I®ªÀb"Kè2‹hg«·€·ôîñ· \:¦Üœ¨‡â_Ù§!flá ±+BÎÝÅé~&]'cÀD+Ú à>¨’¦HÆ ýÕ¤ÂÀÅaä%ù ÒâÄÞ¨ñfÎÀm Ž+¬^„K>œ¦n> Œ§p.I ©”]F°¬¡†å Çþl\?Wþ± ÝÆ¡{rèÒ£â{þv6N/iÀ€Ò6FF'oºÎÚÿOY°–Ç6ÍðÍê1«'_2ù’ŠVøÐs ØñÅ,»Rm¿Ñ¹…Vmƒ•cÒ€æQ¤É êÞ²Í#ÛNßHsÐ-.¥P¡Þ)-ý…ÊNKe§•ÀçAÕóxA¾‘3ÀEÑ .”&çr_æÅ–îú³…l² ëfª]).ŠPCG4o× YyÐÄœ2&;¾7Àºc€£ 6+Þé†Ò&F ,K_¡ÔÓ.øÁ›óË¢rÁ›Ä ª=/é˜ý‹ÿ.A Uql:rÆñ¤æX6ܢѯ¢¯L7ë’’ç(U±€$m|¸½¹®ÿo»!ÍÐÊØáÊã>eÌÌ)¿Ë®e†À1ñmy±v\`Ö `ï¨`¾·«÷&ì’&Ýá­c5ä÷¥Ù[݉¯ëCÈç™Î®d·N<ËHæÑ³U±7BöW¥Îv¦ „n±Œ©Ï©¥Ž‡‰)¤1ö~Q›®ª4rîñøÇþú : 1€t¸axÍò¦É›Šß-8 c_pn=žB˜¶Þ­PXº¹‹Éß¼Bž*–çÀ#Kü\Nÿ8×®lÅxœ×¡bF’k„äVV8Št7T©¿sŠâßÿe°Øspèmn®'ŒX#¦ÎÈ *{ø©ߌ&?‡” ¦š3LŸ´¹ùh(¸þ“ïpö=dS¡zݨ)åËÌQ“ß@Ш.d)(s×i=ýFì˜ØÃ­,*dâïö˜¦•/«æÕ D•ýÕ¢h[®5È~ÝŘ—«²º;ZLöÁ4m´|qÝœÁåØœ1e×H¥;\ï¢Ll1¼hÚ¹š¨Qåú¡•äz5“Å8c|‡ÌœD_;ˆRR±UÓcÙ¾#J€™·Õ˜£µÕ•XÁ¯)ñ4Éém[XjF•iM°•¡¼ÚE [Á•þ#~'³¥«§ÜêFÿNpFÓ¦ž†8LÕMzÅÇ‘n]U˜Ùû„ÀÛÈÊ3÷O<Ÿ`š»Kn^¬‘%KÉ™lÔÊË„9fåýGÜläð5ç4ca¶9^F=e ú’iî\ÒЯŒ”@Í/ U7˜-À½ÿ Ø|ž2§× 5%µJ+ùk‚fLBUÕ‰TºÉõð;ÉRŸž}' :/ÐR<ëòhÞ†ëâ0l·1â¿ÿfÙÊYk¬ê8âÈ)~tZ]$8 ‘:tÏr“(H·ó–â$ϳÐýi™Ï& ޼+&ÝVÌãR,¿ù¥(p³';ù݆¾Y‘œCŒƒºß×~zJŠÿS§þx<®Ü#ùïÿDL[Ld"Àô†pÜÝнælW“¶¾R³ù—‹Å–sÒÞ4>…ôž‰ŽfóùƒûóÐÃLò ™8Ð4Xä»À[ʪԿÝz›A#!Z”ßíèõÌ‹äõÖn$ùô–ý¸p¤®7Þþ×øæ{hëÅ|€þ¦Ö ²"ÿ\Ä÷¶ttXT|¯ïú‡úìÞrGoQ S•ÿ/}žrh/òHöæ*ÿ6M¼b2R” ;?‹N÷0œÃ¼ÀÊ‚ƒ[Sw?þ߬cGz¾å®ÏYß.jc\›ˆn‰Oh醨ÌÍu×£h>šG°#ón±pUãµL0©¨}Û^çLZF^ùŸωP|.ï’öP²î¨0búC{^c`«!  ›wˆ€Ü ÑT‘tꢠ·a|RglNmÿ?BkÕC7e˜ðG«*1ÇCM·Ýt…ì”I¬jY¿ýœ-Ä=ôXè éx}Zmy[±ü¯„ÌPgù¹Æ·j[ì|]!@ú"“5"½.OG;íMÏÄÍp-5nÈ/ž|Ȱ­ŽîN"À•£É?}â–Vµê y[v;ljÊöCDf!Ø^Òkj¿Ö¡•ƒ>58m×Åœ£ØOÈ x´ø(5ájäoCþ¿8‹Ñšè!£ ½#nPšä^B¿Á;ᨮ~KnC¶«_%Y=je9ËÝNØÑ&\ucº(ó«8ÿkf_°Ì’Öò¬gnûkᨎ½(ƒÿTfp LœÈ.¶ã¬×7/6Ù–NàO‘x«>œµ\+‚°„ÂßÚ!p/ÈöÎïíÛÑlyW4ÏulLl—ãRÖÿLP­>UK`S¡›l¤”ÓS–å=F½"Ï võ4@¹ ¥« äJéùßMý§ÆÌ¸šÄHtJ¶ÈfN6º®˜¢’u ,fäÍç凿¾¡†bú _ÖmD<¨ª&˜w03ï½ÔΠHÕÓò±4‹²{ÔÆx–¾z6̺Þó×~ÝŽFF|¯+®ÜV\·í²Ükgß·ÿ=ž^#˜ËSÏ%Êa&„‚öV…é‹'Šv|¶Û:y‘Ä$œôXJI¼'Rà!ìI¹í§}ãGnÇ,TäuŽØiµ!¢1õ x“›e)­~„ó}MiÈùÔNýiÕZ (Ç Lʧ¯ô¬8ÇØç~£šA=­ñA[\.GÊÆð5‚¦X'CŒ(y=Cò„tÕŽMžûáD_Àh%¥Ð}>WýÃåŒÔ1|ª‰ªªöÉ ŠÖ™¹5 z8Èš"î%=ÞÊax½TFLu€ ·*õë¥}$Éá-j:ù}÷0 'z߆Lî8cçw®ÏW·{ìî¶z©áׯõ —´©¸áö‘ÞŸ»Ýè5N:Ò²Þ±Yöì=ÔTCóÞ¸ê ß+fÓm Ä1X#œŸ~`##gæëÓŸRÏÊ{qmiܺzíM¦l9]ß $|¥xì°ºÒœm¾ÊÝìª$|hO´„|MB8 ŠÇZŠÝ¸Ÿ‘uR²Ì)ˆ ©Š-ßõ;ÔòmRÎËkúç5'e‹Ä_lÓ—ãÕ6íywºËà&ŒŽ¼¾HM2Í¡A/ÍaumxJ£¨Bý˜‹(fß¼’ØðJ‡b˜c WÊÃð(ÍtÇÙÞ-FEÒdH^‚ÚxÝÅ*\î•_ŒÐy–_ˆ†Ì˜Ê rz?ŸŠ›Q;ü*Œ©uíþ¼ÔÆj¦Ss Èò>áFÃ1¸Ä–UW¯¯É·”æ¤Úz“ÞC:ÃØ»¸™ìãjgh4 +Ö¨Ë9¶be0!ÂMÏé$'¸é`gAI2AC{çë³l$™Ñ×ëSò‘ ì3ÖöýF”Æp‡•¶ÉÞ”N€¹]0ˆÍ¿óõšú¸ç-·%O É×>)6F†­0—Íh‹’«mu‹€¤¶&#I}f Ôæ·Ð×UŠ•¯ÃÅ€Tß1÷ûrÞ3¤ÈXz‘]„•¼>±zÝÀ8ÿN²¸°•¡‡é\¹ï‹Ñm3gU½¥* ÇnQEH¯=tëX¹éþ\÷n Íw½†jܧq¼ŒrúØŽÓ”¹.†Y4}1FŠ#“!ãÆyoI‚œx¯a—'iXïªhwBA.Bk¥¤ÂSX`D&>ä¯ (Pg-5-Õúyëj¶RßIkvn­˜ìû‡úØŽÞßÈVü,mËôLZEóuÎ]ËjzÞɬÚõgUWAØ;pýtúþ$ò8s rÒÏ Ð;ä§$#NÁgf•û1èrÓ*¶VH|1‚÷%Wu´#Š*:†xTÏ­LyˆÙ=ýyêi ËwcRÈçgHþ´39…I°»QSó |šŠG®¯ŒaòEÿ¨ 1¾m%8§¢ˆäž–Û¼».¬{ŒZï\,­Q Î4|îÔâûQï¶ë¾Ôá¥øþ Â˾Ôïá¥ØŸQöÙ3ê)þøuqÒÿ%Îg —:ß9YàñNt$æ³/p첄„Ÿ×N Lü@$½¨ø›BmB ºÈy3Ô¢&7SSp@Ð7#éññâ ˆ¿ 3ÈNF/ÿ`³Å t–*{[£+#±X®;%ÚUÌO®½L^ô÷ßžS´Š„1Z# N¢"y©(Ž˜CÏyLÁM¹ÈÕ)GPŸ»Ù™y”>Ih<¸Ãâ«\š`Qî;sÐÅŸ˜ZI§ëƒ œrDA—ü™uŸþH4Ýø]^¸Û´ÁK!Trð‚Ëkô,Þž/×°$¨;\v>Z윧~Y*¡Ü@6­ÐÆ÷<¬|¥©â°Oˆ ˆì/Є4ÝrKâhˆ·Z¸šG|ƒûEœ6G‰´½µV´ç9Kt*µ·ü¯wRÂ@¡ˆä&Þ)¼âP $! ÜÏFìÖ´nS<ÛõšOZM÷qä²®¡?µƒœ êv$ B00 SX#3v£yï£ùË¥fÓ/›Ð±Š ± ûp,¦àÎ.Ø}]q(R2§¶ÇÒÄ@Êó8Ää*Ǧ"€Ûä\Œ˜ ýJx8ñL4 [sB»ë%Ö¥–:ü³×r`Ÿ¢®Çî|3ÕÄ»¦3“í«rLy±ÌgNÄ÷Gl9øÅÃÀÀ'ÈÅìÓ4‰8Á}ç{aõD°iö±<—Ö̰~=´ÀJ5U¨ÚÁMÆo%vŽÄø`k×}i[¯ÄT]5ýÿJ²ŸÉpÔB±7G@B@%ƒÚ>X:ÁÐ/rÁgn¬¨rñïT{TY´I3Á>òæí)`”ëto¹%F)ëoT*~Á³#[©K(¥›@¢Œ‹¨ˆe¬¹ËJˆ±ÌáÞ•Ær:@ökÚòÒ‰?&n€ÂABU“þ˜¦ÝSæÐGÌ^møX‰ dx ¤¯)Ce A³£Qqý7ûìEªÉ@êûnðõþ £‡­&í¶§2uŸ&¶›ú,[ ›Ëw°e ZŽ‡Ã°ìY<2úU>z¸ ð›(Ye–‚£õœ°òE2F×±þë]šå|y[ì÷bµ0>;-€ug1·ý R¤(…Ö¬J)ƶ‚)LÁØ{7RÇC÷9ØýÓÛÌ׌k|žòÃäœáÜGùSæ/l"äw>ç:H°" t~eàþÛŽ RH2§º¢£^¶Ä{5TÕ<8U3‡Ð.õ"ª€¯‘/Ö‘õ®§[rĆå’ܪ‘ˆÊmd|ì…•¡…û:‹þÍdkq“¼š²–ô:™jbÃîø”FfÃÁfLú™T šá†C¦ò>ßÁâ]cçHÖBÓ9ÇTÐã…QE_ªrW‘”üôëKL´h 1d\ÿ TmË3¾Jz<úãWu–‹¢¤ã“Gôº‘ÛŒ- Dí–DçÙe6¬ˆaúê·ž$%Tj`ð\¢§"†¤çú< ¦Ó®œ\…¦gCÂÀñW¼‹¹q{‡þzýl·Ö çÑÚÃ*c¼ n ݃ïF)9ƒ{Î`Êz'DÈæ¢Ïfïç?ZÎo¤<^&mõ¶k-C <›pÌ쮀@îÜ©¾iÛmP~.ñ¬ý¶V»fë·©ïxš@ÿ)öR”³ å+cŒ19^ô6X§±“²·U< 7µf÷>Æ›0Yéûûë÷þ1‡zUÑrÓ"­¸ö§÷MÔUÿúB¨J=!ïpådw~éÒNÕ=Xy-WÈÿ(2$ K0 42ÓêVtšõ´Ð Ô]–«zo‰ê)0/ìA{^û( Àyvooâ1Ÿoš6~÷ÃÀ*¹8 ÇD*ÊI*­D «ˆR€”èŒn8MPœü¥Q• þàj[+€ŒÆ ÊõÆåÁLðÛ¸í"ýrD{¦ç¬¡Âgž£ØÍè‡X¹YIœmŽ9 Î×!‚0ÑÈ] Ô‚€ÇÄó}»‰ü;×ÕÓÕõ6€ÿCÓcöìOíµûíèŸø{ÃÑ{øu5ü6øvI}¾ßì¾o·`ï·´ûz`ŸU)}»mü=7?†ÚOªºÿCw‡¯g}¾çïá¨ÿaØßðôÕ¾Þµøßn¹_o`ûöô½ûhá¶¿ÃÒköìí©ÿpÝ_áë}¿o ×íéûtæûzØý¾ƒ·§°Å¸kC¦H]©Ï0q¨Ö"ë¾ö—H û®ã¶ïJèÓ­Ö}%ÈCû÷Ý‹¦Ýâ¢p;vV«öøou,ý)þ2 ÎrƒÔOŠ?½;¥ûÜ FÎC9!œr‘:Ð…¾þ~Áú£nG¯G·¼îÐÀ ‰,’”‘•¥=%ó† ‹™™½Ï‡’^Ö$4“ð>Ódìì„;-í ã:«úó+]±^–k£¢­É+;®E‡€\dÀò¬Ê¿3Éü[Ì a5™;_vtXDÈ’›'ÅûÝèjÊOHe“¯ÿYƒä3gí\¬ìÄn`!€­`7§–$źì>’ÐQýØýÇVeÙÑ'OùÕ£ý¢m©™ Js¸$€éÏÚù¾õÊQ™ ñ(—«¡ªÁ¢ü:ñ ¿FšMb¦6—AñZÄ•ù¬ˆ•†”`læôÖ`—ý¿J .å}¯ö[+Ä“ÚÔ|3»«Ü&uÊzOª-.…|?¥óÆl[u%,ÆôÖ X4N·‰ý?ûëé.d—POpâÜIÌÌ{°›'KBrÜ¿O¦é.L¿ÁN˜ŠÉ8ËL¡8÷ÃÔ7}ç„m£¶ ÏÃJtŒ±ð{0M7¤ôä0½,ª›BV˜>b_êû*¿¬ø °4³T¡XÏÐ%&|Ÿ§³­EÑ,ðT/sâ1àè½õš¢ 'kÔwº‰«Û·Ù熴•RÌõ|uÒ}H‚D!²Ò-NâfªÞjäâêh%óÿtÒ@B±ŠY5kYH™MŠ`‹ŽIÙ‘b >3køf«¦]ôÚ°°þ©9ðx\ß1SÛHO™ô$)MŒ8ü"™®ë‹å¬ì=#"à²ý –oà÷ü.‡Ÿ~âãÖY°<‰FÎæ&'T Gñ¦Ag¸êåDâg@ì‡/‹73hþ•Õ`VcìÓi6sÊ~qY‚hçKÜ‘36tf gQ¼ÁÀžæÄÚ0}¾U²Ó  bŠ!¯÷ndýLG) À•ÆÞx-$ž Cz’ÕÆØJ L¤£ƒë%¹ *MRÿ«ÃW_—ô™Ùî‹ç ´ì)ÄBb¶ç(V0iíîó3bÄ].rø]3“ú§Ñ¸Ï9ýï4#YææÓ§z4ŽQÀ`öw˜dI CP2¥,œ-¶—¬Ê"y½Ç&÷¾fÞ§vå§`£§î¡àìpQ„…È¡gƒsÑ®½ÙÙ1ýÉx ©ýˆx`c%'—žo—.h`ü2uˆ}M%Š'Æõàð–,ÚÓóaóÁ¯A’5“Omä%ˆ;a+#Íÿ&ÕöˆL;]5¾)Å»uìWÆ“cΛêÃà4peÑ/wïç{zO_bV§}ßÙN5¢‚=¹œ6”lÆ3‚ c\ôJ ÜžOÑÕsËtÂò&¿Kl e<¦:òW𝽂Mò=:(ãgZEƒÎÇòþ.aœÚ•g3/Ð †ÆàÁ£›å45ÙÏl5{ËYSmö:‡…:fëg%äœÕVØWðP×D3>ê¡ ¦ŠÜÀéŠL/Á0kÌJús›½¦lŸ+; §±¹'›?†Y¡ ‹?KG d$ù²€ä<£a#÷^òó ŽŽT«»[€  é±&ïѹ•¶“˜v1x¡¤…f·<^q¬@ z g¿¾Âøw¯.·ðZ†öCX†•¿Ý§+ssZ¶"uÞÌ q¶½"¼âœ’ mÚScu-õôÑ›öÌE{*âÚˆÅÔ[MäO[µ±²©ÒmùÆ&æ:â$,Šöê8Hv tÛÍÍWågò¸X4&[Rccø¤[¥kÙ ¦f¦Ìc¾¤4©\\1ò·kUž4¥Ñvp3Ëâ|{žÌe£’b”TSÖ ›Ûr½“-n·ˆM²mTü0¨ˆ[D¥[Á¡a‹Éñ–²Ó÷ò€CZùõ2‹ÕfÆ'(t¸( 2ÝÞLr]~Êò¸fÈÆ{^@Qoƒ+éÿPõ®}=MÅ'¼€¸â(ã ‘™Òô ŸØáçÆ-ÌmÅÔÿ|¦ÿ P§£Çáp•$‹Ã)>§¯ Ýimå°~*òý=‰—é˪ÕF5‡zÝ,˜&ó çÛsžl™lf>¡Sƒ·ùQ¥TŸrÎ ;é:ÚŸlbÖ\:8“(åÀ1† ›)~LÞ•[(©;oæÙÓäÊå^˜c¨½‚ì¶ õcëÛ8xy«T–©lóF ÉéÂ#ÌPÞ*ô¶j„Æý>q¢õýÁ:4ޝ‹Xþƒ†½^Æò ­/ƒ¹ ÓUy šÁ#ød w|ÿ'þ²Á™q! á³å8péäÍ'ìÉöÍ ˜nŽqûÛ4}cøIªÊ\ý0¬%–Eo€šêƒ?kÌdü©…8¨Y "È@†hT®.©Ë8…‰PP"ô$Ûq#_`ED»…jZ•®Hÿuúƒ»#uu\ÿ3ªï³ Ùíõ{PÝíîŒÆ<·^ú½Â½Üx]Ò"NH!#²­ªV¢bá'ò×w9<¿,“œÍrÚy|B1ü‘/é_ù]¥r’‘}cÿ!µ~ß…=©Ã⎠òo4«%ñ÷TeS›¥éS@”µö=ujÇöLÛ)+»:çó_8ªhö“€"-Ûà„¦ ºkƲóìó+psúa©zW PK„}Økh -öšßÀ•£F¹ÖÕwê‘¥]O2X’6?zAà¦]…£¥‡Eà«3þí.»{2¿y“:¶UÈû—½úfnIZÆÖvgHµ1÷;Ù%à2ÇlÝÏe9B•3þÖ »ìÞ? B Q?LœU£Np}ìgŽ"ÐCÀ ÝZ®¹»)úüèòÍÞœR¼&á<¼Iž{p˜‰§¼Â,¾²Ó¬ädo”õòI®ÀxÕæX—–£p0 ¬ÖŠkv%uaXÙ<²%õ#7ÔÝî¿ôCŽ/joò =O³,@?’i¢‚ú'‘œÈ—¥…—‘Ó×§‚›IúŒnݸÏÇìŒó°VØn“!çÅjÈ“ÀO+‚ᬭeî¨Hž`%ŒZ}‚Ð9•æN»•ÝáÔ²“žš¥Ú}Í&手ãÐâ}B¤÷Ý« 4ŒzËê,/|U¿OêíÞÚ_= ãA~µÆB,~ÛñSs’2^7ÛT]™¾ŽGø¢oß’¬¬ˆ‹JóÙ{‰)' °Œ¥ü€+·á/äB¡úTóÏîí›ÙÎ2„©OuÌkÜ0Eaˆ 1`ßWd-ÁÎzDp•ùL"#þ!•3ÿoxÇçJWˆgbZoœ…„³:øÕbÙ·—öcjû‰=¼âÄ Ÿ G(ËÍÆÈµ8$!È­„­ ñ¤ød¥¢B[Oˆ#KÑ!ï&bŠVøZVh sàä3jÇŸTÏ¿28‚ì §w*›]2EFp6Ou¸û™ àÒAãkOï0<éŽý§NXçNQLòz:ÊÅ…_‹„¿ïâgù-Ä6QØ“tð%ÐHs/§ßásX´þë·êb MÛlìÎA¥Ò²;½5ÐÈ1îl¢#æÉú“ˆC}á ž¶‚ö%È5Ê÷3gP)2F¯^äÕ_‰†Â“Â`WÁ,Ö8U?ÆÎM5ËÙÇÌ*Ft¥¸æá…\ö whÆ@¡o˜¸’Æ,Ei£YÅØ$ü+Áoþ¼eÜžL.˜`™ª~S®ÅO;¸Xß%ƒ|ô «HqsÔKPßqLôf¾ô¼çqbYW×ÌqÌRŽjüÀëzÝð'TyÍë/ùCôý›'|hÝHøÐ´žC‹)Åà|q³}xêÀ²)i: vZ¢‘uC—ã.’yÝ6„oç™fªÊaFòx³é]B„â/eJ]öløòMfÍ¡‰s´O›)_ÔêD©+³‚·7 ¶TO7rMé2)Ü%m*rr(¦¢0ŸӊHz‰Fûë©ÿL€<›à¾cz8ƒ6TÀ&<ä^ÁIFnh·Û^ Ô;]‚—ø6ö¶6ԫ<Èöëªü ^¥ÆÅ ŸÝB%z4‘JlvÙÌÓnn’Ì% Ý£nÉ;¨{›­HµjC¾°l¸»ïm¢/ êsz`|†òO{Ž´ÐÉ‘Äy÷ÑMÔÒ/oË"ÜœŸÏ£«<ò%Ë”CÝ{ÊÅûµ9ÛÍ ¬¯ŸõÝ$W¢Ë ‡>£‚ÔŒ_&êÚÅ ñã¾ßÿlüXÞ±myÓ0ÚðagŠ~œzBs¹aÞŽÇS§OzxߡÙî§m!/3Ü++#5c‘lÝ9®„ìL¶p@y._öcLù´8‘"²£…ÔùµÈ—?Øöt˜Åm•è!F_µž °ýBgÒvA*v#å‰8Ósi&XËR’»ÔÕôBgÁ<$˜`pÍ;ø=’WƒU8\Y)øÛ®qz?š2/ˆ$ޢ޼‚LVkƒÝ„ïPßðAôUîfê~žQ¹y!JÚG¤R*üÊ·ÿsNóùm°UBäNðÇ}¢© ÒKg9|Oöj5Å÷‘’©5O5ýnCã‡â„uÛ`Ó͘RöeRÇA3•ª*•°ù¶ê (.ZåÛ0PcF° 9àwV.QÕÉn“µHr⃜ܰ`ªÈ„`Ú.Îë‹f5LžQšäOLçͯ$7…ï9ÇýÜjûË’Å~=EF}ƒMgÕPAà?xÁû„[Çó^NÜkŒ¾$À±D±SEWeEÇ™²ÓÕh¸±ùçû³ÖŸú`©/#LœèŽù”¨[¤ë~_[©é’I¶¾q‡<2è@¡Zü"¥ÀsO¨ÆKKlKè÷ó€]ÆŸ£–B^<¶än.Ðäeú…Œ ¹MHÈSצËÄÒ@~ÙÝâoMdhf¯FW@Š¢Ör¼.¢Wˆ=зƒÛ!2G‡n¨ÀS‚’Š}T’Àû»h3oŒ¿(£&‰!´%;n梳Ƶ’¹Å‰·wRÉvþó§ì%Ín1ÆøýÈžêþŠ?ËÌ‹ÖhìþHÅÆZͬfÉ´ÃÂÉØE p>}ö—ÉpÛÞ23ñu[ 4”‘è\‘-C! ´Cÿ\Ó0&­0²r&ô§å’q%‘ƒ#º±.ki¿‚"«ušô¦ùAìx‰5 :ÌCö†Ã‰Cm8^$4’×*=“²¼‹pA¥œZ-“„TÞÞºb;˜{½hßu$äy@®ð¡Ð¾« G½àö.AW€Ìÿ_†roý4¢jÆ–Ž6%‹ãž§Æ]F®]p¢»îtDco=½XlSÈä}  ÓoÎ䬩£¸ã’Å~î•éYL-L‹`ª÷ÏŽv—<(V¡ž1ö§øø¦D`v~&Á·JŸQ2À‰1¢Kc݃tÉ9XNm™¯îX±€†20±ÍLI–¤Oå‘þ”“ù˜cçjn¸òd/:Z½BÆôûŠ"àV’Ò¿ïZ#ãŠx¶»—ëæÏH‰}Vô>ìÜL%1¶ù+áxxà*SÑÞµI++œˆ¦|FÀ&™#l{Cß~v—*`è&’ ƒW¡t{"UG”ÇAôQš“Óø6,a) E»]ºÂQÅUgžâ5m­.ûþÑàÿ„5ÒÕúùaÙ*{@” slœw×V ˆÒv¤åNêüê$¯9ü±FXôÕ»U‘ßjš·wÆä,Øáq¡ž¼Pz.?ÁYÓëÚoCÿYÍÊÞ*s`%Ý`ÊT…P+`fUg0¢„õ’T®R6zcІAW×Z²e›Å_üô’ŽUø4wB›+/‚#P¨‡[n]õ>æÙ(Z²w9"!žþô}Ú£§\ɧ^ƒB¬ü“~N°K~G-_ºs‹f²ä+ÊΫîß0¹Ë6T—‚OeA=ðJeöû¹‘ç¨x‰ÙÔVW8‡Íèi;e+¬ð ˜Jë™Yϯy‰TÑai7Ò¹8I7‹}ÜÔµC¸/¾znµöŸä+ŸÄá–ý="MpQÿ ªa8ùÛÆßŽM'³F’B~«t PøCÞ’ NÛi½”—Ê{ØP§^JÀ#¸Ç°,µQÆâ=Ý[Íä’ûŒl p„¥óoMÜñFc0x¤c[™ † M;[EÄœTÑì‚݆FÞˆ€ÒÕØäAâOq°qÁÓ“µCY ‹Ñûi¬L†$Ìxt®L„'tnú[†s‚5›&¾»VÓ´š7¨…c…Áv:Þ•ö õÒû`Á‡zÆ×Î7GEÏØ¿‹ƒÉ_†_«ÞA5þà]ä+Íû´æå8ÎqÇ÷}W¶{ï^sQãÓú©ò[…z·GΚór y´»É;«¾òðQ¯Gó5$ˆb›gç¹?÷o@ß—l”a©I%C€Œ³¢£Š4d~ïÛ Ä…Ÿ¨/Ó×òÿ 9¯@Ý'¨•á÷Ã÷`ÓIƒƒ Ýz ”2"öWyn¬ ˜Ë£g€Ü¯E0¥0Á²½\23?{7ë¨bWZ"¤ìÑ5àº`BÛoX3Ã`ðÙèa镎Õ!œ€uEfkî.Q­”±=¼Ähs[Ô˜µFz$(IÆ îìm ]„mѳڨ)Û0={T¶Ä|&c壵),owι؄±ïõþ-^Äź͂óEYG½tù%Æx5’ù3¨Á¼§ÒGÇÀìxô=e?¹ú2èL4*Ëíô{œ:X5½¬]ÒËŽØCêÚæfÿo<ó´íÄÆôIœ, >–Þ*õbÁ¿ølÇk·”õäúdÊÝY0±½iމšËý4(½"_¶ûÎêõo¡ÌF7øBnR¾³r.×Ö¦læ~/HÉ Ò¡ïàƒøéMúpvóvfç^[‰U—×õ”"dð¿uÒ¾$õ9ñPìzà/ŠäaS-&ÖÂn@TU¢&kü,ÈsƒÓycáò-´ k⇊?#}uø×ÉŒt<¾Ú…+K>ÙµWaôž{nH˜Ã¢As$¶êœÚ÷BŸÈOÉ>›“' ³ñ%ÒŽïô·'´Hö_RxÄÊìƒlo1ÖîŸSÉu‰b)XþÁÆbüð‚ð´dsžZž,{ù-‰Ýj vr)\Œ0þ4Š›b)Cé(Åz¸Ä  c›˜zbíÚI lKåJ鼕COÉö… ºšÿ<"œ]ÜfÀâáú[÷U4‡½r5G mb8IÛFQº$À«ëóœl%Z£é߬t-?CÆø1ÑŠG0æâzÌÉwâÚOK4‹êÓ<:Öµh1õ¢55ý']DÆ%»Ò…ܽ-ÊÏ\'jÝnQ÷'ÖÀý[ ´œ¡!MØÙNY×ÓX^B)ehÑæñ9“ž©Îô ©%ä^YfAAfª¹qÄy*¨Ô ¯¬zFrwÍüÉ#JÛ®kÃôø³¯™È9»Ó¨ƒ‡D;­@'4½š¬{°±°z™á™'Ô0Ôb7½Š<4 o3Ó²æ'TIÒö¤ÖØlÏ2ªþñ¸-y‘Œç œ‘ÆÞ6Üìì,{³Ï;L ¹“m!TFôVÇÙ‰¬s~éPîã(Ë›¨åç-4xpÛHåK­owDpmºŸu,Æ•°£;Ò‰·&¢7zæ‹û‘ö؉ Z"§>o¦šÈÚmrÇüy4›»ñåܵžÌ–épÁòÓo™·É­«ö˾V’Þ íÊá-}EoYÚ;ÍÉE夑e@7Hi_.Õ0­¡0 p`¬p#bwj+t¸„;æÑX˜au-K…Åõþà埢%v¿À¬¹Ù‡ QwGºùíâyÌw˜®UÌÅ[©ík;8AE?Ьß Ò–µÖ’;_õÑщŽK.½ÁJ; H¿%‹ÝŠwéâcG¾a·¥“Êï“èe¼Ä–€*Ž®$IŠt§½Bþk˦ºç>-d€”T:§·ó>Þ\ã"Ùîœêðœ‹\¾‡7 ³ÇåÙ’ßÁºñ Y}NT˜j)ÿ?¾9ØF#«õÍå~I´ÝYóÁIñ‰8û˜KÜÌò¾'õ¥…¶À¨]ÐÞ×¾¼:{YªÀ¿qÑH– ¢¸¿Ô$d7I$2²ÌM?Ñ¿1™Fµ3;÷Kh·YââY’‡_‰0»I uË@Έ€Ù„šµ)Ô¹ötg9kÉ9²Ã±þ^ô¬˜Zw·n,B‹Á\¹ÝôÑÃEÆw\¤áÆ¥÷ÅuáhõË*ݰÊd]ݬ²œ +©Îäù€èÕíÈô$-a¢nðœ7ä7&Y7mï—î5D+»Ñ›àÿN['ب,èXкýˆð%ê­Èõ­™+}þm¸iTWñøÀ ?‚ä}ð»î¥CGìÀNWx¬ÔTÿm8NîÎ\Ü5Fí±Ì®Å[7¦ZÌi×7Ÿ»s8oÀ êûÀÓ‡™õ³9™šÉ8™9›{}L¯¨dŽ(çö(Ç×-'w°>dA©ØY\ˆäÛ ËfäÛÛ~Htž¢@ùyFËäݶ´´î€eŠ;(é7Z(¹‘­ÔÃ’ßÚ‡ø}õôL˜Ö&»;Ô¨0íN>I,ómRÇ‹®”š áHË”‰ÕqXw¤6dXÆÇxù[‘(á®á­•pE´À5Á£¸ ÛjµgŠ»Žú]£è-pÅÙØ¿Ж!;·DiO^$÷èë~…Iº~cäîf"f—þàà³ZÝz±u^åƒÖýÑã xN­#½7iJ…ü”—ÕõU–¶³z½J‘ç!W ú«Ê+b½„ZüXï#i‰¨ÒB8 ”6^YoVþð®ÝQL¤õÌ¡Vɉ„¸Ø!¬ÏÜQ2ßç¸/MHÙÅœGb*Tªð|@p£BáýcŒ¸DaÜŠDe%ÁûûF]Éœ,€•>n0i§ØC\-g§Í@ÐöË. ¢G4—"µõ<#ʼd‰ÊÓªL©Þä:û‡U›êœ(ý9-oÍï<Ž-1Pßp–¢îƒÀK£šzø:GÔü ÷ŸJ5ûªÐKÍ\H,Ä‹Ï@!“c®¹¬Z)ëŒDbèX¶I\m9˜7S˜¤§-RЬˆm„„laë KÖ˜¦S¢AôÚ§™Y¦2ç`uôѨ±9ŸABKE²XÞŸµ ˜ï‚¶uÛ zBÖ¶Ê7Œ~35#ðÅPÝß›&·† W)láV_ NØ]Ü©Zzº åo6@V@›ÊÁ,\á.[R¡o€süÐÈïÓøšßoÃ2q¸«/´³•ž @‚…2ý0á=r(žÔœ¨óMæ/)„Äþ¥—–Å“XÝqPdߥ«WÀÕCÂpc­¯›:¢÷ùå»ÌÕQ?ßt#¸yøÞ–¿ñüeõÚmõveÓ#ÏÁ·¿b¶Ñ¬e6ïKõM>†øTì;ˆ ¦aѺ£0(i{^w€ý°²¾U’Íô†„"‚]ko7ÆØ˜Q³ ËóÙÝ{Ï×xŒÒÓôdy*\Y6£òM9ÿ6Ä óc­Ë:E^=z:ºã¸t]+FÔ¿‘ªØ´ VÖXÆn-=.` Èi]}ò@¾lËΉ_H //ÅqY$×vÈ÷´Ç.ÿ7s*9÷¥IØææ‰%ÙH°Â˜èÊaý”øž¢Úð•þ±{íuQcŒE:—¶ 1*²w;t¡'Ûq—‚e³’§FЙ?h}}àu}¨Q§%xJÂ]v¬ÑA4ïK±âuC5åÿ{t/öF½N9î Ñ–²Jç°ªÞÅÙ7»¨• SPý @Õ ÿ›@²eS"ÈE}ËUã¸k¶°‰jÐCOF¾Ødnˆv³b{ãðËìz“q>Rp¶—ü[1Á?¢#A‚?^×ó!‘Æàâžlð(0}8‚Bø‚ëãP±ÑYÄ9Pó(1ÍñÐó·éK ³´[¯žŒiï#ô$}íÞ‡)¡Z‰±F%ÞêµbŒà™ÍyñSçEeäÕ*óÿTq£‡Zë$š g$â‹à"d6ž»Ejóq8I–ÙYmÂÜn°êÛJ´ÏÕ¬ˆ÷]ΤDªõê éÙ¶üR¶]³H¡½ÈÖƒ ý¢é0hþÆ-Ê&oŸ¶ÒñT…Ámš{ëUær^=ó\„Ä¢wC·Ô—D8hÕÂY´lmzª³ÛhèmÊDwŠ“fCÅ߯“/<Óã^†£ìûÖí€dgù$`ñ`µÛô¡)E·ýD;¢G›ˆ«‹Žì"C$êþ´ŒXðY÷®ž{”O@¼svë(q;¿a˶qý9)«0ÖŠ¬9Ü!´øÛaž`£²c:•ÑD}¢7$©¼<)–­Ï~ÈËNEp4Ï®T`¾p¿““³S*#KqoÒ&0LSWÖ;‡\Êãù§§| xÙ3y^ØX$wsèß|! Ï' y¿J¬mz±oð]ˆ Ûü·!ø·Â;6à4³T=Õ|¬9Åà‚#–EIØÕŽÔR õ®Ÿu,Å­"Áä}•åµJ´tŠL«ÕîU6úǸVÂî{~­ÀæR?f“½ÎýºþËôËǦ²ùF÷SlATìLœZܹ#Ÿtm²Aà+\fˆHZ ^{MžM}$b6SÁ×­¢A™ò¼–ÏÙ|‘š¡.Õ\'ËûU«3Ia`œæ{i"z= æ>x3‘ƒ]›ÆWÍ”ñµü+3—iÙÏl TìZ”J‹1uÃo+º\ »›û¶Ö:¼Yíuì÷,mL½{¬a«xSunT/× O~³ÉløFfã ¶¿ÿe,A¦Á{¬›Ñ5“#ðŸ4Ý4” –T…“ù©I‘œKí¹ëÑB Û±.åæÉ!娂Wv„Âj¼CÞÂ'šsÝ=qXXÞí–œ˜¬Û›£Bþoñ?åç`Jñɧæ`Ø_®Ÿ3¸°–'KúD}6ì6ùÀe ˜mˆxÄ,å¯ GJ¥xßÿƒšæCpñ‰0Ü»êÈŸ×Jì{Ý6â°«`ÊËU2Ls„æw®ÿ €úsâíã1K–¥cST'aÚ§Œ ù‹;`•~ÓÚµHNè©Pzï¥ù*4øøÕ¼ïÛŽëJ÷W2ZIͧÔÉÍÌÒDWx'q¥ï ïl¾‚y×µKmB:BuÑ]G6¦î=ÀÌPXós¥ !˜Wè9O?[çÊÍ—º×­*2Oåü×U›äÁæTËû?0CÚž3ê{¡jf³CU^ˆŒGRǧX/”_­Ìù׌EçÉ™¦d ¨TdWs±T¤§Ó9ØfXÐàÅ#ÁDŠ{kî­¦ÕOl ©´Â4#bw˜–²JnÐt­­|yÔÝ|é‹z}T!‰¡.§éÔ€ äô ·Õçöã~ýrUV9xãºx_mU©¹(æý¨ŠïƒÇÔ†Ø4Ð#’Qy„tEJQw% åm Ø‚Boñ[ah¨%ä‡O=.ÉNâóÉ}DÌÚ#ëÉ[á)`-ÉÈ9r^ÎÙ‘ ;$ä¸f¬Û¹[ÍeF‚:¶D9ÀqÄÿéèR¶YP…„>56Ù»Býcø²cœóÆôn§±~»`'b>Ê‹yE¦¯Ášˆ‚z~½ƒá-c™XÐ…µB3Ó/ð̦ '‚°á²IL¤¿êa´!ÊxJ…äY–rò?+Ô˜k ¿Í ÈÏëÏÜ¿ç ­‰½„\ÿbÓÍ÷X—ízÓÑWÃô`d3–4¿¬lS7­t,‘¦4Wž/þX«¶%HùqõÌþWÁ¯Xß9ÇìïfÝaPE[]UnûA²äIúKM¤„>DHš‰+Ö¼2wÇÂm3­ï®Š„òØÏmU !5(i /ÒN{¹ªë3±´ó\ ¯ ë‘‰ÊŸžEáC¥8å5®ç%«ÄŽùRóIòïñ ¹“É(5?ª%l¸¥ŠYK¼+Ó‚xÀˆx®.6ZᧈEðûV舻•îå˜ãß7·ëÔ°º.Œá^í`hçÉ Ø«…{qNtœ»cr‰ÁŸNP÷$¤êï JZ)ã`9§ií„ qÉÛì×pÝô2>vGkÍKß/g˰ Ï—Üå¢;>z4;—æ¨;4ƒ¢uNÄ Õ ÈÒÚãH¢+ÇŸêZÏLVÍÊ „X~›ß±©Ñ„¸ÒůÃÊ?-þì!îô=é‹¢9uªçÂfQçùÈYÏLë¬|´É˲ûúëßÌyw׉VØÒÔÜÆÊV,JŽ=T-3”ô|D! ´¬Dã·îUÆ~N ©È†V|¥âxPž 1¸Uoc.V«Rú]#gxq9=þúûMŒ²«ôw!ÑîAhÅ€ß%FtC„Ò#zN?˜ÕßÍà8H®¿»>‡Ñ½Ð…BJ[DK5|!=Íæä÷¢CeùH¼ù‘Ïq,™E²"«h9fót“ “mO1ObκNŒÕ­ 6R6 %èÅVã4üåÎNŒƒF%²‘¯ä{ÕmRiGõ.HÖ¶]£÷Z°ÊÏ¿ÝÞù᜺Rv:$¦ùô§¥Lñ=üå;]¶4Pp{€?´‡¶¹wÁÂ(€ô…œù­z¡óÌ+3¦Õ'Ò„‘£8d‘Â., $¼oYö1CFNö,°é~?ð]«\¢Þ|<ÉŠÎ’ÐÚx±Ù|¦~çZÖc>élL£Û~rå`I–Qí—&_nÅî=]Æ`"¯ó»±«½š,Kb†¿H_— Ž–t­³Dœ,‹‡1‘e6ªÖ€Æ‰¥|?± €jFÌ£ vÔK”K1µŸŽÍÏOÃ꽋xá°>úZ¦#‡¹g›}‰óxOißKÊ«ÇÊûãq-ã箫 ÖOº¢‚Ïì¡dEuk®ÐÊ“ç\D» 8üØr3|"ç×öþí¥‘èÌ9^7àú8e,¼QÀi] ÝÛöt~w-sN£ì;'ŽZõZ¦ƒçnÆY iˆá5ÕöL¤CA\“³ƒèw”*Aé5¤Ÿ@©êãÊXìxäxò]À,ÄäLlM:¯¼ñf òØ–\õÌ´€RJu_¥(„m¨xêdv£Ì7£Å@9ˆ6Ì«°Ö8Á[ª´ CM@ZÞÞ¤þ‰>@ŠÚ {TÌaXzA[KǬ.â‡sèžmÕ/QqS8ð>žJ¬Z\Ìmh¨º¾ë ´›½Ÿ,rCyx¸¤àøJ2’IÄ#k¡›GkHc€û®ø8¯¼·s T9]–°*¿:tíÖ˜1•¬žÈÑÓ—¯åyöµ(Ä2@W˜â.8Ê™ÁqI¶šÞWn=ô¸˜¿=zˆ&{Ñ>,ίdõA“yK8¬•d¡hî£ùí„e/ë&F”d€­{qûÙí–3'WkÄ`†¾QE{¯‹í£Ù0q¸Î©\^ðÈòçõ¬A—âò…ÀuIÆ»òý_ÑGÁ®™?5êÖk³¦èOnzªYi-BÐ-Àä°úo¢@q½ä~LE4°!}îËÕ Ñy#˜ðF„ÍÌ8ªÛÆ €ù áAnÕê c½„,d»·O(pC/w¥wmei4žì+UI„޶tø_ÖA‡ûâ3Z„iªý—B$mGBÿ~ü(ù…#([Íý…ºraò¸nšŸ5o%æ ø&~rKV\l‘Ž‹­ó °€31B0&#ÐÙÓ¡ò…F»Ò"]EŠc×nÄJ\$ç"š[l'¸2 \"zå*Óg|Ø|ΚĦ¾¹TѲ¾ýˆÄبáMÇj»×Ŧ›T²Ï¼å"½š9ÔÚ_RÍAÿD^ šú™ƒFLÍ(@)>õe‚õ8y 6‘Uúð˜¯JžWuž—µGí$"2ÿ<©â&ÃÒ•7Ä€¥\7|·ž%N¶Ÿð1&‚à ä¸z·û‰\wI+¬fYf—Òc_8‡ÿ0Ôe¡"u6±Æjæ6¹†LÙDß„Ânt¡N¼}‹8CVW’…ïÅ K´g§¨Jk’è»>?àÇ—þf"ìÕáüÁJhö!‰ÂJ[n&«’㪧¸ríZQá°‘ñð7ðWí ƒ¹Ô2Ìö.ñðÊ£p_ÏsV-9¤›U̧ômµ ®Ö©Û*ìF$ .y… n:0ËçùÒ¥Áøµ'ßö-U]³Ie¹2Ð)Ì)çè¿aФzN‡¿å×ôË }ªð"'š©ˆÐC5‰0•ÉcLf=1÷+T7Î30dëÅhL4óùbf<« @ÝØ—žä炉 À¹Ò­Ø>&‘| )©§˜JÈn¸_lÀÕ¾åàGC=ñTû@¢cvY—JÊûÔÜîýŠüyÑ€‹'Gñð?”ÌFhw²ÃÇÁ4ܨì]ÙlÀˆãACÏ%'©ªzPáM‰]tK²w1HdU!ÅV^lJ/OÒï oLøSà}òKÿu€ë¿ b"òÄ 3#|ÅJ¤r¨ Áϸ[i:Š|ófÿe¯ÜŒŠØ¢çÆúMßYÐ[¹Rª‡ON6~å«•(†²è{Qç/)ØÏ²Ý3ût˜h-¶$ÃÎØ(=½C™ÐïšÖÓÞ-} Ë€©y9ˆøàµ@j”¢k\.ŠjþÿHØÔãÒ‡Ô\¶X™.; žy“†Y x‚ðƒ*’âYb€$úц¢ÔŽv KOPË¡Á¢}—ÜY€k,ÌÜI¨¡Åï(‹VŠ8³ºT´¼‡RfÔÖ‘1 ».Á,´šLœµªi>zŸÅÈÏcqîzÛ­Ö\\ò—Únzý¤gîÒ°˜ Ì¢—lö0WEÝ¢7\ ŽuþÉñËN¸q =È?q›8°€waßMR>¡‘¼¿k+N¸0¿%ú…$p0TB– ó;v°éUp%lU|sÕ±mÆ”;j襕…Üë3¸™å9~l>„Ô„2qþZ¯®ùÌÎÀs“ÆWžzþñ,UPÕ ]RÑðaè1?IÞ˜mqhúÁº_ûCRÞ º¹&àCû,õXÖå@„Ç+5ÑÛ\3º$ĵíj ËabÂvoÈEÊØÿM|÷î¶%Ú­þr+qÍmþoN<nËU`Ù ÿ1Î-š‘R6j‘ÄìXCcÕìXZC|Þ¸E؇›ž·°ºJ^%=ƒÜ. w÷&XÈeÓsg£¨U ×,ùÏJܤQÆ¢9FŠÑ†:þ¼yɾ€LÕûPý=$ƒÿ€yú£Ñ çcüUÀ@¨š\.,öš+iéY÷ o FÈùÂùéNg»Q4TßÕû:ãÐ9ÂAÞ»{•_¶ØT”“}Ov¶ÆÏ·¨÷¾t k¬öͦIª­ÂFG0% $QÅâ0p¤LúØz]a¿ÓyJ }iõ¿5 '2‚9†G”£D™4¿è›Ø[Vù6Døñ­ì&˜ÕÛ-W/á ·c¢»×Õ¬ü£ù{Çþºƒ}àÞƒs\çÀD7ò¿u y\¥t=Òß]І¾r{žC½1f .:ô)˜a,áôžKïð-¤IމÆç‘q*ÐÔˆ,«‹Ë¶ü¦~ÓÕ÷Í’_à"DÏÓ‹/…$6'm‡ÿiÿ8Æ–lÄ*òÔ¯ñ¦K÷ˆ«í“—²ïã¤=ˆ/¶)€>"ðâOi¡,Îí–ªÍß,n†Ii¨þmEƒR¹m1¿v`|ÙÉÞIùÕŠ2!³vö͇hüñYAm©šµKΡ?9«Ü<¬W Ä;¬KÜ«PWNÐòKdKým´3¢ê†Ô6—ó…¼ÓgS[ºÃ9šŽ®KÁQ#á'ÁH­<×@ðz{]Ž]P¦¸U0´xцºœm ƒ‰$d»ùûõ)лn›ZrzÈJ¿^]qòq)A‚»Ô`Û:›iݘ.uû;]‚…*ĺ¶åxhÈÌ7ðÉb­ÂŒRšpç‘qo~³Ç&d0>`Í?ê»~Ø™ÝdJbm«Ô|uÏó{H^ÓÛ®zÓ¬ø¦ÜRl=2Ô lS™¯é ®¡៮‡£é Ž\1¾(Qž \1ò“4ƒ{Tþ¶âß¹‚¸—Eñኂ &ä¤ÎÊ>ôxŽBHºIÌ—Áž”ã*«,è°=0yá±+­#J=‘œÀ[KI§DÿvÞ¼ÿ@xÖ ÎJ† ô%L"pÁá&fƱ“˜Pº¸@_7ª¹NcÎøf} bÏs®ÜÓ®G9í)$>xˆ$ý†³?”­7©ç º,.ý?Š"Ù{z}<]M¼@BÛû!Ñq¯ô§d!ýB}…àd{N6ç*‘y—9¦‘ Û&.ä{ÑéÖ&·B>á'H±s‰Àd{Oq˜å@LJÍêd°' ixû$ÿƒë=ÿЫëË Ž‚ÞvÉs…Œ¡¶»:íäÚ«Ó­5$AíµÇI^¾ï§‘ ؆ÐrҠУªÚYï4÷µØþ‰Z }~vv¡w̤$ˆ›%ð}ébˆ™¾¶®bbŒ1¸ýïÌÆŒ[!?ÿ|$êà÷>UíLÛ/*¶#>(-bÊ:¸Ð'¬³ž€„ÿ,½C0µ±²Ì2„-~Ðþ]Ì|Nw™ iÃM@à[ÃŒòÇ$;”‹”s!ã $œ›Íí¤‹À"‡g••½üµÎ‡>]Ë@A;T_vº§BmíËv‰å¦í`ØÜTq¨Žg¡d:êp2¡½Cƒ¼dD¼öc,襲/ÖˆˆÚ¡4ûã¯@f“Â+çÚŒé[wzɰߔ {ê9X_˜¿Ãé@-:øªà›âÔ]k9޾o2¸¦Áöëwô¤SeùU:‰gmú…‚A¡Özƒ æXÆðV&ŽÍ{ RP`a'0àÂCÉ ÁšËF3º—&ôD4Ô»¬ÉÌ%oÒ®ê|çC±ÃŒQ-NÿYøJ”EIÕĽÓBËâ僊GÄ5¥B…2•Dìö7é)[Õ 9éœZØ(ò;'ã ÁzÄä lÐ@µçe3;IƒF(G÷Ƨ@ÂfŠº|5À}!D0ò…"‚ŒŒ,CÒíÕŒf}Y>KBÖÎW:ö.¡üÀc¶f[ˆ,¡·Wm| \ÕXFd€ +0'Gk,œ¬Þ}½ªü³‘ëíÙø¢DÊp©«žUgqòVoèŽî\D…œQŸŽë…wK;½(á€:’¥ã róªÆ¸˜’•”äQ¤ 9{çpä6º?f~ gº''í;77ì`᎛ö‘˜—#™¨iÄ÷Jšå Z‹Ÿò—o«É޹sÙn­% $¾2+³ä´à¡ìñæïay¨NRôl˜¢ý Ü0q˜±vÈ´Mpý&§ –ïe(=D›•ã o½éP¤ CCRƒ÷ÕÓ„mæ±Â*.ÞbûÈëS´7_ÛÞ%"dÌe:YܵÂ{?/nùå®>š9• ÕYÞ‡ÈBß^£Ð»ÚÇ §å£ïØ‘~ Éú!öÈ9‰nVñ1ò ÆÁôðNÉÜÉ>|…±üù2*Pöiµþà±Uø•š šö?ºåH἗缤­¿åu9CÌÊP0»Îÿz'¢1ÓŒüºÇ«òÚOX~†“Úh`< ð}zSÑß?ßÉŒd›Ä2¦˜ç,ë`……ÒÁdç¬êÝ÷eö£úá"jUÇI> 36½Ò AP¡Kh«`º<¼O—l …aßEþF>0&›`âêcôT ]IÁû—˜2Qó£PÕ²³#¹½^̯D²ÅΗöw;£x`ªëTÙs*BÓ³¥°Ú©¡æ‘w]]²»ƒÌÒ? ‘³3²²i ®¶…tö;õ:¦ÓhªÙb™í¢¤_Ærj¡æA$ 3În¨ÃUÈ‹?äÖ6×,©´m!u佸U7öð ÕbÆ¢W0•i¥Ö  ð3 –ã?쳎ÉßwðŸÅ41(«Ó ê©Y„þ\h6þ«ù­‘³3lêìm-r^ÿzãŠ1 ;§hB‡`†Å a$²CãEZ?ymÓ±¤110cäó!‚Õ6éÏÑEuêÒKlνêžzª¨^ëßÓ:»co€1üÏVFÔä•€CJ‰Lr5Úۄ܌ے²eœ'®¦ ÎNê!Y!ˆYÆCGB«¹{‹ðˆc6j·Àº•=nI[<`Õhvø¤]= ïéá=u0Æpºw³àϾŒü\‡iÉ|…AÌ’4ï[¯o´í›CÞm<ÿÝÝy£•ÒwéàÀbcV--'TíOzg× 1ÏA…cP™œÜ'ÑŰ®b…Š%Gµ ¬Ç{B2Ц{i«ÖB×dT?ø>îð¾÷²’y¿½=ÐA低+ƶ*R­ð/ÿÿ| ;*?yaz*b³îï׽ȉûÇÖ¨¸­V,»jÜúS¥û¤9´\Xïy-FñpO©Ó.yO‰±áŠœÄ•ÕË=Þ&è™X"P·;_݈â¢[- rG‚šÓì*Ã-ª–ÊÙqé¨o¼ mhMøÇ<, ØDè…]E»aaáXéû˜‰øbòrC^4â-ìø0 Ë IÏ[<çM•~Ý‘îÿP…喴ކ¿’ž|-b»~Z†».ò¿bÚòD}Ô4}gpÅ¢Ÿºex@Žo4¯ñŽÍ>ëEé¦èpæðåÏîóv0«ÊÊdΫ=pçë]>…©¾Ÿpë “ã½;(›^LÜT¼ÒÚC’åµ™´Ü¥å=¼Ÿ à°´éþ>zÔVóiÝH£.6#R©tû8ýfX3W±e3à»RVÇó>ã÷·"ßµ9Hï²÷NðxQ€CÜÁG [Ù73:^¹üìaC^üiÿx¬%ÕÕì…ƒ§~š}:!EÁ£0;XËô¨O]* •!ØTæ¼…7'¡yӢй‡Z£ÑvFî…„x-ZpýwÅ"˜Ñè)sY™öysȧ­{ Cüáxjlöóé‘097ƾ9‹k³)¥ÖT¼”¿÷ØÁÀ¯Ê·ñPê˜ø».kôluÇ/žQ¿'qXµ!'­Wì`Hê™’`@®é¡§3zv¬µd»Ó»A]“_Þ"<; %vy/Û…n2·Ó€°VœjåÿT@‡;€ß2ÿYuGâ{ÙxpÚ²Â]ÜëRÅfҨ̇Bª^Î]°Î=¥ëN2h s’™Œ˜†5îûÅ:Hæá-hÇÍû{`#!›V0õX¶1TS/>‹8Åb´%—ÊñR¡£ƒÃ‚>úÍ‹%ª„×÷êîJ eïˆMË[ÅäÔ¦ËÈàü9ÚÝ$ÿWU^<Çüþ33nßD}þêÑÎüÌ­qJ<¡l=ˆ9Êdf¥G´‹"}}ÞÜûæiúiY[çølw®Cõ™€”$LCºÔ‘Pvùbù©ÅÕ•l·@ÏÐOóO€À %Æùeÿcl =O•Æí}³^DK©ÿV½GB F'FbOÓVI *–é¬Øà†’%ÔŸú»õååFFA У^8>'4Œ‚“­6Þ“Îéã¢1Z¼×ÝBßF .®‡8™às‡yÎÆã¸tC) 0¿°‘‡øÕGñ=ƒ¨‡µLÓåJ£áØAy,À‚"*&†¦ÒRõ÷|qO§hçÔxÍûøóÓIßͽk²Ù¼Ž€V‡ 2¾R®À¢O˜¨¨,¸ €Ú19læžZø_þâîïXÌðŠU‚M}ÿfé9 T©Û¢ÔB˜•&¾u3ß„u8üÃÄBz(¤rn±uý À!Œa#Ö‘J£ð‰ùÛ5ߣš¼øÎ<*ëÎ4€}–em »¨Ḛ̀[ócr3>ð2l1§õdNC-íØ|ʸÒã?E `Pb¤É¦ÞPùÔÀ@wRGfª~¶„!=+`øzQé”0ˆŽ†%ßÒ°¤?·þœ/ÿƒûVY>$â5¿ÍzJAž°À´u^}±lÛ~Ä»±öü(5"ãH78*±×ô™¬µyô˾7VRÿ , ~¦Iß:‘³G…{L#ºKÔ•ŠM&³¥·æ@À±Ñ¸¸Ïé$Y„¶sÔîPsÂ1’±z&>àŠ¤3Âk;þÉçvçÒ"Ø{ö_v%uI4$$Dö_þü`Ó·N~+îªW`þaD å2vkð¨E"Q²·ú7RˆþXçî*0p?µå{’4 _IÀ3’–¡°g¾¢b[Û¯ŸˆmÌ1ø7•úaû_¼@êüª\%`yÆŽ%Ö£Äc¼êçµÕOÖŒî4ÐCx©Èãê”E?*oiÖQÆ"ì³õ!½0¬´H±€WvøŠ€|× ¹ŸÇ q Ï÷.q¤^]s·ÃHHk¡?nÉŠi{Ü€ðqÕ†oŸ@ŠéŸq¡2Šÿ"Q•¼z4ãßËÀŒŠV ƒ£_"0á‚ö¬Vͦ)ĺәs~?ègŇò@ MËÅÙS«f‚38™EqÄ;À»‘*…`7Šå± -+en iüÃ1y¡¸FÔ;ˆ8lt(ü#\žDgû!;)a†tð@©! ÎØýáÔ‹fË+·×ã-^± “sw •ñ~ðÍý:; ¬ÓTÞl„ˆØ ýÜ"RÞ$‘n#°9­Âi’èÝÇYÞ¹žðCB:F˜´œùœït,œ*Ø=œ¯yß »¦™þÏôë!ùsà ­6{”îÛÊð`5>.…:} õùIíyi5ëž¾‹¢°L f¥;М¬_ˆá—ˆ/î2É{Þ" ýWH”DvB¼`óÙã\ îmï¤FÎ@êLG¾*ÐF— @S:ÿ9ˆWh aÉ—ü4§ÝHÒ=LÐÏSþ·!ÜŒ âž³/+ÄE6ÅTwj?§-¼ƒ‰¢:\äY|W­JEù.Pm¡”‘>H¢Êó’ôeØ3² >.õÏøáˆ4¦êç‚Cªy Óv;oÚhåW_é½µH! %bU®ï'D·°ÓûF?gø/)®u<¼5î*ÙÉÞ{f±+žzËA32ä(&kñÑapé˜Ãþ®-,-äv3‡…@˜F#>H¶e˜š&иÔKtûÃag—‚t”â¨ešöí±Û^¾fu–}:--²)Uöa!ÇNn1¸»¦»I¥<Ü%ã5)º{9ßY3™D™CDT%¶rKP;ԟ‘—Ø di/%øV61vSŠ>y<ñ~Vª÷Qlùn\b7~êØ H5y‘5Ø^R «à»HY†ä|êWè³þ ÄúJàPß+üà SŸªÜåÿ‰¤ ΊGÌtPdUÄ˵Pá‹2ýÞ"‚3Y¥Y>9¶“™’ôkç–Š€_¸Ìéè·¢OØ‘ë/4z¢¹ñd{øÌÄ=XÌ8®%äÊÏÊ“U©ìÞO4>G§DTdñÄÇ/@W­+‹„UIEòÒHcæã"gå£.°ÚáÅKzéîʘÕ~P¦¬˜ŸuDbr¸«ÛÝNý‰qb‚ÌBwrq’|Y#£{N_¯Ñ×^ ]i$ƒM“µ’þ⮟ Ñ2r¿5L1hóC ÂŽ±CSl×"ñçbº_‡§þ”{×9Hóc¤=ulQpê«Ç9)¨rÈÃFÝÚÃõ=ôz ¡l.Í…½ñ¿þi5†Ík*öHh2̓–ûkLúËuk:"³|¦Uºû¼!ù÷ñ[ól„*u‹%ŒèÒKD$‚;göÿXÞ–Lx ;EÒUÅ|˜ˆv§åëa·V«J '“¼ˆÐ¤Çü*Â5FÿQP× n@"´ºr”ê¢ÿEá2öŸ[óŽÙ“‰Ëh† `â¥A… êBL9GMzçRÇž»äùš#qðbŠ4£®V€v[A*¸(˜îfShD%WëLÍPÏš{éq¼Ž'ËÛÙda(ïÀ'*%(yÕžn@dg$—¾T ÔêxÒgðÕ]ùmYÏåó#×ÃJ‚ Ùýõ¿E?ƒ_Ù¥ø&–ï–|ÅÀ‹½†Y>²Ñ`¿»¾lEÔp>hm¤Œ±Ëɶú³?nÅN~íA” —H÷f2£Áµð4•1ߨýLÆj¥øO]6£°=eÞž¶ ]Y@@´Ïc­Ï¦Š(mÌHƒx³$X£"ÖÜ9]R2sGšïâ^Ù‹#ÐVŠy£U,»êµà‚£Å`‰$ñIlòDݬÜÞ”sÿ6ê 2ŸË ·GúºÀéö9·ž`µŽ´ã“…Dg#\¸´ù=H~Q¤—<ûÝ¢´}Þn .ë\rЂð)ÅìŠ|ÊÇm~&¥6’flÚ- ]ˆM€È,éï;þHÕæ>8¥±uX!³í|±Ií?q1¸häHGË ÚVÒ`}µ·è©“Ut O&mæEÓÿw˜êEE›þóë$¹Ýž’ˆEæwœ¹l8 ÇmYj¥Ä®Êi¥È°ª3Ì Ñfñ-¿"`k=”¹´ŸÈ‹˜÷a•I9BêHÙD]×VóObW#Ð`Å—;È+[/ â?wlA·¸Þ Œ€ÃVUNxé›*¬œU;4·åÉ™åÓhzY¹ñÉc —<ZÅa.cÞ1xã5µAFñÌ4“¬O£Œ¼)î‘]±hç çüRì ôáØx3d2x’x´8Nhî[ Ó(7î$1»hƒãÒ2=û|+ÅÓN–t 3¸Þð9ÊøÂ±õpl~ô1´Ò5uqœ½±þ̹9§1‹’G‰6ÏÝè_¬F^ˆK±IîaGÓv™s4 ·Ñ'8¯„‡( ñ?ýHU¿Hù¢= Ë”A}¥lâSë))­ ÓåÊ*+u¶è«[z/!/"XÕÆÖÞ’¢ó±¹ÑB]>ä?òJŸ÷u¦1Óˆ_M”U]2¬›Ä¼îý̰iîP‘id¦éply‚¥xæZÅôtjï9„ <[â¹É»ý¤·Ërš¶Ò–Ô@~…¦•ÒØ‰F‰ãƒãc8·; žläp ¨®0í^8°sšEL[S@õãxzÛw®[Êî?ö¶¶ê6ðåúÄóÞ.ì!³æ ={HñÙà½0(Žã»³ÌÂÀ+@ðË…n܆3pÂ)éê9øîîp 2³ãöÏy ÇÑò0k‘‚ÿ31 ¾…7)}gpOø¦5Œ3õ*ˆQ5ñt㹋ì1¤5O¥m”5¿Á^p&;ve{Ú¾¬ÇIÆþU$œg’mŠshÇ[LSL­aùÈžøKÜÉøDÉê×rkQÜ´ ô!©Œq€o…±»ýŠôøÜx›·0(K„¨8 Ò±„Y-{³“ˆ¬|s1CbÿF„p™¦|z4•¤ÝaÒNöÂÛ±C¸ÞIÎüþÚÆŒßê;¤)î¦×%z0Š@“ÂÂ%$À™7>ÖÆ¿ÊĆ7Hœks”ÅÎ( ¤EQ(0ÈCWù«¥ûÇŽa…€'ø•9&ô˜‹Fvc2$ñcN?û È»ÃËŠ¿³-…ˆJÕVÆV,õ@ƒEtë\#þ‡Mõšñ‘ÕÉxùHs,o€{„³ôy"—nM”Þ?AaŽÜ„ZéMüšQ>~D·¸„«º6¼‘™=2 W ðBDðñ'ÏsO/ýùvÔð¦G3ÃÓíí[}z„ASí_\ºVåkŸ8mUÄ}Fr ä ¥üÀ ê Íú=l“ôr Fó5¡YŠ‚r-„Û ¥æ Òk×&•pë½›}è(콃ȲÏÐ’áŽ>1þ/®mòµ‹#Ö˜€ƒÍÛDÉ>ì0»Z*ÿå5Œ¹‘…V"UÄ)óžMyð1”ðhã‘»Ñk\"kñšÔBÚÑ §G?òˆ’¨a%\>sB5¶]Î ÷ ö«n3¸|&®V®TÉåzü/ç“ÃZÜ'¦S07Õ%¿Èoè=€&i!„S.;6Â~Öp+˜˜©”€ÄLñ^íâX0MCý4D?,â ˜ö8abÎqÎ'5VT¬ãÊ ò·“½*ØÅ€yŽNBö+Ö™¤ÿbBKËño‚cÃËháçÂGúp|?.©oáµig)7^-ÒšœO'À}zSSŸ ‘2Iºõ{èŒ?ù ñ¡$í…h¢©^vÂñ÷Sˆÿ{…PC¬‡åX„DÈ#ˆVܸi²ôÈÛ1ç"L™Ä¾°Ü—q<Ɖ!Ê¢á ¨GapñCE¾â_XB²¡7v0$O–àûc°2&êÀÆØØ$3#]»ÄŠ—Ê¨ô·éå·žq;¦‡ þš¼bB’A»‰B^6ø‰˜GËÝ0Â?(ä}ôœ®š­ÚÁÑ2RÝ‚ÎP=0²ÌÂ%¬Xj:‰©´"w×fîÅ=@ŸÈõNsUï[WMÅMñÃvú2KЗïz¼ÚÖÄ%[Ü£«ÝŒÓZ—Îï÷ê¯s5c‡³}œÚ óRè(wÑl`!ê•<Ïö¡¨êJçâöQKÉØç™–”„äY6÷ªŸZªSć·2ÆAœ¡…s9}výK½fƒ²IÅÓùl0Ú °‰H<¨ƒÄD—ÖØÓ¤côö´å&?‡¤áÁ·aÂŒÁ|9]=—•.Ôñ‰lyÏ.ñ6‘ˆ]¼ÍxÕP æZL«Ëºg„O™. :Œ•mv w4©*÷|E«vvXpÆOL£¸R0ÃtùIœJ*ÓŽàÞI]”MOñ¯›°mQ®Cü.cHÕÍÐm}M¤ßð8aRsfüÅó‰¿ÆÝ7òxÐ7¡+ÅJs r5¯kG«$Ú ¯ŸqgÓÕ`þbÊj”4ÁúR®Ҟgy²Bû~ ŸP ÀÐë‹!Ë=¯ÐX¨@ü‰+a—À])};@&Ê$†’þ&ëóÁMTFã®FÎ¥=ñß#JÝŸ›¢åð;Ï2e–ü{eD©[€ÇPKÂRÙJIpåšOž{înºØ!ÞèÖ¯æeì}Œ$ºS÷$1IµGžì¼rá½P0©¯”¶qô¦ùhŸ¤t‡[•̤€5&ï´ c;ÜKÉ]ò“~ônåC Íö–àµÌb¨+ékµ¸˜u.f^eŸÛÉáÛ±˜ñAÉõø?_YÖŠN„ÃôÌ«glêûWþ'Ì÷øß‰/#t[êiEÁY!néR—|v„{=G!ºy¦îw9çd³¿ ©—‚ÿv‹dÀXóz~ñ)ºá»Öü*0Œàò‚ðÇEBØ—ªêx>føÌÀQRËj#ÝA§lyu5R¿>,øÀ±ÒC0ÎNÉ50–×ð17É&^í·]3Ó’ç…0f’ó˜ow#HÄê^µy*%bz¬Srª¯v›]^›I[ ]y’d“îκÇZÑr'Õw5…UZ+±mi‹Ø‹¾¢ó<šp Ákä•öp¬é~Äø4`ýjimÿ@"öœhEá£1s¨ír‘©nÝ„ØéÌŒAi*¥+°y]q9Ù{K¨‹)¬ä§èòµó\Ÿ=‚@X=zÆpÈFDïtZð³çð~ŸE@”È—ŒÚi( D×î¬ßê±½ ìC+ÊóÌVNoDBêrøCD@RÀz^"ÓÒ%ú—p¯vÝ5HäÖ:]ñ}Jèö/î8g–Q8X!‚ØnKW"BDuƒR…ÜÒ‡¥‹`¨Æ£­¥J3Ã8ßfý×{þ ©Ï'âø —Þ ®'Zj ºŒ¶¬ÖÝÞ>0ZÕΘdÈ&Úo]6S4ˆàoßçæl…9±ò€¢5ÌÏqH´œN¢“B§ºyÔÔé[¼èïKDÂ"rqò¯ˆÑµ™ïR¤ñ.Ûm­\òäiĤú,¡±þâ³ü~ýõ*ÈH²OüA\é$Œ÷> T?!ùº-F}5ç$G~PæTZd¤\-Fw”.ä å³üÛŠ+[”5¹Äÿ m‰’Ãé}búÕPw’þ= ž’í÷įʻá^^Êá)*Í´Å)M£TÆJÔ†!Æ_DÃÑšímÐøÿq02^#ÒÛ)¹gcœTÕosŽkšJ¤KÈ”Iâ-]fžDâþ0gòÑþ*—;¾ô”˜,v³ò*ìlª¾:ð¨+MU…ËÀdáÐÏì°¸ü¿Væ“>3Ò†‡óJl©ËlhJ†\–A1†ß\ÁªÿI§O>O­4O»#«Ðȶî~¥—΂««\ìKcË•ÔtÆ6µT†€ÈcÚQÖ0g^ˆœ Ò û€æxûö"æXÚ*Úñ|îPôóÁŠÀˆõlq&”¡¢%ÚÕ6ÇTã¢~š³G²Ê=ü3æ<‡£¸¡òÎ¥< Ô1Œª{`%ü™ÃdNÓ‰OnÛ¼Pßå3û6¥_ …ÐB}³Ö¸·ÐŸÁQ¦}©©H ›¿º*F‘fBíbŸ³H¨Ï1§ï™š¦z8˜#Ï4!b¬D: o”?¾ù©y¬ì‰ª±ä¨ ìœÑe“Æ…¢O5Zl ”_ÅÖ^— MCÖð¥è‡ˆâ–^ƒ%â¯G3Lj}–  `@ËÔ6©|¢èZªøÝ¸‡I9*¾î•·”î%iO¥É=“ŠÔ†èà^Á`P%ý)Ñ0)ž}ŒzK‹¹óNí„Ú< _C ¿? ¸ŒWZ„Õ<@ÏýhÑt¦sñ74Y9de·^¹¢á-[-õ±¹i†¨jRÛVš… ç‹BúÄ»zQä|êT'h’0þ—¿IRØ›P#òÙc8ø**¸¨tlã äaòÜ‚tG!Y3Ùâi%+¯´ýUOF:¯¤qÂf(ß\Ò!3u‹ UfHHŽÿuß„T«#ñóüº¼*ZPyà€CÄ´Kìpß[(Á³æ%ˆëš}á¤oÀP½r¢b}‚æ³Ó$Oh~>gÕ1ãúÊþ ¼8 gxw"Sq9µéÍ$˜½çùÈcõDx9l´˜N)ò\‡ºÿ»¶ÜÕ:ñbX2 ­*¿’òÐ ïPTBÂ'­DÙõ[Š"Âux‚¯Š¦þßg›l·éɃ .ƒ˜Ý”<•Å…”¨V®eƒg4‰s}#Å´Å^Ikaå«¡ o™I8,ÝËœ?f/#).µß€]ƒ|“îx7ä[V cw×(KLØÞ;ØòÚB°ÔH¸êíô­£¶ZƒÄÆðÃS×5Nµ“²åPí™zP£½°É à ê,u¸‘®]͆DT‡djh¦¯í‡e‘×0ÔõÜ_T,¥×+mÄäU߃*ø þd{ëW)ÆyóPêÏïÓª|©e®?j_Tº\ÎÂ×ê©“ÊÇvÿZsôo³ÚîŒÒbdS^Æ1ÅàLh®öÚÈøí!X¡™´ ®·*l<Õ/È?Î(-eì³çŠ'Ó}ë™}æ/ì=ZPµPâYvÅ+n˜DÑH•_ÅÄŠ£Ûûƒ}¾Â8 ƒ,‘í®ÎÂ`³>;ë¸gKf-ÿsÙõ~+K!'s)k'+H4À˜•Á•žsžèˆè+Ubd˜ù·Þž¿UžI’ˆÎ1Žñ-àŒR£C-ÔA£ú­„að“a›Ú0:;o1 åÐÏS“C!•âö™ÖÝ¿…ªÕâ%Mc‘ôy/ÒÖó÷“im†H÷{ççX]Vч†W·+Q‡F¶®Ÿæyé?øVSu¦ Kbó—s, ¯ e5:4D;i´‡“#rl€'Æ¡á 0Øú;6Ýd¨Žøy)a÷++МŠÖXñ9×N÷g:¹¬òÏuYR´ôé[R ™®¤&I\ÈÏvUê5Ù>ÇŽ‚!”l…h“é ¨ 494 ·B@´mºiÐï«7ôÛ ¬l }üxê‹:Xîú„&³d}$›õpfÒ×uÕôG;¨S£Àu8O.$ÚŒ2­-(FÌó{·i)¢ ùmjoTÞ–š& ÄtÕMlœfÿOLB_€­YÖÿ{úºE0Âç㌸Ïè'ˆ‚,|Âu®üÿ?¡$q›ö¥žÐ¬òµ/ÅšÕW•A<ôéKôÇaØð{ÛàL[ñAAÙP Àù¤RÙÀßÔÏ©Í@­q“}ñî¥v øÕÆ÷øœPŒõþ's°6a£-+…?½{ö4‹J¸bïVùw²þ¾i3eRïÐ5"Ö‡µxC®EE-í¤¾íï2`éc¸=–³9š€=מ8It ÐA˜"aXÇT¬wfS?%EŸƒ±m¢—U3êœØµ“–ªÁÉ—ÔH,!¼sûme9¦2•.ök´‡Êá!>E {Þ¢ Š$þÆ#!>H…¬UæLÌjN¬wX 6hŒÜH»/â\c¡T”¶õï¬G‚Ë(ʜÿk³H¯ ñþ_6þ³ûp¡ˆëe\CªÞ©#íl‚sÉɺpE³¿¸€NŒž…²£-ÒfKnåý“ó¡#ù˜×ˆôñmÐKÀùuñ“ ¹ÛËòjÈϸ 7ä\e6B¯6Ú»)‡xoÀÞœÉ\3•NˆIJð^Ôó!d>ÖÄX’8¤æI!kÎ5½dª÷EŠ%ò“uÞ£ ]OÞb¥{uFxbbÓP¼§¡E‘ÐÉSz𗻥^ÄÐPpKŒsOã—±`P|Î Òu´utZ£§ ôvVLk*TL¹µbì fõgœ„ß3IðNËÑ` é!4y1„‘eµ}ê«ëL€Ë´A¿t[«DþG–>ÙSjúBÈ14:Y1O?yõѧCm™ ÈPÖì‚߉ŸºxŽsZR¾¤.(qR0Xïìý¡æýtÙnvØP”G~/ê@ãÚù¯Ç¥s>Œ×vø1\îOòb†¢£vBåû™é·—ÙA('"·Yw×us‹CÍüƒmA-iyˆe(ccLE\NzŽJJ K‘ÉTI‹ÝS´óqÛűc¬÷'?òБ¢œ'ɶãÿ?u¹-ži|Ph¶èIšïÿ5Ö†uÎ=ó塾yÐáÊ*…PG5ùÔe—C…( ÇåaÕÙh1YHøðêx{¢¥ åM¹n¼y 4yÁÄÖω %[ß|Oìχ³… èö.€3Ž‹–G÷Æ´(iVh$‘³ºä¼ß"’©65'!Ñ÷Kªc|¡æ;éo?[Þí%ÎþyHˆMH’å6s;'õ73¶óN«ƒ̪ù{P2ˆCŸüÙ W¿š{2\èȽ—Pýo!°ÆMxZáÂg–šèª¬Õqò‡-Ä ¬óL ‚AŠgÇñ+v7gŽëp¬3‚/-È®eŸÃr•¤ÅywERQd Ï>ÓtHñŒ¢Vj.AüÈyâ¥/öŠvn@)Ç´Û"õ6[Øü­†‡gß €5óX¿¬¯Cö ÇÁhéñeÌŸÖÅi5 œ8ríUtÔùØ¡T%Vþäï^Kg½”p§t[èSǽ7/Œ%Òºé]¶èÅg/tø~ô!ŸäÁpÑ?Å¢/Z@[Š6…Û ¹Ï\6~89Ôá²]ÿpCe$0AÙéšÊ ¦Ö§Âs}%P§‹H&ê °Æ^;°`ÎùÝt0®DÜ£ÇL‘±«8ç“e¿ ð=¤ÁLŠãêègEá€ÓÇšWÓ̶£™ iFhEÒnðó0GÝêèQ”¢¡Óá< Ñãö¥^[À›ú–Ò†]Y&¢ S% <¾1.Š7*9A&¿g`ƒß2Æ­Ÿ¹àØj '6z«nt_, R-qÜ@MîZY R¸aRI¯Ë&Ø=1ô–èB1r€*Îhcè äÞX\‚Ò›‰J›¯¥Êસöaœë¸M%£¡‚`å!¿˜¨U¯ 3Å+â`¤2 öyÎW/²`%ËR=¼ü•š™U‡Ü¾iž1ÝN$åzÁ:Û…O„ÏN0c¿¯À^Ÿ¨½{ï£ûE˜*É °´M.{mÙ0¶³S<¾¥H‡â»È£Ÿ»Îý›9ÊúS©ÀäTê–³hË[ þN" ß3W¨PªÞi‘ã Ô€YfÆ Èþ>iŠþy ÷Ýɦ’gÞ\K1_¿'dWn¥òú¡aÜxG_w'²‚w‹u³cR4ŠÜ80ÓX`p€Ûq.ÙúŸ7ËZh‡ÎiÈ\/‰Â7ŠÒû´Ø ¸“¾Wç"éé}.³)„xä6ÁÎM?Æ©Í^m¦ÈëÅ‹ûÛZµ²Hî7´Þ—k%Ú‡aO/vU¼á²žƒQL›uõrx׿?IÖmPô´§‘ͰªòîäW É áGüü+$ ƒ°z5ͼÐ9La„ª…õí·,õnèñ5vÒ_²ânð•ÿŽÖˆ…çޛӭør,KOk#Æ‹3qž»téO4e·ƒ?Dc“ÊŽwÓøJC÷™‚ö‰)ñc%…±ÑL§Âˆxo/q3³ïMxÊ+ÎûÁذÃ%Aœ Ѽë7¢ÐöÛZÀmÞáíe5¾DhÛkPœ(ü‚¤jîOëã$’Ýá_‡ õ=F«{\ɾçýà2†Hëöî C E`³QgT…7?´˜È?¤Fòýº'ïµ ¸Ýz÷a'",‘`ü&½Ä:|GOÇú§‰0yÛþ!Å‚Qsß@H¾33¡Äd}wÞtû4«þQvSlÌ4øaïxLÔÒXäŸÏ ®æ—FE•ãÆ“Î3$ZB&Þ‚ä°eôՙĔ´VAx²Ê¤>•q-ÛOûðÛú.ã3yšºòS ½S8³àÀ¹ñi´I*ðª¿ãrÓ€ÂîxŒe–è+ÿlëkí?LÄÏ]=8ßbÀýݤ×ò>¤Û1`+Õý·[9\˜¥ÔGý=†”fÀÂÓ ¦Í ¯±ÞÿRíD`X Ø­äV—N-ßÐÜ%º Lr’­”RÆPÛú7â9øŽ¹IR»=Ul”°V—ÎË'DÔHìÇï6GÖ×]üžª¹÷‚ø™º7éYuØoïç¹ðnîaÜᎩ…[ /Œ·ÅðØbÏ&®:}™ûô‰>ŽP`Y7,…¨ôŽWÃÄzðuâ–º5›³n.‡ôéxKÍuýíÊç7;ÌAì{÷Ìϰ*Q»‹£ +ýÀš¿îèy4ßeêÆ&=ªè{²Sý?_:BÆ|å9ëkw+„ñ·« À•¥Çºµ3‚U2à_¦R¿O/R…ló#â¹:l낇/Å «°Æ­¥”ÈSTúÅȶÂr0 »«ìš0ÐX0#Ȇ7ÀÿQÅkc6áH¨ÐÈ“b±ÌOlhVÜSÖë·¿gxi¥Êå›ÅùqhBÐ!:å¥áð„Wjë6Æ=¹½C¤‹9²T…Íöˆï4^-`Î,‘²ëÔ#%ÚMB÷§ü±ÛŠlï¶ ÈXêôâú˜ÜW9æ “*üL|m”vG^œâHâ¹4)¦‚rå3ÙÓämybÊU5bÊÇÍoR¼!ÓÞX%9CFpâ#¨9·¹¡ãPcúÒ‰O¡jÈu)Bw¡m²Ý/Fùe}rsÄÊ®*²«qèA³W’`áëÿF¡ïÁIž½L¶P$fi#–8w#u! V‹ áéB&=Ñrì:1ĺBy"_’¹ x´¥†³ú„!f2‚¾f9H DÍ‚ð-›Ø†gˆw‡ï¥í˜nÓ@ö}4_^™À@îô›¡±;Þ†$ Ó¤zã¨ÁâxtíEeÔ™]Á¸kÚPRxÌÛôÔ"–µ*—gq3}¾+8ÒšÁ;`¼Rø JM`noÖ…¡ŸMS¡µ¨ùs»¶ôØq» áØ=ί7;cÂeÕ¨$bCP4Áý$ÔXBQÐÁq…:€ÎáÞø?[˳ÿn‘Ÿº? cÚµR²ò©Fù2ÂÏ <"þ}ÅC-ˆË ·«D/}Xí­"R,wüßf'¹)'Ìt^5dg÷Ï‹Ê÷³ÇìElÏñ)«v½w™“Û¯ß8Ñüaé=V}߈7ÄηGcoJ.±™¨ˆ"g¬ÇW@¤~SHqe±’:Ê„“ÓâîÍ£µ;ñ·€¿—Ê¡›B;wÆŠc”ï–91²Ódô™™]¢Mª'V£bH‹7-a¹%’Ÿ,냽’f&£é½D-Mè›he“ «àö[à-Ï­¼•ÜUÉ©-;N,Í÷>¤²TóŸKVWwõyÐǨo LEâiR…䕟½9˜N%~á‹sSŸøH,Úh‹—šOÑøÊ4û!‡£ÏjÔÉúW’Õz9ÃT”Ü<™©Ì°ÿ64þOú;üö}þlÒoŠCžØn3÷¹§²T› Àýü z¢Ý^Dê9æüŽ(yÇåÄc~+oéñ±SÇÚ9,ØMeçLo‡°bí"†‚¸ã†Üëø¶JâË·‹uv°ÕYQ´¦TZ¹\ˆ­Ýa*§,’§Ú¼¼ä•hƸL׿Œ5¬_‡à¯g¢Ðzá9¬ˆ= Xý¨yO.´B^?,rxqäË1ð]jì§9 Mbr´ƒ³ü+¢qifH|ZXæåËç´±r”W£Øû+ʓ䜽çU)2Á(ŽMÞ÷—ož–:«¼k3LúR€ëïs b€ú܉¼D`4Ý^ã’àsþ,D,hS6ÚÙó¾-‰KZ¨n 4Ó«è’bu¹ß³ª¼­pàhÙ_ÕëA Ì…aB‚5 »`÷#BIÓ¡ÀĤvš[ 'ghmG·ð›"Ï9Bôðn­{BY‚-'‡I©4CnsèÜxþ꿉`Ž÷Xb`8G‚N f¶mu½ï[¦ÒRHñ;w°Æ!<¬iFŠ¥ð~±³ãtL]ð\)¡pòÀÈG† ÍG-QCt_p9åu§·JVz½@féSÞ.èQEÅíûÀ*¦€B—çA'uáô:ƒSÝ*¿)ÍÝìÜÉó²…ÜÝï"ÿJÎ T•熶¤2öÖß7¥Jìð†G Æh£¸l±zC™»f¸ñ»ÔX»œf8Ç’ƒ$λMåw& &*´A**Lul]Ðj!À’‡£Äè°:6qö…d–ºÕîØ7RûΩ‰QÒ( „fÈu+ëLB‹æ½Fµ:Â+ ¹3h?ꡟü tªØ~Z4Xß«©¨)Oõ‹÷Ö¬$# PfrŒÙÁ¥Ó3'ÈcOuÿGj(:Ï ¥x›":¹¤á³ƒcõpe eÕ ê¾‹>>’–DxÇt xï _«cU,Üt›5Öù?j¼{ØäÉ„!– Õ Üœ92©è ˆœ~”D ¯R‹Àîyñ<˜çÈ›¶ÃAΪÅÊ·7“í])˜ äÃa…ó)¤¤¼×–ý&o¼MyŽ~oÎöj®‰ÍwW qsŒƒ¡Ì  )!ê5¸±nÊÞ&±|úÍ‘£¦—š›Ü´ú$Û¼*ÚZ(ßÑ$ÔÔ•æµjÙM[W˜8—•QÏ9t‡áåkö–"}ñ²ãDB›|F‹4ŠQU>]¿0ŽÞq§î›~',J£õ `‘ä-!/ðg‚§á‘ÖOü+QêCmÒ"Û6rïh@²s]€“Ú™Ri\Ah3 ±á <£Æ—V„+©ýSD…µ„LL’öA&´mIŸ„¨Ws CóÈ‘nÚíž,É‘—fV§ØÕ¸TJê8^ÔÆ3LÏAnÀ»JNÝgÿ#R©R©sá€AÇ#mSÚ!åø#ã︻¯,1™è•ÓÑæâS%¤w ¤ þ“u͸<#‘ñ3G£²ñŒÙïzœô{›å&´ºÀÔ5“¸%ÚuG]§~ ¬qÍ—)ef¿œ# ìŽ[° +ø×YÚêÒJ]e‘¢8À£à–»_4u,G(’À¿Æ½'€²Í¸¶8öQËp‡ã¸ºëvV+dt%8N—þ=ø>Š~MÔ÷ðNS#2²€j†¡*øÊ 7^"g“LL“WRýß”a÷] b`_ÿ !Îb&½Ž"àRgGë»þ¦¹uÙ€Î+ÏTVô¾^.—61JÏ\`H53–N áà¢3f,7¹šøyÒÜÜ9å¿V{œ÷$J[¥(Ùiö² ÖT¾ËuÏ?­–­{†õÅ3i3hЇŽ$ä2ÃÖÿ 7ÜVq. u¼[9Å2ß ÿ(wïpÒ‰Ù¢ê3A4^qf€Ád•”¹¥÷ï„ã®ÖiÚÆ_Øvªî›Î]7š¨=DT “=q¨Ý¨©­R°áñ—Óæq깚CòP &?âŽPéOò”ÒDKEö{ïñ8çem.èEèÞ‚¯Ð©v2Zá©q4ƒHb—xxXž62oÉ?4]«šAÐŒZÑŸ >¸\L J¯ÁŽ f¨š6®†ªXsgú>Álì–Aå9x¾ÒÜ>JÄ!ænÞï– =Á1ö$hg\æ~–а=Áô<>Ž©µ¸½z5[±ƒƒxgÈ7vÅSÚ«c=²%<)©öáBAy6ÒMDáHÆ Ê—զĊò»X(I=í}HáúúR@ꢻŽïƒóªu¨è_1->ßȉ¨Íªð÷ ƒº–œ ®j V«)7ƒÉ,¬yükh™Lª[næ¥NË_Ï^Œ¿æßM ¬±Ÿ”2¢fUM¦o†Á&íI—^-’aX|=g°Ou‰ÇŸþÑ UÏ`ÏnÌyƒhÌ6$r÷ÿlýt =¹žNŸ$õÏAD>Þ1šcC´X^Åoe¬h!`¥Íæk zÌJ¥ÛÜÕáõ¼ âLÅÁÿ„RoMkÕ!E«áƒwÊ7älH¡9óhµ]Œ ’ûê÷u<>Ý8®j?€šË²Ëbö*E_‘Uä:ª°0‚ŠqTÊ«n˜Ëj›kßNdÑ÷2æÌD~¦%ìWao¤–/•w舦{”E’Ió!æó׿¤ñ“^ýƒª3’üuãÔ°ö9)» XjW2µâ²ÅÞ>ïQôë~]›2 úfÜ4öS¡»˜Zì Z¹Ñ ©ì¡ú™ eêÛ$[ ã#¾N®‹Ç…+ž´N1šºˆ215ÌîSñÐn p™èlôìØà—Á£CTÕ$6Øg³*ëŽ:ycÝïfÊÑ%²òšU{²ð%÷_Jâ“ ÆHQµÍŠO¨ñ˜½«ˆUeÊ­®Ô‚Ø’ë(=ÑÕ©fS£ˆŒþÁº†RGF¡—ZÙ'™üý(Å#•U}Ðzh3« hÁ“TaÉ5Øâésúi퇀Š}ëýÏ;)pŽ9$°šç°¿•´. ŽË$gš×’:²CÅ‘ž|=ºÕDÀØ~ì n¹as¢» “4Ý1ÏhF–«¥ã©9‘¶8ÎÕ¼K­DÜKæJ8¦˜›ëÜ1Žíc†‰þÑ¥ ÈüÁ ß Ç]ƒ .¸¬\i´!’`C¡¸uÑ»*r[8>Ó15“¾/%мẊ"à=g2üUh© FðDRC·ÿML°Bß> Ïd5jÇ3“á?S!þ£Äæe‹•0 O÷LÀÊŠ¤ÑIô¸ó7A7fG©Ë~Ɖ:õ1W-¯Òðlc½°VóŠb‘Š“5ϲDÐÐ|Fˆ¡¶•¬ŸßL¡½F>Äd†…‚h9Š$FþÅËžoúÂkªTSɦ–Éé˜ôˆvY®¼O MÐþó\Ž k3e‚þ,çÀõ=ü\-´ B?s€-=S<óè D°[{xƒ¢¿Ï ÀC—æWü¯YØ ”0î÷H8¨á‚Öúú÷<§âK‘eÖœ“scúª x¶þúˆµÄ@Z?¥_ã(u^LËõdçÐ\}Ê ¸§0 *:þ"[0l%¢®D™fU÷Mj5ò0n¹Ì¤M­¯*3ð)C`èÑ>¹ìR®6aÁ/¹“C(*é CS©1ZÑþ³@šgXPäO‘cÒ“±éÏ–‹šà䶆ïà¡Û¼1Á'x1ËÓ Š²7áß6Š2îaWÛ@¢¸eºÈìVÒ­xñ¾­4¾®ž¸|%/«[o í±ŸíØÏÛéÇþ×µõhOíê0áýW—êèoGI~­ý]žþ}<ÿ+MW Oú™Wϲ?WAÇ õieõt÷¯œbúµ£ö÷Óú«7}[û}3ÿmq_Uûûz`çSæE³BC,ªªímH-ç4lšä¤Y[–Kkú\rP¦‚[ Õ_ú}òjlO¥ÓêU"N”''¿íÄÅ Õá÷Æ‚õG œŠxÉÞ ùåáFóûû¿:\ìcÈtØœ®ÂT·,7+3›…¦oÿ~i¦| r]ú~AþÀ`°ηßꜯÑt£š÷ȃ.bÄ æ¶_; •Ç/JáVR¤4á|­”«±«™OMOŽÄá4»ÎI;xÄèCÓ Ø!÷ p‚l6Äw­Qq™ÿe¾‚;½ªIY·¿(è@4à†Æ £ _e³JºãÅêÕÑžO º?´û˜†ÂŸ/ÿp¿E9 r£^œÃÕ¨ 1SããÇAa­`áNJ?³ÞÎ`x…·÷ÝMçºqÐÓ"—Hà)Íøµ’Ùeœð@mö Ëiw?¾F;Ð<îl`K/Þp0ÚèÌ–ãíTF3µ & ºM©‡Cóó½ã°ÖÈvúW½:F—9*’2èàð¬ïµeÏsJDN-9GD™à(F× Ú§i¹ Þ4yíCçÛ5b×ïc®îÞKÑ)GĪa­ßTÆW”Ãòפvþi}4ø-{¾([§Vr·—ÆÒrtGdϰwÉ8÷LÁ}ø²LìØáäl/Ídµë‚ŽÈ2ö(Xg˜ßïØ6[½õôÞWKòJ©€KˆŠïtQ<âôÀ΄#øDñ ŽR‡˜Ò?Àò_[@g®r…úSª/-ÒÁwÿS€˜´¨@V4 Û–ƒ²»?³‚ÐT©Ypz ¢E]x½0€u’qä¿i×éÀœ(WšÔ¸=R<Á(²Ö íÊMlŘE‹ét]Ú@T§€Y+Îb1¦µ×ógÓ¨51ÉŒ Cm£Ê¬}˜ZzYñµÐŧØp.mŠÎžÎSðää\ÂF©°¾œRQ‰5;¶ÅOLN…ð”åY’ŽÂ¯NGõ„öèþi}ú²@say¨©«üeE£‡³* €€b¸›Ñ|yÒöwIŽþ³4Ь§ìçGÚ—÷†”$­Ðw§pv²ôZ.`º&¤zópo­ õ5¡š› ‹|Qýˆ~Âð|føöÖôª2è3‡–©1€HÃâK÷Ÿ'Kj·ñoÛY /±†Ÿ ÌÑqõ~éª÷ë¯Ù´ƒܼ‡øQS¯íU/uO¥K«Wšä+•”íÚtsiS$&ÕzÙLb ,ƒÄ[ü —§‚DaB:ªf„é7ìt“$/nkÿJ› ßÅË¡@ÏJ¨q$HË9C6¤AÝQB6ö/¶o¶1ƒ˜XC€‘ººÌd*%iã:â×þû£ƒSE9³Ô!ËþÀ¥Ma™åÒù /G ø¬óÞpþÔˬ]àŸÑ:7ŒᎺ|ÓÔ§¦€…âýâÊxLŠí,Ã[ÓNÀ¼aß©`7ýçÜŸTªüUc Î÷ñc0wÇïEëçû7¸4F8#Ü`Gç3­M"€gOíRR†ykÚb„z¨±‡VQW7‚ÖœC3–•›1œ8?®Cå˜ .Æ|+hV­gT‰'XDå.ålŽM]¸OH˜Ìõ&·Q¹_w…¢%oÙ(¹¡¶òý!¯Ñ] Ô8ìÆ?Zãm0÷»7ÙÕhÿ€iNÉÒ^sX`¡ ò€ÎWkgƒà[Å3ðÄàX7?³nà|y…‘·¤^©6$ìq ÷½ùñ#»wD}HL¿2 ó¤6+°Ùp+ϳP÷öŒjE9’÷âÖî©Ç2«_êyü·­û¯û­ÑV)Q$Yi¶ D–˜Ð¼]`—ç:ú÷ýq˜løxŽ¡¿(ñò-¿ S™sÀ)'&ÀœÂšD…J`žÌ‰àWªæ[ðÞM ³ÍÓéT\Ò` òP(¸’™rM,¹lGÈŸ^UD•öQr­×¤²¥¿W†p}_Ãø'Tvë:”à°ª2õ ü´°f8ÍR€H•äÚ¨¨¸X„ ÙçEõxã©g?MÒœ÷®W òGQºéåc '½ÑµÕÉúÞá¬dÒ’É’ºÑê#^oÝ`‹A3 1ÃhìO»öîê$lF]üˆ¸RÊGóæB>ß_X„©_£:r2!ÆQpjcöPNÖqâu1íFã¯}pA˜’œ;ÉŠl¬„Íy¿Ä•Üßâ ÔËßÏö;[c z€äR6yÌ[þßgžîsix8÷IûZ$y§Ð°oâXöâ)Xugµƒ©xB<ÀFI¯‹ÎøÐÇâßãÞjo+šQ¥ï mH…靨èKô‘lÛCóÔ‘ÓPÊphÔ¥Š7 jÔi1(?ŽÏÆín-«v§8w7–å2€ ©]?I<§`qrÝ$¡ÑÝÊÙoÕ —-¯[I9ˆVÜ褰eOPx¦ÃBŽˆt!©Uää§ê.ôÿ ’gà¿„¤ \óNÞmiû šâ@ÿ å+ýƒÂ™ÁA^.Éqyû‰ kÅ»†Ë5ŽO]4A¥~ˆêÏIhiéŠÁ£0H« çTºãõ­ˆ¾ðwùÚ.šÓfç†YfÆ5€D0|Ãýãº+׳7ÒçÄ‘2š#ýEÄÎfBÖª>Ì"¬"p”õŸE‚ ûç‰â0””Lb¬'ór ¬#žÞÿhHÆÑsÓ#áÿmÉVÊgÑÒ«1µLmD‘äMÆ%ÄÕ»-™y4h„U¼G–[Ó$Ç<§¶46ŠO¾âßtMÓòò£m¶|Ù+P&‹Ê`'{'ÚPÃǰaƒAŒêµíS2ŠNý4€D^wOQ[04&Hõ”×å {ññ)Ën'Òêl·;“º8îÂAjh'k¸½Ä%?@x³¤èäýó 1Œ=X̾v¡l$€ˆ¢‡¼ZÃx‰ýÀ†Êÿ-*S‡È@YFi½Ìç3HwÜSÙ¯+lìÝê¸<÷M—‰¿»h4ÕNü„! —'ýÝ6»ÿ2ìq*t³ÂÞík=¡ñÚk³EdIÀ?þÇ%–iTˆ‘挚)«$¤kóþ&`Oüa<ÍáP§g`¤¯N3c \UÛñ${14´ÕúÊ1ò Ûe¶Y»JY̽aÐ݃H¾,V ЂsCOiÍzØWq3qbÈzÝ-u÷›v|¬)´‰™â“"!áÙœî—_±–€2cƒZ#H[—ò¨ ,÷(·œÇF¶‚*Á®§¿æÞ¾™ü½½m«~˜-üè{g¬m—"3®b„±Ã%eÝ€ëôå⌠D]ùüYÊ1 `Æ ñ˱MS=Qf°”6ú2!~Eu‹j½ïbÚ/AÎt9„6_0†éUiµ%¸+ÛYÙSÔ.X݇ÅÖŒkÁ¤™ž±—Ç ó“ˆ*’ßPÙM"ÿWª ·/µtÔGqó‰úG»Ëå©Tè˜rsŸE?‡ÿtPšºÃ\Äê‚É9ýÉ¢QO1©·T >eN~ßmX!gÁ‹ø ;ï²Jð¯Ê¦lJdû(èL°¨d©éuÉú©_ká4€‡ |³—™ ìÒ¨øGÙ™â¦ï ëÅ0oxO‰D[—Íáp²“’j•®"J¼yîÔ&ò­nÐ~41ö&wœ]c<Þ¶¤?çzˆ§ ˆy ¸à¢Ì5Èû¾6—kDy#¬OíŠA@V=ªPîó»& æh8ØÜ-œÔZþqó!Ê,$â¢8pï&Øö²¿Jìl¶«¡~Ê–;­†ìß­èô,7Åxlj?Ü*ˆ`¯(súc;A*‰Ú}æ<-Cvñlv²„G%ÙôL}h 7qˆõnÞ á¶Š ‘c¥oê`:’_ ZÀ¼µmüZ´V”ç7 iÒhÛÔP£>·‘Åf "TïoW€ †& DÃ7Íd6 |T¯¢ƒ2¨‹´N_¶æ?Ç.Óˆ·{ ‚CM3½VU8Ÿ¹±Ýepñµb©·VÞ1X¥:|Åõ]£ðÔ¶,äü=ü¡ÕZ‡†+xÁPòý_h£!'4y¥O0AÎ+q¡µ´?ò3é¸îË„ñAÔ¶Nµ3x*È 8d{]¥oÂX޳ügy‰¼?{(ž)QdƒÕ_²¶ r¹™¬‡£á¦yQIÃs¾-ÓÙ­åv5c½è`¿ùÖÑ_]ß$ÑÜÜÓ;šÇªûzz"mHèî o[qU þņ<ÓoK,;/ºÌ­yv.?Ñ÷ôE'ÜÙsþóË „åÚp¤r«E+ï7´¢ò¨îj)‰O |ÍóÐä¡D½ß—Aó&švצE‹un\;Ü–o줽䑼ڼ rÔ6ÐÀ:».a: 4±Áàýâýù§šº“¶8Ö? 5'£ÓTØ@Œi¢ˆ§‘#NuFÚ“ˆÝ„­Õ`ž¾Ž@å- ÚU™nˆÈw<®"ßÃ}¹ML!•xºLy$úPe 8NyÙÅïÖ8²&:ŒYÜ3Ÿ0“ÕÝcë´ƒg½s(rÓÿVö8 E|…¸ïs¯“K"¡R{´G™7‹ßO°’a%s â)àRSÓ÷#8¶ü•3zºE•úëiLbu’*X—åèÀ ?åKn:PŠQP€ß®Éœ>’œ 0 €Ì°£É»lÁQPÝ6R\*ìÉ›ð€k”튤”™º)¿Ã|ß§Ùw|…¥M‚«÷ÀPX6deºy±¢Š€æx=ÛŸgfÖ 5Fºç:óSkº©3(m7—â!{z2 Að"ÐXþ©5øH£6Õ!»ö0µ¼ÿ.:ÝÖCß9á©î_«öqÓÔà×û0™§\ÊÐLªÚ4–’êÖ–pÐj%PCw9¸šbq¹Î}NÐqƒSNBLSч½;‚4ÎìÈOµ@;ѧ7¦Ò^µæã¾ÏKœƒÿG¼ ™<2×èçNhaŽp,¨ª•”Ù‹KÚ®Ëø(˜×\®¨¤€£i»ƒÖ h¤â…ër$â ¾Ä~·@VÖš»(}Þ–e1óŽȸÑ+úÀµ˜þóuön¯f à­[Ùrgp}­Å} Ϧeu'Myv¤<Ù1ífÜwJxn¨þ8¹‚ÈH¦%þZÒhÂI:؆Íågï nº|I?`ŒÉ5ˆŸM ò£ýž™¬=‚"É‘±Zéà&‡ïË4$r¤”4¾j–ó̲âI¤ŸÂØll­¤6½Í­œ~–©AX€\³h©œéÄ›(mÿ ï×ËŠËÐ;,‘ŸVêDŒwÕ­¢5ºÿ\8ªS¬²îx;“l¿YY=žµ»,òGýå0«â÷Õ«›±{¯ûŸaÍî}ßb–jå¯Ù!–™OKüwS«“?Ù:£”šªËÖ®…`Ï#Гìœo‚ åÇñõêóJ’ú¢záŽÚ&5d¿˺è^eaCfK>òžkGm*A`ÇÖÛâF_·ã1šÕ.àt8³#–ýr;JcGÝÎéú°º¬r{ׄçƒÿ,éÂõª`ëJ£G»îåYù«=øª$?1Ù^¤¾KŠ<e£wÞ!ˆÿj+IMú·ÛKÀýVäª4,ÞÇíèP™ãœÀo&W)ŒØQK½XD'ô¤g’àÌË›ìi€F1÷:UZ2oOz¾ÃþEÙ{l0.(Î#‚“:uÓ¢ ÛøÔ&‘˜‹ÜÕ”«"‡’«Ì·.ÍND³V\K@Q¸Ì¦›š$¯S)Ì•û³‹`°Ýzøáy害n€ûtŸDP› _ dü˜äÑDÀêÒg«ëÅ•¢’ËŽnãŒx¯SBØn£éîÊL©ú{³D ]ŒÒž± þÀ(]f™ iŠÔÐnL˾9¸›#xKÝF#?ÜšÆ"€*Zóµ0[Âi„à *`[³ðƒÆuÞH†´ÏùLNO-Vñ ¹…Éš½™•9Ö£‘H}œ•¿Æœ†ÿdb+DW„‚<­‘øûÐÈÈmZ`ÿb…oÜ>ˆÜÈ«%déø‰b¼Q¬“ƒ~\ö¥t0#}XR½¹{`¡ƒK(ã)·–Áò”¹~Œe^Fý|[3}|ãƒqí RšGö×n;@Ù¨ˆ³TZgdÝfü…ñÑYû´Û†*CuKiQQÜC¦Pd˜æížˆ15>Ýäkc˜ü['F÷@ŠÍêÒ±\€Æ««%Žnr-˜ŽÅ¨ÞX[LèœÄnQû­Ò>ËçQôàë60Ùy ¹Ê8¢µ'%ÍÉs(Ûßâ áå C» á±OZ—¡8Íâlµ¢ÖèõÜšc¯O÷¸>³9y°NÞç Ó£€ ñ`Û;MÊû¤í´}pÜy7ÍoY’$碂äEUÂ^3…Jrõ€ÖRMéÌ÷ùÔ?ýoä Qí7LíéÅVÐßÅŒÚ µŸZärÑšÒ˜èÝù”†™óÏ£þ¨{™™¤FK+¡ˆ)çãÔ‚1Cf±äû.@-(•¶¾Ê…Xå%JÍ‘N6•ÇëÖÛW¼d©¿Õ0ìÊc›„íÞJ\Ãz_2¥NÂŒíùXÀ*28¢©!w#£¡¡ô;¾üeÌZQ#;`û³¦¢WXg„†Ê=]ä}’>2ÞÍ턌§4s(rE ØÃ÷T$w)± siœ¢+oƱ„£7U‘@Ï€ßAðò¡Û!«p¡Ó¢iï'o’ô=kϬV]PÝ.¸òc¿ B7Ug5 \œQûEE.††ÌGAxê$˜X}Uzá½ð>dT"«qñ7 ›ö E%ÉJÙ¹ºZŠo'qk\  HD5ÊXç‘*ïôyÌÚ) ËAtü¶êí|I°‡x,…æzäÌÃã<"¶ˆHhR¯‘ µ†|¼ai½ë±a¸H„ÜßP–Ýõ¥eN¿W VA6ècc9—]$ß]ÿ³ÿxBš»áÈ—û.ªoæÅÝç³Uk ;Wõ:–n†U¤Æ<"÷Fi¤Ç”!–¹¬ý^gþÇ–_"Á5ÀX)9ïi*¦Ž­‚¡–içøD¸„R-JMã$7­ RO; u/>cÐ.5‹vÿEòÆ9£UùØèÎT{Ýÿ„\óz`½ƒÏõX Ï]-6ª±)ÚÆ-_} ‡nÆpfþ§y~2yky~ºž}ŽŽ·ø¦nÄ×RÁ’M-àpmÈ6г,íir¢„=Z0lÈæiq&¡[—]iþ9ËÛåeO L‰¸^ª·' È`*øe¯G¹v³+” ¼@o÷yÁ¿KdŠë›ö¸[òFp‹íO¼-6÷X5ªh×ìì@q”ãÞ%StT|y[ësqùeÈá0ÀbþwÅœì2¾—8÷]EÕœo¬¥í¥Ð¡G¹ç+¢¤áúÚfãK†¬ý$i½¦gz ÂÁ„ñRøqÃù[šÜÙÀöʪMëÇÂÀºÏ¶Ã)ŠÂµDD–ÝxmM졟¾Œu0ïüE«)2ؼõ«÷ŒµtfiË‚Ç Ýyp}^÷¯Í¡‚œË¥ ¨ãÍ"óïf|b&DzAV¨ ØNîÔÓ`eß,XÂö.+kycÈ9Žì¥þ9?¤AìɱK_YHÆ@$QÐ@3è³äy-Á¤VP^›±¯Û…:ÿBú%ÉicÆL8%mÈÃóQd×åÓ·]’ŠÕà%«=åæ¶³;/¡÷PÌ}x˜€ðb@bq¾¸Ç“õ̆fŽmjÝ…ç̤œÛAÅráÜÒõ,ÅGTwÓ@ý®ÍÍ=¼[¸J°åsÉc¦¡$ФYÊÝqJur¡ôœÏ\ºÅîû¾K;©ŸJ zßš³Ôthe°Âµ*¶|‹QÜ]û•mIoG·˜'AƒÈh` Þ©À˜±'¸é F™ŸŒíšé »¬á+Ú† pcU¥þÔTÚ 4RÙ85  ˶÷I&çvj›y-w9îYã¥0¹ÈœÙ]uÄßG #(¸©ý¨nÅÁ©’Äì#Ïõ:ÏïŽs¥\зàþ 0£uçæ]ò÷NAÔÌ_óáðÏ 7îˆinè#'YÁÆ×³ÅÚVŠÑ²MsT‡Ìɕà {v E>›öÎt‘º+%`UXòò›ÊÁD"«Ûævª'O“ùû„°¦$Àpf† ¦xމâJ2(]ˆ;­õR“ ÑAE|ÂsR5zÝ( YùŸäõ™Ï´í5ÈÑDÀ^ð-ÿ {û1sq^¥Î›¼Tþº‘BñÇþÔÿ2çü÷–vŒüà™t3œ …žNxç“SLËÏ[¢ ׯá¦þ0ÛÞ1†‹«Gi £/*Æþ[,NÆU]³§¯(GºV9Áî#c’J¨ÏeÓ÷^,啟Ÿiîô–¤—vy/ôC© ”Þg‡Y 3úñ"»lù®àøD¥m¸§0¾›16ÕQX©€y”ÁãÊõ(²æ—Ùé£I‹þÈ«¬yø­g7¤Ok³+ÿ×Q\ØÕÓ FS6dµGÝ!/Œ!›ffS€m&•6âݬR˜Ë©„•¹`Ø7è'5x¯žœÚU#Êb¡@fÉ,Lq¿­³u4µ’aa4Fñ§§E{±\6E”£hÿ|w9éKd9´Î뎫êûoÔ¦º›H›a@µo ƒ¿QªÒµ/]+Á}9õµtÎÁuèT\`逴áŠ+ØRÌÞËÞÔnÓC¦Òg‰'”fvá]ÙíÑ-2 øä¯¶wPJ‘¿Øû»Ë¶+ãvéi:IeaÔ>®W„öÒôø µ[ ¯›È §W& ßèG£O:›Š9SíótV¸¸©_Ž4«ZjÞ™áë-+íßübçLEDîh›†]Øh=L6äÊ^ì¾(N5Æ`¤Ñx¯oøØÕÜŒ0J2Ç!¸¦§kNØ<÷E“ª™©×#ôp_‚º<ào4a‹ÌÓcG,µ¶ÅL«}öÛcVœö!4Žqð–ŒMåwJZN²YÌ÷X³É'JÓÿ*×.Ós =ðh-×(ë]ýˆðc»ˆlml¼ucXrW*¸¾A#EÿdÇ«ãIOf¶F¶W™O!Ùç?”•£]Øg?Ú©¤¹úÆ<â,™WÐÊ^¼žÍd¯û•ðІiŸq^ê]*¦\‚À N‘oûšÖnÚtô ª¡.w‹“ÛR:S›¯˜ûžxÒߘlöˆÛK°‰1ªQæ@'1‡ó˜|aZ¯zï©/½Ó"|ã¯Pg»ÄªÁ(Z»I΀KëÛõAl[øEº¶íæïš‘,Ýñ–?2üçÖ“{8x vlÝâ(’y‡{èvë.6F_p×^÷Ê4«'¶c^†rçtÚŠÕÚ§X®ür8”¾[ïW‡LqõÕeAàe‡“ †ŸÑ¨,`e„m}ym“Å Ép½µ-óVp欱fË?¼¥ç~ÀùiE¼‡°·ÈIL‹ˆ»û¹]$’OHîŽÉ¥©w¢XÍbâåcî8Ê?î ™p¹±˜³A?Ï¡À‰ß}RQÏòçY÷æmñ…,Ò´,-ú¿ÅŸÿ;驳>¾0o‡Dž8ÙïT‹u6ê·%¾B ‚?t>+ZËBLf™‚•ë°Ñ¾[™ùÜbé’ÿqžu€üUĽvÁ‚½;è' ÏU åYg“žï¦º”1:j³˜¯„íʶœ‡A¨rkTm¿,œN¯ÏáI+òý-õQé:ß[×Ëe<ÆÊaè×Lx4 o§bPk@Nš¬YböAóÉãÜ"âY•ŠïO»6uˆ–žL\¸Ñê³\Y6@X”—Çè,³ùùÜ ­P1&¸Ñ J^­Föž½c" ¾×§T ¤×ïäW8ª@9&Ó•œ³¡'Z‹K‚ôê^vÂ[ `öüÀÑíLˆJÖÖJOkwrBïØÀ›,§«~ Ù'ûŒ«·`µ À®5Ҧ쌴kº±ÃcþÂA±ÜÒŸÞ¯ƒÖDÆÕê2l½]÷YÇÇ 6²Àî§a•C éP[À„ –N†§àðF!ö­À¢c†âxW$µ§þ/C^ò~ý—z®µóŒ³¥IùÃ$CÿQ¸0wÓÚäA9$]$b®'‘8s†c¼c€épl¤LçhS¾R)X~=¤èû£è6ƒkC×p3w³ ÷–ƒÂƒ!u ËuœÀ`K:ÕûØ&€%9 ˜niLWŽ^pÍ òY¨œ4Î=?°CÒIÀM¯càǛЊ²¡Éš˜]ô†9;:žEJoB¨üxêëæ«ÍU·Ó&=Å@L+\ÜŸªÒ¼ûÉ1ÿsL̵*sbäÅñ ¿LÖbßù粘­r¥ãBVäøÊiªÁAp#‡0Y;ÿ9Þ#%fŒ8LÄýäíö· Óµþû^µ@Áœ1´ã¢Ÿµ¡L¶Ó}ÞðNõ¹>~FÂlÌÐϼ£9 tlR@êµÉP‰N®µ rƒ8ÐfŒ„ßXL‡ÜíÍËð^rݲ©+8Ó®1‡«jxýÚ^T$£‰ÎÒãJtÓ?Ò-«ZÈoÔüDHQVÆµÜÆ3Y\ìW}¡<’”.é>¿ÕÈ+4Ò„‹—6‰¤ÅoÊ1¼z|E8vU4ª‚ÚØôÙn•ë¦é]U‡Ës›>–¨¤„ a† ½jyt_…_qŵê^BM]C’¨Xé©T(Ve ÎhUž¿IÿD÷“ây>Šv‰Ú¤»”ÖEºSŸ_»ûã&Õ¡üxQ¸jýOL#2*÷òí?½Z‘Aªˆ¨&ؽÛ'd#›]ä¿T“»¬†¸‡Á4µ©ÜÂ4b{ç2J¢Ôú^hvŠ‘ƒëõOÕ5f¼UýÌv «¤ƒ ¥"k81±OX,+].Ê–µÈÏ£H2ßCd8ì2×zôï’“ gÝHÇ]÷aCsÐGþAJ£IÀšpÀÝéYÛãceÖôYã~{ÃzLžD ‰5ÓFí%°À”˜êK†t FEùÏ‹¼pÌHC©¡_ÜÞ’rÉëâŠg²Ð2…YxÌ&r­7=ÓªÖ‡»I†¹ù%øyžÂ" Ù‹é\•—Xèò„.m¾YêF=dTÆ®þ[«hÿxI-RÒ,jùK­\z”ÕöP±±+jgÛ0ºúÿJFg´À«Éö†Jš]®€ ¡±ÍëÐWÔè~û/î"ðrõÈÅ~®qÄÜTyÔFr¤Ö÷äÜû2å5ó’â~nñM`é \z]ƒÓÄ¿­ô8«QÖŽó½EÊÛ»ÄR>%YÊΚ͢öœÕ6§¦‘Ÿ øË“i0ŽŽ‹Áþ0V#ne’/ à yU×*-£ší¦ @ÛØIÕâx*ée¨ÒrŽãvR1Cê&º †y+‚¨oSmér?Y´÷j”ªùܳxi%ð ì†Î Iäï [‡ž?„~éÓ_¸‹+6Y§9v~*´¡JLFvÉJ Axxq•nHÖvÏN¨‰s¯,èËE׋m rj‹¼-Y×ί—W¬ßÌÏ?tó<“Ù3ÀìøÈ¢þr‹­lKŠÈo²‰ÉÍTRñK5»®ÿ9Ç ê‚„²šdôrXø°‚Ý«m{Øv)à  Ç¾„ãåÈ3¨å_¤qmzÖe‰}‡±ìm¢L¤ª¦óo¨1W' *@#ù–áS쿚Æýÿ„1W~ÏI2Ž·°?fù»DGG´4¬Y«hà¯IÙ»›Qì*“$𥉽í½ôêDN3gm¾$×¼„~JôñT7Ø¿Ü`QÉ'äá*W›TKP±òÉƭ’?0_ÃÎ$ÖŽ[ëAŠ/o3&d¼ýô­­Š[Âp¤—ÏrÓ_ý~"Ôèž™‡AÆeXA-Ÿ4à>rèÐfé"ø@ç±ï7–²³”Íì?Œï$”… Üs¹šÎä u¯h(ëaèÅØÂFT‡0ö‡ôôÓªº÷J°ŽFÎ2ÊæBÞGYÅZö óÏpÚdJj u&&ã&¦äd& cír‹­Y›gÏÒ@ï | µ²ºû¨taÊp^Jw“ëSQ4æ]†IŽˆ±“¼»]µÙ9—l€Ü š…ùü´9ÂÃ[Özl•žk§>GH±ñ¡yÿ9’èz(¶‘ö“G¹àÕ&W¶BU3ï¹é/¼»£R?ûýNË/S®„ÙòÌï­õžVj4–¸ºŠxWV\lÆ0|U+¶„"âd3FQiCÍ´Åâ+÷¡P¶¿"uк«MóÆ;ªëÌG€ÇµòØ^³*ƒy›B§-‘D€jíq$ö€q? ßs¼bRËßöJ~:°;z¤0= FåwáeN¼Ûøy²MÐTóJuh0sIl´ZUŸm®¿ÁP-ò õ¥úGܼ'ŒqVEÊ‚R>Ÿkzv¡4Ti eŽ|k´ì‹ æ#ŒÇÇ¿¤Lû¿6þOªc·ØdȆӱþµ›u}aG»øQS·©¹¨ ·cSÌ m”™i³o³FÌ( \Âv&V‹’¹\Ïm /l¼âcaçWàNKÑÒe‡÷˱†Æƒó’æÚŒòWüsd¹…ÛÑñGwõ@íÀT9ªõ§*.ΨáÊi¾Om7?R¬òl #¡/Z‘é"e TtÓºÃÑT„4­aé¨L”ïÓÿ3=W–‹¾ñÓ[€¾éš§yX²ƒ†„Ã[žMx£žx=ç°á‚§$¥6±’£-Ï”5@ù‰z®b}óÖ¸GäÎlͽü¢nX\×0uÚÍ|ߟ¿@QÉÆ|Ÿ51uÃ+WÙê®T>… ½0¼rDªËIkä`;PùÙ6cˆ„n¶*Oõ‚H¸UÄ”s>ƒàizkob¶ÒœÅ!bÞPã®›mb¢¯M0­iœ–$òc° 0ÀínÁhÿm³wF³Ën`TxoˆSUÌåx?ÿWó4˜ƒö½×*0SjbÏ‹§c¢ÛRh)Ò¦ŸîÒ]ƒ¹Äê] ÀË?[µU–xŸ]ɵC{€vK#UG•X夶¢ à ˜¶!³€©D}ËÝÀƒ^ÎÊ@ÿg‹èÞW¶¬Qõ‹¼d:€Ç‰”aY±Ñ­»A°3’¤¢š¼? ÎVÑŒ0Ô_޲úqÓ$‰°V$뢯×wÊ^U%ªóµ p è¼lˆ,ºÑ¯â$J  Ü™T4ýsH$æØØÀn6êäð$ƒÌ¶Âi¯øo̬#½ýÅ|ŒÃ¿€”²U†×§˜X÷0`=À!.6 buCí¢>—k[hí ŽÎÃŽ&*G:ùL ŒìQßzúÕš˜Êgro›²Æ×C­#ÇÁ4õÒQ_:K\Cv¢Ã.¹ê™ô¦S€Tdâ wC¢ï §³á¥øüw'°Ö åzBÞé“NªÏQ€-0— sgä,p2ù^Q$Žz*Ön€•îšVëhb¸H ƒ’o›|!äÔmo2ÂùHIa-Ÿ{óSŽ"<å轩QçŽèßÞN9KY•T&ŠƒØñUƒ'Ý© ®³¿"ÒStŠos(Dÿ ¢i!^‹q'k'ó“£'ú¢š1c‘½Á•`Þè¤$.ºŠdøü`$Q=Iýš$s\yH´46`‰)ý$¸h1oµu·×4aÉ´»žÇ§ý˜qÌ?–`>´Æ,éa‡Øƒ)Zï KÙ±‰Ñ_ÒØ‚‚&(Ï@œã‡o¯¶ÏÃp3zZu¹¡;—gdÌñ ÀKË?åDÏÐd•ÔhìUj‹ÍƒßJhí¯6é#"šsÞSÝmKÍõh4Ø2‹Ëx-¤heàúwkŸºï.hšæYï¯""§ŒÝP"°¦räFUY±‹Á@Å„aE’MáOø?UCº˜¤EµËÿ,ÉDÝfÙÇÂA;Nú»Ä =.æž6¼ã•«Û,LYhÿ]fñÜá~éïòµ [Ü-Š|ˆõ´*~(Y]‘==¸lÞÜŸL·a¡'À ¥.à:‘õÄÚÓ!ãÐã?¨³ÚŒš°Æ­úTàÅ«UZÞG|†Tò!rÛ•x— ÛMòIõÎÁ ÎH`BX3°áe!âíþDáÀêäüÊ;’‡s²9ÞkÏd†MæåX_†ÿ#‘Äø)]{%tÄ‹›¼-gú±¬ùsà (X΋¯EœÅ›{ì— œG‰µ—Ê©^GÄ#(§_Ã8ð³Ë%‹Ã"Ëßßû$yÛ¾ê˜Û‡ž«¹Züér4Õ< ©äèóÚ´ÒbH㜾ü>÷é:/=g»ÖÄÐx³´³ÒŽ„ª,²6ðñõ¼¤ÖO Y…à?wZ¡ƒë¦ø«UŒ±€ä±-³hÛUÍ•†+Û³„ºbnr'ð u)³°öJ»] ÚZV‰ÁâpëhÜVb*ôLrÜ1\Ñ»%G¿zìEò]ª°.–  ²;v°Æ8ûúÇèÚœjÒbèElMˆÎ+‹]túÐ&\TEÊÚoÝãÞÉbJ@ž¨2°7:¢&”ˆ_ªDIq›Yg×IŸ˜&ï‘2’UïN AÔGÛ4ÅKœeM¢ Ñ;d^âý,½ÂRÖ(þ¤l»0‹&ØeFØíÌÌ4kRàgf²Ð`/™–œµb*¾^X<¶wé™O8K4<œ-p¶|XS°åæœ}Ø Æ2Ç×€ÜÒ¿õÐïɱ¯¾ÜkdUÁ¦ƒ³ÕVLœ °DØ"†g+~`Ì­ÝÚÅØµ(âî-¡s1O=”ýr§úÂçy QD±"b%C‰1•þLéãqöúFmk€qÓ:?Ò¸`Ï<›—Vå›2HZ7ÇÎ!ñ¶çŸðß¾"ùZ½esÜÌðÿ4ãÌ뜑·Tœ*LLœÀq —‡¯³db7á…3Ý„YαWâ)ív–3ó¿krOñ¡ß¤¸F“?•WE>ÖõãŸyÐd`ÒÎ.mn'±÷ç+é±ÉôŠ2ß·$Ö&ℵéw?ÇE—QCK)¨þô®ØKþUJc=4Oú¬ý_Ò˜ö.¨Ö4Ýq"Ko GËiÊõñ\Cfè­ ƒáoXï;/ízndÈšÁÀyÕlÏYBm¼!½oI¯TL •„³íx|ŒY£ƒ1ÉÿÔdïì1[‰¶fzo v[ù]Õø.ı=JW„ë¼}‡ÖL üÐA9Ô Gõ®1è·Ôî„Düg<æ³Á71ENr‚>ɨ¢é1¹e–®‹;.‚Ýß ]6Opö—¢|›¿!yWMäß™æ–<Ì#žãþèGyý<㣱_É u.´ Ò®a¸÷-n¥·%ÎÚÜﬡ =òâÝ+vÜÆ í¹`wiK H:Cÿ͌ٳŸÑ1²F±cð* Â[êC´Dòú?ιòZ²ç‚êÏɤŽb\šÞ›ß2˜kÊbfÍý¶YN³®IÕÑ<Ø›ú|Ë>V ƒ„Ý|Þ‚QwH¿ñ£JA´ i…n®ýÅØïJò溕S®úY"v¥¤kDÍ‚éó¬¼>õt ÚÓœïÅä 8a9Ûõ 7=“0>Ó^}7–ôÌÒ\¶Q>SQÙ´#5àÝ<9£i¸öâû‡îÅìsžÅŽ 6maÓiÂq·*N¿ðj—•LQCAñÝ‚.B;’'î´´åpU†Â°X^{©Mí÷áNmÅI>Ú(ógïwò¨ÈSÚŽ—Ýzòfâb °yܨüm;²Ñ6~ª ªÌ)ùï²bÉFzdÝý*t‚‹B¿¡¶G²0Oòéºn ,¢,Z{5nðŠiUƒ`qÓОŽòD蟗o!%Œ ¢l ë;äÚ:wç-ÆIíŽ!pœú0Z$ŽKn{‚«ÚXùì\§¹Àî°è§ØZtŒJzTÓÌ ÔéãJ‡2N|²+±EuJ(·þº‡Ág‹+fgc€äiq:– ÏäüPžTDر•°i= •Ï6¼Ö¸Ýmeoéþž` g‰õ*f×›ÜÚÃäË ›™/$j˜xxÃvÿo1l½QÑÂÅ3>¡ ¢ÿ'ÁyTk‚òAšÀ2Qî ÜÞáÚ›ðá&ƒQàƒÄ—Ã`Föž‡ |ŸÌ<åŠí“/¾ â_›‘ÀL…´Jºþ;B…Ö Û£•Á1mi"ìÑ4‰žøl¬£'Ç3Ö%š¦âu';S܆¹ÀŠi=•ûa¹³YksÈÄX³uÖ³lm@@Õ=S{ýr¥AÒl°ý¬sïØCcÛz®a‘°2yÀ,Z$Éfˆä'ž®µ[˜´Á‘_B@À§¨k“§RUÆæªŠÑ¡Ø%—xdF -m„a»QŸØÏNÿŒu¤jƒxìåü,ÝÛ 90‚Ú [µÌFÂÉ +uÂzCÿ ´äº4&‰b»ZK17‡VÃByth¯ø£-²d`¬¬ïŠýd#.|HŸ–JKô/N-»¬Ýn:Î هçp|ø§–°cÎÿm¾ÈW&ªómªhO \›W¬!øÅ6¯f,Q¾ ©ÝHɼ~rÐsêŽe¢b¡‘ÞÓÔñ60=¥ØHÈ•ÂAs\LRóYÚ*ñ¶Â-ð4D‹pð|Wd÷»2ÖC<îâÄUªækeV1‹ÛbÓTïVòVìsq•…*ÿ3)ˆ#‚‰’r«C6n…å+û-­šg9.Î ²ÿ3³¿[£ŽôŽI*û}“z8¡é´oP`p˜ìñß#ñðF6t-Éo:a^§_ôÔ½^yÉLª8‘ø­Èw¢ÿ)ÕÚ'ÓZÞ\ójÉ`ÈþÊÑoæeUÛ½ÄËg‘p"`a‹àû¥âƒ˜5õ„ÀO!Lkº PܱŒëh`Ö4ðÁ zÏ9¯;5ýM…ãM[× ÏíÐûO×ÿ.ž_š«™¶C<ß,ü¨Ëé¹Þ¾«eç“~Þ-'À»¤˜Ø•‰+nõ§g\þ_ìßöÁ5#¦2÷û[H;¥pJf~XНësÐâÐ{¦¸±9Ó˧2¹hlèWQ½‡ ÔбÜEÒUS䈱J“®­@P¨Èß AwYD³¡Ž/T‰•Uõø ª3 vGË8«ošÐX•X°2J”h/Œ;§ &øǽ•WÚ%Ôƒ¸éü)> —Áœn›IIasƒ7YyàºNÕB.fìàFùæúž|zéN4·…ŒÐ/­ƒ^ Û—Ø\o:ñèÒ¤­©÷XÕ|L8³þ¹¢l®¿G,ؽ š<µn)£k‘(¢ËÅinpáñýºi}]CèøL_V¸þß@/Õa?Û²Ÿ·Ô~§WíÑÛÔ™Ã|ûËõt1§Âjùú=|þп>œwÏÓÕèþ¦…óì;çô pßV—~ÞžuóŽ~Ýiý½ðþªÍßVÂþßM=úœÕ~~Þ›@øMsšâ#]ëÑt?_•°‹¸i¹'ëÔOxX€ãŠÝ@ž1ðÓ1Áüðøv.0ìYO™Ó—E¼n¦ô"©½;¥ácˆBó;!ê>  vSþ¼å…†%©Ã¬¿¸Š|O¾ZÇÑš4p)þ?§öªù &¡¨Ä*…·‹åÖùÏvò¯×"î\ˆ0¨íÑÒœñGy4áé>á#Ê Š]ÌÞu;‹ø¶èˆœ@l÷¤Ø@ðÔ¿—*cŽî÷vóFð®v²{k´<³òûÞ” ¶Õã3ä- _ïà ã–V†rBrN˜À3ÂS«Ð~äo iÀÚùO—á¾l6/N°H?â;U¦> ZÆñ߆šŠÈ˜ ±Hg­"zkÃï‡p‰# Q.;—¨§ J/îXµ|йz–ãâoPø„=à@Œï9…*ˆW–ß*j;̘>šaìßSß'Î×E‚è`Z£Ø“7×"Øîÿtoµ% 4¹4³gÄÿÑ?ù i›N¥ üx^îx ü“ÍZ*åä—R7]÷Ç/øÜ+cK“SÆÐZ ÜBœþH¾f`4¢2e+µ´%†JSèEߟþl¦±‹;I)Fa*¡hÁ‰ÉÃ(Lë§Öá#5‰Ú=×]þmâ (±‡‹‰íßZ®Z¦ãH¼vôŒ¨þë>|žõ–1ÿƒå,³Œg÷bȘ9{Ìoè_äà{Y½tªrvY2+€q7>I™ÁÜÖ•¬X¾ [š´‹Äò¹l ôî›,ÍJVMFýûÕ2¼Ý²bPWN+â„Æ>hÈ~§uüá0ûPquÏ QõîY&xž®M.{Îá.­÷ÕlþîÔ>"©+'£Äê ©Z,PXËísV”š%Á7 a_? ÍßÊÆ2{¾X¡Ü üœày£§Vód*#B‡œ: ¥û³: þg0¿œt-TZ4z8ª<;³5”š¼¶:Ñ䬆9E¤¯RX‡Š…÷x³ˆøõ‚¼3szî#F•L«Äö¹=Ý×r3‡ÁSpE?ßN¸ ¬ŸÀ^Ï}¸”XÓ’¢¼.v÷—XK@;rÄp;œÓÑv_Ü„ò:¯u»ìrÞ[R_ßЧÖÝÈi8Þï£CO ¾{ÄïDÜ]]×HÓŠÃZõòO‚âû™yÙYx#Ù¤‘T}ØšcU°ŒWBx`ÂLß‘óпôØG|šÑË¥E$0¥ú„`íàW^wcøQhRÛ¬X’Ð/¥==÷([8G+|NÑzäQŒd‘ÚLiP†|" bÚÞõG¸ºzO·ÞF öô„µ+ÃsѾFy'äïšê»k[/°h(pñLWS?§ ·/æ%w°AF§CûOmŦéSït# ¨J£aÞ{¡Ñ3(ÀfX Û –)º61p™Ì6ì^9jÁ˜ ä,®†$ÙVƒ×/€)O)¸¸(mÃÓ}uÄLQƒ"ƒìkÅõPcK“Ž‘“W?ê¶üª«ga$'¼?PB PW²‰X²É%¡•EYÄÊaê1™C×_G1·ùÁõc3v( hLH§eùzG”ýëpa•sz¶ÂäkWÚûŠ\táúf-¤Ñ¨ŸÚ¡0’% Í3X>»Ì4^ã¡)®‡åŠ5Ý¢¹ ±^ÈrÁ3W¾SµììÅ̃4±*‡¤wÖ…È+>ŽMÐÜ7lÔë“Cwtöо6Éõè,ÖÏ‚˜1¶á±û¾‘Ò䈃zË ‹J.hµ Fv¦:y@­6ƒ $jfjíNAõ¥´úiŒý*¿ÿ]MXµSet=~2Q”¬yTU‰ÿ‚ÙËP†»sgõ£½=®Ú©»6-ôqQìò2L‹XÙBˆ‰syè3„%Ÿœ¾¶ªÏã€U~å.ðɘˆ•YYM¬ÉJœáiµëg]lÞ`HW±(Éé£m-áA.2#*æN¿šù71é…QZqÞžÂGÌë§ãîï÷KP†掜ìpg¿Š?\X Ge¿fuÁÚåÒ%éÝöÿ @„½q¯ôꓦ yctŒ0Í஽:KR3=äöà9âì"½Vœ ÏÍMã.»C QsŠ˜/ÌP)ff <ö ÖÕ <ÌH@Pr•ƒ§Öz”PV¹çJDä~\ñ?ÇrÞñ[j³ý–.þCcá,{“´õpþ°Ž¥£==Y4r€hMoP‚þ ¡þlbÛ ÂC¥l-Ô³ÁÍÜ¥ºüVc&1¶Ìè³lærwÈiç"ƒ‘š3º +§¥d&6/i½=t7v8WÈ“ÖðßQU0ÈùE)èUo(Ž”ˆ™«oØ =We|«!nJÉ >(£ñM{Cà¿Ë@ׂÚÎA£þ»=Øj¦,eG(P`U6UÎ^®ÐBXrFQ­œÉ1Õ®,8¾ã}5îøm©£Ï!ò ÇN\Nž©> ýŒ¤~!ÇÔYˆ;5³%8{ÐnÚ1–Ç‚Ð(Oc®]Š¢¥tÎßO‚TŠìåþ´‰9Üóíl¥p8evv‹ ø›># ätME€Þæ»yŸ½ù0@Ü*}Ïä;í´;©6ãjÀ§?6h”ª‡´L^µ1ØG§r"}Â9Kd×2‹M­ÍâÎÄ¥Ÿí£Ó|m£K2\Ÿ¹ƒ·b¸à9Ë7“ß­¯F…|=Hñû•X®xZ=•ÂN|Hð]×Ò‡³ì° DÐ} äÖ{¶\Êï©”_pDØË¬cah§[É-*èSxJ•›´Ô>EþÓÓKØ¿ÿ5™®°ƒ³™$T@J²ûΘd€RÌIoØT†ïÚ- 0æu¼˜íåäʹ+•4l¸!¤ÌÊ¿ÔØ$Ç w)bîU…EÆt:DõK\Ë–ùT5¶`Ø’£E r¯èŒJ Jú_oK¸_:òmVA«¼¯!Åbòr—–y`Ï¿tH'9“x‚‘9!½-DXÕàI¥š€ ݉eM9à"ÆúéÿZ\+€#¸âü>†|[ŽË…"5ŸúxÖ%]ý¤Š:crWáEªŠ­|Mž¡C¡_òRáy—çï2aŸ)h7D1ö¿p3spž®în¬ÐÕD)9ÄÔd†qͪj•±ÿR–recÑ»2òváÿG/ýqs@ÉhbcyîžØ¼a44 ×9ñÞBÝšð«4¸ðäÍu“¹‘Þ bäzÈÒøó²¼?%ŠJ‡^â*âõn¿Ût97uer ?jÜS1Æ6+÷‚„›í¿m€ËO¹ÛdE}w!|}ø ¬XI9¦ú FqÜÅ¢'¥$“YòFŒBƒúªàYÿ‚cE@õ±¿'æ8gi±ZÃZø’rêº22B€Öè°)J-QžÒÁa_Àxño#W6iór4žÀ8d˜ùeð¢÷k˜ZΤ™ xÿ9_=’Šx¾¶ÅÙ¾MCʾr}ÖÛ„/®Ò=²ÕädÆ¥Ê:̹É㵛˾º¥>÷]¢Ë·¾[êÌ $>çµF•DÀm¢’œZáÎÅŒè ÀP³2¶^ú(63pZj%Ì^çÊ›ÿ#}’c| ì!¨"ß Ö†ö"jbÇÂß@þ3‹Bø#Ê,[’ØaPŽÛzÙœG,¹4Ÿ‘d;‰àrQ_‘õ5òVèY]q}Ú¨Æi'îÎ5iѳfhv[ 1AöFÏVüƒ÷†OÌ)niöãI›h.S vcÇ:,IG''\”;ߤ¦8_ºã¡¢Ë‡Ñš˜Ûbß—Ê6ÏüWÈ#ô¤É!OwûšF ×k ¢ê‚ÛZl¾«ÔOk¾\#@;韌֌§&ŸÌe,sWAu }é…/£ß¾ñc„ó ËxÓqŽDŸ‚°'-#öE'RsĵËÝþ^xwz ƒêÍgl|x±ldMÛtá_u$Áà¬IÓ%ósSß"._×ö2F%YãN6 òE)Õ°b†O§ÑKp°ÑŒ eP¯ 1E@‡™Ï§sžp5ƒüÝ+lú[[Ón-Ô“[{ôœÖ l´¿;W‡ýÓ\{\ò«L¢vz¼…Ü>`ë!Sé¡Ù?y6JŒBˆÏ¶ï Á3´‚*ipKW»zy}:h>YMœ?‡Ç!² ÑðÒ3õì£\·!•FZ}wO¢}z$h—¦jìg-¦vNTWÅ ¡½xøR×ÌPIŸ¹“T0wò! O¥ ù:éYûä}üØ™] Ä×ÛæuG/MMêíó@ŸZì4”:î% Ç1‡Š¬?s“¤'m€Ð\Çvßû¡(D:ð@ÞÆÒ­×˜K®ÚSðý)=ã6Ÿ½Çð%¼Aáf7ŠFQ‰xu7S2ô¨Ïuk2<¢QxÔ}Nƒ¡¾Kü‡À€‚¼•F´†Ï§ÏÆ!h¶o&Ë—I£Ð ºbÚ}äòTàÐYˆÊåÁò]#¬§µ±#›Kd#Öþ65vº}Ú´`…%7â[‘CdnILvôžÚ&¸øÿ$*Ýsûõ ¾àªÇcÔœly"À;·Š‡Y–‘È’ÈfÂDPQÚû©öç©'0båV÷²äí׊gxc\ÓdÕ,:Ãtoè äìL×ÞÙ4gIð÷ÏúÅim­DÆŽ”ë°`>Ãa¼6\Á|wëPmZõ¦xµó!Ž41’;:wž¯t©¿¢Øú(Ýl¹tQ>ä»(\™g:¯E}]˜ipˆ›Ð鄚ðlmîãèöÕ?¡07¨›ZùKЧ…àÞFƒ˜XJ ùY±jL²ÏL=?kžtÁí(“³×ëøAb2ÅÇnÞË)6ÜK+$ÔV‚Ë¿‘?:¹lÉΘÎɬÌ|ŸSª÷hÿj;› ÅÈã*ÇŠ •»ÕÏŒ÷žîñ˜™ü¶í<ú_ñŸ®ÿ®èR·†ì¸nœä=P/ÕØO×ÅJn ßÆÆÍEŸ‰O‰p†Nœo’!«]È®ÅSå\¢_(¤Ê`¬¿2»㨮ÊÐxéó{9L[g"¾sƒ¤Š—`ýõ×\fi?Ý0˜cÆC™â¶IçgŠ —G}1‚é¨ôØÚÜB᫬OL~¬¥ïµó_fcpÌè! $4V«¨å¢d—P+ÓZpt[¤ÄÝůÜq˜Á[7–­xÐۅ͆ޓ—ø…¹0žN r àÁüûhUÇay"áêˆô=iU?˜ü·°ÿIöJ9U‡ðƒq}!ÌïP*° äBD§TëßãÄRY ?ås8ZŽ¿üß̼¬"¥O2‚’-NË!¾& 3ÎPPÅùÌ´°[àۜűÂày•”ôr‰n?ë¡UН„£J—B¿Z{¿ãç Å³v;>Š|µOKüVù¼èòl3x¬×+$³åEq6Òsµp@`>z›‹GMuYˆ³1ƒïR¡p‡‹»8€`2ðƒtàU5iïÈ.²bQ+³röÂB8c7Q5?rH0Ö œú®üÔZ¨'ºNM¸N}¬Ñ÷Ì,¼×péJ¡é]9ïᢜòˆrÉ?ˆ‚4Ý“Û$¨1A-¨»û;Ÿå<ß·¦¶¢^Õ=YVÝÉM]yG\dÊ'8^Ñj¶R¨)¬aƒÌ©å©þ„\i‘½X>ù-?úeùC!²à÷ÉÓ$<(ê:—®çµÐ‡¥71:C‘ïÀ/czcïT¦‡VDZСƴٟ+ a4Vãx^ L‚¿ežªór7]â4f^ñÁúåoy[¨2EþDöbôïuŽç^Ú?GeÕ›ÿAcaß"4yâ™#ŠðݯJ÷sg•[Î]{¸ÂY@:茬):n«ÊÁ;íw©$M1²]ÃË“kž¯²©Ú• ¤å ‡K1š%D¸nq£@rþßIçþÙíî*žë¿ÜjyØ…†±B‘`±9Æå·ïÒñ$Þ¼|’«&]µˆÅc8!a-λÖƒX&4¦/ï­ßœè i†ºCE fåÓ? uÝ4t Çs!3Y]}n‚/E(ÌùT03£ÞO÷ÆJê=€ö<öø^÷f¥ý\&+@ã¦e—ˆ°[¶©©tÞÑ_Ä>¥•Š¿!H#”Bx]ïÆÄl7çó·ê˜ád OHG騆%Ê)Š×Ôÿ>q¾M ŽÂè8‘\u¯É?W‡Dm•0%‹ƒ®”Å›ý›Pº¤Åôñ8¹ÎÙn w9e’d©Çu HÀX›Œñ}né X\^†Q2—ÁÆ­ ÆC}gË­†Dóàµ@WŠ˜°y…—úsXÄ- ±ùô0ÿc l“†ùx€?V§´¯àõ™Ì¾.º…!,ÀÙPak$J‰ž?!üEò3ºd'ñÇݸõgÔvc^a_³Ó÷Á/vVÄV¾A Âò÷Ãö#<* Ï´Ä¡j×S!)ìp„kÏ·Ww“XÜ=Ä^D%YêùÌ?>©ü×¼^ÞQÃ]¶ZnNº{†U®2_>t_8rcšwDÑ!qÍ`•.ØFa¼G—®Óù®Ï°*ù-¬©w÷•ˆüs_NgÜàŒO,gšÿP«l¶Fš€lÿ@.:M]}\„óS;Z¦‘àQr 9=ª¤òa^ ö»Ÿ£ôŒ,7[랦ÞI\½30éÑÆ˜âm O}‘)YæúÂæ£’*”´«†Åo S&ƒ#Óš[¬ƒµÔ>Æð}$ƒÞã¡:=á„yñ Ùtvÿ·ð¹ûâ†Ñä=ëÒ8@{ã8aÈ®°ç¿ú¿žð{Œä?¿¦ì¿LÐc9 úÉ­æÕüXŠm·ÚŨâºï æ–çjtßç,zÉp ”œh+ 2 KU´ÒEŸuaëò”¢ÕIÀ[ÒMx³òß„!A1ÜýÎ< ø–¿ZÔJ\é5f×7ÈÁAH/à?‚IižiAÃ/ÍFäT2zS#Æ"óÐI²Ò^œ`0èqIá€üÙGvé‹?mCœ0¶½ß ðI°¥~+né]+ƯY4ŽL’á/ÍBµ¹ÆÁì\§™\•wIÞ,òm¡zÄE5ýC$•(#3øør 4 dËkÓ šÿ~Pl`-ð*]ràñêÆ´…2‘òh§/.ćÖÄ; N˜>¨eã\Cx“Du„T‘+•kZ#)vˆÞ¼­|zµ,óYÑ(¤O¢RÚõ…úÀÏ£D¢9¿-û!–-íë׫ΩRæE}WiT¼Ö+I4‡iAÓðñæÇù &„…iQWy{Ó—rÃZîÖ[ÎÎp «¡¼Ìóê‹~À¬]bIŶѮÀÜÄEÇöÄ• 6컫n/”„È q„žI#¶¿ŒiÏ M¤€‰ôÌÔ?ñuWS$5õÔ‰3òœ¼8O\û¨¯±®®üùDÌ6]áYãæ"l1®<+ Ï…ö®+ì}r™ ŽÞ‹ìy•m«ä¥&«”‰»¹ŽáîÒTÀP„zœÿ"¨¼Æ&KšG<·ÁdõÕ”"y®~øëŽœÓéƒÒn †;$yƒÏrlý8=1nú…¿õÑÝ3°ô$'OÿLÌòcÓ•)f—¿id%iWÍ Ñëi;•þ‚y PP¨×IraÜ ù²ÇdÈ0ÿöâ=½7Xà[0Q08³Ç¡dž±Õ9:_‹,Vg¾ãRšŠM¯@£Ç¢Õ¨z¿Y_lV»¿"ôîV7ò‡îTw ´ý3¾âHq)´rÑ}®=ÖÄU¿߬Š M•Ñè‰[¯ÎˆGèÏiê4÷àl¤½à”®&:Õ*ÄÔqZ±OËÀU^\Înì9§®Ðpûµ“ ÙE¸ïšÉ€T‚ûØ9?´ÁÏä~Së,‡&z‚¿™¯n“ö»!0ŒA å «{¼"å Ð$¼ßNЏ\LZaV‡ÌÄޑζ ý‰Ã½=T~¦)­Â·Tâ•ÝŠŠ9TÉ]¿Ë5-uAOHBö7ˆ~––n¹»D(3Ë ”ù­3†,âw¡–Ó†¯È"wÝ8±e£ÏQÄÿ+kX™QùófÓ:NaÁ áêèåëΞÛDQxs¡•˜7‚ª>áƒg§®ݾ“1½Vàùβòt>ƒJÔD ‘óv¸‚ Î÷¹Ò¾6ÛèhÂNnUTÅS!Z½Ùž“ÆÌˆíLRL®šR¸F0­±7–¤HTjv ; ƒ˜;íë´·ô"æxÀæá÷Dœ`/5%Ó^tã!ƒÃçÖ[M¾´éÞ.ç¡õšt4™ ÷O±óéÀ¨^QHë¿éF@¦ß²'Ѱ¤ó2Æ·¼åÞ@¤¬˜ùíçöµÉjs=V£bŸ$e‘,üÆ»»!n:²C;Û1¸|PJeWð i=ï’™UvuJ_oyéŠ>‰[bV¯-ÂHšUË¢wþsü‹~Ã,RæyúnßbtéÔÅó´ˆë¿»(РÆF…Ÿ'˜=–­9ÇOÝ\d=o­2Ý28c¸„ŸDï»%\1er>£W/¾Tà´¿rXÕÞX’xG§9Ö¥µmúŽ¥`!‡$é¸õòp?^íßüœ×CKºz%NÙ¡Ék4ÑüZM.¿D!Îf ºph4yÆþ3B`­¼(¤H á(RÍ#yžo䣓aPÎ×ÇgÂdäŠáV©¼"_’í¥[S,ÇšX8Œ9Ûòè¶ o·Ë!CŒÿ T y²Ð³u#M÷*Ê_ŸÈ 1WÅúx)KÿÍnG0œHq‚£ô›ÏìJ]à ƒ*Šu2tùŸBiA I!WMrîÕþk+ÏÜe˜©…†0ðœ\]ö×Vò“£¢‘G˜9nsÐMa$ð±Àñ%%‡|6G‹çñŸ6)’ú÷á‰ÑÕ¦¨Qý•ÌÚ’¯®ºP§|eÞI6”«dà$67i"½õ?­›`"y)¾Ý{'áši q5î¹€ÒÜ’hÅ~4ÀyÆÐ3{I­ÀËÅ5ÍZD`Y$Süâ¿ÌªkNì?­nø~ôoÌÑ«g˜8äïÑݾCô‡S²K‘Ìó®¸ÊJ´.LÀ4ß²ƒ¤/yѦ¶ˆmwËCÕ9j4;ÜJSYh¿´“—ÎU^ça‚y-Aw¥ëù!²¿?âñ~¼¦(ú²“nð9q™†À}Öæ oëtKúÍ{´$34:DÛžk’è1Jœ;ôtVOˆž¸½” µzªä*Zà¡¢m n6»lÕžZ›qÿZ7ÏgÀ¤bàÎãŒÏæ•ìN~T›£K.‰·:}Û%]ã=ZK ²»‚2e„/7ÅEWÁåœàE" ˆ4&’„†¦E¾Aˆ:’Ý‚µnž¿,=ùî…$×¾Kq5±F ÿê?„C3ß\¼,—à6 |±tAÌ;ï2"9×Wª¾HÖ*þª©"íV óÀ0UˆÔ>ù ÎPB´¿Ž·²NÂ)²ƒÙ»÷þ°-*áKüãfßò,èɦ—›À ~7'N‡7È¢c²Øu6ä¸zÿz»éAÌ¢ U¤î>)G Â)V=(жٰìe9ºý“ùË_ÕšÛf$Dfo3ZÆo³ÄK“çפZö®8Ôé ‚njñQ^^åÚ´:¶•NŽEa­3'ҥ¾KŽÁtX<µμO°ÇŒ0õwQÌ–»_Å%I×2%¹Ï•€9¾/+¢O³»“H=Ó Õ'6=ø)à¯Ýž¶á’ú#Wì†0q!†¦m ;Õ®PÃÀ»&Qc~Æcš'h7¬$.*êðM`ž8©›,É»W©h,må3]=‹ øÿ‹ïn*)´€ø¤òAWy8Á=(_½Ò?ìß=|`>•üóUaü,º0®p#üûôã òhBcÅ íÒïs'õíÔ ²°'ÇêzèÎ:4&ŠVú”Fª“ÆvV͉æDC¨šwý/¸MíˆÔÒý)mÿóÈ[èÑXqš5¯2ÔAÿÚ•YÕ7¡C¦}»}ƒúÂ¥_Š€0;»™g”y&¦im.ýÊ0l~Å—Jýg2²GB uS¶·¶ÓÚ{²ÄÅã£ã«ÍàêȹÚð›†J8üUn/Þn$ôIàorCô‘`×øÇuÆÉ¢;`¯‚˜™jÚ3×V²¿›ÂÖêHPù˜$©wn¶Úel].·ÉÆN "ûÆ>@æIx¢=u^ß¹õˆi/ó£X™ÚŸlA·â“poù?Z²c‡ë¥# ©°dJ«ÛY­;úƃîêCmñËù/€ÝΔxy<ÅèµJ/Ó¬ctòT‘F@=6 åô»|b¸}AÓ\Dž¡cÄ×0¦ˆÉ§wÝ’”–Š+Ž…2~é‡^ÅCÌG-C5T¥Ö¥{DX*½ãŒ¢í˜K}ßÔ"µŠÞÉ8g±Ó¼Òz¯Bmn~¯öÑ"´¼œ¸AíA6¥þÆÂêg’cxï}üÖ þ­/3#²¿oÿM?µvHl÷G{àXÕâ& §ˆÿpmZðÊ—¥=öªˆ¥ZN9Í…?¶€ Îš©òí´ßV‡9G?Ï£ûXÁ«#—EôhjØß?“ßt†ôuÝAùŸ3PÃÜihÏ´ItÖèÛTPó{˜2¡_ñq³ÐçHÿ} ]ûïþ2Lu£(ÜY6íy0€õûVEVJ¸F†:€‰Èæó(#‡Œî†¼ VúÁ—$nß M— ;œV¼øQhRÜ÷a·`L=©#øM GÿuœˆKtRˆ•*œµ¿HýT¼ŒÞ#8=ûB`– ë±øWñ¤x&yòS$?JrÙe9K;· qáë‚mÀÄU¾[±«Ó *dC-qÏœã-séÁæ­WqÂ[:h“¶QõãJ H¾3ÿ'^Á­úÿ:ô¶fn+8uþ1DÃÊï=ì—‰ºZò(”4’OðæGRbºÌ0R~²ÈÜB«¦äß&û׸3¥0Xmæ–ת\hn½X{·š3ÂY™t.mЉ¸7+ˆØüÖØ~9ò»6<9e .jF´Ò#ÄO‡ƒelà%›ýßæ_n¦?‘äü ú¹ €¬cÇ&¾ÔñÁ€ ö=¸£ZÈŽZàŸ>݈ì’f>n{Õ¡æŠé ¶]crãñ1:3¶öüòdb[ ²§mÀº¯õßÔùH tÁÄ ØiÌÓÿ ·¬jÍÇkãºU\F†‹]_QDu' …¹Ó€ƒ™³·1óÖшc„‚²tgZ8ÜæݧsYrÞhÄHêá2‹þ?nÁÆšBô¼o ¤aÛДû]>˜~§Xñ€_Ý,!ÍgâÕŸ;±Ø´i„MãÇzH9ö G$ëc(“㚤åäx³µ`ÐyžýYÖþsEÞ·èEîý¶‹u1(MÉh”yÐ ö|m;Ïo—ú²¾W­Ô|å{š<ðÒµP@˜Æ+#÷8V6·•‚E<å‘u’=Y³ä…¶me^ý·ÃžVöÕ½œo'ÖOît£Áü–Z µ‚¡¹{̽8ˆ€zw²XG|×_¨%}GPПÿO.ÒoèùãÒi'R—”‰'Ê)"ÎæIƒLYÿ~.¹ìC„â4Y[iŒ0œpû­Ž=¸üÝ„þ °83(Çè‹áNÊ}®ÔoŒ]GŸx¤”`óz§ÊOoÅLìrTFs ÉH^À°\»±xCÅ·WÔˆ÷aæ¼ áº%”qÛK„à*¼3ËénPQ!£pÙ5,7ºaúÆ>«`Ší+‘ߘ µqD½yU©7ÔÞ.u|*‹AJþ~ÖU:…°%UôÉ ëå3"²a³…ç–ÈVBJê~À‡¡™aÎ¥ÿ-/R§è|DçêE¦0r;–åï•ka [ÿÉý(4¥´xùi:ÇîËX,ûÑײ5:#e8{qñNPŠ‚Úü*5ÁÃ<^™2ø²“  !C+Oõ}»ª6ƦZ¯¨ÔˆÔ“5ÏOœbGôû\„ø-ÁiSòÞ[´ú’Œ‡´¡\Ø^¡•‚†˜Xß …žNFþ2åÞòAé2¬º.J>± ¦g»j*õܰ.°Øztml|ñîlµ¾ù(éè»zXóðK+-yÞ@ŽŠS®s‚üs9jœ)ôÄ…šfAfɇpe>M©?gêpº¶,JmúXòi „Ø®ÖÛUíßW/2ìÇn2¦Ùn#vÕŠ"Û2MgˆL«¥ §) „¥r*‡ùW°Þ±¸ZÔ”Q.÷šÃjH²sà$­2uF»WîèÚ€º±›ƒDt× •ஂ%Å·ˆ)¶Iz*£MD$µr?üž§M%ï–¢î ”/bPTæ%åy0tµõ™jKÃèþÎ MrRh6f~5âÒßÁ/DK¡Ÿ¨ÁØä–çûÌäJo)Nû¥ïAŒQ³·†´Un™y¼`Î-X¤bö°×‘P ÷î9š˜É ]nHcRüø†,ï¡ÞDÅ+Õz¸ÿ-Ä­ÊÑ&^\O<'{N4ð˜ÀîÍ27@ ‡¿nÊ‚™iApÄÛ‰c× Î>ÂeqÓÿ"'œì &$&ŒèyŒÍV|fZxp²ÊÞ2’¾r Cv‹<ý=ó=‰ÞŽLÞßÕ§;Ö,,t‹u"ärÙaÁh8\È« ü²uQö©¤g~òn½¼K…ð¼ _6îÄLr¦HÐqI¹G“"·ÇâØ¯¡vÖ!‰…ô÷NÒHofû£E–ÍëB§ *‹i‚Zßq®ïÆk²L.öǘÿ ê:¸®¦¶*>]ÊZÝŸÉXÔ¾:;…þØE{e¢Õ 1/|êó!P ¢D‚¹J8y0ugŒC«ÐéihVÑ!‰¾cFƒ‡!¦EŸÓh-°ÉýAË<½÷Lkq±“Žu¹´âšé?j]ç׎¾†R¾µtËJIÁú û ¦h_I92¡¸OÂäqhý»óÁ^ÕÙ()‘ôEÄ×ã V®Ü7ÑYçf]À&Á›7ÏÉŸÛÄñµËÿJkd++溂UhÕ±4go‡¬n*Ç<îÊi ŒÈÝ3ÙžS@˜+ï'Ò9åz÷)F’Qëß4ßRæ®`çÏs¹<˜Ÿc“ÁoܱìY10cÆwM–ºAô½ë¯¹<ÞŒlÉ7˜‚PÁíl³’g˜×¶†» ŒÃ.é6Ò?ÖkäX^.…å9ü‹¶;F´Äç‰ôXŠfuÝ/öýhw¬o0ã Ý‚q›9^EX`^¨Ü}hüQ&‰)ZÚÇ(WùþKùNu|›„fþ“‹ì­žkX½±¯ÃÞã‘;jÍ“ösV.Ý’´i²uÜì3˜„D.Áׂ0ÕóráœÙr¬tx`ùœñ‡khw.øÔ?‰ü/·œÃ5ˆ47¿¢…ã]'e.Tÿ4E'»_£øj˜ÊųÂÙóskܵw‡µŸ@€ÿ.½â`A_,—r¹Y É¿Øüp6Q”ꤣJzy™½ê™ñêá å-DêÓ980“F,=5C¹+¯…!‚8þ_©ÕSPô¬š Ñ"$"½ºÙnÚÎ’:ç× yö”·È1ª€œÙU¥>Ì!vC•@:<¨Ü.[¦ÖÎÖ.Š_‚§‚jùÒ™òË6L¹6.9GžPZNýãe¶CªªËÀ&ü0¤¼ÿ|Mýèž1“ŠƒÈ°·áÁѼ"5¬ä0ž³Û®IâH‰†'·f•<•‚ñÅÞÊ#¼¸´ f+µ«dØâéOQ)ˆ¾–¤AMËå2ÓÅÒ¿m'RiÓ™»PqhÏþƒøÖߪµF˜ÌÐÆ"·Ìýò~eç×b9¦»'!Ø0‡«4ù9úf'R¯Ã³Xdóî¬Nó®I.-¬;'ÆLPËù 1iû¹ò¾¾ú™@µ²DœË(sÝÓÆuD4IŸÜoÀª„\Ôö£îç-t*Èz‘[Ö…“–.dš¨•vQµG]ÆE<ì@Ÿ:[Á‹ú7ƒ,‡ÈܸóT±»Š ŸCcFËåbw][` ¡Ð‰°*Zª9d†»ÕKQ¤[Z7׫Á2Þí-CFÇ‹8N‡oåÁ¨Å5èKyyW®ïÖœÄ-‡¾“ÅèÛúÏëFÇuCKÅ#è¦/øòÛO.ÜE«tÅa$|˜)÷y€<`êÅ2‡äpPÖXÀ§ÁÖhGoO‚Õ`¿3ügeºYéU(¹…#»ÉÔ@ˆvÐÓûpg-|¸¯’â*îÕ}HFoâ žAÅŠœhúnñçD¨mßU&«É?Áà ݘË9‚†¸éµÂbëܘ‡‹7êÇ#YBZÂO…bÖ¦®ýÞòÑÌÉpV !Û/ê .Äk2ožíÅøOYOαÈ&P.(ráõÆä”˜Cè-Mºç‡úZîŽ úÝmå`™–ê$¿d¨ŠtÎŒ&á²Ü;ŠiËX0Âê! ao¾zµh6"GüJY¾Aʈ*º£8çhö»-^Ud÷Òo°8ÄdØh!{†vbþÆí[PŠ_Š&Þ'öHÌ•°ÅǼcmÔvœ¶ð^xBHÍøò°'‹Û†Wâ—‹:ºØ|”Tk«j  !ö™¡ÝZ‹Rº ¢ÅÎh"ÅêU~ÆUì/¦s•Ðh=]àu¦oˆ³“ñý¬+»ê³ï©®ú†ÛPoÔ4¿¶ËýN/Ú§ûnþ?µOö‘ÿ[zßSp¾¤Ùk½ú¿QWí¤¿máÂ~wÑÖ{ê²ÿ5¸_RT¿µÒ~zrú’?mnŸ]Î_ýÍø>@Î~gâáî &RMu ­â×¥QÎB;=ËíaMµU*N¦¬‡©S^¼—i‹É‹%­7/ÌÃXfê¸C¢`UTÅÜ¥y/DÜ‹¼ï,”$¿=©f?Þ,±(E¿5s4¿Ô-ù¡e!ÀèÖ#>±$›#ÊiÈæefÏF0`iàÛÞ••✠Òùô02ÇÌXic ¿ž/Ü6ÉËž•¸F“ß ‡ºSZ¹srO9Îu!U.£ºWU·ž&ûÉÁ´ô3ô1?•wù"±0pF~oÃvbñ‘É0r¯ˆFÞ¢å7Cæ¼ÇߨÁã`£Þ¼dýV¦v(7<>ÀB¤;_Á1A¢ðeþº{z^'ZM^hJÂ>êaX¬P–ßmç¬e5—Rõ¬ðƒ¼ôŸKáÎÙ&‘ä,i»÷™‚-Ü;+¥åʃÒ/ÿ('qðq¤œ+¤™–å†ÇŸQ#˜ŒYYÉl!ˆ¯M+ÛšÞ[‡LÅSjÅìkž‘¤¼YæãGÉØÆ…Ÿsø‘ÔxŒcÃÙ¯DÐ’©±OÿÉgÂBJN JÙÅÝaÓ5~‘¬{yæù\zéý( ð€ŠÄç¾ ݧjp`·0*]¾ÿek.¸T1)+§{4Æ?~$(Ô)¸ÕzÇU %’“à¢À‚zŠR‰…¥‰³¤jÍ»M~Àù-.‘0–„ÒNž÷ëé–’©±OòãÔ3Ë€°ñ7 $!Q%λS“„ƒ³bÇj‰hx¾œ…kÉØ þ Òm*ë™ô؃•B6¤Pìé¶HBëž/éŒB:ÎFG_çšñ›æS” T³¯ˆIÀÏBuóã½Æúªõu¯Žš±öÎÃ<‹´n÷“µGÆò¡Ý9àO§8ÐpÍcf‹˜á§P>ħç^£ßj{‹˜’$?¬ŒVæÆX.½M‰C°Ñƒd¦Ì{ïýŽ»ƒ|z‹ÞÛká˜ÑâåJ£½æJ®ÿO*$+Ä`–‡‡'°;ç7¢ÈX€› øz”"«¹²þÄ1­hW¬svB­õË9€~šË  ÕÀR($ªh²Qñ¿I«‰jrªa†…¬ÒøÙÄ:GæŸ]UK–ÝÀ1+ƒV‡7Ì>Óž q rŸUóºTÙ­ARÑ!ÏèéAºüc aKªgþ=Ò Û§_É\ºSbÙ‘­$ îbCæ\à€Ú”Fl3•¸L”ŠÅé2¼ÇEÍ(!µ*ÙÝ[_œt‰Ó©¥¹ö¢™<5_Ïcá–éj¶áÚ¿u“^vTà–‡^ìãŬ˜‚¢”*BRcâB  :"Ì[å”UñÙ2)iò=šˆQjá,Il4м0°* qªÏ¹…R)ç*¢–ªìBt}Âò¥Ñª–"ȆW0Sz£•¾Ó$xÕ Ñ~÷ø£ßÀ $%úh˜”/$˜Œ ¦Z~µ”ƵðÖKÔëàMÅlmËw¢Ò/ýP#[ ÷® |/h¢˜lNIØ$ÚÉÎD‹¸¾L_)‡áÈqŽh­=ÖiÔ| áÚXq»ÍºL£è±܆‡¤z{²uA±h©yDp¶áÛGþ}G±Ùó|Èp5K˜4é$æZ…N'›È¸Oadz§5†Ÿ”ÊWq3 p6 îáCÙõ­I„„Jû;ð¯üžâºÐÃøÐYòó^8¢5Ô ùÐuÓË2]¯ ª©˜+V 1;›JÆp‚}E’ÜrÍ›¹):ŸµØíÔgeõ¨Y,š‚ÀÎáó'šï]è¹Êèñƒcg®êÏŒ´<éè{+óþ)‡rÜ‚÷Ú~£Höñ¦\ìVõP¯}ø„ànó÷$ÏY ]AÕ«iY¹³O½²Á·+ý¨ý-õ5õT€ñXÇËwÒ`áÇ›€ueÖ:Ë)dA•6ÔòB×z ù:lmžWÈvohÕýŸš ^iaµíŠ!°{„ƒÑ 3LÞ“Íã=¡¸5ŽÙçê¾eÖfêŒ`Êý¦¡> K²fˆGQë Ëþ–ÍLðÖø”v.%æ øe;ÆC€ð‚µVD˜êÅ.~…#D°CoÛé˜4™Æ‹‰ã¼e Qn¨Ž¥QWa:XJÎi¹Cð¼+‘>#·ð»¥òßù²‡'e ½­…>?ËZðæµ:0i’§æ-Yÿg8-EhÍxòx×Î/ÄÒvŸä ;ÃYo…Ÿ§§pÁ©ƒ.•K]goËLÇ´˜¯{ Ž—D¹hlLñbT¶·Ñ8ØaÅ+^²¡ÝoéÇè4uD/öÓ¡žWÆ|¾ÙŽ#âÛœÃEÜ%¯¢úA˜I]»!TJµ  ´YÌx[1Ñ÷ÏF!ÅŽxs@û„‚±ä¸¶Ñ„ÊW ”·‘³²ê,&ÓM¥©*‰uå¨ÍöD)Gò£ÆÅÏe2E÷º«›q¿Ÿ+õMª<‡€´ÂËÇÍÏsøþ`,o)F¸¥Z¯÷Ø3ØZRv›at±„th§á#çH'ÛÑ£üˆÒºlÖ\*Qt–=zw`}Ùñ+WGÕ@‘ÿÿ¿ ¬ÿýÿÿýÿµ@ÿÿÀ*93l€—•~m7,Hÿÿ¼G*;#",9C@!tÿÿ¹)-? B@B;);.sÿÿÃ'/ .7=5 .c&iÿÿË!80+$;4.xÿÿÊ#4$/$24(:2:,iÿÿ¿/%>2,0;8!79.>ÿÿ¹>%@A529K41@ÿÿÀ64"&+/#;@@ÿÿÈ =LD@D@KI#Yÿÿ×Va]c`_``__cX†ÿÿÀ„AÿÿÀ}p  aiÿÿ¿Æ…ÉÇ‹9½‹9ÿÿ¿Gåÿþþÿé‡>ÿÿ¿ ¬ÿýÿÿýÿµ@ÿÿÀ*93l€—•~m7,Hÿÿ¼G*;#",9C@!tÿÿ¹)-? B@B;);.sÿÿÃ'/ .7=5 .c&iÿÿË!80+$;4.xÿÿÊ#4$/$24(:2:,iÿÿ¿/%>2,0;8!79.>ÿÿ¹>%@A529K41@ÿÿÀ64"&+/#;@@ÿÿÈ =LD@D@KI#Yÿÿ×Va]c`_``__cX†ÿÿÀ„AÿÿÀ}p  aiÿÿ¿Æ…ÉÇ‹9½‹9ÿÿ¿Gåÿþþÿé‡>ÿÿ¿ ¬ÿýÿÿýÿµ@ÿÿÀ*93l€—•~m7,Hÿÿ¼G*;#",9C@!tÿÿ¹)-? B@B;);.sÿÿÃ'/ .7=5 .c&iÿÿË!80+$;4.xÿÿÊ#4$/$24(:2:,iÿÿ¿/%>2,0;8!79.>ÿÿ¹>%@A529K41@ÿÿÀ64"&+/#;@@ÿÿÈ =LD@D@KI#Yÿs8mkh‚cèºD77:Õ’bÿøâõøÔ¿ýåÃÿýýýþÿùI1÷ÿþÿÿÿÿü2Åü¸ÊÐÕµÿ…¬ÿQA£vi[™ÿ5Aÿ}pý¾åÿÿ’”ü5ÿ‡ÿ?æ³ÂÝžö’ï#ÿ{»ê£ÿ)-ü¶¹ózÿK0ýñòí÷òøPçöP<|H u‚):ÚÿÌ‹ˆŸ×Ro½åëÕªEil32 ì€ÿ€€€Š€€ƒÿ—ƒÿ Š ƒÿ " € 1ƒÿ€¶¯>‚€f ƒÿ€'ÿÙ›b,GPE* 9ŽÿWƒÿ_ÿòwU›ÉäíãÇ™T ˆçÿ›ƒÿmcò„ÿñ¡qÉÆƒÿ‚¯ÿÿùùúûúùøÿÿ©N*ƒÿŸÿõùþ‚ÿþúóÿ¨ƒÿ€!€ÿýúù€øùùü€ÿ:ƒÿ S'x­ë†ÿì¸Cƒÿh\TUn”Ÿ ¡©©Œkg;r ƒÿWbfB"€^,Q_ƒÿ/y oN?ODGJDeUkQsy#ƒÿ}]V [^6!;‡b#Œ CZ2dƒÿ2j"v iU0>F gs qƒÿd*i-ZWHg;Kk6^a#_ƒÿo r+w-|l\2[.Zƒÿf,Wl'o!Xs eiƒÿ#TAP m otk xqƒÿ MAO_l‚€f ƒÿ€'ÿÙ›b,GPE* 9ŽÿWƒÿ_ÿòwU›ÉäíãÇ™T ˆçÿ›ƒÿmcò„ÿñ¡qÉÆƒÿ‚¯ÿÿùùúûúùøÿÿ©N*ƒÿŸÿõùþ‚ÿþúóÿ¨ƒÿ€!€ÿýúù€øùùü€ÿ:ƒÿ S'x­ë†ÿì¸Cƒÿh\TUn”Ÿ ¡©©Œkg;r ƒÿWbfB"€^,Q_ƒÿ/y oN?ODGJDeUkQsy#ƒÿ}]V [^6!;‡b#Œ CZ2dƒÿ2j"v iU0>F gs qƒÿd*i-ZWHg;Kk6^a#_ƒÿo r+w-|l\2[.Zƒÿf,Wl'o!Xs eiƒÿ#TAP m otk xqƒÿ MAO_l‚€f ƒÿ€'ÿÙ›b,GPE* 9ŽÿWƒÿ_ÿòwU›ÉäíãÇ™T ˆçÿ›ƒÿmcò„ÿñ¡qÉÆƒÿ‚¯ÿÿùùúûúùøÿÿ©N*ƒÿŸÿõùþ‚ÿþúóÿ¨ƒÿ€!€ÿýúù€øùùü€ÿ:ƒÿ S'x­ë†ÿì¸Cƒÿh\TUn”Ÿ ¡©©Œkg;r ƒÿWbfB"€^,Q_ƒÿ/y oN?ODGJDeUkQsy#ƒÿ}]V [^6!;‡b#Œ CZ2dƒÿ2j"v iU0>F gs qƒÿd*i-ZWHg;Kk6^a#_ƒÿo r+w-|l\2[.Zƒÿf,Wl'o!Xs eiƒÿ#TAP m otk xqƒÿ MAO_líþÿÑW#IX[rzjiO+¤ÿýûI×ÿüÍ3 Nz„XWpi³ÿþÖÿøë0 XÀÿÿÿÿ½ÿÿñ ìüÿWëüÿx eîÿÿ»ÉÿÿúùŸÿý¤^ÿþãHöÿïn!0ÌûúÿM`ÿÿ̤ýÿÜÿÿvwÿþíSÿÿÓÑÿÿQhÿþÒgÿÿ³lÿþ· æÿÿ5¶ýÿ‡ •ÿÿn ¶ÿÿzìÿÿ5Òÿÿsäÿö/<÷üô$ßÿÿRÃýÿ« žÿÿÓ.Îûÿ‘½þÿž~ÿøóqU¡ÿÿúädoÉÿÿÑ~ÿûï,"ãÿþýïÿÿòÿÿþÿÿÿÔ4&öøÿÄKÏÿÿÿè–XÓÿÿÿç§7‹ÿõÿ¹Ee}sO)ayyO ¶ÿøÿÞH $H^¡ÿÿÿÿîħœ› ¬Ìõø8jÁÿÿÿÿÿÿÿÿÿÿÿÿ…$j£Éçøÿÿøç̪}90OaiiaP4it32P=ÿÿÿÿÿÿ÷ÿýþýÿýêýýžÚŸø$3³¿Ã\°¿fÿˆ­X+½  ØÿÅ'«”ÄÁ mÿþñj§¼ÿO¿  Øÿûÿº)£VèÿÆÂ]ÿûüÿõƒ‡€Ž ¡ÿûÿV¡œ½ÿüüýÿãt‚„† ZäÿùÿÁ¥› 4ùÿþþüÿÿñÕ™6€€ #%6¼ÿþüþÿC  ›&~ÿûÿÿýüÿÿýÿ”&cÆàðõöòéÓ³ƒF &P®úÿüýüÿ ¡]™›¼ÿüÿÿþûÿø™.tÅ÷Šÿæ¦P xÊøÿÿþüÿþÿç¡4ÿ†›âÿýþüÿÌ9-žòÿþÿüûüý‚þýüûýÿþÿÛx>ëÿ€ü€ÿüÿZ¢ïÿq›8óÿüÿ‰!ŸùÿþüüþŠÿþüýþÿêy¢ÿüýÿÿûÿ˜£ÖÿþT› IùõTiîÿýüþÿýûþÿÚKiúÿþûÿĤ²ÿýñ0› KF©ÿýüþ”ÿýûÿÿ HóþÿÙ¥ ƒÿøÿÒ›Êÿûþ˜ÿ ýûÿ¼Aúß#¦ QÿýûÿŸ›Õÿû›ÿ þúÿÎM-§ #÷ÿþüÿb™ ÇÿûžÿúÿÇ «Ïÿýþÿí#˜šÿû ÿúÿ¢ª —ÿûÿüÿ´—Gÿý¢ÿüÿX© Vÿüÿÿüÿe–¿ÿü¢ÿýÿÕ¨ òÿþÿþÿç”8ÿþ¤ÿüÿV© Áÿüÿÿüÿ¡”„ÿû¤ÿüÿ§©{ÿû€ÿþÿE‘¿ÿùþ¢ÿþúÿâ ¨ 4ÿÿþÿÿýÿÉ ¬ÿþÿüüþœÿ þüûþþÿÊ ¨Òÿý€ÿüÿlŽ ¯GDªóÿþÿüûýþ”ÿþýûü€ÿùºU ¨Šÿû€ÿþÿäŒ $ÜÚ#kºôÿýûüüý€þ„ÿ€þýüüûýÿ øÆy*@Ÿ ‡‚”:ÿþÿüÿˆ‹ %ð¯€[šÎô…ÿþ‚ýþ…ÿøÖ¤j*ᾃ†‘Óÿý€ÿþÿó&‰Cü€ ItšºÒæòú„ÿ ûóéÖ¿ {P&€ 昀%@QWTF/€†ÿûÿüÿœˆ%óˆ€Bᣠ‚,:BFGFC<. “j€+÷n O Ù÷‚ÿüå´iŽ2ÿÿþ€ÿþÿû2†ð‘€—ÿ„Œ bù¨€Qü7|ßÿþÿÿþý ÿÿþÿñ ,Çÿýÿüÿ©…ΰ€ØÞ-…€…ÞÇ €—¯eæÿþýûýþ‚ÿ þþüüþÿø“oÿüƒÿþ9„ž×€;øª…„„ÖÆ³ÿýüýŠÿþüýÿÝ<Œòÿþÿüÿ®ƒT÷+€Jÿ|…Eeg[/ „Û©+ÜÿûýŽÿþûÿú_Œªÿü‚ÿþÿ;êq€Eÿv„ ‚ÖìáÔÎÚèæ•/êêè€éæñ›óq3éÿû’ÿüýÿk‹Nÿý‚ÿüÿ­ È€ó|„*¦ôÊo, TÂùsÒ7FDDE<ævKô''æÿü”ÿþüÿ_ŠØÿý„ÿ 9<û5€ư„‚û¹4€NùÓhé/ª¹Ðÿü–ÿýÿù>Šÿû‚ÿ üÿ©¾¨€zç„ #ÕçE€€(íðdÜ$øD¡ÿû˜ÿýÿ݉&õÿþÿþÿû1=÷'$óJ„ Kþ¥€Xª±›“MXÿüšÿûÿŠªÿü‚ÿ üÿŸ±­€´¯„oÿm€ èN Úÿý›ÿýÿ@‰Iÿý‚ÿþÿ÷*ñ<?ô&ƒeÿN2¤ÛãäÈI€Aísÿûœÿüÿº‰Ïÿý‚ÿüÿ–}Õ€½¢ƒLþS ¤ý²T/7‡ÿz€ŒÁ Üÿýÿþÿ?‰mÿü‚ÿþÿò&§9ö&‚)ùp"ãÐ,:úK‚Ðw[ÿüÿþþŒÿüÿ¤‰éÿþ‚ÿûÿ‰7(ƒw‚Ôퟂ҃ ï+´ÿüŒÿýÿþþ‹ÿþÿî‰ÿû‚ÿþÿ炃×צï3€g؃ñÿþ‹ÿþüëøÿþ‹ÿüÿ[‰,ùÿþ‚ÿüÿvƒ7÷9ŸÑƒÍk€³šWÿü‹ÿûÿRúþþŠÿüÿ¢Š«ÿü‚ÿýÿÛ {7¿Fø,„¶‘ éL”ÿûŠÿûÿ­kÿüŠÿýÿ؉Cÿþƒÿ úÿi2ÀÿŸ€CñÐ……§¢CîÀÿü‰ÿ üÿÏ ˜/“ÿû‰ÿþÿ÷"ŠÂÿü€ÿ!üýüÿ€ùÿþö(º Lì… ©Ÿ» ßÿýˆÿ ýÿé(ŠÿÇ ¶ÿû‰ÿþÿAŠ(XÿüþûýÿÿÒ^ læÿýüûÿï7±¡† ·ŠÒqðÿþ‡ÿþÿúGgÿùÿ¨ÔÿýˆÿüÿXŠÔÿüÿþÈW\×ÿþüþÿþÿêbÚ çD† Õ`#í)&ýÿþ‡ÿþÿkCùÿþûÿƒ.íÿþ‡ÿûÿn‹'lÿô¯D_Òÿþüýÿþüûúÿ‚£ž6ê… ë+jÖ‚.‰ÿüÿ«-êÿýÿÿüÿhdÿü‡ÿûÿw" ]/kÕÿÿüýÿþûþÿÿþô²ÎhYш jÚ¸‘‚.‰ÿûÿ <øþþÿÿûÿ|Wÿü‡ÿûÿw‹&#„ãÿþüýÿþüÿÿûÉCàFĭ ÈŠ èH‚(þÿþ†ÿþÿÿSYÿýÿûÿšÞÿý‡ÿûÿp‡ H¨ôÿÿüý€ÿþÿåŒ0‚ð7gË…;ô"Eì‚òÿþ‡ÿþÿï2~ÿøÿ¾Áÿýˆÿüÿ[Š*|Õÿÿþüþ€ÿþÿùtï8TØ„ Ü’»‚ âÿýˆÿ üÿØ ÿØŸÿû‰ÿýÿE†  0wÄøÿÿýû€þ€ÿýÿÌ7ÊÜI0ëƒiíØlÅÿü‰ÿ üÿ» ·?zÿû‰ÿþÿú&‡·ÿþÿÿûýÿþûþÿþÿÿþÿý4!î&€ÍoçZ/ûX+ìÆJžÿûŠÿ ûÿ–Sÿýþ‰ÿýÿÞ …wÿøüþÿþüþÿñéÿþÿÿüÿÖg€«€ŒÌ6ôŠ€FëÈÓaÿü‹ÿüÿs9ðÿþŠÿüÿ«†åÿþÿýýÿò–$Úÿýÿþÿõ&™¹€Tæè€nÿ$ó5aõ»#÷ÿþŒÿøÕíÿþ‹ÿüÿe‡$…ÿûüÿü¡"lÿüÿÿûÿŒ>ò êS€ <úž! _ÑñOƒ—òq:Oƒáîi¿ÿüŒÿýÿþþ‹ÿþÿó!‡!ñÿÿÔ?âÿþÿþÿéÔ{€—É.ÆêÛçᇂoÔÝÛ½igÿüŒÿþýþŒÿüÿ°‰$—ÿ“ €ÿûÿÿüÿyaæ ñS#?+ € æÿþÿýÿM‰3kïÿþÿýÿÝÑ€yæ  x€ƒÿûœÿýÿÈ‹ƒ“ÿûÿÿüÿg<ù=€Æ¿‚€ €ûó?‚€ !gåÿþ›ÿüÿPŒ…+øÿþÿýÿЄëÜÀ !¹ö-vö*Võ®kÿûšÿûÿ°˜¤ÿüÿÿýÿV¹ÈÊíR… {ö¾ˆþZ… LÍõm¶ÿû˜ÿýÿë"˜8ÿ=üÿÂÌÆ tðÖ{4 !U¥íáUcõÎg"H“Þî”âÿü–ÿþüÿSš;µÿüÿÿþÿE Åæ"yËçéÙÔäéÛ¤K†×êÝÒÓÛéà³e€:ôÿý”ÿþûÿy›IÿýÿÿýÿÖ<¡ý`€ ?GFG&‚ 'GnsH1 €‚J÷ÿü’ÿýûÿˆŸÅÿüÿÿþþÿ_aû¿+„„„…Cìÿûþÿüýÿ|[ÿü€ÿüÿé¬ú±<„ eAŠ(Îÿýüþ‹ÿüüÿïVŸDÿýÿûÿZ,ªóØ{$ƒ‚S¯åý  …÷ÿþüüþ„ÿ þýûþÿÿ³# jÿûÿúÿluÌíÔ i4‡ ,_”Éèá§G!ðD‹ 'œóÿþÿþü€ûüý€ÿý½G¡ Gÿûÿÿþûÿù1€#g¥ÓçãÏͪ§¨¨§«ÎÏå娱y:¡¹Œq½ï„ÿ÷Ï‹5¢ÎÿûýþÿöZ‚5Sp†Ž”’ކpT8.ô,€ @av{yiJ%¥2äÿÿî¢).ƒŒ »¢‡¨PHbÿ„ƒƒ@é‘€«€9Ïøš$“ &øƒÊ€MÅõ¹S ƒkÄô¼JÒ 4£éç¦Uƒ†j¾óÝ+Ø S§ÿ{4pD&ƒ%Bg›²¿×,Ø"ÎaƒÿÝêâÝÓÈÅÅÈÓÞâêåÖ¥çmXÙÜç5·‡+0O``aa_`S1) oÐã[Ý 4å×P‰ ç>ŽÁÝ [Ôæ&… ®¥+õ0Ü ‰´=ÞŠ GéKÜ®…tˉ 4áTk8eDÙƒ‡ -Lr–»×ðûÿµÙ wÿдnK*†nÿü‚ÿüÿÝ Ø¬ÿüÿùãÐtƒAÿüûûüýþþÿý+××ÿûüûûýÿûÿƒéÿþ‚ÿüÿY‡€º€ˆ"øÿþÿþüÿA„»ÿü‚ÿûÿ‹ƒ‚¶€„Nÿü‚ÿþÿë„ÿû‚ÿüÿ¼€€ARL!´ „ÿû‚ÿüÿ¾…Gÿý‚ÿþÿå€ 7‚Åñÿþÿõ ² 9§ÞéÚ¶}< €¶ÿü‚ÿûÿƒ…ïÿþ„ÿ 3;…Òý€ÿþ€ýÿÛ!°uþÿþÿþÚŽ@ € ßÿý‚ÿýÿI†Ãÿü‚ÿüÿ˜L‘Ùþÿÿþûüþ€ÿþùÿ½±bÿüûýþýüûþÿÿþÝ—I;ÿÿþÿþÿð†‰ÿûƒÿþÿÞé€ÿþûý†ÿûÿT­äÿý„ÿýûþ€ÿé°‰çÿþ‚ÿüÿƇNÿý„ÿýÿÿýûý‰ÿüÿ¸­oÿûˆÿýûýˆÿûÿ‡óÿþ„ÿýþŒÿþÿó¬Ãÿü‹ÿþüûþ„ÿüÿRŠËÿý–ÿüÿP«óÿþ•ÿþÿõ ˆ•ÿû–ÿûÿv«Bÿþ–ÿýÿΈYÿü–ÿûÿ‹«\ÿü–ÿûÿ™‰&ùÿþ•ÿûÿˆ«bÿû–ÿüÿ]‰Óÿû•ýùÿl«Nÿü•ÿþÿû(Š ÿû”ÿþÿù)«!õÿü”ýûÿÕŠXåÕ”Ø×Újšÿý”ÿûÿ£–  ›’*9”76;É“D9–76>ED˜EDýÿýýÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿ÷ÿýþýÿýêýýžÚŸø$3³¿Ã\°¿fÿˆ­X+½  ØÿÅ'«”ÄÁ mÿþñj§¼ÿO¿  Øÿûÿº)£VèÿÆÂ]ÿûüÿõƒ‡€Ž ¡ÿûÿV¡œ½ÿüüýÿãt‚„† ZäÿùÿÁ¥› 4ùÿþþüÿÿñÕ™6€€ #%6¼ÿþüþÿC  ›&~ÿûÿÿýüÿÿýÿ”&cÆàðõöòéÓ³ƒF &P®úÿüýüÿ ¡]™›¼ÿüÿÿþûÿø™.tÅ÷Šÿæ¦P xÊøÿÿþüÿþÿç¡4ÿ†›âÿýþüÿÌ9-žòÿþÿüûüý‚þýüûýÿþÿÛx>ëÿ€ü€ÿüÿZ¢ïÿq›8óÿüÿ‰!ŸùÿþüüþŠÿþüýþÿêy¢ÿüýÿÿûÿ˜£ÖÿþT› IùõTiîÿýüþÿýûþÿÚKiúÿþûÿĤ²ÿýñ0› KF©ÿýüþ”ÿýûÿÿ HóþÿÙ¥ ƒÿøÿÒ›Êÿûþ˜ÿ ýûÿ¼Aúß#¦ QÿýûÿŸ›Õÿû›ÿ þúÿÎM-§ #÷ÿþüÿb™ ÇÿûžÿúÿÇ «Ïÿýþÿí#˜šÿû ÿúÿ¢ª —ÿûÿüÿ´—Gÿý¢ÿüÿX© Vÿüÿÿüÿe–¿ÿü¢ÿýÿÕ¨ òÿþÿþÿç”8ÿþ¤ÿüÿV© Áÿüÿÿüÿ¡”„ÿû¤ÿüÿ§©{ÿû€ÿþÿE‘¿ÿùþ¢ÿþúÿâ ¨ 4ÿÿþÿÿýÿÉ ¬ÿþÿüüþœÿ þüûþþÿÊ ¨Òÿý€ÿüÿlŽ ¯GDªóÿþÿüûýþ”ÿþýûü€ÿùºU ¨Šÿû€ÿþÿäŒ $ÜÚ#kºôÿýûüüý€þ„ÿ€þýüüûýÿ øÆy*@Ÿ ‡‚”:ÿþÿüÿˆ‹ %ð¯€[šÎô…ÿþ‚ýþ…ÿøÖ¤j*ᾃ†‘Óÿý€ÿþÿó&‰Cü€ ItšºÒæòú„ÿ ûóéÖ¿ {P&€ 昀%@QWTF/€†ÿûÿüÿœˆ%óˆ€Bᣠ‚,:BFGFC<. “j€+÷n O Ù÷‚ÿüå´iŽ2ÿÿþ€ÿþÿû2†ð‘€—ÿ„Œ bù¨€Qü7|ßÿþÿÿþý ÿÿþÿñ ,Çÿýÿüÿ©…ΰ€ØÞ-…€…ÞÇ €—¯eæÿþýûýþ‚ÿ þþüüþÿø“oÿüƒÿþ9„ž×€;øª…„„ÖÆ³ÿýüýŠÿþüýÿÝ<Œòÿþÿüÿ®ƒT÷+€Jÿ|…Eeg[/ „Û©+ÜÿûýŽÿþûÿú_Œªÿü‚ÿþÿ;êq€Eÿv„ ‚ÖìáÔÎÚèæ•/êêè€éæñ›óq3éÿû’ÿüýÿk‹Nÿý‚ÿüÿ­ È€ó|„*¦ôÊo, TÂùsÒ7FDDE<ævKô''æÿü”ÿþüÿ_ŠØÿý„ÿ 9<û5€ư„‚û¹4€NùÓhé/ª¹Ðÿü–ÿýÿù>Šÿû‚ÿ üÿ©¾¨€zç„ #ÕçE€€(íðdÜ$øD¡ÿû˜ÿýÿ݉&õÿþÿþÿû1=÷'$óJ„ Kþ¥€Xª±›“MXÿüšÿûÿŠªÿü‚ÿ üÿŸ±­€´¯„oÿm€ èN Úÿý›ÿýÿ@‰Iÿý‚ÿþÿ÷*ñ<?ô&ƒeÿN2¤ÛãäÈI€Aísÿûœÿüÿº‰Ïÿý‚ÿüÿ–}Õ€½¢ƒLþS ¤ý²T/7‡ÿz€ŒÁ Üÿýÿþÿ?‰mÿü‚ÿþÿò&§9ö&‚)ùp"ãÐ,:úK‚Ðw[ÿüÿþþŒÿüÿ¤‰éÿþ‚ÿûÿ‰7(ƒw‚Ôퟂ҃ ï+´ÿüŒÿýÿþþ‹ÿþÿî‰ÿû‚ÿþÿ炃×צï3€g؃ñÿþ‹ÿþüëøÿþ‹ÿüÿ[‰,ùÿþ‚ÿüÿvƒ7÷9ŸÑƒÍk€³šWÿü‹ÿûÿRúþþŠÿüÿ¢Š«ÿü‚ÿýÿÛ {7¿Fø,„¶‘ éL”ÿûŠÿûÿ­kÿüŠÿýÿ؉Cÿþƒÿ úÿi2ÀÿŸ€CñÐ……§¢CîÀÿü‰ÿ üÿÏ ˜/“ÿû‰ÿþÿ÷"ŠÂÿü€ÿ!üýüÿ€ùÿþö(º Lì… ©Ÿ» ßÿýˆÿ ýÿé(ŠÿÇ ¶ÿû‰ÿþÿAŠ(XÿüþûýÿÿÒ^ læÿýüûÿï7±¡† ·ŠÒqðÿþ‡ÿþÿúGgÿùÿ¨ÔÿýˆÿüÿXŠÔÿüÿþÈW\×ÿþüþÿþÿêbÚ çD† Õ`#í)&ýÿþ‡ÿþÿkCùÿþûÿƒ.íÿþ‡ÿûÿn‹'lÿô¯D_Òÿþüýÿþüûúÿ‚£ž6ê… ë+jÖ‚.‰ÿüÿ«-êÿýÿÿüÿhdÿü‡ÿûÿw" ]/kÕÿÿüýÿþûþÿÿþô²ÎhYш jÚ¸‘‚.‰ÿûÿ <øþþÿÿûÿ|Wÿü‡ÿûÿw‹&#„ãÿþüýÿþüÿÿûÉCàFĭ ÈŠ èH‚(þÿþ†ÿþÿÿSYÿýÿûÿšÞÿý‡ÿûÿp‡ H¨ôÿÿüý€ÿþÿåŒ0‚ð7gË…;ô"Eì‚òÿþ‡ÿþÿï2~ÿøÿ¾Áÿýˆÿüÿ[Š*|Õÿÿþüþ€ÿþÿùtï8TØ„ Ü’»‚ âÿýˆÿ üÿØ ÿØŸÿû‰ÿýÿE†  0wÄøÿÿýû€þ€ÿýÿÌ7ÊÜI0ëƒiíØlÅÿü‰ÿ üÿ» ·?zÿû‰ÿþÿú&‡·ÿþÿÿûýÿþûþÿþÿÿþÿý4!î&€ÍoçZ/ûX+ìÆJžÿûŠÿ ûÿ–Sÿýþ‰ÿýÿÞ …wÿøüþÿþüþÿñéÿþÿÿüÿÖg€«€ŒÌ6ôŠ€FëÈÓaÿü‹ÿüÿs9ðÿþŠÿüÿ«†åÿþÿýýÿò–$Úÿýÿþÿõ&™¹€Tæè€nÿ$ó5aõ»#÷ÿþŒÿøÕíÿþ‹ÿüÿe‡$…ÿûüÿü¡"lÿüÿÿûÿŒ>ò êS€ <úž! _ÑñOƒ—òq:Oƒáîi¿ÿüŒÿýÿþþ‹ÿþÿó!‡!ñÿÿÔ?âÿþÿþÿéÔ{€—É.ÆêÛçᇂoÔÝÛ½igÿüŒÿþýþŒÿüÿ°‰$—ÿ“ €ÿûÿÿüÿyaæ ñS#?+ € æÿþÿýÿM‰3kïÿþÿýÿÝÑ€yæ  x€ƒÿûœÿýÿÈ‹ƒ“ÿûÿÿüÿg<ù=€Æ¿‚€ €ûó?‚€ !gåÿþ›ÿüÿPŒ…+øÿþÿýÿЄëÜÀ !¹ö-vö*Võ®kÿûšÿûÿ°˜¤ÿüÿÿýÿV¹ÈÊíR… {ö¾ˆþZ… LÍõm¶ÿû˜ÿýÿë"˜8ÿ=üÿÂÌÆ tðÖ{4 !U¥íáUcõÎg"H“Þî”âÿü–ÿþüÿSš;µÿüÿÿþÿE Åæ"yËçéÙÔäéÛ¤K†×êÝÒÓÛéà³e€:ôÿý”ÿþûÿy›IÿýÿÿýÿÖ<¡ý`€ ?GFG&‚ 'GnsH1 €‚J÷ÿü’ÿýûÿˆŸÅÿüÿÿþþÿ_aû¿+„„„…Cìÿûþÿüýÿ|[ÿü€ÿüÿé¬ú±<„ eAŠ(Îÿýüþ‹ÿüüÿïVŸDÿýÿûÿZ,ªóØ{$ƒ‚S¯åý  …÷ÿþüüþ„ÿ þýûþÿÿ³# jÿûÿúÿluÌíÔ i4‡ ,_”Éèá§G!ðD‹ 'œóÿþÿþü€ûüý€ÿý½G¡ Gÿûÿÿþûÿù1€#g¥ÓçãÏͪ§¨¨§«ÎÏå娱y:¡¹Œq½ï„ÿ÷Ï‹5¢ÎÿûýþÿöZ‚5Sp†Ž”’ކpT8.ô,€ @av{yiJ%¥2äÿÿî¢).ƒŒ »¢‡¨PHbÿ„ƒƒ@é‘€«€9Ïøš$“ &øƒÊ€MÅõ¹S ƒkÄô¼JÒ 4£éç¦Uƒ†j¾óÝ+Ø S§ÿ{4pD&ƒ%Bg›²¿×,Ø"ÎaƒÿÝêâÝÓÈÅÅÈÓÞâêåÖ¥çmXÙÜç5·‡+0O``aa_`S1) oÐã[Ý 4å×P‰ ç>ŽÁÝ [Ôæ&… ®¥+õ0Ü ‰´=ÞŠ GéKÜ®…tˉ 4áTk8eDÙƒ‡ -Lr–»×ðûÿµÙ wÿдnK*†nÿü‚ÿüÿÝ Ø¬ÿüÿùãÐtƒAÿüûûüýþþÿý+××ÿûüûûýÿûÿƒéÿþ‚ÿüÿY‡€º€ˆ"øÿþÿþüÿA„»ÿü‚ÿûÿ‹ƒ‚¶€„Nÿü‚ÿþÿë„ÿû‚ÿüÿ¼€€ARL!´ „ÿû‚ÿüÿ¾…Gÿý‚ÿþÿå€ 7‚Åñÿþÿõ ² 9§ÞéÚ¶}< €¶ÿü‚ÿûÿƒ…ïÿþ„ÿ 3;…Òý€ÿþ€ýÿÛ!°uþÿþÿþÚŽ@ € ßÿý‚ÿýÿI†Ãÿü‚ÿüÿ˜L‘Ùþÿÿþûüþ€ÿþùÿ½±bÿüûýþýüûþÿÿþÝ—I;ÿÿþÿþÿð†‰ÿûƒÿþÿÞé€ÿþûý†ÿûÿT­äÿý„ÿýûþ€ÿé°‰çÿþ‚ÿüÿƇNÿý„ÿýÿÿýûý‰ÿüÿ¸­oÿûˆÿýûýˆÿûÿ‡óÿþ„ÿýþŒÿþÿó¬Ãÿü‹ÿþüûþ„ÿüÿRŠËÿý–ÿüÿP«óÿþ•ÿþÿõ ˆ•ÿû–ÿûÿv«Bÿþ–ÿýÿΈYÿü–ÿûÿ‹«\ÿü–ÿûÿ™‰&ùÿþ•ÿûÿˆ«bÿû–ÿüÿ]‰Óÿû•ýùÿl«Nÿü•ÿþÿû(Š ÿû”ÿþÿù)«!õÿü”ýûÿÕŠXåÕ”Ø×Újšÿý”ÿûÿ£–  ›’*9”76;É“D9–76>ED˜EDýÿýýÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿ÷ÿýþýÿýêýýžÚŸø$3³¿Ã\°¿fÿˆ­X+½  ØÿÅ'«”ÄÁ mÿþñj§¼ÿO¿  Øÿûÿº)£VèÿÆÂ]ÿûüÿõƒ‡€Ž ¡ÿûÿV¡œ½ÿüüýÿãt‚„† ZäÿùÿÁ¥› 4ùÿþþüÿÿñÕ™6€€ #%6¼ÿþüþÿC  ›&~ÿûÿÿýüÿÿýÿ”&cÆàðõöòéÓ³ƒF &P®úÿüýüÿ ¡]™›¼ÿüÿÿþûÿø™.tÅ÷Šÿæ¦P xÊøÿÿþüÿþÿç¡4ÿ†›âÿýþüÿÌ9-žòÿþÿüûüý‚þýüûýÿþÿÛx>ëÿ€ü€ÿüÿZ¢ïÿq›8óÿüÿ‰!ŸùÿþüüþŠÿþüýþÿêy¢ÿüýÿÿûÿ˜£ÖÿþT› IùõTiîÿýüþÿýûþÿÚKiúÿþûÿĤ²ÿýñ0› KF©ÿýüþ”ÿýûÿÿ HóþÿÙ¥ ƒÿøÿÒ›Êÿûþ˜ÿ ýûÿ¼Aúß#¦ QÿýûÿŸ›Õÿû›ÿ þúÿÎM-§ #÷ÿþüÿb™ ÇÿûžÿúÿÇ «Ïÿýþÿí#˜šÿû ÿúÿ¢ª —ÿûÿüÿ´—Gÿý¢ÿüÿX© Vÿüÿÿüÿe–¿ÿü¢ÿýÿÕ¨ òÿþÿþÿç”8ÿþ¤ÿüÿV© Áÿüÿÿüÿ¡”„ÿû¤ÿüÿ§©{ÿû€ÿþÿE‘¿ÿùþ¢ÿþúÿâ ¨ 4ÿÿþÿÿýÿÉ ¬ÿþÿüüþœÿ þüûþþÿÊ ¨Òÿý€ÿüÿlŽ ¯GDªóÿþÿüûýþ”ÿþýûü€ÿùºU ¨Šÿû€ÿþÿäŒ $ÜÚ#kºôÿýûüüý€þ„ÿ€þýüüûýÿ øÆy*@Ÿ ‡‚”:ÿþÿüÿˆ‹ %ð¯€[šÎô…ÿþ‚ýþ…ÿøÖ¤j*ᾃ†‘Óÿý€ÿþÿó&‰Cü€ ItšºÒæòú„ÿ ûóéÖ¿ {P&€ 昀%@QWTF/€†ÿûÿüÿœˆ%óˆ€Bᣠ‚,:BFGFC<. “j€+÷n O Ù÷‚ÿüå´iŽ2ÿÿþ€ÿþÿû2†ð‘€—ÿ„Œ bù¨€Qü7|ßÿþÿÿþý ÿÿþÿñ ,Çÿýÿüÿ©…ΰ€ØÞ-…€…ÞÇ €—¯eæÿþýûýþ‚ÿ þþüüþÿø“oÿüƒÿþ9„ž×€;øª…„„ÖÆ³ÿýüýŠÿþüýÿÝ<Œòÿþÿüÿ®ƒT÷+€Jÿ|…Eeg[/ „Û©+ÜÿûýŽÿþûÿú_Œªÿü‚ÿþÿ;êq€Eÿv„ ‚ÖìáÔÎÚèæ•/êêè€éæñ›óq3éÿû’ÿüýÿk‹Nÿý‚ÿüÿ­ È€ó|„*¦ôÊo, TÂùsÒ7FDDE<ævKô''æÿü”ÿþüÿ_ŠØÿý„ÿ 9<û5€ư„‚û¹4€NùÓhé/ª¹Ðÿü–ÿýÿù>Šÿû‚ÿ üÿ©¾¨€zç„ #ÕçE€€(íðdÜ$øD¡ÿû˜ÿýÿ݉&õÿþÿþÿû1=÷'$óJ„ Kþ¥€Xª±›“MXÿüšÿûÿŠªÿü‚ÿ üÿŸ±­€´¯„oÿm€ èN Úÿý›ÿýÿ@‰Iÿý‚ÿþÿ÷*ñ<?ô&ƒeÿN2¤ÛãäÈI€Aísÿûœÿüÿº‰Ïÿý‚ÿüÿ–}Õ€½¢ƒLþS ¤ý²T/7‡ÿz€ŒÁ Üÿýÿþÿ?‰mÿü‚ÿþÿò&§9ö&‚)ùp"ãÐ,:úK‚Ðw[ÿüÿþþŒÿüÿ¤‰éÿþ‚ÿûÿ‰7(ƒw‚Ôퟂ҃ ï+´ÿüŒÿýÿþþ‹ÿþÿî‰ÿû‚ÿþÿ炃×צï3€g؃ñÿþ‹ÿþüëøÿþ‹ÿüÿ[‰,ùÿþ‚ÿüÿvƒ7÷9ŸÑƒÍk€³šWÿü‹ÿûÿRúþþŠÿüÿ¢Š«ÿü‚ÿýÿÛ {7¿Fø,„¶‘ éL”ÿûŠÿûÿ­kÿüŠÿýÿ؉Cÿþƒÿ úÿi2ÀÿŸ€CñÐ……§¢CîÀÿü‰ÿ üÿÏ ˜/“ÿû‰ÿþÿ÷"ŠÂÿü€ÿ!üýüÿ€ùÿþö(º Lì… ©Ÿ» ßÿýˆÿ ýÿé(ŠÿÇ ¶ÿû‰ÿþÿAŠ(XÿüþûýÿÿÒ^ læÿýüûÿï7±¡† ·ŠÒqðÿþ‡ÿþÿúGgÿùÿ¨ÔÿýˆÿüÿXŠÔÿüÿþÈW\×ÿþüþÿþÿêbÚ çD† Õ`#í)&ýÿþ‡ÿþÿkCùÿþûÿƒ.íÿþ‡ÿûÿn‹'lÿô¯D_Òÿþüýÿþüûúÿ‚£ž6ê… ë+jÖ‚.‰ÿüÿ«-êÿýÿÿüÿhdÿü‡ÿûÿw" ]/kÕÿÿüýÿþûþÿÿþô²ÎhYш jÚ¸‘‚.‰ÿûÿ <øþþÿÿûÿ|Wÿü‡ÿûÿw‹&#„ãÿþüýÿþüÿÿûÉCàFĭ ÈŠ èH‚(þÿþ†ÿþÿÿSYÿýÿûÿšÞÿý‡ÿûÿp‡ H¨ôÿÿüý€ÿþÿåŒ0‚ð7gË…;ô"Eì‚òÿþ‡ÿþÿï2~ÿøÿ¾Áÿýˆÿüÿ[Š*|Õÿÿþüþ€ÿþÿùtï8TØ„ Ü’»‚ âÿýˆÿ üÿØ ÿØŸÿû‰ÿýÿE†  0wÄøÿÿýû€þ€ÿýÿÌ7ÊÜI0ëƒiíØlÅÿü‰ÿ üÿ» ·?zÿû‰ÿþÿú&‡·ÿþÿÿûýÿþûþÿþÿÿþÿý4!î&€ÍoçZ/ûX+ìÆJžÿûŠÿ ûÿ–Sÿýþ‰ÿýÿÞ …wÿøüþÿþüþÿñéÿþÿÿüÿÖg€«€ŒÌ6ôŠ€FëÈÓaÿü‹ÿüÿs9ðÿþŠÿüÿ«†åÿþÿýýÿò–$Úÿýÿþÿõ&™¹€Tæè€nÿ$ó5aõ»#÷ÿþŒÿøÕíÿþ‹ÿüÿe‡$…ÿûüÿü¡"lÿüÿÿûÿŒ>ò êS€ <úž! _ÑñOƒ—òq:Oƒáîi¿ÿüŒÿýÿþþ‹ÿþÿó!‡!ñÿÿÔ?âÿþÿþÿéÔ{€—É.ÆêÛçᇂoÔÝÛ½igÿüŒÿþýþŒÿüÿ°‰$—ÿ“ €ÿûÿÿüÿyaæ ñS#?+ € æÿþÿýÿM‰3kïÿþÿýÿÝÑ€yæ  x€ƒÿûœÿýÿÈ‹ƒ“ÿûÿÿüÿg<ù=€Æ¿‚€ €ûó?‚€ !gåÿþ›ÿüÿPŒ…+øÿþÿýÿЄëÜÀ !¹ö-vö*Võ®kÿûšÿûÿ°˜¤ÿüÿÿýÿV¹ÈÊíR… {ö¾ˆþZ… LÍõm¶ÿû˜ÿýÿë"˜8ÿ=üÿÂÌÆ tðÖ{4 !U¥íáUcõÎg"H“Þî”âÿü–ÿþüÿSš;µÿüÿÿþÿE Åæ"yËçéÙÔäéÛ¤K†×êÝÒÓÛéà³e€:ôÿý”ÿþûÿy›IÿýÿÿýÿÖ<¡ý`€ ?GFG&‚ 'GnsH1 €‚J÷ÿü’ÿýûÿˆŸÅÿüÿÿþþÿ_aû¿+„„„…Cìÿûþÿüýÿ|[ÿü€ÿüÿé¬ú±<„ eAŠ(Îÿýüþ‹ÿüüÿïVŸDÿýÿûÿZ,ªóØ{$ƒ‚S¯åý  …÷ÿþüüþ„ÿ þýûþÿÿ³# jÿûÿúÿluÌíÔ i4‡ ,_”Éèá§G!ðD‹ 'œóÿþÿþü€ûüý€ÿý½G¡ Gÿûÿÿþûÿù1€#g¥ÓçãÏͪ§¨¨§«ÎÏå娱y:¡¹Œq½ï„ÿ÷Ï‹5¢ÎÿûýþÿöZ‚5Sp†Ž”’ކpT8.ô,€ @av{yiJ%¥2äÿÿî¢).ƒŒ »¢‡¨PHbÿ„ƒƒ@é‘€«€9Ïøš$“ &øƒÊ€MÅõ¹S ƒkÄô¼JÒ 4£éç¦Uƒ†j¾óÝ+Ø S§ÿ{4pD&ƒ%Bg›²¿×,Ø"ÎaƒÿÝêâÝÓÈÅÅÈÓÞâêåÖ¥çmXÙÜç5·‡+0O``aa_`S1) oÐã[Ý 4å×P‰ ç>ŽÁÝ [Ôæ&… ®¥+õ0Ü ‰´=ÞŠ GéKÜ®…tˉ 4áTk8eDÙƒ‡ -Lr–»×ðûÿµÙ wÿдnK*†nÿü‚ÿüÿÝ Ø¬ÿüÿùãÐtƒAÿüûûüýþþÿý+××ÿûüûûýÿûÿƒéÿþ‚ÿüÿY‡€º€ˆ"øÿþÿþüÿA„»ÿü‚ÿûÿ‹ƒ‚¶€„Nÿü‚ÿþÿë„ÿû‚ÿüÿ¼€€ARL!´ „ÿû‚ÿüÿ¾…Gÿý‚ÿþÿå€ 7‚Åñÿþÿõ ² 9§ÞéÚ¶}< €¶ÿü‚ÿûÿƒ…ïÿþ„ÿ 3;…Òý€ÿþ€ýÿÛ!°uþÿþÿþÚŽ@ € ßÿý‚ÿýÿI†Ãÿü‚ÿüÿ˜L‘Ùþÿÿþûüþ€ÿþùÿ½±bÿüûýþýüûþÿÿþÝ—I;ÿÿþÿþÿð†‰ÿûƒÿþÿÞé€ÿþûý†ÿûÿT­äÿý„ÿýûþ€ÿé°‰çÿþ‚ÿüÿƇNÿý„ÿýÿÿýûý‰ÿüÿ¸­oÿûˆÿýûýˆÿûÿ‡óÿþ„ÿýþŒÿþÿó¬Ãÿü‹ÿþüûþ„ÿüÿRŠËÿý–ÿüÿP«óÿþ•ÿþÿõ ˆ•ÿû–ÿûÿv«Bÿþ–ÿýÿΈYÿü–ÿûÿ‹«\ÿü–ÿûÿ™‰&ùÿþ•ÿûÿˆ«bÿû–ÿüÿ]‰Óÿû•ýùÿl«Nÿü•ÿþÿû(Š ÿû”ÿþÿù)«!õÿü”ýûÿÕŠXåÕ”Ø×Újšÿý”ÿûÿ£–  ›’*9”76;É“D9–76>ED˜EDýÿýýÿÿÿÿÿÿ÷ÿt8mk@ còd†ÿÿ‰0 8ÿûÿ°”ÿÏÿùÿ×/»ÿÿ|xÿûüÿôa3Ûÿüú+"óÿþýýÿœ _õÿùÿ¿¢ÿüÿþûÿ×:—ÿýüüÿe9ÿþÿÿÿüÿû‡ .Îÿûýþÿç³ÿüÿÿÿýüÿÖMnôÿûÿÿûÿ¾)@ÿþÿÿÿÿþüþÿºJ*¼ÿýýÿÿþÿö(ÿìI¬ÿüÿÿÿÿÿýýÿÿæ¶m&46. †õÿûþÿÿÿûÿœóÿýi/øÿþÿÿÿÿÿÿüýÿþÿìm?vªÑê÷þÿûñà¿‘[&8~æÿýüÿÿÿÿþÿ÷+ÕÿûÿxŠÿûÿÿÿÿÿÿÿÿþüüýÿ¥B ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÉ{(@¨çþÿÿüþÿÿÿÿÿûÿ’ŸÿüüÿyÙÿýÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿþûüýþþþÿþþýüûüÿÿÿ÷·E§ÿÿÿþûþÿÿÿÿÿÿþÿçgÿüþüÿlJÿýÿÿÿÿÿÿÿÿÿÿÿÿýýûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýûþÿúëÿýûþÿÿÿÿÿÿÿÿÿüÿlBÿýÿþýÿRŽÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿüÿÿÿÿÿÿÿÿÿÿÿüÿ¾&úÿþÿýÿò3Äÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿþÿó.âÿýÿÿüÿØ áÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿjÂÿüÿÿÿûÿ«5ïÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿŸ—ÿûÿÿÿÿûÿo9äÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÁ bÿüÿÿÿÿþÿ÷5®ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÐ3ÿÿÿÿÿÿÿüÿÉiÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÅ âÿýÿÿÿÿÿûÿ‚ëÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ;°ÿüÿÿÿÿÿþÿû8’ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ©uÿûÿÿÿÿÿÿüÿÂìÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿü.6ÿÿÿÿÿÿÿÿÿûÿo_ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ‚ÚÿýÿÿÿÿÿÿþÿëÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÁœÿûÿÿÿÿÿÿÿüÿœÈÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿåSÿýÿÿÿÿÿÿÿÿþÿ>ßÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû&íÿþÿÿÿÿÿÿÿüÿ¾{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÙ±ÿüÿÿÿÿÿÿÿÿýÿX ©ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¨ Fh{}pQ, `ÿüÿÿÿÿÿÿÿÿýÿÔÅÿûÿÿÿÿÿÿÿÿüûüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüþÿÿÿÿÿÿÿýÿ…B‘Îõÿÿÿÿÿÿÿúݦ[ðÿþÿÿÿÿÿÿÿÿüÿkÔÿûÿÿÿÿÿÿÿýýÿÿÿÿÿýûüüýþþÿÿÿÿÿÿÿÿÿþþþýüûüÿÿÿþýÿÿÿÿÿÿÿýÿj dÒÿÿÿÿýüûûûûýÿÿþÿ舰ÿüÿÿÿÿÿÿÿÿýÿßÓÿûÿÿÿÿÿÿÿüþÿµu±ßúÿÿÿÿÿÿÿÿýýýýýýýþÿÿÿÿÿÿÿýä¾ñÿüÿÿÿÿÿÿþýüDJÖÿþýûýþÿÿÿÿÿÿÿþýüýþÿðwZÿüÿÿÿÿÿÿÿÿÿüÿz ÃÿûÿÿÿÿÿÿþûÿäW -U§ÅàîúÿÿÿÿÿÿÿÿÿüðãÊ­†\34Óÿûÿÿÿÿÿÿýÿâ ŸÿÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿË.èÿþÿÿÿÿÿÿÿÿþÿå¢ÿûÿÿÿÿÿÿþüÿ­ -:FQWYVPF;0 ­ÿûÿÿÿÿÿÿüÿ·Åÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýûÿô[ ÿüÿÿÿÿÿÿÿÿÿüÿ€oÿûÿÿÿÿÿÿþýþyŸÿüÿÿÿÿÿÿþþÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿuFÿýÿÿÿÿÿÿÿÿÿþÿé1öÿþÿÿÿÿÿýÿ÷V,AF:ªÿüÿÿÿÿÿÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýûÿuÕÿýÿÿÿÿÿÿÿÿÿüÿ€ÂÿüÿÿÿÿÿþÿõG[«ßøÿÿþîÃlÀÉÆÇÇÇÄÔq Ìÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿ^€ÿûÿÿÿÿÿÿÿÿÿþÿçnÿûÿÿÿÿÿÿþÿQ|äÿþÿÿþýÿÿþÿÝLdÿüÿÿÿÿüÿU0ôÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿõ6(øÿþÿÿÿÿÿÿÿÿÿüÿ{èÿþÿÿÿÿÿûÿ€Vßÿþüûýþÿÿÿþüüÿÿe¯ÿùüüüûÿë}ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÏ ±ÿüÿÿÿÿÿÿÿÿÿþÿâŠÿûÿÿÿÿÿüÿ¾¥ÿþüýÿÿÿÿÿÿÿÿÿÿýþûúÿÿÿÿÿüÿ¸Þÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ…Uÿýÿÿÿÿÿÿÿÿÿÿüÿpíÿþÿÿÿÿþÿõ/.Øÿûýÿÿÿÿÿÿþþÿÿÿÿÿþýþÿÿÿÿÿûÿrrÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷, ÚÿýÿÿÿÿÿÿÿÿÿýÿÚ€ÿûÿÿÿÿÿüÿ‚Dïÿûÿÿÿÿÿþüþÿÿüýÿÿÿÿÿÿÿÿÿÿþÿý1`ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¦~ÿûÿÿÿÿÿÿÿÿÿÿüÿcßÿýÿÿÿÿýÿßAõÿüÿÿÿÿÿýþÿüïõÿþþÿÿÿÿÿÿÿÿÿýÿÒÎÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû0%õÿþÿÿÿÿÿÿÿÿÿýÿÄUÿýÿÿÿÿÿüÿp-íÿüÿÿÿÿþüÿæ‚8"_àÿýÿÿÿÿÿÿÿÿûÿ’Kÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ“¦ÿüÿÿÿÿÿÿÿÿÿÿÿùäÿÿÿÿÿÿýÿÜ×ÿüÿÿÿÿþüÿ#ãÿýÿÿÿÿÿÿÿýÿL¦ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿäAÿþÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿüÿ¹©ÿûÿÿÿÿÿýÿu [ÿýÿÿÿÿÿÿþÿëéÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿOÇÿýÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿüÿƒdÿüÿÿÿÿÿüÿ} Þÿýÿÿÿÿÿüÿ´Kÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ–aÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿåéÿþÿÿÿÿüÿ¦«ÿüÿÿÿÿÿûÿp‰ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÎ Ýÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿq–ÿûÿÿÿÿýÿà„ÿûÿÿÿÿþÿý.½ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿòÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿØ (÷ÿþÿÿÿÿüÿ_uÿûÿÿÿÿýÿÐâÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿBðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ`ÿûÿÿÿÿýÿÑwÿûÿÿÿÿûÿŽ$÷ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿe—ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÌ Ýÿýÿÿÿÿûÿt‹ÿûÿÿÿÿýÿJ;ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ„/úÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿOAÿþÿÿÿÿþÿú,±ÿüÿÿÿþÿêHÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ”­ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿº{ÿûÿÿÿÿýÿÕáÿýÿÿÿüÿ²Rÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœ7ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüÿ@­ÿüÿÿÿÿüÿºCÿþÿÿÿÿüÿkSÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿVïÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿûÿ›Ëÿüÿÿÿÿüÿªœÿüÿÿÿþÿú,Jÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ–OšäÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÖÀÀLÕÿýÿÿÿÿüÿ¬#òÿþÿÿÿýÿÎ>ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ‡„¼íÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿò¤Y#Òÿýÿÿÿÿüÿ¾—ÿüÿÿÿÿûÿ‹'÷ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿjxÿûÿýûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÆÆÿüÿÿÿÿýÿÜ  DÿþÿÿÿÿÿýÿEïÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿG7üüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé¤ÿûÿÿÿÿÿþÿ9 ßÿýÿÿÿÿýÿß›ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿö!±ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿArÿûÿÿÿÿÿüÿ£  ÒÿýÿÿÿÿÿüÿÆ™ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÕFÿþÿÿÿÿÿÿÿÿýüÿÿÿÿÿÿÿÿÿÿûÿ‰5ÿÿÿÿÿÿÿÿþÿYGäÿüÿÿÿÿÿÿþÿê;ÊÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŸÃÿüÿÿÿÿÿýüÿÿþÿÿÿÿÿÿÿÿÿýÿØ Ëÿýÿÿÿÿÿþÿ÷r<§üþýÿÿÿÿÿÿÿÿýÿÅG)2^¸üÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿYXÿüÿÿÿÿüþÿχúÿÿÿÿÿÿÿÿÿÿýÿVfÿüÿÿÿÿÿÿþýÿèÎàýÿýýÿÿÿÿÿÿÿÿÿÿþÿÿøüÿÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿìÒÿýÿþüÿél ¿ÿüÿÿÿÿÿÿÿÿýÿÇÔÿýÿÿÿÿÿÿþüÿÿÿþüÿÿÿÿÿþþÿÿÿÿÿÿüýÿÿüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŸgÿüþüÿ¦RÿýÿÿÿÿÿÿÿÿÿüÿdSÿüÿÿÿÿÿÿÿÿþýýÿÿÿÿÿÿýþþþÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿþüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ<ÞÿüûiÏÿýÿÿÿÿÿÿÿÿþÿé!˜ÿúþÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿßçÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿµyÿöOdÿüÿÿÿÿÿÿÿÿÿüÿ¿²ÿûýÿÿÿÿÿÿÿÿÿÿþüüÿÎSÿýüÿÿÿÿÿÿÿÿÿÿÿýüÿÿÏÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ<žU Ûÿýÿÿÿÿÿÿÿÿÿüÿ¢˜ÿÿýûýþþÿþþüûþÿûŒ hýÿüüþþÿÿþþüûþþÿÔISÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ˜vÿüÿÿÿÿÿÿÿÿÿÿûÿMÔÿþÿÿÿÿÿÿÿÿú²4?ÔÿþÿÿþþÿÿÿÿÿÒd ¤ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿßèÿþÿÿÿÿÿÿÿÿÿÿûÿ² Q Õòýÿøä¼}. ]´åûÿÿýëÆŒBÛÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿH‰ÿüÿÿÿÿÿÿÿÿÿÿÿüÿØ;37(/BB28ôÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿv#ôÿþÿÿÿÿÿÿÿÿÿÿÿüÿúOûþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿŽšÿüÿÿÿÿÿÿÿÿÿÿÿÿýüÿê…"D+Sùÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿbÿûÿÿÿÿÿÿÿÿÿÿÿÿÿþüþÿó­T3|Êÿ¥Aèÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿÿxtÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿé¯u@9gŸÖüÿþÿö)»ÿýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿâG\ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿÿÿþðÓ»£’‡‚‚‡’£»ÒîþÿÿÿþûýûÿŒjêÿþüüþÿÿÿÿÿÿÿÿÿþüüþÿû™%÷ÿþÿÿÿÿÿÿýûþÿÿÿÿÿÿÿÿÿÿþüûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüûýþÿÿþÿç†èÿþÿþüûûüüûüýÿþÿöª3¡ÿùÿÿÿþüüÿÿÿüþÿÿÿÿÿÿÿÿÿÿÿÿþýüüûûûûûûüüýþÿÿÿÿÿÿÿÿüÿpa²çþÿÿÿÿÿÿÿÿñÆ|%ÜÿüüüþþÿË€ëÿýûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÔ9c„˜£‹oE!½ÿþÿüÒn —öÿþüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüüÿ];cX/'”íÿþÿûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê0pÈûÿÿÿÿÿýüýþþÿÿÿÿÿÿþþýýüûýÿÿÿÿî²a0vÞÿþÿÿÿÿÿÿþýýýýþÿÿÿÿÿÿþÿüÿŸ ¶ÿûÿØÀãòüÿÿÿÿÿÿüòãÉ«sÆÿúÿ Ýÿúÿa/=FJJF_G:€€€ÏÁ Œp²ÜòŽÎJ-½ò1ú3aÅéQõ$^`€OÏ#´Ãò‚÷³MAÕbNºCÕš“l@|›DÙöÈ*Jí`'¥CðÏÍ?ˆ~à ‹Ø+LŠÿMÂ+±’ XÚöù“«}ç)“Ú”TЬ·ÜeNaf:˲ $u\ô Œ£óºÓWiOxpTZ†§¢Í^»R”—¶c¹¸ Ø­Ð xâñrpî;±oå.(•NsNh†!àb–ÑR`¾ÿtjÚÌ2`ü¡/‚2„+„óSMSÕŽ*c Åh¶Ë5!J&<:Æ[·>2©‡\ÿH)ЭÌÖSÝr(’Ö§2Âf2úºÖÖÐt¾~+Dw+¯LÏÎáŸûÎ.̧þ¾|ÞÆüä,å;Ô÷rhÉéØ\°OÏWŸ8¥ô J ÆÏu~º;¤†Ý믃¥Ñ‰A÷§“œ*bÏsø°D¥6(\wmõ­¿Ôü-¡Aq Zc$_°™ôPŒ?ä ,‹û|V;RJêÆKëPH#bF")ëž–æÖf=W:‰¦©,mº¬ KU“Õã—tx»¤MN³q¼kòÁ9÷R¿×ýQ‹ñδœ<Œ<ñû˧¶DeíßN r5«Uà¶ž~ù¯”ì)|òf'´è¤Q\`ò{Ž›ü¾¤_ymÀ/{'¼4ªüòØŽøDbáßÈÏ¡©ïØiQ˜¶¥n]ÔìoA°Cs½»É4{XDÂÓ5 \òï ¼‡5ºo7­döXËòrÉžYC«ÑÃÀ$_dkÉ‘p—J¡l£ÄOù&\®¬wr¨…ïGwý¥$Ðe=¹PWàê"Û¦$Çr*MØj_eVa CƒDàúÚìÖä<‰‰Á{|,—‚¬BÁªçØÌÊ5&yÁò.ˆlO0)„A¤æäY÷¿/·@¾<àÜbB’? 1ˆžÈ‘¶ üw®«;p }•¥ʼnñ`´oàÈ( ¾˜ÎøÍ”¬îmÝwD$š~7YìNä×ù¨ÔHØ¿83À¾>ÑÑOæÔ!¬–ªÜû¶bI•Î"~ EÉ1ñŽïÃsó±Ã3ŠˆK#»£MŒ(”ùÅïzzùY‰GW‰¨Ãì9Küqõ˰ß]ípXµ  ^`Œ—Ù¡þeK´ ’Ÿ¨ÑV ΂½ó×ÍL{"{\xàVþø…芤'fJ‚z‚bÅÒN¼À›UâÞm†•Ndϰ'öPWpV&Â7=š°Û³ß~¯hlª0¹«e_4O¸ x $å‘o kp%%õï~CÜöS9±I·ûW½]/™€¬qÆ^!Úlht¹f8¨Õ,þ |¥dC8p ù[Û…ˆ0É‘{u-7š™’ø‘1ŠOò{uož¨+¾+…øDÈì.œtoMxÜ }:/ ÿ-‡½ål²nòæ–jø‰/î>Mîb¶œR3x‡RŸr |‹Üt‰:ô†ø)*œwJ4Nº÷4@“¥VxâÖûß)¯/9yþé›L&_/ &Ѻ:ö‡¿P…¨DeëZÞØxEVƒÚc”ÿ~óÕŒ2Çâà ‡K7ÐXì•ö—¹„¡mâ,Ñs+¤€6Ï ²0·ï ;gØñ7£‰»¡.䟊ÄÊŒÄq¢·9w._¥“­6»Mª‡¿œƒ.ÁÊ‹¹ÅPèº/"B"ÉÉZæÛ$ïÌÁˆ\Âã- "ÿt·Ö}-ñœål2±4b"Íë|½$7Ù1u†À æž* #%¾ó\ˆ2nmšY”Ëô¿¼á]¤:‘Zx׆pwÂ=øÄ‚"Ê" ¬sÓ)dÞÏϧ ùõ›ŸOàůÔ4;Ôú}î$°¸ÀK«À½ñn êÞ’àf*¯(V LgÃ+à†‹´ŸX[ÓôDs‹”B­XækÝÃÖá®ä⬽^Øü³ ¤)÷Nú(YÖ5SÚÁmMó!(i·åtVm%QêÖ•FýîãóÉèb>ÄÖìd‰§âæ4꡾²˜ºJãð™¶@‡e×l2ÆÖëY$n nE,w©Š<"ÝÑÆ§æô»6ü¿C$"Re›£&ÛìCwôXæc,«ÍùpÒÀ ÎÍ4Š‚…W/\-óņÌü'ÂÁ_3¦ ‡Qƒå5†aô£„o #¹Øš¿kÿ.u.ý™¸¯0âî'š©ôuú oY[Q®·–…ëÝ;fù‹¬î‹÷8ªÓ:¥`©C³»²7iv%›ìžlJsúDè=§à8¶7ŒgRGiÙÎÐê xZ šà0 ®<" ç¨v›"³`@ ‡hí€[çðL1{*ôó”[Z'ï•IgªK Ó?÷¸ÖuðÀiÇ\{Šy¹Ò0’\ø×jÕ¥ÞúÍXÙö<¯Kç¼ç]X7•h’S ƒ]o­qW ~qB·Q(º{iè{ΧIg4O½¾‹ÞÊbR¹"àæV_XP]É´e:#Ò€Ùë»  ¤ºUü'$⃋gÒø‡…MµjÊ„Š_xZW'„¯méEÖ©Ù„¸*Âb+¦*á1ñN£y&Ñ΀‰'G’r¹|làáôÌ#Ö YꌌŸ?ÕZ; †õ¡:OÊÞýÜW$AˬÕ,ÞP„\š|¼˜EWŒBs•ÇSÔѽ±Ú$?˜¿µ°žžùíÆ ¿• >HÙÖÍ€ð¾fhJ+!v p7lpŠþê#‚ ü=JAkñíõòX¬iQaÂØsÓ2Y—þÜ@¶©÷´ÍHç~/ßÓŒçNBM–gлt†¦¡Ûˆ%U@wè¾3øAŸ¾E*·èíR¹„o,°Ù¥ž"¡OÀšnÁåÆ7ß û1\ Œ»¦ÌiñÆvöbîJ2|§H+o0c¿–¼(²ÑüdJóK lãÍ¿»€3ÏöQç–TOœt»Ì›fV5 j³b¬µÇÄn›j'=“L\pù\”åK ¢K²V@'6Ü¿rî©g÷ò€í9í× äȘDȵÖ-´×ÔÕ_&R{ùCŸN¥AÿUÿe.ó{g[ÞDèW³â"0 ”/€®7ìÃÖ~ßV耛C¬m{ B1/sÎkD}• ïΖ¨^L,ƒH¢L˜†‘™rÛÁ tÇê’ pæ/Ȥ¡O°žïŠ©!òkˆayng< žËF×à~Âܨ»a¡Ðê@<h¨Ý½ã®ì‚QùPD¥p¹™ºð¬ÿtƒ à°Ž"¨ ¢cí·LTNÊøµp,jv’Æn%KÜs‚ÜrT'ÔæÄ×Ëô¦Ó0!DºÖn1Ç©ôÌN'Z Ì;ž<—Ù-#ËÍÙ‡å9Ö =•æUß)Û¸Û’æUS³ŽI¼QÑÖÉ´‡X"ð1è™|:˜èIˆ®þ#¦¾·&½þ£Q‰2*Þ6½‰`8Š¡ˆeM³&éEÆðR÷¾³Pàý X7§ûA÷•¾F-!³ó@:Èßô¼xz«\8Š/}Õk_‚åvöÿq„*؃”‘H³Û,4,!00Ÿ¡äèÝ´?/Ò ößJ+E– ›…ÖÄçCæî™í£¹°9ðô¥¤„—E²Qäºfœöâ¹ig2F‡“oÆÓ9ô˜å Ôž§^uÑ'V­,%¼G„3/`f8÷ÎOT jü|ñ6‚P›«U)ß ÏÞY³ù¯g»³Ë—ãØ%íð›šhÆAË•Ôï $¥)g°ˆíéfâ­#GjX]£Ät¯Kè [5ÚeD[,gj Cs˜öW`£‹z‘¾¢íÕkz®½Ì gîŒÃߺž‹œÌ2ï@ …®ú-0új¢©¸F^qó0H‚Õdí¼%{ ®Ÿ¶$œ$|.6µ3twr·‹–†$Â˜å Æÿ\IˆGèšföw]Èd|û6Ÿ.<ÃÉÿ‘xÓ ´¸FsÁ$y¼]¼ø“˜¢&ǽK ø¾•åÃV—~лÜé¢pÎ6ážÛÜl˜I6ÄOå‡ F_MÏ\M¶EêÇ’4u/ßÖç„Åãn˜i§S2〶Aóå¹:fœ³×€&àenéOQjj´`ŽI6^a`Y¿Ú˜,f’Ø{öY9¼k¡€!)§©­ÆNðÆͬOQÐñku@€+ˆ©x²îúb$#{öõ¡÷›áp=¤KN{ÙË_M¢O¸ì`¬dr‰›Ý1>83?4ÌÓª'çŽÚ·åÜnÃÆ*€€ÏÏ¥ˆü:g‡áÒàÌO ® Žd€ð´*\‰dËnÛ\šö臠í><ð2Þ>[éÙ†_±ÙÊZMΑלžFýëk3CdÂ_Yt³ȾÄÒµÈN•,˜:ÆÛV5·NG¦@ìvµŒû Õ0µÞ:ë­SK£ØM$,Èë9΂ÛÏaGĬ{#˜MrC‰¹¾>÷ÞÊÍõ'1·oÚ;‰€ãL Ûg½‡ó K«räôA·8&“”ÜaO›3„Ùq³cÕÍ?%ª°}ö9¶¹n²yÏ¡¦ç:;5˜àׄ(i2kNÇŽ{÷{á0þôä»Ç…ÃÙò$lD`y0º‹áf þfV¥Û–*“ꤊ$^¬~p3ù>‡.°äϤGÈeZƒRŸC_F¶"æ›ÐŠÞ‰š½H9Ã/{ÐÞhd1ÝX¡©%½48?¼¤`«QP§ÖJÒp™}ߟ¦ñ2c65¥#އç#Ï0ÀPå·âR÷··Ÿv{5fT?ìyQ^€ƒPàÝÕCSÒ` ¿õ/C-³OTNw bÏ:`•œQ1cWçm™RKãQù#Ÿ©—•Bë‚¡Ÿª*!º*#ÆË~Í]U̽é£Á¤‘žíÓ©ÓÕ}·òÝáj‰C”næÇ(EËݼµLnÞ£e¸!IV7G¡ó‚⸡ãL“Š[3™‡ÂqNä|—7•ãÝ ¼Y¾îN[®hèÆEadv¯ÁtDÊzéþž‰Gã‚ÊîœÑ†-~UiDï–ó¢Øj(3›é mìY©×ïˆ9ßÅ‘ZI®O[ö8ÐN¯b–G!ãHJ®J¸ˆ­®Š=»rF›œ7a5usÿ ݲcÜAHàbKÿaƹN à§Dï6S“½Ç©…¼)íŒE[0~f²Ö]Ð[Fç¡ôÛÕ"~PÅm¥7;@&f™[ó-&Æ÷‹ü/ kko“ªn ¢M—"9Ëíÿ@M‡±¬Ž…±Ò ©³+ÑOÚWæ½á¦‘ËêrÓ—C¦±ŸÆVö]¢?%çêÉb8‹70Y͈ºò)nñÇó'˜·Š¯1ƈ {ÿj—âˆ5¤We8Ì·/©‹ëžoä™Îô¯09ÀeÝŸo¬íë ØûAðí0TÆZs¶ø6—œHòº(;ˆ¦4gâN<Ä4’,é|ÇܦK α +îê©f-}­<Òo×Zœÿ7gªÛ(0>J‰´LVE—y|ÓÑy qx}÷èÄ1Ç_òª .S’’^XƧÕEy!<Á™Íñ€@âr+âWfŒ àòfþû°\¢—J&ÁÃú‡¨¦¨ÌEo,$Ä<;™ÂfØÄ–;ûžòýú¿Áèñ•ŽÔŠø1ˆÛüž'¼35?ê}_Žª€¥ ™Ÿ¾@Ä( Fæ¤Ït'AxµšÏù­ª×|.«QG9ðÒØ‚XM-}s`‰±zOFûáÑÙ§DoNÎÛ…UV! a4HïÁ0®ñ·cgâå<ó:ùªZ¬÷‡ôN5æÏ©.Î8Òò·»©v ÂÈîä6»¥¸óoíJZç¿€ÁWäóÝDÍ@ fËK§µ„62x¨Â›Ù÷Ò=2ˆ7oíñöñ$ZÉ÷…\Ĉ;k⬕3%(ÿûX_”­Ì|Ÿ¤*"œ­ ·|ð=Ö·h™8,f²jt#ßW"Tl¦¾ÊclO‚ÿ$°y´aç¡ÌÉqÅ8QTZÿ Ä€»3ûì/pÿ<:³W%–°±ÉÜ[:«Ñ|^PÁ‚”ÓQ墸ø¯ÂR2ƒW³ŠR¿U¶Í_D B%—‚å%a>%ìTŠbpê<72«0»4VÄòÁã ^!QíÔøˆÞsMÛJ#^Å{>}§çUÈôKæ'DU­ëG8È ¶3Ä¢oy¹ûgA§ö)%°ÈwfŒg÷ƒ¿ GLnè÷.×Î;eNk@ÿ=Ø*«²þs`ŸpÉJ6›d)~R5øpßøµ”ã8{/™ÊðãAN+fØô]ƒ#Ëzu½ã±-=Kýôµoàn²iׇìäsDÍvÛmæÍÀ  ³KË£g?¦$moÇÇ#L»²‰²ôGÇrßâ`6…æD(¤HOI¼÷•ôñ\ãW¹aÄŽ 'm±Ê ‹Ær'Qº¹Fõ(ZcÁ³Àº˜¥è èP 'Â…ÐØsøêš‹>ʵi\ÖÁáÞhÁàh;½VÏÏ×¶~~ÒsóõöêsM°Û@tà að¤øÃ׿»;‹ãDäþÈüŸ5 P\Üs§å‰tFs§T¤\ìV šÔA1§å KŸ’‰öˆ9h0’{DŒq"ìgÝêpîr¹t¼Öwê»MžŠê[aåÜhÜÿMÛ]ˆô·°PA¯C ¢Û†7!Kb 8®r-}Ä,MÜ«Ý{yWœ¡\OtÀa•VÉÚO”ßï(rð-¸¬ ÙŸ†°ESºá‘=/wö4½ª8F»ÏöŶKž‹Ìá“s«ó|Ê5­º¨3ãÆ«KƒWcþÄ«n&œvÛ° ?èݵïb#*©ƒÔú¾g ÕÇ«~ø†ZY¸ÍèîNüU¥èBèÐÒÜŸH¤«ÄÐA¦ÏK P«FŒ›gm=?dÆXæD<É¡3°[ƒe'..ïx¶¬º+ެ7ð9Y‰FT¯M›¸bpS-aÒöŽãŒ¯uÕóÛÝðªVY¦ýXb¤n4ê?š-L|Ù)éË‚Å%Ô€õiÔŽ6¨ù(ð“•òfLM9Ñ‚+{¯ÛçW±@þ§6×m¨l=sºG‘BÕÖ]ɩǠ}Ï|χ{ªT<­úÄ¥íPÐ--5¨,IKÚSÇP²Ðmü-uZ¨¬ÅkAGàÆ²øµ³c ò¯÷"ÊÜd®÷“Ð2ûvÊe5§÷´‚òô³nÇ܉_ž*^]×Ø'.RyÀac ›~BÝ4Iæ/<‘³¯Ð|̧H${‡~pA4Тqà§_£à¨ÇRJ˜m“S º]§¨Htl¨ïü§q£ŸÔ_¶‹NÁþgCrq›&( qœŽb˦”ÀþáÁš-kí êÿ.ä¡ðû›˜Ó~®SëßågüK¹8bˆ¡$hÄvy@@v‚·!¹ýZ»â*^1¨v–q7Nï-C—‡ÛkÞ=‚JöÊóËPJèÄpÛxËS Û´p^QçE?÷Ï óIèš553¢ 7´üÁ3ÒÄGÀõw¨¦å\u°-„õ’]ÇDÇ"­ÔA™fZ&0ÁêŒY^¥¿§r“2`eÞÆþz?ú¸dxg±}ÍAÍÕÝò„¨çKB)àà/Ôù{¶Ý õ*ÖÿLã•Pö_¹¯!9¿,¬†kü:¾ ÕµZªšh]öQppæ…ój5ò®°ð”~á1 $am2ö÷ìþ…&OQ1Õ%ÃЦ!!cL1ŠoºˆDjî×™/ÎÂ.ÒZ1ⱪÂO´Î‚Š‚þ–_(ãjJé®îü ´ˆøOV0dÂ|–!Ûèô``Êmͯ—雿=2´è8)ðÕÀH#\eâ² ðe]vÙOÁÃty’/ Þ«|©×½¬gP,ªŸ1È“qÍ=ÛÚxo1ÈÊp}‚àÍ]pž–=´ïc²Sÿ*ÃöʱðŽ3V¬Ìi”’†@øƒñB%hšácy°PuÃ_Ó¸Àl®¢ƒý%ì{û»–ã„þ`y¢¬(ÀýOóšýº¸Kät¢ãÑe TÐÓå5\{µG‘u¯µ÷Ó‡!ÜrÃËCׯm \Ÿ”.ÿuÊç>»]h©§Å(#¬ êë†0NwÚoÓ¼2j=k8¼®Oó¹@Zæ>x;~oöFOhÊ6,Ñî8Ñ›d²y`1»†éò â!™Ôþ^Àè :§rÿ^`%Ü£ƒò˜ãÍhY›xͧ*X€íI \_)žÓù³s©éФØ`ÂBN¿«`Cþ0½ånäÛ»öXòóøt˜-p·ö‰Ê¤;ˆ ô ™U5¤g)H×N¹íª½)£õ‘Å6;ƒvp±`^7܆>6RÄÒ;¸nïZ“Oå}Ä¡è‡f´/R¸œvƒÕЯBñÚ­9k3kßiaéÅ~*£…Q«ï’çÙþò-íÿC[èûÖ¯=á©ÆœùY•^4½èäìÏv.ì[7˜w§Ìé¥~â\$°áŽ¿1Ó3º\PID@úa OÛY¿e–”³H&ˆ™¦§O "À³z•«¶ÂHšK€©Û² 9¯øÝµ6&Oã¶“¯X¹ßæå\}÷ ˜h kˆÔåo!à<­$êÚÍ“=âŵ,ñ„Ò+r2Mô8’Opþt±\½r•*]p29ínØ5n6gíˆqÉKðMµèYU´Ì@2}0=´‰Ä,ÚuÙ¦/Ô É1ÞU\©„«êýÁþ³ÜèPœP,QŒ{”!÷àš8ň-€ˆÃ`óMNûo3‡xõ·<ðéCp¢·>Z܈jKîÐˬ5Ÿ-ö&^Z!®kp® Ò¹Ñ±¨Âvƒ3&ŠNÕ«æl»x ¯p û…±ivÎYû×[  [ȸ•ˆaÅ®%OÄò¢Á¿NbnO…± îJÓjä9'Ò&þ˜;Û0^Á1[0BM”ì–œ*ŸÓÕÛB‚Ȉø«o~=×¹¶Çñs¯0KYŽ!krÒ­8ó µ¯ZÈnQêf›±uçuXÿy”%µRsQiê®×ŒÊÅ+‚þøç)#‡0! ÿBÀ»ÇF€y(8²phèí"Të"bª/Ç*˜f¦â±«;TD1IÿRâÆü µÊP»´ af̬3‘>lûÓe }sÚPhÓ ðX³UEdä2·CÎ7ð0íV5O5Ȧ~E-1#mÐ[jò— Ö4Øx{@I© ¨…‚é 3£DhG¹5ã–U¥:3'¬‹‘-’fÖêü™#M.ÅyøÐôYG*CuÞø€cRÙEãë%*ON3 ‡{Ic!×Þ§|y=;“¯ÖO™¼§\ÍůcüMºŠs´ÖåÃÓf6Æ} œ"‰3{ÞF #õ¦Þ>ÿ‡mCªô¤ºL¾ ¢¿zB“\>ƒ1÷¢1 ¸½¼²'¨KÿМ­çÿwˆ.)FÝ¢ïyñèûÂnÍv#‘C=ÞÆüäH^R­U­óžÛ&–WØ}ãR¬r “y€Ã’6¾ž°¨R8nͧ€ZSïß6¾3î1Óso´\Ë¿©­Ârwù«isóè€\d×^¬{,_Å‹£§ŽYi¿ÿ{ùS¢²ýÐ -k;¿¶èžð€çÝôÜ”·.#.M³ul.ÑÌ…–“áxWJdzX(J¯@ºÎÃj;QøMZÃõ༖g!ç{†6Q—³ )\/^‚=d¶!Ô{–Å7²m†j`—Êq*vòúµ H°ÛM[Ì]½c«º½ï¤uyÂs/ØÑ옚˜Êõ&ʇŠÕÑ­úüpïT)§œÔ»}Õ9³¶ÇŒ``~Ð45‡[›7€¬Q¹LÍ:N7ÑòØ5P¤.­’ÀJO@ÊÒØÕ?©HÆD²PÖâN!¾)#kvv8™ÞHXüjÐö‚¶þqmÿpZpõ7ß™'-\¶Ù¾{›,×E²K’ƒ)ng³½.Œ,{Lþ{"ccæ2ËÂÖ÷IBÍéé9†yž²lxvÑ?Âm€)/Ðé®”YéciÕj¤¢ºê•ý'}w Œ5(‚“9gµ›|ILbA}%’œU­ê9u Í“OÛpÖ0Ác°À_²¦ô6¿ ¶åaéy5 ›M5ÌZTàCg#úLÍ[íàuedÕ§ÆC™³ö¤Ìÿ\ÅnÕÉJ+³XÒwMº$’Ëïõ&t5xOîl½Ç¥ßšL`;/ñÇl”ì¨ópð#»œëì~Ñ3¼Ýõ/N‚Èž„+âå[M¿<6ãIÚ³ÃX˜',–Õì¶¿¼žÊ¬˜Ó±9ÜOŽL7 ßK\Ð×ýŸÅÜ,¬«ãº]—âMá ¡AÔò¶Â'¹N|À/–ë‰Õ–øÌsX\w5ëýûEÝ<ìÝv¯û€€ÏÏÔJ?TXü=A€ñ.]…ÒöŠÿl•¨ÿTd½2NÇÛî+P—pçñb±ÕŹ ùN_ ¯ Ðäa дŽÊÑRС”WÎOîרgïŠÐ™zD;°¿ŒÈ½z²21 lÊoÆoOP­”¨òíÚzŠ!·¼9qÒ¹¿ŸÌ-Vù·Î´Ôa‡ƒÙ©Èúh5%\™ùWÎp˜}Çÿse„Ëë7Ò«Ûûsâ1þf‘•ÆG)™æd³1Ñ©Én‹»Ðåfå×(ô!3_Îuµcì|JÅÆÕ7hÄ(Búš! $Û®Þ£ÁPïña8†ïL#¿¶ÊS±À!LêX˜p]E:‘€xª’‚¶XècŒëg0—ž'?³£C-à‡{^01õ | ¹­žLÓ/ÏKº<¯¯ç#øßÈD©Fl7̮Ҷôþ€¶[SC*T ·ÃR ËÎC;"¢´¥‡hÿ£Ô›·tñ‹ÈªÚÒQG¯¤¡’n]uzmÙ\±–oç¬äŒŒ3œa½tè£ìwvÆô§ž·YkfÐEéÞ;£ß0Mž?ÖuØBEä4|KÿT“wØ^‚t#åÜsùù%æ6#Q¡{ø÷;ÉSidJÇ(%U|ú;‹àß}äñ\B œñŸèŽÍOplìH9Õ=÷Ò$â«?p[}¡(>5’ïæ££ÊOvvyîþ¯FÃÊ-ǃ1ônž Pã¸(†¨yŸªPœ¨Såhi²Ô[G؃Á¿ñŸf1ÿ–BÏ“û+uÿ+“ÑGT)î‹àÁ8¶c°#C(+ ¶pÑzê‹=à–¼zɑ۳ã¬RÏe”4ÑÙx^Æc …¨Î¨ÖþžËǶ iYW|?șΪZâ!_ÕFÝ—ÚÎ`|¹mŒ?Ñ7„L!Ç HT}ØÓÇÏÏÅ‹?lÔ$w@ë‰Cù+_P}`¼+ò]sšo"ÿO–‘Djÿ€qõ"s,¤"%0ÌwUºùžÿ˜^.sWº˜²Ï^e×Ò‘Ÿ{Q@3<ÊQ§›5¸+ê°SAb\»„ £ˆëù‰ì?^Šô[2‡×/¸1mÔÝ2 ½XzIŽœ_²fʇۀþ…¨w[„Ó_KU*zã1Бñ3« ¿1Æ›¸Ž„ʆ—™ëá¢%þ1MÜ€tM%ÖF$l µ‡¾ÿQN›ŒÐQcÙ¦gÕõüѾ^©¶Xß²…û}Ö¾ÊEä4ý4›7ÃøöÐ…Eõ9ùtEþ-}FC¡¿Nàøj.H•„Fú q‘ч—°±Æ\Çržp²&Nˆ4bÐ)¨Å9ú]²?Š=O0©fKþ…) R»6ÜÐBÿØÛ§bå8aAŠ†Ç½4Ң˭ncZÍ Á‡F?m‰&\*ƒÔÂÐg •„ ª€Ä¾9[Š2À(DË^c¼ ! œ¬†V•Æ”–`\Y~¹wÿö{作T‰Iˆ 'f×2³NuQº}öÁ–üKs.€æºÐ²+`Þ£²›7™Þ[|„¼fÆU8”¸tµTô $Á'@vò.qU«9žt/ƒy[&á$ä_$§xæ]rÀ=Z¬öûçPÖp¦(@¾ß´†f/·<½ãdMJHíš"ê÷Ǫ^œ{mÑ7<½«(BD_ ý=²Ÿ\ÊO¦j¤—º’С½ü:Æc› ›¼ÀÝ᫳]…€™«þ–œ™(àèœÜ¨°8ž÷u¼ç’fÑ ýÛ™ kÝ‘Nnâ¤Ð;€!L _¢ÅIŒ:aWY€Jc¬ü67¬ ¬¥86ݱ*™ûïº?“X 4÷|}„"CãÓ044JˆCoá•ùêŠq çrªØ¥Y¶âõ4 `~iùm¡;£¤ò­‰S}­E͹Ô!`Xn42áóh0Ù2T̉ö÷yQ«°ØCÝfÒlìú‡©åZœxò›-ÏÌ´&îƒ@A5sÙ ¾‰Œé…P¬ÜÚÛ¡¹Íþ·i“¢P`–qù‡j„FÊêM7C)‡¿{ÚIhî§lk {by„Ï)h” 8„{øÒú㦠Ø2Áu†Rÿ8•ÄËQ0ÁO‘~ˆ£0Mÿ{ÞÖB7ãn2Á'k1NpXæÜÏš\AصUçºQ‹ÁŸÉ§õþ&¡6u¼A }ï;Öo˜SdcÎû­ô%÷EK"²A-flåK´gñ8§2¿šG/Ë®À8Ct¸gvó‹fV¶gî{q+ÇÒh½µr6,áBþÌ}ëk³É-ÊA,E„;É/S"zNgaõ螫Θ_f犀߱‚”,hl´X¥Ì`I­ý€ìXD†–è½M øõ'³ {¹ábŠ.°"¥ãòÁÊ\F˜´"˜¨ga•c^Qc=Êðâï/û ³œv‡X…bUNˆN¹<¸|ý¼‘ˆIÙ`R_,¥O͵JaJ°¶ÉMê&#G]%}óÑJÇJ`ªƒ“µF™0+ñWFcŒ‚G(—¢`½[¬@gá0ú(UHªa<5bïô(‰ùp¼Æ“¢¥åp§+(ƒ´·JãÜL¤0 ”fÚÙ I”‚ý©Ì"ýøËPþ.]&b[TšPdɇy×Nú ®®»ìF† KÿP>z]÷÷65ÍžÒ%œe&%1üÕª;Ë)"¸›Öh‚2_V¶à“€ˆT$ÇÓÅdáÉ!½+öçP®òMá€FP̋ܥiÒ8 WœV¼OmŽ0a®_¤â õ«D¢Ïª‡"9²ÓÈùå7©lÖNi)/&;[7JÀsùj­Xü5í î—•çÓÍ… …VRíÄ• ”j6åýM†Â‹ßu‡UIó4x —­Â…î6º –ëø1O*6ù3F¬ÅSŽ®²Õ !éuëAf´Ïá§>ÍêÛ+äí3k GL¾‡%Qšö&ypÐt±±–b³p•ÂÓØ1ô]ÔTø=6mÈÖÜHIZ p´¡Ö>7”×ÞK;?å\ ®P0º¹n_I|5 ßéfWºx&ƒ@JœǘÄrȘrQN­Ù¢Ä¤Jí:Éþ…7>1¥ å3d™»+·µ¥ÿ3Ð%4Þ9‹„+'Ê å_Ôótç ÂÜ\þ\®Dn/ï¹uitC·жØ,”í:.¯¹“ª¾ëÊ$v4?NûP§´vߥ]xJ½‰¥Œ˜],qšÕ¸ù«óܳŽ@`ŠËðå•ú>Mû~×­ü´,äGæãŒc W÷œûè~=ýþ¬À?­£ê½4Ym„žTÝry©Ù2Òð¹ƒÏˆßœ^R¢º: ¡l‚j´~âIøÅн‹— @A Ó{Cx §‡K3lÜF{$³aåʲTb:Àoޝ0¨@1P€¥ÉŸŠâ~Œú·[ÀAÑEàÔõàâêåÉ´`R£FîÖ ëRy¤ƒB0zæsbÝOVQ¥ ys!7äݘ:3fÆ·9éJNɶհêaEIä*ˆqöÌ«›ŠŸ­‘ñÑJD'ñ §sD£ºóÀÇfM¦4O±<œ•ÝÙˆrÎ Îy‰r7—x÷„#ŒÙ&ІOê$+B»FâR­M=i4q`=_‰ë¦é€pëÁ9ý»IweþÇ9Äþw~njíϼª“‘ýp}Æ 9˜ï’/¤iA\ZùejoêGÂüOº†-­O¼5‹°S˜Ì•º‘lNȲ(ÅSþ=‰7x©=7§Ö-GJ5¿½µ¹e! Wýƒ)ggVôã•$(%¤0¨­ƒ&è¼û2Ø2«’”iÕ=œ¼¤¦ŸSÎ9´øë†Ú4$ò# ]€‚/{ù—±ôca/(éôG¨8Du®[.Ásxá͆þÙ·®YŒŒÖÛ !-M:Ã(ØSEø2çDk×½ŽÑ%ï&óbCR|e¸ CšØDSîP.ÊUÆE22yÒ¦Ó厃S{÷€Ùª´ê@YÄ@5S·gJ£Þwè-1þ?ù|cÍð×ÙÖ=ëˆÀZñ–»ú©¡-“¡©ò‰<Ì1f´îÁíÃ\µÄ»,’+îCdžnÜÙ!‡ag*"’±Zº'î„ÅUiµ{RNÒqVlˆüœúyjØw&û¶p£ok ÑrB¿×½P\ ˆjD=°Lˆ¬Õ2øWÞs§9Ò+"å6ðÝŒkw]–ý^_19Æ`…Ì|«žZ·¡x-Ê.:Fú#ªÁT@ñ7µÌK¥Ç ¡7ùÏÑ]”Ÿd×êÜ\*áàê{äso\‰9zû‹ì õ–ƒR¸ÜûÖOû^³ËÚ—SôI*›Í5 ’úeô5Šã…DöFÖ¹+¶å[2"ñIÖí(ý îè3–}ÏÒEHÈ…î#] ¶É©é +õHÈpï«êÞN ðèwÞc»'Èè¨Þñ­yѯ<¯®¹ªÕŸÑVýû¿æ8ø¶Ô™VGAÒÜÎW‚‘Äø}ð§”t”bWÜØÅóyt*0X¼J÷6ÕÑ÷ùÞõŒ 5*²ä0Ndo°×¼Yâðº†ÿbr?;›,&àBñRûµýÝÁ.ñ¾MbŒ±&x^ó'Á½¨žoiÈkTvP*Yã§°œæH gÐ3ã"çðïøuù}½¿ÿ]ù}½òÇ/·¾+íí#ÛÝÇíë›öö›ûz­çâÜà¶œ¯ ž÷và ”nˆóìĘ6[¨}¢êTÿƒ»uИ5k…ëبYØŽIIÖq‰Â?d¨¯ lclsÞ‡Ñk*ç-ÿpýÀÖf}ýië¤f¯i<‘Mñó{ã–Sðñ·[>.0ˆèg‡{É“+Í?j Vž-I5ðÑÖrréø‘v,¢P¾òÞ­»Ü—aуBùíê¤\ÁN„á5~¸˜cáa#[UjÕùŠ [ÆN©Òl,…Ê1t½&XT>îÙªšCT0¼C´ÙÕ×®7{f3÷˜ƒµ^X51V&*¿su‰¡:f›¯Ö*èƒå`ë·ü§ps¾#lÒQ¨ CEͧœ'v†]r_ÄdNG|³æÅÔ°“f((Èž6Ó(9_¸Wvž°Òþô!÷A̤jé±³¢Nº>Z˜Ìùë8ùº—pQÑÄ—ÉóëË;Ó„²ÇÑ÷×ðÏ^;±1ßë\aÜÇd©&+Ò²bäbM“¸œš5‘é€wTºutnO]%}%Õ&ŒŽÍ>¦ÌkF{º6AŠËP²[•ûÈqœB jEŠ_= }¯ iÚÆ®|?e‚ÕIþ\:’?—Y‰&űؠ\DOJW LCãIY@jgmu ôLmz‰À…‚fjŸŸ£ëWú}Ú^þ·üžmºëD~«NK;|/ò(nØÅâ~cƒ™¦íg|:\MË»ÕuE;£»ªK‹pSi·g+:UWu@Hœwµ­É1û¡ã^$àHmMÏS¼ç½igcB”âÕc3—Û—ËS89ehÃö}ÑÈýŒ¬½Ò³r=dæm¤›‰w|i` Á_kž®#*tÒøÐ¯ú¦ú²,Ã:Oè<ó<ù5¡ÿhê‡ô†*Ǻz\Aò3 _¤ß/ýAî׸ilãg!™Y "¯Q«GÜÈ¡|“¦—áž9‡³¡U¤Cæƒ+,X‘ÃØc„‹ˆÜô±ÿŠUºþ)µûèÊÈWC5˜²Ûºú  î@õ¢ûK 'H[†¸;M†›‘!?„kh$tk} oòÍÐ{Ág-N"…PoFèêr0pž&±ß9Ú¤{sÅÄn*§ôÆ<\I×ÂÕ„…?÷Ý¢˜ƒ«zyUŸ,†—Ko±j,鬸G ^/Fo¬Ž:½œÓÝAs•‹üÉòÿt Bp8vÂÄéN³™Ð p±­–“‹FúÒãCü²µtåúnkAxØâšN°;`à½bÓ†7ªáG”ND}ÉŸ>C¹vÌuÿVHùö‰Ý•ŠVß¼¹7Þ®øu)3<ÞlmÒ@©×fcˆàÒ͉Æü{¼cíÒ°%µE*°õ’Ä$ç²XÉ“zǦÁÓÈ™MyÃäíhÁm?›Žã±Ørœ Û³—×3ž@bê*™£ýÌ &ã ØÝ@‰—óxA óLÈ÷š` Ä×XÔè¶°©½rh†.‚&ëXú‘‚yôWR¢Ýjù«Ej¤œcÝTýó!Œ%è ›2­" |ô²çh‰އ)[¼X5•Hö÷EìW£oÛ¯®k„_;c?s¤S°Ñú‹ IÛB,–FüU]€#ç€X'ýÝ•ÊÉfzå5œ|æú1ÔË~KM3êžÖ8341ƒìÔœ)øž (ŸÿuíëyOü|Uc?M ò·îEòêæôÔˆÖÒæ•âöäÄ>úå´ÓúVâ1½X$·´<‚é?ü øòá‡,}«’k³» f —²Gh#Сj7;)– ¸ªé#ËöÚèþ$R¿Ù¢´4q“U‰¿å/Ö^Qb¯ÉÙ‚ä?•µí„ìö=§é\~ â¤dºíí0ñ{•ÛO]j‡þ•?®­æHH¨èlÂVÔdÀ-ƒ!Äf‡‘çÆ¸ëMTÑÿ5$­°ÏF 0Û ÷»â }@|,á>\„Gx0Édä뿦 ­¬’Q¢|y÷s;òYç…ƒê:î5Ù<e@1„¤’МâCŠ'Y¼I`ÚôgDB 4¶iêÎÎQßLgPà 0³sØf±Êds›:›j ÀÀGL¢Çâ#å}W ÷égÿ3 4\(T³ < TJ× +ß¹¨bjºFOè%„@j¯­1ý(úµœ.—µU[% d]›¥Þ¶ž»$©ÄZ£îº…T¿¦´Mƒ Ý5¡Ÿ¢~h¶$OžG)¦M¿û*Ùµ27ýëY€Tõs›°MXß©óó÷zëØÔ¦èÀí‰ÎÁÿ1µ‰%w¹S†W“­kx ÷e!ä·Pv³ÚH«cèt3õjÿtÙèÞ@EAÑ™mxz¬€Lào—¿Á¸<†ºHˆr)  2úÄf2V$ÃT£—Ò!j«CÑôÌ7÷>#+·ƒKA¶k§Áî¾×ØnËÜ™ní1 ¦ë¾R#Ê –Bÿ¨@È‹ÃhtÿG—ÈÖ*µÜÿ³í·‘SžîvÓÿi_ÄÓ]!aù}´ô5ìR\ >ÚìUÒ^ê|@¬=°îsx<ÛŸ–òû3 ­š×#ëSçäRg“Z£†q¼ 3\é\´Ÿ5íÆŽ-…“²Þ{°ž|‰MÍ)é©KTÑÚÓb¦ÑûK™¬ ¸ô,™›” ã©s WvØ´ÒÄÎDät€î½GIº×v15w‘§{ùNÙ ã Dú0=5ú(k$³wÝœ˜z`Ô2È6bÖ‡òú¨ô]ÿ_4Êb˜S¿mz~‹î]ºl³abžö2aÄà?Eð·æü§3:Õq<;'Sá]ås®€¡ƒrâÜ0t”q¾©¾û"äPW¨Œ„¯©L ƒ=­3ü,':RCNàá½E·Wtž&-]¾‚ËG³·QÖ:ï±’žÓÈš£ ÎD³+Z¹¢HµÆbNz™=Œ1gkÛÕ†çÜež_ßã«Àñÿ ‘ÚOöž¹¢$ÜŸÕð•H?'~%²&ÍÈnæb-?¥ÓÆ>µ95õG„À5 )¶2wwJA1Øas[rÅ•hÒG#èTì®t I|éæÄĤ'kìƒ<È·|U®êzxçÕ1×\°^$Ãü|—w“|úÿwh%6 ¥DçJåaòª‹„–>íð&ì$A;/Kð{*cÇ]´O”©ÍóèûJ Fy]ž…«Ã;=tãBù$1?ôC^ï]KˆÞé;@{ÒÛcê>œþO{Mi7¦ÏàœŠ-¡ÜüÜ¥ÈRB.'¢ûoš%B?Å_‹½wcƒÒ?¨7Îw3·Í+±RAÑå¼S+/”œ''”6×ÃÕêhªGÉĨž„'DÈMÅèªëƒ`Yß·ÛÒpƒ0g.2Д|®8XßUeÁ놩Å=üÛZìmJÐX-ýÃà÷zeQwø ö:&(WuU}@š­ Ó¨žæNúW=Vyææd+`¸Ö­žù¯Þ?_GVãP®<}Ÿaôÿ+K‘B—†0CI¦³ìlEæÆmÝà åÍ8?@ ¿)m¿Ï| Þ·öüB[]PI`Àæ2ŒÒ%bðÁGØd Dubn"¶Û¢Ñ‡ÇÁf·C¦$ÞTËgämTdÈqUtFJ¿T«H=1ñì¿êªŠ_×±\õ>:@¶kŸÿÿÿEk~Ûå §mXi K† ~e@§q&Üï6”಄†”¹’¢Õ¥¢lw xŠ.”V0ƒt—ÖƒÍÙÆ”ÅLºáÃiÌãôð{‹Ç,'Ý [à|bV_N'rnúÊE¡—h“·%Vt¨ñ}]4—+\8ø#Å«äÁÕ¦ïÃç쬞÷ÌyLHŠBjäè¤s¸ï¢7wµ¥^Æ—Qu$ï¥|lýãú“dÊÈ"ݲ—s©Lö3(È>ù¦Îظ†4ÌÒ…e•†ßŒ¾c›ˆ)P¶5pR51Îã¿ÐY4°ó1Äô˜9ÅKAˆÊð ?ÖSçCÕUÌ{ —¶ýò{ÍF÷ÖCAé7¼S9)‡…[I¦½õNm€ÿÄm¨§¥Y´¡ \%± ‚z7Â1çþê†?ÓyþÃk$>¸‡éUõóòÃ`¿!Î’qHÚAõEÃ/Mè ŠWnÀÞ”Z;M•a#ƒŸøë`\w1´àÕðè•‘eF÷HGˆBž ©ñª„AN}u÷3Û‹F¨ƒkq—ýÊ–™úö<“)©x¤Ú - 6¶ö:XÀnìÉò_*§¶k'©­o(>†Ïx*®Ãa ¢Ø$h`;»®ÎÁþÍŒkV dmà<ÎÞð“ZFy,À¿U‚ߟê>$JkA=Ûájp¸µf·Iµx* {÷)¾y|…™Ñ˜:_Ü M]‰MBÙ7åXhëR4æ¡]2Sx Ý8í𩽨2\ÜÊ_¹d7Óû‡ú‚´C`„tÖuQ¼sð»î©§ötxGÜê^åÍ„ï” ~L¼0|…¹x^ÀSÊP–|1ã#Çû“X])R‹¹3»6ðÁÙj}¼F·ü8(ÙKÌõC.Ôü˜vº»ÝÀ/±Á[àëßþ¹Mo#ÁN±ÇÁÿ;áêÔ|J€â!ó}‘‡W·6uûÌ+ž—Ú¹l|~=5FúNï ,›Ê4­~aD–‡§©ÚÂ^ó0Y©›qþýžJ'Qv†M)¯?j¾QîúÕ²'±‘+å\Ž;Æ4çj‹ÿ“–£KùŠŽ§Ú^ó Ÿ×feôâX¾zƒÜèöë畾7/LDäµnmÝ]ñÑó`"|İ֮ƎÎÔbÖ°äènKiÔz~if×ÌP+¸;©©…$ŸÖh«ÒUZ:û$¾ÅŒ_‡C°aÕýÉ~äéœ,š! À»Š/AÐA†K¥á¿â{pµƒÁ³ˆg/«ë?€®#@¡9£›À+rOÕŠÓ«"…€Ñð½ß sª×îÜ;•n3ӂʪt!ËR¤É¦Hجhƒ ˆ lOú‚¨ü8Ä_Àgþ7x‡„íxS­9OËò±GJÀ°@ÇÌ+øzãz‰*ÅdSd·$÷†&<Å8‘ú}çáZ%‡Ý[\ )Í£ÔZiÊv®‘0épÎáÃ»Ž°¿†%ÁW?"ÈÎØú]ÇHYÉZDÁ¦ »±1 ´=æ,oOÕ²ÅçÕÔsÄ„® ƃÙ}Ðþe @¬ÜJþ ¯ r¢—2àgoËt«¹ƒY½Wº_S¤ôŽJ¬ña{Œ¦”e¨»~ª¦gþ°û=”1oF}+LkP‘^¾žMá­ñ&¶I)S(€J§xÃë$šiK¡G•D*UøØÊvçCÉ€/„8%Jåö L<òc€_".ÑòdFëÙF'5r]j±0 tšàÈçKÒÚ¾ÂqàwÂ4á‚äðŸb ½ˆáÍd+kKvßì,¨Ùºfù~F—ÿA‰ÁúçÀ÷âêç ×ñ p8E:æVB_ ) °—‹KnqÆûi¸Ð3ïx'¾f«hú:uš` –ÙÂãY_°2X(¤é~]¯~•·N¹ßƒx‰ƒ{øÀ­ g¤ÞšÜWг¡û4Ñÿô½v¼ˆÞl£Mðá3¤ÍsaŒ–›¯,ØEoå™ê•’~£cÞ›…(ΖTÕá·vSÌ€%¶°>$Ytþ}žÚÍ}vˆ¸½tÅÞt”,A¬\ÜP¿þ)“ªª©ød˜'È(Õ‰‡/÷‘.Ý$¼~?*‚š`°v}ÓT¥nšHꆈ®íF¢PÊ6ÉÏ y<À RÕ×µsg lÀH'ñ«™Ú\ùµAVnNŸÖT¡àÿH±®Ü|I¤‰‡Žý‡½cS_]}Á1óEÖÄú׿dÒÞ{¨ÐˆÚ;|Ù‚ }ÏÙ×3]ìk«ˆ˜Ê8HTÃöý†4ªèB{ŽLLdjüBÔvè%élº B& Œ*ZÍ‚‚ab ¡§Þzǃ¸‡.ÌÂÍêÕ Ê}7*E®×¨^G«ª…çn»~¶S§lãSÇ2›ïi·ÀÒÛwËÚëXè]„5 (BÒýÁ¿ßv•ó.ӌѲGÚF( ÆšFªà©„†äŸSï—8]áõÜòÞ€… ö ³éeF7êág]\àfwœ-è[×ÊM¤Z«/ѵTžÉÕ‚\øJ£Å¸1Î+×döbÛ0Cº§‹oñ™+Õ”.å\aà¦j³¨ú}{¦/ÅjÕ–-€˜Ñ5xÃ/Ô­iÝd„…ìàïÑÑ5è¶@–öS&ÑtJlŸÏ92ëkÀb$‰—9(èì.&AU7Ȉä×S¸9hÖïmô px¬êN:1 ¨ÇLY8¦Œü§¶EÄì.ˆ#žºæPé•V¼^µ]âóu¦òQRÀÔò„- D¼!B_eÓÏqpl­Ea5*ÊÌ`NÝM­ÆªS&XMY»AQ%q.OÛCûzSË W]°ìr­'­ëÀ¿À @_YÊõZ=ÍùQƒÎ#%Ÿ¹SÔE†=l•¤- Šo \°èbmQÍP¢Í‹}­çÿW èégJ{úeCïöÙ)Ÿ¶ãóó…ŒK%A—ÆâxkxïgÒ6‚M\ÔËiü ·¨™7t}ä1ýŒ.„,î@{ãnA©Wv÷šç‰¾Ç¯Ðu`6¢ˆÈrFW ž“fj"HD<Ù2KªŽ5OTÏr wü"à-ê2éŠèÙÃ|EšŒÈMÍðñE[2ÆB –èvPc/HÇbªhÞT$fÿ©¼É)ʬˆñÕO¢¹¡°¡ò0oH*'Ÿ1V’¼ ç¹¢„ãä2ˆÍ™&©ë.ñ øÊÒûΟJç˜Ö”áïä²I‰ eæýÑ÷"*œÈ-ËÝW]S-%,øpõªöÄ›TEñhÃXʇgz~Â2á³qÎÚh1)ûpÚ§9¡›eëq“òÅ}7NÉ㣇5‡ØwðPÃ>„ir…‘Åæ×KÖÆ¼ú$íôÄ4J3ü9 Ýî§`Ô äMÆ=G÷|DÊÄ€ö÷Å= í*pýÄ·0ù†â2æ¹YT·ŸRS\j‚UK|>­%ZçA~LàæµT~¤»ò߬Õeê¿G1ÿ1:p}oV‘çƒ!f²6ØÜ/èƒmLÛ‡ZÙ^ØÍ²š‰Ê™ÒŠH‚_ÃÛ4É5É2zI~;MØX…ÇAzp¼‰{U sgÊúÂâUʯÆ\éliµ6gâ·¡Rt­ú³ŠÓIEé@ò¾¾¬§Š×^Z“Wv%êrÍxe° çâzkD|d替›"WÔ‚³H»ýê¢êaƒ7—ì}Å{5sIdL8u 6`.†‰ÏìA8E1o¤0' Z¡­Z{×1´™Iš£=x“,¹ÓòÞ0]›mô½½«mQz1lÿN3vñ°(–Û…ûVבFÊ[Î6Å»›+ClÁrŸÖ8ý¶¯föËßçaâÏÖ¾?@rRŠÓó›õ__î‹¥1óà¯ø³ÁT¼t]¢.*W©0^¸PíBfH¦Ö¢õ-+â“’"›cÐÐ{+u.ã¦üÀìæãTàU07lÍ9ìàËþä¯I*–ߨAL5Ë z£Î:ÏåääÓj=0‰,5¸R‡(Êß¹'N£§œHWŦ¼%cÝ€ÖT Z#@àÔz·ê[("®)º±yã|‹Vð`@T·úqOù®®rïç“÷S¼$ƒ_™9Æë¿K÷&Ê5FûM¤T[DFÛÔlú¡´É:\ªAÎáuJÛ[¨Dáò) ‡â—ÃWÄmä¤ÎúçëÚUÚqÄËoŽ3mý PÕÉqml}y%ŽòH9ý¯Æ¿ÉaßR½ç@¨àдih‘Ù«çYzc¡´Èô»sìP=öùü =h;u˜ˆŸ]æù©rðKÖÀ‡Cê×Õ_´©Ø«~Ò Ëæ2”¡\IS±6Íþ}£ös{G`®èYëóÚ®`cÊM*ú£'ãW nBnÕäòD+!“®VNVô,Yq8_i$–”«Ýßà?Hdón' ²‰ˆÍ«ûTæ{ _“»sµþ†H) Å7­¨2¥-ùQà ?]©k<!±‚D."u£údEv1ºJð½ ¯—3M6AIÝXÀhþG\¶H%wÁ+àÑ(@GØá%†ä3ú`»ÎR°`Ãþ»ôÇë…°¡êÙ4‡H€Ã±<úÚyyö‘±³OÏëÉ+yªŒ5Yß_ù¿G8üãíâçoèû²Õ'²„£ý‰÷õIGÓÕ€`°0ÏÁ }³$-%ÔËcNzuË6ÙŒƒJ.î“Zè8k.óéteyÀ£…r>&uÔ V1„|°²1§;RºAëeG4T”ŠXy»]ç¡5GúûÈ*žºÖÒ¿ÇN¸_ºÖa4a’Kˆ6˜Ã¯”¸¹`¶ÈjMÓ¸Îý³u°d?R ×÷Ðxê€:¯= kìD’þ‰B¦Ò(óé9‚Öœì –¤+ü £Â2þ²ãG£Âp§@T‡áêéqƒfÍïY‘²yÐa½™â\']h;Çø×Þ#S]È?®‹`I©ÃÑÛᾂ»U!ú#9€úµ¡(…œ@x6=Ü ˆ‚Ê?Ü>¿Z^/!«EÔxÖ l÷øÌæi=°´¢áW_†!×!¯ Þ·oV7z¦NÍÌŸŠŸßñ©’n½ŒG-.½AZAòðÁ6S OÍ,Ñð\—–rRßK<··°'˜h" PK¦øËíV%3G¬¤ ÌàýŠÇI'þ ³+¡h²;ÀJŒg'òÏžÆ? žódŽºúäN=†Y&ʽ&hIQ†9ð;~ºÒw}O“sO±ÐöåÝ;q…‰¼}´Á3¤`ÿYuõzdLµ8æ;¿ë›3º¢È£¿#A{ÖIŠ2=cF Qí‚Ø·ózWþå•©˜PúÍVᤘ[Ñ" ¬G¶yÔÒ̱Šàªìár é]+xð‹ï@*¢1ž•XÄä1’Ú0qÑãÎïþO#-`Ú|®IÔÕ®“+ÙD=ýˆ9¼ØälR…¾cÄ]š¼žA*œgõ]ºsþÚ^¸çÜòãÊÐ;nï ×SuE‘]A4zµb¶¥ó¸‚SÇ¡.õ!®>ôÇ0Ú&¤Q»½Ê«qt²¬L™¸|ÝÎDWIšðs”;ÔFSTMÎc¾¨l²¾ô½oå+—ÍXü29vª„,Ǿ@º¤­Ãdˆ×oë«2ýí©Ú0t×¡ÝæÕÅâ“Ê)ûMÚJObà•3üñmê:ݜ׺ÆWÆ|= /LŽ¥…ù´ Þ&YX'\£/"×ó †D>KE‘;ÖNN“b€­N[´m€€åööü:>¾Þ»?‡H8ý½þÞŽobß·§ ?o^·¡OÛÕßíèlîaøÂ¯eÇ?;v:qÔŠŒUdJš­ÄŸË\kƒŸ8B n¥5óQõ¼ª‚#XR‘»þò©«±”ð£ÔÊ- p¦{]D&E5ICMu è픹ÖåµK»˜"Ózþîº-—……öÆÈýîцDÎ>úé/ž×ÌJŒM×DUØK±$O-;–àiõBÓx]Ì Œçµ ·á2F±„îÕ¸tžONC'àv-ØñLÊåþ%# Yo=Ö©ùÀìºTóø`õ¿¶d"×£½<»¿¬µ½@£#AyÿGÉ{U89¦œšÍ•Kã®tm¸¯Ö›§…ÿ?%Q—˜OÕú`øøF€nŽû&# N3„À†oôA^eõý[’Ï8>œÒ˜ÛV.¸c)3 ŒºŒÒ7,Åö°K¤ÊØŽº­¬O´°¯_êØi¡½¶„rï°¢7Fö³’<¥ûJºM&y¢ˆØ‰ÃzÅ®%ñ Öƒ’‰ŠðŒ‘²5ÑG¯pr…{÷2¢ý½¡6…ÅžVäÎË[»-Õ‚™n{êü÷X4n¸¤%Dì‘¢É׸ãµ{íÚM° òÝ, !»R›lÝ>QV¡ÕÈ¿äâ­õ fˆœíƒý¶ÖòExÁFó…\ûÿÛ~B\0ÞW§Q<ílîP‘kƒªn½ "áxmÈAÕ à1…Û¬ï¿Sì#›R<t'ÀVªæQïå82ÃêUñ!]ðÛ*‡ûóŸJi…3;Lý–(uç>ãÀüè«w²H¬]¸iÂìc&ÝßÛôø:Úc$~õkMàbP²d#ÍjØŒb桵âÅÄŸzׯßJ•ÆHHünç‚X ½{Íf‰DȦfRH6<´™X6»‰ðÕ‹…rO´u ]ílÅêf&ÜúSÕ>RYçJì[ßÏÿKð;Z=@©A[)^a`– ÆþÅ¥¶ /Ê1;ô±þYwä"ýÕ.ÅÑ{â+ ñEyèeq =I6ºSçëSoÞNl;ù–y²Ô Oˆý]è5¢3ÃêüÑ~L²†‚îÖ!ŽôÙ¹ªw/°U‹û«˜íܪÈ,+Mªj`n4ƒÏ(sëM ¨W§ƒGÊ^lÕ‡ÎЄ¹-Ÿ„³CEÀØV•§T3J±7N§OÌŸ;Âà@sŽó†wMCäÖ‘_4ÓQùðu®žk]åèMê9Ž$96ÆkKX¶ù3£èò-ík!W†éRᔑsE¬nì`K3À (BHiHrT‚ܘZXóˆx6.3?°Å Ú*k,Ñ‚RŽTË\ÚëæU6%‚ïÇ S*(1¸(c¬‘8¬ú­o³‡ï ¥!auW@%¨ù®ã3xEh·¦ íßÕîifk=ø)ëaP•Íâ›çf›É™@©/{²‰°ÍO|›Ë3úŽÓ µÆ~«*Œ•õÂGÙ¯‚ùÓÅZ¤B%õë&˜œ4ZíŒöºhgA•ù±#™…×€gЦ!Ñþ¡…Bwtr:D½g2›(r²-ýþ;qлVfØ´BT–.YÅÄ(]`]Bi—Ÿ?º=œå£¨ûݼŒ£9³°p3*©.x}¼‚Hs‚ÇU‹¦Ú¶a¾PEh´u®,Ô›¦ƒØhúÞç7~ÚÐi ÅpèE4ƒrÕ¤‡žÖ¢X†_å½ç1˜,XýŸp‚ä›U³ç­(¢8û†ö à'V³&‚Z –!CG–XøÅ¤F¶Gõä›6'Ö8°â}Ø™Òïö²¥•9†j*wœU}îàFjÙðmèÂ>ÁýŒèä{T.;ov2$û’´EüŸü íDà‹k_ÉdÄE`TÖ¯ÛOWxã«Öþ+ÙÁh¢¿Âª¾û‰Õ°ñ%(±Þ_5MiöÉéσÊ4t-v¸År(b¾•ØKãð ñHfy¢ÂÆ“ÁaŸ%N¾¦Z›“~8Œôʼnùä„ïþýÄ+—Ð`=\¤¬BùÆ=±"¬°™cì󉽈,~‘FÆ#-póÒmAóHl’w½Øùßl<8õÒàn–´yüÚ_µ´‰u(š–R$‘7Ò² ŒÆ³“ƒ €Ò¹G—6L0oŸuØ“‹&g»ÁV½w{EÇd„ØPx³ìº;= ÇÀ`Út'ï\;ѱíh ¸}xo• #Ð×{ep9Sjähá[qÊþ¹ÔºP_’p;&D’Bßèç©•30`Òl6#xþ!'冾ƒ^„”æëøƒ0ÚƒÙTñàg³mPî¿QÝÂMx@„aÓ<‡”ØŽ—0ÔJ]‡þ75kð¦è·¬²hÊJ„ðb~<ß6glá@½\-A¯jà÷®£ŽŸ}×=€8á´Bœ^sh+Z#ÆöõtÍ~v'º™P~HÛÍã¿øª-èû¡ ◾əï;š¹ø»!e4zâ.l¥H6€‘`­?}-…1 `òÒyÞjà;¼!Ï>;­G/Ø6=‹>×þ–³,g-ocêaô_ŒÅ߃5`D?úAtÚÕf¤ÿyêǃª¨WMC4ªëɧCïsâ²'Y$€7ÙÙpû0  ÊøSœŠZÖIk$ì\ašÑàNˆCŸÃp@Ñ{ä?~:{_Ï¿ð’vDʸyžbߢұ¢Â8ˆµ=-Q¸=E@1èœmùaš^B)K±×ËöÇŒB•oÕlbƒ1ç­8¾U+“#·Y̹リ„¥Ã¾:J[ç9»3–W~Ø’õ”_¬ÊÁ¤Eè„–ù~p;vº÷%ÿpó‹§S±á½›vBc1Ô-ÞHÈN%s¶“&3U£7֌シ §„tiÙóá{;_ýTÀ‰­rÈ5€ÂH†ŸF‹eB=pÇG”ÂÍ¿%hÈUqIî˜r"n Ã0ÍãzŽ7©—›»ÁÇlD›5×d á#ëN™ÔuÉ!’àÆÂîín÷ÌÑ»ó×¼O½œøXfAÀ‡# ÜUƒÈ‚¿Tyð´ÖåÇ5X]ðçôg7ÊÚ ®—?*½ ½LîÞ!³AØß— T,ýS(¢óÉí:ñs³Õ¤ÃÄ;!¬µ|3¼è)–%¸, ÿ/¨søÅš¸y:ÆÇ@™ ¬Öµâ—ÖèZ*”ÌÎçâ>S®n½6áYq£^kï˜ZÔrU)Á &8_û)L_˜ðÐC"ðLT8”ri„jTH'}¼8«ûÚd–0‹þ€Tùù$ù]ÎpHtƒhCðàÍ¥à~á¦rð›M¹bVzP×8éZyã KÄ‚íÏm+w¯ õ˜”™µôJ•ÆÑ9öÅeRHíw örd¨‚ÕnX£ÃIÇ.Wcê…jí¼½‚ &µNsÔüGž5™¥ðcÊ̈üÏ7.`†jEð8Ÿ"‰ú»£ÿ;Óp âRÙ<ˆÄ@K?Ôžwâ­u¾u  ƒÖ9‚Ó¾ˆ¹ÐëN‘<2_ ³`]qcÒ­âÝ'LÛ$‹\A§«£”ñÄmÎë¦ü¢‰Ÿ!Zm-X,Ü` ôPõõÍf %i‚”ÁzÔ°%*g™±a9‡®^µÐ¶æÐ}Üd¯»Äû„n±qQ­÷@ú=¬$²ÂWO(˜:Eð)AôcT¶ùnïðÊ9Ò­äù"óÙñ]›ìwý¹j}ˆ,8¢©  5C€©É£³’g!†(>\:4ÂóYë|÷sâI1û»·L[²Ûá×ø8 âô>Yd‘O«g3Ô«‘qr¿ó^Lú™¯¦•Œ®iÒã'ï¬0&¢½¹Zž-b鈈`À1t÷ŒêžN¥ÈU§YRzeÉÜÿvþ~›7]áqh/X¹ßÉÔÚx íSô£˜ÑÔÑxì¾ð·u©1¸m2©*MC™u OwËÖðŦӘ÷7î#>ù=~lGf@Ó® 3[«Ê•D¯¿É*Ÿø*ÜÄ»¼L¦ËË訠¹¥"ÐłÔ—&(bwA62--Ýîíô 7ë›8ƒL½mAtÜ¥MÞ‡©´èV3ƒ‘Éï–]åCɽm>3;[hçѲ]º6Ô‹¾a†\dï×ïHQU„c´ãè*]«-˜iêÝÁKLÇ`@¶áXéßN!e¾X:þ– 5OiAc‚S\“ÝÜ÷ç|³défâCjIL£@©Œè|áç±6‡kÙO²ça²…zÛºA±)΄e>ñ¢_h³¹ŸnÒŸ>™b¾èY7íú>‰¸0cdדמ +ƒ‰èsã÷=áÃ|Ï-çõ}k ‚g¯ëôjÝ‹TïÊø¹Œ³ÊÝÀ=?Ðoí_Ý-3AÌE,ú2&sðËà44q 7¾”`ŠQg¯S~,Š"ÄŽcÀ…ÿH»‰c(Yú6—R Ù!=ŸÌ·³8šÞ^¯¹‰, Ze¥n)º zëUtŽc<2Ü! –YèÕÖ¾núÓ‚¯Ž-j/Y§z#5J-€° °Û¢,–àdÄU¤Ë­9pÜdUÝ]¿÷r-+Hý§He#a}h½¦Ÿ>8ž y’Þq=BÜ~ɵFЬ·<¡qp¤:| ÎR2˜Aᜩˆ)äJÉ×Qª €à5þÅh|C_ÌGšªo™y WL—Êæß15Þ3–çeË YzÁšÏy…FŽÔã¢W{È`ů«æìúî®K(g¼‡…½,8(1£vôÏJU½ñà:(C¹\i!¹fž }º¿âó÷Ð*:Àέ´œqÁ`†[Ð-ôH–ß96b’’ƒ‹Þ‰”Å—’(D¦8æ…ƒC®èŽ` -W+ciÌ9^˜ô½÷@ƒVíDù“ @ÂøTZLÈ#ʽô,vt­”NÇŸ)ï¸ä¦bO‘Ùp›¤Šî«¡Rhßl4þà êCàf¬¡ÙÇ:ð¤ JËQá‡Q6M Ë~ídì“zËV»ËßüfDûq[të:qjF§NíjΦÿj[ÚšæžÖ'œ 0Z?Q&߆·=‡Ï,L"ÚU>¾þ'(nØ:5ÖüêzË,¼Ô²¶¹È k½?x‹¼Î5›Öd Zk<•Î&5*B톥T8%dhÑ`R“Øð½œ wlQR ‹ÇÍ=½#Íÿ.P½tãÇA¥Pg6”5¬ÿiÙd¶fökÖ‘Ñ#q¢nl[º¢íg3Ӽϔ“¨þ§¬]Éwl¬Gbܯ$Ûá“c"î­>øÂ/&›œxj¬Ö¾GÂkÑýzK•ƒ±…î & ‡@Ãâ‘NsÅ@°“våß%mxœ°Ð‰3 ?Ŭ«ý@©N¾ Äòµ%sûÝDxð**Í„}ôÞ8Cè){x‰‚kuÜzo#׋s¡wò4Æy%Uª¢©3cöh±B_™‡€W¼~^ihõ–#(Øy`“ÀF|kû!š¬Ç¯7ÆÝÄs¤¨÷ël¨žPP/­ ÐE¾H1˵£~§œz†Œmõl²àãT’·xlÙ<áÆ-*õu؉ŽiJDÉñ¤¼ˆž¨ëHµ3aó¹Õyvëúß.lŒ¨‡È¨ iÒÇ«ÑÃ,°Æq¥XP]Öüúås•A&µ\¡,<…}<ѧwWªñ&œ EøÕعJ§ò¹ÕEÁhŠ/Ç`ϵ$_'3)A ܤtõÇ dÇýÓ© ¸Õ½ëö³#âö骰Æõ•xdä}_Öîÿb1¼øA-ÏB!¸u Ìál®êdš)ãYìÜß¼57ŠMŒÿ{»õ])})*ì=–œÍ¬øsì°¹Û'¡ ö»bøð¥o òw” Žàù™n¯EüÚÅfÁ¹9*A„NîIJv£âÚŒo´ùž^(9ÙØÑ\2—]R}Â24êêá䌷3’y; Ý¨"øvX‘J6±ßYÈNI©œ¨DË—îÎ3£«,Õ®OäÏsæLJ‰Ë››$á´ƒËÀÈ äg ³"ìkX4WlVºË=¨°/ôÃã±$Ö»2ôØA’!~Ø…À-õ¯Õ=°Ã£%ü;Ô¼ÿ]|ã§ŽEçÚtãvØ3%Ö9%ß-_&zæ”öòVȧÇÅo[ÿs§]êÄÞOØ:ÆFq÷Ç-L1é4p¼˜—и¤Ù©E”MdÎ’HdE‡Ûä}GóXƒ³÷‹Ø]J£¶Z#>¹Jr}-ýCwŒruÈ-òôVñ/€Óm©Ý›—œCäàÿTHžK ku×›L2Û{ù ÑOZ…çd«'/MÖ5vˆÜÎsšN@aƒ.9+øÒË.[«“w>¸úó#÷÷ᢸa8$8©8ü¾® ñ¸¥ÇÿG›ª1üÆâ»úv-ìú+GKâIŠÖ§"‚Î"ó&âÄBêè*ÁsÖÕ9†ÊŒ’‹d?ú©˜^Fÿ]ç2–´ ®ôâ×K[D£üwœ4Tªû4¿3Д9U_9s-Tzh•1Å€”«ìtP2§¡Xâ{š7XJÈ7¦¹ýý 0EE­9%É–v Š [¥˜žøÁ‹|™BÃ9»Žqœ¬?ÝdŒ‘‘iå² 5G —°yHÚ&àâŸ5tMÜ–°žcªN©áð1AF?ŠÌ" «¥ßhÜLûûû0ƒ2ÍÉGpZXåŠ{áfwÔ¤@£˜\qÛ.G‡“Ò“Ô–ð=v݆ÅùŽ[Q†ÔÙ¢yaÛÊé^Õ5äP$HkMª’´¥Æ}aÕÇg„> ŸG„ðªbÓOÉÌ´Ä¢I.+¯@þ†"d7œ4¿`xW¿"N)—|Æg§=«KS6íL„„¤-óÁ񠯿²¶À¶›¤tóóà?¸ü ³r &¿‚-ÞÓ§n‘Íhjºy›ä™¸ÚFòÉ,šÅ6ØÌ`Üüß}/}ŽbÈ \Ýe à¨Ís8K ~3‰¡c½ç›x™kéÒØ­¥;«…äa¶ë?ŽõU¨ð–Æ5ŸÒ2D¨4Áå‹+®òeÒAñª¼2‡+õ ×ŸG¶þ§dÞ´Œ\lè;j¿x¶®¢Ë?FA@%Ül’‹XÄåz‘ÉfÀâT4a{çñí`÷ÂëÀ}×›SRL\#"ljAXö™BTïýû…Rìè§÷yú½elBK˜hwP•u<éå ]KÃfqâ®ãrÿlñ›-Ö×…ÿ ïSDÔT¹±àÁU — ¹H Av4ÿv…­™‚ß@×ô!ÊÀö1™@ô8± \¥¢,µ+œ?™0ÛÏÔß‘Ÿ­rÅQtZꥎ0•hìˆQÞ¦¦¦gûŒQÆ—ýØB¹1ç«|øCXcå¥öVhÓ(—í³–ÆvUÞ§ßÞwVj»ínTz~–Y¦îÎcê£#èµçO^„þßß÷Êጼ!¤r xß-.nb ¾ã¸øè Ç–Yý¨Žºv >qDÁ85jÝõ‚Õ@žt[.¢ïU5‘{éÄ‚òG±wϼâ YêÍnʺ€$"©ò8§ú!MˆÒA-5ÔÕ¤¬«bHwÐÅH@¸ÖÙÂÓ{¡Uß1 Ñ 'Ô«pç…ÇJpq½r`bÉçÎA•ï" ò¦ÏÇB’žúRöÖC%-÷ígJQÏ®“úH±§½lTµ F8ï­2æ;1¿ðDØÞGá”kJòs´ãH±ï1ÃqBJv¡Õ$JÊęͱÀ¿ÏÊ7ó¤¾ÔBÕv6Ña= pÕÌoäèïâ[êL6ÇX¨j÷0?^^’gÆ'O]ÒÞá %=^9"™§¶Së¸ï “Д÷êÖIÖ§™~ýWL„4¤F+kšT§­rçbB9¡?0ÞÇ’äš×—$ã´ùO8rýñ”¤=/kÑ÷¨\_÷ãÓÈ64”±@ÿz½Vº|œ¤xW ¾Å÷íOÍìˆ/é‰ðÚVº¤¾ ,&–ûfóšÇ"áÒ‚[ñsR_ƒ*W™ñâ’$cX¤÷æ®ôT(-6 aC¬î!~$åŽpP*Ð|òÌÚÃ˃¬€giPÞÌgâÔ’L´q"}y×™rŽvÒ$»<™@ƒ¦NpmzóJ…ÑälìsîKE‘ºæô)vŒÓrg“a~o™êÁWþq啞òçÒÅŽ˜Û#ßÙnsÜwû³Ï…•T¤ˆEÕÈñÇŠňê¼ÜÂÄ©<%Lg% µÃÏߦEŒNyR`µwËaoÉÍÃ&äB®E¢¶¸ Ùœ3«Ø"‡R€âº?ÓЗMs¥‘§¶ÏÃæFàW}•.Þ[]òßÊ—ÛcmÌþº\°‰£·ë‹ÍŽ{Hñg¥“ñÏo‚¶£öqÜ7#y¢›™ÚÍi<ƒa±À9 SÈRA¬èô^.˜'[È›ókJÑb2S”ŽSƒ€»)¶0,iexÿfíçZRô¨¡ò‰ ÐË‚êxx„÷8 /Zw€OS¿Ï4xl [ ÁPK<Û› `©çE™É/;¶R‡|¾d(R] -àVtNmëMІú˜d>X•ü‘Ðþ7“ä•îyßÖ¸IÂþ¶j[Uo±!ê‹k'Ò“F‡S›–¶kð±?XÔ\²p»Œ:³ Aç¿ æ9šQ€¨åÃwræ¾Aû|‰¨2oÉd)ؘùa¹Þ ÃÆ³–üÜFf Í|vCúGQÚfUfl„^ÒŠJ\ˆ*‹Øs€±U¨‚›ó®6ú‚¦hÎ’›s‚‡¿hÝ üõÃñ1ZÃ2ä@j®Y4íìÿb”5¹âael&(ýã8÷oÅìù¨^0à+}¬ÛÀÓð³ËIçÀüÑqb-¨ÏŒM%%,ܦ–ŸZ°LEû‚ÑÇâlîm%ù {+0㊠™è}cêO½1W¿@æB!zÏ »¬p ßŒ7ÅàŽ§{ÝëKÓ,Mö~Z™t}Ö¿dT btœ›"س¸W‹œº8«øOÉÅJqòÃbÁ^nüúy>Ìm™sVvŸ¢…A¦ÿT®Ó·%Úßî,\M R)è¾>d4Òj·æ@—‹ºît/I¿"—2^ ˆõ௿ÐNT-±MlOõQé¡T’Ÿkk>ÕiÆ€´>·Õ!}Ø~J«§ä8Z¢*|°4õó"×›û¬)š¸'Gå5@ç*=‘È;c˜mK ]µ.k:K¶]"Ô÷( 1ãx7¥Ã*%ü½V’÷< ÿÙic09# jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ "’ÿ“ÏÃC@+ÝÌ¥? ån«F‘t H"$ Ô̬M6ZŒA¨x=gOï{Í ÖÀëQm~ư[)ñZÈ#…"_ÄÆûÚü…nj:Rcm2pàÁ³C6 ÆíÑÜM÷^ɯãæQfMº×hãs˜(7‰I÷ãó¿µ&ï$ÁeÖ§§fzºë?ÔôÙm Zæ^/¿± dÏãÌ `x’7bû÷ûzŸâûmñ QmÄj… ³s)Áº«Uaû… &Å<z¬9ô`7ôÖ|¬û¥ËÆz« j|,!¶>¶À8ÿÇr‹|é<( ÏC•”¨m<7xè=½3_¶<.ØÖ ¬KÎé¹Ìê e´¼‘Ÿqºn€€ÏÃE€Þ”;2©'|ªþ"ÈfÅ-v¾áGÁ³P±žÐ5ܨr$Iï ŠÕKí†T •Ú(¡ûý!R_ì•ÓO­ªûã(”»›£<ö*ZE·¹*½`ÝÜÎ ÎçoòZŸ ˜þ³ ´£“k@¨=ezò ?ƒ\¯¦#kð”Ãà2SFá ã €Ó!ýHÓ9,™ÑÉ„Êr\Ùæ¨ÌÙPÅÚâëWvjõ‚¬ÛßjÆ+1½Õyè¾¥?Ç–¾ÃéÊZr5ø Rš¶õ’Š5Egÿ5‰3ˆÚ9!¸ZFrx­Ýwg_NhI–A¾ú©i´¢+P´ä}¨d§[L:„\7b»² >1ijœ3æ`«ÏÎàŸûÔ.̧þ¾|ÞÆüä,å;Ô÷rhÉéØ\°OÏß cåL÷>‚Þë{«µÑÎzöËoS^J q‹®uV“ƒŸ¶WàˆïãàhŒóm™6o‰¡byÖ¬*Œ¹öx«D½ú‡u Êݨ„Dqý#2ÃçF]Q%¥c…ÊÐNzŽIé¿1Ö:%õs¸}¡ëq2’°ë c®!šßòg+ú¹”D´*Æq3ʦî´ÖæKÜæùšã•]Œ>ï'?×±¡áÈì•'iÇZDÅG\~®!8_¨s-È>ÑD–=c¸¨Ž›ü¾¤_ymZ@†{C\þÒɯxòé¥=ÃQë1£IV=G«¹ó<ÿE —MÎtd×U@h_£Ëæ [ëXÃp4ƒÄ†Rr»µó0ö]ìÈ·Ó/zÇ“yïâE¬wÿ$¼wñú2iæ`ß,ãϪÀTÓºô‚Э$¤Õl;¹…Å3ÔN¢¾T;Æñ!ÑaàÅÁR³¬©–¼¢që\:¨ ZÓ“|¯û!2mLäïg…(²í|jÛwl{Üco–Ù˜@"cÙ/ÌÔc©Y!_{ò"]ä ƒáàN¾FpÐ'§ëT&—Óf‡ ƒV{4²ˆ·( ¾˜ÎøÍ”¬îmÝwDý¢"ÀýQ/5^‚~E#*>½¹?gžíVþ‹€U\Õ“¤4îääT”EÿH^Ø‚5ó%ö˜xæ<'ÇeQ—ýbñ1´XçÅ—ÂìïL…Ø©”ºà¢kï_*‘L™ˆ”ÎéªsáïÑQËÎE¬.XÉøA/ayR€€ÏÎåŸÝÔ‹µ]LÙ×?©þ½ ’£Ö¸`ŠÌ‡LGL Vçµ:  §5NS õž çªLDÀwS!©]*á¯ää_¥À¢+ñÔ"Ó9–?}÷‡^\¾ Î0S“y<àãçê^Z²<­~èûI‰xµQ–Çj¦>‡ÝºrM˜_1DÁ.êZâcKgå2ëøa‚qÞé3§ 'çÿkŒ}R=F°X¸òÒ+d| [h$Ø"X£¥%7%[U[1Zs_… ör7g'æÂ¨Ø+èWþöáñOøXYb?ÊkDð¡pƳŒßín‚bÅÒ;CS$¶¡+ƒYdVfDáìáiŸÝò²%bXžéüý(;ºE–Ñš)"èwe¦é Y)ææƒŠ3Þl»>º O0ÙS+ÜÏÑö08­’UÐ$žeŸ„B‰ïvÑÚ« øº'#77u–Zc­Q¡Â¶ì-3Y"bÔ˜ØXÌ®~Ÿ#Ðv³P Ö×xà}%@¬ªÆajn‚ÆÃýUë7ºØè’lÑ-l`s°UÜS혞ÐáïsÂAÆœ˜&dGzC©{3«6gñæ/ŠøÉâ —ŽéÝûÝð À=Pç2·f+í»`Á“… l?n‚ÑÈÞHKéΊ١ ¿cºuøzÒ5øE'Ž šj+J®‡·©²Qý.Œ»fñ¬KÊ’—¯ùòƒŠƒ†oòàÀˆÂ·©Ñ¯I»æ8û¼á,‘'!Þõž\7µQFùÇÖ5œfM'ŽéUŠ„ªH#Òç¬&báýõ¿’§w÷¡&9B…â¸Î{UFIø=¸>ñĸ%­õýŠÐôö²žÎïD–—5¨où§úÜÜAéõ׫5N-;»j¶ÂÃ$ÅlOïÏdA$¥T¨ßµ.'+ò3Ê[Í oÛñ‘áÃË—Îb[Ñ¢:ñÚÏϧ‰ùõ¿ŸRůÔ0Ç3(ÅÁ!U&œAª˜®4“mËwˆÛ¡NC: Me½sª0cÒÀßSlFD›Lƒû¨wc‘¨çÒñ›l“ˆ¤€¯î’ý1O"8èv£™.—‰ä‚‰6s—Ëz-D;m#©O‰Óqve— ›Q 6ƒØnsgÉù{„ÙïÉV{ ûµk GoÕ«iˆ$áÇL¹ÿ.¤ó ¦¶m-×O©Sá$*{¯‘vUåE”Èvúà÷ðúÕî½=} +Štð‚E.íuiÔß#Û=Øj8[%ƒî 靖õL×ZÜ?ƒâÀf[™’ »Š¤òìZUÂô– Ì5C|²¹Ï°éÞ×Ñ”ÈñúP-öÜî§_HÂgy &ïb•™IGN  ù«^çÈÁWÌY{ Àì.Y`ðí³‚KÛ"´½%¨ã‰>÷ý†º±Aù€JÚpìbVMŠ-~e½¹w ãañ ´f"ÚI¹î+&ý9â›Ú5#©[!Wµo†ÔˆQHýèäÓ EŸà~0\É`n\tf»§f›Þ‹²BŽ^ 3 ’f¬XïüÓ)X$|àë”k ðüÖÚ¼a+ŠY©vKÌíö5„ŸÌ¡É_$7ùóN®´dX>Æ.s8ôKbêêU¿vö(ܱú ß `6 ËJµ«®Û¶•4¤9¬Ð3dó,¯ ƒ^‚C`Ű”+®ñù© °Ý‰õgê‚ñD›i.["±_Éd8Èã&ÅØ\¼¦k»9çN޵п¹5Cg[A ¤º~“M ¤Àâ:dáÿ];)YÇÓ¼vø®Z•>¯ d~ #r³¹Þsf­Æð¬ÃÞy¾z<à5]aiâ XJË)úÌd8|l™QúéEÑ•Ò< UWŠÔÿ)]`dh§ÑE<ý¤X'`sC¥žŽ·ÿE°÷?»;÷%/õƺQ.kè‰(³`_0ò ”´4ôÂÆÏ&wxî°,},Ñc¼.óóË6#nÐï#ZÂm¹f"SgË >I'懥d$ÁÞ¦ Ĺ &A¨xc”ÛÅÓsþ‰ýŠä'ÙÙô‡ØoÕ4¦NÔ[•Z¤ëÓÒؤ8T•°$ä€:ÚtjˆÈùãÀìÈtëÌ…%N܈–%.µl:g–‚=NÑ¿ºî0c¡lÄ ì!償;çÐPvô‹Ìfàñß+e_hòEnô~inoFËçãâ^ðŒ˜Â³̧þ]ùÛžl‚-ô×X'X Üã;làé¤÷AWimÄ [ÎNÛÄ‹i£µ2Æ3x8Ÿ"¦ÊE¬Uª§n?iø¨ºµ½ž¹Œ?O­€…hè–€ÄלÌ ‘.es”Ƙý?JžiŸèÿ…y4Ðz#ìCŽ¡‡…v¸µ 6“frMœZb­Jí¿ÿ2ÚmsÄPæ#C‡Ñáæ,ZV„1~¯Œ ¸3B ñCÚñ’(ÓÓê®õ=€U%„³gï‘` µãB£ýmIUó¦lÄïh'ßõýZ~AG€ÆµX¹ÏlAê£+nF8C²~C®Œ`¨›e“`A‹Ùô7n¿œm•Ä” ÍÑ @W‹ˆÉjÂÃûî%ø:z*Ú;gŸÅÏκ|Æ\OçK0§Í«˜7§OÛöI¿ù ÷]Í#ÞY4ž`D-•Ò³a˸ò˜cÖ)0>Ÿ›öœÜà§’¹ûlu„woàÞ>òkSƒŸÅ#ÏF ÛšÖnô͈åpÅ*Ú¹ªWÈŽàšg}_Ÿó“ÑÎ kGdÇç'^_Űf‘`g¬2w-µp`Åàøýª™–f=‹OwŽâí¡7xã0¯kÖz ¨gÆ7;)i=¯¢•˜ãÙËçN«ÏÀ!iók¼·EkoÉ”­gDCØóH,¾ÇŸ²Þ}9®2I‚SEIª FÙdÂù&Í\gˆÁØ9Å*åWHïáD%B«€€ÏÏ¥øü:kϦÌO ® Žd€ð´*\‰dËnÛ\š×æ'¯Óe@m™ƒç¨rè—^îxë…p9œ»£û®£a l¼ýɲÂtƒíð`¼_ß&FÊàBÀÕ×ÙµÚð¼½ dy7OàçI&’qç‹ñýag¾¤mÉ6‹kxÒ©Î Rû£â «,¾Ñû@Ò2ŽTYø™·æ ƒyµ¬X*öÃqÏqwwf¼:÷ðùy3PÎ_Á ÆQÀ¹Y6E««·o¥}ëÚ¢ï¤QP’ff$ô;‡’²AL©b§Á ¼: Ò­®²dbD¡»p·°I*ÜWýIe$¦ X½ ªœQ”F©lßÊþýʘa‘uŽƒUEÂ8¤æuæ%" ºj.šoª ðž6Þkjf0¤V2D­É¹Ó“®­xÞ`éT´ÿP‚ÁD¥ü¸©ÃíŠSj74¦ §Õ»ŸiVÙé÷=½Ï"|ñ3£×«J²&Üç÷ìÆ•Öîª/Ô(¦|È?ë Ó=KÙJ<Ø×Ï‚l²ÆIêžSS7°ú«ž˜6jp¥ §PŒ6(0È3˜‡l¿a9=ïu,ö>P"3Pœ³!/Õšµ®/Gl5Gרm­X<•š5»4ˆ N>{ƒp8ñïÿ=øCoÍ1oÞæzn¸×¨ûËgD:RIgÔ‰r5󃃪*ºåœIs;yY$¿öÜÙLY=I­)$@Hk/Hyû»„¶ü³¬¤š½v­¬`~ÛÁ\UöL„5Ó½¤Åå–ý(„Ù¹»0ÁÌéŸÕ#iþ)À9ßÅ‘ZI®O[ö8ÐN¯b–G!ãHJ®JTD6³:šoÎÿ%QÌ=(àšÓ±ñHœs^ù9ùUï6È ÂRû^€.-¯®À?Q6߬ï.‘±Œ(À•ÝéœÏÞCÙ¯Öp•Á9—M¸5q8À'Õ¥ì&-Óœ€ŠÎ,¡ZçÀ¤ÒÈGðRHéCŽ"z¦í¢~Т¯¯ì&õk…^ÈP¿\XÞâ?GÛÐWfÐáYNM‰¼FJi°î‹“ɼkÈÊÞ¼Ï=þÁæ< OG¸Æ ý×xÇ•HöÞÛ!S?¸  „l &Çãh$½[©x³ˆ¨üWÉŒéÇĸ!…|Ì,|Þ ‡AP‡&^2S6W¿X#ד,¨ƒY[êdúJ[–$ÆãϽ1*î…¯ SL®Š4.oé9Muã⨟eÈ8Õ=#ÝÄ5:¨íçØ}c»]›¤¡µCÀ×NÊR ¥øiýÐ}¤ÂÏPÑZ4tKœ½lx\Õ5Wr©x ÅEh¦„ì£myKØ¿dI›Ab5 8²WRMm\sÓYïoÈ3fRA,,頶Ƽw€ü²B[–J1°vËŸTx—štµT æí£)‚^‰Ûbc¡Ó?*¿Q±ÅÈõjõOp7¶Ê2Ç#x¿8Cj6ó¿ÁcƃE'+y§}þa55Tþá‚ÎÅ3<»Ê.æ’.Ìš­¶Éâ£ßym€áè-$ˆ/±i<£Rg(áÇœ3¡KJíÈÚª`÷içižËܼ À¬3OJ(/*¼aûý[žþ~âlíäÍ£,²0=ºŸ÷ u€,À;FÓ@š×%U'TmwÒ‚à évôñ !Çð£mô¡³SðÄ68ßйäÉâ7—>±õã‚©)W[Šh£žª<Òz(Fbä,ms„8¥ e`Nuf¼/ð&1պܓ˜f/IA¬ärè²ì)þÄôŠbŽ6£ýfÅä¿]èkË”úÇŒ Ìž™U œˆ!;x²(·ûÿa~‡³ÕìÈDùò´ 0]‡"k,æ`…®oó0v™úÂÓø! Î\ÑH›Ä¯£bÏ‚)Ò9žÚx®è$býtR ˆªœÓ;œî¥Î̬8ã® ™Óôé™;¼.nž˜Ç-ÊÂ1@ׄ³ÇÁ­;Ë(Y˜²ª¨ÕDq}éšÂÂ8)?Ü“f:–ž}÷´ÝêêåR«ß0uÆ…QySMj+#ûv^Õãí×äb~«Xkg½<·»KtÁTdf6<Ó+Mb|]1*~–Ã%p£’¿vPR¤#æï4Ká?Ö,'•\_MÞÌâGA–³ e\O€©×ã”q¨1°Çeþ+qUJ¬˜ê>¦iwQùýx @  ’Á®–’w°JÑÛé^Øë…SöߟR+Þ³Ÿ© ]û«ú«60_8¥È3¸?„1¥a-ÏÏØB~~ÙQùûêsFÛ%SãɯÏbµ‹âŒ)åŽ[ý<ÒŒ§ ®ýÄË€YG¿±êËo.ÒùÝ9žiD} v¶$fì·M¹òHµÆX‡}ñÚBüv¬ÆÜÎ(8µß¿b=¨–òª{s¿¥;iý#t½ Ní(z=ñý4Q¨¢2_b”Õ `ðo÷çRÐÕû "•¹éRGÍj$ÞîIZñZ.sCWjSR \['}ûFÖ÷’+èýk¢êÛògÿqÍÏ‹Xø@5*YõÖòˆ®¢CÆÇÙÓM-R¨×xˆµÏônÍÞâèrFÁ²/ÚûEˆ£KKjP¶ u˜Už÷n´‰oË¿g^Û3‘ Ì™>jÔøðL>MžSt¿¶ÚÃ6Û‰·oÉÏšÞ[ùDRu•MUŠò@{îîZÂ¥ Ì.)ˆa* `ÑòGý¢à9˜šD#çw+†ê/ ~e iðų¹#~maÐS”A"ZÛÕ[Ê ŠÜî^ÇlK/ìêœ$h",Y¾­ÜéìK~1¨VºÇ,=‘: ¾Íl\âB—pð/V0?éWÞºB‰k€‹Æ †g¶þ5–þà4xâ–9òP¹ê/8*ŨIè‡ÀŽBvIU“ý_—ú@â#™ ¿‰M¢ô9n £æ;mðÅÐ@×XÎûþÉX]•Ô`ø±—¬ä7JÐíì-6§xmY %Å{°6Cªà±zËÙÖÉ×~ûq²¾=ð$¼å(³ö¶Øô.äÕþtîí|­Ô,¼õ€=um·¬ Ù¨~)n<+â¨ù+8m¡Éi[/x,œ¹~vÅõ¿SfÓÆ^ŒN·q#Äh^š«h±¥ ¿4¡¡³DY¾¿mK4þ&ST¶Ñhv]¢~–ÓkUšÔ]£¤QÛo†8Ø‹àe z~T}«‹"ân1ÏŠÌÑ'š‘Y7Åd¶jc›B˜ß¶ Xé9mc’hVÕìmÊ_ ‡óîyÝ‘¸6ä÷§ ¹×ª’$Úþ2Í´44\Þªy*礨Á ¡Í}O¸îÝub‹ïßg-š±Ä$ÑI¸¤–T”÷-cø_,°ü¡¨Üw??hØÝv˜ z‹B(;RÄlXC1ÎJÊÕÜÎôµRÙ P“I²´Ò¹G舠üR37âÆ ‹Âxq— ú*¿(g ®îl]MeÞL„p*N#–•ÈalqO¯NЄbÏÊ’û¹Z,’~æ¼+G08»ß`ª±@<æ¼è¯a4³Ê‡ùºÕÁ®¦ Ÿq/˜ev×ú[bÖŽœLn -îûul•HSË# ðmP? Ü”ÁadËôÁŸ+†)eø/ÖVRhÂSàŠ¢pÔ´Ïâ™È¦ÙÛm)­3•¶!6!hHÊwK³¾W¢A³ÁLßÌ;ô 12`Dg³#sÛþF¯á<:Šû.1ùƒ[n¹¡85~®ÀµëÔïä¾@Ùd“‡®BqwëÑ,ìì »~³•G̋䂦•¿Û„±B`ÚåÍÉñMqvÚ“þ˜-d±;¼ãDû©9Ø14ôAÜ…Y_‡õW_‹y8o ÁuZîæ!üNòåŒÏ1)Y ë¿X˜“qZ Ù<ÞeKùÍ>û–ÍõTÁ¼©ÿ Ÿj§pÉJ²6ŲøfÉÐzû,_;…°ÏIâˆ^‚Ûäà´n€&RƒøFôéâ¤`y I#JЛÈ;+ŠÍ¬WDŒ?K,SI6fÍQ¹«nËêÅ8D 'ÊEÒ(jbPÔÈ—ê›b)|jÄ%Þ-]Îá—ͳ ÒéÇÅ5aÆ5‚S`Næ|Þ)í®Ï$ñjqyÔîMœ¦«QC×ùïÇÕ.äÑ‹ÁíQË®ÝÓ!å×°¨È2׃)_]óß2Ú³ü:Q ¾PkoÆ1süd½w‹ë%éœ\ÉÎ\vG‘Í),DúÓ,(íàüî€,8 Õ´]ç}0 ÄK)È⊑½ß™ú/_ "êé4{^ó¯²×x×åžZA;IzTqÄÎŒ·¦½TPÂ-Amtx J?EKL&ºƒ!ÿÿGß@:˜ÔÖ£ÒVIg-gê6Æüb®å§Éq•Í8I'yà 5hT“,‚¹–MÒMZzåDZ‹Ç²Ûò›ŠŸ)åÌšt¹Ë?»ÍÊÙa„y‘6™"eØp~[‚˜ô^Ý›ãA¾òzdÝž ñšÝºÈ­˜I8ß’ä`ü&4h&YøÖ¬=ä8‚Dêþ<»QÎ78þôó¡e‡*‚‹–u:xš FqSS&BÖ6Å2wnÚAMïù?”àJ½ßHEü±Ø‹º«m³õØóskÃá2$’m[¯êžÓ/êÉ¿?7¢Éýä#mk4"=žPÈ‚|t°/;˜ÿ\êÔ9r^ÒnÌxývÕfq¸»ê¢» ¡"ðÿ´4¬™”xÚ§Í`½LÕ?öË ÊNË\¯Ü!ÌÇ Å”nà©R[JÁƒ`)Ì0Ùv½Þ,àô¦†vjÑñr"’/£Q½/ï¡A+ÈòÏ‚¸8üZ ®°ÊÙðwâåq4R“K±D.ݰz.@VÓKAì-2¾³#Ñ=M±<ßwùq‘qõ2ûGHS Ú`¦oÓŸ!«p™›žŽa€gËCîwž¡DÝ>Yy棟]Z1 u'ô€þÂgô£§bõ0@-à)»³aIj~w„Í]]¿>U8|"$gWk‹!³E*<´ç÷hÙhލL‘W‘—ž†¤©9b‚s„÷Ad9l)/fÚµ§m¡›SI/]HW ç°ý.C”™F¼ U€Þ€0 ÆÞè}¯_w7ÎP¹d®áë$‰Hñå|°q(N6aÏ=oz02ô»mŸ$M]õòz  ;ù)g€Ž" E^ZôAí‹Z¦m¦ün{µþʻՃ×áÓ´`QÂ<¦, Rìò}.%m|K§k明L/ÇNò/‚ Oé½`¤ÒŒ­ìt u'C@pÄ’'õ2#[ÁA¡zq-õ5óÿ3üI^,ßp¯,²$Çcö˜Ý×ÞD63?[j¡«rɾ ”ͳ6Pæ.…Ù n'®ÊoÌ µSª…æôÖr·K|’ÒW’‰øU›}á€ÂŠüsbrËUÃ3áÂ(á —ˆ®`!˜*°ªby`BY.û떠Å ‡a¨(PíßjóZ –†"„ˆ€×ïèl«ér­e <-WÓ¶š¤<Õ„Ó b·.' ͦ7×Àìñ0ÖËí}“fsY¡e‡­2 –oð~]6užèïô;¢HJ,Õ”öl5ZpJ,?¢=Ë' ]z²%£69æâ[DÓß6e0\S ŸúáS÷0üæzÏ”vXUµ¦‰ìÏk‹hÒ§Ø´åë—ŸFˆ{éû?âÂ:ÎÁúÚ(òE“ý8¯b|ÃTf¦[ÅJÀïõ[=¾ó—¬8žEÜõ…Ë›È›Ž¥˜]74[füu:Û™ð¢K¯Ä™é.ÑÉíHwb¬Ã ¬èËæï1ÄzÞ÷vöY¥¢Ó´ábvÂi!7ݨÝûK(½áI¹ÊkDÌÎsŸ<7× xî±a/¯ ^Þ—Coá {Û“³ù„™˜ŒtÌrFŽû7&Å¥U ¸ŠU<_p™ÐF8L~PµGÜQn£(ºÏÁ­1è£4ý » ø"©í¡&'Ÿ­èÄ/ú©žJ·ô]‚Fß)q!žÜÑÿNÝz…I}<…°ôùÇŒŽ«|;rTô鯠m´Ôê‡ïÖ’+ -bl>ðUDõWÁãDµaÖ1  .Ž“hA9¦1*êö ½"tÚQ±tziÛq3h1~çf!)òV¥ÈÐÊÒèø%£ëƹs,€´sCÑ÷”UËŠ"p½!“±:ULªu/â…&ÂìUq$ˆBçùwþWä|­??蘤û -œV‹òöòXâÛö¶ ¼h,kÂÐ#ø¢Ö# *eó¯Þe¡fû[9ˆ¨ßRh$„ÏOú  ˜eá/¿]‚Ýùá} Ú[õ’먴0„”¾“4yÕ×t§üé½Yzÿ VËNE¤F±obÆ&²Ž¬Bl*b›Eïý3ZPØ$9*ÓÚ•aAoõ<)³[EKư¿¹ŽÞÔÿ4³ýhóü’²OÆQn;qGkOxn“»g>¾@ +MÕôf»úkÈ7W ”ùMƒ†Ú¬òRÔ)Ýo̘Š+ã{дš©3šß‡Õmÿ>Èv}A©SFÇB*X9Qâ¸Î"ô/é¾+^ÌGb*Žù(ņhӓص80ÃßcÄ~%WUc²›)5Ka2 i©hÅ“OÁãþ7•3H·’d€Ñ<±Ÿ¡ïõ^¹à¼íQ‰†Ze:-GïRò`hDÍêg(6äY!y·vÙùÁAýðÈiKYåDçÂ`À7ÐÀ—BU_Ò¾qAø·Ùªý9œ¹—Ò§Úsˆ°nGc¦à¿k†¤¢«@Ù³Û¼Ùî´ŽìÏÊc_Ÿ®µÐ°I}öû¨¾ÜµExÑò †2tš8K¯Ú›Uôx™¸'sMŒ€>ºO? ’sxj[rîLèL©æ›02fÒðoëÍâ¤\íl;ŠzÉ8Ú=ŠâOê€ÏvÖbˆ8»+ôŒºÃ ö¬A< ‹8¯ÐÀìú Z}_~:x­¯²¼rX³ŸˆÜ¡ γ9q9“.†[ÌŽFînFÖ à–ü"‹Y å¦ÃžÑ åáB›NÍž n鸷9n $2R‚¥|ú!!gáõdŒi¹æ}ŒòØÍaô¾"eeϮ뉭P¥rî×7$Ð8¿‰f¹†Ø[ƒja»M:ÈÇžˆr³Xbì$Ë1i†Ýu·Xö †Ýd»üâØaá1î?Í!.zêOr¢bŸÚ;,ÏF±±©ÔbªëZc^5Ê1)´¿ª—°§,ØYþCοÌEâJÀyÅ(Üq+QO#rN6é´Õ¶³`³¥`èíË3#úx®˜.pÑ«)¦6žk±qñßmPrZhì:ŸERˆ¢E=4 /F"Iß3PdôºŸäØ.¬7´ä¹   r¡*ªUˈŒðç´¥²ßõ8zêSÕ`†‘$cæà?Õ¹gŽÿ°­È@N yšæ<).ÝæKØ3YŸ‘µ“7«—ýtX‚ /Û6‘‚€ÐŠDPñ%‰Ób¡!bž€Ÿw“y};<1Æ$YÃ`y!b`â¿lM´N†öv<³T|í A”Φh$ÓEÓðRjŠ?0æ~hàM N¤Œ§üŠÌyŽá±C~ÉR%Œ·H?|æADu¤þçÈVº2©@PѬ•V[9æÌVáÌ)ˉ˜§Cð§P¾Tœ[T³{têÌí÷‡æ­ÿ-Y§¬£™£ÝøÍ%è@?/£¸õÌåêÅ÷÷ÿ0KƒMK³·é»p/äØOý¬ÿT‘üHîÃ쪒Ê@·ˆœK›ÿ†WBp×½à‹IÜUƒu• -±KÜSˆçÃFîΉ €@Åû“gˆ{~× ê¼ÚFŒ»Æ|Õ¾E\T‰€r¯2Þ`gÖví=§ñ6u_ˆ‘3å–iOøšÄÒ®ZúdðØ,¸DD—°<œ2¬w+K$`ºÛL=$-)ðTÈ&hÔÎþµŸþ±8”*©I•dû¢ÿaÞBñ¤37ð䃕s£b~Þ|\pÕo¶_§Ä,Rö?{…¥ð–Û¯ -Y„áãÝ8>5‡p.Õ’(ÙtD‹Ç¨Æf’÷'¶úç胵"œœöuŽ ù·\?5`¶âËé~š4ÝæËŒ¬s„ô‡ÙÛAÒ°IãBÖù áϯ‰5?Ö¨‚Ûywã-ÍÁ6“Ü0ï-|jŸàG\/~ßqÔ჆«vƒjã9RöÆ¡iÇÂf´¿T¨Â¿ÐjðI@/•¡cá>_ ÑlúÁñÃOkgðƒoÅyâoÔ2ìhHÎù{GzË®Äɧõ˜ÞQ¥á[€»Öá»õ§Þ¶Òþ0¨¢uæi 1p~Å\Œ=,?'H·Â¾Æ;"Í3Q“ZP&@vÁf$ŽQÙ¤ÍÚAÆâ—vG8T./èBçUóIVù¶ûÎ71€¿tz¥Élôn½YÚ–)eùµW‘vl˜LƱ¶¯}gßÔ·ýŠwíбkÝ‚tT ÔK—Å{†(«úŸ, ƒxç–² Zw{Ó­g’Ë€ÛI™Ê&²ì„è¯?‘m ÉR–Ø439l®W;7~ªW¦ªb¡¦žXûÐl$q÷7Å|“ç-i(óœãÉ^¶Ñ²´ÜNi­(¹«_fº`c ñítNذˆ\AI_.E×ÐîXãËlä­ÉR> ð 0§ñÆ­h›¨‰IÄÑåÿ;×¶²uŽÅ°®#É¥`Fúöp¨ƒb˜ÂqÍ~ÁínÚ*ZOŽXw–‚”=Rœ ƒdüE¿±­ WV½†· ÷àú5Ê&-y ÔëY6)@e¿„ѵ" 2~Ö‡f :«ò[pdX,(ßR´—î6­ý·ÖWSK‰~$qñjsŽûú„QzúEÃ*A ™“KïLZ/ÉKÓj‘¸Ó¨;n?¯ø(dãïq8î8Ñß3B›?ô Õ¿ô|¬d¼–5€"\ºÅª‘ÕJ ¶¹RÕÞ0>g,JDø³{¤«7ÿF TÐææ’Ó$à ú+’³ÕÁhõ\g”Û:B¦*rË2d7Éð²ÝµþÂKS«ÁýDô£Ë(%}×mmñþ`ø¼è3¨DC¢|·ÈRc2«7Hãé’¥Æ5}W‡N­ÀJëÏF–Ù¼L|»ceE5Úö¸Å`bMÂ: É’=‰ó†ˆŸ…•ÔØ2iÜ@°e3šøí“(i ¡5?i£§Á8yGx–­ËwQÀ,’àÍæúʰCeìÞ|ðŽ DDÎî}d»–ÉÒJ=9ßÁå6Õ²Ø'!UЖö†6HÂÀÏí^«ÁLÛNÈL€u ñä'i ~«W‡“‘ÞËð±”t[øiO&upáÝ™XƒÍ–EÔ0>àå’ßô)-ŠÅíbZ§S«Åƒ;ô)ÚuRÇó0lÚÁ!UH ‹NZÄÐ.sN®EfäæÀåmG5tcäü>¦ KšG±¹yZ–ð~®¤|Ú2’·²¥çêTdA/ßh¯‘Ýâ5•›æ:í]M =P»§!ŽZ“xþv†¼~L@`÷¯Þõ\@¾—3Øó9"«ÜÀô}ÈÇKâ€?(¯t¹¨–—“¯¯dgûÕÖ^ÚFb­ˆ©„Ê C MMk˜N6õѾÿì:äSF¶?jnB€-ÿ,Â<@ˆqT|ŸóKœÌß·‘Tâ4ÌgZµî¦ 0$‰ÿªÛ¬ðzÿbÖƒ€®F¯÷rïZ;k;ɈÜ:Á¦ön²C£y”õóÕÅdA"I>S1CI\°y‚°&DABÿ-0¿f´C2€v@ø½£“~*Œ¡Êy&Œ^ÁO^ùBT4½ÈÁ§M*"uÐ¥ÃWkýÔ{¼œ¬â ³ŠÖŒÅ«rÏ>, ‰c]%Ókp=Éuœ°(¤Ýßì±ÕÂ|mÃÎ×6¬9 "«¢W ºÇ/˜ôtD{È× C¦5ef÷}éUŽ&˜dÉ?ãV êj(Â?…e~®çv¤™õ¹ È수3Õ¢2÷âw8ÃGd Ž“çª&9æ±erfÏuÆîm5ãûc‹^D;§êc^RP—kA¬S N²êF뉅ÔÎuÒ]ä›Gáóu½zô|ßöti5äáþc)EÈbâõÕ¢\^ŸCµç0 “ÿz›áu«ü±×»%¿ÓŠ_vZätèÁ‡ã8Ó`c ×ô~]¾ßÔ (Š^å·éªú b*`™w9ðúzZ‡…Àé:òò¾:2²·E=Q^ZŸ+R}83+¢Ï³P›a ÜdUÉêÂÓêÞ‰²jãluÒâÅe,á®~·º0®°æ“+$(+_ÔXôÔüÊ;"ô—?5w8±;ñ–ƒi Æ õ/Hj¢BFju¹XʬH Â9y#œCU0þÎ}’€nÇsnôèt.eú¿´™;Í„œ_/tfòè,ä^h;AFkÄ®ÇrNÌ:¸úöv çŸ-Ï ÛO˜»Ú»„ÑDüøì ‘„òÚ¾ì6zËšÚ²[u§õ¹7I«Ê ¬‹_ÇñÎó-‘Í6xÖ‚O`½W°ö™™ô½¨ô„yæWðcRÙâ"ju˱k<%êÎ:h$ ÒÖ—$5Ç•°9Ìã_mb+Dv×ZˆhN ØAwp¬J•^ N¯ì9Þþ¨R1 >æ\jM§[3Wp*;ºu¨= ’Ƹb¹q]§c^ÀYRôYšÛ³ÕVØ$éÓe šT ä¡Þ$E{Ýö·y…,¼¦ß+åxð5Šö/rõzÑÞ…㫤çx&Ó‚S÷oü hR+€­ô¬B ž&WÊ©»¢Ñu™­QÒ+ß¶MJýz¡ó >µ êzeÊÛ×¾€˜Rþ¨±?•i¼ØyöçNô×li©]ןa¶`O5´XŽCóëE¶FÉÝå`¤lï[/smø’Ͳ­'½ŽŠs¼6“8¯>¢'ëÜá`½Å}î§–Ù<~.Ø‹™  ÀÅê®7#"/*wÉ6÷x²ä°ä_ù²¦V1ž¨V]Šqv{Ök»’\p£˜¿™Wjb‚\9[YRUš Pl¡¯˜êl¼TŸ dåAƒ¢Ý·Ç¼Þ½Û´¨je´}&x(Õ’à–IgqÎL¡”k{³‰í;E#a)˜YbbÊG‹4·fi:¶úÑmpÿ/ùûÍDÇz­ù8 ¦ôrc¤s$qãdl@ÆÚ=[Cka9CcQ¸t/6³áêÎ…ð]á™ ¨JƒãOãøw­ü; þѾqü=‡i_ÃÐ#øv»áßðì_øw-ü:êÕ‹‘dF¸ÕÒ!º}Çä9ãécïøjSd/­fj†q¤Ê¨­_醽gžÎîÛBˆ_wQÎûæ¯@To«¾s ]ŠPWW>mÉ SÌê°Æ2#°ÂÿTÒgÙìô l}àþ²¢¶À QÖ¾0ÉÏC^³[þư·Äß bØ<ø§r­FOF%ÃÜôùTͲ;¯Å`mö=)ÿ”EifðæÇz}ZåKQ›Hxš3®©Pc¾å•)“É µø „™« zº`s{”®§6€ÁžnHÞS²Hž±úp¢¯ñ·m±FËŒ‚ûst÷w†]Ç*¾P Ÿg§x‚½Ô<–÷µšœ+Bf@VJŠ‘¡¢¾Â¿ N&~5ff¼Å‹FFSÀ5áyBiqñ½?xv¾ŒEÇøõœ¿˜DÑkÀCY¯;jÚe^ŸÐx¦šzQ³3â¼®§.ˆ³çFYV95ܱ‚¥´+«¤«ÏcÃ?(Y3Å.$\’W<¾ߤsÆX3Œ{«Ñ€[°pÿ€Ø£9à99A“.·`‘•NÑeÍk6mõ;( =QSÞ“V‡ò<¾›¸+Š\Íä7> ‰G¥u‡Î"a o¾½&XH½x·°ó=O8ÚÁÉj^Š|4½F»©¶¨ã 'xPýætE,\Òê]+7†óªƒò›e»ÒP¨ÝlS»69äðp8zÿsÒ—[ %> =«Ž“*ŠM1 ×¹ËôVXhÿ»f@«!½"LÅ«t­h+<ê¥è8Æéê\Þtä1\ô¤K@,‘GÔÀo\É“è¯_ãDätxE»û×oº±™ÙØÚ"Ïji‘=YÓ^㺤¾z2æå¤.©"ö:}.„‡k[‹ºK¤B’óë/)ðEb­3\5 Ãò„PÑÞfƒòÑ+\áx5l¸ ï¨$ì“zå_’ûæs¼ùuTˆeyK¯J-´ò#óøÁÛ=öÄ⢄;‚öw‰Ï‚Ýæ¾z³K^ÐAW>žzÞ5Â$+ƒ•œÆx5h­€GÿØ•þ.¶Ó§öøn1Ê­Ì/——x×cPb¶d¹¬¼£¹„fäÎÆü§È À—ôŠÆá&Ô¡4Ö.vZB%ðµÜÞô,Y7ÕÓV,I*Â¥B³a¸k¡5:K›¡ƒ­´Òl$Î}Š-mÃz?Z|}¤¢1,ï|VOcAYƃbäWã÷åhøÔâÎkB:—W½âÍ0ìÆ¾"uÛÄ/(Í3`3ÉvÔ[=Ûù+Îï/žÁ€…–ãƒÐߘ7Ïá9æòÔçVÛeäxŸiErÉÃ:-“µ1ª+xyLFÖé&ètñ¾]”£Ì5ÐGÞ #®#IÁ—ûCm ÍÓÞ³\Þ^b¬„îÿ2h† h[â‘3ÖšQÍŸJsh1 “*š3Ð!ž—»^ïÈ®éBª"º’œfï©d±;øç˜¦Ý0á.Ïr«é|Ú¾Ö¤a·$CÃqðÛl8½h/E[™™#þêy6Íqwêœáו¢cmXÌmë¹ëT¼´x`óöÿsHÄÇO^î2x>ZŽ+uîG˵Jãv¼£Lj5¾Á"g¹*Bðu9ÍD*ä´ªiNþ\XuN„}Å"Ä2ùjÒ_]·ß9ª%2  5 ’½V–Maa·Èn“ƒÃHPu\rÕ—.wèü›§Öˆ«fJO·9¹²'(¡¡ó¦¶ ïé"Œš{Ë€ç§ó³Z›žñÙ ò¥33ÖÒYÏ#UÓD&ía²‰ôζ«°õ\w—Ò6P½||¶hØd °áOш¡÷â§@m.×4Ûöô;_ÓɆàâ¶)ãƒ6{ Ÿøn‹ÿ K_ÿYrCµ”¸sžC—¹â?Ÿdàuv_Ç-›ÀÞ;ůÕS]v¦½RØ=Zl}RÀÇS¦,»eºýËטV¹VÁ8‚lžn¹”äè¾Ê™º‚<î{ð‡ñÂöLåÞ‹Ìiaê[©(sÊ0– ›A¦"ÅZ04Zç·¶7)åYdz¿õ—¾*(|/¿ÿÁWȽA(h2¶ÏÖ_(Ò£œ¦ºµfœ¾ž7v,ŽâšÁ]3 ‹ü/¶/+ÒS#Oëp1':öS+¦ÒÙÃöÊý0ÖWÙ°øð67¢J\…µ‰iƈšÄnVºF¢ªøÇ}Ӡ´L›Ÿ™™Fu\­‘Di[éx‡ÕˆÂ]°&Ç¥ «G =&|GS’JÄfüÀfëK¨-Â÷%#Ä Õ8c`å‡>déÏã{“Pcy­Då΢=»ù6»Å:ž°®î`˜ÎD&váýîôplÛ’º ·Ðáí¯D Ò‹|(ùþxG™Gçæ£7µÖ<ÄÊ1ÀîÆÎÚ»âÂÎTɆêxNuÀZ/oœ>‡9ñä™Ê¦TŒÇ'.™dÖ^žý½t™?À£T¥Í=—RìMÀFgÈ-j˜´±£Ô'è]V¿éœÐ5­Û?ªê”œ )»K„¯ ®{]è*Qß«œÐb›Äu„â .¾1BEjn»v9[÷Á0ô“ö*û…¿‡·"9v´—Þºá².nl%<ÀR¨zÖ6ºaêI¡ê ¶Ú#¿?ç \ÓøüM¬JsN d³«Å£hþþª¾LéIð «²zÊv0*ßü/™WnJ@½aøçÑÂIƒ¨hÂ|&Ò¿Ëø>ú!ñ¼3ØU €h êìO­‰4™2*›àoîËY)é; ¹gFrûrLÑæï`'Ãრ’ð܉ä\øûž¡9ÇSÒª]kx(¾]Ë4 †¡5d’Õ‰–áNÇg #l6QïùÌ/‚2}½ôÄëëW±¢vúu÷|0¿f '1´lPƒõ‚r=Õ¾l âDØ~5P&t ®Ù&iø•ÜPÀYö Zh¨`²‡Âç=Ý·´×¨øŽ¡¡âæ8*ŵ—¹ÖoµC2ôUôÐs#(ÞK½¶UGÌOÂýR¤á:38Cìý±ñž}ÌbIwjp§AԆ왅ÜcyˆÅ D²a4 ð8§ÉÚÒÒËL=õK|R1díâ4~ É’È\PSÍÿjYýð÷aŠ?j¹+ò;f6S;3q¾3¼F<޲ÖèmŒf,ÛÛ²PtcJS6¨ ÇQ`7ÎÛVs8µcà`›ŸŒWF»ü ‡1æåÜN½æNïÞŽØ£}”c+xMŸ·)Ë«:‘Qnëj4J!4^`›7nLC©R û¡PXlñµ‡J+ªü†Ýá ½sb¡'Gˆ]ÞÇ¿›ª ¤0'°è,<Ë ³^«º~yL7£¶E ®©o’Rö ðJH¦=ô-¥^¢à3—ª\]žp¯®æÎÛ>Ú¨ìû° ÎŽÎD'öeÖög«a1«sà,þÂkï`kBpº%û8Í52‘N ¸IÿiEÁ±nx)Žw_Èg‰ÂÜpøéᬫž5c,‚U{Ÿ\ eá™Ðu;Ø1’fç~ADûz8Q­…¶,ã&ÃåÞ¤Éi¹>]ÝU€¤P©È’h!í ÊC–yÉ噇ºpm<—gK¤Ü®–憗Az/dâxól ñSÒàëÒLZÞöyþÖM„ÀÒb¸ £l—fW¸Hk@#ÇðÏ qw,B‡cz“yï¼ñ'夿A˜êí9$“ Ã;b¸™ê6ñÕе u´i½^Õhƒvëñyæ8Êñ0‘¨˜znPö4Žœ©?spfyÉÓP=§õˆ~6ðõqKTè"¾ ö‘ðQ üýC œG’8Þb°®2g‚ëp8ï¨ [½½Išx‹Lq_CàQyõRvb»7Ñú|íöÛûb¸dc•¤ÎÖš ³ûݪ§}qt‹|e"’Æ»mlæoÞ á*4tª2é;MüæБÑ,‹HGUüf8Ã4¶zÜô‰Oò&ék…Ãq'“æÎÙßv͈ƒPѰ›ÌØK A#êcaƒ«´jEa„¨×vj™œ}å§ZäùÛóÄÎ1MEtuߘá”:å Î4™ Dµ)?–p)1ˆ b°ø›g;+EÍÏ¡2ØŸp(½ r#“W½ð{X€ÆŸyFœÖ6ᎄÌýªšÍQi¦ ‹þDß.x… Ñi_ÚÉO«E倹Ðñt*!Sù'‹sBÉW ËÙÑà»AÏ!-¿h…d<\-½ünpýFÞ¤mÿ~”{òe:ÃM»øl]•:ÍK.¨c,@ŒAN²ºE µê=“)ÚÞ’ þ÷@öI<ž2õ-2{¤·ôõœÿVÊ hïQ#ô‡îÔ¿]ùîfsgkr³)DI£Ë5ÇÞ­‚š·ëz¡œ’ôô>Úp¤ô*ŽÐ!QîŸiÀI’÷Üÿ[WU¿¨r(žk ¶Ò^ƒÂãÁT ÌÅMùÒ„ÈÝRF“AŠnö99X vb­•ìóÞ8×…Šâ‡³›¨î?ê‰Ù‹<ÿ,¢ZvŸsäþÖ¢Hrgÿ]FXlóéu|Ñc=Š6¨´.âû"ðxå— [wê]jþÕþfjøË2«A4‚›t©~`£‹Ôéë“}¨s•N_eHýÀ»>‰žäœÒ HÁ¦;÷»lÊŽKDTuþY@µìÉÎ_ î)ÝjþÒ¶]xçˆn”ÙþÐ|$xtgø×3…Ê“Xç~¾ß£•f—Ô6lòÚÉfÞ»Õ.!7ÏÏžÑ^‹§r7½/XFéi–-îJü(fð‘K³»VجEòä\ÕZxvÓ}Å·_PÂùL²5 zÏÒçð$gaÔÁ]OÕ,®m¾wƒ³væ5·i:8Ý¢³BšƒPÎQΓ,ógxîhñÒ³Zˆ_BÊèÎÃÿx$Ô"Æ Þj‡éfÝ6„1êv%_&&h)…"ââaùJ+ÑgµŒ°ð¹à2Mö^zÃ{S¡Ñ‚‰æøã¼s @<û5häÎ@KþÚâHŒù¯‰ÔþdîÙ¥ñ•>oþIG®¬“å—ÿ{â¶4¹×ÆÍcø€Û#®èåCC ht7–Jsó{I/Ð\?軽Ïÿÿÿq ÅüÙ3»‘p¢(sb±°è÷Ä:Éèνuß<É^zþ!ØFû–ï²§7¤“CU„Zy×`*ÿt©À¼æ|PˆïbE?ÎðÝÉÖÁ3È×\‰Ï³Î YJÓNœF<ÕNg)m¥Iº3*ª–%PÿmË Èø#¼éY%ñ¼ïÅ@øÆœþmjÁ 6é=$ñðÓŠRÓcÔ @Ûk kþ%ÿ: GzŸNÍ:±»òô P;½ÓÜÝ’“òµ`;’ÚØJpl¿øšã¸U“·wP¡<é5â½V|x¬èÏ7"ôh|3h"Û¡°é^{5FA«xð»Í`[Á"±v ¬´À{â,E®½äùU¯)x”b,ui«•®D‚ 8±q޽¦ŸkšƒSËdq› -˜ð÷à·Ã¥i‘V4Ä"Â*va@*A¼]HïüKÈ3Æ:ú…£Ä~ Fä"uR «„ƒ<ãQ¥î¾€ Óaç†ü$”ƒÁ¹›œÞ×YÃÏK•^æïк}Ò8'lõÀÕ³£y¦¬b\¼ÖðÝJšfðÀsaæV k9Ž\¥%eMèék”ñE³ôL|E xeŠfn ’VKŸÿh&¿)è n5±0ºFÀ¨ÖqÑ-œë‹‰¿9Á#TÏäöÁ䦵ыh•+¬Ê 4ļ ªx$(%g!³Âú¿¹õ$#QìÓÜØ¡ä?Îr/fÝÁ T€z… ’ôú`2x¬è§ù²—ºªáô˜£ïú U,˜âqÖ‰Nf¶vëM2„å¢/Lj‡9} EÌV…±³ ÙÃWiü>UäxGøžïÈ}HžðA„„•“TKÀ †ˆ»-Í,ÊiÊ`Ÿ UvŽ8ÁT»æšÖ‡Më߬›£ÿf§z?“Vä ¯7_O=™*â~§«_Ä×@=t1_FDÄ9 “žeænYºå½ E•ãèÆÁ, 5×dïi)t ü$IkÆ»é€ËÓþì‚Ú3÷þ5Xµ4AÌ俨ˆKéÕ.¬ÊÅ»¥µºc~6T”òÄËWˆðö¾@HI¢Ÿ·þ8q·l‹qUs5w¹™ØŸüx¨Ñ0Ì#ôïÎl‡P¸–Ûª¥4På°<$!:¹ZqÛE²ê‹BÑô•*7‡OjÞÖ¦ö²>Þ~l’m©ui”“šñGefD ¦S¿ä# ¶üȆï× puŠ;$k¿Ë׈÷ä¨& Ò&T8öä}ô/€S¿E»'´Ib.“Ñ›h‰|$$Ú0 3{ëç<õœ;ȯðœ^™86Ék¥óh|­ 2òGm6æhµz[Á± ªt,–¥¯çA½àékÖ‚MÛO~FŸã»üµ¸ù—â<ÙMó˜‰r5ÊÑ”G›Èœ-n^@ bçç¢ÂZ%ØÜk[ý‚×e¶Kà ‘ æÓHö£ÁÅ È@ˆ¦¼—ëë^[…ZZ5)‘wSµ‘CO ËPÈ0޲(?`¢Úb ¦ÐP:}2î˶?¥â¸ˆD&k Cp› #4·‚>op J&v‘ûìõ Î@‡H¾ìîú v¾qm;§å@ÎlðÄÕÕ˜uRrÿ÷˜Ù(IFnø>kêþR¨ÜóÐñ%(åXXoW‡!öÇÌÌà×A°–KÈzHÉU"ðmù»Z0‹šˆÀ˜òR¿grÓ”@qºö×~ýxbKƒB‰ÓVN¶láâ› IrºpØ]œ`¿l #:²hÏÜT8f”ú£»,BôÓ8o"£1º®šÈ¾ª¢ˆÓŽvÊ—Èž¤Ç!šÜ>0îûE.ß±[¿ÏÊ^ÄÜcÁ`2* ¨öÒš”Ñë}O7Í¿ÛÞ4Þñ'W¸¾¹" \ëôîÓH#ïÇ1ëm‘*d˜èH¢Xÿ"o~nm®Í|ši ¡…óì 0ìù¾» 4«ÀqiýJWVñˆV—;múŒŸ–´Bâ61T‚D;ø½S…Êh‘.d…¸(³ mò:óÜÎÈfoPP.8ÊäÜ1úFš.m9ƒ̣ơ„ÁÉã½ö¶Ì5Æšiýµa.ög§o¡ˆgÃÔ ’ýªÁ5™f5A¦Ëþ‚4¦š×Xd#vKí€é>ª)áÿOOà¥gàõ²ße Ö€Œ—œ’ÄcäÇ&,¬nU ¼Ž8k·FM†ÁY™¶9RߢŒß¶Â*VU¯ ¤ß׺R¬íÝ ¤³€·fÏD%  ]‘|œ}}o bI”‹Ê\t€Ö³†X!ª\ZzlûefBV]©(/Sæ¹bôí®ØsHÜÖ¶æ ~É¡¥QH¬AÃz‚öHÀ[·¼÷LºN„Wöþ°ÕEÿ}ezb©;“Ó?ÀºÏMHkD6I8í`ðF=3´eé‰ÔÚW=Þ÷SCïy-G£†¥°Óâð—ÇËÄ$}3€,ѧ ¾“Ä¢«:d‘”DMÍÜv]*!¶Ô{»Žd ¼€&I²ÕÏÀ‰TMçz?†d§?T|_þ’h٘ۺȑÝ+©ß)ÿr¨'Jƒ1.2ø²@LÁAâ-wÕÆÚFÞÀº:5VnÉë£ Rÿo#Åpâ gô˜¥÷ª#Ò=yCYöÓ½hÕæ8Î!t\ºy„׈´Ÿji‡&(-f |f ªþ,§ÖÞ›@+Å­Rvùbô×S‚°¸ ¹ôíC{8Á÷=™’&Ì^=*“†X äéÿRC,®Dÿ/šÇÿÿ.!eô¦¬½Õh’Oçâ˜ê´Ü?»ìt »ÏŒ«-KVãR¡Ï lwÂ’=ç¼BÏk._e.f[¢_î¾ Â³‰† 3q7@4·|T§Îw×.W‚ªI$’I$’g|ú»ÕÊ“‡ù¸`ÃÐxñå“‚"a÷¦xu‘ÕHiSèt¼¥!оrõ€à¸±¯EÆ’ò€è%݃ú¹"à%¶½Â±ÇÍ“ ”-Á-ñßBy+,ßœ!z2øéèEçi?ÉÓ÷ÿuºFIÏ=Tä1}Ýá®ó5”7Se#SŒ>Æœz!P.Ïäíè÷³d½Å+AV=¸ˆúîá,rŸ”Køl5wÙ43<PQ«p“}TÍòÁ~í, raÜCiE× ƒió4 {«–¤·Yzzy \{ó8­ÿ—úø‘Áœsò• &è4Rô&õãwÃd…Õøh8! µ•+géØ¿’Gn/µª›{í„#+ýéYÆû^E‹ JZ„Õû9„ÎnÏ–­å†¹ˆÂƒ–7©n)Ò´X„á-ÚDÍ‚H: h’?˜}½·n«¾²õÐ1lèlÜ4VÁµd7øb¾×ã¨ì%°CºŠöA%¬ÇpÌçm3x7€£æO§ŠÉí¨¹ýgT®HÌn:‹ÔÀC©¹+i¯[f³º†j]YFS ­é»,àGåúiwåo»ì‹ü YkÖŽ2Õ¡, €ùøKUuÜURê¤ë½*”Â'%°ÐÙš¸GóL; ŠÂ¾®…øÖ¬r,›¸lñ¤£-#œÅwpü8¼ékÞHGª—eó“Vϯ{Á]x‹sÞóä0,'hµiÚ†N_–&!Û/ÒwøóYM,áGçžÍ¦vWh™ÌÖ‰V ›§èëù…€Ó@/£ÊƯëÔ´£ÉÑô«&Å`·3¶’MçVYÉ8Ôªy£Ÿ{ÑõäÃoþu²wUáãrg,ï@“Wu‡ZzGwÛûì DVòÉž„ó_S„ÊýT㼞¥ƨn}ìƒÄûÃE$ŽÐNÓRù3¼–ý¾þäÁæ._c亦¿ïIšíç]å)=¥“T1vg-žÐJ_†g*¾™ëiÂöN·Û+œ=ÆÇåÓЮ¦á¥ú)L!Á-ç5â’f†Ò¾¡o—k2TÒ€µÁmFÊ%¤Î ý”XÙïg•uÏ‘WNwµ-{ö#F܆È"Ã(®v*·iz„>¾ODoù> (Ó2ž¦Ó![NbæÆ&ã€fmße²n žÀà”)Ôy¹¦áÞ{Š9´Øê¤G`wðÑß8Ä‚r·–G’8l$ÚÜO•?­îoÛ£z¹yfعC}_þØüx}ëÙmhu%>diòæHæ¨uÈfÕQ`å!Õ]”G®d"¤ª ÿmÔMI ÅB¡]‚zgø HÚò}GT_á >%zú:WmסWs ,+—sòkuh˜$f:œ;ñDë}»‰qÔKûÞjRÿ'“Ý3‹ÄJ×|þ#‚8 ÄU Çrj ÁkÜ% m…íœ0X×”§c*h¾œØt/ú ‚üó@¥s”‹bqXŽú¥D2”ˆ§OÓx?çe38ãBš×Gȯ"kÿ…>Œˆ(ðÚ`€j‚-úÕm‚Ñ~4¶Mô €\¶ƒ•êìòU$”·çÅG*_Ú®s N(2CøU±9[W–ëØ#¦®@Ž`²’^N< P÷ÐOu°%~Îñ¹Éi×¢é'9³°âå—ç$à†åV8O.†Æ$}xѾð SËx¾·—ÜÏéDZVÒöxUg” KŽ>£-@‚Ÿ·ï͹â‰O¡•#Na9x.6me.ç§ëàMø`xHÏ Y :•y~ÊÙñ1t÷[ç?ŽÅcLÔ¥Ó< A뇩Ø"D-OU «Ž·#šq·iÞbaUŽÆ«6·Ýw€!mNwZ×»#.O×’.R çР½J‹aBÊ.=õ×½;+©Ä[Ö*鎶óu»$°]ì’•¥¦Åô–Ù™d¤#ª`ETKêzÔ»µ®ß¡›…V’[œ‹Ü¯¹É„'`Y“y´‰¡Cq›…‚ò¾ÉÓ±q¤ÓÑ(G|¹9GH×8QAMz &V7ÂìIòð•*¯­Tæßô5ò}­Ðr½¸s4§~34³Ž†zû~!Ûˆ@l+Ü }N ŠýâéÄÂ@øž-ý™[`膮&>„“üïfA>ñ¡-nÅr,çþÔá—•¥_mtV)âNS ‘‘2ï-(%Mý´«¨°“NCèH‰)c—ì‰Ñ˜YÚwß’¡{êÐæGE(ߤ†ª*êR¨5pÆ„aýh¥†Û=ú^“ëà,µ¤Oº> ¨á®¿Dµ¯\ µi†_,dˆçšoúKÈÚ«æ·¶ÞÎ÷¢¹4™â$¿g[ˆG0Ζ\‘em«mQz1 ‘¡8V5²FC8Uy…î¼ f¢>‡“>”†æÞƒŽŠ0 ¤Íön˜Œ=ÎÜvÓ†YØÁxü~jöWÜ€zÆÆk‰Ÿ,Úî5`÷¨pד—ªqÓÂÕÍyS\OÆê—τҥcΠd,c‰n4À#†à’Ãk¾Ší¶ö†Ã¸ÞœÔ—Pžp¯3ß&Òv•;åÿA˜ÑàA|c­–Pù)R;z$?ã¨kzÏL~ü†O6ÓŽ‚rRâ¬Sìs&ðÏ‘×k¸=kt¢œE‘—g;ßöyÉëKE:)8ø1Eš>=wÍ4fص¢2±GyBØœ‡õ/v|KL­qt0ùâÖùt¸Ù ø£qU–øk¡å\K*•¹ô¾c€¬¶ïã¡ÌX¼Šž¤®9ö=^àdNbç´“žÃ—lN¦5§Ó}ßžJ»(´3†²OÕá휠¼ò÷ívìéUê¨ÒB;Î K bNœ|PÞ,ª uíš#ïˆ)ÞdÅÜ´KüN1÷y¹Ù©ù0ÞŠUÆ0¡j]z„nœwnÃf4¬õ{Hr„Mÿ7„Ÿ»´XÞЇ^#»û8¶‰)< €œb„wD»†¨GÏ3 Zù;ål•0uw6‹ô߆0rÇøôlצR/ÙnÉ·®)Ít2Ó ‹Ô´êÌtÂ<<ùðÝ`ˆ–N“ ¡ÀÝ%& hЇÉþ,pslse–ªéïR«bwÊar<–ºFlõBÿt°·*¿ŠÑoº0Cd4Ûíÿpår>©&½—e$&ö\·EþÉGyót"{TRk"â{îÑwo, Ô«Á°“Ià‚dh“¥ŠÈˆØ¹ÏÜÎB2o¹Múîú¿.âvø&Ë^Ðg‰’£y=ÖÁÉ5ó!& ½‘¨B-RÄö&+l|Ÿ¥Wyý|ÈW6Þçɯ°1 ›äÎ\Ìh;™´Ç©CíæF?QP42ëé6cÀ½k¶ÀŸüöÕ‘]mX¿+K sÉDXßó=Áô" = ¡ß~îÚk½ìkaÝÆW°t·?>ötƒTe!~b¿ê% ëYÙBÄrW+áèÌ#Aͪi×%çÍ2ûÁ7šâàöò&fRGçÒ÷0åóct‡Ž|*„/³KîÃÛ±T4ÅÈïâªd‡C–¼Ì˜ ß;¶Ë¦‡,¹£Q1#ÝË[’Ú.kìD’þ‰B¦Ü ÎþŒf«Çõ´0þ–‹7kï[ù'-‚ö3Ÿ¨æéÔA6áo?cXÃsœ¾º«œnå|9¥&¦,Œ‡}ä6Ÿ•èÂeN\jíœN]Ö¬wjòs¹/Bk©Ÿ¨š„ÃJ +×WJ¹ãÞEà Õüç àD[Å#uGÄ´Òh\ü1Jmâ’ÿéãØÅAÕâŸÜuØ3~AP øxˆkö'ÍG+ Ø\$ãZâTjçÕajkÈEþêýbÐ] 8öŸsjS-hñum&ýמ×n8,üt±°oŒ1zý|ÆÄã¢(Ñ™SéxÙ ?†ŠnA)=âEô6›E =ù3~m ¢ã´ôO¨ÂªƒôTº6V¥¦iéžvì«–½v62¦ì¼Î¨pFrªH÷7F”X‰Å¼ìD‡¿’D‹{ƒðœ}`¯’»(+¦@còOAV¹ëöIž³* °ÙL<µ¬ûþZ´µ›%Úª÷ªjžaàÏÈ=¾F{pS˜ „²¤ˆß)Ç $K¦,ÙÑ-¸ω ¸ Øm–7{:b–oPÿN™ÆGÊæ€ißõ»'iåSX;ÞoÇÕ]¥øxîøøóƒ¾¬ábqHÀHq5fv,pUzÀ=.ŽÞJ!ÿ*Ë#æ®ÑDZ}çrÖ˜Ù“4tÚDéž=4NTˆô™‰—‰0oíö´|/¥v¶.LEôZP1A¸>0wœ$9›©¤ÎÇ"¬vÇû%àÊïHþÄ¢¶îÀa|¬Åk€ÖFë»vÈËZ¾4«Z\²7ÕÚgF¶ØÐ\R?Ýß?v•ÛS‘n4[å¿^––|ÖÈVœ›¿ eËvô4Æwk8,9Y$wÖnôÕ Ÿ‡:M°j*) éñ¦aÄ8 |d?ÏíÏû­ï2eÞ¸«{!¨ý¤¸gx;ò’ª\ŒÂîõÀTšHa:T6–°öÏå/…˜rqiNÕƒ0'˜€€ãøv)ü:=þyqü;þ%LJP˜þÿF?îOáÑÀÔžB~â*$t‘ìµ^êöR0“ï/í¼åI3¬>%ÏÅéGÚ¤N šÃÉÂ8DRN9™ Žx£¡…%U9ÚNÕEÄÄÐ"ÝskR)muË—/üL(ÃÈF‹mŸ††©wÅÀ{inMW±sýºùüodÄ¥tac´âd1ìTPñˆ+Ú[¿ñõõÞåE…±,¯Ä?vŒU¿ ‡&àã`@¿žäeȉIu%çabQ:rR`ÂP‚/öáÑ„¤ýyŒÿ6y°¦Åבê±ÏYK9ñÄ ‡Ê’_E÷ªê¯^_1Æf"š¹" vœàÖX´ÊÔÛÜO.=+ƒ•Uü[c0í'äk?ëšFŒ-Ø,⿱ª†X°GÝs¤é¸p'–"*pRľ'6kWÝ…Çzñ…÷ýrKz]Fó]ð†“6˜d¤x¼‘`‚MÜAÃ[®ÑþB0¯ zïð;$:à‚HÌ©^M¹+c¹Ù2µ9JÆp²ö¯±ùcŒ!ñdZä;£¤…ò˜ÒFÖöDG<ß0´6M"G}€óù7æ£Xñžûúƒ_ÍÝêI56ºR1œY,Å5×ã ‡À–hqb ­·>®Çš›ÛåðÅûëä³\'å½(3J7ýbz[1ÖX·FáÛ– È‹ž/<;ˆ®µ×V- ¬²¸fቢ\VŠa<¬xaP¿W€ùuTLYõTÌgSGA#b8YáˇG–”·ÐO¯’÷á´(^k¿ý@Br`\·šI°oÍ€©óh–·߃Hc»P—•¬|ŽÞ+ã½DE”;¹r`Yþyì÷luQ„å9jÀÂÁ¯ä¾ 0'O-vûtæ,p¥½ìDÃïÕTf~'}7à”§nW)Þz`¯ð Z¬®,ªÁ9£òwl&…0;'¼J}ZÚB1—ºøY 4è‘eìÈ0ÉDRîâ¹x<†>D•ݽlÖ?SØ 5T…‹ q™økã^\mƒ–ª°5â¼eKŽÐAádw$ä\!Õ–ºÍ§´«ÔG(ù|ÂÔÔÝ5T.LÚYb®ªŸ1‘Jo\<î ?6wô|³&y®`}y¬Ss°%›Uyhí|µF;IäÉ|,À¤§T(Dê3õQ'º¹RW-›×ZsË*ÖÍfŽò@½nªûY¯§+h822²‰;·á+Š ´Ùtn·Q‘‚·_ÿ#”ˆ³ÿWýlIeÂ…kœ¸´Q´ðŽßcm*U·Ndgì/À`Œ‹À1%HM¸Ç5”„TÔw}˜y\à¯yÀ„ù,×A¯íצ?§ïÊøtîg®ë˜ o‰ÚŒÆÆŽÝ9èó”þNN½?l‚ÆÀ´š¥«Ñ$.áå±¼‡±ƪÞÔ㨲¾i¶+FkŽçÁ½uׇCÜH°l0Å$9û}ï­Fž]8!ÌÌzd@V}”ŽcX%ÊQ¥ê=¬?oAƺmÃÁ…çr1á! 5ö?- ™nþdüG1o‘ n"¯;à䮊hÀ½ È…:r6Z"ðÕŠPߥ>?ß(©ßÒ+ïO„@=i‘õ¸[ }Ò»5 LÕQà9pë[Ç£kJµs.#ܲօbVË-;®oK~ꟓÂê ëbð¾¬%ÖG²ÇÔFŸ´¨œ½¸£¥ëÉ!é”#x!ÈW- É÷c®2Ãå0Ø×¨híÊT& ýQJ»§†ðE¿–i7ÙZÀïðè°@ÄïG.»æ—_>ÞR%•sƒÛ;PV9Œë©öXÔ"î^ÚÌߘŒQ“?e5“3áÝì—Üã»ý ÷îiÀE<ÀhœÅ7ù˜,NÝÖ„w3.9{/õ—£¸©d‡¥2õó—]ßßö ¢/÷vQ0élj<†UÈð×8(¦æ,´ Ò/ ›ô!ò¶<•ðYŠÐé‹P[(*Ò5‹¹yØ/âß‹Ë'é(÷åø­ªùFŽøÍ¨O&Óh ;pÁ‹†+rôJt’À…¨¸W[0¬üÓrf:Z@îÕAÚ°ükUôÁ‡Zè2mü_uÕFˆ÷í÷ dBÛíu 2dH 킵o<$HZGkZ|•‘5£¿#|c§=G®ô«ˆKÅç‰ËhdÖ¹Þòšð5 ‡»`—È?!½îÏ¥;;¾&y1±мÿúY¸4ÛÓ ô:*ƒ×MÞ6À{ÑI¢7ó—Ñp BùZÖ„5V›Á¤S@Ú|"*ŠÑ˜*¥þã—Ȱ_EØLv“òE~줙lŸÜyp5i°ÆàLUX€¥N¶. .I’}+·áH&µÐzÕuv…ZEb<<òB¢âD™_Báñåw-ÖVú!î½{$ˆ@MÀäD~N>ËÜḜœÃeàj oYùÈ]ÁPŸËتëMK(Þiçx¼kX˜•'y£sØFsm«c´¤/ɾØ^*Óv¨p Ý ·sÓ‡\f†ÅæÎª¯ÈLͯ¸×O¦[7÷†IL/ äG(/‚mïÇÇÆ+À5­'ùI*Ôèí*rÙn 2x÷FTÿQ–â"<}Aúp;Kùƒ¤Ù'IL¨¦ ¸h7WîRoc޵[ò¯)€,éþ³-ÖCQaSª®äh˜¥" ‡°«ì1q¤0Î[Þ_NÍ÷øªd/¶¨éQ–#EYß”´ û l¥»jé²îÒº—ŒÐñ†¢€Ã¨„^þE;¦­'Ä0IÔühf]¢;&ujsyZ¿X„<–P·h™¥ ä@yýTŽ3Ñôè"Ä!NBbº686õ‚ @ùd­ëÅÀó.èåp¯õ½ÄÛ2ð³ ¹^Î>NÜÕ„ö–rL‡YaèF!uLå£Nâ¾2µÂ®ü»ä]RǑ߻¶Y¶ÉÐËÂË#¼Ž¥ÿ†T¥Ò:ð0ô5§¯ º‹Ô¯Žýä#rHaï–Ýÿ'å§˹ˆ*RDNIoÃg0ÿR>k—oQ-¬(ßÎ~AàgÆã‰ežøÊ·ÒpmØl1îóñ2„ëÝî'ÜXªŽg'ƒQÄÆŠÇ%j©Q•ѿĒÀèó:ÐQtµ³™‹¥®øXW`Ç-«óëßåV³_–&òå-.ªE±, ú¤«y^G?5›ýÀCÚ–FM‡ ·åX Ù¨‡‘Éåí,œt³œƒíú®òø¾¿~A„æÐÅ4ï52øÍ 0ïŠüã5²ýˆ¹ëÓMw>Þæs„_ÂäÂcH€žÇmxª•º->T燄M5ìþŒ¬Ào´ƒÜ¡-Z §,oή𺑠¨ÛˆáÒbŒ T¼6ékÄ”]).aëÿ1À%ºßºÙ^Nå­O“ÎÞæœ?Ùq².ìÊ5ÔøËœÿ7e‡NÁ%¶’½a-É»rÌŽÄ4Cæob,ƒ)"P3$ŠÉÊÎ ž0\͸=â´â¢ FŒ=Bß®ñF.JÓíqÊ/¶êäËa¹­¢~é†é¯tbŸ¶I & 7Q+’“@[y'zÉ£Àò«ªb]!̹F÷T؈ðe ›MtÝám 9SåÐÕ*ðµvëîéý–QñšIÐÂl÷Ÿòg~še†§$? ‘ëóq›Óª æI1áigná•É·TþË®RGÄ욈îëm’4jr†ÎmP€±ºÔÄæAgUz¦Elþ'WX­fz¹"ÙÊýz¸»Ë”ñ1oâÆšÂÚö6h ág a¦N>¤óI\Õ ‚*¦¹ŸÝ×åky2ÛŸúSVà÷‹²&}ݪ©áæ/›-qÖÿUm²†E»aNCZz›1!zËžßÜêm|ñõCŸ¦µnš*”b~jiËæ)e„`œàôô?>z Íq0¸ÄÎKg²¤&¾Zݧc˜oaÄÉiyÈÅ fÇk¾ì,CzÆ_“ü¤yŠèðs£¯HܱM8~Œ« p´é›¯Û}u*U:É”~‚‚¶a}3ÃZ÷ ¸‘£ê£êv„‹Q%L8~ž6±å†òsŽ­7g¹W½–™'hˆÎ’¬‹b&ùˆ4,b!}}³¤;Éá“—aQŠÔÀ2ÐíçÏŸ±›Å¡Új(u›µ·ÓÛ?aÖv{à­ãKwûX½0®UaÎ7ÿF2.úà”>þô´ZFz¹ìϽø¶v©¾çpÏåãf.}TƒBõI ø­»Ÿ“Í,Ê”kÊô­4 ¹9#?Á“C{þ‚@GLjC‡,µ¸5vµ€xîlƒËŒÁÍfGÛ´z5S‘¬„{gÖ³¾ÐŠqƒµç¿ÿ £‹wà7m«ëú/pN¹¯K‚›Ús•Ø*%“ÕâÔ%Åÿ*Ä/?¿4p¶ó˜1gþÂ~Adv’à¤};oIJƒQd?8®Š±äE›1ty9ú^[Úp;–L‚¢ì€Llâ)—Z·Í«k½Ññ(iÂS¢WrQg¬FkØŸÜœN¬k¶kC£Ëš >»ÜÛúä6 öjã¬É@sÕKvwVäP2!1¸·Æ©iÂÙKÑ7ãäF4z¹oÍ@ÅÙå”Ã*4–DÖe|ÙÏ¥LÌi4Û³#ó9În½F“WŠ`1w~­¦ÛqX:p‹­¥gÔõüì ;§L4Skð™‹þ݇0AUÚ.¹ùÚlì~™muæë·ìe£}LÍÀu T•Î K—³j±ì9Ø¢€>¶Eì"ýåB@tƒ¦©UÇÿÿ¦EßRÝ âÍ|rMñ=èÒPGjiå”·€1Ìè9X›½ìC0Á¯˜÷â”w°ØÀ—GãÐण '¨Ó½@âš÷™z‘©M¯YÉ„K÷»þ*óÂK2qüàó/íýr<ÐU\®{ó^j:qpĪSÔ ï]FÏÖޤ¦æ#ADì€ózÁø”’]It‹0×È:À—ß9â„ÝóΊaº…ؾöíeìu²@Œ’…í}Që¤àÅdÈ„“óR7yA´Â¿j!O5œÈ›LÞf½‡yµõʇ'ptKq’-ŸëPzÞ¼ÒH±öd9Ä5€œQ—ò­¦ÙcëJÃ^]}ªq+CÂì ‚Xú )‡nî›ì7úAƒY*†¢øÚ¶Õ]¹ØÚ)U …‚!{Ù=–›£N=m;¯5C£Ðr3o•Øj`u<œ›ÃŽd»î¸I\•7ù¡Ïµš7n ÄZ ó'ÄöÔ–û¾²ã¯.G¸B1L&Îá¤ió»›-ò´ô3Ê9Õ¬ûÜhn2^N`•$GœÕq²LeàÆG!IKùlAÚX”½ùÕ@µó¾’Ý|qf;ðb|À%–p±ÅI•jþ.Ž(÷縙jÈŠÅ_ˆ}ë=šè²È\nÈH”{ !7 ©#‡#ð­ÏKº¼Õîù9E骨~ 4hö؇>Ç4 SýÄ„NUlù¹e÷¢ËŒ ºæáÂô<­Ü¯ yT °Ý³q™Ìõݨ[&œSaaN~öѳ ]¼±½àªk¹ ý–È–=”Ä4þ™®ab mÉF‘Ž‚3÷8”ùiÿ+Êžr±ÿ%BÛ°ü|xPª;.!‘¶Ÿ‘£†¬F|Í“à«&ß@Yj/i$ð'9¹–—‚`1ÐL΂6A'vy-Áq>²BsÎè[1¬P5q5ôðØ±Œ¸,4ô™ˆŠôµ #Â)Ð/þ’a_eÔ›ŠaÃúÙ pع¾_»DÜvŸ1qÑh6¯wÞ˜½}¢_áEt”Xù¬Ô™_û[ÒLï͈}R‚ |BHþøNyÀ0ƒcY‹[®?_™þ‡ý“¹Ÿ*tÝ8¼hIš56#LàÛ䄪N&îJ %cȽ]÷RVj%ÿxÀQ\0Âl·>øäêhJ¢Ÿ³Ïa)^Ž?ð\Ð!٧ئ _=züs~Ãó…¢QWF…óø¯aü—Ñ)Ô½¦4`¹²ÕøÆÎ¿O[]§[¼4xÂ/zýK¥!lžÓGíãñÅ 5ÓµW^f 'm…û©Á/0g£{ëò¯—¶5›Õ®Oæ)wRàAÔ/”8jÑÀ7—û,2´œC|A¥“5ë¯Q˽Ï8ÜjZâW (*R¸'*¶(P‘씚ï'nwžèxìÿtŽV„àÈ®³#ôŽð눾¶ð0§Îú_Ô±¡•¤áw¸ìâÚISŠ! “EK)Wò.»›Z+ÂÆèÀJpCFšæg[9bèí‹qߨÔÖÖHTØh­+ʤM1’Ÿ Åzvú\¿UîˆÃ2 /±àß_“¸‚½_0œB+:ý¼éUe²}ÿ%Kf6ŒÀ(PAW=Ô‹Bv£k¥îtÞí—ô¢`¹JA]º9/>Â4…ùG›l^g™÷Ę›FòÑÊꈉóe£–£Ï€LXGÑ”û€ƒð™tXʈ¥¶¾’`ÁPj³¸Šadûÿ|D¢Ð¹‹&e¢ühÓ„Ù΀é8-±UŠ„k â²Cü¾5 C9LQV¾_ó]L}ôbVý¥ˆ£òô‚_5*Ø(›ó%¨vÛ—¶ý þ¥úLwÓîNDÌ+n~3ˆž:áòÊ}gŒíLçõ¹Ïøèê„PQö¥À‰J‰VîÊÚ´¸Gî3n”uL/C[ÜüÃSßÌM8sßµR1Æ¿wÃúØ"™N¯âÀØÔ^›lö^„Œ²ši{ªá{ÏüG•O_¯ï@àÀ©½m(¿F¿ ÛˆÔÁÙÈ ÑOöéR5yÅÍ0£Ô‡ #ÊVuú&7çµ¹V›ó ¸L”‡N뺛ŸÐæÔÏ%AÝ_}ðó*J&A'l0ga*ÖÃ8Ú˜k§ Ø£1‹ÈÌ>øÌ+¾3{t"Ûqœ¢_Ôd'¨ÅL‹­†‘L%¨¡¥a¢}QctÎÇŽ4ÃŒó.›±/¾ÊDdÛâæ½…õA5©éW¶+‚NÉùdå² ­ÕdJ;÷ƒƒI ôthͺ Ÿå¬Ú´{f‹·¶<â5(§¦ï!`¨žh¶Ié‡;c% Šžè2Οaá±sYnû08½Ò~I¤-´-ŽÛºF^R3Î`›¤×0Ó§n‘Íh|šéäë_ Üø@g¨ÄÞvõ7~ÄA+z)}£Ì¸2Á̹Å:ÆŸ„ñ®ãt;®(_ÚíêÃØž˜rí©Âì:@ÿoÅŽ,l­àv˜AïÈ&T\°KÙ'з®¸(ÊA®&,MedUõÚç²ê ­ëë¼þÕ©Zè½’Ò딃%eë²G º7ùLa“`a€zÐäŒu÷v0L’s´ºb}QÆ·ýÿ{5-¶ù[U–W"›^Smí£ i¸Ž-Ìul¡Ówã*4cÐðÿaá>Ộý5L^ª^(fÅÓçhyg’'À-¹-#ÙDQIrr¿J蠻ƞüâAÑ$ÿ .çÆ}ó11éS¶¸’ß»ˆÂ×öýxŒ(®[àÜ) ÒÑôj­Lã>ˆÁ˜Ï–jÉÊ %ŸYŠ»6kÒ•¡î{Ê9V¦0°­œ¿ççR1Ìê°¢8•N Yû¢stÉï4öïS_ÿEÁÙùåå¢Lçõ37åÉ›§+,á[ˆ:o·)QX˜~yj*°Ð 蹜6^¼ŠN{ÐKŒVôÃ?5‹ªX ªèÄ‘‰jú­¯¯JûãÑ,q…ϳÖb€¡/†¢¨¯V€Çõd¡"Ë× ¬Øs~ëÍå=Åþ.黈p 8„¿«)YRÕÚÅ"*Æn &ç”·Ùï;9»Ê¢d_RVHƒEOwù-NT«Ý°0 !ÁÑw‡àÜÉ’lX:d„‹[x|'­è¾Ì¥íÀ~=î6ÂÔ¦Œõ~<õ˜;¬€h’07ÀYwØ"¸^ì~ бjk˜ú-4ò1Êêd:Ê‚5â<ê½ON­™•û_öSæ¬}ØÔ]ò»6ÈýFC©±ÞôÛÌI€©Å–¬ÕÝ;*³ú”]·1QAí÷®pƒ¼QÁ³gÈ~Ûçê2B0u™èXdÑǃ Jó„hKì{¡+Jx¼µ¦Êò ©‡´RyK·õ†–b!$Ÿiñ>Ù-Ý?r ¥Ò$Ýá ‡ ðÌn×:Ã……SnÜpûN@”‘¨2°TYæà;åS¹[ü÷Q ö2q7þ«ÎËõTLÒº-šûe¡i£ë©T€¤À6&ââ”´°Éµtðÿ.Ó~Ùï3¸º ÀÑQxuÏg’›-í¬edÉO ^€(s¶æ¦DhkfS¶7•W&šëJB¾á\Ýe8S+x–t¼þÛ ‡±ñ ~bÝ&,CK·,ÒGwÚeNì¸RNýrCY;óDìž[ïJåºð±…^`FhƒUå9'Ýûdt5«ç:f‚^pÉA]Åó~ú¢½Â)*ÿ.|$ÎAgm`›Vzô â\÷Ú£¬É Z$».aêj]D»¾^¿® p®iwY û8• u€VÖÛË;‡šîæ1~zž·ïѯøŽ°‡¹õ.ˆЙä¯oFÆÃqŠÏ8 sƒûŸNÇøɈ@ƒ1ëEò¨mÁÞ;¸Ç $2×ï1[á±ÑC;BÍö¹G×ßÅS@)þ7æ5ó¬ÿÀIYD#Y¸ ZýÜé¶7—·çÏ@ß΃$Iñ>@ä‡;Âêú“uÓ·)•‰ó› Í«éË8N|-aÝÆŒ°Q¦š.sÞ}‹›µŸ„užø §pw¢n—ÔÑÜÓ«ž°# ò÷Eawfº8¢#Ú ©<@Y´y¸¶R‡|¾dJHR4¼Ã˺ürHáöD‚l”o¿á º”~N}ì­AUãÇzº„o{Ñ¥u—)õ›ˆ}ýË €â”[uíÞòf—=`ïŒÃÔ…ÃH€p§t²²8p¼m|CNé½;S‡—Ú¹· KƒÆ©Þ]S²RYVI®çø¾ýËâ·Ñ†!3çPu~£¡äº–+jª]Eä%%ö»I©o_Æ^1•ÊË^ˆŸ´¡Zl«ê*%Uâê¶§»ï¸ð÷nC;ÂrÖehªÀY¤Ò*¡JV ™ãê  Ðä,m ùº5“Ù8m2!4jÎÛöM³Súßß1«Åƪºæ”Ox9–ûÿtŒ…\\”Å:g×èRVøÊ^Ô¨¸¶ØèZT#ÅÎl_îáÕ1YbóÈ =‡6-ñ<‹Zj‰´z¯!VF&»ÛêÎÓØ»k¨sÙu±xØ(ûÑµŠ Y—ZÂHÌÕóž°ÆuâR¼ÃÎOK¤šða Pr‚—fŸJ/•ƒOõÓfšìób æ(äzÝC}îo3ƒ¬ðÒa±2; É{,ªiö:ÔHiÀM=µc­›É&a8Éú€h›jFpß,&x~róÞüVZ_Ö?P¨{r%;åÄZ£(càš-=°†f±7…7ýòÄN²¹7 Ë3Úy­‚çé ._Ë`Ñr¶ýSÑ… ±ý´ä!°y3O§6 ËQ€µSvþs[Òà.‡å²U’ÖŽ°…˜+¸sÑ)ŒÜrxi}šýÖü–¶ƒ±8©æ’#q~¬4¤tçNK`¯ëž3îä\R@Oï^w}>¬Vχvfs­›}]#Cþ —³þl_CAREíX}e×^zöEü Ý2U9›“VçZÙ¥åfk\FѼ&³ Á=gdüâ¨<‰L++ðq ä@l¬ËëŽÍ,ˆËZµ?õ#6ç#·&ù~<7tÌHðé+¶a¾¨±AæÖ‘? ä.d 1²¥ø¤BàýêX{LÃ7¯þÕ5Ÿ® €øeI-7†Ô˜Èèx?-0G͙ݸ£—÷’¤׫‡*Ïþz@`ÝN^#üì€:xždÚìbç·«™?uBÐ:R«Û%\ÙP{çSÇC$ݱ¿Kbpè·<ÑÜŸY-Fk{L–&S|boKX!¬óJê^tr« ÿ,3B0X$q¸³j€5رUéñUú]>Œ€%[3äEÀ±M>=d·¸yf]ý Z)§mu@3ØS¡Œæ!<B£Í§`ùb7§€]>‘µžWs~Žcd¨¯ýF…ÒBq_e6É „Xµc¼XVH£ oûãûÜö•Á³ð´/¯C;É™Á¤üÏðXÖÓìæŽ³®'É÷¬¸£e8èEœ˜»úsï&³ßz©füÛ‹ýTº$°¬ñíC)®ÃÅp#—¡âÕrxPué_¡z&œ³Ò?çkô: íêäÿoú컚Ýk•‚Z›J›E¡¾>xM¾2J9^Ó¿Ýœ&˜•!!nÓµëá¾: føª´@û’GMö”{^ðï¿Ç2T ‚é2`c¹R*·X´[íY0¼¿þ9øgíŸYÞW”®yìÙŸ·D‚G6Ãà‡&hã0îä—Íã©ûªÈj=eؘsbòë³H ¢¬Â¶øÁü ØéhªOÆk‡ÆŒGDéÝ•Îîš§}È‹>½¡Èmb¦ƒÈi(çÈ%syxd+ù6üòE/¡übÉÞïEò$·]ÚÎw)-ç‰Ü¯@ëØ$7·+Ñg€´QÏŸ8ÿÍFÊX¸{ÿ3ExÚVá:ûòÆïÆìŽƒè&Ä)¶‡¤f8ÉàüÛɦ< YºÖ¡Œ²Ä¼¶Hµ¼‘½k˜ˆ£3èÃB Û/íÁq7 à3¬µ+|ø„,²7¶å“å÷ Ÿ…v^öÞ›6®•c‰(–Þf_§¥“œTu ×â¦pÏv$3ÓzÂKF Ý`Ç–®ô.ÐDòÃÜ÷#Y9m·îÒt| /d­¬Ó×ô„b¡ÑÄÀàçèþu!•çò$ÑsO\—!/‘ý•z…óÄ_êØ_ïrŒ„»Y5øv¶\Up˺P¸t7Ëâ±MçO‡'.­1üלB;9ɹx8ÃÈDIuV¦± 3o·¬ˆo¶ñ[múS;ιâ‰8o‘ïv J„b»:{IÇæÙò­úZå÷rÚqéÐ*½°…ë[ß•h×,ˆÛ~o*ýäOø0^ñÄ®À(X°8ÓŸ@¹êáÖWwßH]¡î#–„µêM£-ŽÐGoR¦P|¥rŠÙöÊ›µ\Ü}}„-ÞÍ%0sŽõt¬Ï÷KÃf£/P…¢š‡1XmšGëŽàdÅYñô•¶@97H‹#õþ™ÖÜwÛ ›èïHŠü›EÄ“ƒ@[ÆAö²•$v~8Z|Ÿm´ëÅ@Ê®…[âôË“Þí=⎭Bf RýIñ]¡#ýµin¼z³XåÛl½ª _Ôè~¹•éÛ†0Ö«£GQíì¹–*ù¼´ßYAƒÍ 0;*$Øãk^ ]ÿ!¦·Rœ]’º^` I—öB5•b¸Ü–M:ÈüG`pù)L cd:Jc¿vÿ:j¿˜EüJó‚1[ AKbèJ³Ä–¨´ã’ã0ÂPWCzÍú5­»•'eª”eefÚF»Öè+H_ɵ0Cñ±¬ö‡cÌÑÃàÆ5ØýÜš!Òâ6^·Éò²˜N~ð°Ìj©æU¬ûx,¤|ç¨ÔY"µ1oŸ­ºÓøÐ€Û âÞ— ÏlhuÐa¦çMû…ÛæoºVÀËšñÜÅBƒ~›àXr½Ý9Ÿ¤ÿ†%(XÒ‡,?uè%™¢ªUÈl§[I'†ãéüÅ/R¾Ù¹ÉX¢‰½|¢\¿ó×wèÒ e­r¿ØàUÎ<½_ê•5š‹/Ršq£µ0Å,†ô<Õÿ\Nµ)ÙaË<ÙÚÕ¤Bݤ®ò¹%¹ç$Ó…r¬1‰ì!&í°–<“ àÍ¿×ÉD2tä=è;ªˆ… 37¾u½’¹ÄØ|¿#_jè§>‡>¨ Œö¿M5öÊÈ%ÊxSíüyrÍQHl £â£¯3Lë¼ý¤¾Ôvuã ¸«§Mî90=ï¶Xq‹6'VÁË·Mšy® ãy˜õzÃõì 'ý¤ó’c™ “&ß]Ê£òiÙ—\ð굎RšÉǪdŒ}{ÌùÄj‹À0DŸ"çBEâ?Î+ðÒ[:JDGùÁWÐèq»`è!;Dañ+=DÖ¿88ÒÆ>· J$¨é¹«d0ŽÈÑhÓ’’}¾ÈÝùðŸ Ý] 7 ,·U﯂À%$á—é.u!.4óÚ‘2o¶ñXýƵ’&ù?&‹»ÐÈÈø 7Ó8O!?o ¼7å…ÛêºXBñ£Mµ’Œ/TMJãŒ1GŠXTPÓh:÷Üóˆ&‰<íº‚ç ¬6Åhø‰ Ûç'ÚlFäU-ÄÁêbÞÃÉ!ìr%±cVVn‚&…I¼Ì!]’sW IÕdskLPÒ,¢~ äïSyHf‡˜wIŠÆîœ(ðùš¾1©q7\k¦FQÃÚå´U?Òˆ’×Ydq¶ò¬±â*NïÞûµ´÷!:íüÉIüÁ0ž«l".=SûŒŠX ñ4Ý §$ gNÓÚ˳U÷…ÍþÌá<“]RÖ ]«ƒq áùrB%›FWpUžÓ·çÝõ¶_ßÑÀ¶ØëÚ¦d>V+…¤RùU˜OT«C"3Éñÿ€JmËZ§J¢3Äþ€V&½JÁ‹±íšJ‡và83¿c\"©¡< ‚-/Õ±gª(Éê#”R;r12‰¨°;>¤7ÄÛɤHÑÄðNßìaGLOj+ׯç&*–¡àÞO3þr¦Z'vò‡ù²œ³ . Z¾þT 5®íNûŸÊžyUÐlD»¦$°G8ðìE'WÝ‘Šúïõ»¯Ì9?pÄÁyLx…Nì#°›§¦_$V@ïô¶:H=…Ã#!jeP—ê)¹ö¿ÿTï©DM‹Žþµ?¯I¢² ) Tt3'Ä.¹·ÓI)Ó\¥òY8êèªa¤J ë°5â£OÕV×üQŒ"ÕÂÃ5îÖóKm"%y+õmZbÑ@÷Õ³M¯ ‹K#\倻ƿR”ž{.Ž ÂÎð5“ÄýMn.P•$yŒXú~þSh,&€fKÝ,8È(m1ɤ†ŠBý¿$- ‚=7ýitAA "S2Û³Þ°ò˜fÃcBÁé ò¸Íá°ø/Ζ„Ä@>)„SIƒÑ/ÙH çTn ‰lÕÆ¥íGäګD˜bY0]Jr”k«²"×ͧÔÍú}ÝOnÐÆÃÛ4€××ö§4¹J©f=š ×ƒXwâŸfYÞÎ&ðé¸Â›{Æm€ÊO¤5]Âi²¬Šµo“ `¥#Û:,ûºb/ànã j Ï!z"—íPÁ5£‘±å {9ò…ÿEJU™ ‡ëgžÏGH;Íð®ä@žºð:ÁŒ+Ã&š-}ÏñžKIji¡ë5þªhÃ_0`L›\7RIÞÖ£KŸ7ètÌtH‡”Þ×]©˜òñW‡#Lš¹}ÖA¬â—šò°Ã®º½¹DL‡ŽU”Ô¯]†wú¦¼‚-“4*œH¢2Yûßkô=}­ñœfn¨V&4Éí^F‚íDyÇ$lÓù=ÏújÔžCÌŽ³¤ÞQ\Ѷ\ó¸ t‡×±&>êk"Î3 þšª!i,zí*®AÚIŸÀÒ€A¬=gEµ<±K™wÿ ²ok³ýéwC…hü³§{:Âð²-¥Ó¨ ÚR2ÑE+á•ÇMC?Wºo"Ñ5âˈš6J?-´[ðmÆ+¸ÍOÏõi™x<èQ_Ö ô™w\åj’¹)‰þnîfOAŠ8dY´í¿ã ´Ÿ¯î«-wµéï„4¥2“¢ù­…ª~D»}€óO3²òÍÛFs}J+}‚^ùéñëBÝ9‹H ÁÀÚ³Q%×ÎVǯåK4­²èuá¹y•’£—›5vzƒ% º­™èŽÃœá(ÑT¥ëÂ5(y;¥cL¦©TÔ€Ðë˜ã›ÄÉPÕ숸¹¯èb¹ò#¼>5¢I‚›Ó –!¸Ó}RNðk ütíÜ(N·`%ëWCJgO ﬞ‡;rŸ+$‡&'©hÒX©¾žÞa‚ƒ]q—‹ºk±L1©¯ŸLqp®À^ý°Y¬úHfÃ]°5·vÛ³M—Ƀ9 2“B¼võñ.šÀsšÍÈ#É|¥’bo¶’{"Î@vF´5ïÉ-§4ÑÃ@ý#•G5v­ÓÓewÐCÿ}mÉ)Â-”¢‹ºYvøíÝyÛÃrÄÌäƒMk ‡¥¸T‚A¤XŠ¿Å¥×­‚˜ŠPvÛ{ÁeÆ7Å[ßÔ;Áa륇Ù[4¨Xb4îæ”ǃ,£€n5": «‹“$ú'æÓ9$S]V+¶øÌ?72ÿWÉ–ìô5›vË´ëI ÿ%Áx±Vwg£¥¦ÍÃ7/%‘˜àÚ ÌÒcä/—Aÿl“›+ ´ÄM±d®4Oiv4òƒÈ™`A׺ !«ÈNynV½!¤)£?•;‡±cG²û}E“jœ†Ür^ có îx´Þ•IøÛ£â|l¯?/Ÿúu­ÀàÖ)ßïÊZHá¼ $³pE5¼`6@~ÉàDœ($‡6þ¯jvÁí>=d6»«YTúþêÄã¼}–Ž`Z î"£“í«*%ºn%€\ *Ò¥8¥[‚Õ€ ë@2¢ìnH¿¦Å3ÆÈ"g ®êƒ°•J]íÿ{hUmD²_¡P ÃoOÅôãožÂÒS~kÅ9úñiðGÙr1ˆ÷ÜÀ]yžn`&M¬ìC0 ÍJyÐ)QÛ²G뾌 Í·c®´ÇŸé_/Þ¢$³è&ôåRbv¶ø!üÇ ~ä]{)¿|e”Í®åôó›ïº6y‡/îºl‰éê$Ÿ¥WU³ >eêçÈ¥}|]¤l"´X?1í²ÊŠÿ*“‰Sgƒ'xáîÆ§a×/¾ífW¹@À²úÃmTzséAú äShÄýºˆ“ÓgÆE”é8hoâ܊‹*íWëÖäÛ ëߋǂ[a¯W‘ÿ([€ŒîãÎaŸkѤ?@ÿ€å^Ò·FR•¤3Ð ÆÆâöd§Y¼Ñ|å¦Ná{ÛOÜ$ï a*°ü¢Ÿ§ øO܉a–JmPZŠÓ/TȃS¼2¬ð:ë>>kŠY{rÇ3Ð^”ûh®Hk×So«l“™補çêŒïtéJ,ZÓñùê‘d_U+7ްm'üùMV’ù&È—;wuyvŒòÃz8`ãvË![^¨[n°õ¹µÔM¾(J ' ØÖí/-+POóúµ¿äܨŒ&ø(ž[kjôèݲÆ ÷-JÚDÄ̹*–³YîÆ8ÂZ«Y©ƒkhŽÉE¼ª$æ{I_¨ºRþÌžlH›Œ¦ Î¥dqœZ©h¼^¿|õ Ýt¬‚A>"kéÎ>\\`ƺþé0üÁx§BgDà&œŽ1~©40Ž5‹©ƒ] ©ýc.m©}ä]à×Ï D±ÁAÁD(†z}™Hf¯ñ j"ŒiÕ÷ ›²7Eµµk@WŸ; ëòBä×\üð¢År«§vûq“76Ä}°‰âv»ü€‚¢×Æ;à=°Ã} é_sî„ðÊÕ¥è:¶S¡0¥º0Ù€CT”Ä“ÕWØPߨ÷¹'.½ÊU§ùÊð‡lIb4ÖeˆYY¤­öèÅN©ö8§©újê¤ìÍ´á¿ëžÕ%»l<ˆ½š—c…õ'ÕÁ@ØÁŠð…[¿‚ÜóJÿ)Cyß{Ø™kÿ`áxìÊþèîA…:åòÏ®À W§=Ì^³¾½µmIÆ`Uˆ q®LzdsÍ"à÷Í{PüÄ?âŽh‚T ”ctIYŸ!îÁFÉûà˜#­‹ÖHŒ’Xâ¹2C8³bÕö’ÎÏlÿÆ8iÇý»–•"ŸäÌè’BUP·ñxàu6Žà%û "S0EFrêÀØshÓqLòá¶Ã?|â¦Ì)Døv5oyr@¡»8¥bL³.Sb¨ŸÖ*¤ÑJºÔØÎŽ5ÒtÂúÞ®2©L¿ÆHÚçÞ-³Ò—EÃV–?~ Ó†;u%Å˹GÂ3åÀ›Ž”Ò÷äéSJS*‰M4?µiY,‘ç# Ö ¹Å‰«îr Y8ˆÎ‹²éõ¦o[ƒÐÄxó¼ùk*‘ÎßîTzëó óRò˜ô|îµX°Hý¥¡CËnמ+Mõ¶i.©ª°î5üȉìYò*=Y³a ƒŠ 5}ýõ!óî_ŒàV'eÀSèƒ-n˜³Ž6yT§%0KY?—0`”sEQ7éø-pÑ»Ã脘?D>£9˜0ÐPË¢ÇT_a0õJ]gǤ¤È(;™´nM5¢0Bå-êr/Vê¬ׯrH|,F}+ku‘n·–b2»NîˆïÞ‡×Àʓư§Æ®úìÞûV …ŸÓkïÅŒÏt–ňBsДŒon QvŠÉWY‡FŽ’¾)›ý¾ŠÒÒRäFŒwnÔì×R‡Æ’q8åÂà)ÂgϨ+$,©höÇO[³ 4ç³jDWMc™U8ÏyŒÅȲ[¯jªƒÚ’$ æQFÚ)$}¤ïä—üö}GáåÉþ–áMŒ"Ķ*;ÓŽl}ýB9Ûýe2g¿ç¿_XvJ½7+Tá¿DlÎúU`–¾a+‚Í~;§fQ;ÖŽ’O²YV­ü\Œÿ­î=+wÅÈ-7¶<S¤–XGʼnòjPSa8otú¡%è(û!⃗a7†}h;¦ð¥ 4r{&Eé«ÿHhm>Ÿ:S%ÊýKC€ù H¹£ebè¦ÞC»ßcâW´ä^óô=€yÍ=Wzã³FtUUUUUUUUUUUUUU´˜²A¼Îs™q;â]¯Ë„‰ƒ»íg\|©…3DÊ€u…Ÿ^²~cî¦YT—HݼÀ¡¯ÿÿ~î@~[­ãÀÂB_n»r!Xý&Å}UUUUUUUUUUW÷Ç;®…^²Ó~7Vó¡c=¨”Hß­Þ*ÝÀ\*&´pB¿.œlö ¡¼DXŒY[ Ñãk²Ú¬ÿ(’z-Àˆ¿R%¼]; ßÇܤ.3c21Ãp<®kÉ{=ô#“ã@2Œ‚¹9ìe^ªÿÎ,}/ãèþ…53Æ@©“"A îÀz)&^k%“èÍÇ×J郳ó䞨 CÔº -³ÆýÓ ¾3CÆï«[¡À &üÖû¯³Gp˜~:‡~ÑTóàqN¦P޹[Vª¬¡óW£•ߣRD“—odèÈy‰å5âµç÷m—_h§<-¿/m¾T‘uNõ ~SÊîâ"’ü6’ÔÒ6þ³ª‹çš:­3tô]ä8ÌqŽy:»Lw[R=ì $î±S 3a¥L‘‚+ßÄNàÈýÅÇoÂcßô+\Lî]êDN¯@zÅZ`a¤ a½ˆÎvކbØÄÃã5IÖüoöUj™6íÁ;3‹Þù>ªXÜ%a@§Ø¦¯n­ýe¥Ÿ•„ÀkQâh‹±ibƒõyh(›Óà9Â-qfE˜féFø,Å×3æM–qèCÐ$"× @6y™æ¾Å +£i] Ë ð[â}µH•¼§-b3Î]Ú,2矎3æl<%w˜ÙoCÓÿw‡e–ÄY+œñ¾Î>ªX4d—â—štM/ƒtöð `5†æ¼¥#Œëÿ-NÐ<!Ç{ß!V™¨}bâ£.Fmƒ¹k™Ä…‘hD_‡Æc±‡›™±k“¨©¡ltý6›²çB0Ýqp9ûÒ(p·­’ÍÒ4yƒÀÙ·±w»Í9·zi¨öŠŒÌí¦?½Ý2·Ô2~aíS,c½&åêI°›KËÓ1ø\¤[n2§ü§8×Lƾ ‘Ùô÷haÂWYÌÞ™}ºãÖ=«ýÈœ[{tѲý ¢ìì" ÓîØ<±PRqtˆ%i—÷_ZÈ›Þ/Oá4+Q^‚gè}Ocí|Q9áó† 2n‰1¾N(Ÿ»Z/%ã}“vÞNܰ‡àH±‘VˆÓc}qÆ’@“!Ï÷GœNÂ_õZ×~õ™ëüU‘ùÑzp5´…ïJI÷íë6+Î!ñ1À^ŠM-AÒA¬CYŠ )x³¨•žr¸šp¯O“ó¹Ç©Aùl‚w'Ô¢ýí-8"÷Üâü¤–¯ý=Râ¾m*?²ëË@Ü)]rI#ƒ0àý¯©´ïÓ1qÏðn]\O­w)ú¥®Ô ¤ÿ[¾È•5†G–„X%‡Ö(Æ ÄŒH´ø†à÷è"ß_fMþub:ZQþwDbüÒÖ¨RJB ÏÕ ºãúÐz³Griä‘J;ø ŸÆTUÁ‚y{QQÜE”°‡ lÑì¦ÂôšŸ–A¨‡^÷O¨;Â$ÎÐ!0E-}1À[Ë·ˆ¹[šëÃvªxÁúö»ÌO6ÍȻ홒Xª÷g?6¯ÕCI}í#žÆ*Š/4î;A§U:P”ˆorÛBvÓ øVí[Á HÀaì£2éê ôŠ2³vqº±û¨£«VÖÊ9LHÒ9àZû4¯ÝIrqÄ*ÊDî!‡DõØ åæÀoT:tH} ÄSW£®ÁŒ³>äs8º1Âd¨LNñò‚p4„~ÄYÍâ)*oSxÁÛD%^ZH‘ä¼õ˜ÞQä·m«ú_¢È¢ÿ/d»uÖõx.zæT2ÉÁ~f°jÜŒÛðÜ+/Oì6­”Vp­ÿ§†çs¬Í¢°§ÐÙÜÃ:Œ¯EÄ5ßå€ußñÖË· ‡ýjÍÓstkBmÖ%ÔÆè_fLm UË=ë-7 âHsAåÿw¥vŽ-6Xñ¨üZÃÒI‘zpÍóyMï€eg]!¬¸ÌÀ  ;GHw±ŸyÜé`vµ(‚ò!fÍÕ©îCøÅe56‘ä'WuèI5J‡Ò©>bç#M› O°ì²Ú"¼ãUE6@ÆB·+ÇDp1;ógKÌ\ ¯§€ì4lj~Bï@º»ÒØšR*:A—BdlïЫâÈÌ[Ï?¹‰™€°ß<æP?ì”w Ú{YǤ¿m¡ûeÒhI~“5Ô&º–…M޾ˆ‚F'<\‡Ö´¼wF§€]ª¬µÌJµ´Çž¡Û€W¢À)€óÜlXaÙJ´,Ûóm} 2´„1-ëéú‡ hPœÇ6ç¢ ££h9ÖâdÙ:[ö¬7Ç!òXp”sš“_vÝÓŠmñ̸o™XUÚ›R±V¶ä”y$ʳ¿ ñ…A×ÃKûÆÞм3˜ci`æPqHáKÝÔ4|7Öm’×Oêk•qXgNYÓW’vÁ²NÍj¨‰æ>°°ÂµyÎqØ%,€Bœ K01ýù¢\<ÜY°Pñ›ÿrÙ®aï¦7yOÑunÇ ØB.OðIBúú†Ãó“ºuØk^qÒg¦\…ñ=Ê2¾û!H7’ÝkÏueŽ‘f.Y†¸/¥;?3¬x, †scDAPÙ;Ï3ƒ/u¤’)ïíyÔBœì{E]±…*Ÿñ£Ö|_7Ö_W8ô×tyW 󋪈wŠW?n E÷Sæ¬Ø^I´•1vÝAµÚjí…Ày¾•—/¢þr+ò²ïî¼6äÀS\¼Öè;|sz};ž‹´Ž]Á‹`$ãÂâŽàlæ³Ò«¬òQk~öWÝ>Ôø ®0dpœª>\C£<´z¿*¦Ì·ñû·×òY2äN¨ÞRÿS;‹8…'HÓäBßò÷èÈ™g¸\kéÀyNát4éÐãr•‡8q? ül´Lž½D¿g­iLÜûÆc$iÔxÈàúðÉMÈÖpe òOÖkí¤›Á‡ò½ˆ+Â=eˆbNl•ðÍ7‚ ²ªõÐSŸ`á8 vušÝç2g|…‚…Ôw"ûWDÿ  íZÅ?h½"n bzƒªž ª^þ5f®íäóÆèö°‘åò§võqn—Å8”¾®&áL¦)0ÊÓ^8ÌÕ M»—'T…åB@¸ð•´Ø#pçÛšK!bºâÈFa˜kÁçç‹ÒaØÒ Ç~HÇl]+*ÉBëOo`"j2Jv4êD·QâJÿ,ßèèE‡iN9áEC¢t›kfæ+¯ÔG…8tCó­£üà}k1#)–fÚ¦Šò£”Ú~ŸT-Ö¢#öà-%.Èû%Îó‚bå|Êz'¬^À9]Ë·ÈÙsÑn(ÙxÉ)j êWIhžw$·oý6”ŠBtc3dÔTM-šº5b‚¥Õ†ÖƒÚIYä¾'ÊW­UÌ•¡¥jî!“d ßÞXAdñK€&~MˆR·<þo ØöïeÆù%¥“Ùè¡øQüñ Kd6ŽþU"9šµd¼E.ÔØö…QšçUð[™Ò£6HäÓçõÊÞ›zÒ{ÃÈ'YpÃþj …£ÕÚU¯{¯âÍn&0Iq@B)Ö,C•èZŠá‰ššTPH©øU—øÉ ’ ï2JAÔÛíøÆÚežM³{Aæ8­KÔÂůvg•¹Ì@…§¼Cn2Ë6²®Ó‰/…çÎNœ8²·ü¯MùUâ_½ÔàcöÙ'O☀œA…íé–2“ëkÍCÈLí'‹Ù\]‰¾kquïz“ç_[®"4€[qì#ß„õ~ÓzVئ„¢yè"÷ØRå¼ÞvÅ&Ø6# s¾]sà\åA+QqÉ?'-ÕÖ–à-ñ«°¶?³£Ô: ­XiÊ©ì~•O¶4ô«á3¸ áaáŒ{‹²ñð6:ˆk¤ˆ×ôµ° “XÔçÃÝ$ããþÜè W«äb¼a©í«@j¥§ÊqN6Õwñš )‹$ˆ)œ²VÐ;³PºWÓQU&–SüÁ\–ÍX’ù‹Ý˵!· ÌÛ/ãÙ¬AyuGj…ìÇ^ o‚ñöϯi1–ß5êLßÓ]|E³Êb¿QW­Êl™ßl¼ecÇÀ-ê*rCWIPK'Ó»=;œÚ%™êï ôãæ†6A͘Ïl(.!Zê™ÅŽ.b]îÙzg”ÑîÐHkðÅŒØv§ç㟠ä3l_ÂY:™ôi·|pQøƒ:jÙæ½?ÍM7ên8T0º2‹”Þ¥Z×P¸Æcû.AQ·mî%È<£ÚÅMûõ"•êܯbgåÒ's&3ž¶›0 )À úÐ;ìàÍ!s,ÁžÎ‡EçgŒüJAóÓ |/`vשN™À]kÇÇæX)aÃj²èI¸7`†BÞÏû@w‘^þi0X<|a©Ü£á?&4‘^¤k¢„‹¨Â¤dDøI(ȧ©=¿˜àåõGëãàþsqJRJºND˜Æ˜d¹f€ë¹qÅCi²Î–À©ŽŒ#ý]­|ؾæÊúg¶ SÍç6ñÀ6Lñƒš½IËÞ )Ë(C MŦ èžm9ÅP\Y‹yqÇÑìw'>HJlÀ0S |XèYøX*õ`’•„?6ˆØ醪‚;Á” oûÛõLLÌWŽÏà[¢&ö0†±€«ÏZ¨½åª«€€#µ«q#2þ25¸PJÏ ³ï„ ùC-$°=ÝL0 Ÿ¥®>š`ì5ßaÙ‹´úèŽ ÀšQ-“Ò¥§¡º…çÒÊÏL”ÀX¼RȦOìì’ª_fcÈoàó@°@#Kùù¾E‚i×b_PŽ5szßÙÛò¤Æwr‹tì³åä"ü![1CûD Ò…@ºÐQUˆý€Fd¹òîLj¹O0ä½¹‚׆Ñ!ï/H¨—m±ÚÆ_vtÀgrHYF¬F£êûnÑq¬Ц.ñ7æ_ ÏoûâN[º¼}ôûjöŸiw£ñ>E~s®Á¼žªáÍŸ5#€Uôna+XQ­ lºv$Æ“XZ÷k¯¿ÿ_>*ÍÜ@þQz³DR“J†8ÙÕÅ.z‚óš7L gý ‘†J² !^‡ÖÎVÅÿ!nõ,BuDZkaÐò W?yCM”!fÔÛxãEPè8ì[b¼} ‘†J²Äïô4ÄqÀVw¬!T´uš*.æÊ¨ÆÕy Ø?m¨§%Qõpø:’¬h´ñÌ”äKŽ «ÆoÅÂ³âÆ°ÔºØ8ìØéÌG¶O/#›Ÿ„º ØU’[œ¢­ÈÑÇÔè"Á©í¡ÌBñÚm )%RޝáÖvyÁo­O2eñãf& :ºlÇÔÍÆæ–EóÖ© î8ßå ÿÿü>ëý䆵ַ´ü½ží²°ŽµÈtÌTœN×gHQí&ZºütÍ-çÀ8Ëí%?Œ+%fŸ¿ÿt-×ÍŽf™ÒÎ'[—ª¨ÂÿµåäwúÉøƒ†J€HKÿU~Z>ÉÀ¶ôûgµsHc,ôøÉq±Æ§{ÀEÑÙ:)¡ä ¨˜Ó=©*Fƒ«tÌž¯ÛÊ RáÝZnš)Û±ÀìÜV„'¹Ûر›qƒ§aw ËɈ‘÷Ù_A5[d»ýjLªòd#\í¦@1;Ó_váàÄ/4Èæ ‡dj‹¢¢¿6€¾¤È}ÉÃÃìsƒåìÓ²|¦(»á*v¥ê‡õÿÄ©ÐnJO†Ëöý©k³Ûèõˆ‚ûóL$”BñÉÇ’7>`Vx™3dš‡Ý| ågOWÎk´*€°c;1矩ÕÙÃÊž£ãoªBæa ×vÅmÿÊ^ó7S<ÆÏ„»<‹@hSm7zɯmAݳÄgõ- ·?ïþ®o®¾ª.õâ¿Ï+—þÞTÀç;ŒvE[¤'”,QË£xýdêºXœ_÷§]f% }Ý?ÿÿye|ЂM9+fc'²Sp4½Ø $7£ÌÌ2õ¿U†­­‡§((î G"÷à JG»ôÖB¶íÜŽ«ÿe@tìD_fË ¥fWÁ ×sg.ŠæI€­€”Š”*.T"bϨ›º±Úµaw¦ÍjEÅú3 nêEôÄ„ ¨B÷‰Ò•s1±c½Ñ¹»Ö¯ˆ40 ]×V) †=ý{UÏëy}—©¸>;WðBn”!¸ú5Îr F£°‹êÁêíÿpÌÊ ~Àó|“™nÈ8£{¸b©¹ºK}hôÛÒ9˜†³ÂÁ·ÿÿÿý£I"ÝR…>t¨Ö¹%ÿóµD’ãÝ×Z¬z‘îCˆ>ôΛÆN3’¼Q¨4é}»†"$3fÎ!è»×>Ë>;‡úÈãC A"p‚õwæ¦ÞÅË8¡†G0=nþSÉ"«ƒf¹hÊZÎ8m”Ë…9g!ä¶e„ÛëÆ¶µDD ¨ö =±iN¾Ç 3œåJÊwò4ÜhÁ Ñ\Dg)?€>{,­ÇW¾½hm*NîjKlÈÚgZà ó¸P²VDE@­æz®7¯ƒÓÐo†©LèÖ‚Åý Dd±tAߣ À‡ŠN“ñ¼À>5mbé†Wã+Ô­NÎÜ™½ª}¬J)°ƒãâŸá…#?Cw¢çpÔ™ Öx@3â]YäD·Ìø,$‰›Êè‡k—È«fFèògù¯v,D” µÎ(,n¿¯:¢<×–< eìèìÏ{U‡ôЇZ:êqñÓ%gƒƒÃ¬òZGd¿\77$x¥§"rê<%=¾Ýíç'·²XÌÔÝ/¹”MSK!›i¬E+é’Å+L•WKL8»:ðÂ$›ÉDAñCQþÎzI=z‘c +dd§¶ofµ²IÅê…'÷ƒ£âËs¸"lO:!‚ÑÐQ8E‰wôš#v Jºsa]PÜ(tZœà œÒS«Ê‚»¿NC ­üû5{jËö­@‹=à ¡XÑ]ãP)­LÊ–Ž=s¢ä›¢± nktˆ€R_¹èÉr‘ê•仵E¶g1Ø€¯Ú;Ý?œor\PTͰ½}bŪóAµÍŸWGß ploñÂ-ûŒÐ‡Rå#5 (iý†e:<¼• áiáõ¢Ú!¡ jW§!X?XåWAfŠ;U¹ö€¼Ã†%`ÈO6ì÷]8ã¸KíçHË~1ýRK{¤Ù ÷ÎIÁ^[7ÏÝÿSÙù•×'‚Èâ€Ê4¿Æ$§þ9ÁçI h`ŠÏŽ÷á0ö«Qz-`ʶYµ3È;6(ó#s€ÊêOÒ&=àlKÒ2ÔZ56DoïQñ6i¯hëGqçg(½’Öúê:É/Œ×e£—D­ÁVН¹&xwº‚3á¨p=™2ñÆ’x?ÖkF!7FÊ•­ÿBo䪫N¹³ÇR«Ð`¥Á :3IVû…zô&³o¸gV)7zJNÔj¡ª€«R:‹tv§ÌbâÒ[À8Ùç|WêÏw©¼ ™ŒÓì-a‹·$é¢Cä (ºˆ–mIB:Ï’Ð#Ç[v›âÌÄR­+çï÷s§žBmgßZsf:Ðy¢–³›¦âIÖi-iD]Ôf…£UÈä÷>>5ÿ{Ä¡B©Ä(ºE6M8’ÁYz2)„ù¶ª‡´e¸uo¬ßDæ^ ½n¨„ ¯öÎKD †vÓE¨š¤ªÂæ6¿vC ^4òŸO)³¿ørM㉯®”‡‡·'‰ø.EÔº$øbhžúÃ!€tö¥À_ Ðå 19fvÊÎ÷Weå*†hývÇRÆ¥” ß3>·Ü…ó,s±-,HÎ`µ—¥TkF7,%gÑ—©º'dÄ}aߘÏ\“Èfšÿbo`±6Eú¬I÷Bk«F)à‹ú¹`;ôØyu$"ñ0Ã0’R{mÎ{ç^n°JLÚ/ÑK›ß!ŠLYšB!DµÒÑ…w½ —Ô’:ž—3wS¼¢‘8VHæÚ-¶| ÜÐДcûŸt‡M/FùùéÝ ÎÍ@"l¬.i“jò [F\^"+[°âBÙ¬–e4©-?QŒwWÚ¹Ê _Ø?¤ƒË¸¼¼)ÚH’ª,òp?rË~oÚg`k »Â MawYÉ?¶Å Þ1Ëzrþçç6bšbªð-e;Ê%%ƒ6ÄDU+³.>ÞQ RG‹³ÆX"3q{ ùËõS[)d`5|­¶`5Jå‚"Z×cüçÑ1‘ŽM°þñr<*¦jÙò4Fïk$Ô/FlË5(væTÖâæðO±Ø¹Ñ?~À=§ù1ß­Ê>vÙÈ, *ü€ž‰a 6 EÉ¥¾>qÓo">ð¦ Ñ"C%병2‰8¥”ÿûŸó@7t¹6“]û(‚òHvSÖÓo¹] XMH¢/h£Î­Þî:Û‰`˜Á$¦Zƒf®/Ÿ MT†¢ÊBªT¯svᔿ ¤ôÚ«TœBÒìÖ±âØº@ZßÐÆôk¤EsÍgÃ<¹©1&Èá>,²_´òK6 Õ•ç³µ|”G7»g¤yâI‰«q³èÎ.»BckçHŒÑÿVméÙT wà8b+¹§@L6_Dô«qQÝh—±‹"Xé)<éjŽÛûÔø9ÐüÿNã÷ê† ­}. §Ä£jšÇ˜SÐG¾Ã>]^e'Y¡hªià@Ã"(ç)´ŒeOàÜûBž$¬F2¶$úÆú{˜ |Æÿ`ÄF—±±Ø£'Ï¿©J3Ø÷MòÕÞ½²³þ8ó|ŒVq*Oa;ˆý¦^-ŸDçé´ ‚ÇmuHÏ‹[9m$ÅþãŽl‘H¡Sƒ^óÓ¤ñ=@²×úrnâý†ÍÆwW&—r˜ïF™ƒóÙ]¦i…b‚­•ph^¬Qƒ6‘h†¢³0°SDgÂâã¾òŸï´+!óÌÌNÓqPÿ ZíßaU ìg;ŸÂ÷_ÒÒ_]†©¶™îaV FдÂVl £v\OâîÚI‰Z æŒ1‚è£üÙ3FÄ.ÆÕÿõ:ç‰I·ºwPÆÀ µx"¨ ¥Ua×&ç^q³ÃÕÑ:4!;›î.éåMÉ5¶ÆûYp‘‡å|+N@œ½[ãÝÿ)ú˜„Tå@›:>É|<¾Ct"D•°½aEÞS±¹”œ©± }là7<²e¸&Ÿt‘?fô•æÍ»±Ã"?õ·Â+@4É—¨’ÿK‘ˆÌ¥ŸP…Sk«x§:Gÿ,ÌNe• nL{¤Þ £Š{Þ(Ø©ùþÌðø.Ý¢º¶ÄÍç'x¨Â’&YÅÏ ÚÕxñ $¿ZgDÞª‰pò¢xìW¤vä„mžò¥áI'Þ^¶Ò{|õ&júCÖÚÃoÓ¨ ¢ùŠ\’lrdÕ}MÞž1*àžÎfo ÝŽû~äxÊPúÕ%Û)ÚøÆ #@º”Ý·ŽïóœOùràëX†“}‘ç:R û±g7YÇ…õÒ¼Ô¥¬HºP›§Hƒ—_‡•?DO”ÂMrHÂÖ ùŠ›¹¥Ç—6ôp¦&WqÄf¨±ÙÇì‘Û*^_<nb2ÙâÊóLÈKDO, ×TîA¯ÂÑÃe,Jbß*[;î‡å\—(Úoö±üHüm»`ÛŠz_>²,Ô'1Ë–V Z`b&Ê×JC$"zn+¼SÂÍgö .»ôfõJŸ™®×ërÓõ©{>ŸrMS/1®ÑÒ,RÄË=ã?¬v¡pyñÇØm݉샹Æè3ŠóÉEËM SRÈÎá¿Åå©ÏN¥c,?Šdû@›Ö pŠð®ïÿh¾š]-ËŽ“WoˆÊöC• Ö X÷:uÀÙS¯N$ë¼Ða…!±Æ+óÚå9÷䢃&ãœðÙð$‹ºJ¯.Lhç*Ó´S uس/° Ù2˜€ò”Â[Þ°OS"+£¼Pû×aØ™þ—jsºZèº#Q•ngY9½t× Àd±Ê¾ˆt,îårP=³Þi‰Ïåíc7·ZÄ´®ßV)(.þ¸NxþÄæsi¹šŒÝ¡.ÍÒ6Òïê>aݦ¿¢Ã®öï7ßBŽ`Àr:îžD'¿Ë”EÞ&w}a‘.D'%³û/ÇêK_¥)orHå"<¨l¿5î0Åú0‚_½id9U&‚t¸>›õ‚ší àÒ#>óT'Ÿ/+ÂT— µîiªøãgL²hš¢0+‰B4'zÙÕ ú§T†Ñ±3s-›aÌéGb9¼=q¡¤±…àõ›và‹|¸VMìîØK Ä`IÓo!<&.6dîQp8WµÃ“ôGa Þ¦„:/[úÎ$«àzt÷+ôâüÏ«ÔÿWŸ”a´I1VÔÖz aš%›¬Î±”Q8ÿt½°F…h«¦¯Q)µ²ÄT°›¤8{ ¶6¢»Çótï÷ŠBøÔuFZ«¹¦ LºŠØK¿fx ³8Q±CeJ38sÂÝ£úYqزPI®â4îԚ×hgáy<ÑTàz ÇSÛYj?щqYùÞ4 7XCØ’&MFœTcȼ=ÏÖLy¿Zq yï~ 2f‰·Žbá jº _ùÌM0—st–<Ú`ò8Ò‰ª†ïGÜ0‘’˜ÿP”Ç.™ØžA?)KS­ˆlïXn￘´õ‡þŸ¸ÑmÕ•ò3ÍÒ‰mZ‹Õ˰ý‰¡Eºe¥3qS[±A”Mz›½-í†ñ;«íöA"ŸªÇ¡¼ÓΣ£! ŠNýeÃ-·õqH™T½ÁR Xy¸-wk+;?' Y„"…„˜®Ý$jˆÄ* ÛYúšêqðq¸¬]ßTà8³Ò<†­ˆ§R`§V7tºJ£BÙ²T[Ø¡¸,jþKÍvý33¹zxI|¿}øÙ¥Óó쟧ÚF$²¢$”Ƽz"W íÀëÕ¤‡P!o¾)5»ð –·À `ós?1ÿ_'Ìè: äcŠ;ŸlwBšçÃaY˜é"­ˆ l9ù …@]$T‡?Ϋ¼”…ei#«:í, ˜]øZ^£í·× c‘Jù¸—ÁX-_%e®ÚñËë™ 5Ÿ¨K$y•‡šíR´àÁ8ï"­^è !­âþÌúŸƒÂ§„ûÞt3°¹‚*D=ãlÔ£8i qÀ"ÿO³5¬fÎ À°éÌL­:7 X ­NÀ»CyÕ+yì Ji~:¨Hõ8áÆ2Åž¥Éº×`U=2WT¡|Ñ/9ŽsRæ~ɘ]àweä[¸Z¬ ›Ð6𛺤…ð¿¸ÀÉs‰š2Üh¿éñ­ëcH()þ£·{e*ã.s^ØÕ‚ï³5ˆ®5@š™@rÊÐö³L8sjg>¿Û»ç>¹4OF]ž°Ùß-C¬U êJhhÃ"»ýSdËÈÓ‰š%ÑÀ™vö©jhºhv{´…RßšøF^'Z€yÚ G}Êäˆ[yXJCbÄ0=cc•€ÞB7¢ëtY¦ÆƒèÑ'õHÉÜ•ýõ®Ÿ¼¢{G—ãŽo•w—76á×çD}æÙDw †u(ËîÖhâ;Ör´ßwM?q£ß‡Q£ÞNæ™)a)‡ MéØY}}A½& GIúªY–[“Š›vôRü“<»j--ê”±aâU™tˆ_O0{«ê¨›íÔÆÚ¼./Y!mëj'àYNY4[ßîNö‚l*Iä¸ ó} ¬1mgñûƒ_±vÏ>+Ñ{ÛéÒà¾hGäs?¨±,ÎŽ(W…>è]"%Ì‘‰54‘}œË‚Ù¥»d,Y7‡3œüH×óŠxÿ7O›ìz2,qñS.çH4¿7$xÏÓ%g?‚8D>nÖ¼Áцal’ÇAæÆù éÙÜŸ–ž‚cb½Aráqï% ³So•ŲËmPXßy…v2)áôlÀ€']+ÿ)ó™¥Ïsü{ÂU) )Š»ÄìmEë&uîëjÀÌC§Uù©4-è ~ÜèÕ >¾ÿ"|¤vÉÊÏho'%j*Rÿ*1ÇcQ0iÍ%<óŸÛ– ‘$¾*è›faˆz=ÿIP˜¼}cŒiž©¯c*bç/¿O ôÃÑ¡öZ›õõÑFGňޣrÀ­¶öy»CÈe· QL* Ptœ iÏúb7‡ä°u#Níó¤Úòda“/š<Áá•«“9M¬<g+„2ÿ\KVpiXÆþ"Þ¬÷Ö88׃}<»Ó(`]©ïÕ‰˜‹”p«ðPƒPXMTUšÿCŒeÒ¬Tuð±øŸ~ccngéj['z•ev }bïu'éó½0s¸‚|Q’Í×]c-olÃY"‚…Å]|¸|l=\Ù…ŒZ긂T€¢w’ŽÀ²[rx ˆ&Þ]¬ØÛ®$Ë (é0Uër®‹A¾EôXC¤•gEH?é°˜½û\~òÌ83ε·³3ÙyC>¹^ï$”mä—ªJK»zDi¯T¢nM˜mÆ3«ØsTÕ<¸œ¶¿IM¦ 3dφºdÛJqIOy3äêó_ù5«ŠM´ ëSs8Ë,v1‚¯Ü{ŽÙÊ4·rvò‰|q?ËžâËáB‰À—QîFQæ¯3þz‰º!ÖS‹5¬Ü7Ì]4s’•(ÔnF³¬Wíaký’væŽV#‘Á-÷Øc&²:€Ká ½‹ô91- ºE:ã"|Ibp û¢ š6PLL̯çUYMýß• \âV ϤÓ±j"]s½ß;iöª…¶Î z®¡£zv{0üx®ãHPt¼ˆÃùÍ_ÑA=Fâ‡;æ© ¾E<í}."Ó¡fä«ù9ÎçiêCdKMT:Žpj[3}Yâçå ô;–\1ßb5%Þ´®Ã'Яšd¶Ó;Pú|!ÜM̘ýØ v‹‰ˆ±«=ßc\»øF"çÐyÕ÷OÊFwÍ޳Žåò ÁÀŸñÓ»5\‚WÄuë{â ·X¡£ï~•Öå#ÃÚ˜1Ö‰±ƒ| ÉZ}VB¥ªfpNêÚ]zN±É0'gJsxlÉÇb>*º., kbÏâA(þ) š»Ió¹¿ëœ[ÚÔïPèAí ÍЮ+Åsì.8Г׮ÂãÉEÖŠÿy4:TU+šñ“½¶#©ÉÇj¼‹Tû¨ñ˜6õAÛc £^¸QrÀv¶øcÇ*³UçL °+äÌxÈeÈ$ŸÏkàFûXâŒj¯eWº—'T+‹]°„õIîÒD,À»à¤ú÷Oµ‹]  ¯Í`X›¶)~ÆŸ|ðå÷Þ¸òZ¢PVÇiU|X¯¿_"Å8›4²ÈójTi#œKÕÆp§ŽBÆç! KÎ/£èÁ%•~( 꽃:Üɇô+{Y­ÂŽ˜Ž-BD±+™l®!.Ó¼W¶bS­Qˆ˜ï Þž!¿¡Îål^d\Ñé[ `. q)9c¬ÉÚ­êí·ôdbô¬ìœlü Öñøë?öìfmò^…8=“¶„µ«™âÉæ‚©€ŸðÙƒêÈ@Yüms ß.©g¾(‰ðka“ ï0Dƃ;ET`÷î£8V-‰¤PzYDÑ•Ž„:é¤üg™CÑÛ—ô;h @”q²Ñ÷nàÙl¥¤ }ÁÊÊ_ÛÏmXçA*¶ÒÞhc §t ž› i]踴Hý´øK ˆý†bšËiA—fhÂÁÆ2Íj·Ã¶h3ÿ?¿ª’ÞÙfÌ…MS'R)ç«_,I„38C7ÙDà^X{t‹RÇÖS1Âæu¹‚JwF.4~ÀA¸Oi̶–o ¤œ É–4ýå°ÝD®V3ÎJoñBç´ÉÈ{-Ñ–€§c?ȱ9÷Wßbˆ£ÂcYŘvßäïfäGÄÔ+JÔzËžî>G›kMmT`&x‰5J]KÐÁÖ+J\{_C‰X6Ë$KíÎÔ¬\'øž÷[x†X½rÚ_Ûß‚%,ãÕ]såFaVÉ»C4øh4E$ü`sv†‰#ÕĖ΃{«ˆ]yØ Éñç>t¥ÔÉ:êŇ5Ü 8QhÏ–6*1ÿ@7Úà#ßÀ-N‚Ž‚òÇD ”­¦ìÞ×ÞÓØvG“ÀI†Ä ¦ÕBJøÁËë9é*èã`)Ѳg ašt.bØèÚu6ÚÖ…,dÕ .x`¬7:bi\P Èçb7I]axƆgÍÈ +Dc}›:&I­SfÏÐ!‘‚;™o‹ñ<š–ÂÆùõzu¥u³h4¨1¡×¸4óú†+™’/,Ðð×CNrƒ”na¼¤¦)²9·Ëš:f4`¹}aÅ_ÜCJŠ*Iexï: ™„˜ÉñÅíÀtëœÃÁ †xË¡ÂEçÉ÷$çƒZÓ®³@ã Ä:þœîpòz¦â1{ë+èGgO`Œ?Ϲ¹Sg1ˆÀeЍ6ù‘â ë/¤.ÿ {Ž[3 Ã6f{é8õU:ÿw˜éÔüûÄUcBÒÂÑÝ/>Õ(ÑbV¶Ìn纰@€R,Ĩ•ó]!E“Œmºï%†6Š1 «”:Áfc/mÚ ø¨"3òGÆÁ$¬QP3É™ãCæõ¾$ÚwÓZaýôð'&6£ì¤V2ë:KJÒrè$®Q:“©˜sŒÛ];0¬ Òbµy9d ºã6ë_F ªoCuEÏ©»¼ýaŽ\˜iÚô dìýê:QÞepÇ'‹û1uÄ?–ÑS¦ßŸ¯œf÷¼±S5(‰Å2ë]º/A—AVѰMÍ!µj&tiýQçŠÒžïðÌÓâŽKj6¨ì¾çûëcê=3u­pG{ÒI”¿‡D.Œ÷AþjñÛ4¡ªÆðaxcT”Eé’@Ši]R:€Pâݶº´Åí ¼±L 8“¥z³`Ï\>.4Èßi„âÙCNÜÙz[=˜ˆüæ_ºE±þnÓ0|U>XI¼,C–I›X©—(x³þÝ”;ó{¼´ÇT<2gßwVŽkö2t ‡Åy @ûžûš®(VÏÙÚœ€€ó}º}º¿n®~ÐßáµÛÓ‡íè×öè&ýºûz±ß·¡Û|~Ú—öëíÑ¿ÚÕÇöÚÿ[®?í×ióýº¯ûzªý½ þÝÿ7LogŸíéSöègí«?n´~Ý}ýª\?¶ðýº“þÝcŸ8ïÛ°Ÿ·¦Û¼¿¶ôÿ7K?oT¿íèköÝ_¶Œýºk}WÇíVãMZn÷9³º|hDiG¼Þ€¶‘º¥´8J¯*\Õ¿÷Ê_2ÑúeZù”Å{–o|“ ´Ö¢ºÒÌýWkOy¼n›¨%lPJŒ‘I8$µ¦Ü^¯a¼XbëÅÚäýºøø¼a2^»[Lª )7ÝQkÐ~+¥/¸?‚Bî)ü ÃÖ÷[=ÙjSÌ~y¡Ðòf«§‚÷(¤îº’)…±ÌÍV¦ÑE‹GJsß.ð-Šº·‰B'@φΩê:ð-ŽóŸZ‚Mþ qd-Jîä£é*]Éš×B=ä€FÔ>ÄÓ¼›@&° XvxEjPL¯< M7­-„fFëñ (ÉHüRQÛ`wßþ©LøER¹dˆ$´–R6¶f‰L´xƒ ×%ä%¢+yjGŒ¹Ô ÈIì)õÜ­ò:¼!WºrK`¿øi4žòçNhóÜóÿ{Âp^—o†S*¨SŠÙ‚¡ýÚ'rù!ò‘õܪ»;ªÎ̵O.ý?Tg£Š­Ò¢m ‘›ž¨GCÊ5om#¦‰II¢<:DË(È»¾-ÝŸO‘¹žSb†CÙ|Û$·÷±‘Æ8L^GÑ h¹Ñ+‰ño^û@‡1yÆÞÃ|Úé#eüW`•aò#Ô½šà hXGvK+?\ñ¥(GƘÁÖ&Û/V7Œë#WFö#a"bÓ1 Á«ìcÚUO³·S×îÜc†-ï¸ïÚ†9¬Ä§YÎéF…ªµx+¢ëÏÀä Ç–ü[XQ^Í)‘-!ÇðU¹CQÚõÜ0äleÃLC‡3?›ÑQ•p?Ù Øœ/+î4I“Gó4Àq0d—g¢|v¾'TíÞ¡žŽêÛÍ‹ ê±H¸ìšÈ€½ÁW©Ð4Öªå$ì׃ÃiƒËƒ¤rþ¼øeèõö·ýòM –Ô§Â*†ÓXÌC$Ã¥ì”ÊŒuÁ!4ór°€m¦ï BV¸4”¬›8¶Á«õ+©&jeŠ×ƒÁ9J-xTWK΂< xz]ŒôvSZÿ€?ª‰ÖMB~½rîŽPYÊr¥)½·‹™/¨í‚3¤@k"B&ˆt ²(Ž#ÛÏ–òVàÅð´«| i S±ìmëLˆ*_KîÃ_~+Õ·ë1®©¿mÍÏ,O€ønÆVÇž¼ØülÎy„ØásHøîd…µ©Š×»!ÎØ…ˆa"…|wú5 F ŠvžAÍEIQ’Gfö•ig‹E9]Öò&c ÜWæD†´:ølš ?Ùp{=‹š4Êú¸¢¦s¼«Ìýñöp!#¿•fµÝá6+TSyÎǽÓî (_B_mmj|òH¯)D7ÌäÁxpáÃ)Î>¡Ñé娞âcé+ Oï¶ „ê&®»@Ñ×"¢-”Ý~#`zHy™M=\nh7Á^ç?@²/j@c>)õ>Yo}tû"Õµ™9F¸YÁXUl°ó€ŒõðíËP6¿jª&Èêz™ß²…0Ñ! 'Ÿì~Ûcþ‰…{ Šë×%õ¬„Pæ\a÷Ñô &bª{x=–Ίgœ³¬<¦‰ƒk›a ¹¸™±¡(€âŒ=µd`R“S&" Á\¸£A"À‘Ü™GfÕåâ7óEE5ekcHkÇ~;8â‡d¹òð<¹u(Rìdt™OŠÌ~^ÿ”ïVƒû1e_ÓW'¦õz+`¶v¾}µÁJÕÞ'ü°%™çöˈáó‡€ÂêÃÄÕsêdZϦø=òz°¸]+î…ß•¹¹æ$*¾ÆDêï‚åKo5&~Fª8Å3×@–Ï8=pÄîw+Á‘¬v|ÊÞ.à•x(¢¡‰‘Êì$ šÅÿ/sÌ©†|:ZÎY&š.Ÿ—§Þ¼îžQKóÎke 3wco?yé›sbLý\>ÆÑ²ÿhß³<§²Ø«ª/¥Æ¨rs±µ7Ê¢ L%+„ÛXã&s:Ê" p;¨JÕ­uMÊur"ºP4T´4÷“(üœPÒ'BEžîuF˜7ÎÖù-wgi¥& Ý[Ïr¦]­V££ØÞ°òúH=c¤¾÷ÃØ¢vô_Š ŸÆSêh¹(˵Ë}T~Q X’ˆ«/wï)^G£Ö* skJ£ßM‹zrYiT&þSzKÖ ¢1çÆ9©Æ ³Ô õ ?v"?d:ñckŠÚ!Ž‚yÀÛêfÛÑšsõ¹¬ò‚É?‚Îz@óÕ£i 1êFããk°G*ÁÕûì>ˆeÉŸs.ä,–íJ\‰ŽÊç½–³(êQ7Û8ý¥JÛ&ù]2uð}VI@4°I£"„ì‰mž´ñÕgºRšOP\à~ï(·9å•«Èâ6x”Ž©’ò±åËaËì£[Ê&(ëÍk†ðö•àü r,\ufÐüR×ûªEGD¥¤­Äo}£kÖLÚkúuL²þ¢%<£€øö ¡ش:ÚŒKó4î%ÊÕ(¯Y, ~“›q´ö9)ý½vÐV”4|i=UEÁ|1C'ÓëëÓWùd-(ÛlÜði×¢v|}…(âðD‡FwÚ=„ñ(1’pÐRʤ·[(Ê:öäA}pÇj½;Ê0´€˜›w‹%Ýç­/ÕµFe³† s$ÿb:üÄ[‰cÞ›èÅëY…9-L߯öûq!çø3¯øq‚?™t²l/“Ï] þEx›„…ÑÑZñC`“¼§uÆ£D2° 7Èâ½'Û8L5ÏÈÞìëÍ7FoL’?LŽ~Ûe¦t0ø¬öÅLòÞlÝø5;–'‚®„CXißV¹ô^¯Y›Ee©º“ù* Ò!ɲF¹ê†çæ—?.¨lÝnå «ÒU7Œ¨œ'åR¥6£ÍHþhß©—¹¨7Ã~!{o5Byx¬::ÌÉÿYîæ˜“Œ8Tûø^²r´ÞØîWÝ/P>­ÏREÁâi‚f»ó¼¬M5Jî|hçßX¨j×:J³%¥š„vó*©pF.CE¶H/ÇÇ ¿$Ýù³žhØIx}q•€íôV‹lã+»grWÙˆÁÁ[¢#Éqe¥¤ë‚Y¼e´¬•C}ñO>:ï>t lþŒÚŒÂ¨õª2µpnÇÒPlT¶úDÞ¹Èà¬Gy›Ä® ^ÄR—ÕvOÁ‰öiÚ|°ŒÍŸ¨ŽÄn:”£Bm­e‹Ô'¶Ãh[l<=nÄ‘i+G™…ýqVa…tI:–°2©¨P SjÍ_Q *- %§ã—&A*G×÷ôóéá›è—š‚ÄÁž+ü‹ˆÆ }Ï´Åc‡°~ä þ¬ÚÒ:.y˜ Ç® ‹lÙHkl]nå $XüønËäÍðñ†sñ¸fó;ûtµDéÈy äÿr´´MXÑh3‡§[ÓôR™P¹“B2> k¤¡‹æ0°^¤°ä®„ÕJÙáòg`Å£°¯Jp»I>­Ò2n Œ_¿¥î³ì?Ðâ9€y2–ø ÿ/ù†“ÿ6ÔZZ_ŠÈ<Ȱx°fœîŒûÚê„ÝÀ. ç¹÷êlH@M÷¹uhSîŽÔdW#ðd%”%—°GC%•q“÷9ÎÐú±,%Ì–ú#XÜÁ3ßÞ27Ajcˆ–ž³{`7 ¶$°¾Ò@´ÏuÒ»8w-Øe^&a%I aw÷9ìžš'W CO7· ”•=œƒÁÕÄD<ÊÔéˆá˜æ{تÇa0ð~=>ï¹Êì6T¾ø·tü|o#žf‚Á$å¤öýüŸ:¾VìÚ¤ˆ¯‰v–/ûÎý.Ó+ìÎ'¿ùY -v¥;ž–™MJ…Å1`s}"Iyv;Ë2jF¥ÊA#à“nîW£•›æJiìç©¢œ+úZÉ®ì^èB0Œ€‘˺¦õ*uÓÛ@žøØDù€ÕbÒƒJR¬gRÔa‚òϹló}WÚ°I(ØSã uŒŠ  £Â*á†HGWÔYÿWr r½+91d“"¶cHF`L¢¤°éúdX©–•²ÿC£ö÷_[D¸è >~7 x½S°Ovâ;„Ò °©Ü·æÈ{©]9áØ6W;öŸì19 b¹¯­úU7 ÇäÏe_n_ciÑ,ZÉnp=TwÏ›z ˆæàÅôæFëÉK·l°¬_°¤ÆLЉ òò¾“q`’¹î0‚H­¹±ÿDr0ïôúøX[Õž¥§DVMôºm±,Aö¬/º³Úù–'œjKk½M,£+'Æ¥eߪºðHȆi°æn N Ü¿±üJ„qûÑþBÕˆ.¨Û锨C 7µæŒ/5¢K´U>ÛýÍËÉ>mX玹-SÐ3³æÊnÍ—‚ò¡°[hx«ÒÇPäÉ2ŒNë56_׬A²”Ï'êÉ{YguX6à7aeS-µÄÉÓ3™©˜ 4á+hD¶êÄ¡’H¸]\©a…¼ˆ&¾î4ÍËi,Tlˆ8Êòq$C™üÌ{ãyæUas%žf—4»Lu‡¾•Î Ê ²°s›{ir=O:tï\2ËWq"« Ãq$‡K>ñ®ØÊ*Єö~³2è{‹–¥/]‚4t­£ r»«Íç;\ÎJŸÙÐ ìñÂÿ5£,¶Ilý°†È/=VŒ©Š¸sð|Y©» ½· 2Ô÷Y[ (GØu§]“?a;«|I\tß ÎêÒ÷¡´ËšUö×\¢jEöXüºñ³zÃÅa8I¥öÊKÍpáÞ `dÚ7áÿ§4‘©Î0T L¸†øw H›»PÖéE>$ðàÌW1©é±ë›†í9 E£ûMˆ² ‰)ʲ—s§lŒù·Dº¶­)/‘]yÕ²¦ò?ø—Ä4¶òßYt³@éöH&(\`΄?*½L ·) À3û7cÆ7PÔ½ ÍvÌ…´FƒK禈š/Ù¬¨H”LËì¬îÕh·¯¼9ùßÈ!piÔá¼+3xIªvè“…’ ÙlCø"•}\T–_µèîgqÑîpæ'6Ü(ªêÊÆ?_²l㎌¸`×î•Z1§A¾»ðæ?%[èVl?ƒ`­Âb:(˜;§j9<¬:Ž<3 ú=bœ-~“qùÃ*XÔ– /ê]:ùJ4€¤¸¨|:“$H9ˆ'i’¸/§ dƒ/Í9a™ñ¡·i* î^·.û`–SÏ510å¤çä8gH5ÓúfÉÂn½?0÷s'J†„tÏæ{öy“ AF&úuñ6²àÑ#³OÐRãÖÎGd/¶\ÍÑÂÆ»ŒœÇ¹ø)~‹2 x×”µO\ª„l‹'uÉlþàª-dùøèb¦Ž*é¶ßCU@@žr6ùÜ¿¾ZÐbÕu¼\¢ŽÛ¶™{»PoŠãÓJA›œO åg&q‘­vvìÀAk(a…›Q…zéÓï:ã bÍâÒCþXc¼XÏ44†(V‰÷}¢0øS`M¨É á` |9àçšÉ;ÀÌQY°ÀzU(‘¥LX:àGëùA ¶…h´»y”kLÕà²ÔÖä;/__J`R¾y4 œUÏÊ}êI.6—ÿbž\#TXm"Ö0ZqˆEP©ZšiІ`8è5x9Tí ºÔ1SˆpIH"ÿ|ºe¶çäÝÅëg\±q£—³×oÀD-qL%­çNÏ´ß;’ùÀ¥ÆÍõK |)Ï“­åæØ5ûkŒG’õ±O(–§rU+¹ø.Ã]»¾3Vfp溮øk(GRùôOšeâ`" ·D5#Ë °v¦ (w=÷Bþý¸ÀA°']!ú¿Å°í‡€úAõÉœ&âÜ/úŠø!û«:„­OÜs”Qd÷}t½D/T3§:¸¨øtW3)ڥѣµþÓbÚS5éIMþÑ·=äÆ}¹7qbeHÈ{=R_Ÿ)®<Áá=²fƒ²‹´%ü_.W˜!Tˆ‡• ƪO+Åøÿ=}ù, ÌÌ|Zh?C=L׳cFžâÿu=`üý5t·"5 •)¯1êxÔ´snÁ½tD[/ 4"°$åp÷Àkߘÿ$swÑÖMFM¬˜uBb¦m΂,àNÆÔ :÷ôÑþîYý³0ÍáPFúLóø6©Þº¨RDkèâþ¼:â¶Ö‡ÏÞ€©+Œnßá”ZÕªmÏUÇÿ<>í‚CÛž債®+ ­¦Ò¦)óŽÁ&qè}6ãÊ¡ L’yfPï…<õp†å˜MyWP(5„!›à»")­È Ne7wˆ„‘Ó{ðr§w¾lÂÄ\¢¢'¨¦·`0]Ô²'Ùëdtvå’é\Ðbç¤ßŽ‚=Tb`¡FY&ÇþŠSªëTç}ƒ_cZIb­È’"MÁ–imkÇADùÔ }_Þf=MK©A%-vÎs®yäW„7 |§ô^ß}€~ùˆ_*6⇬oêϸ Y !9)^å¨1Ñ*“=EËö@¶0Ò9–X_à ¹ìçµx1_º¸r¨ M knpÞAT õHÿ òØf.Z-ëÈÀBtêîcé;AåA­Ýh-6*BfÁeŠSÊl?$_sOjDT™0·]vŽ—RT!jG]`O&’|%:g-l=;¯‰Zµ§Ã/?2Åý%WÇá ¯ò3Óf¢é§éô·v…1¦kk/9GŸ›¬ ÀS#=b¨ç×ð$ò}ïL±Ip!Ç Î ú>R¯1„ ¡ £vœ3UÉ‚ß̆½§ïÇ0vVw$Ø—I¦«ÿKô‰p„yWêäi%p®Ëˆ9•a~ `•bçÄO®é@a…Ç70&øq¶Ë+ŽVãx–$g_D‚*w†\ÝnoÃ4=Yz˜c©sŸ¹±AŽ L³ð6ü±Ÿ¯ã‚Øq%D¾{ø™¢9ï°Ù|IO´xsÙ§sNŠÅu^-q)]õ·ÕsÏàÇ(G®ãZü¶ À®ç‚¤mj©¹0ì)p&gGæÐkz{0T–koÁW@úU‹PX×ñ¥·U"„KâeëÉ!ˆ…Ý|ážÚCy>Ã2¨½½š5÷æ’ý‹,³ó‡LþXß}µ„#– GÅÙ}ïº Õ Rdˆ1_Ý}È;‚Öºšâ³ý°*o¨' Ó0èŠk5—-)Á¯"à?tDžJm:Ü&èD=œŒd­†Œ™'Ë»$f™8ï'µ >=zäèrÛ¦Ë v]*ƒf£¸ áuoø‘kú„v‚0Ê{VqGJl‘PÂ,%æTºMQª@ù4Û×cèd—ã£P™³ýCuÿôw¾§Õ’ÞÕTS¡Á äõ!Oã+ƾ‡ ñÃKzO“Pð'o“7ËiVÀ™áº6v¨Ù¯(窵•æK #-þ¡¨«ÍÉñ’ai§NZ‰ZsÂ-°ˆIíÌËÀ/]XypZïA#òû ûk’ VZ'voÏc H%à(çÂ\ˆyØô¢?Ëz` z£Å8êúD¶i€Í9h°!¥“¢:â‡é¸ûÔäèÞ8ßR[UYX2¿YÛIïr²ÎSÝl‡Wü+¢OK”Rî䦭¼!>…tcGdpÉ`Ììç(À¶àÔÏWAP¤`"2L9±šaà:LBﶺâ8à6)ÅÆShzÙ¶Ø Ó W€ûzÝŸ‡Óh ‡}êáÕv¶‚.c³¸¦gŸd [•ŒmZm&C[Î}©¹¥­°‚É'øgäOZ¨SB ùŒPý$gs§r¢ 7ŒTùrÝË¿WD. « s€óâüœ¥!Þ*1¢o‰êj×fë¹›JÄà»3ëH±|pÓ­:ŠÊŽtâÆX-±È4ƒˆ´¸‹Ëuz5=ïk¢Ë3 ÜÙòPîñc¡æÌT )ïüPàZ¦¬â[¶èÁš$…¥¨Yžå +Gß Öûj_wƒ±³gFŠa’ §6@%¥€Ã/WßxyUÇÉäï÷¬¬{ÿ[=Œ‹::Î?­doP  l>õò•¯½ÜOž'ü€’M|\3èàUC–ÛuF‘¢“vŽÒôʯ t÷Ð9ÿM¨°Òtù5ÁE xkþÜ!ž!jô¢—hÑ8YF=\ ½»÷ž½›Á 0ˆæ:›o¸ âlŽ&üXx†uò‰<$L@t›JÛ/({ÕöM¬èlG 6µÇqkÅñ3ÄÄÄF#YÅŠ»•2ÖDÞÿƒ ð˜CÁõûº.Óœ˜?Zqg ºmÕ ¦†îYyÿp¹r¡è nd(ƒ³Ò¥$°–è‡Ì´@n£(­/ÛÚNÐä Nã=–‚A‰°¼mÿ)@|Õ¦òÚ%Ï{jèHÇóÚ!`EÚ¸ Èñ\ӬȃþÁV…AV¿[C$Vƒ34L–Îp‚jÒHF^¨L2 æÀåò°ù¹ò¬•»B_à ülW!ÂBßþ&àÀLðßieC9Ôþž,æß3KJ;Þ¢ˆÉ4†!ž÷7[ã3“µÔ5Kÿ„…‡Ï#Ĩ®†Œ•0F%’¹cðŠø*U>w!önûØ—âNKû1‘œêUŠE%¬ÒÔt¨v|ãõU°HÊŽ­æ0=T4LX¤—¿ªWb7 iYö:^¬hDz8i>Â0=åC¤ƒ¸FRˈOXÚ!üÈÊ,´¢+GéÓÆ1z¥^_¶2N›žæ%RI)L\”yÃjt=–¥ r }ó½ÖÀ’6-ž¾j§{@œxèé©7oTÕyD=¥I|·µÿX' ƒ³çÇÖ•s½ž5ŸØ}žHcãÈx}›ùËnEÍ¥lï{²ÍcëÉædb+CŒŽŠ/–zGgr­”Å/ˆý»:iãH € UÈö8}d  §LáÔÚXŸÿ].)œUzå q'Á)4«Ö§Qš„ lÙÓ››¶N˜DðTL“ë*Í8Ü(³¤E'MOÏÔ ‘]Õ žR%Z´fŒ»÷f9Þ(ÖÄ”>!ÂújïE¥-'*EÇô÷œ{´ÕbΚ‚¼Dkî V`l“§_wï(|éžfh“èÆÌ§<Ÿt}°ìéÏžž¤-uaºé)MÓ¤þ=€šÒiˆøç‰Šj×úuôuñ“² ¦P­«óÅ‚•:…`t ÒˆìNq@~ïvB÷|䄤û‰ø ãT ?›Ä_˜Fqâà,Ž^‡ÑPî·ÊæskÓA{S “´JÌQ¨p‹™¨8Êg©*TTƧ¯„¯(„¤ÐKMÁ’>Ò0‰ùœ®h#€˜Ÿø%ol+f]6v˜Õç'7ˆª=é¬<.Ç¥ò­ÐZÁüÛ ïPN‹xÄ£­ì£™PÅ=>Q9ô\ÒxZ¦óÄz€“ïp«&fñ/'‡Ÿ¯ö»eh`êx½#˜?:R_Lßr]Ç*(ái: b¥QžZ„òÂêÖþí]´eåó,î“ _)|õTYòeQYÑ`–¦ ”_ZħñKS!1,:ýL¶IÄNÞz#ÖŠ3ùkÁ¬O:à0ôò“0ûªÂKÑSÌ«»›O~ºX/Žª|… ¬&Â/H28—ƒDEqü² ç$täÃûªDõk90ãÁÔF&#ALHÛIޤó{}`¿ ÉôKܳuƒaÀͬ§7Ð|Ãn‡#;òº±ÿXìyX`h£äª,'×âÁôñì"¾Äm÷½Œæž#"ШKþ™3e, %þn’¡©âPtV¼c9çòŒ>šàjÝé©å¡D¶­[SËÙÔÁiõZÿsP¹Žj fÒMó­°Ž©Z‡$´Èñ™0½[ëaÀÑ9Ú„6GEä32–¨š<ÀãU’ö{•n ªúæÄdjš½Â @‘e¼é&|bõIXW8’fÍLˆêý]¯ûبõzÀH M@Üv™VhG‹|uêïßo­+º·IEÎVÁµo-óîaY´àL(÷(ó©Úc’#‰Ùöj$ûšÖ98KjQê¢dbÐ1µ&d«ö9þNÓ¾µV¥ý”CW;Bá\¥MN@ÈŸ¡‹“äDz|‘`9ÿÿ~š²æñ5[cÊRr¬œvysT+ÍN¬.î ë0 {³ŒÕåÖ½o†鎽ã1CÇ(¥Nˆ3”ìLšò»<”ò ߆¡DqþgC¾iëÊî=¨f§2Ã]ï¦dª?ïíûà§Ï7W¡#wKáK²Î¯v³R‘"¬$GmGØ7·‹§¯ÞËÿoÕ '¼c„jŠ%ñ¶ä1 Ò¹kÇ,œ°­ç¹¬Š!iÔƒN/ÌÃÙ°*.%ÿj46;Úìòè=cÑA$Ê Ç0S4R¶À9&ëǬûs ŸoÐqF4ª;4¡×ø³…6Oü5ÕÍSdîêÛ¨¢Â”Õcdæ´›”¦ ì«NKºY•ÿh÷»¶˜ç}5®”°^0½ÊžØÇÁ§!/2Q ¸í€c]³–9¥ý…7¹­Ç6I74†*œóß²eõ´XRÿ’ï÷âøï°Àªgo¯ã}R›÷~…o<ºê@ºN¢#jÙY9gà,âð ¼xsµË¯ã;€ûýÍ;eaw[ÃÄÞÄÔn\ãWiîµ/tpõÚ"9@RÁRýµYÿú³9¨HV•F±EM¢)XXoå&ã‚3>×I z|þ¡x®<ÅøX¢tûîüŽÊíLaZÃX/åokxŸóð­ÿwè˱çßurëÕÇX,œ’ÃE:¢d á÷(}ÍéÔà H+I$’I$’I$’I$’I$’I$“7:õÇI£Ý*½ËXY¢8TU } ×FIeÏKÁÙ™ ‡R+ß‚`4ÒÉ…5݇¥ýc ˆ‘ÕV‘F;«Ì7"]Ìró›˜å^†W)󳻯N2ÝÑž¹–Óaû¨‚]¸£ßŽ…7²ÁY‰Ê÷W,@_kÐK£RÞí_$FO ËËÝ›YÔõžpù`4gW1Õ>oÏÏßQ|Ž=ÂAiÚ–s0m!ØS!¢1ÍÛ5b`ÖÆðƒP&í ŠlKùÝ5î©XH]:BëW¸Çã)”¿Âq:ìŽ B‹ v74BœQý{sê³ÁébH[>Ç(3ü¤=͵ Ön¡*«Ñ³k¡@mãxzó›Í.Â\{)©Ê£bÃGÂ4,?È;Õ\šngãûލÔ(m¡‡àØ‹òt ;üÌ{vŒj52÷Mu Ñým0YX­…¨­ »jôƒ3f@[kã-ûA¤£ðô^ÞyH¯å uCŠOO~×ã ün@¬Êc5òNˆÔ¼·Ç_9”‡l.©È*JåÛ LÒevÓ\Žò…’Úšíò/küêtV3kÒV«( ›ŸÑÒŽN‡Ã1A—D&x$D3}mÁä zòAà®A*8%°äÌšÐ9Õ`(HÍZ–‚”ÂÕB<¤³M<°uJGûýáCÕ5žo{Nâ‰Óið[ä‰/hÑȈîWÕI,A ‚¦ž9-úZäóx%“u§˜ ® åþGÃ*¤þØá°¶ ÅYúÒ¿-Já+‡sÓxcðèµ’ -ÓFÕ®…UðÂiãµh’®Š¬ëŒE޴ή­õ„kU0‡ƒ­Ârô6‚ëgF«×8ÓOŒðT§}:/ÄÁ¦…Â[Ÿ§u§Ñu˜Ug<ç´={¶àg´1Üg¹óÆ×é1åÉÐ\"rp»òƒY´jÓ*,Ø>¶×EìMÇe¤P)ø}WÕ]­t{Ã`ž‚K‰^%ä]Ÿ?Wø‹%Ëç/µ™R¾]t$^æè/V£^,š+ÇÌKh?}Ïrlž #•Q‹o^®Ë®ßÈL "FXR3Áøe*ÑÙ!4¼Ÿb­" Ð’b©Ý{’x¬ì)U¹ÎŸ—½Ê·ã[N¥,Õ?:À¡ëyøãüSÝ—yÖî Øj‰®r)w+®’§ îCxãh;ç--Á b;í:waî#ËNËÛ ÀÛVˆÊí$FoÑ_iKÎ@²õ.OM&b` 3üÌ`žW(„ÅÏœûwY8§Cð³ùÉ®-Jü“X‰ŽÉã \e’䆻ofç”lÄ21 ¸º®ë-h0Ö4&(ÉžíêHª)(KÚ·xPæ3–¸¤Yñ­í+Ø HB0UQ«¬øíW[ð€«×KoâfY#V‚£Dfsj|#–pNyÛ 8Àü¬Ni‡z“j‰†Ô`Úw––ÿ(‘  qäÈé¿J9U‚0ákúÿL=ˆé³§E_ö ØIý~~*U§† Tyé #øôÕÃÐc¤[®)m\©¯U 4 +ÄXih=¶®RPaòEVy2Žáñ£•ú|†£à„îÏÌ‚«µ0RëB4ÜÅÞL‘áüãP¥y˜¥/*x +&©œª’ jŸÑ‘f =JJòŽj‡C`öŒmM¬w·ÑLÆÀ¨w´quží§ž@":që3BOdaß–Q1èþ‰ ¤ †nIPJQ—¯öÜÛIeãÄ"—{²:k>E|à1ŒÜê!,­®£^bèÏ­$÷£ZÉx¯´qÞ¥+å®wƒzØîË-Î_~NŒÜ8aå,Ò­ûYI•8.ÖÓ&òðÞ4Ô§kmõ³ù ’m&ßýÓîŽ;ÝápÍüË|ÍkL[ÎNWr£Àÿ®¶T(ƺ°ºÉ­>r´ÅóL‡u-ÚéöÔ? ÙSEŸƒíÃÏdw­÷Z˜l†ÈßbÕŠB³ä.aºû¿Z½pt,võÕ‡¨w¾**V_Ã6xsÿs]ðË4‹ã ¾…¤ô¢n»C’éli+|j+XWÈá¾zÞbê(áK̲y’XíBwt,$A!K¢A†€ðÜñl˜ "vÁâ‡g‚äîÝ)åÎD1÷Ãñ»Íæ{î¾é#êÜXŽŸvTÓ·E´ç·wRíQìÆd0&î»ÕA²ebó¦çIƒºÔ2~ù×äì®°À]öŒ*æ¼›èOh†Àè& Tl[A °Uvc¥›ÍÈ jƒëjË¿Önibß[{ †¯È_·i7Ð8]ÁÿxãðÓ¿ûñéÊ®—>mžÃæúsDìÙÐ}Ýa'V‘ïdlà¿Úb~á™F^èâØÔâ«à\”£0J+6,– WÊ.ʉ/’¾ö~w‡–‚ÃE§ÆŸG l(ÿYq”µüÉÍ%Ðý-¬‘ìX@ºjÚ ± 't;+¬¼¥äà'AJx¾:5m…&âÙ¸§÷¨Ønæ«òTƒHéÎ(2¦¥d©KÐÃaRâ\Â5cÑ’‘œäÍd}Â^Ç`3З7Ždv7ZXX—Ò¯÷\F‘d S0}Ô¥ØH,˜ÚŸãxZâ™9dµ$÷xrã}¶Á¾¸Ò“\Í|Þåß¼2¿D:ÓBÄršqÆäù'§êåXÌ ÷îÍÔdc…ó¥W%füî1a6ñ.Î$2éôüY#ô7.¿¬RïNEƒt–, ï¸õ·¸Üz¯²:‰t⪾ß)r"N' ŽK‘#MK=ü3ARÛ€GT«¾@mÀŒ›ƒiÒhá'ŒëY´÷òó'ªQ:&‡ž×·“4…{uë)äÕ_бøò-’ñØ´e»³É+ë0'0àC_>gÄ-Âþþ»4-D‚¢BrŽUË@ŽénË“-‰¾í.z1徊eƒñí7¼#²™Ð#d`žP>ú¾Bj1Ú‡Q?,¥B…cÈ<<ðÏ ‡ []t'[ÔÎÂÆŒC¬˜D²yí(ˆFÛÕª¯p¡÷‘ÛÍÁËxvŠ ¥Rpÿ"$ïrp{øT¡½¨º‹àù$üBIîë¬4ß3g»'a=ÔÀ|êÛØyçÚX¨™ŠN†1^{¥~ ýà5zŸ/gáU¤NbC1‰œ ­¤»Åç®k…˜´^ ÝcɇÂ<{¹¶è¯#Y]¼hÎuÃÑ%j-º®âZ¨»¹ÜJŒ‘JÓ¯55ææ•¨¯ð"!LŠ7h“*_ï))?—1‘[a’ëb¶ˆï2dœíÍ 9?S3e½B˜Ç¯L"†??@A¹é;³ó‰(fõÑÄ2´ðXñ¡¼„öa|¡·‚8±ãN …%$áRvEp)‹=Í.uØõ£½Ø€ó¶Ëݲ©"?ç¾ÅVo2V9zÉrŠÉ9$®˜É#1™GIÆ_>á#•zm!?nJzHÀšh ße¢Á¢æ@wCЭ¡É ç µY½µñIf+?ø„7»É³h]¦S`›ƒè¿æwk !¦‘c; NèŸÐ.6Ϯҧl¤‰:™©¿ Çç|ò1QþÊPšÞ«8.A\Š´µlÐKV¤ƒ˜ö•îyÙWVãŸ'ŸžîN‰V§4â ¾öOp'&åký}#%¡M{KšƒH¼Â1Ú T¼ÙûŒÄ¿7ewÒOüËî—ñ! Ì¨›ðL_‡Y6}"‹Y#q%q\xLÌü»:2¬Hˆó*Ú瘥Y4™R´xZ~}v9M<ÏvΤtZšf¨¾†"L=’õÔpN@ï÷MJõ[ÕqÄÇ¥a^5¼œìã.i ÓØ‚£¾Ô}C@íø„þ(ñõÈ-’ŠêüLÆQ6¿«K%$·(’f~"¶H¾¯õÚÈÑ?ÿï{Ï4 ÆR?®*ÄÀ»Ž”¢²ï€·ÂG²ßã¨o®ìÞØ\Ùâ$5Ò¦Œ[ÓXÅ£åB¡4·FKX˜ÑPã1Tž¶>‡VG Å=5¢ÀåÂÚ§áŒ!•K²6{»b(Õ_Dz@à±À>øtwuœ’ïaG«ñ¾÷‘†.ødt“Ûåî ã_¤/Xïþƃ yá¤'ð‰õè;H0œËŒpÜU¼‚²|G€GÂÛ!7‹›G»KT(PQñX¡„ÕM5¥i l;"=·42쫼P(óÌ¢4ÍbÚ­2¦¯(|KVN ¬|Ëó&"ØwäÉ€°6ËL_}M¥=séxÆÒ°øtn„ƒÍ\ ¶`£·¾÷y‹AÃ+_zTB4Z~øîž Ô§(CJû%éiͳnQ|äõvÅGkÖ_¥Ã¼°n°g3þ#+|œêtØûàÔœB—?Ó–'IïÐÅÿ_ ’¬øÍ†Ì>Ú2‚QŸ ˆöí³ê°ð|¥X©‚†Ýiä…4‹4Ð lBISç²ò- 2 þ’,z‚Æ´&›^¦B¸%Ñk* ˆ—_H;iò]È0ÌDþVAMÑ`ª¹`¬×‰õy9ªŠªÐKVQ¡UpzЕ˹2>„ÉÝô;˻cR›Ã2é¾±‚ïU#7¡—›S¹eÉR×…ô±„o½û¨‰#í Ïé¹÷-UEm¦¬ú6¶Šøž©&ºš4´œwñk!bÓÅn 5Õ“­’d9NrÕÇ¤Úø·d´<_Î?¸mŒÕ¯rõyt§Èé Å÷sløÇ†Â´æyf5-|®=ñ€Bš'ìRЀ"Ô¼@»ÖdNëmbf<‘ç¿rÁ¾«öíʉ^ØÂ'r΀s¯¢²,@HÉÚ`\ UÊ¢eÖï+û‡Ñ_¬Ä*§8”?gnr*øêKæ³y*ÊFwšÆGx;LÐì,áÑ^Òn‰CܱàÉzï EÜÉ (5Å×ÐC­ņª0HÓø¡¼ŠÑ®Àƒó™8n’%–bñœìCúäZÛalçw‡'_½/8­øöe?ʶlë<8„ÔaÚRni/¤T «í;ÐWJMZÎ:N\jÄŒ[:`n³I«.eÀr1dâ.”8°¾ÙûaŸk·ö~5@¦peyýe …¸¥J_ôxÏ£/3-óÛiQlõ›éÂâaUë®uúpý…r—Þ·’GO׳càê‚Ë7wÒ¥Ðø)œÜû4¬F³Ú[GÍ¥Xƒsñ÷%ž¦Rrw´páÄ/ß]Ü rã =7ݵ4ÿ_&&îæúèY±&NÕœ] âÃjñþQ¬ìæfC)ÎôœþQ_6PçqáIk•>¾iYb'A½íß±£|_2kDÂ=;_† {ý]ÿÙicnV Bðangband-3.5.1/src/osx/Save.icns0000644000175000017500000035166112456456606015630 0ustar chriscchriscicnsÓ±is32ÛV€MO\…lúËÌÌÕïòI„ \ɶ·¸¶¶Õÿ\ƒ `幺¹ÁßÄÿÿm‚ cÿêϽèÛÃüÿÿ7`àÏý٢ûùùûóò¤_ÐÆÒÑñ‰¡­ÅÉ­}`ÓÛòîþò“½àÚ¨ŠèaØÄÅÃýÜ—€ÿ飀LaÙÆÆÅý3zæ¦Ï«,ÎbÛÈÈÇy-ÿ…N)Á†IbÜÉÉÆ4äœBýºÖ+aÛÈËÅ2ÿ&¹ÿ4ÿJqgôÞÊä,£ÌCi@SR€ ^òëÙñ¶“•Ƶ ¼BRJNÕV€MO\…lúËÌÌÕïòI„ \ɶ·¸¶¶Õÿ\ƒ `幺¹ÁßÄÿÿm‚ cÿêϽèÛÃüÿÿ7`àÏý٢ûùùûóò¤_ÐÆÒÑñ‰¡­ÅÉ­}`ÓÛòîþò“½àÚ¨ŠèaØÄÅÃýÜ—€ÿ飀LaÙÆÆÅý3zæ¦Ï«,ÎbÛÈÈÇy-ÿ…N)Á†IbÜÉÉÆ4äœBýºÖ+aÛÈËÅ2ÿ&¹ÿ4ÿJqgôÞÊä,£ÌCi@SR€ ^òëÙñ¶“•Ƶ ¼BRJNÕV€MO\…lúËÌÌÕïòI„ \ɶ·¸¶¶Õÿ\ƒ `幺¹ÁßÄÿÿm‚ cÿêϽèÛÃüÿÿ7`àÏý٢ûùùûóò¤_ÐÆÒÑñ‰¡­ÅÉ­}`ÓÛòîþò“½àÚ¨ŠèaØÄÅÃýÜ—€ÿ飀LaÙÆÆÅý3zæ¦Ï«,ÎbÛÈÈÇy-ÿ…N)Á†IbÜÉÉÆ4äœBýºÖ+aÛÈËÅ2ÿ&¹ÿ4ÿJqgôÞÊä,£ÌCi@SR€ ^òëÙñ¶“•Ƶ ¼BRJNÕs8mkºÖÕÕÕÕØ‚Ýÿÿÿÿÿÿþ¤Ùÿÿÿÿÿÿÿÿ®Ùÿÿÿÿÿÿÿÿÿ¶ÙÿÿÿÿÿÿÿÿÿÿŒÙÿÿÿÿÿÿÿÿÿÿùòåÙÿÿÿÿÿÿÿÿÿÿÿÿÿÙÿÿÿÿÿÿÿÿÿÿÿÿòÙÿÿÿÿÿÿÿÿÿÿÿÿÙÿÿÿÿÿÿÿÿÿÿÿÿòÙÿÿÿÿÿÿÿÿÿÿÿÿòÙÿÿÿÿÿÿÿÿÿÿÿÿòÙÿÿÿÿÿÿÿÿÿÿÿÿòÚÿÿÿÿÿÿÿÿÿÿÿÿØÿÿÿÿÿÿÿÿÿÿÿ˜§¦¦¦¦úúúúûúil32 GŽ ˆìëæÈrŒóëÛ¶¸¸·¹¸µÓéâÖ͘‹óåÊ·¾Â´Å·¾ÃãÛÕº¼ÁŠñ³²±³µ®·°´±¯´©˜¶÷À‰ð³Å»¾Á¶Ä¸¿À´Á®¥´ÿ÷Àˆõ˺·»¾´À¶¼¶ÈŬ·ÿÿøÀ‡øóݳ·º²½´¶ÑõñîÞ¸ˆux—†ùîêÝÝܸȹÞèìèåÛÅ®Ÿ~‰‚T…úñò€ô»¶Á÷õ¸´´«£¢›¤ }…ûÝÚÛÛڹ͹ÜܶͽÅÀ·Ä¶È¿ž†ø¸Âº¼À·Äº¾À¶ÀÇÅÃÿ³ÁÀ¢†úºÄ½¾Â·Äº¿À±Úùöö÷ð¸ÃÁ¥†ú¾Î½àÞßÝÜÚÙÆ1ÀóóôñàÜ鮆ý»¾Ëþúûùø^xž€õøøÿ½2‚þÁÒÃêæçæçæòñÝ{÷o€‡„‰‹Ô VÅ‚ÿ¾Æ½À»Ľ½Ýóó£zyñÿÿÙmcÿHƒ ÿÀËÃÆÉÀÌÃÄÞ€õN݃ÿ®G„ÿÂÏÆÊÍÃÐÆÉÞ÷÷Dz…ÿk„ÿ¿Å¿ÁýƿÃËøøeE­ÎÎ×Å£lDƒÿÅÖÌÐÓÈØÌÐÖúw jÕέ“¤¹ä&H‚ÿÁÇÁÞÇÀÁä® cûûíA„¡{,&‚ÿÄÑÈÌÏÅÒÈÊè=&ãýÌ57Œ15>‚ÿÅÒÈËÎÅÒÈɵuþö;5ïþœ€'5‚ÿÂÈÃÅÇÀÊ•§ÿŸ ¤ÿÿ§¯ ?‚ÿÆÚÍÓ×ËÚÍφ¬ÿpÇÿÿ]/ÿ9!‚ÿÌÉÈÀŽÈÈÆ¦ÿ—†ï3ë+JƒÿÛÏÆøÿÿß!-ùÿA..f&"EƒÿçÒÌÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ˆìëæÈrŒóëÛ¶¸¸·¹¸µÓéâÖ͘‹óåÊ·¾Â´Å·¾ÃãÛÕº¼ÁŠñ³²±³µ®·°´±¯´©˜¶÷À‰ð³Å»¾Á¶Ä¸¿À´Á®¥´ÿ÷Àˆõ˺·»¾´À¶¼¶ÈŬ·ÿÿøÀ‡øóݳ·º²½´¶ÑõñîÞ¸ˆux—†ùîêÝÝܸȹÞèìèåÛÅ®Ÿ~‰‚T…úñò€ô»¶Á÷õ¸´´«£¢›¤ }…ûÝÚÛÛڹ͹ÜܶͽÅÀ·Ä¶È¿ž†ø¸Âº¼À·Äº¾À¶ÀÇÅÃÿ³ÁÀ¢†úºÄ½¾Â·Äº¿À±Úùöö÷ð¸ÃÁ¥†ú¾Î½àÞßÝÜÚÙÆ1ÀóóôñàÜ鮆ý»¾Ëþúûùø^xž€õøøÿ½2‚þÁÒÃêæçæçæòñÝ{÷o€‡„‰‹Ô VÅ‚ÿ¾Æ½À»Ľ½Ýóó£zyñÿÿÙmcÿHƒ ÿÀËÃÆÉÀÌÃÄÞ€õN݃ÿ®G„ÿÂÏÆÊÍÃÐÆÉÞ÷÷Dz…ÿk„ÿ¿Å¿ÁýƿÃËøøeE­ÎÎ×Å£lDƒÿÅÖÌÐÓÈØÌÐÖúw jÕέ“¤¹ä&H‚ÿÁÇÁÞÇÀÁä® cûûíA„¡{,&‚ÿÄÑÈÌÏÅÒÈÊè=&ãýÌ57Œ15>‚ÿÅÒÈËÎÅÒÈɵuþö;5ïþœ€'5‚ÿÂÈÃÅÇÀÊ•§ÿŸ ¤ÿÿ§¯ ?‚ÿÆÚÍÓ×ËÚÍφ¬ÿpÇÿÿ]/ÿ9!‚ÿÌÉÈÀŽÈÈÆ¦ÿ—†ï3ë+JƒÿÛÏÆøÿÿß!-ùÿA..f&"EƒÿçÒÌÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚Ž ˆìëæÈrŒóëÛ¶¸¸·¹¸µÓéâÖ͘‹óåÊ·¾Â´Å·¾ÃãÛÕº¼ÁŠñ³²±³µ®·°´±¯´©˜¶÷À‰ð³Å»¾Á¶Ä¸¿À´Á®¥´ÿ÷Àˆõ˺·»¾´À¶¼¶ÈŬ·ÿÿøÀ‡øóݳ·º²½´¶ÑõñîÞ¸ˆux—†ùîêÝÝܸȹÞèìèåÛÅ®Ÿ~‰‚T…úñò€ô»¶Á÷õ¸´´«£¢›¤ }…ûÝÚÛÛڹ͹ÜܶͽÅÀ·Ä¶È¿ž†ø¸Âº¼À·Äº¾À¶ÀÇÅÃÿ³ÁÀ¢†úºÄ½¾Â·Äº¿À±Úùöö÷ð¸ÃÁ¥†ú¾Î½àÞßÝÜÚÙÆ1ÀóóôñàÜ鮆ý»¾Ëþúûùø^xž€õøøÿ½2‚þÁÒÃêæçæçæòñÝ{÷o€‡„‰‹Ô VÅ‚ÿ¾Æ½À»Ľ½Ýóó£zyñÿÿÙmcÿHƒ ÿÀËÃÆÉÀÌÃÄÞ€õN݃ÿ®G„ÿÂÏÆÊÍÃÐÆÉÞ÷÷Dz…ÿk„ÿ¿Å¿ÁýƿÃËøøeE­ÎÎ×Å£lDƒÿÅÖÌÐÓÈØÌÐÖúw jÕέ“¤¹ä&H‚ÿÁÇÁÞÇÀÁä® cûûíA„¡{,&‚ÿÄÑÈÌÏÅÒÈÊè=&ãýÌ57Œ15>‚ÿÅÒÈËÎÅÒÈɵuþö;5ïþœ€'5‚ÿÂÈÃÅÇÀÊ•§ÿŸ ¤ÿÿ§¯ ?‚ÿÆÚÍÓ×ËÚÍφ¬ÿpÇÿÿ]/ÿ9!‚ÿÌÉÈÀŽÈÈÆ¦ÿ—†ï3ë+JƒÿÛÏÆøÿÿß!-ùÿA..f&"EƒÿçÒÌÿ ‹Fëÿ£™èÿº’„ˆÿ ÷l *ÐêèÈ”´” ,, R”!9??7 ‚l8mk(_ccccccccccco`oÿÿÿÿÿÿÿÿÿÿÿÿÿûÞItÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýYtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýWtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöUtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ$tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþitÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿotÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmatÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬âÿqtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿítÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqŸÿztÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿêtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm'ÿátÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm£ÿltÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÿìtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô&tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿj3y‚‚‚‚‚‚‚‚‚‚‚‚Àÿÿÿÿÿÿÿý@QŒ¡ ‡Qit32jGˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%çˆæœåææååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çˆæé›ëè€åããâàÞÜÚ×ÓÏÊľ°à¶¸%è‡çé×Ë™ÍËÝéææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è†çæì¸—œ€œ€€œ€œœ—Ìì忀äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%è†ç æì¼£¡žž ¢¢¡€ž¡¢¢ žžŸ€¢  žžŸ¢¢ŸÔëææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çæì»œ¡¥€¹¨  ¦·¶µ¤¡ ©·¶³¢¡ «µ´¯¡¡Ÿ×ê€æ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è†ç<æì»»ðéðËÉïèï»Íïé벞¡Üìé窟¡ÚêæçææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çæ=åë»»êãêÌÍêãê»Ìêãè´¢Üç俬ž¡ÛèåæååäããáàÝÚØÓÏÈ¿´¦ÝçÚÍÕ£²%éèéì>ëñÁžž¾ñêñОžÏñêñ¾žžÐñê£áîìì­Ÿ¢àïëììëëêééçåâßÛÖÐǽªÕñâÚÍÕ ± %éèèçë×¹½€¼>¾¬¡ °ÑÍѸ  ¶ÑÍа  »ÑÍÍ©¡¡ÃÐÎË¥¡¡¹ÇÂÁ¿¼»»ºº¹·µ³°¬§Ÿ™…ÁúéäÚÍÔŸ° %éèèçí̘ž€ž ¢¢ €žŸ¢¢ €ž ¢¢Ÿ€ž¡¢¢Ÿ€ž¡¢¢Ÿ€ž‚œ›™˜–”’އo±ÿðëãÚÍÕž ¯ %êééèîÏŸ¥£€Ÿ ££¢€Ÿ¡££¢€Ÿ¢££¡€Ÿ€£ €Ÿ€£ ŸŸ €¤ŸžŸ¡Ÿ–“‹‰w©ÿöòëãÙÌÕ ®O%êééèîÏž£§½½¿³¢¢ª¾¼¿®¢¢¬¾½¾©¢¡°¿½»¥£¢´¾½¹¤£¢·¾¾µ¢£¤¸½½¬žŸž¯°¬˜‡xŸÿú÷òëâÙÌÖ ­P%êééèîÏŸ ¸ñíòÙ¡Ÿ¾óìóÏŸŸÌóì󾟟Ñóíï² £àñîì­ ¦åïðᣡ­ìíòΜž¨áÝÜ·„y—ÿýû÷òëâÙÍÕ ¬Q%êééèîÏŸ ·êæêÖ¢Ÿ½ìåìΟŸËìå콟ŸÎìæé² ¤Ýéæè® ¦àèéݤ ®èåêÌž¨Ý×Ö¶…z”þÿýû÷òëâÙÍÖ «R%êééèîÏŸ ¸ñìòÚ¡ž¿óìóПŸÍóì󾟟Ñóíï³ £áñîí® §æïð⣠®ííòМž«äÞݹ…}‹ûÿþýû÷òëâÚÍÖ ªS%ëêêéïÏž£¨ÌÏѺ¡¢¬ÎÎб¡¡¯ÌÊÊ«¢¡´ËÉÆ¦£¡ºËʤ£¢¿ÈÈ»¢£¤¾À¿±  ¡µ²°ž‰~‡ùÿþþýû÷òëãÚÍ× © %ëêêéïП¥£€Ÿ ££¢€Ÿ¡££¡€Ÿ¢££¡€Ÿ¢££ €Ÿ€£ ŸŸ €¤€Ÿ ¡£¡Ÿ™–’Œ‰ù€ÿ þýû÷òëãÚÎØ ¨ %ëêêéïΛ Ÿ¢££¢€Ÿ¡££¡€Ÿ¢££ €Ÿ¢££ €Ÿ€£ €Ÿ€ž€Ÿ žžœ›š—“ˆ}‡ùÿ€þ ýüú÷òêãÛÎØž §/%ìëëêïÔ­¹»¾¾¿­£¢¯ÐÐÒµ¢¢±ÑÐЮ£¢¸ÒÐ˧¤¢½ÒÑÆ¥¤£·¿†¾ »¹¸µ²­§¢•û„ÿ ü÷ðèáÙÎÙž ¦%ì‚ë'ìîïðïõΠ ÀõîõÒ  ÏõîõÀ  Óõïñ´¡¤äóðﯡ¤ãóïƒð ïïìéåâÞØÑËÀ½íñíììïñöûþÿýöêÜÌמ ¥%ìƒë€ê#éïË  ¾îçîР Íîçî¾  Ïîè곡¥ßëè鯡¥àìéƒê!ééèçåâÝØÑÊÀµªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì†ë#êðË  ¿õîõР Íõîõ¿  Òõïñ³¡¤âóð¤àíêƒë"êêéèåãßÚÓ˹­žŽ‚|zxuspkihly’³Ìç¨ £%ì†ëêðËŸ¤«À¿À®££¬À¿¿ª£¢±Á¿½¦¤£´ÀÀº€¤àíêƒëêêéèæãßÚÕÎÅ»°¢’…~}~v€[ YUPOXu¿ ¢&í†ìëñÍ¡§¥€¡¤¦¦¥€¡¤¥¥£€¡€¥£¡¡¢€¦áîëƒìëëêéçåáÜÖÐÉ¿µ¨˜‚†|YX YYUKDˆ‚¡&í†ìëñÄ›¡ €¡ €¡ £¥¥£¡¡¢¤¥¥¢€¡€ àïëƒìëëêêçåâÝØÒËú¯£™“’€‘‡€b€`€^ZEjS¡&î†íìïÝÈÓ†ÒÑÔ³£¢¿ÕÒÒ¬¤£ÀÕÑ€ÒÑéî…í$ìëêèçäßÚÕÎÈÀ¸¯¨¢ Ÿžž”kkj†‘‰jeartƒ8 &îˆíðˆòñ÷¡¡Õ÷ðô·¢£Þöñòî†íìëêèæäáÛ×ÒÌÅ¿¹³¯­«ªªŸ€t Ÿ¨¥¤xmi‡—Œ…Ÿ&îˆí‰ìëñÀ¡¡Òñêî¶¢£×ðëìíî'ïïîîíìêèæáÝØÓÍÈÿ¼¹¸·¸¬}||©´²±vs“¦š¢FŸ&î”íìòÀ¡¡Ðòìî´£¢×ñì„í,îçéèçæåäâáàÞÜÚ×ÓÏËÆÂ¿¼¹·¶µ¶«ƒ„„´¹²²ˆz´«°hŸ&ï”îíóÁ¡¦«²±±¦§¢×òí‚îíòÚ§­««ª©¨¦¥¥£¢¡Ÿš˜•“‘ŒŒ€‹ЋГ‰Š‰ˆ†‰‰Œo &ï”îíóÁ¡§¥€£¦§¢Öòí‚îíóÖ¡‡¥£¢¡Ÿ›˜—•”’‘‘‘ ‘‹ˆ†Šv &ï”îíóÁ¡§¥§§¦¥§¢Õóí‚îíòØ£¨¦¦§§¥¦¥¤¥¥£¡¡ œ›™€—”••–•––•––•””“‘‘”z &ð”ïîô£¤Êèã㲦£Ôôî‚ï,îô×£¦®âäçÑ¥£·äáåÄ  ·ÞØÚ®™˜¹ÖÒÓ¦˜šÇÕÑײ–•·ÒÌÔ¡&ð‚ïîíó££Ööïô»¤£Óóí‚î.íóÔ£¥²ñðô娢ÂõíôÓ ŸÅïçíº››Ëêâ籚ŸÙæáèÁ˜˜ÇäÛ螟&ðïñô€ò‹ñðöã£Ôóìò¼¤£Ööð‚ñ.ðöØ£¥²ïíð㨢ÃóëòÒ¡¡Çîæí¾žÍëäéµ¢ÜèãêÛ›ÊçÝ죟&ð€ïñåÕÞàãŠäåå麤£Ðóîï¶¥¤Êèã‚ä,ãèˤ¦°íïòÛ¦£½òíóΡ¢Ãðéî¼ ŸËíèè° ¢Ùìè쿟žÇëä육 &ñððïõÓŸ§§‹¨ ©ª©§¨§«³³±§¨¨§†¨§€¨'±³´¬§¨¨²³²ª¦¦§±±°§¥¤¨°°®¤¥¤©°¯¯¥¤¤¦¯­±‹  &ñððïõÕ¤©¨€¥§€¨€¥¨€¥€¨§££¤€¨§¥¥¦€¨¦¥¥§€¨¦¥¥§€¨€¦§¨¨§€¥€§¦€¥€¦£¢£¢€¥¤ Ÿ§Ž 9&òññðöÖ£©¨²³´¬§¨©²³³ª¨¨©³³²©¨§«´´±§¨§­´³¯§¨§¯´´¯§¨¨§¨¨§§‚¦€¥¤¥¤¤ƒ£¤¨¨§®­§§¦§¦©²±¶Ž E&òññðöÖ¤¦¸òðõÙ¦¤¿ôïõΤ¤ËõïôÀ¥¤Òõðñ¸¥§àôñí°¤°ìñó䨨§ÙèäãâáàßÞÝÜÜÛÚÙØ×‚Õ×Ψ¨§áìä㯧¤Ðôí÷¤¡1&òññðöÖ¤¥¾ôïôà§£Äöïöפ¤×öïöĤ¤×öïõÀ£©çóðò´£²ðñ󿀍é÷óô„õ„öõùꀨ æõó󳦤Öõìû¬Ÿ1&òññðöÖ¤¥¾öñ÷á§£Åøñø×¤¤ØøñøÅ¤¤Øøñ÷À£©èõòó´£´óóõ耨åóïðïó倨 èõòô´¦£×øïþ­Ÿ6&óòòñ÷×¥§¶èæëÓ§¦½êåëʦ¦Èëå꽦¦Îëæè·¦©Úéç屦®âçéÚ¨©©âô‘òôꬨ¨Úéèᮩ¥Ìëäî¡¡ &óòòñ÷פª¨€ª¨©©¨€ª©ªª©€ª©ªª©ªª©©ª©¨©©¨¨©¨¨©©¨€©ãô‘òóﲨª©ªª©©ªª©ª©¯ 'ôóóòøØ¥«ª§¦¦¨€ª¨‹§¨©ˆªãô‘óô§¨‚§¦­ 'ôóóòøØ¥««¹»»±©ª©³¶‰µ ´³²±°¯®­¬«‡ªåõ‘óôî´²¶†µ´»› 'ôóóòøØ¦¨¼÷ôùÞ§¨·òŠó òñðïîíìëêéèãääñ“óôïñ‡óñûР'ôóóòøØ¦§¾õñöߨ§ºõŒóôõöòòóôôõ•óôˆóñûР'õôôóùئ§¿úõû㨧¹õŽô‰óôôóó•ôóˆôòüР'õôôóùØ¥©³âãæË¨§ºõÂôòüР 'öõõôúÙ¦¬ª©¬¨»÷ÂõóþÑ 'öõõôúÙ¦¬«§¦¦©¬§¼÷ÂõóþÑ '÷ööõûÚ§¬®ÆÇɺ«©¾øÂöôÿÑ '÷ööõûÚ¨©¾üúÿâ©©¿øÂöôÿÑ '÷ööõûÚ¨ª¾öóøßª©Àøô–õ¨öôÿÒ '÷ööõûÚ¨©¿ýúÿ㩨Ãþú•ûú¨öôÿÒ '÷ööõûÚ§¬±ØÚÝÅ©¬±ÊÌËÊÉ‚ÈÉÉ‚ÈÉÈÆÏ¨öôÿÒ  'ø÷÷öüÛ§­«€¨©¬¬«€¨§€¨€§¨€§‚¨¤³¨÷õÿÓ  'ø÷÷öüÛ§­«€¨©¬¬«€¨«­­«€¨«­­ª€¨ ¬­­©¨¨©®ª¸¨÷õÿÓ -'ùøø÷ýܨ­±ÖÚÛ«¬µÖÖØ»««ºÙ×Ù·¬«ÄÚØÓ°¬­ÎÙÚˬ«¸¨øöÿÓ -'ùøø÷ýÜ©«¾ÿüÿ㪨ÊÿûÿÝ©©Ûÿûÿ˨­îÿüý¹¨¸ûýÿ𭪸¨øöÿÓ -'ùøø÷ýÜ©«½øõúÞª©ÉûôûÜ©©Ùûôûɨ®éùõö¹¨¸õöøë®ª¸¨øöÿÔ -'ùøø÷ýÜ©«½þüÿ⪩ÊÿûÿÜ©©Ùÿûÿʨ­ìÿüü¹¨¶ùýÿ𭪸øö÷–øöÿÔ -'úùùøþÝ©®±ÉÊ̽¬­µËÉ̹­­¸ÌÉ˵­¬¾ÌÊȰ­®ÅËËùþø÷•ù÷ÿÔ  'úùùøþÝ©¯®€ª¬®®­€ª¬®®­€ª­®®¬€ª€®«ªª«¯«¹ŒùûÛôüö”ù÷ÿמ (ûúúùÿÞª°®€«¬¯¯­€«¬¯¯­€«­¯¯¬€«®¯®«°¬º‹ú÷ÿOAóÿõù‘úùôÿÄŸ-(ûúúùÿÞª¯¶ÝÞáʬ­¼àÝáÄ­­ÂáÝ཭­ÍáÞÛ´®°×ßàÓ®­º‹ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ-(ûúúùÿÞ«­¿ÿþÿã««Íÿýÿà««Ûÿýÿͪ¯íÿþÿ¼ª¸ûÿÿ󯬺€ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡2(ûúúùÿÞ«­½ù÷ýÞ««ËþöýÞ««Øýöþ˪¯éû÷ù»ª·õøúî°¬ºúúùþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  3(ûúúùÿÞ«­½ýüÿà««ÉÿúÿÙ««ÕÿúÿÊ«®çÿüû¹«µõýÿº÷ÿ¨Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(ûúúùÿÞª°°ÃÅŸ®¯±ÁÁ³®®³€Á±¯®·Â¾¯¯®»Âº¯­ºöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž (üûûúÿߪ°¯€«­€¯¬««®¯¯®€«€¯­««¬€¯¬««­°¬º÷ÿ˜B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž6(üûûúÿߪ°®¯°°­¯¯­¯°°­¯¯­¯°¯­¯¯­°°®®¯®®°°­¯¬ºøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž7(ýüüûÿ૯¸íðôÔ­®ÀñïóÊ­­ÇòïñÁ­­Öóðê¶®±äòòÞ¯®¼úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ7(ýüüûÿà«®¿ÿþÿ㬬ÎÿýÿᬬÙÿýÿΫ¯ìÿþÿ¼«¸úÿÿó°­¼üýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž8(ýüüûÿà«®¿üúÿବÍÿùÿବØÿøÿÍ«¯éÿúü¼¬·÷üýñ±­¼üùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž9(ýüüûÿà«®¼ûûÿÞ¬­ÇÿúÿÕ¬¬ÐÿúÿȬ®âÿüø¹­´òýÿ믭¼üùÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ýüüûÿ૱°º¼½´¯°°»¼¼±€°¼¼»°°¯³½½¸¯°¯¶½½µ°®»üúÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýüüûÿ૱°­¬¬¯€°€­°€­°­­®€°¯­­¯±­»üüûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þýýüÿᬲ°¶¸·²±±°´µ´°±±°€³°€±´³²°±°²´³±±®¼ýýùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–g(þýýüÿᬰ¼÷÷ûÛ®®ÆøóøÓ®®Î÷ñöÆ®¯Þ÷óð¹®´ìôöå°®½ýýûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(€ÿ'þÿâ­±¹ãâåϯ°Àäáåȯ°ÅåáäÀ°°Ðåâß¶±³ÛãäÖ±¯¾ƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(€ÿþÿâ­³±€®¯²²°€®°²²°€®°²²¯€®±²²®³¯¾ƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(€ÿþÿâ­³²€®°²²±€®±²²±€®±²²°€®€²¯®®¯³¯¾€ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(€ÿ'þÿâ­²µÎÏѰ±¹ÐÎѽ°±»ÐÏй±°ÂÑÏÌ´²±ÉÐÐDZ¯¾€ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(€ÿ'þÿ⮯Åÿþÿè°­Ïÿýÿà®®ÜÿýÿÏ­²îÿþÿ¾­»üÿÿ󳯾ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(€ÿ'þÿ⮯Æÿüÿè°­Îÿûÿá®®Þÿûÿέ²ïÿüý¾­¼ûýÿò³¯¾ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(€ÿ'þÿ⮯Çÿýÿê°­Ïÿýÿâ®®ßÿýÿÏ­²ñÿþÿ¾­¼ýÿÿ󳯾‚ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(€ÿ'þÿâ­²·ßâå˰±¼áâãð°ÀáÞÞ»±°Ëâߨ´±²Õáàϱ°¾„ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(€ÿþÿã®´²€®°³³±€®°²²°€®±²²¯€® ²³³¯®®¯´°¾„ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(€ÿþÿà§®­®€­€®°²²±€®°²²±€®€­‚®ª¹„ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(€ÿþÿíÌÐ‡Ï ÑÁ°±»ÐÎѼ°±»Ð‡ÏÍÖˆÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(Žÿþÿâ®®ÏÿýÿÕ®®Ùÿþ”ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ƒÿˆþýÿâ®®ÎÿûÿÕ®®×ÿýˆþ‰ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(Žÿþÿâ®®ÏÿýÿÖ®®Õÿþ—ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(Žÿþÿâ­±»ÑÎÒ¼±­Ôÿþ–ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(Žÿþÿâ­³±€®°³­Óÿþ˜ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(Žÿþÿâ­³°€®°³­Ñÿþ›ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(Žÿþÿâ­°Àäáäð­Ïÿþ•ÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (üûúÿß««ÊÿúÿÑ««Ïÿú’û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(Žÿþÿ纾ÁËÊËÁ¾ºÜÿþ‘ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€bŒceXDGE€CEGDRe’cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埑‡“=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%çˆæœåææååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çˆæé›ëè€åããâàÞÜÚ×ÓÏÊľ°à¶¸%è‡çé×Ë™ÍËÝéææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è†çæì¸—œ€œ€€œ€œœ—Ìì忀äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%è†ç æì¼£¡žž ¢¢¡€ž¡¢¢ žžŸ€¢  žžŸ¢¢ŸÔëææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çæì»œ¡¥€¹¨  ¦·¶µ¤¡ ©·¶³¢¡ «µ´¯¡¡Ÿ×ê€æ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è†ç<æì»»ðéðËÉïèï»Íïé벞¡Üìé窟¡ÚêæçææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çæ=åë»»êãêÌÍêãê»Ìêãè´¢Üç俬ž¡ÛèåæååäããáàÝÚØÓÏÈ¿´¦ÝçÚÍÕ£²%éèéì>ëñÁžž¾ñêñОžÏñêñ¾žžÐñê£áîìì­Ÿ¢àïëììëëêééçåâßÛÖÐǽªÕñâÚÍÕ ± %éèèçë×¹½€¼>¾¬¡ °ÑÍѸ  ¶ÑÍа  »ÑÍÍ©¡¡ÃÐÎË¥¡¡¹ÇÂÁ¿¼»»ºº¹·µ³°¬§Ÿ™…ÁúéäÚÍÔŸ° %éèèçí̘ž€ž ¢¢ €žŸ¢¢ €ž ¢¢Ÿ€ž¡¢¢Ÿ€ž¡¢¢Ÿ€ž‚œ›™˜–”’އo±ÿðëãÚÍÕž ¯ %êééèîÏŸ¥£€Ÿ ££¢€Ÿ¡££¢€Ÿ¢££¡€Ÿ€£ €Ÿ€£ ŸŸ €¤ŸžŸ¡Ÿ–“‹‰w©ÿöòëãÙÌÕ ®O%êééèîÏž£§½½¿³¢¢ª¾¼¿®¢¢¬¾½¾©¢¡°¿½»¥£¢´¾½¹¤£¢·¾¾µ¢£¤¸½½¬žŸž¯°¬˜‡xŸÿú÷òëâÙÌÖ ­P%êééèîÏŸ ¸ñíòÙ¡Ÿ¾óìóÏŸŸÌóì󾟟Ñóíï² £àñîì­ ¦åïðᣡ­ìíòΜž¨áÝÜ·„y—ÿýû÷òëâÙÍÕ ¬Q%êééèîÏŸ ·êæêÖ¢Ÿ½ìåìΟŸËìå콟ŸÎìæé² ¤Ýéæè® ¦àèéݤ ®èåêÌž¨Ý×Ö¶…z”þÿýû÷òëâÙÍÖ «R%êééèîÏŸ ¸ñìòÚ¡ž¿óìóПŸÍóì󾟟Ñóíï³ £áñîí® §æïð⣠®ííòМž«äÞݹ…}‹ûÿþýû÷òëâÚÍÖ ªS%ëêêéïÏž£¨ÌÏѺ¡¢¬ÎÎб¡¡¯ÌÊÊ«¢¡´ËÉÆ¦£¡ºËʤ£¢¿ÈÈ»¢£¤¾À¿±  ¡µ²°ž‰~‡ùÿþþýû÷òëãÚÍ× © %ëêêéïП¥£€Ÿ ££¢€Ÿ¡££¡€Ÿ¢££¡€Ÿ¢££ €Ÿ€£ ŸŸ €¤€Ÿ ¡£¡Ÿ™–’Œ‰ù€ÿ þýû÷òëãÚÎØ ¨ %ëêêéïΛ Ÿ¢££¢€Ÿ¡££¡€Ÿ¢££ €Ÿ¢££ €Ÿ€£ €Ÿ€ž€Ÿ žžœ›š—“ˆ}‡ùÿ€þ ýüú÷òêãÛÎØž §/%ìëëêïÔ­¹»¾¾¿­£¢¯ÐÐÒµ¢¢±ÑÐЮ£¢¸ÒÐ˧¤¢½ÒÑÆ¥¤£·¿†¾ »¹¸µ²­§¢•û„ÿ ü÷ðèáÙÎÙž ¦%ì‚ë'ìîïðïõΠ ÀõîõÒ  ÏõîõÀ  Óõïñ´¡¤äóðﯡ¤ãóïƒð ïïìéåâÞØÑËÀ½íñíììïñöûþÿýöêÜÌמ ¥%ìƒë€ê#éïË  ¾îçîР Íîçî¾  Ïîè곡¥ßëè鯡¥àìéƒê!ééèçåâÝØÑÊÀµªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì†ë#êðË  ¿õîõР Íõîõ¿  Òõïñ³¡¤âóð¤àíêƒë"êêéèåãßÚÓ˹­žŽ‚|zxuspkihly’³Ìç¨ £%ì†ëêðËŸ¤«À¿À®££¬À¿¿ª£¢±Á¿½¦¤£´ÀÀº€¤àíêƒëêêéèæãßÚÕÎÅ»°¢’…~}~v€[ YUPOXu¿ ¢&í†ìëñÍ¡§¥€¡¤¦¦¥€¡¤¥¥£€¡€¥£¡¡¢€¦áîëƒìëëêéçåáÜÖÐÉ¿µ¨˜‚†|YX YYUKDˆ‚¡&í†ìëñÄ›¡ €¡ €¡ £¥¥£¡¡¢¤¥¥¢€¡€ àïëƒìëëêêçåâÝØÒËú¯£™“’€‘‡€b€`€^ZEjS¡&î†íìïÝÈÓ†ÒÑÔ³£¢¿ÕÒÒ¬¤£ÀÕÑ€ÒÑéî…í$ìëêèçäßÚÕÎÈÀ¸¯¨¢ Ÿžž”kkj†‘‰jeartƒ8 &îˆíðˆòñ÷¡¡Õ÷ðô·¢£Þöñòî†íìëêèæäáÛ×ÒÌÅ¿¹³¯­«ªªŸ€t Ÿ¨¥¤xmi‡—Œ…Ÿ&îˆí‰ìëñÀ¡¡Òñêî¶¢£×ðëìíî'ïïîîíìêèæáÝØÓÍÈÿ¼¹¸·¸¬}||©´²±vs“¦š¢FŸ&î”íìòÀ¡¡Ðòìî´£¢×ñì„í,îçéèçæåäâáàÞÜÚ×ÓÏËÆÂ¿¼¹·¶µ¶«ƒ„„´¹²²ˆz´«°hŸ&ï”îíóÁ¡¦«²±±¦§¢×òí‚îíòÚ§­««ª©¨¦¥¥£¢¡Ÿš˜•“‘ŒŒ€‹ЋГ‰Š‰ˆ†‰‰Œo &ï”îíóÁ¡§¥€£¦§¢Öòí‚îíóÖ¡‡¥£¢¡Ÿ›˜—•”’‘‘‘ ‘‹ˆ†Šv &ï”îíóÁ¡§¥§§¦¥§¢Õóí‚îíòØ£¨¦¦§§¥¦¥¤¥¥£¡¡ œ›™€—”••–•––•––•””“‘‘”z &ð”ïîô£¤Êèã㲦£Ôôî‚ï,îô×£¦®âäçÑ¥£·äáåÄ  ·ÞØÚ®™˜¹ÖÒÓ¦˜šÇÕÑײ–•·ÒÌÔ¡&ð‚ïîíó££Ööïô»¤£Óóí‚î.íóÔ£¥²ñðô娢ÂõíôÓ ŸÅïçíº››Ëêâ籚ŸÙæáèÁ˜˜ÇäÛ螟&ðïñô€ò‹ñðöã£Ôóìò¼¤£Ööð‚ñ.ðöØ£¥²ïíð㨢ÃóëòÒ¡¡Çîæí¾žÍëäéµ¢ÜèãêÛ›ÊçÝ죟&ð€ïñåÕÞàãŠäåå麤£Ðóîï¶¥¤Êèã‚ä,ãèˤ¦°íïòÛ¦£½òíóΡ¢Ãðéî¼ ŸËíèè° ¢Ùìè쿟žÇëä육 &ñððïõÓŸ§§‹¨ ©ª©§¨§«³³±§¨¨§†¨§€¨'±³´¬§¨¨²³²ª¦¦§±±°§¥¤¨°°®¤¥¤©°¯¯¥¤¤¦¯­±‹  &ñððïõÕ¤©¨€¥§€¨€¥¨€¥€¨§££¤€¨§¥¥¦€¨¦¥¥§€¨¦¥¥§€¨€¦§¨¨§€¥€§¦€¥€¦£¢£¢€¥¤ Ÿ§Ž 9&òññðöÖ£©¨²³´¬§¨©²³³ª¨¨©³³²©¨§«´´±§¨§­´³¯§¨§¯´´¯§¨¨§¨¨§§‚¦€¥¤¥¤¤ƒ£¤¨¨§®­§§¦§¦©²±¶Ž E&òññðöÖ¤¦¸òðõÙ¦¤¿ôïõΤ¤ËõïôÀ¥¤Òõðñ¸¥§àôñí°¤°ìñó䨨§ÙèäãâáàßÞÝÜÜÛÚÙØ×‚Õ×Ψ¨§áìä㯧¤Ðôí÷¤¡1&òññðöÖ¤¥¾ôïôà§£Äöïöפ¤×öïöĤ¤×öïõÀ£©çóðò´£²ðñ󿀍é÷óô„õ„öõùꀨ æõó󳦤Öõìû¬Ÿ1&òññðöÖ¤¥¾öñ÷á§£Åøñø×¤¤ØøñøÅ¤¤Øøñ÷À£©èõòó´£´óóõ耨åóïðïó倨 èõòô´¦£×øïþ­Ÿ6&óòòñ÷×¥§¶èæëÓ§¦½êåëʦ¦Èëå꽦¦Îëæè·¦©Úéç屦®âçéÚ¨©©âô‘òôꬨ¨Úéèᮩ¥Ìëäî¡¡ &óòòñ÷פª¨€ª¨©©¨€ª©ªª©€ª©ªª©ªª©©ª©¨©©¨¨©¨¨©©¨€©ãô‘òóﲨª©ªª©©ªª©ª©¯ 'ôóóòøØ¥«ª§¦¦¨€ª¨‹§¨©ˆªãô‘óô§¨‚§¦­ 'ôóóòøØ¥««¹»»±©ª©³¶‰µ ´³²±°¯®­¬«‡ªåõ‘óôî´²¶†µ´»› 'ôóóòøØ¦¨¼÷ôùÞ§¨·òŠó òñðïîíìëêéèãääñ“óôïñ‡óñûР'ôóóòøØ¦§¾õñöߨ§ºõŒóôõöòòóôôõ•óôˆóñûР'õôôóùئ§¿úõû㨧¹õŽô‰óôôóó•ôóˆôòüР'õôôóùØ¥©³âãæË¨§ºõÂôòüР 'öõõôúÙ¦¬ª©¬¨»÷ÂõóþÑ 'öõõôúÙ¦¬«§¦¦©¬§¼÷ÂõóþÑ '÷ööõûÚ§¬®ÆÇɺ«©¾øÂöôÿÑ '÷ööõûÚ¨©¾üúÿâ©©¿øÂöôÿÑ '÷ööõûÚ¨ª¾öóøßª©Àøô–õ¨öôÿÒ '÷ööõûÚ¨©¿ýúÿ㩨Ãþú•ûú¨öôÿÒ '÷ööõûÚ§¬±ØÚÝÅ©¬±ÊÌËÊÉ‚ÈÉÉ‚ÈÉÈÆÏ¨öôÿÒ  'ø÷÷öüÛ§­«€¨©¬¬«€¨§€¨€§¨€§‚¨¤³¨÷õÿÓ  'ø÷÷öüÛ§­«€¨©¬¬«€¨«­­«€¨«­­ª€¨ ¬­­©¨¨©®ª¸¨÷õÿÓ -'ùøø÷ýܨ­±ÖÚÛ«¬µÖÖØ»««ºÙ×Ù·¬«ÄÚØÓ°¬­ÎÙÚˬ«¸¨øöÿÓ -'ùøø÷ýÜ©«¾ÿüÿ㪨ÊÿûÿÝ©©Ûÿûÿ˨­îÿüý¹¨¸ûýÿ𭪸¨øöÿÓ -'ùøø÷ýÜ©«½øõúÞª©ÉûôûÜ©©Ùûôûɨ®éùõö¹¨¸õöøë®ª¸¨øöÿÔ -'ùøø÷ýÜ©«½þüÿ⪩ÊÿûÿÜ©©Ùÿûÿʨ­ìÿüü¹¨¶ùýÿ𭪸øö÷–øöÿÔ -'úùùøþÝ©®±ÉÊ̽¬­µËÉ̹­­¸ÌÉ˵­¬¾ÌÊȰ­®ÅËËùþø÷•ù÷ÿÔ  'úùùøþÝ©¯®€ª¬®®­€ª¬®®­€ª­®®¬€ª€®«ªª«¯«¹ŒùûÛôüö”ù÷ÿמ (ûúúùÿÞª°®€«¬¯¯­€«¬¯¯­€«­¯¯¬€«®¯®«°¬º‹ú÷ÿOAóÿõù‘úùôÿÄŸ-(ûúúùÿÞª¯¶ÝÞáʬ­¼àÝáÄ­­ÂáÝ཭­ÍáÞÛ´®°×ßàÓ®­º‹ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ-(ûúúùÿÞ«­¿ÿþÿã««Íÿýÿà««Ûÿýÿͪ¯íÿþÿ¼ª¸ûÿÿ󯬺€ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡2(ûúúùÿÞ«­½ù÷ýÞ««ËþöýÞ««Øýöþ˪¯éû÷ù»ª·õøúî°¬ºúúùþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  3(ûúúùÿÞ«­½ýüÿà««ÉÿúÿÙ««ÕÿúÿÊ«®çÿüû¹«µõýÿº÷ÿ¨Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(ûúúùÿÞª°°ÃÅŸ®¯±ÁÁ³®®³€Á±¯®·Â¾¯¯®»Âº¯­ºöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž (üûûúÿߪ°¯€«­€¯¬««®¯¯®€«€¯­««¬€¯¬««­°¬º÷ÿ˜B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž6(üûûúÿߪ°®¯°°­¯¯­¯°°­¯¯­¯°¯­¯¯­°°®®¯®®°°­¯¬ºøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž7(ýüüûÿ૯¸íðôÔ­®ÀñïóÊ­­ÇòïñÁ­­Öóðê¶®±äòòÞ¯®¼úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ7(ýüüûÿà«®¿ÿþÿ㬬ÎÿýÿᬬÙÿýÿΫ¯ìÿþÿ¼«¸úÿÿó°­¼üýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž8(ýüüûÿà«®¿üúÿବÍÿùÿବØÿøÿÍ«¯éÿúü¼¬·÷üýñ±­¼üùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž9(ýüüûÿà«®¼ûûÿÞ¬­ÇÿúÿÕ¬¬ÐÿúÿȬ®âÿüø¹­´òýÿ믭¼üùÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ýüüûÿ૱°º¼½´¯°°»¼¼±€°¼¼»°°¯³½½¸¯°¯¶½½µ°®»üúÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýüüûÿ૱°­¬¬¯€°€­°€­°­­®€°¯­­¯±­»üüûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þýýüÿᬲ°¶¸·²±±°´µ´°±±°€³°€±´³²°±°²´³±±®¼ýýùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–g(þýýüÿᬰ¼÷÷ûÛ®®ÆøóøÓ®®Î÷ñöÆ®¯Þ÷óð¹®´ìôöå°®½ýýûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(€ÿ'þÿâ­±¹ãâåϯ°Àäáåȯ°ÅåáäÀ°°Ðåâß¶±³ÛãäÖ±¯¾ƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(€ÿþÿâ­³±€®¯²²°€®°²²°€®°²²¯€®±²²®³¯¾ƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(€ÿþÿâ­³²€®°²²±€®±²²±€®±²²°€®€²¯®®¯³¯¾€ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(€ÿ'þÿâ­²µÎÏѰ±¹ÐÎѽ°±»ÐÏй±°ÂÑÏÌ´²±ÉÐÐDZ¯¾€ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(€ÿ'þÿ⮯Åÿþÿè°­Ïÿýÿà®®ÜÿýÿÏ­²îÿþÿ¾­»üÿÿ󳯾ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(€ÿ'þÿ⮯Æÿüÿè°­Îÿûÿá®®Þÿûÿέ²ïÿüý¾­¼ûýÿò³¯¾ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(€ÿ'þÿ⮯Çÿýÿê°­Ïÿýÿâ®®ßÿýÿÏ­²ñÿþÿ¾­¼ýÿÿ󳯾‚ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(€ÿ'þÿâ­²·ßâå˰±¼áâãð°ÀáÞÞ»±°Ëâߨ´±²Õáàϱ°¾„ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(€ÿþÿã®´²€®°³³±€®°²²°€®±²²¯€® ²³³¯®®¯´°¾„ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(€ÿþÿà§®­®€­€®°²²±€®°²²±€®€­‚®ª¹„ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(€ÿþÿíÌÐ‡Ï ÑÁ°±»ÐÎѼ°±»Ð‡ÏÍÖˆÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(Žÿþÿâ®®ÏÿýÿÕ®®Ùÿþ”ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ƒÿˆþýÿâ®®ÎÿûÿÕ®®×ÿýˆþ‰ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(Žÿþÿâ®®ÏÿýÿÖ®®Õÿþ—ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(Žÿþÿâ­±»ÑÎÒ¼±­Ôÿþ–ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(Žÿþÿâ­³±€®°³­Óÿþ˜ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(Žÿþÿâ­³°€®°³­Ñÿþ›ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(Žÿþÿâ­°Àäáäð­Ïÿþ•ÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (üûúÿß««ÊÿúÿÑ««Ïÿú’û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(Žÿþÿ纾ÁËÊËÁ¾ºÜÿþ‘ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€bŒceXDGE€CEGDRe’cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埑‡“=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽˆ‚€€€€€†ü¿¤€‚ŽІk4¾&ö©õô€ò ññðíìèݳ]½$ã©âáààßßÞÜÚÙÖÖ×Þ§¼$ç©æåå€ã áßÝÚÙÖÐÆÔ¼»%ç©æååããâàÞÜÙØÔÐÍÀÎú%çˆæœåææååããáàÞÛÚ×ÓÏËÆ¶ÓÀ¹%çˆæé›ëè€åããâàÞÜÚ×ÓÏÊľ°à¶¸%è‡çé×Ë™ÍËÝéææääãáàÞÛØÔÐËÅ¿±¼ã¯·%è†çæì¸—œ€œ€€œ€œœ—Ìì忀äâàÞÜÙÖÑÍÇ¿µ®ÔÙ®¶%è†ç æì¼£¡žž ¢¢¡€ž¡¢¢ žžŸ€¢  žžŸ¢¢ŸÔëææåääâáßÝÚØÓÏÉÁ¹©ÊÖÕ¬µ%è†çæì»œ¡¥€¹¨  ¦·¶µ¤¡ ©·¶³¢¡ «µ´¯¡¡Ÿ×ê€æ€äáàÞÛÙÕÐËû«¹ãÍÖ¨´%è†ç<æì»»ðéðËÉïèï»Íïé벞¡Üìé窟¡ÚêæçææääãáàÝÚ×ÒÍǽ°¬ãÜÎÕ¥³%è‚çæ=åë»»êãêÌÍêãê»Ìêãè´¢Üç俬ž¡ÛèåæååäããáàÝÚØÓÏÈ¿´¦ÝçÚÍÕ£²%éèéì>ëñÁžž¾ñêñОžÏñêñ¾žžÐñê£áîìì­Ÿ¢àïëììëëêééçåâßÛÖÐǽªÕñâÚÍÕ ± %éèèçë×¹½€¼>¾¬¡ °ÑÍѸ  ¶ÑÍа  »ÑÍÍ©¡¡ÃÐÎË¥¡¡¹ÇÂÁ¿¼»»ºº¹·µ³°¬§Ÿ™…ÁúéäÚÍÔŸ° %éèèçí̘ž€ž ¢¢ €žŸ¢¢ €ž ¢¢Ÿ€ž¡¢¢Ÿ€ž¡¢¢Ÿ€ž‚œ›™˜–”’އo±ÿðëãÚÍÕž ¯ %êééèîÏŸ¥£€Ÿ ££¢€Ÿ¡££¢€Ÿ¢££¡€Ÿ€£ €Ÿ€£ ŸŸ €¤ŸžŸ¡Ÿ–“‹‰w©ÿöòëãÙÌÕ ®O%êééèîÏž£§½½¿³¢¢ª¾¼¿®¢¢¬¾½¾©¢¡°¿½»¥£¢´¾½¹¤£¢·¾¾µ¢£¤¸½½¬žŸž¯°¬˜‡xŸÿú÷òëâÙÌÖ ­P%êééèîÏŸ ¸ñíòÙ¡Ÿ¾óìóÏŸŸÌóì󾟟Ñóíï² £àñîì­ ¦åïðᣡ­ìíòΜž¨áÝÜ·„y—ÿýû÷òëâÙÍÕ ¬Q%êééèîÏŸ ·êæêÖ¢Ÿ½ìåìΟŸËìå콟ŸÎìæé² ¤Ýéæè® ¦àèéݤ ®èåêÌž¨Ý×Ö¶…z”þÿýû÷òëâÙÍÖ «R%êééèîÏŸ ¸ñìòÚ¡ž¿óìóПŸÍóì󾟟Ñóíï³ £áñîí® §æïð⣠®ííòМž«äÞݹ…}‹ûÿþýû÷òëâÚÍÖ ªS%ëêêéïÏž£¨ÌÏѺ¡¢¬ÎÎб¡¡¯ÌÊÊ«¢¡´ËÉÆ¦£¡ºËʤ£¢¿ÈÈ»¢£¤¾À¿±  ¡µ²°ž‰~‡ùÿþþýû÷òëãÚÍ× © %ëêêéïП¥£€Ÿ ££¢€Ÿ¡££¡€Ÿ¢££¡€Ÿ¢££ €Ÿ€£ ŸŸ €¤€Ÿ ¡£¡Ÿ™–’Œ‰ù€ÿ þýû÷òëãÚÎØ ¨ %ëêêéïΛ Ÿ¢££¢€Ÿ¡££¡€Ÿ¢££ €Ÿ¢££ €Ÿ€£ €Ÿ€ž€Ÿ žžœ›š—“ˆ}‡ùÿ€þ ýüú÷òêãÛÎØž §/%ìëëêïÔ­¹»¾¾¿­£¢¯ÐÐÒµ¢¢±ÑÐЮ£¢¸ÒÐ˧¤¢½ÒÑÆ¥¤£·¿†¾ »¹¸µ²­§¢•û„ÿ ü÷ðèáÙÎÙž ¦%ì‚ë'ìîïðïõΠ ÀõîõÒ  ÏõîõÀ  Óõïñ´¡¤äóðﯡ¤ãóïƒð ïïìéåâÞØÑËÀ½íñíììïñöûþÿýöêÜÌמ ¥%ìƒë€ê#éïË  ¾îçîР Íîçî¾  Ïîè곡¥ßëè鯡¥àìéƒê!ééèçåâÝØÑÊÀµªœ‚}}~…Ž›«¿ÔâçÛÝœ ¤%ì†ë#êðË  ¿õîõР Íõîõ¿  Òõïñ³¡¤âóð¤àíêƒë"êêéèåãßÚÓ˹­žŽ‚|zxuspkihly’³Ìç¨ £%ì†ëêðËŸ¤«À¿À®££¬À¿¿ª£¢±Á¿½¦¤£´ÀÀº€¤àíêƒëêêéèæãßÚÕÎÅ»°¢’…~}~v€[ YUPOXu¿ ¢&í†ìëñÍ¡§¥€¡¤¦¦¥€¡¤¥¥£€¡€¥£¡¡¢€¦áîëƒìëëêéçåáÜÖÐÉ¿µ¨˜‚†|YX YYUKDˆ‚¡&í†ìëñÄ›¡ €¡ €¡ £¥¥£¡¡¢¤¥¥¢€¡€ àïëƒìëëêêçåâÝØÒËú¯£™“’€‘‡€b€`€^ZEjS¡&î†íìïÝÈÓ†ÒÑÔ³£¢¿ÕÒÒ¬¤£ÀÕÑ€ÒÑéî…í$ìëêèçäßÚÕÎÈÀ¸¯¨¢ Ÿžž”kkj†‘‰jeartƒ8 &îˆíðˆòñ÷¡¡Õ÷ðô·¢£Þöñòî†íìëêèæäáÛ×ÒÌÅ¿¹³¯­«ªªŸ€t Ÿ¨¥¤xmi‡—Œ…Ÿ&îˆí‰ìëñÀ¡¡Òñêî¶¢£×ðëìíî'ïïîîíìêèæáÝØÓÍÈÿ¼¹¸·¸¬}||©´²±vs“¦š¢FŸ&î”íìòÀ¡¡Ðòìî´£¢×ñì„í,îçéèçæåäâáàÞÜÚ×ÓÏËÆÂ¿¼¹·¶µ¶«ƒ„„´¹²²ˆz´«°hŸ&ï”îíóÁ¡¦«²±±¦§¢×òí‚îíòÚ§­««ª©¨¦¥¥£¢¡Ÿš˜•“‘ŒŒ€‹ЋГ‰Š‰ˆ†‰‰Œo &ï”îíóÁ¡§¥€£¦§¢Öòí‚îíóÖ¡‡¥£¢¡Ÿ›˜—•”’‘‘‘ ‘‹ˆ†Šv &ï”îíóÁ¡§¥§§¦¥§¢Õóí‚îíòØ£¨¦¦§§¥¦¥¤¥¥£¡¡ œ›™€—”••–•––•––•””“‘‘”z &ð”ïîô£¤Êèã㲦£Ôôî‚ï,îô×£¦®âäçÑ¥£·äáåÄ  ·ÞØÚ®™˜¹ÖÒÓ¦˜šÇÕÑײ–•·ÒÌÔ¡&ð‚ïîíó££Ööïô»¤£Óóí‚î.íóÔ£¥²ñðô娢ÂõíôÓ ŸÅïçíº››Ëêâ籚ŸÙæáèÁ˜˜ÇäÛ螟&ðïñô€ò‹ñðöã£Ôóìò¼¤£Ööð‚ñ.ðöØ£¥²ïíð㨢ÃóëòÒ¡¡Çîæí¾žÍëäéµ¢ÜèãêÛ›ÊçÝ죟&ð€ïñåÕÞàãŠäåå麤£Ðóîï¶¥¤Êèã‚ä,ãèˤ¦°íïòÛ¦£½òíóΡ¢Ãðéî¼ ŸËíèè° ¢Ùìè쿟žÇëä육 &ñððïõÓŸ§§‹¨ ©ª©§¨§«³³±§¨¨§†¨§€¨'±³´¬§¨¨²³²ª¦¦§±±°§¥¤¨°°®¤¥¤©°¯¯¥¤¤¦¯­±‹  &ñððïõÕ¤©¨€¥§€¨€¥¨€¥€¨§££¤€¨§¥¥¦€¨¦¥¥§€¨¦¥¥§€¨€¦§¨¨§€¥€§¦€¥€¦£¢£¢€¥¤ Ÿ§Ž 9&òññðöÖ£©¨²³´¬§¨©²³³ª¨¨©³³²©¨§«´´±§¨§­´³¯§¨§¯´´¯§¨¨§¨¨§§‚¦€¥¤¥¤¤ƒ£¤¨¨§®­§§¦§¦©²±¶Ž E&òññðöÖ¤¦¸òðõÙ¦¤¿ôïõΤ¤ËõïôÀ¥¤Òõðñ¸¥§àôñí°¤°ìñó䨨§ÙèäãâáàßÞÝÜÜÛÚÙØ×‚Õ×Ψ¨§áìä㯧¤Ðôí÷¤¡1&òññðöÖ¤¥¾ôïôà§£Äöïöפ¤×öïöĤ¤×öïõÀ£©çóðò´£²ðñ󿀍é÷óô„õ„öõùꀨ æõó󳦤Öõìû¬Ÿ1&òññðöÖ¤¥¾öñ÷á§£Åøñø×¤¤ØøñøÅ¤¤Øøñ÷À£©èõòó´£´óóõ耨åóïðïó倨 èõòô´¦£×øïþ­Ÿ6&óòòñ÷×¥§¶èæëÓ§¦½êåëʦ¦Èëå꽦¦Îëæè·¦©Úéç屦®âçéÚ¨©©âô‘òôꬨ¨Úéèᮩ¥Ìëäî¡¡ &óòòñ÷פª¨€ª¨©©¨€ª©ªª©€ª©ªª©ªª©©ª©¨©©¨¨©¨¨©©¨€©ãô‘òóﲨª©ªª©©ªª©ª©¯ 'ôóóòøØ¥«ª§¦¦¨€ª¨‹§¨©ˆªãô‘óô§¨‚§¦­ 'ôóóòøØ¥««¹»»±©ª©³¶‰µ ´³²±°¯®­¬«‡ªåõ‘óôî´²¶†µ´»› 'ôóóòøØ¦¨¼÷ôùÞ§¨·òŠó òñðïîíìëêéèãääñ“óôïñ‡óñûР'ôóóòøØ¦§¾õñöߨ§ºõŒóôõöòòóôôõ•óôˆóñûР'õôôóùئ§¿úõû㨧¹õŽô‰óôôóó•ôóˆôòüР'õôôóùØ¥©³âãæË¨§ºõÂôòüР 'öõõôúÙ¦¬ª©¬¨»÷ÂõóþÑ 'öõõôúÙ¦¬«§¦¦©¬§¼÷ÂõóþÑ '÷ööõûÚ§¬®ÆÇɺ«©¾øÂöôÿÑ '÷ööõûÚ¨©¾üúÿâ©©¿øÂöôÿÑ '÷ööõûÚ¨ª¾öóøßª©Àøô–õ¨öôÿÒ '÷ööõûÚ¨©¿ýúÿ㩨Ãþú•ûú¨öôÿÒ '÷ööõûÚ§¬±ØÚÝÅ©¬±ÊÌËÊÉ‚ÈÉÉ‚ÈÉÈÆÏ¨öôÿÒ  'ø÷÷öüÛ§­«€¨©¬¬«€¨§€¨€§¨€§‚¨¤³¨÷õÿÓ  'ø÷÷öüÛ§­«€¨©¬¬«€¨«­­«€¨«­­ª€¨ ¬­­©¨¨©®ª¸¨÷õÿÓ -'ùøø÷ýܨ­±ÖÚÛ«¬µÖÖØ»««ºÙ×Ù·¬«ÄÚØÓ°¬­ÎÙÚˬ«¸¨øöÿÓ -'ùøø÷ýÜ©«¾ÿüÿ㪨ÊÿûÿÝ©©Ûÿûÿ˨­îÿüý¹¨¸ûýÿ𭪸¨øöÿÓ -'ùøø÷ýÜ©«½øõúÞª©ÉûôûÜ©©Ùûôûɨ®éùõö¹¨¸õöøë®ª¸¨øöÿÔ -'ùøø÷ýÜ©«½þüÿ⪩ÊÿûÿÜ©©Ùÿûÿʨ­ìÿüü¹¨¶ùýÿ𭪸øö÷–øöÿÔ -'úùùøþÝ©®±ÉÊ̽¬­µËÉ̹­­¸ÌÉ˵­¬¾ÌÊȰ­®ÅËËùþø÷•ù÷ÿÔ  'úùùøþÝ©¯®€ª¬®®­€ª¬®®­€ª­®®¬€ª€®«ªª«¯«¹ŒùûÛôüö”ù÷ÿמ (ûúúùÿÞª°®€«¬¯¯­€«¬¯¯­€«­¯¯¬€«®¯®«°¬º‹ú÷ÿOAóÿõù‘úùôÿÄŸ-(ûúúùÿÞª¯¶ÝÞáʬ­¼àÝáÄ­­ÂáÝ཭­ÍáÞÛ´®°×ßàÓ®­º‹ú÷ÿ ,Ìÿ÷÷úø÷ÿºŸ-(ûúúùÿÞ«­¿ÿþÿã««Íÿýÿà««Ûÿýÿͪ¯íÿþÿ¼ª¸ûÿÿ󯬺€ú÷‡úùþè3Žÿý÷öùúúùø÷÷øù‚úùöüÿ‚¡2(ûúúùÿÞ«­½ù÷ýÞ««ËþöýÞ««Øýöþ˪¯éû÷ù»ª·õøúî°¬ºúúùþø‡ú öÿiwë,>Ôÿþûõù‚ÿ ý÷÷úø÷ûÿå=B“$  3(ûúúùÿÞ«­½ýüÿà««ÉÿúÿÙ««ÕÿúÿÊ«®çÿüû¹«µõýÿº÷ÿ¨Ÿÿö†ú!ùÿâ!Øÿ†E‰ïÿþ侪®ÉïÿÿüýÿöŒwÿD…ž(ûúúùÿÞª°°ÃÅŸ®¯±ÁÁ³®®³€Á±¯®·Â¾¯¯®»Âº¯­ºöÿ—ÿö†ú öÿ€Iÿÿæ¡Z3z:-;DB6-G˜öÊN%CÌÿ”Eßž (üûûúÿߪ°¯€«­€¯¬««®¯¯®€«€¯­««¬€¯¬««­°¬º÷ÿ˜B+•ÿ÷‡ûÿ2‘ÿûÿ XµïÿþÿþáD" Žãûÿê Íâž6(üûûúÿߪ°®¯°°­¯¯­¯°°­¯¯­¯°¯­¯¯­°°®®¯®®°°­¯¬ºøÿ­Nä»ÿø…ûùÿ×¾ÛSèÿþÿþýýÿÿþÿÍJJèÿÿGoÿÔž7(ýüüûÿ૯¸íðôÔ­®ÀñïóÊ­­ÇòïñÁ­­Öóðê¶®±äòòÞ¯®¼úÿØ-ÿ¶éÿû…ü ùÿ¿£ÿýûüþÿþûüþÿ‚ál9ÿÿמ7(ýüüûÿà«®¿ÿþÿ㬬ÎÿýÿᬬÙÿýÿΫ¯ìÿþÿ¼«¸úÿÿó°­¼üýú3ÍÿsIÿú…üûþí ­ÿúý‡ÿ üúÿ¡EñüÿØž8(ýüüûÿà«®¿üúÿବÍÿùÿବØÿøÿÍ«¯éÿúü¼¬·÷üýñ±­¼üùÿS–ÿþ3™ÿø„üùÿ[oÿùŠÿ þùÿbnÿöÿØž9(ýüüûÿà«®¼ûûÿÞ¬­ÇÿúÿÕ¬¬ÐÿúÿȬ®âÿüø¹­´òýÿ믭¼üùÿWÿÿÈ"éÿû‚üûÿç*âÿü‹ÿ üÿÝ*ëþÿØž(ýüüûÿ૱°º¼½´¯°°»¼¼±€°¼¼»°°¯³½½¸¯°¯¶½½µ°®»üúÿÔ.öþÿhaÿø‚ü úÿ½:ÿþÿýûûüýþýüûûþÿþÿ5ºÿÿך(ýüüûÿ૱°­¬¬¯€°€­°€­°­­®€°¯­­¯±­»üüûÿ9·ÿÿí&Êÿúüøÿ¸E¥ã‹ÿ ê¦;-éþÿØ‚˜(þýýüÿᬲ°¶¸·²±±°´µ´°±±°€³°€±´³²°±°²´³±±®¼ýýùÿzeÿøÿŒIÿû€ý(úÿ¸#?jš¼ÕãééãÕ¼™i? #ÝÿÿË >D3–g(þýýüÿᬰ¼÷÷ûÛ®®ÆøóøÓ®®Î÷ñöÆ®¯Þ÷óð¹®´ìôöå°®½ýýûÿÎ.öÿÿû.¹ÿúýúÿ¸ ˜éµ~V=1++,.3ÿé¥ÿ÷ûûøÿ³9üúÿ´8ÿþÿÿþÿæ.¹ÿO|ÿýÿÿüÿ½‘(€ÿ'þÿâ­±¹ãâåϯ°Àäáåȯ°ÅåáäÀ°°Ðåâß¶±³ÛãäÖ±¯¾ƒÿ7þÿî*o42¥ýÿÿýÖ¼ÉÒÿùûû÷ÿ…yÿ÷ÿ¬>ÿýÿÿûÿzYÿÿÙ"ìÿþÿüÿÅ‘(€ÿþÿâ­³±€®¯²²°€®°²²°€®°²²¯€®±²²®³¯¾ƒÿ7è¡SJ¸ýÿÿâƒ15>¿° Øÿùûûúû3ºÿøÿ´7ÿþÿÿþÿð0­ÿBŠÿýÿÿüÿ¼‘(€ÿþÿâ­³²€®°²²±€®±²²±€®±²²°€®€²¯®®¯³¯¾€ÿ2ýÿÓGåÿÿüüÿ,½ûüÿ«Çÿøúõÿ›!íþøÿÚ-÷ÿþÿÿýÿÎ1Eaÿý€ÿûÿŸ‘(€ÿ'þÿâ­²µÎÏѰ±¹ÐÎѽ°±»ÐÏй±°ÂÑÏÌ´²±ÉÐÐDZ¯¾€ÿ(þÿü0¿ÿüÿµÐÿÿväÿ÷ÿÑyÿûüÿÄ>ÿþýÿ¥Öÿý€ÿûÿ²Wûÿþ€ÿüÿh‘(€ÿ'þÿ⮯Åÿþÿè°­Ïÿýÿà®®ÜÿýÿÏ­²îÿþÿ¾­»üÿÿ󳯾ÿ'üÿ’HÿÓFHÿÿäŒÿùüÿC¡ôçŽ ¥æËf‘ÿûÿýþÿýÿþÿö$‘(€ÿ'þÿ⮯Æÿüÿè°­Îÿûÿá®®Þÿûÿέ²ïÿüý¾­¼ûýÿò³¯¾ÿ'þÿò8r‹ý3·ÿÿa÷þùÿ½!"31üþ‚ÿýûþÿûÿ¨’(€ÿ'þÿ⮯Çÿýÿê°­Ïÿýÿâ®®ßÿýÿÏ­²ñÿþÿ¾­¼ýÿÿ󳯾‚ÿ'ûÿŒ Øÿÿ“KÿÿÕzÿøúÿ˜/ÖÚ “=Žÿú‡ÿþþø/’(€ÿ'þÿâ­²·ßâå˰±¼áâãð°ÀáÞÞ»±°Ëâߨ´±²Õáàϱ°¾„ÿ&õëÿúÿö,ÉÿÿY¡ÿúøÿÍh84SŸõþÿào4.F…ÜÿÊÔÿú…ÿýúÿt“(€ÿþÿã®´²€®°³³±€®°²²°€®±²²¯€® ²³³¯®®¯´°¾„ÿ3þþýÿûÿWÿÿß.‰ÿÿúýÿûúÿÿüûúýÿüûýÿÿ÷ÿàÿûûþÿÿþýûýÿ‹”(€ÿþÿà§®­®€­€®°²²±€®°²²±€®€­‚®ª¹„ÿþþÿÿþÿã'çÿÿÕ A¾ü€ÿþûûýÿù÷üúüýùÿ… µÿþÿÿþÿþÿõk•(€ÿþÿíÌÐ‡Ï ÑÁ°±»ÐÎѼ°±»Ð‡ÏÍÖˆÿþÿò.âÿÿã €5„Àãõ€úòܸ(¬ÿú€ýûÿ³O¹îþÿúÚŒ –(Žÿþÿâ®®ÏÿýÿÕ®®Ùÿþ”ÿ ýÿOjø·2€'572" ;üýüþÿÿúÿÑ07$—(ƒÿˆþýÿâ®®ÎÿûÿÕ®®×ÿýˆþ‰ÿ þÿèC(3Ÿûž0„%Üÿý€ÿýÿÙ‚˜(Žÿþÿâ®®ÏÿýÿÖ®®Õÿþ—ÿ üíýÿþÿø¿o D¿ïüþÿ ýÿÙš(Žÿþÿâ­±»ÑÎÒ¼±­Ôÿþ–ÿýýÿýüþüýÿâ)Ïв¨©¸Ëõ—Bÿýþ‚ÿýÿÚž(Žÿþÿâ­³±€®°³­Óÿþ˜ÿþÿüÿ¹/ûÿþ€ÿþÿû/Åÿü‚ÿýÿÚž(Žÿþÿâ­³°€®°³­Ñÿþ›ÿþÿîÖzPÿüÿýüÿä¶™'!:Êÿý€ÿüÿÚž(Žÿþÿâ­°Àäáäð­Ïÿþ•ÿ#ýûûýÿÿûÿr'G`­ÿÿݰÿ÷ÿÛ0öþÄo8/0H (üûúÿß««ÊÿúÿÑ««Ïÿú’û%ùÿ‹VQ-3qÕ³;ÿýùÿd{ÿóÿmtÿûÿÿ3J6/o¼æáfŸ(Žÿþÿ纾ÁËÊËÁ¾ºÜÿþ‘ÿüÿ±ãÿþúÀj8 yÿûþÿ=Áÿúÿ±Cÿýýÿ®vËý€ÿýÿTž€bŒceXDGE€CEGDRe’cbk¬ÿùü€ÿüÔòÿýÿèWfbgPðÿþÿþûüþúÿ¹Õòÿþÿþüûþÿþÿüÿº€Çÿûþûúüþýÿ埑‡“=ÿúƒûúúû÷ÿ€€ÿû…ÿþÿëÔ/ÿÿþ…ÿýÿF€Qýí…ðíû«×„°§„©¨«¢‚ˆÙˆ‘ÚŠ†‰ÿŽt8mk@+¯®®¯¯¯¯¯¯¯¯°¯¯¯¯¯°°¯¯¯¯°°¯¯¯¯°°°¯¯¯¯°°¯¯¯°°°¯¯¯¯¯¯¯¯­¬‘U  Gÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿä†  NÿûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûûýþÿÕ1Vÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúÿä<  \ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè?  `ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿè@  bÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿç?   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿæ>   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿå=   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿã;   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿâ:   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà9   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿß7   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÞ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ6   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÝ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ5   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÛ4   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÜ3   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÖ+   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÇ    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ©   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿv   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿí8   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ•   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÕ    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè0   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê6  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê:  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê=  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê>  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@    dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêA!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿç9"   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷c   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ–   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýW   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê?!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé31CE2  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿìšÔøÿÿþè¬B  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿþÿ¬  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýþÿÿÿþûüÿÝ'  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÜ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ°  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿS  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿà  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ0  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿo  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ»  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿº  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿj  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû,  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¼  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿK  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿ¥  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿÒ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüþþÿþýûüÿÑ  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ›   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿëÈïýÿøÜœ3  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿé4%46#  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿêC"  dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿê@!   dÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè>"  cÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿóG  aÿüýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýÿÿÿÿÿÿÿÿÿÿÿÿýÿÉ   _ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿp E¥¬²µ·¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¶ðÿþÿÿÿÿÿÿÿÿÿÿþÿöº·¸·¼øÿÿÿÿÿÿÿÿÿÿÿÿüÿº $,:DKNPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRN^òÿþÿÿÿÿÿÿÿÿÿÿýÿÍJRQRMÖÿýÿÿÿÿÿÿÿÿÿÿýÿß (28=@AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD:fÿÿÿÿÿÿÿÿÿÿÿÿÿüÿš4EBE5¥ÿûþþþþþþþþþþýÿã  $()**********************************************,#Kûýûüüüüüüüüüüûÿ^,*-jÿýÿÿÿÿÿÿÿÿÿÿüÿ¿ Ëÿýÿÿÿÿÿÿÿÿÿþÿì(+ÙïêëëëëëëëëéìÛ< (c]^^^^^^^^^]bM  ic08Zý jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ Zÿ“ÏÁƒ2G÷Ë­ãbß²¾x¤0¾È±²èÅÂ/¹\c··U –*žt+¯ ¯ö¢…„¡$({w¥ Ö¢Ÿ ý«=ùq¼ÿ9f΀€ÏÁ } ºEì&ßÞË´gÎO$~¼XôÖ}Ó{ÀÜžÒ þJZcOLú{’‡šÐüy÷A/0ˆêÍìZøv$à¸K&Ýd ¡ÇàÔ~g€€Ë» ƒ’p•@<‡­pH?Kã )W6bÑù0ëÀØ.Yì¼ðÙR%m;H÷÷P‡B“ØUz–äð†O<š3F:¬`AÓuv=mC¬•ß#ôx'ûé`g4Lê@“Î]ÞaqÆŠ^…í0n'Ý> §Æ,Xa§ÇðvµEþ8ƒñþ†È³S8æT¼J ¾ꎚ.ÚûB¡à&–¢\±†OŒµãÊF»lrHû᱊ ƒ€€ÇàS<~d@€ËÉ@í;&å5ÅðÜÝÕ ©Æ©È­¢¸‰á)Fá| –¦W(– )Ô…R;<ä»Í÷þ(R:θ3I"tÿq‘‡ö·Ïþp¹3 7 †;<‚GBn2,XýÌL–gs6[6wœ›òÐBÎîsîû|ÿDRZŠÏÎÕÂÎÎÌ©7[K”é4 P,J}è2³2 H“ÖÉÕÍ(p7ˆó˦y =…wfVñïqRÖ3.( žcŒg"áâ<êÅQÆ7@ñæì!S»ˆÿQ§ßú¾¶ÿµ°ÞÙÕŒéàüplrm×h2øWøÖfƒQs{>h’ éUÑñþjºÕ¸¹‚¢ðõœÑ±àË!Å®(´ÜMÆ…ömX0÷]oàÉÊNumi ï¨|'y]x"c0£Ò3¤%/xúó3ÃÊÊÚy+¯tsfŒ2YtJ©Œ]Êf"c³nY‡œ´ç,Äd5,%%òÃ?ÚPü씕J²¶ -SÒ6ZÉd³R6‡;¤_­ÿUôÌ!ñ¶ÁÜÀ¶Ö¹²±‚Dº(ËìÄ€¢\-õolx¡ø/à;ÿk¼ç¾ “´díöÆãóëå QDD*¬žÈwY=±RàJÓ(|`µ> “¶$ŸâªfÔ}èEN¼0$,œU éß â1°mpÓ«¹ð¥[rñI|Ž(ÙwXI­1ÅÚ˜Ó)—KïjÈš QcI8…°Wv“®_Ô­ïÄ›2©KŸ¿Hì¥dƒyиS›]š¢t NÀñc̆ÐpG®«àš*ènîm ‹j1ãÛ)E"×Å÷åhT²%ÒW 3¶ê@}Õhx!ª{¡#†Ôe‘Y:‚nÝlD™û,°ˆ½Ö‘iH¸×?“†f•Pgn³m»|Æ èög“ʸv6+‰õ÷«W#§ë¯¹‹äc<Ô TòvSêSi£­©Eâsª˜2W€=R€€ÏÍ~?~ `­>Vîr² *;”- ‡Àj<µ'Ñ+HÿRÁªÕ| +`@O™oÔ@ÿ„ tÝ/MBVŠ©ç°Ë–¥ ìkÙƒjeÒš3ž³Ži# ! œŽÔ§é–Ååó†""c³nq!'ó J®Sý÷É!y¹„Šw%I ´9uû“õÊ?5v½8I1!dsäðTÛÏ„œÞy8€|4Ѱµò†rÇ4p•\E÷ÿFBÑA”j¾å¤&þ?­jMÎÝž;ªðy5¹fß“žšBºäv›µ>²eH.Â|AÊqp±ÑKöæ“J”ú tàâ±¼5R :¹Ø…Únî#ŒÏϧ¹ùõŸIฮw¿Ò’ –3éâÜ׋xÉ#‚kBùµ_Ùv.C’Z§Âdx!š^Ž)Aíüc‘éÇýÍºŠ ªÿqòMVœ}’åp¸¦T3*«ò8miC@ƒf|€ù¤µ„ÝÑ•I)€LBþ”«Ëô†ólÏ$YÅà1›¾éuÌÄßdC]‡lg+ïõ}?4@¹¿i„‹T ËM¹‚Sf’IMó%ú4Œ× gEãA™'¶ìu¡Vz“ÖKCZb늈/Q 93…€ç?õ¼–¡ð&ÒÏ ÇUE¬Ä'°˜§Ôð΅npJ|ƒNä `|¨¹¥®®MôÉw7>(zXöuÓ¢E–>÷Á”ØEí±½xÐÃ&zuûƒ¢Èý\ËËêtx‹F„QsünˆêNZ(I]á½¼ T£ø¿Z5ÊægÿAuÿo«"EäóK)ZFÿbÓò®2h.öp Zÿ j¬$ äx –‰©eâÆúKyëÉh4pãàð[˜$üÒ,K†_³JüGKcq<M²ï——äè$iÙ÷‹&ËÅ,úÛZbî*"I½<«˜Ÿï aí¯ÀǦ&Îå] aF\æns·•1‘wZykEsÖE²›±íá’_l]ë£3Ö¿– +êX€2À2$±d¨¶‹,0BjZm#À?R‘‡—R¸î0PçXäÎTÄrO…$œ‚—çJ}…²¿}+;ã'wÀ|¡¿ÃF¨¬IG”þGßbS¥:Ð7ÞØ®™p%êµIT;ð'ÛçÚB\ÖÅ™ Z3¼i|"¦î™ÂïTéì0y{Û·ˆúQ—³•ºÄ÷7«˜á$ RÖ;9óøí…C¶\w¨‡:³T»Jçugÿ EØyÒF!:…¡†oæ}ËH—/®ì4AR³¾Sø;Tbˆª•>pÈ$½B±ì%Zî­XP÷Ér¤}2fƒ+ù[–2D8pÐá[ôHë™é`/(ˆ v[ï\›Â z–ÁÛK Ô‚ÄØ מ8îm!6uUaîÿE 3† ïÀ/$ áûŸÛðøŽà¨nn_hQRŽ¦Ã´ýÞtJ.ÉÕ<`K÷ˆ|ÓGv‘’ Ûúâï]Ó±i$¤Ä<ÂpÌ+o@¾žq•ß9ý_šU2?¯µzó²òh¾‡ ˜©¯Æß˜6(„t^ˆ=~‰Ç¶]àÑŸÚeA@ŒŽ6c`“¥+dµbsJлÿ<äUú»ÊXš·iĨéW¸bbYšVe*šQÔVûþWT2¬…h³G8ݶ›HvÑUß&#¢åI†¹êTlç©Ú˜ùiVbýä¶ž8Ü C'Ýü»¸øÑ—À=Ç4mXŒ¼,9éU…¿”A¶Q ‚ Ê:*f|(Ñ[ÆÿQìáï Gškc°‹6íFJòê¢JýQ)UOó©ZÑœÍJTÑ$ñ-Jé j¡¡ñ¾Ñƒ ºÿi—Õ‡N—Š.Aœ05:WþÔhN&4ˆE/k¬>/Qü‘Qœ IÞJçÊå›Ê@¡leu>P·¾ „qÃEzãß Ÿ|sdÅÒHúB|7‘6RÑM°­nÜŠŒàf¡ K®!¶tølŸ•èçHÿ…ѸÄ÷µk‡U ^KÅ'峅κTu2†Ðýß"àËÞa ®/¯ùÅ0lÚÚ#€À»cq¾# -aô½À¯‡žé!Ä8G.¤Ýü…‰Jƒ×–`›@x¸šõ´õþ§ ÷¦öªç¹¬Ëf0—‡BQóÎüa; Ø ‰ Üò‚4YŒóÏûé“!¬ñVQª)%Á¿ïç î.?¢{dyp㸹I²Ý%F CâL½:DA¬äòQ$:MÏB÷ÿ>KW°YXsæÐëÊ}–`ò£<øñq##¨Ðý‹óœb›‹ü2i¶Ð’N^vRü ¿›Éûˆ=È\[[êÌ(’Òž3îv/Ï(~Ï=…Í>•Ê üá0ßè<Õļ莯ëÍX\÷†Š™pM.Î]ÎÚÜT%H?¢´]çìMö¨½SÞ$òV9ܼeÂ(öcX,·PzȬ›Zh‰M×(ÿUƒÿ”ó^Ÿ~å=C[²>…‰}죟 x|mÙïý!J´\—à0¼(,çšE®™ ]ïmÔ ±u¤61„ÆyÒ›„°–yVØEzÚðxXX°™mŽï§.TGèŒÿ pnˆæ®·­Høïœ@r7¼fƒºv©pqÿ–ázÑN”ÿ(‘«Âr$Ú­ßîì ŒÍݲÉTžCûê­¾V[ëïïJ/ˆ”`ø¨šÔ"ý©GOP©Ôªèƒ /¬5IƒFx?Ëešên‹H0ÌšÓÜë ²“áöË™5ÌwM6ÜNÿ†à$ÑÉ7½¨ø¸º[ÆëlÇ”øïÈÿ6€€Çá^Oδ‡áE€%hƒº¯­? aR ¨~-7k ZŽ[éHz¿N’xl“éNÁáËÌ?lN"çâé²6‡›1¬tÖB³Z¨%oyPÖÇpÉTpô<ö=$q©5c‘턱+¢dµWþÕ",“Y\ðD4Î×ÑÄTó!»€ ¾*,#0Å’ ?–8‹_¿ù(þ4‡`,ĺWÓXaÏ`äN³7 î@5[¥ðïGüŸV—‹·ö°£$7ÿ7ÆÊ¹ºw-âÇÞr¦©‰©H6D¸ìAºKáÜ󾀦¢ q4³©ˆ€oºå›OM#"œÁáƈý :R 0ÍpõÖóÁБЀ©O#¡ l¡·¾ù' {N~-?Kêþ{®òÿz€ù±"ØjÀŸN"ÁÞW’Hû £#æ2ö1®Ûë§Ui Ësþ?/á0/dOˆÿu¨‹Qú'í@Ši"MÕ]‡ýÜ—å• Ü É$ý¶Èi w`´oægM‚‰^7Âß绩RÏ’ÝÞŒeõGr|’Ã-|§À¿ìƘú,ä¤YÕ ªÊÖT"ªðôX£8æcbÓ.[>²¦ÒìG,1“zd,ÉÊQŽš§C}ñkí@‘ à a¹Öó¢/„ROÅÕo¨ªëÒÙ(>ì,[’ ’®Üð;z+ÏÏÛ†~~Ùsóõêô¶ñkˆ¦€Â_yG»%nÑ‘Gÿ_lßc©‡@)+P'èÿ|(9¢oÓK­;„ŸÈ°ÖdÇß«‘¨hœ2©üp £‡ø@žðÐÓ~f†aß•UmrB86Ôe/kr6MÔ S8´WF6І „÷ü Á9æ©‚·Úê iƒ×?;†ë9¹ÿ|U#5[Z½ýokªXq"ÓH-Xùêo_§ç^Îp¨˜ÏGMDoÙ¿¬{Ÿí¼bA/a!/o‰_=¤~„µy©9”/Ÿ†…½ÅÏß±˜& {#|ý0á1;|z 6‰8¸Vˆ6ýš•Áû\’Æ­$óºù8+_»…@ºÌÄy¦…] £Ÿw¤qáó/YùòÎ[ i{E·A{mƵ®/ÆK9’üøY²Ä©Ù¹¬ñéõ LÒ„¯»Â˜‚RcÓr#ÃwW@â0NöiÅz`“PŠ‚d\úù¤!•Tþ òÜ5ØÎo«¿õ8|Ò?ŠƒŽkûžyÊjX¡$„€´Üý¹ç3c‘ÉsUA¢¬EvãÃÍ4FAþäMÔAN½b×´lSÂÞêѹN*[è:ho÷5ŒÕ}DaÓ Ú&!/ëÍwYÀzOe©B9Ö!2ˆæxòܪ^ÚŒ?òÊN­˜GQÁd -ñ¬üõú´KÅêNLBQfãulO§b›\1?­W‹ <¸H2”ºwy½q†¬˜X—×kË(;¥Æ¿êÜ}sÄ„dá-<ý²ú¢%)ýöwc!ÛÃh¤3ýØo,ùò(Ä|Õ’‹:íºa(ôÜk¸LbZ@HXð×ÉOês¬ŠÎÓP_ mÈs[´‹ÒTà>¯vï%O»7•ùâ%¿bl O9F¸vLnI™y”8#æÉÒ†ÒûwÿT‘ ;Ýg¶Tî 醔C|VPlo.¡±ždæÐI©ðTe¾JAµ"ok;³¶á N {¥k \†dÍÒ®? F%íŽ@9çˆ]ì7äfî Ê$‹×ê–U’‚ž™Ûôã9)ÖX déÜg;Û¹D6Áä5;6ݧò6ᩤ``÷ç@èË‘#Ò®8ëŸÂs"3›Óýb’‘=\NOà ìü>$]CijY¤†~:¯ÂájǼÒzÑÈàpB»/˜¬ º ½š»Mb³Åö•ÿ8üãmÚ÷‹fÌ5·fèîZ5¥‹#€"`²D%Ç \Ÿ‹ç@±¬~¨8{¯5zîDÆ´Îi¦û}ã9—¡F\]£%œri7¯°î ‡n;œHê“/Ö°ˆ½<ÊÃyŒ®D^Ë pú$ºt4Õ³ÜteÀyQý§Î±«—}ktMK‚½hê‡ðmhÌÈühÂZßOÞ–å¢qHVÚTÒ›VEˆ0¬„'MK<ù”Hw€zr"$Ù¶é¦Ï¢šÆÅTö¹~3ÆÿJøî·áÖ ²83X6¾&öhœ×˜¨X릕#\›Ó ßzìõ¸ ˆµ ã“aCCÜ>= XÕ µDuqêð4-ÚoêOî9ót./ÅgùC™(·ŠîÁfŽ# oÆPapÙJ|:ú1±Ù =„x”s=í²- kÚȾò—?7I¬#Û„ÍÔeÛ9Ûa Úퟡ™ŒE«Ê'ÒçÚ%>eG^€(Ü»02cmËLî^³PÉ !œ÷Ü–½&z$MuÊ&#DûºÆÂH[©AÛÃÝú_RVr¢´e k#×lÆ”¶ŠGާ ÊÙ¸q<§Á­ð GÄ+3ì Ñæ»}Y©!ï˜DK—94-ÁïàÐh ‚^%gu¿ùó£õf- I¹‚Ø! ùoÐÅ«©øBÞ… Aâ¬yh]TÈ(b(^uÒ7lÆÚ½J¤¢j±#D±ˆfhs«oƒ£’ „8“zz+íUQ–"*™¹½8;Û-µVsÁ<õòXe«©‰V/~ `;"Dí3d9wU¨LY‰ ~ ïÑ{Þn X)b‘”µáÔB„ñ¡Šë°/Œã:/Äq·ÝrôÌ" áC Î{ÇÍWgILèC‚ ͆6_ÿ;¦ÉÞBè(µñÆM¦äBÂ~…Ãõkk“ÐŒQÁÔó¹¨Ý76Fì¨TÍM\—]äŸóbP:¶èãB@»:0!Æ×çt?  ¦#Êé/÷¬q‚®…1¾þ«‘–ê€÷d£ÂªVçRY‡hÅéÄÒö#Žüâ !Ï%d^’F4ÆúÙ=ðõÐ,ëµéÆ‘jÿW ò‹.Ç®ݳ1j$ž1R”ƒˆÍ›®©$'æäóFJ2l2à«üRuÚk1‹…Á‹ìS”NN”13ú5µ™H䨇!ÉFî@Co ™gmöZ†¥V¤Š?/Wrœ'h{Úˆ€¦ÓLæ.œ«(þÛ'Æ$kVŽ+3çú–ŽNPv¶Q¤)oÏ®²ÈEQœÁ2º‹Ækn^:ÌnŽÅ•1›#;nfzX{_†š‚ËÀdh¢qìü3ò?ðùج0Áó`°¿BV@SªÂ0Zq‰ó…|=$4?A§ÿx§ 6xc¹»?8Ž„Y ÄßÞXÂ2av ç)” ¯îœ—ˆ²AÚ-¥)>i|'UL=\J7¨;ÕЍR±¥Áyª­ÖqDu:¸„ ]©û‹ÏŸ8R•3C¼ÀÓ+H„Ǧ_·eÕÖ"jðl˜v-£l†g˜ ]k6eý“}Ý¿"Ç·#ä¬ÿ@Ð(ð|G9 ½’s‚m¿Ý*&äÉöïr ™0ƒ©É®^YeϼqØÃ!£*áWæ¼¹îU´€ þ2S#ª©Â˜Bðݦe¬·²UËÃ8z²Uߨs`D .‹Ç<—PÄŸ´Äã'(Å0àBs4ÐgY§î&Ô#&Ž#&ªñªhþÑ©,pÉýË)ª"N`8y‹™QW·U›-y¢®ñßó;‹qîÊLc¥Rô/NV*6…v¨ -·©«¹'½­ÁÞaiä[YéôSÒæwd•¤éVáôÇꢺŒ iP¾9‘ÈŸ»ÞÂ^cûË.z‘väÂ2Èg—@›4¤°È‰®>ê¬Ó[9+ØÑ8˜A\Vû)á}Aû¹ñ„xY 0q™Ê0Ð]»#R|Ò’Á"dú­UÕÐ_@ðM…X2¾ò¬YÞceNìÎÃТ  ªíçÌZu¿ä¨ÏãÌ;œ¼p/’ŽÐ¶§«vcžÔŦCéþ­ƒ±ZtjÌ[Œç«g̮խM±£æŒ©…sÓ—t 'ÂþLé<ö‘š!ÙzbŠ0ÉÛŠhÐè5û}ÒèEcð-jðGwYŒÔ®9K»ï ÔÔn«M‘ë3mÃBl‡6t½¿œÕâ­`úZ¼šfè%]å>ˆ’#y‘ôËgðøýYÓÀ†Øy¯xß3(ÆßºãrRéìÕ»ÞoòßíR%»¨j•:IºÛôÏnhº€æå^@9qRoçŒK%[µ*‹¥TÍŒJØ Ð7ò”»çÁš~OË( ¡ÁR¡ß Üù[ˆ~òà`ÉÂðÓs6ÀÚ"GЩ¸®tñA¼šM·LB­B˜Þ¼ VQ”è’Åá8 aVº{`bý'ˆÞ]XŠØÀÇåË¿ÕÓñ hÓcEˆ3§µzWÜd•›)p&?U”Í©s‘lTj¯Sn‘SÆÕ¹ÜO7´Eø÷–ñš‚î.ÖùÂÑ ÈÀîn™SŽs¦_Ï{N{© 3eIˆf¥¾Ë­ådBZÁÈxÛG…v3ñퟸ¸`Àõk?þ:'µßµ, Æ0΃½#X¼]w.› šóz´ðhµ·0¶&Žñ¤˜,‘ÒÂ0¼T¢‰õY§ê@ÃUS¶Ÿ—0eT”½óC¿¡ëÆ.uÌ/"¢þë®Ó>í°Ç­”h kËÚic[ýÛçvÏUiuâÄD溭 {\³Ñšý¹n5Í#z÷×¹ak…싱ƒ’…_ä‰ÒdÞå!YI'ºX¤H¢žZMùiJÉH7{§¢LØØ½ý1ó5c"Dˆ†Ùáj–·¾¯sdR€yŒ¨Ð2%^öÃu¤a”kè[O—;¸â!nü…¶À ™ÉdvçPÈü¸êßWQ¾x©(ì “:ïY0gi¸iàϺAÜ"¶A(gæÉa_òî;VÔ¡¢ôH<]†,öÒà%~ôë°ñ­W|XìˆÖ}PHP‘Ù’ÇÆ.ö¹ý9h°Ç¹Éa%UÅýûKÔ\'?óG&õp ÙçJBÒ:$Ó­€°,ÿ68 BÇ4KC¥`_m•*ª[MžjVÏ pÉ}j@ãIÁà óöŽŒ\e; ½ÞìõºØÝн$: -ýÎé.âÜ#¥vMsŸ¸BøP+Í@ÞEX`‹6g\SøÇ,ïÁ­ºzΉ^]PbßæýEN]ª¶myw÷¯ç} H?¥f"sþ©K1Ëâ„bËwÕÝõ“ÏÝ-½)„ ‹­©c`‚½m¾ßà^ß^kuï>v*‰‡ŠH«gØšÆûÚ+C­ ½êëVp‡ùŸ³ÊS5KAs¬“©+OVíTô||«Ñ®Î=[µ» äåï X‚ò×ÇW½FἚÏUGîp lþñ˜Â%cI( R=¥u“DõÒCÜãÕÇLnÛ]HÒ™¶j±ºËd>¤B6óxëLPL-vœÓˆ]`ð:é+§ˆÔÓS×;{¾º¨!Ûñãî…IŠwÀV­·µHR°[B°nŠ·J"ˆëýmàŒD“§œŒì’ÌÄ¢£P5ë˜é¢/XñBw ÖÁ¹>ÁV³î8ãv÷²ìClî—zá¢i´{Üßé aQ÷%±¥v^ü÷—Rj±3jù‰ÜóBÅÉÂòœƒÁ§Á-~'ÚÇîÁ=j¨y^í·bq©rÎD!ÕWÄdå¸éCS;¼3QSòƶž¬rç]ô¾‡­ªµ¡ân¡;ªIÍÕg좮ÒÇØpOÏÏM—{‡´½Œm a‰ž;+Døµ€æ´¿9BÅDážÎì«§€n°óåÖ¥Ÿ‰ó¦z‚C¡j|.ä´¯yauºµÏ?â™ Dés8Å"¤-8´¿5 ïŽüÎÑÜoNÄ`]z–¤£í¨ô¼Í¿"H”Ðwjbn:ÿc­¦Í'8(î¬ý+aËŠíáÏÀ~%å"7ý, œf9&‰XA˜¦Ô^uºÚ˜£°ÖfiSê x‹5ÅÌüÇLÿ g™D®„J¦;ðä—À½GºS£=ùÂÛ‰Tó¼ÌÖ YHÐ/h€ûž8ghTÅâㇳh„±à¤O™žeSÒÖ×í,Ç©¬.–åq:ØOã_¶Xx,û”KÀo³Ó,‰mÉ“€Sw_»8ÊŸõ:ëE†ÍÇy‡M1UÞÙ2„0ÅjÖHú¹¡S.EÑœ/MŠ] =!šÄ SŠäÒÿierÛ(F°€€Çá±qøj¼~¸õ²k`=¼@Ç_=òFý 8!K[cŠÿ~VºÜý¹¾ËŽhü…ËdÕ {˜ûÙÆð­»¹¯¢–Ü_/GªÿW.ñãÖgí¢¡Õí&D.žZý¤?&1wòÓ{S½ Ô>ž0¹5×ðVLMÝ| PüCuÙV®Xž¢Y [¯Ø‹íyíg‹²§`îÕÔ‹#öäÏÈøŒ°óAߌAóZ³E"MURçÌ3IŠbÉÙ–:Ç¿åøÛ$I_š´¢ž ¢ýÿð JrC ýWܨß]»gèô{w2±^ÙÓ± ÐMqd;/˜M‹bêz¨o4bú‹7Žy~CŠt¡0VÓ–b-’U…š°‘[].ð­¢Sk@D¢}*¦®öøBÞ .i_ ð Ðúô^¼tÖ·c"¿ôÙ¤fŠ'í:z€Nž7@FØ\(ž<Ùµ·L$Þ’2]™;]û~køÜn¶M”­ö¼–£ýŽÁ¢rD¡LIPßïù]›L"-ÀºHÕ% t¸ ãœý5ˆ¯ÿs$ÅEÃ2v|QðÔ•}÷×þ“ó„w6Mirþ$AõÊtN­kU¥¥ñ¢ƒ’=tâG“}¦ßló;fð,«Øi!ùó~þu8*ç!Û–º«&[Á: ¬b“liyÐLòy虑1÷…3¸;&Ûm¶?¨à À %êÐ …”A}Žõž? ´ƒ?ºhŸ‘ò€Ý•?%°~%-œ¶—í*ÜŽ)Ýl¾Ê· > ‡àsT«µ¦–̓â¬BZ{”‰)1—{LGÑW¡…‚’µ–>ÂKÙu"-èaÝÈCÇÃ"š)ÑŒGY.”ã+ñœ%R°¦{íYÿÒÌáh‡OZ£ÕYÓtŸùçYoQ+ƒ¥§âRŸáÐ{E¸ÍÄ7ÔZúðú6ãˆï?ÿ)aZÎ'ÿkîŽZ¨ÆÑŽÖôd†ž}E• ªÙ»„x9.j`á ó Üdjï»ïW|3ÝG¶šŸ¯»ž·µZ¥ã §B\rTäú»T¾Þ¸¯·¾?áë——ÛÚ-ööc}½¾ÿ¯ö#çô‘}½:ÇÏêãøz°uqÒÆA%°Ey ijßXÓ„(ÐA©Â¯d)SfYœ-[|»ª¸;ì2º.s!”‘ £%eËfùëq2‹ý¥/_Ÿ$Ü7èRpïÉW3çà;Ÿà¡|ãmµ˜^=ðêØÛæ÷ÿ3[ú²w…®µùçuS^Û–¥úf”:i^•Û?:u)7\Êldìo{LFLs7Â3Œ×¹»4§ÔÄÓdnÕ¦º‡Ó2¶X̼€\㉮ü^¸1T¨¾ó·h=›PÍðZŸL†n˜>Ÿ1C›£míWˆ±tJî›üÕ«cq5§ŽŒYhÚâÍÊÙ¤äÎ)„#Ç¥Êd¼)ø¦×~€QèÔ{L>­ˆp½ËÄî:ðá¬ÑõÀ.ÍÙZ@Í’Qò…kÖýyZ‡ÙÖ×_+ ¹¸çF¤'¹7ç›×G¼Ùn©ÓËJâŠUX¼".ÉÌ;.4eÑx=žÆ0íã6{çкÃ28ÓäQì~ãØ@Fè­ÙåZ…Æ|åÂÿ`B÷ÃÆ¾p/4²ü“ö(rÎIODÏT {éÔ*À@[tÝ,£MQ´ß­•3"øq@“‹"݈ºÑgxŸÍÊØƒÕ‹²9n4¹^Mf¼>Eë3fjý 8Jl'rDÔB®™šyYc¡ÇFÒómží¡‚Eg«‰ˆvʦK»Wžt ªš°5ï&¬®ª da6ȵ !‰5µY1ï:÷«ˆÜгo¯~~v…ÂQ—ÇYFt‚~p[N mm3Šó„®1ÝÕ›³Es>ôu~Õ ÆýÍ@ƒ‰÷¦9׈˜·+€ÃÒß>|hcQ1M°Ö]§¾Xk*ÁúRÌ_­¨Ô13„èé`Š{°(KËÜ[yÅï{üÂ)3áóBðœrŽÜ0n´$õÚrþé/xžòØÖPu8Úµa£¢"ËÝ}©11Úˆí´yi•k‰ÀW£åm`Ñõëoð³ƒ?‰PtÛ"¿_+Ý„UOþìCaB~¾JÀõ2F4‡ l,R¯Ëî>Ÿè :e=Њ|‡;•X+?[>ÛÍ[è‰a^zy§8Ã8°ÈŸö»À¯ýê<"ÈU ÂJš^£T]Ëçû!U¹ÒÑÜ{„¸×*\;ññ«2ÿgõ}rîìÒ`lýÙ·B0rÖáýv:æùÏ6kª‘ ´®ëbfíd0§«¬0MgÙÉPØ$Ú@«(ÙB냕I×ç)‰mT`@»:›Ù ë&÷Š‚HÓÎ)³œ¢ï6²/xù½S/“Ì5"òù¢WÁPš+ýøÉvJ®~ûÕ?Eèw¥þ¢£µ\÷¦š8¦ê1oÝ5²Æ“ܼ€ÐK Y›}lGbÆü6c±Dþçâ¶ÂLõIRÀ»éèŽ%ßÀ$ަ·`ìè=-/¨ò„Ô]•ÛÜZŽ’"Gs¥p²1 BƒZ7è»5‰L^2ÔÞ³|HiC9wODÀ´´0‚;”6áYu…#lÖ7÷_qøÇ)–¯{à ­|ZÆáž1ˆ!Éa§´‡=Ž6Rj´[Ò“„—u°r‘Ž’«.ÔJrå¬IºÜ,Ùnw¿Šš„ÈùŒ™UȦån$åN1Tiéü-x Îw–Ù¿¤Z–}Õ ø½ŒžJÞ@†‡¶µ¥5‹É·•ôÉ.ÞUIs‰i*K™÷IÑ€1'aoHßÖÃß8HƒG´úQL·Â|ÄìÃZH€¨üPÛfÜ6~¹`ΔŒe>ÜúŽ>Íu`ˆäMxWoVŠ—Çp-æ’àö&@fӠذ{ð,ëç/ë@2»]‰B1hK³>|ëˆÀç¬V‘‚’w…>UÝ•âA(AfsW>Ê©ÔÇ^ÑQÂüý„;+ ÷ D¼j¹~TÛºB-}â¹±’îâ'€xÔŽfà½/¶Õ9`àµþ•Jf‘]ï\M€WÁä—Æí§ÈSRä×Sôà2pyÏ\ÝsåOR„Åi·éš"Z¡Å^¥ë¢ú}½‘TV ¿@Â>e>5ì“xÞø3ÈX^pÒ»Ø}*¼»†í™¾ÚK¯|³ûþ¾þð„ÿ h€¯ 3<ìâ7jÃóþùrÙ¨=ÙfãG2ÒÆ)Ø÷ß6Œ½šοé ?­å#T²ܬÙÃ_7ˆw2…š+%!ûâŠ_˜?Þ°{éy` ¦¹1”HÇc*ˆ?^½“?ßµ´œÜ†œb“e ÉN[„Žˆ‹Ì€.µas-[âLD «ÈžBV£þbWdÐó%WSZÅÊÍŒyëë9ªikê)±ÖÇNgkTð·;ä0…'%r.‘ åÀ5‰£ñVлmŸ*ox²T]*Ž ¦r.í4I"{ÒìoÐÝ%†>`šè»1€ñYH­£E”¦·ÒÈ{uv¡WLO…÷‹øXyÊsù…ÞCuò“ÿXÚf‰1–wã¢ð}3Êä+KöYlbŽ$ q‚ŠæHÓõãöâbŸ~=’ èÓ‚¹9¡€9w­×x!ň5jÞŸ3Ìüdyo¦ü d1´ˆï­™ßÙfRW%ƒìM#ässƒ.[ß°†IË)ßI_WEÇ ËhôL¯½…|jXp7ë€ÈÂ{¬–·?òv+"wôñ”@·$íùIJTZŽç^=N’hë^vÇ,ù*ȼàx’³3èÉ´ZâÑ!œ„è^ˆïÍæ„Æ3éCm2;mœ\Ý_O[^²4'Hždi…¤`%¶YP€íAñ‰O¿T—áƒ\ 4lñüTKŶ¦§&uˆ¸2´±-³]PZôBåÝú~TwŽº`Æ=8ùóçÑm ÊCfÐZKÁý4Ûf”h¿XêpŽq<ÄŽ½U‹^2;–Ð0‘„”Ý– iàÅ+?n_éÑr.%r¥ù„Ó ‹Á»Š€iSCç¤MmAù¢{&Ð1¬=9@ž‰ª2U:,Y‹ÆÜ+=­÷#²Dh€Yů‘æ“Ê8Ý<†ðøV:2°1ac LrÈâ÷<ã%—o¶Y¶qöPO¬×Õµxò¶¸ÌˆZ9Ò3΂žk‡²v[JT£B( ŸÄˆÒ =†t|‹Ý S*¹áò’ú1@ô‚.BsìXôi ,MBÍêâåè4Em-®õMI¦P§àËr3ïo?üJô`€ÿ1¾i¦‘y>ꉂšM<Ä.é>ëRÖš™f­±œáeêÛ²_ÌëÞ°O÷Ÿ'EÊ}Ûc$KÖF/¶kèQòޱŽáþ4¤=åTŸ¥ßÖb؇d¤‚¾bRt9«ã2òË4vXö:³±GJü<‘—¢Á•F SþÎi»[çÈhVvÜB :wÇmo¾‘–ÇãÔ€«úXl© ïûn'sX\¾UwtIÉH`IT#_P]u¥ b}w3OVŠ2“èº|ø˜ŒPñ¼Í6}°ìyù¼²ûÖ¸8ÐÅÂci?NÁyËQD€8T¯Î…k]YÝ‘•5ßhv+±U¡èîÕÖ1ÓPë¼@uð@ÅT§gA†`œf{am³× —!Å6ï¡“ûº!²\ÖØŒÏ‘³¶mì0¥—ÇR¥ðñg­û¤×‹ÏkòE ËаɛBÈ H ò# ¾A±6BþôŽôÖTXšÖ_¾®iîPJ©d¿Žß³Þj5xŽ{·ZÃèWÊ®®þóß vFi’ªô(g#¨ñú[‡wc¿þ­ž`»~ÎP':(ÝXVØÏ"Ç©‹…`Q€2ìž‘P.‚;úPç~*Ýøù1¯fsûãÀTxÙÊ›ÇfE ¶…’ËW©1s<+½R ¸zï‰È #Ÿ{DEÝ¡ûŸgK‰µ‡\1×ò¯ðo/âïW¿T)N§òW%U>+äæAPHÕ-y¬¶bOûJ‘Ì_t“EmÓY‚†1åAfxF1¿)ë÷cV^û&“hKHø>& ÑCÕñq[ýÂ{%*ò6cy…1SPßnp÷;šÜÈ4„]ôÚy¤ŠðùZ~ò1+ç]?Ö,<7II¥¯‰›ßŽ÷Q®¢`K+tU:ü½UÒמžÿ‰V£r–¿(³×™‡çÊvýh, Œ ‰hêV;…³2p%O­–A‘ÞÐÈ«P\Sœ3n©üÉm_s“gB˾ºá6Òéä™:Ï1ÆÃÔVm /SÃf^0åOºRÍãSò,‡púŒ¯ÿj¸a³~ä‘âÌp÷«Î` jÆZ¥†ß/Òb KÞ êÐpÒEÆîF2¬|À˜Ýœ©Ë9D7:¤Z#«Œ Ë6¹“kXà\û·= dì­ˆ4 xB„€Ó€î k¼±FÙ¥†’ß»>^ÎÀº}ÿV^8®_½~Z÷Òth¨o¦H¢‘p“yC½)ü(»]X˜O˜ìKBßP Õ}=÷Ë«4+Tž‹”)ÞœwqJ‘¿ã‘ÅÓ”MÄL‚b”Ô½nùßâwÁZ¨ÚìÓG@6³p<UH@‚ÃmAÛ1."§tB£èïȸ^^Ä]ÞÙ6¡©àÄ~f¾ÍÂ5šbÿG/{9a­Ž_ÀKò7¡ŽÇIÕ…zb³£’Kl 0<©’ýZ¦µtP_Ç…_r‹°ü~Ëœkd^öà8Î'J…÷Xñjƒ£4ÛB® P%mùÃm÷dÿ{™ ë?^wÀu”ÍúÐö×ëÓ¡ÈèŠA•ì*x•ÛSÉÆ{K#/Úè=ÿ$xŸü [é7µˆ œ©å9¿HL1• !O”ÝAÚM´Emô¡G‘Q4D¹Øè/Eï¾¶MªmÔ¹ A»¸J_™RO/44¼‡KÏN£CžhA.]gL½°ag¬Ù`â³²³‘zUqêæŽ˜o›âˆþÆÓOFPÚ£6åÕÖôT&‡Ë:YªõcºŽb“„qvùúz+üø®Ó±(5îB€1 FVÝ2^®Æ¢ËÏ(õܹîyåµq‡7Åòp: Ã¥fµ~bc†]¯ó‰^ÂÜä„ ˆÿ=‘Ñ+-Ì\^±›D%R\ Znük» &byì1£Ÿý”R×gmb(”˜,Fõ´TàbÒ𹿱Ý™éö%p™&™³h ûJÓ"ÿMID†*ãõ’X%÷'ÐÀom3d‚"›7ùO,0”—þ)XãÄf•n892Ô=R€Cô´SÞo`¨%èúOƒ´r¸lAþà X‰HuLà]/‰[Ž•¹[o*bÙd<ÎG"®üÃrÝŒ+δ4•,D*¿¬\ðH‰ÁÆ#S¦•û¦úv¦²ìUÇEo=íƽ Ôz§ÃŽ Ò¨\”·¢1\àÜ/’ðæ"«Êa^±DÌÂ¥Nÿ`ÆSÜôàrÞ„àaö0>¢ßX§¿ÕÐQF˯U=ž!ib†Îã,ªÔ¾£¬Žö.ý¼““V0›ÄÓÏVÃ+É—ÐE d…l\ËPÜÿc*ª)fg²ÒrÁ-u#Þ½6¨ °ySùÀ]ȹ5–šRZ†$È©æóVçCVv"¦1„ç/Ûó”[ô¸‹ýãûbÓÒwÿ>iàåòœ1ìÙwbBºwqÍ_µasôi‡>èG™*¶‹oÓÖNduÖ鼋D¦aVÜ›—NÏeÂ*)¸È8±ºî)S„II¹Ô{uG±ã ‹hm)§sÛå#¢BcÍ‚¾—àú‘CÁÖþEïíîåæ_ ¼Nò™bÀ5hÿ'ÒDÈád h+)ôŽD0É·˜êæ0IŒ«ÎUZ}Áå58<$Õg°ˆÞ©&¸Šk­@ýUç5 ‚‰{àˆŸ¯š”aîPò5_½¥âÂg{h WŒvâëGJÌg"óÊrJèež"aq¾> Ã5çåº ¡ÞÂlQxXî_o‹¬z(y“oEyCÍ;PbÿÉVtž•>‡v9' Z1øâXRG\2¼/•‘̆ýâ‡pó'÷ßi(î÷ÄX"nmOHËz€ÖC€+bO©h,ÀG‹Ô#ª˜UvÝ'©ƒ/‘k†œsÇê‡ðÖšûI9ýoôKe¾úa“5…67Ð ¿;ƒNÐeæ÷PĈ#îÑ{FÜ„î‚.{¹3p”!$ÞÑÆ Ç v@#ƒ‹·f¥R%*o#àÿ2%÷14 ÃUꤒìå#†š{`|GÂ>Êæ»•AꎶõÅ'ß22ÞGÕ¡“E,È~©ˆ¸pÓzöŠ+ÎSÅåMѨãWÔVÉF)–ÿ‘°ÖÎø}w§5jvãÃ2+†ûWŽk]\½VüO¹;O?µeFÕÖªÉt]r×ýÐoýÏ׺T3V¦“¢Ñ` ‰Eç?œ Q—¯غôcÅÎ ÷7tÊt;çeÛ}ø2ßbÀ;E»3ßdo$Ú‘;Ï׽מµL‰›¯¹˜Å<óŒ Úë´|ï1”cÍ7‘ ý³Ûþ?mç<ø&h†Y]ž»Ep¸”UìnÂùIýˆàe‚vküÍÔ¤_½¡Þu0^ƒæÌi©ÌÃE™§ŽG)k”ÂÅÅx4QEÞ9AÔ]Ü^‹š&ÙŸbãÛ3k¾Ò³Ó¢.±=,,­j²Þÿ+ÛTÛÖA1»†ï³¡ÏDþjFàvAÀPïMî~dõ~)tÞm‰ºJ({‰ 2ü„Á{#¾5ñ”31r‡J%xnÊ«’¾~x_Æ¢dW¦’Ô‘.‡Ô°Ê>•`q¥bûÀìþžøé•ƒ¿–íoQ+ì:áú±“£Tq]2À~"‰ó%,ƒSMˆÑ”þHXApsjA:Z9Ò‹æÚ7ç:AŽg¸‚”:e €}k¤Qß Ùl‡€ž)âÜmÂï©Ë¾ r4¾|2Ô^…fîiƒàà^ˆ+o£‹×¼DžÍ\É`ðé§§Ý(¥ìµXÿ €ÁfÙfÃgÕ1XRmó¶Å%³œYÀÙ†Ç.S"9',¾Í–Ð z´¸87áÖ¾²–’ÕàðÉwÅ|pi~`7$ªY¾©¡ŽÔ1™ˆíÏ>&~„Ã>øóçNWÚJ†/^¥lªbô`Ú7»/èç¬û—5„l{à!_Žhø”RŽ´ßø¦,¦r|x<&g’ 0õ% ¬"Òm¹0ð+r¯µš 6µ‹>ð~ÎŒWBJtCua)æ`Õ?šý>eƒ`Îï>ÿWáIÞ$;OvŸW©q7Ü–ŸëéÐ0¢Q"iËÉB€¾~DR–v›èÓlÌM‚ó´ákQÖérÜO ·‘T¼#_´TiÚSpi=ô˜ê aZ±¢)r°YÐÇBx>"œ½¤`Õ\¾ø•ü˼â‘*Ýrö³;–V’F#ƒeÊïü¿òˆŸ=«'‡GídíHV0ÖdCÒv_ÿ{ ŠrW}Ëñn¯7 7›i”¦(\|/49³é0BúV#þ¨ôÑ×uµd(e;¶XþÞÂ%nýÁZŠ2ÕðpHžÿGïç”à÷Ì(ÆA¤’‹# ç¢ …ª™Y\BãŠÔ‘|Ç+¢ZA;‡û"¸B3#2|Ù‚îƒD§PFÝÂF z'œø"ªCŠÚÄz{V’ùØpE‚û™ÑHï½,œÛµW7lSC\_!¹fFÄG¦¨lQºO&Û7È6›¨êñD]E–ᄤµåq$ ö˾]ÙûÂ7 ¬?~vöQjô¾oŒ"K£ü'Ħ=¹!{ò¿®¾>Xòq´­™ Bí,Böh6Š`d09¶±·¼FµsälFDZu4‰Ö„6YD“,ð¼ø!X’/®:e:Û;H ŒŒPtŸ8U»$i’õ4—û«ÓÀL»ÿz{ŸÜ©ûw$ÃÏpOû©•ÓÓ\¬š¦µNB‰§Ò²K‚ÿAÙˆG ‹.k‘nÕ´ZaèÐM݈Ñ]Ä ÞkÇ¡¤±¿5þqíõkCYz©ÿ)HȇÛÎŒiÔ7£h3ÔH@«$f5ãÊðD²ÿjUÍõÃìÃ’zn Œd–m„zjù¹÷Ë“³€Õª.²þ%=9~jOÂ'k³qP5˜^ÊS¨’ðIBªÙ‚ŽPUúfƒ$߆UK¢úÕŒ¥ sá~8FZ>î;¥-Ìd®ðÀ½¤Æïš9·¼Ÿíz/™ãJÊÆVO­Y†¿¹!yŒõÊ4?6î½t.±Z¤Ò_& /ð©ø†:‘°ÙЀ¹ø˜b‚<"H½E[ì_’bûÚ1l·]šÈ=Í皯¢>‰š"M‘X˜+Æ®:Fö©˜ÛÜ-›U>͉B—0Á žfü‘úÐoM{žQ Ê@,­û oPá¬É…~¬ÄæÔÃ'æC4Ïò«55 šr¹ÒÀø Ž0éý±6:­;¤Z牟IØ©vNÆ›y§9ô2À{˱^Íãÿ")÷ ËCŸƒÍŸfqžE „W‘pþѫߥF„>+k£vÎÁ׊ Ž ·Ú×¾PiÆ;ÞØ)` (ȪòÊ4p»Ú¸C^ܨJÁJÅ ¡áð€Ô»O·lTu刿V½…ÆRÞ2Q~,]Òw»T£Î* ŸpáÆ_¼]ìUj†÷…K ÑçS®öD¾8ÌѵB‰ea0vÀ”€Ýß<±qŠöæGȃ$ %UqƉ^ˆÚç”@yíLoS¦bªŽr>‹WOŽ/ê Ó­pu•uÈHbèr˜Šn]:XÍúê³à¿×§à…L 0jôæšl¨ À%l„Ÿq Wè²}0Vq‹H¿{ð“?à˜°f–`rÅRaÙÿ+­åæú@k€R(q"ak#zᔆd¼<}ž ã<þ^v›–3µéÖ*)ºÜßúUW³DOÁˆÆg¡äkwTJ,OŒ¾Ð«øm°;™°qÎ M¹{úð–^ ö18¯t Žo>Š…š“ôùµ@}Ï]1øO6e»/Úƒ[ô¾H›hS5;å•„¼%Oiý–{¬ÒŸ'¾l3šPç({Þ8 wKdmޔר[7ò{6R>xÿ)ÆŸG³;ž*dª óo’ÊþßPçmÚ2ò@Ž×ŠèDÃòQ;oÊ¿ñÊåØ%T`Ö¶z®*•Czìæ‘N\Ž ”Ùð kP‰rôÔl{µ»ñD4º){Ÿ rAPáI/øº/Í!Mab±Ý$™{šõÚU¸ô§¦ºÔ—D CnIêÈf¿4Ð_ê‘bK„m‡*Í«É)+{wÔô#×X‰”†-&bÝLö¥“³9P“šJÉ"jÓ˜ö¶&sî!ñ­›.¯AMØ-_;z„ê¾%w™Is…ç²ÿM@EOµÖAœåwVêO7œtŸð£Q¾œþ^èŸSïĹdœ –ñ+Wyª}ÞÅoc©æ¬àÙ\?õÙCˆ¡¦¿¤}°Ú4 xÖñº ÔÜóRv*±Qyt·Aê ¥–[KZ¦`~`Aæþصì$ Q-Ä7ÈU÷…­Ø£“¤Wu Ý¡¾Ÿ””Äð»Â´$ù® Q™?k»yy:=ôËòÿXv^ÈŠ›²‚¢-3€¾Ôã´WF{ƒûÙ_Ý&–EZi›%TR£Ô{u¶üòy q°8‡†htö²÷u¬sA]ãÞ:…Žw c±å·3,±ágóCJðæÌD##&)»™´ªÜñZAÈxò¨5sÀ,݃ùć§Ì #ü‚mó‚^<˜jÃL~knû[×§ù­¹ï m¸(ámW‹)Ät”…óëø‰I‚EÕ¥®dèp°djá²qà®”û ^¬ Ô¦èÛn‚‹"¯,5äã×9ð»!¯Çü»[rÊ´lLóx©þ±rýßÏWV5~º¢ê‰ í IW†u¾œ®ë3éHCõRŽ„ø`z€gL8+Ì7J —$5ìE"y“ŠÊßäìD/Äð3í¢óõÊPÀ6ˆÞ ÔQú †áõä[\\æºô¨šFäGYuè"3á€+uÍ»ËÖI£æ[9ÛU6ê,¨V¼[àéy·¿5'Yk s»º|¡3-Œæd;ï/âý\ýOI5Aü=Ûâv‡&¦dˆKÙwÖˆªÃêF³høënH¯æ¤ŒãÔ¸õJoïh &ªq#\®Æ?EÏV”×R3’ÅFÄ¥t–´g¢[µ’E¤;=Ìà…v¬AXæËºT{úlþìZpúTiÎåÜú´·rïnF­Ö_Õ`biâŽzÖÏà | XïxÒ`½ŒgDJûû*†v‚ӿ˘xõi'¥í—²”æGe¶5÷.mÚ|¦'ÿAÇÜåq ÞÎOUGÒT…ˆ¨skÚûÜŒóN*‚o–ÁhPm®¼›f˜¤:ÿ4g ]ïœá˜ù›q¡º7°QñG±í÷6]Z£ê$+]ˆèf?è»Z/é·ø Ò_- CKàL6éÅVJW’Ÿòp½68«yeFàJoØò,½ÖRСoÅRfYÀYˆQï£F¬ÿ{ Èçsü`qGîøUŒm°QÉNגɉ \h«>ÆŒ¡@±è¶ƒè]Y$T䋨G(wbsM’§U‚œpEz®Ñ ã¶,(¾† RÆòÔÆöEt®ãZ…§ÿ5H¬*v”ØeäØB8¹v>ƒ,QµðËØ;”§?|’dkoÔ³'ë  hÚgªöýDJ~­Ç_Pp ¦ô‘¸*%6Â{SûàgЭÙ-iÉs÷X¯#e5][~*²t¢KG¨¤qjû"‘ã· b,ûÄþ»Ð¯Ó/¤F ZY´9ͳá&ºµ6G •w­´•ˆá˜<¦^×AÙW×NsLmŸŒÈ-YþaÕðûÝ9ewÜ·%«¢Ó4>~^N×=ÒYTŠw-ƺÈî'ÆxÄ? >xªžwªéì‰<°‘Y䃽wÓ]ºvåãqÒ®_úR:ç~Ôî9{ò6ZÙö¶j–Ì!Å=óe‡>­ÊŒ\߆æºj¸=àºGw rM7…ªÆî÷¸nôëŠöT)Èpì^xgðF­ÚšŠ!ø\ôw~˜Œ?”_îc ýlÄ}x9Ó]µ`ÁIN6=0ÿ³ kèºÊŽF²V:˜_€ï-½ñ¨ž1¼ØÏÙ¦ÑÉvS³>ì°†^lI*¶g~¼ÝÀ’fHÓz¦³=Ü‘ºúã­7ʿ՞†à 'âwðÌ[ê¿õTJnI«{ùÄy¥|qx'JžihAŽ­ðy{:­°ðo&ˆ?,ÍEáAÍ>ðs‚±Z§Á¸ÞŒý91-ο%õÿ=UÙÀå*âö£û™ž úKzm§bŽÊã÷šPB*m1Ðï˜|6÷òEEÚeÁèœì©È‰…"éc‚ +Ú „óå¿r PÒ>÷¤Èæçƒ<3¯Mp b“ßSiXÎ8I¡¨¹š"åIûèR΀€ãö¬~ÛOö§~ÝÇíLýµÝõ'þÝ'Â|çÿ6¬Ÿ9ÿm·v;ýý_ÿ%`AÉ3 °˜HŒ¨8̯ùû16‡ÿ„t3$ yÛ ¾X<49)¤—*=<¯§éú~Ÿ§éú~Ÿ§é­ êf¤ zÃßñä)m›Sq,a/ññ¬M ® 7›§£E®Å§Ì ¥ÝÓç—í„íÄ®ƒh˜\¸ctŽ{ÞïeºDHí>¦Og‰›(Û¡ØN¤A§°qldªœÅ4eòïQPÉTƒ—.[Ñ€{|–o†ßñ˜]ûó 7º&ôu †WL!Ðt}5uQú+j{"¦ÊÀ?C•ï)¿‚ÿEo’¼¿\Ê­1}fP¸ÄÛEºÅ{ÍŽÑJÑYèušK"‚¡ K«îðÿ#ü«Ä¾#¶ <¼ï<+Ò%«Ü°®‘«‰ÚQ÷>Å%s^íùû—õµÜ[Ê_Z¢Ê£)Ü`0€}5óm-A<ÎÎ,þ ÚͺÂO™º)#¿ñüÇñü~è:Ÿ°†NDw½Ô㙓[‰Øƒa<š¤n“hÑLˆ½"•q–$³O9ÇøƒÇ-ýom gZ´ã8÷äÆÞ Ž*ˆ‹ˆ÷KëE™k ŸéO>°²&I %Y¢ø©°&f«]½º%(v¨UmºçøV—î¸K Ø3E`ŸXUc>—öš$ÿXf3=ÿ6J¾”;p‘ÌIþèMq͵­6ä±åV‚ÅÚD=ø*W„yï=“Q3ƒ6Ìwh@×j¾‰‰7bç{; |:`Å00ª´ ÉÂeƒÚ'šv †YÕäDáür¹ö‡Ã¾t¡Iª+š8cŸ'Æg+^ã\Ö¹”72?†¤òù\õg±O;S‘'0ªûû‚h ¯‰‚ÊD™ÏOOR©{ úBówc¿þ³Â,]Œü(Ö”›Q‹º# •wËHý²’Á̯µ¸£„vu#ˆó8~Îí¤˜ýN…öÆèâîoQôA]ñ)†„ xLQk7œ_úe©ûKAkq°Z_ØH©œ€hÂyš«¿azmÄvÐfŠ‚ b\knéÖüálÁÎ++ônæ”ÒÚ!VˆlÐýœwÊrêÉTĤÃúƒÈF \PèƒOÎÓß&³•ö·ÁJ$¢#)…wd*Â*dv¡L;tdœq€±tüàUªåOû[´’¥M‘¦÷á*è|›¨(ª?4O†uP#]j×›FãÛÂ=ñÌ\LᡎÌÈ÷C@ª6+.cÿGéܯÂA¥˜â0P•íá¡02|* “Vnª¨S‘ÈþäDT4°ÛNñF.~ˆY³t® bž*hˆÕÚ¼dþÿ‰êê¯O¦ãßl¸F—1C9†#ûaKß‚ŸcuÉÚ’äñ@<9 ýÚ 'µ è‘F„Ô>nµ‚r„"‡•'ow¾ ü*v!Kó¬’P~Î'—›±w %—ý4(€Ñ—¨‚7á/¬I=ˆ¤mžŒa¢)°F#gxôMÆõ›R óp²Ô¡Ò&Ò¦mì"GŒVW'k‚£foöEùé ê«SÚ¶sÜ.Å¿á^ÏŒE¼ž~]Äç° “UÿIW;j5f[¤ôs ÖÀŠçh€j:iõ+<§öœrØêsK¨¼ƒƒ"¦1.«}´=F‰Ɇk˜ ƒø’ü½§Ùª«0b£Ãr稅ÍkO‡ààšD2P–[ÛMÕ<Б' §ß}}ÛrWõ®TC_º.Ó0%›tI$h=—ÿq›Œ&ãw¬Wuµ;ÇÞÎñBßŒÞ TØöNaé z¿A>áG·z—dô ¥a5B°˜aåþ­+YTÀÇÅ9"²ÈQü1UÊÔìO N_êßD-f­?ø“"“×驘Œ"$O³¥i-œ~“I$»ÂPNbOªÌiËÏ]RºóEeiÕÀ¬Â(gìÅM  ÏW¢ÿYüm~…ݺ*“9ŹlðWˆƒŒ¹REK<Ú³Èxr½d¾t?÷>Å%¡î%ö!f- Ñ”¹ø4Ô*†ƒøuN¥RÏïáïp3Æä­sb­¥?€è¿vRÍ…w˵UÅ#r½…̪©Ë^Õ©óõó6„$j#æÔدӭǪÂñ3[pp«_¹½ÉßæPë7MœWš”öXÇeZÉì™)¹õk+‡´¶s£P|ûn·%C-eCùSŒ¦7:€y” יʡM¦IḼ¯—8†Æ6ZàÊv2“¡q½gMKÈe¯yÙƒŠëø©zËx«ˆÙÒ½ ¼c°7¡š_÷«:²yèÚ÷UF2©l¯wX«§nœ-/OL(N£@æ¹è¥ÉÿÙic09½ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ ¼2ÿ“ÏÃ@@^ßjÆ_ŒüdAŠ{uÏØà¹½#­VìÂÃ/eɶüfKÖ!Â~5-h<^Œ³AwrÛõo·aà û‹t’®{F®#8´NÙj¯7„Æ•£*±¯>“p1R·Ù»‹Ï/T¤À–´;6Îâ]¡ºeYoç/leª}wUO¨Q÷‰¯L#0²ÌBÖ?.ñG°„ ¬OÒž<|ŠØDÙ¬þ8›±cÐáüH=½gfÕ#XÛ¿ëý~ò—™qeºÄ•q¸FìÖ 13ßÌ'l4 ´oÖÿ[M¢öHH¸4»*4™—^ˆäf¶þNìÇlÏ w®wY€€ÏÂÇ^›1A (ñ³’÷6–è`˜jÞd\)GVæ‹èfž‘¨¥h77ðõH·4š·˜ £ÑkWŸù—Ú«‘¢m"q9Η~ùód*ü|ÏÇ…˜N½:RŠö·3œ÷‚”˜g»NPdE„o˜ÃÅþØ-OáQMÈ”ç÷ÒA.$BwO<Û^. ¶R´ži[lÄöüû.…bŽè.Í Aj)R"ÆŒècŒz^çÓ³ì Äà¡6J—q) b'+õÃ@ëHÙÏÎÙÂÏÎÌ©7[K”é4 P,J}è2³2 H“ÖÉÕÍ(p7ˆó˦y =„›M3¹Ö~d;ÇŠ±™q@T÷‹eÂð‡Â]3Ü>~‚mÿ°ÿ6üý>ÿjúæóò-Úìã Ž#jð”Îüú,"¿Ý 2h"Ä]YøÁãâp~\#4’Yï„ëö¸Zàõ3¬8ôR°0‘Nô1Ê¿•}’ÏEcŸú€©¸³pÂÎË%/u SdœíFìü9V”AcÔŸÙt{ïqÁL”Ú¿’ãõ*ˆ‹e:rÇÚ"c³nBèZâKñé†)JXqÝjK<¦hŸtDöÐ`Y˜±=]žŸ^ÿÌÁyuY?ÿ9ûâJö‰egwzJ³dp„“­}öÅ2©Â¤EW"¾2Uúr»‚æFAj¦,Á–ı“ Ø¹½+A¼ñôtõw<„%ƒ•lòŽëÅz„k·i2Á Â_ιN ÂÆrmW=âu¼ã€ƒ÷£C&ô}Î<Ó·gç%¥‚Šw%7ýt[@P í|ƨcTúßïùænBèhx—KïjÈš QcI8…°Wvˆªè­ÉÛñÀR 9æòÝ´¾Ú$´eˆðˆ!»+¤Àˈˆ‹!±3™’x¶°ó´BõÁô“áº8#M‹) »Þ‹Q ÖXû¥ï€ ³¿–š„¯á㔲/ÓÿeNŠz¦Éß«¡™½V¯/Kí'Œ·ÀkJ»5¨C¼=3ä—Z׿•?&‘|0ê>•Àa='±æäkÖEqæž|øà0žõßÑdyÌà9RN/,²2?ª‘ï]Ø®;Ž™™NT\µÀ6€€ÏÍr?~ ­>Vîr² *;”- ‡Àj<µ(®Añÿ%‚ ¯?ZèX*Iž=/J V˜¨ÈÞ«‰4¥êÕɽx’±\íšYݺ×D‡-¸ž¦ã»:"`\ÖÄE]-eÌþ•ï±"c³nq!'ó J®Sý÷É!y¹„Šw%I ´:z8GšùP{Ä‚ϯ¿ð¦^¢'Ó†y1ìËH'þÓ4<·E“Ò­´œ¯?Gä†QA”j¾å¤&þC~ÔØ÷>ò„ow~òSòCÉætœà!*H5–Áãßíâþ±P’°òu6µ’¡eľô»ÚR±ƒÅÐ+ͼëÈÏϨ ùõŸJ ฮwm¬i";`n†]CJ¶8…fÊ—jæFz»bÒè¾ù䄎Sb•ì;ÀvCð“5_æ€L–y½gò ¡( Š7 ›y"DŽJ~$“%äfM0Rá¶à¹Ý :ës|oŸŒÒ¢"Út­ó¡d?]'šr?¶=í,l6w5E¾þôdšüµÏÙ"Êõ¾’}M7¤6o¾‰ ÚĦ·Ø˜ÔW„pƆt Ó)ž ,m¡ÒÙá6YB¥[ÚçÊò€¡Í| …*ßëÍJõIa¤<Ö†—pÄmç¿ë³«ÐV¥öÓÊg.5 ÃóÿWúµR­ŒôA!Ø£Ó!ßœª„@c ù8†S2VbnŒ‘A˜ÃÅ¿Pâ馿6nט“€Ê8«:y·Nö¡ê«r¾SÍK€njÔt³6ã:Hˆ)Ì”ÈFšàíƒT³y_Æÿ í’…|8Ï\Y„Ìk‚dT™ÂøÎ}ÒÄ\L/X¯Q.{ó&Z–VdÄ,f^Nß2ÂoáRß!-šHˆ%§®]®Mš_* û#Bçl;,&ãÑ}6è}üôÜRÇH‚T<+¥­Î}è§S¢?j n£ÙB£›’R(c¯œZÌìÓÅ”âá˜xcícÛË´Bÿr¹„¿¼Á/Π=´ZÊʇÁ}™¯áÂ{ÿ.~Úï.-…X¡AkˆáÅöõ“èÍšѽŒ.—ÙL«BßZS~¢ïë0Òô~Éú‘AéµÌEaýg·‘²9@-ÍÏØLçQƒyâ7ktJûbäÿlØŽ/Ý]Æß y-mq çp­Yºç„sÓzÀî›Ñ_Ô‰Û·ˆùo9UíDÐøÄ$U˜# u’©È †3dͰSä­Ûí®ÈÛkOﵪj+d-3¼ž|‹äåèÌ€e,1ଉ hsúÃ2È ™È)@Û›Òƒ?tdJ~×LÕ6óŸŸy—–{ènÿù®_†4Ó Eb5{$u Ió<>‰żr^{öá¤ÒÐÆêŽ@À׫0X‘}áüÆ‹Þýåqlö f²ºš¿==k 4ÑÌ °Œþ6Äü³ô~óAë•§"¡ù‹9jϋԖ^’¢1³” ~sQïÉÕ7¦ÂC;rONk ÎŒ °7sø,y–¢·Ê¤p@îèƒ\¨ø÷TÁOJÙÄñ}V0‰¯‰ºC„¹†šoóñfLÄTE‚4³ý‚ôÎþ[ ‹?‹ åï%=ÁœT…œ˜²±²`×z¥9”¥VAÂDe2kñG](*Ç.øP6—‚û TØ óTËØ7𥈥GÃp8ÔÍdO:ùÐkéŸ9.ù(Ü|‡AtI‘õó8eJàAFàúß<¬”áb&J: ûys2 ÉL{ö* ™®™¼ÒÜA²Vx•Y™Ë%Ü^¥ÈíRWßF: œä`†òÀªðàËq°6O™oƒTX––­y»gžåJHE`„Ö{¶ÅÌh³\‡‚ØœzêÀAÄ´Žô_ˆƒ£ÞÔ-ñb²ö£p±Ù†ÈÉÇ)†—"n†DzÅJÏ_Þ—wÛšÖïæ{hú.ÆU$;nJôT-X©ÕÐüö9,wUoå1¯èü`ÃGó›{¸Àk Iœ¾žFø®øº{Êc§"û¸KS‚«¶%%䜪’œJ;dí¢/Ÿ&Ë4Ð /çWH(S¤â©Ù%g=>¸¼äËl¨(“S$ ¶C¦†@Uî_“˜tðçGÔ³Ï+``Ÿ´íRö i3§N'“€g|n®ÐQÁåÑH[‘WkÊ¿gú»s–î‡ù ú¡£õ" †a投X:xZ# ô{Zð"óÞõtî†G5XÉ:€@Èr\€8±ÙGCšÎ 6‡1ðq‹;S ¦çû¹—3*ͦÔÝêP”ež=`Õ;j å¹Ò#£(¨çú߯swÊXˆ7lÁ/Dn‰ªî:Ý¢…!*8CXoÉúŒ>z–r^²—¢Þ%àš¹ò(ºúrÿ`_ºÆá;…è»9\©ï1¢y±áCßþ‚œn™(+l›ûQ{õï giã(?=Ð2 á…ŸºÃ'ÞyD[´°‹ÅÖ™\¹­M¹)G~ܧ-<–Õâ,$]ÒCĺzMZJ¦²s°ÈŽ-ÆöYÈVÐîŶ:PËÍÀ"Š˜í4«ÃX,øá"")$ÅŠÉÜCNÔ…Áë°Ù?‰¶1Y¾c”|jt"'¦ÊTqÆjˆð–í²¥4ªª/(ðÂçfÔkÒ5S)Q¿N«uKÇÕËxJŠ0éa z¨ÀŸ?Á¾…྄3åóUi78Ó`îÕŽ=X7xΠ•‚àiÏu­h§ÜbIP—Ô8$Ëë°x§ï{|EnªÚW€€ÇáYOη‡áD€%h|Âs>×M/¦œÿ‰T^¸@kU’8zˆ¿ÑtPÚu„Ôø=H‡‹[¯ $'>S¥Þÿ:D,Hùˆ­yø:pÌÆ‚@iÚB¸ºµt·¯@o»ãúšJüµ‰ûê¨Ý<6_ƒGŸáÐxÖöþ+„þÛÿl¬#äEýó\™™E Ⱥ_Ý–¸æ´A”–˜E¦š“Îo%ÌÝü×Þ:&HŒðyéRT„Õ`;h¯ ÝáâÇÞhm“$çzŸ\T7àsé´ ñP˜Ãò«5Õ]e¹®œá¯ãvƒi×Ek²'ÊmÙó>mп£³«ï ³æ.Uþrà½Bò²€£‹Æ"!Ë0fqbD¹ Wú·}!°F¥ñ÷ËTÃpûÌÿNÛÖŒë=·CÞé$2žMÉ#øÛæ®ÖCú#?²–wÕFŸ´u³¸5f€¦KEØ4L§lÄ"¯¤êI.æ³_&×Qzé¯ ¿u$“…’5Xw`´oægM‚„²n‚ßÐëœÃ7ût„I>%é16ö¼Öeý¦èd, ÝáþÒÃp7Ø/¹î}tî‚÷O4 ø4^®Ð›^ 7…°÷"›u¥ËqA Ò]ʧŸÂ…>ºø À¥ƒdŠ5¨¹ë¨W»0/QZú’«—êÆä&¤Ú2òûïê-r«¯’½ƒ 2ÏÏÜ~~áQùû €óI€Hº¼í¸ÁXþ;Hæ‰Ê*ÖÁÁØQäÜ*{¶¢ XÙŒäÊ0ÿ}SUù­éûïEhU–.ùâÿ@Å.f§ÅÅ¡l¹Z<„‡ûßБÌ(2Qs§C±sÈÕbO*Ñ;)¡´æÒÜ'âv.ÅÛ·}e· Ám$"Q@„ÑÒ•–D3J¤ž0ÙÜoâI«~ kÜ…ƒ-` *£ÙW»«q¿L'Ý<•òªTÒdž<¡©?zE”‰8¶â ©äIùîÒvÞrâ’Í2âú˜Ú‰!¸P"˜»%@A:™mµ£ÈÍ!0våD+¢þÓQ5ë/^‚Qªº.µ‡ÙØ´ýÕ£W¾ ™ðl]Q&íL2þS¶ß½S¨*’ë1Ý#QñJSy¿OP]¨^Ÿ)4Žr‚IÜ‘/Ïò#|—¢µE å/7à£#©l+v©eø¯×iõCIcu PÜè"ñ]ÄøŽÑ©z¿¡¤“Õ.8NÊdºåSÌ4¢ÏDÊW{òDKEÓš~N©à…ÉáØ£qøz÷ uŒpþF"T =I‚An2/9ú×XìšA¿¶@çµ)yõ1y ðìž¼¦®aÓyZ¬›& Ö4’Á‘a‚Úî½¾Óoâ®ÌEU{Ñ IIDšÔ›Ò¡*£GÖ°s‰ûRÝ‰Ö E–‹B¨Øü ôbg!”él¸ 1G;ÀuË+N¶ë…n”x8¤V›%½}è°Úi¸\̓꼣÷2]<†U\56PLžíz+5™ýL.˜Pª¸Š“ßbaÎ1•·?‹¢rÁm¥a!&° $¯­ `Ép7æmæf%·`[ñ1CÝZC»¯·³Ê’ãwœòõ︬WîùÆ2qL\އ°A…š±& AQ:pÖ#ßÌQví–£ÃH{¦æÏk0cáiI8"IG$^~kðýÖâΟ"[g¼øâÀ¶†×\ÚX¬¥4·õ9Z–½Óà,<¢¾ßÞ“>½&„ØPäFèЭëkœ^N⟠aK.å9­+ –*ÉœìK€°b½¾é6·œX*­©jû.<(ºlÙ^øymRß!‚ÔÈëɼäåð+æÂàÂi+u9?3ÐÕUG<Úu P<°WÂ#Œwâ䈥( £õ¥—‘jËÙ,Ò\ÏÚi§‡£¥·ÏVzL;±ŒÎõq¢  àÏ—Q-™Ï Is}^>jœ`¥mnDÏ= ø_¿Lô°\ çoøê†‡†R%]˜½Mw9':"+± ôú»<æ]VÍ©¨IþÔíê¦#i¨öÍås¿È‘•Î.]TÅ–‘‡Åê™~1À\Ö S¤f£ûŸ•2¸ŒaR;ê<°ç£çAÿƒÞûwZ°anlwœ'šøãNÝú®dí?W[úëVmŸþ¾"·zü9S}ÔMPV‘k)êIÁ¨ìr:8)êüñ[ízIØÊ/ð>ÅÓtйʾ€®æÏã<Ɉ¹”`˜P×ÜëŠál^*µ vüÊGÏS —ãœLsD^åQ¶jDó±§ Ç A›{æ²cÃ{®"VÏAÏgî)Íü¢žd”?’¾B~O5†pŒr*…Üsj$iáÇÄøxºƒ´e¹ð®qt;­Ò8UÔÑÂ|sÝ?z¦Ç7¼½mÌѹ—Â$Ê$ðt˜‹°ÂeNÍ{è­òÐühõÛ¾œ17„’í;úõˆ¬ Ç%b»s‘À§·K<õ~k 9B5Ñ.ÒŒè“vd 6³ ªQñP5^÷ÏàU-S™¸ø4Óx&ÕŸyG7(‚Èv7Jšú©â/ç7–0vÊœ2[EbÕà YÁÄ€²*Ø.]º¿—•Ø“p Rý¶sŽkÊ_æc‹y˜LÂw>àÑL„êÏ^k.W¡Ä{šñ§ea ¾ëºÜɶR#—rÿ>"|m I[ÎñóìàXÞ¥yÁOé’{ۻ͡ÓyȆ¬ž&«|é É`\þ‰ OZÂ…uÆ* †fÃ}׊”ÏTsÍé´ÃÎ¥·±¿PšCcÍI6ƒ”Z÷ÎlwMÑ×µdÑž0ë`Ûè­yQõbÆ„Äñ@Ø‘kOóšmfɈpÞæÚµ-Ó€9¾6'afÅ—¦Ü`ÖQüwÃaª¬ÜÂb‹¸Ý{®»^¥ÏrјÕ`ÅQGŸ¾æ§Úªu%?öÛ aÀM’ò ÷3LÿsÅl€ð9ùÈHý¶×´’øS‡ V;½ó7$—Œ‹¼´ÎÍ‹ñ|1s–†—&AW”[â&¡uSÃx—‹2Î1Ì\g¤ògO6fÉÂØaáAI"ñýæC¾º¢ rÝž …Œ¡hsð_?•Nd5¼¸ìÜ\à§ @î„r”0æÏG$¾•T¦» ¶!ÌöS9Ô F…ŸW::oÉ¡”À5øú:ŽÂ0[Pùý(矕q?zCc)qQîà %d—_–5Ôܾ®aô%\üi9¹„×è5$$«åÀPÉ~*›ØdEÍéj#¢r j;ýœh¸xÇðSy"pšˆ™|4ðIc'ñÔyd™[ƒ?+ÓêlPþ‚Qûgy~Æð»\l%hÐrJŒ^r•Q¼x ¤E wKd7"YHØÅ‡h C½bD®!"¶A)Gýì~eæjÑ.1ÖUÝ)Ý*DO1_ôÁž„ý<‘4¯ú­áŒà »æ{E‹€#“ÊÚQLÜÚ™”¹etaÀÛSÒGŸxz] ³XîʦO¿&:^Ì¢ë!HE¦"îDOiµ¶"}¿•[3)ÀÚ/}¸»ö©Í8nSd&ü ûË×Mï½zSÇ̱—˜Q-#+±Ñýȧ{2?¼{üìˆ$¦iHåÅ/™h5Ç…®PÞWÞšCì¸ÓŸI‰k`¾8Ñw=%³ã6sCK—µ^´Ž ]ЈXf2ñ4j€5tD…Œ{ù ¸Ûw¢ó¥mÏ#àñ}DH2§Î/;Z¹¥&&Ø8¯0³àL“²ÀEÌù£· aøì5ÏS*Í„`¯.“ϾÔo^ò³k3\ ¯ ˜/N ¶ßn4Ò2ÅHªãDdˆ:¼Ž•ÍשYÁLtHg(Êj¹ëZ…e¤qƒ—MßIŒåÃx—šo CâH­Ù# 9ÜRk ÷y5âF3e>À2†Ük” ±1£gÿ:6­Zn¨uø<Á‚-Í;;nåE—¹õye Ó1Še0FRª¨¿Æ”õg&#Eä)Œ‹"Õ~ÅF‚žF~×3åÇéZ\ŸÍ, 夋 ~Òüc®2çÁ9pu ‹ù 4_K4w&÷Ãꃣœ‘ÙJ„–#*<„ev–gqôê¥3yjŒI¦Q£KiX,"ïå"Üd>lmOcLÌf»(Ñ­cƒ€ß’K"Z4ÿTP@óž/ÁÉOR±-³8µÒø¿xi»!íf¼Ö³þ"¦{5U´ZXÕp6‹¯v’ÖöD^h+¦×–R›ȧ›­)f%W– :¬rý-’N&4!¶ 97ñÖת_w— ͤaÏè·:à5a\Ö>s‡Ó°¨E>®r9öBÖ9éóž Ÿ­ä³;äíhíDU3eÑèÔïÒÍ›«7ùñ¬’÷{‰™O»1øö¿E~Ò&Á?ÂÆ8wæ¯["á,î¶D©°ò½˜$ð·PT”Àð ¥$OÔ÷‹jG^°"ß–"Óšü”K熧“zü#?šâEê±ÌB¿Š…•,d39]Ä.~ô_ÿXÜrmú¬ö·€eqžPùÅe`v[•:€DºëR¡‚SWiÌT⮥¥”,ýuç¹ÓÉ1ê!ËW©!ö Ògébš·HTÕÒñùÙaÎ6€¦§LõniÏ/h y«f‚€J β‰þX7™ßèQ Wì³@ä‚#;͆X9=´ÄU¥ôç±U½Œ@ÓÙâ ÀI>>%|‡Cä·ÝÀÄ%lôKâ·~ŒéÓjÜÉ­ÌS…;N›iŠâª-÷vß„¦é{¡^C‘2é1Î)ÿ} œÙVw†éL¼+§Óš 4âCæ«à©JŠW²úšg=[`&7Ókß^šH&¶oK«Iƒ» äLhQˆ€%ÏöôîÍã^1¸þ$*Gg“ÑÞ Šª½©2‚AÝš©‡ÇèAí¿`amÞ°[%·ƒK)Û (jdaÈYsr·_ ÷ŸÓ›•ªÂ¿K®ñbÀK³UÀvý®˜ËÃu*êU»Q’_§qÉ@z¥XÅ(í+ʲ‚@®¶³ÐeÕ¡»B€mLÑ{ô­AÇ,–cÝKè¿§D±`Px £\¨ò Pª¾Ñ¨øb"¸‘4íFÜ£šP ê…¨Jµæˆ÷;¼ëÔës³{Ÿ¹9¢£óÿ4¾Æs•‰¨êM­oá<ºëŽ 1€—U±æðBj\Úï“Ívõ†O“”O¸Ÿñ³Ø+Ñ…j¸–vîk“©…öjR@º&n{\T Vü”3HÑ]r Þ¯3}3üMD4«ïíÙ•ò 7 ¹ ì”Ó)ÿ,Ž:r° >´a[HèH±5iG'%ù8)B®Í$;<à×ÿjTŽwú¿bfÅPHºÀó%;H'HÓÒ ¨L†‚M(†²Ê'àŠ(1¥JÂßÃUÙTCÕ®C©€›ÈNE¿F îܭÉv—Úà)›®û¡JçAé;æ™àSÞ©Ôšp}B&À·ÑÅéÌ€x6›p…–Šì±„Iºô¨5úøI[0õ‡ì8ÚñU2VšÎºW*²£Î{'qóyb§zÇ{gyxð{1ÒŠ\‚ÕÂÀÂ:§Ây'<g­Äþ=õ/f“zëá¸1EæðS|)G©ÉSÛy³§qÀåÚ­‚ü¼ÅŽr`}T«C¶·-”Pcçä¬'Ãû4á£ùô©æAµkŸ)N×Ôs¡[7(5kLS%…íl3ÊišnU'èa%}I<‘¤\eK@'TÇÞìK5o2SE›óauÛDG£»Uæ;ú‹Àúµ,Û𙃛ÊÊ©¸ì°bFkÆ'u¹‘¬a*CÛMM踤ËhÂ'«s„æ‚zfÙ.²7‚”û3x“P€€Çá±Ñøk][ß¶áÒT"«nà¥%p“nö›ClT˜&Aõâj}„Çw„EÊQÍÖ… ë8u‹Og;QrÐ`]†¨A¼}k“Ñ»;NÏ^ô„o—‘ªåHž]…Óò»ýü`Áª±F£ thºWƒÇe¯PË¡ ¾¤¸ôía7?Çö@ðT•feÎm.Éê7§ægz8^Õ\or!6‹ µöýœÚÇb65-v—KX\@Î& xs4šfŒòŸI< —¼ 1Æ4˜€Ã>µsa•Fn2—¿Î×’ S7[rÿs?[ý˜Œ†õ5»Râ5Øaû¿:J½…h‡Cfm+Ô¾¯í÷ÿs ç±]Ñ ”2/.Ç–HÜä­­^§•·’9–³Á9[ø)~óÑs%©YueºÆÿAC¨ƒ"tì†ÀÍ »[ØpáåÏB¶“$/âs< ínŠ‚‰€‹Šm·5"åú“O¹›ƒ²m¶Ûl|ß!¬ÙO%ÔkÇán¢”A}Žõžƒe¶ðqæ}0MC46²‰#§Äd—±ŸGÍd!vÍF¹pé#±×à è“2tŸPpù\¢ÇÇòØ]à„­8{ÁšÅàÛ˜éˆýývo{¡Ö’ý.B.-ÿªÙczUÛ}Í% ·÷Y+ `¤F渚ôcoäeŸN›Q,èwབྷPÈúÉÜ6Wl<ÏHÔ·%ååÃìMçMP£. —ôömø^XQd²ñ¿ž7üi×rãë.°BØéÀ}>+†$ýîvnðF+©Â鯺·\„Ç{å/ÅSfÿ°yÔÅ¿a6Áx÷4`EæÊönr}Ÿ¦Ui™so+¯*×8UVæ—ä•;š(^cçDJ§ÐŽ]ÊÕ‰»ôâÖâäXý'/t—XšüÁYä]%*Á•:"J‘rHZùãµ»†Árfè¶h`šxDÌö;>ZDu;vIàêžûÓ¢¢¨üŒyy¹þ.Ø 6ò{QTA8îB­Üa;Ë?!’W@ðw¶í h÷Ù,ïëO×w3-ÝböÌUdù^ŒàÅþ‚ÃÛʼn'†FÛÖ^Ô×ÿ?«ãý#Ñ'^2ñ»d$¸_;nð·ý+¥döÕÝ$À‹\ð5xu0>c?gk1×Q(߸°õ²$€Y¯£r ÷÷¡‰î?Œô{½£ð5•>4G=‰ùŠ»b³VÛu8ÃÝ$ø1+±XúãPDºcU§„bLFÛ«ØZ½Ö§Û#xÚŽJèP!â?G¹3é”Ï U´¡’’dguÏD˹¤1²«Ý—~"·‘d¥Š^ÿGìÉ+z DnøºÜg g”OI…ÈúD„±§Óò!djoœ¢ØMüèÇ?¥NVþ6Krm¼Në”í ¨t4ÝJFD °>†ë’i:A9‰¥XÂk¶¾í-A)ż•ì÷å÷IÎä;º÷¦"½ñ°Â¥æ‡2[Ä1u¦ =@ú}¾m¹Hŧ†øÿtun]‡ épÛm ›e.¼ËVŸš#¾´Ts/Œf¹Ÿvmšf;@ôt ÎÖÛóæ’QtnÐG%ýy^Úo5ÒZzM€ñêrwsb”2›æÆÊÎÇò­²·7oµ ð j&n¯ü#!q«[B@öQ9ÕFŽßšd” Y’ˆ Iùh.dM¾ç 9Um~Ó‡×ôT$-Ânus‹Ù%~—)o³›ùȼ²•‰÷‚$Á?\'‰?ÑÉé‚×lÝV¥¾›Ý‡¾Ðs2Õ=— bÊuŸ¬‘ÎV7k ½IX£frG¦·«I^Ø9¦)Ô1÷å.1 b÷¸îƒYûnœÈK\tˆxƒq%O#iȹ&U)§½Ç.üÌÐŒ®hK œ£8‰!IL íÀµ£ð ~¼È#€êr쉽­¾½¾8øpK¡ÍÖa‡Zº/*èZJ·xúÍÙËmvK–Cm~–ÇuvdæÚ™E ™™^/úÁýÀÖɯ–Úß·N¤kô§‘M„²7çý”ÃZÒéÂA$Έ;Òvn#©ÅKçA'P­YKšx<rجÖ!”í4HÞ0»"óG‡÷>Å%s^íùû„ÂèX•Ë;“¾Ï»gµø!bbœÎÐ^ô Â@4†¿®šÊG×Ûˆ+ Á)¢@§?iJIq ‡Õ«:RE„V%+KgyÒôÇX5„Úɱ‹Ð>°JTýNeÖŠ ëèëOZ]Ó….Y^À‡¼€GkAá(cpw&L‡Yè·±£ó‘Aþ^>ŒñØA¸Þðög»Óù¬i©è•ò.Þ¢ÕeR9̆o‡ÉLÓßjË)âp¶*×)@yÒ‚jÑA4´áÁ³ãkÝÂÏ:m/Æ¡ÖΪM—uÌÇÜç\JMd], †ˆ,¡‰l½=¸½iíakÛ He'¨$ö³7 g¢¬êXûQ¦åzñuIl0—ž+¹‡ãÿAçVrÕÊÏl^áèNÀÌŸ}IºúU'ãÔx÷N›-QLY„hhurm Ò]ÔÌ …žEBªb’)ƒ5 lV6œÓ+í’M† d¬š{϶þ7ko;Œ#Ë»Nž;íäyñ_3H+/D¹{K`jiæ`1Û££WÔ†17bpq¸tmÍÏö狽ܬõ} “[£ý~oÑeê¯ÀÝ¥‡4.²45<“„—ˆ ô}¥\vY-5žþ :MØã@©E>ô{5•óST™µÍ9³–{˜'Œký¼TåÎã\gÒ0[¡âa‡y‹8ºY‚¿¥F*àk É8±T ¸ –Ñœ:«Ï¹Y§/pPÏjàÜn19™¯-y2PÄ7JPÖ<Âqê¢óéBï\Ï5£ ë&K#·oèHîé ZJб6[®%…û‹Âš–ð Ý…G‘l[íÎ\]>*J"E†ëa0c½¨ ]-1\ ä=î^ˆòܶ²Îb#O0¤!q¡º¶¥#–íI&96-ERo*:»ÝƒAÝÚ¼!¯f[µ„ ¥5%Åk¥Ž1ˆ6ôœøyTi<Ù’Ôã• 0¸3ÏRÿ}ɦ’~8çIî%'ï,:Wc®Q™»2ÏhÔ«tþL次ª¶o‘<ž0' u¯’ è’ª¥Ø×%4 ¹t¥qÄPö¹Ÿ>~Ú1W¡Á‰×û,¿Æ£TË/Bk#Ã[4ÿ=¬VŒMÊÁKί$®Íû‘…°f*œ‡óKŽeNöªhD³h•²à6²&±ÜÛ´ï·3.ï¾›¡{h±JP4HŽP×XúúMHÌtOAÔÀ5­‚#Y|PPä—%Ó”ÖbÍAYê¨QeûŠH2CÊ5’í¢·ñ{¥I×j˜±"b¸æ`ýººÃ\!rÍ&Wod×óœ#Äs9=Eó4çØ ZK³4õTxúÿtoògÅdˆ¢9WMßtçtßoѤšÛn‘KЦ÷Ò„à–RvâBS‚A XEÁ`ê@ÖÊ1-‘9¿ïΛ¦$»:=§¨ÊˆA^úÏ:>LpÖ1»×ÂöˆøH,Û!]îÚÅ I“˜š?ÿ:µN.ê–»§§V›È Ï,‹¹>êØ‹‡«š|éWugèû3á)9 ܱ;u¿`J™Kø×ˆ*?R‘’åº*öâ±Ê43ÞŒ´TÙ«].{bè± I lÅX Â@”Å- }’:<0þ€E;¢^½¶§eoDÝ#f½~(,_X¢8 —^ßɯ÷³™yãìŸß„l põ¦^V…é6%Wš:’à Š/‘u>ë¼Av`²Ÿ ´ZC}ïÈ5ƒ„¢o#)ÂÕ³d•„›&nrõÚï Øû]ŒÜ!!ÙT—ÏWsâ×òt ßÈÊQKSª®ø¸3™ûüÇÑSˆ †ÞXÅè‚Í©[¯§øì9ð7üö%€Ò‰Ì'±`D•¦Ð+HfZo±£Æå4¸Qµ+\áN0Eø£\þL÷‹1©™r–aT7u %«Sg°sœÕ§š[ªQ‹vAe)ž9¤‚æ¶»]‘Ú+DËj‚êrÕ‹Ð-7{ØðÃ8dn%¯¹·ë°I¬ù¯é×ýfÇ-!V$–wÇJ–_O#h˜Ê'Ó¡˜€ —ÒOé(Lûnm‡_I«Jog#ÚÄpÕó•„7ž/ ˆ“ãúaÛøÞÿbmÁ?êð|¦õ¸YaJ–ÌÖüñ±P‹j0Œcœ›ê½&±Ùˆ®Î[l™Š“‘+ﯺtÜàs !+ ÕeJ'Œåhøùs4ó'ªä²eõ0³ÏÞâLviš—݃…thÛ…÷)Ÿž¬†/þ“È UP¸<¤HqÚ +E¸Ö§ÈòÑQ;ò;`ßÄ mrž¨YñAÏïËãÔðQ¯«°ò9$(Z„fwüšL÷Û¥‰×µÕTŠŸ… `ê«7Ê®H«’¢³±‰0¼ã``>ÜÏkýn¸¶SÒþQÿEù¸x²·÷ ==4 br*TFZ]NÓ ˜ãV/›²ˆ°¹þU¹@ï ÞL5ÜwϬ‡ø$TL~0fàÚˆ̦Mý‹Ò¢lË”#y>ΠéÎÔŒ?¾[¥à¬è ¤eÆá_‚Þ*䕛øÏè/ç8gZ;Z\Ð&4ÀI± xô)È•(€þNñÏ™é]{{´v=’=Ûaqˆ±õæ§³-bWs…=Ñ%ëˆ Ž v†1,ßQ‹ " Ž·%ô¶ïóp ¨AÅð-@®½¶\*.³0ÛY/}ù#€tO?ØFx~±xǧ§¿w.*[¡.ú)E.9Ê?ûš.T©£sü«¢Ò´:í§ÂñÙg£—@¤iôÃÒ0t…ycÛ´3ÌAí›n#0Ê›k¾„¢îm/G-ÚÒø5ç=ë¿ÜZ¤¶ï:zYõwc¿þ¶?îŒZlbü•U Ñi ¨oùFÕìÜPßÑò“ 6A´i‡ó\nWHVUÖŠzuaÐë„Tbtú 0–oêQúëâçŒAƒãÁMÆìÌ5øSÿR6bobÀ½>g·35<—I1§Ä-†YzNv?½µjˆÑÈ“LcgñwfûjçYþ»…rÉÓ´ÒÞªýê+ )„«Ju??N—Îú™„Ã:ÊŠÐòbØÂi)S'Þ0…ÑQˆàΘJ¦6°€ žBQ&ð ¼eo6Ì9 §?%?›Z“µ?ݪSÂ8\uEÂIÿjÚçô"|‹É€Á_GÃ/Àó =(¢5h|·a%ð`›×[”ªVÚ¤‘]ÜBW/ñ[ä-29·=ïp4åù9QÓæ 3Méº{QµèJ÷]Å÷i0ã×KÃg¯Ï·žÕ—'™\mþ§„{M¢gðÝj™Ç"WZ··pä:0g5y†¶\Œ[wÆ“‰VÙ7NW÷±A~•;Tˆ¯ŸëM-R20‚€#‚•,ûïzÕù,«20Ž‘½l\íK khï•>Pš:!ì Ðú\‰«ø7g¹(œðªZH*!@»ÃÚ‚NÜiÓcLýu’¸Ûì‘¥“æ[Ø îh3ÀêÁåÕ±>a¤m\!òèsÛj,¼ÅSOð?Üè:Èe³ˆµ@xŸéoÜ2K¹Û,ß#À?Ÿ¥rÿ 3ÙÐJý‚Åp1Üà/A¯E•I2j³¼èCúo–½±÷x‹Fµ3Ù»Qåó6–Çí]Þû»Œ#üfœ¸<{E¥ê"™óÙ>2TB“Ùm9úW†åÓæ'ýÞ¥0(˜£‰ÎCºè\Ó‘ñ!â`ÍâU“ŽË=Ð9û1¢¥âÊœq_©¢† Jn¹a¤`ócw4oPÁäc½Lq«8¸`.À2Sð”ržoõ‰T2dO1õõ¹G;ódönâ6­N„õ‡ C0×ZgÃu$‹9OB“ué2šœ0ôïŠjý°j‘µŒ›ÅŠxFÔ?”Z—yTw d¼p ù´ÃkÖÏ4ÌÏ–ÝA¢’ L«'æŠÿ}w0©U(¬'€ñÅÛúBƒtxt¡ ^q¼Ÿ¾åテgL­UÄ;]¡€¯ºÄ–€²ß3çì{)ÿ[ö¯=‹’´ç^Ô“Ý$vfî™Û½hY^ö•Ù4Q{ôÚ󆉮 mþ€ãLG™}Ú4”‰ýƘÚv¹Ë³Ì˜¬Å–[£‚DLoz^G»‰í Ûvx„凞5 Ñ54¬ØÏ<ì@$Gg¼`¯ëpEù±ž€Ó±G ô’ÖÈáµµyž9A åNMùɺúü¢ªÜµ+B™‹ëQÅ­´‡ì(òà)WÐ_SÁ~vÒŠƒ÷¾iÉ fVËל“ÐTH8ê™Ó‚a@š Û#áKqf@Ç)~ßO€#!F}ýz9g‡Ö“ždBݧ^ûŸ›:†K̳CÎâÒ-ù}çhÊ27„&Î=,A¿Ž\ìI5žÔÃdѲNØ>¸ÄèúéÒ1óÜzïsõ¥ötÀ¤Fª;‘üÿRµEÎA'KSB¥ó}&ü[ˆ}•eáÍra}½‡Ùž—MÛ)9±cµš‰ðtá,<àÿ@¿‡Ï¬<è] ÜÛÈS¨ð0ÌÑ× ówŒ2¢ñ^ ˆìNGýÛ?ò½Ý¿ÅÁA3&4Çf¿Õ5D]Ùœû@ü±%‘>ò„é©“(®.]þ"a]ƒH1bkHgKò?.µ°Ã‹$tȨi©Gnä­Îëù×_!Ý›¼!‹õÁùk.ä„tÁrSàC±†`Þ5è9AuT—a;²(– 6O+•”×Ç(©ã”]TªÞjéü,­9]ùj ùŸOÖ1ñ¿—d?7ó9œí;bŽh%å÷C@¤nÉg˜\L3ÄJ^v©â¯Q]¦î¤[Õ…K¤˜é5c‚KŸIÖç@Ä+¥Èêû« ×ÈI‰aM€¿ˆ„æÉnLÊ=O¤²óD³P)”‰vÍ!¾$Òíôés½›Ì|éÝÿ}¨dùzF}5@¯>ATžŒ#ÿýþÐöÈrds™šÓ¨[LA¿#¬CìùÍMßAáe:ÑÝËäà:Ó² n‰ŸŽòS´lÏ$;[ôM·:h|€§â S`-ò¥?Äv>Ö‘?6ÍNuM›uáëÔgFüww¯v,nEw\0;E+@0D™ÍÀ5£À¥"€¸<Á?Ï;å™RC#ù+i‡Ç´ÏB•¥‡hí!?C&PkîCê=X§iúÝà¼ýÒÌ…hÛÌ!Ä_‹z8—˜R<Ñ¿Ïõåjq–]šj5™õ/Îw¢˜“Ïoä%o´7[FViÊvGQ„«êôÚ¬„[#ŸÍ¸jhՂο¶ðݕ۫s¨»òäá)e1ÁÜs°"T,lS;nêŽí"&’ 9ØžÎfÔyòH“†.&骣b:% µV Ø÷’>Ê, W–ìdàâŠ>+M¿dZȶýuŒÁ½‘µqO.äã4ìƒÉuƉ, E@o>@Ô£ùÙRû§ç\òô1J·P ú`ÔðaÑÈvÏY/grÆW5òàó¬°ŠBÞEÜ÷—è±)‰õD1­Mí‚UœëŒ3%AjŠàxÚÞ>Ò_dÒÉðË—V+8gÎN芥’´ß(.àoŒs/BoâbdW.ú}vØXZÆ©§ %¬@Ysçhr˜F¡Ua:]ñ{÷Ø–MÂ1:°Îµâ”¯]1Ôf»Î8êÐÈ$ÀáÈ&6Š€Eìu~O‚Ö“¯A)öœ³47_xnÖÅîín›ÈŽlµ[Õ$DzÛÝçT1ŸÔ.)8¡œÉ…/¶]ê…Ð2Îf æH¯;yÏ/NÿWÝÇ7XÛlXErï7¥ä㕲nz$æiºJ²ÖºÑðÌŠ\4] ÇxGBàH¼$ /ÊDz^Þ¦ÂÁ³CsÅ,æÂw×£k­áT}ðwaš ‰~ƒå…vQ½ªÆ ’ÌŽ¥o¢ÑÈ–V†pözPB(ÕA?Ã;”"Iúmñô+²È…R“…¼Ì­+I>Y`¯-þ |ýlb@7¨†ii·pfÐð@ðXñMã´;²ýöä~·÷£}¥¢mÜ©4#§ü0$F¢ÈI €4ËqœËÚí].ý‰ìî;X[¿<‰ë°•QX«Á«¦1Ó(£kÄT¨3‰ ­¹qr÷´b [øÑ®w-¹¾нŸÈ¬)Ä,p¦"]ˆH6@¦ÄåÑ¢Ö::Y±ÝwÝ.f¦ÃšŽOh\4{t× frxì1zT³-4 ɲ¾ÅýŒ?‚´ë³BXFÇ ÒA'¥b¦?ýJª,<‹Só§–/yÑê ®!!]}^§2ÎÇ}¢âÓ¼-°ëÒýj³\aÅÙ5uœA½l£Ö(0gÄÖãÈÎx3à(ØF"»D÷n"B£þž¥áØHSP·ë·NPØ>ÀXŒ”\~ × êíj¯ —ìtXE… ,¢n¨‚ÕKµá˜¦h¨Ø÷)s#³oïýQtB³Ï:"N¯KËå½BãB6ßXK´›aK¹í×˼¸'/¡P(%hAªN‚L ÐhrÓ-ò˜-ñiÍ?EÖAñù£ÇlRs, ·®uGÙ_ç­o‹B¬ ËLÕŸ„gË—é³Ô\«iš) ñå·Ø¾˜9|Õ‹o%PïÍÕ[ÿ.æ°¤‘‘ä§©nPÂ.îN.Ìy8µ"9OÀq>kXv¯œ˜dûp/}†aKJóꎜ  üÏ´±¥¸s-  ¢iÔ ÃFýÚº1c0T!™÷uô©àÅä® 8@ùæ?Ð{h¦¹E{ðîÉù)àèJúh3>'(ÿa”Ûl¹ˆáO¢É4^e ‡‚qÈG^KÂy'8ú|µz^ÕY΃Ûà‚ò(Ž:‹áÔãÕ¨Æ3\Wà‹óë9[¥-QÍ K|(µ^äe&0k‚Æ!ÉË3.¾—ö ª²Ñ=%vP^DuŠÅ3˜ÏÖÙG*]‚$ºéBWX¬*uÌÏ™&ƒô>!é÷HíÈꮲ¸ÓÏEˆ‰º^nR¦¿ïW&7” *NºsÚ¾úž.ºX¨¸•·%÷Ê• «¿G˜M•ýÓp —Z± ¶ žüfLÝÞ”†é’\²3dtµdd”÷¯³.€G¿&8I®eþTr”Ÿ´S·L&Nàû!£òLC\j€d5Ç©ãß÷ÓNõ/Û ŸóTkŠcn=Ý‹¶l1Ј3WÐM?Z1ìÊË!‚l·Û½68|bwÒâéÝ…ÏÎãl7˜èÃoÈs–ŽtuÄ¢þé“v¤Ïl5"—±¨¼@ùoSýüøgÙ¯{nš~“*¹úMÇ0V¯kæOt)Éc›2æ‹æ=pž€œü*úšoC,”!Áïk"bã ]w4«´˜)£îÜÿ -— ¢rSÇ)V™-’¾ #Àx"á†_"o]¹¬³™ÒYïOWé”u› ´²ž…’çoØ å0jÐb/«ýw4ºHdñL³„•-®ú¡F˳ßÔ^ŠêW¯^(5‘ÚYz+š ë»Ê–J$˜­òtù°]ÁÀ:–‰;#•¼`y4÷áÞgû;L,Z0ÒP‰¤/Nºll‡pŠF_½—dâíÌ(Šp>Kv+q³eùùêJ5,ûžaéʉð1šËC#GôZMó¹ ^ZC>ÓMu±'R—BJVÎ4/§£ÒAtçæAKCjŒ¹hֆ܊‰>gæ7ÝZ½&£×dªÁ×ëôÚ\ß!òH8JÎÏÝ)‹ƒ$Ð0c±"àþœ„ˆ˜Y¬¯}ªÛî9à“× ÿ=”éöÔGÙ¤ÍNžU4Ï¢³·ß&âjfªÊE«ˆ?€ài(-‚f9üÔ@JÁŠæ:Þj}iYjoÝ)šmº,¢Çÿq†ÎQ¹ŠlŽÕΔÅQBÐXÁÿ%Ú¦ô ,â…Êg°”Äï·h”(D±¬šc-;g@ÐÙWƒz Žõ“•îÝ2uº¤´ñv€TÔTÞ¨S"Ãýtj.%CÔöÖ¤rµ’#&JÝXˆ3è#v2 m–ÿ‹ùmõ¢RÈ ¿cr܆kÇ1_òžFæ 5îèUwH¾Ûb6r~ ËÀFd«–*Ò{o‹&›.JÏBMÀKE:Ô÷RäWC¡®Ù’ƒ ªº$hiŽ^ÉFr(«[Úmqâ©Iø‘Ã(õ€.;H‰Q„()Á¤Šœºï‡æüS?,DËyu8s—¿Îr{åoj"3ïþôÌ“ý'xDgéIô}B—à)¯Šô²¦U¯iùÚÔ…£Rмœž§êú×ý%ÎAA¶½ÚÎe2ŽHžRËAÓaçKmy:6\é$õP÷^ÆÀpÆ›·^ÒwÕ¶“Rõß|ªNB5)tHU×§I»P]¬$¨íŠ×&He Q}‘ÌÊïŽèwF‚á‡SÊ8«5yË#ù ,ªÚ¼GÛ´ÚDˆv¦Ô–’ë'iþçKÎù ˆãΊ¢z§dö<É÷ÁfÓÛ5_65Ö«­– ÖqÂ>ÂìáüíÉ«‡¹Ñe×f­&mcS5‡}Æ8P‘û(ôÆ”5ªX&+× *e¤÷<˜åîÍõʼn›ÐFêçC}õž–Ro1û$Á®]ôÎ4Þ™íVs0átu¥È mò=ß%0YÇ`ÃÐPÂ#\½sõêZ¤j­×RŠÛv®*-w‹FªëŽÞÎ\œ-ˆ[±v˜3¼Šeyõµö1<áß±¬!m´îY: LôÎ@O·ZxâÎÁÑùÄ÷¤ñä’ý=Їœ$k® zˆÆcCžþá#¤B|¯£'›ÛÐD´2Ã1ï(ÜØJDü‘ÞN½DIðNWÿNªÈ²ÑàÈą̀¼¡S¨˜‰ ¨Í_îÎd‡©F«'—Xz¦àŽ£êÎBÓŒ­°SJK'CLîßµkV¯Ža›v¦­Oðþ¦Á >­oœ—µ²žÿfÔ+5AËèè C®m«ÒâêÆtûçÝIHÝGe–åçÆYv–¶•u4V­r|Ip㺯§©–¬^6« Êß‹,œF[¹ƒT•¦!>­Ãõk`X;š?(@õF}ã~ÝÒ²Q®z ã]€ÀƒL|—јʒ Oµð|áÖ˜ïS,vù¿xó›eQƒ°îâd÷*HjGÓÛ ØfA/ŒPL1ïöõ©$óx‹zÃ…¢R=´Î’׈2e~pÃ7Œ„o€fBÇø^L‡üÚ$ЭÍÃË(ì ußG[6@mg­¨¼-«y³¦}L˜UsR¸ßE.a)IãoGhÙ‘]åÕ’ƒvvׇJmnÛé+˜(œ6`õï—¼»2¤Eƒ“mîf«D@YŒyÇñt ‹{À{‚¶$ašÒsn‹K¦*Ay0ÀÐotA«‡AèÙRüFëŠ6¤ƒZýŒ} ­‡x‚IH—¼È*2¨[?ž¨@Ofw§[}$=‰jœ57ÂóMÔfPÖéÂûûywøÐÐÎ7ÿ#d°Æ–oEö@À¼©leXeÊfæ´ºÿ€3w“ ú)0ià‘‡²Jéînõ{± ¦NZ/8ÄC}YîÍ”ú–à ¤rU¨°>­ÔòÒë=¼ æ±\Ÿ˜dŽÜªb´®æ×¶—©2³#.:íñY†% ØÛsArÅÁ:±oPEž¥h=²GQp?ÂaƒÚ*Å2og¢$š»øê·± O /kp‘‘jç‚z/½–J`%$†ïXÈ'Yß’è gÖß°ï ÏB¨œT.Y&*ýòË 5£|ðÒƒ8+>£å¯î2K_oh™2ÎË—HùrD7£s“§ºÙäÇõ‡ºSS³cd½!à•’Eç¤Ó¸°¤{}/mKµZ‘ч2nmñ¢Îy¹ŠÐ‡Ž 4ÁIáU­ã>gÞЋÎÚþ丹š‰óí„9_ðý³¦ þŸºÊµ;ðå2%›[Áv§¼Q7ìs«„*6kÀZÆQ…,fàpÔ„£%vgX¸œ_›ÙEmé»’ßö5C0 5a’Ž­ˆÙ‹N™NdfšjÜ& ¯dü(63;“ŒRýmXHÃÜ}¦»Œ`eSh-1ƒ.K¾æ‹s–|¯VKáý-TYtf9ö„Ù¶O¡pKð3ÃÜO-ç “‰ƒ«T|¿CºÇ‹ˆ( ’—â)e±]¬p¡óV=”’^o93s:½õ]Ì"9°×Õ·¡—!Õ%Èn´W¥Mcq‰ä„m3ìØ,?<”œ cܳäâ3È®“#o¤³àˇ€ ûÖeÐÐ$D¬w3E'¥ËÊ™ûs{ýÛ÷ÀZ#ìÑá3( ôšˆñZ!_öZg\?î¨$<¬¸H?loîq–5›Ú‹Eµí:Á 2®å7‹‚îÌw¤E/‚’ž £"xÜ6rJº¨/T)9£*Í!ŸKñð9ÈîãÁiª9¦Ýìߨžù ¸“%žUAvêP¯le>v#V¤MÂT-bžè›|ÃŒèÅ£{£F@~³soeßïóYš}ÄÖ¹}•óÅœ.BIÂNXeÃÏCSe T± ôáÛÁM¥¾ßþg&÷ëƒß Æ’̱ Åÿß7/bH¿?wäæõH“‘z(+Z{0 a*Ï΂ëùèJª< tB®h0MtÓq(¹Ïa˜þnŠ ZHSÔN÷.[ Z-M#cvÿ*Á¬C´qÙ^?;“¤‘ðéæÖû+'+Ÿ/þªD/ˆ²vŠÓ°&¹¥ãÀ8««aͯSEf Y¡+¥k[X° ó•Lצðæ©é5œ—j¾Y£—rHØ»Sù˜×´~~è‹Û*xÚÅ?Æ…¸[ÝáÞë¸ë-Y6áUÞ°Dr=gož+NŽÀTÙOÖªïô7Of‘ûó¾vñø¹Ú|è«E¦ÐI $‡F\{Xé7o|¨ ÏÆ7E·ˆ2o(N¢u漬öóP¹¼÷ˆ$/°« ¼Ò7 .¸ðÉÄ2“›šbÌNô¦÷×.ó 1$ì8™Þcç«ZìÜÊ£|áͲÔPRyü {q7£¾ à?ÿ5e5°ô-]}¹ö”£keGcª/Xq\.ÂÄJ+iƒ ¤HJ#]yý‹5tø8Ôqc¤k÷k-Á\-©Q !Žö;|ºßd Wx~G¾(ÉÑMÁZ~ux‰è-o™´ã+aØ´È€0Æ´Y@{Òíº³4Î<óý/û2=Ï+»šìºÄ“Äü¥;Hoû3 ‘"›Éê{_»ûIþŸ3NwÐb¶éGª[IϦ¼ÈB)e¡‡ô'Ôjh[æq&š1k¦&ñHÜ­ç­0.q$3ã‡fHøC ȆҦœ‡}Ò&]p?ö±šd“95ÌÑÛ7½Î¼ÅòBý÷Q–æ^Næ5ÜRI:‚ywé] —•¦H¤Õ¬Eûeb€€âûQï¶ê¾Ôá¥øþ ÂϾÔïá¥ØŸQöØÓê)þøuqÒÿ%Îg —:ß9YàñNt$æ³/p첄„Ÿ×N Lü@$½¨ø›BmB ºÈy3Ô¢&7SSp@Ð7#éññâ $LÌyð,Â7ÿw€3ÀÓi|ØoþtwU€´í®kÜ+õ¿ˆ‚èöñ]u“â5ízLoÁ :ûú]WÌ’§ŒÃŸ ü;?9l éÌ ¡òK@)åÄüŒ;n„˜&¥T±ÒqüOa³î£,¿¯âüë#«Öµ 3 ¸‘ËÖ¼\Œ°1Gs+X,Ì@éªöå3L¬=žzt–ÓÄ9Vµ/e.3å$m H«jµ–y°úê•}_ï£/ã ¸¨TGa~„ AŸ‹š,T@­ºÕŤˑtÜaÈñ"ö€W¶ªæ¨ut*µ·ü¯wRÂ@¡ˆä&Þ)¼âP $! ÜÏFìÖ´nS<ÛõšOZM÷qä²®¡?µƒœ êv$ B00 SX#3v£yï£ùË¥fÓ/›Ð±Š ± ûp,¦àÎ.Ø}]q(R2§¶ÇÒÄ@Êó8Ää*Ǧ"€Ûä\Œ˜ ýJx8ñL4 [sB»ë%Ö¥–:ü³×r`Ÿ¢®Çî|3ÕÄ»¦3“í«rLy±ÌgNÄ÷Gl9øÅÃÀÀ'ÈÅìÓ4‰8Á}ç{aõD°iö±<—Ö̰~=´ÀJ5U¨ÚÁMÆo%vŽÄø`k×}i[¯ÄT]5ýÿJ²ŸÉpÔB±7G@B@%ƒÚ>X:ÁÐ/rÁgn¬¨rñïT{TY´I3Á>òæí)`”ëto¹%F)ëoT*~Á³#[©K(¥›@¢Œ‹¨ˆe¬¹ËJˆ±ÌáÞ•Ær:@ökÚòÒ‰?&n€ÂABU“þ˜¦ÝSæÐGÌ^møX‰ dx ¤¯)Ce A³£Qqý7ûìEªÉ@êûnðõþ £‡­&í¶§2uŸ&¶›ú,[ ›Ëw°e ZŽ‡Ã°ìY<2úU>z¸ ð›(Ye–‚£õœ°òE2F×±þë]šå|y[ì÷bµ0>;-€ug1·ý R¤(…Ö¬J)ƶ‚)LÁØ{7RÇC÷9ØýÓÛÌ׌k|žòÃäœáÜGùSæ/l"äw>ç:H°" t~eàþÛŽ RH2§º¢£^¶Ä{5TÕ<8U3‡Ð.õ"ª€¯‘/Ö‘õ®§[rĆå’ܪ‘ˆÊmd|ì…•¡…û:‹þÍdkq“¼š²–ô:™jbÃîø”FfÃÁfLú™T šá†C¦ò>ßÁâ]cçHÖBÓ9ÇTÐã…QE_ªrW‘”üôëKL´h 1d\ÿ TmË3¾Jz<úãWu–‹¢¤ã“Gôº‘ÛŒ- Dî/HÚ]-¬<~ÄßÔ$pJ¨Ø › 2îÜ-¦h½HÙ\;Î6>«zÖú­ŽÓAPx«Þ»G¸ Í‘›‡ñdl*<ä‡XïÛ€Ö@½_„vU,¸N5F:èâVË4s-ŽL¹òVÒýw»O¸çlŸN`2xÚ“V<ÜQ–jK晲™Û­‚7á/k„Ç%ÎgŽfÚ4‘_#íUgIô× ¡*þQ=^ô6X剿Ó…„Šþñ÷>Æ›0Yéûûë÷þ1‡zUÑrÓ"­¸ö§÷MÔUÿúB¨J=!ïpådw~éÒNÕ=Xy-WÈÿ(2$ K0 42ÓêVtšõ´Ð Ô]–«zo‰ê)0/ìA{^û( Àyvooâ1Ÿoš6~÷ÃÀ*¹8 ÇD*ÊI*­D «ˆR€”èŒn8MPœü¥Q• þàj[+€ŒÆ ÊõÆåÁLðÛ¸í"ýrD{¦ç¬¡Âgž£ØÍè‡X¹YIœmŽ9 Î×!‚0ÑÈ] Ô‚€ÇÄòý¯WÕ¶ºúºÏ¾§ÛK_V¢ßVÂþÝdï¶ÈŸWRßðïOøu5ügÕªwÛèýü:ËåûX?nîïÛÖ¿í§¯©¦ú¶>ú·†úµ _U/}]NwÛß÷ðéûöªþÝbþš·ÛÖ¿ õþ­Mÿ7¨¯ÛE_=+õ^Õ«¿·B5óÜVìÿ[Ý'íéõ~«ƒöú ~ÞžÀŸk`6øµÕ9ÎÑ<çú»¬)IHEtØUõ 4ŽwùŸM¢ð:¿t ák30àÊ'\ z÷ûŒ)=³tÝ}–7f<6h{µ©2æ{çÑèÏÛéñB T·×a±~¨±)ùh¤¼qø3B2F¨£Å¢Mƒ³eW`ç–p(ÄM%ò&[}yÁm¾TX-8$A}i Bè…;‹¶õË¢ìȈÎÀ{XöÃ1D‹×ÂH.uºFf'?–¤B*wâ^H õU×…)¯Z…¨ÇÏì@NeмüJB-s Ëx‘d{ÞÂÓh›4+½ßW0j !‹å@$\qŒ™fò-ÔÇ©]X×;n/ÆFYÂRæÙ"¾dB³)rçý;Õ=¹kŒ!¤W©B#B÷žâÌàjÍþíϯƒ.‹ ФŸÉ˜òª†ül¥Ð¯yäx(®Óy®A=øÓâ7Åßžå¤Öºëv4GÀ¿º´³d”†·7 óËòºZbâO]àäA‡1 ˆ¢FèD“†B×ÐÜóü·LÎo˺nÌM#¨°Í#C•Ç!ÜDmLÕDÈ%~šþ‡à(ª<ÎøÑ|ÙAÁ5xÕ"üÆÛëCÃ<›upV8Œ—V«¿/'$ÄhCˆ^GËý?­Pc°à _jîøÄl÷KJæFoûŸÄ8×åÅ©‚½ŸÀ¹Þ‹b†!Œ@f\tgìq‚ö;–˜½ž«4ól³àAM7ŸÍ ¾@Ô-ù¡Uî’YÅ3ztKhWcÈ,±¾äè0 .·0T>õdç]ÁÝi±.>ÄÖì,ï÷‡_%?¥y½ÛT†–ë'”€ Œç¦×ÝšÕœ¢²‘·Öûbº·†6å‰ù¢ï\^YÞµ0Ìh-4qVíWèºn÷d7ÃýwF?~Ë>+%Û,. 9·çõÛñÑF,\óF†ýŽK8WY£9]œcQ- ¶FcLo¦Ä›ÙÓ!†A<¾ÛpЧ*'1a=Ž à¹ nZQ¬[t ЏâÀܹT‚GRŠ‹5¸Þ(¿ âYüÙ+‹~Ù³ÝÒ$—#>»m´/Ž}è 6¤U¿™<žÿ='õ «Uk^YpE¼ñ/Ü"^Ziówt$åO½x~¨ñ$£‡ÜžpK…n¼ëÕ@iÀaϯ#¯|¹†>:ï¥ù½øt~ǰƒG•¯ý#ˆñ`zŸ%éD,’óÁ_¹š™çù&ö[E9d•O‡À² ’íC’ÝnØ©!ïbC”BJèz÷ m “¯Ž:™h L1ÿp«33÷ۋӧ湚A&Ö—Çs±(M:†ïþþ¤ãϺgŒŽãtîŠL:”M]6Î…¡Ï«AóÜ’/`##£A¨´ƒC`q£œ~…é$;¤íc¤“#vSýíqA:ÚsíªM³ŒœU€iµcØóöR¦ Ê!zI8ð+ HÞqõrI‘RF¡Ic ðD¡y´|+鯮ٜ5þ­ ¦¸sßb¿¿Þ; . á—çZt{£îL”…ày»1…0ù8!KÃ׫ømÎÖQKKþF—Ä™Â"„ѬcåpeÌm“ÀÛ(\õ‡?¦Ll.úíc¡ù &I&iâ~>žþãŸTå‘ïö^õ{ü\ó/Ü ¶ÿ\À„Xµ¦Ð ¡o1ëb¿SP„OÑ[*ød v:–} q'ü3Öüd~¹oÀ..g$¯Ô‹Lš¾æDSú‘|Vƒg%V|\ð´Ì<-1Ì&½D¥×èñ «bS\ÒÂVK„'4iʯÆtm!-+"eŸ#é8nžqq¥nr4ôån&’©±Oÿ|ô©-= jå½v*Á_´aTÀgßb +P¼y‹P»%ÇÄÚa n'pX˜¾ŸîªY "¦ÑûœÒkpå úüïpTT–§Y™g8ø°áŒÞ_2‡~4CX]¦’E¼VÏ ~PˆO” ú­>v¢ùýŒÕ y{ˆûNÝñJ5?cm½ ýˆׯ¿‡Rq«ݧŽsº¿ü þåaħ|0V9iÉ ¹MÍ›ÝásqËU}Xñ”椟騘äÖuåGX\ÇE!¢.”N°Ü,&lD¼˜$næLœ´^Œ3¦ª¢ü8 í®>‘ºÆÍûS—fb×¢óö™ØßŸxÿf¬]+}ùòxbÃÁx!*Ùù $,b3L«Xƒ[RëÇdBŸM‰Ë­(H´<½!œ$¢–‰ø³Bb$îX4n+ÕòŠ þEÃMó#8G°÷»›9ÖCfüüoùÎ{4DórHâ‚èÙB€4zãæ‹ÿ|F’‰eöÚ_ùL"æ¹|܆)²AÆc 1ZØ‚þär°%E…¦4?ÎO;SÒ&.ˆ\F½ƒNÁ| hÛg’»&úˆ÷$8Ç_lƒ5Sp=Ç¡Ð:Û•m #™®¿vÏvG¥/gLÜrûq±¶² ½¢¡MÉJ®úcRnÃ}wÏ7ËÈ>ë$…—2V…MMpâŸÏÈ;c‡OªPC˜YB²~ ÈšƒN?áôYQ^\…ÒâÖu‹(¯½*{eeýUDL@µKS¯^ÂMYŸòc7pÁ oÓ:“]p?WÑ[w {©²4$!ˆX7;ˆwØÜîáÎS‹Ã˜­K_d”kdź}Ž ÈŸ…v–¤0/ÀæHÑ ¢ŽãWÿ.ø 1é*½²LÖW€<$‡ðô@•„PÍýf­4*΢&–IvôÂÞc=Üxí&(ÅÓÏ¥þpBXÉØêlŒÊ»ñ\­ìµ”ŠŽü\ {ž'™÷‡ …¤DH-"Ò“,\}Ÿ¶ð(¿óBéÀÌ3q«”¢D¥.— ½óÛZgCîZ‰Ñ5}¶o‡Žü;á­k|¶D™Ÿ±­}¾cOç!¯‹-}&‹¸uw‚+cˆ|ìƒlo1ÖîŸSÉuÏ »gÃÒq'n7†½¸ ˜‹¤ S’ïV¡-!*+§Üo«FË%H')„GM6vóøõ»í @©†ÿ€p<»Â³þy&_ó'‹3 GQúsOª/š¯X8“D6ÚA àV¬Ì á&WjT®§Fåã§9aUz»›Ò<‰]=Ø"æ¨k|h¬tÎñç—Y Pz\Nßì´Veã´ñYR-uõæþït$1©¢[`›)Ë:úk бN‘¶s6iŸÎ¿3xžs.šF+Š= /ÏyŽ1j;D{2Ïš‹¢Œœ”å@rMpñЮ²»öùɶéK¢ëù›Þ¯ 0Å\°üµ±1õH·2ô#.Šl½Pö.Ëå?ažz•±ƒº° 2² îÇP>ÞÙtÐ…ýÄìÅëé¸Âñ •­"gªPéW…’‹–þ±&17I<{tp(ÈLÿñâîù®éÐÈÍ àÕ ¡[†h“*Ó. DB»¡çc ÇÀ³]W¬ãýÛpüšÑº¿`<»åi-à®Ü®×ÔVõ£¼Ü”^ZITt†•ðBíS Ú§üüIVb)Žp¬, ç„XP•4ø$ÃÖïGð‹—u;(;‰Ó†în¿†‡¡é÷¦}°ªÜa¡4þŸÀ­èU4†x½_’gv{ʱ†cLù©íü ³WÜk´)@ƒó3ÕŽ} ·Ø’ÐQÕĉ01N”÷¨_Íyp4×\çŬЇTöþbÛËœd[#ýÓ^‘k—Ðæã¶xüÒå?¤åi5¤ú 3\E> #á|¦ŒD­ì%Íæ° ‘n8g°¾5v*ÁÅ}› ºk&Ð-ËǕۇ·´Žb q$W€kJ÷=vŠKŽå-J´Šbs;û¡A=¿RÌh$H&ąv£XKóG¨‰aË” “Ñ0KÙûx$ xkØIyÈmž’!EÀà®\îúhá‡"㌻®RpãRûâºð´zå•nŒÉ#e—o”%~Ë–‹^Å&‹Hä¼rŽT ÁÊ[ˆk*N‰™Ú¦½ˆö·8ëÞ É--](mtzb÷^zmƈt&+(êÄÏ ãOäÊ=öÚBÀ1 RœíKó95µÛ¾í&4ó¹ƒh%¡LQ*Æ‚'NgÔFÌæfk$âdæmíô0"¾¡’:t£ŸØ£\´ÞÀù‘§aer Rw“l3-›“omù!Òz‰åäE/“vÚÒÓ¸>–(ãžé7Z(¹‘­ÔÃ’ßÚ‡ø}õôL˜Ö&»;Ô¨0íN>I,ómRÇ‹®”š áHË”‰ÕqXw¤6dXÆÇxù[‘(á®á­•pE´À5Á£¸ ÛjµgŠ»Žú]£è-pÅÙØ¿Ж!;·DiO^$÷èë~…Iº~cäîf"f—þàà³ZÝz±u^åƒÖýÑã xN­#½7iJ…ü”—ÕõU–¶³z½J‘ç!W ú«Ê+b½„ZüXï#i‰¨ÒB8 ”6^YoVþð®ÝQL¤õÌ¡Vɉ„¸Ø!¬ÏÜQ2ßç¸/MHÙÅœGb*Tªð|@p£BáýcŒ¸DaÜŠDe%ÁûûF]Éœ,€•>n0i§ØC\-g§Í@ÐöË. ¢G4—"µõ<#ʼd‰ÊÓªL©Þä:û‡U›êœ(ý9-oÍï<Ž-1Pßp–¢îƒÀK£šzø:GÔü ÷ŸJ5ûªÐKÍ\H,Ä‹Ï@!“c®¹¬Z)ëŒDbèX¶I\m9˜7S˜¤§-RЬˆm„„laë KÖ˜¦S¢AôÚ§™Y¦2ç`uôѨ±9ŸABKE²XÞŸµ ˜ï‚¶uÛ zBÖ¶Ê7Œ~35#ðÅPÝß›&·† W)láV_ NØ]Ü©Zzº åo6@V@›ÊÁ,\á.[R¡o€süÐÈïÓøšßoÃ2q¸«/´³•ž @‚…2ý0á=r(žÔœ¨óMæ/)„Äþ¥—–Å“XÝqPdߥ«WÀÕCÂpc­¯›:¢÷ùå»ÌÕQ?ßt#¸yøÞ–¿ñüeõÚmõveÓ#ÏÁ·¿b¶Ñ¬e6ïKõM>†ùaûü›ö”N3¬€('#dQR;mù™ßþeÀð–]—ƒØŸJ[7€ü*Ú7š[ = ØÇÕ+©çÝ¢vB™n…În?@t1zªICáõ›1|ò>¢ì¦«¨µ’”Ǧ2M¹u¤’>àÕc"£à]ãú. ·âüËP1vmï2BrO!Àtol+6Áž[UŒÿ$Ì©ØðYõB|-|mâ´ £ôs…®Ðšt7Ö÷@"gº\y¬lâá0Š1×^<Ö?Ú—T• Œ§ŠÎü ¸«•L§#9¤®oH®ü©†¸aRTÛ-˜T7;1ÄøUCÄzÇŒÚu^?+ÝâUmëõ ¸˜Þ{‰Ú'Ã]û¶QV‰«› 3Zï!I”äÖ£f…Çè„øÉ&H©0w˯ñ‡y>Á÷7uCž>JužZèi³ SkÅXêÉNí_Òë­ð¥"´xw£.BÌ‹âêv˜¦w8¾šÓÞ©“ù©I‘œKí¹ëÑB Û±.åæÉ!娂Wv„Âj¼CÞÂ'šsÝ=qXXÞí–œ˜¬Û›£Bþoñ?åç`Jñɧæ`Ø_®Ÿ3¸°–'KúD}6ì6ùÀe ˜mˆxÄ,å¯ GJ¥xßÿƒšæCpñ‰0Ü»êÈŸ×Jì{Ý6â°«`ÊËU2Ls„æw®ÿ €úsâíã1K–¥cST'aÚ§Œ ù‹;`•~ÓÚµHNè©Pzï¥ù*4øøÕ¼ïÛŽëJ÷W2ZIͧÔÉÍÌÒDWx'q¥ï ïl¾‚y×µKmB:BuÑ]G6¦î=ÀÌPXós¥ !˜Wè9O?[çÊÍ—º×­*2Oåü×U›äÁæTËû?0CÚž3ê{¡jf³CU^ˆŒGRǧX/”_­Ìù׌EçÉ™¦d ¨TdWs±T¤§Ó9ØfXÐàÅ#ÁDŠ{kî­¦ÕOl ©´Â4#bw˜–²JnÐt­­|yÔÝ|é‹z}T!‰¡.§éÔ€ äô ·Õçöã~ýrUV9xãºx_mU©¹(æý¨ŠïƒÇÔ†Ø4Ð#’Qy„tEJQw% åm Ø‚Boñ[ah¨%ä‡O=.ÉNâóÉ}DÌÚ#ëÉ[á)`-ÉÈ9r^ÎÙ‘ ;$ä¸f¬Û¹[ÍeF‚:¶D9ÀqÄÿéèR¶YP…„>56Ù»Býcø²cœóÆôn§±~»`'b>Ê‹yE¦¯Ášˆ‚z~½ƒá-c™XÐ…µB3Ó/ð̦ '‚°á²IL¤¿êa´!ÊxJ…äY–rò?+Ô˜k ¿Í ÈÏëÏÜ¿ç ­‰½„\ÿbÓÍ÷X—ízÓÑWÃô`d3–4¿¬lS7­t,‘¦4Wž/þX«¶%HùqõÌþWÁ¯Xß9ÇìïfÝaPE[]UnûA²äIúKM¤„>DHš‰+Ö¼2wÇÂm3­ï®Š„òØÏmU !5(i /ÒN{¹ªë3±´ó\ ¯ ë‘‰ÊŸžEáC¥8å5®ç%«ÄŽùRóIòïñ ¹“É(5?ª%l¸¥ŠYK¼+Ó‚xÀˆx®.6ZᧈEðûV舻•îå˜ãß7·ëÔ°º.Œá^í`hçÉ Ø«…{qNtœ»cr‰ÁŸNP÷$¤êï JZ)ã`9§ií„ qÉÛì×pÝô2>vGkÍKß/g˰ Ï—Üå¢;>z4;—æ¨;4ƒ¢uNÄ Õ ÈÒÚãH¢+ÇŸêZÏLVÍÊ „X~›ß±©Ñ„¸ÒůÃÊ?-þì!îô=é‹¢9uªçÂfQçùÈYÏLë¬|´É˲ûúëßÌyw׉VØÒÔÜÆÊV,JŽ=T-3”ô|D! ´¬Dã·îUÆ~N ©È†V|¥âxPž 1¸Uoc.V«Rú]#gxq9=þúûMŒ²«ôw!ÑîAhÅ€ß%FtC„Ò#zN?˜ÕßÍà8H®¿»>‡Ñ½Ð…BJ[DK5|!=Íæä÷¢CeùH¼ù‘Ïq,™E²"«h9fót“ “mO1ObκNŒÕ­ 6R6 %èÅVã4üåÎNŒƒF%²‘¯ä{ÕmRiGõ.HÖ¶]£÷Z°ÊÏ¿ÝÞù᜺Rv:$¦ùô§¥Lñ=üå;]¶4Pp{€?´‡¶¹wÁÂ(€ô…œù­z¡óÌ+3¦Õ'Ò„‘£8d‘Â., $¼oYö1CFNö,°é~?ð]«\¢Þ|<ÉŠÎ’ÐÚx±Ù|¦~çZÖc>élL£Û~rå`I–Qí—&_nÅî=]Æ`"¯ó»±«½š,Kb†¿H_— Ž–t­³Dœ,‹‡1‘e6ªÖ€Æ‰¥|?± €jFÌ£ vÔK”K1µŸŽÍÏOÃ꽋xá°>úZ¦#‡¹g›}‰óxOißKÊ«ÇÊûãq-ã箫 ÖOº¢‚Ïì¡dEuk®ÐÊ“ç\D» 8üØr3|"ç×öþí¥‘èÌ9^7àú8e,¼QÀi] ÝÛöt~w-sN£ì;'ŽZõZ¦ƒçnÆY iˆá5ÕöL¤CA\“³ƒèw”*BRqD—u2¨¸:rÅ!ESY©àHA,DÆgŒ$ €ÑSÎ÷I%[H«FÜûùù9OÈİ6‰}ÌÊp4W‹Á³ÑCšº†€˜¬xd¹~|ƒ/Üœ>u?Y¯U°Ù\xÕ Ñ~ÿjŒŠñ!C‰Úǧf¡C¯ç`FÏ4Ãt ¥¨Èhöð7¶lÒøÜYR?Uàœc_P‘UuÊÐ9‘æžKÂôà²ÂË1ð©%kHKÿrX#í k-ú»DH&šþž=†Zi¬››òþ‘©œqØu@["Q›uEÿA¼3lX´ýüµ;¬ ŽHF¼I†‹˜"°ùý0ß&™ZgºÐ¥¿Ò¡73Eå^¶³¯w¬Z©«î:Þ`0ìþAØÊE›”•ßNv„z$XИœSl¹{ÄÄ;]fþ‡AÓ–ò«mEg$ÍZk¿}¸Úiá ²ë]+½%è$ÇÀ`Y¾L§¶ºxëÃ,”lŪ‰æ H,¬ÙG£¼úKVº·ÜŸÒ“¶DF¬WÍb䉭.èaò”‘Šà,mÓëò“oMSÀWácê`7]Çúl–Míþ7¸« ® ¼*»Òц‹ï~ ÀÂ×$Xq©w;uU,;gZFç¢ÇŸ¥ÈB3öi8yj[\ÕN›F…$©üPy¥‰fw*{’»’Û,e.ü3G÷xÜì˜à¼wuuÀÓèîóNÕ‚Ÿ×jL^@?¯ɘµ„ºÔãÒ‡Ô\¶X™.; žy“†Y x‚ðƒ*’âYb€$úц¢ÔŽsÍî\ú:Frß™–¾ døoîRǨº[3FLðÆýcàu‚.Ýl™ªF¢YL`Û!0+Ex–€6.Í4¡öG€ºM8Ï A\j¿0@É W¢²XpO'P"Ƈ-"É4æ•»ÞþËlWF;É ÷êw VÅWÇ!tA3-J%3$ˆÆð¦ÛÀ¢ÓMxÐ\ü8.À;ªÉ¿ 0„ˆK_º 7G =킌·Úäîe°œEt»wÏ«_êѤ,Kþ y?SÙ0¿nõÏãò³³çDδö,U?´âÒ¦%¨}w¤„±Dßç`¾?‹·4^=”ÕåhïÐAüÀd÷¤CYÉ5 Ì»(ÆŽkAg‹ÝÛ.»uEs~‰T“·¬$î@pPÚOãHÒWHAÍ´½ ~ßR]ÅÅE8®Ûð4âÆ¹yaYºŠ¤9FŠÑ†9ü}òs¯ðÕ› `ô$8»EVcÞbnqà­ÜÛü͵µÝñZ¨¿ã'¼×4¼Ú{Ѭ„ã_¬ÉT®äÓ¹Š_nÊy¥øÈÉgâBÄ\ tÝ'¬’|ÞéUD±•¬/1’s!kdþs,(zix{×½"[àuu)dU'Èî{A,V¶w˜·¦Ê7—§‘n,(ë+ºV({ó»>ˆÕ$[\9Ø{D0™€ŸÞ==ß”Š"Ñ{<*ÖH%)Ñ=‘–ØÂ×.÷> ݵeUò¿Åµçµ0*€™á°½Z•μ’ 5w%C_ðZĘO4P 2Z s¸ãœMµÌƒ¤ÆÐ<ËZf,<ÞÇRýlP.ž]LŸª&fGJVÀÖ>º•Fm(§Jæ€+n‹6ÊɈ¦Å|Iýxîw0¶Ð3Ò/aÇOEqEzjÁç|¥&MKmí+4iŠÿ öÓ5'Ó¹¨àgèa©h/ÿ=¬˜Þ·Ô]ûQ×/*%T¡\AØó0ÑoòVá’çoñaˆ «MIiY×ç?§sÿ-ºñ¿É2‘}zé3ÎMTFQžpˆ· È2+Z›ëZma8ªš³„Ég\[èĩВk»Iá ruIHåYDyA©>•š;Dò 7§m‚¨ý’ö!žý™Ó|’ˆ(ýon|Á"T¾{‡¢ÆÔP2se\ê)´^˨«¥f(©è} ólºSHZtBÄ5ÐtsÍ–3l=•žÖ©­Fq{øâúÙ†ÄUPÄ»æoR!éX¬mVê< Q÷˜´Î;5@Ÿhîè;•Š á5/-î·ÇÐ5"ýóîîÜ‘¤­‡|9ÞÙ`jY›ºwéøF ˆD衽2NÔó°÷tOªPùÅÓý¥·Œ0ðu–˜¢Æyš‘`·fÊOð“v„²¶¢:Bå…žJ ùƵbJ«¬…‚4X¬ú—óŠ,aD A•Íðà!XÕ¡fŸŽà‚"D»IÊ5Íñ@Ú|J‹Ï` Föžx·Džiòç€É\ë¨2ì0$NÍBR?ÿOoù5i_¢‚¼#‚¼mú2aµ)õÁîþM4š``‚[Ý‚-dÜjN;3zÑä2*AS²ã¿ ®aÒ… ˆ~oO“u*Éæ1´€þY)Ó«é^áK8H!ð,º‡Z|õÞÈé&M€ËÜÍc b@sATFBÿ`.Ç„„ÑËè Vû”~Ñ7VÊÝ[˜éÊ¡yR8ôÑÿ ÂÇÜCñübmMp2ä©à›úníY°˜Kýoð¢OâSïÜJ•Cs1Ë ??3{Wù—Lýt»$NÚŠš¤š7ÁÓwלœ…ír7ÀÀ1·;dorîã$[y;˜í3>OÉ5vsy‚ÒÉŠZÿ^èÎ#¨ШzõonL)’f1-@ô4ÿ 5‡QèAØ‰ÛæfµJ=L¸Žo1^úÝ9y fQ‰’-VæžòÂЩK*ÕÃX>êdýWŠ¥×¾V¦‚;iS+“kca²Œ£Y¹Ê¿í_ºi¤ o-ºvÂãûsNé†m\Œ©«=}+“UCùŠ—­þÑôè2¶`1ê?‡èˆ#t\®àökkëít¦7,%,•`oD=a!¦´F‚-%¿pT¨f ¾õá­Â&}c8µr~›5>‘⃯l¥Eå䪊0 CZ+‰€ÍŸf–‡ÞZ¼RݽY-ij˜Q>‹AÐBÕ¬ûP2›¸Ñ´ J ¶ùJ@ÿæÁLåR$Ÿ¾r ‘p4O=ûi,xez—´Áa/)´˜Ð@†NOÕÀãÏæêì9R¸Ìî!Ù†äÚhm>Õ npœ?²ŒÍ´0ˆ—ÆÁ¿êe1øD‘ Ì›eÀ˜$2‰‹ CÊ|ååF8¿Ù°Hìµgj•1n§ä9E‡š¤æœ*&d‚Y¾¢ç©h¼™Ñ©ÓßÉü‰Mäzð#÷{ä:“´óÿi.ågªY^žˆITÓL˜Û«ÁŒm²x¢=.þß%ÜkwãVðí]“†gäC„t‡(êL`ä‘4Ÿ“°çZļ¢áŠ-!I‹0™|Y1GýûA§KË—áht nÓ]+I†1üe•2Ø?ñBª¬Ö……Øp†¿ûd&­yTyÃêó–çk‚ªµšè›xäKƒdÄÑ9r¬G×Rþ8{âålãâùêã„”±¾6 ¥W+Ã6ŲїÂbÌZ`†Çì½²êÚ3oøpm“UR€c©ƒ2¿ßûLXÿI|'çF)ýÙu2pR¦üƒ‹Þ‡hó‘ô#ó¯À£¡ôŒ!̇ØXõådöÆæfC¡-_׆{É?RµN!gr1â"\Dàø#¨|è}ˆUê, ›¹w"üÙDe\ÎAnˆdqƤåשXî—ÄuÈ cX±ŒIÂ[S»0GªuNwJSî½é5]^Ø›§– F–8ÆïîI£gPØúô¼Üå‘íiu;CÖ VÐûtÏš:=&dèæÂë„~» èóq;Oiœ¢Ö„ª™7‰§¸Ñ¥¤ìLk°ŇÕïtéäÍÖÍò"O‹Ìß~~¶<´'*¿^L?áïm$doÊ@)Z>5äÂáW_"2£ü§°é]­X9.¿.fý–C.âÕèb‚TšÎU@2½êp@¹˜ð21'}ó|ªâ™ÈχÝRð™ªH£ò'ýÊä Q ©9nëIySÝÐûi9jœZs2©¨PE’È/“»E#p˜x¼& ÞJƒ¿H¬Çâ­bh1›f¹ˆw;Òü=?ô£Þ»þ~€¹Žä—ÁÆòô¥‘%Ÿ«0Õ4z!òžðlydH>OßÈ¥$Añ}+u¯€e¡ÓMéÿplyÛ}ÊíUß1ƒZ¾Iõ™æ‚ØóÂ]o¢ÙoNR8@f²Bu@þNá— .>¼¥™zóä=é,lÊù,–Ĭò; b)8‹&yÝo>ßÑP× n@"´ºr”ê¢ÿEá2öŸ[óŽÙ“‰Ëh† `â¥A… écÏî FÍä u@“"m5\jü~À-Ý®q;°!¡¦*/É Ð Ü¬ˆxÒϵkÞ è'6Å·ö-¸j}á:Þ5a„vüa³‹'&íà2×»x>’Ó|üÀ:ñ•,:ƒÝD£Sîå’À”tV5":Z@Ñ«l#d×KÜØwQÖy‰Ûv Ÿ8ýPl€]#ݘÊ>×ÀÐ>TÇ~£ö3ª—á=tÚy#ë®ôõ°¹êÊ‡ÏøIÒj.ùQ46Œ¯í,‹> lâ ‰«‘³±»ªÖ¦]Kr[ítRV¨'†ZrtñK9î=p·7ó$ÍázãB`˜fÍ{uxSWk<''ʘ³#BKðo#+ƒ5€±I`ñ/¾íæ•ÆÀa,`¨R{îêÇl¨OúQ­üŸoù­ø¾øz­¯à]ˆM€È,éï;þHÕæ>8¥±uX!³ó/-qévO؉¸häHGË ÚVÒ`}ºY¨?wÒtäí/S”ÝfTQ”g_)x/Už†ltºoí„­]èùfÕmfà>á>°uÑ–ä6u“¼ÉAÿK’ÉâB(I9,aRç‚ X ² %Ì{Æ/f¶¨(Þ9ƒ†’u‰ôq—…=Ò+¶-äã¿‘ª]„œ;l‚fO •3·tP€.0îoöqŠÇSâp7…ˆµ gŒ!_ÿ}ô—ÿV’Õ-Ò+ð9ÊøÂ±õpl~ô1´Ò5uqœ½±þ̹9§1‹’G‰6ÏÝè_¬F^ˆK±IîaGÓv™s4 ·Ñ'8¯„‡( ñ?ýHU¿Hù¢= Ë”A}¥lâSë))­ ÓåÊ*+u¶è«[z/!/"XÕÆÖÞ’¢ó±¹ÑB]>ä?òJŸ÷u¦1Óˆ_M”U]2¬›Ä¼îý̰iîP‘id¦éply‚¥xæZÅôtjï9„ <[â¹É»ý¤·Ërš¶Ò–Ô@~…¦•ÒØ‰F‰ãƒãc8·; žläp ¨®0í^8°sšEL[S@õãxzÛw®[Êî?ö¶¶ê6ðåúÄóÞ.ì!³æ ={HñÙà½0(Žã»³ÌÂÀ+@ðË…n܆3pÂ)éê9øîîp 2³ãöÏy ÇÑò0k‘‚ÿ31 ¾…7)}gpOø¦5Œ3õ*ˆQ5ñt㹋ì1¤5O¥m”5¿Á^p&;ve{Ú¾¬ÇIÆþU$œg’mŠshÇ[LSL­aùÈžøKÜÉøDÉê×rkQÜ´ ô!©Œq€o…±»ýŠôøÜx›·0(K„¨8 Ò±„Y-{³“ˆ¬|s1CbÿF„p™¦|z4•¤ÝaÒNöÂÛ±C¸ÞIÎüþÚÆŒßê;¤)î¦×%z0Š@“ÂÂ%$À™7>ÖÆ¿ÊĆ7Hœks”ÅÎ( ¤EQ(0ÈCWù«¥ûÇŽa…€'ø•9&ô˜‹Fvc2$ñcN?û È»ÃËŠ¿³-…ˆJÕVÆV,õ@ƒEtë\#þ‡MõQð©¶8b@KW~†ðbûÂ>êÌ—ãÖ ‚‘d"‘àjLµ¨‡0‚Aæ¿âZŸæEÙô_#ùP¤Z@éü'—b R6§Vô ª:-ßâ´¤~2´<ÓÏ׺ݒžná}¿Ä,ÑŸ™#ë£ÖLG¡`Yˆ»8¾¨NšÔ$-2‡3…‚*Å4š+e>ñăRr,@bTmÀƒõùœ&J§×:'¡¬Ðçé…j¹ jPИ`Í5¿«ôDdzÎÛ7ïX»Ôž@rnó†Ë& P!ѶÕš177™p¿A¥iÕÞW)ˆ'kûeËRëk›·³=úàØAB?†uÕN‚•n8>%DÏ«.L°êd§b—÷ù9Y<ŽÈ2(uíqÔ‹Ú®'Ü(˜Ç¶«›bâCéµIŸý¤’å…À}­ø€2K&gÕwi zŒ&c¿Hr „¯{šݺ%…ÄìÒðÐÊo4¾·-¢çaÍa_µP¬S"Óö lÇãS—ºj]Y –ßW{9§¡ùL#%`áÅê…Ͼ2T ‰”â%å1Sñ(üRuôö´å&?‡¤áÁ·aÂŒÁ|9]=—•.Ôñ‰lyÏ.ñ6‘ˆ]¼ÍxÕP æZL«Ëºg„O™. :Œ•mv w4©*÷|E«vvXpÆOL£¸R0ÃtùIœJ*ÓŽàÞI]”MOñ¯›°mQ®Cü.cHÕÍÐm}M¤ßð8aRsfüÅó‰¿ÆÝ7òxÐ7¡+ÅJs r5¯kG«$Ú ¯ŸqgÓÕ`þbÊj”4ÁúR®Ҟgy²Bû~ ŸP ÀÐë‹!Ë=¯ÐX¨@ü‰+a—À])};@&Ê$†’þ&ëóÁMTFã®FÎ¥=ñß#JÝŸ›¢åð;Ï2e–ü{eD©[€ÇPKÂRÙJIpåšOž{înºØ!ÞèÖ¯æeì}Œ$ºS÷$1IµGžì¼rá½P0©¯”¶qô¦ùhŸ¤t‡[•̤€5&ï´ c;ÜKÉ]ò“~ônåC Íö–àµÌb¨+ékµ¸˜u.f^eŸÛÉáÛ±˜ñAÉõø?_YÖŠN„ÃôÌ«glêûWþ'Ì÷øß‰/#t[êiEÁY!néR—|v„{=G!ºy¦îw9çd³¿ ©—‚ÿv‹dÀXóz~ñ)ºá»Öü*0Œàò‚ðÇEBØ—ªêx>føÌÀQRËj#ÝA§lyu5R¿>,øÀ±ÒC0ÎNÉ50–×ð17É&^í·]3Ó’ç…0f’ó˜ow#HÄê^µy*%bz¬Srª¯v›]^›I[ ]y’d“îκÇZÑr'Õw5…UZ+±mi‹Ø‹¾¢ó<šp Ákä•öp¬é~Äø4`ýjimÿ@"öœhEá£1s¨ír‘©nÝ„ØéÌŒAi*¥+°y]q9Ù{K¨‹)¬ä§èòµó\Ÿ=‚@X=zÆpÈFDïtZð³çð~ŸE@”È—ŒÚi( D×î¬ßê±½ ìC+ÊóÌVNoDBêrøCD@RÀz^"ÓÒ%ú—p¯vÝ5HäÖ:]ñ}Jèö/î8g–Q8X!‚ØnKW"BDuƒR…ÜÒ‡¥‹`¨Æ£­¥J3Ã8ßfý×{þ ©Ï'âø —Þ ®'Zj ºŒ¶¬ÖÝÞ>0ZÕΘdÈ&Úo]6S4ˆàoßçæl…9±ò€¢5ÌÏqH´œN¢“B§ºyÔÔé[¼èïKDÂ"rqò¯ˆÑµ™ïR¤ñ.Ûm­\òäiĤú,¡±þâ³ü~ýõ*ÈH²OüA\é$Œ÷> T?!ùº-F}5ç$G~PæTZd¤\-Fw”.ä å³üÛŠ+[”5¹Äÿ m‰’Ãé}búÕPw’þ= ž’í÷įʻá^^Êá)*Í´Å)M£TÆJÔ†!Æ_DÃÑšímÐøÿq02^#ÒÛ)¹gcœTÕosŽkšJ¤KÈ”Iâ-]fžDâþ0gòÑþ*—;¾ô”˜,v³ò*ìlª¾:ð¨+MU…ËÀdáÐÏì°¸ü¿Væ“>3Ò†‡óJl©ËlhJ†\–A1†ß\ÁªÿI§O>O­4O»#«Ðȶî~¥—΂««\ìKcË8 NKUèÁ9„ÞšIP|ú,…@>=«?ã OØÕ‰§…ÝÀÅ"ÓSRÖ䉂ø†Þ$æ9;çɬë}NjmìŒ:ÏMT¨a·f$Øzœ;-Né—eΣA„ØÇJ¡¶Oño¯ò¾iß9+ ïÝ}â Ù.|‚àŽ¸s(¿ÙMÞ¨D~Mm}Ã! i"¿zɲ}YÝÍ8®ò°ý¿Âîvrܲ뜦o½ŒïéBé§”ÝÅ…*9ƒ‘aMÒÁ³¤aºaéé9:K:úo–gl=#’[TÆvNùü¢‚"H²síø2xXy\~Ó4ÕR¡´—9¨Ó'Knþþ»•}G~’÷—m‘×0ÔõÜ_+âΑ:Ï‹ óå'z0¿6µÊg*Žà(”e­é‚ãôÇöËœ“ÿR@ícPî ŽZqÏuÝMó‚ÿH?¥4tŠK]v'9P)P%PìuS¥7×UÑÌø² hTбæ-cÞU!‰r¹õ*UØXL›âYÂɵŸc\UóÈQŒ#i¥DãsŸ¡÷–®,€¿CÂ* ÖÃ9Ÿàƒ¹y)ïPßÊÂ<]Œ¹?=GéDÕ­1ï1ù„~§¼Y‘»C µð?EôãwÎI Ör@š*¸ÝJnO5ddWSÒaBÙßÙ }å£(`±c;у(–®HöQ“ÑCÎB°û»M*«°´X&–P*¥±Ïô_7‘Ý,0_úˆ©´‘03¢§Rã­ !1TW/¤,˜mE¾¬w¾~u…Õmxaevè9úN„ÀÂ9Š'QF9"Ç'¨qµE".¡Sœºì/‹ôÁ¦6, šq•,ÇöÁ8¬çöa8T‘²ÆûH1™D⯥/çúŠ‘Æ½S€Ô'³Ì9Šº¸‹>ü¿+=¯Ñ¼Dõ­† ¤è}HåWÏ Ü‚'Åæ™§Jo[ÁÀ‚‹W€s€†G=Žzoð¹iRVÍøàï6Ïv¼Ù$Œ>x’²[¤«ÇKfÚd;ætI,D Q%ûD_@£PFïgó{·i)¢ ùmeº ‹îä{ÏÃÛbœV&©Ö{ü3#·ºüp²§s_ïù­“¶¡1ͼ1ð·NùÜÁ®Z>¢Çw7tT”±\&Ê9«3®ìIL 1Åñd°îž‰ìÃdªëC»6ç{é·ý ˆ]rú•ExKËÓúÞ)øÆ¥J§Ó5ç~Ps$8·×ïë ‚” ÿ"ô›áª§@§ê@^ÿbí£PÆö3l_%Þ²šŠî‹¤Ú)‰» W3=m>‰Q¨^ðïwi‰Tà±ëÕu¶¸>8,ÿçû½ ÎIÿ5Ú â!)9VOO"âˆý>$ÂE ÍeçJ«ÕKr潩ºÜúP 2i»Óíý’@Dòr'É&–ëºúÐúÅðÑWLpÿ%ù£N¢ÚJ?RúgØÕBJß>÷\IÎÍ ÑT}ø$én˜¸å¥Vq¯Ù‡ZÆ>;£•l¥’I~œIó&]Ÿá¨Jݲ–°b=M9+£Ø‰Ž¢>ýC©¯ÎŸwÜ'6åÁ Yúÿ~ã¤:5รmy>Öëcá lI@y"¥úø1æ“<æþÒ…‘ºÿs (pÇ.öΛÎLíµ×Ñ%=ͯqLº –ÿ+gó3q«Þ@%ÞÒ¾¤ˆ#2+(O„EÚz+ ]ô¸Ð^ÝŒQvá ÍIÚ»›]Úã²y2póz·®#mÊ|QÊÑO@oHOàÇŠd¬÷æÃÿ KŠð\öpØÖglÊml-¸ Ë_ak£8‹Re¶ àë3}6¼„ãÈPzu àyÞͯ–~0×YÓ¥ÈÃeuaj°.e¤Ú£ŸQÓ,€‘­àLê_- èwˆæáLYUÀz~rzâ,ƒvÂÖh…Ç«âÁÂgBgàGéâ–|§X¾°³Ù§4ñ§Å„7k:L ,ÓË,¸‹¿N¦u@³«Y|®8ÀNÙ» u‡üÔö­‰T\>ï‹ÑetŠZIYÜ¥'Ô8™²@>ÁœŽ/bLx׿?IÚÒÒl½+d%jÒN_’å—¹”a´…X u¦m/ä€ÌàgûƒI-q eüF\¤°ð¸wÔ¯gÖÃ(“Ï[ñ–:–Ý »Âgã–üÿ†î_å×"Þ³õ’샞¾¾W¦EÙå1ï,Ü©ö3zE6Ú#©-2<¤éž}XR»Óí Æ÷RžÌm©EÁ$Ûäñ¥œ² 1å½·Q?/„NÎ1fú\l¸‡Hí{0 XûîY™Q`ý5wuÔTR­aÞ e×»b7-.·¡Öþi·ûÏ]: {¯é#i4p[<•;oÃIV« !æ€÷£´±šÓ”›ÆJlïEô Ýÿ1MÊ£Üdæ³C%„ž/+xÎC$Ì.Çò~×&sÏߊ0ýÇð¬U·ü¼dh_›0ll]^àZOmkŒ™Ðò?váüCç®+ÉkÓwÏ^ï¨Ï_i“ ¡låoÊ]Æ·˜‘"Ùô°ì”'¼µs+¯*«‰t’‹ÚVŠÜœ²jÒ‚=¬Â1h™hÆ£fXsÜ–\·^ÑU—`ÎVè:®XÙ.mz{¡’µ¢UŒêvõÖì 1È)ÍêfFõ§Hs/Û{/ñenô(uáÒÞ¶®aÁþŒ¨èßÕ3¼eNžzŸ @¶;Ý)¦÷r–°*äÈ¿ÁË+ˆ–t_:¯-Øá1  Ïù¬ã¡°´†âfN»v¶ ú‰.îtjxž ù}gÙà Azv{ZÕ©V2ceÖ^ϳä„ksc6ž‡±Å©”J„%Ž´p6¬5 ’ÜÇ'›™EofômýËÖz(£µþ5»*Æ\ïåjr…ÂZ]†T·>ë˴.Vý«ÁÆPé+¼*ë9~V’,foyvçþP—Ué`ÝÓe&¾0ºÂ|Ü‹-¯$–ï²(ž7²3Ås 0½#ßþ}Qi ¯†ò}£ækÁl%^&Ì‹Œ¹”G h\ïëL¾Âÿ!›W(˜%'‹@«»pæVD³„‡rõð|,AïÁì¨{´ …OŸoËݼ@æv.˜Ü’>>¾‘íl!Xî½Å†WþÕp–Ôžhત†zBÿ5)2å™ó4ªÃ^ÕÖv@,[(àùµô(}´Z^¥RI¤ŽØNàßÇcxª=ÀJCê¿×·”µÁ~˜ºw®` Vµ5÷7YÿY×Gžý³íóEe»dî×@—‚6" ¶ç¦‘ÉVd¼”D|:¬ðdÛ¾Å^¢©ÚoækA¶ŽŸMÆóúÊgYc¤ƒº@¾ÿ€TGtg*ƒ¬›C9Š2•y]•Ĥv.~ÇÖ}ŠZèe*}á#Uì!ÝxRÇíȳ™Cc‚gVÊ‹ßcLüM&‹¨Ï·ÍÓÕ&%z³þ?¡ÅU”É©ïÓDcXhG#·­PûµÊþHý[u‰¾i;•oá}ÄNé§»]àMÂôk&ËWr´Ç¥¶ó}-6È%P!·®ÓPÌz èr¿”1Tõ¡iØ»…ç×gØv¿ÃÚË—››®J€œ †©°ÍbL¸•1ÑÐ…•$Ä“ <½‹²«¹«ËÐÛ›¿ÏÂ$ul¿¹åæyÿ øm €i†]*,H_õïïФ >·"o 7W¸ä¸ÿEˆ… fÛ[>wÅ ñ)` U Áfšu}BŒN·;ãvqõW•­.ÙºÉÜoúß`“³Œ{W̺c˜õ?áf~ÓÌcû–ÎÍÂ'²öši”ùÎÐ+^ÁUaÌb€²¥ÂµòD:2¶¥U<Q2ç.ʺ¤ÀÍn,H…9z19ÍnXô”þ-KàýcgÆ.è˜.»à¸SBáä šŽZ¢†è¾àsÊëOn”¬ôÿ=@féSÞ.èQEÅíûÀ*¦€B—ç4Ü:±Š*ú„åZžùø–ùžÓ>)Âï‹/!‹µº–Ŷî5à‰ø)’ÛᤓS¿BóÉ$¼%þq„²@„‘€ô‚,›O<ú1»¤qõÞ?ßñ,=;® n|q‹«)ˆîôÉÙ-Ÿ{ko›Ò¥vxC#„ã4Q\6X‹½ !Ìݳ \xÝê,]Î3cÉ ÁЉ’gݦð=&{Û£+Áò5bD?GH¬®ksÜÑe‚½™¨ÿ€2 ¬itšmשּׂ6õå æˆ”}%&úÉÉ(äœCÖ¶Ke²Ú«x1XêœCó˜¤!gaAÿ4ëp¸¾áŒ ­^üñE š?×R•÷ª$²—-O©¥g†¸"b×|YX +zC¾ù[m \ú ß¹îwŒ¹WéQ/™ 7äèóJ®Kï"0(m=eý÷@&ú ¢²Þv7Rœm©ò°¥!„w‹=á1^jžt‹˜¿r=—œc};ç<1mð# ñ0ëêù•š}Œ>+ëLB‹æ½Fµ:Â+ ¹3h?ꡟü tªØ~Z4Xß«©¨)Oõ‹÷Ö¬$# PfrŒÙÁ¥Ó3'ÈcOuÿGj(:Ï ¥x›":¹¤á³ƒcõpe eÕ ê¾‹>>’–DxÇt xï _«cU,Üt›5Öù?j¼{ØäÉ„!– Õ Üœ92©è ˆœ~”D ¯R‹Àîyñ<˜çÈ›¶ÃAΪÅÊ·7“í])˜ äÃa…ó)¤¤¼×–ý&o¼MyŽ~oÎöj®‰ÍwW qsŒƒ¡Ì  )!ê5¸±nÊÞ&±|úÍ‘£¦—š›Ü´ú$Û¼*ÚZ(ßÑ$ÔÔ•æµjÙM[W˜8—•QÏ9t‡áåkö–"}ñ²ãDB›|F‹4ŠQU>]¿0ŽÞq§î›~',J£õ `‘ä-!/ðg‚§á‘ÖOü+QêCmÒ"Û6rïh@²s]€“Ú™Ri\Ah3 ±á <£Æ—V„+©ýSD…µ„LL’öA&´mIŸ„¨Ws CóÈ‘nÚíž,É5Mgs_¡•Q!’€^ýãæƒxgÈ7vÅSÚ«c=²%<)©öáBAy6ÒMDáHÆ Ê—զĊò»X(I=í}HáúúR@ꢻŽïƒóªu¨è_1->ßȉ¨Íªð÷ ƒº–œ ®j V«)7ƒÉ,¬yükh™Lª[næ¥NË_Ï^Œ¿æßM ¬±Ÿ”2¢fUM¦o†Á&íI—^-’aX|=g°Ou‰ÇŸþÑ UÏ`ÏnÌyƒhÌ6$r÷ÿlýt =¹žNŸ$õÏAD>Þ1šcC´X^Åoe¬h!`¥Íæk zÌJ¥ÛÜÕáõ¼ âLÅÁÿ„RoMkÕ!E«áƒwÊ7älH¡9óhµ]Œ ’ûê÷u<>Ý8®j?€šË²Ëbö*E_‘Uä:ª°0‚ŠqTÊ«n˜Ëj›kßNdÑ÷2æÌD~¦%ìWao¤–/•w舦{”E’Ió!æó׿¤ñ“^ýƒª3’üuãÔ°ö9)» XjW2µâ²ÅÞ>ïQôë~]›2 úfÜ4öS¡»˜Zì Z¹Ñ ©ì¡ú™ eêÛ$[ ã#¾N®‹Ç…+ž´N1šºˆ215ÌîSñÐn p™èlôìØà—Á£CTÕ$6Øg³*ëŽ:ycÝïfÊÑ%²òšU{²ð%÷_Jâ“ ÆHQµÍŠO¨ñ˜½«ˆUeÊ­®Ô‚Ø’ë(=ÑÕ©fS£ˆŒþÁº†RGF¡—ZÙ'™üý(Å#•U}Ðzh3« hÁ“TaÉ5Øâésúi퇀Š}ëýÏ;)pŽ9$°šç°¿•´. ŽË$gš×’:²CÅ‘ž|=ºÕDÀØ~ì n¹as¢» “4Ý1ÏhF–«¥ã©9‘¶8ÎÕ¼K­DÜKæJ8¦˜›ëÜ1Žíc†‰þÑ¥ ÈüÁ ß Ç]ƒ .¸¬\i´!’`C¡¸uÑ»*r[8>Ó15“¾/%мẊ"à=g2üUh© FðDRC·ÿML°Bß> Ïd5jÇ3“á?S!þ£Äæe‹•0 O÷LÀÊŠ¤ÑIô¸ó7A7fG©Ë~Ɖ:õ1W-¯Òðlc½°VóŠb‘Š“5ϲDÐÐ|Fˆ¡¶•¬ŸßL¡½F>Äd†…‚h9Š$FþÅËžoúÂkªTSɦ–Éé˜ôˆvY®¼O MÐþó\Ž k3e‚þ,çÀõ=ü\-´ B?s€-=S<óè D°[{xƒ¢¿Ï ÀC—æWü¯YØ ”0î÷H8¨á‚Öúú÷<§âK‘eÖœ“scúª x¶þúˆµÄ@Z?¥_ã(u^LËõdçÐ\}Ê ¸§0 *:þ"[0l%¢®D™fU÷Mj5ò0n¹Ì¤M­¯*3ð)C`èÑ>¹ìR®6aÁ/¹“C(*é CS©1ZÑþ³@šgXPäO‘cÒ“±éÏ–‹šà䶆ïà¡Û¼1Á'x1ËÓ Š²7áß6Š2îaWÛ@¢¸eºÈìVÒ­x€€ñý¬+»ê³ï©®ú†ÛOoÔ4¿¶ËýN/Ú§ûnþ?µOö‘ÿ[zßSp¾¤Ék½ú¿QWí¤¿máÂ~wÑÖ{ê²ÿ5¸_RL¿µÒ~zrú’?mnŸ]Î_ýÍø>@Î~gâáî &RMu ­â×¥QÎB;=ËíaMµU*N¦¬‡©S^¼—i‹É‹%­7/ÌÃXfê¸C¢`UTÅÜ¥y/DÜ‹¼ï,”$¿=©f?Þ,±(E¿5s4¿Ô-ù¡e!ÀèÖ#>±$›#ÊiÈæefÏF0`iàÛÞ••✠Òùô02ÇÌXic ¿ž/Ü6ÉËž•¸F“ß ‡ºSZ¹srO9Îu!U.£ºWU·ž&ûÉÁ´ô3ô1?•wù"±0pF~oÃvbñ‘É0r¯ˆFÞ¢å7Cæ¼ÇߨÁã`£Þ¼dýV¦v(7<>ÀB¤;_Á1A¢ðeþº{z^'ZM^hJÂ>êaX¬P–ßmç¬e5—Rõ¬ðƒ¼ôŸKáÎÙ&‘ä,i»÷™‚-Ü;+¥åʃÒ/ÿ('qðq¤œ+¤™–å†ÇŸQ#˜ŒYYÉl!ˆ¯M+ÛšÞ[‡LAQêÅìkž‘¤¼YæãGÉØÆ…Ÿsø‘ÔxŒcÃÙ¯DÐ’©±OÿÉgÂBJN JÙÅÝaÓ5~‘¬{yæù[(Ožú ó@¹þ¢\ëH¬ ÄQÑßðRÇ'ÓS­£•Ó¾Ó9Â1$Pßç[ ~·_7Íó|ßÍùXd­f5¤šl·s)­n8øp"ÿMÁ¿Š ´ €u"ÕÙ HWé$+‡ê5Eçq˜l=ÒLÉ– JãMù+n§zšÐôÂ(X ›ñô(P½³ÿv›ÕôLs’©±OÿÉgÂBJN JÙÅÝaƒí±ÀzG.ã{'šß6ïfƒËájÝ’ˬXKÄ4‘ÃV¹W(Ÿ€eÌIºD_œÿxnÒß,pÊ¡¦×¤"ŠXF9¡CÀ)£“×YG|·,ʬ¿0O;¯ŽG¿ÓB/eÿÀqTIu«Â)¸ÕzÇU %’“à¢À‚zŠR‰…¥‰³¤jÍ»M~Àù-.‘0–„ÒNž÷ëé–’©±OòãÔ3Ë€°ñ7 $!Q%λS“„ƒ³bÇj‰hx¾œ…kÉØ þ Òm*ë™ô؃•B6¤Pìé¶HBëž/éŒB:ÎFG_çšñ›æS” T³¯ˆIÀÏBuóã½Æúªõu¯Žš±öÎÃ<‹´n÷“µGÆò¡Ý9àO§8ÐpÍcf‹˜á§P>ħç^£ßj{‹˜’$?¬ŒVæÆX.½M‰C°Ñƒd¦Ì{ïýŽ»ƒ|z‹ÞÛká˜ÑâåJ£½æJ®ÿO*$+Ä`–‡‡'°;ç7¢ÈX€› øz”"«¹²þÄ1­hW¬svB­õË9€~šË  ÕÀR($ªh²Qñ¿I«‰jrªa†…¬ÒøÙÄ:GæŸ]UK–ÝÀ1+ƒV‡7Ì>Óž q rŸUóºTÙ­ARÑ!ÏèéAºüc aKªgþ=Ò Û§_É\ºSbÙ‘­$ îbCæ\à€Ú”Fl3•¸L”ŠÅé2¼ÇEÍ(!µ*ÙÝ[_œt‰Ó©¥¹ö¢™<5_Ïcá–éj¶áÚ¿u“^vTà–‡^ìãŬ˜‚¢”*BRcâB  :"Ì[å”UñÙ2)iò=šˆQjá,Il4м0°* qªÏ¹…R)ç*¢–ªìBt}Âò¥Ñª–"ȆW0Sz£•¾Ó$xÕ Ñ~÷ø£ßÀ $%úh˜”/$˜Œ ¦Z~µ”ƵðÖKÔëàMÅlmËw¢Ò/ýP#[ ÷® |/h¢˜lNIØ$ÚÉÎD‹¸¾L_)‡áÈqŽh­=ÖiÔ| áÚXq»ÍºL£è±܆‡¤z{²uA±h©yDp¶áÛGþ}G±Ùó|Èp5K˜4é$æZ…N'›È¸Oadz§5†Ÿ”ÊWq3 p6 îáCÙõ­I„„Jû;ðØm®hXWZ`_ >VkÇF£Š”R2޲y^¯g_l ¤n†f—Դ]2Æ}E’ÜïÖJrhb‡h µSóP߇¥§u =®a²OÜúþU·g<ÉQ߉¶ûOKïfŸ¢¼ò¤Ïø8tvM‰f›pª…ŠÀž[wõP¯}ø„ànó÷$ÏY ]AÕ«iY¹³O½²Á·+ý¨ý-õ5õT€ñXÇËwÒ`áÇ›€ueÖ:Ë)dA•6ÔòB×z ù:lmžWÈvohÕýŸš ^iaµíŠ!°{„ƒÑ 3LÞ“Íã=¡¸5ŽÙçê¾eÖfêŒ`Êý¦¡> K²fˆGQë Ëþ–ÍLðÖø”v.%æ øe;ÆC€ð‚µVD˜êÅ.~…#D°CoÛé˜4™Æ‹‰ã¼e Qn¨Ž¥QWa:XJÎi¹Cð¼+‘>#·ð»¥òßù²‡'âíý­…>?ËZðæµ:0i’§æ-Yÿg8-EhÍxòx׿@J²ÆÁ|¼HÃ}s%z1»¸Å¨=à§­2µŠmÅm F ÃB+Ël÷[x êö pËã RRŽšÁrͦÛþñ_žiöÓ¡žWÆ|¾ÙŽ#âÛœÃEÜ%¯¢úA˜I]»!TJµ  ´YÌx[1Ñ÷ÏF!ÅŽxs@û„‚±ä¸¶Ñ„ÊW ”·‘³²ê,&ÓM¥©*‰uå¨ÍöD)Gò£ÆÅÏe2E÷º«›q¿Ÿ+õMª<‡€´ÂËÇÍÏsøþ`,o)F¸¥Z¯÷Ø3ØZRv›at±„th§á#çH'ÛÑ£üˆÒºlÖ\*Qt–=zw`}Ùñ+WGÕ@‘ #ifdef UNIX # include #endif typedef void (*Signal_Handler_t)(int); /* * Wrapper around signal() which it is safe to take the address * of, in case signal itself is hidden by some some macro magic. */ static Signal_Handler_t wrap_signal(int sig, Signal_Handler_t handler) { return signal(sig, handler); } /* Call this instead of calling signal() directly. */ static Signal_Handler_t (*signal_aux)(int, Signal_Handler_t) = wrap_signal; /* * Handle signals -- suspend * * Actually suspend the game, and then resume cleanly */ static void handle_signal_suspend(int sig) { /* Protect errno from library calls in signal handler */ int save_errno = errno; /* Disable handler */ (void)(*signal_aux)(sig, SIG_IGN); #ifdef SIGSTOP /* Flush output */ Term_fresh(); /* Suspend the "Term" */ Term_xtra(TERM_XTRA_ALIVE, 0); /* Suspend ourself */ (void)kill(0, SIGSTOP); /* Resume the "Term" */ Term_xtra(TERM_XTRA_ALIVE, 1); /* Redraw the term */ Term_redraw(); /* Flush the term */ Term_fresh(); #endif /* Restore handler */ (void)(*signal_aux)(sig, handle_signal_suspend); /* Restore errno */ errno = save_errno; } /* * Handle signals -- simple (interrupt and quit) * * This function was causing a *huge* number of problems, so it has * been simplified greatly. We keep a global variable which counts * the number of times the user attempts to kill the process, and * we commit suicide if the user does this a certain number of times. * * We attempt to give "feedback" to the user as he approaches the * suicide thresh-hold, but without penalizing accidental keypresses. * * To prevent messy accidents, we should reset this global variable * whenever the user enters a keypress, or something like that. */ static void handle_signal_simple(int sig) { /* Protect errno from library calls in signal handler */ int save_errno = errno; /* Disable handler */ (void)(*signal_aux)(sig, SIG_IGN); /* Nothing to save, just quit */ if (!character_generated || character_saved) quit(NULL); /* Count the signals */ signal_count++; /* Terminate dead characters */ if (p_ptr->is_dead) { /* Mark the savefile */ my_strcpy(p_ptr->died_from, "Abortion", sizeof(p_ptr->died_from)); close_game(); /* Quit */ quit("interrupt"); } /* Allow suicide (after 5) */ else if (signal_count >= 5) { /* Cause of "death" */ my_strcpy(p_ptr->died_from, "Interrupting", sizeof(p_ptr->died_from)); /* Commit suicide */ p_ptr->is_dead = TRUE; /* Stop playing */ p_ptr->playing = FALSE; /* Leaving */ p_ptr->leaving = TRUE; /* Close stuff */ close_game(); /* Quit */ quit("interrupt"); } /* Give warning (after 4) */ else if (signal_count >= 4) { /* Make a noise */ Term_xtra(TERM_XTRA_NOISE, 0); /* Clear the top line */ Term_erase(0, 0, 255); /* Display the cause */ Term_putstr(0, 0, -1, TERM_WHITE, "Contemplating suicide!"); /* Flush */ Term_fresh(); } /* Give warning (after 2) */ else if (signal_count >= 2) { /* Make a noise */ Term_xtra(TERM_XTRA_NOISE, 0); } /* Restore handler */ (void)(*signal_aux)(sig, handle_signal_simple); /* Restore errno */ errno = save_errno; } /* * Handle signal -- abort, kill, etc */ static void handle_signal_abort(int sig) { /* Disable handler */ (void)(*signal_aux)(sig, SIG_IGN); /* Nothing to save, just quit */ if (!character_generated || character_saved) quit(NULL); /* Clear the bottom line */ Term_erase(0, 23, 255); /* Give a warning */ Term_putstr(0, 23, -1, TERM_RED, "A gruesome software bug LEAPS out at you!"); /* Message */ Term_putstr(45, 23, -1, TERM_RED, "Panic save..."); /* Flush output */ Term_fresh(); /* Panic Save */ p_ptr->panic_save = 1; /* Panic save */ my_strcpy(p_ptr->died_from, "(panic save)", sizeof(p_ptr->died_from)); /* Forbid suspend */ signals_ignore_tstp(); /* Attempt to save */ if (savefile_save(savefile)) Term_putstr(45, 23, -1, TERM_RED, "Panic save succeeded!"); else Term_putstr(45, 23, -1, TERM_RED, "Panic save failed!"); /* Flush output */ Term_fresh(); /* Quit */ quit("software bug"); } /* * Ignore SIGTSTP signals (keyboard suspend) */ void signals_ignore_tstp(void) { #ifdef SIGTSTP (void)(*signal_aux)(SIGTSTP, SIG_IGN); #endif } /* * Handle SIGTSTP signals (keyboard suspend) */ void signals_handle_tstp(void) { #ifdef SIGTSTP (void)(*signal_aux)(SIGTSTP, handle_signal_suspend); #endif } /* * Prepare to handle the relevant signals */ void signals_init(void) { #ifdef SIGHUP (void)(*signal_aux)(SIGHUP, SIG_IGN); #endif #ifdef SIGTSTP (void)(*signal_aux)(SIGTSTP, handle_signal_suspend); #endif #ifdef SIGINT (void)(*signal_aux)(SIGINT, handle_signal_simple); #endif #ifdef SIGQUIT (void)(*signal_aux)(SIGQUIT, handle_signal_simple); #endif #ifdef SIGFPE (void)(*signal_aux)(SIGFPE, handle_signal_abort); #endif #ifdef SIGILL (void)(*signal_aux)(SIGILL, handle_signal_abort); #endif #ifdef SIGTRAP (void)(*signal_aux)(SIGTRAP, handle_signal_abort); #endif #ifdef SIGIOT (void)(*signal_aux)(SIGIOT, handle_signal_abort); #endif /* Set to 0 to suppress signal handlers when debugging */ #if 1 # ifdef SIGBUS (void)(*signal_aux)(SIGBUS, handle_signal_abort); # endif # ifdef SIGSEGV (void)(*signal_aux)(SIGSEGV, handle_signal_abort); # endif #endif #ifdef SIGTERM (void)(*signal_aux)(SIGTERM, handle_signal_abort); #endif #ifdef SIGPIPE (void)(*signal_aux)(SIGPIPE, handle_signal_abort); #endif #ifdef SIGEMT (void)(*signal_aux)(SIGEMT, handle_signal_abort); #endif /* * SIGDANGER: * This is not a common (POSIX, SYSV, BSD) signal, it is used by AIX(?) to * signal that the system will soon be out of memory. */ #ifdef SIGDANGER (void)(*signal_aux)(SIGDANGER, handle_signal_abort); #endif #ifdef SIGSYS (void)(*signal_aux)(SIGSYS, handle_signal_abort); #endif #ifdef SIGXCPU (void)(*signal_aux)(SIGXCPU, handle_signal_abort); #endif #ifdef SIGPWR (void)(*signal_aux)(SIGPWR, handle_signal_abort); #endif } #else /* !WINDOWS */ /* * Do nothing */ void signals_ignore_tstp(void) { } /* * Do nothing */ void signals_handle_tstp(void) { } /* * Do nothing */ void signals_init(void) { } #endif /* !WINDOWS */ angband-3.5.1/src/z-msg.h0000644000175000017500000000611012456456607014434 0ustar chriscchrisc#ifndef INCLUDED_Z_MSG_H #define INCLUDED_Z_MSG_H #include "h-basic.h" /*** Constants ***/ /*** Message constants ***/ enum { #define MSG(x, s) MSG_##x, #include "z-msg-list.h" #undef MSG SOUND_MAX = MSG_MAX, }; /*** Functions ***/ /** Initialisation/exit **/ /** * Initialise the messages package. Should be called before using any other * functions in the package. */ errr messages_init(void); /** * Free the message package. */ void messages_free(void); /** General info **/ /** * Return the current number of messages stored. */ u16b messages_num(void); /** Individual message handling **/ /** * Save a new message into the memory buffer, with text `str` and type `type`. * The type should be one of the MSG_ constants defined above. * * The new message may not be saved if it is identical to the one saved before * it, in which case the "count" of the message will be increased instead. * This count can be fetched using the message_count() function. */ void message_add(const char *str, u16b type); /** * Returns the text of the message of age `age`. The age of the most recently * saved message is 0, the one before that is of age 1, etc. * * Returns the empty string if the no messages of the age specified are * available. */ const char *message_str(u16b age); /** * Returns the number of times the message of age `age` was saved. The age of * the most recently saved message is 0, the one before that is of age 1, etc. * * In other words, if message_add() was called five times, one after the other, * with the message "The orc sets your hair on fire.", then the text will only * have one age (age = 0), but will have a count of 5. */ u16b message_count(u16b age); /** * Returns the type of the message of age `age`. The age of the most recently * saved message is 0, the one before that is of age 1, etc. * * The type is one of the MSG_ constants, defined above. */ u16b message_type(u16b age); /** * Returns the display colour of the message memorised `age` messages ago. * (i.e. age = 0 represents the last memorised message, age = 1 is the one * before that, etc). */ byte message_color(u16b age); /** Message type changes **/ /** * Returns the colour for the message type `type`. */ byte message_type_color(u16b type); /** * Defines the color `color` for the message type `type`. */ void message_color_define(u16b type, byte color); /** * Return the MSG_ flag that matches the given string. This does not handle SOUND_MAX. * * \param name is a string that contains the name of a flag or a number. * \return The MSG_ flag that matches the given name. */ int message_lookup_by_name(const char *name); /** * Return the MSG_ flag that matches the given sound event name. * * \param name is the sound name from sound.cfg. * \return The MSG_ flag for the corresponding sound. */ int message_lookup_by_sound_name(const char *name); /** * Return the sound name for the given message. * * \param message is the MSG_ flag to find. * \return The sound.cfg sound name. */ const char *message_sound_name(int message); #endif /* !INCLUDED_Z_MSG_H */ angband-3.5.1/src/option.c0000644000175000017500000002416012456456606014706 0ustar chriscchrisc/* * File: options.c * Purpose: Options table and definitions. * * Copyright (c) 1997 Ben Harrison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "option.h" /* * Option screen interface */ const int option_page[OPT_PAGE_MAX][OPT_PAGE_PER] = { /* User interface */ { /* keyset */ OPT_rogue_like_commands, OPT_use_old_target, OPT_auto_more, /* items */ OPT_pickup_always, OPT_pickup_inven, OPT_notify_recharge, OPT_show_flavors, /* panel change */ OPT_center_player, OPT_disturb_near, /* extra info */ OPT_show_damage, OPT_show_target, /* colouring */ OPT_view_yellow_light, OPT_animate_flicker, OPT_hp_changes_color, OPT_purple_uniques, OPT_solid_walls, OPT_hybrid_walls, /* mouse */ OPT_mouse_movement, /* sound */ OPT_use_sound, OPT_NONE, }, /* Birth/Difficulty */ { OPT_birth_randarts, OPT_birth_keep_randarts, OPT_birth_ai_learn, OPT_birth_force_descend, OPT_birth_no_recall, OPT_birth_small_range, OPT_birth_no_artifacts, OPT_birth_no_stacking, OPT_birth_no_preserve, OPT_birth_no_stairs, OPT_birth_no_feelings, OPT_birth_no_selling, OPT_birth_start_kit, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, }, /* Cheat */ { OPT_cheat_hear, OPT_cheat_room, OPT_cheat_xtra, OPT_cheat_know, OPT_cheat_live, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, OPT_NONE, } }; struct option { const char *name; const char *description; bool normal; }; static const struct option options[OPT_MAX] = { { "rogue_like_commands", "Use the roguelike command keyset", FALSE }, /* 0 */ { "use_sound", "Use sound", FALSE }, /* 1 */ { "show_damage", "Show damage player deals to monsters", FALSE }, /* 2 */ { "use_old_target", "Use old target by default", FALSE }, /* 3 */ { "pickup_always", "Always pickup items", FALSE }, /* 4 */ { "pickup_inven", "Always pickup items matching inventory", TRUE }, /* 5 */ { "show_flavors", "Show flavors in object descriptions", FALSE }, /* 6 */ { "show_target", "Highlight target with cursor", TRUE }, /* 7 */ { "disturb_near", "Disturb whenever viewable monster moves", TRUE }, /* 8 */ { NULL, NULL, FALSE }, /* 9 */ { NULL, NULL, FALSE }, /* 10 */ { "solid_walls", "Show walls as solid blocks", FALSE }, /* 11 */ { "hybrid_walls", "Show walls with shaded background", FALSE }, /* 12 */ { "view_yellow_light", "Color: Illuminate torchlight in yellow", FALSE }, /* 13 */ { NULL, NULL, FALSE }, /* 14 */ { "animate_flicker", "Color: Shimmer multi-colored things", FALSE }, /* 15 */ { "center_player", "Center map continuously", FALSE }, /* 16 */ { "purple_uniques", "Color: Show unique monsters in purple", FALSE }, /* 17 */ { NULL, NULL, FALSE }, /* 18 */ { "auto_more", "Automatically clear '-more-' prompts", FALSE }, /* 19 */ { "hp_changes_color", "Color: Player color indicates % hit points", TRUE }, /* 20 */ { "mouse_movement", "Allow mouse clicks to move the player", TRUE }, /* 21 */ { NULL, NULL, FALSE }, /* 22 */ { "notify_recharge", "Notify on object recharge", FALSE }, /* 23 */ { NULL, NULL, FALSE }, /* 24 */ { NULL, NULL, FALSE }, /* 25 */ { NULL, NULL, FALSE }, /* 26 */ { NULL, NULL, FALSE }, /* 27 */ { NULL, NULL, FALSE }, /* 28 */ { NULL, NULL, FALSE }, /* 29 */ { NULL, NULL, FALSE }, /* 30 */ { "cheat_hear", "Cheat: Peek into monster creation", FALSE }, /* 31 */ { "cheat_room", "Cheat: Peek into dungeon creation", FALSE }, /* 32 */ { "cheat_xtra", "Cheat: Peek into something else", FALSE }, /* 33 */ { "cheat_know", "Cheat: Know complete monster info", FALSE }, /* 34 */ { "cheat_live", "Cheat: Allow player to avoid death", FALSE }, /* 35 */ { NULL, NULL, FALSE }, /* 36 */ { NULL, NULL, FALSE }, /* 37 */ { NULL, NULL, FALSE }, /* 38 */ { NULL, NULL, FALSE }, /* 39 */ { NULL, NULL, FALSE }, /* 40 */ { "score_hear", "Score: Peek into monster creation", FALSE }, /* 41 */ { "score_room", "Score: Peek into dungeon creation", FALSE }, /* 42 */ { "score_xtra", "Score: Peek into something else", FALSE }, /* 43 */ { "score_know", "Score: Know complete monster info", FALSE }, /* 44 */ { "score_live", "Score: Allow player to avoid death", FALSE }, /* 45 */ { NULL, NULL, FALSE }, /* 46 */ { NULL, NULL, FALSE }, /* 47 */ { NULL, NULL, FALSE }, /* 48 */ { NULL, NULL, FALSE }, /* 49 */ { NULL, NULL, FALSE }, /* 50 */ { "birth_randarts", "Randomise the artifacts (except a very few)", FALSE }, /* 51 */ { "birth_no_recall", "Word of Recall has no effect", FALSE }, /* 52 */ { "birth_small_range", "Halve view and spell distances", FALSE }, /* 53 */ { "birth_no_artifacts", "Restrict creation of artifacts", FALSE }, /* 54 */ { "birth_no_stacking", "Don't stack objects on the floor", FALSE }, /* 55 */ { "birth_no_preserve", "Lose artifacts when leaving level", FALSE }, /* 56 */ { "birth_no_stairs", "Don't generate connected stairs", FALSE }, /* 57 */ { "birth_no_feelings", "Don't show level feelings", FALSE }, /* 58 */ { "birth_no_selling", "Increase gold drops but disable selling", TRUE }, /* 59 */ { "birth_keep_randarts", "Use previous set of randarts", TRUE }, /* 60 */ { "birth_start_kit", "Start with a kit of useful gear", TRUE }, /* 61 */ { NULL, NULL, FALSE }, /* 62 */ { "birth_ai_learn", "Monsters learn from their mistakes", FALSE }, /* 63 */ { NULL, NULL, FALSE }, /* 64 */ { "birth_force_descend", "Force player descent", FALSE }, /* 65 */ { NULL, NULL, FALSE }, /* 66 */ { NULL, NULL, FALSE }, /* 67 */ { NULL, NULL, FALSE }, /* 68 */ { NULL, NULL, FALSE }, /* 69 */ }; /* Accessor functions */ const char *option_name(int opt) { if (opt >= OPT_MAX) return NULL; return options[opt].name; } const char *option_desc(int opt) { if (opt >= OPT_MAX) return NULL; return options[opt].description; } #if 0 /* unused so far but may be useful in future */ static bool option_is_birth(int opt) { return opt >= OPT_BIRTH && opt < (OPT_BIRTH + N_OPTS_BIRTH); } static bool option_is_score(int opt) { return opt >= OPT_SCORE && opt < (OPT_SCORE + N_OPTS_CHEAT); } #endif static bool option_is_cheat(int opt) { return opt >= OPT_CHEAT && opt < (OPT_CHEAT + N_OPTS_CHEAT); } /* Setup functions */ bool option_set(const char *name, int val) { size_t opt; /* Try normal options first */ for (opt = 0; opt < OPT_MAX; opt++) { if (!options[opt].name || !streq(options[opt].name, name)) continue; op_ptr->opt[opt] = val ? TRUE : FALSE; if (val && option_is_cheat(opt)) op_ptr->opt[opt + (OPT_SCORE - OPT_CHEAT)] = TRUE; return TRUE; } return FALSE; } void option_set_defaults(void) { size_t opt; for (opt = 0; opt < OPT_MAX; opt++) op_ptr->opt[opt] = options[opt].normal; /* 40ms for the delay factor */ op_ptr->delay_factor = 40; /* 30% of HP */ op_ptr->hitpoint_warn = 3; } /* * Write all current options to a user preference file. */ void option_dump(ang_file *f) { int i, j; file_putf(f, "# Options\n\n"); /* Dump window flags */ for (i = 1; i < ANGBAND_TERM_MAX; i++) { /* Require a real window */ if (!angband_term[i]) continue; /* Check each flag */ for (j = 0; j < (int)N_ELEMENTS(window_flag_desc); j++) { /* Require a real flag */ if (!window_flag_desc[j]) continue; /* Comment */ file_putf(f, "# Window '%s', Flag '%s'\n", angband_term_name[i], window_flag_desc[j]); /* Dump the flag */ if (op_ptr->window_flag[i] & (1L << j)) file_putf(f, "W:%d:%d:1\n", i, j); else file_putf(f, "W:%d:%d:0\n", i, j); /* Skip a line */ file_putf(f, "\n"); } } } angband-3.5.1/src/Makefile.crb0000644000175000017500000001433612456456606015443 0ustar chriscchrisc# File: Makefile.crb # This is a (rather crude) Makefile for the deprecated Mac OS X Carbon port of # Angband. # # Based on Makefile.std, made separate because this port does not uses # main.c. # default target all: install # settings CC = gcc LD = ld OPT ?= -O2 NAME = Angband APPNAME = $(NAME).app EXE = angband ARCH = -arch i386 -arch ppc WARNINGS = -W -Wall -Wno-unused-parameter -Wno-missing-field-initializers JUST_C = -std=c99 -Wdeclaration-after-statement OBJ_CFLAGS = -std=c99 -x objective-c -mmacosx-version-min=10.4 CFLAGS = -I. $(WARNINGS) $(OPT) -DMACH_O_CARBON -DHAVE_MKSTEMP \ -DPRIVATE_USER_PATH=\"~/Library/Preferences\" -DUSE_PRIVATE_PATHS \ -fno-stack-protector $(ARCH) LIBS = -framework CoreFoundation -framework QuickTime -framework Carbon \ -framework Cocoa # Import user prefs # If you don't want to edit this file, put your module redefinitions # and build flags in "./config" -include config # # Provide a CFLAGS override so that older versions of OS X can continue to # compile their own builds. The default CFLAGS provide a backwards-compatible # binary, but will error when building on <10.3.9. # ppc: CFLAGS = \ -Wall -std=gnu99 $(OPT) -DMACH_O_CARBON -DHAVE_MKSTEMP \ -DPRIVATE_USER_PATH=\"~/Library/Preferences\" -DUSE_PRIVATE_PATHS ppc: OBJ_CFLAGS = -std=c99 -x objective-c -mmacosx-version-min=10.0 # -DALLOW_BORG is required for all .o files in a borg build ifneq (,$(findstring borg, $(MAKECMDGOALS))) CFLAGS += -DALLOW_BORG endif # Check for autoconf.h; do not warn on nonexistence autoconf= $(wildcard autoconf.h) ifneq ($(autoconf),) CFLAGS += -DHAVE_CONFIG_H endif # Note that Makefile.inc sets VERSION, and so we must run version.sh after # including Makefile.inc include Makefile.inc VERSION := $(shell ../scripts/version.sh) ifneq (${VERSION},) CFLAGS += -DBUILD_ID=${VERSION} endif BOBJS = borg1.o borg2.o borg3.o borg4.o borg5.o borg6.o borg7.o borg8.o borg9.o OBJS = $(BASEOBJS) OSX_OBJS = main-crb.o # # Build the "Angband" program # $(EXE).o: $(OBJS) $(LD) -r -arch ppc -o $@.ppc $(OBJS) $(LD) -r -arch i386 -o $@.i386 $(OBJS) lipo -arch ppc $@.ppc -arch i386 $@.i386 -create -output angband.o $(EXE): $(EXE).o $(OSX_OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(EXE).o $(OSX_OBJS) $(LIBS) ppc: $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(OBJS) $(LIBS) borg: $(OBJS) $(BOBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(OBJS) $(BOBJS) $(LIBS) # # Clean up old junk # clean: -rm -f $(OBJS) $(EXE) $(EXE).o.ppc $(EXE).o.i386 $(EXE).o $(OSX_OBJS) # # Basic build rules and dependencies # main-crb.o : main-crb.c @printf "%10s %-20s (objective-c)\n" CC $< @$(CC) $(CFLAGS) $(OBJ_CFLAGS) -c -o $@ $< %.o : %.c @printf "%10s %-20s\n" CC $< @$(CC) $(JUST_C) $(CFLAGS) -c -o $@ $< main-crb.o: osx/osx_tables.h # # Installation. # Application bundle -- a directory looking like an ordinary application # # Bundle of the game (it must be a directory whose name ends in ".app") APPBNDL = ../$(APPNAME) # A bundle must have these subdirectories APPCONT = $(APPBNDL)/Contents APPBIN = $(APPCONT)/MacOS APPRES = $(APPCONT)/Resources # Auxiliary files. Please note that it still uses resouce fork based # resources for menus, dialogues and sounds, so that it isn't safe to use # utilities that doesn't understand them (virtually all Un*x commands) to # copy or archive the application. # # The graphics tiles have been moved out of the resource fork, but, again, # it isn't generally safe just to convert GIF or BMP files to PNG, because # the Mac OS takes dpi values stored in various images quite seriously. # Almost all tilesets for *band requires adjustment, with the sole exception # of 8x8.png for Vanilla. Make sure setting dpi to 72, *not* preserving # the actual size of image. When you have them ready, put them in # the lib/xtra/graf directory and rebuild. ICONFILES = osx/Angband.icns osx/Save.icns osx/Edit.icns osx/Data.icns PLIST = osx/Angband.xml GRAPHSRC=../lib/xtra/graf/ TILES = $(GRAPHSRC)8x8.png $(GRAPHSRC)8x16.png $(GRAPHSRC)16x16.png $(GRAPHSRC)32x32.png $(GRAPHSRC)64x64.png LIBFILES = \ ../lib/edit/*.txt \ ../lib/file/*.txt \ ../lib/help/*.txt \ ../lib/help/*.hlp \ ../lib/pref/*.prf \ install: $(EXE) $(ICONFILES) $(PLIST) $(LIBFILES) @echo making directories... @mkdir -p $(APPBNDL) @mkdir -p $(APPCONT) @mkdir -p $(APPBIN) @mkdir -p $(APPRES) @mkdir -p $(APPRES)/English.lproj/main.nib @mkdir -p $(APPRES)/lib/edit @mkdir -p $(APPRES)/lib/file @mkdir -p $(APPRES)/lib/help @mkdir -p $(APPRES)/lib/pref @mkdir -p $(APPRES)/lib/script @mkdir -p $(APPRES)/lib/xtra/graf @mkdir -p $(APPRES)/lib/xtra/sound @echo copying files... @cp ../lib/edit/*.txt $(APPRES)/lib/edit @cp ../lib/file/*.txt $(APPRES)/lib/file @cp ../lib/help/*.txt $(APPRES)/lib/help @cp ../lib/help/*.hlp $(APPRES)/lib/help @cp ../lib/pref/*.prf $(APPRES)/lib/pref @cp ../lib/xtra/graf/*.txt $(APPRES)/lib/xtra/graf # 'optionally' install sound and graphics tiles, if present -cp $(TILES) $(APPRES)/lib/xtra/graf -cp ../lib/xtra/sound/*.mp3 $(APPRES)/lib/xtra/sound -cp ../lib/xtra/sound/sound.cfg $(APPRES)/lib/xtra/sound install -m 755 $(EXE) $(APPBIN) install -m 644 $(ICONFILES) $(APPRES) cp osx/English.lproj/main.nib/*ib $(APPRES)/English.lproj/main.nib sed -e 's/\$$VERSION\$$/$(VERSION)/' -e 's/\$$COPYRIGHT\$$/$(COPYRIGHT)/' \ -e 's/\$$NAME\$$/$(NAME)/' -e 's/\$$EXECUTABLE\$$/$(EXE)/' \ $(PLIST) > $(APPCONT)/Info.plist SetFile -a B $(APPBNDL) vars: @echo LDFLAGS = $(LDFLAGS) @echo CFLAGS = $(CFLAGS) @echo BASEOBJS = $(BASEOBJS) PACKAGE_NAME = $(NAME)-$(VERSION) # In the unlikely event that tar+zip isn't enough... ../doc/manual.pdf: $(MAKE) -C ../doc manual.pdf dist: install ../doc/manual.pdf @rm -rf disttemp* mkdir -p disttemp/Docs cp ../changes.txt ../copying.txt ../faq.txt ../readme.txt ../doc/manual.pdf disttemp/Docs cp -R -p "$(APPBNDL)" disttemp SetFile -a B disttemp/$(APPNAME) @-rm ../"$(PACKAGE_NAME)-osx.dmg" hdiutil create -quiet -fs HFS+ -volname $(PACKAGE_NAME) -srcfolder disttemp disttemp.dmg hdiutil convert disttemp.dmg -quiet -format UDZO -imagekey zlib-level=6 -o ../"$(PACKAGE_NAME)-osx.dmg" rm -rf disttemp* tests: $(MAKE) -C tests all CFLAGS="-I.. $(CFLAGS)" LDFLAGS="$(LIBS)" DEFAULT_CONFIG_PATH=../lib test-clean: $(MAKE) -C tests clean .PHONY : tests test-clean angband-3.5.1/src/hint.h0000644000175000017500000000017012456456606014340 0ustar chriscchrisc#ifndef HINT_H #define HINT_H /* * A hint. */ struct hint { char *hint; struct hint *next; }; #endif /* HINT_H */ angband-3.5.1/src/trap.c0000644000175000017500000000570612456456606014351 0ustar chriscchrisc/* * File: trap.c * Purpose: Trap triggering, selection, and placement * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "cave.h" #include "effects.h" #include "spells.h" #include "trap.h" /* * Determine if a trap affects the player. * Always miss 5% of the time, Always hit 5% of the time. * Otherwise, match trap power against player armor. */ bool trap_check_hit(int power) { return test_hit(power, p_ptr->state.ac + p_ptr->state.to_a, TRUE); } /* * Hack -- instantiate a trap * * XXX XXX XXX This routine should be redone to reflect trap "level". * That is, it does not make sense to have spiked pits at 50 feet. * Actually, it is not this routine, but the "trap instantiation" * code, which should also check for "trap doors" on quest levels. */ void pick_trap(int y, int x) { int feat; static const int min_level[] = { 2, /* Trap door */ 2, /* Open pit */ 2, /* Spiked pit */ 2, /* Poison pit */ 3, /* Summoning rune */ 1, /* Teleport rune */ 2, /* Fire rune */ 2, /* Acid rune */ 2, /* Slow rune */ 6, /* Strength dart */ 6, /* Dexterity dart */ 6, /* Constitution dart */ 2, /* Gas blind */ 1, /* Gas confuse */ 2, /* Gas poison */ 2, /* Gas sleep */ }; /* Paranoia */ if (!cave_issecrettrap(cave, y, x)) return; /* Pick a trap */ while (1) { /* Hack -- pick a trap */ feat = randint0(16); /* Check against minimum depth */ if (min_level[feat] > p_ptr->depth) continue; /* Hack -- no trap doors on quest levels */ if ((feat == 0x00) && is_quest(p_ptr->depth)) continue; /* Hack -- no trap doors on the deepest level */ if ((feat == 0x00) && (p_ptr->depth >= MAX_DEPTH-1)) continue; /* Done */ break; } /* Activate the trap */ cave_show_trap(cave, y, x, feat); } /* Places a trap. All traps are untyped until discovered. */ void place_trap(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); assert(cave_isempty(c, y, x)); cave_add_trap(c, y, x); } /* Create a trap during play. All traps are untyped until discovered. */ void create_trap(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); assert(cave_isempty(cave, y, x)); cave_add_trap(c, y, x); } /* * Handle player hitting a real trap */ void hit_trap(int y, int x) { bool ident; struct feature *trap = &f_info[cave->feat[y][x]]; /* Disturb the player */ disturb(p_ptr, 0, 0); /* Run the effect */ effect_do(trap->effect, &ident, FALSE, 0, 0, 0); } angband-3.5.1/src/effects.h0000644000175000017500000000213612456456606015021 0ustar chriscchrisc/* * File: effects.h * Purpose: List of effect types * * Copyright (c) 2007 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef INCLUDED_EFFECTS_H #define INCLUDED_EFFECTS_H /* Types of effect */ typedef enum { #define EFFECT(x, y, r, z) EF_##x, #include "list-effects.h" #undef EFFECT EF_MAX } effect_type; /*** Functions ***/ bool effect_do(effect_type effect, bool *ident, bool aware, int dir, int beam, int boost); bool effect_aim(effect_type effect); const char *effect_desc(effect_type effect); int effect_power(effect_type effect); bool effect_obvious(effect_type effect); bool effect_wonder(int dir, int die, int beam); #endif /* INCLUDED_EFFECTS_H */ angband-3.5.1/src/h-basic.h0000644000175000017500000001225412456456606014712 0ustar chriscchrisc#ifndef INCLUDED_H_BASIC_H #define INCLUDED_H_BASIC_H /* * Include autoconf autodetections, otherwise try to autodetect ourselves */ #ifdef HAVE_CONFIG_H # include "autoconf.h" #else /* * Native MSVC compiler doesn't understand inline or snprintf */ #ifdef _MSC_VER # define inline __inline # define snprintf _snprintf #endif /* Necessary? */ #ifdef NDS # include # include # include # include # include #endif /* * Using C99, assume we have stdint and stdbool */ # if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \ || (defined(_MSC_VER) && _MSC_VER >= 1600L) # define HAVE_STDINT_H # endif # if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L # define HAVE_STDBOOL_H # endif /* * Everyone except RISC OS has fcntl.h and sys/stat.h */ #define HAVE_FCNTL_H #define HAVE_STAT #endif /* HAVE_CONFIG_H */ /* * Extract the "WINDOWS" flag from the compiler */ # if defined(_Windows) || defined(__WINDOWS__) || \ defined(__WIN32__) || defined(WIN32) || \ defined(__WINNT__) || defined(__NT__) # ifndef WINDOWS # define WINDOWS # endif # endif /* * Define UNIX if our OS is UNIXy */ #if !defined(WINDOWS) && !defined(GAMEBOY) && !defined(NDS) # define UNIX # ifndef HAVE_DIRENT_H # define HAVE_DIRENT_H # endif #endif /* * Define SETGID if we are running as a central install on a multiuser * system that has setgid support. */ /* #define SETGID */ /* * Every system seems to use its own symbol as a path separator. * * Default to the standard Unix slash, but attempt to change this * for various other systems. Note that any system that uses the * "period" as a separator (i.e. RISCOS) will have to pretend that * it uses the slash, and do its own mapping of period <-> slash. * * It is most definitely wrong to have such things here. Platform-specific * code should handle shifting Angband filenames to platform ones. XXX */ #undef PATH_SEP #define PATH_SEP "/" #define PATH_SEPC '/' #ifdef WINDOWS # undef PATH_SEP # undef PATH_SEPC # define PATH_SEP "\\" # define PATH_SEPC '\\' #endif /*** Include the library header files ***/ /* Use various POSIX functions if available */ #undef _GNU_SOURCE #define _GNU_SOURCE /** ANSI C headers **/ #include #include #include #include #include #include #include #include #include #include #include #include /** POSIX headers **/ #ifdef UNIX # include # include # include #endif /*** Define the basic game types ***/ /* * errr is an error code * * A "byte" is an unsigned byte of memory. * s16b/u16b are exactly 2 bytes (where possible) * s32b/u32b are exactly 4 bytes (where possible) */ /* C++ defines its own bool type, so we hack around it */ #undef bool #define bool bool_hack typedef int errr; /* * Use a real bool type where possible */ #ifdef HAVE_STDBOOL_H #include #undef TRUE #undef FALSE #define TRUE true #define FALSE false #else /* Use a char otherwise */ typedef char bool; #undef TRUE #undef FALSE #define TRUE 1 #define FALSE 0 #endif /* * Use guaranteed-size ints where possible */ #ifdef HAVE_STDINT_H /* Use guaranteed-size types */ #include typedef uint8_t byte; typedef uint16_t u16b; typedef int16_t s16b; typedef uint32_t u32b; typedef int32_t s32b; typedef uint64_t u64b; typedef int64_t s64b; #define MAX_UCHAR UINT8_MAX #define MAX_SHORT INT16_MAX #else /* HAVE_STDINT_H */ /* Try hacks instead (not guaranteed to work) */ typedef unsigned char byte; typedef signed short s16b; typedef unsigned short u16b; #define MAX_UCHAR UCHAR_MAX #define MAX_SHORT 32767 /* Detect >32-bit longs */ #if (UINT_MAX == 0xFFFFFFFFUL) && (ULONG_MAX > 0xFFFFFFFFUL) typedef signed int s32b; typedef unsigned int u32b; #else typedef signed long s32b; typedef unsigned long u32b; #endif #endif /* HAVE_STDINT_H */ /** Debugging macros ***/ #define DSTRINGIFY(x) #x #define DSTRING(x) DSTRINGIFY(x) #define DHERE __FILE__ ":" DSTRING(__LINE__) ": " /*** Basic math macros ***/ #undef MIN #undef MAX #undef ABS #undef SGN #undef CMP #define MIN(a,b) (((a) > (b)) ? (b) : (a)) #define MAX(a,b) (((a) < (b)) ? (b) : (a)) #define ABS(a) (((a) < 0) ? (-(a)) : (a)) #define SGN(a) (((a) < 0) ? (-1) : ((a) != 0)) #define CMP(a,b) ((a) < (b) ? -1 : ((b) < (a) ? 1 : 0)) /*** Useful fairly generic macros ***/ /* * Given an array, determine how many elements are in it. */ #define N_ELEMENTS(a) (sizeof(a) / sizeof((a)[0])) /* * Return "s" (or not) depending on whether n is singular. */ #define PLURAL(n) ((n) == 1 ? "" : "s") /** * Return the verb form matching the given count */ #define VERB_AGREEMENT(count, singular, plural) (((count) == 1) ? (singular) : (plural)) /*** Some hackish character manipulation ***/ /* * Note that all "index" values must be "lowercase letters", while * all "digits" must be "digits". */ #define A2I(X) ((X) - 'a') #define I2A(X) ((X) + 'a') #define D2I(X) ((X) - '0') #define I2D(X) ((X) + '0') #endif /* INCLUDED_H_BASIC_H */ angband-3.5.1/src/z-msg-list.h0000644000175000017500000001074412456456607015415 0ustar chriscchrisc/* * File: z-msg-list.h * Purpose: List of message types * * sound - the name of the entry in sound.cfg */ /* id sound */ MSG(GENERIC, "") MSG(HIT, "hit") MSG(MISS, "miss") MSG(FLEE, "flee") MSG(DROP, "drop") MSG(KILL, "kill") MSG(LEVEL, "level") MSG(DEATH, "death") MSG(STUDY, "study") MSG(TELEPORT, "teleport") MSG(SHOOT, "shoot") MSG(QUAFF, "quaff") MSG(ZAP_ROD, "zap_rod") MSG(WALK, "walk") MSG(TPOTHER, "tpother") MSG(HITWALL, "hitwall") MSG(EAT, "eat") MSG(STORE1, "store1") MSG(STORE2, "store2") MSG(STORE3, "store3") MSG(STORE4, "store4") MSG(DIG, "dig") MSG(OPENDOOR, "opendoor") MSG(SHUTDOOR, "shutdoor") MSG(TPLEVEL, "tplevel") MSG(BELL, "bell") MSG(NOTHING_TO_OPEN, "nothing_to_open") MSG(LOCKPICK_FAIL, "lockpick_fail") MSG(STAIRS_DOWN, "stairs_down") MSG(HITPOINT_WARN, "hitpoint_warn") MSG(ACT_ARTIFACT, "act_artifact") MSG(USE_STAFF, "use_staff") MSG(DESTROY, "destroy") MSG(MON_HIT, "mon_hit") MSG(MON_TOUCH, "mon_touch") MSG(MON_PUNCH, "mon_punch") MSG(MON_KICK, "mon_kick") MSG(MON_CLAW, "mon_claw") MSG(MON_BITE, "mon_bite") MSG(MON_STING, "mon_sting") MSG(MON_BUTT, "mon_butt") MSG(MON_CRUSH, "mon_crush") MSG(MON_ENGULF, "mon_engulf") MSG(MON_CRAWL, "mon_crawl") MSG(MON_DROOL, "mon_drool") MSG(MON_SPIT, "mon_spit") MSG(MON_GAZE, "mon_gaze") MSG(MON_WAIL, "mon_wail") MSG(MON_SPORE, "mon_spore") MSG(MON_BEG, "mon_beg") MSG(MON_INSULT, "mon_insult") MSG(MON_MOAN, "mon_moan") MSG(RECOVER, "recover") MSG(BLIND, "blind") MSG(CONFUSED, "confused") MSG(POISONED, "poisoned") MSG(AFRAID, "afraid") MSG(PARALYZED, "paralyzed") MSG(DRUGGED, "drugged") MSG(SPEED, "speed") MSG(SLOW, "slow") MSG(SHIELD, "shield") MSG(BLESSED, "blessed") MSG(HERO, "hero") MSG(BERSERK, "berserk") MSG(BOLD, "bold") MSG(PROT_EVIL, "prot_evil") MSG(INVULN, "invuln") MSG(SEE_INVIS, "see_invis") MSG(INFRARED, "infrared") MSG(RES_ACID, "res_acid") MSG(RES_ELEC, "res_elec") MSG(RES_FIRE, "res_fire") MSG(RES_COLD, "res_cold") MSG(RES_POIS, "res_pois") MSG(STUN, "stun") MSG(CUT, "cut") MSG(STAIRS_UP, "stairs_up") MSG(STORE_ENTER, "store_enter") MSG(STORE_LEAVE, "store_leave") MSG(STORE_HOME, "store_home") MSG(MONEY1, "money1") MSG(MONEY2, "money2") MSG(MONEY3, "money3") MSG(SHOOT_HIT, "shoot_hit") MSG(STORE5, "store5") MSG(LOCKPICK, "lockpick") MSG(DISARM, "disarm") MSG(IDENT_BAD, "identify_bad") MSG(IDENT_EGO, "identify_ego") MSG(IDENT_ART, "identify_art") MSG(BR_ELEMENTS, "breathe_elements") MSG(BR_FROST, "breathe_frost") MSG(BR_ELEC, "breathe_elec") MSG(BR_ACID, "breathe_acid") MSG(BR_GAS, "breathe_gas") MSG(BR_FIRE, "breathe_fire") MSG(BR_CONF, "breathe_confusion") MSG(BR_DISEN, "breathe_disenchant") MSG(BR_CHAOS, "breathe_chaos") MSG(BR_SHARDS, "breathe_shards") MSG(BR_SOUND, "breathe_sound") MSG(BR_LIGHT, "breathe_light") MSG(BR_DARK, "breathe_dark") MSG(BR_NETHER, "breathe_nether") MSG(BR_NEXUS, "breathe_nexus") MSG(BR_TIME, "breathe_time") MSG(BR_INERTIA, "breathe_inertia") MSG(BR_GRAVITY, "breathe_gravity") MSG(BR_PLASMA, "breathe_plasma") MSG(BR_FORCE, "breathe_force") MSG(SUM_MONSTER, "summon_monster") MSG(SUM_AINU, "summon_ainu") MSG(SUM_UNDEAD, "summon_undead") MSG(SUM_ANIMAL, "summon_animal") MSG(SUM_SPIDER, "summon_spider") MSG(SUM_HOUND, "summon_hound") MSG(SUM_HYDRA, "summon_hydra") MSG(SUM_DEMON, "summon_demon") MSG(SUM_DRAGON, "summon_dragon") MSG(SUM_HI_UNDEAD, "summon_gr_undead") MSG(SUM_HI_DRAGON, "summon_gr_dragon") MSG(SUM_HI_DEMON, "summon_gr_demon") MSG(SUM_WRAITH, "summon_ringwraith") MSG(SUM_UNIQUE, "summon_unique") MSG(WIELD, "wield") MSG(CURSED, "cursed") MSG(PSEUDOID, "pseudo_id") MSG(HUNGRY, "hungry") MSG(NOTICE, "notice") MSG(AMBIENT_DAY, "ambient_day") MSG(AMBIENT_NITE, "ambient_nite") MSG(AMBIENT_DNG1, "ambient_dng1") MSG(AMBIENT_DNG2, "ambient_dng2") MSG(AMBIENT_DNG3, "ambient_dng3") MSG(AMBIENT_DNG4, "ambient_dng4") MSG(AMBIENT_DNG5, "ambient_dng5") MSG(CREATE_TRAP, "mon_create_trap") MSG(SHRIEK, "mon_shriek") MSG(CAST_FEAR, "mon_cast_fear") MSG(HIT_GOOD, "hit_good") MSG(HIT_GREAT, "hit_great") MSG(HIT_SUPERB, "hit_superb") MSG(HIT_HI_GREAT, "hit_hi_great") MSG(HIT_HI_SUPERB, "hit_hi_superb") MSG(SPELL, "cast_spell") MSG(PRAYER, "pray_prayer") MSG(KILL_UNIQUE, "kill_unique") MSG(KILL_KING, "kill_king") MSG(DRAIN_STAT, "drain_stat") MSG(MULTIPLY, "multiply") MSG(MAX, NULL) angband-3.5.1/src/main-test.c0000644000175000017500000001506512456456606015303 0ustar chriscchrisc/* * File: main-test.c * Purpose: Pseudo-UI for end-to-end testing. * * Copyright (c) 2011 Elly * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "birth.h" #include "buildid.h" #ifdef USE_TEST static int prompt = 0; static int verbose = 0; static int nextkey = 0; static void c_key(char *rest) { if (!strcmp(rest, "left")) { nextkey = ARROW_LEFT; } else if (!strcmp(rest, "right")) { nextkey = ARROW_RIGHT; } else if (!strcmp(rest, "up")) { nextkey = ARROW_UP; } else if (!strcmp(rest, "down")) { nextkey = ARROW_DOWN; } else if (!strcmp(rest, "space")) { nextkey = ' '; } else if (!strcmp(rest, "enter")) { nextkey = '\n'; } else if (rest[0] == 'C' && rest[1] == '-') { nextkey = KTRL(rest[2]); } else { nextkey = rest[0]; } } static void c_noop(char *rest) { } static void c_quit(char *rest) { quit(NULL); } static void c_verbose(char *rest) { if (rest && !strcmp(rest, "0")) { printf("cmd-verbose: off\n"); verbose = 0; } else { printf("cmd-verbose: on\n"); verbose = 1; } } static void c_version(char *rest) { printf("cmd-version: %s %s\n", VERSION_NAME, VERSION_STRING); } /* Player commands */ static void c_player_birth(char *rest) { char *sex = strtok(rest, " "); char *race = strtok(NULL, " "); char *class = strtok(NULL, " "); int i; struct player_class *c; struct player_race *r; if (!sex) sex = "Female"; if (!race) race = "Human"; if (!class) class = "Warrior"; for (i = 0; i < MAX_SEXES; i++) { if (!strcmp(sex, sex_info[i].title)) { p_ptr->psex = i; break; } } if (i == MAX_SEXES) { printf("player-birth: bad sex '%s'\n", sex); return; } for (r = races; r; r = r->next) if (!strcmp(race, r->name)) break; if (!r) { printf("player-birth: bad race '%s'\n", race); return; } for (c = classes; c; c = c->next) if (!strcmp(class, c->name)) break; if (!c) { printf("player-birth: bad class '%s'\n", class); return; } player_generate(p_ptr, NULL, r, c); } static void c_player_class(char *rest) { printf("player-class: %s\n", p_ptr->class->name); } static void c_player_race(char *rest) { printf("player-race: %s\n", p_ptr->race->name); } static void c_player_sex(char *rest) { printf("player-sex: %s\n", p_ptr->sex->title); } typedef struct { const char *name; void (*func)(char *args); } test_cmd; static test_cmd cmds[] = { { "#", c_noop }, { "key", c_key }, { "noop", c_noop }, { "quit", c_quit }, { "verbose", c_verbose }, { "version?", c_version }, { "player-birth", c_player_birth }, { "player-class?", c_player_class }, { "player-race?", c_player_race }, { "player-sex?", c_player_sex }, { NULL, NULL } }; static errr test_docmd(void) { char buf[1024]; char *cmd; char *rest; int i; memset(buf, 0, sizeof(buf)); if (prompt) { printf("test> "); fflush(stdout); } if (!fgets(buf, sizeof(buf), stdin)) { return -1; } if (strchr(buf, '\n')) { *strchr(buf, '\n') = '\0'; } if (verbose) printf("test-docmd: %s\n", buf); cmd = strtok(buf, " "); if (!cmd) return 0; rest = strtok(NULL, ""); for (i = 0; cmds[i].name; i++) { if (!strcmp(cmds[i].name, cmd)) { cmds[i].func(rest); return 0; } } return 0; } typedef struct term_data term_data; struct term_data { term t; }; static term_data td; typedef struct { int key; errr (*func)(int v); } term_xtra_func; static void term_init_test(term *t) { if (verbose) printf("term-init %s %s\n", VERSION_NAME, VERSION_STRING); } static void term_nuke_test(term *t) { if (verbose) printf("term-end\n"); } static errr term_xtra_clear(int v) { if (verbose) printf("term-xtra-clear %d\n", v); return 0; } static errr term_xtra_noise(int v) { if (verbose) printf("term-xtra-noise %d\n", v); return 0; } static errr term_xtra_fresh(int v) { if (verbose) printf("term-xtra-fresh %d\n", v); return 0; } static errr term_xtra_shape(int v) { if (verbose) printf("term-xtra-shape %d\n", v); return 0; } static errr term_xtra_alive(int v) { if (verbose) printf("term-xtra-alive %d\n", v); return 0; } static errr term_xtra_event(int v) { if (verbose) printf("term-xtra-event %d\n", v); if (nextkey) { Term_keypress(nextkey, 0); nextkey = 0; } return test_docmd(); } static errr term_xtra_flush(int v) { if (verbose) printf("term-xtra-flush %d\n", v); return 0; } static errr term_xtra_delay(int v) { if (verbose) printf("term-xtra-delay %d\n", v); return 0; } static errr term_xtra_react(int v) { if (verbose) printf("term-xtra-react\n"); return 0; } static term_xtra_func xtras[] = { { TERM_XTRA_CLEAR, term_xtra_clear }, { TERM_XTRA_NOISE, term_xtra_noise }, { TERM_XTRA_FRESH, term_xtra_fresh }, { TERM_XTRA_SHAPE, term_xtra_shape }, { TERM_XTRA_ALIVE, term_xtra_alive }, { TERM_XTRA_EVENT, term_xtra_event }, { TERM_XTRA_FLUSH, term_xtra_flush }, { TERM_XTRA_DELAY, term_xtra_delay }, { TERM_XTRA_REACT, term_xtra_react }, { 0, NULL }, }; static errr term_xtra_test(int n, int v) { int i; for (i = 0; xtras[i].func; i++) { if (xtras[i].key == n) { return xtras[i].func(v); } } if (verbose) printf("term-xtra-unknown %d %d\n", n, v); return 0; } static errr term_curs_test(int x, int y) { if (verbose) printf("term-curs %d %d\n", x, y); return 0; } static errr term_wipe_test(int x, int y, int n) { if (verbose) printf("term-wipe %d %d %d\n", x, y, n); return 0; } static errr term_text_test(int x, int y, int n, int a, const wchar_t *s) { if (verbose) { char str[256]; wcstombs(str, s, 256); printf("term-text %d %d %d %02x %s\n", x, y, n, a, str); } return 0; } static void term_data_link(int i) { term *t = &td.t; term_init(t, 80, 24, 256); t->init_hook = term_init_test; t->nuke_hook = term_nuke_test; t->xtra_hook = term_xtra_test; t->curs_hook = term_curs_test; t->wipe_hook = term_wipe_test; t->text_hook = term_text_test; t->data = &td; Term_activate(t); angband_term[i] = t; } const char help_test[] = "Test mode, subopts -p(rompt)"; errr init_test(int argc, char *argv[]) { int i; /* Skip over argv[0] */ for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-p")) { prompt = 1; continue; } printf("init-test: bad argument '%s'\n", argv[i]); } term_data_link(0); return 0; } #endif angband-3.5.1/src/z-term.h0000644000175000017500000002550212456456607014623 0ustar chriscchrisc/* File: z-term.h */ /* * Copyright (c) 1997 Ben Harrison * * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. */ #ifndef INCLUDED_Z_TERM_H #define INCLUDED_Z_TERM_H #include "h-basic.h" #include "ui-event.h" /* * A term_win is a "window" for a Term * * - Cursor Useless/Visible codes * - Cursor Location (see "Useless") * * - Array[h] -- Access to the attribute array * - Array[h] -- Access to the character array * * - Array[h*w] -- Attribute array * - Array[h*w] -- Character array * * - next screen saved * - hook to be called on screen size change * * Note that the attr/char pair at (x,y) is a[y][x]/c[y][x] * and that the row of attr/chars at (0,y) is a[y]/c[y] */ typedef struct term_win term_win; struct term_win { bool cu, cv; int cx, cy; int **a; wchar_t **c; int *va; wchar_t *vc; int **ta; wchar_t **tc; int *vta; wchar_t *vtc; term_win *next; }; /* * An actual "term" structure * * - Extra "user" info (used by application) * * - Extra "data" info (used by implementation) * * * - Flag "user_flag" * An extra "user" flag (used by application) * * * - Flag "data_flag" * An extra "data" flag (used by implementation) * * * - Flag "active_flag" * This "term" is "active" * * - Flag "mapped_flag" * This "term" is "mapped" * * - Flag "total_erase" * This "term" should be fully erased * * - Flag "fixed_shape" * This "term" is not allowed to resize * * - Flag "icky_corner" * This "term" has an "icky" corner grid * * - Flag "soft_cursor" * This "term" uses a "software" cursor * * - Flag "always_pict" * Use the "Term_pict()" routine for all text * * - Flag "higher_pict" * Use the "Term_pict()" routine for special text * * - Flag "always_text" * Use the "Term_text()" routine for invisible text * * - Flag "unused_flag" * Reserved for future use * * - Flag "never_bored" * Never call the "TERM_XTRA_BORED" action * * - Flag "never_frosh" * Never call the "TERM_XTRA_FROSH" action * * * - Value "attr_blank" * Use this "attr" value for "blank" grids * * - Value "char_blank" * Use this "char" value for "blank" grids * * - Flag "complex_input" * Distinguish between Enter/^m/^j, Tab/^i, etc. * * - Ignore this pointer * * - Keypress Queue -- various data * * - Keypress Queue -- pending keys * * * - Window Width (max 255) * - Window Height (max 255) * * - Minimum modified row * - Maximum modified row * * - Minimum modified column (per row) * - Maximum modified column (per row) * * * - Displayed screen image * - Requested screen image * * - Temporary screen image * - Memorized screen image * * * - Hook for init-ing the term * - Hook for nuke-ing the term * * - Hook for extra actions * * - Hook for placing the cursor * * - Hook for drawing some blank spaces * * - Hook for drawing a string of chars using an attr * * - Hook for drawing a sequence of special attr/char pairs */ typedef struct term term; struct term { void *user; void *data; bool user_flag; bool data_flag; bool active_flag; bool mapped_flag; bool total_erase; bool fixed_shape; bool icky_corner; bool soft_cursor; bool always_pict; bool higher_pict; bool always_text; bool unused_flag; bool never_bored; bool never_frosh; int attr_blank; wchar_t char_blank; bool complex_input; ui_event *key_queue; u16b key_head; u16b key_tail; u16b key_xtra; u16b key_size; int wid; int hgt; int y1; int y2; int *x1; int *x2; /* Offsets used by the map subwindows */ int offset_x; int offset_y; term_win *old; term_win *scr; term_win *tmp; term_win *mem; /* Number of times saved */ byte saved; void (*init_hook)(term *t); void (*nuke_hook)(term *t); errr (*xtra_hook)(int n, int v); errr (*curs_hook)(int x, int y); errr (*bigcurs_hook)(int x, int y); errr (*wipe_hook)(int x, int y, int n); errr (*text_hook)(int x, int y, int n, int a, const wchar_t *s); errr (*pict_hook)(int x, int y, int n, const int *ap, const wchar_t *cp, const int *tap, const wchar_t *tcp); size_t (*mbcs_hook)(wchar_t *dest, const char *src, int n); void (*view_map_hook)(term *t); }; /**** Available Constants ****/ /* * Definitions for the "actions" of "Term_xtra()" * * These values may be used as the first parameter of "Term_xtra()", * with the second parameter depending on the "action" itself. Many * of the actions shown below are optional on at least one platform. * * The "TERM_XTRA_EVENT" action uses "v" to "wait" for an event * The "TERM_XTRA_SHAPE" action uses "v" to "show" the cursor * The "TERM_XTRA_FROSH" action uses "v" for the index of the row * The "TERM_XTRA_ALIVE" action uses "v" to "activate" (or "close") * The "TERM_XTRA_LEVEL" action uses "v" to "resume" (or "suspend") * The "TERM_XTRA_DELAY" action uses "v" as a "millisecond" value * * The other actions do not need a "v" code, so "zero" is used. */ #define TERM_XTRA_EVENT 1 /* Process some pending events */ #define TERM_XTRA_FLUSH 2 /* Flush all pending events */ #define TERM_XTRA_CLEAR 3 /* Clear the entire window */ #define TERM_XTRA_SHAPE 4 /* Set cursor shape (optional) */ #define TERM_XTRA_FROSH 5 /* Flush one row (optional) */ #define TERM_XTRA_FRESH 6 /* Flush all rows (optional) */ #define TERM_XTRA_NOISE 7 /* Make a noise (optional) */ #define TERM_XTRA_BORED 9 /* Handle stuff when bored (optional) */ #define TERM_XTRA_REACT 10 /* React to global changes (optional) */ #define TERM_XTRA_ALIVE 11 /* Change the "hard" level (optional) */ #define TERM_XTRA_LEVEL 12 /* Change the "soft" level (optional) */ #define TERM_XTRA_DELAY 13 /* Delay some milliseconds (optional) */ /*** Colors ***/ /* * Angband "attributes" (with symbols, and base (R,G,B) codes) * * The "(R,G,B)" codes are given in "fourths" of the "maximal" value, * and should "gamma corrected" on most (non-Macintosh) machines. */ #define TERM_DARK 0 /* d */ /* 0 0 0 */ #define TERM_WHITE 1 /* w */ /* 4 4 4 */ #define TERM_SLATE 2 /* s */ /* 2 2 2 */ #define TERM_ORANGE 3 /* o */ /* 4 2 0 */ #define TERM_RED 4 /* r */ /* 3 0 0 */ #define TERM_GREEN 5 /* g */ /* 0 2 1 */ #define TERM_BLUE 6 /* b */ /* 0 0 4 */ #define TERM_UMBER 7 /* u */ /* 2 1 0 */ #define TERM_L_DARK 8 /* D */ /* 1 1 1 */ #define TERM_L_WHITE 9 /* W */ /* 3 3 3 */ #define TERM_L_PURPLE 10 /* P */ /* ? ? ? */ #define TERM_YELLOW 11 /* y */ /* 4 4 0 */ #define TERM_L_RED 12 /* R */ /* 4 0 0 */ #define TERM_L_GREEN 13 /* G */ /* 0 4 0 */ #define TERM_L_BLUE 14 /* B */ /* 0 4 4 */ #define TERM_L_UMBER 15 /* U */ /* 3 2 1 */ #define TERM_PURPLE 16 /* p */ #define TERM_VIOLET 17 /* v */ #define TERM_TEAL 18 /* t */ #define TERM_MUD 19 /* m */ #define TERM_L_YELLOW 20 /* Y */ #define TERM_MAGENTA 21 /* i */ #define TERM_L_TEAL 22 /* T */ #define TERM_L_VIOLET 23 /* V */ #define TERM_L_PINK 24 /* I */ #define TERM_MUSTARD 25 /* M */ #define TERM_BLUE_SLATE 26 /* z */ #define TERM_DEEP_L_BLUE 27 /* Z */ #define TERM_SHADE 28 /* for shaded backgrounds */ /* The following allow color 'translations' to support environments with a limited color depth * as well as translate colours to alternates for e.g. menu highlighting. */ #define ATTR_FULL 0 /* full color translation */ #define ATTR_MONO 1 /* mono color translation */ #define ATTR_VGA 2 /* 16 color translation */ #define ATTR_BLIND 3 /* "Blind" color translation */ #define ATTR_LIGHT 4 /* "Torchlit" color translation */ #define ATTR_DARK 5 /* "Dark" color translation */ #define ATTR_HIGH 6 /* "Highlight" color translation */ #define ATTR_METAL 7 /* "Metallic" color translation */ #define ATTR_MISC 8 /* "Miscellaneous" color translation - see misc_to_attr */ #define MAX_ATTR 9 /* * Maximum number of colours, and number of "basic" Angband colours */ #define MAX_COLORS 256 #define BASIC_COLORS 29 #define BG_BLACK 0 /* The set number for the black-background glyphs */ #define BG_SAME 1 /* The set number for the same-background glyphs */ #define BG_DARK 2 /* The set number for the dark-background glyphs */ #define BG_MAX 3 /* The max number of backgrounds */ /* * A game color. */ typedef struct color_type color_type; struct color_type { char index_char; /* Character index: 'r' = red, etc. */ char name[32]; /* Color name */ byte color_translate[MAX_ATTR]; /* Index for various in-game translations */ }; extern byte angband_color_table[MAX_COLORS][4]; extern color_type color_table[MAX_COLORS]; /* sketchy key logging pt. 1 */ #define KEYLOG_SIZE 8 extern int log_i; extern int log_size; extern struct keypress keylog[KEYLOG_SIZE]; /**** Available Variables ****/ extern term *Term; extern byte tile_width; extern byte tile_height; extern bool bigcurs; extern bool smlcurs; /**** Available Functions ****/ extern errr Term_xtra(int n, int v); extern size_t Term_mbstowcs(wchar_t *dest, const char *src, int n); extern void Term_queue_char(term *t, int x, int y, int a, wchar_t c, int ta, wchar_t tc); extern void Term_big_queue_char(term *t, int x, int y, int a, wchar_t c, int a1, wchar_t c1); extern void Term_queue_chars(int x, int y, int n, int a, const wchar_t *s); extern errr Term_fresh(void); extern errr Term_set_cursor(bool v); extern errr Term_gotoxy(int x, int y); extern errr Term_draw(int x, int y, int a, wchar_t c); extern errr Term_addch(int a, wchar_t c); extern errr Term_addstr(int n, int a, const char *s); extern errr Term_putch(int x, int y, int a, wchar_t c); extern void Term_big_putch(int x, int y, int a, wchar_t c); extern errr Term_putstr(int x, int y, int n, int a, const char *s); extern errr Term_erase(int x, int y, int n); extern errr Term_clear(void); extern errr Term_redraw(void); extern errr Term_redraw_section(int x1, int y1, int x2, int y2); extern errr Term_mark(int x, int y); extern errr Term_get_cursor(bool *v); extern errr Term_get_size(int *w, int *h); extern errr Term_locate(int *x, int *y); extern errr Term_what(int x, int y, int *a, wchar_t *c); extern errr Term_flush(void); extern errr Term_mousepress(int x, int y, char button); extern errr Term_keypress(keycode_t k, byte mods); extern errr Term_key_push(int k); extern errr Term_event_push(const ui_event *ke); extern errr Term_inkey(ui_event *ch, bool wait, bool take); extern errr Term_save(void); extern errr Term_load(void); extern errr Term_resize(int w, int h); extern errr Term_activate(term *t); extern errr term_nuke(term *t); extern errr term_init(term *t, int w, int h, int k); extern bool panel_contains(unsigned int y, unsigned int x); #endif /* INCLUDED_Z_TERM_H */ angband-3.5.1/src/debug.h0000644000175000017500000000100712456456606014464 0ustar chriscchrisc#ifndef INCLUDED_DEBUG_H #define INCLUDED_DEBUG_H /** * Send the formatted string to whatever debug console or output is set up. * * The output will be treated logically as a single line, so do not include * newline characters in the format string. * * It is recommended you call debug() with "DHERE" at the beginning of your * format string, like so: * debug(DHERE "important info"); * * This gives you file and line number information. */ void debug(const char *fmt, ...); #endif /* INCLUDED_DEBUG_H */ angband-3.5.1/src/snd-sdl.c0000644000175000017500000001712612456456606014746 0ustar chriscchrisc/* * File: snd-sdl.c * Purpose: SDL sound support * * Copyright (c) 2004 Brendon Oliver * Copyright (c) 2007 Andi Sidwell * A large chunk of this file was taken and modified from main-ros. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #ifdef SOUND_SDL #include "SDL.h" #include "SDL_mixer.h" /* Don't cache audio */ static bool no_cache_audio = FALSE; /* Using mp3s */ static bool use_mp3 = FALSE; /* Arbitary limit on number of samples per event */ #define MAX_SAMPLES 16 /* Struct representing all data about an event sample */ typedef struct { int num; /* Number of samples for this event */ Mix_Chunk *wavs[MAX_SAMPLES]; /* Sample array */ Mix_Music *mp3s[MAX_SAMPLES]; /* Sample array */ char *paths[MAX_SAMPLES]; /* Relative pathnames for samples */ } sample_list; /* * Just need an array of SampInfos */ static sample_list samples[MSG_MAX]; /* * Shut down the sound system and free resources. */ static void close_audio(void) { size_t i; int j; /* Free all the sample data*/ for (i = 0; i < MSG_MAX; i++) { sample_list *smp = &samples[i]; /* Nuke all samples */ for (j = 0; j < smp->num; j++) { if (use_mp3) Mix_FreeMusic(smp->mp3s[j]); else Mix_FreeChunk(smp->wavs[j]); string_free(smp->paths[j]); } } /* Close the audio */ Mix_CloseAudio(); /* XXX This may conflict with the SDL port */ SDL_Quit(); } /* * Initialise SDL and open the mixer */ static bool open_audio(void) { int audio_rate; Uint16 audio_format; int audio_channels; /* Initialize variables */ audio_rate = 22050; audio_format = AUDIO_S16; audio_channels = 2; /* Initialize the SDL library */ if (SDL_Init(SDL_INIT_AUDIO) < 0) { plog_fmt("Couldn't initialize SDL: %s", SDL_GetError()); return FALSE; } /* Try to open the audio */ if (Mix_OpenAudio(audio_rate, audio_format, audio_channels, 4096) < 0) { plog_fmt("Couldn't open mixer: %s", SDL_GetError()); return FALSE; } /* Success */ return TRUE; } /* * Read sound.cfg and map events to sounds; then load all the sounds into * memory to avoid I/O latency later. */ static bool sound_sdl_init(bool no_cache) { char path[2048]; char buffer[2048]; ang_file *fff; /* Initialise the mixer */ if (!open_audio()) return FALSE; /* Build the "sound" path */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "sound"); if (ANGBAND_DIR_XTRA_SOUND) mem_free(ANGBAND_DIR_XTRA_SOUND); ANGBAND_DIR_XTRA_SOUND = string_make(path); /* Find and open the config file */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_SOUND, "sound.cfg"); fff = file_open(path, MODE_READ, -1); /* Handle errors */ if (!fff) { plog_fmt("Failed to open sound config (%s):\n %s", path, strerror(errno)); return FALSE; } /* Parse the file */ /* Lines are always of the form "name = sample [sample ...]" */ while (file_getl(fff, buffer, sizeof(buffer))) { char *msg_name; char *sample_list; char *search; char *cur_token; char *next_token; int event; /* Skip anything not beginning with an alphabetic character */ if (!buffer[0] || !isalpha((unsigned char)buffer[0])) continue; /* Split the line into two: message name, and the rest */ search = strchr(buffer, ' '); sample_list = strchr(search + 1, ' '); if (!search) continue; if (!sample_list) continue; /* Set the message name, and terminate at first space */ msg_name = buffer; search[0] = '\0'; /* Make sure this is a valid event name */ event = message_lookup_by_sound_name(msg_name); if (event < 0) continue; /* Advance the sample list pointer so it's at the beginning of text */ sample_list++; if (!sample_list[0]) continue; /* Terminate the current token */ cur_token = sample_list; search = strchr(cur_token, ' '); if (search) { search[0] = '\0'; next_token = search + 1; } else { next_token = NULL; } /* * Now we find all the sample names and add them one by one */ while (cur_token) { int num = samples[event].num; bool got_file_type = FALSE; /* Don't allow too many samples */ if (num >= MAX_SAMPLES) break; /* Build the path to the sample */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_SOUND, cur_token); if (!file_exists(path)) goto next_token; if (!got_file_type) { if (streq(path + strlen(path) - 3, "mp3")) { use_mp3 = TRUE; got_file_type = TRUE; } } /* Don't load now if we're not caching */ if (no_cache) { /* Just save the path for later */ samples[event].paths[num] = string_make(path); } else { /* Load the file now */ if (use_mp3) { samples[event].mp3s[num] = Mix_LoadMUS(path); if (!samples[event].mp3s[num]) { plog_fmt("%s: %s", SDL_GetError(), strerror(errno)); goto next_token; } } else { samples[event].wavs[num] = Mix_LoadWAV(path); if (!samples[event].wavs[num]) { plog_fmt("%s: %s", SDL_GetError(), strerror(errno)); goto next_token; } } } /* Imcrement the sample count */ samples[event].num++; next_token: /* Figure out next token */ cur_token = next_token; if (next_token) { /* Try to find a space */ search = strchr(cur_token, ' '); /* If we can find one, terminate, and set new "next" */ if (search) { search[0] = '\0'; next_token = search + 1; } else { /* Otherwise prevent infinite looping */ next_token = NULL; } } } } /* Close the file */ file_close(fff); /* Success */ return TRUE; } /* * Play a sound of type "event". */ static void play_sound(int event) { Mix_Chunk *wave = NULL; Mix_Music *mp3 = NULL; int s; /* Paranoia */ if (event < 0 || event >= MSG_MAX) return; /* Check there are samples for this event */ if (!samples[event].num) return; /* Choose a random event */ s = randint0(samples[event].num); if (use_mp3) mp3 = samples[event].mp3s[s]; else wave = samples[event].wavs[s]; /* Try loading it, if it's not cached */ if (!(wave || mp3)) { /* Verify it exists */ const char *filename = samples[event].paths[s]; if (!file_exists(filename)) return; /* Load */ if (use_mp3) mp3 = Mix_LoadMUS(filename); else wave = Mix_LoadWAV(filename); } /* Check to see if we have a sound again */ if (!(wave || mp3)) { plog("SDL sound load failed."); return; } /* Actually play the thing */ if (use_mp3) Mix_PlayMusic(mp3, 1); else Mix_PlayChannel(-1, wave, 0); } /* * Init the SDL sound "module". */ errr init_sound_sdl(int argc, char **argv) { int i; /* Parse args */ for (i = 1; i < argc; i++) { if (prefix(argv[i], "-c")) { no_cache_audio = TRUE; plog("Audio cache disabled."); continue; } } /* Load sound preferences if requested */ if (!sound_sdl_init(no_cache_audio)) { plog("Failed to load sound config"); /* Failure */ return (1); } /* Enable sound */ sound_hook = play_sound; atexit(close_audio); /* Success */ return (0); } #endif /* SOUND_SDL */ angband-3.5.1/src/target.h0000644000175000017500000000145712456456606014675 0ustar chriscchrisc/* target.h - target interface */ #ifndef TARGET_H #define TARGET_H /* * Bit flags for target_set() * * KILL: Target monsters * LOOK: Describe grid fully * XTRA: Currently unused flag (NOT USED) * GRID: Select from all grids (NOT USED) * QUIET: Prevent targeting messages. */ #define TARGET_KILL 0x01 #define TARGET_LOOK 0x02 #define TARGET_XTRA 0x04 #define TARGET_GRID 0x08 #define TARGET_QUIET 0x10 bool target_able(struct monster *m); bool target_okay(void); bool target_set_closest(int mode); bool target_set_monster(struct monster *m); void target_set_location(int y, int x); bool target_set_interactive(int mode, int x, int y); bool get_aim_dir(int *dp); void target_get(s16b *col, s16b *row); struct monster *target_get_monster(void); bool target_sighted(void); #endif /* !TARGET_H */ angband-3.5.1/src/keymap.h0000644000175000017500000000145612456456606014674 0ustar chriscchrisc#ifndef KEYMAP_H #define KEYMAP_H /** Maximum number of keypresses a trigger can map to. **/ #define KEYMAP_ACTION_MAX 20 /** Keymap modes. */ enum { KEYMAP_MODE_ORIG = 0, KEYMAP_MODE_ROGUE, KEYMAP_MODE_MAX }; /** Given a keymap mode and a keypress, return any attached action. */ const struct keypress *keymap_find(int keymap, struct keypress kc); /** Given a keymap mode, a trigger, and an action, store it in the keymap list. */ void keymap_add(int keymap, struct keypress trigger, struct keypress *actions, bool user); /** Given a keypress, remove any keymap that would trigger on that key. */ bool keymap_remove(int keymap, struct keypress trigger); /** Free all keymaps. */ void keymap_free(void); /** Save keymaps to the specified file. */ void keymap_dump(ang_file *fff); #endif /* KEYMAP_H */ angband-3.5.1/src/defines.h0000644000175000017500000002624712456456606015030 0ustar chriscchrisc#ifndef INCLUDED_DEFINES_H #define INCLUDED_DEFINES_H /* * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ /* * Do not edit this file unless you know *exactly* what you are doing. * * Some of the values in this file were chosen to preserve game balance, * while others are hard-coded based on the format of old save-files, the * definition of arrays in various places, mathematical properties, fast * computation, storage limits, or the format of external text files. * * Changing some of these values will induce crashes or memory errors or * savefile mis-reads. Most of the comments in this file are meant as * reminders, not complete descriptions, and even a complete knowledge * of the source may not be sufficient to fully understand the effects * of changing certain definitions. * * Lastly, note that the code does not always use the symbolic constants * below, and sometimes uses various hard-coded values that may not even * be defined in this file, but which may be related to definitions here. * This is of course bad programming practice, but nobody is perfect... * * You have been warned. */ /* * Number of grids in each block (vertically) * Probably hard-coded to 11, see "generate.c" */ #define BLOCK_HGT 11 /* * Number of grids in each block (horizontally) * Probably hard-coded to 11, see "generate.c" */ #define BLOCK_WID 11 /** * Number of grids in each panel (vertically) */ #define PANEL_HGT ((int)(BLOCK_HGT / tile_height)) /** * Number of grids in each panel (horizontally) */ #define PANEL_WID ((int)(BLOCK_WID / tile_width)) /** * Number of text rows in each map screen, regardless of tile size */ #define SCREEN_ROWS (Term->hgt - ROW_MAP - 1) /** * Number of grids in each screen (vertically) */ #define SCREEN_HGT ((int) (SCREEN_ROWS / tile_height)) /** * Number of grids in each screen (horizontally) */ #define SCREEN_WID ((int)((Term->wid - COL_MAP - 1) / tile_width)) #define ROW_MAP 1 #define COL_MAP 13 /* * Number of grids in each dungeon (vertically) * Must be a multiple of SCREEN_HGT * Must be less or equal to 256 */ #define DUNGEON_HGT 66 /* * Number of grids in each dungeon (horizontally) * Must be a multiple of SCREEN_WID * Must be less or equal to 256 */ #define DUNGEON_WID 198 #define TOWN_WID 66 #define TOWN_HGT 22 /* Maximum number of Angband windows */ #define ANGBAND_TERM_MAX 8 /* The fixed amount of energy a player should have at the start of a new level */ #define INITIAL_DUNGEON_ENERGY 100 /* * Maximum dungeon level. The player can never reach this level * in the dungeon, and this value is used for various calculations * involving object and monster creation. It must be at least 100. * Setting it below 128 may prevent the creation of some objects. */ #define MAX_DEPTH 128 /* * Misc constants */ #define TOWN_DAWN 10000 /* Number of turns from dawn to dawn */ #define TOWN_DUSK 5000 /* Number of turns from dawn to dusk */ #define BREAK_GLYPH 550 /* Rune of protection resistance */ #define BTH_PLUS_ADJ 3 /* Adjust BTH per plus-to-hit */ #define MON_MULT_ADJ 8 /* High value slows multiplication */ #define MON_DRAIN_LIFE 2 /* Percent of player exp drained per hit */ /* * More maximum values */ #define MAX_SIGHT_LGE 20 /* Maximum view distance */ #define MAX_RANGE_LGE 20 /* Maximum projection range */ #define MAX_SIGHT_SML 10 /* Maximum view distance (small devices) */ #define MAX_RANGE_SML 10 /* Maximum projection range (small devices) */ #define MAX_SIGHT (OPT(birth_small_range) ? MAX_SIGHT_SML : MAX_SIGHT_LGE) #define MAX_RANGE (OPT(birth_small_range) ? MAX_RANGE_SML : MAX_RANGE_LGE) /** Monster generation info **/ /* There is a 1/500 chance per round of creating a new monster */ #define MAX_M_ALLOC_CHANCE 500 /* Normal levels get at least 14 monsters */ #define MIN_M_ALLOC_LEVEL 14 /* The town starts out with 4 residents during the day */ #define MIN_M_ALLOC_TD 4 /* The town starts out with 8 residents during the night */ #define MIN_M_ALLOC_TN 8 /* * A monster can only "multiply" (reproduce) if there are fewer than 100 * monsters on the level capable of such spontaneous reproduction. This * is a hack which prevents the "mon_list[]" array from exploding due to * reproducing monsters. Messy, but necessary. */ #define MAX_REPRO 100 /** UI constants **/ /* * Special values for the number of turns to rest, these need to be * negative numbers, as postive numbers are taken to be a turncount, * and zero means "not resting". */ enum { REST_COMPLETE = -2, REST_ALL_POINTS = -1, REST_SOME_POINTS = -3 }; /** * Minimum number of turns required for regeneration to kick in during resting. */ #define REST_REQUIRED_FOR_REGEN 5 /*** General index values ***/ /*** Important artifact indexes (see "lib/edit/artifact.txt") ***/ #define ART_POWER 13 #define ART_MORGOTH 34 #define ART_GROND 111 #define ART_PALANTIR 7 /* * Hack -- first "normal" artifact in the artifact list. All of * the artifacts with indexes from 1 to 15 are "special" (lights, * rings, amulets), and the ones from 16 to 127 are "normal". */ #define ART_MIN_NORMAL 16 /*** Player flags ***/ /* * Bit flags for the "p_ptr->notice" variable */ #define PN_COMBINE 0x00000001L /* Combine the pack */ #define PN_REORDER 0x00000002L /* Reorder the pack */ #define PN_AUTOINSCRIBE 0x00000004L /* Autoinscribe items */ #define PN_PICKUP 0x00000008L /* Pick stuff up */ #define PN_SQUELCH 0x00000010L /* Squelch stuff */ #define PN_SORT_QUIVER 0x00000020L /* Sort the quiver */ #define PN_MON_MESSAGE 0x00000040L /* flush monster pain messages */ /* xxx (many) */ /* * Bit flags for the "p_ptr->update" variable */ #define PU_BONUS 0x00000001L /* Calculate bonuses */ #define PU_TORCH 0x00000002L /* Calculate torch radius */ /* xxx (many) */ #define PU_HP 0x00000010L /* Calculate chp and mhp */ #define PU_MANA 0x00000020L /* Calculate csp and msp */ #define PU_SPELLS 0x00000040L /* Calculate spells */ /* xxx (many) */ #define PU_FORGET_VIEW 0x00010000L /* Forget field of view */ #define PU_UPDATE_VIEW 0x00020000L /* Update field of view */ /* xxx (many) */ #define PU_FORGET_FLOW 0x00100000L /* Forget flow data */ #define PU_UPDATE_FLOW 0x00200000L /* Update flow data */ /* xxx (many) */ #define PU_MONSTERS 0x10000000L /* Update monsters */ #define PU_DISTANCE 0x20000000L /* Update distances */ /* xxx */ #define PU_PANEL 0x80000000L /* Update panel */ /* * Bit flags for the "p_ptr->redraw" variable */ #define PR_MISC 0x00000001L /* Display Race/Class */ #define PR_TITLE 0x00000002L /* Display Title */ #define PR_LEV 0x00000004L /* Display Level */ #define PR_EXP 0x00000008L /* Display Experience */ #define PR_STATS 0x00000010L /* Display Stats */ #define PR_ARMOR 0x00000020L /* Display Armor */ #define PR_HP 0x00000040L /* Display Hitpoints */ #define PR_MANA 0x00000080L /* Display Mana */ #define PR_GOLD 0x00000100L /* Display Gold */ #define PR_HEALTH 0x00000800L /* Display Health Bar */ #define PR_SPEED 0x00001000L /* Display Extra (Speed) */ #define PR_STUDY 0x00002000L /* Display Extra (Study) */ #define PR_DEPTH 0x00004000L /* Display Depth */ #define PR_STATUS 0x00008000L #define PR_DTRAP 0x00010000L /* Trap detection indicator */ #define PR_STATE 0x00020000L /* Display Extra (State) */ #define PR_MAP 0x00040000L /* Redraw whole map */ #define PR_INVEN 0x00080000L /* Display inven/equip */ #define PR_EQUIP 0x00100000L /* Display equip/inven */ #define PR_MESSAGE 0x00200000L /* Display messages */ #define PR_MONSTER 0x00400000L /* Display monster recall */ #define PR_OBJECT 0x00800000L /* Display object recall */ #define PR_MONLIST 0x01000000L /* Display monster list */ /* xxx */ #define PR_ITEMLIST 0x04000000L /* Display item list */ /* Display Basic Info */ #define PR_BASIC \ (PR_MISC | PR_TITLE | PR_STATS | PR_LEV |\ PR_EXP | PR_GOLD | PR_ARMOR | PR_HP |\ PR_MANA | PR_DEPTH | PR_HEALTH | PR_SPEED) /* Display Extra Info */ #define PR_EXTRA \ (PR_STATUS | PR_STATE | PR_STUDY) /* * Bit flags for the "p_ptr->window" variable. */ #define PW_INVEN 0x00000001L /* Display inven/equip */ #define PW_EQUIP 0x00000002L /* Display equip/inven */ #define PW_PLAYER_0 0x00000004L /* Display player (basic) */ #define PW_PLAYER_1 0x00000008L /* Display player (extra) */ #define PW_PLAYER_2 0x00000010L /* Display player (compact) */ #define PW_MAP 0x00000020L /* Display dungeon map */ #define PW_MESSAGE 0x00000040L /* Display messages */ #define PW_OVERHEAD 0x00000080L /* Display overhead view */ #define PW_MONSTER 0x00000100L /* Display monster recall */ #define PW_OBJECT 0x00000200L /* Display object recall */ #define PW_MONLIST 0x00000400L /* Display monster list */ #define PW_STATUS 0x00000800L /* Display status */ #define PW_ITEMLIST 0x00001000L /* Display item list */ /* xxx */ #define PW_BORG_1 0x00004000L /* Display borg messages */ #define PW_BORG_2 0x00008000L /* Display borg status */ #define PW_MAX_FLAGS 16 /*** Cave flags ***/ /* * Information for Feelings */ #define FEELING_TOTAL 100 /* total number of feeling squares per level */ #define FEELING1 10 /* Squares needed to see in order to trigger first feeling */ /* * Chest trap flags (see "object/chest.c") */ #define CHEST_LOSE_STR 0x01 #define CHEST_LOSE_CON 0x02 #define CHEST_POISON 0x04 #define CHEST_PARALYZE 0x08 #define CHEST_EXPLODE 0x10 #define CHEST_SUMMON 0x20 /*** Macro Definitions ***/ /* * Hack -- The main "screen" */ #define term_screen (angband_term[0]) /* * Convert a "location" (Y,X) into a "grid" (G) */ #define GRID(Y,X) \ (256 * (Y) + (X)) /* * Convert a "grid" (G) into a "location" (Y) */ #define GRID_Y(G) \ ((int)((G) / 256U)) /* * Convert a "grid" (G) into a "location" (X) */ #define GRID_X(G) \ ((int)((G) % 256U)) /* * Convert a "key event" into a "location" (Y) */ #define KEY_GRID_Y(K) \ ((int) (((K.mouse.y - ROW_MAP) / tile_height) + Term->offset_y)) /* * Convert a "key event" into a "location" (X) */ #define KEY_GRID_X(K) \ ((int) (((K.mouse.x - COL_MAP) / tile_width) + Term->offset_x)) /* * Determine if a "legal" grid is within "los" of the player * * Note the use of comparison to zero to force a "boolean" result */ #define player_has_los_bold(Y,X) \ ((cave->info[Y][X] & (CAVE_VIEW)) != 0) /* * Determine if a "legal" grid can be "seen" by the player * * Note the use of comparison to zero to force a "boolean" result */ #define player_can_see_bold(Y,X) \ ((cave->info[Y][X] & (CAVE_SEEN)) != 0) /* * Say whether it's daytime or not */ #define is_daytime() \ (((turn % (10L * TOWN_DAWN)) < ((10L * TOWN_DAWN) / 2)) ? FALSE : TRUE) #define SCAN_INSTANT ((u32b) -1) #define SCAN_OFF 0 #define SCAN_MACRO 45 #define MAX_ITEMLIST 2560 /** * Maximum number of rvals (monster templates) that a pit can specify. */ #define MAX_RVALS 4 #endif /* !INCLUDED_DEFINES_H */ angband-3.5.1/src/z-util.h0000644000175000017500000000547712456456607014642 0ustar chriscchrisc#ifndef INCLUDED_Z_UTIL_H #define INCLUDED_Z_UTIL_H #include "h-basic.h" /**** Available variables ****/ /** * The name of the program. */ extern char *argv0; /* Aux functions */ extern void (*plog_aux)(const char *); extern void (*quit_aux)(const char *); /**** Available Functions ****/ /** * Count the number of characters in a UTF-8 encoded string */ size_t utf8_strlen(char *s); /** * Clip a null-terminated UTF-8 string 's' to 'n' unicode characters. * e.g. utf8_clipto("example", 4) will clip after 'm', resulting in 'exam'. */ void utf8_clipto(char *s, size_t n); /** * Case insensitive comparison between two strings */ extern int my_stricmp(const char *s1, const char *s2); /** * Case insensitive comparison between two strings, up to n characters long. */ extern int my_strnicmp(const char *a, const char *b, int n); /** * Case-insensitive strstr */ extern char *my_stristr(const char *string, const char *pattern); /** * Copy up to 'bufsize'-1 characters from 'src' to 'buf' and NULL-terminate * the result. The 'buf' and 'src' strings may not overlap. * * Returns: strlen(src). This makes checking for truncation * easy. Example: * if (my_strcpy(buf, src, sizeof(buf)) >= sizeof(buf)) ...; * * This function should be equivalent to the strlcpy() function in BSD. */ extern size_t my_strcpy(char *buf, const char *src, size_t bufsize); /** * Try to append a string to an existing NULL-terminated string, never writing * more characters into the buffer than indicated by 'bufsize', and * NULL-terminating the buffer. The 'buf' and 'src' strings may not overlap. * * my_strcat() returns strlen(buf) + strlen(src). This makes checking for * truncation easy. Example: * if (my_strcat(buf, src, sizeof(buf)) >= sizeof(buf)) ...; * * This function should be equivalent to the strlcat() function in BSD. */ extern size_t my_strcat(char *buf, const char *src, size_t bufsize); /* Capitalise string 'buf' */ void my_strcap(char *buf); /* Test equality, prefix, suffix */ extern bool streq(const char *s, const char *t); extern bool prefix(const char *s, const char *t); extern bool prefix_i(const char *s, const char *t); extern bool suffix(const char *s, const char *t); #define streq(s, t) (!strcmp(s, t)) /* skip occurrences of a characters */ extern void strskip(char *s, const char c); extern void strescape(char *s, const char c); /* determines if a string is "empty" */ bool contains_only_spaces(const char* s); /* Print an error message */ extern void plog(const char *str); /* Exit, with optional message */ extern void quit(const char *str); /* Sorting functions */ extern void sort(void *array, size_t nmemb, size_t smemb, int (*comp)(const void *a, const void *b)); /* Mathematical functions */ int mean(int *nums, int size); int variance(int *nums, int size); #endif /* INCLUDED_Z_UTIL_H */ angband-3.5.1/src/z-virt.h0000644000175000017500000000336012456456607014636 0ustar chriscchrisc/* File: z-virt.h */ /* * Copyright (c) 1997 Ben Harrison * * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. */ #ifndef INCLUDED_Z_VIRT_H #define INCLUDED_Z_VIRT_H #include "h-basic.h" /* Wipe an array of type T[N], at location P, and return P */ #define C_WIPE(P, N, T) \ (memset((P), 0, (N) * sizeof(T))) /* Wipe a thing of type T, at location P, and return P */ #define WIPE(P, T) \ (memset((P), 0, sizeof(T))) /* Load an array of type T[N], at location P1, from another, at location P2 */ #define C_COPY(P1, P2, N, T) \ (memcpy((P1), (P2), (N) * sizeof(T))) /* Load a thing of type T, at location P1, from another, at location P2 */ #define COPY(P1, P2, T) \ (memcpy((P1), (P2), sizeof(T))) /* Allocate, and return, an array of type T[N] */ #define C_RNEW(N, T) \ (T*)(mem_alloc((N) * sizeof(T))) /* Allocate, and return, a thing of type T */ #define RNEW(T) \ (T*)(mem_alloc(sizeof(T))) /* Allocate, wipe, and return an array of type T[N] */ #define C_ZNEW(N, T) \ (T*)(C_WIPE(C_RNEW(N, T), N, T)) /* Allocate, wipe, and return a thing of type T */ #define ZNEW(T) \ (T*)(WIPE(RNEW(T), T)) /* Free one thing at P, return NULL */ #define FREE(P) (mem_free(P), P = NULL) /* Replacements for malloc() and friends that die on failure. */ void *mem_alloc(size_t len); void *mem_zalloc(size_t len); void mem_free(void *p); void *mem_realloc(void *p, size_t len); char *string_make(const char *str); void string_free(char *str); char *string_append(char *s1, const char *s2); enum { MEM_POISON_ALLOC = 0x00000001, MEM_POISON_FREE = 0x00000002 }; extern unsigned int mem_flags; #endif /* INCLUDED_Z_VIRT_H */ angband-3.5.1/src/ui-event.h0000644000175000017500000001226412456456606015141 0ustar chriscchrisc#ifndef INCLUDED_UI_EVENT_H #define INCLUDED_UI_EVENT_H /** * The various UI events that can occur. */ typedef enum { EVT_NONE = 0x0000, /* Basic events */ EVT_KBRD = 0x0001, /* Keypress */ EVT_MOUSE = 0x0002, /* Mousepress */ EVT_RESIZE = 0x0004, /* Display resize */ EVT_BUTTON = 0x0008, /* Button press */ /* 'Abstract' events */ EVT_ESCAPE = 0x0010, /* Get out of this menu */ EVT_MOVE = 0x0020, /* Menu movement */ EVT_SELECT = 0x0040 /* Menu selection */ } ui_event_type; /** * Key modifiers. */ #define KC_MOD_CONTROL 0x01 #define KC_MOD_SHIFT 0x02 #define KC_MOD_ALT 0x04 #define KC_MOD_META 0x08 #define KC_MOD_KEYPAD 0x10 /** * The game assumes that in certain cases, the effect of a modifer key will * be encoded in the keycode itself (e.g. 'A' is shift-'a'). In these cases * (specified below), a keypress' 'mods' value should not encode them also. * * If the character has come from the keypad: * Include all mods * Else if the character is in the range 0x01-0x1F, and the keypress was * from a key that without modifiers would be in the range 0x40-0x5F: * CONTROL is encoded in the keycode, and should not be in mods * Else if the character is in the range 0x21-0x2F, 0x3A-0x60 or 0x7B-0x7E: * SHIFT is often used to produce these should not be encoded in mods * * (All ranges are inclusive.) * * You can use these macros for part of the above conditions. */ #define MODS_INCLUDE_CONTROL(v) \ (((v) >= 0x01 && (v) <= 0x1F) ? FALSE : TRUE) #define MODS_INCLUDE_SHIFT(v) \ ((((v) >= 0x21 && (v) <= 0x2F) || \ ((v) >= 0x3A && (v) <= 0x60) || \ ((v) >= 0x7B && (v) <= 0x7E)) ? FALSE : TRUE) /** * If keycode you're trying to apply control to is between 0x40-0x5F * inclusive, then you should take 0x40 from the keycode and leave * KC_MOD_CONTROL unset. Otherwise, leave the keycode alone and set * KC_MOD_CONTROL in mods. * * This macro returns TRUE in the former case and FALSE in the latter. */ #define ENCODE_KTRL(v) \ (((v) >= 0x40 && (v) <= 0x5F) ? TRUE : FALSE) /** * Given a character X, turn it into a control character. */ #define KTRL(X) \ ((X) & 0x1F) /** * Given a control character X, turn it into its uppercase ASCII equivalent. */ #define UN_KTRL(X) \ ((X) + 64) /** * Keyset mappings for various keys. */ #define ARROW_DOWN 0x80 #define ARROW_LEFT 0x81 #define ARROW_RIGHT 0x82 #define ARROW_UP 0x83 #define KC_F1 0x84 #define KC_F2 0x85 #define KC_F3 0x86 #define KC_F4 0x87 #define KC_F5 0x88 #define KC_F6 0x89 #define KC_F7 0x8A #define KC_F8 0x8B #define KC_F9 0x8C #define KC_F10 0x8D #define KC_F11 0x8E #define KC_F12 0x8F #define KC_F13 0x90 #define KC_F14 0x91 #define KC_F15 0x92 #define KC_HELP 0x93 #define KC_HOME 0x94 #define KC_PGUP 0x95 #define KC_END 0x96 #define KC_PGDOWN 0x97 #define KC_INSERT 0x98 #define KC_PAUSE 0x99 #define KC_BREAK 0x9a #define KC_BEGIN 0x9b #define KC_ENTER 0x9c /* ASCII \r */ #define KC_TAB 0x9d /* ASCII \t */ #define KC_DELETE 0x9e #define KC_BACKSPACE 0x9f /* ASCII \h */ #define ESCAPE 0xE000 /* we have up until 0x9F before we start edging into displayable Unicode */ /* then we could move into private use area 1, 0xE000 onwards */ /* Analogous to isdigit() etc in ctypes */ #define isarrow(c) ((c >= ARROW_DOWN) && (c <= ARROW_UP)) /** * Type capable of holding any input key we might want to use. */ typedef u32b keycode_t; /** * Struct holding all relevant info for keypresses. */ struct keypress { ui_event_type type; keycode_t code; byte mods; }; /** * Struct holding all relevant info for mouse clicks. */ struct mouseclick { ui_event_type type; byte x; byte y; byte button; byte mods; }; /** * Union type to hold information about any given event. */ typedef union { ui_event_type type; struct mouseclick mouse; struct keypress key; } ui_event; /** Easy way to initialise a ui_event without seeing the gory bits. */ #define EVENT_EMPTY { 0 } /*** Functions ***/ /** Given a string (and that string's length), return the corresponding keycode */ keycode_t keycode_find_code(const char *str, size_t len); /** Given a keycode, return its description */ const char *keycode_find_desc(keycode_t kc); /** Convert a string of keypresses into their textual representation */ void keypress_to_text(char *buf, size_t len, const struct keypress *src, bool expand_backslash); /** Convert a textual representation of keypresses into actual keypresses */ void keypress_from_text(struct keypress *buf, size_t len, const char *str); /** Convert a keypress into something the user can read (not designed to be used internally */ void keypress_to_readable(char *buf, size_t len, struct keypress src); /* Screen loading/saving */ extern void screen_save(void); extern void screen_load(void); /* Placing text on screen */ extern void c_put_str(byte attr, const char *str, int row, int col); extern void put_str(const char *str, int row, int col); extern void c_prt(byte attr, const char *str, int row, int col); extern void prt(const char *str, int row, int col); #endif /* INCLUDED_UI_EVENT_H */ angband-3.5.1/src/z-queue.c0000644000175000017500000000263612456456607014776 0ustar chriscchrisc/* * File: z-queue.c * Purpose: Simple circular integer queue. * * Copyright (c) 2011 Erik Osheim * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include #include "z-queue.h" struct queue *q_new(size_t size) { struct queue *q = (struct queue*)malloc(sizeof(struct queue)); q->data = (uintptr_t*)malloc(sizeof(uintptr_t) * (size + 1)); q->size = size + 1; q->head = 0; q->tail = 0; return q; } int q_len(struct queue *q) { int len; if (q->tail >= q->head) { len = q->tail - q->head; } else { len = q->size - q->head + q->tail; } return len; } void q_push(struct queue *q, uintptr_t item) { q->data[q->tail] = item; q->tail = (q->tail + 1) % q->size; if (q->tail == q->head) abort(); } uintptr_t q_pop(struct queue *q) { uintptr_t item = q->data[q->head]; if (q->head == q->tail) abort(); q->head = (q->head + 1) % q->size; return item; } void q_free(struct queue *q) { free(q->data); free(q); } angband-3.5.1/src/effects.c0000644000175000017500000013251312456456606015017 0ustar chriscchrisc/* * File: effects.c * Purpose: Big switch statement for every effect in the game * * Copyright (c) 2007 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "effects.h" #include "dungeon.h" #include "monster/mon-spell.h" #include "monster/mon-util.h" #include "trap.h" #include "spells.h" /* * Entries for spell/activation descriptions */ typedef struct { u16b index; /* Effect index */ bool aim; /* Whether the effect requires aiming */ u16b power; /* Power rating for obj-power.c */ const char *desc; /* Effect description */ } info_entry; /* * Useful things about effects. */ static const info_entry effects[] = { #define EFFECT(x, y, r, z) { EF_##x, y, r, z }, #include "list-effects.h" #undef EFFECT }; /* * Utility functions */ bool effect_aim(effect_type effect) { if (effect < 1 || effect > EF_MAX) return FALSE; return effects[effect].aim; } int effect_power(effect_type effect) { if (effect < 1 || effect > EF_MAX) return FALSE; return effects[effect].power; } const char *effect_desc(effect_type effect) { if (effect < 1 || effect > EF_MAX) return FALSE; return effects[effect].desc; } bool effect_obvious(effect_type effect) { if (effect == EF_IDENTIFY) return TRUE; return FALSE; } /* * The "wonder" effect. * * Returns TRUE if the effect is evident. */ bool effect_wonder(int dir, int die, int beam) { /* This spell should become more useful (more controlled) as the player gains experience levels. Thus, add 1/5 of the player's level to the die roll. This eliminates the worst effects later on, while keeping the results quite random. It also allows some potent effects only at high level. */ bool visible = FALSE; int py = p_ptr->py; int px = p_ptr->px; int plev = p_ptr->lev; if (die > 100) { /* above 100 the effect is always visible */ msg("You feel a surge of power!"); visible = TRUE; } if (die < 8) visible = clone_monster(dir); else if (die < 14) visible = speed_monster(dir); else if (die < 26) visible = heal_monster(dir); else if (die < 31) visible = poly_monster(dir); else if (die < 36) visible = fire_bolt_or_beam(beam - 10, GF_MISSILE, dir, damroll(3 + ((plev - 1) / 5), 4)); else if (die < 41) visible = confuse_monster(dir, plev, FALSE); else if (die < 46) visible = fire_ball(GF_POIS, dir, 20 + (plev / 2), 3); else if (die < 51) visible = light_line(dir); else if (die < 56) visible = fire_beam(GF_ELEC, dir, damroll(3+((plev-5)/6), 6)); else if (die < 61) visible = fire_bolt_or_beam(beam-10, GF_COLD, dir, damroll(5+((plev-5)/4), 8)); else if (die < 66) visible = fire_bolt_or_beam(beam, GF_ACID, dir, damroll(6+((plev-5)/4), 8)); else if (die < 71) visible = fire_bolt_or_beam(beam, GF_FIRE, dir, damroll(8+((plev-5)/4), 8)); else if (die < 76) visible = drain_life(dir, 75); else if (die < 81) visible = fire_ball(GF_ELEC, dir, 30 + plev / 2, 2); else if (die < 86) visible = fire_ball(GF_ACID, dir, 40 + plev, 2); else if (die < 91) visible = fire_ball(GF_ICE, dir, 70 + plev, 3); else if (die < 96) visible = fire_ball(GF_FIRE, dir, 80 + plev, 3); /* above 100 'visible' is already true */ else if (die < 101) drain_life(dir, 100 + plev); else if (die < 104) earthquake(py, px, 12); else if (die < 106) destroy_area(py, px, 15, TRUE); else if (die < 108) banishment(); else if (die < 110) dispel_monsters(120); else /* RARE */ { dispel_monsters(150); slow_monsters(); sleep_monsters(TRUE); hp_player(300); } return visible; } /* * Do an effect, given an object. * Boost is the extent to which skill surpasses difficulty, used as % boost. It * ranges from 0 to 138. */ bool effect_do(effect_type effect, bool *ident, bool aware, int dir, int beam, int boost) { int py = p_ptr->py; int px = p_ptr->px; int dam, chance, dur; if (effect < 1 || effect > EF_MAX) { msg("Bad effect passed to do_effect(). Please report this bug."); return FALSE; } switch (effect) { case EF_POISON: { player_inc_timed(p_ptr, TMD_POISONED, damroll(2, 7) + 10, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_BLIND: { player_inc_timed(p_ptr, TMD_BLIND, damroll(4, 25) + 75, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_SCARE: { player_inc_timed(p_ptr, TMD_AFRAID, randint0(10) + 10, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_CONFUSE: { player_inc_timed(p_ptr, TMD_CONFUSED, damroll(4, 5) + 10, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_HALLUC: { player_inc_timed(p_ptr, TMD_IMAGE, randint0(250) + 250, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_PARALYZE: { player_inc_timed(p_ptr, TMD_PARALYZED, randint0(5) + 5, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_SLOW: { if (player_inc_timed(p_ptr, TMD_SLOW, randint1(25) + 15, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_POISON: { if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_BLINDNESS: { if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_PARANOIA: { if (player_clear_timed(p_ptr, TMD_AFRAID, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_CONFUSION: { if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_MIND: { if (player_restore_mana(p_ptr, 10)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AFRAID, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_IMAGE, TRUE)) *ident = TRUE; if (!of_has(p_ptr->state.flags, OF_RES_CONFU) && player_inc_timed(p_ptr, TMD_OPP_CONF, 12 + damroll(6, 10), TRUE, TRUE)) *ident = TRUE; if (*ident) msg("You feel your head clear."); return TRUE; } case EF_CURE_BODY: { if (hp_player(30)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_LIGHT: { if (hp_player(20)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_dec_timed(p_ptr, TMD_CUT, 20, TRUE)) *ident = TRUE; if (player_dec_timed(p_ptr, TMD_CONFUSED, 20, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_SERIOUS: { if (hp_player(40)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_CRITICAL: { if (hp_player(60)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AMNESIA, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_FULL: { int amt = (p_ptr->mhp * 35) / 100; if (amt < 300) amt = 300; if (hp_player(amt)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AMNESIA, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_FULL2: { if (hp_player(1200)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AMNESIA, TRUE)) *ident = TRUE; return TRUE; } case EF_CURE_TEMP: { if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_HEAL1: { if (hp_player(500)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_HEAL2: { if (hp_player(1000)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_HEAL3: { if (hp_player(500)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; return TRUE; } case EF_GAIN_EXP: { if (p_ptr->exp < PY_MAX_EXP) { msg("You feel more experienced."); player_exp_gain(p_ptr, 100000L); *ident = TRUE; } return TRUE; } case EF_LOSE_EXP: { if (!check_state(p_ptr, OF_HOLD_LIFE, p_ptr->state.flags) && (p_ptr->exp > 0)) { msg("You feel your memories fade."); player_exp_lose(p_ptr, p_ptr->exp / 4, FALSE); *ident = TRUE; } *ident = TRUE; wieldeds_notice_flag(p_ptr, OF_HOLD_LIFE); return TRUE; } case EF_RESTORE_EXP: { if (restore_level()) *ident = TRUE; return TRUE; } case EF_RESTORE_MANA: { if (p_ptr->csp < p_ptr->msp) { p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; msg("You feel your head clear."); p_ptr->redraw |= (PR_MANA); *ident = TRUE; } return TRUE; } case EF_GAIN_STR: case EF_GAIN_INT: case EF_GAIN_WIS: case EF_GAIN_DEX: case EF_GAIN_CON: { int stat = effect - EF_GAIN_STR; if (do_inc_stat(stat)) *ident = TRUE; return TRUE; } case EF_GAIN_ALL: { if (do_inc_stat(A_STR)) *ident = TRUE; if (do_inc_stat(A_INT)) *ident = TRUE; if (do_inc_stat(A_WIS)) *ident = TRUE; if (do_inc_stat(A_DEX)) *ident = TRUE; if (do_inc_stat(A_CON)) *ident = TRUE; return TRUE; } case EF_BRAWN: { /* Pick a random stat to decrease other than strength */ int stat = randint0(A_MAX-1) + 1; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_STR); *ident = TRUE; } return TRUE; } case EF_INTELLECT: { /* Pick a random stat to decrease other than intelligence */ int stat = randint0(A_MAX-1); if (stat >= A_INT) stat++; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_INT); *ident = TRUE; } return TRUE; } case EF_CONTEMPLATION: { /* Pick a random stat to decrease other than wisdom */ int stat = randint0(A_MAX-1); if (stat >= A_WIS) stat++; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_WIS); *ident = TRUE; } return TRUE; } case EF_TOUGHNESS: { /* Pick a random stat to decrease other than constitution */ int stat = randint0(A_MAX-1); if (stat >= A_CON) stat++; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_CON); *ident = TRUE; } return TRUE; } case EF_NIMBLENESS: { /* Pick a random stat to decrease other than dexterity */ int stat = randint0(A_MAX-1); if (stat >= A_DEX) stat++; if (do_dec_stat(stat, TRUE)) { do_inc_stat(A_DEX); *ident = TRUE; } return TRUE; } case EF_LOSE_STR: case EF_LOSE_INT: case EF_LOSE_WIS: case EF_LOSE_DEX: case EF_LOSE_CON: { int stat = effect - EF_LOSE_STR; take_hit(p_ptr, damroll(5, 5), "stat drain"); (void)do_dec_stat(stat, FALSE); *ident = TRUE; return TRUE; } case EF_LOSE_CON2: { take_hit(p_ptr, damroll(10, 10), "poisonous food"); (void)do_dec_stat(A_CON, FALSE); *ident = TRUE; return TRUE; } case EF_RESTORE_STR: case EF_RESTORE_INT: case EF_RESTORE_WIS: case EF_RESTORE_DEX: case EF_RESTORE_CON: { int stat = effect - EF_RESTORE_STR; if (do_res_stat(stat)) *ident = TRUE; return TRUE; } case EF_CURE_NONORLYBIG: { msg("You feel life flow through your body!"); restore_level(); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_clear_timed(p_ptr, TMD_BLIND, TRUE); (void)player_clear_timed(p_ptr, TMD_CONFUSED, TRUE); (void)player_clear_timed(p_ptr, TMD_IMAGE, TRUE); (void)player_clear_timed(p_ptr, TMD_STUN, TRUE); (void)player_clear_timed(p_ptr, TMD_CUT, TRUE); (void)player_clear_timed(p_ptr, TMD_AMNESIA, TRUE); if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_INT)) *ident = TRUE; if (do_res_stat(A_WIS)) *ident = TRUE; if (do_res_stat(A_DEX)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; /* Recalculate max. hitpoints */ update_stuff(p_ptr); hp_player(5000); *ident = TRUE; return TRUE; } case EF_RESTORE_ALL: { /* Life, above, also gives these effects */ if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_INT)) *ident = TRUE; if (do_res_stat(A_WIS)) *ident = TRUE; if (do_res_stat(A_DEX)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; return TRUE; } case EF_RESTORE_ST_LEV: { if (restore_level()) *ident = TRUE; if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_INT)) *ident = TRUE; if (do_res_stat(A_WIS)) *ident = TRUE; if (do_res_stat(A_DEX)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; return TRUE; } case EF_TMD_INFRA: { if (player_inc_timed(p_ptr, TMD_SINFRA, 100 + damroll(4, 25), TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_TMD_SINVIS: { if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_SINVIS, 12 + damroll(2, 6), TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_TMD_ESP: { if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_TELEPATHY, 24 + damroll(9, 9), TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_ENLIGHTENMENT: { msg("An image of your surroundings forms in your mind..."); wiz_light(TRUE); *ident = TRUE; return TRUE; } case EF_ENLIGHTENMENT2: { msg("You begin to feel more enlightened..."); message_flush(); wiz_light(TRUE); (void)do_inc_stat(A_INT); (void)do_inc_stat(A_WIS); (void)detect_traps(TRUE); (void)detect_doorstairs(TRUE); (void)detect_treasure(TRUE, TRUE); (void)detect_monsters_entire_level(); identify_pack(); *ident = TRUE; return TRUE; } case EF_HERO: { dur = randint1(25) + 25; if (hp_player(10)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AFRAID, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_BOLD, dur, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_HERO, dur, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_SHERO: { dur = randint1(25) + 25; if (hp_player(30)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AFRAID, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_BOLD, dur, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_SHERO, dur, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_ACID: { if (player_inc_timed(p_ptr, TMD_OPP_ACID, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_ELEC: { if (player_inc_timed(p_ptr, TMD_OPP_ELEC, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_FIRE: { if (player_inc_timed(p_ptr, TMD_OPP_FIRE, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_COLD: { if (player_inc_timed(p_ptr, TMD_OPP_COLD, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_POIS: { if (player_inc_timed(p_ptr, TMD_OPP_POIS, randint1(10) + 10, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RESIST_ALL: { if (player_inc_timed(p_ptr, TMD_OPP_ACID, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_OPP_ELEC, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_OPP_FIRE, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_OPP_COLD, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_OPP_POIS, randint1(20) + 20, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_DETECT_TREASURE: { if (detect_treasure(aware, FALSE)) *ident = TRUE; return TRUE; } case EF_DETECT_TRAP: { if (detect_traps(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_DOORSTAIR: { if (detect_doorstairs(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_INVIS: { if (detect_monsters_invis(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_EVIL: { if (detect_monsters_evil(aware)) *ident = TRUE; return TRUE; } case EF_DETECT_ALL: { if (detect_all(aware)) *ident = TRUE; return TRUE; } case EF_ENCHANT_TOHIT: { *ident = TRUE; return enchant_spell(1, 0, 0); } case EF_ENCHANT_TODAM: { *ident = TRUE; return enchant_spell(0, 1, 0); } case EF_ENCHANT_WEAPON: { *ident = TRUE; return enchant_spell(randint1(3), randint1(3), 0); } case EF_ENCHANT_ARMOR: { *ident = TRUE; return enchant_spell(0, 0, 1); } case EF_ENCHANT_ARMOR2: { *ident = TRUE; return enchant_spell(0, 0, randint1(3) + 2); } case EF_RESTORE_ITEM: { *ident = TRUE; return restore_item(); } case EF_IDENTIFY: { *ident = TRUE; if (!ident_spell()) return FALSE; return TRUE; } case EF_REMOVE_CURSE: { if (remove_curse()) { if (!p_ptr->timed[TMD_BLIND]) msg("The air around your body glows blue for a moment..."); else msg("You feel as if someone is watching over you."); *ident = TRUE; } return TRUE; } case EF_REMOVE_CURSE2: { remove_all_curse(); *ident = TRUE; return TRUE; } case EF_LIGHT: { if (light_area(damroll(2, 8), 2)) *ident = TRUE; return TRUE; } case EF_SUMMON_MON: { int i; sound(MSG_SUM_MONSTER); for (i = 0; i < randint1(3); i++) { if (summon_specific(py, px, p_ptr->depth, 0, 1)) *ident = TRUE; } return TRUE; } case EF_SUMMON_UNDEAD: { int i; sound(MSG_SUM_UNDEAD); for (i = 0; i < randint1(3); i++) { if (summon_specific(py, px, p_ptr->depth, S_UNDEAD, 1)) *ident = TRUE; } return TRUE; } case EF_TELE_PHASE: { teleport_player(10); *ident = TRUE; return TRUE; } case EF_TELE_LONG: { teleport_player(100); *ident = TRUE; return TRUE; } case EF_TELE_LEVEL: { (void)teleport_player_level(); *ident = TRUE; return TRUE; } case EF_CONFUSING: { if (p_ptr->confusing == 0) { msg("Your hands begin to glow."); p_ptr->confusing = TRUE; *ident = TRUE; } return TRUE; } case EF_MAPPING: { map_area(); *ident = TRUE; return TRUE; } case EF_RUNE: { warding_glyph(); *ident = TRUE; return TRUE; } case EF_ACQUIRE: { acquirement(py, px, p_ptr->depth, 1, TRUE); *ident = TRUE; return TRUE; } case EF_ACQUIRE2: { acquirement(py, px, p_ptr->depth, randint1(2) + 1, TRUE); *ident = TRUE; return TRUE; } case EF_ANNOY_MON: { msg("There is a high pitched humming noise."); aggravate_monsters(0); *ident = TRUE; return TRUE; } case EF_CREATE_TRAP: { /* Hack -- no traps in the town */ if (p_ptr->depth == 0) return TRUE; trap_creation(); msg("You hear a low-pitched whistling sound."); *ident = TRUE; return TRUE; } case EF_DESTROY_TDOORS: { if (destroy_doors_touch()) *ident = TRUE; return TRUE; } case EF_RECHARGE: { *ident = TRUE; if (!recharge(60)) return FALSE; return TRUE; } case EF_BANISHMENT: { *ident = TRUE; if (!banishment()) return FALSE; return TRUE; } case EF_DARKNESS: { if (!check_state(p_ptr, OF_RES_DARK, p_ptr->state.flags)) (void)player_inc_timed(p_ptr, TMD_BLIND, 3 + randint1(5), TRUE, TRUE); unlight_area(10, 3); wieldeds_notice_flag(p_ptr, OF_RES_DARK); *ident = TRUE; return TRUE; } case EF_PROTEVIL: { if (player_inc_timed(p_ptr, TMD_PROTEVIL, randint1(25) + 3 * p_ptr->lev, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_SATISFY: { if (player_set_food(p_ptr, PY_FOOD_MAX - 1)) *ident = TRUE; return TRUE; } case EF_CURSE_WEAPON: { if (curse_weapon()) *ident = TRUE; return TRUE; } case EF_CURSE_ARMOR: { if (curse_armor()) *ident = TRUE; return TRUE; } case EF_BLESSING: { if (player_inc_timed(p_ptr, TMD_BLESSED, randint1(12) + 6, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_BLESSING2: { if (player_inc_timed(p_ptr, TMD_BLESSED, randint1(24) + 12, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_BLESSING3: { if (player_inc_timed(p_ptr, TMD_BLESSED, randint1(48) + 24, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_RECALL: { *ident = TRUE; return set_recall(); } case EF_DEEP_DESCENT: { int i, target_depth = p_ptr->max_depth; /* Calculate target depth */ for (i = 5; i > 0; i--) { if (is_quest(target_depth)) break; if (target_depth >= MAX_DEPTH - 1) break; target_depth++; } if (target_depth > p_ptr->depth) { msgt(MSG_TPLEVEL, "The air around you starts to swirl..."); p_ptr->deep_descent = 3 + randint1(4); *ident = TRUE; return TRUE; } else { msgt(MSG_TPLEVEL, "You sense a malevolent presence blocking passage to the levels below."); *ident = TRUE; return FALSE; } } case EF_LOSHASTE: { if (speed_monsters()) *ident = TRUE; return TRUE; } case EF_LOSSLEEP: { if (sleep_monsters(aware)) *ident = TRUE; return TRUE; } case EF_LOSSLOW: { if (slow_monsters()) *ident = TRUE; return TRUE; } case EF_LOSCONF: { if (confuse_monsters(aware)) *ident = TRUE; return TRUE; } case EF_LOSKILL: { (void)mass_banishment(); *ident = TRUE; return TRUE; } case EF_EARTHQUAKES: { earthquake(py, px, 10); *ident = TRUE; return TRUE; } case EF_DESTRUCTION2: { destroy_area(py, px, 15, TRUE); *ident = TRUE; return TRUE; } case EF_ILLUMINATION: { if (light_area(damroll(2, 15), 3)) *ident = TRUE; return TRUE; } case EF_CLAIRVOYANCE: { *ident = TRUE; wiz_light(FALSE); (void)detect_traps(TRUE); (void)detect_doorstairs(TRUE); return TRUE; } case EF_PROBING: { *ident = probing(); return TRUE; } case EF_STONE_TO_MUD: { if (wall_to_mud(dir)) *ident = TRUE; return TRUE; } case EF_CONFUSE2: { *ident = TRUE; confuse_monster(dir, 20, aware); return TRUE; } case EF_BIZARRE: { *ident = TRUE; ring_of_power(dir); return TRUE; } case EF_STAR_BALL: { int i; *ident = TRUE; for (i = 0; i < 8; i++) fire_ball(GF_ELEC, ddd[i], (150 * (100 + boost) / 100), 3); return TRUE; } case EF_RAGE_BLESS_RESIST: { dur = randint1(50) + 50; *ident = TRUE; (void)hp_player(30); (void)player_clear_timed(p_ptr, TMD_AFRAID, TRUE); (void)player_inc_timed(p_ptr, TMD_BOLD, dur, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_SHERO, dur, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_BLESSED, randint1(50) + 50, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_ACID, randint1(50) + 50, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_ELEC, randint1(50) + 50, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_FIRE, randint1(50) + 50, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_COLD, randint1(50) + 50, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_OPP_POIS, randint1(50) + 50, TRUE, TRUE); return TRUE; } case EF_SLEEPII: { *ident = TRUE; sleep_monsters_touch(aware); return TRUE; } case EF_RESTORE_LIFE: { *ident = TRUE; restore_level(); return TRUE; } case EF_MISSILE: { *ident = TRUE; dam = damroll(3, 4) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_MISSILE, dir, dam); return TRUE; } case EF_DISPEL_EVIL: { *ident = TRUE; dam = p_ptr->lev * 5 * (100 + boost) / 100; dispel_evil(dam); return TRUE; } case EF_DISPEL_EVIL60: { dam = 60 * (100 + boost) / 100; if (dispel_evil(dam)) *ident = TRUE; return TRUE; } case EF_DISPEL_UNDEAD: { dam = 60 * (100 + boost) / 100; if (dispel_undead(dam)) *ident = TRUE; return TRUE; } case EF_DISPEL_ALL: { dam = 120 * (100 + boost) / 100; if (dispel_monsters(dam)) *ident = TRUE; return TRUE; } case EF_HASTE: { if (!p_ptr->timed[TMD_FAST]) { if (player_set_timed(p_ptr, TMD_FAST, damroll(2, 10) + 20, TRUE)) *ident = TRUE; } else { (void)player_inc_timed(p_ptr, TMD_FAST, 5, TRUE, TRUE); } return TRUE; } case EF_HASTE1: { if (!p_ptr->timed[TMD_FAST]) { if (player_set_timed(p_ptr, TMD_FAST, randint1(20) + 20, TRUE)) *ident = TRUE; } else { (void)player_inc_timed(p_ptr, TMD_FAST, 5, TRUE, TRUE); } return TRUE; } case EF_HASTE2: { if (!p_ptr->timed[TMD_FAST]) { if (player_set_timed(p_ptr, TMD_FAST, randint1(75) + 75, TRUE)) *ident = TRUE; } else { (void)player_inc_timed(p_ptr, TMD_FAST, 5, TRUE, TRUE); } return TRUE; } case EF_FIRE_BOLT: { *ident = TRUE; dam = damroll(9, 8) * (100 + boost) / 100; fire_bolt(GF_FIRE, dir, dam); return TRUE; } case EF_FIRE_BOLT2: { dam = damroll(12, 8) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_FIRE, dir, dam); *ident = TRUE; return TRUE; } case EF_FIRE_BOLT3: { dam = damroll(16, 8) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_FIRE, dir, dam); *ident = TRUE; return TRUE; } case EF_FIRE_BOLT72: { dam = 72 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_FIRE, dir, dam, 2); return TRUE; } case EF_FIRE_BALL: { dam = 144 * (100 + boost) / 100; fire_ball(GF_FIRE, dir, dam, 2); *ident = TRUE; return TRUE; } case EF_FIRE_BALL2: { dam = 120 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_FIRE, dir, dam, 3); return TRUE; } case EF_FIRE_BALL200: { dam = 200 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_FIRE, dir, dam, 3); return TRUE; } case EF_COLD_BOLT: { dam = damroll(6, 8) * (100 + boost) / 100; *ident = TRUE; fire_bolt_or_beam(beam, GF_COLD, dir, dam); return TRUE; } case EF_COLD_BOLT2: { dam = damroll(12, 8) * (100 + boost) / 100; *ident = TRUE; fire_bolt(GF_COLD, dir, dam); return TRUE; } case EF_COLD_BALL2: { dam = 200 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 3); return TRUE; } case EF_COLD_BALL50: { dam = 50 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 2); return TRUE; } case EF_COLD_BALL100: { dam = 100 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 2); return TRUE; } case EF_COLD_BALL160: { dam = 160 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 3); return TRUE; } case EF_ACID_BOLT: { dam = damroll(5, 8) * (100 + boost) / 100; *ident = TRUE; fire_bolt(GF_ACID, dir, dam); return TRUE; } case EF_ACID_BOLT2: { dam = damroll(10, 8) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_ACID, dir, dam); *ident = TRUE; return TRUE; } case EF_ACID_BOLT3: { dam = damroll(12, 8) * (100 + boost) / 100; fire_bolt_or_beam(beam, GF_ACID, dir, dam); *ident = TRUE; return TRUE; } case EF_ACID_BALL: { dam = 120 * (100 + boost) / 100; fire_ball(GF_ACID, dir, dam, 2); *ident = TRUE; return TRUE; } case EF_ELEC_BOLT: { dam = damroll(6, 6) * (100 + boost) / 100; *ident = TRUE; fire_beam(GF_ELEC, dir, dam); return TRUE; } case EF_ELEC_BALL: { dam = 64 * (100 + boost) / 100; fire_ball(GF_ELEC, dir, dam, 2); *ident = TRUE; return TRUE; } case EF_ELEC_BALL2: { dam = 250 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_ELEC, dir, dam, 3); return TRUE; } case EF_ARROW: { dam = 150 * (100 + boost) / 100; *ident = TRUE; fire_bolt(GF_ARROW, dir, dam); return TRUE; } case EF_REM_FEAR_POIS: { *ident = TRUE; (void)player_clear_timed(p_ptr, TMD_AFRAID, TRUE); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); return TRUE; } case EF_STINKING_CLOUD: { dam = 12 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_POIS, dir, dam, 3); return TRUE; } case EF_DRAIN_LIFE1: { dam = 90 * (100 + boost) / 100; if (drain_life(dir, dam)) *ident = TRUE; return TRUE; } case EF_DRAIN_LIFE2: { dam = 120 * (100 + boost) / 100; if (drain_life(dir, dam)) *ident = TRUE; return TRUE; } case EF_DRAIN_LIFE3: { dam = 150 * (100 + boost) / 100; if (drain_life(dir, dam)) *ident = TRUE; return TRUE; } case EF_DRAIN_LIFE4: { dam = 250 * (100 + boost) / 100; if (drain_life(dir, dam)) *ident = TRUE; return TRUE; } case EF_FIREBRAND: { *ident = TRUE; if (!brand_bolts()) return FALSE; return TRUE; } case EF_MANA_BOLT: { dam = damroll(12, 8) * (100 + boost) / 100; fire_bolt(GF_MANA, dir, dam); *ident = TRUE; return TRUE; } case EF_MON_HEAL: { if (heal_monster(dir)) *ident = TRUE; return TRUE; } case EF_MON_HASTE: { if (speed_monster(dir)) *ident = TRUE; return TRUE; } case EF_MON_SLOW: { if (slow_monster(dir)) *ident = TRUE; return TRUE; } case EF_MON_CONFUSE: { if (confuse_monster(dir, 10, aware)) *ident = TRUE; return TRUE; } case EF_MON_SLEEP: { if (sleep_monster(dir, aware)) *ident = TRUE; return TRUE; } case EF_MON_CLONE: { if (clone_monster(dir)) *ident = TRUE; return TRUE; } case EF_MON_SCARE: { if (fear_monster(dir, 10, aware)) *ident = TRUE; return TRUE; } case EF_LIGHT_LINE: { msg("A line of shimmering blue light appears."); light_line(dir); *ident = TRUE; return TRUE; } case EF_TELE_OTHER: { if (teleport_monster(dir)) *ident = TRUE; return TRUE; } case EF_DISARMING: { if (disarm_trap(dir)) *ident = TRUE; return TRUE; } case EF_TDOOR_DEST: { if (destroy_door(dir)) *ident = TRUE; return TRUE; } case EF_POLYMORPH: { if (poly_monster(dir)) *ident = TRUE; return TRUE; } case EF_STARLIGHT: { int i; if (!p_ptr->timed[TMD_BLIND]) msg("Light shoots in all directions!"); for (i = 0; i < 8; i++) light_line(ddd[i]); *ident = TRUE; return TRUE; } case EF_STARLIGHT2: { int k; for (k = 0; k < 8; k++) strong_light_line(ddd[k]); *ident = TRUE; return TRUE; } case EF_BERSERKER: { dur = randint1(50) + 50; if (player_inc_timed(p_ptr, TMD_BOLD, dur, TRUE, TRUE)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_SHERO, dur, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_WONDER: { if (effect_wonder(dir, randint1(100) + p_ptr->lev / 5, beam)) *ident = TRUE; return TRUE; } case EF_WAND_BREATH: { /* table of random ball effects and their damages */ const int breath_types[] = { GF_ACID, 200, GF_ELEC, 160, GF_FIRE, 200, GF_COLD, 160, GF_POIS, 120 }; /* pick a random (type, damage) tuple in the table */ int which = 2 * randint0(sizeof(breath_types) / (2 * sizeof(int))); fire_ball(breath_types[which], dir, breath_types[which + 1], 3); *ident = TRUE; return TRUE; } case EF_STAFF_MAGI: { if (do_res_stat(A_INT)) *ident = TRUE; if (p_ptr->csp < p_ptr->msp) { p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; *ident = TRUE; msg("You feel your head clear."); p_ptr->redraw |= (PR_MANA); } return TRUE; } case EF_STAFF_HOLY: { dam = 120 * (100 + boost) / 100; if (dispel_evil(dam)) *ident = TRUE; if (hp_player(50)) *ident = TRUE; if (player_inc_timed(p_ptr, TMD_PROTEVIL, randint1(25) + 3 * p_ptr->lev, TRUE, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_TERROR, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AFRAID, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_STUN, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CUT, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_SLOW, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_BLIND, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_CONFUSED, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_IMAGE, TRUE)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_AMNESIA, TRUE)) *ident = TRUE; return TRUE; } case EF_DRINK_BREATH: { const int breath_types[] = { GF_FIRE, 80, GF_COLD, 80, }; int which = 2 * randint0(N_ELEMENTS(breath_types) / 2); fire_ball(breath_types[which], dir, breath_types[which + 1], 2); *ident = TRUE; return TRUE; } case EF_DRINK_GOOD: { msg("You feel less thirsty."); *ident = TRUE; return TRUE; } case EF_DRINK_DEATH: { msg("A feeling of Death flows through your body."); take_hit(p_ptr, 5000, "a potion of Death"); *ident = TRUE; return TRUE; } case EF_DRINK_RUIN: { msg("Your nerves and muscles feel weak and lifeless!"); take_hit(p_ptr, damroll(10, 10), "a potion of Ruination"); player_stat_dec(p_ptr, A_DEX, TRUE); player_stat_dec(p_ptr, A_WIS, TRUE); player_stat_dec(p_ptr, A_CON, TRUE); player_stat_dec(p_ptr, A_STR, TRUE); player_stat_dec(p_ptr, A_INT, TRUE); *ident = TRUE; return TRUE; } case EF_DRINK_DETONATE: { msg("Massive explosions rupture your body!"); take_hit(p_ptr, damroll(50, 20), "a potion of Detonation"); (void)player_inc_timed(p_ptr, TMD_STUN, 75, TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_CUT, 5000, TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_DRINK_SALT: { msg("The potion makes you vomit!"); player_set_food(p_ptr, PY_FOOD_STARVE - 1); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)player_inc_timed(p_ptr, TMD_PARALYZED, 4, TRUE, FALSE); *ident = TRUE; return TRUE; } case EF_FOOD_GOOD: { msg("That tastes good."); *ident = TRUE; return TRUE; } case EF_FOOD_WAYBREAD: { msg("That tastes good."); (void)player_clear_timed(p_ptr, TMD_POISONED, TRUE); (void)hp_player(damroll(4, 8)); *ident = TRUE; return TRUE; } case EF_FOOD_CRUNCH: { if (one_in_(2)) msg("It's crunchy."); else msg("It nearly breaks your tooth!"); *ident = TRUE; return TRUE; } case EF_FOOD_WHISKY: { msg("That tastes great!"); (void)player_inc_timed(p_ptr, TMD_CONFUSED, randint0(5), TRUE, TRUE); *ident = TRUE; return TRUE; } case EF_FOOD_WINE: { msg("That tastes great! A fine vintage."); player_set_timed(p_ptr, TMD_BOLD, rand_spread(100, 20), TRUE); *ident = TRUE; return TRUE; } case EF_SHROOM_EMERGENCY: { (void)player_set_timed(p_ptr, TMD_IMAGE, rand_spread(250, 50), TRUE); (void)player_set_timed(p_ptr, TMD_OPP_FIRE, rand_spread(30, 10), TRUE); (void)player_set_timed(p_ptr, TMD_OPP_COLD, rand_spread(30, 10), TRUE); (void)hp_player(200); *ident = TRUE; return TRUE; } case EF_SHROOM_TERROR: { if (player_set_timed(p_ptr, TMD_TERROR, rand_spread(100, 20), TRUE)) *ident = TRUE; return TRUE; } case EF_SHROOM_STONE: { if (player_set_timed(p_ptr, TMD_STONESKIN, rand_spread(80, 20), TRUE)) *ident = TRUE; return TRUE; } case EF_SHROOM_DEBILITY: { int stat = one_in_(2) ? A_STR : A_CON; if (p_ptr->csp < p_ptr->msp) { p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; msg("You feel your head clear."); p_ptr->redraw |= (PR_MANA); *ident = TRUE; } (void)do_dec_stat(stat, FALSE); *ident = TRUE; return TRUE; } case EF_SHROOM_SPRINTING: { if (player_inc_timed(p_ptr, TMD_SPRINT, 100, TRUE, TRUE)) *ident = TRUE; return TRUE; } case EF_SHROOM_PURGING: { player_set_food(p_ptr, PY_FOOD_FAINT - 1); if (do_res_stat(A_STR)) *ident = TRUE; if (do_res_stat(A_CON)) *ident = TRUE; if (player_clear_timed(p_ptr, TMD_POISONED, TRUE)) *ident = TRUE; return TRUE; } case EF_RING_ACID: { dam = 70 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_ACID, dir, dam, 2); player_inc_timed(p_ptr, TMD_OPP_ACID, randint1(20) + 20, TRUE, TRUE); return TRUE; } case EF_RING_FLAMES: { dam = 80 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_FIRE, dir, dam, 2); player_inc_timed(p_ptr, TMD_OPP_FIRE, randint1(20) + 20, TRUE, TRUE); return TRUE; } case EF_RING_ICE: { dam = 75 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_COLD, dir, dam, 2); player_inc_timed(p_ptr, TMD_OPP_COLD, randint1(20) + 20, TRUE, TRUE); return TRUE; } case EF_RING_LIGHTNING: { dam = 85 * (100 + boost) / 100; *ident = TRUE; fire_ball(GF_ELEC, dir, dam, 2); player_inc_timed(p_ptr, TMD_OPP_ELEC, randint1(20) + 20, TRUE, TRUE); return TRUE; } case EF_DRAGON_BLUE: { dam = 150 * (100 + boost) / 100; msgt(MSG_BR_ELEC, "You breathe lightning."); fire_ball(GF_ELEC, dir, dam, 2); return TRUE; } case EF_DRAGON_GREEN: { dam = 150 * (100 + boost) / 100; msgt(MSG_BR_GAS, "You breathe poison gas."); fire_ball(GF_POIS, dir, dam, 2); return TRUE; } case EF_DRAGON_RED: { dam = 200 * (100 + boost) / 100; msgt(MSG_BR_FIRE, "You breathe fire."); fire_ball(GF_FIRE, dir, dam, 2); return TRUE; } case EF_DRAGON_MULTIHUED: { static const struct { int msg_sound; const char *msg; int typ; } mh[] = { { MSG_BR_ELEC, "lightning", GF_ELEC }, { MSG_BR_FROST, "frost", GF_COLD }, { MSG_BR_ACID, "acid", GF_ACID }, { MSG_BR_GAS, "poison gas", GF_POIS }, { MSG_BR_FIRE, "fire", GF_FIRE } }; chance = randint0(5); dam = 250 * (100 + boost) / 100; msgt(mh[chance].msg_sound, "You breathe %s.", mh[chance].msg); fire_ball(mh[chance].typ, dir, dam, 2); return TRUE; } case EF_DRAGON_BRONZE: { dam = 150 * (100 + boost) / 100; msgt(MSG_BR_CONF, "You breathe confusion."); fire_ball(GF_CONFU, dir, dam, 2); return TRUE; } case EF_DRAGON_GOLD: { dam = 150 * (100 + boost) / 100; msgt(MSG_BR_SOUND, "You breathe sound."); fire_ball(GF_SOUND, dir, dam, 2); return TRUE; } case EF_DRAGON_CHAOS: { dam = 220 * (100 + boost) / 100; chance = randint0(2); msgt((chance == 1 ? MSG_BR_CHAOS : MSG_BR_DISEN), "You breathe %s.", ((chance == 1 ? "chaos" : "disenchantment"))); fire_ball((chance == 1 ? GF_CHAOS : GF_DISEN), dir, dam, 2); return TRUE; } case EF_DRAGON_LAW: { dam = 230 * (100 + boost) / 100; chance = randint0(2); msgt((chance == 1 ? MSG_BR_SOUND : MSG_BR_SHARDS), "You breathe %s.", ((chance == 1 ? "sound" : "shards"))); fire_ball((chance == 1 ? GF_SOUND : GF_SHARD), dir, dam, 2); return TRUE; } case EF_DRAGON_BALANCE: { dam = 250 * (100 + boost) / 100; chance = randint0(4); msg("You breathe %s.", ((chance == 1) ? "chaos" : ((chance == 2) ? "disenchantment" : ((chance == 3) ? "sound" : "shards")))); fire_ball(((chance == 1) ? GF_CHAOS : ((chance == 2) ? GF_DISEN : ((chance == 3) ? GF_SOUND : GF_SHARD))), dir, dam, 2); return TRUE; } case EF_DRAGON_SHINING: { dam = 200 * (100 + boost) / 100; chance = randint0(2); msgt((chance == 0 ? MSG_BR_LIGHT : MSG_BR_DARK), "You breathe %s.", ((chance == 0 ? "light" : "darkness"))); fire_ball((chance == 0 ? GF_LIGHT : GF_DARK), dir, dam, 2); return TRUE; } case EF_DRAGON_POWER: { dam = 300 * (100 + boost) / 100; msgt(MSG_BR_ELEMENTS, "You breathe the elements."); fire_ball(GF_MISSILE, dir, dam, 2); return TRUE; } case EF_TRAP_DOOR: { msg("You fall through a trap door!"); if (check_state(p_ptr, OF_FEATHER, p_ptr->state.flags)) { msg("You float gently down to the next level."); } else { take_hit(p_ptr, damroll(2, 8), "a trap"); } wieldeds_notice_flag(p_ptr, OF_FEATHER); dungeon_change_level(p_ptr->depth + 1); return TRUE; } case EF_TRAP_PIT: { msg("You fall into a pit!"); if (check_state(p_ptr, OF_FEATHER, p_ptr->state.flags)) { msg("You float gently to the bottom of the pit."); } else { take_hit(p_ptr, damroll(2, 6), "a trap"); } wieldeds_notice_flag(p_ptr, OF_FEATHER); return TRUE; } case EF_TRAP_PIT_SPIKES: { msg("You fall into a spiked pit!"); if (check_state(p_ptr, OF_FEATHER, p_ptr->state.flags)) { msg("You float gently to the floor of the pit."); msg("You carefully avoid touching the spikes."); } else { dam = damroll(2, 6); /* Extra spike damage */ if (one_in_(2)) { msg("You are impaled!"); dam *= 2; (void)player_inc_timed(p_ptr, TMD_CUT, randint1(dam), TRUE, TRUE); } take_hit(p_ptr, dam, "a trap"); } wieldeds_notice_flag(p_ptr, OF_FEATHER); return TRUE; } case EF_TRAP_PIT_POISON: { msg("You fall into a spiked pit!"); if (check_state(p_ptr, OF_FEATHER, p_ptr->state.flags)) { msg("You float gently to the floor of the pit."); msg("You carefully avoid touching the spikes."); } else { dam = damroll(2, 6); /* Extra spike damage */ if (one_in_(2)) { msg("You are impaled on poisonous spikes!"); (void)player_inc_timed(p_ptr, TMD_CUT, randint1(dam * 2), TRUE, TRUE); (void)player_inc_timed(p_ptr, TMD_POISONED, randint1(dam * 4), TRUE, TRUE); } take_hit(p_ptr, dam, "a trap"); } wieldeds_notice_flag(p_ptr, OF_FEATHER); return TRUE; } case EF_TRAP_RUNE_SUMMON: { int i; int num = 2 + randint1(3); msgt(MSG_SUM_MONSTER, "You are enveloped in a cloud of smoke!"); /* Remove trap */ cave->info[py][px] &= ~(CAVE_MARK); cave_destroy_trap(cave, py, px); for (i = 0; i < num; i++) (void)summon_specific(py, px, p_ptr->depth, 0, 1); return TRUE; } case EF_TRAP_RUNE_TELEPORT: { msg("You hit a teleport trap!"); teleport_player(100); return TRUE; } case EF_TRAP_SPOT_FIRE: { msg("You are enveloped in flames!"); dam = damroll(4, 6); dam = adjust_dam(p_ptr, GF_FIRE, dam, RANDOMISE, check_for_resist(p_ptr, GF_FIRE, p_ptr->state.flags, TRUE)); if (dam) { take_hit(p_ptr, dam, "a fire trap"); inven_damage(p_ptr, GF_FIRE, MIN(dam * 5, 300)); } return TRUE; } case EF_TRAP_SPOT_ACID: { msg("You are splashed with acid!"); dam = damroll(4, 6); dam = adjust_dam(p_ptr, GF_ACID, dam, RANDOMISE, check_for_resist(p_ptr, GF_ACID, p_ptr->state.flags, TRUE)); if (dam) { take_hit(p_ptr, dam, "an acid trap"); inven_damage(p_ptr, GF_ACID, MIN(dam * 5, 300)); } return TRUE; } case EF_TRAP_DART_SLOW: { if (trap_check_hit(125)) { msg("A small dart hits you!"); take_hit(p_ptr, damroll(1, 4), "a trap"); (void)player_inc_timed(p_ptr, TMD_SLOW, randint0(20) + 20, TRUE, FALSE); } else { msg("A small dart barely misses you."); } return TRUE; } case EF_TRAP_DART_LOSE_STR: { if (trap_check_hit(125)) { msg("A small dart hits you!"); take_hit(p_ptr, damroll(1, 4), "a trap"); (void)do_dec_stat(A_STR, FALSE); } else { msg("A small dart barely misses you."); } return TRUE; } case EF_TRAP_DART_LOSE_DEX: { if (trap_check_hit(125)) { msg("A small dart hits you!"); take_hit(p_ptr, damroll(1, 4), "a trap"); (void)do_dec_stat(A_DEX, FALSE); } else { msg("A small dart barely misses you."); } return TRUE; } case EF_TRAP_DART_LOSE_CON: { if (trap_check_hit(125)) { msg("A small dart hits you!"); take_hit(p_ptr, damroll(1, 4), "a trap"); (void)do_dec_stat(A_CON, FALSE); } else { msg("A small dart barely misses you."); } return TRUE; } case EF_TRAP_GAS_BLIND: { msg("You are surrounded by a black gas!"); (void)player_inc_timed(p_ptr, TMD_BLIND, randint0(50) + 25, TRUE, TRUE); return TRUE; } case EF_TRAP_GAS_CONFUSE: { msg("You are surrounded by a gas of scintillating colors!"); (void)player_inc_timed(p_ptr, TMD_CONFUSED, randint0(20) + 10, TRUE, TRUE); return TRUE; } case EF_TRAP_GAS_POISON: { msg("You are surrounded by a pungent green gas!"); (void)player_inc_timed(p_ptr, TMD_POISONED, randint0(20) + 10, TRUE, TRUE); return TRUE; } case EF_TRAP_GAS_SLEEP: { msg("You are surrounded by a strange white mist!"); (void)player_inc_timed(p_ptr, TMD_PARALYZED, randint0(10) + 5, TRUE, TRUE); return TRUE; } case EF_XXX: case EF_MAX: break; } /* Not used */ msg("Effect not handled."); return FALSE; } angband-3.5.1/src/cmd-process.c0000644000175000017500000005465112456456606015625 0ustar chriscchrisc/* * File: cmds.c * Purpose: Deal with command processing. * * Copyright (c) 2010 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "cave.h" #include "cmds.h" #include "files.h" #include "game-cmd.h" #include "keymap.h" #include "textui.h" #include "ui-event.h" #include "ui-menu.h" #include "wizard.h" #include "target.h" /* * This file contains (several) big lists of commands, so that they can be * easily maniuplated for e.g. help displays, or if a port wants to provide a * native menu containing a command list. * * Consider a two-paned layout for the command menus. XXX * * This file still needs some clearing up. XXX */ /*** Handling bits ***/ /* * Holds a generic command - if cmd is set to other than CMD_NULL * it simply pushes that command to the game, otherwise the hook * function will be called. */ struct cmd_info { const char *desc; keycode_t key[2]; cmd_code cmd; void (*hook)(void); bool (*prereq)(void); }; static struct cmd_info cmd_item[] = { { "Inscribe an object", { '{' }, CMD_INSCRIBE }, { "Uninscribe an object", { '}' }, CMD_UNINSCRIBE }, { "Wear/wield an item", { 'w' }, CMD_WIELD }, { "Take off/unwield an item", { 't', 'T'}, CMD_TAKEOFF }, { "Examine an item", { 'I' }, CMD_NULL, textui_obj_examine }, { "Drop an item", { 'd' }, CMD_DROP }, { "Fire your missile weapon", { 'f', 't' }, CMD_FIRE, NULL, player_can_fire_prereq }, { "Use a staff", { 'u', 'Z' }, CMD_USE_STAFF }, { "Aim a wand", {'a', 'z'}, CMD_USE_WAND }, { "Zap a rod", {'z', 'a'}, CMD_USE_ROD }, { "Activate an object", {'A' }, CMD_ACTIVATE }, { "Eat some food", { 'E' }, CMD_EAT }, { "Quaff a potion", { 'q' }, CMD_QUAFF }, { "Read a scroll", { 'r' }, CMD_READ_SCROLL, NULL, player_can_read_prereq }, { "Fuel your light source", { 'F' }, CMD_REFILL, NULL, player_can_refuel_prereq }, { "Use an item", { 'U', 'X' }, CMD_USE_ANY } }; /* General actions */ static struct cmd_info cmd_action[] = { { "Search for traps/doors", { 's' }, CMD_SEARCH }, { "Disarm a trap or chest", { 'D' }, CMD_DISARM }, { "Rest for a while", { 'R' }, CMD_NULL, textui_cmd_rest }, { "Look around", { 'l', 'x' }, CMD_NULL, do_cmd_look }, { "Target monster or location", { '*' }, CMD_NULL, do_cmd_target }, { "Target closest monster", { '\'' }, CMD_NULL, do_cmd_target_closest }, { "Dig a tunnel", { 'T', KTRL('T') }, CMD_TUNNEL }, { "Go up staircase", {'<' }, CMD_GO_UP }, { "Go down staircase", { '>' }, CMD_GO_DOWN }, { "Toggle search mode", { 'S', '#' }, CMD_TOGGLE_SEARCH }, { "Open a door or a chest", { 'o' }, CMD_OPEN }, { "Close a door", { 'c' }, CMD_CLOSE }, { "Fire at nearest target", { 'h', KC_TAB }, CMD_NULL, textui_cmd_fire_at_nearest }, { "Throw an item", { 'v' }, CMD_THROW, textui_cmd_throw }, { "Walk into a trap", { 'W', '-' }, CMD_JUMP, NULL }, }; /* Item management commands */ static struct cmd_info cmd_item_manage[] = { { "Display equipment listing", { 'e' }, CMD_NULL, do_cmd_equip }, { "Display inventory listing", { 'i' }, CMD_NULL, do_cmd_inven }, { "Pick up objects", { 'g' }, CMD_PICKUP, NULL }, { "Destroy an item", { 'k', KTRL('D') }, CMD_DESTROY, textui_cmd_destroy }, }; /* Information access commands */ static struct cmd_info cmd_info[] = { { "Browse a book", { 'b', 'P' }, CMD_BROWSE_SPELL, textui_spell_browse }, { "Gain new spells", { 'G' }, CMD_STUDY_BOOK, textui_obj_study, player_can_study_prereq }, { "Cast a spell", { 'm' }, CMD_CAST, textui_obj_cast, player_can_cast_prereq }, { "Cast a spell", { 'p' }, CMD_CAST, textui_obj_cast, player_can_cast_prereq }, { "Full dungeon map", { 'M' }, CMD_NULL, do_cmd_view_map }, { "Toggle ignoring of items", { 'K', 'O' }, CMD_NULL, textui_cmd_toggle_ignore }, { "Display visible item list", { ']' }, CMD_NULL, do_cmd_itemlist }, { "Display visible monster list", { '[' }, CMD_NULL, do_cmd_monlist }, { "Locate player on map", { 'L', 'W' }, CMD_NULL, do_cmd_locate }, { "Help", { '?' }, CMD_NULL, do_cmd_help }, { "Identify symbol", { '/' }, CMD_NULL, do_cmd_query_symbol }, { "Character description", { 'C' }, CMD_NULL, do_cmd_change_name }, { "Check knowledge", { '~' }, CMD_NULL, textui_browse_knowledge }, { "Repeat level feeling", { KTRL('F') }, CMD_NULL, do_cmd_feeling }, { "Show previous message", { KTRL('O') }, CMD_NULL, do_cmd_message_one }, { "Show previous messages", { KTRL('P') }, CMD_NULL, do_cmd_messages } }; /* Utility/assorted commands */ static struct cmd_info cmd_util[] = { { "Interact with options", { '=' }, CMD_NULL, do_cmd_xxx_options }, { "Save and don't quit", { KTRL('S') }, CMD_SAVE }, { "Save and quit", { KTRL('X') }, CMD_QUIT }, { "Quit (commit suicide)", { 'Q' }, CMD_NULL, textui_cmd_suicide }, { "Redraw the screen", { KTRL('R') }, CMD_NULL, do_cmd_redraw }, { "Load \"screen dump\"", { '(' }, CMD_NULL, do_cmd_load_screen }, { "Save \"screen dump\"", { ')' }, CMD_NULL, do_cmd_save_screen } }; /* Commands that shouldn't be shown to the user */ static struct cmd_info cmd_hidden[] = { { "Take notes", { ':' }, CMD_NULL, do_cmd_note }, { "Version info", { 'V' }, CMD_NULL, do_cmd_version }, { "Load a single pref line", { '"' }, CMD_NULL, do_cmd_pref }, { "Enter a store", { '_' }, CMD_ENTER_STORE, NULL }, { "Toggle windows", { KTRL('E') }, CMD_NULL, toggle_inven_equip }, /* XXX */ { "Alter a grid", { '+' }, CMD_ALTER, NULL }, { "Walk", { ';' }, CMD_WALK, NULL }, { "Start running", { '.', ',' }, CMD_RUN, NULL }, { "Stand still", { ',', '.' }, CMD_HOLD, NULL }, { "Center map", { KTRL('L'), '@' }, CMD_NULL, do_cmd_center_map }, { "Toggle wizard mode", { KTRL('W') }, CMD_NULL, do_cmd_wizard }, { "Repeat previous command", { 'n', KTRL('V') }, CMD_REPEAT, NULL }, { "Do autopickup", { KTRL('G') }, CMD_AUTOPICKUP, NULL }, #ifdef ALLOW_DEBUG { "Debug mode commands", { KTRL('A') }, CMD_NULL, do_cmd_try_debug }, #endif #ifdef ALLOW_BORG { "Borg commands", { KTRL('Z') }, CMD_NULL, do_cmd_try_borg } #endif }; /* * A categorised list of all the command lists. */ typedef struct { const char *name; struct cmd_info *list; size_t len; } command_list; static command_list cmds_all[] = { { "Items", cmd_item, N_ELEMENTS(cmd_item) }, { "Action commands", cmd_action, N_ELEMENTS(cmd_action) }, { "Manage items", cmd_item_manage, N_ELEMENTS(cmd_item_manage) }, { "Information", cmd_info, N_ELEMENTS(cmd_info) }, { "Utility", cmd_util, N_ELEMENTS(cmd_util) }, { "Hidden", cmd_hidden, N_ELEMENTS(cmd_hidden) } }; /*** Menu functions ***/ /* Display an entry on a command menu */ static void cmd_sub_entry(menu_type *menu, int oid, bool cursor, int row, int col, int width) { byte attr = (cursor ? TERM_L_BLUE : TERM_WHITE); const struct cmd_info *commands = menu_priv(menu); int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; struct keypress kp = { EVT_KBRD, commands[oid].key[mode] }; char buf[16]; /* Write the description */ Term_putstr(col, row, -1, attr, commands[oid].desc); /* Include keypress */ Term_addch(attr, ' '); Term_addch(attr, '('); /* Get readable version */ keypress_to_readable(buf, sizeof buf, kp); Term_addstr(-1, attr, buf); Term_addch(attr, ')'); } /* * Display a list of commands. */ static bool cmd_menu(command_list *list, void *selection_p) { menu_type menu; menu_iter commands_menu = { NULL, NULL, cmd_sub_entry, NULL, NULL }; region area = { 23, 4, 37, 13 }; ui_event evt; struct cmd_info **selection = selection_p; /* Set up the menu */ menu_init(&menu, MN_SKIN_SCROLL, &commands_menu); menu_setpriv(&menu, list->len, list->list); menu_layout(&menu, &area); /* Set up the screen */ screen_save(); window_make(21, 3, 62, 17); /* Select an entry */ evt = menu_select(&menu, 0, TRUE); /* Load de screen */ screen_load(); if (evt.type == EVT_SELECT) *selection = &list->list[menu.cursor]; return FALSE; } static bool cmd_list_action(menu_type *m, const ui_event *event, int oid) { if (event->type == EVT_SELECT) return cmd_menu(&cmds_all[oid], menu_priv(m)); else return FALSE; } static void cmd_list_entry(menu_type *menu, int oid, bool cursor, int row, int col, int width) { byte attr = (cursor ? TERM_L_BLUE : TERM_WHITE); Term_putstr(col, row, -1, attr, cmds_all[oid].name); } static menu_type *command_menu; static menu_iter command_menu_iter = { NULL, NULL, cmd_list_entry, cmd_list_action, NULL }; /* * Display a list of command types, allowing the user to select one. */ static struct cmd_info *textui_action_menu_choose(void) { region area = { 21, 5, 37, 6 }; struct cmd_info *chosen_command = NULL; if (!command_menu) command_menu = menu_new(MN_SKIN_SCROLL, &command_menu_iter); menu_setpriv(command_menu, N_ELEMENTS(cmds_all) - 1, &chosen_command); menu_layout(command_menu, &area); /* Set up the screen */ screen_save(); window_make(19, 4, 58, 11); menu_select(command_menu, 0, TRUE); screen_load(); return chosen_command; } /*** Exported functions ***/ /* List indexed by char */ /* XXX 2 shoud be KEYMAP_MAX */ static struct cmd_info *converted_list[2][UCHAR_MAX+1]; /* * Initialise the command list. */ void cmd_init(void) { size_t i, j; memset(converted_list, 0, sizeof(converted_list)); /* Go through all generic commands */ for (j = 0; j < N_ELEMENTS(cmds_all); j++) { struct cmd_info *commands = cmds_all[j].list; /* Fill everything in */ for (i = 0; i < cmds_all[j].len; i++) { /* If a roguelike key isn't set, use default */ if (!commands[i].key[1]) commands[i].key[1] = commands[i].key[0]; converted_list[0][commands[i].key[0]] = &commands[i]; converted_list[1][commands[i].key[1]] = &commands[i]; } } } unsigned char cmd_lookup_key(cmd_code lookup_cmd, int mode) { unsigned int i; assert(mode == KEYMAP_MODE_ROGUE || mode == KEYMAP_MODE_ORIG); for (i = 0; i < N_ELEMENTS(converted_list[mode]); i++) { struct cmd_info *cmd = converted_list[mode][i]; if (cmd && cmd->cmd == lookup_cmd) return cmd->key[mode]; } return 0; } unsigned char cmd_lookup_key_unktrl(cmd_code lookup_cmd, int mode) { unsigned char c = cmd_lookup_key(lookup_cmd, mode); if (c < 0x20) c = UN_KTRL(c); return c; } cmd_code cmd_lookup(unsigned char key, int mode) { assert(mode == KEYMAP_MODE_ROGUE || mode == KEYMAP_MODE_ORIG); if (!converted_list[mode][key]) return CMD_NULL; return converted_list[mode][key]->cmd; } /*** Input processing ***/ /** * Get a command count, with the '0' key. */ static int textui_get_count(void) { int count = 0; while (1) { struct keypress ke; prt(format("Repeat: %d", count), 0, 0); ke = inkey(); if (ke.code == ESCAPE) return -1; /* Simple editing (delete or backspace) */ else if (ke.code == KC_DELETE || ke.code == KC_BACKSPACE) count = count / 10; /* Actual numeric data */ else if (isdigit((unsigned char) ke.code)) { count = count * 10 + D2I(ke.code); if (count >= 9999) { bell("Invalid repeat count!"); count = 9999; } } /* Anything non-numeric passes straight to command input */ else { /* XXX nasty hardcoding of action menu key */ if (ke.code != KC_ENTER) Term_keypress(ke.code, ke.mods); break; } } return count; } /* * Hack -- special buffer to hold the action of the current keymap */ static struct keypress request_command_buffer[256]; /* * Request a command from the user. * * Note that "caret" ("^") is treated specially, and is used to * allow manual input of control characters. This can be used * on many machines to request repeated tunneling (Ctrl-H) and * on the Macintosh to request "Control-Caret". * * Note that "backslash" is treated specially, and is used to bypass any * keymap entry for the following character. This is useful for macros. */ static ui_event textui_get_command(int *count) { int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; struct keypress tmp[2] = { { 0 }, { 0 } }; ui_event ke = EVENT_EMPTY; const struct keypress *act = NULL; /* Get command */ while (1) { /* Hack -- no flush needed */ msg_flag = FALSE; /* Activate "command mode" */ inkey_flag = TRUE; /* Get a command */ ke = inkey_ex(); if (ke.type == EVT_KBRD) { bool keymap_ok = TRUE; switch (ke.key.code) { case '0': { int c = textui_get_count(); if (c == -1 || !get_com_ex("Command: ", &ke)) continue; else *count = c; break; } case '\\': { /* Allow keymaps to be bypassed */ (void)get_com_ex("Command: ", &ke); keymap_ok = FALSE; break; } case '^': { /* Allow "control chars" to be entered */ if (get_com("Control: ", &ke.key)) ke.key.code = KTRL(ke.key.code); break; } } /* Find any relevant keymap */ if (keymap_ok) act = keymap_find(mode, ke.key); } /* Erase the message line */ prt("", 0, 0); if (ke.type == EVT_BUTTON) { /* Buttons are always specified in standard keyset */ act = tmp; tmp[0] = ke.key; } /* Apply keymap if not inside a keymap already */ if (ke.key.code && act && !inkey_next) { size_t n = 0; while (act[n].type) n++; /* Make room for the terminator */ n += 1; /* Install the keymap */ memcpy(request_command_buffer, act, n * sizeof(struct keypress)); /* Start using the buffer */ inkey_next = request_command_buffer; /* Continue */ continue; } /* Done */ break; } return ke; } static int show_command_list(struct cmd_info cmd_list[], int size, int mx, int my) { menu_type *m; region r; int selected; int i; char cmd_name[80]; char key[3]; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; m = menu_dynamic_new(); if (!m) { return 0; } m->selections = lower_case; key[2] = '\0'; for (i=0; i < size; ++i) { if (KTRL(cmd_list[i].key[mode]) == cmd_list[i].key[mode]) { key[0] = '^'; key[1] = UN_KTRL(cmd_list[i].key[mode]); } else { key[0] = cmd_list[i].key[mode]; key[1] = '\0'; } strnfmt(cmd_name, 80, "%s (%s)", cmd_list[i].desc, key); menu_dynamic_add(m, cmd_name, i+1); } /* work out display region */ r.width = menu_dynamic_longest_entry(m) + 3 + 2; /* +3 for tag, 2 for pad */ if (mx > Term->wid - r.width - 1) { r.col = Term->wid - r.width - 1; } else { r.col = mx + 1; } r.page_rows = m->count; if (my > Term->hgt - r.page_rows - 1) { if (my - r.page_rows - 1 <= 0) { /* menu has too many items, so put in upper right corner */ r.row = 1; r.col = Term->wid - r.width - 1; } else { r.row = Term->hgt - r.page_rows - 1; } } else { r.row = my + 1; } screen_save(); menu_layout(m, &r); region_erase_bordered(&r); prt("(Enter to select, ESC) Command:", 0, 0); selected = menu_dynamic_select(m); menu_dynamic_free(m); screen_load(); if ((selected > 0) && (selected < size+1)) { /* execute the command */ Term_keypress(cmd_list[selected-1].key[mode], 0); } return 1; } int context_menu_command(int mx, int my) { menu_type *m; region r; int selected; m = menu_dynamic_new(); if (!m) { return 0; } m->selections = lower_case; menu_dynamic_add(m, "Item", 1); menu_dynamic_add(m, "Action", 2); menu_dynamic_add(m, "Item Management", 3); menu_dynamic_add(m, "Info", 4); menu_dynamic_add(m, "Util", 5); menu_dynamic_add(m, "Misc", 6); /* work out display region */ r.width = menu_dynamic_longest_entry(m) + 3 + 2; /* +3 for tag, 2 for pad */ if (mx > Term->wid - r.width - 1) { r.col = Term->wid - r.width - 1; } else { r.col = mx + 1; } r.page_rows = m->count; if (my > Term->hgt - r.page_rows - 1) { if (my - r.page_rows - 1 <= 0) { /* menu has too many items, so put in upper right corner */ r.row = 1; r.col = Term->wid - r.width - 1; } else { r.row = Term->hgt - r.page_rows - 1; } } else { r.row = my + 1; } screen_save(); menu_layout(m, &r); region_erase_bordered(&r); prt("(Enter to select, ESC) Command:", 0, 0); selected = menu_dynamic_select(m); menu_dynamic_free(m); screen_load(); switch (selected) { case 1: show_command_list(cmd_item, N_ELEMENTS(cmd_item), mx, my); break; case 2: show_command_list(cmd_action, N_ELEMENTS(cmd_action), mx, my); break; case 3: show_command_list(cmd_item_manage, N_ELEMENTS(cmd_item_manage), mx, my); break; case 4: show_command_list(cmd_info, N_ELEMENTS(cmd_info), mx, my); break; case 5: show_command_list(cmd_util, N_ELEMENTS(cmd_util), mx, my); break; case 6: show_command_list(cmd_hidden, N_ELEMENTS(cmd_hidden), mx, my); break; } return 1; } /** * Handle a textui mouseclick. */ static void textui_process_click(ui_event e) { int x, y; if (!OPT(mouse_movement)) return; y = KEY_GRID_Y(e); x = KEY_GRID_X(e); /* Check for a valid location */ if (!cave_in_bounds_fully(cave, y, x)) return; /* XXX show context menu here */ if ((p_ptr->py == y) && (p_ptr->px == x)) { if (e.mouse.mods & KC_MOD_SHIFT) { /* shift-click - cast magic */ if (e.mouse.button == 1) { textui_obj_cast(); } else if (e.mouse.button == 2) { Term_keypress('i',0); } } else if (e.mouse.mods & KC_MOD_CONTROL) { /* ctrl-click - use feature / use inventory item */ /* switch with default */ if (e.mouse.button == 1) { if (cave_isupstairs(cave, p_ptr->py, p_ptr->px)) cmd_insert(CMD_GO_UP); else if (cave_isdownstairs(cave, p_ptr->py, p_ptr->px)) cmd_insert(CMD_GO_DOWN); } else if (e.mouse.button == 2) { cmd_insert(CMD_USE_UNAIMED); } } else if (e.mouse.mods & KC_MOD_ALT) { /* alt-click - Search or show char screen */ /* XXX call a platform specific hook */ if (e.mouse.button == 1) { cmd_insert(CMD_SEARCH); } else if (e.mouse.button == 2) { Term_keypress('C',0); } } else { if (e.mouse.button == 1) { if (cave->o_idx[y][x]) { cmd_insert(CMD_PICKUP); } else { cmd_insert(CMD_HOLD); } } else if (e.mouse.button == 2) { // show a context menu context_menu_player(e.mouse.x, e.mouse.y); } } } else if (e.mouse.button == 1) { if (p_ptr->timed[TMD_CONFUSED]) { cmd_insert(CMD_WALK); } else { if (e.mouse.mods & KC_MOD_SHIFT) { /* shift-click - run */ cmd_insert(CMD_RUN); cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(y,x)); /*if ((y-p_ptr->py >= -1) && (y-p_ptr->py <= 1) && (x-p_ptr->px >= -1) && (x-p_ptr->px <= 1)) { cmd_insert(CMD_JUMP); cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(y,x)); } else { cmd_insert(CMD_RUN); cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(y,x)); }*/ } else if (e.mouse.mods & KC_MOD_CONTROL) { /* control-click - alter */ cmd_insert(CMD_ALTER); cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(y,x)); } else if (e.mouse.mods & KC_MOD_ALT) { /* alt-click - look */ if (target_set_interactive(TARGET_LOOK, x, y)) { msg("Target Selected."); } //cmd_insert(CMD_LOOK); //cmd_set_arg_point(cmd_get_top(), 0, y, x); } else { /* pathfind does not work well on trap detection borders, * so if the click is next to the player, force a walk step */ if ((y-p_ptr->py >= -1) && (y-p_ptr->py <= 1) && (x-p_ptr->px >= -1) && (x-p_ptr->px <= 1)) { cmd_insert(CMD_WALK); cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(y,x)); } else { cmd_insert(CMD_PATHFIND); cmd_set_arg_point(cmd_get_top(), 0, y, x); } } } } else if (e.mouse.button == 2) { struct monster *m = cave_monster_at(cave, y, x); if (m && target_able(m)) { /* Set up target information */ monster_race_track(m->race); health_track(p_ptr, m); target_set_monster(m); } else { target_set_location(y,x); } if (e.mouse.mods & KC_MOD_SHIFT) { /* shift-click - cast spell at target */ if (textui_obj_cast_ret() >= 0) { cmd_set_arg_target(cmd_get_top(), 1, DIR_TARGET); } } else if (e.mouse.mods & KC_MOD_CONTROL) { /* control-click - fire at target */ cmd_insert(CMD_USE_AIMED); cmd_set_arg_target(cmd_get_top(), 1, DIR_TARGET); } else if (e.mouse.mods & KC_MOD_ALT) { /* alt-click - throw at target */ cmd_insert(CMD_THROW); cmd_set_arg_target(cmd_get_top(), 1, DIR_TARGET); } else { //msg("Target set."); /* see if the click was adjacent to the player */ if ((y-p_ptr->py >= -1) && (y-p_ptr->py <= 1) && (x-p_ptr->px >= -1) && (x-p_ptr->px <= 1)) { context_menu_cave(cave,y,x,1,e.mouse.x, e.mouse.y); } else { context_menu_cave(cave,y,x,0,e.mouse.x, e.mouse.y); } } } } /** * Check no currently worn items are stopping the action 'c' */ bool key_confirm_command(unsigned char c) { int i; /* Hack -- Scan equipment */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { char verify_inscrip[] = "^*"; unsigned n; object_type *o_ptr = &p_ptr->inventory[i]; if (!o_ptr->kind) continue; /* Set up string to look for, e.g. "^d" */ verify_inscrip[1] = c; /* Verify command */ n = check_for_inscrip(o_ptr, "^*") + check_for_inscrip(o_ptr, verify_inscrip); while (n--) { if (!get_check("Are you sure? ")) return FALSE; } } return TRUE; } /** * Process a textui keypress. */ static bool textui_process_key(struct keypress kp, int count) { struct cmd_info *cmd; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; /* XXXmacro this needs rewriting */ keycode_t c = kp.code; if (c == '\0' || c == ESCAPE || c == ' ' || c == '\a') return TRUE; if (c == KC_ENTER) { cmd = textui_action_menu_choose(); } else { if (c > UCHAR_MAX) return FALSE; cmd = converted_list[mode][c]; } if (!cmd) return FALSE; if (key_confirm_command(c) && (!cmd->prereq || cmd->prereq())) { if (cmd->hook) cmd->hook(); else if (cmd->cmd) cmd_insert_repeated(cmd->cmd, count); } return TRUE; } /** * Parse and execute the current command * Give "Warning" on illegal commands. */ void textui_process_command(bool no_request) { int count = 0; bool done = TRUE; ui_event e; e = textui_get_command(&count); switch (e.type) { case EVT_RESIZE: do_cmd_redraw(); break; case EVT_MOUSE: textui_process_click(e); break; case EVT_BUTTON: case EVT_KBRD: done = textui_process_key(e.key, count); break; default: ; } if (!done) do_cmd_unknown(); } angband-3.5.1/src/score.c0000644000175000017500000003060112456456606014506 0ustar chriscchrisc/* * File: score.c * Purpose: Highscore handling for Angband * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" /* * Maximum number of high scores in the high score file */ #define MAX_HISCORES 100 /* * Semi-Portable High Score List Entry (128 bytes) * * All fields listed below are null terminated ascii strings. * * In addition, the "number" fields are right justified, and * space padded, to the full available length (minus the "null"). * * Note that "string comparisons" are thus valid on "pts". */ typedef struct { char what[8]; /* Version info (string) */ char pts[10]; /* Total Score (number) */ char gold[10]; /* Total Gold (number) */ char turns[10]; /* Turns Taken (number) */ char day[10]; /* Time stamp (string) */ char who[16]; /* Player Name (string) */ char uid[8]; /* Player UID (number) */ char sex[2]; /* Player Sex (string) */ char p_r[3]; /* Player Race (number) */ char p_c[3]; /* Player Class (number) */ char cur_lev[4]; /* Current Player Level (number) */ char cur_dun[4]; /* Current Dungeon Level (number) */ char max_lev[4]; /* Max Player Level (number) */ char max_dun[4]; /* Max Dungeon Level (number) */ char how[32]; /* Method of death (string) */ } high_score; /* * Hack -- Calculates the total number of points earned */ static long total_points(void) { return (p_ptr->max_exp + (100 * p_ptr->max_depth)); } /* * Read in a highscore file. */ static size_t highscore_read(high_score scores[], size_t sz) { char fname[1024]; ang_file *scorefile; size_t i; /* Wipe current scores */ C_WIPE(scores, sz, high_score); path_build(fname, sizeof(fname), ANGBAND_DIR_APEX, "scores.raw"); scorefile = file_open(fname, MODE_READ, FTYPE_TEXT); if (!scorefile) return TRUE; for (i = 0; i < sz && file_read(scorefile, (char *)&scores[i], sizeof(high_score)) > 0; i++) ; file_close(scorefile); return i; } /* * Just determine where a new score *would* be placed * Return the location (0 is best) or -1 on failure */ static size_t highscore_where(const high_score *entry, const high_score scores[], size_t sz) { size_t i; /* Read until we get to a higher score */ for (i = 0; i < sz; i++) { long entry_pts = strtoul(entry->pts, NULL, 0); long score_pts = strtoul(scores[i].pts, NULL, 0); if (entry_pts >= score_pts) return i; if (scores[i].what[0] == '\0') return i; } /* The last entry is always usable */ return sz - 1; } static size_t highscore_add(const high_score *entry, high_score scores[], size_t sz) { size_t slot = highscore_where(entry, scores, sz); memmove(&scores[slot+1], &scores[slot], sizeof(high_score) * (sz - 1 - slot)); memcpy(&scores[slot], entry, sizeof(high_score)); return slot; } static size_t highscore_count(const high_score scores[], size_t sz) { size_t i; for (i = 0; i < sz; i++) { if (scores[i].what[0] == '\0') break; } return i; } /* * Actually place an entry into the high score file * Return the location (0 is best) or -1 on "failure" */ static void highscore_write(const high_score scores[], size_t sz) { size_t n; ang_file *lok; ang_file *scorefile; char old_name[1024]; char cur_name[1024]; char new_name[1024]; char lok_name[1024]; path_build(old_name, sizeof(old_name), ANGBAND_DIR_APEX, "scores.old"); path_build(cur_name, sizeof(cur_name), ANGBAND_DIR_APEX, "scores.raw"); path_build(new_name, sizeof(new_name), ANGBAND_DIR_APEX, "scores.new"); path_build(lok_name, sizeof(lok_name), ANGBAND_DIR_APEX, "scores.lok"); /* Read in and add new score */ n = highscore_count(scores, sz); /*** Lock scores ***/ if (file_exists(lok_name)) { msg("Lock file in place for scorefile; not writing."); return; } safe_setuid_grab(); lok = file_open(lok_name, MODE_WRITE, FTYPE_RAW); file_lock(lok); safe_setuid_drop(); if (!lok) { msg("Failed to create lock for scorefile; not writing."); return; } /*** Open the new file for writing ***/ safe_setuid_grab(); scorefile = file_open(new_name, MODE_WRITE, FTYPE_RAW); safe_setuid_drop(); if (!scorefile) { msg("Failed to open new scorefile for writing."); file_close(lok); file_delete(lok_name); return; } file_write(scorefile, (const char *)scores, sizeof(high_score)*n); file_close(scorefile); /*** Now move things around ***/ safe_setuid_grab(); if (file_exists(old_name) && !file_delete(old_name)) msg("Couldn't delete old scorefile"); if (file_exists(cur_name) && !file_move(cur_name, old_name)) msg("Couldn't move old scores.raw out of the way"); if (!file_move(new_name, cur_name)) msg("Couldn't rename new scorefile to scores.raw"); /* Remove the lock */ file_close(lok); file_delete(lok_name); safe_setuid_drop(); } /* * Display the scores in a given range. */ static void display_scores_aux(const high_score scores[], int from, int to, int highlight) { struct keypress ch; int j, k, n, place; int count; /* Assume we will show the first 10 */ if (from < 0) from = 0; if (to < 0) to = 10; if (to > MAX_HISCORES) to = MAX_HISCORES; /* Hack -- Count the high scores */ for (count = 0; count < MAX_HISCORES; count++) { if (!scores[count].what[0]) break; } /* Forget about the last entries */ if (count > to) count = to; /* Show 5 per page, until "done" */ for (k = from, j = from, place = k+1; k < count; k += 5) { char out_val[160]; char tmp_val[160]; /* Clear screen */ Term_clear(); /* Title */ if (k > 0) put_str(format("%s Hall of Fame (from position %d)", VERSION_NAME, place), 0, 21); else put_str(format("%s Hall of Fame", VERSION_NAME), 0, 30); /* Dump 5 entries */ for (n = 0; j < count && n < 5; place++, j++, n++) { const high_score *score = &scores[j]; byte attr; int clev, mlev, cdun, mdun; const char *user, *gold, *when, *aged; struct player_class *c; struct player_race *r; /* Hack -- indicate death in yellow */ attr = (j == highlight) ? TERM_L_GREEN : TERM_WHITE; c = player_id2class(atoi(score->p_c)); r = player_id2race(atoi(score->p_r)); /* Extract the level info */ clev = atoi(score->cur_lev); mlev = atoi(score->max_lev); cdun = atoi(score->cur_dun); mdun = atoi(score->max_dun); /* Hack -- extract the gold and such */ for (user = score->uid; isspace((unsigned char)*user); user++) /* loop */; for (when = score->day; isspace((unsigned char)*when); when++) /* loop */; for (gold = score->gold; isspace((unsigned char)*gold); gold++) /* loop */; for (aged = score->turns; isspace((unsigned char)*aged); aged++) /* loop */; /* Dump some info */ strnfmt(out_val, sizeof(out_val), "%3d.%9s %s the %s %s, level %d", place, score->pts, score->who, r ? r->name : "", c ? c->name : "", clev); /* Append a "maximum level" */ if (mlev > clev) my_strcat(out_val, format(" (Max %d)", mlev), sizeof(out_val)); /* Dump the first line */ c_put_str(attr, out_val, n*4 + 2, 0); /* Died where? */ if (!cdun) strnfmt(out_val, sizeof(out_val), "Killed by %s in the town", score->how); else strnfmt(out_val, sizeof(out_val), "Killed by %s on dungeon level %d", score->how, cdun); /* Append a "maximum level" */ if (mdun > cdun) my_strcat(out_val, format(" (Max %d)", mdun), sizeof(out_val)); /* Dump the info */ c_put_str(attr, out_val, n*4 + 3, 15); /* Clean up standard encoded form of "when" */ if ((*when == '@') && strlen(when) == 9) { strnfmt(tmp_val, sizeof(tmp_val), "%.4s-%.2s-%.2s", when + 1, when + 5, when + 7); when = tmp_val; } /* And still another line of info */ strnfmt(out_val, sizeof(out_val), "(User %s, Date %s, Gold %s, Turn %s).", user, when, gold, aged); c_put_str(attr, out_val, n*4 + 4, 15); } /* Wait for response */ prt("[Press ESC to exit, any other key to continue.]", 23, 17); ch = inkey(); prt("", 23, 0); /* Hack -- notice Escape */ if (ch.code == ESCAPE) break; } return; } static void build_score(high_score *entry, const char *died_from, time_t *death_time) { char psex; WIPE(entry, high_score); switch (p_ptr->psex) { case SEX_MALE: psex = 'm'; break; case SEX_FEMALE: psex = 'f'; break; case SEX_NEUTER: default: psex = 'n'; break; } /* Save the version */ strnfmt(entry->what, sizeof(entry->what), "%s", buildid); /* Calculate and save the points */ strnfmt(entry->pts, sizeof(entry->pts), "%9lu", (long)total_points()); /* Save the current gold */ strnfmt(entry->gold, sizeof(entry->gold), "%9lu", (long)p_ptr->au); /* Save the current turn */ strnfmt(entry->turns, sizeof(entry->turns), "%9lu", (long)turn); /* Time of death */ if (death_time) strftime(entry->day, sizeof(entry->day), "@%Y%m%d", localtime(death_time)); else my_strcpy(entry->day, "TODAY", sizeof(entry->day)); /* Save the player name (15 chars) */ strnfmt(entry->who, sizeof(entry->who), "%-.15s", op_ptr->full_name); /* Save the player info XXX XXX XXX */ strnfmt(entry->uid, sizeof(entry->uid), "%7u", player_uid); strnfmt(entry->sex, sizeof(entry->sex), "%c", psex); strnfmt(entry->p_r, sizeof(entry->p_r), "%2d", p_ptr->race->ridx); strnfmt(entry->p_c, sizeof(entry->p_c), "%2d", p_ptr->class->cidx); /* Save the level and such */ strnfmt(entry->cur_lev, sizeof(entry->cur_lev), "%3d", p_ptr->lev); strnfmt(entry->cur_dun, sizeof(entry->cur_dun), "%3d", p_ptr->depth); strnfmt(entry->max_lev, sizeof(entry->max_lev), "%3d", p_ptr->max_lev); strnfmt(entry->max_dun, sizeof(entry->max_dun), "%3d", p_ptr->max_depth); /* No cause of death */ my_strcpy(entry->how, died_from, sizeof(entry->how)); } /* * Enters a players name on a hi-score table, if "legal". * * Assumes "signals_ignore_tstp()" has been called. */ void enter_score(time_t *death_time) { int j; /* Cheaters are not scored */ for (j = OPT_SCORE; j < OPT_SCORE + N_OPTS_CHEAT; ++j) { if (!op_ptr->opt[j]) continue; msg("Score not registered for cheaters."); message_flush(); return; } /* Wizard-mode pre-empts scoring */ if (p_ptr->noscore & (NOSCORE_WIZARD | NOSCORE_DEBUG)) { msg("Score not registered for wizards."); message_flush(); } #ifndef SCORE_BORGS /* Borg-mode pre-empts scoring */ else if (p_ptr->noscore & NOSCORE_BORG) { msg("Score not registered for borgs."); message_flush(); } #endif /* SCORE_BORGS */ /* Hack -- Interupted */ else if (!p_ptr->total_winner && streq(p_ptr->died_from, "Interrupting")) { msg("Score not registered due to interruption."); message_flush(); } /* Hack -- Quitter */ else if (!p_ptr->total_winner && streq(p_ptr->died_from, "Quitting")) { msg("Score not registered due to quitting."); message_flush(); } /* Add a new entry to the score list, see where it went */ else { high_score entry; high_score scores[MAX_HISCORES]; build_score(&entry, p_ptr->died_from, death_time); highscore_read(scores, N_ELEMENTS(scores)); highscore_add(&entry, scores, N_ELEMENTS(scores)); highscore_write(scores, N_ELEMENTS(scores)); } /* Success */ return; } /* * Predict the players location, and display it. */ void predict_score(void) { int j; high_score the_score; high_score scores[MAX_HISCORES]; /* Read scores, place current score */ highscore_read(scores, N_ELEMENTS(scores)); build_score(&the_score, "nobody (yet!)", NULL); if (p_ptr->is_dead) j = highscore_where(&the_score, scores, N_ELEMENTS(scores)); else j = highscore_add(&the_score, scores, N_ELEMENTS(scores)); /* Hack -- Display the top fifteen scores */ if (j < 10) { display_scores_aux(scores, 0, 15, j); } /* Display some "useful" scores */ else { display_scores_aux(scores, 0, 5, -1); display_scores_aux(scores, j - 2, j + 7, j); } } /* * Show scores. */ void show_scores(void) { screen_save(); /* Display the scores */ if (character_generated) { predict_score(); } else { high_score scores[MAX_HISCORES]; highscore_read(scores, N_ELEMENTS(scores)); display_scores_aux(scores, 0, MAX_HISCORES, -1); } screen_load(); /* Hack - Flush it */ Term_fresh(); } angband-3.5.1/src/prefs.h0000644000175000017500000000114212456456606014515 0ustar chriscchrisc/* prefs.h - prefs interface */ #ifndef PREFS_H #define PREFS_H void autoinsc_dump(ang_file *fff); void squelch_dump(ang_file *fff); void dump_options_and_keymaps(ang_file *fff); void dump_monsters(ang_file *fff); void dump_objects(ang_file *fff); void dump_autoinscriptions(ang_file *f); void dump_features(ang_file *fff); void dump_flavors(ang_file *fff); void dump_colors(ang_file *fff); bool prefs_save(const char *path, void (*dump)(ang_file *), const char *title); errr process_pref_file_command(const char *buf); bool process_pref_file(const char *name, bool quiet, bool user); #endif /* !PREFS_H */ angband-3.5.1/src/spells2.c0000644000175000017500000020032712456456606014763 0ustar chriscchrisc/* * File: spells2.c * Purpose: Various assorted spell effects * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "generate.h" #include "history.h" #include "monster/mon-lore.h" #include "monster/mon-make.h" #include "monster/mon-timed.h" #include "monster/mon-util.h" #include "monster/monster.h" #include "object/slays.h" #include "object/tvalsval.h" #include "spells.h" #include "squelch.h" #include "target.h" #include "trap.h" /* * Increase players hit points, notice effects */ bool hp_player(int num) { /* Healing needed */ if (p_ptr->chp < p_ptr->mhp) { /* Gain hitpoints */ p_ptr->chp += num; /* Enforce maximum */ if (p_ptr->chp >= p_ptr->mhp) { p_ptr->chp = p_ptr->mhp; p_ptr->chp_frac = 0; } /* Redraw */ p_ptr->redraw |= (PR_HP); /* Print a nice message */ if (num < 5) msg("You feel a little better."); else if (num < 15) msg("You feel better."); else if (num < 35) msg("You feel much better."); else msg("You feel very good."); /* Notice */ return (TRUE); } /* Ignore */ return (FALSE); } /* * Heal the player by a given percentage of his wounds, or a minimum * amount, whichever is larger. * * Copied wholesale from EyAngband. */ bool heal_player(int perc, int min) { int i; /* Paranoia */ if ((perc <= 0) && (min <= 0)) return (FALSE); /* No healing needed */ if (p_ptr->chp >= p_ptr->mhp) return (FALSE); /* Figure healing level */ i = ((p_ptr->mhp - p_ptr->chp) * perc) / 100; /* Enforce minimums */ if (i < min) i = min; /* Actual healing */ return hp_player(i); } /* * Leave a "glyph of warding" which prevents monster movement */ bool warding_glyph(void) { int py = p_ptr->py; int px = p_ptr->px; if (!cave_canward(cave, py, px)) { msg("There is no clear floor on which to cast the spell."); return FALSE; } /* Create a glyph */ cave_add_ward(cave, py, px); return TRUE; } /** * Create a "glyph of warding" via a spell. * * We need to do this because the book-keeping is slightly different for * spells vs. scrolls. */ void warding_glyph_spell(void) { int py = p_ptr->py; int px = p_ptr->px; /* See if the effect works */ if (!warding_glyph()) return; /* Push objects off the grid */ if (cave->o_idx[py][px]) push_object(py, px); } /* * Array of stat "descriptions" */ static const char *desc_stat_pos[] = { "strong", "smart", "wise", "dextrous", "healthy", "cute" }; /* * Array of stat "descriptions" */ static const char *desc_stat_neg[] = { "weak", "stupid", "naive", "clumsy", "sickly", "ugly" }; /* * Lose a "point" */ bool do_dec_stat(int stat, bool perma) { bool sust = FALSE; /* Get the "sustain" */ switch (stat) { case A_STR: if (check_state(p_ptr, OF_SUST_STR, p_ptr->state.flags)) sust = TRUE; wieldeds_notice_flag(p_ptr, OF_SUST_STR); break; case A_INT: if (check_state(p_ptr, OF_SUST_INT, p_ptr->state.flags)) sust = TRUE; wieldeds_notice_flag(p_ptr, OF_SUST_INT); break; case A_WIS: if (check_state(p_ptr, OF_SUST_WIS, p_ptr->state.flags)) sust = TRUE; wieldeds_notice_flag(p_ptr, OF_SUST_WIS); break; case A_DEX: if (check_state(p_ptr, OF_SUST_DEX, p_ptr->state.flags)) sust = TRUE; wieldeds_notice_flag(p_ptr, OF_SUST_DEX); break; case A_CON: if (check_state(p_ptr, OF_SUST_CON, p_ptr->state.flags)) sust = TRUE; wieldeds_notice_flag(p_ptr, OF_SUST_CON); break; } /* Sustain */ if (sust && !perma) { /* Message */ msg("You feel very %s for a moment, but the feeling passes.", desc_stat_neg[stat]); /* Notice effect */ return (TRUE); } /* Attempt to reduce the stat */ if (player_stat_dec(p_ptr, stat, perma)) { /* Message */ msgt(MSG_DRAIN_STAT, "You feel very %s.", desc_stat_neg[stat]); /* Notice effect */ return (TRUE); } /* Nothing obvious */ return (FALSE); } /* * Restore lost "points" in a stat */ bool do_res_stat(int stat) { /* Attempt to increase */ if (res_stat(stat)) { /* Message */ msg("You feel less %s.", desc_stat_neg[stat]); /* Notice */ return (TRUE); } /* Nothing obvious */ return (FALSE); } /* * Gain a "point" in a stat */ bool do_inc_stat(int stat) { bool res; /* Restore strength */ res = res_stat(stat); /* Attempt to increase */ if (player_stat_inc(p_ptr, stat)) { /* Message */ msg("You feel very %s!", desc_stat_pos[stat]); /* Notice */ return (TRUE); } /* Restoration worked */ if (res) { /* Message */ msg("You feel less %s.", desc_stat_neg[stat]); /* Notice */ return (TRUE); } /* Nothing obvious */ return (FALSE); } /* * Identify everything being carried. * Done by a potion of "self knowledge". */ void identify_pack(void) { int i; /* Simply identify and know every item */ for (i = 0; i < ALL_INVEN_TOTAL; i++) { object_type *o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; /* Aware and Known */ if (object_is_known(o_ptr)) continue; /* Identify it */ do_ident_item(o_ptr); /* Reset loop in case the pack reordered. */ i = 0; } } /* * Hack -- Removes curse from an object. */ static void uncurse_object(object_type *o_ptr) { bitflag f[OF_SIZE]; create_mask(f, FALSE, OFT_CURSE, OFT_MAX); of_diff(o_ptr->flags, f); } /* * Removes curses from items in inventory. * * \param heavy removes heavy curses if true * * \returns number of items uncursed */ static int remove_curse_aux(bool heavy) { int i, cnt = 0; /* Attempt to uncurse items being worn */ for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL; i++) { object_type *o_ptr = &p_ptr->inventory[i]; if (!o_ptr->kind) continue; if (!cursed_p(o_ptr->flags)) continue; /* Heavily cursed items need a special spell */ if (of_has(o_ptr->flags, OF_HEAVY_CURSE) && !heavy) continue; /* Perma-cursed items can never be removed */ if (of_has(o_ptr->flags, OF_PERMA_CURSE)) continue; /* Uncurse, and update things */ uncurse_object(o_ptr); p_ptr->update |= (PU_BONUS); p_ptr->redraw |= (PR_EQUIP); /* Count the uncursings */ cnt++; } /* Return "something uncursed" */ return (cnt); } /* * Remove most curses */ bool remove_curse(void) { return (remove_curse_aux(FALSE)); } /* * Remove all curses */ bool remove_all_curse(void) { return (remove_curse_aux(TRUE)); } /* * Restores any drained experience */ bool restore_level(void) { /* Restore experience */ if (p_ptr->exp < p_ptr->max_exp) { /* Message */ msg("You feel your life energies returning."); player_exp_gain(p_ptr, p_ptr->max_exp - p_ptr->exp); /* Did something */ return (TRUE); } /* No effect */ return (FALSE); } /* * Set word of recall as appropriate */ bool set_recall(void) { /* No recall */ if (OPT(birth_no_recall) && !p_ptr->total_winner) { msg("Nothing happens."); return FALSE; } /* No recall from quest levels with force_descend */ if (OPT(birth_force_descend) && (is_quest(p_ptr->depth))) { msg("Nothing happens."); return TRUE; } /* Warn the player if they're descending to an unrecallable level */ if (OPT(birth_force_descend) && !(p_ptr->depth) && (is_quest(p_ptr->max_depth + 1))) { if (!get_check("Are you sure you want to descend? ")) { msg("You prevent the recall from taking place."); return FALSE; } } /* Activate recall */ if (!p_ptr->word_recall) { /* Reset recall depth */ if ((p_ptr->depth > 0) && (p_ptr->depth != p_ptr->max_depth)) { /* ToDo: Add a new player_type field "recall_depth" */ if (get_check("Reset recall depth? ")) p_ptr->max_depth = p_ptr->depth; } p_ptr->word_recall = randint0(20) + 15; msg("The air about you becomes charged..."); } /* Deactivate recall */ else { if (!get_check("Word of Recall is already active. Do you want to cancel it? ")) return FALSE; p_ptr->word_recall = 0; msg("A tension leaves the air around you..."); } /* Redraw status line */ p_ptr->redraw |= PR_STATUS; handle_stuff(p_ptr); return TRUE; } /*** Detection spells ***/ /* * Useful constants for the area around the player to detect. * This is instead of using circular detection spells. */ #define DETECT_DIST_X 40 /* Detect 42 grids to the left & right */ #define DETECT_DIST_Y 22 /* Detect 22 grids to the top & bottom */ /* * Map an area around the player. * * We must never attempt to map the outer dungeon walls, or we * might induce illegal cave grid references. */ void map_area(void) { int i, x, y; int x1, x2, y1, y2; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; /* Drag the co-ordinates into the dungeon */ if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; if (y2 > cave->height - 1) y2 = cave->height - 1; if (x2 > cave->width - 1) x2 = cave->width - 1; /* Scan the dungeon */ for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { /* All non-walls are "checked" */ if (!cave_seemslikewall(cave, y, x)) { if (!cave_in_bounds_fully(cave, y, x)) continue; /* Memorize normal features */ if (cave_isinteresting(cave, y, x)) { /* Memorize the object */ cave->info[y][x] |= (CAVE_MARK); cave_light_spot(cave, y, x); } /* Memorize known walls */ for (i = 0; i < 8; i++) { int yy = y + ddy_ddd[i]; int xx = x + ddx_ddd[i]; /* Memorize walls (etc) */ if (cave_seemslikewall(cave, yy, xx)) { /* Memorize the walls */ cave->info[yy][xx] |= (CAVE_MARK); cave_light_spot(cave, yy, xx); } } } } } } /* * Detect traps around the player. */ bool detect_traps(bool aware) { int y, x; int x1, x2, y1, y2; bool detect = FALSE; object_type *o_ptr; (void)aware; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan the dungeon */ for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { if (!cave_in_bounds_fully(cave, y, x)) continue; /* Detect invisible traps */ if (cave_issecrettrap(cave, y, x)) { /* Pick a trap */ pick_trap(y, x); } /* Detect traps */ if (cave_isknowntrap(cave, y, x)) { /* Hack -- Memorize */ cave->info[y][x] |= (CAVE_MARK); /* We found something to detect */ detect = TRUE; } /* Scan all objects in the grid to look for traps on chests */ for (o_ptr = get_first_object(y, x); o_ptr; o_ptr = get_next_object(o_ptr)) { /* Skip anything not a trapped chest */ if (!is_trapped_chest(o_ptr)) continue; /* Identify once */ if (!object_is_known(o_ptr)) { /* Know the trap */ object_notice_everything(o_ptr); /* Notice it */ disturb(p_ptr, 0, 0); /* We found something to detect */ detect = TRUE; } } /* Mark as trap-detected */ cave->info2[y][x] |= CAVE2_DTRAP; } } /* Rescan the map for the new dtrap edge */ for (y = y1 - 1; y < y2 + 1; y++) { for (x = x1 - 1; x < x2 + 1; x++) { if (!cave_in_bounds_fully(cave, y, x)) continue; /* see if this grid is on the edge */ if (dtrap_edge(y, x)) { cave->info2[y][x] |= CAVE2_DEDGE; } else { cave->info2[y][x] &= ~CAVE2_DEDGE; } /* Redraw */ cave_light_spot(cave, y, x); } } /* Describe */ if (detect) msg("You sense the presence of traps!"); /* Trap detection always makes you aware, even if no traps are present */ else msg("You sense no traps."); /* Mark the redraw flag */ p_ptr->redraw |= (PR_DTRAP); /* Result */ return (TRUE); } /* * Detect doors and stairs around the player. */ bool detect_doorstairs(bool aware) { int y, x; int x1, x2, y1, y2; bool doors = FALSE, stairs = FALSE; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan the dungeon */ for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { if (!cave_in_bounds_fully(cave, y, x)) continue; /* Detect secret doors */ if (cave_issecretdoor(cave, y, x)) place_closed_door(cave, y, x); /* Detect doors */ if (cave_isdoor(cave, y, x)) { /* Hack -- Memorize */ cave->info[y][x] |= (CAVE_MARK); /* Redraw */ cave_light_spot(cave, y, x); /* Obvious */ doors = TRUE; } /* Detect stairs */ if (cave_isstairs(cave, y, x)) { /* Hack -- Memorize */ cave->info[y][x] |= (CAVE_MARK); /* Redraw */ cave_light_spot(cave, y, x); /* Obvious */ stairs = TRUE; } } } /* Describe */ if (doors && !stairs) msg("You sense the presence of doors!"); else if (!doors && stairs) msg("You sense the presence of stairs!"); else if (doors && stairs) msg("You sense the presence of doors and stairs!"); else if (aware && !doors && !stairs) msg("You sense no doors or stairs."); /* Result */ return (doors || stairs); } /* * Detect all treasure around the player. */ bool detect_treasure(bool aware, bool full) { int i; int y, x; int x1, x2, y1, y2; bool gold_buried = FALSE; bool objects = FALSE; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan the dungeon */ for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { if (!cave_in_bounds_fully(cave, y, x)) continue; cave_show_vein(cave, y, x); /* Magma/Quartz + Known Gold */ if (cave_hasgoldvein(cave, y, x)) { /* Hack -- Memorize */ cave->info[y][x] |= (CAVE_MARK); /* Redraw */ cave_light_spot(cave, y, x); /* Detect */ gold_buried = TRUE; } } } /* Scan objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = object_byid(i); /* Skip dead objects */ if (!o_ptr->kind) continue; /* Skip held objects */ if (o_ptr->held_m_idx) continue; /* Location */ y = o_ptr->iy; x = o_ptr->ix; /* Only detect nearby objects */ if (x < x1 || y < y1 || x > x2 || y > y2) continue; /* Memorize it */ if (o_ptr->marked < MARK_SEEN) o_ptr->marked = full ? MARK_SEEN : MARK_AWARE; /* Redraw */ cave_light_spot(cave, y, x); /* Detect */ if (!squelch_item_ok(o_ptr) || !full) objects = TRUE; } if (gold_buried) msg("You sense the presence of buried treasure!"); if (objects) msg("You sense the presence of objects!"); if (aware && !gold_buried && !objects) msg("You sense no treasure or objects."); return gold_buried || objects; } /* * Quietly detect all buried treasure near the player. */ bool detect_close_buried_treasure(void) { int y, x; int x1, x2, y1, y2; bool gold_buried = FALSE; /* Pick a small area to map */ y1 = p_ptr->py - 3; y2 = p_ptr->py + 3; x1 = p_ptr->px - 3; x2 = p_ptr->px + 3; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan the dungeon */ for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { if (!cave_in_bounds_fully(cave, y, x)) continue; /* Notice embedded gold */ cave_show_vein(cave, y, x); /* Magma/Quartz + Known Gold */ if (cave_hasgoldvein(cave, y, x)) { /* Hack -- Memorize */ cave->info[y][x] |= (CAVE_MARK); /* Redraw */ cave_light_spot(cave, y, x); /* Detect */ gold_buried = TRUE; } } } return (gold_buried); } /* * Detect "normal" monsters around the player. */ bool detect_monsters_normal(bool aware) { int i, y, x; int x1, x2, y1, y2; bool flag = FALSE; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Skip dead monsters */ if (!m_ptr->race) continue; /* Location */ y = m_ptr->fy; x = m_ptr->fx; /* Only detect nearby monsters */ if (x < x1 || y < y1 || x > x2 || y > y2) continue; /* Detect all non-invisible, obvious monsters */ if (!rf_has(m_ptr->race->flags, RF_INVISIBLE) && !m_ptr->unaware) { /* Hack -- Detect the monster */ m_ptr->mflag |= (MFLAG_MARK | MFLAG_SHOW); /* Update the monster */ update_mon(m_ptr, FALSE); /* Detect */ flag = TRUE; } } if (flag) msg("You sense the presence of monsters!"); else if (aware && !flag) msg("You sense no monsters."); /* Result */ return flag; } /* * Detect "invisible" monsters around the player. */ bool detect_monsters_invis(bool aware) { int i, y, x; int x1, x2, y1, y2; bool flag = FALSE; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); monster_lore *l_ptr; /* Skip dead monsters */ if (!m_ptr->race) continue; l_ptr = get_lore(m_ptr->race); /* Location */ y = m_ptr->fy; x = m_ptr->fx; /* Only detect nearby objects */ if (x < x1 || y < y1 || x > x2 || y > y2) continue; /* Detect invisible monsters */ if (rf_has(m_ptr->race->flags, RF_INVISIBLE)) { /* Take note that they are invisible */ rf_on(l_ptr->flags, RF_INVISIBLE); /* Update monster recall window */ if (p_ptr->monster_race == m_ptr->race) { /* Redraw stuff */ p_ptr->redraw |= (PR_MONSTER); } /* Detect the monster */ m_ptr->mflag |= (MFLAG_MARK | MFLAG_SHOW); /* Update the monster */ update_mon(m_ptr, FALSE); /* Detect */ flag = TRUE; } } if (flag) msg("You sense the presence of invisible creatures!"); else if (aware && !flag) msg("You sense no invisible creatures."); return (flag); } /* * Detect "evil" monsters around the player. */ bool detect_monsters_evil(bool aware) { int i, y, x; int x1, x2, y1, y2; bool flag = FALSE; /* Pick an area to map */ y1 = p_ptr->py - DETECT_DIST_Y; y2 = p_ptr->py + DETECT_DIST_Y; x1 = p_ptr->px - DETECT_DIST_X; x2 = p_ptr->px + DETECT_DIST_X; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Scan monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); monster_lore *l_ptr; /* Skip dead monsters */ if (!m_ptr->race) continue; l_ptr = get_lore(m_ptr->race); /* Location */ y = m_ptr->fy; x = m_ptr->fx; /* Only detect nearby objects */ if (x < x1 || y < y1 || x > x2 || y > y2) continue; /* Detect evil monsters */ if (rf_has(m_ptr->race->flags, RF_EVIL)) { /* Take note that they are evil */ rf_on(l_ptr->flags, RF_EVIL); /* Update monster recall window */ if (p_ptr->monster_race == m_ptr->race) { /* Redraw stuff */ p_ptr->redraw |= (PR_MONSTER); } /* Detect the monster */ m_ptr->mflag |= (MFLAG_MARK | MFLAG_SHOW); /* Update the monster */ update_mon(m_ptr, FALSE); /* Detect */ flag = TRUE; } } if (flag) msg("You sense the presence of evil creatures!"); else if (aware && !flag) msg("You sense no evil creatures."); return flag; } /* * Detect all monsters on the level (used for *enlightenment* only) */ bool detect_monsters_entire_level(void) { int i; bool detect = FALSE; for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Skip dead monsters */ if (!m_ptr->race) continue; /* Detect the monster */ m_ptr->mflag |= (MFLAG_MARK | MFLAG_SHOW); /* Update the monster */ update_mon(m_ptr, FALSE); detect = TRUE; } if (detect) msg("An image of all nearby life-forms appears in your mind"); else /* Let's see who the first person is to ever see this message! */ msg("The level is devoid of life"); return detect; } /* * Detect everything */ bool detect_all(bool aware) { bool detect = FALSE; /* Detect everything */ if (detect_traps(aware)) detect = TRUE; if (detect_doorstairs(aware)) detect = TRUE; if (detect_treasure(aware, FALSE)) detect = TRUE; if (detect_monsters_invis(aware)) detect = TRUE; if (detect_monsters_normal(aware)) detect = TRUE; /* Result */ return (detect); } /* * Create stairs at the player location */ void stair_creation(void) { int py = p_ptr->py; int px = p_ptr->px; /* Only allow stairs to be created on empty floor */ if (!cave_isfloor(cave, py, px)) { msg("There is no empty floor here."); return; } /* Push objects off the grid */ if (cave->o_idx[py][px]) push_object(py, px); cave_add_stairs(cave, py, px, p_ptr->depth); } /* * Hook to specify "weapon" */ static bool item_tester_hook_weapon(const object_type *o_ptr) { switch (o_ptr->tval) { case TV_SWORD: case TV_HAFTED: case TV_POLEARM: case TV_DIGGING: case TV_BOW: case TV_BOLT: case TV_ARROW: case TV_SHOT: { return (TRUE); } } return (FALSE); } /* * Hook to specify "armour" */ static bool item_tester_hook_armour(const object_type *o_ptr) { switch (o_ptr->tval) { case TV_DRAG_ARMOR: case TV_HARD_ARMOR: case TV_SOFT_ARMOR: case TV_SHIELD: case TV_CLOAK: case TV_CROWN: case TV_HELM: case TV_BOOTS: case TV_GLOVES: { return (TRUE); } } return (FALSE); } /* * Now that object flags are changing so much, it is likely that there * will be buggy objects that are marked with IDENT_KNOWN but do not * have all flags correctly marked. This function needs to allow for * reidentifying buggy objects. */ static bool item_tester_unknown(const object_type *o_ptr) { return object_is_known(o_ptr) ? FALSE : TRUE; } /* * Used by the "enchant" function (chance of failure) */ static const int enchant_table[16] = { 0, 10, 20, 40, 80, 160, 280, 400, 550, 700, 800, 900, 950, 970, 990, 1000 }; /** * Tries to increase an items bonus score, if possible. * * \returns true if the bonus was increased */ static bool enchant_score(s16b *score, bool is_artifact) { int chance; /* Artifacts resist enchantment half the time */ if (is_artifact && randint0(100) < 50) return FALSE; /* Figure out the chance to enchant */ if (*score < 0) chance = 0; else if (*score > 15) chance = 1000; else chance = enchant_table[*score]; /* If we roll less-than-or-equal to chance, it fails */ if (randint1(1000) <= chance) return FALSE; /* Increment the score */ ++*score; return TRUE; } /** * Tries to uncurse a cursed item, if possible * * \returns true if a curse was broken */ static bool enchant_curse(object_type *o_ptr, bool is_artifact) { bitflag f[OF_SIZE]; /* Extract the flags */ object_flags(o_ptr, f); /* If the item isn't cursed (or is perma-cursed) this doesn't work */ if (!cursed_p(o_ptr->flags) || of_has(f, OF_PERMA_CURSE)) return FALSE; /* Artifacts resist enchanting curses away half the time */ if (is_artifact && randint0(100) < 50) return FALSE; /* Normal items are uncursed 25% of the tiem */ if (randint0(100) >= 25) return FALSE; /* Uncurse the item */ msg("The curse is broken!"); uncurse_object(o_ptr); return TRUE; } /** * Helper function for enchant() which tries to do the two things that * enchanting an item does, namely increasing its bonuses and breaking curses * * \returns true if a bonus was increased or a curse was broken */ static bool enchant2(object_type *o_ptr, s16b *score) { bool result = FALSE; bool is_artifact = o_ptr->artifact ? TRUE : FALSE; if (enchant_score(score, is_artifact)) result = TRUE; if (enchant_curse(o_ptr, is_artifact)) result = TRUE; return result; } /** * Enchant an item * * Revamped! Now takes item pointer, number of times to try enchanting, and a * flag of what to try enchanting. Artifacts resist enchantment some of the * time. Also, any enchantment attempt (even unsuccessful) kicks off a parallel * attempt to uncurse a cursed item. * * Note that an item can technically be enchanted all the way to +15 if you * wait a very, very, long time. Going from +9 to +10 only works about 5% of * the time, and from +10 to +11 only about 1% of the time. * * Note that this function can now be used on "piles" of items, and the larger * the pile, the lower the chance of success. * * \returns true if the item was changed in some way */ bool enchant(object_type *o_ptr, int n, int eflag) { int i, prob; bool res = FALSE; /* Large piles resist enchantment */ prob = o_ptr->number * 100; /* Missiles are easy to enchant */ if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT)) prob = prob / 20; /* Try "n" times */ for (i = 0; i < n; i++) { /* Roll for pile resistance */ if (prob > 100 && randint0(prob) >= 100) continue; /* Try the three kinds of enchantment we can do */ if ((eflag & ENCH_TOHIT) && enchant2(o_ptr, &o_ptr->to_h)) res = TRUE; if ((eflag & ENCH_TODAM) && enchant2(o_ptr, &o_ptr->to_d)) res = TRUE; if ((eflag & ENCH_TOAC) && enchant2(o_ptr, &o_ptr->to_a)) res = TRUE; } /* Failure */ if (!res) return (FALSE); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP ); /* Success */ return (TRUE); } /* * Enchant an item (in the inventory or on the floor) * Note that "num_ac" requires armour, else weapon * Returns TRUE if attempted, FALSE if cancelled */ bool enchant_spell(int num_hit, int num_dam, int num_ac) { int item; bool okay = FALSE; object_type *o_ptr; char o_name[80]; const char *q, *s; /* Assume enchant weapon */ item_tester_hook = item_tester_hook_weapon; /* Enchant armor if requested */ if (num_ac) item_tester_hook = item_tester_hook_armour; /* Get an item */ q = "Enchant which item? "; s = "You have nothing to enchant."; if (!get_item(&item, q, s, 0, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE); o_ptr = object_from_item_idx(item); /* Description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); /* Describe */ msg("%s %s glow%s brightly!", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "" : "s")); /* Enchant */ if (enchant(o_ptr, num_hit, ENCH_TOHIT)) okay = TRUE; if (enchant(o_ptr, num_dam, ENCH_TODAM)) okay = TRUE; if (enchant(o_ptr, num_ac, ENCH_TOAC)) okay = TRUE; /* Failure */ if (!okay) { flush(); /* Message */ msg("The enchantment failed."); } /* Something happened */ return (TRUE); } static bool item_tester_restore(const struct object *o) { if (o->to_d < 0 || o->to_h < 0 || o->to_a < 0) return TRUE; if (o->artifact) { if (o->to_d < o->artifact->to_d || o->to_h < o->artifact->to_h || o->to_a < o->artifact->to_a) return TRUE; } return FALSE; } /** * Restore an item to its original state, or something close. */ bool restore_item(void) { char o_name[80]; int item; object_type *o; item_tester_hook = item_tester_restore; if (!get_item(&item, "Restore which item?", "You have nothing to restore.", 0, USE_EQUIP | USE_INVEN | USE_FLOOR)) return FALSE; o = object_from_item_idx(item); /*** Restore the item (ish) ***/ /* Artifacts get replenished */ if (o->artifact) { o->to_d = o->artifact->to_d; o->to_h = o->artifact->to_h; o->to_a = o->artifact->to_a; } else { o->to_d = MAX(o->to_d, 0); o->to_h = MAX(o->to_h, 0); o->to_a = MAX(o->to_a, 0); } object_desc(o_name, sizeof(o_name), o, ODESC_BASE); msg("%s %s is mended.", ((item >= 0) ? "Your" : "The"), o_name, ((o->number > 1) ? "" : "s")); return TRUE; } /* * Identify an object in the inventory (or on the floor) * This routine does *not* automatically combine objects. * Returns TRUE if something was identified, else FALSE. */ bool ident_spell(void) { int item; object_type *o_ptr; const char *q, *s; /* Only un-id'ed items */ item_tester_hook = item_tester_unknown; /* Get an item */ q = "Identify which item? "; s = "You have nothing to identify."; if (!get_item(&item, q, s, 0, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE); o_ptr = object_from_item_idx(item); /* Identify the object */ do_ident_item(o_ptr); /* Something happened */ return (TRUE); } /** * Return TRUE if there are any objects available to identify (whether on floor or in inventory/equip. */ bool spell_identify_unknown_available(void) { int floor_list[MAX_FLOOR_STACK]; int floor_num; int i; bool unidentified_inventory = FALSE; item_tester_hook = item_tester_unknown; floor_num = scan_floor(floor_list, N_ELEMENTS(floor_list), p_ptr->py, p_ptr->px, 0x0B); for (i = 0; i < ALL_INVEN_TOTAL; i++) { if (get_item_okay(i)) { unidentified_inventory = TRUE; break; } } /* Reset the item tester to avoid bizarre behaviour of UI-only commands */ item_tester_hook = NULL; return unidentified_inventory || floor_num > 0; } /* * Hook for "get_item()". Determine if something is rechargable. */ static bool item_tester_hook_recharge(const object_type *o_ptr) { /* Recharge staves */ if (o_ptr->tval == TV_STAFF) return (TRUE); /* Recharge wands */ if (o_ptr->tval == TV_WAND) return (TRUE); /* Nope */ return (FALSE); } /* * Recharge a wand or staff from the pack or on the floor. * * It is harder to recharge high level, and highly charged wands. * * XXX XXX XXX Beware of "sliding index errors". * * Should probably not "destroy" over-charged items, unless we * "replace" them by, say, a broken stick or some such. The only * reason this is okay is because "scrolls of recharging" appear * BEFORE all staves/wands in the inventory. Note that the * new "auto_sort_pack" option would correctly handle replacing * the "broken" wand with any other item (i.e. a broken stick). */ bool recharge(int spell_strength) { int i, t, item, lev; object_type *o_ptr; const char *q, *s; /* Only accept legal items */ item_tester_hook = item_tester_hook_recharge; /* Get an item */ q = "Recharge which item? "; s = "You have nothing to recharge."; if (!get_item(&item, q, s, 0, (USE_INVEN | USE_FLOOR))) return (FALSE); o_ptr = object_from_item_idx(item); /* Extract the object "level" */ lev = o_ptr->kind->level; /* * Chance of failure = 1 time in * [Spell_strength + 100 - item_level - 10 * charge_per_item]/15 */ i = (spell_strength + 100 - lev - (10 * (o_ptr->pval[DEFAULT_PVAL] / o_ptr->number))) / 15; /* Back-fire */ if ((i <= 1) || one_in_(i)) { msg("The recharge backfires!"); msg("There is a bright flash of light."); /* Reduce the charges of rods/wands/staves */ reduce_charges(o_ptr, 1); /* Reduce and describe inventory */ if (item >= 0) { inven_item_increase(item, -1); inven_item_describe(item); inven_item_optimize(item); } /* Reduce and describe floor item */ else { floor_item_increase(0 - item, -1); floor_item_describe(0 - item); floor_item_optimize(0 - item); } } /* Recharge */ else { /* Extract a "power" */ t = (spell_strength / (lev + 2)) + 1; /* Recharge based on the power */ if (t > 0) o_ptr->pval[DEFAULT_PVAL] += 2 + randint1(t); /* We no longer think the item is empty */ o_ptr->ident &= ~(IDENT_EMPTY); } /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN); /* Something was done */ return (TRUE); } /* * Apply a "project()" directly to all viewable monsters * * Note that affected monsters are NOT auto-tracked by this usage. */ bool project_los(int typ, int dam, bool obvious) { int i, x, y; int flg = PROJECT_JUMP | PROJECT_KILL | PROJECT_HIDE; if (obvious) flg |= PROJECT_AWARE; /* Affect all (nearby) monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Paranoia -- Skip dead monsters */ if (!m_ptr->race) continue; /* Location */ y = m_ptr->fy; x = m_ptr->fx; /* Require line of sight */ if (!player_has_los_bold(y, x)) continue; /* Jump directly to the target monster */ if (project(-1, 0, y, x, dam, typ, flg)) obvious = TRUE; } /* Result */ return (obvious); } /* * Speed monsters */ bool speed_monsters(void) { return (project_los(GF_OLD_SPEED, 50, FALSE)); } /* * Slow monsters */ bool slow_monsters(void) { return (project_los(GF_OLD_SLOW, 20, FALSE)); } /* * Sleep monsters */ bool sleep_monsters(bool aware) { return (project_los(GF_OLD_SLEEP, p_ptr->lev, aware)); } /* * Confuse monsters */ bool confuse_monsters(bool aware) { return (project_los(GF_OLD_CONF, p_ptr->lev, aware)); } /* * Banish evil monsters */ bool banish_evil(int dist) { return (project_los(GF_AWAY_EVIL, dist, FALSE)); } /* * Turn undead */ bool turn_undead(bool aware) { return (project_los(GF_TURN_UNDEAD, p_ptr->lev, aware)); } /* * Dispel undead monsters */ bool dispel_undead(int dam) { return (project_los(GF_DISP_UNDEAD, dam, FALSE)); } /* * Dispel evil monsters */ bool dispel_evil(int dam) { return (project_los(GF_DISP_EVIL, dam, FALSE)); } /* * Dispel all monsters */ bool dispel_monsters(int dam) { return (project_los(GF_DISP_ALL, dam, FALSE)); } /* * Wake up all monsters, and speed up "los" monsters. */ void aggravate_monsters(struct monster *who) { int i; bool sleep = FALSE; /* Aggravate everyone nearby */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Paranoia -- Skip dead monsters */ if (!m_ptr->race) continue; /* Skip aggravating monster (or player) */ if (m_ptr == who) continue; /* Wake up nearby sleeping monsters */ if ((m_ptr->cdis < MAX_SIGHT * 2) && m_ptr->m_timed[MON_TMD_SLEEP]) { mon_clear_timed(m_ptr, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, FALSE); sleep = TRUE; } /* Speed up monsters in line of sight */ if (player_has_los_bold(m_ptr->fy, m_ptr->fx)) { mon_inc_timed(m_ptr, MON_TMD_FAST, 25, MON_TMD_FLG_NOTIFY, FALSE); if (is_mimicking(m_ptr)) { become_aware(m_ptr); } } } /* Messages */ if (sleep) msg("You hear a sudden stirring in the distance!"); } /* * Delete all non-unique monsters of a given "type" from the level */ bool banishment(void) { int i; unsigned dam = 0; struct keypress typ; if (!get_com("Choose a monster race (by symbol) to banish: ", &typ)) return FALSE; /* Delete the monsters of that "type" */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Paranoia -- Skip dead monsters */ if (!m_ptr->race) continue; /* Hack -- Skip Unique Monsters */ if (rf_has(m_ptr->race->flags, RF_UNIQUE)) continue; /* Skip "wrong" monsters */ if (!char_matches_key(m_ptr->race->d_char, typ.code)) continue; /* Delete the monster */ delete_monster_idx(i); /* Take some damage */ dam += randint1(4); } /* Hurt the player */ take_hit(p_ptr, dam, "the strain of casting Banishment"); /* Update monster list window */ p_ptr->redraw |= PR_MONLIST; /* Success */ return TRUE; } /* * Delete all nearby (non-unique) monsters */ bool mass_banishment(void) { int i; unsigned dam = 0; bool result = FALSE; /* Delete the (nearby) monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Paranoia -- Skip dead monsters */ if (!m_ptr->race) continue; /* Hack -- Skip unique monsters */ if (rf_has(m_ptr->race->flags, RF_UNIQUE)) continue; /* Skip distant monsters */ if (m_ptr->cdis > MAX_SIGHT) continue; /* Delete the monster */ delete_monster_idx(i); /* Take some damage */ dam += randint1(3); } /* Hurt the player */ take_hit(p_ptr, dam, "the strain of casting Mass Banishment"); /* Calculate result */ result = (dam > 0) ? TRUE : FALSE; /* Update monster list window */ if (result) p_ptr->redraw |= PR_MONLIST; return (result); } /* * Probe nearby monsters */ bool probing(void) { int i; bool probe = FALSE; /* Probe all (nearby) monsters */ for (i = 1; i < cave_monster_max(cave); i++) { monster_type *m_ptr = cave_monster(cave, i); /* Paranoia -- Skip dead monsters */ if (!m_ptr->race) continue; /* Require line of sight */ if (!player_has_los_bold(m_ptr->fy, m_ptr->fx)) continue; /* Probe visible monsters */ if (m_ptr->ml) { char m_name[80]; /* Start the message */ if (!probe) msg("Probing..."); /* Get "the monster" or "something" */ monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_IND_HID | MDESC_CAPITAL); /* Describe the monster */ msg("%s has %d hit points.", m_name, m_ptr->hp); /* Learn all of the non-spell, non-treasure flags */ lore_do_probe(m_ptr); /* Probe worked */ probe = TRUE; } } /* Done */ if (probe) { msg("That's all."); } /* Result */ return (probe); } /* * The spell of destruction * * This spell "deletes" monsters (instead of "killing" them). * * Later we may use one function for both "destruction" and * "earthquake" by using the "full" to select "destruction". */ void destroy_area(int y1, int x1, int r, bool full) { int y, x, k; bool flag = FALSE; /* Unused parameter */ (void)full; /* No effect in town */ if (!p_ptr->depth) { msg("The ground shakes for a moment."); return; } /* Big area of affect */ for (y = (y1 - r); y <= (y1 + r); y++) { for (x = (x1 - r); x <= (x1 + r); x++) { /* Skip illegal grids */ if (!cave_in_bounds_fully(cave, y, x)) continue; /* Extract the distance */ k = distance(y1, x1, y, x); /* Stay in the circle of death */ if (k > r) continue; /* Lose room and vault */ cave->info[y][x] &= ~(CAVE_ROOM | CAVE_VAULT); /* Lose light */ cave->info[y][x] &= ~(CAVE_GLOW); cave_light_spot(cave, y, x); /* Hack -- Notice player affect */ if (cave->m_idx[y][x] < 0) { /* Hurt the player later */ flag = TRUE; /* Do not hurt this grid */ continue; } /* Hack -- Skip the epicenter */ if ((y == y1) && (x == x1)) continue; /* Delete the monster (if any) */ delete_monster(y, x); /* Don't remove stairs */ if (cave_isstairs(cave, y, x)) continue; /* Lose knowledge (keeping knowledge of stairs) */ cave->info[y][x] &= ~(CAVE_MARK); /* Destroy any grid that isn't a permament wall */ if (!cave_isperm(cave, y, x)) { /* Delete objects */ delete_object(y, x); cave_destroy(cave, y, x); } } } /* Hack -- Affect player */ if (flag) { /* Message */ msg("There is a searing blast of light!"); /* Blind the player */ wieldeds_notice_flag(p_ptr, OF_RES_LIGHT); if (!check_state(p_ptr, OF_RES_LIGHT, p_ptr->state.flags)) { /* Become blind */ (void)player_inc_timed(p_ptr, TMD_BLIND, 10 + randint1(10), TRUE, TRUE); } } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Fully update the flow */ p_ptr->update |= (PU_FORGET_FLOW | PU_UPDATE_FLOW); /* Redraw monster list */ p_ptr->redraw |= (PR_MONLIST | PR_ITEMLIST); } /* * Induce an "earthquake" of the given radius at the given location. * * This will turn some walls into floors and some floors into walls. * * The player will take damage and "jump" into a safe grid if possible, * otherwise, he will "tunnel" through the rubble instantaneously. * * Monsters will take damage, and "jump" into a safe grid if possible, * otherwise they will be "buried" in the rubble, disappearing from * the level in the same way that they do when banished. * * Note that players and monsters (except eaters of walls and passers * through walls) will never occupy the same grid as a wall (or door). */ void earthquake(int cy, int cx, int r) { int py = p_ptr->py; int px = p_ptr->px; int i, y, x, yy, xx, dy, dx; int damage = 0; int sn = 0, sy = 0, sx = 0; bool hurt = FALSE; bool map[32][32]; /* No effect in town */ if (!p_ptr->depth) { msg("The ground shakes for a moment."); return; } /* Paranoia -- Enforce maximum range */ if (r > 12) r = 12; /* Clear the "maximal blast" area */ for (y = 0; y < 32; y++) { for (x = 0; x < 32; x++) { map[y][x] = FALSE; } } /* Check around the epicenter */ for (dy = -r; dy <= r; dy++) { for (dx = -r; dx <= r; dx++) { /* Extract the location */ yy = cy + dy; xx = cx + dx; /* Skip illegal grids */ if (!cave_in_bounds_fully(cave, yy, xx)) continue; /* Skip distant grids */ if (distance(cy, cx, yy, xx) > r) continue; /* Lose room and vault */ cave->info[yy][xx] &= ~(CAVE_ROOM | CAVE_VAULT); /* Lose light and knowledge */ cave->info[yy][xx] &= ~(CAVE_GLOW | CAVE_MARK); /* Skip the epicenter */ if (!dx && !dy) continue; /* Skip most grids */ if (randint0(100) < 85) continue; /* Damage this grid */ map[16+yy-cy][16+xx-cx] = TRUE; /* Hack -- Take note of player damage */ if ((yy == py) && (xx == px)) hurt = TRUE; } } /* First, affect the player (if necessary) */ if (hurt) { /* Check around the player */ for (i = 0; i < 8; i++) { /* Get the location */ y = py + ddy_ddd[i]; x = px + ddx_ddd[i]; /* Skip non-empty grids */ if (!cave_isempty(cave, y, x)) continue; /* Important -- Skip "quake" grids */ if (map[16+y-cy][16+x-cx]) continue; /* Count "safe" grids, apply the randomizer */ if ((++sn > 1) && (randint0(sn) != 0)) continue; /* Save the safe location */ sy = y; sx = x; } /* Random message */ switch (randint1(3)) { case 1: { msg("The cave ceiling collapses!"); break; } case 2: { msg("The cave floor twists in an unnatural way!"); break; } default: { msg("The cave quakes!"); msg("You are pummeled with debris!"); break; } } /* Hurt the player a lot */ if (!sn) { /* Message and damage */ msg("You are severely crushed!"); damage = 300; } /* Destroy the grid, and push the player to safety */ else { /* Calculate results */ switch (randint1(3)) { case 1: { msg("You nimbly dodge the blast!"); damage = 0; break; } case 2: { msg("You are bashed by rubble!"); damage = damroll(10, 4); (void)player_inc_timed(p_ptr, TMD_STUN, randint1(50), TRUE, TRUE); break; } case 3: { msg("You are crushed between the floor and ceiling!"); damage = damroll(10, 4); (void)player_inc_timed(p_ptr, TMD_STUN, randint1(50), TRUE, TRUE); break; } } /* Move player */ monster_swap(py, px, sy, sx); } /* Take some damage */ if (damage) take_hit(p_ptr, damage, "an earthquake"); } /* Examine the quaked region */ for (dy = -r; dy <= r; dy++) { for (dx = -r; dx <= r; dx++) { /* Extract the location */ yy = cy + dy; xx = cx + dx; /* Skip unaffected grids */ if (!map[16+yy-cy][16+xx-cx]) continue; /* Process monsters */ if (cave->m_idx[yy][xx] > 0) { monster_type *m_ptr = cave_monster_at(cave, yy, xx); /* Most monsters cannot co-exist with rock */ if (!flags_test(m_ptr->race->flags, RF_SIZE, RF_KILL_WALL, RF_PASS_WALL, FLAG_END)) { char m_name[80]; /* Assume not safe */ sn = 0; /* Monster can move to escape the wall */ if (!rf_has(m_ptr->race->flags, RF_NEVER_MOVE)) { /* Look for safety */ for (i = 0; i < 8; i++) { /* Get the grid */ y = yy + ddy_ddd[i]; x = xx + ddx_ddd[i]; /* Skip non-empty grids */ if (!cave_isempty(cave, y, x)) continue; /* Hack -- no safety on glyph of warding */ if (cave_iswarded(cave, y, x)) continue; /* Important -- Skip "quake" grids */ if (map[16+y-cy][16+x-cx]) continue; /* Count "safe" grids, apply the randomizer */ if ((++sn > 1) && (randint0(sn) != 0)) continue; /* Save the safe grid */ sy = y; sx = x; } } /* Describe the monster */ monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_STANDARD); /* Scream in pain */ msg("%s wails out in pain!", m_name); /* Take damage from the quake */ damage = (sn ? damroll(4, 8) : (m_ptr->hp + 1)); /* Monster is certainly awake */ mon_clear_timed(m_ptr, MON_TMD_SLEEP, MON_TMD_FLG_NOMESSAGE, FALSE); /* If the quake finished the monster off, show message */ if (m_ptr->hp < damage && m_ptr->hp >= 0) msg("%s is embedded in the rock!", m_name); /* Apply damage directly */ m_ptr->hp -= damage; /* Delete (not kill) "dead" monsters */ if (m_ptr->hp < 0) { /* Delete the monster */ delete_monster(yy, xx); /* No longer safe */ sn = 0; } /* Hack -- Escape from the rock */ if (sn) { /* Move the monster */ monster_swap(yy, xx, sy, sx); } } } } } /* XXX XXX XXX */ /* New location */ py = p_ptr->py; px = p_ptr->px; /* Important -- no wall on player */ map[16+py-cy][16+px-cx] = FALSE; /* Examine the quaked region */ for (dy = -r; dy <= r; dy++) { for (dx = -r; dx <= r; dx++) { /* Extract the location */ yy = cy + dy; xx = cx + dx; /* ignore invalid grids */ if (!cave_in_bounds_fully(cave, yy, xx)) continue; /* Note unaffected grids for light changes, etc. */ if (!map[16+yy-cy][16+xx-cx]) { cave_light_spot(cave, yy, xx); } /* Destroy location (if valid) */ else if (cave_valid_bold(yy, xx)) { delete_object(yy, xx); cave_earthquake(cave, yy, xx); } } } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Fully update the flow */ p_ptr->update |= (PU_FORGET_FLOW | PU_UPDATE_FLOW); /* Update the health bar */ p_ptr->redraw |= (PR_HEALTH); /* Window stuff */ p_ptr->redraw |= (PR_MONLIST | PR_ITEMLIST); } /* * This routine will Perma-Light all grids in the set passed in. * * This routine is used (only) by "light_room(..., LIGHT)" * * Dark grids are illuminated. * * Also, process all affected monsters. * * SMART monsters always wake up when illuminated * NORMAL monsters wake up 1/4 the time when illuminated * STUPID monsters wake up 1/10 the time when illuminated */ static void cave_light(struct point_set *ps) { int i; /* Apply flag changes */ for (i = 0; i < ps->n; i++) { int y = ps->pts[i].y; int x = ps->pts[i].x; /* Perma-Light */ cave->info[y][x] |= (CAVE_GLOW); } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Update stuff */ update_stuff(p_ptr); /* Process the grids */ for (i = 0; i < ps->n; i++) { int y = ps->pts[i].y; int x = ps->pts[i].x; /* Redraw the grid */ cave_light_spot(cave, y, x); /* Process affected monsters */ if (cave->m_idx[y][x] > 0) { int chance = 25; monster_type *m_ptr = cave_monster_at(cave, y, x); /* Stupid monsters rarely wake up */ if (rf_has(m_ptr->race->flags, RF_STUPID)) chance = 10; /* Smart monsters always wake up */ if (rf_has(m_ptr->race->flags, RF_SMART)) chance = 100; /* Sometimes monsters wake up */ if (m_ptr->m_timed[MON_TMD_SLEEP] && (randint0(100) < chance)) { /* Wake up! */ mon_clear_timed(m_ptr, MON_TMD_SLEEP, MON_TMD_FLG_NOTIFY, FALSE); } } } } /* * This routine will "darken" all grids in the set passed in. * * In addition, some of these grids will be "unmarked". * * This routine is used (only) by "light_room(..., UNLIGHT)" */ static void cave_unlight(struct point_set *ps) { int i; /* Apply flag changes */ for (i = 0; i < ps->n; i++) { int y = ps->pts[i].y; int x = ps->pts[i].x; /* Darken the grid */ cave->info[y][x] &= ~(CAVE_GLOW); /* Hack -- Forget "boring" grids */ if (!cave_isinteresting(cave, y, x)) cave->info[y][x] &= ~(CAVE_MARK); } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Update stuff */ update_stuff(p_ptr); /* Process the grids */ for (i = 0; i < ps->n; i++) { int y = ps->pts[i].y; int x = ps->pts[i].x; /* Redraw the grid */ cave_light_spot(cave, y, x); } } /* * Aux function -- see below */ static void cave_room_aux(struct point_set *seen, int y, int x) { if (point_set_contains(seen, y, x)) return; if (!cave_isroom(cave, y, x)) return; /* Add it to the "seen" set */ add_to_point_set(seen, y, x); } #define LIGHT TRUE #define UNLIGHT FALSE /* * Illuminate or darken any room containing the given location. */ static void light_room(int y1, int x1, bool light) { int i, x, y; struct point_set *ps; ps = point_set_new(200); /* Add the initial grid */ cave_room_aux(ps, y1, x1); /* While grids are in the queue, add their neighbors */ for (i = 0; i < ps->n; i++) { x = ps->pts[i].x, y = ps->pts[i].y; /* Walls get lit, but stop light */ if (!cave_ispassable(cave, y, x)) continue; /* Spread adjacent */ cave_room_aux(ps, y + 1, x); cave_room_aux(ps, y - 1, x); cave_room_aux(ps, y, x + 1); cave_room_aux(ps, y, x - 1); /* Spread diagonal */ cave_room_aux(ps, y + 1, x + 1); cave_room_aux(ps, y - 1, x - 1); cave_room_aux(ps, y - 1, x + 1); cave_room_aux(ps, y + 1, x - 1); } /* Now, lighten or darken them all at once */ if (light) { cave_light(ps); } else { cave_unlight(ps); } point_set_dispose(ps); } /* * Hack -- call light around the player * Affect all monsters in the projection radius */ bool light_area(int dam, int rad) { int py = p_ptr->py; int px = p_ptr->px; int flg = PROJECT_GRID | PROJECT_KILL; /* Hack -- Message */ if (!p_ptr->timed[TMD_BLIND]) msg("You are surrounded by a white light."); /* Hook into the "project()" function */ (void)project(-1, rad, py, px, dam, GF_LIGHT_WEAK, flg); /* Light up the room */ light_room(py, px, LIGHT); /* Assume seen */ return (TRUE); } /* * Hack -- call darkness around the player * Affect all monsters in the projection radius */ bool unlight_area(int dam, int rad) { int py = p_ptr->py; int px = p_ptr->px; int flg = PROJECT_GRID | PROJECT_KILL; /* Hack -- Message */ if (!p_ptr->timed[TMD_BLIND]) { msg("Darkness surrounds you."); } /* Hook into the "project()" function */ (void)project(-1, rad, py, px, dam, GF_DARK_WEAK, flg); /* Darken the room */ light_room(py, px, UNLIGHT); /* Assume seen */ return (TRUE); } /* * Cast a ball spell * Stop if we hit a monster, act as a "ball" * Allow "target" mode to pass over monsters * Affect grids, objects, and monsters */ bool fire_ball(int typ, int dir, int dam, int rad) { int py = p_ptr->py; int px = p_ptr->px; s16b ty, tx; int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; /* Use the given direction */ ty = py + 99 * ddy[dir]; tx = px + 99 * ddx[dir]; /* Hack -- Use an actual "target" */ if ((dir == 5) && target_okay()) { flg &= ~(PROJECT_STOP); target_get(&tx, &ty); } /* Analyze the "dir" and the "target". Hurt items on floor. */ return (project(-1, rad, ty, tx, dam, typ, flg)); } /* * Cast multiple non-jumping ball spells at the same target. * * Targets absolute coordinates instead of a specific monster, so that * the death of the monster doesn't change the target's location. */ bool fire_swarm(int num, int typ, int dir, int dam, int rad) { bool noticed = FALSE; int py = p_ptr->py; int px = p_ptr->px; s16b ty, tx; int flg = PROJECT_THRU | PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; /* Use the given direction */ ty = py + 99 * ddy[dir]; tx = px + 99 * ddx[dir]; /* Hack -- Use an actual "target" (early detonation) */ if ((dir == 5) && target_okay()) target_get(&tx, &ty); while (num--) { /* Analyze the "dir" and the "target". Hurt items on floor. */ if (project(-1, rad, ty, tx, dam, typ, flg)) noticed = TRUE; } return noticed; } /* * Hack -- apply a "projection()" in a direction (or at the target) */ static bool project_hook(int typ, int dir, int dam, int flg) { int py = p_ptr->py; int px = p_ptr->px; s16b ty, tx; /* Pass through the target if needed */ flg |= (PROJECT_THRU); /* Use the given direction */ ty = py + ddy[dir]; tx = px + ddx[dir]; /* Hack -- Use an actual "target" */ if ((dir == 5) && target_okay()) target_get(&tx, &ty); /* Analyze the "dir" and the "target", do NOT explode */ return (project(-1, 0, ty, tx, dam, typ, flg)); } /* * Cast a bolt spell * Stop if we hit a monster, as a "bolt" * Affect monsters (not grids or objects) */ bool fire_bolt(int typ, int dir, int dam) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(typ, dir, dam, flg)); } /* * Cast a beam spell * Pass through monsters, as a "beam" * Affect monsters (not grids or objects) */ bool fire_beam(int typ, int dir, int dam) { int flg = PROJECT_BEAM | PROJECT_KILL; return (project_hook(typ, dir, dam, flg)); } /* * Cast a bolt spell, or rarely, a beam spell */ bool fire_bolt_or_beam(int prob, int typ, int dir, int dam) { if (randint0(100) < prob) { return (fire_beam(typ, dir, dam)); } else { return (fire_bolt(typ, dir, dam)); } } /* * Some of the old functions */ bool light_line(int dir) { int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_KILL; return (project_hook(GF_LIGHT_WEAK, dir, damroll(6, 8), flg)); } bool strong_light_line(int dir) { int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_KILL; return (project_hook(GF_LIGHT, dir, damroll(10, 8), flg)); } bool drain_life(int dir, int dam) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_OLD_DRAIN, dir, dam, flg)); } bool wall_to_mud(int dir) { int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; return (project_hook(GF_KILL_WALL, dir, 20 + randint1(30), flg)); } bool destroy_door(int dir) { int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM; return (project_hook(GF_KILL_DOOR, dir, 0, flg)); } bool disarm_trap(int dir) { int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM; return (project_hook(GF_KILL_TRAP, dir, 0, flg)); } bool heal_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_OLD_HEAL, dir, damroll(4, 6), flg)); } bool speed_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_OLD_SPEED, dir, 100, flg)); } bool slow_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_OLD_SLOW, dir, 20, flg)); } bool sleep_monster(int dir, bool aware) { int flg = PROJECT_STOP | PROJECT_KILL; if (aware) flg |= PROJECT_AWARE; return (project_hook(GF_OLD_SLEEP, dir, p_ptr->lev, flg)); } bool confuse_monster(int dir, int plev, bool aware) { int flg = PROJECT_STOP | PROJECT_KILL; if (aware) flg |= PROJECT_AWARE; return (project_hook(GF_OLD_CONF, dir, plev, flg)); } bool poly_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_OLD_POLY, dir, p_ptr->lev, flg)); } bool clone_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_OLD_CLONE, dir, 0, flg)); } bool fear_monster(int dir, int plev, bool aware) { int flg = PROJECT_STOP | PROJECT_KILL; if (aware) flg |= PROJECT_AWARE; return (project_hook(GF_TURN_ALL, dir, plev, flg)); } bool teleport_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_AWAY_ALL, dir, MAX_SIGHT * 5, flg)); } /* * Hooks -- affect adjacent grids (radius 1 ball attack) */ bool door_creation(void) { int py = p_ptr->py; int px = p_ptr->px; int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; return (project(-1, 1, py, px, 0, GF_MAKE_DOOR, flg)); } bool trap_creation(void) { int py = p_ptr->py; int px = p_ptr->px; int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; return (project(-1, 1, py, px, 0, GF_MAKE_TRAP, flg)); } bool destroy_doors_touch(void) { int py = p_ptr->py; int px = p_ptr->px; int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; return (project(-1, 1, py, px, 0, GF_KILL_DOOR, flg)); } bool sleep_monsters_touch(bool aware) { int py = p_ptr->py; int px = p_ptr->px; int flg = PROJECT_KILL | PROJECT_HIDE; if (aware) flg |= PROJECT_AWARE; return (project(-1, 1, py, px, p_ptr->lev, GF_OLD_SLEEP, flg)); } /* * Curse the players armor */ bool curse_armor(void) { object_type *o_ptr; char o_name[80]; /* Curse the body armor */ o_ptr = &p_ptr->inventory[INVEN_BODY]; /* Nothing to curse */ if (!o_ptr->kind) return (FALSE); /* Describe */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_FULL); /* Attempt a saving throw for artifacts */ if (o_ptr->artifact && (randint0(100) < 50)) { /* Cool */ msg("A %s tries to %s, but your %s resists the effects!", "terrible black aura", "surround your armor", o_name); } /* not artifact or failed save... */ else { /* Oops */ msg("A terrible black aura blasts your %s!", o_name); /* Take down bonus a wee bit */ o_ptr->to_a -= randint1(3); /* Curse it */ flags_set(o_ptr->flags, OF_SIZE, OF_LIGHT_CURSE, OF_HEAVY_CURSE, FLAG_END); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Recalculate mana */ p_ptr->update |= (PU_MANA); /* Window stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } return (TRUE); } /* * Curse the players weapon */ bool curse_weapon(void) { object_type *o_ptr; char o_name[80]; /* Curse the weapon */ o_ptr = &p_ptr->inventory[INVEN_WIELD]; /* Nothing to curse */ if (!o_ptr->kind) return (FALSE); /* Describe */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_FULL); /* Attempt a saving throw */ if (o_ptr->artifact && (randint0(100) < 50)) { /* Cool */ msg("A %s tries to %s, but your %s resists the effects!", "terrible black aura", "surround your weapon", o_name); } /* not artifact or failed save... */ else { /* Oops */ msg("A terrible black aura blasts your %s!", o_name); /* Hurt it a bit */ o_ptr->to_h = 0 - randint1(3); o_ptr->to_d = 0 - randint1(3); /* Curse it */ flags_set(o_ptr->flags, OF_SIZE, OF_LIGHT_CURSE, OF_HEAVY_CURSE, FLAG_END); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Recalculate mana */ p_ptr->update |= (PU_MANA); /* Window stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } /* Notice */ return (TRUE); } /* * Brand weapons (or ammo) * * Turns the (non-magical) object into an ego-item of 'brand_type'. */ void brand_object(object_type *o_ptr, int brand_type) { int i, j; ego_item_type *e_ptr; bool ok = FALSE; /* you can never modify artifacts / ego-items */ /* you can never modify cursed / worthless items */ if (o_ptr->kind && !cursed_p(o_ptr->flags) && o_ptr->kind->cost && !o_ptr->artifact && !o_ptr->ego) { char o_name[80]; bitflag f[OF_SIZE]; const char *brand[SL_MAX]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); of_wipe(f); of_on(f, brand_type); i = list_slays(f, f, NULL, brand, NULL, FALSE); /* Describe */ msg("The %s %s surrounded with an aura of %s.", o_name, (o_ptr->number > 1) ? "are" : "is", brand[0]); /* Get the right ego type for the object - the first one * with the correct flag for this type of object - we assume * that anyone adding new ego types adds them after the * existing ones */ for (i = 0; i < z_info->e_max; i++) { e_ptr = &e_info[i]; if (of_has(e_ptr->flags, brand_type)) { for (j = 0; j < EGO_TVALS_MAX; j++) if ((o_ptr->tval == e_ptr->tval[j]) && (o_ptr->sval >= e_ptr->min_sval[j]) && (o_ptr->sval <= e_ptr->max_sval[j])) ok = TRUE; } if (ok) break; } o_ptr->ego = &e_info[i]; ego_apply_magic(o_ptr, 0); object_notice_ego(o_ptr); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Window stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); /* Enchant */ enchant(o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM); } else { flush(); msg("The branding failed."); } } /* * Brand the current weapon */ void brand_weapon(void) { object_type *o_ptr; bitflag f[OF_SIZE]; const struct slay *s_ptr; o_ptr = &p_ptr->inventory[INVEN_WIELD]; /* Select a brand */ flags_init(f, OF_SIZE, OF_BRAND_FIRE, OF_BRAND_COLD, FLAG_END); s_ptr = random_slay(f); /* Brand the weapon */ brand_object(o_ptr, s_ptr->object_flag); } /* * Hook to specify "ammo" */ static bool item_tester_hook_ammo(const object_type *o_ptr) { switch (o_ptr->tval) { case TV_BOLT: case TV_ARROW: case TV_SHOT: { return (TRUE); } } return (FALSE); } /* * Brand some (non-magical) ammo */ bool brand_ammo(void) { int item; object_type *o_ptr; const char *q, *s; const struct slay *s_ptr; bitflag f[OF_SIZE]; /* Only accept ammo */ item_tester_hook = item_tester_hook_ammo; /* Get an item */ q = "Brand which kind of ammunition? "; s = "You have nothing to brand."; if (!get_item(&item, q, s, 0, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE); o_ptr = object_from_item_idx(item); /* Select the brand */ flags_init(f, OF_SIZE, OF_BRAND_FIRE, OF_BRAND_COLD, OF_BRAND_POIS, FLAG_END); s_ptr = random_slay(f); /* Brand the ammo */ brand_object(o_ptr, s_ptr->object_flag); /* Done */ return (TRUE); } /* * Enchant some (non-magical) bolts */ bool brand_bolts(void) { int item; object_type *o_ptr; const char *q, *s; /* Restrict choices to bolts */ item_tester_tval = TV_BOLT; /* Get an item */ q = "Brand which bolts? "; s = "You have no bolts to brand."; if (!get_item(&item, q, s, 0, (USE_INVEN | USE_FLOOR))) return (FALSE); o_ptr = object_from_item_idx(item); /* Brand the bolts */ brand_object(o_ptr, OF_BRAND_FIRE); /* Done */ return (TRUE); } /* * Hack -- activate the ring of power */ void ring_of_power(int dir) { /* Pick a random effect */ switch (randint1(10)) { case 1: case 2: { /* Message */ msg("You are surrounded by a malignant aura."); /* Decrease all stats (permanently) */ player_stat_dec(p_ptr, A_STR, TRUE); player_stat_dec(p_ptr, A_INT, TRUE); player_stat_dec(p_ptr, A_WIS, TRUE); player_stat_dec(p_ptr, A_DEX, TRUE); player_stat_dec(p_ptr, A_CON, TRUE); /* Lose some experience (permanently) */ player_exp_lose(p_ptr, p_ptr->exp / 4, TRUE); break; } case 3: { /* Message */ msg("You are surrounded by a powerful aura."); /* Dispel monsters */ dispel_monsters(1000); break; } case 4: case 5: case 6: { /* Mana Ball */ fire_ball(GF_MANA, dir, 300, 3); break; } case 7: case 8: case 9: case 10: { /* Mana Bolt */ fire_bolt(GF_MANA, dir, 250); break; } } } /* * Identify an item. */ void do_ident_item(object_type *o_ptr) { char o_name[80]; u32b msg_type = 0; int i, index; bool bad = TRUE; object_type *original = ZNEW(object_type); /* Identify and apply autoinscriptions. We use o_ptr here since it points to the inventory * slot that the real object is in. o_ptr does NOT point to the object data itself. */ object_flavor_aware(o_ptr); object_notice_everything(o_ptr); apply_autoinscription(o_ptr); /* Set squelch flag */ p_ptr->notice |= PN_SQUELCH; /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Window stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); /* Create a copy of the object for later reference, since o_ptr will remain the same after * combinging and reordering. */ object_copy(original, o_ptr); /* Force inventory cleanup so that we can display updated slot information in the message. */ combine_pack(); reorder_pack(); sort_quiver(); /* Description */ object_desc(o_name, sizeof(o_name), original, ODESC_PREFIX | ODESC_FULL); /* Determine the message type. */ /* CC: we need to think more carefully about how we define "bad" with * multiple pvals - currently using "all nonzero pvals < 0" */ for (i = 0; i < original->num_pvals; i++) if (original->pval[i] > 0) bad = FALSE; if (bad) msg_type = MSG_IDENT_BAD; else if (original->artifact) msg_type = MSG_IDENT_ART; else if (original->ego) msg_type = MSG_IDENT_EGO; else msg_type = MSG_GENERIC; /* Log artifacts to the history list. */ if (original->artifact) history_add_artifact(original->artifact, TRUE, TRUE); /* Get the index of the inventory slot that our real original object is in. */ index = inventory_index_matching_object(original); FREE(original); /* Describe */ if (index >= INVEN_WIELD) { /* Format and capitalise */ char *msg = format("%s: %s (%c).", describe_use(index), o_name, index_to_label(index)); my_strcap(msg); msgt(msg_type, msg); } else if (index >= 0) { msgt(msg_type, "In your pack: %s (%c).", o_name, index_to_label(index)); } else { msgt(msg_type, "On the ground: %s.", o_name); } } angband-3.5.1/src/grafmode.h0000644000175000017500000000356012456456606015170 0ustar chriscchrisc/* * File: grafmode.h * Purpose: load a list of possible graphics modes. * * Copyright (c) 2011 Brett Reid * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef INCLUDED_GRAFMODE_H #define INCLUDED_GRAFMODE_H #include "h-basic.h" /* * Default graphic modes */ #define GRAPHICS_NONE 0 /* Specifications for graphics modes. * * grafID: ID of tile set should be >0 and unique for anything new. * alphablend: Bool whether or not the tileset needs alpha blending. * overdrawRow: Row in the file where tiles in that row or lower draw the tile * above as well. * overdrawMax: Row in the file where tiles in that row or above draw the tile * above as well. * cell_width: Width of an individual tile in pixels. * cell_height: Height of an individual tile in pixels. * pref: Value of ANGBAND_GRAF variable. * file: Name of PNG file (if any). * menuname: Name of the tileset in menu. */ typedef struct _graphics_mode { struct _graphics_mode *pNext; byte grafID; byte alphablend; byte overdrawRow; byte overdrawMax; u16b cell_width; u16b cell_height; char pref[32]; char file[32]; char menuname[32]; } graphics_mode; extern graphics_mode *graphics_modes; extern graphics_mode *current_graphics_mode; extern int graphics_mode_high_id; bool init_graphics_modes(const char *filename); void close_graphics_modes(void); graphics_mode* get_graphics_mode(byte id); #endif /* INCLUDED_GRAFMODE_H */ angband-3.5.1/src/main-stats.c0000644000175000017500000014104312456456606015456 0ustar chriscchrisc/* * File: main-stats.c * Purpose: Pseudo-UI for stats generation (borrows heavily from main-test.c) * * Copyright (c) 2010-11 Robert Au * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #ifdef USE_STATS #include "birth.h" #include "buildid.h" #include "dungeon.h" #include "init.h" #include "monster/mon-make.h" #include "object/pval.h" #include "object/tvalsval.h" #include "stats/db.h" #include "stats/structs.h" #include #include #define OBJ_FEEL_MAX 11 #define MON_FEEL_MAX 10 #define LEVEL_MAX 101 #define TOP_DICE 21 /* highest catalogued values for wearables */ #define TOP_SIDES 11 #define TOP_AC 146 #define TOP_PLUS 56 #define TOP_POWER 999 #define TOP_PVAL 25 #define RUNS_PER_CHECKPOINT 10000 /* For ref, e_max is 128, a_max is 136, r_max is ~650, ORIGIN_STATS is 14, OF_MAX is ~120 */ /* There are 416 kinds, of which about 150-200 are wearable */ static int randarts = 0; static int no_selling = 0; static u32b num_runs = 1; static bool quiet = FALSE; static int nextkey = 0; static int running_stats = 0; static char *ANGBAND_DIR_STATS; static int *consumables_index; static int *wearables_index; static int *pval_flags_index; static int wearable_count = 0; static int consumable_count = 0; static int pval_flags_count = 0; struct wearables_data { u32b count; u32b dice[TOP_DICE][TOP_SIDES]; u32b ac[TOP_AC]; u32b hit[TOP_PLUS]; u32b dam[TOP_PLUS]; /* u32b power[TOP_POWER]; not enough memory - add it later in bands */ u32b *egos; u32b flags[OF_MAX]; u32b *pval_flags[TOP_PVAL]; }; static struct level_data { u32b *monsters; /* u32b *vaults; Add these later - requires passing into generate.c u32b *pits; */ u32b obj_feelings[OBJ_FEEL_MAX]; u32b mon_feelings[MON_FEEL_MAX]; long long gold[ORIGIN_STATS]; u32b *artifacts[ORIGIN_STATS]; u32b *consumables[ORIGIN_STATS]; struct wearables_data *wearables[ORIGIN_STATS]; } level_data[LEVEL_MAX]; static void create_indices() { int i; consumables_index = C_ZNEW(z_info->k_max, int); wearables_index = C_ZNEW(z_info->k_max, int); pval_flags_index = C_ZNEW(OF_MAX, int); for (i = 0; i < z_info->k_max; i++) { object_type object_type_body; object_type *o_ptr = &object_type_body; object_kind *kind = &k_info[i]; o_ptr->tval = kind->tval; if (! kind->name) continue; if (wearable_p(o_ptr)) wearables_index[i] = ++wearable_count; else consumables_index[i] = ++consumable_count; } for (i = 0; i < OF_MAX; i++) if (flag_uses_pval(i)) pval_flags_index[i] = ++pval_flags_count; } static void alloc_memory() { int i, j, k, l; for (i = 0; i < LEVEL_MAX; i++) { level_data[i].monsters = C_ZNEW(z_info->r_max, u32b); /* level_data[i].vaults = C_ZNEW(z_info->v_max, u32b); level_data[i].pits = C_ZNEW(z_info->pit_max, u32b); */ for (j = 0; j < ORIGIN_STATS; j++) { level_data[i].artifacts[j] = C_ZNEW(z_info->a_max, u32b); level_data[i].consumables[j] = C_ZNEW(consumable_count + 1, u32b); level_data[i].wearables[j] = C_ZNEW(wearable_count + 1, struct wearables_data); for (k = 0; k < wearable_count + 1; k++) { level_data[i].wearables[j][k].egos = C_ZNEW(z_info->e_max, u32b); for (l = 0; l < TOP_PVAL; l++) level_data[i].wearables[j][k].pval_flags[l] = C_ZNEW(pval_flags_count + 1, u32b); } } } } static void free_stats_memory(void) { int i, j, k, l; for (i = 0; i < LEVEL_MAX; i++) { mem_free(level_data[i].monsters); /* mem_free(level_data[i].vaults); mem_free(level_data[i].pits); */ for (j = 0; j < ORIGIN_STATS; j++) { mem_free(level_data[i].artifacts[j]); mem_free(level_data[i].consumables[j]); for (k = 0; k < wearable_count + 1; k++) { for (l = 0; l < TOP_PVAL; l++) { mem_free(level_data[i].wearables[j][k].pval_flags[l]); } mem_free(level_data[i].wearables[j][k].egos); } mem_free(level_data[i].wearables[j]); } } mem_free(consumables_index); mem_free(wearables_index); mem_free(pval_flags_index); string_free(ANGBAND_DIR_STATS); } /* Copied from birth.c:generate_player() */ static void generate_player_for_stats() { OPT(birth_randarts) = randarts; OPT(birth_no_selling) = no_selling; OPT(birth_no_stacking) = FALSE; OPT(auto_more) = TRUE; p_ptr->wizard = 1; /* Set wizard mode on */ p_ptr->psex = 0; /* Female */ p_ptr->race = races; /* Human */ p_ptr->class = classes; /* Warrior */ /* Level 1 */ p_ptr->max_lev = p_ptr->lev = 1; /* Experience factor */ p_ptr->expfact = p_ptr->race->r_exp + p_ptr->class->c_exp; /* Hitdice */ p_ptr->hitdie = p_ptr->race->r_mhp + p_ptr->class->c_mhp; /* Initial hitpoints -- high just to be safe */ p_ptr->mhp = p_ptr->chp = 2000; /* Pre-calculate level 1 hitdice */ p_ptr->player_hp[0] = p_ptr->hitdie; /* Set age/height/weight */ p_ptr->ht = p_ptr->ht_birth = 66; p_ptr->wt = p_ptr->wt_birth = 150; p_ptr->age = 14; /* Set social class and (null) history */ p_ptr->history = get_history(p_ptr->race->history); } static void initialize_character(void) { u32b seed; if (!quiet) { printf(" [I ]\b\b\b\b\b\b"); fflush(stdout); } seed = (time(NULL)); Rand_quick = FALSE; Rand_state_init(seed); player_init(p_ptr); generate_player_for_stats(); seed_flavor = randint0(0x10000000); seed_town = randint0(0x10000000); seed_randart = randint0(0x10000000); if (randarts) { do_randart(seed_randart, TRUE); } store_reset(); flavor_init(); p_ptr->playing = TRUE; p_ptr->autosave = FALSE; cave_generate(cave, p_ptr); } static void kill_all_monsters(int level) { int i; for (i = cave_monster_max(cave) - 1; i >= 1; i--) { monster_type *m_ptr = cave_monster(cave, i); level_data[level].monsters[m_ptr->race->ridx]++; monster_death(m_ptr, TRUE); if (rf_has(m_ptr->race->flags, RF_UNIQUE)) m_ptr->race->max_num = 0; } } static void unkill_uniques(void) { int i; if (!quiet) { printf(" [U ]\b\b\b\b\b\b"); fflush(stdout); } for (i = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; if (rf_has(r_ptr->flags, RF_UNIQUE)) r_ptr->max_num = 1; } } static void reset_artifacts(void) { int i; if (!quiet) { printf(" [R ]\b\b\b\b\b\b"); fflush(stdout); } for (i = 0; i < z_info->a_max; i++) a_info[i].created = FALSE; } static void log_all_objects(int level) { int x, y, i; for (y = 1; y < cave->height - 1; y++) { for (x = 1; x < cave->width - 1; x++) { object_type *o_ptr = get_first_object(y, x); if (o_ptr) do { /* u32b o_power = 0; */ /* Mark object as fully known */ object_notice_everything(o_ptr); /* o_power = object_power(o_ptr, FALSE, NULL, TRUE); */ /* Capture gold amounts */ if (o_ptr->tval == TV_GOLD) level_data[level].gold[o_ptr->origin] += o_ptr->pval[DEFAULT_PVAL]; /* Capture artifact drops */ if (o_ptr->artifact) level_data[level].artifacts[o_ptr->origin][o_ptr->artifact->aidx]++; /* Capture kind details */ if (wearable_p(o_ptr)) { struct wearables_data *w = &level_data[level].wearables[o_ptr->origin][wearables_index[o_ptr->kind->kidx]]; w->count++; w->dice[MIN(o_ptr->dd, TOP_DICE - 1)][MIN(o_ptr->ds, TOP_SIDES - 1)]++; w->ac[MIN(MAX(o_ptr->ac + o_ptr->to_a, 0), TOP_AC - 1)]++; w->hit[MIN(MAX(o_ptr->to_h, 0), TOP_PLUS - 1)]++; w->dam[MIN(MAX(o_ptr->to_d, 0), TOP_PLUS - 1)]++; /* Capture egos */ if (o_ptr->ego) w->egos[o_ptr->ego->eidx]++; /* Capture object flags */ for (i = of_next(o_ptr->flags, FLAG_START); i != FLAG_END; i = of_next(o_ptr->flags, i + 1)) { w->flags[i]++; if (flag_uses_pval(i)) { int p = o_ptr->pval[which_pval(o_ptr, i)]; w->pval_flags[MIN(MAX(p, 0), TOP_PVAL - 1)][pval_flags_index[i]]++; } } } else level_data[level].consumables[o_ptr->origin][consumables_index[o_ptr->kind->kidx]]++; } while ((o_ptr = get_next_object(o_ptr))); } } } static void descend_dungeon(void) { int level; u16b obj_f, mon_f; clock_t last = 0; clock_t wait = CLOCKS_PER_SEC / 5; for (level = 1; level < LEVEL_MAX; level++) { if (!quiet) { clock_t now = clock(); if (now - last > wait) { printf(" [%3d]\b\b\b\b\b\b", level); fflush(stdout); last = now; } } dungeon_change_level(level); cave_generate(cave, p_ptr); /* Store level feelings */ obj_f = cave->feeling / 10; mon_f = cave->feeling - (10 * obj_f); level_data[level].obj_feelings[MIN(obj_f, OBJ_FEEL_MAX - 1)]++; level_data[level].mon_feelings[MIN(mon_f, MON_FEEL_MAX - 1)]++; kill_all_monsters(level); log_all_objects(level); } } static void prep_output_dir(void) { size_t size = strlen(ANGBAND_DIR_USER) + strlen(PATH_SEP) + 6; ANGBAND_DIR_STATS = mem_alloc(size); strnfmt(ANGBAND_DIR_STATS, size, "%s%sstats", ANGBAND_DIR_USER, PATH_SEP); if (dir_create(ANGBAND_DIR_STATS)) { return; } else { quit("Couldn't create stats directory!"); } } /** * Caller is responsible for prepping and finalizing flags_stmt, which * should have two parameters. */ static int stats_dump_oflags(sqlite3_stmt *flags_stmt, int idx, bitflag flags[OF_SIZE]) { int err, flag; err = sqlite3_bind_int(flags_stmt, 1, idx); if (err) return err; for (flag = of_next(flags, FLAG_START); flag != FLAG_END; flag = of_next(flags, flag + 1)) { err = sqlite3_bind_int(flags_stmt, 2, flag); if (err) return err; STATS_DB_STEP_RESET(flags_stmt) } return SQLITE_OK; } static int stats_dump_artifacts(void) { int err, idx, i, flag; char sql_buf[256]; sqlite3_stmt *info_stmt, *flags_stmt, *pval_flags_stmt; strnfmt(sql_buf, 256, "INSERT INTO artifact_info VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"); err = stats_db_stmt_prep(&info_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO artifact_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&flags_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO artifact_pval_flags_map VALUES (?,?,?);"); err = stats_db_stmt_prep(&pval_flags_stmt, sql_buf); if (err) return err; for (idx = 0; idx < z_info->a_max; idx++) { artifact_type *a_ptr = &a_info[idx]; if (!a_ptr->name) continue; err = sqlite3_bind_int(info_stmt, 1, idx); if (err) return err; err = sqlite3_bind_text(info_stmt, 2, a_ptr->name, strlen(a_ptr->name), SQLITE_STATIC); if (err) return err; err = stats_db_bind_ints(info_stmt, 14, 2, a_ptr->tval, a_ptr->sval, a_ptr->weight, a_ptr->cost, a_ptr->alloc_prob, a_ptr->alloc_min, a_ptr->alloc_max, a_ptr->ac, a_ptr->dd, a_ptr->ds, a_ptr->to_h, a_ptr->to_d, a_ptr->to_a, a_ptr->effect); STATS_DB_STEP_RESET(info_stmt) err = stats_dump_oflags(flags_stmt, idx, a_ptr->flags); if (err) return err; for (i = 0; i < a_ptr->num_pvals; i++) { for (flag = of_next(a_ptr->pval_flags[i], FLAG_START); flag != FLAG_END; flag = of_next(a_ptr->pval_flags[i], flag + 1)) { err = stats_db_bind_ints(pval_flags_stmt, 3, 0, idx, flag, a_ptr->pval[i]); if (err) return err; STATS_DB_STEP_RESET(pval_flags_stmt) } } } STATS_DB_FINALIZE(info_stmt) STATS_DB_FINALIZE(flags_stmt) STATS_DB_FINALIZE(pval_flags_stmt) return SQLITE_OK; } static int stats_dump_egos(void) { int err, idx, flag, i; char sql_buf[256]; sqlite3_stmt *info_stmt, *flags_stmt, *pval_flags_stmt, *type_stmt; strnfmt(sql_buf, 256, "INSERT INTO ego_info VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?);"); err = stats_db_stmt_prep(&info_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO ego_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&flags_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO ego_pval_flags_map VALUES (?,?,?,?);"); err = stats_db_stmt_prep(&pval_flags_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO ego_type_map VALUES (?,?,?,?);"); err = stats_db_stmt_prep(&type_stmt, sql_buf); if (err) return err; for (idx = 0; idx < z_info->e_max; idx++) { ego_item_type *e_ptr = &e_info[idx]; if (!e_ptr->name) continue; err = sqlite3_bind_int(info_stmt, 1, idx); if (err) return err; err = sqlite3_bind_text(info_stmt, 2, e_ptr->name, strlen(e_ptr->name), SQLITE_STATIC); if (err) return err; err = stats_db_bind_rv(info_stmt, 3, e_ptr->to_h); if (err) return err; err = stats_db_bind_rv(info_stmt, 4, e_ptr->to_d); if (err) return err; err = stats_db_bind_rv(info_stmt, 5, e_ptr->to_a); if (err) return err; err = stats_db_bind_ints(info_stmt, 9, 5, e_ptr->cost, e_ptr->level, e_ptr->rarity, e_ptr->rating, e_ptr->num_pvals, e_ptr->min_to_h, e_ptr->min_to_d, e_ptr->min_to_a, e_ptr->xtra); if (err) return err; STATS_DB_STEP_RESET(info_stmt) err = stats_dump_oflags(flags_stmt, idx, e_ptr->flags); if (err) return err; for (i = 0; i < e_ptr->num_pvals; i++) { for (flag = of_next(e_ptr->pval_flags[i], FLAG_START); flag != FLAG_END; flag = of_next(e_ptr->pval_flags[i], flag + 1)) { err = stats_db_bind_ints(pval_flags_stmt, 3, 0, idx, flag, e_ptr->min_pval[i]); if (err) return err; err = stats_db_bind_rv(pval_flags_stmt, 4, e_ptr->pval[i]); if (err) return err; STATS_DB_STEP_RESET(pval_flags_stmt) } } for (i = 0; i < EGO_TVALS_MAX; i++) { err = stats_db_bind_ints(type_stmt, 4, 0, idx, e_ptr->tval[i], e_ptr->min_sval[i], e_ptr->max_sval[i]); if (err) return err; STATS_DB_STEP_RESET(type_stmt) } } STATS_DB_FINALIZE(info_stmt) STATS_DB_FINALIZE(flags_stmt) STATS_DB_FINALIZE(pval_flags_stmt) STATS_DB_FINALIZE(type_stmt) return SQLITE_OK; } static int stats_dump_objects(void) { int err, idx, i, flag; char sql_buf[256]; sqlite3_stmt *info_stmt, *flags_stmt, *pval_flags_stmt; strnfmt(sql_buf, 256, "INSERT INTO object_info VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"); err = stats_db_stmt_prep(&info_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO object_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&flags_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO object_pval_flags_map VALUES (?,?,?);"); err = stats_db_stmt_prep(&pval_flags_stmt, sql_buf); if (err) return err; for (idx = 0; idx < z_info->k_max; idx++) { object_kind *k_ptr = &k_info[idx]; if (!k_ptr->name) continue; err = sqlite3_bind_int(info_stmt, 1, idx); if (err) return err; err = sqlite3_bind_text(info_stmt, 2, k_ptr->name, strlen(k_ptr->name), SQLITE_STATIC); if (err) return err; err = stats_db_bind_ints(info_stmt, 14, 2, k_ptr->tval, k_ptr->sval, k_ptr->level, k_ptr->weight, k_ptr->cost, k_ptr->ac, k_ptr->dd, k_ptr->ds, k_ptr->alloc_prob, k_ptr->alloc_min, k_ptr->alloc_max, k_ptr->effect, k_ptr->gen_mult_prob, k_ptr->stack_size); if (err) return err; err = stats_db_bind_rv(info_stmt, 17, k_ptr->to_h); if (err) return err; err = stats_db_bind_rv(info_stmt, 18, k_ptr->to_d); if (err) return err; err = stats_db_bind_rv(info_stmt, 19, k_ptr->to_a); if (err) return err; err = stats_db_bind_rv(info_stmt, 20, k_ptr->charge); if (err) return err; err = stats_db_bind_rv(info_stmt, 21, k_ptr->time); if (err) return err; STATS_DB_STEP_RESET(info_stmt) err = stats_dump_oflags(flags_stmt, idx, k_ptr->flags); if (err) return err; for (i = 0; i < k_ptr->num_pvals; i++) { for (flag = of_next(k_ptr->pval_flags[i], FLAG_START); flag != FLAG_END; flag = of_next(k_ptr->pval_flags[i], flag + 1)) { err = stats_db_bind_ints(pval_flags_stmt, 2, 0, idx, flag); if (err) return err; err = stats_db_bind_rv(pval_flags_stmt, 3, k_ptr->pval[i]); if (err) return err; STATS_DB_STEP_RESET(pval_flags_stmt) } } } STATS_DB_FINALIZE(info_stmt) STATS_DB_FINALIZE(flags_stmt) STATS_DB_FINALIZE(pval_flags_stmt) /* Handle object_base */ strnfmt(sql_buf, 256, "INSERT INTO object_base_info VALUES (?,?);"); err = stats_db_stmt_prep(&info_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO object_base_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&flags_stmt, sql_buf); if (err) return err; idx = 0; for (idx = 0; idx < TV_MAX; idx++) { object_base *kb_ptr = &kb_info[idx]; if (!kb_ptr->name) continue; err = sqlite3_bind_int(info_stmt, 1, idx); if (err) return err; err = sqlite3_bind_text(info_stmt, 2, kb_ptr->name, strlen(kb_ptr->name), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(info_stmt) for (flag = of_next(kb_ptr->flags, FLAG_START); flag != FLAG_END; flag = of_next(kb_ptr->flags, flag + 1)) { err = stats_db_bind_ints(flags_stmt, 2, 0, idx, flag); if (err) return err; STATS_DB_STEP_RESET(flags_stmt) } } STATS_DB_FINALIZE(info_stmt) STATS_DB_FINALIZE(flags_stmt) return SQLITE_OK; } static int stats_dump_monsters(void) { int err, idx, flag; char sql_buf[256]; sqlite3_stmt *info_stmt, *flags_stmt, *spell_flags_stmt; monster_base *rb_ptr; strnfmt(sql_buf, 256, "INSERT INTO monster_info VALUES (?,?,?,?,?,?,?,?,?,?,?,?);"); err = stats_db_stmt_prep(&info_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO monster_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&flags_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO monster_spell_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&spell_flags_stmt, sql_buf); if (err) return err; for (idx = 0; idx < z_info->r_max; idx++) { monster_race *r_ptr = &r_info[idx]; /* Skip empty entries */ if (!r_ptr->name) continue; err = stats_db_bind_ints(info_stmt, 10, 0, idx, r_ptr->ac, r_ptr->sleep, r_ptr->speed, r_ptr->mexp, r_ptr->avg_hp, r_ptr->freq_innate, r_ptr->freq_spell, r_ptr->level, r_ptr->rarity); if (err) return err; err = sqlite3_bind_text(info_stmt, 11, r_ptr->name, strlen(r_ptr->name), SQLITE_STATIC); if (err) return err; err = sqlite3_bind_text(info_stmt, 12, r_ptr->base->name, strlen(r_ptr->base->name), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(info_stmt) for (flag = rf_next(r_ptr->flags, FLAG_START); flag != FLAG_END; flag = rf_next(r_ptr->flags, flag + 1)) { err = stats_db_bind_ints(flags_stmt, 2, 0, idx, flag); if (err) return err; STATS_DB_STEP_RESET(flags_stmt) } for (flag = rsf_next(r_ptr->spell_flags, FLAG_START); flag != FLAG_END; flag = rsf_next(r_ptr->spell_flags, flag + 1)) { err = stats_db_bind_ints(spell_flags_stmt, 2, 0, idx, flag); if (err) return err; STATS_DB_STEP_RESET(spell_flags_stmt) } } STATS_DB_FINALIZE(info_stmt) STATS_DB_FINALIZE(flags_stmt) STATS_DB_FINALIZE(spell_flags_stmt) /* Handle monster bases */ strnfmt(sql_buf, 256, "INSERT INTO monster_base_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&flags_stmt, sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO monster_base_spell_flags_map VALUES (?,?);"); err = stats_db_stmt_prep(&spell_flags_stmt, sql_buf); if (err) return err; for (rb_ptr = rb_info, idx = 0; rb_ptr; rb_ptr = rb_ptr->next, idx++) { for (flag = rf_next(rb_ptr->flags, FLAG_START); flag != FLAG_END; flag = rf_next(rb_ptr->flags, flag + 1)) { err = sqlite3_bind_text(flags_stmt, 1, rb_ptr->name, strlen(rb_ptr->name), SQLITE_STATIC); if (err) return err; err = sqlite3_bind_int(flags_stmt, 2, flag); if (err) return err; STATS_DB_STEP_RESET(flags_stmt) } for (flag = rsf_next(rb_ptr->spell_flags, FLAG_START); flag != FLAG_END; flag = rsf_next(rb_ptr->spell_flags, flag + 1)) { err = sqlite3_bind_text(spell_flags_stmt, 1, rb_ptr->name, strlen(rb_ptr->name), SQLITE_STATIC); if (err) return err; err = sqlite3_bind_int(spell_flags_stmt, 2, flag); if (err) return err; STATS_DB_STEP_RESET(spell_flags_stmt) } } STATS_DB_FINALIZE(flags_stmt) STATS_DB_FINALIZE(spell_flags_stmt) return SQLITE_OK; } static int stats_dump_lists(void) { int err, idx; char sql_buf[256]; sqlite3_stmt *sql_stmt; /* Note: these lists are sometimes different from the ones the core * game uses, insofar as we put the name of the flag in a * description field. */ info_entry effects[] = { #define EFFECT(x, y, r, z) { EF_##x, y, r, #x }, #include "list-effects.h" #undef EFFECT }; char *r_info_flags[] = { #define RF(a, b) #a, #include "monster/list-mon-flags.h" #undef RF NULL }; struct mon_spell mon_spell_table[] = { #define RSF(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ { RSF_##a, b, #a, d, e, f, g, h, i, j, k, l, m, n }, #define RV(b, x, y, m) {b, x, y, m} #include "monster/list-mon-spells.h" #undef RV #undef RSF }; struct object_flag object_flag_table[] = { #define OF(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) \ { OF_##a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, #a }, #include "object/list-object-flags.h" #undef OF }; struct slay slay_table[] = { #define SLAY(a, b, c, d, e, f, g, h, i, j) \ { SL_##a, b, c, d, e, f, g, h, #a, j}, #include "object/list-slays.h" #undef SLAY }; err = stats_db_stmt_prep(&sql_stmt, "INSERT INTO effects_list VALUES(?,?,?,?);"); if (err) return err; for (idx = 1; idx < EF_MAX; idx++) { if (! effects[idx].desc) continue; err = stats_db_bind_ints(sql_stmt, 3, 0, idx, effects[idx].aim, effects[idx].power); if (err) return err; err = sqlite3_bind_text(sql_stmt, 4, effects[idx].desc, strlen(effects[idx].desc), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } STATS_DB_FINALIZE(sql_stmt) err = stats_db_stmt_prep(&sql_stmt, "INSERT INTO monster_flags_list VALUES(?,?);"); if (err) return err; for (idx = 0; r_info_flags[idx] != NULL; idx++) { err = sqlite3_bind_int(sql_stmt, 1, idx); if (err) return err; err = sqlite3_bind_text(sql_stmt, 2, r_info_flags[idx], strlen(r_info_flags[idx]), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } STATS_DB_FINALIZE(sql_stmt) err = stats_db_stmt_prep(&sql_stmt, "INSERT INTO monster_spell_flags_list VALUES(?,?,?,?);"); if (err) return err; for (idx = 1; idx < RSF_MAX; idx++) { if (! mon_spell_table[idx].desc) continue; err = stats_db_bind_ints(sql_stmt, 3, 0, idx, mon_spell_table[idx].cap, mon_spell_table[idx].div); if (err) return err; err = sqlite3_bind_text(sql_stmt, 4, mon_spell_table[idx].desc, strlen(mon_spell_table[idx].desc), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } STATS_DB_FINALIZE(sql_stmt) err = stats_db_stmt_prep(&sql_stmt, "INSERT INTO object_flags_list VALUES(?,?,?,?,?,?);"); if (err) return err; for (idx = 1; idx < OF_MAX; idx++) { struct object_flag *of_ptr = &object_flag_table[idx]; if (! of_ptr->message) continue; err = stats_db_bind_ints(sql_stmt, 5, 0, idx, of_ptr->pval, of_ptr->type, of_ptr->power, of_ptr->pval_mult); if (err) return err; err = sqlite3_bind_text(sql_stmt, 6, of_ptr->message, strlen(of_ptr->message), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } STATS_DB_FINALIZE(sql_stmt) err = stats_db_stmt_prep(&sql_stmt, "INSERT INTO object_slays_list VALUES(?,?,?,?,?,?);"); if (err) return err; for (idx = 1; idx < SL_MAX; idx++) { struct slay *s_ptr = &slay_table[idx]; if (! s_ptr->desc) continue; err = stats_db_bind_ints(sql_stmt, 5, 0, idx, s_ptr->object_flag, s_ptr->monster_flag, s_ptr->resist_flag, s_ptr->mult); if (err) return err; err = sqlite3_bind_text(sql_stmt, 6, s_ptr->desc, strlen(s_ptr->desc), SQLITE_STATIC); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } STATS_DB_FINALIZE(sql_stmt) /* Hack, until we refactor origin kinds into a header */ #define STATS_ORIGIN(idx,name) \ strnfmt(sql_buf, 256, "INSERT INTO origin_flags_list VALUES(%d,'%s');", idx, #name); \ err = stats_db_exec(sql_buf);\ if (err) return err; STATS_ORIGIN(0,NONE) STATS_ORIGIN(1,FLOOR) STATS_ORIGIN(2,DROP) STATS_ORIGIN(3,CHEST) STATS_ORIGIN(4,DROP_SPECIAL) STATS_ORIGIN(5,DROP_PIT) STATS_ORIGIN(6,DROP_VAULT) STATS_ORIGIN(7,SPECIAL) STATS_ORIGIN(8,PIT) STATS_ORIGIN(9,VAULT) STATS_ORIGIN(10,LABYRINTH) STATS_ORIGIN(11,CAVERN) STATS_ORIGIN(12,RUBBLE) STATS_ORIGIN(13,MIXED) #undef STATS_ORIGIN return SQLITE_OK; } static int stats_dump_info(void) { int err; char sql_buf[256]; /* Wrap entire write into a transaction */ err = stats_db_exec("BEGIN TRANSACTION;"); if (err) return err; /* Metadata */ strnfmt(sql_buf, 256, "INSERT INTO metadata VALUES('version','%s');", buildver); err = stats_db_exec(sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO metadata VALUES('randarts',%d);", randarts); err = stats_db_exec(sql_buf); if (err) return err; strnfmt(sql_buf, 256, "INSERT INTO metadata VALUES('no_selling',%d);", no_selling); err = stats_db_exec(sql_buf); if (err) return err; err = stats_dump_artifacts(); if (err) return err; err = stats_dump_egos(); if (err) return err; err = stats_dump_monsters(); if (err) return err; err = stats_dump_objects(); if (err) return err; err = stats_dump_lists(); if (err) return err; /* Commit transaction */ return stats_db_exec("COMMIT;"); } /** * Open the database connection and create the database tables. * All count tables will contain a level column (INTEGER) and a * count column (INTEGER). Some tables will include other INTEGER columns * for object origin, feeling, attributes, indices, or object flags. * Note that random_value types are stored as either A+BdC+Md or A. * Tables: * metadata -- key-value pairs describing the stats run * artifact_info -- dump of artifact.txt * artifact_flags_map -- map between artifacts and object flags * artifact_pval_flags_map -- map between artifacts and pval flags, with pvals * ego_info -- dump of ego_item.txt * ego_flags_map -- map between egos and object flags * ego_pval_flags_map -- map between egos and pval flags, with pvals and minima * ego_type_map -- map between egos and tvals/svals * monster_base_flags_map -- map between monster bases and monster flags * monster_base_spell_flags_map -- map between monster bases and monster spell flags * monster_info -- dump of monsters.txt * monster_flags_map -- map between monsters and monster flags * monster_spell_flags_map -- map between monsters and monster spell flags * object_base_info -- dump of object_base.txt * object_base_flags_map -- map between object templates and object flags * object_info -- dump of objects.txt * object_flags_map -- map between artifacts and object flags * object_pval_flags_map -- map between artifacts and pval flags, with pvals * effects_list -- dump of list-effects.h * monster_flags_list -- dump of list-mon-flags.h * monster_spell_flags_list -- dump of list-mon-spells.h * object_flags_list -- dump of list-object-flags.h * object_slays_list -- dump of list-object-slays.h * origin_flags_list -- dump of origin enum * Count tables: * monsters * obj_feelings * mon_feelings * gold * artifacts * consumables * wearables_count * wearables_dice * wearables_ac * wearables_hit * wearables_dam * wearables_egos * wearables_flags * wearables_pval_flags */ static bool stats_prep_db(void) { bool status; int err; /* Open the database connection */ status = stats_db_open(); if (!status) return status; /* Create some tables */ err = stats_db_exec("CREATE TABLE metadata(field TEXT UNIQUE NOT NULL, value TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE artifact_info(idx INT PRIMARY KEY, name TEXT, tval INT, sval INT, weight INT, cost INT, alloc_prob INT, alloc_min INT, alloc_max INT, ac INT, dd INT, ds INT, to_h INT, to_d INT, to_a INT, effect INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE artifact_flags_map(a_idx INT, o_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE artifact_pval_flags_map(a_idx INT, pval_flag INT, pval INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE ego_info(idx INT PRIMARY KEY, name TEXT, to_h TEXT, to_d TEXT, to_a TEXT, cost INT, level INT, rarity INT, rating INT, num_pvals INT, min_to_h INT, min_to_d INT, min_to_a INT, xtra INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE ego_flags_map(e_idx INT, o_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE ego_pval_flags_map(e_idx INT, pval_flag INT, min_pval INT, pval TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE ego_type_map(e_idx INT, tval INT, min_sval INT, max_sval INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_base_flags_map(rb_idx INT, r_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_base_spell_flags_map(rb_idx INT, rs_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_info(idx INT PRIMARY KEY, ac INT, sleep INT, speed INT, mexp INT, hp INT, freq_innate INT, freq_spell INT, level INT, rarity INT, name TEXT, base TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_flags_map(r_idx INT, r_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_spell_flags_map(r_idx INT, rs_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_base_info(idx INT PRIMARY KEY, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_base_flags_map(kb_idx INT, o_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_info(idx INT PRIMARY KEY, name TEXT, tval INT, sval INT, level INT, weight INT, cost INT, ac INT, dd INT, ds INT, alloc_prob INT, alloc_min INT, alloc_max INT, effect INT, gen_mult_prob INT, stack_size INT, to_h TEXT, to_d TEXT, to_a TEXT, charge TEXT, recharge_time TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_flags_map(k_idx INT, o_flag INT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_pval_flags_map(k_idx INT, pval_flag INT, pval TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE effects_list(idx INT PRIMARY KEY, aim INT, rating INT, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_flags_list(idx INT PRIMARY KEY, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monster_spell_flags_list(idx INT PRIMARY KEY, cap INT, div INT, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_flags_list(idx INT PRIMARY KEY, pval INT, type INT, power INT, pval_mult INT, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE object_slays_list(idx INT PRIMARY KEY, object_flag INT, monster_flag INT, resist_flag INT, mult INT, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE origin_flags_list(idx INT PRIMARY KEY, name TEXT);"); if (err) return false; err = stats_db_exec("CREATE TABLE monsters(level INT, count INT, k_idx INT, UNIQUE (level, k_idx) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE obj_feelings(level INT, count INT, feeling INT, UNIQUE (level, feeling) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE mon_feelings(level INT, count INT, feeling INT, UNIQUE (level, feeling) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE gold(level INT, count INT, origin INT, UNIQUE (level, origin) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE artifacts(level INT, count INT, a_idx INT, origin INT, UNIQUE (level, a_idx, origin) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE consumables(level INT, count INT, k_idx INT, origin INT, UNIQUE (level, k_idx, origin) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_count(level INT, count INT, k_idx INT, origin INT, UNIQUE (level, k_idx, origin) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_dice(level INT, count INT, k_idx INT, origin INT, dd INT, ds INT, UNIQUE (level, k_idx, origin, dd, ds) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_ac(level INT, count INT, k_idx INT, origin INT, ac INT, UNIQUE (level, k_idx, origin, ac) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_hit(level INT, count INT, k_idx INT, origin INT, to_h INT, UNIQUE (level, k_idx, origin, to_h) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_dam(level INT, count INT, k_idx INT, origin INT, to_d INT, UNIQUE (level, k_idx, origin, to_d) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_egos(level INT, count INT, k_idx INT, origin INT, e_idx INT, UNIQUE (level, k_idx, origin, e_idx) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_flags(level INT, count INT, k_idx INT, origin INT, of_idx INT, UNIQUE (level, k_idx, origin, of_idx) ON CONFLICT REPLACE);"); if (err) return false; err = stats_db_exec("CREATE TABLE wearables_pval_flags(level INT, count INT, k_idx INT, origin INT, pval INT, of_idx INT, UNIQUE (level, k_idx, origin, pval, of_idx) ON CONFLICT REPLACE);"); if (err) return false; err = stats_dump_info(); if (err) return false; return true; } /** * Find the offset of the given member of the level_data struct. Not elegant. */ static int stats_level_data_offsetof(const char *member) { if (streq(member, "monsters")) return offsetof(struct level_data, monsters); else if (streq(member, "obj_feelings")) return offsetof(struct level_data, obj_feelings); else if (streq(member, "mon_feelings")) return offsetof(struct level_data, mon_feelings); else if (streq(member, "gold")) return offsetof(struct level_data, gold); else if (streq(member, "artifacts")) return offsetof(struct level_data, artifacts); else if (streq(member, "consumables")) return offsetof(struct level_data, consumables); else if (streq(member, "wearables")) return offsetof(struct level_data, wearables); /* We should not get to this point. */ assert(0); } /** * Find the offset of the given member of the wearables_data struct. Not * elegant. */ static int stats_wearables_data_offsetof(const char *member) { if (streq(member, "count")) return offsetof(struct wearables_data, count); else if (streq(member, "dice")) return offsetof(struct wearables_data, dice); else if (streq(member, "ac")) return offsetof(struct wearables_data, ac); else if (streq(member, "hit")) return offsetof(struct wearables_data, hit); else if (streq(member, "dam")) return offsetof(struct wearables_data, dam); else if (streq(member, "egos")) return offsetof(struct wearables_data, egos); else if (streq(member, "flags")) return offsetof(struct wearables_data, flags); else if (streq(member, "pval_flags")) return offsetof(struct wearables_data, pval_flags); /* We should not get to this point. */ assert(0); } /** * Given a pointer to a dynamically allocated array and a value, look up * the index with that value; e.g. given wearables_index[k_idx], return k_idx. * If not found, return -1 * value. */ static int stats_lookup_index(const int *index, int max_idx, int value) { int idx; for (idx = 0; idx < max_idx; idx ++) { if (index[idx] == value) return idx; } return -1 * value; } static int stats_write_db_level_data(const char *table, int max_idx) { char sql_buf[256]; sqlite3_stmt *sql_stmt; int err, level, i, offset; strnfmt(sql_buf, 256, "INSERT INTO %s VALUES(?,?,?);", table); err = stats_db_stmt_prep(&sql_stmt, sql_buf); if (err) return err; offset = stats_level_data_offsetof(table); for (level = 1; level < LEVEL_MAX; level++) { for (i = 0; i < max_idx; i++) { /* This arcane expression finds the value of * level_data[level].[i] */ u32b count; if (streq(table, "gold")) { count = *((long long *)((byte *)&level_data[level] + offset) + i); } else { count = *((u32b *)((byte *)&level_data[level] + offset) + i); } if (!count) continue; err = stats_db_bind_ints(sql_stmt, 3, 0, level, count, i); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } } return sqlite3_finalize(sql_stmt); } static int stats_write_db_level_data_items(const char *table, int max_idx, bool translate_consumables) { char sql_buf[256]; sqlite3_stmt *sql_stmt; int err, level, origin, i, offset; strnfmt(sql_buf, 256, "INSERT INTO %s VALUES(?,?,?,?);", table); err = stats_db_stmt_prep(&sql_stmt, sql_buf); if (err) return err; offset = stats_level_data_offsetof(table); for (level = 1; level < LEVEL_MAX; level++) { for (origin = 0; origin < ORIGIN_STATS; origin++) { for (i = 0; i < max_idx; i++) { /* This arcane expression finds the value of * level_data[level].
[origin][i] */ u32b count = ((u32b **)((byte *)&level_data[level] + offset))[origin][i]; if (!count) continue; err = stats_db_bind_ints(sql_stmt, 4, 0, level, count, translate_consumables ? stats_lookup_index(consumables_index, z_info->k_max, i) : i, origin); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } } } return sqlite3_finalize(sql_stmt); } static int stats_write_db_wearables_count(void) { sqlite3_stmt *sql_stmt; int err, level, origin, k_idx, idx; err = stats_db_stmt_prep(&sql_stmt, "INSERT INTO wearables_count VALUES(?,?,?,?);"); if (err) return err; for (level = 1; level < LEVEL_MAX; level++) { for (origin = 0; origin < ORIGIN_STATS; origin++) { for (idx = 0; idx < wearable_count + 1; idx++) { u32b count = level_data[level].wearables[origin][idx].count; /* Skip if object did not appear */ if (!count) continue; k_idx = stats_lookup_index(wearables_index, z_info->k_max, idx); /* Skip if pile */ if (! k_idx) continue; err = stats_db_bind_ints(sql_stmt, 4, 0, level, count, k_idx, origin); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } } } return sqlite3_finalize(sql_stmt); } /** * Unfortunately, the arcane expression used to find the value of an array * member of a struct differs depending on whether the member is declared * as an array or as a pointer. Pass in true if the member is an array, and * false if the member is a pointer. */ static int stats_write_db_wearables_array(const char *field, int max_val, bool array_p) { char sql_buf[256]; sqlite3_stmt *sql_stmt; int err, level, origin, idx, k_idx, i, offset; strnfmt(sql_buf, 256, "INSERT INTO wearables_%s VALUES(?,?,?,?,?);", field); err = stats_db_stmt_prep(&sql_stmt, sql_buf); if (err) return err; offset = stats_wearables_data_offsetof(field); for (level = 1; level < LEVEL_MAX; level++) { for (origin = 0; origin < ORIGIN_STATS; origin++) { for (idx = 0; idx < wearable_count + 1; idx++) { k_idx = stats_lookup_index(wearables_index, z_info->k_max, idx); /* Skip if pile */ if (! k_idx) continue; for (i = 0; i < max_val; i++) { /* This arcane expression finds the value of * level_data[level].wearables[origin][idx].[i] */ u32b count; if (array_p) { count = ((u32b *)((byte *)&level_data[level].wearables[origin][idx] + offset))[i]; } else { count = ((u32b *)*((u32b **)((byte *)&level_data[level].wearables[origin][idx] + offset)))[i]; } if (!count) continue; err = stats_db_bind_ints(sql_stmt, 5, 0, level, count, k_idx, origin, i); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } } } } return sqlite3_finalize(sql_stmt); } /** * Unfortunately, the arcane expression used to find the value of an array * member of a struct differs depending on whether the member is declared * as an array or as a pointer. Pass in true if the member is an array, and * false if the member is a pointer. */ static int stats_write_db_wearables_2d_array(const char *field, int max_val1, int max_val2, bool array_p, bool translate_pval_flags) { char sql_buf[256]; sqlite3_stmt *sql_stmt; int err, level, origin, idx, k_idx, i, j, offset; strnfmt(sql_buf, 256, "INSERT INTO wearables_%s VALUES(?,?,?,?,?,?);", field); err = stats_db_stmt_prep(&sql_stmt, sql_buf); if (err) return err; offset = stats_wearables_data_offsetof(field); for (level = 1; level < LEVEL_MAX; level++) { for (origin = 0; origin < ORIGIN_STATS; origin++) { for (idx = 0; idx < wearable_count + 1; idx++) { k_idx = stats_lookup_index(wearables_index, z_info->k_max, idx); /* Skip if pile */ if (! k_idx) continue; for (i = 0; i < max_val1; i++) { for (j = 0; j < max_val2; j++) { /* This arcane expression finds the value of * level_data[level].wearables[origin][idx].[i][j] */ u32b count; int real_j = translate_pval_flags ? stats_lookup_index(pval_flags_index, OF_MAX, j) : j; if (i == 0 && real_j == 0) continue; if (array_p) { count = ((u32b *)((byte *)&level_data[level].wearables[origin][idx] + offset))[i * max_val2 + j]; } else { count = *(*((u32b **)((byte *)&level_data[level].wearables[origin][idx] + offset) + i) + j); } if (!count) continue; err = stats_db_bind_ints(sql_stmt, 6, 0, level, count, k_idx, origin, i, real_j); if (err) return err; STATS_DB_STEP_RESET(sql_stmt) } } } } } return sqlite3_finalize(sql_stmt); } static int stats_write_db(u32b run) { char sql_buf[256]; int err; /* Wrap entire write into a transaction */ err = stats_db_exec("BEGIN TRANSACTION;"); if (err) return err; strnfmt(sql_buf, 256, "INSERT OR REPLACE INTO metadata VALUES('runs', %d);", run); err = stats_db_exec(sql_buf); if (err) return err; err = stats_write_db_level_data("monsters", z_info->r_max); if (err) return err; err = stats_write_db_level_data("obj_feelings", OBJ_FEEL_MAX); if (err) return err; err = stats_write_db_level_data("mon_feelings", MON_FEEL_MAX); if (err) return err; err = stats_write_db_level_data("gold", ORIGIN_STATS); if (err) return err; err = stats_write_db_level_data_items("artifacts", z_info->a_max, false); if (err) return err; err = stats_write_db_level_data_items("consumables", consumable_count + 1, true); if (err) return err; err = stats_write_db_wearables_count(); if (err) return err; err = stats_write_db_wearables_2d_array("dice", TOP_DICE, TOP_SIDES, true, false); if (err) return err; err = stats_write_db_wearables_array("ac", TOP_AC, true); if (err) return err; err = stats_write_db_wearables_array("hit", TOP_PLUS, true); if (err) return err; err = stats_write_db_wearables_array("dam", TOP_PLUS, true); if (err) return err; err = stats_write_db_wearables_array("egos", z_info->e_max, false); if (err) return err; err = stats_write_db_wearables_array("flags", OF_MAX, true); if (err) return err; err = stats_write_db_wearables_2d_array("pval_flags", TOP_PVAL, pval_flags_count + 1, false, true); if (err) return err; /* Commit transaction */ err = stats_db_exec("COMMIT;"); if (err) return err; return SQLITE_OK; } /** * Call with the number of runs that have been completed. */ #define STATS_PROGRESS_BAR_LEN 30 void progress_bar(u32b run, time_t start) { u32b i; u32b n = (run * STATS_PROGRESS_BAR_LEN) / num_runs; u32b p10 = ((long long)run * 1000) / num_runs; time_t delta = time(NULL) - start; u32b togo = num_runs - run; u32b expect = delta ? ((long long)delta * (long long)togo) / run : 0; int h = expect / 3600; int m = (expect % 3600) / 60; int s = expect % 60; printf("\r|"); for (i = 0; i < n; i++) printf("*"); for (i = 0; i < STATS_PROGRESS_BAR_LEN - n; i++) printf(" "); printf("| %d/%d (%5.1f%%) %3d:%02d:%02d ", run, num_runs, p10/10.0, h, m, s); fflush(stdout); } /** * Clean up memory after each run. Should only affect character and * dungeon structs allocated during normal initialization, not persistent * data like *_info. */ static void stats_cleanup_angband_run(void) { if (p_ptr->history) FREE(p_ptr->history); } static errr run_stats(void) { u32b run; artifact_type *a_info_save; unsigned int i; int err; bool status; time_t start; prep_output_dir(); create_indices(); alloc_memory(); if (randarts) { a_info_save = mem_zalloc(z_info->a_max * sizeof(artifact_type)); for (i = 0; i < z_info->a_max; i++) { if (!a_info[i].name) continue; memcpy(&a_info_save[i], &a_info[i], sizeof(artifact_type)); } } if (!quiet) printf("Creating the database and dumping info...\n"); status = stats_prep_db(); if (!status) quit("Couldn't prepare database!"); if (!quiet) { printf("Beginning %d runs...\n", num_runs); fflush(stdout); } start = time(NULL); for (run = 1; run <= num_runs; run++) { if (!quiet) progress_bar(run - 1, start); if (randarts) { for (i = 0; i < z_info->a_max; i++) { memcpy(&a_info[i], &a_info_save[i], sizeof(artifact_type)); } } initialize_character(); unkill_uniques(); reset_artifacts(); descend_dungeon(); stats_cleanup_angband_run(); /* Checkpoint every so many runs */ if (run % RUNS_PER_CHECKPOINT == 0) { err = stats_write_db(run); if (err) { stats_db_close(); quit_fmt("Problems writing to database! sqlite3 errno %d.", err); } } if (quiet && run % 1000 == 0) { printf("Finished %d runs.\n", run); fflush(stdout); } } if (!quiet) { progress_bar(num_runs, start); printf("\nSaving the data...\n"); fflush(stdout); } err = stats_write_db(run); stats_db_close(); if (err) quit_fmt("Problems writing to database! sqlite3 errno %d.", err); mem_free(a_info_save); free_stats_memory(); cleanup_angband(); if (!quiet) printf("Done!\n"); quit(NULL); exit(0); } typedef struct term_data term_data; struct term_data { term t; }; static term_data td; typedef struct { int key; errr (*func)(int v); } term_xtra_func; static void term_init_stats(term *t) { return; } static void term_nuke_stats(term *t) { return; } static errr term_xtra_clear(int v) { return 0; } static errr term_xtra_noise(int v) { return 0; } static errr term_xtra_fresh(int v) { return 0; } static errr term_xtra_shape(int v) { return 0; } static errr term_xtra_alive(int v) { return 0; } static errr term_xtra_event(int v) { if (nextkey) { Term_keypress(nextkey, 0); nextkey = 0; } if (running_stats) { return 0; } running_stats = 1; return run_stats(); } static errr term_xtra_flush(int v) { return 0; } static errr term_xtra_delay(int v) { return 0; } static errr term_xtra_react(int v) { return 0; } static term_xtra_func xtras[] = { { TERM_XTRA_CLEAR, term_xtra_clear }, { TERM_XTRA_NOISE, term_xtra_noise }, { TERM_XTRA_FRESH, term_xtra_fresh }, { TERM_XTRA_SHAPE, term_xtra_shape }, { TERM_XTRA_ALIVE, term_xtra_alive }, { TERM_XTRA_EVENT, term_xtra_event }, { TERM_XTRA_FLUSH, term_xtra_flush }, { TERM_XTRA_DELAY, term_xtra_delay }, { TERM_XTRA_REACT, term_xtra_react }, { 0, NULL }, }; static errr term_xtra_stats(int n, int v) { int i; for (i = 0; xtras[i].func; i++) { if (xtras[i].key == n) { return xtras[i].func(v); } } return 0; } static errr term_curs_stats(int x, int y) { return 0; } static errr term_wipe_stats(int x, int y, int n) { return 0; } static errr term_text_stats(int x, int y, int n, int a, const wchar_t *s) { return 0; } static void term_data_link(int i) { term *t = &td.t; term_init(t, 80, 24, 256); /* Ignore some actions for efficiency and safety */ t->never_bored = TRUE; t->never_frosh = TRUE; t->init_hook = term_init_stats; t->nuke_hook = term_nuke_stats; t->xtra_hook = term_xtra_stats; t->curs_hook = term_curs_stats; t->wipe_hook = term_wipe_stats; t->text_hook = term_text_stats; t->data = &td; Term_activate(t); angband_term[i] = t; } const char help_stats[] = "Stats mode, subopts -q(uiet) -r(andarts) -n(# of runs) -s(no selling)"; /* * Usage: * * angband -mstats -- [-q] [-r] [-nNNNN] [-s] * * -q Quiet mode (turn off progress messages) * -r Turn on randarts * -nNNNN Make NNNN runs through the dungeon (default: 1) * -s Turn on no-selling */ errr init_stats(int argc, char *argv[]) { int i; /* Skip over argv[0] */ for (i = 1; i < argc; i++) { if (streq(argv[i], "-r")) { randarts = 1; continue; } if (streq(argv[i], "-q")) { quiet = TRUE; continue; } if (prefix(argv[i], "-n")) { num_runs = atoi(&argv[i][2]); continue; } if (prefix(argv[i], "-s")) { no_selling = 1; continue; } printf("init-stats: bad argument '%s'\n", argv[i]); } term_data_link(0); return 0; } #endif /* USE_STATS */ angband-3.5.1/src/files.c0000644000175000017500000011032012456456606014472 0ustar chriscchrisc/* * File: files.c * Purpose: Various file-related activities, poorly organised * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "cave.h" #include "cmds.h" #include "death.h" #include "files.h" #include "game-cmd.h" #include "history.h" #include "object/tvalsval.h" #include "object/pval.h" #include "option.h" #include "savefile.h" #include "ui-menu.h" /** Panel utilities **/ /* Panel line type */ struct panel_line { byte attr; const char *label; char value[20]; }; /* Panel holder type */ struct panel { size_t len; size_t max; struct panel_line *lines; }; /* Allocate some panel lines */ static struct panel *panel_allocate(int n) { struct panel *p = mem_zalloc(sizeof *p); p->len = 0; p->max = n; p->lines = mem_zalloc(p->max * sizeof *p->lines); return p; } /* Free up panel lines */ static void panel_free(struct panel *p) { assert(p); mem_free(p->lines); mem_free(p); } /* Add a new line to the panel */ static void panel_line(struct panel *p, byte attr, const char *label, const char *fmt, ...) { va_list vp; struct panel_line *pl; /* Get the next panel line */ assert(p); assert(p->len != p->max); pl = &p->lines[p->len++]; /* Set the basics */ pl->attr = attr; pl->label = label; /* Set the value */ va_start(vp, fmt); vstrnfmt(pl->value, sizeof pl->value, fmt, vp); va_end(vp); } /* Add a spacer line in a panel */ static void panel_space(struct panel *p) { assert(p); assert(p->len != p->max); p->len++; } /* * Returns a "rating" of x depending on y, and sets "attr" to the * corresponding "attribute". */ static const char *likert(int x, int y, byte *attr) { /* Paranoia */ if (y <= 0) y = 1; /* Negative value */ if (x < 0) { *attr = TERM_RED; return ("Very Bad"); } /* Analyze the value */ switch ((x / y)) { case 0: case 1: { *attr = TERM_RED; return ("Bad"); } case 2: { *attr = TERM_RED; return ("Poor"); } case 3: case 4: { *attr = TERM_YELLOW; return ("Fair"); } case 5: { *attr = TERM_YELLOW; return ("Good"); } case 6: { *attr = TERM_YELLOW; return ("Very Good"); } case 7: case 8: { *attr = TERM_L_GREEN; return ("Excellent"); } case 9: case 10: case 11: case 12: case 13: { *attr = TERM_L_GREEN; return ("Superb"); } case 14: case 15: case 16: case 17: { *attr = TERM_L_GREEN; return ("Heroic"); } default: { *attr = TERM_L_GREEN; return ("Legendary"); } } } /* * Obtain the "flags" for the player as if he was an item */ void player_flags(bitflag f[OF_SIZE]) { /* Add racial flags */ memcpy(f, p_ptr->race->flags, sizeof(p_ptr->race->flags)); /* Some classes become immune to fear at a certain plevel */ if (player_has(PF_BRAVERY_30) && p_ptr->lev >= 30) of_on(f, OF_RES_FEAR); } /* * Equippy chars */ static void display_player_equippy(int y, int x) { int i; byte a; wchar_t c; object_type *o_ptr; /* Dump equippy chars */ for (i = INVEN_WIELD; i < INVEN_TOTAL; ++i) { /* Object */ o_ptr = &p_ptr->inventory[i]; /* Skip empty objects */ if (!o_ptr->kind) continue; /* Get attr/char for display */ a = object_attr(o_ptr); c = object_char(o_ptr); /* Dump */ if ((tile_width == 1) && (tile_height == 1)) { Term_putch(x+i-INVEN_WIELD, y, a, c); } } } /* * List of resistances and abilities to display */ #define RES_ROWS 9 struct player_flag_record { const char name[7]; /* Name of resistance/ability */ int res_flag; /* resistance flag bit */ int im_flag; /* corresponding immunity bit, if any */ int vuln_flag; /* corresponding vulnerability flag, if any */ }; static const struct player_flag_record player_flag_table[RES_ROWS*4] = { { "rAcid", OF_RES_ACID, OF_IM_ACID, OF_VULN_ACID }, { "rElec", OF_RES_ELEC, OF_IM_ELEC, OF_VULN_ELEC }, { "rFire", OF_RES_FIRE, OF_IM_FIRE, OF_VULN_FIRE }, { "rCold", OF_RES_COLD, OF_IM_COLD, OF_VULN_COLD }, { "rPois", OF_RES_POIS, FLAG_END, FLAG_END }, { "rLite", OF_RES_LIGHT, FLAG_END, FLAG_END }, { "rDark", OF_RES_DARK, FLAG_END, FLAG_END }, { "Sound", OF_RES_SOUND, FLAG_END, FLAG_END }, { "Shard", OF_RES_SHARD, FLAG_END, FLAG_END }, { "Nexus", OF_RES_NEXUS, FLAG_END, FLAG_END }, { "Nethr", OF_RES_NETHR, FLAG_END, FLAG_END }, { "Chaos", OF_RES_CHAOS, FLAG_END, FLAG_END }, { "Disen", OF_RES_DISEN, FLAG_END, FLAG_END }, { "Feath", OF_FEATHER, FLAG_END, FLAG_END }, { "pFear", OF_RES_FEAR, FLAG_END, FLAG_END }, { "pBlnd", OF_RES_BLIND, FLAG_END, FLAG_END }, { "pConf", OF_RES_CONFU, FLAG_END, FLAG_END }, { "pStun", OF_RES_STUN, FLAG_END, FLAG_END }, { "Light", OF_LIGHT, FLAG_END, FLAG_END }, { "Regen", OF_REGEN, FLAG_END, FLAG_END }, { " ESP", OF_TELEPATHY, FLAG_END, FLAG_END }, { "Invis", OF_SEE_INVIS, FLAG_END, FLAG_END }, { "FrAct", OF_FREE_ACT, FLAG_END, FLAG_END }, { "HLife", OF_HOLD_LIFE, FLAG_END, FLAG_END }, { "Stea.", OF_STEALTH, FLAG_END, FLAG_END }, { "Sear.", OF_SEARCH, FLAG_END, FLAG_END }, { "Infra", OF_INFRA, FLAG_END, FLAG_END }, { "Tunn.", OF_TUNNEL, FLAG_END, FLAG_END }, { "Speed", OF_SPEED, FLAG_END, FLAG_END }, { "Blows", OF_BLOWS, FLAG_END, FLAG_END }, { "Shots", OF_SHOTS, FLAG_END, FLAG_END }, { "Might", OF_MIGHT, FLAG_END, FLAG_END }, { "S.Dig", OF_SLOW_DIGEST, FLAG_END, FLAG_END }, { "ImpHP", OF_IMPAIR_HP, FLAG_END, FLAG_END }, { " Fear", OF_AFRAID, FLAG_END, FLAG_END }, { "Aggrv", OF_AGGRAVATE, FLAG_END, FLAG_END }, }; #define RES_COLS (5 + 2 + INVEN_TOTAL - INVEN_WIELD) static const region resist_region[] = { { 0*(RES_COLS+1), 10, RES_COLS, RES_ROWS+2 }, { 1*(RES_COLS+1), 10, RES_COLS, RES_ROWS+2 }, { 2*(RES_COLS+1), 10, RES_COLS, RES_ROWS+2 }, { 3*(RES_COLS+1), 10, RES_COLS, RES_ROWS+2 }, }; static void display_resistance_panel(const struct player_flag_record *resists, size_t size, const region *bounds) { size_t i, j; int col = bounds->col; int row = bounds->row; Term_putstr(col, row++, RES_COLS, TERM_WHITE, " abcdefghijkl@"); for (i = 0; i < size-3; i++, row++) { byte name_attr = TERM_WHITE; Term_gotoxy(col+6, row); /* repeated extraction of flags is inefficient but more natural */ for (j = INVEN_WIELD; j <= INVEN_TOTAL; j++) { object_type *o_ptr = &p_ptr->inventory[j]; bitflag f[OF_SIZE]; byte attr = TERM_WHITE | (j % 2) * 8; /* alternating columns */ char sym = '.'; bool res, imm, vuln; /* Wipe flagset */ of_wipe(f); if (j < INVEN_TOTAL && o_ptr->kind) { object_flags_known(o_ptr, f); } else if (j == INVEN_TOTAL) { player_flags(f); /* If the race has innate infravision/digging, force the corresponding flag here. If we set it in player_flags(), then all callers of that function will think the infravision is caused by equipment. */ if (p_ptr->race->infra > 0) of_on(f, OF_INFRA); if (p_ptr->race->r_skills[SKILL_DIGGING] > 0) of_on(f, OF_TUNNEL); } res = of_has(f, resists[i].res_flag); imm = of_has(f, resists[i].im_flag); vuln = of_has(f, resists[i].vuln_flag); if (imm) name_attr = TERM_GREEN; else if (res && name_attr == TERM_WHITE) name_attr = TERM_L_BLUE; if (vuln) sym = '-'; else if (imm) sym = '*'; else if (res) sym = '+'; else if ((j < INVEN_TOTAL) && o_ptr->kind && !object_flag_is_known(o_ptr, resists[i].res_flag)) sym = '?'; Term_addch(attr, sym); } Term_putstr(col, row, 6, name_attr, format("%5s:", resists[i].name)); } Term_putstr(col, row++, RES_COLS, TERM_WHITE, " abcdefghijkl@"); /* Equippy */ display_player_equippy(row++, col+6); } static void display_player_flag_info(void) { int i; for (i = 0; i < 4; i++) { display_resistance_panel(player_flag_table+(i*RES_ROWS), RES_ROWS+3, &resist_region[i]); } } /* * Special display, part 2b */ void display_player_stat_info(void) { int i, row, col; char buf[80]; /* Row */ row = 2; /* Column */ col = 42; /* Print out the labels for the columns */ c_put_str(TERM_WHITE, " Self", row-1, col+5); c_put_str(TERM_WHITE, " RB", row-1, col+12); c_put_str(TERM_WHITE, " CB", row-1, col+16); c_put_str(TERM_WHITE, " EB", row-1, col+20); c_put_str(TERM_WHITE, " Best", row-1, col+24); /* Display the stats */ for (i = 0; i < A_MAX; i++) { /* Reduced */ if (p_ptr->stat_cur[i] < p_ptr->stat_max[i]) { /* Use lowercase stat name */ put_str(stat_names_reduced[i], row+i, col); } /* Normal */ else { /* Assume uppercase stat name */ put_str(stat_names[i], row+i, col); } /* Indicate natural maximum */ if (p_ptr->stat_max[i] == 18+100) { put_str("!", row+i, col+3); } /* Internal "natural" maximum value */ cnv_stat(p_ptr->stat_max[i], buf, sizeof(buf)); c_put_str(TERM_L_GREEN, buf, row+i, col+5); /* Race Bonus */ strnfmt(buf, sizeof(buf), "%+3d", p_ptr->race->r_adj[i]); c_put_str(TERM_L_BLUE, buf, row+i, col+12); /* Class Bonus */ strnfmt(buf, sizeof(buf), "%+3d", p_ptr->class->c_adj[i]); c_put_str(TERM_L_BLUE, buf, row+i, col+16); /* Equipment Bonus */ strnfmt(buf, sizeof(buf), "%+3d", p_ptr->state.stat_add[i]); c_put_str(TERM_L_BLUE, buf, row+i, col+20); /* Resulting "modified" maximum value */ cnv_stat(p_ptr->state.stat_top[i], buf, sizeof(buf)); c_put_str(TERM_L_GREEN, buf, row+i, col+24); /* Only display stat_use if there has been draining */ if (p_ptr->stat_cur[i] < p_ptr->stat_max[i]) { cnv_stat(p_ptr->state.stat_use[i], buf, sizeof(buf)); c_put_str(TERM_YELLOW, buf, row+i, col+31); } } } /* * Special display, part 2c * * How to print out the modifications and sustains. * Positive mods with no sustain will be light green. * Positive mods with a sustain will be dark green. * Sustains (with no modification) will be a dark green 's'. * Negative mods (from a curse) will be red. * Huge mods (>9), like from MICoMorgoth, will be a '*' * No mod, no sustain, will be a slate '.' */ static void display_player_sust_info(void) { int i, j, row, col, stat; object_type *o_ptr; bitflag f[OF_SIZE]; int stat_flags[A_MAX]; int sustain_flags[A_MAX]; byte a; char c; /* Row */ row = 2; /* Column */ col = 26; /* Build the stat flags tables */ stat_flags[A_STR] = OF_STR; stat_flags[A_INT] = OF_INT; stat_flags[A_WIS] = OF_WIS; stat_flags[A_DEX] = OF_DEX; stat_flags[A_CON] = OF_CON; sustain_flags[A_STR] = OF_SUST_STR; sustain_flags[A_INT] = OF_SUST_INT; sustain_flags[A_WIS] = OF_SUST_WIS; sustain_flags[A_DEX] = OF_SUST_DEX; sustain_flags[A_CON] = OF_SUST_CON; /* Header */ c_put_str(TERM_WHITE, "abcdefghijkl@", row-1, col); /* Process equipment */ for (i = INVEN_WIELD; i < INVEN_TOTAL; ++i) { /* Get the object */ o_ptr = &p_ptr->inventory[i]; if (!o_ptr->kind) { col++; continue; } /* Get the "known" flags */ object_flags_known(o_ptr, f); /* Initialize color based of sign of pval. */ for (stat = 0; stat < A_MAX; stat++) { /* Default */ a = TERM_SLATE; c = '.'; /* Boost */ if (of_has(f, stat_flags[stat])) { /* Default */ c = '*'; /* Work out which pval we're talking about */ j = which_pval(o_ptr, stat_flags[stat]); /* Good */ if (o_ptr->pval[j] > 0) { /* Good */ a = TERM_L_GREEN; /* Label boost */ if (o_ptr->pval[j] < 10) c = I2D(o_ptr->pval[j]); } /* Bad */ if (o_ptr->pval[j] < 0) { /* Bad */ a = TERM_RED; /* Label boost */ if (o_ptr->pval[j] > -10) c = I2D(-(o_ptr->pval[j])); } } /* Sustain */ if (of_has(f, sustain_flags[stat])) { /* Dark green */ a = TERM_GREEN; /* Convert '.' to 's' */ if (c == '.') c = 's'; } if ((c == '.') && o_ptr->kind && !object_flag_is_known(o_ptr, sustain_flags[stat])) c = '?'; /* Dump proper character */ Term_putch(col, row+stat, a, c); } /* Advance */ col++; } /* Player flags */ player_flags(f); /* Check stats */ for (stat = 0; stat < A_MAX; ++stat) { /* Default */ a = TERM_SLATE; c = '.'; /* Sustain */ if (of_has(f, sustain_flags[stat])) { /* Dark green "s" */ a = TERM_GREEN; c = 's'; } /* Dump */ Term_putch(col, row+stat, a, c); } /* Column */ col = 26; /* Footer */ c_put_str(TERM_WHITE, "abcdefghijkl@", row+6, col); /* Equippy */ display_player_equippy(row+7, col); } static void display_panel(const struct panel *p, bool left_adj, const region *bounds) { size_t i; int col = bounds->col; int row = bounds->row; int w = bounds->width; int offset = 0; region_erase(bounds); if (left_adj) { for (i = 0; i < p->len; i++) { struct panel_line *pl = &p->lines[i]; int len = pl->label ? strlen(pl->label) : 0; if (offset < len) offset = len; } offset += 2; } for (i = 0; i < p->len; i++, row++) { int len; struct panel_line *pl = &p->lines[i]; if (!pl->label) continue; Term_putstr(col, row, strlen(pl->label), TERM_WHITE, pl->label); len = strlen(pl->value); len = len < w - offset ? len : w - offset - 1; if (left_adj) Term_putstr(col+offset, row, len, pl->attr, pl->value); else Term_putstr(col+w-len, row, len, pl->attr, pl->value); } } static const char *show_title(void) { if (p_ptr->wizard) return "[=-WIZARD-=]"; else if (p_ptr->total_winner || p_ptr->lev > PY_MAX_LEVEL) return "***WINNER***"; else return p_ptr->class->title[(p_ptr->lev - 1) / 5]; } static const char *show_adv_exp(void) { if (p_ptr->lev < PY_MAX_LEVEL) { static char buffer[30]; s32b advance = (player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L); strnfmt(buffer, sizeof(buffer), "%d", advance); return buffer; } else { return "********"; } } static const char *show_depth(void) { static char buffer[13]; if (p_ptr->max_depth == 0) return "Town"; strnfmt(buffer, sizeof(buffer), "%d' (L%d)", p_ptr->max_depth * 50, p_ptr->max_depth); return buffer; } static const char *show_speed(void) { static char buffer[10]; int tmp = p_ptr->state.speed; if (p_ptr->timed[TMD_FAST]) tmp -= 10; if (p_ptr->timed[TMD_SLOW]) tmp += 10; if (p_ptr->searching) tmp += 10; if (tmp == 110) return "Normal"; strnfmt(buffer, sizeof(buffer), "%d", tmp - 110); return buffer; } static byte max_color(int val, int max) { return val < max ? TERM_YELLOW : TERM_L_GREEN; } /* colours for table items */ static const byte colour_table[] = { TERM_RED, TERM_RED, TERM_RED, TERM_L_RED, TERM_ORANGE, TERM_YELLOW, TERM_YELLOW, TERM_GREEN, TERM_GREEN, TERM_L_GREEN, TERM_L_BLUE }; static struct panel *get_panel_topleft(void) { struct panel *p = panel_allocate(7); panel_line(p, TERM_L_BLUE, "Name", "%s", op_ptr->full_name); panel_line(p, TERM_L_BLUE, "Sex", "%s", p_ptr->sex->title); panel_line(p, TERM_L_BLUE, "Race", "%s", p_ptr->race->name); panel_line(p, TERM_L_BLUE, "Class", "%s", p_ptr->class->name); panel_line(p, TERM_L_BLUE, "Title", "%s", show_title()); panel_line(p, TERM_L_BLUE, "HP", "%d/%d", p_ptr->chp, p_ptr->mhp); panel_line(p, TERM_L_BLUE, "SP", "%d/%d", p_ptr->csp, p_ptr->msp); return p; } static struct panel *get_panel_midleft(void) { struct panel *p = panel_allocate(9); panel_line(p, max_color(p_ptr->lev, p_ptr->max_lev), "Level", "%d", p_ptr->lev); panel_line(p, max_color(p_ptr->exp, p_ptr->max_exp), "Cur Exp", "%d", p_ptr->exp); panel_line(p, TERM_L_GREEN, "Max Exp", "%d", p_ptr->max_exp); panel_line(p, TERM_L_GREEN, "Adv Exp", "%s", show_adv_exp()); panel_space(p); panel_line(p, TERM_L_GREEN, "Gold", "%d", p_ptr->au); panel_line(p, TERM_L_GREEN, "Burden", "%.1f lbs", p_ptr->total_weight / 10.0F); panel_line(p, TERM_L_GREEN, "Speed", "%s", show_speed()); panel_line(p, TERM_L_GREEN, "Max Depth", "%s", show_depth()); return p; } static struct panel *get_panel_combat(void) { struct panel *p = panel_allocate(9); struct object *obj; int bth, dam, hit; int melee_dice = 1, melee_sides = 1; /* AC */ panel_line(p, TERM_L_BLUE, "Armor", "[%d,%+d]", p_ptr->state.dis_ac, p_ptr->state.dis_to_a); /* Melee */ obj = &p_ptr->inventory[INVEN_WIELD]; bth = (p_ptr->state.skills[SKILL_TO_HIT_MELEE] * 10) / BTH_PLUS_ADJ; dam = p_ptr->state.dis_to_d + (object_attack_plusses_are_visible(obj) ? obj->to_d : 0); hit = p_ptr->state.dis_to_h + (object_attack_plusses_are_visible(obj) ? obj->to_h : 0); panel_space(p); if (obj->kind) { melee_dice = obj->dd; melee_sides = obj->ds; } panel_line(p, TERM_L_BLUE, "Melee", "%dd%d,%+d", melee_dice, melee_sides, dam); panel_line(p, TERM_L_BLUE, "To-hit", "%d,%+d", bth / 10, hit); panel_line(p, TERM_L_BLUE, "Blows", "%d.%d/turn", p_ptr->state.num_blows / 100, (p_ptr->state.num_blows / 10 % 10)); /* Ranged */ obj = &p_ptr->inventory[INVEN_BOW]; bth = (p_ptr->state.skills[SKILL_TO_HIT_BOW] * 10) / BTH_PLUS_ADJ; hit = p_ptr->state.dis_to_h + (object_attack_plusses_are_visible(obj) ? obj->to_h : 0); dam = object_attack_plusses_are_visible(obj) ? obj->to_d : 0; panel_space(p); panel_line(p, TERM_L_BLUE, "Shoot to-dam", "%+d", dam); panel_line(p, TERM_L_BLUE, "To-hit", "%d,%+d", bth / 10, hit); panel_line(p, TERM_L_BLUE, "Shots", "%d/turn", p_ptr->state.num_shots); return p; } static struct panel *get_panel_skills(void) { struct panel *p = panel_allocate(7); int skill; byte attr; const char *desc; #define BOUND(x, min, max) MIN(max, MAX(min, x)) /* Saving throw */ skill = BOUND(p_ptr->state.skills[SKILL_SAVE], 0, 100); panel_line(p, colour_table[skill / 10], "Saving Throw", "%d%%", skill); /* Stealth */ desc = likert(p_ptr->state.skills[SKILL_STEALTH], 1, &attr); panel_line(p, attr, "Stealth", "%s", desc); /* Disarming: -5 because we assume we're disarming a dungeon trap */ skill = BOUND(p_ptr->state.skills[SKILL_DISARM] - 5, 2, 100); panel_line(p, colour_table[skill / 10], "Disarming", "%d%%", skill); /* Magic devices */ skill = p_ptr->state.skills[SKILL_DEVICE]; panel_line(p, colour_table[skill / 13], "Magic Devices", "%d", skill); /* Search frequency */ skill = MAX(p_ptr->state.skills[SKILL_SEARCH_FREQUENCY], 1); if (skill >= 50) { panel_line(p, colour_table[10], "Perception", "1 in 1"); } else { /* convert to chance of searching */ skill = 50 - skill; panel_line(p, colour_table[(100 - skill*2) / 10], "Perception", "1 in %d", skill); } /* Searching ability */ skill = BOUND(p_ptr->state.skills[SKILL_SEARCH], 0, 100); panel_line(p, colour_table[skill / 10], "Searching", "%d%%", skill); /* Infravision */ panel_line(p, TERM_L_GREEN, "Infravision", "%d ft", p_ptr->state.see_infra * 10); return p; } static struct panel *get_panel_misc(void) { struct panel *p = panel_allocate(7); byte attr = TERM_L_BLUE; panel_line(p, attr, "Age", "%d", p_ptr->age); panel_line(p, attr, "Height", "%d'%d\"", p_ptr->ht / 12, p_ptr->ht % 12); panel_line(p, attr, "Weight", "%dst %dlb", p_ptr->wt / 14, p_ptr->wt % 14); panel_line(p, attr, "Turns used:", ""); panel_line(p, attr, "Game", "%d", turn); panel_line(p, attr, "Standard", "%d", p_ptr->total_energy / 100); panel_line(p, attr, "Resting", "%d", p_ptr->resting_turn); return p; } /* Panels for main character screen */ static const struct { region bounds; bool align_left; struct panel *(*panel)(void); } panels[] = { /* x y wid rows */ { { 1, 1, 40, 7 }, TRUE, get_panel_topleft }, /* Name, Class, ... */ { { 21, 1, 18, 3 }, FALSE, get_panel_misc }, /* Age, ht, wt, ... */ { { 1, 9, 24, 9 }, FALSE, get_panel_midleft }, /* Cur Exp, Max Exp, ... */ { { 29, 9, 19, 9 }, FALSE, get_panel_combat }, { { 52, 9, 20, 8 }, FALSE, get_panel_skills }, }; void display_player_xtra_info(void) { size_t i; for (i = 0; i < N_ELEMENTS(panels); i++) { struct panel *p = panels[i].panel(); display_panel(p, panels[i].align_left, &panels[i].bounds); panel_free(p); } /* Indent output by 1 character, and wrap at column 72 */ text_out_wrap = 72; text_out_indent = 1; /* History */ Term_gotoxy(text_out_indent, 19); text_out_to_screen(TERM_WHITE, p_ptr->history); /* Reset text_out() vars */ text_out_wrap = 0; text_out_indent = 0; return; } /* * Display the character on the screen (two different modes) * * The top two lines, and the bottom line (or two) are left blank. * * Mode 0 = standard display with skills/history * Mode 1 = special display with equipment flags */ void display_player(int mode) { /* Erase screen */ clear_from(0); /* When not playing, do not display in subwindows */ if (Term != angband_term[0] && !p_ptr->playing) return; /* Stat info */ display_player_stat_info(); if (mode) { struct panel *p = panels[0].panel(); display_panel(p, panels[0].align_left, &panels[0].bounds); panel_free(p); /* Stat/Sustain flags */ display_player_sust_info(); /* Other flags */ display_player_flag_info(); } /* Standard */ else { /* Extra info */ display_player_xtra_info(); } } /* * Hack -- Dump a character description file * * XXX XXX XXX Allow the "full" flag to dump additional info, * and trigger its usage from various places in the code. */ errr file_character(const char *path, bool full) { int i, x, y; int a; wchar_t c; ang_file *fp; struct store *st_ptr = &stores[STORE_HOME]; char o_name[80]; char buf[1024]; char *p; /* Unused parameter */ (void)full; /* Open the file for writing */ fp = file_open(path, MODE_WRITE, FTYPE_TEXT); if (!fp) return (-1); /* Begin dump */ file_putf(fp, " [%s Character Dump]\n\n", buildid); /* Display player */ display_player(0); /* Dump part of the screen */ for (y = 1; y < 23; y++) { p = buf; /* Dump each row */ for (x = 0; x < 79; x++) { /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); /* Dump it */ p += wctomb(p, c); } /* Back up over spaces */ while ((p > buf) && (p[-1] == ' ')) --p; /* Terminate */ *p = '\0'; /* End the row */ file_putf(fp, "%s\n", buf); } /* Skip a line */ file_putf(fp, "\n"); /* Display player */ display_player(1); /* Dump part of the screen */ for (y = 11; y < 20; y++) { p = buf; /* Dump each row */ for (x = 0; x < 39; x++) { /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); /* Dump it */ p += wctomb(p, c); } /* Back up over spaces */ while ((p > buf) && (p[-1] == ' ')) --p; /* Terminate */ *p = '\0'; /* End the row */ file_putf(fp, "%s\n", buf); } /* Skip a line */ file_putf(fp, "\n"); /* Dump part of the screen */ for (y = 11; y < 20; y++) { p = buf; /* Dump each row */ for (x = 0; x < 39; x++) { /* Get the attr/char */ (void)(Term_what(x + 40, y, &a, &c)); /* Dump it */ p += wctomb(p, c); } /* Back up over spaces */ while ((p > buf) && (p[-1] == ' ')) --p; /* Terminate */ *p = '\0'; /* End the row */ file_putf(fp, "%s\n", buf); } /* Skip some lines */ file_putf(fp, "\n\n"); /* If dead, dump last messages -- Prfnoff */ if (p_ptr->is_dead) { i = messages_num(); if (i > 15) i = 15; file_putf(fp, " [Last Messages]\n\n"); while (i-- > 0) { file_putf(fp, "> %s\n", message_str((s16b)i)); } file_putf(fp, "\nKilled by %s.\n\n", p_ptr->died_from); } /* Dump the equipment */ file_putf(fp, " [Character Equipment]\n\n"); for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL; i++) { if (i == INVEN_TOTAL) { file_putf(fp, "\n\n [Character Quiver]\n\n"); continue; } object_desc(o_name, sizeof(o_name), &p_ptr->inventory[i], ODESC_PREFIX | ODESC_FULL); if (p_ptr->inventory[i].kind) { file_putf(fp, "%c) %s\n", index_to_label(i), o_name); object_info_chardump(fp, &p_ptr->inventory[i], 5, 72); } } /* Dump the inventory */ file_putf(fp, "\n\n [Character Inventory]\n\n"); for (i = 0; i < INVEN_PACK; i++) { if (!p_ptr->inventory[i].kind) break; object_desc(o_name, sizeof(o_name), &p_ptr->inventory[i], ODESC_PREFIX | ODESC_FULL); file_putf(fp, "%c) %s\n", index_to_label(i), o_name); object_info_chardump(fp, &p_ptr->inventory[i], 5, 72); } file_putf(fp, "\n\n"); /* Dump the Home -- if anything there */ if (st_ptr->stock_num) { /* Header */ file_putf(fp, " [Home Inventory]\n\n"); /* Dump all available items */ for (i = 0; i < st_ptr->stock_num; i++) { object_desc(o_name, sizeof(o_name), &st_ptr->stock[i], ODESC_PREFIX | ODESC_FULL); file_putf(fp, "%c) %s\n", I2A(i), o_name); object_info_chardump(fp, &st_ptr->stock[i], 5, 72); } /* Add an empty line */ file_putf(fp, "\n\n"); } /* Dump character history */ dump_history(fp); file_putf(fp, "\n\n"); /* Dump options */ file_putf(fp, " [Options]\n\n"); /* Dump options */ for (i = 0; i < OPT_PAGE_MAX - 1; i++) { int j; const char *title = ""; switch (i) { case 0: title = "User interface"; break; case 1: title = "Birth"; break; } file_putf(fp, " [%s]\n\n", title); for (j = 0; j < OPT_PAGE_PER; j++) { int opt = option_page[i][j]; if (!option_name(opt)) continue; file_putf(fp, "%-45s: %s (%s)\n", option_desc(opt), op_ptr->opt[opt] ? "yes" : "no ", option_name(opt)); } /* Skip some lines */ file_putf(fp, "\n"); } file_close(fp); /* Success */ return (0); } /* * Make a string lower case. */ static void string_lower(char *buf) { char *s; /* Lowercase the string */ for (s = buf; *s != 0; s++) *s = tolower((unsigned char)*s); } /* * Recursive file perusal. * * Return FALSE on "?", otherwise TRUE. * * This function could be made much more efficient with the use of "seek" * functionality, especially when moving backwards through a file, or * forwards through a file by less than a page at a time. XXX XXX XXX */ bool show_file(const char *name, const char *what, int line, int mode) { int i, k, n; struct keypress ch; /* Number of "real" lines passed by */ int next = 0; /* Number of "real" lines in the file */ int size; /* Backup value for "line" */ int back = 0; /* This screen has sub-screens */ bool menu = FALSE; /* Case sensitive search */ bool case_sensitive = FALSE; /* Current help file */ ang_file *fff = NULL; /* Find this string (if any) */ char *find = NULL; /* Jump to this tag */ const char *tag = NULL; /* Hold a string to find */ char finder[80] = ""; /* Hold a string to show */ char shower[80] = ""; /* Filename */ char filename[1024]; /* Describe this thing */ char caption[128] = ""; /* Path buffer */ char path[1024]; /* General buffer */ char buf[1024]; /* Lower case version of the buffer, for searching */ char lc_buf[1024]; /* Sub-menu information */ char hook[26][32]; int wid, hgt; /* TRUE if we are inside a RST block that should be skipped */ bool skip_lines = FALSE; /* Wipe the hooks */ for (i = 0; i < 26; i++) hook[i][0] = '\0'; /* Get size */ Term_get_size(&wid, &hgt); /* Copy the filename */ my_strcpy(filename, name, sizeof(filename)); n = strlen(filename); /* Extract the tag from the filename */ for (i = 0; i < n; i++) { if (filename[i] == '#') { filename[i] = '\0'; tag = filename + i + 1; break; } } /* Redirect the name */ name = filename; /* Hack XXX XXX XXX */ if (what) { my_strcpy(caption, what, sizeof(caption)); my_strcpy(path, name, sizeof(path)); fff = file_open(path, MODE_READ, FTYPE_TEXT); } /* Look in "help" */ if (!fff) { strnfmt(caption, sizeof(caption), "Help file '%s'", name); path_build(path, sizeof(path), ANGBAND_DIR_HELP, name); fff = file_open(path, MODE_READ, FTYPE_TEXT); } /* Look in "info" */ if (!fff) { strnfmt(caption, sizeof(caption), "Info file '%s'", name); path_build(path, sizeof(path), ANGBAND_DIR_INFO, name); fff = file_open(path, MODE_READ, FTYPE_TEXT); } /* Oops */ if (!fff) { /* Message */ msg("Cannot open '%s'.", name); message_flush(); /* Oops */ return (TRUE); } /* Pre-Parse the file */ while (TRUE) { /* Read a line or stop */ if (!file_getl(fff, buf, sizeof(buf))) break; /* Skip lines if we are inside a RST directive*/ if(skip_lines){ if(contains_only_spaces(buf)) skip_lines=FALSE; continue; } /* Parse a very small subset of RST */ /* TODO: should be more flexible */ if (prefix(buf, ".. ")) { /* parse ".. menu:: [x] filename.txt" (with exact spacing)*/ if(prefix(buf+strlen(".. "), "menu:: [") && buf[strlen(".. menu:: [x")]==']') { /* This is a menu file */ menu = TRUE; /* Extract the menu item */ k = A2I(buf[strlen(".. menu:: [")]); /* Store the menu item (if valid) */ if ((k >= 0) && (k < 26)) my_strcpy(hook[k], buf + strlen(".. menu:: [x] "), sizeof(hook[0])); } /* parse ".. _some_hyperlink_target:" */ else if (buf[strlen(".. ")] == '_') { if (tag) { /* Remove the closing '>' of the tag */ buf[strlen(buf) - 1] = '\0'; /* Compare with the requested tag */ if (streq(buf + strlen(".. _"), tag)) { /* Remember the tagged line */ line = next; } } } /* Skip this and enter skip mode*/ skip_lines = TRUE; continue; } /* Count the "real" lines */ next++; } /* Save the number of "real" lines */ size = next; /* Display the file */ while (TRUE) { /* Clear screen */ Term_clear(); /* Restrict the visible range */ if (line > (size - (hgt - 4))) line = size - (hgt - 4); if (line < 0) line = 0; skip_lines = FALSE; /* Re-open the file if needed */ if (next > line) { /* Close it */ file_close(fff); /* Hack -- Re-Open the file */ fff = file_open(path, MODE_READ, FTYPE_TEXT); if (!fff) return (TRUE); /* File has been restarted */ next = 0; } /* Goto the selected line */ while (next < line) { /* Get a line */ if (!file_getl(fff, buf, sizeof(buf))) break; /* Skip lines if we are inside a RST directive*/ if(skip_lines){ if(contains_only_spaces(buf)) skip_lines=FALSE; continue; } /* Skip RST directives */ if (prefix(buf, ".. ")) { skip_lines=TRUE; continue; } /* Count the lines */ next++; } /* Dump the next lines of the file */ for (i = 0; i < hgt - 4; ) { /* Hack -- track the "first" line */ if (!i) line = next; /* Get a line of the file or stop */ if (!file_getl(fff, buf, sizeof(buf))) break; /* Skip lines if we are inside a RST directive*/ if(skip_lines){ if(contains_only_spaces(buf)) skip_lines=FALSE; continue; } /* Skip RST directives */ if (prefix(buf, ".. ")) { skip_lines=TRUE; continue; } /* skip | characters */ strskip(buf,'|'); /* escape backslashes */ strescape(buf,'\\'); /* Count the "real" lines */ next++; /* Make a copy of the current line for searching */ my_strcpy(lc_buf, buf, sizeof(lc_buf)); /* Make the line lower case */ if (!case_sensitive) string_lower(lc_buf); /* Hack -- keep searching */ if (find && !i && !strstr(lc_buf, find)) continue; /* Hack -- stop searching */ find = NULL; /* Dump the line */ Term_putstr(0, i+2, -1, TERM_WHITE, buf); /* Highlight "shower" */ if (shower[0]) { const char *str = lc_buf; /* Display matches */ while ((str = strstr(str, shower)) != NULL) { int len = strlen(shower); /* Display the match */ Term_putstr(str-lc_buf, i+2, len, TERM_YELLOW, &buf[str-lc_buf]); /* Advance */ str += len; } } /* Count the printed lines */ i++; } /* Hack -- failed search */ if (find) { bell("Search string not found!"); line = back; find = NULL; continue; } /* Show a general "title" */ prt(format("[%s, %s, Line %d-%d/%d]", buildid, caption, line, line + hgt - 4, size), 0, 0); /* Prompt -- menu screen */ if (menu) { /* Wait for it */ prt("[Press a Letter, or ESC to exit.]", hgt - 1, 0); } /* Prompt -- small files */ else if (size <= hgt - 4) { /* Wait for it */ prt("[Press ESC to exit.]", hgt - 1, 0); } /* Prompt -- large files */ else { /* Wait for it */ prt("[Press Space to advance, or ESC to exit.]", hgt - 1, 0); } /* Get a keypress */ ch = inkey(); /* Exit the help */ if (ch.code == '?') break; /* Toggle case sensitive on/off */ if (ch.code == '!') { case_sensitive = !case_sensitive; } /* Try showing */ if (ch.code == '&') { /* Get "shower" */ prt("Show: ", hgt - 1, 0); (void)askfor_aux(shower, sizeof(shower), NULL); /* Make the "shower" lowercase */ if (!case_sensitive) string_lower(shower); } /* Try finding */ if (ch.code == '/') { /* Get "finder" */ prt("Find: ", hgt - 1, 0); if (askfor_aux(finder, sizeof(finder), NULL)) { /* Find it */ find = finder; back = line; line = line + 1; /* Make the "finder" lowercase */ if (!case_sensitive) string_lower(finder); /* Show it */ my_strcpy(shower, finder, sizeof(shower)); } } /* Go to a specific line */ if (ch.code == '#') { char tmp[80] = "0"; prt("Goto Line: ", hgt - 1, 0); if (askfor_aux(tmp, sizeof(tmp), NULL)) line = atoi(tmp); } /* Go to a specific file */ if (ch.code == '%') { char ftmp[80] = "help.hlp"; prt("Goto File: ", hgt - 1, 0); if (askfor_aux(ftmp, sizeof(ftmp), NULL)) { if (!show_file(ftmp, NULL, 0, mode)) ch.code = ESCAPE; } } switch (ch.code) { /* up a line */ case ARROW_UP: case '8': line--; break; /* up a page */ case KC_PGUP: case '9': case '-': line -= (hgt - 4); break; /* home */ case KC_HOME: case '7': line = 0; break; /* down a line */ case ARROW_DOWN: case '2': case KC_ENTER: line++; break; /* down a page */ case KC_PGDOWN: case '3': case ' ': line += hgt - 4; break; /* end */ case KC_END: case '1': line = size; break; } /* Recurse on letters */ if (menu && isalpha((unsigned char)ch.code)) { /* Extract the requested menu item */ k = A2I(ch.code); /* Verify the menu item */ if ((k >= 0) && (k <= 25) && hook[k][0]) { /* Recurse on that file */ if (!show_file(hook[k], NULL, 0, mode)) ch.code = ESCAPE; } } /* Exit on escape */ if (ch.code == ESCAPE) break; } /* Close the file */ file_close(fff); /* Done */ return (ch.code != '?'); } /* * Peruse the On-Line-Help */ void do_cmd_help(void) { /* Save screen */ screen_save(); /* Peruse the main help file */ (void)show_file("help.hlp", NULL, 0, 0); /* Load screen */ screen_load(); } /* * Save the game */ void save_game(void) { /* Disturb the player */ disturb(p_ptr, 1, 0); /* Clear messages */ message_flush(); /* Handle stuff */ handle_stuff(p_ptr); /* Message */ prt("Saving game...", 0, 0); /* Refresh */ Term_fresh(); /* The player is not dead */ my_strcpy(p_ptr->died_from, "(saved)", sizeof(p_ptr->died_from)); /* Forbid suspend */ signals_ignore_tstp(); /* Save the player */ if (savefile_save(savefile)) prt("Saving game... done.", 0, 0); else prt("Saving game... failed!", 0, 0); /* Allow suspend again */ signals_handle_tstp(); /* Refresh */ Term_fresh(); /* Note that the player is not dead */ my_strcpy(p_ptr->died_from, "(alive and well)", sizeof(p_ptr->died_from)); } /* * Close up the current game (player may or may not be dead) * * Note that the savefile is not saved until the tombstone is * actually displayed and the player has a chance to examine * the inventory and such. This allows cheating if the game * is equipped with a "quit without save" method. XXX XXX XXX */ void close_game(void) { /* Handle stuff */ handle_stuff(p_ptr); /* Flush the messages */ message_flush(); /* Flush the input */ flush(); /* No suspending now */ signals_ignore_tstp(); /* Hack -- Increase "icky" depth */ character_icky++; /* Handle death */ if (p_ptr->is_dead) { death_screen(); } /* Still alive */ else { /* Save the game */ save_game(); if (Term->mapped_flag) { struct keypress ch; prt("Press Return (or Escape).", 0, 40); ch = inkey(); if (ch.code != ESCAPE) predict_score(); } } /* Hack -- Decrease "icky" depth */ character_icky--; /* Allow suspending now */ signals_handle_tstp(); } angband-3.5.1/src/main-nds.c0000644000175000017500000013456212456456606015114 0ustar chriscchrisc/* * File: main-nds.c * Purpose: Main file for playing on the Nintendo DS * * Copyright (c) 2010 Nick McConnell * * Many of the routines are based on (or lifted directly from) brettk's * excellent NethackDS: http://frodo.dyn.gno.org/~brettk/NetHackDS * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include #include #include "angband.h" #include "buildid.h" #include "main.h" /* DS includes */ #include "nds/ds_errfont.h" #include "nds/ds_main.h" u16* subfont_rgb_bin = (u16*)(0x06018400); u16* subfont_bgr_bin = (u16*)(0x0601C400); u16* top_font_bin; u16* btm_font_bin; u16* tiles_bin;// = (u16*)0x06020400; #define NDS_BUTTON_FILE "buttons.dat" #define NDS_MAPPABLE_MASK (KEY_A | KEY_B | KEY_X | KEY_Y | KEY_START | KEY_SELECT) #define NDS_MODIFIER_MASK (KEY_L | KEY_R) #define NDS_BUTTON_MASK (NDS_MAPPABLE_MASK | NDS_MODIFIER_MASK) #define NDS_NUM_MAPPABLE 6 // A, B, X, Y, Select, Start #define NDS_NUM_MODIFIER 2 // R, L #define NDS_CMD_LENGTH 16 // max. 15 keys/button + null terminator //[mappable]*2^[mods] things to map commands to, [cmd_length] chars per command byte nds_btn_cmds[NDS_NUM_MAPPABLE << NDS_NUM_MODIFIER][NDS_CMD_LENGTH]; /* make sure there's something there to start with - NRM */ byte btn_defaults[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'z'}; const s16 mappables[] = { KEY_A, KEY_B, KEY_X, KEY_Y, KEY_SELECT, KEY_START }; const s16 modifiers[] = { KEY_L, KEY_R }; s16 nds_buttons_to_btnid(u16 kd, u16 kh) { if (!(kd & NDS_MAPPABLE_MASK)) return -1; u16 i, mods = 0; for (i=0;i>3),(a[i+1]>>3),(a[i+2]>>3))) #define c2(a,i) (RGB15((a[i+2]>>3),(a[i+1]>>3),(a[i]>>3))) #define TILE_BUFFER_SIZE (TILE_WIDTH*TILE_HEIGHT*(total_tiles_used+1)*2) const nds_kbd_key row0[] = { {16,(u16)'`'}, {16,(u16)'1'}, {16,(u16)'2'}, {16,(u16)'3'}, {16,(u16)'4'}, {16,(u16)'5'}, {16,(u16)'6'}, {16,(u16)'7'}, {16,(u16)'8'}, {16,(u16)'9'}, {16,(u16)'0'}, {16,(u16)'-'}, {16,(u16)'='}, {32,(u16)'\b'}, {0,0}}; const nds_kbd_key row1[] = { {24,(u16)'\t'}, {16,(u16)'q'}, {16,(u16)'w'}, {16,(u16)'e'}, {16,(u16)'r'}, {16,(u16)'t'}, {16,(u16)'y'}, {16,(u16)'u'}, {16,(u16)'i'}, {16,(u16)'o'}, {16,(u16)'p'}, {16,(u16)'['}, {16,(u16)']'}, {24,(u16)'\\'}, {0,0}}; const nds_kbd_key row2[] = { {32,K_CAPS}, {16,(u16)'a'}, {16,(u16)'s'}, {16,(u16)'d'}, {16,(u16)'f'}, {16,(u16)'g'}, {16,(u16)'h'}, {16,(u16)'j'}, {16,(u16)'k'}, {16,(u16)'l'}, {16,(u16)';'}, {16,(u16)'\''}, {32,(u16)'\n'}, {0,0}}; const nds_kbd_key row3[] = { {40,K_SHIFT}, {16,(u16)'z'}, {16,(u16)'x'}, {16,(u16)'c'}, {16,(u16)'v'}, {16,(u16)'b'}, {16,(u16)'n'}, {16,(u16)'m'}, {16,(u16)','}, {16,(u16)'.'}, {16,(u16)'/'}, {40,K_SHIFT}, {0,0}}; const nds_kbd_key row4[] = { {32,K_CTRL}, {24,K_ALT}, {128,(u16)' '}, {24,K_ALT}, {32,K_CTRL}, {0,0}}; char shifts[] = "`~1!2@3#4$5%6^7&8*9(0)-_=+[{]}\\|;:\'\",<.>/?"; const nds_kbd_key *kbdrows[] = {row0, row1, row2, row3, row4}; /* * Extra data to associate with each "window" * * Each "window" is represented by a "term_data" structure, which * contains a "term" structure, which contains a pointer (t->data) * back to the term_data structure. */ typedef struct term_data term_data; struct term_data { term t; byte rows; byte cols; int tile_height; int tile_width; }; /* * Number of "term_data" structures to support XXX XXX XXX * * You MUST support at least one "term_data" structure, and the * game will currently use up to eight "term_data" structures if * they are available. * * If only one "term_data" structure is supported, then a lot of * the things that would normally go into a "term_data" structure * could be made into global variables instead. */ #define MAX_TERM_DATA 1 /* * An array of "term_data" structures, one for each "sub-window" */ static term_data data[MAX_TERM_DATA]; /* * Colour data */ u16b color_data[] = { RGB15( 0, 0, 0), /* TERM_DARK */ RGB15( 31, 31, 31), /* TERM_WHITE */ RGB15( 15, 15, 15), /* TERM_SLATE */ RGB15( 31, 15, 0), /* TERM_ORANGE */ RGB15( 23, 0, 0), /* TERM_RED */ RGB15( 0, 15, 9), /* TERM_GREEN */ RGB15( 0, 0, 31), /* TERM_BLUE */ RGB15( 15, 9, 0), /* TERM_UMBER */ RGB15( 9, 9, 9), /* TERM_L_DARK */ RGB15( 23, 23, 23), /* TERM_L_WHITE */ RGB15( 31, 0, 31), /* TERM_VIOLET */ RGB15( 31, 31, 0), /* TERM_YELLOW */ RGB15( 31, 0, 0), /* TERM_L_RED */ RGB15( 0, 31, 0), /* TERM_L_GREEN */ RGB15( 0, 31, 31), /* TERM_L_BLUE */ RGB15( 23, 15, 9) /* TERM_L_UMBER */ }; /*** Function hooks needed by "Term" ***/ /* * Init a new "term" * * This function should do whatever is necessary to prepare a new "term" * for use by the "term.c" package. This may include clearing the window, * preparing the cursor, setting the font/colors, etc. Usually, this * function does nothing, and the "init_xxx()" function does it all. */ static void Term_init_nds(term *t) { term_data *td = (term_data*)(t->data); /* XXX XXX XXX */ } /* * Nuke an old "term" * * This function is called when an old "term" is no longer needed. It should * do whatever is needed to clean up before the program exits, such as wiping * the screen, restoring the cursor, fixing the font, etc. Often this function * does nothing and lets the operating system clean up when the program quits. */ static void Term_nuke_nds(term *t) { term_data *td = (term_data*)(t->data); /* XXX XXX XXX */ } /* * Find the square a particular pixel is part of. */ static void pixel_to_square(int * const x, int * const y, const int ox, const int oy) { (*x) = ox / TILE_WIDTH; (*y) = oy / TILE_HEIGHT; } /* * Handle a touch on the touch screen. */ static void handle_touch(int x, int y, int button, bool press) { /* The co-ordinates are only used in Angband format. */ pixel_to_square(&x, &y, x, y); if (press) Term_mousepress(x, y, button); } /* * Touchscreen keyboard handling */ static bool shift = false, ctrl = false, alt = false, caps = false; u16b kbd_mod_code(u16 ret) { if (ret & K_MODIFIER) return ret; if (caps && !shift) { if (ret >= 'a' && ret <= 'z') ret -= 0x20; } if (shift) { char* temp; if (!caps && ret >= 'a' && ret <= 'z') ret -= 0x20; if ((temp = strchr(shifts,ret)) != NULL) ret = *(temp + 1); } if (alt) { ret |= 0x80; } if (ctrl/* && ret >= 'a' && ret < 'a'+32*/) { ret = ret & 0x1f; } return ret; } void kbd_set_color_from_pos(u16b r, u16b k, byte color) { u16b ii, xx = 0, jj; u16b *map[] = { (u16b*)(BG_MAP_RAM_SUB(8)+3*32*2), (u16b*)(BG_MAP_RAM_SUB(9)+3*32*2), (u16b*)(BG_MAP_RAM_SUB(10)+3*32*2), (u16b*)(BG_MAP_RAM_SUB(11)+3*32*2) }; for (ii = 0; ii < k; ii++) { xx += kbdrows[r][ii].width >> 3; } for (ii = 0; ii < (kbdrows[r][k].width>>3); ii++) { for (jj = 0; jj < 4; jj++) { map[jj][(10 + r * 2) * 32 + ii + xx + 1] = (map[jj][(10+r*2)*32+ii+xx+1] & 0x0FFF) | (color << 12); map[jj][(10 + r * 2 + 1) * 32 + ii + xx + 1] = (map[jj][(10+r*2+1)*32+ii+xx+1] & 0x0FFF) | (color << 12); } } } void kbd_set_color_from_code(u16b code, byte color) { u16b r,k; for (r = 0; r < 5; r++) { for (k = 0; kbdrows[r][k].width != 0; k++) { if (kbd_mod_code(kbdrows[r][k].code) == code) { kbd_set_color_from_pos(r,k,color); } // do not break!! there may be >1 key with this code (modifier keys) } } } void kbd_set_map() { SUB_BG0_CR = BG_TILE_BASE(0) | BG_MAP_BASE(8 + (caps | (shift<<1))) | BG_PRIORITY(0) | BG_16_COLOR; } u16b kbd_xy2key(byte x, byte y) { if (x >= 104 && x < 152 && y >=24 && y < 72) { // on arrow-pad byte kx = (x-104)/16, ky = (y-24)/16; return (kx + (2 - ky) * 3 + 1 + '0')/* | (shift ? K_SHIFTED_MOVE : 0)*/; } if (y >=80 && y < 96) { if (x >= 8 && x < 24) return '\033'; if (x >= 40 && x < 248) { // F-key x -= 40; y = x/72; // which section x -= y*72; // offset in section if (x < 64) { return K_F(y*4+(x>>4)+1); // section*4 + offset/16 + 1 } else { return 0; } } } s16b ox = x - 8, oy = y-104; if (ox < 0 || ox >= 240) return 0; if (oy < 0 || oy >= 80) return 0; u16b row = oy / 16; int i; for (i = 0; ox > 0; ox -= kbdrows[row][i++].width); u16b ret = kbdrows[row][i-1].code; return kbd_mod_code(ret); } void kbd_dotoggle(bool *flag, int how) { switch (how) { case 0: *flag = false; return; case 1: *flag = true; return; default: case -1: *flag = !*flag; return; } } // which: K_SHIFT, K_CTRL, K_ALT, K_MODIFIER=all keys // how: -1 = toggle, 0 = off, 1 = on void kbd_togglemod(int which, int how) { //boolean old_shift = shift, old_ctrl = ctrl, old_alt = alt, old_caps = caps; switch (which) { case K_CTRL: kbd_dotoggle(&ctrl,how); break; case K_SHIFT: kbd_dotoggle(&shift,how); break; case K_ALT: kbd_dotoggle(&alt,how); break; case K_CAPS: kbd_dotoggle(&caps,how); break; case K_MODIFIER: kbd_dotoggle(&ctrl,how); kbd_dotoggle(&shift,how); kbd_dotoggle(&alt,how); // NOT caps!! This is called to un-set shift, ctrl, and alt after // a key is pressed. Unsetting caps here would cause it to be the // same as shift. break; } /* if (old_shift != shift) */ kbd_set_color_from_code(K_SHIFT,shift); /* if (old_ctrl != ctrl) */ kbd_set_color_from_code(K_CTRL,ctrl); /* if (old_alt != alt) */ kbd_set_color_from_code(K_ALT,alt); /* if (old_caps != caps) */ kbd_set_color_from_code(K_CAPS,caps); kbd_set_map(); } // clear this to prevent alt-b, f5, and f6 from having their special effects // it's cleared during getlin, yn_function, etc byte process_special_keystrokes = 1; // run this every frame // returns a key code if one has been typed, else returns 0 // assumes scankeys() was already called this frame (in real vblank handler) byte kbd_vblank() { // frames the stylus has been held down for static u16b touched = 0; // coordinates from each frame, the median is used to get the keycode static s16b xarr[3],yarr[3]; // the keycode of the last key pressed, so it can be un-highlighted static u16b last_code; // the keycode of the currently pressed key, is usu. returned u16b keycode; // if screen is being touched... if (keysHeld() & KEY_TOUCH) { if (touched < 3) { // if counter < 3... touched++; // add to counter xarr[touched-1] = IPC->touchXpx; // add this to the array for yarr[touched-1] = IPC->touchYpx; // finding the median } } else { // not being touched touched = 0; // so reset the counter for next time } // if the stylus was released if (keysUp() & KEY_TOUCH) { // if last_code is set and it wasn't a modifier if (last_code && !(last_code & K_MODIFIER)) { // clear the hiliting on this key kbd_set_color_from_code(last_code,0); // and also clear all modifiers (except caps) kbd_togglemod(K_MODIFIER, 0); } last_code = 0; } // if the screen has been touched for 3 frames... if (touched == 3) { touched++; // do not return the keycode again // also, not setting to zero prevents the keysHeld() thing // from starting the process over and getting 3 more samples u16b i, tmp, the_x=0, the_y=0; // x/yarr now contains 3 values from each of the 3 frames // take the median of each array and put into the_x/y // sort the array // bubble sort, ugh for (i = 1; i < 3; i++) { if (xarr[i] < xarr[i-1]) { tmp = xarr[i]; xarr[i] = xarr[i-1]; xarr[i-1] = tmp; } if (yarr[i] < yarr[i-1]) { tmp = yarr[i]; yarr[i] = yarr[i-1]; yarr[i-1] = tmp; } } // get the middle value (median) // if it's -1, take the top value if (xarr[1] == -1) the_x = xarr[2]; else the_x = xarr[1]; if (yarr[1] == -1) the_y = yarr[2]; else the_y = yarr[1]; // get the keycode that corresponds to this key u16b keycode = kbd_xy2key(the_x, the_y); // if it's not a modifier, highlight it if (keycode && !(keycode & K_MODIFIER)) kbd_set_color_from_code(keycode,1); // set last_code so it can be un-highlighted later last_code = keycode; /*// check for special keystrokes: alt-b, f5, f6 if (process_special_keystrokes) { // alt-b: assign button macro if (keycode == ('b' | 0x80)) { // clear hiliting kbd_set_color_from_code(keycode,0); kbd_togglemod(K_MODIFIER,0); nds_assign_button(); keycode = last_code = 0; // don't let nethack process it } if (keycode & K_F(0)) { // its an f-key if (keycode == K_F(5)) { // F5: toggle to text mode nds_ascii_graphics = ~nds_ascii_graphics; iflags.use_color = nds_ascii_graphics; //doredraw(); keycode = 'R' & 0x1F; // send a redraw command to nethack last_code = 0; } else if (keycode == K_F(6)) { // F6: toggle top font swap_font(false); nds_updated = 0xFF; if (access("/NetHack/swapfont",04)!= -1) { unlink("/NetHack/swapfont"); } else { FILE* f = fopen("/NetHack/swapfont","w"); fwrite(&f,4,1,f); // otherwise FileExists doesnt work fclose(f); } keycode = last_code = 0; } kbd_togglemod(K_MODIFIER,0); } }*/ // if it's a modifier, toggle it if (keycode & K_MODIFIER) kbd_togglemod(keycode,-1); else if ((keycode & 0x7F) != 0) { // it's an actual keystroke, return it return (keycode & 0xFF); } } return 0; } void nds_check_buttons(u16b kd, u16b kh) { s16b btn = nds_buttons_to_btnid(kd,kh); if (btn == -1) return; byte *cmd = &nds_btn_cmds[btn][0]; while (*cmd != 0) { put_key_event(*(cmd++)); } } /* * All event handling */ u16b *ebuf = (u16b*)(&BG_GFX[256*192]); // store the queue just past mainscreen display data u16b ebuf_read = 0, ebuf_write = 0; byte nds_updated = 0; // windows that have been updated and should be redrawn bool has_event() { return ((ebuf[ebuf_read] & EVENT_SET) || (ebuf_read < ebuf_write)); // read < write should never happen without EVENT_SET, but // just in case... } u16b get_event() { if (!has_event()) return 0; u16b r = ebuf[ebuf_read]; ebuf[ebuf_read] = 0; ebuf_read++; if (ebuf_read > ebuf_write) { ebuf_write++; if (ebuf_write >= MAX_EBUF) ebuf_write = 0; } if (ebuf_read >= MAX_EBUF) ebuf_read = 0; return r; } void put_key_event(byte c) { ebuf[ebuf_write++] = EVENT_SET | (u16)c; if (ebuf_write >= MAX_EBUF) ebuf_write = 0; } void put_mouse_event(byte x, byte y) { ebuf[ebuf_write++] = EVENT_SET | MEVENT_FLAG | (u16b)x | (((u16b)y) << 7); if (ebuf_write >= MAX_EBUF) ebuf_write = 0; } void do_vblank() { swiWaitForVBlank(); // --------------------------- // Handle the arrow buttons scanKeys(); u32b kd = keysDown(); u32b kh = keysHeld(); // order of keys: Right, Left, Up, Down // map keys to dirs, depends on order of keys in nds/input.h // and order of directions in ndir & sdir in decl.c //const s8 k2d[] = { // indexes into ndir/sdir, 10 = end of string = '\0' // 10, 4, 0, 10, 2, 3, 1, 10, 6, 5, 7 // no working combinations >= 11 //}; const byte k2d[] = {'6','4','8','2','3','7','9','1' }; // only do stuff if a key was pressed last frame if (kd & (KEY_RIGHT | KEY_LEFT | KEY_UP | KEY_DOWN)) { u16b dirs_down = 0; int i; if (kh & KEY_LEFT) dirs_down++; if (kh & KEY_RIGHT) dirs_down++; if (kh & KEY_UP) dirs_down++; if (kh & KEY_DOWN) dirs_down++; if (dirs_down == 1 && !(kh & (KEY_R | KEY_L))) { /*if (iflags.num_pad) put_key_event(ndir[k2d[(kh >> 4) & 0xF]]); else put_key_event(sdir[k2d[(kh >> 4) & 0xF]]);*/ //NRM put_key_event(k2d[(kh >> 4) & 0xF]); for (i = 0; i < 4; i++) if (kh & (1 << (i + 4))) //Term_keypress(k2d[i]); put_key_event(k2d[i]); } else if (dirs_down == 2 && (kh & (KEY_R | KEY_L))) { /*if (iflags.num_pad) put_key_event(ndir[k2d[(kh >> 4) & 0xF]]); else put_key_event(sdir[k2d[(kh >> 4) & 0xF]]);*/ //NRM put_key_event(k2d[(kh >> 4) & 0xF]); for (i = 0; i < 4; i++) if (kh & (1 << (i + 4))) //Term_keypress(k2d[i + 4]); put_key_event(k2d[i + 4]); } } // --------------------------- // Check for button macros nds_check_buttons(kd, kh); // --------------------------- // Check for typing on the touchscreen kbd byte keycode = kbd_vblank(); if ((keycode & 0x7F) != 0) { // it's an actual keystroke, return it put_key_event(keycode & 0xFF); //Term_keypress(keycode & 0xFF); } // --------------------------- // Print free RAM //NRM freeprint(); // --------------------------- // If the screen needs to be redrawn, do so now //NRM if (nds_updated) { //NRM render_all_windows(); //NRM nds_updated = 0; } //END JUST MOVED /* * An event handler XXX XXX XXX * * You may need an event handler, which can be used by both * by the "TERM_XTRA_BORED" and "TERM_XTRA_EVENT" entries in * the "Term_xtra_xxx()" function, and also to wait for the * user to perform whatever user-interface operation is needed * to request the start of a new game or the loading of an old * game, both of which should launch the "play_game()" function. */ static errr CheckEvents(bool wait) { u16b e = 0; do_vblank(); if (!wait && !has_event()) return (1); while (!e) { e = get_event(); do_vblank(); } /* Mouse */ if (IS_MEVENT(e)) handle_touch(EVENT_X(e) + 1, EVENT_Y(e), 1, TRUE); /* Undefined */ else if ((EVENT_C(e) & 0x7F) == 0) return (1); /* Key */ else Term_keypress(EVENT_C(e)); #if 0 u32b kd, kh; const byte k2d[] = {'6','4','8','2','3','7','9','1' }; /* Check the event queue */ swiWaitForVBlank(); scanKeys(); kd = keysDown(); kh = keysHeld(); if (!wait && !kd) return (1); /* Wait for an event */ while (!kd && !kh) { swiWaitForVBlank(); scanKeys(); kd = keysDown(); kh = keysHeld(); // only do stuff if a key was pressed last frame /* Arrow keys */ if (kd & (KEY_RIGHT | KEY_LEFT | KEY_UP | KEY_DOWN)) { u16b dirs_down = 0; int i; if (kh & KEY_LEFT) dirs_down++; if (kh & KEY_RIGHT) dirs_down++; if (kh & KEY_UP) dirs_down++; if (kh & KEY_DOWN) dirs_down++; if (dirs_down == 1 && !(kh & (KEY_R | KEY_L))) { for (i = 0; i < 4; i++) if (kh & (1 << (i + 4))) Term_keypress(k2d[i]); } else if (dirs_down == 2 && (kh & (KEY_R | KEY_L))) { for (i = 0; i < 4; i++) if (kh & (1 << (i + 4))) Term_keypress(k2d[i + 4]); } } // --------------------------- // Check for button macros nds_check_buttons(kd, kh); // --------------------------- // Check for typing on the touchscreen kbd u8 keycode = kbd_vblank(); if ((keycode & 0x7F) != 0) { // it's an actual keystroke, return it //put_key_event(keycode & 0xFF); Term_keypress(keycode & 0xFF); } } #endif return (0); } /* * Do a "special thing" to the current "term" * * This function must react to a large number of possible arguments, each * corresponding to a different "action request" by the "z-term.c" package, * or by the application itself. * * The "action type" is specified by the first argument, which must be a * constant of the form "TERM_XTRA_*" as given in "term.h", and the second * argument specifies the "information" for that argument, if any, and will * vary according to the first argument. * * In general, this function should return zero if the action is successfully * handled, and non-zero if the action is unknown or incorrectly handled. */ static errr Term_xtra_nds(int n, int v) { term_data *td = (term_data*)(Term->data); /* Analyze */ switch (n) { case TERM_XTRA_EVENT: { /* * Process some pending events */ return (CheckEvents(v)); } case TERM_XTRA_FLUSH: { /* * Flush all pending events */ while (!CheckEvents(FALSE)); return (0); } case TERM_XTRA_CLEAR: { /* * Clear the entire window */ int x, y; u32b vram_offset; u16b *fb = BG_GFX; for (y = 0; y < 24; y++) { for (x = 0; x < 80; x++) { vram_offset = (y & 0x1F)*8*256+x*3; //if (y&32) // { // fb = &BG_GFX_SUB[16*1024]; // chardata = btm_font_bin; // } byte xx,yy; for (yy=0;yy<8;yy++) for (xx=0;xx<3;xx++) fb[yy*256+xx+vram_offset] = 0; } } return (0); } case TERM_XTRA_SHAPE: { /* * Set the cursor visibility XXX XXX XXX * * This action should change the visibility of the cursor, * if possible, to the requested value (0=off, 1=on) * * This action is optional, but can improve both the * efficiency (and attractiveness) of the program. */ return (0); } case TERM_XTRA_FROSH: { return (0); } case TERM_XTRA_FRESH: { return (0); } case TERM_XTRA_NOISE: { /* * Make a noise XXX XXX XXX * * This action should produce a "beep" noise. * * This action is optional, but convenient. */ return (0); } case TERM_XTRA_SOUND: { /* * Make a sound XXX XXX XXX * * This action should produce sound number "v", where the * "name" of that sound is "sound_names[v]". This method * is still under construction. * * This action is optional, and not very important. */ return (0); } case TERM_XTRA_BORED: { /* * Handle random events when bored */ return (CheckEvents(0)); } case TERM_XTRA_REACT: { /* * React to global changes XXX XXX XXX * * For example, this action can be used to react to * changes in the global "color_table[256][4]" array. * * This action is optional, but can be very useful for * handling "color changes" and the "arg_sound" and/or * "arg_graphics" options. */ return (0); } case TERM_XTRA_ALIVE: { /* * Change the "hard" level XXX XXX XXX * * This action is used if the program changes "aliveness" * by being either "suspended" (v=0) or "resumed" (v=1) * This action is optional, unless the computer uses the * same "physical screen" for multiple programs, in which * case this action should clean up to let other programs * use the screen, or resume from such a cleaned up state. * * This action is currently only used by "main-gcu.c", * on UNIX machines, to allow proper "suspending". */ return (0); } case TERM_XTRA_LEVEL: { /* * Change the "soft" level XXX XXX XXX * * This action is used when the term window changes "activation" * either by becoming "inactive" (v=0) or "active" (v=1) * * This action can be used to do things like activate the proper * font / drawing mode for the newly active term window. This * action should NOT change which window has the "focus", which * window is "raised", or anything like that. * * This action is optional if all the other things which depend * on what term is active handle activation themself, or if only * one "term_data" structure is supported by this file. */ return (0); } case TERM_XTRA_DELAY: { /* * Delay for some milliseconds */ int i; for (i = 0; i < v; i++) swiWaitForVBlank(); return (0); } } /* Unknown or Unhandled action */ return (1); } /* * Display the cursor */ static errr Term_curs_nds(int x, int y) { //term_data *td = (term_data*)(Term->data); u32b vram_offset = (y - 1) * TILE_HEIGHT * 256 + x * TILE_WIDTH + 8 * 256; byte xx, yy; for (xx = 0; xx < TILE_WIDTH; xx++) { BG_GFX[xx + vram_offset] = RGB15(31, 31, 0)| BIT(15); BG_GFX[256 * (TILE_HEIGHT-1) + xx + vram_offset] = RGB15(31, 31, 0)| BIT(15); } for (yy = 0; yy < TILE_HEIGHT; yy++) { BG_GFX[yy * 256 + vram_offset] = RGB15(31, 31, 0)| BIT(15); BG_GFX[yy * 256 + TILE_WIDTH - 1 + vram_offset] = RGB15(31, 31, 0)| BIT(15); } /* Success */ return (0); } void draw_char(byte x, byte y, char c) { u32b vram_offset = (y & 0x1F) * 8 * 256 + x * 3, tile_offset = c * 24; u16b* fb = BG_GFX; const u16b* chardata = top_font_bin; if (y & 32) { fb = &BG_GFX_SUB[16 * 1024]; chardata = btm_font_bin; } byte xx, yy; for (yy = 0; yy < 8; yy++) for (xx = 0; xx < 3; xx++) fb[yy * 256 + xx + vram_offset] = chardata[yy * 3 + xx + tile_offset] | BIT(15); } void draw_color_char(byte x, byte y, char c, byte clr) { u32b vram_offset = (y & 0x1F) * 8 * 256 + x * 3, tile_offset = c * 24; u16b* fb = BG_GFX; const u16b* chardata = top_font_bin; if (y & 32) { fb = &BG_GFX_SUB[16*1024]; chardata = btm_font_bin; } byte xx, yy; u16b val; u16b fgc = color_data[clr & 0xF];//, bgc = color_data[(clr & 0xFF) >> 4]; for (yy = 0; yy < 8; yy++) { for (xx = 0;xx < 3; xx++) { val = (chardata[yy * 3 + xx + tile_offset]); fb[yy * 256 + xx + vram_offset] = (val & fgc) | BIT(15);//(~val&bgc) | 0x8000; } } } /* * Erase some characters * * This function should erase "n" characters starting at (x,y). * * You may assume "valid" input if the window is properly sized. */ static errr Term_wipe_nds(int x, int y, int n) { term_data *td = (term_data*)(Term->data); int i; /* Draw a blank */ for (i = 0; i < n; i++) draw_color_char(x + i, y, 0, 0); /* Success */ return (0); } /* * Draw some text on the screen * * This function should actually display an array of characters * starting at the given location, using the given "attribute", * and using the given string of characters, which contains * exactly "n" characters and which is NOT null-terminated. * * You may assume "valid" input if the window is properly sized. * * You must be sure that the string, when written, erases anything * (including any visual cursor) that used to be where the text is * drawn. On many machines this happens automatically, on others, * you must first call "Term_wipe_xxx()" to clear the area. * * In color environments, you should activate the color contained * in "color_data[a & 0x0F]", if needed, before drawing anything. * * You may ignore the "attribute" if you are only supporting a * monochrome environment, since this routine is normally never * called to display "black" (invisible) text, including the * default "spaces", and all other colors should be drawn in * the "normal" color in a monochrome environment. * * Note that if you have changed the "attr_blank" to something * which is not black, then this function must be able to draw * the resulting "blank" correctly. * * Note that this function must correctly handle "black" text if * the "always_text" flag is set, if this flag is not set, all the * "black" text will be handled by the "Term_wipe_xxx()" hook. */ static errr Term_text_nds(int x, int y, int n, byte a, const char *cp) { //term_data *td = (term_data*)(Term->data); int i; /* Do nothing if the string is null */ if (!cp || !*cp) return (-1); /* Get the length of the string */ if ((n > strlen(cp)) || (n < 0)) n = strlen(cp); /* Put the characters directly */ for (i = 0; i < n, *cp; i++) { /* Check it's the right attr */ if ((x + i < Term->wid) && (Term->scr->a[y][x + i] == a)) /* Put the char */ draw_color_char(x + i, y, (*(cp++)), a); else break; } /* Success */ return (0); } void draw_tile(byte x, byte y, u16b tile) { u32b vram_offset = (y & 0x7F) * TILE_HEIGHT * 256 + x * TILE_WIDTH + 8 * 256, tile_offset = (tile & 0x7FFF) * TILE_WIDTH * TILE_HEIGHT; u16b* fb = BG_GFX; byte xx, yy; for (yy = 0; yy < TILE_HEIGHT; yy++) for (xx = 0; xx < TILE_WIDTH; xx++) fb[yy * 256 + xx + vram_offset] = tiles_bin[yy * TILE_WIDTH + xx + tile_offset] | BIT(15); } /* * Draw some attr/char pairs on the screen * * This routine should display the given "n" attr/char pairs at * the given location (x,y). This function is only used if one * of the flags "always_pict" or "higher_pict" is defined. * * You must be sure that the attr/char pairs, when displayed, will * erase anything (including any visual cursor) that used to be at * the given location. On many machines this is automatic, but on * others, you must first call "Term_wipe_xxx(x, y, 1)". * * With the "higher_pict" flag, this function can be used to allow * the display of "pseudo-graphic" pictures, for example, by using * the attr/char pair as an encoded index into a pixmap of special * "pictures". * * With the "always_pict" flag, this function can be used to force * every attr/char pair to be drawn by this function, which can be * very useful if this file can optimize its own display calls. * * This function is often associated with the "arg_graphics" flag. * * This function is only used if one of the "higher_pict" and/or * "always_pict" flags are set. */ static errr Term_pict_nds(int x, int y, int n, const byte *ap, const char *cp) { term_data *td = (term_data*)(Term->data); u16b tile_number = DEF_TILES_PER_ROW * (*ap - 0x80) + (*cp - 0x80); /* XXX XXX XXX */ int i; /* Put the characters directly */ for (i = 0; i < n, *cp; i++) { if ((x + i < Term->wid) && (*cp != '\0')) draw_tile(x + i, y, tile_number); else break; } /* Success */ return (0); } /*** Internal Functions ***/ /* * Instantiate a "term_data" structure * * This is one way to prepare the "term_data" structures and to * "link" the various informational pieces together. * * This function assumes that every window should be 80x24 in size * (the standard size) and should be able to queue 256 characters. * Technically, only the "main screen window" needs to queue any * characters, but this method is simple. One way to allow some * variation is to add fields to the "term_data" structure listing * parameters for that window, initialize them in the "init_xxx()" * function, and then use them in the code below. * * Note that "activation" calls the "Term_init_xxx()" hook for * the "term" structure, if needed. */ static void term_data_link(int i) { term_data *td = &data[i]; term *t = &td->t; /* Initialize the term */ term_init(t, 85, 24, 256); /* Choose "soft" or "hard" cursor XXX XXX XXX */ /* A "soft" cursor must be explicitly "drawn" by the program */ /* while a "hard" cursor has some "physical" existance and is */ /* moved whenever text is drawn on the screen. See "term.c". */ t->soft_cursor = TRUE; /* Use "Term_pict()" for all attr/char pairs XXX XXX XXX */ /* See the "Term_pict_xxx()" function above. */ /* td->t->always_pict = TRUE; */ /* Use "Term_pict()" for some attr/char pairs XXX XXX XXX */ /* See the "Term_pict_xxx()" function above. */ t->higher_pict = TRUE; /* Use "Term_text()" even for "black" text XXX XXX XXX */ /* See the "Term_text_xxx()" function above. */ /* t->always_text = TRUE; */ /* Ignore the "TERM_XTRA_BORED" action XXX XXX XXX */ /* This may make things slightly more efficient. */ t->never_bored = TRUE; /* Ignore the "TERM_XTRA_FROSH" action XXX XXX XXX */ /* This may make things slightly more efficient. */ /* td->t->never_frosh = TRUE; */ /* Prepare the init/nuke hooks */ t->init_hook = Term_init_nds; t->nuke_hook = Term_nuke_nds; /* Prepare the template hooks */ t->xtra_hook = Term_xtra_nds; t->curs_hook = Term_curs_nds; t->wipe_hook = Term_wipe_nds; t->text_hook = Term_text_nds; t->pict_hook = Term_pict_nds; /* Remember where we came from */ t->data = (vptr)(td); /* Activate it */ Term_activate(t); /* Global pointer - maybe need for some configurations */ //ang_term[i] = t; } /* * Initialization function */ errr init_nds(void) { /* Initialize globals */ /* Initialize "term_data" structures */ int i; bool none = TRUE; term_data *td; /* Main window */ td = &data[0]; WIPE(td, term_data); td->rows = 24; td->cols = 37;//80; td->tile_height = 8; td->tile_width = 3; /* Create windows (backwards!) */ for (i = MAX_TERM_DATA - 1; i >= 0; i--) { /* Link */ term_data_link(i); none = FALSE; /* Set global pointer */ angband_term[0] = Term; } if (none) return (1); /* Success */ return (0); } /* * Init some stuff * * This function is used to keep the "path" variable off the stack. */ static void init_stuff(void) { char path[1024]; /* Prepare the path */ strcpy(path, "/angband/lib/"); /* Prepare the filepaths */ init_file_paths(path, path, path); /* Hack */ strcpy(savefile, "/angband/lib/save/PLAYER"); //small_screen = TRUE; } void nds_init_fonts() { // the font is now compiled in as ds_subfont for error reporting purposes // ds_subfont contains the bgr version //subfont_bgr_bin = &ds_subfont[0]; u16b i; u16b t,t2; for (i=0;i<8*3*256;i++) { t = ds_subfont[i]; t2 = t & 0x8000; t2 |= (t & 0x001f)<<10; t2 |= (t & 0x03e0); t2 |= (t & 0x7c00)>>10; subfont_bgr_bin[i] = t; subfont_rgb_bin[i] = t2; } top_font_bin = subfont_rgb_bin; btm_font_bin = subfont_bgr_bin; } // if you are calling this function, not much should be happening after // since it clobbers the font pointers void nds_fatal_err(const char* msg) { static byte x = 2, y = 1; byte i = 0; //top_font_bin = btm_font_bin = &ds_subfont[0]; // x = 2; // y = 1; for (i = 0; msg[i] != '\0'; i++) { draw_char( x, y, msg[i]); x++; if (msg[i] == '\n' || x > 80) { x = 2; y++; } } } //NRM should be replaced with open and read from z-file.c bool nds_load_file(const char* name, u16b* dest, u32b len) { FILE* f = fopen(name,"r"); if (f == NULL) return false; u16b readbuf[1024]; u32b i,l,wi=0; if (len == 0) len = 0xffffffff; // max possible len for (i=0;i<1024;i++) readbuf[i] = 0; while ((l=fread(readbuf,2,1024,f)) > 0 && wi*2 < len) { for (i = 0; i < (l) && wi * 2 < len; i++) { // 0 to l/2 dest[wi++] = readbuf[i]; } for (i = 0; i < 1024; i++) readbuf[i] = 0; } fclose(f); return true; } bool nds_load_kbd() { #define NUM_FILES 3 const char *files[] = { // "subfont_rgb.bin","subfont_bgr.bin", "kbd.bin","kbd.pal","kbd.map", }; const u16b* dests[] = { // subfont_rgb_bin, subfont_bgr_bin, (u16b*)BG_TILE_RAM_SUB(0), BG_PALETTE_SUB, (u16*)BG_MAP_RAM_SUB(8), }; char buf[64] = "\0"; u16b i; for (i = 0; i < NUM_FILES; i++) { if (!nds_load_file(files[i], dests[i], 0)) { sprintf(buf,"Error opening %s (errno=%d)\n",files[i],errno); nds_fatal_err(buf); return FALSE; } } #undef NUM_FILES return TRUE; } void kbd_init() { u16b i; for (i = 0; i < 16; i++) { BG_PALETTE_SUB[i+16] = BG_PALETTE_SUB[i] ^ 0x7FFF; } } void nds_init_buttons() { u16b i, j; for (i = 0; i < (NDS_NUM_MAPPABLE << NDS_NUM_MODIFIER); i++) { for (j = 0; j < NDS_CMD_LENGTH; j++) { nds_btn_cmds[i][j] = 0; } } if (access(NDS_BUTTON_FILE,0444) == -1) { /* Set defaults */ for (i = 0; i < (NDS_NUM_MAPPABLE << NDS_NUM_MODIFIER); i++) nds_btn_cmds[i][0] = btn_defaults[i]; return; } FILE* f = fopen(NDS_BUTTON_FILE, "r"); fread(&nds_btn_cmds[0], NDS_CMD_LENGTH, (NDS_NUM_MAPPABLE << NDS_NUM_MODIFIER), f); fclose(f); } void swap_font(bool bottom) { if (!bottom) { if (top_font_bin == subfont_rgb_bin) top_font_bin = subfont_bgr_bin; else top_font_bin = subfont_rgb_bin; } else { if (btm_font_bin == subfont_rgb_bin) btm_font_bin = subfont_bgr_bin; else btm_font_bin = subfont_rgb_bin; } } void on_irq(); // on_irq, do nothing void on_irq() { REG_IME = 0; if(REG_IF & IRQ_VBLANK) { // Tell the DS we handled the VBLANK interrupt VBLANK_INTR_WAIT_FLAGS |= IRQ_VBLANK; REG_IF |= IRQ_VBLANK; } else { // Ignore all other interrupts REG_IF = REG_IF; } REG_IME=1; } void nds_raw_print(const char* str) { static u16b x=0,y=32; while (*str) { draw_char(x,y,(u8)(*(str++))); x++; if (x > 78) { x = 0; y++; if (y > 34) y = 32; } } draw_char(x,y,219); fflush(0); } bool nds_load_tile_bmp(const char *name, u16b *dest, u32b len) { //NRM#define h iflags.wc_tile_height //NRM#define w iflags.wc_tile_width #define h TILE_HEIGHT #define w TILE_WIDTH // bmpxy2off works ONLY inside nds_load_tile_bmp! #define bmpxy2off(x,y) (((y-(y%h))*iw+(y%h))*w + x*h) FILE* f = fopen(name,"r"); u32b writeidx = 0; u32b i,j,l; s16b y; u32b off; s32b iw2, ih2; u16b iw = 0, ih = 0; //s32 ty; u16b depth; char buf[10]; //if (f) nds_raw_print("File OK"); //else nds_raw_print("No file opened"); fseek(f, 10, SEEK_SET); fread(&off,4,1,f); fseek(f, 4, SEEK_CUR); fread(&iw2,4,1,f); fread(&ih2,4,1,f); fseek(f, 2, SEEK_CUR); fread(&depth,2,1,f); strnfmt(buf, 10, "depth = %d", depth); //nds_raw_print(buf); if (depth != 24) //NRM if (depth != 8) { fclose(f); nds_raw_print(" depth problem"); return false; } y = ih2 - 1; // some crazy person decided to store the lines in a .bmp backwards ih = ih2 / h; iw = iw2 / w; if (len == 0) len = 0xffffffff; fseek(f,off,SEEK_SET); //NRM u8 temp[3]; byte temp[1]; while (y >= 0) { for (i = 0; i < iw; i++) { writeidx = bmpxy2off(i*w, y); for (j = 0; j < w; j++) { //NRM fread(temp,1,3,f); fread(temp, 1, 1, f); if (writeidx * 2 < len) dest[writeidx++] = c2(temp, 0); } } // x&3 == x%4 //NRM if (((iw*w*3) & 3) != 0) fseek(f,4-((iw*w*3)&3),SEEK_CUR); fseek(f, 2 - (iw * w), SEEK_CUR); y--; } //*/ fclose(f); return true; #undef bmpxy2off #undef h #undef w } bool nds_load_tile_file(char* name, u16b* dest, u32b len) { char ext[4]; u16b slen = strlen(name); strcpy(ext, name + slen - 3); nds_raw_print(name + len - 3); if (strcmpi(ext, "bmp") == 0) { // nds_raw_print("=isbmp "); return nds_load_tile_bmp(name, dest, len); } else { // assume .bin maybe w/ funny ext return nds_load_file(name, dest, len); } } bool nds_load_tiles() { //char temp[30]; //sprintf(temp,"%d,%s ",TILE_FILE == NULL, // TILE_FILE==NULL ? DEF_TILE_FILE : TILE_FILE); //nds_raw_print(temp); char buf[64]; int died1 = -1, died2 = -1;; if (TILE_FILE != NULL) { if (TILE_WIDTH == 0) TILE_WIDTH = DEF_TILE_WIDTH; if (TILE_HEIGHT == 0) TILE_HEIGHT = DEF_TILE_HEIGHT; tiles_bin = (u16b*)malloc(TILE_BUFFER_SIZE); if (!nds_load_tile_file(TILE_FILE, tiles_bin, TILE_BUFFER_SIZE) ) { died1 = errno; free(tiles_bin); } else { goto finish; } } TILE_WIDTH = DEF_TILE_WIDTH; TILE_HEIGHT = DEF_TILE_HEIGHT; tiles_bin = (u16b*)malloc(TILE_BUFFER_SIZE); if (!nds_load_tile_file(DEF_TILE_FILE, tiles_bin, TILE_BUFFER_SIZE) ) { died2 = errno; free(tiles_bin); } if (died1 != -1) { sprintf(buf, "Error loading tileset %s (errno=%d)\n", TILE_FILE, died1); if (died2 == -1) { nds_raw_print(buf); } else { nds_fatal_err(buf); } } if (died2 != -1) { sprintf(buf, "Error loading default tileset %s %s\n", DEF_TILE_FILE, strerror(died2)); nds_fatal_err(buf); return FALSE; } finish: NDS_SCREEN_ROWS = 168 / TILE_HEIGHT; NDS_SCREEN_COLS = 256 / TILE_WIDTH; return TRUE; // nds_raw_print("r/c set"); } /* * Display warning message (see "z-util.c") */ static void hook_plog(const char *str) { /* Warning */ if (str) { nds_raw_print(str); } } /* * Display error message and quit (see "z-util.c") */ static void hook_quit(const char *str) { int i, j; /* Give a warning */ if (str) { nds_fatal_err(str); } /* Bail */ nds_exit(0); } void nds_exit(int code) { u16b i; for (i = 0; i < 60; i++) { nds_updated = 0xFF; do_vblank(); // wait 1 sec. } IPC->mailData = 0xDEADC0DE; // tell arm7 to shut down the DS } /* * Main function * * This function must do a lot of stuff. */ int main(int argc, char *argv[]) { bool new_game = FALSE; int i; /* Initialize the machine itself */ //START NETHACK STUFF powerON(POWER_ALL_2D | POWER_SWAP_LCDS); videoSetMode(MODE_5_2D | DISPLAY_BG2_ACTIVE); videoSetModeSub(MODE_5_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG2_ACTIVE); vramSetBankA(VRAM_A_MAIN_BG_0x06000000); // BG2, event buf, fonts vramSetBankB(VRAM_B_MAIN_BG_0x06020000); // for storage (tileset) vramSetBankC(VRAM_C_SUB_BG_0x06200000); vramSetBankD(VRAM_D_MAIN_BG_0x06040000); // for storage (tileset) vramSetBankE(VRAM_E_LCD); // for storage (WIN_TEXT) vramSetBankF(VRAM_F_LCD); // for storage (WIN_TEXT) BG2_CR = BG_BMP16_256x256; BG2_XDX = 1<<8; BG2_XDY = 0; BG2_YDX = 0; BG2_YDY = 1<<8; BG2_CY = 0; BG2_CX = 0; SUB_BG0_CR = BG_TILE_BASE(0) | BG_MAP_BASE(8) | BG_PRIORITY(0) | BG_16_COLOR; SUB_BG2_CR = BG_BMP16_256x256 | BG_BMP_BASE(2); SUB_BG2_XDX = 1<<8; SUB_BG2_XDY = 0; SUB_BG2_YDX = 0; SUB_BG2_YDY = 1<<8; SUB_BG2_CY = 0; SUB_BG2_CX = 0; // Enable the V-blank interrupt REG_IME = 0; IRQ_HANDLER = on_irq; REG_IE = IRQ_VBLANK; REG_IF = ~0; REG_DISPSTAT = DISP_VBLANK_IRQ; REG_IME = 1; register int fd; nds_init_fonts(); //nds_raw_print("testing raw_print...\n"); //draw_char(10,10,(byte)'N'); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); if (!fatInitDefault()) { nds_fatal_err("\nError initializing FAT drivers.\n"); nds_fatal_err("Make sure the game is patched with the correct DLDI.\n"); nds_fatal_err(" (see http://chishm.drunkencoders.com/DLDI/ for more info).\n"); nds_fatal_err("\n\nUnable to access filesystem.\nCannot continue.\n"); return 1; } //nds_raw_print("filesystem loaded\n"); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); chdir("/angband"); if (!nds_load_kbd()) { nds_fatal_err("\nError loading keyboard graphics.\nCannot continue.\n"); return 1; // die } kbd_init(); nds_init_buttons(); IPC->mailData = 0x00424242; // to arm7: everything has init'ed while ((IPC->mailData & 0xFFFFFF00) != 0x42424200); //wait for arm7's reply if (IPC->mailData & 0x00000001) { // it's a DS lite swap_font(false); } else if (access("/angband/swapfont",04) != -1) { swap_font(false); } use_graphics = TRUE; //ANGBAND_GRAF = "old"; //NRM initoptions(); if (!nds_load_tiles()) { nds_fatal_err("\n\nNo tileset could be loaded.\nCannot continue.\n"); return 1; } if (!use_graphics) { TILE_HEIGHT = 8; TILE_WIDTH = 3; } //NRM u.uhp = 1; /* prevent RIP on early quits */ //NRM u.ux = 0; /* prevent flush_screen() */ //NRM init_nhwindows(0,0); //NRM display_gamewindows(); // need this for askname() #if 0 nds_curs(WIN_MAP,0,30); // put cursor offscreen nds_clear_nhwindow(WIN_MAP); // somehow there is garbage in these nds_clear_nhwindow(WIN_MESSAGE);// windows even after create_nhwindow nds_clear_nhwindow(WIN_STATUS); // calls clear_nhwindow //process_options(argc, argv); if (!*plname) askname(); if (!stricmp(plname,"wizard")) wizard = 1; plnamesuffix(); set_savefile_name(); Strcpy(lock,plname); Strcat(lock,"-99"); regularize(lock); fd = create_levelfile(0, (char *)0); if (fd < 0) { raw_print("Cannot create lock file"); } else { hackpid = 1; write(fd, (genericonst char *_t) &hackpid, sizeof(hackpid)); close(fd); } x_maze_max = COLNO-1; if (x_maze_max % 2) x_maze_max--; y_maze_max = ROWNO-1; if (y_maze_max % 2) y_maze_max--; vision_init(); dlb_init(); if ((fd = restore_saved_game()) >= 0) { pline("Restoring save file..."); //mark_synch(); /* flush output */ if(!dorecover(fd)) goto not_recovered; check_special_room(FALSE); if (discover) You("are in non-scoring discovery mode."); if (discover || wizard) { if(yn("Do you want to keep the save file?") == 'n'){ (void) delete_savefile(); } } flags.move = 0; } else { not_recovered: // TODO: add code to load a game player_selection(); newgame(); if (discover) You("are in non-scoring discovery mode."); flags.move = 0; set_wear(); (void) pickup(1); read_engr_at(u.ux,u.uy); } // it's safe to turn on the vblank intr now REG_IME = 1; moveloop(); goto top; return 0; //FINISH NETHACK STUFF #endif /* 0 */ /* Activate hooks */ plog_aux = hook_plog; quit_aux = hook_quit; /* Initialize the windows */ if (init_nds()) quit("Oops!"); /* XXX XXX XXX */ ANGBAND_SYS = "nds"; /* Initialize some stuff */ init_stuff(); draw_tile(2, 2, 5); draw_tile(4, 2, 15); draw_tile(6, 2, 25); draw_tile(8, 2, 35); /* About to start */ game_start = TRUE; while (game_start) { /* Initialize */ init_angband(); for (i = 0; i < 50; i++) draw_tile(i % 10, i/10, i+600); /* Wait for response */ pause_line(Term); /* Play the game */ play_game(new_game); /* Free resources */ cleanup_angband(); } /* Quit */ quit(NULL); /* Exit */ return (0); } angband-3.5.1/src/debug.c0000644000175000017500000000231212456456606014457 0ustar chriscchrisc/* * File: debug.c * Purpose: Simple debugging functions * * Copyright (c) 2007 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "debug.h" typedef void debug_hook(const char *); static void to_stderr(const char *out); static debug_hook *d_out = to_stderr; /* * Simple printing to stderr */ static void to_stderr(const char *out) { fputs(out, stderr); fputs("\n", stderr); } /* * Output some text. * * Amongst other things, this should use the z-msg package so that ports can * display e.g. a debugging window, or send the output to file. */ void debug(const char *fmt, ...) { va_list vp; char buffer[1024] = ""; va_start(vp, fmt); vstrnfmt(buffer, sizeof(buffer), fmt, vp); va_end(vp); d_out(buffer); /* We are done */ return; } angband-3.5.1/src/Makefile.osx0000644000175000017500000001552012456456606015502 0ustar chriscchrisc# File: Makefile.osx # This is a Makefile for the Mac OS X Cocoa port of Angband. # default target all: install # settings CC = clang LD = ld OPT ?= -O2 # NAME is how the bundle name will be displayed NAME = Angband APPNAME = $(NAME).app # EXE should stay as "angband", since there are other rules (in this file and in others) that are hardcoded as such EXE = angband # for consistency with older versions, use a lower case bundle ID BUNDLE_IDENTIFIER = org.rephial.angband ARCH = -arch i386 -arch x86_64 WARNINGS = -W -Wall -Wno-unused-parameter -Wno-missing-field-initializers \ -Wunused-macros JUST_C = -std=c99 -Wdeclaration-after-statement OBJ_CFLAGS = -std=c99 -x objective-c -mmacosx-version-min=10.5 CFLAGS = -g -I. $(WARNINGS) $(OPT) -DMACH_O_CARBON -DHAVE_MKSTEMP \ -fno-stack-protector $(ARCH) LIBS = -framework Cocoa # Fix for bug #1663: Set the deployment target via environment variable # for the final link command. See http://grauonline.de/wordpress/?p=71 # or http://stackoverflow.com/questions/5509885/creating-app-for-old-mac-from-new-mac-machine DEPLOYMENT_TARGET = MACOSX_DEPLOYMENT_TARGET=10.5 # Import user prefs # If you don't want to edit this file, put your module redefinitions # and build flags in "./config" -include config # -DALLOW_BORG is required for all .o files in a borg build ifneq (,$(findstring borg, $(MAKECMDGOALS))) CFLAGS += -DALLOW_BORG endif # Check for autoconf.h; do not warn on nonexistence autoconf= $(wildcard autoconf.h) ifneq ($(autoconf),) CFLAGS += -DHAVE_CONFIG_H endif # Note that Makefile.inc sets VERSION, and so we must run version.sh after including Makefile.inc include Makefile.inc VERSION := $(shell ../scripts/version.sh) ifeq (${VERSION},) BUNDLE_VERSION := ${VERSION} CFLAGS += -DBUILD_ID=${VERSION} endif BOBJS = borg1.o borg2.o borg3.o borg4.o borg5.o borg6.o borg7.o borg8.o borg9.o OBJS = $(BASEOBJS) OSX_OBJS = main-cocoa.o # # Build the "Angband" program # $(EXE).o: $(OBJS) @printf "%10s %-20s\n" LD $@.x86_64 @$(LD) -r -arch x86_64 -o $@.x86_64 $(OBJS) @printf "%10s %-20s\n" LD $@.i386 @$(LD) -r -arch i386 -o $@.i386 $(OBJS) lipo -arch x86_64 $@.x86_64 -arch i386 $@.i386 -create -output angband.o $(EXE): $(EXE).o $(OSX_OBJS) $(DEPLOYMENT_TARGET) $(CC) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(EXE).o $(OSX_OBJS) $(LIBS) borg: $(OBJS) $(BOBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $(EXE) $(OBJS) $(BOBJS) $(LIBS) # # Clean up old junk # clean: -rm -f $(OBJS) $(EXE) $(EXE).o.i386 $(EXE).o.x86_64 $(EXE).o $(OSX_OBJS) # # Basic build rules and dependencies # main-cocoa.o : main-cocoa.m @printf "%10s %-20s (objective-c)\n" CC $< @$(CC) $(CFLAGS) $(OBJ_CFLAGS) -c -o $@ $< %.o : %.c @printf "%10s %-20s\n" CC $< @$(CC) $(JUST_C) $(CFLAGS) -c -o $@ $< # # Installation. # Application bundle -- a directory looking like an ordinary application # # Bundle of the game (it must be a directory whose name ends in ".app") APPBNDL = ../$(APPNAME) # A bundle must have these subdirectories APPCONT = $(APPBNDL)/Contents APPBIN = $(APPCONT)/MacOS APPRES = $(APPCONT)/Resources # Auxiliary files. Please note that it still uses resouce fork based # resources for menus, dialogues and sounds, so that it isn't safe to use # utilities that doesn't understand them (virtually all Un*x commands) to # copy or archive the application. # # The graphics tiles have been moved out of the resource fork, but, again, # it isn't generally safe just to convert GIF or BMP files to PNG, because # the Mac OS takes dpi values stored in various images quite seriously. # Almost all tilesets for *band requires adjustment, with the sole exception # of 8x8.png for Vanilla. Make sure setting dpi to 72, *not* preserving # the actual size of image. When you have them ready, put them in # the lib/xtra/graf directory and rebuild. PLIST = cocoa/Angband-Cocoa.xml ICONFILES = cocoa/Angband_Icons.icns cocoa/Save.icns cocoa/Edit.icns cocoa/Data.icns LIBFILES = \ ../lib/edit/*.txt \ ../lib/file/*.txt \ ../lib/help/*.txt \ ../lib/help/*.hlp \ ../lib/pref/*.prf \ install: $(EXE) $(ICONFILES) $(PLIST) $(LIBFILES) @echo making directories... @mkdir -p $(APPBNDL) @mkdir -p $(APPCONT) @mkdir -p $(APPBIN) @mkdir -p $(APPRES) @mkdir -p $(APPRES)/English.lproj/MainMenu.nib @mkdir -p $(APPRES)/lib/edit @mkdir -p $(APPRES)/lib/file @mkdir -p $(APPRES)/lib/help @mkdir -p $(APPRES)/lib/pref @mkdir -p $(APPRES)/lib/script @mkdir -p $(APPRES)/lib/xtra/graf @mkdir -p $(APPRES)/lib/xtra/sound @echo copying files... @cp ../lib/edit/*.txt $(APPRES)/lib/edit @cp ../lib/file/*.txt $(APPRES)/lib/file @cp ../lib/help/*.txt $(APPRES)/lib/help @cp ../lib/help/*.hlp $(APPRES)/lib/help @cp ../lib/pref/*.prf $(APPRES)/lib/pref # 'optionally' install sound and graphics tiles, if present # TODO: read the tile pngs from $(APPRES)/lib/xtra/graf/ # so we can just recursively copy that directory. -cp ../lib/xtra/graf/graphics.txt $(APPRES)/lib/xtra/graf -cp ../lib/xtra/graf/*.png $(APPRES)/ -cp ../lib/xtra/sound/*.mp3 $(APPRES)/lib/xtra/sound -cp ../lib/xtra/sound/sound.cfg $(APPRES)/lib/xtra/sound install -m 755 $(EXE) $(APPBIN) install -m 644 $(ICONFILES) $(APPRES) cp cocoa/English.lproj/MainMenu.nib/*ib $(APPRES)/English.lproj/MainMenu.nib cp cocoa/CommandMenu.plist $(APPRES)/CommandMenu.plist sed -e 's/\$$VERSION\$$/$(VERSION)/' \ -e 's/\$$COPYRIGHT\$$/$(COPYRIGHT)/' \ -e 's/\$$NAME\$$/$(NAME)/' \ -e 's/\$$EXECUTABLE\$$/$(EXE)/' \ -e 's/\$$BUNDLE_VERSION\$$/$(BUNDLE_VERSION)/' \ -e 's/\$$BUNDLE_IDENTIFIER\$$/$(BUNDLE_IDENTIFIER)/' \ $(PLIST) > $(APPCONT)/Info.plist SetFile -a B $(APPBNDL) vars: @echo LDFLAGS = $(LDFLAGS) @echo CFLAGS = $(CFLAGS) @echo BASEOBJS = $(BASEOBJS) # build a version that has separate prefs (different bundle ID) and directories (setting SAFE_DIRECTORY preprocessor flag) safe-install: $(MAKE) -f Makefile.osx install CFLAGS="-DSAFE_DIRECTORY $(CFLAGS)" sed -e 's/\$$VERSION\$$/$(VERSION)/' \ -e 's/\$$COPYRIGHT\$$/$(COPYRIGHT)/' \ -e 's/\$$NAME\$$/$(NAME)/' \ -e 's/\$$EXECUTABLE\$$/$(EXE)/' \ -e 's/\$$BUNDLE_VERSION\$$/$(BUNDLE_VERSION)/' \ -e 's/\$$BUNDLE_IDENTIFIER\$$/$(BUNDLE_IDENTIFIER).$(VERSION)/' \ $(PLIST) > $(APPCONT)/Info.plist PACKAGE_NAME = $(NAME)-$(VERSION) # In the unlikely event that tar+zip isn't enough... dist: install @rm -rf disttemp* mkdir -p disttemp/Docs cp ../changes.txt ../copying.txt ../faq.txt ../readme.txt disttemp/Docs -cp ../doc/manual.html ../doc/manual.pdf disttemp/Docs cp -R -p "$(APPBNDL)" disttemp SetFile -a B disttemp/$(APPNAME) @-rm ../"$(PACKAGE_NAME)-osx.dmg" hdiutil create -quiet -fs HFS+ -volname $(PACKAGE_NAME) -srcfolder disttemp disttemp.dmg hdiutil convert disttemp.dmg -quiet -format UDZO -imagekey zlib-level=6 -o ../"$(PACKAGE_NAME)-osx.dmg" rm -rf disttemp* tests: $(MAKE) -C tests all CFLAGS="-I.. $(CFLAGS)" LDFLAGS="$(LIBS)" DEFAULT_CONFIG_PATH=../lib test-clean: $(MAKE) -C tests clean .PHONY : tests test-clean angband-3.5.1/src/object/0000755000175000017500000000000012456456606014475 5ustar chriscchriscangband-3.5.1/src/object/obj-flag.c0000644000175000017500000001175112456456606016327 0ustar chriscchrisc/* * File: src/object/obj-flag.c * Purpose: functions to deal with object flags * * Copyright (c) 2011 Chris Carr * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" /** * Details of the different object flags in the game. * See src/object/obj-flag.h for structure */ static const struct object_flag object_flag_table[] = { #define OF(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) \ { OF_##a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s }, #include "list-object-flags.h" #undef OF }; /** * Object flag names */ static const char *flag_names[] = { #define OF(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) #a, #include "list-object-flags.h" #undef OF "" }; /** * Create a "mask" of flags of a specific type or ID threshold. * * \param f is the flag array we're filling * \param id is whether we're masking by ID level * \param ... is the list of flags or ID types we're looking for * * N.B. OFT_MAX must be the last item in the ... list */ void create_mask(bitflag *f, bool id, ...) { const struct object_flag *of_ptr; int i; va_list args; of_wipe(f); va_start(args, id); /* Process each type in the va_args */ for (i = va_arg(args, int); i != OFT_MAX; i = va_arg(args, int)) { for (of_ptr = object_flag_table; of_ptr->index < OF_MAX; of_ptr++) if ((id && of_ptr->id == i) || (!id && of_ptr->type == i)) of_on(f, of_ptr->index); } va_end(args); return; } /** * Print a message when an object flag is identified by use. * * \param flag is the flag being noticed * \param name is the object name */ void flag_message(int flag, char *name) { const struct object_flag *of_ptr = &object_flag_table[flag]; if (!streq(of_ptr->message, "")) msg(of_ptr->message, name); return; } /** * Determine whether a flagset includes any curse flags. */ bool cursed_p(const bitflag *f) { bitflag f2[OF_SIZE]; of_wipe(f2); create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); return of_is_inter(f, f2); } /** * Determine whether an object flag or its timed equivalent are set in the * passed-in flags (which probably come from a state structure). This assumes * that there are no p_ptr->timed effects which can be active yet unknown to * the player. * * \param p player to act upon * \param flag is the object flag for which we are checking. * \param f is the set of flags we're checking */ bool check_state(struct player *p, int flag, bitflag *f) { const struct object_flag *of_ptr = &object_flag_table[flag]; /* Sanity check */ if (!flag) return FALSE; if (of_has(f, flag) || (of_ptr->timed && p->timed[of_ptr->timed])) return TRUE; return FALSE; } /** * Log the names of a flagset to a file. * * \param f is the set of flags we are logging. * \param log_file is the file to which we are logging the names. */ void log_flags(bitflag *f, ang_file *log_file) { int i; file_putf(log_file, "Object flags are:\n"); for (i = 0; i < OF_MAX; i++) if (of_has(f, i)) file_putf(log_file, "%s\n", flag_names[i]); } /** * Return the name of a flag. */ const char *flag_name(int flag) { return flag_names[flag]; } /** * Get the slot multiplier for a flag's power rating * * \param flag is the flag in question. * \param slot is the wield_slot it's in. */ s16b slot_mult(int flag, int slot) { const struct object_flag *of_ptr = &object_flag_table[flag]; switch (slot) { case INVEN_WIELD: return of_ptr->weapon; case INVEN_BOW: return of_ptr->bow; case INVEN_LEFT: case INVEN_RIGHT: return of_ptr->ring; case INVEN_NECK: return of_ptr->amulet; case INVEN_LIGHT: return of_ptr->light; case INVEN_BODY: return of_ptr->body; case INVEN_OUTER: return of_ptr->cloak; case INVEN_ARM: return of_ptr->shield; case INVEN_HEAD: return of_ptr->hat; case INVEN_HANDS: return of_ptr->gloves; case INVEN_FEET: return of_ptr->boots; default: return 1; } } /** * Return the base power rating for a flag. */ s32b flag_power(int flag) { const struct object_flag *of_ptr = &object_flag_table[flag]; return of_ptr->power; } /** * Ascertain whether a flag is granular (pval-based) or binary. */ bool flag_uses_pval(int flag) { const struct object_flag *of_ptr = &object_flag_table[flag]; return of_ptr->pval; } /** * Return the OFT_ type of a flag. */ int obj_flag_type(int flag) { const struct object_flag *of_ptr = &object_flag_table[flag]; return of_ptr->type; } /** * Return the pval weighting of a flag. (Some pvals are more important than * others.) */ int pval_mult(int flag) { const struct object_flag *of_ptr = &object_flag_table[flag]; return of_ptr->pval_mult; } angband-3.5.1/src/object/list-object-flags.h0000644000175000017500000003377112456456606020172 0ustar chriscchrisc/* * File: src/object/list-object-flags.h * Purpose: object flags for all objects * * Changing flag order will break savefiles. There is a hard-coded limit of * 256 flags, due to 32 bytes of storage for item flags in the savefile. Flags * below start from 0 on line 21, so a flag's sequence number is its line * number minus 21. * * index: the flag number * pval: is it a quantitative flag? FALSE means it's just on/off * timed: what is the corresponding TMD_ flag * id: when the flag is IDd * type: what type of flag is it? * power: base power rating for the flag (0 means it is unused or derived) * pval_mult: weight of this flag relative to other pval flags * wpn/bow/ring/amu/light/body/cloak/shield/hat/gloves/boots: power multiplier for this slot * message: what is printed when the flag is IDd (but see also identify.c and list-slays.h) */ /* index pval timed id type power p_m wpn bow ring amu light body cloak shield hat gloves boots message */ OF(NONE, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(STR, TRUE, 0, OFID_WIELD, OFT_STAT, 9, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(INT, TRUE, 0, OFID_WIELD, OFT_STAT, 5, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(WIS, TRUE, 0, OFID_WIELD, OFT_STAT, 5, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(DEX, TRUE, 0, OFID_WIELD, OFT_STAT, 8, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, "") OF(CON, TRUE, 0, OFID_WIELD, OFT_STAT, 12, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(XXX0, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(XXX1, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(XXX2, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(STEALTH, TRUE, 0, OFID_WIELD, OFT_PVAL, 8, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SEARCH, TRUE, 0, OFID_WIELD, OFT_PVAL, 2, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(INFRA, TRUE, TMD_SINFRA, OFID_WIELD, OFT_PVAL, 4, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(TUNNEL, TRUE, 0, OFID_WIELD, OFT_PVAL, 3, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(SPEED, TRUE, TMD_FAST, OFID_WIELD, OFT_PVAL, 20, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(BLOWS, TRUE, 0, OFID_WIELD, OFT_PVAL, 0, 50, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SHOTS, TRUE, 0, OFID_WIELD, OFT_PVAL, 0, 50, 0, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, "") OF(MIGHT, TRUE, 0, OFID_WIELD, OFT_PVAL, 0, 30, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(SLAY_ANIMAL, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_EVIL, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_UNDEAD, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_DEMON, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_ORC, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_TROLL, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_GIANT, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SLAY_DRAGON, FALSE, 0, OFID_NORMAL,OFT_SLAY, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(KILL_DRAGON, FALSE, 0, OFID_NORMAL,OFT_KILL, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(KILL_DEMON, FALSE, 0, OFID_NORMAL,OFT_KILL, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(KILL_UNDEAD, FALSE, 0, OFID_NORMAL,OFT_KILL, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_POIS, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_ACID, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_ELEC, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_FIRE, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_COLD, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(SUST_STR, FALSE, 0, OFID_NORMAL,OFT_SUST, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SUST_INT, FALSE, 0, OFID_NORMAL,OFT_SUST, 4, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SUST_WIS, FALSE, 0, OFID_NORMAL,OFT_SUST, 4, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SUST_DEX, FALSE, 0, OFID_NORMAL,OFT_SUST, 7, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SUST_CON, FALSE, 0, OFID_NORMAL,OFT_SUST, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(XXX2B, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Your %s glows.") OF(VULN_ACID, FALSE, 0, OFID_NORMAL,OFT_VULN, -6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(VULN_ELEC, FALSE, 0, OFID_NORMAL,OFT_VULN, -6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(VULN_FIRE, FALSE, 0, OFID_NORMAL,OFT_VULN, -6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(VULN_COLD, FALSE, 0, OFID_NORMAL,OFT_VULN, -6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(XXX3, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Your %s glows.") OF(XXX4, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Your %s glows.") OF(IM_ACID, FALSE, 0, OFID_NORMAL,OFT_IMM, 38, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(IM_ELEC, FALSE, 0, OFID_NORMAL,OFT_IMM, 35, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(IM_FIRE, FALSE, 0, OFID_NORMAL,OFT_IMM, 40, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(IM_COLD, FALSE, 0, OFID_NORMAL,OFT_IMM, 37, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_ACID, FALSE, TMD_OPP_ACID, OFID_NORMAL,OFT_LRES, 5, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_ELEC, FALSE, TMD_OPP_ELEC, OFID_NORMAL,OFT_LRES, 6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_FIRE, FALSE, TMD_OPP_FIRE, OFID_NORMAL,OFT_LRES, 6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_COLD, FALSE, TMD_OPP_COLD, OFID_NORMAL,OFT_LRES, 6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_POIS, FALSE, TMD_OPP_POIS, OFID_NORMAL,OFT_HRES, 28, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_FEAR, FALSE, TMD_BOLD, OFID_NORMAL,OFT_PROT, 6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_LIGHT, FALSE, 0, OFID_NORMAL,OFT_HRES, 6, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_DARK, FALSE, 0, OFID_NORMAL,OFT_HRES, 16, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_BLIND, FALSE, 0, OFID_NORMAL,OFT_PROT, 16, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_CONFU, FALSE, TMD_OPP_CONF, OFID_NORMAL,OFT_PROT, 24, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_SOUND, FALSE, 0, OFID_NORMAL,OFT_HRES, 14, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_SHARD, FALSE, 0, OFID_NORMAL,OFT_HRES, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_NEXUS, FALSE, 0, OFID_NORMAL,OFT_HRES, 15, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_NETHR, FALSE, 0, OFID_NORMAL,OFT_HRES, 20, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_CHAOS, FALSE, 0, OFID_NORMAL,OFT_HRES, 20, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(RES_DISEN, FALSE, 0, OFID_NORMAL,OFT_HRES, 20, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(SLOW_DIGEST, FALSE, 0, OFID_TIMED, OFT_MISC, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "You feel your %s slow your metabolism.") OF(FEATHER, FALSE, 0, OFID_NORMAL,OFT_MISC, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s slows your fall.") OF(LIGHT, TRUE, 0, OFID_WIELD, OFT_PVAL, 3, 6, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, "") OF(REGEN, FALSE, 0, OFID_TIMED, OFT_MISC, 5, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, "You feel your %s speed up your recovery.") OF(TELEPATHY, FALSE, TMD_TELEPATHY, OFID_WIELD, OFT_MISC, 35, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, "") OF(SEE_INVIS, FALSE, TMD_SINVIS, OFID_WIELD, OFT_MISC, 6, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, "") OF(FREE_ACT, FALSE, 0, OFID_NORMAL,OFT_MISC, 8, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 5, 2, "Your %s glows.") OF(HOLD_LIFE, FALSE, 0, OFID_NORMAL,OFT_MISC, 5, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, "Your %s glows.") OF(NO_FUEL, FALSE, 0, OFID_WIELD, OFT_LIGHT, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "") OF(IMPAIR_HP, FALSE, 0, OFID_TIMED, OFT_BAD, -9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "You feel your %s slow your recovery.") OF(IMPAIR_MANA, FALSE, 0, OFID_TIMED, OFT_BAD, -9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "You feel your %s slow your mana recovery.") OF(AFRAID, FALSE, TMD_AFRAID, OFID_WIELD, OFT_BAD, -20, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(IMPACT, FALSE, 0, OFID_NORMAL,OFT_MELEE, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Your %s causes an earthquake!") OF(TELEPORT, FALSE, 0, OFID_NORMAL,OFT_BAD, -20, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s teleports you.") OF(AGGRAVATE, FALSE, 0, OFID_TIMED, OFT_BAD, -20, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "You feel your %s aggravate things around you.") OF(DRAIN_EXP, FALSE, 0, OFID_TIMED, OFT_BAD, -5, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "You feel your %s drain your life.") OF(IGNORE_ACID, FALSE, 0, OFID_NORMAL,OFT_IGNORE, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(IGNORE_ELEC, FALSE, 0, OFID_NORMAL,OFT_IGNORE, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(IGNORE_FIRE, FALSE, 0, OFID_NORMAL,OFT_IGNORE, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(IGNORE_COLD, FALSE, 0, OFID_NORMAL,OFT_IGNORE, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(RES_STUN, FALSE, 0, OFID_NORMAL,OFT_PROT, 12, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "Your %s glows.") OF(XXX5, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(BLESSED, FALSE, 0, OFID_WIELD, OFT_MELEE, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(XXX6, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(INSTA_ART, FALSE, 0, OFID_NONE, OFT_INT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(EASY_KNOW, FALSE, 0, OFID_NONE, OFT_INT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(XXX7, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(XXX8, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(XXX9, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(LIGHT_CURSE, FALSE, 0, OFID_WIELD, OFT_CURSE, -5, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(HEAVY_CURSE, FALSE, 0, OFID_WIELD, OFT_CURSE, -15, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(PERMA_CURSE, FALSE, 0, OFID_WIELD, OFT_CURSE, -25, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, "") OF(HATES_ACID, FALSE, 0, OFID_NONE, OFT_HATES, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(HATES_ELEC, FALSE, 0, OFID_NONE, OFT_HATES, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(HATES_FIRE, FALSE, 0, OFID_NONE, OFT_HATES, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(HATES_COLD, FALSE, 0, OFID_NONE, OFT_HATES, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(SPELLS_OK, FALSE, 0, OFID_NONE, OFT_INT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(SHOW_DICE, FALSE, 0, OFID_NONE, OFT_INT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(SHOW_MULT, FALSE, 0, OFID_NONE, OFT_INT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") OF(BRAND_ICKY, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_FIZZ, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_BUZZ, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_WARM, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(BRAND_COOL, FALSE, 0, OFID_WIELD, OFT_BRAND, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, "") OF(MAX, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") angband-3.5.1/src/object/obj-ui.c0000644000175000017500000007701412456456606016037 0ustar chriscchrisc/* * File: obj-ui.c * Purpose: Mainly object descriptions and generic UI functions * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "tvalsval.h" #include "cmds.h" #include "game-cmd.h" #include "keymap.h" /* * Display a list of objects. Each object may be prefixed with a label. * Used by show_inven(), show_equip(), and show_floor(). Mode flags are * documented in object.h */ static void show_obj_list(int num_obj, int num_head, char labels[50][80], object_type *objects[50], olist_detail_t mode) { int i, row = 0, col = 0; int attr; size_t max_len = 0; int ex_width = 0, ex_offset, ex_offset_ctr; object_type *o_ptr; char o_name[50][80]; char tmp_val[80]; bool in_term = (mode & OLIST_WINDOW) ? TRUE : FALSE; bool terse = FALSE; if (in_term) max_len = 40; if (in_term && Term->wid < 40) mode &= ~(OLIST_WEIGHT); if (Term->wid < 50) terse = TRUE; /* Calculate name offset and max name length */ for (i = 0; i < num_obj; i++) { o_ptr = objects[i]; /* Null objects are used to skip lines, or display only a label */ if (!o_ptr || !o_ptr->kind) { if (i < num_head) strnfmt(o_name[i], sizeof(o_name[i]), ""); else strnfmt(o_name[i], sizeof(o_name[i]), "(nothing)"); } else object_desc(o_name[i], sizeof(o_name[i]), o_ptr, ODESC_PREFIX | ODESC_FULL | (terse ? ODESC_TERSE : 0)); /* Max length of label + object name */ max_len = MAX(max_len, strlen(labels[i]) + strlen(o_name[i])); } /* Take the quiver message into consideration */ if (mode & OLIST_QUIVER && p_ptr->quiver_slots > 0) max_len = MAX(max_len, 24); /* Width of extra fields */ if (mode & OLIST_WEIGHT) ex_width += 9; if (mode & OLIST_PRICE) ex_width += 9; if (mode & OLIST_FAIL) ex_width += 10; /* Determine beginning row and column */ if (in_term) { /* Term window */ row = 0; col = 0; } else { /* Main window */ row = 1; col = Term->wid - 1 - max_len - ex_width; if (col < 3) col = 0; } /* Column offset of the first extra field */ ex_offset = MIN(max_len, (size_t)(Term->wid - 1 - ex_width - col)); /* Output the list */ for (i = 0; i < num_obj; i++) { o_ptr = objects[i]; /* Clear the line */ prt("", row + i, MAX(col - 2, 0)); /* If we have no label then we won't display anything */ if (!strlen(labels[i])) continue; /* Print the label */ put_str(labels[i], row + i, col); /* Limit object name */ if (strlen(labels[i]) + strlen(o_name[i]) > (size_t)ex_offset) { int truncate = ex_offset - strlen(labels[i]); if (truncate < 0) truncate = 0; if ((size_t)truncate > sizeof(o_name[i]) - 1) truncate = sizeof(o_name[i]) - 1; o_name[i][truncate] = '\0'; } /* Item kind determines the color of the output */ if (o_ptr && o_ptr->kind) attr = tval_to_attr[o_ptr->tval % N_ELEMENTS(tval_to_attr)]; else attr = TERM_SLATE; /* Object name */ c_put_str(attr, o_name[i], row + i, col + strlen(labels[i])); /* If we don't have an object, we can skip the rest of the output */ if (!(o_ptr && o_ptr->kind)) continue; /* Extra fields */ ex_offset_ctr = ex_offset; if (mode & OLIST_PRICE) { int price = price_item(o_ptr, TRUE, o_ptr->number); strnfmt(tmp_val, sizeof(tmp_val), "%6d au", price); put_str(tmp_val, row + i, col + ex_offset_ctr); ex_offset_ctr += 9; } if (mode & OLIST_FAIL && obj_can_fail(o_ptr)) { int fail = (9 + get_use_device_chance(o_ptr)) / 10; if (object_effect_is_known(o_ptr)) strnfmt(tmp_val, sizeof(tmp_val), "%4d%% fail", fail); else my_strcpy(tmp_val, " ? fail", sizeof(tmp_val)); put_str(tmp_val, row + i, col + ex_offset_ctr); ex_offset_ctr += 10; } if (mode & OLIST_WEIGHT) { int weight = o_ptr->weight * o_ptr->number; strnfmt(tmp_val, sizeof(tmp_val), "%4d.%1d lb", weight / 10, weight % 10); put_str(tmp_val, row + i, col + ex_offset_ctr); ex_offset_ctr += 9; } } /* For the inventory: print the quiver count */ if (mode & OLIST_QUIVER) { int count, j; /* Quiver may take multiple lines */ for(j = 0; j < p_ptr->quiver_slots; j++, i++) { const char *fmt = "in Quiver: %d missile%s"; char letter = index_to_label(in_term ? i - 1 : i); /* Number of missiles in this "slot" */ if (j == p_ptr->quiver_slots - 1 && p_ptr->quiver_remainder > 0) count = p_ptr->quiver_remainder; else count = MAX_STACK_SIZE-1; /* Clear the line */ prt("", row + i, MAX(col - 2, 0)); /* Print the (disabled) label */ strnfmt(tmp_val, sizeof(tmp_val), "%c) ", letter); c_put_str(TERM_SLATE, tmp_val, row + i, col); /* Print the count */ strnfmt(tmp_val, sizeof(tmp_val), fmt, count, count == 1 ? "" : "s"); c_put_str(TERM_L_UMBER, tmp_val, row + i, col + 3); } } /* Clear term windows */ if (in_term) { for (; i < Term->hgt; i++) { prt("", row + i, MAX(col - 2, 0)); } } /* Print a drop shadow for the main window if necessary */ else if (i > 0 && row + i < 24) { prt("", row + i, MAX(col - 2, 0)); } } /* * Display the inventory. Builds a list of objects and passes them * off to show_obj_list() for display. Mode flags documented in * object.h */ void show_inven(int mode) { int i, last_slot = -1; int diff = weight_remaining(); object_type *o_ptr; int num_obj = 0; char labels[50][80]; object_type *objects[50]; bool in_term = (mode & OLIST_WINDOW) ? TRUE : FALSE; /* Include burden for term windows */ if (in_term) { strnfmt(labels[num_obj], sizeof(labels[num_obj]), "Burden %d.%d lb (%d.%d lb %s) ", p_ptr->total_weight / 10, p_ptr->total_weight % 10, abs(diff) / 10, abs(diff) % 10, (diff < 0 ? "overweight" : "remaining")); objects[num_obj] = NULL; num_obj++; } /* Find the last occupied inventory slot */ for (i = 0; i < INVEN_PACK; i++) { o_ptr = &p_ptr->inventory[i]; if (o_ptr->kind) last_slot = i; } /* Build the object list */ for (i = 0; i <= last_slot; i++) { o_ptr = &p_ptr->inventory[i]; /* Acceptable items get a label */ if (item_tester_okay(o_ptr)) strnfmt(labels[num_obj], sizeof(labels[num_obj]), "%c) ", index_to_label(i)); /* Unacceptable items are still sometimes shown */ else if (in_term) my_strcpy(labels[num_obj], " ", sizeof(labels[num_obj])); /* Unacceptable items are skipped in the main window */ else continue; /* Save the object */ objects[num_obj] = o_ptr; num_obj++; } /* Display the object list */ if (in_term) /* Term window starts with a burden header */ show_obj_list(num_obj, 1, labels, objects, mode); else show_obj_list(num_obj, 0, labels, objects, mode); } /* * Display the equipment. Builds a list of objects and passes them * off to show_obj_list() for display. Mode flags documented in * object.h */ void show_equip(int mode) { int i, last_slot = 0; object_type *o_ptr; int num_obj = 0; char labels[50][80]; object_type *objects[50]; char tmp_val[80]; bool in_term = (mode & OLIST_WINDOW) ? TRUE : FALSE; bool show_empty = (mode & OLIST_SEMPTY) ? TRUE : FALSE; /* Find the last equipment slot to display */ for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL; i++) { o_ptr = &p_ptr->inventory[i]; if (i < INVEN_TOTAL || o_ptr->kind) last_slot = i; } /* Build the object list */ for (i = INVEN_WIELD; i <= last_slot; i++) { o_ptr = &p_ptr->inventory[i]; /* May need a blank line to separate the quiver */ if (i == INVEN_TOTAL) { int j; bool need_spacer = FALSE; /* Scan the rest of the items for acceptable entries */ for (j = i; j < last_slot; j++) { o_ptr = &p_ptr->inventory[j]; if (item_tester_okay(o_ptr)) need_spacer = TRUE; } /* Add a spacer between equipment and quiver */ if (num_obj > 0 && need_spacer) { my_strcpy(labels[num_obj], "", sizeof(labels[num_obj])); objects[num_obj] = NULL; num_obj++; } continue; } /* Acceptable items get a label */ if (item_tester_okay(o_ptr)) strnfmt(labels[num_obj], sizeof(labels[num_obj]), "%c) ", index_to_label(i)); /* Unacceptable items are still sometimes shown */ else if ((!o_ptr->kind && show_empty) || in_term) my_strcpy(labels[num_obj], " ", sizeof(labels[num_obj])); /* Unacceptable items are skipped in the main window */ else continue; /* Show full slot labels */ strnfmt(tmp_val, sizeof(tmp_val), "%-14s: ", mention_use(i)); my_strcat(labels[num_obj], tmp_val, sizeof(labels[num_obj])); /* Save the object */ objects[num_obj] = o_ptr; num_obj++; } /* Display the object list */ show_obj_list(num_obj, 0, labels, objects, mode); } /* * Display the floor. Builds a list of objects and passes them * off to show_obj_list() for display. Mode flags documented in * object.h */ void show_floor(const int *floor_list, int floor_num, int mode) { int i; object_type *o_ptr; int num_obj = 0; char labels[50][80]; object_type *objects[50]; if (floor_num > MAX_FLOOR_STACK) floor_num = MAX_FLOOR_STACK; /* Build the object list */ for (i = 0; i < floor_num; i++) { o_ptr = object_byid(floor_list[i]); /* Tester always skips gold. When gold should be displayed, * only test items that are not gold. */ if ((o_ptr->tval != TV_GOLD || !(mode & OLIST_GOLD)) && !item_tester_okay(o_ptr)) continue; strnfmt(labels[num_obj], sizeof(labels[num_obj]), "%c) ", index_to_label(i)); /* Save the object */ objects[num_obj] = o_ptr; num_obj++; } /* Display the object list */ show_obj_list(num_obj, 0, labels, objects, mode); } /* * Verify the choice of an item. * * The item can be negative to mean "item on floor". */ bool verify_item(const char *prompt, int item) { char o_name[80]; char out_val[160]; object_type *o_ptr; /* Inventory */ if (item >= 0) { o_ptr = &p_ptr->inventory[item]; } /* Floor */ else { o_ptr = object_byid(0 - item); } /* Describe */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Prompt */ strnfmt(out_val, sizeof(out_val), "%s %s? ", prompt, o_name); /* Query */ return (get_check(out_val)); } /* * Hack -- prevent certain choices depending on the inscriptions on the item. * * The item can be negative to mean "item on floor". */ bool get_item_allow(int item, unsigned char ch, cmd_code cmd, bool is_harmless) { object_type *o_ptr; char verify_inscrip[] = "!*"; unsigned n; /* Inventory or floor */ if (item >= 0) o_ptr = &p_ptr->inventory[item]; else o_ptr = object_byid(0 - item); /* Hack - Only shift the command key if it actually needs to be shifted. */ if (ch < 0x20) ch = UN_KTRL(ch); /* The inscription to look for */ verify_inscrip[1] = ch; /* Look for the inscription */ n = check_for_inscrip(o_ptr, verify_inscrip); /* Also look for for the inscription '!*' */ if (!is_harmless) n += check_for_inscrip(o_ptr, "!*"); /* Choose string for the prompt */ if (n) { char prompt[1024]; const char *verb = cmd_get_verb(cmd); if (!verb) verb = "do that with"; strnfmt(prompt, sizeof(prompt), "Really %s", verb); /* Promt for confirmation n times */ while (n--) { if (!verify_item(prompt, item)) return (FALSE); } } /* Allow it */ return (TRUE); } /* * Find the "first" inventory object with the given "tag". * * A "tag" is a char "n" appearing as "@n" anywhere in the * inscription of an object. * * Also, the tag "@xn" will work as well, where "n" is a tag-char, * and "x" is the action that tag will work for. */ static int get_tag(int *cp, char tag, cmd_code cmd, bool quiver_tags) { int i; const char *s; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; /* (f)ire is handled differently from all others, due to the quiver */ if (quiver_tags) { i = QUIVER_START + tag - '0'; if (p_ptr->inventory[i].kind) { *cp = i; return (TRUE); } return (FALSE); } /* Check every object */ for (i = 0; i < ALL_INVEN_TOTAL; ++i) { object_type *o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->kind) continue; /* Skip empty inscriptions */ if (!o_ptr->note) continue; /* Find a '@' */ s = strchr(quark_str(o_ptr->note), '@'); /* Process all tags */ while (s) { unsigned char cmdkey; /* Check the normal tags */ if (s[1] == tag) { /* Save the actual inventory ID */ *cp = i; /* Success */ return (TRUE); } cmdkey = cmd_lookup_key(cmd, mode); /* Hack - Only shift the command key if it actually needs to be shifted. */ if (cmdkey < 0x20) cmdkey = UN_KTRL(cmdkey); /* Check the special tags */ if ((s[1] == cmdkey) && (s[2] == tag)) { /* Save the actual inventory ID */ *cp = i; /* Success */ return (TRUE); } /* Find another '@' */ s = strchr(s + 1, '@'); } } /* No such tag */ return (FALSE); } /* * Let the user select an item, save its "index" * * Return TRUE only if an acceptable item was chosen by the user. * * The selected item must satisfy the "item_tester_hook()" function, * if that hook is set, and the "item_tester_tval", if that value is set. * * All "item_tester" restrictions are cleared before this function returns. * * The user is allowed to choose acceptable items from the equipment, * inventory, or floor, respectively, if the proper flag was given, * and there are any acceptable items in that location. * * The equipment or inventory are displayed (even if no acceptable * items are in that location) if the proper flag was given. * * If there are no acceptable items available anywhere, and "str" is * not NULL, then it will be used as the text of a warning message * before the function returns. * * Note that the user must press "-" to specify the item on the floor, * and there is no way to "examine" the item on the floor, while the * use of "capital" letters will "examine" an inventory/equipment item, * and prompt for its use. * * If a legal item is selected from the inventory, we save it in "cp" * directly (0 to 35), and return TRUE. * * If a legal item is selected from the floor, we save it in "cp" as * a negative (-1 to -511), and return TRUE. * * If no item is available, we do nothing to "cp", and we display a * warning message, using "str" if available, and return FALSE. * * If no item is selected, we do nothing to "cp", and return FALSE. * * Global "p_ptr->command_wrk" is used to choose between equip/inven/floor * listings. It is equal to USE_INVEN or USE_EQUIP or USE_FLOOR, except * when this function is first called, when it is equal to zero, which will * cause it to be set to USE_INVEN. * * We always erase the prompt when we are done, leaving a blank line, * or a warning message, if appropriate, if no items are available. * * Note that only "acceptable" floor objects get indexes, so between two * commands, the indexes of floor objects may change. XXX XXX XXX */ bool get_item(int *cp, const char *pmt, const char *str, cmd_code cmd, int mode) { int py = p_ptr->py; int px = p_ptr->px; unsigned char cmdkey = cmd_lookup_key(cmd, OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG); //struct keypress which; ui_event press; int j, k; int i1, i2; int e1, e2; int f1, f2; bool done, item; bool oops = FALSE; bool use_inven = ((mode & USE_INVEN) ? TRUE : FALSE); bool use_equip = ((mode & USE_EQUIP) ? TRUE : FALSE); bool use_floor = ((mode & USE_FLOOR) ? TRUE : FALSE); bool is_harmless = ((mode & IS_HARMLESS) ? TRUE : FALSE); bool quiver_tags = ((mode & QUIVER_TAGS) ? TRUE : FALSE); int olist_mode = 0; bool allow_inven = FALSE; bool allow_equip = FALSE; bool allow_floor = FALSE; bool toggle = FALSE; char tmp_val[160]; char out_val[160]; int floor_list[MAX_FLOOR_STACK]; int floor_num; bool show_list = TRUE; /* Hack - Only shift the command key if it actually needs to be shifted. */ if (cmdkey < 0x20) cmdkey = UN_KTRL(cmdkey); /* Object list display modes */ if (mode & SHOW_FAIL) olist_mode |= OLIST_FAIL; else olist_mode |= OLIST_WEIGHT; if (mode & SHOW_PRICES) olist_mode |= OLIST_PRICE; if (mode & SHOW_EMPTY) olist_mode |= OLIST_SEMPTY; /* Paranoia XXX XXX XXX */ message_flush(); /* Not done */ done = FALSE; /* No item selected */ item = FALSE; /* Full inventory */ i1 = 0; i2 = INVEN_PACK - 1; /* Forbid inventory */ if (!use_inven) i2 = -1; /* Restrict inventory indexes */ while ((i1 <= i2) && (!get_item_okay(i1))) i1++; while ((i1 <= i2) && (!get_item_okay(i2))) i2--; /* Accept inventory */ if (i1 <= i2) allow_inven = TRUE; /* Full equipment */ e1 = INVEN_WIELD; e2 = ALL_INVEN_TOTAL - 1; /* Forbid equipment */ if (!use_equip) e2 = -1; /* Restrict equipment indexes */ while ((e1 <= e2) && (!get_item_okay(e1))) e1++; while ((e1 <= e2) && (!get_item_okay(e2))) e2--; /* Accept equipment */ if (e1 <= e2) allow_equip = TRUE; /* Scan all non-gold objects in the grid */ floor_num = scan_floor(floor_list, N_ELEMENTS(floor_list), py, px, 0x0B); /* Full floor */ f1 = 0; f2 = floor_num - 1; /* Forbid floor */ if (!use_floor) f2 = -1; /* Restrict floor indexes */ while ((f1 <= f2) && (!get_item_okay(0 - floor_list[f1]))) f1++; while ((f1 <= f2) && (!get_item_okay(0 - floor_list[f2]))) f2--; /* Accept floor */ if (f1 <= f2) allow_floor = TRUE; /* Require at least one legal choice */ if (!allow_inven && !allow_equip && !allow_floor) { /* Oops */ oops = TRUE; done = TRUE; } /* Analyze choices */ else { /* Hack -- Start on equipment if requested */ if ((p_ptr->command_wrk == USE_EQUIP) && allow_equip) p_ptr->command_wrk = USE_EQUIP; else if ((p_ptr->command_wrk == USE_INVEN) && allow_inven) p_ptr->command_wrk = USE_INVEN; else if ((p_ptr->command_wrk == USE_FLOOR) && allow_floor) p_ptr->command_wrk = USE_FLOOR; /* If we are using the quiver then start on equipment */ else if (quiver_tags && allow_equip) p_ptr->command_wrk = USE_EQUIP; /* Use inventory if allowed */ else if (use_inven && allow_inven) p_ptr->command_wrk = USE_INVEN; /* Use equipment if allowed */ else if (use_equip && allow_equip) p_ptr->command_wrk = USE_EQUIP; /* Use floor if allowed */ else if (use_floor && allow_floor) p_ptr->command_wrk = USE_FLOOR; /* Hack -- Use (empty) inventory */ else p_ptr->command_wrk = USE_INVEN; } /* Start out in "display" mode */ if (show_list) { /* Save screen */ screen_save(); } /* Repeat until done */ while (!done) { int ni = 0; int ne = 0; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { /* Unused */ if (!angband_term[j]) continue; /* Count windows displaying inven */ if (op_ptr->window_flag[j] & (PW_INVEN)) ni++; /* Count windows displaying equip */ if (op_ptr->window_flag[j] & (PW_EQUIP)) ne++; } /* Toggle if needed */ if (((p_ptr->command_wrk == USE_EQUIP) && ni && !ne) || ((p_ptr->command_wrk == USE_INVEN) && !ni && ne)) { /* Toggle */ toggle_inven_equip(); /* Track toggles */ toggle = !toggle; } /* Redraw */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); /* Redraw windows */ redraw_stuff(p_ptr); /* Viewing inventory */ if (p_ptr->command_wrk == USE_INVEN) { int nmode = olist_mode; /* Show the quiver counts in certain cases, like the 'i' command */ if (mode & SHOW_QUIVER) nmode |= OLIST_QUIVER; /* Redraw if needed */ if (show_list) show_inven(nmode); /* Begin the prompt */ strnfmt(out_val, sizeof(out_val), "Inven:"); /* List choices */ if (i1 <= i2) { /* Build the prompt */ strnfmt(tmp_val, sizeof(tmp_val), " %c-%c,", index_to_label(i1), index_to_label(i2)); /* Append */ my_strcat(out_val, tmp_val, sizeof(out_val)); } /* Indicate ability to "view" */ if (!show_list) { my_strcat(out_val, " * to see,", sizeof(out_val)); } /* Indicate legality of "toggle" */ if (use_equip) { my_strcat(out_val, " / for Equip,", sizeof(out_val)); } /* Indicate legality of the "floor" */ if (allow_floor) { my_strcat(out_val, " - for floor,", sizeof(out_val)); } } /* Viewing equipment */ else if (p_ptr->command_wrk == USE_EQUIP) { /* Redraw if needed */ if (show_list) show_equip(olist_mode); /* Begin the prompt */ strnfmt(out_val, sizeof(out_val), "Equip:"); /* List choices */ if (e1 <= e2) { /* Build the prompt */ strnfmt(tmp_val, sizeof(tmp_val), " %c-%c,", index_to_label(e1), index_to_label(e2)); /* Append */ my_strcat(out_val, tmp_val, sizeof(out_val)); } /* Indicate ability to "view" */ if (!show_list) { my_strcat(out_val, " * to see,", sizeof(out_val)); } /* Indicate legality of "toggle" */ if (use_inven) { my_strcat(out_val, " / for Inven,", sizeof(out_val)); } /* Indicate legality of the "floor" */ if (allow_floor) { my_strcat(out_val, " - for floor,", sizeof(out_val)); } } /* Viewing floor */ else { /* Redraw if needed */ if (show_list) show_floor(floor_list, floor_num, olist_mode); /* Begin the prompt */ strnfmt(out_val, sizeof(out_val), "Floor:"); /* List choices */ if (f1 <= f2) { /* Build the prompt */ strnfmt(tmp_val, sizeof(tmp_val), " %c-%c,", I2A(f1), I2A(f2)); /* Append */ my_strcat(out_val, tmp_val, sizeof(out_val)); } /* Indicate ability to "view" */ if (!show_list) { my_strcat(out_val, " * to see,", sizeof(out_val)); } /* Append */ if (use_inven) { my_strcat(out_val, " / for Inven,", sizeof(out_val)); } /* Append */ else if (use_equip) { my_strcat(out_val, " / for Equip,", sizeof(out_val)); } } /* Finish the prompt */ my_strcat(out_val, " ESC", sizeof(out_val)); /* if we have a prompt header, show the part that we just built */ if (pmt) { /* Build the prompt */ strnfmt(tmp_val, sizeof(tmp_val), "(%s) %s", out_val, pmt); /* Show the prompt */ prt(tmp_val, 0, 0); } /* Get a key */ //which = inkey(); press = inkey_m(); /* Parse it */ if (press.type == EVT_MOUSE) { if (press.mouse.button == 2) { done = TRUE; } else if (press.mouse.button == 1) { k = -1; if (p_ptr->command_wrk == USE_INVEN) { if (press.mouse.y == 0) { if (use_equip) { p_ptr->command_wrk = USE_EQUIP; } else if (allow_floor) { p_ptr->command_wrk = USE_FLOOR; } } else if ((press.mouse.y <= i2-i1+1) ){ //&& (press.mouse.x > Term->wid - 1 - max_len - ex_width)) { //k = label_to_inven(index_to_label(i1+press.mouse.y-1)); /* get the item index, allowing for skipped indices */ for (j = i1; j <= i2; j++) { if (get_item_okay(j)) { if (press.mouse.y == 1) { k = j; break; } press.mouse.y--; } } } } else if (p_ptr->command_wrk == USE_EQUIP) { if (press.mouse.y == 0) { if (allow_floor) { p_ptr->command_wrk = USE_FLOOR; } else if (use_inven) { p_ptr->command_wrk = USE_INVEN; } } else if (press.mouse.y <= e2-e1+1) { if (olist_mode & OLIST_SEMPTY) { /* If we are showing empties, just set the object (empty objects will just keep the loop going) */ k = label_to_equip(index_to_label(e1+press.mouse.y-1)); } else { /* get the item index, allowing for skipped indices */ for (j = e1; j <= e2; j++) { /* skip the quiver slot which is a blank line in the list */ if (j == 36) { press.mouse.y--; } else if (get_item_okay(j)) { if (press.mouse.y == 1) { k = j; break; } press.mouse.y--; } } } } } else if (p_ptr->command_wrk == USE_FLOOR) { if (press.mouse.y == 0) { if (use_inven) { p_ptr->command_wrk = USE_INVEN; } else if (use_equip) { p_ptr->command_wrk = USE_EQUIP; } } else if ((press.mouse.y <= floor_num) && (press.mouse.y >= 1)) { /* Special index */ k = 0 - floor_list[press.mouse.y-1]; /* get the item index, allowing for skipped indices */ for (j = f1; j <= f2; j++) { if (get_item_okay(0 - floor_list[j])) { if (press.mouse.y == 1) { k = 0 - floor_list[j]; break; } press.mouse.y--; } } /* check the bounds the item number */ if (k < 0) { /* Allow player to "refuse" certain actions */ if (!get_item_allow(k, cmdkey, cmd, is_harmless)) { done = TRUE; } /* Accept that choice */ (*cp) = k; item = TRUE; done = TRUE; } else { /* set k to a value that will be invalid below */ k = -1; } } } if (k >= 0) { /* Validate the item */ if (!get_item_okay(k)) { bell("Illegal object choice (normal)!"); } /* Allow player to "refuse" certain actions */ if (!get_item_allow(k, cmdkey, cmd, is_harmless)) { done = TRUE; } /* Accept that choice */ (*cp) = k; item = TRUE; done = TRUE; } else if (press.mouse.y == 0) { /* Hack -- Fix screen */ if (show_list) { /* Load screen */ screen_load(); /* Save screen */ screen_save(); } } } } else //switch (which.code) switch (press.key.code) { case ESCAPE: case ' ': { done = TRUE; break; } case '/': { /* Toggle to inventory */ if (use_inven && (p_ptr->command_wrk != USE_INVEN)) { p_ptr->command_wrk = USE_INVEN; } /* Toggle to equipment */ else if (use_equip && (p_ptr->command_wrk != USE_EQUIP)) { p_ptr->command_wrk = USE_EQUIP; } /* No toggle allowed */ else { bell("Cannot switch item selector!"); break; } /* Hack -- Fix screen */ if (show_list) { /* Load screen */ screen_load(); /* Save screen */ screen_save(); } /* Need to redraw */ break; } case '-': { /* Paranoia */ if (!allow_floor) { bell("Cannot select floor!"); break; } /* There is only one item */ if (floor_num == 1) { /* Auto-select */ if (p_ptr->command_wrk == (USE_FLOOR)) { /* Special index */ k = 0 - floor_list[0]; /* Allow player to "refuse" certain actions */ if (!get_item_allow(k, cmdkey, cmd, is_harmless)) { done = TRUE; break; } /* Accept that choice */ (*cp) = k; item = TRUE; done = TRUE; break; } } /* Hack -- Fix screen */ if (show_list) { /* Load screen */ screen_load(); /* Save screen */ screen_save(); } p_ptr->command_wrk = (USE_FLOOR); #if 0 /* Check each legal object */ for (i = 0; i < floor_num; ++i) { /* Special index */ k = 0 - floor_list[i]; /* Skip non-okay objects */ if (!get_item_okay(k)) continue; /* Allow player to "refuse" certain actions */ if (!get_item_allow(k, cmdkey, cmd, is_harmless)) continue; /* Accept that choice */ (*cp) = k; item = TRUE; done = TRUE; break; } #endif break; } case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { /* Look up the tag */ //if (!get_tag(&k, which.code, cmd, quiver_tags)) if (!get_tag(&k, press.key.code, cmd, quiver_tags)) { bell("Illegal object choice (tag)!"); break; } /* Hack -- Validate the item */ if ((k < INVEN_WIELD) ? !allow_inven : !allow_equip) { bell("Illegal object choice (tag)!"); break; } /* Validate the item */ if (!get_item_okay(k)) { bell("Illegal object choice (tag)!"); break; } /* Allow player to "refuse" certain actions */ if (!get_item_allow(k, cmdkey, cmd, is_harmless)) { done = TRUE; break; } /* Accept that choice */ (*cp) = k; item = TRUE; done = TRUE; break; } case KC_ENTER: { /* Choose "default" inventory item */ if (p_ptr->command_wrk == USE_INVEN) { if (i1 != i2) { bell("Illegal object choice (default)!"); break; } k = i1; } /* Choose the "default" slot (0) of the quiver */ else if (quiver_tags) k = e1; /* Choose "default" equipment item */ else if (p_ptr->command_wrk == USE_EQUIP) { if (e1 != e2) { bell("Illegal object choice (default)!"); break; } k = e1; } /* Choose "default" floor item */ else { if (f1 != f2) { bell("Illegal object choice (default)!"); break; } k = 0 - floor_list[f1]; } /* Validate the item */ if (!get_item_okay(k)) { bell("Illegal object choice (default)!"); break; } /* Allow player to "refuse" certain actions */ if (!get_item_allow(k, cmdkey, cmd, is_harmless)) { done = TRUE; break; } /* Accept that choice */ (*cp) = k; item = TRUE; done = TRUE; break; } default: { bool verify; /* Note verify */ //verify = (isupper((unsigned char)which.code) ? TRUE : FALSE); verify = (isupper((unsigned char)press.key.code) ? TRUE : FALSE); /* Lowercase */ //which.code = tolower((unsigned char)which.code); press.key.code = tolower((unsigned char)press.key.code); /* Convert letter to inventory index */ if (p_ptr->command_wrk == USE_INVEN) { //k = label_to_inven(which.code); k = label_to_inven(press.key.code); if (k < 0) { bell("Illegal object choice (inven)!"); break; } } /* Convert letter to equipment index */ else if (p_ptr->command_wrk == USE_EQUIP) { //k = label_to_equip(which.code); k = label_to_equip(press.key.code); if (k < 0) { bell("Illegal object choice (equip)!"); break; } } /* Convert letter to floor index */ else { //k = (islower((unsigned char)which.code) ? A2I((unsigned char)which.code) : -1); k = (islower((unsigned char)press.key.code) ? A2I((unsigned char)press.key.code) : -1); if (k < 0 || k >= floor_num) { bell("Illegal object choice (floor)!"); break; } /* Special index */ k = 0 - floor_list[k]; } /* Validate the item */ if (!get_item_okay(k)) { bell("Illegal object choice (normal)!"); break; } /* Verify the item */ if (verify && !verify_item("Try", k)) { done = TRUE; break; } /* Allow player to "refuse" certain actions */ if (!get_item_allow(k, cmdkey, cmd, is_harmless)) { done = TRUE; break; } /* Accept that choice */ (*cp) = k; item = TRUE; done = TRUE; break; } } } /* Fix the screen if necessary */ if (show_list) { /* Load screen */ screen_load(); /* Hack -- Cancel "display" */ show_list = FALSE; } /* Forget the item_tester_tval restriction */ item_tester_tval = 0; /* Forget the item_tester_hook restriction */ item_tester_hook = NULL; /* Toggle again if needed */ if (toggle) toggle_inven_equip(); /* Update */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); redraw_stuff(p_ptr); /* Clear the prompt line */ prt("", 0, 0); /* Warning if needed */ if (oops && str) msg("%s", str); /* Result */ return (item); } angband-3.5.1/src/object/obj-make.c0000644000175000017500000006526212456456606016341 0ustar chriscchrisc/* * File: obj-make.c * Purpose: Object generation functions. * * Copyright (c) 1987-2007 Angband contributors * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "alloc.h" #include "cave.h" #include "init.h" #include "object/tvalsval.h" #include "object/pval.h" #include "object/slays.h" /* * The chance of inflating the requested object level (1/x). * Lower values yield better objects more often. */ #define GREAT_OBJ 20 /* * There is a 1/20 (5%) chance that ego-items with an inflated base-level are * generated when an object is turned into an ego-item (see make_ego_item() * in object2.c). As above, lower values yield better ego-items more often. */ #define GREAT_EGO 20 /* Define a value for minima which will be ignored. */ #define NO_MINIMUM 255 static s16b alloc_ego_size; static alloc_entry *alloc_ego_table; static void init_ego_allocs(void) { struct alloc_entry *table; int i; ego_item_type *e_ptr; s16b num[MAX_DEPTH]; s16b aux[MAX_DEPTH]; /* Clear the "aux" array */ (void)C_WIPE(aux, MAX_DEPTH, s16b); /* Clear the "num" array */ (void)C_WIPE(num, MAX_DEPTH, s16b); /* Size of "alloc_ego_table" */ alloc_ego_size = 0; /* Scan the ego items */ for (i = 1; i < z_info->e_max; i++) { /* Get the i'th ego item */ e_ptr = &e_info[i]; /* Legal items */ if (e_ptr->rarity) { /* Count the entries */ alloc_ego_size++; /* Group by level */ num[e_ptr->level]++; } } /* Collect the level indexes */ for (i = 1; i < MAX_DEPTH; i++) { /* Group by level */ num[i] += num[i-1]; } /*** Initialize ego-item allocation info ***/ /* Allocate the alloc_ego_table */ alloc_ego_table = C_ZNEW(alloc_ego_size, alloc_entry); /* Get the table entry */ table = alloc_ego_table; /* Scan the ego-items */ for (i = 1; i < z_info->e_max; i++) { /* Get the i'th ego item */ e_ptr = &e_info[i]; /* Count valid pairs */ if (e_ptr->rarity) { int p, x, y, z; /* Extract the base level */ x = e_ptr->level; /* Extract the base probability */ p = (100 / e_ptr->rarity); /* Skip entries preceding our locale */ y = (x > 0) ? num[x-1] : 0; /* Skip previous entries at this locale */ z = y + aux[x]; /* Load the entry */ table[z].index = i; table[z].level = x; table[z].prob1 = p; table[z].prob2 = p; table[z].prob3 = p; /* Another entry complete for this locale */ aux[x]++; } } } static void cleanup_ego_allocs(void) { FREE(alloc_ego_table); } /*** Make an ego item ***/ /** * This is a safe way to choose a random new flag to add to an object. * It takes the existing flags and an array of new flags, * and returns an entry from newf, or 0 if there are no * new flags available. */ static int get_new_attr(bitflag flags[OF_SIZE], bitflag newf[OF_SIZE]) { size_t i; int options = 0, flag = 0; for (i = of_next(newf, FLAG_START); i != FLAG_END; i = of_next(newf, i + 1)) { /* skip this one if the flag is already present */ if (of_has(flags, i)) continue; /* each time we find a new possible option, we have a 1-in-N chance of * choosing it and an (N-1)-in-N chance of keeping a previous one */ if (one_in_(++options)) flag = i; } return flag; } /** * Select an ego-item that fits the object's tval and sval. */ static struct ego_item *ego_find_random(object_type *o_ptr, int level) { int i, j, ood_chance; long total = 0L; /* XXX alloc_ego_table &c should be static to this file */ alloc_entry *table = alloc_ego_table; ego_item_type *ego; /* Go through all possible ego items and find ones which fit this item */ for (i = 0; i < alloc_ego_size; i++) { /* Reset any previous probability of this type being picked */ table[i].prob3 = 0; if (level < table[i].level) continue; /* Access the ego item */ ego = &e_info[table[i].index]; /* enforce maximum */ if (level > ego->alloc_max) continue; /* roll for Out of Depth (ood) */ if (level < ego->alloc_min){ ood_chance = MAX(2, (ego->alloc_min - level) / 3); if (!one_in_(ood_chance)) continue; } /* XXX Ignore cursed items for now */ if (cursed_p(ego->flags)) continue; /* Test if this is a legal ego-item type for this object */ for (j = 0; j < EGO_TVALS_MAX; j++) { /* Require identical base type */ if (o_ptr->tval == ego->tval[j] && o_ptr->sval >= ego->min_sval[j] && o_ptr->sval <= ego->max_sval[j]) { table[i].prob3 = table[i].prob2; break; } } /* Total */ total += table[i].prob3; } if (total) { long value = randint0(total); for (i = 0; i < alloc_ego_size; i++) { /* Found the entry */ if (value < table[i].prob3) break; /* Decrement */ value = value - table[i].prob3; } return &e_info[table[i].index]; } return NULL; } /** * Apply generation magic to an ego-item. */ void ego_apply_magic(object_type *o_ptr, int level) { int i, flag, x; bitflag flags[OF_SIZE], newf[OF_SIZE], f2[OF_SIZE]; object_flags(o_ptr, flags); /* Extra powers */ if (o_ptr->ego->xtra == OBJECT_XTRA_TYPE_SUSTAIN) create_mask(newf, FALSE, OFT_SUST, OFT_MAX); else if (o_ptr->ego->xtra == OBJECT_XTRA_TYPE_RESIST) create_mask(newf, FALSE, OFT_HRES, OFT_MAX); else if (o_ptr->ego->xtra == OBJECT_XTRA_TYPE_POWER) create_mask(newf, FALSE, OFT_PROT, OFT_MISC, OFT_MAX); if (o_ptr->ego->xtra) of_on(o_ptr->flags, get_new_attr(flags, newf)); /* Apply extra o_ptr->ego bonuses */ o_ptr->to_h += randcalc(o_ptr->ego->to_h, level, RANDOMISE); o_ptr->to_d += randcalc(o_ptr->ego->to_d, level, RANDOMISE); o_ptr->to_a += randcalc(o_ptr->ego->to_a, level, RANDOMISE); /* Apply pvals */ of_copy(f2, o_ptr->ego->flags); for (i = 0; i < o_ptr->ego->num_pvals; i++) { of_copy(flags, o_ptr->ego->pval_flags[i]); x = randcalc(o_ptr->ego->pval[i], level, RANDOMISE); for (flag = of_next(flags, FLAG_START); flag != FLAG_END; flag = of_next(flags, flag + 1)) /* Prevent phantom flags */ if (x) object_add_pval(o_ptr, x, flag); else of_off(f2, flag); } /* Apply remaining flags */ of_union(o_ptr->flags, f2); return; } /** * Apply minimum pvals to an ego item. */ void ego_min_pvals(object_type *o_ptr) { int i, j, flag; if (!o_ptr->ego) return; for (i = 0; i < o_ptr->num_pvals; i++) for (j = 0; j < o_ptr->ego->num_pvals; j++) for (flag = of_next(o_ptr->ego->pval_flags[j], FLAG_START); flag != FLAG_END; flag = of_next(o_ptr->ego->pval_flags[j], flag + 1)) if ((!of_has(o_ptr->flags, flag) && o_ptr->ego->min_pval[j] > 0) || (o_ptr->ego->min_pval[j] != NO_MINIMUM && of_has(o_ptr->pval_flags[i], flag) && o_ptr->pval[i] < o_ptr->ego->min_pval[j])) object_add_pval(o_ptr, o_ptr->ego->min_pval[j] - o_ptr->pval[i], flag); } /** * Apply minimum standards for ego-items. */ static void ego_apply_minima(object_type *o_ptr) { if (!o_ptr->ego) return; if (o_ptr->ego->min_to_h != NO_MINIMUM && o_ptr->to_h < o_ptr->ego->min_to_h) o_ptr->to_h = o_ptr->ego->min_to_h; if (o_ptr->ego->min_to_d != NO_MINIMUM && o_ptr->to_d < o_ptr->ego->min_to_d) o_ptr->to_d = o_ptr->ego->min_to_d; if (o_ptr->ego->min_to_a != NO_MINIMUM && o_ptr->to_a < o_ptr->ego->min_to_a) o_ptr->to_a = o_ptr->ego->min_to_a; ego_min_pvals(o_ptr); } /** * Try to find an ego-item for an object, setting o_ptr->ego if successful and * applying various bonuses. */ static void make_ego_item(object_type *o_ptr, int level) { /* Cannot further improve artifacts or ego items */ if (o_ptr->artifact || o_ptr->ego) return; /* Occasionally boost the generation level of an item */ if (level > 0 && one_in_(GREAT_EGO)) level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH)); /* Try to get a legal ego type for this item */ o_ptr->ego = ego_find_random(o_ptr, level); /* Actually apply the ego template to the item */ if (o_ptr->ego) ego_apply_magic(o_ptr, level); return; } /*** Make an artifact ***/ /** * Copy artifact data to a normal object, and set various slightly hacky * globals. */ void copy_artifact_data(object_type *o_ptr, const artifact_type *a_ptr) { int i; /* Extract the data */ for (i = 0; i < a_ptr->num_pvals; i++) if (a_ptr->pval[i]) { o_ptr->pval[i] = a_ptr->pval[i]; of_copy(o_ptr->pval_flags[i], a_ptr->pval_flags[i]); } o_ptr->num_pvals = a_ptr->num_pvals; o_ptr->ac = a_ptr->ac; o_ptr->dd = a_ptr->dd; o_ptr->ds = a_ptr->ds; o_ptr->to_a = a_ptr->to_a; o_ptr->to_h = a_ptr->to_h; o_ptr->to_d = a_ptr->to_d; o_ptr->weight = a_ptr->weight; of_union(o_ptr->flags, a_ptr->flags); } /* * Mega-Hack -- Attempt to create one of the "Special Objects". * * We are only called from "make_object()" * * Note -- see "make_artifact()" and "apply_magic()". * * We *prefer* to create the special artifacts in order, but this is * normally outweighed by the "rarity" rolls for those artifacts. */ static bool make_artifact_special(object_type *o_ptr, int level) { int i; object_kind *kind; /* No artifacts, do nothing */ if (OPT(birth_no_artifacts)) return FALSE; /* No artifacts in the town */ if (!p_ptr->depth) return FALSE; /* Check the special artifacts */ for (i = 0; i < ART_MIN_NORMAL; ++i) { artifact_type *a_ptr = &a_info[i]; /* Skip "empty" artifacts */ if (!a_ptr->name) continue; /* Cannot make an artifact twice */ if (a_ptr->created) continue; /* Enforce minimum "depth" (loosely) */ if (a_ptr->alloc_min > p_ptr->depth) { /* Get the "out-of-depth factor" */ int d = (a_ptr->alloc_min - p_ptr->depth) * 2; /* Roll for out-of-depth creation */ if (randint0(d) != 0) continue; } /* Enforce maximum depth (strictly) */ if (a_ptr->alloc_max < p_ptr->depth) continue; /* Artifact "rarity roll" */ if (randint1(100) > a_ptr->alloc_prob) continue; /* Find the base object */ kind = lookup_kind(a_ptr->tval, a_ptr->sval); /* Make sure the kind was found */ if (!kind) continue; /* Enforce minimum "object" level (loosely) */ if (kind->level > level) { /* Get the "out-of-depth factor" */ int d = (kind->level - level) * 5; /* Roll for out-of-depth creation */ if (randint0(d) != 0) continue; } /* Assign the template */ object_prep(o_ptr, kind, a_ptr->alloc_min, RANDOMISE); /* Mark the item as an artifact */ o_ptr->artifact = a_ptr; /* Copy across all the data from the artifact struct */ copy_artifact_data(o_ptr, a_ptr); /* Mark the artifact as "created" */ a_ptr->created = 1; /* Success */ return TRUE; } /* Failure */ return FALSE; } /* * Attempt to change an object into an artifact. If the object is already * set to be an artifact, use that, or otherwise use a suitable randomly- * selected artifact. * * This routine should only be called by "apply_magic()" * * Note -- see "make_artifact_special()" and "apply_magic()" */ static bool make_artifact(object_type *o_ptr) { artifact_type *a_ptr; int i; bool art_ok = TRUE; /* Make sure birth no artifacts isn't set */ if (OPT(birth_no_artifacts)) art_ok = FALSE; /* Special handling of Grond/Morgoth */ if (o_ptr->artifact) { switch (o_ptr->artifact->aidx) { case ART_GROND: case ART_MORGOTH: art_ok = TRUE; } } if (!art_ok) return (FALSE); /* No artifacts in the town */ if (!p_ptr->depth) return (FALSE); /* Paranoia -- no "plural" artifacts */ if (o_ptr->number != 1) return (FALSE); /* Check the artifact list (skip the "specials") */ for (i = ART_MIN_NORMAL; !o_ptr->artifact && i < z_info->a_max; i++) { a_ptr = &a_info[i]; /* Skip "empty" items */ if (!a_ptr->name) continue; /* Cannot make an artifact twice */ if (a_ptr->created) continue; /* Must have the correct fields */ if (a_ptr->tval != o_ptr->tval) continue; if (a_ptr->sval != o_ptr->sval) continue; /* XXX XXX Enforce minimum "depth" (loosely) */ if (a_ptr->alloc_min > p_ptr->depth) { /* Get the "out-of-depth factor" */ int d = (a_ptr->alloc_min - p_ptr->depth) * 2; /* Roll for out-of-depth creation */ if (randint0(d) != 0) continue; } /* Enforce maximum depth (strictly) */ if (a_ptr->alloc_max < p_ptr->depth) continue; /* We must make the "rarity roll" */ if (randint1(100) > a_ptr->alloc_prob) continue; /* Mark the item as an artifact */ o_ptr->artifact = a_ptr; } if (o_ptr->artifact) { copy_artifact_data(o_ptr, o_ptr->artifact); o_ptr->artifact->created = 1; return TRUE; } return FALSE; } /*** Apply magic to an item ***/ /* * Apply magic to a weapon. */ static void apply_magic_weapon(object_type *o_ptr, int level, int power) { if (power <= 0) return; o_ptr->to_h += randint1(5) + m_bonus(5, level); o_ptr->to_d += randint1(5) + m_bonus(5, level); if (power > 1) { o_ptr->to_h += m_bonus(10, level); o_ptr->to_d += m_bonus(10, level); if (wield_slot(o_ptr) == INVEN_WIELD || obj_is_ammo(o_ptr)) { /* Super-charge the damage dice */ while ((o_ptr->dd * o_ptr->ds > 0) && one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++; /* But not too high */ if (o_ptr->dd > 9) o_ptr->dd = 9; } } } /* * Apply magic to armour */ static void apply_magic_armour(object_type *o_ptr, int level, int power) { if (power <= 0) return; o_ptr->to_a += randint1(5) + m_bonus(5, level); if (power > 1) o_ptr->to_a += m_bonus(10, level); } /** * Wipe an object clean and make it a standard object of the specified kind. */ void object_prep(object_type *o_ptr, struct object_kind *k, int lev, aspect rand_aspect) { int i, flag, pval; bitflag flags[OF_SIZE], f2[OF_SIZE]; /* Clean slate */ WIPE(o_ptr, object_type); /* Assign the kind and copy across data */ o_ptr->kind = k; o_ptr->tval = k->tval; o_ptr->sval = k->sval; o_ptr->ac = k->ac; o_ptr->dd = k->dd; o_ptr->ds = k->ds; o_ptr->weight = k->weight; /* Default number */ o_ptr->number = 1; /* Apply pvals and then copy flags */ of_copy(f2, k->flags); for (i = 0; i < k->num_pvals; i++) { of_copy(flags, k->pval_flags[i]); pval = randcalc(k->pval[i], lev, rand_aspect); for (flag = of_next(flags, FLAG_START); flag != FLAG_END; flag = of_next(flags, flag + 1)) /* Prevent phantom flags */ if (pval) object_add_pval(o_ptr, pval, flag); else of_off(f2, flag); } of_copy(o_ptr->flags, k->base->flags); of_union(o_ptr->flags, f2); /* Assign charges (wands/staves only) */ if (o_ptr->tval == TV_WAND || o_ptr->tval == TV_STAFF) o_ptr->pval[DEFAULT_PVAL] = randcalc(k->charge, lev, rand_aspect); /* Assign flagless pval for food or oil */ if (o_ptr->tval == TV_FOOD || o_ptr->tval == TV_POTION || o_ptr->tval == TV_FLASK) o_ptr->pval[DEFAULT_PVAL] = randcalc(k->pval[DEFAULT_PVAL], lev, rand_aspect); /* Default fuel for lamps */ if (o_ptr->tval == TV_LIGHT) { if (o_ptr->sval == SV_LIGHT_TORCH) o_ptr->timeout = DEFAULT_TORCH; else if (o_ptr->sval == SV_LIGHT_LANTERN) o_ptr->timeout = DEFAULT_LAMP; } /* Default magic */ o_ptr->to_h = randcalc(k->to_h, lev, rand_aspect); o_ptr->to_d = randcalc(k->to_d, lev, rand_aspect); o_ptr->to_a = randcalc(k->to_a, lev, rand_aspect); } /** * Applying magic to an object, which includes creating ego-items, and applying * random bonuses, * * The `good` argument forces the item to be at least `good`, and the `great` * argument does likewise. Setting `allow_artifacts` to TRUE allows artifacts * to be created here. * * If `good` or `great` are not set, then the `lev` argument controls the * quality of item. * * Returns 0 if a normal object, 1 if a good object, 2 if an ego item, 3 if an * artifact. */ s16b apply_magic(object_type *o_ptr, int lev, bool allow_artifacts, bool good, bool great, bool extra_roll) { int i; s16b power = 0; /* Chance of being `good` and `great` */ /* This has changed over the years: * 3.0.0: good = MIN(75, lev + 10); great = MIN(20, lev / 2); * 3.3.0: good = (lev + 2) * 3; great = MIN(lev / 4 + lev, 50); * 3.4.0: good = (2 * lev) + 5 * 3.4 was in between 3.0 and 3.3, 3.5 attempts to keep the same * area under the curve as 3.4, but make the generation chances * flatter. This depresses good items overall since more items * are created deeper. * This change is meant to go in conjunction with the changes * to ego item allocation levels. (-fizzix) */ int good_chance = (33 + lev); int great_chance = 30; /* Roll for "good" */ if (good || (randint0(100) < good_chance)) { power = 1; /* Roll for "great" */ if (great || (randint0(100) < great_chance)) power = 2; } /* Roll for artifact creation */ if (allow_artifacts) { int rolls = 0; /* Get one roll if excellent */ if (power >= 2) rolls = 1; /* Get two rolls if forced great */ if (great) rolls = 2; /* Give some extra rolls for uniques and acq scrolls */ if (extra_roll) rolls += 2; /* Roll for artifacts if allowed */ for (i = 0; i < rolls; i++) if (make_artifact(o_ptr)) return 3; } /* Try to make an ego item */ if (power == 2) make_ego_item(o_ptr, lev); /* Apply magic */ switch (o_ptr->tval) { case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOW: case TV_SHOT: case TV_ARROW: case TV_BOLT: apply_magic_weapon(o_ptr, lev, power); break; case TV_DRAG_ARMOR: case TV_HARD_ARMOR: case TV_SOFT_ARMOR: case TV_SHIELD: case TV_HELM: case TV_CROWN: case TV_CLOAK: case TV_GLOVES: case TV_BOOTS: apply_magic_armour(o_ptr, lev, power); break; case TV_RING: if (o_ptr->sval == SV_RING_SPEED) { /* Super-charge the ring */ while (one_in_(2)) o_ptr->pval[which_pval(o_ptr, OF_SPEED)]++; } break; case TV_CHEST: /* Hack -- skip ruined chests */ if (o_ptr->kind->level <= 0) break; /* Hack -- pick a "difficulty" */ o_ptr->pval[DEFAULT_PVAL] = randint1(o_ptr->kind->level); /* Never exceed "difficulty" of 55 to 59 */ if (o_ptr->pval[DEFAULT_PVAL] > 55) o_ptr->pval[DEFAULT_PVAL] = (s16b)(55 + randint0(5)); break; } /* Apply minima from ego items if necessary */ ego_apply_minima(o_ptr); return power; } /*** Generate a random object ***/ /* * Hack -- determine if a template is "good". * * Note that this test only applies to the object *kind*, so it is * possible to choose a kind which is "good", and then later cause * the actual object to be cursed. We do explicitly forbid objects * which are known to be boring or which start out somewhat damaged. */ static bool kind_is_good(const object_kind *kind) { /* Analyze the item type */ switch (kind->tval) { /* Armor -- Good unless damaged */ case TV_HARD_ARMOR: case TV_SOFT_ARMOR: case TV_DRAG_ARMOR: case TV_SHIELD: case TV_CLOAK: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: { if (randcalc(kind->to_a, 0, MINIMISE) < 0) return (FALSE); return (TRUE); } /* Weapons -- Good unless damaged */ case TV_BOW: case TV_SWORD: case TV_HAFTED: case TV_POLEARM: case TV_DIGGING: { if (randcalc(kind->to_h, 0, MINIMISE) < 0) return (FALSE); if (randcalc(kind->to_d, 0, MINIMISE) < 0) return (FALSE); return (TRUE); } /* Ammo -- Arrows/Bolts are good */ case TV_BOLT: case TV_ARROW: { return (TRUE); } /* Books -- High level books are good */ case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: { if (kind->sval >= SV_BOOK_MIN_GOOD) return (TRUE); return (FALSE); } /* Rings -- Rings of Speed are good */ case TV_RING: { if (kind->sval == SV_RING_SPEED) return (TRUE); return (FALSE); } /* Amulets -- Amulets of the Magi are good */ case TV_AMULET: { if (kind->sval == SV_AMULET_THE_MAGI) return (TRUE); if (kind->sval == SV_AMULET_DEVOTION) return (TRUE); if (kind->sval == SV_AMULET_WEAPONMASTERY) return (TRUE); if (kind->sval == SV_AMULET_TRICKERY) return (TRUE); return (FALSE); } } /* Assume not good */ return (FALSE); } /** Arrays holding an index of objects to generate for a given level */ static u32b obj_total[MAX_DEPTH]; static byte *obj_alloc; static u32b obj_total_great[MAX_DEPTH]; static byte *obj_alloc_great; /* Don't worry about probabilities for anything past dlev100 */ #define MAX_O_DEPTH 100 /* * Using k_info[], init rarity data for the entire dungeon. */ bool init_obj_alloc(void) { int k_max = z_info->k_max; int item, lev; /* Free obj_allocs if allocated */ FREE(obj_alloc); /* Allocate and wipe */ obj_alloc = C_ZNEW((MAX_O_DEPTH + 1) * k_max, byte); obj_alloc_great = C_ZNEW((MAX_O_DEPTH + 1) * k_max, byte); /* Wipe the totals */ C_WIPE(obj_total, MAX_O_DEPTH + 1, u32b); C_WIPE(obj_total_great, MAX_O_DEPTH + 1, u32b); /* Init allocation data */ for (item = 1; item < k_max; item++) { const object_kind *kind = &k_info[item]; int min = kind->alloc_min; int max = kind->alloc_max; /* If an item doesn't have a rarity, move on */ if (!kind->alloc_prob) continue; /* Go through all the dungeon levels */ for (lev = 0; lev <= MAX_O_DEPTH; lev++) { int rarity = kind->alloc_prob; /* Save the probability in the standard table */ if ((lev < min) || (lev > max)) rarity = 0; obj_total[lev] += rarity; obj_alloc[(lev * k_max) + item] = rarity; /* Save the probability in the "great" table if relevant */ if (!kind_is_good(kind)) rarity = 0; obj_total_great[lev] += rarity; obj_alloc_great[(lev * k_max) + item] = rarity; } } return TRUE; } /* * Free object allocation info. */ void free_obj_alloc(void) { FREE(obj_alloc); FREE(obj_alloc_great); } /* * Choose an object kind of a given tval given a dungeon level. */ static object_kind *get_obj_num_by_kind(int level, bool good, int tval) { /* This is the base index into obj_alloc for this dlev */ size_t ind, item; u32b value; int total = 0; byte *objects = good ? obj_alloc_great : obj_alloc; /* Pick an object */ ind = level * z_info->k_max; /* Get new total */ for (item = 1; item < z_info->k_max; item++) { if (objkind_byid(item)->tval == tval) { total += objects[ind + item]; } } /* No appropriate items of that tval */ if (!total) return NULL; value = randint0(total); for (item = 1; item < z_info->k_max; item++) { if (objkind_byid(item)->tval == tval) { if (value < objects[ind + item]) break; value -= objects[ind + item]; } } /* Return the item index */ return objkind_byid(item); } /* * Choose an object kind given a dungeon level to choose it for. * If tval = 0, we can choose an object of any type. * Otherwise we can only choose one of the given tval. */ object_kind *get_obj_num(int level, bool good, int tval) { /* This is the base index into obj_alloc for this dlev */ size_t ind, item; u32b value; /* Occasional level boost */ if ((level > 0) && one_in_(GREAT_OBJ)) { /* What a bizarre calculation */ level = 1 + (level * MAX_O_DEPTH / randint1(MAX_O_DEPTH)); } /* Paranoia */ level = MIN(level, MAX_O_DEPTH); level = MAX(level, 0); /* Pick an object */ ind = level * z_info->k_max; if(tval) return get_obj_num_by_kind(level, good, tval); if (!good) { value = randint0(obj_total[level]); for (item = 1; item < z_info->k_max; item++) { /* Found it */ if (value < obj_alloc[ind + item]) break; /* Decrement */ value -= obj_alloc[ind + item]; } } else { value = randint0(obj_total_great[level]); for (item = 1; item < z_info->k_max; item++) { /* Found it */ if (value < obj_alloc_great[ind + item]) break; /* Decrement */ value -= obj_alloc_great[ind + item]; } } /* Return the item index */ return objkind_byid(item); } /** * Attempt to make an object * * \param c is the current dungeon level. * \param j_ptr is the object struct to be populated. * \param lev is the creation level of the object (not necessarily == depth). * \param good is whether the object is to be good * \param great is whether the object is to be great * \param value is the value to be returned to the calling function * \param tval is the desired tval, or 0 if we allow any tval * * Returns the whether or not creation worked. */ bool make_object(struct cave *c, object_type *j_ptr, int lev, bool good, bool great, bool extra_roll, s32b *value, int tval) { int base; object_kind *kind; /* Try to make a special artifact */ if (one_in_(good ? 10 : 1000)) { if (make_artifact_special(j_ptr, lev)) { if (value) *value = object_value_real(j_ptr, 1, FALSE, TRUE); return TRUE; } /* If we failed to make an artifact, the player gets a good item */ good = TRUE; } /* Base level for the object */ base = (good ? (lev + 10) : lev); /* Get the object, prep it and apply magic */ kind = get_obj_num(base, good || great, tval); if (!kind) return FALSE; object_prep(j_ptr, kind, lev, RANDOMISE); apply_magic(j_ptr, lev, TRUE, good, great, extra_roll); /* Generate multiple items */ if (kind->gen_mult_prob >= randint1(100)) j_ptr->number = randcalc(kind->stack_size, lev, RANDOMISE); if (j_ptr->number >= MAX_STACK_SIZE) j_ptr->number = MAX_STACK_SIZE - 1; /* Return value, increased for uncursed out-of-depth objects */ if (value) *value = object_value_real(j_ptr, j_ptr->number, FALSE, TRUE); if (!cursed_p(j_ptr->flags) && (kind->alloc_min > c->depth)) { if (value) *value = (kind->alloc_min - c->depth) * (*value / 5); } return TRUE; } /*** Make a gold item ***/ /* The largest possible average gold drop at max depth with biggest spread */ #define MAX_GOLD_DROP (3 * MAX_DEPTH + 30) /* * Make a money object */ void make_gold(object_type *j_ptr, int lev, int coin_type) { int sval; /* This average is 20 at dlev0, 100 at dlev40, 220 at dlev100. */ s32b avg = (18 * lev)/10 + 18; s32b spread = lev + 10; s32b value = rand_spread(avg, spread); /* Increase the range to infinite, moving the average to 110% */ while (one_in_(100) && value * 10 <= MAX_SHORT) value *= 10; /* Pick a treasure variety scaled by level, or force a type */ if (coin_type != SV_GOLD_ANY) sval = coin_type; else sval = (((value * 100) / MAX_GOLD_DROP) * SV_GOLD_MAX) / 100; /* Do not create illegal treasure types */ if (sval >= SV_GOLD_MAX) sval = SV_GOLD_MAX - 1; /* Prepare a gold object */ object_prep(j_ptr, lookup_kind(TV_GOLD, sval), lev, RANDOMISE); /* If we're playing with no_selling, increase the value */ if (OPT(birth_no_selling) && p_ptr->depth) value = value * MIN(5, p_ptr->depth); /* Cap gold at max short (or alternatively make pvals s32b) */ if (value > MAX_SHORT) value = MAX_SHORT; j_ptr->pval[DEFAULT_PVAL] = value; } struct init_module obj_make_module = { .name = "object/obj-make", .init = init_ego_allocs, .cleanup = cleanup_ego_allocs }; angband-3.5.1/src/object/slays.c0000644000175000017500000002306012456456606015775 0ustar chriscchrisc/* * File: slays.c * Purpose: encapsulation of slay_table and accessor functions for slays/brands * * Copyright (c) 2010 Chris Carr and Peter Denison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "object/slays.h" #include "monster/mon-util.h" /** * Info about slays (see src/slays.h for structure) */ static const struct slay slay_table[] = { #define SLAY(a, b, c, d, e, f, g, h, i, j) \ { SL_##a, b, c, d, e, f, g, h, i, j}, #include "list-slays.h" #undef SLAY }; /** * Cache of slay values (for object_power) */ static struct flag_cache *slay_cache; /** * Remove slays which are duplicates, i.e. they have exactly the same "monster * flag" and the same "resist flag". The one with highest multiplier is kept. * * \param flags is the flagset from which to remove duplicates. * count is the number of dups removed. */ int dedup_slays(bitflag *flags) { int i, j; int count = 0; for (i = 0; i < SL_MAX; i++) { const struct slay *s_ptr = &slay_table[i]; if (of_has(flags, s_ptr->object_flag)) { for (j = i + 1; j < SL_MAX; j++) { const struct slay *t_ptr = &slay_table[j]; if (of_has(flags, t_ptr->object_flag) && (t_ptr->monster_flag == s_ptr->monster_flag) && (t_ptr->resist_flag == s_ptr->resist_flag) && (t_ptr->mult != s_ptr->mult)) { count++; if (t_ptr->mult > s_ptr->mult) of_off(flags, s_ptr->object_flag); else of_off(flags, t_ptr->object_flag); } } } } return count; } /** * Get a random slay (or brand). * We use randint1 because the first entry in slay_table is null. * * \param mask is the set of slays from which we are choosing. */ const struct slay *random_slay(const bitflag mask[OF_SIZE]) { const struct slay *s_ptr; do { s_ptr = &slay_table[randint1(SL_MAX - 1)]; } while (!of_has(mask, s_ptr->object_flag)); return s_ptr; } /** * Match slays in flags against a chosen flag mask * * count is the number of matches * \param flags is the flagset to analyse for matches * \param mask is the flagset against which to test * \param desc is the array of descriptions of matching slays - can be null * \param brand is the array of descriptions of brands - can be null * \param mult is the array of multipliers of those slays - can be null * \param dedup is whether or not to remove duplicates * * desc[], brand[] and mult[] must be >= SL_MAX in size */ int list_slays(const bitflag flags[OF_SIZE], const bitflag mask[OF_SIZE], const char *desc[], const char *brand[], int mult[], bool dedup) { int i, count = 0; bitflag f[OF_SIZE]; /* We are only interested in the flags specified in mask */ of_copy(f, flags); of_inter(f, mask); /* Remove "duplicate" flags if desired */ if (dedup) dedup_slays(f); /* Collect slays */ for (i = 0; i < SL_MAX; i++) { const struct slay *s_ptr = &slay_table[i]; if (of_has(f, s_ptr->object_flag)) { if (mult) mult[count] = s_ptr->mult; if (brand) brand[count] = s_ptr->brand; if (desc) desc[count] = s_ptr->desc; count++; } } return count; } /** * Notice any slays on a particular object which are in mask. * * \param o_ptr is the object on which we are noticing slays * \param mask is the flagset within which we are noticing them */ void object_notice_slays(object_type *o_ptr, const bitflag mask[OF_SIZE]) { bool learned; bitflag f[OF_SIZE]; char o_name[40]; int i; /* We are only interested in the flags specified in mask */ object_flags(o_ptr, f); of_inter(f, mask); /* if you learn a slay, learn the ego and print a message */ for (i = 0; i < SL_MAX; i++) { const struct slay *s_ptr = &slay_table[i]; if (of_has(f, s_ptr->object_flag)) { learned = object_notice_flag(o_ptr, s_ptr->object_flag); if (EASY_LEARN && learned) { object_notice_ego(o_ptr); object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE | ODESC_SINGULAR); msg("Your %s %s!", o_name, s_ptr->active_verb); } } } object_check_for_ident(o_ptr); } /** * Extract the multiplier from a given object hitting a given monster. * * \param o_ptr is the object being used to attack * \param m_ptr is the monster being attacked * \param best_s_ptr is the best applicable slay_table entry, or NULL if no * slay already known * \param real is whether this is a real attack (where we update lore) or a * simulation (where we don't) * \param known_only is whether we are using all the object flags, or only * the ones we *already* know about */ void improve_attack_modifier(object_type *o_ptr, const monster_type *m_ptr, const struct slay **best_s_ptr, bool real, bool known_only) { monster_lore *l_ptr = get_lore(m_ptr->race); bitflag f[OF_SIZE], known_f[OF_SIZE], note_f[OF_SIZE]; int i; object_flags(o_ptr, f); object_flags_known(o_ptr, known_f); for (i = 0; i < SL_MAX; i++) { const struct slay *s_ptr = &slay_table[i]; if ((known_only && !of_has(known_f, s_ptr->object_flag)) || (!known_only && !of_has(f, s_ptr->object_flag))) continue; /* In a real attack, learn about monster resistance or slay match if: * EITHER the slay flag on the object is known, * OR the monster is vulnerable to the slay/brand */ if (real && (of_has(known_f, s_ptr->object_flag) || (s_ptr->monster_flag && rf_has(m_ptr->race->flags, s_ptr->monster_flag)) || (s_ptr->resist_flag && !rf_has(m_ptr->race->flags, s_ptr->resist_flag)))) { /* notice any brand or slay that would affect monster */ of_wipe(note_f); of_on(note_f, s_ptr->object_flag); object_notice_slays(o_ptr, note_f); if (m_ptr->ml && s_ptr->monster_flag) rf_on(l_ptr->flags, s_ptr->monster_flag); if (m_ptr->ml && s_ptr->resist_flag) rf_on(l_ptr->flags, s_ptr->resist_flag); } /* If the monster doesn't resist or the slay flag matches */ if ((s_ptr->brand && !rf_has(m_ptr->race->flags, s_ptr->resist_flag)) || (s_ptr->monster_flag && rf_has(m_ptr->race->flags, s_ptr->monster_flag))) { /* compare multipliers to determine best attack */ if ((*best_s_ptr == NULL) || ((*best_s_ptr)->mult < s_ptr->mult)) *best_s_ptr = s_ptr; } } } /** * React to slays which hurt a monster * * \param obj_flags is the set of flags we're testing for slays * \param mon_flags is the set of flags we're adjusting as a result */ void react_to_slay(bitflag *obj_flags, bitflag *mon_flags) { int i; for (i = 0; i < SL_MAX; i++) { const struct slay *s_ptr = &slay_table[i]; if (of_has(obj_flags, s_ptr->object_flag) && s_ptr->monster_flag) rf_on(mon_flags, s_ptr->monster_flag); } } /** * Check the slay cache for a combination of slays and return a slay value * * \param index is the set of slay flags to look for */ s32b check_slay_cache(bitflag *index) { int i; for (i = 0; !of_is_empty(slay_cache[i].flags); i++) if (of_is_equal(index, slay_cache[i].flags)) break; return slay_cache[i].value; } /** * Fill in a value in the slay cache. Return TRUE if a change is made. * * \param index is the set of slay flags whose value we are adding * \param value is the value of the slay flags in index */ bool fill_slay_cache(bitflag *index, s32b value) { int i; for (i = 0; !of_is_empty(slay_cache[i].flags); i++) { if (of_is_equal(index, slay_cache[i].flags)) { slay_cache[i].value = value; return TRUE; } } return FALSE; } /** * Create a cache of slay combinations found on ego items, and the values of * these combinations. This is to speed up slay_power(), which will be called * many times for ego items during the game. * * \param items is the set of ego types from which we are extracting slay * combinations */ errr create_slay_cache(struct ego_item *items) { int i; int j; int count = 0; bitflag cacheme[OF_SIZE]; bitflag slay_mask[OF_SIZE]; bitflag **dupcheck; ego_item_type *e_ptr; /* Build the slay mask */ create_mask(slay_mask, FALSE, OFT_SLAY, OFT_KILL, OFT_BRAND, OFT_MAX); /* Calculate necessary size of slay_cache */ dupcheck = C_ZNEW(z_info->e_max, bitflag *); for (i = 0; i < z_info->e_max; i++) { dupcheck[i] = C_ZNEW(OF_SIZE, bitflag); e_ptr = items + i; /* Find the slay flags on this ego */ of_copy(cacheme, e_ptr->flags); of_inter(cacheme, slay_mask); /* Only consider non-empty combinations of slay flags */ if (!of_is_empty(cacheme)) { /* Skip previously scanned combinations */ for (j = 0; j < i; j++) if (of_is_equal(cacheme, dupcheck[j])) continue; /* msg("Found a new slay combo on an ego item"); */ count++; of_copy(dupcheck[i], cacheme); } } /* Allocate slay_cache with an extra empty element for an iteration stop */ slay_cache = C_ZNEW((count + 1), struct flag_cache); count = 0; /* Populate the slay_cache */ for (i = 0; i < z_info->e_max; i++) { if (!of_is_empty(dupcheck[i])) { of_copy(slay_cache[count].flags, dupcheck[i]); slay_cache[count].value = 0; count++; /*msg("Cached a slay combination");*/ } } for (i = 0; i < z_info->e_max; i++) FREE(dupcheck[i]); FREE(dupcheck); /* Success */ return 0; } void free_slay_cache(void) { mem_free(slay_cache); } angband-3.5.1/src/object/slays.h0000644000175000017500000000454712456456606016013 0ustar chriscchrisc/* * File: slays.h * Purpose: Structures and functions for dealing with slays and brands * * Copyright (c) 2010 Chris Carr * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef INCLUDED_SLAYS_H #define INCLUDED_SLAYS_H /* Types of slay (including brands) */ enum { #define SLAY(a, b, c, d, e, f, g, h, i, j) SL_##a, #include "list-slays.h" #undef SLAY SL_MAX }; /* * Slay type. Used for the table of brands/slays and their effects. */ struct slay { u16b index; /* Numerical index */ int object_flag; /* Object flag for the slay */ int monster_flag; /* Which monster flag(s) make it vulnerable */ int resist_flag; /* Which monster flag(s) make it resist */ int mult; /* Slay multiplier */ const char *range_verb; /* attack verb for ranged hits */ const char *melee_verb; /* attack verb for melee hits */ const char *active_verb; /* verb for when the object is active */ const char *desc; /* description of vulnerable creatures */ const char *brand; /* name of brand */ }; /* * Slay cache. Used for looking up slay values in obj-power.c */ struct flag_cache { bitflag flags[OF_SIZE]; /* Combination of slays and brands */ s32b value; /* Value of this combination */ }; /*** Functions ***/ int dedup_slays(bitflag *flags); const struct slay *random_slay(const bitflag mask[OF_SIZE]); int list_slays(const bitflag flags[OF_SIZE], const bitflag mask[OF_SIZE], const char *desc[], const char *brand[], int mult[], bool dedup); void object_notice_slays(object_type *o_ptr, const bitflag mask[OF_SIZE]); void improve_attack_modifier(object_type *o_ptr, const monster_type *m_ptr, const struct slay **best_s_ptr, bool lore, bool known_only); void react_to_slay(bitflag *obj_flags, bitflag *mon_flags); errr create_slay_cache(struct ego_item *items); s32b check_slay_cache(bitflag *index); bool fill_slay_cache(bitflag *index, s32b value); void free_slay_cache(void); #endif /* INCLUDED_SLAYS_H */ angband-3.5.1/src/object/obj-list.h0000644000175000017500000000161612456456606016375 0ustar chriscchrisc/* * File: obj-list.h * Purpose: Object list UI. * * Copyright (c) 1997-2007 Ben Harrison, James E. Wilson, Robert A. Koeneke * Copyright (c) 2013 Ben Semmler * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef OBJECT_LIST_H #define OBJECT_LIST_H #include "angband.h" void object_list_init(void); void object_list_finalize(void); void object_list_show_subwindow(int height, int width); void object_list_show_interactive(int height, int width); #endif /* OBJECT_LIST_H */ angband-3.5.1/src/object/object.h0000644000175000017500000006653112456456606016127 0ustar chriscchrisc#ifndef INCLUDED_OBJECT_H #define INCLUDED_OBJECT_H #include "z-rand.h" #include "z-file.h" #include "z-textblock.h" #include "z-quark.h" #include "z-bitflag.h" #include "game-cmd.h" #include "cave.h" #include "object/obj-flag.h" struct player; /*** Game constants ***/ /* * Refueling constants */ #define FUEL_TORCH 5000 /* Maximum amount of fuel in a torch */ #define FUEL_LAMP 15000 /* Maximum amount of fuel in a lantern */ #define DEFAULT_TORCH FUEL_TORCH /* Default amount of fuel in a torch */ #define DEFAULT_LAMP (FUEL_LAMP / 2) /* Default amount of fuel in a lantern */ /* A "stack" of items is limited to 40 items (hard-coded). */ #define MAX_STACK_SIZE 41 /* An item's pval (for charges, amount of gold, etc) is limited to s16b */ #define MAX_PVAL 32767 /* * Maximum number of objects allowed in a single dungeon grid. * * The main-screen has a minimum size of 24 rows, so we can always * display 23 objects + 1 header line. */ #define MAX_FLOOR_STACK 23 /*** API constants ***/ /* Object origin kinds */ enum { ORIGIN_NONE = 0, ORIGIN_FLOOR, /* found on the dungeon floor */ ORIGIN_DROP, /* normal monster drops */ ORIGIN_CHEST, ORIGIN_DROP_SPECIAL, /* from monsters in special rooms */ ORIGIN_DROP_PIT, /* from monsters in pits/nests */ ORIGIN_DROP_VAULT, /* from monsters in vaults */ ORIGIN_SPECIAL, /* on the floor of a special room */ ORIGIN_PIT, /* on the floor of a pit/nest */ ORIGIN_VAULT, /* on the floor of a vault */ ORIGIN_LABYRINTH, /* on the floor of a labyrinth */ ORIGIN_CAVERN, /* on the floor of a cavern */ ORIGIN_RUBBLE, /* found under rubble */ ORIGIN_MIXED, /* stack with mixed origins */ ORIGIN_STATS, /* ^ only the above are considered by main-stats */ ORIGIN_ACQUIRE, /* called forth by scroll */ ORIGIN_DROP_BREED, /* from breeders */ ORIGIN_DROP_SUMMON, /* from combat summons */ ORIGIN_STORE, /* something you bought */ ORIGIN_STOLEN, /* stolen by monster (used only for gold) */ ORIGIN_BIRTH, /* objects created at character birth */ ORIGIN_DROP_UNKNOWN, /* drops from unseen foes */ ORIGIN_CHEAT, /* created by wizard mode */ ORIGIN_DROP_POLY, /* from polymorphees */ ORIGIN_DROP_WIZARD, /* from wizard mode summons */ ORIGIN_MAX }; #define ORIGIN_SIZE FLAG_SIZE(ORIGIN_MAX) #define ORIGIN_BYTES 4 /* savefile bytes - room for 32 origin types */ /** * Maximum number of pvals on objects * * Note: all pvals other than DEFAULT_PVAL are assumed to be associated with * flags, and any non-flag uses of pval (e.g. chest quality, gold quantity) * are assumed to use DEFAULT_PVAL. */ #define MAX_PVALS 3 #define DEFAULT_PVAL 0 /* ID flags */ #define IDENT_SENSE 0x0001 /* Has been "sensed" */ #define IDENT_WORN 0x0002 /* Has been tried on */ #define IDENT_EMPTY 0x0004 /* Is known to be empty */ #define IDENT_KNOWN 0x0008 /* Fully known */ #define IDENT_STORE 0x0010 /* Item is in the inventory of a store */ #define IDENT_ATTACK 0x0020 /* Know combat dice/ac/bonuses */ #define IDENT_DEFENCE 0x0040 /* Know AC/etc bonuses */ #define IDENT_EFFECT 0x0080 /* Know item activation/effect */ /* xxx */ #define IDENT_INDESTRUCT 0x0200 /* Tried to destroy it and failed */ #define IDENT_NAME 0x0400 /* Know the name of ego or artifact if there is one */ #define IDENT_FIRED 0x0800 /* Has been used as a missile */ #define IDENT_NOTART 0x1000 /* Item is known not to be an artifact */ #define IDENT_FAKE 0x2000 /* Item is a fake, for displaying knowledge */ #define IDENT_SENSED_THIS_TURN 0x4000 /* Item has had a chance to be sensed on this turn (see sense_inventory()) */ /* Whether to learn egos and flavors with less than complete information */ #define EASY_LEARN 1 /* Maximum number of scroll titles generated */ #define MAX_TITLES 50 /** * Modes for object_desc(). */ enum { ODESC_BASE = 0x00, /*!< Only describe the base name */ ODESC_COMBAT = 0x01, /*!< Also show combat bonuses */ ODESC_EXTRA = 0x02, /*!< Show charges/inscriptions/pvals */ ODESC_FULL = ODESC_COMBAT | ODESC_EXTRA, /*!< Show entire description */ ODESC_STORE = 0x04, /*!< This is an in-store description */ ODESC_PLURAL = 0x08, /*!< Always pluralise */ ODESC_SINGULAR = 0x10, /*!< Always singular */ ODESC_SPOIL = 0x20, /*!< Display regardless of player knowledge */ ODESC_PREFIX = 0x40, /* */ ODESC_CAPITAL = 0x80, /*!< Capitalise object name */ ODESC_TERSE = 0x100 /*!< Make terse names */ }; /** * Modes for item lists in "show_inven()" "show_equip()" and "show_floor()" */ typedef enum { OLIST_NONE = 0x00, /* No options */ OLIST_WINDOW = 0x01, /* Display list in a sub-term (left-align) */ OLIST_QUIVER = 0x02, /* Display quiver lines */ OLIST_GOLD = 0x04, /* Include gold in the list */ OLIST_WEIGHT = 0x08, /* Show item weight */ OLIST_PRICE = 0x10, /* Show item price */ OLIST_FAIL = 0x20, /* Show device failure */ OLIST_SEMPTY = 0x40 } olist_detail_t; /** * Modes for object_info() */ typedef enum { OINFO_NONE = 0x00, /* No options */ OINFO_TERSE = 0x01, /* Keep descriptions brief, e.g. for dumps */ OINFO_SUBJ = 0x02, /* Describe object from the character's POV */ OINFO_FULL = 0x04, /* Treat object as if fully IDd */ OINFO_DUMMY = 0x08, /* Object does not exist (e.g. knowledge menu) */ OINFO_EGO = 0x10, /* Describe ego random powers */ } oinfo_detail_t; /** * Modes for stacking by object_similar() */ typedef enum { OSTACK_NONE = 0x00, /* No options (this does NOT mean no stacking) */ OSTACK_STORE = 0x01, /* Store stacking */ OSTACK_PACK = 0x02, /* Inventory and home */ OSTACK_LIST = 0x04, /* Object list */ OSTACK_MONSTER = 0x08, /* Monster carrying objects */ OSTACK_FLOOR = 0x10, /* Floor stacking */ OSTACK_QUIVER = 0x20 /* Quiver */ } object_stack_t; /** * Pseudo-ID markers. */ typedef enum { INSCRIP_NULL = 0, /*!< No pseudo-ID status */ INSCRIP_STRANGE = 1, /*!< Item that has mixed combat bonuses */ INSCRIP_AVERAGE = 2, /*!< Item with no interesting features */ INSCRIP_MAGICAL = 3, /*!< Item with combat bonuses */ INSCRIP_SPLENDID = 4, /*!< Obviously good item */ INSCRIP_EXCELLENT = 5, /*!< Ego-item */ INSCRIP_SPECIAL = 6, /*!< Artifact */ INSCRIP_UNKNOWN = 7, INSCRIP_MAX /*!< Maximum number of pseudo-ID markers */ } obj_pseudo_t; /* * Chest check types */ enum chest_query { CHEST_ANY, CHEST_OPENABLE, CHEST_TRAPPED }; /* * Bit flags for get_item() function */ #define USE_EQUIP 0x0001 /* Allow equip items */ #define USE_INVEN 0x0002 /* Allow inven items */ #define USE_FLOOR 0x0004 /* Allow floor items */ #define IS_HARMLESS 0x0008 /* Ignore generic warning inscriptions */ #define SHOW_PRICES 0x0010 /* Show item prices in item lists */ #define SHOW_FAIL 0x0020 /* Show device failure in item lists */ #define SHOW_QUIVER 0x0040 /* Show quiver summary when looking at inventory */ #define SHOW_EMPTY 0x0080 /* Show empty slots in equipment display */ #define QUIVER_TAGS 0x0100 /* 0-9 are quiver slots when selecting */ /* * Some constants used in randart generation and power calculation * - thresholds for limiting to_hit, to_dam and to_ac * - fudge factor for rescaling ammo cost * (a stack of this many equals a weapon of the same damage output) */ #define INHIBIT_POWER 20000 #define INHIBIT_BLOWS 3 #define INHIBIT_MIGHT 4 #define INHIBIT_SHOTS 3 #define HIGH_TO_AC 26 #define VERYHIGH_TO_AC 36 #define INHIBIT_AC 56 #define HIGH_TO_HIT 16 #define VERYHIGH_TO_HIT 26 #define HIGH_TO_DAM 16 #define VERYHIGH_TO_DAM 26 #define AMMO_RESCALER 20 /* this value is also used for torches */ #define sign(x) ((x) > 0 ? 1 : ((x) < 0 ? -1 : 0)) /* Values for struct object->marked */ enum { MARK_UNAWARE = 0, MARK_AWARE = 1, MARK_SEEN = 2 }; /*** Macros ***/ /* * Determine if the attr and char should consider the item's flavor * * Identified scrolls should use their own tile. */ #define use_flavor_glyph(kind) \ ((kind)->flavor && \ !((kind)->tval == TV_SCROLL && (kind)->aware)) /* * Return the "attr" for a given item kind. * Use "flavor" if available. * Default to user definitions. */ #define object_kind_attr(kind) \ (use_flavor_glyph((kind)) ? \ ((kind)->flavor->x_attr) : \ ((kind)->x_attr)) /* * Return the "char" for a given item kind. * Use "flavor" if available. * Default to user definitions. */ #define object_kind_char(kind) \ (use_flavor_glyph(kind) ? \ ((kind)->flavor->x_char) : \ ((kind)->x_char)) /* * Return the "attr" for a given item. * Use "flavor" if available. * Default to user definitions. */ #define object_attr(T) \ (object_kind_attr((T)->kind)) /* * Return the "char" for a given item. * Use "flavor" if available. * Default to user definitions. */ #define object_char(T) \ (object_kind_char((T)->kind)) /* * Rings and Amulets */ #define object_is_jewelry(T) \ (((T)->tval == TV_RING) || ((T)->tval == TV_AMULET)) /*** Structures ***/ /* * And here's the structure for the "fixed" spell information */ typedef struct spell { struct spell *next; unsigned int sidx; char *name; char *text; byte realm; /* 0 = mage; 1 = priest */ byte tval; /* Item type for book this spell is in */ byte sval; /* Item sub-type for book (= book number) */ byte snum; /* Position of spell within book */ byte spell_index; /* Index into player_magic array */ } spell_type; /** * Information about object types, like rods, wands, etc. */ typedef struct object_base { char *name; int tval; struct object_base *next; bitflag flags[OF_SIZE]; int break_perc; } object_base; /** * Information about object kinds, including player knowledge. * * TODO: split out the user-changeable bits into a separate struct so this * one can be read-only. */ typedef struct object_kind { char *name; char *text; object_base *base; struct object_kind *next; u32b kidx; byte tval; /**< General object type (see TV_ macros) */ byte sval; /**< Object sub-type (see SV_ macros) */ random_value pval[MAX_PVALS]; /**< Power for any flags which need it */ byte num_pvals; /**< Number of pvals in use on this item */ random_value to_h; /**< Bonus to hit */ random_value to_d; /**< Bonus to damage */ random_value to_a; /**< Bonus to armor */ s16b ac; /**< Base armor */ byte dd; /**< Damage dice */ byte ds; /**< Damage sides */ s16b weight; /**< Weight, in 1/10lbs */ s32b cost; /**< Object base cost */ bitflag flags[OF_SIZE]; /**< Flags */ bitflag pval_flags[MAX_PVALS][OF_SIZE]; /**< pval flags */ byte d_attr; /**< Default object attribute */ wchar_t d_char; /**< Default object character */ int alloc_prob; /**< Allocation: commonness */ byte alloc_min; /**< Highest normal dungeon level */ byte alloc_max; /**< Lowest normal dungeon level */ byte level; /**< Level (difficulty of activation) */ u16b effect; /**< Effect this item produces (effects.c) */ random_value time; /**< Recharge time (rods/activation) */ random_value charge; /**< Number of charges (staves/wands) */ byte gen_mult_prob; /**< Probability of generating more than one */ random_value stack_size; /**< Number to generate */ struct flavor *flavor; /**< Special object flavor (or zero) */ /** Game-dependent **/ byte x_attr; /**< Desired object attribute (set by user/pref file) */ wchar_t x_char; /**< Desired object character (set by user/pref file) */ /** Also saved in savefile **/ quark_t note; /**< Autoinscription quark number */ bool aware; /**< Set if player is aware of the kind's effects */ bool tried; /**< Set if kind has been tried */ byte squelch; /**< Squelch settings */ bool everseen; /**< Set if kind has ever been seen (to despoilify squelch menus) */ struct spell *spells; } object_kind; /** * Information about artifacts. * * Note that ::cur_num is written to the savefile. * * TODO: Fix this max_num/cur_num crap and just have a big boolean array of * which artifacts have been created and haven't, so this can become read-only. */ typedef struct artifact { char *name; char *text; u32b aidx; struct artifact *next; byte tval; /**< General artifact type (see TV_ macros) */ byte sval; /**< Artifact sub-type (see SV_ macros) */ s16b pval[MAX_PVALS]; /**< Power for any flags which need it */ byte num_pvals;/**< Number of pvals in use on this item */ s16b to_h; /**< Bonus to hit */ s16b to_d; /**< Bonus to damage */ s16b to_a; /**< Bonus to armor */ s16b ac; /**< Base armor */ byte dd; /**< Base damage dice */ byte ds; /**< Base damage sides */ s16b weight; /**< Weight in 1/10lbs */ s32b cost; /**< Artifact (pseudo-)worth */ bitflag flags[OF_SIZE]; /**< Flags */ bitflag pval_flags[MAX_PVALS][OF_SIZE]; /**< pval flags */ byte level; /** Difficulty level for activation */ int alloc_prob; /** Chance of being generated (i.e. rarity) */ byte alloc_min; /** Minimum depth (can appear earlier) */ byte alloc_max; /** Maximum depth (will NEVER appear deeper) */ bool created; /**< Whether this artifact has been created */ bool seen; /**< Whether this artifact has been seen this game */ bool everseen; /**< Whether this artifact has ever been seen */ u16b effect; /**< Artifact activation (see effects.c) */ char *effect_msg; random_value time; /**< Recharge time (if appropriate) */ } artifact_type; /* * Number of tval/min-sval/max-sval slots per ego item */ #define EGO_TVALS_MAX 3 /* * Information about "ego-items". */ typedef struct ego_item { struct ego_item *next; char *name; char *text; u32b eidx; s32b cost; /* Ego-item "cost" */ bitflag flags[OF_SIZE]; /**< Flags */ bitflag pval_flags[MAX_PVALS][OF_SIZE]; /**< pval flags */ byte level; /* Minimum level */ byte rarity; /* Object rarity */ byte rating; /* Level rating boost */ int alloc_prob; /** Chance of being generated (i.e. rarity) */ byte alloc_min; /** Minimum depth (can appear earlier) */ byte alloc_max; /** Maximum depth (will NEVER appear deeper) */ byte tval[EGO_TVALS_MAX]; /* Legal tval */ byte min_sval[EGO_TVALS_MAX]; /* Minimum legal sval */ byte max_sval[EGO_TVALS_MAX]; /* Maximum legal sval */ random_value to_h; /* Extra to-hit bonus */ random_value to_d; /* Extra to-dam bonus */ random_value to_a; /* Extra to-ac bonus */ random_value pval[MAX_PVALS]; /* Extra pval bonus */ byte num_pvals; /* Number of pvals used */ byte min_to_h; /* Minimum to-hit value */ byte min_to_d; /* Minimum to-dam value */ byte min_to_a; /* Minimum to-ac value */ byte min_pval[MAX_PVALS]; /* Minimum pval */ byte xtra; /* Extra sustain/resist/power */ bool everseen; /* Do not spoil squelch menus */ } ego_item_type; /* * Object information, for a specific object. * * Note that a "discount" on an item is permanent and never goes away. * * Note that inscriptions are now handled via the "quark_str()" function * applied to the "note" field, which will return NULL if "note" is zero. * * Note that "object" records are "copied" on a fairly regular basis, * and care must be taken when handling such objects. * * Note that "object flags" must now be derived from the object kind, * the artifact and ego-item indexes, and the two "xtra" fields. * * Each cave grid points to one (or zero) objects via the "o_idx" * field (above). Each object then points to one (or zero) objects * via the "next_o_idx" field, forming a singly linked list, which * in game terms, represents a "stack" of objects in the same grid. * * Each monster points to one (or zero) objects via the "hold_o_idx" * field (below). Each object then points to one (or zero) objects * via the "next_o_idx" field, forming a singly linked list, which * in game terms, represents a pile of objects held by the monster. * * The "held_m_idx" field is used to indicate which monster, if any, * is holding the object. Objects being held have "ix=0" and "iy=0". */ typedef struct object { struct object_kind *kind; struct ego_item *ego; struct artifact *artifact; byte iy; /* Y-position on map, or zero */ byte ix; /* X-position on map, or zero */ byte tval; /* Item type (from kind) */ byte sval; /* Item sub-type (from kind) */ s16b pval[MAX_PVALS]; /* Item extra-parameter */ byte num_pvals; /* Number of pvals in use */ s16b weight; /* Item weight */ bitflag flags[OF_SIZE]; /**< Flags */ bitflag known_flags[OF_SIZE]; /**< Player-known flags */ bitflag pval_flags[MAX_PVALS][OF_SIZE]; /**< pval flags */ u16b ident; /* Special flags */ s16b ac; /* Normal AC */ s16b to_a; /* Plusses to AC */ s16b to_h; /* Plusses to hit */ s16b to_d; /* Plusses to damage */ byte dd, ds; /* Damage dice/sides */ s16b timeout; /* Timeout Counter */ byte number; /* Number of items */ byte marked; /* Object is marked */ byte ignore; /* Object is ignored */ s16b next_o_idx; /* Next object in stack (if any) */ s16b held_m_idx; /* Monster holding us (if any) */ s16b mimicking_m_idx; /* Monster mimicking us (if any) */ byte origin; /* How this item was found */ byte origin_depth; /* What depth the item was found at */ u16b origin_xtra; /* Extra information about origin */ quark_t note; /* Inscription index */ } object_type; struct flavor { char *text; struct flavor *next; unsigned int fidx; byte tval; /* Associated object type */ byte sval; /* Associated object sub-type */ byte d_attr; /* Default flavor attribute */ wchar_t d_char; /* Default flavor character */ byte x_attr; /* Desired flavor attribute */ wchar_t x_char; /* Desired flavor character */ }; /*** Functions ***/ /* chest.c */ byte chest_trap_type(const object_type *o_ptr); bool is_trapped_chest(const object_type *o_ptr); bool is_locked_chest(const object_type *o_ptr); void unlock_chest(object_type *o_ptr); s16b chest_check(int y, int x, enum chest_query check_type); int count_chests(int *y, int *x, enum chest_query check_type); bool do_cmd_open_chest(int y, int x, s16b o_idx); bool do_cmd_disarm_chest(int y, int x, s16b o_idx); /* identify.c */ extern s32b object_last_wield; bool object_is_known(const object_type *o_ptr); bool object_is_known_artifact(const object_type *o_ptr); bool object_is_known_cursed(const object_type *o_ptr); bool object_is_known_blessed(const object_type *o_ptr); bool object_is_known_not_artifact(const object_type *o_ptr); bool object_is_not_known_consistently(const object_type *o_ptr); bool object_was_worn(const object_type *o_ptr); bool object_was_fired(const object_type *o_ptr); bool object_was_sensed(const object_type *o_ptr); bool object_flavor_is_aware(const object_type *o_ptr); bool object_flavor_was_tried(const object_type *o_ptr); bool object_effect_is_known(const object_type *o_ptr); bool object_ego_is_visible(const object_type *o_ptr); bool object_attack_plusses_are_visible(const object_type *o_ptr); bool object_defence_plusses_are_visible(const object_type *o_ptr); bool object_flag_is_known(const object_type *o_ptr, int flag); bool object_high_resist_is_possible(const object_type *o_ptr); void object_flavor_aware(object_type *o_ptr); void object_flavor_tried(object_type *o_ptr); void object_notice_everything(object_type *o_ptr); void object_notice_indestructible(object_type *o_ptr); void object_notice_ego(object_type *o_ptr); void object_notice_sensing(object_type *o_ptr); void object_sense_artifact(object_type *o_ptr); void object_notice_effect(object_type *o_ptr); void object_notice_attack_plusses(object_type *o_ptr); bool object_notice_flag(object_type *o_ptr, int flag); bool object_notice_flags(object_type *o_ptr, bitflag flags[OF_SIZE]); bool object_notice_curses(object_type *o_ptr); void object_notice_on_defend(struct player *p); void object_notice_on_wield(object_type *o_ptr); void object_notice_on_firing(object_type *o_ptr); void wieldeds_notice_flag(struct player *p, int flag); void wieldeds_notice_to_hit_on_attack(void); void wieldeds_notice_on_attack(void); void object_repair_knowledge(object_type *o_ptr); bool object_FA_would_be_obvious(const object_type *o_ptr); obj_pseudo_t object_pseudo(const object_type *o_ptr); void sense_inventory(void); bool easy_know(const object_type *o_ptr); bool object_check_for_ident(object_type *o_ptr); bool object_name_is_visible(const object_type *o_ptr); void object_know_all_flags(object_type *o_ptr); /* obj-desc.c */ void object_base_name(char *buf, size_t max, int tval, bool plural); void object_kind_name(char *buf, size_t max, const object_kind *kind, bool easy_know); size_t obj_desc_name_format(char *buf, size_t max, size_t end, const char *fmt, const char *modstr, bool pluralise); size_t object_desc(char *buf, size_t max, const object_type *o_ptr, int mode); /* obj-info.c */ textblock *object_info(const object_type *o_ptr, oinfo_detail_t mode); textblock *object_info_ego(struct ego_item *ego); void object_info_spoil(ang_file *f, const object_type *o_ptr, int wrap); void object_info_chardump(ang_file *f, const object_type *o_ptr, int indent, int wrap); /* obj-make.c */ void free_obj_alloc(void); bool init_obj_alloc(void); object_kind *get_obj_num(int level, bool good, int tval); void object_prep(object_type *o_ptr, struct object_kind *kind, int lev, aspect rand_aspect); s16b apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great, bool extra_roll); bool make_object(struct cave *c, object_type *j_ptr, int lev, bool good, bool great, bool extra_roll, s32b *value, int tval); void make_gold(object_type *j_ptr, int lev, int coin_type); void copy_artifact_data(object_type *o_ptr, const artifact_type *a_ptr); void ego_apply_magic(object_type *o_ptr, int level); void ego_min_pvals(object_type *o_ptr); /* obj-ui.c */ void show_inven(int mode); void show_equip(int mode); void show_floor(const int *floor_list, int floor_num, int mode); bool verify_item(const char *prompt, int item); bool get_item(int *cp, const char *pmt, const char *str, cmd_code cmd, int mode); bool get_item_allow(int item, unsigned char ch, cmd_code cmd, bool is_harmless); /* obj-util.c */ struct object_kind *objkind_get(int tval, int sval); struct object_kind *objkind_byid(int kidx); void flavor_init(void); void reset_visuals(bool load_prefs); void object_flags(const object_type *o_ptr, bitflag flags[OF_SIZE]); void object_flags_known(const object_type *o_ptr, bitflag flags[OF_SIZE]); char index_to_label(int i); s16b label_to_inven(int c); s16b label_to_equip(int c); bool wearable_p(const object_type *o_ptr); s16b wield_slot(const object_type *o_ptr); bool slot_can_wield_item(int slot, const object_type *o_ptr); const char *mention_use(int slot); const char *describe_use(int i); bool item_tester_okay(const object_type *o_ptr); int scan_floor(int *items, int max_size, int y, int x, int mode); void excise_object_idx(int o_idx); void delete_object_idx(int o_idx); void delete_object(int y, int x); void compact_objects(int size); void wipe_o_list(struct cave *c); s16b o_pop(void); object_type *get_first_object(int y, int x); object_type *get_next_object(const object_type *o_ptr); bool is_blessed(const object_type *o_ptr); s32b object_value(const object_type *o_ptr, int qty, int verbose); s32b object_value_real(const object_type *o_ptr, int qty, int verbose, bool known); bool object_similar(const object_type *o_ptr, const object_type *j_ptr, object_stack_t mode); void object_absorb(object_type *o_ptr, const object_type *j_ptr); void object_wipe(object_type *o_ptr); void object_copy(object_type *o_ptr, const object_type *j_ptr); void object_copy_amt(object_type *dst, object_type *src, int amt); void object_split(struct object *dest, struct object *src, int amt); s16b floor_carry(struct cave *c, int y, int x, object_type *j_ptr); void drop_near(struct cave *c, object_type *j_ptr, int chance, int y, int x, bool verbose); void push_object(int y, int x); void acquirement(int y1, int x1, int level, int num, bool great); void inven_item_charges(int item); void inven_item_describe(int item); void inven_item_increase(int item, int num); void save_quiver_size(struct player *p); void inven_item_optimize(int item); void floor_item_charges(int item); void floor_item_describe(int item); void floor_item_increase(int item, int num); void floor_item_optimize(int item); bool inven_carry_okay(const object_type *o_ptr); bool inven_stack_okay(const object_type *o_ptr); s16b inven_takeoff(int item, int amt); void inven_drop(int item, int amt); void combine_pack(void); void reorder_pack(void); void open_quiver_slot(int slot); void sort_quiver(void); int get_use_device_chance(const object_type *o_ptr); void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt); void reduce_charges(object_type *o_ptr, int amt); int number_charging(const object_type *o_ptr); bool recharge_timeout(object_type *o_ptr); unsigned check_for_inscrip(const object_type *o_ptr, const char *inscrip); object_kind *lookup_kind(int tval, int sval); int lookup_name(int tval, const char *name); int lookup_artifact_name(const char *name); int lookup_sval(int tval, const char *name); int tval_find_idx(const char *name); const char *tval_find_name(int tval); bool obj_is_staff(const object_type *o_ptr); bool obj_is_wand(const object_type *o_ptr); bool obj_is_rod(const object_type *o_ptr); bool obj_is_potion(const object_type *o_ptr); bool obj_is_scroll(const object_type *o_ptr); bool obj_is_food(const object_type *o_ptr); bool obj_is_light(const object_type *o_ptr); bool obj_is_ring(const object_type *o_ptr); bool obj_is_ammo(const object_type *o_ptr); bool obj_has_charges(const object_type *o_ptr); bool obj_can_zap(const object_type *o_ptr); bool obj_is_activatable(const object_type *o_ptr); bool obj_can_activate(const object_type *o_ptr); bool obj_can_refill(const object_type *o_ptr); bool obj_can_browse(const object_type *o_ptr); bool obj_can_cast_from(const object_type *o_ptr); bool obj_can_study(const object_type *o_ptr); bool obj_can_takeoff(const object_type *o_ptr); bool obj_can_wear(const object_type *o_ptr); bool obj_can_fire(const object_type *o_ptr); bool obj_has_inscrip(const object_type *o_ptr); bool obj_is_useable(const object_type *o_ptr); bool obj_is_used_aimed(const object_type *o_ptr); bool obj_is_used_unaimed(const object_type *o_ptr); u16b object_effect(const object_type *o_ptr); object_type *object_from_item_idx(int item); int inventory_index_matching_object(const object_type *o_ptr); bool obj_needs_aim(object_type *o_ptr); bool obj_can_fail(const struct object *o); bool get_item_okay(int item); int scan_items(int *item_list, size_t item_list_max, int mode); bool item_is_available(int item, bool (*tester)(const object_type *), int mode); extern void display_itemlist(void); extern void display_object_idx_recall(s16b o_idx); extern void display_object_kind_recall(struct object_kind *kind); void display_object_recall_interactive(object_type *o_ptr); bool is_unknown(const object_type *o_ptr); int compare_items(const object_type *o1, const object_type *o2); bool pack_is_full(void); bool pack_is_overfull(void); void pack_overflow(void); extern struct object *object_byid(s16b oidx); extern void objects_init(void); extern void objects_destroy(void); /* obj-power.c and randart.c */ s32b object_power(const object_type *o_ptr, int verbose, ang_file *log_file, bool known); char *artifact_gen_name(struct artifact *a, const char ***wordlist); #endif /* !INCLUDED_OBJECT_H */ angband-3.5.1/src/object/obj-list.c0000644000175000017500000004714112456456606016373 0ustar chriscchrisc/* * File: obj-list.c * Purpose: Object list UI. * * Copyright (c) 1997-2007 Ben Harrison, James E. Wilson, Robert A. Koeneke * Copyright (c) 2013 Ben Semmler * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "object.h" #include "tvalsval.h" #include "squelch.h" #include "obj-list.h" typedef struct object_list_entry_s { object_type *object; u16b count; s16b dx, dy; } object_list_entry_t; typedef struct object_list_s { object_list_entry_t *entries; size_t entries_size; s32b creation_turn; u16b total_entries; u16b total_objects; bool sorted; } object_list_t; /** * Allocate a new object list. */ static object_list_t *object_list_new(void) { object_list_t *list = ZNEW(object_list_t); size_t size = MAX_ITEMLIST; if (list == NULL) return NULL; list->entries = C_ZNEW(size, object_list_entry_t); if (list->entries == NULL) { FREE(list); return NULL; } list->entries_size = size; return list; } /** * Free an object list. */ static void object_list_free(object_list_t *list) { if (list == NULL) return; if (list->entries != NULL) { FREE(list->entries); list->entries = NULL; } FREE(list); list = NULL; } /** * Share object list instance. */ static object_list_t *object_list_subwindow = NULL; /** * Initialize the object list module. */ void object_list_init(void) { object_list_subwindow = NULL; } /** * Tear down the object list module. */ void object_list_finalize(void) { object_list_free(object_list_subwindow); } /** * Return a common object list instance. */ static object_list_t *object_list_shared_instance(void) { if (object_list_subwindow == NULL) { object_list_subwindow = object_list_new(); } return object_list_subwindow; } /** * Return TRUE if the list needs to be updated. Usually this is each turn. */ static bool object_list_needs_update(const object_list_t *list) { if (list == NULL || list->entries == NULL) return FALSE; /* For now, always update when requested. */ return TRUE; } /** * Zero out the contents of an object list. */ static void object_list_reset(object_list_t *list) { if (list == NULL || list->entries == NULL) return; if (!object_list_needs_update(list)) return; C_WIPE(list->entries, list->entries_size, object_list_entry_t); list->total_entries = 0; list->total_objects = 0; list->creation_turn = 0; list->sorted = FALSE; } /** * Return TRUE if the object should be omitted from the object list. */ static bool object_list_should_ignore_object(const object_type *object) { if (object->kind == NULL) return TRUE; if (!object->marked) return TRUE; if (!is_unknown(object) && squelch_item_ok(object)) return TRUE; if (object->tval == TV_GOLD) return TRUE; return FALSE; } /** * Collect object information from the current cave. */ static void object_list_collect(object_list_t *list) { int item; int i; if (list == NULL || list->entries == NULL) return; if (!object_list_needs_update(list)) return; /* Scan each object in the dungeon. */ for (item = 0; item < z_info->o_max; item++) { object_type *object = object_byid(item); object_list_entry_t *entry = NULL; int entry_index; int current_distance; int entry_distance; if (object_list_should_ignore_object(object)) continue; /* Find or add a list entry. */ for (entry_index = 0; entry_index < (int)list->entries_size; entry_index++) { if (list->entries[entry_index].object == NULL) { /* We found an empty slot, so add this object here. */ list->entries[entry_index].object = object; list->entries[entry_index].count = 0; list->entries[entry_index].dy = object->iy - p_ptr->py; list->entries[entry_index].dx = object->ix - p_ptr->px; entry = &list->entries[entry_index]; break; } else if (!is_unknown(object) && object_similar(object, list->entries[entry_index].object, OSTACK_LIST)) { /* We found a matching object and we'll use that. */ entry = &list->entries[entry_index]; break; } } if (entry == NULL) return; /* We only know the number of objects if we've actually seen them. */ if (object->marked == MARK_SEEN) entry->count += object->number; else entry->count = 1; /* Store the distance to the object in the stack that is closest to the player. */ current_distance = (object->iy - p_ptr->py) * (object->iy - p_ptr->py) + (object->ix - p_ptr->px) * (object->ix - p_ptr->px); entry_distance = entry->dy * entry->dy + entry->dx * entry->dx; if (current_distance < entry_distance) { entry->dy = object->iy - p_ptr->py; entry->dx = object->ix - p_ptr->px; } } /* Collect totals for easier calculations of the list. */ for (i = 0; i < (int)list->entries_size; i++) { if (list->entries[i].object == NULL) continue; if (list->entries[i].count > 0) list->total_entries++; list->total_objects += list->entries[i].count; } list->creation_turn = turn; list->sorted = FALSE; } /** * Object distance comparator: nearest to farthest. */ static int object_list_distance_compare(const void *a, const void *b) { const object_list_entry_t *ae = (object_list_entry_t *)a; const object_list_entry_t *be = (object_list_entry_t *)b; int a_distance = ae->dy * ae->dy + ae->dx * ae->dx; int b_distance = be->dy * be->dy + be->dx * be->dx; if (a_distance < b_distance) return -1; else if (a_distance > b_distance) return 1; return 0; } /** * Standard comparison function for the object list. Uses compare_items(). */ static int object_list_standard_compare(const void *a, const void *b) { int result; const object_type *ao = ((object_list_entry_t *)a)->object; const object_type *bo = ((object_list_entry_t *)b)->object; /* If this happens, something might be wrong in the collect function. */ if (ao == NULL || bo == NULL) return 1; result = compare_items(ao, bo); /* If the objects are equivalent, sort nearest to farthest. */ if (result == 0) result = object_list_distance_compare(a, b); return result; } /** * Sort the object list with the given sort function. */ static void object_list_sort(object_list_t *list, int (*compare)(const void *, const void *)) { size_t elements; if (list == NULL || list->entries == NULL) return; if (list->sorted) return; elements = list->total_entries; if (elements <= 1) return; sort(list->entries, elements, sizeof(list->entries[0]), compare); list->sorted = TRUE; } /** * Return an attribute to display a particular list entry with. * * \param entry is the object list entry to display. * \return a term attribute for the object entry. */ static byte object_list_entry_line_attribute(const object_list_entry_t *entry) { byte attr; if (entry == NULL || entry->object == NULL || entry->object->kind == NULL) return TERM_WHITE; if (is_unknown(entry->object)) /* unknown object */ attr = TERM_RED; else if (entry->object->artifact && object_is_known(entry->object)) /* known artifact */ attr = TERM_VIOLET; else if (!object_flavor_is_aware(entry->object)) /* unaware of kind */ attr = TERM_L_RED; else if (entry->object->kind->cost == 0) /* worthless */ attr = TERM_SLATE; else /* default */ attr = TERM_WHITE; return attr; } /** * Format the object name so that the prefix is right aligned to a common column. * * This uses the default logic of object_desc() in order to handle flavors, artifacts, * vowels and so on. It was easier to do this and then use strtok() to break it up than * to do anything else. * * \param entry is the object list entry that has a name to be formatted. * \param line_buffer is the buffer to format into. * \param size is the size of line_buffer. */ static void object_list_format_name(const object_list_entry_t *entry, char *line_buffer, size_t size) { char name[80]; const char *chunk; char *source; bool has_singular_prefix; byte old_number; if (entry == NULL || entry->object == NULL || entry->object->kind == NULL) return; /* Hack - these don't have a prefix when there is only one, so just pad with a space. */ switch (entry->object->kind->tval) { case TV_SOFT_ARMOR: has_singular_prefix = (entry->object->kind->sval == SV_ROBE); break; case TV_HARD_ARMOR: case TV_DRAG_ARMOR: if ((object_name_is_visible(entry->object) || object_is_known(entry->object)) && entry->object->artifact) has_singular_prefix = TRUE; else has_singular_prefix = FALSE; break; default: has_singular_prefix = TRUE; break; } if (entry->object->marked == MARK_AWARE) has_singular_prefix = TRUE; /* * Because each entry points to a specific object and not something more general, the * number of similar objects we counted has to be swapped in. This isn't an ideal way * to do this, but it's the easiest way until object_desc is more flexible. */ old_number = entry->object->number; entry->object->number = entry->count; object_desc(name, sizeof(name), entry->object, ODESC_PREFIX | ODESC_FULL); entry->object->number = old_number; /* The source string for strtok() needs to be set properly, depending on when we use it. */ if (!has_singular_prefix && entry->count == 1) { chunk = " "; source = name; } else { chunk = strtok(name, " "); source = NULL; } /* Right alight the prefix and clip. */ strnfmt(line_buffer, size, "%3.3s ", chunk); /* Get the rest of the name and clip it to fit the max width. */ chunk = strtok(source, "\0"); my_strcat(line_buffer, chunk, size); } /** * Format a section of the object list: a header followed by object list entry rows. * * This function will process each entry for the given section. It will display: * - object char; * - number of objects; * - object name (truncated, if needed to fit the line); * - object distance from the player (aligned to the right side of the list). * By passing in a NULL textblock, the maximum line width of the section can be found. * * \param list is the object list to format. * \param tb is the textblock to produce or NULL if only the dimensions need to be calculated. * \param lines_to_display are the number of entries to display (not including the header). * \param max_width is the maximum line width. * \param prefix is the beginning of the header; the remainder is appended with the number of objects. * \param max_width_result is returned with the width needed to format the list without truncation. */ static void object_list_format_section(const object_list_t *list, textblock *tb, int lines_to_display, int max_width, const char *prefix, size_t *max_width_result) { int remaining_object_total = 0; int line_count = 0; int entry_index; int total; char line_buffer[200]; const char *punctuation = (lines_to_display == 0) ? "." : ":"; size_t max_line_length = 0; if (list == NULL || list->entries == NULL) return; total = list->total_entries; if (list->total_entries == 0) { max_line_length = strnfmt(line_buffer, sizeof(line_buffer), "%s no objects.\n", prefix); if (tb != NULL) textblock_append(tb, "%s", line_buffer); /* Force a minimum width so that the prompt doesn't get cut off. */ if (max_width_result != NULL) *max_width_result = MAX(max_line_length, 40); return; } max_line_length = strnfmt(line_buffer, sizeof(line_buffer), "%s %d object%s%s\n", prefix, list->total_entries, PLURAL(list->total_entries), punctuation); if (tb != NULL) textblock_append(tb, "%s", line_buffer); for (entry_index = 0; entry_index < total && line_count < lines_to_display; entry_index++) { char location[20] = { '\0' }; byte line_attr; size_t full_width; const char *direction_y = (list->entries[entry_index].dy <= 0) ? "N" : "S"; const char *direction_x = (list->entries[entry_index].dx <= 0) ? "W" : "E"; line_buffer[0] = '\0'; if (list->entries[entry_index].count == 0) continue; /* Build the location string. */ strnfmt(location, sizeof(location), " %d %s %d %s", abs(list->entries[entry_index].dy), direction_y, abs(list->entries[entry_index].dx), direction_x); /* Get width available for object name: 2 for char and space; location includes padding; last -1 for some reason? */ full_width = max_width - 2 - utf8_strlen(location) - 1; /* Add the object count and clip the object name to fit. */ object_list_format_name(&list->entries[entry_index], line_buffer, sizeof(line_buffer)); utf8_clipto(line_buffer, full_width); /* Calculate the width of the line for dynamic sizing; use a fixed max width for location and object char. */ max_line_length = MAX(max_line_length, utf8_strlen(line_buffer) + 12 + 2); /* textblock_append_pict will safely add the object symbol, regardless of ASCII/graphics mode. */ if (tb != NULL && tile_width == 1 && tile_height == 1) { byte a = TERM_RED; wchar_t c = L'*'; if (!is_unknown(list->entries[entry_index].object) && list->entries[entry_index].object->kind != NULL) { a = object_kind_attr(list->entries[entry_index].object->kind); c = object_kind_char(list->entries[entry_index].object->kind); } textblock_append_pict(tb, a, c); textblock_append(tb, " "); } /* Add the left-aligned and padded object name which will align the location to the right. */ if (tb != NULL) { /* * Hack - Because object name strings are UTF8, we have to add additional padding for * any raw bytes that might be consolidated into one displayed character. */ full_width += strlen(line_buffer) - utf8_strlen(line_buffer); line_attr = object_list_entry_line_attribute(&list->entries[entry_index]); textblock_append_c(tb, line_attr, "%-*s%s\n", full_width, line_buffer, location); } line_count++; } /* Don't worry about the "...others" line, since it's probably shorter than what's already printed. */ if (max_width_result != NULL) *max_width_result = max_line_length; /* Bail since we don't have enough room to display the remaining count or since we've displayed them all. */ if (lines_to_display <= 0 || lines_to_display >= list->total_entries) return; /* Count the remaining objects, starting where we left off in the above loop. */ remaining_object_total = total - entry_index; if (tb != NULL) textblock_append(tb, "%6s...and %d others.\n", " ", remaining_object_total); } /** * Allow the standard list formatted to be bypassed for special cases. * * Returning TRUE will bypass any other formatteding in object_list_format_textblock(). * * \param list is the object list to format. * \param tb is the textblock to produce or NULL if only the dimensions need to be calculated. * \param max_lines is the maximum number of lines that can be displayed. * \param max_width is the maximum line width that can be displayed. * \param max_height_result is returned with the number of lines needed to format the list without truncation. * \param max_width_result is returned with the width needed to format the list without truncation. * \return TRUE if further formatting should be bypassed. */ static bool object_list_format_special(const object_list_t *list, textblock *tb, int max_lines, int max_width, size_t *max_height_result, size_t *max_width_result) { return FALSE; } /** * Format the entire object list with the given parameters. * * This function can be used to calculate the preferred dimensions for the list by passing in a * NULL textblock. This function calls object_list_format_special() first; if that function * returns TRUE, it will bypass normal list formatting. * * \param list is the object list to format. * \param tb is the textblock to produce or NULL if only the dimensions need to be calculated. * \param max_lines is the maximum number of lines that can be displayed. * \param max_width is the maximum line width that can be displayed. * \param max_height_result is returned with the number of lines needed to format the list without truncation. * \param max_width_result is returned with the width needed to format the list without truncation. */ static void object_list_format_textblock(const object_list_t *list, textblock *tb, int max_lines, int max_width, size_t *max_height_result, size_t *max_width_result) { int header_lines = 1; int lines_remaining; int lines_to_display; size_t max_line_width = 0; if (list == NULL || list->entries == NULL) return; if (object_list_format_special(list, tb, max_lines, max_width, max_height_result, max_width_result)) return; lines_to_display = list->total_entries; if (max_height_result != NULL) *max_height_result = header_lines + lines_to_display; lines_remaining = max_lines - header_lines; if (lines_remaining < list->total_entries) lines_to_display = MAX(lines_remaining - 1, 0); if (header_lines >= max_lines) lines_to_display = 0; object_list_format_section(list, tb, lines_to_display, max_width, "You can see", &max_line_width); if (max_width_result != NULL) *max_width_result = max_line_width; } /** * Display the object list statically. This will force the list to be displayed to * the provided dimensions. Contents will be adjusted accordingly. * * In order to be more efficient, this function uses a shared list object so that * it's not constantly allocating and freeing the list. * * \param height is the height of the list. * \param width is the width of the list. */ void object_list_show_subwindow(int height, int width) { textblock *tb; object_list_t *list; if (height < 1 || width < 1) return; tb = textblock_new(); list = object_list_shared_instance(); object_list_reset(list); object_list_collect(list); object_list_sort(list, object_list_standard_compare); /* Draw the list to exactly fit the subwindow. */ object_list_format_textblock(list, tb, height, width, NULL, NULL); textui_textblock_place(tb, SCREEN_REGION, NULL); textblock_free(tb); } /** * Display the object list interactively. This will dynamically size the list for * the best appearance. This should only be used in the main term. * * \param height is the height limit for the list. * \param width is the width limit for the list. */ void object_list_show_interactive(int height, int width) { textblock *tb; object_list_t *list; size_t max_width = 0, max_height = 0; int safe_height, safe_width; region r; if (height < 1 || width < 1) return; tb = textblock_new(); list = object_list_new(); object_list_collect(list); object_list_sort(list, object_list_standard_compare); /* * Figure out optimal display rect. Large numbers are passed as the height and * width limit so that we can calculate the maximum number of rows and columns * to display the list nicely. We then adjust those values as needed to fit in * the main term. Height is adjusted to account for the texblock prompt. The * list is positioned on the right side of the term underneath the status line. */ object_list_format_textblock(list, NULL, 1000, 1000, &max_height, &max_width); safe_height = MIN(height - 2, (int)max_height + 2); safe_width = MIN(width - 13, (int)max_width); r.col = -safe_width; r.row = 1; r.width = safe_width; r.page_rows = safe_height; /* * Actually draw the list. We pass in max_height to the format function so that * all lines will be appended to the textblock. The textblock itself will handle * fitting it into the region. However, we have to pass safe_width so that the * format function will pad the lines properly so that the location string is * aligned to the right edge of the list. */ object_list_format_textblock(list, tb, (int)max_height, safe_width, NULL, NULL); region_erase_bordered(&r); textui_textblock_show(tb, r, NULL); textblock_free(tb); object_list_free(list); } angband-3.5.1/src/object/tvalsval.h0000644000175000017500000002035512456456606016507 0ustar chriscchrisc#ifndef INCLUDED_OBJECT_TVALSVAL_H #define INCLUDED_OBJECT_TVALSVAL_H /*** Object "tval" and "sval" codes ***/ /* * PS: to regenerate the inside of an sval enum, do this: * $ grep --context 2 I: object.txt | grep ^[NI] | * perl -pe 'y/[a-z]\- /[A-Z]__/' | perl -pe 's/(&_|~|')//g' | cut -d: -f3 | * perl -00 -pe 's/([^\n]*)\n([^\n]*)\n/\tSV_\1\ =\ \2,\n/g' */ /* * The values for the "tval" field of various objects. * * This value is the primary means by which items are sorted in the * player inventory, followed by "sval" and "cost". * * Note that a "BOW" with tval = 19 and sval S = 10*N+P takes a missile * weapon with tval = 16+N, and does (xP) damage when so combined. This * fact is not actually used in the source, but it kind of interesting. * * Note that as of 2.7.8, the "item flags" apply to all items, though * only armor and weapons and a few other items use any of these flags. */ #define TV_NULL 0 #define TV_CHEST 7 /* Chests ('~') */ #define TV_SHOT 16 /* Ammo for slings */ #define TV_ARROW 17 /* Ammo for bows */ #define TV_BOLT 18 /* Ammo for x-bows */ #define TV_BOW 19 /* Slings/Bows/Xbows */ #define TV_DIGGING 20 /* Shovels/Picks */ #define TV_HAFTED 21 /* Priest Weapons */ #define TV_POLEARM 22 /* Axes and Pikes */ #define TV_SWORD 23 /* Edged Weapons */ #define TV_BOOTS 30 /* Boots */ #define TV_GLOVES 31 /* Gloves */ #define TV_HELM 32 /* Helms */ #define TV_CROWN 33 /* Crowns */ #define TV_SHIELD 34 /* Shields */ #define TV_CLOAK 35 /* Cloaks */ #define TV_SOFT_ARMOR 36 /* Soft Armor */ #define TV_HARD_ARMOR 37 /* Hard Armor */ #define TV_DRAG_ARMOR 38 /* Dragon Scale Mail */ #define TV_LIGHT 39 /* Lights (including Specials) */ #define TV_AMULET 40 /* Amulets (including Specials) */ #define TV_RING 45 /* Rings (including Specials) */ #define TV_STAFF 55 #define TV_WAND 65 #define TV_ROD 66 #define TV_SCROLL 70 #define TV_POTION 75 #define TV_FLASK 77 #define TV_FOOD 80 #define TV_MAGIC_BOOK 90 #define TV_PRAYER_BOOK 91 #define TV_GOLD 100 /* Gold can only be picked up by players */ #define TV_MAX 101 /* The "sval" codes for TV_SHOT/TV_ARROW/TV_BOLT */ #define SV_AMMO_LIGHT 0 /* pebbles */ #define SV_AMMO_NORMAL 1 /* shots, arrows, bolts */ #define SV_AMMO_HEAVY 2 /* seeker arrows and bolts */ #define SV_AMMO_SILVER 3 /* silver arrows and bolts */ /* The "sval" codes for TV_BOW (note information in "sval") */ #define SV_SLING 2 /* (x2) */ #define SV_SHORT_BOW 12 /* (x2) */ #define SV_LONG_BOW 13 /* (x3) */ #define SV_LIGHT_XBOW 23 /* (x3) */ #define SV_HEAVY_XBOW 24 /* (x4) */ /* The sval codes for TV_LIGHT */ #define SV_LIGHT_TORCH 0 #define SV_LIGHT_LANTERN 1 #define SV_LIGHT_GALADRIEL 4 #define SV_LIGHT_ELENDIL 5 #define SV_LIGHT_THRAIN 6 #define SV_LIGHT_PALANTIR 7 /* Hacky defines */ #define SV_SCROLL_PHASE_DOOR 1 #define SV_SCROLL_WORD_OF_RECALL 29 #define SV_SCROLL_RUNE_OF_PROTECTION 38 enum sval_digging /* tval 20 */ { SV_SHOVEL = 1, SV_PICK = 2, SV_MATTOCK = 3 }; enum sval_hafted /* tval 21 */ { SV_WHIP = 1, SV_BALL_AND_CHAIN = 2, SV_MORNING_STAR = 3, SV_FLAIL = 4, SV_TWO_HANDED_GREAT_FLAIL = 5, SV_MACE = 10, SV_LEAD_FILLED_MACE = 11, SV_QUARTERSTAFF = 12, SV_WAR_HAMMER = 13, SV_MAUL = 14, SV_GREAT_HAMMER = 15, SV_MACE_OF_DISRUPTION = 20, SV_GROND = 50 }; enum sval_polearm /* tval 22 */ { SV_SPEAR = 1, SV_AWL_PIKE = 2, SV_TRIDENT = 3, SV_HALBERD = 4, SV_PIKE = 5, SV_BEAKED_AXE = 10, SV_BROAD_AXE = 11, SV_BATTLE_AXE = 12, SV_LOCHABER_AXE = 13, SV_GREAT_AXE = 14, SV_SCYTHE = 20, SV_GLAIVE = 21, SV_LANCE = 22, SV_SCYTHE_OF_SLICING = 23, SV_LUCERNE_HAMMER = 24 }; enum sval_sword /* tval 23 */ { SV_DAGGER = 1, SV_MAIN_GAUCHE = 2, SV_RAPIER = 3, SV_SHORT_SWORD = 4, SV_CUTLASS = 5, SV_TULWAR = 6, SV_SCIMITAR = 7, SV_LONG_SWORD = 8, SV_BROAD_SWORD = 9, SV_BASTARD_SWORD = 10, SV_KATANA = 11, SV_ZWEIHANDER = 12, SV_EXECUTIONERS_SWORD = 13, SV_BLADE_OF_CHAOS = 14 }; enum sval_boots /* tval 30 */ { SV_PAIR_OF_LEATHER_SANDALS = 1, SV_PAIR_OF_LEATHER_BOOTS = 2, SV_PAIR_OF_IRON_SHOD_BOOTS = 3, SV_PAIR_OF_STEEL_SHOD_BOOTS = 4, SV_PAIR_OF_MITHRIL_SHOD_BOOTS = 5, SV_PAIR_OF_ETHEREAL_SLIPPERS = 6 }; enum sval_gloves /* tval 31 */ { SV_SET_OF_LEATHER_GLOVES = 1, SV_SET_OF_GAUNTLETS = 2, SV_SET_OF_MITHRIL_GAUNTLETS = 3, SV_SET_OF_CAESTUS = 4, SV_SET_OF_ALCHEMISTS_GLOVES = 5 }; enum sval_helm /* tval 32 */ { SV_HARD_LEATHER_CAP = 2, SV_METAL_CAP = 3, SV_IRON_HELM = 5, SV_STEEL_HELM = 6 }; enum sval_crown /* tval 33 */ { SV_IRON_CROWN = 10, SV_GOLDEN_CROWN = 11, SV_JEWEL_ENCRUSTED_CROWN = 12, SV_MORGOTH = 50 }; enum sval_shield /* tval 34 */ { /* SV_BUCKLER = 1, */ SV_WICKER_SHIELD = 2, SV_SMALL_METAL_SHIELD = 3, SV_LEATHER_SHIELD = 4, SV_LARGE_METAL_SHIELD = 5, SV_MITHRIL_SHIELD = 10 }; enum sval_cloak /* tval 35 */ { SV_CLOAK = 1, SV_FUR_CLOAK = 2, SV_ELVEN_CLOAK = 3, SV_ETHEREAL_CLOAK = 4 }; enum sval_soft_armour /* tval 36 */ { SV_ROBE = 2, SV_SOFT_LEATHER_ARMOUR = 4, SV_STUDDED_LEATHER_ARMOUR = 7, SV_HARD_LEATHER_ARMOUR = 6, SV_LEATHER_SCALE_MAIL = 11 }; enum sval_hard_armour /* tval 37 */ { SV_METAL_SCALE_MAIL = 1, SV_CHAIN_MAIL = 2, SV_AUGMENTED_CHAIN_MAIL = 3, SV_BAR_CHAIN_MAIL = 4, SV_METAL_BRIGANDINE_ARMOUR = 5, SV_PARTIAL_PLATE_ARMOUR = 6, SV_METAL_LAMELLAR_ARMOUR = 7, SV_FULL_PLATE_ARMOUR = 8, SV_RIBBED_PLATE_ARMOUR = 9, SV_MITHRIL_CHAIN_MAIL = 10, SV_MITHRIL_PLATE_MAIL = 11, SV_ADAMANTITE_PLATE_MAIL = 12 }; enum sval_dragon_armour /* tval 38 */ { SV_DRAGON_BLACK = 1, SV_DRAGON_BLUE = 2, SV_DRAGON_WHITE = 3, SV_DRAGON_RED = 4, SV_DRAGON_GREEN = 5, SV_DRAGON_MULTIHUED = 6, SV_DRAGON_SHINING = 10, SV_DRAGON_LAW = 12, SV_DRAGON_BRONZE = 14, SV_DRAGON_GOLD = 16, SV_DRAGON_CHAOS = 18, SV_DRAGON_BALANCE = 20, SV_DRAGON_POWER = 30 }; enum sval_amulet /* tval 40 */ { SV_AMULET_WISDOM = 1, SV_AMULET_CHARISMA = 2, SV_AMULET_RESIST_LIGHTNING = 3, SV_AMULET_RESIST_ACID = 4, SV_AMULET_RESISTANCE = 5, SV_AMULET_SUSTENANCE = 6, SV_AMULET_THE_MAGI = 7, SV_AMULET_ESP = 8, SV_AMULET_DEVOTION = 9, SV_AMULET_WEAPONMASTERY = 10, SV_AMULET_TRICKERY = 11, SV_AMULET_REGENERATION = 15, SV_AMULET_INFRAVISION = 16, SV_AMULET_SEARCHING = 17, SV_AMULET_TELEPORTATION = 18, SV_AMULET_SLOW_DIGESTION = 19, SV_AMULET_ADORNMENT = 20, SV_AMULET_INERTIA = 21, SV_AMULET_CARLAMMAS = 50, SV_AMULET_INGWE = 51, SV_AMULET_DWARVES = 52, SV_AMULET_ELESSAR = 53, SV_AMULET_EVENSTAR = 54 }; enum sval_ring /* tval 45 */ { SV_RING_STRENGTH = 1, SV_RING_INTELLIGENCE = 2, SV_RING_DEXTERITY = 3, SV_RING_CONSTITUTION = 4, SV_RING_SPEED = 5, SV_RING_SEARCHING = 6, SV_RING_BODYKEEPING = 9, SV_RING_SOULKEEPING = 10, SV_RING_SUSTAIN_CHARISMA = 11, SV_RING_RESIST_POISON = 12, SV_RING_RESIST_FIRE = 13, SV_RING_RESIST_COLD = 14, SV_RING_LIGHT = 16, SV_RING_DARK = 17, SV_RING_FLAMES = 18, SV_RING_ACID = 19, SV_RING_ICE = 20, SV_RING_LIGHTNING = 21, SV_RING_DAMAGE = 23, SV_RING_ACCURACY = 24, SV_RING_SLAYING = 25, SV_RING_PROTECTION = 26, SV_RING_TELEPORTATION = 27, SV_RING_RECKLESS_ATTACKS = 28, SV_RING_OPEN_WOUNDS = 29, SV_RING_OF_ESCAPING = 30, SV_RING_OF_THE_MOUSE = 31, SV_RING_OF_THE_DOG = 32, SV_RING_SLOW_DIGESTION = 34, SV_RING_FEATHER_FALLING = 35, SV_RING_FREE_ACTION = 36, SV_RING_SEE_INVISIBLE = 37, SV_RING_DELVING = 38, /* Artifact rings */ SV_RING_BARAHIR = 50, SV_RING_TULKAS = 51, SV_RING_NARYA = 52, SV_RING_NENYA = 53, SV_RING_VILYA = 54, SV_RING_POWER = 55 }; enum sval_food /* tval 80 */ { SV_FOOD_RATION = 1, SV_FOOD_SLIME_MOLD = 2, SV_FOOD_WAYBREAD = 3 }; enum sval_gold /* tval 100 */ { SV_GOLD_ANY = -1, SV_COPPER = 0, SV_SILVER = 1, SV_GARNETS = 2, SV_GOLD = 3, SV_OPALS = 4, SV_SAPPHIRES = 5, SV_RUBIES = 6, SV_DIAMONDS = 7, SV_EMERALDS = 8, SV_MITHRIL = 9, SV_ADAMANTITE = 10, SV_GOLD_MAX }; /* * Special "sval" limit -- first "normal" food */ #define SV_FOOD_MIN_SHROOM 6 /* * Special "sval" limit -- first "large" chest */ #define SV_CHEST_MIN_LARGE 4 /* * Special "sval" limit -- first "good" magic/prayer book */ #define SV_BOOK_MIN_GOOD 4 /* * Special "sval" value -- unknown "sval" */ #define SV_UNKNOWN 255 #endif /* INCLUDED_OBJECT_TVALSVAL_H */ angband-3.5.1/src/object/obj-flag.h0000644000175000017500000001155012456456606016331 0ustar chriscchrisc/* * File: src/object/obj-flag.h * Purpose: definitions and functions for object flags * * Copyright (c) 2011 Chris Carr * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef INCLUDED_OBJFLAG_H #define INCLUDED_OBJFLAG_H #include "z-rand.h" #include "z-file.h" #include "z-textblock.h" #include "z-quark.h" #include "z-bitflag.h" #include "game-cmd.h" #include "cave.h" /*** Constants ***/ /* The object flags */ enum { #define OF(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) OF_##a, #include "list-object-flags.h" #undef OF }; /* The object flag types */ enum object_flag_type { OFT_PVAL = 1, /* pval-related but not to a stat */ OFT_STAT, /* affects a stat */ OFT_SUST, /* sustains a stat */ OFT_SLAY, /* a "normal" creature-type slay */ OFT_BRAND, /* a brand against monsters lacking the resist */ OFT_KILL, /* a powerful creature-type slay */ OFT_VULN, /* lowers resistance to an element */ OFT_IMM, /* offers immunity to an element */ OFT_LRES, /* a "base" elemental resistance */ OFT_HRES, /* a "high" elemental resistance */ OFT_IGNORE, /* object ignores an element */ OFT_HATES, /* object can be destroyed by element */ OFT_PROT, /* protection from an effect */ OFT_MISC, /* a good property, suitable for ego items */ OFT_LIGHT, /* applicable only to light sources */ OFT_MELEE, /* applicable only to melee weapons */ OFT_CURSE, /* a "sticky" curse */ OFT_BAD, /* an undesirable flag that isn't a curse */ OFT_INT, /* an internal flag, not shown in the game */ OFT_MAX }; /* How object flags are IDd */ enum object_flag_id { OFID_NONE = 0, /* never shown */ OFID_NORMAL, /* normal ID on use */ OFID_TIMED, /* obvious after time */ OFID_WIELD /* obvious on wield */ }; #define OF_SIZE FLAG_SIZE(OF_MAX) #define OF_BYTES 32 /* savefile bytes, i.e. 256 flags */ #define of_has(f, flag) flag_has_dbg(f, OF_SIZE, flag, #f, #flag) #define of_next(f, flag) flag_next(f, OF_SIZE, flag) #define of_is_empty(f) flag_is_empty(f, OF_SIZE) #define of_is_full(f) flag_is_full(f, OF_SIZE) #define of_is_inter(f1, f2) flag_is_inter(f1, f2, OF_SIZE) #define of_is_subset(f1, f2) flag_is_subset(f1, f2, OF_SIZE) #define of_is_equal(f1, f2) flag_is_equal(f1, f2, OF_SIZE) #define of_on(f, flag) flag_on_dbg(f, OF_SIZE, flag, #f, #flag) #define of_off(f, flag) flag_off(f, OF_SIZE, flag) #define of_wipe(f) flag_wipe(f, OF_SIZE) #define of_setall(f) flag_setall(f, OF_SIZE) #define of_negate(f) flag_negate(f, OF_SIZE) #define of_copy(f1, f2) flag_copy(f1, f2, OF_SIZE) #define of_union(f1, f2) flag_union(f1, f2, OF_SIZE) #define of_comp_union(f1, f2) flag_comp_union(f1, f2, OF_SIZE) #define of_inter(f1, f2) flag_inter(f1, f2, OF_SIZE) #define of_diff(f1, f2) flag_diff(f1, f2, OF_SIZE) /* Hack -- special "xtra" object flag info (type) */ /* Can get rid of these now we have OFT_ flags */ /* No - because "POWER" uses two types of OFTs, so cannot get rid of these * until ego_item.txt has an X: line with a variable number of OFTs - that's * basically waiting for a rewrite of ego generation * -- or we could change OFTs to a bitflag */ #define OBJECT_XTRA_TYPE_NONE 0 #define OBJECT_XTRA_TYPE_SUSTAIN 1 #define OBJECT_XTRA_TYPE_RESIST 2 #define OBJECT_XTRA_TYPE_POWER 3 /*** Structures ***/ /** * The object flag structure */ struct object_flag { u16b index; /* the OF_ index */ bool pval; /* is it granular (TRUE) or binary (FALSE) */ u16b timed; /* the corresponding TMD_ flag */ u16b id; /* how is it identified */ u16b type; /* OFT_ category */ s16b power; /* base power rating */ s16b pval_mult; /* pval weight rating */ s16b weapon; /* power mult for melee weapon */ s16b bow; /* power mult for launcher */ s16b ring; /* etc. ... */ s16b amulet; s16b light; s16b body; s16b cloak; s16b shield; s16b hat; s16b gloves; s16b boots; const char *message; /* id message */ }; /*** Functions ***/ bool cursed_p(const bitflag *f); void create_mask(bitflag *f, bool id, ...); void flag_message(int flag, char *name); s32b flag_power(int flag); void log_flags(bitflag *f, ang_file *log_file); const char *flag_name(int flag); s16b slot_mult(int flag, int slot); bool flag_uses_pval(int flag); int obj_flag_type(int flag); int pval_mult(int flag); bool check_state(struct player *p, int flag, bitflag *f); #endif /* !INCLUDED_OBJFLAG_H */ angband-3.5.1/src/object/pval.c0000644000175000017500000001575212456456606015615 0ustar chriscchrisc/* * File: pval.c * Purpose: Functions for handling object pvals. * * Copyright (c) 2011 Chris Carr * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "object/pval.h" #include "object/tvalsval.h" /** * Return the pval_flags for an item */ void object_pval_flags(const object_type *o_ptr, bitflag flags[MAX_PVALS][OF_SIZE]) { int i; if (!o_ptr->kind) return; for (i = 0; i < MAX_PVALS; i++) { of_wipe(flags[i]); of_copy(flags[i], o_ptr->pval_flags[i]); } } /** * Return the pval which governs a particular flag. * We assume that we are only called if this pval and flag exist. **/ int which_pval(const object_type *o_ptr, const int flag) { int i; bitflag f[MAX_PVALS][OF_SIZE]; object_pval_flags(o_ptr, f); for (i = 0; i < MAX_PVALS; i++) { if (of_has(f[i], flag)) return i; } quit_fmt("Bad call to which_pval: flag is %d, kidx is %d\n", flag, o_ptr->kind->kidx); return 0; /* Needed to avoid Windows compiler warning */ } /** * Obtain the pval_flags for an item which are known to the player */ void object_pval_flags_known(const object_type *o_ptr, bitflag flags[MAX_PVALS][OF_SIZE]) { int i, flag; object_pval_flags(o_ptr, flags); for (i = 0; i < MAX_PVALS; i++) of_inter(flags[i], o_ptr->known_flags); /* Kind and ego pval_flags may have shifted pvals or gone so we iterate */ if (object_flavor_is_aware(o_ptr)) for (i = 0; i < MAX_PVALS; i++) for (flag = of_next(o_ptr->kind->pval_flags[i], FLAG_START); flag != FLAG_END; flag = of_next(o_ptr->kind->pval_flags[i], flag + 1)) if (of_has(o_ptr->flags, flag)) of_on(flags[which_pval(o_ptr, flag)], flag); if (o_ptr->ego && easy_know(o_ptr)) for (i = 0; i < MAX_PVALS; i++) for (flag = of_next(o_ptr->ego->pval_flags[i], FLAG_START); flag != FLAG_END; flag = of_next(o_ptr->ego->pval_flags[i], flag + 1)) if (of_has(o_ptr->flags, flag)) of_on(flags[which_pval(o_ptr, flag)], flag); } /** * \returns whether a specific pval is known to the player */ bool object_this_pval_is_visible(const object_type *o_ptr, int pval) { bitflag f[MAX_PVALS][OF_SIZE], f2[OF_SIZE]; assert(o_ptr->kind); if (o_ptr->ident & IDENT_STORE) return TRUE; /* Aware jewelry with non-variable pval */ if (object_is_jewelry(o_ptr) && object_flavor_is_aware(o_ptr)) { if (!randcalc_varies(o_ptr->kind->pval[pval])) { object_pval_flags_known(o_ptr, f); of_wipe(f2); of_on(f2, OF_LIGHT); if (!of_is_equal(f[pval], f2)) return TRUE; } } if (object_was_worn(o_ptr)) { object_pval_flags_known(o_ptr, f); /* Create the mask for pval-related flags */ create_mask(f2, FALSE, OFT_STAT, OFT_PVAL, OFT_MAX); if (of_is_inter(f[pval], f2)) return TRUE; } return FALSE; } /** * Combine two pvals of the same value on an object. Returns TRUE if changes * were made, i.e. o_ptr->num_pvals has decreased by one. */ static bool object_dedup_pvals(object_type *o_ptr) { int i, j, k; /* Abort if there can be no duplicates */ if (o_ptr->num_pvals < 2) return FALSE; /* Find the first pair of pvals which have the same value */ for (i = 0; i < o_ptr->num_pvals; i++) { for (j = i + 1; j < o_ptr->num_pvals; j++) { if (o_ptr->pval[i] == o_ptr->pval[j]) { /* Nuke the j pval and its flags, combining them with i's */ of_union(o_ptr->pval_flags[i], o_ptr->pval_flags[j]); of_wipe(o_ptr->pval_flags[j]); o_ptr->pval[j] = 0; /* Move any remaining pvals down one to fill the void */ for (k = j + 1; k < o_ptr->num_pvals; k++) { of_copy(o_ptr->pval_flags[k - 1], o_ptr->pval_flags[k]); of_wipe(o_ptr->pval_flags[k]); o_ptr->pval[k - 1] = o_ptr->pval[k]; o_ptr->pval[k] = 0; } /* We now have one fewer pval */ o_ptr->num_pvals--; return TRUE; } } } /* No two pvals are identical */ return FALSE; } /** * Return the pval of an object which is closest to value. Returns -1 if * o_ptr has no pvals. */ static int object_closest_pval(object_type *o_ptr, int value) { int i, best_diff, best_pval = 0; if (!o_ptr->num_pvals) return -1; /* Or should we stop wimping around and just assert(0) ? */ best_diff = value; for (i = 0; i < o_ptr->num_pvals; i++) if (abs(o_ptr->pval[i] - value) < best_diff) { best_diff = abs(o_ptr->pval[i] - value); best_pval = i; } return best_pval; } /** * Add a pval to an object, rearranging flags as necessary. Returns TRUE * if the number of pvals is now different, FALSE if it is the same. * * \param o_ptr is the object we're adjusting * \param pval is the pval we are adding * \param flag is the flag to which we are adding the pval */ bool object_add_pval(object_type *o_ptr, int pval, int flag) { bitflag f[OF_SIZE]; int a = -1, best_pval; /* Sanity check (we may be called with 0 - see ticket #1451) */ if (!pval) return FALSE; create_mask(f, FALSE, OFT_PVAL, OFT_STAT, OFT_MAX); if (of_has(o_ptr->flags, flag)) { /* See if any other flags are associated with this pval */ a = which_pval(o_ptr, flag); of_off(f, flag); of_inter(f, o_ptr->pval_flags[a]); if (of_is_empty(f)) { /* Safe to increment and finish */ o_ptr->pval[a] += pval; if (o_ptr->pval[a] == 0) { /* Remove the flag */ of_off(o_ptr->flags, flag); of_off(o_ptr->pval_flags[a], flag); } return (object_dedup_pvals(o_ptr)); } } /* So it doesn't have the flag, or it does but that pval also has others */ /* Create a new pval if we can */ if (o_ptr->num_pvals < MAX_PVALS) { o_ptr->pval[o_ptr->num_pvals] = pval; if (a != -1) { /* then we need to move the flag to the new pval */ o_ptr->pval[o_ptr->num_pvals] += o_ptr->pval[a]; of_off(o_ptr->pval_flags[a], flag); } else /* We need to add it to object_flags */ of_on(o_ptr->flags, flag); if (!o_ptr->pval[o_ptr->num_pvals]) { /* Then the net result was 0 */ of_off(o_ptr->flags, flag); return FALSE; } else { of_on(o_ptr->pval_flags[o_ptr->num_pvals], flag); o_ptr->num_pvals++; /* We do this last because pvals start from 0 */ /* We invert the logic because we've already added a pval */ return (!object_dedup_pvals(o_ptr)); } } else { /* we use the closest existing pval */ best_pval = object_closest_pval(o_ptr, (pval + (a == -1 ? 0 : o_ptr->pval[a]))); if (best_pval != a) { /* turn on the flag on the new pval */ of_on(o_ptr->pval_flags[best_pval], flag); if (a != -1) /* turn it off on its old pval */ of_off(o_ptr->pval_flags[a], flag); else /* add it to object_flags */ of_on(o_ptr->flags, flag); } return FALSE; /* We haven't changed any pvals, so no need to de-dup */ } } angband-3.5.1/src/object/obj-power.c0000644000175000017500000003462412456456606016556 0ustar chriscchrisc/* * File: obj-power.c * Purpose: calculation of object power * * Copyright (c) 2001 Chris Carr, Chris Robertson * Revised in 2009-11 by Chris Carr, Peter Denison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "object/slays.h" #include "object/tvalsval.h" #include "object/pval.h" #include "init.h" #include "effects.h" #include "monster/mon-power.h" /** * Constants for the power algorithm: * - fudge factor for extra damage from rings etc. (used if extra blows) * - assumed damage for off-weapon brands * - base power for jewelry * - base power for armour items (for halving acid damage) * - power per point of damage * - power per point of +to_hit * - power per point of base AC * - power per point of +to_ac * (these four are all halved in the algorithm) * - assumed max blows * - inhibiting values for +blows/might/shots/immunities (max is one less) */ #define NONWEAP_DAMAGE 15 /* fudge to boost extra blows */ #define WEAP_DAMAGE 12 /* and for off-weapon combat flags */ #define BASE_JEWELRY_POWER 4 #define BASE_ARMOUR_POWER 1 #define DAMAGE_POWER 5 /* i.e. 2.5 */ #define TO_HIT_POWER 3 /* i.e. 1.5 */ #define BASE_AC_POWER 2 /* i.e. 1 */ #define TO_AC_POWER 2 /* i.e. 1 */ #define MAX_BLOWS 5 /** * Define a set of constants for dealing with launchers and ammo: * - the assumed average damage of ammo (for rating launchers) * (the current values assume normal (non-seeker) ammo enchanted to +9) * - the assumed bonus on launchers (for rating ego ammo) * - twice the assumed multiplier (for rating any ammo) * N.B. Ammo tvals are assumed to be consecutive! We access this array using * (o_ptr->tval - TV_SHOT) for ammo, and * (o_ptr->sval / 10) for launchers */ static struct archery { int ammo_tval; int ammo_dam; int launch_dam; int launch_mult; } archery[] = { {TV_SHOT, 10, 9, 4}, {TV_ARROW, 12, 9, 5}, {TV_BOLT, 14, 9, 7} }; /** * Set the weightings of flag types: * - factor for power increment for multiple flags * - additional power bonus for a "full set" of these flags * - number of these flags which constitute a "full set" * - whether value is damage-dependent */ static struct set { int type; int factor; int bonus; int size; bool dam_dep; int count; const char *desc; } sets[] = { { OFT_SUST, 1, 10, 5, FALSE, 0, "sustains" }, { OFT_SLAY, 1, 10, 8, TRUE, 0, "normal slays" }, { OFT_BRAND, 2, 20, 5, TRUE, 0, "brands" }, { OFT_KILL, 3, 20, 3, TRUE, 0, "x5 slays" }, { OFT_IMM, 6, INHIBIT_POWER, 4, FALSE, 0, "immunities" }, { OFT_LRES, 1, 10, 4, FALSE, 0, "low resists" }, { OFT_HRES, 2, 10, 9, FALSE, 0, "high resists" }, { OFT_PROT, 3, 15, 4, FALSE, 0, "protections" }, { OFT_MISC, 1, 25, 8, FALSE, 0, "misc abilities" } }; /** * Boost ratings for combinations of ability bonuses * We go up to +24 here - anything higher is inhibited * N.B. Not all stats count equally towards this total */ static s16b ability_power[25] = {0, 0, 0, 0, 0, 0, 0, 2, 4, 6, 8, 12, 16, 20, 24, 30, 36, 42, 48, 56, 64, 74, 84, 96, 110}; /** * Calculate the rating for a given slay combination */ static s32b slay_power(const object_type *o_ptr, int verbose, ang_file* log_file, bool known) { bitflag s_index[OF_SIZE], f[OF_SIZE], f2[OF_SIZE]; u32b sv = 0; int i, j; int mult; const struct slay *best_s_ptr = NULL; monster_type *m_ptr; monster_type monster_type_body; const char *desc[SL_MAX] = { 0 }, *brand[SL_MAX] = { 0 }; int s_mult[SL_MAX] = { 0 }; if (known) object_flags(o_ptr, f); else object_flags_known(o_ptr, f); /* Combine the slay bytes into an index value, return if there are none */ of_copy(s_index, f); create_mask(f2, FALSE, OFT_SLAY, OFT_KILL, OFT_BRAND, OFT_MAX); if (!of_is_inter(s_index, f2)) return tot_mon_power; else of_inter(s_index, f2); /* Look in the cache to see if we know this one yet */ sv = check_slay_cache(s_index); /* If it's cached (or there are no slays), return the value */ if (sv) { file_putf(log_file, "Slay cache hit\n"); return sv; } /* * Otherwise we need to calculate the expected average multiplier * for this combination (multiplied by the total number of * monsters, which we'll divide out later). */ for (i = 0; i < z_info->r_max; i++) { best_s_ptr = NULL; mult = 1; m_ptr = &monster_type_body; m_ptr->race = &r_info[i]; /* Find the best multiplier against this monster */ improve_attack_modifier((object_type *)o_ptr, m_ptr, &best_s_ptr, FALSE, !known); if (best_s_ptr) mult = best_s_ptr->mult; /* Add the multiple to sv */ sv += mult * m_ptr->race->scaled_power; } /* * To get the expected damage for this weapon, multiply the * average damage from base dice by sv, and divide by the * total number of monsters. */ if (verbose) { /* Write info about the slay combination and multiplier */ file_putf(log_file, "Slay multiplier for: "); j = list_slays(s_index, s_index, desc, brand, s_mult, FALSE); for (i = 0; i < j; i++) { if (brand[i]) { file_putf(log_file, brand[i]); } else { file_putf(log_file, desc[i]); } file_putf(log_file, "x%d ", s_mult[i]); } file_putf(log_file, "\nsv is: %d\n", sv); file_putf(log_file, " and t_m_p is: %d \n", tot_mon_power); file_putf(log_file, "times 1000 is: %d\n", (1000 * sv) / tot_mon_power); } /* Add to the cache */ if (fill_slay_cache(s_index, sv)) file_putf(log_file, "Added to slay cache\n"); return sv; } /* * Calculate the multiplier we'll get with a given bow type. * Note that this relies on the multiplier being the 2nd digit of the bow's * sval. We assume that sval has already been checked for legitimacy before * we get here. */ static int bow_multiplier(int sval) { int mult = 0; mult = sval - 10 * (sval / 10); return mult; } /* * Evaluate the object's overall power level. */ s32b object_power(const object_type* o_ptr, int verbose, ang_file *log_file, bool known) { s32b p = 0, q = 0, slay_pwr = 0, dice_pwr = 0; unsigned int i, j; int extra_stat_bonus = 0, mult = 1, num_slays = 0, k = 1; bitflag flags[OF_SIZE], mask[OF_SIZE]; /* Zero the flag counts */ for (i = 0; i < N_ELEMENTS(sets); i++) sets[i].count = 0; /* Extract the flags */ if (known) { file_putf(log_file, "Object is deemed known\n"); object_flags(o_ptr, flags); } else { file_putf(log_file, "Object may not be fully known\n"); object_flags_known(o_ptr, flags); } /* Log the flags in human-readable form */ if (verbose) log_flags(flags, log_file); /* Get the slay power and number of slay/brand types */ create_mask(mask, FALSE, OFT_SLAY, OFT_KILL, OFT_BRAND, OFT_MAX); num_slays = list_slays(flags, mask, NULL, NULL, NULL, TRUE); if (num_slays) slay_pwr = slay_power(o_ptr, verbose, log_file, known); /* Start with any damage boost from the item itself */ p += (o_ptr->to_d * DAMAGE_POWER / 2); file_putf(log_file, "Adding power from to_dam, total is %d\n", p); /* Add damage from dice for any wieldable weapon or ammo */ if (wield_slot(o_ptr) == INVEN_WIELD || obj_is_ammo(o_ptr)) { dice_pwr = (o_ptr->dd * (o_ptr->ds + 1) * DAMAGE_POWER / 4); file_putf(log_file, "Adding %d power for dam dice\n", dice_pwr); /* Add 2nd lot of damage power for nonweapons */ } else if (wield_slot(o_ptr) != INVEN_BOW) { p += (o_ptr->to_d * DAMAGE_POWER); file_putf(log_file, "Adding power from nonweap to_dam, total is %d\n", p); /* Add power boost for nonweapons with combat flags */ if (num_slays || of_has(flags, OF_BLOWS) || of_has(flags, OF_SHOTS) || of_has(flags, OF_MIGHT)) { dice_pwr = (WEAP_DAMAGE * DAMAGE_POWER); file_putf(log_file, "Adding %d power for nonweap combat flags\n", dice_pwr); } } p += dice_pwr; /* Add ammo damage for launchers, get multiplier and rescale */ if (wield_slot(o_ptr) == INVEN_BOW) { p += (archery[o_ptr->sval / 10].ammo_dam * DAMAGE_POWER / 2); file_putf(log_file, "Adding power from ammo, total is %d\n", p); mult = bow_multiplier(o_ptr->sval); file_putf(log_file, "Base mult for this weapon is %d\n", mult); } /* Add launcher bonus for ego ammo, multiply for launcher and rescale */ if (obj_is_ammo(o_ptr)) { if (o_ptr->ego) p += (archery[o_ptr->tval - TV_SHOT].launch_dam * DAMAGE_POWER / 2); p = p * archery[o_ptr->tval - TV_SHOT].launch_mult / (2 * MAX_BLOWS); file_putf(log_file, "After multiplying ammo and rescaling, power is %d\n", p); } /* Add power for extra blows */ if (of_has(flags, OF_BLOWS)) { j = which_pval(o_ptr, OF_BLOWS); if (known || object_this_pval_is_visible(o_ptr, j)) { if (o_ptr->pval[j] >= INHIBIT_BLOWS) { p += INHIBIT_POWER; file_putf(log_file, "INHIBITING - too many extra blows - quitting\n"); return p; } else { p = p * (MAX_BLOWS + o_ptr->pval[j]) / MAX_BLOWS; /* Add boost for assumed off-weapon damage */ p += (NONWEAP_DAMAGE * o_ptr->pval[j] * DAMAGE_POWER / 2); file_putf(log_file, "Adding power for extra blows, total is %d\n", p); } } } /* Add power for extra shots - note that we cannot handle negative shots */ if (of_has(flags, OF_SHOTS)) { j = which_pval(o_ptr, OF_SHOTS); if (known || object_this_pval_is_visible(o_ptr, j)) { if (o_ptr->pval[j] >= INHIBIT_SHOTS) { p += INHIBIT_POWER; file_putf(log_file, "INHIBITING - too many extra shots - quitting\n"); return p; } else if (o_ptr->pval[j] > 0) { p = (p * (1 + o_ptr->pval[j])); file_putf(log_file, "Extra shots: multiplying power by 1 + %d, total is %d\n", o_ptr->pval[j], p); } } } /* Add power for extra might */ if (of_has(flags, OF_MIGHT)) { j = which_pval(o_ptr, OF_MIGHT); if (known || object_this_pval_is_visible(o_ptr, j)) { if (o_ptr->pval[j] >= INHIBIT_MIGHT) { p += INHIBIT_POWER; /* mult is never used before returning */ /*mult = 1;*/ /* don't overflow */ file_putf(log_file, "INHIBITING - too much extra might - quitting\n"); return p; } else mult += o_ptr->pval[j]; file_putf(log_file, "Mult after extra might is %d\n", mult); } } p *= mult; file_putf(log_file, "After multiplying power for might, total is %d\n", p); /* Apply the correct slay multiplier */ if (slay_pwr) { p += (dice_pwr * (slay_pwr / 100)) / (tot_mon_power / 100); file_putf(log_file, "Adjusted for slay power, total is %d\n", p); } /* Melee weapons assume MAX_BLOWS per turn, so we must divide by MAX_BLOWS * to get equal ratings for launchers. */ if (wield_slot(o_ptr) == INVEN_BOW) { p /= MAX_BLOWS; file_putf(log_file, "Rescaling bow power, total is %d\n", p); } /* Add power for +to_hit */ p += (o_ptr->to_h * TO_HIT_POWER / 2); file_putf(log_file, "Adding power for to hit, total is %d\n", p); /* Add power for base AC and adjust for weight */ if (o_ptr->ac) { p += BASE_ARMOUR_POWER; q += (o_ptr->ac * BASE_AC_POWER / 2); file_putf(log_file, "Adding %d power for base AC value\n", q); /* Add power for AC per unit weight */ if (o_ptr->weight > 0) { i = 750 * (o_ptr->ac + o_ptr->to_a) / o_ptr->weight; /* Avoid overpricing Elven Cloaks */ if (i > 450) i = 450; q *= i; q /= 100; /* Weightless (ethereal) armour items get fixed boost */ } else q *= 5; p += q; file_putf(log_file, "Adding power for AC per unit weight, now %d\n", p); } /* Add power for +to_ac */ p += (o_ptr->to_a * TO_AC_POWER / 2); file_putf(log_file, "Adding power for to_ac of %d, total is %d\n", o_ptr->to_a, p); if (o_ptr->to_a > HIGH_TO_AC) { p += ((o_ptr->to_a - (HIGH_TO_AC - 1)) * TO_AC_POWER); file_putf(log_file, "Adding power for high to_ac value, total is %d\n", p); } if (o_ptr->to_a > VERYHIGH_TO_AC) { p += ((o_ptr->to_a - (VERYHIGH_TO_AC -1)) * TO_AC_POWER * 2); file_putf(log_file, "Adding power for very high to_ac value, total is %d\n", p); } if (o_ptr->to_a >= INHIBIT_AC) { p += INHIBIT_POWER; file_putf(log_file, "INHIBITING: AC bonus too high\n"); } /* Add base power for jewelry */ if (object_is_jewelry(o_ptr)) { p += BASE_JEWELRY_POWER; file_putf(log_file, "Adding power for jewelry, total is %d\n", p); } /* Add power for non-derived flags (derived flags have flag_power 0) */ for (i = of_next(flags, FLAG_START); i != FLAG_END; i = of_next(flags, i + 1)) { if (flag_uses_pval(i)) { j = which_pval(o_ptr, i); if (known || object_this_pval_is_visible(o_ptr, j)) { k = o_ptr->pval[j]; extra_stat_bonus += (k * pval_mult(i)); } } else k = 1; if (flag_power(i)) { p += (k * flag_power(i) * slot_mult(i, wield_slot(o_ptr))); file_putf(log_file, "Adding power for %s, total is %d\n", flag_name(i), p); } /* Track combinations of flag types */ for (j = 0; j < N_ELEMENTS(sets); j++) if (sets[j].type == obj_flag_type(i)) sets[j].count++; } /* Add extra power term if there are a lot of ability bonuses */ if (extra_stat_bonus > 249) { file_putf(log_file, "Inhibiting! (Total ability bonus of %d is too high)\n", extra_stat_bonus); p += INHIBIT_POWER; } else if (extra_stat_bonus > 0) { p += ability_power[extra_stat_bonus / 10]; file_putf(log_file, "Adding power for pval total of %d, total is %d\n", extra_stat_bonus, p); } /* Add extra power for multiple flags of the same type */ for (i = 0; i < N_ELEMENTS(sets); i++) { if (sets[i].count > 1) { q = (sets[i].factor * sets[i].count * sets[i].count); /* Scale damage-dependent set bonuses by damage dice power */ if (sets[i].dam_dep) q = q * dice_pwr / (DAMAGE_POWER * 5); p += q; file_putf(log_file, "Adding power for multiple %s, total is %d\n", sets[i].desc, p); } /* Add bonus if item has a full set of these flags */ if (sets[i].count == sets[i].size) { p += sets[i].bonus; file_putf(log_file, "Adding power for full set of %s, total is %d\n", sets[i].desc, p); } } /* add power for effect */ if (known || object_effect_is_known(o_ptr)) { if (o_ptr->artifact && o_ptr->artifact->effect) { p += effect_power(o_ptr->artifact->effect); file_putf(log_file, "Adding power for artifact activation, total is %d\n", p); } else { p += effect_power(o_ptr->kind->effect); file_putf(log_file, "Adding power for item activation, total is %d\n", p); } } file_putf(log_file, "FINAL POWER IS %d\n", p); return p; } angband-3.5.1/src/object/obj-util.c0000644000175000017500000027162612456456606016404 0ustar chriscchrisc/* * File: object2.c * Purpose: Object list maintenance and other object utilities * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "effects.h" #include "game-cmd.h" #include "generate.h" #include "history.h" #include "monster/mon-make.h" #include "object/inventory.h" #include "object/tvalsval.h" #include "prefs.h" #include "randname.h" #include "spells.h" #include "squelch.h" #include "z-queue.h" #include "grafmode.h" static struct object *o_list; /* * Hold the titles of scrolls, 6 to 14 characters each, plus quotes. */ static char scroll_adj[MAX_TITLES][18]; static void flavor_assign_fixed(void) { int i; struct flavor *f; for (f = flavors; f; f = f->next) { if (f->sval == SV_UNKNOWN) continue; for (i = 0; i < z_info->k_max; i++) { struct object_kind *k = &k_info[i]; if (k->tval == f->tval && k->sval == f->sval) k->flavor = f; } } } static void flavor_assign_random(byte tval) { int i; int flavor_count = 0; int choice; struct flavor *f; /* Count the random flavors for the given tval */ for (f = flavors; f; f = f->next) if (f->tval == tval && f->sval == SV_UNKNOWN) flavor_count++; for (i = 0; i < z_info->k_max; i++) { if (k_info[i].tval != tval || k_info[i].flavor) continue; /* HACK - Ordinary food is "boring" */ if ((tval == TV_FOOD) && (k_info[i].sval < SV_FOOD_MIN_SHROOM)) continue; if (!flavor_count) quit_fmt("Not enough flavors for tval %d.", tval); choice = randint0(flavor_count); for (f = flavors; f; f = f->next) { if (f->tval != tval || f->sval != SV_UNKNOWN) continue; if (choice == 0) { k_info[i].flavor = f; f->sval = k_info[i].sval; if (tval == TV_SCROLL) f->text = scroll_adj[k_info[i].sval]; flavor_count--; break; } choice--; } } } /** * Reset svals on flavors, effectively removing any fixed flavors. * * Mainly useful for randarts so that fixed flavors for standards aren't predictable. The One Ring * is kept as fixed, since it lives through randarts. */ void flavor_reset_fixed(void) { struct flavor *f; for (f = flavors; f; f = f->next) { if (f->tval == TV_RING && f->sval == SV_RING_POWER) continue; f->sval = SV_UNKNOWN; } } /* * Prepare the "variable" part of the "k_info" array. * * The "color"/"metal"/"type" of an item is its "flavor". * For the most part, flavors are assigned randomly each game. * * Initialize descriptions for the "colored" objects, including: * Rings, Amulets, Staffs, Wands, Rods, Food, Potions, Scrolls. * * The first 4 entries for potions are fixed (Water, Apple Juice, * Slime Mold Juice, Unused Potion). * * Scroll titles are always between 6 and 14 letters long. This is * ensured because every title is composed of whole words, where every * word is from 2 to 8 letters long, and that no scroll is finished * until it attempts to grow beyond 15 letters. The first time this * can happen is when the current title has 6 letters and the new word * has 8 letters, which would result in a 6 letter scroll title. * * Hack -- make sure everything stays the same for each saved game * This is accomplished by the use of a saved "random seed", as in * "town_gen()". Since no other functions are called while the special * seed is in effect, so this function is pretty "safe". */ void flavor_init(void) { int i, j; /* Hack -- Use the "simple" RNG */ Rand_quick = TRUE; /* Hack -- Induce consistant flavors */ Rand_value = seed_flavor; if (OPT(birth_randarts)) flavor_reset_fixed(); flavor_assign_fixed(); flavor_assign_random(TV_RING); flavor_assign_random(TV_AMULET); flavor_assign_random(TV_STAFF); flavor_assign_random(TV_WAND); flavor_assign_random(TV_ROD); flavor_assign_random(TV_FOOD); flavor_assign_random(TV_POTION); /* Scrolls (random titles, always white) */ for (i = 0; i < MAX_TITLES; i++) { char buf[26]; char *end = buf + 1; int titlelen = 0; int wordlen; bool okay = TRUE; strcpy(buf, "\""); wordlen = randname_make(RANDNAME_SCROLL, 2, 8, end, 24, name_sections); while (titlelen + wordlen < (int)(sizeof(scroll_adj[0]) - 3)) { end[wordlen] = ' '; titlelen += wordlen + 1; end += wordlen + 1; wordlen = randname_make(RANDNAME_SCROLL, 2, 8, end, 24 - titlelen, name_sections); } buf[titlelen] = '"'; buf[titlelen+1] = '\0'; /* Check the scroll name hasn't already been generated */ for (j = 0; j < i; j++) { if (streq(buf, scroll_adj[j])) { okay = FALSE; break; } } if (okay) { my_strcpy(scroll_adj[i], buf, sizeof(scroll_adj[0])); } else { /* Have another go at making a name */ i--; } } flavor_assign_random(TV_SCROLL); /* Hack -- Use the "complex" RNG */ Rand_quick = FALSE; /* Analyze every object */ for (i = 1; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; /* Skip "empty" objects */ if (!k_ptr->name) continue; /* No flavor yields aware */ if (!k_ptr->flavor) k_ptr->aware = TRUE; } } /* * Reset the "visual" lists * * This involves resetting various things to their "default" state. * * If the "prefs" flag is TRUE, then we will also load the appropriate * "user pref file" based on the current setting of the "use_graphics" * flag. This is useful for switching "graphics" on/off. */ /* XXX this does not belong here */ void reset_visuals(bool load_prefs) { int i; struct flavor *f; /* Extract default attr/char code for features */ for (i = 0; i < z_info->f_max; i++) { int j; feature_type *f_ptr = &f_info[i]; /* Assume we will use the underlying values */ for (j = 0; j < FEAT_LIGHTING_MAX; j++) { f_ptr->x_attr[j] = f_ptr->d_attr; f_ptr->x_char[j] = f_ptr->d_char; } } /* Extract default attr/char code for objects */ for (i = 0; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; /* Default attr/char */ k_ptr->x_attr = k_ptr->d_attr; k_ptr->x_char = k_ptr->d_char; } /* Extract default attr/char code for monsters */ for (i = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; /* Default attr/char */ r_ptr->x_attr = r_ptr->d_attr; r_ptr->x_char = r_ptr->d_char; } /* Extract default attr/char code for flavors */ for (f = flavors; f; f = f->next) { f->x_attr = f->d_attr; f->x_char = f->d_char; } /* Extract attr/chars for inventory objects (by tval) */ for (i = 0; i < (int)N_ELEMENTS(tval_to_attr); i++) { /* Default to white */ tval_to_attr[i] = TERM_WHITE; } if (!load_prefs) return; /* Graphic symbols */ if (use_graphics) { /* if we have a graphics mode, see if the mode has a pref file name */ graphics_mode *mode = get_graphics_mode(use_graphics); if (mode && strstr(mode->pref,".prf")) { (void)process_pref_file(mode->pref, FALSE, FALSE); } else { (void)process_pref_file("graf.prf", FALSE, FALSE); } /* process_pref_file("graf.prf", FALSE, FALSE); */ /* Normal symbols */ } else { process_pref_file("font.prf", FALSE, FALSE); } } /* * Obtain the flags for an item */ void object_flags(const object_type *o_ptr, bitflag flags[OF_SIZE]) { of_wipe(flags); if (!o_ptr->kind) return; of_copy(flags, o_ptr->flags); } /* * Obtain the flags for an item which are known to the player */ void object_flags_known(const object_type *o_ptr, bitflag flags[OF_SIZE]) { object_flags(o_ptr, flags); of_inter(flags, o_ptr->known_flags); if (object_flavor_is_aware(o_ptr)) of_union(flags, o_ptr->kind->flags); if (o_ptr->ego && easy_know(o_ptr)) of_union(flags, o_ptr->ego->flags); } /* * Convert an inventory index into a one character label. * * Note that the label does NOT distinguish inven/equip. */ char index_to_label(int i) { /* Indexes for "inven" are easy */ if (i < INVEN_WIELD) return (I2A(i)); /* Indexes for "equip" are offset */ return (I2A(i - INVEN_WIELD)); } /* * Convert a label into the index of an item in the "inven". * * Return "-1" if the label does not indicate a real item. */ s16b label_to_inven(int c) { int i; /* Convert */ i = (islower((unsigned char)c) ? A2I(c) : -1); /* Verify the index */ if ((i < 0) || (i > INVEN_PACK)) return (-1); /* Empty slots can never be chosen */ if (!p_ptr->inventory[i].kind) return (-1); /* Return the index */ return (i); } /* * Convert a label into the index of a item in the "equip". * * Return "-1" if the label does not indicate a real item. */ s16b label_to_equip(int c) { int i; /* Convert */ i = (islower((unsigned char)c) ? A2I(c) : -1) + INVEN_WIELD; /* Verify the index */ if ((i < INVEN_WIELD) || (i >= ALL_INVEN_TOTAL)) return (-1); if (i == INVEN_TOTAL) return (-1); /* Empty slots can never be chosen */ if (!p_ptr->inventory[i].kind) return (-1); /* Return the index */ return (i); } /* * Hack -- determine if an item is "wearable" (or a missile) */ bool wearable_p(const object_type *o_ptr) { /* Valid "tval" codes */ switch (o_ptr->tval) { case TV_SHOT: case TV_ARROW: case TV_BOLT: case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: case TV_LIGHT: case TV_AMULET: case TV_RING: return (TRUE); } /* Nope */ return (FALSE); } static int get_inscribed_ammo_slot(const object_type *o_ptr) { char *s; if (!o_ptr->note) return 0; s = strchr(quark_str(o_ptr->note), 'f'); if (!s || s[1] < '0' || s[1] > '9') return 0; return QUIVER_START + (s[1] - '0'); } /** * Used by wield_slot() to find an appopriate slot for ammo. See wield_slot() * for information on what this returns. */ static s16b wield_slot_ammo(const object_type *o_ptr) { s16b i, open = 0; /* If the ammo is inscribed with a slot number, we'll try to put it in */ /* that slot, if possible. */ i = get_inscribed_ammo_slot(o_ptr); if (i && !p_ptr->inventory[i].kind) return i; for (i = QUIVER_START; i < QUIVER_END; i++) { if (!p_ptr->inventory[i].kind) { /* Save the open slot if we haven't found one already */ if (!open) open = i; continue; } /* If ammo is cursed we can't stack it */ if (cursed_p(p_ptr->inventory[i].flags)) continue; /* If they are stackable, we'll use this slot for sure */ if (object_similar(&p_ptr->inventory[i], o_ptr, OSTACK_QUIVER)) return i; } /* If not absorbed, return an open slot (or QUIVER_START if no room) */ return open ? open : QUIVER_START; } /** * Determine which equipment slot (if any) an item likes. The slot might (or * might not) be open, but it is a slot which the object could be equipped in. * * For items where multiple slots could work (e.g. ammo or rings), the function * will try to a return a stackable slot first (only for ammo), then an open * slot if possible, and finally a used (but valid) slot if necessary. */ s16b wield_slot(const object_type *o_ptr) { /* Slot for equipment */ switch (o_ptr->tval) { case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: return (INVEN_WIELD); case TV_BOW: return (INVEN_BOW); case TV_RING: return p_ptr->inventory[INVEN_RIGHT].kind ? INVEN_LEFT : INVEN_RIGHT; case TV_AMULET: return (INVEN_NECK); case TV_LIGHT: return (INVEN_LIGHT); case TV_DRAG_ARMOR: case TV_HARD_ARMOR: case TV_SOFT_ARMOR: return (INVEN_BODY); case TV_CLOAK: return (INVEN_OUTER); case TV_SHIELD: return (INVEN_ARM); case TV_CROWN: case TV_HELM: return (INVEN_HEAD); case TV_GLOVES: return (INVEN_HANDS); case TV_BOOTS: return (INVEN_FEET); case TV_BOLT: case TV_ARROW: case TV_SHOT: return wield_slot_ammo(o_ptr); } /* No slot available */ return (-1); } /* * \returns whether item o_ptr will fit in slot 'slot' */ bool slot_can_wield_item(int slot, const object_type *o_ptr) { if (o_ptr->tval == TV_RING) return (slot == INVEN_LEFT || slot == INVEN_RIGHT) ? TRUE : FALSE; else if (obj_is_ammo(o_ptr)) return (slot >= QUIVER_START && slot < QUIVER_END) ? TRUE : FALSE; else return (wield_slot(o_ptr) == slot) ? TRUE : FALSE; } /* * Return a string mentioning how a given item is carried */ const char *mention_use(int slot) { switch (slot) { case INVEN_WIELD: { if (adj_str_hold[p_ptr->state.stat_ind[A_STR]] < p_ptr->inventory[slot].weight / 10) return "Just lifting"; else return "Wielding"; } case INVEN_BOW: { if (adj_str_hold[p_ptr->state.stat_ind[A_STR]] < p_ptr->inventory[slot].weight / 10) return "Just holding"; else return "Shooting"; } case INVEN_LEFT: return "On left hand"; case INVEN_RIGHT: return "On right hand"; case INVEN_NECK: return "Around neck"; case INVEN_LIGHT: return "Light source"; case INVEN_BODY: return "On body"; case INVEN_OUTER: return "About body"; case INVEN_ARM: return "On arm"; case INVEN_HEAD: return "On head"; case INVEN_HANDS: return "On hands"; case INVEN_FEET: return "On feet"; case QUIVER_START + 0: return "In quiver [f0]"; case QUIVER_START + 1: return "In quiver [f1]"; case QUIVER_START + 2: return "In quiver [f2]"; case QUIVER_START + 3: return "In quiver [f3]"; case QUIVER_START + 4: return "In quiver [f4]"; case QUIVER_START + 5: return "In quiver [f5]"; case QUIVER_START + 6: return "In quiver [f6]"; case QUIVER_START + 7: return "In quiver [f7]"; case QUIVER_START + 8: return "In quiver [f8]"; case QUIVER_START + 9: return "In quiver [f9]"; } /*if (slot >= QUIVER_START && slot < QUIVER_END) return "In quiver";*/ return "In pack"; } /* * Return a string describing how a given item is being worn. * Currently, only used for items in the equipment, not inventory. */ const char *describe_use(int i) { const char *p; switch (i) { case INVEN_WIELD: p = "attacking monsters with"; break; case INVEN_BOW: p = "shooting missiles with"; break; case INVEN_LEFT: p = "wearing on your left hand"; break; case INVEN_RIGHT: p = "wearing on your right hand"; break; case INVEN_NECK: p = "wearing around your neck"; break; case INVEN_LIGHT: p = "using to light the way"; break; case INVEN_BODY: p = "wearing on your body"; break; case INVEN_OUTER: p = "wearing on your back"; break; case INVEN_ARM: p = "wearing on your arm"; break; case INVEN_HEAD: p = "wearing on your head"; break; case INVEN_HANDS: p = "wearing on your hands"; break; case INVEN_FEET: p = "wearing on your feet"; break; default: { if (i >= QUIVER_START) p = "carrying in your quiver"; else p = "carrying in your pack"; break; } } /* Hack -- Heavy weapon */ if (i == INVEN_WIELD) { object_type *o_ptr; o_ptr = &p_ptr->inventory[i]; if (adj_str_hold[p_ptr->state.stat_ind[A_STR]] < o_ptr->weight / 10) { p = "just lifting"; } } /* Hack -- Heavy bow */ if (i == INVEN_BOW) { object_type *o_ptr; o_ptr = &p_ptr->inventory[i]; if (adj_str_hold[p_ptr->state.stat_ind[A_STR]] < o_ptr->weight / 10) { p = "just holding"; } } /* Return the result */ return p; } /* * Check an item against the item tester info */ bool item_tester_okay(const object_type *o_ptr) { /* Require an item */ if (!o_ptr->kind) return (FALSE); /* Hack -- ignore "gold" */ if (o_ptr->tval == TV_GOLD) return (FALSE); /* Check the tval */ if (item_tester_tval) { if (item_tester_tval != o_ptr->tval) return (FALSE); } /* Check the hook */ if (item_tester_hook) { if (!(*item_tester_hook)(o_ptr)) return (FALSE); } /* Assume okay */ return (TRUE); } /** * Return true if the item is unknown (has yet to be seen by the player). */ bool is_unknown(const object_type *o_ptr) { grid_data gd = { 0 }; map_info(o_ptr->iy, o_ptr->ix, &gd); return gd.unseen_object; } /* * Get the indexes of objects at a given floor location. -TNB- * * Return the number of object indexes acquired. * * Valid flags are any combination of the bits: * 0x01 -- Verify item tester * 0x02 -- Marked items only * 0x04 -- Only the top item * 0x08 -- Visible items only */ int scan_floor(int *items, int max_size, int y, int x, int mode) { int this_o_idx, next_o_idx; int num = 0; /* Sanity */ if (!cave_in_bounds(cave, y, x)) return 0; /* Scan all objects in the grid */ for (this_o_idx = cave->o_idx[y][x]; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* XXX Hack -- Enforce limit */ if (num >= max_size) break; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Item tester */ if ((mode & 0x01) && !item_tester_okay(o_ptr)) continue; /* Marked */ if (mode & 0x02) { if (!o_ptr->marked) continue; } /* Visible */ if (mode & 0x08) { if (!is_unknown(o_ptr) && squelch_item_ok(o_ptr)) continue; } /* Accept this item */ items[num++] = this_o_idx; /* Only one */ if (mode & 0x04) break; } return num; } /* * Excise a dungeon object from any stacks */ void excise_object_idx(int o_idx) { object_type *j_ptr; s16b this_o_idx, next_o_idx = 0; s16b prev_o_idx = 0; /* Object */ j_ptr = object_byid(o_idx); /* Monster */ if (j_ptr->held_m_idx) { monster_type *m_ptr; /* Monster */ m_ptr = cave_monster(cave, j_ptr->held_m_idx); /* Scan all objects in the grid */ for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Done */ if (this_o_idx == o_idx) { /* No previous */ if (prev_o_idx == 0) { /* Remove from list */ m_ptr->hold_o_idx = next_o_idx; } /* Real previous */ else { object_type *i_ptr; /* Previous object */ i_ptr = object_byid(prev_o_idx); /* Remove from list */ i_ptr->next_o_idx = next_o_idx; } /* Forget next pointer */ o_ptr->next_o_idx = 0; /* Done */ break; } /* Save prev_o_idx */ prev_o_idx = this_o_idx; } } /* Dungeon */ else { int y = j_ptr->iy; int x = j_ptr->ix; /* Scan all objects in the grid */ for (this_o_idx = cave->o_idx[y][x]; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Done */ if (this_o_idx == o_idx) { /* No previous */ if (prev_o_idx == 0) { /* Remove from list */ cave->o_idx[y][x] = next_o_idx; } /* Real previous */ else { object_type *i_ptr; /* Previous object */ i_ptr = object_byid(prev_o_idx); /* Remove from list */ i_ptr->next_o_idx = next_o_idx; } /* Forget next pointer */ o_ptr->next_o_idx = 0; /* Done */ break; } /* Save prev_o_idx */ prev_o_idx = this_o_idx; } } } /* * Delete a dungeon object * * Handle "stacks" of objects correctly. */ void delete_object_idx(int o_idx) { object_type *j_ptr; /* Excise */ excise_object_idx(o_idx); /* Object */ j_ptr = object_byid(o_idx); /* Dungeon floor */ if (!(j_ptr->held_m_idx)) { int y, x; /* Location */ y = j_ptr->iy; x = j_ptr->ix; cave_light_spot(cave, y, x); } /* Delete the mimicking monster if necessary */ if (j_ptr->mimicking_m_idx) { monster_type *m_ptr; m_ptr = cave_monster(cave, j_ptr->mimicking_m_idx); /* Clear the mimicry */ m_ptr->mimicked_o_idx = 0; m_ptr->unaware = FALSE; #if 0 /* Hack - just make the mimic obviously a mimic instead of deleting it */ delete_monster_idx(j_ptr->mimicking_m_idx); #endif } /* Wipe the object */ object_wipe(j_ptr); /* Count objects */ o_cnt--; /* Stop tracking deleted objects if necessary */ if (tracked_object_is(0 - o_idx)) { track_object(NO_OBJECT); } } /* * Deletes all objects at given location */ void delete_object(int y, int x) { s16b this_o_idx, next_o_idx = 0; /* Paranoia */ if (!cave_in_bounds(cave, y, x)) return; /* Scan all objects in the grid */ for (this_o_idx = cave->o_idx[y][x]; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Preserve unseen artifacts */ if (o_ptr->artifact && !object_was_sensed(o_ptr)) o_ptr->artifact->created = FALSE; /* Delete the mimicking monster if necessary */ if (o_ptr->mimicking_m_idx) { monster_type *m_ptr; m_ptr = cave_monster(cave, o_ptr->mimicking_m_idx); /* Clear the mimicry */ m_ptr->mimicked_o_idx = 0; delete_monster_idx(o_ptr->mimicking_m_idx); } /* Wipe the object */ object_wipe(o_ptr); /* Count objects */ o_cnt--; } /* Objects are gone */ cave->o_idx[y][x] = 0; /* Visual update */ cave_light_spot(cave, y, x); } /* * Move an object from index i1 to index i2 in the object list */ static void compact_objects_aux(int i1, int i2) { int i; object_type *o_ptr; /* Do nothing */ if (i1 == i2) return; /* Repair objects */ for (i = 1; i < o_max; i++) { /* Get the object */ o_ptr = object_byid(i); /* Skip "dead" objects */ if (!o_ptr->kind) continue; /* Repair "next" pointers */ if (o_ptr->next_o_idx == i1) { /* Repair */ o_ptr->next_o_idx = i2; } } /* Get the object */ o_ptr = object_byid(i1); /* Monster */ if (o_ptr->held_m_idx) { monster_type *m_ptr; /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Repair monster */ if (m_ptr->hold_o_idx == i1) { /* Repair */ m_ptr->hold_o_idx = i2; } } /* Dungeon */ else { int y, x; /* Get location */ y = o_ptr->iy; x = o_ptr->ix; /* Repair grid */ if (cave->o_idx[y][x] == i1) { /* Repair */ cave->o_idx[y][x] = i2; } /* Mimic */ if (o_ptr->mimicking_m_idx) { monster_type *m_ptr; /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->mimicking_m_idx); /* Repair monster */ if (m_ptr->mimicked_o_idx == i1) { /* Repair */ m_ptr->mimicked_o_idx = i2; } } } /* Hack -- move object */ COPY(object_byid(i2), object_byid(i1), object_type); /* Hack -- wipe hole */ object_wipe(o_ptr); } /* * Compact and reorder the object list * * This function can be very dangerous, use with caution! * * When compacting objects, we first destroy gold, on the basis that by the * time item compaction becomes an issue, the player really won't care. * We also nuke items marked as squelch. * * When compacting other objects, we base the saving throw on a combination of * object level, distance from player, and current "desperation". * * After compacting, we "reorder" the objects into a more compact order, and we * reset the allocation info, and the "live" array. */ void compact_objects(int size) { int py = p_ptr->py; int px = p_ptr->px; int i, y, x, cnt; int cur_lev, cur_dis, chance; /* Reorder objects when not passed a size */ if (!size) { /* Excise dead objects (backwards!) */ for (i = o_max - 1; i >= 1; i--) { object_type *o_ptr = object_byid(i); if (o_ptr->kind) continue; /* Move last object into open hole */ compact_objects_aux(o_max - 1, i); /* Compress "o_max" */ o_max--; } return; } /* Message */ msg("Compacting objects..."); /*** Try destroying objects ***/ /* First do gold */ for (i = 1; (i < o_max) && (size); i++) { object_type *o_ptr = object_byid(i); /* Nuke gold or squelched items */ if (o_ptr->tval == TV_GOLD || squelch_item_ok(o_ptr)) { delete_object_idx(i); size--; } } /* Compact at least 'size' objects */ for (cnt = 1; size; cnt++) { /* Get more vicious each iteration */ cur_lev = 5 * cnt; /* Get closer each iteration */ cur_dis = 5 * (20 - cnt); /* Examine the objects */ for (i = 1; (i < o_max) && (size); i++) { object_type *o_ptr = object_byid(i); if (!o_ptr->kind) continue; /* Hack -- High level objects start out "immune" */ if (o_ptr->kind->level > cur_lev && !o_ptr->kind->squelch) continue; /* Monster */ if (o_ptr->held_m_idx) { monster_type *m_ptr; /* Get the monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Get the location */ y = m_ptr->fy; x = m_ptr->fx; /* Monsters protect their objects */ if ((randint0(100) < 90) && !o_ptr->kind->squelch) continue; } /* Mimicked items */ else if (o_ptr->mimicking_m_idx) { /* Get the location */ y = o_ptr->iy; x = o_ptr->ix; /* Mimicked items try hard not to be compacted */ if (randint0(100) < 90) continue; } /* Dungeon */ else { /* Get the location */ y = o_ptr->iy; x = o_ptr->ix; } /* Nearby objects start out "immune" */ if ((cur_dis > 0) && (distance(py, px, y, x) < cur_dis) && !o_ptr->kind->squelch) continue; /* Saving throw */ chance = 90; /* Hack -- only compact artifacts in emergencies */ if (o_ptr->artifact && (cnt < 1000)) chance = 100; /* Apply the saving throw */ if (randint0(100) < chance) continue; /* Delete the object */ delete_object_idx(i); size--; } } /* Reorder objects */ compact_objects(0); } /* * Delete all the items when player leaves the level * * Note -- we do NOT visually reflect these (irrelevant) changes * * Hack -- we clear the "cave->o_idx[y][x]" field for every grid, * and the "m_ptr->next_o_idx" field for every monster, since * we know we are clearing every object. Technically, we only * clear those fields for grids/monsters containing objects, * and we clear it once for every such object. */ void wipe_o_list(struct cave *c) { int i; /* Delete the existing objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = object_byid(i); if (!o_ptr->kind) continue; /* Preserve artifacts or mark them as lost in the history */ if (o_ptr->artifact) { /* Preserve if dungeon creation failed, or preserve mode, or items * carried by monsters, and only artifacts not seen */ if ((!character_dungeon || !OPT(birth_no_preserve) || o_ptr->held_m_idx) && !object_was_sensed(o_ptr)) o_ptr->artifact->created = FALSE; else history_lose_artifact(o_ptr->artifact); } /* Monster */ if (o_ptr->held_m_idx) { monster_type *m_ptr; /* Monster */ m_ptr = cave_monster(cave, o_ptr->held_m_idx); /* Hack -- see above */ m_ptr->hold_o_idx = 0; } /* Dungeon */ else { /* Get the location */ int y = o_ptr->iy; int x = o_ptr->ix; /* Hack -- see above */ c->o_idx[y][x] = 0; } /* Wipe the object */ (void)WIPE(o_ptr, object_type); } /* Reset "o_max" */ o_max = 1; /* Reset "o_cnt" */ o_cnt = 0; } /* * Get and return the index of a "free" object. * * This routine should almost never fail, but in case it does, * we must be sure to handle "failure" of this routine. */ s16b o_pop(void) { int i; /* Initial allocation */ if (o_max < z_info->o_max) { /* Get next space */ i = o_max; /* Expand object array */ o_max++; /* Count objects */ o_cnt++; /* Use this object */ return (i); } /* Recycle dead objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = object_byid(i); if (o_ptr->kind) continue; /* Count objects */ o_cnt++; /* Use this object */ return (i); } /* Warn the player (except during dungeon creation) */ if (character_dungeon) msg("Too many objects!"); /* Oops */ return (0); } /* * Get the first object at a dungeon location * or NULL if there isn't one. */ object_type *get_first_object(int y, int x) { s16b o_idx = cave->o_idx[y][x]; if (o_idx) return object_byid(o_idx); /* No object */ return (NULL); } /* * Get the next object in a stack or NULL if there isn't one. */ object_type *get_next_object(const object_type *o_ptr) { if (o_ptr->next_o_idx) return object_byid(o_ptr->next_o_idx); /* No more objects */ return NULL; } /* * Determine if a weapon is 'blessed' */ bool is_blessed(const object_type *o_ptr) { bitflag f[OF_SIZE]; /* Get the flags */ object_flags(o_ptr, f); /* Is the object blessed? */ return (of_has(f, OF_BLESSED) ? TRUE : FALSE); } /* * Return the "value" of an "unknown" item * Make a guess at the value of non-aware items */ static s32b object_value_base(const object_type *o_ptr) { /* Use template cost for aware objects */ if (object_flavor_is_aware(o_ptr) || o_ptr->ident & IDENT_STORE) return o_ptr->kind->cost; /* Analyze the type */ switch (o_ptr->tval) { case TV_FOOD: return 5; case TV_POTION: case TV_SCROLL: return 20; case TV_RING: case TV_AMULET: return 45; case TV_WAND: return 50; case TV_STAFF: return 70; case TV_ROD: return 90; } return 0; } /* * Return the "real" price of a "known" item, not including discounts. * * Wand and staffs get cost for each charge. * * Wearable items (weapons, launchers, jewelry, lights, armour) and ammo * are priced according to their power rating. All ammo, and normal (non-ego) * torches are scaled down by AMMO_RESCALER to reflect their impermanence. */ s32b object_value_real(const object_type *o_ptr, int qty, int verbose, bool known) { s32b value, total_value; s32b power; int a = 1; int b = 5; static file_mode pricing_mode = MODE_WRITE; if (wearable_p(o_ptr)) { char buf[1024]; ang_file *log_file = NULL; if (verbose) { path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "pricing.log"); log_file = file_open(buf, pricing_mode, FTYPE_TEXT); if (!log_file) { msg("Error - can't open pricing.log for writing."); exit(1); } pricing_mode = MODE_APPEND; } file_putf(log_file, "object is %s\n", o_ptr->kind->name); power = object_power(o_ptr, verbose, log_file, known); value = sign(power) * ((a * power * power) + (b * power)); if ( (o_ptr->tval == TV_SHOT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_BOLT) || ((o_ptr->tval == TV_LIGHT) && (o_ptr->sval == SV_LIGHT_TORCH) && !o_ptr->ego) ) { value = value / AMMO_RESCALER; if (value < 1) value = 1; } file_putf(log_file, "a is %d and b is %d\n", a, b); file_putf(log_file, "value is %d\n", value); total_value = value * qty; if (verbose) { if (!file_close(log_file)) { msg("Error - can't close pricing.log file."); exit(1); } } if (total_value < 0) total_value = 0; return (total_value); } /* Hack -- "worthless" items */ if (!o_ptr->kind->cost) return (0L); /* Base cost */ value = o_ptr->kind->cost; /* Analyze the item type and quantity*/ switch (o_ptr->tval) { /* Wands/Staffs */ case TV_WAND: case TV_STAFF: { int charges; total_value = value * qty; /* Calculate number of charges, rounded up */ charges = o_ptr->pval[DEFAULT_PVAL] * qty / o_ptr->number; if ((o_ptr->pval[DEFAULT_PVAL] * qty) % o_ptr->number != 0) charges++; /* Pay extra for charges, depending on standard number of charges */ total_value += value * charges / 20; /* Done */ break; } default: { total_value = value * qty; break; } } /* No negative value */ if (total_value < 0) total_value = 0; /* Return the value */ return (total_value); } /* * Return the price of an item including plusses (and charges). * * This function returns the "value" of the given item (qty one). * * Never notice "unknown" bonuses or properties, including "curses", * since that would give the player information he did not have. * * Note that discounted items stay discounted forever. */ s32b object_value(const object_type *o_ptr, int qty, int verbose) { s32b value; if (object_is_known(o_ptr)) { if (cursed_p((bitflag *)o_ptr->flags)) return (0L); value = object_value_real(o_ptr, qty, verbose, TRUE); } else if (wearable_p(o_ptr)) { object_type object_type_body; object_type *j_ptr = &object_type_body; /* Hack -- Felt cursed items */ if (object_was_sensed(o_ptr) && cursed_p((bitflag *)o_ptr->flags)) return (0L); memcpy(j_ptr, o_ptr, sizeof(object_type)); /* give j_ptr only the flags known to be in o_ptr */ object_flags_known(o_ptr, j_ptr->flags); if (!object_attack_plusses_are_visible(o_ptr)) j_ptr->to_h = j_ptr->to_d = 0; if (!object_defence_plusses_are_visible(o_ptr)) j_ptr->to_a = 0; value = object_value_real(j_ptr, qty, verbose, FALSE); } else value = object_value_base(o_ptr) * qty; /* Return the final value */ return (value); } /** * Determine if an item can "absorb" a second item * * See "object_absorb()" for the actual "absorption" code. * * If permitted, we allow weapons/armor to stack, if "known". * * Missiles will combine if both stacks have the same "known" status. * This is done to make unidentified stacks of missiles useful. * * Food, potions, scrolls, and "easy know" items always stack. * * Chests, and activatable items, except rods, never stack (for various * reasons). */ static bool inventory_object_stackable(const object_type *o_ptr, const object_type *j_ptr, object_stack_t mode) { int i; /* If either item is unknown, do not stack */ if (mode & OSTACK_LIST && o_ptr->marked == MARK_AWARE) return FALSE; if (mode & OSTACK_LIST && j_ptr->marked == MARK_AWARE) return FALSE; /* Hack -- identical items cannot be stacked */ if (o_ptr == j_ptr) return FALSE; /* Require identical object kinds */ if (o_ptr->kind != j_ptr->kind) return FALSE; /* Different flags don't stack */ if (!of_is_equal(o_ptr->flags, j_ptr->flags)) return FALSE; /* Artifacts never stack */ if (o_ptr->artifact || j_ptr->artifact) return FALSE; /* Analyze the items */ switch (o_ptr->tval) { /* Chests never stack */ case TV_CHEST: { /* Never okay */ return FALSE; } /* Food, potions, scrolls and rods all stack nicely */ case TV_FOOD: case TV_POTION: case TV_SCROLL: case TV_ROD: { /* Since the kinds are identical, either both will be aware or both will be unaware */ break; } /* Gold, staves and wands stack most of the time */ case TV_STAFF: case TV_WAND: case TV_GOLD: { /* Too much gold or too many charges */ if (o_ptr->pval[DEFAULT_PVAL] + j_ptr->pval[DEFAULT_PVAL] > MAX_PVAL) return FALSE; /* ... otherwise ok */ else break; } /* Weapons, ammo, armour, jewelry, lights */ case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: case TV_RING: case TV_AMULET: case TV_LIGHT: case TV_BOLT: case TV_ARROW: case TV_SHOT: { /* Require identical values */ if (o_ptr->ac != j_ptr->ac) return FALSE; if (o_ptr->dd != j_ptr->dd) return FALSE; if (o_ptr->ds != j_ptr->ds) return FALSE; /* Require identical bonuses */ if (o_ptr->to_h != j_ptr->to_h) return FALSE; if (o_ptr->to_d != j_ptr->to_d) return FALSE; if (o_ptr->to_a != j_ptr->to_a) return FALSE; /* Require all identical pvals */ for (i = 0; i < MAX_PVALS; i++) if (o_ptr->pval[i] != j_ptr->pval[i]) return (FALSE); /* Require identical ego-item types */ if (o_ptr->ego != j_ptr->ego) return FALSE; /* Hack - Never stack recharging wearables ... */ if ((o_ptr->timeout || j_ptr->timeout) && o_ptr->tval != TV_LIGHT) return FALSE; /* ... and lights must have same amount of fuel */ else if ((o_ptr->timeout != j_ptr->timeout) && o_ptr->tval == TV_LIGHT) return FALSE; /* Prevent unIDd items stacking in the object list */ if (mode & OSTACK_LIST && !(o_ptr->ident & j_ptr->ident & IDENT_KNOWN)) return FALSE; /* Probably okay */ break; } /* Anything else */ default: { /* Probably okay */ break; } } /* Require compatible inscriptions */ if (o_ptr->note && j_ptr->note && (o_ptr->note != j_ptr->note)) return FALSE; /* They must be similar enough */ return TRUE; } /** * Return whether each stack of objects can be merged into two uneven stacks. */ static bool inventory_can_stack_partial(const object_type *o_ptr, const object_type *j_ptr, object_stack_t mode) { if (!(mode & OSTACK_STORE)) { int total = o_ptr->number + j_ptr->number; int remainder = total - (MAX_STACK_SIZE - 1); if (remainder >= MAX_STACK_SIZE) return FALSE; } return inventory_object_stackable(o_ptr, j_ptr, mode); } /** * Return whether each stack of objects can be merged into one stack. */ bool object_similar(const object_type *o_ptr, const object_type *j_ptr, object_stack_t mode) { int total = o_ptr->number + j_ptr->number; /* Check against stacking limit - except in stores which absorb anyway */ if (!(mode & OSTACK_STORE) && (total >= MAX_STACK_SIZE)) return FALSE; return inventory_object_stackable(o_ptr, j_ptr, mode); } /** * Allow one item to "absorb" another, assuming they are similar. * * The blending of the "note" field assumes that either (1) one has an * inscription and the other does not, or (2) neither has an inscription. * In both these cases, we can simply use the existing note, unless the * blending object has a note, in which case we use that note. * * The blending of the "discount" field assumes that either (1) one is a * special inscription and one is nothing, or (2) one is a discount and * one is a smaller discount, or (3) one is a discount and one is nothing, * or (4) both are nothing. In all of these cases, we can simply use the * "maximum" of the two "discount" fields. * * These assumptions are enforced by the "object_similar()" code. */ static void object_absorb_merge(object_type *o_ptr, const object_type *j_ptr) { int total; /* Blend all knowledge */ o_ptr->ident |= (j_ptr->ident & ~IDENT_EMPTY); of_union(o_ptr->known_flags, j_ptr->known_flags); /* Merge inscriptions */ if (j_ptr->note) o_ptr->note = j_ptr->note; /* Combine timeouts for rod stacking */ if (o_ptr->tval == TV_ROD) o_ptr->timeout += j_ptr->timeout; /* Combine pvals for wands and staves */ if (o_ptr->tval == TV_WAND || o_ptr->tval == TV_STAFF || o_ptr->tval == TV_GOLD) { total = o_ptr->pval[DEFAULT_PVAL] + j_ptr->pval[DEFAULT_PVAL]; o_ptr->pval[DEFAULT_PVAL] = total >= MAX_PVAL ? MAX_PVAL : total; } /* Combine origin data as best we can */ if (o_ptr->origin != j_ptr->origin || o_ptr->origin_depth != j_ptr->origin_depth || o_ptr->origin_xtra != j_ptr->origin_xtra) { int act = 2; if (o_ptr->origin_xtra && j_ptr->origin_xtra) { monster_race *r_ptr = &r_info[o_ptr->origin_xtra]; monster_race *s_ptr = &r_info[j_ptr->origin_xtra]; bool r_uniq = rf_has(r_ptr->flags, RF_UNIQUE) ? TRUE : FALSE; bool s_uniq = rf_has(s_ptr->flags, RF_UNIQUE) ? TRUE : FALSE; if (r_uniq && !s_uniq) act = 0; else if (s_uniq && !r_uniq) act = 1; else act = 2; } switch (act) { /* Overwrite with j_ptr */ case 1: { o_ptr->origin = j_ptr->origin; o_ptr->origin_depth = j_ptr->origin_depth; o_ptr->origin_xtra = j_ptr->origin_xtra; } /* Set as "mixed" */ case 2: { o_ptr->origin = ORIGIN_MIXED; } } } } /** * Merge a smaller stack into a larger stack, leaving two uneven stacks. */ static void object_absorb_partial(object_type *o_ptr, object_type *j_ptr) { int smallest = MIN(o_ptr->number, j_ptr->number); int largest = MAX(o_ptr->number, j_ptr->number); int difference = (MAX_STACK_SIZE - 1) - largest; o_ptr->number = largest + difference; j_ptr->number = smallest - difference; object_absorb_merge(o_ptr, j_ptr); } /** * Merge two stacks into one stack. */ void object_absorb(object_type *o_ptr, const object_type *j_ptr) { int total = o_ptr->number + j_ptr->number; /* Add together the item counts */ o_ptr->number = ((total < MAX_STACK_SIZE) ? total : (MAX_STACK_SIZE - 1)); object_absorb_merge(o_ptr, j_ptr); } /* * Wipe an object clean. */ void object_wipe(object_type *o_ptr) { /* Wipe the structure */ (void)WIPE(o_ptr, object_type); } /* * Prepare an object based on an existing object */ void object_copy(object_type *o_ptr, const object_type *j_ptr) { /* Copy the structure */ COPY(o_ptr, j_ptr, object_type); } /* * Prepare an object `dst` representing `amt` objects, based on an existing * object `src` representing at least `amt` objects. * * Takes care of the charge redistribution concerns of stacked items. */ void object_copy_amt(object_type *dst, object_type *src, int amt) { int charge_time = randcalc(src->kind->time, 0, AVERAGE), max_time; /* Get a copy of the object */ object_copy(dst, src); /* Modify quantity */ dst->number = amt; dst->note = src->note; /* * If the item has charges/timeouts, set them to the correct level * too. We split off the same amount as distribute_charges. */ if (src->tval == TV_WAND || src->tval == TV_STAFF) { dst->pval[DEFAULT_PVAL] = src->pval[DEFAULT_PVAL] * amt / src->number; } if (src->tval == TV_ROD) { max_time = charge_time * amt; if (src->timeout > max_time) dst->timeout = max_time; else dst->timeout = src->timeout; } } /** * Split off 'at' items from 'src' into 'dest'. */ void object_split(struct object *dest, struct object *src, int amt) { /* Distribute charges of wands, staves, or rods */ distribute_charges(src, dest, amt); /* Modify quantity */ dest->number = amt; if (src->note) dest->note = src->note; } /** * Find and return the index to the oldest object on the given grid marked as * "squelch". */ static s16b floor_get_idx_oldest_squelched(int y, int x) { s16b squelch_idx = 0; s16b this_o_idx; object_type *o_ptr = NULL; for (this_o_idx = cave->o_idx[y][x]; this_o_idx; this_o_idx = o_ptr->next_o_idx) { o_ptr = object_byid(this_o_idx); if (squelch_item_ok(o_ptr)) squelch_idx = this_o_idx; } return squelch_idx; } /* * Let the floor carry an object, deleting old squelched items if necessary */ s16b floor_carry(struct cave *c, int y, int x, object_type *j_ptr) { int n = 0; s16b o_idx; s16b this_o_idx, next_o_idx = 0; /* Scan objects in that grid for combination */ for (this_o_idx = c->o_idx[y][x]; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Check for combination */ if (object_similar(o_ptr, j_ptr, OSTACK_FLOOR)) { /* Combine the items */ object_absorb(o_ptr, j_ptr); /* Result */ return (this_o_idx); } /* Count objects */ n++; } /* Option -- disallow stacking */ if (OPT(birth_no_stacking) && n) return (0); /* The stack is already too large */ if (n >= MAX_FLOOR_STACK) { /* Squelch the oldest squelched object */ s16b squelch_idx = floor_get_idx_oldest_squelched(y, x); if (squelch_idx) delete_object_idx(squelch_idx); else return 0; } /* Make an object */ o_idx = o_pop(); /* Success */ if (o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(o_idx); /* Structure Copy */ object_copy(o_ptr, j_ptr); /* Location */ o_ptr->iy = y; o_ptr->ix = x; /* Forget monster */ o_ptr->held_m_idx = 0; /* Link the object to the pile */ o_ptr->next_o_idx = c->o_idx[y][x]; /* Link the floor to the object */ c->o_idx[y][x] = o_idx; cave_note_spot(c, y, x); cave_light_spot(c, y, x); } /* Result */ return (o_idx); } /* * Let an object fall to the ground at or near a location. * * The initial location is assumed to be "cave_in_bounds_fully(cave, )". * * This function takes a parameter "chance". This is the percentage * chance that the item will "disappear" instead of drop. If the object * has been thrown, then this is the chance of disappearance on contact. * * This function will produce a description of a drop event under the player * when "verbose" is true. * * We check several locations to see if we can find a location at which * the object can combine, stack, or be placed. Artifacts will try very * hard to be placed, including "teleporting" to a useful grid if needed. */ void drop_near(struct cave *c, object_type *j_ptr, int chance, int y, int x, bool verbose) { int i, k, n, d, s; int bs, bn; int by, bx; int dy, dx; int ty, tx; object_type *o_ptr; char o_name[80]; bool flag = FALSE; /* Describe object */ object_desc(o_name, sizeof(o_name), j_ptr, ODESC_BASE); /* Handle normal "breakage" */ if (!j_ptr->artifact && (randint0(100) < chance)) { /* Message */ msg("The %s %s.", o_name, VERB_AGREEMENT(j_ptr->number, "breaks", "break")); /* Failure */ return; } /* Score */ bs = -1; /* Picker */ bn = 0; /* Default */ by = y; bx = x; /* Scan local grids */ for (dy = -3; dy <= 3; dy++) { /* Scan local grids */ for (dx = -3; dx <= 3; dx++) { bool comb = FALSE; /* Calculate actual distance */ d = (dy * dy) + (dx * dx); /* Ignore distant grids */ if (d > 10) continue; /* Location */ ty = y + dy; tx = x + dx; /* Skip illegal grids */ if (!cave_in_bounds_fully(cave, ty, tx)) continue; /* Require line of sight */ if (!los(y, x, ty, tx)) continue; /* Require floor space */ if (!cave_isfloor(cave, ty, tx)) continue; /* No objects */ k = 0; n = 0; /* Scan objects in that grid */ for (o_ptr = get_first_object(ty, tx); o_ptr; o_ptr = get_next_object(o_ptr)) { /* Check for possible combination */ if (object_similar(o_ptr, j_ptr, OSTACK_FLOOR)) comb = TRUE; /* Count objects */ if (!squelch_item_ok(o_ptr)) k++; else n++; } /* Add new object */ if (!comb) k++; /* Option -- disallow stacking */ if (OPT(birth_no_stacking) && (k > 1)) continue; /* Paranoia? */ if ((k + n) > MAX_FLOOR_STACK && !floor_get_idx_oldest_squelched(ty, tx)) continue; /* Calculate score */ s = 1000 - (d + k * 5); /* Skip bad values */ if (s < bs) continue; /* New best value */ if (s > bs) bn = 0; /* Apply the randomizer to equivalent values */ if ((++bn >= 2) && (randint0(bn) != 0)) continue; /* Keep score */ bs = s; /* Track it */ by = ty; bx = tx; /* Okay */ flag = TRUE; } } /* Handle lack of space */ if (!flag && !j_ptr->artifact) { /* Message */ msg("The %s %s.", o_name, VERB_AGREEMENT(j_ptr->number, "disappears", "disappear")); /* Debug */ if (p_ptr->wizard) msg("Breakage (no floor space)."); /* Failure */ return; } /* Find a grid */ for (i = 0; !flag; i++) { /* Bounce around */ if (i < 1000) { ty = rand_spread(by, 1); tx = rand_spread(bx, 1); } /* Random locations */ else { ty = randint0(c->height); tx = randint0(c->width); } /* Require floor space */ if (!cave_canputitem(cave, ty, tx)) continue; /* Bounce to that location */ by = ty; bx = tx; /* Okay */ flag = TRUE; } /* Give it to the floor */ if (!floor_carry(c, by, bx, j_ptr)) { /* Message */ msg("The %s %s.", o_name, VERB_AGREEMENT(j_ptr->number, "disappears", "disappear")); /* Debug */ if (p_ptr->wizard) msg("Breakage (too many objects)."); if (j_ptr->artifact) j_ptr->artifact->created = FALSE; /* Failure */ return; } /* Sound */ sound(MSG_DROP); /* Message when an object falls under the player */ if (verbose && (cave->m_idx[by][bx] < 0) && !squelch_item_ok(j_ptr)) { msg("You feel something roll beneath your feet."); } } /** * This will push objects off a square. * * The methodology is to load all objects on the square into a queue. Replace * the previous square with a type that does not allow for objects. Drop the * objects. Last, put the square back to its original type. */ void push_object(int y, int x) { /* Save the original terrain feature */ struct feature *feat_old = cave_feat(cave, y, x); object_type *o_ptr; struct queue *queue = q_new(MAX_FLOOR_STACK); /* Push all objects on the square into the queue */ for (o_ptr = get_first_object(y, x); o_ptr; o_ptr = get_next_object(o_ptr)) q_push_ptr(queue, o_ptr); /* Set feature to an open door */ cave_force_floor(cave, y, x); cave_add_door(cave, y, x, FALSE); /* Drop objects back onto the floor */ while (q_len(queue) > 0) { /* Take object from the queue */ o_ptr = q_pop_ptr(queue); /* Drop the object */ drop_near(cave, o_ptr, 0, y, x, FALSE); } /* Delete original objects */ delete_object(y, x); /* Reset cave feature */ cave_set_feat(cave, y, x, feat_old->fidx); q_free(queue); } /* * Scatter some "great" objects near the player */ void acquirement(int y1, int x1, int level, int num, bool great) { object_type *i_ptr; object_type object_type_body; /* Acquirement */ while (num--) { /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Make a good (or great) object (if possible) */ if (!make_object(cave, i_ptr, level, TRUE, great, TRUE, NULL, 0)) continue; i_ptr->origin = ORIGIN_ACQUIRE; i_ptr->origin_depth = p_ptr->depth; /* Drop the object */ drop_near(cave, i_ptr, 0, y1, x1, TRUE); } } /* * Describe the charges on an item in the inventory. */ void inven_item_charges(int item) { object_type *o_ptr = &p_ptr->inventory[item]; /* Require staff/wand */ if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return; /* Require known item */ if (!object_is_known(o_ptr)) return; /* Print a message */ msg("You have %d charge%s remaining.", o_ptr->pval[DEFAULT_PVAL], (o_ptr->pval[DEFAULT_PVAL] != 1) ? "s" : ""); } /* * Describe an item in the inventory. Note: only called when an item is * dropped, used, or otherwise deleted from the inventory */ void inven_item_describe(int item) { object_type *o_ptr = &p_ptr->inventory[item]; char o_name[80]; if (o_ptr->artifact && (object_is_known(o_ptr) || object_name_is_visible(o_ptr))) { /* Get a description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_FULL | ODESC_SINGULAR); /* Print a message */ msg("You no longer have the %s (%c).", o_name, index_to_label(item)); } else { /* Get a description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Print a message */ msg("You have %s (%c).", o_name, index_to_label(item)); } } /* * Increase the "number" of an item in the inventory */ void inven_item_increase(int item, int num) { object_type *o_ptr = &p_ptr->inventory[item]; /* Apply */ num += o_ptr->number; /* Bounds check */ if (num > 255) num = 255; else if (num < 0) num = 0; /* Un-apply */ num -= o_ptr->number; /* Change the number and weight */ if (num) { /* Add the number */ o_ptr->number += num; /* Add the weight */ p_ptr->total_weight += (num * o_ptr->weight); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Recalculate mana XXX */ p_ptr->update |= (PU_MANA); /* Combine the pack */ p_ptr->notice |= (PN_COMBINE); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } } /** * Save the size of the quiver. */ void save_quiver_size(struct player *p) { int i, count = 0; int maxsize = MAX_STACK_SIZE - 1; for (i = QUIVER_START; i < QUIVER_END; i++) if (p->inventory[i].kind) count += p->inventory[i].number; p->quiver_size = count; p->quiver_slots = (count + maxsize - 1) / maxsize; p->quiver_remainder = count % maxsize; } /** * Compare ammunition from slots (0-9); used for sorting. * * \returns -1 if slot1 should come first, 1 if slot2 should come first, or 0. */ static int compare_ammo(int slot1, int slot2) { /* Right now there is no sorting criteria */ return 0; } /** * Swap ammunition between quiver slots (0-9). */ static void swap_quiver_slots(int slot1, int slot2) { int i = slot1 + QUIVER_START; int j = slot2 + QUIVER_START; object_type o; object_copy(&o, &p_ptr->inventory[i]); object_copy(&p_ptr->inventory[i], &p_ptr->inventory[j]); object_copy(&p_ptr->inventory[j], &o); /* Update object_idx if necessary */ if (tracked_object_is(i)) { track_object(j); } if (tracked_object_is(j)) { track_object(i); } } /** * Sorts the quiver--ammunition inscribed with @fN prefers to end up in quiver * slot N. */ void sort_quiver(void) { /* Ammo slots go from 0-9; these indices correspond to the range of * (QUIVER_START) - (QUIVER_END-1) in inventory[]. */ bool locked[QUIVER_SIZE] = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}; int desired[QUIVER_SIZE] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; int i, j, k; object_type *o_ptr; /* Here we figure out which slots have inscribed ammo, and whether that * ammo is already in the slot it "wants" to be in or not. */ for (i=0; i < QUIVER_SIZE; i++) { j = QUIVER_START + i; o_ptr = &p_ptr->inventory[j]; /* Skip this slot if it doesn't have ammo */ if (!o_ptr->kind) continue; /* Figure out which slot this ammo prefers, if any */ k = get_inscribed_ammo_slot(o_ptr); if (!k) continue; k -= QUIVER_START; if (k == i) locked[i] = TRUE; if (desired[k] < 0) desired[k] = i; } /* For items which had a preference that was not fulfilled, we will swap * them into the slot as long as it isn't already locked. */ for (i=0; i < QUIVER_SIZE; i++) { if (locked[i] || desired[i] < 0) continue; /* item in slot 'desired[i]' desires to be in slot 'i' */ swap_quiver_slots(desired[i], i); locked[i] = TRUE; } /* Now we need to compact ammo which isn't in a preferrred slot towards the * "front" of the quiver */ for (i=0; i < QUIVER_SIZE; i++) { /* If the slot isn't empty, skip it */ if (p_ptr->inventory[QUIVER_START + i].kind) continue; /* Start from the end and find an unlocked item to put here. */ for (j=QUIVER_SIZE - 1; j > i; j--) { if (!p_ptr->inventory[QUIVER_START + j].kind || locked[j]) continue; swap_quiver_slots(i, j); break; } } /* Now we will sort all other ammo using a simple insertion sort */ for (i=0; i < QUIVER_SIZE; i++) { k = i; if (!locked[k]) for (j = i + 1; j < QUIVER_SIZE; j++) if (!locked[j] && compare_ammo(k, j) > 0) swap_quiver_slots(j, k); } } /* * Shifts ammo at or above the item slot towards the end of the quiver, making * room for a new piece of ammo. */ void open_quiver_slot(int slot) { int i, pref; int dest = QUIVER_END - 1; /* This should only be used on ammunition */ if (slot < QUIVER_START) return; /* Quiver is full */ if (p_ptr->inventory[QUIVER_END - 1].kind) return; /* Find the first open quiver slot */ while (p_ptr->inventory[dest].kind) dest++; /* Swap things with the space one higher (essentially moving the open space * towards our goal slot. */ for (i = dest - 1; i >= slot; i--) { /* If we have an item with an inscribed location (and it's in */ /* that location) then we won't move it. */ pref = get_inscribed_ammo_slot(&p_ptr->inventory[i]); if (i != slot && pref && pref == i) continue; /* Update object_idx if necessary */ if (tracked_object_is(i)) { track_object(dest); } /* Copy the item up and wipe the old slot */ COPY(&p_ptr->inventory[dest], &p_ptr->inventory[i], object_type); dest = i; object_wipe(&p_ptr->inventory[dest]); } } /* * Erase an inventory slot if it has no more items */ void inven_item_optimize(int item) { object_type *o_ptr = &p_ptr->inventory[item]; int i, j, slot, limit; /* Save a possibly new quiver size */ if (item >= QUIVER_START) save_quiver_size(p_ptr); /* Only optimize real items which are empty */ if (!o_ptr->kind || o_ptr->number) return; /* Stop tracking erased item if necessary */ if (tracked_object_is(item)) { track_object(NO_OBJECT); } /* Items in the pack are treated differently from other items */ if (item < INVEN_WIELD) { p_ptr->inven_cnt--; p_ptr->redraw |= PR_INVEN; limit = INVEN_MAX_PACK; } /* Items in the quiver and equipped items are (mostly) treated similarly */ else { p_ptr->equip_cnt--; p_ptr->redraw |= PR_EQUIP; limit = item >= QUIVER_START ? QUIVER_END : 0; } /* If the item is equipped (but not in the quiver), there is no need to */ /* slide other items. Bonuses and such will need to be recalculated */ if (!limit) { /* Erase the empty slot */ object_wipe(&p_ptr->inventory[item]); /* Recalculate stuff */ p_ptr->update |= (PU_BONUS); p_ptr->update |= (PU_TORCH); p_ptr->update |= (PU_MANA); return; } /* Slide everything down */ for (j = item, i = item + 1; i < limit; i++) { if (limit == QUIVER_END && p_ptr->inventory[i].kind) { /* If we have an item with an inscribed location (and it's in */ /* that location) then we won't move it. */ slot = get_inscribed_ammo_slot(&p_ptr->inventory[i]); if (slot && slot == i) continue; } COPY(&p_ptr->inventory[j], &p_ptr->inventory[i], object_type); /* Update object_idx if necessary */ if (tracked_object_is(i)) { track_object(j); } j = i; } /* Reorder the quiver if necessary */ if (item >= QUIVER_START) sort_quiver(); /* Wipe the left-over object on the end */ object_wipe(&p_ptr->inventory[j]); /* Inventory has changed, so disable repeat command */ cmd_disable_repeat(); } /* * Describe the charges on an item on the floor. */ void floor_item_charges(int item) { object_type *o_ptr = object_byid(item); /* Require staff/wand */ if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return; /* Require known item */ if (!object_is_known(o_ptr)) return; /* Print a message */ msg("There %s %d charge%s remaining.", (o_ptr->pval[DEFAULT_PVAL] != 1) ? "are" : "is", o_ptr->pval[DEFAULT_PVAL], (o_ptr->pval[DEFAULT_PVAL] != 1) ? "s" : ""); } /* * Describe an item in the inventory. */ void floor_item_describe(int item) { object_type *o_ptr = object_byid(item); char o_name[80]; /* Get a description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Print a message */ msg("You see %s.", o_name); } /* * Increase the "number" of an item on the floor */ void floor_item_increase(int item, int num) { object_type *o_ptr = object_byid(item); /* Apply */ num += o_ptr->number; /* Bounds check */ if (num > 255) num = 255; else if (num < 0) num = 0; /* Un-apply */ num -= o_ptr->number; /* Change the number */ o_ptr->number += num; } /* * Optimize an item on the floor (destroy "empty" items) */ void floor_item_optimize(int item) { object_type *o_ptr = object_byid(item); /* Paranoia -- be sure it exists */ if (!o_ptr->kind) return; /* Only optimize empty items */ if (o_ptr->number) return; /* Delete the object */ delete_object_idx(item); } /* * Check if we have space for an item in the pack without overflow */ bool inven_carry_okay(const object_type *o_ptr) { /* Empty slot? */ if (p_ptr->inven_cnt < INVEN_MAX_PACK) return TRUE; /* Check if it can stack */ if (inven_stack_okay(o_ptr)) return TRUE; /* Nope */ return FALSE; } /* * Check to see if an item is stackable in the inventory */ bool inven_stack_okay(const object_type *o_ptr) { /* Similar slot? */ int j; /* If our pack is full and we're adding too many missiles, there won't be * enough room in the quiver, so don't check it. */ int limit; if (!pack_is_full()) /* The pack has more room */ limit = ALL_INVEN_TOTAL; else if (p_ptr->quiver_remainder == 0) /* Quiver already maxed out */ limit = INVEN_PACK; else if (p_ptr->quiver_remainder + o_ptr->number >= MAX_STACK_SIZE) /* Too much new ammo */ limit = INVEN_PACK; else limit = ALL_INVEN_TOTAL; for (j = 0; j < limit; j++) { object_type *j_ptr = &p_ptr->inventory[j]; /* Skip equipped items and non-objects */ if (j >= INVEN_PACK && j < QUIVER_START) continue; if (!j_ptr->kind) continue; /* Check if the two items can be combined */ if (object_similar(j_ptr, o_ptr, OSTACK_PACK)) return (TRUE); } return (FALSE); } /** * Return the preferred inventory slot for the given object. * * This function defines the sort order for the inventory. * * \param o_ptr is the object that needs a slot. * \param max_slot is the maximum slot we will allow for this object. * \return the inventory slot index for the object. */ static int inventory_slot_for_object(const struct object *o_ptr, size_t max_slot) { /* Get the "value" of the item */ s32b o_value = o_ptr->kind->cost; s32b j_value; struct object *j_ptr; size_t j; /* Scan every occupied slot */ for (j = 0; j < max_slot; j++) { /* Get the item already there */ j_ptr = &p_ptr->inventory[j]; /* Use empty slots */ if (!j_ptr->kind) break; /* Hack -- readable books always come first */ if ((o_ptr->tval == p_ptr->class->spell_book) && (j_ptr->tval != p_ptr->class->spell_book)) break; if ((j_ptr->tval == p_ptr->class->spell_book) && (o_ptr->tval != p_ptr->class->spell_book)) continue; /* Objects sort by decreasing type */ if (o_ptr->tval > j_ptr->tval) break; if (o_ptr->tval < j_ptr->tval) continue; /* Non-aware (flavored) items always come last */ if (!object_flavor_is_aware(o_ptr)) continue; if (!object_flavor_is_aware(j_ptr)) break; /* Objects sort by increasing sval */ if (o_ptr->sval < j_ptr->sval) break; if (o_ptr->sval > j_ptr->sval) continue; /* Unidentified objects always come last */ if (!object_is_known(o_ptr)) continue; if (!object_is_known(j_ptr)) break; /* Lights sort by decreasing fuel */ if (o_ptr->tval == TV_LIGHT) { if (o_ptr->pval[DEFAULT_PVAL] > j_ptr->pval[DEFAULT_PVAL]) break; if (o_ptr->pval[DEFAULT_PVAL] < j_ptr->pval[DEFAULT_PVAL]) continue; } /* Determine the "value" of the pack item */ j_value = j_ptr->kind->cost; /* Objects sort by decreasing value */ if (o_value > j_value) break; if (o_value < j_value) continue; } return j; } /* * Add an item to the players inventory, and return the slot used. * * If the new item can combine with an existing item in the inventory, * it will do so, using "object_similar()" and "object_absorb()", else, * the item will be placed into the "proper" location in the inventory. * * This function can be used to "over-fill" the player's pack, but only * once, and such an action must trigger the "overflow" code immediately. * Note that when the pack is being "over-filled", the new item must be * placed into the "overflow" slot, and the "overflow" must take place * before the pack is reordered, but (optionally) after the pack is * combined. This may be tricky. See "dungeon.c" for info. * * Note that this code must remove any location/stack information * from the object once it is placed into the inventory. */ extern s16b inven_carry(struct player *p, struct object *o) { int i, j, k; int n = -1; object_type *j_ptr; /* Apply an autoinscription */ apply_autoinscription(o); /* Check for combining */ for (j = 0; j < INVEN_PACK; j++) { j_ptr = &p->inventory[j]; if (!j_ptr->kind) continue; /* Hack -- track last item */ n = j; /* Check if the two items can be combined */ if (object_similar(j_ptr, o, OSTACK_PACK)) { /* Combine the items */ object_absorb(j_ptr, o); /* Increase the weight */ p->total_weight += (o->number * o->weight); /* Recalculate bonuses */ p->update |= (PU_BONUS); /* Redraw stuff */ p->redraw |= (PR_INVEN); /* Save quiver size */ save_quiver_size(p); /* Success */ return (j); } } /* Paranoia */ if (p->inven_cnt > INVEN_MAX_PACK) return (-1); /* Find an empty slot */ for (j = 0; j <= INVEN_MAX_PACK; j++) { j_ptr = &p->inventory[j]; if (!j_ptr->kind) break; } /* Use that slot */ i = j; /* Reorder the pack */ if (i < INVEN_MAX_PACK) { j = inventory_slot_for_object(o, INVEN_MAX_PACK); /* Use that slot */ i = j; /* Slide objects */ for (k = n; k >= i; k--) { /* Hack -- Slide the item */ object_copy(&p->inventory[k+1], &p->inventory[k]); /* Update object_idx if necessary */ if (tracked_object_is(k)) { track_object(k+1); } } /* Wipe the empty slot */ object_wipe(&p->inventory[i]); } object_copy(&p->inventory[i], o); j_ptr = &p->inventory[i]; j_ptr->next_o_idx = 0; j_ptr->held_m_idx = 0; j_ptr->iy = j_ptr->ix = 0; j_ptr->marked = FALSE; p->total_weight += (j_ptr->number * j_ptr->weight); p->inven_cnt++; p->update |= (PU_BONUS); p->notice |= (PN_COMBINE | PN_REORDER); p->redraw |= (PR_INVEN); /* Hobbits ID mushrooms on pickup, gnomes ID wands and staffs on pickup */ if (!object_is_known(j_ptr)) { if (player_has(PF_KNOW_MUSHROOM) && j_ptr->tval == TV_FOOD) { do_ident_item(j_ptr); msg("Mushrooms for breakfast!"); } else if (player_has(PF_KNOW_ZAPPER) && (j_ptr->tval == TV_WAND || j_ptr->tval == TV_STAFF)) { do_ident_item(j_ptr); } } /* Save quiver size */ save_quiver_size(p); /* Return the slot */ return (i); } /* * Take off (some of) a non-cursed equipment item * * Note that only one item at a time can be wielded per slot. * * Note that taking off an item when "full" may cause that item * to fall to the ground. * * Return the inventory slot into which the item is placed. */ s16b inven_takeoff(int item, int amt) { int slot; object_type *o_ptr; object_type *i_ptr; object_type object_type_body; const char *act; char o_name[80]; bool track_removed_item = FALSE; /* Get the item to take off */ o_ptr = &p_ptr->inventory[item]; /* Paranoia */ if (amt <= 0) return (-1); /* Verify */ if (amt > o_ptr->number) amt = o_ptr->number; /* Get local object */ i_ptr = &object_type_body; /* Obtain a local object */ object_copy(i_ptr, o_ptr); /* Modify quantity */ i_ptr->number = amt; /* Describe the object */ object_desc(o_name, sizeof(o_name), i_ptr, ODESC_PREFIX | ODESC_FULL); /* Took off weapon */ if (item == INVEN_WIELD) { act = "You were wielding"; } /* Took off bow */ else if (item == INVEN_BOW) { act = "You were holding"; } /* Took off light */ else if (item == INVEN_LIGHT) { act = "You were holding"; } /* Took off something */ else { act = "You were wearing"; } /* Update object_idx if necessary, after optimization */ if (tracked_object_is(item)) { track_removed_item = TRUE; } /* Modify, Optimize */ inven_item_increase(item, -amt); inven_item_optimize(item); /* Carry the object */ slot = inven_carry(p_ptr, i_ptr); /* Track removed item if necessary */ if (track_removed_item) { track_object(slot); } /* Message */ msgt(MSG_WIELD, "%s %s (%c).", act, o_name, index_to_label(slot)); p_ptr->notice |= PN_SQUELCH; /* Return slot */ return (slot); } /* * Drop (some of) a non-cursed inventory/equipment item * * The object will be dropped "near" the current location */ void inven_drop(int item, int amt) { int py = p_ptr->py; int px = p_ptr->px; object_type *o_ptr; object_type *i_ptr; object_type object_type_body; char o_name[80]; /* Get the original object */ o_ptr = &p_ptr->inventory[item]; /* Error check */ if (amt <= 0) return; /* Not too many */ if (amt > o_ptr->number) amt = o_ptr->number; /* Take off equipment */ if (item >= INVEN_WIELD) { /* Take off first */ item = inven_takeoff(item, amt); /* Get the original object */ o_ptr = &p_ptr->inventory[item]; } /* Stop tracking items no longer in the inventory */ if (tracked_object_is(item) && amt == o_ptr->number) { track_object(NO_OBJECT); } i_ptr = &object_type_body; object_copy(i_ptr, o_ptr); object_split(i_ptr, o_ptr, amt); /* Describe local object */ object_desc(o_name, sizeof(o_name), i_ptr, ODESC_PREFIX | ODESC_FULL); /* Message */ msg("You drop %s (%c).", o_name, index_to_label(item)); /* Drop it near the player */ drop_near(cave, i_ptr, 0, py, px, FALSE); /* Modify, Describe, Optimize */ inven_item_increase(item, -amt); inven_item_describe(item); inven_item_optimize(item); } /* * Combine items in the pack * Also "pick up" any gold in the inventory by accident * * Note special handling of the "overflow" slot */ void combine_pack(void) { int i, j, k; object_type *o_ptr; object_type *j_ptr; bool display_message = FALSE; bool redraw = FALSE; /* Combine the pack (backwards) */ for (i = INVEN_PACK; i > 0; i--) { bool slide = FALSE; /* Get the item */ o_ptr = &p_ptr->inventory[i]; /* Skip empty items */ if (!o_ptr->kind) continue; /* Absorb gold */ if (o_ptr->tval == TV_GOLD) { /* Count the gold */ slide = TRUE; p_ptr->au += o_ptr->pval[DEFAULT_PVAL]; } /* Scan the items above that item */ else for (j = 0; j < i; j++) { /* Get the item */ j_ptr = &p_ptr->inventory[j]; /* Skip empty items */ if (!j_ptr->kind) continue; /* Can we drop "o_ptr" onto "j_ptr"? */ if (object_similar(j_ptr, o_ptr, OSTACK_PACK)) { display_message = TRUE; slide = TRUE; redraw = TRUE; object_absorb(j_ptr, o_ptr); break; } else if (inventory_can_stack_partial(j_ptr, o_ptr, OSTACK_PACK)) { display_message = FALSE; /* Setting this to TRUE spams the combine message. */ slide = FALSE; redraw = TRUE; object_absorb_partial(j_ptr, o_ptr); break; } } /* Compact the inventory */ if (slide) { /* One object is gone */ p_ptr->inven_cnt--; /* Slide everything down */ for (k = i; k < INVEN_PACK; k++) { /* Hack -- slide object */ COPY(&p_ptr->inventory[k], &p_ptr->inventory[k+1], object_type); /* Update object_idx if necessary */ if (tracked_object_is(k+1)) { track_object(k); } } /* Hack -- wipe hole */ object_wipe(&p_ptr->inventory[k]); redraw = TRUE; } } /* Redraw stuff */ if (redraw) p_ptr->redraw |= (PR_INVEN); /* Message */ if (display_message) { msg("You combine some items in your pack."); /* Stop "repeat last command" from working. */ cmd_disable_repeat(); } } /* * Reorder items in the pack * * Note special handling of the "overflow" slot */ void reorder_pack(void) { int i, j, k; object_type *o_ptr; object_type *i_ptr; object_type object_type_body; bool flag = FALSE; /* Re-order the pack (forwards) */ for (i = 0; i < INVEN_PACK; i++) { /* Get the item */ o_ptr = &p_ptr->inventory[i]; /* Skip empty slots */ if (!o_ptr->kind) continue; j = inventory_slot_for_object(o_ptr, INVEN_PACK); /* Never move down */ if (j >= i) continue; /* Take note */ flag = TRUE; /* Get local object */ i_ptr = &object_type_body; /* Save a copy of the moving item */ object_copy(i_ptr, &p_ptr->inventory[i]); /* Slide the objects */ for (k = i; k > j; k--) { /* Slide the item */ object_copy(&p_ptr->inventory[k], &p_ptr->inventory[k-1]); /* Update object_idx if necessary */ if (tracked_object_is(k-1)) { track_object(k); } } /* Insert the moving item */ object_copy(&p_ptr->inventory[j], i_ptr); /* Update object_idx if necessary */ if (tracked_object_is(i)) { track_object(j); } /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN); } if (flag) { msg("You reorder some items in your pack."); /* Stop "repeat last command" from working. */ cmd_disable_repeat(); } } /* *Returns the number of times in 1000 that @ will FAIL * - thanks to Ed Graham for the formula */ int get_use_device_chance(const object_type *o_ptr) { int lev, fail, numerator, denominator; int skill = p_ptr->state.skills[SKILL_DEVICE]; int skill_min = 10; int skill_max = 141; int diff_min = 1; int diff_max = 100; /* Extract the item level, which is the difficulty rating */ if (o_ptr->artifact) lev = o_ptr->artifact->level; else lev = o_ptr->kind->level; /* TODO: maybe use something a little less convoluted? */ numerator = (skill - lev) - (skill_max - diff_min); denominator = (lev - skill) - (diff_max - skill_min); /* Make sure that we don't divide by zero */ if (denominator == 0) denominator = numerator > 0 ? 1 : -1; fail = (100 * numerator) / denominator; /* Ensure failure rate is between 1% and 75% */ if (fail > 750) fail = 750; if (fail < 10) fail = 10; return fail; } /* * Distribute charges of rods, staves, or wands. * * o_ptr = source item * q_ptr = target item, must be of the same type as o_ptr * amt = number of items that are transfered */ void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt) { int charge_time = randcalc(o_ptr->kind->time, 0, AVERAGE), max_time; /* * Hack -- If rods, staves, or wands are dropped, the total maximum * timeout or charges need to be allocated between the two stacks. * If all the items are being dropped, it makes for a neater message * to leave the original stack's pval alone. -LM- */ if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF)) { q_ptr->pval[DEFAULT_PVAL] = o_ptr->pval[DEFAULT_PVAL] * amt / o_ptr->number; if (amt < o_ptr->number) o_ptr->pval[DEFAULT_PVAL] -= q_ptr->pval[DEFAULT_PVAL]; } /* * Hack -- Rods also need to have their timeouts distributed. * * The dropped stack will accept all time remaining to charge up to * its maximum. */ if (o_ptr->tval == TV_ROD) { max_time = charge_time * amt; if (o_ptr->timeout > max_time) q_ptr->timeout = max_time; else q_ptr->timeout = o_ptr->timeout; if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout; } } void reduce_charges(object_type *o_ptr, int amt) { /* * Hack -- If rods or wand are destroyed, the total maximum timeout or * charges of the stack needs to be reduced, unless all the items are * being destroyed. -LM- */ if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF)) && (amt < o_ptr->number)) { o_ptr->pval[DEFAULT_PVAL] -= o_ptr->pval[DEFAULT_PVAL] * amt / o_ptr->number; } if ((o_ptr->tval == TV_ROD) && (amt < o_ptr->number)) { o_ptr->timeout -= o_ptr->timeout * amt / o_ptr->number; } } int number_charging(const object_type *o_ptr) { int charge_time, num_charging; random_value timeout; /* Artifacts have a special timeout */ if (o_ptr->artifact) timeout = o_ptr->artifact->time; else timeout = o_ptr->kind->time; charge_time = randcalc(timeout, 0, AVERAGE); /* Item has no timeout */ if (charge_time <= 0) return 0; /* No items are charging */ if (o_ptr->timeout <= 0) return 0; /* Calculate number charging based on timeout */ num_charging = (o_ptr->timeout + charge_time - 1) / charge_time; /* Number charging cannot exceed stack size */ if (num_charging > o_ptr->number) num_charging = o_ptr->number; return num_charging; } bool recharge_timeout(object_type *o_ptr) { int charging_before, charging_after; /* Find the number of charging items */ charging_before = number_charging(o_ptr); /* Nothing to charge */ if (charging_before == 0) return FALSE; /* Decrease the timeout */ o_ptr->timeout -= MIN(charging_before, o_ptr->timeout); /* Find the new number of charging items */ charging_after = number_charging(o_ptr); /* Return true if at least 1 item obtained a charge */ if (charging_after < charging_before) return TRUE; else return FALSE; } /* * Looks if "inscrip" is present on the given object. */ unsigned check_for_inscrip(const object_type *o_ptr, const char *inscrip) { unsigned i = 0; const char *s; if (!o_ptr->note) return 0; s = quark_str(o_ptr->note); do { s = strstr(s, inscrip); if (!s) break; i++; s++; } while (s); return i; } /*** Object kind lookup functions ***/ /** * Return the object kind with the given `tval` and `sval`, or NULL. */ object_kind *lookup_kind(int tval, int sval) { int k; /* Look for it */ for (k = 0; k < z_info->k_max; k++) { object_kind *kind = &k_info[k]; if (kind->tval == tval && kind->sval == sval) return kind; } /* Failure */ msg("No object: %d:%d (%s)", tval, sval, tval_find_name(tval)); return NULL; } struct object_kind *objkind_get(int tval, int sval) { return lookup_kind(tval, sval); } struct object_kind *objkind_byid(int kidx) { if (kidx < 1 || kidx > z_info->k_max) return NULL; return &k_info[kidx]; } /*** Textual<->numeric conversion ***/ /** * List of { tval, name } pairs. */ static const grouper tval_names[] = { { TV_CHEST, "chest" }, { TV_SHOT, "shot" }, { TV_ARROW, "arrow" }, { TV_BOLT, "bolt" }, { TV_BOW, "bow" }, { TV_DIGGING, "digger" }, { TV_HAFTED, "hafted" }, { TV_POLEARM, "polearm" }, { TV_SWORD, "sword" }, { TV_BOOTS, "boots" }, { TV_GLOVES, "gloves" }, { TV_HELM, "helm" }, { TV_CROWN, "crown" }, { TV_SHIELD, "shield" }, { TV_CLOAK, "cloak" }, { TV_SOFT_ARMOR, "soft armor" }, { TV_SOFT_ARMOR, "soft armour" }, { TV_HARD_ARMOR, "hard armor" }, { TV_HARD_ARMOR, "hard armour" }, { TV_DRAG_ARMOR, "dragon armor" }, { TV_DRAG_ARMOR, "dragon armour" }, { TV_LIGHT, "light" }, { TV_AMULET, "amulet" }, { TV_RING, "ring" }, { TV_STAFF, "staff" }, { TV_WAND, "wand" }, { TV_ROD, "rod" }, { TV_SCROLL, "scroll" }, { TV_POTION, "potion" }, { TV_FLASK, "flask" }, { TV_FOOD, "food" }, { TV_MAGIC_BOOK, "magic book" }, { TV_PRAYER_BOOK, "prayer book" }, { TV_GOLD, "gold" }, }; /** * Return the k_idx of the object kind with the given `tval` and name `name`. */ int lookup_name(int tval, const char *name) { int k; /* Look for it */ for (k = 1; k < z_info->k_max; k++) { object_kind *k_ptr = &k_info[k]; char cmp_name[1024]; if (!k_ptr || !k_ptr->name) continue; obj_desc_name_format(cmp_name, sizeof cmp_name, 0, k_ptr->name, 0, FALSE); /* Found a match */ if (k_ptr->tval == tval && !my_stricmp(cmp_name, name)) return k; } msg("No object (\"%s\",\"%s\")", tval_find_name(tval), name); return -1; } /** * Return the a_idx of the artifact with the given name */ int lookup_artifact_name(const char *name) { int i; int a_idx = -1; /* Look for it */ for (i = 1; i < z_info->a_max; i++) { artifact_type *a_ptr = &a_info[i]; /* Test for equality */ if (a_ptr->name && streq(name, a_ptr->name)) return i; /* Test for close matches */ if (strlen(name) >= 3 && a_ptr->name && my_stristr(a_ptr->name, name) && a_idx == -1) a_idx = i; } /* Return our best match */ return a_idx; } /** * Return the numeric sval of the object kind with the given `tval` and name `name`. */ int lookup_sval(int tval, const char *name) { int k; unsigned int r; if (sscanf(name, "%u", &r) == 1) return r; /* Look for it */ for (k = 1; k < z_info->k_max; k++) { object_kind *k_ptr = &k_info[k]; char cmp_name[1024]; if (!k_ptr || !k_ptr->name) continue; obj_desc_name_format(cmp_name, sizeof cmp_name, 0, k_ptr->name, 0, FALSE); /* Found a match */ if (k_ptr->tval == tval && !my_stricmp(cmp_name, name)) return k_ptr->sval; } return -1; } /** * Returns the numeric equivalent tval of the textual tval `name`. */ int tval_find_idx(const char *name) { size_t i = 0; unsigned int r; if (sscanf(name, "%u", &r) == 1) return r; for (i = 0; i < N_ELEMENTS(tval_names); i++) { if (!my_stricmp(name, tval_names[i].name)) return tval_names[i].tval; } return -1; } /** * Returns the textual equivalent tval of the numeric tval `name`. */ const char *tval_find_name(int tval) { size_t i = 0; for (i = 0; i < N_ELEMENTS(tval_names); i++) { if (tval == tval_names[i].tval) return tval_names[i].name; } return "unknown"; } /** * Sort comparator for objects using only tval and sval. * -1 if o1 should be first * 1 if o2 should be first * 0 if it doesn't matter */ static int compare_types(const object_type *o1, const object_type *o2) { if (o1->tval == o2->tval) return CMP(o1->sval, o2->sval); else return CMP(o1->tval, o2->tval); } /** * Sort comparator for objects * -1 if o1 should be first * 1 if o2 should be first * 0 if it doesn't matter * * The sort order is designed with the "list items" command in mind. */ int compare_items(const object_type *o1, const object_type *o2) { /* unknown objects go at the end, order doesn't matter */ if (is_unknown(o1) || is_unknown(o2)) { if (!is_unknown(o1)) return -1; return 1; } /* known artifacts will sort first */ if (object_is_known_artifact(o1) && object_is_known_artifact(o2)) return compare_types(o1, o2); if (object_is_known_artifact(o1)) return -1; if (object_is_known_artifact(o2)) return 1; /* unknown objects will sort next */ if (!object_flavor_is_aware(o1) && !object_flavor_is_aware(o2)) return compare_types(o1, o2); if (!object_flavor_is_aware(o1)) return -1; if (!object_flavor_is_aware(o2)) return 1; /* if only one of them is worthless, the other comes first */ if (o1->kind->cost == 0 && o2->kind->cost != 0) return 1; if (o1->kind->cost != 0 && o2->kind->cost == 0) return -1; /* otherwise, just compare tvals and svals */ /* NOTE: arguably there could be a better order than this */ return compare_types(o1, o2); } /** * Helper to draw the Object Recall subwindow; this actually does the work. */ static void display_object_recall(object_type *o_ptr) { char header[120]; textblock *tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); clear_from(0); textui_textblock_place(tb, SCREEN_REGION, header); textblock_free(tb); } /** * This draws the Object Recall subwindow when displaying a particular object * (e.g. a helmet in the backpack, or a scroll on the ground) */ void display_object_idx_recall(s16b item) { object_type *o_ptr = object_from_item_idx(item); display_object_recall(o_ptr); } /** * This draws the Object Recall subwindow when displaying a recalled item kind * (e.g. a generic ring of acid or a generic blade of chaos) */ void display_object_kind_recall(struct object_kind *kind) { object_type object = { 0 }; object_prep(&object, kind, 0, EXTREMIFY); if (kind->aware) object.ident |= IDENT_STORE; display_object_recall(&object); } /** * Display object recall modally and wait for a keypress. * * This is set up for use in look mode (see target_set_interactive_aux()). * * \param o_ptr is the object to be described. */ void display_object_recall_interactive(object_type *o_ptr) { char header[120]; textblock *tb; message_flush(); tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL); textui_textblock_show(tb, SCREEN_REGION, header); textblock_free(tb); } /* Basic tval testers */ bool obj_is_staff(const object_type *o_ptr) { return o_ptr->tval == TV_STAFF; } bool obj_is_wand(const object_type *o_ptr) { return o_ptr->tval == TV_WAND; } bool obj_is_rod(const object_type *o_ptr) { return o_ptr->tval == TV_ROD; } bool obj_is_potion(const object_type *o_ptr) { return o_ptr->tval == TV_POTION; } bool obj_is_scroll(const object_type *o_ptr) { return o_ptr->tval == TV_SCROLL; } bool obj_is_food(const object_type *o_ptr) { return o_ptr->tval == TV_FOOD; } bool obj_is_light(const object_type *o_ptr) { return o_ptr->tval == TV_LIGHT; } bool obj_is_ring(const object_type *o_ptr) { return o_ptr->tval == TV_RING; } /** * Determine whether an object is ammo * * \param o_ptr is the object to check */ bool obj_is_ammo(const object_type *o_ptr) { switch (o_ptr->tval) { case TV_SHOT: case TV_ARROW: case TV_BOLT: return TRUE; default: return FALSE; } } /* Determine if an object has charges */ bool obj_has_charges(const object_type *o_ptr) { if (o_ptr->tval != TV_WAND && o_ptr->tval != TV_STAFF) return FALSE; if (o_ptr->pval[DEFAULT_PVAL] <= 0) return FALSE; return TRUE; } /* Determine if an object is zappable */ bool obj_can_zap(const object_type *o_ptr) { /* Any rods not charging? */ if (o_ptr->tval == TV_ROD && number_charging(o_ptr) < o_ptr->number) return TRUE; return FALSE; } /* Determine if an object is activatable */ bool obj_is_activatable(const object_type *o_ptr) { return object_effect(o_ptr) ? TRUE : FALSE; } /* Determine if an object can be activated now */ bool obj_can_activate(const object_type *o_ptr) { if (obj_is_activatable(o_ptr)) { /* Check the recharge */ if (!o_ptr->timeout) return TRUE; } return FALSE; } /** * Check if an object can be used to refuel other objects. */ bool obj_can_refill(const object_type *obj) { const object_type *light = &p_ptr->inventory[INVEN_LIGHT]; bitflag flags[OF_SIZE]; bool no_fuel; /* Get flags */ object_flags(obj, flags); no_fuel = of_has(flags, OF_NO_FUEL) ? TRUE : FALSE; /* A lantern can be refueled from a flask or another lantern */ if (light->sval == SV_LIGHT_LANTERN) { if (obj->tval == TV_FLASK) return TRUE; else if (obj->tval == TV_LIGHT && obj->sval == SV_LIGHT_LANTERN && obj->timeout > 0 && !no_fuel) return TRUE; } return FALSE; } bool obj_can_browse(const object_type *o_ptr) { return o_ptr->tval == p_ptr->class->spell_book; } bool obj_can_cast_from(const object_type *o_ptr) { return obj_can_browse(o_ptr) && spell_book_count_spells(o_ptr, spell_okay_to_cast) > 0; } bool obj_can_study(const object_type *o_ptr) { return obj_can_browse(o_ptr) && spell_book_count_spells(o_ptr, spell_okay_to_study) > 0; } /* Can only take off non-cursed items */ bool obj_can_takeoff(const object_type *o_ptr) { return !cursed_p((bitflag *)o_ptr->flags); } /* Can only put on wieldable items */ bool obj_can_wear(const object_type *o_ptr) { return (wield_slot(o_ptr) >= INVEN_WIELD); } /* Can only fire an item with the right tval */ bool obj_can_fire(const object_type *o_ptr) { return o_ptr->tval == p_ptr->state.ammo_tval; } /* Can has inscrip pls */ bool obj_has_inscrip(const object_type *o_ptr) { return (o_ptr->note ? TRUE : FALSE); } bool obj_is_useable(const object_type *o_ptr) { if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_SCROLL) || (o_ptr->tval == TV_POTION) || (o_ptr->tval == TV_FOOD)) { return TRUE; } if (object_effect(o_ptr)) return TRUE; if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT)) { return o_ptr->tval == p_ptr->state.ammo_tval; } return FALSE; } bool obj_is_used_aimed(const object_type *o_ptr) { //return obj_needs_aim(o_ptr); int effect; if (o_ptr->tval == TV_WAND) { return TRUE; } if (o_ptr->tval == TV_ROD && !object_flavor_is_aware(o_ptr)) { return TRUE; } if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT)) { return o_ptr->tval == p_ptr->state.ammo_tval; } effect = object_effect(o_ptr); if (effect && effect_aim(effect)) { return TRUE; } return FALSE; } bool obj_is_used_unaimed(const object_type *o_ptr) { int effect; if ((o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_SCROLL) || (o_ptr->tval == TV_POTION) || (o_ptr->tval == TV_FOOD)) { return TRUE; } if ((o_ptr->tval == TV_ROD) && !(!object_flavor_is_aware(o_ptr))) { return TRUE; } if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT)) { return FALSE; } effect = object_effect(o_ptr); if (!effect || !effect_aim(effect)) { return TRUE; } return FALSE; } /*** Generic utility functions ***/ /* * Return an object's effect. */ u16b object_effect(const object_type *o_ptr) { if (o_ptr->artifact) return o_ptr->artifact->effect; else return o_ptr->kind->effect; } /* Get an o_ptr from an item number */ object_type *object_from_item_idx(int item) { if (item >= 0) return &p_ptr->inventory[item]; else return object_byid(0 - item); } /** * Return TRUE if the two objects are the same. Equality can be either be by value or by * identity (memory address). Value comparison is strict; all values must be equal. */ bool object_equals_object(const object_type *a, const object_type *b) { int i; if (a == b) return TRUE; #define MUST_EQUAL(p) if (a->p != b->p) return FALSE; MUST_EQUAL(kind); MUST_EQUAL(ego); MUST_EQUAL(artifact); MUST_EQUAL(iy); MUST_EQUAL(ix); MUST_EQUAL(tval); MUST_EQUAL(sval); MUST_EQUAL(num_pvals); MUST_EQUAL(weight); MUST_EQUAL(ident); MUST_EQUAL(ac); MUST_EQUAL(to_a); MUST_EQUAL(to_h); MUST_EQUAL(to_d); MUST_EQUAL(dd); MUST_EQUAL(ds); MUST_EQUAL(timeout); MUST_EQUAL(number); MUST_EQUAL(marked); MUST_EQUAL(ignore); MUST_EQUAL(next_o_idx); MUST_EQUAL(held_m_idx); MUST_EQUAL(mimicking_m_idx); MUST_EQUAL(origin); MUST_EQUAL(origin_depth); MUST_EQUAL(origin_xtra); MUST_EQUAL(note); #undef MUST_EQUAL for (i = 0; i < MAX_PVALS; i++) { if (a->pval[i] != b->pval[i]) return FALSE; if (!of_is_equal((const bitflag *)&a->pval_flags[i], (const bitflag *)&b->pval_flags[i])) return FALSE; } if (!of_is_equal((const bitflag *)&a->flags, (const bitflag *)&b->flags)) return FALSE; if (!of_is_equal((const bitflag *)&a->known_flags, (const bitflag *)&b->known_flags)) return FALSE; return TRUE; } /** * Return the inventory index of an object that matches the given object. * * \returns A valid inventory index or -1 if the object cannot be found. */ int inventory_index_matching_object(const object_type *o_ptr) { int i; for (i = 0; i < ALL_INVEN_TOTAL; i++) { if (object_equals_object(o_ptr, &p_ptr->inventory[i])) return i; } return -1; } /* * Does the given object need to be aimed? */ bool obj_needs_aim(object_type *o_ptr) { int effect = object_effect(o_ptr); /* If the effect needs aiming, or if the object type needs aiming, this object needs aiming. */ return effect_aim(effect) || o_ptr->tval == TV_BOLT || o_ptr->tval == TV_SHOT || o_ptr->tval == TV_ARROW || o_ptr->tval == TV_WAND || (o_ptr->tval == TV_ROD && !object_flavor_is_aware(o_ptr)); } /* * Can the object fail if used? */ bool obj_can_fail(const struct object *o) { switch (o->tval) { case TV_STAFF: case TV_WAND: case TV_ROD: return TRUE; default: return wield_slot(o) == -1 ? FALSE : TRUE; } } /* * Verify the "okayness" of a given item. * * The item can be negative to mean "item on floor". */ bool get_item_okay(int item) { /* Verify the item */ return (item_tester_okay(object_from_item_idx(item))); } /* * Get a list of "valid" item indexes. * * Fills item_list[] with items that are "okay" as defined by the * current item_tester_hook, etc. mode determines what combination of * inventory, equipment and player's floor location should be used * when drawing up the list. * * Returns the number of items placed into the list. * * Maximum space that can be used is [INVEN_TOTAL + MAX_FLOOR_STACK], * though practically speaking much smaller numbers are likely. */ int scan_items(int *item_list, size_t item_list_max, int mode) { bool use_inven = ((mode & USE_INVEN) ? TRUE : FALSE); bool use_equip = ((mode & USE_EQUIP) ? TRUE : FALSE); bool use_floor = ((mode & USE_FLOOR) ? TRUE : FALSE); int floor_list[MAX_FLOOR_STACK]; int floor_num; int i; size_t item_list_num = 0; if (use_inven) { for (i = 0; i < INVEN_PACK && item_list_num < item_list_max; i++) { if (get_item_okay(i)) item_list[item_list_num++] = i; } } if (use_equip) { for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL && item_list_num < item_list_max; i++) { if (get_item_okay(i)) item_list[item_list_num++] = i; } } /* Scan all non-gold objects in the grid */ if (use_floor) { floor_num = scan_floor(floor_list, N_ELEMENTS(floor_list), p_ptr->py, p_ptr->px, 0x0B); for (i = 0; i < floor_num && item_list_num < item_list_max; i++) { if (get_item_okay(-floor_list[i])) item_list[item_list_num++] = -floor_list[i]; } } /* Forget the item_tester_tval and item_tester_hook restrictions */ item_tester_tval = 0; item_tester_hook = NULL; return item_list_num; } /* * Check if the given item is available for the player to use. * * 'mode' defines which areas we should look at, a la scan_items(). */ bool item_is_available(int item, bool (*tester)(const object_type *), int mode) { int item_list[ALL_INVEN_TOTAL + MAX_FLOOR_STACK]; int item_num; int i; item_tester_hook = tester; item_tester_tval = 0; item_num = scan_items(item_list, N_ELEMENTS(item_list), mode); for (i = 0; i < item_num; i++) { if (item_list[i] == item) return TRUE; } return FALSE; } /* * Returns whether the pack is holding the maximum number of items. The max * size is INVEN_MAX_PACK, which is a macro since quiver size affects slots * available. */ bool pack_is_full(void) { return p_ptr->inventory[INVEN_MAX_PACK - 1].kind ? TRUE : FALSE; } /* * Returns whether the pack is holding the more than the maximum number of * items. The max size is INVEN_MAX_PACK, which is a macro since quiver size * affects slots available. If this is true, calling pack_overflow() will * trigger a pack overflow. */ bool pack_is_overfull(void) { return p_ptr->inventory[INVEN_MAX_PACK].kind ? TRUE : FALSE; } /* * Overflow an item from the pack, if it is overfull. */ void pack_overflow(void) { int item = INVEN_MAX_PACK; char o_name[80]; object_type *o_ptr; if (!pack_is_overfull()) return; /* Get the slot to be dropped */ o_ptr = &p_ptr->inventory[item]; /* Disturbing */ disturb(p_ptr, 0, 0); /* Warning */ msg("Your pack overflows!"); /* Describe */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Message */ msg("You drop %s (%c).", o_name, index_to_label(item)); /* Drop it (carefully) near the player */ drop_near(cave, o_ptr, 0, p_ptr->py, p_ptr->px, FALSE); /* Modify, Describe, Optimize */ inven_item_increase(item, -255); inven_item_describe(item); inven_item_optimize(item); /* Notice stuff (if needed) */ if (p_ptr->notice) notice_stuff(p_ptr); /* Update stuff (if needed) */ if (p_ptr->update) update_stuff(p_ptr); /* Redraw stuff (if needed) */ if (p_ptr->redraw) redraw_stuff(p_ptr); } struct object *object_byid(s16b oidx) { assert(oidx >= 0); assert(oidx <= z_info->o_max); return &o_list[oidx]; } void objects_init(void) { o_list = C_ZNEW(z_info->o_max, struct object); } void objects_destroy(void) { mem_free(o_list); } angband-3.5.1/src/object/obj-info.c0000644000175000017500000011050212456456606016343 0ustar chriscchrisc/** * File: obj-info.c * Purpose: Object description code. * * Copyright (c) 2010 Andi Sidwell * Copyright (c) 2004 Robert Ruehlmann * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "effects.h" #include "cmds.h" #include "object/tvalsval.h" #include "z-textblock.h" #include "object/slays.h" #include "object/pval.h" /* * Describes a flag-name pair. */ typedef struct { int flag; const char *name; } flag_type; /*** Utility code ***/ /* * Given an array of strings, as so: * { "intelligence", "fish", "lens", "prime", "number" }, * * ... output a list like "intelligence, fish, lens, prime, number.\n". */ static void info_out_list(textblock *tb, const char *list[], size_t count) { size_t i; for (i = 0; i < count; i++) { textblock_append(tb, list[i]); if (i != (count - 1)) textblock_append(tb, ", "); } textblock_append(tb, ".\n"); } /* * */ static size_t info_collect(textblock *tb, const flag_type list[], size_t max, const bitflag flags[OF_SIZE], const char *recepticle[]) { size_t i, count = 0; for (i = 0; i < max; i++) { if (of_has(flags, list[i].flag)) recepticle[count++] = list[i].name; } return count; } /*** Big fat data tables ***/ static const flag_type pval_flags[] = { { OF_STR, "strength" }, { OF_INT, "intelligence" }, { OF_WIS, "wisdom" }, { OF_DEX, "dexterity" }, { OF_CON, "constitution" }, { OF_STEALTH, "stealth" }, { OF_INFRA, "infravision" }, { OF_TUNNEL, "tunneling" }, { OF_SPEED, "speed" }, { OF_BLOWS, "attack speed" }, { OF_SHOTS, "shooting speed" }, { OF_MIGHT, "shooting power" }, }; static const flag_type immunity_flags[] = { { OF_IM_ACID, "acid" }, { OF_IM_ELEC, "lightning" }, { OF_IM_FIRE, "fire" }, { OF_IM_COLD, "cold" }, }; static const flag_type vuln_flags[] = { { OF_VULN_ACID, "acid" }, { OF_VULN_ELEC, "electricity" }, { OF_VULN_FIRE, "fire" }, { OF_VULN_COLD, "cold" }, }; static const flag_type resist_flags[] = { { OF_RES_ACID, "acid" }, { OF_RES_ELEC, "lightning" }, { OF_RES_FIRE, "fire" }, { OF_RES_COLD, "cold" }, { OF_RES_POIS, "poison" }, { OF_RES_LIGHT, "light" }, { OF_RES_DARK, "dark" }, { OF_RES_SOUND, "sound" }, { OF_RES_SHARD, "shards" }, { OF_RES_NEXUS, "nexus" }, { OF_RES_NETHR, "nether" }, { OF_RES_CHAOS, "chaos" }, { OF_RES_DISEN, "disenchantment" }, }; static const flag_type protect_flags[] = { { OF_RES_FEAR, "fear" }, { OF_RES_BLIND, "blindness" }, { OF_RES_CONFU, "confusion" }, { OF_RES_STUN, "stunning" }, }; static const flag_type ignore_flags[] = { { OF_IGNORE_ACID, "acid" }, { OF_IGNORE_ELEC, "electricity" }, { OF_IGNORE_FIRE, "fire" }, { OF_IGNORE_COLD, "cold" }, }; static const flag_type hates_flags[] = { { OF_HATES_ACID, "acid" }, { OF_HATES_ELEC, "electricity" }, { OF_HATES_FIRE, "fire" }, { OF_HATES_COLD, "cold" }, }; static const flag_type sustain_flags[] = { { OF_SUST_STR, "strength" }, { OF_SUST_INT, "intelligence" }, { OF_SUST_WIS, "wisdom" }, { OF_SUST_DEX, "dexterity" }, { OF_SUST_CON, "constitution" }, }; static const flag_type misc_flags[] = { { OF_BLESSED, "Blessed by the gods" }, { OF_SLOW_DIGEST, "Slows your metabolism" }, { OF_IMPAIR_HP, "Impairs hitpoint recovery" }, { OF_IMPAIR_MANA, "Impairs mana recovery" }, { OF_AFRAID, "Makes you afraid of melee, and worse at shooting and casting spells" }, { OF_FEATHER, "Feather Falling" }, { OF_REGEN, "Speeds regeneration" }, { OF_FREE_ACT, "Prevents paralysis" }, { OF_HOLD_LIFE, "Sustains your life force" }, { OF_TELEPATHY, "Grants telepathy" }, { OF_SEE_INVIS, "Grants the ability to see invisible things" }, { OF_AGGRAVATE, "Aggravates creatures nearby" }, { OF_DRAIN_EXP, "Drains experience" }, { OF_TELEPORT, "Induces random teleportation" }, }; /*** Code that makes use of the data tables ***/ /* * Describe an item's curses. */ static bool describe_curses(textblock *tb, const object_type *o_ptr, const bitflag flags[OF_SIZE]) { if (of_has(flags, OF_PERMA_CURSE)) textblock_append_c(tb, TERM_L_RED, "Permanently cursed.\n"); else if (of_has(flags, OF_HEAVY_CURSE)) textblock_append_c(tb, TERM_L_RED, "Heavily cursed.\n"); else if (of_has(flags, OF_LIGHT_CURSE)) textblock_append_c(tb, TERM_L_RED, "Cursed.\n"); else return FALSE; return TRUE; } /* * Describe stat modifications. */ static bool describe_stats(textblock *tb, const object_type *o_ptr, bitflag flags[MAX_PVALS][OF_SIZE], oinfo_detail_t mode) { const char *descs[N_ELEMENTS(pval_flags)]; size_t count = 0, i; bool full = mode & OINFO_FULL; bool dummy = mode & OINFO_DUMMY; bool search = FALSE; if (!o_ptr->num_pvals && !dummy) return FALSE; for (i = 0; i < o_ptr->num_pvals; i++) { count = info_collect(tb, pval_flags, N_ELEMENTS(pval_flags), flags[i], descs); if (count) { if ((object_this_pval_is_visible(o_ptr, i) || full) && !dummy) textblock_append_c(tb, (o_ptr->pval[i] > 0) ? TERM_L_GREEN : TERM_RED, "%+i ", o_ptr->pval[i]); else textblock_append(tb, "Affects your "); info_out_list(tb, descs, count); } if (of_has(flags[i], OF_SEARCH)) search = TRUE; } if (search) { if ((object_this_pval_is_visible(o_ptr, which_pval(o_ptr, OF_SEARCH)) || full) && !dummy) { textblock_append_c(tb, (o_ptr->pval[which_pval(o_ptr, OF_SEARCH)] > 0) ? TERM_L_GREEN : TERM_RED, "%+i%% ", o_ptr->pval[which_pval(o_ptr, OF_SEARCH)] * 5); textblock_append(tb, "to searching.\n"); } else if (count) textblock_append(tb, "Also affects your searching skill.\n"); else textblock_append(tb, "Affects your searching skill.\n"); } return TRUE; } /* * Describe immunities granted by an object. */ static bool describe_immune(textblock *tb, const bitflag flags[OF_SIZE]) { const char *i_descs[N_ELEMENTS(immunity_flags)]; const char *r_descs[N_ELEMENTS(resist_flags)]; const char *p_descs[N_ELEMENTS(protect_flags)]; const char *v_descs[N_ELEMENTS(vuln_flags)]; size_t count; bool prev = FALSE; /* Immunities */ count = info_collect(tb, immunity_flags, N_ELEMENTS(immunity_flags), flags, i_descs); if (count) { textblock_append(tb, "Provides immunity to "); info_out_list(tb, i_descs, count); prev = TRUE; } /* Resistances */ count = info_collect(tb, resist_flags, N_ELEMENTS(resist_flags), flags, r_descs); if (count) { textblock_append(tb, "Provides resistance to "); info_out_list(tb, r_descs, count); prev = TRUE; } /* Protections */ count = info_collect(tb, protect_flags, N_ELEMENTS(protect_flags), flags, p_descs); if (count) { textblock_append(tb, "Provides protection from "); info_out_list(tb, p_descs, count); prev = TRUE; } /* Vulnerabilities */ count = info_collect(tb, vuln_flags, N_ELEMENTS(vuln_flags), flags, v_descs); if (count) { textblock_append(tb, "Makes you vulnerable to "); info_out_list(tb, v_descs, count); prev = TRUE; } return prev; } /* * Describe IGNORE_ flags of an object. */ static bool describe_ignores(textblock *tb, const bitflag flags[OF_SIZE]) { const char *descs[N_ELEMENTS(ignore_flags)]; size_t count = info_collect(tb, ignore_flags, N_ELEMENTS(ignore_flags), flags, descs); if (!count) return FALSE; textblock_append(tb, "Cannot be harmed by "); info_out_list(tb, descs, count); return TRUE; } /* * Describe HATES_ flags of an object. */ static bool describe_hates(textblock *tb, const bitflag flags[OF_SIZE]) { const char *descs[N_ELEMENTS(hates_flags)]; size_t count = info_collect(tb, hates_flags, N_ELEMENTS(hates_flags), flags, descs); if (!count) return FALSE; textblock_append(tb, "Can be destroyed by "); info_out_list(tb, descs, count); return TRUE; } /* * Describe stat sustains. */ static bool describe_sustains(textblock *tb, const bitflag flags[OF_SIZE]) { const char *descs[N_ELEMENTS(sustain_flags)]; size_t count = info_collect(tb, sustain_flags, N_ELEMENTS(sustain_flags), flags, descs); if (!count) return FALSE; textblock_append(tb, "Sustains "); info_out_list(tb, descs, count); return TRUE; } /* * Describe miscellaneous powers. */ static bool describe_misc_magic(textblock *tb, const bitflag flags[OF_SIZE]) { size_t i; bool printed = FALSE; for (i = 0; i < N_ELEMENTS(misc_flags); i++) { if (of_has(flags, misc_flags[i].flag)) { textblock_append(tb, "%s. ", misc_flags[i].name); printed = TRUE; } } if (printed) textblock_append(tb, "\n"); return printed; } /* * Describe slays and brands on weapons */ static bool describe_slays(textblock *tb, const bitflag flags[OF_SIZE], int tval) { bool printed = FALSE; const char *slay_descs[SL_MAX] = { 0 }; bitflag slay_mask[OF_SIZE], kill_mask[OF_SIZE], brand_mask[OF_SIZE]; size_t count; bool fulldesc; create_mask(slay_mask, FALSE, OFT_SLAY, OFT_MAX); create_mask(kill_mask, FALSE, OFT_KILL, OFT_MAX); create_mask(brand_mask, FALSE, OFT_BRAND, OFT_MAX); if (tval == TV_SWORD || tval == TV_HAFTED || tval == TV_POLEARM || tval == TV_DIGGING || tval == TV_BOW || tval == TV_SHOT || tval == TV_ARROW || tval == TV_BOLT || tval == TV_FLASK) fulldesc = FALSE; else fulldesc = TRUE; /* Slays */ count = list_slays(flags, slay_mask, slay_descs, NULL, NULL, TRUE); if (count) { if (fulldesc) textblock_append(tb, "It causes your melee attacks to slay "); else textblock_append(tb, "Slays "); info_out_list(tb, slay_descs, count); printed = TRUE; } /* Kills */ count = list_slays(flags, kill_mask, slay_descs, NULL, NULL, TRUE); if (count) { if (fulldesc) textblock_append(tb, "It causes your melee attacks to *slay* "); else textblock_append(tb, "*Slays* "); info_out_list(tb, slay_descs, count); printed = TRUE; } /* Brands */ count = list_slays(flags, brand_mask, NULL, slay_descs, NULL, TRUE); if (count) { if (fulldesc) textblock_append(tb, "It brands your melee attacks with "); else textblock_append(tb, "Branded with "); info_out_list(tb, slay_descs, count); printed = TRUE; } return printed; } /* * Account for criticals in the calculation of melee prowess * * Note -- This relies on the criticals being an affine function * of previous damage, since we are used to transform the mean * of a roll. * * Also note -- rounding error makes this not completely accurate * (but for the big crit weapons like Grond an odd point of damage * won't be missed) * * This code written according to the KISS principle. 650 adds * are cheaper than a FOV call and get the job done fine. */ static void calculate_melee_crits(player_state *state, int weight, int plus, int *mult, int *add, int *div) { int k, to_crit = weight + 5*(state->to_h + plus) + 3*p_ptr->lev; to_crit = MIN(5000, MAX(0, to_crit)); *mult = *add = 0; for (k = weight; k < weight + 650; k++) { if (k < 400) { *mult += 4; *add += 10; continue; } if (k < 700) { *mult += 4; *add += 20; continue; } if (k < 900) { *mult += 6; *add += 30; continue; } if (k < 1300) { *mult += 6; *add += 40; continue; } *mult += 7; *add += 50; } /* * Scale the output down to a more reasonable size, to prevent * integer overflow downstream. */ *mult = 100 + to_crit*(*mult - 1300)/(50*1300); *add = *add * to_crit / (500*50); *div = 100; } /* * Missile crits follow the same approach as melee crits. */ static void calculate_missile_crits(player_state *state, int weight, int plus, int *mult, int *add, int *div) { int k, to_crit = weight + 4*(state->to_h + plus) + 2*p_ptr->lev; to_crit = MIN(5000, MAX(0, to_crit)); *mult = *add = 0; for (k = weight; k < weight + 500; k++) { if (k < 500) { *mult += 2; *add += 5; continue; } if (k < 1000) { *mult += 2; *add += 10; continue; } *mult += 3; *add += 15; } *mult = 100 + to_crit*(*mult - 500)/(500*50); *add = *add * to_crit / (500*50); *div = 100; } /* * Describe blows. */ static bool describe_blows(textblock *tb, const object_type *o_ptr, player_state state, bitflag f[OF_SIZE]) { int str_plus, dex_plus, old_blows = 0, new_blows, extra_blows; int str_faster = -1, str_done = -1; int dex_plus_bound; int str_plus_bound; int i; bitflag tmp_f[OF_SIZE]; dex_plus_bound = STAT_RANGE - state.stat_ind[A_DEX]; str_plus_bound = STAT_RANGE - state.stat_ind[A_STR]; /* Write to the text block */ textblock_append_c(tb, TERM_L_GREEN, "%d.%d ", state.num_blows / 100, (state.num_blows / 10) % 10); textblock_append(tb, "blow%s/round.\n", (state.num_blows > 100) ? "s" : ""); /* Check to see if extra STR or DEX would yield extra blows */ old_blows = state.num_blows; extra_blows = 0; /* First we need to look for extra blows on other items, as * state does not track these */ for (i = INVEN_BOW; i < INVEN_TOTAL; i++) { if (!p_ptr->inventory[i].kind) continue; object_flags_known(&p_ptr->inventory[i], tmp_f); if (of_has(tmp_f, OF_BLOWS)) extra_blows += p_ptr->inventory[i].pval[which_pval(&p_ptr->inventory[i], OF_BLOWS)]; } /* Then we add blows from the weapon being examined */ if (of_has(f, OF_BLOWS)) extra_blows += o_ptr->pval[which_pval(o_ptr, OF_BLOWS)]; /* Then we check for extra "real" blows */ for (dex_plus = 0; dex_plus < dex_plus_bound; dex_plus++) { for (str_plus = 0; str_plus < str_plus_bound; str_plus++) { state.stat_ind[A_STR] += str_plus; state.stat_ind[A_DEX] += dex_plus; new_blows = calc_blows(o_ptr, &state, extra_blows); /* Test to make sure that this extra blow is a * new str/dex combination, not a repeat */ if ((new_blows - new_blows % 10) > (old_blows - old_blows % 10) && (str_plus < str_done || str_done == -1)) { textblock_append(tb, "With +%d STR and +%d DEX you would get %d.%d blows\n", str_plus, dex_plus, (new_blows / 100), (new_blows / 10) % 10); state.stat_ind[A_STR] -= str_plus; state.stat_ind[A_DEX] -= dex_plus; str_done = str_plus; break; } /* If the combination doesn't increment * the displayed blows number, it might still * take a little less energy */ if (new_blows > old_blows && (str_plus < str_faster || str_faster == -1) && (str_plus < str_done || str_done == -1)) { textblock_append(tb, "With +%d STR and +%d DEX you would attack a bit faster\n", str_plus, dex_plus); state.stat_ind[A_STR] -= str_plus; state.stat_ind[A_DEX] -= dex_plus; str_faster = str_plus; continue; } state.stat_ind[A_STR] -= str_plus; state.stat_ind[A_DEX] -= dex_plus; } } return TRUE; } /* * Describe damage. */ static bool describe_damage(textblock *tb, const object_type *o_ptr, player_state state, bitflag f[OF_SIZE], oinfo_detail_t mode) { const char *desc[SL_MAX] = { 0 }; size_t i, cnt; int mult[SL_MAX]; int dice, sides, dam, total_dam, plus = 0; int xtra_postcrit = 0, xtra_precrit = 0; int crit_mult, crit_div, crit_add; int old_blows = 0; object_type *bow = &p_ptr->inventory[INVEN_BOW]; bitflag tmp_f[OF_SIZE], mask[OF_SIZE]; bool weapon = (wield_slot(o_ptr) == INVEN_WIELD); bool ammo = (p_ptr->state.ammo_tval == o_ptr->tval) && (bow->kind); int multiplier = 1; bool full = mode & OINFO_FULL; /* Create the "all slays" mask */ create_mask(mask, FALSE, OFT_SLAY, OFT_KILL, OFT_BRAND, OFT_MAX); /* Use displayed dice if real dice not known */ if (full || object_attack_plusses_are_visible(o_ptr)) { dice = o_ptr->dd; sides = o_ptr->ds; } else { dice = o_ptr->kind->dd; sides = o_ptr->kind->ds; } /* Calculate damage */ dam = ((sides + 1) * dice * 5); if (weapon) { xtra_postcrit = state.dis_to_d * 10; if (object_attack_plusses_are_visible(o_ptr) || full) { xtra_precrit += o_ptr->to_d * 10; plus += o_ptr->to_h; } calculate_melee_crits(&state, o_ptr->weight, plus, &crit_mult, &crit_add, &crit_div); old_blows = state.num_blows; } else { /* Ammo */ if (object_attack_plusses_are_visible(o_ptr) || full) plus += o_ptr->to_h; calculate_missile_crits(&p_ptr->state, o_ptr->weight, plus, &crit_mult, &crit_add, &crit_div); if (object_attack_plusses_are_visible(o_ptr) || full) dam += (o_ptr->to_d * 10); if (object_attack_plusses_are_visible(bow)) dam += (bow->to_d * 10); /* Apply brands/slays from the shooter to the ammo, but only if known * Note that this is not dependent on mode, so that viewing shop-held * ammo (fully known) does not leak information about launcher */ object_flags_known(bow, tmp_f); of_union(f, tmp_f); } /* Collect slays */ /* Melee weapons get slays and brands from other items now */ if (weapon) { bool nonweap_slay = FALSE; for (i = INVEN_LEFT; i < INVEN_TOTAL; i++) { if (!p_ptr->inventory[i].kind) continue; object_flags_known(&p_ptr->inventory[i], tmp_f); /* Strip out non-slays */ of_inter(tmp_f, mask); if (of_union(f, tmp_f)) nonweap_slay = TRUE; } if (nonweap_slay) textblock_append(tb, "This weapon may benefit from one or more off-weapon brands or slays.\n"); } textblock_append(tb, "Average damage/round: "); if (ammo) multiplier = p_ptr->state.ammo_mult; /* Output damage for creatures effected by the brands or slays */ cnt = list_slays(f, mask, desc, NULL, mult, TRUE); for (i = 0; i < cnt; i++) { /* ammo mult adds fully, melee mult is times 1, so adds 1 less */ int melee_adj_mult = ammo ? 0 : 1; /* Include bonus damage and slay in stated average */ total_dam = dam * (multiplier + mult[i] - melee_adj_mult) + xtra_precrit; total_dam = (total_dam * crit_mult + crit_add) / crit_div; total_dam += xtra_postcrit; if (weapon) total_dam = (total_dam * old_blows) / 100; else total_dam *= p_ptr->state.num_shots; if (total_dam <= 0) textblock_append_c(tb, TERM_L_RED, "%d", 0); else if (total_dam % 10) textblock_append_c(tb, TERM_L_GREEN, "%d.%d", total_dam / 10, total_dam % 10); else textblock_append_c(tb, TERM_L_GREEN, "%d", total_dam / 10); textblock_append(tb, " vs. %s, ", desc[i]); } if (cnt) textblock_append(tb, "and "); /* Include bonus damage in stated average */ total_dam = dam * multiplier + xtra_precrit; total_dam = (total_dam * crit_mult + crit_add) / crit_div; total_dam += xtra_postcrit; /* Normal damage, not considering brands or slays */ if (weapon) total_dam = (total_dam * old_blows) / 100; else total_dam *= p_ptr->state.num_shots; if (total_dam <= 0) textblock_append_c(tb, TERM_L_RED, "%d", 0); else if (total_dam % 10) textblock_append_c(tb, TERM_L_GREEN, "%d.%d", total_dam / 10, total_dam % 10); else textblock_append_c(tb, TERM_L_GREEN, "%d", total_dam / 10); if (cnt) textblock_append(tb, " vs. others"); textblock_append(tb, ".\n"); return TRUE; } /* * Describe combat advantages. */ static bool describe_combat(textblock *tb, const object_type *o_ptr, oinfo_detail_t mode) { bool full = mode & OINFO_FULL; object_type *bow = &p_ptr->inventory[INVEN_BOW]; bitflag f[OF_SIZE]; bool weapon = (wield_slot(o_ptr) == INVEN_WIELD); bool ammo = (p_ptr->state.ammo_tval == o_ptr->tval) && (bow->kind); /* The player's hypothetical state, were they to wield this item */ player_state state; /* Abort if we've nothing to say */ if (mode & OINFO_DUMMY) return FALSE; if (!weapon && !ammo) { /* Potions can have special text */ if (o_ptr->tval != TV_POTION || o_ptr->dd == 0 || o_ptr->ds == 0 || !object_flavor_is_aware(o_ptr)) return FALSE; textblock_append(tb, "It can be thrown at creatures with damaging effect.\n"); return TRUE; } if (full) object_flags(o_ptr, f); else object_flags_known(o_ptr, f); textblock_append_c(tb, TERM_L_WHITE, "Combat info:\n"); if (weapon) { object_type inven[INVEN_TOTAL]; memcpy(inven, p_ptr->inventory, INVEN_TOTAL * sizeof(object_type)); inven[INVEN_WIELD] = *o_ptr; if (full) object_know_all_flags(&inven[INVEN_WIELD]); /* Calculate the player's hypothetical state */ calc_bonuses(inven, &state, TRUE); /* Warn about heavy weapons */ if (adj_str_hold[state.stat_ind[A_STR]] < o_ptr->weight / 10) textblock_append_c(tb, TERM_L_RED, "You are too weak to use this weapon.\n"); /* Describe blows */ describe_blows(tb, o_ptr, state, f); } else { /* Ammo */ /* Range of the weapon */ int tdis = 6 + 2 * p_ptr->state.ammo_mult; /* Output the range */ textblock_append(tb, "Hits targets up to "); textblock_append_c(tb, TERM_L_GREEN, format("%d", tdis * 10)); textblock_append(tb, " feet away.\n"); } /* Describe damage */ describe_damage(tb, o_ptr, state, f, mode); /* Note the impact flag */ if (of_has(f, OF_IMPACT)) textblock_append(tb, "Sometimes creates earthquakes on impact.\n"); /* Add breakage chance */ if (ammo) { int chance = breakage_chance(o_ptr, TRUE); textblock_append_c(tb, TERM_L_GREEN, "%d%%", chance); textblock_append(tb, " chance of breaking upon contact.\n"); } /* Something has been said */ return TRUE; } /* * Describe objects that can be used for digging. */ static bool describe_digger(textblock *tb, const object_type *o_ptr, oinfo_detail_t mode) { bool full = mode & OINFO_FULL; player_state st; object_type inven[INVEN_TOTAL]; int sl = wield_slot(o_ptr); int i; bitflag f[OF_SIZE]; int chances[4]; /* These are out of 1600 */ static const char *names[4] = { "rubble", "magma veins", "quartz veins", "granite" }; /* abort if we are a dummy object */ if (mode & OINFO_DUMMY) return FALSE; if (full) object_flags(o_ptr, f); else object_flags_known(o_ptr, f); if (sl < 0 || (sl != INVEN_WIELD && !of_has(f, OF_TUNNEL))) return FALSE; memcpy(inven, p_ptr->inventory, INVEN_TOTAL * sizeof(object_type)); /* * Hack -- if we examine a ring that is worn on the right finger, * we shouldn't put a copy of it on the left finger before calculating * digging skills. */ if (o_ptr != &p_ptr->inventory[INVEN_RIGHT]) inven[sl] = *o_ptr; calc_bonuses(inven, &st, TRUE); chances[0] = st.skills[SKILL_DIGGING] * 8; chances[1] = (st.skills[SKILL_DIGGING] - 10) * 4; chances[2] = (st.skills[SKILL_DIGGING] - 20) * 2; chances[3] = (st.skills[SKILL_DIGGING] - 40) * 1; for (i = 0; i < 4; i++) { int chance = MAX(0, MIN(1600, chances[i])); int decis = chance ? (16000 / chance) : 0; if (i == 0 && chance > 0) { if (sl == INVEN_WIELD) textblock_append(tb, "Clears "); else textblock_append(tb, "With this item, your current weapon clears "); } if (i == 3 || (i != 0 && chance == 0)) textblock_append(tb, "and "); if (chance == 0) { textblock_append_c(tb, TERM_L_RED, "doesn't affect "); textblock_append(tb, "%s.\n", names[i]); break; } textblock_append(tb, "%s in ", names[i]); if (chance == 1600) { textblock_append_c(tb, TERM_L_GREEN, "1 "); } else if (decis < 100) { textblock_append_c(tb, TERM_GREEN, "%d.%d ", decis/10, decis%10); } else { textblock_append_c(tb, (decis < 1000) ? TERM_YELLOW : TERM_RED, "%d ", (decis+5)/10); } textblock_append(tb, "turn%s%s", decis == 10 ? "" : "s", (i == 3) ? ".\n" : ", "); } return TRUE; } static bool describe_food(textblock *tb, const object_type *o_ptr, bool subjective, bool full) { /* Describe boring bits */ if ((o_ptr->tval == TV_FOOD || o_ptr->tval == TV_POTION) && o_ptr->pval[DEFAULT_PVAL]) { /* Sometimes adjust for player speed */ int multiplier = extract_energy[p_ptr->state.speed]; if (!subjective) multiplier = 10; if (object_is_known(o_ptr) || full) { textblock_append(tb, "Nourishes for around "); textblock_append_c(tb, TERM_L_GREEN, "%d", (o_ptr->pval[DEFAULT_PVAL] / 2) * multiplier / 10); textblock_append(tb, " turns.\n"); } else { textblock_append(tb, "Provides some nourishment.\n"); } return TRUE; } return FALSE; } /* * Describe things that look like lights. */ static bool describe_light(textblock *tb, const object_type *o_ptr, const bitflag flags[OF_SIZE], oinfo_detail_t mode) { int rad = 0; bool artifact = o_ptr->artifact ? TRUE : FALSE; bool no_fuel = of_has(flags, OF_NO_FUEL) ? TRUE : FALSE; bool is_light = (o_ptr->tval == TV_LIGHT) ? TRUE : FALSE; bool terse = mode & OINFO_TERSE; if (!is_light && !of_has(flags, OF_LIGHT)) return FALSE; /* Prevent unidentified objects (especially artifact lights) from showing bad radius and refueling info, but allow it to appear in ego knowledge and spoilers */ if (!object_is_known(o_ptr) && !(mode & (OINFO_EGO | OINFO_FULL | OINFO_DUMMY))) return FALSE; /* Work out radius */ if (of_has(flags, OF_LIGHT)) rad = o_ptr->pval[which_pval(o_ptr, OF_LIGHT)]; /* Describe here */ textblock_append(tb, "Radius "); textblock_append_c(tb, TERM_L_GREEN, format("%d", rad)); if (no_fuel && !artifact) textblock_append(tb, " light. No fuel required."); /* else if (is_light && o_ptr->sval == SV_LIGHT_TORCH) textblock_append(tb, " light, reduced when running out of fuel."); */ else textblock_append(tb, " light."); if (!terse && is_light && !no_fuel && o_ptr->sval != SV_LIGHT_TORCH) { const char *name = (o_ptr->sval == SV_LIGHT_TORCH) ? "torches" : "lanterns"; int turns = (o_ptr->sval == SV_LIGHT_TORCH) ? FUEL_TORCH : FUEL_LAMP; textblock_append(tb, " Refills other %s up to %d turns of fuel.", name, turns); } textblock_append(tb, "\n"); return TRUE; } /* * Describe an object's effect, if any. */ static bool describe_effect(textblock *tb, const object_type *o_ptr, bool full, bool only_artifacts, bool subjective) { const char *desc; random_value timeout = {0, 0, 0, 0}; int effect = 0, fail; if (o_ptr->artifact) { if (object_effect_is_known(o_ptr) || full) { effect = o_ptr->artifact->effect; timeout = o_ptr->artifact->time; } else if (object_effect(o_ptr)) { textblock_append(tb, "It can be activated.\n"); return TRUE; } } else { /* Sometimes only print artifact activation info */ if (only_artifacts == TRUE) return FALSE; if (object_effect_is_known(o_ptr) || full) { effect = o_ptr->kind->effect; timeout = o_ptr->kind->time; } else if (object_effect(o_ptr) != 0) { if (effect_aim(o_ptr->kind->effect)) textblock_append(tb, "It can be aimed.\n"); else if (o_ptr->tval == TV_FOOD) textblock_append(tb, "It can be eaten.\n"); else if (o_ptr->tval == TV_POTION) textblock_append(tb, "It can be drunk.\n"); else if (o_ptr->tval == TV_SCROLL) textblock_append(tb, "It can be read.\n"); else textblock_append(tb, "It can be activated.\n"); return TRUE; } } /* Forget it without an effect */ if (!effect) return FALSE; /* Obtain the description */ desc = effect_desc(effect); if (!desc) return FALSE; if (effect_aim(effect)) textblock_append(tb, "When aimed, it "); else if (o_ptr->tval == TV_FOOD) textblock_append(tb, "When eaten, it "); else if (o_ptr->tval == TV_POTION) textblock_append(tb, "When quaffed, it "); else if (o_ptr->tval == TV_SCROLL) textblock_append(tb, "When read, it "); else textblock_append(tb, "When activated, it "); /* Print a colourised description */ do { if (isdigit((unsigned char) *desc)) textblock_append_c(tb, TERM_L_GREEN, "%c", *desc); else textblock_append(tb, "%c", *desc); } while (*desc++); textblock_append(tb, ".\n"); if (randcalc(timeout, 0, MAXIMISE) > 0) { int min_time, max_time; /* Sometimes adjust for player speed */ int multiplier = extract_energy[p_ptr->state.speed]; if (!subjective) multiplier = 10; textblock_append(tb, "Takes "); /* Correct for player speed */ min_time = randcalc(timeout, 0, MINIMISE) * multiplier / 10; max_time = randcalc(timeout, 0, MAXIMISE) * multiplier / 10; textblock_append_c(tb, TERM_L_GREEN, "%d", min_time); if (min_time != max_time) { textblock_append(tb, " to "); textblock_append_c(tb, TERM_L_GREEN, "%d", max_time); } textblock_append(tb, " turns to recharge"); if (subjective && p_ptr->state.speed != 110) textblock_append(tb, " at your current speed"); textblock_append(tb, ".\n"); } if (!subjective || o_ptr->tval == TV_FOOD || o_ptr->tval == TV_POTION || o_ptr->tval == TV_SCROLL) { return TRUE; } else { fail = get_use_device_chance(o_ptr); textblock_append(tb, "Your chance of success is %d.%d%%\n", (1000 - fail) / 10, (1000 - fail) % 10); } return TRUE; } static bool describe_origin(textblock *tb, const object_type *o_ptr, bool terse) { char origin_text[80]; /* Only give this info in chardumps if wieldable */ if (terse && !obj_can_wear(o_ptr)) return FALSE; if (o_ptr->origin_depth) strnfmt(origin_text, sizeof(origin_text), "%d feet (level %d)", o_ptr->origin_depth * 50, o_ptr->origin_depth); else my_strcpy(origin_text, "town", sizeof(origin_text)); switch (o_ptr->origin) { case ORIGIN_NONE: case ORIGIN_MIXED: case ORIGIN_STOLEN: return FALSE; case ORIGIN_BIRTH: textblock_append(tb, "An inheritance from your family.\n"); break; case ORIGIN_STORE: textblock_append(tb, "Bought from a store.\n"); break; case ORIGIN_FLOOR: textblock_append(tb, "Found lying on the floor %s %s.\n", (o_ptr->origin_depth ? "at" : "in"), origin_text); break; case ORIGIN_PIT: textblock_append(tb, "Found lying on the floor in a pit at %s.\n", origin_text); break; case ORIGIN_VAULT: textblock_append(tb, "Found lying on the floor in a vault at %s.\n", origin_text); break; case ORIGIN_SPECIAL: textblock_append(tb, "Found lying on the floor of a special room at %s.\n", origin_text); break; case ORIGIN_LABYRINTH: textblock_append(tb, "Found lying on the floor of a labyrinth at %s.\n", origin_text); break; case ORIGIN_CAVERN: textblock_append(tb, "Found lying on the floor of a cavern at %s.\n", origin_text); break; case ORIGIN_RUBBLE: textblock_append(tb, "Found under some rubble at %s.\n", origin_text); break; case ORIGIN_DROP: case ORIGIN_DROP_SPECIAL: case ORIGIN_DROP_PIT: case ORIGIN_DROP_VAULT: case ORIGIN_DROP_SUMMON: case ORIGIN_DROP_BREED: case ORIGIN_DROP_POLY: case ORIGIN_DROP_WIZARD: { const char *name; if (r_info[o_ptr->origin_xtra].ridx) name = r_info[o_ptr->origin_xtra].name; else name = "monster lost to history"; textblock_append(tb, "Dropped by "); if (rf_has(r_info[o_ptr->origin_xtra].flags, RF_UNIQUE)) textblock_append(tb, "%s", name); else textblock_append(tb, "%s%s", is_a_vowel(name[0]) ? "an " : "a ", name); textblock_append(tb, " %s %s.\n", (o_ptr->origin_depth ? "at" : "in"), origin_text); break; } case ORIGIN_DROP_UNKNOWN: textblock_append(tb, "Dropped by an unknown monster %s %s.\n", (o_ptr->origin_depth ? "at" : "in"), origin_text); break; case ORIGIN_ACQUIRE: textblock_append(tb, "Conjured forth by magic %s %s.\n", (o_ptr->origin_depth ? "at" : "in"), origin_text); break; case ORIGIN_CHEAT: textblock_append(tb, "Created by debug option.\n"); break; case ORIGIN_CHEST: textblock_append(tb, "Found in a chest from %s.\n", origin_text); break; } textblock_append(tb, "\n"); return TRUE; } /* * Print an item's flavour text. * * \param tb is the textblock to which we are adding. * \param o_ptr is the object we are describing. * \param ego is whether we're describing an ego template (as opposed to a * real object) */ static void describe_flavor_text(textblock *tb, const object_type *o_ptr, bool ego) { /* Display the known artifact description */ if (!OPT(birth_randarts) && o_ptr->artifact && object_is_known(o_ptr) && o_ptr->artifact->text) textblock_append(tb, "%s\n\n", o_ptr->artifact->text); /* Display the known object description */ else if (object_flavor_is_aware(o_ptr) || object_is_known(o_ptr) || ego) { bool did_desc = FALSE; if (!ego && o_ptr->kind->text) { textblock_append(tb, "%s", o_ptr->kind->text); did_desc = TRUE; } /* Display an additional ego-item description */ if ((ego || object_ego_is_visible(o_ptr)) && o_ptr->ego->text) { if (did_desc) textblock_append(tb, " "); textblock_append(tb, "%s\n\n", o_ptr->ego->text); } else if (did_desc) { textblock_append(tb, "\n\n"); } } } static bool describe_ego(textblock *tb, const struct ego_item *ego) { if (ego && ego->xtra) { const char *xtra[] = { "sustain", "higher resistance", "ability" }; textblock_append(tb, "It provides one random %s. ", xtra[ego->xtra - 1]); return TRUE; } return FALSE; } /* * Output object information */ static textblock *object_info_out(const object_type *o_ptr, int mode) { bitflag flags[OF_SIZE]; bitflag pv_flags[MAX_PVALS][OF_SIZE]; bool something = FALSE; bool known = object_is_known(o_ptr); bool full = mode & OINFO_FULL; bool terse = mode & OINFO_TERSE; bool subjective = mode & OINFO_SUBJ; bool ego = mode & OINFO_EGO; textblock *tb = textblock_new(); /* Unaware objects get simple descriptions */ if (!full && (o_ptr->marked == MARK_AWARE)){ textblock_append(tb, "\n\nYou do not know what this is.\n"); return tb; } /* Grab the object flags */ if (full) { object_flags(o_ptr, flags); object_pval_flags(o_ptr, pv_flags); } else { object_flags_known(o_ptr, flags); object_pval_flags_known(o_ptr, pv_flags); /* Don't include base flags when terse */ if (terse) of_diff(flags, o_ptr->kind->base->flags); } if (subjective) describe_origin(tb, o_ptr, terse); if (!terse) describe_flavor_text(tb, o_ptr, ego); if (!full && !known) { textblock_append(tb, "You do not know the full extent of this item's powers.\n"); something = TRUE; } if (describe_curses(tb, o_ptr, flags)) something = TRUE; if (describe_stats(tb, o_ptr, pv_flags, mode)) something = TRUE; if (describe_slays(tb, flags, o_ptr->tval)) something = TRUE; if (describe_immune(tb, flags)) something = TRUE; if (describe_ignores(tb, flags)) something = TRUE; dedup_hates_flags(flags); if (describe_hates(tb, flags)) something = TRUE; if (describe_sustains(tb, flags)) something = TRUE; if (describe_misc_magic(tb, flags)) something = TRUE; if (describe_light(tb, o_ptr, flags, mode)) something = TRUE; if (ego && describe_ego(tb, o_ptr->ego)) something = TRUE; if (something) textblock_append(tb, "\n"); if (!ego && describe_effect(tb, o_ptr, full, terse, subjective)) { something = TRUE; textblock_append(tb, "\n"); } if (subjective && describe_combat(tb, o_ptr, mode)) { something = TRUE; textblock_append(tb, "\n"); } if (!terse && describe_food(tb, o_ptr, subjective, full)) something = TRUE; if (!terse && subjective && describe_digger(tb, o_ptr, mode)) something = TRUE; /* Hack? Don't append anything in terse (for chararacter dump), since that seems to cause extra linebreaks */ if (!something && !terse) textblock_append(tb, "\n\nThis item does not seem to possess any special abilities."); return tb; } /** * Provide information on an item, including how it would affect the current * player's state. * * mode OINFO_FULL should be set if actual player knowledge should be ignored * in favour of full knowledge. * * returns TRUE if anything is printed. */ textblock *object_info(const object_type *o_ptr, oinfo_detail_t mode) { mode |= OINFO_SUBJ; return object_info_out(o_ptr, mode); } /** * Provide information on an ego-item type */ textblock *object_info_ego(struct ego_item *ego) { object_kind *kind = NULL; object_type obj = { 0 }; int i; for (i = 0; i < z_info->k_max; i++) { kind = &k_info[i]; if (!kind->name) continue; if (kind->tval == ego->tval[0]) break; } obj.kind = kind; obj.tval = kind->tval; obj.sval = kind->sval; obj.ego = ego; ego_apply_magic(&obj, 0); return object_info_out(&obj, OINFO_FULL | OINFO_EGO | OINFO_DUMMY); } /** * Provide information on an item suitable for writing to the character dump - keep it brief. */ void object_info_chardump(ang_file *f, const object_type *o_ptr, int indent, int wrap) { textblock *tb = object_info_out(o_ptr, OINFO_TERSE | OINFO_SUBJ); textblock_to_file(tb, f, indent, wrap); textblock_free(tb); } /** * Provide spoiler information on an item. * * Practically, this means that we should not print anything which relies upon * the player's current state, since that is not suitable for spoiler material. */ void object_info_spoil(ang_file *f, const object_type *o_ptr, int wrap) { textblock *tb = object_info_out(o_ptr, OINFO_FULL); textblock_to_file(tb, f, 0, wrap); textblock_free(tb); } angband-3.5.1/src/object/Makefile0000644000175000017500000000010112456456606016125 0ustar chriscchriscMKPATH=../../mk/ include $(MKPATH)extra.mk $(MKPATH)buildsys.mk angband-3.5.1/src/object/identify.c0000644000175000017500000007362612456456606016472 0ustar chriscchrisc/* * File: identify.c * Purpose: Object identification and knowledge routines * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * Copyright (c) 2009 Brian Bull * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "game-event.h" #include "history.h" #include "object/slays.h" #include "object/tvalsval.h" #include "object/pval.h" #include "spells.h" #include "squelch.h" /** Time last item was wielded */ s32b object_last_wield; /*** Knowledge accessor functions ***/ /** * \returns whether an object counts as "known" due to EASY_KNOW status */ bool easy_know(const object_type *o_ptr) { if (o_ptr->kind->aware && of_has(o_ptr->kind->flags, OF_EASY_KNOW)) return TRUE; else return FALSE; } /** * \returns whether an object should be treated as fully known (e.g. ID'd) */ bool object_is_known(const object_type *o_ptr) { return (o_ptr->ident & IDENT_KNOWN) || easy_know(o_ptr) || (o_ptr->ident & IDENT_STORE); } /** * \returns whether the object is known to be an artifact */ bool object_is_known_artifact(const object_type *o_ptr) { return (o_ptr->ident & IDENT_INDESTRUCT) || (o_ptr->artifact && object_was_sensed(o_ptr)); } /** * \returns whether the object is known to be cursed */ bool object_is_known_cursed(const object_type *o_ptr) { bitflag f[OF_SIZE], f2[OF_SIZE]; object_flags_known(o_ptr, f); /* Gather whatever curse flags there are to know */ create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); return of_is_inter(f, f2); } /** * \returns whether the object is known to be blessed */ bool object_is_known_blessed(const object_type *o_ptr) { bitflag f[OF_SIZE]; object_flags_known(o_ptr, f); return (of_has(f, OF_BLESSED)) ? TRUE : FALSE; } /** * \returns whether the object is known to not be an artifact */ bool object_is_known_not_artifact(const object_type *o_ptr) { if (o_ptr->ident & IDENT_NOTART) return TRUE; return FALSE; } /** * \returns whether the object has been worn/wielded */ bool object_was_worn(const object_type *o_ptr) { return o_ptr->ident & IDENT_WORN ? TRUE : FALSE; } /** * \returns whether the object has been fired/thrown */ bool object_was_fired(const object_type *o_ptr) { return o_ptr->ident & IDENT_FIRED ? TRUE : FALSE; } /** * \returns whether the object has been sensed with pseudo-ID */ bool object_was_sensed(const object_type *o_ptr) { return o_ptr->ident & IDENT_SENSE ? TRUE : FALSE; } /** * \returns whether the player is aware of the object's flavour */ bool object_flavor_is_aware(const object_type *o_ptr) { assert(o_ptr->kind); return o_ptr->kind->aware; } /** * \returns whether the player has tried to use other objects of the same kind */ bool object_flavor_was_tried(const object_type *o_ptr) { assert(o_ptr->kind); return o_ptr->kind->tried; } /** * \returns whether the player is aware of the object's effect when used */ bool object_effect_is_known(const object_type *o_ptr) { assert(o_ptr->kind); return (easy_know(o_ptr) || (o_ptr->ident & IDENT_EFFECT) || (object_flavor_is_aware(o_ptr) && o_ptr->kind->effect) || (o_ptr->ident & IDENT_STORE)) ? TRUE : FALSE; } /** * \returns whether any ego or artifact name is available to the player */ bool object_name_is_visible(const object_type *o_ptr) { return o_ptr->ident & IDENT_NAME ? TRUE : FALSE; } /** * \returns whether both the object is both an ego and the player knows it is */ bool object_ego_is_visible(const object_type *o_ptr) { if (!o_ptr->ego) return FALSE; if (o_ptr->tval == TV_LIGHT) return TRUE; if ((o_ptr->ident & IDENT_NAME) || (o_ptr->ident & IDENT_STORE)) return TRUE; else return FALSE; } /** * \returns whether the object's attack plusses are known */ bool object_attack_plusses_are_visible(const object_type *o_ptr) { /* Bonuses have been revealed or for sale */ if ((o_ptr->ident & IDENT_ATTACK) || (o_ptr->ident & IDENT_STORE)) return TRUE; /* Aware jewelry with non-variable bonuses */ if (object_is_jewelry(o_ptr) && object_flavor_is_aware(o_ptr)) { if (!randcalc_varies(o_ptr->kind->to_h) && !randcalc_varies(o_ptr->kind->to_d)) return TRUE; } return FALSE; } /** * \returns whether the object's defence bonuses are known */ bool object_defence_plusses_are_visible(const object_type *o_ptr) { /* Bonuses have been revealed or for sale */ if ((o_ptr->ident & IDENT_DEFENCE) || (o_ptr->ident & IDENT_STORE)) return TRUE; /* Aware jewelry with non-variable bonuses */ if (object_is_jewelry(o_ptr) && object_flavor_is_aware(o_ptr)) { if (!randcalc_varies(o_ptr->kind->to_a)) return TRUE; } return FALSE; } /* * \returns whether the player knows whether an object has a given flag */ bool object_flag_is_known(const object_type *o_ptr, int flag) { if (easy_know(o_ptr) || (o_ptr->ident & IDENT_STORE) || of_has(o_ptr->known_flags, flag)) return TRUE; return FALSE; } /* * \returns whether it is possible an object has a high resist given the * player's current knowledge */ bool object_high_resist_is_possible(const object_type *o_ptr) { bitflag flags[OF_SIZE], f2[OF_SIZE]; /* Actual object flags */ object_flags(o_ptr, flags); /* Add player's uncertainty */ of_comp_union(flags, o_ptr->known_flags); /* Check for possible high resist */ create_mask(f2, FALSE, OFT_HRES, OFT_MAX); if (of_is_inter(flags, f2)) return TRUE; else return FALSE; } /* * Sets a some IDENT_ flags on an object. * * \param o_ptr is the object to check * \param flags are the ident flags to be added * * \returns whether o_ptr->ident changed */ static bool object_add_ident_flags(object_type *o_ptr, u32b flags) { if ((o_ptr->ident & flags) != flags) { o_ptr->ident |= flags; return TRUE; } return FALSE; } /* * Checks for additional knowledge implied by what the player already knows. * * \param o_ptr is the object to check * * returns whether it calls object_notice_everyting */ bool object_check_for_ident(object_type *o_ptr) { bitflag flags[OF_SIZE], known_flags[OF_SIZE], f2[OF_SIZE]; object_flags(o_ptr, flags); object_flags_known(o_ptr, known_flags); /* Some flags are irrelevant or never learned or too hard to learn */ create_mask(f2, FALSE, OFT_INT, OFT_IGNORE, OFT_HATES, OFT_MAX); of_diff(flags, f2); of_diff(known_flags, f2); if (!of_is_equal(flags, known_flags)) return FALSE; /* If we know attack bonuses, and defence bonuses, and effect, then * we effectively know everything, so mark as such */ if ((object_attack_plusses_are_visible(o_ptr) || (object_was_sensed(o_ptr) && o_ptr->to_h == 0 && o_ptr->to_d == 0)) && (object_defence_plusses_are_visible(o_ptr) || (object_was_sensed(o_ptr) && o_ptr->to_a == 0)) && (object_effect_is_known(o_ptr) || !object_effect(o_ptr))) { /* In addition to knowing the pval flags, it is necessary to know the pvals to know everything */ int i; for (i = 0; i < o_ptr->num_pvals; i++) if (!object_this_pval_is_visible(o_ptr, i)) break; if (i == o_ptr->num_pvals) { object_notice_everything(o_ptr); return TRUE; } } /* We still know all the flags, so we still know if it's an ego */ if (o_ptr->ego) { /* require worn status so you don't learn launcher of accuracy or gloves of slaying before wield */ if (object_was_worn(o_ptr)) object_notice_ego(o_ptr); } return FALSE; } /** * Mark an object's flavour as as one the player is aware of. * * \param o_ptr is the object whose flavour should be marked as aware */ void object_flavor_aware(object_type *o_ptr) { int i; if (o_ptr->kind->aware) return; o_ptr->kind->aware = TRUE; /* Fix squelch/autoinscribe */ if (kind_is_squelched_unaware(o_ptr->kind)) { kind_squelch_when_aware(o_ptr->kind); } p_ptr->notice |= PN_SQUELCH; apply_autoinscription(o_ptr); for (i = 1; i < o_max; i++) { const object_type *floor_o_ptr = object_byid(i); /* Some objects change tile on awareness */ /* So update display for all floor objects of this kind */ if (!floor_o_ptr->held_m_idx && floor_o_ptr->kind == o_ptr->kind) cave_light_spot(cave, floor_o_ptr->iy, floor_o_ptr->ix); } } /** * Mark an object's flavour as tried. * * \param o_ptr is the object whose flavour should be marked */ void object_flavor_tried(object_type *o_ptr) { assert(o_ptr); assert(o_ptr->kind); o_ptr->kind->tried = TRUE; } /** * Make the player aware of all of an object's flags. * * \param o_ptr is the object to mark */ void object_know_all_flags(object_type *o_ptr) { of_setall(o_ptr->known_flags); } #define IDENTS_SET_BY_IDENTIFY ( IDENT_KNOWN | IDENT_ATTACK | IDENT_DEFENCE | IDENT_SENSE | IDENT_EFFECT | IDENT_WORN | IDENT_FIRED | IDENT_NAME ) /** * Check whether an object has IDENT_KNOWN but should not */ bool object_is_not_known_consistently(const object_type *o_ptr) { if (easy_know(o_ptr)) return FALSE; if (!(o_ptr->ident & IDENT_KNOWN)) return TRUE; if ((o_ptr->ident & IDENTS_SET_BY_IDENTIFY) != IDENTS_SET_BY_IDENTIFY) return TRUE; if (o_ptr->ident & IDENT_EMPTY) return TRUE; else if (o_ptr->artifact && !(o_ptr->artifact->seen || o_ptr->artifact->everseen)) return TRUE; if (!of_is_full(o_ptr->known_flags)) return TRUE; return FALSE; } /** * Mark as object as fully known, a.k.a identified. * * \param o_ptr is the object to mark as identified */ void object_notice_everything(object_type *o_ptr) { /* The object is "empty" */ o_ptr->ident &= ~(IDENT_EMPTY); /* Mark as known */ object_flavor_aware(o_ptr); object_add_ident_flags(o_ptr, IDENTS_SET_BY_IDENTIFY); /* Artifact has now been seen */ if (o_ptr->artifact && !(o_ptr->ident & IDENT_FAKE)) { o_ptr->artifact->seen = o_ptr->artifact->everseen = TRUE; history_add_artifact(o_ptr->artifact, TRUE, TRUE); } /* Know all flags there are to be known */ object_know_all_flags(o_ptr); } /** * Notice that an object is indestructible. */ void object_notice_indestructible(object_type *o_ptr) { if (object_add_ident_flags(o_ptr, IDENT_INDESTRUCT)) object_check_for_ident(o_ptr); } /* * Notice the ego on an ego item. */ void object_notice_ego(object_type *o_ptr) { bitflag learned_flags[OF_SIZE]; bitflag xtra_flags[OF_SIZE]; if (!o_ptr->ego) return; /* XXX Eddie print a message on notice ego if not already noticed? */ /* XXX Eddie should we do something about everseen of egos here? */ /* Learn ego flags */ of_union(o_ptr->known_flags, o_ptr->ego->flags); /* Learn all flags except random abilities */ of_setall(learned_flags); switch (o_ptr->ego->xtra) { case OBJECT_XTRA_TYPE_NONE: break; case OBJECT_XTRA_TYPE_SUSTAIN: create_mask(xtra_flags, FALSE, OFT_SUST, OFT_MAX); of_diff(learned_flags, xtra_flags); break; case OBJECT_XTRA_TYPE_RESIST: create_mask(xtra_flags, FALSE, OFT_HRES, OFT_MAX); of_diff(learned_flags, xtra_flags); break; case OBJECT_XTRA_TYPE_POWER: create_mask(xtra_flags, FALSE, OFT_MISC, OFT_PROT, OFT_MAX); of_diff(learned_flags, xtra_flags); break; default: assert(0); } of_union(o_ptr->known_flags, learned_flags); if (object_add_ident_flags(o_ptr, IDENT_NAME)) { /* if you know the ego, you know which it is of excellent or splendid */ object_notice_sensing(o_ptr); object_check_for_ident(o_ptr); } } /* * Mark an object as sensed. */ void object_notice_sensing(object_type *o_ptr) { if (object_was_sensed(o_ptr)) return; if (o_ptr->artifact) { o_ptr->artifact->seen = o_ptr->artifact->everseen = TRUE; o_ptr->ident |= IDENT_NAME; } object_notice_curses(o_ptr); if (object_add_ident_flags(o_ptr, IDENT_SENSE)) object_check_for_ident(o_ptr); } /* * Sense artifacts */ void object_sense_artifact(object_type *o_ptr) { if (o_ptr->artifact) object_notice_sensing(o_ptr); else o_ptr->ident |= IDENT_NOTART; } /** * Notice the "effect" from activating an object. * * \param o_ptr is the object to become aware of */ void object_notice_effect(object_type *o_ptr) { if (object_add_ident_flags(o_ptr, IDENT_EFFECT)) object_check_for_ident(o_ptr); /* noticing an effect gains awareness */ if (!object_flavor_is_aware(o_ptr)) object_flavor_aware(o_ptr); } static void object_notice_defence_plusses(struct player *p, object_type *o_ptr) { assert(o_ptr && o_ptr->kind); if (object_defence_plusses_are_visible(o_ptr)) return; if (object_add_ident_flags(o_ptr, IDENT_DEFENCE)) object_check_for_ident(o_ptr); if (o_ptr->ac || o_ptr->to_a) { char o_name[80]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); msgt(MSG_PSEUDOID, "You know more about the %s you are wearing.", o_name); } p->update |= (PU_BONUS); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } void object_notice_attack_plusses(object_type *o_ptr) { assert(o_ptr && o_ptr->kind); if (object_attack_plusses_are_visible(o_ptr)) return; if (object_add_ident_flags(o_ptr, IDENT_ATTACK)) object_check_for_ident(o_ptr); if (wield_slot(o_ptr) == INVEN_WIELD) { char o_name[80]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); msgt(MSG_PSEUDOID, "You know more about the %s you are using.", o_name); } else if ((o_ptr->to_d || o_ptr->to_h) && !((o_ptr->tval == TV_HARD_ARMOR || o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->to_h < 0))) { char o_name[80]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); msgt(MSG_PSEUDOID, "Your %s glow%s.", o_name, ((o_ptr->number > 1) ? "" : "s")); } p_ptr->update |= (PU_BONUS); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* * Notice a single flag - returns TRUE if anything new was learned */ bool object_notice_flag(object_type *o_ptr, int flag) { if (!of_has(o_ptr->known_flags, flag)) { of_on(o_ptr->known_flags, flag); /* XXX Eddie don't want infinite recursion if object_check_for_ident sets more flags, * but maybe this will interfere with savefile repair */ object_check_for_ident(o_ptr); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); return TRUE; } return FALSE; } /* * Notice a set of flags - returns TRUE if anything new was learned */ bool object_notice_flags(object_type *o_ptr, bitflag flags[OF_SIZE]) { if (!of_is_subset(o_ptr->known_flags, flags)) { of_union(o_ptr->known_flags, flags); /* XXX Eddie don't want infinite recursion if object_check_for_ident sets more flags, * but maybe this will interfere with savefile repair */ object_check_for_ident(o_ptr); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); return TRUE; } return FALSE; } /** * Notice curses on an object. * * \param o_ptr is the object to notice curses on */ bool object_notice_curses(object_type *o_ptr) { bitflag f[OF_SIZE], f2[OF_SIZE]; object_flags(o_ptr, f); /* Gather whatever curse flags there are to know */ create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); /* Remove everything except the curse flags */ of_inter(f, f2); /* give knowledge of which curses are present */ object_notice_flags(o_ptr, f); object_check_for_ident(o_ptr); p_ptr->notice |= PN_SQUELCH; return !of_is_empty(f); } /** * Notice things which happen on defending. */ void object_notice_on_defend(struct player *p) { int i; for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) if (p->inventory[i].kind) object_notice_defence_plusses(p, &p->inventory[i]); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* * Notice stuff when firing or throwing objects. * */ /* XXX Eddie perhaps some stuff from do_cmd_fire and do_cmd_throw should be moved here */ void object_notice_on_firing(object_type *o_ptr) { if (object_add_ident_flags(o_ptr, IDENT_FIRED)) object_check_for_ident(o_ptr); } /* * Determine whether a weapon or missile weapon is obviously {excellent} when * worn. * * XXX Eddie should messages be adhoc all over the place? perhaps the main * loop should check for change in inventory/wieldeds and all messages be * printed from one place */ void object_notice_on_wield(object_type *o_ptr) { bitflag f[OF_SIZE], f2[OF_SIZE], obvious_mask[OF_SIZE]; bool obvious = FALSE; create_mask(obvious_mask, TRUE, OFID_WIELD, OFT_MAX); /* Save time of wield for later */ object_last_wield = turn; /* Only deal with un-ID'd items */ if (object_is_known(o_ptr)) return; /* Wear it */ object_flavor_tried(o_ptr); if (object_add_ident_flags(o_ptr, IDENT_WORN)) object_check_for_ident(o_ptr); /* CC: may wish to be more subtle about this once we have ego lights * with multiple pvals */ if (obj_is_light(o_ptr) && o_ptr->ego) object_notice_ego(o_ptr); if (object_flavor_is_aware(o_ptr) && easy_know(o_ptr)) { object_notice_everything(o_ptr); return; } /* Automatically sense artifacts upon wield */ object_sense_artifact(o_ptr); /* Note artifacts when found */ if (o_ptr->artifact) history_add_artifact(o_ptr->artifact, object_is_known(o_ptr), TRUE); /* special case FA, needed at least for mages wielding gloves */ if (object_FA_would_be_obvious(o_ptr)) of_on(obvious_mask, OF_FREE_ACT); /* Extract the flags */ object_flags(o_ptr, f); /* Find obvious things (disregarding curses) - why do we remove the curses?? */ create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); of_diff(obvious_mask, f2); if (of_is_inter(f, obvious_mask)) obvious = TRUE; create_mask(obvious_mask, TRUE, OFID_WIELD, OFT_MAX); /* Notice any obvious brands or slays */ object_notice_slays(o_ptr, obvious_mask); /* Learn about obvious flags */ of_union(o_ptr->known_flags, obvious_mask); /* XXX Eddie should these next NOT call object_check_for_ident due to worries about repairing? */ /* XXX Eddie this is a small hack, but jewelry with anything noticeable really is obvious */ /* XXX Eddie learn =soulkeeping vs =bodykeeping when notice sustain_str */ if (object_is_jewelry(o_ptr)) { /* Learn the flavor of jewelry with obvious flags */ if (EASY_LEARN && obvious) object_flavor_aware(o_ptr); /* Learn all flags on any aware non-artifact jewelry */ if (object_flavor_is_aware(o_ptr) && !o_ptr->artifact) object_know_all_flags(o_ptr); } object_check_for_ident(o_ptr); if (!obvious) return; /* XXX Eddie need to add stealth here, also need to assert/double-check everything is covered */ /* CC: also need to add FA! */ if (of_has(f, OF_STR)) msg("You feel %s!", o_ptr->pval[which_pval(o_ptr, OF_STR)] > 0 ? "stronger" : "weaker"); if (of_has(f, OF_INT)) msg("You feel %s!", o_ptr->pval[which_pval(o_ptr, OF_INT)] > 0 ? "smarter" : "more stupid"); if (of_has(f, OF_WIS)) msg("You feel %s!", o_ptr->pval[which_pval(o_ptr, OF_WIS)] > 0 ? "wiser" : "more naive"); if (of_has(f, OF_DEX)) msg("You feel %s!", o_ptr->pval[which_pval(o_ptr, OF_DEX)] > 0 ? "more dextrous" : "clumsier"); if (of_has(f, OF_CON)) msg("You feel %s!", o_ptr->pval[which_pval(o_ptr, OF_CON)] > 0 ? "healthier" : "sicklier"); if (of_has(f, OF_SPEED)) msg("You feel strangely %s.", o_ptr->pval[which_pval(o_ptr, OF_SPEED)] > 0 ? "quick" : "sluggish"); if (of_has(f, OF_BLOWS)) msg("Your weapon %s in your hands.", o_ptr->pval[which_pval(o_ptr, OF_BLOWS)] > 0 ? "tingles" : "aches"); if (of_has(f, OF_SHOTS)) msg("Your bow %s in your hands.", o_ptr->pval[which_pval(o_ptr, OF_SHOTS)] > 0 ? "tingles" : "aches"); if (of_has(f, OF_INFRA)) msg("Your eyes tingle."); if (of_has(f, OF_LIGHT)) msg("It glows!"); if (of_has(f, OF_TELEPATHY)) msg("Your mind feels strangely sharper!"); /* WARNING -- masking f by obvious mask -- this should be at the end of this function */ /* CC: I think this can safely go, but just in case ... */ /* flags_mask(f, OF_SIZE, OF_OBVIOUS_MASK, FLAG_END); */ /* Remember the flags */ object_notice_sensing(o_ptr); /* XXX Eddie should we check_for_ident here? */ } /** * Notice things about an object that would be noticed in time. */ static void object_notice_after_time(void) { int i; int flag; object_type *o_ptr; char o_name[80]; bitflag f[OF_SIZE], timed_mask[OF_SIZE]; create_mask(timed_mask, TRUE, OFID_TIMED, OFT_MAX); /* Check every item the player is wearing */ for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL; i++) { o_ptr = &p_ptr->inventory[i]; if (!o_ptr->kind || object_is_known(o_ptr)) continue; /* Check for timed notice flags */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); object_flags(o_ptr, f); of_inter(f, timed_mask); for (flag = of_next(f, FLAG_START); flag != FLAG_END; flag = of_next(f, flag + 1)) { if (!of_has(o_ptr->known_flags, flag)) { /* Message */ flag_message(flag, o_name); /* Notice the flag */ object_notice_flag(o_ptr, flag); if (object_is_jewelry(o_ptr) && (!object_effect(o_ptr) || object_effect_is_known(o_ptr))) { /* XXX this is a small hack, but jewelry with anything noticeable really is obvious */ /* XXX except, wait until learn activation if that is only clue */ object_flavor_aware(o_ptr); object_check_for_ident(o_ptr); } } else { /* Notice the flag is absent */ object_notice_flag(o_ptr, flag); } } /* XXX Is this necessary? */ object_check_for_ident(o_ptr); } } /** * Notice a given special flag on wielded items. * * \param flag is the flag to notice */ void wieldeds_notice_flag(struct player *p, int flag) { int i; /* Sanity check */ if (!flag) return; /* XXX Eddie need different naming conventions for starting wieldeds at INVEN_WIELD vs INVEN_WIELD+2 */ for (i = INVEN_WIELD; i < ALL_INVEN_TOTAL; i++) { object_type *o_ptr = &p->inventory[i]; bitflag f[OF_SIZE]; if (!o_ptr->kind) continue; object_flags(o_ptr, f); if (of_has(f, flag) && !of_has(o_ptr->known_flags, flag)) { char o_name[80]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); /* Notice the flag */ object_notice_flag(o_ptr, flag); /* XXX Eddie should this go before noticing the flag to avoid learning twice? */ if (EASY_LEARN && object_is_jewelry(o_ptr)) { /* XXX Eddie EASY_LEARN Possible concern: gets =teleportation just from +2 speed */ object_flavor_aware(o_ptr); object_check_for_ident(o_ptr); } /* Message */ flag_message(flag, o_name); } else { /* Notice that flag is absent */ object_notice_flag(o_ptr, flag); } /* XXX Eddie should not need this, should be done in noticing, but will remove later */ object_check_for_ident(o_ptr); } return; } /** * Notice to-hit bonus on attacking. */ void wieldeds_notice_to_hit_on_attack(void) /* Used e.g. for ranged attacks where the item's to_d is not involved. */ /* Does not apply to weapon or bow which should be done separately */ { int i; for (i = INVEN_WIELD + 2; i < INVEN_TOTAL; i++) if (p_ptr->inventory[i].kind && p_ptr->inventory[i].to_h) object_notice_attack_plusses(&p_ptr->inventory[i]); return; } /** * Notice things which happen on attacking. */ void wieldeds_notice_on_attack(void) /* Does not apply to weapon or bow which should be done separately */ { int i; for (i = INVEN_WIELD + 2; i < INVEN_TOTAL; i++) if (p_ptr->inventory[i].kind) object_notice_attack_plusses(&p_ptr->inventory[i]); /* XXX Eddie print message? */ /* XXX Eddie do we need to do more about ammo? */ return; } bool object_FA_would_be_obvious(const object_type *o_ptr) { if (player_has(PF_CUMBER_GLOVE) && wield_slot(o_ptr) == INVEN_HANDS) { bitflag flags[OF_SIZE]; object_flags(o_ptr, flags); if (!of_has(flags, OF_DEX) && !of_has(flags, OF_SPELLS_OK)) return TRUE; } return FALSE; } /* * Given an object, return a short identifier which gives some idea of what * the item is. */ obj_pseudo_t object_pseudo(const object_type *o_ptr) { bitflag flags[OF_SIZE], f2[OF_SIZE]; /* Get the known and obvious flags on the object, * not including curses or properties of the kind. */ object_flags_known(o_ptr, flags); create_mask(f2, TRUE, OFID_WIELD, OFT_MAX); /* FA on gloves is obvious to mage casters */ if (object_FA_would_be_obvious(o_ptr)) of_on(f2, OF_FREE_ACT); /* Now we remove the non-obvious known flags */ of_inter(flags, f2); /* Now we remove the cursed flags and the kind flags */ create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); of_diff(flags, f2); of_diff(flags, o_ptr->kind->flags); if (o_ptr->ident & IDENT_INDESTRUCT) return INSCRIP_SPECIAL; if ((object_was_sensed(o_ptr) || object_was_worn(o_ptr)) && o_ptr->artifact) return INSCRIP_SPECIAL; /* jewelry does not pseudo */ if (object_is_jewelry(o_ptr)) return INSCRIP_NULL; /* XXX Eddie should also check for flags with pvals where the pval exceeds * the base pval for things like picks of digging, though for now acid brand gets those */ if (!of_is_empty(flags)) return INSCRIP_SPLENDID; if (!object_is_known(o_ptr) && !object_was_sensed(o_ptr)) return INSCRIP_NULL; if (o_ptr->ego) { /* uncursed bad egos are not excellent */ if (of_is_inter(o_ptr->ego->flags, f2)) return INSCRIP_STRANGE; /* XXX Eddie need something worse */ else return INSCRIP_EXCELLENT; } if (o_ptr->to_a == randcalc(o_ptr->kind->to_a, 0, MINIMISE) && o_ptr->to_h == randcalc(o_ptr->kind->to_h, 0, MINIMISE) && o_ptr->to_d == randcalc(o_ptr->kind->to_d, 0, MINIMISE)) return INSCRIP_AVERAGE; if (o_ptr->to_a >= randcalc(o_ptr->kind->to_a, 0, MINIMISE) && o_ptr->to_h >= randcalc(o_ptr->kind->to_h, 0, MINIMISE) && o_ptr->to_d >= randcalc(o_ptr->kind->to_d, 0, MINIMISE)) return INSCRIP_MAGICAL; if (o_ptr->to_a <= randcalc(o_ptr->kind->to_a, 0, MINIMISE) && o_ptr->to_h <= randcalc(o_ptr->kind->to_h, 0, MINIMISE) && o_ptr->to_d <= randcalc(o_ptr->kind->to_d, 0, MINIMISE)) return INSCRIP_MAGICAL; return INSCRIP_STRANGE; } /* * Sense the inventory */ void sense_inventory(void) { int i; char o_name[80]; unsigned int rate; /* No ID when confused in a bad state */ if (p_ptr->timed[TMD_CONFUSED]) return; /* Notice some things after a while */ if (turn >= (object_last_wield + 3000)) { object_notice_after_time(); object_last_wield = 0; } /* Get improvement rate */ if (player_has(PF_PSEUDO_ID_IMPROV)) rate = p_ptr->class->sense_base / (p_ptr->lev * p_ptr->lev + p_ptr->class->sense_div); else rate = p_ptr->class->sense_base / (p_ptr->lev + p_ptr->class->sense_div); /* Check if player may sense anything this time */ if (p_ptr->lev < 20 && !one_in_(rate)) return; /* * Give each object one opportunity to have a chance at being sensed. Because the inventory * can be reordered in do_ident_item(), we want to prevent objects from having more than * one opportunity each turn. This state is stored in object_type->ident using the * IDENT_SENSED_THIS_TURN flag. If the pack is reordered, we start the loop over and skip * objects that have had their opportunity. * * Also, i is incremented at the top of the loop so that the conditions can properly use * "continue"; hence why we start at -1. */ i = -1; while (i < ALL_INVEN_TOTAL - 1) { const char *text = NULL; object_type *o_ptr; obj_pseudo_t feel; bool cursed; bool okay = FALSE; i++; o_ptr = &p_ptr->inventory[i]; /* Skip empty slots */ if (!o_ptr->kind) continue; /* Valid "tval" codes */ switch (o_ptr->tval) { case TV_SHOT: case TV_ARROW: case TV_BOLT: case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { okay = TRUE; break; } } /* Skip non-sense machines */ if (!okay) continue; /* It is known, no information needed */ if (object_is_known(o_ptr)) continue; /* Do not allow an object to have more than one opportunity to have a chance of being fully ID'd or sensed again. */ if (o_ptr->ident & IDENT_SENSED_THIS_TURN) continue; /* It has already been sensed, do not sense it again */ if (object_was_sensed(o_ptr)) { /* Small chance of wielded, sensed items getting complete ID */ if (!o_ptr->artifact && (i >= INVEN_WIELD) && one_in_(1000)) { /* Reset the loop to finish sensing. This item is now known, and will be skipped on the next pass. */ do_ident_item(o_ptr); i = -1; } continue; } /* Prevent objects, which pass or fail the sense check for this turn, from getting another opportunity. */ o_ptr->ident |= IDENT_SENSED_THIS_TURN; /* Occasional failure on inventory items */ if ((i < INVEN_WIELD) && one_in_(5)) continue; /* Sense the object */ object_notice_sensing(o_ptr); cursed = object_notice_curses(o_ptr); /* Get the feeling */ feel = object_pseudo(o_ptr); /* Stop everything */ disturb(p_ptr, 0, 0); if (cursed) text = "cursed"; else text = inscrip_text[feel]; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_BASE); /* Average pseudo-ID means full ID */ if (feel == INSCRIP_AVERAGE) { object_notice_everything(o_ptr); msgt(MSG_PSEUDOID, "You feel the %s (%c) %s %s average...", o_name, index_to_label(i), ((i >= INVEN_WIELD) ? "you are using" : "in your pack"), VERB_AGREEMENT(o_ptr->number, "is", "are")); } else { if (i >= INVEN_WIELD) { msgt(MSG_PSEUDOID, "You feel the %s (%c) you are %s %s %s...", o_name, index_to_label(i), describe_use(i), VERB_AGREEMENT(o_ptr->number, "is", "are"), text); } else { msgt(MSG_PSEUDOID, "You feel the %s (%c) in your pack %s %s...", o_name, index_to_label(i), VERB_AGREEMENT(o_ptr->number, "is", "are"), text); } } /* Set squelch flag as appropriate */ if (i < INVEN_WIELD) p_ptr->notice |= PN_SQUELCH; /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } /* Reset state so objects failing the check can be sensed later. */ for (i = 0; i < ALL_INVEN_TOTAL; i++) p_ptr->inventory[i].ident &= ~IDENT_SENSED_THIS_TURN; } angband-3.5.1/src/object/chest.c0000644000175000017500000002750112456456606015754 0ustar chriscchrisc/* * File: chest.c * Purpose: Encapsulation of chest-related functions * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * Copyright (c) 2012 Peter Denison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "object/tvalsval.h" #include "monster/mon-util.h" /* for summon_specific() */ /* * Each chest has a certain set of traps, determined by pval * Each chest has a "pval" from 1 to the chest level (max 55) * If the "pval" is negative then the trap has been disarmed * The "pval" of a chest determines the quality of its treasure * Note that disarming a trap on a chest also removes the lock. */ static const byte chest_traps[64] = { 0, /* 0 == empty */ (CHEST_POISON), (CHEST_LOSE_STR), (CHEST_LOSE_CON), (CHEST_LOSE_STR), (CHEST_LOSE_CON), /* 5 == best small wooden */ 0, (CHEST_POISON), (CHEST_POISON), (CHEST_LOSE_STR), (CHEST_LOSE_CON), (CHEST_POISON), (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_SUMMON), /* 15 == best large wooden */ 0, (CHEST_LOSE_STR), (CHEST_LOSE_CON), (CHEST_PARALYZE), (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_SUMMON), (CHEST_PARALYZE), (CHEST_LOSE_STR), (CHEST_LOSE_CON), (CHEST_EXPLODE), /* 25 == best small iron */ 0, (CHEST_POISON | CHEST_LOSE_STR), (CHEST_POISON | CHEST_LOSE_CON), (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_PARALYZE), (CHEST_POISON | CHEST_SUMMON), (CHEST_SUMMON), (CHEST_EXPLODE), (CHEST_EXPLODE | CHEST_SUMMON), /* 35 == best large iron */ 0, (CHEST_SUMMON), (CHEST_EXPLODE), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_POISON | CHEST_PARALYZE), (CHEST_EXPLODE), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_POISON | CHEST_PARALYZE), /* 45 == best small steel */ 0, (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_POISON | CHEST_PARALYZE | CHEST_LOSE_STR), (CHEST_POISON | CHEST_PARALYZE | CHEST_LOSE_CON), (CHEST_POISON | CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_POISON | CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_POISON | CHEST_PARALYZE | CHEST_LOSE_STR | CHEST_LOSE_CON), (CHEST_POISON | CHEST_PARALYZE), (CHEST_POISON | CHEST_PARALYZE), /* 55 == best large steel */ (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), (CHEST_EXPLODE | CHEST_SUMMON), }; byte chest_trap_type(const object_type *o_ptr) { s16b trap_value = o_ptr->pval[DEFAULT_PVAL]; if (trap_value >= 0) return chest_traps[trap_value]; else return chest_traps[-trap_value]; } /* * Determine if a chest is trapped */ bool is_trapped_chest(const object_type *o_ptr) { if (o_ptr->tval != TV_CHEST) return FALSE; /* Disarmed or opened chests are not trapped */ if (o_ptr->pval[DEFAULT_PVAL] <= 0) return FALSE; /* Some chests simply don't have traps */ return (chest_traps[o_ptr->pval[DEFAULT_PVAL]] != 0); } /* * Determine if a chest is locked or trapped */ bool is_locked_chest(const object_type *o_ptr) { if (o_ptr->tval != TV_CHEST) return FALSE; /* Disarmed or opened chests are not locked */ return (o_ptr->pval[DEFAULT_PVAL] > 0); } /* * Unlock a chest */ void unlock_chest(object_type *o_ptr) { o_ptr->pval[DEFAULT_PVAL] = (0 - o_ptr->pval[DEFAULT_PVAL]); } /* * Determine if a grid contains a chest matching the query type */ s16b chest_check(int y, int x, enum chest_query check_type) { s16b this_o_idx, next_o_idx = 0; /* Scan all objects in the grid */ for (this_o_idx = cave->o_idx[y][x]; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Skip unknown chests XXX XXX */ /* if (!o_ptr->marked) continue; */ /* Check for chests */ switch (check_type) { case CHEST_ANY: if (o_ptr->tval == TV_CHEST) return this_o_idx; break; case CHEST_OPENABLE: if ((o_ptr->tval == TV_CHEST) && (o_ptr->pval[DEFAULT_PVAL] != 0)) return this_o_idx; break; case CHEST_TRAPPED: if (is_trapped_chest(o_ptr) && object_is_known(o_ptr)) return this_o_idx; break; } } /* No chest */ return (0); } /* * Return the number of chests around (or under) the character. * If requested, count only trapped chests. */ int count_chests(int *y, int *x, enum chest_query check_type) { int d, count, o_idx; /* Count how many matches */ count = 0; /* Check around (and under) the character */ for (d = 0; d < 9; d++) { /* Extract adjacent (legal) location */ int yy = p_ptr->py + ddy_ddd[d]; int xx = p_ptr->px + ddx_ddd[d]; /* No (visible) chest is there */ if ((o_idx = chest_check(yy, xx, check_type)) == 0) continue; /* Count it */ ++count; /* Remember the location of the last chest found */ *y = yy; *x = xx; } /* All done */ return count; } /* * Allocate objects upon opening a chest * * Disperse treasures from the given chest, centered at (x,y). * * Small chests often contain "gold", while Large chests always contain * items. Wooden chests contain 2 items, Iron chests contain 4 items, * and Steel chests contain 6 items. The "value" of the items in a * chest is based on the level on which the chest is generated. */ static void chest_death(int y, int x, s16b o_idx) { int number, value; bool tiny; object_type *o_ptr; object_type *i_ptr; object_type object_type_body; /* Get the chest */ o_ptr = object_byid(o_idx); /* Small chests often hold "gold" */ tiny = (o_ptr->sval < SV_CHEST_MIN_LARGE); /* Determine how much to drop (see above) */ number = (o_ptr->sval % SV_CHEST_MIN_LARGE) * 2; /* Zero pval means empty chest */ if (!o_ptr->pval[DEFAULT_PVAL]) number = 0; /* Determine the "value" of the items */ value = o_ptr->origin_depth - 10 + 2 * o_ptr->sval; if (value < 1) value = 1; /* Drop some objects (non-chests) */ for (; number > 0; --number) { /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Small chests often drop gold */ if (tiny && (randint0(100) < 75)) make_gold(i_ptr, value, SV_GOLD_ANY); /* Otherwise drop an item, as long as it isn't a chest */ else { if (!make_object(cave, i_ptr, value, FALSE, FALSE, FALSE, NULL, 0)) continue; if (i_ptr->tval == TV_CHEST) continue; } /* Record origin */ i_ptr->origin = ORIGIN_CHEST; i_ptr->origin_depth = o_ptr->origin_depth; /* Drop it in the dungeon */ drop_near(cave, i_ptr, 0, y, x, TRUE); } /* Empty */ o_ptr->pval[DEFAULT_PVAL] = 0; /* Known */ object_notice_everything(o_ptr); } /* * Chests have traps too. * * Exploding chest destroys contents (and traps). * Note that the chest itself is never destroyed. */ static void chest_trap(int y, int x, s16b o_idx) { int i, trap; object_type *o_ptr = object_byid(o_idx); /* Ignore disarmed chests */ if (o_ptr->pval[DEFAULT_PVAL] <= 0) return; /* Obtain the traps */ trap = chest_traps[o_ptr->pval[DEFAULT_PVAL]]; /* Lose strength */ if (trap & (CHEST_LOSE_STR)) { msg("A small needle has pricked you!"); take_hit(p_ptr, damroll(1, 4), "a poison needle"); (void)do_dec_stat(A_STR, FALSE); } /* Lose constitution */ if (trap & (CHEST_LOSE_CON)) { msg("A small needle has pricked you!"); take_hit(p_ptr, damroll(1, 4), "a poison needle"); (void)do_dec_stat(A_CON, FALSE); } /* Poison */ if (trap & (CHEST_POISON)) { msg("A puff of green gas surrounds you!"); (void)player_inc_timed(p_ptr, TMD_POISONED, 10 + randint1(20), TRUE, TRUE); } /* Paralyze */ if (trap & (CHEST_PARALYZE)) { msg("A puff of yellow gas surrounds you!"); (void)player_inc_timed(p_ptr, TMD_PARALYZED, 10 + randint1(20), TRUE, TRUE); } /* Summon monsters */ if (trap & (CHEST_SUMMON)) { int num = 2 + randint1(3); msg("You are enveloped in a cloud of smoke!"); sound(MSG_SUM_MONSTER); for (i = 0; i < num; i++) { (void)summon_specific(y, x, p_ptr->depth, 0, 1); } } /* Explode */ if (trap & (CHEST_EXPLODE)) { msg("There is a sudden explosion!"); msg("Everything inside the chest is destroyed!"); o_ptr->pval[DEFAULT_PVAL] = 0; take_hit(p_ptr, damroll(5, 8), "an exploding chest"); } } /* * Attempt to open the given chest at the given location * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ bool do_cmd_open_chest(int y, int x, s16b o_idx) { int i, j; bool flag = TRUE; bool more = FALSE; object_type *o_ptr = object_byid(o_idx); /* Attempt to unlock it */ if (o_ptr->pval[DEFAULT_PVAL] > 0) { /* Assume locked, and thus not open */ flag = FALSE; /* Get the "disarm" factor */ i = p_ptr->state.skills[SKILL_DISARM]; /* Penalize some conditions */ if (p_ptr->timed[TMD_BLIND] || no_light()) i = i / 10; if (p_ptr->timed[TMD_CONFUSED] || p_ptr->timed[TMD_IMAGE]) i = i / 10; /* Extract the difficulty */ j = i - o_ptr->pval[DEFAULT_PVAL]; /* Always have a small chance of success */ if (j < 2) j = 2; /* Success -- May still have traps */ if (randint0(100) < j) { msgt(MSG_LOCKPICK, "You have picked the lock."); player_exp_gain(p_ptr, 1); flag = TRUE; } /* Failure -- Keep trying */ else { /* We may continue repeating */ more = TRUE; flush(); msgt(MSG_LOCKPICK_FAIL, "You failed to pick the lock."); } } /* Allowed to open */ if (flag) { /* Apply chest traps, if any */ chest_trap(y, x, o_idx); /* Let the Chest drop items */ chest_death(y, x, o_idx); /* Squelch chest if autosquelch calls for it */ p_ptr->notice |= PN_SQUELCH; } /* * empty chests were always squelched in squelch_item_okay so we * might as well squelch it here */ if (o_ptr->pval[DEFAULT_PVAL] == 0) { o_ptr->ignore = TRUE; } /* Redraw chest, to be on the safe side (it may have been squelched) */ cave_light_spot(cave, y, x); /* Refresh */ Term_fresh(); /* Result */ return (more); } /* * Attempt to disarm the chest at the given location * * Assume there is no monster blocking the destination * * Returns TRUE if repeated commands may continue */ bool do_cmd_disarm_chest(int y, int x, s16b o_idx) { int i, j; bool more = FALSE; object_type *o_ptr = object_byid(o_idx); /* Get the "disarm" factor */ i = p_ptr->state.skills[SKILL_DISARM]; /* Penalize some conditions */ if (p_ptr->timed[TMD_BLIND] || no_light()) i = i / 10; if (p_ptr->timed[TMD_CONFUSED] || p_ptr->timed[TMD_IMAGE]) i = i / 10; /* Extract the difficulty */ j = i - o_ptr->pval[DEFAULT_PVAL]; /* Always have a small chance of success */ if (j < 2) j = 2; /* Must find the trap first. */ if (!object_is_known(o_ptr)) { msg("I don't see any traps."); } /* Already disarmed/unlocked or no traps */ else if (!is_trapped_chest(o_ptr)) { msg("The chest is not trapped."); } /* Success (get a lot of experience) */ else if (randint0(100) < j) { msgt(MSG_DISARM, "You have disarmed the chest."); player_exp_gain(p_ptr, o_ptr->pval[DEFAULT_PVAL]); o_ptr->pval[DEFAULT_PVAL] = (0 - o_ptr->pval[DEFAULT_PVAL]); } /* Failure -- Keep trying */ else if ((i > 5) && (randint1(i) > 5)) { /* We may keep trying */ more = TRUE; flush(); msg("You failed to disarm the chest."); } /* Failure -- Set off the trap */ else { msg("You set off a trap!"); chest_trap(y, x, o_idx); } /* Result */ return (more); } angband-3.5.1/src/object/list-slays.h0000644000175000017500000000653312456456606016761 0ustar chriscchrisc/* * File: list-slays.h * Purpose: List of slay/brand types */ /* * Entries in this table should be in ascending order of multiplier, to * ensure that the highest one takes precedence. Structure is name, * object flag, vulnerable flag, monster resist flag, multiplier, ranged verb, * melee verb, verb describing what the thing does when it is active, * description of affected creatures, brand */ SLAY(XXX, FLAG_END, FLAG_END, FLAG_END, 0, NULL, NULL, NULL, NULL, NULL) SLAY(ANIMAL2, OF_SLAY_ANIMAL, RF_ANIMAL, FLAG_END, 2, "pierces", "smite", "glows", "animals", NULL) SLAY(EVIL2, OF_SLAY_EVIL, RF_EVIL, FLAG_END, 2, "pierces", "smite", "glows", "evil creatures", NULL) SLAY(ACID2, OF_BRAND_FIZZ, FLAG_END, RF_IM_ACID, 2, "corrodes", "corrode", "fizzes", "creatures not resistant to acid", "weak acid") SLAY(ELEC2, OF_BRAND_BUZZ, FLAG_END, RF_IM_ELEC, 2, "zaps", "zap", "buzzes", "creatures not resistant to electricity", "weak lightning") SLAY(FIRE2, OF_BRAND_WARM, FLAG_END, RF_IM_FIRE, 2, "singes", "singe", "grows warm", "creatures not resistant to fire", "weak flames") SLAY(COLD2, OF_BRAND_COOL, FLAG_END, RF_IM_COLD, 2, "chills" , "chill", "grows cool", "creatures not resistant to cold", "weak frost") SLAY(POISON2, OF_BRAND_ICKY, FLAG_END, RF_IM_POIS, 2, "sickens", "sicken", "glows green", "creatures not resistant to poison", "weak venom") SLAY(UNDEAD3, OF_SLAY_UNDEAD, RF_UNDEAD, FLAG_END, 3, "pierces", "smite", "glows", "undead", NULL) SLAY(DEMON3, OF_SLAY_DEMON, RF_DEMON, FLAG_END, 3, "pierces", "smite", "glows", "demons", NULL) SLAY(ORC3, OF_SLAY_ORC, RF_ORC, FLAG_END, 3, "pierces", "smite", "glows", "orcs", NULL) SLAY(TROLL3, OF_SLAY_TROLL, RF_TROLL, FLAG_END, 3, "pierces", "smite", "glows", "trolls", NULL) SLAY(GIANT3, OF_SLAY_GIANT, RF_GIANT, FLAG_END, 3, "pierces", "smite", "glows", "giants", NULL) SLAY(DRAGON3, OF_SLAY_DRAGON, RF_DRAGON, FLAG_END, 3, "pierces", "smite", "glows", "dragons", NULL) SLAY(ACID3, OF_BRAND_ACID, FLAG_END, RF_IM_ACID, 3, "dissolves", "dissolve", "spits", "creatures not resistant to acid", "acid") SLAY(ELEC3, OF_BRAND_ELEC, FLAG_END, RF_IM_ELEC, 3, "shocks", "shock", "crackles", "creatures not resistant to electricity", "lightning") SLAY(FIRE3, OF_BRAND_FIRE, FLAG_END, RF_IM_FIRE, 3, "burns", "burn", "flares", "creatures not resistant to fire", "flames") SLAY(COLD3, OF_BRAND_COLD, FLAG_END, RF_IM_COLD, 3, "freezes" , "freeze", "grows cold", "creatures not resistant to cold", "frost") SLAY(POISON3, OF_BRAND_POIS, FLAG_END, RF_IM_POIS, 3, "poisons", "poison", "seethes", "creatures not resistant to poison", "venom") SLAY(DRAGON5, OF_KILL_DRAGON, RF_DRAGON, FLAG_END, 5, "deeply pierces", "fiercely smite", "glows brightly", "dragons", NULL) SLAY(DEMON5, OF_KILL_DEMON, RF_DEMON, FLAG_END, 5, "deeply pierces", "fiercely smite", "glows brightly", "demons", NULL) SLAY(UNDEAD5, OF_KILL_UNDEAD, RF_UNDEAD, FLAG_END, 5, "deeply pierces", "fiercely smite", "glows brightly", "undead", NULL) angband-3.5.1/src/object/randart.c0000644000175000017500000025633212456456606016307 0ustar chriscchrisc/* * File: randart.c * Purpose: Random artifact generation * * Copyright (c) 1998 Greg Wooledge, Ben Harrison, Robert Ruhlmann * Copyright (c) 2001 Chris Carr, Chris Robertson * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "object/slays.h" #include "object/tvalsval.h" #include "object/pval.h" #include "init.h" #include "effects.h" #include "randname.h" /* * Original random artifact generator (randart) by Greg Wooledge. * Updated by Chris Carr / Chris Robertson 2001-2010. */ #define MAX_TRIES 200 #define BUFLEN 1024 #define MIN_NAME_LEN 5 #define MAX_NAME_LEN 9 /* * Inhibiting factors for large bonus values * "HIGH" values use INHIBIT_WEAK * "VERYHIGH" values use INHIBIT_STRONG */ #define INHIBIT_STRONG (one_in_(6)) #define INHIBIT_WEAK (one_in_(2)) /* * Power rating below which uncursed randarts cannot aggravate * (so that aggravate is found only on endgame-quality items or * cursed items) */ #define AGGR_POWER 300 /* * Numerical index values for the different learned probabilities * These are to make the code more readable. * ToDo: turn these into an enum */ #define ART_IDX_BOW_SHOTS 0 #define ART_IDX_BOW_MIGHT 1 #define ART_IDX_BOW_BRAND 80 #define ART_IDX_BOW_SLAY 81 #define ART_IDX_WEAPON_HIT 2 #define ART_IDX_WEAPON_DAM 3 #define ART_IDX_NONWEAPON_HIT 4 #define ART_IDX_NONWEAPON_DAM 5 #define ART_IDX_NONWEAPON_HIT_DAM 6 #define ART_IDX_NONWEAPON_BRAND 78 #define ART_IDX_NONWEAPON_SLAY 79 #define ART_IDX_NONWEAPON_BLOWS 83 #define ART_IDX_NONWEAPON_SHOTS 84 #define ART_IDX_MELEE_BLESS 7 #define ART_IDX_MELEE_BRAND 8 #define ART_IDX_MELEE_SLAY 76 #define ART_IDX_MELEE_SINV 9 #define ART_IDX_MELEE_BLOWS 10 #define ART_IDX_MELEE_AC 11 #define ART_IDX_MELEE_DICE 12 #define ART_IDX_MELEE_WEIGHT 13 #define ART_IDX_MELEE_TUNN 14 #define ART_IDX_ALLARMOR_WEIGHT 15 #define ART_IDX_BOOT_AC 16 #define ART_IDX_BOOT_FEATHER 17 #define ART_IDX_BOOT_STEALTH 18 #define ART_IDX_BOOT_SPEED 19 #define ART_IDX_GLOVE_AC 20 #define ART_IDX_GLOVE_FA 21 #define ART_IDX_GLOVE_DEX 22 #define ART_IDX_HELM_AC 23 #define ART_IDX_HELM_RBLIND 24 #define ART_IDX_HELM_ESP 25 #define ART_IDX_HELM_SINV 26 #define ART_IDX_HELM_WIS 27 #define ART_IDX_HELM_INT 28 #define ART_IDX_SHIELD_AC 29 #define ART_IDX_SHIELD_LRES 30 #define ART_IDX_CLOAK_AC 31 #define ART_IDX_CLOAK_STEALTH 32 #define ART_IDX_ARMOR_AC 33 #define ART_IDX_ARMOR_STEALTH 34 #define ART_IDX_ARMOR_HLIFE 35 #define ART_IDX_ARMOR_CON 36 #define ART_IDX_ARMOR_LRES 37 #define ART_IDX_ARMOR_ALLRES 38 #define ART_IDX_ARMOR_HRES 39 #define ART_IDX_GEN_STAT 40 #define ART_IDX_GEN_SUST 41 #define ART_IDX_GEN_STEALTH 42 #define ART_IDX_GEN_SEARCH 43 #define ART_IDX_GEN_INFRA 44 #define ART_IDX_GEN_SPEED 45 #define ART_IDX_GEN_IMMUNE 46 #define ART_IDX_GEN_FA 47 #define ART_IDX_GEN_HLIFE 48 #define ART_IDX_GEN_FEATHER 49 #define ART_IDX_GEN_LIGHT 50 #define ART_IDX_GEN_SINV 51 #define ART_IDX_GEN_ESP 52 #define ART_IDX_GEN_SDIG 53 #define ART_IDX_GEN_REGEN 54 #define ART_IDX_GEN_LRES 55 #define ART_IDX_GEN_RPOIS 56 #define ART_IDX_GEN_RFEAR 57 #define ART_IDX_GEN_RLIGHT 58 #define ART_IDX_GEN_RDARK 59 #define ART_IDX_GEN_RBLIND 60 #define ART_IDX_GEN_RCONF 61 #define ART_IDX_GEN_RSOUND 62 #define ART_IDX_GEN_RSHARD 63 #define ART_IDX_GEN_RNEXUS 64 #define ART_IDX_GEN_RNETHER 65 #define ART_IDX_GEN_RCHAOS 66 #define ART_IDX_GEN_RDISEN 67 #define ART_IDX_GEN_AC 68 #define ART_IDX_GEN_TUNN 69 #define ART_IDX_GEN_ACTIV 82 #define ART_IDX_GEN_PSTUN 86 /* Supercharged abilities - treated differently in algorithm */ #define ART_IDX_MELEE_DICE_SUPER 70 #define ART_IDX_BOW_SHOTS_SUPER 71 #define ART_IDX_BOW_MIGHT_SUPER 72 #define ART_IDX_GEN_SPEED_SUPER 73 #define ART_IDX_MELEE_BLOWS_SUPER 77 #define ART_IDX_GEN_AC_SUPER 85 /* Aggravation - weapon and nonweapon */ #define ART_IDX_WEAPON_AGGR 74 #define ART_IDX_NONWEAPON_AGGR 75 /* Total of abilities */ #define ART_IDX_TOTAL 87 /* Arrays of indices by item type, used in frequency generation */ static s16b art_idx_bow[] = {ART_IDX_BOW_SHOTS, ART_IDX_BOW_MIGHT, ART_IDX_BOW_BRAND, ART_IDX_BOW_SLAY}; static s16b art_idx_weapon[] = {ART_IDX_WEAPON_HIT, ART_IDX_WEAPON_DAM, ART_IDX_WEAPON_AGGR}; static s16b art_idx_nonweapon[] = {ART_IDX_NONWEAPON_HIT, ART_IDX_NONWEAPON_DAM, ART_IDX_NONWEAPON_HIT_DAM, ART_IDX_NONWEAPON_AGGR, ART_IDX_NONWEAPON_BRAND, ART_IDX_NONWEAPON_SLAY, ART_IDX_NONWEAPON_BLOWS, ART_IDX_NONWEAPON_SHOTS}; static s16b art_idx_melee[] = {ART_IDX_MELEE_BLESS, ART_IDX_MELEE_SINV, ART_IDX_MELEE_BRAND, ART_IDX_MELEE_SLAY, ART_IDX_MELEE_BLOWS, ART_IDX_MELEE_AC, ART_IDX_MELEE_DICE, ART_IDX_MELEE_WEIGHT, ART_IDX_MELEE_TUNN}; static s16b art_idx_allarmor[] = {ART_IDX_ALLARMOR_WEIGHT}; static s16b art_idx_boot[] = {ART_IDX_BOOT_AC, ART_IDX_BOOT_FEATHER, ART_IDX_BOOT_STEALTH, ART_IDX_BOOT_SPEED}; static s16b art_idx_glove[] = {ART_IDX_GLOVE_AC, ART_IDX_GLOVE_FA, ART_IDX_GLOVE_DEX}; static s16b art_idx_headgear[] = {ART_IDX_HELM_AC, ART_IDX_HELM_RBLIND, ART_IDX_HELM_ESP, ART_IDX_HELM_SINV, ART_IDX_HELM_WIS, ART_IDX_HELM_INT}; static s16b art_idx_shield[] = {ART_IDX_SHIELD_AC, ART_IDX_SHIELD_LRES}; static s16b art_idx_cloak[] = {ART_IDX_CLOAK_AC, ART_IDX_CLOAK_STEALTH}; static s16b art_idx_armor[] = {ART_IDX_ARMOR_AC, ART_IDX_ARMOR_STEALTH, ART_IDX_ARMOR_HLIFE, ART_IDX_ARMOR_CON, ART_IDX_ARMOR_LRES, ART_IDX_ARMOR_ALLRES, ART_IDX_ARMOR_HRES}; static s16b art_idx_gen[] = {ART_IDX_GEN_STAT, ART_IDX_GEN_SUST, ART_IDX_GEN_STEALTH, ART_IDX_GEN_SEARCH, ART_IDX_GEN_INFRA, ART_IDX_GEN_SPEED, ART_IDX_GEN_IMMUNE, ART_IDX_GEN_FA, ART_IDX_GEN_HLIFE, ART_IDX_GEN_FEATHER, ART_IDX_GEN_LIGHT, ART_IDX_GEN_SINV, ART_IDX_GEN_ESP, ART_IDX_GEN_SDIG, ART_IDX_GEN_REGEN, ART_IDX_GEN_LRES, ART_IDX_GEN_RPOIS, ART_IDX_GEN_RFEAR, ART_IDX_GEN_RLIGHT, ART_IDX_GEN_RDARK, ART_IDX_GEN_RBLIND, ART_IDX_GEN_RCONF, ART_IDX_GEN_RSOUND, ART_IDX_GEN_RSHARD, ART_IDX_GEN_RNEXUS, ART_IDX_GEN_RNETHER, ART_IDX_GEN_RCHAOS, ART_IDX_GEN_RDISEN, ART_IDX_GEN_AC, ART_IDX_GEN_TUNN, ART_IDX_GEN_ACTIV, ART_IDX_GEN_PSTUN}; static s16b art_idx_high_resist[] = {ART_IDX_GEN_RPOIS, ART_IDX_GEN_RFEAR, ART_IDX_GEN_RLIGHT, ART_IDX_GEN_RDARK, ART_IDX_GEN_RBLIND, ART_IDX_GEN_RCONF, ART_IDX_GEN_RSOUND, ART_IDX_GEN_RSHARD, ART_IDX_GEN_RNEXUS, ART_IDX_GEN_RNETHER, ART_IDX_GEN_RCHAOS, ART_IDX_GEN_RDISEN, ART_IDX_GEN_PSTUN}; /* Initialize the data structures for learned probabilities */ static s16b artprobs[ART_IDX_TOTAL]; static s16b *baseprobs; static s16b art_bow_total = 0; static s16b art_melee_total = 0; static s16b art_boot_total = 0; static s16b art_glove_total = 0; static s16b art_headgear_total = 0; static s16b art_shield_total = 0; static s16b art_cloak_total = 0; static s16b art_armor_total = 0; static s16b art_other_total = 0; static s16b art_total = 0; /* * Working arrays for holding frequency values - global to avoid repeated * allocation of memory */ static s16b art_freq[ART_IDX_TOTAL]; /* artifact attributes */ static s16b *base_freq; /* base items */ /* * Mean start and increment values for to_hit, to_dam and AC. Update these * if the algorithm changes. They are used in frequency generation. */ static s16b mean_hit_increment = 4; static s16b mean_dam_increment = 4; static s16b mean_hit_startval = 10; static s16b mean_dam_startval = 10; static s16b mean_ac_startval = 15; static s16b mean_ac_increment = 5; /* * Pointer for logging file */ static ang_file *log_file = NULL; /* * Store the original artifact power ratings */ static s32b *base_power; static s16b max_power; static s16b min_power; static s16b avg_power; static s16b var_power; /* * Store the original base item levels */ static byte *base_item_level; /* * Store the original base item rarities */ static byte *base_item_prob; /* * Store the original artifact rarities */ static byte *base_art_alloc; /* Global just for convenience. */ static int verbose = 1; char *artifact_gen_name(struct artifact *a, const char ***words) { char buf[BUFLEN]; char word[MAX_NAME_LEN + 1]; randname_make(RANDNAME_TOLKIEN, MIN_NAME_LEN, MAX_NAME_LEN, word, sizeof(word), words); my_strcap(word); if (one_in_(3)) strnfmt(buf, sizeof(buf), "'%s'", word); else strnfmt(buf, sizeof(buf), "of %s", word); if (a->aidx == ART_POWER) strnfmt(buf, sizeof(buf), "of Power (The One Ring)"); if (a->aidx == ART_GROND) strnfmt(buf, sizeof(buf), "'Grond'"); if (a->aidx == ART_MORGOTH) strnfmt(buf, sizeof(buf), "of Morgoth"); return string_make(buf); } /* * Use W. Sheldon Simms' random name generator. */ static errr init_names(void) { int i; struct artifact *a; for (i = 0; i < z_info->a_max; i++) { char desc[128] = "Based on "; a = &a_info[i]; if (!a->tval || !a->sval || !a->name) continue; if (prefix(a->name, "of Power")) { my_strcat(desc, a->name + 10, strlen(a->name) - 1); } else if (prefix(a->name, "of ")) { my_strcat(desc, a->name + 3, strlen(a->name) + 7); } else { my_strcat(desc, a->name + 1, strlen(a->name) + 8); } string_free(a->text); string_free(a->name); a->text = string_make(desc); a->name = artifact_gen_name(a, name_sections); } return 0; } /* * Return the artifact power, by generating a "fake" object based on the * artifact, and calling the common object_power function */ static s32b artifact_power(int a_idx) { object_type obj; char buf[256]; file_putf(log_file, "********** ENTERING EVAL POWER ********\n"); file_putf(log_file, "Artifact index is %d\n", a_idx); if (!make_fake_artifact(&obj, &a_info[a_idx])) return 0; object_desc(buf, 256*sizeof(char), &obj, ODESC_PREFIX | ODESC_FULL | ODESC_SPOIL); file_putf(log_file, "%s\n", buf); return object_power(&obj, verbose, log_file, TRUE); } /* * Store the original artifact power ratings as a baseline */ static void store_base_power (void) { int i, j; artifact_type *a_ptr; object_kind *k_ptr; int *fake_power; max_power = 0; min_power = 32767; var_power = 0; fake_power = C_ZNEW(z_info->a_max, int); j = 0; for(i = 0; i < z_info->a_max; i++, j++) { base_power[i] = artifact_power(i); /* capture power stats, ignoring cursed and uber arts */ if (base_power[i] > max_power && base_power[i] < INHIBIT_POWER) max_power = base_power[i]; if (base_power[i] < min_power && base_power[i] > 0) min_power = base_power[i]; if (base_power[i] > 0 && base_power[i] < INHIBIT_POWER) fake_power[j] = (int)base_power[i]; else j--; if (!base_power[i]) continue; a_ptr = &a_info[i]; k_ptr = lookup_kind(a_ptr->tval, a_ptr->sval); base_item_level[i] = k_ptr->level; base_item_prob[i] = k_ptr->alloc_prob; base_art_alloc[i] = a_ptr->alloc_prob; } avg_power = mean(fake_power, j); var_power = variance(fake_power, j); file_putf(log_file, "Max power is %d, min is %d\n", max_power, min_power); file_putf(log_file, "Mean is %d, variance is %d\n", avg_power, var_power); /* Store the number of different types, for use later */ /* ToDo: replace this with full combination tracking */ for (i = 0; i < z_info->a_max; i++) { switch (a_info[i].tval) { case TV_SWORD: case TV_POLEARM: case TV_HAFTED: art_melee_total++; break; case TV_BOW: art_bow_total++; break; case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: art_armor_total++; break; case TV_SHIELD: art_shield_total++; break; case TV_CLOAK: art_cloak_total++; break; case TV_HELM: case TV_CROWN: art_headgear_total++; break; case TV_GLOVES: art_glove_total++; break; case TV_BOOTS: art_boot_total++; break; case TV_NULL: break; default: art_other_total++; } } art_total = art_melee_total + art_bow_total + art_armor_total + art_shield_total + art_cloak_total + art_headgear_total + art_glove_total + art_boot_total + art_other_total; FREE(fake_power); } /* * Randomly select a base item type (tval,sval). Assign the various fields * corresponding to that choice. * * The return value gives the index of the new item type. The method is * passed a pointer to a rarity value in order to return the rarity of the * new item. */ static object_kind *choose_item(int a_idx) { artifact_type *a_ptr = &a_info[a_idx]; int tval = 0, sval = 0, i = 0; object_kind *k_ptr; s16b r; bitflag f[OF_SIZE]; /* * Pick a base item from the cumulative frequency table. * * Although this looks hideous, it provides for easy addition of * future artifact types, simply by removing the tvals from this * loop. * * N.B. Could easily generate lights, rings and amulets this way if * the whole special/flavour issue was sorted out (see ticket #1014) * Note that Carlammas and Barahir have the same sval as Grond/Morgoth */ while (tval == 0 || tval == TV_CHEST || tval == TV_SHOT || tval == TV_ARROW || tval == TV_BOLT || tval == TV_STAFF || tval == TV_WAND || tval == TV_ROD || tval == TV_SCROLL || tval == TV_POTION || tval == TV_FLASK || tval == TV_FOOD || tval == TV_MAGIC_BOOK || tval == TV_PRAYER_BOOK || tval == TV_GOLD || tval == TV_LIGHT || tval == TV_AMULET || tval == TV_RING || sval == SV_GROND || sval == SV_MORGOTH || k_info[i].alloc_prob == 0) { r = randint1(base_freq[z_info->k_max - 1]); i = 0; while (r > base_freq[i]) { i++; } tval = k_info[i].tval; sval = k_info[i].sval; } file_putf(log_file, "Creating tval %d sval %d\n", tval, sval); k_ptr = lookup_kind(tval, sval); a_ptr->tval = k_ptr->tval; a_ptr->sval = k_ptr->sval; a_ptr->to_h = randcalc(k_ptr->to_h, 0, MINIMISE); a_ptr->to_d = randcalc(k_ptr->to_d, 0, MINIMISE); a_ptr->to_a = randcalc(k_ptr->to_a, 0, MINIMISE); a_ptr->ac = k_ptr->ac; a_ptr->dd = k_ptr->dd; a_ptr->ds = k_ptr->ds; a_ptr->weight = k_ptr->weight; of_copy(a_ptr->flags, k_ptr->flags); for (i = 0; i < MAX_PVALS; i++) { of_copy(a_ptr->pval_flags[i], k_ptr->pval_flags[i]); a_ptr->pval[i] = randcalc(k_ptr->pval[i], 0, MINIMISE); } a_ptr->num_pvals = k_ptr->num_pvals; a_ptr->effect = 0; /* Artifacts ignore everything */ create_mask(f, FALSE, OFT_IGNORE, OFT_MAX); of_union(a_ptr->flags, f); /* Assign basic stats to the artifact based on its artifact level. */ /* * CR, 2001-09-03: changed to a simpler version to match the hit-dam * parsing algorithm. We use random ranges averaging mean_hit_startval * and mean_dam_startval, but permitting variation of 50% to 150%. * Level-dependent term has been removed for the moment. */ switch (a_ptr->tval) { case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_SWORD: case TV_POLEARM: a_ptr->to_h += (s16b)(mean_hit_startval / 2 + randint0(mean_hit_startval) ); a_ptr->to_d += (s16b)(mean_dam_startval / 2 + randint0(mean_dam_startval) ); file_putf(log_file, "Assigned basic stats, to_hit: %d, to_dam: %d\n", a_ptr->to_h, a_ptr->to_d); break; case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: /* CR: adjusted this to work with parsing logic */ a_ptr->to_a += (s16b)(mean_ac_startval / 2 + randint0(mean_ac_startval) ); file_putf(log_file, "Assigned basic stats, AC bonus: %d\n", a_ptr->to_a); break; } /* Done - return the index of the new object kind. */ return k_ptr; } /* * We've just added an ability which uses the pval bonus. Make sure it's * not zero. If it's currently negative, leave it negative (heh heh). */ static void do_pval(artifact_type *a_ptr) { int factor = 1; /* Track whether we have blows, might or shots on this item */ if (of_has(a_ptr->flags, OF_BLOWS)) factor++; if (of_has(a_ptr->flags, OF_MIGHT)) factor++; if (of_has(a_ptr->flags, OF_SHOTS)) factor++; if (a_ptr->pval[DEFAULT_PVAL] == 0) { /* Blows, might, shots handled separately */ if (factor > 1) { a_ptr->pval[DEFAULT_PVAL] = (s16b)randint1(2); /* Give it a shot at +3 */ if (INHIBIT_STRONG) a_ptr->pval[DEFAULT_PVAL] = 3; } else a_ptr->pval[DEFAULT_PVAL] = (s16b)randint1(4); file_putf(log_file, "Assigned initial pval, value is: %d\n", a_ptr->pval[DEFAULT_PVAL]); } else if (a_ptr->pval[DEFAULT_PVAL] < 0) { if (one_in_(2)) { a_ptr->pval[DEFAULT_PVAL]--; file_putf(log_file, "Decreasing pval by 1, new value is: %d\n", a_ptr->pval[DEFAULT_PVAL]); } } else if (one_in_(a_ptr->pval[DEFAULT_PVAL] * factor)) { /* * CR: made this a bit rarer and diminishing with higher pval - * also rarer if item has blows/might/shots already */ a_ptr->pval[DEFAULT_PVAL]++; file_putf(log_file, "Increasing pval by 1, new value is: %d\n", a_ptr->pval[DEFAULT_PVAL]); } } static void remove_contradictory(artifact_type *a_ptr) { if (of_has(a_ptr->flags, OF_AGGRAVATE)) of_off(a_ptr->flags, OF_STEALTH); if (of_has(a_ptr->flags, OF_IM_ACID)) of_off(a_ptr->flags, OF_RES_ACID); if (of_has(a_ptr->flags, OF_IM_ELEC)) of_off(a_ptr->flags, OF_RES_ELEC); if (of_has(a_ptr->flags, OF_IM_FIRE)) of_off(a_ptr->flags, OF_RES_FIRE); if (of_has(a_ptr->flags, OF_IM_COLD)) of_off(a_ptr->flags, OF_RES_COLD); if (a_ptr->pval[DEFAULT_PVAL] < 0) { if (of_has(a_ptr->flags, OF_STR)) of_off(a_ptr->flags, OF_SUST_STR); if (of_has(a_ptr->flags, OF_INT)) of_off(a_ptr->flags, OF_SUST_INT); if (of_has(a_ptr->flags, OF_WIS)) of_off(a_ptr->flags, OF_SUST_WIS); if (of_has(a_ptr->flags, OF_DEX)) of_off(a_ptr->flags, OF_SUST_DEX); if (of_has(a_ptr->flags, OF_CON)) of_off(a_ptr->flags, OF_SUST_CON); of_off(a_ptr->flags, OF_BLOWS); } if (of_has(a_ptr->flags, OF_LIGHT_CURSE)) of_off(a_ptr->flags, OF_BLESSED); if (of_has(a_ptr->flags, OF_KILL_DRAGON)) of_off(a_ptr->flags, OF_SLAY_DRAGON); if (of_has(a_ptr->flags, OF_KILL_DEMON)) of_off(a_ptr->flags, OF_SLAY_DEMON); if (of_has(a_ptr->flags, OF_KILL_UNDEAD)) of_off(a_ptr->flags, OF_SLAY_UNDEAD); if (of_has(a_ptr->flags, OF_DRAIN_EXP)) of_off(a_ptr->flags, OF_HOLD_LIFE); } /* * Adjust the parsed frequencies for any peculiarities of the * algorithm. For example, if stat bonuses and sustains are * being added in a correlated fashion, it will tend to push * the frequencies up for both of them. In this method we * compensate for cases like this by applying corrective * scaling. */ static void adjust_freqs(void) { /* * Enforce minimum values for any frequencies that might potentially * be missing in the standard set, especially supercharged ones. * Numbers here represent the average number of times this ability * would appear if the entire randart set was eligible to receive * it (so in the case of a bow ability: if the set was all bows). * * Note that low numbers here for very specialized abilities could * mean that there's a good chance this ability will not appear in * a given randart set. If this is a problem, raise the number. */ if (artprobs[ART_IDX_GEN_RFEAR] < 5) artprobs[ART_IDX_GEN_RFEAR] = 5; if (artprobs[ART_IDX_MELEE_DICE_SUPER] < 5) artprobs[ART_IDX_MELEE_DICE_SUPER] = 5; if (artprobs[ART_IDX_BOW_SHOTS_SUPER] < 5) artprobs[ART_IDX_BOW_SHOTS_SUPER] = 5; if (artprobs[ART_IDX_BOW_MIGHT_SUPER] < 5) artprobs[ART_IDX_BOW_MIGHT_SUPER] = 5; if (artprobs[ART_IDX_MELEE_BLOWS_SUPER] < 5) artprobs[ART_IDX_MELEE_BLOWS_SUPER] = 5; if (artprobs[ART_IDX_GEN_SPEED_SUPER] < 5) artprobs[ART_IDX_GEN_SPEED_SUPER] = 5; if (artprobs[ART_IDX_GEN_AC] < 5) artprobs[ART_IDX_GEN_AC] = 5; if (artprobs[ART_IDX_GEN_TUNN] < 5) artprobs[ART_IDX_GEN_TUNN] = 5; if (artprobs[ART_IDX_NONWEAPON_BRAND] < 2) artprobs[ART_IDX_NONWEAPON_BRAND] = 2; if (artprobs[ART_IDX_NONWEAPON_SLAY] < 2) artprobs[ART_IDX_NONWEAPON_SLAY] = 2; if (artprobs[ART_IDX_BOW_BRAND] < 2) artprobs[ART_IDX_BOW_BRAND] = 2; if (artprobs[ART_IDX_BOW_SLAY] < 2) artprobs[ART_IDX_BOW_SLAY] = 2; if (artprobs[ART_IDX_NONWEAPON_BLOWS] < 2) artprobs[ART_IDX_NONWEAPON_BLOWS] = 2; if (artprobs[ART_IDX_NONWEAPON_SHOTS] < 2) artprobs[ART_IDX_NONWEAPON_SHOTS] = 2; if (artprobs[ART_IDX_GEN_AC_SUPER] < 5) artprobs[ART_IDX_GEN_AC_SUPER] = 5; if (artprobs[ART_IDX_MELEE_AC] < 5) artprobs[ART_IDX_MELEE_AC] = 5; if (artprobs[ART_IDX_GEN_PSTUN] < 3) artprobs[ART_IDX_GEN_PSTUN] = 3; /* Cut aggravation frequencies in half since they're used twice */ artprobs[ART_IDX_NONWEAPON_AGGR] /= 2; artprobs[ART_IDX_WEAPON_AGGR] /= 2; } /* * Parse the list of artifacts and count up the frequencies of the various * abilities. This is used to give dynamic generation probabilities. */ static void parse_frequencies(void) { size_t i; int j; const artifact_type *a_ptr; object_kind *k_ptr; s32b m, temp, temp2; bitflag mask[OF_SIZE]; file_putf(log_file, "\n****** BEGINNING GENERATION OF FREQUENCIES\n\n"); /* Zero the frequencies for artifact attributes */ for (i = 0; i < ART_IDX_TOTAL; i++) { artprobs[i] = 0; } /* * Initialise the frequencies for base items so that each item could * be chosen - we check for illegal items during choose_item() */ for (i = 0; i < z_info->k_max; i++) { baseprobs[i] = 1; } /* Go through the list of all artifacts */ for (i = 0; i < z_info->a_max; i++) { file_putf(log_file, "Current artifact index is %d\n", i); a_ptr = &a_info[i]; /* Special cases -- don't parse these! */ if ((i == ART_POWER) || (i == ART_GROND) || (i == ART_MORGOTH)) continue; /* Also don't parse cursed or null items */ if (base_power[i] < 0 || a_ptr->tval == 0) continue; /* Get a pointer to the base item for this artifact */ k_ptr = lookup_kind(a_ptr->tval, a_ptr->sval); /* Add the base item to the baseprobs array */ baseprobs[k_ptr->kidx]++; file_putf(log_file, "Base item is %d\n", k_ptr->kidx); /* Count up the abilities for this artifact */ if (a_ptr->tval == TV_BOW) { if(of_has(a_ptr->flags, OF_SHOTS)) { /* Do we have 3 or more extra shots? (Unlikely) */ if(a_ptr->pval[DEFAULT_PVAL] > 2) { file_putf(log_file, "Adding 1 for supercharged shots (3 or more!)\n"); (artprobs[ART_IDX_BOW_SHOTS_SUPER])++; } else { file_putf(log_file, "Adding 1 for extra shots\n"); (artprobs[ART_IDX_BOW_SHOTS])++; } } if(of_has(a_ptr->flags, OF_MIGHT)) { /* Do we have 3 or more extra might? (Unlikely) */ if(a_ptr->pval[DEFAULT_PVAL] > 2) { file_putf(log_file, "Adding 1 for supercharged might (3 or more!)\n"); (artprobs[ART_IDX_BOW_MIGHT_SUPER])++; } else { file_putf(log_file, "Adding 1 for extra might\n"); (artprobs[ART_IDX_BOW_MIGHT])++; } } /* Brands or slays - count all together */ create_mask(mask, FALSE, OFT_SLAY, OFT_BRAND, OFT_KILL, OFT_MAX); if (of_is_inter(a_ptr->flags, mask)) { /* We have some brands or slays - count them */ temp = list_slays(a_ptr->flags, mask, NULL, NULL, NULL, FALSE); create_mask(mask, FALSE, OFT_BRAND, OFT_MAX); temp2 = list_slays(a_ptr->flags, mask, NULL, NULL, NULL, FALSE); file_putf(log_file, "Adding %d for slays\n", temp - temp2); file_putf(log_file, "Adding %d for brands\n", temp2); /* Add these to the frequency count */ artprobs[ART_IDX_BOW_SLAY] += (temp - temp2); artprobs[ART_IDX_BOW_BRAND] += temp2; } } /* Handle hit / dam ratings - are they higher than normal? */ /* Also handle other weapon/nonweapon abilities */ if (a_ptr->tval == TV_BOW || a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD) { m = randcalc(k_ptr->to_h, 0, MINIMISE); temp = (a_ptr->to_h - m - mean_hit_startval) / mean_hit_increment; if (temp > 0) file_putf(log_file, "Adding %d instances of extra to-hit bonus for weapon\n", temp); else if (temp < 0) file_putf(log_file, "Subtracting %d instances of extra to-hit bonus for weapon\n", temp); artprobs[ART_IDX_WEAPON_HIT] += temp; m = randcalc(k_ptr->to_d, 0, MINIMISE); temp = (a_ptr->to_d - m - mean_dam_startval) / mean_dam_increment; if (temp > 0) file_putf(log_file, "Adding %d instances of extra to-dam bonus for weapon\n", temp); else file_putf(log_file, "Subtracting %d instances of extra to-dam bonus for weapon\n", temp); artprobs[ART_IDX_WEAPON_DAM] += temp; /* Aggravation */ if (of_has(a_ptr->flags, OF_AGGRAVATE)) { file_putf(log_file, "Adding 1 for aggravation - weapon\n"); artprobs[ART_IDX_WEAPON_AGGR]++; } /* End weapon stuff */ } else { if ( (a_ptr->to_h - randcalc(k_ptr->to_h, 0, MINIMISE) > 0) && (a_ptr->to_h - randcalc(k_ptr->to_h, 0, MINIMISE) == a_ptr->to_d - randcalc(k_ptr->to_d, 0, MINIMISE)) ) { /* Special case: both hit and dam bonuses present and equal */ temp = (a_ptr->to_d - randcalc(k_ptr->to_d, 0, MINIMISE)) / mean_dam_increment; if (temp > 0) { file_putf(log_file, "Adding %d instances of extra to-hit and to-dam bonus for non-weapon\n", temp); (artprobs[ART_IDX_NONWEAPON_HIT_DAM]) += temp; } } else { /* Uneven bonuses - handle separately */ if (a_ptr->to_h - randcalc(k_ptr->to_h, 0, MINIMISE) > 0) { temp = (a_ptr->to_d - randcalc(k_ptr->to_d, 0, MINIMISE)) / mean_dam_increment; if (temp > 0) { file_putf(log_file, "Adding %d instances of extra to-hit bonus for non-weapon\n", temp); (artprobs[ART_IDX_NONWEAPON_HIT]) += temp; } } if (a_ptr->to_d - randcalc(k_ptr->to_d, 0, MINIMISE) > 0) { temp = (a_ptr->to_d - randcalc(k_ptr->to_d, 0, MINIMISE)) / mean_dam_increment; if (temp > 0) { file_putf(log_file, "Adding %d instances of extra to-dam bonus for non-weapon\n", temp); (artprobs[ART_IDX_NONWEAPON_DAM]) += temp; } } } /* Aggravation */ if (of_has(a_ptr->flags, OF_AGGRAVATE)) { file_putf(log_file, "Adding 1 for aggravation - nonweapon\n"); (artprobs[ART_IDX_NONWEAPON_AGGR])++; } /* Brands or slays - count all together */ create_mask(mask, FALSE, OFT_SLAY, OFT_BRAND, OFT_KILL, OFT_MAX); if (of_is_inter(a_ptr->flags, mask)) { /* We have some brands or slays - count them */ temp = list_slays(a_ptr->flags, mask, NULL, NULL, NULL, FALSE); create_mask(mask, FALSE, OFT_BRAND, OFT_MAX); temp2 = list_slays(a_ptr->flags, mask, NULL, NULL, NULL, FALSE); file_putf(log_file, "Adding %d for slays\n", temp - temp2); file_putf(log_file, "Adding %d for brands\n", temp2); /* Add these to the frequency count */ artprobs[ART_IDX_NONWEAPON_SLAY] += (temp - temp2); artprobs[ART_IDX_NONWEAPON_BRAND] += temp2; } if (of_has(a_ptr->flags, OF_BLOWS)) { file_putf(log_file, "Adding 1 for extra blows on nonweapon\n"); (artprobs[ART_IDX_NONWEAPON_BLOWS])++; } if (of_has(a_ptr->flags, OF_SHOTS)) { file_putf(log_file, "Adding 1 for extra shots on nonweapon\n"); (artprobs[ART_IDX_NONWEAPON_SHOTS])++; } } if (a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD) { /* Blessed weapon? */ if (of_has(a_ptr->flags, OF_BLESSED)) { file_putf(log_file, "Adding 1 for blessed weapon\n"); (artprobs[ART_IDX_MELEE_BLESS])++; } /* See invisible? */ if (of_has(a_ptr->flags, OF_SEE_INVIS)) { file_putf(log_file, "Adding 1 for see invisible (weapon case)\n"); (artprobs[ART_IDX_MELEE_SINV])++; } /* Does this weapon have extra blows? */ if (of_has(a_ptr->flags, OF_BLOWS)) { /* Do we have 3 or more extra blows? (Unlikely) */ if(a_ptr->pval[DEFAULT_PVAL] > 2) { file_putf(log_file, "Adding 1 for supercharged blows (3 or more!)\n"); (artprobs[ART_IDX_MELEE_BLOWS_SUPER])++; } else { file_putf(log_file, "Adding 1 for extra blows\n"); (artprobs[ART_IDX_MELEE_BLOWS])++; } } /* Does this weapon have an unusual bonus to AC? */ if ( (a_ptr->to_a - randcalc(k_ptr->to_a, 0, MAXIMISE)) > 0) { temp = (a_ptr->to_a - randcalc(k_ptr->to_a, 0, MAXIMISE)) / mean_ac_increment; if (temp > 0) { file_putf(log_file, "Adding %d instances of extra AC bonus for weapon\n", temp); (artprobs[ART_IDX_MELEE_AC]) += temp; } } /* Check damage dice - are they more than normal? */ if (a_ptr->dd > k_ptr->dd) { /* Difference of 3 or more? */ if ( (a_ptr->dd - k_ptr->dd) > 2) { file_putf(log_file, "Adding 1 for super-charged damage dice!\n"); (artprobs[ART_IDX_MELEE_DICE_SUPER])++; } else { file_putf(log_file, "Adding 1 for extra damage dice.\n"); (artprobs[ART_IDX_MELEE_DICE])++; } } /* Check weight - is it different from normal? */ if (a_ptr->weight != k_ptr->weight) { file_putf(log_file, "Adding 1 for unusual weight.\n"); (artprobs[ART_IDX_MELEE_WEIGHT])++; } /* Check for tunnelling ability */ if (of_has(a_ptr->flags, OF_TUNNEL)) { file_putf(log_file, "Adding 1 for tunnelling bonus.\n"); (artprobs[ART_IDX_MELEE_TUNN])++; } /* Brands or slays - count all together */ create_mask(mask, FALSE, OFT_SLAY, OFT_BRAND, OFT_KILL, OFT_MAX); if (of_is_inter(a_ptr->flags, mask)) { /* We have some brands or slays - count them */ temp = list_slays(a_ptr->flags, mask, NULL, NULL, NULL, FALSE); create_mask(mask, FALSE, OFT_BRAND, OFT_MAX); temp2 = list_slays(a_ptr->flags, mask, NULL, NULL, NULL, FALSE); file_putf(log_file, "Adding %d for slays\n", temp - temp2); file_putf(log_file, "Adding %d for brands\n", temp2); /* Add these to the frequency count */ artprobs[ART_IDX_MELEE_SLAY] += (temp - temp2); artprobs[ART_IDX_MELEE_BRAND] += temp2; } /* End of weapon-specific stuff */ } else { /* Check for tunnelling ability */ if (of_has(a_ptr->flags, OF_TUNNEL)) { file_putf(log_file, "Adding 1 for tunnelling bonus - general.\n"); (artprobs[ART_IDX_GEN_TUNN])++; } } /* * Count up extra AC bonus values. * Could also add logic to subtract for lower values here, but it's * probably not worth the trouble since it's so rare. */ if ( (a_ptr->to_a - randcalc(k_ptr->to_a, 0, MINIMISE) - mean_ac_startval) > 0) { temp = (a_ptr->to_a - randcalc(k_ptr->to_a, 0, MINIMISE) - mean_ac_startval) / mean_ac_increment; if (temp > 0) { if (a_ptr->to_a > 20) { file_putf(log_file, "Adding %d for supercharged AC\n", temp); (artprobs[ART_IDX_GEN_AC_SUPER])++; } else if (a_ptr->tval == TV_BOOTS) { file_putf(log_file, "Adding %d for AC bonus - boots\n", temp); (artprobs[ART_IDX_BOOT_AC]) += temp; } else if (a_ptr->tval == TV_GLOVES) { file_putf(log_file, "Adding %d for AC bonus - gloves\n", temp); (artprobs[ART_IDX_GLOVE_AC]) += temp; } else if (a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) { file_putf(log_file, "Adding %d for AC bonus - headgear\n", temp); (artprobs[ART_IDX_HELM_AC]) += temp; } else if (a_ptr->tval == TV_SHIELD) { file_putf(log_file, "Adding %d for AC bonus - shield\n", temp); (artprobs[ART_IDX_SHIELD_AC]) += temp; } else if (a_ptr->tval == TV_CLOAK) { file_putf(log_file, "Adding %d for AC bonus - cloak\n", temp); (artprobs[ART_IDX_CLOAK_AC]) += temp; } else if (a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { file_putf(log_file, "Adding %d for AC bonus - body armor\n", temp); (artprobs[ART_IDX_ARMOR_AC]) += temp; } else { file_putf(log_file, "Adding %d for AC bonus - general\n", temp); (artprobs[ART_IDX_GEN_AC]) += temp; } } } /* Generic armor abilities */ if (a_ptr->tval == TV_BOOTS || a_ptr->tval == TV_GLOVES || a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN || a_ptr->tval == TV_SHIELD || a_ptr->tval == TV_CLOAK || a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { /* Check weight - is it different from normal? */ /* ToDo: count higher and lower separately */ if (a_ptr->weight != k_ptr->weight) { file_putf(log_file, "Adding 1 for unusual weight.\n"); (artprobs[ART_IDX_ALLARMOR_WEIGHT])++; } /* Done with generic armor abilities */ } /* * General abilities. This section requires a bit more work * than the others, because we have to consider cases where * a certain ability might be found in a particular item type. * For example, ESP is commonly found on headgear, so when * we count ESP we must add it to either the headgear or * general tally, depending on the base item. This permits * us to have general abilities appear more commonly on a * certain item type. */ if (flags_test(a_ptr->flags, OF_SIZE, OF_STR, OF_INT, OF_WIS, OF_DEX, OF_CON, FLAG_END)) { /* Stat bonus case. Add up the number of individual bonuses */ temp = 0; if (of_has(a_ptr->flags, OF_STR)) temp++; if (of_has(a_ptr->flags, OF_INT)) temp++; if (of_has(a_ptr->flags, OF_WIS)) temp++; if (of_has(a_ptr->flags, OF_DEX)) temp++; if (of_has(a_ptr->flags, OF_CON)) temp++; /* Handle a few special cases separately. */ if((a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) && (of_has(a_ptr->flags, OF_WIS) || of_has(a_ptr->flags, OF_INT))) { /* Handle WIS and INT on helms and crowns */ if(of_has(a_ptr->flags, OF_WIS)) { file_putf(log_file, "Adding 1 for WIS bonus on headgear.\n"); (artprobs[ART_IDX_HELM_WIS])++; /* Counted this one separately so subtract it here */ temp--; } if(of_has(a_ptr->flags, OF_INT)) { file_putf(log_file, "Adding 1 for INT bonus on headgear.\n"); (artprobs[ART_IDX_HELM_INT])++; /* Counted this one separately so subtract it here */ temp--; } } else if ((a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) && of_has(a_ptr->flags, OF_CON)) { /* Handle CON bonus on armor */ file_putf(log_file, "Adding 1 for CON bonus on body armor.\n"); (artprobs[ART_IDX_ARMOR_CON])++; /* Counted this one separately so subtract it here */ temp--; } else if (a_ptr->tval == TV_GLOVES && of_has(a_ptr->flags, OF_DEX)) { /* Handle DEX bonus on gloves */ file_putf(log_file, "Adding 1 for DEX bonus on gloves.\n"); (artprobs[ART_IDX_GLOVE_DEX])++; /* Counted this one separately so subtract it here */ temp--; } /* Now the general case */ if (temp > 0) { /* There are some bonuses that weren't handled above */ file_putf(log_file, "Adding %d for stat bonuses - general.\n", temp); (artprobs[ART_IDX_GEN_STAT]) += temp; /* Done with stat bonuses */ } } if (flags_test(a_ptr->flags, OF_SIZE, OF_SUST_STR, OF_SUST_INT, OF_SUST_WIS, OF_SUST_DEX, OF_SUST_CON, FLAG_END)) { /* Now do sustains, in a similar manner */ temp = 0; if (of_has(a_ptr->flags, OF_SUST_STR)) temp++; if (of_has(a_ptr->flags, OF_SUST_INT)) temp++; if (of_has(a_ptr->flags, OF_SUST_WIS)) temp++; if (of_has(a_ptr->flags, OF_SUST_DEX)) temp++; if (of_has(a_ptr->flags, OF_SUST_CON)) temp++; file_putf(log_file, "Adding %d for stat sustains.\n", temp); (artprobs[ART_IDX_GEN_SUST]) += temp; } if (of_has(a_ptr->flags, OF_STEALTH)) { /* Handle stealth, including a couple of special cases */ if(a_ptr->tval == TV_BOOTS) { file_putf(log_file, "Adding 1 for stealth bonus on boots.\n"); (artprobs[ART_IDX_BOOT_STEALTH])++; } else if (a_ptr->tval == TV_CLOAK) { file_putf(log_file, "Adding 1 for stealth bonus on cloak.\n"); (artprobs[ART_IDX_CLOAK_STEALTH])++; } else if (a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { file_putf(log_file, "Adding 1 for stealth bonus on armor.\n"); (artprobs[ART_IDX_ARMOR_STEALTH])++; } else { /* General case */ file_putf(log_file, "Adding 1 for stealth bonus - general.\n"); (artprobs[ART_IDX_GEN_STEALTH])++; } /* Done with stealth */ } if (of_has(a_ptr->flags, OF_SEARCH)) { /* Handle searching bonus - fully generic this time */ file_putf(log_file, "Adding 1 for search bonus - general.\n"); (artprobs[ART_IDX_GEN_SEARCH])++; } if (of_has(a_ptr->flags, OF_INFRA)) { /* Handle infravision bonus - fully generic */ file_putf(log_file, "Adding 1 for infravision bonus - general.\n"); (artprobs[ART_IDX_GEN_INFRA])++; } if (of_has(a_ptr->flags, OF_SPEED)) { /* * Speed - boots handled separately. * This is something of a special case in that we use the same * frequency for the supercharged value and the normal value. * We get away with this by using a somewhat lower average value * for the supercharged ability than in the basic set (around * +7 or +8 - c.f. Ringil and the others at +10 and upwards). * This then allows us to add an equal number of * small bonuses around +3 or so without unbalancing things. */ if (a_ptr->pval[DEFAULT_PVAL] > 7) { /* Supercharge case */ file_putf(log_file, "Adding 1 for supercharged speed bonus!\n"); (artprobs[ART_IDX_GEN_SPEED_SUPER])++; } else if(a_ptr->tval == TV_BOOTS) { /* Handle boots separately */ file_putf(log_file, "Adding 1 for normal speed bonus on boots.\n"); (artprobs[ART_IDX_BOOT_SPEED])++; } else { file_putf(log_file, "Adding 1 for normal speed bonus - general.\n"); (artprobs[ART_IDX_GEN_SPEED])++; } /* Done with speed */ } if (flags_test(a_ptr->flags, OF_SIZE, OF_IM_ACID, OF_IM_ELEC, OF_IM_FIRE, OF_IM_COLD, FLAG_END)) { /* Count up immunities for this item, if any */ temp = 0; if (of_has(a_ptr->flags, OF_IM_ACID)) temp++; if (of_has(a_ptr->flags, OF_IM_ELEC)) temp++; if (of_has(a_ptr->flags, OF_IM_FIRE)) temp++; if (of_has(a_ptr->flags, OF_IM_COLD)) temp++; file_putf(log_file, "Adding %d for immunities.\n", temp); (artprobs[ART_IDX_GEN_IMMUNE]) += temp; } if (of_has(a_ptr->flags, OF_FREE_ACT)) { /* Free action - handle gloves separately */ if(a_ptr->tval == TV_GLOVES) { file_putf(log_file, "Adding 1 for free action on gloves.\n"); (artprobs[ART_IDX_GLOVE_FA])++; } else { file_putf(log_file, "Adding 1 for free action - general.\n"); (artprobs[ART_IDX_GEN_FA])++; } } if (of_has(a_ptr->flags, OF_HOLD_LIFE)) { /* Hold life - do body armor separately */ if( (a_ptr->tval == TV_SOFT_ARMOR) || (a_ptr->tval == TV_HARD_ARMOR) || (a_ptr->tval == TV_DRAG_ARMOR)) { file_putf(log_file, "Adding 1 for hold life on armor.\n"); (artprobs[ART_IDX_ARMOR_HLIFE])++; } else { file_putf(log_file, "Adding 1 for hold life - general.\n"); (artprobs[ART_IDX_GEN_HLIFE])++; } } if (of_has(a_ptr->flags, OF_FEATHER)) { /* Feather fall - handle boots separately */ if(a_ptr->tval == TV_BOOTS) { file_putf(log_file, "Adding 1 for feather fall on boots.\n"); (artprobs[ART_IDX_BOOT_FEATHER])++; } else { file_putf(log_file, "Adding 1 for feather fall - general.\n"); (artprobs[ART_IDX_GEN_FEATHER])++; } } if (of_has(a_ptr->flags, OF_LIGHT)) { /* Handle permanent light */ file_putf(log_file, "Adding 1 for light radius - general.\n"); (artprobs[ART_IDX_GEN_LIGHT])++; } if (of_has(a_ptr->flags, OF_SEE_INVIS)) { /* * Handle see invisible - do helms / crowns separately * (Weapons were done already so exclude them) */ if( !(a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD)) { if (a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) { file_putf(log_file, "Adding 1 for see invisible - headgear.\n"); (artprobs[ART_IDX_HELM_SINV])++; } else { file_putf(log_file, "Adding 1 for see invisible - general.\n"); (artprobs[ART_IDX_GEN_SINV])++; } } } if (of_has(a_ptr->flags, OF_TELEPATHY)) { /* ESP case. Handle helms/crowns separately. */ if(a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) { file_putf(log_file, "Adding 1 for ESP on headgear.\n"); (artprobs[ART_IDX_HELM_ESP])++; } else { file_putf(log_file, "Adding 1 for ESP - general.\n"); (artprobs[ART_IDX_GEN_ESP])++; } } if (of_has(a_ptr->flags, OF_SLOW_DIGEST)) { /* Slow digestion case - generic. */ file_putf(log_file, "Adding 1 for slow digestion - general.\n"); (artprobs[ART_IDX_GEN_SDIG])++; } if (of_has(a_ptr->flags, OF_REGEN)) { /* Regeneration case - generic. */ file_putf(log_file, "Adding 1 for regeneration - general.\n"); (artprobs[ART_IDX_GEN_REGEN])++; } if (flags_test(a_ptr->flags, OF_SIZE, OF_RES_ACID, OF_RES_ELEC, OF_RES_FIRE, OF_RES_COLD, FLAG_END)) { /* Count up low resists (not the type, just the number) */ temp = 0; if (of_has(a_ptr->flags, OF_RES_ACID)) temp++; if (of_has(a_ptr->flags, OF_RES_ELEC)) temp++; if (of_has(a_ptr->flags, OF_RES_FIRE)) temp++; if (of_has(a_ptr->flags, OF_RES_COLD)) temp++; /* Shields treated separately */ if (a_ptr->tval == TV_SHIELD) { file_putf(log_file, "Adding %d for low resists on shield.\n", temp); (artprobs[ART_IDX_SHIELD_LRES]) += temp; } else if (a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { /* Armor also treated separately */ if (temp == 4) { /* Special case: armor has all four low resists */ file_putf(log_file, "Adding 1 for ALL LOW RESISTS on body armor.\n"); (artprobs[ART_IDX_ARMOR_ALLRES])++; } else { /* Just tally up the resists as usual */ file_putf(log_file, "Adding %d for low resists on body armor.\n", temp); (artprobs[ART_IDX_ARMOR_LRES]) += temp; } } else { /* General case */ file_putf(log_file, "Adding %d for low resists - general.\n", temp); (artprobs[ART_IDX_GEN_LRES]) += temp; } /* Done with low resists */ } /* * If the item is body armor then count up all the high resists before * going through them individually. High resists are an important * component of body armor so we track probability for them separately. * The proportions of the high resists will be determined by the * generic frequencies - this number just tracks the total. */ if (a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { temp = 0; if (of_has(a_ptr->flags, OF_RES_POIS)) temp++; if (of_has(a_ptr->flags, OF_RES_FEAR)) temp++; if (of_has(a_ptr->flags, OF_RES_LIGHT)) temp++; if (of_has(a_ptr->flags, OF_RES_DARK)) temp++; if (of_has(a_ptr->flags, OF_RES_BLIND)) temp++; if (of_has(a_ptr->flags, OF_RES_CONFU)) temp++; if (of_has(a_ptr->flags, OF_RES_SOUND)) temp++; if (of_has(a_ptr->flags, OF_RES_SHARD)) temp++; if (of_has(a_ptr->flags, OF_RES_NEXUS)) temp++; if (of_has(a_ptr->flags, OF_RES_NETHR)) temp++; if (of_has(a_ptr->flags, OF_RES_CHAOS)) temp++; if (of_has(a_ptr->flags, OF_RES_DISEN)) temp++; if (of_has(a_ptr->flags, OF_RES_STUN)) temp++; file_putf(log_file, "Adding %d for high resists on body armor.\n", temp); (artprobs[ART_IDX_ARMOR_HRES]) += temp; } /* Now do the high resists individually */ if (of_has(a_ptr->flags, OF_RES_POIS)) { /* Resist poison ability */ file_putf(log_file, "Adding 1 for resist poison - general.\n"); (artprobs[ART_IDX_GEN_RPOIS])++; } if (of_has(a_ptr->flags, OF_RES_FEAR)) { /* Resist fear ability */ file_putf(log_file, "Adding 1 for resist fear - general.\n"); (artprobs[ART_IDX_GEN_RFEAR])++; } if (of_has(a_ptr->flags, OF_RES_LIGHT)) { /* Resist light ability */ file_putf(log_file, "Adding 1 for resist light - general.\n"); (artprobs[ART_IDX_GEN_RLIGHT])++; } if (of_has(a_ptr->flags, OF_RES_DARK)) { /* Resist dark ability */ file_putf(log_file, "Adding 1 for resist dark - general.\n"); (artprobs[ART_IDX_GEN_RDARK])++; } if (of_has(a_ptr->flags, OF_RES_BLIND)) { /* Resist blind ability - helms/crowns are separate */ if(a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) { file_putf(log_file, "Adding 1 for resist blindness - headgear.\n"); (artprobs[ART_IDX_HELM_RBLIND])++; } else { /* General case */ file_putf(log_file, "Adding 1 for resist blindness - general.\n"); (artprobs[ART_IDX_GEN_RBLIND])++; } } if (of_has(a_ptr->flags, OF_RES_CONFU)) { /* Resist confusion ability */ file_putf(log_file, "Adding 1 for resist confusion - general.\n"); (artprobs[ART_IDX_GEN_RCONF])++; } if (of_has(a_ptr->flags, OF_RES_SOUND)) { /* Resist sound ability */ file_putf(log_file, "Adding 1 for resist sound - general.\n"); (artprobs[ART_IDX_GEN_RSOUND])++; } if (of_has(a_ptr->flags, OF_RES_SHARD)) { /* Resist shards ability */ file_putf(log_file, "Adding 1 for resist shards - general.\n"); (artprobs[ART_IDX_GEN_RSHARD])++; } if (of_has(a_ptr->flags, OF_RES_NEXUS)) { /* Resist nexus ability */ file_putf(log_file, "Adding 1 for resist nexus - general.\n"); (artprobs[ART_IDX_GEN_RNEXUS])++; } if (of_has(a_ptr->flags, OF_RES_NETHR)) { /* Resist nether ability */ file_putf(log_file, "Adding 1 for resist nether - general.\n"); (artprobs[ART_IDX_GEN_RNETHER])++; } if (of_has(a_ptr->flags, OF_RES_CHAOS)) { /* Resist chaos ability */ file_putf(log_file, "Adding 1 for resist chaos - general.\n"); (artprobs[ART_IDX_GEN_RCHAOS])++; } if (of_has(a_ptr->flags, OF_RES_DISEN)) { /* Resist disenchantment ability */ file_putf(log_file, "Adding 1 for resist disenchantment - general.\n"); (artprobs[ART_IDX_GEN_RDISEN])++; } if (of_has(a_ptr->flags, OF_RES_STUN)) { /* Resist stunning ability */ file_putf(log_file, "Adding 1 for res_stun - general.\n"); (artprobs[ART_IDX_GEN_PSTUN])++; } if (a_ptr->effect) { /* Activation */ file_putf(log_file, "Adding 1 for activation.\n"); (artprobs[ART_IDX_GEN_ACTIV])++; } /* Done with parsing of frequencies for this item */ } /* End for loop */ if (verbose) { /* Print out some of the abilities, to make sure that everything's fine */ for (i = 0; i < ART_IDX_TOTAL; i++) { file_putf(log_file, "Frequency of ability %d: %d\n", i, artprobs[i]); } for (i = 0; i < z_info->k_max; i++) { file_putf(log_file, "Frequency of item %d: %d\n", i, baseprobs[i]); } } /* * Rescale the abilities so that dependent / independent abilities are * comparable. We do this by rescaling the frequencies for item-dependent * abilities as though the entire set was made up of that item type. For * example, if one bow out of three has extra might, and there are 120 * artifacts in the full set, we rescale the frequency for extra might to * 40 (if we had 120 randart bows, about 40 would have extra might). * * This will allow us to compare the frequencies of all ability types, * no matter what the dependency. We assume that generic abilities (like * resist fear in the current version) don't need rescaling. This * introduces some inaccuracy in cases where specific instances of an * ability (like INT bonus on helms) have been counted separately - * ideally we should adjust for this in the general case. However, as * long as this doesn't occur too often, it shouldn't be a big issue. * * The following loops look complicated, but they are simply equivalent * to going through each of the relevant ability types one by one. */ /* Bow-only abilities */ for (i = 0; i < N_ELEMENTS(art_idx_bow); i++) { artprobs[art_idx_bow[i]] = (artprobs[art_idx_bow[i]] * art_total) / art_bow_total; } /* All weapon abilities */ for (i = 0; i < N_ELEMENTS(art_idx_weapon); i++) { artprobs[art_idx_weapon[i]] = (artprobs[art_idx_weapon[i]] * art_total) / (art_bow_total + art_melee_total); } /* Corresponding non-weapon abilities */ temp = art_total - art_melee_total - art_bow_total; for (i = 0; i < N_ELEMENTS(art_idx_nonweapon); i++) { artprobs[art_idx_nonweapon[i]] = (artprobs[art_idx_nonweapon[i]] * art_total) / temp; } /* All melee weapon abilities */ for (i = 0; i < N_ELEMENTS(art_idx_melee); i++) { artprobs[art_idx_melee[i]] = (artprobs[art_idx_melee[i]] * art_total) / art_melee_total; } /* All general armor abilities */ temp = art_armor_total + art_boot_total + art_shield_total + art_headgear_total + art_cloak_total + art_glove_total; for (i = 0; i < N_ELEMENTS(art_idx_allarmor); i++) { artprobs[art_idx_allarmor[i]] = (artprobs[art_idx_allarmor[i]] * art_total) / temp; } /* Boots */ for (i = 0; i < N_ELEMENTS(art_idx_boot); i++) { artprobs[art_idx_boot[i]] = (artprobs[art_idx_boot[i]] * art_total) / art_boot_total; } /* Gloves */ for (i = 0; i < N_ELEMENTS(art_idx_glove); i++) { artprobs[art_idx_glove[i]] = (artprobs[art_idx_glove[i]] * art_total) / art_glove_total; } /* Headgear */ for (i = 0; i < N_ELEMENTS(art_idx_headgear); i++) { artprobs[art_idx_headgear[i]] = (artprobs[art_idx_headgear[i]] * art_total) / art_headgear_total; } /* Shields */ for (i = 0; i < N_ELEMENTS(art_idx_shield); i++) { artprobs[art_idx_shield[i]] = (artprobs[art_idx_shield[i]] * art_total) / art_shield_total; } /* Cloaks */ for (i = 0; i < N_ELEMENTS(art_idx_cloak); i++) { artprobs[art_idx_cloak[i]] = (artprobs[art_idx_cloak[i]] * art_total) / art_cloak_total; } /* Body armor */ for (i = 0; i < N_ELEMENTS(art_idx_armor); i++) { artprobs[art_idx_armor[i]] = (artprobs[art_idx_armor[i]] * art_total) / art_armor_total; } /* * All others are general case and don't need to be rescaled, * unless the algorithm is getting too clever about separating * out individual cases (in which case some logic should be * added for them in the following method call). */ /* Perform any additional rescaling and adjustment, if required. */ adjust_freqs(); /* Log the final frequencies to check that everything's correct */ for(i = 0; i < ART_IDX_TOTAL; i++) { file_putf(log_file, "Rescaled frequency of ability %d: %d\n", i, artprobs[i]); } /* Build a cumulative frequency table for the base items */ for (i = 0; i < z_info->k_max; i++) { for (j = i; j < z_info->k_max; j++) { base_freq[j] += baseprobs[i]; } } /* Print out the frequency table, for verification */ for (i = 0; i < z_info->k_max; i++) { file_putf(log_file, "Cumulative frequency of item %d is: %d\n", i, base_freq[i]); } } /* * Adds a flag to an artifact. Returns true when canges were made. */ static bool add_flag(artifact_type *a_ptr, int flag) { if (of_has(a_ptr->flags, flag)) return FALSE; of_on(a_ptr->flags, flag); file_putf(log_file, "Adding ability: %s\n", flag_name(flag)); return TRUE; } /* * Adds a flag and pval to an artifact. Always attempts * to increase the pval. */ static void add_pval_flag(artifact_type *a_ptr, int flag) { of_on(a_ptr->flags, flag); of_on(a_ptr->pval_flags[DEFAULT_PVAL], flag); do_pval(a_ptr); file_putf(log_file, "Adding ability: %s (now %+d)\n", flag_name(flag), a_ptr->pval[DEFAULT_PVAL]); } /* * Adds a flag and a pval to an artifact, but won't increase * the pval if the flag is present. Returns true when changes were made. */ static bool add_fixed_pval_flag(artifact_type *a_ptr, int flag) { if (of_has(a_ptr->flags, flag)) return FALSE; of_on(a_ptr->flags, flag); of_on(a_ptr->pval_flags[DEFAULT_PVAL], flag); do_pval(a_ptr); file_putf(log_file, "Adding ability: %s (now %+d)\n", flag_name(flag), a_ptr->pval[DEFAULT_PVAL]); return TRUE; } /* * Adds a flag and an initial pval to an artifact. Returns true * when the flag was not present. */ static bool add_first_pval_flag(artifact_type *a_ptr, int flag) { of_on(a_ptr->flags, flag); of_on(a_ptr->pval_flags[DEFAULT_PVAL], flag); if (a_ptr->pval[DEFAULT_PVAL] == 0) { a_ptr->pval[DEFAULT_PVAL] = (s16b)randint1(4); file_putf(log_file, "Adding ability: %s (first time) (now %+d)\n", flag_name(flag), a_ptr->pval[DEFAULT_PVAL]); return TRUE; } do_pval(a_ptr); file_putf(log_file, "Adding ability: %s (now %+d)\n", flag_name(flag), a_ptr->pval[DEFAULT_PVAL]); return FALSE; } /* Count pvals and set num_pvals accordingly*/ static void recalc_num_pvals(artifact_type *a_ptr) { int i; a_ptr->num_pvals = 0; for (i = 0; i < MAX_PVALS; i++) if (a_ptr->pval[i] != 0) a_ptr->num_pvals++; file_putf(log_file, "a_ptr->num_pvals is now %d.\n", a_ptr->num_pvals); } static void add_stat(artifact_type *a_ptr) { int r; bool success = FALSE; /* Hack: break out if all stats are raised to avoid an infinite loop */ if (flags_test_all(a_ptr->flags, OF_SIZE, OF_STR, OF_INT, OF_WIS, OF_DEX, OF_CON, FLAG_END)) return; /* Make sure we add one that hasn't been added yet */ while (!success) { r = randint0(5); if (r == 0) success = add_fixed_pval_flag(a_ptr, OF_STR); else if (r == 1) success = add_fixed_pval_flag(a_ptr, OF_INT); else if (r == 2) success = add_fixed_pval_flag(a_ptr, OF_WIS); else if (r == 3) success = add_fixed_pval_flag(a_ptr, OF_DEX); else if (r == 4) success = add_fixed_pval_flag(a_ptr, OF_CON); } } static void add_sustain(artifact_type *a_ptr) { int r; bool success = FALSE; /* Hack: break out if all stats are sustained to avoid an infinite loop */ if (flags_test_all(a_ptr->flags, OF_SIZE, OF_SUST_STR, OF_SUST_INT, OF_SUST_WIS, OF_SUST_DEX, OF_SUST_CON, FLAG_END)) return; while (!success) { r = randint0(5); if (r == 0) success = add_flag(a_ptr, OF_SUST_STR); else if (r == 1) success = add_flag(a_ptr, OF_SUST_INT); else if (r == 2) success = add_flag(a_ptr, OF_SUST_WIS); else if (r == 3) success = add_flag(a_ptr, OF_SUST_DEX); else if (r == 4) success = add_flag(a_ptr, OF_SUST_CON); } } static void add_low_resist(artifact_type *a_ptr) { int r; bool success = FALSE; /* Hack - if all low resists added already, exit to avoid infinite loop */ if(flags_test_all(a_ptr->flags, OF_SIZE, OF_RES_ACID, OF_RES_ELEC, OF_RES_FIRE, OF_RES_COLD, FLAG_END)) return; while (!success) { r = randint0(4); if (r == 0) success = add_flag(a_ptr, OF_RES_ACID); else if (r == 1) success = add_flag(a_ptr, OF_RES_ELEC); else if (r == 2) success = add_flag(a_ptr, OF_RES_FIRE); else if (r == 3) success = add_flag(a_ptr, OF_RES_COLD); } } static void add_high_resist(artifact_type *a_ptr) { /* Add a high resist, according to the generated frequency distribution. */ size_t i; int r, temp; int count = 0; bool success = FALSE; temp = 0; for (i = 0; i < N_ELEMENTS(art_idx_high_resist); i++) { temp += artprobs[art_idx_high_resist[i]]; } /* The following will fail (cleanly) if all high resists already added */ while ( (!success) && (count < MAX_TRIES) ) { /* Randomize from 1 to this total amount */ r = randint1(temp); /* Determine which (weighted) resist this number corresponds to */ temp = artprobs[art_idx_high_resist[0]]; i = 0; while (r > temp && i < N_ELEMENTS(art_idx_high_resist)) { temp += artprobs[art_idx_high_resist[i]]; i++; } /* Now i should give us the index of the correct high resist */ if (i == 0) success = add_flag(a_ptr, OF_RES_POIS); else if (i == 1) success = add_flag(a_ptr, OF_RES_FEAR); else if (i == 2) success = add_flag(a_ptr, OF_RES_LIGHT); else if (i == 3) success = add_flag(a_ptr, OF_RES_DARK); else if (i == 4) success = add_flag(a_ptr, OF_RES_BLIND); else if (i == 5) success = add_flag(a_ptr, OF_RES_CONFU); else if (i == 6) success = add_flag(a_ptr, OF_RES_SOUND); else if (i == 7) success = add_flag(a_ptr, OF_RES_SHARD); else if (i == 8) success = add_flag(a_ptr, OF_RES_NEXUS); else if (i == 9) success = add_flag(a_ptr, OF_RES_NETHR); else if (i == 10) success = add_flag(a_ptr, OF_RES_CHAOS); else if (i == 11) success = add_flag(a_ptr, OF_RES_DISEN); else if (i == 12) success = add_flag(a_ptr, OF_RES_STUN); count++; } } static void add_slay(artifact_type *a_ptr, bool brand) { int count = 0; const struct slay *s_ptr; bitflag mask[OF_SIZE]; if (brand) create_mask(mask, FALSE, OFT_BRAND, OFT_MAX); else create_mask(mask, FALSE, OFT_SLAY, OFT_KILL, OFT_MAX); for(count = 0; count < MAX_TRIES; count++) { s_ptr = random_slay(mask); if (!of_has(a_ptr->flags, s_ptr->object_flag)) { of_on(a_ptr->flags, s_ptr->object_flag); file_putf(log_file, "Adding %s: %s\n", s_ptr->brand ? "brand" : "slay", s_ptr->brand ? s_ptr->brand : s_ptr->desc); return; } } } static void add_damage_dice(artifact_type *a_ptr) { /* CR 2001-09-02: changed this to increments 1 or 2 only */ a_ptr->dd += (byte)randint1(2); /* if (a_ptr->dd > 9) a_ptr->dd = 9; */ file_putf(log_file, "Adding ability: extra damage dice (now %d dice)\n", a_ptr->dd); } static void add_to_hit(artifact_type *a_ptr, int fixed, int random) { /* Inhibit above certain threshholds */ if (a_ptr->to_h > VERYHIGH_TO_HIT) { if (!INHIBIT_STRONG) { file_putf(log_file, "Failed to add to-hit, value of %d is too high\n", a_ptr->to_h); return; } } else if (a_ptr->to_h > HIGH_TO_HIT) { if (!INHIBIT_WEAK) { file_putf(log_file, "Failed to add to-hit, value of %d is too high\n", a_ptr->to_h); return; } } a_ptr->to_h += (s16b)(fixed + randint0(random)); file_putf(log_file, "Adding ability: extra to_h (now %+d)\n", a_ptr->to_h); } static void add_to_dam(artifact_type *a_ptr, int fixed, int random) { /* Inhibit above certain threshholds */ if (a_ptr->to_d > VERYHIGH_TO_DAM) { if (!INHIBIT_STRONG) { file_putf(log_file, "Failed to add to-dam, value of %d is too high\n", a_ptr->to_d); return; } } else if (a_ptr->to_h > HIGH_TO_DAM) { if (!INHIBIT_WEAK) { file_putf(log_file, "Failed to add to-dam, value of %d is too high\n", a_ptr->to_d); return; } } a_ptr->to_d += (s16b)(fixed + randint0(random)); file_putf(log_file, "Adding ability: extra to_dam (now %+d)\n", a_ptr->to_d); } static void add_to_AC(artifact_type *a_ptr, int fixed, int random) { /* Inhibit above certain threshholds */ if (a_ptr->to_a > VERYHIGH_TO_AC) { if (!INHIBIT_STRONG) { file_putf(log_file, "Failed to add to-AC, value of %d is too high\n", a_ptr->to_a); return; } } else if (a_ptr->to_h > HIGH_TO_AC) { if (!INHIBIT_WEAK) { file_putf(log_file, "Failed to add to-AC, value of %d is too high\n", a_ptr->to_a); return; } } a_ptr->to_a += (s16b)(fixed + randint0(random)); file_putf(log_file, "Adding ability: AC bonus (new bonus is %+d)\n", a_ptr->to_a); } static void add_weight_mod(artifact_type *a_ptr) { a_ptr->weight = (a_ptr->weight * 9) / 10; file_putf(log_file, "Adding ability: lower weight (new weight is %d)\n", a_ptr->weight); } /* * Add a random immunity to this artifact * ASSUMPTION: All immunities are equally likely. * ToDo: replace with lookup once immunities are abstracted */ static void add_immunity(artifact_type *a_ptr) { int imm_type = randint0(4); switch(imm_type) { case 0: { of_on(a_ptr->flags, OF_IM_ACID); file_putf(log_file, "Adding ability: immunity to acid\n"); break; } case 1: { of_on(a_ptr->flags, OF_IM_ELEC); file_putf(log_file, "Adding ability: immunity to lightning\n"); break; } case 2: { of_on(a_ptr->flags, OF_IM_FIRE); file_putf(log_file, "Adding ability: immunity to fire\n"); break; } case 3: { of_on(a_ptr->flags, OF_IM_COLD); file_putf(log_file, "Adding ability: immunity to cold\n"); break; } } } /* Add an activation (called only if artifact does not yet have one) */ static void add_activation(artifact_type *a_ptr, s32b target_power) { int i, x, p, max_effect = 0; int count = 0; /* Work out the maximum allowed effect power */ for (i = 0; i < EF_MAX; i++) { if (effect_power(i) > max_effect && effect_power(i) < INHIBIT_POWER) max_effect = effect_power(i); } /* Select an effect at random */ while (count < MAX_TRIES) { x = randint0(EF_MAX); p = effect_power(x); /* * Check that activation is useful but not exploitable, * and roughly proportionate to the overall power */ if (p < INHIBIT_POWER && 100 * p / max_effect > 50 * target_power / max_power && 100 * p / max_effect < 200 * target_power / max_power) { file_putf(log_file, "Adding activation effect %d\n", x); a_ptr->effect = x; a_ptr->time.base = (p * 8); a_ptr->time.dice = (p > 5 ? p / 5 : 1); a_ptr->time.sides = p; return; } count++; } } /* * Build a suitable frequency table for this item, based on the generated * frequencies. The frequencies for any abilities that don't apply for * this item type will be set to zero. First parameter is the artifact * for which to generate the frequency table. * * The second input parameter is a pointer to an array that the function * will use to store the frequency table. The array must have size * ART_IDX_TOTAL. * * The resulting frequency table is cumulative for ease of use in the * weighted randomization algorithm. */ static void build_freq_table(artifact_type *a_ptr, s16b *freq) { int i; size_t j; s16b f_temp[ART_IDX_TOTAL]; /* First, set everything to zero */ for (i = 0; i < ART_IDX_TOTAL; i++) { f_temp[i] = 0; freq[i] = 0; } /* Now copy over appropriate frequencies for applicable abilities */ /* Bow abilities */ if (a_ptr->tval == TV_BOW) { size_t n = N_ELEMENTS(art_idx_bow); for (j = 0; j < n; j++) { f_temp[art_idx_bow[j]] = artprobs[art_idx_bow[j]]; } } /* General weapon abilities */ if (a_ptr->tval == TV_BOW || a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD) { size_t n = N_ELEMENTS(art_idx_weapon); for (j = 0; j < n; j++) { f_temp[art_idx_weapon[j]] = artprobs[art_idx_weapon[j]]; } } /* General non-weapon abilities */ else { size_t n = N_ELEMENTS(art_idx_nonweapon); for (j = 0; j < n; j++) { f_temp[art_idx_nonweapon[j]] = artprobs[art_idx_nonweapon[j]]; } } /* General melee abilities */ if (a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD) { size_t n = N_ELEMENTS(art_idx_melee); for (j = 0; j < n; j++) { f_temp[art_idx_melee[j]] = artprobs[art_idx_melee[j]]; } } /* General armor abilities */ if ( a_ptr->tval == TV_BOOTS || a_ptr->tval == TV_GLOVES || a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN || a_ptr->tval == TV_SHIELD || a_ptr->tval == TV_CLOAK || a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { size_t n = N_ELEMENTS(art_idx_allarmor); for (j = 0; j < n; j++) { f_temp[art_idx_allarmor[j]] = artprobs[art_idx_allarmor[j]]; } } /* Boot abilities */ if (a_ptr->tval == TV_BOOTS) { size_t n = N_ELEMENTS(art_idx_boot); for (j = 0; j < n; j++) { f_temp[art_idx_boot[j]] = artprobs[art_idx_boot[j]]; } } /* Glove abilities */ if (a_ptr->tval == TV_GLOVES) { size_t n = N_ELEMENTS(art_idx_glove); for (j = 0; j < n; j++) { f_temp[art_idx_glove[j]] = artprobs[art_idx_glove[j]]; } } /* Headgear abilities */ if (a_ptr->tval == TV_HELM || a_ptr->tval == TV_CROWN) { size_t n = N_ELEMENTS(art_idx_headgear); for (j = 0; j < n; j++) { f_temp[art_idx_headgear[j]] = artprobs[art_idx_headgear[j]]; } } /* Shield abilities */ if (a_ptr->tval == TV_SHIELD) { size_t n = N_ELEMENTS(art_idx_shield); for (j = 0; j < n; j++) { f_temp[art_idx_shield[j]] = artprobs[art_idx_shield[j]]; } } /* Cloak abilities */ if (a_ptr->tval == TV_CLOAK) { size_t n = N_ELEMENTS(art_idx_cloak); for (j = 0; j < n; j++) { f_temp[art_idx_cloak[j]] = artprobs[art_idx_cloak[j]]; } } /* Armor abilities */ if (a_ptr->tval == TV_SOFT_ARMOR || a_ptr->tval == TV_HARD_ARMOR || a_ptr->tval == TV_DRAG_ARMOR) { size_t n = N_ELEMENTS(art_idx_armor); for (j = 0; j < n; j++) { f_temp[art_idx_armor[j]] = artprobs[art_idx_armor[j]]; } } /* General abilities - no constraint */ for (j = 0; j < N_ELEMENTS(art_idx_gen); j++) { f_temp[art_idx_gen[j]] = artprobs[art_idx_gen[j]]; } /* * Now we have the correct individual frequencies, we build a cumulative * frequency table for them. */ for (i = 0; i < ART_IDX_TOTAL; i++) { for (j = i; j < ART_IDX_TOTAL; j++) { freq[j] += f_temp[i]; } } /* Done - the freq array holds the desired frequencies. */ /* Print out the frequency table, for verification */ for (i = 0; i < ART_IDX_TOTAL; i++) file_putf(log_file, "Cumulative frequency of ability %d is: %d\n", i, freq[i]); } /* * Choose a random ability using weights based on the given cumulative * frequency table. A pointer to the frequency array (which must be of size * ART_IDX_TOTAL) is passed as a parameter. The function returns a number * representing the index of the ability chosen. */ static int choose_ability (s16b *freq_table) { int r, ability; /* Generate a random number between 1 and the last value in the table */ r = randint1(freq_table[ART_IDX_TOTAL-1]); /* Find the entry in the table that this number represents. */ ability = 0; while (r > freq_table[ability]) ability++; file_putf(log_file, "Ability chosen was number: %d\n", ability); /* * The ability variable is now the index of the first value in the table * greater than or equal to r, which is what we want. */ return ability; } /* * Add an ability given by the index r. This is mostly just a long case * statement. * * Note that this method is totally general and imposes no restrictions on * appropriate item type for a given ability. This is assumed to have * been done already. */ static void add_ability_aux(artifact_type *a_ptr, int r, s32b target_power) { switch(r) { case ART_IDX_BOW_SHOTS: case ART_IDX_NONWEAPON_SHOTS: add_pval_flag(a_ptr, OF_SHOTS); break; case ART_IDX_BOW_MIGHT: add_pval_flag(a_ptr, OF_MIGHT); break; case ART_IDX_WEAPON_HIT: case ART_IDX_NONWEAPON_HIT: add_to_hit(a_ptr, 1, 2 * mean_hit_increment); break; case ART_IDX_WEAPON_DAM: case ART_IDX_NONWEAPON_DAM: add_to_dam(a_ptr, 1, 2 * mean_dam_increment); break; case ART_IDX_NONWEAPON_HIT_DAM: add_to_hit(a_ptr, 1, 2 * mean_hit_increment); add_to_dam(a_ptr, 1, 2 * mean_dam_increment); break; case ART_IDX_WEAPON_AGGR: case ART_IDX_NONWEAPON_AGGR: if (target_power > AGGR_POWER) { add_flag(a_ptr, OF_AGGRAVATE); } break; case ART_IDX_MELEE_BLESS: add_flag(a_ptr, OF_BLESSED); break; case ART_IDX_BOW_BRAND: case ART_IDX_MELEE_BRAND: case ART_IDX_NONWEAPON_BRAND: add_slay(a_ptr, TRUE); break; case ART_IDX_BOW_SLAY: case ART_IDX_MELEE_SLAY: case ART_IDX_NONWEAPON_SLAY: add_slay(a_ptr, FALSE); break; case ART_IDX_MELEE_SINV: case ART_IDX_HELM_SINV: case ART_IDX_GEN_SINV: add_flag(a_ptr, OF_SEE_INVIS); break; case ART_IDX_MELEE_BLOWS: case ART_IDX_NONWEAPON_BLOWS: add_pval_flag(a_ptr, OF_BLOWS); break; case ART_IDX_MELEE_AC: case ART_IDX_BOOT_AC: case ART_IDX_GLOVE_AC: case ART_IDX_HELM_AC: case ART_IDX_SHIELD_AC: case ART_IDX_CLOAK_AC: case ART_IDX_ARMOR_AC: case ART_IDX_GEN_AC: add_to_AC(a_ptr, 1, 2 * mean_ac_increment); break; case ART_IDX_MELEE_DICE: add_damage_dice(a_ptr); break; case ART_IDX_MELEE_WEIGHT: case ART_IDX_ALLARMOR_WEIGHT: add_weight_mod(a_ptr); break; case ART_IDX_MELEE_TUNN: case ART_IDX_GEN_TUNN: add_pval_flag(a_ptr, OF_TUNNEL); break; case ART_IDX_BOOT_FEATHER: case ART_IDX_GEN_FEATHER: add_flag(a_ptr, OF_FEATHER); break; case ART_IDX_BOOT_STEALTH: case ART_IDX_CLOAK_STEALTH: case ART_IDX_ARMOR_STEALTH: case ART_IDX_GEN_STEALTH: add_pval_flag(a_ptr, OF_STEALTH); break; case ART_IDX_BOOT_SPEED: case ART_IDX_GEN_SPEED: add_first_pval_flag(a_ptr, OF_SPEED); break; case ART_IDX_GLOVE_FA: case ART_IDX_GEN_FA: add_flag(a_ptr, OF_FREE_ACT); break; case ART_IDX_GLOVE_DEX: add_fixed_pval_flag(a_ptr, OF_DEX); break; case ART_IDX_HELM_RBLIND: case ART_IDX_GEN_RBLIND: add_flag(a_ptr, OF_RES_BLIND); break; case ART_IDX_HELM_ESP: case ART_IDX_GEN_ESP: add_flag(a_ptr, OF_TELEPATHY); break; case ART_IDX_HELM_WIS: add_fixed_pval_flag(a_ptr, OF_WIS); break; case ART_IDX_HELM_INT: add_fixed_pval_flag(a_ptr, OF_INT); break; case ART_IDX_SHIELD_LRES: case ART_IDX_ARMOR_LRES: case ART_IDX_GEN_LRES: add_low_resist(a_ptr); break; case ART_IDX_ARMOR_HLIFE: case ART_IDX_GEN_HLIFE: add_flag(a_ptr, OF_HOLD_LIFE); break; case ART_IDX_ARMOR_CON: add_fixed_pval_flag(a_ptr, OF_CON); break; case ART_IDX_ARMOR_ALLRES: add_flag(a_ptr, OF_RES_ACID); add_flag(a_ptr, OF_RES_ELEC); add_flag(a_ptr, OF_RES_FIRE); add_flag(a_ptr, OF_RES_COLD); break; case ART_IDX_ARMOR_HRES: add_high_resist(a_ptr); break; case ART_IDX_GEN_STAT: add_stat(a_ptr); break; case ART_IDX_GEN_SUST: add_sustain(a_ptr); break; case ART_IDX_GEN_SEARCH: add_pval_flag(a_ptr, OF_SEARCH); break; case ART_IDX_GEN_INFRA: add_pval_flag(a_ptr, OF_INFRA); break; case ART_IDX_GEN_IMMUNE: add_immunity(a_ptr); break; case ART_IDX_GEN_LIGHT: { if (a_ptr->tval != TV_LIGHT && !of_is_empty(a_ptr->pval_flags[DEFAULT_PVAL])) { of_on(a_ptr->flags, OF_LIGHT); of_on(a_ptr->pval_flags[DEFAULT_PVAL + 1], OF_LIGHT); a_ptr->pval[DEFAULT_PVAL + 1] = 1; recalc_num_pvals(a_ptr); } else break; } break; case ART_IDX_GEN_SDIG: add_flag(a_ptr, OF_SLOW_DIGEST); break; case ART_IDX_GEN_REGEN: add_flag(a_ptr, OF_REGEN); break; case ART_IDX_GEN_RPOIS: add_flag(a_ptr, OF_RES_POIS); break; case ART_IDX_GEN_RFEAR: add_flag(a_ptr, OF_RES_FEAR); break; case ART_IDX_GEN_RLIGHT: add_flag(a_ptr, OF_RES_LIGHT); break; case ART_IDX_GEN_RDARK: add_flag(a_ptr, OF_RES_DARK); break; case ART_IDX_GEN_RCONF: add_flag(a_ptr, OF_RES_CONFU); break; case ART_IDX_GEN_RSOUND: add_flag(a_ptr, OF_RES_SOUND); break; case ART_IDX_GEN_RSHARD: add_flag(a_ptr, OF_RES_SHARD); break; case ART_IDX_GEN_RNEXUS: add_flag(a_ptr, OF_RES_NEXUS); break; case ART_IDX_GEN_RNETHER: add_flag(a_ptr, OF_RES_NETHR); break; case ART_IDX_GEN_RCHAOS: add_flag(a_ptr, OF_RES_CHAOS); break; case ART_IDX_GEN_RDISEN: add_flag(a_ptr, OF_RES_DISEN); break; case ART_IDX_GEN_PSTUN: add_flag(a_ptr, OF_RES_STUN); break; case ART_IDX_GEN_ACTIV: if (!a_ptr->effect) add_activation(a_ptr, target_power); break; } recalc_num_pvals(a_ptr); } /* * Randomly select an extra ability to be added to the artifact in question. */ static void add_ability(artifact_type *a_ptr, s32b target_power) { int r; /* Choose a random ability using the frequency table previously defined*/ r = choose_ability(art_freq); /* Add the appropriate ability */ add_ability_aux(a_ptr, r, target_power); /* Now remove contradictory or redundant powers. */ remove_contradictory(a_ptr); /* Adding WIS to sharp weapons always blesses them */ if (of_has(a_ptr->flags, OF_WIS) && (a_ptr->tval == TV_SWORD || a_ptr->tval == TV_POLEARM)) { add_flag(a_ptr, OF_BLESSED); } } /* * Try to supercharge this item by running through the list of the supercharge * abilities and attempting to add each in turn. An artifact only gets one * chance at each of these up front (if applicable). */ static void try_supercharge(artifact_type *a_ptr, s32b target_power) { /* Huge damage dice or max blows - melee weapon only */ if (a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD) { if (randint0(z_info->a_max) < artprobs[ART_IDX_MELEE_DICE_SUPER]) { a_ptr->dd += 3 + randint0(4); /* if (a_ptr->dd > 9) a_ptr->dd = 9; */ file_putf(log_file, "Supercharging damage dice! (Now %d dice)\n", a_ptr->dd); } else if (randint0(z_info->a_max) < artprobs[ART_IDX_MELEE_BLOWS_SUPER]) { of_on(a_ptr->flags, OF_BLOWS); of_on(a_ptr->pval_flags[DEFAULT_PVAL], OF_BLOWS); a_ptr->pval[DEFAULT_PVAL] = INHIBIT_BLOWS - 1; file_putf(log_file, "Supercharging melee blows! (+2 blows)\n"); } } /* Bows - max might or shots */ if (a_ptr->tval == TV_BOW) { if (randint0(z_info->a_max) < artprobs[ART_IDX_BOW_SHOTS_SUPER]) { of_on(a_ptr->flags, OF_SHOTS); of_on(a_ptr->pval_flags[DEFAULT_PVAL], OF_SHOTS); a_ptr->pval[DEFAULT_PVAL] = INHIBIT_SHOTS - 1; file_putf(log_file, "Supercharging shots for bow! (2 extra shots)\n"); } else if (randint0(z_info->a_max) < artprobs[ART_IDX_BOW_MIGHT_SUPER]) { of_on(a_ptr->flags, OF_MIGHT); of_on(a_ptr->pval_flags[DEFAULT_PVAL], OF_MIGHT); a_ptr->pval[DEFAULT_PVAL] = INHIBIT_MIGHT - 1; file_putf(log_file, "Supercharging might for bow! (3 extra might)\n"); } } /* Big speed bonus - any item (potentially) but more likely on boots */ if (randint0(z_info->a_max) < artprobs[ART_IDX_GEN_SPEED_SUPER] || (a_ptr->tval == TV_BOOTS && randint0(z_info->a_max) < artprobs[ART_IDX_BOOT_SPEED])) { of_on(a_ptr->flags, OF_SPEED); of_on(a_ptr->pval_flags[DEFAULT_PVAL], OF_SPEED); a_ptr->pval[DEFAULT_PVAL] = 5 + randint0(6); if (INHIBIT_WEAK) a_ptr->pval[DEFAULT_PVAL] += randint1(3); if (INHIBIT_STRONG) a_ptr->pval[DEFAULT_PVAL] += 1 + randint1(6); file_putf(log_file, "Supercharging speed for this item! (New speed bonus is %d)\n", a_ptr->pval[DEFAULT_PVAL]); } /* Big AC bonus */ if (randint0(z_info->a_max) < artprobs[ART_IDX_GEN_AC_SUPER]) { a_ptr->to_a += 19 + randint1(11); if (INHIBIT_WEAK) a_ptr->to_a += randint1(10); if (INHIBIT_STRONG) a_ptr->to_a += randint1(20); file_putf(log_file, "Supercharging AC! New AC bonus is %d\n", a_ptr->to_a); } /* Aggravation */ if (a_ptr->tval == TV_BOW || a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD) { if ((randint0(z_info->a_max) < artprobs[ART_IDX_WEAPON_AGGR]) && (target_power > AGGR_POWER)) { of_on(a_ptr->flags, OF_AGGRAVATE); file_putf(log_file, "Adding aggravation\n"); } } else { if ((randint0(z_info->a_max) < artprobs[ART_IDX_NONWEAPON_AGGR]) && (target_power > AGGR_POWER)) { of_on(a_ptr->flags, OF_AGGRAVATE); file_putf(log_file, "Adding aggravation\n"); } } recalc_num_pvals(a_ptr); } /* * Make it bad, or if it's already bad, make it worse! */ static void do_curse(artifact_type *a_ptr) { if (one_in_(7)) of_on(a_ptr->flags, OF_AGGRAVATE); if (one_in_(4)) of_on(a_ptr->flags, OF_DRAIN_EXP); if (one_in_(7)) of_on(a_ptr->flags, OF_TELEPORT); if ((a_ptr->pval[DEFAULT_PVAL] > 0) && one_in_(2)) a_ptr->pval[DEFAULT_PVAL] = -a_ptr->pval[DEFAULT_PVAL]; if ((a_ptr->to_a > 0) && one_in_(2)) a_ptr->to_a = -a_ptr->to_a; if ((a_ptr->to_h > 0) && one_in_(2)) a_ptr->to_h = -a_ptr->to_h; if ((a_ptr->to_d > 0) && one_in_(4)) a_ptr->to_d = -a_ptr->to_d; if (of_has(a_ptr->flags, OF_LIGHT_CURSE)) { if (one_in_(2)) of_on(a_ptr->flags, OF_HEAVY_CURSE); return; } of_on(a_ptr->flags, OF_LIGHT_CURSE); if (one_in_(4)) of_on(a_ptr->flags, OF_HEAVY_CURSE); } /* * Note the three special cases (One Ring, Grond, Morgoth). */ static void scramble_artifact(int a_idx) { artifact_type *a_ptr = &a_info[a_idx]; artifact_type a_old; object_kind *k_ptr; s32b power; int tries = 0; byte alloc_old, base_alloc_old, alloc_new; s32b ap = 0; bool curse_me = FALSE; bool success = FALSE; int i; bitflag f[OF_SIZE]; /* Special cases -- don't randomize these! */ if ((a_idx == ART_POWER) || (a_idx == ART_GROND) || (a_idx == ART_MORGOTH)) return; /* Skip unused artifacts, too! */ if (a_ptr->tval == 0) return; /* Evaluate the original artifact to determine the power level. */ power = base_power[a_idx]; /* If it has a restricted ability then don't randomize it. */ if (power > INHIBIT_POWER) { file_putf(log_file, "Skipping artifact number %d - too powerful to randomize!", a_idx); return; } if (power < 0) curse_me = TRUE; file_putf(log_file, "+++++++++++++++++ CREATING NEW ARTIFACT ++++++++++++++++++\n"); file_putf(log_file, "Artifact %d: power = %d\n", a_idx, power); /* * Flip the sign on power if it's negative, since it's only used for base * item choice */ if (power < 0) power = -power; if (a_idx >= ART_MIN_NORMAL) { /* * Normal artifact - choose a random base item type. Not too * powerful, so we'll have to add something to it. Not too * weak, for the opposite reason. * * CR 7/15/2001 - lowered the upper limit so that we get at * least a few powers (from 8/10 to 6/10) but permit anything * more than 20 below the target power */ int count = 0; s32b ap2; /* Capture the rarity of the original base item and artifact */ alloc_old = base_art_alloc[a_idx]; base_alloc_old = base_item_prob[a_idx]; do { /* Get the new item kind */ k_ptr = choose_item(a_idx); /* * Hack: if power is positive but very low, and if we're not having * any luck finding a base item, curse it once. This helps ensure * that we get a base item for borderline cases like Wormtongue. */ if (power > 0 && power < 10 && count > MAX_TRIES / 2) { file_putf(log_file, "Cursing base item to help get a match.\n"); do_curse(a_ptr); } ap2 = artifact_power(a_idx); count++; /* * Calculate the proper rarity based on the new type. We attempt * to preserve the 'effective rarity' which is equal to the * artifact rarity multiplied by the base item rarity. */ alloc_new = alloc_old * base_alloc_old / k_ptr->alloc_prob; if (alloc_new > 99) alloc_new = 99; if (alloc_new < 1) alloc_new = 1; file_putf(log_file, "Old allocs are base %d, art %d\n", base_alloc_old, alloc_old); file_putf(log_file, "New allocs are base %d, art %d\n", k_ptr->alloc_prob, alloc_new); } while ( (count < MAX_TRIES) && (((ap2 > (power * 6) / 10 + 1) && (power-ap2 < 20)) || (ap2 < (power / 10))) ); /* Got an item - set the new rarity */ a_ptr->alloc_prob = alloc_new; if (count >= MAX_TRIES) file_putf(log_file, "Warning! Couldn't get appropriate power level on base item.\n"); } else { /* Special artifact (light source, ring, or amulet) */ /* Keep the item kind */ k_ptr = lookup_kind(a_ptr->tval, a_ptr->sval); /* Clear the following fields; leave the rest alone */ a_ptr->to_h = a_ptr->to_d = a_ptr->to_a = 0; a_ptr->num_pvals = 0; of_wipe(a_ptr->flags); for (i = 0; i < MAX_PVALS; i++) { a_ptr->pval[i] = 0; of_wipe(a_ptr->pval_flags[i]); } /* Clear the activations for rings and amulets but not lights */ if (a_ptr->tval != TV_LIGHT) a_ptr->effect = 0; /* Restore lights */ else { of_on(a_ptr->flags, OF_LIGHT); of_on(a_ptr->flags, OF_NO_FUEL); of_on(a_ptr->pval_flags[DEFAULT_PVAL], OF_LIGHT); a_ptr->pval[DEFAULT_PVAL] = 3; a_ptr->num_pvals = 1; } /* Artifacts ignore everything */ create_mask(f, FALSE, OFT_IGNORE, OFT_MAX); of_union(a_ptr->flags, f); file_putf(log_file, "Alloc prob is %d\n", a_ptr->alloc_prob); } /* Got a base item. */ /* Generate the cumulative frequency table for this item type */ build_freq_table(a_ptr, art_freq); /* Copy artifact info temporarily. */ a_old = *a_ptr; /* Give this artifact a shot at being supercharged */ try_supercharge(a_ptr, power); ap = artifact_power(a_idx); if (ap > (power * 23) / 20 + 1) { /* too powerful -- put it back */ *a_ptr = a_old; file_putf(log_file, "--- Supercharge is too powerful! Rolling back.\n"); } /* First draft: add two abilities, then curse it three times. */ if (curse_me) { /* Copy artifact info temporarily. */ a_old = *a_ptr; do { add_ability(a_ptr, power); add_ability(a_ptr, power); do_curse(a_ptr); do_curse(a_ptr); do_curse(a_ptr); remove_contradictory(a_ptr); ap = artifact_power(a_idx); /* Accept if it doesn't have any inhibited abilities */ if (ap < INHIBIT_POWER) success = TRUE; /* Otherwise go back and try again */ else { file_putf(log_file, "Inhibited ability added - rolling back.\n"); *a_ptr = a_old; } } while (!success); /* Cursed items never have any resale value */ a_ptr->cost = 0; } else { /* * Select a random set of abilities which roughly matches the * original's in terms of overall power/usefulness. */ for (tries = 0; tries < MAX_TRIES; tries++) { /* Copy artifact info temporarily. */ a_old = *a_ptr; add_ability(a_ptr, power); ap = artifact_power(a_idx); /* CR 11/14/01 - pushed both limits up by about 5% */ if (ap > (power * 23) / 20 + 1) { /* too powerful -- put it back */ *a_ptr = a_old; file_putf(log_file, "--- Too powerful! Rolling back.\n"); continue; } else if (ap >= (power * 19) / 20) /* just right */ { /* CC 11/02/09 - add rescue for crappy weapons */ if ((a_ptr->tval == TV_DIGGING || a_ptr->tval == TV_HAFTED || a_ptr->tval == TV_POLEARM || a_ptr->tval == TV_SWORD || a_ptr->tval == TV_BOW) && (a_ptr->to_d < 10)) { a_ptr->to_d += randint0(10); file_putf(log_file, "Redeeming crappy weapon: +dam now %d\n", a_ptr->to_d); } break; } /* Stop if we're going negative, so we don't overload the artifact with great powers to compensate. */ /* Removed CR 11/10/01 */ /* else if ((ap < 0) && (ap < (-(power * 1)) / 10)) { break; } */ } /* end of power selection */ if (verbose && tries >= MAX_TRIES) /* * We couldn't generate an artifact within the number of permitted * iterations. Show a warning message. */ file_putf(log_file, "Warning! Couldn't get appropriate power level on artifact.\n"); } /* Set depth and rarity info according to power */ /* This is currently very tricky for special artifacts */ file_putf(log_file, "Old depths are min %d, max %d\n", a_ptr->alloc_min, a_ptr->alloc_max); file_putf(log_file, "Alloc prob is %d\n", a_ptr->alloc_prob); /* flip cursed items to avoid overflows */ if (ap < 0) ap = -ap; if (a_idx < ART_MIN_NORMAL) { a_ptr->alloc_max = 127; if (ap > avg_power) { a_ptr->alloc_prob = 1; a_ptr->alloc_min = MAX(50, ((ap + 150) * 100 / max_power)); } else if (ap > 30) { a_ptr->alloc_prob = MAX(2, (avg_power - ap) / 20); a_ptr->alloc_min = MAX(25, ((ap + 200) * 100 / max_power)); } else /* Just the Phial */ { a_ptr->alloc_prob = 50 - ap; a_ptr->alloc_min = 5; } } else { file_putf(log_file, "k_ptr->alloc_prob is %d\n", k_ptr->alloc_prob); a_ptr->alloc_max = MIN(127, (ap * 4) / 5); a_ptr->alloc_min = MIN(100, ((ap + 100) * 100 / max_power)); /* Leave alloc_prob consistent with base art total rarity */ } /* sanity check */ if (a_ptr->alloc_prob > 99) a_ptr->alloc_prob = 99; if (a_ptr->alloc_prob < 1) a_ptr->alloc_prob = 1; file_putf(log_file, "New depths are min %d, max %d\n", a_ptr->alloc_min, a_ptr->alloc_max); file_putf(log_file, "Power-based alloc_prob is %d\n", a_ptr->alloc_prob); /* This will go */ if (a_idx < ART_MIN_NORMAL) of_on(a_ptr->flags, OF_INSTA_ART); /* Success */ file_putf(log_file, ">>>>>>>>>>>>>>>>>>>>>>>>>> ARTIFACT COMPLETED <<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); file_putf(log_file, "Number of tries for artifact %d was: %d\n", a_idx, tries); } /* * Return TRUE if the whole set of random artifacts meets certain * criteria. Return FALSE if we fail to meet those criteria (which will * restart the whole process). */ static bool artifacts_acceptable(void) { int swords = 5, polearms = 5, blunts = 5, bows = 4; int bodies = 5, shields = 4, cloaks = 4, hats = 4; int gloves = 4, boots = 4; int i; for (i = ART_MIN_NORMAL; i < z_info->a_max; i++) { switch (a_info[i].tval) { case TV_SWORD: swords--; break; case TV_POLEARM: polearms--; break; case TV_HAFTED: blunts--; break; case TV_BOW: bows--; break; case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: bodies--; break; case TV_SHIELD: shields--; break; case TV_CLOAK: cloaks--; break; case TV_HELM: case TV_CROWN: hats--; break; case TV_GLOVES: gloves--; break; case TV_BOOTS: boots--; break; } } file_putf(log_file, "Deficit amount for swords is %d\n", swords); file_putf(log_file, "Deficit amount for polearms is %d\n", polearms); file_putf(log_file, "Deficit amount for blunts is %d\n", blunts); file_putf(log_file, "Deficit amount for bows is %d\n", bows); file_putf(log_file, "Deficit amount for bodies is %d\n", bodies); file_putf(log_file, "Deficit amount for shields is %d\n", shields); file_putf(log_file, "Deficit amount for cloaks is %d\n", cloaks); file_putf(log_file, "Deficit amount for hats is %d\n", hats); file_putf(log_file, "Deficit amount for gloves is %d\n", gloves); file_putf(log_file, "Deficit amount for boots is %d\n", boots); if (swords > 0 || polearms > 0 || blunts > 0 || bows > 0 || bodies > 0 || shields > 0 || cloaks > 0 || hats > 0 || gloves > 0 || boots > 0) { if (verbose) { char types[256]; strnfmt(types, sizeof(types), "%s%s%s%s%s%s%s%s%s%s", swords > 0 ? " swords" : "", polearms > 0 ? " polearms" : "", blunts > 0 ? " blunts" : "", bows > 0 ? " bows" : "", bodies > 0 ? " body-armors" : "", shields > 0 ? " shields" : "", cloaks > 0 ? " cloaks" : "", hats > 0 ? " hats" : "", gloves > 0 ? " gloves" : "", boots > 0 ? " boots" : ""); file_putf(log_file, "Restarting generation process: not enough%s", types); } return FALSE; } else { return TRUE; } } static errr scramble(void) { /* If our artifact set fails to meet certain criteria, we start over. */ do { int a_idx; /* Generate all the artifacts. */ for (a_idx = 1; a_idx < z_info->a_max; a_idx++) { scramble_artifact(a_idx); } } while (!artifacts_acceptable()); /* end of all artifacts */ /* Success */ return (0); } static errr do_randart_aux(bool full) { errr result; /* Generate random names */ if ((result = init_names()) != 0) return (result); if (full) { /* Randomize the artifacts */ if ((result = scramble()) != 0) return (result); } /* Success */ return (0); } /* * Randomize the artifacts * * The full flag toggles between just randomizing the names and * complete randomization of the artifacts. */ errr do_randart(u32b randart_seed, bool full) { errr err; /* Prepare to use the Angband "simple" RNG. */ Rand_value = randart_seed; Rand_quick = TRUE; /* Only do all the following if full randomization requested */ if (full) { /* Allocate the various "original powers" arrays */ base_power = C_ZNEW(z_info->a_max, s32b); base_item_level = C_ZNEW(z_info->a_max, byte); base_item_prob = C_ZNEW(z_info->a_max, byte); base_art_alloc = C_ZNEW(z_info->a_max, byte); baseprobs = C_ZNEW(z_info->k_max, s16b); base_freq = C_ZNEW(z_info->k_max, s16b); /* Open the log file for writing */ if (verbose) { char buf[1024]; path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "randart.log"); log_file = file_open(buf, MODE_WRITE, FTYPE_TEXT); if (!log_file) { msg("Error - can't open randart.log for writing."); exit(1); } } /* Store the original power ratings */ store_base_power(); /* Determine the generation probabilities */ parse_frequencies(); } /* Generate the random artifact (names) */ err = do_randart_aux(full); /* Only do all the following if full randomization requested */ if (full) { /* Just for fun, look at the frequencies on the finished items */ /* Remove this prior to release */ store_base_power(); parse_frequencies(); /* Close the log file */ if (verbose) { if (!file_close(log_file)) { msg("Error - can't close randart.log file."); exit(1); } } /* Free the "original powers" arrays */ FREE(base_power); FREE(base_item_level); FREE(base_item_prob); FREE(base_art_alloc); FREE(baseprobs); FREE(base_freq); } /* When done, resume use of the Angband "complex" RNG. */ Rand_quick = FALSE; return (err); } angband-3.5.1/src/object/obj-desc.c0000644000175000017500000004302712456456606016335 0ustar chriscchrisc/* * File: obj-desc.c * Purpose: Create object name descriptions * * Copyright (c) 1997 - 2007 Angband contributors * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "squelch.h" #include "object/tvalsval.h" #include "object/pval.h" /** * Puts the object base kind's name into buf. */ void object_base_name(char *buf, size_t max, int tval, bool plural) { object_base *kb = &kb_info[tval]; size_t end = 0; end = obj_desc_name_format(buf, max, end, kb->name, NULL, plural); } /* * Puts a very stripped-down version of an object's name into buf. * If easy_know is TRUE, then the IDed names are used, otherwise * flavours, scroll names, etc will be used. * * Just truncates if the buffer isn't big enough. */ void object_kind_name(char *buf, size_t max, const object_kind *kind, bool easy_know) { /* If not aware, use flavor */ if (!easy_know && !kind->aware && kind->flavor) { if (kind->tval == TV_FOOD && kind->sval >= SV_FOOD_MIN_SHROOM) { strnfmt(buf, max, "%s Mushroom", kind->flavor->text); } else { /* Plain flavour (e.g. Copper) will do. */ my_strcpy(buf, kind->flavor->text, max); } } /* Use proper name (Healing, or whatever) */ else { char *t; if (kind->tval == TV_FOOD && kind->sval >= SV_FOOD_MIN_SHROOM) { my_strcpy(buf, "Mushroom of ", max); max -= strlen(buf); t = buf + strlen(buf); } else { t = buf; } /* Format remainder of the string */ obj_desc_name_format(t, max, 0, kind->name, NULL, FALSE); } } static const char *obj_desc_get_modstr(const object_kind *kind) { switch (kind->tval) { case TV_AMULET: case TV_RING: case TV_STAFF: case TV_WAND: case TV_ROD: case TV_POTION: case TV_FOOD: case TV_SCROLL: return kind->flavor ? kind->flavor->text : ""; case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: return kind->name; } return ""; } static const char *obj_desc_get_basename(const object_type *o_ptr, bool aware, bool terse) { bool show_flavor = !terse && o_ptr->kind->flavor; if (o_ptr->ident & IDENT_STORE) show_flavor = FALSE; if (aware && !OPT(show_flavors)) show_flavor = FALSE; /* Artifacts are special */ if (o_ptr->artifact && (aware || (o_ptr->ident & IDENT_NAME) || terse || !o_ptr->kind->flavor)) return o_ptr->kind->name; /* Analyze the object */ switch (o_ptr->tval) { case TV_FLASK: case TV_CHEST: case TV_SHOT: case TV_BOLT: case TV_ARROW: case TV_BOW: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_DIGGING: case TV_BOOTS: case TV_GLOVES: case TV_CLOAK: case TV_CROWN: case TV_HELM: case TV_SHIELD: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: case TV_LIGHT: return o_ptr->kind->name; case TV_AMULET: return (show_flavor ? "& # Amulet~" : "& Amulet~"); case TV_RING: return (show_flavor ? "& # Ring~" : "& Ring~"); case TV_STAFF: return (show_flavor ? "& # Sta|ff|ves|" : "& Sta|ff|ves|"); case TV_WAND: return (show_flavor ? "& # Wand~" : "& Wand~"); case TV_ROD: return (show_flavor ? "& # Rod~" : "& Rod~"); case TV_POTION: return (show_flavor ? "& # Potion~" : "& Potion~"); case TV_SCROLL: return (show_flavor ? "& Scroll~ titled #" : "& Scroll~"); case TV_MAGIC_BOOK: if (terse) return "& Book~ #"; else return "& Book~ of Magic Spells #"; case TV_PRAYER_BOOK: if (terse) return "& Book~ #"; else return "& Holy Book~ of Prayers #"; case TV_FOOD: if (o_ptr->sval >= SV_FOOD_MIN_SHROOM) return (show_flavor ? "& # Mushroom~" : "& Mushroom~"); else return o_ptr->kind->name; } return "(nothing)"; } static size_t obj_desc_name_prefix(char *buf, size_t max, size_t end, const object_type *o_ptr, bool known, const char *basename, const char *modstr, bool terse) { if (o_ptr->number <= 0) strnfcat(buf, max, &end, "no more "); else if (o_ptr->number > 1) strnfcat(buf, max, &end, "%d ", o_ptr->number); else if ((object_name_is_visible(o_ptr) || known) && o_ptr->artifact) strnfcat(buf, max, &end, "the "); else if (*basename == '&') { bool an = FALSE; const char *lookahead = basename + 1; while (*lookahead == ' ') lookahead++; if (*lookahead == '#') { if (modstr && is_a_vowel(*modstr)) an = TRUE; } else if (is_a_vowel(*lookahead)) { an = TRUE; } if (!terse) { if (an) strnfcat(buf, max, &end, "an "); else strnfcat(buf, max, &end, "a "); } } return end; } /** * Formats 'fmt' into 'buf', with the following formatting characters: * * '~' at the end of a word (e.g. "fridge~") will pluralise * * '|x|y|' will be output as 'x' if singular or 'y' if plural * (e.g. "kni|fe|ves|") * * '#' will be replaced with 'modstr' (which may contain the pluralising * formats given above). */ size_t obj_desc_name_format(char *buf, size_t max, size_t end, const char *fmt, const char *modstr, bool pluralise) { /* Copy the string */ while (*fmt) { if (*fmt == '&') { while (*fmt == ' ' || *fmt == '&') fmt++; continue; } /* Pluralizer (regular English plurals) */ else if (*fmt == '~') { char prev = *(fmt - 1); if (!pluralise) { fmt++; continue; } /* e.g. cutlass-e-s, torch-e-s, box-e-s */ if (prev == 's' || prev == 'h' || prev == 'x') strnfcat(buf, max, &end, "es"); else strnfcat(buf, max, &end, "s"); } /* Special plurals */ else if (*fmt == '|') { /* e.g. kni|fe|ves| * ^ ^ ^ */ const char *singular = fmt + 1; const char *plural = strchr(singular, '|'); const char *endmark = NULL; if (plural) { plural++; endmark = strchr(plural, '|'); } if (!singular || !plural || !endmark) return end; if (!pluralise) strnfcat(buf, max, &end, "%.*s", plural - singular - 1, singular); else strnfcat(buf, max, &end, "%.*s", endmark - plural, plural); fmt = endmark; } /* Add modstr, with pluralisation if relevant */ else if (*fmt == '#') { end = obj_desc_name_format(buf, max, end, modstr, NULL, pluralise); } else buf[end++] = *fmt; fmt++; } buf[end] = 0; return end; } /* * Format object o_ptr's name into 'buf'. */ static size_t obj_desc_name(char *buf, size_t max, size_t end, const object_type *o_ptr, bool prefix, int mode, bool spoil, bool terse) { bool known = object_is_known(o_ptr) || (o_ptr->ident & IDENT_STORE) || spoil; bool aware = object_flavor_is_aware(o_ptr) || (o_ptr->ident & IDENT_STORE) || spoil; const char *basename = obj_desc_get_basename(o_ptr, aware, terse); const char *modstr = obj_desc_get_modstr(o_ptr->kind); if (aware && !o_ptr->kind->everseen && !spoil) o_ptr->kind->everseen = TRUE; if (prefix) end = obj_desc_name_prefix(buf, max, end, o_ptr, known, basename, modstr, terse); /* Pluralize if (not forced singular) and * (not a known/visible artifact) and * (not one in stack or forced plural) */ end = obj_desc_name_format(buf, max, end, basename, modstr, !(mode & ODESC_SINGULAR) && !(o_ptr->artifact && (object_name_is_visible(o_ptr) || known)) && (o_ptr->number != 1 || (mode & ODESC_PLURAL))); /** Append extra names of various kinds **/ if ((object_name_is_visible(o_ptr) || known) && o_ptr->artifact) strnfcat(buf, max, &end, " %s", o_ptr->artifact->name); else if ((spoil && o_ptr->ego) || object_ego_is_visible(o_ptr)) strnfcat(buf, max, &end, " %s", o_ptr->ego->name); else if (aware && !o_ptr->artifact && (o_ptr->kind->flavor || o_ptr->kind->tval == TV_SCROLL)) { if (terse) strnfcat(buf, max, &end, " '%s'", o_ptr->kind->name); else strnfcat(buf, max, &end, " of %s", o_ptr->kind->name); } return end; } /* * Is o_ptr armor? */ static bool obj_desc_show_armor(const object_type *o_ptr) { if (o_ptr->ac) return TRUE; switch (o_ptr->tval) { case TV_BOOTS: case TV_GLOVES: case TV_CLOAK: case TV_CROWN: case TV_HELM: case TV_SHIELD: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: return TRUE; } return FALSE; } static size_t obj_desc_chest(const object_type *o_ptr, char *buf, size_t max, size_t end) { bool known = object_is_known(o_ptr) || (o_ptr->ident & IDENT_STORE); if (o_ptr->tval != TV_CHEST) return end; if (!known) return end; /* May be "empty" */ if (!o_ptr->pval[DEFAULT_PVAL]) strnfcat(buf, max, &end, " (empty)"); /* May be "disarmed" */ else if (!is_locked_chest(o_ptr)) { if (chest_trap_type(o_ptr) != 0) strnfcat(buf, max, &end, " (disarmed)"); else strnfcat(buf, max, &end, " (unlocked)"); } /* Describe the traps, if any */ else { /* Describe the traps */ switch (chest_trap_type(o_ptr)) { case 0: strnfcat(buf, max, &end, " (Locked)"); break; case CHEST_LOSE_STR: strnfcat(buf, max, &end, " (Poison Needle)"); break; case CHEST_LOSE_CON: strnfcat(buf, max, &end, " (Poison Needle)"); break; case CHEST_POISON: strnfcat(buf, max, &end, " (Gas Trap)"); break; case CHEST_PARALYZE: strnfcat(buf, max, &end, " (Gas Trap)"); break; case CHEST_EXPLODE: strnfcat(buf, max, &end, " (Explosion Device)"); break; case CHEST_SUMMON: strnfcat(buf, max, &end, " (Summoning Runes)"); break; default: strnfcat(buf, max, &end, " (Multiple Traps)"); break; } } return end; } static size_t obj_desc_combat(const object_type *o_ptr, char *buf, size_t max, size_t end, bool spoil) { bitflag flags[OF_SIZE]; bitflag flags_known[OF_SIZE]; object_flags(o_ptr, flags); object_flags_known(o_ptr, flags_known); if (of_has(flags, OF_SHOW_DICE)) { /* Only display the real damage dice if the combat stats are known */ if (spoil || object_attack_plusses_are_visible(o_ptr)) strnfcat(buf, max, &end, " (%dd%d)", o_ptr->dd, o_ptr->ds); else strnfcat(buf, max, &end, " (%dd%d)", o_ptr->kind->dd, o_ptr->kind->ds); } if (of_has(flags, OF_SHOW_MULT)) { /* Display shooting power as part of the multiplier */ if (of_has(flags, OF_MIGHT) && (spoil || object_flag_is_known(o_ptr, OF_MIGHT))) strnfcat(buf, max, &end, " (x%d)", (o_ptr->sval % 10) + o_ptr->pval[which_pval(o_ptr, OF_MIGHT)]); else strnfcat(buf, max, &end, " (x%d)", o_ptr->sval % 10); } /* Show weapon bonuses */ if (spoil || object_attack_plusses_are_visible(o_ptr)) { if (wield_slot(o_ptr) == INVEN_WIELD || wield_slot(o_ptr) == INVEN_BOW || obj_is_ammo(o_ptr) || o_ptr->to_d || o_ptr->to_h) { /* Make an exception for body armor with only a to-hit penalty */ if (o_ptr->to_h < 0 && o_ptr->to_d == 0 && (o_ptr->tval == TV_SOFT_ARMOR || o_ptr->tval == TV_HARD_ARMOR || o_ptr->tval == TV_DRAG_ARMOR)) strnfcat(buf, max, &end, " (%+d)", o_ptr->to_h); /* Otherwise, always use the full tuple */ else strnfcat(buf, max, &end, " (%+d,%+d)", o_ptr->to_h, o_ptr->to_d); } } /* Show armor bonuses */ if (spoil || object_defence_plusses_are_visible(o_ptr)) { if (obj_desc_show_armor(o_ptr)) strnfcat(buf, max, &end, " [%d,%+d]", o_ptr->ac, o_ptr->to_a); else if (o_ptr->to_a) strnfcat(buf, max, &end, " [%+d]", o_ptr->to_a); } else if (obj_desc_show_armor(o_ptr)) strnfcat(buf, max, &end, " [%d]", object_was_sensed(o_ptr) ? o_ptr->ac : o_ptr->kind->ac); return end; } static size_t obj_desc_light(const object_type *o_ptr, char *buf, size_t max, size_t end) { bitflag f[OF_SIZE]; object_flags(o_ptr, f); /* Fuelled light sources get number of remaining turns appended */ if ((o_ptr->tval == TV_LIGHT) && !of_has(f, OF_NO_FUEL)) strnfcat(buf, max, &end, " (%d turns)", o_ptr->timeout); return end; } static size_t obj_desc_pval(const object_type *o_ptr, char *buf, size_t max, size_t end, bool spoil) { bitflag f[OF_SIZE], f2[OF_SIZE]; int i; bool any = FALSE; object_flags(o_ptr, f); create_mask(f2, FALSE, OFT_PVAL, OFT_STAT, OFT_MAX); if (!of_is_inter(f, f2)) return end; strnfcat(buf, max, &end, " <"); for (i = 0; i < o_ptr->num_pvals; i++) { if (spoil || object_this_pval_is_visible(o_ptr, i)) { if (any) strnfcat(buf, max, &end, ", "); strnfcat(buf, max, &end, "%+d", o_ptr->pval[i]); any = TRUE; } } strnfcat(buf, max, &end, ">"); return end; } static size_t obj_desc_charges(const object_type *o_ptr, char *buf, size_t max, size_t end) { bool aware = object_flavor_is_aware(o_ptr) || (o_ptr->ident & IDENT_STORE); /* Wands and Staffs have charges */ if (aware && (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)) strnfcat(buf, max, &end, " (%d charge%s)", o_ptr->pval[DEFAULT_PVAL], PLURAL(o_ptr->pval[DEFAULT_PVAL])); /* Charging things */ else if (o_ptr->timeout > 0) { if (o_ptr->tval == TV_ROD && o_ptr->number > 1) { int power; int time_base = randcalc(o_ptr->kind->time, 0, MINIMISE); if (!time_base) time_base = 1; /* * Find out how many rods are charging, by dividing * current timeout by each rod's maximum timeout. * Ensure that any remainder is rounded up. Display * very discharged stacks as merely fully discharged. */ power = (o_ptr->timeout + (time_base - 1)) / time_base; if (power > o_ptr->number) power = o_ptr->number; /* Display prettily */ strnfcat(buf, max, &end, " (%d charging)", power); } /* Artifacts, single rods */ else if (!(o_ptr->tval == TV_LIGHT && !o_ptr->artifact)) { strnfcat(buf, max, &end, " (charging)"); } } return end; } static size_t obj_desc_inscrip(const object_type *o_ptr, char *buf, size_t max, size_t end) { const char *u[4] = { 0, 0, 0, 0 }; int n = 0; int feel = object_pseudo(o_ptr); bitflag flags_known[OF_SIZE], f2[OF_SIZE]; object_flags_known(o_ptr, flags_known); /* Get inscription */ if (o_ptr->note) u[n++] = quark_str(o_ptr->note); /* Use special inscription, if any */ if (!object_is_known(o_ptr) && feel) { /* cannot tell excellent vs strange vs splendid until wield */ if (!object_was_worn(o_ptr) && o_ptr->ego) u[n++] = "ego"; else u[n++] = inscrip_text[feel]; } else if ((o_ptr->ident & IDENT_EMPTY) && !object_is_known(o_ptr)) u[n++] = "empty"; else if (!object_is_known(o_ptr) && object_was_worn(o_ptr)) { if (wield_slot(o_ptr) == INVEN_WIELD || wield_slot(o_ptr) == INVEN_BOW) u[n++] = "wielded"; else u[n++] = "worn"; } else if (!object_is_known(o_ptr) && object_was_fired(o_ptr)) u[n++] = "fired"; else if (!object_flavor_is_aware(o_ptr) && object_flavor_was_tried(o_ptr)) u[n++] = "tried"; /* Note curses */ create_mask(f2, FALSE, OFT_CURSE, OFT_MAX); if (of_is_inter(flags_known, f2)) u[n++] = "cursed"; /* Note squelch */ if (squelch_item_ok(o_ptr)) u[n++] = "squelch"; if (n) { int i; for (i = 0; i < n; i++) { if (i == 0) strnfcat(buf, max, &end, " {"); strnfcat(buf, max, &end, "%s", u[i]); if (i < n-1) strnfcat(buf, max, &end, ", "); } strnfcat(buf, max, &end, "}"); } return end; } /* Add "unseen" to the end of unaware items in stores */ static size_t obj_desc_aware(const object_type *o_ptr, char *buf, size_t max, size_t end) { if (!object_flavor_is_aware(o_ptr)) strnfcat(buf, max, &end, " {unseen}"); return end; } /** * Describes item `o_ptr` into buffer `buf` of size `max`. * * ODESC_PREFIX prepends a 'the', 'a' or number * ODESC_BASE results in a base description. * ODESC_COMBAT will add to-hit, to-dam and AC info. * ODESC_EXTRA will add pval/charge/inscription/squelch info. * ODESC_PLURAL will pluralise regardless of the number in the stack. * ODESC_STORE turns off squelch markers, for in-store display. * ODESC_SPOIL treats the object as fully identified. * * Setting 'prefix' to TRUE prepends a 'the', 'a' or the number in the stack, * respectively. * * \returns The number of bytes used of the buffer. */ size_t object_desc(char *buf, size_t max, const object_type *o_ptr, int mode) { bool prefix = mode & ODESC_PREFIX; bool spoil = mode & ODESC_SPOIL; bool terse = mode & ODESC_TERSE; bool known; size_t end = 0, i = 0; /* Simple description for null item */ if (!o_ptr->tval) return strnfmt(buf, max, "(nothing)"); known = object_is_known(o_ptr) || (o_ptr->ident & IDENT_STORE) || spoil; /* We've seen it at least once now we're aware of it */ if (known && o_ptr->ego && !spoil) o_ptr->ego->everseen = TRUE; /*** Some things get really simple descriptions ***/ if (o_ptr->marked == MARK_AWARE) { if (prefix) return strnfmt(buf, max, "an unknown item"); return strnfmt(buf, max, "unknown item"); } if (o_ptr->tval == TV_GOLD) return strnfmt(buf, max, "%d gold pieces worth of %s%s", o_ptr->pval[DEFAULT_PVAL], o_ptr->kind->name, squelch_item_ok(o_ptr) ? " {squelch}" : ""); /** Construct the name **/ /* Copy the base name to the buffer */ end = obj_desc_name(buf, max, end, o_ptr, prefix, mode, spoil, terse); if (mode & ODESC_COMBAT) { if (o_ptr->tval == TV_CHEST) end = obj_desc_chest(o_ptr, buf, max, end); else if (o_ptr->tval == TV_LIGHT) end = obj_desc_light(o_ptr, buf, max, end); end = obj_desc_combat(o_ptr, buf, max, end, spoil); } if (mode & ODESC_EXTRA) { for (i = 0; i < o_ptr->num_pvals; i++) if (spoil || object_this_pval_is_visible(o_ptr, i)) { end = obj_desc_pval(o_ptr, buf, max, end, spoil); break; } end = obj_desc_charges(o_ptr, buf, max, end); if (mode & ODESC_STORE) end = obj_desc_aware(o_ptr, buf, max, end); else end = obj_desc_inscrip(o_ptr, buf, max, end); } return end; } angband-3.5.1/src/object/pval.h0000644000175000017500000000207212456456606015611 0ustar chriscchrisc/* * File: pval.h * Purpose: Structures and functions for dealing with object pvals * * Copyright (c) 2011 Chris Carr * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #ifndef INCLUDED_PVAL_H #define INCLUDED_PVAL_H #include "angband.h" /** Functions **/ bool object_add_pval(object_type *o_ptr, int pval, int flag); bool object_this_pval_is_visible(const object_type *o_ptr, int pval); int which_pval(const object_type *o_ptr, const int flag); void object_pval_flags(const object_type *o_ptr, bitflag flags[MAX_PVALS][OF_SIZE]); void object_pval_flags_known(const object_type *o_ptr, bitflag flags[MAX_PVALS][OF_SIZE]); #endif /* !INCLUDED_PVAL_H */ angband-3.5.1/src/object/inventory.h0000644000175000017500000000026012456456606016701 0ustar chriscchrisc/* object/inventory.h */ #ifndef OBJECT_INVENTORY_H #define OBJECT_INVENTORY_H extern s16b inven_carry(struct player *p, struct object *o); #endif /* !OBJECT_INVENTORY_H */ angband-3.5.1/src/ui-menu.c0000644000175000017500000005465312456456606014767 0ustar chriscchrisc/* * File: ui-menu.c * Purpose: Generic menu interaction functions * * Copyright (c) 2007 Pete Mack * Copyright (c) 2010 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "ui-event.h" #include "ui-menu.h" /* Cursor colours */ const byte curs_attrs[2][2] = { { TERM_SLATE, TERM_BLUE }, /* Greyed row */ { TERM_WHITE, TERM_L_BLUE } /* Valid row */ }; /* Some useful constants */ const char lower_case[] = "abcdefghijklmnopqrstuvwxyz"; const char upper_case[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const char all_letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; /* forward declarations */ static void display_menu_row(menu_type *menu, int pos, int top, bool cursor, int row, int col, int width); static bool menu_calc_size(menu_type *menu); static bool is_valid_row(menu_type *menu, int cursor); /* Display an event, with possible preference overrides */ static void display_action_aux(menu_action *act, byte color, int row, int col, int wid) { /* TODO: add preference support */ /* TODO: wizard mode should show more data */ Term_erase(col, row, wid); if (act->name) Term_putstr(col, row, wid, color, act->name); } /* ------------------------------------------------------------------------ * MN_ACTIONS HELPER FUNCTIONS * * MN_ACTIONS is the type of menu iterator that displays a simple list of * menu_actions. * ------------------------------------------------------------------------ */ static char menu_action_tag(menu_type *m, int oid) { menu_action *acts = menu_priv(m); return acts[oid].tag; } static int menu_action_valid(menu_type *m, int oid) { menu_action *acts = menu_priv(m); if (acts[oid].flags & MN_ACT_HIDDEN) return 2; return acts[oid].name ? TRUE : FALSE; } static void menu_action_display(menu_type *m, int oid, bool cursor, int row, int col, int width) { menu_action *acts = menu_priv(m); byte color = curs_attrs[!(acts[oid].flags & (MN_ACT_GRAYED))][0 != cursor]; display_action_aux(&acts[oid], color, row, col, width); } static bool menu_action_handle(menu_type *m, const ui_event *event, int oid) { menu_action *acts = menu_priv(m); if (event->type == EVT_SELECT) { if (!(acts->flags & MN_ACT_GRAYED) && acts[oid].action) { acts[oid].action(acts[oid].name, m->cursor); return TRUE; } } return FALSE; } /* Virtual function table for action_events */ static const menu_iter menu_iter_actions = { menu_action_tag, menu_action_valid, menu_action_display, menu_action_handle, NULL }; /* ------------------------------------------------------------------------ * MN_STRINGS HELPER FUNCTIONS * * MN_STRINGS is the type of menu iterator that displays a simple list of * strings - no action is associated, as selection will just return the index. * ------------------------------------------------------------------------ */ static void display_string(menu_type *m, int oid, bool cursor, int row, int col, int width) { const char **items = menu_priv(m); byte color = curs_attrs[CURS_KNOWN][0 != cursor]; Term_putstr(col, row, width, color, items[oid]); } /* Virtual function table for displaying arrays of strings */ static const menu_iter menu_iter_strings = { NULL, /* get_tag() */ NULL, /* valid_row() */ display_string, /* display_row() */ NULL, /* row_handler() */ NULL }; /* ================== SKINS ============== */ /* Scrolling menu */ /* Find the position of a cursor given a screen address */ static int scrolling_get_cursor(int row, int col, int n, int top, region *loc) { int cursor = row - loc->row + top; if (cursor >= n) cursor = n - 1; return cursor; } /* Display current view of a skin */ static void display_scrolling(menu_type *menu, int cursor, int *top, region *loc) { int col = loc->col; int row = loc->row; int rows_per_page = loc->page_rows; int n = menu->filter_list ? menu->filter_count : menu->count; int i; /* Keep a certain distance from the top when possible */ if ((cursor <= *top) && (*top > 0)) *top = cursor - 1; /* Keep a certain distance from the bottom when possible */ if (cursor >= *top + (rows_per_page - 1)) *top = cursor - (rows_per_page - 1) + 1; /* Limit the top to legal places */ *top = MIN(*top, n - rows_per_page); *top = MAX(*top, 0); for (i = 0; i < rows_per_page; i++) { /* Blank all lines */ Term_erase(col, row + i, loc->width); if (i < n) { /* Redraw the line if it's within the number of menu items */ bool is_curs = (i == cursor - *top); display_menu_row(menu, i + *top, *top, is_curs, row + i, col, loc->width); } } if (menu->cursor >= 0) Term_gotoxy(col + menu->cursor_x_offset, row + cursor - *top); } static char scroll_get_tag(menu_type *menu, int pos) { if (menu->selections) return menu->selections[pos - menu->top]; return 0; } static ui_event scroll_process_direction(menu_type *m, int dir) { ui_event out = EVENT_EMPTY; /* Reject diagonals */ if (ddx[dir] && ddy[dir]) ; /* Forward/back */ else if (ddx[dir]) out.type = ddx[dir] < 0 ? EVT_ESCAPE : EVT_SELECT; /* Move up or down to the next valid & visible row */ else if (ddy[dir]) { m->cursor += ddy[dir]; out.type = EVT_MOVE; } return out; } /* Virtual function table for scrollable menu skin */ static const menu_skin menu_skin_scroll = { scrolling_get_cursor, display_scrolling, scroll_get_tag, scroll_process_direction }; /*** Multi-column menus ***/ static int columns_get_cursor(int row, int col, int n, int top, region *loc) { int w, h, cursor; int rows_per_page = loc->page_rows; int cols = (n + rows_per_page - 1) / rows_per_page; int colw = 23; Term_get_size(&w, &h); if ((colw * cols) > (w - col)) colw = (w - col) / cols; cursor = (row - loc->row) + rows_per_page * ((col - loc->col) / colw); if (cursor < 0) cursor = 0; /* assert: This should never happen */ if (cursor >= n) cursor = n - 1; return cursor; } static void display_columns(menu_type *menu, int cursor, int *top, region *loc) { int c, r; int w, h; int n = menu->filter_list ? menu->filter_count : menu->count; int col = loc->col; int row = loc->row; int rows_per_page = loc->page_rows; int cols = (n + rows_per_page - 1) / rows_per_page; int colw = 23; Term_get_size(&w, &h); if ((colw * cols) > (w - col)) colw = (w - col) / cols; for (c = 0; c < cols; c++) { for (r = 0; r < rows_per_page; r++) { int pos = c * rows_per_page + r; bool is_cursor = (pos == cursor); if (pos < n) display_menu_row(menu, pos, 0, is_cursor, row + r, col + c * colw, colw); } } if (menu->cursor >= 0) Term_gotoxy(col + (cursor / rows_per_page) * colw + menu->cursor_x_offset, row + (cursor % rows_per_page) - *top); } static char column_get_tag(menu_type *menu, int pos) { if (menu->selections) return menu->selections[pos]; return 0; } static ui_event column_process_direction(menu_type *m, int dir) { ui_event out = EVENT_EMPTY; int n = m->filter_list ? m->filter_count : m->count; region *loc = &m->active; int rows_per_page = loc->page_rows; int cols = (n + rows_per_page - 1) / rows_per_page; if (ddx[dir]) m->cursor += ddx[dir] * rows_per_page; if (ddy[dir]) m->cursor += ddy[dir]; /* Adjust to the correct locations (roughly) */ if (m->cursor > n) m->cursor = m->cursor % rows_per_page; else if (m->cursor < 0) m->cursor = (rows_per_page * cols) + m->cursor; out.type = EVT_MOVE; return out; } /* Virtual function table for multi-column menu skin */ static const menu_skin menu_skin_column = { columns_get_cursor, display_columns, column_get_tag, column_process_direction }; /* ================== GENERIC HELPER FUNCTIONS ============== */ static bool is_valid_row(menu_type *menu, int cursor) { int oid; int count = menu->filter_list ? menu->filter_count : menu->count; if (cursor < 0 || cursor >= count) return FALSE; oid = menu->filter_list ? menu->filter_list[cursor] : cursor; if (menu->row_funcs->valid_row) return menu->row_funcs->valid_row(menu, oid); return TRUE; } /* * Return a new position in the menu based on the key * pressed and the flags and various handler functions. */ static int get_cursor_key(menu_type *menu, int top, struct keypress key) { int i; int n = menu->filter_list ? menu->filter_count : menu->count; if (menu->flags & MN_CASELESS_TAGS) key.code = toupper((unsigned char) key.code); if (menu->flags & MN_NO_TAGS) { return -1; } else if (menu->flags & MN_REL_TAGS) { for (i = 0; i < n; i++) { char c = menu->skin->get_tag(menu, i); if ((menu->flags & MN_CASELESS_TAGS) && c) c = toupper((unsigned char) c); if (c && c == (char)key.code) return i + menu->top; } } else if (!(menu->flags & MN_PVT_TAGS) && menu->selections) { for (i = 0; menu->selections[i]; i++) { char c = menu->selections[i]; if (menu->flags & MN_CASELESS_TAGS) c = toupper((unsigned char) c); if (c == (char)key.code) return i; } } else if (menu->row_funcs->get_tag) { for (i = 0; i < n; i++) { int oid = menu->filter_list ? menu->filter_list[i] : i; char c = menu->row_funcs->get_tag(menu, oid); if ((menu->flags & MN_CASELESS_TAGS) && c) c = toupper((unsigned char) c); if (c && c == (char)key.code) return i; } } return -1; } static menu_row_style_t menu_row_style_for_validity(menu_row_validity_t row_valid) { menu_row_style_t style; switch (row_valid) { case MN_ROW_INVALID: case MN_ROW_HIDDEN: style = MN_ROW_STYLE_DISABLED; break; case MN_ROW_VALID: default: style = MN_ROW_STYLE_ENABLED; break; } return style; } /* Modal display of menu */ static void display_menu_row(menu_type *menu, int pos, int top, bool cursor, int row, int col, int width) { int flags = menu->flags; char sel = 0; int oid = pos; menu_row_validity_t row_valid = MN_ROW_VALID; if (menu->filter_list) oid = menu->filter_list[oid]; if (menu->row_funcs->valid_row) row_valid = menu->row_funcs->valid_row(menu, oid); if (row_valid == MN_ROW_HIDDEN) return; if (!(flags & MN_NO_TAGS)) { if (flags & MN_REL_TAGS) sel = menu->skin->get_tag(menu, pos); else if (menu->selections && !(flags & MN_PVT_TAGS)) sel = menu->selections[pos]; else if (menu->row_funcs->get_tag) sel = menu->row_funcs->get_tag(menu, oid); } if (sel) { menu_row_style_t style = menu_row_style_for_validity(row_valid); byte color = curs_attrs[style][0 != (cursor)]; Term_putstr(col, row, 3, color, format("%c) ", sel)); col += 3; width -= 3; } menu->row_funcs->display_row(menu, oid, cursor, row, col, width); } void menu_refresh(menu_type *menu, bool reset_screen) { int oid = menu->cursor; region *loc = &menu->active; if (reset_screen) { screen_load(); screen_save(); } if (menu->filter_list && menu->cursor >= 0) oid = menu->filter_list[oid]; if (menu->title) Term_putstr(menu->boundary.col, menu->boundary.row, loc->width, TERM_WHITE, menu->title); if (menu->header) Term_putstr(loc->col, loc->row - 1, loc->width, TERM_WHITE, menu->header); if (menu->prompt) Term_putstr(menu->boundary.col, loc->row + loc->page_rows, loc->width, TERM_WHITE, menu->prompt); if (menu->browse_hook && oid >= 0) menu->browse_hook(oid, menu->menu_data, loc); menu->skin->display_list(menu, menu->cursor, &menu->top, loc); } /*** MENU RUNNING AND INPUT HANDLING CODE ***/ /* * Handle mouse input in a menu. * * Mouse output is either moving, selecting, escaping, or nothing. Returns * TRUE if something changes as a result of the click. */ bool menu_handle_mouse(menu_type *menu, const ui_event *in, ui_event *out) { int new_cursor; if (in->mouse.button == 2) { out->type = EVT_ESCAPE; } else if (!region_inside(&menu->active, in)) { /* A click to the left of the active region is 'back' */ if (!region_inside(&menu->active, in) && in->mouse.x < menu->active.col) out->type = EVT_ESCAPE; } else { int count = menu->filter_list ? menu->filter_count : menu->count; new_cursor = menu->skin->get_cursor(in->mouse.y, in->mouse.x, count, menu->top, &menu->active); if (is_valid_row(menu, new_cursor)) { if (new_cursor == menu->cursor || !(menu->flags & MN_DBL_TAP)) out->type = EVT_SELECT; else out->type = EVT_MOVE; menu->cursor = new_cursor; } } return out->type != EVT_NONE; } /** * Handle any menu command keys / SELECT events. * * Returns TRUE if the key was handled at all (including if it's not handled * and just ignored). */ static bool menu_handle_action(menu_type *m, const ui_event *in) { if (m->row_funcs->row_handler) { int oid = m->cursor; if (m->filter_list) oid = m->filter_list[m->cursor]; return m->row_funcs->row_handler(m, in, oid); } return FALSE; } /** * Handle navigation keypresses. * * Returns TRUE if they key was intelligible as navigation, regardless of * whether any action was taken. */ bool menu_handle_keypress(menu_type *menu, const ui_event *in, ui_event *out) { bool eat = FALSE; int count = menu->filter_list ? menu->filter_count : menu->count; /* Get the new cursor position from the menu item tags */ int new_cursor = get_cursor_key(menu, menu->top, in->key); if (new_cursor >= 0 && is_valid_row(menu, new_cursor)) { if (!(menu->flags & MN_DBL_TAP) || new_cursor == menu->cursor) out->type = EVT_SELECT; else out->type = EVT_MOVE; menu->cursor = new_cursor; } /* Escape stops us here */ else if (in->key.code == ESCAPE) out->type = EVT_ESCAPE; /* Menus with no rows can't be navigated or used, so eat all keypresses */ else if (count <= 0) eat = TRUE; /* Try existing, known keys */ else if (in->key.code == ' ') { int rows = menu->active.page_rows; int total = count; if (rows < total) { /* Go to start of next page */ menu->cursor += menu->active.page_rows; if (menu->cursor >= total - 1) menu->cursor = 0; menu->top = menu->cursor; out->type = EVT_MOVE; } else { eat = TRUE; } } else if (in->key.code == KC_ENTER) out->type = EVT_SELECT; /* Try directional movement */ else { int dir = target_dir(in->key); if (dir) { *out = menu->skin->process_dir(menu, dir); if (out->type == EVT_MOVE) { while (!is_valid_row(menu, menu->cursor)) { /* Loop around */ if (menu->cursor > count - 1) menu->cursor = 0; else if (menu->cursor < 0) menu->cursor = count - 1; else menu->cursor += ddy[dir]; } assert(menu->cursor >= 0); assert(menu->cursor < count); } } } return eat; } /* * Run a menu. * * If popup is true, the screen is saved before the menu is drawn, and * restored afterwards. Each time a popup menu is redrawn, it resets the * screen before redrawing. */ ui_event menu_select(menu_type *menu, int notify, bool popup) { ui_event in = EVENT_EMPTY; bool no_act = (menu->flags & MN_NO_ACTION) ? TRUE : FALSE; assert(menu->active.width != 0 && menu->active.page_rows != 0); notify |= (EVT_SELECT | EVT_ESCAPE); if (popup) screen_save(); /* Stop on first unhandled event */ while (!(in.type & notify)) { ui_event out = EVENT_EMPTY; menu_refresh(menu, popup); in = inkey_ex(); /* Handle mouse & keyboard commands */ if (in.type == EVT_MOUSE) { if (!no_act && menu_handle_action(menu, &in)) { continue; } menu_handle_mouse(menu, &in, &out); } else if (in.type == EVT_KBRD) { if (!no_act && menu->cmd_keys && strchr(menu->cmd_keys, (char)in.key.code) && menu_handle_action(menu, &in)) continue; menu_handle_keypress(menu, &in, &out); } else if (in.type == EVT_RESIZE) { menu_calc_size(menu); if (menu->row_funcs->resize) menu->row_funcs->resize(menu); } /* XXX should redraw menu here if cursor has moved */ /* If we've selected an item, then send that event out */ if (out.type == EVT_SELECT && !no_act && menu_handle_action(menu, &out)) continue; /* Notify about the outgoing type */ if (notify & out.type) { if (popup) screen_load(); return out; } } if (popup) screen_load(); return in; } /* ================== MENU ACCESSORS ================ */ /** * Return the menu iter struct for a given iter ID. */ const menu_iter *menu_find_iter(menu_iter_id id) { switch (id) { case MN_ITER_ACTIONS: return &menu_iter_actions; case MN_ITER_STRINGS: return &menu_iter_strings; } return NULL; } /* * Return the skin behaviour struct for a given skin ID. */ static const menu_skin *menu_find_skin(skin_id id) { switch (id) { case MN_SKIN_SCROLL: return &menu_skin_scroll; case MN_SKIN_COLUMNS: return &menu_skin_column; } return NULL; } void menu_set_filter(menu_type *menu, const int filter_list[], int n) { menu->filter_list = filter_list; menu->filter_count = n; menu_ensure_cursor_valid(menu); } void menu_release_filter(menu_type *menu) { menu->filter_list = NULL; menu->filter_count = 0; menu_ensure_cursor_valid(menu); } void menu_ensure_cursor_valid(menu_type *m) { int row; int count = m->filter_list ? m->filter_count : m->count; for (row = m->cursor; row < count; row++) { if (is_valid_row(m, row)) { m->cursor = row; return; } } /* If we've run off the end, without finding a valid row, put cursor * on the last row */ m->cursor = count - 1; } /* ======================== MENU INITIALIZATION ==================== */ static bool menu_calc_size(menu_type *menu) { /* Calculate term-relative positions */ menu->active = region_calculate(menu->boundary); if (menu->title) { menu->active.row += 2; menu->active.page_rows -= 2; menu->active.col += 4; } if (menu->header) { menu->active.row++; menu->active.page_rows--; } if (menu->prompt) { if (menu->active.page_rows > 1) { menu->active.page_rows--; } else { int offset = strlen(menu->prompt) + 2; menu->active.col += offset; menu->active.width -= offset; } } return (menu->active.width > 0 && menu->active.page_rows > 0); } bool menu_layout(menu_type *m, const region *loc) { m->boundary = *loc; return menu_calc_size(m); } void menu_setpriv(menu_type *menu, int count, void *data) { menu->count = count; menu->menu_data = data; menu_ensure_cursor_valid(menu); } void *menu_priv(menu_type *menu) { return menu->menu_data; } void menu_init(menu_type *menu, skin_id skin_id, const menu_iter *iter) { const menu_skin *skin = menu_find_skin(skin_id); assert(skin && "menu skin not found!"); assert(iter && "menu iter not found!"); /* Wipe the struct */ memset(menu, 0, sizeof *menu); /* Menu-specific initialisation */ menu->row_funcs = iter; menu->skin = skin; menu->cursor = 0; menu->cursor_x_offset = 0; } menu_type *menu_new(skin_id skin_id, const menu_iter *iter) { menu_type *m = mem_alloc(sizeof *m); menu_init(m, skin_id, iter); return m; } menu_type *menu_new_action(menu_action *acts, size_t n) { menu_type *m = menu_new(MN_SKIN_SCROLL, menu_find_iter(MN_ITER_ACTIONS)); menu_setpriv(m, n, acts); return m; } void menu_free(menu_type *m) { mem_free(m); } void menu_set_cursor_x_offset(menu_type *m, int offset) { /* This value is used in the menu skin's display_list() function. */ m->cursor_x_offset = offset; } /*** Dynamic menu handling ***/ struct menu_entry { char *text; int value; menu_row_validity_t valid; struct menu_entry *next; }; static int dynamic_valid(menu_type *m, int oid) { struct menu_entry *entry; for (entry = menu_priv(m); oid; oid--) { entry = entry->next; assert(entry); } return entry->valid; } static void dynamic_display(menu_type *m, int oid, bool cursor, int row, int col, int width) { struct menu_entry *entry; byte color = curs_attrs[MN_ROW_STYLE_ENABLED][0 != cursor]; /* Hack? While row_funcs is private, we need to be consistent with what the menu will do. */ if (m->row_funcs->valid_row) { menu_row_validity_t row_valid = m->row_funcs->valid_row(m, oid); menu_row_style_t style = menu_row_style_for_validity(row_valid); color = curs_attrs[style][0 != cursor]; } for (entry = menu_priv(m); oid; oid--) { entry = entry->next; assert(entry); } Term_putstr(col, row, width, color, entry->text); } static const menu_iter dynamic_iter = { NULL, /* tag */ dynamic_valid, dynamic_display, NULL, /* handler */ NULL /* resize */ }; menu_type *menu_dynamic_new(void) { menu_type *m = menu_new(MN_SKIN_SCROLL, &dynamic_iter); menu_setpriv(m, 0, NULL); return m; } void menu_dynamic_add_valid(menu_type *m, const char *text, int value, menu_row_validity_t valid) { struct menu_entry *head = menu_priv(m); struct menu_entry *new = mem_zalloc(sizeof *new); assert(m->row_funcs == &dynamic_iter); new->text = string_make(text); new->value = value; new->valid = valid; if (head) { struct menu_entry *tail = head; while (1) { if (tail->next) tail = tail->next; else break; } tail->next = new; menu_setpriv(m, m->count + 1, head); } else { menu_setpriv(m, m->count + 1, new); } } void menu_dynamic_add(menu_type *m, const char *text, int value) { menu_dynamic_add_valid(m, text, value, MN_ROW_VALID); } void menu_dynamic_add_label_valid(menu_type *m, const char *text, const char label, int value, char *label_list, menu_row_validity_t valid) { if(label && m->selections && (m->selections == label_list)) { label_list[m->count] = label; } menu_dynamic_add_valid(m,text,value, valid); } void menu_dynamic_add_label(menu_type *m, const char *text, const char label, int value, char *label_list) { menu_dynamic_add_label_valid(m, text, label, value, label_list, MN_ROW_VALID); } size_t menu_dynamic_longest_entry(menu_type *m) { size_t biggest = 0; size_t current; struct menu_entry *entry; for (entry = menu_priv(m); entry; entry = entry->next) { current = strlen(entry->text); if (current > biggest) biggest = current; } return biggest; } int menu_dynamic_select(menu_type *m) { ui_event e = menu_select(m, 0, TRUE); struct menu_entry *entry; int cursor = m->cursor; if (e.type == EVT_ESCAPE) return -1; for (entry = menu_priv(m); cursor; cursor--) { entry = entry->next; assert(entry); } return entry->value; } void menu_dynamic_free(menu_type *m) { struct menu_entry *entry = menu_priv(m); while (entry) { struct menu_entry *next = entry->next; string_free(entry->text); mem_free(entry); entry = next; } mem_free(m); } angband-3.5.1/src/main-x11.c0000644000175000017500000015727312456456606014745 0ustar chriscchrisc/* * File: main-x11.c * Purpose: Provide support for the X Windowing System * * Copyright (c) 1997 Ben Harrison, and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "dungeon.h" /* * This file helps Angband work with UNIX/X11 computers. * * To use this file, compile with "USE_X11" defined, and link against all * the various "X11" libraries which may be needed. * * Part of this file provides a user interface package composed of several * pseudo-objects, including "metadpy" (a display), "infowin" (a window), * "infoclr" (a color), and "infofnt" (a font). Actually, the package was * originally much more interesting, but it was bastardized to keep this * file simple. * * The rest of this file is an implementation of "main-xxx.c" for X11. * * Most of this file is by Ben Harrison (benh@phial.com). */ /* * The following shell script can be used to launch Angband, assuming that * it was extracted into "~/Angband", and compiled using "USE_X11", on a * Linux machine, with a 1280x1024 screen, using 6 windows (with the given * characteristics), with gamma correction of 1.8 -> (1 / 1.8) * 256 = 142, * and without graphics (add "-g" for graphics). Just copy this comment * into a file, remove the leading " * " characters (and the head/tail of * this comment), and make the file executable. * * * #!/bin/csh * * # Describe attempt * echo "Launching angband..." * sleep 2 * * # Main window * setenv ANGBAND_X11_FONT_0 10x20 * setenv ANGBAND_X11_AT_X_0 5 * setenv ANGBAND_X11_AT_Y_0 510 * * # Message window * setenv ANGBAND_X11_FONT_1 8x13 * setenv ANGBAND_X11_AT_X_1 5 * setenv ANGBAND_X11_AT_Y_1 22 * setenv ANGBAND_X11_ROWS_1 35 * * # Inventory window * setenv ANGBAND_X11_FONT_2 8x13 * setenv ANGBAND_X11_AT_X_2 635 * setenv ANGBAND_X11_AT_Y_2 182 * setenv ANGBAND_X11_ROWS_2 23 * * # Equipment window * setenv ANGBAND_X11_FONT_3 8x13 * setenv ANGBAND_X11_AT_X_3 635 * setenv ANGBAND_X11_AT_Y_3 22 * setenv ANGBAND_X11_ROWS_3 12 * * # Monster recall window * setenv ANGBAND_X11_FONT_4 6x13 * setenv ANGBAND_X11_AT_X_4 817 * setenv ANGBAND_X11_AT_Y_4 847 * setenv ANGBAND_X11_COLS_4 76 * setenv ANGBAND_X11_ROWS_4 11 * * # Object recall window * setenv ANGBAND_X11_FONT_5 6x13 * setenv ANGBAND_X11_AT_X_5 817 * setenv ANGBAND_X11_AT_Y_5 520 * setenv ANGBAND_X11_COLS_5 76 * setenv ANGBAND_X11_ROWS_5 24 * * # The build directory * cd ~/Angband * * # Gamma correction * setenv ANGBAND_X11_GAMMA 142 * * # Launch Angband * ./src/angband -mx11 -- -n6 & * */ #ifdef USE_X11 #include #include #include #include #include #include "main.h" #ifndef IsModifierKey /* * Keysym macros, used on Keysyms to test for classes of symbols * These were stolen from one of the X11 header files */ #define IsKeypadKey(keysym) \ (((unsigned)(keysym) >= XK_KP_Space) && ((unsigned)(keysym) <= XK_KP_Equal)) #define IsCursorKey(keysym) \ (((unsigned)(keysym) >= XK_Home) && ((unsigned)(keysym) < XK_Select)) #define IsPFKey(keysym) \ (((unsigned)(keysym) >= XK_KP_F1) && ((unsigned)(keysym) <= XK_KP_F4)) #define IsFunctionKey(keysym) \ (((unsigned)(keysym) >= XK_F1) && ((unsigned)(keysym) <= XK_F35)) #define IsMiscFunctionKey(keysym) \ (((unsigned)(keysym) >= XK_Select) && ((unsigned)(keysym) < XK_KP_Space)) #define IsModifierKey(keysym) \ (((unsigned)(keysym) >= XK_Shift_L) && ((unsigned)(keysym) <= XK_Hyper_R)) #endif /* IsModifierKey */ /* * Checks if the keysym is a special key or a normal key * Assume that XK_MISCELLANY keysyms are special */ #define IsSpecialKey(keysym) \ ((unsigned)(keysym) >= 0xFF00) /* * Hack -- avoid some compiler warnings */ #define IGNORE_UNUSED_FUNCTIONS /* * Notes on Colors: * * 1) On a monochrome (or "fake-monochrome") display, all colors * will be "cast" to "fg," except for the bg color, which is, * obviously, cast to "bg". Thus, one can ignore this setting. * * 2) Because of the inner functioning of the color allocation * routines, colors may be specified as (a) a typical color name, * (b) a hexidecimal color specification (preceded by a pound sign), * or (c) by strings such as "fg", "bg", "zg". * * 3) Due to the workings of the init routines, many colors * may also be dealt with by their actual pixel values. Note that * the pixel with all bits set is "zg = (1<depth)-1", which * is not necessarily either black or white. */ /**** Generic Types ****/ /* * An X11 pixell specifier */ typedef unsigned long Pixell; /* * The structures defined below */ typedef struct metadpy metadpy; typedef struct infowin infowin; typedef struct infoclr infoclr; typedef struct infofnt infofnt; /* * A structure summarizing a given Display. * * - The Display itself * - The default Screen for the display * - The virtual root (usually just the root) * - The default colormap (from a macro) * - The Alt key modifier mask * - The Super key modifier mask * * - The "name" of the display * * - The socket to listen to for events * * - The width of the display screen (from a macro) * - The height of the display screen (from a macro) * - The bit depth of the display screen (from a macro) * * - The black Pixell (from a macro) * - The white Pixell (from a macro) * * - The background Pixell (default: black) * - The foreground Pixell (default: white) * - The maximal Pixell (Equals: ((2 ^ depth)-1), is usually ugly) * * - Bit Flag: Force all colors to black and white (default: !color) * - Bit Flag: Allow the use of color (default: depth > 1) * - Bit Flag: We created 'dpy', and so should nuke it when done. */ struct metadpy { Display *dpy; Screen *screen; Window root; Colormap cmap; unsigned int alt_mask; unsigned int super_mask; char *name; int fd; unsigned int width; unsigned int height; unsigned int depth; Pixell black; Pixell white; Pixell bg; Pixell fg; Pixell zg; unsigned int mono:1; unsigned int color:1; unsigned int nuke:1; }; /* * A Structure summarizing Window Information. * * I assume that a window is at most 30000 pixels on a side. * I assume that the root windw is also at most 30000 square. * * - The Window * - The current Input Event Mask * * - The location of the window * - The saved (startup) location of the window * - The width, height of the window * - The border width of this window * * - Byte: 1st Extra byte * * - Bit Flag: This window is currently Mapped * - Bit Flag: This window needs to be redrawn * - Bit Flag: This window has been resized * * - Bit Flag: We should nuke 'win' when done with it * * - Bit Flag: 1st extra flag * - Bit Flag: 2nd extra flag * - Bit Flag: 3rd extra flag * - Bit Flag: 4th extra flag */ struct infowin { Window win; long mask; s16b ox, oy; s16b x, y; s16b x_save, y_save; s16b w, h; u16b b; byte byte1; unsigned int mapped:1; unsigned int redraw:1; unsigned int resize:1; unsigned int nuke:1; unsigned int flag1:1; unsigned int flag2:1; unsigned int flag3:1; unsigned int flag4:1; }; /* * A Structure summarizing Operation+Color Information * * - The actual GC corresponding to this info * * - The Foreground Pixell Value * - The Background Pixell Value * * - Num (0-15): The operation code (As in Clear, Xor, etc) * - Bit Flag: The GC is in stipple mode * - Bit Flag: Destroy 'gc' at Nuke time. */ struct infoclr { GC gc; Pixell fg; Pixell bg; unsigned int code:4; unsigned int stip:1; unsigned int nuke:1; }; /* * A Structure to Hold Font Information * * - The 'XFontStruct*' (yields the 'Font') * * - The font name * * - The default character width * - The default character height * - The default character ascent * * - Byte: Pixel offset used during fake mono * * - Flag: Force monospacing via 'wid' * - Flag: Nuke info when done */ struct infofnt { XFontSet fs; const char *name; s16b wid; s16b twid; s16b hgt; s16b asc; byte off; unsigned int mono:1; unsigned int nuke:1; }; /* * Forward declare */ typedef struct term_data term_data; /* * A structure for each "term" */ struct term_data { term t; infofnt *fnt; infowin *win; int tile_wid; int tile_wid2; /* Tile-width with bigscreen */ int tile_hgt; /* Pointers to allocated data, needed to clear up memory */ XClassHint *classh; XSizeHints *sizeh; }; /**** Generic Macros ****/ /* Initialize 'M' using a Display named 'N' */ #define Metadpy_init_name(N) \ Metadpy_init_2((Display*)(NULL),N) /* Init a top level infowin by pos,size,bord,Colors */ #define Infowin_init_top(X,Y,W,H,B,FG,BG) \ Infowin_init_data(None,X,Y,W,H,B,FG,BG) /* Set the current Infowin */ #define Infowin_set(I) \ (Infowin = (I)) /* Set the current Infoclr */ #define Infoclr_set(C) \ (Infoclr = (C)) #define Infoclr_init_ppo(F,B,O,M) \ Infoclr_init_data(F,B,O,M) #define Infoclr_init_ppn(F,B,O,M) \ Infoclr_init_ppo(F,B,Infoclr_Opcode(O),M) /* Set the current infofnt */ #define Infofnt_set(I) \ (Infofnt = (I)) /**** Generic Globals ****/ /* * The "default" values */ static metadpy metadpy_default; /* * The "current" variables */ static metadpy *Metadpy = &metadpy_default; static infowin *Infowin = (infowin*)(NULL); static infoclr *Infoclr = (infoclr*)(NULL); static infofnt *Infofnt = (infofnt*)(NULL); /* * Actual color table */ static infoclr *clr[MAX_COLORS * BG_MAX]; /**** Code imported from the old maid-x11.c ****/ #ifdef SUPPORT_GAMMA static bool gamma_table_ready = FALSE; static int gamma_val = 0; #endif /* SUPPORT_GAMMA */ /* * Hack -- Convert an RGB value to an X11 Pixel, or die. */ static u32b create_pixel(Display *dpy, byte red, byte green, byte blue) { Colormap cmap = DefaultColormapOfScreen(DefaultScreenOfDisplay(dpy)); XColor xcolour; #ifdef SUPPORT_GAMMA if (!gamma_table_ready) { const char *str = getenv("ANGBAND_X11_GAMMA"); if (str != NULL) gamma_val = atoi(str); gamma_table_ready = TRUE; /* Only need to build the table if gamma exists */ if (gamma_val) build_gamma_table(gamma_val); } /* Hack -- Gamma Correction */ if (gamma_val > 0) { red = gamma_table[red]; green = gamma_table[green]; blue = gamma_table[blue]; } #endif /* SUPPORT_GAMMA */ /* Build the color */ xcolour.red = red * 257; xcolour.green = green * 257; xcolour.blue = blue * 257; xcolour.flags = DoRed | DoGreen | DoBlue; /* Attempt to Allocate the Parsed color */ if (!(XAllocColor(dpy, cmap, &xcolour))) { quit_fmt("Couldn't allocate bitmap color #%04x%04x%04x\n", xcolour.red, xcolour.green, xcolour.blue); } return (xcolour.pixel); } /* * Get the name of the default font to use for the term. */ static const char *get_default_font(int term_num) { const char *font; char buf[80]; /* Window specific font name */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_FONT_%d", term_num); /* Check environment for that font */ font = getenv(buf); if (font) return font; /* Check environment for "base" font */ font = getenv("ANGBAND_X11_FONT"); if (font) return font; switch (term_num) { case 0: return DEFAULT_X11_FONT_0; case 1: return DEFAULT_X11_FONT_1; case 2: return DEFAULT_X11_FONT_2; case 3: return DEFAULT_X11_FONT_3; case 4: return DEFAULT_X11_FONT_4; case 5: return DEFAULT_X11_FONT_5; case 6: return DEFAULT_X11_FONT_6; case 7: return DEFAULT_X11_FONT_7; } return DEFAULT_X11_FONT; } /* look up keyboard modifiers using the Xkb extension */ static unsigned int xkb_mask_modifier( XkbDescPtr xkb, const char *name ) { unsigned int mask=0; if ( strcmp(name, "Caps Lock") == 0 ) return 2; for(int i = 0; i <= XkbNumVirtualMods; i++ ) { char* modStr = XGetAtomName( xkb->dpy, xkb->names->vmods[i] ); if( modStr != NULL && strcmp(name, modStr) == 0 ) { XkbVirtualModsToReal( xkb, 1 << i, &mask ); return mask; } } return 0; } /**** Generic code ****/ /* * Init the current metadpy, with various initialization stuff. * * Inputs: * dpy: The Display* to use (if NULL, create it) * name: The name of the Display (if NULL, the current) * * Notes: * If 'name' is NULL, but 'dpy' is set, extract name from dpy * If 'dpy' is NULL, then Create the named Display * If 'name' is NULL, and so is 'dpy', use current Display * * Return -1 if no Display given, and none can be opened. */ static errr Metadpy_init_2(Display *dpy, const char *name) { metadpy *m = Metadpy; XkbDescPtr xkb; /*** Open the display if needed ***/ /* If no Display given, attempt to Create one */ if (!dpy) { /* Attempt to open the display */ dpy = XOpenDisplay(name); /* Failure */ if (!dpy) return (-1); /* We will have to nuke it when done */ m->nuke = 1; } /* Since the Display was given, use it */ else { /* We will not have to nuke it when done */ m->nuke = 0; } /*** Save some information ***/ /* Save the Display itself */ m->dpy = dpy; /* Get the Screen and Virtual Root Window */ m->screen = DefaultScreenOfDisplay(dpy); m->root = RootWindowOfScreen(m->screen); /* get the modifier key layout */ m->alt_mask = Mod1Mask; m->super_mask = Mod4Mask; xkb = XkbGetKeyboard(dpy, XkbAllComponentsMask, XkbUseCoreKbd); if (xkb != NULL) { m->alt_mask = xkb_mask_modifier( xkb, "Alt" ); m->super_mask = xkb_mask_modifier( xkb, "Super" ); XkbFreeKeyboard( xkb, 0, True ); } /* Get the default colormap */ m->cmap = DefaultColormapOfScreen(m->screen); /* Extract the true name of the display */ m->name = DisplayString(dpy); /* Extract the fd */ m->fd = ConnectionNumber(Metadpy->dpy); /* Save the Size and Depth of the screen */ m->width = WidthOfScreen(m->screen); m->height = HeightOfScreen(m->screen); m->depth = DefaultDepthOfScreen(m->screen); /* Save the Standard Colors */ m->black = BlackPixelOfScreen(m->screen); m->white = WhitePixelOfScreen(m->screen); /*** Make some clever Guesses ***/ /* Guess at the desired 'fg' and 'bg' Pixell's */ m->bg = m->black; m->fg = m->white; /* Calculate the Maximum allowed Pixel value. */ m->zg = ((Pixell)1 << m->depth) - 1; /* Save various default Flag Settings */ m->color = ((m->depth > 1) ? 1 : 0); m->mono = ((m->color) ? 0 : 1); /* Return "success" */ return (0); } /* * Nuke the current metadpy */ static errr Metadpy_nuke(void) { metadpy *m = Metadpy; /* If required, Free the Display */ if (m->nuke) { /* Close the Display */ XCloseDisplay(m->dpy); /* Forget the Display */ m->dpy = (Display*)(NULL); /* Do not nuke it again */ m->nuke = 0; } /* Return Success */ return (0); } /* * General Flush/ Sync/ Discard routine */ static errr Metadpy_update(int flush, int sync, int discard) { /* Flush if desired */ if (flush) XFlush(Metadpy->dpy); /* Sync if desired, using 'discard' */ if (sync) XSync(Metadpy->dpy, discard); /* Success */ return (0); } /* * Make a simple beep */ static errr Metadpy_do_beep(void) { /* Make a simple beep */ XBell(Metadpy->dpy, 100); return (0); } /* * Set the name (in the title bar) of Infowin */ static errr Infowin_set_name(const char *name) { Status st; XTextProperty tp; char buf[128]; char *bp = buf; my_strcpy(buf, name, sizeof(buf)); st = XStringListToTextProperty(&bp, 1, &tp); if (st) XSetWMName(Metadpy->dpy, Infowin->win, &tp); return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Set the icon name of Infowin */ static errr Infowin_set_icon_name(const char *name) { Status st; XTextProperty tp; char buf[128]; char *bp = buf; my_strcpy(buf, name, sizeof(buf)); st = XStringListToTextProperty(&bp, 1, &tp); if (st) XSetWMIconName(Metadpy->dpy, Infowin->win, &tp); return (0); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Nuke Infowin */ static errr Infowin_nuke(void) { infowin *iwin = Infowin; /* Nuke if requested */ if (iwin->nuke) { /* Destory the old window */ XDestroyWindow(Metadpy->dpy, iwin->win); } /* Success */ return (0); } /* * Prepare a new 'infowin'. */ static errr Infowin_prepare(Window xid) { infowin *iwin = Infowin; Window tmp_win; XWindowAttributes xwa; int x, y; unsigned int w, h, b, d; /* Assign stuff */ iwin->win = xid; /* Check For Error XXX Extract some ACTUAL data from 'xid' */ XGetGeometry(Metadpy->dpy, xid, &tmp_win, &x, &y, &w, &h, &b, &d); /* Apply the above info */ iwin->x = x; iwin->y = y; iwin->x_save = x; iwin->y_save = y; iwin->w = w; iwin->h = h; iwin->b = b; /* Check Error XXX Extract some more ACTUAL data */ XGetWindowAttributes(Metadpy->dpy, xid, &xwa); /* Apply the above info */ iwin->mask = xwa.your_event_mask; iwin->mapped = ((xwa.map_state == IsUnmapped) ? 0 : 1); /* And assume that we are exposed */ iwin->redraw = 1; /* Success */ return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Initialize a new 'infowin'. */ static errr Infowin_init_real(Window xid) { /* Wipe it clean */ (void)WIPE(Infowin, infowin); /* Start out non-nukable */ Infowin->nuke = 0; /* Attempt to Prepare ourself */ return (Infowin_prepare(xid)); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Init an infowin by giving some data. * * Inputs: * dad: The Window that should own this Window (if any) * x,y: The position of this Window * w,h: The size of this Window * b,d: The border width and pixel depth * * Notes: * If 'dad == None' assume 'dad == root' */ static errr Infowin_init_data(Window dad, int x, int y, int w, int h, int b, Pixell fg, Pixell bg) { Window xid; /* Wipe it clean */ (void)WIPE(Infowin, infowin); /*** Error Check XXX ***/ /*** Create the Window 'xid' from data ***/ /* What happened here? XXX XXX XXX */ /* If no parent given, depend on root */ if (dad == None) dad = Metadpy->root; /* Create the Window XXX Error Check */ xid = XCreateSimpleWindow(Metadpy->dpy, dad, x, y, w, h, b, fg, bg); /* Start out selecting No events */ XSelectInput(Metadpy->dpy, xid, 0L); /*** Prepare the new infowin ***/ /* Mark it as nukable */ Infowin->nuke = 1; /* Attempt to Initialize the infowin */ return (Infowin_prepare(xid)); } /* * Modify the event mask of an Infowin */ static errr Infowin_set_mask(long mask) { /* Save the new setting */ Infowin->mask = mask; /* Execute the Mapping */ XSelectInput(Metadpy->dpy, Infowin->win, Infowin->mask); /* Success */ return (0); } /* * Request that Infowin be mapped */ static errr Infowin_map(void) { /* Execute the Mapping */ XMapWindow(Metadpy->dpy, Infowin->win); /* Success */ return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Request that Infowin be unmapped */ static errr Infowin_unmap(void) { /* Execute the Un-Mapping */ XUnmapWindow(Metadpy->dpy, Infowin->win); /* Success */ return (0); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Request that Infowin be raised */ static errr Infowin_raise(void) { /* Raise towards visibility */ XRaiseWindow(Metadpy->dpy, Infowin->win); /* Success */ return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Request that Infowin be lowered */ static errr Infowin_lower(void) { /* Lower towards invisibility */ XLowerWindow(Metadpy->dpy, Infowin->win); /* Success */ return (0); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Request that Infowin be moved to a new location */ static errr Infowin_impell(int x, int y) { /* Execute the request */ XMoveWindow(Metadpy->dpy, Infowin->win, x, y); /* Success */ return (0); } /* * Resize an infowin */ static errr Infowin_resize(int w, int h) { /* Execute the request */ XResizeWindow(Metadpy->dpy, Infowin->win, w, h); /* Success */ return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Move and Resize an infowin */ static errr Infowin_locate(int x, int y, int w, int h) { /* Execute the request */ XMoveResizeWindow(Metadpy->dpy, Infowin->win, x, y, w, h); /* Success */ return (0); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Visually clear Infowin */ static errr Infowin_wipe(void) { /* Execute the request */ XClearWindow(Metadpy->dpy, Infowin->win); /* Success */ return (0); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Visually Paint Infowin with the current color */ static errr Infowin_fill(void) { /* Execute the request */ XFillRectangle(Metadpy->dpy, Infowin->win, Infoclr->gc, 0, 0, Infowin->w, Infowin->h); /* Success */ return (0); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * A NULL terminated pair list of legal "operation names" * * Pairs of values, first is texttual name, second is the string * holding the decimal value that the operation corresponds to. */ static const char *opcode_pairs[] = { "cpy", "3", "xor", "6", "and", "1", "ior", "7", "nor", "8", "inv", "10", "clr", "0", "set", "15", "src", "3", "dst", "5", "+andReverse", "2", "+andInverted", "4", "+noop", "5", "+equiv", "9", "+orReverse", "11", "+copyInverted", "12", "+orInverted", "13", "+nand", "14", NULL }; /* * Parse a word into an operation "code" * * Inputs: * str: A string, hopefully representing an Operation * * Output: * 0-15: if 'str' is a valid Operation * -1: if 'str' could not be parsed */ static int Infoclr_Opcode(const char *str) { register int i; /* Scan through all legal operation names */ for (i = 0; opcode_pairs[i*2]; ++i) { /* Is this the right oprname? */ if (streq(opcode_pairs[i*2], str)) { /* Convert the second element in the pair into a Code */ return (atoi(opcode_pairs[i*2+1])); } } /* The code was not found, return -1 */ return (-1); } #ifndef IGNORE_UNUSED_FUNCTIONS /* * Request a Pixell by name. Note: uses 'Metadpy'. * * Inputs: * name: The name of the color to try to load (see below) * * Output: * The Pixell value that metched the given name * 'Metadpy->fg' if the name was unparseable * * Valid forms for 'name': * 'fg', 'bg', 'zg', '' and '#' */ static Pixell Infoclr_Pixell(const char *name) { XColor scrn; /* Attempt to Parse the name */ if (name && name[0]) { /* The 'bg' color is available */ if (streq(name, "bg")) return (Metadpy->bg); /* The 'fg' color is available */ if (streq(name, "fg")) return (Metadpy->fg); /* The 'zg' color is available */ if (streq(name, "zg")) return (Metadpy->zg); /* The 'white' color is available */ if (streq(name, "white")) return (Metadpy->white); /* The 'black' color is available */ if (streq(name, "black")) return (Metadpy->black); /* Attempt to parse 'name' into 'scrn' */ if (!(XParseColor(Metadpy->dpy, Metadpy->cmap, name, &scrn))) { plog_fmt("Warning: Couldn't parse color '%s'\n", name); } /* Attempt to Allocate the Parsed color */ if (!(XAllocColor(Metadpy->dpy, Metadpy->cmap, &scrn))) { plog_fmt("Warning: Couldn't allocate color '%s'\n", name); } /* The Pixel was Allocated correctly */ else return (scrn.pixel); } /* Warn about the Default being Used */ plog_fmt("Warning: Using 'fg' for unknown color '%s'\n", name); /* Default to the 'Foreground' color */ return (Metadpy->fg); } /* * Initialize a new 'infoclr' with a real GC. */ static errr Infoclr_init_1(GC gc) { infoclr *iclr = Infoclr; /* Wipe the iclr clean */ (void)WIPE(iclr, infoclr); /* Assign the GC */ iclr->gc = gc; /* Success */ return (0); } #endif /* IGNORE_UNUSED_FUNCTIONS */ /* * Nuke an old 'infoclr'. */ static errr Infoclr_nuke(void) { infoclr *iclr = Infoclr; /* Deal with 'GC' */ if (iclr->nuke) { /* Free the GC */ XFreeGC(Metadpy->dpy, iclr->gc); } /* Forget the current */ Infoclr = (infoclr*)(NULL); /* Success */ return (0); } /* * Initialize an infoclr with some data * * Inputs: * fg: The Pixell for the requested Foreground (see above) * bg: The Pixell for the requested Background (see above) * op: The Opcode for the requested Operation (see above) * stip: The stipple mode */ static errr Infoclr_init_data(Pixell fg, Pixell bg, int op, int stip) { infoclr *iclr = Infoclr; GC gc; XGCValues gcv; unsigned long gc_mask; /*** Simple error checking of opr and clr ***/ /* Check the 'Pixells' for realism */ if (bg > Metadpy->zg) return (-1); if (fg > Metadpy->zg) return (-1); /* Check the data for trueness */ if ((op < 0) || (op > 15)) return (-1); /*** Create the requested 'GC' ***/ /* Assign the proper GC function */ gcv.function = op; /* Assign the proper GC background */ gcv.background = bg; /* Assign the proper GC foreground */ gcv.foreground = fg; /* Hack -- Handle XOR (xor is code 6) by hacking bg and fg */ if (op == 6) gcv.background = 0; if (op == 6) gcv.foreground = (bg ^ fg); /* Assign the proper GC Fill Style */ gcv.fill_style = (stip ? FillStippled : FillSolid); /* Turn off 'Give exposure events for pixmap copying' */ gcv.graphics_exposures = False; /* Set up the GC mask */ gc_mask = (GCFunction | GCBackground | GCForeground | GCFillStyle | GCGraphicsExposures); /* Create the GC detailed above */ gc = XCreateGC(Metadpy->dpy, Metadpy->root, gc_mask, &gcv); /*** Initialize ***/ /* Wipe the iclr clean */ (void)WIPE(iclr, infoclr); /* Assign the GC */ iclr->gc = gc; /* Nuke it when done */ iclr->nuke = 1; /* Assign the parms */ iclr->fg = fg; iclr->bg = bg; iclr->code = op; iclr->stip = stip ? 1 : 0; /* Success */ return (0); } /* * Change the 'fg' for an infoclr * * Inputs: * fg: The Pixell for the requested Foreground (see above) */ static errr Infoclr_change_fg(Pixell fg) { infoclr *iclr = Infoclr; /*** Simple error checking of opr and clr ***/ /* Check the 'Pixells' for realism */ if (fg > Metadpy->zg) return (-1); /*** Change ***/ /* Change */ XSetForeground(Metadpy->dpy, iclr->gc, fg); /* Success */ return (0); } /* * Nuke an old 'infofnt'. */ static errr Infofnt_nuke(void) { infofnt *ifnt = Infofnt; /* Deal with 'name' */ if (ifnt->name) { /* Free the name */ string_free((void *) ifnt->name); } /* Nuke info if needed */ if (ifnt->nuke) { /* Free the font */ XFreeFontSet(Metadpy->dpy, ifnt->fs); } /* Success */ return (0); } /* * Prepare a new 'infofnt' */ static errr Infofnt_prepare(XFontSet fs) { infofnt *ifnt = Infofnt; int font_count, i; XFontSetExtents *extents; XFontStruct **fonts; char **names; /* Assign the struct */ ifnt->fs = fs; extents = XExtentsOfFontSet(fs); font_count = XFontsOfFontSet(fs, &fonts, &names); ifnt->asc = 0; for (i = 0; i < font_count; i++, fonts++) if (ifnt->asc < (*fonts)->ascent) ifnt->asc = (*fonts)->ascent; /* Extract default sizing info */ ifnt->hgt = extents->max_logical_extent.height; ifnt->wid = extents->max_logical_extent.width; ifnt->twid = extents->max_logical_extent.width; /* Success */ return (0); } /* * Init an infofnt by its Name * * Inputs: * name: The name of the requested Font */ static errr Infofnt_init_data(const char *name) { XFontSet fs; char **missing; int missing_count; /*** Load the info Fresh, using the name ***/ /* If the name is not given, report an error */ if (!name) return (-1); fs = XCreateFontSet(Metadpy->dpy, name, &missing, &missing_count, NULL); /* The load failed, try to recover */ if (!fs) return (-1); if (missing_count) XFreeStringList(missing); /*** Init the font ***/ /* Wipe the thing */ (void)WIPE(Infofnt, infofnt); /* Attempt to prepare it */ if (Infofnt_prepare(fs)) { /* Free the font */ XFreeFontSet(Metadpy->dpy, fs); /* Fail */ return (-1); } /* Save a copy of the font name */ Infofnt->name = string_make(name); /* Mark it as nukable */ Infofnt->nuke = 1; /* HACK - force all fonts to be printed character by character */ Infofnt->mono = 1; /* Success */ return (0); } /* * Standard Text */ static errr Infofnt_text_std(int x, int y, const wchar_t *str, int len) { int i; int w, h; term_data *td = (term_data*)(Term->data); /*** Do a brief info analysis ***/ /* Do nothing if the string is null */ if (!str || !*str) return (-1); /* Get the length of the string */ if (len < 0) len = wcslen(str); /*** Decide where to place the string, vertically ***/ /* Ignore Vertical Justifications */ y = (y * td->tile_hgt) + Infowin->oy; /*** Decide where to place the string, horizontally ***/ /* Line up with x at left edge of column 'x' */ x = (x * td->tile_wid) + Infowin->ox; /*** Erase the background ***/ /* The total width will be 'len' chars * standard width */ w = len * td->tile_wid; /* Simply do 'td->tile_hgt' (a single row) high */ h = td->tile_hgt; /* Fill the background */ XFillRectangle(Metadpy->dpy, Infowin->win, clr[TERM_DARK]->gc, x, y, w, h); /*** Actually draw 'str' onto the infowin ***/ y += Infofnt->asc; /*** Handle the fake mono we can enforce on fonts ***/ /* Monotize the font */ if (Infofnt->mono) { /* Do each character */ for (i = 0; i < len; ++i) { /* Note that the Infoclr is set up to contain the Infofnt */ XwcDrawImageString(Metadpy->dpy, Infowin->win, Infofnt->fs, Infoclr->gc, x + i * td->tile_wid + Infofnt->off, y, str + i, 1); } } /* Assume monospaced font */ else { /* Note that the Infoclr is set up to contain the Infofnt */ XwcDrawImageString(Metadpy->dpy, Infowin->win, Infofnt->fs, Infoclr->gc, x, y, str, len); } /* Success */ return (0); } /* * Painting where text would be */ static errr Infofnt_text_non(int x, int y, const wchar_t *str, int len) { int w, h; term_data *td = (term_data*)(Term->data); /*** Find the width ***/ /* Negative length is a flag to count the characters in str */ if (len < 0) len = wcslen(str); /* The total width will be 'len' chars * standard width */ w = len * td->tile_wid; /*** Find the X dimensions ***/ /* Line up with x at left edge of column 'x' */ x = x * td->tile_wid + Infowin->ox; /*** Find other dimensions ***/ /* Simply do 'td->tile_hgt' (a single row) high */ h = td->tile_hgt; /* Simply do "at top" in row 'y' */ y = y * h + Infowin->oy; /*** Actually 'paint' the area ***/ /* Just do a Fill Rectangle */ XFillRectangle(Metadpy->dpy, Infowin->win, Infoclr->gc, x, y, w, h); /* Success */ return (0); } /*************************************************************************/ /* * Angband specific code follows... (ANGBAND) */ /* * Hack -- cursor color */ static infoclr *xor; /* * Color info (unused, red, green, blue). */ static byte color_table_x11[MAX_COLORS][4]; /* * The number of term data structures */ #define MAX_TERM_DATA 8 /* * The array of term data structures */ static term_data data[MAX_TERM_DATA]; /* * Path to the X11 settings file */ static const char *x11_prefs = "x11-settings.prf"; static char settings[1024]; /* * Remember the number of terminal windows open */ static int term_windows_open; /* * Process a keypress event */ static void react_keypress(XKeyEvent *ev) { int n, ch = 0; metadpy *m = Metadpy; KeySym ks; char buf[128]; /* Extract "modifier flags" */ int mc = (ev->state & ControlMask) ? TRUE : FALSE; int ms = (ev->state & ShiftMask) ? TRUE : FALSE; int mo = (ev->state & m->alt_mask) ? TRUE : FALSE; int mx = (ev->state & m->super_mask) ? TRUE : FALSE; int kp = FALSE; byte mods = (mo ? KC_MOD_ALT : 0) | (mx ? KC_MOD_META : 0); /* Check for "normal" keypresses */ n = XLookupString(ev, buf, 125, &ks, NULL); buf[n] = '\0'; /* Ignore modifier keys by themselves */ if (IsModifierKey(ks)) return; switch (ks) { case XK_BackSpace: ch = KC_BACKSPACE; break; case XK_Tab: ch = KC_TAB; break; case XK_Return: ch = KC_ENTER; break; case XK_Escape: ch = ESCAPE; break; case XK_Delete: ch = KC_DELETE; break; case XK_Home: ch = KC_HOME; break; case XK_Left: ch = ARROW_LEFT; break; case XK_Up: ch = ARROW_UP; break; case XK_Right: ch = ARROW_RIGHT; break; case XK_Down: ch = ARROW_DOWN; break; case XK_Page_Up: ch = KC_PGUP; break; case XK_Page_Down: ch = KC_PGDOWN; break; case XK_End: ch = KC_END; break; case XK_Insert: ch = KC_INSERT; break; case XK_Pause: ch = KC_PAUSE; break; case XK_Break: ch = KC_BREAK; break; /* keypad */ case XK_KP_0: ch = '0'; kp = TRUE; break; case XK_KP_1: ch = '1'; kp = TRUE; break; case XK_KP_2: ch = '2'; kp = TRUE; break; case XK_KP_3: ch = '3'; kp = TRUE; break; case XK_KP_4: ch = '4'; kp = TRUE; break; case XK_KP_5: ch = '5'; kp = TRUE; break; case XK_KP_6: ch = '6'; kp = TRUE; break; case XK_KP_7: ch = '7'; kp = TRUE; break; case XK_KP_8: ch = '8'; kp = TRUE; break; case XK_KP_9: ch = '9'; kp = TRUE; break; case XK_KP_Decimal: ch = '.'; kp = TRUE; break; case XK_KP_Divide: ch = '/'; kp = TRUE; break; case XK_KP_Multiply: ch = '*'; kp = TRUE; break; case XK_KP_Subtract: ch = '-'; kp = TRUE; break; case XK_KP_Add: ch = '+'; kp = TRUE; break; case XK_KP_Enter: ch = KC_ENTER; kp = TRUE; break; case XK_KP_Equal: ch = '='; kp = TRUE; break; case XK_KP_Delete: ch = KC_DELETE; kp = TRUE; break; case XK_KP_Home: ch = KC_HOME; kp = TRUE; break; case XK_KP_Left: ch = ARROW_LEFT; kp = TRUE; break; case XK_KP_Up: ch = ARROW_UP; kp = TRUE; break; case XK_KP_Right: ch = ARROW_RIGHT; kp = TRUE; break; case XK_KP_Down: ch = ARROW_DOWN; kp = TRUE; break; case XK_KP_Page_Up: ch = KC_PGUP; kp = TRUE; break; case XK_KP_Page_Down: ch = KC_PGDOWN; kp = TRUE; break; case XK_KP_End: ch = KC_END; kp = TRUE; break; case XK_KP_Insert: ch = KC_INSERT; kp = TRUE; break; case XK_KP_Begin: ch = KC_BEGIN; kp = TRUE; break; case XK_F1: ch = KC_F1; break; case XK_F2: ch = KC_F2; break; case XK_F3: ch = KC_F3; break; case XK_F4: ch = KC_F4; break; case XK_F5: ch = KC_F5; break; case XK_F6: ch = KC_F6; break; case XK_F7: ch = KC_F7; break; case XK_F8: ch = KC_F8; break; case XK_F9: ch = KC_F9; break; case XK_F10: ch = KC_F10; break; case XK_F11: ch = KC_F11; break; case XK_F12: ch = KC_F12; break; case XK_F13: ch = KC_F13; break; case XK_F14: ch = KC_F14; break; case XK_F15: ch = KC_F15; break; } if (kp) mods |= KC_MOD_KEYPAD; if (ch) { if (mc) mods |= KC_MOD_CONTROL; if (ms) mods |= KC_MOD_SHIFT; Term_keypress(ch, mods); return; } else if (n && !IsSpecialKey(ks)) { keycode_t code = buf[0]; if (mc && MODS_INCLUDE_CONTROL(code)) mods |= KC_MOD_CONTROL; if (ms && MODS_INCLUDE_SHIFT(code)) mods |= KC_MOD_SHIFT; Term_keypress(code, mods); } } /* * Find the square a particular pixel is part of. */ static void pixel_to_square(int * const x, int * const y, const int ox, const int oy) { term_data *td = (term_data*)(Term->data); (*x) = (ox - Infowin->ox) / td->tile_wid; (*y) = (oy - Infowin->oy) / td->tile_hgt; } /* * Process events */ static errr CheckEvent(bool wait) { term_data *old_td = (term_data*)(Term->data); XEvent xev_body, *xev = &xev_body; term_data *td = NULL; infowin *iwin = NULL; int i; int window = 0; /* Do not wait unless requested */ if (!wait && !XPending(Metadpy->dpy)) return (1); /* Wait in 0.02s increments while updating animations every 0.2s */ i = 0; while (!XPending(Metadpy->dpy)) { if (i == 0) idle_update(); usleep(20000); i = (i + 1) % 10; } /* Load the Event */ XNextEvent(Metadpy->dpy, xev); /* Notice new keymaps */ if (xev->type == MappingNotify) { XRefreshKeyboardMapping(&xev->xmapping); return 0; } /* Scan the windows */ for (i = 0; i < MAX_TERM_DATA; i++) { if (xev->xany.window == data[i].win->win) { td = &data[i]; iwin = td->win; window = i; break; } } /* Unknown window */ if (!td || !iwin) return (0); /* Hack -- activate the Term */ Term_activate(&td->t); /* Hack -- activate the window */ Infowin_set(iwin); /* Switch on the Type */ switch (xev->type) { case ButtonPress: { bool press = (xev->type == ButtonPress); int z = 0; /* Where is the mouse */ int x = xev->xbutton.x; int y = xev->xbutton.y; /* Which button is involved */ if (xev->xbutton.button == Button1) z = 1; else if (xev->xbutton.button == Button2) z = 2; else if (xev->xbutton.button == Button3) z = 3; else if (xev->xbutton.button == Button4) z = 4; else if (xev->xbutton.button == Button5) z = 5; else z = 0; /* The co-ordinates are only used in Angband format. */ pixel_to_square(&x, &y, x, y); if (press) Term_mousepress(x, y, z); break; } case KeyPress: { /* Hack -- use "old" term */ Term_activate(&old_td->t); /* Process the key */ react_keypress(&(xev->xkey)); break; } case Expose: { int x1, x2, y1, y2; x1 = (xev->xexpose.x - Infowin->ox) / td->tile_wid; x2 = (xev->xexpose.x + xev->xexpose.width - Infowin->ox) / td->tile_wid; y1 = (xev->xexpose.y - Infowin->oy) / td->tile_hgt; y2 = (xev->xexpose.y + xev->xexpose.height - Infowin->oy) / td->tile_hgt; Term_redraw_section(x1, y1, x2, y2); break; } case MapNotify: { Infowin->mapped = 1; Term->mapped_flag = TRUE; break; } case UnmapNotify: { Infowin->mapped = 0; Term->mapped_flag = FALSE; break; } /* Move and/or Resize */ case ConfigureNotify: { int cols, rows, wid, hgt, force_resize; int ox = Infowin->ox; int oy = Infowin->oy; /* Save the new Window Parms */ Infowin->x = xev->xconfigure.x; Infowin->y = xev->xconfigure.y; Infowin->w = xev->xconfigure.width; Infowin->h = xev->xconfigure.height; /* Determine "proper" number of rows/cols */ cols = ((Infowin->w - (ox + ox)) / td->tile_wid); rows = ((Infowin->h - (oy + oy)) / td->tile_hgt); /* Hack -- minimal size */ if (cols < 1) cols = 1; if (rows < 1) rows = 1; if (window == 0) { /* Hack the main window must be at least 80x24 */ force_resize = FALSE; if (cols < 80) { cols = 80; force_resize = TRUE; } if (rows < 24) { rows = 24; force_resize = TRUE; } /* Resize the windows if any "change" is needed */ if (force_resize) { /* Desired size of window */ wid = cols * td->tile_wid + (ox + ox); hgt = rows * td->tile_hgt + (oy + oy); /* Resize window */ Infowin_set(td->win); Infowin_resize(wid, hgt); } } /* Resize the Term (if needed) */ (void)Term_resize(cols, rows); break; } } /* Hack -- Activate the old term */ Term_activate(&old_td->t); /* Hack -- Activate the proper window */ Infowin_set(old_td->win); /* Success */ return (0); } /* * Handle "activation" of a term */ static errr Term_xtra_x11_level(int v) { term_data *td = (term_data*)(Term->data); /* Handle "activate" */ if (v) { /* Activate the window */ Infowin_set(td->win); /* Activate the font */ Infofnt_set(td->fnt); } /* Success */ return (0); } /* * React to changes */ static errr Term_xtra_x11_react(void) { int i; if (Metadpy->color) { /* Check the colors */ for (i = 0; i < MAX_COLORS; i++) { if ((color_table_x11[i][0] != angband_color_table[i][0]) || (color_table_x11[i][1] != angband_color_table[i][1]) || (color_table_x11[i][2] != angband_color_table[i][2]) || (color_table_x11[i][3] != angband_color_table[i][3])) { Pixell pixel; /* Save new values */ color_table_x11[i][0] = angband_color_table[i][0]; color_table_x11[i][1] = angband_color_table[i][1]; color_table_x11[i][2] = angband_color_table[i][2]; color_table_x11[i][3] = angband_color_table[i][3]; /* Create pixel */ pixel = create_pixel(Metadpy->dpy, color_table_x11[i][1], color_table_x11[i][2], color_table_x11[i][3]); /* Change the foreground */ Infoclr_set(clr[i]); Infoclr_change_fg(pixel); } } } /* Success */ return (0); } /* * Handle a "special request" */ static errr Term_xtra_x11(int n, int v) { /* Handle a subset of the legal requests */ switch (n) { /* Make a noise */ case TERM_XTRA_NOISE: Metadpy_do_beep(); return (0); /* Flush the output XXX XXX */ case TERM_XTRA_FRESH: Metadpy_update(1, 0, 0); return (0); /* Process random events XXX */ case TERM_XTRA_BORED: return (CheckEvent(0)); /* Process Events XXX */ case TERM_XTRA_EVENT: return (CheckEvent(v)); /* Flush the events XXX */ case TERM_XTRA_FLUSH: while (!CheckEvent(FALSE)); return (0); /* Handle change in the "level" */ case TERM_XTRA_LEVEL: return (Term_xtra_x11_level(v)); /* Clear the screen */ case TERM_XTRA_CLEAR: Infowin_wipe(); return (0); /* Delay for some milliseconds */ case TERM_XTRA_DELAY: if (v > 0) usleep(1000 * v); return (0); /* React to changes */ case TERM_XTRA_REACT: return (Term_xtra_x11_react()); } /* Unknown */ return (1); } /* * Draw the cursor as a rectangular outline */ static errr Term_curs_x11(int x, int y) { term_data *td = (term_data*)(Term->data); XDrawRectangle(Metadpy->dpy, Infowin->win, xor->gc, x * td->tile_wid + Infowin->ox, y * td->tile_hgt + Infowin->oy, td->tile_wid - 1, td->tile_hgt - 1); /* Success */ return (0); } /* * Draw the double width cursor as a rectangular outline */ static errr Term_bigcurs_x11(int x, int y) { term_data *td = (term_data*)(Term->data); XDrawRectangle(Metadpy->dpy, Infowin->win, xor->gc, x * td->tile_wid + Infowin->ox, y * td->tile_hgt + Infowin->oy, td->tile_wid2 - 1, td->tile_hgt - 1); /* Success */ return (0); } /* * Erase some characters. */ static errr Term_wipe_x11(int x, int y, int n) { /* Erase (use black) */ Infoclr_set(clr[TERM_DARK]); /* Mega-Hack -- Erase some space */ Infofnt_text_non(x, y, L"", n); /* Success */ return (0); } /* * Draw some textual characters. */ static errr Term_text_x11(int x, int y, int n, int a, const wchar_t *s) { /* Draw the text */ Infoclr_set(clr[a]); /* Draw the text */ Infofnt_text_std(x, y, s, n); /* Success */ return (0); } static void save_prefs(void) { ang_file *fff; int i; /* Open the settings file */ fff = file_open(settings, MODE_WRITE, FTYPE_TEXT); if (!fff) return; /* Header */ file_putf(fff, "# %s X11 settings\n\n", VERSION_NAME); /* Number of term windows to open */ file_putf(fff, "TERM_WINS=%d\n\n", term_windows_open); /* Save window prefs */ for (i = 0; i < MAX_TERM_DATA; i++) { term_data *td = &data[i]; if (!td->t.mapped_flag) continue; /* Header */ file_putf(fff, "# Term %d\n", i); /* * This doesn't seem to work under various WMs * since the decoration messes the position up * * Hack -- Use saved window positions. * This means that we won't remember ingame repositioned * windows, but also means that WMs won't screw predefined * positions up. -CJN- */ /* Window specific location (x) */ file_putf(fff, "AT_X_%d=%d\n", i, td->win->x_save); /* Window specific location (y) */ file_putf(fff, "AT_Y_%d=%d\n", i, td->win->y_save); /* Window specific cols */ file_putf(fff, "COLS_%d=%d\n", i, td->t.wid); /* Window specific rows */ file_putf(fff, "ROWS_%d=%d\n", i, td->t.hgt); /* Window specific inner border offset (ox) */ file_putf(fff, "IBOX_%d=%d\n", i, td->win->ox); /* Window specific inner border offset (oy) */ file_putf(fff, "IBOY_%d=%d\n", i, td->win->oy); /* Window specific font name */ file_putf(fff, "FONT_%d=%s\n", i, td->fnt->name); /* Window specific tile width */ file_putf(fff, "TILE_WIDTH_%d=%d\n", i, td->tile_wid); /* Window specific tile height */ file_putf(fff, "TILE_HEIGHT_%d=%d\n", i, td->tile_hgt); /* Footer */ file_putf(fff, "\n"); } /* Close */ file_close(fff); } /* * Initialize a term_data */ static errr term_data_init(term_data *td, int i) { term *t = &td->t; const char *name = angband_term_name[i]; const char *font; int x = 0; int y = 0; int cols = 80; int rows = 24; int ox = 1; int oy = 1; int wid, hgt, num; const char *str; int val; XClassHint *ch; char res_name[20]; char res_class[20]; XSizeHints *sh; ang_file *fff; char buf[1024]; char cmd[40]; char font_name[256]; int line = 0; /* Get default font for this term */ font = get_default_font(i); /* Open the file */ fff = file_open(settings, MODE_READ, FTYPE_TEXT); /* File exists */ if (fff) { /* Process the file */ while (file_getl(fff, buf, sizeof(buf))) { /* Count lines */ line++; /* Skip "empty" lines */ if (!buf[0]) continue; /* Skip "blank" lines */ if (isspace((unsigned char)buf[0])) continue; /* Skip comments */ if (buf[0] == '#') continue; /* Window specific location (x) */ strnfmt(cmd, sizeof(cmd), "AT_X_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); x = (str != NULL) ? atoi(str + 1) : -1; continue; } /* Window specific location (y) */ strnfmt(cmd, sizeof(cmd), "AT_Y_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); y = (str != NULL) ? atoi(str + 1) : -1; continue; } /* Window specific cols */ strnfmt(cmd, sizeof(cmd), "COLS_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) cols = val; continue; } /* Window specific rows */ strnfmt(cmd, sizeof(cmd), "ROWS_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) rows = val; continue; } /* Window specific inner border offset (ox) */ strnfmt(cmd, sizeof(cmd), "IBOX_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) ox = val; continue; } /* Window specific inner border offset (oy) */ strnfmt(cmd, sizeof(cmd), "IBOY_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) oy = val; continue; } /* Window specific font name */ strnfmt(cmd, sizeof(cmd), "FONT_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); if (str != NULL) { my_strcpy(font_name, str + 1, sizeof(font_name)); font = font_name; } continue; } /* Window specific tile width */ strnfmt(cmd, sizeof(cmd), "TILE_WIDTH_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) td->tile_wid = val; continue; } /* Window specific tile height */ strnfmt(cmd, sizeof(cmd), "TILE_HEIGHT_%d", i); if (prefix(buf, cmd)) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) td->tile_hgt = val; continue; } } /* Close */ file_close(fff); } /* * Env-vars overwrite the settings in the settings file */ /* Window specific location (x) */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_AT_X_%d", i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val > 0) x = val; /* Window specific location (y) */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_AT_Y_%d", i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val > 0) y = val; /* Window specific cols */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_COLS_%d", i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val > 0) cols = val; /* Window specific rows */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_ROWS_%d", i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val > 0) rows = val; /* Window specific inner border offset (ox) */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_IBOX_%d", i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val > 0) ox = val; /* Window specific inner border offset (oy) */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_IBOY_%d", i); str = getenv(buf); val = (str != NULL) ? atoi(str) : -1; if (val > 0) oy = val; /* Window specific font name */ strnfmt(buf, sizeof(buf), "ANGBAND_X11_FONT_%d", i); str = getenv(buf); if (str) font = str; /* Hack the main window must be at least 80x24 */ if (!i) { if (cols < 80) cols = 80; if (rows < 24) rows = 24; } /* Prepare the standard font */ td->fnt = ZNEW(infofnt); Infofnt_set(td->fnt); if (Infofnt_init_data(font)) quit_fmt("Couldn't load the requested font. (%s)", font); /* Use proper tile size */ if (td->tile_wid <= 0) td->tile_wid = td->fnt->twid; if (td->tile_hgt <= 0) td->tile_hgt = td->fnt->hgt; /* Don't allow bigtile mode - one day maybe NRM */ td->tile_wid2 = td->tile_wid; /* Hack -- key buffer size */ num = ((i == 0) ? 1024 : 16); /* Assume full size windows */ wid = cols * td->tile_wid + (ox + ox); hgt = rows * td->tile_hgt + (oy + oy); /* Create a top-window */ td->win = ZNEW(infowin); Infowin_set(td->win); Infowin_init_top(x, y, wid, hgt, 0, Metadpy->fg, Metadpy->bg); /* Ask for certain events */ Infowin_set_mask(ExposureMask | StructureNotifyMask | KeyPressMask | ButtonPressMask); /* Set the window name */ Infowin_set_name(name); /* Save the inner border */ Infowin->ox = ox; Infowin->oy = oy; /* Make Class Hints */ ch = XAllocClassHint(); if (ch == NULL) quit("XAllocClassHint failed"); my_strcpy(res_name, name, sizeof(res_name)); res_name[0] = tolower((unsigned char)res_name[0]); ch->res_name = res_name; my_strcpy(res_class, "Angband", sizeof(res_class)); ch->res_class = res_class; XSetClassHint(Metadpy->dpy, Infowin->win, ch); /* Make Size Hints */ sh = XAllocSizeHints(); /* Oops */ if (sh == NULL) quit("XAllocSizeHints failed"); if (x || y) sh->flags = USPosition; else sh->flags = 0; /* Main window has a differing minimum size */ if (i == 0) { /* Main window min size is 80x24 */ sh->flags |= (PMinSize | PMaxSize); sh->min_width = 80 * td->tile_wid + (ox + ox); sh->min_height = 24 * td->tile_hgt + (oy + oy); sh->max_width = 255 * td->tile_wid + (ox + ox); sh->max_height = 255 * td->tile_hgt + (oy + oy); } /* Other windows can be shrunk to 1x1 */ else { /* Other windows */ sh->flags |= (PMinSize | PMaxSize); sh->min_width = td->tile_wid + (ox + ox); sh->min_height = td->tile_hgt + (oy + oy); sh->max_width = 255 * td->tile_wid + (ox + ox); sh->max_height = 255 * td->tile_hgt + (oy + oy); } /* Resize increment */ sh->flags |= PResizeInc; sh->width_inc = td->tile_wid; sh->height_inc = td->tile_hgt; /* Base window size */ sh->flags |= PBaseSize; sh->base_width = (ox + ox); sh->base_height = (oy + oy); /* Use the size hints */ XSetWMNormalHints(Metadpy->dpy, Infowin->win, sh); /* Map the window */ Infowin_map(); /* Set pointers to allocated data */ td->sizeh = sh; td->classh = ch; /* Move the window to requested location */ if ((x >= 0) && (y >= 0)) Infowin_impell(x, y); /* Initialize the term */ term_init(t, cols, rows, num); /* Use a "soft" cursor */ t->soft_cursor = TRUE; /* Erase with "white space" */ t->attr_blank = TERM_WHITE; t->char_blank = ' '; /* Differentiate between BS/^h, Tab/^i, etc. */ t->complex_input = TRUE; /* Hooks */ t->xtra_hook = Term_xtra_x11; t->curs_hook = Term_curs_x11; t->bigcurs_hook = Term_bigcurs_x11; t->wipe_hook = Term_wipe_x11; t->text_hook = Term_text_x11; /* Save the data */ t->data = td; /* Activate (important) */ Term_activate(t); /* Success */ return (0); } const char help_x11[] = "Basic X11, subopts -d -n -x"; static void hook_quit(const char *str) { int i; /* Unused */ (void)str; save_prefs(); /* Free allocated data */ for (i = 0; i < term_windows_open; i++) { term_data *td = &data[i]; term *t = &td->t; /* Free size hints */ XFree(td->sizeh); /* Free class hints */ XFree(td->classh); /* Free fonts */ Infofnt_set(td->fnt); (void)Infofnt_nuke(); FREE(td->fnt); /* Free window */ Infowin_set(td->win); (void)Infowin_nuke(); FREE(td->win); /* Free term */ (void)term_nuke(t); } /* Free colors */ Infoclr_set(xor); (void)Infoclr_nuke(); FREE(xor); for (i = 0; i < MAX_COLORS; ++i) { Infoclr_set(clr[i]); (void)Infoclr_nuke(); FREE(clr[i]); } /* Close link to display */ (void)Metadpy_nuke(); } /* * Initialization function for an "X11" module to Angband */ errr init_x11(int argc, char **argv) { int i; const char *dpy_name = ""; int num_term = -1; ang_file *fff; char buf[1024]; const char *str; int val; int line = 0; /* Parse args */ for (i = 1; i < argc; i++) { if (prefix(argv[i], "-d")) { dpy_name = &argv[i][2]; continue; } if (prefix(argv[i], "-n")) { num_term = atoi(&argv[i][2]); if (num_term > MAX_TERM_DATA) num_term = MAX_TERM_DATA; else if (num_term < 1) num_term = 1; continue; } if (prefix(argv[i], "-x")) { x11_prefs = argv[i] + 2; continue; } plog_fmt("Ignoring option: %s", argv[i]); } if (num_term == -1) { num_term = 1; /* Build the filename */ (void)path_build(settings, sizeof(settings), ANGBAND_DIR_USER, "x11-settings.prf"); /* Open the file */ fff = file_open(settings, MODE_READ, FTYPE_TEXT); /* File exists */ if (fff) { /* Process the file */ while (file_getl(fff, buf, sizeof(buf))) { /* Count lines */ line++; /* Skip "empty" lines */ if (!buf[0]) continue; /* Skip "blank" lines */ if (isspace((unsigned char)buf[0])) continue; /* Skip comments */ if (buf[0] == '#') continue; /* Number of terminal windows */ if (prefix(buf, "TERM_WINS")) { str = strstr(buf, "="); val = (str != NULL) ? atoi(str + 1) : -1; if (val > 0) num_term = val; continue; } } /* Close */ (void)file_close(fff); } } /* Init the Metadpy if possible */ if (Metadpy_init_name(dpy_name)) return (-1); /* Remember the number of terminal windows */ term_windows_open = num_term; /* Prepare cursor color */ xor = ZNEW(infoclr); Infoclr_set(xor); Infoclr_init_ppn(Metadpy->fg, Metadpy->bg, "xor", 0); /* Prepare normal colors */ for (i = 0; i < MAX_COLORS * BG_MAX; ++i) { Pixell pixel; clr[i] = ZNEW(infoclr); Infoclr_set(clr[i]); /* Acquire Angband colors */ color_table_x11[i % MAX_COLORS][0] = angband_color_table[i % MAX_COLORS][0]; color_table_x11[i % MAX_COLORS][1] = angband_color_table[i % MAX_COLORS][1]; color_table_x11[i % MAX_COLORS][2] = angband_color_table[i % MAX_COLORS][2]; color_table_x11[i % MAX_COLORS][3] = angband_color_table[i % MAX_COLORS][3]; /* Default to monochrome */ pixel = ((i == 0) ? Metadpy->bg : Metadpy->fg); /* Handle color This block of code has added support for background colours (from Sil) */ if (Metadpy->color) { Pixell backpixel; /* Create pixel */ pixel = create_pixel(Metadpy->dpy, color_table_x11[i % MAX_COLORS][1], color_table_x11[i % MAX_COLORS][2], color_table_x11[i % MAX_COLORS][3]); switch (i / MAX_COLORS) { case BG_BLACK: /* Default Background */ Infoclr_init_ppn(pixel, Metadpy->bg, "cpy", 0); break; case BG_SAME: /* Background same as foreground*/ backpixel = create_pixel(Metadpy->dpy, color_table_x11[i % MAX_COLORS][1], color_table_x11[i % MAX_COLORS][2], color_table_x11[i % MAX_COLORS][3]); Infoclr_init_ppn(pixel, backpixel, "cpy", 0); break; case BG_DARK: /* Highlight Background */ backpixel = create_pixel(Metadpy->dpy, color_table_x11[TERM_SHADE][1], color_table_x11[TERM_SHADE][2], color_table_x11[TERM_SHADE][3]); Infoclr_init_ppn(pixel, backpixel, "cpy", 0); break; } } /* Handle monochrome */ else { /* Initialize the color */ Infoclr_init_ppn(pixel, Metadpy->bg, "cpy", 0); } } /* Initialize the windows */ for (i = 0; i < num_term; i++) { term_data *td = &data[i]; /* Initialize the term_data */ term_data_init(td, i); /* Save global entry */ angband_term[i] = Term; } /* Raise the "Angband" window */ Infowin_set(data[0].win); Infowin_raise(); /* Activate the "Angband" window screen */ Term_activate(&data[0].t); /* Activate hook */ quit_aux = hook_quit; /* Success */ return (0); } #endif /* USE_X11 */ angband-3.5.1/src/main-cocoa.m0000644000175000017500000033261012456456606015420 0ustar chriscchrisc/* File: main-cocoa.m */ /* * Copyright (c) 2011 Peter Ammon * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "dungeon.h" #include "files.h" #include "init.h" #include "grafmode.h" #if defined(SAFE_DIRECTORY) #import "buildid.h" #endif //#define NSLog(...) ; #if BORG #include "borg1.h" #include "borg9.h" #endif #if defined(MACH_O_CARBON) /* Default creator signature */ #ifndef ANGBAND_CREATOR # define ANGBAND_CREATOR 'A271' #endif /* Mac headers */ #include #include // For keycodes static NSSize const AngbandScaleIdentity = {1.0, 1.0}; static NSString * const AngbandDirectoryNameLib = @"lib"; static NSString * const AngbandDirectoryNameBase = @"Angband"; static NSString * const AngbandTerminalsDefaultsKey = @"Terminals"; static NSString * const AngbandTerminalRowsDefaultsKey = @"Rows"; static NSString * const AngbandTerminalColumnsDefaultsKey = @"Columns"; static NSString * const AngbandTerminalVisibleDefaultsKey = @"Visible"; static NSInteger const AngbandWindowMenuItemTagBase = 1000; static NSInteger const AngbandCommandMenuItemTagBase = 2000; /* We can blit to a large layer or image and then scale it down during live resize, which makes resizing much faster, at the cost of some image quality during resizing */ #ifndef USE_LIVE_RESIZE_CACHE # define USE_LIVE_RESIZE_CACHE 1 #endif /* * Support the improved game command handling */ #include "textui.h" static game_command cmd = { CMD_NULL, 0 }; /* Our command-fetching function */ static errr cocoa_get_cmd(cmd_context context, bool wait); /* Application defined event numbers */ enum { AngbandEventWakeup = 1 }; /* Redeclare some 10.7 constants and methods so we can build on 10.6 */ enum { Angband_NSWindowCollectionBehaviorFullScreenPrimary = 1 << 7, Angband_NSWindowCollectionBehaviorFullScreenAuxiliary = 1 << 8 }; @interface NSWindow (AngbandLionRedeclares) - (void)setRestorable:(BOOL)flag; @end /* Delay handling of pre-emptive "quit" event */ static BOOL quit_when_ready = FALSE; /* Whether or not we allow sounds (only relevant for the screensaver, where the user can't configure it in-game) */ static BOOL allow_sounds = YES; /* Set to indicate the game is over and we can quit without delay */ static Boolean game_is_finished = FALSE; /* Our frames per second (e.g. 60). A value of 0 means unthrottled. */ static int frames_per_second; /* Function to get the default font */ static NSFont *default_font; @class AngbandView; /* The max number of glyphs we support */ #define GLYPH_COUNT 256 /* An AngbandContext represents a logical Term (i.e. what Angband thinks is a window). This typically maps to one NSView, but may map to more than one NSView (e.g. the Test and real screen saver view). */ @interface AngbandContext : NSObject { @public /* The Angband term */ term *terminal; /* Column and row cont, by default 80 x 24 */ size_t cols; size_t rows; /* The size of the border between the window edge and the contents */ NSSize borderSize; /* Our array of views */ NSMutableArray *angbandViews; /* The buffered image */ CGLayerRef angbandLayer; /* The font of this context */ NSFont *angbandViewFont; /* If this context owns a window, here it is */ NSWindow *primaryWindow; /* "Glyph info": an array of the CGGlyphs and their widths corresponding to the above font. */ CGGlyph glyphArray[GLYPH_COUNT]; CGFloat glyphWidths[GLYPH_COUNT]; /* The size of one tile */ NSSize tileSize; /* Font's descender */ CGFloat fontDescender; /* Whether we are currently in live resize, which affects how big we render our image */ int inLiveResize; /* Last time we drew, so we can throttle drawing */ CFAbsoluteTime lastRefreshTime; /* To address subpixel rendering overdraw problems, we cache all the characters and attributes we're told to draw */ wchar_t *charOverdrawCache; int *attrOverdrawCache; @private BOOL _hasSubwindowFlags; BOOL _windowVisibilityChecked; } @property (nonatomic, assign) BOOL hasSubwindowFlags; @property (nonatomic, assign) BOOL windowVisibilityChecked; - (void)drawRect:(NSRect)rect inView:(NSView *)view; /* Called at initialization to set the term */ - (void)setTerm:(term *)t; /* Called when the context is going down. */ - (void)dispose; /* Returns the size of the image. */ - (NSSize)imageSize; /* Return the rect for a tile at given coordinates. */ - (NSRect)rectInImageForTileAtX:(int)x Y:(int)y; /* Draw the given wide character into the given tile rect. */ - (void)drawWChar:(wchar_t)wchar inRect:(NSRect)tile; /* Locks focus on the Angband image, and scales the CTM appropriately. */ - (CGContextRef)lockFocus; /* Locks focus on the Angband image but does NOT scale the CTM. Appropriate for drawing hairlines. */ - (CGContextRef)lockFocusUnscaled; /* Unlocks focus. */ - (void)unlockFocus; /* Returns the primary window for this angband context, creating it if necessary */ - (NSWindow *)makePrimaryWindow; /* Called to add a new Angband view */ - (void)addAngbandView:(AngbandView *)view; /* Make the context aware that one of its views changed size */ - (void)angbandViewDidScale:(AngbandView *)view; /* Handle becoming the main window */ - (void)windowDidBecomeMain:(NSNotification *)notification; /* Return whether the context's primary window is ordered in or not */ - (BOOL)isOrderedIn; /* Return whether the context's primary window is key */ - (BOOL)isMainWindow; /* Invalidate the whole image */ - (void)setNeedsDisplay:(BOOL)val; /* Invalidate part of the image, with the rect expressed in base coordinates */ - (void)setNeedsDisplayInBaseRect:(NSRect)rect; /* Display (flush) our Angband views */ - (void)displayIfNeeded; /* Resize context to size of contentRect, and optionally save size to * defaults */ - (void)resizeTerminalWithContentRect: (NSRect)contentRect saveToDefaults: (BOOL)saveToDefaults; /* Called from the view to indicate that it is starting or ending live resize */ - (void)viewWillStartLiveResize:(AngbandView *)view; - (void)viewDidEndLiveResize:(AngbandView *)view; - (void)saveWindowVisibleToDefaults: (BOOL)windowVisible; - (BOOL)windowVisibleUsingDefaults; /* Class methods */ /* Begins an Angband game. This is the entry point for starting off. */ + (void)beginGame; /* Ends an Angband game. */ + (void)endGame; /* Internal method */ - (AngbandView *)activeView; @end /** * Generate a mask for the subwindow flags. The mask is just a safety check to make sure that our windows show and hide as expected. * This function allows for future changes to the set of flags without needed to update it here (unless the underlying types change). */ u32b AngbandMaskForValidSubwindowFlags(void) { int windowFlagBits = sizeof(*(op_ptr->window_flag)) * CHAR_BIT; int maxBits = MIN( PW_MAX_FLAGS, windowFlagBits ); u32b mask = 0; for( int i = 0; i < maxBits; i++ ) { if( window_flag_desc[i] != NULL ) { mask |= (1 << i); } } return mask; } /** * Check for changes in the subwindow flags and update window visibility. This seems to be called for every user event, so we don't * want to do any unnecessary hiding or showing of windows. */ static void AngbandUpdateWindowVisibility(void) { // because this function is called frequently, we'll make the mask static. it doesn't change between calls, since the flags themselves are hardcoded. static u32b validWindowFlagsMask = 0; if( validWindowFlagsMask == 0 ) { validWindowFlagsMask = AngbandMaskForValidSubwindowFlags(); } // loop through all of the subwindows and see if there is a change in the flags. if so, show or hide the corresponding window. // we don't care about the flags themselves; we just want to know if any are set. for( int i = 1; i < ANGBAND_TERM_MAX; i++ ) { AngbandContext *angbandContext = angband_term[i]->data; if( angbandContext == nil ) { continue; } // this horrible mess of flags is so that we can try to maintain some user visibility preference. this should allow the user // a window and have it stay closed between application launches. however, this means that when a subwindow is turned on, // it will no longer appear automatically. angband has no concept of user control over window visibility, other than the // subwindow flags. if( !angbandContext.windowVisibilityChecked ) { if( [angbandContext windowVisibleUsingDefaults] ) { [angbandContext->primaryWindow orderFront: nil]; angbandContext.windowVisibilityChecked = YES; } else { [angbandContext->primaryWindow close]; angbandContext.windowVisibilityChecked = NO; } } else { BOOL termHasSubwindowFlags = ((op_ptr->window_flag[i] & validWindowFlagsMask) > 0); if( angbandContext.hasSubwindowFlags && !termHasSubwindowFlags ) { [angbandContext->primaryWindow close]; angbandContext.hasSubwindowFlags = NO; [angbandContext saveWindowVisibleToDefaults: NO]; } else if( !angbandContext.hasSubwindowFlags && termHasSubwindowFlags ) { [angbandContext->primaryWindow orderFront: nil]; angbandContext.hasSubwindowFlags = YES; [angbandContext saveWindowVisibleToDefaults: YES]; } } } // make the main window key so that user events go to the right spot AngbandContext *mainWindow = angband_term[0]->data; [mainWindow->primaryWindow makeKeyAndOrderFront: nil]; } /* To indicate that a grid element contains a picture, we store 0xFFFF. */ #define NO_OVERDRAW ((wchar_t)(0xFFFF)) /* Here is some support for rounding to pixels in a scaled context */ static double push_pixel(double pixel, double scale, BOOL increase) { double scaledPixel = pixel * scale; /* Have some tolerance! */ double roundedPixel = round(scaledPixel); if (fabs(roundedPixel - scaledPixel) <= .0001) { scaledPixel = roundedPixel; } else { scaledPixel = (increase ? ceil : floor)(scaledPixel); } return scaledPixel / scale; } /* Descriptions of how to "push pixels" in a given rect to integralize. For example, PUSH_LEFT means that we round expand the left edge if set, otherwise we shrink it. */ enum { PUSH_LEFT = 0x1, PUSH_RIGHT = 0x2, PUSH_BOTTOM = 0x4, PUSH_TOP = 0x8 }; /* Return a rect whose border is in the "cracks" between tiles */ static NSRect crack_rect(NSRect rect, NSSize scale, unsigned pushOptions) { double rightPixel = push_pixel(NSMaxX(rect), scale.width, !! (pushOptions & PUSH_RIGHT)); double topPixel = push_pixel(NSMaxY(rect), scale.height, !! (pushOptions & PUSH_TOP)); double leftPixel = push_pixel(NSMinX(rect), scale.width, ! (pushOptions & PUSH_LEFT)); double bottomPixel = push_pixel(NSMinY(rect), scale.height, ! (pushOptions & PUSH_BOTTOM)); return NSMakeRect(leftPixel, bottomPixel, rightPixel - leftPixel, topPixel - bottomPixel); } /* Returns the pixel push options (describing how we round) for the tile at a given index. Currently it's pretty uniform! */ static unsigned push_options(unsigned x, unsigned y) { return PUSH_TOP | PUSH_LEFT; } /* * Graphics support */ /* * The tile image */ static CGImageRef pict_image; /* * Numbers of rows and columns in a tileset, * calculated by the PICT/PNG loading code */ static int pict_cols = 0; static int pict_rows = 0; /* * Value used to signal that we using ASCII, not graphical tiles. */ #define GRAF_MODE_NONE 0 /* * Requested graphics mode (as a grafID). * The current mode is stored in current_graphics_mode. */ static int graf_mode_req = 0; /* * Helper function to check the various ways that graphics can be enabled, guarding against NULL */ static BOOL graphics_are_enabled(void) { return current_graphics_mode && current_graphics_mode->grafID != GRAPHICS_NONE; } /* * Hack -- game in progress */ static Boolean game_in_progress = FALSE; #pragma mark Prototypes static void wakeup_event_loop(void); static void hook_plog(const char *str); static void hook_quit(const char * str); static void load_prefs(void); static void load_sounds(void); static void init_windows(void); static void handle_open_when_ready(void); static void play_sound(int event); static BOOL check_events(int wait); static void cocoa_file_open_hook(const char *path, file_type ftype); static bool cocoa_get_file(const char *suggested_name, char *path, size_t len); static BOOL send_event(NSEvent *event); static void record_current_savefile(void); /* * Available values for 'wait' */ #define CHECK_EVENTS_DRAIN -1 #define CHECK_EVENTS_NO_WAIT 0 #define CHECK_EVENTS_WAIT 1 /* * Note when "open"/"new" become valid */ static bool initialized = FALSE; /* Methods for getting the appropriate NSUserDefaults */ @interface NSUserDefaults (AngbandDefaults) + (NSUserDefaults *)angbandDefaults; @end @implementation NSUserDefaults (AngbandDefaults) + (NSUserDefaults *)angbandDefaults { return [NSUserDefaults standardUserDefaults]; } @end /* Methods for pulling images out of the Angband bundle (which may be separate from the current bundle in the case of a screensaver */ @interface NSImage (AngbandImages) + (NSImage *)angbandImage:(NSString *)name; @end /* The NSView subclass that draws our Angband image */ @interface AngbandView : NSView { IBOutlet AngbandContext *angbandContext; } - (void)setAngbandContext:(AngbandContext *)context; - (AngbandContext *)angbandContext; @end @implementation NSImage (AngbandImages) /* Returns an image in the resource directoy of the bundle containing the Angband view class. */ + (NSImage *)angbandImage:(NSString *)name { NSBundle *bundle = [NSBundle bundleForClass:[AngbandView class]]; NSString *path = [bundle pathForImageResource:name]; NSImage *result; if (path) result = [[[NSImage alloc] initByReferencingFile:path] autorelease]; else result = nil; return result; } @end @implementation AngbandContext @synthesize hasSubwindowFlags=_hasSubwindowFlags; @synthesize windowVisibilityChecked=_windowVisibilityChecked; - (NSFont *)selectionFont { return angbandViewFont; } - (BOOL)useLiveResizeOptimization { /* If we have graphics turned off, text rendering is fast enough that we don't need to use a live resize optimization. Note here we are depending on current_graphics_mode being NULL when in text mode. */ return inLiveResize && graphics_are_enabled(); } - (NSSize)baseSize { /* We round the base size down. If we round it up, I believe we may end up with pixels that nobody "owns" that may accumulate garbage. In general rounding down is harmless, because any lost pixels may be sopped up by the border. */ return NSMakeSize(floor(cols * tileSize.width + 2 * borderSize.width), floor(rows * tileSize.height + 2 * borderSize.height)); } // qsort-compatible compare function for CGSizes static int compare_advances(const void *ap, const void *bp) { const CGSize *a = ap, *b = bp; return (a->width > b->width) - (a->width < b->width); } - (void)updateGlyphInfo { // Update glyphArray and glyphWidths NSFont *screenFont = [angbandViewFont screenFont]; // Generate a string containing each MacRoman character unsigned char latinString[GLYPH_COUNT]; size_t i; for (i=0; i < GLYPH_COUNT; i++) latinString[i] = (unsigned char)i; // Turn that into unichar. Angband uses ISO Latin 1. unichar unicharString[GLYPH_COUNT] = {0}; NSString *allCharsString = [[NSString alloc] initWithBytes:latinString length:sizeof latinString encoding:NSISOLatin1StringEncoding]; [allCharsString getCharacters:unicharString range:NSMakeRange(0, MIN(GLYPH_COUNT, [allCharsString length]))]; [allCharsString autorelease]; // Get glyphs memset(glyphArray, 0, sizeof glyphArray); CTFontGetGlyphsForCharacters((CTFontRef)screenFont, unicharString, glyphArray, GLYPH_COUNT); // Get advances. Record the max advance. CGSize advances[GLYPH_COUNT] = {}; CTFontGetAdvancesForGlyphs((CTFontRef)screenFont, kCTFontHorizontalOrientation, glyphArray, advances, GLYPH_COUNT); for (i=0; i < GLYPH_COUNT; i++) { glyphWidths[i] = advances[i].width; } // For good non-mono-font support, use the median advance. Start by sorting all advances. qsort(advances, GLYPH_COUNT, sizeof *advances, compare_advances); // Skip over any initially empty run size_t startIdx; for (startIdx = 0; startIdx < GLYPH_COUNT; startIdx++) { if (advances[startIdx].width > 0) break; } // Pick the center to find the median CGFloat medianAdvance = 0; if (startIdx < GLYPH_COUNT) { // In case we have all zero advances for some reason medianAdvance = advances[(startIdx + GLYPH_COUNT)/2].width; } // Record the descender fontDescender = [screenFont descender]; // Record the tile size. Note that these are typically fractional values - which seems sketchy, but we end up scaling the heck out of our view anyways, so it seems to not matter. tileSize.width = medianAdvance; tileSize.height = [screenFont ascender] - [screenFont descender]; } - (void)updateImage { NSSize size = NSMakeSize(1, 1); AngbandView *activeView = [self activeView]; if (activeView) { /* If we are in live resize, draw as big as the screen, so we can scale nicely to any size. If we are not in live resize, then use the bounds of the active view. */ NSScreen *screen; if ([self useLiveResizeOptimization] && (screen = [[activeView window] screen]) != NULL) { size = [screen frame].size; } else { size = [activeView bounds].size; } } size.width = fmax(1, ceil(size.width)); size.height = fmax(1, ceil(size.height)); CGLayerRelease(angbandLayer); // make a bitmap context as an example for our layer CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB(); CGContextRef exampleCtx = CGBitmapContextCreate(NULL, 1, 1, 8 /* bits per component */, 48 /* bytesPerRow */, cs, kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host); CGColorSpaceRelease(cs); angbandLayer = CGLayerCreateWithContext(exampleCtx, *(CGSize *)&size, NULL); CFRelease(exampleCtx); [self lockFocus]; [[NSColor blackColor] set]; NSRectFill((NSRect){NSZeroPoint, [self baseSize]}); [self unlockFocus]; } - (void)requestRedraw { if (! self->terminal) return; term *old = Term; /* Activate the term */ Term_activate(self->terminal); /* Redraw the contents */ Term_redraw(); /* Flush the output */ Term_fresh(); /* Restore the old term */ Term_activate(old); } - (void)setTerm:(term *)t { terminal = t; } - (void)viewWillStartLiveResize:(AngbandView *)view { #if USE_LIVE_RESIZE_CACHE if (inLiveResize < INT_MAX) inLiveResize++; else [NSException raise:NSInternalInconsistencyException format:@"inLiveResize overflow"]; if (inLiveResize == 1 && graphics_are_enabled()) { [self updateImage]; [self setNeedsDisplay:YES]; //we'll need to redisplay everything anyways, so avoid creating all those little redisplay rects [self requestRedraw]; } #endif } - (void)viewDidEndLiveResize:(AngbandView *)view { #if USE_LIVE_RESIZE_CACHE if (inLiveResize > 0) inLiveResize--; else [NSException raise:NSInternalInconsistencyException format:@"inLiveResize underflow"]; if (inLiveResize == 0 && graphics_are_enabled()) { [self updateImage]; [self setNeedsDisplay:YES]; //we'll need to redisplay everything anyways, so avoid creating all those little redisplay rects [self requestRedraw]; } #endif } /* If we're trying to limit ourselves to a certain number of frames per second, then compute how long it's been since we last drew, and then wait until the next frame has passed. */ - (void)throttle { if (frames_per_second > 0) { CFAbsoluteTime now = CFAbsoluteTimeGetCurrent(); CFTimeInterval timeSinceLastRefresh = now - lastRefreshTime; CFTimeInterval timeUntilNextRefresh = (1. / (double)frames_per_second) - timeSinceLastRefresh; if (timeUntilNextRefresh > 0) { usleep((unsigned long)(timeUntilNextRefresh * 1000000.)); } } lastRefreshTime = CFAbsoluteTimeGetCurrent(); } - (void)drawWChar:(wchar_t)wchar inRect:(NSRect)tile { CGContextRef ctx = [[NSGraphicsContext currentContext] graphicsPort]; CGFloat tileOffsetY = CTFontGetAscent( (CTFontRef)[angbandViewFont screenFont] ); CGFloat tileOffsetX = 0.0; NSFont *screenFont = [angbandViewFont screenFont]; UniChar unicharString[2] = {(UniChar)wchar, 0}; // Get glyph and advance CGGlyph thisGlyphArray[1] = { 0 }; CGSize advances[1] = { { 0, 0 } }; CTFontGetGlyphsForCharacters((CTFontRef)screenFont, unicharString, thisGlyphArray, 1); CGGlyph glyph = thisGlyphArray[0]; CTFontGetAdvancesForGlyphs((CTFontRef)screenFont, kCTFontHorizontalOrientation, thisGlyphArray, advances, 1); CGSize advance = advances[0]; /* If our font is not monospaced, our tile width is deliberately not big enough for every character. In that event, if our glyph is too wide, we need to compress it horizontally. Compute the compression ratio. 1.0 means no compression. */ double compressionRatio; if (advance.width <= NSWidth(tile)) { /* Our glyph fits, so we can just draw it, possibly with an offset */ compressionRatio = 1.0; tileOffsetX = (NSWidth(tile) - advance.width)/2; } else { /* Our glyph doesn't fit, so we'll have to compress it */ compressionRatio = NSWidth(tile) / advance.width; tileOffsetX = 0; } /* Now draw it */ CGAffineTransform textMatrix = CGContextGetTextMatrix(ctx); CGFloat savedA = textMatrix.a; /* Set the position */ textMatrix.tx = tile.origin.x + tileOffsetX; textMatrix.ty = tile.origin.y + tileOffsetY; /* Maybe squish it horizontally. */ if (compressionRatio != 1.) { textMatrix.a *= compressionRatio; } textMatrix = CGAffineTransformScale( textMatrix, 1.0, -1.0 ); CGContextSetTextMatrix(ctx, textMatrix); CGContextShowGlyphsWithAdvances(ctx, &glyph, &CGSizeZero, 1); /* Restore the text matrix if we messed with the compression ratio */ if (compressionRatio != 1.) { textMatrix.a = savedA; CGContextSetTextMatrix(ctx, textMatrix); } textMatrix = CGAffineTransformScale( textMatrix, 1.0, -1.0 ); CGContextSetTextMatrix(ctx, textMatrix); } /* Indication that we're redrawing everything, so get rid of the overdraw cache. */ - (void)clearOverdrawCache { memset(charOverdrawCache, 0, self->cols * self->rows * sizeof *charOverdrawCache); memset(attrOverdrawCache, 0, self->cols * self->rows * sizeof *attrOverdrawCache); } /* Lock and unlock focus on our image or layer, setting up the CTM appropriately. */ - (CGContextRef)lockFocusUnscaled { /* Create an NSGraphicsContext representing this CGLayer */ CGContextRef ctx = CGLayerGetContext(angbandLayer); NSGraphicsContext *context = [NSGraphicsContext graphicsContextWithGraphicsPort:ctx flipped:NO]; [NSGraphicsContext saveGraphicsState]; [NSGraphicsContext setCurrentContext:context]; CGContextSaveGState(ctx); return ctx; } - (void)unlockFocus { /* Restore the graphics state */ CGContextRef ctx = [[NSGraphicsContext currentContext] graphicsPort]; CGContextRestoreGState(ctx); [NSGraphicsContext restoreGraphicsState]; } - (NSSize)imageSize { /* Return the size of our layer */ CGSize result = CGLayerGetSize(angbandLayer); return NSMakeSize(result.width, result.height); } - (CGContextRef)lockFocus { return [self lockFocusUnscaled]; } - (NSRect)rectInImageForTileAtX:(int)x Y:(int)y { int flippedY = y; return NSMakeRect(x * tileSize.width + borderSize.width, flippedY * tileSize.height + borderSize.height, tileSize.width, tileSize.height); } - (void)setSelectionFont:(NSFont*)font adjustTerminal: (BOOL)adjustTerminal { /* Record the new font */ [font retain]; [angbandViewFont release]; angbandViewFont = font; /* Update our glyph info */ [self updateGlyphInfo]; if( adjustTerminal ) { // adjust terminal to fit window with new font; save the new columns and rows since they could be changed NSRect contentRect = [self->primaryWindow contentRectForFrameRect: [self->primaryWindow frame]]; [self resizeTerminalWithContentRect: contentRect saveToDefaults: YES]; } /* Update our image */ [self updateImage]; /* Clear our overdraw cache */ [self clearOverdrawCache]; /* Get redrawn */ [self requestRedraw]; } - (id)init { if ((self = [super init])) { /* Default rows and cols */ self->cols = 80; self->rows = 24; /* Default border size */ self->borderSize = NSMakeSize(2, 2); /* Allocate overdraw cache, unscanned and collectable. */ self->charOverdrawCache = NSAllocateCollectable(self->cols * self->rows *sizeof *charOverdrawCache, 0); self->attrOverdrawCache = NSAllocateCollectable(self->cols * self->rows *sizeof *attrOverdrawCache, 0); /* Allocate our array of views */ angbandViews = [[NSMutableArray alloc] init]; /* Make the image. Since we have no views, it'll just be a puny 1x1 image. */ [self updateImage]; _windowVisibilityChecked = NO; } return self; } /* Destroy all the receiver's stuff. This is intended to be callable more than once. */ - (void)dispose { terminal = NULL; /* Disassociate ourselves from our angbandViews */ [angbandViews makeObjectsPerformSelector:@selector(setAngbandContext:) withObject:nil]; [angbandViews release]; angbandViews = nil; /* Destroy the layer/image */ CGLayerRelease(angbandLayer); angbandLayer = NULL; /* Font */ [angbandViewFont release]; angbandViewFont = nil; /* Window */ [primaryWindow setDelegate:nil]; [primaryWindow close]; [primaryWindow release]; primaryWindow = nil; /* Free overdraw cache (unless we're GC, in which case it was allocated collectable) */ if (! [NSGarbageCollector defaultCollector]) free(self->charOverdrawCache); self->charOverdrawCache = NULL; if (! [NSGarbageCollector defaultCollector]) free(self->attrOverdrawCache); self->attrOverdrawCache = NULL; } /* Usual Cocoa fare */ - (void)dealloc { [self dispose]; [super dealloc]; } #pragma mark - #pragma mark Directories and Paths Setup /** * Return the path for Angband's lib directory and bail if it isn't found. The lib directory should be in the bundle's resources directory, since it's copied when built. */ + (NSString *)libDirectoryPath { NSString *bundleLibPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: AngbandDirectoryNameLib]; BOOL isDirectory = NO; BOOL libExists = [[NSFileManager defaultManager] fileExistsAtPath: bundleLibPath isDirectory: &isDirectory]; if( !libExists || !isDirectory ) { NSLog( @"[%@ %@]: can't find %@/ in bundle: isDirectory: %d libExists: %d", NSStringFromClass( [self class] ), NSStringFromSelector( _cmd ), AngbandDirectoryNameLib, isDirectory, libExists ); NSRunAlertPanel( @"Missing Resources", @"Angband was unable to find required resources and must quit. Please report a bug on the Angband forums.", @"Quit", nil, nil ); exit( 0 ); } // angband requires the trailing slash for the directory path return [bundleLibPath stringByAppendingString: @"/"]; } /** * Return the path for the directory where Angband should look for its standard user file tree. */ + (NSString *)angbandDocumentsPath { // angband requires the trailing slash, so we'll just add it here; NSString won't care about it when we use the base path for other things NSString *documents = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES ) lastObject]; #if defined(SAFE_DIRECTORY) NSString *versionedDirectory = [NSString stringWithFormat: @"%@-%s", AngbandDirectoryNameBase, VERSION_STRING]; return [[documents stringByAppendingPathComponent: versionedDirectory] stringByAppendingString: @"/"]; #else return [[documents stringByAppendingPathComponent: AngbandDirectoryNameBase] stringByAppendingString: @"/"]; #endif } /** * Give Angband the base paths that should be used for the various directories it needs. It will create any needed directories. */ + (void)prepareFilePathsAndDirectories { char libpath[PATH_MAX + 1] = "\0"; char basepath[PATH_MAX + 1] = "\0"; [[self libDirectoryPath] getFileSystemRepresentation: libpath maxLength: sizeof(libpath)]; [[self angbandDocumentsPath] getFileSystemRepresentation: basepath maxLength: sizeof(basepath)]; init_file_paths( libpath, libpath, basepath ); create_needed_dirs(); } #pragma mark - /* Entry point for initializing Angband */ + (void)beginGame { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //set the command hook cmd_get_hook = cocoa_get_cmd; /* Hooks in some "z-util.c" hooks */ plog_aux = hook_plog; quit_aux = hook_quit; /* Hook in to the file_open routine */ file_open_hook = cocoa_file_open_hook; /* Hook into file saving dialogue routine */ get_file = cocoa_get_file; // initialize file paths [self prepareFilePathsAndDirectories]; // load preferences load_prefs(); /* Load possible graphics modes */ init_graphics_modes("graphics.txt"); // load sounds load_sounds(); /* Prepare the windows */ init_windows(); /* Set up game event handlers */ init_display(); /* Register the sound hook */ sound_hook = play_sound; /* Note the "system" */ ANGBAND_SYS = "mac"; /* Initialize some save file stuff */ player_egid = getegid(); /* We are now initialized */ initialized = TRUE; /* Handle "open_when_ready" */ handle_open_when_ready(); /* Handle pending events (most notably update) and flush input */ Term_flush(); /* * Play a game -- "new_game" is set by "new", "open" or the open document * even handler as appropriate */ [pool drain]; play_game(); } + (void)endGame { /* Hack -- Forget messages */ msg_flag = FALSE; p_ptr->playing = FALSE; p_ptr->leaving = TRUE; quit_when_ready = TRUE; } - (IBAction)setGraphicsMode:(NSMenuItem *)sender { /* We stashed the graphics mode ID in the menu item's tag */ graf_mode_req = [sender tag]; /* Stash it in UserDefaults */ [[NSUserDefaults angbandDefaults] setInteger:graf_mode_req forKey:@"GraphicsID"]; [[NSUserDefaults angbandDefaults] synchronize]; if (game_in_progress) { /* Hack -- Force redraw */ do_cmd_redraw(); /* Wake up the event loop so it notices the change */ wakeup_event_loop(); } } - (void)addAngbandView:(AngbandView *)view { if (! [angbandViews containsObject:view]) { [angbandViews addObject:view]; [self updateImage]; [self setNeedsDisplay:YES]; //we'll need to redisplay everything anyways, so avoid creating all those little redisplay rects [self requestRedraw]; } } /* We have this notion of an "active" AngbandView, which is the largest - the idea being that in the screen saver, when the user hits Test in System Preferences, we don't want to keep driving the AngbandView in the background. Our active AngbandView is the widest - that's a hack all right. Mercifully when we're just playing the game there's only one view. */ - (AngbandView *)activeView { if ([angbandViews count] == 1) return [angbandViews objectAtIndex:0]; AngbandView *result = nil; float maxWidth = 0; for (AngbandView *angbandView in angbandViews) { float width = [angbandView frame].size.width; if (width > maxWidth) { maxWidth = width; result = angbandView; } } return result; } - (void)angbandViewDidScale:(AngbandView *)view { /* If we're live-resizing with graphics, we're using the live resize optimization, so don't update the image. Otherwise do it. */ if (! (inLiveResize && graphics_are_enabled()) && view == [self activeView]) { [self updateImage]; [self setNeedsDisplay:YES]; //we'll need to redisplay everything anyways, so avoid creating all those little redisplay rects [self requestRedraw]; } } - (void)removeAngbandView:(AngbandView *)view { if ([angbandViews containsObject:view]) { [angbandViews removeObject:view]; [self updateImage]; [self setNeedsDisplay:YES]; //we'll need to redisplay everything anyways, so avoid creating all those little redisplay rects if ([angbandViews count]) [self requestRedraw]; } } static NSMenuItem *superitem(NSMenuItem *self) { NSMenu *supermenu = [[self menu] supermenu]; int index = [supermenu indexOfItemWithSubmenu:[self menu]]; if (index == -1) return nil; else return [supermenu itemAtIndex:index]; } - (BOOL)validateMenuItem:(NSMenuItem *)menuItem { int tag = [menuItem tag]; SEL sel = [menuItem action]; if (sel == @selector(setGraphicsMode:)) { [menuItem setState: (tag == graf_mode_req)]; return YES; } else { return YES; } } - (NSWindow *)makePrimaryWindow { if (! primaryWindow) { // this has to be done after the font is set, which it already is in term_init_cocoa() CGFloat width = self->cols * tileSize.width + borderSize.width * 2.0; CGFloat height = self->rows * tileSize.height + borderSize.height * 2.0; NSRect contentRect = NSMakeRect( 0.0, 0.0, width, height ); NSUInteger styleMask = NSTitledWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask; // make every window other than the main window closable if( angband_term[0]->data != self ) { styleMask |= NSClosableWindowMask; } primaryWindow = [[NSWindow alloc] initWithContentRect:contentRect styleMask: styleMask backing:NSBackingStoreBuffered defer:YES]; /* Not to be released when closed */ [primaryWindow setReleasedWhenClosed:NO]; [primaryWindow setExcludedFromWindowsMenu: YES]; // we're using custom window menu handling /* Make the view */ AngbandView *angbandView = [[AngbandView alloc] initWithFrame:contentRect]; [angbandView setAngbandContext:self]; [angbandViews addObject:angbandView]; [primaryWindow setContentView:angbandView]; [angbandView release]; /* We are its delegate */ [primaryWindow setDelegate:self]; /* Update our image, since this is probably the first angband view we've gotten. */ [self updateImage]; } return primaryWindow; } #pragma mark View/Window Passthrough /* This is what our views call to get us to draw to the window */ - (void)drawRect:(NSRect)rect inView:(NSView *)view { /* Take this opportunity to throttle so we don't flush faster than desird. */ BOOL viewInLiveResize = [view inLiveResize]; if (! viewInLiveResize) [self throttle]; /* With a GLayer, use CGContextDrawLayerInRect */ CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; NSRect bounds = [view bounds]; if (viewInLiveResize) CGContextSetInterpolationQuality(context, kCGInterpolationLow); CGContextSetBlendMode(context, kCGBlendModeCopy); CGContextDrawLayerInRect(context, *(CGRect *)&bounds, angbandLayer); if (viewInLiveResize) CGContextSetInterpolationQuality(context, kCGInterpolationDefault); } - (BOOL)isOrderedIn { return [[[angbandViews lastObject] window] isVisible]; } - (BOOL)isMainWindow { return [[[angbandViews lastObject] window] isMainWindow]; } - (void)setNeedsDisplay:(BOOL)val { for (NSView *angbandView in angbandViews) { [angbandView setNeedsDisplay:val]; } } - (void)setNeedsDisplayInBaseRect:(NSRect)rect { for (NSView *angbandView in angbandViews) { [angbandView setNeedsDisplayInRect: rect]; } } - (void)displayIfNeeded { [[self activeView] displayIfNeeded]; } - (void)resizeOverdrawCache { /* Free overdraw cache (unless we're GC, in which case it was allocated collectable) */ if (! [NSGarbageCollector defaultCollector]) free(self->charOverdrawCache); self->charOverdrawCache = NULL; if (! [NSGarbageCollector defaultCollector]) free(self->attrOverdrawCache); self->attrOverdrawCache = NULL; /* Allocate overdraw cache, unscanned and collectable. */ self->charOverdrawCache = NSAllocateCollectable(self->cols * self->rows *sizeof *charOverdrawCache, 0); self->attrOverdrawCache = NSAllocateCollectable(self->cols * self->rows *sizeof *attrOverdrawCache, 0); } - (int)terminalIndex { int termIndex = 0; for( termIndex = 0; termIndex < ANGBAND_TERM_MAX; termIndex++ ) { if( angband_term[termIndex] == self->terminal ) { break; } } return termIndex; } - (void)resizeTerminalWithContentRect: (NSRect)contentRect saveToDefaults: (BOOL)saveToDefaults { CGFloat newRows = floor( (contentRect.size.height - (borderSize.height * 2.0)) / tileSize.height ); CGFloat newColumns = ceil( (contentRect.size.width - (borderSize.width * 2.0)) / tileSize.width ); self->cols = newColumns; self->rows = newRows; [self resizeOverdrawCache]; if( saveToDefaults ) { int termIndex = [self terminalIndex]; NSArray *terminals = [[NSUserDefaults standardUserDefaults] valueForKey: AngbandTerminalsDefaultsKey]; if( termIndex < (int)[terminals count] ) { NSMutableDictionary *mutableTerm = [[NSMutableDictionary alloc] initWithDictionary: [terminals objectAtIndex: termIndex]]; [mutableTerm setValue: [NSNumber numberWithUnsignedInt: self->cols] forKey: AngbandTerminalColumnsDefaultsKey]; [mutableTerm setValue: [NSNumber numberWithUnsignedInt: self->rows] forKey: AngbandTerminalRowsDefaultsKey]; NSMutableArray *mutableTerminals = [[NSMutableArray alloc] initWithArray: terminals]; [mutableTerminals replaceObjectAtIndex: termIndex withObject: mutableTerm]; [[NSUserDefaults standardUserDefaults] setValue: mutableTerminals forKey: AngbandTerminalsDefaultsKey]; [mutableTerminals release]; [mutableTerm release]; } } term *old = Term; Term_activate( self->terminal ); Term_resize( (int)newColumns, (int)newRows); Term_redraw(); Term_activate( old ); } - (void)saveWindowVisibleToDefaults: (BOOL)windowVisible { int termIndex = [self terminalIndex]; BOOL safeVisibility = (termIndex == 0) ? YES : windowVisible; // ensure main term doesn't go away because of these defaults NSArray *terminals = [[NSUserDefaults standardUserDefaults] valueForKey: AngbandTerminalsDefaultsKey]; if( termIndex < (int)[terminals count] ) { NSMutableDictionary *mutableTerm = [[NSMutableDictionary alloc] initWithDictionary: [terminals objectAtIndex: termIndex]]; [mutableTerm setValue: [NSNumber numberWithBool: safeVisibility] forKey: AngbandTerminalVisibleDefaultsKey]; NSMutableArray *mutableTerminals = [[NSMutableArray alloc] initWithArray: terminals]; [mutableTerminals replaceObjectAtIndex: termIndex withObject: mutableTerm]; [[NSUserDefaults standardUserDefaults] setValue: mutableTerminals forKey: AngbandTerminalsDefaultsKey]; [mutableTerminals release]; [mutableTerm release]; } } - (BOOL)windowVisibleUsingDefaults { int termIndex = [self terminalIndex]; if( termIndex == 0 ) { return YES; } NSArray *terminals = [[NSUserDefaults standardUserDefaults] valueForKey: AngbandTerminalsDefaultsKey]; BOOL visible = NO; if( termIndex < (int)[terminals count] ) { NSDictionary *term = [terminals objectAtIndex: termIndex]; NSNumber *visibleValue = [term valueForKey: AngbandTerminalVisibleDefaultsKey]; if( visibleValue != nil ) { visible = [visibleValue boolValue]; } } return visible; } #pragma mark - #pragma mark NSWindowDelegate Methods //- (void)windowWillStartLiveResize: (NSNotification *)notification //{ //} - (void)windowDidEndLiveResize: (NSNotification *)notification { NSWindow *window = [notification object]; NSRect contentRect = [window contentRectForFrameRect: [window frame]]; [self resizeTerminalWithContentRect: contentRect saveToDefaults: YES]; } //- (NSSize)windowWillResize: (NSWindow *)sender toSize: (NSSize)frameSize //{ //} - (void)windowDidEnterFullScreen: (NSNotification *)notification { NSWindow *window = [notification object]; NSRect contentRect = [window contentRectForFrameRect: [window frame]]; [self resizeTerminalWithContentRect: contentRect saveToDefaults: NO]; } - (void)windowDidExitFullScreen: (NSNotification *)notification { NSWindow *window = [notification object]; NSRect contentRect = [window contentRectForFrameRect: [window frame]]; [self resizeTerminalWithContentRect: contentRect saveToDefaults: NO]; } - (void)windowDidBecomeMain:(NSNotification *)notification { NSWindow *window = [notification object]; if( window != self->primaryWindow ) { return; } int termIndex = 0; for( termIndex = 0; termIndex < ANGBAND_TERM_MAX; termIndex++ ) { if( angband_term[termIndex] == self->terminal ) { break; } } NSMenuItem *item = [[[NSApplication sharedApplication] windowsMenu] itemWithTag: AngbandWindowMenuItemTagBase + termIndex]; [item setState: NSOnState]; if( [[NSFontPanel sharedFontPanel] isVisible] ) { [[NSFontPanel sharedFontPanel] setPanelFont: [self selectionFont] isMultiple: NO]; } } - (void)windowDidResignMain: (NSNotification *)notification { NSWindow *window = [notification object]; if( window != self->primaryWindow ) { return; } int termIndex = 0; for( termIndex = 0; termIndex < ANGBAND_TERM_MAX; termIndex++ ) { if( angband_term[termIndex] == self->terminal ) { break; } } NSMenuItem *item = [[[NSApplication sharedApplication] windowsMenu] itemWithTag: AngbandWindowMenuItemTagBase + termIndex]; [item setState: NSOffState]; } - (void)windowWillClose: (NSNotification *)notification { [self saveWindowVisibleToDefaults: NO]; } @end @implementation AngbandView - (BOOL)isOpaque { return YES; } - (BOOL)isFlipped { return YES; } - (void)drawRect:(NSRect)rect { if (! angbandContext) { /* Draw bright orange, 'cause this ain't right */ [[NSColor orangeColor] set]; NSRectFill([self bounds]); } else { /* Tell the Angband context to draw into us */ [angbandContext drawRect:rect inView:self]; } } - (void)setAngbandContext:(AngbandContext *)context { angbandContext = context; } - (AngbandContext *)angbandContext { return angbandContext; } - (void)setFrameSize:(NSSize)size { BOOL changed = ! NSEqualSizes(size, [self frame].size); [super setFrameSize:size]; if (changed) [angbandContext angbandViewDidScale:self]; } - (void)viewWillStartLiveResize { [angbandContext viewWillStartLiveResize:self]; } - (void)viewDidEndLiveResize { [angbandContext viewDidEndLiveResize:self]; } @end /* * Delay handling of double-clicked savefiles */ Boolean open_when_ready = FALSE; /*** Some generic functions ***/ /* Sets an Angband color at a given index */ static void set_color_for_index(int idx) { u16b rv, gv, bv; /* Extract the R,G,B data */ rv = angband_color_table[idx][1]; gv = angband_color_table[idx][2]; bv = angband_color_table[idx][3]; CGContextSetRGBFillColor([[NSGraphicsContext currentContext] graphicsPort], rv/255., gv/255., bv/255., 1.); } /* Remember the current character in UserDefaults so we can select it by default next time. */ static void record_current_savefile(void) { NSString *savefileString = [[NSString stringWithCString:savefile encoding:NSMacOSRomanStringEncoding] lastPathComponent]; if (savefileString) { NSUserDefaults *angbandDefs = [NSUserDefaults angbandDefaults]; [angbandDefs setObject:savefileString forKey:@"SaveFile"]; [angbandDefs synchronize]; } } /*** Support for the "z-term.c" package ***/ /* * Initialize a new Term * */ static void Term_init_cocoa(term *t) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; AngbandContext *context = [[AngbandContext alloc] init]; /* Give the term a hard retain on context (for GC) */ t->data = (void *)CFRetain(context); [context release]; /* Handle graphics */ t->higher_pict = !! use_graphics; t->always_pict = FALSE; NSDisableScreenUpdates(); /* Figure out the frame autosave name based on the index of this term */ NSString *autosaveName = nil; int termIdx; for (termIdx = 0; termIdx < ANGBAND_TERM_MAX; termIdx++) { if (angband_term[termIdx] == t) { autosaveName = [NSString stringWithFormat:@"AngbandTerm-%d", termIdx]; break; } } /* Set its font. */ NSString *fontName = [[NSUserDefaults angbandDefaults] stringForKey:[NSString stringWithFormat:@"FontName-%d", termIdx]]; if (! fontName) fontName = [default_font fontName]; // use a smaller default font for the other windows, but only if the font hasn't been explicitly set float fontSize = (termIdx > 0) ? 10.0 : [default_font pointSize]; NSNumber *fontSizeNumber = [[NSUserDefaults angbandDefaults] valueForKey: [NSString stringWithFormat: @"FontSize-%d", termIdx]]; if( fontSizeNumber != nil ) { fontSize = [fontSizeNumber floatValue]; } [context setSelectionFont:[NSFont fontWithName:fontName size:fontSize] adjustTerminal: NO]; NSArray *terminalDefaults = [[NSUserDefaults standardUserDefaults] valueForKey: AngbandTerminalsDefaultsKey]; NSInteger rows = 24; NSInteger columns = 80; if( termIdx < (int)[terminalDefaults count] ) { NSDictionary *term = [terminalDefaults objectAtIndex: termIdx]; rows = [[term valueForKey: AngbandTerminalRowsDefaultsKey] integerValue]; columns = [[term valueForKey: AngbandTerminalColumnsDefaultsKey] integerValue]; } context->cols = columns; context->rows = rows; [context resizeOverdrawCache]; /* Get the window */ NSWindow *window = [context makePrimaryWindow]; /* Set its title and, for auxiliary terms, tentative size */ if (termIdx == 0) { [window setTitle:@"Angband"]; } else { [window setTitle:[NSString stringWithFormat:@"Term %d", termIdx]]; } /* If this is the first term, and we support full screen (Mac OS X Lion or later), then allow it to go full screen (sweet). Allow other terms to be FullScreenAuxilliary, so they can at least show up. Unfortunately in Lion they don't get brought to the full screen space; but they would only make sense on multiple displays anyways so it's not a big loss. */ if ([window respondsToSelector:@selector(toggleFullScreen:)]) { NSWindowCollectionBehavior behavior = [window collectionBehavior]; behavior |= (termIdx == 0 ? Angband_NSWindowCollectionBehaviorFullScreenPrimary : Angband_NSWindowCollectionBehaviorFullScreenAuxiliary); [window setCollectionBehavior:behavior]; } /* No Resume support yet, though it would not be hard to add */ if ([window respondsToSelector:@selector(setRestorable:)]) { [window setRestorable:NO]; } /* default window placement */ { static NSRect overallBoundingRect; if( termIdx == 0 ) { // this is a bit of a trick to allow us to display multiple windows in the "standard default" window position in OS X: the upper center of the screen. // the term sizes set in load_prefs() are based on a 5-wide by 3-high grid, with the main term being 4/5 wide by 2/3 high (hence the scaling to find // what the containing rect would be). NSRect originalMainTermFrame = [window frame]; NSRect scaledFrame = originalMainTermFrame; scaledFrame.size.width *= 5.0 / 4.0; scaledFrame.size.height *= 3.0 / 2.0; scaledFrame.size.width += 1.0; // spacing between window columns scaledFrame.size.height += 1.0; // spacing between window rows [window setFrame: scaledFrame display: NO]; [window center]; overallBoundingRect = [window frame]; [window setFrame: originalMainTermFrame display: NO]; } static NSRect mainTermBaseRect; NSRect windowFrame = [window frame]; if( termIdx == 0 ) { // the height and width adjustments were determined experimentally, so that the rest of the windows line up nicely without overlapping windowFrame.size.width += 7.0; windowFrame.size.height += 9.0; windowFrame.origin.x = NSMinX( overallBoundingRect ); windowFrame.origin.y = NSMaxY( overallBoundingRect ) - NSHeight( windowFrame ); mainTermBaseRect = windowFrame; } else if( termIdx == 1 ) { windowFrame.origin.x = NSMinX( mainTermBaseRect ); windowFrame.origin.y = NSMinY( mainTermBaseRect ) - NSHeight( windowFrame ) - 1.0; } else if( termIdx == 2 ) { windowFrame.origin.x = NSMaxX( mainTermBaseRect ) + 1.0; windowFrame.origin.y = NSMaxY( mainTermBaseRect ) - NSHeight( windowFrame ); } else if( termIdx == 3 ) { windowFrame.origin.x = NSMaxX( mainTermBaseRect ) + 1.0; windowFrame.origin.y = NSMinY( mainTermBaseRect ) - NSHeight( windowFrame ) - 1.0; } else if( termIdx == 4 ) { windowFrame.origin.x = NSMaxX( mainTermBaseRect ) + 1.0; windowFrame.origin.y = NSMinY( mainTermBaseRect ); } else if( termIdx == 5 ) { windowFrame.origin.x = NSMinX( mainTermBaseRect ) + NSWidth( windowFrame ) + 1.0; windowFrame.origin.y = NSMinY( mainTermBaseRect ) - NSHeight( windowFrame ) - 1.0; } [window setFrame: windowFrame display: NO]; } // override the default frame above if the user has adjusted windows in the past if (autosaveName) [window setFrameAutosaveName:autosaveName]; /* Tell it about its term. Do this after we've sized it so that the sizing doesn't trigger redrawing and such. */ [context setTerm:t]; /* Only order front if it's the first term. Other terms will be ordered front from AngbandUpdateWindowVisibility(). This is to work around a problem where Angband aggressively tells us to initialize terms that don't do anything! */ if (t == angband_term[0]) [context->primaryWindow makeKeyAndOrderFront: nil]; NSEnableScreenUpdates(); /* Set "mapped" flag */ t->mapped_flag = true; [pool drain]; } /* * Nuke an old Term */ static void Term_nuke_cocoa(term *t) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; AngbandContext *context = t->data; if (context) { /* Tell the context to get rid of its windows, etc. */ [context dispose]; /* Balance our CFRetain from when we created it */ CFRelease(context); /* Done with it */ t->data = NULL; } [pool drain]; } /* Returns the CGImageRef corresponding to an image with the given name in the resource directory, transferring ownership to the caller */ static CGImageRef create_angband_image(NSString *name) { CGImageRef decodedImage = NULL, result = NULL; /* Get the path to the image */ NSBundle *bundle = [NSBundle bundleForClass:[AngbandView class]]; NSString *path = [bundle pathForImageResource:name]; /* Try using ImageIO to load it */ if (path) { NSURL *url = [[NSURL alloc] initFileURLWithPath:path isDirectory:NO]; if (url) { NSDictionary *options = [[NSDictionary alloc] initWithObjectsAndKeys:(id)kCFBooleanTrue, kCGImageSourceShouldCache, nil]; CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, (CFDictionaryRef)options); if (source) { /* We really want the largest image, but in practice there's only going to be one */ decodedImage = CGImageSourceCreateImageAtIndex(source, 0, (CFDictionaryRef)options); CFRelease(source); } [options release]; [url release]; } } /* Draw the sucker to defeat ImageIO's weird desire to cache and decode on demand. Our images aren't that big! */ if (decodedImage) { size_t width = CGImageGetWidth(decodedImage), height = CGImageGetHeight(decodedImage); /* Compute our own bitmap info */ CGBitmapInfo imageBitmapInfo = CGImageGetBitmapInfo(decodedImage); CGBitmapInfo contextBitmapInfo = kCGBitmapByteOrderDefault; switch (imageBitmapInfo & kCGBitmapAlphaInfoMask) { case kCGImageAlphaNone: case kCGImageAlphaNoneSkipLast: case kCGImageAlphaNoneSkipFirst: /* No alpha */ contextBitmapInfo |= kCGImageAlphaNone; break; default: /* Some alpha, use premultiplied last which is most efficient. */ contextBitmapInfo |= kCGImageAlphaPremultipliedLast; break; } // draw the source image flipped, since the view is flipped CGContextRef ctx = CGBitmapContextCreate(NULL, width, height, CGImageGetBitsPerComponent(decodedImage), CGImageGetBytesPerRow(decodedImage), CGImageGetColorSpace(decodedImage), contextBitmapInfo); CGContextSetBlendMode(ctx, kCGBlendModeCopy); CGContextTranslateCTM(ctx, 0.0, height); CGContextScaleCTM(ctx, 1.0, -1.0); CGContextDrawImage(ctx, CGRectMake(0, 0, width, height), decodedImage); result = CGBitmapContextCreateImage(ctx); /* Done with these things */ CFRelease(ctx); CGImageRelease(decodedImage); } return result; } /* * React to changes */ static errr Term_xtra_cocoa_react(void) { /* Don't actually switch graphics until the game is running */ if (!initialized || !game_in_progress) return (-1); NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; AngbandContext *angbandContext = Term->data; /* Handle graphics */ int expected_graf_mode = (current_graphics_mode ? current_graphics_mode->grafID : GRAF_MODE_NONE); if (graf_mode_req != expected_graf_mode) { graphics_mode *new_mode; if (graf_mode_req != GRAF_MODE_NONE) { new_mode = get_graphics_mode(graf_mode_req); } else { new_mode = NULL; } /* Get rid of the old image. CGImageRelease is NULL-safe. */ CGImageRelease(pict_image); pict_image = NULL; /* Try creating the image if we want one */ if (new_mode != NULL) { NSString *img_name = [NSString stringWithCString:new_mode->file encoding:NSMacOSRomanStringEncoding]; pict_image = create_angband_image(img_name); /* If we failed to create the image, set the new desired mode to NULL */ if (! pict_image) new_mode = NULL; } /* Record what we did */ use_graphics = (new_mode != NULL); use_transparency = (new_mode != NULL); ANGBAND_GRAF = (new_mode ? new_mode->pref : NULL); current_graphics_mode = new_mode; /* Enable or disable higher picts. Note: this should be done for all terms. */ angbandContext->terminal->higher_pict = !! use_graphics; if (pict_image && current_graphics_mode) { /* Compute the row and column count via the image height and width. */ pict_rows = (int)(CGImageGetHeight(pict_image) / current_graphics_mode->cell_height); pict_cols = (int)(CGImageGetWidth(pict_image) / current_graphics_mode->cell_width); } else { pict_rows = 0; pict_cols = 0; } /* Reset visuals */ if (initialized && game_in_progress) { reset_visuals(TRUE); } } [pool drain]; /* Success */ return (0); } /* * Do a "special thing" */ static errr Term_xtra_cocoa(int n, int v) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; AngbandContext* angbandContext = Term->data; errr result = 0; /* Analyze */ switch (n) { /* Make a noise */ case TERM_XTRA_NOISE: { /* Make a noise */ NSBeep(); /* Success */ break; } /* Process random events */ case TERM_XTRA_BORED: { // show or hide cocoa windows based on the subwindow flags set by the user AngbandUpdateWindowVisibility(); /* Process an event */ (void)check_events(CHECK_EVENTS_NO_WAIT); /* Success */ break; } /* Process pending events */ case TERM_XTRA_EVENT: { /* Process an event */ (void)check_events(v); /* Success */ break; } /* Flush all pending events (if any) */ case TERM_XTRA_FLUSH: { /* Hack -- flush all events */ while (check_events(CHECK_EVENTS_DRAIN)) /* loop */; /* Success */ break; } /* Hack -- Change the "soft level" */ case TERM_XTRA_LEVEL: { /* Here we could activate (if requested), but I don't think Angband should be telling us our window order (the user should decide that), so do nothing. */ break; } /* Clear the screen */ case TERM_XTRA_CLEAR: { [angbandContext lockFocus]; [[NSColor blackColor] set]; NSRect imageRect = {NSZeroPoint, [angbandContext imageSize]}; NSRectFillUsingOperation(imageRect, NSCompositeCopy); [angbandContext unlockFocus]; [angbandContext clearOverdrawCache]; [angbandContext setNeedsDisplay:YES]; /* Success */ break; } /* React to changes */ case TERM_XTRA_REACT: { /* React to changes */ return (Term_xtra_cocoa_react()); } /* Delay (milliseconds) */ case TERM_XTRA_DELAY: { /* If needed */ if (v > 0) { double seconds = v / 1000.; NSDate* date = [NSDate dateWithTimeIntervalSinceNow:seconds]; do { NSEvent* event; do { event = [NSApp nextEventMatchingMask:-1 untilDate:date inMode:NSDefaultRunLoopMode dequeue:YES]; if (event) send_event(event); } while (event); } while ([date timeIntervalSinceNow] >= 0); } /* Success */ break; } case TERM_XTRA_FRESH: { /* No-op -- see #1669 * [angbandContext displayIfNeeded]; */ break; } default: /* Oops */ result = 1; break; } [pool drain]; /* Oops */ return result; } static errr Term_curs_cocoa(int x, int y) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; AngbandContext *angbandContext = Term->data; /* Get the tile */ NSRect rect = [angbandContext rectInImageForTileAtX:x Y:y]; /* We'll need to redisplay in that rect */ NSRect redisplayRect = rect; /* Go to the pixel boundaries corresponding to this tile */ rect = crack_rect(rect, AngbandScaleIdentity, push_options(x, y)); /* Lock focus and draw it */ [angbandContext lockFocus]; [[NSColor yellowColor] set]; NSFrameRectWithWidth(rect, 1); [angbandContext unlockFocus]; /* Invalidate that rect */ [angbandContext setNeedsDisplayInBaseRect:redisplayRect]; /* Success */ [pool drain]; return 0; } /* * Low level graphics (Assumes valid input) * * Erase "n" characters starting at (x,y) */ static errr Term_wipe_cocoa(int x, int y, int n) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; AngbandContext *angbandContext = Term->data; /* clear our overdraw cache for subpixel rendering */ [angbandContext clearOverdrawCache]; /* Erase the block of characters */ NSRect rect = [angbandContext rectInImageForTileAtX:x Y:y]; /* Maybe there's more than one */ if (n > 1) rect = NSUnionRect(rect, [angbandContext rectInImageForTileAtX:x + n-1 Y:y]); /* Lock focus and clear */ [angbandContext lockFocus]; [[NSColor blackColor] set]; NSRectFill(rect); [angbandContext unlockFocus]; [angbandContext setNeedsDisplayInBaseRect:rect]; [pool drain]; /* Success */ return (0); } static void draw_image_tile(CGImageRef image, NSRect srcRect, NSRect dstRect, NSCompositingOperation op) { // flip the source rect since the source image is flipped CGAffineTransform flip = CGAffineTransformIdentity; flip = CGAffineTransformTranslate(flip, 0.0, CGImageGetHeight(image)); flip = CGAffineTransformScale(flip, 1.0, -1.0); CGRect flippedSourceRect = CGRectApplyAffineTransform(NSRectToCGRect(srcRect), flip); /* When we use high-quality resampling to draw a tile, pixels from outside the tile may bleed in, causing graphics artifacts. Work around that. */ CGImageRef subimage = CGImageCreateWithImageInRect(image, flippedSourceRect); NSGraphicsContext *context = [NSGraphicsContext currentContext]; [context setCompositingOperation:op]; CGContextDrawImage([context graphicsPort], NSRectToCGRect(dstRect), subimage); CGImageRelease(subimage); } static errr Term_pict_cocoa(int x, int y, int n, const int *ap, const wchar_t *cp, const int *tap, const wchar_t *tcp) { /* Paranoia: Bail if we don't have a current graphics mode */ if (! current_graphics_mode) return -1; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; AngbandContext* angbandContext = Term->data; /* Indicate that we have a picture here (and hence this should not be overdrawn by Term_text_cocoa) */ angbandContext->charOverdrawCache[y * angbandContext->cols + x] = NO_OVERDRAW; /* Lock focus */ [angbandContext lockFocus]; NSRect destinationRect = [angbandContext rectInImageForTileAtX:x Y:y]; /* Expand the rect to every touching pixel to figure out what to redisplay */ NSRect redisplayRect = crack_rect(destinationRect, AngbandScaleIdentity, PUSH_RIGHT | PUSH_TOP | PUSH_BOTTOM | PUSH_LEFT); /* Expand our destinationRect */ destinationRect = crack_rect(destinationRect, AngbandScaleIdentity, push_options(x, y)); /* Scan the input */ int i; int graf_width = current_graphics_mode->cell_width; int graf_height = current_graphics_mode->cell_height; for (i = 0; i < n; i++) { int a = *ap++; wchar_t c = *cp++; int ta = *tap++; wchar_t tc = *tcp++; /* Graphics -- if Available and Needed */ if (use_graphics && (a & 0x80) && (c & 0x80)) { int col, row; int t_col, t_row; /* Primary Row and Col */ row = ((byte)a & 0x7F) % pict_rows; col = ((byte)c & 0x7F) % pict_cols; NSRect sourceRect; sourceRect.origin.x = col * graf_width; sourceRect.origin.y = row * graf_height; sourceRect.size.width = graf_width; sourceRect.size.height = graf_height; /* Terrain Row and Col */ t_row = ((byte)ta & 0x7F) % pict_rows; t_col = ((byte)tc & 0x7F) % pict_cols; NSRect terrainRect; terrainRect.origin.x = t_col * graf_width; terrainRect.origin.y = t_row * graf_height; terrainRect.size.width = graf_width; terrainRect.size.height = graf_height; /* Transparency effect. We really want to check current_graphics_mode->alphablend, but as of this writing that's never set, so we do something lame. */ //if (current_graphics_mode->alphablend) if (graf_width > 8 || graf_height > 8) { draw_image_tile(pict_image, terrainRect, destinationRect, NSCompositeCopy); draw_image_tile(pict_image, sourceRect, destinationRect, NSCompositeSourceOver); } else { draw_image_tile(pict_image, sourceRect, destinationRect, NSCompositeCopy); } } } [angbandContext unlockFocus]; [angbandContext setNeedsDisplayInBaseRect:redisplayRect]; [pool drain]; /* Success */ return (0); } /* * Low level graphics. Assumes valid input. * * Draw several ("n") chars, with an attr, at a given location. */ static errr Term_text_cocoa(int x, int y, int n, int a, const wchar_t *cp) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; /* Subpixel rendering looks really nice! Unfortunately, drawing a string like this: .@ causes subpixels to extend slightly into the region 'owned' by the period. This means that when the user presses right, those subpixels 'owned' by the period above do not get redrawn by Angband, so we leave little blue and red subpixel turds all over the screen. Turning off subpixel rendering fixes this, as does increasing the font advance by a pixel, but that is ugly. Our hack solution is to remember all of the characters we draw as well as their locations and colors (in charOverdrawCache), and then re-blit the previous and next character (if any). */ NSRect redisplayRect = NSZeroRect; AngbandContext* angbandContext = Term->data; /* record our data in our cache */ int start = y * angbandContext->cols + x; int location; for (location = 0; location < n; location++) { angbandContext->charOverdrawCache[start + location] = cp[location]; angbandContext->attrOverdrawCache[start + location] = a; } /* Focus on our layer */ [angbandContext lockFocus]; /* Starting pixel */ NSRect charRect = [angbandContext rectInImageForTileAtX:x Y:y]; const CGFloat tileWidth = angbandContext->tileSize.width; /* erase behind us */ unsigned leftPushOptions = push_options(x, y); unsigned rightPushOptions = push_options(x + n - 1, y); leftPushOptions &= ~ PUSH_RIGHT; rightPushOptions &= ~ PUSH_LEFT; switch (a / MAX_COLORS) { case BG_BLACK: [[NSColor blackColor] set]; break; case BG_SAME: set_color_for_index(a % MAX_COLORS); break; case BG_DARK: set_color_for_index(TERM_SHADE); break; } NSRect rectToClear = charRect; rectToClear.size.width = tileWidth * n; NSRectFill(crack_rect(rectToClear, AngbandScaleIdentity, leftPushOptions | rightPushOptions)); NSFont *selectionFont = [[angbandContext selectionFont] screenFont]; [selectionFont set]; /* Handle overdraws */ const int overdraws[2] = {x-1, x+n}; //left, right int i; for (i=0; i < 2; i++) { int overdrawX = overdraws[i]; // Nothing to overdraw if we're at an edge if (overdrawX >= 0 && (size_t)overdrawX < angbandContext->cols) { wchar_t previouslyDrawnVal = angbandContext->charOverdrawCache[y * angbandContext->cols + overdrawX]; int previouslyDrawnAttr = angbandContext->attrOverdrawCache[y * angbandContext->cols + overdrawX]; // Don't overdraw if it's not text if (previouslyDrawnVal != NO_OVERDRAW) { NSRect overdrawRect = [angbandContext rectInImageForTileAtX:overdrawX Y:y]; NSRect expandedRect = crack_rect(overdrawRect, AngbandScaleIdentity, push_options(overdrawX, y)); // Make sure we redisplay it switch (previouslyDrawnAttr / MAX_COLORS) { case BG_BLACK: [[NSColor blackColor] set]; break; case BG_SAME: set_color_for_index(previouslyDrawnAttr % MAX_COLORS); break; case BG_DARK: set_color_for_index(TERM_SHADE); break; } NSRectFill(expandedRect); redisplayRect = NSUnionRect(redisplayRect, expandedRect); // Redraw text if we have any if (previouslyDrawnVal != 0) { byte color = angbandContext->attrOverdrawCache[y * angbandContext->cols + overdrawX]; set_color_for_index(color); [angbandContext drawWChar:previouslyDrawnVal inRect:overdrawRect]; } } } } /* Set the color */ set_color_for_index(a % MAX_COLORS); /* Draw each */ NSRect rectToDraw = charRect; for (i=0; i < n; i++) { [angbandContext drawWChar:cp[i] inRect:rectToDraw]; rectToDraw.origin.x += tileWidth; } // Invalidate what we just drew NSRect drawnRect = charRect; drawnRect.size.width = tileWidth * n; redisplayRect = NSUnionRect(redisplayRect, drawnRect); [angbandContext unlockFocus]; [angbandContext setNeedsDisplayInBaseRect:redisplayRect]; [pool drain]; /* Success */ return (0); } /* From the Linux mbstowcs(3) man page: * If dest is NULL, n is ignored, and the conversion proceeds as above, * except that the converted wide characters are not written out to mem†* ory, and that no length limit exists. */ static size_t Term_mbcs_cocoa(wchar_t *dest, const char *src, int n) { int i; int count = 0; /* Unicode code point to UTF-8 * 0x0000-0x007f: 0xxxxxxx * 0x0080-0x07ff: 110xxxxx 10xxxxxx * 0x0800-0xffff: 1110xxxx 10xxxxxx 10xxxxxx * 0x10000-0x1fffff: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx * Note that UTF-16 limits Unicode to 0x10ffff. This code is not * endian-agnostic. */ for (i = 0; i < n || dest == NULL; i++) { if ((src[i] & 0x80) == 0) { if (dest != NULL) dest[count] = src[i]; if (src[i] == 0) break; } else if ((src[i] & 0xe0) == 0xc0) { if (dest != NULL) dest[count] = (((unsigned char)src[i] & 0x1f) << 6)| ((unsigned char)src[i+1] & 0x3f); i++; } else if ((src[i] & 0xf0) == 0xe0) { if (dest != NULL) dest[count] = (((unsigned char)src[i] & 0x0f) << 12) | (((unsigned char)src[i+1] & 0x3f) << 6) | ((unsigned char)src[i+2] & 0x3f); i += 2; } else if ((src[i] & 0xf8) == 0xf0) { if (dest != NULL) dest[count] = (((unsigned char)src[i] & 0x0f) << 18) | (((unsigned char)src[i+1] & 0x3f) << 12) | (((unsigned char)src[i+2] & 0x3f) << 6) | ((unsigned char)src[i+3] & 0x3f); i += 3; } else { /* Found an invalid multibyte sequence */ return (size_t)-1; } count++; } return count; } /* Post a nonsense event so that our event loop wakes up */ static void wakeup_event_loop(void) { /* Big hack - send a nonsense event to make us update */ NSEvent *event = [NSEvent otherEventWithType:NSApplicationDefined location:NSZeroPoint modifierFlags:0 timestamp:0 windowNumber:0 context:NULL subtype:AngbandEventWakeup data1:0 data2:0]; [NSApp postEvent:event atStart:NO]; } /* * Create and initialize window number "i" */ static term *term_data_link(int i) { NSArray *terminalDefaults = [[NSUserDefaults standardUserDefaults] valueForKey: AngbandTerminalsDefaultsKey]; NSInteger rows = 24; NSInteger columns = 80; if( i < (int)[terminalDefaults count] ) { NSDictionary *term = [terminalDefaults objectAtIndex: i]; rows = [[term valueForKey: AngbandTerminalRowsDefaultsKey] integerValue]; columns = [[term valueForKey: AngbandTerminalColumnsDefaultsKey] integerValue]; } /* Allocate */ term *newterm = ZNEW(term); /* Initialize the term */ term_init(newterm, columns, rows, 256 /* keypresses, for some reason? */); /* Differentiate between BS/^h, Tab/^i, etc. */ newterm->complex_input = TRUE; /* Use a "software" cursor */ newterm->soft_cursor = TRUE; /* Erase with "white space" */ newterm->attr_blank = TERM_WHITE; newterm->char_blank = ' '; /* Prepare the init/nuke hooks */ newterm->init_hook = Term_init_cocoa; newterm->nuke_hook = Term_nuke_cocoa; /* Prepare the function hooks */ newterm->xtra_hook = Term_xtra_cocoa; newterm->wipe_hook = Term_wipe_cocoa; newterm->curs_hook = Term_curs_cocoa; newterm->text_hook = Term_text_cocoa; newterm->pict_hook = Term_pict_cocoa; newterm->mbcs_hook = Term_mbcs_cocoa; /* Global pointer */ angband_term[i] = newterm; return newterm; } /* * Load preferences from preferences file for current host+current user+ * current application. */ static void load_prefs() { NSUserDefaults *defs = [NSUserDefaults angbandDefaults]; /* Make some default defaults */ NSMutableArray *defaultTerms = [[NSMutableArray alloc] init]; // the following default rows/cols were determined experimentally by first finding the ideal window/font size combinations. // but because of awful temporal coupling in Term_init_cocoa(), it's impossible to set up the defaults there, so we do it // this way. for( NSUInteger i = 0; i < ANGBAND_TERM_MAX; i++ ) { int columns, rows; BOOL visible = YES; switch( i ) { case 0: columns = 129; rows = 32; break; case 1: columns = 84; rows = 20; break; case 2: columns = 42; rows = 24; break; case 3: columns = 42; rows = 20; break; case 4: columns = 42; rows = 16; break; case 5: columns = 84; rows = 20; break; default: columns = 80; rows = 24; visible = NO; break; } NSDictionary *standardTerm = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt: rows], AngbandTerminalRowsDefaultsKey, [NSNumber numberWithInt: columns], AngbandTerminalColumnsDefaultsKey, [NSNumber numberWithBool: visible], AngbandTerminalVisibleDefaultsKey, nil]; [defaultTerms addObject: standardTerm]; } NSDictionary *defaults = [[NSDictionary alloc] initWithObjectsAndKeys: @"Menlo", @"FontName", [NSNumber numberWithFloat:13.f], @"FontSize", [NSNumber numberWithInt:60], @"FramesPerSecond", [NSNumber numberWithBool:YES], @"AllowSound", [NSNumber numberWithInt:GRAPHICS_NONE], @"GraphicsID", defaultTerms, AngbandTerminalsDefaultsKey, nil]; [defs registerDefaults:defaults]; [defaults release]; [defaultTerms release]; /* preferred graphics mode */ graf_mode_req = [defs integerForKey:@"GraphicsID"]; /* use sounds */ allow_sounds = [defs boolForKey:@"AllowSound"]; /* fps */ frames_per_second = [[NSUserDefaults angbandDefaults] integerForKey:@"FramesPerSecond"]; /* font */ default_font = [[NSFont fontWithName:[defs valueForKey:@"FontName-0"] size:[defs floatForKey:@"FontSize-0"]] retain]; if (! default_font) default_font = [[NSFont fontWithName:@"Menlo" size:13.] retain]; } /* Arbitary limit on number of possible samples per event */ #define MAX_SAMPLES 16 /* Struct representing all data for a set of event samples */ typedef struct { int num; /* Number of available samples for this event */ NSSound *sound[MAX_SAMPLES]; } sound_sample_list; /* Array of event sound structs */ static sound_sample_list samples[MSG_MAX]; /* * Load sound effects based on sound.cfg within the xtra/sound directory; * bridge to Cocoa to use NSSound for simple loading and playback, avoiding * I/O latency by cacheing all sounds at the start. Inherits full sound * format support from Quicktime base/plugins. * pelpel favoured a plist-based parser for the future but .cfg support * improves cross-platform compatibility. */ static void load_sounds(void) { char path[2048]; char buffer[2048]; ang_file *fff; /* Build the "sound" path */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "sound"); ANGBAND_DIR_XTRA_SOUND = string_make(path); /* Find and open the config file */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_SOUND, "sound.cfg"); fff = file_open(path, MODE_READ, -1); /* Handle errors */ if (!fff) { NSLog(@"The sound configuration file could not be opened."); return; } /* Instantiate an autorelease pool for use by NSSound */ NSAutoreleasePool *autorelease_pool; autorelease_pool = [[NSAutoreleasePool alloc] init]; /* Use a dictionary to unique sounds, so we can share NSSounds across multiple events */ NSMutableDictionary *sound_dict = [NSMutableDictionary dictionary]; /* * This loop may take a while depending on the count and size of samples * to load. */ /* Parse the file */ /* Lines are always of the form "name = sample [sample ...]" */ while (file_getl(fff, buffer, sizeof(buffer))) { char *msg_name; char *cfg_sample_list; char *search; char *cur_token; char *next_token; int event; /* Skip anything not beginning with an alphabetic character */ if (!buffer[0] || !isalpha((unsigned char)buffer[0])) continue; /* Split the line into two: message name, and the rest */ search = strchr(buffer, ' '); cfg_sample_list = strchr(search + 1, ' '); if (!search) continue; if (!cfg_sample_list) continue; /* Set the message name, and terminate at first space */ msg_name = buffer; search[0] = '\0'; /* Make sure this is a valid event name */ event = message_lookup_by_sound_name(msg_name); if (event < 0) continue; /* Advance the sample list pointer so it's at the beginning of text */ cfg_sample_list++; if (!cfg_sample_list[0]) continue; /* Terminate the current token */ cur_token = cfg_sample_list; search = strchr(cur_token, ' '); if (search) { search[0] = '\0'; next_token = search + 1; } else { next_token = NULL; } /* * Now we find all the sample names and add them one by one */ while (cur_token) { int num = samples[event].num; /* Don't allow too many samples */ if (num >= MAX_SAMPLES) break; NSString *token_string = [NSString stringWithUTF8String:cur_token]; NSSound *sound = [sound_dict objectForKey:token_string]; if (! sound) { /* We have to load the sound. Build the path to the sample */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_SOUND, cur_token); if (file_exists(path)) { /* Load the sound into memory */ sound = [[[NSSound alloc] initWithContentsOfFile:[NSString stringWithUTF8String:path] byReference:YES] autorelease]; if (sound) [sound_dict setObject:sound forKey:token_string]; } } /* Store it if we loaded it */ if (sound) { samples[event].sound[num] = [sound retain]; /* Imcrement the sample count */ samples[event].num++; } /* Figure out next token */ cur_token = next_token; if (next_token) { /* Try to find a space */ search = strchr(cur_token, ' '); /* If we can find one, terminate, and set new "next" */ if (search) { search[0] = '\0'; next_token = search + 1; } else { /* Otherwise prevent infinite looping */ next_token = NULL; } } } } /* Release the autorelease pool */ [autorelease_pool release]; /* Close the file */ file_close(fff); } /* * Play sound effects asynchronously. Select a sound from any available * for the required event, and bridge to Cocoa to play it. */ static void play_sound(int event) { /* Maybe block it */ if (! allow_sounds) return; /* Paranoia */ if (event < 0 || event >= MSG_MAX) return; /* Load sounds just-in-time (once) */ static BOOL loaded = NO; if (! loaded) { loaded = YES; load_sounds(); } /* Check there are samples for this event */ if (!samples[event].num) return; /* Instantiate an autorelease pool for use by NSSound */ NSAutoreleasePool *autorelease_pool; autorelease_pool = [[NSAutoreleasePool alloc] init]; /* Choose a random event */ int s = randint0(samples[event].num); /* Stop the sound if it's currently playing */ if ([samples[event].sound[s] isPlaying]) [samples[event].sound[s] stop]; /* Play the sound */ [samples[event].sound[s] play]; /* Release the autorelease pool */ [autorelease_pool drain]; } /* * */ static void init_windows(void) { /* Create the main window */ term *primary = term_data_link(0); /* Prepare to create any additional windows */ int i; for (i=1; i < ANGBAND_TERM_MAX; i++) { term_data_link(i); } /* Activate the primary term */ Term_activate(primary); } /* * Run the event loop and return a gameplay status to init_angband */ static errr get_cmd_init(void) { if (cmd.command == CMD_NULL) { /* Prompt the user */ prt("[Choose 'New' or 'Open' from the 'File' menu]", 23, 17); Term_fresh(); while (cmd.command == CMD_NULL) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantFuture] inMode:NSDefaultRunLoopMode dequeue:YES]; if (event) [NSApp sendEvent:event]; [pool drain]; } } /* Push the command to the game. */ cmd_insert_s(&cmd); return 0; } /* Return a command */ static errr cocoa_get_cmd(cmd_context context, bool wait) { if (context == CMD_INIT) return get_cmd_init(); else return textui_get_cmd(context, wait); } /* Return the directory into which we put data (save and config) */ static NSString *get_data_directory(void) { return [@"~/Documents/Angband/" stringByExpandingTildeInPath]; } /* * Handle the "open_when_ready" flag */ static void handle_open_when_ready(void) { /* Check the flag XXX XXX XXX make a function for this */ if (open_when_ready && initialized && !game_in_progress) { /* Forget */ open_when_ready = FALSE; /* Game is in progress */ game_in_progress = TRUE; /* Wait for a keypress */ pause_line(Term); } } /* * Handle quit_when_ready, by Peter Ammon, * slightly modified to check inkey_flag. */ static void quit_calmly(void) { /* Quit immediately if game's not started */ if (!game_in_progress || !character_generated) quit(NULL); /* Save the game and Quit (if it's safe) */ if (inkey_flag) { /* Hack -- Forget messages */ msg_flag = FALSE; /* Save the game */ do_cmd_save_game(FALSE, 0); record_current_savefile(); /* Quit */ quit(NULL); } /* Wait until inkey_flag is set */ } /* returns YES if we contain an AngbandView (and hence should direct our events to Angband) */ static BOOL contains_angband_view(NSView *view) { if ([view isKindOfClass:[AngbandView class]]) return YES; for (NSView *subview in [view subviews]) { if (contains_angband_view(subview)) return YES; } return NO; } /** * Queue mouse presses if they occur in the map section of the main window. */ static void AngbandHandleEventMouseDown( NSEvent *event ) { AngbandContext *angbandContext = [[[event window] contentView] angbandContext]; AngbandContext *mainAngbandContext = angband_term[0]->data; if (mainAngbandContext->primaryWindow && [[event window] windowNumber] == [mainAngbandContext->primaryWindow windowNumber]) { int cols, rows, x, y; Term_get_size(&cols, &rows); NSSize tileSize = angbandContext->tileSize; NSSize border = angbandContext->borderSize; NSPoint windowPoint = [event locationInWindow]; // adjust for border; add border height because window origin is at bottom windowPoint = NSMakePoint( windowPoint.x - border.width, windowPoint.y + border.height ); NSPoint p = [[[event window] contentView] convertPoint: windowPoint fromView: nil]; x = floor( p.x / tileSize.width ); y = floor( p.y / tileSize.height ); // being safe about this, since xcode doesn't seem to like the bool_hack stuff BOOL displayingMapInterface = ((int)inkey_flag != 0); // Sidebar plus border == thirteen characters; top row is reserved. // Coordinates run from (0,0) to (cols-1, rows-1). BOOL mouseInMapSection = (x > 13 && x <= cols - 1 && y > 0 && y <= rows - 2); // if we are displaying a menu, allow clicks anywhere; if we are displaying the main // game interface, only allow clicks in the map section if (!displayingMapInterface || (displayingMapInterface && mouseInMapSection)) { // [event buttonNumber] will return 0 for left click, 1 for right click, but this is safer int button = ([event type] == NSLeftMouseDown) ? 1 : 2; #ifdef KC_MOD_ALT NSUInteger eventModifiers = [event modifierFlags]; byte angbandModifiers = 0; angbandModifiers |= (eventModifiers & NSShiftKeyMask) ? KC_MOD_SHIFT : 0; angbandModifiers |= (eventModifiers & NSControlKeyMask) ? KC_MOD_CONTROL : 0; angbandModifiers |= (eventModifiers & NSAlternateKeyMask) ? KC_MOD_ALT : 0; button |= (angbandModifiers & 0x0F) << 4; // encode modifiers in the button number (see Term_mousepress()) #endif Term_mousepress(x, y, button); } } /* Pass click through to permit focus change, resize, etc. */ [NSApp sendEvent:event]; } /* Encodes an NSEvent Angband-style, or forwards it along. Returns YES if the event was sent to Angband, NO if Cocoa (or nothing) handled it */ static BOOL send_event(NSEvent *event) { /* If the receiving window is not an Angband window, then do nothing */ if (! contains_angband_view([[event window] contentView])) { [NSApp sendEvent:event]; return NO; } /* Analyze the event */ switch ([event type]) { case NSKeyDown: { /* Try performing a key equivalent */ if ([[NSApp mainMenu] performKeyEquivalent:event]) break; unsigned modifiers = [event modifierFlags]; /* Send all NSCommandKeyMasks through */ if (modifiers & NSCommandKeyMask) { [NSApp sendEvent:event]; break; } if (! [[event characters] length]) break; /* Extract some modifiers */ int mc = !! (modifiers & NSControlKeyMask); int ms = !! (modifiers & NSShiftKeyMask); int mo = !! (modifiers & NSAlternateKeyMask); int mx = !! (modifiers & NSCommandKeyMask); int kp = !! (modifiers & NSNumericPadKeyMask); /* Get the Angband char corresponding to this unichar */ unichar c = [[event characters] characterAtIndex:0]; keycode_t ch; switch (c) { /* Note that NSNumericPadKeyMask is set if any of the arrow * keys are pressed. We don't want KC_MOD_KEYPAD set for * those. See #1662 for more details. */ case NSUpArrowFunctionKey: ch = ARROW_UP; kp = 0; break; case NSDownArrowFunctionKey: ch = ARROW_DOWN; kp = 0; break; case NSLeftArrowFunctionKey: ch = ARROW_LEFT; kp = 0; break; case NSRightArrowFunctionKey: ch = ARROW_RIGHT; kp = 0; break; case NSF1FunctionKey: ch = KC_F1; break; case NSF2FunctionKey: ch = KC_F2; break; case NSF3FunctionKey: ch = KC_F3; break; case NSF4FunctionKey: ch = KC_F4; break; case NSF5FunctionKey: ch = KC_F5; break; case NSF6FunctionKey: ch = KC_F6; break; case NSF7FunctionKey: ch = KC_F7; break; case NSF8FunctionKey: ch = KC_F8; break; case NSF9FunctionKey: ch = KC_F9; break; case NSF10FunctionKey: ch = KC_F10; break; case NSF11FunctionKey: ch = KC_F11; break; case NSF12FunctionKey: ch = KC_F12; break; case NSF13FunctionKey: ch = KC_F13; break; case NSF14FunctionKey: ch = KC_F14; break; case NSF15FunctionKey: ch = KC_F15; break; case NSHelpFunctionKey: ch = KC_HELP; break; case NSHomeFunctionKey: ch = KC_HOME; break; case NSPageUpFunctionKey: ch = KC_PGUP; break; case NSPageDownFunctionKey: ch = KC_PGDOWN; break; case NSBeginFunctionKey: ch = KC_BEGIN; break; case NSEndFunctionKey: ch = KC_END; break; case NSInsertFunctionKey: ch = KC_INSERT; break; case NSDeleteFunctionKey: ch = KC_DELETE; break; case NSPauseFunctionKey: ch = KC_PAUSE; break; case NSBreakFunctionKey: ch = KC_BREAK; break; default: if (c <= 0x7F) ch = (char)c; else ch = '\0'; break; } /* override special keys */ switch([event keyCode]) { case kVK_Return: ch = KC_ENTER; break; case kVK_Escape: ch = ESCAPE; break; case kVK_Tab: ch = KC_TAB; break; case kVK_Delete: ch = KC_BACKSPACE; break; case kVK_ANSI_KeypadEnter: ch = KC_ENTER; kp = TRUE; break; } /* Hide the mouse pointer */ [NSCursor setHiddenUntilMouseMoves:YES]; /* Enqueue it */ if (ch != '\0') { /* Enqueue the keypress */ #ifdef KC_MOD_ALT byte mods = 0; if (mo) mods |= KC_MOD_ALT; if (mx) mods |= KC_MOD_META; if (mc && MODS_INCLUDE_CONTROL(ch)) mods |= KC_MOD_CONTROL; if (ms && MODS_INCLUDE_SHIFT(ch)) mods |= KC_MOD_SHIFT; if (kp) mods |= KC_MOD_KEYPAD; Term_keypress(ch, mods); #else Term_keypress(ch); #endif } break; } case NSLeftMouseDown: case NSRightMouseDown: AngbandHandleEventMouseDown(event); break; case NSApplicationDefined: { if ([event subtype] == AngbandEventWakeup) { return YES; } break; } default: [NSApp sendEvent:event]; return YES; } return YES; } /* * Check for Events, return TRUE if we process any */ static BOOL check_events(int wait) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; /* Handles the quit_when_ready flag */ if (quit_when_ready) quit_calmly(); NSDate* endDate; if (wait == CHECK_EVENTS_WAIT) endDate = [NSDate distantFuture]; else endDate = [NSDate distantPast]; NSEvent* event; for (;;) { if (quit_when_ready) { /* send escape events until we quit */ Term_keypress(0x1B, 0); [pool drain]; return false; } else { event = [NSApp nextEventMatchingMask:-1 untilDate:endDate inMode:NSDefaultRunLoopMode dequeue:YES]; static BOOL periodicStarted = NO; if (OPT(animate_flicker) && !periodicStarted) { [NSEvent startPeriodicEventsAfterDelay: 0.0 withPeriod: 0.2]; periodicStarted = YES; } else if (!OPT(animate_flicker) && periodicStarted) { [NSEvent stopPeriodicEvents]; periodicStarted = NO; } if (OPT(animate_flicker) && wait && periodicStarted && [event type] == NSPeriodic) idle_update(); if (! event) { [pool drain]; return FALSE; } if (send_event(event)) break; } } [pool drain]; /* Something happened */ return YES; } /* * Hook to tell the user something important */ static void hook_plog(const char * str) { if (str) { NSString *string = [NSString stringWithCString:str encoding:NSMacOSRomanStringEncoding]; NSRunAlertPanel(@"Danger Will Robinson", @"%@", @"OK", nil, nil, string); } } /* * Hook to tell the user something, and then quit */ static void hook_quit(const char * str) { plog(str); exit(0); } /* Set HFS file type and creator codes on a path */ static void cocoa_file_open_hook(const char *path, file_type ftype) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSString *pathString = [NSString stringWithUTF8String:path]; if (pathString) { u32b mac_type = 'TEXT'; if (ftype == FTYPE_RAW) mac_type = 'DATA'; else if (ftype == FTYPE_SAVE) mac_type = 'SAVE'; NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedLong:mac_type], NSFileHFSTypeCode, [NSNumber numberWithUnsignedLong:ANGBAND_CREATOR], NSFileHFSCreatorCode, nil]; [[NSFileManager defaultManager] setAttributes:attrs ofItemAtPath:pathString error:NULL]; } [pool drain]; } /* A platform-native file save dialogue box, e.g. for saving character dumps */ static bool cocoa_get_file(const char *suggested_name, char *path, size_t len) { NSSavePanel *panel = [NSSavePanel savePanel]; NSString *directory = [NSString stringWithCString:ANGBAND_DIR_USER encoding:NSASCIIStringEncoding]; NSString *filename = [NSString stringWithCString:suggested_name encoding:NSASCIIStringEncoding]; if ([panel runModalForDirectory:directory file:filename] == NSOKButton) { const char *p = [[[panel URL] path] UTF8String]; my_strcpy(path, p, len); return TRUE; } return FALSE; } /*** Main program ***/ @interface AngbandAppDelegate : NSObject { IBOutlet NSMenu *terminalsMenu; NSMenu *_commandMenu; NSDictionary *_commandMenuTagMap; } @property (nonatomic, retain) IBOutlet NSMenu *commandMenu; @property (nonatomic, retain) NSDictionary *commandMenuTagMap; - (IBAction)newGame:sender; - (IBAction)editFont:sender; - (IBAction)openGame:sender; - (IBAction)selectWindow: (id)sender; @end @implementation AngbandAppDelegate @synthesize commandMenu=_commandMenu; @synthesize commandMenuTagMap=_commandMenuTagMap; - (IBAction)newGame:sender { /* Game is in progress */ game_in_progress = TRUE; cmd.command = CMD_NEWGAME; } - (IBAction)editFont:sender { NSFontPanel *panel = [NSFontPanel sharedFontPanel]; NSFont *termFont = default_font; int i; for (i=0; i < ANGBAND_TERM_MAX; i++) { if ([(id)angband_term[i]->data isMainWindow]) { termFont = [(id)angband_term[i]->data selectionFont]; break; } } [panel setPanelFont:termFont isMultiple:NO]; [panel orderFront:self]; } - (void)changeFont:(id)sender { int mainTerm; for (mainTerm=0; mainTerm < ANGBAND_TERM_MAX; mainTerm++) { if ([(id)angband_term[mainTerm]->data isMainWindow]) { break; } } /* Bug #1709: Only change font for angband windows */ if (mainTerm == ANGBAND_TERM_MAX) return; NSFont *oldFont = default_font; NSFont *newFont = [sender convertFont:oldFont]; if (! newFont) return; //paranoia /* Store as the default font if we changed the first term */ if (mainTerm == 0) { [newFont retain]; [default_font release]; default_font = newFont; } /* Record it in the preferences */ NSUserDefaults *defs = [NSUserDefaults angbandDefaults]; [defs setValue:[newFont fontName] forKey:[NSString stringWithFormat:@"FontName-%d", mainTerm]]; [defs setFloat:[newFont pointSize] forKey:[NSString stringWithFormat:@"FontSize-%d", mainTerm]]; [defs synchronize]; NSDisableScreenUpdates(); /* Update window */ AngbandContext *angbandContext = angband_term[mainTerm]->data; [(id)angbandContext setSelectionFont:newFont adjustTerminal: YES]; NSEnableScreenUpdates(); } - (IBAction)openGame:sender { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; BOOL selectedSomething = NO; int panelResult; NSString* startingDirectory; /* Get where we think the save files are */ startingDirectory = [get_data_directory() stringByAppendingPathComponent:@"/save/"]; /* Get what we think the default save file name is. Deafult to the empty string. */ NSString *savefileName = [[NSUserDefaults angbandDefaults] stringForKey:@"SaveFile"]; if (! savefileName) savefileName = @""; /* Set up an open panel */ NSOpenPanel* panel = [NSOpenPanel openPanel]; [panel setCanChooseFiles:YES]; [panel setCanChooseDirectories:NO]; [panel setResolvesAliases:YES]; [panel setAllowsMultipleSelection:YES]; [panel setTreatsFilePackagesAsDirectories:YES]; /* Run it */ panelResult = [panel runModalForDirectory:startingDirectory file:savefileName types:nil]; if (panelResult == NSOKButton) { NSArray* filenames = [panel filenames]; if ([filenames count] > 0) { selectedSomething = [[filenames objectAtIndex:0] getFileSystemRepresentation:savefile maxLength:sizeof savefile]; } } if (selectedSomething) { /* Remember this so we can select it by default next time */ record_current_savefile(); /* Game is in progress */ game_in_progress = TRUE; cmd.command = CMD_LOADFILE; } [pool drain]; } - (IBAction)saveGame:sender { /* Hack -- Forget messages */ msg_flag = FALSE; /* Save the game */ do_cmd_save_game(FALSE, 0); /* Record the current save file so we can select it by default next time. It's a little sketchy that this only happens when we save through the menu; ideally game-triggered saves would trigger it too. */ record_current_savefile(); } - (BOOL)validateMenuItem:(NSMenuItem *)menuItem { SEL sel = [menuItem action]; NSInteger tag = [menuItem tag]; if( tag >= AngbandWindowMenuItemTagBase && tag < AngbandWindowMenuItemTagBase + ANGBAND_TERM_MAX ) { if( tag == AngbandWindowMenuItemTagBase ) { // the main window should always be available and visible return YES; } else { NSInteger subwindowNumber = tag - AngbandWindowMenuItemTagBase; return (op_ptr->window_flag[subwindowNumber] > 0); } return NO; } if (sel == @selector(newGame:)) { return ! game_in_progress; } else if (sel == @selector(editFont:)) { return YES; } else if (sel == @selector(openGame:)) { return ! game_in_progress; } else if (sel == @selector(setRefreshRate:) && [superitem(menuItem) tag] == 150) { NSInteger fps = [[NSUserDefaults standardUserDefaults] integerForKey: @"FramesPerSecond"]; [menuItem setState: ([menuItem tag] == fps)]; return YES; } else if( sel == @selector(setGraphicsMode:) ) { NSInteger requestedGraphicsMode = [[NSUserDefaults standardUserDefaults] integerForKey: @"GraphicsID"]; [menuItem setState: (tag == requestedGraphicsMode)]; return YES; } else if( sel == @selector(sendAngbandCommand:) ) { // we only want to be able to send commands during an active game return !!game_in_progress; } else return YES; } - (IBAction)setRefreshRate:(NSMenuItem *)menuItem { frames_per_second = [menuItem tag]; [[NSUserDefaults angbandDefaults] setInteger:frames_per_second forKey:@"FramesPerSecond"]; } - (IBAction)selectWindow: (id)sender { NSInteger subwindowNumber = [(NSMenuItem *)sender tag] - AngbandWindowMenuItemTagBase; AngbandContext *context = angband_term[subwindowNumber]->data; [context->primaryWindow makeKeyAndOrderFront: self]; [context saveWindowVisibleToDefaults: YES]; } - (void)prepareWindowsMenu { // get the window menu with default items and add a separator and item for the main window NSMenu *windowsMenu = [[NSApplication sharedApplication] windowsMenu]; [windowsMenu addItem: [NSMenuItem separatorItem]]; NSMenuItem *angbandItem = [[NSMenuItem alloc] initWithTitle: @"Angband" action: @selector(selectWindow:) keyEquivalent: @"0"]; [angbandItem setTarget: self]; [angbandItem setTag: AngbandWindowMenuItemTagBase]; [windowsMenu addItem: angbandItem]; [angbandItem release]; // add items for the additional term windows for( NSInteger i = 1; i < ANGBAND_TERM_MAX; i++ ) { NSString *title = [NSString stringWithFormat: @"Term %ld", (long)i]; NSMenuItem *windowItem = [[NSMenuItem alloc] initWithTitle: title action: @selector(selectWindow:) keyEquivalent: @""]; [windowItem setTarget: self]; [windowItem setTag: AngbandWindowMenuItemTagBase + i]; [windowsMenu addItem: windowItem]; [windowItem release]; } } /** * Send a command to Angband via a menu item. This places the appropriate key down events into the queue * so that it seems like the user pressed them (instead of trying to use the term directly). */ - (void)sendAngbandCommand: (id)sender { NSMenuItem *menuItem = (NSMenuItem *)sender; NSString *command = [self.commandMenuTagMap objectForKey: [NSNumber numberWithInteger: [menuItem tag]]]; NSInteger windowNumber = [((AngbandContext *)angband_term[0]->data)->primaryWindow windowNumber]; // send a \ to bypass keymaps NSEvent *escape = [NSEvent keyEventWithType: NSKeyDown location: NSZeroPoint modifierFlags: 0 timestamp: 0.0 windowNumber: windowNumber context: nil characters: @"\\" charactersIgnoringModifiers: @"\\" isARepeat: NO keyCode: 0]; [[NSApplication sharedApplication] postEvent: escape atStart: NO]; // send the actual command (from the original command set) NSEvent *keyDown = [NSEvent keyEventWithType: NSKeyDown location: NSZeroPoint modifierFlags: 0 timestamp: 0.0 windowNumber: windowNumber context: nil characters: command charactersIgnoringModifiers: command isARepeat: NO keyCode: 0]; [[NSApplication sharedApplication] postEvent: keyDown atStart: NO]; } /** * Set up the command menu dynamically, based on CommandMenu.plist. */ - (void)prepareCommandMenu { NSString *commandMenuPath = [[NSBundle mainBundle] pathForResource: @"CommandMenu" ofType: @"plist"]; NSArray *commandMenuItems = [[NSArray alloc] initWithContentsOfFile: commandMenuPath]; NSMutableDictionary *angbandCommands = [[NSMutableDictionary alloc] init]; NSInteger tagOffset = 0; for( NSDictionary *item in commandMenuItems ) { BOOL useShiftModifier = [[item valueForKey: @"ShiftModifier"] boolValue]; BOOL useOptionModifier = [[item valueForKey: @"OptionModifier"] boolValue]; NSUInteger keyModifiers = NSCommandKeyMask; keyModifiers |= (useShiftModifier) ? NSShiftKeyMask : 0; keyModifiers |= (useOptionModifier) ? NSAlternateKeyMask : 0; NSString *title = [item valueForKey: @"Title"]; NSString *key = [item valueForKey: @"KeyEquivalent"]; NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle: title action: @selector(sendAngbandCommand:) keyEquivalent: key]; [menuItem setTarget: self]; [menuItem setKeyEquivalentModifierMask: keyModifiers]; [menuItem setTag: AngbandCommandMenuItemTagBase + tagOffset]; [self.commandMenu addItem: menuItem]; [menuItem release]; NSString *angbandCommand = [item valueForKey: @"AngbandCommand"]; [angbandCommands setObject: angbandCommand forKey: [NSNumber numberWithInteger: [menuItem tag]]]; tagOffset++; } [commandMenuItems release]; NSDictionary *safeCommands = [[NSDictionary alloc] initWithDictionary: angbandCommands]; self.commandMenuTagMap = safeCommands; [safeCommands release]; [angbandCommands release]; } - (void)awakeFromNib { [super awakeFromNib]; [self prepareWindowsMenu]; [self prepareCommandMenu]; } - (void)applicationDidFinishLaunching:sender { [AngbandContext beginGame]; //once beginGame finished, the game is over - that's how Angband works, and we should quit game_is_finished = TRUE; [NSApp terminate:self]; } - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { if (p_ptr->playing == FALSE || game_is_finished == TRUE) { return NSTerminateNow; } else if (! inkey_flag) { /* For compatibility with other ports, do not quit in this case */ return NSTerminateCancel; } else { cmd_insert(CMD_QUIT); /* Post an escape event so that we can return from our get-key-event function */ wakeup_event_loop(); quit_when_ready = true; // must return Cancel, not Later, because we need to get out of the run loop and back to Angband's loop return NSTerminateCancel; } } /* Dynamically build the Graphics menu */ - (void)menuNeedsUpdate:(NSMenu *)menu { /* Only the graphics menu is dynamic */ if (! [[menu title] isEqualToString:@"Graphics"]) return; /* If it's non-empty, then we've already built it. Currently graphics modes won't change once created; if they ever can we can remove this check. Note that the check mark does change, but that's handled in validateMenuItem: instead of menuNeedsUpdate: */ if ([menu numberOfItems] > 0) return; /* This is the action for all these menu items */ SEL action = @selector(setGraphicsMode:); /* Add an initial Classic ASCII menu item */ NSMenuItem *item = [menu addItemWithTitle:@"Classic ASCII" action:action keyEquivalent:@""]; [item setTag:GRAPHICS_NONE]; /* Walk through the list of graphics modes */ NSInteger i; for (i=0; graphics_modes[i].pNext; i++) { const graphics_mode *graf = &graphics_modes[i]; /* Make the title. NSMenuItem throws on a nil title, so ensure it's not nil. */ NSString *title = [[NSString alloc] initWithUTF8String:graf->menuname]; if (! title) title = [@"(Unknown)" copy]; /* Make the item */ NSMenuItem *item = [menu addItemWithTitle:title action:action keyEquivalent:@""]; [item setTag:graf->grafID]; } } /* Delegate method that gets called if we're asked to open a file. */ - (BOOL)application:(NSApplication *)sender openFiles:(NSArray *)filenames { /* Can't open a file once we've started */ if (game_in_progress) return NO; /* We can only open one file. Use the last one. */ NSString *file = [filenames lastObject]; if (! file) return NO; /* Put it in savefile */ if (! [file getFileSystemRepresentation:savefile maxLength:sizeof savefile]) return NO; /* Success, remember to load it */ cmd.command = CMD_LOADFILE; /* Wake us up in case this arrives while we're sitting at the Welcome screen! */ wakeup_event_loop(); return YES; } @end int main(int argc, char* argv[]) { NSApplicationMain(argc, (void*)argv); return (0); } #endif /* MACINTOSH || MACH_O_CARBON */ angband-3.5.1/src/option.h0000644000175000017500000000572012456456606014714 0ustar chriscchrisc#ifndef INCLUDED_OPTIONS_H #define INCLUDED_OPTIONS_H /*** Functions ***/ /** Given an option index, return its name */ const char *option_name(int opt); /** Given an option index, return its description */ const char *option_desc(int opt); /** Set an an option, return TRUE if successful */ bool option_set(const char *opt, int val); /** Reset options to defaults */ void option_set_defaults(void); /** Write options to file */ void option_dump(ang_file *f); /*** Option display definitions ***/ /* * Information for "do_cmd_options()". */ #define OPT_PAGE_MAX 3 #define OPT_PAGE_PER 20 #define OPT_PAGE_BIRTH 1 /* The option data structures */ extern const int option_page[OPT_PAGE_MAX][OPT_PAGE_PER]; /*** Option definitions ***/ /* * Option indexes (offsets) * * These values are hard-coded by savefiles (and various pieces of code). Ick. */ #define OPT_CHEAT 30 #define OPT_SCORE 40 #define OPT_BIRTH 50 #define OPT_NONE 89 #define OPT_MAX 90 #define N_OPTS_CHEAT 6 #define N_OPTS_BIRTH 16 /* * Option indexes (hard-coded by savefiles) */ #define OPT_rogue_like_commands 0 #define OPT_use_sound 1 #define OPT_show_damage 2 #define OPT_use_old_target 3 #define OPT_pickup_always 4 #define OPT_pickup_inven 5 #define OPT_show_flavors 6 #define OPT_show_target 7 #define OPT_disturb_near 8 /* XXX 9 */ /* XXX 10 */ #define OPT_solid_walls 11 #define OPT_hybrid_walls 12 #define OPT_view_yellow_light 13 /* XXX 14 */ #define OPT_animate_flicker 15 #define OPT_center_player 16 #define OPT_purple_uniques 17 #define OPT_auto_more 19 #define OPT_hp_changes_color 20 #define OPT_mouse_movement 21 /* XXX 22 */ #define OPT_notify_recharge 23 #define OPT_cheat_hear (OPT_CHEAT+1) #define OPT_cheat_room (OPT_CHEAT+2) #define OPT_cheat_xtra (OPT_CHEAT+3) #define OPT_cheat_know (OPT_CHEAT+4) #define OPT_cheat_live (OPT_CHEAT+5) #define OPT_score_hear (OPT_SCORE+1) #define OPT_score_room (OPT_SCORE+2) #define OPT_score_xtra (OPT_SCORE+3) #define OPT_score_know (OPT_SCORE+4) #define OPT_score_live (OPT_SCORE+5) /* #define OPT_birth_maximize (OPT_BIRTH+0) */ #define OPT_birth_randarts (OPT_BIRTH+1) #define OPT_birth_no_recall (OPT_BIRTH+2) #define OPT_birth_small_range (OPT_BIRTH+3) #define OPT_birth_no_artifacts (OPT_BIRTH+4) #define OPT_birth_no_stacking (OPT_BIRTH+5) #define OPT_birth_no_preserve (OPT_BIRTH+6) #define OPT_birth_no_stairs (OPT_BIRTH+7) #define OPT_birth_no_feelings (OPT_BIRTH+8) #define OPT_birth_no_selling (OPT_BIRTH+9) #define OPT_birth_keep_randarts (OPT_BIRTH+10) #define OPT_birth_start_kit (OPT_BIRTH+11) /* #define OPT_birth_ai_packs (OPT_BIRTH+12) */ #define OPT_birth_ai_learn (OPT_BIRTH+13) /* #define OPT_birth_ai_cheat (OPT_BIRTH+14) */ #define OPT_birth_force_descend (OPT_BIRTH+15) #define OPT(opt_name) op_ptr->opt[OPT_##opt_name] #endif /* !INCLUDED_OPTIONS_H */ angband-3.5.1/src/prefs.c0000644000175000017500000006413312456456606014521 0ustar chriscchrisc/* * File: prefs.c * Purpose: Pref file handling code * * Copyright (c) 2003 Takeshi Mogami, Robert Ruehlmann * Copyright (c) 2007 Pete Mack * Copyright (c) 2010 Andi Sidwell * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "keymap.h" #include "prefs.h" #include "squelch.h" #include "spells.h" /*** Pref file saving code ***/ /* * Header and footer marker string for pref file dumps */ static const char *dump_separator = "#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#"; /* * Remove old lines from pref files * * If you are using setgid, make sure privileges were raised prior * to calling this. */ static void remove_old_dump(const char *cur_fname, const char *mark) { bool between_marks = FALSE; bool changed = FALSE; bool skip_one = FALSE; char buf[1024]; char start_line[1024]; char end_line[1024]; char new_fname[1024]; ang_file *new_file; ang_file *cur_file; /* Format up some filenames */ strnfmt(new_fname, sizeof(new_fname), "%s.new", cur_fname); /* Work out what we expect to find */ strnfmt(start_line, sizeof(start_line), "%s begin %s", dump_separator, mark); strnfmt(end_line, sizeof(end_line), "%s end %s", dump_separator, mark); /* Open current file */ cur_file = file_open(cur_fname, MODE_READ, FTYPE_TEXT); if (!cur_file) return; /* Open new file */ new_file = file_open(new_fname, MODE_WRITE, FTYPE_TEXT); if (!new_file) { msg("Failed to create file %s", new_fname); return; } /* Loop for every line */ while (file_getl(cur_file, buf, sizeof(buf))) { /* If we find the start line, turn on */ if (!strcmp(buf, start_line)) between_marks = TRUE; /* If we find the finish line, turn off */ else if (!strcmp(buf, end_line)) { between_marks = FALSE; skip_one = TRUE; changed = TRUE; } if (!between_marks && !skip_one) file_putf(new_file, "%s\n", buf); skip_one = FALSE; } /* Close files */ file_close(cur_file); file_close(new_file); /* If there are changes, move things around */ if (changed) { char old_fname[1024]; strnfmt(old_fname, sizeof(old_fname), "%s.old", cur_fname); if (file_move(cur_fname, old_fname)) { file_move(new_fname, cur_fname); file_delete(old_fname); } } /* Otherwise just destroy the new file */ else { file_delete(new_fname); } } /* * Output the header of a pref-file dump */ static void pref_header(ang_file *fff, const char *mark) { /* Start of dump */ file_putf(fff, "%s begin %s\n", dump_separator, mark); file_putf(fff, "# *Warning!* The lines below are an automatic dump.\n"); file_putf(fff, "# Don't edit them; changes will be deleted and replaced automatically.\n"); } /* * Output the footer of a pref-file dump */ static void pref_footer(ang_file *fff, const char *mark) { file_putf(fff, "# *Warning!* The lines above are an automatic dump.\n"); file_putf(fff, "# Don't edit them; changes will be deleted and replaced automatically.\n"); /* End of dump */ file_putf(fff, "%s end %s\n", dump_separator, mark); } /* Dump monsters */ void dump_monsters(ang_file *fff) { int i; for (i = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; byte attr = r_ptr->x_attr; wint_t chr = r_ptr->x_char; /* Skip non-entries */ if (!r_ptr->name) continue; file_putf(fff, "# Monster: %s\n", r_ptr->name); file_putf(fff, "R:%d:%d:%d\n", i, attr, chr); } } static void get_pref_name(char *buf, size_t max, const char *name) { size_t j, k; /* Copy across the name, stripping modifiers & and ~) */ size_t len = strlen(name); for (j = 0, k = 0; j < len && k < max; j++) { if (j == 0 && name[0] == '&' && name[1] == ' ') j += 2; if (name[j] == '~') continue; buf[k++] = name[j]; } buf[k] = 0; } /* Dump objects */ void dump_objects(ang_file *fff) { int i; file_putf(fff, "# Objects\n"); for (i = 1; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; char name[120] = ""; if (!k_ptr->name || !k_ptr->tval) continue; get_pref_name(name, sizeof name, k_ptr->name); file_putf(fff, "K:%s:%s:%d:%d\n", tval_find_name(k_ptr->tval), name, k_ptr->x_attr, k_ptr->x_char); } } void dump_autoinscriptions(ang_file *f) { int i; for (i = 1; i < z_info->k_max; i++) { struct object_kind *k = &k_info[i]; char name[120]; const char *note; if (!k->name || !k->tval) continue; note = get_autoinscription(k); if (note) { get_pref_name(name, sizeof name, k->name); file_putf(f, "inscribe:%s:%s:%s\n", tval_find_name(k->tval), name, note); } } } /* Dump features */ void dump_features(ang_file *fff) { int i; for (i = 0; i < z_info->f_max; i++) { feature_type *f_ptr = &f_info[i]; size_t j; /* Skip non-entries */ if (!f_ptr->name) continue; /* Skip mimic entries -- except invisible trap */ if (f_ptr->mimic != i) continue; file_putf(fff, "# Terrain: %s\n", f_ptr->name); for (j = 0; j < FEAT_LIGHTING_MAX; j++) { byte attr = f_ptr->x_attr[j]; wint_t chr = f_ptr->x_char[j]; const char *light = NULL; if (j == FEAT_LIGHTING_TORCH) light = "torch"; if (j == FEAT_LIGHTING_LOS) light = "los"; else if (j == FEAT_LIGHTING_LIT) light = "lit"; else if (j == FEAT_LIGHTING_DARK) light = "dark"; assert(light); file_putf(fff, "F:%d:%s:%d:%d\n", i, light, attr, chr); } } } /* Dump flavors */ void dump_flavors(ang_file *fff) { struct flavor *f; for (f = flavors; f; f = f->next) { byte attr = f->x_attr; wint_t chr = f->x_char; file_putf(fff, "# Item flavor: %s\n", f->text); file_putf(fff, "L:%d:%d:%d\n\n", f->fidx, attr, chr); } } /* Dump colors */ void dump_colors(ang_file *fff) { int i; for (i = 0; i < MAX_COLORS; i++) { int kv = angband_color_table[i][0]; int rv = angband_color_table[i][1]; int gv = angband_color_table[i][2]; int bv = angband_color_table[i][3]; const char *name = "unknown"; /* Skip non-entries */ if (!kv && !rv && !gv && !bv) continue; /* Extract the color name */ if (i < BASIC_COLORS) name = color_table[i].name; file_putf(fff, "# Color: %s\n", name); file_putf(fff, "V:%d:%d:%d:%d:%d\n\n", i, kv, rv, gv, bv); } } /** * Save a set of preferences to file, overwriting any old preferences with the * same title. * * \param path is the filename to dump to * \param dump is a pointer to the function that does the writing to file * \param title is the name of this set of preferences * * \returns TRUE on success, FALSE otherwise. */ bool prefs_save(const char *path, void (*dump)(ang_file *), const char *title) { ang_file *fff; safe_setuid_grab(); /* Remove old keymaps */ remove_old_dump(path, title); fff = file_open(path, MODE_APPEND, FTYPE_TEXT); if (!fff) { safe_setuid_drop(); return FALSE; } /* Append the header */ pref_header(fff, title); file_putf(fff, "\n"); dump(fff); file_putf(fff, "\n"); pref_footer(fff, title); file_close(fff); safe_setuid_drop(); return TRUE; } /*** Pref file parser ***/ /** * Private data for pref file parsing. */ struct prefs_data { bool bypass; struct keypress keymap_buffer[KEYMAP_ACTION_MAX]; bool user; bool loaded_window_flag[ANGBAND_TERM_MAX]; u32b window_flags[ANGBAND_TERM_MAX]; }; /** * Load another file. */ static enum parser_error parse_prefs_load(struct parser *p) { struct prefs_data *d = parser_priv(p); const char *file; assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; file = parser_getstr(p, "file"); (void)process_pref_file(file, TRUE, d->user); return PARSE_ERROR_NONE; } /* * Helper function for "process_pref_file()" * * Input: * v: output buffer array * f: final character * * Output: * result */ static const char *process_pref_file_expr(char **sp, char *fp) { const char *v; char *b; char *s; char f = ' '; /* Initial */ s = (*sp); /* Skip spaces */ while (isspace((unsigned char)*s)) s++; /* Save start */ b = s; /* Default */ v = "?o?o?"; /* Analyze */ if (*s == '[') { const char *p; const char *t; /* Skip [ */ s++; /* First */ t = process_pref_file_expr(&s, &f); /* Oops */ if (!*t) { /* Nothing */ } /* Function: IOR */ else if (streq(t, "IOR")) { v = "0"; while (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); if (*t && !streq(t, "0")) v = "1"; } } /* Function: AND */ else if (streq(t, "AND")) { v = "1"; while (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); if (*t && streq(t, "0")) v = "0"; } } /* Function: NOT */ else if (streq(t, "NOT")) { v = "1"; while (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); if (*t && !streq(t, "0")) v = "0"; } } /* Function: EQU */ else if (streq(t, "EQU")) { v = "1"; if (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); } while (*s && (f != ']')) { p = t; t = process_pref_file_expr(&s, &f); if (*t && !streq(p, t)) v = "0"; } } /* Function: LEQ */ else if (streq(t, "LEQ")) { v = "1"; if (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); } while (*s && (f != ']')) { p = t; t = process_pref_file_expr(&s, &f); if (*t && (strcmp(p, t) >= 0)) v = "0"; } } /* Function: GEQ */ else if (streq(t, "GEQ")) { v = "1"; if (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); } while (*s && (f != ']')) { p = t; t = process_pref_file_expr(&s, &f); if (*t && (strcmp(p, t) <= 0)) v = "0"; } } /* Oops */ else { while (*s && (f != ']')) { t = process_pref_file_expr(&s, &f); } } /* Verify ending */ if (f != ']') v = "?x?x?"; /* Extract final and Terminate */ if ((f = *s) != '\0') *s++ = '\0'; } /* Other */ else { /* Accept all printables except spaces and brackets */ while (isprint((unsigned char)*s) && !strchr(" []", *s)) ++s; /* Extract final and Terminate */ if ((f = *s) != '\0') *s++ = '\0'; /* Variable */ if (*b == '$') { if (streq(b+1, "SYS")) v = ANGBAND_SYS; else if (streq(b+1, "GRAF")) v = ANGBAND_GRAF; else if (streq(b+1, "RACE")) v = p_ptr->race->name; else if (streq(b+1, "CLASS")) v = p_ptr->class->name; else if (streq(b+1, "PLAYER")) v = player_safe_name(p_ptr, TRUE); else if (streq(b+1, "GENDER")) v = p_ptr->sex->title; } /* Constant */ else { v = b; } } /* Save */ (*fp) = f; (*sp) = s; return v; } static enum parser_error parse_prefs_expr(struct parser *p) { struct prefs_data *d = parser_priv(p); const char *v; char *str; char *expr; char f; assert(d != NULL); /* XXX this can be avoided with a rewrite of process_pref_file_expr */ str = expr = string_make(parser_getstr(p, "expr")); /* Parse the expr */ v = process_pref_file_expr(&expr, &f); /* Set flag */ d->bypass = streq(v, "0"); string_free(str); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_k(struct parser *p) { int tvi, svi; object_kind *kind; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; tvi = tval_find_idx(parser_getsym(p, "tval")); if (tvi < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; svi = lookup_sval(tvi, parser_getsym(p, "sval")); if (svi < 0) return PARSE_ERROR_UNRECOGNISED_SVAL; kind = lookup_kind(tvi, svi); if (!kind) return PARSE_ERROR_UNRECOGNISED_SVAL; kind->x_attr = (byte)parser_getint(p, "attr"); kind->x_char = (wchar_t)parser_getint(p, "char"); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_r(struct parser *p) { int idx; monster_race *monster; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; idx = parser_getuint(p, "idx"); if (idx >= z_info->r_max) return PARSE_ERROR_OUT_OF_BOUNDS; monster = &r_info[idx]; monster->x_attr = (byte)parser_getint(p, "attr"); monster->x_char = (wchar_t)parser_getint(p, "char"); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_f(struct parser *p) { int idx; feature_type *feature; const char *lighting; int light_idx; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; idx = parser_getuint(p, "idx"); if (idx >= z_info->f_max) return PARSE_ERROR_OUT_OF_BOUNDS; lighting = parser_getsym(p, "lighting"); if (streq(lighting, "torch")) light_idx = FEAT_LIGHTING_TORCH; else if (streq(lighting, "los")) light_idx = FEAT_LIGHTING_LOS; else if (streq(lighting, "lit")) light_idx = FEAT_LIGHTING_LIT; else if (streq(lighting, "dark")) light_idx = FEAT_LIGHTING_DARK; else if (streq(lighting, "all")) light_idx = FEAT_LIGHTING_MAX; else return PARSE_ERROR_GENERIC; /* xxx fixme */ if (light_idx < FEAT_LIGHTING_MAX) { feature = &f_info[idx]; feature->x_attr[light_idx] = (byte)parser_getint(p, "attr"); feature->x_char[light_idx] = (wchar_t)parser_getint(p, "char"); } else { for (light_idx = 0; light_idx < FEAT_LIGHTING_MAX; light_idx++) { feature = &f_info[idx]; feature->x_attr[light_idx] = (byte)parser_getint(p, "attr"); feature->x_char[light_idx] = (wchar_t)parser_getint(p, "char"); } } return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_gf(struct parser *p) { bool types[GF_MAX] = { 0 }; const char *direction; int motion; char *s, *t; size_t i; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; /* Parse the type, which is a | seperated list of GF_ constants */ s = string_make(parser_getsym(p, "type")); t = strtok(s, "| "); while (t) { if (streq(t, "*")) { memset(types, TRUE, sizeof types); } else { int idx = gf_name_to_idx(t); if (idx == -1) return PARSE_ERROR_INVALID_VALUE; types[idx] = TRUE; } t = strtok(NULL, "| "); } string_free(s); direction = parser_getsym(p, "direction"); if (streq(direction, "static")) motion = BOLT_NO_MOTION; else if (streq(direction, "0")) motion = BOLT_0; else if (streq(direction, "45")) motion = BOLT_45; else if (streq(direction, "90")) motion = BOLT_90; else if (streq(direction, "135")) motion = BOLT_135; else return PARSE_ERROR_INVALID_VALUE; for (i = 0; i < GF_MAX; i++) { if (!types[i]) continue; gf_to_attr[i][motion] = (byte)parser_getuint(p, "attr"); gf_to_char[i][motion] = (wchar_t)parser_getuint(p, "char"); } return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_l(struct parser *p) { unsigned int idx; struct flavor *flavor; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; idx = parser_getuint(p, "idx"); for (flavor = flavors; flavor; flavor = flavor->next) if (flavor->fidx == idx) break; if (flavor) { flavor->x_attr = (byte)parser_getint(p, "attr"); flavor->x_char = (wchar_t)parser_getint(p, "char"); } return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_e(struct parser *p) { int tvi, a; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; tvi = tval_find_idx(parser_getsym(p, "tval")); if (tvi < 0 || tvi >= (long)N_ELEMENTS(tval_to_attr)) return PARSE_ERROR_UNRECOGNISED_TVAL; a = parser_getint(p, "attr"); if (a) tval_to_attr[tvi] = (byte) a; return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_q(struct parser *p) { struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; if (parser_hasval(p, "sval") && parser_hasval(p, "flag")) { object_kind *kind; int tvi, svi; tvi = tval_find_idx(parser_getsym(p, "n")); if (tvi < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; svi = lookup_sval(tvi, parser_getsym(p, "sval")); if (svi < 0) return PARSE_ERROR_UNRECOGNISED_SVAL; kind = lookup_kind(tvi, svi); if (!kind) return PARSE_ERROR_UNRECOGNISED_SVAL; kind->squelch = parser_getint(p, "flag"); } else { int idx = parser_getint(p, "idx"); int level = parser_getint(p, "n"); squelch_level[idx] = level; } return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_inscribe(struct parser *p) { int tvi, svi; object_kind *kind; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; tvi = tval_find_idx(parser_getsym(p, "tval")); if (tvi < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; svi = lookup_sval(tvi, parser_getsym(p, "sval")); if (svi < 0) return PARSE_ERROR_UNRECOGNISED_SVAL; kind = lookup_kind(tvi, svi); if (!kind) return PARSE_ERROR_UNRECOGNISED_SVAL; add_autoinscription(kind->kidx, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_a(struct parser *p) { const char *act = ""; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; if (parser_hasval(p, "act")) { act = parser_getstr(p, "act"); } keypress_from_text(d->keymap_buffer, N_ELEMENTS(d->keymap_buffer), act); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_c(struct parser *p) { int mode; struct keypress tmp[2]; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; mode = parser_getint(p, "mode"); if (mode < 0 || mode >= KEYMAP_MODE_MAX) return PARSE_ERROR_OUT_OF_BOUNDS; keypress_from_text(tmp, N_ELEMENTS(tmp), parser_getstr(p, "key")); if (tmp[0].type != EVT_KBRD || tmp[1].type != EVT_NONE) return PARSE_ERROR_FIELD_TOO_LONG; keymap_add(mode, tmp[0], d->keymap_buffer, d->user); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_m(struct parser *p) { int a, msg_index; const char *attr; const char *type; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; type = parser_getsym(p, "type"); attr = parser_getsym(p, "attr"); msg_index = message_lookup_by_name(type); if (msg_index < 0) return PARSE_ERROR_GENERIC; if (strlen(attr) > 1) a = color_text_to_attr(attr); else a = color_char_to_attr(attr[0]); if (a < 0) return PARSE_ERROR_INVALID_COLOR; message_color_define(msg_index, (byte)a); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_v(struct parser *p) { int idx; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; idx = parser_getuint(p, "idx"); if (idx > MAX_COLORS) return PARSE_ERROR_OUT_OF_BOUNDS; angband_color_table[idx][0] = parser_getint(p, "k"); angband_color_table[idx][1] = parser_getint(p, "r"); angband_color_table[idx][2] = parser_getint(p, "g"); angband_color_table[idx][3] = parser_getint(p, "b"); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_w(struct parser *p) { int window; size_t flag; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; window = parser_getint(p, "window"); if (window <= 0 || window >= ANGBAND_TERM_MAX) return PARSE_ERROR_OUT_OF_BOUNDS; flag = parser_getuint(p, "flag"); if (flag >= N_ELEMENTS(window_flag_desc)) return PARSE_ERROR_OUT_OF_BOUNDS; if (window_flag_desc[flag]) { int value = parser_getuint(p, "value"); if (value) d->window_flags[window] |= (1L << flag); else d->window_flags[window] &= ~(1L << flag); } d->loaded_window_flag[window] = TRUE; return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_x(struct parser *p) { struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; option_set(parser_getstr(p, "option"), FALSE); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_y(struct parser *p) { struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; option_set(parser_getstr(p, "option"), TRUE); return PARSE_ERROR_NONE; } static enum parser_error parse_prefs_o(struct parser *p) { struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; /* Don't load options anymore */ return PARSE_ERROR_NONE; } static struct parser *init_parse_prefs(bool user) { struct parser *p = parser_new(); struct prefs_data *pd = mem_zalloc(sizeof *pd); int i; parser_setpriv(p, pd); pd->user = user; for (i = 0; i < ANGBAND_TERM_MAX; i++) { pd->loaded_window_flag[i] = FALSE; } parser_reg(p, "% str file", parse_prefs_load); parser_reg(p, "? str expr", parse_prefs_expr); parser_reg(p, "K sym tval sym sval int attr int char", parse_prefs_k); parser_reg(p, "R uint idx int attr int char", parse_prefs_r); parser_reg(p, "F uint idx sym lighting int attr int char", parse_prefs_f); parser_reg(p, "GF sym type sym direction uint attr uint char", parse_prefs_gf); parser_reg(p, "L uint idx int attr int char", parse_prefs_l); parser_reg(p, "E sym tval int attr", parse_prefs_e); parser_reg(p, "Q sym idx sym n ?sym sval ?sym flag", parse_prefs_q); /* XXX should be split into two kinds of line */ parser_reg(p, "inscribe sym tval sym sval str text", parse_prefs_inscribe); parser_reg(p, "A ?str act", parse_prefs_a); parser_reg(p, "C int mode str key", parse_prefs_c); parser_reg(p, "M sym type sym attr", parse_prefs_m); parser_reg(p, "V uint idx int k int r int g int b", parse_prefs_v); parser_reg(p, "W int window uint flag uint value", parse_prefs_w); parser_reg(p, "X str option", parse_prefs_x); parser_reg(p, "Y str option", parse_prefs_y); parser_reg(p, "O sym name uint value", parse_prefs_o); return p; } static errr finish_parse_prefs(struct parser *p) { struct prefs_data *d = parser_priv(p); int i; /* Update sub-windows based on the newly read-in prefs. * * The op_ptr->window_flag[] array cannot be updated directly during * parsing since the changes between the existing flags and the new * are used to set/unset the event handlers that update the windows. * * Build a complete set to pass to subwindows_set_flags() by loading * any that weren't read in by the parser from the existing set. */ for (i = 0; i < ANGBAND_TERM_MAX; i++) { if (!d->loaded_window_flag[i]) d->window_flags[i] = op_ptr->window_flag[i]; } subwindows_set_flags(d->window_flags, ANGBAND_TERM_MAX); return PARSE_ERROR_NONE; } errr process_pref_file_command(const char *s) { struct parser *p = init_parse_prefs(TRUE); errr e = parser_parse(p, s); mem_free(parser_priv(p)); parser_destroy(p); return e; } static void print_error(const char *name, struct parser *p) { struct parser_state s; parser_getstate(p, &s); msg("Parse error in %s line %d column %d: %s: %s", name, s.line, s.col, s.msg, parser_error_str[s.error]); message_flush(); } /** * Process the user pref file with a given name and search paths. * * \param name is the name of the pref file. * \param quiet means "don't complain about not finding the file". * \param user should be TRUE if the pref file is user-specific and not a game default. * \param base_search_path is the first path that should be checked for the file. * \param fallback_search_path is the path that should be checked if the file couldn't be found at the base path. * \param used_fallback will be set on return to TRUE if the fallback path was used, FALSE otherwise. * \returns TRUE if everything worked OK, FALSE otherwise. */ static bool process_pref_file_layered(const char *name, bool quiet, bool user, const char *base_search_path, const char *fallback_search_path, bool *used_fallback) { char buf[1024]; ang_file *f; struct parser *p; errr e = 0; int line_no = 0; assert(base_search_path != NULL); /* Build the filename */ path_build(buf, sizeof(buf), base_search_path, name); if (used_fallback != NULL) *used_fallback = FALSE; if (!file_exists(buf) && fallback_search_path != NULL) { path_build(buf, sizeof(buf), fallback_search_path, name); if (used_fallback != NULL) *used_fallback = TRUE; } f = file_open(buf, MODE_READ, -1); if (!f) { if (!quiet) msg("Cannot open '%s'.", buf); e = PARSE_ERROR_INTERNAL; /* signal failure to callers */ } else { char line[1024]; p = init_parse_prefs(user); while (file_getl(f, line, sizeof line)) { line_no++; e = parser_parse(p, line); if (e != PARSE_ERROR_NONE) { print_error(buf, p); break; } } finish_parse_prefs(p); file_close(f); mem_free(parser_priv(p)); parser_destroy(p); } /* Result */ return e == PARSE_ERROR_NONE; } /** * Look for a pref file at its base location (falling back to another path if needed) and then in the user location. This * effectively will layer a user pref file on top of a default pref file. * * Because of the way this function works, there might be some unexpected effects when a pref file triggers another * pref file to be loaded. For example, pref/pref.prf causes message.prf to load. This means that the game will * load pref/pref.prf, then pref/message.prf, then user/message.prf, and finally user/pref.prf. * * \param name is the name of the pref file. * \param quiet means "don't complain about not finding the file". * \param user should be TRUE if the pref file is user-specific and not a game default. * \returns TRUE if everything worked OK, FALSE otherwise. */ bool process_pref_file(const char *name, bool quiet, bool user) { bool root_success = FALSE; bool user_success = FALSE; bool used_fallback = FALSE; /* This supports the old behavior: look for a file first in 'pref/', and if not found there, then 'user/'. */ root_success = process_pref_file_layered(name, quiet, user, ANGBAND_DIR_PREF, ANGBAND_DIR_USER, &used_fallback); /* Next, we want to force a check for the file in the user/ directory. However, since we used the user directory * as a fallback in the previous check, we only want to do this if the fallback wasn't used. This cuts down on * unnecessary parsing. */ if (!used_fallback) { /* Force quiet (since this is an optional file) and force user (since this should always be considered user-specific). */ user_success = process_pref_file_layered(name, TRUE, TRUE, ANGBAND_DIR_USER, NULL, &used_fallback); } /* If only one load was successful, that's okay; we loaded something. */ return root_success || user_success; } angband-3.5.1/src/z-form.h0000644000175000017500000000316612456456607014621 0ustar chriscchrisc#ifndef INCLUDED_Z_FORM_H #define INCLUDED_Z_FORM_H #include "h-basic.h" /* * This file provides functions very similar to "sprintf()", but which * not only parse some additional "format sequences", but also enforce * bounds checking, and allow repeated "appends" to the same buffer. * * See "z-form.c" for more detailed information about the routines, * including a list of the legal "format sequences". * * This file makes use of both "z-util.c" and "z-virt.c" */ /* MSVC doesn't have va_copy (which is C99) or an alternative, so we'll just * copy the SRC pointer. In other cases we'll use va_copy() as we should. */ #ifdef _MSC_VER #define VA_COPY(DST, SRC) (DST) = (SRC) #else #define VA_COPY(DST, SRC) va_copy(DST, SRC) #endif /**** Available Functions ****/ /* Format arguments into given bounded-length buffer */ extern size_t vstrnfmt(char *buf, size_t max, const char *fmt, va_list vp); /* Simple interface to "vstrnfmt()" */ extern size_t strnfmt(char *buf, size_t max, const char *fmt, ...); /* Format arguments into a static resizing buffer */ extern char *vformat(const char *fmt, va_list vp); /* Free the memory allocated for the format buffer */ extern void vformat_kill(void); /* Append a formatted string to another string */ extern void strnfcat(char *str, size_t max, size_t *end, const char *fmt, ...); /* Simple interface to "vformat()" */ extern char *format(const char *fmt, ...); /* Vararg interface to "plog()", using "format()" */ extern void plog_fmt(const char *fmt, ...); /* Vararg interface to "quit()", using "format()" */ extern void quit_fmt(const char *fmt, ...); #endif /* INCLUDED_Z_FORM_H */ angband-3.5.1/src/xtra2.c0000644000175000017500000003123412456456607014437 0ustar chriscchrisc/* * File: xtra2.c * Purpose: Targetting, sorting, panel update * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "keymap.h" #include "history.h" #include "object/tvalsval.h" #include "pathfind.h" #include "spells.h" #include "target.h" /* Private function that is shared by verify_panel() and center_panel() */ void verify_panel_int(bool centered); /* * Modify the current panel to the given coordinates, adjusting only to * ensure the coordinates are legal, and return TRUE if anything done. * * The town should never be scrolled around. * * Note that monsters are no longer affected in any way by panel changes. * * As a total hack, whenever the current panel changes, we assume that * the "overhead view" window should be updated. */ bool modify_panel(term *t, int wy, int wx) { int dungeon_hgt = cave->height; int dungeon_wid = cave->width; /* Verify wy, adjust if needed */ if (wy > dungeon_hgt - SCREEN_HGT) wy = dungeon_hgt - SCREEN_HGT; if (wy < 0) wy = 0; /* Verify wx, adjust if needed */ if (wx > dungeon_wid - SCREEN_WID) wx = dungeon_wid - SCREEN_WID; if (wx < 0) wx = 0; /* React to changes */ if ((t->offset_y != wy) || (t->offset_x != wx)) { /* Save wy, wx */ t->offset_y = wy; t->offset_x = wx; /* Redraw map */ p_ptr->redraw |= (PR_MAP); /* Redraw for big graphics */ if ((tile_width > 1) || (tile_height > 1)) redraw_stuff(p_ptr); /* Changed */ return (TRUE); } /* No change */ return (FALSE); } /* * Perform the minimum "whole panel" adjustment to ensure that the given * location is contained inside the current panel, and return TRUE if any * such adjustment was performed. */ bool adjust_panel(int y, int x) { bool changed = FALSE; int j; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { int wx, wy; int screen_hgt, screen_wid; term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if ((j > 0) && !(op_ptr->window_flag[j] & PW_MAP)) continue; wy = t->offset_y; wx = t->offset_x; screen_hgt = (j == 0) ? SCREEN_HGT : t->hgt; screen_wid = (j == 0) ? SCREEN_WID : t->wid; /* Adjust as needed */ while (y >= wy + screen_hgt) wy += screen_hgt / 2; while (y < wy) wy -= screen_hgt / 2; /* Adjust as needed */ while (x >= wx + screen_wid) wx += screen_wid / 2; while (x < wx) wx -= screen_wid / 2; /* Use "modify_panel" */ if (modify_panel(t, wy, wx)) changed = TRUE; } return (changed); } /* * Change the current panel to the panel lying in the given direction. * * Return TRUE if the panel was changed. */ bool change_panel(int dir) { bool changed = FALSE; int j; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { int screen_hgt, screen_wid; int wx, wy; term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if ((j > 0) && !(op_ptr->window_flag[j] & PW_MAP)) continue; screen_hgt = (j == 0) ? SCREEN_HGT : t->hgt; screen_wid = (j == 0) ? SCREEN_WID : t->wid; /* Shift by half a panel */ wy = t->offset_y + ddy[dir] * screen_hgt / 2; wx = t->offset_x + ddx[dir] * screen_wid / 2; /* Use "modify_panel" */ if (modify_panel(t, wy, wx)) changed = TRUE; } return (changed); } /* * Verify the current panel (relative to the player location). * * By default, when the player gets "too close" to the edge of the current * panel, the map scrolls one panel in that direction so that the player * is no longer so close to the edge. * * The "OPT(center_player)" option allows the current panel to always be centered * around the player, which is very expensive, and also has some interesting * gameplay ramifications. */ void verify_panel(void) { verify_panel_int(OPT(center_player)); } void center_panel(void) { verify_panel_int(TRUE); } void verify_panel_int(bool centered) { int wy, wx; int screen_hgt, screen_wid; int panel_wid, panel_hgt; int py = p_ptr->py; int px = p_ptr->px; int j; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if ((j > 0) && !(op_ptr->window_flag[j] & (PW_MAP))) continue; wy = t->offset_y; wx = t->offset_x; screen_hgt = (j == 0) ? SCREEN_HGT : t->hgt; screen_wid = (j == 0) ? SCREEN_WID : t->wid; panel_wid = screen_wid / 2; panel_hgt = screen_hgt / 2; /* Scroll screen vertically when off-center */ if (centered && !p_ptr->running && (py != wy + panel_hgt)) wy = py - panel_hgt; /* Scroll screen vertically when 3 grids from top/bottom edge */ else if ((py < wy + 3) || (py >= wy + screen_hgt - 3)) wy = py - panel_hgt; /* Scroll screen horizontally when off-center */ if (centered && !p_ptr->running && (px != wx + panel_wid)) wx = px - panel_wid; /* Scroll screen horizontally when 3 grids from left/right edge */ else if ((px < wx + 3) || (px >= wx + screen_wid - 3)) wx = px - panel_wid; /* Scroll if needed */ modify_panel(t, wy, wx); } } /* * Given a "source" and "target" location, extract a "direction", * which will move one step from the "source" towards the "target". * * Note that we use "diagonal" motion whenever possible. * * We return "5" if no motion is needed. */ int motion_dir(int y1, int x1, int y2, int x2) { /* No movement required */ if ((y1 == y2) && (x1 == x2)) return (DIR_NONE); /* South or North */ if (x1 == x2) return ((y1 < y2) ? 2 : 8); /* East or West */ if (y1 == y2) return ((x1 < x2) ? 6 : 4); /* South-east or South-west */ if (y1 < y2) return ((x1 < x2) ? 3 : 1); /* North-east or North-west */ if (y1 > y2) return ((x1 < x2) ? 9 : 7); /* Paranoia */ return (5); } /* * Extract a direction (or zero) from a character */ int target_dir(struct keypress ch) { return target_dir_allow(ch, FALSE); } int target_dir_allow(struct keypress ch, bool allow_5) { int d = 0; /* Already a direction? */ if (isdigit((unsigned char)ch.code)) { d = D2I(ch.code); } else if (isarrow(ch.code)) { switch (ch.code) { case ARROW_DOWN: d = 2; break; case ARROW_LEFT: d = 4; break; case ARROW_RIGHT: d = 6; break; case ARROW_UP: d = 8; break; } } else { int mode; const struct keypress *act; if (OPT(rogue_like_commands)) mode = KEYMAP_MODE_ROGUE; else mode = KEYMAP_MODE_ORIG; /* XXX see if this key has a digit in the keymap we can use */ act = keymap_find(mode, ch); if (act) { const struct keypress *cur; for (cur = act; cur->type == EVT_KBRD; cur++) { if (isdigit((unsigned char) cur->code)) d = D2I(cur->code); } } } /* Paranoia */ if (d == 5 && !allow_5) d = 0; /* Return direction */ return (d); } static int dir_transitions[10][10] = { /* 0-> */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, /* 1-> */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 2-> */ { 0, 0, 2, 0, 1, 0, 3, 0, 5, 0 }, /* 3-> */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 4-> */ { 0, 0, 1, 0, 4, 0, 5, 0, 7, 0 }, /* 5-> */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 6-> */ { 0, 0, 3, 0, 5, 0, 6, 0, 9, 0 }, /* 7-> */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 8-> */ { 0, 0, 5, 0, 7, 0, 9, 0, 8, 0 }, /* 9-> */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }; /* * Request a "movement" direction (1,2,3,4,6,7,8,9) from the user. * * Return TRUE if a direction was chosen, otherwise return FALSE. * * This function should be used for all "repeatable" commands, such as * run, walk, open, close, bash, disarm, spike, tunnel, etc, as well * as all commands which must reference a grid adjacent to the player, * and which may not reference the grid under the player. * * Directions "5" and "0" are illegal and will not be accepted. * * This function tracks and uses the "global direction", and uses * that as the "desired direction", if it is set. */ bool get_rep_dir(int *dp, bool allow_5) { int dir = 0; ui_event ke; /* Initialize */ (*dp) = 0; /* Get a direction */ while (!dir) { /* Paranoia XXX XXX XXX */ message_flush(); /* Get first keypress - the first test is to avoid displaying the prompt for direction if there's already a keypress queued up and waiting - this just avoids a flickering prompt if there is a "lazy" movement delay. */ inkey_scan = SCAN_INSTANT; ke = inkey_ex(); inkey_scan = SCAN_OFF; if (ke.type == EVT_NONE || (ke.type == EVT_KBRD && target_dir(ke.key) == 0)) { prt("Direction or (Escape to cancel)? ", 0, 0); ke = inkey_ex(); } /* Check mouse coordinates */ if (ke.type == EVT_MOUSE) { if (ke.mouse.button == 1) { int y = KEY_GRID_Y(ke); int x = KEY_GRID_X(ke); struct loc from = loc(p_ptr->px, p_ptr->py); struct loc to = loc(x, y); dir = pathfind_direction_to(from, to); } else if (ke.mouse.button == 2) { /* Clear the prompt */ prt("", 0, 0); return (FALSE); } } /* Get other keypresses until a direction is chosen. */ else if (ke.type == EVT_KBRD) { int keypresses_handled = 0; while (ke.type == EVT_KBRD && ke.key.code != 0) { int this_dir; if (ke.key.code == ESCAPE) { /* Clear the prompt */ prt("", 0, 0); return (FALSE); } /* XXX Ideally show and move the cursor here to indicate the currently "Pending" direction. XXX */ this_dir = target_dir_allow(ke.key, allow_5); if (this_dir) dir = dir_transitions[dir][this_dir]; if (lazymove_delay == 0 || ++keypresses_handled > 1) break; inkey_scan = lazymove_delay; ke = inkey_ex(); } /* 5 is equivalent to "escape" */ if (dir == 5 && !allow_5) { /* Clear the prompt */ prt("", 0, 0); return (FALSE); } } /* Oops */ if (!dir) bell("Illegal repeatable direction!"); } /* Clear the prompt */ prt("", 0, 0); /* Save direction */ (*dp) = dir; /* Success */ return (TRUE); } /* * Get an "aiming direction" (1,2,3,4,6,7,8,9 or 5) from the user. * * Return TRUE if a direction was chosen, otherwise return FALSE. * * The direction "5" is special, and means "use current target". * * This function tracks and uses the "global direction", and uses * that as the "desired direction", if it is set. * * Note that "Force Target", if set, will pre-empt user interaction, * if there is a usable target already set. */ bool get_aim_dir(int *dp) { /* Global direction */ int dir = 0; ui_event ke; const char *p; /* Initialize */ (*dp) = 0; /* Hack -- auto-target if requested */ if (OPT(use_old_target) && target_okay() && !dir) dir = 5; /* Ask until satisfied */ while (!dir) { /* Choose a prompt */ if (!target_okay()) p = "Direction ('*' or to target, \"'\" for closest, Escape to cancel)? "; else p = "Direction ('5' for target, '*' or to re-target, Escape to cancel)? "; /* Get a command (or Cancel) */ if (!get_com_ex(p, &ke)) break; if (ke.type == EVT_MOUSE) { if (ke.mouse.button == 1) { if (target_set_interactive(TARGET_KILL, KEY_GRID_X(ke), KEY_GRID_Y(ke))) dir = 5; } else if (ke.mouse.button == 2) { break; } } else if (ke.type == EVT_KBRD) { if (ke.key.code == '*') { /* Set new target, use target if legal */ if (target_set_interactive(TARGET_KILL, -1, -1)) dir = 5; } else if (ke.key.code == '\'') { /* Set to closest target */ if (target_set_closest(TARGET_KILL)) dir = 5; } else if (ke.key.code == 't' || ke.key.code == '5' || ke.key.code == '0' || ke.key.code == '.') { if (target_okay()) dir = 5; } else { /* Possible direction */ int keypresses_handled = 0; while (ke.key.code != 0) { int this_dir; /* XXX Ideally show and move the cursor here to indicate the currently "Pending" direction. XXX */ this_dir = target_dir(ke.key); if (this_dir) dir = dir_transitions[dir][this_dir]; else break; if (lazymove_delay == 0 || ++keypresses_handled > 1) break; /* See if there's a second keypress within the defined period of time. */ inkey_scan = lazymove_delay; ke = inkey_ex(); } } } /* Error */ if (!dir) bell("Illegal aim direction!"); } /* No direction */ if (!dir) return (FALSE); /* Save direction */ (*dp) = dir; /* A "valid" direction was entered */ return (TRUE); } angband-3.5.1/src/quest.h0000644000175000017500000000202012456456606014533 0ustar chriscchrisc#ifndef QUEST_H #define QUEST_H /* * Structure for the "quests" * * Hack -- currently, only the "level" parameter is set, with the * semantics that "one (QUEST) monster of that level" must be killed, * and then the "level" is reset to zero, meaning "all done". Later, * we should allow quests like "kill 100 fire hounds", and note that * the "quest level" is then the level past which progress is forbidden * until the quest is complete. Note that the "QUESTOR" flag then could * become a more general "never out of depth" flag for monsters. */ typedef struct quest quest; struct quest { byte level; /* Dungeon level */ int r_idx; /* Monster race */ int cur_num; /* Number killed (unused) */ int max_num; /* Number required (unused) */ }; /* Maximum number of quests */ #define MAX_Q_IDX 4 /* Quest list */ extern quest q_list[MAX_Q_IDX]; /* Functions */ bool is_quest(int level); void quest_reset(void); bool quest_check(const struct monster *m); void quest_init(void); void quest_free(void); #endif /* QUEST_H */ angband-3.5.1/src/ui-knowledge.c0000644000175000017500000014560012456456606015773 0ustar chriscchrisc/* * File: ui-knowledge.c * Purpose: Knowledge screen * * Copyright (c) 2000-2007 Eytan Zweig, Andrew Doull, Pete Mack. * Copyright (c) 2010 Peter Denison, Chris Carr. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "cmds.h" #include "history.h" #include "monster/mon-lore.h" #include "monster/monster.h" #include "monster/mon-util.h" #include "object/tvalsval.h" #include "squelch.h" #include "store.h" #include "ui.h" #include "ui-menu.h" #include "ui-options.h" #include "grafmode.h" /* Flag value for missing array entry */ #define MISSING -17 static const grouper object_text_order[] = { {TV_RING, "Ring" }, {TV_AMULET, "Amulet" }, {TV_POTION, "Potion" }, {TV_SCROLL, "Scroll" }, {TV_WAND, "Wand" }, {TV_STAFF, "Staff" }, {TV_ROD, "Rod" }, {TV_FOOD, "Food" }, {TV_PRAYER_BOOK, "Priest Book" }, {TV_MAGIC_BOOK, "Magic Book" }, {TV_LIGHT, "Light" }, {TV_FLASK, "Flask" }, {TV_SWORD, "Sword" }, {TV_POLEARM, "Polearm" }, {TV_HAFTED, "Hafted Weapon" }, {TV_BOW, "Bow" }, {TV_ARROW, "Ammunition" }, {TV_BOLT, NULL }, {TV_SHOT, NULL }, {TV_SHIELD, "Shield" }, {TV_CROWN, "Crown" }, {TV_HELM, "Helm" }, {TV_GLOVES, "Gloves" }, {TV_BOOTS, "Boots" }, {TV_CLOAK, "Cloak" }, {TV_DRAG_ARMOR, "Dragon Scale Mail" }, {TV_HARD_ARMOR, "Hard Armor" }, {TV_SOFT_ARMOR, "Soft Armor" }, {TV_DIGGING, "Digger" }, {0, NULL } }; typedef struct { int maxnum; /* Maximum possible item count for this class */ bool easy_know; /* Items don't need to be IDed to recognize membership */ const char *(*name)(int gid); /* Name of this group */ /* Compare, in group and display order (optional if already sorted) */ int (*gcomp)(const void *, const void *); /* Compares gids of two oids */ int (*group)(int oid); /* Returns gid for an oid */ /* Summary function for the "object" information. */ void (*summary)(int gid, const int *object_list, int n, int top, int row, int col); } group_funcs; typedef struct { /* Displays an entry at specified location, including kill-count and graphics */ void (*display_member)(int col, int row, bool cursor, int oid); void (*lore)(int oid); /* Displays lore for an oid */ /* Required only for objects with modifiable display attributes */ /* Unknown 'flavors' return flavor attributes */ wchar_t *(*xchar)(int oid); /* Get character attr for OID (by address) */ byte *(*xattr)(int oid); /* Get color attr for OID (by address) */ const char *(*xtra_prompt)(int oid); /* Returns optional extra prompt */ void (*xtra_act)(struct keypress ch, int oid); /* Handles optional extra actions */ bool is_visual; /* Does this kind have visual editing? */ } member_funcs; /* Helper class for generating joins */ typedef struct join { int oid; int gid; } join_t; /* A default group-by */ static join_t *default_join; #if 0 static int default_join_cmp(const void *a, const void *b) { join_t *ja = &default_join[*(int*)a]; join_t *jb = &default_join[*(int*)b]; int c = ja->gid - jb->gid; if (c) return c; return ja->oid - jb->oid; } #endif static int default_group(int oid) { return default_join[oid].gid; } static int *obj_group_order = NULL; /* * Description of each monster group. */ static struct { const wchar_t *chars; const char *name; } monster_group[] = { { (const wchar_t *)-1, "Uniques" }, { L"A", "Ainur" }, { L"a", "Ants" }, { L"b", "Bats" }, { L"B", "Birds" }, { L"C", "Canines" }, { L"c", "Centipedes" }, { L"uU", "Demons" }, { L"dD", "Dragons" }, { L"vE", "Elementals/Vortices" }, { L"e", "Eyes/Beholders" }, { L"f", "Felines" }, { L"G", "Ghosts" }, { L"OP", "Giants/Ogres" }, { L"g", "Golems" }, { L"H", "Harpies/Hybrids" }, { L"h", "Hominids (Elves, Dwarves)" }, { L"M", "Hydras" }, { L"i", "Icky Things" }, { L"lFI", "Insects" }, { L"j", "Jellies" }, { L"K", "Killer Beetles" }, { L"k", "Kobolds" }, { L"L", "Lichs" }, { L"tp", "Men" }, { L".$!?=~_", "Mimics" }, { L"m", "Molds" }, { L",", "Mushroom Patches" }, { L"n", "Nagas" }, { L"o", "Orcs" }, { L"q", "Quadrupeds" }, { L"Q", "Quylthulgs" }, { L"R", "Reptiles/Amphibians" }, { L"r", "Rodents" }, { L"S", "Scorpions/Spiders" }, { L"s", "Skeletons/Drujs" }, { L"J", "Snakes" }, { L"T", "Trolls" }, { L"V", "Vampires" }, { L"W", "Wights/Wraiths" }, { L"w", "Worms/Worm Masses" }, { L"X", "Xorns/Xarens" }, { L"y", "Yeeks" }, { L"Y", "Yeti" }, { L"Z", "Zephyr Hounds" }, { L"z", "Zombies" }, { NULL, NULL } }; /* * Description of each feature group. */ static const char *feature_group_text[] = { "Floors", "Traps", "Doors", "Stairs", "Walls", "Streamers", "Obstructions", "Stores", "Other", NULL }; /* Useful method declarations */ static void display_tiles(int col, int row, int height, int width, byte attr_top, byte char_left); static bool tile_picker_command(ui_event ke, bool *tile_picker_ptr, int height, int width, byte *attr_top_ptr, byte *char_left_ptr, byte *cur_attr_ptr, byte *cur_char_ptr, int col, int row, int *delay); static void place_tile_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left); static void display_glyphs(int col, int row, int height, int width, byte a, wchar_t c); static bool glyph_command(ui_event ke, bool *glyph_picker_ptr, int height, int width, byte *cur_attr_ptr, wchar_t *cur_char_ptr, int col, int row); /* * Clipboard variables for copy&paste in visual mode */ static byte attr_idx = 0; static byte char_idx = 0; /* * Return a specific ordering for the features */ static int feat_order(int feat) { feature_type *f_ptr = &f_info[feat]; switch (f_ptr->d_char) { case L'.': return 0; case L'^': return 1; case L'\'': case L'+': return 2; case L'<': case L'>': return 3; case L'#': return 4; case L'*': case L'%' : return 5; case L';': case L':' : return 6; default: { return 8; } } } /* Emit a 'graphical' symbol and a padding character if appropriate */ extern int big_pad(int col, int row, byte a, wchar_t c) { Term_putch(col, row, a, c); if ((tile_width > 1) || (tile_height > 1)) Term_big_putch(col, row, a, c); return tile_width; } /* Return the actual width of a symbol */ static int actual_width(int width) { return width * tile_width; } /* Return the actual height of a symbol */ static int actual_height(int height) { return height * tile_height; } /* From an actual width, return the logical width */ static int logical_width(int width) { return width / tile_width; } /* From an actual height, return the logical height */ static int logical_height(int height) { return height / tile_height; } static void display_group_member(menu_type *menu, int oid, bool cursor, int row, int col, int wid) { const member_funcs *o_funcs = menu->menu_data; byte attr = curs_attrs[CURS_KNOWN][cursor == oid]; (void)wid; /* Print the interesting part */ o_funcs->display_member(col, row, cursor, oid); #if 0 /* Debugging code */ c_put_str(attr, format("%d", oid), row, 60); #endif /* Do visual mode */ if (o_funcs->is_visual && o_funcs->xattr) { wchar_t c = *o_funcs->xchar(oid); byte a = *o_funcs->xattr(oid); c_put_str(attr, format("%d/%d", a, c), row, 60); } } static const char *recall_prompt(int oid) { (void)oid; return ", 'r' to recall"; } #define swap(a, b) (swapspace = (void*)(a)), ((a) = (b)), ((b) = swapspace) /* * Interactive group by. * Recognises inscriptions, graphical symbols, lore */ static void display_knowledge(const char *title, int *obj_list, int o_count, group_funcs g_funcs, member_funcs o_funcs, const char *otherfields) { /* maximum number of groups to display */ int max_group = g_funcs.maxnum < o_count ? g_funcs.maxnum : o_count ; /* This could (should?) be (void **) */ int *g_list, *g_offset; const char **g_names; int g_name_len = 8; /* group name length, minumum is 8 */ int grp_cnt = 0; /* total number groups */ int g_cur = 0, grp_old = -1; /* group list positions */ int o_cur = 0; /* object list positions */ int g_o_count = 0; /* object count for group */ int oid = -1; /* object identifiers */ region title_area = { 0, 0, 0, 4 }; region group_region = { 0, 6, MISSING, -2 }; region object_region = { MISSING, 6, 0, -2 }; /* display state variables */ bool tiles = (current_graphics_mode != NULL); bool tile_picker = FALSE; bool glyph_picker = FALSE; byte attr_top = 0; byte char_left = 0; int delay = 0; menu_type group_menu; menu_type object_menu; menu_iter object_iter = { NULL, NULL, display_group_member, NULL, NULL }; /* Panel state */ /* These are swapped in parallel whenever the actively browsing " */ /* changes */ int *active_cursor = &g_cur, *inactive_cursor = &o_cur; menu_type *active_menu = &group_menu, *inactive_menu = &object_menu; int panel = 0; void *swapspace; bool do_swap = FALSE; bool flag = FALSE; bool redraw = TRUE; int browser_rows; int wid, hgt; int i; int prev_g = -1; int omode = OPT(rogue_like_commands); ui_event ke; /* Get size */ Term_get_size(&wid, &hgt); browser_rows = hgt - 8; /* Disable the roguelike commands for the duration */ OPT(rogue_like_commands) = FALSE; /* Determine if using tiles or not */ if (tiles) tiles = (current_graphics_mode->grafID != 0); if (g_funcs.gcomp) sort(obj_list, o_count, sizeof(*obj_list), g_funcs.gcomp); /* Sort everything into group order */ g_list = C_ZNEW(max_group + 1, int); g_offset = C_ZNEW(max_group + 1, int); for (i = 0; i < o_count; i++) { if (prev_g != g_funcs.group(obj_list[i])) { prev_g = g_funcs.group(obj_list[i]); g_offset[grp_cnt] = i; g_list[grp_cnt++] = prev_g; } } g_offset[grp_cnt] = o_count; g_list[grp_cnt] = -1; /* The compact set of group names, in display order */ g_names = C_ZNEW(grp_cnt, const char *); for (i = 0; i < grp_cnt; i++) { int len; g_names[i] = g_funcs.name(g_list[i]); len = strlen(g_names[i]); if (len > g_name_len) g_name_len = len; } /* Reasonable max group name len */ if (g_name_len >= 20) g_name_len = 20; object_region.col = g_name_len + 3; group_region.width = g_name_len; /* Leave room for the group summary information */ if (g_funcs.summary) object_region.page_rows = -3; /* Set up the two menus */ menu_init(&group_menu, MN_SKIN_SCROLL, menu_find_iter(MN_ITER_STRINGS)); menu_setpriv(&group_menu, grp_cnt, g_names); menu_layout(&group_menu, &group_region); group_menu.flags |= MN_DBL_TAP; menu_init(&object_menu, MN_SKIN_SCROLL, &object_iter); menu_setpriv(&object_menu, 0, &o_funcs); menu_layout(&object_menu, &object_region); object_menu.flags |= MN_DBL_TAP; o_funcs.is_visual = FALSE; /* Save screen */ screen_save(); clear_from(0); /* This is the event loop for a multi-region panel */ /* Panels are -- text panels, two menus, and visual browser */ /* with "pop-up menu" for lore */ while ((!flag) && (grp_cnt)) { bool recall = FALSE; if (redraw) { /* Print the title bits */ region_erase(&title_area); prt(format("Knowledge - %s", title), 2, 0); prt("Group", 4, 0); prt("Name", 4, g_name_len + 3); if (otherfields) prt(otherfields, 4, 46); /* Print dividers: horizontal and vertical */ for (i = 0; i < 79; i++) Term_putch(i, 5, TERM_WHITE, '='); for (i = 0; i < browser_rows; i++) Term_putch(g_name_len + 1, 6 + i, TERM_WHITE, '|'); /* Reset redraw flag */ redraw = FALSE; } if (g_cur != grp_old) { grp_old = g_cur; o_cur = 0; g_o_count = g_offset[g_cur+1] - g_offset[g_cur]; menu_set_filter(&object_menu, obj_list + g_offset[g_cur], g_o_count); group_menu.cursor = g_cur; object_menu.cursor = 0; } /* HACK ... */ if (!(tile_picker || glyph_picker)) { /* ... The object menu may be browsing the entire group... */ o_funcs.is_visual = FALSE; menu_set_filter(&object_menu, obj_list + g_offset[g_cur], g_o_count); object_menu.cursor = o_cur; } else { /* ... or just a single element in the group. */ o_funcs.is_visual = TRUE; menu_set_filter(&object_menu, obj_list + o_cur + g_offset[g_cur], 1); object_menu.cursor = 0; } oid = obj_list[g_offset[g_cur]+o_cur]; /* Print prompt */ { const char *pedit = (!o_funcs.xattr) ? "" : (!(attr_idx|char_idx) ? ", 'c' to copy" : ", 'c', 'p' to paste"); const char *xtra = o_funcs.xtra_prompt ? o_funcs.xtra_prompt(oid) : ""; const char *pvs = ""; if (tile_picker) pvs = ", ENTER to accept"; else if (glyph_picker) pvs = ", 'i' to insert, ENTER to accept"; else if (o_funcs.xattr) pvs = ", 'v' for visuals"; prt(format("%s%s%s, ESC", pvs, pedit, xtra), hgt - 1, 0); } if (do_swap) { do_swap = FALSE; swap(active_menu, inactive_menu); swap(active_cursor, inactive_cursor); panel = 1 - panel; } if (g_funcs.summary && !tile_picker && !glyph_picker) { g_funcs.summary(g_cur, obj_list, g_o_count, g_offset[g_cur], object_menu.active.row + object_menu.active.page_rows, object_region.col); } menu_refresh(inactive_menu, FALSE); menu_refresh(active_menu, FALSE); handle_stuff(p_ptr); if (tile_picker) { bigcurs = TRUE; display_tiles(g_name_len + 3, 7, browser_rows - 1, wid - (g_name_len + 3), attr_top, char_left); place_tile_cursor(g_name_len + 3, 7, *o_funcs.xattr(oid), (byte) *o_funcs.xchar(oid), attr_top, char_left); } if (glyph_picker) { display_glyphs(g_name_len + 3, 7, browser_rows - 1, wid - (g_name_len + 3), *o_funcs.xattr(oid), *o_funcs.xchar(oid)); } if (delay) { /* Force screen update */ Term_fresh(); /* Delay */ Term_xtra(TERM_XTRA_DELAY, delay); delay = 0; } ke = inkey_ex(); if (!tile_picker && !glyph_picker) { ui_event ke0 = EVENT_EMPTY; if (ke.type == EVT_MOUSE) menu_handle_mouse(active_menu, &ke, &ke0); else if (ke.type == EVT_KBRD) menu_handle_keypress(active_menu, &ke, &ke0); if (ke0.type != EVT_NONE) ke = ke0; } /* XXX Do visual mode command if needed */ if (o_funcs.xattr && o_funcs.xchar) { if (tiles) { if (tile_picker_command(ke, &tile_picker, browser_rows - 1, wid - (g_name_len + 3), &attr_top, &char_left, o_funcs.xattr(oid), (byte *) o_funcs.xchar(oid), g_name_len + 3, 7, &delay)) continue; } else { if (glyph_command(ke, &glyph_picker, browser_rows - 1, wid - (g_name_len + 3), o_funcs.xattr(oid), o_funcs.xchar(oid), g_name_len + 3, 7)) continue; } } switch (ke.type) { case EVT_KBRD: { if (ke.key.code == 'r' || ke.key.code == 'R') recall = TRUE; else if (o_funcs.xtra_act) o_funcs.xtra_act(ke.key, oid); break; } case EVT_MOUSE: { /* Change active panels */ if (region_inside(&inactive_menu->active, &ke)) { swap(active_menu, inactive_menu); swap(active_cursor, inactive_cursor); panel = 1-panel; } continue; } case EVT_ESCAPE: { if (panel == 1) do_swap = TRUE; else flag = TRUE; break; } case EVT_SELECT: { if (panel == 0) do_swap = TRUE; else if (panel == 1 && oid >= 0 && o_cur == active_menu->cursor) recall = TRUE; break; } case EVT_MOVE: { *active_cursor = active_menu->cursor; break; } default: { break; } } /* Recall on screen */ if (recall) { if (oid >= 0) o_funcs.lore(oid); redraw = TRUE; } } /* Restore roguelike option */ OPT(rogue_like_commands) = omode; /* Prompt */ if (!grp_cnt) prt(format("No %s known.", title), 15, 0); FREE(g_names); FREE(g_offset); FREE(g_list); screen_load(); } /* * Display tiles. */ static void display_tiles(int col, int row, int height, int width, byte attr_top, byte char_left) { int i, j; /* Clear the display lines */ for (i = 0; i < height; i++) Term_erase(col, row + i, width); width = logical_width(width); height = logical_height(height); /* Display lines until done */ for (i = 0; i < height; i++) { /* Display columns until done */ for (j = 0; j < width; j++) { byte a; unsigned char c; int x = col + actual_width(j); int y = row + actual_height(i); int ia, ic; ia = attr_top + i; ic = char_left + j; a = (byte)ia; c = (unsigned char)ic; /* Display symbol */ big_pad(x, y, a, c); } } } /* * Place the cursor at the correct position for tile picking */ static void place_tile_cursor(int col, int row, byte a, byte c, byte attr_top, byte char_left) { int i = a - attr_top; int j = c - char_left; int x = col + actual_width(j); int y = row + actual_height(i); /* Place the cursor */ Term_gotoxy(x, y); } /* * Remove the tile display and clear the screen */ static void remove_tiles(int col, int row, bool *picker_ptr, int width, int height) { int i; /* No more big cursor */ bigcurs = FALSE; /* Cancel visual list */ *picker_ptr = FALSE; /* Clear the display lines */ for (i = 0; i < height; i++) Term_erase(col, row + i, width); } /* * Do tile picker command -- Change tiles */ static bool tile_picker_command(ui_event ke, bool *tile_picker_ptr, int height, int width, byte *attr_top_ptr, byte *char_left_ptr, byte *cur_attr_ptr, byte *cur_char_ptr, int col, int row, int *delay) { static byte attr_old = 0; static char char_old = 0; /* These are the distance we want to maintain between the * cursor and borders. */ int frame_left = logical_width(10); int frame_right = logical_width(10); int frame_top = logical_height(4); int frame_bottom = logical_height(4); /* Get mouse movement */ if (*tile_picker_ptr && (ke.type == EVT_MOUSE)) { int eff_width = actual_width(width); int eff_height = actual_height(height); byte a = *cur_attr_ptr; byte c = *cur_char_ptr; int my = logical_height(ke.mouse.y - row); int mx = logical_width(ke.mouse.x - col); if ((my >= 0) && (my < eff_height) && (mx >= 0) && (mx < eff_width) && ((ke.mouse.button == 1) || (a != *attr_top_ptr + my) || (c != *char_left_ptr + mx))) { /* Set the visual */ *cur_attr_ptr = a = *attr_top_ptr + my; *cur_char_ptr = c = *char_left_ptr + mx; /* Move the frame */ if (*char_left_ptr > MAX(0, (int)c - frame_left)) (*char_left_ptr)--; if (*char_left_ptr + eff_width <= MIN(255, (int)c + frame_right)) (*char_left_ptr)++; if (*attr_top_ptr > MAX(0, (int)a - frame_top)) (*attr_top_ptr)--; if (*attr_top_ptr + eff_height <= MIN(255, (int)a + frame_bottom)) (*attr_top_ptr)++; /* Delay */ *delay = 100; /* Accept change */ if (ke.mouse.button) remove_tiles(col, row, tile_picker_ptr, width, height); return TRUE; } /* Cancel change */ else if (ke.mouse.button == 2) { *cur_attr_ptr = attr_old; *cur_char_ptr = char_old; remove_tiles(col, row, tile_picker_ptr, width, height); return TRUE; } else { return FALSE; } } if (ke.type != EVT_KBRD) return FALSE; switch (ke.key.code) { case ESCAPE: { if (*tile_picker_ptr) { /* Cancel change */ *cur_attr_ptr = attr_old; *cur_char_ptr = char_old; remove_tiles(col, row, tile_picker_ptr, width, height); return TRUE; } break; } case KC_ENTER: { if (*tile_picker_ptr) { /* Accept change */ remove_tiles(col, row, tile_picker_ptr, width, height); return TRUE; } break; } case 'V': case 'v': { /* No visual mode without graphics, for now - NRM */ if (current_graphics_mode != NULL) if (current_graphics_mode->grafID == 0) break; if (!*tile_picker_ptr) { *tile_picker_ptr = TRUE; bigcurs = TRUE; *attr_top_ptr = (byte)MAX(0, (int)*cur_attr_ptr - frame_top); *char_left_ptr = (char)MAX(0, (int)*cur_char_ptr - frame_left); attr_old = *cur_attr_ptr; char_old = *cur_char_ptr; } else { /* Cancel change */ *cur_attr_ptr = attr_old; *cur_char_ptr = char_old; remove_tiles(col, row, tile_picker_ptr, width, height); } return TRUE; } case 'C': case 'c': { /* Set the tile */ attr_idx = *cur_attr_ptr; char_idx = *cur_char_ptr; return TRUE; } case 'P': case 'p': { if (attr_idx) { /* Set the char */ *cur_attr_ptr = attr_idx; *attr_top_ptr = (byte)MAX(0, (int)*cur_attr_ptr - frame_top); } if (char_idx) { /* Set the char */ *cur_char_ptr = char_idx; *char_left_ptr = (char)MAX(0, (int)*cur_char_ptr - frame_left); } return TRUE; } default: { int d = target_dir(ke.key); byte a = *cur_attr_ptr; byte c = *cur_char_ptr; if (!*tile_picker_ptr) break; bigcurs = TRUE; /* Restrict direction */ if ((a == 0) && (ddy[d] < 0)) d = 0; if ((c == 0) && (ddx[d] < 0)) d = 0; if ((a == 255) && (ddy[d] > 0)) d = 0; if ((c == 255) && (ddx[d] > 0)) d = 0; a += ddy[d]; c += ddx[d]; /* Set the tile */ *cur_attr_ptr = a; *cur_char_ptr = c; /* Move the frame */ if (ddx[d] < 0 && *char_left_ptr > MAX(0, (int)c - frame_left)) (*char_left_ptr)--; if ((ddx[d] > 0) && *char_left_ptr + (width / tile_width) <= MIN(255, (int)c + frame_right)) (*char_left_ptr)++; if (ddy[d] < 0 && *attr_top_ptr > MAX(0, (int)a - frame_top)) (*attr_top_ptr)--; if (ddy[d] > 0 && *attr_top_ptr + (height / tile_height) <= MIN(255, (int)a + frame_bottom)) (*attr_top_ptr)++; /* We need to always eat the input even if it is clipped, * otherwise it will be interpreted as a change object * selection command with messy results. */ return TRUE; } } /* Tile picker command is not used */ return FALSE; } /* * Display glyph and colours */ static void display_glyphs(int col, int row, int height, int width, byte a, wchar_t c) { int i; int x, y; /* Clear the display lines */ for (i = 0; i < height; i++) Term_erase(col, row + i, width); /* Prompt */ prt("Choose colour:", row + height/2, col); Term_locate(&x, &y); for (i = 0; i < MAX_COLORS; i++) big_pad(x + i, y, i, c); /* Place the cursor */ Term_gotoxy(x + a, y); } /* * Do glyph picker command -- Change glyphs */ static bool glyph_command(ui_event ke, bool *glyph_picker_ptr, int height, int width, byte *cur_attr_ptr, wchar_t *cur_char_ptr, int col, int row) { static byte attr_old = 0; static char char_old = 0; /* Get mouse movement */ if (*glyph_picker_ptr && (ke.type == EVT_MOUSE)) { byte a = *cur_attr_ptr; int mx = logical_width(ke.mouse.x - col); if (ke.mouse.y != row + height/2) return FALSE; if ((mx >= 0) && (mx < MAX_COLORS) && (ke.mouse.button == 1)) { /* Set the visual */ *cur_attr_ptr = a = mx - 14; /* Accept change */ remove_tiles(col, row, glyph_picker_ptr, width, height); return TRUE; } else { return FALSE; } } if (ke.type != EVT_KBRD) return FALSE; switch (ke.key.code) { case ESCAPE: { if (*glyph_picker_ptr) { /* Cancel change */ *cur_attr_ptr = attr_old; *cur_char_ptr = char_old; remove_tiles(col, row, glyph_picker_ptr, width, height); return TRUE; } break; } case KC_ENTER: { if (*glyph_picker_ptr) { /* Accept change */ remove_tiles(col, row, glyph_picker_ptr, width, height); return TRUE; } break; } case 'V': case 'v': { if (!*glyph_picker_ptr) { *glyph_picker_ptr = TRUE; attr_old = *cur_attr_ptr; char_old = *cur_char_ptr; } else { /* Cancel change */ *cur_attr_ptr = attr_old; *cur_char_ptr = char_old; remove_tiles(col, row, glyph_picker_ptr, width, height); } return TRUE; } case 'i': case 'I': { if (*glyph_picker_ptr) { char code_point[6]; bool res = FALSE; /* Ask the user for a code point */ Term_gotoxy(col, row + height/2 + 2); res = get_string("(up to 5 hex digits):", code_point, 5); /* Process input */ if (res) { unsigned long int point = strtoul(code_point, (char **)NULL, 16); *cur_char_ptr = (wchar_t) point; return TRUE; } } break; } default: { int d = target_dir(ke.key); byte a = *cur_attr_ptr; if (!*glyph_picker_ptr) break; /* Horizontal only */ if (ddy[d] != 0) break; /* Horizontal movement */ if (ddx[d] != 0) { a += ddx[d] + BASIC_COLORS; a = a % BASIC_COLORS; *cur_attr_ptr = a; } /* We need to always eat the input even if it is clipped, * otherwise it will be interpreted as a change object * selection command with messy results. */ return TRUE; } } /* Glyph picker command is not used */ return FALSE; } /* The following sections implement "subclasses" of the * abstract classes represented by member_funcs and group_funcs */ /* =================== MONSTERS ==================================== */ /* Many-to-many grouping - use default auxiliary join */ /* * Display a monster */ static void display_monster(int col, int row, bool cursor, int oid) { /* HACK Get the race index. (Should be a wrapper function) */ int r_idx = default_join[oid].oid; /* Access the race */ monster_race *r_ptr = &r_info[r_idx]; monster_lore *l_ptr = &l_list[r_idx]; /* Choose colors */ byte attr = curs_attrs[CURS_KNOWN][(int)cursor]; byte a = r_ptr->x_attr; wchar_t c = r_ptr->x_char; if ((tile_height != 1) && (a & 0x80)) { a = r_ptr->d_attr; c = r_ptr->d_char; /* If uniques are purple, make it so */ if (OPT(purple_uniques) && rf_has(r_ptr->flags, RF_UNIQUE)) a = TERM_VIOLET; } /* If uniques are purple, make it so */ else if (OPT(purple_uniques) && !(a & 0x80) && rf_has(r_ptr->flags, RF_UNIQUE)) a = TERM_VIOLET; /* Display the name */ c_prt(attr, r_ptr->name, row, col); /* Display symbol */ big_pad(66, row, a, c); /* Display kills */ if (rf_has(r_ptr->flags, RF_UNIQUE)) put_str(format("%s", (r_ptr->max_num == 0)? " dead" : "alive"), row, 70); else put_str(format("%5d", l_ptr->pkills), row, 70); } static int m_cmp_race(const void *a, const void *b) { const monster_race *r_a = &r_info[default_join[*(const int *)a].oid]; const monster_race *r_b = &r_info[default_join[*(const int *)b].oid]; int gid = default_join[*(const int *)a].gid; /* Group by */ int c = gid - default_join[*(const int *)b].gid; if (c) return c; /* Order results */ c = r_a->d_char - r_b->d_char; if (c && gid != 0) { /* UNIQUE group is ordered by level & name only */ /* Others by order they appear in the group symbols */ return wcschr(monster_group[gid].chars, r_a->d_char) - wcschr(monster_group[gid].chars, r_b->d_char); } c = r_a->level - r_b->level; if (c) return c; return strcmp(r_a->name, r_b->name); } static wchar_t *m_xchar(int oid) { return &r_info[default_join[oid].oid].x_char; } static byte *m_xattr(int oid) { return &r_info[default_join[oid].oid].x_attr; } static const char *race_name(int gid) { return monster_group[gid].name; } static void mon_lore(int oid) { int r_idx; monster_race *r_ptr; const monster_lore *l_ptr; textblock *tb; r_idx = default_join[oid].oid; assert(r_idx); r_ptr = &r_info[r_idx]; l_ptr = get_lore(r_ptr); /* Update the monster recall window */ monster_race_track(r_ptr); handle_stuff(p_ptr); tb = textblock_new(); lore_description(tb, r_ptr, l_ptr, FALSE); textui_textblock_show(tb, SCREEN_REGION, NULL); textblock_free(tb); } static void mon_summary(int gid, const int *object_list, int n, int top, int row, int col) { int i; int kills = 0; /* Access the race */ for (i = 0; i < n; i++) { int oid = default_join[object_list[i+top]].oid; kills += l_list[oid].pkills; } /* Different display for the first item if we've got uniques to show */ if (gid == 0 && rf_has((&r_info[default_join[object_list[0]].oid])->flags, RF_UNIQUE)) { c_prt(TERM_L_BLUE, format("%d known uniques, %d slain.", n, kills), row, col); } else { int tkills = 0; for (i = 0; i < z_info->r_max; i++) tkills += l_list[i].pkills; c_prt(TERM_L_BLUE, format("Creatures slain: %d/%d (in group/in total)", kills, tkills), row, col); } } static int count_known_monsters(void) { int m_count = 0; int i; size_t j; for (i = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; if (!OPT(cheat_know) && !l_list[i].sights) continue; if (!r_ptr->name) continue; if (rf_has(r_ptr->flags, RF_UNIQUE)) m_count++; for (j = 1; j < N_ELEMENTS(monster_group) - 1; j++) { const wchar_t *pat = monster_group[j].chars; if (wcschr(pat, r_ptr->d_char)) m_count++; } } return m_count; } /* * Display known monsters. */ static void do_cmd_knowledge_monsters(const char *name, int row) { group_funcs r_funcs = {N_ELEMENTS(monster_group), FALSE, race_name, m_cmp_race, default_group, mon_summary}; member_funcs m_funcs = {display_monster, mon_lore, m_xchar, m_xattr, recall_prompt, 0, 0}; int *monsters; int m_count = 0; int i; size_t j; for (i = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; if (!OPT(cheat_know) && !l_list[i].sights) continue; if (!r_ptr->name) continue; if (rf_has(r_ptr->flags, RF_UNIQUE)) m_count++; for (j = 1; j < N_ELEMENTS(monster_group) - 1; j++) { const wchar_t *pat = monster_group[j].chars; if (wcschr(pat, r_ptr->d_char)) m_count++; } } default_join = C_ZNEW(m_count, join_t); monsters = C_ZNEW(m_count, int); m_count = 0; for (i = 0; i < z_info->r_max; i++) { monster_race *r_ptr = &r_info[i]; if (!OPT(cheat_know) && !l_list[i].sights) continue; if (!r_ptr->name) continue; for (j = 0; j < N_ELEMENTS(monster_group)-1; j++) { const wchar_t *pat = monster_group[j].chars; if (j == 0 && !rf_has(r_ptr->flags, RF_UNIQUE)) continue; else if (j > 0 && !wcschr(pat, r_ptr->d_char)) continue; monsters[m_count] = m_count; default_join[m_count].oid = i; default_join[m_count++].gid = j; } } display_knowledge("monsters", monsters, m_count, r_funcs, m_funcs, " Sym Kills"); FREE(default_join); FREE(monsters); } /* =================== ARTIFACTS ==================================== */ /* Many-to-one grouping */ static void get_artifact_display_name(char *o_name, size_t namelen, int a_idx) { object_type object_type_body = { 0 }; object_type *o_ptr = &object_type_body; make_fake_artifact(o_ptr, &a_info[a_idx]); object_desc(o_name, namelen, o_ptr, ODESC_PREFIX | ODESC_BASE | ODESC_SPOIL); } /* * Display an artifact label */ static void display_artifact(int col, int row, bool cursor, int oid) { byte attr = curs_attrs[CURS_KNOWN][(int)cursor]; char o_name[80]; get_artifact_display_name(o_name, sizeof o_name, oid); c_prt(attr, o_name, row, col); } static object_type *find_artifact(struct artifact *artifact) { int i; struct store *s; /* Look for the artifact, either in inventory, store or the object list */ for (i = 1; i < z_info->o_max; i++) { if (object_byid(i)->artifact == artifact) return object_byid(i); } for (i = 0; i < INVEN_TOTAL; i++) { if (p_ptr->inventory[i].artifact == artifact) return &p_ptr->inventory[i]; } for (s = stores; s; s = s->next) for (i = 0; i < s->stock_size; i++) if (s->stock[i].artifact == artifact) return &s->stock[i]; return NULL; } /* * Show artifact lore */ static void desc_art_fake(int a_idx) { object_type *o_ptr; object_type object_type_body = { 0 }; char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; o_ptr = find_artifact(&a_info[a_idx]); /* If it's been lost, make a fake artifact for it */ if (!o_ptr) { o_ptr = &object_type_body; make_fake_artifact(o_ptr, &a_info[a_idx]); o_ptr->ident |= IDENT_NAME; /* Check the history entry, to see if it was fully known before it * was lost */ if (history_is_artifact_known(o_ptr->artifact)) object_notice_everything(o_ptr); } /* Hack -- Handle stuff */ handle_stuff(p_ptr); tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL | ODESC_CAPITAL); textui_textblock_show(tb, area, header); textblock_free(tb); #if 0 /* XXX This should be in object_info */ if (lost) text_out("\nThis artifact has been lost."); #endif } static int a_cmp_tval(const void *a, const void *b) { const artifact_type *a_a = &a_info[*(const int *)a]; const artifact_type *a_b = &a_info[*(const int *)b]; /* group by */ int ta = obj_group_order[a_a->tval]; int tb = obj_group_order[a_b->tval]; int c = ta - tb; if (c) return c; /* order by */ c = a_a->sval - a_b->sval; if (c) return c; return strcmp(a_a->name, a_b->name); } static const char *kind_name(int gid) { return object_text_order[gid].name; } static int art2gid(int oid) { return obj_group_order[a_info[oid].tval]; } /* Check if the given artifact idx is something we should "Know" about */ static bool artifact_is_known(int a_idx) { object_type *o_ptr; if (!a_info[a_idx].name) return FALSE; if (p_ptr->wizard) return TRUE; if (!a_info[a_idx].created) return FALSE; /* Check all objects to see if it exists but hasn't been IDed */ o_ptr = find_artifact(&a_info[a_idx]); if (o_ptr && !object_is_known_artifact(o_ptr)) return FALSE; return TRUE; } /* If 'artifacts' is NULL, it counts the number of known artifacts, otherwise it collects the list of known artifacts into 'artifacts' as well. */ static int collect_known_artifacts(int *artifacts, size_t artifacts_len) { int a_count = 0; int j; if (artifacts) assert(artifacts_len >= z_info->a_max); for (j = 0; j < z_info->a_max; j++) { /* Artifact doesn't exist */ if (!a_info[j].name) continue; if (OPT(cheat_xtra) || artifact_is_known(j)) { if (artifacts) artifacts[a_count++] = j; else a_count++; } } return a_count; } /* * Display known artifacts */ static void do_cmd_knowledge_artifacts(const char *name, int row) { /* HACK -- should be TV_MAX */ group_funcs obj_f = {TV_GOLD, FALSE, kind_name, a_cmp_tval, art2gid, 0}; member_funcs art_f = {display_artifact, desc_art_fake, 0, 0, recall_prompt, 0, 0}; int *artifacts; int a_count = 0; artifacts = C_ZNEW(z_info->a_max, int); /* Collect valid artifacts */ a_count = collect_known_artifacts(artifacts, z_info->a_max); display_knowledge("artifacts", artifacts, a_count, obj_f, art_f, NULL); FREE(artifacts); } /* =================== EGO ITEMS ==================================== */ /* Many-to-many grouping (uses default join) */ /* static u16b *e_note(int oid) {return &e_info[default_join[oid].oid].note;} */ static const char *ego_grp_name(int gid) { return object_text_order[gid].name; } static void display_ego_item(int col, int row, bool cursor, int oid) { /* HACK: Access the object */ ego_item_type *e_ptr = &e_info[default_join[oid].oid]; /* Choose a color */ byte attr = curs_attrs[0 != (int)e_ptr->everseen][0 != (int)cursor]; /* Display the name */ c_prt(attr, e_ptr->name, row, col); } /* * Describe fake ego item "lore" */ static void desc_ego_fake(int oid) { int e_idx = default_join[oid].oid; struct ego_item *ego = &e_info[e_idx]; textblock *tb; region area = { 0, 0, 0, 0 }; /* List ego flags */ tb = object_info_ego(ego); textui_textblock_show(tb, area, format("%s %s", ego_grp_name(default_group(oid)), ego->name)); textblock_free(tb); } /* TODO? Currently ego items will order by e_idx */ static int e_cmp_tval(const void *a, const void *b) { const ego_item_type *ea = &e_info[default_join[*(const int *)a].oid]; const ego_item_type *eb = &e_info[default_join[*(const int *)b].oid]; /* Group by */ int c = default_join[*(const int *)a].gid - default_join[*(const int *)b].gid; if (c) return c; /* Order by */ return strcmp(ea->name, eb->name); } /* * Display known ego_items */ static void do_cmd_knowledge_ego_items(const char *name, int row) { group_funcs obj_f = {TV_GOLD, FALSE, ego_grp_name, e_cmp_tval, default_group, 0}; member_funcs ego_f = {display_ego_item, desc_ego_fake, 0, 0, recall_prompt, 0, 0}; int *egoitems; int e_count = 0; int i, j; /* HACK: currently no more than 3 tvals for one ego type */ egoitems = C_ZNEW(z_info->e_max * EGO_TVALS_MAX, int); default_join = C_ZNEW(z_info->e_max * EGO_TVALS_MAX, join_t); for (i = 0; i < z_info->e_max; i++) { if (e_info[i].everseen || OPT(cheat_xtra)) { for (j = 0; j < EGO_TVALS_MAX && e_info[i].tval[j]; j++) { int gid = obj_group_order[e_info[i].tval[j]]; /* Ignore duplicate gids */ if (j > 0 && gid == default_join[e_count - 1].gid) continue; egoitems[e_count] = e_count; default_join[e_count].oid = i; default_join[e_count++].gid = gid; } } } display_knowledge("ego items", egoitems, e_count, obj_f, ego_f, NULL); FREE(default_join); FREE(egoitems); } /* =================== ORDINARY OBJECTS ==================================== */ /* Many-to-one grouping */ /* * Looks up an artifact idx given an object_kind *that's already known * to be an artifact*. Behaviour is distinctly unfriendly if passed * flavours which don't correspond to an artifact. */ static int get_artifact_from_kind(object_kind *kind) { int i; assert(of_has(kind->flags, OF_INSTA_ART)); /* Look for the corresponding artifact */ for (i = 0; i < z_info->a_max; i++) { if (kind->tval == a_info[i].tval && kind->sval == a_info[i].sval) { break; } } assert(i < z_info->a_max); return i; } /* * Display the objects in a group. */ static void display_object(int col, int row, bool cursor, int oid) { object_kind *kind = &k_info[oid]; const char *inscrip = get_autoinscription(kind); char o_name[80]; /* Choose a color */ bool aware = (!kind->flavor || kind->aware); byte attr = curs_attrs[(int)aware][(int)cursor]; /* Find graphics bits -- versions of the object_char and object_attr defines */ bool use_flavour = (kind->flavor) && !(aware && kind->tval == TV_SCROLL); byte a = use_flavour ? kind->flavor->x_attr : kind->x_attr; wchar_t c = use_flavour ? kind->flavor->x_char : kind->x_char; /* Display known artifacts differently */ if (of_has(kind->flags, OF_INSTA_ART) && artifact_is_known(get_artifact_from_kind(kind))) get_artifact_display_name(o_name, sizeof(o_name), get_artifact_from_kind(kind)); else object_kind_name(o_name, sizeof(o_name), kind, OPT(cheat_xtra)); /* If the type is "tried", display that */ if (kind->tried && !aware) my_strcat(o_name, " {tried}", sizeof(o_name)); /* Display the name */ c_prt(attr, o_name, row, col); /* Show squelch status */ if ((aware && kind_is_squelched_aware(kind)) || (!aware && kind_is_squelched_unaware(kind))) c_put_str(attr, "Yes", row, 46); /* Show autoinscription if around */ if (aware && inscrip) c_put_str(TERM_YELLOW, inscrip, row, 55); if (tile_height == 1) { big_pad(76, row, a, c); } } /* * Describe fake object */ static void desc_obj_fake(int k_idx) { object_kind *kind = &k_info[k_idx]; object_type object_type_body; object_type *o_ptr = &object_type_body; char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; /* Check for known artifacts, display them as artifacts */ if (of_has(kind->flags, OF_INSTA_ART) && artifact_is_known(get_artifact_from_kind(kind))) { desc_art_fake(get_artifact_from_kind(kind)); return; } /* Update the object recall window */ track_object_kind(kind); handle_stuff(p_ptr); /* Wipe the object */ object_wipe(o_ptr); /* Create the artifact */ object_prep(o_ptr, kind, 0, EXTREMIFY); /* Hack -- its in the store */ if (kind->aware) o_ptr->ident |= (IDENT_STORE); /* It's fully know */ if (!kind->flavor) object_notice_everything(o_ptr); /* Hack -- Handle stuff */ handle_stuff(p_ptr); tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL | ODESC_CAPITAL); textui_textblock_show(tb, area, header); textblock_free(tb); } static int o_cmp_tval(const void *a, const void *b) { const object_kind *k_a = &k_info[*(const int *)a]; const object_kind *k_b = &k_info[*(const int *)b]; /* Group by */ int ta = obj_group_order[k_a->tval]; int tb = obj_group_order[k_b->tval]; int c = ta - tb; if (c) return c; /* Order by */ c = k_a->aware - k_b->aware; if (c) return -c; /* aware has low sort weight */ switch (k_a->tval) { case TV_LIGHT: case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: case TV_DRAG_ARMOR: /* leave sorted by sval */ break; default: if (k_a->aware) return strcmp(k_a->name, k_b->name); /* Then in tried order */ c = k_a->tried - k_b->tried; if (c) return -c; return strcmp(k_a->flavor->text, k_b->flavor->text); } return k_a->sval - k_b->sval; } static int obj2gid(int oid) { return obj_group_order[k_info[oid].tval]; } static wchar_t *o_xchar(int oid) { object_kind *kind = objkind_byid(oid); if (!kind->flavor || kind->aware) return &kind->x_char; else return &kind->flavor->x_char; } static byte *o_xattr(int oid) { object_kind *kind = objkind_byid(oid); if (!kind->flavor || kind->aware) return &kind->x_attr; else return &kind->flavor->x_attr; } /* * Display special prompt for object inscription. */ static const char *o_xtra_prompt(int oid) { object_kind *k = objkind_byid(oid); const char *no_insc = ", 's' to toggle squelch, 'r'ecall, '{'"; const char *with_insc = ", 's' to toggle squelch, 'r'ecall, '{', '}'"; /* Forget it if we've never seen the thing */ if (k->flavor && !k->aware) return ""; return k->note ? with_insc : no_insc; } /* * Special key actions for object inscription. */ static void o_xtra_act(struct keypress ch, int oid) { object_kind *k = objkind_byid(oid); /* Toggle squelch */ if (squelch_tval(k->tval) && (ch.code == 's' || ch.code == 'S')) { if (k->aware) { if (kind_is_squelched_aware(k)) kind_squelch_clear(k); else kind_squelch_when_aware(k); } else { if (kind_is_squelched_unaware(k)) kind_squelch_clear(k); else kind_squelch_when_unaware(k); } return; } /* Forget it if we've never seen the thing */ if (k->flavor && !k->aware) return; /* Uninscribe */ if (ch.code == '}') { if (k->note) remove_autoinscription(oid); } else if (ch.code == '{') { /* Inscribe */ char note_text[80] = ""; /* Avoid the prompt getting in the way */ screen_save(); /* Prompt */ prt("Inscribe with: ", 0, 0); /* Default note */ if (k->note) strnfmt(note_text, sizeof(note_text), "%s", get_autoinscription(k)); /* Get an inscription */ if (askfor_aux(note_text, sizeof(note_text), NULL)) { /* Remove old inscription if existent */ if (k->note) remove_autoinscription(oid); /* Add the autoinscription */ add_autoinscription(oid, note_text); /* Notice stuff (later) */ p_ptr->notice |= (PN_AUTOINSCRIBE); p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } /* Reload the screen */ screen_load(); } } /* * Display known objects */ void textui_browse_object_knowledge(const char *name, int row) { group_funcs kind_f = {TV_GOLD, FALSE, kind_name, o_cmp_tval, obj2gid, 0}; member_funcs obj_f = {display_object, desc_obj_fake, o_xchar, o_xattr, o_xtra_prompt, o_xtra_act, 0}; int *objects; int o_count = 0; int i; object_kind *kind; objects = C_ZNEW(z_info->k_max, int); for (i = 0; i < z_info->k_max; i++) { kind = &k_info[i]; /* It's in the list if we've ever seen it, or it has a flavour, * and either it's not one of the special artifacts, or if it is, * we're not aware of it yet. This way the flavour appears in the list * until it is found. */ if ((kind->everseen || kind->flavor || OPT(cheat_xtra)) && (!of_has(kind->flags, OF_INSTA_ART) || !artifact_is_known(get_artifact_from_kind(kind)))) { int c = obj_group_order[k_info[i].tval]; if (c >= 0) objects[o_count++] = i; } } display_knowledge("known objects", objects, o_count, kind_f, obj_f, "Squelch Inscribed Sym"); FREE(objects); } /* =================== TERRAIN FEATURES ==================================== */ /* Many-to-one grouping */ /* * Display the features in a group. */ static void display_feature(int col, int row, bool cursor, int oid ) { feature_type *f_ptr = &f_info[oid]; byte attr = curs_attrs[CURS_KNOWN][(int)cursor]; c_prt(attr, f_ptr->name, row, col); if (tile_height == 1) { /* Display symbols */ col = 65; col += big_pad(col, row, f_ptr->x_attr[FEAT_LIGHTING_DARK], f_ptr->x_char[FEAT_LIGHTING_DARK]); col += big_pad(col, row, f_ptr->x_attr[FEAT_LIGHTING_LIT], f_ptr->x_char[FEAT_LIGHTING_LIT]); col += big_pad(col, row, f_ptr->x_attr[FEAT_LIGHTING_TORCH], f_ptr->x_char[FEAT_LIGHTING_TORCH]); col += big_pad(col, row, f_ptr->x_attr[FEAT_LIGHTING_LOS], f_ptr->x_char[FEAT_LIGHTING_LOS]); } } static int f_cmp_fkind(const void *a, const void *b) { const feature_type *fa = &f_info[*(const int *)a]; const feature_type *fb = &f_info[*(const int *)b]; /* group by */ int c = feat_order(*(const int *)a) - feat_order(*(const int *)b); if (c) return c; /* order by feature name */ return strcmp(fa->name, fb->name); } static const char *fkind_name(int gid) { return feature_group_text[gid]; } /* Disgusting hack to allow 4 in 1 editing of terrain visuals */ static enum grid_light_level f_uik_lighting = FEAT_LIGHTING_LIT; /* XXX needs *better* retooling for multi-light terrain */ static byte *f_xattr(int oid) { return &f_info[oid].x_attr[f_uik_lighting]; } static wchar_t *f_xchar(int oid) { return &f_info[oid].x_char[f_uik_lighting]; } static void feat_lore(int oid) { (void)oid; /* noop */ } static const char *feat_prompt(int oid) { (void)oid; return ", 'l' to cycle lighting"; } /* * Special key actions for cycling lighting */ static void f_xtra_act(struct keypress ch, int oid) { /* XXX must be a better way to cycle this */ if (ch.code == 'l') { switch (f_uik_lighting) { case FEAT_LIGHTING_LIT: f_uik_lighting = FEAT_LIGHTING_TORCH; break; case FEAT_LIGHTING_TORCH: f_uik_lighting = FEAT_LIGHTING_LOS; break; case FEAT_LIGHTING_LOS: f_uik_lighting = FEAT_LIGHTING_DARK; break; default: f_uik_lighting = FEAT_LIGHTING_LIT; break; } } else if (ch.code == 'L') { switch (f_uik_lighting) { case FEAT_LIGHTING_DARK: f_uik_lighting = FEAT_LIGHTING_LOS; break; case FEAT_LIGHTING_LOS: f_uik_lighting = FEAT_LIGHTING_TORCH; break; case FEAT_LIGHTING_LIT: f_uik_lighting = FEAT_LIGHTING_DARK; break; default: f_uik_lighting = FEAT_LIGHTING_LIT; break; } } } /* * Interact with feature visuals. */ static void do_cmd_knowledge_features(const char *name, int row) { group_funcs fkind_f = {N_ELEMENTS(feature_group_text), FALSE, fkind_name, f_cmp_fkind, feat_order, 0}; member_funcs feat_f = {display_feature, feat_lore, f_xchar, f_xattr, feat_prompt, f_xtra_act, 0}; int *features; int f_count = 0; int i; features = C_ZNEW(z_info->f_max, int); for (i = 0; i < z_info->f_max; i++) { /* Ignore non-features and mimics */ if (f_info[i].name == 0 || f_info[i].mimic != i) continue; features[f_count++] = i; /* Currently no filter for features */ } display_knowledge("features", features, f_count, fkind_f, feat_f, " Sym"); FREE(features); } /* =================== END JOIN DEFINITIONS ================================ */ static void do_cmd_knowledge_store(const char *name, int row) { store_knowledge = row - 5; do_cmd_store_knowledge(); store_knowledge = STORE_NONE; } static void do_cmd_knowledge_scores(const char *name, int row) { show_scores(); } static void do_cmd_knowledge_history(const char *name, int row) { history_display(); } /* * Definition of the "player knowledge" menu. */ static menu_action knowledge_actions[] = { { 0, 0, "Display object knowledge", textui_browse_object_knowledge }, { 0, 0, "Display artifact knowledge", do_cmd_knowledge_artifacts }, { 0, 0, "Display ego item knowledge", do_cmd_knowledge_ego_items }, { 0, 0, "Display monster knowledge", do_cmd_knowledge_monsters }, { 0, 0, "Display feature knowledge", do_cmd_knowledge_features }, { 0, 0, "Display contents of general store", do_cmd_knowledge_store }, { 0, 0, "Display contents of armourer", do_cmd_knowledge_store }, { 0, 0, "Display contents of weaponsmith", do_cmd_knowledge_store }, { 0, 0, "Display contents of temple", do_cmd_knowledge_store }, { 0, 0, "Display contents of alchemist", do_cmd_knowledge_store }, { 0, 0, "Display contents of magic shop", do_cmd_knowledge_store }, { 0, 0, "Display contents of black market", do_cmd_knowledge_store }, { 0, 0, "Display contents of home", do_cmd_knowledge_store }, { 0, 0, "Display hall of fame", do_cmd_knowledge_scores }, { 0, 0, "Display character history", do_cmd_knowledge_history }, }; static menu_type knowledge_menu; /* Keep macro counts happy. */ static void cleanup_cmds(void) { mem_free(obj_group_order); } void textui_knowledge_init(void) { /* Initialize the menus */ menu_type *menu = &knowledge_menu; menu_init(menu, MN_SKIN_SCROLL, menu_find_iter(MN_ITER_ACTIONS)); menu_setpriv(menu, N_ELEMENTS(knowledge_actions), knowledge_actions); menu->title = "Display current knowledge"; menu->selections = lower_case; /* initialize other static variables */ if (!obj_group_order) { int i; int gid = -1; obj_group_order = C_ZNEW(TV_GOLD + 1, int); atexit(cleanup_cmds); /* Allow for missing values */ for (i = 0; i <= TV_GOLD; i++) obj_group_order[i] = -1; for (i = 0; 0 != object_text_order[i].tval; i++) { if (object_text_order[i].name) gid = i; obj_group_order[object_text_order[i].tval] = gid; } } } /* * Display the "player knowledge" menu. */ void textui_browse_knowledge(void) { int i; region knowledge_region = { 0, 0, -1, 18 }; /* Grey out menu items that won't display anything */ if (collect_known_artifacts(NULL, 0) > 0) knowledge_actions[1].flags = 0; else knowledge_actions[1].flags = MN_ACT_GRAYED; knowledge_actions[2].flags = MN_ACT_GRAYED; for (i = 0; i < z_info->e_max; i++) { if (e_info[i].everseen || OPT(cheat_xtra)) { knowledge_actions[2].flags = 0; break; } } if (count_known_monsters() > 0) knowledge_actions[3].flags = 0; else knowledge_actions[3].flags = MN_ACT_GRAYED; screen_save(); menu_layout(&knowledge_menu, &knowledge_region); clear_from(0); menu_select(&knowledge_menu, 0, FALSE); screen_load(); } angband-3.5.1/src/list-gf-types.h0000644000175000017500000001436212456456606016115 0ustar chriscchrisc/* * File: src/list-gf-types.h * Purpose: Spell types used by project() and related functions. * * Fields: * name - type index (GF_THIS) * desc - text description of attack if blind * resist - object flag for resistance * num - numerator for resistance * denom - denominator for resistance (random_value) * opp - timed flag for temporary resistance ("opposition") * immunity - object flag for total immunity * side_immune - whether immunity protects from *all* side-effects * vuln - object flag for vulnerability * mon_res - monster flag for resistance * mon_vuln - monster flag for vulnerability * obj_hates - object flag for object vulnerability * obj_imm - object flag for object immunity */ /* name desc resist num denom opp immunity side_im vuln mon_resist mon_vuln obj_hates obj_imm */ GF(ARROW, "something sharp", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(MISSILE, "something", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(MANA, "something", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(HOLY_ORB, "something", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(LIGHT_WEAK, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, RF_HURT_LIGHT, 0, 0) GF(DARK_WEAK, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(WATER, "water", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, RF_IM_WATER,0, 0, 0) GF(PLASMA, "something", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, RF_RES_PLAS,0, 0, 0) GF(METEOR, "something", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(ICE, "something sharp", OF_RES_COLD, 1, RV(3,0,0,0), TMD_OPP_COLD, OF_IM_COLD, FALSE, OF_VULN_COLD, RF_IM_COLD, RF_HURT_COLD, OF_HATES_COLD, OF_IGNORE_COLD) GF(GRAVITY, "something strange",0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(INERTIA, "something strange",0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(FORCE, "something hard", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(TIME, "something strange",0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(ACID, "acid", OF_RES_ACID, 1, RV(3,0,0,0), TMD_OPP_ACID, OF_IM_ACID, TRUE, OF_VULN_ACID, RF_IM_ACID, 0, OF_HATES_ACID, OF_IGNORE_ACID) GF(ELEC, "lightning", OF_RES_ELEC, 1, RV(3,0,0,0), TMD_OPP_ELEC, OF_IM_ELEC, TRUE, OF_VULN_ELEC, RF_IM_ELEC, 0, OF_HATES_ELEC, OF_IGNORE_ELEC) GF(FIRE, "fire", OF_RES_FIRE, 1, RV(3,0,0,0), TMD_OPP_FIRE, OF_IM_FIRE, TRUE, OF_VULN_FIRE, RF_IM_FIRE, RF_HURT_FIRE, OF_HATES_FIRE, OF_IGNORE_FIRE) GF(COLD, "cold", OF_RES_COLD, 1, RV(3,0,0,0), TMD_OPP_COLD, OF_IM_COLD, TRUE, OF_VULN_COLD, RF_IM_COLD, RF_HURT_COLD, OF_HATES_COLD, OF_IGNORE_COLD) GF(POIS, "poison", OF_RES_POIS, 1, RV(3,0,0,0), TMD_OPP_POIS, 0, TRUE, 0, RF_IM_POIS, 0, 0, 0) GF(LIGHT, "something", OF_RES_LIGHT, 4, RV(6,1,6,0), 0, 0, TRUE, 0, 0, RF_HURT_LIGHT, 0, 0) GF(DARK, "something", OF_RES_DARK, 4, RV(6,1,6,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(CONFU, "something", OF_RES_CONFU, 6, RV(6,1,6,0), TMD_OPP_CONF, 0, TRUE, 0, 0, 0, 0, 0) GF(SOUND, "noise", OF_RES_SOUND, 5, RV(6,1,6,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(SHARD, "something sharp", OF_RES_SHARD, 6, RV(6,1,6,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(NEXUS, "something strange",OF_RES_NEXUS, 6, RV(6,1,6,0), 0, 0, TRUE, 0, RF_RES_NEXUS,0, 0, 0) GF(NETHER, "something cold", OF_RES_NETHR, 6, RV(6,1,6,0), 0, 0, TRUE, 0, RF_RES_NETH,0, 0, 0) GF(CHAOS, "something strange",OF_RES_CHAOS, 6, RV(6,1,6,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(DISEN, "something strange",OF_RES_DISEN, 6, RV(6,1,6,0), 0, 0, TRUE, 0, RF_RES_DISE,0, 0, 0) GF(KILL_WALL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(KILL_DOOR, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(KILL_TRAP, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(MAKE_WALL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(MAKE_DOOR, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(MAKE_TRAP, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(AWAY_UNDEAD, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(AWAY_EVIL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(AWAY_ALL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(TURN_UNDEAD, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(TURN_EVIL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(TURN_ALL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(DISP_UNDEAD, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(DISP_EVIL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(DISP_ALL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_CLONE, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_POLY, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_HEAL, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_SPEED, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_SLOW, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_CONF, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_SLEEP, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(OLD_DRAIN, NULL, 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 0, 0, 0) GF(MAX, NULL, 0, 0, RV(0,0,0,0), 0, 0, FALSE, 0, 0, 0, 0, 0) angband-3.5.1/src/cmd-know.c0000644000175000017500000004623312456456606015122 0ustar chriscchrisc/* * File: cmd4.c * Purpose: Various kinds of browsing functions. * * Copyright (c) 1997-2007 Robert A. Koeneke, James E. Wilson, Ben Harrison, * Eytan Zweig, Andrew Doull, Pete Mack. * Copyright (c) 2004 DarkGod (HTML dump code) * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "cmds.h" #include "files.h" #include "history.h" #include "object/tvalsval.h" #include "monster/mon-lore.h" #include "monster/mon-list.h" #include "monster/mon-util.h" #include "object/obj-list.h" #include "option.h" #include "prefs.h" #include "squelch.h" #include "target.h" #include "ui-menu.h" #include "ui.h" #define INFO_SCREENS 2 /* Number of screens in character info mode */ /* * Hack -- redraw the screen * * This command performs various low level updates, clears all the "extra" * windows, does a total redraw of the main window, and requests all of the * interesting updates and redraws that I can think of. * * This command is also used to "instantiate" the results of the user * selecting various things, such as graphics mode, so it must call * the "TERM_XTRA_REACT" hook before redrawing the windows. * */ void do_cmd_redraw(void) { int j; term *old = Term; /* Low level flush */ Term_flush(); /* Reset "inkey()" */ flush(); if (character_dungeon) verify_panel(); /* Hack -- React to changes */ Term_xtra(TERM_XTRA_REACT, 0); /* Combine and Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); /* Update torch */ p_ptr->update |= (PU_TORCH); /* Update stuff */ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Redraw everything */ p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_INVEN | PR_EQUIP | PR_MESSAGE | PR_MONSTER | PR_OBJECT | PR_MONLIST | PR_ITEMLIST); /* Clear screen */ Term_clear(); /* Hack -- update */ handle_stuff(p_ptr); /* Place the cursor on the player */ if (0 != character_dungeon) move_cursor_relative(p_ptr->px, p_ptr->py); /* Redraw every window */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { if (!angband_term[j]) continue; Term_activate(angband_term[j]); Term_redraw(); Term_fresh(); Term_activate(old); } } /* * Hack -- change name */ void do_cmd_change_name(void) { ui_event ke; int mode = 0; const char *p; bool more = TRUE; /* Prompt */ p = "['c' to change name, 'f' to file, 'h' to change mode, or ESC]"; /* Save screen */ screen_save(); /* Forever */ while (more) { /* Display the player */ display_player(mode); /* Prompt */ Term_putstr(2, 23, -1, TERM_WHITE, p); /* Query */ ke = inkey_ex(); if ((ke.type == EVT_KBRD)||(ke.type == EVT_BUTTON)) { switch (ke.key.code) { case ESCAPE: more = FALSE; break; case 'c': { char namebuf[32] = ""; /* Set player name */ if (get_name(namebuf, sizeof namebuf)) my_strcpy(op_ptr->full_name, namebuf, sizeof(op_ptr->full_name)); break; } case 'f': { char buf[1024]; char fname[80]; strnfmt(fname, sizeof fname, "%s.txt", player_safe_name(p_ptr, FALSE)); if (get_file(fname, buf, sizeof buf)) { if (file_character(buf, FALSE) != 0) msg("Character dump failed!"); else msg("Character dump successful."); } break; } case 'h': case ARROW_LEFT: case ' ': mode = (mode + 1) % INFO_SCREENS; break; case 'l': case ARROW_RIGHT: mode = (mode - 1) % INFO_SCREENS; break; } } else if (ke.type == EVT_MOUSE) { if (ke.mouse.button == 1) { /* Flip through the screens */ mode = (mode + 1) % INFO_SCREENS; } else if (ke.mouse.button == 2) { /* exit the screen */ more = FALSE; } else { /* Flip backwards through the screens */ mode = (mode - 1) % INFO_SCREENS; } } /* Flush messages */ message_flush(); } /* Load screen */ screen_load(); } /* * Recall the most recent message */ void do_cmd_message_one(void) { /* Recall one message XXX XXX XXX */ c_prt(message_color(0), format( "> %s", message_str(0)), 0, 0); } /* * Show previous messages to the user * * The screen format uses line 0 and 23 for headers and prompts, * skips line 1 and 22, and uses line 2 thru 21 for old messages. * * This command shows you which commands you are viewing, and allows * you to "search" for strings in the recall. * * Note that messages may be longer than 80 characters, but they are * displayed using "infinite" length, with a special sub-command to * "slide" the virtual display to the left or right. * * Attempt to only highlight the matching portions of the string. */ void do_cmd_messages(void) { ui_event ke; bool more = TRUE; int i, j, n, q; int wid, hgt; char shower[80] = ""; /* Total messages */ n = messages_num(); /* Start on first message */ i = 0; /* Start at leftmost edge */ q = 0; /* Get size */ Term_get_size(&wid, &hgt); /* Save screen */ screen_save(); /* Process requests until done */ while (more) { /* Clear screen */ Term_clear(); /* Dump messages */ for (j = 0; (j < hgt - 4) && (i + j < n); j++) { const char *msg; const char *str = message_str(i + j); byte attr = message_color(i + j); u16b count = message_count(i + j); if (count == 1) msg = str; else msg = format("%s <%dx>", str, count); /* Apply horizontal scroll */ msg = ((int)strlen(msg) >= q) ? (msg + q) : ""; /* Dump the messages, bottom to top */ Term_putstr(0, hgt - 3 - j, -1, attr, msg); /* Highlight "shower" */ if (shower[0]) { str = msg; /* Display matches */ while ((str = my_stristr(str, shower)) != NULL) { int len = strlen(shower); /* Display the match */ Term_putstr(str-msg, hgt - 3 - j, len, TERM_YELLOW, str); /* Advance */ str += len; } } } /* Display header */ prt(format("Message recall (%d-%d of %d), offset %d", i, i + j - 1, n, q), 0, 0); /* Display prompt (not very informative) */ if (shower[0]) prt("[Movement keys to navigate, '-' for next, '=' to find]", hgt - 1, 0); else prt("[Movement keys to navigate, '=' to find, or ESCAPE to exit]", hgt - 1, 0); /* Get a command */ ke = inkey_ex(); /* Scroll forwards or backwards using mouse clicks */ if (ke.type == EVT_MOUSE) { if (ke.mouse.button == 1) { if (ke.mouse.y <= hgt / 2) { /* Go older if legal */ if (i + 20 < n) i += 20; } else { /* Go newer */ i = (i >= 20) ? (i - 20) : 0; } } else if (ke.mouse.button == 2) { more = FALSE; } } else if (ke.type == EVT_KBRD) { switch (ke.key.code) { case ESCAPE: { more = FALSE; break; } case '=': { /* Get the string to find */ prt("Find: ", hgt - 1, 0); if (!askfor_aux(shower, sizeof shower, NULL)) continue; /* Set to find */ ke.key.code = '-'; break; } case ARROW_LEFT: case '4': q = (q >= wid / 2) ? (q - wid / 2) : 0; break; case ARROW_RIGHT: case '6': q = q + wid / 2; break; case ARROW_UP: case '8': if (i + 1 < n) i += 1; break; case ARROW_DOWN: case '2': case KC_ENTER: i = (i >= 1) ? (i - 1) : 0; break; case KC_PGUP: case 'p': case ' ': if (i + 20 < n) i += 20; break; case KC_PGDOWN: case 'n': i = (i >= 20) ? (i - 20) : 0; break; } } /* Find the next item */ if (ke.key.code == '-' && shower[0]) { s16b z; /* Scan messages */ for (z = i + 1; z < n; z++) { /* Search for it */ if (my_stristr(message_str(z), shower)) { /* New location */ i = z; /* Done */ break; } } } } /* Load screen */ screen_load(); } #define GET_ITEM_PARAMS \ (USE_EQUIP | USE_INVEN | USE_FLOOR | SHOW_QUIVER | SHOW_EMPTY | IS_HARMLESS) /* * Display inventory */ void do_cmd_inven(void) { int item; int ret = 3; int diff = weight_remaining(); if (!p_ptr->inventory[0].kind) { msg("You have nothing in your inventory."); return; } /* Hack -- Start in "inventory" mode */ p_ptr->command_wrk = (USE_INVEN); /* Loop this menu until an object context menu says differently */ while (ret == 3) { /* Save screen */ screen_save(); /* Prompt for a command */ prt(format("(Inventory) Burden %d.%d lb (%d.%d lb %s). Select Item: ", p_ptr->total_weight / 10, p_ptr->total_weight % 10, abs(diff) / 10, abs(diff) % 10, (diff < 0 ? "overweight" : "remaining")), 0, 0); /* Get an item to use a context command on (Display the inventory) */ if (get_item(&item, NULL, NULL, CMD_NULL, GET_ITEM_PARAMS)) { object_type *o_ptr; /* Load screen */ screen_load(); o_ptr = object_from_item_idx(item); if (o_ptr && o_ptr->kind) { /* Track the object kind */ track_object(item); while ((ret = context_menu_object(o_ptr, item)) == 2); } } else { /* Load screen */ screen_load(); ret = -1; } } } /* * Display equipment */ void do_cmd_equip(void) { int item; int last_slot = 0; int ret = 3; object_type *o_ptr; /* Find the last occupied equipment slot */ for (item = INVEN_WIELD; item < ALL_INVEN_TOTAL; item++) { o_ptr = &p_ptr->inventory[item]; if (o_ptr->kind) last_slot = item; } /* If no equipment slot is filled, nothing is being worn */ if (!last_slot) { msg("You are not wielding or wearing anything."); return; } /* Hack -- Start in "equipment" mode */ p_ptr->command_wrk = (USE_EQUIP); /* Loop this menu until an object context menu says differently */ while (ret == 3) { /* Save screen */ screen_save(); /* Get an item to use a context command on (Display the inventory) */ if (get_item(&item, "Select Item:", NULL, CMD_NULL, GET_ITEM_PARAMS)) { object_type *o_ptr; /* Load screen */ screen_load(); o_ptr = object_from_item_idx(item); if (o_ptr && o_ptr->kind) { /* Track the object kind */ track_object(item); while ((ret = context_menu_object(o_ptr, item)) == 2); } } else { /* Load screen */ screen_load(); ret = -1; } } } /* * Look command */ void do_cmd_look(void) { /* Look around */ if (target_set_interactive(TARGET_LOOK, -1, -1)) { msg("Target Selected."); } } /* * Allow the player to examine other sectors on the map */ void do_cmd_locate(void) { int dir, y1, x1, y2, x2; char tmp_val[80]; char out_val[160]; /* Start at current panel */ y1 = Term->offset_y; x1 = Term->offset_x; /* Show panels until done */ while (1) { /* Get the current panel */ y2 = Term->offset_y; x2 = Term->offset_x; /* Describe the location */ if ((y2 == y1) && (x2 == x1)) { tmp_val[0] = '\0'; } else { strnfmt(tmp_val, sizeof(tmp_val), "%s%s of", ((y2 < y1) ? " north" : (y2 > y1) ? " south" : ""), ((x2 < x1) ? " west" : (x2 > x1) ? " east" : "")); } /* Prepare to ask which way to look */ strnfmt(out_val, sizeof(out_val), "Map sector [%d,%d], which is%s your sector. Direction?", (y2 / PANEL_HGT), (x2 / PANEL_WID), tmp_val); /* More detail */ if (OPT(center_player)) { strnfmt(out_val, sizeof(out_val), "Map sector [%d(%02d),%d(%02d)], which is%s your sector. Direction?", (y2 / PANEL_HGT), (y2 % PANEL_HGT), (x2 / PANEL_WID), (x2 % PANEL_WID), tmp_val); } /* Assume no direction */ dir = 0; /* Get a direction */ while (!dir) { struct keypress command; /* Get a command (or Cancel) */ if (!get_com(out_val, &command)) break; /* Extract direction */ dir = target_dir(command); /* Error */ if (!dir) bell("Illegal direction for locate!"); } /* No direction */ if (!dir) break; /* Apply the motion */ change_panel(dir); /* Handle stuff */ handle_stuff(p_ptr); } /* Verify panel */ verify_panel(); } static int cmp_mexp(const void *a, const void *b) { u16b ia = *(const u16b *)a; u16b ib = *(const u16b *)b; if (r_info[ia].mexp < r_info[ib].mexp) return -1; if (r_info[ia].mexp > r_info[ib].mexp) return 1; return (a < b ? -1 : (a > b ? 1 : 0)); } static int cmp_level(const void *a, const void *b) { u16b ia = *(const u16b *)a; u16b ib = *(const u16b *)b; if (r_info[ia].level < r_info[ib].level) return -1; if (r_info[ia].level > r_info[ib].level) return 1; return cmp_mexp(a, b); } static int cmp_tkill(const void *a, const void *b) { u16b ia = *(const u16b *)a; u16b ib = *(const u16b *)b; if (l_list[ia].tkills < l_list[ib].tkills) return -1; if (l_list[ia].tkills > l_list[ib].tkills) return 1; return cmp_level(a, b); } static int cmp_pkill(const void *a, const void *b) { u16b ia = *(const u16b *)a; u16b ib = *(const u16b *)b; if (l_list[ia].pkills < l_list[ib].pkills) return -1; if (l_list[ia].pkills > l_list[ib].pkills) return 1; return cmp_tkill(a, b); } int cmp_monsters(const void *a, const void *b) { return cmp_level(a, b); } /* * Search the monster, item, and feature types to find the * meaning for the given symbol. * * Note: We currently search items first, then features, then * monsters, and we return the first hit for a symbol. * This is to prevent mimics and lurkers from matching * a symbol instead of the item or feature it is mimicking. * * Todo: concatenate all matches into buf. This will be much * easier once we can loop through item tvals instead of items * (see note below.) * * Todo: Should this take the user's pref files into account? */ static void lookup_symbol(struct keypress sym, char *buf, size_t max) { int i; monster_base *race; /* Look through items */ /* Note: We currently look through all items, and grab the tval when we find a match. It would make more sense to loop through tvals, but then we need to associate a display character with each tval. */ for (i = 1; i < z_info->k_max; i++) { if (char_matches_key(k_info[i].d_char, sym.code)) { strnfmt(buf, max, "%c - %s.", (char)sym.code, tval_find_name(k_info[i].tval)); return; } } /* Look through features */ /* Note: We need a better way of doing this. Currently '#' matches secret door, and '^' matches trap door (instead of the more generic "trap"). */ for (i = 1; i < z_info->f_max; i++) { if (char_matches_key(f_info[i].d_char, sym.code)) { strnfmt(buf, max, "%c - %s.", (char)sym.code, f_info[i].name); return; } } /* Look through monster templates */ for (race = rb_info; race; race = race->next){ if (char_matches_key(race->d_char, sym.code)) { strnfmt(buf, max, "%c - %s.", (char)sym.code, race->text); return; } } /* No matches */ if (isprint((char)sym.code)) { strnfmt(buf, max, "%c - Unknown Symbol.", (char)sym.code); } else { strnfmt(buf, max, "? - Unknown Symbol."); } return; } /* * Identify a character, allow recall of monsters * * Several "special" responses recall "multiple" monsters: * ^A (all monsters) * ^U (all unique monsters) * ^N (all non-unique monsters) * * The responses may be sorted in several ways, see below. * * Note that the player ghosts are ignored, since they do not exist. */ void do_cmd_query_symbol(void) { int i, n; char buf[128]; struct keypress sym; struct keypress query; bool all = FALSE; bool uniq = FALSE; bool norm = FALSE; bool recall = FALSE; u16b *who; /* Get a character, or abort */ if (!get_com("Enter character to be identified, or control+[ANU]: ", &sym)) return; /* Describe */ if (sym.code == KTRL('A')) { all = TRUE; my_strcpy(buf, "Full monster list.", sizeof(buf)); } else if (sym.code == KTRL('U')) { all = uniq = TRUE; my_strcpy(buf, "Unique monster list.", sizeof(buf)); } else if (sym.code == KTRL('N')) { all = norm = TRUE; my_strcpy(buf, "Non-unique monster list.", sizeof(buf)); } else { lookup_symbol(sym, buf, sizeof(buf)); } /* Display the result */ prt(buf, 0, 0); /* Allocate the "who" array */ who = C_ZNEW(z_info->r_max, u16b); /* Collect matching monsters */ for (n = 0, i = 1; i < z_info->r_max - 1; i++) { monster_race *r_ptr = &r_info[i]; monster_lore *l_ptr = &l_list[i]; /* Nothing to recall */ if (!OPT(cheat_know) && !l_ptr->sights) continue; /* Require non-unique monsters if needed */ if (norm && rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* Require unique monsters if needed */ if (uniq && !rf_has(r_ptr->flags, RF_UNIQUE)) continue; /* Collect "appropriate" monsters */ if (all || char_matches_key(r_ptr->d_char, sym.code)) who[n++] = i; } /* Nothing to recall */ if (!n) { /* XXX XXX Free the "who" array */ FREE(who); return; } /* Prompt */ put_str("Recall details? (y/k/n): ", 0, 40); /* Query */ query = inkey(); /* Restore */ prt(buf, 0, 0); /* Interpret the response */ if (query.code == 'k') { /* Sort by kills (and level) */ sort(who, n, sizeof(*who), cmp_pkill); } else if (query.code == 'y' || query.code == 'p') { /* Sort by level; accept 'p' as legacy */ sort(who, n, sizeof(*who), cmp_level); } else { /* Any unsupported response is "nope, no history please" */ /* XXX XXX Free the "who" array */ FREE(who); return; } /* Start at the end */ i = n - 1; /* Scan the monster memory */ while (1) { textblock *tb; /* Extract a race */ int r_idx = who[i]; monster_race *r_ptr = &r_info[r_idx]; monster_lore *l_ptr = &l_list[r_idx]; /* Hack -- Auto-recall */ monster_race_track(r_ptr); /* Hack -- Handle stuff */ handle_stuff(p_ptr); tb = textblock_new(); lore_title(tb, r_ptr); textblock_append(tb, " [(r)ecall, ESC]\n"); /* Line break is needed for proper display */ textui_textblock_place(tb, SCREEN_REGION, NULL); textblock_free(tb); /* Interact */ while (1) { /* Ignore keys during recall presentation, otherwise, the 'r' key acts like a toggle and instead of a one-off command */ if (recall) lore_show_interactive(r_ptr, l_ptr); else query = inkey(); /* Normal commands */ if (query.code != 'r') break; /* Toggle recall */ recall = !recall; } /* Stop scanning */ if (query.code == ESCAPE) break; /* Move to "prev" monster */ if (query.code == '-') { if (++i == n) i = 0; } /* Move to "next" monster */ else { if (i-- == 0) i = n - 1; } } /* Re-display the identity */ prt(buf, 0, 0); /* Free the "who" array */ FREE(who); } /* Centers the map on the player */ void do_cmd_center_map(void) { center_panel(); } /* * Display the main-screen monster list. */ void do_cmd_monlist(void) { /* Save the screen and display the list */ screen_save(); monster_list_show_interactive(Term->hgt, Term->wid); /* Return */ screen_load(); } /* * Display the main-screen item list. */ void do_cmd_itemlist(void) { /* Save the screen and display the list */ screen_save(); object_list_show_interactive(Term->hgt, Term->wid); /* Return */ screen_load(); } angband-3.5.1/src/dungeon.h0000644000175000017500000000036412456456606015042 0ustar chriscchrisc#ifndef DUNGEON_H #define DUNGEON_H extern u16b daycount; extern void dungeon_change_level(int dlev); extern void play_game(void); extern int value_check_aux1(const object_type *o_ptr); extern void idle_update(void); #endif /* !DUNGEON_H */ angband-3.5.1/src/main-sdl.c0000644000175000017500000025643712456456606015120 0ustar chriscchrisc/* * File: main-sdl.c * Purpose: Angband SDL port * * Copyright (c) 2007 Ben Harrison, Gregory Velichansky, Eric Stevens, * Leon Marrick, Iain McFall, and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "cmds.h" #include "dungeon.h" #include "files.h" /* * Comments and suggestions are welcome. The UI probably needs some * adjustment, and I need comments from you. * perhaps also something like "Angband 3.0.8 by Andi Sidwell and others; * SDL port by Iain McFall an others, please see the accompanying documentation * for credits" or something */ /* * This file helps Angband work with at least some computers capable of running * SDL, a set of simple and quite popular game development libraries that work * on many different operating systems, including Windows, most flavours of * UNIX or similar, and Mac OS X. It requires a 32-bit (or higher) machine * capable of displaying at least 640x480 in 256 colors. A Pentium or better * is strongly recommended (for speed reasons treated more fully below). * * To use this file, use an appropriate "Makefile" or "Project File", install * the required libraries (described below), make sure that "USE_SDL" is * defined somewhere, and obtain various extra files (described below). If * you are new to all this, read "makefile.sdl". * * This port uses the following libraries: SDL (v1.2+) and SDL_ttf. * All are available as source code, pre-compiled libs for developers, * and libs (or dlls) for players from www.libsdl.org * * * Other files used by this port: * - The game must have a collection of bitmap .fon files in /lib/xtra/font. * * - If "USE_GRAPHICS" is defined, then it also needs some bitmapped (.bmp) * graphics files in /lib/xtra/graf, such as "16x16.bmp" and "16x16m.bmp". * * - The "lib/pref/pref-sdl.prf" file contains keymaps, macro definitions, * and/or color redefinitions. * - The "lib/pref/font-sdl.prf" contains attr/char mappings for use with the * normal "*.fon" font files in the "lib/xtra/font/" directory. * * * * "Term" framework by Ben Harrison (benh@phial.com). * * Original Sangband SDL port and the "intrface" module by Leon Marrick * (www.runegold.org/sangband). * * Additional helpful ideas by: * 2001 Gregory Velichansky , creator of the first Angband SDL * port. * 2006 Eric Stevens , main author of the TOME SDL port. */ /* * Comments on using SDL with Angband: * * The good news: * - SDL is cross-platform. Really. No joke. If this port doesn't work on * your system, it probably isn't SDL's fault. * - SDL is relatively easy to use, allowing you you to cobble up feature-rich * apps that look half-way decent without too much fuss and bother. It's * wonderful for prototyping. * - SDL does most of what *band developers are likely to need, plus a whole * lot more we haven't realized we want yet. * - SDL is a cleanly written open-source API; it is much less painful to get * the straight word then it is with most other libraries. Also, the SDL * community offers active discussion boards, solid documentation, and * numerous code examples relating to almost any question you might have * occasion to ask. * * The bad news: * - SDL can be tedious to install. Each individual library is straightforward * enough, but *band development work requires several, the number growing as * you get more sophisticated. * - SDL (as a stand-alone lib, without the assistance of OpenGL) can be very * sluggish if you aren't careful. It is poor at detecting, let alone making * fullest use of, available video hardware, which cripples speed. So, * getting half-way decent performance in a game like Angband takes some * skill and vast amounts of effort. Speed - the lack thereof - is this * port's biggest problem. More comments below. * - SDL is not a complete game development library (although the add-ons help * tremendously). Much-needed functionality - text output, blit stretching, * and video refresh synching being three examples - were either missing * altogether or covered by functions that proved too slow or delicate for * production use. I ended up having to spend at least as much time, and * write at least as much low-level code, as I did using the Win32 API. * - SDL, like Allegro but to a lesser extent, is falling behind current tech- * nology. Development progresses, but obsolescence looms, especially on * Windows machines. */ #ifdef USE_SDL #include "main.h" #include "SDL.h" #include "SDL_ttf.h" #include "SDL_image.h" /* SDL flags used for the main window surface */ static Uint32 vflags = SDL_ANYFORMAT; /* Current screen dimensions */ static int screen_w = 800; static int screen_h = 600; /* Fullscreen dimensions */ static int full_w; static int full_h; /* Want fullscreen? */ static bool fullscreen = FALSE; static int overdraw = 0; static int overdraw_max = 0; /* XXXXXXXXX */ static char *ANGBAND_DIR_USER_SDL; /* * Used as 'system' font */ static const char *DEFAULT_FONT_FILE = "6x10x.fon"; #define MAX_FONTS 40 char *FontList[MAX_FONTS]; static int num_fonts = 0; /* * A font structure * Note that the data is only valid for a surface with matching * values for pitch & bpp. If a surface is resized the data _must_ be * recalculated. */ typedef struct sdl_Font sdl_Font; struct sdl_Font { int width; /* The dimensions of this font (in pixels)*/ int height; char name[32]; /* The name of this font */ Uint16 pitch; /* Pitch of the surface this font is made for */ Uint8 bpp; /* Bytes per pixel of the surface */ Uint8 something; /* Padding */ int *data; /* The data */ TTF_Font *sdl_font; /* The native font */ }; static sdl_Font SystemFont; #define NUM_GLYPHS 256 /* * Window information * Each window has its own surface and coordinates */ typedef struct term_window term_window; struct term_window { term term_data; SDL_Surface *surface; /* The surface for this window */ #ifdef USE_GRAPHICS SDL_Surface *tiles; /* The appropriately sized tiles for this window */ SDL_Surface *onebyone; /* The appropriately sized tiles for this window */ #endif byte Term_idx; /* Index of term that relates to this */ int top; /* Window Coordinates on the main screen */ int left; int keys; /* Size of keypress storage */ sdl_Font font; /* Font info */ char *req_font; /* Requested font */ int rows; /* Dimension in tiles */ int cols; int border; /* Border width */ int title_height; /* Height of title bar */ int width; /* Dimension in pixels == tile_wid * cols + 2 x border*/ int height; int tile_wid; /* Size in pixels of a char */ int tile_hgt; bool visible; /* Can we see this window? */ SDL_Rect uRect; /* The part that needs to be updated */ }; typedef struct mouse_info mouse_info; struct mouse_info { int left; /* Is it pressed? */ int right; int leftx; /* _IF_ left button is pressed these */ int lefty; /* show where it was pressed */ int rightx; int righty; int x; /* Current position of mouse */ int y; }; #define WINDOW_DRAW (SDL_USEREVENT + 1) /* * The basic angband text colours in an sdl friendly form */ static SDL_Color text_colours[MAX_COLORS]; SDL_Color back_colour; /* Background colour */ Uint32 back_pixel_colour; typedef struct sdl_ButtonBank sdl_ButtonBank; typedef struct sdl_Button sdl_Button; typedef struct sdl_Window sdl_Window; typedef void (*button_press_func)(sdl_Button *sender); struct sdl_Button { SDL_Rect pos; /* Position & Size */ bool selected; /* Selected? */ bool visible; /* Visible? */ button_press_func activate; /* A function to call when pressed */ sdl_ButtonBank *owner; /* Which bank is this in? */ char caption[50]; /* Text for this button */ SDL_Color unsel_colour; /* Button unselected colour */ SDL_Color sel_colour; /* Selected colour*/ SDL_Color cap_colour; /* Caption colour */ void *data; /* Something */ int tag; /* Something */ }; struct sdl_ButtonBank { sdl_Button *buttons; /* A collection of buttons */ bool *used; /* What buttons are available? */ sdl_Window *window; /* The window that these buttons are on */ bool need_update; }; /* * Other 'windows' (basically a surface with a position and buttons on it) * Currently used for the top status bar and popup windows */ typedef void (*sdl_WindowCustomDraw)(sdl_Window *window); struct sdl_Window { int top; /* Position on main window */ int left; int width; /* Dimensions */ int height; bool visible; /* Visible? */ SDL_Surface *surface; /* SDL surface info */ sdl_ButtonBank buttons; /* Buttons */ sdl_Font font; /* Font */ SDL_Surface *owner; /* Who shall I display on */ sdl_WindowCustomDraw draw_extra; /* Stuff to draw on the surface */ bool need_update; }; /* * The main surface of the application */ static SDL_Surface *AppWin; /* * The status bar */ static sdl_Window StatusBar; /* * The Popup window */ static sdl_Window PopUp; static bool popped; /* * Term windows */ static term_window windows[ANGBAND_TERM_MAX]; static int Zorder[ANGBAND_TERM_MAX]; /* Keep track of the mouse status */ static mouse_info mouse; /* * The number pad consists of 10 keys, each with an SDL identifier */ #define is_numpad(k) \ ((k == SDLK_KP0) || (k == SDLK_KP1) || (k == SDLK_KP2) || (k == SDLK_KP3) || \ (k == SDLK_KP4) || (k == SDLK_KP5) || (k == SDLK_KP6) || \ (k == SDLK_KP7) || (k == SDLK_KP8) || (k == SDLK_KP9) || (k == SDLK_KP_ENTER)) static int SnapRange = 5; /* Window snap range (pixels) */ static int StatusHeight; /* The height in pixels of the status bar */ static int SelectedTerm; /* Current selected Term */ static int AboutSelect; /* About button */ static int TermSelect; /* Term selector button */ static int FontSelect; /* Font selector button */ static int VisibleSelect; /* Hide/unhide window button*/ static int MoreSelect; /* Other options button */ static int QuitSelect; /* Quit button */ /* For saving the icon for the About Box */ static SDL_Surface *mratt = NULL; /* Buttons on the 'More' panel */ static int MoreOK; /* Accept changes */ static int MoreFullscreen; /* Fullscreen toggle button */ static int MoreSnapPlus; /* Increase snap range */ static int MoreSnapMinus; /* Decrease snap range */ static bool Moving; /* Moving a window */ static bool Sizing; /* Sizing a window */ static SDL_Rect SizingSpot; /* Rect to descibe the sizing area */ static bool Sizingshow = FALSE; /* Is the resize thingy displayed? */ static SDL_Rect SizingRect; /* Rect to describe the current resize window */ #ifdef USE_GRAPHICS #include "grafmode.h" static SDL_Surface *GfxSurface = NULL; /* A surface for the graphics */ static int MoreWidthPlus; /* Increase tile width */ static int MoreWidthMinus; /* Decrease tile width */ static int MoreHeightPlus; /* Increase tile height */ static int MoreHeightMinus; /* Decrease tile height */ static int *GfxButtons; /* Graphics mode buttons */ static int SelectedGfx; /* Current selected gfx */ #endif /* * Fill in an SDL_Rect structure. * Note it also returns the value adjusted */ static SDL_Rect *RECT(int x, int y, int w, int h, SDL_Rect *rect) { rect->x = x; rect->y = y; rect->w = w; rect->h = h; return rect; } /* * Is a point(x, y) in a rectangle? */ static bool point_in(SDL_Rect *rect, int x, int y) { if (x < rect->x) return (FALSE); if (y < rect->y) return (FALSE); if (x >= rect->x + rect->w) return (FALSE); if (y >= rect->y + rect->h) return (FALSE); /* Must be inside */ return (TRUE); } /* * Draw an outline box * Given the top, left, width & height */ static void sdl_DrawBox(SDL_Surface *surface, SDL_Rect *rect, SDL_Color colour, int width) { SDL_Rect rc; int left = rect->x; int right = rect->x + rect->w - width; int top = rect->y; int bottom = rect->y + rect->h - width; Uint32 pixel_colour = SDL_MapRGB(surface->format, colour.r, colour.g, colour.b); /* Top left -> Top Right */ RECT(left, top, rect->w, width, &rc); SDL_FillRect(surface, &rc, pixel_colour); /* Bottom left -> Bottom Right */ RECT(left, bottom, rect->w, width, &rc); SDL_FillRect(surface, &rc, pixel_colour); /* Top left -> Bottom left */ RECT(left, top, width, rect->h, &rc); SDL_FillRect(surface, &rc, pixel_colour); /* Top right -> Bottom right */ RECT(right, top, width, rect->h, &rc); SDL_FillRect(surface, &rc, pixel_colour); } /* * Get the width and height of a given font file */ static errr sdl_CheckFont(const char *fontname, int *width, int *height) { char buf[1024]; TTF_Font *ttf_font; /* Build the path */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_FONT, fontname); /* Attempt to load it */ ttf_font = TTF_OpenFont(buf, 0); /* Bugger */ if (!ttf_font) return (-1); /* Get the size */ if (TTF_SizeText(ttf_font, "M", width, height)) return (-1); /* Finished with the font */ TTF_CloseFont(ttf_font); return (0); } /* * The sdl_Font routines */ /* * Free any memory assigned by Create() */ static void sdl_FontFree(sdl_Font *font) { /* Finished with the font */ TTF_CloseFont(font->sdl_font); } /* * Create new font data with font fontname, optimizing the data * for the surface given */ static errr sdl_FontCreate(sdl_Font *font, const char *fontname, SDL_Surface *surface) { char buf[1024]; TTF_Font *ttf_font; /* Build the path */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_FONT, fontname); /* Attempt to load it */ ttf_font = TTF_OpenFont(buf, 0); /* Bugger */ if (!ttf_font) return (-1); /* Get the size */ if (TTF_SizeText(ttf_font, "M", &font->width, &font->height)) return (-1); /* Fill in some of the font struct */ if (font->name != fontname) my_strcpy(font->name, fontname, 30); font->pitch = surface->pitch; font->bpp = surface->format->BytesPerPixel; font->sdl_font = ttf_font; /* Success */ return (0); } /* * Draw some text onto a surface, allowing shaded backgrounds * The surface is first checked to see if it is compatible with * this font, if it isn't the the font will be 're-precalculated' * * You can, I suppose, use one font on many surfaces, but it is * definitely not recommended. One font per surface is good enough. */ static errr sdl_mapFontDraw(sdl_Font *font, SDL_Surface *surface, SDL_Color colour, SDL_Color bg, int x, int y, int n , const char *s) { Uint8 bpp = surface->format->BytesPerPixel; Uint16 pitch = surface->pitch; SDL_Rect rc; SDL_Surface *text; if ((bpp != font->bpp) || (pitch != font->pitch)) sdl_FontCreate(font, font->name, surface); /* Lock the window surface (if necessary) */ if (SDL_MUSTLOCK(surface)) { if (SDL_LockSurface(surface) < 0) return (-1); } RECT(x, y, n * font->width, font->height, &rc); text = TTF_RenderUTF8_Shaded(font->sdl_font, s, colour, bg); if (text) { SDL_BlitSurface(text, NULL, surface, &rc); SDL_FreeSurface(text); } /* Unlock the surface */ if (SDL_MUSTLOCK(surface)) SDL_UnlockSurface(surface); /* Success */ return (0); } /* * Draw some text onto a surface * The surface is first checked to see if it is compatible with * this font, if it isn't the the font will be 're-precalculated' * * You can, I suppose, use one font on many surfaces, but it is * definitely not recommended. One font per surface is good enough. */ static errr sdl_FontDraw(sdl_Font *font, SDL_Surface *surface, SDL_Color colour, int x, int y, int n , const char *s) { Uint8 bpp = surface->format->BytesPerPixel; Uint16 pitch = surface->pitch; SDL_Rect rc; SDL_Surface *text; if ((bpp != font->bpp) || (pitch != font->pitch)) sdl_FontCreate(font, font->name, surface); /* Lock the window surface (if necessary) */ if (SDL_MUSTLOCK(surface)) { if (SDL_LockSurface(surface) < 0) return (-1); } RECT(x, y, n * font->width, font->height, &rc); text = TTF_RenderUTF8_Solid(font->sdl_font, s, colour); if (text) { SDL_BlitSurface(text, NULL, surface, &rc); SDL_FreeSurface(text); } /* Unlock the surface */ if (SDL_MUSTLOCK(surface)) SDL_UnlockSurface(surface); /* Success */ return (0); } /* * Draw a button on the screen */ static void sdl_ButtonDraw(sdl_Button *button) { SDL_Surface *surface = button->owner->window->surface; sdl_Font *font = &button->owner->window->font; SDL_Color colour = button->selected ? button->sel_colour : button->unsel_colour; if (!button->visible) return; SDL_FillRect(surface, &button->pos, SDL_MapRGB(surface->format, colour.r, colour.g, colour.b)); if (strlen(button->caption)) { size_t len = strlen(button->caption); unsigned max = button->pos.w / font->width; int n = MIN(len, max); int l = n * font->width / 2; int x = button->pos.x + ((button->pos.w) / 2) - l; sdl_FontDraw(font, surface, button->cap_colour, x, button->pos.y + 1, n, button->caption); } } /* * Adjust the position of a button */ static void sdl_ButtonMove(sdl_Button *button, int x, int y) { button->pos.x = x; button->pos.y = y; button->owner->need_update = TRUE; } /* * Adjust the size of a button */ static void sdl_ButtonSize(sdl_Button *button, int w, int h) { button->pos.w = w; button->pos.h = h; button->owner->need_update = TRUE; } /* * Set the caption */ static void sdl_ButtonCaption(sdl_Button *button, const char *s) { my_strcpy(button->caption, s, sizeof(button->caption)); button->owner->need_update = TRUE; } /* * Set the visibility of a button */ static void sdl_ButtonVisible(sdl_Button *button, bool visible) { if (button->visible != visible) { button->visible = visible; button->owner->need_update = TRUE; } } /* Maximum amount of buttons in a bank */ #define MAX_BUTTONS 40 /* * The button_bank package */ /* * Initialize it */ static void sdl_ButtonBankInit(sdl_ButtonBank *bank, sdl_Window *window) { bank->window = window; bank->buttons = C_ZNEW(MAX_BUTTONS, sdl_Button); bank->used = C_ZNEW(MAX_BUTTONS, bool); bank->need_update = TRUE; } /* * Clear the bank */ static void sdl_ButtonBankFree(sdl_ButtonBank *bank) { FREE(bank->buttons); FREE(bank->used); } /* * Draw all the buttons on the screen */ static void sdl_ButtonBankDrawAll(sdl_ButtonBank *bank) { int i; for (i = 0; i < MAX_BUTTONS; i++) { sdl_Button *button = &bank->buttons[i]; if (!bank->used[i]) continue; if (!button->visible) continue; sdl_ButtonDraw(button); } bank->need_update = FALSE; } /* * Get a new button index */ static int sdl_ButtonBankNew(sdl_ButtonBank *bank) { int i = 0; sdl_Button *new_button; while (bank->used[i] && (i < MAX_BUTTONS)) i++; if (i == MAX_BUTTONS) { /* Bugger! */ return (-1); } /* Get the button */ new_button = &bank->buttons[i]; /* Mark the button as used */ bank->used[i] = TRUE; /* Clear it */ WIPE(new_button, sdl_Button); /* Mark it as mine */ new_button->owner = bank; /* Default colours */ new_button->unsel_colour.r = 160; new_button->unsel_colour.g = 160; new_button->unsel_colour.b = 60; new_button->sel_colour.r = 210; new_button->sel_colour.g = 210; new_button->sel_colour.b = 110; new_button->cap_colour.r = 0; new_button->cap_colour.g = 0; new_button->cap_colour.b = 0; /* Success */ return (i); } /* * Retrieve button 'idx' or NULL */ static sdl_Button *sdl_ButtonBankGet(sdl_ButtonBank *bank, int idx) { /* Check the index */ if ((idx < 0) || (idx >= MAX_BUTTONS)) return (NULL); if (!bank->used[idx]) return (NULL); /* Return it */ return &bank->buttons[idx]; } #if 0 /* * Remove a Button by its index */ static void sdl_ButtonBankRemove(sdl_ButtonBank *bank, int idx) { sdl_Button *button; /* Check the index */ if ((idx < 0) || (idx >= MAX_BUTTONS)) return; if (!bank->used[idx]) return; /* Grab it */ button = &bank->buttons[idx]; /* Hide it */ button->visible = FALSE; /* Draw it */ bank->need_update = TRUE; /* Forget */ bank->used[idx] = FALSE; } #endif /* * Examine and respond to mouse presses * Return if we 'handled' the click */ static bool sdl_ButtonBankMouseDown(sdl_ButtonBank *bank, int x, int y) { int i; /* Check every button */ for (i = 0; i < MAX_BUTTONS; i++) { sdl_Button *button = &bank->buttons[i]; /* Discard some */ if (!bank->used[i]) continue; if (!button->visible) continue; /* Check the coordinates */ if (point_in(&button->pos, x, y)) { button->selected = TRUE; /* Draw it */ bank->need_update = TRUE; return (TRUE); } } return (FALSE); } /* * Respond to a mouse button release */ static bool sdl_ButtonBankMouseUp(sdl_ButtonBank *bank, int x, int y) { int i; /* Check every button */ for (i = 0; i < MAX_BUTTONS; i++) { sdl_Button *button = &bank->buttons[i]; /* Discard some */ if (!bank->used[i]) continue; if (!button->visible) continue; /* Check the coordinates */ if (point_in(&button->pos, x, y)) { /* Has this butoon been 'selected'? */ if (button->selected) { /* Activate the button (usually) */ if (button->activate) (*button->activate)(button); /* Now not selected */ button->selected = FALSE; /* Draw it */ bank->need_update = TRUE; return (TRUE); } } else { /* This button was 'selected' but the release of the */ /* mouse button was outside the area of this button */ if (button->selected) { /* Now not selected */ button->selected = FALSE; /* Draw it */ bank->need_update = TRUE; } } } return (FALSE); } /* * sdl_Window functions */ static void sdl_WindowFree(sdl_Window* window) { if (window->surface) { SDL_FreeSurface(window->surface); sdl_ButtonBankFree(&window->buttons); sdl_FontFree(&window->font); WIPE(window, sdl_Window); } } /* * Initialize a window */ static void sdl_WindowInit(sdl_Window* window, int w, int h, SDL_Surface *owner, const char *fontname) { sdl_WindowFree(window); window->owner = owner; window->width = w; window->height = h; window->surface = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, owner->format->BitsPerPixel, owner->format->Rmask, owner->format->Gmask, owner->format->Bmask, owner->format->Amask); sdl_ButtonBankInit(&window->buttons, window); sdl_FontCreate(&window->font, fontname, window->surface); window->visible = TRUE; window->need_update = TRUE; } static void sdl_WindowBlit(sdl_Window* window) { SDL_Rect rc; if (!window->visible) return; RECT(window->left, window->top, window->width, window->height, &rc); SDL_BlitSurface(window->surface, NULL, window->owner, &rc); SDL_UpdateRects(window->owner, 1, &rc); } static void sdl_WindowText(sdl_Window* window, SDL_Color c, int x, int y, const char *s) { sdl_FontDraw(&window->font, window->surface, c, x, y, strlen(s), s); } static void sdl_WindowUpdate(sdl_Window* window) { if ((window->need_update || window->buttons.need_update) && (window->visible)) { SDL_Event Event; SDL_FillRect(window->surface, NULL, back_pixel_colour); if (window->draw_extra) (*window->draw_extra)(window); sdl_ButtonBankDrawAll(&window->buttons); window->need_update = FALSE; WIPE(&Event, SDL_Event); Event.type = WINDOW_DRAW; Event.user.data1 = (void*)window; SDL_PushEvent(&Event); } } static void term_windowFree(term_window* win) { if (win->surface) { SDL_FreeSurface(win->surface); win->surface = NULL; #ifdef USE_GRAPHICS /* Invalidate the gfx surface */ if (win->tiles) { SDL_FreeSurface(win->tiles); win->tiles = NULL; } if (win->onebyone) { SDL_FreeSurface(win->onebyone); win->onebyone = NULL; } #endif term_nuke(&win->term_data); } sdl_FontFree(&win->font); } static errr save_prefs(void); static void hook_quit(const char *str) { int i; save_prefs(); string_free(ANGBAND_DIR_USER_SDL); /* Free the surfaces of the windows */ for (i = 0; i < ANGBAND_TERM_MAX; i++) { term_windowFree(&windows[i]); string_free(windows[i].req_font); } #ifdef USE_GRAPHICS /* Free the graphics surface */ if (GfxSurface) SDL_FreeSurface(GfxSurface); #endif close_graphics_modes(); if (GfxButtons) FREE(GfxButtons); /* Free the 'System font' */ sdl_FontFree(&SystemFont); /* Free the statusbar window */ sdl_WindowFree(&StatusBar); /* free the popup window */ sdl_WindowFree(&PopUp); /* Free the main surface */ SDL_FreeSurface(AppWin); /* Shut down the font library */ TTF_Quit(); /* Shut down SDL */ SDL_Quit(); for (i = 0; i < MAX_FONTS; i++) string_free(FontList[i]); } static void BringToTop(void) { int i, idx; for (idx = 0; idx < ANGBAND_TERM_MAX; idx++) { if (Zorder[idx] == SelectedTerm) break; } if (idx == ANGBAND_TERM_MAX) return; for (i = idx; i < ANGBAND_TERM_MAX - 1; i++) { Zorder[i] = Zorder[i + 1]; } Zorder[ANGBAND_TERM_MAX - 1] = SelectedTerm; } /* * Validate a file */ static void validate_file(const char *s) { if (!file_exists(s)) quit_fmt("Cannot find required file:\n%s", s); } /* * Find a window that is under the points x,y on * the main screen */ static int sdl_LocateWin(int x, int y) { int i; for (i = ANGBAND_TERM_MAX - 1; i >= 0; i--) { term_window *win = &windows[Zorder[i]]; SDL_Rect rc; if (!win->visible) continue; if (!point_in(RECT(win->left, win->top, win->width, win->height, &rc), x, y)) continue; return (Zorder[i]); } return (-1); } static void draw_statusbar(sdl_Window *window) { char buf[128]; term_window *win = &windows[SelectedTerm]; int fw = window->font.width; int x = 1; sdl_Button *button; SDL_Rect rc; SDL_Color c = {160, 160, 60, 0}; RECT(0, StatusBar.height - 1, StatusBar.width, 1, &rc); SDL_FillRect(StatusBar.surface, &rc, SDL_MapRGB(StatusBar.surface->format, c.r, c.g, c.b)); button = sdl_ButtonBankGet(&StatusBar.buttons, AboutSelect); x += button->pos.w + 20; sdl_WindowText(&StatusBar, c, x, 1, "Term:"); x += 5 * fw; button = sdl_ButtonBankGet(&StatusBar.buttons, TermSelect); button->pos.x = x; x += button->pos.w + 10; my_strcpy(buf, format("(%dx%d)", win->cols, win->rows), sizeof(buf)); sdl_WindowText(&StatusBar, c, x, 1, buf); x += strlen(buf) * fw + 20; sdl_WindowText(&StatusBar, c, x, 1, "Visible:"); x += 8 * fw; button = sdl_ButtonBankGet(&StatusBar.buttons, VisibleSelect); button->pos.x = x; x += button->pos.w + 20; button = sdl_ButtonBankGet(&StatusBar.buttons, FontSelect); if (button->visible) sdl_WindowText(&StatusBar, c, x, 1, "Font:"); x += 5 * fw; button->pos.x = x; x += button->pos.w + 20; button = sdl_ButtonBankGet(&StatusBar.buttons, MoreSelect); button->pos.x = x; x += button->pos.w + 20; } static void sdl_BlitWin(term_window *win) { SDL_Rect rc; if (!win->surface) return; if (!win->visible) return; if (win->uRect.x == -1) return; /* Select the area to be updated */ RECT(win->left + win->uRect.x, win->top + win->uRect.y, win->uRect.w, win->uRect.h, &rc); SDL_BlitSurface(win->surface, &win->uRect, AppWin, &rc); SDL_UpdateRects(AppWin, 1, &rc); /* Mark the update as complete */ win->uRect.x = -1; } static void sdl_BlitAll(void) { SDL_Rect rc; sdl_Window *window = &StatusBar; int i; SDL_Color colour = {160, 160, 60, 0}; /* int32 ccolour = SDL_MapRGB(AppWin->format, 160, 40, 40); */ SDL_FillRect(AppWin, NULL, back_pixel_colour); for (i = 0; i < ANGBAND_TERM_MAX; i++) { term_window *win = &windows[Zorder[i]]; if (!win->surface) continue; if (!win->visible) continue; RECT(win->left, win->top, win->width, win->height, &rc); SDL_BlitSurface(win->surface, NULL, AppWin, &rc); if (Zorder[i] == SelectedTerm) { SizingSpot.w = 10; SizingSpot.h = 10; SizingSpot.x = win->left + win->width - 10; SizingSpot.y = win->top + win->height - 10; /* SDL_FillRect(AppWin, &SizingSpot, ccolour); */ if (Sizing) { int width = 2; int grabsize = 10; rc = SizingRect; SizingSpot.w = grabsize; SizingSpot.h = grabsize; SizingSpot.x = SizingRect.x + SizingRect.w - grabsize; SizingSpot.y = SizingRect.y + SizingRect.h - grabsize; sdl_DrawBox(AppWin, &rc, colour, width); } } } RECT(window->left, window->top, window->width, window->height, &rc); SDL_BlitSurface(window->surface, NULL, AppWin, &rc); SDL_UpdateRect(AppWin, 0, 0, AppWin->w, AppWin->h); } static void RemovePopUp(void) { PopUp.visible = FALSE; popped = FALSE; sdl_BlitAll(); } static void QuitActivate(sdl_Button *sender) { SDL_Event Event; Event.type = SDL_QUIT; SDL_PushEvent(&Event); } static void SetStatusButtons(void) { term_window *win = &windows[SelectedTerm]; sdl_Button *button = sdl_ButtonBankGet(&StatusBar.buttons, TermSelect); sdl_Button *fontbutton = sdl_ButtonBankGet(&StatusBar.buttons, FontSelect); sdl_Button *visbutton = sdl_ButtonBankGet(&StatusBar.buttons, VisibleSelect); sdl_ButtonCaption(button, angband_term_name[SelectedTerm]); if (!win->visible) { sdl_ButtonVisible(fontbutton, FALSE); sdl_ButtonCaption(visbutton, "No"); } else { sdl_ButtonVisible(fontbutton, TRUE); sdl_ButtonCaption(fontbutton, win->font.name); sdl_ButtonCaption(visbutton, "Yes"); } } static void TermFocus(int idx) { if (SelectedTerm == idx) return; SelectedTerm = idx; BringToTop(); SetStatusButtons(); sdl_BlitAll(); } static void AboutDraw(sdl_Window *win) { SDL_Rect rc; SDL_Rect icon; /* Wow - a different colour! */ SDL_Color colour = {160, 60, 60, 0}; RECT(0, 0, win->width, win->height, &rc); /* Draw a nice box */ SDL_FillRect(win->surface, &win->surface->clip_rect, SDL_MapRGB(win->surface->format, 255,255,255)); sdl_DrawBox(win->surface, &win->surface->clip_rect, colour, 5); if (mratt) { RECT((win->width - mratt->w) / 2, 5, mratt->w, mratt->h, &icon); SDL_BlitSurface(mratt, NULL, win->surface, &icon); } sdl_WindowText(win, colour, 20, 150, format("You are playing %s", buildid)); sdl_WindowText(win, colour, 20, 160, "See http://www.rephial.org"); } static void AboutActivate(sdl_Button *sender) { int width = 350; int height = 200; sdl_WindowInit(&PopUp, width, height, AppWin, StatusBar.font.name); PopUp.left = (AppWin->w / 2) - width / 2; PopUp.top = (AppWin->h / 2) - height / 2; PopUp.draw_extra = AboutDraw; popped = TRUE; } static void SelectTerm(sdl_Button *sender) { RemovePopUp(); TermFocus(sender->tag); } static void TermActivate(sdl_Button *sender) { int i, maxl = 0; int width, height = ANGBAND_TERM_MAX * (StatusBar.font.height + 1); for (i = 0; i < ANGBAND_TERM_MAX; i++) { int l = strlen(angband_term_name[i]); if (l > maxl) maxl = l; } width = maxl * StatusBar.font.width + 20; sdl_WindowInit(&PopUp, width, height, AppWin, StatusBar.font.name); PopUp.left = sender->pos.x; PopUp.top = sender->pos.y; for (i = 0; i < ANGBAND_TERM_MAX; i++) { int h = PopUp.font.height; int b = sdl_ButtonBankNew(&PopUp.buttons); sdl_Button *button = sdl_ButtonBankGet(&PopUp.buttons, b); sdl_ButtonSize(button, width - 2 , h); sdl_ButtonMove(button, 1, i * (h + 1)); sdl_ButtonCaption(button, angband_term_name[i]); sdl_ButtonVisible(button, TRUE); button->tag = i; button->activate = SelectTerm; } popped = TRUE; } static void ResizeWin(term_window* win, int w, int h); static void term_data_link_sdl(term_window *win); static void VisibleActivate(sdl_Button *sender) { term_window *window = &windows[SelectedTerm]; if (SelectedTerm == 0) return; if (window->visible) { window->visible = FALSE; term_windowFree(window); angband_term[SelectedTerm] = NULL; } else { window->visible = TRUE; ResizeWin(window, window->width, window->height); } SetStatusButtons(); sdl_BlitAll(); } static void SelectFont(sdl_Button *sender) { term_window *window = &windows[SelectedTerm]; int w, h; sdl_FontFree(&window->font); string_free(window->req_font); window->req_font = string_make(sender->caption); sdl_CheckFont(window->req_font, &w, &h); #ifdef USE_GRAPHICS /* Invalidate the gfx surface */ if (window->tiles) { SDL_FreeSurface(window->tiles); window->tiles = NULL; } #endif ResizeWin(window, (w * window->cols) + (2 * window->border), (h * window->rows) + window->border + window->title_height); SetStatusButtons(); RemovePopUp(); } static void FontActivate(sdl_Button *sender) { int i, maxl = 0; int width, height = num_fonts * (StatusBar.font.height + 1); for (i = 0; i < num_fonts; i++) { int l = strlen(FontList[i]); if (l > maxl) maxl = l; } width = maxl * StatusBar.font.width + 20; sdl_WindowInit(&PopUp, width, height, AppWin, StatusBar.font.name); PopUp.left = sender->pos.x; PopUp.top = sender->pos.y; for (i = 0; i < num_fonts; i++) { int h = PopUp.font.height; int b = sdl_ButtonBankNew(&PopUp.buttons); sdl_Button *button = sdl_ButtonBankGet(&PopUp.buttons, b); sdl_ButtonSize(button, width - 2 , h); sdl_ButtonMove(button, 1, i * (h + 1)); sdl_ButtonCaption(button, FontList[i]); sdl_ButtonVisible(button, TRUE); button->activate = SelectFont; } popped = TRUE; } #ifdef USE_GRAPHICS static errr load_gfx(void); static bool do_update = FALSE; static void SelectGfx(sdl_Button *sender) { SelectedGfx = sender->tag; } #endif static void AcceptChanges(sdl_Button *sender) { sdl_Button *button; bool do_video_reset = FALSE; #ifdef USE_GRAPHICS if (use_graphics != SelectedGfx) { do_update = TRUE; use_graphics = SelectedGfx; } if (use_graphics) { arg_graphics = TRUE; load_gfx(); } else { current_graphics_mode = NULL; arg_graphics = FALSE; tile_width = 1; tile_height = 1; reset_visuals(TRUE); } /* Invalidate all the gfx surfaces */ if (do_update) { int i; for (i = 0; i < ANGBAND_TERM_MAX; i++) { term_window *win = &windows[i]; if (win->tiles) { SDL_FreeSurface(win->tiles); win->tiles = NULL; } if (win->onebyone) { SDL_FreeSurface(win->onebyone); win->onebyone = NULL; } } } #endif button = sdl_ButtonBankGet(&PopUp.buttons, MoreFullscreen); if (button->tag != fullscreen) { fullscreen = !fullscreen; do_video_reset = TRUE; } SetStatusButtons(); RemovePopUp(); if (do_update) { if (character_dungeon) do_cmd_redraw(); } if (do_video_reset) { SDL_Event Event; WIPE(&Event, SDL_Event); Event.type = SDL_VIDEORESIZE; Event.resize.w = screen_w; Event.resize.h = screen_h; SDL_PushEvent(&Event); } do_update = FALSE; } static void FlipTag(sdl_Button *sender) { if (sender->tag) { sender->tag = 0; sdl_ButtonCaption(sender, "Off"); } else { sender->tag = 1; sdl_ButtonCaption(sender, "On"); } } static void SnapChange(sdl_Button *sender) { SnapRange += sender->tag; if (SnapRange < 0) SnapRange = 0; if (SnapRange > 20) SnapRange = 20; PopUp.need_update = TRUE; } #ifdef USE_GRAPHICS static void WidthChange(sdl_Button *sender) { tile_width += sender->tag; if (tile_width < 1) tile_width = 1; if (tile_width > 12) tile_width = 12; do_update = TRUE; } static void HeightChange(sdl_Button *sender) { tile_height += sender->tag; if (tile_height < 1) tile_height = 1; if (tile_height > 8) tile_height = 8; do_update = TRUE; } #endif static void MoreDraw(sdl_Window *win) { SDL_Rect rc; sdl_Button *button; int y = 20; graphics_mode *mode; /* Wow - a different colour! */ SDL_Color colour = {160, 60, 60, 0}; SDL_Color select_colour = {210, 110, 110, 0}; RECT(0, 0, win->width, win->height, &rc); /* Draw a nice box */ sdl_DrawBox(win->surface, &rc, colour, 5); #ifdef USE_GRAPHICS button = sdl_ButtonBankGet(&win->buttons, MoreWidthMinus); if (SelectedGfx) { sdl_WindowText(win, colour, 20, y, format("Tile width is %d.", tile_width)); sdl_ButtonMove(button, 200, y); sdl_ButtonVisible(button, TRUE); } else { sdl_ButtonVisible(button, FALSE); } button = sdl_ButtonBankGet(&win->buttons, MoreWidthPlus); if (SelectedGfx) { sdl_ButtonMove(button, 230, y); sdl_ButtonVisible(button, TRUE); y += 20; } else { sdl_ButtonVisible(button, FALSE); } button = sdl_ButtonBankGet(&win->buttons, MoreHeightMinus); if (SelectedGfx) { sdl_WindowText(win, colour, 20, y, format("Tile height is %d.", tile_height)); sdl_ButtonMove(button, 200, y); sdl_ButtonVisible(button, TRUE); } else { sdl_ButtonVisible(button, FALSE); } button = sdl_ButtonBankGet(&win->buttons, MoreHeightPlus); if (SelectedGfx) { sdl_ButtonMove(button, 230, y); sdl_ButtonVisible(button, TRUE); y += 20; } else { sdl_ButtonVisible(button, FALSE); } sdl_WindowText(win, colour, 20, y, "Selected Graphics:"); if (current_graphics_mode) { sdl_WindowText(win, select_colour, 200, y, current_graphics_mode->menuname); } else { sdl_WindowText(win, select_colour, 200, y, "None"); } y += 20; sdl_WindowText(win, colour, 20, y, "Available Graphics:"); mode = graphics_modes; while (mode) { if (!mode->menuname[0]) { mode = mode->pNext; continue; } button = sdl_ButtonBankGet(&win->buttons, GfxButtons[mode->grafID]); sdl_ButtonMove(button, 200, y); y += 20; mode = mode->pNext; } #endif button = sdl_ButtonBankGet(&win->buttons, MoreFullscreen); sdl_WindowText(win, colour, 20, y, "Fullscreen is:"); sdl_ButtonMove(button, 200, y); y+= 20; sdl_WindowText(win, colour, 20, y, format("Snap range is %d.", SnapRange)); button = sdl_ButtonBankGet(&win->buttons, MoreSnapMinus); sdl_ButtonMove(button, 200, y); button = sdl_ButtonBankGet(&win->buttons, MoreSnapPlus); sdl_ButtonMove(button, 230, y); } static void MoreActivate(sdl_Button *sender) { int width = 300; int height = 300; sdl_Button *button; graphics_mode *mode; SDL_Color ucolour = {160, 60, 60, 0}; SDL_Color scolour = {210, 110, 110, 0}; sdl_WindowInit(&PopUp, width, height, AppWin, StatusBar.font.name); PopUp.left = (AppWin->w / 2) - width / 2; PopUp.top = (AppWin->h / 2) - height / 2; PopUp.draw_extra = MoreDraw; #ifdef USE_GRAPHICS MoreWidthPlus = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreWidthPlus); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 20, PopUp.font.height + 2); sdl_ButtonCaption(button, "+"); button->tag = 1; sdl_ButtonVisible(button, TRUE); button->activate = WidthChange; MoreWidthMinus = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreWidthMinus); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 20, PopUp.font.height + 2); sdl_ButtonCaption(button, "-"); button->tag = -1; sdl_ButtonVisible(button, TRUE); button->activate = WidthChange; MoreHeightPlus = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreHeightPlus); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 20, PopUp.font.height + 2); sdl_ButtonCaption(button, "+"); button->tag = 1; sdl_ButtonVisible(button, TRUE); button->activate = HeightChange; MoreHeightMinus = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreHeightMinus); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 20, PopUp.font.height + 2); sdl_ButtonCaption(button, "-"); button->tag = -1; sdl_ButtonVisible(button, TRUE); button->activate = HeightChange; SelectedGfx = use_graphics; mode = graphics_modes; while (mode) { if (!mode->menuname[0]) { mode = mode->pNext; continue; } GfxButtons[mode->grafID] = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, GfxButtons[mode->grafID]); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 50 , PopUp.font.height + 2); sdl_ButtonVisible(button, TRUE); sdl_ButtonCaption(button, mode->menuname); button->tag = mode->grafID; button->activate = SelectGfx; mode = mode->pNext; } #endif MoreFullscreen = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreFullscreen); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 50 , PopUp.font.height + 2); sdl_ButtonVisible(button, TRUE); sdl_ButtonCaption(button, fullscreen ? "On" : "Off"); button->tag = fullscreen; button->activate = FlipTag; MoreSnapPlus = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreSnapPlus); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 20, PopUp.font.height + 2); sdl_ButtonCaption(button, "+"); button->tag = 1; sdl_ButtonVisible(button, TRUE); button->activate = SnapChange; MoreSnapMinus = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreSnapMinus); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 20, PopUp.font.height + 2); sdl_ButtonCaption(button, "-"); button->tag = -1; sdl_ButtonVisible(button, TRUE); button->activate = SnapChange; MoreOK = sdl_ButtonBankNew(&PopUp.buttons); button = sdl_ButtonBankGet(&PopUp.buttons, MoreOK); button->unsel_colour = ucolour; button->sel_colour = scolour; sdl_ButtonSize(button, 50 , PopUp.font.height + 2); sdl_ButtonVisible(button, TRUE); sdl_ButtonCaption(button, "OK"); sdl_ButtonMove(button, width / 2 - 25, height - 40); button->activate = AcceptChanges; popped = TRUE; } static errr Term_xtra_sdl_clear(void); /* * Make a window with size (x,y) pixels * Note: The actual size of the window may end up smaller. * This may be called when a window wants resizing, * is made visible, or the font has changed. * This function doesn't go in for heavy optimization, and doesn't need it- * it may initialize a few too many redraws or whatnot, but everything gets done! */ static void ResizeWin(term_window* win, int w, int h) { /* Don't bother */ if (!win->visible) return; win->border = 2; win->title_height = StatusHeight; /* No font - a new font is needed -> get dimensions */ if (!win->font.data) { /* Get font dimensions */ sdl_CheckFont(win->req_font, &win->tile_wid, &win->tile_hgt); /* Oops */ if (!win->tile_wid || !win->tile_hgt) quit(format("Unable to find font '%s'.\n" "Note that there are new extended font files ending in 'x' in %s.\n" "Please check %s and edit if necessary.", win->req_font, ANGBAND_DIR_XTRA_FONT, ANGBAND_DIR_USER_SDL)); } /* Get the amount of columns & rows */ win->cols = (w - (win->border * 2)) / win->tile_wid; win->rows = (h - win->border - win->title_height) / win->tile_hgt; /* Calculate the width & height */ win->width = (win->cols * win->tile_wid) + (win->border * 2); win->height = (win->rows * win->tile_hgt) + win->border + win->title_height; /* Delete the old surface */ if (win->surface) SDL_FreeSurface(win->surface); /* Create a new surface */ win->surface = SDL_CreateRGBSurface(SDL_SWSURFACE, win->width, win->height, AppWin->format->BitsPerPixel, AppWin->format->Rmask, AppWin->format->Gmask, AppWin->format->Bmask, AppWin->format->Amask); /* Fill it */ SDL_FillRect(win->surface, NULL, SDL_MapRGB(AppWin->format, 160, 160, 60)); /* Label it */ sdl_FontDraw(&SystemFont, win->surface, back_colour, 1, 1, strlen(angband_term_name[win->Term_idx]), angband_term_name[win->Term_idx]); /* Mark the whole window for redraw */ RECT(0, 0, win->width, win->height, &win->uRect); /* Create the font if we need to */ if (!win->font.data) { sdl_FontCreate(&win->font, win->req_font, win->surface); } /* This window was never visible before */ if (!angband_term[win->Term_idx]) { term *old = Term; /* Initialize the term data */ term_data_link_sdl(win); /* Make it visible to angband */ angband_term[win->Term_idx] = &win->term_data; /* Activate it */ Term_activate((term*)&win->term_data); /* Redraw */ Term_redraw(); /* Restore */ Term_activate(old); } /* Resize the term */ else { term *old = Term; /* Activate it */ Term_activate((term*)&win->term_data); /* Resize */ Term_resize(win->cols, win->rows); /* Redraw */ Term_redraw(); /* Restore */ Term_activate(old); } /* Calculate the hotspot */ if (win->Term_idx == SelectedTerm) { SizingSpot.w = 10; SizingSpot.h = 10; SizingSpot.x = win->left + win->width - 10; SizingSpot.y = win->top + win->height - 10; } StatusBar.need_update = TRUE; /* HACK - Redraw all windows */ if (character_dungeon) do_cmd_redraw(); } static errr load_prefs(void) { char buf[1024]; ang_file *fff; term_window *win; int i; /* Initialize the windows with crappy defaults! */ for (i = 0; i < ANGBAND_TERM_MAX; i++) { win = &windows[i]; /* Clear the data */ WIPE(win, term_window); /* Who? */ win->Term_idx = i; win->req_font = string_make(DEFAULT_FONT_FILE); if (i == 0) { win->top = StatusHeight; win->width = 600; win->height = 380; win->keys = 1024; win->visible = TRUE; } else { win->top = 400 + (i * 10); win->left = (i - 1) * 10; win->width = 400; win->height = 200; win->keys = 32; win->visible = FALSE; } } /* Build the path */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "sdlinit.txt"); /* XXXXX */ ANGBAND_DIR_USER_SDL = string_make(buf); /* Open the file */ fff = file_open(buf, MODE_READ, -1); /* Check it */ if (!fff) return (1); /* Process the file */ while (file_getl(fff, buf, sizeof(buf))) { char *s; if (!buf[0]) continue; if (buf[0] == '#') continue; s = strchr(buf, '='); s++; while (!isalnum(*s)) s++; if (strstr(buf, "Resolution")) { screen_w = atoi(s); s = strchr(buf, 'x'); screen_h = atoi(s + 1); } else if (strstr(buf, "Fullscreen")) { fullscreen = atoi(s); } else if (strstr(buf, "Graphics")) { use_graphics = atoi(s); if (use_graphics) arg_graphics = TRUE; } else if (strstr(buf, "TileWidth")) { tile_width = atoi(s); } else if (strstr(buf, "TileHeight")) { tile_height = atoi(s); } else if (strstr(buf, "Bigtile")) { tile_width += atoi(s); } else if (strstr(buf, "Dbltile")) { tile_width += tile_width * atoi(s); tile_height += tile_height * atoi(s); } else if (strstr(buf, "Trptile")) { tile_width += 2 * tile_width * atoi(s); tile_height += 2 * tile_height * atoi(s); } else if (strstr(buf, "Window")) { win = &windows[atoi(s)]; } else if (strstr(buf, "Visible")) { win->visible = atoi(s); } else if (strstr(buf, "Left")) { win->left = atoi(s); } else if (strstr(buf, "Top")) { win->top = atoi(s); } else if (strstr(buf, "Width")) { win->width = atoi(s); } else if (strstr(buf, "Height")) { win->height = atoi(s); } else if (strstr(buf, "Keys")) { win->keys = atoi(s); } else if (strstr(buf, "Font")) { win->req_font = string_make(s); } } if (screen_w < 640) screen_w = 640; if (screen_h < 480) screen_h = 480; file_close(fff); return (0); } static errr save_prefs(void) { ang_file *fff; int i; /* Open the file */ fff = file_open(ANGBAND_DIR_USER_SDL, MODE_WRITE, FTYPE_TEXT); /* Check it */ if (!fff) return (1); file_putf(fff, "Resolution = %dx%d\n", screen_w, screen_h); file_putf(fff, "Fullscreen = %d\n", fullscreen); file_putf(fff, "Graphics = %d\n", use_graphics); file_putf(fff, "TileWidth = %d\n\n", tile_width); file_putf(fff, "TileHeight = %d\n\n", tile_height); for (i = 0; i < ANGBAND_TERM_MAX; i++) { term_window *win = &windows[i]; file_putf(fff, "Window = %d\n", i); file_putf(fff, "Visible = %d\n", (int)win->visible); file_putf(fff, "Left = %d\n", win->left); file_putf(fff, "Top = %d\n", win->top); file_putf(fff, "Width = %d\n", win->width); file_putf(fff, "Height = %d\n", win->height); file_putf(fff, "Keys = %d\n", win->keys); file_putf(fff, "Font = %s\n\n", win->req_font); } file_close(fff); /* Done */ return (0); } static void set_update_rect(term_window *win, SDL_Rect *rc); static void DrawSizeWidget(void) { Uint32 colour = SDL_MapRGB(AppWin->format, 30, 160, 70); SDL_FillRect(AppWin, &SizingSpot, colour); SDL_UpdateRects(AppWin, 1, &SizingSpot); } static int Movingx; static int Movingy; /* * Is What within Range units of Origin */ #define closeto(Origin, What, Range) \ ((ABS((Origin) - (What))) < (Range)) /* * This function keeps the 'mouse' info up to date, * and reacts to mouse buttons appropriately. */ static void sdl_HandleMouseEvent(SDL_Event *event) { term *old = Term; term_window *win; switch (event->type) { /* Mouse moved */ case SDL_MOUSEMOTION: { mouse.x = event->motion.x; mouse.y = event->motion.y; win = &windows[SelectedTerm]; /* We are moving a window */ if (Moving) { int i; /* Move the window */ win->left = (mouse.x - Movingx); win->top = (mouse.y - Movingy); /* Left bounds check */ if (win->left < 0) { win->left = 0; Movingx = mouse.x; } /* Right bounds check */ if ((win->left + win->width) > AppWin->w) { win->left = AppWin->w - win->width; Movingx = mouse.x - win->left; } /* Top bounds check */ if (win->top < StatusHeight) { win->top = StatusHeight; Movingy = mouse.y - win->top; } /* Bottom bounds check */ if ((win->top + win->height) > AppWin->h) { win->top = AppWin->h - win->height; Movingy = mouse.y - win->top; } for (i = 0; i < ANGBAND_TERM_MAX; i++) { term_window *snapper = &windows[i]; /* Can't snap to self... */ if (i == SelectedTerm) continue; /* Can't snap to the invisible */ if (!snapper->visible) continue; /* Check the windows are across from each other */ if ((snapper->top < win->top + win->height) && (win->top < snapper->top + snapper->height)) { /* Lets try to the left... */ if (closeto(win->left, snapper->left + snapper->width, SnapRange)) { win->left = snapper->left + snapper->width; Movingx = mouse.x - win->left; } /* Maybe to the right */ if (closeto(win->left + win->width, snapper->left, SnapRange)) { win->left = snapper->left - win->width; Movingx = mouse.x - win->left; } } /* Check the windows are above/below each other */ if ((snapper->left < win->left + win->width) && (win->left < snapper->left + snapper->width)) { /* Lets try to the top... */ if (closeto(win->top, snapper->top + snapper->height, SnapRange)) { win->top = snapper->top + snapper->height; Movingy = mouse.y - win->top; } /* Maybe to the bottom */ if (closeto(win->top + win->height, snapper->top, SnapRange)) { win->top = snapper->top - win->height; Movingy = mouse.y - win->top; } } } /* Show on the screen */ sdl_BlitAll(); } /* A window is being re-sized */ else if (Sizing) { /* Adjust the sizing rectangle */ SizingRect.w = win->width - win->left + (mouse.x - Movingx); SizingRect.h = win->height - win->top + (mouse.y - Movingy); /* XXX - The main window can't be too small */ if (SelectedTerm == 0) { int minwidth = (win->tile_wid * 80) + 2 * win->border; int minheight = (win->tile_hgt * 24) + win->border + win->title_height; if (SizingRect.w < minwidth) SizingRect.w = minwidth; if (SizingRect.h < minheight) SizingRect.h = minheight; } /* Show on the screen */ sdl_BlitAll(); } else if (!popped) { /* Have a look for the corner stuff */ if (point_in(&SizingSpot, mouse.x, mouse.y)) { if (!Sizingshow) { /* Indicate the hotspot */ Sizingshow = TRUE; DrawSizeWidget(); } } else if (Sizingshow) { SDL_Rect rc; Sizingshow = FALSE; RECT(win->width - 10, win->height - 10, 10, 10, &rc); set_update_rect(win, &rc); sdl_BlitWin(win); } } break; } /* A button has been pressed */ case SDL_MOUSEBUTTONDOWN: { sdl_Window *window; bool res; SDLMod mods; int button; int idx = sdl_LocateWin(mouse.x, mouse.y); if (event->button.button == SDL_BUTTON_LEFT) { bool just_gained_focus = FALSE; mouse.left = 1; mouse.leftx = event->button.x; mouse.lefty = event->button.y; button = 1; /* Pop up window gets priority */ if (popped) window = &PopUp; else window = &StatusBar; /* React to a button press */ res = sdl_ButtonBankMouseDown(&window->buttons, mouse.x - window->left, mouse.y - window->top); /* If pop-up window active and no reaction then cancel the popup */ if (popped && !res) { RemovePopUp(); break; } /* Has this mouse press been handled */ if (res) break; /* Is the mouse press in a term_window? */ if (idx < 0) break; /* The 'focused' window has changed */ if (idx != SelectedTerm) { TermFocus(idx); just_gained_focus = TRUE; } /* A button press has happened on the focused term window */ win = &windows[idx]; /* Check for mouse press in the title bar */ if (mouse.y < win->top + win->title_height) { /* Let's get moving */ Moving = TRUE; /* BringToTop(idx); */ /* Remember where we started */ Movingx = mouse.x - win->left; Movingy = mouse.y - win->top; } /* Check for the little hotspot in the botton right corner */ else if (point_in(&SizingSpot, mouse.x, mouse.y)) { /* Let's get sizing */ Sizing = TRUE; /* Create the sizing rectangle */ RECT(win->left, win->top, win->width, win->height, &SizingRect); /* Remember where we started */ Movingx = mouse.x - win->left; Movingy = mouse.y - win->top; } /* Signal a mouse press to angband (only if the window is already focused) */ else if (!just_gained_focus) { if (win->visible) { /* Calculate the 'cell' coords */ int x = (mouse.x - win->left - win->border) / win->tile_wid; int y = (mouse.y - win->top - win->title_height) / win->tile_hgt; mods = SDL_GetModState(); if (mods & KMOD_CTRL) { button |= 16; } if (mods & KMOD_SHIFT) { button |= 32; } if (mods & KMOD_ALT) { button |= 64; } /* Send the mousepress to the appropriate term */ Term_activate(angband_term[idx]); Term_mousepress(x, y, button); Term_activate(old); } } } /* Process right mouse button */ else if (event->button.button == SDL_BUTTON_RIGHT) { mouse.right = 1; mouse.rightx = event->button.x; mouse.righty = event->button.y; button = 2; /* Right-click always cancels the popup */ if (popped) { popped = FALSE; } /* See if it's inside a term_window */ else if (idx != -1) { int x, y; win = &windows[idx]; /* Calculate the 'cell' coords */ x = (mouse.x - win->left - win->border) / win->tile_wid; y = (mouse.y - win->top - win->title_height) / win->tile_hgt; /* Bounds check */ if ((x >= 0) && (y >= 0) && (x < win->cols) && (y < win->rows)) { mods = SDL_GetModState(); if (mods & KMOD_CTRL) { button |= 16; } if (mods & KMOD_SHIFT) { button |= 32; } if (mods & KMOD_ALT) { button |= 64; } /* Send the mousepress to the appropriate term */ Term_activate(angband_term[idx]); Term_mousepress(x, y, button); Term_activate(old); } } } break; } case SDL_MOUSEBUTTONUP: { /* Handle release of left button */ if (event->button.button == SDL_BUTTON_LEFT) { sdl_Window *window; bool res; mouse.left = 0; /* Pop up window gets priority */ if (popped) window = &PopUp; else window = &StatusBar; /* React to a button release */ res = sdl_ButtonBankMouseUp(&window->buttons, mouse.x - window->left, mouse.y - window->top); /* Cancel popup */ if (popped && !res) { RemovePopUp(); } /* Finish moving */ if (Moving) { Moving = FALSE; /* Update */ sdl_BlitAll(); } /* Finish sizing */ if (Sizing) { /* Sort out the window */ ResizeWin(&windows[SelectedTerm], SizingRect.w, SizingRect.h); Sizing = FALSE; /* Update */ sdl_BlitAll(); } } else if (event->button.button == SDL_BUTTON_RIGHT) { mouse.right = 0; } break; } } } /* * Handle keypresses. * * We treat left and right modifier keys as equivalent. * We ignore any key without a valid SDLK index. */ static void sdl_keypress(SDL_keysym keysym) { u16b key_code = keysym.unicode; SDLKey key_sym = keysym.sym; int ch = 0; /* Store the value of various modifier keys */ bool mc = (keysym.mod & KMOD_CTRL) > 0; bool ms = (keysym.mod & KMOD_SHIFT) > 0; bool ma = (keysym.mod & KMOD_ALT) > 0; bool mm = (keysym.mod & KMOD_META) > 0; bool mg = (keysym.mod & KMOD_MODE) > 0; bool kp = FALSE; byte mods = (ma ? KC_MOD_ALT : 0) | (mm ? KC_MOD_META : 0); /* Ignore if main term is not initialized */ if (!Term) return; /* Handle all other valid SDL keys */ switch (key_sym) { /* keypad */ case SDLK_KP0: ch = '0'; kp = TRUE; break; case SDLK_KP1: ch = '1'; kp = TRUE; break; case SDLK_KP2: ch = '2'; kp = TRUE; break; case SDLK_KP3: ch = '3'; kp = TRUE; break; case SDLK_KP4: ch = '4'; kp = TRUE; break; case SDLK_KP5: ch = '5'; kp = TRUE; break; case SDLK_KP6: ch = '6'; kp = TRUE; break; case SDLK_KP7: ch = '7'; kp = TRUE; break; case SDLK_KP8: ch = '8'; kp = TRUE; break; case SDLK_KP9: ch = '9'; kp = TRUE; break; case SDLK_KP_PERIOD: ch = '.'; kp = TRUE; break; case SDLK_KP_DIVIDE: ch = '/'; kp = TRUE; break; case SDLK_KP_MULTIPLY: ch = '*'; kp = TRUE; break; case SDLK_KP_MINUS: ch = '-'; kp = TRUE; break; case SDLK_KP_PLUS: ch = '+'; kp = TRUE; break; case SDLK_KP_ENTER: ch = KC_ENTER; kp = TRUE; break; case SDLK_KP_EQUALS: ch = '='; kp = TRUE; break; /* have have these to get consistent ctrl-shift behaviour */ case SDLK_0: if ((!ms || mc || ma) && !mg) ch = '0'; break; case SDLK_1: if ((!ms || mc || ma) && !mg) ch = '1'; break; case SDLK_2: if ((!ms || mc || ma) && !mg) ch = '2'; break; case SDLK_3: if ((!ms || mc || ma) && !mg) ch = '3'; break; case SDLK_4: if ((!ms || mc || ma) && !mg) ch = '4'; break; case SDLK_5: if ((!ms || mc || ma) && !mg) ch = '5'; break; case SDLK_6: if ((!ms || mc || ma) && !mg) ch = '6'; break; case SDLK_7: if ((!ms || mc || ma) && !mg) ch = '7'; break; case SDLK_8: if ((!ms || mc || ma) && !mg) ch = '8'; break; case SDLK_9: if ((!ms || mc || ma) && !mg) ch = '9'; break; case SDLK_UP: ch = ARROW_UP; break; case SDLK_DOWN: ch = ARROW_DOWN; break; case SDLK_RIGHT: ch = ARROW_RIGHT; break; case SDLK_LEFT: ch = ARROW_LEFT; break; case SDLK_INSERT: ch = KC_INSERT; break; case SDLK_HOME: ch = KC_HOME; break; case SDLK_PAGEUP: ch = KC_PGUP; break; case SDLK_DELETE: ch = KC_DELETE; break; case SDLK_END: ch = KC_END; break; case SDLK_PAGEDOWN: ch = KC_PGDOWN; break; case SDLK_ESCAPE: ch = ESCAPE; break; case SDLK_BACKSPACE: ch = KC_BACKSPACE; break; case SDLK_RETURN: ch = KC_ENTER; break; case SDLK_TAB: ch = KC_TAB; break; case SDLK_F1: ch = KC_F1; break; case SDLK_F2: ch = KC_F2; break; case SDLK_F3: ch = KC_F3; break; case SDLK_F4: ch = KC_F4; break; case SDLK_F5: ch = KC_F5; break; case SDLK_F6: ch = KC_F6; break; case SDLK_F7: ch = KC_F7; break; case SDLK_F8: ch = KC_F8; break; case SDLK_F9: ch = KC_F9; break; case SDLK_F10: ch = KC_F10; break; case SDLK_F11: ch = KC_F11; break; case SDLK_F12: ch = KC_F12; break; case SDLK_F13: ch = KC_F13; break; case SDLK_F14: ch = KC_F14; break; case SDLK_F15: ch = KC_F15; break; default: break; } if (ch) { if (kp) mods |= KC_MOD_KEYPAD; if (mc) mods |= KC_MOD_CONTROL; if (ms) mods |= KC_MOD_SHIFT; Term_keypress(ch, mods); } else if (key_code) { /* If the keycode is 7-bit ASCII (except numberpad) send * directly to the game. */ if (mc && (key_sym == SDLK_TAB || key_sym == SDLK_RETURN || key_sym == SDLK_BACKSPACE || MODS_INCLUDE_CONTROL(key_code))) mods |= KC_MOD_CONTROL; if (ms && MODS_INCLUDE_SHIFT(key_code)) mods |= KC_MOD_SHIFT; Term_keypress(key_code, mods); } } static void init_windows(void); static void init_morewindows(void); /* * Handle a single message sent to the application. * * Functions that are either called from a separate thread or which need to * create a separate thread (such as sounds) need to pass messages to this * function in order to execute most operations. See the useage of * "SDL_USEREVENT". */ static errr sdl_HandleEvent(SDL_Event *event) { /* Handle message */ switch (event->type) { /* Keypresses */ case SDL_KEYDOWN: { /* Handle keypress */ sdl_keypress(event->key.keysym); break; } case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { /* Handle mouse stuff */ sdl_HandleMouseEvent(event); break; } case SDL_MOUSEMOTION: { int i; SDL_Event events[10]; /* * If there are a bundle of mouse movements pending, * we'll just take every tenth one - this makes a * simple approach to dragging practical, for instance. */ i = SDL_PeepEvents(events, 10, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION)); if (i > 0) { *event = events[i - 1]; } /* Handle mouse stuff */ sdl_HandleMouseEvent(event); break; } /* Shut down the game */ /* XXX - check for stuck inside menu etc... */ case SDL_QUIT: { /* We are playing a game with an active character */ if (character_generated && inkey_flag) { /* Hack -- Forget messages */ msg_flag = FALSE; /* Save the game */ save_game(); } save_prefs(); quit(NULL); break; } /* Resize the application */ case SDL_VIDEORESIZE: { /* Free the surface */ SDL_FreeSurface(AppWin); if (!fullscreen) { /* Make sure */ vflags &= ~(SDL_FULLSCREEN); vflags |= SDL_RESIZABLE; screen_w = event->resize.w; screen_h = event->resize.h; if (screen_w < 640) screen_w = 640; if (screen_h < 480) screen_h = 480; /* Resize the application surface */ AppWin = SDL_SetVideoMode(screen_w, screen_h, 0, vflags); } else { /* Make sure */ vflags |= SDL_FULLSCREEN; vflags &= ~(SDL_RESIZABLE); AppWin = SDL_SetVideoMode(full_w, full_h, 0, vflags); } init_morewindows(); init_windows(); break; } case WINDOW_DRAW: { /* Redraw window that have asked */ sdl_Window *window = (sdl_Window*)event->user.data1; sdl_WindowBlit(window); break; } default: { /* Do nothing */ break; } } sdl_WindowUpdate(&StatusBar); sdl_WindowUpdate(&PopUp); return (0); } /* * Update the redraw rect * A simple but effective way to keep track of what * parts of a window need to updated. * Any new areas that are updated before a blit are simply combined * into a new larger rectangle to encompass all changes. */ static void set_update_rect(term_window *win, SDL_Rect *rc) { /* No outstanding update areas yet? */ if (win->uRect.x == -1) { /* Simple copy */ win->uRect = *rc; } else { /* Combine the old update area with the new */ int x = MIN(win->uRect.x, rc->x); int y = MIN(win->uRect.y, rc->y); int x2 = MAX(win->uRect.x + win->uRect.w, rc->x + rc->w); int y2 = MAX(win->uRect.y + win->uRect.h, rc->y + rc->h); RECT(x, y, x2 - x, y2 - y, &win->uRect); } } /* * Clear a terminal window */ static errr Term_xtra_sdl_clear(void) { term_window *win = (term_window*)(Term->data); SDL_Rect rc; /* Oops */ if (!win->surface) return (1); /* Create the fill area */ RECT(win->border, win->title_height, win->width - (2 * win->border), win->height - win->border - win->title_height, &rc); /* Fill the rectangle */ SDL_FillRect(win->surface, &rc, back_pixel_colour); /* Rectangle to update */ set_update_rect(win, &rc); /* Success */ return (0); } /* * Process at least one event */ static errr Term_xtra_sdl_event(int v) { SDL_Event event; errr error = 0; /* Wait for an event */ if (v) { /* Wait in 0.02s increments while updating animations every 0.2s */ int i = 0; while (!SDL_PollEvent(&event)) { if (i == 0) idle_update(); usleep(20000); i = (i + 1) % 10; } /* Handle it */ error = sdl_HandleEvent(&event); } /* Check for an event */ else { /* Get a single pending event */ if (SDL_PollEvent(&event)) { /* Handle it */ error = sdl_HandleEvent(&event); } } /* Note success or failure */ return (error); } /* * Process all pending events */ static errr Term_xtra_sdl_flush(void) { SDL_Event event; /* Get all pending events */ while (SDL_PollEvent(&event)) { /* Handle them (ignore errors) */ (void)sdl_HandleEvent(&event); } /* Done */ return (0); } /* * Delay for "x" milliseconds */ static errr Term_xtra_sdl_delay(int v) { /* Sleep */ if (v > 0) { Term_xtra_sdl_event(0); SDL_Delay(v); } /* Success */ return (0); } static errr Term_bigcurs_sdl(int col, int row) { term_window *win = (term_window*)(Term->data); SDL_Color colour = text_colours[TERM_YELLOW]; SDL_Rect rc; /* Make a rectangle */ RECT(col * win->tile_wid, row * win->tile_hgt, win->tile_wid * tile_width, win->tile_hgt * tile_height, &rc); /* Translate it */ rc.x += win->border; rc.y += win->title_height; /* Draw it */ sdl_DrawBox(win->surface, &rc, colour, 1); /* Update area */ set_update_rect(win, &rc); /* Success */ return (0); } static errr Term_curs_sdl(int col, int row) { term_window *win = (term_window*)(Term->data); SDL_Color colour = text_colours[TERM_YELLOW]; SDL_Rect rc; /* Make a rectangle */ RECT(col * win->tile_wid, row * win->tile_hgt, win->tile_wid, win->tile_hgt, &rc); /* Translate it */ rc.x += win->border; rc.y += win->title_height; /* Draw it */ sdl_DrawBox(win->surface, &rc, colour, 1); /* Update area */ set_update_rect(win, &rc); /* Success */ return (0); } static errr Term_xtra_sdl(int n, int v) { switch (n) { /* Process an event */ case TERM_XTRA_EVENT: { return (Term_xtra_sdl_event(v)); } /* Flush all events */ case TERM_XTRA_FLUSH: { return (Term_xtra_sdl_flush()); } /* Clear the screen */ case TERM_XTRA_CLEAR: { return (Term_xtra_sdl_clear()); } /* Show or hide the cursor */ case TERM_XTRA_SHAPE: { int x, y; /* Obtain the cursor */ (void)Term_locate(&x, &y); /* Show or hide the cursor */ Term_curs_sdl(x, y); return (0); } case TERM_XTRA_FRESH: { /* Get the current window data */ term_window *win = (term_window*)(Term->data); /* Blat it! */ sdl_BlitWin(win); /* Done */ return (0); } case TERM_XTRA_DELAY: { return (Term_xtra_sdl_delay(v)); } case TERM_XTRA_REACT: { int i; /* Re-initialize the colours */ for (i = 0; i < MAX_COLORS; i++) { text_colours[i].r = angband_color_table[i][1]; text_colours[i].g = angband_color_table[i][2]; text_colours[i].b = angband_color_table[i][3]; } } } return (1); } static errr Term_wipe_sdl(int col, int row, int n) { term_window *win = (term_window*)(Term->data); SDL_Rect rc; /* Build the area to black out */ rc.x = col * win->tile_wid; rc.y = row * win->tile_hgt; rc.w = win->tile_wid * n; rc.h = win->tile_hgt; /* Translate it */ rc.x += win->border; rc.y += win->title_height; /* Wipe it */ SDL_FillRect(win->surface, &rc, back_pixel_colour); /* Update */ set_update_rect(win, &rc); return (0); } /* * Draw some text to a window */ static errr Term_text_sdl(int col, int row, int n, int a, const wchar_t *s) { term_window *win = (term_window*)(Term->data); SDL_Color colour = text_colours[a % MAX_COLORS]; SDL_Color bg = text_colours[TERM_DARK]; int x = col * win->tile_wid; int y = row * win->tile_hgt; wchar_t src[255]; char mbstr[MB_LEN_MAX * 255]; size_t len; /* Translate */ x += win->border; y += win->title_height; /* Not much point really... */ if (!win->visible) return (0); /* Clear the way */ Term_wipe_sdl(col, row, n); /* Take a copy of the incoming string, but truncate it at n chars */ wcsncpy(src, s, n); src[n] = L'\0'; /* Convert to UTF-8 for display */ len = wcstombs(mbstr, src, n * MB_LEN_MAX); mbstr[len] = '\0'; /* Handle background */ switch (a / MAX_COLORS) { case BG_BLACK: /* Default Background */ break; case BG_SAME: /* Background same as foreground*/ bg = colour; break; case BG_DARK: /* Highlight Background */ bg = text_colours[TERM_SHADE]; break; } /* Draw it */ return (sdl_mapFontDraw(&win->font, win->surface, colour, bg, x, y, n, mbstr)); } #ifdef USE_GRAPHICS /* * Do a 'stretched blit' * SDL has no support for stretching... What a bastard! * */ static void sdl_StretchBlit(SDL_Surface *src, SDL_Rect *srcRect, SDL_Surface *dest, SDL_Rect *destRect) { int x, y; int sx, sy, dx, dy; Uint8 *ps, *pd; for (y = 0; y < destRect->h; y++) { for (x = 0; x < destRect->w; x++) { /* Actual source coords */ sx = (srcRect->w * x / (destRect->w)) + srcRect->x; sy = (srcRect->h * y / (destRect->h)) + srcRect->y; /* Find a source pixel */ ps = (Uint8 *)src->pixels + (sx * src->format->BytesPerPixel) + (sy * src->pitch); #if 0 /* Do we need to draw it? */ switch (src->format->BytesPerPixel) { case 1: { if (*ps == src->format->colorkey) continue; break; } case 2: { Uint16 *ps16 = (Uint16*) ps; if (*ps16 == src->format->colorkey) continue; break; } case 3: case 4: { Uint32 *ps32 = (Uint32*) ps; if (*ps32 == src->format->colorkey) continue; break; } } #endif /* Actual destination pixel coords */ dx = x + destRect->x; dy = y + destRect->y; /* Destination pixel */ pd = (Uint8 *)dest->pixels + (dx * dest->format->BytesPerPixel) + (dy * dest->pitch); switch (dest->format->BytesPerPixel) { case 1: { *pd = *ps; break; } case 2: { Uint16 *ps16 = (Uint16*) ps; Uint16 *pd16 = (Uint16*) pd; *pd16 = *ps16; break; } case 3: case 4: { Uint32 *ps32 = (Uint32*) ps; Uint32 *pd32 = (Uint32*) pd; *pd32 = *ps32; } } } } } /* * Make the 'pre-stretched' tiles for this window * Assumes the tiles surface was freed elsewhere */ static errr sdl_BuildTileset(term_window *win) { int x, y; int ta, td; int xx, yy; graphics_mode *info; if (!GfxSurface) return (1); info = get_graphics_mode(use_graphics); if (info->grafID == 0) return (1); /* Calculate the number of tiles across & down*/ ta = GfxSurface->w / info->cell_width; td = GfxSurface->h / info->cell_height; /* Calculate the size of the new surface */ x = ta * win->tile_wid * tile_width; y = td * win->tile_hgt * tile_height; /* Make it */ win->tiles = SDL_CreateRGBSurface(SDL_SWSURFACE, x, y, GfxSurface->format->BitsPerPixel, GfxSurface->format->Rmask, GfxSurface->format->Gmask, GfxSurface->format->Bmask, GfxSurface->format->Amask); /* Bugger */ if (!win->tiles) return (1); /* For every tile... */ for (xx = 0; xx < ta; xx++) { for (yy = 0; yy < td; yy++) { SDL_Rect src, dest; int dwid = win->tile_wid * tile_width; int dhgt = win->tile_hgt * tile_height; /* Source rectangle (on GfxSurface) */ RECT(xx * info->cell_width, yy * info->cell_height, info->cell_width, info->cell_height, &src); /* Destination rectangle (win->tiles) */ RECT(xx * dwid, yy * dhgt, dwid, dhgt, &dest); /* Do the stretch thing */ sdl_StretchBlit(GfxSurface, &src, win->tiles, &dest); } } /* see if we need to make a seperate surface for the map view */ if (!((tile_width == 1) && (tile_height == 1))) { /* Calculate the size of the new surface */ x = ta * win->tile_wid; y = td * win->tile_hgt; /* Make it */ win->onebyone = SDL_CreateRGBSurface(SDL_SWSURFACE, x, y, GfxSurface->format->BitsPerPixel, GfxSurface->format->Rmask, GfxSurface->format->Gmask, GfxSurface->format->Bmask, GfxSurface->format->Amask); /* Bugger */ if (!win->onebyone) return (1); /* For every tile... */ for (xx = 0; xx < ta; xx++) { for (yy = 0; yy < td; yy++) { SDL_Rect src, dest; int dwid = win->tile_wid; int dhgt = win->tile_hgt; /* Source rectangle (on GfxSurface) */ RECT(xx * info->cell_width, yy * info->cell_height, info->cell_width, info->cell_height, &src); /* Destination rectangle (win->tiles) */ RECT(xx * dwid, yy * dhgt, dwid, dhgt, &dest); /* Do the stretch thing */ sdl_StretchBlit(GfxSurface, &src, win->onebyone, &dest); } } } return (0); } #endif /* * Put some gfx on the screen * XXX - This function _never_ seems to get called with n > 1 ? * This needs improvement... */ static errr Term_pict_sdl(int col, int row, int n, const int *ap, const wchar_t *cp, const int *tap, const wchar_t *tcp) { #ifdef USE_GRAPHICS /* Get the right window */ term_window *win = (term_window*)(Term->data); SDL_Rect rc, src; int i, j; char mbforeground[MB_LEN_MAX * 255]; char mbterrain[MB_LEN_MAX * 255]; /* First time a pict is requested we load the tileset in */ if (!win->tiles) { sdl_BuildTileset(win); if (!win->tiles) return (1); } /* Make the destination rectangle */ RECT(col * win->tile_wid, row * win->tile_hgt, win->tile_wid, win->tile_hgt, &rc); /* Translate it */ rc.x += win->border; rc.y += win->title_height; /* Stretch for bigtile mode */ rc.w *= tile_width; rc.h *= tile_height; /* Get the dimensions of the graphic surface */ src.w = rc.w; src.h = rc.h; /* Clear the way */ for (i = 0; i < tile_width; i++) for (j = 0; j < tile_height; j++) Term_wipe_sdl(col + i, row + j, n); wcstombs(mbforeground, cp, n * MB_LEN_MAX); wcstombs(mbterrain, tcp, n * MB_LEN_MAX); /* Blit 'em! (it) */ for (i = 0; i < n; i++) { /* Get the terrain tile */ j = (tap[i] & 0x7f); src.x = (tcp[i] & 0x7F) * src.w; src.y = j * src.h; /* if we are using overdraw, draw the top rectangle */ if (overdraw && (row > 2) && (j >= overdraw) && (j <= overdraw_max)) { src.y -= rc.h; rc.y -= rc.h; rc.h = (rc.h << 1); /* double the height */ src.h = rc.h; SDL_BlitSurface(win->tiles, &src, win->surface, &rc); rc.h = (rc.h >> 1); /* halve the height */ rc.y += rc.h; Term_mark(col, row-tile_height); Term_mark(col, row); } else SDL_BlitSurface(win->tiles, &src, win->surface, &rc); /* If foreground is the same as background, we're done */ if ((tap[i] == ap[i]) && (tcp[i] == cp[i])) continue; /* Get the foreground tile */ j = (ap[i] & 0x7f); src.x = (cp[i] & 0x7F) * src.w; src.y = j * src.h; /* if we are using overdraw, draw the top rectangle */ if (overdraw && (row > 2) && (j >= overdraw) && (j <= overdraw_max)) { src.y -= rc.h; rc.y -= rc.h; rc.h = (rc.h << 1); /* double the height */ src.h = rc.h; SDL_BlitSurface(win->tiles, &src, win->surface, &rc); rc.h = (rc.h >> 1); /* halve the height */ rc.y += rc.h; Term_mark(col, row-tile_height); Term_mark(col, row); } else SDL_BlitSurface(win->tiles, &src, win->surface, &rc); } /* Update area */ set_update_rect(win, &rc); #endif return (0); } static void Term_view_map_sdl(term *t) { SDL_Surface *fulltiles; /* Get the right window */ term_window *win = (term_window*)(t->data); /* First time a pict is requested we load the tileset in */ if (!win->tiles) { sdl_BuildTileset(win); } /* override large tiles with small ones for the map view */ if (win->onebyone) { /* Save screen so we can load it again after the tile image is restored */ screen_save(); fulltiles = win->tiles; win->tiles = win->onebyone; } t->view_map_hook = NULL; do_cmd_view_map(); t->view_map_hook = Term_view_map_sdl; if (win->onebyone) { win->tiles = fulltiles; /* * Load screen with the correct tiles - the screen load in the * view map command was still using the image with small tiles */ screen_load(); } } /* * Create and initialize the Term contined within this window. */ static void term_data_link_sdl(term_window *win) { term *t = &win->term_data; /* Initialize the term */ term_init(t, win->cols, win->rows, win->keys); t->higher_pict = TRUE; /* Use a "software" cursor */ t->soft_cursor = TRUE; /* Erase with "white space" */ t->attr_blank = TERM_WHITE; t->char_blank = ' '; /* Never refresh one row */ t->never_frosh = TRUE; /* Differentiate between BS/^h, Tab/^i, etc. */ t->complex_input = TRUE; /* Ignore the init/nuke hooks */ /* Prepare the template hooks */ t->xtra_hook = Term_xtra_sdl; t->curs_hook = Term_curs_sdl; t->bigcurs_hook = Term_bigcurs_sdl; t->wipe_hook = Term_wipe_sdl; t->text_hook = Term_text_sdl; t->pict_hook = Term_pict_sdl; t->view_map_hook = Term_view_map_sdl; /* Remember where we came from */ t->data = win; } /* * Initialize the status bar: * Populate it with some buttons * Set the custom draw function for the bar */ static void init_morewindows(void) { char buf[128]; sdl_Button *button; int x; popped = FALSE; /* Make sure */ sdl_WindowFree(&PopUp); /* Initialize the status bar */ sdl_WindowInit(&StatusBar, AppWin->w, StatusHeight, AppWin, DEFAULT_FONT_FILE); /* Cusom drawing function */ StatusBar.draw_extra = draw_statusbar; AboutSelect = sdl_ButtonBankNew(&StatusBar.buttons); button = sdl_ButtonBankGet(&StatusBar.buttons, AboutSelect); my_strcpy(buf, format("%s %s", VERSION_NAME, VERSION_STRING), sizeof(buf)); /* Initialize the 'about' button */ sdl_ButtonSize(button, StatusBar.font.width * strlen(buf) + 5, StatusHeight - 2); sdl_ButtonMove(button, 1, 1); sdl_ButtonVisible(button, TRUE); sdl_ButtonCaption(button, buf); button->activate = AboutActivate; /* New button */ TermSelect = sdl_ButtonBankNew(&StatusBar.buttons); button = sdl_ButtonBankGet(&StatusBar.buttons, TermSelect); /* Initialize the 'term' button */ sdl_ButtonSize(button, 60, StatusHeight - 2); x = 100 + (StatusBar.font.width * 5); sdl_ButtonMove(button, x, 1); sdl_ButtonVisible(button, TRUE); button->activate = TermActivate; /* Another new button */ VisibleSelect = sdl_ButtonBankNew(&StatusBar.buttons); button = sdl_ButtonBankGet(&StatusBar.buttons, VisibleSelect); /* Initialize the 'visible' button */ sdl_ButtonSize(button, 60, StatusHeight - 2); x = 200 + (StatusBar.font.width * 8); sdl_ButtonMove(button, x, 1); sdl_ButtonVisible(button, TRUE); button->activate = VisibleActivate; /* Another new button */ FontSelect = sdl_ButtonBankNew(&StatusBar.buttons); button = sdl_ButtonBankGet(&StatusBar.buttons, FontSelect); /* Initialize the 'font_select' button */ sdl_ButtonSize(button, 60, StatusHeight - 2); sdl_ButtonMove(button, 400, 1); button->activate = FontActivate; /* Another new button */ MoreSelect = sdl_ButtonBankNew(&StatusBar.buttons); button = sdl_ButtonBankGet(&StatusBar.buttons, MoreSelect); /* Initialize the 'more' button */ sdl_ButtonSize(button, 60, StatusHeight - 2); sdl_ButtonMove(button, 400, 1); sdl_ButtonVisible(button, TRUE); sdl_ButtonCaption(button, "Options"); button->activate = MoreActivate; /* Another new button */ QuitSelect = sdl_ButtonBankNew(&StatusBar.buttons); button = sdl_ButtonBankGet(&StatusBar.buttons, QuitSelect); /* Initialize the 'quit' button */ sdl_ButtonSize(button, 60, StatusHeight - 2); sdl_ButtonMove(button, AppWin->w - 61, 1); sdl_ButtonCaption(button, "Quit"); button->activate = QuitActivate; sdl_ButtonVisible(button, TRUE); SetStatusButtons(); TermFocus(0); } #ifdef USE_GRAPHICS /* * The new streamlined graphics loader. * Only uses colour keys. * Much more tolerant of different bit-planes */ static errr load_gfx(void) { char buf[1024]; const char *filename; SDL_Surface *temp; if (current_graphics_mode && GfxSurface && (use_graphics == current_graphics_mode->grafID)) { return (0); } current_graphics_mode = get_graphics_mode(use_graphics); if (current_graphics_mode) { filename = current_graphics_mode->file; } else { filename = NULL; } /* Free the old surface */ if (GfxSurface) SDL_FreeSurface(GfxSurface); /* This may be called when GRAPHICS_NONE is set */ if (!filename) return (0); /* Find and load the file into a temporary surface */ path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, filename); temp = IMG_Load(buf); if (!temp) return (1); /* Change the surface type to the current video surface format */ GfxSurface = SDL_DisplayFormatAlpha(temp); /* Make sure we know what pref file to use */ ANGBAND_GRAF = current_graphics_mode->pref; overdraw = current_graphics_mode->overdrawRow; overdraw_max = current_graphics_mode->overdrawMax; /* Reset the graphics mapping for this tileset */ if (character_dungeon) reset_visuals(TRUE); /* All good */ return (0); } #endif /* * Initialize the graphics */ static void init_gfx(void) { #ifndef USE_GRAPHICS /* User requested gfx but USE_GRAPHICS not defined... */ if (arg_graphics) { arg_graphics = FALSE; } /* Make sure */ use_graphics = GRAPHICS_NONE; tile_width = 1; tile_height = 1; #else int i; /* Check for existence of required files */ i = 0; do { char path[1024]; /* Check the graphic file */ if (graphics_modes[i].file[0]) { path_build(path, sizeof(path), ANGBAND_DIR_XTRA_GRAF, graphics_modes[i].file); if (!file_exists(path)) { plog_fmt("Can't find file %s - graphics mode '%s' will be disabled.", path, graphics_modes[i].menuname); graphics_modes[i].file[0] = 0; } if ((i + 1) == use_graphics) { current_graphics_mode = &(graphics_modes[i]); } } } while (graphics_modes[i++].grafID != 0); /* Check availability (default to no graphics) */ if (!current_graphics_mode->file[0]) { use_graphics = GRAPHICS_NONE; arg_graphics = FALSE; tile_width = 1; tile_height = 1; } /* Load the graphics stuff in */ load_gfx(); #endif } /* * Create the windows * Called sometime after load_prefs() */ static void init_windows(void) { int i; for (i = 0; i < ANGBAND_TERM_MAX; i++) { term_window *win = &windows[i]; /* Only bother with visible windows */ if (win->visible) { /* Don't crowd out the status bar... */ if (win->top < StatusHeight) win->top = StatusHeight; #ifdef USE_GRAPHICS /* Invalidate the gfx surface */ if (win->tiles) { SDL_FreeSurface(win->tiles); win->tiles = NULL; } if (win->onebyone) { SDL_FreeSurface(win->onebyone); win->onebyone = NULL; } #endif /* This will set up the window correctly */ ResizeWin(win, win->width, win->height); } else { /* Doesn't exist */ angband_term[i] = NULL; } /* Term 0 is at the top */ Zorder[i] = ANGBAND_TERM_MAX - i - 1; } /* Good to go... */ Term_activate(term_screen); } /* * Set up some SDL stuff * */ static void init_sdl_local(void) { const SDL_VideoInfo *VideoInfo; int i; int h, w; char path[1024]; /* Get information about the video hardware */ VideoInfo = SDL_GetVideoInfo(); /* Require at least 256 colors */ if (VideoInfo->vfmt->BitsPerPixel < 8) quit(format("This %s port requires lots of colors.", VERSION_NAME)); full_w = VideoInfo->current_w; full_h = VideoInfo->current_h; /* Use a software surface - A tad inefficient, but stable... */ vflags |= SDL_SWSURFACE; /* Set fullscreen flag */ if (fullscreen) vflags |= SDL_FULLSCREEN; /* otherwise we make this surface resizable */ else vflags |= SDL_RESIZABLE; /* Create the main window */ AppWin = SDL_SetVideoMode(fullscreen ? full_w : screen_w,fullscreen ? full_h : screen_h, 0, vflags); /* Handle failure */ if (!AppWin) quit(format("Failed to create %dx%d window at %d bpp!", screen_w, screen_h, VideoInfo->vfmt->BitsPerPixel)); /* Set the window caption */ SDL_WM_SetCaption(VERSION_NAME, NULL); /* Enable key repeating; use defaults */ (void)SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); /* Enable Unicode (so we can read key codes) */ (void)SDL_EnableUNICODE(1); /* Build a color for "black" that matches the pixel depth of this surface */ back_colour.r = angband_color_table[TERM_DARK][1]; back_colour.g = angband_color_table[TERM_DARK][2]; back_colour.b = angband_color_table[TERM_DARK][3]; back_pixel_colour = SDL_MapRGB(AppWin->format, back_colour.r, back_colour.g, back_colour.b); /* Initialize the colours */ for (i = 0; i < MAX_COLORS; i++) { text_colours[i].r = angband_color_table[i][1]; text_colours[i].g = angband_color_table[i][2]; text_colours[i].b = angband_color_table[i][3]; } /* Get the height of the status bar */ sdl_CheckFont(DEFAULT_FONT_FILE, &w, &h); StatusHeight = h + 3; /* Font used for window titles */ sdl_FontCreate(&SystemFont, DEFAULT_FONT_FILE, AppWin); /* Get the icon for display in the About box */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_ICON, "att-128.png"); if (file_exists(path)) mratt = IMG_Load(path); } /** * Font sorting function * * Orders by width, then height, then face */ static int cmp_font(const void *f1, const void *f2) { const char *font1 = *(const char **)f1; const char *font2 = *(const char **)f2; int height1, height2; int width1, width2; char face1[5], face2[5]; sscanf(font1, "%dx%d%4s.", &width1, &height1, face1); sscanf(font2, "%dx%d%4s.", &width2, &height2, face2); if (width1 < width2) return -1; else if (width1 > width2) return 1; else { if (height1 < height2) return -1; else if (height1 > height2) return 1; else return strcmp(face1, face2); } } /** * This function is now mis-named as paths are set correctly by init_stuff() * in main.c before init_sdl calls this. But it still does some other stuff. */ static void init_paths(void) { int i; char path[1024]; char buf[1024]; ang_dir *dir; /* Build the filename */ path_build(path, sizeof(path), ANGBAND_DIR_XTRA_FONT, DEFAULT_FONT_FILE); /* Hack -- Validate the basic font */ validate_file(path); for (i = 0; i < MAX_FONTS; i++) FontList[i] = NULL; /** Scan for fonts **/ /* Open the directory */ dir = my_dopen(ANGBAND_DIR_XTRA_FONT); if (!dir) return; /* Read every font to the limit */ while (my_dread(dir, buf, sizeof buf)) { /* Check for file extension */ if (suffix(buf, ".fon")) FontList[num_fonts++] = string_make(buf); /* Don't grow to long */ if (num_fonts == MAX_FONTS) break; } sort(FontList, num_fonts, sizeof(FontList[0]), cmp_font); /* Done */ my_dclose(dir); } const char help_sdl[] = "SDL frontend"; /* * The SDL port's "main()" function. */ int init_sdl(int argc, char *argv[]) { /* Initialize SDL: Timer, video, and audio functions */ if (SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); return (2); } /* Initialize the TTF library */ if (TTF_Init() < 0) { fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError()); SDL_Quit(); return (2); } /* Init some extra paths */ init_paths(); /* load possible graphics modes */ init_graphics_modes("graphics.txt"); GfxButtons = mem_zalloc(sizeof(int) * (graphics_mode_high_id+1)); /* Load prefs */ load_prefs(); /* Get sdl going */ init_sdl_local(); /* Prepare the windows */ init_windows(); /* Prepare the gfx */ init_gfx(); /* Prepare some more windows(!) */ init_morewindows(); /* Activate quit hook */ quit_aux = hook_quit; /* Paranoia */ return (0); } #endif /* USE_SDL */ angband-3.5.1/src/parser.c0000644000175000017500000003550312456456606014675 0ustar chriscchrisc/* * File: parser.c * Purpose: Info file parser. * * Copyright (c) 2011 Elly * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ /** * A parser has a list of hooks (which are run across new lines given to * parser_parse()) and a list of the set of named values for the current line. * Each hook has a list of specs, which are essentially named formal parameters; * when we run a particular hook across a line, each spec in the hook is * assigned a value. */ #include "externs.h" #include "parser.h" #include "z-file.h" #include "z-form.h" #include "z-util.h" #include "z-virt.h" #include "z-term.h" const char *parser_error_str[PARSE_ERROR_MAX] = { "(none)", "generic error", "invalid flag", "invalid item number", "invalid spell frequency", "invalid value", "invalid colour", "invalid effect", "invalid option", "missing field", "missing record header", "field too long", "non-sequential records", "not a number", "not random", "obsolete file", "out of bounds", "out of memory", "too few entries", "too many entries", "undefined directive", "unrecognized blow", "unrecognized tval", "unrecognized sval", "vault too big", "internal error", }; enum { PARSE_T_NONE = 0, PARSE_T_INT = 2, PARSE_T_SYM = 4, PARSE_T_STR = 6, PARSE_T_RAND = 8, PARSE_T_UINT = 10, PARSE_T_CHAR = 12, PARSE_T_OPT = 0x00000001 }; struct parser_spec { struct parser_spec *next; int type; const char *name; }; struct parser_value { struct parser_spec spec; union { wchar_t cval; int ival; unsigned int uval; char *sval; random_value rval; } u; }; struct parser_hook { struct parser_hook *next; enum parser_error (*func)(struct parser *p); char *dir; struct parser_spec *fhead; struct parser_spec *ftail; }; struct parser { enum parser_error error; unsigned int lineno; unsigned int colno; char errmsg[1024]; struct parser_hook *hooks; struct parser_value *fhead; struct parser_value *ftail; void *priv; }; struct parser *parser_new(void) { struct parser *p = mem_zalloc(sizeof *p); return p; } static struct parser_hook *findhook(struct parser *p, const char *dir) { struct parser_hook *h = p->hooks; while (h) { if (!strcmp(h->dir, dir)) break; h = h->next; } return h; } static void parser_freeold(struct parser *p) { struct parser_value *v; while (p->fhead) { int t = p->fhead->spec.type & ~PARSE_T_OPT; v = (struct parser_value *)p->fhead->spec.next; if (t == PARSE_T_SYM || t == PARSE_T_STR) mem_free(p->fhead->u.sval); mem_free(p->fhead); p->fhead = v; } } static bool parse_random(const char *str, random_value *bonus) { bool negative = FALSE; char buffer[50]; int i = 0, b, dn, ds, mb; const char end_chr = '|'; char eov; /* Entire value may be negated */ if (str[0] == '-') { negative = TRUE; i++; } /* Make a working copy of the string */ my_strcpy(buffer, &str[i], N_ELEMENTS(buffer) - 2); /* Check for invalid negative numbers */ if (NULL != strstr(buffer, "-")) return FALSE; /* * Add a sentinal value at the end of the string. * Used by scanf to make sure there's no text after the final conversion. */ buffer[strlen(buffer) + 1] = '\0'; buffer[strlen(buffer)] = end_chr; /* Scan the value, apply defaults for unspecified components */ if (5 == sscanf(buffer, "%d+%dd%dM%d%c", &b, &dn, &ds, &mb, &eov) && eov == end_chr) { /* No defaults */ } else if (4 == sscanf(buffer, "%d+d%dM%d%c", &b, &ds, &mb, &eov) && eov == end_chr) { dn = 1; } else if (3 == sscanf(buffer, "%d+M%d%c", &b, &mb, &eov) && eov == end_chr) { dn = 0; ds = 0; } else if (4 == sscanf(buffer, "%d+%dd%d%c", &b, &dn, &ds, &eov) && eov == end_chr) { mb = 0; } else if (3 == sscanf(buffer, "%d+d%d%c", &b, &ds, &eov) && eov == end_chr) { dn = 1; mb = 0; } else if (4 == sscanf(buffer, "%dd%dM%d%c", &dn, &ds, &mb, &eov) && eov == end_chr) { b = 0; } else if (3 == sscanf(buffer, "d%dM%d%c", &ds, &mb, &eov) && eov == end_chr) { b = 0; dn = 1; } else if (2 == sscanf(buffer, "M%d%c", &mb, &eov) && eov == end_chr) { b = 0; dn = 0; ds = 0; } else if (3 == sscanf(buffer, "%dd%d%c", &dn, &ds, &eov) && eov == end_chr) { b = 0; mb = 0; } else if (2 == sscanf(buffer, "d%d%c", &ds, &eov) && eov == end_chr) { b = 0; dn = 1; mb = 0; } else if (2 == sscanf(buffer, "%d%c", &b, &eov) && eov == end_chr) { dn = 0; ds = 0; mb = 0; } else { return FALSE; } /* Assign the values */ bonus->base = b; bonus->dice = dn; bonus->sides = ds; bonus->m_bonus = mb; /* * Handle negation (the random components are always positive, so the base * must be adjusted as necessary). */ if (negative) { bonus->base *= -1; bonus->base -= bonus->m_bonus; bonus->base -= bonus->dice * (bonus->sides + 1); } return TRUE; } /* This is a bit long and should probably be refactored a bit. */ enum parser_error parser_parse(struct parser *p, const char *line) { char *cline; char *tok; struct parser_hook *h; struct parser_spec *s; struct parser_value *v; char *sp = NULL; assert(p); assert(line); parser_freeold(p); p->lineno++; p->colno = 1; p->fhead = NULL; p->ftail = NULL; /* Ignore empty lines and comments. */ while (*line && (isspace(*line))) line++; if (!*line || *line == '#') return PARSE_ERROR_NONE; cline = string_make(line); tok = strtok(cline, ":"); if (!tok) { mem_free(cline); p->error = PARSE_ERROR_MISSING_FIELD; return PARSE_ERROR_MISSING_FIELD; } h = findhook(p, tok); if (!h) { my_strcpy(p->errmsg, tok, sizeof(p->errmsg)); p->error = PARSE_ERROR_UNDEFINED_DIRECTIVE; mem_free(cline); return PARSE_ERROR_UNDEFINED_DIRECTIVE; } /* There's a little bit of trickiness here to account for optional * types. The optional flag has a bit assigned to it in the spec's type * tag; we compute a temporary type for the spec with that flag removed * and use that instead. */ for (s = h->fhead; s; s = s->next) { int t = s->type & ~PARSE_T_OPT; p->colno++; /* These types are tokenized on ':'; strings are not tokenized * at all (i.e., they consume the remainder of the line) */ if (t == PARSE_T_INT || t == PARSE_T_SYM || t == PARSE_T_RAND || t == PARSE_T_UINT) { tok = strtok(sp, ":"); sp = NULL; } else if (t == PARSE_T_CHAR) { tok = strtok(sp, ""); if (tok) sp = tok + 2; } else { tok = strtok(sp, ""); sp = NULL; } if (!tok) { if (!(s->type & PARSE_T_OPT)) { my_strcpy(p->errmsg, s->name, sizeof(p->errmsg)); p->error = PARSE_ERROR_MISSING_FIELD; mem_free(cline); return PARSE_ERROR_MISSING_FIELD; } break; } /* Allocate a value node, parse out its value, and link it into * the value list. */ v = mem_alloc(sizeof *v); v->spec.next = NULL; v->spec.type = s->type; v->spec.name = s->name; if (t == PARSE_T_INT) { char *z = NULL; v->u.ival = strtol(tok, &z, 0); if (z == tok) { mem_free(v); mem_free(cline); my_strcpy(p->errmsg, s->name, sizeof(p->errmsg)); p->error = PARSE_ERROR_NOT_NUMBER; return PARSE_ERROR_NOT_NUMBER; } } else if (t == PARSE_T_UINT) { char *z = NULL; v->u.uval = strtoul(tok, &z, 0); if (z == tok || *tok == '-') { mem_free(v); mem_free(cline); my_strcpy(p->errmsg, s->name, sizeof(p->errmsg)); p->error = PARSE_ERROR_NOT_NUMBER; return PARSE_ERROR_NOT_NUMBER; } } else if (t == PARSE_T_CHAR) { Term_mbstowcs(&v->u.cval, tok, 1); } else if (t == PARSE_T_SYM || t == PARSE_T_STR) { v->u.sval = string_make(tok); } else if (t == PARSE_T_RAND) { if (!parse_random(tok, &v->u.rval)) { mem_free(v); mem_free(cline); my_strcpy(p->errmsg, s->name, sizeof(p->errmsg)); p->error = PARSE_ERROR_NOT_RANDOM; return PARSE_ERROR_NOT_RANDOM; } } if (!p->fhead) p->fhead = v; else p->ftail->spec.next = &v->spec; p->ftail = v; } mem_free(cline); p->error = h->func(p); return p->error; } void *parser_priv(struct parser *p) { return p->priv; } void parser_setpriv(struct parser *p, void *v) { p->priv = v; } static int parse_type(const char *s) { int rv = 0; if (s[0] == '?') { rv |= PARSE_T_OPT; s++; } if (!strcmp(s, "int")) return PARSE_T_INT | rv; if (!strcmp(s, "sym")) return PARSE_T_SYM | rv; if (!strcmp(s, "str")) return PARSE_T_STR | rv; if (!strcmp(s, "rand")) return PARSE_T_RAND | rv; if (!strcmp(s, "uint")) return PARSE_T_UINT | rv; if (!strcmp(s, "char")) return PARSE_T_CHAR | rv; return PARSE_T_NONE; } static void clean_specs(struct parser_hook *h) { struct parser_spec *s; mem_free(h->dir); while (h->fhead) { s = h->fhead; h->fhead = h->fhead->next; mem_free((void*)s->name); mem_free(s); } } void parser_destroy(struct parser *p) { struct parser_hook *h; parser_freeold(p); while (p->hooks) { h = p->hooks->next; clean_specs(p->hooks); mem_free(p->hooks); p->hooks = h; } mem_free(p); } static errr parse_specs(struct parser_hook *h, char *fmt) { char *name ; char *stype = NULL; int type; struct parser_spec *s; assert(h); assert(fmt); name = strtok(fmt, " "); if (!name) return -EINVAL; h->dir = string_make(name); h->fhead = NULL; h->ftail = NULL; while (name) { /* Lack of a type is legal; that means we're at the end of the * line. */ stype = strtok(NULL, " "); if (!stype) break; /* Lack of a name, on the other hand... */ name = strtok(NULL, " "); if (!name) { clean_specs(h); return -EINVAL; } /* Grab a type, check to see if we have a mandatory type * following an optional type. */ type = parse_type(stype); if (type == PARSE_T_NONE) { clean_specs(h); return -EINVAL; } if (!(type & PARSE_T_OPT) && h->ftail && (h->ftail->type & PARSE_T_OPT)) { clean_specs(h); return -EINVAL; } if (h->ftail && ((h->ftail->type & ~PARSE_T_OPT) == PARSE_T_STR)) { clean_specs(h); return -EINVAL; } /* Save this spec. */ s = mem_alloc(sizeof *s); s->type = type; s->name = string_make(name); s->next = NULL; if (h->fhead) h->ftail->next = s; else h->fhead = s; h->ftail = s; } return 0; } errr parser_reg(struct parser *p, const char *fmt, enum parser_error (*func)(struct parser *p)) { errr r; char *cfmt; struct parser_hook *h; assert(p); assert(fmt); assert(func); h = mem_alloc(sizeof *h); cfmt = string_make(fmt); h->next = p->hooks; h->func = func; r = parse_specs(h, cfmt); if (r) { mem_free(h); mem_free(cfmt); return r; } p->hooks = h; mem_free(cfmt); return 0; } enum parser_error ignored(struct parser *p) { return PARSE_ERROR_NONE; } bool parser_hasval(struct parser *p, const char *name) { struct parser_value *v; for (v = p->fhead; v; v = (struct parser_value *)v->spec.next) { if (!strcmp(v->spec.name, name)) return TRUE; } return FALSE; } static struct parser_value *parser_getval(struct parser *p, const char *name) { struct parser_value *v; for (v = p->fhead; v; v = (struct parser_value *)v->spec.next) { if (!strcmp(v->spec.name, name)) { return v; } } quit_fmt("parser_getval error: name is %s\n", name); return 0; /* Needed to avoid Windows compiler warning */ } const char *parser_getsym(struct parser *p, const char *name) { struct parser_value *v = parser_getval(p, name); assert((v->spec.type & ~PARSE_T_OPT) == PARSE_T_SYM); return v->u.sval; } int parser_getint(struct parser *p, const char *name) { struct parser_value *v = parser_getval(p, name); assert((v->spec.type & ~PARSE_T_OPT) == PARSE_T_INT); return v->u.ival; } unsigned int parser_getuint(struct parser *p, const char *name) { struct parser_value *v = parser_getval(p, name); assert((v->spec.type & ~PARSE_T_OPT) == PARSE_T_UINT); return v->u.uval; } const char *parser_getstr(struct parser *p, const char *name) { struct parser_value *v = parser_getval(p, name); assert((v->spec.type & ~PARSE_T_OPT) == PARSE_T_STR); return v->u.sval; } struct random parser_getrand(struct parser *p, const char *name) { struct parser_value *v = parser_getval(p, name); assert((v->spec.type & ~PARSE_T_OPT) == PARSE_T_RAND); return v->u.rval; } wchar_t parser_getchar(struct parser *p, const char *name) { struct parser_value *v = parser_getval(p, name); assert((v->spec.type & ~PARSE_T_OPT) == PARSE_T_CHAR); return v->u.cval; } int parser_getstate(struct parser *p, struct parser_state *s) { s->error = p->error; s->line = p->lineno; s->col = p->colno; s->msg = p->errmsg; return s->error != PARSE_ERROR_NONE; } void parser_setstate(struct parser *p, unsigned int col, const char *msg) { p->colno = col; my_strcpy(p->errmsg, msg, sizeof(p->errmsg)); } /* More angband-specific bits of the parser * These require hooks into other parts of the code, and are a candidate for * moving elsewhere. */ static void print_error(struct file_parser *fp, struct parser *p) { struct parser_state s; parser_getstate(p, &s); msg("Parse error in %s line %d column %d: %s: %s", fp->name, s.line, s.col, s.msg, parser_error_str[s.error]); message_flush(); quit_fmt("Parse error in %s line %d column %d.", fp->name, s.line, s.col); } errr run_parser(struct file_parser *fp) { struct parser *p = fp->init(); errr r; if (!p) { return PARSE_ERROR_GENERIC; } r = fp->run(p); if (r) { print_error(fp, p); return r; } r = fp->finish(p); if (r) print_error(fp, p); return r; } /* The basic file parsing function */ errr parse_file(struct parser *p, const char *filename) { char path[1024]; char buf[1024]; ang_file *fh; errr r = 0; path_build(path, sizeof(path), ANGBAND_DIR_EDIT, format("%s.txt", filename)); fh = file_open(path, MODE_READ, FTYPE_TEXT); if (!fh) quit(format("Cannot open '%s.txt'", filename)); while (file_getl(fh, buf, sizeof(buf))) { r = parser_parse(p, buf); if (r) break; } file_close(fh); return r; } void cleanup_parser(struct file_parser *fp) { fp->cleanup(); } int lookup_flag(const char **flag_table, const char *flag_name) { int i = FLAG_START; while (flag_table[i] && !streq(flag_table[i], flag_name)) i++; /* End of table reached without match */ if (!flag_table[i]) i = FLAG_END; return i; } errr grab_flag(bitflag *flags, const size_t size, const char **flag_table, const char *flag_name) { int flag = lookup_flag(flag_table, flag_name); if (flag == FLAG_END) return PARSE_ERROR_INVALID_FLAG; flag_on(flags, size, flag); return 0; } errr remove_flag(bitflag *flags, const size_t size, const char **flag_table, const char *flag_name) { int flag = lookup_flag(flag_table, flag_name); if (flag == FLAG_END) return PARSE_ERROR_INVALID_FLAG; flag_off(flags, size, flag); return 0; } angband-3.5.1/src/cmd-obj.c0000644000175000017500000006566312456456606014726 0ustar chriscchrisc/* * File: cmd-obj.c * Purpose: Handle objects in various ways * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * Copyright (c) 2007-9 Andi Sidwell, Chris Carr, Ed Graham, Erik Osheim * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "attack.h" #include "cave.h" #include "cmds.h" #include "effects.h" #include "game-cmd.h" #include "object/inventory.h" #include "object/tvalsval.h" #include "spells.h" #include "squelch.h" #include "target.h" #include "ui-menu.h" #include "ui-options.h" /*** Utility bits and bobs ***/ /* * Check to see if the player can use a rod/wand/staff/activatable object. */ static int check_devices(object_type *o_ptr) { int fail; const char *action; const char *what = NULL; /* Get the right string */ switch (o_ptr->tval) { case TV_ROD: action = "zap the rod"; break; case TV_WAND: action = "use the wand"; what = "wand"; break; case TV_STAFF: action = "use the staff"; what = "staff"; break; default: action = "activate it"; break; } /* Figure out how hard the item is to use */ fail = get_use_device_chance(o_ptr); /* Roll for usage */ if (randint1(1000) < fail) { flush(); msg("You failed to %s properly.", action); return FALSE; } /* Notice empty staffs */ if (what && o_ptr->pval[DEFAULT_PVAL] <= 0) { flush(); msg("The %s has no charges left.", what); o_ptr->ident |= (IDENT_EMPTY); return FALSE; } return TRUE; } /* * Return the chance of an effect beaming, given a tval. */ static int beam_chance(int tval) { switch (tval) { case TV_WAND: return 20; case TV_ROD: return 10; } return 0; } typedef enum { ART_TAG_NONE, ART_TAG_NAME, ART_TAG_KIND, ART_TAG_VERB, ART_TAG_VERB_IS } art_tag_t; static art_tag_t art_tag_lookup(const char *tag) { if (strncmp(tag, "name", 4) == 0) return ART_TAG_NAME; else if (strncmp(tag, "kind", 4) == 0) return ART_TAG_KIND; else if (strncmp(tag, "s", 1) == 0) return ART_TAG_VERB; else if (strncmp(tag, "is", 2) == 0) return ART_TAG_VERB_IS; else return ART_TAG_NONE; } /* * Print an artifact activation message. * * In order to support randarts, with scrambled names, we re-write * the message to replace instances of {name} with the artifact name * and instances of {kind} with the type of object. * * This code deals with plural and singular forms of verbs correctly * when encountering {s}, though in fact both names and kinds are * always singular in the current code (gloves are "Set of" and boots * are "Pair of") */ static void activation_message(object_type *o_ptr, const char *message) { char buf[1024] = "\0"; const char *next; const char *s; const char *tag; const char *in_cursor; size_t end = 0; in_cursor = message; next = strchr(in_cursor, '{'); while (next) { /* Copy the text leading up to this { */ strnfcat(buf, 1024, &end, "%.*s", next - in_cursor, in_cursor); s = next + 1; while (*s && isalpha((unsigned char) *s)) s++; if (*s == '}') /* Valid tag */ { tag = next + 1; /* Start the tag after the { */ in_cursor = s + 1; switch(art_tag_lookup(tag)) { case ART_TAG_NAME: end += object_desc(buf, 1024, o_ptr, ODESC_PREFIX | ODESC_BASE); break; case ART_TAG_KIND: object_kind_name(&buf[end], 1024-end, o_ptr->kind, TRUE); end += strlen(&buf[end]); break; case ART_TAG_VERB: strnfcat(buf, 1024, &end, "s"); break; case ART_TAG_VERB_IS: if((end > 2) && (buf[end-2] == 's')) strnfcat(buf, 1024, &end, "are"); else strnfcat(buf, 1024, &end, "is"); default: break; } } else /* An invalid tag, skip it */ { in_cursor = next + 1; } next = strchr(in_cursor, '{'); } strnfcat(buf, 1024, &end, in_cursor); msg("%s", buf); } /*** Inscriptions ***/ /* Remove inscription */ void do_cmd_uninscribe(cmd_code code, cmd_arg args[]) { object_type *o_ptr = object_from_item_idx(args[0].item); if (obj_has_inscrip(o_ptr)) msg("Inscription removed."); o_ptr->note = 0; p_ptr->notice |= (PN_COMBINE | PN_SQUELCH | PN_SORT_QUIVER); p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } /* Add inscription */ void do_cmd_inscribe(cmd_code code, cmd_arg args[]) { object_type *o_ptr = object_from_item_idx(args[0].item); o_ptr->note = quark_add(args[1].string); string_free((void *)args[1].string); p_ptr->notice |= (PN_COMBINE | PN_SQUELCH | PN_SORT_QUIVER); p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } /*** Taking off/putting on ***/ /* Take off an item */ void do_cmd_takeoff(cmd_code code, cmd_arg args[]) { int item = args[0].item; if (!item_is_available(item, NULL, USE_EQUIP)) { msg("You are not wielding that item."); return; } if (!obj_can_takeoff(object_from_item_idx(item))) { msg("You cannot take off that item."); return; } (void)inven_takeoff(item, 255); pack_overflow(); p_ptr->energy_use = 50; } /* * Wield or wear a single item from the pack or floor */ void wield_item(object_type *o_ptr, int item, int slot) { object_type object_type_body; object_type *i_ptr = &object_type_body; const char *fmt; char o_name[80]; bool combined_ammo = FALSE; bool track_wielded_item = FALSE; int num = 1; /* If we are stacking ammo in the quiver */ if (obj_is_ammo(o_ptr)) { num = o_ptr->number; combined_ammo = object_similar(o_ptr, &p_ptr->inventory[slot], OSTACK_QUIVER); } /* Take a turn */ p_ptr->energy_use = 100; /* Obtain local object */ object_copy(i_ptr, o_ptr); /* Modify quantity */ i_ptr->number = num; /* Update object_idx if necessary, once object is in slot */ if (tracked_object_is(item)) { track_wielded_item = TRUE; } /* Decrease the item (from the pack) */ if (item >= 0) { inven_item_increase(item, -num); inven_item_optimize(item); } /* Decrease the item (from the floor) */ else { floor_item_increase(0 - item, -num); floor_item_optimize(0 - item); } /* Get the wield slot */ o_ptr = &p_ptr->inventory[slot]; if (combined_ammo) { /* Add the new ammo to the already-quiver-ed ammo */ object_absorb(o_ptr, i_ptr); } else { /* Take off existing item */ if (o_ptr->kind) (void)inven_takeoff(slot, 255); /* If we are wielding ammo we may need to "open" the slot by shifting * later ammo up the quiver; this is because we already called the * inven_item_optimize() function. */ if (slot >= QUIVER_START) open_quiver_slot(slot); /* Wear the new stuff */ object_copy(o_ptr, i_ptr); /* Increment the equip counter by hand */ p_ptr->equip_cnt++; } /* Increase the weight */ p_ptr->total_weight += i_ptr->weight * num; /* Track object if necessary */ if (track_wielded_item) { track_object(slot); } /* Do any ID-on-wield */ object_notice_on_wield(o_ptr); /* Where is the item now */ if (slot == INVEN_WIELD) fmt = "You are wielding %s (%c)."; else if (slot == INVEN_BOW) fmt = "You are shooting with %s (%c)."; else if (slot == INVEN_LIGHT) fmt = "Your light source is %s (%c)."; else if (combined_ammo) fmt = "You combine %s in your quiver (%c)."; else if (slot >= QUIVER_START && slot < QUIVER_END) fmt = "You add %s to your quiver (%c)."; else fmt = "You are wearing %s (%c)."; /* Describe the result */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Message */ msgt(MSG_WIELD, fmt, o_name, index_to_label(slot)); /* Cursed! */ if (cursed_p(o_ptr->flags)) { /* Warn the player */ msgt(MSG_CURSED, "Oops! It feels deathly cold!"); /* Sense the object */ object_notice_curses(o_ptr); } /* Save quiver size */ save_quiver_size(p_ptr); /* See if we have to overflow the pack */ pack_overflow(); /* Recalculate bonuses, torch, mana */ p_ptr->notice |= PN_SORT_QUIVER; p_ptr->update |= (PU_BONUS | PU_TORCH | PU_MANA); p_ptr->redraw |= (PR_INVEN | PR_EQUIP); } /* Wield or wear an item */ void do_cmd_wield(cmd_code code, cmd_arg args[]) { object_type *equip_o_ptr; char o_name[80]; unsigned n; int item = args[0].item; int slot = args[1].number; object_type *o_ptr = object_from_item_idx(item); if (!item_is_available(item, NULL, USE_INVEN | USE_FLOOR)) { msg("You do not have that item to wield."); return; } /* Check the slot */ if (!slot_can_wield_item(slot, o_ptr)) { msg("You cannot wield that item there."); return; } equip_o_ptr = &p_ptr->inventory[slot]; /* If the slot is open, wield and be done */ if (!equip_o_ptr->kind) { wield_item(o_ptr, item, slot); return; } /* If the slot is in the quiver and objects can be combined */ if (obj_is_ammo(equip_o_ptr) && object_similar(equip_o_ptr, o_ptr, OSTACK_QUIVER)) { wield_item(o_ptr, item, slot); return; } /* Prevent wielding into a cursed slot */ if (cursed_p(equip_o_ptr->flags)) { object_desc(o_name, sizeof(o_name), equip_o_ptr, ODESC_BASE); msg("The %s you are %s appears to be cursed.", o_name, describe_use(slot)); return; } /* "!t" checks for taking off */ n = check_for_inscrip(equip_o_ptr, "!t"); while (n--) { /* Prompt */ object_desc(o_name, sizeof(o_name), equip_o_ptr, ODESC_PREFIX | ODESC_FULL); /* Forget it */ if (!get_check(format("Really take off %s? ", o_name))) return; } wield_item(o_ptr, item, slot); } /* Drop an item */ void do_cmd_drop(cmd_code code, cmd_arg args[]) { int item = args[0].item; object_type *o_ptr = object_from_item_idx(item); int amt = args[1].number; if (!item_is_available(item, NULL, USE_INVEN | USE_EQUIP)) { msg("You do not have that item to drop it."); return; } /* Hack -- Cannot remove cursed items */ if ((item >= INVEN_WIELD) && cursed_p(o_ptr->flags)) { msg("Hmmm, it seems to be cursed."); return; } inven_drop(item, amt); p_ptr->energy_use = 50; } /* Destroy an item */ void do_cmd_destroy(cmd_code code, cmd_arg args[]) { object_type *o_ptr; int item = args[0].item; if (!item_is_available(item, NULL, USE_INVEN | USE_EQUIP | USE_FLOOR)) { msg("You do not have that item to ignore it."); return; } o_ptr = object_from_item_idx(item); if ((item >= INVEN_WIELD) && cursed_p(o_ptr->flags)) { msg("You cannot ignore cursed items."); } else { char o_name[80]; object_desc(o_name, sizeof o_name, o_ptr, ODESC_PREFIX | ODESC_FULL); msgt(MSG_DESTROY, "Ignoring %s.", o_name); o_ptr->ignore = TRUE; p_ptr->notice |= PN_SQUELCH; } } /*** Using items the traditional way ***/ /* * Use an object the right way. * * There may be a BIG problem with any "effect" that can cause "changes" * to the inventory. For example, a "scroll of recharging" can cause * a wand/staff to "disappear", moving the inventory up. Luckily, the * scrolls all appear BEFORE the staffs/wands, so this is not a problem. * But, for example, a "staff of recharging" could cause MAJOR problems. * In such a case, it will be best to either (1) "postpone" the effect * until the end of the function, or (2) "change" the effect, say, into * giving a staff "negative" charges, or "turning a staff into a stick". * It seems as though a "rod of recharging" might in fact cause problems. * The basic problem is that the act of recharging (and destroying) an * item causes the inducer of that action to "move", causing "o_ptr" to * no longer point at the correct item, with horrifying results. */ void do_cmd_use(cmd_code code, cmd_arg args[]) { int item = args[0].item; object_type *o_ptr = object_from_item_idx(item); object_type *original = NULL; int effect; bool ident = FALSE, used = FALSE; bool was_aware = object_flavor_is_aware(o_ptr); int dir = 5; int px = p_ptr->px, py = p_ptr->py; int snd = MSG_GENERIC, boost, level; enum { USE_TIMEOUT, USE_CHARGE, USE_SINGLE } use = USE_SINGLE; int items_allowed = 0; /* Determine how this item is used. */ if (obj_is_rod(o_ptr)) { if (!obj_can_zap(o_ptr)) { msg("That rod is still charging."); return; } use = USE_TIMEOUT; snd = MSG_ZAP_ROD; items_allowed = USE_INVEN | USE_FLOOR; } else if (obj_is_wand(o_ptr)) { if (!obj_has_charges(o_ptr)) { msg("That wand has no charges."); return; } use = USE_CHARGE; snd = MSG_ZAP_ROD; items_allowed = USE_INVEN | USE_FLOOR; } else if (obj_is_staff(o_ptr)) { if (!obj_has_charges(o_ptr)) { msg("That staff has no charges."); return; } use = USE_CHARGE; snd = MSG_USE_STAFF; items_allowed = USE_INVEN | USE_FLOOR; } else if (obj_is_food(o_ptr)) { use = USE_SINGLE; snd = MSG_EAT; items_allowed = USE_INVEN | USE_FLOOR; } else if (obj_is_potion(o_ptr)) { use = USE_SINGLE; snd = MSG_QUAFF; items_allowed = USE_INVEN | USE_FLOOR; } else if (obj_is_scroll(o_ptr)) { /* Check player can use scroll */ if (!player_can_read(p_ptr, TRUE)) return; use = USE_SINGLE; snd = MSG_GENERIC; items_allowed = USE_INVEN | USE_FLOOR; } else if (obj_is_activatable(o_ptr)) { if (!obj_can_activate(o_ptr)) { msg("That item is still charging."); return; } use = USE_TIMEOUT; snd = MSG_ACT_ARTIFACT; items_allowed = USE_EQUIP; } else if (obj_is_ammo(o_ptr)) { do_cmd_fire(code,args); return; } else { msg("The item cannot be used at the moment"); } /* Check if item is within player's reach. */ if (items_allowed == 0 || !item_is_available(item, NULL, items_allowed)) { msg("You cannot use that item from its current location."); return; } /* track the object used */ track_object(item); /* Figure out effect to use */ effect = object_effect(o_ptr); /* Check for unknown objects to prevent wasted player turns. */ if (effect == EF_IDENTIFY && !spell_identify_unknown_available()) { msg("You have nothing to identify."); return; } /* If the item requires a direction, get one (allow cancelling) */ if (obj_needs_aim(o_ptr)) dir = args[1].direction; if (item >= 0 && item < INVEN_PACK) { /* Create a copy so that we can remember what we are working with, in case the * inventory is changed. */ original = ZNEW(object_type); object_copy(original, o_ptr); } /* Check for use if necessary, and execute the effect */ if ((use != USE_CHARGE && use != USE_TIMEOUT) || check_devices(o_ptr)) { int beam = beam_chance(o_ptr->tval); /* Special message for artifacts */ if (o_ptr->artifact) { msgt(snd, "You activate it."); if (o_ptr->artifact->effect_msg) activation_message(o_ptr, o_ptr->artifact->effect_msg); level = o_ptr->artifact->level; } else { /* Make a noise! */ sound(snd); level = o_ptr->kind->level; } /* A bit of a hack to make ID work better. -- Check for "obvious" effects beforehand. */ if (effect_obvious(effect)) object_flavor_aware(o_ptr); /* Boost damage effects if skill > difficulty */ boost = MAX(p_ptr->state.skills[SKILL_DEVICE] - level, 0); /* Do effect */ used = effect_do(effect, &ident, was_aware, dir, beam, boost); /* Quit if the item wasn't used and no knowledge was gained */ if (!used && (was_aware || !ident)) return; } if (original != NULL) { /* Restore o_ptr to the new inventory slot that contains the original object. We * have to do this because object mutating functions follow; "original" is a dummy * just so that we know what we are working with. */ item = inventory_index_matching_object(original); o_ptr = object_from_item_idx(item); FREE(original); } /* If the item is a null pointer or has been wiped, be done now */ if (!o_ptr || !o_ptr->kind) return; if (ident) object_notice_effect(o_ptr); /* Food feeds the player */ if (o_ptr->tval == TV_FOOD || o_ptr->tval == TV_POTION) player_set_food(p_ptr, p_ptr->food + o_ptr->pval[DEFAULT_PVAL]); /* Use the turn */ p_ptr->energy_use = 100; /* Mark as tried and redisplay */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); p_ptr->redraw |= (PR_INVEN | PR_EQUIP | PR_OBJECT); /* * If the player becomes aware of the item's function, then mark it as * aware and reward the player with some experience. Otherwise, mark * it as "tried". */ if (ident && !was_aware) { /* Object level */ int lev = o_ptr->kind->level; object_flavor_aware(o_ptr); if (o_ptr->tval == TV_ROD) object_notice_everything(o_ptr); player_exp_gain(p_ptr, (lev + (p_ptr->lev / 2)) / p_ptr->lev); p_ptr->notice |= PN_SQUELCH; } else if (used) { object_flavor_tried(o_ptr); } /* If there are no more of the item left, then we're done. */ if (!o_ptr->number) return; /* Chargeables act differently to single-used items when not used up */ if (used && use == USE_CHARGE) { /* Use a single charge */ o_ptr->pval[DEFAULT_PVAL]--; /* Describe charges */ if (item >= 0) inven_item_charges(item); else floor_item_charges(0 - item); } else if (used && use == USE_TIMEOUT) { /* Artifacts use their own special field */ if (o_ptr->artifact) o_ptr->timeout = randcalc(o_ptr->artifact->time, 0, RANDOMISE); else o_ptr->timeout += randcalc(o_ptr->kind->time, 0, RANDOMISE); } else if (used && use == USE_SINGLE) { /* Destroy a potion in the pack */ if (item >= 0) { inven_item_increase(item, -1); inven_item_describe(item); inven_item_optimize(item); } /* Destroy a potion on the floor */ else { floor_item_increase(0 - item, -1); floor_item_describe(0 - item); floor_item_optimize(0 - item); } } /* Hack to make Glyph of Warding work properly */ if (cave_isglyph(cave, py, px)) { /* Push objects off the grid */ if (cave->o_idx[py][px]) push_object(py, px); } } /*** Refuelling ***/ static void refill_lamp(object_type *j_ptr, object_type *o_ptr, int item) { /* Refuel */ j_ptr->timeout += o_ptr->timeout ? o_ptr->timeout : o_ptr->pval[DEFAULT_PVAL]; /* Message */ msg("You fuel your lamp."); /* Comment */ if (j_ptr->timeout >= FUEL_LAMP) { j_ptr->timeout = FUEL_LAMP; msg("Your lamp is full."); } /* Refilled from a lantern */ if (o_ptr->sval == SV_LIGHT_LANTERN) { /* Unstack if necessary */ if (o_ptr->number > 1) { object_type *i_ptr; object_type object_type_body; /* Get local object */ i_ptr = &object_type_body; /* Obtain a local object */ object_copy(i_ptr, o_ptr); /* Modify quantity */ i_ptr->number = 1; /* Remove fuel */ i_ptr->timeout = 0; /* Unstack the used item */ o_ptr->number--; p_ptr->total_weight -= i_ptr->weight; /* Carry or drop */ if (item >= 0) inven_carry(p_ptr, i_ptr); else drop_near(cave, i_ptr, 0, p_ptr->py, p_ptr->px, FALSE); } /* Empty a single lantern */ else { /* No more fuel */ o_ptr->timeout = 0; } /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN); } /* Refilled from a flask */ else { /* Decrease the item (from the pack) */ if (item >= 0) { inven_item_increase(item, -1); inven_item_describe(item); inven_item_optimize(item); } /* Decrease the item (from the floor) */ else { floor_item_increase(0 - item, -1); floor_item_describe(0 - item); floor_item_optimize(0 - item); } } /* Recalculate torch */ p_ptr->update |= (PU_TORCH); /* Redraw stuff */ p_ptr->redraw |= (PR_EQUIP); } void do_cmd_refill(cmd_code code, cmd_arg args[]) { object_type *j_ptr = &p_ptr->inventory[INVEN_LIGHT]; bitflag f[OF_SIZE]; int item = args[0].item; object_type *o_ptr = object_from_item_idx(item); if (!item_is_available(item, NULL, USE_INVEN | USE_FLOOR)) { msg("You do not have that item to refill with it."); return; } /* Check what we're wielding. */ object_flags(j_ptr, f); if (j_ptr->tval != TV_LIGHT) { msg("You are not wielding a light."); return; } else if (of_has(f, OF_NO_FUEL)) { msg("Your light cannot be refilled."); return; } else if (j_ptr->sval == SV_LIGHT_LANTERN) { refill_lamp(j_ptr, o_ptr, item); } else { msg("Your light cannot be refilled."); return; } p_ptr->energy_use = 50; } /*** Spell casting ***/ /* Gain a specific spell, specified by spell number (for mages). */ void do_cmd_study_spell(cmd_code code, cmd_arg args[]) { int spell = args[0].choice; int item_list[INVEN_TOTAL + MAX_FLOOR_STACK]; int item_num; int i; /* Check the player can study at all atm */ if (!player_can_study(p_ptr, TRUE)) return; /* Check that the player can actually learn the nominated spell. */ item_tester_hook = obj_can_browse; item_num = scan_items(item_list, N_ELEMENTS(item_list), (USE_INVEN | USE_FLOOR)); /* Check through all available books */ for (i = 0; i < item_num; i++) { if (spell_in_book(spell, item_list[i])) { if (spell_okay_to_study(spell)) { /* Spell is in an available book, and player is capable. */ spell_learn(spell); p_ptr->energy_use = 100; } else { /* Spell is present, but player incapable. */ msg("You cannot learn that spell."); } return; } } } /* Cast a spell from a book */ void do_cmd_cast(cmd_code code, cmd_arg args[]) { int spell = args[0].choice; int dir = args[1].direction; int item_list[INVEN_TOTAL + MAX_FLOOR_STACK]; int item_num; int i; const char *verb = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "cast" : "recite"); const char *noun = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer"); /* Check the player can cast spells at all */ if (!player_can_cast(p_ptr, TRUE)) return; /* Check spell is in a book they can access */ item_tester_hook = obj_can_browse; item_num = scan_items(item_list, N_ELEMENTS(item_list), (USE_INVEN | USE_FLOOR)); /* Check through all available books */ for (i = 0; i < item_num; i++) { if (spell_in_book(spell, item_list[i])) { if (spell_okay_to_cast(spell)) { /* Get the spell */ const magic_type *s_ptr = &p_ptr->class->spells.info[spell]; /* Check for unknown objects to prevent wasted player turns. */ if (spell_is_identify(p_ptr->class->spell_book, spell) && !spell_identify_unknown_available()) { msg("You have nothing to identify."); return; } /* Verify "dangerous" spells */ if (s_ptr->smana > p_ptr->csp) { /* Warning */ msg("You do not have enough mana to %s this %s.", verb, noun); /* Flush input */ flush(); /* Verify */ if (!get_check("Attempt it anyway? ")) return; } /* Cast a spell */ if (spell_cast(spell, dir)) p_ptr->energy_use = 100; } else { /* Spell is present, but player incapable. */ msg("You cannot %s that %s.", verb, noun); } return; } } } /* Gain a random spell from the given book (for priests) */ void do_cmd_study_book(cmd_code code, cmd_arg args[]) { int book = args[0].item; object_type *o_ptr = object_from_item_idx(book); int spell = -1; struct spell *sp; int k = 0; const char *p = ((p_ptr->class->spell_book == TV_MAGIC_BOOK) ? "spell" : "prayer"); /* Check the player can study at all atm */ if (!player_can_study(p_ptr, TRUE)) return; /* Check that the player has access to the nominated spell book. */ if (!item_is_available(book, obj_can_browse, (USE_INVEN | USE_FLOOR))) { msg("That item is not within your reach."); return; } /* Extract spells */ for (sp = o_ptr->kind->spells; sp; sp = sp->next) { if (!spell_okay_to_study(sp->spell_index)) continue; if ((++k > 1) && (randint0(k) != 0)) continue; spell = sp->spell_index; } if (spell < 0) { msg("You cannot learn any %ss in that book.", p); } else { spell_learn(spell); p_ptr->energy_use = 100; } } enum { IGNORE_THIS_ITEM, UNIGNORE_THIS_ITEM, IGNORE_THIS_FLAVOR, UNIGNORE_THIS_FLAVOR, IGNORE_THIS_QUALITY }; void textui_cmd_destroy_menu(int item) { object_type *o_ptr; char out_val[160]; menu_type *m; region r; int selected; o_ptr = object_from_item_idx(item); if (!(o_ptr->kind)) return; m = menu_dynamic_new(); m->selections = lower_case; /* Basic ignore option */ if (!o_ptr->ignore) { menu_dynamic_add(m, "This item only", IGNORE_THIS_ITEM); } else { menu_dynamic_add(m, "Unignore this item", UNIGNORE_THIS_ITEM); } /* Flavour-aware squelch */ if (squelch_tval(o_ptr->tval) && (!o_ptr->artifact || !object_flavor_is_aware(o_ptr))) { bool squelched = kind_is_squelched_aware(o_ptr->kind) || kind_is_squelched_unaware(o_ptr->kind); char tmp[70]; object_desc(tmp, sizeof(tmp), o_ptr, ODESC_BASE | ODESC_PLURAL); if (!squelched) { strnfmt(out_val, sizeof out_val, "All %s", tmp); menu_dynamic_add(m, out_val, IGNORE_THIS_FLAVOR); } else { strnfmt(out_val, sizeof out_val, "Unignore all %s", tmp); menu_dynamic_add(m, out_val, UNIGNORE_THIS_FLAVOR); } } /* Quality squelching */ if (object_was_sensed(o_ptr) || object_was_worn(o_ptr) || object_is_known_not_artifact(o_ptr)) { byte value = squelch_level_of(o_ptr); int type = squelch_type_of(o_ptr); if (object_is_jewelry(o_ptr) && squelch_level_of(o_ptr) != SQUELCH_BAD) value = SQUELCH_MAX; if (value != SQUELCH_MAX && type != TYPE_MAX) { strnfmt(out_val, sizeof out_val, "All %s %s", quality_values[value].name, squelch_name_for_type(type)); menu_dynamic_add(m, out_val, IGNORE_THIS_QUALITY); } } /* work out display region */ r.width = menu_dynamic_longest_entry(m) + 3 + 2; /* +3 for tag, 2 for pad */ r.col = 80 - r.width; r.row = 1; r.page_rows = m->count; screen_save(); menu_layout(m, &r); region_erase_bordered(&r); prt("(Enter to select, ESC) Ignore:", 0, 0); selected = menu_dynamic_select(m); screen_load(); if (selected == IGNORE_THIS_ITEM) { cmd_insert(CMD_DESTROY); cmd_set_arg_item(cmd_get_top(), 0, item); } else if (selected == UNIGNORE_THIS_ITEM) { o_ptr->ignore = FALSE; } else if (selected == IGNORE_THIS_FLAVOR) { object_squelch_flavor_of(o_ptr); } else if (selected == UNIGNORE_THIS_FLAVOR) { kind_squelch_clear(o_ptr->kind); } else if (selected == IGNORE_THIS_QUALITY) { byte value = squelch_level_of(o_ptr); int type = squelch_type_of(o_ptr); squelch_level[type] = value; } p_ptr->notice |= PN_SQUELCH; menu_dynamic_free(m); } void textui_cmd_destroy(void) { int item; /* Get an item */ const char *q = "Ignore which item? "; const char *s = "You have nothing to ignore."; if (!get_item(&item, q, s, CMD_DESTROY, USE_INVEN | USE_EQUIP | USE_FLOOR)) return; textui_cmd_destroy_menu(item); } void textui_cmd_toggle_ignore(void) { p_ptr->unignoring = !p_ptr->unignoring; p_ptr->notice |= PN_SQUELCH; do_cmd_redraw(); } /* Examine an object */ void textui_obj_examine(void) { char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; object_type *o_ptr; int item; /* Select item */ if (!get_item(&item, "Examine which item?", "You have nothing to examine.", CMD_NULL, (USE_EQUIP | USE_INVEN | USE_FLOOR | IS_HARMLESS))) return; /* Track object for object recall */ track_object(item); /* Display info */ o_ptr = object_from_item_idx(item); tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL | ODESC_CAPITAL); textui_textblock_show(tb, area, header); textblock_free(tb); } angband-3.5.1/src/win/0000755000175000017500000000000012456456607014025 5ustar chriscchriscangband-3.5.1/src/win/readdib.c0000644000175000017500000002076112456456607015571 0ustar chriscchrisc/* File: readdib.c */ /* * This package provides a routine to read a DIB file and set up the * device dependent version of the image. * * This file has been modified for use with "Angband 2.9.2" * * COPYRIGHT: * * (C) Copyright Microsoft Corp. 1993. All rights reserved. * * You have a royalty-free right to use, modify, reproduce and * distribute the Sample Files (and/or any modified version) in * any way you find useful, provided that you agree that * Microsoft has no warranty obligations or liability for any * Sample Application Files which are modified. */ #if defined(USE_WIN) || defined(WINDOWS) || defined(WIN32) #include #include "readdib.h" /* * Needed for lcc-win32 */ #ifndef SEEK_SET #define SEEK_SET 0 #endif /* * Number of bytes to be read during each read operation */ #define MAXREAD 32768 /* * Private routine to read more than 64K at a time * * Reads data in steps of 32k till all the data has been read. * * Returns number of bytes requested, or zero if something went wrong. */ static DWORD PASCAL lread(HFILE fh, VOID FAR *pv, DWORD ul) { DWORD ulT = ul; BYTE *hp = pv; while (ul > (DWORD)MAXREAD) { if (_lread(fh, (LPSTR)hp, (WORD)MAXREAD) != MAXREAD) return 0; ul -= MAXREAD; hp += MAXREAD; } if (_lread(fh, (LPSTR)hp, (WORD)ul) != (WORD)ul) return 0; return ulT; } /* * Given a BITMAPINFOHEADER, create a palette based on the color table. * * Returns the handle of a palette, or zero if something went wrong. */ static HPALETTE PASCAL NEAR MakeDIBPalette(LPBITMAPINFOHEADER lpInfo) { PLOGPALETTE npPal; RGBQUAD FAR *lpRGB; HPALETTE hLogPal; DWORD i; /* * since biClrUsed field was filled during the loading of the DIB, * we know it contains the number of colors in the color table. */ if (lpInfo->biClrUsed) { npPal = (PLOGPALETTE)LocalAlloc(LMEM_FIXED, sizeof(LOGPALETTE) + (WORD)lpInfo->biClrUsed * sizeof(PALETTEENTRY)); if (!npPal) return (FALSE); npPal->palVersion = 0x300; npPal->palNumEntries = (WORD)lpInfo->biClrUsed; /* get pointer to the color table */ lpRGB = (RGBQUAD FAR *)((LPSTR)lpInfo + lpInfo->biSize); /* copy colors from the color table to the LogPalette structure */ for (i = 0; i < lpInfo->biClrUsed; i++, lpRGB++) { npPal->palPalEntry[i].peRed = lpRGB->rgbRed; npPal->palPalEntry[i].peGreen = lpRGB->rgbGreen; npPal->palPalEntry[i].peBlue = lpRGB->rgbBlue; npPal->palPalEntry[i].peFlags = PC_NOCOLLAPSE; } hLogPal = CreatePalette((LPLOGPALETTE)npPal); LocalFree((HANDLE)npPal); return (hLogPal); } /* * 24-bit DIB with no color table. return default palette. Another * option would be to create a 256 color "rainbow" palette to provide * some good color choices. */ else { return (GetStockObject(DEFAULT_PALETTE)); } } /* * Given a DIB, create a bitmap and corresponding palette to be used for a * device-dependent representation of the image. * * Returns TRUE on success (phPal and phBitmap are filled with appropriate * handles. Caller is responsible for freeing objects) and FALSE on failure * (unable to create objects, both pointer are invalid). */ static BOOL NEAR PASCAL MakeBitmapAndPalette(HDC hDC, HANDLE hDIB, HPALETTE * phPal, HBITMAP * phBitmap) { LPBITMAPINFOHEADER lpInfo; BOOL result = FALSE; HBITMAP hBitmap; HPALETTE hPalette, hOldPal; LPSTR lpBits; lpInfo = (LPBITMAPINFOHEADER) GlobalLock(hDIB); if ((hPalette = MakeDIBPalette(lpInfo)) != 0) { /* Need to realize palette for converting DIB to bitmap. */ hOldPal = SelectPalette(hDC, hPalette, TRUE); RealizePalette(hDC); lpBits = ((LPSTR)lpInfo + (WORD)lpInfo->biSize + (WORD)lpInfo->biClrUsed * sizeof(RGBQUAD)); hBitmap = CreateDIBitmap(hDC, lpInfo, CBM_INIT, lpBits, (LPBITMAPINFO)lpInfo, DIB_RGB_COLORS); SelectPalette(hDC, hOldPal, TRUE); RealizePalette(hDC); if (!hBitmap) { DeleteObject(hPalette); } else { *phBitmap = hBitmap; *phPal = hPalette; result = TRUE; } } return (result); } /* * Reads a DIB from a file, obtains a handle to its BITMAPINFO struct, and * loads the DIB. Once the DIB is loaded, the function also creates a bitmap * and palette out of the DIB for a device-dependent form. * * Returns TRUE if the DIB is loaded and the bitmap/palette created, in which * case, the DIBINIT structure pointed to by pInfo is filled with the appropriate * handles, and FALSE if something went wrong. */ BOOL ReadDIB(HWND hWnd, LPSTR lpFileName, DIBINIT *pInfo) { HFILE fh; LPBITMAPINFOHEADER lpbi; OFSTRUCT of; BITMAPFILEHEADER bf; WORD nNumColors; BOOL result = FALSE; DWORD offBits; HDC hDC; BOOL bCoreHead = FALSE; /* Open the file and get a handle to it's BITMAPINFO */ fh = OpenFile(lpFileName, &of, OF_READ); if (fh == -1) return (FALSE); pInfo->hDIB = GlobalAlloc(GHND, (DWORD)(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD))); if (!pInfo->hDIB) return (FALSE); lpbi = (LPBITMAPINFOHEADER)GlobalLock(pInfo->hDIB); /* read the BITMAPFILEHEADER */ if (sizeof (bf) != _lread(fh, (LPSTR)&bf, sizeof(bf))) goto ErrExit; /* 'BM' */ if (bf.bfType != 0x4d42) goto ErrExit; if (sizeof(BITMAPCOREHEADER) != _lread(fh, (LPSTR)lpbi, sizeof(BITMAPCOREHEADER))) goto ErrExit; if (lpbi->biSize == sizeof(BITMAPCOREHEADER)) { lpbi->biSize = sizeof(BITMAPINFOHEADER); lpbi->biBitCount = ((LPBITMAPCOREHEADER)lpbi)->bcBitCount; lpbi->biPlanes = ((LPBITMAPCOREHEADER)lpbi)->bcPlanes; lpbi->biHeight = ((LPBITMAPCOREHEADER)lpbi)->bcHeight; lpbi->biWidth = ((LPBITMAPCOREHEADER)lpbi)->bcWidth; bCoreHead = TRUE; } else { /* get to the start of the header and read INFOHEADER */ _llseek(fh, sizeof(BITMAPFILEHEADER), SEEK_SET); if (sizeof(BITMAPINFOHEADER) != _lread(fh, (LPSTR)lpbi, sizeof(BITMAPINFOHEADER))) goto ErrExit; } if ((nNumColors = (WORD)lpbi->biClrUsed) == 0) { /* no color table for 24-bit, default size otherwise */ if (lpbi->biBitCount != 24) nNumColors = 1 << lpbi->biBitCount; } /* fill in some default values if they are zero */ if (lpbi->biClrUsed == 0) lpbi->biClrUsed = nNumColors; if (lpbi->biSizeImage == 0) { lpbi->biSizeImage = (((((lpbi->biWidth * (DWORD)lpbi->biBitCount) + 31) & ~31) >> 3) * lpbi->biHeight); } /* otherwise wouldn't work with 16 color bitmaps -- S.K. */ else if ((nNumColors == 16) && (lpbi->biSizeImage > bf.bfSize)) { lpbi->biSizeImage /= 2; } /* get a proper-sized buffer for header, color table and bits */ GlobalUnlock(pInfo->hDIB); pInfo->hDIB = GlobalReAlloc(pInfo->hDIB, lpbi->biSize + nNumColors * sizeof(RGBQUAD) + lpbi->biSizeImage, 0); /* can't resize buffer for loading */ if (!pInfo->hDIB) goto ErrExit2; lpbi = (LPBITMAPINFOHEADER)GlobalLock(pInfo->hDIB); /* read the color table */ if (!bCoreHead) { _lread(fh, (LPSTR)(lpbi) + lpbi->biSize, nNumColors * sizeof(RGBQUAD)); } else { signed int i; RGBQUAD FAR *pQuad; RGBTRIPLE FAR *pTriple; _lread(fh, (LPSTR)(lpbi) + lpbi->biSize, nNumColors * sizeof(RGBTRIPLE)); pQuad = (RGBQUAD FAR *)((LPSTR)lpbi + lpbi->biSize); pTriple = (RGBTRIPLE FAR *) pQuad; for (i = nNumColors - 1; i >= 0; i--) { pQuad[i].rgbRed = pTriple[i].rgbtRed; pQuad[i].rgbBlue = pTriple[i].rgbtBlue; pQuad[i].rgbGreen = pTriple[i].rgbtGreen; pQuad[i].rgbReserved = 0; } } pInfo->ImageWidth = lpbi->biWidth; pInfo->ImageHeight = lpbi->biHeight; /* offset to the bits from start of DIB header */ offBits = lpbi->biSize + nNumColors * sizeof(RGBQUAD); if (bf.bfOffBits != 0L) { _llseek(fh,bf.bfOffBits,SEEK_SET); } /* Use local version of '_lread()' above */ if (lpbi->biSizeImage == lread(fh, (LPSTR)lpbi + offBits, lpbi->biSizeImage)) { GlobalUnlock(pInfo->hDIB); hDC = GetDC(hWnd); if (!MakeBitmapAndPalette(hDC, pInfo->hDIB, &(pInfo->hPalette), &(pInfo->hBitmap))) { ReleaseDC(hWnd,hDC); goto ErrExit2; } else { ReleaseDC(hWnd,hDC); result = TRUE; } } else { ErrExit: GlobalUnlock(pInfo->hDIB); ErrExit2: GlobalFree(pInfo->hDIB); } _lclose(fh); return (result); } /* Free a DIB */ void FreeDIB(DIBINIT *dib) { /* Free the bitmap stuff */ if (dib->hPalette) DeleteObject(dib->hPalette); if (dib->hBitmap) DeleteObject(dib->hBitmap); if (dib->hDIB) GlobalFree(dib->hDIB); dib->hPalette = NULL; dib->hBitmap = NULL; dib->hDIB = NULL; dib->ImageWidth = 0; dib->ImageHeight = 0; } #endif /* USE_WIN || WINDOWS || WIN32 */ angband-3.5.1/src/win/win-term.h0000644000175000017500000000371412456456607015745 0ustar chriscchrisc/* * File: win-term.h * Purpose: Windows terminal structure. * * Copyright (c) 1997 Ben Harrison, Skirmantas Kligys, Robert Ruehlmann, * and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ /* * Initial framework (and most code) by Ben Harrison (benh@phial.com). * * Original code by Skirmantas Kligys (kligys@scf.usc.edu). * * Additional code by Ross E Becker (beckerr@cis.ohio-state.edu), * and Chris R. Martin (crm7479@tam2000.tamu.edu). * * Additional code by Robert Ruehlmann . */ /* * Forward declare */ typedef struct _term_data term_data; /* * Extra "term" data * * Note the use of "font_want" for the names of the font file requested by * the user, and the use of "font_file" for the currently active font file. * * The "font_file" is uppercased, and takes the form "8X13.FON", while * "font_want" can be in almost any form as long as it could be construed * as attempting to represent the name of a font. */ struct _term_data { term t; const char *s; HWND w; DWORD dwStyle; DWORD dwExStyle; uint keys; byte rows; byte cols; uint pos_x; uint pos_y; uint size_wid; uint size_hgt; uint size_ow1; uint size_oh1; uint size_ow2; uint size_oh2; bool size_hack; bool xtra_hack; bool visible; bool maximized; bool bizarre; char *font_want; char *font_file; HFONT font_id; uint font_wid; uint font_hgt; uint tile_wid; uint tile_hgt; uint map_tile_wid; uint map_tile_hgt; bool map_active; }; /* * Maximum number of windows XXX XXX XXX */ #define MAX_TERM_DATA 8 angband-3.5.1/src/win/dll/0000755000175000017500000000000012456456607014600 5ustar chriscchriscangband-3.5.1/src/win/scrnshot.c0000644000175000017500000001105712456456607016040 0ustar chriscchrisc/* * File: scrnshot.c * Purpose: Save a graphical screen shot on Windows systems. * * Copyright (c) 2011 Brett Reid * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include #include "png.h" /* * Extract the "WIN32" flag from the compiler */ #if defined(__WIN32__) || defined(__WINNT__) || defined(__NT__) # ifndef WIN32 # define WIN32 # endif #endif /* * Save a window to a PNG file. * * Returns TRUE if the PNG file is written, and FALSE if something went wrong. */ BOOL SaveWindow_PNG(HWND hWnd, LPSTR lpFileName) { png_structp png_ptr; png_infop info_ptr; png_bytep *row_pointers = NULL; BOOL noerror = TRUE; png_byte color_type; png_byte bit_depth; png_byte channels; int x, y; int width, height; char *c; FILE *fp; RECT rect; /* make sure that we have a window pointer */ if (hWnd == NULL) { return (FALSE); } c = strrchr(lpFileName, '.'); if (!c) { return (FALSE); } c+=1; if ((strncmp(c, "png", 3) != 0) && (strncmp(c, "PNG", 3) != 0)) { return (FALSE); } if (!GetClientRect(hWnd, &rect)) { /* ??? */ } width = rect.right; height = rect.bottom; color_type = PNG_COLOR_TYPE_RGB; bit_depth = 8; channels = 3; /* open the file and test it for being a png */ fp = fopen(lpFileName, "wb"); if (!fp) { return (FALSE); } /* Create the png structure */ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if(!png_ptr) { //plog_fmt("Unable to initialize PNG library"); fclose(fp); return (FALSE); } /* create the info structure */ if (noerror) { info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_write_struct(&png_ptr, (png_infopp)NULL); //plog_fmt("Failed to create PNG info structure."); noerror = FALSE; } } if (noerror) { /* setup error handling for init */ png_init_io(png_ptr, fp); png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); if (bit_depth < 8) { png_set_packing(png_ptr); } png_write_info(png_ptr, info_ptr); } /* copy the allocate the memory libpng can access */ if (noerror) { /* setup error handling for read */ row_pointers = (png_bytep*) malloc(sizeof(png_bytep)*height); if (!row_pointers) { //plog_fmt("Failed to alloc temporary memory for PNG data."); noerror = FALSE; } if (noerror) { for (y = 0; y < height; ++y) { row_pointers[y] = (png_bytep) malloc(sizeof(png_bytep)*width*channels); if (!row_pointers[y]) { //plog_fmt("Failed to alloc temporary memory for PNG data."); noerror = FALSE; break; } } } } /* copy the data to it */ if (noerror) { COLORREF bgr; byte b[3], *data; HDC hDC, hdcWnd; HBITMAP hbmScreen, hbmOld; hdcWnd = GetDC(hWnd); if (!hdcWnd) { } hbmScreen = CreateCompatibleBitmap(hdcWnd, width, height); if (!hbmScreen) { } hDC = CreateCompatibleDC(hdcWnd); if (!hDC) { } hbmOld = SelectObject(hDC, hbmScreen); BitBlt(hDC, 0, 0, width, height, hdcWnd, 0, 0, SRCCOPY); ReleaseDC(hWnd,hdcWnd); /* copy just the color data */ for (y = 0; y < height; ++y) { data = row_pointers[y]; for (x = 0; x < width; ++x) { bgr = GetPixel(hDC, x,y); b[2] = ((bgr&0x000000FF)); b[1] = ((bgr&0x0000FF00)>>8); b[0] = ((bgr&0x00FF0000)>>16); *(data++) = b[2]; *(data++) = b[1]; *(data++) = b[0]; } } SelectObject(hDC, hbmOld); DeleteObject(hbmScreen); DeleteDC(hDC); } /* write the file */ if (noerror) { //png_set_bgr(png_ptr); png_write_image(png_ptr, row_pointers); png_write_end(png_ptr, NULL); } /* release the image memory */ for (y = 0; y < height; ++y) { free(row_pointers[y]); } free(row_pointers); /* we are done with the file pointer, so * release all the the PNG Structures */ if (info_ptr) { png_destroy_write_struct(&png_ptr, &info_ptr); info_ptr = NULL; png_ptr = NULL; } else if (png_ptr) { png_destroy_write_struct(&png_ptr, (png_infopp)NULL); png_ptr = NULL; } /* we are done with the file pointer, so close it */ if (fp) { fclose(fp); fp = NULL; } if (!noerror) { return (FALSE); } return (TRUE); } angband-3.5.1/src/win/win-layout.c0000644000175000017500000002640612456456607016311 0ustar chriscchrisc/* * File: win-layout.c * Purpose: Shape an initial or default display on windows systems. * * Copyright (c) 2012 Brett Reid * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include #include //#include "angband.h" #include "z-virt.h" #include "z-term.h" typedef unsigned int uint; #include "win-term.h" extern int arg_graphics; extern int arg_graphics_nice; /* * Default window layout function * * Just a big list of what to do for a specific screen resolution. * * Note: graphics modes are hardcoded, using info from * angband/lib/xtra/graf/graphics.txt at the time of this writing * * Return values: 0 - Success * -1 - Invalid argument * -3 - Out of memory */ int default_layout_win(term_data *data, int maxterms) { int sx,sy; int cap, lcap, bar, borderx, bordery, bottom; int mult_wid, mult_hgt; int fx,fy,tx,ty, fx2,fy2; int i,mode; RECT r; char *main_font; char *sub_font; /* make sure the numbers used in this fuction are valid */ if (maxterms < 5) { return -1; } /* get the various sizes that we need from windows */ sx = GetSystemMetrics(SM_CXSCREEN); sy = GetSystemMetrics(SM_CYSCREEN); cap = GetSystemMetrics(SM_CYSMCAPTION); lcap = GetSystemMetrics(SM_CYCAPTION); bar = GetSystemMetrics(SM_CYMENU); borderx = GetSystemMetrics(SM_CXSIZEFRAME); bordery = GetSystemMetrics(SM_CYSIZEFRAME); (void) SystemParametersInfo(SPI_GETWORKAREA , 0, &r, 0); bottom = sy - r.bottom; if ((sx == 1024) && (sy == 768)) { arg_graphics = 3; arg_graphics_nice = 0; tile_width = 4; tile_height = 2; string_free(data[0].font_want); data[0].font_want = string_make("8x12x.fon"); data[0].font_wid = 8; data[0].font_hgt = 12; data[0].tile_wid = 8; data[0].tile_hgt = 16; data[0].pos_x = -1; data[0].pos_y = -1; data[0].cols = 103; data[0].rows = 35; data[0].visible = 1; data[0].maximized = 0; /* messages window */ string_free(data[1].font_want); data[1].font_want = string_make("6x10x.fon"); data[1].font_wid = 6; data[1].font_hgt = 10; data[1].tile_wid = 6; data[1].tile_hgt = 10; data[1].pos_x = 0; data[1].pos_y = 596; data[1].cols = 80; data[1].rows = 10; data[1].visible = 1; data[1].maximized = 0; /* inventory window */ string_free(data[2].font_want); data[2].font_want = string_make("6x10x.fon"); data[2].font_wid = 6; data[2].font_hgt = 10; data[2].tile_wid = 6; data[2].tile_hgt = 10; data[2].pos_x = 832; data[2].pos_y = -1; data[2].cols = 31; data[2].rows = 24; data[2].visible = 1; data[2].maximized = 0; /* monster list window */ string_free(data[3].font_want); data[3].font_want = string_make("6x10x.fon"); data[3].font_wid = 6; data[3].font_hgt = 10; data[3].tile_wid = 6; data[3].tile_hgt = 10; data[3].pos_x = 832; data[3].pos_y = 266; data[3].cols = 31; data[3].rows = 30; data[3].visible = 1; data[3].maximized = 0; /* object list window */ string_free(data[4].font_want); data[4].font_want = string_make("6x10x.fon"); data[4].font_wid = 6; data[4].font_hgt = 10; data[4].tile_wid = 6; data[4].tile_hgt = 10; data[4].pos_x = 486; data[4].pos_y = 596; data[4].cols = 56; data[4].rows = 10; data[4].visible = 1; data[4].maximized = 0; /* recall window */ string_free(data[5].font_want); data[5].font_want = string_make("6x10x.fon"); data[5].font_wid = 6; data[5].font_hgt = 10; data[5].tile_wid = 6; data[5].tile_hgt = 10; data[5].pos_x = 832; data[5].pos_y = 596; data[5].cols = 31; data[5].rows = 10; data[5].visible = 1; data[5].maximized = 0; /* the rest of the terms were set by the load pref function */ return 0; } if ((sx == 1280) && (sy == 1024)) { arg_graphics = 5; arg_graphics_nice = 0; tile_width = 4; tile_height = 2; string_free(data[0].font_want); data[0].font_want = string_make("8x12x.fon"); data[0].font_wid = 8; data[0].font_hgt = 12; data[0].tile_wid = 8; data[0].tile_hgt = 16; data[0].pos_x = -1; data[0].pos_y = -1; data[0].cols = 134; data[0].rows = 49; data[0].visible = 1; data[0].maximized = 0; /* messages window */ string_free(data[1].font_want); data[1].font_want = string_make("6x10x.fon"); data[1].font_wid = 6; data[1].font_hgt = 10; data[1].tile_wid = 6; data[1].tile_hgt = 10; data[1].pos_x = 0; data[1].pos_y = 824; data[1].cols = 80; data[1].rows = 11; data[1].visible = 1; data[1].maximized = 0; /* inventory window */ string_free(data[2].font_want); data[2].font_want = string_make("6x10x.fon"); data[2].font_wid = 6; data[2].font_hgt = 10; data[2].tile_wid = 6; data[2].tile_hgt = 10; data[2].pos_x = 1087; data[2].pos_y = 0; data[2].cols = 31; data[2].rows = 24; data[2].visible = 1; data[2].maximized = 0; /* monster list window */ string_free(data[3].font_want); data[3].font_want = string_make("6x10x.fon"); data[3].font_wid = 6; data[3].font_hgt = 10; data[3].tile_wid = 6; data[3].tile_hgt = 10; data[3].pos_x = 1087; data[3].pos_y = 274; data[3].cols = 31; data[3].rows = 52; data[3].visible = 1; data[3].maximized = 0; /* object list window */ string_free(data[4].font_want); data[4].font_want = string_make("6x10x.fon"); data[4].font_wid = 6; data[4].font_hgt = 10; data[4].tile_wid = 6; data[4].tile_hgt = 10; data[4].pos_x = 493; data[4].pos_y = 824; data[4].cols = 70; data[4].rows = 11; data[4].visible = 1; data[4].maximized = 0; /* recall window */ string_free(data[5].font_want); data[5].font_want = string_make("6x10x.fon"); data[5].font_wid = 6; data[5].font_hgt = 10; data[5].tile_wid = 6; data[5].tile_hgt = 10; data[5].pos_x = 923; data[5].pos_y = 824; data[5].cols = 57; data[5].rows = 11; data[5].visible = 1; data[5].maximized = 0; /* the rest of the terms were set by the load pref function */ return 0; } /* size the main and subwindows procedurally */ /* only consider the working area */ sy = sy - bottom; /* get the basic info from the height of the screen */ if (sy <= 250) { main_font = "5x8x.fon"; fx = 5; fy = 8; tx = 4; ty = 8; sub_font = NULL;//"5x8x.fon"; fx2 = 4; fy2 = 8; mode = 0; mult_wid = 1; mult_hgt = 1; } else if (sy <= 600) { main_font = "8x12x.fon"; fx = 8; fy = 12; tx = 8; ty = 16; sub_font = NULL;//"6x10x.fon"; fx2 = 6; fy2 = 10; mode = 4; mult_wid = 1; mult_hgt = 1; } else if (sy <= 800) { main_font = "8x12x.fon"; fx = 8; fy = 12; tx = 8; ty = 16; sub_font = "6x10x.fon"; fx2 = 6; fy2 = 10; mode = 3; mult_wid = 4; mult_hgt = 2; } else if (sy <= 1024) { main_font = "8x12x.fon"; fx = 8; fy = 12; tx = 8; ty = 16; sub_font = "6x10x.fon"; fx2 = 6; fy2 = 10; mode = 5; mult_wid = 6; mult_hgt = 3; } else if (sy <= 1600) { main_font = "16x24x.fon"; fx = 16; fy = 24; tx = 16; ty = 24; sub_font = "8x12x.fon"; fx2 = 8; fy2 = 12; mode = 5; mult_wid = 3; mult_hgt = 2; } else { main_font = "16x24x.fon"; fx = 16; fy = 24; tx = 16; ty = 32; sub_font = "12x18x.fon"; fx2 = 12; fy2 = 18; mode = 5; mult_wid = 4; mult_hgt = 2; } /* setup main window */ arg_graphics = mode; arg_graphics_nice = 0; tile_width = mult_wid; tile_height = mult_hgt; string_free(data[0].font_want); data[0].font_want = string_make(main_font); data[0].font_wid = fx; data[0].font_hgt = fy; data[0].tile_wid = tx; data[0].tile_hgt = ty; data[0].pos_x = 0; data[0].pos_y = 0; data[0].cols = (sx - 2*borderx)/tx; data[0].rows = (sy - 2*bordery - cap - bar)/ty; data[0].visible = 1; data[0].maximized = 0; /* make sure there is a border around the map area */ if (data[0].cols % mult_wid == 0) data[0].cols -= 1; if (data[0].rows % mult_hgt == 0) data[0].rows -= 1; if (sub_font) { data[0].cols = 1 + data[0].cols * 8 / 10; data[0].rows = 1 + data[0].rows * 8 / 10; /* make sure there is a border around the map area */ if (data[0].cols % mult_wid == 0) data[0].cols += 1; if (data[0].rows % mult_hgt == 0) data[0].rows += 1; } else { return 0; } /* setup sub windows */ for (i = 1; i < maxterms; i++) { string_free(data[i].font_want); data[i].font_want = string_make(sub_font); data[i].font_wid = fx2; data[i].font_hgt = fy2; data[i].tile_wid = fx2; data[i].tile_hgt = fy2; data[i].pos_x = i * tx; data[i].pos_y = i * ty; data[i].cols = (2*((sx - 2*borderx)/tx) / 10)*tx/fx2; data[i].rows = (2*((sy - 2*bordery - cap - bar)/ty)/10)*ty/fy2; data[i].visible = 0; data[i].maximized = 0; } /* position the specific sub windows */ data[1].pos_x = 0; data[1].pos_y = (lcap + bar + (data[0].rows*ty) + 2*bordery)-cap; data[1].rows = (sy - data[1].pos_y - 2*cap)/fy2; data[2].pos_x = (2*borderx + (data[0].cols*tx)); data[2].pos_y = 0; data[2].cols = (sx - data[2].pos_x)/fx2; if (data[0].cols * tx > 160*fx2) { data[1].cols = 80; data[4].cols = 60; data[5].visible = 1; } else if (data[0].cols * tx > 120*fx2) { data[1].cols = 70; data[4].cols = ((data[0].cols * tx) - (data[1].cols * fx2))/fx2; data[5].visible = 1; } else { data[1].cols = (data[0].cols * tx) * 6 / 10 / fx2; data[4].cols = (sx - (data[1].cols * fx2))/fx2; } data[4].pos_x = -1 + borderx + (data[1].cols * fx2); data[4].pos_y = data[1].pos_y; data[4].rows = data[1].rows; if (data[5].visible) { data[5].pos_x = -1 + 2*borderx + ((data[1].cols + data[4].cols) * fx2); data[5].pos_y = data[1].pos_y; data[5].rows = data[1].rows; data[5].cols = (sx - data[5].pos_x + 1)/fx2; } data[1].visible = 1; data[4].visible = 1; if (data[5].visible) { i = lcap+(data[0].rows * ty); if ((data[0].rows*ty) > (40*fy2)) { data[2].rows = 24; data[3].rows = (i - (data[2].rows * fy2)-2*cap-2*bordery)/fy2; } else if ((data[0].rows*ty) > (24*fy2)) { data[2].rows = 10; data[3].rows = (i - (data[2].rows * fy2)-2*cap-2*bordery)/fy2; } else { data[5].visible = 0; data[2].rows = (sy/2)/fy2; if (data[2].rows > 24) data[2].rows = 24; /* see if the inventory display will be useless */ if (data[2].rows < 13) data[2].rows = 3; data[3].rows = (sy - (data[2].rows * fy2) + cap-2*bordery)/fy2; /* expand the object list to the main window and take over the corner */ } } else { /* the object list window goes all the way across */ i = lcap+(data[0].rows * ty); if ((data[0].rows*ty) > (40*fy2)) { data[2].rows = 24; data[3].rows = (i - (data[2].rows * fy2)-2*cap-2*bordery)/fy2; } else if ((data[0].rows*ty) > (24*fy2)) { data[2].rows = 10; data[3].rows = (i - (data[2].rows * fy2)-2*cap-2*bordery)/fy2; } else { /* shrink the object list to the main window and take over the corner */ data[2].rows = 10; data[3].rows = (i - (data[2].rows * fy2)-2*cap-2*bordery)/fy2; } } data[3].pos_x = data[2].pos_x; data[3].pos_y = -1 + 2*bordery + (data[2].rows * fy2) + cap; data[3].cols = data[2].cols; data[2].visible = 1; data[3].visible = 1; return 0; } angband-3.5.1/src/win/win-menu.h0000644000175000017500000000723512456456607015744 0ustar chriscchrisc/* * File: win-menu.h * Purpose: Menu constants -- see "ANGBAND.RC" * * Copyright (c) 1997 Ben Harrison, Skirmantas Kligys, Robert Ruehlmann, * and others * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #define IDM_FILE_NEW 100 #define IDM_FILE_OPEN 101 #define IDM_FILE_SAVE 110 #define IDM_FILE_EXIT 130 #define IDM_WINDOW_VIS_0 200 #define IDM_WINDOW_VIS_1 201 #define IDM_WINDOW_VIS_2 202 #define IDM_WINDOW_VIS_3 203 #define IDM_WINDOW_VIS_4 204 #define IDM_WINDOW_VIS_5 205 #define IDM_WINDOW_VIS_6 206 #define IDM_WINDOW_VIS_7 207 #define IDM_WINDOW_FONT_0 210 #define IDM_WINDOW_FONT_1 211 #define IDM_WINDOW_FONT_2 212 #define IDM_WINDOW_FONT_3 213 #define IDM_WINDOW_FONT_4 214 #define IDM_WINDOW_FONT_5 215 #define IDM_WINDOW_FONT_6 216 #define IDM_WINDOW_FONT_7 217 #define IDM_WINDOW_BIZ_0 230 #define IDM_WINDOW_BIZ_1 231 #define IDM_WINDOW_BIZ_2 232 #define IDM_WINDOW_BIZ_3 233 #define IDM_WINDOW_BIZ_4 234 #define IDM_WINDOW_BIZ_5 235 #define IDM_WINDOW_BIZ_6 236 #define IDM_WINDOW_BIZ_7 237 #define IDM_WINDOW_I_WID_0 240 #define IDM_WINDOW_I_WID_1 241 #define IDM_WINDOW_I_WID_2 242 #define IDM_WINDOW_I_WID_3 243 #define IDM_WINDOW_I_WID_4 244 #define IDM_WINDOW_I_WID_5 245 #define IDM_WINDOW_I_WID_6 246 #define IDM_WINDOW_I_WID_7 247 #define IDM_WINDOW_D_WID_0 250 #define IDM_WINDOW_D_WID_1 251 #define IDM_WINDOW_D_WID_2 252 #define IDM_WINDOW_D_WID_3 253 #define IDM_WINDOW_D_WID_4 254 #define IDM_WINDOW_D_WID_5 255 #define IDM_WINDOW_D_WID_6 256 #define IDM_WINDOW_D_WID_7 257 #define IDM_WINDOW_I_HGT_0 260 #define IDM_WINDOW_I_HGT_1 261 #define IDM_WINDOW_I_HGT_2 262 #define IDM_WINDOW_I_HGT_3 263 #define IDM_WINDOW_I_HGT_4 264 #define IDM_WINDOW_I_HGT_5 265 #define IDM_WINDOW_I_HGT_6 266 #define IDM_WINDOW_I_HGT_7 267 #define IDM_WINDOW_D_HGT_0 270 #define IDM_WINDOW_D_HGT_1 271 #define IDM_WINDOW_D_HGT_2 272 #define IDM_WINDOW_D_HGT_3 273 #define IDM_WINDOW_D_HGT_4 274 #define IDM_WINDOW_D_HGT_5 275 #define IDM_WINDOW_D_HGT_6 276 #define IDM_WINDOW_D_HGT_7 277 #define IDM_OPTIONS_GRAPHICS_NONE 400 #define IDM_OPTIONS_GRAPHICS_NICE 445 #define IDM_OPTIONS_LOW_PRIORITY 420 #define IDM_OPTIONS_SAVER 430 #define IDM_OPTIONS_MAP 440 #define IDM_OPTIONS_SCREENSHOT 441 #define IDM_OPTIONS_TILE_1x1 447 #define IDM_OPTIONS_TILE_2x1 448 #define IDM_OPTIONS_TILE_4x2 449 #define IDM_OPTIONS_TILE_2x2 450 #define IDM_OPTIONS_TILE_3x1 451 #define IDM_OPTIONS_TILE_3x3 452 #define IDM_OPTIONS_TILE_4x4 453 #define IDM_OPTIONS_TILE_6x3 454 #define IDM_OPTIONS_TILE_6x6 455 #define IDM_OPTIONS_TILE_8x4 456 #define IDM_OPTIONS_TILE_8x8 457 #define IDM_OPTIONS_TILE_16x8 458 #define IDM_OPTIONS_TILE_16x16 459 #define IDM_TILE_FONT 190 #define IDM_TILE_08X08 191 #define IDM_TILE_16X16 192 #define IDM_TILE_32X32 193 #define IDM_TILE_08X16 194 #define IDM_TILE_10X20 195 #define IDM_TILE_16X32 196 #define IDM_TILE_08X13 197 #define IDM_TILE_10X17 198 #define IDM_TILE_12X13 199 #define IDM_TILE_12X20 188 #define IDM_TILE_16X25 189 #define IDM_WINDOW_OPT 180 #define IDM_WINDOW_RESET 181 #define IDM_HELP_GENERAL 901 #define IDM_HELP_SPOILERS 902 angband-3.5.1/src/win/include/0000755000175000017500000000000012456456607015450 5ustar chriscchriscangband-3.5.1/src/win/include/pngconf.h0000644000175000017500000013050612456456607017260 0ustar chriscchrisc /* pngconf.h - machine configurable file for libpng * * libpng version 1.2.37 - June 4, 2009 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2009 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) */ /* Any machine specific code is near the front of this file, so if you * are configuring libpng for a machine, you may want to read the section * starting here down to where it starts to typedef png_color, png_text, * and png_info. */ #ifndef PNGCONF_H #define PNGCONF_H #define PNG_1_2_X /* * PNG_USER_CONFIG has to be defined on the compiler command line. This * includes the resource compiler for Windows DLL configurations. */ #ifdef PNG_USER_CONFIG # ifndef PNG_USER_PRIVATEBUILD # define PNG_USER_PRIVATEBUILD # endif #include "pngusr.h" #endif /* PNG_CONFIGURE_LIBPNG is set by the "configure" script. */ #ifdef PNG_CONFIGURE_LIBPNG #ifdef HAVE_CONFIG_H #include "config.h" #endif #endif /* * Added at libpng-1.2.8 * * If you create a private DLL you need to define in "pngusr.h" the followings: * #define PNG_USER_PRIVATEBUILD * e.g. #define PNG_USER_PRIVATEBUILD "Build by MyCompany for xyz reasons." * #define PNG_USER_DLLFNAME_POSTFIX * e.g. // private DLL "libpng13gx.dll" * #define PNG_USER_DLLFNAME_POSTFIX "gx" * * The following macros are also at your disposal if you want to complete the * DLL VERSIONINFO structure. * - PNG_USER_VERSIONINFO_COMMENTS * - PNG_USER_VERSIONINFO_COMPANYNAME * - PNG_USER_VERSIONINFO_LEGALTRADEMARKS */ #ifdef __STDC__ #ifdef SPECIALBUILD # pragma message("PNG_LIBPNG_SPECIALBUILD (and deprecated SPECIALBUILD)\ are now LIBPNG reserved macros. Use PNG_USER_PRIVATEBUILD instead.") #endif #ifdef PRIVATEBUILD # pragma message("PRIVATEBUILD is deprecated.\ Use PNG_USER_PRIVATEBUILD instead.") # define PNG_USER_PRIVATEBUILD PRIVATEBUILD #endif #endif /* __STDC__ */ #ifndef PNG_VERSION_INFO_ONLY /* End of material added to libpng-1.2.8 */ /* Added at libpng-1.2.19, removed at libpng-1.2.20 because it caused trouble Restored at libpng-1.2.21 */ #if !defined(PNG_NO_WARN_UNINITIALIZED_ROW) && \ !defined(PNG_WARN_UNINITIALIZED_ROW) # define PNG_WARN_UNINITIALIZED_ROW 1 #endif /* End of material added at libpng-1.2.19/1.2.21 */ /* This is the size of the compression buffer, and thus the size of * an IDAT chunk. Make this whatever size you feel is best for your * machine. One of these will be allocated per png_struct. When this * is full, it writes the data to the disk, and does some other * calculations. Making this an extremely small size will slow * the library down, but you may want to experiment to determine * where it becomes significant, if you are concerned with memory * usage. Note that zlib allocates at least 32Kb also. For readers, * this describes the size of the buffer available to read the data in. * Unless this gets smaller than the size of a row (compressed), * it should not make much difference how big this is. */ #ifndef PNG_ZBUF_SIZE # define PNG_ZBUF_SIZE 8192 #endif /* Enable if you want a write-only libpng */ #ifndef PNG_NO_READ_SUPPORTED # define PNG_READ_SUPPORTED #endif /* Enable if you want a read-only libpng */ #ifndef PNG_NO_WRITE_SUPPORTED # define PNG_WRITE_SUPPORTED #endif /* Enabled by default in 1.2.0. You can disable this if you don't need to support PNGs that are embedded in MNG datastreams */ #if !defined(PNG_1_0_X) && !defined(PNG_NO_MNG_FEATURES) # ifndef PNG_MNG_FEATURES_SUPPORTED # define PNG_MNG_FEATURES_SUPPORTED # endif #endif #ifndef PNG_NO_FLOATING_POINT_SUPPORTED # ifndef PNG_FLOATING_POINT_SUPPORTED # define PNG_FLOATING_POINT_SUPPORTED # endif #endif /* If you are running on a machine where you cannot allocate more * than 64K of memory at once, uncomment this. While libpng will not * normally need that much memory in a chunk (unless you load up a very * large file), zlib needs to know how big of a chunk it can use, and * libpng thus makes sure to check any memory allocation to verify it * will fit into memory. #define PNG_MAX_MALLOC_64K */ #if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) # define PNG_MAX_MALLOC_64K #endif /* Special munging to support doing things the 'cygwin' way: * 'Normal' png-on-win32 defines/defaults: * PNG_BUILD_DLL -- building dll * PNG_USE_DLL -- building an application, linking to dll * (no define) -- building static library, or building an * application and linking to the static lib * 'Cygwin' defines/defaults: * PNG_BUILD_DLL -- (ignored) building the dll * (no define) -- (ignored) building an application, linking to the dll * PNG_STATIC -- (ignored) building the static lib, or building an * application that links to the static lib. * ALL_STATIC -- (ignored) building various static libs, or building an * application that links to the static libs. * Thus, * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and * this bit of #ifdefs will define the 'correct' config variables based on * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but * unnecessary. * * Also, the precedence order is: * ALL_STATIC (since we can't #undef something outside our namespace) * PNG_BUILD_DLL * PNG_STATIC * (nothing) == PNG_USE_DLL * * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent * of auto-import in binutils, we no longer need to worry about * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore, * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes * to __declspec() stuff. However, we DO need to worry about * PNG_BUILD_DLL and PNG_STATIC because those change some defaults * such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed. */ #if defined(__CYGWIN__) # if defined(ALL_STATIC) # if defined(PNG_BUILD_DLL) # undef PNG_BUILD_DLL # endif # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if defined(PNG_DLL) # undef PNG_DLL # endif # if !defined(PNG_STATIC) # define PNG_STATIC # endif # else # if defined (PNG_BUILD_DLL) # if defined(PNG_STATIC) # undef PNG_STATIC # endif # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if !defined(PNG_DLL) # define PNG_DLL # endif # else # if defined(PNG_STATIC) # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if defined(PNG_DLL) # undef PNG_DLL # endif # else # if !defined(PNG_USE_DLL) # define PNG_USE_DLL # endif # if !defined(PNG_DLL) # define PNG_DLL # endif # endif # endif # endif #endif /* This protects us against compilers that run on a windowing system * and thus don't have or would rather us not use the stdio types: * stdin, stdout, and stderr. The only one currently used is stderr * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will * prevent these from being compiled and used. #defining PNG_NO_STDIO * will also prevent these, plus will prevent the entire set of stdio * macros and functions (FILE *, printf, etc.) from being compiled and used, * unless (PNG_DEBUG > 0) has been #defined. * * #define PNG_NO_CONSOLE_IO * #define PNG_NO_STDIO */ #if defined(_WIN32_WCE) # include /* Console I/O functions are not supported on WindowsCE */ # define PNG_NO_CONSOLE_IO /* abort() may not be supported on some/all Windows CE platforms */ # define PNG_ABORT() exit(-1) # ifdef PNG_DEBUG # undef PNG_DEBUG # endif #endif #ifdef PNG_BUILD_DLL # ifndef PNG_CONSOLE_IO_SUPPORTED # ifndef PNG_NO_CONSOLE_IO # define PNG_NO_CONSOLE_IO # endif # endif #endif # ifdef PNG_NO_STDIO # ifndef PNG_NO_CONSOLE_IO # define PNG_NO_CONSOLE_IO # endif # ifdef PNG_DEBUG # if (PNG_DEBUG > 0) # include # endif # endif # else # if !defined(_WIN32_WCE) /* "stdio.h" functions are not supported on WindowsCE */ # include # endif # endif /* This macro protects us against machines that don't have function * prototypes (ie K&R style headers). If your compiler does not handle * function prototypes, define this macro and use the included ansi2knr. * I've always been able to use _NO_PROTO as the indicator, but you may * need to drag the empty declaration out in front of here, or change the * ifdef to suit your own needs. */ #ifndef PNGARG #ifdef OF /* zlib prototype munger */ # define PNGARG(arglist) OF(arglist) #else #ifdef _NO_PROTO # define PNGARG(arglist) () # ifndef PNG_TYPECAST_NULL # define PNG_TYPECAST_NULL # endif #else # define PNGARG(arglist) arglist #endif /* _NO_PROTO */ #endif /* OF */ #endif /* PNGARG */ /* Try to determine if we are compiling on a Mac. Note that testing for * just __MWERKS__ is not good enough, because the Codewarrior is now used * on non-Mac platforms. */ #ifndef MACOS # if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) # define MACOS # endif #endif /* enough people need this for various reasons to include it here */ #if !defined(MACOS) && !defined(RISCOS) && !defined(_WIN32_WCE) # include #endif #if !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED) # define PNG_SETJMP_SUPPORTED #endif #ifdef PNG_SETJMP_SUPPORTED /* This is an attempt to force a single setjmp behaviour on Linux. If * the X config stuff didn't define _BSD_SOURCE we wouldn't need this. * * You can bypass this test if you know that your application uses exactly * the same setjmp.h that was included when libpng was built. Only define * PNG_SKIP_SETJMP_CHECK while building your application, prior to the * application's '#include "png.h"'. Don't define PNG_SKIP_SETJMP_CHECK * while building a separate libpng library for general use. */ # ifndef PNG_SKIP_SETJMP_CHECK # ifdef __linux__ # ifdef _BSD_SOURCE # define PNG_SAVE_BSD_SOURCE # undef _BSD_SOURCE # endif # ifdef _SETJMP_H /* If you encounter a compiler error here, see the explanation * near the end of INSTALL. */ __pngconf.h__ in libpng already includes setjmp.h; __dont__ include it again.; # endif # endif /* __linux__ */ # endif /* PNG_SKIP_SETJMP_CHECK */ /* include setjmp.h for error handling */ # include # ifdef __linux__ # ifdef PNG_SAVE_BSD_SOURCE # ifndef _BSD_SOURCE # define _BSD_SOURCE # endif # undef PNG_SAVE_BSD_SOURCE # endif # endif /* __linux__ */ #endif /* PNG_SETJMP_SUPPORTED */ #ifdef BSD # include #else # include #endif /* Other defines for things like memory and the like can go here. */ #ifdef PNG_INTERNAL #include /* The functions exported by PNG_EXTERN are PNG_INTERNAL functions, which * aren't usually used outside the library (as far as I know), so it is * debatable if they should be exported at all. In the future, when it is * possible to have run-time registry of chunk-handling functions, some of * these will be made available again. #define PNG_EXTERN extern */ #define PNG_EXTERN /* Other defines specific to compilers can go here. Try to keep * them inside an appropriate ifdef/endif pair for portability. */ #if defined(PNG_FLOATING_POINT_SUPPORTED) # if defined(MACOS) /* We need to check that hasn't already been included earlier * as it seems it doesn't agree with , yet we should really use * if possible. */ # if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) # include # endif # else # include # endif # if defined(_AMIGA) && defined(__SASC) && defined(_M68881) /* Amiga SAS/C: We must include builtin FPU functions when compiling using * MATH=68881 */ # include # endif #endif /* Codewarrior on NT has linking problems without this. */ #if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__) # define PNG_ALWAYS_EXTERN #endif /* This provides the non-ANSI (far) memory allocation routines. */ #if defined(__TURBOC__) && defined(__MSDOS__) # include # include #endif /* I have no idea why is this necessary... */ #if defined(_MSC_VER) && (defined(WIN32) || defined(_Windows) || \ defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__)) # include #endif /* This controls how fine the dithering gets. As this allocates * a largish chunk of memory (32K), those who are not as concerned * with dithering quality can decrease some or all of these. */ #ifndef PNG_DITHER_RED_BITS # define PNG_DITHER_RED_BITS 5 #endif #ifndef PNG_DITHER_GREEN_BITS # define PNG_DITHER_GREEN_BITS 5 #endif #ifndef PNG_DITHER_BLUE_BITS # define PNG_DITHER_BLUE_BITS 5 #endif /* This controls how fine the gamma correction becomes when you * are only interested in 8 bits anyway. Increasing this value * results in more memory being used, and more pow() functions * being called to fill in the gamma tables. Don't set this value * less then 8, and even that may not work (I haven't tested it). */ #ifndef PNG_MAX_GAMMA_8 # define PNG_MAX_GAMMA_8 11 #endif /* This controls how much a difference in gamma we can tolerate before * we actually start doing gamma conversion. */ #ifndef PNG_GAMMA_THRESHOLD # define PNG_GAMMA_THRESHOLD 0.05 #endif #endif /* PNG_INTERNAL */ /* The following uses const char * instead of char * for error * and warning message functions, so some compilers won't complain. * If you do not want to use const, define PNG_NO_CONST here. */ #ifndef PNG_NO_CONST # define PNG_CONST const #else # define PNG_CONST #endif /* The following defines give you the ability to remove code from the * library that you will not be using. I wish I could figure out how to * automate this, but I can't do that without making it seriously hard * on the users. So if you are not using an ability, change the #define * to and #undef, and that part of the library will not be compiled. If * your linker can't find a function, you may want to make sure the * ability is defined here. Some of these depend upon some others being * defined. I haven't figured out all the interactions here, so you may * have to experiment awhile to get everything to compile. If you are * creating or using a shared library, you probably shouldn't touch this, * as it will affect the size of the structures, and this will cause bad * things to happen if the library and/or application ever change. */ /* Any features you will not be using can be undef'ed here */ /* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user * to turn it off with "*TRANSFORMS_NOT_SUPPORTED" or *PNG_NO_*_TRANSFORMS * on the compile line, then pick and choose which ones to define without * having to edit this file. It is safe to use the *TRANSFORMS_NOT_SUPPORTED * if you only want to have a png-compliant reader/writer but don't need * any of the extra transformations. This saves about 80 kbytes in a * typical installation of the library. (PNG_NO_* form added in version * 1.0.1c, for consistency) */ /* The size of the png_text structure changed in libpng-1.0.6 when * iTXt support was added. iTXt support was turned off by default through * libpng-1.2.x, to support old apps that malloc the png_text structure * instead of calling png_set_text() and letting libpng malloc it. It * was turned on by default in libpng-1.3.0. */ #if defined(PNG_1_0_X) || defined (PNG_1_2_X) # ifndef PNG_NO_iTXt_SUPPORTED # define PNG_NO_iTXt_SUPPORTED # endif # ifndef PNG_NO_READ_iTXt # define PNG_NO_READ_iTXt # endif # ifndef PNG_NO_WRITE_iTXt # define PNG_NO_WRITE_iTXt # endif #endif #if !defined(PNG_NO_iTXt_SUPPORTED) # if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt) # define PNG_READ_iTXt # endif # if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt) # define PNG_WRITE_iTXt # endif #endif /* The following support, added after version 1.0.0, can be turned off here en * masse by defining PNG_LEGACY_SUPPORTED in case you need binary compatibility * with old applications that require the length of png_struct and png_info * to remain unchanged. */ #ifdef PNG_LEGACY_SUPPORTED # define PNG_NO_FREE_ME # define PNG_NO_READ_UNKNOWN_CHUNKS # define PNG_NO_WRITE_UNKNOWN_CHUNKS # define PNG_NO_READ_USER_CHUNKS # define PNG_NO_READ_iCCP # define PNG_NO_WRITE_iCCP # define PNG_NO_READ_iTXt # define PNG_NO_WRITE_iTXt # define PNG_NO_READ_sCAL # define PNG_NO_WRITE_sCAL # define PNG_NO_READ_sPLT # define PNG_NO_WRITE_sPLT # define PNG_NO_INFO_IMAGE # define PNG_NO_READ_RGB_TO_GRAY # define PNG_NO_READ_USER_TRANSFORM # define PNG_NO_WRITE_USER_TRANSFORM # define PNG_NO_USER_MEM # define PNG_NO_READ_EMPTY_PLTE # define PNG_NO_MNG_FEATURES # define PNG_NO_FIXED_POINT_SUPPORTED #endif /* Ignore attempt to turn off both floating and fixed point support */ #if !defined(PNG_FLOATING_POINT_SUPPORTED) || \ !defined(PNG_NO_FIXED_POINT_SUPPORTED) # define PNG_FIXED_POINT_SUPPORTED #endif #ifndef PNG_NO_FREE_ME # define PNG_FREE_ME_SUPPORTED #endif #if defined(PNG_READ_SUPPORTED) #if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \ !defined(PNG_NO_READ_TRANSFORMS) # define PNG_READ_TRANSFORMS_SUPPORTED #endif #ifdef PNG_READ_TRANSFORMS_SUPPORTED # ifndef PNG_NO_READ_EXPAND # define PNG_READ_EXPAND_SUPPORTED # endif # ifndef PNG_NO_READ_SHIFT # define PNG_READ_SHIFT_SUPPORTED # endif # ifndef PNG_NO_READ_PACK # define PNG_READ_PACK_SUPPORTED # endif # ifndef PNG_NO_READ_BGR # define PNG_READ_BGR_SUPPORTED # endif # ifndef PNG_NO_READ_SWAP # define PNG_READ_SWAP_SUPPORTED # endif # ifndef PNG_NO_READ_PACKSWAP # define PNG_READ_PACKSWAP_SUPPORTED # endif # ifndef PNG_NO_READ_INVERT # define PNG_READ_INVERT_SUPPORTED # endif # ifndef PNG_NO_READ_DITHER # define PNG_READ_DITHER_SUPPORTED # endif # ifndef PNG_NO_READ_BACKGROUND # define PNG_READ_BACKGROUND_SUPPORTED # endif # ifndef PNG_NO_READ_16_TO_8 # define PNG_READ_16_TO_8_SUPPORTED # endif # ifndef PNG_NO_READ_FILLER # define PNG_READ_FILLER_SUPPORTED # endif # ifndef PNG_NO_READ_GAMMA # define PNG_READ_GAMMA_SUPPORTED # endif # ifndef PNG_NO_READ_GRAY_TO_RGB # define PNG_READ_GRAY_TO_RGB_SUPPORTED # endif # ifndef PNG_NO_READ_SWAP_ALPHA # define PNG_READ_SWAP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_INVERT_ALPHA # define PNG_READ_INVERT_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_STRIP_ALPHA # define PNG_READ_STRIP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_USER_TRANSFORM # define PNG_READ_USER_TRANSFORM_SUPPORTED # endif # ifndef PNG_NO_READ_RGB_TO_GRAY # define PNG_READ_RGB_TO_GRAY_SUPPORTED # endif #endif /* PNG_READ_TRANSFORMS_SUPPORTED */ #if !defined(PNG_NO_PROGRESSIVE_READ) && \ !defined(PNG_PROGRESSIVE_READ_SUPPORTED) /* if you don't do progressive */ # define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */ #endif /* about interlacing capability! You'll */ /* still have interlacing unless you change the following line: */ #define PNG_READ_INTERLACING_SUPPORTED /* required in PNG-compliant decoders */ #ifndef PNG_NO_READ_COMPOSITE_NODIV # ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */ # define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */ # endif #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Deprecated, will be removed from version 2.0.0. Use PNG_MNG_FEATURES_SUPPORTED instead. */ #ifndef PNG_NO_READ_EMPTY_PLTE # define PNG_READ_EMPTY_PLTE_SUPPORTED #endif #endif #endif /* PNG_READ_SUPPORTED */ #if defined(PNG_WRITE_SUPPORTED) # if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \ !defined(PNG_NO_WRITE_TRANSFORMS) # define PNG_WRITE_TRANSFORMS_SUPPORTED #endif #ifdef PNG_WRITE_TRANSFORMS_SUPPORTED # ifndef PNG_NO_WRITE_SHIFT # define PNG_WRITE_SHIFT_SUPPORTED # endif # ifndef PNG_NO_WRITE_PACK # define PNG_WRITE_PACK_SUPPORTED # endif # ifndef PNG_NO_WRITE_BGR # define PNG_WRITE_BGR_SUPPORTED # endif # ifndef PNG_NO_WRITE_SWAP # define PNG_WRITE_SWAP_SUPPORTED # endif # ifndef PNG_NO_WRITE_PACKSWAP # define PNG_WRITE_PACKSWAP_SUPPORTED # endif # ifndef PNG_NO_WRITE_INVERT # define PNG_WRITE_INVERT_SUPPORTED # endif # ifndef PNG_NO_WRITE_FILLER # define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */ # endif # ifndef PNG_NO_WRITE_SWAP_ALPHA # define PNG_WRITE_SWAP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_WRITE_INVERT_ALPHA # define PNG_WRITE_INVERT_ALPHA_SUPPORTED # endif # ifndef PNG_NO_WRITE_USER_TRANSFORM # define PNG_WRITE_USER_TRANSFORM_SUPPORTED # endif #endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ #if !defined(PNG_NO_WRITE_INTERLACING_SUPPORTED) && \ !defined(PNG_WRITE_INTERLACING_SUPPORTED) #define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant encoders, but can cause trouble if left undefined */ #endif #if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \ !defined(PNG_WRITE_WEIGHTED_FILTER) && \ defined(PNG_FLOATING_POINT_SUPPORTED) # define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED #endif #ifndef PNG_NO_WRITE_FLUSH # define PNG_WRITE_FLUSH_SUPPORTED #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */ #ifndef PNG_NO_WRITE_EMPTY_PLTE # define PNG_WRITE_EMPTY_PLTE_SUPPORTED #endif #endif #endif /* PNG_WRITE_SUPPORTED */ #ifndef PNG_1_0_X # ifndef PNG_NO_ERROR_NUMBERS # define PNG_ERROR_NUMBERS_SUPPORTED # endif #endif /* PNG_1_0_X */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) # ifndef PNG_NO_USER_TRANSFORM_PTR # define PNG_USER_TRANSFORM_PTR_SUPPORTED # endif #endif #ifndef PNG_NO_STDIO # define PNG_TIME_RFC1123_SUPPORTED #endif /* This adds extra functions in pngget.c for accessing data from the * info pointer (added in version 0.99) * png_get_image_width() * png_get_image_height() * png_get_bit_depth() * png_get_color_type() * png_get_compression_type() * png_get_filter_type() * png_get_interlace_type() * png_get_pixel_aspect_ratio() * png_get_pixels_per_meter() * png_get_x_offset_pixels() * png_get_y_offset_pixels() * png_get_x_offset_microns() * png_get_y_offset_microns() */ #if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED) # define PNG_EASY_ACCESS_SUPPORTED #endif /* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0 * and removed from version 1.2.20. The following will be removed * from libpng-1.4.0 */ #if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_OPTIMIZED_CODE) # ifndef PNG_OPTIMIZED_CODE_SUPPORTED # define PNG_OPTIMIZED_CODE_SUPPORTED # endif #endif #if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE) && defined(__i386__) # ifndef PNG_ASSEMBLER_CODE_SUPPORTED # define PNG_ASSEMBLER_CODE_SUPPORTED # endif # if defined(__GNUC__) && defined(__x86_64__) && (__GNUC__ < 4) /* work around 64-bit gcc compiler bugs in gcc-3.x */ # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_NO_MMX_CODE # endif # endif # if defined(__APPLE__) # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_NO_MMX_CODE # endif # endif # if (defined(__MWERKS__) && ((__MWERKS__ < 0x0900) || macintosh)) # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_NO_MMX_CODE # endif # endif # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_MMX_CODE_SUPPORTED # endif #endif /* end of obsolete code to be removed from libpng-1.4.0 */ #if !defined(PNG_1_0_X) #if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED) # define PNG_USER_MEM_SUPPORTED #endif #endif /* PNG_1_0_X */ /* Added at libpng-1.2.6 */ #if !defined(PNG_1_0_X) #ifndef PNG_SET_USER_LIMITS_SUPPORTED #if !defined(PNG_NO_SET_USER_LIMITS) && !defined(PNG_SET_USER_LIMITS_SUPPORTED) # define PNG_SET_USER_LIMITS_SUPPORTED #endif #endif #endif /* PNG_1_0_X */ /* Added at libpng-1.0.16 and 1.2.6. To accept all valid PNGS no matter * how large, set these limits to 0x7fffffffL */ #ifndef PNG_USER_WIDTH_MAX # define PNG_USER_WIDTH_MAX 1000000L #endif #ifndef PNG_USER_HEIGHT_MAX # define PNG_USER_HEIGHT_MAX 1000000L #endif /* Added at libpng-1.2.34 and 1.4.0 */ #ifndef PNG_STRING_NEWLINE #define PNG_STRING_NEWLINE "\n" #endif /* These are currently experimental features, define them if you want */ /* very little testing */ /* #ifdef PNG_READ_SUPPORTED # ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED # define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED # endif #endif */ /* This is only for PowerPC big-endian and 680x0 systems */ /* some testing */ /* #ifndef PNG_READ_BIG_ENDIAN_SUPPORTED # define PNG_READ_BIG_ENDIAN_SUPPORTED #endif */ /* Buggy compilers (e.g., gcc 2.7.2.2) need this */ /* #define PNG_NO_POINTER_INDEXING */ /* These functions are turned off by default, as they will be phased out. */ /* #define PNG_USELESS_TESTS_SUPPORTED #define PNG_CORRECT_PALETTE_SUPPORTED */ /* Any chunks you are not interested in, you can undef here. The * ones that allocate memory may be expecially important (hIST, * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info * a bit smaller. */ #if defined(PNG_READ_SUPPORTED) && \ !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ !defined(PNG_NO_READ_ANCILLARY_CHUNKS) # define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED #endif #if defined(PNG_WRITE_SUPPORTED) && \ !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS) # define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED #endif #ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED #ifdef PNG_NO_READ_TEXT # define PNG_NO_READ_iTXt # define PNG_NO_READ_tEXt # define PNG_NO_READ_zTXt #endif #ifndef PNG_NO_READ_bKGD # define PNG_READ_bKGD_SUPPORTED # define PNG_bKGD_SUPPORTED #endif #ifndef PNG_NO_READ_cHRM # define PNG_READ_cHRM_SUPPORTED # define PNG_cHRM_SUPPORTED #endif #ifndef PNG_NO_READ_gAMA # define PNG_READ_gAMA_SUPPORTED # define PNG_gAMA_SUPPORTED #endif #ifndef PNG_NO_READ_hIST # define PNG_READ_hIST_SUPPORTED # define PNG_hIST_SUPPORTED #endif #ifndef PNG_NO_READ_iCCP # define PNG_READ_iCCP_SUPPORTED # define PNG_iCCP_SUPPORTED #endif #ifndef PNG_NO_READ_iTXt # ifndef PNG_READ_iTXt_SUPPORTED # define PNG_READ_iTXt_SUPPORTED # endif # ifndef PNG_iTXt_SUPPORTED # define PNG_iTXt_SUPPORTED # endif #endif #ifndef PNG_NO_READ_oFFs # define PNG_READ_oFFs_SUPPORTED # define PNG_oFFs_SUPPORTED #endif #ifndef PNG_NO_READ_pCAL # define PNG_READ_pCAL_SUPPORTED # define PNG_pCAL_SUPPORTED #endif #ifndef PNG_NO_READ_sCAL # define PNG_READ_sCAL_SUPPORTED # define PNG_sCAL_SUPPORTED #endif #ifndef PNG_NO_READ_pHYs # define PNG_READ_pHYs_SUPPORTED # define PNG_pHYs_SUPPORTED #endif #ifndef PNG_NO_READ_sBIT # define PNG_READ_sBIT_SUPPORTED # define PNG_sBIT_SUPPORTED #endif #ifndef PNG_NO_READ_sPLT # define PNG_READ_sPLT_SUPPORTED # define PNG_sPLT_SUPPORTED #endif #ifndef PNG_NO_READ_sRGB # define PNG_READ_sRGB_SUPPORTED # define PNG_sRGB_SUPPORTED #endif #ifndef PNG_NO_READ_tEXt # define PNG_READ_tEXt_SUPPORTED # define PNG_tEXt_SUPPORTED #endif #ifndef PNG_NO_READ_tIME # define PNG_READ_tIME_SUPPORTED # define PNG_tIME_SUPPORTED #endif #ifndef PNG_NO_READ_tRNS # define PNG_READ_tRNS_SUPPORTED # define PNG_tRNS_SUPPORTED #endif #ifndef PNG_NO_READ_zTXt # define PNG_READ_zTXt_SUPPORTED # define PNG_zTXt_SUPPORTED #endif #ifndef PNG_NO_READ_UNKNOWN_CHUNKS # define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED # define PNG_UNKNOWN_CHUNKS_SUPPORTED # endif # ifndef PNG_NO_HANDLE_AS_UNKNOWN # define PNG_HANDLE_AS_UNKNOWN_SUPPORTED # endif #endif #if !defined(PNG_NO_READ_USER_CHUNKS) && \ defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) # define PNG_READ_USER_CHUNKS_SUPPORTED # define PNG_USER_CHUNKS_SUPPORTED # ifdef PNG_NO_READ_UNKNOWN_CHUNKS # undef PNG_NO_READ_UNKNOWN_CHUNKS # endif # ifdef PNG_NO_HANDLE_AS_UNKNOWN # undef PNG_NO_HANDLE_AS_UNKNOWN # endif #endif #ifndef PNG_NO_READ_OPT_PLTE # define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */ #endif /* optional PLTE chunk in RGB and RGBA images */ #if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \ defined(PNG_READ_zTXt_SUPPORTED) # define PNG_READ_TEXT_SUPPORTED # define PNG_TEXT_SUPPORTED #endif #endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */ #ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED #ifdef PNG_NO_WRITE_TEXT # define PNG_NO_WRITE_iTXt # define PNG_NO_WRITE_tEXt # define PNG_NO_WRITE_zTXt #endif #ifndef PNG_NO_WRITE_bKGD # define PNG_WRITE_bKGD_SUPPORTED # ifndef PNG_bKGD_SUPPORTED # define PNG_bKGD_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_cHRM # define PNG_WRITE_cHRM_SUPPORTED # ifndef PNG_cHRM_SUPPORTED # define PNG_cHRM_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_gAMA # define PNG_WRITE_gAMA_SUPPORTED # ifndef PNG_gAMA_SUPPORTED # define PNG_gAMA_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_hIST # define PNG_WRITE_hIST_SUPPORTED # ifndef PNG_hIST_SUPPORTED # define PNG_hIST_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_iCCP # define PNG_WRITE_iCCP_SUPPORTED # ifndef PNG_iCCP_SUPPORTED # define PNG_iCCP_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_iTXt # ifndef PNG_WRITE_iTXt_SUPPORTED # define PNG_WRITE_iTXt_SUPPORTED # endif # ifndef PNG_iTXt_SUPPORTED # define PNG_iTXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_oFFs # define PNG_WRITE_oFFs_SUPPORTED # ifndef PNG_oFFs_SUPPORTED # define PNG_oFFs_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_pCAL # define PNG_WRITE_pCAL_SUPPORTED # ifndef PNG_pCAL_SUPPORTED # define PNG_pCAL_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sCAL # define PNG_WRITE_sCAL_SUPPORTED # ifndef PNG_sCAL_SUPPORTED # define PNG_sCAL_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_pHYs # define PNG_WRITE_pHYs_SUPPORTED # ifndef PNG_pHYs_SUPPORTED # define PNG_pHYs_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sBIT # define PNG_WRITE_sBIT_SUPPORTED # ifndef PNG_sBIT_SUPPORTED # define PNG_sBIT_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sPLT # define PNG_WRITE_sPLT_SUPPORTED # ifndef PNG_sPLT_SUPPORTED # define PNG_sPLT_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sRGB # define PNG_WRITE_sRGB_SUPPORTED # ifndef PNG_sRGB_SUPPORTED # define PNG_sRGB_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tEXt # define PNG_WRITE_tEXt_SUPPORTED # ifndef PNG_tEXt_SUPPORTED # define PNG_tEXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tIME # define PNG_WRITE_tIME_SUPPORTED # ifndef PNG_tIME_SUPPORTED # define PNG_tIME_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tRNS # define PNG_WRITE_tRNS_SUPPORTED # ifndef PNG_tRNS_SUPPORTED # define PNG_tRNS_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_zTXt # define PNG_WRITE_zTXt_SUPPORTED # ifndef PNG_zTXt_SUPPORTED # define PNG_zTXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS # define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED # define PNG_UNKNOWN_CHUNKS_SUPPORTED # endif # ifndef PNG_NO_HANDLE_AS_UNKNOWN # ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED # define PNG_HANDLE_AS_UNKNOWN_SUPPORTED # endif # endif #endif #if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \ defined(PNG_WRITE_zTXt_SUPPORTED) # define PNG_WRITE_TEXT_SUPPORTED # ifndef PNG_TEXT_SUPPORTED # define PNG_TEXT_SUPPORTED # endif #endif #endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */ /* Turn this off to disable png_read_png() and * png_write_png() and leave the row_pointers member * out of the info structure. */ #ifndef PNG_NO_INFO_IMAGE # define PNG_INFO_IMAGE_SUPPORTED #endif /* need the time information for reading tIME chunks */ #if defined(PNG_tIME_SUPPORTED) # if !defined(_WIN32_WCE) /* "time.h" functions are not supported on WindowsCE */ # include # endif #endif /* Some typedefs to get us started. These should be safe on most of the * common platforms. The typedefs should be at least as large as the * numbers suggest (a png_uint_32 must be at least 32 bits long), but they * don't have to be exactly that size. Some compilers dislike passing * unsigned shorts as function parameters, so you may be better off using * unsigned int for png_uint_16. Likewise, for 64-bit systems, you may * want to have unsigned int for png_uint_32 instead of unsigned long. */ typedef unsigned long png_uint_32; typedef long png_int_32; typedef unsigned short png_uint_16; typedef short png_int_16; typedef unsigned char png_byte; /* This is usually size_t. It is typedef'ed just in case you need it to change (I'm not sure if you will or not, so I thought I'd be safe) */ #ifdef PNG_SIZE_T typedef PNG_SIZE_T png_size_t; # define png_sizeof(x) png_convert_size(sizeof(x)) #else typedef size_t png_size_t; # define png_sizeof(x) sizeof(x) #endif /* The following is needed for medium model support. It cannot be in the * PNG_INTERNAL section. Needs modification for other compilers besides * MSC. Model independent support declares all arrays and pointers to be * large using the far keyword. The zlib version used must also support * model independent data. As of version zlib 1.0.4, the necessary changes * have been made in zlib. The USE_FAR_KEYWORD define triggers other * changes that are needed. (Tim Wegner) */ /* Separate compiler dependencies (problem here is that zlib.h always defines FAR. (SJT) */ #ifdef __BORLANDC__ # if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) # define LDATA 1 # else # define LDATA 0 # endif /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ # if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) # define PNG_MAX_MALLOC_64K # if (LDATA != 1) # ifndef FAR # define FAR __far # endif # define USE_FAR_KEYWORD # endif /* LDATA != 1 */ /* Possibly useful for moving data out of default segment. * Uncomment it if you want. Could also define FARDATA as * const if your compiler supports it. (SJT) # define FARDATA FAR */ # endif /* __WIN32__, __FLAT__, __CYGWIN__ */ #endif /* __BORLANDC__ */ /* Suggest testing for specific compiler first before testing for * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, * making reliance oncertain keywords suspect. (SJT) */ /* MSC Medium model */ #if defined(FAR) # if defined(M_I86MM) # define USE_FAR_KEYWORD # define FARDATA FAR # include # endif #endif /* SJT: default case */ #ifndef FAR # define FAR #endif /* At this point FAR is always defined */ #ifndef FARDATA # define FARDATA #endif /* Typedef for floating-point numbers that are converted to fixed-point with a multiple of 100,000, e.g., int_gamma */ typedef png_int_32 png_fixed_point; /* Add typedefs for pointers */ typedef void FAR * png_voidp; typedef png_byte FAR * png_bytep; typedef png_uint_32 FAR * png_uint_32p; typedef png_int_32 FAR * png_int_32p; typedef png_uint_16 FAR * png_uint_16p; typedef png_int_16 FAR * png_int_16p; typedef PNG_CONST char FAR * png_const_charp; typedef char FAR * png_charp; typedef png_fixed_point FAR * png_fixed_point_p; #ifndef PNG_NO_STDIO #if defined(_WIN32_WCE) typedef HANDLE png_FILE_p; #else typedef FILE * png_FILE_p; #endif #endif #ifdef PNG_FLOATING_POINT_SUPPORTED typedef double FAR * png_doublep; #endif /* Pointers to pointers; i.e. arrays */ typedef png_byte FAR * FAR * png_bytepp; typedef png_uint_32 FAR * FAR * png_uint_32pp; typedef png_int_32 FAR * FAR * png_int_32pp; typedef png_uint_16 FAR * FAR * png_uint_16pp; typedef png_int_16 FAR * FAR * png_int_16pp; typedef PNG_CONST char FAR * FAR * png_const_charpp; typedef char FAR * FAR * png_charpp; typedef png_fixed_point FAR * FAR * png_fixed_point_pp; #ifdef PNG_FLOATING_POINT_SUPPORTED typedef double FAR * FAR * png_doublepp; #endif /* Pointers to pointers to pointers; i.e., pointer to array */ typedef char FAR * FAR * FAR * png_charppp; #if defined(PNG_1_0_X) || defined(PNG_1_2_X) /* SPC - Is this stuff deprecated? */ /* It'll be removed as of libpng-1.3.0 - GR-P */ /* libpng typedefs for types in zlib. If zlib changes * or another compression library is used, then change these. * Eliminates need to change all the source files. */ typedef charf * png_zcharp; typedef charf * FAR * png_zcharpp; typedef z_stream FAR * png_zstreamp; #endif /* (PNG_1_0_X) || defined(PNG_1_2_X) */ /* * Define PNG_BUILD_DLL if the module being built is a Windows * LIBPNG DLL. * * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL. * It is equivalent to Microsoft predefined macro _DLL that is * automatically defined when you compile using the share * version of the CRT (C Run-Time library) * * The cygwin mods make this behavior a little different: * Define PNG_BUILD_DLL if you are building a dll for use with cygwin * Define PNG_STATIC if you are building a static library for use with cygwin, * -or- if you are building an application that you want to link to the * static library. * PNG_USE_DLL is defined by default (no user action needed) unless one of * the other flags is defined. */ #if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL)) # define PNG_DLL #endif /* If CYGWIN, then disallow GLOBAL ARRAYS unless building a static lib. * When building a static lib, default to no GLOBAL ARRAYS, but allow * command-line override */ #if defined(__CYGWIN__) # if !defined(PNG_STATIC) # if defined(PNG_USE_GLOBAL_ARRAYS) # undef PNG_USE_GLOBAL_ARRAYS # endif # if !defined(PNG_USE_LOCAL_ARRAYS) # define PNG_USE_LOCAL_ARRAYS # endif # else # if defined(PNG_USE_LOCAL_ARRAYS) || defined(PNG_NO_GLOBAL_ARRAYS) # if defined(PNG_USE_GLOBAL_ARRAYS) # undef PNG_USE_GLOBAL_ARRAYS # endif # endif # endif # if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) # define PNG_USE_LOCAL_ARRAYS # endif #endif /* Do not use global arrays (helps with building DLL's) * They are no longer used in libpng itself, since version 1.0.5c, * but might be required for some pre-1.0.5c applications. */ #if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) # if defined(PNG_NO_GLOBAL_ARRAYS) || \ (defined(__GNUC__) && defined(PNG_DLL)) || defined(_MSC_VER) # define PNG_USE_LOCAL_ARRAYS # else # define PNG_USE_GLOBAL_ARRAYS # endif #endif #if defined(__CYGWIN__) # undef PNGAPI # define PNGAPI __cdecl # undef PNG_IMPEXP # define PNG_IMPEXP #endif /* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall", * you may get warnings regarding the linkage of png_zalloc and png_zfree. * Don't ignore those warnings; you must also reset the default calling * convention in your compiler to match your PNGAPI, and you must build * zlib and your applications the same way you build libpng. */ #if defined(__MINGW32__) && !defined(PNG_MODULEDEF) # ifndef PNG_NO_MODULEDEF # define PNG_NO_MODULEDEF # endif #endif #if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF) # define PNG_IMPEXP #endif #if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \ (( defined(_Windows) || defined(_WINDOWS) || \ defined(WIN32) || defined(_WIN32) || defined(__WIN32__) )) # ifndef PNGAPI # if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) # define PNGAPI __cdecl # else # define PNGAPI _cdecl # endif # endif # if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \ 0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */) # define PNG_IMPEXP # endif # if !defined(PNG_IMPEXP) # define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol # define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol /* Borland/Microsoft */ # if defined(_MSC_VER) || defined(__BORLANDC__) # if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500) # define PNG_EXPORT PNG_EXPORT_TYPE1 # else # define PNG_EXPORT PNG_EXPORT_TYPE2 # if defined(PNG_BUILD_DLL) # define PNG_IMPEXP __export # else # define PNG_IMPEXP /*__import */ /* doesn't exist AFAIK in VC++ */ # endif /* Exists in Borland C++ for C++ classes (== huge) */ # endif # endif # if !defined(PNG_IMPEXP) # if defined(PNG_BUILD_DLL) # define PNG_IMPEXP __declspec(dllexport) # else # define PNG_IMPEXP __declspec(dllimport) # endif # endif # endif /* PNG_IMPEXP */ #else /* !(DLL || non-cygwin WINDOWS) */ # if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) # ifndef PNGAPI # define PNGAPI _System # endif # else # if 0 /* ... other platforms, with other meanings */ # endif # endif #endif #ifndef PNGAPI # define PNGAPI #endif #ifndef PNG_IMPEXP # define PNG_IMPEXP #endif #ifdef PNG_BUILDSYMS # ifndef PNG_EXPORT # define PNG_EXPORT(type,symbol) PNG_FUNCTION_EXPORT symbol END # endif # ifdef PNG_USE_GLOBAL_ARRAYS # ifndef PNG_EXPORT_VAR # define PNG_EXPORT_VAR(type) PNG_DATA_EXPORT # endif # endif #endif #ifndef PNG_EXPORT # define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol #endif #ifdef PNG_USE_GLOBAL_ARRAYS # ifndef PNG_EXPORT_VAR # define PNG_EXPORT_VAR(type) extern PNG_IMPEXP type # endif #endif /* User may want to use these so they are not in PNG_INTERNAL. Any library * functions that are passed far data must be model independent. */ #ifndef PNG_ABORT # define PNG_ABORT() abort() #endif #ifdef PNG_SETJMP_SUPPORTED # define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) #else # define png_jmpbuf(png_ptr) \ (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED) #endif #if defined(USE_FAR_KEYWORD) /* memory model independent fns */ /* use this to make far-to-near assignments */ # define CHECK 1 # define NOCHECK 0 # define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) # define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) # define png_snprintf _fsnprintf /* Added to v 1.2.19 */ # define png_strlen _fstrlen # define png_memcmp _fmemcmp /* SJT: added */ # define png_memcpy _fmemcpy # define png_memset _fmemset #else /* use the usual functions */ # define CVT_PTR(ptr) (ptr) # define CVT_PTR_NOCHECK(ptr) (ptr) # ifndef PNG_NO_SNPRINTF # ifdef _MSC_VER # define png_snprintf _snprintf /* Added to v 1.2.19 */ # define png_snprintf2 _snprintf # define png_snprintf6 _snprintf # else # define png_snprintf snprintf /* Added to v 1.2.19 */ # define png_snprintf2 snprintf # define png_snprintf6 snprintf # endif # else /* You don't have or don't want to use snprintf(). Caution: Using * sprintf instead of snprintf exposes your application to accidental * or malevolent buffer overflows. If you don't have snprintf() * as a general rule you should provide one (you can get one from * Portable OpenSSH). */ # define png_snprintf(s1,n,fmt,x1) sprintf(s1,fmt,x1) # define png_snprintf2(s1,n,fmt,x1,x2) sprintf(s1,fmt,x1,x2) # define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \ sprintf(s1,fmt,x1,x2,x3,x4,x5,x6) # endif # define png_strlen strlen # define png_memcmp memcmp /* SJT: added */ # define png_memcpy memcpy # define png_memset memset #endif /* End of memory model independent support */ /* Just a little check that someone hasn't tried to define something * contradictory. */ #if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K) # undef PNG_ZBUF_SIZE # define PNG_ZBUF_SIZE 65536L #endif /* Added at libpng-1.2.8 */ #endif /* PNG_VERSION_INFO_ONLY */ #endif /* PNGCONF_H */ angband-3.5.1/src/win/include/libpng12/0000755000175000017500000000000012456456607017066 5ustar chriscchriscangband-3.5.1/src/win/include/libpng12/pngconf.h0000644000175000017500000013050612456456607020676 0ustar chriscchrisc /* pngconf.h - machine configurable file for libpng * * libpng version 1.2.37 - June 4, 2009 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2009 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) */ /* Any machine specific code is near the front of this file, so if you * are configuring libpng for a machine, you may want to read the section * starting here down to where it starts to typedef png_color, png_text, * and png_info. */ #ifndef PNGCONF_H #define PNGCONF_H #define PNG_1_2_X /* * PNG_USER_CONFIG has to be defined on the compiler command line. This * includes the resource compiler for Windows DLL configurations. */ #ifdef PNG_USER_CONFIG # ifndef PNG_USER_PRIVATEBUILD # define PNG_USER_PRIVATEBUILD # endif #include "pngusr.h" #endif /* PNG_CONFIGURE_LIBPNG is set by the "configure" script. */ #ifdef PNG_CONFIGURE_LIBPNG #ifdef HAVE_CONFIG_H #include "config.h" #endif #endif /* * Added at libpng-1.2.8 * * If you create a private DLL you need to define in "pngusr.h" the followings: * #define PNG_USER_PRIVATEBUILD * e.g. #define PNG_USER_PRIVATEBUILD "Build by MyCompany for xyz reasons." * #define PNG_USER_DLLFNAME_POSTFIX * e.g. // private DLL "libpng13gx.dll" * #define PNG_USER_DLLFNAME_POSTFIX "gx" * * The following macros are also at your disposal if you want to complete the * DLL VERSIONINFO structure. * - PNG_USER_VERSIONINFO_COMMENTS * - PNG_USER_VERSIONINFO_COMPANYNAME * - PNG_USER_VERSIONINFO_LEGALTRADEMARKS */ #ifdef __STDC__ #ifdef SPECIALBUILD # pragma message("PNG_LIBPNG_SPECIALBUILD (and deprecated SPECIALBUILD)\ are now LIBPNG reserved macros. Use PNG_USER_PRIVATEBUILD instead.") #endif #ifdef PRIVATEBUILD # pragma message("PRIVATEBUILD is deprecated.\ Use PNG_USER_PRIVATEBUILD instead.") # define PNG_USER_PRIVATEBUILD PRIVATEBUILD #endif #endif /* __STDC__ */ #ifndef PNG_VERSION_INFO_ONLY /* End of material added to libpng-1.2.8 */ /* Added at libpng-1.2.19, removed at libpng-1.2.20 because it caused trouble Restored at libpng-1.2.21 */ #if !defined(PNG_NO_WARN_UNINITIALIZED_ROW) && \ !defined(PNG_WARN_UNINITIALIZED_ROW) # define PNG_WARN_UNINITIALIZED_ROW 1 #endif /* End of material added at libpng-1.2.19/1.2.21 */ /* This is the size of the compression buffer, and thus the size of * an IDAT chunk. Make this whatever size you feel is best for your * machine. One of these will be allocated per png_struct. When this * is full, it writes the data to the disk, and does some other * calculations. Making this an extremely small size will slow * the library down, but you may want to experiment to determine * where it becomes significant, if you are concerned with memory * usage. Note that zlib allocates at least 32Kb also. For readers, * this describes the size of the buffer available to read the data in. * Unless this gets smaller than the size of a row (compressed), * it should not make much difference how big this is. */ #ifndef PNG_ZBUF_SIZE # define PNG_ZBUF_SIZE 8192 #endif /* Enable if you want a write-only libpng */ #ifndef PNG_NO_READ_SUPPORTED # define PNG_READ_SUPPORTED #endif /* Enable if you want a read-only libpng */ #ifndef PNG_NO_WRITE_SUPPORTED # define PNG_WRITE_SUPPORTED #endif /* Enabled by default in 1.2.0. You can disable this if you don't need to support PNGs that are embedded in MNG datastreams */ #if !defined(PNG_1_0_X) && !defined(PNG_NO_MNG_FEATURES) # ifndef PNG_MNG_FEATURES_SUPPORTED # define PNG_MNG_FEATURES_SUPPORTED # endif #endif #ifndef PNG_NO_FLOATING_POINT_SUPPORTED # ifndef PNG_FLOATING_POINT_SUPPORTED # define PNG_FLOATING_POINT_SUPPORTED # endif #endif /* If you are running on a machine where you cannot allocate more * than 64K of memory at once, uncomment this. While libpng will not * normally need that much memory in a chunk (unless you load up a very * large file), zlib needs to know how big of a chunk it can use, and * libpng thus makes sure to check any memory allocation to verify it * will fit into memory. #define PNG_MAX_MALLOC_64K */ #if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) # define PNG_MAX_MALLOC_64K #endif /* Special munging to support doing things the 'cygwin' way: * 'Normal' png-on-win32 defines/defaults: * PNG_BUILD_DLL -- building dll * PNG_USE_DLL -- building an application, linking to dll * (no define) -- building static library, or building an * application and linking to the static lib * 'Cygwin' defines/defaults: * PNG_BUILD_DLL -- (ignored) building the dll * (no define) -- (ignored) building an application, linking to the dll * PNG_STATIC -- (ignored) building the static lib, or building an * application that links to the static lib. * ALL_STATIC -- (ignored) building various static libs, or building an * application that links to the static libs. * Thus, * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and * this bit of #ifdefs will define the 'correct' config variables based on * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but * unnecessary. * * Also, the precedence order is: * ALL_STATIC (since we can't #undef something outside our namespace) * PNG_BUILD_DLL * PNG_STATIC * (nothing) == PNG_USE_DLL * * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent * of auto-import in binutils, we no longer need to worry about * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore, * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes * to __declspec() stuff. However, we DO need to worry about * PNG_BUILD_DLL and PNG_STATIC because those change some defaults * such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed. */ #if defined(__CYGWIN__) # if defined(ALL_STATIC) # if defined(PNG_BUILD_DLL) # undef PNG_BUILD_DLL # endif # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if defined(PNG_DLL) # undef PNG_DLL # endif # if !defined(PNG_STATIC) # define PNG_STATIC # endif # else # if defined (PNG_BUILD_DLL) # if defined(PNG_STATIC) # undef PNG_STATIC # endif # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if !defined(PNG_DLL) # define PNG_DLL # endif # else # if defined(PNG_STATIC) # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if defined(PNG_DLL) # undef PNG_DLL # endif # else # if !defined(PNG_USE_DLL) # define PNG_USE_DLL # endif # if !defined(PNG_DLL) # define PNG_DLL # endif # endif # endif # endif #endif /* This protects us against compilers that run on a windowing system * and thus don't have or would rather us not use the stdio types: * stdin, stdout, and stderr. The only one currently used is stderr * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will * prevent these from being compiled and used. #defining PNG_NO_STDIO * will also prevent these, plus will prevent the entire set of stdio * macros and functions (FILE *, printf, etc.) from being compiled and used, * unless (PNG_DEBUG > 0) has been #defined. * * #define PNG_NO_CONSOLE_IO * #define PNG_NO_STDIO */ #if defined(_WIN32_WCE) # include /* Console I/O functions are not supported on WindowsCE */ # define PNG_NO_CONSOLE_IO /* abort() may not be supported on some/all Windows CE platforms */ # define PNG_ABORT() exit(-1) # ifdef PNG_DEBUG # undef PNG_DEBUG # endif #endif #ifdef PNG_BUILD_DLL # ifndef PNG_CONSOLE_IO_SUPPORTED # ifndef PNG_NO_CONSOLE_IO # define PNG_NO_CONSOLE_IO # endif # endif #endif # ifdef PNG_NO_STDIO # ifndef PNG_NO_CONSOLE_IO # define PNG_NO_CONSOLE_IO # endif # ifdef PNG_DEBUG # if (PNG_DEBUG > 0) # include # endif # endif # else # if !defined(_WIN32_WCE) /* "stdio.h" functions are not supported on WindowsCE */ # include # endif # endif /* This macro protects us against machines that don't have function * prototypes (ie K&R style headers). If your compiler does not handle * function prototypes, define this macro and use the included ansi2knr. * I've always been able to use _NO_PROTO as the indicator, but you may * need to drag the empty declaration out in front of here, or change the * ifdef to suit your own needs. */ #ifndef PNGARG #ifdef OF /* zlib prototype munger */ # define PNGARG(arglist) OF(arglist) #else #ifdef _NO_PROTO # define PNGARG(arglist) () # ifndef PNG_TYPECAST_NULL # define PNG_TYPECAST_NULL # endif #else # define PNGARG(arglist) arglist #endif /* _NO_PROTO */ #endif /* OF */ #endif /* PNGARG */ /* Try to determine if we are compiling on a Mac. Note that testing for * just __MWERKS__ is not good enough, because the Codewarrior is now used * on non-Mac platforms. */ #ifndef MACOS # if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) # define MACOS # endif #endif /* enough people need this for various reasons to include it here */ #if !defined(MACOS) && !defined(RISCOS) && !defined(_WIN32_WCE) # include #endif #if !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED) # define PNG_SETJMP_SUPPORTED #endif #ifdef PNG_SETJMP_SUPPORTED /* This is an attempt to force a single setjmp behaviour on Linux. If * the X config stuff didn't define _BSD_SOURCE we wouldn't need this. * * You can bypass this test if you know that your application uses exactly * the same setjmp.h that was included when libpng was built. Only define * PNG_SKIP_SETJMP_CHECK while building your application, prior to the * application's '#include "png.h"'. Don't define PNG_SKIP_SETJMP_CHECK * while building a separate libpng library for general use. */ # ifndef PNG_SKIP_SETJMP_CHECK # ifdef __linux__ # ifdef _BSD_SOURCE # define PNG_SAVE_BSD_SOURCE # undef _BSD_SOURCE # endif # ifdef _SETJMP_H /* If you encounter a compiler error here, see the explanation * near the end of INSTALL. */ __pngconf.h__ in libpng already includes setjmp.h; __dont__ include it again.; # endif # endif /* __linux__ */ # endif /* PNG_SKIP_SETJMP_CHECK */ /* include setjmp.h for error handling */ # include # ifdef __linux__ # ifdef PNG_SAVE_BSD_SOURCE # ifndef _BSD_SOURCE # define _BSD_SOURCE # endif # undef PNG_SAVE_BSD_SOURCE # endif # endif /* __linux__ */ #endif /* PNG_SETJMP_SUPPORTED */ #ifdef BSD # include #else # include #endif /* Other defines for things like memory and the like can go here. */ #ifdef PNG_INTERNAL #include /* The functions exported by PNG_EXTERN are PNG_INTERNAL functions, which * aren't usually used outside the library (as far as I know), so it is * debatable if they should be exported at all. In the future, when it is * possible to have run-time registry of chunk-handling functions, some of * these will be made available again. #define PNG_EXTERN extern */ #define PNG_EXTERN /* Other defines specific to compilers can go here. Try to keep * them inside an appropriate ifdef/endif pair for portability. */ #if defined(PNG_FLOATING_POINT_SUPPORTED) # if defined(MACOS) /* We need to check that hasn't already been included earlier * as it seems it doesn't agree with , yet we should really use * if possible. */ # if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) # include # endif # else # include # endif # if defined(_AMIGA) && defined(__SASC) && defined(_M68881) /* Amiga SAS/C: We must include builtin FPU functions when compiling using * MATH=68881 */ # include # endif #endif /* Codewarrior on NT has linking problems without this. */ #if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__) # define PNG_ALWAYS_EXTERN #endif /* This provides the non-ANSI (far) memory allocation routines. */ #if defined(__TURBOC__) && defined(__MSDOS__) # include # include #endif /* I have no idea why is this necessary... */ #if defined(_MSC_VER) && (defined(WIN32) || defined(_Windows) || \ defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__)) # include #endif /* This controls how fine the dithering gets. As this allocates * a largish chunk of memory (32K), those who are not as concerned * with dithering quality can decrease some or all of these. */ #ifndef PNG_DITHER_RED_BITS # define PNG_DITHER_RED_BITS 5 #endif #ifndef PNG_DITHER_GREEN_BITS # define PNG_DITHER_GREEN_BITS 5 #endif #ifndef PNG_DITHER_BLUE_BITS # define PNG_DITHER_BLUE_BITS 5 #endif /* This controls how fine the gamma correction becomes when you * are only interested in 8 bits anyway. Increasing this value * results in more memory being used, and more pow() functions * being called to fill in the gamma tables. Don't set this value * less then 8, and even that may not work (I haven't tested it). */ #ifndef PNG_MAX_GAMMA_8 # define PNG_MAX_GAMMA_8 11 #endif /* This controls how much a difference in gamma we can tolerate before * we actually start doing gamma conversion. */ #ifndef PNG_GAMMA_THRESHOLD # define PNG_GAMMA_THRESHOLD 0.05 #endif #endif /* PNG_INTERNAL */ /* The following uses const char * instead of char * for error * and warning message functions, so some compilers won't complain. * If you do not want to use const, define PNG_NO_CONST here. */ #ifndef PNG_NO_CONST # define PNG_CONST const #else # define PNG_CONST #endif /* The following defines give you the ability to remove code from the * library that you will not be using. I wish I could figure out how to * automate this, but I can't do that without making it seriously hard * on the users. So if you are not using an ability, change the #define * to and #undef, and that part of the library will not be compiled. If * your linker can't find a function, you may want to make sure the * ability is defined here. Some of these depend upon some others being * defined. I haven't figured out all the interactions here, so you may * have to experiment awhile to get everything to compile. If you are * creating or using a shared library, you probably shouldn't touch this, * as it will affect the size of the structures, and this will cause bad * things to happen if the library and/or application ever change. */ /* Any features you will not be using can be undef'ed here */ /* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user * to turn it off with "*TRANSFORMS_NOT_SUPPORTED" or *PNG_NO_*_TRANSFORMS * on the compile line, then pick and choose which ones to define without * having to edit this file. It is safe to use the *TRANSFORMS_NOT_SUPPORTED * if you only want to have a png-compliant reader/writer but don't need * any of the extra transformations. This saves about 80 kbytes in a * typical installation of the library. (PNG_NO_* form added in version * 1.0.1c, for consistency) */ /* The size of the png_text structure changed in libpng-1.0.6 when * iTXt support was added. iTXt support was turned off by default through * libpng-1.2.x, to support old apps that malloc the png_text structure * instead of calling png_set_text() and letting libpng malloc it. It * was turned on by default in libpng-1.3.0. */ #if defined(PNG_1_0_X) || defined (PNG_1_2_X) # ifndef PNG_NO_iTXt_SUPPORTED # define PNG_NO_iTXt_SUPPORTED # endif # ifndef PNG_NO_READ_iTXt # define PNG_NO_READ_iTXt # endif # ifndef PNG_NO_WRITE_iTXt # define PNG_NO_WRITE_iTXt # endif #endif #if !defined(PNG_NO_iTXt_SUPPORTED) # if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt) # define PNG_READ_iTXt # endif # if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt) # define PNG_WRITE_iTXt # endif #endif /* The following support, added after version 1.0.0, can be turned off here en * masse by defining PNG_LEGACY_SUPPORTED in case you need binary compatibility * with old applications that require the length of png_struct and png_info * to remain unchanged. */ #ifdef PNG_LEGACY_SUPPORTED # define PNG_NO_FREE_ME # define PNG_NO_READ_UNKNOWN_CHUNKS # define PNG_NO_WRITE_UNKNOWN_CHUNKS # define PNG_NO_READ_USER_CHUNKS # define PNG_NO_READ_iCCP # define PNG_NO_WRITE_iCCP # define PNG_NO_READ_iTXt # define PNG_NO_WRITE_iTXt # define PNG_NO_READ_sCAL # define PNG_NO_WRITE_sCAL # define PNG_NO_READ_sPLT # define PNG_NO_WRITE_sPLT # define PNG_NO_INFO_IMAGE # define PNG_NO_READ_RGB_TO_GRAY # define PNG_NO_READ_USER_TRANSFORM # define PNG_NO_WRITE_USER_TRANSFORM # define PNG_NO_USER_MEM # define PNG_NO_READ_EMPTY_PLTE # define PNG_NO_MNG_FEATURES # define PNG_NO_FIXED_POINT_SUPPORTED #endif /* Ignore attempt to turn off both floating and fixed point support */ #if !defined(PNG_FLOATING_POINT_SUPPORTED) || \ !defined(PNG_NO_FIXED_POINT_SUPPORTED) # define PNG_FIXED_POINT_SUPPORTED #endif #ifndef PNG_NO_FREE_ME # define PNG_FREE_ME_SUPPORTED #endif #if defined(PNG_READ_SUPPORTED) #if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \ !defined(PNG_NO_READ_TRANSFORMS) # define PNG_READ_TRANSFORMS_SUPPORTED #endif #ifdef PNG_READ_TRANSFORMS_SUPPORTED # ifndef PNG_NO_READ_EXPAND # define PNG_READ_EXPAND_SUPPORTED # endif # ifndef PNG_NO_READ_SHIFT # define PNG_READ_SHIFT_SUPPORTED # endif # ifndef PNG_NO_READ_PACK # define PNG_READ_PACK_SUPPORTED # endif # ifndef PNG_NO_READ_BGR # define PNG_READ_BGR_SUPPORTED # endif # ifndef PNG_NO_READ_SWAP # define PNG_READ_SWAP_SUPPORTED # endif # ifndef PNG_NO_READ_PACKSWAP # define PNG_READ_PACKSWAP_SUPPORTED # endif # ifndef PNG_NO_READ_INVERT # define PNG_READ_INVERT_SUPPORTED # endif # ifndef PNG_NO_READ_DITHER # define PNG_READ_DITHER_SUPPORTED # endif # ifndef PNG_NO_READ_BACKGROUND # define PNG_READ_BACKGROUND_SUPPORTED # endif # ifndef PNG_NO_READ_16_TO_8 # define PNG_READ_16_TO_8_SUPPORTED # endif # ifndef PNG_NO_READ_FILLER # define PNG_READ_FILLER_SUPPORTED # endif # ifndef PNG_NO_READ_GAMMA # define PNG_READ_GAMMA_SUPPORTED # endif # ifndef PNG_NO_READ_GRAY_TO_RGB # define PNG_READ_GRAY_TO_RGB_SUPPORTED # endif # ifndef PNG_NO_READ_SWAP_ALPHA # define PNG_READ_SWAP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_INVERT_ALPHA # define PNG_READ_INVERT_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_STRIP_ALPHA # define PNG_READ_STRIP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_USER_TRANSFORM # define PNG_READ_USER_TRANSFORM_SUPPORTED # endif # ifndef PNG_NO_READ_RGB_TO_GRAY # define PNG_READ_RGB_TO_GRAY_SUPPORTED # endif #endif /* PNG_READ_TRANSFORMS_SUPPORTED */ #if !defined(PNG_NO_PROGRESSIVE_READ) && \ !defined(PNG_PROGRESSIVE_READ_SUPPORTED) /* if you don't do progressive */ # define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */ #endif /* about interlacing capability! You'll */ /* still have interlacing unless you change the following line: */ #define PNG_READ_INTERLACING_SUPPORTED /* required in PNG-compliant decoders */ #ifndef PNG_NO_READ_COMPOSITE_NODIV # ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */ # define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */ # endif #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Deprecated, will be removed from version 2.0.0. Use PNG_MNG_FEATURES_SUPPORTED instead. */ #ifndef PNG_NO_READ_EMPTY_PLTE # define PNG_READ_EMPTY_PLTE_SUPPORTED #endif #endif #endif /* PNG_READ_SUPPORTED */ #if defined(PNG_WRITE_SUPPORTED) # if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \ !defined(PNG_NO_WRITE_TRANSFORMS) # define PNG_WRITE_TRANSFORMS_SUPPORTED #endif #ifdef PNG_WRITE_TRANSFORMS_SUPPORTED # ifndef PNG_NO_WRITE_SHIFT # define PNG_WRITE_SHIFT_SUPPORTED # endif # ifndef PNG_NO_WRITE_PACK # define PNG_WRITE_PACK_SUPPORTED # endif # ifndef PNG_NO_WRITE_BGR # define PNG_WRITE_BGR_SUPPORTED # endif # ifndef PNG_NO_WRITE_SWAP # define PNG_WRITE_SWAP_SUPPORTED # endif # ifndef PNG_NO_WRITE_PACKSWAP # define PNG_WRITE_PACKSWAP_SUPPORTED # endif # ifndef PNG_NO_WRITE_INVERT # define PNG_WRITE_INVERT_SUPPORTED # endif # ifndef PNG_NO_WRITE_FILLER # define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */ # endif # ifndef PNG_NO_WRITE_SWAP_ALPHA # define PNG_WRITE_SWAP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_WRITE_INVERT_ALPHA # define PNG_WRITE_INVERT_ALPHA_SUPPORTED # endif # ifndef PNG_NO_WRITE_USER_TRANSFORM # define PNG_WRITE_USER_TRANSFORM_SUPPORTED # endif #endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ #if !defined(PNG_NO_WRITE_INTERLACING_SUPPORTED) && \ !defined(PNG_WRITE_INTERLACING_SUPPORTED) #define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant encoders, but can cause trouble if left undefined */ #endif #if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \ !defined(PNG_WRITE_WEIGHTED_FILTER) && \ defined(PNG_FLOATING_POINT_SUPPORTED) # define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED #endif #ifndef PNG_NO_WRITE_FLUSH # define PNG_WRITE_FLUSH_SUPPORTED #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */ #ifndef PNG_NO_WRITE_EMPTY_PLTE # define PNG_WRITE_EMPTY_PLTE_SUPPORTED #endif #endif #endif /* PNG_WRITE_SUPPORTED */ #ifndef PNG_1_0_X # ifndef PNG_NO_ERROR_NUMBERS # define PNG_ERROR_NUMBERS_SUPPORTED # endif #endif /* PNG_1_0_X */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) # ifndef PNG_NO_USER_TRANSFORM_PTR # define PNG_USER_TRANSFORM_PTR_SUPPORTED # endif #endif #ifndef PNG_NO_STDIO # define PNG_TIME_RFC1123_SUPPORTED #endif /* This adds extra functions in pngget.c for accessing data from the * info pointer (added in version 0.99) * png_get_image_width() * png_get_image_height() * png_get_bit_depth() * png_get_color_type() * png_get_compression_type() * png_get_filter_type() * png_get_interlace_type() * png_get_pixel_aspect_ratio() * png_get_pixels_per_meter() * png_get_x_offset_pixels() * png_get_y_offset_pixels() * png_get_x_offset_microns() * png_get_y_offset_microns() */ #if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED) # define PNG_EASY_ACCESS_SUPPORTED #endif /* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0 * and removed from version 1.2.20. The following will be removed * from libpng-1.4.0 */ #if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_OPTIMIZED_CODE) # ifndef PNG_OPTIMIZED_CODE_SUPPORTED # define PNG_OPTIMIZED_CODE_SUPPORTED # endif #endif #if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE) && defined(__i386__) # ifndef PNG_ASSEMBLER_CODE_SUPPORTED # define PNG_ASSEMBLER_CODE_SUPPORTED # endif # if defined(__GNUC__) && defined(__x86_64__) && (__GNUC__ < 4) /* work around 64-bit gcc compiler bugs in gcc-3.x */ # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_NO_MMX_CODE # endif # endif # if defined(__APPLE__) # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_NO_MMX_CODE # endif # endif # if (defined(__MWERKS__) && ((__MWERKS__ < 0x0900) || macintosh)) # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_NO_MMX_CODE # endif # endif # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_MMX_CODE_SUPPORTED # endif #endif /* end of obsolete code to be removed from libpng-1.4.0 */ #if !defined(PNG_1_0_X) #if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED) # define PNG_USER_MEM_SUPPORTED #endif #endif /* PNG_1_0_X */ /* Added at libpng-1.2.6 */ #if !defined(PNG_1_0_X) #ifndef PNG_SET_USER_LIMITS_SUPPORTED #if !defined(PNG_NO_SET_USER_LIMITS) && !defined(PNG_SET_USER_LIMITS_SUPPORTED) # define PNG_SET_USER_LIMITS_SUPPORTED #endif #endif #endif /* PNG_1_0_X */ /* Added at libpng-1.0.16 and 1.2.6. To accept all valid PNGS no matter * how large, set these limits to 0x7fffffffL */ #ifndef PNG_USER_WIDTH_MAX # define PNG_USER_WIDTH_MAX 1000000L #endif #ifndef PNG_USER_HEIGHT_MAX # define PNG_USER_HEIGHT_MAX 1000000L #endif /* Added at libpng-1.2.34 and 1.4.0 */ #ifndef PNG_STRING_NEWLINE #define PNG_STRING_NEWLINE "\n" #endif /* These are currently experimental features, define them if you want */ /* very little testing */ /* #ifdef PNG_READ_SUPPORTED # ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED # define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED # endif #endif */ /* This is only for PowerPC big-endian and 680x0 systems */ /* some testing */ /* #ifndef PNG_READ_BIG_ENDIAN_SUPPORTED # define PNG_READ_BIG_ENDIAN_SUPPORTED #endif */ /* Buggy compilers (e.g., gcc 2.7.2.2) need this */ /* #define PNG_NO_POINTER_INDEXING */ /* These functions are turned off by default, as they will be phased out. */ /* #define PNG_USELESS_TESTS_SUPPORTED #define PNG_CORRECT_PALETTE_SUPPORTED */ /* Any chunks you are not interested in, you can undef here. The * ones that allocate memory may be expecially important (hIST, * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info * a bit smaller. */ #if defined(PNG_READ_SUPPORTED) && \ !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ !defined(PNG_NO_READ_ANCILLARY_CHUNKS) # define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED #endif #if defined(PNG_WRITE_SUPPORTED) && \ !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS) # define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED #endif #ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED #ifdef PNG_NO_READ_TEXT # define PNG_NO_READ_iTXt # define PNG_NO_READ_tEXt # define PNG_NO_READ_zTXt #endif #ifndef PNG_NO_READ_bKGD # define PNG_READ_bKGD_SUPPORTED # define PNG_bKGD_SUPPORTED #endif #ifndef PNG_NO_READ_cHRM # define PNG_READ_cHRM_SUPPORTED # define PNG_cHRM_SUPPORTED #endif #ifndef PNG_NO_READ_gAMA # define PNG_READ_gAMA_SUPPORTED # define PNG_gAMA_SUPPORTED #endif #ifndef PNG_NO_READ_hIST # define PNG_READ_hIST_SUPPORTED # define PNG_hIST_SUPPORTED #endif #ifndef PNG_NO_READ_iCCP # define PNG_READ_iCCP_SUPPORTED # define PNG_iCCP_SUPPORTED #endif #ifndef PNG_NO_READ_iTXt # ifndef PNG_READ_iTXt_SUPPORTED # define PNG_READ_iTXt_SUPPORTED # endif # ifndef PNG_iTXt_SUPPORTED # define PNG_iTXt_SUPPORTED # endif #endif #ifndef PNG_NO_READ_oFFs # define PNG_READ_oFFs_SUPPORTED # define PNG_oFFs_SUPPORTED #endif #ifndef PNG_NO_READ_pCAL # define PNG_READ_pCAL_SUPPORTED # define PNG_pCAL_SUPPORTED #endif #ifndef PNG_NO_READ_sCAL # define PNG_READ_sCAL_SUPPORTED # define PNG_sCAL_SUPPORTED #endif #ifndef PNG_NO_READ_pHYs # define PNG_READ_pHYs_SUPPORTED # define PNG_pHYs_SUPPORTED #endif #ifndef PNG_NO_READ_sBIT # define PNG_READ_sBIT_SUPPORTED # define PNG_sBIT_SUPPORTED #endif #ifndef PNG_NO_READ_sPLT # define PNG_READ_sPLT_SUPPORTED # define PNG_sPLT_SUPPORTED #endif #ifndef PNG_NO_READ_sRGB # define PNG_READ_sRGB_SUPPORTED # define PNG_sRGB_SUPPORTED #endif #ifndef PNG_NO_READ_tEXt # define PNG_READ_tEXt_SUPPORTED # define PNG_tEXt_SUPPORTED #endif #ifndef PNG_NO_READ_tIME # define PNG_READ_tIME_SUPPORTED # define PNG_tIME_SUPPORTED #endif #ifndef PNG_NO_READ_tRNS # define PNG_READ_tRNS_SUPPORTED # define PNG_tRNS_SUPPORTED #endif #ifndef PNG_NO_READ_zTXt # define PNG_READ_zTXt_SUPPORTED # define PNG_zTXt_SUPPORTED #endif #ifndef PNG_NO_READ_UNKNOWN_CHUNKS # define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED # define PNG_UNKNOWN_CHUNKS_SUPPORTED # endif # ifndef PNG_NO_HANDLE_AS_UNKNOWN # define PNG_HANDLE_AS_UNKNOWN_SUPPORTED # endif #endif #if !defined(PNG_NO_READ_USER_CHUNKS) && \ defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) # define PNG_READ_USER_CHUNKS_SUPPORTED # define PNG_USER_CHUNKS_SUPPORTED # ifdef PNG_NO_READ_UNKNOWN_CHUNKS # undef PNG_NO_READ_UNKNOWN_CHUNKS # endif # ifdef PNG_NO_HANDLE_AS_UNKNOWN # undef PNG_NO_HANDLE_AS_UNKNOWN # endif #endif #ifndef PNG_NO_READ_OPT_PLTE # define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */ #endif /* optional PLTE chunk in RGB and RGBA images */ #if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \ defined(PNG_READ_zTXt_SUPPORTED) # define PNG_READ_TEXT_SUPPORTED # define PNG_TEXT_SUPPORTED #endif #endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */ #ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED #ifdef PNG_NO_WRITE_TEXT # define PNG_NO_WRITE_iTXt # define PNG_NO_WRITE_tEXt # define PNG_NO_WRITE_zTXt #endif #ifndef PNG_NO_WRITE_bKGD # define PNG_WRITE_bKGD_SUPPORTED # ifndef PNG_bKGD_SUPPORTED # define PNG_bKGD_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_cHRM # define PNG_WRITE_cHRM_SUPPORTED # ifndef PNG_cHRM_SUPPORTED # define PNG_cHRM_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_gAMA # define PNG_WRITE_gAMA_SUPPORTED # ifndef PNG_gAMA_SUPPORTED # define PNG_gAMA_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_hIST # define PNG_WRITE_hIST_SUPPORTED # ifndef PNG_hIST_SUPPORTED # define PNG_hIST_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_iCCP # define PNG_WRITE_iCCP_SUPPORTED # ifndef PNG_iCCP_SUPPORTED # define PNG_iCCP_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_iTXt # ifndef PNG_WRITE_iTXt_SUPPORTED # define PNG_WRITE_iTXt_SUPPORTED # endif # ifndef PNG_iTXt_SUPPORTED # define PNG_iTXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_oFFs # define PNG_WRITE_oFFs_SUPPORTED # ifndef PNG_oFFs_SUPPORTED # define PNG_oFFs_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_pCAL # define PNG_WRITE_pCAL_SUPPORTED # ifndef PNG_pCAL_SUPPORTED # define PNG_pCAL_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sCAL # define PNG_WRITE_sCAL_SUPPORTED # ifndef PNG_sCAL_SUPPORTED # define PNG_sCAL_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_pHYs # define PNG_WRITE_pHYs_SUPPORTED # ifndef PNG_pHYs_SUPPORTED # define PNG_pHYs_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sBIT # define PNG_WRITE_sBIT_SUPPORTED # ifndef PNG_sBIT_SUPPORTED # define PNG_sBIT_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sPLT # define PNG_WRITE_sPLT_SUPPORTED # ifndef PNG_sPLT_SUPPORTED # define PNG_sPLT_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sRGB # define PNG_WRITE_sRGB_SUPPORTED # ifndef PNG_sRGB_SUPPORTED # define PNG_sRGB_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tEXt # define PNG_WRITE_tEXt_SUPPORTED # ifndef PNG_tEXt_SUPPORTED # define PNG_tEXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tIME # define PNG_WRITE_tIME_SUPPORTED # ifndef PNG_tIME_SUPPORTED # define PNG_tIME_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tRNS # define PNG_WRITE_tRNS_SUPPORTED # ifndef PNG_tRNS_SUPPORTED # define PNG_tRNS_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_zTXt # define PNG_WRITE_zTXt_SUPPORTED # ifndef PNG_zTXt_SUPPORTED # define PNG_zTXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS # define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED # define PNG_UNKNOWN_CHUNKS_SUPPORTED # endif # ifndef PNG_NO_HANDLE_AS_UNKNOWN # ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED # define PNG_HANDLE_AS_UNKNOWN_SUPPORTED # endif # endif #endif #if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \ defined(PNG_WRITE_zTXt_SUPPORTED) # define PNG_WRITE_TEXT_SUPPORTED # ifndef PNG_TEXT_SUPPORTED # define PNG_TEXT_SUPPORTED # endif #endif #endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */ /* Turn this off to disable png_read_png() and * png_write_png() and leave the row_pointers member * out of the info structure. */ #ifndef PNG_NO_INFO_IMAGE # define PNG_INFO_IMAGE_SUPPORTED #endif /* need the time information for reading tIME chunks */ #if defined(PNG_tIME_SUPPORTED) # if !defined(_WIN32_WCE) /* "time.h" functions are not supported on WindowsCE */ # include # endif #endif /* Some typedefs to get us started. These should be safe on most of the * common platforms. The typedefs should be at least as large as the * numbers suggest (a png_uint_32 must be at least 32 bits long), but they * don't have to be exactly that size. Some compilers dislike passing * unsigned shorts as function parameters, so you may be better off using * unsigned int for png_uint_16. Likewise, for 64-bit systems, you may * want to have unsigned int for png_uint_32 instead of unsigned long. */ typedef unsigned long png_uint_32; typedef long png_int_32; typedef unsigned short png_uint_16; typedef short png_int_16; typedef unsigned char png_byte; /* This is usually size_t. It is typedef'ed just in case you need it to change (I'm not sure if you will or not, so I thought I'd be safe) */ #ifdef PNG_SIZE_T typedef PNG_SIZE_T png_size_t; # define png_sizeof(x) png_convert_size(sizeof(x)) #else typedef size_t png_size_t; # define png_sizeof(x) sizeof(x) #endif /* The following is needed for medium model support. It cannot be in the * PNG_INTERNAL section. Needs modification for other compilers besides * MSC. Model independent support declares all arrays and pointers to be * large using the far keyword. The zlib version used must also support * model independent data. As of version zlib 1.0.4, the necessary changes * have been made in zlib. The USE_FAR_KEYWORD define triggers other * changes that are needed. (Tim Wegner) */ /* Separate compiler dependencies (problem here is that zlib.h always defines FAR. (SJT) */ #ifdef __BORLANDC__ # if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) # define LDATA 1 # else # define LDATA 0 # endif /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ # if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) # define PNG_MAX_MALLOC_64K # if (LDATA != 1) # ifndef FAR # define FAR __far # endif # define USE_FAR_KEYWORD # endif /* LDATA != 1 */ /* Possibly useful for moving data out of default segment. * Uncomment it if you want. Could also define FARDATA as * const if your compiler supports it. (SJT) # define FARDATA FAR */ # endif /* __WIN32__, __FLAT__, __CYGWIN__ */ #endif /* __BORLANDC__ */ /* Suggest testing for specific compiler first before testing for * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, * making reliance oncertain keywords suspect. (SJT) */ /* MSC Medium model */ #if defined(FAR) # if defined(M_I86MM) # define USE_FAR_KEYWORD # define FARDATA FAR # include # endif #endif /* SJT: default case */ #ifndef FAR # define FAR #endif /* At this point FAR is always defined */ #ifndef FARDATA # define FARDATA #endif /* Typedef for floating-point numbers that are converted to fixed-point with a multiple of 100,000, e.g., int_gamma */ typedef png_int_32 png_fixed_point; /* Add typedefs for pointers */ typedef void FAR * png_voidp; typedef png_byte FAR * png_bytep; typedef png_uint_32 FAR * png_uint_32p; typedef png_int_32 FAR * png_int_32p; typedef png_uint_16 FAR * png_uint_16p; typedef png_int_16 FAR * png_int_16p; typedef PNG_CONST char FAR * png_const_charp; typedef char FAR * png_charp; typedef png_fixed_point FAR * png_fixed_point_p; #ifndef PNG_NO_STDIO #if defined(_WIN32_WCE) typedef HANDLE png_FILE_p; #else typedef FILE * png_FILE_p; #endif #endif #ifdef PNG_FLOATING_POINT_SUPPORTED typedef double FAR * png_doublep; #endif /* Pointers to pointers; i.e. arrays */ typedef png_byte FAR * FAR * png_bytepp; typedef png_uint_32 FAR * FAR * png_uint_32pp; typedef png_int_32 FAR * FAR * png_int_32pp; typedef png_uint_16 FAR * FAR * png_uint_16pp; typedef png_int_16 FAR * FAR * png_int_16pp; typedef PNG_CONST char FAR * FAR * png_const_charpp; typedef char FAR * FAR * png_charpp; typedef png_fixed_point FAR * FAR * png_fixed_point_pp; #ifdef PNG_FLOATING_POINT_SUPPORTED typedef double FAR * FAR * png_doublepp; #endif /* Pointers to pointers to pointers; i.e., pointer to array */ typedef char FAR * FAR * FAR * png_charppp; #if defined(PNG_1_0_X) || defined(PNG_1_2_X) /* SPC - Is this stuff deprecated? */ /* It'll be removed as of libpng-1.3.0 - GR-P */ /* libpng typedefs for types in zlib. If zlib changes * or another compression library is used, then change these. * Eliminates need to change all the source files. */ typedef charf * png_zcharp; typedef charf * FAR * png_zcharpp; typedef z_stream FAR * png_zstreamp; #endif /* (PNG_1_0_X) || defined(PNG_1_2_X) */ /* * Define PNG_BUILD_DLL if the module being built is a Windows * LIBPNG DLL. * * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL. * It is equivalent to Microsoft predefined macro _DLL that is * automatically defined when you compile using the share * version of the CRT (C Run-Time library) * * The cygwin mods make this behavior a little different: * Define PNG_BUILD_DLL if you are building a dll for use with cygwin * Define PNG_STATIC if you are building a static library for use with cygwin, * -or- if you are building an application that you want to link to the * static library. * PNG_USE_DLL is defined by default (no user action needed) unless one of * the other flags is defined. */ #if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL)) # define PNG_DLL #endif /* If CYGWIN, then disallow GLOBAL ARRAYS unless building a static lib. * When building a static lib, default to no GLOBAL ARRAYS, but allow * command-line override */ #if defined(__CYGWIN__) # if !defined(PNG_STATIC) # if defined(PNG_USE_GLOBAL_ARRAYS) # undef PNG_USE_GLOBAL_ARRAYS # endif # if !defined(PNG_USE_LOCAL_ARRAYS) # define PNG_USE_LOCAL_ARRAYS # endif # else # if defined(PNG_USE_LOCAL_ARRAYS) || defined(PNG_NO_GLOBAL_ARRAYS) # if defined(PNG_USE_GLOBAL_ARRAYS) # undef PNG_USE_GLOBAL_ARRAYS # endif # endif # endif # if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) # define PNG_USE_LOCAL_ARRAYS # endif #endif /* Do not use global arrays (helps with building DLL's) * They are no longer used in libpng itself, since version 1.0.5c, * but might be required for some pre-1.0.5c applications. */ #if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) # if defined(PNG_NO_GLOBAL_ARRAYS) || \ (defined(__GNUC__) && defined(PNG_DLL)) || defined(_MSC_VER) # define PNG_USE_LOCAL_ARRAYS # else # define PNG_USE_GLOBAL_ARRAYS # endif #endif #if defined(__CYGWIN__) # undef PNGAPI # define PNGAPI __cdecl # undef PNG_IMPEXP # define PNG_IMPEXP #endif /* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall", * you may get warnings regarding the linkage of png_zalloc and png_zfree. * Don't ignore those warnings; you must also reset the default calling * convention in your compiler to match your PNGAPI, and you must build * zlib and your applications the same way you build libpng. */ #if defined(__MINGW32__) && !defined(PNG_MODULEDEF) # ifndef PNG_NO_MODULEDEF # define PNG_NO_MODULEDEF # endif #endif #if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF) # define PNG_IMPEXP #endif #if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \ (( defined(_Windows) || defined(_WINDOWS) || \ defined(WIN32) || defined(_WIN32) || defined(__WIN32__) )) # ifndef PNGAPI # if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) # define PNGAPI __cdecl # else # define PNGAPI _cdecl # endif # endif # if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \ 0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */) # define PNG_IMPEXP # endif # if !defined(PNG_IMPEXP) # define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol # define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol /* Borland/Microsoft */ # if defined(_MSC_VER) || defined(__BORLANDC__) # if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500) # define PNG_EXPORT PNG_EXPORT_TYPE1 # else # define PNG_EXPORT PNG_EXPORT_TYPE2 # if defined(PNG_BUILD_DLL) # define PNG_IMPEXP __export # else # define PNG_IMPEXP /*__import */ /* doesn't exist AFAIK in VC++ */ # endif /* Exists in Borland C++ for C++ classes (== huge) */ # endif # endif # if !defined(PNG_IMPEXP) # if defined(PNG_BUILD_DLL) # define PNG_IMPEXP __declspec(dllexport) # else # define PNG_IMPEXP __declspec(dllimport) # endif # endif # endif /* PNG_IMPEXP */ #else /* !(DLL || non-cygwin WINDOWS) */ # if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) # ifndef PNGAPI # define PNGAPI _System # endif # else # if 0 /* ... other platforms, with other meanings */ # endif # endif #endif #ifndef PNGAPI # define PNGAPI #endif #ifndef PNG_IMPEXP # define PNG_IMPEXP #endif #ifdef PNG_BUILDSYMS # ifndef PNG_EXPORT # define PNG_EXPORT(type,symbol) PNG_FUNCTION_EXPORT symbol END # endif # ifdef PNG_USE_GLOBAL_ARRAYS # ifndef PNG_EXPORT_VAR # define PNG_EXPORT_VAR(type) PNG_DATA_EXPORT # endif # endif #endif #ifndef PNG_EXPORT # define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol #endif #ifdef PNG_USE_GLOBAL_ARRAYS # ifndef PNG_EXPORT_VAR # define PNG_EXPORT_VAR(type) extern PNG_IMPEXP type # endif #endif /* User may want to use these so they are not in PNG_INTERNAL. Any library * functions that are passed far data must be model independent. */ #ifndef PNG_ABORT # define PNG_ABORT() abort() #endif #ifdef PNG_SETJMP_SUPPORTED # define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) #else # define png_jmpbuf(png_ptr) \ (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED) #endif #if defined(USE_FAR_KEYWORD) /* memory model independent fns */ /* use this to make far-to-near assignments */ # define CHECK 1 # define NOCHECK 0 # define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) # define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) # define png_snprintf _fsnprintf /* Added to v 1.2.19 */ # define png_strlen _fstrlen # define png_memcmp _fmemcmp /* SJT: added */ # define png_memcpy _fmemcpy # define png_memset _fmemset #else /* use the usual functions */ # define CVT_PTR(ptr) (ptr) # define CVT_PTR_NOCHECK(ptr) (ptr) # ifndef PNG_NO_SNPRINTF # ifdef _MSC_VER # define png_snprintf _snprintf /* Added to v 1.2.19 */ # define png_snprintf2 _snprintf # define png_snprintf6 _snprintf # else # define png_snprintf snprintf /* Added to v 1.2.19 */ # define png_snprintf2 snprintf # define png_snprintf6 snprintf # endif # else /* You don't have or don't want to use snprintf(). Caution: Using * sprintf instead of snprintf exposes your application to accidental * or malevolent buffer overflows. If you don't have snprintf() * as a general rule you should provide one (you can get one from * Portable OpenSSH). */ # define png_snprintf(s1,n,fmt,x1) sprintf(s1,fmt,x1) # define png_snprintf2(s1,n,fmt,x1,x2) sprintf(s1,fmt,x1,x2) # define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \ sprintf(s1,fmt,x1,x2,x3,x4,x5,x6) # endif # define png_strlen strlen # define png_memcmp memcmp /* SJT: added */ # define png_memcpy memcpy # define png_memset memset #endif /* End of memory model independent support */ /* Just a little check that someone hasn't tried to define something * contradictory. */ #if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K) # undef PNG_ZBUF_SIZE # define PNG_ZBUF_SIZE 65536L #endif /* Added at libpng-1.2.8 */ #endif /* PNG_VERSION_INFO_ONLY */ #endif /* PNGCONF_H */ angband-3.5.1/src/win/include/libpng12/png.h0000644000175000017500000045435712456456607020045 0ustar chriscchrisc/* png.h - header file for PNG reference library * * libpng version 1.2.37 - June 4, 2009 * Copyright (c) 1998-2009 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * Authors and maintainers: * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger * libpng versions 0.97, January 1998, through 1.2.37 - June 4, 2009: Glenn * See also "Contributing Authors", below. * * Note about libpng version numbers: * * Due to various miscommunications, unforeseen code incompatibilities * and occasional factors outside the authors' control, version numbering * on the library has not always been consistent and straightforward. * The following table summarizes matters since version 0.89c, which was * the first widely used release: * * source png.h png.h shared-lib * version string int version * ------- ------ ----- ---------- * 0.89c "1.0 beta 3" 0.89 89 1.0.89 * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] * 0.97c 0.97 97 2.0.97 * 0.98 0.98 98 2.0.98 * 0.99 0.99 98 2.0.99 * 0.99a-m 0.99 99 2.0.99 * 1.00 1.00 100 2.1.0 [100 should be 10000] * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] * 1.0.1 png.h string is 10001 2.1.0 * 1.0.1a-e identical to the 10002 from here on, the shared library * 1.0.2 source version) 10002 is 2.V where V is the source code * 1.0.2a-b 10003 version, except as noted. * 1.0.3 10003 * 1.0.3a-d 10004 * 1.0.4 10004 * 1.0.4a-f 10005 * 1.0.5 (+ 2 patches) 10005 * 1.0.5a-d 10006 * 1.0.5e-r 10100 (not source compatible) * 1.0.5s-v 10006 (not binary compatible) * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) * 1.0.6d-f 10007 (still binary incompatible) * 1.0.6g 10007 * 1.0.6h 10007 10.6h (testing xy.z so-numbering) * 1.0.6i 10007 10.6i * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) * 1.0.7 1 10007 (still compatible) * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 * 1.0.8rc1 1 10008 2.1.0.8rc1 * 1.0.8 1 10008 2.1.0.8 * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 * 1.0.9rc1 1 10009 2.1.0.9rc1 * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 * 1.0.9rc2 1 10009 2.1.0.9rc2 * 1.0.9 1 10009 2.1.0.9 * 1.0.10beta1 1 10010 2.1.0.10beta1 * 1.0.10rc1 1 10010 2.1.0.10rc1 * 1.0.10 1 10010 2.1.0.10 * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 * 1.0.11rc1 1 10011 2.1.0.11rc1 * 1.0.11 1 10011 2.1.0.11 * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 * 1.0.12rc1 2 10012 2.1.0.12rc1 * 1.0.12 2 10012 2.1.0.12 * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 * 1.2.0rc1 3 10200 3.1.2.0rc1 * 1.2.0 3 10200 3.1.2.0 * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 * 1.2.1 3 10201 3.1.2.1 * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 * 1.0.13 10 10013 10.so.0.1.0.13 * 1.2.2 12 10202 12.so.0.1.2.2 * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 * 1.2.3 12 10203 12.so.0.1.2.3 * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 * 1.0.14 10 10014 10.so.0.1.0.14 * 1.2.4 13 10204 12.so.0.1.2.4 * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 * 1.0.15 10 10015 10.so.0.1.0.15 * 1.2.5 13 10205 12.so.0.1.2.5 * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 * 1.0.16 10 10016 10.so.0.1.0.16 * 1.2.6 13 10206 12.so.0.1.2.6 * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 * 1.0.17rc1 10 10017 10.so.0.1.0.17rc1 * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 * 1.0.17 10 10017 10.so.0.1.0.17 * 1.2.7 13 10207 12.so.0.1.2.7 * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 * 1.0.18rc1-5 10 10018 10.so.0.1.0.18rc1-5 * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 * 1.0.18 10 10018 10.so.0.1.0.18 * 1.2.8 13 10208 12.so.0.1.2.8 * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 * 1.2.9beta4-11 13 10209 12.so.0.9[.0] * 1.2.9rc1 13 10209 12.so.0.9[.0] * 1.2.9 13 10209 12.so.0.9[.0] * 1.2.10beta1-8 13 10210 12.so.0.10[.0] * 1.2.10rc1-3 13 10210 12.so.0.10[.0] * 1.2.10 13 10210 12.so.0.10[.0] * 1.2.11beta1-4 13 10211 12.so.0.11[.0] * 1.0.19rc1-5 10 10019 10.so.0.19[.0] * 1.2.11rc1-5 13 10211 12.so.0.11[.0] * 1.0.19 10 10019 10.so.0.19[.0] * 1.2.11 13 10211 12.so.0.11[.0] * 1.0.20 10 10020 10.so.0.20[.0] * 1.2.12 13 10212 12.so.0.12[.0] * 1.2.13beta1 13 10213 12.so.0.13[.0] * 1.0.21 10 10021 10.so.0.21[.0] * 1.2.13 13 10213 12.so.0.13[.0] * 1.2.14beta1-2 13 10214 12.so.0.14[.0] * 1.0.22rc1 10 10022 10.so.0.22[.0] * 1.2.14rc1 13 10214 12.so.0.14[.0] * 1.0.22 10 10022 10.so.0.22[.0] * 1.2.14 13 10214 12.so.0.14[.0] * 1.2.15beta1-6 13 10215 12.so.0.15[.0] * 1.0.23rc1-5 10 10023 10.so.0.23[.0] * 1.2.15rc1-5 13 10215 12.so.0.15[.0] * 1.0.23 10 10023 10.so.0.23[.0] * 1.2.15 13 10215 12.so.0.15[.0] * 1.2.16beta1-2 13 10216 12.so.0.16[.0] * 1.2.16rc1 13 10216 12.so.0.16[.0] * 1.0.24 10 10024 10.so.0.24[.0] * 1.2.16 13 10216 12.so.0.16[.0] * 1.2.17beta1-2 13 10217 12.so.0.17[.0] * 1.0.25rc1 10 10025 10.so.0.25[.0] * 1.2.17rc1-3 13 10217 12.so.0.17[.0] * 1.0.25 10 10025 10.so.0.25[.0] * 1.2.17 13 10217 12.so.0.17[.0] * 1.0.26 10 10026 10.so.0.26[.0] * 1.2.18 13 10218 12.so.0.18[.0] * 1.2.19beta1-31 13 10219 12.so.0.19[.0] * 1.0.27rc1-6 10 10027 10.so.0.27[.0] * 1.2.19rc1-6 13 10219 12.so.0.19[.0] * 1.0.27 10 10027 10.so.0.27[.0] * 1.2.19 13 10219 12.so.0.19[.0] * 1.2.20beta01-04 13 10220 12.so.0.20[.0] * 1.0.28rc1-6 10 10028 10.so.0.28[.0] * 1.2.20rc1-6 13 10220 12.so.0.20[.0] * 1.0.28 10 10028 10.so.0.28[.0] * 1.2.20 13 10220 12.so.0.20[.0] * 1.2.21beta1-2 13 10221 12.so.0.21[.0] * 1.2.21rc1-3 13 10221 12.so.0.21[.0] * 1.0.29 10 10029 10.so.0.29[.0] * 1.2.21 13 10221 12.so.0.21[.0] * 1.2.22beta1-4 13 10222 12.so.0.22[.0] * 1.0.30rc1 10 10030 10.so.0.30[.0] * 1.2.22rc1 13 10222 12.so.0.22[.0] * 1.0.30 10 10030 10.so.0.30[.0] * 1.2.22 13 10222 12.so.0.22[.0] * 1.2.23beta01-05 13 10223 12.so.0.23[.0] * 1.2.23rc01 13 10223 12.so.0.23[.0] * 1.2.23 13 10223 12.so.0.23[.0] * 1.2.24beta01-02 13 10224 12.so.0.24[.0] * 1.2.24rc01 13 10224 12.so.0.24[.0] * 1.2.24 13 10224 12.so.0.24[.0] * 1.2.25beta01-06 13 10225 12.so.0.25[.0] * 1.2.25rc01-02 13 10225 12.so.0.25[.0] * 1.0.31 10 10031 10.so.0.31[.0] * 1.2.25 13 10225 12.so.0.25[.0] * 1.2.26beta01-06 13 10226 12.so.0.26[.0] * 1.2.26rc01 13 10226 12.so.0.26[.0] * 1.2.26 13 10226 12.so.0.26[.0] * 1.0.32 10 10032 10.so.0.32[.0] * 1.2.27beta01-06 13 10227 12.so.0.27[.0] * 1.2.27rc01 13 10227 12.so.0.27[.0] * 1.0.33 10 10033 10.so.0.33[.0] * 1.2.27 13 10227 12.so.0.27[.0] * 1.0.34 10 10034 10.so.0.34[.0] * 1.2.28 13 10228 12.so.0.28[.0] * 1.2.29beta01-03 13 10229 12.so.0.29[.0] * 1.2.29rc01 13 10229 12.so.0.29[.0] * 1.0.35 10 10035 10.so.0.35[.0] * 1.2.29 13 10229 12.so.0.29[.0] * 1.0.37 10 10037 10.so.0.37[.0] * 1.2.30beta01-04 13 10230 12.so.0.30[.0] * 1.0.38rc01-08 10 10038 10.so.0.38[.0] * 1.2.30rc01-08 13 10230 12.so.0.30[.0] * 1.0.38 10 10038 10.so.0.38[.0] * 1.2.30 13 10230 12.so.0.30[.0] * 1.0.39rc01-03 10 10039 10.so.0.39[.0] * 1.2.31rc01-03 13 10231 12.so.0.31[.0] * 1.0.39 10 10039 10.so.0.39[.0] * 1.2.31 13 10231 12.so.0.31[.0] * 1.2.32beta01-02 13 10232 12.so.0.32[.0] * 1.0.40rc01 10 10040 10.so.0.40[.0] * 1.2.32rc01 13 10232 12.so.0.32[.0] * 1.0.40 10 10040 10.so.0.40[.0] * 1.2.32 13 10232 12.so.0.32[.0] * 1.2.33beta01-02 13 10233 12.so.0.33[.0] * 1.2.33rc01-02 13 10233 12.so.0.33[.0] * 1.0.41rc01 10 10041 10.so.0.41[.0] * 1.2.33 13 10233 12.so.0.33[.0] * 1.0.41 10 10041 10.so.0.41[.0] * 1.2.34beta01-07 13 10234 12.so.0.34[.0] * 1.0.42rc01 10 10042 10.so.0.42[.0] * 1.2.34rc01 13 10234 12.so.0.34[.0] * 1.0.42 10 10042 10.so.0.42[.0] * 1.2.34 13 10234 12.so.0.34[.0] * 1.2.35beta01-03 13 10235 12.so.0.35[.0] * 1.0.43rc01-02 10 10043 10.so.0.43[.0] * 1.2.35rc01-02 13 10235 12.so.0.35[.0] * 1.0.43 10 10043 10.so.0.43[.0] * 1.2.35 13 10235 12.so.0.35[.0] * 1.2.36beta01-05 13 10236 12.so.0.36[.0] * 1.2.36rc01 13 10236 12.so.0.36[.0] * 1.0.44 10 10044 10.so.0.44[.0] * 1.2.36 13 10236 12.so.0.36[.0] * 1.2.37beta01-03 13 10237 12.so.0.37[.0] * 1.2.37rc01 13 10237 12.so.0.37[.0] * 1.2.37 13 10237 12.so.0.37[.0] * * Henceforth the source version will match the shared-library major * and minor numbers; the shared-library major version number will be * used for changes in backward compatibility, as it is intended. The * PNG_LIBPNG_VER macro, which is not used within libpng but is available * for applications, is an unsigned integer of the form xyyzz corresponding * to the source version x.y.z (leading zeros in y and z). Beta versions * were given the previous public release number plus a letter, until * version 1.0.6j; from then on they were given the upcoming public * release number plus "betaNN" or "rcNN". * * Binary incompatibility exists only when applications make direct access * to the info_ptr or png_ptr members through png.h, and the compiled * application is loaded with a different version of the library. * * DLLNUM will change each time there are forward or backward changes * in binary compatibility (e.g., when a new feature is added). * * See libpng.txt or libpng.3 for more information. The PNG specification * is available as a W3C Recommendation and as an ISO Specification, * defines should NOT be changed. */ #define PNG_INFO_gAMA 0x0001 #define PNG_INFO_sBIT 0x0002 #define PNG_INFO_cHRM 0x0004 #define PNG_INFO_PLTE 0x0008 #define PNG_INFO_tRNS 0x0010 #define PNG_INFO_bKGD 0x0020 #define PNG_INFO_hIST 0x0040 #define PNG_INFO_pHYs 0x0080 #define PNG_INFO_oFFs 0x0100 #define PNG_INFO_tIME 0x0200 #define PNG_INFO_pCAL 0x0400 #define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ #define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ #define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ #define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ #define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */ /* This is used for the transformation routines, as some of them * change these values for the row. It also should enable using * the routines for other purposes. */ typedef struct png_row_info_struct { png_uint_32 width; /* width of row */ png_uint_32 rowbytes; /* number of bytes in row */ png_byte color_type; /* color type of row */ png_byte bit_depth; /* bit depth of row */ png_byte channels; /* number of channels (1, 2, 3, or 4) */ png_byte pixel_depth; /* bits per pixel (depth * channels) */ } png_row_info; typedef png_row_info FAR * png_row_infop; typedef png_row_info FAR * FAR * png_row_infopp; /* These are the function types for the I/O functions and for the functions * that allow the user to override the default I/O functions with his or her * own. The png_error_ptr type should match that of user-supplied warning * and error functions, while the png_rw_ptr type should match that of the * user read/write data functions. */ typedef struct png_struct_def png_struct; typedef png_struct FAR * png_structp; typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t)); typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp)); typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32, int)); typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32, int)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop)); typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop)); typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep, png_uint_32, int)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp, png_row_infop, png_bytep)); #endif #if defined(PNG_USER_CHUNKS_SUPPORTED) typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp)); #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp)); #endif /* Transform masks for the high-level interface */ #define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ #define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ #define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ #define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ #define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ #define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ #define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ #define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ #define PNG_TRANSFORM_BGR 0x0080 /* read and write */ #define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ #define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ #define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ #define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* WRITE only, deprecated */ /* Added to libpng-1.2.34 */ #define PNG_TRANSFORM_STRIP_FILLER_BEFORE 0x0800 /* WRITE only */ #define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* WRITE only */ /* Flags for MNG supported features */ #define PNG_FLAG_MNG_EMPTY_PLTE 0x01 #define PNG_FLAG_MNG_FILTER_64 0x04 #define PNG_ALL_MNG_FEATURES 0x05 typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t)); typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp)); /* The structure that holds the information to read and write PNG files. * The only people who need to care about what is inside of this are the * people who will be modifying the library for their own special needs. * It should NOT be accessed directly by an application, except to store * the jmp_buf. */ struct png_struct_def { #ifdef PNG_SETJMP_SUPPORTED jmp_buf jmpbuf; /* used in png_error */ #endif png_error_ptr error_fn; /* function for printing errors and aborting */ png_error_ptr warning_fn; /* function for printing warnings */ png_voidp error_ptr; /* user supplied struct for error functions */ png_rw_ptr write_data_fn; /* function for writing output data */ png_rw_ptr read_data_fn; /* function for reading input data */ png_voidp io_ptr; /* ptr to application struct for I/O functions */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) png_user_transform_ptr read_user_transform_fn; /* user read transform */ #endif #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) png_user_transform_ptr write_user_transform_fn; /* user write transform */ #endif /* These were added in libpng-1.0.2 */ #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) png_voidp user_transform_ptr; /* user supplied struct for user transform */ png_byte user_transform_depth; /* bit depth of user transformed pixels */ png_byte user_transform_channels; /* channels in user transformed pixels */ #endif #endif png_uint_32 mode; /* tells us where we are in the PNG file */ png_uint_32 flags; /* flags indicating various things to libpng */ png_uint_32 transformations; /* which transformations to perform */ z_stream zstream; /* pointer to decompression structure (below) */ png_bytep zbuf; /* buffer for zlib */ png_size_t zbuf_size; /* size of zbuf */ int zlib_level; /* holds zlib compression level */ int zlib_method; /* holds zlib compression method */ int zlib_window_bits; /* holds zlib compression window bits */ int zlib_mem_level; /* holds zlib compression memory level */ int zlib_strategy; /* holds zlib compression strategy */ png_uint_32 width; /* width of image in pixels */ png_uint_32 height; /* height of image in pixels */ png_uint_32 num_rows; /* number of rows in current pass */ png_uint_32 usr_width; /* width of row at start of write */ png_uint_32 rowbytes; /* size of row in bytes */ png_uint_32 irowbytes; /* size of current interlaced row in bytes */ png_uint_32 iwidth; /* width of current interlaced row in pixels */ png_uint_32 row_number; /* current row in interlace pass */ png_bytep prev_row; /* buffer to save previous (unfiltered) row */ png_bytep row_buf; /* buffer to save current (unfiltered) row */ #ifndef PNG_NO_WRITE_FILTER png_bytep sub_row; /* buffer to save "sub" row when filtering */ png_bytep up_row; /* buffer to save "up" row when filtering */ png_bytep avg_row; /* buffer to save "avg" row when filtering */ png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ #endif png_row_info row_info; /* used for transformation routines */ png_uint_32 idat_size; /* current IDAT size for read */ png_uint_32 crc; /* current chunk CRC value */ png_colorp palette; /* palette from the input file */ png_uint_16 num_palette; /* number of color entries in palette */ png_uint_16 num_trans; /* number of transparency values */ png_byte chunk_name[5]; /* null-terminated name of current chunk */ png_byte compression; /* file compression type (always 0) */ png_byte filter; /* file filter type (always 0) */ png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ png_byte pass; /* current interlace pass (0 - 6) */ png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ png_byte color_type; /* color type of file */ png_byte bit_depth; /* bit depth of file */ png_byte usr_bit_depth; /* bit depth of users row */ png_byte pixel_depth; /* number of bits per pixel */ png_byte channels; /* number of channels in file */ png_byte usr_channels; /* channels at start of write */ png_byte sig_bytes; /* magic bytes read/written from start of file */ #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) #ifdef PNG_LEGACY_SUPPORTED png_byte filler; /* filler byte for pixel expansion */ #else png_uint_16 filler; /* filler bytes for pixel expansion */ #endif #endif #if defined(PNG_bKGD_SUPPORTED) png_byte background_gamma_type; # ifdef PNG_FLOATING_POINT_SUPPORTED float background_gamma; # endif png_color_16 background; /* background color in screen gamma space */ #if defined(PNG_READ_GAMMA_SUPPORTED) png_color_16 background_1; /* background normalized to gamma 1.0 */ #endif #endif /* PNG_bKGD_SUPPORTED */ #if defined(PNG_WRITE_FLUSH_SUPPORTED) png_flush_ptr output_flush_fn;/* Function for flushing output */ png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ png_uint_32 flush_rows; /* number of rows written since last flush */ #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) int gamma_shift; /* number of "insignificant" bits 16-bit gamma */ #ifdef PNG_FLOATING_POINT_SUPPORTED float gamma; /* file gamma value */ float screen_gamma; /* screen gamma value (display_exponent) */ #endif #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytep gamma_table; /* gamma table for 8-bit depth files */ png_bytep gamma_from_1; /* converts from 1.0 to screen */ png_bytep gamma_to_1; /* converts from file to 1.0 */ png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) png_color_8 sig_bit; /* significant bits in each available channel */ #endif #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) png_color_8 shift; /* shift for significant bit tranformation */ #endif #if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytep trans; /* transparency values for paletted files */ png_color_16 trans_values; /* transparency values for non-paletted files */ #endif png_read_status_ptr read_row_fn; /* called after each row is decoded */ png_write_status_ptr write_row_fn; /* called after each row is encoded */ #ifdef PNG_PROGRESSIVE_READ_SUPPORTED png_progressive_info_ptr info_fn; /* called after header data fully read */ png_progressive_row_ptr row_fn; /* called after each prog. row is decoded */ png_progressive_end_ptr end_fn; /* called after image is complete */ png_bytep save_buffer_ptr; /* current location in save_buffer */ png_bytep save_buffer; /* buffer for previously read data */ png_bytep current_buffer_ptr; /* current location in current_buffer */ png_bytep current_buffer; /* buffer for recently used data */ png_uint_32 push_length; /* size of current input chunk */ png_uint_32 skip_length; /* bytes to skip in input data */ png_size_t save_buffer_size; /* amount of data now in save_buffer */ png_size_t save_buffer_max; /* total size of save_buffer */ png_size_t buffer_size; /* total amount of available input data */ png_size_t current_buffer_size; /* amount of data now in current_buffer */ int process_mode; /* what push library is currently doing */ int cur_palette; /* current push library palette index */ # if defined(PNG_TEXT_SUPPORTED) png_size_t current_text_size; /* current size of text input data */ png_size_t current_text_left; /* how much text left to read in input */ png_charp current_text; /* current text chunk buffer */ png_charp current_text_ptr; /* current location in current_text */ # endif /* PNG_TEXT_SUPPORTED */ #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) /* for the Borland special 64K segment handler */ png_bytepp offset_table_ptr; png_bytep offset_table; png_uint_16 offset_table_number; png_uint_16 offset_table_count; png_uint_16 offset_table_count_free; #endif #if defined(PNG_READ_DITHER_SUPPORTED) png_bytep palette_lookup; /* lookup table for dithering */ png_bytep dither_index; /* index translation for palette files */ #endif #if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED) png_uint_16p hist; /* histogram */ #endif #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) png_byte heuristic_method; /* heuristic for row filter selection */ png_byte num_prev_filters; /* number of weights for previous rows */ png_bytep prev_filters; /* filter type(s) of previous row(s) */ png_uint_16p filter_weights; /* weight(s) for previous line(s) */ png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ png_uint_16p filter_costs; /* relative filter calculation cost */ png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ #endif #if defined(PNG_TIME_RFC1123_SUPPORTED) png_charp time_buffer; /* String to hold RFC 1123 time text */ #endif /* New members added in libpng-1.0.6 */ #ifdef PNG_FREE_ME_SUPPORTED png_uint_32 free_me; /* flags items libpng is responsible for freeing */ #endif #if defined(PNG_USER_CHUNKS_SUPPORTED) png_voidp user_chunk_ptr; png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) int num_chunk_list; png_bytep chunk_list; #endif /* New members added in libpng-1.0.3 */ #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) png_byte rgb_to_gray_status; /* These were changed from png_byte in libpng-1.0.6 */ png_uint_16 rgb_to_gray_red_coeff; png_uint_16 rgb_to_gray_green_coeff; png_uint_16 rgb_to_gray_blue_coeff; #endif /* New member added in libpng-1.0.4 (renamed in 1.0.9) */ #if defined(PNG_MNG_FEATURES_SUPPORTED) || \ defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) /* changed from png_byte to png_uint_32 at version 1.2.0 */ #ifdef PNG_1_0_X png_byte mng_features_permitted; #else png_uint_32 mng_features_permitted; #endif /* PNG_1_0_X */ #endif /* New member added in libpng-1.0.7 */ #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_fixed_point int_gamma; #endif /* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ #if defined(PNG_MNG_FEATURES_SUPPORTED) png_byte filter_type; #endif #if defined(PNG_1_0_X) /* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */ png_uint_32 row_buf_size; #endif /* New members added in libpng-1.2.0 */ #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) # if !defined(PNG_1_0_X) # if defined(PNG_MMX_CODE_SUPPORTED) png_byte mmx_bitdepth_threshold; png_uint_32 mmx_rowbytes_threshold; # endif png_uint_32 asm_flags; # endif #endif /* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ #ifdef PNG_USER_MEM_SUPPORTED png_voidp mem_ptr; /* user supplied struct for mem functions */ png_malloc_ptr malloc_fn; /* function for allocating memory */ png_free_ptr free_fn; /* function for freeing memory */ #endif /* New member added in libpng-1.0.13 and 1.2.0 */ png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ #if defined(PNG_READ_DITHER_SUPPORTED) /* The following three members were added at version 1.0.14 and 1.2.4 */ png_bytep dither_sort; /* working sort array */ png_bytep index_to_palette; /* where the original index currently is */ /* in the palette */ png_bytep palette_to_index; /* which original index points to this */ /* palette color */ #endif /* New members added in libpng-1.0.16 and 1.2.6 */ png_byte compression_type; #ifdef PNG_SET_USER_LIMITS_SUPPORTED png_uint_32 user_width_max; png_uint_32 user_height_max; #endif /* New member added in libpng-1.0.25 and 1.2.17 */ #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) /* storage for unknown chunk that the library doesn't recognize. */ png_unknown_chunk unknown_chunk; #endif /* New members added in libpng-1.2.26 */ png_uint_32 old_big_row_buf_size, old_prev_row_size; /* New member added in libpng-1.2.30 */ png_charp chunkdata; /* buffer for reading chunk data */ }; /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ typedef png_structp version_1_2_37; typedef png_struct FAR * FAR * png_structpp; /* Here are the function definitions most commonly used. This is not * the place to find out how to use libpng. See libpng.txt for the * full explanation, see example.c for the summary. This just provides * a simple one line description of the use of each function. */ /* Returns the version number of the library */ extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void)); /* Tell lib we have already handled the first magic bytes. * Handling more than 8 bytes from the beginning of the file is an error. */ extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr, int num_bytes)); /* Check sig[start] through sig[start + num_to_check - 1] to see if it's a * PNG file. Returns zero if the supplied bytes match the 8-byte PNG * signature, and non-zero otherwise. Having num_to_check == 0 or * start > 7 will always fail (ie return non-zero). */ extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start, png_size_t num_to_check)); /* Simple signature checking function. This is the same as calling * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). */ extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num)); /* Allocate and initialize png_ptr struct for reading, and any other memory. */ extern PNG_EXPORT(png_structp,png_create_read_struct) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)); /* Allocate and initialize png_ptr struct for writing, and any other memory */ extern PNG_EXPORT(png_structp,png_create_write_struct) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)); #ifdef PNG_WRITE_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_WRITE_SUPPORTED extern PNG_EXPORT(void,png_set_compression_buffer_size) PNGARG((png_structp png_ptr, png_uint_32 size)); #endif /* Reset the compression stream */ extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr)); /* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ #ifdef PNG_USER_MEM_SUPPORTED extern PNG_EXPORT(png_structp,png_create_read_struct_2) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); extern PNG_EXPORT(png_structp,png_create_write_struct_2) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); #endif /* Write a PNG chunk - size, type, (optional) data, CRC. */ extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr, png_bytep chunk_name, png_bytep data, png_size_t length)); /* Write the start of a PNG chunk - length and chunk name. */ extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr, png_bytep chunk_name, png_uint_32 length)); /* Write the data of a PNG chunk started with png_write_chunk_start(). */ extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Finish a chunk started with png_write_chunk_start() (includes CRC). */ extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr)); /* Allocate and initialize the info structure */ extern PNG_EXPORT(png_infop,png_create_info_struct) PNGARG((png_structp png_ptr)); #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Initialize the info structure (old interface - DEPRECATED) */ extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr)); #undef png_info_init #define png_info_init(info_ptr) png_info_init_3(&info_ptr,\ png_sizeof(png_info)); #endif extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr, png_size_t png_info_struct_size)); /* Writes all the PNG information before the image. */ extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read the information before the actual image data. */ extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_TIME_RFC1123_SUPPORTED) extern PNG_EXPORT(png_charp,png_convert_to_rfc1123) PNGARG((png_structp png_ptr, png_timep ptime)); #endif #if !defined(_WIN32_WCE) /* "time.h" functions are not supported on WindowsCE */ #if defined(PNG_WRITE_tIME_SUPPORTED) /* convert from a struct tm to png_time */ extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime, struct tm FAR * ttime)); /* convert from time_t to png_time. Uses gmtime() */ extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime, time_t ttime)); #endif /* PNG_WRITE_tIME_SUPPORTED */ #endif /* _WIN32_WCE */ #if defined(PNG_READ_EXPAND_SUPPORTED) /* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr)); #if !defined(PNG_1_0_X) extern PNG_EXPORT(void,png_set_expand_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); #endif extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr)); #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Deprecated */ extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); #endif #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) /* Use blue, green, red order for pixels. */ extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) /* Expand the grayscale to 24-bit RGB if necessary. */ extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) /* Reduce RGB to grayscale. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr, int error_action, double red, double green )); #endif extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr, int error_action, png_fixed_point red, png_fixed_point green )); extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp png_ptr)); #endif extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth, png_colorp palette)); #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) /* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr, png_uint_32 filler, int flags)); /* The values of the PNG_FILLER_ defines should NOT be changed */ #define PNG_FILLER_BEFORE 0 #define PNG_FILLER_AFTER 1 /* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ #if !defined(PNG_1_0_X) extern PNG_EXPORT(void,png_set_add_alpha) PNGARG((png_structp png_ptr, png_uint_32 filler, int flags)); #endif #endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) /* Swap bytes in 16-bit depth files. */ extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) /* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) /* Swap packing order of pixels in bytes. */ extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) /* Converts files to legal bit depths. */ extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr, png_color_8p true_bits)); #endif #if defined(PNG_READ_INTERLACING_SUPPORTED) || \ defined(PNG_WRITE_INTERLACING_SUPPORTED) /* Have the code handle the interlacing. Returns the number of passes. */ extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) /* Invert monochrome files */ extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) /* Handle alpha and tRNS by replacing with a background color. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr, png_color_16p background_color, int background_gamma_code, int need_expand, double background_gamma)); #endif #define PNG_BACKGROUND_GAMMA_UNKNOWN 0 #define PNG_BACKGROUND_GAMMA_SCREEN 1 #define PNG_BACKGROUND_GAMMA_FILE 2 #define PNG_BACKGROUND_GAMMA_UNIQUE 3 #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) /* strip the second byte of information from a 16-bit depth file. */ extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_DITHER_SUPPORTED) /* Turn on dithering, and reduce the palette to the number of colors available. */ extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr, png_colorp palette, int num_palette, int maximum_colors, png_uint_16p histogram, int full_dither)); #endif #if defined(PNG_READ_GAMMA_SUPPORTED) /* Handle gamma correction. Screen_gamma=(display_exponent) */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr, double screen_gamma, double default_file_gamma)); #endif #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) #if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) /* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */ /* Deprecated and will be removed. Use png_permit_mng_features() instead. */ extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr, int empty_plte_permitted)); #endif #endif #if defined(PNG_WRITE_FLUSH_SUPPORTED) /* Set how many lines between output flushes - 0 for no flushing */ extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows)); /* Flush the current PNG output buffer */ extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr)); #endif /* optional update palette with requested transformations */ extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr)); /* optional call to update the users info structure */ extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read one or more rows of image data. */ extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr, png_bytepp row, png_bytepp display_row, png_uint_32 num_rows)); #endif #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read a row of data. */ extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr, png_bytep row, png_bytep display_row)); #endif #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read the whole image into memory at once. */ extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr, png_bytepp image)); #endif /* write a row of image data */ extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr, png_bytep row)); /* write a few rows of image data */ extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr, png_bytepp row, png_uint_32 num_rows)); /* write the image data */ extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, png_bytepp image)); /* writes the end of the PNG file. */ extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read the end of the PNG file. */ extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* free any memory associated with the png_info_struct */ extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr, png_infopp info_ptr_ptr)); /* free any memory associated with the png_struct and the png_info_structs */ extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); /* free all memory used by the read (old method - NOT DLL EXPORTED) */ /* Debian note: exporting as it is required by legacy applications */ extern PNG_EXPORT(void,png_read_destroy) PNGARG((png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)); /* free any memory associated with the png_struct and the png_info_structs */ extern PNG_EXPORT(void,png_destroy_write_struct) PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)); /* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */ /* Debian note: exporting as it is required by legacy applications */ extern PNG_EXPORT(void,png_write_destroy) PNGARG((png_structp png_ptr)); /* set the libpng method of handling chunk CRC errors */ extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr, int crit_action, int ancil_action)); /* Values for png_set_crc_action() to say how to handle CRC errors in * ancillary and critical chunks, and whether to use the data contained * therein. Note that it is impossible to "discard" data in a critical * chunk. For versions prior to 0.90, the action was always error/quit, * whereas in version 0.90 and later, the action for CRC errors in ancillary * chunks is warn/discard. These values should NOT be changed. * * value action:critical action:ancillary */ #define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ #define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ #define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ #define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ #define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ #define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ /* These functions give the user control over the scan-line filtering in * libpng and the compression methods used by zlib. These functions are * mainly useful for testing, as the defaults should work with most users. * Those users who are tight on memory or want faster performance at the * expense of compression can modify them. See the compression library * header file (zlib.h) for an explination of the compression functions. */ /* set the filtering method(s) used by libpng. Currently, the only valid * value for "method" is 0. */ extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method, int filters)); /* Flags for png_set_filter() to say which filters to use. The flags * are chosen so that they don't conflict with real filter types * below, in case they are supplied instead of the #defined constants. * These values should NOT be changed. */ #define PNG_NO_FILTERS 0x00 #define PNG_FILTER_NONE 0x08 #define PNG_FILTER_SUB 0x10 #define PNG_FILTER_UP 0x20 #define PNG_FILTER_AVG 0x40 #define PNG_FILTER_PAETH 0x80 #define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ PNG_FILTER_AVG | PNG_FILTER_PAETH) /* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. * These defines should NOT be changed. */ #define PNG_FILTER_VALUE_NONE 0 #define PNG_FILTER_VALUE_SUB 1 #define PNG_FILTER_VALUE_UP 2 #define PNG_FILTER_VALUE_AVG 3 #define PNG_FILTER_VALUE_PAETH 4 #define PNG_FILTER_VALUE_LAST 5 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */ /* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ * defines, either the default (minimum-sum-of-absolute-differences), or * the experimental method (weighted-minimum-sum-of-absolute-differences). * * Weights are factors >= 1.0, indicating how important it is to keep the * filter type consistent between rows. Larger numbers mean the current * filter is that many times as likely to be the same as the "num_weights" * previous filters. This is cumulative for each previous row with a weight. * There needs to be "num_weights" values in "filter_weights", or it can be * NULL if the weights aren't being specified. Weights have no influence on * the selection of the first row filter. Well chosen weights can (in theory) * improve the compression for a given image. * * Costs are factors >= 1.0 indicating the relative decoding costs of a * filter type. Higher costs indicate more decoding expense, and are * therefore less likely to be selected over a filter with lower computational * costs. There needs to be a value in "filter_costs" for each valid filter * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't * setting the costs. Costs try to improve the speed of decompression without * unduly increasing the compressed image size. * * A negative weight or cost indicates the default value is to be used, and * values in the range [0.0, 1.0) indicate the value is to remain unchanged. * The default values for both weights and costs are currently 1.0, but may * change if good general weighting/cost heuristics can be found. If both * the weights and costs are set to 1.0, this degenerates the WEIGHTED method * to the UNWEIGHTED method, but with added encoding time/computation. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, int heuristic_method, int num_weights, png_doublep filter_weights, png_doublep filter_costs)); #endif #endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ /* Heuristic used for row filter selection. These defines should NOT be * changed. */ #define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ #define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ #define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ #define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ /* Set the library compression level. Currently, valid values range from * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 * (0 - no compression, 9 - "maximal" compression). Note that tests have * shown that zlib compression levels 3-6 usually perform as well as level 9 * for PNG images, and do considerably fewer caclulations. In the future, * these values may not correspond directly to the zlib compression levels. */ extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr, int level)); extern PNG_EXPORT(void,png_set_compression_mem_level) PNGARG((png_structp png_ptr, int mem_level)); extern PNG_EXPORT(void,png_set_compression_strategy) PNGARG((png_structp png_ptr, int strategy)); extern PNG_EXPORT(void,png_set_compression_window_bits) PNGARG((png_structp png_ptr, int window_bits)); extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr, int method)); /* These next functions are called for input/output, memory, and error * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, * and call standard C I/O routines such as fread(), fwrite(), and * fprintf(). These functions can be made to use other I/O routines * at run time for those applications that need to handle I/O in a * different manner by calling png_set_???_fn(). See libpng.txt for * more information. */ #if !defined(PNG_NO_STDIO) /* Initialize the input/output for the PNG file to the default functions. */ extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp)); #endif /* Replace the (error and abort), and warning functions with user * supplied functions. If no messages are to be printed you must still * write and use replacement functions. The replacement error_fn should * still do a longjmp to the last setjmp location if you are using this * method of error handling. If error_fn or warning_fn is NULL, the * default function will be used. */ extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); /* Return the user pointer associated with the error functions */ extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr)); /* Replace the default data output functions with a user supplied one(s). * If buffered output is not used, then output_flush_fn can be set to NULL. * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time * output_flush_fn will be ignored (and thus can be NULL). * It is probably a mistake to use NULL for output_flush_fn if * write_data_fn is not also NULL unless you have built libpng with * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's * default flush function, which uses the standard *FILE structure, will * be used. */ extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr, png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); /* Replace the default data input function with a user supplied one. */ extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr, png_voidp io_ptr, png_rw_ptr read_data_fn)); /* Return the user pointer associated with the I/O functions */ extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr, png_read_status_ptr read_row_fn)); extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr, png_write_status_ptr write_row_fn)); #ifdef PNG_USER_MEM_SUPPORTED /* Replace the default memory allocation functions with user supplied one(s). */ extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); /* Return the user pointer associated with the memory functions */ extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp png_ptr, png_user_transform_ptr read_user_transform_fn)); #endif #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp png_ptr, png_user_transform_ptr write_user_transform_fn)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp png_ptr, png_voidp user_transform_ptr, int user_transform_depth, int user_transform_channels)); /* Return the user pointer associated with the user transform functions */ extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_USER_CHUNKS_SUPPORTED extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr, png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_PROGRESSIVE_READ_SUPPORTED /* Sets the function callbacks for the push reader, and a pointer to a * user-defined structure available to the callback functions. */ extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr, png_voidp progressive_ptr, png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); /* returns the user pointer associated with the push read functions */ extern PNG_EXPORT(png_voidp,png_get_progressive_ptr) PNGARG((png_structp png_ptr)); /* function to be called when data becomes available */ extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep buffer, png_size_t buffer_size)); /* function that combines rows. Not very much different than the * png_combine_row() call. Is this even used????? */ extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr, png_bytep old_row, png_bytep new_row)); #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr, png_uint_32 size)); #if defined(PNG_1_0_X) # define png_malloc_warn png_malloc #else /* Added at libpng version 1.2.4 */ extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr, png_uint_32 size)); #endif /* frees a pointer allocated by png_malloc() */ extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr)); #if defined(PNG_1_0_X) /* Function to allocate memory for zlib. */ extern PNG_EXPORT(voidpf,png_zalloc) PNGARG((voidpf png_ptr, uInt items, uInt size)); /* Function to free memory for zlib */ extern PNG_EXPORT(void,png_zfree) PNGARG((voidpf png_ptr, voidpf ptr)); #endif /* Free data that was allocated internally */ extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 free_me, int num)); #ifdef PNG_FREE_ME_SUPPORTED /* Reassign responsibility for freeing existing data, whether allocated * by libpng or by the application */ extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr, png_infop info_ptr, int freer, png_uint_32 mask)); #endif /* assignments for png_data_freer */ #define PNG_DESTROY_WILL_FREE_DATA 1 #define PNG_SET_WILL_FREE_DATA 1 #define PNG_USER_WILL_FREE_DATA 2 /* Flags for png_ptr->free_me and info_ptr->free_me */ #define PNG_FREE_HIST 0x0008 #define PNG_FREE_ICCP 0x0010 #define PNG_FREE_SPLT 0x0020 #define PNG_FREE_ROWS 0x0040 #define PNG_FREE_PCAL 0x0080 #define PNG_FREE_SCAL 0x0100 #define PNG_FREE_UNKN 0x0200 #define PNG_FREE_LIST 0x0400 #define PNG_FREE_PLTE 0x1000 #define PNG_FREE_TRNS 0x2000 #define PNG_FREE_TEXT 0x4000 #define PNG_FREE_ALL 0x7fff #define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ #ifdef PNG_USER_MEM_SUPPORTED extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr, png_uint_32 size)); extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr, png_voidp ptr)); #endif extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr, png_voidp s1, png_voidp s2, png_uint_32 size)); extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr, png_voidp s1, int value, png_uint_32 size)); #if defined(USE_FAR_KEYWORD) /* memory model conversion function */ extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr, int check)); #endif /* USE_FAR_KEYWORD */ #ifndef PNG_NO_ERROR_TEXT /* Fatal error in PNG image of libpng - can't continue */ extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr, png_const_charp error_message)); /* The same, but the chunk name is prepended to the error string. */ extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr, png_const_charp error_message)); #else /* Fatal error in PNG image of libpng - can't continue */ extern PNG_EXPORT(void,png_err) PNGARG((png_structp png_ptr)); #endif #ifndef PNG_NO_WARNINGS /* Non-fatal error in libpng. Can continue, but may have a problem. */ extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr, png_const_charp warning_message)); #ifdef PNG_READ_SUPPORTED /* Non-fatal error in libpng, chunk name is prepended to message. */ extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr, png_const_charp warning_message)); #endif /* PNG_READ_SUPPORTED */ #endif /* PNG_NO_WARNINGS */ /* The png_set_ functions are for storing values in the png_info_struct. * Similarly, the png_get_ calls are used to read values from the * png_info_struct, either storing the parameters in the passed variables, or * setting pointers into the png_info_struct where the data is stored. The * png_get_ functions return a non-zero value if the data was available * in info_ptr, or return zero and do not change any of the parameters if the * data was not available. * * These functions should be used instead of directly accessing png_info * to avoid problems with future changes in the size and internal layout of * png_info_struct. */ /* Returns "flag" if chunk data is valid in info_ptr. */ extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 flag)); /* Returns number of bytes needed to hold a transformed row. */ extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_INFO_IMAGE_SUPPORTED) /* Returns row_pointers, which is an array of pointers to scanlines that was returned from png_read_png(). */ extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Set row_pointers, which is an array of pointers to scanlines for use by png_write_png(). */ extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)); #endif /* Returns number of color channels in image. */ extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifdef PNG_EASY_ACCESS_SUPPORTED /* Returns image width in pixels. */ extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image height in pixels. */ extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image bit_depth. */ extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image color_type. */ extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image filter_type. */ extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image interlace_type. */ extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image compression_type. */ extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image resolution in pixels per meter, from pHYs chunk data. */ extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns pixel aspect ratio, computed from pHYs chunk data. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* PNG_EASY_ACCESS_SUPPORTED */ /* Returns pointer to signature string read from PNG header */ extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_bKGD_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_16p *background)); #endif #if defined(PNG_bKGD_SUPPORTED) extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_16p background)); #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, double *white_x, double *white_y, double *red_x, double *red_y, double *green_x, double *green_y, double *blue_x, double *blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y, png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point *int_blue_x, png_fixed_point *int_blue_y)); #endif #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, double green_y, double blue_x, double blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif #endif #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr, png_infop info_ptr, double *file_gamma)); #endif extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point *int_file_gamma)); #endif #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr, png_infop info_ptr, double file_gamma)); #endif extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point int_file_gamma)); #endif #if defined(PNG_hIST_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)); #endif #if defined(PNG_hIST_SUPPORTED) extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)); #endif extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, int *interlace_method, int *compression_method, int *filter_method)); extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int interlace_method, int compression_method, int filter_method)); #if defined(PNG_oFFs_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)); #endif #if defined(PNG_oFFs_SUPPORTED) extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y, int unit_type)); #endif #if defined(PNG_pCAL_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, png_charp *units, png_charpp *params)); #endif #if defined(PNG_pCAL_SUPPORTED) extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_charp units, png_charpp params)); #endif #if defined(PNG_pHYs_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); #endif #if defined(PNG_pHYs_SUPPORTED) extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); #endif extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr, png_colorp *palette, int *num_palette)); extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr, png_colorp palette, int num_palette)); #if defined(PNG_sBIT_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)); #endif #if defined(PNG_sBIT_SUPPORTED) extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_8p sig_bit)); #endif #if defined(PNG_sRGB_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr, png_infop info_ptr, int *intent)); #endif #if defined(PNG_sRGB_SUPPORTED) extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr, png_infop info_ptr, int intent)); extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, int intent)); #endif #if defined(PNG_iCCP_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charpp name, int *compression_type, png_charpp profile, png_uint_32 *proflen)); /* Note to maintainer: profile should be png_bytepp */ #endif #if defined(PNG_iCCP_SUPPORTED) extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp name, int compression_type, png_charp profile, png_uint_32 proflen)); /* Note to maintainer: profile should be png_bytep */ #endif #if defined(PNG_sPLT_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_sPLT_tpp entries)); #endif #if defined(PNG_sPLT_SUPPORTED) extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_sPLT_tp entries, int nentries)); #endif #if defined(PNG_TEXT_SUPPORTED) /* png_get_text also returns the number of text chunks in *num_text */ extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, int *num_text)); #endif /* * Note while png_set_text() will accept a structure whose text, * language, and translated keywords are NULL pointers, the structure * returned by png_get_text will always contain regular * zero-terminated C strings. They might be empty strings but * they will never be NULL pointers. */ #if defined(PNG_TEXT_SUPPORTED) extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, int num_text)); #endif #if defined(PNG_tIME_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)); #endif #if defined(PNG_tIME_SUPPORTED) extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr, png_infop info_ptr, png_timep mod_time)); #endif #if defined(PNG_tRNS_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep *trans, int *num_trans, png_color_16p *trans_values)); #endif #if defined(PNG_tRNS_SUPPORTED) extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep trans, int num_trans, png_color_16p trans_values)); #endif #if defined(PNG_tRNS_SUPPORTED) #endif #if defined(PNG_sCAL_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, int *unit, double *width, double *height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr, png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight)); #endif #endif #endif /* PNG_sCAL_SUPPORTED */ #if defined(PNG_sCAL_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, int unit, double width, double height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr, png_infop info_ptr, int unit, png_charp swidth, png_charp sheight)); #endif #endif #endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */ #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) /* provide a list of chunks and how they are to be handled, if the built-in handling or default unknown chunk handling is not desired. Any chunks not listed will be handled in the default manner. The IHDR and IEND chunks must not be listed. keep = 0: follow default behaviour = 1: do not keep = 2: keep only if safe-to-copy = 3: keep even if unsafe-to-copy */ extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp png_ptr, int keep, png_bytep chunk_list, int num_chunks)); extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr, png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)); extern PNG_EXPORT(void, png_set_unknown_chunk_location) PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location)); extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp png_ptr, png_infop info_ptr, png_unknown_chunkpp entries)); #endif #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep chunk_name)); #endif /* Png_free_data() will turn off the "valid" flag for anything it frees. If you need to turn it off for a chunk that your application has freed, you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */ extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr, png_infop info_ptr, int mask)); #if defined(PNG_INFO_IMAGE_SUPPORTED) /* The "params" pointer is currently not used and is for future expansion. */ extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr, png_infop info_ptr, int transforms, png_voidp params)); extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, png_infop info_ptr, int transforms, png_voidp params)); #endif /* Define PNG_DEBUG at compile time for debugging information. Higher * numbers for PNG_DEBUG mean more debugging information. This has * only been added since version 0.95 so it is not implemented throughout * libpng yet, but more support will be added as needed. */ #ifdef PNG_DEBUG #if (PNG_DEBUG > 0) #if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) #include #if (PNG_DEBUG > 1) #ifndef _DEBUG # define _DEBUG #endif #ifndef png_debug #define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) #endif #ifndef png_debug1 #define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) #endif #ifndef png_debug2 #define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) #endif #endif #else /* PNG_DEBUG_FILE || !_MSC_VER */ #ifndef PNG_DEBUG_FILE #define PNG_DEBUG_FILE stderr #endif /* PNG_DEBUG_FILE */ #if (PNG_DEBUG > 1) /* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on * non-ISO compilers */ # ifdef __STDC__ # ifndef png_debug # define png_debug(l,m) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ } # endif # ifndef png_debug1 # define png_debug1(l,m,p1) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ } # endif # ifndef png_debug2 # define png_debug2(l,m,p1,p2) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ } # endif # else /* __STDC __ */ # ifndef png_debug # define png_debug(l,m) \ { \ int num_tabs=l; \ char format[256]; \ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ m,PNG_STRING_NEWLINE); \ fprintf(PNG_DEBUG_FILE,format); \ } # endif # ifndef png_debug1 # define png_debug1(l,m,p1) \ { \ int num_tabs=l; \ char format[256]; \ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ m,PNG_STRING_NEWLINE); \ fprintf(PNG_DEBUG_FILE,format,p1); \ } # endif # ifndef png_debug2 # define png_debug2(l,m,p1,p2) \ { \ int num_tabs=l; \ char format[256]; \ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ m,PNG_STRING_NEWLINE); \ fprintf(PNG_DEBUG_FILE,format,p1,p2); \ } # endif # endif /* __STDC __ */ #endif /* (PNG_DEBUG > 1) */ #endif /* _MSC_VER */ #endif /* (PNG_DEBUG > 0) */ #endif /* PNG_DEBUG */ #ifndef png_debug #define png_debug(l, m) #endif #ifndef png_debug1 #define png_debug1(l, m, p1) #endif #ifndef png_debug2 #define png_debug2(l, m, p1, p2) #endif extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr)); #ifdef PNG_MNG_FEATURES_SUPPORTED extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp png_ptr, png_uint_32 mng_features_permitted)); #endif /* For use in png_set_keep_unknown, added to version 1.2.6 */ #define PNG_HANDLE_CHUNK_AS_DEFAULT 0 #define PNG_HANDLE_CHUNK_NEVER 1 #define PNG_HANDLE_CHUNK_IF_SAFE 2 #define PNG_HANDLE_CHUNK_ALWAYS 3 /* Added to version 1.2.0 */ #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) #if defined(PNG_MMX_CODE_SUPPORTED) #define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED 0x01 /* not user-settable */ #define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU 0x02 /* not user-settable */ #define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW 0x04 #define PNG_ASM_FLAG_MMX_READ_INTERLACE 0x08 #define PNG_ASM_FLAG_MMX_READ_FILTER_SUB 0x10 #define PNG_ASM_FLAG_MMX_READ_FILTER_UP 0x20 #define PNG_ASM_FLAG_MMX_READ_FILTER_AVG 0x40 #define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80 #define PNG_ASM_FLAGS_INITIALIZED 0x80000000 /* not user-settable */ #define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ | PNG_ASM_FLAG_MMX_READ_INTERLACE \ | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ | PNG_ASM_FLAG_MMX_READ_FILTER_UP \ | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ) #define PNG_MMX_WRITE_FLAGS ( 0 ) #define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \ | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU \ | PNG_MMX_READ_FLAGS \ | PNG_MMX_WRITE_FLAGS ) #define PNG_SELECT_READ 1 #define PNG_SELECT_WRITE 2 #endif /* PNG_MMX_CODE_SUPPORTED */ #if !defined(PNG_1_0_X) /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask) PNGARG((int flag_select, int *compilerID)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask) PNGARG((int flag_select)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_asm_flags) PNGARG((png_structp png_ptr)); /* pngget.c */ extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold) PNGARG((png_structp png_ptr)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold) PNGARG((png_structp png_ptr)); /* pngset.c */ extern PNG_EXPORT(void,png_set_asm_flags) PNGARG((png_structp png_ptr, png_uint_32 asm_flags)); /* pngset.c */ extern PNG_EXPORT(void,png_set_mmx_thresholds) PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold, png_uint_32 mmx_rowbytes_threshold)); #endif /* PNG_1_0_X */ #if !defined(PNG_1_0_X) /* png.c, pnggccrd.c, or pngvcrd.c */ extern PNG_EXPORT(int,png_mmx_support) PNGARG((void)); #endif /* PNG_1_0_X */ #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ /* Strip the prepended error numbers ("#nnn ") from error and warning * messages before passing them to the error or warning handler. */ #ifdef PNG_ERROR_NUMBERS_SUPPORTED extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp png_ptr, png_uint_32 strip_mode)); #endif /* Added at libpng-1.2.6 */ #ifdef PNG_SET_USER_LIMITS_SUPPORTED extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max)); extern PNG_EXPORT(png_uint_32,png_get_user_width_max) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp png_ptr)); #endif /* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */ #ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED /* With these routines we avoid an integer divide, which will be slower on * most machines. However, it does take more operations than the corresponding * divide method, so it may be slower on a few RISC systems. There are two * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. * * Note that the rounding factors are NOT supposed to be the same! 128 and * 32768 are correct for the NODIV code; 127 and 32767 are correct for the * standard method. * * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] */ /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ # define png_composite(composite, fg, alpha, bg) \ { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \ + (png_uint_16)(bg)*(png_uint_16)(255 - \ (png_uint_16)(alpha)) + (png_uint_16)128); \ (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } # define png_composite_16(composite, fg, alpha, bg) \ { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \ + (png_uint_32)(bg)*(png_uint_32)(65535L - \ (png_uint_32)(alpha)) + (png_uint_32)32768L); \ (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } #else /* standard method using integer division */ # define png_composite(composite, fg, alpha, bg) \ (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ (png_uint_16)127) / 255) # define png_composite_16(composite, fg, alpha, bg) \ (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ (png_uint_32)32767) / (png_uint_32)65535L) #endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ /* Inline macros to do direct reads of bytes from the input buffer. These * require that you are using an architecture that uses PNG byte ordering * (MSB first) and supports unaligned data storage. I think that PowerPC * in big-endian mode and 680x0 are the only ones that will support this. * The x86 line of processors definitely do not. The png_get_int_32() * routine also assumes we are using two's complement format for negative * values, which is almost certainly true. */ #if defined(PNG_READ_BIG_ENDIAN_SUPPORTED) # define png_get_uint_32(buf) ( *((png_uint_32p) (buf))) # define png_get_uint_16(buf) ( *((png_uint_16p) (buf))) # define png_get_int_32(buf) ( *((png_int_32p) (buf))) #else extern PNG_EXPORT(png_uint_32,png_get_uint_32) PNGARG((png_bytep buf)); extern PNG_EXPORT(png_uint_16,png_get_uint_16) PNGARG((png_bytep buf)); extern PNG_EXPORT(png_int_32,png_get_int_32) PNGARG((png_bytep buf)); #endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */ extern PNG_EXPORT(png_uint_32,png_get_uint_31) PNGARG((png_structp png_ptr, png_bytep buf)); /* No png_get_int_16 -- may be added if there's a real need for it. */ /* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ extern PNG_EXPORT(void,png_save_uint_32) PNGARG((png_bytep buf, png_uint_32 i)); extern PNG_EXPORT(void,png_save_int_32) PNGARG((png_bytep buf, png_int_32 i)); /* Place a 16-bit number into a buffer in PNG byte order. * The parameter is declared unsigned int, not png_uint_16, * just to avoid potential problems on pre-ANSI C compilers. */ extern PNG_EXPORT(void,png_save_uint_16) PNGARG((png_bytep buf, unsigned int i)); /* No png_save_int_16 -- may be added if there's a real need for it. */ /* ************************************************************************* */ /* These next functions are used internally in the code. They generally * shouldn't be used unless you are writing code to add or replace some * functionality in libpng. More information about most functions can * be found in the files where the functions are located. */ /* Various modes of operation, that are visible to applications because * they are used for unknown chunk location. */ #define PNG_HAVE_IHDR 0x01 #define PNG_HAVE_PLTE 0x02 #define PNG_HAVE_IDAT 0x04 #define PNG_AFTER_IDAT 0x08 /* Have complete zlib datastream */ #define PNG_HAVE_IEND 0x10 #if defined(PNG_INTERNAL) /* More modes of operation. Note that after an init, mode is set to * zero automatically when the structure is created. */ #define PNG_HAVE_gAMA 0x20 #define PNG_HAVE_cHRM 0x40 #define PNG_HAVE_sRGB 0x80 #define PNG_HAVE_CHUNK_HEADER 0x100 #define PNG_WROTE_tIME 0x200 #define PNG_WROTE_INFO_BEFORE_PLTE 0x400 #define PNG_BACKGROUND_IS_GRAY 0x800 #define PNG_HAVE_PNG_SIGNATURE 0x1000 #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ /* flags for the transformations the PNG library does on the image data */ #define PNG_BGR 0x0001 #define PNG_INTERLACE 0x0002 #define PNG_PACK 0x0004 #define PNG_SHIFT 0x0008 #define PNG_SWAP_BYTES 0x0010 #define PNG_INVERT_MONO 0x0020 #define PNG_DITHER 0x0040 #define PNG_BACKGROUND 0x0080 #define PNG_BACKGROUND_EXPAND 0x0100 /* 0x0200 unused */ #define PNG_16_TO_8 0x0400 #define PNG_RGBA 0x0800 #define PNG_EXPAND 0x1000 #define PNG_GAMMA 0x2000 #define PNG_GRAY_TO_RGB 0x4000 #define PNG_FILLER 0x8000L #define PNG_PACKSWAP 0x10000L #define PNG_SWAP_ALPHA 0x20000L #define PNG_STRIP_ALPHA 0x40000L #define PNG_INVERT_ALPHA 0x80000L #define PNG_USER_TRANSFORM 0x100000L #define PNG_RGB_TO_GRAY_ERR 0x200000L #define PNG_RGB_TO_GRAY_WARN 0x400000L #define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */ /* 0x800000L Unused */ #define PNG_ADD_ALPHA 0x1000000L /* Added to libpng-1.2.7 */ #define PNG_EXPAND_tRNS 0x2000000L /* Added to libpng-1.2.9 */ /* 0x4000000L unused */ /* 0x8000000L unused */ /* 0x10000000L unused */ /* 0x20000000L unused */ /* 0x40000000L unused */ /* flags for png_create_struct */ #define PNG_STRUCT_PNG 0x0001 #define PNG_STRUCT_INFO 0x0002 /* Scaling factor for filter heuristic weighting calculations */ #define PNG_WEIGHT_SHIFT 8 #define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) #define PNG_COST_SHIFT 3 #define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) /* flags for the png_ptr->flags rather than declaring a byte for each one */ #define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 #define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002 #define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004 #define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008 #define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010 #define PNG_FLAG_ZLIB_FINISHED 0x0020 #define PNG_FLAG_ROW_INIT 0x0040 #define PNG_FLAG_FILLER_AFTER 0x0080 #define PNG_FLAG_CRC_ANCILLARY_USE 0x0100 #define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200 #define PNG_FLAG_CRC_CRITICAL_USE 0x0400 #define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800 #define PNG_FLAG_FREE_PLTE 0x1000 #define PNG_FLAG_FREE_TRNS 0x2000 #define PNG_FLAG_FREE_HIST 0x4000 #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L #define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L #define PNG_FLAG_LIBRARY_MISMATCH 0x20000L #define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L #define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L #define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L #define PNG_FLAG_ADD_ALPHA 0x200000L /* Added to libpng-1.2.8 */ #define PNG_FLAG_STRIP_ALPHA 0x400000L /* Added to libpng-1.2.8 */ /* 0x800000L unused */ /* 0x1000000L unused */ /* 0x2000000L unused */ /* 0x4000000L unused */ /* 0x8000000L unused */ /* 0x10000000L unused */ /* 0x20000000L unused */ /* 0x40000000L unused */ #define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \ PNG_FLAG_CRC_ANCILLARY_NOWARN) #define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \ PNG_FLAG_CRC_CRITICAL_IGNORE) #define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ PNG_FLAG_CRC_CRITICAL_MASK) /* save typing and make code easier to understand */ #define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ abs((int)((c1).green) - (int)((c2).green)) + \ abs((int)((c1).blue) - (int)((c2).blue))) /* Added to libpng-1.2.6 JB */ #define PNG_ROWBYTES(pixel_bits, width) \ ((pixel_bits) >= 8 ? \ ((width) * (((png_uint_32)(pixel_bits)) >> 3)) : \ (( ((width) * ((png_uint_32)(pixel_bits))) + 7) >> 3) ) /* PNG_OUT_OF_RANGE returns true if value is outside the range ideal-delta..ideal+delta. Each argument is evaluated twice. "ideal" and "delta" should be constants, normally simple integers, "value" a variable. Added to libpng-1.2.6 JB */ #define PNG_OUT_OF_RANGE(value, ideal, delta) \ ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) ) /* variables declared in png.c - only it needs to define PNG_NO_EXTERN */ #if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) /* place to hold the signature string for a PNG file. */ #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (PNG_CONST png_byte FARDATA) png_sig[8]; #else #endif #endif /* PNG_NO_EXTERN */ /* Constant strings for known chunk types. If you need to add a chunk, * define the name here, and add an invocation of the macro in png.c and * wherever it's needed. */ #define PNG_IHDR png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} #define PNG_IDAT png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} #define PNG_IEND png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} #define PNG_PLTE png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} #define PNG_bKGD png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} #define PNG_cHRM png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} #define PNG_gAMA png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} #define PNG_hIST png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} #define PNG_iCCP png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} #define PNG_iTXt png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} #define PNG_oFFs png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} #define PNG_pCAL png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} #define PNG_sCAL png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} #define PNG_pHYs png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} #define PNG_sBIT png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} #define PNG_sPLT png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} #define PNG_sRGB png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} #define PNG_tEXt png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} #define PNG_tIME png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} #define PNG_tRNS png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} #define PNG_zTXt png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (png_byte FARDATA) png_IHDR[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_IDAT[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_IEND[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_PLTE[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_bKGD[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_cHRM[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_gAMA[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_hIST[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_iCCP[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_iTXt[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_oFFs[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_pCAL[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sCAL[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_pHYs[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sBIT[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sPLT[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sRGB[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_tEXt[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_tIME[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_tRNS[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_zTXt[5]; #endif /* PNG_USE_GLOBAL_ARRAYS */ #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Initialize png_ptr struct for reading, and allocate any other memory. * (old interface - DEPRECATED - use png_create_read_struct instead). */ extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr)); #undef png_read_init #define png_read_init(png_ptr) png_read_init_3(&png_ptr, \ PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); #endif extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr, png_const_charp user_png_ver, png_size_t png_struct_size)); #if defined(PNG_1_0_X) || defined (PNG_1_2_X) extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr, png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t png_info_size)); #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Initialize png_ptr struct for writing, and allocate any other memory. * (old interface - DEPRECATED - use png_create_write_struct instead). */ extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr)); #undef png_write_init #define png_write_init(png_ptr) png_write_init_3(&png_ptr, \ PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); #endif extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr, png_const_charp user_png_ver, png_size_t png_struct_size)); extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr, png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t png_info_size)); /* Allocate memory for an internal libpng struct */ PNG_EXTERN png_voidp png_create_struct PNGARG((int type)); /* Free memory from internal libpng struct */ PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)); PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr, png_free_ptr free_fn, png_voidp mem_ptr)); /* Free any memory that info_ptr points to and reset struct. */ PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_1_0_X /* Function to allocate memory for zlib. */ PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size)); /* Function to free memory for zlib */ PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); #ifdef PNG_SIZE_T /* Function to convert a sizeof an item to png_sizeof item */ PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); #endif /* Next four functions are used internally as callbacks. PNGAPI is required * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3. */ PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t length)); #endif PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); #if defined(PNG_WRITE_FLUSH_SUPPORTED) #if !defined(PNG_NO_STDIO) PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr)); #endif #endif #else /* PNG_1_0_X */ #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t length)); #endif #endif /* PNG_1_0_X */ /* Reset the CRC variable */ PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); /* Write the "data" buffer to whatever output you are using. */ PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Read data from whatever input you are using into the "data" buffer */ PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Read bytes into buf, and update png_ptr->crc */ PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf, png_size_t length)); /* Decompress data in a chunk that uses compression */ #if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \ defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr, int comp_type, png_size_t chunklength, png_size_t prefix_length, png_size_t *data_length)); #endif /* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip)); /* Read the CRC from the file and compare it to the libpng calculated CRC */ PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr)); /* Calculate the CRC over a section of data. Note that we are only * passing a maximum of 64K on systems that have this as a memory limit, * since this is the maximum buffer size we can specify. */ PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr, png_size_t length)); #if defined(PNG_WRITE_FLUSH_SUPPORTED) PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); #endif /* simple function to write the signature */ PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr)); /* write various chunks */ /* Write the IHDR chunk, and update the png_struct with the necessary * information. */ PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int compression_method, int filter_method, int interlace_method)); PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)); PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); #if defined(PNG_WRITE_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point file_gamma)); #endif #endif #if defined(PNG_WRITE_sBIT_SUPPORTED) PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit, int color_type)); #endif #if defined(PNG_WRITE_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, double green_y, double blue_x, double blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif #endif #if defined(PNG_WRITE_sRGB_SUPPORTED) PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr, int intent)); #endif #if defined(PNG_WRITE_iCCP_SUPPORTED) PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr, png_charp name, int compression_type, png_charp profile, int proflen)); /* Note to maintainer: profile should be png_bytep */ #endif #if defined(PNG_WRITE_sPLT_SUPPORTED) PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr, png_sPLT_tp palette)); #endif #if defined(PNG_WRITE_tRNS_SUPPORTED) PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans, png_color_16p values, int number, int color_type)); #endif #if defined(PNG_WRITE_bKGD_SUPPORTED) PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr, png_color_16p values, int color_type)); #endif #if defined(PNG_WRITE_hIST_SUPPORTED) PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist, int num_hist)); #endif #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, png_charp key, png_charpp new_key)); #endif #if defined(PNG_WRITE_tEXt_SUPPORTED) PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key, png_charp text, png_size_t text_len)); #endif #if defined(PNG_WRITE_zTXt_SUPPORTED) PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key, png_charp text, png_size_t text_len, int compression)); #endif #if defined(PNG_WRITE_iTXt_SUPPORTED) PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr, int compression, png_charp key, png_charp lang, png_charp lang_key, png_charp text)); #endif #if defined(PNG_TEXT_SUPPORTED) /* Added at version 1.0.14 and 1.2.4 */ PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, int num_text)); #endif #if defined(PNG_WRITE_oFFs_SUPPORTED) PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset, int unit_type)); #endif #if defined(PNG_WRITE_pCAL_SUPPORTED) PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_charp units, png_charpp params)); #endif #if defined(PNG_WRITE_pHYs_SUPPORTED) PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr, png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, int unit_type)); #endif #if defined(PNG_WRITE_tIME_SUPPORTED) PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr, png_timep mod_time)); #endif #if defined(PNG_WRITE_sCAL_SUPPORTED) #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr, int unit, double width, double height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr, int unit, png_charp width, png_charp height)); #endif #endif #endif /* Called when finished processing a row of data */ PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); /* Internal use only. Called before first row of data */ PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr)); #endif /* combine a row of data, dealing with alpha, etc. if requested */ PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row, int mask)); #if defined(PNG_READ_INTERLACING_SUPPORTED) /* expand an interlaced row */ /* OLD pre-1.0.9 interface: PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info, png_bytep row, int pass, png_uint_32 transformations)); */ PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); #endif /* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */ #if defined(PNG_WRITE_INTERLACING_SUPPORTED) /* grab pixels out of a row for an interlaced pass */ PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, png_bytep row, int pass)); #endif /* unfilter a row */ PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr, png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter)); /* Choose the best filter to use and filter the row data */ PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, png_row_infop row_info)); /* Write out the filtered row. */ PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, png_bytep filtered_row)); /* finish a row while reading, dealing with interlacing passes, etc. */ PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); /* initialize the row buffers, etc. */ PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr)); /* optional call to update the users info structure */ PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, png_infop info_ptr)); /* these are the functions that do the transformations */ #if defined(PNG_READ_FILLER_SUPPORTED) PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 filler, png_uint_32 flags)); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_FILLER_SUPPORTED) || \ defined(PNG_READ_STRIP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 flags)); #endif #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_PACK_SUPPORTED) PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row, png_color_8p sig_bits)); #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_DITHER_SUPPORTED) PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info, png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup)); # if defined(PNG_CORRECT_PALETTE_SUPPORTED) PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr, png_colorp palette, int num_palette)); # endif #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_PACK_SUPPORTED) PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)); #endif #if defined(PNG_WRITE_SHIFT_SUPPORTED) PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row, png_color_8p bit_depth)); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_values, png_color_16p background, png_color_16p background_1, png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, png_uint_16pp gamma_16_to_1, int gamma_shift)); #else PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_values, png_color_16p background)); #endif #endif #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row, png_bytep gamma_table, png_uint_16pp gamma_16_table, int gamma_shift)); #endif #if defined(PNG_READ_EXPAND_SUPPORTED) PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info, png_bytep row, png_colorp palette, png_bytep trans, int num_trans)); PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_value)); #endif /* The following decodes the appropriate chunks, and does error correction, * then calls the appropriate callback for the chunk if it is valid. */ /* decode the IHDR chunk */ PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #if defined(PNG_READ_bKGD_SUPPORTED) PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_cHRM_SUPPORTED) PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_gAMA_SUPPORTED) PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_hIST_SUPPORTED) PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_iCCP_SUPPORTED) extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif /* PNG_READ_iCCP_SUPPORTED */ #if defined(PNG_READ_iTXt_SUPPORTED) PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_oFFs_SUPPORTED) PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_pCAL_SUPPORTED) PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_pHYs_SUPPORTED) PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sBIT_SUPPORTED) PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sCAL_SUPPORTED) PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sPLT_SUPPORTED) extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif /* PNG_READ_sPLT_SUPPORTED */ #if defined(PNG_READ_sRGB_SUPPORTED) PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tEXt_SUPPORTED) PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tIME_SUPPORTED) PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tRNS_SUPPORTED) PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, png_bytep chunk_name)); /* handle the transformations for reading and writing */ PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr)); PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr)); PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, png_uint_32 length)); PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)); PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr)); PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)); PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row)); PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr)); #if defined(PNG_READ_tEXt_SUPPORTED) PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_READ_iTXt_SUPPORTED) PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #ifdef PNG_MNG_FEATURES_SUPPORTED PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info, png_bytep row)); PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) #if defined(PNG_MMX_CODE_SUPPORTED) /* png.c */ /* PRIVATE */ PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr)); #endif #endif #if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) PNG_EXTERN png_uint_32 png_get_pixels_per_inch PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN png_uint_32 png_get_x_pixels_per_inch PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN png_uint_32 png_get_y_pixels_per_inch PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN float png_get_x_offset_inches PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN float png_get_y_offset_inches PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_pHYs_SUPPORTED) PNG_EXTERN png_uint_32 png_get_pHYs_dpi PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); #endif /* PNG_pHYs_SUPPORTED */ #endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ /* Read the chunk header (length + type name) */ PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr)); /* Added at libpng version 1.2.34 */ #if defined(PNG_cHRM_SUPPORTED) PNG_EXTERN int png_check_cHRM_fixed PNGARG((png_structp png_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ #endif /* PNG_INTERNAL */ #ifdef __cplusplus } #endif #endif /* PNG_VERSION_INFO_ONLY */ /* do not put anything past this line */ #endif /* PNG_H */ angband-3.5.1/src/win/include/png.h0000644000175000017500000045435712456456607016427 0ustar chriscchrisc/* png.h - header file for PNG reference library * * libpng version 1.2.37 - June 4, 2009 * Copyright (c) 1998-2009 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * Authors and maintainers: * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger * libpng versions 0.97, January 1998, through 1.2.37 - June 4, 2009: Glenn * See also "Contributing Authors", below. * * Note about libpng version numbers: * * Due to various miscommunications, unforeseen code incompatibilities * and occasional factors outside the authors' control, version numbering * on the library has not always been consistent and straightforward. * The following table summarizes matters since version 0.89c, which was * the first widely used release: * * source png.h png.h shared-lib * version string int version * ------- ------ ----- ---------- * 0.89c "1.0 beta 3" 0.89 89 1.0.89 * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] * 0.97c 0.97 97 2.0.97 * 0.98 0.98 98 2.0.98 * 0.99 0.99 98 2.0.99 * 0.99a-m 0.99 99 2.0.99 * 1.00 1.00 100 2.1.0 [100 should be 10000] * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] * 1.0.1 png.h string is 10001 2.1.0 * 1.0.1a-e identical to the 10002 from here on, the shared library * 1.0.2 source version) 10002 is 2.V where V is the source code * 1.0.2a-b 10003 version, except as noted. * 1.0.3 10003 * 1.0.3a-d 10004 * 1.0.4 10004 * 1.0.4a-f 10005 * 1.0.5 (+ 2 patches) 10005 * 1.0.5a-d 10006 * 1.0.5e-r 10100 (not source compatible) * 1.0.5s-v 10006 (not binary compatible) * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) * 1.0.6d-f 10007 (still binary incompatible) * 1.0.6g 10007 * 1.0.6h 10007 10.6h (testing xy.z so-numbering) * 1.0.6i 10007 10.6i * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) * 1.0.7 1 10007 (still compatible) * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 * 1.0.8rc1 1 10008 2.1.0.8rc1 * 1.0.8 1 10008 2.1.0.8 * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 * 1.0.9rc1 1 10009 2.1.0.9rc1 * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 * 1.0.9rc2 1 10009 2.1.0.9rc2 * 1.0.9 1 10009 2.1.0.9 * 1.0.10beta1 1 10010 2.1.0.10beta1 * 1.0.10rc1 1 10010 2.1.0.10rc1 * 1.0.10 1 10010 2.1.0.10 * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 * 1.0.11rc1 1 10011 2.1.0.11rc1 * 1.0.11 1 10011 2.1.0.11 * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 * 1.0.12rc1 2 10012 2.1.0.12rc1 * 1.0.12 2 10012 2.1.0.12 * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 * 1.2.0rc1 3 10200 3.1.2.0rc1 * 1.2.0 3 10200 3.1.2.0 * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 * 1.2.1 3 10201 3.1.2.1 * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 * 1.0.13 10 10013 10.so.0.1.0.13 * 1.2.2 12 10202 12.so.0.1.2.2 * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 * 1.2.3 12 10203 12.so.0.1.2.3 * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 * 1.0.14 10 10014 10.so.0.1.0.14 * 1.2.4 13 10204 12.so.0.1.2.4 * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 * 1.0.15 10 10015 10.so.0.1.0.15 * 1.2.5 13 10205 12.so.0.1.2.5 * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 * 1.0.16 10 10016 10.so.0.1.0.16 * 1.2.6 13 10206 12.so.0.1.2.6 * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 * 1.0.17rc1 10 10017 10.so.0.1.0.17rc1 * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 * 1.0.17 10 10017 10.so.0.1.0.17 * 1.2.7 13 10207 12.so.0.1.2.7 * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 * 1.0.18rc1-5 10 10018 10.so.0.1.0.18rc1-5 * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 * 1.0.18 10 10018 10.so.0.1.0.18 * 1.2.8 13 10208 12.so.0.1.2.8 * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 * 1.2.9beta4-11 13 10209 12.so.0.9[.0] * 1.2.9rc1 13 10209 12.so.0.9[.0] * 1.2.9 13 10209 12.so.0.9[.0] * 1.2.10beta1-8 13 10210 12.so.0.10[.0] * 1.2.10rc1-3 13 10210 12.so.0.10[.0] * 1.2.10 13 10210 12.so.0.10[.0] * 1.2.11beta1-4 13 10211 12.so.0.11[.0] * 1.0.19rc1-5 10 10019 10.so.0.19[.0] * 1.2.11rc1-5 13 10211 12.so.0.11[.0] * 1.0.19 10 10019 10.so.0.19[.0] * 1.2.11 13 10211 12.so.0.11[.0] * 1.0.20 10 10020 10.so.0.20[.0] * 1.2.12 13 10212 12.so.0.12[.0] * 1.2.13beta1 13 10213 12.so.0.13[.0] * 1.0.21 10 10021 10.so.0.21[.0] * 1.2.13 13 10213 12.so.0.13[.0] * 1.2.14beta1-2 13 10214 12.so.0.14[.0] * 1.0.22rc1 10 10022 10.so.0.22[.0] * 1.2.14rc1 13 10214 12.so.0.14[.0] * 1.0.22 10 10022 10.so.0.22[.0] * 1.2.14 13 10214 12.so.0.14[.0] * 1.2.15beta1-6 13 10215 12.so.0.15[.0] * 1.0.23rc1-5 10 10023 10.so.0.23[.0] * 1.2.15rc1-5 13 10215 12.so.0.15[.0] * 1.0.23 10 10023 10.so.0.23[.0] * 1.2.15 13 10215 12.so.0.15[.0] * 1.2.16beta1-2 13 10216 12.so.0.16[.0] * 1.2.16rc1 13 10216 12.so.0.16[.0] * 1.0.24 10 10024 10.so.0.24[.0] * 1.2.16 13 10216 12.so.0.16[.0] * 1.2.17beta1-2 13 10217 12.so.0.17[.0] * 1.0.25rc1 10 10025 10.so.0.25[.0] * 1.2.17rc1-3 13 10217 12.so.0.17[.0] * 1.0.25 10 10025 10.so.0.25[.0] * 1.2.17 13 10217 12.so.0.17[.0] * 1.0.26 10 10026 10.so.0.26[.0] * 1.2.18 13 10218 12.so.0.18[.0] * 1.2.19beta1-31 13 10219 12.so.0.19[.0] * 1.0.27rc1-6 10 10027 10.so.0.27[.0] * 1.2.19rc1-6 13 10219 12.so.0.19[.0] * 1.0.27 10 10027 10.so.0.27[.0] * 1.2.19 13 10219 12.so.0.19[.0] * 1.2.20beta01-04 13 10220 12.so.0.20[.0] * 1.0.28rc1-6 10 10028 10.so.0.28[.0] * 1.2.20rc1-6 13 10220 12.so.0.20[.0] * 1.0.28 10 10028 10.so.0.28[.0] * 1.2.20 13 10220 12.so.0.20[.0] * 1.2.21beta1-2 13 10221 12.so.0.21[.0] * 1.2.21rc1-3 13 10221 12.so.0.21[.0] * 1.0.29 10 10029 10.so.0.29[.0] * 1.2.21 13 10221 12.so.0.21[.0] * 1.2.22beta1-4 13 10222 12.so.0.22[.0] * 1.0.30rc1 10 10030 10.so.0.30[.0] * 1.2.22rc1 13 10222 12.so.0.22[.0] * 1.0.30 10 10030 10.so.0.30[.0] * 1.2.22 13 10222 12.so.0.22[.0] * 1.2.23beta01-05 13 10223 12.so.0.23[.0] * 1.2.23rc01 13 10223 12.so.0.23[.0] * 1.2.23 13 10223 12.so.0.23[.0] * 1.2.24beta01-02 13 10224 12.so.0.24[.0] * 1.2.24rc01 13 10224 12.so.0.24[.0] * 1.2.24 13 10224 12.so.0.24[.0] * 1.2.25beta01-06 13 10225 12.so.0.25[.0] * 1.2.25rc01-02 13 10225 12.so.0.25[.0] * 1.0.31 10 10031 10.so.0.31[.0] * 1.2.25 13 10225 12.so.0.25[.0] * 1.2.26beta01-06 13 10226 12.so.0.26[.0] * 1.2.26rc01 13 10226 12.so.0.26[.0] * 1.2.26 13 10226 12.so.0.26[.0] * 1.0.32 10 10032 10.so.0.32[.0] * 1.2.27beta01-06 13 10227 12.so.0.27[.0] * 1.2.27rc01 13 10227 12.so.0.27[.0] * 1.0.33 10 10033 10.so.0.33[.0] * 1.2.27 13 10227 12.so.0.27[.0] * 1.0.34 10 10034 10.so.0.34[.0] * 1.2.28 13 10228 12.so.0.28[.0] * 1.2.29beta01-03 13 10229 12.so.0.29[.0] * 1.2.29rc01 13 10229 12.so.0.29[.0] * 1.0.35 10 10035 10.so.0.35[.0] * 1.2.29 13 10229 12.so.0.29[.0] * 1.0.37 10 10037 10.so.0.37[.0] * 1.2.30beta01-04 13 10230 12.so.0.30[.0] * 1.0.38rc01-08 10 10038 10.so.0.38[.0] * 1.2.30rc01-08 13 10230 12.so.0.30[.0] * 1.0.38 10 10038 10.so.0.38[.0] * 1.2.30 13 10230 12.so.0.30[.0] * 1.0.39rc01-03 10 10039 10.so.0.39[.0] * 1.2.31rc01-03 13 10231 12.so.0.31[.0] * 1.0.39 10 10039 10.so.0.39[.0] * 1.2.31 13 10231 12.so.0.31[.0] * 1.2.32beta01-02 13 10232 12.so.0.32[.0] * 1.0.40rc01 10 10040 10.so.0.40[.0] * 1.2.32rc01 13 10232 12.so.0.32[.0] * 1.0.40 10 10040 10.so.0.40[.0] * 1.2.32 13 10232 12.so.0.32[.0] * 1.2.33beta01-02 13 10233 12.so.0.33[.0] * 1.2.33rc01-02 13 10233 12.so.0.33[.0] * 1.0.41rc01 10 10041 10.so.0.41[.0] * 1.2.33 13 10233 12.so.0.33[.0] * 1.0.41 10 10041 10.so.0.41[.0] * 1.2.34beta01-07 13 10234 12.so.0.34[.0] * 1.0.42rc01 10 10042 10.so.0.42[.0] * 1.2.34rc01 13 10234 12.so.0.34[.0] * 1.0.42 10 10042 10.so.0.42[.0] * 1.2.34 13 10234 12.so.0.34[.0] * 1.2.35beta01-03 13 10235 12.so.0.35[.0] * 1.0.43rc01-02 10 10043 10.so.0.43[.0] * 1.2.35rc01-02 13 10235 12.so.0.35[.0] * 1.0.43 10 10043 10.so.0.43[.0] * 1.2.35 13 10235 12.so.0.35[.0] * 1.2.36beta01-05 13 10236 12.so.0.36[.0] * 1.2.36rc01 13 10236 12.so.0.36[.0] * 1.0.44 10 10044 10.so.0.44[.0] * 1.2.36 13 10236 12.so.0.36[.0] * 1.2.37beta01-03 13 10237 12.so.0.37[.0] * 1.2.37rc01 13 10237 12.so.0.37[.0] * 1.2.37 13 10237 12.so.0.37[.0] * * Henceforth the source version will match the shared-library major * and minor numbers; the shared-library major version number will be * used for changes in backward compatibility, as it is intended. The * PNG_LIBPNG_VER macro, which is not used within libpng but is available * for applications, is an unsigned integer of the form xyyzz corresponding * to the source version x.y.z (leading zeros in y and z). Beta versions * were given the previous public release number plus a letter, until * version 1.0.6j; from then on they were given the upcoming public * release number plus "betaNN" or "rcNN". * * Binary incompatibility exists only when applications make direct access * to the info_ptr or png_ptr members through png.h, and the compiled * application is loaded with a different version of the library. * * DLLNUM will change each time there are forward or backward changes * in binary compatibility (e.g., when a new feature is added). * * See libpng.txt or libpng.3 for more information. The PNG specification * is available as a W3C Recommendation and as an ISO Specification, * defines should NOT be changed. */ #define PNG_INFO_gAMA 0x0001 #define PNG_INFO_sBIT 0x0002 #define PNG_INFO_cHRM 0x0004 #define PNG_INFO_PLTE 0x0008 #define PNG_INFO_tRNS 0x0010 #define PNG_INFO_bKGD 0x0020 #define PNG_INFO_hIST 0x0040 #define PNG_INFO_pHYs 0x0080 #define PNG_INFO_oFFs 0x0100 #define PNG_INFO_tIME 0x0200 #define PNG_INFO_pCAL 0x0400 #define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ #define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ #define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ #define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ #define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */ /* This is used for the transformation routines, as some of them * change these values for the row. It also should enable using * the routines for other purposes. */ typedef struct png_row_info_struct { png_uint_32 width; /* width of row */ png_uint_32 rowbytes; /* number of bytes in row */ png_byte color_type; /* color type of row */ png_byte bit_depth; /* bit depth of row */ png_byte channels; /* number of channels (1, 2, 3, or 4) */ png_byte pixel_depth; /* bits per pixel (depth * channels) */ } png_row_info; typedef png_row_info FAR * png_row_infop; typedef png_row_info FAR * FAR * png_row_infopp; /* These are the function types for the I/O functions and for the functions * that allow the user to override the default I/O functions with his or her * own. The png_error_ptr type should match that of user-supplied warning * and error functions, while the png_rw_ptr type should match that of the * user read/write data functions. */ typedef struct png_struct_def png_struct; typedef png_struct FAR * png_structp; typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t)); typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp)); typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32, int)); typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32, int)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop)); typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop)); typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep, png_uint_32, int)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp, png_row_infop, png_bytep)); #endif #if defined(PNG_USER_CHUNKS_SUPPORTED) typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp)); #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp)); #endif /* Transform masks for the high-level interface */ #define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ #define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ #define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ #define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ #define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ #define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ #define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ #define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ #define PNG_TRANSFORM_BGR 0x0080 /* read and write */ #define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ #define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ #define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ #define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* WRITE only, deprecated */ /* Added to libpng-1.2.34 */ #define PNG_TRANSFORM_STRIP_FILLER_BEFORE 0x0800 /* WRITE only */ #define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* WRITE only */ /* Flags for MNG supported features */ #define PNG_FLAG_MNG_EMPTY_PLTE 0x01 #define PNG_FLAG_MNG_FILTER_64 0x04 #define PNG_ALL_MNG_FEATURES 0x05 typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t)); typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp)); /* The structure that holds the information to read and write PNG files. * The only people who need to care about what is inside of this are the * people who will be modifying the library for their own special needs. * It should NOT be accessed directly by an application, except to store * the jmp_buf. */ struct png_struct_def { #ifdef PNG_SETJMP_SUPPORTED jmp_buf jmpbuf; /* used in png_error */ #endif png_error_ptr error_fn; /* function for printing errors and aborting */ png_error_ptr warning_fn; /* function for printing warnings */ png_voidp error_ptr; /* user supplied struct for error functions */ png_rw_ptr write_data_fn; /* function for writing output data */ png_rw_ptr read_data_fn; /* function for reading input data */ png_voidp io_ptr; /* ptr to application struct for I/O functions */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) png_user_transform_ptr read_user_transform_fn; /* user read transform */ #endif #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) png_user_transform_ptr write_user_transform_fn; /* user write transform */ #endif /* These were added in libpng-1.0.2 */ #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) png_voidp user_transform_ptr; /* user supplied struct for user transform */ png_byte user_transform_depth; /* bit depth of user transformed pixels */ png_byte user_transform_channels; /* channels in user transformed pixels */ #endif #endif png_uint_32 mode; /* tells us where we are in the PNG file */ png_uint_32 flags; /* flags indicating various things to libpng */ png_uint_32 transformations; /* which transformations to perform */ z_stream zstream; /* pointer to decompression structure (below) */ png_bytep zbuf; /* buffer for zlib */ png_size_t zbuf_size; /* size of zbuf */ int zlib_level; /* holds zlib compression level */ int zlib_method; /* holds zlib compression method */ int zlib_window_bits; /* holds zlib compression window bits */ int zlib_mem_level; /* holds zlib compression memory level */ int zlib_strategy; /* holds zlib compression strategy */ png_uint_32 width; /* width of image in pixels */ png_uint_32 height; /* height of image in pixels */ png_uint_32 num_rows; /* number of rows in current pass */ png_uint_32 usr_width; /* width of row at start of write */ png_uint_32 rowbytes; /* size of row in bytes */ png_uint_32 irowbytes; /* size of current interlaced row in bytes */ png_uint_32 iwidth; /* width of current interlaced row in pixels */ png_uint_32 row_number; /* current row in interlace pass */ png_bytep prev_row; /* buffer to save previous (unfiltered) row */ png_bytep row_buf; /* buffer to save current (unfiltered) row */ #ifndef PNG_NO_WRITE_FILTER png_bytep sub_row; /* buffer to save "sub" row when filtering */ png_bytep up_row; /* buffer to save "up" row when filtering */ png_bytep avg_row; /* buffer to save "avg" row when filtering */ png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ #endif png_row_info row_info; /* used for transformation routines */ png_uint_32 idat_size; /* current IDAT size for read */ png_uint_32 crc; /* current chunk CRC value */ png_colorp palette; /* palette from the input file */ png_uint_16 num_palette; /* number of color entries in palette */ png_uint_16 num_trans; /* number of transparency values */ png_byte chunk_name[5]; /* null-terminated name of current chunk */ png_byte compression; /* file compression type (always 0) */ png_byte filter; /* file filter type (always 0) */ png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ png_byte pass; /* current interlace pass (0 - 6) */ png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ png_byte color_type; /* color type of file */ png_byte bit_depth; /* bit depth of file */ png_byte usr_bit_depth; /* bit depth of users row */ png_byte pixel_depth; /* number of bits per pixel */ png_byte channels; /* number of channels in file */ png_byte usr_channels; /* channels at start of write */ png_byte sig_bytes; /* magic bytes read/written from start of file */ #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) #ifdef PNG_LEGACY_SUPPORTED png_byte filler; /* filler byte for pixel expansion */ #else png_uint_16 filler; /* filler bytes for pixel expansion */ #endif #endif #if defined(PNG_bKGD_SUPPORTED) png_byte background_gamma_type; # ifdef PNG_FLOATING_POINT_SUPPORTED float background_gamma; # endif png_color_16 background; /* background color in screen gamma space */ #if defined(PNG_READ_GAMMA_SUPPORTED) png_color_16 background_1; /* background normalized to gamma 1.0 */ #endif #endif /* PNG_bKGD_SUPPORTED */ #if defined(PNG_WRITE_FLUSH_SUPPORTED) png_flush_ptr output_flush_fn;/* Function for flushing output */ png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ png_uint_32 flush_rows; /* number of rows written since last flush */ #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) int gamma_shift; /* number of "insignificant" bits 16-bit gamma */ #ifdef PNG_FLOATING_POINT_SUPPORTED float gamma; /* file gamma value */ float screen_gamma; /* screen gamma value (display_exponent) */ #endif #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytep gamma_table; /* gamma table for 8-bit depth files */ png_bytep gamma_from_1; /* converts from 1.0 to screen */ png_bytep gamma_to_1; /* converts from file to 1.0 */ png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) png_color_8 sig_bit; /* significant bits in each available channel */ #endif #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) png_color_8 shift; /* shift for significant bit tranformation */ #endif #if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytep trans; /* transparency values for paletted files */ png_color_16 trans_values; /* transparency values for non-paletted files */ #endif png_read_status_ptr read_row_fn; /* called after each row is decoded */ png_write_status_ptr write_row_fn; /* called after each row is encoded */ #ifdef PNG_PROGRESSIVE_READ_SUPPORTED png_progressive_info_ptr info_fn; /* called after header data fully read */ png_progressive_row_ptr row_fn; /* called after each prog. row is decoded */ png_progressive_end_ptr end_fn; /* called after image is complete */ png_bytep save_buffer_ptr; /* current location in save_buffer */ png_bytep save_buffer; /* buffer for previously read data */ png_bytep current_buffer_ptr; /* current location in current_buffer */ png_bytep current_buffer; /* buffer for recently used data */ png_uint_32 push_length; /* size of current input chunk */ png_uint_32 skip_length; /* bytes to skip in input data */ png_size_t save_buffer_size; /* amount of data now in save_buffer */ png_size_t save_buffer_max; /* total size of save_buffer */ png_size_t buffer_size; /* total amount of available input data */ png_size_t current_buffer_size; /* amount of data now in current_buffer */ int process_mode; /* what push library is currently doing */ int cur_palette; /* current push library palette index */ # if defined(PNG_TEXT_SUPPORTED) png_size_t current_text_size; /* current size of text input data */ png_size_t current_text_left; /* how much text left to read in input */ png_charp current_text; /* current text chunk buffer */ png_charp current_text_ptr; /* current location in current_text */ # endif /* PNG_TEXT_SUPPORTED */ #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) /* for the Borland special 64K segment handler */ png_bytepp offset_table_ptr; png_bytep offset_table; png_uint_16 offset_table_number; png_uint_16 offset_table_count; png_uint_16 offset_table_count_free; #endif #if defined(PNG_READ_DITHER_SUPPORTED) png_bytep palette_lookup; /* lookup table for dithering */ png_bytep dither_index; /* index translation for palette files */ #endif #if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED) png_uint_16p hist; /* histogram */ #endif #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) png_byte heuristic_method; /* heuristic for row filter selection */ png_byte num_prev_filters; /* number of weights for previous rows */ png_bytep prev_filters; /* filter type(s) of previous row(s) */ png_uint_16p filter_weights; /* weight(s) for previous line(s) */ png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ png_uint_16p filter_costs; /* relative filter calculation cost */ png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ #endif #if defined(PNG_TIME_RFC1123_SUPPORTED) png_charp time_buffer; /* String to hold RFC 1123 time text */ #endif /* New members added in libpng-1.0.6 */ #ifdef PNG_FREE_ME_SUPPORTED png_uint_32 free_me; /* flags items libpng is responsible for freeing */ #endif #if defined(PNG_USER_CHUNKS_SUPPORTED) png_voidp user_chunk_ptr; png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) int num_chunk_list; png_bytep chunk_list; #endif /* New members added in libpng-1.0.3 */ #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) png_byte rgb_to_gray_status; /* These were changed from png_byte in libpng-1.0.6 */ png_uint_16 rgb_to_gray_red_coeff; png_uint_16 rgb_to_gray_green_coeff; png_uint_16 rgb_to_gray_blue_coeff; #endif /* New member added in libpng-1.0.4 (renamed in 1.0.9) */ #if defined(PNG_MNG_FEATURES_SUPPORTED) || \ defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) /* changed from png_byte to png_uint_32 at version 1.2.0 */ #ifdef PNG_1_0_X png_byte mng_features_permitted; #else png_uint_32 mng_features_permitted; #endif /* PNG_1_0_X */ #endif /* New member added in libpng-1.0.7 */ #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_fixed_point int_gamma; #endif /* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ #if defined(PNG_MNG_FEATURES_SUPPORTED) png_byte filter_type; #endif #if defined(PNG_1_0_X) /* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */ png_uint_32 row_buf_size; #endif /* New members added in libpng-1.2.0 */ #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) # if !defined(PNG_1_0_X) # if defined(PNG_MMX_CODE_SUPPORTED) png_byte mmx_bitdepth_threshold; png_uint_32 mmx_rowbytes_threshold; # endif png_uint_32 asm_flags; # endif #endif /* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ #ifdef PNG_USER_MEM_SUPPORTED png_voidp mem_ptr; /* user supplied struct for mem functions */ png_malloc_ptr malloc_fn; /* function for allocating memory */ png_free_ptr free_fn; /* function for freeing memory */ #endif /* New member added in libpng-1.0.13 and 1.2.0 */ png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ #if defined(PNG_READ_DITHER_SUPPORTED) /* The following three members were added at version 1.0.14 and 1.2.4 */ png_bytep dither_sort; /* working sort array */ png_bytep index_to_palette; /* where the original index currently is */ /* in the palette */ png_bytep palette_to_index; /* which original index points to this */ /* palette color */ #endif /* New members added in libpng-1.0.16 and 1.2.6 */ png_byte compression_type; #ifdef PNG_SET_USER_LIMITS_SUPPORTED png_uint_32 user_width_max; png_uint_32 user_height_max; #endif /* New member added in libpng-1.0.25 and 1.2.17 */ #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) /* storage for unknown chunk that the library doesn't recognize. */ png_unknown_chunk unknown_chunk; #endif /* New members added in libpng-1.2.26 */ png_uint_32 old_big_row_buf_size, old_prev_row_size; /* New member added in libpng-1.2.30 */ png_charp chunkdata; /* buffer for reading chunk data */ }; /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ typedef png_structp version_1_2_37; typedef png_struct FAR * FAR * png_structpp; /* Here are the function definitions most commonly used. This is not * the place to find out how to use libpng. See libpng.txt for the * full explanation, see example.c for the summary. This just provides * a simple one line description of the use of each function. */ /* Returns the version number of the library */ extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void)); /* Tell lib we have already handled the first magic bytes. * Handling more than 8 bytes from the beginning of the file is an error. */ extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr, int num_bytes)); /* Check sig[start] through sig[start + num_to_check - 1] to see if it's a * PNG file. Returns zero if the supplied bytes match the 8-byte PNG * signature, and non-zero otherwise. Having num_to_check == 0 or * start > 7 will always fail (ie return non-zero). */ extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start, png_size_t num_to_check)); /* Simple signature checking function. This is the same as calling * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). */ extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num)); /* Allocate and initialize png_ptr struct for reading, and any other memory. */ extern PNG_EXPORT(png_structp,png_create_read_struct) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)); /* Allocate and initialize png_ptr struct for writing, and any other memory */ extern PNG_EXPORT(png_structp,png_create_write_struct) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)); #ifdef PNG_WRITE_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_WRITE_SUPPORTED extern PNG_EXPORT(void,png_set_compression_buffer_size) PNGARG((png_structp png_ptr, png_uint_32 size)); #endif /* Reset the compression stream */ extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr)); /* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ #ifdef PNG_USER_MEM_SUPPORTED extern PNG_EXPORT(png_structp,png_create_read_struct_2) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); extern PNG_EXPORT(png_structp,png_create_write_struct_2) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); #endif /* Write a PNG chunk - size, type, (optional) data, CRC. */ extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr, png_bytep chunk_name, png_bytep data, png_size_t length)); /* Write the start of a PNG chunk - length and chunk name. */ extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr, png_bytep chunk_name, png_uint_32 length)); /* Write the data of a PNG chunk started with png_write_chunk_start(). */ extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Finish a chunk started with png_write_chunk_start() (includes CRC). */ extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr)); /* Allocate and initialize the info structure */ extern PNG_EXPORT(png_infop,png_create_info_struct) PNGARG((png_structp png_ptr)); #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Initialize the info structure (old interface - DEPRECATED) */ extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr)); #undef png_info_init #define png_info_init(info_ptr) png_info_init_3(&info_ptr,\ png_sizeof(png_info)); #endif extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr, png_size_t png_info_struct_size)); /* Writes all the PNG information before the image. */ extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read the information before the actual image data. */ extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_TIME_RFC1123_SUPPORTED) extern PNG_EXPORT(png_charp,png_convert_to_rfc1123) PNGARG((png_structp png_ptr, png_timep ptime)); #endif #if !defined(_WIN32_WCE) /* "time.h" functions are not supported on WindowsCE */ #if defined(PNG_WRITE_tIME_SUPPORTED) /* convert from a struct tm to png_time */ extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime, struct tm FAR * ttime)); /* convert from time_t to png_time. Uses gmtime() */ extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime, time_t ttime)); #endif /* PNG_WRITE_tIME_SUPPORTED */ #endif /* _WIN32_WCE */ #if defined(PNG_READ_EXPAND_SUPPORTED) /* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr)); #if !defined(PNG_1_0_X) extern PNG_EXPORT(void,png_set_expand_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); #endif extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr)); #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Deprecated */ extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); #endif #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) /* Use blue, green, red order for pixels. */ extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) /* Expand the grayscale to 24-bit RGB if necessary. */ extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) /* Reduce RGB to grayscale. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr, int error_action, double red, double green )); #endif extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr, int error_action, png_fixed_point red, png_fixed_point green )); extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp png_ptr)); #endif extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth, png_colorp palette)); #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) /* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr, png_uint_32 filler, int flags)); /* The values of the PNG_FILLER_ defines should NOT be changed */ #define PNG_FILLER_BEFORE 0 #define PNG_FILLER_AFTER 1 /* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ #if !defined(PNG_1_0_X) extern PNG_EXPORT(void,png_set_add_alpha) PNGARG((png_structp png_ptr, png_uint_32 filler, int flags)); #endif #endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) /* Swap bytes in 16-bit depth files. */ extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) /* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) /* Swap packing order of pixels in bytes. */ extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) /* Converts files to legal bit depths. */ extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr, png_color_8p true_bits)); #endif #if defined(PNG_READ_INTERLACING_SUPPORTED) || \ defined(PNG_WRITE_INTERLACING_SUPPORTED) /* Have the code handle the interlacing. Returns the number of passes. */ extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) /* Invert monochrome files */ extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) /* Handle alpha and tRNS by replacing with a background color. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr, png_color_16p background_color, int background_gamma_code, int need_expand, double background_gamma)); #endif #define PNG_BACKGROUND_GAMMA_UNKNOWN 0 #define PNG_BACKGROUND_GAMMA_SCREEN 1 #define PNG_BACKGROUND_GAMMA_FILE 2 #define PNG_BACKGROUND_GAMMA_UNIQUE 3 #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) /* strip the second byte of information from a 16-bit depth file. */ extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_DITHER_SUPPORTED) /* Turn on dithering, and reduce the palette to the number of colors available. */ extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr, png_colorp palette, int num_palette, int maximum_colors, png_uint_16p histogram, int full_dither)); #endif #if defined(PNG_READ_GAMMA_SUPPORTED) /* Handle gamma correction. Screen_gamma=(display_exponent) */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr, double screen_gamma, double default_file_gamma)); #endif #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) #if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) /* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */ /* Deprecated and will be removed. Use png_permit_mng_features() instead. */ extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr, int empty_plte_permitted)); #endif #endif #if defined(PNG_WRITE_FLUSH_SUPPORTED) /* Set how many lines between output flushes - 0 for no flushing */ extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows)); /* Flush the current PNG output buffer */ extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr)); #endif /* optional update palette with requested transformations */ extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr)); /* optional call to update the users info structure */ extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read one or more rows of image data. */ extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr, png_bytepp row, png_bytepp display_row, png_uint_32 num_rows)); #endif #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read a row of data. */ extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr, png_bytep row, png_bytep display_row)); #endif #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read the whole image into memory at once. */ extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr, png_bytepp image)); #endif /* write a row of image data */ extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr, png_bytep row)); /* write a few rows of image data */ extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr, png_bytepp row, png_uint_32 num_rows)); /* write the image data */ extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, png_bytepp image)); /* writes the end of the PNG file. */ extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED /* read the end of the PNG file. */ extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* free any memory associated with the png_info_struct */ extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr, png_infopp info_ptr_ptr)); /* free any memory associated with the png_struct and the png_info_structs */ extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); /* free all memory used by the read (old method - NOT DLL EXPORTED) */ /* Debian note: exporting as it is required by legacy applications */ extern PNG_EXPORT(void,png_read_destroy) PNGARG((png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)); /* free any memory associated with the png_struct and the png_info_structs */ extern PNG_EXPORT(void,png_destroy_write_struct) PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)); /* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */ /* Debian note: exporting as it is required by legacy applications */ extern PNG_EXPORT(void,png_write_destroy) PNGARG((png_structp png_ptr)); /* set the libpng method of handling chunk CRC errors */ extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr, int crit_action, int ancil_action)); /* Values for png_set_crc_action() to say how to handle CRC errors in * ancillary and critical chunks, and whether to use the data contained * therein. Note that it is impossible to "discard" data in a critical * chunk. For versions prior to 0.90, the action was always error/quit, * whereas in version 0.90 and later, the action for CRC errors in ancillary * chunks is warn/discard. These values should NOT be changed. * * value action:critical action:ancillary */ #define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ #define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ #define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ #define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ #define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ #define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ /* These functions give the user control over the scan-line filtering in * libpng and the compression methods used by zlib. These functions are * mainly useful for testing, as the defaults should work with most users. * Those users who are tight on memory or want faster performance at the * expense of compression can modify them. See the compression library * header file (zlib.h) for an explination of the compression functions. */ /* set the filtering method(s) used by libpng. Currently, the only valid * value for "method" is 0. */ extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method, int filters)); /* Flags for png_set_filter() to say which filters to use. The flags * are chosen so that they don't conflict with real filter types * below, in case they are supplied instead of the #defined constants. * These values should NOT be changed. */ #define PNG_NO_FILTERS 0x00 #define PNG_FILTER_NONE 0x08 #define PNG_FILTER_SUB 0x10 #define PNG_FILTER_UP 0x20 #define PNG_FILTER_AVG 0x40 #define PNG_FILTER_PAETH 0x80 #define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ PNG_FILTER_AVG | PNG_FILTER_PAETH) /* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. * These defines should NOT be changed. */ #define PNG_FILTER_VALUE_NONE 0 #define PNG_FILTER_VALUE_SUB 1 #define PNG_FILTER_VALUE_UP 2 #define PNG_FILTER_VALUE_AVG 3 #define PNG_FILTER_VALUE_PAETH 4 #define PNG_FILTER_VALUE_LAST 5 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */ /* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ * defines, either the default (minimum-sum-of-absolute-differences), or * the experimental method (weighted-minimum-sum-of-absolute-differences). * * Weights are factors >= 1.0, indicating how important it is to keep the * filter type consistent between rows. Larger numbers mean the current * filter is that many times as likely to be the same as the "num_weights" * previous filters. This is cumulative for each previous row with a weight. * There needs to be "num_weights" values in "filter_weights", or it can be * NULL if the weights aren't being specified. Weights have no influence on * the selection of the first row filter. Well chosen weights can (in theory) * improve the compression for a given image. * * Costs are factors >= 1.0 indicating the relative decoding costs of a * filter type. Higher costs indicate more decoding expense, and are * therefore less likely to be selected over a filter with lower computational * costs. There needs to be a value in "filter_costs" for each valid filter * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't * setting the costs. Costs try to improve the speed of decompression without * unduly increasing the compressed image size. * * A negative weight or cost indicates the default value is to be used, and * values in the range [0.0, 1.0) indicate the value is to remain unchanged. * The default values for both weights and costs are currently 1.0, but may * change if good general weighting/cost heuristics can be found. If both * the weights and costs are set to 1.0, this degenerates the WEIGHTED method * to the UNWEIGHTED method, but with added encoding time/computation. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, int heuristic_method, int num_weights, png_doublep filter_weights, png_doublep filter_costs)); #endif #endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ /* Heuristic used for row filter selection. These defines should NOT be * changed. */ #define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ #define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ #define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ #define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ /* Set the library compression level. Currently, valid values range from * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 * (0 - no compression, 9 - "maximal" compression). Note that tests have * shown that zlib compression levels 3-6 usually perform as well as level 9 * for PNG images, and do considerably fewer caclulations. In the future, * these values may not correspond directly to the zlib compression levels. */ extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr, int level)); extern PNG_EXPORT(void,png_set_compression_mem_level) PNGARG((png_structp png_ptr, int mem_level)); extern PNG_EXPORT(void,png_set_compression_strategy) PNGARG((png_structp png_ptr, int strategy)); extern PNG_EXPORT(void,png_set_compression_window_bits) PNGARG((png_structp png_ptr, int window_bits)); extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr, int method)); /* These next functions are called for input/output, memory, and error * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, * and call standard C I/O routines such as fread(), fwrite(), and * fprintf(). These functions can be made to use other I/O routines * at run time for those applications that need to handle I/O in a * different manner by calling png_set_???_fn(). See libpng.txt for * more information. */ #if !defined(PNG_NO_STDIO) /* Initialize the input/output for the PNG file to the default functions. */ extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp)); #endif /* Replace the (error and abort), and warning functions with user * supplied functions. If no messages are to be printed you must still * write and use replacement functions. The replacement error_fn should * still do a longjmp to the last setjmp location if you are using this * method of error handling. If error_fn or warning_fn is NULL, the * default function will be used. */ extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); /* Return the user pointer associated with the error functions */ extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr)); /* Replace the default data output functions with a user supplied one(s). * If buffered output is not used, then output_flush_fn can be set to NULL. * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time * output_flush_fn will be ignored (and thus can be NULL). * It is probably a mistake to use NULL for output_flush_fn if * write_data_fn is not also NULL unless you have built libpng with * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's * default flush function, which uses the standard *FILE structure, will * be used. */ extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr, png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); /* Replace the default data input function with a user supplied one. */ extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr, png_voidp io_ptr, png_rw_ptr read_data_fn)); /* Return the user pointer associated with the I/O functions */ extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr, png_read_status_ptr read_row_fn)); extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr, png_write_status_ptr write_row_fn)); #ifdef PNG_USER_MEM_SUPPORTED /* Replace the default memory allocation functions with user supplied one(s). */ extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); /* Return the user pointer associated with the memory functions */ extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp png_ptr, png_user_transform_ptr read_user_transform_fn)); #endif #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp png_ptr, png_user_transform_ptr write_user_transform_fn)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp png_ptr, png_voidp user_transform_ptr, int user_transform_depth, int user_transform_channels)); /* Return the user pointer associated with the user transform functions */ extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_USER_CHUNKS_SUPPORTED extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr, png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_PROGRESSIVE_READ_SUPPORTED /* Sets the function callbacks for the push reader, and a pointer to a * user-defined structure available to the callback functions. */ extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr, png_voidp progressive_ptr, png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); /* returns the user pointer associated with the push read functions */ extern PNG_EXPORT(png_voidp,png_get_progressive_ptr) PNGARG((png_structp png_ptr)); /* function to be called when data becomes available */ extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep buffer, png_size_t buffer_size)); /* function that combines rows. Not very much different than the * png_combine_row() call. Is this even used????? */ extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr, png_bytep old_row, png_bytep new_row)); #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr, png_uint_32 size)); #if defined(PNG_1_0_X) # define png_malloc_warn png_malloc #else /* Added at libpng version 1.2.4 */ extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr, png_uint_32 size)); #endif /* frees a pointer allocated by png_malloc() */ extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr)); #if defined(PNG_1_0_X) /* Function to allocate memory for zlib. */ extern PNG_EXPORT(voidpf,png_zalloc) PNGARG((voidpf png_ptr, uInt items, uInt size)); /* Function to free memory for zlib */ extern PNG_EXPORT(void,png_zfree) PNGARG((voidpf png_ptr, voidpf ptr)); #endif /* Free data that was allocated internally */ extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 free_me, int num)); #ifdef PNG_FREE_ME_SUPPORTED /* Reassign responsibility for freeing existing data, whether allocated * by libpng or by the application */ extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr, png_infop info_ptr, int freer, png_uint_32 mask)); #endif /* assignments for png_data_freer */ #define PNG_DESTROY_WILL_FREE_DATA 1 #define PNG_SET_WILL_FREE_DATA 1 #define PNG_USER_WILL_FREE_DATA 2 /* Flags for png_ptr->free_me and info_ptr->free_me */ #define PNG_FREE_HIST 0x0008 #define PNG_FREE_ICCP 0x0010 #define PNG_FREE_SPLT 0x0020 #define PNG_FREE_ROWS 0x0040 #define PNG_FREE_PCAL 0x0080 #define PNG_FREE_SCAL 0x0100 #define PNG_FREE_UNKN 0x0200 #define PNG_FREE_LIST 0x0400 #define PNG_FREE_PLTE 0x1000 #define PNG_FREE_TRNS 0x2000 #define PNG_FREE_TEXT 0x4000 #define PNG_FREE_ALL 0x7fff #define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ #ifdef PNG_USER_MEM_SUPPORTED extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr, png_uint_32 size)); extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr, png_voidp ptr)); #endif extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr, png_voidp s1, png_voidp s2, png_uint_32 size)); extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr, png_voidp s1, int value, png_uint_32 size)); #if defined(USE_FAR_KEYWORD) /* memory model conversion function */ extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr, int check)); #endif /* USE_FAR_KEYWORD */ #ifndef PNG_NO_ERROR_TEXT /* Fatal error in PNG image of libpng - can't continue */ extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr, png_const_charp error_message)); /* The same, but the chunk name is prepended to the error string. */ extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr, png_const_charp error_message)); #else /* Fatal error in PNG image of libpng - can't continue */ extern PNG_EXPORT(void,png_err) PNGARG((png_structp png_ptr)); #endif #ifndef PNG_NO_WARNINGS /* Non-fatal error in libpng. Can continue, but may have a problem. */ extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr, png_const_charp warning_message)); #ifdef PNG_READ_SUPPORTED /* Non-fatal error in libpng, chunk name is prepended to message. */ extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr, png_const_charp warning_message)); #endif /* PNG_READ_SUPPORTED */ #endif /* PNG_NO_WARNINGS */ /* The png_set_ functions are for storing values in the png_info_struct. * Similarly, the png_get_ calls are used to read values from the * png_info_struct, either storing the parameters in the passed variables, or * setting pointers into the png_info_struct where the data is stored. The * png_get_ functions return a non-zero value if the data was available * in info_ptr, or return zero and do not change any of the parameters if the * data was not available. * * These functions should be used instead of directly accessing png_info * to avoid problems with future changes in the size and internal layout of * png_info_struct. */ /* Returns "flag" if chunk data is valid in info_ptr. */ extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 flag)); /* Returns number of bytes needed to hold a transformed row. */ extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_INFO_IMAGE_SUPPORTED) /* Returns row_pointers, which is an array of pointers to scanlines that was returned from png_read_png(). */ extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Set row_pointers, which is an array of pointers to scanlines for use by png_write_png(). */ extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)); #endif /* Returns number of color channels in image. */ extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifdef PNG_EASY_ACCESS_SUPPORTED /* Returns image width in pixels. */ extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image height in pixels. */ extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image bit_depth. */ extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image color_type. */ extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image filter_type. */ extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image interlace_type. */ extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image compression_type. */ extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image resolution in pixels per meter, from pHYs chunk data. */ extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns pixel aspect ratio, computed from pHYs chunk data. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* PNG_EASY_ACCESS_SUPPORTED */ /* Returns pointer to signature string read from PNG header */ extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_bKGD_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_16p *background)); #endif #if defined(PNG_bKGD_SUPPORTED) extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_16p background)); #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, double *white_x, double *white_y, double *red_x, double *red_y, double *green_x, double *green_y, double *blue_x, double *blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y, png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point *int_blue_x, png_fixed_point *int_blue_y)); #endif #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, double green_y, double blue_x, double blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif #endif #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr, png_infop info_ptr, double *file_gamma)); #endif extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point *int_file_gamma)); #endif #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr, png_infop info_ptr, double file_gamma)); #endif extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point int_file_gamma)); #endif #if defined(PNG_hIST_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)); #endif #if defined(PNG_hIST_SUPPORTED) extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)); #endif extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, int *interlace_method, int *compression_method, int *filter_method)); extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int interlace_method, int compression_method, int filter_method)); #if defined(PNG_oFFs_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)); #endif #if defined(PNG_oFFs_SUPPORTED) extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y, int unit_type)); #endif #if defined(PNG_pCAL_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, png_charp *units, png_charpp *params)); #endif #if defined(PNG_pCAL_SUPPORTED) extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_charp units, png_charpp params)); #endif #if defined(PNG_pHYs_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); #endif #if defined(PNG_pHYs_SUPPORTED) extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); #endif extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr, png_colorp *palette, int *num_palette)); extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr, png_colorp palette, int num_palette)); #if defined(PNG_sBIT_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)); #endif #if defined(PNG_sBIT_SUPPORTED) extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_8p sig_bit)); #endif #if defined(PNG_sRGB_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr, png_infop info_ptr, int *intent)); #endif #if defined(PNG_sRGB_SUPPORTED) extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr, png_infop info_ptr, int intent)); extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, int intent)); #endif #if defined(PNG_iCCP_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charpp name, int *compression_type, png_charpp profile, png_uint_32 *proflen)); /* Note to maintainer: profile should be png_bytepp */ #endif #if defined(PNG_iCCP_SUPPORTED) extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp name, int compression_type, png_charp profile, png_uint_32 proflen)); /* Note to maintainer: profile should be png_bytep */ #endif #if defined(PNG_sPLT_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_sPLT_tpp entries)); #endif #if defined(PNG_sPLT_SUPPORTED) extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_sPLT_tp entries, int nentries)); #endif #if defined(PNG_TEXT_SUPPORTED) /* png_get_text also returns the number of text chunks in *num_text */ extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, int *num_text)); #endif /* * Note while png_set_text() will accept a structure whose text, * language, and translated keywords are NULL pointers, the structure * returned by png_get_text will always contain regular * zero-terminated C strings. They might be empty strings but * they will never be NULL pointers. */ #if defined(PNG_TEXT_SUPPORTED) extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, int num_text)); #endif #if defined(PNG_tIME_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)); #endif #if defined(PNG_tIME_SUPPORTED) extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr, png_infop info_ptr, png_timep mod_time)); #endif #if defined(PNG_tRNS_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep *trans, int *num_trans, png_color_16p *trans_values)); #endif #if defined(PNG_tRNS_SUPPORTED) extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep trans, int num_trans, png_color_16p trans_values)); #endif #if defined(PNG_tRNS_SUPPORTED) #endif #if defined(PNG_sCAL_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, int *unit, double *width, double *height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr, png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight)); #endif #endif #endif /* PNG_sCAL_SUPPORTED */ #if defined(PNG_sCAL_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, int unit, double width, double height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr, png_infop info_ptr, int unit, png_charp swidth, png_charp sheight)); #endif #endif #endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */ #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) /* provide a list of chunks and how they are to be handled, if the built-in handling or default unknown chunk handling is not desired. Any chunks not listed will be handled in the default manner. The IHDR and IEND chunks must not be listed. keep = 0: follow default behaviour = 1: do not keep = 2: keep only if safe-to-copy = 3: keep even if unsafe-to-copy */ extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp png_ptr, int keep, png_bytep chunk_list, int num_chunks)); extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr, png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)); extern PNG_EXPORT(void, png_set_unknown_chunk_location) PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location)); extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp png_ptr, png_infop info_ptr, png_unknown_chunkpp entries)); #endif #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep chunk_name)); #endif /* Png_free_data() will turn off the "valid" flag for anything it frees. If you need to turn it off for a chunk that your application has freed, you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */ extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr, png_infop info_ptr, int mask)); #if defined(PNG_INFO_IMAGE_SUPPORTED) /* The "params" pointer is currently not used and is for future expansion. */ extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr, png_infop info_ptr, int transforms, png_voidp params)); extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, png_infop info_ptr, int transforms, png_voidp params)); #endif /* Define PNG_DEBUG at compile time for debugging information. Higher * numbers for PNG_DEBUG mean more debugging information. This has * only been added since version 0.95 so it is not implemented throughout * libpng yet, but more support will be added as needed. */ #ifdef PNG_DEBUG #if (PNG_DEBUG > 0) #if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) #include #if (PNG_DEBUG > 1) #ifndef _DEBUG # define _DEBUG #endif #ifndef png_debug #define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) #endif #ifndef png_debug1 #define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) #endif #ifndef png_debug2 #define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) #endif #endif #else /* PNG_DEBUG_FILE || !_MSC_VER */ #ifndef PNG_DEBUG_FILE #define PNG_DEBUG_FILE stderr #endif /* PNG_DEBUG_FILE */ #if (PNG_DEBUG > 1) /* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on * non-ISO compilers */ # ifdef __STDC__ # ifndef png_debug # define png_debug(l,m) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ } # endif # ifndef png_debug1 # define png_debug1(l,m,p1) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ } # endif # ifndef png_debug2 # define png_debug2(l,m,p1,p2) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ } # endif # else /* __STDC __ */ # ifndef png_debug # define png_debug(l,m) \ { \ int num_tabs=l; \ char format[256]; \ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ m,PNG_STRING_NEWLINE); \ fprintf(PNG_DEBUG_FILE,format); \ } # endif # ifndef png_debug1 # define png_debug1(l,m,p1) \ { \ int num_tabs=l; \ char format[256]; \ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ m,PNG_STRING_NEWLINE); \ fprintf(PNG_DEBUG_FILE,format,p1); \ } # endif # ifndef png_debug2 # define png_debug2(l,m,p1,p2) \ { \ int num_tabs=l; \ char format[256]; \ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ m,PNG_STRING_NEWLINE); \ fprintf(PNG_DEBUG_FILE,format,p1,p2); \ } # endif # endif /* __STDC __ */ #endif /* (PNG_DEBUG > 1) */ #endif /* _MSC_VER */ #endif /* (PNG_DEBUG > 0) */ #endif /* PNG_DEBUG */ #ifndef png_debug #define png_debug(l, m) #endif #ifndef png_debug1 #define png_debug1(l, m, p1) #endif #ifndef png_debug2 #define png_debug2(l, m, p1, p2) #endif extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr)); #ifdef PNG_MNG_FEATURES_SUPPORTED extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp png_ptr, png_uint_32 mng_features_permitted)); #endif /* For use in png_set_keep_unknown, added to version 1.2.6 */ #define PNG_HANDLE_CHUNK_AS_DEFAULT 0 #define PNG_HANDLE_CHUNK_NEVER 1 #define PNG_HANDLE_CHUNK_IF_SAFE 2 #define PNG_HANDLE_CHUNK_ALWAYS 3 /* Added to version 1.2.0 */ #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) #if defined(PNG_MMX_CODE_SUPPORTED) #define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED 0x01 /* not user-settable */ #define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU 0x02 /* not user-settable */ #define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW 0x04 #define PNG_ASM_FLAG_MMX_READ_INTERLACE 0x08 #define PNG_ASM_FLAG_MMX_READ_FILTER_SUB 0x10 #define PNG_ASM_FLAG_MMX_READ_FILTER_UP 0x20 #define PNG_ASM_FLAG_MMX_READ_FILTER_AVG 0x40 #define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80 #define PNG_ASM_FLAGS_INITIALIZED 0x80000000 /* not user-settable */ #define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ | PNG_ASM_FLAG_MMX_READ_INTERLACE \ | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ | PNG_ASM_FLAG_MMX_READ_FILTER_UP \ | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ) #define PNG_MMX_WRITE_FLAGS ( 0 ) #define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \ | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU \ | PNG_MMX_READ_FLAGS \ | PNG_MMX_WRITE_FLAGS ) #define PNG_SELECT_READ 1 #define PNG_SELECT_WRITE 2 #endif /* PNG_MMX_CODE_SUPPORTED */ #if !defined(PNG_1_0_X) /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask) PNGARG((int flag_select, int *compilerID)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask) PNGARG((int flag_select)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_asm_flags) PNGARG((png_structp png_ptr)); /* pngget.c */ extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold) PNGARG((png_structp png_ptr)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold) PNGARG((png_structp png_ptr)); /* pngset.c */ extern PNG_EXPORT(void,png_set_asm_flags) PNGARG((png_structp png_ptr, png_uint_32 asm_flags)); /* pngset.c */ extern PNG_EXPORT(void,png_set_mmx_thresholds) PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold, png_uint_32 mmx_rowbytes_threshold)); #endif /* PNG_1_0_X */ #if !defined(PNG_1_0_X) /* png.c, pnggccrd.c, or pngvcrd.c */ extern PNG_EXPORT(int,png_mmx_support) PNGARG((void)); #endif /* PNG_1_0_X */ #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ /* Strip the prepended error numbers ("#nnn ") from error and warning * messages before passing them to the error or warning handler. */ #ifdef PNG_ERROR_NUMBERS_SUPPORTED extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp png_ptr, png_uint_32 strip_mode)); #endif /* Added at libpng-1.2.6 */ #ifdef PNG_SET_USER_LIMITS_SUPPORTED extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max)); extern PNG_EXPORT(png_uint_32,png_get_user_width_max) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp png_ptr)); #endif /* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */ #ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED /* With these routines we avoid an integer divide, which will be slower on * most machines. However, it does take more operations than the corresponding * divide method, so it may be slower on a few RISC systems. There are two * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. * * Note that the rounding factors are NOT supposed to be the same! 128 and * 32768 are correct for the NODIV code; 127 and 32767 are correct for the * standard method. * * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] */ /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ # define png_composite(composite, fg, alpha, bg) \ { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \ + (png_uint_16)(bg)*(png_uint_16)(255 - \ (png_uint_16)(alpha)) + (png_uint_16)128); \ (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } # define png_composite_16(composite, fg, alpha, bg) \ { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \ + (png_uint_32)(bg)*(png_uint_32)(65535L - \ (png_uint_32)(alpha)) + (png_uint_32)32768L); \ (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } #else /* standard method using integer division */ # define png_composite(composite, fg, alpha, bg) \ (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ (png_uint_16)127) / 255) # define png_composite_16(composite, fg, alpha, bg) \ (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ (png_uint_32)32767) / (png_uint_32)65535L) #endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ /* Inline macros to do direct reads of bytes from the input buffer. These * require that you are using an architecture that uses PNG byte ordering * (MSB first) and supports unaligned data storage. I think that PowerPC * in big-endian mode and 680x0 are the only ones that will support this. * The x86 line of processors definitely do not. The png_get_int_32() * routine also assumes we are using two's complement format for negative * values, which is almost certainly true. */ #if defined(PNG_READ_BIG_ENDIAN_SUPPORTED) # define png_get_uint_32(buf) ( *((png_uint_32p) (buf))) # define png_get_uint_16(buf) ( *((png_uint_16p) (buf))) # define png_get_int_32(buf) ( *((png_int_32p) (buf))) #else extern PNG_EXPORT(png_uint_32,png_get_uint_32) PNGARG((png_bytep buf)); extern PNG_EXPORT(png_uint_16,png_get_uint_16) PNGARG((png_bytep buf)); extern PNG_EXPORT(png_int_32,png_get_int_32) PNGARG((png_bytep buf)); #endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */ extern PNG_EXPORT(png_uint_32,png_get_uint_31) PNGARG((png_structp png_ptr, png_bytep buf)); /* No png_get_int_16 -- may be added if there's a real need for it. */ /* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ extern PNG_EXPORT(void,png_save_uint_32) PNGARG((png_bytep buf, png_uint_32 i)); extern PNG_EXPORT(void,png_save_int_32) PNGARG((png_bytep buf, png_int_32 i)); /* Place a 16-bit number into a buffer in PNG byte order. * The parameter is declared unsigned int, not png_uint_16, * just to avoid potential problems on pre-ANSI C compilers. */ extern PNG_EXPORT(void,png_save_uint_16) PNGARG((png_bytep buf, unsigned int i)); /* No png_save_int_16 -- may be added if there's a real need for it. */ /* ************************************************************************* */ /* These next functions are used internally in the code. They generally * shouldn't be used unless you are writing code to add or replace some * functionality in libpng. More information about most functions can * be found in the files where the functions are located. */ /* Various modes of operation, that are visible to applications because * they are used for unknown chunk location. */ #define PNG_HAVE_IHDR 0x01 #define PNG_HAVE_PLTE 0x02 #define PNG_HAVE_IDAT 0x04 #define PNG_AFTER_IDAT 0x08 /* Have complete zlib datastream */ #define PNG_HAVE_IEND 0x10 #if defined(PNG_INTERNAL) /* More modes of operation. Note that after an init, mode is set to * zero automatically when the structure is created. */ #define PNG_HAVE_gAMA 0x20 #define PNG_HAVE_cHRM 0x40 #define PNG_HAVE_sRGB 0x80 #define PNG_HAVE_CHUNK_HEADER 0x100 #define PNG_WROTE_tIME 0x200 #define PNG_WROTE_INFO_BEFORE_PLTE 0x400 #define PNG_BACKGROUND_IS_GRAY 0x800 #define PNG_HAVE_PNG_SIGNATURE 0x1000 #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ /* flags for the transformations the PNG library does on the image data */ #define PNG_BGR 0x0001 #define PNG_INTERLACE 0x0002 #define PNG_PACK 0x0004 #define PNG_SHIFT 0x0008 #define PNG_SWAP_BYTES 0x0010 #define PNG_INVERT_MONO 0x0020 #define PNG_DITHER 0x0040 #define PNG_BACKGROUND 0x0080 #define PNG_BACKGROUND_EXPAND 0x0100 /* 0x0200 unused */ #define PNG_16_TO_8 0x0400 #define PNG_RGBA 0x0800 #define PNG_EXPAND 0x1000 #define PNG_GAMMA 0x2000 #define PNG_GRAY_TO_RGB 0x4000 #define PNG_FILLER 0x8000L #define PNG_PACKSWAP 0x10000L #define PNG_SWAP_ALPHA 0x20000L #define PNG_STRIP_ALPHA 0x40000L #define PNG_INVERT_ALPHA 0x80000L #define PNG_USER_TRANSFORM 0x100000L #define PNG_RGB_TO_GRAY_ERR 0x200000L #define PNG_RGB_TO_GRAY_WARN 0x400000L #define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */ /* 0x800000L Unused */ #define PNG_ADD_ALPHA 0x1000000L /* Added to libpng-1.2.7 */ #define PNG_EXPAND_tRNS 0x2000000L /* Added to libpng-1.2.9 */ /* 0x4000000L unused */ /* 0x8000000L unused */ /* 0x10000000L unused */ /* 0x20000000L unused */ /* 0x40000000L unused */ /* flags for png_create_struct */ #define PNG_STRUCT_PNG 0x0001 #define PNG_STRUCT_INFO 0x0002 /* Scaling factor for filter heuristic weighting calculations */ #define PNG_WEIGHT_SHIFT 8 #define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) #define PNG_COST_SHIFT 3 #define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) /* flags for the png_ptr->flags rather than declaring a byte for each one */ #define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 #define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002 #define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004 #define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008 #define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010 #define PNG_FLAG_ZLIB_FINISHED 0x0020 #define PNG_FLAG_ROW_INIT 0x0040 #define PNG_FLAG_FILLER_AFTER 0x0080 #define PNG_FLAG_CRC_ANCILLARY_USE 0x0100 #define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200 #define PNG_FLAG_CRC_CRITICAL_USE 0x0400 #define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800 #define PNG_FLAG_FREE_PLTE 0x1000 #define PNG_FLAG_FREE_TRNS 0x2000 #define PNG_FLAG_FREE_HIST 0x4000 #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L #define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L #define PNG_FLAG_LIBRARY_MISMATCH 0x20000L #define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L #define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L #define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L #define PNG_FLAG_ADD_ALPHA 0x200000L /* Added to libpng-1.2.8 */ #define PNG_FLAG_STRIP_ALPHA 0x400000L /* Added to libpng-1.2.8 */ /* 0x800000L unused */ /* 0x1000000L unused */ /* 0x2000000L unused */ /* 0x4000000L unused */ /* 0x8000000L unused */ /* 0x10000000L unused */ /* 0x20000000L unused */ /* 0x40000000L unused */ #define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \ PNG_FLAG_CRC_ANCILLARY_NOWARN) #define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \ PNG_FLAG_CRC_CRITICAL_IGNORE) #define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ PNG_FLAG_CRC_CRITICAL_MASK) /* save typing and make code easier to understand */ #define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ abs((int)((c1).green) - (int)((c2).green)) + \ abs((int)((c1).blue) - (int)((c2).blue))) /* Added to libpng-1.2.6 JB */ #define PNG_ROWBYTES(pixel_bits, width) \ ((pixel_bits) >= 8 ? \ ((width) * (((png_uint_32)(pixel_bits)) >> 3)) : \ (( ((width) * ((png_uint_32)(pixel_bits))) + 7) >> 3) ) /* PNG_OUT_OF_RANGE returns true if value is outside the range ideal-delta..ideal+delta. Each argument is evaluated twice. "ideal" and "delta" should be constants, normally simple integers, "value" a variable. Added to libpng-1.2.6 JB */ #define PNG_OUT_OF_RANGE(value, ideal, delta) \ ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) ) /* variables declared in png.c - only it needs to define PNG_NO_EXTERN */ #if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) /* place to hold the signature string for a PNG file. */ #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (PNG_CONST png_byte FARDATA) png_sig[8]; #else #endif #endif /* PNG_NO_EXTERN */ /* Constant strings for known chunk types. If you need to add a chunk, * define the name here, and add an invocation of the macro in png.c and * wherever it's needed. */ #define PNG_IHDR png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} #define PNG_IDAT png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} #define PNG_IEND png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} #define PNG_PLTE png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} #define PNG_bKGD png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} #define PNG_cHRM png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} #define PNG_gAMA png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} #define PNG_hIST png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} #define PNG_iCCP png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} #define PNG_iTXt png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} #define PNG_oFFs png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} #define PNG_pCAL png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} #define PNG_sCAL png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} #define PNG_pHYs png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} #define PNG_sBIT png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} #define PNG_sPLT png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} #define PNG_sRGB png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} #define PNG_tEXt png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} #define PNG_tIME png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} #define PNG_tRNS png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} #define PNG_zTXt png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (png_byte FARDATA) png_IHDR[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_IDAT[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_IEND[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_PLTE[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_bKGD[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_cHRM[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_gAMA[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_hIST[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_iCCP[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_iTXt[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_oFFs[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_pCAL[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sCAL[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_pHYs[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sBIT[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sPLT[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_sRGB[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_tEXt[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_tIME[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_tRNS[5]; PNG_EXPORT_VAR (png_byte FARDATA) png_zTXt[5]; #endif /* PNG_USE_GLOBAL_ARRAYS */ #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Initialize png_ptr struct for reading, and allocate any other memory. * (old interface - DEPRECATED - use png_create_read_struct instead). */ extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr)); #undef png_read_init #define png_read_init(png_ptr) png_read_init_3(&png_ptr, \ PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); #endif extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr, png_const_charp user_png_ver, png_size_t png_struct_size)); #if defined(PNG_1_0_X) || defined (PNG_1_2_X) extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr, png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t png_info_size)); #endif #if defined(PNG_1_0_X) || defined (PNG_1_2_X) /* Initialize png_ptr struct for writing, and allocate any other memory. * (old interface - DEPRECATED - use png_create_write_struct instead). */ extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr)); #undef png_write_init #define png_write_init(png_ptr) png_write_init_3(&png_ptr, \ PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); #endif extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr, png_const_charp user_png_ver, png_size_t png_struct_size)); extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr, png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t png_info_size)); /* Allocate memory for an internal libpng struct */ PNG_EXTERN png_voidp png_create_struct PNGARG((int type)); /* Free memory from internal libpng struct */ PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)); PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr, png_free_ptr free_fn, png_voidp mem_ptr)); /* Free any memory that info_ptr points to and reset struct. */ PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_1_0_X /* Function to allocate memory for zlib. */ PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size)); /* Function to free memory for zlib */ PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); #ifdef PNG_SIZE_T /* Function to convert a sizeof an item to png_sizeof item */ PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); #endif /* Next four functions are used internally as callbacks. PNGAPI is required * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3. */ PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t length)); #endif PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); #if defined(PNG_WRITE_FLUSH_SUPPORTED) #if !defined(PNG_NO_STDIO) PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr)); #endif #endif #else /* PNG_1_0_X */ #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t length)); #endif #endif /* PNG_1_0_X */ /* Reset the CRC variable */ PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); /* Write the "data" buffer to whatever output you are using. */ PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Read data from whatever input you are using into the "data" buffer */ PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Read bytes into buf, and update png_ptr->crc */ PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf, png_size_t length)); /* Decompress data in a chunk that uses compression */ #if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \ defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr, int comp_type, png_size_t chunklength, png_size_t prefix_length, png_size_t *data_length)); #endif /* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip)); /* Read the CRC from the file and compare it to the libpng calculated CRC */ PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr)); /* Calculate the CRC over a section of data. Note that we are only * passing a maximum of 64K on systems that have this as a memory limit, * since this is the maximum buffer size we can specify. */ PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr, png_size_t length)); #if defined(PNG_WRITE_FLUSH_SUPPORTED) PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); #endif /* simple function to write the signature */ PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr)); /* write various chunks */ /* Write the IHDR chunk, and update the png_struct with the necessary * information. */ PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int compression_method, int filter_method, int interlace_method)); PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)); PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); #if defined(PNG_WRITE_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point file_gamma)); #endif #endif #if defined(PNG_WRITE_sBIT_SUPPORTED) PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit, int color_type)); #endif #if defined(PNG_WRITE_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, double green_y, double blue_x, double blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif #endif #if defined(PNG_WRITE_sRGB_SUPPORTED) PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr, int intent)); #endif #if defined(PNG_WRITE_iCCP_SUPPORTED) PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr, png_charp name, int compression_type, png_charp profile, int proflen)); /* Note to maintainer: profile should be png_bytep */ #endif #if defined(PNG_WRITE_sPLT_SUPPORTED) PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr, png_sPLT_tp palette)); #endif #if defined(PNG_WRITE_tRNS_SUPPORTED) PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans, png_color_16p values, int number, int color_type)); #endif #if defined(PNG_WRITE_bKGD_SUPPORTED) PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr, png_color_16p values, int color_type)); #endif #if defined(PNG_WRITE_hIST_SUPPORTED) PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist, int num_hist)); #endif #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, png_charp key, png_charpp new_key)); #endif #if defined(PNG_WRITE_tEXt_SUPPORTED) PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key, png_charp text, png_size_t text_len)); #endif #if defined(PNG_WRITE_zTXt_SUPPORTED) PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key, png_charp text, png_size_t text_len, int compression)); #endif #if defined(PNG_WRITE_iTXt_SUPPORTED) PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr, int compression, png_charp key, png_charp lang, png_charp lang_key, png_charp text)); #endif #if defined(PNG_TEXT_SUPPORTED) /* Added at version 1.0.14 and 1.2.4 */ PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, int num_text)); #endif #if defined(PNG_WRITE_oFFs_SUPPORTED) PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset, int unit_type)); #endif #if defined(PNG_WRITE_pCAL_SUPPORTED) PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_charp units, png_charpp params)); #endif #if defined(PNG_WRITE_pHYs_SUPPORTED) PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr, png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, int unit_type)); #endif #if defined(PNG_WRITE_tIME_SUPPORTED) PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr, png_timep mod_time)); #endif #if defined(PNG_WRITE_sCAL_SUPPORTED) #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr, int unit, double width, double height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr, int unit, png_charp width, png_charp height)); #endif #endif #endif /* Called when finished processing a row of data */ PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); /* Internal use only. Called before first row of data */ PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr)); #endif /* combine a row of data, dealing with alpha, etc. if requested */ PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row, int mask)); #if defined(PNG_READ_INTERLACING_SUPPORTED) /* expand an interlaced row */ /* OLD pre-1.0.9 interface: PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info, png_bytep row, int pass, png_uint_32 transformations)); */ PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); #endif /* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */ #if defined(PNG_WRITE_INTERLACING_SUPPORTED) /* grab pixels out of a row for an interlaced pass */ PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, png_bytep row, int pass)); #endif /* unfilter a row */ PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr, png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter)); /* Choose the best filter to use and filter the row data */ PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, png_row_infop row_info)); /* Write out the filtered row. */ PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, png_bytep filtered_row)); /* finish a row while reading, dealing with interlacing passes, etc. */ PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); /* initialize the row buffers, etc. */ PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr)); /* optional call to update the users info structure */ PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, png_infop info_ptr)); /* these are the functions that do the transformations */ #if defined(PNG_READ_FILLER_SUPPORTED) PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 filler, png_uint_32 flags)); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_FILLER_SUPPORTED) || \ defined(PNG_READ_STRIP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 flags)); #endif #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_PACK_SUPPORTED) PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row, png_color_8p sig_bits)); #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_DITHER_SUPPORTED) PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info, png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup)); # if defined(PNG_CORRECT_PALETTE_SUPPORTED) PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr, png_colorp palette, int num_palette)); # endif #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_PACK_SUPPORTED) PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)); #endif #if defined(PNG_WRITE_SHIFT_SUPPORTED) PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row, png_color_8p bit_depth)); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_values, png_color_16p background, png_color_16p background_1, png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, png_uint_16pp gamma_16_to_1, int gamma_shift)); #else PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_values, png_color_16p background)); #endif #endif #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row, png_bytep gamma_table, png_uint_16pp gamma_16_table, int gamma_shift)); #endif #if defined(PNG_READ_EXPAND_SUPPORTED) PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info, png_bytep row, png_colorp palette, png_bytep trans, int num_trans)); PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_value)); #endif /* The following decodes the appropriate chunks, and does error correction, * then calls the appropriate callback for the chunk if it is valid. */ /* decode the IHDR chunk */ PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #if defined(PNG_READ_bKGD_SUPPORTED) PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_cHRM_SUPPORTED) PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_gAMA_SUPPORTED) PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_hIST_SUPPORTED) PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_iCCP_SUPPORTED) extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif /* PNG_READ_iCCP_SUPPORTED */ #if defined(PNG_READ_iTXt_SUPPORTED) PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_oFFs_SUPPORTED) PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_pCAL_SUPPORTED) PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_pHYs_SUPPORTED) PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sBIT_SUPPORTED) PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sCAL_SUPPORTED) PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sPLT_SUPPORTED) extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif /* PNG_READ_sPLT_SUPPORTED */ #if defined(PNG_READ_sRGB_SUPPORTED) PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tEXt_SUPPORTED) PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tIME_SUPPORTED) PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tRNS_SUPPORTED) PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, png_bytep chunk_name)); /* handle the transformations for reading and writing */ PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr)); PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr)); PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, png_uint_32 length)); PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)); PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr)); PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)); PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row)); PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr)); #if defined(PNG_READ_tEXt_SUPPORTED) PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_READ_iTXt_SUPPORTED) PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #ifdef PNG_MNG_FEATURES_SUPPORTED PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info, png_bytep row)); PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) #if defined(PNG_MMX_CODE_SUPPORTED) /* png.c */ /* PRIVATE */ PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr)); #endif #endif #if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) PNG_EXTERN png_uint_32 png_get_pixels_per_inch PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN png_uint_32 png_get_x_pixels_per_inch PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN png_uint_32 png_get_y_pixels_per_inch PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN float png_get_x_offset_inches PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN float png_get_y_offset_inches PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_pHYs_SUPPORTED) PNG_EXTERN png_uint_32 png_get_pHYs_dpi PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); #endif /* PNG_pHYs_SUPPORTED */ #endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ /* Read the chunk header (length + type name) */ PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr)); /* Added at libpng version 1.2.34 */ #if defined(PNG_cHRM_SUPPORTED) PNG_EXTERN int png_check_cHRM_fixed PNGARG((png_structp png_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ #endif /* PNG_INTERNAL */ #ifdef __cplusplus } #endif #endif /* PNG_VERSION_INFO_ONLY */ /* do not put anything past this line */ #endif /* PNG_H */ angband-3.5.1/src/win/include/zconf.h0000644000175000017500000002243012456456607016741 0ustar chriscchrisc/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #ifndef ZCONF_H #define ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. */ #ifdef Z_PREFIX # define deflateInit_ z_deflateInit_ # define deflate z_deflate # define deflateEnd z_deflateEnd # define inflateInit_ z_inflateInit_ # define inflate z_inflate # define inflateEnd z_inflateEnd # define deflateInit2_ z_deflateInit2_ # define deflateSetDictionary z_deflateSetDictionary # define deflateCopy z_deflateCopy # define deflateReset z_deflateReset # define deflateParams z_deflateParams # define deflateBound z_deflateBound # define deflatePrime z_deflatePrime # define inflateInit2_ z_inflateInit2_ # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateCopy z_inflateCopy # define inflateReset z_inflateReset # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound # define uncompress z_uncompress # define adler32 z_adler32 # define crc32 z_crc32 # define get_crc_table z_get_crc_table # define zError z_zError # define alloc_func z_alloc_func # define free_func z_free_func # define in_func z_in_func # define out_func z_out_func # define Byte z_Byte # define uInt z_uInt # define uLong z_uLong # define Bytef z_Bytef # define charf z_charf # define intf z_intf # define uIntf z_uIntf # define uLongf z_uLongf # define voidpf z_voidpf # define voidp z_voidp #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) # define OS2 #endif #if defined(_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) # ifndef WIN32 # define WIN32 # endif #endif #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # ifndef SYS16BIT # define SYS16BIT # endif # endif #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #ifdef SYS16BIT # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #ifdef __STDC_VERSION__ # ifndef STDC # define STDC # endif # if __STDC_VERSION__ >= 199901L # ifndef STDC99 # define STDC99 # endif # endif #endif #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) # define STDC #endif #if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) # define STDC #endif #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) # define STDC #endif #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) # define STDC #endif #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ # define STDC #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const /* note: need a more gentle solution here */ # endif #endif /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #ifdef SYS16BIT # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif # endif # if (defined(__SMALL__) || defined(__MEDIUM__)) /* Turbo C small or medium model */ # define SMALL_MEDIUM # ifdef __BORLANDC__ # define FAR _far # else # define FAR far # endif # endif #endif #if defined(WINDOWS) || defined(WIN32) /* If building or using zlib as a DLL, define ZLIB_DLL. * This is not mandatory, but it offers a little performance increase. */ # ifdef ZLIB_DLL # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) # ifdef ZLIB_INTERNAL # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif # endif # endif /* ZLIB_DLL */ /* If building or using zlib with the WINAPI/WINAPIV calling convention, * define ZLIB_WINAPI. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. */ # ifdef ZLIB_WINAPI # ifdef FAR # undef FAR # endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR CDECL # endif # endif #endif #if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) # define ZEXPORTVA __declspec(dllexport) # else # define ZEXPORT __declspec(dllimport) # define ZEXPORTVA __declspec(dllimport) # endif # endif #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef FAR # define FAR #endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void const *voidpc; typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte const *voidpc; typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #if defined(HAVE_UNISTD_H) # include /* for off_t */ # include /* for SEEK_* and off_t */ # ifdef VMS # include /* for off_t */ # endif # define z_off_t off_t #endif #ifndef SEEK_SET # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif #ifndef z_off_t # define z_off_t long #endif #if defined(__OS400__) # define NO_vsnprintf #endif #if defined(__MVS__) # define NO_vsnprintf # ifdef FAR # undef FAR # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) # pragma map(deflateInit_,"DEIN") # pragma map(deflateInit2_,"DEIN2") # pragma map(deflateEnd,"DEEND") # pragma map(deflateBound,"DEBND") # pragma map(inflateInit_,"ININ") # pragma map(inflateInit2_,"ININ2") # pragma map(inflateEnd,"INEND") # pragma map(inflateSync,"INSY") # pragma map(inflateSetDictionary,"INSEDI") # pragma map(compressBound,"CMBND") # pragma map(inflate_table,"INTABL") # pragma map(inflate_fast,"INFA") # pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ angband-3.5.1/src/win/include/zlib.h0000644000175000017500000020121412456456607016561 0ustar chriscchrisc/* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.3, July 18th, 2005 Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). */ #ifndef ZLIB_H #define ZLIB_H #include "zconf.h" #ifdef __cplusplus extern "C" { #endif #define ZLIB_VERSION "1.2.3" #define ZLIB_VERNUM 0x1230 /* The 'zlib' compression library provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface. Compression can be done in a single step if the buffers are large enough (for example if an input file is mmap'ed), or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call. The compressed data format used by default by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. This library can optionally read and write gzip streams in memory as well. The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total nb of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total nb of bytes output so far */ char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: binary or text */ uLong adler; /* adler32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; typedef z_stream FAR *z_streamp; /* gzip header information passed to and from zlib routines. See RFC 1952 for more details on the meanings of these fields. */ typedef struct gz_header_s { int text; /* true if compressed data believed to be text */ uLong time; /* modification time */ int xflags; /* extra flags (not used when writing a gzip file) */ int os; /* operating system */ Bytef *extra; /* pointer to extra field or Z_NULL if none */ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ uInt extra_max; /* space at extra (only when reading header) */ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ uInt name_max; /* space at name (only when reading header) */ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ uInt comm_max; /* space at comment (only when reading header) */ int hcrc; /* true if there was or will be a header crc */ int done; /* true when done reading gzip header (not used when writing a gzip file) */ } gz_header; typedef gz_header FAR *gz_headerp; /* The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application. The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value. zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use in the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 #define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 #define Z_NEED_DICT 2 #define Z_ERRNO (-1) #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR (-3) #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) /* Return codes for the compression/decompression functions. Negative * values are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1) /* compression levels */ #define Z_FILTERED 1 #define Z_HUFFMAN_ONLY 2 #define Z_RLE 3 #define Z_FIXED 4 #define Z_DEFAULT_STRATEGY 0 /* compression strategy; see deflateInit2() below for details */ #define Z_BINARY 0 #define Z_TEXT 1 #define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ #define Z_UNKNOWN 2 /* Possible values of the data_type field (though see inflate()) */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION requests a default compromise between speed and compression (currently equivalent to level 6). deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if level is not a valid compression level, Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter should be set only when necessary (in interactive applications). Some output may be provided even if flush is not set. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating avail_in or avail_out accordingly; avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to decide how much data to accumualte before producing output, in order to maximize compression. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. (In particular avail_in is zero after the call if enough output space has been provided before the call.) Flushing may degrade compression for some compression algorithms and so it should be used only when necessary. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using Z_FULL_FLUSH too often can seriously degrade compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no more input data, until it returns with Z_STREAM_END or an error. After deflate has returned Z_STREAM_END, the only possible operations on the stream are deflateReset or deflateEnd. Z_FINISH can be used immediately after deflateInit if all the compression is to be done in a single step. In this case, avail_out must be at least the value returned by deflateBound (see below). If deflate does not return Z_STREAM_END, then it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update strm->data_type if it can make a good guess about the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered binary. This field is only for information purposes and does not affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed prematurely (some input or output was discarded). In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. If next_in is not Z_NULL and avail_in is large enough (the exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller. msg is set to null if there is no error message. inflateInit does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in is updated and processing will resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating the next_* and avail_* values accordingly. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much output as possible to the output buffer. Z_BLOCK requests that inflate() stop if and when it gets to the next deflate block boundary. When decoding the zlib or gzip format, this will cause inflate() to return immediately after the header and before the first block. When doing a raw inflate, inflate() will go ahead and process the first block, and will return when it gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. Also to assist in this, on return inflate() will set strm->data_type to the number of unused bits in the last byte taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate stream. The end-of-block will not be indicated until all of the uncompressed data from that block has been written to strm->next_out. The number of unused bits may in general be greater than seven, except when bit 7 of data_type is set, in which case the number of unused bits will be less than eight. inflate() should normally be called until it returns Z_STREAM_END or an error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; avail_out must be large enough to hold all the uncompressed data. (The size of the uncompressed data may have been saved by the compressor for this purpose.) The next operation on this stream must be inflateEnd to deallocate the decompression state. The use of Z_FINISH is never required, but can be used to inform inflate that a faster approach may be used for the single inflate() call. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the first call. So the only effect of the flush parameter in this implementation is on the return value of inflate(), as noted below, or when it returns early because Z_BLOCK is used. If a preset dictionary is needed after this call (see inflateSetDictionary below), inflate sets strm->adler to the adler32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the adler32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. inflate() will decompress and check either zlib-wrapped or gzip-wrapped deflate data. The header type is detected automatically. Any information contained in the gzip header is not retained, so applications that need that information should instead use raw inflate, see inflateInit2() below, or inflateBack() and perform their own processing of the gzip header and trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value), Z_STREAM_ERROR if the stream structure was inconsistent (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to continue decompressing. If Z_DATA_ERROR is returned, the application may then call inflateSync() to look for a good compression block if a partial recovery of the data is desired. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* Advanced functions */ /* The following functions are needed only in some special applications. */ /* ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy)); This is another version of deflateInit with more compression options. The fields next_in, zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. windowBits can also be -8..-15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value. windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no header crc, and the operating system will be set to 255 (unknown). If a gzip stream is being written, strm->adler is a crc32 instead of an adler32. The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is slow and reduces compression ratio; memLevel=9 uses maximum memory for optimal speed. The default value is 8. See zconf.h for total memory usage as a function of windowBits and memLevel. The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length encoding). Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid method). msg is set to null if there is no error message. deflateInit2 does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. This function must be called immediately after deflateInit, deflateInit2 or deflateReset, before any call of deflate. The compressor and decompressor must use exactly the same dictionary (see inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be discarded, for example if the dictionary is larger than the window size in deflate or deflate2. Thus the strings most likely to be useful should be put at the end of the dictionary, not at the front. In addition, the current implementation of deflate will use at most the window size minus 262 bytes of the provided dictionary. Upon return of this function, strm->adler is set to the adler32 value of the dictionary; the decompressor may later use this value to determine which dictionary has been used by the compressor. (The adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the adler32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent (for example if deflate has already been called for this stream or if the compression method is bsort). deflateSetDictionary does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal compression state which can be quite large, so this strategy is slow and can consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate all the internal compression state. The stream will keep the same compression level and any other attributes that may have been set by deflateInit2. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int level, int strategy)); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression level is changed, the input available so far is compressed with the old level (and may be flushed); the new level will take effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for a call of deflate(), since the currently available input may have to be compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if strm->avail_out was zero. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain)); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for searching for the best matching string, and even then only by the most fanatic optimizer trying to squeeze out the last compressed bit for their specific input data. Read the deflate.c source code for the meaning of the max_lazy, good_length, nice_length, and max_chain parameters. deflateTune() can be called after deflateInit() or deflateInit2(), and returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(). This would be used to allocate an output buffer for deflation in a single pass, and so would be called before deflate(). */ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits leftover from a previous deflate stream when appending to it. As such, this function can only be used for raw deflate, and must be used before the first deflate() call after a deflateInit2() or deflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the output. deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gz_headerp head)); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called after deflateInit2() or deflateReset() and before the first call of deflate(). The text, time, os, extra field, name, and comment information in the provided gz_header structure are written to the gzip header (xflag is ignored -- the extra flags are set according to the compression level). The caller must assure that, if not Z_NULL, name and comment are terminated with a zero byte, and that if extra is not Z_NULL, that extra_len bytes are available there. If hcrc is true, a gzip header crc is included. Note that the current versions of the command-line version of gzip (up through version 1.3.x) do not support header crc's, and will report that it is a "multi-part gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, the time set to zero, and os set to 255, with no extra, name, or comment fields. The gzip header is returned to the default state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. The default value is 15 if inflateInit is used instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. windowBits can also be -8..-15 for raw inflate. In this case, -windowBits determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an adler32 or a crc32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a crc32 instead of an adler32. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg is set to null if there is no error message. inflateInit2 does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). For raw inflate, this function can be called immediately after inflateInit2() or inflateReset() and before any call of inflate() to set the dictionary. The application must insure that the dictionary that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* Skips invalid compressed data until a full flush point (see above the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the success case, the application may save the current current value of total_in which indicates where valid compressed data was found. In the error case, the application may repeatedly call inflateSync, providing more input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when randomly accessing a large stream. The first pass through the stream can periodically record the inflate state, allowing restarting inflate at those points when randomly accessing the stream. inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate all the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, int bits, int value)); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the middle of a byte. The provided bits will be used before any bytes are used from next_in. This function should only be used with raw inflate, and should be used before the first inflate() call after inflateInit2() or inflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the input. inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, gz_headerp head)); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after inflateInit2() or inflateReset(), and before the first call of inflate(). As inflate() processes the gzip stream, head->done is zero until the header is completed, at which time head->done is set to one. If a zlib stream is being decoded, then head->done is set to -1 to indicate that there will be no gzip header information forthcoming. Note that Z_BLOCK can be used to force inflate() to return immediately after header processing is complete and before any actual data is decompressed. The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC was valid if done is set to one.) If extra is not Z_NULL, then extra_max contains the maximum number of bytes to write to extra. Once done is true, extra_len contains the actual extra field length, and extra contains the extra field, or that field truncated if extra_max is less than extra_len. If name is not Z_NULL, then up to name_max characters are written there, terminated with a zero unless the length is greater than name_max. If comment is not Z_NULL, then up to comm_max characters are written there, terminated with a zero unless the length is greater than comm_max. When any of extra, name, or comment are not Z_NULL and the respective field is not present in the header, then that field is set to Z_NULL to signal its absence. This allows the use of deflateSetHeader() with the returned structure to duplicate the header. However if those fields are set to allocated memory, then the application will need to save those pointers elsewhere so that they can be eventually freed. If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header CRC if present. inflateReset() will reset the process to discard the header information. The application would need to call inflateGetHeader() again to retrieve the header from the next gzip stream. inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, unsigned char FAR *window)); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized before the call. If zalloc and zfree are Z_NULL, then the default library- derived memory allocation routines are used. windowBits is the base two logarithm of the window size, in the range 8..15. window is a caller supplied buffer of that size. Except for special applications where it is assured that deflate was used with small window sizes, windowBits must be 15 and a 32K byte window must be supplied to be able to decompress general deflate streams. See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of the paramaters are invalid, Z_MEM_ERROR if the internal state could not be allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc)); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is more efficient than inflate() for file i/o applications in that it avoids copying between the output and the sliding window by simply making the window itself the output buffer. This function trusts the application to not change the output buffer passed by the output function, at least until inflateBack() returns. inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw deflate stream with each call. inflateBackEnd() is then called to free the allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the header and process the trailer on its own, hence this routine expects only the raw deflate stream to decompress. This is different from the normal behavior of inflate(), which expects either a zlib or gzip header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then called by inflateBack() for input and output. inflateBack() calls those routines until it reads a complete deflate stream and writes out all of the uncompressed data, or until it encounters an error. The function's parameters and return types are defined above in the in_func and out_func typedefs. inflateBack() will call in(in_desc, &buf) which should return the number of bytes of provided input, and a pointer to that input in buf. If there is no input available, in() must return zero--buf is ignored in that case--and inflateBack() will return a buffer error. inflateBack() will call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() should return zero on success, or non-zero on failure. If out() returns non-zero, inflateBack() will return with an error. Neither in() nor out() are permitted to change the contents of the window provided to inflateBackInit(), which is also the buffer that out() uses to write from. The length written by out() will be at most the window size. Any non-zero amount of input may be provided by in(). For convenience, inflateBack() can be provided input on the first call by setting strm->next_in and strm->avail_in. If that input is exhausted, then in() will be called. Therefore strm->next_in must be initialized before calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These descriptors can be optionally used to pass any information that the caller- supplied in() and out() functions need to do their job. On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR if in() or out() returned an error, Z_DATA_ERROR if there was a format error in the deflate stream (in which case strm->msg is set to indicate the nature of the error), or Z_STREAM_ERROR if the stream was not properly initialized. In the case of Z_BUF_ERROR, an input or output error can be distinguished using strm->next_in which will be Z_NULL only if in() returned an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to out() returning non-zero. (in() will always be called before out(), so strm->next_in is assured to be defined if out() returns non-zero.) Note that inflateBack() cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); /* All memory allocated by inflateBackInit() is freed. inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream state was inconsistent. */ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: 1.0: size of uInt 3.2: size of uLong 5.4: size of voidpf (pointer) 7.6: size of z_off_t Compiler, assembler, and debug options: 8: DEBUG 9: ASMV or ASMINF -- use ASM code 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention 11: 0 (reserved) One-time table building (smaller code, but not thread-safe if true): 12: BUILDFIXED -- build static block decoding tables when needed 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed 14,15: 0 (reserved) Library content (indicates missing functionality): 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking deflate code when not needed) 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect and decode gzip streams (to avoid linking crc code) 18-19: 0 (reserved) Operation variations (changes in library functionality): 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) The sprintf variant used by gzprintf (zero is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned Remainder: 27-31: 0 (reserved) */ /* utility functions */ /* The following utility functions are implemented on top of the basic stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can easily be modified if you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. This function can be used to compress a whole file at once if the input file is mmap'ed. compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. */ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. */ typedef voidp gzFile; ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); /* Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman only compression as in "wb1h", or 'R' for run-length encoding as in "wb1R". (See the description of deflateInit2 for more information about the strategy parameter.) gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. gzopen returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* gzdopen() associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (in the file has been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd), mode) closes the file descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). gzdopen returns NULL if there was insufficient memory to allocate the (de)compression state. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If the input file was not in gzip format, gzread copies the given number of bytes into the buffer. gzread returns the number of uncompressed bytes actually read (0 for end of file, -1 for error). */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes actually written (0 in case of error). */ ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); /* Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). The number of uncompressed bytes written is limited to 4095. The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if zlib was compiled with the insecure functions sprintf() or vsprintf() because the secure snprintf() or vsnprintf() functions were not available. */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. */ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* Push one character back onto the stream to be read again later. Only one character of push-back is allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if a character has been pushed but not read yet, or if c is -1. The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind(). */ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function gzerror below). gzflush returns Z_OK if the flush parameter is Z_FINISH and all output could be flushed. gzflush should be called only when strictly necessary because it can degrade compression. */ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); /* Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. */ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); /* Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* Returns 1 if file is being read directly without decompression, otherwise zero. */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. The return value is the zlib error number (see function gzerror below). */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* Clears the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ /* checksum functions */ /* These functions are not related to compression but are exported anyway because they might be useful in applications using the compression library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is NULL, this function returns the required initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC32 but can be computed much faster. Usage example: uLong adler = adler32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { adler = adler32(adler, buffer, length); } if (adler != original_adler) error(); */ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); /* Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is NULL, this function returns the required initial value for the for the crc. Pre- and post-conditioning (one's complement) is performed within this function so it shouldn't be done by the application. Usage example: uLong crc = crc32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { crc = crc32(crc, buffer, length); } if (crc != original_crc) error(); */ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); /* Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and len2. */ /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, const char *version, int stream_size)); ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)); #define deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit(strm) \ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ (strategy), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ ZLIB_VERSION, sizeof(z_stream)) #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; /* hack for buggy compilers */ #endif ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); #ifdef __cplusplus } #endif #endif /* ZLIB_H */ angband-3.5.1/src/win/readpng.c0000644000175000017500000002206212456456607015613 0ustar chriscchrisc/* File: readdib.c */ /* * This package provides a routine to read a DIB file and set up the * device dependent version of the image. * * This file has been modified for use with "Angband 2.9.2" * This file has been modified for use with "z+Angband 0.3.3" * * COPYRIGHT: * * (C) Copyright Microsoft Corp. 1993. All rights reserved. * * You have a royalty-free right to use, modify, reproduce and * distribute the Sample Files (and/or any modified version) in * any way you find useful, provided that you agree that * Microsoft has no warranty obligations or liability for any * Sample Application Files which are modified. */ #include #include "png.h" #include "readdib.h" /* * Extract the "WIN32" flag from the compiler */ #if defined(__WIN32__) || defined(__WINNT__) || defined(__NT__) # ifndef WIN32 # define WIN32 # endif #endif /* * Imports a DIB from a PNG file. Once * the DIB is loaded, the function also creates a bitmap * and palette out of the DIB for a device-dependent form. * * Returns TRUE if the DIB is loaded and the bitmap/palette created, in which * case, the DIBINIT structure pointed to by pInfo is filled with the appropriate * handles, and FALSE if something went wrong. */ BOOL ReadDIB2_PNG(HWND hWnd, LPSTR lpFileName, DIBINIT *pInfo, DIBINIT *pMask, BOOL premultiply) { png_structp png_ptr; png_infop info_ptr; byte header[8]; png_bytep *row_pointers; BOOL noerror = TRUE; HBITMAP hBitmap; HPALETTE hPalette, hOldPal; BITMAPINFO bi, biSrc; HDC hDC; png_byte color_type; png_byte bit_depth; int width, height; int y, number_of_passes; BOOL update = FALSE; /* open the file and test it for being a png */ FILE *fp = fopen(lpFileName, "rb"); if (!fp) { /*plog_fmt("Unable to open PNG file."); */ return (FALSE); } fread(header, 1, 8, fp); if (png_sig_cmp(header, 0, 8)) { /*plog_fmt("Unable to open PNG file - not a PNG file."); */ fclose(fp); return (FALSE); } /* Create the png structure */ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if(!png_ptr) { /*plog_fmt("Unable to initialize PNG library"); */ fclose(fp); return (FALSE); } /* create the info structure */ info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); /*plog_fmt("Failed to create PNG info structure."); */ return FALSE; } /* setup error handling for init */ png_init_io(png_ptr, fp); png_set_sig_bytes(png_ptr, 8); png_read_info(png_ptr, info_ptr); width = png_get_image_width(png_ptr, info_ptr); height = png_get_image_height(png_ptr, info_ptr); color_type = png_get_color_type(png_ptr, info_ptr); bit_depth = png_get_bit_depth(png_ptr, info_ptr); number_of_passes = png_set_interlace_handling(png_ptr); if (color_type == PNG_COLOR_TYPE_PALETTE) { png_set_palette_to_rgb(png_ptr); update = TRUE; } if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { png_set_tRNS_to_alpha(png_ptr); update = TRUE; } if (bit_depth == 16) { png_set_strip_16(png_ptr); update = TRUE; } if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { png_set_gray_to_rgb(png_ptr); update = TRUE; } if (update) { png_read_update_info(png_ptr, info_ptr); color_type = png_get_color_type(png_ptr, info_ptr); bit_depth = png_get_bit_depth(png_ptr, info_ptr); } png_set_bgr(png_ptr); /* after these requests, the data should always be RGB or ARGB */ /* initialize row_pointers */ row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height); if (!row_pointers) return FALSE; for (y = 0; y < height; ++y) { row_pointers[y] = (png_bytep) malloc(png_get_rowbytes(png_ptr, info_ptr)); if (!row_pointers[y]) return FALSE; } /* read the image data into row_pointers */ png_read_image(png_ptr, row_pointers); /* we are done with the file pointer, so close it */ fclose(fp); /* pre multiply the image colors by the alhpa if thats what we want */ if (premultiply && (color_type == PNG_COLOR_TYPE_RGB_ALPHA)) { int x; png_byte r,g,b,a; png_bytep row; /* process the file */ for (y = 0; y < height; ++y) { row = row_pointers[y]; for (x = 0; x < width; ++x) { a = *(row + x*4 + 3); if (a == 0) { /* for every alpha that is fully transparent, make the * corresponding color true black */ *(row + x*4 + 0) = 0; *(row + x*4 + 1) = 0; *(row + x*4 + 2) = 0; } else if (a != 255) { float rf,gf,bf,af; /* blend the color value based on this value */ r = *(row + x*4 + 0); g = *(row + x*4 + 1); b = *(row + x*4 + 2); rf = ((float)r) / 255.f; gf = ((float)g) / 255.f; bf = ((float)b) / 255.f; af = ((float)a) / 255.f; r = (png_byte)(rf*af*255.f); g = (png_byte)(gf*af*255.f); b = (png_byte)(bf*af*255.f); *(row + x*4 + 0) = r; *(row + x*4 + 1) = g; *(row + x*4 + 2) = b; } } } } /* create the DIB */ bi.bmiHeader.biWidth = (LONG)width; bi.bmiHeader.biHeight = -((LONG)height); bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biClrUsed = 0; bi.bmiHeader.biClrImportant = 0; bi.bmiHeader.biBitCount = 24; bi.bmiHeader.biCompression = BI_RGB; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biSize = 40; /* the size of the structure */ bi.bmiHeader.biXPelsPerMeter = 3424; /* just a number I saw when testing this with a sample */ bi.bmiHeader.biYPelsPerMeter = 3424; /* just a number I saw when testing this with a sample */ bi.bmiHeader.biSizeImage = width*height*3; biSrc.bmiHeader.biWidth = (LONG)width; biSrc.bmiHeader.biHeight = -((LONG)height); biSrc.bmiHeader.biPlanes = 1; biSrc.bmiHeader.biClrUsed = 0; biSrc.bmiHeader.biClrImportant = 0; biSrc.bmiHeader.biCompression = BI_RGB; biSrc.bmiHeader.biPlanes = 1; biSrc.bmiHeader.biSize = 40; /* the size of the structure */ biSrc.bmiHeader.biXPelsPerMeter = 3424; /* just a number I saw when testing this with a sample */ biSrc.bmiHeader.biYPelsPerMeter = 3424; /* just a number I saw when testing this with a sample */ if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) { biSrc.bmiHeader.biBitCount = 32; biSrc.bmiHeader.biSizeImage = width*height*4; if (!pMask) { bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biSizeImage = width*height*4; } } else { biSrc.bmiHeader.biBitCount = 24; biSrc.bmiHeader.biSizeImage = width*height*3; } hDC = GetDC(hWnd); hPalette = GetStockObject(DEFAULT_PALETTE); /* Need to realize palette for converting DIB to bitmap. */ hOldPal = SelectPalette(hDC, hPalette, TRUE); RealizePalette(hDC); /* copy the data to the DIB */ hBitmap = CreateDIBitmap(hDC, &(bi.bmiHeader), 0, NULL, &biSrc, DIB_RGB_COLORS); if (hBitmap) { for (y = 0; y < height; ++y) { if (SetDIBits(hDC, hBitmap, height-y-1, 1, row_pointers[y], &biSrc, DIB_RGB_COLORS) != 1) { /*plog_fmt("Failed to alloc temporary memory for PNG data."); */ DeleteObject(hBitmap); hBitmap = NULL; noerror = FALSE; break; } } } SelectPalette(hDC, hOldPal, TRUE); RealizePalette(hDC); if (!hBitmap) { DeleteObject(hPalette); noerror = FALSE; } else { pInfo->hBitmap = hBitmap; pInfo->hPalette = hPalette; pInfo->hDIB = 0; pInfo->ImageWidth = width; pInfo->ImageHeight = height; } if (pMask && (color_type == PNG_COLOR_TYPE_RGB_ALPHA)) { byte *pBits, v; int x; DWORD *srcrow; HBITMAP hBitmap2 = NULL; HPALETTE hPalette2 = GetStockObject(DEFAULT_PALETTE); BOOL have_alpha = FALSE; /* Need to realize palette for converting DIB to bitmap. */ hOldPal = SelectPalette(hDC, hPalette2, TRUE); RealizePalette(hDC); /* allocate the storage space */ pBits = (byte*)malloc(sizeof(byte)*width*height*3); if (!pBits) { noerror = FALSE; } if (noerror) { for (y = 0; y < height; ++y) { srcrow = (DWORD*)row_pointers[y]; for (x = 0; x < width; ++x) { /* get the alpha byte from the source */ v = (*((DWORD*)srcrow + x)>>24); v = 255 - v; if (v==255) { have_alpha = TRUE; } /* write the alpha byte to the three colors of the storage space */ *(pBits + (y*width*3) + (x*3)) = v; *(pBits + (y*width*3) + (x*3)+1) = v; *(pBits + (y*width*3) + (x*3)+2) = v; } } /* create the bitmap from the storage space */ if (have_alpha) { hBitmap2 = CreateDIBitmap(hDC, &(bi.bmiHeader), CBM_INIT, pBits, &bi, DIB_RGB_COLORS); } free(pBits); } SelectPalette(hDC, hOldPal, TRUE); RealizePalette(hDC); if (!hBitmap2) { DeleteObject(hPalette2); noerror = FALSE; } else { pMask->hBitmap = hBitmap2; pMask->hPalette = hPalette2; pMask->hDIB = 0; } } /* release the image memory */ for (y = 0; y < height; ++y) { free(row_pointers[y]); } free(row_pointers); /* release all the the PNG Structures */ if (info_ptr) { png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); info_ptr = NULL; png_ptr = NULL; } else if (png_ptr) { png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); png_ptr = NULL; } ReleaseDC(hWnd,hDC); if (!noerror) { return (FALSE); } return (TRUE); } angband-3.5.1/src/win/readdib.h0000644000175000017500000000132012456456607015564 0ustar chriscchrisc/* File: readdib.h */ #ifndef INCLUDED_READDIB_H #define INCLUDED_READDIB_H /* * This file has been modified for use with "Angband 2.8.2" * * Copyright 1991 Microsoft Corporation. All rights reserved. */ /* * Information about a bitmap */ typedef struct { HANDLE hDIB; HBITMAP hBitmap; HPALETTE hPalette; BYTE CellWidth; BYTE CellHeight; int ImageWidth; int ImageHeight; } DIBINIT; /* Read a DIB from a file */ extern BOOL ReadDIB(HWND, LPSTR, DIBINIT *); /* Free a DIB */ extern void FreeDIB(DIBINIT *dib); /* new png stuff */ extern BOOL ReadDIB_PNG(HWND, LPSTR, DIBINIT *); extern BOOL ReadDIB2_PNG(HWND, LPSTR, DIBINIT *, DIBINIT *, BOOL); #endif /* !INCLUDED_READDIB_H */ angband-3.5.1/src/win/angband.rc0000644000175000017500000001131112456456606015741 0ustar chriscchrisc/* File: angband.rc */ #include "win-menu.h" ANGBAND MENU { POPUP "&File" { MENUITEM "&New\tCtrl+N", IDM_FILE_NEW MENUITEM "&Open...\tCtrl+O", IDM_FILE_OPEN MENUITEM SEPARATOR MENUITEM "&Save\tCtrl+S", IDM_FILE_SAVE MENUITEM SEPARATOR MENUITEM "E&xit\tCtrl+X", IDM_FILE_EXIT } POPUP "&Window" { POPUP "&Visibility" { MENUITEM "Term-0 window", IDM_WINDOW_VIS_0 MENUITEM "Term-1 window", IDM_WINDOW_VIS_1 MENUITEM "Term-2 window", IDM_WINDOW_VIS_2 MENUITEM "Term-3 window", IDM_WINDOW_VIS_3 MENUITEM "Term-4 window", IDM_WINDOW_VIS_4 MENUITEM "Term-5 window", IDM_WINDOW_VIS_5 MENUITEM "Term-6 window", IDM_WINDOW_VIS_6 MENUITEM "Term-7 window", IDM_WINDOW_VIS_7 } POPUP "&Font" { MENUITEM "Term-0 window", IDM_WINDOW_FONT_0 MENUITEM "Term-1 window", IDM_WINDOW_FONT_1 MENUITEM "Term-2 window", IDM_WINDOW_FONT_2 MENUITEM "Term-3 window", IDM_WINDOW_FONT_3 MENUITEM "Term-4 window", IDM_WINDOW_FONT_4 MENUITEM "Term-5 window", IDM_WINDOW_FONT_5 MENUITEM "Term-6 window", IDM_WINDOW_FONT_6 MENUITEM "Term-7 window", IDM_WINDOW_FONT_7 } MENUITEM SEPARATOR POPUP "Bizarre Display" { MENUITEM "Term-0 window", IDM_WINDOW_BIZ_0 MENUITEM "Term-1 window", IDM_WINDOW_BIZ_1 MENUITEM "Term-2 window", IDM_WINDOW_BIZ_2 MENUITEM "Term-3 window", IDM_WINDOW_BIZ_3 MENUITEM "Term-4 window", IDM_WINDOW_BIZ_4 MENUITEM "Term-5 window", IDM_WINDOW_BIZ_5 MENUITEM "Term-6 window", IDM_WINDOW_BIZ_6 MENUITEM "Term-7 window", IDM_WINDOW_BIZ_7 } POPUP "Increase Tile Width" { MENUITEM "Term-0 window", IDM_WINDOW_I_WID_0 MENUITEM "Term-1 window", IDM_WINDOW_I_WID_1 MENUITEM "Term-2 window", IDM_WINDOW_I_WID_2 MENUITEM "Term-3 window", IDM_WINDOW_I_WID_3 MENUITEM "Term-4 window", IDM_WINDOW_I_WID_4 MENUITEM "Term-5 window", IDM_WINDOW_I_WID_5 MENUITEM "Term-6 window", IDM_WINDOW_I_WID_6 MENUITEM "Term-7 window", IDM_WINDOW_I_WID_7 } POPUP "Decrease Tile Width" { MENUITEM "Term-0 window", IDM_WINDOW_D_WID_0 MENUITEM "Term-1 window", IDM_WINDOW_D_WID_1 MENUITEM "Term-2 window", IDM_WINDOW_D_WID_2 MENUITEM "Term-3 window", IDM_WINDOW_D_WID_3 MENUITEM "Term-4 window", IDM_WINDOW_D_WID_4 MENUITEM "Term-5 window", IDM_WINDOW_D_WID_5 MENUITEM "Term-6 window", IDM_WINDOW_D_WID_6 MENUITEM "Term-7 window", IDM_WINDOW_D_WID_7 } POPUP "Increase Tile Height" { MENUITEM "Term-0 window", IDM_WINDOW_I_HGT_0 MENUITEM "Term-1 window", IDM_WINDOW_I_HGT_1 MENUITEM "Term-2 window", IDM_WINDOW_I_HGT_2 MENUITEM "Term-3 window", IDM_WINDOW_I_HGT_3 MENUITEM "Term-4 window", IDM_WINDOW_I_HGT_4 MENUITEM "Term-5 window", IDM_WINDOW_I_HGT_5 MENUITEM "Term-6 window", IDM_WINDOW_I_HGT_6 MENUITEM "Term-7 window", IDM_WINDOW_I_HGT_7 } POPUP "Decrease Tile Height" { MENUITEM "Term-0 window", IDM_WINDOW_D_HGT_0 MENUITEM "Term-1 window", IDM_WINDOW_D_HGT_1 MENUITEM "Term-2 window", IDM_WINDOW_D_HGT_2 MENUITEM "Term-3 window", IDM_WINDOW_D_HGT_3 MENUITEM "Term-4 window", IDM_WINDOW_D_HGT_4 MENUITEM "Term-5 window", IDM_WINDOW_D_HGT_5 MENUITEM "Term-6 window", IDM_WINDOW_D_HGT_6 MENUITEM "Term-7 window", IDM_WINDOW_D_HGT_7 } MENUITEM SEPARATOR POPUP "Term 0 Font Tile Size" { MENUITEM "Font", IDM_TILE_FONT MENUITEM "8 x 16", IDM_TILE_08X16 MENUITEM "8 x 8", IDM_TILE_08X08 MENUITEM "16 x 16", IDM_TILE_16X16 MENUITEM "32 x 32", IDM_TILE_32X32 MENUITEM "16 x 32", IDM_TILE_16X32 MENUITEM "12 x 20", IDM_TILE_12X20 MENUITEM "16 x 25", IDM_TILE_16X25 } MENUITEM SEPARATOR MENUITEM "Term Options", IDM_WINDOW_OPT MENUITEM "Reset Layout", IDM_WINDOW_RESET } POPUP "&Options" { POPUP "&Graphics" { MENUITEM "&None", IDM_OPTIONS_GRAPHICS_NONE MENUITEM SEPARATOR MENUITEM "Enable nice &graphics", IDM_OPTIONS_GRAPHICS_NICE MENUITEM SEPARATOR POPUP "&Tile Multiplier" { MENUITEM "&1x1", IDM_OPTIONS_TILE_1x1 MENUITEM "&2x1", IDM_OPTIONS_TILE_2x1 MENUITEM "2x2", IDM_OPTIONS_TILE_2x2 MENUITEM "3x1", IDM_OPTIONS_TILE_3x1 MENUITEM "&3x3", IDM_OPTIONS_TILE_3x3 MENUITEM "&4x2", IDM_OPTIONS_TILE_4x2 MENUITEM "4x4", IDM_OPTIONS_TILE_4x4 MENUITEM "&6x3", IDM_OPTIONS_TILE_6x3 MENUITEM "6x6", IDM_OPTIONS_TILE_6x6 MENUITEM "&8x4", IDM_OPTIONS_TILE_8x4 MENUITEM "8x8", IDM_OPTIONS_TILE_8x8 MENUITEM "16x8", IDM_OPTIONS_TILE_16x8 MENUITEM "16x16", IDM_OPTIONS_TILE_16x16 } } MENUITEM SEPARATOR MENUITEM "Low Priority", IDM_OPTIONS_LOW_PRIORITY MENUITEM "Activate Screensaver", IDM_OPTIONS_SAVER MENUITEM "&Map", IDM_OPTIONS_MAP MENUITEM "&Screenshot", IDM_OPTIONS_SCREENSHOT } POPUP "&Help" { MENUITEM "&Contents", IDM_HELP_GENERAL } } ANGBAND ICON "angband.ico" angband-3.5.1/src/win/lib/0000755000175000017500000000000012456456607014573 5ustar chriscchriscangband-3.5.1/src/win/lib/libpng.lib0000644000175000017500000014524612456456607016552 0ustar chriscchrisc! / 1244148923 0 11905 ` À]È_øa0b†b†bòcZcÂd*d’d’e erereìfTfTfÀfÀg.g.gžgžhhhŽhŽiiiziziðiðjhjhjÞjÞkVkVkÄkÄl:l:l°l°m(m(mmmømøndndnÔo<o<o¨o¨pppˆpˆpøpøqdqdqÔqÔr@r@r²r²s"s"s”s”tttŠtŠtútúujujuÜuÜvHvHvºvºw&w&w˜w˜xxxzxzxîxîy`y`yÎyÎzDzDz²z²{${${’{’|||„|„}}}n}n}Ú}Ú~F~F~À~À88®®€(€(€˜€˜ppÜÜ‚H‚H‚´‚´ƒ$ƒ$ƒƒƒüƒü„h„h„Ö„Ö…D…D…²…²†(†(†ž†ž‡‡‡Ž‡Žˆˆˆpˆpˆèˆè‰^‰^‰Ø‰ØŠPŠPŠÆŠÆ‹@‹¨‹¨ŒŒ„ŒìŒìXXÆÆŽ0ŽžŽžzzèèXXÈÈ‘6‘ž’’n’Þ“J“¶”$””þ”þ•r•r•è•è–X–X–Ò–Ò—B—B—®—®˜˜˜ˆ˜ˆ˜ô˜ô™b™b™Ð™Ðš<š<š¨š¨›››ˆ›ˆ›øœ`œÈ0˜˜žžžvžvžæžæŸRŸRŸ¾Ÿ¾ . . ž ž¡ ¡ ¡|¡|¡æ¡æ¢R¢R¢Ä¢Ä£B£B£º£º¤6¤6¤°¤°¥,¥,¥ª¥ª¦¦¦Š¦Š¦ú¦ú§h§h§æ§æ¨T¨T¨Â¨Â©:©:©¦©¦ªªª„ª„ªðªð«f«f«Ø«Ø¬D¬D¬°¬°­*­*­˜­˜® ® ®~®~®ø®ø¯f¯f¯Ü¯Ü°H°H°´°´± ± ±Ž±Ž±þ±þ²t²t²î²î³\³\³Ò³Ò´L´L´Ê´Êµ<µ<µ´µ´¶ ¶ ¶Œ¶Œ¶ø¶ø·d·d·Ð·Ð¸J¸J¸¶¸¶¹&¹&¹–¹–ººº‚º‚ºîºî»`»`»Ì»Ì¼8¼8¼¬¼¬½½½–½–¾ ¾ ¾~¾~¾ø¾ø¿h¿h¿Þ¿ÞÀ\ÀÂÀÂÁ,Á,Á ÂÂpÂØÂØÃBÃBððÄ$Ä$Ä–Ä–Å Å ÅzÅzſſÆTÆTÆÂÆÂÇ0Ç0ǪǪÈÈÈˆÈˆÈøÈøÉdÉdÉÐÉÐÊ>__IMPORT_DESCRIPTOR_libpng12__NULL_IMPORT_DESCRIPTORlibpng12_NULL_THUNK_DATA_DllGetVersion__imp__DllGetVersion__imp__png_IDAT__imp__png_IEND__imp__png_IHDR__imp__png_PLTE__imp__png_access_version_number_png_access_version_number__imp__png_bKGD__imp__png_build_grayscale_palette_png_build_grayscale_palette__imp__png_cHRM__imp__png_check_sig_png_check_sig__imp__png_chunk_error_png_chunk_error__imp__png_chunk_warning_png_chunk_warning__imp__png_convert_from_struct_tm_png_convert_from_struct_tm__imp__png_convert_from_time_t_png_convert_from_time_t__imp__png_convert_to_rfc1123_png_convert_to_rfc1123__imp__png_create_info_struct_png_create_info_struct__imp__png_create_read_struct_png_create_read_struct__imp__png_create_read_struct_2_png_create_read_struct_2__imp__png_create_write_struct_png_create_write_struct__imp__png_create_write_struct_2_png_create_write_struct_2__imp__png_data_freer_png_data_freer__imp__png_destroy_info_struct_png_destroy_info_struct__imp__png_destroy_read_struct_png_destroy_read_struct__imp__png_destroy_write_struct_png_destroy_write_struct__imp__png_error_png_error__imp__png_free_png_free__imp__png_free_data_png_free_data__imp__png_free_default_png_free_default__imp__png_gAMA__imp__png_get_IHDR_png_get_IHDR__imp__png_get_PLTE_png_get_PLTE__imp__png_get_asm_flagmask_png_get_asm_flagmask__imp__png_get_asm_flags_png_get_asm_flags__imp__png_get_bKGD_png_get_bKGD__imp__png_get_bit_depth_png_get_bit_depth__imp__png_get_cHRM_png_get_cHRM__imp__png_get_cHRM_fixed_png_get_cHRM_fixed__imp__png_get_channels_png_get_channels__imp__png_get_color_type_png_get_color_type__imp__png_get_compression_buffer_size_png_get_compression_buffer_size__imp__png_get_compression_type_png_get_compression_type__imp__png_get_copyright_png_get_copyright__imp__png_get_error_ptr_png_get_error_ptr__imp__png_get_filter_type_png_get_filter_type__imp__png_get_gAMA_png_get_gAMA__imp__png_get_gAMA_fixed_png_get_gAMA_fixed__imp__png_get_hIST_png_get_hIST__imp__png_get_header_ver_png_get_header_ver__imp__png_get_header_version_png_get_header_version__imp__png_get_iCCP_png_get_iCCP__imp__png_get_image_height_png_get_image_height__imp__png_get_image_width_png_get_image_width__imp__png_get_int_32_png_get_int_32__imp__png_get_interlace_type_png_get_interlace_type__imp__png_get_io_ptr_png_get_io_ptr__imp__png_get_libpng_ver_png_get_libpng_ver__imp__png_get_mem_ptr_png_get_mem_ptr__imp__png_get_mmx_bitdepth_threshold_png_get_mmx_bitdepth_threshold__imp__png_get_mmx_flagmask_png_get_mmx_flagmask__imp__png_get_mmx_rowbytes_threshold_png_get_mmx_rowbytes_threshold__imp__png_get_oFFs_png_get_oFFs__imp__png_get_pCAL_png_get_pCAL__imp__png_get_pHYs_png_get_pHYs__imp__png_get_pixel_aspect_ratio_png_get_pixel_aspect_ratio__imp__png_get_pixels_per_meter_png_get_pixels_per_meter__imp__png_get_progressive_ptr_png_get_progressive_ptr__imp__png_get_rgb_to_gray_status_png_get_rgb_to_gray_status__imp__png_get_rowbytes_png_get_rowbytes__imp__png_get_rows_png_get_rows__imp__png_get_sBIT_png_get_sBIT__imp__png_get_sCAL_png_get_sCAL__imp__png_get_sPLT_png_get_sPLT__imp__png_get_sRGB_png_get_sRGB__imp__png_get_signature_png_get_signature__imp__png_get_tIME_png_get_tIME__imp__png_get_tRNS_png_get_tRNS__imp__png_get_text_png_get_text__imp__png_get_uint_16_png_get_uint_16__imp__png_get_uint_31_png_get_uint_31__imp__png_get_uint_32_png_get_uint_32__imp__png_get_unknown_chunks_png_get_unknown_chunks__imp__png_get_user_chunk_ptr_png_get_user_chunk_ptr__imp__png_get_user_height_max_png_get_user_height_max__imp__png_get_user_transform_ptr_png_get_user_transform_ptr__imp__png_get_user_width_max_png_get_user_width_max__imp__png_get_valid_png_get_valid__imp__png_get_x_offset_microns_png_get_x_offset_microns__imp__png_get_x_offset_pixels_png_get_x_offset_pixels__imp__png_get_x_pixels_per_meter_png_get_x_pixels_per_meter__imp__png_get_y_offset_microns_png_get_y_offset_microns__imp__png_get_y_offset_pixels_png_get_y_offset_pixels__imp__png_get_y_pixels_per_meter_png_get_y_pixels_per_meter__imp__png_hIST__imp__png_handle_as_unknown_png_handle_as_unknown__imp__png_iCCP__imp__png_iTXt__imp__png_info_init_png_info_init__imp__png_info_init_3_png_info_init_3__imp__png_init_io_png_init_io__imp__png_libpng_ver__imp__png_malloc_png_malloc__imp__png_malloc_default_png_malloc_default__imp__png_malloc_warn_png_malloc_warn__imp__png_memcpy_check_png_memcpy_check__imp__png_memset_check_png_memset_check__imp__png_mmx_support_png_mmx_support__imp__png_oFFs__imp__png_pCAL__imp__png_pHYs__imp__png_pass_dsp_mask__imp__png_pass_inc__imp__png_pass_mask__imp__png_pass_start__imp__png_pass_yinc__imp__png_pass_ystart__imp__png_permit_empty_plte_png_permit_empty_plte__imp__png_permit_mng_features_png_permit_mng_features__imp__png_process_data_png_process_data__imp__png_progressive_combine_row_png_progressive_combine_row__imp__png_read_destroy_png_read_destroy__imp__png_read_end_png_read_end__imp__png_read_image_png_read_image__imp__png_read_info_png_read_info__imp__png_read_init_png_read_init__imp__png_read_init_2_png_read_init_2__imp__png_read_init_3_png_read_init_3__imp__png_read_png_png_read_png__imp__png_read_row_png_read_row__imp__png_read_rows_png_read_rows__imp__png_read_update_info_png_read_update_info__imp__png_reset_zstream_png_reset_zstream__imp__png_sBIT__imp__png_sCAL__imp__png_sPLT__imp__png_sRGB__imp__png_save_int_32_png_save_int_32__imp__png_save_uint_16_png_save_uint_16__imp__png_save_uint_32_png_save_uint_32__imp__png_set_IHDR_png_set_IHDR__imp__png_set_PLTE_png_set_PLTE__imp__png_set_add_alpha_png_set_add_alpha__imp__png_set_asm_flags_png_set_asm_flags__imp__png_set_bKGD_png_set_bKGD__imp__png_set_background_png_set_background__imp__png_set_bgr_png_set_bgr__imp__png_set_cHRM_png_set_cHRM__imp__png_set_cHRM_fixed_png_set_cHRM_fixed__imp__png_set_compression_buffer_size_png_set_compression_buffer_size__imp__png_set_compression_level_png_set_compression_level__imp__png_set_compression_mem_level_png_set_compression_mem_level__imp__png_set_compression_method_png_set_compression_method__imp__png_set_compression_strategy_png_set_compression_strategy__imp__png_set_compression_window_bits_png_set_compression_window_bits__imp__png_set_crc_action_png_set_crc_action__imp__png_set_dither_png_set_dither__imp__png_set_error_fn_png_set_error_fn__imp__png_set_expand_png_set_expand__imp__png_set_expand_gray_1_2_4_to_8_png_set_expand_gray_1_2_4_to_8__imp__png_set_filler_png_set_filler__imp__png_set_filter_png_set_filter__imp__png_set_filter_heuristics_png_set_filter_heuristics__imp__png_set_flush_png_set_flush__imp__png_set_gAMA_png_set_gAMA__imp__png_set_gAMA_fixed_png_set_gAMA_fixed__imp__png_set_gamma_png_set_gamma__imp__png_set_gray_1_2_4_to_8_png_set_gray_1_2_4_to_8__imp__png_set_gray_to_rgb_png_set_gray_to_rgb__imp__png_set_hIST_png_set_hIST__imp__png_set_iCCP_png_set_iCCP__imp__png_set_interlace_handling_png_set_interlace_handling__imp__png_set_invalid_png_set_invalid__imp__png_set_invert_alpha_png_set_invert_alpha__imp__png_set_invert_mono_png_set_invert_mono__imp__png_set_keep_unknown_chunks_png_set_keep_unknown_chunks__imp__png_set_mem_fn_png_set_mem_fn__imp__png_set_mmx_thresholds_png_set_mmx_thresholds__imp__png_set_oFFs_png_set_oFFs__imp__png_set_pCAL_png_set_pCAL__imp__png_set_pHYs_png_set_pHYs__imp__png_set_packing_png_set_packing__imp__png_set_packswap_png_set_packswap__imp__png_set_palette_to_rgb_png_set_palette_to_rgb__imp__png_set_progressive_read_fn_png_set_progressive_read_fn__imp__png_set_read_fn_png_set_read_fn__imp__png_set_read_status_fn_png_set_read_status_fn__imp__png_set_read_user_chunk_fn_png_set_read_user_chunk_fn__imp__png_set_read_user_transform_fn_png_set_read_user_transform_fn__imp__png_set_rgb_to_gray_png_set_rgb_to_gray__imp__png_set_rgb_to_gray_fixed_png_set_rgb_to_gray_fixed__imp__png_set_rows_png_set_rows__imp__png_set_sBIT_png_set_sBIT__imp__png_set_sCAL_png_set_sCAL__imp__png_set_sPLT_png_set_sPLT__imp__png_set_sRGB_png_set_sRGB__imp__png_set_sRGB_gAMA_and_cHRM_png_set_sRGB_gAMA_and_cHRM__imp__png_set_shift_png_set_shift__imp__png_set_sig_bytes_png_set_sig_bytes__imp__png_set_strip_16_png_set_strip_16__imp__png_set_strip_alpha_png_set_strip_alpha__imp__png_set_strip_error_numbers_png_set_strip_error_numbers__imp__png_set_swap_png_set_swap__imp__png_set_swap_alpha_png_set_swap_alpha__imp__png_set_tIME_png_set_tIME__imp__png_set_tRNS_png_set_tRNS__imp__png_set_tRNS_to_alpha_png_set_tRNS_to_alpha__imp__png_set_text_png_set_text__imp__png_set_unknown_chunk_location_png_set_unknown_chunk_location__imp__png_set_unknown_chunks_png_set_unknown_chunks__imp__png_set_user_limits_png_set_user_limits__imp__png_set_user_transform_info_png_set_user_transform_info__imp__png_set_write_fn_png_set_write_fn__imp__png_set_write_status_fn_png_set_write_status_fn__imp__png_set_write_user_transform_fn_png_set_write_user_transform_fn__imp__png_sig__imp__png_sig_cmp_png_sig_cmp__imp__png_start_read_image_png_start_read_image__imp__png_tEXt__imp__png_tIME__imp__png_tRNS__imp__png_warning_png_warning__imp__png_write_chunk_png_write_chunk__imp__png_write_chunk_data_png_write_chunk_data__imp__png_write_chunk_end_png_write_chunk_end__imp__png_write_chunk_start_png_write_chunk_start__imp__png_write_destroy_png_write_destroy__imp__png_write_end_png_write_end__imp__png_write_flush_png_write_flush__imp__png_write_image_png_write_image__imp__png_write_info_png_write_info__imp__png_write_info_before_PLTE_png_write_info_before_PLTE__imp__png_write_init_png_write_init__imp__png_write_init_2_png_write_init_2__imp__png_write_init_3_png_write_init_3__imp__png_write_png_png_write_png__imp__png_write_row_png_write_row__imp__png_write_rows_png_write_rows__imp__png_zTXt / 1244148923 0 11973 ` ðÈ]ø_0a†bòbZcÂc*d’d ereìeTfÀf.gžghŽhiziðihjÞjVkÄk:l°l(mmømdnÔnÊÀ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïð !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_adefhijklmwxyz{|}~€‚ƒ„…†‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÚÛßàáâãäåæçèéêëìíîï_DllGetVersion__IMPORT_DESCRIPTOR_libpng12__NULL_IMPORT_DESCRIPTOR__imp__DllGetVersion__imp__png_IDAT__imp__png_IEND__imp__png_IHDR__imp__png_PLTE__imp__png_access_version_number__imp__png_bKGD__imp__png_build_grayscale_palette__imp__png_cHRM__imp__png_check_sig__imp__png_chunk_error__imp__png_chunk_warning__imp__png_convert_from_struct_tm__imp__png_convert_from_time_t__imp__png_convert_to_rfc1123__imp__png_create_info_struct__imp__png_create_read_struct__imp__png_create_read_struct_2__imp__png_create_write_struct__imp__png_create_write_struct_2__imp__png_data_freer__imp__png_destroy_info_struct__imp__png_destroy_read_struct__imp__png_destroy_write_struct__imp__png_error__imp__png_free__imp__png_free_data__imp__png_free_default__imp__png_gAMA__imp__png_get_IHDR__imp__png_get_PLTE__imp__png_get_asm_flagmask__imp__png_get_asm_flags__imp__png_get_bKGD__imp__png_get_bit_depth__imp__png_get_cHRM__imp__png_get_cHRM_fixed__imp__png_get_channels__imp__png_get_color_type__imp__png_get_compression_buffer_size__imp__png_get_compression_type__imp__png_get_copyright__imp__png_get_error_ptr__imp__png_get_filter_type__imp__png_get_gAMA__imp__png_get_gAMA_fixed__imp__png_get_hIST__imp__png_get_header_ver__imp__png_get_header_version__imp__png_get_iCCP__imp__png_get_image_height__imp__png_get_image_width__imp__png_get_int_32__imp__png_get_interlace_type__imp__png_get_io_ptr__imp__png_get_libpng_ver__imp__png_get_mem_ptr__imp__png_get_mmx_bitdepth_threshold__imp__png_get_mmx_flagmask__imp__png_get_mmx_rowbytes_threshold__imp__png_get_oFFs__imp__png_get_pCAL__imp__png_get_pHYs__imp__png_get_pixel_aspect_ratio__imp__png_get_pixels_per_meter__imp__png_get_progressive_ptr__imp__png_get_rgb_to_gray_status__imp__png_get_rowbytes__imp__png_get_rows__imp__png_get_sBIT__imp__png_get_sCAL__imp__png_get_sPLT__imp__png_get_sRGB__imp__png_get_signature__imp__png_get_tIME__imp__png_get_tRNS__imp__png_get_text__imp__png_get_uint_16__imp__png_get_uint_31__imp__png_get_uint_32__imp__png_get_unknown_chunks__imp__png_get_user_chunk_ptr__imp__png_get_user_height_max__imp__png_get_user_transform_ptr__imp__png_get_user_width_max__imp__png_get_valid__imp__png_get_x_offset_microns__imp__png_get_x_offset_pixels__imp__png_get_x_pixels_per_meter__imp__png_get_y_offset_microns__imp__png_get_y_offset_pixels__imp__png_get_y_pixels_per_meter__imp__png_hIST__imp__png_handle_as_unknown__imp__png_iCCP__imp__png_iTXt__imp__png_info_init__imp__png_info_init_3__imp__png_init_io__imp__png_libpng_ver__imp__png_malloc__imp__png_malloc_default__imp__png_malloc_warn__imp__png_memcpy_check__imp__png_memset_check__imp__png_mmx_support__imp__png_oFFs__imp__png_pCAL__imp__png_pHYs__imp__png_pass_dsp_mask__imp__png_pass_inc__imp__png_pass_mask__imp__png_pass_start__imp__png_pass_yinc__imp__png_pass_ystart__imp__png_permit_empty_plte__imp__png_permit_mng_features__imp__png_process_data__imp__png_progressive_combine_row__imp__png_read_destroy__imp__png_read_end__imp__png_read_image__imp__png_read_info__imp__png_read_init__imp__png_read_init_2__imp__png_read_init_3__imp__png_read_png__imp__png_read_row__imp__png_read_rows__imp__png_read_update_info__imp__png_reset_zstream__imp__png_sBIT__imp__png_sCAL__imp__png_sPLT__imp__png_sRGB__imp__png_save_int_32__imp__png_save_uint_16__imp__png_save_uint_32__imp__png_set_IHDR__imp__png_set_PLTE__imp__png_set_add_alpha__imp__png_set_asm_flags__imp__png_set_bKGD__imp__png_set_background__imp__png_set_bgr__imp__png_set_cHRM__imp__png_set_cHRM_fixed__imp__png_set_compression_buffer_size__imp__png_set_compression_level__imp__png_set_compression_mem_level__imp__png_set_compression_method__imp__png_set_compression_strategy__imp__png_set_compression_window_bits__imp__png_set_crc_action__imp__png_set_dither__imp__png_set_error_fn__imp__png_set_expand__imp__png_set_expand_gray_1_2_4_to_8__imp__png_set_filler__imp__png_set_filter__imp__png_set_filter_heuristics__imp__png_set_flush__imp__png_set_gAMA__imp__png_set_gAMA_fixed__imp__png_set_gamma__imp__png_set_gray_1_2_4_to_8__imp__png_set_gray_to_rgb__imp__png_set_hIST__imp__png_set_iCCP__imp__png_set_interlace_handling__imp__png_set_invalid__imp__png_set_invert_alpha__imp__png_set_invert_mono__imp__png_set_keep_unknown_chunks__imp__png_set_mem_fn__imp__png_set_mmx_thresholds__imp__png_set_oFFs__imp__png_set_pCAL__imp__png_set_pHYs__imp__png_set_packing__imp__png_set_packswap__imp__png_set_palette_to_rgb__imp__png_set_progressive_read_fn__imp__png_set_read_fn__imp__png_set_read_status_fn__imp__png_set_read_user_chunk_fn__imp__png_set_read_user_transform_fn__imp__png_set_rgb_to_gray__imp__png_set_rgb_to_gray_fixed__imp__png_set_rows__imp__png_set_sBIT__imp__png_set_sCAL__imp__png_set_sPLT__imp__png_set_sRGB__imp__png_set_sRGB_gAMA_and_cHRM__imp__png_set_shift__imp__png_set_sig_bytes__imp__png_set_strip_16__imp__png_set_strip_alpha__imp__png_set_strip_error_numbers__imp__png_set_swap__imp__png_set_swap_alpha__imp__png_set_tIME__imp__png_set_tRNS__imp__png_set_tRNS_to_alpha__imp__png_set_text__imp__png_set_unknown_chunk_location__imp__png_set_unknown_chunks__imp__png_set_user_limits__imp__png_set_user_transform_info__imp__png_set_write_fn__imp__png_set_write_status_fn__imp__png_set_write_user_transform_fn__imp__png_sig__imp__png_sig_cmp__imp__png_start_read_image__imp__png_tEXt__imp__png_tIME__imp__png_tRNS__imp__png_warning__imp__png_write_chunk__imp__png_write_chunk_data__imp__png_write_chunk_end__imp__png_write_chunk_start__imp__png_write_destroy__imp__png_write_end__imp__png_write_flush__imp__png_write_image__imp__png_write_info__imp__png_write_info_before_PLTE__imp__png_write_init__imp__png_write_init_2__imp__png_write_init_3__imp__png_write_png__imp__png_write_row__imp__png_write_rows__imp__png_zTXt_png_access_version_number_png_build_grayscale_palette_png_check_sig_png_chunk_error_png_chunk_warning_png_convert_from_struct_tm_png_convert_from_time_t_png_convert_to_rfc1123_png_create_info_struct_png_create_read_struct_png_create_read_struct_2_png_create_write_struct_png_create_write_struct_2_png_data_freer_png_destroy_info_struct_png_destroy_read_struct_png_destroy_write_struct_png_error_png_free_png_free_data_png_free_default_png_get_IHDR_png_get_PLTE_png_get_asm_flagmask_png_get_asm_flags_png_get_bKGD_png_get_bit_depth_png_get_cHRM_png_get_cHRM_fixed_png_get_channels_png_get_color_type_png_get_compression_buffer_size_png_get_compression_type_png_get_copyright_png_get_error_ptr_png_get_filter_type_png_get_gAMA_png_get_gAMA_fixed_png_get_hIST_png_get_header_ver_png_get_header_version_png_get_iCCP_png_get_image_height_png_get_image_width_png_get_int_32_png_get_interlace_type_png_get_io_ptr_png_get_libpng_ver_png_get_mem_ptr_png_get_mmx_bitdepth_threshold_png_get_mmx_flagmask_png_get_mmx_rowbytes_threshold_png_get_oFFs_png_get_pCAL_png_get_pHYs_png_get_pixel_aspect_ratio_png_get_pixels_per_meter_png_get_progressive_ptr_png_get_rgb_to_gray_status_png_get_rowbytes_png_get_rows_png_get_sBIT_png_get_sCAL_png_get_sPLT_png_get_sRGB_png_get_signature_png_get_tIME_png_get_tRNS_png_get_text_png_get_uint_16_png_get_uint_31_png_get_uint_32_png_get_unknown_chunks_png_get_user_chunk_ptr_png_get_user_height_max_png_get_user_transform_ptr_png_get_user_width_max_png_get_valid_png_get_x_offset_microns_png_get_x_offset_pixels_png_get_x_pixels_per_meter_png_get_y_offset_microns_png_get_y_offset_pixels_png_get_y_pixels_per_meter_png_handle_as_unknown_png_info_init_png_info_init_3_png_init_io_png_malloc_png_malloc_default_png_malloc_warn_png_memcpy_check_png_memset_check_png_mmx_support_png_permit_empty_plte_png_permit_mng_features_png_process_data_png_progressive_combine_row_png_read_destroy_png_read_end_png_read_image_png_read_info_png_read_init_png_read_init_2_png_read_init_3_png_read_png_png_read_row_png_read_rows_png_read_update_info_png_reset_zstream_png_save_int_32_png_save_uint_16_png_save_uint_32_png_set_IHDR_png_set_PLTE_png_set_add_alpha_png_set_asm_flags_png_set_bKGD_png_set_background_png_set_bgr_png_set_cHRM_png_set_cHRM_fixed_png_set_compression_buffer_size_png_set_compression_level_png_set_compression_mem_level_png_set_compression_method_png_set_compression_strategy_png_set_compression_window_bits_png_set_crc_action_png_set_dither_png_set_error_fn_png_set_expand_png_set_expand_gray_1_2_4_to_8_png_set_filler_png_set_filter_png_set_filter_heuristics_png_set_flush_png_set_gAMA_png_set_gAMA_fixed_png_set_gamma_png_set_gray_1_2_4_to_8_png_set_gray_to_rgb_png_set_hIST_png_set_iCCP_png_set_interlace_handling_png_set_invalid_png_set_invert_alpha_png_set_invert_mono_png_set_keep_unknown_chunks_png_set_mem_fn_png_set_mmx_thresholds_png_set_oFFs_png_set_pCAL_png_set_pHYs_png_set_packing_png_set_packswap_png_set_palette_to_rgb_png_set_progressive_read_fn_png_set_read_fn_png_set_read_status_fn_png_set_read_user_chunk_fn_png_set_read_user_transform_fn_png_set_rgb_to_gray_png_set_rgb_to_gray_fixed_png_set_rows_png_set_sBIT_png_set_sCAL_png_set_sPLT_png_set_sRGB_png_set_sRGB_gAMA_and_cHRM_png_set_shift_png_set_sig_bytes_png_set_strip_16_png_set_strip_alpha_png_set_strip_error_numbers_png_set_swap_png_set_swap_alpha_png_set_tIME_png_set_tRNS_png_set_tRNS_to_alpha_png_set_text_png_set_unknown_chunk_location_png_set_unknown_chunks_png_set_user_limits_png_set_user_transform_info_png_set_write_fn_png_set_write_status_fn_png_set_write_user_transform_fn_png_sig_cmp_png_start_read_image_png_warning_png_write_chunk_png_write_chunk_data_png_write_chunk_end_png_write_chunk_start_png_write_destroy_png_write_end_png_write_flush_png_write_image_png_write_info_png_write_info_before_PLTE_png_write_init_png_write_init_2_png_write_init_3_png_write_png_png_write_row_png_write_rowslibpng12_NULL_THUNK_DATA libpng12.dll/ 1244148923 0 499 ` L»4(J.debug$SCŒ@B.idata$2Ïã@0À.idata$6ã@ À libpng12.dll(vMicrosoft (R) LINK libpng12.dll@comp.idv{ÿÿ.idata$2@Àh.idata$6.idata$4@Àh.idata$5@Àh!:T__IMPORT_DESCRIPTOR_libpng12__NULL_IMPORT_DESCRIPTORlibpng12_NULL_THUNK_DATA libpng12.dll/ 1244148923 0 252 ` L»4(J».debug$SCd@B.idata$3§@0À libpng12.dll(vMicrosoft (R) LINK@comp.idv{ÿÿ__NULL_IMPORT_DESCRIPTORlibpng12.dll/ 1244148923 0 281 ` L»4(J×.debug$SCŒ@B.idata$5Ï@0À.idata$4Ó@0À libpng12.dll(vMicrosoft (R) LINK@comp.idv{ÿÿlibpng12_NULL_THUNK_DATA libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J_DllGetVersionlibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_IDATlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_IENDlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_IHDRlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_PLTElibpng12.dll libpng12.dll/ 1244148923 0 60 ` ÿÿL»4(J(_png_access_version_numberlibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_bKGDlibpng12.dll libpng12.dll/ 1244148923 0 62 ` ÿÿL»4(J*_png_build_grayscale_palettelibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_cHRMlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J _png_check_siglibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J _png_chunk_errorlibpng12.dlllibpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J _png_chunk_warninglibpng12.dlllibpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J) _png_convert_from_struct_tmlibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J& _png_convert_from_time_tlibpng12.dlllibpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%_png_convert_to_rfc1123libpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%_png_create_info_structlibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%_png_create_read_structlibpng12.dll libpng12.dll/ 1244148923 0 59 ` ÿÿL»4(J'_png_create_read_struct_2libpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&_png_create_write_structlibpng12.dlllibpng12.dll/ 1244148923 0 60 ` ÿÿL»4(J(_png_create_write_struct_2libpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(J_png_data_freerlibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&_png_destroy_info_structlibpng12.dlllibpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&_png_destroy_read_structlibpng12.dlllibpng12.dll/ 1244148923 0 59 ` ÿÿL»4(J'_png_destroy_write_structlibpng12.dll libpng12.dll/ 1244148923 0 44 ` ÿÿL»4(J_png_errorlibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J_png_freelibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J_png_free_datalibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(J_png_free_defaultlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J _png_gAMAlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J_png_get_IHDRlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J_png_get_PLTElibpng12.dll libpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#_png_get_asm_flagmasklibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J _png_get_asm_flagslibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J!_png_get_bKGDlibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J "_png_get_bit_depthlibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J#_png_get_cHRMlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!$_png_get_cHRM_fixedlibpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(J%_png_get_channelslibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!&_png_get_color_typelibpng12.dll libpng12.dll/ 1244148923 0 66 ` ÿÿL»4(J.'_png_get_compression_buffer_sizelibpng12.dlllibpng12.dll/ 1244148923 0 59 ` ÿÿL»4(J'(_png_get_compression_typelibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J )_png_get_copyrightlibpng12.dlllibpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J *_png_get_error_ptrlibpng12.dlllibpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"+_png_get_filter_typelibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J,_png_get_gAMAlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!-_png_get_gAMA_fixedlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J._png_get_hISTlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!/_png_get_header_verlibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%0_png_get_header_versionlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J1_png_get_iCCPlibpng12.dll libpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#2_png_get_image_heightlibpng12.dll libpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"3_png_get_image_widthlibpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(J4_png_get_int_32libpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%5_png_get_interlace_typelibpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(J6_png_get_io_ptrlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!7_png_get_libpng_verlibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J8_png_get_mem_ptrlibpng12.dlllibpng12.dll/ 1244148923 0 65 ` ÿÿL»4(J-9_png_get_mmx_bitdepth_thresholdlibpng12.dll libpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#:_png_get_mmx_flagmasklibpng12.dll libpng12.dll/ 1244148923 0 65 ` ÿÿL»4(J-;_png_get_mmx_rowbytes_thresholdlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J<_png_get_oFFslibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J=_png_get_pCALlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J>_png_get_pHYslibpng12.dll libpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)?_png_get_pixel_aspect_ratiolibpng12.dll libpng12.dll/ 1244148923 0 59 ` ÿÿL»4(J'@_png_get_pixels_per_meterlibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&A_png_get_progressive_ptrlibpng12.dlllibpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)B_png_get_rgb_to_gray_statuslibpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(JC_png_get_rowbyteslibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JD_png_get_rowslibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JE_png_get_sBITlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JF_png_get_sCALlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JG_png_get_sPLTlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JH_png_get_sRGBlibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J I_png_get_signaturelibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JJ_png_get_tIMElibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JK_png_get_tRNSlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JL_png_get_textlibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(JM_png_get_uint_16libpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(JN_png_get_uint_31libpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(JO_png_get_uint_32libpng12.dlllibpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%P_png_get_unknown_chunkslibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%Q_png_get_user_chunk_ptrlibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&R_png_get_user_height_maxlibpng12.dlllibpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)S_png_get_user_transform_ptrlibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%T_png_get_user_width_maxlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(JU_png_get_validlibpng12.dlllibpng12.dll/ 1244148923 0 59 ` ÿÿL»4(J'V_png_get_x_offset_micronslibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&W_png_get_x_offset_pixelslibpng12.dlllibpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)X_png_get_x_pixels_per_meterlibpng12.dll libpng12.dll/ 1244148923 0 59 ` ÿÿL»4(J'Y_png_get_y_offset_micronslibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&Z_png_get_y_offset_pixelslibpng12.dlllibpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)[_png_get_y_pixels_per_meterlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J\ _png_hISTlibpng12.dll libpng12.dll/ 1244148923 0 56 ` ÿÿL»4(J$]_png_handle_as_unknownlibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J^ _png_iCCPlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J_ _png_iTXtlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J`_png_info_initlibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Ja_png_info_init_3libpng12.dlllibpng12.dll/ 1244148923 0 46 ` ÿÿL»4(Jb_png_init_iolibpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jc _png_libpng_verlibpng12.dll libpng12.dll/ 1244148923 0 45 ` ÿÿL»4(Jd_png_malloclibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!e_png_malloc_defaultlibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Jf_png_malloc_warnlibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Jg_png_memcpy_checklibpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Jh_png_memset_checklibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Ji_png_mmx_supportlibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(Jj _png_oFFslibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(Jk _png_pCALlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(Jl _png_pHYslibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J m _png_pass_dsp_masklibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(Jn _png_pass_inclibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(Jo _png_pass_masklibpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jp _png_pass_startlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(Jq _png_pass_yinclibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Jr _png_pass_ystartlibpng12.dlllibpng12.dll/ 1244148923 0 56 ` ÿÿL»4(J$s_png_permit_empty_pltelibpng12.dlllibpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&t_png_permit_mng_featureslibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Ju_png_process_datalibpng12.dll libpng12.dll/ 1244148923 0 62 ` ÿÿL»4(J*v_png_progressive_combine_rowlibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Jw_png_read_destroylibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(Jx_png_read_endlibpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jy_png_read_imagelibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(Jz_png_read_infolibpng12.dlllibpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J{_png_read_initlibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J|_png_read_init_2libpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J}_png_read_init_3libpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J~_png_read_pnglibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J_png_read_rowlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J€_png_read_rowslibpng12.dlllibpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#_png_read_update_infolibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J ‚_png_reset_zstreamlibpng12.dlllibpng12.dll/ 1244148923 0 43 ` ÿÿL»4(Jƒ _png_sBITlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J„ _png_sCALlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J… _png_sPLTlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(J† _png_sRGBlibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J‡_png_save_int_32libpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Jˆ_png_save_uint_16libpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(J‰_png_save_uint_32libpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JŠ_png_set_IHDRlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J‹_png_set_PLTElibpng12.dll libpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J Œ_png_set_add_alphalibpng12.dlllibpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J _png_set_asm_flagslibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JŽ_png_set_bKGDlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!_png_set_backgroundlibpng12.dll libpng12.dll/ 1244148923 0 46 ` ÿÿL»4(J_png_set_bgrlibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J‘_png_set_cHRMlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!’_png_set_cHRM_fixedlibpng12.dll libpng12.dll/ 1244148923 0 66 ` ÿÿL»4(J.“_png_set_compression_buffer_sizelibpng12.dlllibpng12.dll/ 1244148923 0 60 ` ÿÿL»4(J(”_png_set_compression_levellibpng12.dlllibpng12.dll/ 1244148923 0 64 ` ÿÿL»4(J,•_png_set_compression_mem_levellibpng12.dlllibpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)–_png_set_compression_methodlibpng12.dll libpng12.dll/ 1244148923 0 63 ` ÿÿL»4(J+—_png_set_compression_strategylibpng12.dll libpng12.dll/ 1244148923 0 66 ` ÿÿL»4(J.˜_png_set_compression_window_bitslibpng12.dlllibpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!™_png_set_crc_actionlibpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jš_png_set_ditherlibpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(J›_png_set_error_fnlibpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jœ_png_set_expandlibpng12.dll libpng12.dll/ 1244148923 0 65 ` ÿÿL»4(J-_png_set_expand_gray_1_2_4_to_8libpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jž_png_set_fillerlibpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(JŸ_png_set_filterlibpng12.dll libpng12.dll/ 1244148923 0 60 ` ÿÿL»4(J( _png_set_filter_heuristicslibpng12.dlllibpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J¡_png_set_flushlibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J¢_png_set_gAMAlibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!£_png_set_gAMA_fixedlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(J¤_png_set_gammalibpng12.dlllibpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&¥_png_set_gray_1_2_4_to_8libpng12.dlllibpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"¦_png_set_gray_to_rgblibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J§_png_set_hISTlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J¨_png_set_iCCPlibpng12.dll libpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)©_png_set_interlace_handlinglibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Jª_png_set_invalidlibpng12.dlllibpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#«_png_set_invert_alphalibpng12.dll libpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"¬_png_set_invert_monolibpng12.dlllibpng12.dll/ 1244148923 0 62 ` ÿÿL»4(J*­_png_set_keep_unknown_chunkslibpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(J®_png_set_mem_fnlibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%¯_png_set_mmx_thresholdslibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J°_png_set_oFFslibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J±_png_set_pCALlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J²_png_set_pHYslibpng12.dll libpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J³_png_set_packinglibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(J´_png_set_packswaplibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%µ_png_set_palette_to_rgblibpng12.dll libpng12.dll/ 1244148923 0 62 ` ÿÿL»4(J*¶_png_set_progressive_read_fnlibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(J·_png_set_read_fnlibpng12.dlllibpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%¸_png_set_read_status_fnlibpng12.dll libpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)¹_png_set_read_user_chunk_fnlibpng12.dll libpng12.dll/ 1244148923 0 65 ` ÿÿL»4(J-º_png_set_read_user_transform_fnlibpng12.dll libpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"»_png_set_rgb_to_graylibpng12.dlllibpng12.dll/ 1244148923 0 60 ` ÿÿL»4(J(¼_png_set_rgb_to_gray_fixedlibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J½_png_set_rowslibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J¾_png_set_sBITlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(J¿_png_set_sCALlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JÀ_png_set_sPLTlibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JÁ_png_set_sRGBlibpng12.dll libpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)Â_png_set_sRGB_gAMA_and_cHRMlibpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(JÃ_png_set_shiftlibpng12.dlllibpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J Ä_png_set_sig_byteslibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(JÅ_png_set_strip_16libpng12.dll libpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"Æ_png_set_strip_alphalibpng12.dlllibpng12.dll/ 1244148923 0 62 ` ÿÿL»4(J*Ç_png_set_strip_error_numberslibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JÈ_png_set_swaplibpng12.dll libpng12.dll/ 1244148923 0 53 ` ÿÿL»4(J!É_png_set_swap_alphalibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JÊ_png_set_tIMElibpng12.dll libpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JË_png_set_tRNSlibpng12.dll libpng12.dll/ 1244148923 0 56 ` ÿÿL»4(J$Ì_png_set_tRNS_to_alphalibpng12.dlllibpng12.dll/ 1244148923 0 47 ` ÿÿL»4(JÍ_png_set_textlibpng12.dll libpng12.dll/ 1244148923 0 65 ` ÿÿL»4(J-Î_png_set_unknown_chunk_locationlibpng12.dll libpng12.dll/ 1244148923 0 57 ` ÿÿL»4(J%Ï_png_set_unknown_chunkslibpng12.dll libpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"Ð_png_set_user_limitslibpng12.dlllibpng12.dll/ 1244148923 0 62 ` ÿÿL»4(J*Ñ_png_set_user_transform_infolibpng12.dlllibpng12.dll/ 1244148923 0 51 ` ÿÿL»4(JÒ_png_set_write_fnlibpng12.dll libpng12.dll/ 1244148923 0 58 ` ÿÿL»4(J&Ó_png_set_write_status_fnlibpng12.dlllibpng12.dll/ 1244148923 0 66 ` ÿÿL»4(J.Ô_png_set_write_user_transform_fnlibpng12.dlllibpng12.dll/ 1244148923 0 42 ` ÿÿL»4(JÕ _png_siglibpng12.dlllibpng12.dll/ 1244148923 0 46 ` ÿÿL»4(JÖ_png_sig_cmplibpng12.dlllibpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#×_png_start_read_imagelibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(JØ _png_tEXtlibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(JÙ _png_tIMElibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(JÚ _png_tRNSlibpng12.dll libpng12.dll/ 1244148923 0 46 ` ÿÿL»4(JÛ_png_warninglibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(JÜ_png_write_chunklibpng12.dlllibpng12.dll/ 1244148923 0 55 ` ÿÿL»4(J#Ý_png_write_chunk_datalibpng12.dll libpng12.dll/ 1244148923 0 54 ` ÿÿL»4(J"Þ_png_write_chunk_endlibpng12.dlllibpng12.dll/ 1244148923 0 56 ` ÿÿL»4(J$ß_png_write_chunk_startlibpng12.dlllibpng12.dll/ 1244148923 0 52 ` ÿÿL»4(J à_png_write_destroylibpng12.dlllibpng12.dll/ 1244148923 0 48 ` ÿÿL»4(Já_png_write_endlibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Jâ_png_write_flushlibpng12.dlllibpng12.dll/ 1244148923 0 50 ` ÿÿL»4(Jã_png_write_imagelibpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jä_png_write_infolibpng12.dll libpng12.dll/ 1244148923 0 61 ` ÿÿL»4(J)å_png_write_info_before_PLTElibpng12.dll libpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jæ_png_write_initlibpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Jç_png_write_init_2libpng12.dll libpng12.dll/ 1244148923 0 51 ` ÿÿL»4(Jè_png_write_init_3libpng12.dll libpng12.dll/ 1244148923 0 48 ` ÿÿL»4(Jé_png_write_pnglibpng12.dlllibpng12.dll/ 1244148923 0 48 ` ÿÿL»4(Jê_png_write_rowlibpng12.dlllibpng12.dll/ 1244148923 0 49 ` ÿÿL»4(Jë_png_write_rowslibpng12.dll libpng12.dll/ 1244148923 0 43 ` ÿÿL»4(Jì _png_zTXtlibpng12.dll angband-3.5.1/src/win/lib/zlib.lib0000644000175000017500000003467212456456607016237 0ustar chriscchrisc! / 1121874615 0 2848 ` ÔÖ \\Æ,””úúffÊÊ66œœ l l Ð Ð!6!6! ! """l"l"Ð"Ð#8#8# # $$$p$p$Ø$Ø%B%B%ª%ª&&&‚&‚&î&î'V'Ä'Ä(.(.(”(”(ø(ø)\)\)À)À*"*"*†*†*ê*ê+L+L+®+®,,,t,t,Ö,Ö-8-8-š-š-þ-þ.`.`.È.È/*/*/Ž/Ž/ò/ò0V0V0¾0¾1(1(1”1”1ü1ü2b2b2Î2Î38383 3 444p4p4à4à5H5H5´6"6"6Š6Š6ô6ô7Z7Z7¼8 8 8„8„8æ8æ9R9R__IMPORT_DESCRIPTOR_zlib1__NULL_IMPORT_DESCRIPTORzlib1_NULL_THUNK_DATA_DllGetVersion__imp__DllGetVersion__imp___dist_code__imp___length_code__imp___tr_align__tr_align__imp___tr_flush_block__tr_flush_block__imp___tr_init__tr_init__imp___tr_stored_block__tr_stored_block__imp___tr_tally__tr_tally__imp__adler32_adler32__imp__adler32_combine_adler32_combine__imp__compress_compress__imp__compress2_compress2__imp__compressBound_compressBound__imp__crc32_crc32__imp__crc32_combine_crc32_combine__imp__deflate_deflate__imp__deflateBound_deflateBound__imp__deflateCopy_deflateCopy__imp__deflateEnd_deflateEnd__imp__deflateInit2__deflateInit2___imp__deflateInit__deflateInit___imp__deflateParams_deflateParams__imp__deflatePrime_deflatePrime__imp__deflateReset_deflateReset__imp__deflateSetDictionary_deflateSetDictionary__imp__deflateSetHeader_deflateSetHeader__imp__deflateTune_deflateTune__imp__deflate_copyright__imp__get_crc_table_get_crc_table__imp__gzclearerr_gzclearerr__imp__gzclose_gzclose__imp__gzdirect_gzdirect__imp__gzdopen_gzdopen__imp__gzeof_gzeof__imp__gzerror_gzerror__imp__gzflush_gzflush__imp__gzgetc_gzgetc__imp__gzgets_gzgets__imp__gzopen_gzopen__imp__gzprintf_gzprintf__imp__gzputc_gzputc__imp__gzputs_gzputs__imp__gzread_gzread__imp__gzrewind_gzrewind__imp__gzseek_gzseek__imp__gzsetparams_gzsetparams__imp__gztell_gztell__imp__gzungetc_gzungetc__imp__gzwrite_gzwrite__imp__inflate_inflate__imp__inflateBack_inflateBack__imp__inflateBackEnd_inflateBackEnd__imp__inflateBackInit__inflateBackInit___imp__inflateCopy_inflateCopy__imp__inflateEnd_inflateEnd__imp__inflateGetHeader_inflateGetHeader__imp__inflateInit2__inflateInit2___imp__inflateInit__inflateInit___imp__inflatePrime_inflatePrime__imp__inflateReset_inflateReset__imp__inflateSetDictionary_inflateSetDictionary__imp__inflateSync_inflateSync__imp__inflateSyncPoint_inflateSyncPoint__imp__inflate_copyright__imp__inflate_fast_inflate_fast__imp__inflate_table_inflate_table__imp__uncompress_uncompress__imp__zError_zError__imp__z_errmsg__imp__zcalloc_zcalloc__imp__zcfree_zcfree__imp__zlibCompileFlags_zlibCompileFlags__imp__zlibVersion_zlibVersion/ 1121874615 0 2868 ` LÔÖ \Æ,”úfÊ6œ l Ð 6! !"l"Ð"8# #$p$Ø$B%ª%&‚&î&V'Ä'.(”(ø(\)À)"*†*ê*L+®+,t,Ö,8-š-þ-`.È.*/Ž/ò/V0¾0(1”1ü1b2Î283 34p4à4H5´5"6Š6ô6Z7¼7 8„8æ8R9  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKL  !"#$%&'()*+,-./0123456789:;<=>?@ABDEFGIJKL_DllGetVersion__IMPORT_DESCRIPTOR_zlib1__NULL_IMPORT_DESCRIPTOR__imp__DllGetVersion__imp___dist_code__imp___length_code__imp___tr_align__imp___tr_flush_block__imp___tr_init__imp___tr_stored_block__imp___tr_tally__imp__adler32__imp__adler32_combine__imp__compress__imp__compress2__imp__compressBound__imp__crc32__imp__crc32_combine__imp__deflate__imp__deflateBound__imp__deflateCopy__imp__deflateEnd__imp__deflateInit2___imp__deflateInit___imp__deflateParams__imp__deflatePrime__imp__deflateReset__imp__deflateSetDictionary__imp__deflateSetHeader__imp__deflateTune__imp__deflate_copyright__imp__get_crc_table__imp__gzclearerr__imp__gzclose__imp__gzdirect__imp__gzdopen__imp__gzeof__imp__gzerror__imp__gzflush__imp__gzgetc__imp__gzgets__imp__gzopen__imp__gzprintf__imp__gzputc__imp__gzputs__imp__gzread__imp__gzrewind__imp__gzseek__imp__gzsetparams__imp__gztell__imp__gzungetc__imp__gzwrite__imp__inflate__imp__inflateBack__imp__inflateBackEnd__imp__inflateBackInit___imp__inflateCopy__imp__inflateEnd__imp__inflateGetHeader__imp__inflateInit2___imp__inflateInit___imp__inflatePrime__imp__inflateReset__imp__inflateSetDictionary__imp__inflateSync__imp__inflateSyncPoint__imp__inflate_copyright__imp__inflate_fast__imp__inflate_table__imp__uncompress__imp__zError__imp__z_errmsg__imp__zcalloc__imp__zcfree__imp__zlibCompileFlags__imp__zlibVersion__tr_align__tr_flush_block__tr_init__tr_stored_block__tr_tally_adler32_adler32_combine_compress_compress2_compressBound_crc32_crc32_combine_deflate_deflateBound_deflateCopy_deflateEnd_deflateInit2__deflateInit__deflateParams_deflatePrime_deflateReset_deflateSetDictionary_deflateSetHeader_deflateTune_get_crc_table_gzclearerr_gzclose_gzdirect_gzdopen_gzeof_gzerror_gzflush_gzgetc_gzgets_gzopen_gzprintf_gzputc_gzputs_gzread_gzrewind_gzseek_gzsetparams_gztell_gzungetc_gzwrite_inflate_inflateBack_inflateBackEnd_inflateBackInit__inflateCopy_inflateEnd_inflateGetHeader_inflateInit2__inflateInit__inflatePrime_inflateReset_inflateSetDictionary_inflateSync_inflateSyncPoint_inflate_fast_inflate_table_uncompress_zError_zcalloc_zcfree_zlibCompileFlags_zlibVersionzlib1_NULL_THUNK_DATAzlib1.dll/ 1121874615 0 710 ` L·rÞBèà .debug$S@l@B.idata$2¬À@0À.idata$6 ÞÀ@ À zlib1.dll(ÿ Microsoft (R) LINK zlib1.dll@comp.idÿ ÿÿ.idata$2@Àh.idata$6.idata$4@Àh.idata$5@Àh7N__IMPORT_DESCRIPTOR_zlib1__NULL_IMPORT_DESCRIPTORzlib1_NULL_THUNK_DATAzlib1.dll/ 1121874615 0 249 ` L·rÞB¸.debug$S@d@B.idata$3¤@0À zlib1.dll(ÿ Microsoft (R) LINK@comp.idÿ ÿÿ__NULL_IMPORT_DESCRIPTOR zlib1.dll/ 1121874615 0 275 ` L·rÞBÔ.debug$S@Œ@B.idata$5Ì@0À.idata$4Ð@0À zlib1.dll(ÿ Microsoft (R) LINK@comp.idÿ ÿÿzlib1_NULL_THUNK_DATA zlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB_DllGetVersionzlib1.dll zlib1.dll/ 1121874615 0 42 ` ÿÿL·rÞB__dist_codezlib1.dllzlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB__length_codezlib1.dllzlib1.dll/ 1121874615 0 41 ` ÿÿL·rÞB__tr_alignzlib1.dll zlib1.dll/ 1121874615 0 47 ` ÿÿL·rÞB__tr_flush_blockzlib1.dll zlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞB__tr_initzlib1.dllzlib1.dll/ 1121874615 0 48 ` ÿÿL·rÞB__tr_stored_blockzlib1.dllzlib1.dll/ 1121874615 0 41 ` ÿÿL·rÞB__tr_tallyzlib1.dll zlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB _adler32zlib1.dll zlib1.dll/ 1121874615 0 47 ` ÿÿL·rÞB _adler32_combinezlib1.dll zlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞB _compresszlib1.dllzlib1.dll/ 1121874615 0 41 ` ÿÿL·rÞB _compress2zlib1.dll zlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB _compressBoundzlib1.dll zlib1.dll/ 1121874615 0 37 ` ÿÿL·rÞB_crc32zlib1.dll zlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB_crc32_combinezlib1.dll zlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB_deflatezlib1.dll zlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB_deflateBoundzlib1.dllzlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞB_deflateCopyzlib1.dll zlib1.dll/ 1121874615 0 42 ` ÿÿL·rÞB_deflateEndzlib1.dllzlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB_deflateInit2_zlib1.dll zlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB_deflateInit_zlib1.dllzlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB_deflateParamszlib1.dll zlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB_deflatePrimezlib1.dllzlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB_deflateResetzlib1.dllzlib1.dll/ 1121874615 0 52 ` ÿÿL·rÞB _deflateSetDictionaryzlib1.dllzlib1.dll/ 1121874615 0 48 ` ÿÿL·rÞB_deflateSetHeaderzlib1.dllzlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞB_deflateTunezlib1.dll zlib1.dll/ 1121874615 0 49 ` ÿÿL·rÞB_deflate_copyrightzlib1.dll zlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB_get_crc_tablezlib1.dll zlib1.dll/ 1121874615 0 42 ` ÿÿL·rÞB_gzclearerrzlib1.dllzlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB_gzclosezlib1.dll zlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞB _gzdirectzlib1.dllzlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB!_gzdopenzlib1.dll zlib1.dll/ 1121874615 0 37 ` ÿÿL·rÞB"_gzeofzlib1.dll zlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB#_gzerrorzlib1.dll zlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB$_gzflushzlib1.dll zlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB%_gzgetczlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB&_gzgetszlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB'_gzopenzlib1.dllzlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞB(_gzprintfzlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB)_gzputczlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB*_gzputszlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB+_gzreadzlib1.dllzlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞB,_gzrewindzlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB-_gzseekzlib1.dllzlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞB._gzsetparamszlib1.dll zlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞB/_gztellzlib1.dllzlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞB0_gzungetczlib1.dllzlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB1_gzwritezlib1.dll zlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞB2_inflatezlib1.dll zlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞB3_inflateBackzlib1.dll zlib1.dll/ 1121874615 0 46 ` ÿÿL·rÞB4_inflateBackEndzlib1.dllzlib1.dll/ 1121874615 0 48 ` ÿÿL·rÞB5_inflateBackInit_zlib1.dllzlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞB6_inflateCopyzlib1.dll zlib1.dll/ 1121874615 0 42 ` ÿÿL·rÞB7_inflateEndzlib1.dllzlib1.dll/ 1121874615 0 48 ` ÿÿL·rÞB8_inflateGetHeaderzlib1.dllzlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞB9_inflateInit2_zlib1.dll zlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB:_inflateInit_zlib1.dllzlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB;_inflatePrimezlib1.dllzlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞB<_inflateResetzlib1.dllzlib1.dll/ 1121874615 0 52 ` ÿÿL·rÞB =_inflateSetDictionaryzlib1.dllzlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞB>_inflateSynczlib1.dll zlib1.dll/ 1121874615 0 48 ` ÿÿL·rÞB?_inflateSyncPointzlib1.dllzlib1.dll/ 1121874615 0 49 ` ÿÿL·rÞB@_inflate_copyrightzlib1.dll zlib1.dll/ 1121874615 0 44 ` ÿÿL·rÞBA_inflate_fastzlib1.dllzlib1.dll/ 1121874615 0 45 ` ÿÿL·rÞBB_inflate_tablezlib1.dll zlib1.dll/ 1121874615 0 42 ` ÿÿL·rÞBC_uncompresszlib1.dllzlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞBD_zErrorzlib1.dllzlib1.dll/ 1121874615 0 40 ` ÿÿL·rÞBE_z_errmsgzlib1.dllzlib1.dll/ 1121874615 0 39 ` ÿÿL·rÞBF_zcalloczlib1.dll zlib1.dll/ 1121874615 0 38 ` ÿÿL·rÞBG_zcfreezlib1.dllzlib1.dll/ 1121874615 0 48 ` ÿÿL·rÞBH_zlibCompileFlagszlib1.dllzlib1.dll/ 1121874615 0 43 ` ÿÿL·rÞBI_zlibVersionzlib1.dll angband-3.5.1/src/win/angband.ico0000644000175000017500000000137712456456606016122 0ustar chriscchrisc è( @€€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿° ûûðûûûð¿¿¿¿¿¿¿¿Ìϰûûñûû üüÌÌû¿°¿±¿¿¿ÌÌÌÏ ðûñûûðûÌÌÌ𱿿¼ÌÏ¿°° ðûûûûüûûûûð¿¿¿±¿¿¿¿¿¿ûûûñûûû+ûû¿¿¿¿²"//¿ ðð ò""ûûð¿ÿ""ûññðÿ""!ðð°ÿ"ûñññ!!ññññ¿°ûûñññññññññ¿¿¿ûûûðññ ññð¿¿¿¿¿ ûûû ñ ûðñðñð¿¿¿¿°¿°ûûûû û ûûûûð¿¿¿°¿¿¿¿¿¿°¿¿° ûûûû ûûûûû¿¿¿¿¿ÿÿÿÿà?ÿÃÀü€€€€ÀÀÀàààààààààààÀÀÀ€€€ÿøÿÿÿÿÿÿÿÿ angband-3.5.1/src/win/angband_visual_studio_step_by_step.txt0000644000175000017500000000473312456456606023720 0ustar chriscchriscTo build Angband using Microsoft's Visual Studio. 1. Download the source from the homepage at http://rephial.org or clone the git repostitory at https://github.com/angband/angband. 2. Make an empty win32 project in visual studio. 3. Extract/copy the source code into the project directory. Make sure that the src directory is in the project directory, rather than in another subdirectory. 4. Copy libpng.dll and zlib1.dll from src\win\dll\ to the project directory. 5. In the project settings, in the C/C++ tab, in the additional include directories ilne, add: src, src/win, src/win/include. 6. In the project settings, in the Link tab, in the Object/library modules line, add: "src\win\zlib1.lib src\win\libpng.lib msimg32.lib winmm.lib " to the front of the line. 7. In the project settings, also in the Link tab, remove any directory names (usually Debug\ or Release\) from in front of the executable name. Doing this will put the executeable in the project directory so you do not have to move it every time the project is compiled. 8. Add all of the files that end in ".c" or ".h" in the src directory EXCEPT those that have "main" in their name and snd-sdl.c to the project files. This can be done by right-clicking on the project in visual studio and choosing "Add Files to Project" from the context menu or by going to "Project" -> "Add to Project" -> "Files" from the menu bar. 9. Add all of the files that end in ".c" or ".h" in the src\player directory to the project. 10. Add all of the files that end in ".c" or ".h" in the src\object directory to the project. 11. Add all of the files that end in ".c" or ".h" in the src\monster directory to the project. 12. Add all of the files that end in ".c" or ".h" in the src\win directory to the project, as well as angband.rc. 13. Add main-win.c from the src directory to the project. 14. Save the project, then compile the project. There will be a lot of warnings, but there should not be any errors. The warnings can be ignored. 15. If there are no errors, enjoy playing angband. There should not be any errors and the executable should be built. If there are any errors, and you do not know how to fix them, you can ask on the forums at http://angband.oook.cz or in the #angband-dev IRC channel on Freenode. 16. Report bugs or request changes at trac.rephial.org. 17. To submit bug fixes, changes, etc please open pull requests on the Github site. angband-3.5.1/src/squelch.c0000644000175000017500000003505312456456606015045 0ustar chriscchrisc/* * File: squelch.c * Purpose: Item destruction * * Copyright (c) 2007 David T. Blackston, Iain McFall, DarkGod, Jeff Greene, * David Vestal, Pete Mack, Andi Sidwell. * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cmds.h" #include "ui-menu.h" #include "object/tvalsval.h" #include "object/pval.h" #include "squelch.h" typedef struct { squelch_type_t squelch_type; int tval; int min_sval; int max_sval; } quality_squelch_struct; static quality_squelch_struct quality_mapping[] = { { TYPE_WEAPON_GREAT, TV_SWORD, SV_BLADE_OF_CHAOS, SV_BLADE_OF_CHAOS }, { TYPE_WEAPON_GREAT, TV_POLEARM, SV_SCYTHE_OF_SLICING, SV_SCYTHE_OF_SLICING }, { TYPE_WEAPON_GREAT, TV_HAFTED, SV_MACE_OF_DISRUPTION, SV_MACE_OF_DISRUPTION }, { TYPE_WEAPON_POINTY, TV_SWORD, 0, SV_UNKNOWN }, { TYPE_WEAPON_POINTY, TV_POLEARM, 0, SV_UNKNOWN }, { TYPE_WEAPON_BLUNT, TV_HAFTED, 0, SV_UNKNOWN }, { TYPE_SHOOTER, TV_BOW, 0, SV_UNKNOWN }, { TYPE_MISSILE_SLING, TV_SHOT, 0, SV_UNKNOWN }, { TYPE_MISSILE_BOW, TV_ARROW, 0, SV_UNKNOWN }, { TYPE_MISSILE_XBOW, TV_BOLT, 0, SV_UNKNOWN }, { TYPE_ARMOR_ROBE, TV_SOFT_ARMOR, SV_ROBE,SV_ROBE }, { TYPE_ARMOR_DRAGON, TV_DRAG_ARMOR, 0, SV_UNKNOWN }, { TYPE_ARMOR_BODY, TV_HARD_ARMOR, 0, SV_UNKNOWN }, { TYPE_ARMOR_BODY, TV_SOFT_ARMOR, 0, SV_UNKNOWN }, { TYPE_ARMOR_CLOAK, TV_CLOAK, SV_CLOAK, SV_FUR_CLOAK }, { TYPE_ARMOR_CLOAK, TV_CLOAK, SV_ETHEREAL_CLOAK, SV_ETHEREAL_CLOAK }, /* XXX Eddie need to assert SV_CLOAK < SV_FUR_CLOAK < SV_ELVEN_CLOAK */ { TYPE_ARMOR_ELVEN_CLOAK, TV_CLOAK, SV_ELVEN_CLOAK, SV_ELVEN_CLOAK }, { TYPE_ARMOR_SHIELD, TV_SHIELD, 0, SV_UNKNOWN }, { TYPE_ARMOR_HEAD, TV_HELM, 0, SV_UNKNOWN }, { TYPE_ARMOR_HEAD, TV_CROWN, 0, SV_UNKNOWN }, { TYPE_ARMOR_HANDS, TV_GLOVES, 0, SV_UNKNOWN }, { TYPE_ARMOR_FEET, TV_BOOTS, 0, SV_UNKNOWN }, { TYPE_DIGGER, TV_DIGGING, 0, SV_UNKNOWN }, { TYPE_RING, TV_RING, 0, SV_UNKNOWN }, { TYPE_AMULET, TV_AMULET, 0, SV_UNKNOWN }, { TYPE_LIGHT, TV_LIGHT, 0, SV_UNKNOWN }, }; quality_name_struct quality_choices[TYPE_MAX] = { { TYPE_WEAPON_POINTY, "Pointy Melee Weapons" }, { TYPE_WEAPON_BLUNT, "Blunt Melee Weapons" }, { TYPE_WEAPON_GREAT, "Great Weapons" }, { TYPE_SHOOTER, "Missile weapons" }, { TYPE_MISSILE_SLING, "Shots and Pebbles" }, { TYPE_MISSILE_BOW, "Arrows" }, { TYPE_MISSILE_XBOW, "Bolts" }, { TYPE_ARMOR_ROBE, "Robes" }, { TYPE_ARMOR_BODY, "Body Armor" }, { TYPE_ARMOR_DRAGON, "Dragon Scale Mail" }, { TYPE_ARMOR_CLOAK, "Cloaks" }, { TYPE_ARMOR_ELVEN_CLOAK, "Elven Cloaks" }, { TYPE_ARMOR_SHIELD, "Shields" }, { TYPE_ARMOR_HEAD, "Headgear" }, { TYPE_ARMOR_HANDS, "Handgear" }, { TYPE_ARMOR_FEET, "Footgear" }, { TYPE_DIGGER, "Diggers" }, { TYPE_RING, "Rings" }, { TYPE_AMULET, "Amulets" }, { TYPE_LIGHT, "Lights" }, }; /* * The names for the various kinds of quality */ quality_name_struct quality_values[SQUELCH_MAX] = { { SQUELCH_NONE, "no squelch" }, { SQUELCH_BAD, "bad" }, { SQUELCH_AVERAGE, "average" }, { SQUELCH_GOOD, "good" }, { SQUELCH_EXCELLENT_NO_HI, "excellent with no high resists" }, { SQUELCH_EXCELLENT_NO_SPL, "excellent but not splendid" }, { SQUELCH_ALL, "non-artifact" }, }; byte squelch_level[TYPE_MAX]; const size_t squelch_size = TYPE_MAX; /* * Initialise the squelch package (currently just asserts). */ void squelch_init(void) { } /* * Reset the player's squelch choices for a new game. */ void squelch_birth_init(void) { int i; /* Reset squelch bits */ for (i = 0; i < z_info->k_max; i++) k_info[i].squelch = FALSE; /* Clear the squelch bytes */ for (i = 0; i < TYPE_MAX; i++) squelch_level[i] = SQUELCH_NONE; } /*** Autoinscription stuff ***/ const char *get_autoinscription(object_kind *kind) { return kind ? quark_str(kind->note) : NULL; } /* Put the autoinscription on an object */ int apply_autoinscription(object_type *o_ptr) { char o_name[80]; const char *note = get_autoinscription(o_ptr->kind); /* Don't inscribe unaware objects */ if (!note || !object_flavor_is_aware(o_ptr)) return 0; /* Don't re-inscribe if it's already inscribed */ if (o_ptr->note) return 0; /* Get an object description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); if (note[0] != 0) o_ptr->note = quark_add(note); else o_ptr->note = 0; msg("You autoinscribe %s.", o_name); return 1; } int remove_autoinscription(s16b kind) { struct object_kind *k = objkind_byid(kind); if (!k || !k->note) return 0; k->note = 0; return 1; } int add_autoinscription(s16b kind, const char *inscription) { struct object_kind *k = objkind_byid(kind); if (!k) return 0; if (!inscription) return remove_autoinscription(kind); k->note = quark_add(inscription); return 1; } void autoinscribe_ground(void) { int py = p_ptr->py; int px = p_ptr->px; s16b this_o_idx, next_o_idx = 0; /* Scan the pile of objects */ for (this_o_idx = cave->o_idx[py][px]; this_o_idx; this_o_idx = next_o_idx) { /* Get the next object */ next_o_idx = object_byid(this_o_idx)->next_o_idx; /* Apply an autoinscription */ apply_autoinscription(object_byid(this_o_idx)); } } void autoinscribe_pack(void) { int i; /* Cycle through the inventory */ for (i = INVEN_PACK; i >= 0; i--) { /* Skip empty items */ if (!p_ptr->inventory[i].kind) continue; /* Apply the inscription */ apply_autoinscription(&p_ptr->inventory[i]); } return; } /*** Squelch code ***/ /* * Squelch the flavor of an object */ void object_squelch_flavor_of(const object_type *o_ptr) { if (object_flavor_is_aware(o_ptr)) o_ptr->kind->squelch |= SQUELCH_IF_AWARE; else o_ptr->kind->squelch |= SQUELCH_IF_UNAWARE; } /* * Find the squelch type of the object, or TYPE_MAX if none */ squelch_type_t squelch_type_of(const object_type *o_ptr) { size_t i; /* Find the appropriate squelch group */ for (i = 0; i < N_ELEMENTS(quality_mapping); i++) { if ((quality_mapping[i].tval == o_ptr->tval) && (quality_mapping[i].min_sval <= o_ptr->sval) && (quality_mapping[i].max_sval >= o_ptr->sval)) return quality_mapping[i].squelch_type; } return TYPE_MAX; } /** * Small helper function to see how an object trait compares to the one * in its base type. * * If the base type provides a positive bonus, we'll use that. Otherwise, we'll * use zero (players don't consider an item with a positive bonus to be bad * even if the base kind has a higher positive bonus). */ static int cmp_object_trait(int bonus, random_value base) { int amt = randcalc(base, 0, MINIMISE); if (amt > 0) amt = 0; return CMP(bonus, amt); } /** * Small helper function to see if an item seems good, bad or average based on * to_h, to_d and to_a. * * The sign of the return value announces if the object is bad (negative), * good (positive) or average (zero). */ static int is_object_good(const object_type *o_ptr) { int good = 0; good += 4 * cmp_object_trait(o_ptr->to_d, o_ptr->kind->to_d); good += 2 * cmp_object_trait(o_ptr->to_h, o_ptr->kind->to_h); good += 1 * cmp_object_trait(o_ptr->to_a, o_ptr->kind->to_a); return good; } /* * Determine the squelch level of an object, which is similar to its pseudo. * * The main point is when the value is undetermined given current info, * return the maximum possible value. */ byte squelch_level_of(const object_type *o_ptr) { byte value = 0; bitflag f[OF_SIZE], f2[OF_SIZE]; int i; object_flags_known(o_ptr, f); /* Deal with jewelry specially. */ if (object_is_jewelry(o_ptr)) { /* CC: average jewelry has at least one known positive pval */ for (i = 0; i < o_ptr->num_pvals; i++) if ((object_this_pval_is_visible(o_ptr, i)) && (o_ptr->pval[i] > 0)) return SQUELCH_AVERAGE; if ((o_ptr->to_h > 0) || (o_ptr->to_d > 0) || (o_ptr->to_a > 0)) return SQUELCH_AVERAGE; if ((object_attack_plusses_are_visible(o_ptr) && ((o_ptr->to_h < 0) || (o_ptr->to_d < 0))) || (object_defence_plusses_are_visible(o_ptr) && o_ptr->to_a < 0)) return SQUELCH_BAD; return SQUELCH_AVERAGE; } /* And lights */ if (o_ptr->tval == TV_LIGHT) { create_mask(f2, TRUE, OFID_WIELD, OFT_MAX); if (of_is_inter(f, f2)) return SQUELCH_ALL; if ((o_ptr->to_h > 0) || (o_ptr->to_d > 0) || (o_ptr->to_a > 0)) return SQUELCH_GOOD; if ((o_ptr->to_h < 0) || (o_ptr->to_d < 0) || (o_ptr->to_a < 0)) return SQUELCH_BAD; return SQUELCH_AVERAGE; } /* CC: we need to redefine "bad" with multiple pvals * At the moment we use "all pvals known and negative" */ for (i = 0; i < o_ptr->num_pvals; i++) { if (!object_this_pval_is_visible(o_ptr, i) || (o_ptr->pval[i] > 0)) break; if (i == (o_ptr->num_pvals - 1)) return SQUELCH_BAD; } if (object_was_sensed(o_ptr)) { obj_pseudo_t pseudo = object_pseudo(o_ptr); switch (pseudo) { case INSCRIP_AVERAGE: { value = SQUELCH_AVERAGE; break; } case INSCRIP_EXCELLENT: { /* have to assume splendid until you have tested it */ if (object_was_worn(o_ptr)) { if (object_high_resist_is_possible(o_ptr)) value = SQUELCH_EXCELLENT_NO_SPL; else value = SQUELCH_EXCELLENT_NO_HI; } else { value = SQUELCH_ALL; } break; } case INSCRIP_SPLENDID: value = SQUELCH_ALL; break; case INSCRIP_NULL: case INSCRIP_SPECIAL: value = SQUELCH_MAX; break; /* This is the interesting case */ case INSCRIP_STRANGE: case INSCRIP_MAGICAL: { value = SQUELCH_GOOD; if ((object_attack_plusses_are_visible(o_ptr) || randcalc_valid(o_ptr->kind->to_h, o_ptr->to_h) || randcalc_valid(o_ptr->kind->to_d, o_ptr->to_d)) && (object_defence_plusses_are_visible(o_ptr) || randcalc_valid(o_ptr->kind->to_a, o_ptr->to_a))) { int isgood = is_object_good(o_ptr); if (isgood > 0) { value = SQUELCH_GOOD; } else if (isgood < 0) { value = SQUELCH_BAD; } else { value = SQUELCH_AVERAGE; } } break; } default: /* do not handle any other possible pseudo values */ assert(0); } } else { if (object_was_worn(o_ptr)) value = SQUELCH_EXCELLENT_NO_SPL; /* object would be sensed if it were splendid */ else if (object_is_known_not_artifact(o_ptr)) value = SQUELCH_ALL; else value = SQUELCH_MAX; } return value; } /* * Remove any squelching of a particular flavor */ void kind_squelch_clear(object_kind *k_ptr) { k_ptr->squelch = 0; p_ptr->notice |= PN_SQUELCH; } bool kind_is_squelched_aware(const object_kind *k_ptr) { return (k_ptr->squelch & SQUELCH_IF_AWARE) ? TRUE : FALSE; } bool kind_is_squelched_unaware(const object_kind *k_ptr) { return (k_ptr->squelch & SQUELCH_IF_UNAWARE) ? TRUE : FALSE; } void kind_squelch_when_aware(object_kind *k_ptr) { k_ptr->squelch |= SQUELCH_IF_AWARE; p_ptr->notice |= PN_SQUELCH; } void kind_squelch_when_unaware(object_kind *k_ptr) { k_ptr->squelch |= SQUELCH_IF_UNAWARE; p_ptr->notice |= PN_SQUELCH; } /* * Determines if an object is eligible for squelching. */ bool squelch_item_ok(const object_type *o_ptr) { byte type; if (p_ptr->unignoring) return FALSE; /* Don't squelch artifacts unless marked to be squelched */ if (o_ptr->artifact || check_for_inscrip(o_ptr, "!k") || check_for_inscrip(o_ptr, "!*")) return FALSE; /* Do squelch individual objects that marked ignore */ if (o_ptr->ignore) return TRUE; /* Do squelching by kind */ if (object_flavor_is_aware(o_ptr) ? kind_is_squelched_aware(o_ptr->kind) : kind_is_squelched_unaware(o_ptr->kind)) return TRUE; type = squelch_type_of(o_ptr); if (type == TYPE_MAX) return FALSE; /* Squelch items known not to be special */ if (object_is_known_not_artifact(o_ptr) && squelch_level[type] == SQUELCH_ALL) return TRUE; /* Get result based on the feeling and the squelch_level */ if (squelch_level_of(o_ptr) <= squelch_level[type]) return TRUE; else return FALSE; } /* * Determines if an object is already squelched. Same as squelch_item_ok above, * without the first (p_ptr->unignoring) test. */ bool object_is_squelched(const object_type *o_ptr) { byte type; /* Do squelch individual objects that marked ignore */ if (o_ptr->ignore) return TRUE; /* Don't squelch artifacts unless marked to be squelched */ if (o_ptr->artifact || check_for_inscrip(o_ptr, "!k") || check_for_inscrip(o_ptr, "!*")) return FALSE; /* Do squelching by kind */ if (object_flavor_is_aware(o_ptr) ? kind_is_squelched_aware(o_ptr->kind) : kind_is_squelched_unaware(o_ptr->kind)) return TRUE; type = squelch_type_of(o_ptr); if (type == TYPE_MAX) return FALSE; /* Squelch items known not to be special */ if (object_is_known_not_artifact(o_ptr) && squelch_level[type] == SQUELCH_ALL) return TRUE; /* Get result based on the feeling and the squelch_level */ if (squelch_level_of(o_ptr) <= squelch_level[type]) return TRUE; else return FALSE; } /* * Drop all {squelch}able items. */ void squelch_drop(void) { int n; /* Scan through the slots backwards */ for (n = INVEN_TOTAL - 1; n >= 0; n--) { object_type *o_ptr = &p_ptr->inventory[n]; /* Skip non-objects and unsquelchable objects */ if (n == INVEN_PACK) continue; /* Skip overflow slot. */ if (!o_ptr->kind) continue; if (!squelch_item_ok(o_ptr)) continue; /* Check for !d (no drop) inscription */ if (!check_for_inscrip(o_ptr, "!d") && !check_for_inscrip(o_ptr, "!*")) { /* Confirm the drop if the item is equipped. */ if (n >= INVEN_WIELD) { if (!verify_item("Really take off and drop", n)) { /* Hack - inscribe the item with !d to prevent repeated confirmations. */ const char *inscription = quark_str(o_ptr->note); if (inscription == NULL) { o_ptr->note = quark_add("!d"); } else { char buffer[1024]; my_strcpy(buffer, inscription, sizeof(buffer)); my_strcat(buffer, "!d", sizeof(buffer)); o_ptr->note = quark_add(buffer); } continue; } } /* We're allowed to drop it. */ inven_drop(n, o_ptr->number); } } /* Combine/reorder the pack */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); } /** * Return the name of a squelch type. */ const char *squelch_name_for_type(squelch_type_t type) { size_t i; for (i = 0; i < TYPE_MAX; i++) { if (quality_choices[i].enum_val == type) return quality_choices[i].name; } return "unknown"; } angband-3.5.1/src/init.c0000644000175000017500000022570312456456606014347 0ustar chriscchrisc/* * File: init.c * Purpose: Various game initialistion routines * * Copyright (c) 1997 Ben Harrison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "buildid.h" #include "cave.h" #include "cmds.h" #include "game-event.h" #include "game-cmd.h" #include "generate.h" #include "history.h" #include "hint.h" #include "keymap.h" #include "init.h" #include "monster/mon-init.h" #include "monster/mon-list.h" #include "monster/mon-msg.h" #include "monster/mon-util.h" #include "object/object.h" #include "object/obj-list.h" #include "object/slays.h" #include "object/tvalsval.h" #include "option.h" #include "parser.h" #include "prefs.h" #include "quest.h" #include "randname.h" #include "squelch.h" #include "ui-options.h" /* * Structure (not array) of size limits */ maxima *z_info; static struct history_chart *histories; /* * This file is used to initialize various variables and arrays for the * Angband game. Note the use of "fd_read()" and "fd_write()" to bypass * the common limitation of "read()" and "write()" to only 32767 bytes * at a time. * * Several of the arrays for Angband are built from "template" files in * the "lib/edit" directory. * * Warning -- the "ascii" file parsers use a minor hack to collect the * name and text information in a single pass. Thus, the game will not * be able to load any template file with more than 20K of names or 60K * of text, even though technically, up to 64K should be legal. */ static const char *k_info_flags[] = { #define OF(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) #a, #include "object/list-object-flags.h" #undef OF NULL }; static const char *effect_list[] = { #define EFFECT(x, y, r, z) #x, #include "list-effects.h" #undef EFFECT }; static u32b grab_one_effect(const char *what) { size_t i; /* Scan activations */ for (i = 0; i < N_ELEMENTS(effect_list); i++) { if (streq(what, effect_list[i])) return i; } /* Oops */ msg("Unknown effect '%s'.", what); /* Error */ return 0; } static struct history_chart *findchart(struct history_chart *hs, unsigned int idx) { for (; hs; hs = hs->next) if (hs->idx == idx) break; return hs; } /* * Find the default paths to all of our important sub-directories. * * All of the sub-directories should, by default, be located inside * the main directory, whose location is very system dependant and is * set by the ANGBAND_PATH environment variable, if it exists. (On multi- * user systems such as Linux this is not the default - see config.h for * more info.) * * This function takes a writable buffers, initially containing the * "path" to the "config", "lib" and "data" directories, for example, * "/etc/angband/", "/usr/share/angband" and "/var/games/angband" - * or a system dependant string, for example, ":lib:". The buffer * must be large enough to contain at least 32 more characters. * * Various command line options may allow some of the important * directories to be changed to user-specified directories, most * importantly, the "apex" and "user" and "save" directories, * but this is done after this function, see "main.c". * * In general, the initial path should end in the appropriate "PATH_SEP" * string. All of the "sub-directory" paths (created below or supplied * by the user) will NOT end in the "PATH_SEP" string, see the special * "path_build()" function in "util.c" for more information. * * Hack -- first we free all the strings, since this is known * to succeed even if the strings have not been allocated yet, * as long as the variables start out as "NULL". This allows * this function to be called multiple times, for example, to * try several base "path" values until a good one is found. */ void init_file_paths(const char *configpath, const char *libpath, const char *datapath) { #ifdef PRIVATE_USER_PATH char buf[1024]; #endif /* PRIVATE_USER_PATH */ /*** Free everything ***/ /* Free the sub-paths */ string_free(ANGBAND_DIR_APEX); string_free(ANGBAND_DIR_EDIT); string_free(ANGBAND_DIR_FILE); string_free(ANGBAND_DIR_HELP); string_free(ANGBAND_DIR_INFO); string_free(ANGBAND_DIR_SAVE); string_free(ANGBAND_DIR_PREF); string_free(ANGBAND_DIR_USER); string_free(ANGBAND_DIR_XTRA); string_free(ANGBAND_DIR_XTRA_FONT); string_free(ANGBAND_DIR_XTRA_GRAF); string_free(ANGBAND_DIR_XTRA_SOUND); string_free(ANGBAND_DIR_XTRA_ICON); /*** Prepare the paths ***/ /* Build path names */ ANGBAND_DIR_EDIT = string_make(format("%sedit", configpath)); ANGBAND_DIR_FILE = string_make(format("%sfile", libpath)); ANGBAND_DIR_HELP = string_make(format("%shelp", libpath)); ANGBAND_DIR_INFO = string_make(format("%sinfo", libpath)); ANGBAND_DIR_PREF = string_make(format("%spref", configpath)); ANGBAND_DIR_XTRA = string_make(format("%sxtra", libpath)); /* Build xtra/ paths */ ANGBAND_DIR_XTRA_FONT = string_make(format("%s" PATH_SEP "font", ANGBAND_DIR_XTRA)); ANGBAND_DIR_XTRA_GRAF = string_make(format("%s" PATH_SEP "graf", ANGBAND_DIR_XTRA)); ANGBAND_DIR_XTRA_SOUND = string_make(format("%s" PATH_SEP "sound", ANGBAND_DIR_XTRA)); ANGBAND_DIR_XTRA_ICON = string_make(format("%s" PATH_SEP "icon", ANGBAND_DIR_XTRA)); #ifdef PRIVATE_USER_PATH /* Build the path to the user specific directory */ if (strncmp(ANGBAND_SYS, "test", 4) == 0) path_build(buf, sizeof(buf), PRIVATE_USER_PATH, "Test"); else path_build(buf, sizeof(buf), PRIVATE_USER_PATH, VERSION_NAME); ANGBAND_DIR_USER = string_make(buf); path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "scores"); ANGBAND_DIR_APEX = string_make(buf); path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "save"); ANGBAND_DIR_SAVE = string_make(buf); #else /* !PRIVATE_USER_PATH */ /* Build pathnames */ ANGBAND_DIR_USER = string_make(format("%suser", datapath)); ANGBAND_DIR_APEX = string_make(format("%sapex", datapath)); ANGBAND_DIR_SAVE = string_make(format("%ssave", datapath)); #endif /* PRIVATE_USER_PATH */ } /* * Create any missing directories. We create only those dirs which may be * empty (user/, save/, apex/, info/, help/). The others are assumed * to contain required files and therefore must exist at startup * (edit/, pref/, file/, xtra/). * * ToDo: Only create the directories when actually writing files. */ void create_needed_dirs(void) { char dirpath[512]; path_build(dirpath, sizeof(dirpath), ANGBAND_DIR_USER, ""); if (!dir_create(dirpath)) quit_fmt("Cannot create '%s'", dirpath); path_build(dirpath, sizeof(dirpath), ANGBAND_DIR_SAVE, ""); if (!dir_create(dirpath)) quit_fmt("Cannot create '%s'", dirpath); path_build(dirpath, sizeof(dirpath), ANGBAND_DIR_APEX, ""); if (!dir_create(dirpath)) quit_fmt("Cannot create '%s'", dirpath); path_build(dirpath, sizeof(dirpath), ANGBAND_DIR_INFO, ""); if (!dir_create(dirpath)) quit_fmt("Cannot create '%s'", dirpath); path_build(dirpath, sizeof(dirpath), ANGBAND_DIR_HELP, ""); if (!dir_create(dirpath)) quit_fmt("Cannot create '%s'", dirpath); } /* Parsing functions for limits.txt */ static enum parser_error parse_z(struct parser *p) { maxima *z; const char *label; int value; z = parser_priv(p); label = parser_getsym(p, "label"); value = parser_getint(p, "value"); if (value < 0) return PARSE_ERROR_INVALID_VALUE; if (streq(label, "F")) z->f_max = value; else if (streq(label, "K")) z->k_max = value; else if (streq(label, "A")) z->a_max = value; else if (streq(label, "E")) z->e_max = value; else if (streq(label, "R")) z->r_max = value; else if (streq(label, "P")) z->mp_max = value; else if (streq(label, "S")) z->s_max = value; else if (streq(label, "O")) z->o_max = value; else if (streq(label, "M")) z->m_max = value; else if (streq(label, "I")) z->pit_max = value; else return PARSE_ERROR_UNDEFINED_DIRECTIVE; return 0; } struct parser *init_parse_z(void) { struct maxima *z = mem_zalloc(sizeof *z); struct parser *p = parser_new(); parser_setpriv(p, z); parser_reg(p, "M sym label int value", parse_z); return p; } static errr run_parse_z(struct parser *p) { return parse_file(p, "limits"); } static errr finish_parse_z(struct parser *p) { z_info = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_z(void) { mem_free(z_info); } static struct file_parser z_parser = { "limits", init_parse_z, run_parse_z, finish_parse_z, cleanup_z }; /* Parsing functions for object_base.txt */ struct kb_parsedata { object_base defaults; object_base *kb; }; static enum parser_error parse_kb_d(struct parser *p) { const char *label; int value; struct kb_parsedata *d = parser_priv(p); assert(d); label = parser_getsym(p, "label"); value = parser_getint(p, "value"); if (streq(label, "B")) d->defaults.break_perc = value; else return PARSE_ERROR_UNDEFINED_DIRECTIVE; return PARSE_ERROR_NONE; } static enum parser_error parse_kb_n(struct parser *p) { struct object_base *kb; struct kb_parsedata *d = parser_priv(p); assert(d); kb = mem_alloc(sizeof *kb); memcpy(kb, &d->defaults, sizeof(*kb)); kb->next = d->kb; d->kb = kb; kb->tval = tval_find_idx(parser_getsym(p, "tval")); if (kb->tval == -1) return PARSE_ERROR_UNRECOGNISED_TVAL; kb->name = string_make(parser_getstr(p, "name")); return PARSE_ERROR_NONE; } static enum parser_error parse_kb_b(struct parser *p) { struct object_base *kb; struct kb_parsedata *d = parser_priv(p); assert(d); kb = d->kb; assert(kb); kb->break_perc = parser_getint(p, "breakage"); return PARSE_ERROR_NONE; } static enum parser_error parse_kb_f(struct parser *p) { struct object_base *kb; char *s, *t; struct kb_parsedata *d = parser_priv(p); assert(d); kb = d->kb; assert(kb); s = string_make(parser_getstr(p, "flags")); t = strtok(s, " |"); while (t) { if (grab_flag(kb->flags, OF_SIZE, k_info_flags, t)) break; t = strtok(NULL, " |"); } mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } struct parser *init_parse_kb(void) { struct parser *p = parser_new(); struct kb_parsedata *d = mem_zalloc(sizeof(*d)); parser_setpriv(p, d); parser_reg(p, "D sym label int value", parse_kb_d); parser_reg(p, "N sym tval str name", parse_kb_n); parser_reg(p, "B int breakage", parse_kb_b); parser_reg(p, "F str flags", parse_kb_f); return p; } static errr run_parse_kb(struct parser *p) { return parse_file(p, "object_base"); } static errr finish_parse_kb(struct parser *p) { struct object_base *kb; struct object_base *next = NULL; struct kb_parsedata *d = parser_priv(p); assert(d); kb_info = mem_zalloc(TV_MAX * sizeof(*kb_info)); for (kb = d->kb; kb; kb = next) { if (kb->tval >= TV_MAX) continue; memcpy(&kb_info[kb->tval], kb, sizeof(*kb)); next = kb->next; mem_free(kb); } mem_free(d); parser_destroy(p); return 0; } static void cleanup_kb(void) { int idx; for (idx = 0; idx < TV_MAX; idx++) { string_free(kb_info[idx].name); } mem_free(kb_info); } static struct file_parser kb_parser = { "object_base", init_parse_kb, run_parse_kb, finish_parse_kb, cleanup_kb }; /* Parsing functions for object.txt */ static enum parser_error parse_k_n(struct parser *p) { int idx = parser_getint(p, "index"); const char *name = parser_getstr(p, "name"); struct object_kind *h = parser_priv(p); struct object_kind *k = mem_zalloc(sizeof *k); k->next = h; parser_setpriv(p, k); k->kidx = idx; k->name = string_make(name); return PARSE_ERROR_NONE; } static enum parser_error parse_k_g(struct parser *p) { wchar_t glyph = parser_getchar(p, "glyph"); const char *color = parser_getsym(p, "color"); struct object_kind *k = parser_priv(p); assert(k); k->d_char = glyph; if (strlen(color) > 1) k->d_attr = color_text_to_attr(color); else k->d_attr = color_char_to_attr(color[0]); return PARSE_ERROR_NONE; } static enum parser_error parse_k_i(struct parser *p) { struct object_kind *k = parser_priv(p); int tval; assert(k); tval = tval_find_idx(parser_getsym(p, "tval")); if (tval < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; k->tval = tval; k->sval = parser_getint(p, "sval"); k->base = &kb_info[k->tval]; return PARSE_ERROR_NONE; } static enum parser_error parse_k_w(struct parser *p) { struct object_kind *k = parser_priv(p); assert(k); k->level = parser_getint(p, "level"); k->weight = parser_getint(p, "weight"); k->cost = parser_getint(p, "cost"); return PARSE_ERROR_NONE; } static enum parser_error parse_k_a(struct parser *p) { struct object_kind *k = parser_priv(p); const char *tmp = parser_getstr(p, "minmax"); int amin, amax; assert(k); k->alloc_prob = parser_getint(p, "common"); if (sscanf(tmp, "%d to %d", &amin, &amax) != 2) return PARSE_ERROR_GENERIC; k->alloc_min = amin; k->alloc_max = amax; return PARSE_ERROR_NONE; } static enum parser_error parse_k_p(struct parser *p) { struct object_kind *k = parser_priv(p); struct random hd = parser_getrand(p, "hd"); assert(k); k->ac = parser_getint(p, "ac"); k->dd = hd.dice; k->ds = hd.sides; k->to_h = parser_getrand(p, "to-h"); k->to_d = parser_getrand(p, "to-d"); k->to_a = parser_getrand(p, "to-a"); return PARSE_ERROR_NONE; } static enum parser_error parse_k_c(struct parser *p) { struct object_kind *k = parser_priv(p); assert(k); k->charge = parser_getrand(p, "charges"); return PARSE_ERROR_NONE; } static enum parser_error parse_k_m(struct parser *p) { struct object_kind *k = parser_priv(p); assert(k); k->gen_mult_prob = parser_getint(p, "prob"); k->stack_size = parser_getrand(p, "stack"); return PARSE_ERROR_NONE; } static enum parser_error parse_k_f(struct parser *p) { struct object_kind *k = parser_priv(p); char *s = string_make(parser_getstr(p, "flags")); char *t; assert(k); t = strtok(s, " |"); while (t) { if (grab_flag(k->flags, OF_SIZE, k_info_flags, t)) break; t = strtok(NULL, " |"); } mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static enum parser_error parse_k_e(struct parser *p) { struct object_kind *k = parser_priv(p); assert(k); k->effect = grab_one_effect(parser_getsym(p, "name")); if (parser_hasval(p, "time")) k->time = parser_getrand(p, "time"); if (!k->effect) return PARSE_ERROR_GENERIC; return PARSE_ERROR_NONE; } static enum parser_error parse_k_d(struct parser *p) { struct object_kind *k = parser_priv(p); assert(k); k->text = string_append(k->text, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } static enum parser_error parse_k_l(struct parser *p) { struct object_kind *k = parser_priv(p); char *s; char *t; assert(k); k->pval[k->num_pvals] = parser_getrand(p, "pval"); if (!parser_hasval(p, "flags")) { k->num_pvals++; return PARSE_ERROR_NONE; } s = string_make(parser_getstr(p, "flags")); t = strtok(s, " |"); while (t) { if (grab_flag(k->flags, OF_SIZE, k_info_flags, t) || grab_flag(k->pval_flags[k->num_pvals], OF_SIZE, k_info_flags, t)) break; t = strtok(NULL, " |"); } k->num_pvals++; if (k->num_pvals > MAX_PVALS) return PARSE_ERROR_TOO_MANY_ENTRIES; mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } struct parser *init_parse_k(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N int index str name", parse_k_n); parser_reg(p, "G char glyph sym color", parse_k_g); parser_reg(p, "I sym tval int sval", parse_k_i); parser_reg(p, "W int level int extra int weight int cost", parse_k_w); parser_reg(p, "A int common str minmax", parse_k_a); parser_reg(p, "P int ac rand hd rand to-h rand to-d rand to-a", parse_k_p); parser_reg(p, "C rand charges", parse_k_c); parser_reg(p, "M int prob rand stack", parse_k_m); parser_reg(p, "F str flags", parse_k_f); parser_reg(p, "E sym name ?rand time", parse_k_e); parser_reg(p, "L rand pval ?str flags", parse_k_l); parser_reg(p, "D str text", parse_k_d); return p; } static errr run_parse_k(struct parser *p) { return parse_file(p, "object"); } static errr finish_parse_k(struct parser *p) { struct object_kind *k, *next = NULL; /* scan the list for the max id */ z_info->k_max -= 1; /*z_info->k_max = 0; fails to load existing save file because of too high value in old limits.txt. Change to this line when save file compatibility changes and remove line from limits.txt */ k = parser_priv(p); while (k) { if (k->kidx > z_info->k_max) z_info->k_max = k->kidx; k = k->next; } /* allocate the direct access list and copy the data to it */ k_info = mem_zalloc((z_info->k_max+1) * sizeof(*k)); for (k = parser_priv(p); k; k = next) { memcpy(&k_info[k->kidx], k, sizeof(*k)); next = k->next; if (next) k_info[k->kidx].next = &k_info[next->kidx]; else k_info[k->kidx].next = NULL; mem_free(k); } z_info->k_max += 1; /*objkinds = parser_priv(p); not used yet, when used, remove the mem_free(k); above */ parser_destroy(p); return 0; } static void cleanup_k(void) { int idx; for (idx = 0; idx < z_info->k_max; idx++) { string_free(k_info[idx].name); mem_free(k_info[idx].text); } mem_free(k_info); } static struct file_parser k_parser = { "object", init_parse_k, run_parse_k, finish_parse_k, cleanup_k }; /* Parsing functions for artifact.txt */ static enum parser_error parse_a_n(struct parser *p) { bitflag f[OF_SIZE]; int idx = parser_getint(p, "index"); const char *name = parser_getstr(p, "name"); struct artifact *h = parser_priv(p); struct artifact *a = mem_zalloc(sizeof *a); a->next = h; parser_setpriv(p, a); a->aidx = idx; a->name = string_make(name); /* Ignore all elements */ create_mask(f, FALSE, OFT_IGNORE, OFT_MAX); of_union(a->flags, f); return PARSE_ERROR_NONE; } static enum parser_error parse_a_i(struct parser *p) { struct artifact *a = parser_priv(p); int tval, sval; assert(a); tval = tval_find_idx(parser_getsym(p, "tval")); if (tval < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; a->tval = tval; sval = lookup_sval(a->tval, parser_getsym(p, "sval")); if (sval < 0) return PARSE_ERROR_UNRECOGNISED_SVAL; a->sval = sval; return PARSE_ERROR_NONE; } static enum parser_error parse_a_w(struct parser *p) { struct artifact *a = parser_priv(p); assert(a); a->level = parser_getint(p, "level"); a->weight = parser_getint(p, "weight"); a->cost = parser_getint(p, "cost"); return PARSE_ERROR_NONE; } static enum parser_error parse_a_a(struct parser *p) { struct artifact *a = parser_priv(p); const char *tmp = parser_getstr(p, "minmax"); int amin, amax; assert(a); a->alloc_prob = parser_getint(p, "common"); if (sscanf(tmp, "%d to %d", &amin, &amax) != 2) return PARSE_ERROR_GENERIC; if (amin > 255 || amax > 255 || amin < 0 || amax < 0) return PARSE_ERROR_OUT_OF_BOUNDS; a->alloc_min = amin; a->alloc_max = amax; return PARSE_ERROR_NONE; } static enum parser_error parse_a_p(struct parser *p) { struct artifact *a = parser_priv(p); struct random hd = parser_getrand(p, "hd"); assert(a); a->ac = parser_getint(p, "ac"); a->dd = hd.dice; a->ds = hd.sides; a->to_h = parser_getint(p, "to-h"); a->to_d = parser_getint(p, "to-d"); a->to_a = parser_getint(p, "to-a"); return PARSE_ERROR_NONE; } static enum parser_error parse_a_f(struct parser *p) { struct artifact *a = parser_priv(p); char *s; char *t; assert(a); if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; s = string_make(parser_getstr(p, "flags")); t = strtok(s, " |"); while (t) { if (grab_flag(a->flags, OF_SIZE, k_info_flags, t)) break; t = strtok(NULL, " |"); } mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static enum parser_error parse_a_e(struct parser *p) { struct artifact *a = parser_priv(p); assert(a); a->effect = grab_one_effect(parser_getsym(p, "name")); a->time = parser_getrand(p, "time"); if (!a->effect) return PARSE_ERROR_GENERIC; return PARSE_ERROR_NONE; } static enum parser_error parse_a_m(struct parser *p) { struct artifact *a = parser_priv(p); assert(a); a->effect_msg = string_append(a->effect_msg, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } static enum parser_error parse_a_l(struct parser *p) { struct artifact *a = parser_priv(p); char *s; char *t; assert(a); a->pval[a->num_pvals] = parser_getint(p, "pval"); if (!parser_hasval(p, "flags")) return PARSE_ERROR_MISSING_FIELD; s = string_make(parser_getstr(p, "flags")); t = strtok(s, " |"); while (t) { if (grab_flag(a->flags, OF_SIZE, k_info_flags, t) || grab_flag(a->pval_flags[a->num_pvals], OF_SIZE, k_info_flags, t)) break; t = strtok(NULL, " |"); } a->num_pvals++; if (a->num_pvals > MAX_PVALS) return PARSE_ERROR_TOO_MANY_ENTRIES; mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static enum parser_error parse_a_d(struct parser *p) { struct artifact *a = parser_priv(p); assert(a); a->text = string_append(a->text, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } struct parser *init_parse_a(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N int index str name", parse_a_n); parser_reg(p, "I sym tval sym sval", parse_a_i); parser_reg(p, "W int level int rarity int weight int cost", parse_a_w); parser_reg(p, "A int common str minmax", parse_a_a); parser_reg(p, "P int ac rand hd int to-h int to-d int to-a", parse_a_p); parser_reg(p, "F ?str flags", parse_a_f); parser_reg(p, "E sym name rand time", parse_a_e); parser_reg(p, "M str text", parse_a_m); parser_reg(p, "L int pval str flags", parse_a_l); parser_reg(p, "D str text", parse_a_d); return p; } static errr run_parse_a(struct parser *p) { return parse_file(p, "artifact"); } static errr finish_parse_a(struct parser *p) { struct artifact *a, *n; /* scan the list for the max id */ z_info->a_max = 0; a = parser_priv(p); while (a) { if (a->aidx > z_info->a_max) z_info->a_max = a->aidx; a = a->next; } /* allocate the direct access list and copy the data to it */ a_info = mem_zalloc((z_info->a_max+1) * sizeof(*a)); for (a = parser_priv(p); a; a = n) { memcpy(&a_info[a->aidx], a, sizeof(*a)); n = a->next; if (n) a_info[a->aidx].next = &a_info[n->aidx]; else a_info[a->aidx].next = NULL; mem_free(a); } z_info->a_max += 1; parser_destroy(p); return 0; } static void cleanup_a(void) { int idx; for (idx = 0; idx < z_info->a_max; idx++) { string_free(a_info[idx].name); mem_free(a_info[idx].effect_msg); mem_free(a_info[idx].text); } mem_free(a_info); } static struct file_parser a_parser = { "artifact", init_parse_a, run_parse_a, finish_parse_a, cleanup_a }; /* Parsing functions for names.txt (random name fragments) */ struct name { struct name *next; char *str; }; struct names_parse { unsigned int section; unsigned int nnames[RANDNAME_NUM_TYPES]; struct name *names[RANDNAME_NUM_TYPES]; }; static enum parser_error parse_names_n(struct parser *p) { unsigned int section = parser_getint(p, "section"); struct names_parse *s = parser_priv(p); if (s->section >= RANDNAME_NUM_TYPES) return PARSE_ERROR_GENERIC; s->section = section; return PARSE_ERROR_NONE; } static enum parser_error parse_names_d(struct parser *p) { const char *name = parser_getstr(p, "name"); struct names_parse *s = parser_priv(p); struct name *ns = mem_zalloc(sizeof *ns); s->nnames[s->section]++; ns->next = s->names[s->section]; ns->str = string_make(name); s->names[s->section] = ns; return PARSE_ERROR_NONE; } struct parser *init_parse_names(void) { struct parser *p = parser_new(); struct names_parse *n = mem_zalloc(sizeof *n); n->section = 0; parser_setpriv(p, n); parser_reg(p, "N int section", parse_names_n); parser_reg(p, "D str name", parse_names_d); return p; } static errr run_parse_names(struct parser *p) { return parse_file(p, "names"); } static errr finish_parse_names(struct parser *p) { int i; unsigned int j; struct names_parse *n = parser_priv(p); struct name *nm; name_sections = mem_zalloc(sizeof(char**) * RANDNAME_NUM_TYPES); for (i = 0; i < RANDNAME_NUM_TYPES; i++) { name_sections[i] = mem_alloc(sizeof(char*) * (n->nnames[i] + 1)); for (nm = n->names[i], j = 0; nm && j < n->nnames[i]; nm = nm->next, j++) { name_sections[i][j] = nm->str; } name_sections[i][n->nnames[i]] = NULL; while (n->names[i]) { nm = n->names[i]->next; mem_free(n->names[i]); n->names[i] = nm; } } mem_free(n); parser_destroy(p); return 0; } static void cleanup_names(void) { int i, j; for (i = 0; i < RANDNAME_NUM_TYPES; i++) { for (j = 0; name_sections[i][j]; j++) { string_free((char *)name_sections[i][j]); } mem_free(name_sections[i]); } mem_free(name_sections); } static struct file_parser names_parser = { "names", init_parse_names, run_parse_names, finish_parse_names, cleanup_names }; /* Parsing functions for terrain.txt */ static enum parser_error parse_f_n(struct parser *p) { int idx = parser_getuint(p, "index"); const char *name = parser_getstr(p, "name"); struct feature *h = parser_priv(p); struct feature *f = mem_zalloc(sizeof *f); f->next = h; f->fidx = idx; f->mimic = idx; f->name = string_make(name); parser_setpriv(p, f); return PARSE_ERROR_NONE; } static enum parser_error parse_f_g(struct parser *p) { wchar_t glyph = parser_getchar(p, "glyph"); const char *color = parser_getsym(p, "color"); int attr = 0; struct feature *f = parser_priv(p); if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; f->d_char = glyph; if (strlen(color) > 1) attr = color_text_to_attr(color); else attr = color_char_to_attr(color[0]); if (attr < 0) return PARSE_ERROR_INVALID_COLOR; f->d_attr = attr; return PARSE_ERROR_NONE; } static enum parser_error parse_f_m(struct parser *p) { unsigned int idx = parser_getuint(p, "index"); struct feature *f = parser_priv(p); if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; f->mimic = idx; return PARSE_ERROR_NONE; } static enum parser_error parse_f_p(struct parser *p) { unsigned int priority = parser_getuint(p, "priority"); struct feature *f = parser_priv(p); if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; f->priority = priority; return PARSE_ERROR_NONE; } static const char *f_info_flags[] = { "NONE", "PWALK", "PPASS", "MWALK", "MPASS", "LOOK", "DIG", "DOOR", "EXIT_UP", "EXIT_DOWN", "PERM", "TRAP", "SHOP", "HIDDEN", "BORING", NULL }; static enum parser_error parse_f_f(struct parser *p) { char *flags; struct feature *f = parser_priv(p); char *s; if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "flags")); s = strtok(flags, " |"); while (s) { if (grab_flag(f->flags, FF_SIZE, f_info_flags, s)) { mem_free(flags); quit_fmt("bad f-flag: %s", s); return PARSE_ERROR_INVALID_FLAG; } s = strtok(NULL, " |"); } mem_free(flags); return PARSE_ERROR_NONE; } static enum parser_error parse_f_x(struct parser *p) { struct feature *f = parser_priv(p); if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; f->locked = parser_getint(p, "locked"); f->shopnum = parser_getint(p, "shopnum"); f->dig = parser_getint(p, "dig"); return PARSE_ERROR_NONE; } static enum parser_error parse_f_e(struct parser *p) { struct feature *f = parser_priv(p); if (!f) return PARSE_ERROR_MISSING_RECORD_HEADER; f->effect = grab_one_effect(parser_getstr(p, "effect")); if (!f->effect) return PARSE_ERROR_INVALID_EFFECT; return PARSE_ERROR_NONE; } struct parser *init_parse_f(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N uint index str name", parse_f_n); parser_reg(p, "G char glyph sym color", parse_f_g); parser_reg(p, "M uint index", parse_f_m); parser_reg(p, "P uint priority", parse_f_p); parser_reg(p, "F ?str flags", parse_f_f); parser_reg(p, "X int locked int unused int shopnum int dig", parse_f_x); parser_reg(p, "E str effect", parse_f_e); return p; } static errr run_parse_f(struct parser *p) { return parse_file(p, "terrain"); } static errr finish_parse_f(struct parser *p) { struct feature *f, *n; /* scan the list for the max id */ z_info->f_max = 0; f = parser_priv(p); while (f) { if (f->fidx > z_info->f_max) z_info->f_max = f->fidx; f = f->next; } /* allocate the direct access list and copy the data to it */ f_info = mem_zalloc((z_info->f_max+1) * sizeof(*f)); for (f = parser_priv(p); f; f = n) { memcpy(&f_info[f->fidx], f, sizeof(*f)); n = f->next; if (n) f_info[f->fidx].next = &f_info[n->fidx]; else f_info[f->fidx].next = NULL; mem_free(f); } z_info->f_max += 1; parser_destroy(p); return 0; } static void cleanup_f(void) { int idx; for (idx = 0; idx < z_info->f_max; idx++) { string_free(f_info[idx].name); } mem_free(f_info); } static struct file_parser f_parser = { "terrain", init_parse_f, run_parse_f, finish_parse_f, cleanup_f }; /* Parsing functions for ego-item.txt */ static enum parser_error parse_e_n(struct parser *p) { int idx = parser_getint(p, "index"); const char *name = parser_getstr(p, "name"); struct ego_item *h = parser_priv(p); struct ego_item *e = mem_zalloc(sizeof *e); e->next = h; parser_setpriv(p, e); e->eidx = idx; e->name = string_make(name); return PARSE_ERROR_NONE; } static enum parser_error parse_e_w(struct parser *p) { int level = parser_getint(p, "level"); int rarity = parser_getint(p, "rarity"); int cost = parser_getint(p, "cost"); struct ego_item *e = parser_priv(p); if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; e->level = level; e->rarity = rarity; e->cost = cost; return PARSE_ERROR_NONE; } static enum parser_error parse_e_x(struct parser *p) { int rating = parser_getint(p, "rating"); int xtra = parser_getint(p, "xtra"); struct ego_item *e = parser_priv(p); if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; e->rating = rating; e->xtra = xtra; return PARSE_ERROR_NONE; } static enum parser_error parse_e_a(struct parser *p) { struct ego_item *e = parser_priv(p); const char *tmp = parser_getstr(p, "minmax"); int amin, amax; e->alloc_prob = parser_getint(p, "common"); if (sscanf(tmp, "%d to %d", &amin, &amax) != 2) return PARSE_ERROR_GENERIC; if (amin > 255 || amax > 255 || amin < 0 || amax < 0) return PARSE_ERROR_OUT_OF_BOUNDS; e->alloc_min = amin; e->alloc_max = amax; return PARSE_ERROR_NONE; } static enum parser_error parse_e_t(struct parser *p) { int i; int tval; int min_sval, max_sval; struct ego_item *e = parser_priv(p); if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; tval = tval_find_idx(parser_getsym(p, "tval")); if (tval < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; min_sval = parser_getint(p, "min-sval"); max_sval = parser_getint(p, "max-sval"); for (i = 0; i < EGO_TVALS_MAX; i++) { if (!e->tval[i]) { e->tval[i] = tval; e->min_sval[i] = min_sval; e->max_sval[i] = max_sval; break; } } if (i == EGO_TVALS_MAX) return PARSE_ERROR_GENERIC; return PARSE_ERROR_NONE; } static enum parser_error parse_e_c(struct parser *p) { struct random th = parser_getrand(p, "th"); struct random td = parser_getrand(p, "td"); struct random ta = parser_getrand(p, "ta"); struct ego_item *e = parser_priv(p); if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; e->to_h = th; e->to_d = td; e->to_a = ta; return PARSE_ERROR_NONE; } static enum parser_error parse_e_m(struct parser *p) { int th = parser_getint(p, "th"); int td = parser_getint(p, "td"); int ta = parser_getint(p, "ta"); struct ego_item *e = parser_priv(p); if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; e->min_to_h = th; e->min_to_d = td; e->min_to_a = ta; return PARSE_ERROR_NONE; } static enum parser_error parse_e_f(struct parser *p) { struct ego_item *e = parser_priv(p); char *s; char *t; if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; s = string_make(parser_getstr(p, "flags")); t = strtok(s, " |"); while (t) { if (grab_flag(e->flags, OF_SIZE, k_info_flags,t)) break; t = strtok(NULL, " |"); } mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static enum parser_error parse_e_l(struct parser *p) { struct ego_item *e = parser_priv(p); char *s; char *t; if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_MISSING_FIELD; e->pval[e->num_pvals] = parser_getrand(p, "pval"); e->min_pval[e->num_pvals] = parser_getint(p, "min"); s = string_make(parser_getstr(p, "flags")); t = strtok(s, " |"); while (t) { if (grab_flag(e->flags, OF_SIZE, k_info_flags, t) || grab_flag(e->pval_flags[e->num_pvals], OF_SIZE, k_info_flags, t)) break; t = strtok(NULL, " |"); } e->num_pvals++; if (e->num_pvals > MAX_PVALS) return PARSE_ERROR_TOO_MANY_ENTRIES; mem_free(s); return t ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static enum parser_error parse_e_d(struct parser *p) { struct ego_item *e = parser_priv(p); if (!e) return PARSE_ERROR_MISSING_RECORD_HEADER; e->text = string_append(e->text, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } struct parser *init_parse_e(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N int index str name", parse_e_n); parser_reg(p, "W int level int rarity int pad int cost", parse_e_w); parser_reg(p, "X int rating int xtra", parse_e_x); parser_reg(p, "A int common str minmax", parse_e_a); parser_reg(p, "T sym tval int min-sval int max-sval", parse_e_t); parser_reg(p, "C rand th rand td rand ta", parse_e_c); parser_reg(p, "M int th int td int ta", parse_e_m); parser_reg(p, "F ?str flags", parse_e_f); parser_reg(p, "L rand pval int min str flags", parse_e_l); parser_reg(p, "D str text", parse_e_d); return p; } static errr run_parse_e(struct parser *p) { return parse_file(p, "ego_item"); } static errr finish_parse_e(struct parser *p) { struct ego_item *e, *n; /* scan the list for the max id */ z_info->e_max = 0; e = parser_priv(p); while (e) { if (e->eidx > z_info->e_max) z_info->e_max = e->eidx; e = e->next; } /* allocate the direct access list and copy the data to it */ e_info = mem_zalloc((z_info->e_max+1) * sizeof(*e)); for (e = parser_priv(p); e; e = n) { memcpy(&e_info[e->eidx], e, sizeof(*e)); n = e->next; if (n) e_info[e->eidx].next = &e_info[n->eidx]; else e_info[e->eidx].next = NULL; mem_free(e); } z_info->e_max += 1; create_slay_cache(e_info); parser_destroy(p); return 0; } static void cleanup_e(void) { int idx; for (idx = 0; idx < z_info->e_max; idx++) { string_free(e_info[idx].name); mem_free(e_info[idx].text); } mem_free(e_info); free_slay_cache(); } static struct file_parser e_parser = { "ego_item", init_parse_e, run_parse_e, finish_parse_e, cleanup_e }; /* Parsing functions for prace.txt */ static enum parser_error parse_p_n(struct parser *p) { struct player_race *h = parser_priv(p); struct player_race *r = mem_zalloc(sizeof *r); r->next = h; r->ridx = parser_getuint(p, "index"); r->name = string_make(parser_getstr(p, "name")); parser_setpriv(p, r); return PARSE_ERROR_NONE; } static enum parser_error parse_p_s(struct parser *p) { struct player_race *r = parser_priv(p); if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; r->r_adj[A_STR] = parser_getint(p, "str"); r->r_adj[A_DEX] = parser_getint(p, "dex"); r->r_adj[A_CON] = parser_getint(p, "con"); r->r_adj[A_INT] = parser_getint(p, "int"); r->r_adj[A_WIS] = parser_getint(p, "wis"); return PARSE_ERROR_NONE; } static enum parser_error parse_p_r(struct parser *p) { struct player_race *r = parser_priv(p); if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; r->r_skills[SKILL_DISARM] = parser_getint(p, "dis"); r->r_skills[SKILL_DEVICE] = parser_getint(p, "dev"); r->r_skills[SKILL_SAVE] = parser_getint(p, "sav"); r->r_skills[SKILL_STEALTH] = parser_getint(p, "stl"); r->r_skills[SKILL_SEARCH] = parser_getint(p, "srh"); r->r_skills[SKILL_SEARCH_FREQUENCY] = parser_getint(p, "fos"); r->r_skills[SKILL_TO_HIT_MELEE] = parser_getint(p, "thm"); r->r_skills[SKILL_TO_HIT_BOW] = parser_getint(p, "thb"); r->r_skills[SKILL_TO_HIT_THROW] = parser_getint(p, "throw"); r->r_skills[SKILL_DIGGING] = parser_getint(p, "dig"); return PARSE_ERROR_NONE; } static enum parser_error parse_p_x(struct parser *p) { struct player_race *r = parser_priv(p); if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; r->r_mhp = parser_getint(p, "mhp"); r->r_exp = parser_getint(p, "exp"); r->infra = parser_getint(p, "infra"); return PARSE_ERROR_NONE; } static enum parser_error parse_p_i(struct parser *p) { struct player_race *r = parser_priv(p); if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; r->history = findchart(histories, parser_getuint(p, "hist")); r->b_age = parser_getint(p, "b-age"); r->m_age = parser_getint(p, "m-age"); return PARSE_ERROR_NONE; } static enum parser_error parse_p_h(struct parser *p) { struct player_race *r = parser_priv(p); if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; r->m_b_ht = parser_getint(p, "mbht"); r->m_m_ht = parser_getint(p, "mmht"); r->f_b_ht = parser_getint(p, "fbht"); r->f_m_ht = parser_getint(p, "fmht"); return PARSE_ERROR_NONE; } static enum parser_error parse_p_w(struct parser *p) { struct player_race *r = parser_priv(p); if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; r->m_b_wt = parser_getint(p, "mbwt"); r->m_m_wt = parser_getint(p, "mmwt"); r->f_b_wt = parser_getint(p, "fbwt"); r->f_m_wt = parser_getint(p, "fmwt"); return PARSE_ERROR_NONE; } static enum parser_error parse_p_f(struct parser *p) { struct player_race *r = parser_priv(p); char *flags; char *s; if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "flags")); s = strtok(flags, " |"); while (s) { if (grab_flag(r->flags, OF_SIZE, k_info_flags, s)) break; s = strtok(NULL, " |"); } mem_free(flags); return s ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static const char *player_info_flags[] = { #define PF(a, b) #a, #include "list-player-flags.h" #undef PF NULL }; static enum parser_error parse_p_y(struct parser *p) { struct player_race *r = parser_priv(p); char *flags; char *s; if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "flags")); s = strtok(flags, " |"); while (s) { if (grab_flag(r->pflags, PF_SIZE, player_info_flags, s)) break; s = strtok(NULL, " |"); } mem_free(flags); return s ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } static enum parser_error parse_p_c(struct parser *p) { struct player_race *r = parser_priv(p); char *classstr; char *s; if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "classes")) return PARSE_ERROR_NONE; classstr = string_make(parser_getstr(p, "classes")); s = strtok(classstr, " |"); while (s) { r->choice |= 1 << atoi(s); s = strtok(NULL, " |"); } mem_free(classstr); return PARSE_ERROR_NONE; } struct parser *init_parse_p(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N uint index str name", parse_p_n); parser_reg(p, "S int str int int int wis int dex int con", parse_p_s); parser_reg(p, "R int dis int dev int sav int stl int srh int fos int thm int thb int throw int dig", parse_p_r); parser_reg(p, "X int mhp int exp int infra", parse_p_x); parser_reg(p, "I uint hist int b-age int m-age", parse_p_i); parser_reg(p, "H int mbht int mmht int fbht int fmht", parse_p_h); parser_reg(p, "W int mbwt int mmwt int fbwt int fmwt", parse_p_w); parser_reg(p, "F ?str flags", parse_p_f); parser_reg(p, "Y ?str flags", parse_p_y); parser_reg(p, "C ?str classes", parse_p_c); return p; } static errr run_parse_p(struct parser *p) { return parse_file(p, "p_race"); } static errr finish_parse_p(struct parser *p) { races = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_p(void) { struct player_race *p = races; struct player_race *next; while (p) { next = p->next; string_free((char *)p->name); mem_free(p); p = next; } } static struct file_parser p_parser = { "p_race", init_parse_p, run_parse_p, finish_parse_p, cleanup_p }; /* Parsing functions for pclass.txt */ static enum parser_error parse_c_n(struct parser *p) { struct player_class *h = parser_priv(p); struct player_class *c = mem_zalloc(sizeof *c); c->cidx = parser_getuint(p, "index"); c->name = string_make(parser_getstr(p, "name")); c->next = h; parser_setpriv(p, c); return PARSE_ERROR_NONE; } static enum parser_error parse_c_s(struct parser *p) { struct player_class *c = parser_priv(p); if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; c->c_adj[A_STR] = parser_getint(p, "str"); c->c_adj[A_INT] = parser_getint(p, "int"); c->c_adj[A_WIS] = parser_getint(p, "wis"); c->c_adj[A_DEX] = parser_getint(p, "dex"); c->c_adj[A_CON] = parser_getint(p, "con"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_c(struct parser *p) { struct player_class *c = parser_priv(p); if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; c->c_skills[SKILL_DISARM] = parser_getint(p, "dis"); c->c_skills[SKILL_DEVICE] = parser_getint(p, "dev"); c->c_skills[SKILL_SAVE] = parser_getint(p, "sav"); c->c_skills[SKILL_STEALTH] = parser_getint(p, "stl"); c->c_skills[SKILL_SEARCH] = parser_getint(p, "srh"); c->c_skills[SKILL_SEARCH_FREQUENCY] = parser_getint(p, "fos"); c->c_skills[SKILL_TO_HIT_MELEE] = parser_getint(p, "thm"); c->c_skills[SKILL_TO_HIT_BOW] = parser_getint(p, "thb"); c->c_skills[SKILL_TO_HIT_THROW] = parser_getint(p, "throw"); c->c_skills[SKILL_DIGGING] = parser_getint(p, "dig"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_x(struct parser *p) { struct player_class *c = parser_priv(p); if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; c->x_skills[SKILL_DISARM] = parser_getint(p, "dis"); c->x_skills[SKILL_DEVICE] = parser_getint(p, "dev"); c->x_skills[SKILL_SAVE] = parser_getint(p, "sav"); c->x_skills[SKILL_STEALTH] = parser_getint(p, "stl"); c->x_skills[SKILL_SEARCH] = parser_getint(p, "srh"); c->x_skills[SKILL_SEARCH_FREQUENCY] = parser_getint(p, "fos"); c->x_skills[SKILL_TO_HIT_MELEE] = parser_getint(p, "thm"); c->x_skills[SKILL_TO_HIT_BOW] = parser_getint(p, "thb"); c->x_skills[SKILL_TO_HIT_THROW] = parser_getint(p, "throw"); c->x_skills[SKILL_DIGGING] = parser_getint(p, "dig"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_i(struct parser *p) { struct player_class *c = parser_priv(p); if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; c->c_mhp = parser_getint(p, "mhp"); c->c_exp = parser_getint(p, "exp"); c->sense_base = parser_getint(p, "sense-base"); c->sense_div = parser_getint(p, "sense-div"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_a(struct parser *p) { struct player_class *c = parser_priv(p); if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; c->max_attacks = parser_getint(p, "max-attacks"); c->min_weight = parser_getint(p, "min-weight"); c->att_multiply = parser_getint(p, "att-multiply"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_m(struct parser *p) { struct player_class *c = parser_priv(p); if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; c->spell_book = parser_getuint(p, "book"); c->spell_stat = parser_getuint(p, "stat"); c->spell_first = parser_getuint(p, "first"); c->spell_weight = parser_getuint(p, "weight"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_b(struct parser *p) { struct player_class *c = parser_priv(p); unsigned int spell; if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; spell = parser_getuint(p, "spell"); if (spell >= PY_MAX_SPELLS) return PARSE_ERROR_OUT_OF_BOUNDS; c->spells.info[spell].slevel = parser_getint(p, "level"); c->spells.info[spell].smana = parser_getint(p, "mana"); c->spells.info[spell].sfail = parser_getint(p, "fail"); c->spells.info[spell].sexp = parser_getint(p, "exp"); return PARSE_ERROR_NONE; } static enum parser_error parse_c_t(struct parser *p) { struct player_class *c = parser_priv(p); int i; if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; for (i = 0; i < PY_MAX_LEVEL / 5; i++) { if (!c->title[i]) { c->title[i] = string_make(parser_getstr(p, "title")); break; } } if (i >= PY_MAX_LEVEL / 5) return PARSE_ERROR_TOO_MANY_ENTRIES; return PARSE_ERROR_NONE; } static enum parser_error parse_c_e(struct parser *p) { struct player_class *c = parser_priv(p); struct start_item *si; int tval, sval; if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; tval = tval_find_idx(parser_getsym(p, "tval")); if (tval < 0) return PARSE_ERROR_UNRECOGNISED_TVAL; sval = lookup_sval(tval, parser_getsym(p, "sval")); if (sval < 0) return PARSE_ERROR_UNRECOGNISED_SVAL; si = mem_zalloc(sizeof *si); si->kind = objkind_get(tval, sval); si->min = parser_getuint(p, "min"); si->max = parser_getuint(p, "max"); if (si->min > 99 || si->max > 99) { mem_free(si->kind); return PARSE_ERROR_INVALID_ITEM_NUMBER; } si->next = c->start_items; c->start_items = si; return PARSE_ERROR_NONE; } static enum parser_error parse_c_f(struct parser *p) { struct player_class *c = parser_priv(p); char *flags; char *s; if (!c) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "flags")); s = strtok(flags, " |"); while (s) { if (grab_flag(c->pflags, PF_SIZE, player_info_flags, s)) break; s = strtok(NULL, " |"); } mem_free(flags); return s ? PARSE_ERROR_INVALID_FLAG : PARSE_ERROR_NONE; } struct parser *init_parse_c(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N uint index str name", parse_c_n); parser_reg(p, "S int str int int int wis int dex int con", parse_c_s); parser_reg(p, "C int dis int dev int sav int stl int srh int fos int thm int thb int throw int dig", parse_c_c); parser_reg(p, "X int dis int dev int sav int stl int srh int fos int thm int thb int throw int dig", parse_c_x); parser_reg(p, "I int mhp int exp int sense-base int sense-div", parse_c_i); parser_reg(p, "A int max-attacks int min-weight int att-multiply", parse_c_a); parser_reg(p, "M uint book uint stat uint first uint weight", parse_c_m); parser_reg(p, "B uint spell int level int mana int fail int exp", parse_c_b); parser_reg(p, "T str title", parse_c_t); parser_reg(p, "E sym tval sym sval uint min uint max", parse_c_e); parser_reg(p, "F ?str flags", parse_c_f); return p; } static errr run_parse_c(struct parser *p) { return parse_file(p, "p_class"); } static errr finish_parse_c(struct parser *p) { classes = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_c(void) { struct player_class *c = classes; struct player_class *next; struct start_item *item, *item_next; int i; while (c) { next = c->next; item = c->start_items; while(item) { item_next = item->next; mem_free(item); item = item_next; } for (i = 0; i < PY_MAX_LEVEL / 5; i++) { string_free((char *)c->title[i]); } mem_free((char *)c->name); mem_free(c); c = next; } } static struct file_parser c_parser = { "p_class", init_parse_c, run_parse_c, finish_parse_c, cleanup_c }; /* Parsing functions for vault.txt */ static enum parser_error parse_v_n(struct parser *p) { struct vault *h = parser_priv(p); struct vault *v = mem_zalloc(sizeof *v); v->vidx = parser_getuint(p, "index"); v->name = string_make(parser_getstr(p, "name")); v->next = h; parser_setpriv(p, v); return PARSE_ERROR_NONE; } static enum parser_error parse_v_x(struct parser *p) { struct vault *v = parser_priv(p); if (!v) return PARSE_ERROR_MISSING_RECORD_HEADER; v->typ = parser_getuint(p, "type"); v->rat = parser_getint(p, "rating"); v->hgt = parser_getuint(p, "height"); v->wid = parser_getuint(p, "width"); /* XXX: huh? These checks were in the original code and I have no idea * why. */ if (v->typ == 6 && (v->wid > 33 || v->hgt > 22)) return PARSE_ERROR_VAULT_TOO_BIG; if (v->typ == 7 && (v->wid > 66 || v->hgt > 44)) return PARSE_ERROR_VAULT_TOO_BIG; return PARSE_ERROR_NONE; } static enum parser_error parse_v_d(struct parser *p) { struct vault *v = parser_priv(p); if (!v) return PARSE_ERROR_MISSING_RECORD_HEADER; v->text = string_append(v->text, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } struct parser *init_parse_v(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N uint index str name", parse_v_n); parser_reg(p, "X uint type int rating uint height uint width", parse_v_x); parser_reg(p, "D str text", parse_v_d); return p; } static errr run_parse_v(struct parser *p) { return parse_file(p, "vault"); } static errr finish_parse_v(struct parser *p) { vaults = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_v(void) { struct vault *v, *next; for (v = vaults; v; v = next) { next = v->next; mem_free(v->name); mem_free(v->text); mem_free(v); } } static struct file_parser v_parser = { "vault", init_parse_v, run_parse_v, finish_parse_v, cleanup_v }; /* Parsing functions for p_hist.txt */ static enum parser_error parse_h_n(struct parser *p) { struct history_chart *oc = parser_priv(p); struct history_chart *c; struct history_entry *e = mem_zalloc(sizeof *e); unsigned int idx = parser_getuint(p, "chart"); if (!(c = findchart(oc, idx))) { c = mem_zalloc(sizeof *c); c->next = oc; c->idx = idx; parser_setpriv(p, c); } e->isucc = parser_getint(p, "next"); e->roll = parser_getint(p, "roll"); e->next = c->entries; c->entries = e; return PARSE_ERROR_NONE; } static enum parser_error parse_h_d(struct parser *p) { struct history_chart *h = parser_priv(p); if (!h) return PARSE_ERROR_MISSING_RECORD_HEADER; assert(h->entries); h->entries->text = string_append(h->entries->text, parser_getstr(p, "text")); return PARSE_ERROR_NONE; } struct parser *init_parse_h(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N uint chart int next int roll", parse_h_n); parser_reg(p, "D str text", parse_h_d); return p; } static errr run_parse_h(struct parser *p) { return parse_file(p, "p_hist"); } static errr finish_parse_h(struct parser *p) { struct history_chart *c; struct history_entry *e, *prev, *next; histories = parser_priv(p); /* Go fix up the entry successor pointers. We can't compute them at * load-time since we may not have seen the successor history yet. Also, * we need to put the entries in the right order; the parser actually * stores them backwards, which is not desirable. */ for (c = histories; c; c = c->next) { e = c->entries; prev = NULL; while (e) { next = e->next; e->next = prev; prev = e; e = next; } c->entries = prev; for (e = c->entries; e; e = e->next) { if (!e->isucc) continue; e->succ = findchart(histories, e->isucc); if (!e->succ) { return -1; } } } parser_destroy(p); return 0; } static void cleanup_h(void) { struct history_chart *c, *next_c; struct history_entry *e, *next_e; c = histories; while (c) { next_c = c->next; e = c->entries; while (e) { next_e = e->next; mem_free(e->text); mem_free(e); e = next_e; } mem_free(c); c = next_c; } } static struct file_parser h_parser = { "p_hist", init_parse_h, run_parse_h, finish_parse_h, cleanup_h }; /* Parsing functions for flavor.txt */ static wchar_t flavor_glyph; static unsigned int flavor_tval; static enum parser_error parse_flavor_flavor(struct parser *p) { struct flavor *h = parser_priv(p); struct flavor *f = mem_zalloc(sizeof *f); const char *attr; int d_attr; f->next = h; f->fidx = parser_getuint(p, "index"); f->tval = flavor_tval; f->d_char = flavor_glyph; if (parser_hasval(p, "sval")) f->sval = lookup_sval(f->tval, parser_getsym(p, "sval")); else f->sval = SV_UNKNOWN; attr = parser_getsym(p, "attr"); if (strlen(attr) == 1) d_attr = color_char_to_attr(attr[0]); else d_attr = color_text_to_attr(attr); if (d_attr < 0) return PARSE_ERROR_GENERIC; f->d_attr = d_attr; if (parser_hasval(p, "desc")) f->text = string_append(f->text, parser_getstr(p, "desc")); parser_setpriv(p, f); return PARSE_ERROR_NONE; } static enum parser_error parse_flavor_kind(struct parser *p) { flavor_glyph = parser_getchar(p, "glyph"); flavor_tval = tval_find_idx(parser_getsym(p, "tval")); if (!flavor_tval) return PARSE_ERROR_GENERIC; return PARSE_ERROR_NONE; } struct parser *init_parse_flavor(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "kind sym tval char glyph", parse_flavor_kind); parser_reg(p, "flavor uint index sym attr ?str desc", parse_flavor_flavor); parser_reg(p, "fixed uint index sym sval sym attr ?str desc", parse_flavor_flavor); return p; } static errr run_parse_flavor(struct parser *p) { return parse_file(p, "flavor"); } static errr finish_parse_flavor(struct parser *p) { flavors = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_flavor(void) { struct flavor *f, *next; f = flavors; while(f) { next = f->next; /* Hack - scrolls get randomly-generated names */ if (f->tval != TV_SCROLL) mem_free(f->text); mem_free(f); f = next; } } static struct file_parser flavor_parser = { "flavor", init_parse_flavor, run_parse_flavor, finish_parse_flavor, cleanup_flavor }; /* Parsing functions for spell.txt */ static enum parser_error parse_s_n(struct parser *p) { struct spell *s = mem_zalloc(sizeof *s); s->next = parser_priv(p); s->sidx = parser_getuint(p, "index"); s->name = string_make(parser_getstr(p, "name")); parser_setpriv(p, s); return PARSE_ERROR_NONE; } static enum parser_error parse_s_i(struct parser *p) { struct spell *s = parser_priv(p); if (!s) return PARSE_ERROR_MISSING_RECORD_HEADER; s->tval = parser_getuint(p, "tval"); s->sval = parser_getuint(p, "sval"); s->snum = parser_getuint(p, "snum"); /* XXX elly: postprocess instead? */ s->realm = s->tval - TV_MAGIC_BOOK; s->spell_index = s->sidx - (s->realm * PY_MAX_SPELLS); return PARSE_ERROR_NONE; } static enum parser_error parse_s_d(struct parser *p) { struct spell *s = parser_priv(p); if (!s) return PARSE_ERROR_MISSING_RECORD_HEADER; s->text = string_append(s->text, parser_getstr(p, "desc")); return PARSE_ERROR_NONE; } struct parser *init_parse_s(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N uint index str name", parse_s_n); parser_reg(p, "I uint tval uint sval uint snum", parse_s_i); parser_reg(p, "D str desc", parse_s_d); return p; } static errr run_parse_s(struct parser *p) { return parse_file(p, "spell"); } static errr finish_parse_s(struct parser *p) { struct spell *s, *n, *ss; struct object_kind *k; /* scan the list for the max id */ z_info->s_max = 0; s = parser_priv(p); while (s) { if (s->sidx > z_info->s_max) z_info->s_max = s->sidx; s = s->next; } /* allocate the direct access list and copy the data to it */ s_info = mem_zalloc((z_info->s_max+1) * sizeof(*s)); for (s = parser_priv(p); s; s = n) { n = s->next; ss = &s_info[s->sidx]; memcpy(ss, s, sizeof(*s)); k = objkind_get(s->tval, s->sval); if (k) { ss->next = k->spells; k->spells = ss; } else { ss->next = NULL; } mem_free(s); } z_info->s_max += 1; parser_destroy(p); return 0; } static void cleanup_s(void) { int idx; for (idx = 0; idx < z_info->s_max; idx++) { string_free(s_info[idx].name); mem_free(s_info[idx].text); } mem_free(s_info); } static struct file_parser s_parser = { "spell", init_parse_s, run_parse_s, finish_parse_s, cleanup_s }; /* Initialise hints */ static enum parser_error parse_hint(struct parser *p) { struct hint *h = parser_priv(p); struct hint *new = mem_zalloc(sizeof *new); new->hint = string_make(parser_getstr(p, "text")); new->next = h; parser_setpriv(p, new); return PARSE_ERROR_NONE; } struct parser *init_parse_hints(void) { struct parser *p = parser_new(); parser_reg(p, "H str text", parse_hint); return p; } static errr run_parse_hints(struct parser *p) { return parse_file(p, "hints"); } static errr finish_parse_hints(struct parser *p) { hints = parser_priv(p); parser_destroy(p); return 0; } static void cleanup_hints(void) { struct hint *h, *next; h = hints; while(h) { next = h->next; string_free(h->hint); mem_free(h); h = next; } } static struct file_parser hints_parser = { "hints", init_parse_hints, run_parse_hints, finish_parse_hints, cleanup_hints }; /* Initialise monster pain messages */ static enum parser_error parse_mp_n(struct parser *p) { struct monster_pain *h = parser_priv(p); struct monster_pain *mp = mem_zalloc(sizeof *mp); mp->next = h; mp->pain_idx = parser_getuint(p, "index"); parser_setpriv(p, mp); return PARSE_ERROR_NONE; } static enum parser_error parse_mp_m(struct parser *p) { struct monster_pain *mp = parser_priv(p); int i; if (!mp) return PARSE_ERROR_MISSING_RECORD_HEADER; for (i = 0; i < 7; i++) if (!mp->messages[i]) break; if (i == 7) return PARSE_ERROR_TOO_MANY_ENTRIES; mp->messages[i] = string_make(parser_getstr(p, "message")); return PARSE_ERROR_NONE; } struct parser *init_parse_mp(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N uint index", parse_mp_n); parser_reg(p, "M str message", parse_mp_m); return p; } static errr run_parse_mp(struct parser *p) { return parse_file(p, "pain"); } static errr finish_parse_mp(struct parser *p) { struct monster_pain *mp, *n; /* scan the list for the max id */ z_info->mp_max = 0; mp = parser_priv(p); while (mp) { if (mp->pain_idx > z_info->mp_max) z_info->mp_max = mp->pain_idx; mp = mp->next; } /* allocate the direct access list and copy the data to it */ pain_messages = mem_zalloc((z_info->mp_max+1) * sizeof(*mp)); for (mp = parser_priv(p); mp; mp = n) { memcpy(&pain_messages[mp->pain_idx], mp, sizeof(*mp)); n = mp->next; if (n) pain_messages[mp->pain_idx].next = &pain_messages[n->pain_idx]; else pain_messages[mp->pain_idx].next = NULL; mem_free(mp); } z_info->mp_max += 1; parser_destroy(p); return 0; } static void cleanup_mp(void) { int idx, i; for (idx = 0; idx < z_info->mp_max; idx++) { for (i = 0; i < 7; i++) { string_free((char *)pain_messages[idx].messages[i]); } } mem_free(pain_messages); } static struct file_parser mp_parser = { "pain messages", init_parse_mp, run_parse_mp, finish_parse_mp, cleanup_mp }; /* * Initialize monster pits */ static enum parser_error parse_pit_n(struct parser *p) { struct pit_profile *h = parser_priv(p); struct pit_profile *pit = mem_zalloc(sizeof *pit); pit->next = h; pit->pit_idx = parser_getuint(p, "index"); pit->name = string_make(parser_getstr(p, "name")); pit->colors = NULL; pit->forbidden_monsters = NULL; parser_setpriv(p, pit); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_r(struct parser *p) { struct pit_profile *pit = parser_priv(p); if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; pit->room_type = parser_getuint(p, "type"); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_a(struct parser *p) { struct pit_profile *pit = parser_priv(p); if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; pit->rarity = parser_getuint(p, "rarity"); pit->ave = parser_getuint(p, "level"); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_o(struct parser *p) { struct pit_profile *pit = parser_priv(p); if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; pit->obj_rarity = parser_getuint(p, "obj_rarity"); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_t(struct parser *p) { struct pit_profile *pit = parser_priv(p); monster_base *base = lookup_monster_base(parser_getsym(p, "base")); if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; else if (pit->n_bases == MAX_RVALS) return PARSE_ERROR_TOO_MANY_ENTRIES; else if (!base) return PARSE_ERROR_UNRECOGNISED_TVAL; else { pit->base[pit->n_bases++] = base; return PARSE_ERROR_NONE; } } static enum parser_error parse_pit_c(struct parser *p) { struct pit_profile *pit = parser_priv(p); struct pit_color_profile *colors; const char *color; int attr; if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; color = parser_getsym(p, "color"); if (strlen(color) > 1) attr = color_text_to_attr(color); else attr = color_char_to_attr(color[0]); if (attr < 0) return PARSE_ERROR_INVALID_COLOR; colors = mem_zalloc(sizeof *colors); colors->color = attr; colors->next = pit->colors; pit->colors = colors; return PARSE_ERROR_NONE; } static enum parser_error parse_pit_f(struct parser *p) { struct pit_profile *pit = parser_priv(p); char *flags; char *s; if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "flags")); s = strtok(flags, " |"); while (s) { if (grab_flag(pit->flags, RF_SIZE, r_info_flags, s)) { mem_free(flags); return PARSE_ERROR_INVALID_FLAG; } s = strtok(NULL, " |"); } mem_free(flags); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_f2(struct parser *p) { struct pit_profile *pit = parser_priv(p); char *flags; char *s; if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "flags")); s = strtok(flags, " |"); while (s) { if (grab_flag(pit->forbidden_flags, RF_SIZE, r_info_flags, s)) { mem_free(flags); return PARSE_ERROR_INVALID_FLAG; } s = strtok(NULL, " |"); } mem_free(flags); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_s(struct parser *p) { struct pit_profile *pit = parser_priv(p); char *flags; char *s; if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "spells")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "spells")); s = strtok(flags, " |"); while (s) { if (grab_flag(pit->spell_flags, RSF_SIZE, r_info_spell_flags, s)) { mem_free(flags); return PARSE_ERROR_INVALID_FLAG; } s = strtok(NULL, " |"); } mem_free(flags); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_s2(struct parser *p) { struct pit_profile *pit = parser_priv(p); char *flags; char *s; if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "spells")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "spells")); s = strtok(flags, " |"); while (s) { if (grab_flag(pit->forbidden_spell_flags, RSF_SIZE, r_info_spell_flags, s)) { mem_free(flags); return PARSE_ERROR_INVALID_FLAG; } s = strtok(NULL, " |"); } mem_free(flags); return PARSE_ERROR_NONE; } static enum parser_error parse_pit_e(struct parser *p) { struct pit_profile *pit = parser_priv(p); struct pit_forbidden_monster *monsters; monster_race *r = lookup_monster(parser_getsym(p, "race")); if (!pit) return PARSE_ERROR_MISSING_RECORD_HEADER; monsters = mem_zalloc(sizeof *monsters); monsters->race = r; monsters->next = pit->forbidden_monsters; pit->forbidden_monsters = monsters; return PARSE_ERROR_NONE; } struct parser *init_parse_pit(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "N uint index str name", parse_pit_n); parser_reg(p, "R uint type", parse_pit_r); parser_reg(p, "A uint rarity uint level", parse_pit_a); parser_reg(p, "O uint obj_rarity", parse_pit_o); parser_reg(p, "T sym base", parse_pit_t); parser_reg(p, "C sym color", parse_pit_c); parser_reg(p, "F ?str flags", parse_pit_f); parser_reg(p, "f ?str flags", parse_pit_f2); parser_reg(p, "S ?str spells", parse_pit_s); parser_reg(p, "s ?str spells", parse_pit_s2); parser_reg(p, "E sym race", parse_pit_e); return p; } static errr run_parse_pit(struct parser *p) { return parse_file(p, "pit"); } static errr finish_parse_pit(struct parser *p) { struct pit_profile *pit, *n; /* scan the list for the max id */ z_info->pit_max = 0; pit = parser_priv(p); while (pit) { if (pit->pit_idx > z_info->pit_max) z_info->pit_max = pit->pit_idx; pit = pit->next; } /* allocate the direct access list and copy the data to it */ pit_info = mem_zalloc((z_info->pit_max+1) * sizeof(*pit)); for (pit = parser_priv(p); pit; pit = n) { memcpy(&pit_info[pit->pit_idx], pit, sizeof(*pit)); n = pit->next; if (n) pit_info[pit->pit_idx].next = &pit_info[n->pit_idx]; else pit_info[pit->pit_idx].next = NULL; mem_free(pit); } z_info->pit_max += 1; parser_destroy(p); return 0; } static void cleanup_pits(void) { int idx; for (idx = 0; idx < z_info->pit_max; idx++) { struct pit_profile *pit = &pit_info[idx]; struct pit_color_profile *c, *cn; struct pit_forbidden_monster *m, *mn; c = pit->colors; while (c) { cn = c->next; mem_free(c); c = cn; } m = pit->forbidden_monsters; while (m) { mn = m->next; mem_free(m); m = mn; } string_free((char *)pit_info[idx].name); } mem_free(pit_info); } static struct file_parser pit_parser = { "pits", init_parse_pit, run_parse_pit, finish_parse_pit, cleanup_pits }; /* * Initialize some other arrays */ static errr init_other(void) { int i; /*** Prepare the various "bizarre" arrays ***/ /* Initialize the "quark" package */ (void)quarks_init(); /* Initialize squelch things */ squelch_init(); textui_knowledge_init(); /* Initialize the "message" package */ (void)messages_init(); monster_list_init(); object_list_init(); /*** Prepare grid arrays ***/ cave = cave_new(); /* Array of stacked monster messages */ mon_msg = C_ZNEW(MAX_STORED_MON_MSG, monster_race_message); mon_message_hist = C_ZNEW(MAX_STORED_MON_CODES, monster_message_history); /*** Prepare entity arrays ***/ /* Objects */ objects_init(); /*** Prepare lore array ***/ /* Lore */ l_list = C_ZNEW(z_info->r_max, monster_lore); /*** Prepare quest array ***/ quest_init(); /*** Prepare the inventory ***/ /* Allocate it */ p_ptr->inventory = C_ZNEW(ALL_INVEN_TOTAL, object_type); /*** Prepare the options ***/ option_set_defaults(); /* Initialize the window flags */ for (i = 0; i < ANGBAND_TERM_MAX; i++) { /* Assume no flags */ op_ptr->window_flag[i] = 0L; } /*** Pre-allocate space for the "format()" buffer ***/ /* Hack -- Just call the "format()" function */ (void)format("I wish you could swim, like dolphins can swim..."); /* Success */ return (0); } /* * Initialize some other arrays */ static errr init_alloc(void) { /*** Initialize object allocation info ***/ init_obj_alloc(); /* Success */ return (0); } /* * Initialise just the internal arrays. * This should be callable by the test suite, without relying on input, or * anything to do with a user or savefiles. * * Assumption: Paths are set up correctly before calling this function. */ void init_arrays(void) { /* Initialize size info */ event_signal_string(EVENT_INITSTATUS, "Initializing array sizes..."); if (run_parser(&z_parser)) quit("Cannot initialize sizes"); /* Initialize feature info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (features)"); if (run_parser(&f_parser)) quit("Cannot initialize features"); /* Initialize object base info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (object bases)"); if (run_parser(&kb_parser)) quit("Cannot initialize object bases"); /* Initialize object info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (objects)"); if (run_parser(&k_parser)) quit("Cannot initialize objects"); /* Initialize ego-item info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (ego-items)"); if (run_parser(&e_parser)) quit("Cannot initialize ego-items"); /* Initialize artifact info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (artifacts)"); if (run_parser(&a_parser)) quit("Cannot initialize artifacts"); /* Initialize monster pain messages */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (pain messages)"); if (run_parser(&mp_parser)) quit("Cannot initialize monster pain messages"); /* Initialize monster-base info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (monster bases)"); if (run_parser(&rb_parser)) quit("Cannot initialize monster bases"); /* Initialize monster info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (monsters)"); if (run_parser(&r_parser)) quit("Cannot initialize monsters"); /* Initialize monster pits */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (monster pits)"); if (run_parser(&pit_parser)) quit("Cannot initialize monster pits"); /* Initialize vault info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (vaults)"); if (run_parser(&v_parser)) quit("Cannot initialize vaults"); /* Initialize history info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (histories)"); if (run_parser(&h_parser)) quit("Cannot initialize histories"); /* Initialize race info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (races)"); if (run_parser(&p_parser)) quit("Cannot initialize races"); /* Initialize class info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (classes)"); if (run_parser(&c_parser)) quit("Cannot initialize classes"); /* Initialize flavor info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (flavors)"); if (run_parser(&flavor_parser)) quit("Cannot initialize flavors"); /* Initialize spell info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (spells)"); if (run_parser(&s_parser)) quit("Cannot initialize spells"); /* Initialize hint text */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (hints)"); if (run_parser(&hints_parser)) quit("Cannot initialize hints"); /* Initialise store stocking data */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (store stocks)"); store_init(); /* Initialise random name data */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (random names)"); if (run_parser(&names_parser)) quit("Can't parse names"); /* Initialize some other arrays */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (other)"); if (init_other()) quit("Cannot initialize other stuff"); /* Initialize some other arrays */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (alloc)"); if (init_alloc()) quit("Cannot initialize alloc stuff"); } extern struct init_module generate_module; extern struct init_module obj_make_module; extern struct init_module mon_make_module; static struct init_module* modules[] = { &generate_module, &obj_make_module, &mon_make_module, NULL }; /* * Hack -- main Angband initialization entry point * * Verify some files, display the "news.txt" file, create * the high score file, initialize all internal arrays, and * load the basic "user pref files". * * Be very careful to keep track of the order in which things * are initialized, in particular, the only thing *known* to * be available when this function is called is the "z-term.c" * package, and that may not be fully initialized until the * end of this function, when the default "user pref files" * are loaded and "Term_xtra(TERM_XTRA_REACT,0)" is called. * * Note that this function attempts to verify the "news" file, * and the game aborts (cleanly) on failure, since without the * "news" file, it is likely that the "lib" folder has not been * correctly located. Otherwise, the news file is displayed for * the user. * * Note that this function attempts to verify (or create) the * "high score" file, and the game aborts (cleanly) on failure, * since one of the most common "extraction" failures involves * failing to extract all sub-directories (even empty ones), such * as by failing to use the "-d" option of "pkunzip", or failing * to use the "save empty directories" option with "Compact Pro". * This error will often be caught by the "high score" creation * code below, since the "lib/apex" directory, being empty in the * standard distributions, is most likely to be "lost", making it * impossible to create the high score file. * * Note that various things are initialized by this function, * including everything that was once done by "init_some_arrays". * * This initialization involves the parsing of special files * in the "lib/edit" directories. * * Note that the "template" files are initialized first, since they * often contain errors. This means that macros and message recall * and things like that are not available until after they are done. * * We load the default "user pref files" here in case any "color" * changes are needed before character creation. * * Note that the "graf-xxx.prf" file must be loaded separately, * if needed, in the first (?) pass through "TERM_XTRA_REACT". */ bool init_angband(void) { int i; event_signal(EVENT_ENTER_INIT); init_arrays(); for (i = 0; modules[i]; i++) if (modules[i]->init) modules[i]->init(); /*** Load default user pref files ***/ /* Initialize feature info */ event_signal_string(EVENT_INITSTATUS, "Loading basic user pref file..."); /* Process that file */ (void)process_pref_file("pref.prf", FALSE, FALSE); /* Done */ event_signal_string(EVENT_INITSTATUS, "Initialization complete"); /* Sneakily init command list */ cmd_init(); #ifdef ALLOW_BORG /* apw */ /* Allow the screensaver to do its work */ if (screensaver) { event_signal(EVENT_LEAVE_INIT); return !file_exists(savefile); } #endif /* ALLOW_BORG */ /* Ask for a "command" until we get one we like. */ while (1) { game_command *command_req; int failed = cmd_get(CMD_INIT, &command_req, TRUE); if (failed) continue; else if (command_req->command == CMD_QUIT) quit(NULL); else if (command_req->command == CMD_NEWGAME) { event_signal(EVENT_LEAVE_INIT); return TRUE; } else if (command_req->command == CMD_LOADFILE) { event_signal(EVENT_LEAVE_INIT); return FALSE; } } } void cleanup_angband(void) { int i; for (i = 0; modules[i]; i++) if (modules[i]->cleanup) modules[i]->cleanup(); /* Free the macros */ keymap_free(); /* Free the allocation tables */ free_obj_alloc(); event_remove_all_handlers(); /* Free the stores */ if (stores) free_stores(); quest_free(); FREE(p_ptr->inventory); FREE(p_ptr->history); /* Free the lore, monster, and object lists */ FREE(l_list); objects_destroy(); cave_free(cave); /* Free the stacked monster messages */ FREE(mon_msg); FREE(mon_message_hist); /* Free the messages */ messages_free(); /* Free the history */ history_clear(); /* Cleanup any options menus */ cleanup_options(); /* Free the "quarks" */ quarks_free(); monster_list_finalize(); object_list_finalize(); cleanup_parser(&k_parser); cleanup_parser(&kb_parser); cleanup_parser(&a_parser); cleanup_parser(&names_parser); cleanup_parser(&r_parser); cleanup_parser(&rb_parser); cleanup_parser(&f_parser); cleanup_parser(&e_parser); cleanup_parser(&p_parser); cleanup_parser(&c_parser); cleanup_parser(&v_parser); cleanup_parser(&h_parser); cleanup_parser(&flavor_parser); cleanup_parser(&s_parser); cleanup_parser(&hints_parser); cleanup_parser(&mp_parser); cleanup_parser(&pit_parser); cleanup_parser(&z_parser); /* Free the format() buffer */ vformat_kill(); /* Free the directories */ string_free(ANGBAND_DIR_APEX); string_free(ANGBAND_DIR_EDIT); string_free(ANGBAND_DIR_FILE); string_free(ANGBAND_DIR_HELP); string_free(ANGBAND_DIR_INFO); string_free(ANGBAND_DIR_SAVE); string_free(ANGBAND_DIR_PREF); string_free(ANGBAND_DIR_USER); string_free(ANGBAND_DIR_XTRA); string_free(ANGBAND_DIR_XTRA_FONT); string_free(ANGBAND_DIR_XTRA_GRAF); string_free(ANGBAND_DIR_XTRA_SOUND); string_free(ANGBAND_DIR_XTRA_ICON); } angband-3.5.1/src/Makefile.inc0000644000175000017500000026640312456456606015452 0ustar chriscchrisc# # File: Makefile.inc # # Includes Makefile.src and contains dependency info # include Makefile.src BASEOBJS := $(ANGFILES) $(ZFILES) depgen: head -n 19 Makefile.inc > Makefile.new @for i in $(BASEOBJS:.o=.c); do \ DIR=`echo ./$$i | sed 's|/[^/]*$$||'`; \ gcc -MM -I. $$i | \ sed "s|^\\([^ ]\\)|$$DIR/\\1|" >> Makefile.new; \ done; # Dependencies ./attack.o: attack.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h attack.h cmds.h monster/mon-make.h \ angband.h monster/mon-msg.h monster/mon-timed.h monster/mon-util.h \ object/slays.h object/list-slays.h object/tvalsval.h target.h ./birth.o: birth.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h birth.h cmds.h files.h game-event.h \ history.h object/inventory.h object/tvalsval.h squelch.h quest.h \ ui-menu.h ./cave.o: cave.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h game-event.h monster/mon-util.h \ angband.h object/tvalsval.h squelch.h cmds.h grafmode.h ./cmd-cave.o: cmd-cave.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h attack.h cmds.h dungeon.h files.h \ game-event.h generate.h monster/mon-timed.h monster/mon-util.h \ angband.h object/tvalsval.h pathfind.h squelch.h trap.h ./cmd-context.o: cmd-context.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h files.h keymap.h textui.h \ ui-menu.h wizard.h target.h squelch.h object/tvalsval.h \ monster/mon-lore.h angband.h monster/mon-util.h ./cmd-know.o: cmd-know.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h files.h history.h \ object/tvalsval.h monster/mon-lore.h angband.h monster/mon-list.h \ monster/mon-util.h object/obj-list.h angband.h prefs.h squelch.h \ target.h ui-menu.h ./cmd-misc.o: cmd-misc.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h monster/mon-util.h angband.h \ wizard.h target.h prefs.h files.h buildid.h history.h ./cmd-obj.o: cmd-obj.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h attack.h cmds.h effects.h \ list-effects.h object/inventory.h object/tvalsval.h squelch.h target.h \ ui-menu.h ui-options.h ./cmd-pickup.o: cmd-pickup.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h attack.h cmds.h game-event.h \ generate.h history.h monster/mon-timed.h monster/mon-util.h angband.h \ object/inventory.h object/tvalsval.h squelch.h trap.h ./cmd-process.o: cmd-process.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h attack.h cmds.h files.h keymap.h \ textui.h ui-menu.h wizard.h target.h ./death.o: death.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h death.h files.h history.h \ savefile.h ui-menu.h wizard.h ./debug.o: debug.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h debug.h ./dungeon.o: dungeon.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h birth.h borg/borg1.h angband.h \ object/tvalsval.h cave.h borg/../effects.h borg/../list-effects.h \ cmds.h dungeon.h files.h game-event.h generate.h grafmode.h \ monster/mon-make.h angband.h monster/mon-spell.h \ monster/list-spell-effects.h monster/mon-util.h object/tvalsval.h \ pathfind.h prefs.h savefile.h target.h ./effects.o: effects.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h effects.h list-effects.h dungeon.h \ monster/mon-spell.h angband.h monster/list-spell-effects.h \ monster/mon-util.h trap.h ./files.o: files.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h buildid.h cmds.h death.h files.h \ history.h object/tvalsval.h object/pval.h angband.h savefile.h \ ui-menu.h ./game-cmd.o: game-cmd.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h attack.h cmds.h object/tvalsval.h \ target.h ./game-event.o: game-event.c z-virt.h h-basic.h game-event.h ./generate.o: generate.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h files.h game-event.h generate.h \ monster/mon-make.h angband.h monster/mon-spell.h \ monster/list-spell-effects.h object/tvalsval.h trap.h z-queue.h \ h-basic.h ./grafmode.o: grafmode.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h grafmode.h ./guid.o: guid.c guid.h ./history.o: history.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h history.h ./init.o: init.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h buildid.h cmds.h game-event.h \ generate.h history.h hint.h keymap.h monster/mon-init.h \ monster/mon-list.h angband.h monster/mon-msg.h monster/mon-util.h \ object/obj-list.h angband.h object/slays.h object/list-slays.h \ object/tvalsval.h prefs.h quest.h randname.h squelch.h \ object/list-object-flags.h list-effects.h list-player-flags.h ./keymap.o: keymap.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h keymap.h ./load.o: load.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h dungeon.h history.h \ monster/mon-make.h angband.h monster/mon-spell.h \ monster/list-spell-effects.h object/tvalsval.h savefile.h squelch.h \ quest.h ./monster/mon-init.o: monster/mon-init.c externs.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ z-bitflag.h h-basic.h z-form.h z-virt.h defines.h z-rand.h cave.h \ z-type.h monster/mon-timed.h object/obj-flag.h z-rand.h z-file.h \ z-textblock.h z-file.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/list-object-flags.h monster/list-mon-spells.h object/object.h \ object/obj-flag.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h object/obj-flag.h \ parser.h z-bitflag.h z-rand.h z-term.h ui-event.h z-msg.h z-msg-list.h \ spells.h list-gf-types.h monster/mon-init.h monster/mon-msg.h angband.h \ z-util.h z-quark.h config.h cave.h game-cmd.h init.h option.h ui.h \ z-textblock.h externs.h monster/mon-power.h monster/monster.h \ monster/mon-spell.h monster/list-spell-effects.h monster/mon-util.h \ monster/monster.h parser.h z-util.h z-virt.h monster/list-mon-flags.h \ monster/list-mon-spells.h monster/list-blow-methods.h \ monster/list-blow-effects.h ./monster/melee1.o: monster/melee1.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h attack.h cave.h monster/monster.h object/tvalsval.h \ spells.h ./monster/melee2.o: monster/melee2.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h attack.h cave.h monster/monster.h monster/mon-make.h \ angband.h monster/mon-spell.h monster/list-spell-effects.h \ monster/mon-timed.h monster/mon-util.h object/slays.h \ object/list-slays.h object/tvalsval.h spells.h squelch.h ./monster/mon-list.o: monster/mon-list.c monster/mon-util.h angband.h h-basic.h \ z-bitflag.h z-form.h z-virt.h defines.h z-file.h z-util.h z-rand.h \ z-term.h ui-event.h z-quark.h z-msg.h z-msg-list.h config.h cave.h \ z-type.h game-cmd.h init.h parser.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ z-bitflag.h z-rand.h cave.h monster/mon-timed.h object/obj-flag.h \ z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/list-object-flags.h monster/list-mon-spells.h object/obj-flag.h \ object/object.h object/obj-flag.h option.h player/player.h guid.h \ object/obj-flag.h object/object.h option.h list-player-flags.h store.h \ ui.h z-textblock.h externs.h spells.h list-gf-types.h \ monster/mon-list.h ./monster/mon-lore.o: monster/mon-lore.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h monster/mon-lore.h angband.h monster/mon-make.h \ monster/mon-spell.h monster/list-spell-effects.h monster/mon-util.h \ object/tvalsval.h attack.h monster/list-mon-flags.h \ monster/list-blow-methods.h monster/list-blow-effects.h ./monster/mon-make.o: monster/mon-make.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h alloc.h history.h init.h target.h monster/mon-lore.h \ angband.h monster/mon-make.h monster/mon-timed.h monster/mon-util.h \ object/tvalsval.h quest.h ./monster/mon-msg.o: monster/mon-msg.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h monster/mon-msg.h angband.h monster/mon-util.h ./monster/mon-power.o: monster/mon-power.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h monster/mon-power.h monster/monster.h \ monster/mon-spell.h angband.h monster/list-spell-effects.h ./monster/mon-spell.o: monster/mon-spell.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h spells.h effects.h list-effects.h monster/mon-spell.h \ angband.h monster/list-spell-effects.h monster/mon-timed.h \ monster/mon-util.h monster/list-mon-spells.h \ monster/list-spell-effects.h ./monster/mon-timed.o: monster/mon-timed.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h monster/mon-msg.h angband.h monster/mon-spell.h \ monster/list-spell-effects.h monster/mon-timed.h monster/mon-util.h ./monster/mon-util.o: monster/mon-util.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h monster/mon-make.h angband.h monster/mon-msg.h \ monster/mon-spell.h monster/list-spell-effects.h monster/mon-timed.h \ monster/mon-list.h monster/mon-util.h squelch.h ./object/chest.o: object/chest.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/tvalsval.h monster/mon-util.h angband.h ./object/identify.o: object/identify.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h cave.h game-event.h history.h object/slays.h \ object/list-slays.h object/tvalsval.h object/pval.h angband.h spells.h \ squelch.h ./object/obj-desc.o: object/obj-desc.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h squelch.h object/tvalsval.h object/pval.h angband.h ./object/obj-flag.o: object/obj-flag.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/list-object-flags.h ./object/obj-info.o: object/obj-info.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h attack.h effects.h list-effects.h cmds.h \ object/tvalsval.h z-textblock.h object/slays.h object/list-slays.h \ object/pval.h angband.h ./object/obj-list.o: object/obj-list.c object/object.h z-rand.h h-basic.h \ defines.h z-file.h z-textblock.h z-file.h z-quark.h z-bitflag.h \ z-form.h z-virt.h game-cmd.h cave.h z-type.h object/obj-flag.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/list-object-flags.h object/tvalsval.h squelch.h \ object/obj-list.h angband.h z-bitflag.h z-util.h z-rand.h z-term.h \ ui-event.h z-quark.h z-msg.h z-msg-list.h config.h cave.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h monster/list-mon-spells.h object/obj-flag.h \ object/object.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h ./object/obj-make.o: object/obj-make.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h alloc.h cave.h init.h object/tvalsval.h object/pval.h \ angband.h object/slays.h object/list-slays.h ./object/obj-power.o: object/obj-power.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/slays.h object/list-slays.h object/tvalsval.h \ object/pval.h angband.h init.h effects.h list-effects.h \ monster/mon-power.h monster/monster.h ./object/obj-ui.o: object/obj-ui.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/tvalsval.h cmds.h game-cmd.h keymap.h ./object/obj-util.o: object/obj-util.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h cave.h effects.h list-effects.h game-cmd.h generate.h \ history.h monster/mon-make.h angband.h object/inventory.h \ object/tvalsval.h prefs.h randname.h spells.h squelch.h z-queue.h \ h-basic.h grafmode.h ./object/pval.o: object/pval.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/pval.h angband.h object/tvalsval.h ./object/randart.o: object/randart.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/slays.h object/list-slays.h object/tvalsval.h \ object/pval.h angband.h init.h effects.h list-effects.h randname.h ./object/slays.o: object/slays.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/slays.h object/list-slays.h monster/mon-util.h \ angband.h object/list-slays.h ./option.o: option.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h ./parser.o: parser.c externs.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ z-bitflag.h h-basic.h z-form.h z-virt.h defines.h z-rand.h cave.h \ z-type.h monster/mon-timed.h object/obj-flag.h z-rand.h z-file.h \ z-textblock.h z-file.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/list-object-flags.h monster/list-mon-spells.h object/object.h \ z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h object/obj-flag.h \ parser.h h-basic.h z-bitflag.h z-rand.h z-term.h ui-event.h z-file.h \ z-msg.h z-msg-list.h spells.h list-gf-types.h z-form.h z-util.h \ z-virt.h ./randname.o: randname.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h randname.h ./pathfind.o: pathfind.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h pathfind.h squelch.h \ monster/mon-util.h angband.h ./prefs.o: prefs.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h keymap.h prefs.h squelch.h ./player/calcs.o: player/calcs.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h cave.h files.h game-event.h monster/mon-msg.h angband.h \ monster/mon-util.h object/tvalsval.h object/pval.h angband.h spells.h \ squelch.h ./player/class.o: player/class.c externs.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ z-bitflag.h h-basic.h z-form.h z-virt.h defines.h z-rand.h cave.h \ z-type.h monster/mon-timed.h object/obj-flag.h z-rand.h z-file.h \ z-textblock.h z-file.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/list-object-flags.h monster/list-mon-spells.h object/object.h \ object/obj-flag.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h object/obj-flag.h \ parser.h z-bitflag.h z-rand.h z-term.h ui-event.h z-msg.h z-msg-list.h \ spells.h list-gf-types.h player/player.h ./player/player.o: player/player.c externs.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ z-bitflag.h h-basic.h z-form.h z-virt.h defines.h z-rand.h cave.h \ z-type.h monster/mon-timed.h object/obj-flag.h z-rand.h z-file.h \ z-textblock.h z-file.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/list-object-flags.h monster/list-mon-spells.h object/object.h \ object/obj-flag.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h object/obj-flag.h \ parser.h z-bitflag.h z-rand.h z-term.h ui-event.h z-msg.h z-msg-list.h \ spells.h list-gf-types.h history.h player/player.h birth.h z-util.h ./player/race.o: player/race.c externs.h monster/constants.h \ monster/list-blow-methods.h monster/list-blow-effects.h \ monster/list-mon-flags.h monster/monster.h defines.h h-basic.h \ z-bitflag.h h-basic.h z-form.h z-virt.h defines.h z-rand.h cave.h \ z-type.h monster/mon-timed.h object/obj-flag.h z-rand.h z-file.h \ z-textblock.h z-file.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/list-object-flags.h monster/list-mon-spells.h object/object.h \ object/obj-flag.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h object/obj-flag.h \ parser.h z-bitflag.h z-rand.h z-term.h ui-event.h z-msg.h z-msg-list.h \ spells.h list-gf-types.h player/player.h ./player/spell.o: player/spell.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h cave.h object/tvalsval.h game-cmd.h spells.h ./player/timed.o: player/timed.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h cave.h ./player/p-util.o: player/p-util.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h cave.h object/tvalsval.h ./quest.o: quest.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h quest.h ./score.o: score.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h buildid.h ./signals.o: signals.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h files.h savefile.h ./save.o: save.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h dungeon.h history.h \ monster/mon-make.h angband.h quest.h savefile.h squelch.h ./savefile.o: savefile.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h savefile.h ./spells1.o: spells1.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h dungeon.h generate.h grafmode.h \ monster/mon-make.h angband.h monster/mon-msg.h monster/mon-spell.h \ monster/list-spell-effects.h monster/mon-timed.h monster/mon-util.h \ object/tvalsval.h squelch.h trap.h ./spells2.o: spells2.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h generate.h history.h \ monster/mon-lore.h angband.h monster/mon-make.h monster/mon-timed.h \ monster/mon-util.h object/slays.h object/list-slays.h object/tvalsval.h \ squelch.h target.h trap.h ./squelch.o: squelch.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h ui-menu.h object/tvalsval.h \ object/pval.h angband.h squelch.h ./store.o: store.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h game-event.h history.h \ object/inventory.h object/tvalsval.h squelch.h target.h textui.h \ ui-menu.h z-debug.h ./tables.o: tables.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h object/tvalsval.h ./target.o: target.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h monster/mon-lore.h angband.h \ monster/mon-util.h squelch.h target.h ./trap.o: trap.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h attack.h effects.h list-effects.h \ trap.h ./ui.o: ui.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h defines.h \ z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h z-msg.h \ z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h parser.h \ monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h ./ui-birth.o: ui-birth.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h files.h game-event.h \ object/tvalsval.h ui-birth.h ui-menu.h ui-options.h ./ui-event.o: ui-event.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h ./ui-knowledge.o: ui-knowledge.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h history.h monster/mon-lore.h \ angband.h monster/mon-util.h object/tvalsval.h squelch.h ui-menu.h \ ui-options.h grafmode.h ./ui-menu.o: ui-menu.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h ui-menu.h ./ui-options.o: ui-options.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h keymap.h squelch.h prefs.h \ object/tvalsval.h ui-menu.h ui-options.h files.h ./ui-spell.o: ui-spell.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h object/tvalsval.h ui-menu.h ./util.o: util.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h target.h files.h game-event.h \ randname.h ./variable.o: variable.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h buildid.h ./wiz-spoil.o: wiz-spoil.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h buildid.h cmds.h monster/mon-lore.h \ angband.h object/tvalsval.h ui-menu.h wizard.h ./wiz-stats.o: wiz-stats.c angband.h h-basic.h z-bitflag.h z-form.h \ z-virt.h defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h \ z-quark.h z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h \ init.h parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h wizard.h monster/mon-make.h \ angband.h object/tvalsval.h effects.h list-effects.h generate.h ./wizard.o: wizard.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h files.h monster/mon-lore.h \ angband.h monster/mon-make.h monster/mon-util.h object/tvalsval.h \ ui-menu.h target.h wizard.h ./x-spell.o: x-spell.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h effects.h list-effects.h \ object/tvalsval.h ./xtra2.o: xtra2.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h cmds.h keymap.h history.h \ object/tvalsval.h pathfind.h target.h ./xtra3.o: xtra3.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h buildid.h files.h game-event.h \ grafmode.h hint.h monster/mon-lore.h angband.h monster/mon-list.h \ monster/mon-util.h object/obj-list.h angband.h object/tvalsval.h \ textui.h ui-birth.h ./borg/borg1.o: borg/borg1.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/tvalsval.h cave.h borg/borg1.h borg/../effects.h \ borg/../list-effects.h ./borg/borg2.o: borg/borg2.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/tvalsval.h cave.h borg/borg1.h borg/../effects.h \ borg/../list-effects.h borg/borg2.h ./borg/borg3.o: borg/borg3.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/tvalsval.h cave.h borg/borg1.h borg/../effects.h \ borg/../list-effects.h borg/borg3.h ./borg/borg4.o: borg/borg4.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/tvalsval.h cave.h files.h borg/borg1.h \ borg/../effects.h borg/../list-effects.h borg/borg2.h borg/borg3.h \ borg/borg4.h ./borg/borg5.o: borg/borg5.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/tvalsval.h cave.h monster/mon-spell.h angband.h \ monster/list-spell-effects.h borg/borg1.h borg/../effects.h \ borg/../list-effects.h borg/borg2.h borg/borg3.h borg/borg4.h \ borg/borg5.h borg/borg6.h ./borg/borg6.o: borg/borg6.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/tvalsval.h cave.h monster/mon-spell.h angband.h \ monster/list-spell-effects.h borg/borg1.h borg/../effects.h \ borg/../list-effects.h borg/borg2.h borg/borg3.h borg/borg4.h \ borg/borg5.h borg/borg6.h borg/borg7.h ./borg/borg7.o: borg/borg7.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/tvalsval.h cave.h borg/borg1.h borg/../effects.h \ borg/../list-effects.h borg/borg2.h borg/borg3.h borg/borg4.h \ borg/borg5.h borg/borg6.h borg/borg7.h ./borg/borg8.o: borg/borg8.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/tvalsval.h cave.h borg/borg1.h borg/../effects.h \ borg/../list-effects.h borg/borg2.h borg/borg3.h borg/borg4.h \ borg/borg5.h borg/borg6.h borg/borg7.h borg/borg8.h cmds.h ./borg/borg9.o: borg/borg9.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-quark.h z-bitflag.h \ game-cmd.h cave.h object/list-object-flags.h monster/list-mon-spells.h \ object/obj-flag.h object/object.h object/obj-flag.h option.h \ player/player.h guid.h object/obj-flag.h object/object.h option.h \ list-player-flags.h store.h ui.h z-textblock.h externs.h spells.h \ list-gf-types.h object/tvalsval.h birth.h cave.h target.h spells.h \ object/inventory.h borg/borg1.h borg/../effects.h \ borg/../list-effects.h borg/borg2.h borg/borg3.h borg/borg4.h \ borg/borg5.h borg/borg6.h borg/borg7.h borg/borg8.h cmds.h borg/borg9.h ./buildid.o: buildid.c buildid.h ./z-bitflag.o: z-bitflag.c z-bitflag.h h-basic.h z-form.h z-virt.h \ defines.h ./z-file.o: z-file.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h ./z-form.o: z-form.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h ./z-msg.o: z-msg.c z-virt.h h-basic.h z-term.h ui-event.h z-util.h z-msg.h \ z-msg-list.h ./z-quark.o: z-quark.c z-virt.h h-basic.h z-quark.h ./z-queue.o: z-queue.c z-queue.h h-basic.h ./z-rand.o: z-rand.c z-rand.h h-basic.h defines.h ./z-set.o: z-set.c z-set.h h-basic.h z-rand.h defines.h z-virt.h ./z-term.o: z-term.c angband.h h-basic.h z-bitflag.h z-form.h z-virt.h \ defines.h z-file.h z-util.h z-rand.h z-term.h ui-event.h z-quark.h \ z-msg.h z-msg-list.h config.h cave.h z-type.h game-cmd.h init.h \ parser.h monster/constants.h monster/list-blow-methods.h \ monster/list-blow-effects.h monster/list-mon-flags.h monster/monster.h \ defines.h h-basic.h z-bitflag.h z-rand.h cave.h monster/mon-timed.h \ object/obj-flag.h z-rand.h z-file.h z-textblock.h z-file.h defines.h \ z-quark.h z-bitflag.h game-cmd.h cave.h object/list-object-flags.h \ monster/list-mon-spells.h object/obj-flag.h object/object.h z-rand.h \ z-file.h z-textblock.h z-quark.h z-bitflag.h game-cmd.h cave.h \ object/obj-flag.h option.h player/player.h guid.h object/obj-flag.h \ object/object.h option.h list-player-flags.h store.h ui.h z-textblock.h \ externs.h spells.h list-gf-types.h ./z-type.o: z-type.c h-basic.h z-form.h z-term.h ui-event.h ui.h \ z-textblock.h z-file.h defines.h z-type.h z-virt.h ./z-util.o: z-util.c z-util.h h-basic.h ./z-virt.o: z-virt.c z-virt.h h-basic.h z-util.h ./z-textblock.o: z-textblock.c z-term.h h-basic.h ui-event.h z-textblock.h \ z-file.h defines.h z-virt.h z-form.h angband-3.5.1/src/z-file.c0000644000175000017500000003732612456456607014575 0ustar chriscchrisc/* * File: z-file.c * Purpose: Low-level file (and directory) handling * * Copyright (c) 1997-2007 Ben Harrison, pelpel, Andi Sidwell, Matthew Jones * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include #ifdef WINDOWS # include # include # include #endif #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_DIRENT_H # include # include #endif #ifdef HAVE_STAT # include # include #endif #ifdef WINDOWS # define my_mkdir(path, perms) mkdir(path) #elif defined(HAVE_MKDIR) || defined(MACH_O_CARBON) # define my_mkdir(path, perms) mkdir(path, perms) #else # define my_mkdir(path, perms) FALSE #endif /* * Player info */ int player_uid; int player_egid; /* * Drop permissions */ void safe_setuid_drop(void) { #ifdef SETGID # if defined(HAVE_SETRESGID) if (setresgid(-1, getgid(), -1) != 0) quit("setegid(): cannot drop permissions correctly!"); # else if (setegid(getgid()) != 0) quit("setegid(): cannot drop permissions correctly!"); # endif #endif /* SETGID */ } /* * Grab permissions */ void safe_setuid_grab(void) { #ifdef SETGID # if defined(HAVE_SETRESGID) if (setresgid(-1, player_egid, -1) != 0) quit("setegid(): cannot grab permissions correctly!"); # elif defined(HAVE_SETEGID) if (setegid(player_egid) != 0) quit("setegid(): cannot grab permissions correctly!"); # endif #endif /* SETGID */ } /* * Apply special system-specific processing before dealing with a filename. */ static void path_parse(char *buf, size_t max, const char *file) { /* Accept the filename */ my_strcpy(buf, file, max); } static void path_process(char *buf, size_t len, size_t *cur_len, const char *path) { #if defined(UNIX) /* Home directory on Unixes */ if (path[0] == '~') { const char *s; const char *username = path + 1; struct passwd *pw; char user[128]; /* Look for non-user portion of the file */ s = strstr(username, PATH_SEP); if (s) { int i; /* Keep username a decent length */ if (s >= username + sizeof(user)) return; for (i = 0; username < s; ++i) user[i] = *username++; user[i] = '\0'; username = user; } /* Look up a user (or "current" user) */ pw = username[0] ? getpwnam(username) : getpwuid(getuid()); if (!pw) return; /* Copy across */ strnfcat(buf, len, cur_len, "%s%s", pw->pw_dir, PATH_SEP); if (s) strnfcat(buf, len, cur_len, "%s", s); } else #endif /* defined(UNIX) */ strnfcat(buf, len, cur_len, "%s", path); } /* * Create a new path string by appending a 'leaf' to 'base'. * * On Unixes, we convert a tidle at the beginning of a basename to mean the * directory, complicating things a little, but better now than later. * * Remember to free the return value. */ size_t path_build(char *buf, size_t len, const char *base, const char *leaf) { size_t cur_len = 0; buf[0] = '\0'; if (!leaf || !leaf[0]) { if (base && base[0]) path_process(buf, len, &cur_len, base); return cur_len; } /* * If the leafname starts with the seperator, * or with the tilde (on Unix), * or there's no base path, * We use the leafname only. */ #if defined(UNIX) if ((!base || !base[0]) || prefix(leaf, PATH_SEP) || leaf[0] == '~') #else if ((!base || !base[0]) || prefix(leaf, PATH_SEP)) #endif { path_process(buf, len, &cur_len, leaf); return cur_len; } /* There is both a relative leafname and a base path from which it is relative */ path_process(buf, len, &cur_len, base); strnfcat(buf, len, &cur_len, "%s", PATH_SEP); path_process(buf, len, &cur_len, leaf); return cur_len; } /* * Return the index of the filename in a path, using PATH_SEPC. If no path * separator is found, return 0. */ size_t path_filename_index(const char *path) { int i; if (strlen(path) == 0) return 0; for (i = strlen(path) - 1; i >= 0; i--) { if (path[i] == PATH_SEPC) return i + 1; } return 0; } /*** File-handling API ***/ /* Some defines for compatibility between various build platforms */ #ifndef S_IRUSR #define S_IRUSR S_IREAD #endif #ifndef S_IWUSR #define S_IWUSR S_IWRITE #endif /* if the flag O_BINARY is not defined, it is not needed , but we still * need it defined so it will compile */ #ifndef O_BINARY #define O_BINARY 0 #endif /* Avoid a compiler warning when cross compiling for windows */ #ifdef __STRICT_ANSI__ FILE *fdopen(int handle, const char *mode); #endif /* Private structure to hold file pointers and useful info. */ struct ang_file { FILE *fh; char *fname; file_mode mode; }; /** Utility functions **/ /* * Delete file 'fname'. */ bool file_delete(const char *fname) { char buf[1024]; /* Get the system-specific paths */ path_parse(buf, sizeof(buf), fname); return (remove(buf) == 0); } /* * Move file 'fname' to 'newname'. */ bool file_move(const char *fname, const char *newname) { char buf[1024]; char aux[1024]; /* Get the system-specific paths */ path_parse(buf, sizeof(buf), fname); path_parse(aux, sizeof(aux), newname); return (rename(buf, aux) == 0); } /* * Decide whether a file exists or not. */ #if defined(HAVE_STAT) bool file_exists(const char *fname) { struct stat st; return (stat(fname, &st) == 0); } #elif defined(WINDOWS) bool file_exists(const char *fname) { char path[MAX_PATH]; DWORD attrib; /* API says we mustn't pass anything larger than MAX_PATH */ my_strcpy(path, s, sizeof(path)); attrib = GetFileAttributes(path); if (attrib == INVALID_FILE_NAME) return FALSE; if (attrib & FILE_ATTRIBUTE_DIRECTORY) return FALSE; return TRUE; } #else bool file_exists(const char *fname) { ang_file *f = file_open(fname, MODE_READ, 0); if (f) file_close(f); return (f ? TRUE : FALSE); } #endif /* * Return TRUE if first is newer than second, FALSE otherwise. */ bool file_newer(const char *first, const char *second) { #ifdef HAVE_STAT struct stat stat1, stat2; /* If the first doesn't exist, the first is not newer. */ if (stat(first, &stat1) != 0) return FALSE; /* If the second doesn't exist, the first is always newer. */ if (stat(second, &stat2) != 0) return TRUE; /* Compare modification times. */ return stat1.st_mtime > stat2.st_mtime ? TRUE : FALSE; #else /* HAVE_STAT */ return FALSE; #endif /* !HAVE_STAT */ } /** File-handle functions **/ void (*file_open_hook)(const char *path, file_type ftype); /* * Open file 'fname', in mode 'mode', with filetype 'ftype'. * Returns file handle or NULL. */ ang_file *file_open(const char *fname, file_mode mode, file_type ftype) { ang_file *f = ZNEW(ang_file); char buf[1024]; (void)ftype; /* Get the system-specific path */ path_parse(buf, sizeof(buf), fname); switch (mode) { case MODE_WRITE: { if (ftype == FTYPE_SAVE) { /* open only if the file does not exist */ int fd; fd = open(buf, O_CREAT | O_EXCL | O_WRONLY | O_BINARY, S_IRUSR | S_IWUSR); if (fd < 0) { /* there was some error */ f->fh = NULL; } else { f->fh = fdopen(fd, "wb"); } } else { f->fh = fopen(buf, "wb"); } break; } case MODE_READ: f->fh = fopen(buf, "rb"); break; case MODE_APPEND: f->fh = fopen(buf, "a+"); break; default: assert(0); } if (f->fh == NULL) { FREE(f); return NULL; } f->fname = string_make(buf); f->mode = mode; if (mode != MODE_READ && file_open_hook) file_open_hook(buf, ftype); return f; } /* * Close file handle 'f'. */ bool file_close(ang_file *f) { if (fclose(f->fh) != 0) return FALSE; FREE(f->fname); FREE(f); return TRUE; } /** Locking functions **/ /* * Lock a file using POSIX locks, on platforms where this is supported. */ void file_lock(ang_file *f) { #if defined(HAVE_FCNTL_H) && defined(UNIX) struct flock lock; lock.l_type = (f->mode == MODE_READ ? F_RDLCK : F_WRLCK); lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_pid = 0; fcntl(fileno(f->fh), F_SETLKW, &lock); #endif /* HAVE_FCNTL_H && UNIX */ } /* * Unlock a file locked using file_lock(). */ void file_unlock(ang_file *f) { #if defined(HAVE_FCNTL_H) && defined(UNIX) struct flock lock; lock.l_type = F_UNLCK; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_pid = 0; fcntl(fileno(f->fh), F_SETLK, &lock); #endif /* HAVE_FCNTL_H && UNIX */ } /** Byte-based IO and functions **/ /* * Seek to location 'pos' in file 'f'. */ bool file_skip(ang_file *f, int bytes) { return (fseek(f->fh, bytes, SEEK_CUR) == 0); } /* * Read a single, 8-bit character from file 'f'. */ bool file_readc(ang_file *f, byte *b) { int i = fgetc(f->fh); if (i == EOF) return FALSE; *b = (byte)i; return TRUE; } /* * Write a single, 8-bit character 'b' to file 'f'. */ bool file_writec(ang_file *f, byte b) { return file_write(f, (const char *)&b, 1); } /* * Read 'n' bytes from file 'f' into array 'buf'. */ int file_read(ang_file *f, char *buf, size_t n) { size_t read = fread(buf, 1, n, f->fh); if (read == 0 && ferror(f->fh)) return -1; else return read; } /* * Append 'n' bytes of array 'buf' to file 'f'. */ bool file_write(ang_file *f, const char *buf, size_t n) { return fwrite(buf, 1, n, f->fh) == n; } /** Line-based IO **/ /* * Read a line of text from file 'f' into buffer 'buf' of size 'n' bytes. * * Support both \r\n and \n as line endings, but not the outdated \r that used * to be used on Macs. Replace non-printables with '?', and \ts with ' '. */ #define TAB_COLUMNS 4 bool file_getl(ang_file *f, char *buf, size_t len) { bool seen_cr = FALSE; byte b; size_t i = 0; /* Leave a byte for the terminating 0 */ size_t max_len = len - 1; while (i < max_len) { char c; if (!file_readc(f, &b)) { buf[i] = '\0'; return (i == 0) ? FALSE : TRUE; } c = (char) b; if (c == '\r') { seen_cr = TRUE; continue; } if (seen_cr && c != '\n') { fseek(f->fh, -1, SEEK_CUR); buf[i] = '\0'; return TRUE; } if (c == '\n') { buf[i] = '\0'; return TRUE; } /* Expand tabs */ if (c == '\t') { /* Next tab stop */ size_t tabstop = ((i + TAB_COLUMNS) / TAB_COLUMNS) * TAB_COLUMNS; if (tabstop >= len) break; /* Convert to spaces */ while (i < tabstop) buf[i++] = ' '; continue; } buf[i++] = c; } buf[i] = '\0'; return TRUE; } /* * Append a line of text 'buf' to the end of file 'f', using system-dependent * line ending. */ bool file_put(ang_file *f, const char *buf) { return file_write(f, buf, strlen(buf)); } /* * The comp.lang.c FAQ recommends this pairing for varargs functions. * See */ /** * Append a formatted line of text to the end of file 'f'. * * file_putf() is the ellipsis version. Most file output will call this * version. It calls file_vputf() to do the real work. It returns TRUE * if the write was successful and FALSE otherwise. */ bool file_putf(ang_file *f, const char *fmt, ...) { va_list vp; bool status; if (!f) return FALSE; va_start(vp, fmt); status = file_vputf(f, fmt, vp); va_end(vp); return status; } /** * Append a formatted line of text to the end of file 'f'. * * file_vputf() is the va_list version. It returns TRUE if the write was * successful and FALSE otherwise. */ bool file_vputf(ang_file *f, const char *fmt, va_list vp) { char buf[1024]; if (!f) return FALSE; (void)vstrnfmt(buf, sizeof(buf), fmt, vp); return file_put(f, buf); } bool dir_exists(const char *path) { #ifdef HAVE_STAT struct stat buf; if (stat(path, &buf) != 0) return FALSE; else if (buf.st_mode & S_IFDIR) return TRUE; else return FALSE; #else return TRUE; #endif } #ifdef HAVE_STAT bool dir_create(const char *path) { const char *ptr; char buf[512]; /* If the directory already exists then we're done */ if (dir_exists(path)) return TRUE; #ifdef WINDOWS /* If we're on windows, we need to skip past the "C:" part. */ if (isalpha(path[0]) && path[1] == ':') path += 2; #endif /* Iterate through the path looking for path segements. At each step, * create the path segment if it doesn't already exist. */ for (ptr = path; *ptr; ptr++) { if (*ptr == PATH_SEPC) { /* Find the length of the parent path string */ size_t len = (size_t)(ptr - path); /* Skip the initial slash */ if (len == 0) continue; /* If this is a duplicate path separator, continue */ if (*(ptr - 1) == PATH_SEPC) continue; /* We can't handle really big filenames */ if (len - 1 > 512) return FALSE; /* Create the parent path string, plus null-padding */ my_strcpy(buf, path, len + 1); /* Skip if the parent exists */ if (dir_exists(buf)) continue; /* The parent doesn't exist, so create it or fail */ if (my_mkdir(buf, 0755) != 0) return FALSE; } } return my_mkdir(path, 0755) == 0 ? TRUE : FALSE; } #else /* HAVE_STAT */ bool dir_create(const char *path) { return FALSE; } #endif /* !HAVE_STAT */ /*** Directory scanning API ***/ /* * For information on what these are meant to do, please read the header file. */ #ifdef WINDOWS /* System-specific struct */ struct ang_dir { HANDLE h; char *first_file; }; ang_dir *my_dopen(const char *dirname) { WIN32_FIND_DATA fd; HANDLE h; ang_dir *dir; /* Try to open it */ h = FindFirstFile(format("%s\\*", dirname), &fd); /* Abort */ if (h == INVALID_HANDLE_VALUE) return NULL; /* Set up the handle */ dir = ZNEW(ang_dir); dir->h = h; dir->first_file = string_make(fd.cFileName); /* Success */ return dir; } bool my_dread(ang_dir *dir, char *fname, size_t len) { WIN32_FIND_DATA fd; BOOL ok; /* Try the first file */ if (dir->first_file) { /* Copy the string across, then free it */ my_strcpy(fname, dir->first_file, len); FREE(dir->first_file); /* Wild success */ return TRUE; } /* Try the next file */ while (1) { ok = FindNextFile(dir->h, &fd); if (!ok) return FALSE; /* Skip directories */ if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY || strcmp(fd.cFileName, ".") == 0 || strcmp(fd.cFileName, "..") == 0) continue; /* Take this one */ break; } /* Copy name */ my_strcpy(fname, fd.cFileName, len); return TRUE; } void my_dclose(ang_dir *dir) { /* Close directory */ if (dir->h) FindClose(dir->h); /* Free memory */ FREE(dir->first_file); FREE(dir); } #else /* WINDOWS */ #ifdef HAVE_DIRENT_H /* Define our ang_dir type */ struct ang_dir { DIR *d; char *dirname; }; ang_dir *my_dopen(const char *dirname) { ang_dir *dir; DIR *d; /* Try to open the directory */ d = opendir(dirname); if (!d) return NULL; /* Allocate memory for the handle */ dir = ZNEW(ang_dir); if (!dir) { closedir(d); return NULL; } /* Set up the handle */ dir->d = d; dir->dirname = string_make(dirname); /* Success */ return dir; } bool my_dread(ang_dir *dir, char *fname, size_t len) { struct dirent *entry; struct stat filedata; char path[1024]; assert(dir != NULL); /* Try reading another entry */ while (1) { entry = readdir(dir->d); if (!entry) return FALSE; path_build(path, sizeof path, dir->dirname, entry->d_name); /* Check to see if it exists */ if (stat(path, &filedata) != 0) continue; /* Check to see if it's a directory */ if (S_ISDIR(filedata.st_mode)) continue; /* We've found something worth returning */ break; } /* Copy the filename */ my_strcpy(fname, entry->d_name, len); return TRUE; } void my_dclose(ang_dir *dir) { /* Close directory */ if (dir->d) closedir(dir->d); /* Free memory */ FREE(dir->dirname); FREE(dir); } #endif /* HAVE_DIRENT_H */ #endif /* WINDOWS */ angband-3.5.1/src/cave.c0000644000175000017500000027321512456456606014323 0ustar chriscchrisc/* * File: cave.c * Purpose: Lighting and update functions * * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "game-event.h" #include "game-cmd.h" #include "monster/mon-util.h" #include "object/tvalsval.h" #include "squelch.h" #include "cmds.h" #include "grafmode.h" /* * Approximate distance between two points. * * When either the X or Y component dwarfs the other component, * this function is almost perfect, and otherwise, it tends to * over-estimate about one grid per fifteen grids of distance. * * Algorithm: hypot(dy,dx) = max(dy,dx) + min(dy,dx) / 2 */ int distance(int y1, int x1, int y2, int x2) { /* Find the absolute y/x distance components */ int ay = abs(y2 - y1); int ax = abs(x2 - x1); /* Approximate the distance */ return ay > ax ? ay + (ax>>1) : ax + (ay>>1); } /* * A simple, fast, integer-based line-of-sight algorithm. By Joseph Hall, * 4116 Brewster Drive, Raleigh NC 27606. Email to jnh@ecemwl.ncsu.edu. * * This function returns TRUE if a "line of sight" can be traced from the * center of the grid (x1,y1) to the center of the grid (x2,y2), with all * of the grids along this path (except for the endpoints) being non-wall * grids. Actually, the "chess knight move" situation is handled by some * special case code which allows the grid diagonally next to the player * to be obstructed, because this yields better gameplay semantics. This * algorithm is totally reflexive, except for "knight move" situations. * * Because this function uses (short) ints for all calculations, overflow * may occur if dx and dy exceed 90. * * Once all the degenerate cases are eliminated, we determine the "slope" * ("m"), and we use special "fixed point" mathematics in which we use a * special "fractional component" for one of the two location components * ("qy" or "qx"), which, along with the slope itself, are "scaled" by a * scale factor equal to "abs(dy*dx*2)" to keep the math simple. Then we * simply travel from start to finish along the longer axis, starting at * the border between the first and second tiles (where the y offset is * thus half the slope), using slope and the fractional component to see * when motion along the shorter axis is necessary. Since we assume that * vision is not blocked by "brushing" the corner of any grid, we must do * some special checks to avoid testing grids which are "brushed" but not * actually "entered". * * Angband three different "line of sight" type concepts, including this * function (which is used almost nowhere), the "project()" method (which * is used for determining the paths of projectables and spells and such), * and the "update_view()" concept (which is used to determine which grids * are "viewable" by the player, which is used for many things, such as * determining which grids are illuminated by the player's torch, and which * grids and monsters can be "seen" by the player, etc). */ bool los(int y1, int x1, int y2, int x2) { /* Delta */ int dx, dy; /* Absolute */ int ax, ay; /* Signs */ int sx, sy; /* Fractions */ int qx, qy; /* Scanners */ int tx, ty; /* Scale factors */ int f1, f2; /* Slope, or 1/Slope, of LOS */ int m; /* Extract the offset */ dy = y2 - y1; dx = x2 - x1; /* Extract the absolute offset */ ay = ABS(dy); ax = ABS(dx); /* Handle adjacent (or identical) grids */ if ((ax < 2) && (ay < 2)) return (TRUE); /* Directly South/North */ if (!dx) { /* South -- check for walls */ if (dy > 0) { for (ty = y1 + 1; ty < y2; ty++) { if (!cave_ispassable(cave, ty, x1)) return (FALSE); } } /* North -- check for walls */ else { for (ty = y1 - 1; ty > y2; ty--) { if (!cave_ispassable(cave, ty, x1)) return (FALSE); } } /* Assume los */ return (TRUE); } /* Directly East/West */ if (!dy) { /* East -- check for walls */ if (dx > 0) { for (tx = x1 + 1; tx < x2; tx++) { if (!cave_ispassable(cave, y1, tx)) return (FALSE); } } /* West -- check for walls */ else { for (tx = x1 - 1; tx > x2; tx--) { if (!cave_ispassable(cave, y1, tx)) return (FALSE); } } /* Assume los */ return (TRUE); } /* Extract some signs */ sx = (dx < 0) ? -1 : 1; sy = (dy < 0) ? -1 : 1; /* Vertical "knights" */ if (ax == 1) { if (ay == 2) { if (cave_ispassable(cave, y1 + sy, x1)) return (TRUE); } } /* Horizontal "knights" */ else if (ay == 1) { if (ax == 2) { if (cave_ispassable(cave, y1, x1 + sx)) return (TRUE); } } /* Calculate scale factor div 2 */ f2 = (ax * ay); /* Calculate scale factor */ f1 = f2 << 1; /* Travel horizontally */ if (ax >= ay) { /* Let m = dy / dx * 2 * (dy * dx) = 2 * dy * dy */ qy = ay * ay; m = qy << 1; tx = x1 + sx; /* Consider the special case where slope == 1. */ if (qy == f2) { ty = y1 + sy; qy -= f1; } else { ty = y1; } /* Note (below) the case (qy == f2), where */ /* the LOS exactly meets the corner of a tile. */ while (x2 - tx) { if (!cave_ispassable(cave, ty, tx)) return (FALSE); qy += m; if (qy < f2) { tx += sx; } else if (qy > f2) { ty += sy; if (!cave_ispassable(cave, ty, tx)) return (FALSE); qy -= f1; tx += sx; } else { ty += sy; qy -= f1; tx += sx; } } } /* Travel vertically */ else { /* Let m = dx / dy * 2 * (dx * dy) = 2 * dx * dx */ qx = ax * ax; m = qx << 1; ty = y1 + sy; if (qx == f2) { tx = x1 + sx; qx -= f1; } else { tx = x1; } /* Note (below) the case (qx == f2), where */ /* the LOS exactly meets the corner of a tile. */ while (y2 - ty) { if (!cave_ispassable(cave, ty, tx)) return (FALSE); qx += m; if (qx < f2) { ty += sy; } else if (qx > f2) { tx += sx; if (!cave_ispassable(cave, ty, tx)) return (FALSE); qx -= f1; ty += sy; } else { tx += sx; qx -= f1; ty += sy; } } } /* Assume los */ return (TRUE); } /* * Returns true if the player's grid is dark */ bool no_light(void) { return (!player_can_see_bold(p_ptr->py, p_ptr->px)); } /* * Determine if a given location may be "destroyed" * * Used by destruction spells, and for placing stairs, etc. */ bool cave_valid_bold(int y, int x) { object_type *o_ptr; /* Forbid perma-grids */ if (cave_isperm(cave, y, x) || cave_isshop(cave, y, x) || cave_isstairs(cave, y, x)) return (FALSE); /* Check objects */ for (o_ptr = get_first_object(y, x); o_ptr; o_ptr = get_next_object(o_ptr)) { /* Forbid artifact grids */ if (o_ptr->artifact) return (FALSE); } /* Accept */ return (TRUE); } /* * Hack -- Hallucinatory monster */ static void hallucinatory_monster(int *a, wchar_t *c) { while (1) { /* Select a random monster */ monster_race *r_ptr = &r_info[randint0(z_info->r_max)]; /* Skip non-entries */ if (!r_ptr->name) continue; /* Retrieve attr/char */ *a = r_ptr->x_attr; *c = r_ptr->x_char; return; } } /* * Hack -- Hallucinatory object */ static void hallucinatory_object(int *a, wchar_t *c) { while (1) { /* Select a random object */ object_kind *k_ptr = &k_info[randint0(z_info->k_max - 1) + 1]; /* Skip non-entries */ if (!k_ptr->name) continue; /* Retrieve attr/char (HACK - without flavors) */ *a = k_ptr->x_attr; *c = k_ptr->x_char; /* HACK - Skip empty entries */ if (*a == 0 || *c == 0) continue; return; } } /* * Translate text colours. * * This translates a color based on the attribute. We use this to set terrain to * be lighter or darker, make metallic monsters shimmer, highlight text under the * mouse, and reduce the colours on mono colour or 16 colour terms to the correct * colour space. * * TODO: Honour the attribute for the term (full color, mono, 16 color) but ensure * that e.g. the lighter version of yellow becomes white in a 16 color term, but * light yellow in a full colour term. */ byte get_color(byte a, int attr, int n) { /* Accept any graphical attr (high bit set) */ if (a & (0x80)) return (a); /* TODO: Honour the attribute for the term (full color, mono, 16 color) */ if (!attr) return(a); /* Translate the color N times */ while (n > 0) { a = color_table[a].color_translate[attr]; n--; } /* Return the modified color */ return (a); } /* * Checks if a square is at the (inner) edge of a trap detect area */ bool dtrap_edge(int y, int x) { /* Check if the square is a dtrap in the first place */ if (!(cave->info2[y][x] & CAVE2_DTRAP)) return FALSE; /* Check for non-dtrap adjacent grids */ if (cave_in_bounds_fully(cave, y + 1, x ) && (!(cave->info2[y + 1][x ] & CAVE2_DTRAP))) return TRUE; if (cave_in_bounds_fully(cave, y , x + 1) && (!(cave->info2[y ][x + 1] & CAVE2_DTRAP))) return TRUE; if (cave_in_bounds_fully(cave, y - 1, x ) && (!(cave->info2[y - 1][x ] & CAVE2_DTRAP))) return TRUE; if (cave_in_bounds_fully(cave, y , x - 1) && (!(cave->info2[y ][x - 1] & CAVE2_DTRAP))) return TRUE; return FALSE; } /** * Apply text lighting effects */ static void grid_get_attr(grid_data *g, int *a) { /* Save the high-bit, since it's used for attr inversion in GCU */ int a0 = *a & 0x80; /* We will never tint traps or treasure */ if (feat_is_known_trap(g->f_idx)) return; /* Remove the high bit so we can add it back again at the end */ *a = (*a & 0x7F); /* Never play with fg colours for treasure */ if (!feat_is_treasure(g->f_idx)) { /* Tint trap detection borders */ if (g->trapborder) *a = (g->in_view ? TERM_L_GREEN : TERM_GREEN); /* Only apply lighting effects when the attr is white -- * this is to stop e.g. doors going grey when out of LOS */ if (*a == TERM_WHITE) { /* If it's a floor tile then we'll tint based on lighting. */ if (g->f_idx == FEAT_FLOOR) switch (g->lighting) { case FEAT_LIGHTING_TORCH: *a = TERM_YELLOW; break; case FEAT_LIGHTING_LIT: *a = TERM_L_DARK; break; case FEAT_LIGHTING_DARK: *a = TERM_L_DARK; break; default: break; } /* If it's another kind of tile, only tint when not in los/torchlight. */ else if (g->f_idx > FEAT_INVIS && (g->lighting == FEAT_LIGHTING_DARK || g->lighting == FEAT_LIGHTING_LIT)) *a = TERM_L_DARK; } else if (feat_is_magma(g->f_idx) || feat_is_quartz(g->f_idx)) { if (!g->in_view) { *a = TERM_L_DARK; } } } /* Hybrid or block walls -- for GCU, then for everyone else */ if (a0) { *a = a0 | *a; } else if (use_graphics == GRAPHICS_NONE && feat_is_wall(g->f_idx)) { if (OPT(hybrid_walls)) *a = *a + (MAX_COLORS * BG_DARK); else if (OPT(solid_walls)) *a = *a + (MAX_COLORS * BG_SAME); } } /* * This function takes a pointer to a grid info struct describing the * contents of a grid location (as obtained through the function map_info) * and fills in the character and attr pairs for display. * * ap and cp are filled with the attr/char pair for the monster, object or * floor tile that is at the "top" of the grid (monsters covering objects, * which cover floor, assuming all are present). * * tap and tcp are filled with the attr/char pair for the floor, regardless * of what is on it. This can be used by graphical displays with * transparency to place an object onto a floor tile, is desired. * * Any lighting effects are also applied to these pairs, clear monsters allow * the underlying colour or feature to show through (ATTR_CLEAR and * CHAR_CLEAR), multi-hued colour-changing (ATTR_MULTI) is applied, and so on. * Technically, the flag "CHAR_MULTI" is supposed to indicate that a monster * looks strange when examined, but this flag is currently ignored. * * NOTES: * This is called pretty frequently, whenever a grid on the map display * needs updating, so don't overcomplicate it. * * The "zero" entry in the feature/object/monster arrays are * used to provide "special" attr/char codes, with "monster zero" being * used for the player attr/char, "object zero" being used for the "pile" * attr/char, and "feature zero" being used for the "darkness" attr/char. * * TODO: * The transformations for tile colors, or brightness for the 16x16 * tiles should be handled differently. One possibility would be to * extend feature_type with attr/char definitions for the different states. * This will probably be done outside of the current text->graphics mappings * though. */ void grid_data_as_text(grid_data *g, int *ap, wchar_t *cp, int *tap, wchar_t *tcp) { feature_type *f_ptr = &f_info[g->f_idx]; int a = f_ptr->x_attr[g->lighting]; wchar_t c = f_ptr->x_char[g->lighting]; /* Check for trap detection boundaries */ if (use_graphics == GRAPHICS_NONE) grid_get_attr(g, &a); else if (g->trapborder && (g->f_idx == FEAT_FLOOR) && (g->m_idx || g->first_kind)) { /* if there is an object or monster here, and this is a plain floor * display the border here rather than an overlay below */ a = f_info[64].x_attr[g->lighting]; /* 64 is the index of the feat that */ c = f_info[64].x_char[g->lighting]; /* holds the trap detect border floor tile */ } /* Save the terrain info for the transparency effects */ (*tap) = a; (*tcp) = c; /* If there's an object, deal with that. */ if (g->unseen_money) { /* $$$ gets an orange star*/ a = object_kind_attr(&k_info[7]); c = object_kind_char(&k_info[7]); } else if (g->unseen_object) { /* Everything else gets a red star */ a = object_kind_attr(&k_info[6]); c = object_kind_char(&k_info[6]); } else if (g->first_kind) { if (g->hallucinate) { /* Just pick a random object to display. */ hallucinatory_object(&a, &c); } else if (g->multiple_objects) { /* Get the "pile" feature instead */ a = object_kind_attr(&k_info[0]); c = object_kind_char(&k_info[0]); } else { /* Normal attr and char */ a = object_kind_attr(g->first_kind); c = object_kind_char(g->first_kind); } } /* If there's a monster */ if (g->m_idx > 0) { if (g->hallucinate) { /* Just pick a random monster to display. */ hallucinatory_monster(&a, &c); } else if (!is_mimicking(cave_monster(cave, g->m_idx))) { monster_type *m_ptr = cave_monster(cave, g->m_idx); byte da; wchar_t dc; /* Desired attr & char */ da = m_ptr->race->x_attr; dc = m_ptr->race->x_char; /* Special attr/char codes */ if (da & 0x80) { /* Use attr */ a = da; /* Use char */ c = dc; } /* Turn uniques purple if desired (violet, actually) */ else if (OPT(purple_uniques) && rf_has(m_ptr->race->flags, RF_UNIQUE)) { /* Use (light) violet attr */ a = TERM_VIOLET; /* Use char */ c = dc; } /* Multi-hued monster */ else if (rf_has(m_ptr->race->flags, RF_ATTR_MULTI) || rf_has(m_ptr->race->flags, RF_ATTR_FLICKER) || rf_has(m_ptr->race->flags, RF_ATTR_RAND)) { /* Multi-hued attr */ a = m_ptr->attr ? m_ptr->attr : da; /* Normal char */ c = dc; } /* Normal monster (not "clear" in any way) */ else if (!flags_test(m_ptr->race->flags, RF_SIZE, RF_ATTR_CLEAR, RF_CHAR_CLEAR, FLAG_END)) { /* Use attr */ a = da; /* Desired attr & char. da is not used, but should a be set to it? */ /*da = m_ptr->race->x_attr;*/ dc = m_ptr->race->x_char; /* Use char */ c = dc; } /* Hack -- Bizarre grid under monster */ else if (a & 0x80) { /* Use attr */ a = da; /* Use char */ c = dc; } /* Normal char, Clear attr, monster */ else if (!rf_has(m_ptr->race->flags, RF_CHAR_CLEAR)) { /* Normal char */ c = dc; } /* Normal attr, Clear char, monster */ else if (!rf_has(m_ptr->race->flags, RF_ATTR_CLEAR)) { /* Normal attr */ a = da; } /* Store the drawing attr so we can use it elsewhere */ m_ptr->attr = a; } } /* Handle "player" */ else if (g->is_player) { monster_race *r_ptr = &r_info[0]; /* Get the "player" attr */ a = r_ptr->x_attr; if ((OPT(hp_changes_color)) && !(a & 0x80)) { switch(p_ptr->chp * 10 / p_ptr->mhp) { case 10: case 9: { a = TERM_WHITE; break; } case 8: case 7: { a = TERM_YELLOW; break; } case 6: case 5: { a = TERM_ORANGE; break; } case 4: case 3: { a = TERM_L_RED; break; } case 2: case 1: case 0: { a = TERM_RED; break; } default: { a = TERM_WHITE; break; } } } /* Get the "player" char */ c = r_ptr->x_char; } else if (g->trapborder && (g->f_idx) && !(g->first_kind) && (use_graphics != GRAPHICS_NONE)) { /* no overlay is used, so we can use the trap border overlay */ a = f_info[65].x_attr[g->lighting]; /* 65 is the index of the feat that */ c = f_info[65].x_char[g->lighting]; /* holds the trap detect border overlay tile */ } /* Result */ (*ap) = a; (*cp) = c; } /* * This function takes a grid location (x, y) and extracts information the * player is allowed to know about it, filling in the grid_data structure * passed in 'g'. * * The information filled in is as follows: * - g->f_idx is filled in with the terrain's feature type, or FEAT_NONE * if the player doesn't know anything about the grid. The function * makes use of the "mimic" field in terrain in order to allow one * feature to look like another (hiding secret doors, invisible traps, * etc). This will return the terrain type the player "Knows" about, * not necessarily the real terrain. * - g->m_idx is set to the monster index, or 0 if there is none (or the * player doesn't know it). * - g->first_kind is set to the object_kind of the first object in a grid * that the player knows about, or NULL for no objects. * - g->muliple_objects is TRUE if there is more than one object in the * grid that the player knows and cares about (to facilitate any special * floor stack symbol that might be used). * - g->in_view is TRUE if the player can currently see the grid - this can * be used to indicate field-of-view, such as through the OPT(view_bright_light) * option. * - g->lighting is set to indicate the lighting level for the grid: * FEAT_LIGHTING_DARK for unlit grids, FEAT_LIGHTING_LIT for inherently light * grids (lit rooms, etc), FEAT_LIGHTING_TORCH for grids lit by the player's * light source, and FEAT_LIGHTING_LOS for grids in the player's line of sight. * Note that lighting is always FEAT_LIGHTING_LIT for known "interesting" grids * like walls. * - g->is_player is TRUE if the player is on the given grid. * - g->hallucinate is TRUE if the player is hallucinating something "strange" * for this grid - this should pick a random monster to show if the m_idx * is non-zero, and a random object if first_kind is non-zero. * * NOTES: * This is called pretty frequently, whenever a grid on the map display * needs updating, so don't overcomplicate it. * * Terrain is remembered separately from objects and monsters, so can be * shown even when the player can't "see" it. This leads to things like * doors out of the player's view still change from closed to open and so on. * * TODO: * Hallucination is currently disabled (it was a display-level hack before, * and we need it to be a knowledge-level hack). The idea is that objects * may turn into different objects, monsters into different monsters, and * terrain may be objects, monsters, or stay the same. */ void map_info(unsigned y, unsigned x, grid_data *g) { object_type *o_ptr; byte info; assert(x < DUNGEON_WID); assert(y < DUNGEON_HGT); info = cave->info[y][x]; /* Default "clear" values, others will be set later where appropriate. */ g->first_kind = NULL; g->multiple_objects = FALSE; g->lighting = FEAT_LIGHTING_DARK; g->unseen_object = FALSE; g->unseen_money = FALSE; g->f_idx = cave->feat[y][x]; if (f_info[g->f_idx].mimic) g->f_idx = f_info[g->f_idx].mimic; g->in_view = (info & CAVE_SEEN) ? TRUE : FALSE; g->is_player = (cave->m_idx[y][x] < 0) ? TRUE : FALSE; g->m_idx = (g->is_player) ? 0 : cave->m_idx[y][x]; g->hallucinate = p_ptr->timed[TMD_IMAGE] ? TRUE : FALSE; g->trapborder = (cave->info2[y][x] & CAVE2_DEDGE) ? TRUE : FALSE; if (g->in_view) { g->lighting = FEAT_LIGHTING_LOS; if (!(info & CAVE_GLOW) && OPT(view_yellow_light)) g->lighting = FEAT_LIGHTING_TORCH; } else if (!(info & CAVE_MARK)) { g->f_idx = FEAT_NONE; } else if ((info & CAVE_GLOW)) { g->lighting = FEAT_LIGHTING_LIT; } /* Objects */ for (o_ptr = get_first_object(y, x); o_ptr; o_ptr = get_next_object(o_ptr)) { if (o_ptr->marked == MARK_AWARE) { /* Distinguish between unseen money and objects */ if (o_ptr->tval == TV_GOLD) { g->unseen_money = TRUE; } else { g->unseen_object = TRUE; } } else if (o_ptr->marked == MARK_SEEN && !squelch_item_ok(o_ptr)) { if (!g->first_kind) { g->first_kind = o_ptr->kind; } else { g->multiple_objects = TRUE; break; } } } /* Monsters */ if (g->m_idx > 0) { /* If the monster isn't "visible", make sure we don't list it.*/ monster_type *m_ptr = cave_monster(cave, g->m_idx); if (!m_ptr->ml) g->m_idx = 0; } /* Rare random hallucination on non-outer walls */ if (g->hallucinate && g->m_idx == 0 && g->first_kind == 0) { if (one_in_(128) && g->f_idx < FEAT_PERM_SOLID) g->m_idx = 1; else if (one_in_(128) && g->f_idx < FEAT_PERM_SOLID) /* if hallucinating, we just need first_kind to not be NULL */ g->first_kind = k_info; else g->hallucinate = FALSE; } assert(g->f_idx <= FEAT_PERM_SOLID); if (!g->hallucinate) assert((int)g->m_idx < cave->mon_max); /* All other g fields are 'flags', mostly booleans. */ } /* * Move the cursor to a given map location. */ static void move_cursor_relative_map(int y, int x) { int ky, kx; term *old; int j; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if (!(op_ptr->window_flag[j] & (PW_MAP))) continue; /* Location relative to panel */ ky = y - t->offset_y; if (tile_height > 1) { ky = tile_height * ky; } /* Verify location */ if ((ky < 0) || (ky >= t->hgt)) continue; /* Location relative to panel */ kx = x - t->offset_x; if (tile_width > 1) { kx = tile_width * kx; } /* Verify location */ if ((kx < 0) || (kx >= t->wid)) continue; /* Go there */ old = Term; Term_activate(t); (void)Term_gotoxy(kx, ky); Term_activate(old); } } /* * Move the cursor to a given map location. * * The main screen will always be at least 24x80 in size. */ void move_cursor_relative(int y, int x) { int ky, kx; int vy, vx; /* Move the cursor on map sub-windows */ move_cursor_relative_map(y, x); /* Location relative to panel */ ky = y - Term->offset_y; /* Verify location */ if ((ky < 0) || (ky >= SCREEN_HGT)) return; /* Location relative to panel */ kx = x - Term->offset_x; /* Verify location */ if ((kx < 0) || (kx >= SCREEN_WID)) return; /* Location in window */ vy = ky + ROW_MAP; /* Location in window */ vx = kx + COL_MAP; if (tile_width > 1) { vx += (tile_width - 1) * kx; } if (tile_height > 1) { vy += (tile_height - 1) * ky; } /* Go there */ (void)Term_gotoxy(vx, vy); } /* * Display an attr/char pair at the given map location * * Note the inline use of "panel_contains()" for efficiency. * * Note the use of "Term_queue_char()" for efficiency. */ static void print_rel_map(wchar_t c, byte a, int y, int x) { int ky, kx; int j; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if (!(op_ptr->window_flag[j] & (PW_MAP))) continue; /* Location relative to panel */ ky = y - t->offset_y; if (tile_height > 1) { ky = tile_height * ky; if (ky + 1 >= t->hgt) continue; } /* Verify location */ if ((ky < 0) || (ky >= t->hgt)) continue; /* Location relative to panel */ kx = x - t->offset_x; if (tile_width > 1) { kx = tile_width * kx; if (kx + 1 >= t->wid) continue; } /* Verify location */ if ((kx < 0) || (kx >= t->wid)) continue; /* Hack -- Queue it */ Term_queue_char(t, kx, ky, a, c, 0, 0); if ((tile_width > 1) || (tile_height > 1)) Term_big_queue_char(Term, kx, ky, a, c, 0, 0); } } /* * Display an attr/char pair at the given map location * * Note the inline use of "panel_contains()" for efficiency. * * Note the use of "Term_queue_char()" for efficiency. * * The main screen will always be at least 24x80 in size. */ void print_rel(wchar_t c, byte a, int y, int x) { int ky, kx; int vy, vx; /* Print on map sub-windows */ print_rel_map(c, a, y, x); /* Location relative to panel */ ky = y - Term->offset_y; /* Verify location */ if ((ky < 0) || (ky >= SCREEN_HGT)) return; /* Location relative to panel */ kx = x - Term->offset_x; /* Verify location */ if ((kx < 0) || (kx >= SCREEN_WID)) return; /* Get right position */ vx = COL_MAP + (tile_width * kx); vy = ROW_MAP + (tile_height * ky); /* Hack -- Queue it */ Term_queue_char(Term, vx, vy, a, c, 0, 0); if ((tile_width > 1) || (tile_height > 1)) Term_big_queue_char(Term, vx, vy, a, c, 0, 0); } /* * Memorize interesting viewable object/features in the given grid * * This function should only be called on "legal" grids. * * This function will memorize the object and/or feature in the given grid, * if they are (1) see-able and (2) interesting. Note that all objects are * interesting, all terrain features except floors (and invisible traps) are * interesting, and floors (and invisible traps) are interesting sometimes * (depending on various options involving the illumination of floor grids). * * The automatic memorization of all objects and non-floor terrain features * as soon as they are displayed allows incredible amounts of optimization * in various places, especially "map_info()" and this function itself. * * Note that the memorization of objects is completely separate from the * memorization of terrain features, preventing annoying floor memorization * when a detected object is picked up from a dark floor, and object * memorization when an object is dropped into a floor grid which is * memorized but out-of-sight. * * This function should be called every time the "memorization" of a grid * (or the object in a grid) is called into question, such as when an object * is created in a grid, when a terrain feature "changes" from "floor" to * "non-floor", and when any grid becomes "see-able" for any reason. * * This function is called primarily from the "update_view()" function, for * each grid which becomes newly "see-able". */ void cave_note_spot(struct cave *c, int y, int x) { object_type *o_ptr; /* Require "seen" flag */ if (!(c->info[y][x] & CAVE_SEEN)) return; for (o_ptr = get_first_object(y, x); o_ptr; o_ptr = get_next_object(o_ptr)) o_ptr->marked = MARK_SEEN; if (c->info[y][x] & CAVE_MARK) return; /* Memorize this grid */ cave->info[y][x] |= (CAVE_MARK); } /* * Redraw (on the screen) a given map location * * This function should only be called on "legal" grids. */ void cave_light_spot(struct cave *c, int y, int x) { event_signal_point(EVENT_MAP, x, y); } static void prt_map_aux(void) { int a, ta; wchar_t c, tc; grid_data g; int y, x; int vy, vx; int ty, tx; int j; /* Scan windows */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *t = angband_term[j]; /* No window */ if (!t) continue; /* No relevant flags */ if (!(op_ptr->window_flag[j] & (PW_MAP))) continue; /* Assume screen */ ty = t->offset_y + (t->hgt / tile_height); tx = t->offset_x + (t->wid / tile_width); /* Dump the map */ for (y = t->offset_y, vy = 0; y < ty; vy++, y++) { if (vy + tile_height - 1 >= t->hgt) continue; for (x = t->offset_x, vx = 0; x < tx; vx++, x++) { /* Check bounds */ if (!cave_in_bounds(cave, y, x)) continue; if (vx + tile_width - 1 >= t->wid) continue; /* Determine what is there */ map_info(y, x, &g); grid_data_as_text(&g, &a, &c, &ta, &tc); Term_queue_char(t, vx, vy, a, c, ta, tc); if ((tile_width > 1) || (tile_height > 1)) Term_big_queue_char(t, vx, vy, 255, -1, 0, 0); } } } } /* * Redraw (on the screen) the current map panel * * Note the inline use of "light_spot()" for efficiency. * * The main screen will always be at least 24x80 in size. */ void prt_map(void) { int a, ta; wchar_t c, tc; grid_data g; int y, x; int vy, vx; int ty, tx; /* Redraw map sub-windows */ prt_map_aux(); /* Assume screen */ ty = Term->offset_y + SCREEN_HGT; tx = Term->offset_x + SCREEN_WID; /* Dump the map */ for (y = Term->offset_y, vy = ROW_MAP; y < ty; vy+=tile_height, y++) { for (x = Term->offset_x, vx = COL_MAP; x < tx; vx+=tile_width, x++) { /* Check bounds */ if (!cave_in_bounds(cave, y, x)) continue; /* Determine what is there */ map_info(y, x, &g); grid_data_as_text(&g, &a, &c, &ta, &tc); /* Hack -- Queue it */ Term_queue_char(Term, vx, vy, a, c, ta, tc); if ((tile_width > 1) || (tile_height > 1)) { Term_big_queue_char(Term, vx, vy, a, c, TERM_WHITE, L' '); } } } } /* * Display a "small-scale" map of the dungeon in the active Term. * * Note that this function must "disable" the special lighting effects so * that the "priority" function will work. * * Note the use of a specialized "priority" function to allow this function * to work with any graphic attr/char mappings, and the attempts to optimize * this function where possible. * * If "cy" and "cx" are not NULL, then returns the screen location at which * the player was displayed, so the cursor can be moved to that location, * and restricts the horizontal map size to SCREEN_WID. Otherwise, nothing * is returned (obviously), and no restrictions are enforced. */ void display_map(int *cy, int *cx) { int py = p_ptr->py; int px = p_ptr->px; int map_hgt, map_wid; int dungeon_hgt, dungeon_wid; int row, col; int x, y; grid_data g; int a, ta; wchar_t c, tc; byte tp; /* Large array on the stack */ byte mp[DUNGEON_HGT][DUNGEON_WID]; monster_race *r_ptr = &r_info[0]; /* Desired map height */ map_hgt = Term->hgt - 2; map_wid = Term->wid - 2; dungeon_hgt = cave->height; dungeon_wid = cave->width; /* Prevent accidents */ if (map_hgt > dungeon_hgt) map_hgt = dungeon_hgt; if (map_wid > dungeon_wid) map_wid = dungeon_wid; /* Prevent accidents */ if ((map_wid < 1) || (map_hgt < 1)) return; /* Nothing here */ a = TERM_WHITE; ta = TERM_WHITE; tc = L' '; /* Clear the priorities */ for (y = 0; y < map_hgt; ++y) { for (x = 0; x < map_wid; ++x) { /* No priority */ mp[y][x] = 0; } } /* Draw a box around the edge of the term */ window_make(0, 0, map_wid + 1, map_hgt + 1); /* Analyze the actual map */ for (y = 0; y < dungeon_hgt; y++) { for (x = 0; x < dungeon_wid; x++) { row = (y * map_hgt / dungeon_hgt); col = (x * map_wid / dungeon_wid); if (tile_width > 1) col = col - (col % tile_width); if (tile_height > 1) row = row - (row % tile_height); /* Get the attr/char at that map location */ map_info(y, x, &g); /* Get the priority of that attr/char */ tp = f_info[g.f_idx].priority; /* Save "best" */ if (mp[row][col] < tp) { /* Hack - make every grid on the map lit */ g.lighting = FEAT_LIGHTING_LIT; grid_data_as_text(&g, &a, &c, &ta, &tc); Term_queue_char(Term, col + 1, row + 1, a, c, ta, tc); if ((tile_width > 1) || (tile_height > 1)) Term_big_queue_char(Term, col + 1, row + 1, 255, -1, 0, 0); /* Save priority */ mp[row][col] = tp; } } } /*** Display the player ***/ /* Player location */ row = (py * map_hgt / dungeon_hgt); col = (px * map_wid / dungeon_wid); if (tile_width > 1) col = col - (col % tile_width); if (tile_height > 1) row = row - (row % tile_height); /* Get the "player" tile */ ta = r_ptr->x_attr; tc = r_ptr->x_char; /* Draw the player */ Term_putch(col + 1, row + 1, ta, tc); if ((tile_width > 1) || (tile_height > 1)) Term_big_putch(col + 1, row + 1, ta, tc); /* Return player location */ if (cy != NULL) (*cy) = row + 1; if (cx != NULL) (*cx) = col + 1; } /* * Display a "small-scale" map of the dungeon. * * Note that the "player" is always displayed on the map. */ void do_cmd_view_map(void) { int cy, cx; byte w, h; const char *prompt = "Hit any key to continue"; if (Term->view_map_hook) { (*(Term->view_map_hook))(Term); return; } /* Save screen */ screen_save(); /* Note */ prt("Please wait...", 0, 0); /* Flush */ Term_fresh(); /* Clear the screen */ Term_clear(); /* store the tile multipliers */ w = tile_width; h = tile_height; tile_width = 1; tile_height = 1; /* Display the map */ display_map(&cy, &cx); /* Show the prompt */ put_str(prompt, Term->hgt - 1, Term->wid / 2 - strlen(prompt) / 2); /* Highlight the player */ Term_gotoxy(cx, cy); /* Get any key */ (void)anykey(); /* Restore the tile multipliers */ tile_width = w; tile_height = h; /* Load screen */ screen_load(); } /* * Some comments on the dungeon related data structures and functions... * * Angband is primarily a dungeon exploration game, and it should come as * no surprise that the internal representation of the dungeon has evolved * over time in much the same way as the game itself, to provide semantic * changes to the game itself, to make the code simpler to understand, and * to make the executable itself faster or more efficient in various ways. * * There are a variety of dungeon related data structures, and associated * functions, which store information about the dungeon, and provide methods * by which this information can be accessed or modified. * * Some of this information applies to the dungeon as a whole, such as the * list of unique monsters which are still alive. Some of this information * only applies to the current dungeon level, such as the current depth, or * the list of monsters currently inhabiting the level. And some of the * information only applies to a single grid of the current dungeon level, * such as whether the grid is illuminated, or whether the grid contains a * monster, or whether the grid can be seen by the player. If Angband was * to be turned into a multi-player game, some of the information currently * associated with the dungeon should really be associated with the player, * such as whether a given grid is viewable by a given player. * * One of the major bottlenecks in ancient versions of Angband was in the * calculation of "line of sight" from the player to various grids, such * as those containing monsters, using the relatively expensive "los()" * function. This was such a nasty bottleneck that a lot of silly things * were done to reduce the dependancy on "line of sight", for example, you * could not "see" any grids in a lit room until you actually entered the * room, at which point every grid in the room became "illuminated" and * all of the grids in the room were "memorized" forever. Other major * bottlenecks involved the determination of whether a grid was lit by the * player's torch, and whether a grid blocked the player's line of sight. * These bottlenecks led to the development of special new functions to * optimize issues involved with "line of sight" and "torch lit grids". * These optimizations led to entirely new additions to the game, such as * the ability to display the player's entire field of view using different * colors than were used for the "memorized" portions of the dungeon, and * the ability to memorize dark floor grids, but to indicate by the way in * which they are displayed that they are not actually illuminated. And * of course many of them simply made the game itself faster or more fun. * Also, over time, the definition of "line of sight" has been relaxed to * allow the player to see a wider "field of view", which is slightly more * realistic, and only slightly more expensive to maintain. * * Currently, a lot of the information about the dungeon is stored in ways * that make it very efficient to access or modify the information, while * still attempting to be relatively conservative about memory usage, even * if this means that some information is stored in multiple places, or in * ways which require the use of special code idioms. For example, each * monster record in the monster array contains the location of the monster, * and each cave grid has an index into the monster array, or a zero if no * monster is in the grid. This allows the monster code to efficiently see * where the monster is located, while allowing the dungeon code to quickly * determine not only if a monster is present in a given grid, but also to * find out which monster. The extra space used to store the information * twice is inconsequential compared to the speed increase. * * Some of the information about the dungeon is used by functions which can * constitute the "critical efficiency path" of the game itself, and so the * way in which they are stored and accessed has been optimized in order to * optimize the game itself. For example, the "update_view()" function was * originally created to speed up the game itself (when the player was not * running), but then it took on extra responsibility as the provider of the * new "special effects lighting code", and became one of the most important * bottlenecks when the player was running. So many rounds of optimization * were performed on both the function itself, and the data structures which * it uses, resulting eventually in a function which not only made the game * faster than before, but which was responsible for even more calculations * (including the determination of which grids are "viewable" by the player, * which grids are illuminated by the player's torch, and which grids can be * "seen" in some way by the player), as well as for providing the guts of * the special effects lighting code, and for the efficient redisplay of any * grids whose visual representation may have changed. * * Several pieces of information about each cave grid are stored in various * two dimensional arrays, with one unit of information for each grid in the * dungeon. Some of these arrays have been intentionally expanded by a small * factor to make the two dimensional array accesses faster by allowing the * use of shifting instead of multiplication. * * Several pieces of information about each cave grid are stored in the * "cave->info" array, which is a special two dimensional array of bytes, * one for each cave grid, each containing eight separate "flags" which * describe some property of the cave grid. These flags can be checked and * modified extremely quickly, especially when special idioms are used to * force the compiler to keep a local register pointing to the base of the * array. Special location offset macros can be used to minimize the number * of computations which must be performed at runtime. Note that using a * byte for each flag set may be slightly more efficient than using a larger * unit, so if another flag (or two) is needed later, and it must be fast, * then the two existing flags which do not have to be fast should be moved * out into some other data structure and the new flags should take their * place. This may require a few minor changes in the savefile code. * * The "CAVE_ROOM" flag is saved in the savefile and is used to determine * which grids are part of "rooms", and thus which grids are affected by * "illumination" spells. This flag does not have to be very fast. * * The "CAVE_VAULT" flag is saved in the savefile and is used to determine * which grids are part of "vaults", and thus which grids cannot serve as * the destinations of player teleportation. This flag does not have to * be very fast. * * The "CAVE_MARK" flag is saved in the savefile and is used to determine * which grids have been "memorized" by the player. This flag is used by * the "map_info()" function to determine if a grid should be displayed. * This flag is used in a few other places to determine if the player can * "know" about a given grid. This flag must be very fast. * * The "CAVE_GLOW" flag is saved in the savefile and is used to determine * which grids are "permanently illuminated". This flag is used by the * "update_view()" function to help determine which viewable flags may * be "seen" by the player. This flag is used by the "map_info" function * to determine if a grid is only lit by the player's torch. This flag * has special semantics for wall grids (see "update_view()"). This flag * must be very fast. * * The "CAVE_WALL" flag is used to determine which grids block the player's * line of sight. This flag is used by the "update_view()" function to * determine which grids block line of sight, and to help determine which * grids can be "seen" by the player. This flag must be very fast. * * The "CAVE_VIEW" flag is used to determine which grids are currently in * line of sight of the player. This flag is set by (and used by) the * "update_view()" function. This flag is used by any code which needs to * know if the player can "view" a given grid. This flag is used by the * "map_info()" function for some optional special lighting effects. The * "player_has_los_bold()" macro wraps an abstraction around this flag, but * certain code idioms are much more efficient. This flag is used to check * if a modification to a terrain feature might affect the player's field of * view. This flag is used to see if certain monsters are "visible" to the * player. This flag is used to allow any monster in the player's field of * view to "sense" the presence of the player. This flag must be very fast. * * The "CAVE_SEEN" flag is used to determine which grids are currently in * line of sight of the player and also illuminated in some way. This flag * is set by the "update_view()" function, using computations based on the * "CAVE_VIEW" and "CAVE_WALL" and "CAVE_GLOW" flags of various grids. This * flag is used by any code which needs to know if the player can "see" a * given grid. This flag is used by the "map_info()" function both to see * if a given "boring" grid can be seen by the player, and for some optional * special lighting effects. The "player_can_see_bold()" macro wraps an * abstraction around this flag, but certain code idioms are much more * efficient. This flag is used to see if certain monsters are "visible" to * the player. This flag is never set for a grid unless "CAVE_VIEW" is also * set for the grid. Whenever the "CAVE_WALL" or "CAVE_GLOW" flag changes * for a grid which has the "CAVE_VIEW" flag set, the "CAVE_SEEN" flag must * be recalculated. The simplest way to do this is to call "forget_view()" * and "update_view()" whenever the "CAVE_WALL" or "CAVE_GLOW" flags change * for a grid which has "CAVE_VIEW" set. This flag must be very fast. * * The "CAVE_WASSEEN" flag is used for a variety of temporary purposes. This * flag is used to determine if the "CAVE_SEEN" flag for a grid has changed * during the "update_view()" function. This flag is used to "spread" light * or darkness through a room. This flag is used by the "monster flow code". * This flag must always be cleared by any code which sets it, often, this * can be optimized by the use of the special "temp_g" array. This flag must * be very fast. * * Note that the "CAVE_MARK" flag is used for many reasons, some of which * are strictly for optimization purposes. The "CAVE_MARK" flag means that * even if the player cannot "see" the grid, he "knows" about the terrain in * that grid. This is used to "memorize" grids when they are first "seen" by * the player, and to allow certain grids to be "detected" by certain magic. * Note that most grids are always memorized when they are first "seen", but * "boring" grids (floor grids) are only memorized if the "OPT(view_torch_grids)" * option is set, or if the "OPT(view_perma_grids)" option is set, and the grid * in question has the "CAVE_GLOW" flag set. * * Objects are "memorized" in a different way, using a special "marked" flag * on the object itself, which is set when an object is observed or detected. * This allows objects to be "memorized" independant of the terrain features. * * The "update_view()" function is an extremely important function. It is * called only when the player moves, significant terrain changes, or the * player's blindness or torch radius changes. Note that when the player * is resting, or performing any repeated actions (like digging, disarming, * farming, etc), there is no need to call the "update_view()" function, so * even if it was not very efficient, this would really only matter when the * player was "running" through the dungeon. It sets the "CAVE_VIEW" flag * on every cave grid in the player's field of view, and maintains an array * of all such grids in the global "view_g" array. It also checks the torch * radius of the player, and sets the "CAVE_SEEN" flag for every grid which * is in the "field of view" of the player and which is also "illuminated", * either by the players torch (if any) or by any permanent light source. * It could use and help maintain information about multiple light sources, * which would be helpful in a multi-player version of Angband. * * The "update_view()" function maintains the special "view_g" array, which * contains exactly those grids which have the "CAVE_VIEW" flag set. This * array is used by "update_view()" to (only) memorize grids which become * newly "seen", and to (only) redraw grids whose "seen" value changes, which * allows the use of some interesting (and very efficient) "special lighting * effects". In addition, this array could be used elsewhere to quickly scan * through all the grids which are in the player's field of view. * * Note that the "update_view()" function allows, among other things, a room * to be "partially" seen as the player approaches it, with a growing cone * of floor appearing as the player gets closer to the door. Also, by not * turning on the "memorize perma-lit grids" option, the player will only * "see" those floor grids which are actually in line of sight. And best * of all, you can now activate the special lighting effects to indicate * which grids are actually in the player's field of view by using dimmer * colors for grids which are not in the player's field of view, and/or to * indicate which grids are illuminated only by the player's torch by using * the color yellow for those grids. * * The old "update_view()" algorithm uses the special "CAVE_EASY" flag as a * temporary internal flag to mark those grids which are not only in view, * but which are also "easily" in line of sight of the player. This flag * is actually just the "CAVE_SEEN" flag, and the "update_view()" function * makes sure to clear it for all old "CAVE_SEEN" grids, and then use it in * the algorithm as "CAVE_EASY", and then clear it for all "CAVE_EASY" grids, * and then reset it as appropriate for all new "CAVE_SEEN" grids. This is * kind of messy, but it works. The old algorithm may disappear eventually. * * The new "update_view()" algorithm uses a faster and more mathematically * correct algorithm, assisted by a large machine generated static array, to * determine the "CAVE_VIEW" and "CAVE_SEEN" flags simultaneously. See below. * * It seems as though slight modifications to the "update_view()" functions * would allow us to determine "reverse" line-of-sight as well as "normal" * line-of-sight", which would allow monsters to have a more "correct" way * to determine if they can "see" the player, since right now, they "cheat" * somewhat and assume that if the player has "line of sight" to them, then * they can "pretend" that they have "line of sight" to the player. But if * such a change was attempted, the monsters would actually start to exhibit * some undesirable behavior, such as "freezing" near the entrances to long * hallways containing the player, and code would have to be added to make * the monsters move around even if the player was not detectable, and to * "remember" where the player was last seen, to avoid looking stupid. * * Note that the "CAVE_GLOW" flag means that a grid is permanently lit in * some way. However, for the player to "see" the grid, as determined by * the "CAVE_SEEN" flag, the player must not be blind, the grid must have * the "CAVE_VIEW" flag set, and if the grid is a "wall" grid, and it is * not lit by the player's torch, then it must touch a grid which does not * have the "CAVE_WALL" flag set, but which does have both the "CAVE_GLOW" * and "CAVE_VIEW" flags set. This last part about wall grids is induced * by the semantics of "CAVE_GLOW" as applied to wall grids, and checking * the technical requirements can be very expensive, especially since the * grid may be touching some "illegal" grids. Luckily, it is more or less * correct to restrict the "touching" grids from the eight "possible" grids * to the (at most) three grids which are touching the grid, and which are * closer to the player than the grid itself, which eliminates more than * half of the work, including all of the potentially "illegal" grids, if * at most one of the three grids is a "diagonal" grid. In addition, in * almost every situation, it is possible to ignore the "CAVE_VIEW" flag * on these three "touching" grids, for a variety of technical reasons. * Finally, note that in most situations, it is only necessary to check * a single "touching" grid, in fact, the grid which is strictly closest * to the player of all the touching grids, and in fact, it is normally * only necessary to check the "CAVE_GLOW" flag of that grid, again, for * various technical reasons. However, one of the situations which does * not work with this last reduction is the very common one in which the * player approaches an illuminated room from a dark hallway, in which the * two wall grids which form the "entrance" to the room would not be marked * as "CAVE_SEEN", since of the three "touching" grids nearer to the player * than each wall grid, only the farthest of these grids is itself marked * "CAVE_GLOW". * * * Here are some pictures of the legal "light source" radius values, in * which the numbers indicate the "order" in which the grids could have * been calculated, if desired. Note that the code will work with larger * radiuses, though currently yields such a radius, and the game would * become slower in some situations if it did. * * Rad=0 Rad=1 Rad=2 Rad=3 * No-Light Torch,etc Lantern Artifacts * * 333 * 333 43334 * 212 32123 3321233 * @ 1@1 31@13 331@133 * 212 32123 3321233 * 333 43334 * 333 * * * Here is an illustration of the two different "update_view()" algorithms, * in which the grids marked "%" are pillars, and the grids marked "?" are * not in line of sight of the player. * * * Sample situation * * ##################### * ############.%.%.%.%# * #...@..#####........# * #............%.%.%.%# * #......#####........# * ############........# * ##################### * * * New Algorithm Old Algorithm * * ########????????????? ########????????????? * #...@..#????????????? #...@..#????????????? * #...........????????? #.........??????????? * #......#####.....???? #......####?????????? * ########?????????...# ########????????????? * * ########????????????? ########????????????? * #.@....#????????????? #.@....#????????????? * #............%??????? #...........????????? * #......#####........? #......#####????????? * ########??????????..# ########????????????? * * ########????????????? ########?????%??????? * #......#####........# #......#####..??????? * #.@..........%??????? #.@..........%??????? * #......#####........# #......#####..??????? * ########????????????? ########????????????? * * ########??????????..# ########????????????? * #......#####........? #......#####????????? * #............%??????? #...........????????? * #.@....#????????????? #.@....#????????????? * ########????????????? ########????????????? * * ########?????????%??? ########????????????? * #......#####.....???? #......####?????????? * #...........????????? #.........??????????? * #...@..#????????????? #...@..#????????????? * ########????????????? ########????????????? */ /* * Forget the "CAVE_VIEW" grids, redrawing as needed */ void forget_view(struct cave *c) { int x, y; for (y = 0; y < c->height; y++) { for (x = 0; x < c->width; x++) { if (!cave_isview(c, y, x)) continue; c->info[y][x] &= ~(CAVE_VIEW | CAVE_SEEN); cave_light_spot(c, y, x); } } } /* * Calculate the complete field of view using a new algorithm * * If "view_g" and "temp_g" were global pointers to arrays of grids, as * opposed to actual arrays of grids, then we could be more efficient by * using "pointer swapping". * * Note the following idiom, which is used in the function below. * This idiom processes each "octant" of the field of view, in a * clockwise manner, starting with the east strip, south side, * and for each octant, allows a simple calculation to set "g" * equal to the proper grids, relative to "pg", in the octant. * * for (o2 = 0; o2 < 8; o2++) * ... * g = pg + p->grid[o2]; * ... * * * Normally, vision along the major axes is more likely than vision * along the diagonal axes, so we check the bits corresponding to * the lines of sight near the major axes first. * * We use the "temp_g" array (and the "CAVE_WASSEEN" flag) to keep track of * which grids were previously marked "CAVE_SEEN", since only those grids * whose "CAVE_SEEN" value changes during this routine must be redrawn. * * This function is now responsible for maintaining the "CAVE_SEEN" * flags as well as the "CAVE_VIEW" flags, which is good, because * the only grids which normally need to be memorized and/or redrawn * are the ones whose "CAVE_SEEN" flag changes during this routine. * * Basically, this function divides the "octagon of view" into octants of * grids (where grids on the main axes and diagonal axes are "shared" by * two octants), and processes each octant one at a time, processing each * octant one grid at a time, processing only those grids which "might" be * viewable, and setting the "CAVE_VIEW" flag for each grid for which there * is an (unobstructed) line of sight from the center of the player grid to * any internal point in the grid (and collecting these "CAVE_VIEW" grids * into the "view_g" array), and setting the "CAVE_SEEN" flag for the grid * if, in addition, the grid is "illuminated" in some way. * * This function relies on a theorem (suggested and proven by Mat Hostetter) * which states that in each octant of a field of view, a given grid will * be "intersected" by one or more unobstructed "lines of sight" from the * center of the player grid if and only if it is "intersected" by at least * one such unobstructed "line of sight" which passes directly through some * corner of some grid in the octant which is not shared by any other octant. * The proof is based on the fact that there are at least three significant * lines of sight involving any non-shared grid in any octant, one which * intersects the grid and passes though the corner of the grid closest to * the player, and two which "brush" the grid, passing through the "outer" * corners of the grid, and that any line of sight which intersects a grid * without passing through the corner of a grid in the octant can be "slid" * slowly towards the corner of the grid closest to the player, until it * either reaches it or until it brushes the corner of another grid which * is closer to the player, and in either case, the existanc of a suitable * line of sight is thus demonstrated. * * It turns out that in each octant of the radius 20 "octagon of view", * there are 161 grids (with 128 not shared by any other octant), and there * are exactly 126 distinct "lines of sight" passing from the center of the * player grid through any corner of any non-shared grid in the octant. To * determine if a grid is "viewable" by the player, therefore, you need to * simply show that one of these 126 lines of sight intersects the grid but * does not intersect any wall grid closer to the player. So we simply use * a bit vector with 126 bits to represent the set of interesting lines of * sight which have not yet been obstructed by wall grids, and then we scan * all the grids in the octant, moving outwards from the player grid. For * each grid, if any of the lines of sight which intersect that grid have not * yet been obstructed, then the grid is viewable. Furthermore, if the grid * is a wall grid, then all of the lines of sight which intersect the grid * should be marked as obstructed for future reference. Also, we only need * to check those grids for whom at least one of the "parents" was a viewable * non-wall grid, where the parents include the two grids touching the grid * but closer to the player grid (one adjacent, and one diagonal). For the * bit vector, we simply use 4 32-bit integers. All of the static values * which are needed by this function are stored in the large "vinfo" array * (above), which is machine generated by another program. XXX XXX XXX * * Hack -- The queue must be able to hold more than VINFO_MAX_GRIDS grids * because the grids at the edge of the field of view use "grid zero" as * their children, and the queue must be able to hold several of these * special grids. Because the actual number of required grids is bizarre, * we simply allocate twice as many as we would normally need. XXX XXX XXX */ static void mark_wasseen(struct cave *c) { int x, y; /* Save the old "view" grids for later */ for (y = 0; y < c->height; y++) { for (x = 0; x < c->width; x++) { if (c->info[y][x] & CAVE_SEEN) c->info[y][x] |= CAVE_WASSEEN; c->info[y][x] &= ~(CAVE_VIEW | CAVE_SEEN); } } } static void add_monster_lights(struct cave *c, struct loc from) { int i, j, k; /* Scan monster list and add monster lights */ for (k = 1; k < z_info->m_max; k++) { /* Check the k'th monster */ struct monster *m = cave_monster(c, k); bool in_los = los(from.y, from.x, m->fy, m->fx); /* Skip dead monsters */ if (!m->race) continue; /* Skip monsters not carrying light */ if (!rf_has(m->race->flags, RF_HAS_LIGHT)) continue; /* Light a 3x3 box centered on the monster */ for (i = -1; i <= 1; i++) { for (j = -1; j <= 1; j++) { int sy = m->fy + i; int sx = m->fx + j; /* If the monster isn't visible we can only light open tiles */ if (!in_los && !cave_ispassable(cave, sy, sx)) continue; /* If the tile is too far away we won't light it */ if (distance(from.y, from.x, sy, sx) > MAX_SIGHT) continue; /* If the tile itself isn't in LOS, don't light it */ if (!los(from.y, from.x, sy, sx)) continue; /* Mark the square lit and seen */ c->info[sy][sx] |= (CAVE_VIEW | CAVE_SEEN); } } } } static void update_one(struct cave *c, int y, int x, int blind) { if (blind) c->info[y][x] &= ~CAVE_SEEN; /* Square went from unseen -> seen */ if (cave_isseen(c, y, x) && !cave_wasseen(c, y, x)) { if (cave_isfeel(c, y, x)) { c->feeling_squares++; c->info2[y][x] &= ~CAVE2_FEEL; /* Don't display feeling if it will display for the new level */ if ((c->feeling_squares == FEELING1) && !character_xtra) display_feeling(TRUE); } cave_note_spot(c, y, x); cave_light_spot(c, y, x); } /* Square went from seen -> unseen */ if (!cave_isseen(c, y, x) && cave_wasseen(c, y, x)) cave_light_spot(c, y, x); c->info[y][x] &= ~CAVE_WASSEEN; } static void become_viewable(struct cave *c, int y, int x, int lit, int py, int px) { int xc = x; int yc = y; if (cave_isview(c, y, x)) return; c->info[y][x] |= CAVE_VIEW; if (lit) c->info[y][x] |= CAVE_SEEN; if (cave_isglow(c, y, x)) { if (cave_iswall(c, y, x)) { /* For walls, move a bit towards the player. * TODO(elly): huh? why? */ xc = (x < px) ? (x + 1) : (x > px) ? (x - 1) : x; yc = (y < py) ? (y + 1) : (y > py) ? (y - 1) : y; } if (cave_isglow(c, yc, xc)) c->info[y][x] |= CAVE_SEEN; } } static void update_view_one(struct cave *c, int y, int x, int radius, int py, int px) { int xc = x; int yc = y; int d = distance(y, x, py, px); int lit = d < radius; if (d > MAX_SIGHT) return; /* Special case for wall lighting. If we are a wall and the square in * the direction of the player is in LOS, we are in LOS. This avoids * situations like: * #1############# * #............@# * ############### * where the wall cell marked '1' would not be lit because the LOS * algorithm runs into the adjacent wall cell. */ if (cave_iswall(c, y, x)) { int dx = x - px; int dy = y - py; int ax = ABS(dx); int ay = ABS(dy); int sx = dx > 0 ? 1 : -1; int sy = dy > 0 ? 1 : -1; xc = (x < px) ? (x + 1) : (x > px) ? (x - 1) : x; yc = (y < py) ? (y + 1) : (y > py) ? (y - 1) : y; /* Check that the cell we're trying to steal LOS from isn't a * wall. If we don't do this, double-thickness walls will have * both sides visible. */ if (cave_iswall(c, yc, xc)) { xc = x; yc = y; } /* Check that we got here via the 'knight's move' rule. If so, * don't steal LOS. */ if (ax == 2 && ay == 1) { if ( !cave_iswall(c, y, x - sx) && cave_iswall(c, y - sy, x - sx)) { xc = x; yc = y; } } else if (ax == 1 && ay == 2) { if ( !cave_iswall(c, y - sy, x) && cave_iswall(c, y - sy, x - sx)) { xc = x; yc = y; } } } if (los(py, px, yc, xc)) become_viewable(c, y, x, lit, py, px); } void update_view(struct cave *c, struct player *p) { int x, y; int radius; mark_wasseen(c); /* Extract "radius" value */ radius = p->cur_light; /* Handle real light */ if (radius > 0) ++radius; add_monster_lights(c, loc(p->px, p->py)); /* Assume we can view the player grid */ c->info[p->py][p->px] |= CAVE_VIEW; if (radius > 0 || cave_isglow(c, p->py, p->px)) c->info[p->py][p->px] |= CAVE_SEEN; /* View squares we have LOS to */ for (y = 0; y < c->height; y++) for (x = 0; x < c->width; x++) update_view_one(cave, y, x, radius, p->py, p->px); /*** Step 3 -- Complete the algorithm ***/ for (y = 0; y < c->height; y++) for (x = 0; x < c->width; x++) update_one(c, y, x, p->timed[TMD_BLIND]); } /* * Size of the circular queue used by "update_flow()" */ #define FLOW_MAX 2048 /* * Hack -- provide some "speed" for the "flow" code * This entry is the "current index" for the "when" field * Note that a "when" value of "zero" means "not used". * * Note that the "cost" indexes from 1 to 127 are for * "old" data, and from 128 to 255 are for "new" data. * * This means that as long as the player does not "teleport", * then any monster up to 128 + MONSTER_FLOW_DEPTH will be * able to track down the player, and in general, will be * able to track down either the player or a position recently * occupied by the player. */ static int flow_save = 0; /* * Hack -- forget the "flow" information */ void cave_forget_flow(struct cave *c) { int x, y; /* Nothing to forget */ if (!flow_save) return; /* Check the entire dungeon */ for (y = 0; y < DUNGEON_HGT; y++) { for (x = 0; x < DUNGEON_WID; x++) { /* Forget the old data */ c->cost[y][x] = 0; c->when[y][x] = 0; } } /* Start over */ flow_save = 0; } /* * Hack -- fill in the "cost" field of every grid that the player can * "reach" with the number of steps needed to reach that grid. This * also yields the "distance" of the player from every grid. * * In addition, mark the "when" of the grids that can reach the player * with the incremented value of "flow_save". * * Hack -- use the local "flow_y" and "flow_x" arrays as a "circular * queue" of cave grids. * * We do not need a priority queue because the cost from grid to grid * is always "one" (even along diagonals) and we process them in order. */ void cave_update_flow(struct cave *c) { int py = p_ptr->py; int px = p_ptr->px; int ty, tx; int y, x; int n, d; int flow_n; int flow_tail = 0; int flow_head = 0; byte flow_y[FLOW_MAX]; byte flow_x[FLOW_MAX]; /*** Cycle the flow ***/ /* Cycle the flow */ if (flow_save++ == 255) { /* Cycle the flow */ for (y = 0; y < DUNGEON_HGT; y++) { for (x = 0; x < DUNGEON_WID; x++) { int w = c->when[y][x]; c->when[y][x] = (w >= 128) ? (w - 128) : 0; } } /* Restart */ flow_save = 128; } /* Local variable */ flow_n = flow_save; /*** Player Grid ***/ /* Save the time-stamp */ c->when[py][px] = flow_n; /* Save the flow cost */ c->cost[py][px] = 0; /* Enqueue that entry */ flow_y[flow_head] = py; flow_x[flow_head] = px; /* Advance the queue */ ++flow_tail; /*** Process Queue ***/ /* Now process the queue */ while (flow_head != flow_tail) { /* Extract the next entry */ ty = flow_y[flow_head]; tx = flow_x[flow_head]; /* Forget that entry (with wrap) */ if (++flow_head == FLOW_MAX) flow_head = 0; /* Child cost */ n = c->cost[ty][tx] + 1; /* Hack -- Limit flow depth */ if (n == MONSTER_FLOW_DEPTH) continue; /* Add the "children" */ for (d = 0; d < 8; d++) { int old_head = flow_tail; /* Child location */ y = ty + ddy_ddd[d]; x = tx + ddx_ddd[d]; /* Ignore "pre-stamped" entries */ if (c->when[y][x] == flow_n) continue; /* Ignore "walls" and "rubble" */ if (c->feat[y][x] >= FEAT_RUBBLE) continue; /* Save the time-stamp */ c->when[y][x] = flow_n; /* Save the flow cost */ c->cost[y][x] = n; /* Enqueue that entry */ flow_y[flow_tail] = y; flow_x[flow_tail] = x; /* Advance the queue */ if (++flow_tail == FLOW_MAX) flow_tail = 0; /* Hack -- Overflow by forgetting new entry */ if (flow_tail == flow_head) flow_tail = old_head; } } } /* * Light up the dungeon using "claravoyance" * * This function "illuminates" every grid in the dungeon, memorizes all * "objects", and memorizes all grids as with magic mapping. */ void wiz_light(bool full) { int i, y, x; /* Memorize objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = object_byid(i); /* Skip dead objects */ if (!o_ptr->kind) continue; /* Skip held objects */ if (o_ptr->held_m_idx) continue; /* Memorize it */ if (o_ptr->marked < MARK_SEEN) o_ptr->marked = full ? MARK_SEEN : MARK_AWARE; } /* Scan all normal grids */ for (y = 1; y < cave->height - 1; y++) { /* Scan all normal grids */ for (x = 1; x < cave->width - 1; x++) { /* Process all non-walls */ if (cave->feat[y][x] < FEAT_SECRET) { /* Scan all neighbors */ for (i = 0; i < 9; i++) { int yy = y + ddy_ddd[i]; int xx = x + ddx_ddd[i]; /* Perma-light the grid */ cave->info[yy][xx] |= (CAVE_GLOW); /* Memorize normal features */ if (cave->feat[yy][xx] > FEAT_INVIS) cave->info[yy][xx] |= (CAVE_MARK); } } } } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Redraw whole map, monster list */ p_ptr->redraw |= (PR_MAP | PR_MONLIST | PR_ITEMLIST); } /* * Forget the dungeon map (ala "Thinking of Maud..."). */ void wiz_dark(void) { int i, y, x; /* Forget every grid */ for (y = 0; y < cave->height; y++) { for (x = 0; x < cave->width; x++) { /* Process the grid */ cave->info[y][x] &= ~(CAVE_MARK); cave->info2[y][x] &= ~(CAVE2_DTRAP|CAVE2_DEDGE); } } /* Forget all objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = object_byid(i); /* Skip dead objects */ if (!o_ptr->kind) continue; /* Skip held objects */ if (o_ptr->held_m_idx) continue; /* Forget the object */ o_ptr->marked = MARK_UNAWARE; } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Redraw map, monster list */ p_ptr->redraw |= (PR_MAP | PR_MONLIST | PR_ITEMLIST); } /* * Light or Darken the town */ void cave_illuminate(struct cave *c, bool daytime) { int y, x, i; /* Apply light or darkness */ for (y = 0; y < c->height; y++) for (x = 0; x < c->width; x++) /* Only interesting grids at night */ if (daytime || c->feat[y][x] > FEAT_INVIS) c->info[y][x] |= CAVE_GLOW | CAVE_MARK; else c->info[y][x] &= ~(CAVE_GLOW | CAVE_MARK); /* Light shop doorways */ for (y = 0; y < c->height; y++) { for (x = 0; x < c->width; x++) { if (!cave_isshop(c, y, x)) continue; for (i = 0; i < 8; i++) { int yy = y + ddy_ddd[i]; int xx = x + ddx_ddd[i]; c->info[yy][xx] |= (CAVE_GLOW | CAVE_MARK); } } } /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Redraw map, monster list */ p_ptr->redraw |= (PR_MAP | PR_MONLIST | PR_ITEMLIST); } struct feature *cave_feat(struct cave *c, int y, int x) { assert(c); assert(y >= 0 && y < DUNGEON_HGT); assert(x >= 0 && x < DUNGEON_WID); return &f_info[cave->feat[y][x]]; } void cave_set_feat(struct cave *c, int y, int x, int feat) { assert(c); assert(y >= 0 && y < DUNGEON_HGT); assert(x >= 0 && x < DUNGEON_WID); /* XXX: Check against c->height and c->width instead, once everywhere * honors those... */ c->feat[y][x] = feat; if (feat >= FEAT_DOOR_HEAD) c->info[y][x] |= CAVE_WALL; else c->info[y][x] &= ~CAVE_WALL; if (character_dungeon) { cave_note_spot(c, y, x); cave_light_spot(c, y, x); } } bool cave_in_bounds(struct cave *c, int y, int x) { return x >= 0 && x < c->width && y >= 0 && y < c->height; } bool cave_in_bounds_fully(struct cave *c, int y, int x) { return x > 0 && x < c->width - 1 && y > 0 && y < c->height - 1; } /* * Determine the path taken by a projection. * * The projection will always start from the grid (y1,x1), and will travel * towards the grid (y2,x2), touching one grid per unit of distance along * the major axis, and stopping when it enters the destination grid or a * wall grid, or has travelled the maximum legal distance of "range". * * Note that "distance" in this function (as in the "update_view()" code) * is defined as "MAX(dy,dx) + MIN(dy,dx)/2", which means that the player * actually has an "octagon of projection" not a "circle of projection". * * The path grids are saved into the grid array pointed to by "gp", and * there should be room for at least "range" grids in "gp". Note that * due to the way in which distance is calculated, this function normally * uses fewer than "range" grids for the projection path, so the result * of this function should never be compared directly to "range". Note * that the initial grid (y1,x1) is never saved into the grid array, not * even if the initial grid is also the final grid. XXX XXX XXX * * The "flg" flags can be used to modify the behavior of this function. * * In particular, the "PROJECT_STOP" and "PROJECT_THRU" flags have the same * semantics as they do for the "project" function, namely, that the path * will stop as soon as it hits a monster, or that the path will continue * through the destination grid, respectively. * * The "PROJECT_JUMP" flag, which for the "project()" function means to * start at a special grid (which makes no sense in this function), means * that the path should be "angled" slightly if needed to avoid any wall * grids, allowing the player to "target" any grid which is in "view". * This flag is non-trivial and has not yet been implemented, but could * perhaps make use of the "vinfo" array (above). XXX XXX XXX * * This function returns the number of grids (if any) in the path. This * function will return zero if and only if (y1,x1) and (y2,x2) are equal. * * This algorithm is similar to, but slightly different from, the one used * by "update_view_los()", and very different from the one used by "los()". */ int project_path(u16b *gp, int range, int y1, int x1, int y2, int x2, int flg) { int y, x; int n = 0; int k = 0; /* Absolute */ int ay, ax; /* Offsets */ int sy, sx; /* Fractions */ int frac; /* Scale factors */ int full, half; /* Slope */ int m; /* No path necessary (or allowed) */ if ((x1 == x2) && (y1 == y2)) return (0); /* Analyze "dy" */ if (y2 < y1) { ay = (y1 - y2); sy = -1; } else { ay = (y2 - y1); sy = 1; } /* Analyze "dx" */ if (x2 < x1) { ax = (x1 - x2); sx = -1; } else { ax = (x2 - x1); sx = 1; } /* Number of "units" in one "half" grid */ half = (ay * ax); /* Number of "units" in one "full" grid */ full = half << 1; /* Vertical */ if (ay > ax) { /* Start at tile edge */ frac = ax * ax; /* Let m = ((dx/dy) * full) = (dx * dx * 2) = (frac * 2) */ m = frac << 1; /* Start */ y = y1 + sy; x = x1; /* Create the projection path */ while (1) { /* Save grid */ gp[n++] = GRID(y,x); /* Hack -- Check maximum range */ if ((n + (k >> 1)) >= range) break; /* Sometimes stop at destination grid */ if (!(flg & (PROJECT_THRU))) { if ((x == x2) && (y == y2)) break; } /* Always stop at non-initial wall grids */ if ((n > 0) && !cave_ispassable(cave, y, x)) break; /* Sometimes stop at non-initial monsters/players */ if (flg & (PROJECT_STOP)) { if ((n > 0) && (cave->m_idx[y][x] != 0)) break; } /* Slant */ if (m) { /* Advance (X) part 1 */ frac += m; /* Horizontal change */ if (frac >= half) { /* Advance (X) part 2 */ x += sx; /* Advance (X) part 3 */ frac -= full; /* Track distance */ k++; } } /* Advance (Y) */ y += sy; } } /* Horizontal */ else if (ax > ay) { /* Start at tile edge */ frac = ay * ay; /* Let m = ((dy/dx) * full) = (dy * dy * 2) = (frac * 2) */ m = frac << 1; /* Start */ y = y1; x = x1 + sx; /* Create the projection path */ while (1) { /* Save grid */ gp[n++] = GRID(y,x); /* Hack -- Check maximum range */ if ((n + (k >> 1)) >= range) break; /* Sometimes stop at destination grid */ if (!(flg & (PROJECT_THRU))) { if ((x == x2) && (y == y2)) break; } /* Always stop at non-initial wall grids */ if ((n > 0) && !cave_ispassable(cave, y, x)) break; /* Sometimes stop at non-initial monsters/players */ if (flg & (PROJECT_STOP)) { if ((n > 0) && (cave->m_idx[y][x] != 0)) break; } /* Slant */ if (m) { /* Advance (Y) part 1 */ frac += m; /* Vertical change */ if (frac >= half) { /* Advance (Y) part 2 */ y += sy; /* Advance (Y) part 3 */ frac -= full; /* Track distance */ k++; } } /* Advance (X) */ x += sx; } } /* Diagonal */ else { /* Start */ y = y1 + sy; x = x1 + sx; /* Create the projection path */ while (1) { /* Save grid */ gp[n++] = GRID(y,x); /* Hack -- Check maximum range */ if ((n + (n >> 1)) >= range) break; /* Sometimes stop at destination grid */ if (!(flg & (PROJECT_THRU))) { if ((x == x2) && (y == y2)) break; } /* Always stop at non-initial wall grids */ if ((n > 0) && !cave_ispassable(cave, y, x)) break; /* Sometimes stop at non-initial monsters/players */ if (flg & (PROJECT_STOP)) { if ((n > 0) && (cave->m_idx[y][x] != 0)) break; } /* Advance (Y) */ y += sy; /* Advance (X) */ x += sx; } } /* Length */ return (n); } /* * Determine if a bolt spell cast from (y1,x1) to (y2,x2) will arrive * at the final destination, assuming that no monster gets in the way, * using the "project_path()" function to check the projection path. * * Note that no grid is ever "projectable()" from itself. * * This function is used to determine if the player can (easily) target * a given grid, and if a monster can target the player. */ bool projectable(int y1, int x1, int y2, int x2, int flg) { int y, x; int grid_n = 0; u16b grid_g[512]; /* Check the projection path */ grid_n = project_path(grid_g, MAX_RANGE, y1, x1, y2, x2, flg); /* No grid is ever projectable from itself */ if (!grid_n) return (FALSE); /* Final grid */ y = GRID_Y(grid_g[grid_n-1]); x = GRID_X(grid_g[grid_n-1]); /* May not end in a wall grid */ if (!cave_ispassable(cave, y, x)) return (FALSE); /* May not end in an unrequested grid */ if ((y != y2) || (x != x2)) return (FALSE); /* Assume okay */ return (TRUE); } /* * Standard "find me a location" function * * Obtains a legal location within the given distance of the initial * location, and with "los()" from the source to destination location. * * This function is often called from inside a loop which searches for * locations while increasing the "d" distance. * * need_los determines whether line of sight is needed */ void scatter(int *yp, int *xp, int y, int x, int d, bool need_los) { int nx, ny; /* Pick a location */ while (TRUE) { /* Pick a new location */ ny = rand_spread(y, d); nx = rand_spread(x, d); /* Ignore annoying locations */ if (!cave_in_bounds_fully(cave, ny, nx)) continue; /* Ignore "excessively distant" locations */ if ((d > 1) && (distance(y, x, ny, nx) > d)) continue; /* Don't need los */ if (!need_los) break; /* Require "line of sight" if set */ if (need_los && (los(y, x, ny, nx))) break; } /* Save the location */ (*yp) = ny; (*xp) = nx; } /* * Something has happened to disturb the player. * * The first arg indicates a major disturbance, which affects search. * * The second arg is currently unused, but could induce output flush. * * All disturbance cancels repeated commands, resting, and running. */ void disturb(struct player *p, int stop_search, int unused_flag) { /* Unused parameter */ (void)unused_flag; /* Cancel repeated commands */ cmd_cancel_repeat(); /* Cancel Resting */ if (player_is_resting(p)) { player_resting_cancel(p); p->redraw |= PR_STATE; } /* Cancel running */ if (p->running) { p->running = 0; /* Check for new panel if appropriate */ if (OPT(center_player)) verify_panel(); p->update |= PU_TORCH; } /* Cancel searching if requested */ if (stop_search && p->searching) { p->searching = FALSE; p->update |= PU_BONUS; p->redraw |= PR_STATE; } /* Flush input */ flush(); } struct cave *cave = NULL; struct cave *cave_new(void) { struct cave *c = mem_zalloc(sizeof *c); c->info = C_ZNEW(DUNGEON_HGT, byte_256); c->info2 = C_ZNEW(DUNGEON_HGT, byte_256); c->feat = C_ZNEW(DUNGEON_HGT, byte_wid); c->cost = C_ZNEW(DUNGEON_HGT, byte_wid); c->when = C_ZNEW(DUNGEON_HGT, byte_wid); c->m_idx = C_ZNEW(DUNGEON_HGT, s16b_wid); c->o_idx = C_ZNEW(DUNGEON_HGT, s16b_wid); c->monsters = C_ZNEW(z_info->m_max, struct monster); c->mon_max = 1; c->created_at = 1; return c; } void cave_free(struct cave *c) { mem_free(c->info); mem_free(c->info2); mem_free(c->feat); mem_free(c->cost); mem_free(c->when); mem_free(c->m_idx); mem_free(c->o_idx); mem_free(c->monsters); mem_free(c); } /** * FEATURE PREDICATES * * These functions are used to figure out what kind of square something is, * via c->feat[y][x]. All direct testing of c->feat[y][x] should be rewritten * in terms of these functions. * * It's often better to use feature behavior predicates (written in terms of * these functions) instead of these functions directly. For instance, * cave_isrock() will return false for a secret door, even though it will * behave like a rock wall until the player determines it's a door. * * Use functions like cave_isdiggable, cave_iswall, etc. in these cases. */ /** * True if the square is normal open floor. */ bool cave_isfloor(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_FLOOR; } /** * True if the square is a normal granite rock wall. * * FEAT_WALL_SOLID is the normal feature type. The others are weird byproducts * of cave generation (and should be avoided). */ bool cave_isrock(struct cave *c, int y, int x) { switch (c->feat[y][x]) { case FEAT_WALL_EXTRA: case FEAT_WALL_INNER: case FEAT_WALL_OUTER: case FEAT_WALL_SOLID: return TRUE; default: return FALSE; } } /** * True if the square is a permanent wall. * * FEAT_PERM_SOLID is the normal feature type. The others are weird byproducts * of cave generation (and should be avoided). */ bool cave_isperm(struct cave *c, int y, int x) { switch (c->feat[y][x]) { case FEAT_PERM_EXTRA: case FEAT_PERM_INNER: case FEAT_PERM_OUTER: case FEAT_PERM_SOLID: return TRUE; default: return FALSE; } } /** * True if the square is a magma wall. */ bool feat_is_magma(int feat) { switch (feat) { case FEAT_MAGMA: case FEAT_MAGMA_H: case FEAT_MAGMA_K: return TRUE; default: return FALSE; } } /** * True if the square is a magma wall. */ bool cave_ismagma(struct cave *c, int y, int x) { return feat_is_magma(c->feat[y][x]); } /** * True if the square is a quartz wall. */ bool feat_is_quartz(int feat) { switch (feat) { case FEAT_QUARTZ: case FEAT_QUARTZ_H: case FEAT_QUARTZ_K: return TRUE; default: return FALSE; } } /** * True if the square is a quartz wall. */ bool cave_isquartz(struct cave *c, int y, int x) { return feat_is_quartz(c->feat[y][x]); } /** * True if the square is a mineral wall (magma/quartz). */ bool cave_ismineral(struct cave *c, int y, int x) { return cave_isrock(c, y, x) || cave_ismagma(c, y, x) || cave_isquartz(c, y, x); } /** * True if the square is a mineral wall with treasure (magma/quartz). */ bool feat_is_treasure(int feat) { return feat == FEAT_MAGMA_K || feat == FEAT_QUARTZ_K; } /** * True if the square is rubble. */ bool cave_isrubble(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_RUBBLE; } /** * True if the square is a hidden secret door. * * These squares appear as if they were granite--when detected a secret door * is replaced by a closed door. */ bool cave_issecretdoor(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_SECRET; } /** * True if the square is an open door. */ bool cave_isopendoor(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_OPEN; } /** * True if the square is a closed door (possibly locked or jammed). */ bool cave_iscloseddoor(struct cave *c, int y, int x) { int feat = c->feat[y][x]; return feat >= FEAT_DOOR_HEAD && feat <= FEAT_DOOR_TAIL; } /** * True if the square is a closed, locked door. */ bool cave_islockeddoor(struct cave *c, int y, int x) { int feat = c->feat[y][x]; return feat >= FEAT_DOOR_HEAD + 0x01 && feat <= FEAT_DOOR_TAIL; } /** * True if the square is a door. * * This includes open, closed, and hidden doors. */ bool cave_isdoor(struct cave *c, int y, int x) { return (cave_isopendoor(c, y, x) || cave_issecretdoor(c, y, x) || cave_iscloseddoor(c, y, x) || cave_isbrokendoor(c, y, x)); } /** * True if the square is an unknown trap (it will appear as a floor tile). */ bool cave_issecrettrap(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_INVIS; } /** * True if the square is a known trap. */ bool feat_is_known_trap(int feat) { return feat >= FEAT_TRAP_HEAD && feat <= FEAT_TRAP_TAIL; } /** * True is the feature is a solid wall (not rubble). */ bool feat_is_wall(int feat) { return feat >= FEAT_SECRET && feat <= FEAT_PERM_SOLID && feat != FEAT_RUBBLE; } /** * True if the square is a known trap. */ bool cave_isknowntrap(struct cave *c, int y, int x) { return feat_is_known_trap(c->feat[y][x]); } /** * True if the square contains a trap, known or unknown. */ bool cave_istrap(struct cave *c, int y, int x) { return cave_issecrettrap(cave, y, x) || cave_isknowntrap(cave, y, x); } /** * True if the feature is a shop entrance. */ bool feature_isshop(int feat) { return (feat >= FEAT_SHOP_HEAD && feat <= FEAT_SHOP_TAIL); } /** * True if cave is an up or down stair */ bool cave_isstairs(struct cave*c, int y, int x) { return cave_isupstairs(c, y, x) || cave_isdownstairs(c, y, x); } /** * True if cave is an up stair. */ bool cave_isupstairs(struct cave*c, int y, int x) { return c->feat[y][x] == FEAT_LESS; } /** * True if cave is a down stair. */ bool cave_isdownstairs(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_MORE; } /** * True if the square is a shop entrance. */ bool cave_isshop(struct cave *c, int y, int x) { return feature_isshop(c->feat[y][x]); } int cave_shopnum(struct cave *c, int y, int x) { if (cave_isshop(c, y, x)) return c->feat[y][x] - FEAT_SHOP_HEAD; return -1; } /** * SQUARE BEHAVIOR PREDICATES * * These functions define how a given square behaves, e.g. whether it is * passable by the player, whether it is diggable, contains items, etc. * * These functions use the FEATURE PREDICATES (as well as c->info) to make * the determination. */ /** * True if the square is open (a floor square not occupied by a monster). */ bool cave_isopen(struct cave *c, int y, int x) { return cave_isfloor(c, y, x) && !c->m_idx[y][x]; } /** * True if the square is empty (an open square without any items). */ bool cave_isempty(struct cave *c, int y, int x) { return cave_isopen(c, y, x) && !c->o_idx[y][x]; } /** * True if the square is a floor square without items. */ bool cave_canputitem(struct cave *c, int y, int x) { return cave_isfloor(c, y, x) && !c->o_idx[y][x]; } /** * True if the square can be dug: this includes rubble and non-permanent walls. */ bool cave_isdiggable(struct cave *c, int y, int x) { return (cave_ismineral(c, y, x) || cave_issecretdoor(c, y, x) || cave_isrubble(c, y, x)); } /** * True if a monster can walk through the feature. */ bool feat_is_monster_walkable(feature_type *feature) { return ff_has(feature->flags, FF_MWALK); } /** * True if a monster can walk through the tile. * * This is needed for polymorphing. A monster may be on a feature that isn't * an empty space, causing problems when it is replaced with a new monster. */ bool cave_is_monster_walkable(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); return feat_is_monster_walkable(&f_info[c->feat[y][x]]); } /** * True if the feature is passable by the player. */ bool feat_ispassable(feature_type *f_ptr) { return ff_has(f_ptr->flags, FF_PWALK); } /** * True if the square is passable by the player. * * This function is the logical negation of cave_iswall(). */ bool cave_ispassable(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); return feat_ispassable(&f_info[c->feat[y][x]]); } /** * True if the square is a wall square (impedes the player). * * This function is the logical negation of cave_ispassable(). */ bool cave_iswall(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); return c->info[y][x] & CAVE_WALL; } /** * True if the square is a permanent wall or one of the "stronger" walls. * * The stronger walls are granite, magma and quartz. This excludes things like * secret doors and rubble. */ bool cave_isstrongwall(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); return cave_ismineral(c, y, x) || cave_isperm(c, y, x); } /** * True if the square is part of a vault. * * This doesn't say what kind of square it is, just that it is part of a vault. */ bool cave_isvault(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); return c->info[y][x] & CAVE_VAULT; } /** * True if the square is part of a room. */ bool cave_isroom(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); return c->info[y][x] & CAVE_ROOM; } /** * True if cave square is a feeling trigger square */ bool cave_isfeel(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); return c->info2[y][x] & CAVE2_FEEL; } /* True if the cave square is viewable */ bool cave_isview(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); return c->info[y][x] & CAVE_VIEW; } bool cave_isseen(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); return c->info[y][x] & CAVE_SEEN; } bool cave_wasseen(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); return c->info[y][x] & CAVE_WASSEEN; } bool cave_isglow(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); return c->info[y][x] & CAVE_GLOW; } /** * True if the feature is "boring". */ bool feat_isboring(feature_type *f_ptr) { return ff_has(f_ptr->flags, FF_BORING); } /** * True if the cave square is "boring". */ bool cave_isboring(struct cave *c, int y, int x) { assert(cave_in_bounds(c, y, x)); return feat_isboring(&f_info[c->feat[y][x]]); } /** * Get a monster on the current level by its index. */ struct monster *cave_monster(struct cave *c, int idx) { return &c->monsters[idx]; } /** * Get a monster on the current level by its position. */ struct monster *cave_monster_at(struct cave *c, int y, int x) { if (c->m_idx[y][x] > 0) { struct monster *mon = cave_monster(c, c->m_idx[y][x]); return mon->race ? mon : NULL; } return NULL; } /** * The maximum number of monsters allowed in the level. */ int cave_monster_max(struct cave *c) { return c->mon_max; } /** * The current number of monsters present on the level. */ int cave_monster_count(struct cave *c) { return c->mon_cnt; } /** * Add visible treasure to a mineral square. */ void upgrade_mineral(struct cave *c, int y, int x) { switch (c->feat[y][x]) { case FEAT_MAGMA: cave_set_feat(c, y, x, FEAT_MAGMA_K); break; case FEAT_QUARTZ: cave_set_feat(c, y, x, FEAT_QUARTZ_K); break; } } int cave_door_power(struct cave *c, int y, int x) { return (c->feat[y][x] - FEAT_DOOR_HEAD) & 0x07; } void cave_open_door(struct cave *c, int y, int x) { cave_set_feat(c, y, x, FEAT_OPEN); } void cave_smash_door(struct cave *c, int y, int x) { cave_set_feat(c, y, x, FEAT_BROKEN); } void cave_destroy_trap(struct cave *c, int y, int x) { /* XXX: FEAT_TRAP check? */ cave_set_feat(cave, y, x, FEAT_FLOOR); } void cave_lock_door(struct cave *c, int y, int x, int power) { cave_set_feat(c, y, x, FEAT_DOOR_HEAD + power); } bool cave_hasgoldvein(struct cave *c, int y, int x) { return c->feat[y][x] >= FEAT_MAGMA_H && c->feat[y][x] <= FEAT_QUARTZ_K; } void cave_tunnel_wall(struct cave *c, int y, int x) { cave_set_feat(c, y, x, FEAT_FLOOR); } void cave_destroy_wall(struct cave *c, int y, int x) { cave_set_feat(c, y, x, FEAT_FLOOR); } void cave_close_door(struct cave *c, int y, int x) { cave_set_feat(c, y, x, FEAT_DOOR_HEAD); } bool cave_isbrokendoor(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_BROKEN; } bool cave_isglyph(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_GLYPH; } void cave_show_trap(struct cave *c, int y, int x, int type) { assert(cave_issecrettrap(c, y, x)); cave_set_feat(c, y, x, FEAT_TRAP_HEAD + type); } void cave_add_trap(struct cave *c, int y, int x) { cave_set_feat(c, y, x, FEAT_INVIS); } bool cave_iswarded(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_GLYPH; } void cave_add_ward(struct cave *c, int y, int x) { cave_set_feat(c, y, x, FEAT_GLYPH); } void cave_remove_ward(struct cave *c, int y, int x) { assert(cave_iswarded(c, y, x)); cave_set_feat(c, y, x, FEAT_FLOOR); } bool cave_canward(struct cave *c, int y, int x) { return cave_isfloor(c, y, x); } bool cave_seemslikewall(struct cave *c, int y, int x) { return c->feat[y][x] >= FEAT_SECRET; } bool cave_isinteresting(struct cave *c, int y, int x) { int f = c->feat[y][x]; return f != FEAT_FLOOR && f != FEAT_INVIS; } void cave_show_vein(struct cave *c, int y, int x) { if (c->feat[y][x] == FEAT_MAGMA_H) cave_set_feat(c, y, x, FEAT_MAGMA_K); else if (c->feat[y][x] == FEAT_QUARTZ_H) cave_set_feat(c, y, x, FEAT_QUARTZ_K); } void cave_add_stairs(struct cave *c, int y, int x, int depth) { int down = randint0(100) < 50; if (depth == 0) down = 1; else if (is_quest(depth) || depth >= MAX_DEPTH - 1) down = 0; cave_set_feat(c, y, x, down ? FEAT_MORE : FEAT_LESS); } void cave_destroy(struct cave *c, int y, int x) { int feat = FEAT_FLOOR; int r = randint0(200); if (r < 20) feat = FEAT_WALL_EXTRA; else if (r < 70) feat = FEAT_QUARTZ; else if (r < 100) feat = FEAT_MAGMA; cave_set_feat(cave, y, x, feat); } void cave_earthquake(struct cave *c, int y, int x) { int t = randint0(100); int f; if (!cave_ispassable(c, y, x)) { cave_set_feat(c, y, x, FEAT_FLOOR); return; } if (t < 20) f = FEAT_WALL_EXTRA; else if (t < 70) f = FEAT_QUARTZ; else f = FEAT_MAGMA; cave_set_feat(c, y, x, f); } bool cave_hassecretvein(struct cave *c, int y, int x) { return c->feat[y][x] == FEAT_MAGMA_H || c->feat[y][x] == FEAT_QUARTZ_H; } bool cave_noticeable(struct cave *c, int y, int x) { if (cave_isfloor(c, y, x)) return FALSE; if (cave_issecrettrap(c, y, x) || cave_issecretdoor(c, y, x)) return FALSE; if (cave_ismagma(c, y, x) || cave_isquartz(c, y, x)) if (!cave_hasgoldvein(c, y, x) || cave_hassecretvein(c, y, x)) return FALSE; if (cave_seemslikewall(c, y, x)) return FALSE; return TRUE; } const char *cave_apparent_name(struct cave *c, struct player *p, int y, int x) { int f = f_info[c->feat[y][x]].mimic; if (!(c->info[y][x] & CAVE_MARK) && !player_can_see_bold(y, x)) f = FEAT_NONE; if (f == FEAT_NONE) return "unknown_grid"; return f_info[f].name; } void cave_unlock_door(struct cave *c, int y, int x) { assert(cave_islockeddoor(c, y, x)); cave_set_feat(c, y, x, FEAT_DOOR_HEAD); } void cave_destroy_door(struct cave *c, int y, int x) { assert(cave_isdoor(c, y, x)); cave_set_feat(c, y, x, FEAT_FLOOR); } void cave_destroy_rubble(struct cave *c, int y, int x) { assert(cave_isrubble(c, y, x)); cave_set_feat(c, y, x, FEAT_FLOOR); } void cave_add_door(struct cave *c, int y, int x, bool closed) { cave_set_feat(c, y, x, closed ? FEAT_DOOR_HEAD : FEAT_OPEN); } void cave_force_floor(struct cave *c, int y, int x) { cave_set_feat(c, y, x, FEAT_FLOOR); } angband-3.5.1/src/z-type.h0000644000175000017500000000216612456456607014636 0ustar chriscchrisc#ifndef INCLUDED_ZTYPE_H #define INCLUDED_ZTYPE_H #include "h-basic.h" typedef struct type_union type_union; typedef enum type_val { T_END = 0, T_INT, T_FLOAT, T_CHAR, T_STRING } type_val; struct type_union { type_val t; union { float f; int i; char c; const char *s; } u; }; extern type_union i2u(int i); extern type_union f2u(float f); extern type_union c2u(char c); extern type_union s2u(const char *s); static const type_union END = { T_END, { 0 } }; struct loc { int x; int y; }; struct loc loc(int x, int y); /** * Defines a (value, name) pairing. Variable names used are historical. */ typedef struct grouper grouper; struct grouper { int tval; const char *name; }; /* * A set of points that can be constructed to apply a set of changes to */ struct point_set { int n; int allocated; struct loc *pts; }; struct point_set *point_set_new(int initial_size); void point_set_dispose(struct point_set *ps); void add_to_point_set(struct point_set *ps, int y, int x); int point_set_size(struct point_set *ps); int point_set_contains(struct point_set *ps, int y, int x); #endif /* !INCLUDED_ZTYPE_H */ angband-3.5.1/src/store.c0000644000175000017500000021422512456456606014535 0ustar chriscchrisc/* * File: store.c * Purpose: Store stocking and UI * * Copyright (c) 1997 Robert A. Koeneke, James E. Wilson, Ben Harrison * Copyright (c) 2007 Andi Sidwell, who rewrote a fair portion * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "cave.h" #include "cmds.h" #include "game-event.h" #include "history.h" #include "init.h" #include "object/inventory.h" #include "object/tvalsval.h" #include "object/object.h" #include "spells.h" #include "squelch.h" #include "store.h" #include "target.h" #include "textui.h" #include "ui-menu.h" #include "z-debug.h" /*** Constants and definitions ***/ /* Easy names for the elements of the 'scr_places' arrays. */ enum { LOC_PRICE = 0, LOC_OWNER, LOC_HEADER, LOC_MORE, LOC_HELP_CLEAR, LOC_HELP_PROMPT, LOC_AU, LOC_WEIGHT, LOC_MAX }; /* Places for the various things displayed onscreen */ static unsigned int scr_places_x[LOC_MAX]; static unsigned int scr_places_y[LOC_MAX]; /* State flags */ #define STORE_GOLD_CHANGE 0x01 #define STORE_FRAME_CHANGE 0x02 #define STORE_SHOW_HELP 0x04 /* Compound flag for the initial display of a store */ #define STORE_INIT_CHANGE (STORE_FRAME_CHANGE | STORE_GOLD_CHANGE) /* Some local constants */ #define STORE_OBJ_LEVEL 5 /* Magic Level for normal stores */ /** Variables to maintain state XXX ***/ /* Flags for the display */ static u16b store_flags; /* Are we in store? */ bool store_in_store = FALSE; /*** Utilities ***/ /* Randomly select one of the entries in an array */ #define ONE_OF(x) x[randint0(N_ELEMENTS(x))] /*** Flavour text stuff ***/ /* * Shopkeeper welcome messages. * * The shopkeeper's name must come first, then the character's name. */ static const char *comment_welcome[] = { "", "%s nods to you.", "%s says hello.", "%s: \"See anything you like, adventurer?\"", "%s: \"How may I help you, %s?\"", "%s: \"Welcome back, %s.\"", "%s: \"A pleasure to see you again, %s.\"", "%s: \"How may I be of assistance, good %s?\"", "%s: \"You do honour to my humble store, noble %s.\"", "%s: \"I and my family are entirely at your service, %s.\"" }; static const char *comment_hint[] = { /* "%s tells you soberly: \"%s\".", "(%s) There's a saying round here, \"%s\".", "%s offers to tell you a secret next time you're about."*/ "\"%s\"" }; /* * Messages for reacting to purchase prices. */ static const char *comment_worthless[] = { "Arrgghh!", "You bastard!", "You hear someone sobbing...", "The shopkeeper howls in agony!", "The shopkeeper wails in anguish!", "The shopkeeper beats his head against the counter." }; static const char *comment_bad[] = { "Damn!", "You fiend!", "The shopkeeper curses at you.", "The shopkeeper glares at you." }; static const char *comment_accept[] = { "Okay.", "Fine.", "Accepted!", "Agreed!", "Done!", "Taken!" }; static const char *comment_good[] = { "Cool!", "You've made my day!", "The shopkeeper sniggers.", "The shopkeeper giggles.", "The shopkeeper laughs loudly." }; static const char *comment_great[] = { "Yipee!", "I think I'll retire!", "The shopkeeper jumps for joy.", "The shopkeeper smiles gleefully.", "Wow. I'm going to name my new villa in your honour." }; /* * Create a new store. */ static struct store *store_new(int idx) { struct store *s = mem_zalloc(sizeof *s); s->sidx = idx; s->stock = mem_zalloc(sizeof(*s->stock) * STORE_INVEN_MAX); s->stock_size = STORE_INVEN_MAX; return s; } /* * Get rid of stores at cleanup. Gets rid of everything. */ void free_stores(void) { struct owner *o; struct owner *next; int i; /* Free the store inventories */ for (i = 0; i < MAX_STORES; i++) { /* Get the store */ struct store *store = &stores[i]; /* Free the store inventory */ mem_free(store->stock); mem_free(store->always_table); mem_free(store->normal_table); for (o = store->owners; o; o = next) { next = o->next; string_free(o->name); mem_free(o); } string_free((void *)store->name); } mem_free(stores); } /*** Edit file parsing ***/ /** store.txt **/ static enum parser_error parse_store(struct parser *p) { struct store *h = parser_priv(p); struct store *s; unsigned int idx = parser_getuint(p, "index") - 1; if (idx > STORE_HOME) return PARSE_ERROR_OUT_OF_BOUNDS; s = store_new(parser_getuint(p, "index") - 1); s->name = string_make(parser_getstr(p, "name")); s->next = h; parser_setpriv(p, s); return PARSE_ERROR_NONE; } static enum parser_error parse_slots(struct parser *p) { struct store *s = parser_priv(p); s->normal_stock_min = parser_getuint(p, "min"); s->normal_stock_max = parser_getuint(p, "max"); return PARSE_ERROR_NONE; } static enum parser_error parse_turnover(struct parser *p) { struct store *s = parser_priv(p); s->turnover = parser_getuint(p, "turnover"); return PARSE_ERROR_NONE; } static enum parser_error parse_normal(struct parser *p) { struct store *s = parser_priv(p); int tval = tval_find_idx(parser_getsym(p, "tval")); int sval = lookup_sval(tval, parser_getsym(p, "sval")); object_kind *kind = lookup_kind(tval, sval); if (!kind) return PARSE_ERROR_UNRECOGNISED_SVAL; /* Expand if necessary */ if (!s->normal_num) { s->normal_size = 16; s->normal_table = mem_zalloc(s->normal_size * sizeof *s->normal_table); } else if (s->normal_num >= s->normal_size) { s->normal_size += 8; s->normal_table = mem_realloc(s->normal_table, s->normal_size * sizeof *s->normal_table); } s->normal_table[s->normal_num++] = kind; return PARSE_ERROR_NONE; } static enum parser_error parse_always(struct parser *p) { struct store *s = parser_priv(p); int tval = tval_find_idx(parser_getsym(p, "tval")); int sval = lookup_sval(tval, parser_getsym(p, "sval")); object_kind *kind = lookup_kind(tval, sval); if (!kind) return PARSE_ERROR_UNRECOGNISED_SVAL; /* Expand if necessary */ if (!s->always_num) { s->always_size = 8; s->always_table = mem_zalloc(s->always_size * sizeof *s->always_table); } else if (s->always_num >= s->always_size) { s->always_size += 8; s->always_table = mem_realloc(s->always_table, s->always_size * sizeof *s->always_table); } s->always_table[s->always_num++] = kind; return PARSE_ERROR_NONE; } static enum parser_error parse_owner(struct parser *p) { struct store *s = parser_priv(p); unsigned int maxcost = parser_getuint(p, "purse"); char *name = string_make(parser_getstr(p, "name")); struct owner *o; if (!s) return PARSE_ERROR_MISSING_RECORD_HEADER; o = mem_zalloc(sizeof *o); o->oidx = (s->owners ? s->owners->oidx + 1 : 0); o->next = s->owners; o->name = name; o->max_cost = maxcost; s->owners = o; return PARSE_ERROR_NONE; } struct parser *init_parse_stores(void) { struct parser *p = parser_new(); parser_setpriv(p, NULL); parser_reg(p, "store uint index str name", parse_store); parser_reg(p, "owner uint purse str name", parse_owner); parser_reg(p, "slots uint min uint max", parse_slots); parser_reg(p, "turnover uint turnover", parse_turnover); parser_reg(p, "normal sym tval sym sval", parse_normal); parser_reg(p, "always sym tval sym sval", parse_always); return p; } static errr run_parse_stores(struct parser *p) { return parse_file(p, "store"); } static errr finish_parse_stores(struct parser *p) { stores = parser_priv(p); parser_destroy(p); return 0; } static struct file_parser store_parser = { "store", init_parse_stores, run_parse_stores, finish_parse_stores, NULL }; /*** Other init stuff ***/ static struct store *flatten_stores(struct store *store_list) { struct store *s; struct store *stores = mem_zalloc(MAX_STORES * sizeof(*stores)); for (s = store_list; s; s = s->next) { /* XXX bounds-check */ memcpy(&stores[s->sidx], s, sizeof(*s)); } while (store_list) { s = store_list->next; /* No need to free the sub-allocated memory, as this is passed on * to the array of stores */ mem_free(store_list); store_list = s; } return stores; } void store_init(void) { event_signal_string(EVENT_INITSTATUS, "Initialising stores..."); if (run_parser(&store_parser)) quit("Can't initialise stores"); stores = flatten_stores(stores); } void store_reset(void) { int i, j; struct store *s; for (i = 0; i < MAX_STORES; i++) { s = &stores[i]; s->stock_num = 0; store_shuffle(s); for (j = 0; j < s->stock_size; j++) object_wipe(&s->stock[j]); if (i == STORE_HOME) continue; for (j = 0; j < 10; j++) store_maint(s); } } /** * Check if a given item kind is an always-stocked item. */ static bool store_is_staple(struct store *s, object_kind *k) { size_t i; assert(s); assert(k); for (i = 0; i < s->always_num; i++) { object_kind *l = s->always_table[i]; if (k == l) return TRUE; } return FALSE; } /** * Check if a given item kind is an always-stocked or sometimes-stocked item. */ static bool store_can_carry(struct store *store, struct object_kind *kind) { size_t i; for (i = 0; i < store->normal_num; i++) { if (store->normal_table[i] == kind) return TRUE; } return store_is_staple(store, kind); } /* * The greeting a shopkeeper gives the character says a lot about his * general attitude. * * Taken and modified from Sangband 1.0. */ static void prt_welcome(const owner_type *ot_ptr) { char short_name[20]; const char *owner_name = ot_ptr->name; int j; if (one_in_(2)) return; /* Extract the first name of the store owner (stop before the first space) */ for (j = 0; owner_name[j] && owner_name[j] != ' '; j++) short_name[j] = owner_name[j]; /* Truncate the name */ short_name[j] = '\0'; if (one_in_(3)) { size_t i = randint0(N_ELEMENTS(comment_hint)); msg(comment_hint[i], random_hint()); } else if (p_ptr->lev > 5) { const char *player_name; /* We go from level 1 - 50 */ size_t i = ((unsigned)p_ptr->lev - 1) / 5; i = MIN(i, N_ELEMENTS(comment_welcome) - 1); /* Get a title for the character */ if ((i % 2) && randint0(2)) player_name = p_ptr->class->title[(p_ptr->lev - 1) / 5]; else if (randint0(2)) player_name = op_ptr->full_name; else { switch (p_ptr->psex) { case SEX_MALE: player_name = "sir"; break; case SEX_FEMALE: player_name = "madam"; break; case SEX_NEUTER: default: player_name = "ser"; break; } } /* Balthazar says "Welcome" */ prt(format(comment_welcome[i], short_name, player_name), 0, 0); } } /* * Let a shop-keeper React to a purchase * * We paid "price", it was worth "value", and we thought it was worth "guess" */ static void purchase_analyze(s32b price, s32b value, s32b guess) { /* Item was worthless, but we bought it */ if ((value <= 0) && (price > value)) msgt(MSG_STORE1, "%s", ONE_OF(comment_worthless)); /* Item was cheaper than we thought, and we paid more than necessary */ else if ((value < guess) && (price > value)) msgt(MSG_STORE2, "%s", ONE_OF(comment_bad)); /* Item was a good bargain, and we got away with it */ else if ((value > guess) && (value < (4 * guess)) && (price < value)) msgt(MSG_STORE3, "%s", ONE_OF(comment_good)); /* Item was a great bargain, and we got away with it */ else if ((value > guess) && (price < value)) msgt(MSG_STORE4, "%s", ONE_OF(comment_great)); } /*** Check if a store will buy an object ***/ /* * Determine if the current store will purchase the given object * * Note that a shop-keeper must refuse to buy "worthless" objects */ static bool store_will_buy(struct store *store, const object_type *o_ptr) { /* Switch on the store */ switch (store->sidx) { /* General Store */ case STORE_GENERAL: { /* Analyze the types */ switch (o_ptr->tval) { case TV_LIGHT: case TV_FOOD: case TV_FLASK: case TV_DIGGING: break; default: return (FALSE); } break; } /* Armoury */ case STORE_ARMOR: { /* Analyze the type */ switch (o_ptr->tval) { case TV_BOOTS: case TV_GLOVES: case TV_CROWN: case TV_HELM: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: break; default: return (FALSE); } break; } /* Weapon Shop */ case STORE_WEAPON: { /* Analyze the type */ switch (o_ptr->tval) { case TV_SHOT: case TV_BOLT: case TV_ARROW: case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: break; default: return (FALSE); } break; } /* Temple */ case STORE_TEMPLE: { /* Analyze the type */ switch (o_ptr->tval) { case TV_PRAYER_BOOK: case TV_SCROLL: case TV_POTION: case TV_HAFTED: break; case TV_POLEARM: case TV_SWORD: case TV_DIGGING: { /* Known blessed blades are accepted too */ if (object_is_known_blessed(o_ptr)) break; } default: return (FALSE); } break; } /* Alchemist */ case STORE_ALCHEMY: { /* Analyze the type */ switch (o_ptr->tval) { case TV_SCROLL: case TV_POTION: break; default: return (FALSE); } break; } /* Magic Shop */ case STORE_MAGIC: { /* Analyze the type */ switch (o_ptr->tval) { case TV_MAGIC_BOOK: case TV_AMULET: case TV_RING: case TV_STAFF: case TV_WAND: case TV_ROD: case TV_SCROLL: case TV_POTION: break; default: return (FALSE); } break; } /* Home */ case STORE_HOME: { return TRUE; } } /* Ignore "worthless" items */ if (object_value(o_ptr, 1, FALSE) <= 0) return (FALSE); /* Assume okay */ return (TRUE); } /* Get the current store or NULL if there isn't one */ static struct store *current_store(void) { int n = STORE_NONE; /* If we're displaying store knowledge whilst not in a store, * override the value returned */ if (store_knowledge != STORE_NONE) n = store_knowledge; else if (cave_isshop(cave, p_ptr->py, p_ptr->px)) n = cave_shopnum(cave, p_ptr->py, p_ptr->px); if (n != STORE_NONE) return &stores[n]; else return NULL; } /*** Basics: pricing, generation, etc. ***/ /* * Determine the price of an object (qty one) in a store. * * store_buying == TRUE means the shop is buying, player selling * == FALSE means the shop is selling, player buying * * This function never lets a shop-keeper lose money in a transaction. * * The "greed" value should exceed 100 when the player is "buying" the * object, and should be less than 100 when the player is "selling" it. * * Hack -- the black market always charges twice as much as it should. */ s32b price_item(const object_type *o_ptr, bool store_buying, int qty) { int adjust; s32b price; struct store *store = current_store(); owner_type *ot_ptr; if (!store) return 0L; ot_ptr = store->owner; /* Get the value of the stack of wands, or a single item */ if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF)) price = object_value(o_ptr, qty, FALSE); else price = object_value(o_ptr, 1, FALSE); /* Worthless items */ if (price <= 0) return (0L); /* The black market is always a worse deal */ if (store->sidx == STORE_B_MARKET) adjust = 150; else adjust = 100; /* Shop is buying */ if (store_buying) { /* Set the factor */ adjust = 100 + (100 - adjust); if (adjust > 100) adjust = 100; /* Shops now pay 2/3 of true value */ price = price * 2 / 3; /* Black market sucks */ if (store->sidx == STORE_B_MARKET) price = price / 2; /* Check for no_selling option */ if (OPT(birth_no_selling)) return (0L); } /* Shop is selling */ else { /* Fix the factor */ if (adjust < 100) adjust = 100; /* Black market sucks */ if (store->sidx == STORE_B_MARKET) price = price * 2; } /* Compute the final price (with rounding) */ price = (price * adjust + 50L) / 100L; /* Now convert price to total price for non-wands */ if (!(o_ptr->tval == TV_WAND) && !(o_ptr->tval == TV_STAFF)) price *= qty; /* Now limit the price to the purse limit */ if (store_buying && (price > ot_ptr->max_cost * qty)) price = ot_ptr->max_cost * qty; /* Note -- Never become "free" */ if (price <= 0L) return (qty); /* Return the price */ return (price); } /* * Special "mass production" computation. */ static int mass_roll(int times, int max) { int i, t = 0; assert(max > 1); for (i = 0; i < times; i++) t += randint0(max); return (t); } /* * Some cheap objects should be created in piles. */ static void mass_produce(object_type *o_ptr) { int size = 1; s32b cost = object_value(o_ptr, 1, FALSE); /* Analyze the type */ switch (o_ptr->tval) { /* Food, Flasks, and Lights */ case TV_FOOD: case TV_FLASK: case TV_LIGHT: { if (cost <= 5L) size += mass_roll(3, 5); if (cost <= 20L) size += mass_roll(3, 5); break; } case TV_POTION: case TV_SCROLL: { if (cost <= 60L) size += mass_roll(3, 5); if (cost <= 240L) size += mass_roll(1, 5); break; } case TV_MAGIC_BOOK: case TV_PRAYER_BOOK: { if (cost <= 50L) size += mass_roll(2, 3); if (cost <= 500L) size += mass_roll(1, 3); break; } case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_SHIELD: case TV_GLOVES: case TV_BOOTS: case TV_CLOAK: case TV_HELM: case TV_CROWN: case TV_SWORD: case TV_POLEARM: case TV_HAFTED: case TV_DIGGING: case TV_BOW: { if (o_ptr->ego) break; if (cost <= 10L) size += mass_roll(3, 5); if (cost <= 100L) size += mass_roll(3, 5); break; } case TV_SHOT: case TV_ARROW: case TV_BOLT: { if (cost <= 5L) size = randint1(2) * 20; /* 20-40 in 20s */ else if (cost > 5L && cost <= 50L) size = randint1(4) * 10; /* 10-40 in 10s */ else if (cost > 50 && cost <= 500L) size = randint1(4) * 5; /* 5-20 in 5s */ else size = 1; break; } } /* Save the total pile size */ o_ptr->number = size; } /* * Allow a store object to absorb another object */ static void store_object_absorb(object_type *o_ptr, object_type *j_ptr) { int total = o_ptr->number + j_ptr->number; /* Combine quantity, lose excess items */ o_ptr->number = (total >= MAX_STACK_SIZE) ? MAX_STACK_SIZE - 1 : total; /* Hack -- if rods are stacking, add the charging timeouts */ if (o_ptr->tval == TV_ROD) o_ptr->timeout += j_ptr->timeout; /* Hack -- if wands/staves are stacking, combine the charges */ if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF)) { o_ptr->pval[DEFAULT_PVAL] += j_ptr->pval[DEFAULT_PVAL]; } if ((o_ptr->origin != j_ptr->origin) || (o_ptr->origin_depth != j_ptr->origin_depth) || (o_ptr->origin_xtra != j_ptr->origin_xtra)) { int act = 2; if ((o_ptr->origin == ORIGIN_DROP) && (o_ptr->origin == j_ptr->origin)) { monster_race *r_ptr = &r_info[o_ptr->origin_xtra]; monster_race *s_ptr = &r_info[j_ptr->origin_xtra]; bool r_uniq = rf_has(r_ptr->flags, RF_UNIQUE) ? TRUE : FALSE; bool s_uniq = rf_has(s_ptr->flags, RF_UNIQUE) ? TRUE : FALSE; if (r_uniq && !s_uniq) act = 0; else if (s_uniq && !r_uniq) act = 1; else act = 2; } switch (act) { /* Overwrite with j_ptr */ case 1: { o_ptr->origin = j_ptr->origin; o_ptr->origin_depth = j_ptr->origin_depth; o_ptr->origin_xtra = j_ptr->origin_xtra; } /* Set as "mixed" */ case 2: { o_ptr->origin = ORIGIN_MIXED; } } } } /* * Check to see if the shop will be carrying too many objects * * Note that the shop, just like a player, will not accept things * it cannot hold. Before, one could "nuke" objects this way, by * adding them to a pile which was already full. */ static bool store_check_num(struct store *store, const object_type *o_ptr) { int i; object_type *j_ptr; /* Free space is always usable */ if (store->stock_num < store->stock_size) return TRUE; /* The "home" acts like the player */ if (store->sidx == STORE_HOME) { /* Check all the objects */ for (i = 0; i < store->stock_num; i++) { /* Get the existing object */ j_ptr = &store->stock[i]; /* Can the new object be combined with the old one? */ if (object_similar(j_ptr, o_ptr, OSTACK_PACK)) return (TRUE); } } /* Normal stores do special stuff */ else { /* Check all the objects */ for (i = 0; i < store->stock_num; i++) { /* Get the existing object */ j_ptr = &store->stock[i]; /* Can the new object be combined with the old one? */ if (object_similar(j_ptr, o_ptr, OSTACK_STORE)) return (TRUE); } } /* But there was no room at the inn... */ return (FALSE); } /* * Add an object to the inventory of the Home. * * In all cases, return the slot (or -1) where the object was placed. * * Note that this is a hacked up version of "inven_carry()". * * Also note that it may not correctly "adapt" to "knowledge" becoming * known: the player may have to pick stuff up and drop it again. */ static int home_carry(object_type *o_ptr) { int i, slot; u32b value, j_value; object_type *j_ptr; struct store *store = &stores[STORE_HOME]; /* Check each existing object (try to combine) */ for (slot = 0; slot < store->stock_num; slot++) { /* Get the existing object */ j_ptr = &store->stock[slot]; /* The home acts just like the player */ if (object_similar(j_ptr, o_ptr, OSTACK_PACK)) { /* Save the new number of items */ object_absorb(j_ptr, o_ptr); /* All done */ return (slot); } } /* No space? */ if (store->stock_num >= store->stock_size) return (-1); /* Determine the "value" of the object */ value = object_value(o_ptr, 1, FALSE); /* Check existing slots to see if we must "slide" */ for (slot = 0; slot < store->stock_num; slot++) { /* Get that object */ j_ptr = &store->stock[slot]; /* Hack -- readable books always come first */ if ((o_ptr->tval == p_ptr->class->spell_book) && (j_ptr->tval != p_ptr->class->spell_book)) break; if ((j_ptr->tval == p_ptr->class->spell_book) && (o_ptr->tval != p_ptr->class->spell_book)) continue; /* Objects sort by decreasing type */ if (o_ptr->tval > j_ptr->tval) break; if (o_ptr->tval < j_ptr->tval) continue; /* Can happen in the home */ if (!object_flavor_is_aware(o_ptr)) continue; if (!object_flavor_is_aware(j_ptr)) break; /* Objects sort by increasing sval */ if (o_ptr->sval < j_ptr->sval) break; if (o_ptr->sval > j_ptr->sval) continue; /* Objects in the home can be unknown */ if (!object_is_known(o_ptr)) continue; if (!object_is_known(j_ptr)) break; /* Objects sort by decreasing value */ j_value = object_value(j_ptr, 1, FALSE); if (value > j_value) break; if (value < j_value) continue; } /* Slide the others up */ for (i = store->stock_num; i > slot; i--) { /* Hack -- slide the objects */ object_copy(&store->stock[i], &store->stock[i-1]); } /* More stuff now */ store->stock_num++; /* Hack -- Insert the new object */ object_copy(&store->stock[slot], o_ptr); /* Return the location */ return (slot); } /* * Add an object to a real stores inventory. * * If the object is "worthless", it is thrown away (except in the home). * * If the object cannot be combined with an object already in the inventory, * make a new slot for it, and calculate its "per item" price. Note that * this price will be negative, since the price will not be "fixed" yet. * Adding an object to a "fixed" price stack will not change the fixed price. * * In all cases, return the slot (or -1) where the object was placed */ static int store_carry(struct store *store, object_type *o_ptr) { unsigned int i; unsigned int slot; u32b value, j_value; object_type *j_ptr; object_kind *kind = o_ptr->kind; /* Evaluate the object */ value = object_value(o_ptr, 1, FALSE); /* Cursed/Worthless items "disappear" when sold */ if (value <= 0) return (-1); /* Erase the inscription & pseudo-ID bit */ o_ptr->note = 0; /* Some item types require maintenance */ switch (o_ptr->tval) { /* Refuel lights to the standard amount */ case TV_LIGHT: { bitflag f[OF_SIZE]; object_flags(o_ptr, f); if (!of_has(f, OF_NO_FUEL)) { if (o_ptr->sval == SV_LIGHT_TORCH) o_ptr->timeout = DEFAULT_TORCH; else if (o_ptr->sval == SV_LIGHT_LANTERN) o_ptr->timeout = DEFAULT_LAMP; } break; } /* Recharge rods */ case TV_ROD: { o_ptr->timeout = 0; break; } /* Possibly recharge wands and staves */ case TV_STAFF: case TV_WAND: { /* If the store can stock this item kind, we recharge */ if (store_can_carry(store, o_ptr->kind)) { int charges = 0; /* Calculate the recharged number of charges */ for (i = 0; i < o_ptr->number; i++) charges += randcalc(kind->charge, 0, RANDOMISE); /* Use recharged value only if greater */ if (charges > o_ptr->pval[DEFAULT_PVAL]) o_ptr->pval[DEFAULT_PVAL] = charges; } break; } } /* Check each existing object (try to combine) */ for (slot = 0; slot < store->stock_num; slot++) { /* Get the existing object */ j_ptr = &store->stock[slot]; /* Can the existing items be incremented? */ if (object_similar(j_ptr, o_ptr, OSTACK_STORE)) { /* Absorb (some of) the object */ store_object_absorb(j_ptr, o_ptr); /* All done */ return (slot); } } /* No space? */ if (store->stock_num >= store->stock_size) { return (-1); } /* Check existing slots to see if we must "slide" */ for (slot = 0; slot < store->stock_num; slot++) { /* Get that object */ j_ptr = &store->stock[slot]; /* Objects sort by decreasing type */ if (o_ptr->tval > j_ptr->tval) break; if (o_ptr->tval < j_ptr->tval) continue; /* Objects sort by increasing sval */ if (o_ptr->sval < j_ptr->sval) break; if (o_ptr->sval > j_ptr->sval) continue; /* Evaluate that slot */ j_value = object_value(j_ptr, 1, FALSE); /* Objects sort by decreasing value */ if (value > j_value) break; if (value < j_value) continue; } /* Slide the others up */ for (i = store->stock_num; i > slot; i--) { /* Hack -- slide the objects */ object_copy(&store->stock[i], &store->stock[i-1]); } /* More stuff now */ store->stock_num++; /* Hack -- Insert the new object */ object_copy(&store->stock[slot], o_ptr); /* Return the location */ return (slot); } /* * Increase, by a 'num', the number of an item 'item' in store 'st'. * This can result in zero items. */ static void store_item_increase(struct store *store, int item, int num) { int cnt; object_type *o_ptr; /* Get the object */ o_ptr = &store->stock[item]; /* Verify the number */ cnt = o_ptr->number + num; if (cnt > 255) cnt = 255; else if (cnt < 0) cnt = 0; /* Save the new number */ o_ptr->number = cnt; } /* * Remove a slot if it is empty, in store 'st'. */ static void store_item_optimize(struct store *store, int item) { int j; object_type *o_ptr; /* Get the object */ o_ptr = &store->stock[item]; /* Must exist */ if (!o_ptr->kind) return; /* Must have no items */ if (o_ptr->number) return; /* One less object */ store->stock_num--; /* Slide everyone */ for (j = item; j < store->stock_num; j++) { store->stock[j] = store->stock[j + 1]; } /* Nuke the final slot */ object_wipe(&store->stock[j]); } /* * Delete an object from store 'st', or, if it is a stack, perhaps only * partially delete it. */ static void store_delete_index(struct store *store, int what) { int num; object_type *o_ptr; /* Paranoia */ if (store->stock_num <= 0) return; /* Get the object */ o_ptr = &store->stock[what]; /* Determine how many objects are in the slot */ num = o_ptr->number; /* Deal with stacks */ if (num > 1) { /* Special behaviour for arrows, bolts &tc. */ switch (o_ptr->tval) { case TV_SHOT: case TV_ARROW: case TV_BOLT: { /* 50% of the time, destroy the entire stack */ if (randint0(100) < 50 || num < 10) num = o_ptr->number; /* 50% of the time, reduce the size to a multiple of 5 */ else num = randint1(num / 5) * 5 + (num % 5); break; } default: { /* 50% of the time, destroy a single object */ if (randint0(100) < 50) num = 1; /* 25% of the time, destroy half the objects */ else if (randint0(100) < 50) num = (num + 1) / 2; /* 25% of the time, destroy all objects */ else num = o_ptr->number; /* Hack -- decrement the total charges of staves and wands. */ if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND) { o_ptr->pval[DEFAULT_PVAL] -= num * o_ptr->pval[DEFAULT_PVAL] / o_ptr->number; } } } } if (o_ptr->artifact) history_lose_artifact(o_ptr->artifact); /* Delete the item */ store_item_increase(store, what, -num); store_item_optimize(store, what); } /** * Find a given object kind in the store. */ static object_type *store_find_kind(struct store *s, object_kind *k) { int slot; assert(s); assert(k); /* Check if it's already in stock */ for (slot = 0; slot < s->stock_num; slot++) { if (s->stock[slot].kind == k && !s->stock[slot].ego) { return &s->stock[slot]; } } return NULL; } /* * Delete a random object from store 'st', or, if it is a stack, perhaps only * partially delete it. * * This function is used when store maintainance occurs, and is designed to * imitate non-PC purchasers making purchases from the store. * * The reason this doesn't check for "staple" items and refuse to * delete them is that a store could conceviably have two stacks of a * single staple item, in which case, you could have a store which had * more stacks than staple items, but all stacks are staple items. */ static void store_delete_random(struct store *store) { int what; if (store->stock_num <= 0) return; /* Pick a random slot */ what = randint0(store->stock_num); store_delete_index(store, what); } /* * This makes sure that the black market doesn't stock any object that other * stores have, unless it is an ego-item or has various bonuses. * * Based on a suggestion by Lee Vogt . */ static bool black_market_ok(const object_type *o_ptr) { int i, j; /* Ego items are always fine */ if (o_ptr->ego) return (TRUE); /* Good items are normally fine */ if (o_ptr->to_a > 2) return (TRUE); if (o_ptr->to_h > 1) return (TRUE); if (o_ptr->to_d > 2) return (TRUE); /* No cheap items */ if (object_value(o_ptr, 1, FALSE) < 10) return (FALSE); /* Check the other stores */ for (i = 0; i < MAX_STORES; i++) { /* Skip home and black market */ if (i == STORE_B_MARKET || i == STORE_HOME) continue; /* Check every object in the store */ for (j = 0; j < stores[i].stock_num; j++) { object_type *j_ptr = &stores[i].stock[j]; /* Compare object kinds */ if (o_ptr->kind == j_ptr->kind) return (FALSE); } } /* Otherwise fine */ return (TRUE); } /* * Get a choice from the store allocation table, in tables.c */ static object_kind *store_get_choice(struct store *store) { /* Choose a random entry from the store's table */ return store->normal_table[randint0(store->normal_num)]; } /* * Creates a random object and gives it to store 'st' */ static bool store_create_random(struct store *store) { int tries, level; object_type *i_ptr; object_type object_type_body; int min_level, max_level; /* Decide min/max levels */ if (store->sidx == STORE_B_MARKET) { min_level = p_ptr->max_depth + 5; max_level = p_ptr->max_depth + 20; } else { min_level = 1; max_level = STORE_OBJ_LEVEL + MAX(p_ptr->max_depth - 20, 0); } if (min_level > 55) min_level = 55; if (max_level > 70) max_level = 70; /* Consider up to six items */ for (tries = 0; tries < 6; tries++) { object_kind *kind; /* Work out the level for objects to be generated at */ level = rand_range(min_level, max_level); /* Black Markets have a random object, of a given level */ if (store->sidx == STORE_B_MARKET) kind = get_obj_num(level, FALSE, 0); else kind = store_get_choice(store); /*** Pre-generation filters ***/ /* No chests in stores XXX */ if (kind->tval == TV_CHEST) continue; /*** Generate the item ***/ /* Get local object */ i_ptr = &object_type_body; /* Create a new object of the chosen kind */ object_prep(i_ptr, kind, level, RANDOMISE); /* Apply some "low-level" magic (no artifacts) */ apply_magic(i_ptr, level, FALSE, FALSE, FALSE, FALSE); /* Reject if item is 'damaged' (i.e. negative mods) */ switch (i_ptr->tval) { case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOW: case TV_SHOT: case TV_ARROW: case TV_BOLT: { if ((i_ptr->to_h < 0) || (i_ptr->to_d < 0)) continue; } case TV_DRAG_ARMOR: case TV_HARD_ARMOR: case TV_SOFT_ARMOR: case TV_SHIELD: case TV_HELM: case TV_CROWN: case TV_CLOAK: case TV_GLOVES: case TV_BOOTS: { if (i_ptr->to_a < 0) continue; } default: { /* nothing to do */ } } /* The object is "known" and belongs to a store */ i_ptr->ident |= IDENT_STORE; i_ptr->origin = ORIGIN_STORE; /*** Post-generation filters ***/ /* Black markets have expensive tastes */ if ((store->sidx == STORE_B_MARKET) && !black_market_ok(i_ptr)) continue; /* No "worthless" items */ if (object_value(i_ptr, 1, FALSE) < 1) continue; /* Mass produce and/or apply discount */ mass_produce(i_ptr); /* Attempt to carry the object */ (void)store_carry(store, i_ptr); /* Definitely done */ return TRUE; } return FALSE; } /* * Helper function: create an item with the given tval,sval pair, add it to the * store st. Return the slot in the inventory. */ static int store_create_item(struct store *store, object_kind *kind) { object_type object = { 0 }; /* Create a new object of the chosen kind */ object_prep(&object, kind, 0, RANDOMISE); /* Item belongs to a store */ object.ident |= IDENT_STORE; object.origin = ORIGIN_STORE; /* Attempt to carry the object */ return store_carry(store, &object); } /* * Maintain the inventory at the stores. */ void store_maint(struct store *s) { int j; /* Ignore home */ if (s->sidx == STORE_HOME) return; /* Destroy crappy black market items */ if (s->sidx == STORE_B_MARKET) { for (j = s->stock_num - 1; j >= 0; j--) { object_type *o_ptr = &s->stock[j]; if (!black_market_ok(o_ptr)) { store_item_increase(s, j, 0 - o_ptr->number); store_item_optimize(s, j); } } } /* We want to make sure stores have staple items. If there's * turnover, we also want to delete a few items, and add a few * items. * * If we create staple items, then delete items, then create new * items, we are stuck with one of three choices: * 1. We can risk deleting staple items, and not having any left. * 2. We can refuse to delete staple items, and risk having that * become an infinite loop. * 3. We can do a ton of extra bookkeeping to make sure we delete * staple items only if there's duplicates of them. * * What if we change the order? First sell a handful of random items, * then create any missing staples, then create new items. This * has two tests for s->turnover, but simplifies everything else * dramatically. */ if (s->turnover) { int restock_attempts = 100000; int stock = s->stock_num - randint1(s->turnover); /* We'll end up adding staples for sure, maybe plus other * items. It's fine if we sell out completely, though, if * turnover is high. The cap doesn't include always_num, * because otherwise the addition of missing staples could * put us over (if the store was full of player-sold loot). */ int min = 0; int max = s->normal_stock_max; /* Sell a few items */ stock = s->stock_num; stock -= randint1(s->turnover); if (stock < min) stock = min; if (stock > max) stock = max; /* Destroy random objects until only "stock" slots are left */ while (s->stock_num > stock && --restock_attempts) store_delete_random(s); if (!restock_attempts) quit_fmt("Unable to (de-)stock store %d. Please report this bug", s->sidx + 1); } /* Ensure staples are created */ if (s->always_num) { size_t i; for (i = 0; i < s->always_num; i++) { object_kind *k = s->always_table[i]; object_type *o = store_find_kind(s, k); if (o) { /* ensure a full stack */ o->number = MAX_STACK_SIZE - 1; } else { /* Now create the item */ int slot = store_create_item(s, k); struct object *o = &s->stock[slot]; o->number = MAX_STACK_SIZE - 1; } } } if (s->turnover) { int restock_attempts = 100000; int stock = s->stock_num + randint1(s->turnover); /* Now that the staples exist, we want to add more * items, at least enough to get us to normal_stock_min * items that aren't necessarily staples. */ int min = s->normal_stock_min + s->always_num; int max = s->normal_stock_max + s->always_num; /* Buy a few items */ /* Keep stock between specified min and max slots */ if (stock > max) stock = max; if (stock < min) stock = min; /* For the rest, we just choose items randomlyish */ /* The (huge) restock_attempts will only go to zero (otherwise * infinite loop) if stores don't have enough items they can stock! */ while (s->stock_num < stock && --restock_attempts) store_create_random(s); if (!restock_attempts) quit_fmt("Unable to (re-)stock store %d. Please report this bug", s->sidx + 1); } } /** Owner stuff **/ struct owner *store_ownerbyidx(struct store *s, unsigned int idx) { struct owner *o; for (o = s->owners; o; o = o->next) { if (o->oidx == idx) return o; } quit_fmt("Bad call to store_ownerbyidx: idx is %d\n", idx); return 0; /* Needed to avoid Windows compiler warning */ } static struct owner *store_choose_owner(struct store *s) { struct owner *o; unsigned int n = 0; for (o = s->owners; o; o = o->next) { n++; } n = randint0(n); return store_ownerbyidx(s, n); } /* * Shuffle one of the stores. */ void store_shuffle(struct store *store) { struct owner *o = store->owner; while (o == store->owner) o = store_choose_owner(store); store->owner = o; } /*** Display code ***/ /* * This function sets up screen locations based on the current term size. * * Current screen layout: * line 0: reserved for messages * line 1: shopkeeper and their purse / item buying price * line 2: empty * line 3: table headers * * line 4: Start of items * * If help is turned off, then the rest of the display goes as: * * line (height - 4): end of items * line (height - 3): "more" prompt * line (height - 2): empty * line (height - 1): Help prompt and remaining gold * * If help is turned on, then the rest of the display goes as: * * line (height - 7): end of items * line (height - 6): "more" prompt * line (height - 4): gold remaining * line (height - 3): command help */ static void store_display_recalc(menu_type *m) { int wid, hgt; region loc; struct store *store = current_store(); Term_get_size(&wid, &hgt); /* Clip the width at a maximum of 104 (enough room for an 80-char item name) */ if (wid > 104) wid = 104; /* Clip the text_out function at two smaller than the screen width */ text_out_wrap = wid - 2; /* X co-ords first */ scr_places_x[LOC_PRICE] = wid - 14; scr_places_x[LOC_AU] = wid - 26; scr_places_x[LOC_OWNER] = wid - 2; scr_places_x[LOC_WEIGHT] = wid - 14; /* Add space for for prices */ if (store->sidx != STORE_HOME) scr_places_x[LOC_WEIGHT] -= 10; /* Then Y */ scr_places_y[LOC_OWNER] = 1; scr_places_y[LOC_HEADER] = 3; /* If we are displaying help, make the height smaller */ if (store_flags & (STORE_SHOW_HELP)) hgt -= 3; scr_places_y[LOC_MORE] = hgt - 3; scr_places_y[LOC_AU] = hgt - 1; loc = m->boundary; /* If we're displaying the help, then put it with a line of padding */ if (store_flags & (STORE_SHOW_HELP)) { scr_places_y[LOC_HELP_CLEAR] = hgt - 1; scr_places_y[LOC_HELP_PROMPT] = hgt; loc.page_rows = -5; } else { scr_places_y[LOC_HELP_CLEAR] = hgt - 2; scr_places_y[LOC_HELP_PROMPT] = hgt - 1; loc.page_rows = -2; } menu_layout(m, &loc); } /* * Redisplay a single store entry */ static void store_display_entry(menu_type *menu, int oid, bool cursor, int row, int col, int width) { object_type *o_ptr; s32b x; int desc = ODESC_PREFIX; char o_name[80]; char out_val[160]; byte colour; struct store *store = current_store(); assert(store); /* Get the object */ o_ptr = &store->stock[oid]; /* Describe the object - preserving insriptions in the home */ if (store->sidx == STORE_HOME) desc = ODESC_FULL; else desc = ODESC_FULL | ODESC_STORE; object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | desc); /* Display the object */ c_put_str(tval_to_attr[o_ptr->tval & 0x7F], o_name, row, col); /* Show weights */ colour = curs_attrs[CURS_KNOWN][(int)cursor]; strnfmt(out_val, sizeof out_val, "%3d.%d lb", o_ptr->weight / 10, o_ptr->weight % 10); c_put_str(colour, out_val, row, scr_places_x[LOC_WEIGHT]); /* Describe an object (fully) in a store */ if (store->sidx != STORE_HOME) { /* Extract the "minimum" price */ x = price_item(o_ptr, FALSE, 1); /* Make sure the player can afford it */ if ((int) p_ptr->au < (int) x) colour = curs_attrs[CURS_UNKNOWN][(int)cursor]; /* Actually draw the price */ if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF)) && (o_ptr->number > 1)) strnfmt(out_val, sizeof out_val, "%9ld avg", (long)x); else strnfmt(out_val, sizeof out_val, "%9ld ", (long)x); c_put_str(colour, out_val, row, scr_places_x[LOC_PRICE]); } } /* * Display store (after clearing screen) */ static void store_display_frame(void) { char buf[80]; struct store *store = current_store(); owner_type *ot_ptr = store->owner; /* Clear screen */ Term_clear(); /* The "Home" is special */ if (store->sidx == STORE_HOME) { /* Put the owner name */ put_str("Your Home", scr_places_y[LOC_OWNER], 1); /* Label the object descriptions */ put_str("Home Inventory", scr_places_y[LOC_HEADER], 1); /* Show weight header */ put_str("Weight", scr_places_y[LOC_HEADER], scr_places_x[LOC_WEIGHT] + 2); } /* Normal stores */ else { const char *store_name = store->name; const char *owner_name = ot_ptr->name; /* Put the owner name */ put_str(owner_name, scr_places_y[LOC_OWNER], 1); /* Show the max price in the store (above prices) */ strnfmt(buf, sizeof(buf), "%s (%ld)", store_name, (long)(ot_ptr->max_cost)); prt(buf, scr_places_y[LOC_OWNER], scr_places_x[LOC_OWNER] - strlen(buf)); /* Label the object descriptions */ put_str("Store Inventory", scr_places_y[LOC_HEADER], 1); /* Showing weight label */ put_str("Weight", scr_places_y[LOC_HEADER], scr_places_x[LOC_WEIGHT] + 2); /* Label the asking price (in stores) */ put_str("Price", scr_places_y[LOC_HEADER], scr_places_x[LOC_PRICE] + 4); } } /* * Display help. */ static void store_display_help(void) { int help_loc = scr_places_y[LOC_HELP_PROMPT]; struct store *store = current_store(); bool is_home = (store->sidx == STORE_HOME) ? TRUE : FALSE; /* Clear */ clear_from(scr_places_y[LOC_HELP_CLEAR]); /* Prepare help hooks */ text_out_hook = text_out_to_screen; text_out_indent = 1; Term_gotoxy(1, help_loc); if (OPT(rogue_like_commands)) text_out_c(TERM_L_GREEN, "x"); else text_out_c(TERM_L_GREEN, "l"); text_out(" examines"); if (store_knowledge == STORE_NONE) { text_out(" and "); text_out_c(TERM_L_GREEN, "p"); if (is_home) text_out(" picks up"); else text_out(" purchases"); } text_out(" the selected item. "); if (store_knowledge == STORE_NONE) { if (OPT(birth_no_selling)) { text_out_c(TERM_L_GREEN, "d"); text_out(" gives an item to the store in return for its identification. Some wands and staves will also be recharged. "); } else { text_out_c(TERM_L_GREEN, "d"); if (is_home) text_out(" drops"); else text_out(" sells"); text_out(" an item from your inventory. "); } } else { text_out_c(TERM_L_GREEN, "I"); text_out("' inspects an item from your inventory. "); } text_out_c(TERM_L_GREEN, "ESC"); if (store_knowledge == STORE_NONE) text_out(" exits the building."); else text_out(" exits this screen."); text_out_indent = 0; } /* * Decides what parts of the store display to redraw. Called on terminal * resizings and the redraw command. */ static void store_redraw(void) { if (store_flags & (STORE_FRAME_CHANGE)) { store_display_frame(); if (store_flags & STORE_SHOW_HELP) store_display_help(); else prt("Press '?' for help.", scr_places_y[LOC_HELP_PROMPT], 1); store_flags &= ~(STORE_FRAME_CHANGE); } if (store_flags & (STORE_GOLD_CHANGE)) { prt(format("Gold Remaining: %9ld", (long)p_ptr->au), scr_places_y[LOC_AU], scr_places_x[LOC_AU]); store_flags &= ~(STORE_GOLD_CHANGE); } } /*** Higher-level code ***/ static bool store_get_check(const char *prompt) { struct keypress ch; /* Prompt for it */ prt(prompt, 0, 0); /* Get an answer */ ch = inkey(); /* Erase the prompt */ prt("", 0, 0); if (ch.code == ESCAPE) return (FALSE); if (strchr("Nn", ch.code)) return (FALSE); /* Success */ return (TRUE); } /* * Return the quantity of a given item in the pack (include quiver). */ static int find_inven(const object_type *o_ptr) { int i, j; int num = 0; /* Similar slot? */ for (j = 0; j < QUIVER_END; j++) { object_type *j_ptr = &p_ptr->inventory[j]; /* Check only the inventory and the quiver */ if (j >= INVEN_WIELD && j < QUIVER_START) continue; /* Require identical object types */ if (o_ptr->kind != j_ptr->kind) continue; /* Analyze the items */ switch (o_ptr->tval) { /* Chests */ case TV_CHEST: { /* Never okay */ return 0; } /* Food and Potions and Scrolls */ case TV_FOOD: case TV_POTION: case TV_SCROLL: { /* Assume okay */ break; } /* Staves and Wands */ case TV_STAFF: case TV_WAND: { /* Assume okay */ break; } /* Rods */ case TV_ROD: { /* Assume okay */ break; } /* Weapons and Armor */ case TV_BOW: case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: { /* Fall through */ } /* Rings, Amulets, Lights */ case TV_RING: case TV_AMULET: case TV_LIGHT: { /* Require both items to be known */ if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) continue; /* Fall through */ } /* Missiles */ case TV_BOLT: case TV_ARROW: case TV_SHOT: { /* Require identical knowledge of both items */ if (object_is_known(o_ptr) != object_is_known(j_ptr)) continue; /* Require identical "bonuses" */ if (o_ptr->to_h != j_ptr->to_h) continue; if (o_ptr->to_d != j_ptr->to_d) continue; if (o_ptr->to_a != j_ptr->to_a) continue; /* Require identical "pval" codes */ for (i = 0; i < MAX_PVALS; i++) if (o_ptr->pval[i] != j_ptr->pval[i]) continue; if (o_ptr->num_pvals != j_ptr->num_pvals) continue; /* Require identical "artifact" names */ if (o_ptr->artifact != j_ptr->artifact) continue; /* Require identical "ego-item" names */ if (o_ptr->ego != j_ptr->ego) continue; /* Lights must have same amount of fuel */ else if (o_ptr->timeout != j_ptr->timeout && o_ptr->tval == TV_LIGHT) continue; /* Require identical "values" */ if (o_ptr->ac != j_ptr->ac) continue; if (o_ptr->dd != j_ptr->dd) continue; if (o_ptr->ds != j_ptr->ds) continue; /* Probably okay */ break; } /* Various */ default: { /* Require knowledge */ if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) continue; /* Probably okay */ break; } } /* Different flags */ if (!of_is_equal(o_ptr->flags, j_ptr->flags)) continue; /* They match, so add up */ num += j_ptr->number; } return num; } /* * Buy the item with the given index from the current store's inventory. */ void do_cmd_buy(cmd_code code, cmd_arg args[]) { int item = args[0].item; int amt = args[1].number; object_type *o_ptr; object_type object_type_body; object_type *i_ptr = &object_type_body; char o_name[80]; int price, item_new; struct store *store = current_store(); if (!store) { msg("You cannot purchase items when not in a store."); return; } /* Get the actual object */ o_ptr = &store->stock[item]; /* Get desired object */ object_copy_amt(i_ptr, o_ptr, amt); /* Ensure we have room */ if (!inven_carry_okay(i_ptr)) { msg("You cannot carry that many items."); return; } /* Describe the object (fully) */ object_desc(o_name, sizeof(o_name), i_ptr, ODESC_PREFIX | ODESC_FULL); /* Extract the price for the entire stack */ price = price_item(i_ptr, FALSE, i_ptr->number); if (price > p_ptr->au) { msg("You cannot afford that purchase."); return; } /* Spend the money */ p_ptr->au -= price; /* Update the display */ store_flags |= STORE_GOLD_CHANGE; /* ID objects on buy */ object_notice_everything(i_ptr); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER | PN_SQUELCH); /* The object no longer belongs to the store */ i_ptr->ident &= ~(IDENT_STORE); /* Message */ if (one_in_(3)) msgt(MSG_STORE5, "%s", ONE_OF(comment_accept)); msg("You bought %s for %ld gold.", o_name, (long)price); /* Erase the inscription */ i_ptr->note = 0; /* Give it to the player */ item_new = inven_carry(p_ptr, i_ptr); /* Message */ object_desc(o_name, sizeof(o_name), &p_ptr->inventory[item_new], ODESC_PREFIX | ODESC_FULL); msg("You have %s (%c).", o_name, index_to_label(item_new)); /* Hack - Reduce the number of charges in the original stack */ if (o_ptr->tval == TV_WAND || o_ptr->tval == TV_STAFF) { o_ptr->pval[DEFAULT_PVAL] -= i_ptr->pval[DEFAULT_PVAL]; } /* Handle stuff */ handle_stuff(p_ptr); /* Remove the bought objects from the store if it's not a staple */ if (!store_is_staple(store, store->stock[item].kind)) { store_item_increase(store, item, -amt); store_item_optimize(store, item); /* Store is empty */ if (store->stock_num == 0) { int i; /* Shuffle */ if (one_in_(STORE_SHUFFLE)) { /* Message */ msg("The shopkeeper retires."); /* Shuffle the store */ store_shuffle(store); store_flags |= STORE_FRAME_CHANGE; } /* Maintain */ else { /* Message */ msg("The shopkeeper brings out some new stock."); } /* New inventory */ for (i = 0; i < 10; ++i) store_maint(store); } } event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* * Retrieve the item with the given index from the home's inventory. */ void do_cmd_retrieve(cmd_code code, cmd_arg args[]) { int item = args[0].item; int amt = args[1].number; object_type *o_ptr; object_type picked_item; char o_name[80]; int item_new; struct store *store = current_store(); if (store->sidx != STORE_HOME) { msg("You are not currently at home."); return; } /* Get the actual object */ o_ptr = &store->stock[item]; /* Get desired object */ object_copy_amt(&picked_item, o_ptr, amt); /* Ensure we have room */ if (!inven_carry_okay(&picked_item)) { msg("You cannot carry that many items."); return; } /* Distribute charges of wands, staves, or rods */ distribute_charges(o_ptr, &picked_item, amt); /* Give it to the player */ item_new = inven_carry(p_ptr, &picked_item); /* Describe just the result */ object_desc(o_name, sizeof(o_name), &p_ptr->inventory[item_new], ODESC_PREFIX | ODESC_FULL); /* Message */ msg("You have %s (%c).", o_name, index_to_label(item_new)); /* Handle stuff */ handle_stuff(p_ptr); /* Remove the items from the home */ store_item_increase(store, item, -amt); store_item_optimize(store, item); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* * Buy an object from a store */ static bool store_purchase(int item) { int amt, num; object_type *o_ptr; object_type object_type_body; object_type *i_ptr = &object_type_body; char o_name[80]; s32b price; struct store *store = current_store(); if (!store) { msg("You cannot purchase items when not in a store."); return FALSE; } if (item < 0) return FALSE; /* Get the actual object */ o_ptr = &store->stock[item]; /* Clear all current messages */ msg_flag = FALSE; prt("", 0, 0); if (store->sidx == STORE_HOME) { amt = o_ptr->number; } else { /* Price of one */ price = price_item(o_ptr, FALSE, 1); /* Check if the player can afford any at all */ if ((u32b)p_ptr->au < (u32b)price) { /* Tell the user */ msg("You do not have enough gold for this item."); /* Abort now */ return FALSE; } /* Work out how many the player can afford */ if (price == 0) amt = o_ptr->number; /* Prevent division by zero */ else amt = p_ptr->au / price; if (amt > o_ptr->number) amt = o_ptr->number; /* Double check for wands/staves */ if ((p_ptr->au >= price_item(o_ptr, FALSE, amt+1)) && (amt < o_ptr->number)) amt++; } /* Find the number of this item in the inventory */ if (!object_flavor_is_aware(o_ptr)) num = 0; else num = find_inven(o_ptr); strnfmt(o_name, sizeof o_name, "%s how many%s? (max %d) ", (store->sidx == STORE_HOME) ? "Take" : "Buy", num ? format(" (you have %d)", num) : "", amt); /* Get a quantity */ amt = get_quantity(o_name, amt); /* Allow user abort */ if (amt <= 0) return FALSE; /* Get desired object */ object_copy_amt(i_ptr, o_ptr, amt); /* Ensure we have room */ if (!inven_carry_okay(i_ptr)) { msg("You cannot carry that many items."); return FALSE; } /* Describe the object (fully) */ object_desc(o_name, sizeof(o_name), i_ptr, ODESC_PREFIX | ODESC_FULL | ODESC_STORE); /* Attempt to buy it */ if (store->sidx != STORE_HOME) { bool response; /* Extract the price for the entire stack */ price = price_item(i_ptr, FALSE, i_ptr->number); screen_save(); /* Show price */ prt(format("Price: %d", price), 1, 0); /* Confirm purchase */ response = store_get_check(format("Buy %s? [ESC, any other key to accept]", o_name)); screen_load(); /* Negative response, so give up */ if (!response) return FALSE; cmd_insert(CMD_BUY); cmd_set_arg_choice(cmd_get_top(), 0, item); cmd_set_arg_number(cmd_get_top(), 1, amt); } /* Home is much easier */ else { cmd_insert(CMD_RETRIEVE); cmd_set_arg_choice(cmd_get_top(), 0, item); cmd_set_arg_number(cmd_get_top(), 1, amt); } /* Not kicked out */ return TRUE; } /* * Determine if the current store will purchase the given object */ static bool store_will_buy_tester(const object_type *o_ptr) { struct store *store = current_store(); if (!store) return FALSE; if (OPT(birth_no_selling)) { switch (o_ptr->tval) { case TV_STAFF: case TV_WAND: if (!store_can_carry(store, o_ptr->kind) && object_is_known(o_ptr)) return FALSE; break; default: if (object_is_known(o_ptr)) return FALSE; } } return store_will_buy(store, o_ptr); } /* * Sell an item to the current store. */ void do_cmd_sell(cmd_code code, cmd_arg args[]) { int item = args[0].item; int amt = args[1].number; object_type sold_item; struct store *store = current_store(); int price, dummy, value; char o_name[120]; /* Get the item */ object_type *o_ptr = object_from_item_idx(item); /* Cannot remove cursed objects */ if ((item >= INVEN_WIELD) && cursed_p(o_ptr->flags)) { msg("Hmmm, it seems to be cursed."); return; } /* Check we are somewhere we can sell the items. */ if (!store) { msg("You cannot sell items when not in a store."); return; } /* Check the store wants the items being sold */ if (!store_will_buy(store, o_ptr)) { msg("I do not wish to purchase this item."); return; } /* Get a copy of the object representing the number being sold */ object_copy_amt(&sold_item, o_ptr, amt); /* Check if the store has space for the items */ if (!store_check_num(store, &sold_item)) { msg("I have not the room in my store to keep it."); return; } price = price_item(&sold_item, TRUE, amt); /* Get some money */ p_ptr->au += price; /* Update the display */ store_flags |= STORE_GOLD_CHANGE; /* Update the auto-history if selling an artifact that was previously un-IDed. (Ouch!) */ if (o_ptr->artifact) history_add_artifact(o_ptr->artifact, TRUE, TRUE); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP); /* Get the "apparent" value */ dummy = object_value(&sold_item, amt, FALSE); /* Identify original object */ object_notice_everything(o_ptr); /* Take a new copy of the now known-about object. */ object_copy_amt(&sold_item, o_ptr, amt); /* The item belongs to the store now */ sold_item.ident |= IDENT_STORE; /* * Hack -- Allocate charges between those wands, staves, or rods * sold and retained, unless all are being sold. */ distribute_charges(o_ptr, &sold_item, amt); /* Get the "actual" value */ value = object_value(&sold_item, amt, FALSE); /* Get the description all over again */ object_desc(o_name, sizeof(o_name), &sold_item, ODESC_PREFIX | ODESC_FULL); /* Describe the result (in message buffer) */ if (OPT(birth_no_selling)) { msg("You had %s (%c).", o_name, index_to_label(item)); } else { msg("You sold %s (%c) for %ld gold.", o_name, index_to_label(item), (long)price); /* Analyze the prices (and comment verbally) */ purchase_analyze(price, value, dummy); } /* Set squelch flag */ p_ptr->notice |= PN_SQUELCH; /* Take the object from the player */ inven_item_increase(item, -amt); inven_item_optimize(item); /* Notice if pack items need to be combined or reordered */ notice_stuff(p_ptr); /* Handle stuff */ handle_stuff(p_ptr); /* The store gets that (known) object */ store_carry(store, &sold_item); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* * Stash an item in the home. */ void do_cmd_stash(cmd_code code, cmd_arg args[]) { int item = args[0].item; int amt = args[1].number; object_type dropped_item; object_type *o_ptr = object_from_item_idx(item); struct store *store = current_store(); char o_name[120]; /* Check we are somewhere we can stash items. */ if (store->sidx != STORE_HOME) { msg("You are not in your home."); return; } /* Cannot remove cursed objects */ if ((item >= INVEN_WIELD) && cursed_p(o_ptr->flags)) { msg("Hmmm, it seems to be cursed."); return; } /* Get a copy of the object representing the number being sold */ object_copy_amt(&dropped_item, o_ptr, amt); if (!store_check_num(store, &dropped_item)) { msg("Your home is full."); return; } /* Distribute charges of wands/staves/rods */ distribute_charges(o_ptr, &dropped_item, amt); /* Describe */ object_desc(o_name, sizeof(o_name), &dropped_item, ODESC_PREFIX | ODESC_FULL); /* Message */ msg("You drop %s (%c).", o_name, index_to_label(item)); /* Take it from the players inventory */ inven_item_increase(item, -amt); inven_item_optimize(item); /* Handle stuff */ handle_stuff(p_ptr); /* Let the home carry it */ home_carry(&dropped_item); event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* * Sell an object, or drop if it we're in the home. */ static bool store_sell(void) { int amt; int item; int get_mode = USE_EQUIP | USE_INVEN | USE_FLOOR; object_type *o_ptr; object_type object_type_body; object_type *i_ptr = &object_type_body; char o_name[120]; const char *reject = "You have nothing that I want. "; const char *prompt = OPT(birth_no_selling) ? "Give which item? " : "Sell which item? "; struct store *store = current_store(); if (!store) { msg("You cannot %s items when not in a store.", OPT(birth_no_selling) ? "give" : "sell"); return FALSE; } /* Clear all current messages */ msg_flag = FALSE; prt("", 0, 0); if (store->sidx == STORE_HOME) { prompt = "Drop which item? "; } else { item_tester_hook = store_will_buy_tester; get_mode |= SHOW_PRICES; } /* Get an item */ p_ptr->command_wrk = USE_INVEN; if (!get_item(&item, prompt, reject, CMD_DROP, get_mode)) return FALSE; /* Get the item */ o_ptr = object_from_item_idx(item); /* Hack -- Cannot remove cursed objects */ if ((item >= INVEN_WIELD) && cursed_p(o_ptr->flags)) { /* Oops */ msg("Hmmm, it seems to be cursed."); /* Nope */ return FALSE; } /* Get a quantity */ amt = get_quantity(NULL, o_ptr->number); /* Allow user abort */ if (amt <= 0) return FALSE; /* Get a copy of the object representing the number being sold */ object_copy_amt(i_ptr, object_from_item_idx(item), amt); if (!store_check_num(store, i_ptr)) { if (store->sidx == STORE_HOME) msg("Your home is full."); else msg("I have not the room in my store to keep it."); return FALSE; } /* Get a full description */ object_desc(o_name, sizeof(o_name), i_ptr, ODESC_PREFIX | ODESC_FULL); /* Real store */ if (store->sidx != STORE_HOME) { /* Extract the value of the items */ u32b price = price_item(i_ptr, TRUE, amt); screen_save(); /* Show price */ if (!OPT(birth_no_selling)) prt(format("Price: %d", price), 1, 0); /* Confirm sale */ if (!store_get_check(format("%s %s? [ESC, any other key to accept]", OPT(birth_no_selling) ? "Give" : "Sell", o_name))) { screen_load(); return FALSE; } screen_load(); cmd_insert(CMD_SELL); cmd_set_arg_item(cmd_get_top(), 0, item); cmd_set_arg_number(cmd_get_top(), 1, amt); } /* Player is at home */ else { cmd_insert(CMD_STASH); cmd_set_arg_item(cmd_get_top(), 0, item); cmd_set_arg_number(cmd_get_top(), 1, amt); } return TRUE; } //static bool store_sell(int sell_count) /* * Examine an item in a store */ static void store_examine(int item) { struct store *store = current_store(); object_type *o_ptr; char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; if (item < 0) return; /* Get the actual object */ o_ptr = &store->stock[item]; /* Hack -- no flush needed */ msg_flag = FALSE; /* Show full info in most stores, but normal info in player home */ tb = object_info(o_ptr, (store->sidx != STORE_HOME) ? OINFO_FULL : OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL | ODESC_STORE); textui_textblock_show(tb, area, header); textblock_free(tb); /* Hack -- Browse book, then prompt for a command */ if (o_ptr->tval == p_ptr->class->spell_book) textui_book_browse(o_ptr); } static void store_menu_set_selections(menu_type *menu, bool knowledge_menu) { if (knowledge_menu) { if (OPT(rogue_like_commands)) { /* These two can't intersect! */ menu->cmd_keys = "?Ieilx"; menu->selections = "abcdfghjkmnopqrstuvwyz134567"; } /* Original */ else { /* These two can't intersect! */ menu->cmd_keys = "?Ieil"; menu->selections = "abcdfghjkmnopqrstuvwxyz13456"; } } else { /* Roguelike */ if (OPT(rogue_like_commands)) { /* These two can't intersect! */ menu->cmd_keys = "\x04\x05\x10?={}~CEIPTdegilpswx"; /* \x10 = ^p , \x04 = ^D, \x05 = ^E */ menu->selections = "abcfmnoqrtuvyz13456790ABDFGH"; } /* Original */ else { /* These two can't intersect! */ menu->cmd_keys = "\x05\x010?={}~CEIbdegiklpstwx"; /* \x05 = ^E, \x10 = ^p */ menu->selections = "acfhjmnoqruvyz13456790ABDFGH"; } } } static void store_menu_recalc(menu_type *m) { struct store *store = current_store(); menu_setpriv(m, store->stock_num, store->stock); } /* * Process a command in a store * * Note that we must allow the use of a few "special" commands in the stores * which are not allowed in the dungeon, and we must disable some commands * which are allowed in the dungeon but not in the stores, to prevent chaos. */ static bool store_process_command_key(struct keypress kp) { int cmd = 0; /* Hack -- no flush needed */ msg_flag = FALSE; /* Process the keycode */ switch (kp.code) { case 'T': /* roguelike */ case 't': cmd = CMD_TAKEOFF; break; case KTRL('D'): /* roguelike */ case 'k': textui_cmd_destroy(); break; case 'P': /* roguelike */ case 'b': textui_spell_browse(); break; case '~': textui_browse_knowledge(); break; case 'I': textui_obj_examine(); break; case 'w': cmd = CMD_WIELD; break; case '{': cmd = CMD_INSCRIBE; break; case '}': cmd = CMD_UNINSCRIBE; break; case 'e': do_cmd_equip(); break; case 'i': do_cmd_inven(); break; case KTRL('E'): toggle_inven_equip(); break; case 'C': do_cmd_change_name(); break; case KTRL('P'): do_cmd_messages(); break; case ')': do_cmd_save_screen(); break; default: return FALSE; } if (cmd) cmd_insert_repeated(cmd, 0); return TRUE; } /* * Select an item from the store's stock, and return the stock index */ static int store_get_stock(menu_type *m, int oid) { ui_event e; int no_act = m->flags & MN_NO_ACTION; /* set a flag to make sure that we get the selection or escape * without running the menu handler */ m->flags |= MN_NO_ACTION; e = menu_select(m, 0, TRUE); if (!no_act) { m->flags &= ~MN_NO_ACTION; } if (e.type == EVT_SELECT) { return m->cursor; } else if (e.type == EVT_ESCAPE) { return -1; } /* if we do not have a new selection, just return the original item */ return oid; } /* * */ static bool store_menu_handle(menu_type *m, const ui_event *event, int oid) { bool processed = TRUE; struct store *store = current_store(); if (event->type == EVT_SELECT) { /* Nothing for now, except "handle" the event */ return TRUE; /* In future, maybe we want a display a list of what you can do. */ } else if (event->type == EVT_MOUSE) { if (event->mouse.button == 2) { /* exit the store? what already does this? menu_handle_mouse * so exit this so that menu_handle_mouse will be called */ return FALSE; } else if (event->mouse.button == 1) { bool action = FALSE; if ((event->mouse.y == 0) || (event->mouse.y == 1)) { /* show the store context menu */ context_menu_store(store,oid,event->mouse.x,event->mouse.y); action = TRUE; } else /* if press is on a list item, so store item context */ if (event->mouse.y == 4+oid) { /* click was on an item */ context_menu_store_item(store,oid, event->mouse.x,event->mouse.y); action = TRUE; } if (action) { store_flags |= (STORE_FRAME_CHANGE | STORE_GOLD_CHANGE); /* Let the game handle any core commands (equipping, etc) */ process_command(CMD_STORE, TRUE); /* Notice and handle stuff */ notice_stuff(p_ptr); handle_stuff(p_ptr); /* Display the store */ store_display_recalc(m); store_menu_recalc(m); store_redraw(); return TRUE; } } } else if (event->type == EVT_KBRD) { bool storechange = FALSE; switch (event->key.code) { case 's': case 'd': storechange = store_sell(); break; case 'p': case 'g': /* use the old way of purchasing items */ msg_flag = FALSE; if (store->sidx != STORE_HOME) { prt("Purchase which item? (ESC to cancel, Enter to select)", 0, 0); } else { prt("Get which item? (Esc to cancel, Enter to select)", 0, 0); } oid = store_get_stock(m, oid); prt("", 0, 0); if (oid >= 0) { storechange = store_purchase(oid); } break; case 'l': case 'x': /* use the old way of examining items */ msg_flag = FALSE; prt("Examine which item? (ESC to cancel, Enter to select)", 0, 0); oid = store_get_stock(m, oid); prt("", 0, 0); if (oid >= 0) { store_examine(oid); } break; /* XXX redraw functionality should be another menu_iter handler */ case KTRL('R'): { Term_clear(); store_flags |= (STORE_FRAME_CHANGE | STORE_GOLD_CHANGE); break; } case '?': { /* Toggle help */ if (store_flags & STORE_SHOW_HELP) store_flags &= ~(STORE_SHOW_HELP); else store_flags |= STORE_SHOW_HELP; /* Redisplay */ store_flags |= STORE_INIT_CHANGE; break; } case '=': { do_cmd_options(); store_menu_set_selections(m, FALSE); break; } default: processed = store_process_command_key(event->key); } /* Let the game handle any core commands (equipping, etc) */ process_command(CMD_STORE, TRUE); if (storechange) store_menu_recalc(m); if (processed) { event_signal(EVENT_INVENTORY); event_signal(EVENT_EQUIPMENT); } /* Notice and handle stuff */ notice_stuff(p_ptr); handle_stuff(p_ptr); /* Display the store */ store_display_recalc(m); store_menu_recalc(m); store_redraw(); return processed; } return FALSE; } static region store_menu_region = { 1, 4, -1, -2 }; static const menu_iter store_menu = { NULL, NULL, store_display_entry, store_menu_handle, NULL }; /* * Display contents of a store from knowledge menu * * The only allowed actions are 'I' to inspect an item */ void do_cmd_store_knowledge(void) { menu_type menu; screen_save(); clear_from(0); /* Init the menu structure */ menu_init(&menu, MN_SKIN_SCROLL, &store_menu); menu_layout(&menu, &store_menu_region); /* Calculate the positions of things and redraw */ store_menu_set_selections(&menu, TRUE); store_flags = STORE_INIT_CHANGE; store_display_recalc(&menu); store_menu_recalc(&menu); store_redraw(); menu_select(&menu, 0, FALSE); /* Flush messages XXX XXX XXX */ message_flush(); screen_load(); } /* * Enter a store, and interact with it. */ void do_cmd_store(cmd_code code, cmd_arg args[]) { /* Take note of the store number from the terrain feature */ struct store *store = current_store(); menu_type menu; /* Verify that there is a store */ if (!store) { msg("You see no store here."); return; } /* Shut down the normal game view - it won't be updated - and start up the store state. */ event_signal(EVENT_LEAVE_GAME); event_signal(EVENT_ENTER_STORE); /* XXX ick */ store_in_store = TRUE; /* Forget the view */ forget_view(cave); /*** Display ***/ /* Save current screen (ie. dungeon) */ screen_save(); /*** Inventory display ***/ /* Wipe the menu and set it up */ menu_init(&menu, MN_SKIN_SCROLL, &store_menu); menu_layout(&menu, &store_menu_region); store_menu_set_selections(&menu, FALSE); store_flags = STORE_INIT_CHANGE; store_display_recalc(&menu); store_menu_recalc(&menu); store_redraw(); /* Say a friendly hello. */ if (store->sidx != STORE_HOME) prt_welcome(store->owner); msg_flag = FALSE; menu_select(&menu, 0, FALSE); msg_flag = FALSE; /* Switch back to the normal game view. */ event_signal(EVENT_LEAVE_STORE); event_signal(EVENT_ENTER_GAME); /* XXX ick */ store_in_store = TRUE; /* Take a turn */ p_ptr->energy_use = 100; /* Flush messages XXX XXX XXX */ message_flush(); /* Load the screen */ screen_load(); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Redraw entire screen */ p_ptr->redraw |= (PR_BASIC | PR_EXTRA); /* Redraw map */ p_ptr->redraw |= (PR_MAP); } angband-3.5.1/src/z-set.h0000644000175000017500000000076112456456607014447 0ustar chriscchrisc/* z-set.h - sets of pointers */ #ifndef Z_SET_H #define Z_SET_H #include "h-basic.h" #include struct set; extern struct set *set_new(); extern void set_free(struct set *s); extern void set_add(struct set *s, void *p); extern bool set_del(struct set *s, void *p); extern size_t set_size(struct set *s); extern void *set_choose(struct set *s); extern void *set_get(struct set *s, size_t index); extern void set_insert(struct set *s, size_t index, void *p); #endif /* !Z_SET_H */ angband-3.5.1/src/attack.h0000644000175000017500000000170512456456606014652 0ustar chriscchrisc/* attack.h - attack interface */ #ifndef ATTACK_H #define ATTACK_H /* attack.c */ extern void do_cmd_fire(cmd_code code, cmd_arg args[]); extern void textui_cmd_fire_at_nearest(void); extern void do_cmd_throw(cmd_code code, cmd_arg args[]); extern void textui_cmd_throw(void); extern int breakage_chance(const object_type *o_ptr, bool hit_target); extern bool test_hit(int chance, int ac, int vis); extern void py_attack(int y, int x); int py_attack_hit_chance(const object_type *weapon); /** * */ struct attack_result { bool success; int dmg; u32b msg_type; const char *hit_verb; }; /** * ranged_attack is a function pointer, used to execute a kind of attack. * * This allows us to abstract details of throwing, shooting, etc. out while * keeping the core projectile tracking, monster cleanup, and display code * in common. */ typedef struct attack_result (*ranged_attack) (object_type *o_ptr, int y, int x); #endif /* !ATTACK_H */ angband-3.5.1/src/z-term.c0000644000175000017500000020125612456456607014620 0ustar chriscchrisc/* * File: z-term.c * Purpose: a generic, efficient, terminal window package * * Copyright (c) 1997 Ben Harrison * * This work is free software; you can redistribute it and/or modify it * under the terms of either: * * a) the GNU General Public License as published by the Free Software * Foundation, version 2, or * * b) the "Angband licence": * This software may be copied and distributed for educational, research, * and not for profit purposes provided that this copyright and statement * are included in all such copies. Other copyrights may also apply. */ #include "angband.h" #include "z-term.h" /*** Colour constants ***/ /* * Global table of color definitions (mostly zeros) */ byte angband_color_table[MAX_COLORS][4] = { {0x00, 0x00, 0x00, 0x00}, /* 0 TERM_DARK */ {0x00, 0xff, 0xff, 0xff}, /* 1 TERM_WHITE */ {0x00, 0x80, 0x80, 0x80}, /* 2 TERM_SLATE */ {0x00, 0xff, 0x80, 0x00}, /* 3 TERM_ORANGE */ {0x00, 0xc0, 0x00, 0x00}, /* 4 TERM_RED */ {0x00, 0x00, 0x80, 0x40}, /* 5 TERM_GREEN */ {0x00, 0x00, 0x40, 0xff}, /* 6 TERM_BLUE */ {0x00, 0x80, 0x40, 0x00}, /* 7 TERM_UMBER */ {0x00, 0x60, 0x60, 0x60}, /* 8 TERM_L_DARK */ {0x00, 0xc0, 0xc0, 0xc0}, /* 9 TERM_L_WHITE */ {0x00, 0xff, 0x00, 0xff}, /* 10 TERM_L_PURPLE */ {0x00, 0xff, 0xff, 0x00}, /* 11 TERM_YELLOW */ {0x00, 0xff, 0x40, 0x40}, /* 12 TERM_L_RED */ {0x00, 0x00, 0xff, 0x00}, /* 13 TERM_L_GREEN */ {0x00, 0x00, 0xff, 0xff}, /* 14 TERM_L_BLUE */ {0x00, 0xc0, 0x80, 0x40}, /* 15 TERM_L_UMBER */ {0x00, 0x90, 0x00, 0x90}, /* 16 TERM_PURPLE */ {0x00, 0x90, 0x20, 0xff}, /* 17 TERM_VIOLET */ {0x00, 0x00, 0xa0, 0xa0}, /* 18 TERM_TEAL */ {0x00, 0x6c, 0x6c, 0x30}, /* 19 TERM_MUD */ {0x00, 0xff, 0xff, 0x90}, /* 20 TERM_L_YELLOW */ {0x00, 0xff, 0x00, 0xa0}, /* 21 TERM_MAGENTA */ {0x00, 0x20, 0xff, 0xdc}, /* 22 TERM_L_TEAL */ {0x00, 0xb8, 0xa8, 0xff}, /* 23 TERM_L_VIOLET */ {0x00, 0xff, 0x80, 0x80}, /* 24 TERM_L_PINK */ {0x00, 0xb4, 0xb4, 0x00}, /* 25 TERM_MUSTARD */ {0x00, 0xa0, 0xc0, 0xd0}, /* 26 TERM_BLUE_SLATE */ {0x00, 0x00, 0xb0, 0xff}, /* 27 TERM_DEEP_L_BLUE */ {0x00, 0x28, 0x28, 0x28}, /* 28 TERM_SHADE */ }; /* * Global array of color names and translations. */ color_type color_table[MAX_COLORS] = { /* full mono vga blind lighter darker highlight metallic misc */ {'d', "Dark", {0, 0, 0, TERM_DARK, TERM_L_DARK, TERM_DARK, TERM_L_DARK, TERM_L_DARK, TERM_DARK}}, {'w', "White", {1, 1, 1, TERM_WHITE, TERM_YELLOW, TERM_SLATE, TERM_L_BLUE, TERM_YELLOW, TERM_WHITE}}, {'s', "Slate", {2, 1, 2, TERM_SLATE, TERM_L_WHITE, TERM_L_DARK, TERM_L_WHITE, TERM_L_WHITE, TERM_SLATE}}, {'o', "Orange", {3, 1, 3, TERM_L_WHITE, TERM_YELLOW, TERM_SLATE, TERM_YELLOW, TERM_YELLOW, TERM_ORANGE}}, {'r', "Red", {4, 1, 4, TERM_SLATE, TERM_L_RED, TERM_SLATE, TERM_L_RED, TERM_L_RED, TERM_RED}}, {'g', "Green", {5, 1, 5, TERM_SLATE, TERM_L_GREEN, TERM_SLATE, TERM_L_GREEN, TERM_L_GREEN, TERM_GREEN}}, {'b', "Blue", {6, 1, 6, TERM_SLATE, TERM_L_BLUE, TERM_SLATE, TERM_L_BLUE, TERM_L_BLUE, TERM_BLUE}}, {'u', "Umber", {7, 1, 7, TERM_L_DARK, TERM_L_UMBER, TERM_L_DARK, TERM_L_UMBER, TERM_L_UMBER, TERM_UMBER}}, {'D', "Light Dark", {8, 1, 8, TERM_L_DARK, TERM_SLATE, TERM_L_DARK, TERM_SLATE, TERM_SLATE, TERM_L_DARK}}, {'W', "Light Slate", {9, 1, 9, TERM_L_WHITE, TERM_WHITE, TERM_SLATE, TERM_WHITE, TERM_WHITE, TERM_SLATE}}, {'P', "Light Purple", {10, 1, 10, TERM_SLATE, TERM_YELLOW, TERM_SLATE, TERM_YELLOW, TERM_YELLOW, TERM_L_PURPLE}}, {'y', "Yellow", {11, 1, 11, TERM_L_WHITE, TERM_L_YELLOW, TERM_L_WHITE, TERM_WHITE, TERM_WHITE, TERM_YELLOW}}, {'R', "Light Red", {12, 1, 12, TERM_L_WHITE, TERM_YELLOW, TERM_RED, TERM_YELLOW, TERM_YELLOW, TERM_L_RED}}, {'G', "Light Green", {13, 1, 13, TERM_L_WHITE, TERM_YELLOW, TERM_GREEN, TERM_YELLOW, TERM_YELLOW, TERM_L_GREEN}}, {'B', "Light Blue", {14, 1, 14, TERM_L_WHITE, TERM_YELLOW, TERM_BLUE, TERM_YELLOW, TERM_YELLOW, TERM_L_BLUE}}, {'U', "Light Umber", {15, 1, 15, TERM_L_WHITE, TERM_YELLOW, TERM_UMBER, TERM_YELLOW, TERM_YELLOW, TERM_L_UMBER}}, /* "new" colors */ {'p', "Purple", {16, 1, 10,TERM_SLATE, TERM_L_PURPLE, TERM_SLATE, TERM_L_PURPLE, TERM_L_PURPLE, TERM_L_PURPLE}}, {'v', "Violet", {17, 1, 10,TERM_SLATE, TERM_L_PURPLE, TERM_SLATE, TERM_L_PURPLE, TERM_L_PURPLE, TERM_L_PURPLE}}, {'t', "Teal", {18, 1, 6, TERM_SLATE, TERM_L_TEAL, TERM_SLATE, TERM_L_TEAL, TERM_L_TEAL, TERM_L_BLUE}}, {'m', "Mud", {19, 1, 5, TERM_SLATE, TERM_MUSTARD, TERM_SLATE, TERM_MUSTARD, TERM_MUSTARD, TERM_UMBER}}, {'Y', "Light Yellow", {20, 1, 11, TERM_WHITE, TERM_WHITE, TERM_YELLOW, TERM_WHITE, TERM_WHITE, TERM_L_YELLOW}}, {'i', "Magenta-Pink", {21, 1, 12, TERM_SLATE, TERM_L_PINK, TERM_RED, TERM_L_PINK, TERM_L_PINK, TERM_L_PURPLE}}, {'T', "Light Teal", {22, 1, 14, TERM_L_WHITE, TERM_YELLOW, TERM_TEAL, TERM_YELLOW, TERM_YELLOW, TERM_L_BLUE}}, {'V', "Light Violet", {23, 1, 10, TERM_L_WHITE, TERM_YELLOW, TERM_VIOLET, TERM_YELLOW, TERM_YELLOW, TERM_L_PURPLE}}, {'I', "Light Pink", {24, 1, 12, TERM_L_WHITE, TERM_YELLOW, TERM_MAGENTA, TERM_YELLOW, TERM_YELLOW, TERM_L_PURPLE}}, {'M', "Mustard", {25, 1, 11, TERM_SLATE, TERM_YELLOW, TERM_SLATE, TERM_YELLOW, TERM_YELLOW, TERM_YELLOW}}, {'z', "Blue Slate", {26, 1, 9, TERM_SLATE, TERM_DEEP_L_BLUE, TERM_SLATE, TERM_DEEP_L_BLUE, TERM_DEEP_L_BLUE, TERM_L_WHITE}}, {'Z', "Deep Light Blue", {27, 1, 14, TERM_L_WHITE, TERM_L_BLUE, TERM_BLUE_SLATE, TERM_L_BLUE, TERM_L_BLUE, TERM_L_BLUE}}, /* Rest to be filled in when the game loads */ }; /* * This file provides a generic, efficient, terminal window package, * which can be used not only on standard terminal environments such * as dumb terminals connected to a Unix box, but also in more modern * "graphic" environments, such as the Macintosh or Unix/X11. * * Each "window" works like a standard "dumb terminal", that is, it * can display a two dimensional array of grids containing colored * textual symbols, plus an optional cursor, and it can be used to * get keypress events from the user. * * In fact, this package can simply be used, if desired, to support * programs which will look the same on a dumb terminal as they do * on a graphic platform such as the Macintosh. * * This package was designed to help port the game "Angband" to a wide * variety of different platforms. Angband, like many other games in * the "rogue-like" heirarchy, requires, at the minimum, the ability * to display "colored textual symbols" in a standard 80x24 "window", * such as that provided by most dumb terminals, and many old personal * computers, and to check for "keypresses" from the user. The major * concerns were thus portability and efficiency, so Angband could be * easily ported to many different systems, with minimal effort, and * yet would run quickly on each of these systems, no matter what kind * of underlying hardware/software support was being used. * * It is important to understand the differences between the older * "dumb terminals" and the newer "graphic interface" machines, since * this package was designed to work with both types of systems. * * New machines: * waiting for a keypress is complex * checking for a keypress is often cheap * changing "colors" may be expensive * the "color" of a "blank" is rarely important * moving the "cursor" is relatively cheap * use a "software" cursor (only moves when requested) * drawing characters normally will not erase old ones * drawing a character on the cursor often erases it * may have fast routines for "clear a region" * the bottom right corner is usually not special * * Old machines: * waiting for a keypress is simple * checking for a keypress is often expensive * changing "colors" is usually cheap * the "color" of a "blank" may be important * moving the "cursor" may be expensive * use a "hardware" cursor (moves during screen updates) * drawing new symbols automatically erases old ones * characters may only be drawn at the cursor location * drawing a character on the cursor will move the cursor * may have fast routines for "clear entire window" * may have fast routines for "clear to end of line" * the bottom right corner is often dangerous * * * This package provides support for multiple windows, each of an * arbitrary size (up to 255x255), each with its own set of flags, * and its own hooks to handle several low-level procedures which * differ from platform to platform. Then the main program simply * creates one or more "term" structures, setting the various flags * and hooks in a manner appropriate for the current platform, and * then it can use the various "term" structures without worrying * about the underlying platform. * * * This package allows each "grid" in each window to hold an attr/char * pair, with each ranging from 0 to 255, and makes very few assumptions * about the meaning of any attr/char values. Normally, we assume that * "attr 0" is "black", with the semantics that "black" text should be * sent to "Term_wipe()" instead of "Term_text()", but this sematics is * modified if either the "always_pict" or the "always_text" flags are * set. We assume that "char 0" is "dangerous", since placing such a * "char" in the middle of a string "terminates" the string, and usually * we prevent its use. * * Finally, we use a special attr/char pair, defaulting to "attr 0" and * "char 32", also known as "black space", when we "erase" or "clear" * any window, but this pair can be redefined to any pair, including * the standard "white space", or the bizarre "emptiness" ("attr 0" * and "char 0"), as long as various obscure restrictions are met. * * * This package provides several functions which allow a program to * interact with the "term" structures. Most of the functions allow * the program to "request" certain changes to the current "term", * such as moving the cursor, drawing an attr/char pair, erasing a * region of grids, hiding the cursor, etc. Then there is a special * function which causes all of the "pending" requests to be performed * in an efficient manner. There is another set of functions which * allow the program to query the "requested state" of the current * "term", such as asking for the cursor location, or what attr/char * is at a given location, etc. There is another set of functions * dealing with "keypress" events, which allows the program to ask if * the user has pressed any keys, or to forget any keys the user pressed. * There is a pair of functions to allow this package to memorize the * contents of the current "term", and to restore these contents at * a later time. There is a special function which allows the program * to specify which "term" structure should be the "current" one. At * the lowest level, there is a set of functions which allow a new * "term" to be initialized or destroyed, and which allow this package, * or a program, to access the special "hooks" defined for the current * "term", and a set of functions which those "hooks" can use to inform * this package of the results of certain occurances, for example, one * such function allows this package to learn about user keypresses, * detected by one of the special "hooks". * * We provide, among other things, the functions "Term_keypress()" * to "react" to keypress events, and "Term_redraw()" to redraw the * entire window, plus "Term_resize()" to note a new size. * * * Note that the current "term" contains two "window images". One of * these images represents the "requested" contents of the "term", and * the other represents the "actual" contents of the "term", at the time * of the last performance of pending requests. This package uses these * two images to determine the "minimal" amount of work needed to make * the "actual" contents of the "term" match the "requested" contents of * the "term". This method is not perfect, but it often reduces the * amount of work needed to perform the pending requests, which thus * increases the speed of the program itself. This package promises * that the requested changes will appear to occur either "all at once" * or in a "top to bottom" order. In addition, a "cursor" is maintained, * and this cursor is updated along with the actual window contents. * * Currently, the "Term_fresh()" routine attempts to perform the "minimum" * number of physical updates, in terms of total "work" done by the hooks * Term_wipe(), Term_text(), and Term_pict(), making use of the fact that * adjacent characters of the same color can both be drawn together using * the "Term_text()" hook, and that "black" text can often be sent to the * "Term_wipe()" hook instead of the "Term_text()" hook, and if something * is already displayed in a window, then it is not necessary to display * it again. Unfortunately, this may induce slightly non-optimal results * in some cases, in particular, those in which, say, a string of ten * characters needs to be written, but the fifth character has already * been displayed. Currently, this will cause the "Term_text()" routine * to be called once for each half of the string, instead of once for the * whole string, which, on some machines, may be non-optimal behavior. * * The new formalism includes a "displayed" screen image (old) which * is actually seen by the user, a "requested" screen image (scr) * which is being prepared for display, a "memorized" screen image * (mem) which is used to save and restore screen images, and a * "temporary" screen image (tmp) which is currently unused. * * * Several "flags" are available in each "term" to allow the underlying * visual system (which initializes the "term" structure) to "optimize" * the performance of this package for the given system, or to request * certain behavior which is helpful/required for the given system. * * The "soft_cursor" flag indicates the use of a "soft" cursor, which * only moves when explicitly requested,and which is "erased" when * any characters are drawn on top of it. This flag is used for all * "graphic" systems which handle the cursor by "drawing" it. * * The "icky_corner" flag indicates that the bottom right "corner" * of the windows are "icky", and "printing" anything there may * induce "messy" behavior, such as "scrolling". This flag is used * for most old "dumb terminal" systems. * * * The "term" structure contains the following function "hooks": * * Term->init_hook = Init the term * Term->nuke_hook = Nuke the term * Term->xtra_hook = Perform extra actions * Term->curs_hook = Draw (or Move) the cursor * Term->bigcurs_hook = Draw (or Move) the big cursor (bigtile mode) * Term->wipe_hook = Draw some blank spaces * Term->text_hook = Draw some text in the window * Term->pict_hook = Draw some attr/chars in the window * * The "Term->xtra_hook" hook provides a variety of different functions, * based on the first parameter (which should be taken from the various * TERM_XTRA_* defines) and the second parameter (which may make sense * only for some first parameters). It is available to the program via * the "Term_xtra()" function, though some first parameters are only * "legal" when called from inside this package. * * The "Term->curs_hook" hook provides this package with a simple way * to "move" or "draw" the cursor to the grid "x,y", depending on the * setting of the "soft_cursor" flag. Note that the cursor is never * redrawn if "nothing" has happened to the screen (even temporarily). * This hook is required. * * The "Term->wipe_hook" hook provides this package with a simple way * to "erase", starting at "x,y", the next "n" grids. This hook assumes * that the input is valid. This hook is required, unless the setting * of the "always_pict" or "always_text" flags makes it optional. * * The "Term->text_hook" hook provides this package with a simple way * to "draw", starting at "x,y", the "n" chars contained in "cp", using * the attr "a". This hook assumes that the input is valid, and that * "n" is between 1 and 256 inclusive, but it should NOT assume that * the contents of "cp" are null-terminated. This hook is required, * unless the setting of the "always_pict" flag makes it optional. * * The "Term->pict_hook" hook provides this package with a simple way * to "draw", starting at "x,y", the "n" attr/char pairs contained in * the arrays "ap" and "cp". This hook assumes that the input is valid, * and that "n" is between 1 and 256 inclusive, but it should NOT assume * that the contents of "cp" are null-terminated. This hook is optional, * unless the setting of the "always_pict" or "higher_pict" flags make * it required. Note that recently, this hook was changed from taking * a int "a" and a char "c" to taking a length "n", an array of ints * "ap" and an array of chars "cp". Old implementations of this hook * should now iterate over all "n" attr/char pairs. * The two new arrays "tap" and "tcp" can contain the attr/char pairs * of the terrain below the values in "ap" and "cp". These values can * be used to implement transparency when using graphics by drawing * the terrain values as a background and the "ap", "cp" values in * the foreground. * * The game "Angband" uses a set of files called "main-xxx.c", for * various "xxx" suffixes. Most of these contain a function called * "init_xxx()", that will prepare the underlying visual system for * use with Angband, and then create one or more "term" structures, * using flags and hooks appropriate to the given platform, so that * the "main()" function can call one (or more) of the "init_xxx()" * functions, as appropriate, to prepare the required "term" structs * (one for each desired sub-window), and these "init_xxx()" functions * are called from a centralized "main()" function in "main.c". Other * "main-xxx.c" systems contain their own "main()" function which, in * addition to doing everything needed to initialize the actual program, * also does everything that the normal "init_xxx()" functions would do. * * The game "Angband" defines, in addition to "attr 0", all of the * attr codes from 1 to 15, using definitions in "defines.h", and * thus the "main-xxx.c" files used by Angband must handle these * attr values correctly. Also, they must handle all other attr * values, though they may do so in any way they wish, for example, * by always taking every attr code mod 16. Many of the "main-xxx.c" * files use "white space" ("attr 1" / "char 32") to "erase" or "clear" * any window, for efficiency. * * See "main-xxx.c" for a simple skeleton file which can be used to * create a "visual system" for a new platform when porting Angband. */ /* * The current "term" */ term *Term = NULL; /* grumbles */ int log_i = 0; int log_size = 0; struct keypress keylog[KEYLOG_SIZE]; /*** Local routines ***/ /* * Nuke a term_win (see below) */ static errr term_win_nuke(term_win *s) { /* Free the window access arrays */ FREE(s->a); FREE(s->c); /* Free the window content arrays */ FREE(s->va); FREE(s->vc); /* Free the terrain access arrays */ FREE(s->ta); FREE(s->tc); /* Free the terrain content arrays */ FREE(s->vta); FREE(s->vtc); /* Success */ return (0); } /* * Initialize a "term_win" (using the given window size) */ static errr term_win_init(term_win *s, int w, int h) { int y; /* Make the window access arrays */ s->a = C_ZNEW(h, int *); s->c = C_ZNEW(h, wchar_t *); /* Make the window content arrays */ s->va = C_ZNEW(h * w, int); s->vc = C_ZNEW(h * w, wchar_t); /* Make the terrain access arrays */ s->ta = C_ZNEW(h, int *); s->tc = C_ZNEW(h, wchar_t *); /* Make the terrain content arrays */ s->vta = C_ZNEW(h * w, int); s->vtc = C_ZNEW(h * w, wchar_t); /* Prepare the window access arrays */ for (y = 0; y < h; y++) { s->a[y] = s->va + w * y; s->c[y] = s->vc + w * y; s->ta[y] = s->vta + w * y; s->tc[y] = s->vtc + w * y; } /* Success */ return (0); } /* * Copy a "term_win" from another */ static errr term_win_copy(term_win *s, term_win *f, int w, int h) { int x, y; /* Copy contents */ for (y = 0; y < h; y++) { int *f_aa = f->a[y]; wchar_t *f_cc = f->c[y]; int *s_aa = s->a[y]; wchar_t *s_cc = s->c[y]; int *f_taa = f->ta[y]; wchar_t *f_tcc = f->tc[y]; int *s_taa = s->ta[y]; wchar_t *s_tcc = s->tc[y]; for (x = 0; x < w; x++) { *s_aa++ = *f_aa++; *s_cc++ = *f_cc++; *s_taa++ = *f_taa++; *s_tcc++ = *f_tcc++; } } /* Copy cursor */ s->cx = f->cx; s->cy = f->cy; s->cu = f->cu; s->cv = f->cv; /* Success */ return (0); } /*** External hooks ***/ /* * Execute the "Term->xtra_hook" hook, if available (see above). */ errr Term_xtra(int n, int v) { /* Verify the hook */ if (!Term->xtra_hook) return (-1); /* Call the hook */ return ((*Term->xtra_hook)(n, v)); } /* * Allow override of the multi-byte to wide char conversion */ size_t Term_mbstowcs(wchar_t *dest, const char *src, int n) { if (Term && Term->mbcs_hook) return (*Term->mbcs_hook)(dest, src, n); else return mbstowcs(dest, src, n); } /*** Fake hooks ***/ /* * Hack -- fake hook for "Term_curs()" (see above) */ static errr Term_curs_hack(int x, int y) { /* Compiler silliness */ if (x || y) return (-2); /* Oops */ return (-1); } /* * Hack -- fake hook for "Term_wipe()" (see above) */ static errr Term_wipe_hack(int x, int y, int n) { /* Compiler silliness */ if (x || y || n) return (-2); /* Oops */ return (-1); } /* * Hack -- fake hook for "Term_text()" (see above) */ static errr Term_text_hack(int x, int y, int n, int a, const wchar_t *cp) { /* Compiler silliness */ if (x || y || n || a || cp) return (-2); /* Oops */ return (-1); } /* * Hack -- fake hook for "Term_pict()" (see above) */ static errr Term_pict_hack(int x, int y, int n, const int *ap, const wchar_t *cp, const int *tap, const wchar_t *tcp) { /* Compiler silliness */ if (x || y || n || ap || cp || tap || tcp) return (-2); /* Oops */ return (-1); } /*** Efficient routines ***/ /* * Mentally draw an attr/char at a given location * * Assumes given location and values are valid. */ void Term_queue_char(term *t, int x, int y, int a, wchar_t c, int ta, wchar_t tc) { int *scr_aa = t->scr->a[y]; wchar_t *scr_cc = t->scr->c[y]; int oa = scr_aa[x]; wchar_t oc = scr_cc[x]; int *scr_taa = t->scr->ta[y]; wchar_t *scr_tcc = t->scr->tc[y]; int ota = scr_taa[x]; wchar_t otc = scr_tcc[x]; /* Don't change is the terrain value is 0 */ if (!ta) ta = ota; if (!tc) tc = otc; /* Hack -- Ignore non-changes */ if ((oa == a) && (oc == c) && (ota == ta) && (otc == tc)) return; /* Save the "literal" information */ scr_aa[x] = a; scr_cc[x] = c; scr_taa[x] = ta; scr_tcc[x] = tc; /* Check for new min/max row info */ if (y < t->y1) t->y1 = y; if (y > t->y2) t->y2 = y; /* Check for new min/max col info for this row */ if (x < t->x1[y]) t->x1[y] = x; if (x > t->x2[y]) t->x2[y] = x; } /* Queue a large-sized tile */ void Term_big_queue_char(term *t, int x, int y, int a, wchar_t c, int a1, wchar_t c1) { int hor, vert; /* Avoid warning */ (void)c; /* No tall skinny tiles */ if (tile_width > 1) { /* Horizontal first */ for (hor = 0; hor <= tile_width; hor++) { /* Queue dummy character */ if (hor != 0) { if (a & 0x80) Term_queue_char(t, x + hor, y, 255, -1, 0, 0); else Term_queue_char(t, x + hor, y, TERM_WHITE, ' ', a1, c1); } /* Now vertical */ for (vert = 1; vert <= tile_height; vert++){ /* Leave space on bottom for status */ if (y + vert + 1 < t-> hgt) { /* Queue dummy character */ if (a & 0x80) Term_queue_char(t, x + hor, y + vert, 255, -1, 0, 0); else Term_queue_char(t, x + hor, y + vert, TERM_WHITE, ' ', a1, c1); } } } } else { /* Only vertical */ for (vert = 1; vert <= tile_height; vert++) { /* Leave space on bottom for status */ if (y + vert + 1 < t->hgt) { /* Queue dummy character */ if (a & 0x80) Term_queue_char(t, x, y + vert, 255, -1, 0, 0); else Term_queue_char(t, x, y + vert, TERM_WHITE, ' ', a1, c1); } } } } /* * Mentally draw some attr/chars at a given location * * Assumes that (x,y) is a valid location, that the first "n" characters * of the string "s" are all valid (non-zero), and that (x+n-1,y) is also * a valid location, so the first "n" characters of "s" can all be added * starting at (x,y) without causing any illegal operations. */ void Term_queue_chars(int x, int y, int n, int a, const wchar_t *s) { int x1 = -1, x2 = -1; int *scr_aa = Term->scr->a[y]; wchar_t *scr_cc = Term->scr->c[y]; int *scr_taa = Term->scr->ta[y]; wchar_t *scr_tcc = Term->scr->tc[y]; /* Queue the attr/chars */ for ( ; n; x++, s++, n--) { int oa = scr_aa[x]; wchar_t oc = scr_cc[x]; int ota = scr_taa[x]; wchar_t otc = scr_tcc[x]; /* Hack -- Ignore non-changes */ if ((oa == a) && (oc == *s) && (ota == 0) && (otc == 0)) continue; /* Save the "literal" information */ scr_aa[x] = a; scr_cc[x] = *s; scr_taa[x] = 0; scr_tcc[x] = 0; /* Note the "range" of window updates */ if (x1 < 0) x1 = x; x2 = x; } /* Expand the "change area" as needed */ if (x1 >= 0) { /* Check for new min/max row info */ if (y < Term->y1) Term->y1 = y; if (y > Term->y2) Term->y2 = y; /* Check for new min/max col info in this row */ if (x1 < Term->x1[y]) Term->x1[y] = x1; if (x2 > Term->x2[y]) Term->x2[y] = x2; } } /*** Refresh routines ***/ /* * Flush a row of the current window (see "Term_fresh") * * Display text using "Term_pict()" */ static void Term_fresh_row_pict(int y, int x1, int x2) { int x; int *old_aa = Term->old->a[y]; wchar_t *old_cc = Term->old->c[y]; int *scr_aa = Term->scr->a[y]; wchar_t *scr_cc = Term->scr->c[y]; int *old_taa = Term->old->ta[y]; wchar_t *old_tcc = Term->old->tc[y]; int *scr_taa = Term->scr->ta[y]; wchar_t *scr_tcc = Term->scr->tc[y]; int ota; wchar_t otc; int nta; wchar_t ntc; /* Pending length */ int fn = 0; /* Pending start */ int fx = 0; int oa; wchar_t oc; int na; wchar_t nc; /* Scan "modified" columns */ for (x = x1; x <= x2; x++) { /* See what is currently here */ oa = old_aa[x]; oc = old_cc[x]; /* See what is desired there */ na = scr_aa[x]; nc = scr_cc[x]; ota = old_taa[x]; otc = old_tcc[x]; nta = scr_taa[x]; ntc = scr_tcc[x]; /* Handle unchanged grids */ if ((na == oa) && (nc == oc) && (nta == ota) && (ntc == otc)) { /* Flush */ if (fn) { /* Draw pending attr/char pairs */ (void)((*Term->pict_hook)(fx, y, fn, &scr_aa[fx], &scr_cc[fx], &scr_taa[fx], &scr_tcc[fx])); /* Forget */ fn = 0; } /* Skip */ continue; } /* Save new contents */ old_aa[x] = na; old_cc[x] = nc; old_taa[x] = nta; old_tcc[x] = ntc; /* Restart and Advance */ if (fn++ == 0) fx = x; } /* Flush */ if (fn) { /* Draw pending attr/char pairs */ (void)((*Term->pict_hook)(fx, y, fn, &scr_aa[fx], &scr_cc[fx], &scr_taa[fx], &scr_tcc[fx])); } } /* * Flush a row of the current window (see "Term_fresh") * * Display text using "Term_text()" and "Term_wipe()", * but use "Term_pict()" for high-bit attr/char pairs */ static void Term_fresh_row_both(int y, int x1, int x2) { int x; int *old_aa = Term->old->a[y]; wchar_t *old_cc = Term->old->c[y]; int *scr_aa = Term->scr->a[y]; wchar_t *scr_cc = Term->scr->c[y]; int *old_taa = Term->old->ta[y]; wchar_t *old_tcc = Term->old->tc[y]; int *scr_taa = Term->scr->ta[y]; wchar_t *scr_tcc = Term->scr->tc[y]; int ota; wchar_t otc; int nta; wchar_t ntc; /* The "always_text" flag */ int always_text = Term->always_text; /* Pending length */ int fn = 0; /* Pending start */ int fx = 0; /* Pending attr */ int fa = Term->attr_blank; int oa; wchar_t oc; int na; wchar_t nc; /* Scan "modified" columns */ for (x = x1; x <= x2; x++) { /* See what is currently here */ oa = old_aa[x]; oc = old_cc[x]; /* See what is desired there */ na = scr_aa[x]; nc = scr_cc[x]; ota = old_taa[x]; otc = old_tcc[x]; nta = scr_taa[x]; ntc = scr_tcc[x]; /* Handle unchanged grids */ if ((na == oa) && (nc == oc) && (nta == ota) && (ntc == otc)) { /* Flush */ if (fn) { /* Draw pending chars (normal) */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Draw pending chars (black) */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } /* Forget */ fn = 0; } /* Skip */ continue; } /* Save new contents */ old_aa[x] = na; old_cc[x] = nc; old_taa[x] = nta; old_tcc[x] = ntc; /* Handle high-bit attr/chars */ if ((na & 0x80)) { /* Flush */ if (fn) { /* Draw pending chars (normal) */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Draw pending chars (black) */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } /* Forget */ fn = 0; } /* 2nd byte of bigtile */ if (na == 255) continue; /* Hack -- Draw the special attr/char pair */ (void)((*Term->pict_hook)(x, y, 1, &na, &nc, &nta, &ntc)); /* Skip */ continue; } /* Notice new color */ if (fa != na) { /* Flush */ if (fn) { /* Draw the pending chars */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Hack -- Erase "leading" spaces */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } /* Forget */ fn = 0; } /* Save the new color */ fa = na; } /* Restart and Advance */ if (fn++ == 0) fx = x; } /* Flush */ if (fn) { /* Draw pending chars (normal) */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Draw pending chars (black) */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } } } /* * Flush a row of the current window (see "Term_fresh") * * Display text using "Term_text()" and "Term_wipe()" */ static void Term_fresh_row_text(int y, int x1, int x2) { int x; int *old_aa = Term->old->a[y]; wchar_t *old_cc = Term->old->c[y]; int *scr_aa = Term->scr->a[y]; wchar_t *scr_cc = Term->scr->c[y]; /* The "always_text" flag */ int always_text = Term->always_text; /* Pending length */ int fn = 0; /* Pending start */ int fx = 0; /* Pending attr */ int fa = Term->attr_blank; int oa; wchar_t oc; int na; wchar_t nc; /* Scan "modified" columns */ for (x = x1; x <= x2; x++) { /* See what is currently here */ oa = old_aa[x]; oc = old_cc[x]; /* See what is desired there */ na = scr_aa[x]; nc = scr_cc[x]; /* Handle unchanged grids */ if ((na == oa) && (nc == oc)) { /* Flush */ if (fn) { /* Draw pending chars (normal) */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Draw pending chars (black) */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } /* Forget */ fn = 0; } /* Skip */ continue; } /* Save new contents */ old_aa[x] = na; old_cc[x] = nc; /* Notice new color */ if (fa != na) { /* Flush */ if (fn) { /* Draw the pending chars */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Hack -- Erase "leading" spaces */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } /* Forget */ fn = 0; } /* Save the new color */ fa = na; } /* Restart and Advance */ if (fn++ == 0) fx = x; } /* Flush */ if (fn) { /* Draw pending chars (normal) */ if (fa || always_text) { (void)((*Term->text_hook)(fx, y, fn, fa, &scr_cc[fx])); } /* Draw pending chars (black) */ else { (void)((*Term->wipe_hook)(fx, y, fn)); } } } /* * Mark a spot as needing refresh (see "Term_fresh") */ errr Term_mark(int x, int y) { int *old_aa = Term->old->a[y]; wchar_t *old_cc = Term->old->c[y]; int *old_taa = Term->old->ta[y]; wchar_t *old_tcc = Term->old->tc[y]; /* * using 0x80 as the blank attribute and an impossible value for * the blank char is ok since this function is only called by tile * functions, but ideally there should be a test to use the blank text * attr/char pair */ old_aa[x] = 0x80; old_cc[x] = 0; old_taa[x] = 0x80; old_tcc[x] = 0; return (0); } byte tile_width = 1; /* Tile width in units of font width */ byte tile_height = 1; /* Tile height in units of font height */ /* Helper variables for large cursor */ bool bigcurs = FALSE; bool smlcurs = TRUE; /* * Actually perform all requested changes to the window * * If absolutely nothing has changed, not even temporarily, or if the * current "Term" is not mapped, then this function will return 1 and * do absolutely nothing. * * Note that when "soft_cursor" is true, we erase the cursor (if needed) * whenever anything has changed, and redraw it (if needed) after all of * the screen updates are complete. This will induce a small amount of * "cursor flicker" but only when the screen has been updated. If the * screen is updated and then restored, you may still get this flicker. * * When "soft_cursor" is not true, we make the cursor invisible before * doing anything else if it is supposed to be invisible by the time we * are done, and we make it visible after moving it to its final location * after all of the screen updates are complete. * * Note that "Term_xtra(TERM_XTRA_CLEAR,0)" must erase the entire screen, * including the cursor, if needed, and may place the cursor anywhere. * * Note that "Term_xtra(TERM_XTRA_FROSH,y)" will be always be called * after any row "y" has been "flushed", unless the "Term->never_frosh" * flag is set, and "Term_xtra(TERM_XTRA_FRESH,0)" will be called after * all of the rows have been "flushed". * * Note the use of three different functions to handle the actual flush, * based on the settings of the "Term->always_pict" and "Term->higher_pict" * flags (see below). * * The three helper functions (above) work by collecting similar adjacent * grids into stripes, and then sending each stripe to "Term->pict_hook", * "Term->text_hook", or "Term->wipe_hook", based on the settings of the * "Term->always_pict" and "Term->higher_pict" flags, which select which * of the helper functions to call to flush each row. * * The helper functions currently "skip" any grids which already contain * the desired contents. This may or may not be the best method, especially * when the desired content fits nicely into the current stripe. For example, * it might be better to go ahead and queue them while allowed, but keep a * count of the "trailing skipables", then, when time to flush, or when a * "non skippable" is found, force a flush if there are too many skippables. * * Perhaps an "initialization" stage, where the "text" (and "attr") * buffers are "filled" with information, converting "blanks" into * a convenient representation, and marking "skips" with "zero chars", * and then some "processing" is done to determine which chars to skip. * * Currently, the helper functions are optimal for systems which prefer * to "print a char + move a char + print a char" to "print three chars", * and for applications that do a lot of "detailed" color printing. * * In the two "queue" functions, total "non-changes" are "pre-skipped". * The helper functions must also handle situations in which the contents * of a grid are changed, but then changed back to the original value, * and situations in which two grids in the same row are changed, but * the grids between them are unchanged. * * If the "Term->always_pict" flag is set, then "Term_fresh_row_pict()" * will be used instead of "Term_fresh_row_text()". This allows all the * modified grids to be collected into stripes of attr/char pairs, which * are then sent to the "Term->pict_hook" hook, which can draw these pairs * in whatever way it would like. * * If the "Term->higher_pict" flag is set, then "Term_fresh_row_both()" * will be used instead of "Term_fresh_row_text()". This allows all the * "special" attr/char pairs (in which both the attr and char have the * high-bit set) to be sent (one pair at a time) to the "Term->pict_hook" * hook, which can draw these pairs in whatever way it would like. * * Normally, the "Term_wipe()" function is used only to display "blanks" * that were induced by "Term_clear()" or "Term_erase()", and then only * if the "attr_blank" and "char_blank" fields have not been redefined * to use "white space" instead of the default "black space". Actually, * the "Term_wipe()" function is used to display all "black" text, such * as the default "spaces" created by "Term_clear()" and "Term_erase()". * * Note that the "Term->always_text" flag will disable the use of the * "Term_wipe()" function hook entirely, and force all text, even text * drawn in the color "black", to be explicitly drawn. This is useful * for machines which implement "Term_wipe()" by just drawing spaces. * * Note that the "Term->always_pict" flag will disable the use of the * "Term_wipe()" function entirely, and force everything, even text * drawn in the attr "black", to be explicitly drawn. * * Note that if no "black" text is ever drawn, and if "attr_blank" is * not "zero", then the "Term_wipe" hook will never be used, even if * the "Term->always_text" flag is not set. * * This function does nothing unless the "Term" is "mapped", which allows * certain systems to optimize the handling of "closed" windows. * * On systems with a "soft" cursor, we must explicitly erase the cursor * before flushing the output, if needed, to prevent a "jumpy" refresh. * The actual method for this is horrible, but there is very little that * we can do to simplify it efficiently. XXX XXX XXX * * On systems with a "hard" cursor, we will "hide" the cursor before * flushing the output, if needed, to avoid a "flickery" refresh. It * would be nice to *always* hide the cursor during the refresh, but * this might be expensive (and/or ugly) on some machines. * * The "Term->icky_corner" flag is used to avoid calling "Term_wipe()" * or "Term_pict()" or "Term_text()" on the bottom right corner of the * window, which might induce "scrolling" or other nasty stuff on old * dumb terminals. This flag is handled very efficiently. We assume * that the "Term_curs()" call will prevent placing the cursor in the * corner, if needed, though I doubt such placement is ever a problem. * Currently, the use of "Term->icky_corner" and "Term->soft_cursor" * together may result in undefined behavior. */ errr Term_fresh(void) { int x, y; int w = Term->wid; int h = Term->hgt; int y1 = Term->y1; int y2 = Term->y2; term_win *old = Term->old; term_win *scr = Term->scr; /* Do nothing unless "mapped" */ if (!Term->mapped_flag) return (1); /* Trivial Refresh */ if ((y1 > y2) && (scr->cu == old->cu) && (scr->cv == old->cv) && (scr->cx == old->cx) && (scr->cy == old->cy) && !(Term->total_erase)) { /* Nothing */ return (1); } /* Paranoia -- use "fake" hooks to prevent core dumps */ if (!Term->curs_hook) Term->curs_hook = Term_curs_hack; if (!Term->bigcurs_hook) Term->bigcurs_hook = Term->curs_hook; if (!Term->wipe_hook) Term->wipe_hook = Term_wipe_hack; if (!Term->text_hook) Term->text_hook = Term_text_hack; if (!Term->pict_hook) Term->pict_hook = Term_pict_hack; /* Handle "total erase" */ if (Term->total_erase) { int na = Term->attr_blank; wchar_t nc = Term->char_blank; /* Physically erase the entire window */ Term_xtra(TERM_XTRA_CLEAR, 0); /* Hack -- clear all "cursor" data */ old->cv = old->cu = FALSE; old->cx = old->cy = 0; /* Wipe each row */ for (y = 0; y < h; y++) { int *aa = old->a[y]; wchar_t *cc = old->c[y]; int *taa = old->ta[y]; wchar_t *tcc = old->tc[y]; /* Wipe each column */ for (x = 0; x < w; x++) { /* Wipe each grid */ *aa++ = na; *cc++ = nc; *taa++ = na; *tcc++ = nc; } } /* Redraw every row */ Term->y1 = y1 = 0; Term->y2 = y2 = h - 1; /* Redraw every column */ for (y = 0; y < h; y++) { Term->x1[y] = 0; Term->x2[y] = w - 1; } /* Forget "total erase" */ Term->total_erase = FALSE; } /* Cursor update -- Erase old Cursor */ if (Term->soft_cursor) { /* Cursor was visible */ if (!old->cu && old->cv) { int tx = old->cx; int ty = old->cy; int *scr_aa = scr->a[ty]; wchar_t *scr_cc = scr->c[ty]; int sa = scr_aa[tx]; wchar_t sc = scr_cc[tx]; int *scr_taa = scr->ta[ty]; wchar_t *scr_tcc = scr->tc[ty]; int sta = scr_taa[tx]; wchar_t stc = scr_tcc[tx]; /* Hack -- use "Term_pict()" always */ if (Term->always_pict) { (void)((*Term->pict_hook)(tx, ty, 1, &sa, &sc, &sta, &stc)); } /* Hack -- use "Term_pict()" sometimes */ else if (Term->higher_pict && (sa & 0x80)) { (void)((*Term->pict_hook)(tx, ty, 1, &sa, &sc, &sta, &stc)); } /* Hack -- restore the actual character */ else if (sa || Term->always_text) { (void)((*Term->text_hook)(tx, ty, 1, sa, &sc)); } /* Hack -- erase the grid */ else { (void)((*Term->wipe_hook)(tx, ty, 1)); } } } /* Cursor Update -- Erase old Cursor */ else { /* Cursor will be invisible */ if (scr->cu || !scr->cv) { /* Make the cursor invisible */ Term_xtra(TERM_XTRA_SHAPE, 0); } } /* Something to update */ if (y1 <= y2) { /* Handle "icky corner" */ if (Term->icky_corner) { /* Avoid the corner */ if (y2 >= h - 1) { /* Avoid the corner */ if (Term->x2[h - 1] > w - 2) { /* Avoid the corner */ Term->x2[h - 1] = w - 2; } } } /* Scan the "modified" rows */ for (y = y1; y <= y2; ++y) { int x1 = Term->x1[y]; int x2 = Term->x2[y]; /* Flush each "modified" row */ if (x1 <= x2) { /* Always use "Term_pict()" */ if (Term->always_pict) { /* Flush the row */ Term_fresh_row_pict(y, x1, x2); } /* Sometimes use "Term_pict()" */ else if (Term->higher_pict) { /* Flush the row */ Term_fresh_row_both(y, x1, x2); } /* Never use "Term_pict()" */ else { /* Flush the row */ Term_fresh_row_text(y, x1, x2); } /* This row is all done */ Term->x1[y] = w; Term->x2[y] = 0; /* Hack -- Flush that row (if allowed) */ if (!Term->never_frosh) Term_xtra(TERM_XTRA_FROSH, y); } } /* No rows are invalid */ Term->y1 = h; Term->y2 = 0; } /* Cursor update -- Show new Cursor */ if (Term->soft_cursor) { /* Draw the cursor */ if (!scr->cu && scr->cv) { if ((((tile_width > 1)||(tile_height > 1)) && (!smlcurs) && (Term->saved == 0) && (scr->cy > 0)) || bigcurs) { /* Double width cursor for the Bigtile mode */ (void)((*Term->bigcurs_hook)(scr->cx, scr->cy)); } else { /* Call the cursor display routine */ (void)((*Term->curs_hook)(scr->cx, scr->cy)); } } } /* Cursor Update -- Show new Cursor */ else { /* The cursor is useless, hide it */ if (scr->cu) { /* Paranoia -- Put the cursor NEAR where it belongs */ (void)((*Term->curs_hook)(w - 1, scr->cy)); /* Make the cursor invisible */ /* Term_xtra(TERM_XTRA_SHAPE, 0); */ } /* The cursor is invisible, hide it */ else if (!scr->cv) { /* Paranoia -- Put the cursor where it belongs */ (void)((*Term->curs_hook)(scr->cx, scr->cy)); /* Make the cursor invisible */ /* Term_xtra(TERM_XTRA_SHAPE, 0); */ } /* The cursor is visible, display it correctly */ else { /* Put the cursor where it belongs */ (void)((*Term->curs_hook)(scr->cx, scr->cy)); /* Make the cursor visible */ Term_xtra(TERM_XTRA_SHAPE, 1); } } /* Save the "cursor state" */ old->cu = scr->cu; old->cv = scr->cv; old->cx = scr->cx; old->cy = scr->cy; /* Actually flush the output */ Term_xtra(TERM_XTRA_FRESH, 0); /* Success */ return (0); } /*** Output routines ***/ /* * Set the cursor visibility */ errr Term_set_cursor(bool v) { /* Already done */ if (Term->scr->cv == v) return (1); /* Change */ Term->scr->cv = v; /* Success */ return (0); } /* * Place the cursor at a given location * * Note -- "illegal" requests do not move the cursor. */ errr Term_gotoxy(int x, int y) { int w = Term->wid; int h = Term->hgt; /* Verify */ if ((x < 0) || (x >= w)) return (-1); if ((y < 0) || (y >= h)) return (-1); /* Remember the cursor */ Term->scr->cx = x; Term->scr->cy = y; /* The cursor is not useless */ Term->scr->cu = 0; /* Success */ return (0); } /* * At a given location, place an attr/char * Do not change the cursor position * No visual changes until "Term_fresh()". */ errr Term_draw(int x, int y, int a, wchar_t c) { int w = Term->wid; int h = Term->hgt; /* Verify location */ if ((x < 0) || (x >= w)) return (-1); if ((y < 0) || (y >= h)) return (-1); /* Paranoia -- illegal char */ if (!c) return (-2); /* Queue it for later */ Term_queue_char(Term, x, y, a, c, 0, 0); /* Success */ return (0); } /* * Using the given attr, add the given char at the cursor. * * We return "-2" if the character is "illegal". XXX XXX * * We return "-1" if the cursor is currently unusable. * * We queue the given attr/char for display at the current * cursor location, and advance the cursor to the right, * marking it as unusable and returning "1" if it leaves * the screen, and otherwise returning "0". * * So when this function, or the following one, return a * positive value, future calls to either function will * return negative ones. */ errr Term_addch(int a, wchar_t c) { int w = Term->wid; /* Handle "unusable" cursor */ if (Term->scr->cu) return (-1); /* Paranoia -- no illegal chars */ if (!c) return (-2); /* Queue the given character for display */ Term_queue_char(Term, Term->scr->cx, Term->scr->cy, a, c, 0, 0); /* Advance the cursor */ Term->scr->cx++; /* Success */ if (Term->scr->cx < w) return (0); /* Note "Useless" cursor */ Term->scr->cu = 1; /* Note "Useless" cursor */ return (1); } /* * At the current location, using an attr, add a string * * We also take a length "n", using negative values to imply * the largest possible value, and then we use the minimum of * this length and the "actual" length of the string as the * actual number of characters to attempt to display, never * displaying more characters than will actually fit, since * we do NOT attempt to "wrap" the cursor at the screen edge. * * We return "-1" if the cursor is currently unusable. * We return "N" if we were "only" able to write "N" chars, * even if all of the given characters fit on the screen, * and mark the cursor as unusable for future attempts. * * So when this function, or the preceding one, return a * positive value, future calls to either function will * return negative ones. */ errr Term_addstr(int n, int a, const char *buf) { int k; int w = Term->wid; errr res = 0; wchar_t s[1024]; /* Copy to a rewriteable string */ Term_mbstowcs(s, buf, 1024); /* Handle "unusable" cursor */ if (Term->scr->cu) return (-1); /* Obtain maximal length */ k = (n < 0) ? (w + 1) : n; /* Obtain the usable string length */ for (n = 0; (n < k) && s[n]; n++) /* loop */; /* React to reaching the edge of the screen */ if (Term->scr->cx + n >= w) res = n = w - Term->scr->cx; /* Queue the first "n" characters for display */ Term_queue_chars(Term->scr->cx, Term->scr->cy, n, a, s); /* Advance the cursor */ Term->scr->cx += n; /* Hack -- Notice "Useless" cursor */ if (res) Term->scr->cu = 1; /* Success (usually) */ return (res); } /* * Move to a location and, using an attr, add a char */ errr Term_putch(int x, int y, int a, wchar_t c) { errr res; /* Move first */ if ((res = Term_gotoxy(x, y)) != 0) return (res); /* Then add the char */ if ((res = Term_addch(a, c)) != 0) return (res); /* Success */ return (0); } /* * Move to a location and, using an attr, add a big tile */ void Term_big_putch(int x, int y, int a, wchar_t c) { int hor, vert; /* Avoid warning */ (void)c; /* No tall skinny tiles */ if (tile_width > 1) { /* Horizontal first */ for (hor = 0; hor <= tile_width; hor++) { /* Queue dummy character */ if (hor != 0) { if (a & 0x80) Term_putch(x + hor, y, 255, -1); else Term_putch(x + hor, y, TERM_WHITE, ' '); } /* Now vertical */ for (vert = 1; vert <= tile_height; vert++) { /* Queue dummy character */ if (a & 0x80) Term_putch(x + hor, y + vert, 255, -1); else Term_putch(x + hor, y + vert, TERM_WHITE, ' '); } } } else { /* Only vertical */ for (vert = 1; vert <= tile_height; vert++) { /* Queue dummy character */ if (a & 0x80) Term_putch(x, y + vert, 255, -1); else Term_putch(x, y + vert, TERM_WHITE, ' '); } } } /* * Move to a location and, using an attr, add a string */ errr Term_putstr(int x, int y, int n, int a, const char *s) { errr res; if (!Term) return 0; /* Move first */ if ((res = Term_gotoxy(x, y)) != 0) return (res); /* Then add the string */ if ((res = Term_addstr(n, a, s)) != 0) return (res); /* Success */ return (0); } /* * Place cursor at (x,y), and clear the next "n" chars */ errr Term_erase(int x, int y, int n) { int i; int w = Term->wid; /* int h = Term->hgt; */ int x1 = -1; int x2 = -1; int na = Term->attr_blank; wchar_t nc = Term->char_blank; int *scr_aa; wchar_t *scr_cc; int *scr_taa; wchar_t *scr_tcc; /* Place cursor */ if (Term_gotoxy(x, y)) return (-1); /* Force legal size */ if (x + n > w) n = w - x; /* Fast access */ scr_aa = Term->scr->a[y]; scr_cc = Term->scr->c[y]; scr_taa = Term->scr->ta[y]; scr_tcc = Term->scr->tc[y]; /* Scan every column */ for (i = 0; i < n; i++, x++) { int oa = scr_aa[x]; wchar_t oc = scr_cc[x]; /* Hack -- Ignore "non-changes" */ if ((oa == na) && (oc == nc)) continue; /* Save the "literal" information */ scr_aa[x] = na; scr_cc[x] = nc; scr_taa[x] = 0; scr_tcc[x] = 0; /* Track minimum changed column */ if (x1 < 0) x1 = x; /* Track maximum changed column */ x2 = x; } /* Expand the "change area" as needed */ if (x1 >= 0) { /* Check for new min/max row info */ if (y < Term->y1) Term->y1 = y; if (y > Term->y2) Term->y2 = y; /* Check for new min/max col info in this row */ if (x1 < Term->x1[y]) Term->x1[y] = x1; if (x2 > Term->x2[y]) Term->x2[y] = x2; } /* Success */ return (0); } /* * Clear the entire window, and move to the top left corner * * Note the use of the special "total_erase" code */ errr Term_clear(void) { int x, y; int w = Term->wid; int h = Term->hgt; int na = Term->attr_blank; wchar_t nc = Term->char_blank; /* Cursor usable */ Term->scr->cu = 0; /* Cursor to the top left */ Term->scr->cx = Term->scr->cy = 0; /* Wipe each row */ for (y = 0; y < h; y++) { int *scr_aa = Term->scr->a[y]; wchar_t *scr_cc = Term->scr->c[y]; int *scr_taa = Term->scr->ta[y]; wchar_t *scr_tcc = Term->scr->tc[y]; /* Wipe each column */ for (x = 0; x < w; x++) { scr_aa[x] = na; scr_cc[x] = nc; scr_taa[x] = 0; scr_tcc[x] = 0; } /* This row has changed */ Term->x1[y] = 0; Term->x2[y] = w - 1; } /* Every row has changed */ Term->y1 = 0; Term->y2 = h - 1; /* Force "total erase" */ Term->total_erase = TRUE; /* Success */ return (0); } /* * Redraw (and refresh) the whole window. */ errr Term_redraw(void) { /* Force "total erase" */ Term->total_erase = TRUE; /* Hack -- Refresh */ Term_fresh(); /* Success */ return (0); } /* * Redraw part of a window. */ errr Term_redraw_section(int x1, int y1, int x2, int y2) { int i, j; wchar_t *c_ptr; /* Bounds checking */ if (y2 >= Term->hgt) y2 = Term->hgt - 1; if (x2 >= Term->wid) x2 = Term->wid - 1; if (y1 < 0) y1 = 0; if (x1 < 0) x1 = 0; /* Set y limits */ Term->y1 = y1; Term->y2 = y2; /* Set the x limits */ for (i = Term->y1; i <= Term->y2; i++) { if ((x1 > 0) && (Term->old->a[i][x1] == 255)) x1--; Term->x1[i] = x1; Term->x2[i] = x2; c_ptr = Term->old->c[i]; /* Clear the section so it is redrawn */ for (j = x1; j <= x2; j++) { /* Hack - set the old character to "none" */ c_ptr[j] = 0; } } /* Hack -- Refresh */ Term_fresh(); /* Success */ return (0); } /*** Access routines ***/ /* * Extract the cursor visibility */ errr Term_get_cursor(bool *v) { /* Extract visibility */ (*v) = Term->scr->cv; /* Success */ return (0); } /* * Extract the current window size */ errr Term_get_size(int *w, int *h) { *w = Term ? Term->wid : 80; *h = Term ? Term->hgt : 24; return 0; } /* * Extract the current cursor location */ errr Term_locate(int *x, int *y) { /* Access the cursor */ (*x) = Term->scr->cx; (*y) = Term->scr->cy; /* Warn about "useless" cursor */ if (Term->scr->cu) return (1); /* Success */ return (0); } /* * At a given location, determine the "current" attr and char * Note that this refers to what will be on the window after the * next call to "Term_fresh()". It may or may not already be there. */ errr Term_what(int x, int y, int *a, wchar_t *c) { int w = Term->wid; int h = Term->hgt; /* Verify location */ if ((x < 0) || (x >= w)) return (-1); if ((y < 0) || (y >= h)) return (-1); /* Direct access */ (*a) = Term->scr->a[y][x]; (*c) = Term->scr->c[y][x]; /* Success */ return (0); } /*** Input routines ***/ /* * Flush and forget the input */ errr Term_flush(void) { if (!Term) return 0; /* Hack -- Flush all events */ Term_xtra(TERM_XTRA_FLUSH, 0); /* Forget all keypresses */ Term->key_head = Term->key_tail = 0; /* Success */ return (0); } /* sketchy keylogging pt. 2 */ static void log_keypress(ui_event e) { if (e.type != EVT_KBRD) return; if (!e.key.code) return; keylog[log_i] = e.key; if (log_size < KEYLOG_SIZE) log_size++; log_i = (log_i + 1) % KEYLOG_SIZE; } /* * Add a keypress to the "queue" */ errr Term_keypress(keycode_t k, byte mods) { /* Hack -- Refuse to enqueue non-keys */ if (!k) return (-1); if(!Term->complex_input) { switch (k) { case '\r': case '\n': k = KC_ENTER; break; case 8: k = KC_BACKSPACE; break; case 9: k = KC_TAB; break; case 27: k = ESCAPE; break; } } /* Store the char, advance the queue */ Term->key_queue[Term->key_head].type = EVT_KBRD; Term->key_queue[Term->key_head].key.code = k; Term->key_queue[Term->key_head].key.mods = mods; Term->key_head++; /* Circular queue, handle wrap */ if (Term->key_head == Term->key_size) Term->key_head = 0; /* Success (unless overflow) */ if (Term->key_head != Term->key_tail) return (0); /* Problem */ return (1); } /* * Add a mouse event to the "queue" */ errr Term_mousepress(int x, int y, char button)/*, byte mods);*/ { /* Store the char, advance the queue */ Term->key_queue[Term->key_head].type = EVT_MOUSE; Term->key_queue[Term->key_head].mouse.x = x; Term->key_queue[Term->key_head].mouse.y = y; /* XXX for now I encode the mods into the button number, so I would * not have to worry about the other platforms, when all platforms set * mods, this code should be replaced with : * Term->key_queue[Term->key_head].mouse.button = button; * Term->key_queue[Term->key_head].mouse.mods = mods; */ Term->key_queue[Term->key_head].mouse.button = (button & 0x0F); Term->key_queue[Term->key_head].mouse.mods = ((button & 0xF0)>>4); Term->key_head++; /* Circular queue, handle wrap */ if (Term->key_head == Term->key_size) Term->key_head = 0; /* Success (unless overflow) */ if (Term->key_head != Term->key_tail) return (0); #if 0 /* Hack -- Forget the oldest key */ if (++Term->key_tail == Term->key_size) Term->key_tail = 0; #endif /* Problem */ return (1); } /* * Add a keypress to the FRONT of the "queue" */ errr Term_key_push(int k) { ui_event ke; if (!k) return (-1); ke.type = EVT_KBRD; ke.key.code = k; ke.key.mods = 0; return Term_event_push(&ke); } errr Term_event_push(const ui_event *ke) { /* Hack -- Refuse to enqueue non-keys */ if (!ke) return (-1); /* Hack -- Overflow may induce circular queue */ if (Term->key_tail == 0) Term->key_tail = Term->key_size; /* Back up, Store the char */ /* Store the char, advance the queue */ Term->key_queue[--Term->key_tail] = *ke; /* Success (unless overflow) */ if (Term->key_head != Term->key_tail) return (0); #if 0 /* Hack -- Forget the oldest key */ if (++Term->key_tail == Term->key_size) Term->key_tail = 0; #endif /* Problem */ return (1); } /* * Check for a pending keypress on the key queue. * * Store the keypress, if any, in "ch", and return "0". * Otherwise store "zero" in "ch", and return "1". * * Wait for a keypress if "wait" is true. * * Remove the keypress if "take" is true. */ errr Term_inkey(ui_event *ch, bool wait, bool take) { /* Assume no key */ memset(ch, 0, sizeof *ch); /* Hack -- get bored */ if (!Term->never_bored) { /* Process random events */ Term_xtra(TERM_XTRA_BORED, 0); } /* Wait */ if (wait) { /* Process pending events while necessary */ while (Term->key_head == Term->key_tail) { /* Process events (wait for one) */ Term_xtra(TERM_XTRA_EVENT, TRUE); } } /* Do not Wait */ else { /* Process pending events if necessary */ if (Term->key_head == Term->key_tail) { /* Process events (do not wait) */ Term_xtra(TERM_XTRA_EVENT, FALSE); } } /* No keys are ready */ if (Term->key_head == Term->key_tail) return (1); /* Extract the next keypress */ (*ch) = Term->key_queue[Term->key_tail]; /* sketchy key loggin */ log_keypress(*ch); /* If requested, advance the queue, wrap around if necessary */ if (take && (++Term->key_tail == Term->key_size)) Term->key_tail = 0; /* Success */ return (0); } /*** Extra routines ***/ /* * Save the "requested" screen into the "memorized" screen * * Every "Term_save()" should match exactly one "Term_load()" */ errr Term_save(void) { int w = Term->wid; int h = Term->hgt; term_win *mem; /* Allocate window */ mem = ZNEW(term_win); /* Initialize window */ term_win_init(mem, w, h); /* Grab */ term_win_copy(mem, Term->scr, w, h); /* Front of the queue */ mem->next = Term->mem; Term->mem = mem; /* One more saved */ Term->saved++; /* Success */ return (0); } /* * Restore the "requested" contents (see above). * * Every "Term_save()" should match exactly one "Term_load()" */ errr Term_load(void) { int y; int w = Term->wid; int h = Term->hgt; term_win *tmp; /* Pop off window from the list */ if (Term->mem) { /* Save pointer to old mem */ tmp = Term->mem; /* Forget it */ Term->mem = Term->mem->next; /* Load */ term_win_copy(Term->scr, tmp, w, h); /* Free the old window */ (void)term_win_nuke(tmp); /* Kill it */ FREE(tmp); } /* Assume change */ for (y = 0; y < h; y++) { /* Assume change */ Term->x1[y] = 0; Term->x2[y] = w - 1; } /* Assume change */ Term->y1 = 0; Term->y2 = h - 1; /* One less saved */ Term->saved--; /* Success */ return (0); } /* * React to a new physical window size. */ errr Term_resize(int w, int h) { int i; int wid, hgt; int *hold_x1; int *hold_x2; term_win *hold_old; term_win *hold_scr; term_win *hold_mem; term_win *hold_tmp; ui_event evt = EVENT_EMPTY; evt.type = EVT_RESIZE; /* Resizing is forbidden */ if (Term->fixed_shape) return (-1); /* Ignore illegal changes */ if ((w < 1) || (h < 1)) return (-1); /* Ignore non-changes */ if ((Term->wid == w) && (Term->hgt == h)) return (1); /* Minimum dimensions */ wid = MIN(Term->wid, w); hgt = MIN(Term->hgt, h); /* Save scanners */ hold_x1 = Term->x1; hold_x2 = Term->x2; /* Save old window */ hold_old = Term->old; /* Save old window */ hold_scr = Term->scr; /* Save old window */ hold_mem = Term->mem; /* Save old window */ hold_tmp = Term->tmp; /* Create new scanners */ Term->x1 = C_ZNEW(h, int); Term->x2 = C_ZNEW(h, int); /* Create new window */ Term->old = ZNEW(term_win); /* Initialize new window */ term_win_init(Term->old, w, h); /* Save the contents */ term_win_copy(Term->old, hold_old, wid, hgt); /* Create new window */ Term->scr = ZNEW(term_win); /* Initialize new window */ term_win_init(Term->scr, w, h); /* Save the contents */ term_win_copy(Term->scr, hold_scr, wid, hgt); /* If needed */ if (hold_mem) { /* Create new window */ Term->mem = ZNEW(term_win); /* Initialize new window */ term_win_init(Term->mem, w, h); /* Save the contents */ term_win_copy(Term->mem, hold_mem, wid, hgt); } /* If needed */ if (hold_tmp) { /* Create new window */ Term->tmp = ZNEW(term_win); /* Initialize new window */ term_win_init(Term->tmp, w, h); /* Save the contents */ term_win_copy(Term->tmp, hold_tmp, wid, hgt); } /* Free some arrays */ FREE(hold_x1); FREE(hold_x2); /* Nuke */ term_win_nuke(hold_old); /* Kill */ FREE(hold_old); /* Illegal cursor */ if (Term->old->cx >= w) Term->old->cu = 1; if (Term->old->cy >= h) Term->old->cu = 1; /* Nuke */ term_win_nuke(hold_scr); /* Kill */ FREE(hold_scr); /* Illegal cursor */ if (Term->scr->cx >= w) Term->scr->cu = 1; if (Term->scr->cy >= h) Term->scr->cu = 1; /* If needed */ if (hold_mem) { /* Nuke */ term_win_nuke(hold_mem); /* Kill */ FREE(hold_mem); /* Illegal cursor */ if (Term->mem->cx >= w) Term->mem->cu = 1; if (Term->mem->cy >= h) Term->mem->cu = 1; } /* If needed */ if (hold_tmp) { /* Nuke */ term_win_nuke(hold_tmp); /* Kill */ FREE(hold_tmp); /* Illegal cursor */ if (Term->tmp->cx >= w) Term->tmp->cu = 1; if (Term->tmp->cy >= h) Term->tmp->cu = 1; } /* Save new size */ Term->wid = w; Term->hgt = h; /* Force "total erase" */ Term->total_erase = TRUE; /* Assume change */ for (i = 0; i < h; i++) { /* Assume change */ Term->x1[i] = 0; Term->x2[i] = w - 1; } /* Assume change */ Term->y1 = 0; Term->y2 = h - 1; /* Push a resize event onto the stack */ Term_event_push(&evt); /* Success */ return (0); } /* * Activate a new Term (and deactivate the current Term) * * This function is extremely important, and also somewhat bizarre. * It is the only function that should "modify" the value of "Term". * * To "create" a valid "term", one should do "term_init(t)", then * set the various flags and hooks, and then do "Term_activate(t)". */ errr Term_activate(term *t) { /* Hack -- already done */ if (Term == t) return (1); /* Deactivate the old Term */ if (Term) Term_xtra(TERM_XTRA_LEVEL, 0); /* Hack -- Call the special "init" hook */ if (t && !t->active_flag) { /* Call the "init" hook */ if (t->init_hook) (*t->init_hook)(t); /* Remember */ t->active_flag = TRUE; /* Assume mapped */ t->mapped_flag = TRUE; } /* Remember the Term */ Term = t; /* Activate the new Term */ if (Term) Term_xtra(TERM_XTRA_LEVEL, 1); /* Success */ return (0); } /* * Nuke a term */ errr term_nuke(term *t) { /* Hack -- Call the special "nuke" hook */ if (t->active_flag) { /* Call the "nuke" hook */ if (t->nuke_hook) (*t->nuke_hook)(t); /* Remember */ t->active_flag = FALSE; /* Assume not mapped */ t->mapped_flag = FALSE; } /* Nuke "displayed" */ term_win_nuke(t->old); /* Kill "displayed" */ FREE(t->old); /* Nuke "requested" */ term_win_nuke(t->scr); /* Kill "requested" */ FREE(t->scr); /* If needed */ if (t->mem) { /* Nuke "memorized" */ term_win_nuke(t->mem); /* Kill "memorized" */ FREE(t->mem); } /* If needed */ if (t->tmp) { /* Nuke "temporary" */ term_win_nuke(t->tmp); /* Kill "temporary" */ FREE(t->tmp); } /* Free some arrays */ FREE(t->x1); FREE(t->x2); /* Free the input queue */ FREE(t->key_queue); /* Success */ return (0); } /* * Initialize a term, using a window of the given size. * Also prepare the "input queue" for "k" keypresses * By default, the cursor starts out "invisible" * By default, we "erase" using "black spaces" */ errr term_init(term *t, int w, int h, int k) { int y; /* Wipe it */ (void)WIPE(t, term); /* Prepare the input queue */ t->key_head = t->key_tail = 0; /* Determine the input queue size */ t->key_size = k; /* Allocate the input queue */ t->key_queue = C_ZNEW(t->key_size, ui_event); /* Save the size */ t->wid = w; t->hgt = h; /* Allocate change arrays */ t->x1 = C_ZNEW(h, int); t->x2 = C_ZNEW(h, int); /* Allocate "displayed" */ t->old = ZNEW(term_win); /* Initialize "displayed" */ term_win_init(t->old, w, h); /* Allocate "requested" */ t->scr = ZNEW(term_win); /* Initialize "requested" */ term_win_init(t->scr, w, h); /* Assume change */ for (y = 0; y < h; y++) { /* Assume change */ t->x1[y] = 0; t->x2[y] = w - 1; } /* Assume change */ t->y1 = 0; t->y2 = h - 1; /* Force "total erase" */ t->total_erase = TRUE; /* Default "blank" */ t->attr_blank = 0; t->char_blank = L' '; /* No saves yet */ t->saved = 0; /* Success */ return (0); } bool panel_contains(unsigned int y, unsigned int x) { unsigned int hgt; unsigned int wid; if (!Term) return TRUE; hgt = SCREEN_HGT; wid = SCREEN_WID; return (y - Term->offset_y) < hgt && (x - Term->offset_x) < wid; } angband-3.5.1/src/doc/0000755000175000017500000000000012456456606013774 5ustar chriscchriscangband-3.5.1/src/doc/doxygen.conf0000644000175000017500000030170112456456606016322 0ustar chriscchrisc# Doxyfile 1.8.5 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all text # before the first occurrence of this tag. Doxygen uses libiconv (or the iconv # built into libc) for the transcoding. See http://www.gnu.org/software/libiconv # for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = Angband # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is included in # the documentation. The maximum height of the logo should not exceed 55 pixels # and the maximum width should not exceed 200 pixels. Doxygen will copy the logo # to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = src/doc/ # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese- # Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi, # Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en, # Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish, # Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, # Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = NO # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a # new page for each member. If set to NO, the documentation of a member will be # part of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, Javascript, # C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. # # Note For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by by putting a % sign in front of the word # or globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = YES # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined # locally in source files will be included in the documentation. If set to NO # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO these classes will be included in the various overviews. This option has # no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # (class|struct|union) declarations. If set to NO these declarations will be # included in the documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = YES # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO the members will appear in declaration order. # The default value is: NO. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the # todo list. This list is created by putting \todo commands in the # documentation. # The default value is: YES. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the # test list. This list is created by putting \test commands in the # documentation. # The default value is: YES. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES the list # will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. Do not use file names with spaces, bibtex cannot handle them. See # also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO doxygen will only warn about wrong or incomplete parameter # documentation, but not about the absence of documentation. # The default value is: NO. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text " # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. # Note: If this tag is empty the current directory is searched. INPUT = # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: http://www.gnu.org/software/libiconv) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank the # following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, # *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, # *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, # *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, # *.qsf, *.as and *.js. FILE_PATTERNS = *.h \ *.c # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = tests/* # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER ) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # function all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES, then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see http://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the config file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = NO # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = doc # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = stylesheet.css # The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- # defined cascading style sheet that is included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefor more robust against future updates. # Doxygen will copy the style sheet file to the output directory. For an example # see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the stylesheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # http://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to NO can help when comparing the output of multiple runs. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = NO # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: http://developer.apple.com/tools/xcode/), introduced with # OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler ( hhc.exe). If non-empty # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated ( # YES) or that it should be included in the master .chm file ( NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated ( # YES) or a normal table of contents ( NO) in the .chm file. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # http://www.mathjax.org) which uses client side Javascript for the rendering # instead of using prerendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from http://www.mathjax.org before deployment. # The default value is: http://cdn.mathjax.org/mathjax/latest. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /